From 931e1793ac9509f6bae38ccd13dfcb896adfc402 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Tue, 22 Jul 2025 18:13:38 +0200 Subject: [PATCH] disables commentator plugin --- .obsidian/plugins/commentator/main.js | 100 ++++++++++---------- .obsidian/plugins/commentator/manifest.json | 2 +- .obsidian/plugins/commentator/styles.css | 2 +- 3 files changed, 52 insertions(+), 52 deletions(-) diff --git a/.obsidian/plugins/commentator/main.js b/.obsidian/plugins/commentator/main.js index d181a66..c11efa3 100644 --- a/.obsidian/plugins/commentator/main.js +++ b/.obsidian/plugins/commentator/main.js @@ -3,53 +3,19 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin at https://github.com/Fevol/obsidian-translate - Commentator — 0.2.3 [PRODUCTION BUILD] + Commentator — 0.2.4 [PRODUCTION BUILD] Author: kometenstaub and Fevol - Version: 0.2.3 - Time: Mon, 19 May 2025 20:59:44 GMT + Version: 0.2.4 + Time: Sun, 13 Jul 2025 11:40:48 GMT ======================================================= */ -"use strict";var Yb=Object.create;var yU=Object.defineProperty;var Jb=Object.getOwnPropertyDescriptor;var vb=Object.getOwnPropertyNames;var kb=Object.getPrototypeOf,Db=Object.prototype.hasOwnProperty;var SU=(C,I)=>()=>(I||C((I={exports:{}}).exports,I),I.exports),Tb=(C,I)=>{for(var g in I)yU(C,g,{get:I[g],enumerable:!0})},jc=(C,I,g,B)=>{if(I&&typeof I=="object"||typeof I=="function")for(let F of vb(I))!Db.call(C,F)&&F!==g&&yU(C,F,{get:()=>I[F],enumerable:!(B=Jb(I,F))||B.enumerable});return C};var XU=(C,I,g)=>(g=C!=null?Yb(kb(C)):{},jc(I||!C||!C.__esModule?yU(g,"default",{value:C,enumerable:!0}):g,C)),wb=C=>jc(yU({},"__esModule",{value:!0}),C);var Xi=SU((da,mA)=>{var q=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},Ug=-1,tg=1,TI=0;q.Diff=function(C,I){return[C,I]};q.prototype.diff_main=function(C,I,g,B){typeof B>"u"&&(this.Diff_Timeout<=0?B=Number.MAX_VALUE:B=new Date().getTime()+this.Diff_Timeout*1e3);var F=B;if(C==null||I==null)throw new Error("Null input. (diff_main)");if(C==I)return C?[new q.Diff(TI,C)]:[];typeof g>"u"&&(g=!0);var A=g,Q=this.diff_commonPrefix(C,I),U=C.substring(0,Q);C=C.substring(Q),I=I.substring(Q),Q=this.diff_commonSuffix(C,I);var s=C.substring(C.length-Q);C=C.substring(0,C.length-Q),I=I.substring(0,I.length-Q);var l=this.diff_compute_(C,I,A,F);return U&&l.unshift(new q.Diff(TI,U)),s&&l.push(new q.Diff(TI,s)),this.diff_cleanupMerge(l),l};q.prototype.diff_compute_=function(C,I,g,B){var F;if(!C)return[new q.Diff(tg,I)];if(!I)return[new q.Diff(Ug,C)];var A=C.length>I.length?C:I,Q=C.length>I.length?I:C,U=A.indexOf(Q);if(U!=-1)return F=[new q.Diff(tg,A.substring(0,U)),new q.Diff(TI,Q),new q.Diff(tg,A.substring(U+Q.length))],C.length>I.length&&(F[0][0]=F[2][0]=Ug),F;if(Q.length==1)return[new q.Diff(Ug,C),new q.Diff(tg,I)];var s=this.diff_halfMatch_(C,I);if(s){var l=s[0],d=s[1],c=s[2],i=s[3],G=s[4],b=this.diff_main(l,c,g,B),e=this.diff_main(d,i,g,B);return b.concat([new q.Diff(TI,G)],e)}return g&&C.length>100&&I.length>100?this.diff_lineMode_(C,I,B):this.diff_bisect_(C,I,B)};q.prototype.diff_lineMode_=function(C,I,g){var B=this.diff_linesToChars_(C,I);C=B.chars1,I=B.chars2;var F=B.lineArray,A=this.diff_main(C,I,!1,g);this.diff_charsToLines_(A,F),this.diff_cleanupSemantic(A),A.push(new q.Diff(TI,""));for(var Q=0,U=0,s=0,l="",d="";Q=1&&s>=1){A.splice(Q-U-s,U+s),Q=Q-U-s;for(var c=this.diff_main(l,d,!1,g),i=c.length-1;i>=0;i--)A.splice(Q,0,c[i]);Q=Q+c.length}s=0,U=0,l="",d="";break}Q++}return A.pop(),A};q.prototype.diff_bisect_=function(C,I,g){for(var B=C.length,F=I.length,A=Math.ceil((B+F)/2),Q=A,U=2*A,s=new Array(U),l=new Array(U),d=0;dg);u++){for(var n=-u+G;n<=u-b;n+=2){var R=Q+n,h;n==-u||n!=u&&s[R-1]B)b+=2;else if(m>F)G+=2;else if(i){var a=Q+c-n;if(a>=0&&a=L)return this.diff_bisectSplit_(C,I,h,m,g)}}}for(var y=-u+e;y<=u-V;y+=2){var a=Q+y,L;y==-u||y!=u&&l[a-1]B)V+=2;else if(E>F)e+=2;else if(!i){var R=Q+c-y;if(R>=0&&R=L)return this.diff_bisectSplit_(C,I,h,m,g)}}}}return[new q.Diff(Ug,C),new q.Diff(tg,I)]};q.prototype.diff_bisectSplit_=function(C,I,g,B,F){var A=C.substring(0,g),Q=I.substring(0,B),U=C.substring(g),s=I.substring(B),l=this.diff_main(A,Q,!1,F),d=this.diff_main(U,s,!1,F);return l.concat(d)};q.prototype.diff_linesToChars_=function(C,I){var g=[],B={};g[0]="";function F(s){for(var l="",d=0,c=-1,i=g.length;cB?C=C.substring(g-B):gI.length?C:I,B=C.length>I.length?I:C;if(g.length<4||B.length*2=b.length?[h,m,a,L,R]:null}var Q=A(g,B,Math.ceil(g.length/4)),U=A(g,B,Math.ceil(g.length/2)),s;if(!Q&&!U)return null;U?Q?s=Q[4].length>U[4].length?Q:U:s=U:s=Q;var l,d,c,i;C.length>I.length?(l=s[0],d=s[1],c=s[2],i=s[3]):(c=s[0],i=s[1],l=s[2],d=s[3]);var G=s[4];return[l,d,c,i,G]};q.prototype.diff_cleanupSemantic=function(C){for(var I=!1,g=[],B=0,F=null,A=0,Q=0,U=0,s=0,l=0;A0?g[B-1]:-1,Q=0,U=0,s=0,l=0,F=null,I=!0)),A++;for(I&&this.diff_cleanupMerge(C),this.diff_cleanupSemanticLossless(C),A=1;A=G?(i>=d.length/2||i>=c.length/2)&&(C.splice(A,0,new q.Diff(TI,c.substring(0,i))),C[A-1][1]=d.substring(0,d.length-i),C[A+1][1]=c.substring(i),A++):(G>=d.length/2||G>=c.length/2)&&(C.splice(A,0,new q.Diff(TI,d.substring(0,G))),C[A-1][0]=tg,C[A-1][1]=c.substring(0,c.length-G),C[A+1][0]=Ug,C[A+1][1]=d.substring(G),A++),A++}A++}};q.prototype.diff_cleanupSemanticLossless=function(C){function I(G,b){if(!G||!b)return 6;var e=G.charAt(G.length-1),V=b.charAt(0),u=e.match(q.nonAlphaNumericRegex_),n=V.match(q.nonAlphaNumericRegex_),R=u&&e.match(q.whitespaceRegex_),h=n&&V.match(q.whitespaceRegex_),m=R&&e.match(q.linebreakRegex_),a=h&&V.match(q.linebreakRegex_),L=m&&G.match(q.blanklineEndRegex_),y=a&&b.match(q.blanklineStartRegex_);return L||y?5:m||a?4:u&&!R&&h?3:R||h?2:u||n?1:0}for(var g=1;g=c&&(c=i,s=B,l=F,d=A)}C[g-1][1]!=s&&(s?C[g-1][1]=s:(C.splice(g-1,1),g--),C[g][1]=l,d?C[g+1][1]=d:(C.splice(g+1,1),g--))}g++}};q.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;q.whitespaceRegex_=/\s/;q.linebreakRegex_=/[\r\n]/;q.blanklineEndRegex_=/\n\r?\n$/;q.blanklineStartRegex_=/^\r?\n\r?\n/;q.prototype.diff_cleanupEfficiency=function(C){for(var I=!1,g=[],B=0,F=null,A=0,Q=!1,U=!1,s=!1,l=!1;A0?g[B-1]:-1,s=l=!1),I=!0)),A++;I&&this.diff_cleanupMerge(C)};q.prototype.diff_cleanupMerge=function(C){C.push(new q.Diff(TI,""));for(var I=0,g=0,B=0,F="",A="",Q;I1?(g!==0&&B!==0&&(Q=this.diff_commonPrefix(A,F),Q!==0&&(I-g-B>0&&C[I-g-B-1][0]==TI?C[I-g-B-1][1]+=A.substring(0,Q):(C.splice(0,0,new q.Diff(TI,A.substring(0,Q))),I++),A=A.substring(Q),F=F.substring(Q)),Q=this.diff_commonSuffix(A,F),Q!==0&&(C[I][1]=A.substring(A.length-Q)+C[I][1],A=A.substring(0,A.length-Q),F=F.substring(0,F.length-Q))),I-=g+B,C.splice(I,g+B),F.length&&(C.splice(I,0,new q.Diff(Ug,F)),I++),A.length&&(C.splice(I,0,new q.Diff(tg,A)),I++),I++):I!==0&&C[I-1][0]==TI?(C[I-1][1]+=C[I][1],C.splice(I,1)):I++,B=0,g=0,F="",A="";break}C[C.length-1][1]===""&&C.pop();var U=!1;for(I=1;II));Q++)F=g,A=B;return C.length!=Q&&C[Q][0]===Ug?A:A+(I-F)};q.prototype.diff_prettyHtml=function(C){for(var I=[],g=/&/g,B=//g,A=/\n/g,Q=0;Q");switch(U){case tg:I[Q]=''+l+"";break;case Ug:I[Q]=''+l+"";break;case TI:I[Q]=""+l+"";break}}return I.join("")};q.prototype.diff_text1=function(C){for(var I=[],g=0;gthis.Match_MaxBits)throw new Error("Pattern too long for this browser.");var B=this.match_alphabet_(I),F=this;function A(h,m){var a=h/I.length,L=Math.abs(g-m);return F.Match_Distance?a+L/F.Match_Distance:L?1:a}var Q=this.Match_Threshold,U=C.indexOf(I,g);U!=-1&&(Q=Math.min(A(0,U),Q),U=C.lastIndexOf(I,g+I.length),U!=-1&&(Q=Math.min(A(0,U),Q)));var s=1<=b;u--){var n=B[C.charAt(u-1)];if(G===0?V[u]=(V[u+1]<<1|1)&n:V[u]=(V[u+1]<<1|1)&n|((i[u+1]|i[u])<<1|1)|i[u+1],V[u]&s){var R=A(G,u-1);if(R<=Q)if(Q=R,U=u-1,U>g)b=Math.max(1,2*g-U);else break}}if(A(G+1,g)>Q)break;i=V}return U};q.prototype.match_alphabet_=function(C){for(var I={},g=0;g"u")B=C,F=this.diff_main(B,I,!0),F.length>2&&(this.diff_cleanupSemantic(F),this.diff_cleanupEfficiency(F));else if(C&&typeof C=="object"&&typeof I>"u"&&typeof g>"u")F=C,B=this.diff_text1(F);else if(typeof C=="string"&&I&&typeof I=="object"&&typeof g>"u")B=C,F=I;else if(typeof C=="string"&&typeof I=="string"&&g&&typeof g=="object")B=C,F=g;else throw new Error("Unknown call format to patch_make.");if(F.length===0)return[];for(var A=[],Q=new q.patch_obj,U=0,s=0,l=0,d=B,c=B,i=0;i=2*this.Patch_Margin&&U&&(this.patch_addContext_(Q,d),A.push(Q),Q=new q.patch_obj,U=0,d=c,s=l);break}G!==tg&&(s+=b.length),G!==Ug&&(l+=b.length)}return U&&(this.patch_addContext_(Q,d),A.push(Q)),A};q.prototype.patch_deepCopy=function(C){for(var I=[],g=0;gthis.Match_MaxBits?(s=this.match_main(I,U.substring(0,this.Match_MaxBits),Q),s!=-1&&(l=this.match_main(I,U.substring(U.length-this.Match_MaxBits),Q+U.length-this.Match_MaxBits),(l==-1||s>=l)&&(s=-1))):s=this.match_main(I,U,Q),s==-1)F[A]=!1,B-=C[A].length2-C[A].length1;else{F[A]=!0,B=s-Q;var d;if(l==-1?d=I.substring(s,s+U.length):d=I.substring(s,l+this.Match_MaxBits),U==d)I=I.substring(0,s)+this.diff_text2(C[A].diffs)+I.substring(s+U.length);else{var c=this.diff_main(U,d,!1);if(U.length>this.Match_MaxBits&&this.diff_levenshtein(c)/U.length>this.Patch_DeleteThreshold)F[A]=!1;else{this.diff_cleanupSemanticLossless(c);for(var i=0,G,b=0;bA[0][1].length){var Q=I-A[0][1].length;A[0][1]=g.substring(A[0][1].length)+A[0][1],F.start1-=Q,F.start2-=Q,F.length1+=Q,F.length2+=Q}if(F=C[C.length-1],A=F.diffs,A.length==0||A[A.length-1][0]!=TI)A.push(new q.Diff(TI,g)),F.length1+=I,F.length2+=I;else if(I>A[A.length-1][1].length){var Q=I-A[A.length-1][1].length;A[A.length-1][1]+=g.substring(0,Q),F.length1+=Q,F.length2+=Q}return g};q.prototype.patch_splitMax=function(C){for(var I=this.Match_MaxBits,g=0;g2*I?(U.length1+=d.length,F+=d.length,s=!1,U.diffs.push(new q.Diff(l,d)),B.diffs.shift()):(d=d.substring(0,I-U.length1-this.Patch_Margin),U.length1+=d.length,F+=d.length,l===TI?(U.length2+=d.length,A+=d.length):s=!1,U.diffs.push(new q.Diff(l,d)),d==B.diffs[0][1]?B.diffs.shift():B.diffs[0][1]=B.diffs[0][1].substring(d.length))}Q=this.diff_text2(U.diffs),Q=Q.substring(Q.length-this.Patch_Margin);var c=this.diff_text1(B.diffs).substring(0,this.Patch_Margin);c!==""&&(U.length1+=c.length,U.length2+=c.length,U.diffs.length!==0&&U.diffs[U.diffs.length-1][0]===TI?U.diffs[U.diffs.length-1][1]+=c:U.diffs.push(new q.Diff(TI,c))),s||C.splice(++g,0,U)}}};q.prototype.patch_toText=function(C){for(var I=[],g=0;g{(function(C){if(typeof Nd=="object"&&typeof Xc<"u")Xc.exports=C();else if(typeof define=="function"&&define.amd)define([],C);else{var I;typeof window<"u"?I=window:typeof global<"u"?I=global:typeof self<"u"?I=self:I=this,I.localforage=C()}})(function(){var C,I,g;return function B(F,A,Q){function U(d,c){if(!A[d]){if(!F[d]){var i=typeof require=="function"&&require;if(!c&&i)return i(d,!0);if(s)return s(d,!0);var G=new Error("Cannot find module '"+d+"'");throw G.code="MODULE_NOT_FOUND",G}var b=A[d]={exports:{}};F[d][0].call(b.exports,function(e){var V=F[d][1][e];return U(V||e)},b,b.exports,B,F,A,Q)}return A[d].exports}for(var s=typeof require=="function"&&require,l=0;l"u"&&B(3);var i=Promise;function G(Z,o){o&&Z.then(function(x){o(null,x)},function(x){o(x)})}function b(Z,o,x){typeof o=="function"&&Z.then(o),typeof x=="function"&&Z.catch(x)}function e(Z){return typeof Z!="string"&&(Z=String(Z)),Z}function V(){if(arguments.length&&typeof arguments[arguments.length-1]=="function")return arguments[arguments.length-1]}var u="local-forage-detect-blob-support",n=void 0,R={},h=Object.prototype.toString,m="readonly",a="readwrite";function L(Z){for(var o=Z.length,x=new ArrayBuffer(o),X=new Uint8Array(x),W=0;W=43)}}).catch(function(){return!1})}function E(Z){return typeof n=="boolean"?i.resolve(n):y(Z).then(function(o){return n=o,n})}function Y(Z){var o=R[Z.name],x={};x.promise=new i(function(X,W){x.resolve=X,x.reject=W}),o.deferredOperations.push(x),o.dbReady?o.dbReady=o.dbReady.then(function(){return x.promise}):o.dbReady=x.promise}function N(Z){var o=R[Z.name],x=o.deferredOperations.pop();if(x)return x.resolve(),x.promise}function r(Z,o){var x=R[Z.name],X=x.deferredOperations.pop();if(X)return X.reject(o),X.promise}function j(Z,o){return new i(function(x,X){if(R[Z.name]=R[Z.name]||AI(),Z.db)if(o)Y(Z),Z.db.close();else return x(Z.db);var W=[Z.name];o&&W.push(Z.version);var S=l.open.apply(l,W);o&&(S.onupgradeneeded=function(v){var M=S.result;try{M.createObjectStore(Z.storeName),v.oldVersion<=1&&M.createObjectStore(u)}catch(P){if(P.name!=="ConstraintError")throw P}}),S.onerror=function(v){v.preventDefault(),X(S.error)},S.onsuccess=function(){var v=S.result;v.onversionchange=function(M){M.target.close()},x(v),N(Z)}})}function _(Z){return j(Z,!1)}function D(Z){return j(Z,!0)}function UI(Z,o){if(!Z.db)return!0;var x=!Z.db.objectStoreNames.contains(Z.storeName),X=Z.versionZ.db.version;if(X&&(Z.version,Z.version=Z.db.version),W||x){if(x){var S=Z.db.version+1;S>Z.version&&(Z.version=S)}return!0}return!1}function rI(Z){return new i(function(o,x){var X=new FileReader;X.onerror=x,X.onloadend=function(W){var S=btoa(W.target.result||"");o({__local_forage_encoded_blob:!0,data:S,type:Z.type})},X.readAsBinaryString(Z)})}function RI(Z){var o=L(atob(Z.data));return c([o],{type:Z.type})}function eI(Z){return Z&&Z.__local_forage_encoded_blob}function xI(Z){var o=this,x=o._initReady().then(function(){var X=R[o._dbInfo.name];if(X&&X.dbReady)return X.dbReady});return b(x,Z,Z),x}function LI(Z){Y(Z);for(var o=R[Z.name],x=o.forages,X=0;X0&&(!Z.db||S.name==="InvalidStateError"||S.name==="NotFoundError"))return i.resolve().then(function(){if(!Z.db||S.name==="NotFoundError"&&!Z.db.objectStoreNames.contains(Z.storeName)&&Z.version<=Z.db.version)return Z.db&&(Z.version=Z.db.version+1),D(Z)}).then(function(){return LI(Z).then(function(){$(Z,o,x,X-1)})}).catch(x);x(S)}}function AI(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function kI(Z){var o=this,x={db:null};if(Z)for(var X in Z)x[X]=Z[X];var W=R[x.name];W||(W=AI(),R[x.name]=W),W.forages.push(o),o._initReady||(o._initReady=o.ready,o.ready=xI);var S=[];function v(){return i.resolve()}for(var M=0;M>4,II[W++]=(v&15)<<4|M>>2,II[W++]=(M&3)<<6|P&63;return K}function Xg(Z){var o=new Uint8Array(Z),x="",X;for(X=0;X>2],x+=uI[(o[X]&3)<<4|o[X+1]>>4],x+=uI[(o[X+1]&15)<<2|o[X+2]>>6],x+=uI[o[X+2]&63];return o.length%3===2?x=x.substring(0,x.length-1)+"=":o.length%3===1&&(x=x.substring(0,x.length-2)+"=="),x}function eg(Z,o){var x="";if(Z&&(x=Vg.call(Z)),Z&&(x==="[object ArrayBuffer]"||Z.buffer&&Vg.call(Z.buffer)==="[object ArrayBuffer]")){var X,W=fI;Z instanceof ArrayBuffer?(X=Z,W+=aI):(X=Z.buffer,x==="[object Int8Array]"?W+=QI:x==="[object Uint8Array]"?W+=CI:x==="[object Uint8ClampedArray]"?W+=nI:x==="[object Int16Array]"?W+=MI:x==="[object Uint16Array]"?W+=Hg:x==="[object Int32Array]"?W+=Rg:x==="[object Uint32Array]"?W+=lg:x==="[object Float32Array]"?W+=Sg:x==="[object Float64Array]"?W+=Yg:o(new Error("Failed to get type for BinaryArray"))),o(W+Xg(X))}else if(x==="[object Blob]"){var S=new FileReader;S.onload=function(){var v=EI+Z.type+"~"+Xg(this.result);o(fI+T+v)},S.readAsArrayBuffer(Z)}else try{o(JSON.stringify(Z))}catch(v){o(null,v)}}function Tg(Z){if(Z.substring(0,DI)!==fI)return JSON.parse(Z);var o=Z.substring(bg),x=Z.substring(DI,bg),X;if(x===T&&_I.test(o)){var W=o.match(_I);X=W[1],o=o.substring(W[0].length)}var S=Jg(o);switch(x){case aI:return S;case T:return c([S],{type:X});case QI:return new Int8Array(S);case CI:return new Uint8Array(S);case nI:return new Uint8ClampedArray(S);case MI:return new Int16Array(S);case Hg:return new Uint16Array(S);case Rg:return new Int32Array(S);case lg:return new Uint32Array(S);case Sg:return new Float32Array(S);case Yg:return new Float64Array(S);default:throw new Error("Unkown type: "+x)}}var ug={serialize:eg,deserialize:Tg,stringToBuffer:Jg,bufferToString:Xg};function wg(Z,o,x,X){Z.executeSql("CREATE TABLE IF NOT EXISTS "+o.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],x,X)}function Pg(Z){var o=this,x={db:null};if(Z)for(var X in Z)x[X]=typeof Z[X]!="string"?Z[X].toString():Z[X];var W=new i(function(S,v){try{x.db=openDatabase(x.name,String(x.version),x.description,x.size)}catch(M){return v(M)}x.db.transaction(function(M){wg(M,x,function(){o._dbInfo=x,S()},function(P,K){v(K)})},v)});return x.serializer=ug,W}function xg(Z,o,x,X,W,S){Z.executeSql(x,X,W,function(v,M){M.code===M.SYNTAX_ERR?v.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[o.storeName],function(P,K){K.rows.length?S(P,M):wg(P,o,function(){P.executeSql(x,X,W,S)},S)},S):S(v,M)},S)}function nF(Z,o){var x=this;Z=e(Z);var X=new i(function(W,S){x.ready().then(function(){var v=x._dbInfo;v.db.transaction(function(M){xg(M,v,"SELECT * FROM "+v.storeName+" WHERE key = ? LIMIT 1",[Z],function(P,K){var II=K.rows.length?K.rows.item(0).value:null;II&&(II=v.serializer.deserialize(II)),W(II)},function(P,K){S(K)})})}).catch(S)});return G(X,o),X}function BB(Z,o){var x=this,X=new i(function(W,S){x.ready().then(function(){var v=x._dbInfo;v.db.transaction(function(M){xg(M,v,"SELECT * FROM "+v.storeName,[],function(P,K){for(var II=K.rows,cI=II.length,KI=0;KI0){v(RF.apply(W,[Z,P,x,X-1]));return}M(KI)}})})}).catch(M)});return G(S,x),S}function sA(Z,o,x){return RF.apply(this,[Z,o,x,1])}function AQ(Z,o){var x=this;Z=e(Z);var X=new i(function(W,S){x.ready().then(function(){var v=x._dbInfo;v.db.transaction(function(M){xg(M,v,"DELETE FROM "+v.storeName+" WHERE key = ?",[Z],function(){W()},function(P,K){S(K)})})}).catch(S)});return G(X,o),X}function aU(Z){var o=this,x=new i(function(X,W){o.ready().then(function(){var S=o._dbInfo;S.db.transaction(function(v){xg(v,S,"DELETE FROM "+S.storeName,[],function(){X()},function(M,P){W(P)})})}).catch(W)});return G(x,Z),x}function QQ(Z){var o=this,x=new i(function(X,W){o.ready().then(function(){var S=o._dbInfo;S.db.transaction(function(v){xg(v,S,"SELECT COUNT(key) as c FROM "+S.storeName,[],function(M,P){var K=P.rows.item(0).c;X(K)},function(M,P){W(P)})})}).catch(W)});return G(x,Z),x}function nU(Z,o){var x=this,X=new i(function(W,S){x.ready().then(function(){var v=x._dbInfo;v.db.transaction(function(M){xg(M,v,"SELECT key FROM "+v.storeName+" WHERE id = ? LIMIT 1",[Z+1],function(P,K){var II=K.rows.length?K.rows.item(0).key:null;W(II)},function(P,K){S(K)})})}).catch(S)});return G(X,o),X}function lA(Z){var o=this,x=new i(function(X,W){o.ready().then(function(){var S=o._dbInfo;S.db.transaction(function(v){xg(v,S,"SELECT key FROM "+S.storeName,[],function(M,P){for(var K=[],II=0;II '__WebKitDatabaseInfoTable__'",[],function(W,S){for(var v=[],M=0;M0}function cA(Z){var o=this,x={};if(Z)for(var X in Z)x[X]=Z[X];return x.keyPrefix=mU(Z,o._defaultConfig),hU()?(o._dbInfo=x,x.serializer=ug,i.resolve()):i.reject()}function oU(Z){var o=this,x=o.ready().then(function(){for(var X=o._dbInfo.keyPrefix,W=localStorage.length-1;W>=0;W--){var S=localStorage.key(W);S.indexOf(X)===0&&localStorage.removeItem(S)}});return G(x,Z),x}function Ll(Z,o){var x=this;Z=e(Z);var X=x.ready().then(function(){var W=x._dbInfo,S=localStorage.getItem(W.keyPrefix+Z);return S&&(S=W.serializer.deserialize(S)),S});return G(X,o),X}function al(Z,o){var x=this,X=x.ready().then(function(){for(var W=x._dbInfo,S=W.keyPrefix,v=S.length,M=localStorage.length,P=1,K=0;K=0;v--){var M=localStorage.key(v);M.indexOf(S)===0&&localStorage.removeItem(M)}}):W=i.reject("Invalid arguments"),G(W,o),W}var xC={_driver:"localStorageWrapper",_initStorage:cA,_support:xl(),iterate:al,getItem:Ll,setItem:mg,removeItem:VI,clear:oU,length:gI,key:nl,keys:Rl,dropInstance:jg},EC=function(o,x){return o===x||typeof o=="number"&&typeof x=="number"&&isNaN(o)&&isNaN(x)},Lg=function(o,x){for(var X=o.length,W=0;W"u"?"undefined":Q(x))==="object"){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var X in x){if(X==="storeName"&&(x[X]=x[X].replace(/\W/g,"_")),X==="version"&&typeof x[X]!="number")return new Error("Database version must be a number.");this._config[X]=x[X]}return"driver"in x&&x.driver?this.setDriver(this._config.driver):!0}else return typeof x=="string"?this._config[x]:this._config},Z.prototype.defineDriver=function(x,X,W){var S=new i(function(v,M){try{var P=x._driver,K=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!x._driver){M(K);return}for(var II=oB.concat("_initStorage"),cI=0,KI=II.length;cI{(function(C,I){typeof Fl=="object"&&typeof pd<"u"?I(Fl,Bl()):typeof define=="function"&&define.amd?define(["exports","localforage"],I):I(C.localforageSetItems=C.localforageSetItems||{},C.localforage)})(Fl,function(C,I){"use strict";I="default"in I?I.default:I;function g(c){return g.result?g.result:!c||typeof c.getSerializer!="function"?Promise.reject(new Error("localforage.getSerializer() was not available! localforage v1.4+ is required!")):(g.result=c.getSerializer(),g.result)}function B(c,i){i&&c.then(function(G){i(null,G)},function(G){i(G)})}function F(c,i,G,b){function e(m,a){var L=m||a;return(!m||typeof m!="function")&&typeof L=="string"&&(m=function(E){return E[L]}),m}var V=[];if(Object.prototype.toString.call(c)==="[object Array]"){i=e(i,"key"),G=e(G,"value");for(var u=0,n=c.length;u{(function(C,I){typeof Al=="object"&&typeof Yd<"u"?I(Al,Bl()):typeof define=="function"&&define.amd?define(["exports","localforage"],I):I(C.localforageGetItems=C.localforageGetItems||{},C.localforage)})(Al,function(C,I){"use strict";I="default"in I?I.default:I;function g(b){return g.result?g.result:!b||typeof b.getSerializer!="function"?Promise.reject(new Error("localforage.getSerializer() was not available! localforage v1.4+ is required!")):(g.result=b.getSerializer(),g.result)}function B(b,e){return e&&b.then(function(V){e(null,V)},function(V){e(V)}),b}function F(b,e){var V=this,u=V.getItem(b).then(function(n){return{key:b,value:n}});return B(u,e),u}function A(b){var e=this,V=new Promise(function(u,n){for(var R=[],h=0,m=b.length;hR?1:0}var u=new Promise(function(n,R){e.ready().then(function(){var h=e._dbInfo,m=h.db.transaction(h.storeName,"readonly").objectStore(h.storeName),a=b.sort(V),L=s.bound(b[0],b[b.length-1],!1,!1),y;if("getAll"in m)y=m.getAll(L),y.onsuccess=function(){var N=y.result;N===void 0&&(N=null),n(N)};else{y=m.openCursor(L);var E={},Y=0;y.onsuccess=function(){var N=y.result;if(!N){n(E);return}for(var r=N.key;r>a[Y];)if(Y++,Y===a.length){n(E);return}if(r===a[Y]){var j=N.value;j===void 0&&(j=null),E[r]=j,N.continue()}else N.continue(a[Y])}}y.onerror=function(){R(y.error)}}).catch(R)});return u}function d(b){var e=this,V=new Promise(function(u,n){e.ready().then(function(){return g(e)}).then(function(R){var h=e._dbInfo;h.db.transaction(function(m){for(var a=new Array(b.length),L=0,y=b.length;LZl});module.exports=wb(mu);var OB=require("obsidian"),FQ=require("@codemirror/state"),rb=require("@codemirror/view");function iA(C,I){let g=Object.keys(I).map(B=>fb(C,B,I[B]));return g.length===1?g[0]:function(){g.forEach(B=>B())}}function fb(C,I,g){let B=C[I],F=C.hasOwnProperty(I),A=F?B:function(){return Object.getPrototypeOf(C)[I].apply(this,arguments)},Q=g(A);return B&&Object.setPrototypeOf(Q,B),Object.setPrototypeOf(U,Q),C[I]=U,s;function U(...l){return Q===A&&C[I]===U&&s(),Q.apply(this,l)}function s(){C[I]===U&&(F?C[I]=A:delete C[I]),Q!==A&&(Q=A,Object.setPrototypeOf(U,B||Function))}}var ag=(A=>(A.ADDITION="addition",A.DELETION="deletion",A.SUBSTITUTION="substitution",A.HIGHLIGHT="highlight",A.COMMENT="comment",A))(ag||{}),Oc={Addition:"addition",Deletion:"deletion",Substitution:"substitution",Highlight:"highlight",Comment:"comment"};var ng={addition:["{++","++}"],deletion:["{--","--}"],substitution:["{~~","~>","~~}"],highlight:["{==","==}"],comment:["{>>","<<}"]},_c={"{++":["++}"],"{--":["--}"],"{~~":["~>","~~}"],"{==":["==}"],"{>>":["<<}"]},qc={addition:"plus-circle",deletion:"minus-square",substitution:"replace",highlight:"highlighter",comment:"message-square"};var WU={a:"author",t:"time",d:"done",s:"style",c:"color"},KC=class{constructor(I,g,B,F,A,Q){this.from=I;this.to=g;this.type=B;this.repr=F;this.text=A;this.metadata=Q;if(Q!==void 0){let U=Q-I,s=A.slice(3,U);this.text=A.slice(0,3)+A.slice(U+2);try{this.fields=JSON.parse(s);for(let l in this.fields)l in WU&&(this.fields[WU[l]]=this.fields[l],delete this.fields[l])}catch{this.fields={}}}}fields={};replies=[];get base_range(){return this}get full_thread(){return[this,...this.replies]}get thread(){return[...this.replies]}get length(){return this.to-this.from-6}get full_text(){return this.text+this.replies.map(I=>I.text).join("")}get range_start(){return this.metadata?this.metadata+2:this.from+3}get range_front(){return this.metadata?this.metadata-1:this.from}get full_range_front(){return this.base_range.from}get full_range_back(){return this.base_range.replies.length?this.base_range.replies[this.base_range.replies.length-1].to:this.to}range_type(I,g){return this.type}remove_metadata(){return this.metadata?[{from:this.from+3,to:this.metadata+2,insert:""}]:[]}delete_metadata(I){return I in WU&&(I=WU[I]),I in this.fields&&(delete this.fields[I],Object.keys(this.fields).length===0?this.remove_metadata():this.set_metadata(this.fields)),[]}add_metadata(I,g){return this.fields[I]=g,this.set_metadata(this.fields)}set_metadata(I){return this.fields=I,this.metadata!==void 0?[{from:this.from+3,to:this.metadata,insert:JSON.stringify(I)}]:[{from:this.from+3,to:this.from+3,insert:JSON.stringify(I)+"@@"}]}has_comment(I){return this.thread.includes(I)}copy(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}equals(I){return this.type===I.type&&this.from===I.from&&this.to===I.to&&this.replies.length===I.replies.length&&this.full_text===I.full_text}left_adjacent(I){return this.from===I.to}right_adjacent(I){return this.to===I.from}part_is_empty(I){return!1}empty(){return this.to-this.from===6}unwrap(){return this.text.slice(3,-3)}unwrap_bracket(I=!1){return I?this.text.slice(3):this.text.slice(0,-3)}unwrap_parts(){return[this.unwrap()]}unwrap_slice(I,g){return I-=this.range_front,g-=this.range_front,g<=0||I===g?"":this.text.slice(Math.max(3,I),Math.min(this.text.length-3,g))}partially_in_range(I,g){return!(I>this.to||gg:this.from<=I&&this.to>=g}part_encloses_range(I,g,B){return this.encloses_range(I,g)}accept(){return this.text}reject(){return this.text}touches(I){return this.from===I||this.to===I}cursor_inside(I){return this.from<=I&&I<=this.to}cursor_before_range(I){return Ithis.to}cursor_move_inside(I,g=!1){return Math.min(Math.max(g&&this.metadata?this.metadata+2:this.from+3,I),this.to-3)}cursor_pass_syntax(I,g,B=!1){return g?(this.touches_left_bracket(I,!0,!1,B)&&(I=B&&this.metadata?this.metadata+2:this.from+3),this.touches_right_bracket(I,!1,!0)&&(I=this.to)):(this.touches_right_bracket(I,!0,!1)&&(I=this.to-3),this.touches_left_bracket(I,!1,!0,B)&&(I=this.from)),I}cursor_move_through(I,g,B){return B=="unchanged"||!this.cursor_inside(I)||(B=="ignore_completely"?I=g?this.to:this.from:I=this.cursor_pass_syntax(I,g,B=="ignore_metadata")),I}touches_left_bracket(I,g=!1,B=!1,F=!1){return I+(g?0:1)>=this.from&&I+(B?0:1)<=(F&&this.metadata?this.metadata+2:this.from+3)}touches_separator(I,g=!1,B=!1){return!1}touches_right_bracket(I,g=!1,B=!1){return I-(B?0:1)>=this.to-3&&I-(g?0:1)<=this.to}touches_bracket(I,g,B=!1,F=!1){return g?this.touches_left_bracket(I,B,F):this.touches_right_bracket(I,B,F)}postprocess(I=!0,g=0,B="div",F=null,A){let Q=A??this.text;return!A&&I&&(this.to>=Q.length&&!Q.endsWith(ng[this.type].at(-1))?Q=this.unwrap_bracket(!0):Q=this.unwrap()),`<${B} class='cmtr-${this.repr.toLowerCase()}'>${Q}`}apply_offset(I){this.from+=I,this.to+=I,this.metadata!==void 0&&(this.metadata+=I)}split_range(I){return[this.text.slice(-3),this.text.slice(0,3)+(this.metadata?JSON.stringify(this.fields)+"@@":"")]}};var oF=class extends KC{constructor(I,g,B,F){super(I,g,"addition","Addition",B,F)}accept(){return this.unwrap()}reject(){return""}postprocess(I=!0,g=0,B="div",F=null,A){let Q=A??this.text;!A&&I&&(this.to>=Q.length&&!Q.endsWith(ng[this.type].at(-1))?Q=this.unwrap_bracket(!0):Q=this.unwrap());let U="cmtr-preview";return g===0?U+=" cmtr-addition":g===2&&(Q=""),`<${B} class='${U}'>${Q}`}};var GA=class extends KC{reply_depth=0;attached_comment=null;get base_range(){return this.attached_comment||this}get thread(){return this.attached_comment?[...this.attached_comment.thread]:[this,...this.replies]}clear_references(){this.attached_comment=null,this.reply_depth=0}add_reply(I){this.attach_to_range(I.type==="comment"?I.base_range:I)}attach_to_range(I){I.replies.push(this),this.reply_depth=I.replies.length-(I.type==="comment"?0:1),this.attached_comment=I}constructor(I,g,B,F){super(I,g,"comment","Comment",B,F)}};var dA=class extends KC{constructor(I,g,B,F){super(I,g,"deletion","Deletion",B,F)}accept(){return""}reject(){return this.unwrap()}postprocess(I=!0,g=0,B="div",F=null,A){let Q=A??this.text;!A&&I&&(this.to>=Q.length&&!Q.endsWith(ng[this.type].at(-1))?Q=this.unwrap_bracket(!0):Q=this.unwrap());let U="cmtr-preview";return g===0?U+=" cmtr-deletion":g===1&&(Q=""),`<${B} class='${U}'>${Q}`}};var bA=class extends KC{constructor(I,g,B,F){super(I,g,"highlight","Highlight",B,F)}};var eB=class extends KC{constructor(g,B,F,A,Q){super(g,F,"substitution","Substitution",A,Q);this.middle=B}get length(){return this.to-this.from-8}get char_middle(){return this.middle-this.range_front}range_type(g,B){return B<=this.middle+2?"deletion":g>=this.middle?"addition":"substitution"}unwrap(){return this.text.slice(3,this.char_middle)+this.text.slice(this.char_middle+2,-3)}unwrap_parts(){return[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice_parts_inverted(g,B){return g-=this.range_front,B-=this.range_front,g=Math.max(0,g),B<=0?this.unwrap_parts():B<=this.char_middle?[this.text.slice(3,g)+this.text.slice(B,this.char_middle),this.text.slice(this.char_middle+2,-3)]:g>=this.char_middle+2?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,g)+this.text.slice(B,-3)]:[this.text.slice(3,g),this.text.slice(B,-3)]}unwrap_parts_bracket(g,B=0){return g?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2)]:[this.text.slice(0,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice(g,B){return g-=this.range_front,B-=this.range_front,B<=0||g===B?"":g>=this.char_middle?this.text.slice(Math.max(this.char_middle+2,g),Math.min(this.text.length-3,B)):B<=this.char_middle?this.text.slice(Math.max(3,g),Math.min(this.char_middle,B)):this.text.slice(Math.max(3,g),this.char_middle)+this.text.slice(this.char_middle+2,Math.min(this.text.length-3,B))}accept(){return this.unwrap_parts()[1]}reject(){return this.unwrap_parts()[0]}touches_separator(g,B=!1,F=!1){return g+(B?1:0)>=this.middle&&g-(F?0:1)<=this.middle+2}contains_separator(g,B){return g<=this.middle+2&&B>=this.middle}contains_part(g,B,F=!0){return F?Bthis.middle+2?!1:void 0:B<=this.middle?!0:g>=this.middle+2?!1:void 0}cursor_pass_syntax(g,B,F=!1){return B?(this.touches_left_bracket(g,!0,!1,F)&&(g=F&&this.metadata?this.metadata+2:this.from+3),this.touches_separator(g,!1,!0)&&(g=this.middle+2),this.touches_right_bracket(g,!1,!0)&&(g=this.to)):(this.touches_right_bracket(g,!0,!1)&&(g=this.to-3),this.touches_separator(g,!1,!0)&&(g=this.middle),this.touches_left_bracket(g,!1,!0,F)&&(g=this.from)),g}part_encloses_range(g,B,F){return F?this.from<=g&&B<=this.middle+2:this.middle<=g&&B<=this.to}empty(){return this.from+3===this.middle&&this.middle+2===this.to-3}part_is_empty(g){return g?this.from+3===this.middle:this.middle+2===this.to-3}postprocess(g=!0,B=0,F="div",A=null,Q){let U=Q??this.text,s=[U];!Q&&g&&(this.to>=U.length&&!U.endsWith(ng.substitution[2])?s=this.unwrap_parts_bracket(!0):this.from<=0&&!U.startsWith(ng.substitution[0])?s=this.unwrap_parts_bracket(!1):s=this.unwrap_parts());let l="cmtr-preview";return s.length===1&&(s[+A]=s[0],s[+!A]=""),U="",B===0?(s[0].length&&(U+=`<${F} class='${l} cmtr-deletion'>${s[0]}`),s[1].length&&(U+=`<${F} class='${l} cmtr-addition'>${s[1]}`)):B===1?s[1].length&&(U+=`<${F} class='${l}'>${s[1]}`):s[0].length&&(U+=`<${F} class='${l}'>${s[0]}`),U}apply_offset(g){this.from+=g,this.middle+=g,this.to+=g,this.metadata!==void 0&&(this.metadata+=g)}split_range(g){let B=super.split_range(g);return g<=this.middle?B[0]=ng.substitution[1]+B[0]:B[1]=B[1]+ng.substitution[1],B}cursor_move_inside(g,B=!1){return g=super.cursor_move_inside(g,B),g==this.middle+1&&(g=this.middle+2),g}};var sx=require("@codemirror/state");var zb=class ol{constructor(I,g){this.low=I,this.high=g}clone(){return new ol(this.low,this.high)}get max(){return this.clone()}less_than(I){return this.lowI.high?this.high:I.high)}output(){return[this.low,this.high]}static comparable_max(I,g){return I.merge(g)}static comparable_less_than(I,g){return Is&&([U,s]=[s,U]),this.item.key=new zb(U,s)}this.max=this.item.key?this.item.key.max:void 0}isNil(){return this.item.key===void 0&&this.item.value===void 0&&this.left===null&&this.right===null&&this.color===Bg}_value_less_than(I){return this.item.value&&I.item.value&&this.item.value.less_than?this.item.value.less_than(I.item.value):this.item.valueI++),I}get keys(){let I=[];return this.tree_walk(this.root,g=>I.push(g.item.key.output?g.item.key.output():g.item.key)),I}get values(){let I=[];return this.tree_walk(this.root,g=>I.push(g.item.value)),I}get items(){let I=[];return this.tree_walk(this.root,g=>I.push({key:g.item.key.output?g.item.key.output():g.item.key,value:g.item.value})),I}isEmpty(){return this.root==null||this.root===this.nil_node}clear(){this.root=null}insert(I,g=I){if(I===void 0)return;let B=new XB(I,g,this.nil_node,this.nil_node,null,_g);return this.tree_insert(B),this.recalc_max(B),B}exist(I,g=I){let B=new XB(I,g);return!!this.tree_search(this.root,B)}remove(I,g=I){let B=new XB(I,g),F=this.tree_search(this.root,B);return F&&this.tree_delete(F),F}search(I,g=(B,F)=>B===F?F.output():B){let B=new XB(I),F=[];return this.tree_search_interval(this.root,B,F),F.map(A=>g(A.item.value,A.item.key))}intersect_any(I){let g=new XB(I);return this.tree_find_any_interval(this.root,g)}forEach(I){this.tree_walk(this.root,g=>I(g.item.key,g.item.value))}map(I){let g=new C;return this.tree_walk(this.root,B=>g.insert(B.item.key,I(B.item.value,B.item.key))),g}*iterate(I,g=(B,F)=>B===F?F.output():B){let B;for(I?B=this.tree_search_nearest_forward(this.root,new XB(I)):this.root&&(B=this.local_minimum(this.root));B;)yield g(B.item.value,B.item.key),B=this.tree_successor(B)}recalc_max(I){let g=I;for(;g.parent!=null;)g.parent.update_max(),g=g.parent}tree_insert(I){let g=this.root,B=null;if(this.root==null||this.root===this.nil_node)this.root=I;else{for(;g!==this.nil_node;)B=g,I.less_than(g)?g=g.left:g=g.right;I.parent=B,I.less_than(B)?B.left=I:B.right=I}this.insert_fixup(I)}insert_fixup(I){let g,B;for(g=I;g!==this.root&&g.parent.color===_g;)g.parent===g.parent.parent.left?(B=g.parent.parent.right,B.color===_g?(g.parent.color=Bg,B.color=Bg,g.parent.parent.color=_g,g=g.parent.parent):(g===g.parent.right&&(g=g.parent,this.rotate_left(g)),g.parent.color=Bg,g.parent.parent.color=_g,this.rotate_right(g.parent.parent))):(B=g.parent.parent.left,B.color===_g?(g.parent.color=Bg,B.color=Bg,g.parent.parent.color=_g,g=g.parent.parent):(g===g.parent.left&&(g=g.parent,this.rotate_right(g)),g.parent.color=Bg,g.parent.parent.color=_g,this.rotate_left(g.parent.parent)));this.root.color=Bg}tree_delete(I){let g,B;I.left===this.nil_node||I.right===this.nil_node?g=I:g=this.tree_successor(I),g.left!==this.nil_node?B=g.left:B=g.right,B.parent=g.parent,g===this.root?this.root=B:(g===g.parent.left?g.parent.left=B:g.parent.right=B,g.parent.update_max()),this.recalc_max(B),g!==I&&(I.copy_data(g),I.update_max(),this.recalc_max(I)),g.color===Bg&&this.delete_fixup(B)}delete_fixup(I){let g=I,B;for(;g!==this.root&&g.parent!=null&&g.color===Bg;)g===g.parent.left?(B=g.parent.right,B.color===_g&&(B.color=Bg,g.parent.color=_g,this.rotate_left(g.parent),B=g.parent.right),B.left.color===Bg&&B.right.color===Bg?(B.color=_g,g=g.parent):(B.right.color===Bg&&(B.color=_g,B.left.color=Bg,this.rotate_right(B),B=g.parent.right),B.color=g.parent.color,g.parent.color=Bg,B.right.color=Bg,this.rotate_left(g.parent),g=this.root)):(B=g.parent.left,B.color===_g&&(B.color=Bg,g.parent.color=_g,this.rotate_right(g.parent),B=g.parent.left),B.left.color===Bg&&B.right.color===Bg?(B.color=_g,g=g.parent):(B.left.color===Bg&&(B.color=_g,B.right.color=Bg,this.rotate_left(B),B=g.parent.left),B.color=g.parent.color,g.parent.color=Bg,B.left.color=Bg,this.rotate_right(g.parent),g=this.root));g.color=Bg}tree_search(I,g){if(!(I==null||I===this.nil_node))return g.equal_to(I)?I:g.less_than(I)?this.tree_search(I.left,g):this.tree_search(I.right,g)}tree_search_nearest_forward(I,g){let B,F=I;for(;F&&F!==this.nil_node;)F.less_than(g)?F.intersect(g)?(B=F,F=F.left):F=F.right:((!B||F.less_than(B))&&(B=F),F=F.left);return B||null}tree_search_interval(I,g,B){I!=null&&I!==this.nil_node&&(I.left!==this.nil_node&&!I.not_intersect_left_subtree(g)&&this.tree_search_interval(I.left,g,B),I.intersect(g)&&B.push(I),I.right!==this.nil_node&&!I.not_intersect_right_subtree(g)&&this.tree_search_interval(I.right,g,B))}tree_find_any_interval(I,g){let B=!1;return I!=null&&I!==this.nil_node&&(I.left!==this.nil_node&&!I.not_intersect_left_subtree(g)&&(B=this.tree_find_any_interval(I.left,g)),B||(B=I.intersect(g)),!B&&I.right!==this.nil_node&&!I.not_intersect_right_subtree(g)&&(B=this.tree_find_any_interval(I.right,g))),B}local_minimum(I){let g=I;for(;g.left!=null&&g.left!==this.nil_node;)g=g.left;return g}local_maximum(I){let g=I;for(;g.right!=null&&g.right!==this.nil_node;)g=g.right;return g}tree_successor(I){let g,B,F;if(I.right!==this.nil_node)g=this.local_minimum(I.right);else{for(B=I,F=I.parent;F!=null&&F.right===B;)B=F,F=F.parent;g=F}return g}rotate_left(I){let g=I.right;I.right=g.left,g.left!==this.nil_node&&(g.left.parent=I),g.parent=I.parent,I===this.root?this.root=g:I===I.parent.left?I.parent.left=g:I.parent.right=g,g.left=I,I.parent=g,I!=null&&I!==this.nil_node&&I.update_max(),g=I.parent,g!=null&&g!==this.nil_node&&g.update_max()}rotate_right(I){let g=I.left;I.left=g.right,g.right!==this.nil_node&&(g.right.parent=I),g.parent=I.parent,I===this.root?this.root=g:I===I.parent.left?I.parent.left=g:I.parent.right=g,g.right=I,I.parent=g,I!==null&&I!==this.nil_node&&I.update_max(),g=I.parent,g!=null&&g!==this.nil_node&&g.update_max()}tree_walk(I,g){I!=null&&I!==this.nil_node&&(this.tree_walk(I.left,g),g(I),this.tree_walk(I.right,g))}testRedBlackProperty(){let I=!0;return this.tree_walk(this.root,function(g){g.color===_g&&(g.left.color===Bg&&g.right.color===Bg||(I=!1))}),I}testBlackHeightProperty(I){let g=0,B=0,F=0;if(I.color===Bg&&g++,I.left!==this.nil_node?B=this.testBlackHeightProperty(I.left):B=1,I.right!==this.nil_node?F=this.testBlackHeightProperty(I.right):F=1,B!==F)throw new Error("Red-black height property violated");return g+=B,g}};var rU=class{ranges;tree;constructor(I){this.ranges=I,this.tree=new EU;for(let g of I)this.tree.insert([g.from,g.to],g)}empty(){return this.ranges.length===0}get(I){return I<0?this.ranges[this.ranges.length+I]:this.ranges[I]}at_cursor(I,g=!1){let B=this.tree.search([I,I]);return B.length?g&&B.length>1?B[1]:B[0]:void 0}contains_range(I,g){return this.tree.intersect_any([I,g])}range_adjacent_to_cursor(I,g,B=!1,F=!1){let A=g?this.ranges.slice().reverse():this.ranges;return F?A.find(Q=>g?(B?Q.from:Q.to)g?(B?Q.from:Q.to)<=I:I<=(B?Q.to:Q.from))}adjacent_range(I,g,B=!1){let F=this.ranges.findIndex(Q=>Q===I);if(F===-1)return;let A=g?this.ranges[F-1]:this.ranges[F+1];if(A)if(B){if(g?A.to===I.from:I.to===A.from)return A}else return A}ranges_in_range(I,g){return this.tree.search([I,g])}unwrap_in_range(I,g=0,B=I.length,F=null){let A,Q;if(F||(F=this.ranges_in_range(g,B)),F.length===0)return{output:I.sliceString(g,B),from:g,to:B};let U="";g=F.at(-1).to?U+=I.sliceString(F.at(-1).to,B):Q=F.at(-1);let l=A?A.cursor_pass_syntax(g,!1):g,d=Q?Q.cursor_pass_syntax(B,!0):B;return(l!==g||g===A?.from)&&(A=void 0),(d!==B||B===Q?.to)&&(Q=void 0),{output:U,from:l,to:d,front_range:A,back_range:Q}}};var LL=require("@codemirror/view");var hx=require("@codemirror/state");var Vx=require("@codemirror/state");function Ii(C){return C.ranges.length===1&&C.ranges[0].anchor===C.ranges[0].head}function eA(C){return C.startState.selection.ranges[0].from!==C.selection.ranges[0].from||C.startState.selection.ranges[0].to!==C.selection.ranges[0].to}function tQ(C,I,g){let B=[],F=0;return I.iterChanges((A,Q,U,s,l)=>{B.push({from:A,to:Q,anchor:C.ranges[F].anchor,offset:{removed:Q-A,added:s-U},inserted:l.toString(),deleted:Q-A?g.sliceString(A,Q):"",selection:C.ranges[F].anchor!==C.ranges[F].head}),F{throw new Error("This node type doesn't define a deserialize function")})}add(I){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof I!="function"&&(I=EB.match(I)),g=>{let B=I(g);return B===void 0?null:[this,B]}}};Zg.closedBy=new Zg({deserialize:C=>C.split(" ")});Zg.openedBy=new Zg({deserialize:C=>C.split(" ")});Zg.group=new Zg({deserialize:C=>C.split(" ")});Zg.isolate=new Zg({deserialize:C=>{if(C&&C!="rtl"&&C!="ltr"&&C!="auto")throw new RangeError("Invalid value for isolate: "+C);return C||"auto"}});Zg.contextHash=new Zg({perNode:!0});Zg.lookAhead=new Zg({perNode:!0});Zg.mounted=new Zg({perNode:!0});var ZA=class{constructor(I,g,B){this.tree=I,this.overlay=g,this.parser=B}static get(I){return I&&I.props&&I.props[Zg.mounted.id]}},Kb=Object.create(null),EB=class C{constructor(I,g,B,F=0){this.name=I,this.props=g,this.id=B,this.flags=F}static define(I){let g=I.props&&I.props.length?Object.create(null):Kb,B=(I.top?1:0)|(I.skipped?2:0)|(I.error?4:0)|(I.name==null?8:0),F=new C(I.name||"",g,I.id,B);if(I.props){for(let A of I.props)if(Array.isArray(A)||(A=A(F)),A){if(A[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");g[A[0].id]=A[1]}}return F}prop(I){return this.props[I.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(I){if(typeof I=="string"){if(this.name==I)return!0;let g=this.prop(Zg.group);return g?g.indexOf(I)>-1:!1}return this.id==I}static match(I){let g=Object.create(null);for(let B in I)for(let F of B.split(" "))g[F]=I[B];return B=>{for(let F=B.prop(Zg.group),A=-1;A<(F?F.length:0);A++){let Q=g[A<0?B.name:F[A]];if(Q)return Q}}}};EB.none=new EB("",Object.create(null),0,8);var NU=new WeakMap,Ci=new WeakMap,FC;(function(C){C[C.ExcludeBuffers=1]="ExcludeBuffers",C[C.IncludeAnonymous=2]="IncludeAnonymous",C[C.IgnoreMounts=4]="IgnoreMounts",C[C.IgnoreOverlays=8]="IgnoreOverlays"})(FC||(FC={}));var WB=class C{constructor(I,g,B,F,A){if(this.type=I,this.children=g,this.positions=B,this.length=F,this.props=null,A&&A.length){this.props=Object.create(null);for(let[Q,U]of A)this.props[typeof Q=="number"?Q:Q.id]=U}}toString(){let I=ZA.get(this);if(I&&!I.overlay)return I.tree.toString();let g="";for(let B of this.children){let F=B.toString();F&&(g&&(g+=","),g+=F)}return this.type.name?(/\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(g.length?"("+g+")":""):g}cursor(I=0){return new GQ(this.topNode,I)}cursorAt(I,g=0,B=0){let F=NU.get(this)||this.topNode,A=new GQ(F);return A.moveTo(I,g),NU.set(this,A._tree),A}get topNode(){return new ZB(this,0,0,null)}resolve(I,g=0){let B=cQ(NU.get(this)||this.topNode,I,g,!1);return NU.set(this,B),B}resolveInner(I,g=0){let B=cQ(Ci.get(this)||this.topNode,I,g,!0);return Ci.set(this,B),B}resolveStack(I,g=0){return Pb(this,I,g)}iterate(I){let{enter:g,leave:B,from:F=0,to:A=this.length}=I,Q=I.mode||0,U=(Q&FC.IncludeAnonymous)>0;for(let s=this.cursor(Q|FC.IncludeAnonymous);;){let l=!1;if(s.from<=A&&s.to>=F&&(!U&&s.type.isAnonymous||g(s)!==!1)){if(s.firstChild())continue;l=!0}for(;l&&B&&(U||!s.type.isAnonymous)&&B(s),!s.nextSibling();){if(!s.parent())return;l=!0}}}prop(I){return I.perNode?this.props?this.props[I.id]:void 0:this.type.prop(I)}get propValues(){let I=[];if(this.props)for(let g in this.props)I.push([+g,this.props[g]]);return I}balance(I={}){return this.children.length<=8?this:Nl(EB.none,this.children,this.positions,0,this.children.length,0,this.length,(g,B,F)=>new C(this.type,g,B,F,this.propValues),I.makeTree||((g,B,F)=>new C(EB.none,g,B,F)))}static build(I){return jb(I)}};WB.empty=new WB(EB.none,[],[],0);var Sl=class C{constructor(I,g){this.buffer=I,this.index=g}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new C(this.buffer,this.index)}},$B=class C{constructor(I,g,B){this.buffer=I,this.length=g,this.set=B}get type(){return EB.none}toString(){let I=[];for(let g=0;g0));s=Q[s+3]);return U}slice(I,g,B){let F=this.buffer,A=new Uint16Array(g-I),Q=0;for(let U=I,s=0;U=I&&gI;case 1:return g<=I&&B>I;case 2:return B>I;case 4:return!0}}function cQ(C,I,g,B){for(var F;C.from==C.to||(g<1?C.from>=I:C.from>I)||(g>-1?C.to<=I:C.to0?U.length:-1;I!=l;I+=g){let d=U[I],c=s[I]+Q.from;if(Ai(F,B,c,c+d.length)){if(d instanceof $B){if(A&FC.ExcludeBuffers)continue;let i=d.findChild(0,d.buffer.length,g,B-c,F);if(i>-1)return new iQ(new Wl(Q,d,I,c),null,i)}else if(A&FC.IncludeAnonymous||!d.type.isAnonymous||rl(d)){let i;if(!(A&FC.IgnoreMounts)&&(i=ZA.get(d))&&!i.overlay)return new C(i.tree,c,I,Q);let G=new C(d,c,I,Q);return A&FC.IncludeAnonymous||!G.type.isAnonymous?G:G.nextChild(g<0?d.children.length-1:0,g,B,F)}}}if(A&FC.IncludeAnonymous||!Q.type.isAnonymous||(Q.index>=0?I=Q.index+g:I=g<0?-1:Q._parent._tree.children.length,Q=Q._parent,!Q))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(I){return this.nextChild(0,1,I,2)}childBefore(I){return this.nextChild(this._tree.children.length-1,-1,I,-2)}enter(I,g,B=0){let F;if(!(B&FC.IgnoreOverlays)&&(F=ZA.get(this._tree))&&F.overlay){let A=I-this.from;for(let{from:Q,to:U}of F.overlay)if((g>0?Q<=A:Q=A:U>A))return new C(F.tree,F.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,I,g,B)}nextSignificantParent(){let I=this;for(;I.type.isAnonymous&&I._parent;)I=I._parent;return I}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Bi(C,I,g,B){let F=C.cursor(),A=[];if(!F.firstChild())return A;if(g!=null){for(let Q=!1;!Q;)if(Q=F.type.is(g),!F.nextSibling())return A}for(;;){if(B!=null&&F.type.is(B))return A;if(F.type.is(I)&&A.push(F.node),!F.nextSibling())return B==null?A:[]}}function Xl(C,I,g=I.length-1){for(let B=C;g>=0;B=B.parent){if(!B)return!1;if(!B.type.isAnonymous){if(I[g]&&I[g]!=B.name)return!1;g--}}return!0}var Wl=class{constructor(I,g,B,F){this.parent=I,this.buffer=g,this.index=B,this.start=F}},iQ=class C extends HU{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(I,g,B){super(),this.context=I,this._parent=g,this.index=B,this.type=I.buffer.set.types[I.buffer.buffer[B]]}child(I,g,B){let{buffer:F}=this.context,A=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.context.start,B);return A<0?null:new C(this.context,this,A)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(I){return this.child(1,I,2)}childBefore(I){return this.child(-1,I,-2)}enter(I,g,B=0){if(B&FC.ExcludeBuffers)return null;let{buffer:F}=this.context,A=F.findChild(this.index+4,F.buffer[this.index+3],g>0?1:-1,I-this.context.start,g);return A<0?null:new C(this.context,this,A)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(I){return this._parent?null:this.context.parent.nextChild(this.context.index+I,I,0,4)}get nextSibling(){let{buffer:I}=this.context,g=I.buffer[this.index+3];return g<(this._parent?I.buffer[this._parent.index+3]:I.buffer.length)?new C(this.context,this._parent,g):this.externalSibling(1)}get prevSibling(){let{buffer:I}=this.context,g=this._parent?this._parent.index+4:0;return this.index==g?this.externalSibling(-1):new C(this.context,this._parent,I.findChild(g,this.index,-1,0,4))}get tree(){return null}toTree(){let I=[],g=[],{buffer:B}=this.context,F=this.index+4,A=B.buffer[this.index+3];if(A>F){let Q=B.buffer[this.index+1];I.push(B.slice(F,A,Q)),g.push(0)}return new WB(this.type,I,g,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Qi(C){if(!C.length)return null;let I=0,g=C[0];for(let A=1;Ag.from||Q.to=I){let U=new ZB(Q.tree,Q.overlay[0].from+A.from,-1,A);(F||(F=[B])).push(cQ(U,I,g,!1))}}return F?Qi(F):B}var GQ=class{get name(){return this.type.name}constructor(I,g=0){if(this.mode=g,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,I instanceof ZB)this.yieldNode(I);else{this._tree=I.context.parent,this.buffer=I.context;for(let B=I._parent;B;B=B._parent)this.stack.unshift(B.index);this.bufferNode=I,this.yieldBuf(I.index)}}yieldNode(I){return I?(this._tree=I,this.type=I.type,this.from=I.from,this.to=I.to,!0):!1}yieldBuf(I,g){this.index=I;let{start:B,buffer:F}=this.buffer;return this.type=g||F.set.types[F.buffer[I]],this.from=B+F.buffer[I+1],this.to=B+F.buffer[I+2],!0}yield(I){return I?I instanceof ZB?(this.buffer=null,this.yieldNode(I)):(this.buffer=I.context,this.yieldBuf(I.index,I.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(I,g,B){if(!this.buffer)return this.yield(this._tree.nextChild(I<0?this._tree._tree.children.length-1:0,I,g,B,this.mode));let{buffer:F}=this.buffer,A=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.buffer.start,B);return A<0?!1:(this.stack.push(this.index),this.yieldBuf(A))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(I){return this.enterChild(1,I,2)}childBefore(I){return this.enterChild(-1,I,-2)}enter(I,g,B=this.mode){return this.buffer?B&FC.ExcludeBuffers?!1:this.enterChild(1,I,g):this.yield(this._tree.enter(I,g,B))}parent(){if(!this.buffer)return this.yieldNode(this.mode&FC.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let I=this.mode&FC.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(I)}sibling(I){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+I,I,0,4,this.mode)):!1;let{buffer:g}=this.buffer,B=this.stack.length-1;if(I<0){let F=B<0?0:this.stack[B]+4;if(this.index!=F)return this.yieldBuf(g.findChild(F,this.index,-1,0,4))}else{let F=g.buffer[this.index+3];if(F<(B<0?g.buffer.length:g.buffer[this.stack[B]+3]))return this.yieldBuf(F)}return B<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+I,I,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(I){let g,B,{buffer:F}=this;if(F){if(I>0){if(this.index-1)for(let A=g+I,Q=I<0?-1:B._tree.children.length;A!=Q;A+=I){let U=B._tree.children[A];if(this.mode&FC.IncludeAnonymous||U instanceof $B||!U.type.isAnonymous||rl(U))return!1}return!0}move(I,g){if(g&&this.enterChild(I,0,4))return!0;for(;;){if(this.sibling(I))return!0;if(this.atLastNode(I)||!this.parent())return!1}}next(I=!0){return this.move(1,I)}prev(I=!0){return this.move(-1,I)}moveTo(I,g=0){for(;(this.from==this.to||(g<1?this.from>=I:this.from>I)||(g>-1?this.to<=I:this.to=0;){for(let Q=I;Q;Q=Q._parent)if(Q.index==F){if(F==this.index)return Q;g=Q,B=A+1;break I}F=this.stack[--A]}for(let F=B;F=0;A--){if(A<0)return Xl(this._tree,I,F);let Q=B[g.buffer[this.stack[A]]];if(!Q.isAnonymous){if(I[F]&&I[F]!=Q.name)return!1;F--}}return!0}};function rl(C){return C.children.some(I=>I instanceof $B||!I.type.isAnonymous||rl(I))}function jb(C){var I;let{buffer:g,nodeSet:B,maxBufferLength:F=1024,reused:A=[],minRepeatType:Q=B.types.length}=C,U=Array.isArray(g)?new Sl(g,g.length):g,s=B.types,l=0,d=0;function c(m,a,L,y,E,Y){let{id:N,start:r,end:j,size:_}=U,D=d,UI=l;for(;_<0;)if(U.next(),_==-1){let LI=A[N];L.push(LI),y.push(r-m);return}else if(_==-3){l=N;return}else if(_==-4){d=N;return}else throw new RangeError(`Unrecognized record size: ${_}`);let rI=s[N],RI,eI,xI=r-m;if(j-r<=F&&(eI=V(U.pos-a,E))){let LI=new Uint16Array(eI.size-eI.skip),$=U.pos-eI.size,AI=LI.length;for(;U.pos>$;)AI=u(eI.start,LI,AI);RI=new $B(LI,j-eI.start,B),xI=eI.start-m}else{let LI=U.pos-_;U.next();let $=[],AI=[],kI=N>=Q?N:-1,pI=0,hI=j;for(;U.pos>LI;)kI>=0&&U.id==kI&&U.size>=0?(U.end<=hI-F&&(b($,AI,r,pI,U.end,hI,kI,D,UI),pI=$.length,hI=U.end),U.next()):Y>2500?i(r,LI,$,AI):c(r,LI,$,AI,kI,Y+1);if(kI>=0&&pI>0&&pI<$.length&&b($,AI,r,pI,r,hI,kI,D,UI),$.reverse(),AI.reverse(),kI>-1&&pI>0){let YI=G(rI,UI);RI=Nl(rI,$,AI,0,$.length,0,j-r,YI,YI)}else RI=e(rI,$,AI,j-r,D-j,UI)}L.push(RI),y.push(xI)}function i(m,a,L,y){let E=[],Y=0,N=-1;for(;U.pos>a;){let{id:r,start:j,end:_,size:D}=U;if(D>4)U.next();else{if(N>-1&&j=0;_-=3)r[D++]=E[_],r[D++]=E[_+1]-j,r[D++]=E[_+2]-j,r[D++]=D;L.push(new $B(r,E[2]-j,B)),y.push(j-m)}}function G(m,a){return(L,y,E)=>{let Y=0,N=L.length-1,r,j;if(N>=0&&(r=L[N])instanceof WB){if(!N&&r.type==m&&r.length==E)return r;(j=r.prop(Zg.lookAhead))&&(Y=y[N]+r.length+j)}return e(m,L,y,E,Y,a)}}function b(m,a,L,y,E,Y,N,r,j){let _=[],D=[];for(;m.length>y;)_.push(m.pop()),D.push(a.pop()+L-E);m.push(e(B.types[N],_,D,Y-E,r-Y,j)),a.push(E-L)}function e(m,a,L,y,E,Y,N){if(Y){let r=[Zg.contextHash,Y];N=N?[r].concat(N):[r]}if(E>25){let r=[Zg.lookAhead,E];N=N?[r].concat(N):[r]}return new WB(m,a,L,y,N)}function V(m,a){let L=U.fork(),y=0,E=0,Y=0,N=L.end-F,r={size:0,start:0,skip:0};I:for(let j=L.pos-m;L.pos>j;){let _=L.size;if(L.id==a&&_>=0){r.size=y,r.start=E,r.skip=Y,Y+=4,y+=4,L.next();continue}let D=L.pos-_;if(_<0||D=Q?4:0,rI=L.start;for(L.next();L.pos>D;){if(L.size<0)if(L.size==-3)UI+=4;else break I;else L.id>=Q&&(UI+=4);L.next()}E=rI,y+=_,Y+=UI}return(a<0||y==m)&&(r.size=y,r.start=E,r.skip=Y),r.size>4?r:void 0}function u(m,a,L){let{id:y,start:E,end:Y,size:N}=U;if(U.next(),N>=0&&y4){let j=U.pos-(N-4);for(;U.pos>j;)L=u(m,a,L)}a[--L]=r,a[--L]=Y-m,a[--L]=E-m,a[--L]=y}else N==-3?l=y:N==-4&&(d=y);return L}let n=[],R=[];for(;U.pos>0;)c(C.start||0,C.bufferStart||0,n,R,-1,0);let h=(I=C.length)!==null&&I!==void 0?I:n.length?R[0]+n[0].length:0;return new WB(s[C.topID],n.reverse(),R.reverse(),h)}var Fi=new WeakMap;function pU(C,I){if(!C.isAnonymous||I instanceof $B||I.type!=C)return 1;let g=Fi.get(I);if(g==null){g=1;for(let B of I.children){if(B.type!=C||!(B instanceof WB)){g=1;break}g+=pU(C,B)}Fi.set(I,g)}return g}function Nl(C,I,g,B,F,A,Q,U,s){let l=0;for(let b=B;b=d)break;a+=L}if(R==h+1){if(a>d){let L=b[h];G(L.children,L.positions,0,L.children.length,e[h]+n);continue}c.push(b[h])}else{let L=e[R-1]+b[R-1].length-m;c.push(Nl(C,b,e,h,R,m,L,null,s))}i.push(m+n-A)}}return G(I,g,B,F,0),(U||s)(c,i,Q)}var VA=class C{constructor(I,g,B,F,A=!1,Q=!1){this.from=I,this.to=g,this.tree=B,this.offset=F,this.open=(A?1:0)|(Q?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(I,g=[],B=!1){let F=[new C(0,I.length,I,0,!1,B)];for(let A of g)A.to>I.length&&F.push(A);return F}static applyChanges(I,g,B=128){if(!g.length)return I;let F=[],A=1,Q=I.length?I[0]:null;for(let U=0,s=0,l=0;;U++){let d=U=B)for(;Q&&Q.from=i.from||c<=i.to||l){let G=Math.max(i.from,s)-l,b=Math.min(i.to,c)-l;i=G>=b?null:new C(G,b,i.tree,i.offset+l,U>0,!!d)}if(i&&F.push(i),Q.to>c)break;Q=A{})(Fg||={});var ig=require("@codemirror/state");var yF=ig.Facet.define({combine:C=>C[0]}),pl=new ig.Compartment,SF=ig.Facet.define({combine:C=>C[0]}),Hl=new ig.Compartment,XF=ig.Facet.define({combine:C=>C[0]}),Yl=new ig.Compartment,FB=ig.Facet.define({combine:C=>C[0]}),dQ=new ig.Compartment,IF=ig.Facet.define({combine:C=>C[0]}),YU=new ig.Compartment,rB=ig.Facet.define({combine:C=>C[0]}),JU=new ig.Compartment,WF=ig.Facet.define({combine:C=>C[0]}),Jl=new ig.Compartment,iC=ig.Facet.define({combine:C=>C[0]}),uA=new ig.Compartment,aC=ig.Facet.define({combine:C=>C[0]}),xA=new ig.Compartment,LA=new ig.Compartment,aA=ig.StateEffect.define();var gt=require("@codemirror/language");var Ob=0,bQ=class{constructor(I,g){this.from=I,this.to=g}},Qg=class{constructor(I={}){this.id=Ob++,this.perNode=!!I.perNode,this.deserialize=I.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(I){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof I!="function"&&(I=PC.match(I)),g=>{let B=I(g);return B===void 0?null:[this,B]}}};Qg.closedBy=new Qg({deserialize:C=>C.split(" ")});Qg.openedBy=new Qg({deserialize:C=>C.split(" ")});Qg.group=new Qg({deserialize:C=>C.split(" ")});Qg.isolate=new Qg({deserialize:C=>{if(C&&C!="rtl"&&C!="ltr"&&C!="auto")throw new RangeError("Invalid value for isolate: "+C);return C||"auto"}});Qg.contextHash=new Qg({perNode:!0});Qg.lookAhead=new Qg({perNode:!0});Qg.mounted=new Qg({perNode:!0});var nA=class{constructor(I,g,B){this.tree=I,this.overlay=g,this.parser=B}static get(I){return I&&I.props&&I.props[Qg.mounted.id]}},_b=Object.create(null),PC=class C{constructor(I,g,B,F=0){this.name=I,this.props=g,this.id=B,this.flags=F}static define(I){let g=I.props&&I.props.length?Object.create(null):_b,B=(I.top?1:0)|(I.skipped?2:0)|(I.error?4:0)|(I.name==null?8:0),F=new C(I.name||"",g,I.id,B);if(I.props){for(let A of I.props)if(Array.isArray(A)||(A=A(F)),A){if(A[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");g[A[0].id]=A[1]}}return F}prop(I){return this.props[I.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(I){if(typeof I=="string"){if(this.name==I)return!0;let g=this.prop(Qg.group);return g?g.indexOf(I)>-1:!1}return this.id==I}static match(I){let g=Object.create(null);for(let B in I)for(let F of B.split(" "))g[F]=I[B];return B=>{for(let F=B.prop(Qg.group),A=-1;A<(F?F.length:0);A++){let Q=g[A<0?B.name:F[A]];if(Q)return Q}}}};PC.none=new PC("",Object.create(null),0,8);var DU=class C{constructor(I){this.types=I;for(let g=0;g0;for(let s=this.cursor(Q|fg.IncludeAnonymous);;){let l=!1;if(s.from<=A&&s.to>=F&&(!U&&s.type.isAnonymous||g(s)!==!1)){if(s.firstChild())continue;l=!0}for(;l&&B&&(U||!s.type.isAnonymous)&&B(s),!s.nextSibling();){if(!s.parent())return;l=!0}}}prop(I){return I.perNode?this.props?this.props[I.id]:void 0:this.type.prop(I)}get propValues(){let I=[];if(this.props)for(let g in this.props)I.push([+g,this.props[g]]);return I}balance(I={}){return this.children.length<=8?this:zl(PC.none,this.children,this.positions,0,this.children.length,0,this.length,(g,B,F)=>new C(this.type,g,B,F,this.propValues),I.makeTree||((g,B,F)=>new C(PC.none,g,B,F)))}static build(I){return $b(I)}};nC.empty=new nC(PC.none,[],[],0);var vl=class C{constructor(I,g){this.buffer=I,this.index=g}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new C(this.buffer,this.index)}},gF=class C{constructor(I,g,B){this.buffer=I,this.length=g,this.set=B}get type(){return PC.none}toString(){let I=[];for(let g=0;g0));s=Q[s+3]);return U}slice(I,g,B){let F=this.buffer,A=new Uint16Array(g-I),Q=0;for(let U=I,s=0;U=I&&gI;case 1:return g<=I&&B>I;case 2:return B>I;case 4:return!0}}function eQ(C,I,g,B){for(var F;C.from==C.to||(g<1?C.from>=I:C.from>I)||(g>-1?C.to<=I:C.to0?U.length:-1;I!=l;I+=g){let d=U[I],c=s[I]+Q.from;if(ti(F,B,c,c+d.length)){if(d instanceof gF){if(A&fg.ExcludeBuffers)continue;let i=d.findChild(0,d.buffer.length,g,B-c,F);if(i>-1)return new ZQ(new Dl(Q,d,I,c),null,i)}else if(A&fg.IncludeAnonymous||!d.type.isAnonymous||fl(d)){let i;if(!(A&fg.IgnoreMounts)&&(i=nA.get(d))&&!i.overlay)return new C(i.tree,c,I,Q);let G=new C(d,c,I,Q);return A&fg.IncludeAnonymous||!G.type.isAnonymous?G:G.nextChild(g<0?d.children.length-1:0,g,B,F)}}}if(A&fg.IncludeAnonymous||!Q.type.isAnonymous||(Q.index>=0?I=Q.index+g:I=g<0?-1:Q._parent._tree.children.length,Q=Q._parent,!Q))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(I){return this.nextChild(0,1,I,2)}childBefore(I){return this.nextChild(this._tree.children.length-1,-1,I,-2)}enter(I,g,B=0){let F;if(!(B&fg.IgnoreOverlays)&&(F=nA.get(this._tree))&&F.overlay){let A=I-this.from;for(let{from:Q,to:U}of F.overlay)if((g>0?Q<=A:Q=A:U>A))return new C(F.tree,F.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,I,g,B)}nextSignificantParent(){let I=this;for(;I.type.isAnonymous&&I._parent;)I=I._parent;return I}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function si(C,I,g,B){let F=C.cursor(),A=[];if(!F.firstChild())return A;if(g!=null){for(let Q=!1;!Q;)if(Q=F.type.is(g),!F.nextSibling())return A}for(;;){if(B!=null&&F.type.is(B))return A;if(F.type.is(I)&&A.push(F.node),!F.nextSibling())return B==null?A:[]}}function kl(C,I,g=I.length-1){for(let B=C;g>=0;B=B.parent){if(!B)return!1;if(!B.type.isAnonymous){if(I[g]&&I[g]!=B.name)return!1;g--}}return!0}var Dl=class{constructor(I,g,B,F){this.parent=I,this.buffer=g,this.index=B,this.start=F}},ZQ=class C extends TU{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(I,g,B){super(),this.context=I,this._parent=g,this.index=B,this.type=I.buffer.set.types[I.buffer.buffer[B]]}child(I,g,B){let{buffer:F}=this.context,A=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.context.start,B);return A<0?null:new C(this.context,this,A)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(I){return this.child(1,I,2)}childBefore(I){return this.child(-1,I,-2)}enter(I,g,B=0){if(B&fg.ExcludeBuffers)return null;let{buffer:F}=this.context,A=F.findChild(this.index+4,F.buffer[this.index+3],g>0?1:-1,I-this.context.start,g);return A<0?null:new C(this.context,this,A)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(I){return this._parent?null:this.context.parent.nextChild(this.context.index+I,I,0,4)}get nextSibling(){let{buffer:I}=this.context,g=I.buffer[this.index+3];return g<(this._parent?I.buffer[this._parent.index+3]:I.buffer.length)?new C(this.context,this._parent,g):this.externalSibling(1)}get prevSibling(){let{buffer:I}=this.context,g=this._parent?this._parent.index+4:0;return this.index==g?this.externalSibling(-1):new C(this.context,this._parent,I.findChild(g,this.index,-1,0,4))}get tree(){return null}toTree(){let I=[],g=[],{buffer:B}=this.context,F=this.index+4,A=B.buffer[this.index+3];if(A>F){let Q=B.buffer[this.index+1];I.push(B.slice(F,A,Q)),g.push(0)}return new nC(this.type,I,g,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function ci(C){if(!C.length)return null;let I=0,g=C[0];for(let A=1;Ag.from||Q.to=I){let U=new VB(Q.tree,Q.overlay[0].from+A.from,-1,A);(F||(F=[B])).push(eQ(U,I,g,!1))}}return F?ci(F):B}var VQ=class{get name(){return this.type.name}constructor(I,g=0){if(this.mode=g,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,I instanceof VB)this.yieldNode(I);else{this._tree=I.context.parent,this.buffer=I.context;for(let B=I._parent;B;B=B._parent)this.stack.unshift(B.index);this.bufferNode=I,this.yieldBuf(I.index)}}yieldNode(I){return I?(this._tree=I,this.type=I.type,this.from=I.from,this.to=I.to,!0):!1}yieldBuf(I,g){this.index=I;let{start:B,buffer:F}=this.buffer;return this.type=g||F.set.types[F.buffer[I]],this.from=B+F.buffer[I+1],this.to=B+F.buffer[I+2],!0}yield(I){return I?I instanceof VB?(this.buffer=null,this.yieldNode(I)):(this.buffer=I.context,this.yieldBuf(I.index,I.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(I,g,B){if(!this.buffer)return this.yield(this._tree.nextChild(I<0?this._tree._tree.children.length-1:0,I,g,B,this.mode));let{buffer:F}=this.buffer,A=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.buffer.start,B);return A<0?!1:(this.stack.push(this.index),this.yieldBuf(A))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(I){return this.enterChild(1,I,2)}childBefore(I){return this.enterChild(-1,I,-2)}enter(I,g,B=this.mode){return this.buffer?B&fg.ExcludeBuffers?!1:this.enterChild(1,I,g):this.yield(this._tree.enter(I,g,B))}parent(){if(!this.buffer)return this.yieldNode(this.mode&fg.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let I=this.mode&fg.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(I)}sibling(I){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+I,I,0,4,this.mode)):!1;let{buffer:g}=this.buffer,B=this.stack.length-1;if(I<0){let F=B<0?0:this.stack[B]+4;if(this.index!=F)return this.yieldBuf(g.findChild(F,this.index,-1,0,4))}else{let F=g.buffer[this.index+3];if(F<(B<0?g.buffer.length:g.buffer[this.stack[B]+3]))return this.yieldBuf(F)}return B<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+I,I,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(I){let g,B,{buffer:F}=this;if(F){if(I>0){if(this.index-1)for(let A=g+I,Q=I<0?-1:B._tree.children.length;A!=Q;A+=I){let U=B._tree.children[A];if(this.mode&fg.IncludeAnonymous||U instanceof gF||!U.type.isAnonymous||fl(U))return!1}return!0}move(I,g){if(g&&this.enterChild(I,0,4))return!0;for(;;){if(this.sibling(I))return!0;if(this.atLastNode(I)||!this.parent())return!1}}next(I=!0){return this.move(1,I)}prev(I=!0){return this.move(-1,I)}moveTo(I,g=0){for(;(this.from==this.to||(g<1?this.from>=I:this.from>I)||(g>-1?this.to<=I:this.to=0;){for(let Q=I;Q;Q=Q._parent)if(Q.index==F){if(F==this.index)return Q;g=Q,B=A+1;break I}F=this.stack[--A]}for(let F=B;F=0;A--){if(A<0)return kl(this._tree,I,F);let Q=B[g.buffer[this.stack[A]]];if(!Q.isAnonymous){if(I[F]&&I[F]!=Q.name)return!1;F--}}return!0}};function fl(C){return C.children.some(I=>I instanceof gF||!I.type.isAnonymous||fl(I))}function $b(C){var I;let{buffer:g,nodeSet:B,maxBufferLength:F=1024,reused:A=[],minRepeatType:Q=B.types.length}=C,U=Array.isArray(g)?new vl(g,g.length):g,s=B.types,l=0,d=0;function c(m,a,L,y,E,Y){let{id:N,start:r,end:j,size:_}=U,D=d,UI=l;for(;_<0;)if(U.next(),_==-1){let LI=A[N];L.push(LI),y.push(r-m);return}else if(_==-3){l=N;return}else if(_==-4){d=N;return}else throw new RangeError(`Unrecognized record size: ${_}`);let rI=s[N],RI,eI,xI=r-m;if(j-r<=F&&(eI=V(U.pos-a,E))){let LI=new Uint16Array(eI.size-eI.skip),$=U.pos-eI.size,AI=LI.length;for(;U.pos>$;)AI=u(eI.start,LI,AI);RI=new gF(LI,j-eI.start,B),xI=eI.start-m}else{let LI=U.pos-_;U.next();let $=[],AI=[],kI=N>=Q?N:-1,pI=0,hI=j;for(;U.pos>LI;)kI>=0&&U.id==kI&&U.size>=0?(U.end<=hI-F&&(b($,AI,r,pI,U.end,hI,kI,D,UI),pI=$.length,hI=U.end),U.next()):Y>2500?i(r,LI,$,AI):c(r,LI,$,AI,kI,Y+1);if(kI>=0&&pI>0&&pI<$.length&&b($,AI,r,pI,r,hI,kI,D,UI),$.reverse(),AI.reverse(),kI>-1&&pI>0){let YI=G(rI,UI);RI=zl(rI,$,AI,0,$.length,0,j-r,YI,YI)}else RI=e(rI,$,AI,j-r,D-j,UI)}L.push(RI),y.push(xI)}function i(m,a,L,y){let E=[],Y=0,N=-1;for(;U.pos>a;){let{id:r,start:j,end:_,size:D}=U;if(D>4)U.next();else{if(N>-1&&j=0;_-=3)r[D++]=E[_],r[D++]=E[_+1]-j,r[D++]=E[_+2]-j,r[D++]=D;L.push(new gF(r,E[2]-j,B)),y.push(j-m)}}function G(m,a){return(L,y,E)=>{let Y=0,N=L.length-1,r,j;if(N>=0&&(r=L[N])instanceof nC){if(!N&&r.type==m&&r.length==E)return r;(j=r.prop(Qg.lookAhead))&&(Y=y[N]+r.length+j)}return e(m,L,y,E,Y,a)}}function b(m,a,L,y,E,Y,N,r,j){let _=[],D=[];for(;m.length>y;)_.push(m.pop()),D.push(a.pop()+L-E);m.push(e(B.types[N],_,D,Y-E,r-Y,j)),a.push(E-L)}function e(m,a,L,y,E,Y,N){if(Y){let r=[Qg.contextHash,Y];N=N?[r].concat(N):[r]}if(E>25){let r=[Qg.lookAhead,E];N=N?[r].concat(N):[r]}return new nC(m,a,L,y,N)}function V(m,a){let L=U.fork(),y=0,E=0,Y=0,N=L.end-F,r={size:0,start:0,skip:0};I:for(let j=L.pos-m;L.pos>j;){let _=L.size;if(L.id==a&&_>=0){r.size=y,r.start=E,r.skip=Y,Y+=4,y+=4,L.next();continue}let D=L.pos-_;if(_<0||D=Q?4:0,rI=L.start;for(L.next();L.pos>D;){if(L.size<0)if(L.size==-3)UI+=4;else break I;else L.id>=Q&&(UI+=4);L.next()}E=rI,y+=_,Y+=UI}return(a<0||y==m)&&(r.size=y,r.start=E,r.skip=Y),r.size>4?r:void 0}function u(m,a,L){let{id:y,start:E,end:Y,size:N}=U;if(U.next(),N>=0&&y4){let j=U.pos-(N-4);for(;U.pos>j;)L=u(m,a,L)}a[--L]=r,a[--L]=Y-m,a[--L]=E-m,a[--L]=y}else N==-3?l=y:N==-4&&(d=y);return L}let n=[],R=[];for(;U.pos>0;)c(C.start||0,C.bufferStart||0,n,R,-1,0);let h=(I=C.length)!==null&&I!==void 0?I:n.length?R[0]+n[0].length:0;return new nC(s[C.topID],n.reverse(),R.reverse(),h)}var li=new WeakMap;function kU(C,I){if(!C.isAnonymous||I instanceof gF||I.type!=C)return 1;let g=li.get(I);if(g==null){g=1;for(let B of I.children){if(B.type!=C||!(B instanceof nC)){g=1;break}g+=kU(C,B)}li.set(I,g)}return g}function zl(C,I,g,B,F,A,Q,U,s){let l=0;for(let b=B;b=d)break;a+=L}if(R==h+1){if(a>d){let L=b[h];G(L.children,L.positions,0,L.children.length,e[h]+n);continue}c.push(b[h])}else{let L=e[R-1]+b[R-1].length-m;c.push(zl(C,b,e,h,R,m,L,null,s))}i.push(m+n-A)}}return G(I,g,B,F,0),(U||s)(c,i,Q)}var wU=class{startParse(I,g,B){return typeof I=="string"&&(I=new wl(I)),B=B?B.length?B.map(F=>new bQ(F.from,F.to)):[new bQ(0,0)]:[new bQ(0,I.length)],this.createParse(I,g||[],B)}parse(I,g,B){let F=this.startParse(I,g,B);for(;;){let A=F.advance();if(A)return A}}},wl=class{constructor(I){this.string=I}get length(){return this.string.length}chunk(I){return this.string.slice(I)}get lineChunks(){return!1}read(I,g){return this.string.slice(I,g)}};var Tx=new Qg({perNode:!0});var Kl=class C{constructor(I,g,B,F,A,Q,U,s,l,d=0,c){this.p=I,this.stack=g,this.state=B,this.reducePos=F,this.pos=A,this.score=Q,this.buffer=U,this.bufferBase=s,this.curContext=l,this.lookAhead=d,this.parent=c}toString(){return`[${this.stack.filter((I,g)=>g%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(I,g,B=0){let F=I.parser.context;return new C(I,[],g,B,B,0,[],0,F?new fU(F,F.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(I,g){this.stack.push(this.state,g,this.bufferBase+this.buffer.length),this.state=I}reduce(I){var g;let B=I>>19,F=I&65535,{parser:A}=this.p,Q=A.dynamicPrecedence(F);if(Q&&(this.score+=Q),B==0){this.pushState(A.getGoto(this.state,F,!0),this.reducePos),F=2e3&&!(!((g=this.p.parser.nodeSet.types[F])===null||g===void 0)&&g.isAnonymous)&&(s==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=l):this.p.lastBigReductionSizeU;)this.stack.pop();this.reduceContext(F,s)}storeNode(I,g,B,F=4,A=!1){if(I==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&Q.buffer[U-4]==0&&Q.buffer[U-1]>-1){if(g==B)return;if(Q.buffer[U-2]>=g){Q.buffer[U-2]=B;return}}}if(!A||this.pos==B)this.buffer.push(I,g,B,F);else{let Q=this.buffer.length;if(Q>0&&this.buffer[Q-4]!=0)for(;Q>0&&this.buffer[Q-2]>B;)this.buffer[Q]=this.buffer[Q-4],this.buffer[Q+1]=this.buffer[Q-3],this.buffer[Q+2]=this.buffer[Q-2],this.buffer[Q+3]=this.buffer[Q-1],Q-=4,F>4&&(F-=4);this.buffer[Q]=I,this.buffer[Q+1]=g,this.buffer[Q+2]=B,this.buffer[Q+3]=F}}shift(I,g,B,F){if(I&131072)this.pushState(I&65535,this.pos);else if((I&262144)==0){let A=I,{parser:Q}=this.p;(F>this.pos||g<=Q.maxNode)&&(this.pos=F,Q.stateFlag(A,1)||(this.reducePos=F)),this.pushState(A,B),this.shiftContext(g,B),g<=Q.maxNode&&this.buffer.push(g,B,F,4)}else this.pos=F,this.shiftContext(g,B),g<=this.p.parser.maxNode&&this.buffer.push(g,B,F,4)}apply(I,g,B,F){I&65536?this.reduce(I):this.shift(I,g,B,F)}useNode(I,g){let B=this.p.reused.length-1;(B<0||this.p.reused[B]!=I)&&(this.p.reused.push(I),B++);let F=this.pos;this.reducePos=this.pos=F+I.length,this.pushState(g,F),this.buffer.push(B,F,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,I,this,this.p.stream.reset(this.pos-I.length)))}split(){let I=this,g=I.buffer.length;for(;g>0&&I.buffer[g-2]>I.reducePos;)g-=4;let B=I.buffer.slice(g),F=I.bufferBase+g;for(;I&&F==I.bufferBase;)I=I.parent;return new C(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,B,F,this.curContext,this.lookAhead,I)}recoverByDelete(I,g){let B=I<=this.p.parser.maxNode;B&&this.storeNode(I,this.pos,g,4),this.storeNode(0,this.pos,g,B?8:4),this.pos=this.reducePos=g,this.score-=190}canShift(I){for(let g=new Pl(this);;){let B=this.p.parser.stateSlot(g.state,4)||this.p.parser.hasAction(g.state,I);if(B==0)return!1;if((B&65536)==0)return!0;g.reduce(B)}}recoverByInsert(I){if(this.stack.length>=300)return[];let g=this.p.parser.nextStates(this.state);if(g.length>8||this.stack.length>=120){let F=[];for(let A=0,Q;As&1&&U==Q)||F.push(g[A],Q)}g=F}let B=[];for(let F=0;F>19,F=g&65535,A=this.stack.length-B*3;if(A<0||I.getGoto(this.stack[A],F,!1)<0){let Q=this.findForcedReduction();if(Q==null)return!1;g=Q}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(g),!0}findForcedReduction(){let{parser:I}=this.p,g=[],B=(F,A)=>{if(!g.includes(F))return g.push(F),I.allActions(F,Q=>{if(!(Q&393216))if(Q&65536){let U=(Q>>19)-A;if(U>1){let s=Q&65535,l=this.stack.length-U*3;if(l>=0&&I.getGoto(this.stack[l],s,!1)>=0)return U<<19|65536|s}}else{let U=B(Q,A+1);if(U!=null)return U}})};return B(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:I}=this.p;return I.data[I.stateSlot(this.state,1)]==65535&&!I.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(I){if(this.state!=I.state||this.stack.length!=I.stack.length)return!1;for(let g=0;gthis.lookAhead&&(this.emitLookAhead(),this.lookAhead=I)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}},fU=class{constructor(I,g){this.tracker=I,this.context=g,this.hash=I.strict?I.hash(g):0}},Pl=class{constructor(I){this.start=I,this.state=I.state,this.stack=I.stack,this.base=this.stack.length}reduce(I){let g=I&65535,B=I>>19;B==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(B-1)*3;let F=this.start.p.parser.getGoto(this.stack[this.base-3],g,!0);this.state=F}},jl=class C{constructor(I,g,B){this.stack=I,this.pos=g,this.index=B,this.buffer=I.buffer,this.index==0&&this.maybeNext()}static create(I,g=I.bufferBase+I.buffer.length){return new C(I,g,g-I.bufferBase)}maybeNext(){let I=this.stack.parent;I!=null&&(this.index=this.stack.bufferBase-I.bufferBase,this.stack=I,this.buffer=I.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new C(this.stack,this.pos,this.index)}};function uQ(C,I=Uint16Array){if(typeof C!="string")return C;let g=null;for(let B=0,F=0;B=92&&Q--,Q>=34&&Q--;let s=Q-32;if(s>=46&&(s-=46,U=!0),A+=s,U)break;A*=46}g?g[F++]=A:g=new I(A)}return g}var RA=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},ii=new RA,Ol=class{constructor(I,g){this.input=I,this.ranges=g,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=ii,this.rangeIndex=0,this.pos=this.chunkPos=g[0].from,this.range=g[0],this.end=g[g.length-1].to,this.readNext()}resolveOffset(I,g){let B=this.range,F=this.rangeIndex,A=this.pos+I;for(;AB.to:A>=B.to;){if(F==this.ranges.length-1)return null;let Q=this.ranges[++F];A+=Q.from-B.to,B=Q}return A}clipPos(I){if(I>=this.range.from&&II)return Math.max(I,g.from);return this.end}peek(I){let g=this.chunkOff+I,B,F;if(g>=0&&g=this.chunk2Pos&&BU.to&&(this.chunk2=this.chunk2.slice(0,U.to-B)),F=this.chunk2.charCodeAt(0)}}return B>=this.token.lookAhead&&(this.token.lookAhead=B+1),F}acceptToken(I,g=0){let B=g?this.resolveOffset(g,-1):this.pos;if(B==null||B=this.chunk2Pos&&this.posthis.range.to?I.slice(0,this.range.to-this.pos):I,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(I=1){for(this.chunkOff+=I;this.pos+I>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();I-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=I,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(I,g){if(g?(this.token=g,g.start=I,g.lookAhead=I+1,g.value=g.extended=-1):this.token=ii,this.pos!=I){if(this.pos=I,I==this.end)return this.setDone(),this;for(;I=this.range.to;)this.range=this.ranges[++this.rangeIndex];I>=this.chunkPos&&I=this.chunkPos&&g<=this.chunkPos+this.chunk.length)return this.chunk.slice(I-this.chunkPos,g-this.chunkPos);if(I>=this.chunk2Pos&&g<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(I-this.chunk2Pos,g-this.chunk2Pos);if(I>=this.range.from&&g<=this.range.to)return this.input.read(I,g);let B="";for(let F of this.ranges){if(F.from>=g)break;F.to>I&&(B+=this.input.read(Math.max(F.from,I),Math.min(F.to,g)))}return B}},CF=class{constructor(I,g){this.data=I,this.id=g}token(I,g){let{parser:B}=g.p;Zi(this.data,I,g,this.id,B.data,B.tokenPrecTable)}};CF.prototype.contextual=CF.prototype.fallback=CF.prototype.extend=!1;var pB=class{constructor(I,g,B){this.precTable=g,this.elseToken=B,this.data=typeof I=="string"?uQ(I):I}token(I,g){let B=I.pos,F=0;for(;;){let A=I.next<0,Q=I.resolveOffset(1,1);if(Zi(this.data,I,g,0,this.data,this.precTable),I.token.value>-1)break;if(this.elseToken==null)return;if(A||F++,Q==null)break;I.reset(Q,I.token)}F&&(I.reset(B,I.token),I.acceptToken(this.elseToken,F))}};pB.prototype.contextual=CF.prototype.fallback=CF.prototype.extend=!1;function Zi(C,I,g,B,F,A){let Q=0,U=1<0){let b=C[G];if(s.allows(b)&&(I.token.value==-1||I.token.value==b||g0(b,I.token.value,F,A))){I.acceptToken(b);break}}let d=I.next,c=0,i=C[Q+2];if(I.next<0&&i>c&&C[l+i*3-3]==65535){Q=C[l+i*3-1];continue I}for(;c>1,b=l+G+(G<<1),e=C[b],V=C[b+1]||65536;if(d=V)c=G+1;else{Q=C[b+2],I.advance();continue I}}break}}function Gi(C,I,g){for(let B=I,F;(F=C[B])!=65535;B++)if(F==g)return B-I;return-1}function g0(C,I,g,B){let F=Gi(g,B,I);return F<0||Gi(g,B,C)I)&&!B.type.isError)return g<0?Math.max(0,Math.min(B.to-1,I-25)):Math.min(C.length,Math.max(B.from+1,I+25));if(g<0?B.prevSibling():B.nextSibling())break;if(!B.parent())return g<0?0:C.length}}var _l=class{constructor(I,g){this.fragments=I,this.nodeSet=g,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let I=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(I){for(this.safeFrom=I.openStart?di(I.tree,I.from+I.offset,1)-I.offset:I.from,this.safeTo=I.openEnd?di(I.tree,I.to+I.offset,-1)-I.offset:I.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(I.tree),this.start.push(-I.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(I){if(II)return this.nextStart=Q,null;if(A instanceof nC){if(Q==I){if(Q=Math.max(this.safeFrom,I)&&(this.trees.push(A),this.start.push(Q),this.index.push(0))}else this.index[g]++,this.nextStart=Q+A.length}}},ql=class{constructor(I,g){this.stream=g,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=I.tokenizers.map(B=>new RA)}getActions(I){let g=0,B=null,{parser:F}=I.p,{tokenizers:A}=F,Q=F.stateSlot(I.state,3),U=I.curContext?I.curContext.hash:0,s=0;for(let l=0;lc.end+25&&(s=Math.max(c.lookAhead,s)),c.value!=0)){let i=g;if(c.extended>-1&&(g=this.addActions(I,c.extended,c.end,g)),g=this.addActions(I,c.value,c.end,g),!d.extend&&(B=c,g>i))break}}for(;this.actions.length>g;)this.actions.pop();return s&&I.setLookAhead(s),!B&&I.pos==this.stream.end&&(B=new RA,B.value=I.p.parser.eofTerm,B.start=B.end=I.pos,g=this.addActions(I,B.value,B.end,g)),this.mainToken=B,this.actions}getMainToken(I){if(this.mainToken)return this.mainToken;let g=new RA,{pos:B,p:F}=I;return g.start=B,g.end=Math.min(B+1,F.stream.end),g.value=B==F.stream.end?F.parser.eofTerm:0,g}updateCachedToken(I,g,B){let F=this.stream.clipPos(B.pos);if(g.token(this.stream.reset(F,I),B),I.value>-1){let{parser:A}=B.p;for(let Q=0;Q=0&&B.p.parser.dialect.allows(U>>1)){(U&1)==0?I.value=U>>1:I.extended=U>>1;break}}}else I.value=0,I.end=this.stream.clipPos(F+1)}putAction(I,g,B,F){for(let A=0;AI.bufferLength*4?new _l(B,I.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let I=this.stacks,g=this.minStackPos,B=this.stacks=[],F,A;if(this.bigReductionCount>300&&I.length==1){let[Q]=I;for(;Q.forceReduce()&&Q.stack.length&&Q.stack[Q.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let Q=0;Qg)B.push(U);else{if(this.advanceStack(U,B,I))continue;{F||(F=[],A=[]),F.push(U);let s=this.tokens.getMainToken(U);A.push(s.value,s.end)}}break}}if(!B.length){let Q=F&&C0(F);if(Q)return this.stackToTree(Q);if(this.parser.strict)throw new SyntaxError("No parse at "+g);this.recovering||(this.recovering=5)}if(this.recovering&&F){let Q=this.stoppedAt!=null&&F[0].pos>this.stoppedAt?F[0]:this.runRecovery(F,A,B);if(Q)return this.stackToTree(Q.forceAll())}if(this.recovering){let Q=this.recovering==1?1:this.recovering*3;if(B.length>Q)for(B.sort((U,s)=>s.score-U.score);B.length>Q;)B.pop();B.some(U=>U.reducePos>g)&&this.recovering--}else if(B.length>1){I:for(let Q=0;Q500&&l.buffer.length>500)if((U.score-l.score||U.buffer.length-l.buffer.length)>0)B.splice(s--,1);else{B.splice(Q--,1);continue I}}}B.length>12&&B.splice(12,B.length-12)}this.minStackPos=B[0].pos;for(let Q=1;Q ":"";if(this.stoppedAt!=null&&F>this.stoppedAt)return I.forceReduce()?I:null;if(this.fragments){let l=I.curContext&&I.curContext.tracker.strict,d=l?I.curContext.hash:0;for(let c=this.fragments.nodeAt(F);c;){let i=this.parser.nodeSet.types[c.type.id]==c.type?A.getGoto(I.state,c.type.id):-1;if(i>-1&&c.length&&(!l||(c.prop(Qg.contextHash)||0)==d))return I.useNode(c,i),!0;if(!(c instanceof nC)||c.children.length==0||c.positions[0]>0)break;let G=c.children[0];if(G instanceof nC&&c.positions[0]==0)c=G;else break}}let U=A.stateSlot(I.state,4);if(U>0)return I.reduce(U),!0;if(I.stack.length>=8400)for(;I.stack.length>6e3&&I.forceReduce(););let s=this.tokens.getActions(I);for(let l=0;lF?g.push(b):B.push(b)}return!1}advanceFully(I,g){let B=I.pos;for(;;){if(!this.advanceStack(I,null,null))return!1;if(I.pos>B)return bi(I,g),!0}}runRecovery(I,g,B){let F=null,A=!1;for(let Q=0;Q ":"";if(U.deadEnd&&(A||(A=!0,U.restart(),this.advanceFully(U,B))))continue;let c=U.split(),i=d;for(let G=0;c.forceReduce()&&G<10&&!this.advanceFully(c,B);G++)NC&&(i=this.stackID(c)+" -> ");for(let G of U.recoverByInsert(s))this.advanceFully(G,B);this.stream.end>U.pos?(l==U.pos&&(l++,s=0),U.recoverByDelete(s,l),bi(U,B)):(!F||F.scoreI.topRules[U][1]),F=[];for(let U=0;U=0)A(d,s,U[l++]);else{let c=U[l+-d];for(let i=-d;i>0;i--)A(U[l++],s,c);l++}}}this.nodeSet=new DU(g.map((U,s)=>PC.define({name:s>=this.minRepeatTerm?void 0:U,id:s,props:F[s],top:B.indexOf(s)>-1,error:s==0,skipped:I.skippedNodes&&I.skippedNodes.indexOf(s)>-1}))),I.propSources&&(this.nodeSet=this.nodeSet.extend(...I.propSources)),this.strict=!1,this.bufferLength=1024;let Q=uQ(I.tokenData);this.context=I.context,this.specializerSpecs=I.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let U=0;Utypeof U=="number"?new CF(Q,U):U),this.topRules=I.topRules,this.dialects=I.dialects||{},this.dynamicPrecedences=I.dynamicPrecedences||null,this.tokenPrecTable=I.tokenPrec,this.termNames=I.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(I,g,B){let F=new $l(this,I,g,B);for(let A of this.wrappers)F=A(F,I,g,B);return F}getGoto(I,g,B=!1){let F=this.goto;if(g>=F[0])return-1;for(let A=F[g+1];;){let Q=F[A++],U=Q&1,s=F[A++];if(U&&B)return s;for(let l=A+(Q>>1);A0}validAction(I,g){return!!this.allActions(I,B=>B==g?!0:null)}allActions(I,g){let B=this.stateSlot(I,4),F=B?g(B):void 0;for(let A=this.stateSlot(I,1);F==null;A+=3){if(this.data[A]==65535)if(this.data[A+1]==1)A=NB(this.data,A+2);else break;F=g(NB(this.data,A+1))}return F}nextStates(I){let g=[];for(let B=this.stateSlot(I,1);;B+=3){if(this.data[B]==65535)if(this.data[B+1]==1)B=NB(this.data,B+2);else break;if((this.data[B+2]&1)==0){let F=this.data[B+1];g.some((A,Q)=>Q&1&&A==F)||g.push(this.data[B],F)}}return g}configure(I){let g=Object.assign(Object.create(C.prototype),this);if(I.props&&(g.nodeSet=this.nodeSet.extend(...I.props)),I.top){let B=this.topRules[I.top];if(!B)throw new RangeError(`Invalid top rule name ${I.top}`);g.top=B}return I.tokenizers&&(g.tokenizers=this.tokenizers.map(B=>{let F=I.tokenizers.find(A=>A.from==B);return F?F.to:B})),I.specializers&&(g.specializers=this.specializers.slice(),g.specializerSpecs=this.specializerSpecs.map((B,F)=>{let A=I.specializers.find(U=>U.from==B.external);if(!A)return B;let Q=Object.assign(Object.assign({},B),{external:A.to});return g.specializers[F]=ei(Q),Q})),I.contextTracker&&(g.context=I.contextTracker),I.dialect&&(g.dialect=this.parseDialect(I.dialect)),I.strict!=null&&(g.strict=I.strict),I.wrap&&(g.wrappers=g.wrappers.concat(I.wrap)),I.bufferLength!=null&&(g.bufferLength=I.bufferLength),g}hasWrappers(){return this.wrappers.length>0}getName(I){return this.termNames?this.termNames[I]:String(I<=this.maxNode&&this.nodeSet.types[I].name||I)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(I){let g=this.dynamicPrecedences;return g==null?0:g[I]||0}parseDialect(I){let g=Object.keys(this.dialects),B=g.map(()=>!1);if(I)for(let A of I.split(" ")){let Q=g.indexOf(A);Q>=0&&(B[Q]=!0)}let F=null;for(let A=0;AB)&&g.p.parser.stateFlag(g.state,2)&&(!I||I.scoreC.external(g,B)<<1|I}return C.get}var B0=zU.deserialize({version:14,states:")`QQOPOOOfOQO'#C^OqOSO'#C`O|OWO'#CbO!XO`O'#CeO!dOpO'#CgOOOO'#Ck'#CkOOOO'#Ci'#CiQQOPOOOOOO,58x,58xO!oOQO,58xO!wOQO,58xOOOO,58z,58zO#POSO,58zO#XOSO,58zO#aOWO,58|O#iOWO,58|O#qOWO,58|OOOO,59P,59PO#yO`O,59PO$RO`O,59POOOO,59R,59RO$ZOpO,59RO$cOpO,59ROOOO-E6g-E6gOOOO1G.d1G.dO$kOQO1G.dO$nOQO1G.dOOOO1G.f1G.fO$sOSO1G.fO$vOSO1G.fOOOO1G.h1G.hO${OWO1G.hO%QOWO1G.hO%YOWO1G.hO%bOWO1G.hOOOO1G.k1G.kO%gO`O1G.kO%jO`O1G.kOOOO1G.m1G.mO%oOpO1G.mO%rOpO1G.mOOOO7+$O7+$OO%wOQO7+$OOOOO7+$Q7+$QO%|OSO7+$QOOOO7+$S7+$SO&ROWO7+$SO&WOWO7+$SO&`OWO7+$SOOOO7+$V7+$VO&eO`O7+$VOOOO7+$X7+$XO&jOpO7+$XOOOO<b.is(aA)))return this.create(I.state);if(!I.docChanged)return C.inserted_ranges=[],C.deleted_ranges=[],C;let g=[];I.changes.iterChangedRanges((b,e,V,u)=>g.push({fromA:b,toA:e,fromB:V,toB:u}));let B=VA.applyChanges(C.fragments,g),F=I.state.doc.toString(),A=MU.parser.parse(new ui.DocInput(I.state.doc),B);B=VA.addTree(A,B);let Q=new Map,U=[],s=new Map,l=new Set;for(let b of g){C.ranges.tree.search([b.fromA,b.toA],(e,V)=>{C.ranges.tree.remove(V,e),l.add(e);for(let u of e.base_range.thread)s.set(u.from,u);return!0});for(let e of Ct(A,F,b.fromB,b.toB))Q.set(e.from,e);U.push([b.toA,b.toB-b.fromB-(b.toA-b.fromA)])}for(let b of l)b.type==="comment"&&s.delete(b.from);let d=0,c=C.ranges.tree.nil_node;function i(b){if(b!=null&&b!=c){for(i(b.left);U.length&&b.item.key.low>=U[0][0];)d+=U.shift()[1];b.item.value.apply_offset(d),b.item.key.low=b.item.value.from,b.item.key.high=b.item.value.to,i(b.right),b.left!=c&&(b.max.low=b.left.max.low),b.right!=c&&(b.max.high=b.right.max.high)}}i(C.ranges.tree.root);let G=Array.from(Q.values());for(let b of G)C.ranges.tree.insert([b.from,b.to],b);for(let b of G)b.type==="comment"&&s.set(b.from,b);if(s.size){let b=[],e,V=[];for(let u of Array.from(s.values()).sort((n,R)=>n.from-R.from))u.clear_references(),u.replies.length=0,!e||e?.right_adjacent(u)?V.push(u):(b.push(V),V=[u]),e=u;b.push(V);for(let u of b){let n=u[0],R=C.ranges.tree.search([n.from,n.from])[0];R.replies.length=0;for(let h of u.slice(R===n?1:0))h.add_reply(R)}}return C.ranges.ranges=C.ranges.tree.values,{tree:A,ranges:C.ranges,fragments:B,inserted_ranges:G,deleted_ranges:[...l]}}});function F0(C,I){let g=Fg.PLUGIN_SETTINGS.enable_metadata&&C.firstChild?.type.name.startsWith("MDSep")?C.firstChild.from:void 0,B;if(C.type.name==="Substitution"){let F=g?C.firstChild?.nextSibling:C.firstChild;if(!F||F.type.name!=="MSub")return;B=F.from}return A0(C.from,C.to,C.type.name,I.slice(C.from,C.to),B,g)}function Ct(C,I,g=0,B=I.length){let F=[],A,Q=C.cursor();if(Q.childAfter(g-1),Q.node.type.name==="CriticMarkup"||Q.node.from>B)return F;if(Q)do{let U=Q.node;if(U.type.name==="\u26A0")continue;let s=F0(U,I);s&&(s.type==="comment"&&A&&A.right_adjacent(s)&&s.add_reply(A),F.push(s),A=s)}while(Q.nextSibling()&&Q.node.from<=B);return F}function Bt(C){let I=C.field(HI).ranges;return I.ranges.length?C.selection.ranges.some(g=>I.contains_range(g.from,g.to)):!1}function xQ(C){let I=MU.parser.parse(C);return Ct(I,C)}function A0(C,I,g,B,F,A){switch(g){case"Addition":return new oF(C,I,B,A);case"Deletion":return new dA(C,I,B,A);case"Substitution":return new eB(C,F,I,B,A);case"Highlight":return new bA(C,I,B,A);case"Comment":return new GA(C,I,B,A);default:return new oF(C,I,B,A)}}var LQ={addition:oF,deletion:dA,highlight:bA,substitution:eB,comment:GA};var KU=require("@codemirror/state");function xi(C,I,g,B=!1,F=null){let A=C,Q=g.doc.lineAt(A),U=g.charCategorizer(A);F===KU.CharCategory.Space&&(F=null);let s=null;for(F;;){if(A==(I?Q.to:Q.from)){A==C&&Q.number!=(I?g.doc.lines:1)&&(A+=I?1:-1);break}let l=(0,KU.findClusterBreak)(Q.text,A-Q.from,I)+Q.from,d=Q.text.slice(Math.min(A,l)-Q.from,Math.max(A,l)-Q.from);if(s=U(d),F!=null&&s!=F)if(F==1&&B)B=!1;else break;(d!=" "||A!=C)&&(F=s),A=l}return[A,F]}function Ft(C,I,g=!1){let B=I.doc.lineAt(C),F=I.charCategorizer(C);return g&&(C-=1),F(B.text.slice(C-B.from,C-B.from+1))}var UL=require("@codemirror/state");function PU(C){return C.annotations.map(I=>I.value).filter(I=>typeof I=="string")}function EF(){let C;return Fg.PLUGIN_SETTINGS.add_metadata&&(C={},Fg.PLUGIN_SETTINGS.add_author_metadata&&(C.author=Fg.PLUGIN_SETTINGS.author||void 0),Fg.PLUGIN_SETTINGS.add_timestamp_metadata&&(C.time=Math.floor(Date.now()/1e3)),Object.keys(C).length===0&&(C=void 0)),C}var Q0={author:"split"};function jU(C,I,g=Q0){if(!I)return{compatible:!0,merged_metadata:C.fields};if(!C.fields)return{compatible:!1,merged_metadata:void 0};let B=Object.assign({},C.fields,I);for(let F of[...new Set(Object.keys(I).concat(Object.keys(C.fields)))])if(I[F]!==C.fields[F]){let A=g[F];if(A==="split"||A==="move_outside")return{compatible:!1,merged_metadata:void 0};A==="old"&&(B[F]=C.fields[F])}return{compatible:!0,merged_metadata:B}}function Li(C,I,g){if(I.clipboardData&&C.clipboard_remove_syntax){let B=g.state.selection.main,A=g.state.field(HI).ranges.unwrap_in_range(g.state.doc,B.from,B.to).output;I.clipboardData.setData("text/plain",A),I.preventDefault()}}var nQ=require("@codemirror/state");function s0(C){return C===nQ.CharCategory.Space||C===null}function l0(C,I){return C!==null&&C!==nQ.CharCategory.Space&&C!==I}function t0(C,I,g){if(g.cursor_inside(C))return g;{let B=g.cursor_before_range(C),F=I.ranges.indexOf(g)+(B?-1:1);for(;F>=0&&FF.type==="addition"||F.type==="deletion"||F.type==="substitution").map(F=>({from:F.from,to:F.to,insert:F.accept()}))}async function Ri(C,I,g){g.sort((A,Q)=>A.from-Q.from);let B=await C.vault.cachedRead(I),F=yl(B,(A,Q)=>A.accept(),g);await C.vault.modify(I,F)}function NF(C,I,g){let B=C.field(HI).ranges;return(I||g?B.ranges_in_range(I??0,g??1/0):B.ranges).filter(F=>F.type==="addition"||F.type==="deletion"||F.type==="substitution").map(F=>({from:F.from,to:F.to,insert:F.reject()}))}async function mi(C,I,g){g.sort((A,Q)=>A.from-Q.from);let B=await C.vault.cachedRead(I),F=yl(B,(A,Q)=>A.reject(),g);await C.vault.modify(I,F)}var Qt=require("@codemirror/state");function RQ(C,I,g,B=0,F=0){return HB(C,I,C&&I?"substitution":C?"addition":"deletion",g,B,F)}function HB(C,I,g,B,F=0,A=0){if(!g)return{insert:I+C,start_offset:F,end_offset:A};let Q=ng[g],U=B&&Object.keys(B).length?JSON.stringify(B)+"@@":"",s=Q[0]+U+(g==="substitution"?I+Q[1]+C+Q[2]:I+C+Q[1]),l=Q[0].length+U.length;return F+=l,A+=g==="substitution"?Q[1].length:0,{insert:s,start_offset:F,end_offset:A}}function hi(C,I=""){return RQ(C,I,EF()).insert}function _U(C,I,g=""){return HB(I,g,C,EF()).insert}function yi(C,I){return I==="regular"||I==="clear"?!0:!((C.type==="comment"||C.type==="highlight")&&C.type!==I)}function G0(C,I,g,B={}){return yi(C,I)?!g||!C.fields?!1:[...new Set(Object.keys(g).concat(Object.keys(C.fields)))].some(F=>g[F]!==C.fields[F]&&(B[F]==="move_outside"||F==="author"&&C.type==="comment")):!0}function d0(C,I){if(C!=="substitution"&&C===I)return C;if(C==="deletion"&&I==="addition")return"substitution";if(C==="substitution"&&I==="addition")return"substitution";if(C==="deletion"&&I==="substitution")return"substitution"}function At(C,I,g,B,F=!1,A=!1){if(!I||!g||!yi(I,g))return{};if(!A&&(F&&I.touches_left_bracket(C,!1,!0,!0)||!F&&I.touches_right_bracket(C,!1,!0)))return{};let{compatible:Q,merged_metadata:U}=jU(I,B);if(!Q)return{};let s,l;return F?(s=I.range_type(-1/0,C),l=g):(s=g,l=I.range_type(C,1/0)),g=d0(s,l),{type:g,merged_metadata:g?U:void 0}}function oi(C,I,g,B,F,A,Q){let U=C.ranges_in_range(g,B),s=C.at_cursor(g,!1),l=C.at_cursor(B,!0),d=["",""],c=!1,i=F,G=0,b=0;function e(u=!1){s?.type&&(s.touches_left_bracket(g,!1,!0,!0)?g=s.from:s.touches_right_bracket(g,!1,!0)?g=s.to:s.type==="substitution"&&(u||s.contains_separator(g,B))?(d[0]=HB("",s.unwrap_slice(0,g),"deletion",s.fields).insert,g=s.from):d[0]=s.split_range(g)[0])}function V(u=!1){if(l?.type)if(l.touches_right_bracket(B,!1,!0))B=l.to;else if(l.touches_left_bracket(B,!1,!0,!0))B=l.from;else if(l.type==="substitution"&&(u||l.contains_separator(g,B))){let n=l.unwrap_slice(B,1/0);d[1]=HB(n,"","addition",l.fields).insert,B=l.to,c=!0}else d[1]=l.split_range(B)[1]}if(A==="none")B=g,i="";else if(A==="regular")if(s!==void 0&&s===l){let u=g===B?"":s.unwrap_slice(g,B);if(u){if(g=s.cursor_move_inside(g,!0),B=s.cursor_move_inside(B,!1),s.type==="substitution"){let n=s.contains_part(g,B),R=s.unwrap_parts();if(n){let h=s.unwrap_slice(0,g);G+=h.length,b+=F.length-2;let m=s.unwrap_slice(B,s.middle);u=h+F+m,i=R[1]}else if(n===!1){u=R[0];let h=s.unwrap_slice(s.middle+2,g);G=u.length+h.length;let m=s.unwrap_slice(B,1/0);i=h+F+m}else{let[h,m]=s.unwrap_slice_parts_inverted(g,B);G=h.length,u=h,i=F+m}g=s.from,B=s.to,{insert:i,start_offset:G,end_offset:b}=RQ(i,u,s.fields,G,b)}}else{let n=s.cursor_move_inside(g,!0);g=n,B=n,i=F}}else if(g===B?"":C.unwrap_in_range(I,g,B,U).output)e(),V(),G+=d[0].length,c?i=d[0]+F+d[1]:(b=d[1].length,i=d[0]+d[1]+F);else{let n=s||l,R=n?n.cursor_move_inside(g,!0):g;g=R,B=R,i=F}else if(A==="clear"){e(),V();let u=g===B?"":C.unwrap_in_range(I,g,B,U).output;G+=d[0].length,b+=u.length,i=d[0]+u+d[1]}else if(s!==void 0&&s===l&&s.type==="substitution"){let u=s.contains_part(g,B),n=u?g:B,R=At(n,s,A,Q,u,!0);if(R.type){let h="",m=s.unwrap_parts();if(R.type==="addition"){h=m[0];let a=Math.clamp(n-s.middle-2,0,m[1].length);G=m[0].length+a,i=m[1].slice(0,a)+F+m[1].slice(a),{insert:i,start_offset:G,end_offset:b}=RQ(i,h,R.merged_metadata,G,b),g=s.from,B=s.to}else if(R.type==="deletion")b=B-g,B=g,i="";else if(u){let a=s.unwrap_slice(0,g),L=s.unwrap_slice(g,B);V(),G=a.length,b=L.length,{insert:i,start_offset:G,end_offset:b}=HB(F,a+L,R.type,R.merged_metadata,G,b),g=s.from}else if(u===!1)h=s.unwrap_slice(g,B),b=h.length,i=F+s.unwrap_slice(B,1/0),F.length||(b-=2),e(),{insert:i,start_offset:G,end_offset:b}=HB(i,h,R.type,R.merged_metadata,G,b),B=s.to;else{let a=Math.clamp(B-s.middle-2,0,m[1].length);h=m[0]+m[1].slice(0,a),G=g-s.range_start,b=a+(m[0].length-g+s.range_start),i=F+m[1].slice(a),i.length&&!F.length&&(b-=2),{insert:i,start_offset:G,end_offset:b}=RQ(i,h,R.merged_metadata,G,b),g=s.from,B=s.to}}else{let h=s.unwrap_slice(g,B);e(Bs.middle+2),{insert:i,start_offset:G,end_offset:b}=HB(F,h,A,Q,G,b+F.length+h.length)}}else{let u=g===B?"":C.unwrap_in_range(I,g,B,U).output;if(!u){if(A==="substitution")A="addition";else if(A==="deletion")return{from:g,to:g,insert:"",start:g,end:g}}b=u.length;let n=At(g,s,A,Q,!0),R=n.merged_metadata;if(i=F,n.type){if(s.type==="substitution"){let m=s.unwrap_parts();G=m[0].length,b+=m[1].length,u=m[0]+u,i=m[1]+F}else{let m=s.unwrap_slice(0,g);G=m.length,u=m+u}g=s.from,Q=R}else e();let h=At(B,l,A,Q,!1);if(R=h.merged_metadata,h.type){if(l.type==="substitution"){let m=l.unwrap_slice_parts_inverted(g,B);i=F+m[1],u+=m[0]}else i+=l.unwrap_slice(B,1/0);B=l.to,Q=R}else V();(n.type==="substitution"||h.type==="substitution")&&(A="substitution"),{insert:i,start_offset:G,end_offset:b}=HB(i,u,A,Q,G,b)}return G+=d[0].length,i=d[0]+i+d[1],{from:g,to:B,insert:i,start:g+G,end:g+G+b+F.length}}function mQ(C,I,g,B,F,A,Q,U=!1){let s=C.ranges_in_range(g,B),l=s.at(0),d=s.at(-1);l?.touches_left_bracket(g,!0,!0,!0)&&(g=l.from),d?.touches_right_bracket(B,!0,!0)&&(B=d.to);let c=g,i=[];if(!U){for(let b of s)if(G0(b,A,Q)){if(cB&&(B=c);let G=oi(C,I,c,B,F,A,Q);return G&&i.push(G),i}function Si(C,I,g){let B=C.cm.state.field(HI).ranges,F=C.cm.state.selection.ranges,A=[],Q=[];for(let U of F){let s=mQ(B,C.cm.state.doc,U.from,U.to,"",I,EF());Q.push(...s),A.push(Qt.EditorSelection.range(s[0].start,s[s.length-1].end))}C.cm.dispatch(C.cm.state.update({changes:Q,selection:Qt.EditorSelection.create(A)}))}var Zs=require("obsidian");var BF=XU(Xi(),1);BF.default.DIFF_DELETE=-1;BF.default.DIFF_INSERT=1;BF.default.DIFF_EQUAL=0;function b0(C,I){let g=new BF.default,B=g.diff_main(C,I);g.diff_cleanupSemantic(B);let F=0,A=[],Q=null;for(let[U,s]of B)U===BF.default.DIFF_EQUAL?(Q&&(A.push(Q),Q=null),F+=s.length):U===BF.default.DIFF_INSERT?Q?Q.insert?(A.push(Q),Q={from:F,to:F,insert:s}):Q.insert+=s:Q={from:F,to:F,insert:s}:U===BF.default.DIFF_DELETE&&(Q?(A.push(Q),Q={from:F,to:F+s.length,insert:""}):Q={from:F,to:F+s.length,insert:""},F+=s.length);return Q&&A.push(Q),A}function Wi(C,I){let g=b0(C,I),B="",F=0;for(let A of g)A.from>F&&(B+=C.slice(F,A.from)),A.insert&&(B+=hi(A.insert,C.slice(A.from,A.to))),F=A.to;return FhA.RangeSet.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{}};function Ut(C,I,g){for(;C.value&&C.from<=g;)C.from<=g&&I.push(C.value),C.next()}function Ei(C){return Array.isArray(C)?C:[C]}var oA=class{dom;height=-1;above=0;markers=[];constructor(I,g,B,F){this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(I,g,B,F)}update(I,g,B,F){this.height!=g&&(this.height=g,this.dom.style.height=g+"px"),this.above!=B&&(this.dom.style.marginTop=(this.above=B)?B+"px":""),qU(this.markers,F)||this.setMarkers(I,F)}setMarkers(I,g){let B="cm-gutterElement",F=this.dom.firstChild;for(let A=0,Q=0;;){let U=Q,s=Athis.i;){let g=I.elements.pop();I.dom.removeChild(g.dom),g.destroy()}}},FF=class{constructor(I,g){this.view=I;this.config=g;this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let B in g.domEventHandlers)this.dom.addEventListener(B,F=>{let A=F.target,Q;if(A!=this.dom&&this.dom.contains(A)){for(;A.parentNode!=this.dom;)A=A.parentNode;let s=A.getBoundingClientRect();Q=(s.top+s.bottom)/2}else Q=F.clientY;let U=I.lineBlockAtHeight(Q-I.documentTop);g.domEventHandlers[B](I,U,F)&&F.preventDefault()});this.markers=Ei(g.markers(I)),g.initialSpacer&&(this.spacer=new oA(I,0,0,[g.initialSpacer(I)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}dom;elements=[];markers;spacer=null;update(I){let g=this.markers;if(this.markers=Ei(this.config.markers(I.view)),this.spacer&&this.config.updateSpacer){let F=this.config.updateSpacer(this.spacer.markers[0],I);F!=this.spacer.markers[0]&&this.spacer.update(I.view,0,0,[F])}let B=I.view.viewport;return!hA.RangeSet.eq(this.markers,g,B.from,B.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(I):!1)}destroy(){for(let I of this.elements)I.destroy()}},yA=class{constructor(I,g,B){this.view=I;this.unfixGutters=g;this.activeGutters=B;this.prevViewport=I.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight+"px",this.gutters=this.createGutters(I);for(let F of this.gutters)this.dom.appendChild(F.dom);this.fixed=!I.state.facet(this.unfixGutters),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),this.insertGutters(I)}gutters;dom;fixed;prevViewport;createGutters(I){return I.state.facet(this.activeGutters).map(g=>new FF(I,g))}insertGutters(I){I.contentDOM.parentNode.insertBefore(this.dom,I.contentDOM)}insertDetachedGutters(I){I.parentNode.insertBefore(this.dom,I)}getUpdateContexts(){return this.gutters.map(I=>new hQ(I,this.view.viewport,-this.view.documentPadding.top))}update(I){if(this.updateGutters(I)){let g=this.prevViewport,B=I.view.viewport,F=Math.min(g.to,B.to)-Math.max(g.from,B.from);this.syncGutters(F<(B.to-B.from)*.8)}I.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight+"px"),this.view.state.facet(this.unfixGutters)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=I.view.viewport}syncGutters(I){let g=this.dom.nextSibling;I&&this.dom.remove();let B=hA.RangeSet.iter(this.view.state.facet(pC.gutterLineClass),this.view.viewport.from),F=[],A=this.getUpdateContexts();for(let Q of this.view.viewportLineBlocks)if(F.length&&(F=[]),Array.isArray(Q.type)){let U=!0;for(let s of Q.type)if(s.type==pC.BlockType.Text&&U){Ut(B,F,s.from);for(let l of A)l.line(this.view,s,F);U=!1}else if(s.widget)for(let l of A)l.widget(this.view,s)}else if(Q.type==pC.BlockType.Text){Ut(B,F,Q.from);for(let U of A)U.line(this.view,Q,F)}for(let Q of A)Q.finish();I&&this.insertDetachedGutters(g)}updateGutters(I){let g=I.startState.facet(this.activeGutters),B=I.state.facet(this.activeGutters),F=I.docChanged||I.heightChanged||I.viewportChanged||!hA.RangeSet.eq(I.startState.facet(pC.gutterLineClass),I.state.facet(pC.gutterLineClass),I.view.viewport.from,I.view.viewport.to);if(g==B)for(let A of this.gutters)A.update(I)&&(F=!0);else{F=!0;let A=[];for(let Q of B){let U=g.indexOf(Q);U<0?A.push(new FF(this.view,Q)):(this.gutters[U].update(I),A.push(this.gutters[U]))}for(let Q of this.gutters)Q.dom.remove(),A.indexOf(Q)<0&&Q.destroy();for(let Q of A)this.dom.appendChild(Q.dom);this.gutters=A}return F}destroy(){for(let I of this.gutters)I.destroy();this.dom.remove()}};function $U(C){return pC.ViewPlugin.fromClass(C,{provide:I=>pC.EditorView.scrollMargins.of(g=>{let B=g.plugin(I);return!B||B.gutters.length==0||!B.fixed?null:g.textDirection==pC.Direction.LTR?{left:B.dom.offsetWidth}:{right:B.dom.offsetWidth}})})}function Z0(C,I,g){let B=[C];return I&&I.fixed===!1&&B.push(g.of(!0)),B}function Is(C,I,g,B){return[Z0(C,{},B),g.of({...e0,...I})]}var As=require("@codemirror/state"),ki=require("@codemirror/view"),RC=require("obsidian");var Ni=require("obsidian"),Cs=require("@codemirror/state"),SA=require("@codemirror/view");function V0(C){let I=C.embedRegistry.embedByExtension.md({app:C,containerEl:document.createElement("div")},null,"");I.editable=!0,I.showEditor();let g=Object.getPrototypeOf(Object.getPrototypeOf(I.editMode));return I.unload(),g.constructor}var ri={cursorLocation:{anchor:0,head:0},value:"",cls:"",placeholder:"",focus:!0,filteredExtensions:[],onEnter:(C,I,g)=>(I&&C.options.onSubmit(C),I),onEscape:C=>{C.options.onBlur(C)},onSubmit:()=>{},onBlur:()=>{},onPaste:()=>{},onChange:()=>{}},gs=class extends V0(app){options;initial_value;scope;constructor(I,g,B){super(I,g,{app:I,onMarkdownScroll:()=>{},getMode:()=>"source"}),this.options={...ri,...B},this.initial_value=this.options.value,this.scope=new Ni.Scope(this.app.scope),this.scope.register(["Mod"],"Enter",(F,A)=>!0),this.owner.editMode=this,this.owner.editor=this.editor,this.set(B.value||"",!0),this.register(iA(this.app.workspace,{setActiveLeaf:F=>(A,Q)=>{this.activeCM.hasFocus||F.call(this.app.workspace,A,Q)}})),this.options.onBlur!==ri.onBlur&&this.editor?.cm.contentDOM.addEventListener("blur",()=>{this._loaded&&this.options.onBlur(this)}),this.editor?.cm.contentDOM.addEventListener("focusin",()=>{this.app.keymap.pushScope(this.scope),this.app.workspace.activeEditor=this.owner}),this.editorEl.classList.remove("markdown-source-view"),B.cls&&this.editorEl.classList.add(B.cls),B.cursorLocation&&this.editor?.cm.dispatch({selection:Cs.EditorSelection.range(B.cursorLocation.anchor,B.cursorLocation.head)})}onUpdate(I,g){super.onUpdate(I,g),g&&this.options.onChange(I)}buildLocalExtensions(){let I=super.buildLocalExtensions();return this.options.placeholder&&I.push((0,SA.placeholder)(this.options.placeholder)),I.push(SA.EditorView.domEventHandlers({paste:g=>{this.options.onPaste(g,this)}})),I.push(Cs.Prec.highest(SA.keymap.of([{key:"Enter",run:g=>this.options.onEnter(this,!1,!1),shift:g=>this.options.onEnter(this,!1,!0)},{key:"Mod-Enter",run:g=>this.options.onEnter(this,!0,!1),shift:g=>this.options.onEnter(this,!0,!0)},{key:"Escape",run:g=>(this.options.onEscape(this),!0),preventDefault:!0}]))),I}getDynamicExtensions(){return super.getDynamicExtensions().filter(I=>!this.options.filteredExtensions.includes(I))}updateBottomPadding(I){return 0}destroy(){this._loaded&&this.unload(),this.app.keymap.popScope(this.scope),this.app.workspace.activeEditor===this.owner&&(this.app.workspace.activeEditor=null),this.containerEl.empty(),super.destroy()}onunload(){super.onunload(),this.destroy()}onload(){super.onload(),this.options.focus&&this.editor?.focus()}};var u0="0.2.3",pi=4,XA={version:u0,default_edit_mode:1,default_preview_mode:0,diff_gutter:!0,editor_styling:!1,diff_gutter_hide_empty:!1,annotation_gutter:!0,annotation_gutter_included_types:31,annotation_gutter_hide_empty:!1,annotation_gutter_default_fold_state:!1,annotation_gutter_fold_button:!0,annotation_gutter_resize_handle:!0,annotation_gutter_focus_on_click:!0,annotation_gutter_width:300,comment_style:"icon",tag_completion:!0,tag_correcter:!0,clipboard_remove_syntax:!0,edit_info:!0,toolbar_preview_button:!0,toolbar_edit_button:!0,toolbar_show_buttons_labels:!0,status_bar_preview_button:!0,status_bar_edit_button:!0,status_bar_metadata_button:!0,database_workers:2,post_processor:!0,live_preview:!0,alternative_cursor_movement:!0,enable_metadata:!1,enable_author_metadata:!1,enable_timestamp_metadata:!1,enable_completed_metadata:!1,enable_style_metadata:!1,enable_color_metadata:!1,add_metadata:!1,add_author_metadata:!1,add_timestamp_metadata:!1,add_completed_metadata:!1,add_style_metadata:!1,add_color_metadata:!1,author:"",suggestion_mode_operations:{cursor_movement:{addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",highlight:"ignore_metadata",comment:"ignore_completely"},bracket_movement:{addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",highlight:"stay_inside",comment:"stay_inside"}}},Hi=new Set(["live_preview","diff_gutter","annotation_gutter","annotation_gutter_focus_on_click","comment_style","tag_completion","tag_correcter"]),Yi=new Set(["enable_metadata"]),Ji=new Set(["enable_metadata"]),pF=(A=>(A[A.ADDITION=1]="ADDITION",A[A.DELETION=2]="DELETION",A[A.SUBSTITUTION=4]="SUBSTITUTION",A[A.HIGHLIGHT=8]="HIGHLIGHT",A[A.COMMENT=16]="COMMENT",A))(pF||{});var st=class extends RC.Component{constructor(g,B){super();this.range=g;this.marker=B;this.text=g.unwrap(),this.annotation_container=this.marker.annotation_thread.createDiv({cls:"cmtr-anno-gutter-annotation"}),this.annotation_container.addEventListener("blur",this.renderPreview.bind(this)),this.annotation_container.addEventListener("dblclick",this.renderSource.bind(this)),this.annotation_container.addEventListener("contextmenu",this.onCommentContextmenu.bind(this)),this.range.metadata&&this.renderMetadata(),this.annotation_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-view"}),this.renderPreview()}text;new_text=null;annotation_container;metadata_view=null;annotation_view;currentMode=null;editMode=null;onload(){super.onload()}onunload(){super.onunload(),this.annotation_container.remove(),this.editMode=null}renderMetadata(){if(this.metadata_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-metadata"}),this.range.fields.author){let g=createSpan({cls:"cmtr-anno-gutter-annotation-author-label",text:"Author: "});this.metadata_view.appendChild(g);let B=createSpan({cls:"cmtr-anno-gutter-annotation-author-name",text:this.range.fields.author});this.metadata_view.appendChild(B)}if(this.range.fields.time){if(this.metadata_view.children.length>0){let F=createSpan({cls:"cmtr-anno-gutter-annotation-metadata-separator",text:" \u2022 "});this.metadata_view.appendChild(F)}let g=createSpan({cls:"cmtr-anno-gutter-annotation-time-label",text:"Updated at: "});this.metadata_view.appendChild(g);let B=createSpan({cls:"cmtr-anno-gutter-annotation-time",text:window.moment.unix(this.range.fields.time).format("MMM DD YYYY, HH:mm")});this.metadata_view.appendChild(B)}}renderSource(g){if(this.range.type!=="comment")new RC.Notice("[Commentator] You can only edit comments.");else{if(g?.stopPropagation(),this.currentMode==="source")return;if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!0),this.range.fields.author&&this.range.fields.author!==Fg.PLUGIN_SETTINGS.author){new RC.Notice("[Commentator] You cannot edit comments from other authors.");return}this.annotation_view.empty(),this.editMode=this.addChild(new gs(Fg.app,this.annotation_view,{value:this.text,cls:"cmtr-anno-gutter-annotation-editor",onSubmit:B=>{this.new_text=B.get(),this.renderPreview()},filteredExtensions:[Fg.app.plugins.plugins.commentator.editorExtensions],onBlur:this.renderPreview.bind(this)})),this.currentMode="source"}}renderPreview(){if(this.currentMode!=="preview")if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!1),this.text===this.new_text||this.new_text===null){switch(this.new_text=null,this.editMode&&(this.removeChild(this.editMode),this.editMode=null),this.annotation_view.empty(),RC.MarkdownRenderer.render(Fg.app,this.text||" ",this.annotation_view,"",this),this.range.type){case"addition":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Added: "}));break;case"deletion":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Deleted: "}));break;case"substitution":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Changed: "}));break;case"highlight":break;case"comment":break}this.annotation_view.addClass("cmtr-anno-gutter-annotation-"+this.range.type),this.currentMode="preview"}else this.text=this.new_text,setTimeout(()=>this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:_U("comment",this.new_text)}}))}onCommentContextmenu(g){g.preventDefault(),g.stopPropagation();let B=new RC.Menu;B.addItem(F=>{F.setTitle("Edit comment").setIcon("pencil").onClick(()=>{this.renderSource()})}),B.addItem(F=>{F.setTitle("Reply to comment").setIcon("reply").onClick(()=>{QF(this.marker.view,this.range)})}),B.addItem(F=>{F.setTitle("Fold gutter").setIcon("arrow-right-from-line").onClick(()=>{this.marker.view.plugin(AF(Fg.app)[1][0][0]).foldGutter()})}),B.showAtPosition(g)}},Fs=class extends ki.GutterMarker{constructor(g,B,F,A=0){super();this.annotation=g;this.annotations=B;this.view=F;this.itr=A}annotation_thread;component=new RC.Component;preventUnload=!1;eq(g){return this.itr===g.itr&&this.annotations===g.annotations&&this.annotations[0].equals(g.annotations[0])}onCommentThreadClick(){let{app:g}=this.view.state.field(RC.editorInfoField),B=this.view.plugin(AF(g)[1][0][0]);B.unfocusAnnotation(),B.focusAnnotation(this,-1,!0,!0),this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0)}toDOM(){this.annotation_thread=createDiv({cls:"cmtr-anno-gutter-thread"}),this.annotation_thread.addEventListener("click",this.onCommentThreadClick.bind(this));for(let g of this.annotations)this.component.addChild(new st(g,this));return this.component.load(),this.annotation_thread}focus(){this.annotation_thread.focus()}focus_annotation(g=-1,B=!1){g===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0):this.annotation_thread.children.item(g).dispatchEvent(new MouseEvent("dblclick")),B&&setTimeout(()=>{let F=this.view.lineBlockAt(this.annotations[0].from).top-100;this.view.scrollDOM.scrollTo({top:F,behavior:"smooth"})},200)}unfocus_annotation(g=-1){g===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!1):this.annotation_thread.children.item(g).classList.toggle("cmtr-anno-gutter-thread-highlight",!1)}destroy(g){this.component.unload(),this.annotation_thread.remove(),super.destroy(g)}};function vi(C,I,g){let B=C.field(RC.editorEditorField),F=(g&1)!==0,A=(g&2)!==0,Q=(g&4)!==0,U=(g&8)!==0,s=(g&16)!==0,l=[];for(let d of I){let c=d.full_thread;switch(s||(c=c.slice(0,1)),d.type){case"addition":F||c.shift();break;case"deletion":A||c.shift();break;case"substitution":Q||c.shift();break;case"highlight":U||c.shift();break;case"comment":s||c.shift();break}if(c.length){let i=new Fs(d,c,B,Di);i.preventUnload=!0,l.push(i.range(d.from,d.to))}}return l}var Di=0,AB=As.StateField.define({create(C){let I=C.field(HI).ranges.ranges.reduce((g,B)=>{let F=B.base_range;return g.includes(F)||g.push(F),g},[]);return As.RangeSet.of(vi(C,I,C.facet(rB)))},update(C,I){let g=I.state.facet(rB);if(I.startState.facet(rB)!==g)return this.create(I.state);if(!I.docChanged)return C;Di+=1;let B=[];for(let A of I.state.field(HI).inserted_ranges)B.includes(A.base_range)||B.push(A.base_range);let F=I.state.field(HI).deleted_ranges.map(A=>A.base_range);return C.map(I.changes).update({filter:(A,Q,U)=>{let s=!F.includes(U.annotation);return U.preventUnload=s,s},add:vi(I.state,B.map(A=>A.full_thread[0]),g)})}});var Qs=require("@codemirror/state"),YF=require("@codemirror/view"),lt=require("obsidian");var Ti=require("@codemirror/view"),QB=require("obsidian");function wi(C,I,g=!1){let B=I??C.text;!I&&g&&(C.to>=B.length&&!B.endsWith(ng[C.type].at(-1))?B=C.unwrap_bracket(!0):B=C.unwrap());let F=document.createElement("span");F.classList.add("cmtr-comment-icon"),(0,QB.setIcon)(F,"message-square");let A=null,Q=new QB.Component;return F.onmouseenter=()=>{if(A)return;A=document.createElement("div"),A.classList.add("cmtr-comment-tooltip"),QB.MarkdownRenderer.render(Fg.app,B,A,"",Q),Q.load(),F.appendChild(A);let U=F.getBoundingClientRect(),s=A.getBoundingClientRect();A.style.left=U.x-s.x+12+"px"},F.onmouseleave=()=>{A&&(Q.unload(),F.removeChild(A),A=null)},F}var WA=class extends Ti.WidgetType{constructor(g,B=!1){super();this.range=g;this.annotation_gutter=B;this.component=new QB.Component}tooltip=null;icon=null;component;focused=!1;renderTooltip(){if(!this.tooltip){this.tooltip=document.createElement("div"),this.tooltip.classList.add("cmtr-comment-tooltip"),QB.MarkdownRenderer.render(Fg.app,this.range.text,this.tooltip,"",this.component),this.component.load(),this.icon.appendChild(this.tooltip);let g=this.icon.getBoundingClientRect(),B=this.tooltip.getBoundingClientRect();this.tooltip.style.left=g.x-B.x-B.width/2+12+"px"}}focusAnnotation(g,B){g.dispatch({annotations:[HF.of({from:this.range.from,to:this.range.to})]})}unrenderTooltip(){!this.focused&&this.tooltip&&(this.component.unload(),this.icon.removeChild(this.tooltip),this.tooltip=null)}toDOM(g){return this.icon=document.createElement("span"),this.icon.classList.add("cmtr-comment-icon"),(0,QB.setIcon)(this.icon,"message-square"),this.annotation_gutter?(this.icon.onclick=B=>this.focusAnnotation(g,B),this.icon.oncontextmenu=B=>{B.preventDefault();let F=new QB.Menu;F.addItem(A=>{A.setTitle("Focus annotation").setIcon("eye").onClick(this.focusAnnotation.bind(this,g))}),F.addItem(A=>{A.setTitle("Add comment").setIcon("message-square").onClick(Q=>{Q.preventDefault(),QF(g,this.range)})}),F.showAtMouseEvent(B)}):this.range.length&&(this.icon.onmouseenter=()=>{this.renderTooltip()},this.icon.onclick=()=>{this.renderTooltip(),this.focused=!0},this.icon.onmouseleave=()=>{this.unrenderTooltip(),this.focused=!1}),this.icon}};var Us=C=>Qs.StateField.define({create(I){return YF.Decoration.none},update(I,g){let B=g.state.field(lt.editorLivePreviewField),F=B!==g.startState.field(lt.editorLivePreviewField);if(!g.docChanged&&!F&&I.size)return I;if(F&&!B)return YF.Decoration.none;let A=new Qs.RangeSetBuilder,Q=g.state.field(HI).ranges;if(B)for(let U of Q.ranges)U.type==="comment"&&(U.base_range===U?A.add(U.from,U.to,YF.Decoration.replace({widget:new WA(U,C.annotation_gutter)})):A.add(U.from,U.to,YF.Decoration.replace({})));return A.finish()},provide(I){return YF.EditorView.decorations.from(I)}});var JF=require("@codemirror/state"),EA=require("@codemirror/view");var vF=JF.StateEffect.define(),rA=JF.StateField.define({create(C){return{from:C.selection.main.from,to:C.selection.main.to}},update(C,I){for(let g of I.effects)if(g.is(vF))return g.value;return C}}),ss=JF.StateField.define({create(C){return EA.Decoration.none},update(C,I){let g=I.startState.field(rA),B=I.state.field(rA);if(I.selection&&g!==B){let F=I.state.field(HI).ranges.ranges_in_range(I.selection.main.from,I.selection.main.to);return F.length&&F[0].base_range===F.at(-1)?.base_range&&I.selection.main.from>=F[0].from&&I.selection.main.to<=F.at(-1).to?JF.RangeSet.of([EA.Decoration.mark({attributes:{class:"cmtr-focused"}}).range(F[0].full_range_front,F[0].full_range_back)]):EA.Decoration.none}else return C},provide(C){return EA.EditorView.decorations.from(C)}});var yQ=require("@codemirror/state"),xB=require("@codemirror/view"),ts=require("obsidian");function uB(C,I,g,B){if(!B)return;let F=xB.Decoration.replace({attributes:{"data-contents":"string"}});g?C.push(F.range(I.from,I.from+3)):C.push(F.range(I.to-3,I.to))}function oQ(C,I,g=!1){!I.metadata||!g||C.push(xB.Decoration.replace({attributes:{"data-contents":"string"}}).range(I.from+3,I.metadata+2))}function fi(C,I){C.push(xB.Decoration.replace({}).range(I.from,I.to))}function kF(C,I,g,B=null,F=!1,A=!0){let Q=F?0:3;I.replies.length&&(g+=" cmtr-has-reply");let U={"data-contents":"string","data-type":"cmtr-"+I.repr.toLowerCase(),class:g,style:A&&I.fields.color?`background-color: #${I.fields.color};`:""},s=xB.Decoration.mark({attributes:U});I.type==="substitution"?B?I.part_is_empty(!0)||C.push(s.range(I.from+Q,I.middle)):I.part_is_empty(!1)||C.push(s.range(I.middle+2,I.to-Q)):I.empty()||C.push(s.range(I.from+Q,I.to-Q))}function ls(C,I,g="",B){uB(C,I,!0,B),oQ(C,I,B),kF(C,I,g),uB(C,I,!1,B)}function tt(C,I,g,B,F,A){let Q=[];for(let U of C)if(B===0){let s=I.ranges.some(d=>U.partially_in_range(d.from,d.to)),l=`cmtr-editing cmtr-inline cmtr-${U.repr.toLowerCase()} `+(U.fields.style||"");F===2&&s?kF(Q,U,A.editor_styling?l:"",null,!0,A.editor_styling):U.type==="substitution"?(uB(Q,U,!0,g),oQ(Q,U,g),kF(Q,U,l+" cmtr-deletion",!0),g&&Q.push(xB.Decoration.replace({attributes:{"data-contents":"string"}}).range(U.middle,U.middle+2)),kF(Q,U,l+" cmtr-addition",!1),uB(Q,U,!1,g)):ls(Q,U,l,g)}else B===1?U.type==="addition"?ls(Q,U,"cmtr-accepted",g):U.type==="deletion"?fi(Q,U):U.type==="substitution"?(uB(Q,U,!0,g),oQ(Q,U,g),Q.push(xB.Decoration.replace({}).range(U.range_start,U.middle+(g?2:0))),kF(Q,U,"cmtr-accepted",!1),uB(Q,U,!1,g)):ls(Q,U,"",g):B===2&&(U.type==="addition"?fi(Q,U):U.type==="deletion"?(uB(Q,U,!0,g),oQ(Q,U,g),kF(Q,U,"cmtr-accepted"),uB(Q,U,!1,g)):U.type==="substitution"?(uB(Q,U,!0,g),oQ(Q,U,g),kF(Q,U,"cmtr-accepted",!0),Q.push(xB.Decoration.replace({}).range(U.middle+(g?0:2),U.to-3)),uB(Q,U,!1,g)):ls(Q,U,"",g));return Q}var cs=C=>yQ.StateField.define({create(I){let g=I.field(ts.editorLivePreviewField),B=I.facet(iC),F=I.facet(aC),A=I.field(HI);return yQ.RangeSet.of(tt(A.ranges.ranges,I.selection,g,B,F,C))},update(I,g){let B=g.state.field(ts.editorLivePreviewField),F=g.state.facet(iC),A=g.state.facet(aC),Q=g.state.field(HI);return B!==g.startState.field(ts.editorLivePreviewField)||F!==g.startState.facet(iC)||g.effects.some(U=>U.is(aA))?yQ.RangeSet.of(tt(Q.ranges.ranges,g.state.selection,B,F,A,C)):g.docChanged||!g.docChanged&&Q.inserted_ranges.length?I.map(g.changes).update({filter:(U,s,l)=>!g.changes.touchesRange(U,s),add:tt(Q.inserted_ranges,g.state.selection,B,F,A,C)}):I},provide(I){return xB.EditorView.decorations.from(I)}});var zi=60,Mi=SQ.Facet.define({combine:C=>C.some(I=>I)}),ct=SQ.Facet.define(),HF=SQ.Annotation.define(),it=class extends yA{previously_focused=void 0;constructor(I){super(I,Mi,ct),I.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{I.dispatch(I.state.update({effects:[WQ.reconfigure([])]}))}))}debouncedMoveGutter=(0,XQ.debounce)(this.moveGutter.bind(this),200);createGutters(I){return I.state.facet(ct).map(g=>new dt(I,g,this.dom))}insertGutters(I){I.contentDOM.parentNode.insertBefore(this.dom,I.contentDOM.nextSibling)}insertDetachedGutters(I){this.view.contentDOM.parentNode.insertBefore(this.dom,this.view.contentDOM.nextSibling)}getUpdateContexts(){return this.gutters.map(I=>new Gt(I,this.view.viewport,-this.view.documentPadding.top))}unfocusAnnotation(){this.previously_focused?.unfocus_annotation(),this.previously_focused=void 0}focusAnnotation(I,g,B=!1,F=!1){this.previously_focused=I,this.debouncedMoveGutter(I),I.focus_annotation(g,B),F&&setTimeout(()=>{this.view.dispatch(this.view.state.update({effects:[vF.of({from:I.annotation.from,to:I.annotation.full_range_back})]}))})}updateGutters(I){let g=I.transactions.flatMap(B=>B.annotation(HF)).find(B=>B);if((g||I.startState.selection!==I.state.selection)&&this.unfocusAnnotation(),g){let{from:B,to:F,index:A=-1,scroll:Q=!1}=g;I:for(let U of this.gutters[0].elements)if(B>=U.block.from){for(let s of U.markers)if(B>=s.annotation.from&&F<=s.annotation.full_range_back){this.focusAnnotation(s,A,Q);break I}}else if(Bs.markers.includes(I));if(!B)return;let F=B.markers.indexOf(I),A=B.block.top,Q=B.dom.children[F].offsetTop,U=A-Q;if(Math.abs(U)>=10&&U){let s=g.elements[0];s.dom.style.marginTop=parseInt(s.dom.style.marginTop||"0")+U+"px"}}foldGutter(){this.gutters[0].foldGutter()}},x0=$U(it);function Ki(C){return Is(x0,C,ct,Mi)}var Gt=class extends hQ{constructor(g,B,F){super(g,B,F);this.gutter=g;this.height=F;this.previous_element_end=F}previous_element_end=0;new_gutter_elements=[];added_elements=[];async addElement(g,B,F){let A=Math.max(B.top-this.previous_element_end,0),Q=A<=0?this.previous_element_end:B.top;F.sort((d,c)=>d.annotation.from-c.annotation.from);let s=this.gutter.elements[this.i]?.dom.clientHeight||36,l=this.gutter.elements.findIndex(d=>qU(d.markers,F));if(l!==-1){let d=this.gutter.elements[l];for(let c=this.i;c{let B=g.clientX,F=(0,XQ.debounce)(s=>{this.dom.style.width=s+"px",this.view.dispatch({effects:dQ.reconfigure(FB.of(s))}),this.fold_button&&(this.fold_button.style.right=s+zi+"px")},25);this.resize_handle.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!0),this.fold_button?.classList.toggle("cmtr-anno-gutter-moving",!0),this.gutterDom.classList.toggle("cmtr-anno-gutter-moving",!0);let A=parseInt(this.dom.style.width.slice(0,-2)),Q=s=>{let l=s.clientX-B;return B=s.clientX,A-=l,F(A),!0},U=()=>{document.removeEventListener("mousemove",Q),document.removeEventListener("mouseup",U),this.resize_handle.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!1),this.fold_button?.classList.toggle("cmtr-anno-gutter-moving",!1),this.gutterDom.classList.toggle("cmtr-anno-gutter-moving",!1)};return document.addEventListener("mousemove",Q),document.addEventListener("mouseup",U),!0})),this.resize_handle.style.display=this.view.state.field(AB).size&&!this.view.state.facet(IF)?"":"none"}setFoldButtonState(g,B){g?(this.fold_button.style.right="20px",this.fold_button.style.rotate="-180deg",this.fold_button.ariaLabel="Unfold gutter",this.resize_handle&&(this.resize_handle.style.display="none")):(this.fold_button.style.right=(B??this.view.state.facet(FB))+zi+"px",this.fold_button.style.rotate="0deg",this.fold_button.ariaLabel="Fold gutter",this.resize_handle&&(this.resize_handle.style.display=""))}foldGutter(){let g=!this.view.state.facet(IF),B=this.view.state.facet(FB);this.fold_button&&this.setFoldButtonState(g,B),g?this.elements.forEach(F=>{Array.from(F.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(A=>{A.setAttribute("style",`max-height: ${A.clientHeight}px; overflow: hidden;`)})}):this.dom.addEventListener("transitionend",()=>{this.elements.forEach(F=>{Array.from(F.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(A=>{A.setAttribute("style","")})})},{once:!0}),this.dom.style.width=g?"0":B+"px",this.view.dispatch({effects:YU.reconfigure(IF.of(g))})}update(g){let B=super.update(g),F=g.state.facet(yF),A=g.state.facet(FB),Q=g.state.facet(SF),U=g.state.facet(XF),s=g.state.facet(IF),l=g.state.field(AB);return F!==g.startState.facet(yF)?F&&g.state.field(AB).size===0?this.dom.style.width="0":this.dom.style.width=g.state.facet(FB)+"px":A!==g.startState.facet(FB)?!F&&!s&&(this.dom.style.width=A+"px"):Q!==g.startState.facet(SF)?Q&&!this.fold_button?this.createFoldButton(s):!Q&&this.fold_button&&(this.fold_button.remove(),this.fold_button=void 0):U!==g.startState.facet(XF)&&(U&&!this.resize_handle?this.createResizeHandle():!U&&this.resize_handle&&(this.resize_handle.remove(),this.resize_handle=void 0)),l.size!==g.startState.field(AB).size&&(l.size===0?(this.fold_button&&(this.fold_button.style.display="none"),this.resize_handle&&(this.resize_handle.style.display="none"),F&&(this.dom.style.width="0")):(this.fold_button&&(this.fold_button.style.display=""),this.resize_handle&&(this.resize_handle.style.display=""),s||(this.dom.style.width=A+"px"))),B}},bt=class extends oA{constructor(g,B,F,A,Q=null){super(g,B,F,A);this.block=Q}update(g,B,F,A,Q=null){this.block=Q,this.above!=F&&(this.dom.style.marginTop=(this.above=F)?F+"px":""),qU(this.markers,A)||this.setMarkers(g,A)}};var AF=C=>[AB,Ki({class:"cmtr-anno-gutter"+(C.vault.getConfig("cssTheme")==="Minimal"?" is-minimal":""),markers:I=>I.state.field(AB)})],WQ=new is.Compartment;function QF(C,I){let g=I?I.full_range_back:C.state.selection.main.head;C.dispatch(C.state.update({changes:{from:g,to:g,insert:_U("comment","")},selection:is.EditorSelection.cursor(g),annotations:[HF.of({from:g,to:g,index:I?I.full_thread.length:-1})]}))}var Oi=require("obsidian"),_i=require("@codemirror/state");var ut=require("@codemirror/state"),jn=require("@codemirror/view");var Pi=ut.Facet.define({combine:C=>C.some(I=>I)}),et=ut.Facet.define(),Zt=class extends yA{constructor(I){super(I,Pi,et),I.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{I.dispatch(I.state.update({effects:[EQ.reconfigure([])]}))}))}createGutters(I){return I.state.facet(et).map(g=>new Vt(I,g))}},Vt=class extends FF{constructor(g,B){super(g,B);this.view=g;this.config=B;g.state.facet(WF)&&(this.hide_on_empty=!0)}hide_on_empty=!1;showing=!0;update(g){let B=super.update(g),F=g.state.facet(WF);return F!==g.startState.facet(WF)&&(this.hide_on_empty=F),this.showing&&this.hide_on_empty&&g.state.field(HI).ranges.empty()?(this.dom.parentElement.classList.add("gutter-hidden"),this.showing=!1):!this.showing&&(!this.hide_on_empty||!g.state.field(HI).ranges.empty())&&(this.dom.parentElement.classList.remove("gutter-hidden"),this.showing=!0),B}},L0=$U(Zt);function ji(C){return Is(L0,C,et,Pi)}var Gs=require("@codemirror/state"),ds=require("@codemirror/view");var xt=class extends ds.GutterMarker{constructor(g,B,F){super();this.type=g;this.top=B;this.bottom=F}toDOM(){let g="";return this.type.has("addition")&&(g+="cmtr-diff-gutter-addition "),this.type.has("deletion")&&(g+="cmtr-diff-gutter-deletion "),this.type.has("substitution")&&(g+="cmtr-diff-gutter-substitution "),this.top&&(g+="cmtr-diff-gutter-top "),this.bottom&&(g+="cmtr-diff-gutter-bottom "),createDiv({cls:g})}},bs=ds.ViewPlugin.fromClass(class{markers=Gs.RangeSet.empty;constructMarkers(I){let g=I.state.field(HI).ranges,B=new Gs.RangeSetBuilder,F={};for(let A of g.ranges_in_range(I.viewport.from,I.viewport.to)){let Q=I.state.doc.lineAt(A.from).number,U=I.state.doc.lineAt(A.to).number,s=Array.from({length:U-Q+1},(l,d)=>Q+d);F[Q]?F[Q].isStart=!0:F[Q]={isStart:!0,isEnd:!1,types:new Set};for(let l of s)F[l]?(F[l].isEnd=!1,F[l].types.add(A.type)):F[l]={isStart:!1,isEnd:!1,types:new Set([A.type])};F[U]&&(F[U].isEnd=!0)}for(let[A,Q]of Object.entries(F)){let U=I.state.doc.line(Number(A));B.add(U.from,U.to,new xt(Q.types,Q.isStart,Q.isEnd))}this.markers=B.finish()}constructor(I){this.constructMarkers(I)}update(I){(I.docChanged||I.viewportChanged||I.heightChanged)&&this.constructMarkers(I.view)}});var Lt=[bs,ji({class:"cmtr-diff-gutter",markers:C=>C.plugin(bs).markers,domEventHandlers:{click:(C,I,g)=>{let B=new Oi.Menu;return B.addItem(F=>{F.setTitle("Accept changes").setIcon("check").onClick(()=>{C.dispatch({changes:rF(C.state,I.from,I.to)})})}),B.addItem(F=>{F.setTitle("Reject changes").setIcon("cross").onClick(()=>{C.dispatch({changes:NF(C.state,I.from,I.to)})})}),B.showAtMouseEvent(g),!1}}})],EQ=new _i.Compartment;var DF=require("@codemirror/state");var qi=require("@codemirror/view"),AC=null,at=qi.EditorView.domEventHandlers({keydown:(C,I)=>{AC=C},contextmenu:(C,I)=>{AC=C}});var $i=require("@codemirror/state");function es(C,I,g,B,F){if(I.includes("select.pointer")||AC&&F.key==="a"&&(AC.ctrlKey||AC.metaKey))return;let A=I.includes("select.backward"),Q=I.includes("select.group"),U=I.includes("select.extend");!g&&F&&(A=F.key==="ArrowLeft",F.key==="ArrowLeft"?A=!0:F.key==="ArrowRight"?A=!1:A=!gi(C.startState.selection,C.selection),U=F.shiftKey,Q=F.ctrlKey||F.metaKey);let s=C.startState.field(HI).ranges,l=C.selection.ranges.map((d,c)=>ni(C.startState.selection.ranges[c],d,s,!A,Q,U,g,C.startState,B.suggestion_mode_operations.cursor_movement,B.suggestion_mode_operations.bracket_movement).selection);return{selection:$i.EditorSelection.create(l),filter:!1}}function n0(C,I){return I.some(g=>g.startsWith(C))}var nt=C=>DF.EditorState.transactionFilter.of(I=>R0(I,C));function R0(C,I){let g=PU(C),B=Fg.app.workspace.activeEditor?.editor?.cm.cm!==void 0;if(!C.docChanged&&C.selection&&B&&eA(C)&&g.push(C.startState.selection.ranges[0].fromi[0].to?c.to:i[0].touches_right_bracket(c.to,!1,!0)?i[0].to:void 0;if(e!==void 0&&V!==void 0){Q.push({from:e,to:V,insert:""}),U.push(DF.EditorSelection.cursor(e+d)),d-=V-e;continue}}let G=mQ(A,C.startState.doc,c.from,c.to,c.inserted,"regular"),b=G.slice(0,-1).reduce((e,V)=>e-(V.to-V.from)+V.insert.length,0);G&&(Q.push(G),U.push(DF.EditorSelection.cursor((s?G[0].start:G[G.length-1].end+b)+d)),d+=b-(G[G.length-1].to-G[G.length-1].from)+G[G.length-1].insert.length)}return C.startState.update(Q.length?{changes:Q,selection:DF.EditorSelection.create(U)}:{})}else if(n0("select",g)&&eA(C)&&I.alternative_cursor_movement&&AC instanceof KeyboardEvent){let F=es(C,g,B,I,AC);if(F)return C.startState.update(F)}return C}var rQ=require("@codemirror/state");var m0={moveByCharacters:{group:!1}};function h0(C,I){return I.some(g=>g.startsWith(C))}var Rt=C=>rQ.EditorState.transactionFilter.of(I=>o0(I,C));function o0(C,I){let g=PU(C),B=Fg.app.workspace.activeEditor?.editor?.cm.cm!==void 0;if(!C.docChanged&&C.selection&&B&&(eA(C)&&g.push(C.startState.selection.ranges[0].fromu-(n.to-n.from)+n.insert.length,0);e&&(U.push(e),s.push(rQ.EditorSelection.cursor((d?e[0].start:e[e.length-1].end+V)+i)),i+=V-(e[e.length-1].to-e[e.length-1].from)+e[e.length-1].insert.length)}return C.startState.update(U.length?{changes:U,selection:rQ.EditorSelection.create(s)}:{})}else if(h0("select",g)&&eA(C)&&I.alternative_cursor_movement&&AC instanceof KeyboardEvent){let F=es(C,g,B,I,AC);if(F)return C.startState.update(F)}return C}var DR=require("@codemirror/state");function TF(C,I){return C===0?[]:C===1?[nt(I)]:C===2?[Rt(I)]:[]}var y0=C=>Object.entries(Oc).map(([I,g])=>({id:`toggle-${I.toLowerCase()}`,name:`Mark as ${I}`,icon:I.toLowerCase(),editor_context:!0,regular_callback:(B,F)=>{Si(B,g,C.settings)}})),S0=C=>[{id:"accept-all-suggestions",name:"Accept all suggestions",icon:"check-check",editor_context:!0,regular_callback:(I,g)=>{I.cm.dispatch(I.cm.state.update({changes:rF(I.cm.state)}))}},{id:"reject-all-suggestions",name:"Reject all suggestions",icon:"cross",editor_context:!0,regular_callback:(I,g)=>{I.cm.dispatch(I.cm.state.update({changes:NF(I.cm.state)}))}},{id:"accept-selected-suggestions",name:"Accept suggestions in selection",icon:"check",editor_context:!0,check_callback:(I,g,B)=>{let F=Bt(g.cm.state);if(I||!F)return F;let Q=g.cm.state.selection.ranges.map(U=>rF(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:Q}))}},{id:"reject-selected-suggestions",name:"Reject suggestions in selection",icon:"cross",editor_context:!0,check_callback:(I,g,B)=>{let F=Bt(g.cm.state);if(I||!F)return F;let Q=g.cm.state.selection.ranges.map(U=>NF(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:Q}))}},{id:"comment",name:"Add comment",icon:"message-square",editor_context:!0,regular_callback:(I,g)=>{QF(I.cm,I.cm.state.field(HI).ranges.at_cursor(I.cm.state.selection.main.head))}},{id:"fold-gutter",name:"Fold annotation gutter",icon:"arrow-right-from-line",editor_context:!0,regular_callback:(I,g)=>{let{app:B}=I.cm.state.field(Zs.editorInfoField);I.cm.plugin(AF(B)[1][0][0]).foldGutter()}},{id:"toggle-preview-mode",name:"Cycle preview mode",icon:"comment",editor_context:!0,regular_callback:(I,g)=>{let B=(I.cm.state.facet(iC)+1)%3;I.cm.dispatch(I.cm.state.update({effects:uA.reconfigure(iC.of(B))})),C.setPreviewMode(g,B)}},{id:"suggest-mode",name:"Toggle suggestion mode",icon:"file-edit",editor_context:!0,regular_callback:(I,g)=>{let F=I.cm.state.facet(aC)===2?1:2;I.cm.dispatch(I.cm.state.update({effects:[xA.reconfigure(aC.of(F)),LA.reconfigure(TF(F,C.settings))]})),C.setEditMode(g,F)}},{id:"generate-text-diff",name:"Generate text diff from clipboard",icon:"diff",editor_context:!0,regular_callback:async(I,g)=>{let B=await navigator.clipboard.readText(),F=I.cm.state.field(HI).ranges,A=I.cm.state.selection.main,Q=F.unwrap_in_range(I.cm.state.doc,A.from,A.to).output,U=Wi(Q,B);I.cm.dispatch(I.cm.state.update({changes:[{from:A.from,to:A.to,insert:U}]}))}}],X0=C=>[{id:"toggle-vim",name:"(DEBUG) Toggle Vim mode",icon:"comment",regular_callback:async()=>{C.app.vault.setConfig("vimMode",!C.app.vault.getConfig("vimMode"))}},{id:"view",name:"Open global annotation view",icon:"comment",regular_callback:async()=>{await C.activateView()}}],IG=C=>W0([...y0(C),...S0(C),...X0(C)]);function W0(C){for(let I of C)Zs.Platform.isMobile||I.editor_context?I.regular_callback?(I.editorCallback=I.regular_callback,delete I.regular_callback):(I.editorCheckCallback=I.check_callback,delete I.check_callback):I.regular_callback?(I.callback=I.regular_callback,delete I.regular_callback):(I.checkCallback=I.check_callback,delete I.check_callback);return C}var Vs=require("obsidian"),us=(C=!1)=>{let I=iA(Vs.Menu.prototype,{onEnter:g=>function(B){let F=this.items[this.selected];return F&&F instanceof Vs.MenuItem&&F.handleEvent(B)||!0},onMenuClick:g=>function(B){if(!C||this.currentSubmenu&&this.currentSubmenu.dom.contains(B.target))B.stopImmediatePropagation();else return g&&g.apply(this,[B])},hide:g=>function(){return I(),g&&g.apply(this)}});return I};var gG=C=>C.workspace.on("editor-menu",(I,g)=>{let B=g.cm.state.field(HI).ranges;if(I.addItem(F=>{F.setTitle("Add comment").setIcon("message-square").setSection("commentator").onClick(()=>{QF(g.cm,B.at_cursor(g.cm.state.selection.main.head))})}),B.contains_range(g.cm.state.selection.main.from,g.cm.state.selection.main.to)&&(I.addItem(F=>{F.setTitle("Accept changes").setIcon("check").setSection("commentator").onClick(()=>{let Q=g.cm.state.selection.ranges.map(U=>rF(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:Q}))})}),I.addItem(F=>{F.setTitle("Reject changes").setIcon("cross").setSection("commentator").onClick(()=>{let Q=g.cm.state.selection.ranges.map(U=>NF(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:Q}))})}),Ii(g.cm.state.selection))){let F=g.cm.state.field(HI).ranges.at_cursor(g.cm.state.selection.ranges[0].head);I.addItem(A=>{let Q=A.setTitle("Set metadata").setIcon("tags").setSection("commentator").setSubmenu();Q.addItem(U=>{U.setTitle("Set author").setIcon("lucide-user").onClick(()=>{g.cm.dispatch(g.cm.state.update({changes:F.add_metadata("author",Fg.PLUGIN_SETTINGS.author)}))})}),Q.addItem(U=>{U.setTitle("Set time").setIcon("lucide-calendar").onClick(()=>{g.cm.dispatch(g.cm.state.update({changes:F.add_metadata("time",Math.round(Date.now()/1e3))}))})}),Q.addItem(U=>{U.setTitle("Set completed").setIcon("lucide-check").onClick(()=>{g.cm.dispatch(g.cm.state.update({changes:F.add_metadata("done",!0)}))})})})}}),CG=C=>C.workspace.on("markdown-viewport-menu",(I,g,B,F)=>{if(C.plugins.plugins.commentator.settings.annotation_gutter){let A=g.editor.cm,Q=A.state.field(rB);us(!0),I.addItem(U=>{let s=U.setTitle("Included annotations").setIcon("eye").setSubmenu();for(let{title:l,icon:d,value:c}of[{title:"Additions",icon:"plus-circle",value:1},{title:"Deletions",icon:"minus-square",value:2},{title:"Substitutions",icon:"replace",value:4},{title:"Highlights",icon:"highlighter",value:8},{title:"Comments",icon:"message-square",value:16}])s.addItem(i=>{i.setTitle(l).setIcon(d).setChecked((Q&c)!==0).onClick(()=>{Q^=c;let G=(Q&c)!==0;i.checkIconEl?i.checkIconEl.style.display=G?"flex":"none":i.setChecked(G),A.dispatch(A.state.update({effects:[JU.reconfigure(rB.of(Q))]}))})})})}});var xs=require("@codemirror/state"),BG=require("@codemirror/view");var mt=xs.Prec.high(BG.EditorView.inputHandler.of((C,I,g,B)=>{let F=C.state.doc.sliceString(I-2,I)+B,A;if((A=_c[F])!==void 0){let Q=[{from:I,to:g+1,insert:B+A.join("")}];return C.dispatch({changes:Q,selection:xs.EditorSelection.cursor(g+1)}),!0}return!1}));var Ls=require("@codemirror/state");var ht=Ls.EditorState.transactionFilter.of(C=>{if(C.isUserEvent("select")){let I=C.startState.selection.main,g=C.selection.main;if(g.anchor===g.head){let B=C.startState.field(HI).ranges,F=B.at_cursor(I.head),A=B.at_cursor(g.head);if(F&&F!==A&&(F.type==="substitution"||F.type==="highlight")){let Q=F.unwrap(),U=!1,s=0,l=Q.search(/\S/);l>=1&&(U=!0,Q=Q.slice(l),s+=l);let d=Q.match(/\n\s*\n/g);if(d&&(U=!0,Q=Q.replace(/\n\s*\n/g,` -`),s+=d.reduce((c,i)=>c+i.length,0)),U)return{changes:[{from:F.from+3,to:F.to-3,insert:Q}],selection:Ls.EditorSelection.cursor(g.head-s)}}}}return C});var ot=new Uint16Array('\u1D41<\xD5\u0131\u028A\u049D\u057B\u05D0\u0675\u06DE\u07A2\u07D6\u080F\u0A4A\u0A91\u0DA1\u0E6D\u0F09\u0F26\u10CA\u1228\u12E1\u1415\u149D\u14C3\u14DF\u1525\0\0\0\0\0\0\u156B\u16CD\u198D\u1C12\u1DDD\u1F7E\u2060\u21B0\u228D\u23C0\u23FB\u2442\u2824\u2912\u2D08\u2E48\u2FCE\u3016\u32BA\u3639\u37AC\u38FE\u3A28\u3A71\u3AE0\u3B2E\u0800EMabcfglmnoprstu\\bfms\x7F\x84\x8B\x90\x95\x98\xA6\xB3\xB9\xC8\xCFlig\u803B\xC6\u40C6P\u803B&\u4026cute\u803B\xC1\u40C1reve;\u4102\u0100iyx}rc\u803B\xC2\u40C2;\u4410r;\uC000\u{1D504}rave\u803B\xC0\u40C0pha;\u4391acr;\u4100d;\u6A53\u0100gp\x9D\xA1on;\u4104f;\uC000\u{1D538}plyFunction;\u6061ing\u803B\xC5\u40C5\u0100cs\xBE\xC3r;\uC000\u{1D49C}ign;\u6254ilde\u803B\xC3\u40C3ml\u803B\xC4\u40C4\u0400aceforsu\xE5\xFB\xFE\u0117\u011C\u0122\u0127\u012A\u0100cr\xEA\xF2kslash;\u6216\u0176\xF6\xF8;\u6AE7ed;\u6306y;\u4411\u0180crt\u0105\u010B\u0114ause;\u6235noullis;\u612Ca;\u4392r;\uC000\u{1D505}pf;\uC000\u{1D539}eve;\u42D8c\xF2\u0113mpeq;\u624E\u0700HOacdefhilorsu\u014D\u0151\u0156\u0180\u019E\u01A2\u01B5\u01B7\u01BA\u01DC\u0215\u0273\u0278\u027Ecy;\u4427PY\u803B\xA9\u40A9\u0180cpy\u015D\u0162\u017Aute;\u4106\u0100;i\u0167\u0168\u62D2talDifferentialD;\u6145leys;\u612D\u0200aeio\u0189\u018E\u0194\u0198ron;\u410Cdil\u803B\xC7\u40C7rc;\u4108nint;\u6230ot;\u410A\u0100dn\u01A7\u01ADilla;\u40B8terDot;\u40B7\xF2\u017Fi;\u43A7rcle\u0200DMPT\u01C7\u01CB\u01D1\u01D6ot;\u6299inus;\u6296lus;\u6295imes;\u6297o\u0100cs\u01E2\u01F8kwiseContourIntegral;\u6232eCurly\u0100DQ\u0203\u020FoubleQuote;\u601Duote;\u6019\u0200lnpu\u021E\u0228\u0247\u0255on\u0100;e\u0225\u0226\u6237;\u6A74\u0180git\u022F\u0236\u023Aruent;\u6261nt;\u622FourIntegral;\u622E\u0100fr\u024C\u024E;\u6102oduct;\u6210nterClockwiseContourIntegral;\u6233oss;\u6A2Fcr;\uC000\u{1D49E}p\u0100;C\u0284\u0285\u62D3ap;\u624D\u0580DJSZacefios\u02A0\u02AC\u02B0\u02B4\u02B8\u02CB\u02D7\u02E1\u02E6\u0333\u048D\u0100;o\u0179\u02A5trahd;\u6911cy;\u4402cy;\u4405cy;\u440F\u0180grs\u02BF\u02C4\u02C7ger;\u6021r;\u61A1hv;\u6AE4\u0100ay\u02D0\u02D5ron;\u410E;\u4414l\u0100;t\u02DD\u02DE\u6207a;\u4394r;\uC000\u{1D507}\u0100af\u02EB\u0327\u0100cm\u02F0\u0322ritical\u0200ADGT\u0300\u0306\u0316\u031Ccute;\u40B4o\u0174\u030B\u030D;\u42D9bleAcute;\u42DDrave;\u4060ilde;\u42DCond;\u62C4ferentialD;\u6146\u0470\u033D\0\0\0\u0342\u0354\0\u0405f;\uC000\u{1D53B}\u0180;DE\u0348\u0349\u034D\u40A8ot;\u60DCqual;\u6250ble\u0300CDLRUV\u0363\u0372\u0382\u03CF\u03E2\u03F8ontourIntegra\xEC\u0239o\u0274\u0379\0\0\u037B\xBB\u0349nArrow;\u61D3\u0100eo\u0387\u03A4ft\u0180ART\u0390\u0396\u03A1rrow;\u61D0ightArrow;\u61D4e\xE5\u02CAng\u0100LR\u03AB\u03C4eft\u0100AR\u03B3\u03B9rrow;\u67F8ightArrow;\u67FAightArrow;\u67F9ight\u0100AT\u03D8\u03DErrow;\u61D2ee;\u62A8p\u0241\u03E9\0\0\u03EFrrow;\u61D1ownArrow;\u61D5erticalBar;\u6225n\u0300ABLRTa\u0412\u042A\u0430\u045E\u047F\u037Crrow\u0180;BU\u041D\u041E\u0422\u6193ar;\u6913pArrow;\u61F5reve;\u4311eft\u02D2\u043A\0\u0446\0\u0450ightVector;\u6950eeVector;\u695Eector\u0100;B\u0459\u045A\u61BDar;\u6956ight\u01D4\u0467\0\u0471eeVector;\u695Fector\u0100;B\u047A\u047B\u61C1ar;\u6957ee\u0100;A\u0486\u0487\u62A4rrow;\u61A7\u0100ct\u0492\u0497r;\uC000\u{1D49F}rok;\u4110\u0800NTacdfglmopqstux\u04BD\u04C0\u04C4\u04CB\u04DE\u04E2\u04E7\u04EE\u04F5\u0521\u052F\u0536\u0552\u055D\u0560\u0565G;\u414AH\u803B\xD0\u40D0cute\u803B\xC9\u40C9\u0180aiy\u04D2\u04D7\u04DCron;\u411Arc\u803B\xCA\u40CA;\u442Dot;\u4116r;\uC000\u{1D508}rave\u803B\xC8\u40C8ement;\u6208\u0100ap\u04FA\u04FEcr;\u4112ty\u0253\u0506\0\0\u0512mallSquare;\u65FBerySmallSquare;\u65AB\u0100gp\u0526\u052Aon;\u4118f;\uC000\u{1D53C}silon;\u4395u\u0100ai\u053C\u0549l\u0100;T\u0542\u0543\u6A75ilde;\u6242librium;\u61CC\u0100ci\u0557\u055Ar;\u6130m;\u6A73a;\u4397ml\u803B\xCB\u40CB\u0100ip\u056A\u056Fsts;\u6203onentialE;\u6147\u0280cfios\u0585\u0588\u058D\u05B2\u05CCy;\u4424r;\uC000\u{1D509}lled\u0253\u0597\0\0\u05A3mallSquare;\u65FCerySmallSquare;\u65AA\u0370\u05BA\0\u05BF\0\0\u05C4f;\uC000\u{1D53D}All;\u6200riertrf;\u6131c\xF2\u05CB\u0600JTabcdfgorst\u05E8\u05EC\u05EF\u05FA\u0600\u0612\u0616\u061B\u061D\u0623\u066C\u0672cy;\u4403\u803B>\u403Emma\u0100;d\u05F7\u05F8\u4393;\u43DCreve;\u411E\u0180eiy\u0607\u060C\u0610dil;\u4122rc;\u411C;\u4413ot;\u4120r;\uC000\u{1D50A};\u62D9pf;\uC000\u{1D53E}eater\u0300EFGLST\u0635\u0644\u064E\u0656\u065B\u0666qual\u0100;L\u063E\u063F\u6265ess;\u62DBullEqual;\u6267reater;\u6AA2ess;\u6277lantEqual;\u6A7Eilde;\u6273cr;\uC000\u{1D4A2};\u626B\u0400Aacfiosu\u0685\u068B\u0696\u069B\u069E\u06AA\u06BE\u06CARDcy;\u442A\u0100ct\u0690\u0694ek;\u42C7;\u405Eirc;\u4124r;\u610ClbertSpace;\u610B\u01F0\u06AF\0\u06B2f;\u610DizontalLine;\u6500\u0100ct\u06C3\u06C5\xF2\u06A9rok;\u4126mp\u0144\u06D0\u06D8ownHum\xF0\u012Fqual;\u624F\u0700EJOacdfgmnostu\u06FA\u06FE\u0703\u0707\u070E\u071A\u071E\u0721\u0728\u0744\u0778\u078B\u078F\u0795cy;\u4415lig;\u4132cy;\u4401cute\u803B\xCD\u40CD\u0100iy\u0713\u0718rc\u803B\xCE\u40CE;\u4418ot;\u4130r;\u6111rave\u803B\xCC\u40CC\u0180;ap\u0720\u072F\u073F\u0100cg\u0734\u0737r;\u412AinaryI;\u6148lie\xF3\u03DD\u01F4\u0749\0\u0762\u0100;e\u074D\u074E\u622C\u0100gr\u0753\u0758ral;\u622Bsection;\u62C2isible\u0100CT\u076C\u0772omma;\u6063imes;\u6062\u0180gpt\u077F\u0783\u0788on;\u412Ef;\uC000\u{1D540}a;\u4399cr;\u6110ilde;\u4128\u01EB\u079A\0\u079Ecy;\u4406l\u803B\xCF\u40CF\u0280cfosu\u07AC\u07B7\u07BC\u07C2\u07D0\u0100iy\u07B1\u07B5rc;\u4134;\u4419r;\uC000\u{1D50D}pf;\uC000\u{1D541}\u01E3\u07C7\0\u07CCr;\uC000\u{1D4A5}rcy;\u4408kcy;\u4404\u0380HJacfos\u07E4\u07E8\u07EC\u07F1\u07FD\u0802\u0808cy;\u4425cy;\u440Cppa;\u439A\u0100ey\u07F6\u07FBdil;\u4136;\u441Ar;\uC000\u{1D50E}pf;\uC000\u{1D542}cr;\uC000\u{1D4A6}\u0580JTaceflmost\u0825\u0829\u082C\u0850\u0863\u09B3\u09B8\u09C7\u09CD\u0A37\u0A47cy;\u4409\u803B<\u403C\u0280cmnpr\u0837\u083C\u0841\u0844\u084Dute;\u4139bda;\u439Bg;\u67EAlacetrf;\u6112r;\u619E\u0180aey\u0857\u085C\u0861ron;\u413Ddil;\u413B;\u441B\u0100fs\u0868\u0970t\u0500ACDFRTUVar\u087E\u08A9\u08B1\u08E0\u08E6\u08FC\u092F\u095B\u0390\u096A\u0100nr\u0883\u088FgleBracket;\u67E8row\u0180;BR\u0899\u089A\u089E\u6190ar;\u61E4ightArrow;\u61C6eiling;\u6308o\u01F5\u08B7\0\u08C3bleBracket;\u67E6n\u01D4\u08C8\0\u08D2eeVector;\u6961ector\u0100;B\u08DB\u08DC\u61C3ar;\u6959loor;\u630Aight\u0100AV\u08EF\u08F5rrow;\u6194ector;\u694E\u0100er\u0901\u0917e\u0180;AV\u0909\u090A\u0910\u62A3rrow;\u61A4ector;\u695Aiangle\u0180;BE\u0924\u0925\u0929\u62B2ar;\u69CFqual;\u62B4p\u0180DTV\u0937\u0942\u094CownVector;\u6951eeVector;\u6960ector\u0100;B\u0956\u0957\u61BFar;\u6958ector\u0100;B\u0965\u0966\u61BCar;\u6952ight\xE1\u039Cs\u0300EFGLST\u097E\u098B\u0995\u099D\u09A2\u09ADqualGreater;\u62DAullEqual;\u6266reater;\u6276ess;\u6AA1lantEqual;\u6A7Dilde;\u6272r;\uC000\u{1D50F}\u0100;e\u09BD\u09BE\u62D8ftarrow;\u61DAidot;\u413F\u0180npw\u09D4\u0A16\u0A1Bg\u0200LRlr\u09DE\u09F7\u0A02\u0A10eft\u0100AR\u09E6\u09ECrrow;\u67F5ightArrow;\u67F7ightArrow;\u67F6eft\u0100ar\u03B3\u0A0Aight\xE1\u03BFight\xE1\u03CAf;\uC000\u{1D543}er\u0100LR\u0A22\u0A2CeftArrow;\u6199ightArrow;\u6198\u0180cht\u0A3E\u0A40\u0A42\xF2\u084C;\u61B0rok;\u4141;\u626A\u0400acefiosu\u0A5A\u0A5D\u0A60\u0A77\u0A7C\u0A85\u0A8B\u0A8Ep;\u6905y;\u441C\u0100dl\u0A65\u0A6FiumSpace;\u605Flintrf;\u6133r;\uC000\u{1D510}nusPlus;\u6213pf;\uC000\u{1D544}c\xF2\u0A76;\u439C\u0480Jacefostu\u0AA3\u0AA7\u0AAD\u0AC0\u0B14\u0B19\u0D91\u0D97\u0D9Ecy;\u440Acute;\u4143\u0180aey\u0AB4\u0AB9\u0ABEron;\u4147dil;\u4145;\u441D\u0180gsw\u0AC7\u0AF0\u0B0Eative\u0180MTV\u0AD3\u0ADF\u0AE8ediumSpace;\u600Bhi\u0100cn\u0AE6\u0AD8\xEB\u0AD9eryThi\xEE\u0AD9ted\u0100GL\u0AF8\u0B06reaterGreate\xF2\u0673essLes\xF3\u0A48Line;\u400Ar;\uC000\u{1D511}\u0200Bnpt\u0B22\u0B28\u0B37\u0B3Areak;\u6060BreakingSpace;\u40A0f;\u6115\u0680;CDEGHLNPRSTV\u0B55\u0B56\u0B6A\u0B7C\u0BA1\u0BEB\u0C04\u0C5E\u0C84\u0CA6\u0CD8\u0D61\u0D85\u6AEC\u0100ou\u0B5B\u0B64ngruent;\u6262pCap;\u626DoubleVerticalBar;\u6226\u0180lqx\u0B83\u0B8A\u0B9Bement;\u6209ual\u0100;T\u0B92\u0B93\u6260ilde;\uC000\u2242\u0338ists;\u6204reater\u0380;EFGLST\u0BB6\u0BB7\u0BBD\u0BC9\u0BD3\u0BD8\u0BE5\u626Fqual;\u6271ullEqual;\uC000\u2267\u0338reater;\uC000\u226B\u0338ess;\u6279lantEqual;\uC000\u2A7E\u0338ilde;\u6275ump\u0144\u0BF2\u0BFDownHump;\uC000\u224E\u0338qual;\uC000\u224F\u0338e\u0100fs\u0C0A\u0C27tTriangle\u0180;BE\u0C1A\u0C1B\u0C21\u62EAar;\uC000\u29CF\u0338qual;\u62ECs\u0300;EGLST\u0C35\u0C36\u0C3C\u0C44\u0C4B\u0C58\u626Equal;\u6270reater;\u6278ess;\uC000\u226A\u0338lantEqual;\uC000\u2A7D\u0338ilde;\u6274ested\u0100GL\u0C68\u0C79reaterGreater;\uC000\u2AA2\u0338essLess;\uC000\u2AA1\u0338recedes\u0180;ES\u0C92\u0C93\u0C9B\u6280qual;\uC000\u2AAF\u0338lantEqual;\u62E0\u0100ei\u0CAB\u0CB9verseElement;\u620CghtTriangle\u0180;BE\u0CCB\u0CCC\u0CD2\u62EBar;\uC000\u29D0\u0338qual;\u62ED\u0100qu\u0CDD\u0D0CuareSu\u0100bp\u0CE8\u0CF9set\u0100;E\u0CF0\u0CF3\uC000\u228F\u0338qual;\u62E2erset\u0100;E\u0D03\u0D06\uC000\u2290\u0338qual;\u62E3\u0180bcp\u0D13\u0D24\u0D4Eset\u0100;E\u0D1B\u0D1E\uC000\u2282\u20D2qual;\u6288ceeds\u0200;EST\u0D32\u0D33\u0D3B\u0D46\u6281qual;\uC000\u2AB0\u0338lantEqual;\u62E1ilde;\uC000\u227F\u0338erset\u0100;E\u0D58\u0D5B\uC000\u2283\u20D2qual;\u6289ilde\u0200;EFT\u0D6E\u0D6F\u0D75\u0D7F\u6241qual;\u6244ullEqual;\u6247ilde;\u6249erticalBar;\u6224cr;\uC000\u{1D4A9}ilde\u803B\xD1\u40D1;\u439D\u0700Eacdfgmoprstuv\u0DBD\u0DC2\u0DC9\u0DD5\u0DDB\u0DE0\u0DE7\u0DFC\u0E02\u0E20\u0E22\u0E32\u0E3F\u0E44lig;\u4152cute\u803B\xD3\u40D3\u0100iy\u0DCE\u0DD3rc\u803B\xD4\u40D4;\u441Eblac;\u4150r;\uC000\u{1D512}rave\u803B\xD2\u40D2\u0180aei\u0DEE\u0DF2\u0DF6cr;\u414Cga;\u43A9cron;\u439Fpf;\uC000\u{1D546}enCurly\u0100DQ\u0E0E\u0E1AoubleQuote;\u601Cuote;\u6018;\u6A54\u0100cl\u0E27\u0E2Cr;\uC000\u{1D4AA}ash\u803B\xD8\u40D8i\u016C\u0E37\u0E3Cde\u803B\xD5\u40D5es;\u6A37ml\u803B\xD6\u40D6er\u0100BP\u0E4B\u0E60\u0100ar\u0E50\u0E53r;\u603Eac\u0100ek\u0E5A\u0E5C;\u63DEet;\u63B4arenthesis;\u63DC\u0480acfhilors\u0E7F\u0E87\u0E8A\u0E8F\u0E92\u0E94\u0E9D\u0EB0\u0EFCrtialD;\u6202y;\u441Fr;\uC000\u{1D513}i;\u43A6;\u43A0usMinus;\u40B1\u0100ip\u0EA2\u0EADncareplan\xE5\u069Df;\u6119\u0200;eio\u0EB9\u0EBA\u0EE0\u0EE4\u6ABBcedes\u0200;EST\u0EC8\u0EC9\u0ECF\u0EDA\u627Aqual;\u6AAFlantEqual;\u627Cilde;\u627Eme;\u6033\u0100dp\u0EE9\u0EEEuct;\u620Fortion\u0100;a\u0225\u0EF9l;\u621D\u0100ci\u0F01\u0F06r;\uC000\u{1D4AB};\u43A8\u0200Ufos\u0F11\u0F16\u0F1B\u0F1FOT\u803B"\u4022r;\uC000\u{1D514}pf;\u611Acr;\uC000\u{1D4AC}\u0600BEacefhiorsu\u0F3E\u0F43\u0F47\u0F60\u0F73\u0FA7\u0FAA\u0FAD\u1096\u10A9\u10B4\u10BEarr;\u6910G\u803B\xAE\u40AE\u0180cnr\u0F4E\u0F53\u0F56ute;\u4154g;\u67EBr\u0100;t\u0F5C\u0F5D\u61A0l;\u6916\u0180aey\u0F67\u0F6C\u0F71ron;\u4158dil;\u4156;\u4420\u0100;v\u0F78\u0F79\u611Cerse\u0100EU\u0F82\u0F99\u0100lq\u0F87\u0F8Eement;\u620Builibrium;\u61CBpEquilibrium;\u696Fr\xBB\u0F79o;\u43A1ght\u0400ACDFTUVa\u0FC1\u0FEB\u0FF3\u1022\u1028\u105B\u1087\u03D8\u0100nr\u0FC6\u0FD2gleBracket;\u67E9row\u0180;BL\u0FDC\u0FDD\u0FE1\u6192ar;\u61E5eftArrow;\u61C4eiling;\u6309o\u01F5\u0FF9\0\u1005bleBracket;\u67E7n\u01D4\u100A\0\u1014eeVector;\u695Dector\u0100;B\u101D\u101E\u61C2ar;\u6955loor;\u630B\u0100er\u102D\u1043e\u0180;AV\u1035\u1036\u103C\u62A2rrow;\u61A6ector;\u695Biangle\u0180;BE\u1050\u1051\u1055\u62B3ar;\u69D0qual;\u62B5p\u0180DTV\u1063\u106E\u1078ownVector;\u694FeeVector;\u695Cector\u0100;B\u1082\u1083\u61BEar;\u6954ector\u0100;B\u1091\u1092\u61C0ar;\u6953\u0100pu\u109B\u109Ef;\u611DndImplies;\u6970ightarrow;\u61DB\u0100ch\u10B9\u10BCr;\u611B;\u61B1leDelayed;\u69F4\u0680HOacfhimoqstu\u10E4\u10F1\u10F7\u10FD\u1119\u111E\u1151\u1156\u1161\u1167\u11B5\u11BB\u11BF\u0100Cc\u10E9\u10EEHcy;\u4429y;\u4428FTcy;\u442Ccute;\u415A\u0280;aeiy\u1108\u1109\u110E\u1113\u1117\u6ABCron;\u4160dil;\u415Erc;\u415C;\u4421r;\uC000\u{1D516}ort\u0200DLRU\u112A\u1134\u113E\u1149ownArrow\xBB\u041EeftArrow\xBB\u089AightArrow\xBB\u0FDDpArrow;\u6191gma;\u43A3allCircle;\u6218pf;\uC000\u{1D54A}\u0272\u116D\0\0\u1170t;\u621Aare\u0200;ISU\u117B\u117C\u1189\u11AF\u65A1ntersection;\u6293u\u0100bp\u118F\u119Eset\u0100;E\u1197\u1198\u628Fqual;\u6291erset\u0100;E\u11A8\u11A9\u6290qual;\u6292nion;\u6294cr;\uC000\u{1D4AE}ar;\u62C6\u0200bcmp\u11C8\u11DB\u1209\u120B\u0100;s\u11CD\u11CE\u62D0et\u0100;E\u11CD\u11D5qual;\u6286\u0100ch\u11E0\u1205eeds\u0200;EST\u11ED\u11EE\u11F4\u11FF\u627Bqual;\u6AB0lantEqual;\u627Dilde;\u627FTh\xE1\u0F8C;\u6211\u0180;es\u1212\u1213\u1223\u62D1rset\u0100;E\u121C\u121D\u6283qual;\u6287et\xBB\u1213\u0580HRSacfhiors\u123E\u1244\u1249\u1255\u125E\u1271\u1276\u129F\u12C2\u12C8\u12D1ORN\u803B\xDE\u40DEADE;\u6122\u0100Hc\u124E\u1252cy;\u440By;\u4426\u0100bu\u125A\u125C;\u4009;\u43A4\u0180aey\u1265\u126A\u126Fron;\u4164dil;\u4162;\u4422r;\uC000\u{1D517}\u0100ei\u127B\u1289\u01F2\u1280\0\u1287efore;\u6234a;\u4398\u0100cn\u128E\u1298kSpace;\uC000\u205F\u200ASpace;\u6009lde\u0200;EFT\u12AB\u12AC\u12B2\u12BC\u623Cqual;\u6243ullEqual;\u6245ilde;\u6248pf;\uC000\u{1D54B}ipleDot;\u60DB\u0100ct\u12D6\u12DBr;\uC000\u{1D4AF}rok;\u4166\u0AE1\u12F7\u130E\u131A\u1326\0\u132C\u1331\0\0\0\0\0\u1338\u133D\u1377\u1385\0\u13FF\u1404\u140A\u1410\u0100cr\u12FB\u1301ute\u803B\xDA\u40DAr\u0100;o\u1307\u1308\u619Fcir;\u6949r\u01E3\u1313\0\u1316y;\u440Eve;\u416C\u0100iy\u131E\u1323rc\u803B\xDB\u40DB;\u4423blac;\u4170r;\uC000\u{1D518}rave\u803B\xD9\u40D9acr;\u416A\u0100di\u1341\u1369er\u0100BP\u1348\u135D\u0100ar\u134D\u1350r;\u405Fac\u0100ek\u1357\u1359;\u63DFet;\u63B5arenthesis;\u63DDon\u0100;P\u1370\u1371\u62C3lus;\u628E\u0100gp\u137B\u137Fon;\u4172f;\uC000\u{1D54C}\u0400ADETadps\u1395\u13AE\u13B8\u13C4\u03E8\u13D2\u13D7\u13F3rrow\u0180;BD\u1150\u13A0\u13A4ar;\u6912ownArrow;\u61C5ownArrow;\u6195quilibrium;\u696Eee\u0100;A\u13CB\u13CC\u62A5rrow;\u61A5own\xE1\u03F3er\u0100LR\u13DE\u13E8eftArrow;\u6196ightArrow;\u6197i\u0100;l\u13F9\u13FA\u43D2on;\u43A5ing;\u416Ecr;\uC000\u{1D4B0}ilde;\u4168ml\u803B\xDC\u40DC\u0480Dbcdefosv\u1427\u142C\u1430\u1433\u143E\u1485\u148A\u1490\u1496ash;\u62ABar;\u6AEBy;\u4412ash\u0100;l\u143B\u143C\u62A9;\u6AE6\u0100er\u1443\u1445;\u62C1\u0180bty\u144C\u1450\u147Aar;\u6016\u0100;i\u144F\u1455cal\u0200BLST\u1461\u1465\u146A\u1474ar;\u6223ine;\u407Ceparator;\u6758ilde;\u6240ThinSpace;\u600Ar;\uC000\u{1D519}pf;\uC000\u{1D54D}cr;\uC000\u{1D4B1}dash;\u62AA\u0280cefos\u14A7\u14AC\u14B1\u14B6\u14BCirc;\u4174dge;\u62C0r;\uC000\u{1D51A}pf;\uC000\u{1D54E}cr;\uC000\u{1D4B2}\u0200fios\u14CB\u14D0\u14D2\u14D8r;\uC000\u{1D51B};\u439Epf;\uC000\u{1D54F}cr;\uC000\u{1D4B3}\u0480AIUacfosu\u14F1\u14F5\u14F9\u14FD\u1504\u150F\u1514\u151A\u1520cy;\u442Fcy;\u4407cy;\u442Ecute\u803B\xDD\u40DD\u0100iy\u1509\u150Drc;\u4176;\u442Br;\uC000\u{1D51C}pf;\uC000\u{1D550}cr;\uC000\u{1D4B4}ml;\u4178\u0400Hacdefos\u1535\u1539\u153F\u154B\u154F\u155D\u1560\u1564cy;\u4416cute;\u4179\u0100ay\u1544\u1549ron;\u417D;\u4417ot;\u417B\u01F2\u1554\0\u155BoWidt\xE8\u0AD9a;\u4396r;\u6128pf;\u6124cr;\uC000\u{1D4B5}\u0BE1\u1583\u158A\u1590\0\u15B0\u15B6\u15BF\0\0\0\0\u15C6\u15DB\u15EB\u165F\u166D\0\u1695\u169B\u16B2\u16B9\0\u16BEcute\u803B\xE1\u40E1reve;\u4103\u0300;Ediuy\u159C\u159D\u15A1\u15A3\u15A8\u15AD\u623E;\uC000\u223E\u0333;\u623Frc\u803B\xE2\u40E2te\u80BB\xB4\u0306;\u4430lig\u803B\xE6\u40E6\u0100;r\xB2\u15BA;\uC000\u{1D51E}rave\u803B\xE0\u40E0\u0100ep\u15CA\u15D6\u0100fp\u15CF\u15D4sym;\u6135\xE8\u15D3ha;\u43B1\u0100ap\u15DFc\u0100cl\u15E4\u15E7r;\u4101g;\u6A3F\u0264\u15F0\0\0\u160A\u0280;adsv\u15FA\u15FB\u15FF\u1601\u1607\u6227nd;\u6A55;\u6A5Clope;\u6A58;\u6A5A\u0380;elmrsz\u1618\u1619\u161B\u161E\u163F\u164F\u1659\u6220;\u69A4e\xBB\u1619sd\u0100;a\u1625\u1626\u6221\u0461\u1630\u1632\u1634\u1636\u1638\u163A\u163C\u163E;\u69A8;\u69A9;\u69AA;\u69AB;\u69AC;\u69AD;\u69AE;\u69AFt\u0100;v\u1645\u1646\u621Fb\u0100;d\u164C\u164D\u62BE;\u699D\u0100pt\u1654\u1657h;\u6222\xBB\xB9arr;\u637C\u0100gp\u1663\u1667on;\u4105f;\uC000\u{1D552}\u0380;Eaeiop\u12C1\u167B\u167D\u1682\u1684\u1687\u168A;\u6A70cir;\u6A6F;\u624Ad;\u624Bs;\u4027rox\u0100;e\u12C1\u1692\xF1\u1683ing\u803B\xE5\u40E5\u0180cty\u16A1\u16A6\u16A8r;\uC000\u{1D4B6};\u402Amp\u0100;e\u12C1\u16AF\xF1\u0288ilde\u803B\xE3\u40E3ml\u803B\xE4\u40E4\u0100ci\u16C2\u16C8onin\xF4\u0272nt;\u6A11\u0800Nabcdefiklnoprsu\u16ED\u16F1\u1730\u173C\u1743\u1748\u1778\u177D\u17E0\u17E6\u1839\u1850\u170D\u193D\u1948\u1970ot;\u6AED\u0100cr\u16F6\u171Ek\u0200ceps\u1700\u1705\u170D\u1713ong;\u624Cpsilon;\u43F6rime;\u6035im\u0100;e\u171A\u171B\u623Dq;\u62CD\u0176\u1722\u1726ee;\u62BDed\u0100;g\u172C\u172D\u6305e\xBB\u172Drk\u0100;t\u135C\u1737brk;\u63B6\u0100oy\u1701\u1741;\u4431quo;\u601E\u0280cmprt\u1753\u175B\u1761\u1764\u1768aus\u0100;e\u010A\u0109ptyv;\u69B0s\xE9\u170Cno\xF5\u0113\u0180ahw\u176F\u1771\u1773;\u43B2;\u6136een;\u626Cr;\uC000\u{1D51F}g\u0380costuvw\u178D\u179D\u17B3\u17C1\u17D5\u17DB\u17DE\u0180aiu\u1794\u1796\u179A\xF0\u0760rc;\u65EFp\xBB\u1371\u0180dpt\u17A4\u17A8\u17ADot;\u6A00lus;\u6A01imes;\u6A02\u0271\u17B9\0\0\u17BEcup;\u6A06ar;\u6605riangle\u0100du\u17CD\u17D2own;\u65BDp;\u65B3plus;\u6A04e\xE5\u1444\xE5\u14ADarow;\u690D\u0180ako\u17ED\u1826\u1835\u0100cn\u17F2\u1823k\u0180lst\u17FA\u05AB\u1802ozenge;\u69EBriangle\u0200;dlr\u1812\u1813\u1818\u181D\u65B4own;\u65BEeft;\u65C2ight;\u65B8k;\u6423\u01B1\u182B\0\u1833\u01B2\u182F\0\u1831;\u6592;\u65914;\u6593ck;\u6588\u0100eo\u183E\u184D\u0100;q\u1843\u1846\uC000=\u20E5uiv;\uC000\u2261\u20E5t;\u6310\u0200ptwx\u1859\u185E\u1867\u186Cf;\uC000\u{1D553}\u0100;t\u13CB\u1863om\xBB\u13CCtie;\u62C8\u0600DHUVbdhmptuv\u1885\u1896\u18AA\u18BB\u18D7\u18DB\u18EC\u18FF\u1905\u190A\u1910\u1921\u0200LRlr\u188E\u1890\u1892\u1894;\u6557;\u6554;\u6556;\u6553\u0280;DUdu\u18A1\u18A2\u18A4\u18A6\u18A8\u6550;\u6566;\u6569;\u6564;\u6567\u0200LRlr\u18B3\u18B5\u18B7\u18B9;\u655D;\u655A;\u655C;\u6559\u0380;HLRhlr\u18CA\u18CB\u18CD\u18CF\u18D1\u18D3\u18D5\u6551;\u656C;\u6563;\u6560;\u656B;\u6562;\u655Fox;\u69C9\u0200LRlr\u18E4\u18E6\u18E8\u18EA;\u6555;\u6552;\u6510;\u650C\u0280;DUdu\u06BD\u18F7\u18F9\u18FB\u18FD;\u6565;\u6568;\u652C;\u6534inus;\u629Flus;\u629Eimes;\u62A0\u0200LRlr\u1919\u191B\u191D\u191F;\u655B;\u6558;\u6518;\u6514\u0380;HLRhlr\u1930\u1931\u1933\u1935\u1937\u1939\u193B\u6502;\u656A;\u6561;\u655E;\u653C;\u6524;\u651C\u0100ev\u0123\u1942bar\u803B\xA6\u40A6\u0200ceio\u1951\u1956\u195A\u1960r;\uC000\u{1D4B7}mi;\u604Fm\u0100;e\u171A\u171Cl\u0180;bh\u1968\u1969\u196B\u405C;\u69C5sub;\u67C8\u016C\u1974\u197El\u0100;e\u1979\u197A\u6022t\xBB\u197Ap\u0180;Ee\u012F\u1985\u1987;\u6AAE\u0100;q\u06DC\u06DB\u0CE1\u19A7\0\u19E8\u1A11\u1A15\u1A32\0\u1A37\u1A50\0\0\u1AB4\0\0\u1AC1\0\0\u1B21\u1B2E\u1B4D\u1B52\0\u1BFD\0\u1C0C\u0180cpr\u19AD\u19B2\u19DDute;\u4107\u0300;abcds\u19BF\u19C0\u19C4\u19CA\u19D5\u19D9\u6229nd;\u6A44rcup;\u6A49\u0100au\u19CF\u19D2p;\u6A4Bp;\u6A47ot;\u6A40;\uC000\u2229\uFE00\u0100eo\u19E2\u19E5t;\u6041\xEE\u0693\u0200aeiu\u19F0\u19FB\u1A01\u1A05\u01F0\u19F5\0\u19F8s;\u6A4Don;\u410Ddil\u803B\xE7\u40E7rc;\u4109ps\u0100;s\u1A0C\u1A0D\u6A4Cm;\u6A50ot;\u410B\u0180dmn\u1A1B\u1A20\u1A26il\u80BB\xB8\u01ADptyv;\u69B2t\u8100\xA2;e\u1A2D\u1A2E\u40A2r\xE4\u01B2r;\uC000\u{1D520}\u0180cei\u1A3D\u1A40\u1A4Dy;\u4447ck\u0100;m\u1A47\u1A48\u6713ark\xBB\u1A48;\u43C7r\u0380;Ecefms\u1A5F\u1A60\u1A62\u1A6B\u1AA4\u1AAA\u1AAE\u65CB;\u69C3\u0180;el\u1A69\u1A6A\u1A6D\u42C6q;\u6257e\u0261\u1A74\0\0\u1A88rrow\u0100lr\u1A7C\u1A81eft;\u61BAight;\u61BB\u0280RSacd\u1A92\u1A94\u1A96\u1A9A\u1A9F\xBB\u0F47;\u64C8st;\u629Birc;\u629Aash;\u629Dnint;\u6A10id;\u6AEFcir;\u69C2ubs\u0100;u\u1ABB\u1ABC\u6663it\xBB\u1ABC\u02EC\u1AC7\u1AD4\u1AFA\0\u1B0Aon\u0100;e\u1ACD\u1ACE\u403A\u0100;q\xC7\xC6\u026D\u1AD9\0\0\u1AE2a\u0100;t\u1ADE\u1ADF\u402C;\u4040\u0180;fl\u1AE8\u1AE9\u1AEB\u6201\xEE\u1160e\u0100mx\u1AF1\u1AF6ent\xBB\u1AE9e\xF3\u024D\u01E7\u1AFE\0\u1B07\u0100;d\u12BB\u1B02ot;\u6A6Dn\xF4\u0246\u0180fry\u1B10\u1B14\u1B17;\uC000\u{1D554}o\xE4\u0254\u8100\xA9;s\u0155\u1B1Dr;\u6117\u0100ao\u1B25\u1B29rr;\u61B5ss;\u6717\u0100cu\u1B32\u1B37r;\uC000\u{1D4B8}\u0100bp\u1B3C\u1B44\u0100;e\u1B41\u1B42\u6ACF;\u6AD1\u0100;e\u1B49\u1B4A\u6AD0;\u6AD2dot;\u62EF\u0380delprvw\u1B60\u1B6C\u1B77\u1B82\u1BAC\u1BD4\u1BF9arr\u0100lr\u1B68\u1B6A;\u6938;\u6935\u0270\u1B72\0\0\u1B75r;\u62DEc;\u62DFarr\u0100;p\u1B7F\u1B80\u61B6;\u693D\u0300;bcdos\u1B8F\u1B90\u1B96\u1BA1\u1BA5\u1BA8\u622Arcap;\u6A48\u0100au\u1B9B\u1B9Ep;\u6A46p;\u6A4Aot;\u628Dr;\u6A45;\uC000\u222A\uFE00\u0200alrv\u1BB5\u1BBF\u1BDE\u1BE3rr\u0100;m\u1BBC\u1BBD\u61B7;\u693Cy\u0180evw\u1BC7\u1BD4\u1BD8q\u0270\u1BCE\0\0\u1BD2re\xE3\u1B73u\xE3\u1B75ee;\u62CEedge;\u62CFen\u803B\xA4\u40A4earrow\u0100lr\u1BEE\u1BF3eft\xBB\u1B80ight\xBB\u1BBDe\xE4\u1BDD\u0100ci\u1C01\u1C07onin\xF4\u01F7nt;\u6231lcty;\u632D\u0980AHabcdefhijlorstuwz\u1C38\u1C3B\u1C3F\u1C5D\u1C69\u1C75\u1C8A\u1C9E\u1CAC\u1CB7\u1CFB\u1CFF\u1D0D\u1D7B\u1D91\u1DAB\u1DBB\u1DC6\u1DCDr\xF2\u0381ar;\u6965\u0200glrs\u1C48\u1C4D\u1C52\u1C54ger;\u6020eth;\u6138\xF2\u1133h\u0100;v\u1C5A\u1C5B\u6010\xBB\u090A\u016B\u1C61\u1C67arow;\u690Fa\xE3\u0315\u0100ay\u1C6E\u1C73ron;\u410F;\u4434\u0180;ao\u0332\u1C7C\u1C84\u0100gr\u02BF\u1C81r;\u61CAtseq;\u6A77\u0180glm\u1C91\u1C94\u1C98\u803B\xB0\u40B0ta;\u43B4ptyv;\u69B1\u0100ir\u1CA3\u1CA8sht;\u697F;\uC000\u{1D521}ar\u0100lr\u1CB3\u1CB5\xBB\u08DC\xBB\u101E\u0280aegsv\u1CC2\u0378\u1CD6\u1CDC\u1CE0m\u0180;os\u0326\u1CCA\u1CD4nd\u0100;s\u0326\u1CD1uit;\u6666amma;\u43DDin;\u62F2\u0180;io\u1CE7\u1CE8\u1CF8\u40F7de\u8100\xF7;o\u1CE7\u1CF0ntimes;\u62C7n\xF8\u1CF7cy;\u4452c\u026F\u1D06\0\0\u1D0Arn;\u631Eop;\u630D\u0280lptuw\u1D18\u1D1D\u1D22\u1D49\u1D55lar;\u4024f;\uC000\u{1D555}\u0280;emps\u030B\u1D2D\u1D37\u1D3D\u1D42q\u0100;d\u0352\u1D33ot;\u6251inus;\u6238lus;\u6214quare;\u62A1blebarwedg\xE5\xFAn\u0180adh\u112E\u1D5D\u1D67ownarrow\xF3\u1C83arpoon\u0100lr\u1D72\u1D76ef\xF4\u1CB4igh\xF4\u1CB6\u0162\u1D7F\u1D85karo\xF7\u0F42\u026F\u1D8A\0\0\u1D8Ern;\u631Fop;\u630C\u0180cot\u1D98\u1DA3\u1DA6\u0100ry\u1D9D\u1DA1;\uC000\u{1D4B9};\u4455l;\u69F6rok;\u4111\u0100dr\u1DB0\u1DB4ot;\u62F1i\u0100;f\u1DBA\u1816\u65BF\u0100ah\u1DC0\u1DC3r\xF2\u0429a\xF2\u0FA6angle;\u69A6\u0100ci\u1DD2\u1DD5y;\u445Fgrarr;\u67FF\u0900Dacdefglmnopqrstux\u1E01\u1E09\u1E19\u1E38\u0578\u1E3C\u1E49\u1E61\u1E7E\u1EA5\u1EAF\u1EBD\u1EE1\u1F2A\u1F37\u1F44\u1F4E\u1F5A\u0100Do\u1E06\u1D34o\xF4\u1C89\u0100cs\u1E0E\u1E14ute\u803B\xE9\u40E9ter;\u6A6E\u0200aioy\u1E22\u1E27\u1E31\u1E36ron;\u411Br\u0100;c\u1E2D\u1E2E\u6256\u803B\xEA\u40EAlon;\u6255;\u444Dot;\u4117\u0100Dr\u1E41\u1E45ot;\u6252;\uC000\u{1D522}\u0180;rs\u1E50\u1E51\u1E57\u6A9Aave\u803B\xE8\u40E8\u0100;d\u1E5C\u1E5D\u6A96ot;\u6A98\u0200;ils\u1E6A\u1E6B\u1E72\u1E74\u6A99nters;\u63E7;\u6113\u0100;d\u1E79\u1E7A\u6A95ot;\u6A97\u0180aps\u1E85\u1E89\u1E97cr;\u4113ty\u0180;sv\u1E92\u1E93\u1E95\u6205et\xBB\u1E93p\u01001;\u1E9D\u1EA4\u0133\u1EA1\u1EA3;\u6004;\u6005\u6003\u0100gs\u1EAA\u1EAC;\u414Bp;\u6002\u0100gp\u1EB4\u1EB8on;\u4119f;\uC000\u{1D556}\u0180als\u1EC4\u1ECE\u1ED2r\u0100;s\u1ECA\u1ECB\u62D5l;\u69E3us;\u6A71i\u0180;lv\u1EDA\u1EDB\u1EDF\u43B5on\xBB\u1EDB;\u43F5\u0200csuv\u1EEA\u1EF3\u1F0B\u1F23\u0100io\u1EEF\u1E31rc\xBB\u1E2E\u0269\u1EF9\0\0\u1EFB\xED\u0548ant\u0100gl\u1F02\u1F06tr\xBB\u1E5Dess\xBB\u1E7A\u0180aei\u1F12\u1F16\u1F1Als;\u403Dst;\u625Fv\u0100;D\u0235\u1F20D;\u6A78parsl;\u69E5\u0100Da\u1F2F\u1F33ot;\u6253rr;\u6971\u0180cdi\u1F3E\u1F41\u1EF8r;\u612Fo\xF4\u0352\u0100ah\u1F49\u1F4B;\u43B7\u803B\xF0\u40F0\u0100mr\u1F53\u1F57l\u803B\xEB\u40EBo;\u60AC\u0180cip\u1F61\u1F64\u1F67l;\u4021s\xF4\u056E\u0100eo\u1F6C\u1F74ctatio\xEE\u0559nential\xE5\u0579\u09E1\u1F92\0\u1F9E\0\u1FA1\u1FA7\0\0\u1FC6\u1FCC\0\u1FD3\0\u1FE6\u1FEA\u2000\0\u2008\u205Allingdotse\xF1\u1E44y;\u4444male;\u6640\u0180ilr\u1FAD\u1FB3\u1FC1lig;\u8000\uFB03\u0269\u1FB9\0\0\u1FBDg;\u8000\uFB00ig;\u8000\uFB04;\uC000\u{1D523}lig;\u8000\uFB01lig;\uC000fj\u0180alt\u1FD9\u1FDC\u1FE1t;\u666Dig;\u8000\uFB02ns;\u65B1of;\u4192\u01F0\u1FEE\0\u1FF3f;\uC000\u{1D557}\u0100ak\u05BF\u1FF7\u0100;v\u1FFC\u1FFD\u62D4;\u6AD9artint;\u6A0D\u0100ao\u200C\u2055\u0100cs\u2011\u2052\u03B1\u201A\u2030\u2038\u2045\u2048\0\u2050\u03B2\u2022\u2025\u2027\u202A\u202C\0\u202E\u803B\xBD\u40BD;\u6153\u803B\xBC\u40BC;\u6155;\u6159;\u615B\u01B3\u2034\0\u2036;\u6154;\u6156\u02B4\u203E\u2041\0\0\u2043\u803B\xBE\u40BE;\u6157;\u615C5;\u6158\u01B6\u204C\0\u204E;\u615A;\u615D8;\u615El;\u6044wn;\u6322cr;\uC000\u{1D4BB}\u0880Eabcdefgijlnorstv\u2082\u2089\u209F\u20A5\u20B0\u20B4\u20F0\u20F5\u20FA\u20FF\u2103\u2112\u2138\u0317\u213E\u2152\u219E\u0100;l\u064D\u2087;\u6A8C\u0180cmp\u2090\u2095\u209Dute;\u41F5ma\u0100;d\u209C\u1CDA\u43B3;\u6A86reve;\u411F\u0100iy\u20AA\u20AErc;\u411D;\u4433ot;\u4121\u0200;lqs\u063E\u0642\u20BD\u20C9\u0180;qs\u063E\u064C\u20C4lan\xF4\u0665\u0200;cdl\u0665\u20D2\u20D5\u20E5c;\u6AA9ot\u0100;o\u20DC\u20DD\u6A80\u0100;l\u20E2\u20E3\u6A82;\u6A84\u0100;e\u20EA\u20ED\uC000\u22DB\uFE00s;\u6A94r;\uC000\u{1D524}\u0100;g\u0673\u061Bmel;\u6137cy;\u4453\u0200;Eaj\u065A\u210C\u210E\u2110;\u6A92;\u6AA5;\u6AA4\u0200Eaes\u211B\u211D\u2129\u2134;\u6269p\u0100;p\u2123\u2124\u6A8Arox\xBB\u2124\u0100;q\u212E\u212F\u6A88\u0100;q\u212E\u211Bim;\u62E7pf;\uC000\u{1D558}\u0100ci\u2143\u2146r;\u610Am\u0180;el\u066B\u214E\u2150;\u6A8E;\u6A90\u8300>;cdlqr\u05EE\u2160\u216A\u216E\u2173\u2179\u0100ci\u2165\u2167;\u6AA7r;\u6A7Aot;\u62D7Par;\u6995uest;\u6A7C\u0280adels\u2184\u216A\u2190\u0656\u219B\u01F0\u2189\0\u218Epro\xF8\u209Er;\u6978q\u0100lq\u063F\u2196les\xF3\u2088i\xED\u066B\u0100en\u21A3\u21ADrtneqq;\uC000\u2269\uFE00\xC5\u21AA\u0500Aabcefkosy\u21C4\u21C7\u21F1\u21F5\u21FA\u2218\u221D\u222F\u2268\u227Dr\xF2\u03A0\u0200ilmr\u21D0\u21D4\u21D7\u21DBrs\xF0\u1484f\xBB\u2024il\xF4\u06A9\u0100dr\u21E0\u21E4cy;\u444A\u0180;cw\u08F4\u21EB\u21EFir;\u6948;\u61ADar;\u610Firc;\u4125\u0180alr\u2201\u220E\u2213rts\u0100;u\u2209\u220A\u6665it\xBB\u220Alip;\u6026con;\u62B9r;\uC000\u{1D525}s\u0100ew\u2223\u2229arow;\u6925arow;\u6926\u0280amopr\u223A\u223E\u2243\u225E\u2263rr;\u61FFtht;\u623Bk\u0100lr\u2249\u2253eftarrow;\u61A9ightarrow;\u61AAf;\uC000\u{1D559}bar;\u6015\u0180clt\u226F\u2274\u2278r;\uC000\u{1D4BD}as\xE8\u21F4rok;\u4127\u0100bp\u2282\u2287ull;\u6043hen\xBB\u1C5B\u0AE1\u22A3\0\u22AA\0\u22B8\u22C5\u22CE\0\u22D5\u22F3\0\0\u22F8\u2322\u2367\u2362\u237F\0\u2386\u23AA\u23B4cute\u803B\xED\u40ED\u0180;iy\u0771\u22B0\u22B5rc\u803B\xEE\u40EE;\u4438\u0100cx\u22BC\u22BFy;\u4435cl\u803B\xA1\u40A1\u0100fr\u039F\u22C9;\uC000\u{1D526}rave\u803B\xEC\u40EC\u0200;ino\u073E\u22DD\u22E9\u22EE\u0100in\u22E2\u22E6nt;\u6A0Ct;\u622Dfin;\u69DCta;\u6129lig;\u4133\u0180aop\u22FE\u231A\u231D\u0180cgt\u2305\u2308\u2317r;\u412B\u0180elp\u071F\u230F\u2313in\xE5\u078Ear\xF4\u0720h;\u4131f;\u62B7ed;\u41B5\u0280;cfot\u04F4\u232C\u2331\u233D\u2341are;\u6105in\u0100;t\u2338\u2339\u621Eie;\u69DDdo\xF4\u2319\u0280;celp\u0757\u234C\u2350\u235B\u2361al;\u62BA\u0100gr\u2355\u2359er\xF3\u1563\xE3\u234Darhk;\u6A17rod;\u6A3C\u0200cgpt\u236F\u2372\u2376\u237By;\u4451on;\u412Ff;\uC000\u{1D55A}a;\u43B9uest\u803B\xBF\u40BF\u0100ci\u238A\u238Fr;\uC000\u{1D4BE}n\u0280;Edsv\u04F4\u239B\u239D\u23A1\u04F3;\u62F9ot;\u62F5\u0100;v\u23A6\u23A7\u62F4;\u62F3\u0100;i\u0777\u23AElde;\u4129\u01EB\u23B8\0\u23BCcy;\u4456l\u803B\xEF\u40EF\u0300cfmosu\u23CC\u23D7\u23DC\u23E1\u23E7\u23F5\u0100iy\u23D1\u23D5rc;\u4135;\u4439r;\uC000\u{1D527}ath;\u4237pf;\uC000\u{1D55B}\u01E3\u23EC\0\u23F1r;\uC000\u{1D4BF}rcy;\u4458kcy;\u4454\u0400acfghjos\u240B\u2416\u2422\u2427\u242D\u2431\u2435\u243Bppa\u0100;v\u2413\u2414\u43BA;\u43F0\u0100ey\u241B\u2420dil;\u4137;\u443Ar;\uC000\u{1D528}reen;\u4138cy;\u4445cy;\u445Cpf;\uC000\u{1D55C}cr;\uC000\u{1D4C0}\u0B80ABEHabcdefghjlmnoprstuv\u2470\u2481\u2486\u248D\u2491\u250E\u253D\u255A\u2580\u264E\u265E\u2665\u2679\u267D\u269A\u26B2\u26D8\u275D\u2768\u278B\u27C0\u2801\u2812\u0180art\u2477\u247A\u247Cr\xF2\u09C6\xF2\u0395ail;\u691Barr;\u690E\u0100;g\u0994\u248B;\u6A8Bar;\u6962\u0963\u24A5\0\u24AA\0\u24B1\0\0\0\0\0\u24B5\u24BA\0\u24C6\u24C8\u24CD\0\u24F9ute;\u413Amptyv;\u69B4ra\xEE\u084Cbda;\u43BBg\u0180;dl\u088E\u24C1\u24C3;\u6991\xE5\u088E;\u6A85uo\u803B\xAB\u40ABr\u0400;bfhlpst\u0899\u24DE\u24E6\u24E9\u24EB\u24EE\u24F1\u24F5\u0100;f\u089D\u24E3s;\u691Fs;\u691D\xEB\u2252p;\u61ABl;\u6939im;\u6973l;\u61A2\u0180;ae\u24FF\u2500\u2504\u6AABil;\u6919\u0100;s\u2509\u250A\u6AAD;\uC000\u2AAD\uFE00\u0180abr\u2515\u2519\u251Drr;\u690Crk;\u6772\u0100ak\u2522\u252Cc\u0100ek\u2528\u252A;\u407B;\u405B\u0100es\u2531\u2533;\u698Bl\u0100du\u2539\u253B;\u698F;\u698D\u0200aeuy\u2546\u254B\u2556\u2558ron;\u413E\u0100di\u2550\u2554il;\u413C\xEC\u08B0\xE2\u2529;\u443B\u0200cqrs\u2563\u2566\u256D\u257Da;\u6936uo\u0100;r\u0E19\u1746\u0100du\u2572\u2577har;\u6967shar;\u694Bh;\u61B2\u0280;fgqs\u258B\u258C\u0989\u25F3\u25FF\u6264t\u0280ahlrt\u2598\u25A4\u25B7\u25C2\u25E8rrow\u0100;t\u0899\u25A1a\xE9\u24F6arpoon\u0100du\u25AF\u25B4own\xBB\u045Ap\xBB\u0966eftarrows;\u61C7ight\u0180ahs\u25CD\u25D6\u25DErrow\u0100;s\u08F4\u08A7arpoon\xF3\u0F98quigarro\xF7\u21F0hreetimes;\u62CB\u0180;qs\u258B\u0993\u25FAlan\xF4\u09AC\u0280;cdgs\u09AC\u260A\u260D\u261D\u2628c;\u6AA8ot\u0100;o\u2614\u2615\u6A7F\u0100;r\u261A\u261B\u6A81;\u6A83\u0100;e\u2622\u2625\uC000\u22DA\uFE00s;\u6A93\u0280adegs\u2633\u2639\u263D\u2649\u264Bppro\xF8\u24C6ot;\u62D6q\u0100gq\u2643\u2645\xF4\u0989gt\xF2\u248C\xF4\u099Bi\xED\u09B2\u0180ilr\u2655\u08E1\u265Asht;\u697C;\uC000\u{1D529}\u0100;E\u099C\u2663;\u6A91\u0161\u2669\u2676r\u0100du\u25B2\u266E\u0100;l\u0965\u2673;\u696Alk;\u6584cy;\u4459\u0280;acht\u0A48\u2688\u268B\u2691\u2696r\xF2\u25C1orne\xF2\u1D08ard;\u696Bri;\u65FA\u0100io\u269F\u26A4dot;\u4140ust\u0100;a\u26AC\u26AD\u63B0che\xBB\u26AD\u0200Eaes\u26BB\u26BD\u26C9\u26D4;\u6268p\u0100;p\u26C3\u26C4\u6A89rox\xBB\u26C4\u0100;q\u26CE\u26CF\u6A87\u0100;q\u26CE\u26BBim;\u62E6\u0400abnoptwz\u26E9\u26F4\u26F7\u271A\u272F\u2741\u2747\u2750\u0100nr\u26EE\u26F1g;\u67ECr;\u61FDr\xEB\u08C1g\u0180lmr\u26FF\u270D\u2714eft\u0100ar\u09E6\u2707ight\xE1\u09F2apsto;\u67FCight\xE1\u09FDparrow\u0100lr\u2725\u2729ef\xF4\u24EDight;\u61AC\u0180afl\u2736\u2739\u273Dr;\u6985;\uC000\u{1D55D}us;\u6A2Dimes;\u6A34\u0161\u274B\u274Fst;\u6217\xE1\u134E\u0180;ef\u2757\u2758\u1800\u65CAnge\xBB\u2758ar\u0100;l\u2764\u2765\u4028t;\u6993\u0280achmt\u2773\u2776\u277C\u2785\u2787r\xF2\u08A8orne\xF2\u1D8Car\u0100;d\u0F98\u2783;\u696D;\u600Eri;\u62BF\u0300achiqt\u2798\u279D\u0A40\u27A2\u27AE\u27BBquo;\u6039r;\uC000\u{1D4C1}m\u0180;eg\u09B2\u27AA\u27AC;\u6A8D;\u6A8F\u0100bu\u252A\u27B3o\u0100;r\u0E1F\u27B9;\u601Arok;\u4142\u8400<;cdhilqr\u082B\u27D2\u2639\u27DC\u27E0\u27E5\u27EA\u27F0\u0100ci\u27D7\u27D9;\u6AA6r;\u6A79re\xE5\u25F2mes;\u62C9arr;\u6976uest;\u6A7B\u0100Pi\u27F5\u27F9ar;\u6996\u0180;ef\u2800\u092D\u181B\u65C3r\u0100du\u2807\u280Dshar;\u694Ahar;\u6966\u0100en\u2817\u2821rtneqq;\uC000\u2268\uFE00\xC5\u281E\u0700Dacdefhilnopsu\u2840\u2845\u2882\u288E\u2893\u28A0\u28A5\u28A8\u28DA\u28E2\u28E4\u0A83\u28F3\u2902Dot;\u623A\u0200clpr\u284E\u2852\u2863\u287Dr\u803B\xAF\u40AF\u0100et\u2857\u2859;\u6642\u0100;e\u285E\u285F\u6720se\xBB\u285F\u0100;s\u103B\u2868to\u0200;dlu\u103B\u2873\u2877\u287Bow\xEE\u048Cef\xF4\u090F\xF0\u13D1ker;\u65AE\u0100oy\u2887\u288Cmma;\u6A29;\u443Cash;\u6014asuredangle\xBB\u1626r;\uC000\u{1D52A}o;\u6127\u0180cdn\u28AF\u28B4\u28C9ro\u803B\xB5\u40B5\u0200;acd\u1464\u28BD\u28C0\u28C4s\xF4\u16A7ir;\u6AF0ot\u80BB\xB7\u01B5us\u0180;bd\u28D2\u1903\u28D3\u6212\u0100;u\u1D3C\u28D8;\u6A2A\u0163\u28DE\u28E1p;\u6ADB\xF2\u2212\xF0\u0A81\u0100dp\u28E9\u28EEels;\u62A7f;\uC000\u{1D55E}\u0100ct\u28F8\u28FDr;\uC000\u{1D4C2}pos\xBB\u159D\u0180;lm\u2909\u290A\u290D\u43BCtimap;\u62B8\u0C00GLRVabcdefghijlmoprstuvw\u2942\u2953\u297E\u2989\u2998\u29DA\u29E9\u2A15\u2A1A\u2A58\u2A5D\u2A83\u2A95\u2AA4\u2AA8\u2B04\u2B07\u2B44\u2B7F\u2BAE\u2C34\u2C67\u2C7C\u2CE9\u0100gt\u2947\u294B;\uC000\u22D9\u0338\u0100;v\u2950\u0BCF\uC000\u226B\u20D2\u0180elt\u295A\u2972\u2976ft\u0100ar\u2961\u2967rrow;\u61CDightarrow;\u61CE;\uC000\u22D8\u0338\u0100;v\u297B\u0C47\uC000\u226A\u20D2ightarrow;\u61CF\u0100Dd\u298E\u2993ash;\u62AFash;\u62AE\u0280bcnpt\u29A3\u29A7\u29AC\u29B1\u29CCla\xBB\u02DEute;\u4144g;\uC000\u2220\u20D2\u0280;Eiop\u0D84\u29BC\u29C0\u29C5\u29C8;\uC000\u2A70\u0338d;\uC000\u224B\u0338s;\u4149ro\xF8\u0D84ur\u0100;a\u29D3\u29D4\u666El\u0100;s\u29D3\u0B38\u01F3\u29DF\0\u29E3p\u80BB\xA0\u0B37mp\u0100;e\u0BF9\u0C00\u0280aeouy\u29F4\u29FE\u2A03\u2A10\u2A13\u01F0\u29F9\0\u29FB;\u6A43on;\u4148dil;\u4146ng\u0100;d\u0D7E\u2A0Aot;\uC000\u2A6D\u0338p;\u6A42;\u443Dash;\u6013\u0380;Aadqsx\u0B92\u2A29\u2A2D\u2A3B\u2A41\u2A45\u2A50rr;\u61D7r\u0100hr\u2A33\u2A36k;\u6924\u0100;o\u13F2\u13F0ot;\uC000\u2250\u0338ui\xF6\u0B63\u0100ei\u2A4A\u2A4Ear;\u6928\xED\u0B98ist\u0100;s\u0BA0\u0B9Fr;\uC000\u{1D52B}\u0200Eest\u0BC5\u2A66\u2A79\u2A7C\u0180;qs\u0BBC\u2A6D\u0BE1\u0180;qs\u0BBC\u0BC5\u2A74lan\xF4\u0BE2i\xED\u0BEA\u0100;r\u0BB6\u2A81\xBB\u0BB7\u0180Aap\u2A8A\u2A8D\u2A91r\xF2\u2971rr;\u61AEar;\u6AF2\u0180;sv\u0F8D\u2A9C\u0F8C\u0100;d\u2AA1\u2AA2\u62FC;\u62FAcy;\u445A\u0380AEadest\u2AB7\u2ABA\u2ABE\u2AC2\u2AC5\u2AF6\u2AF9r\xF2\u2966;\uC000\u2266\u0338rr;\u619Ar;\u6025\u0200;fqs\u0C3B\u2ACE\u2AE3\u2AEFt\u0100ar\u2AD4\u2AD9rro\xF7\u2AC1ightarro\xF7\u2A90\u0180;qs\u0C3B\u2ABA\u2AEAlan\xF4\u0C55\u0100;s\u0C55\u2AF4\xBB\u0C36i\xED\u0C5D\u0100;r\u0C35\u2AFEi\u0100;e\u0C1A\u0C25i\xE4\u0D90\u0100pt\u2B0C\u2B11f;\uC000\u{1D55F}\u8180\xAC;in\u2B19\u2B1A\u2B36\u40ACn\u0200;Edv\u0B89\u2B24\u2B28\u2B2E;\uC000\u22F9\u0338ot;\uC000\u22F5\u0338\u01E1\u0B89\u2B33\u2B35;\u62F7;\u62F6i\u0100;v\u0CB8\u2B3C\u01E1\u0CB8\u2B41\u2B43;\u62FE;\u62FD\u0180aor\u2B4B\u2B63\u2B69r\u0200;ast\u0B7B\u2B55\u2B5A\u2B5Flle\xEC\u0B7Bl;\uC000\u2AFD\u20E5;\uC000\u2202\u0338lint;\u6A14\u0180;ce\u0C92\u2B70\u2B73u\xE5\u0CA5\u0100;c\u0C98\u2B78\u0100;e\u0C92\u2B7D\xF1\u0C98\u0200Aait\u2B88\u2B8B\u2B9D\u2BA7r\xF2\u2988rr\u0180;cw\u2B94\u2B95\u2B99\u619B;\uC000\u2933\u0338;\uC000\u219D\u0338ghtarrow\xBB\u2B95ri\u0100;e\u0CCB\u0CD6\u0380chimpqu\u2BBD\u2BCD\u2BD9\u2B04\u0B78\u2BE4\u2BEF\u0200;cer\u0D32\u2BC6\u0D37\u2BC9u\xE5\u0D45;\uC000\u{1D4C3}ort\u026D\u2B05\0\0\u2BD6ar\xE1\u2B56m\u0100;e\u0D6E\u2BDF\u0100;q\u0D74\u0D73su\u0100bp\u2BEB\u2BED\xE5\u0CF8\xE5\u0D0B\u0180bcp\u2BF6\u2C11\u2C19\u0200;Ees\u2BFF\u2C00\u0D22\u2C04\u6284;\uC000\u2AC5\u0338et\u0100;e\u0D1B\u2C0Bq\u0100;q\u0D23\u2C00c\u0100;e\u0D32\u2C17\xF1\u0D38\u0200;Ees\u2C22\u2C23\u0D5F\u2C27\u6285;\uC000\u2AC6\u0338et\u0100;e\u0D58\u2C2Eq\u0100;q\u0D60\u2C23\u0200gilr\u2C3D\u2C3F\u2C45\u2C47\xEC\u0BD7lde\u803B\xF1\u40F1\xE7\u0C43iangle\u0100lr\u2C52\u2C5Ceft\u0100;e\u0C1A\u2C5A\xF1\u0C26ight\u0100;e\u0CCB\u2C65\xF1\u0CD7\u0100;m\u2C6C\u2C6D\u43BD\u0180;es\u2C74\u2C75\u2C79\u4023ro;\u6116p;\u6007\u0480DHadgilrs\u2C8F\u2C94\u2C99\u2C9E\u2CA3\u2CB0\u2CB6\u2CD3\u2CE3ash;\u62ADarr;\u6904p;\uC000\u224D\u20D2ash;\u62AC\u0100et\u2CA8\u2CAC;\uC000\u2265\u20D2;\uC000>\u20D2nfin;\u69DE\u0180Aet\u2CBD\u2CC1\u2CC5rr;\u6902;\uC000\u2264\u20D2\u0100;r\u2CCA\u2CCD\uC000<\u20D2ie;\uC000\u22B4\u20D2\u0100At\u2CD8\u2CDCrr;\u6903rie;\uC000\u22B5\u20D2im;\uC000\u223C\u20D2\u0180Aan\u2CF0\u2CF4\u2D02rr;\u61D6r\u0100hr\u2CFA\u2CFDk;\u6923\u0100;o\u13E7\u13E5ear;\u6927\u1253\u1A95\0\0\0\0\0\0\0\0\0\0\0\0\0\u2D2D\0\u2D38\u2D48\u2D60\u2D65\u2D72\u2D84\u1B07\0\0\u2D8D\u2DAB\0\u2DC8\u2DCE\0\u2DDC\u2E19\u2E2B\u2E3E\u2E43\u0100cs\u2D31\u1A97ute\u803B\xF3\u40F3\u0100iy\u2D3C\u2D45r\u0100;c\u1A9E\u2D42\u803B\xF4\u40F4;\u443E\u0280abios\u1AA0\u2D52\u2D57\u01C8\u2D5Alac;\u4151v;\u6A38old;\u69BClig;\u4153\u0100cr\u2D69\u2D6Dir;\u69BF;\uC000\u{1D52C}\u036F\u2D79\0\0\u2D7C\0\u2D82n;\u42DBave\u803B\xF2\u40F2;\u69C1\u0100bm\u2D88\u0DF4ar;\u69B5\u0200acit\u2D95\u2D98\u2DA5\u2DA8r\xF2\u1A80\u0100ir\u2D9D\u2DA0r;\u69BEoss;\u69BBn\xE5\u0E52;\u69C0\u0180aei\u2DB1\u2DB5\u2DB9cr;\u414Dga;\u43C9\u0180cdn\u2DC0\u2DC5\u01CDron;\u43BF;\u69B6pf;\uC000\u{1D560}\u0180ael\u2DD4\u2DD7\u01D2r;\u69B7rp;\u69B9\u0380;adiosv\u2DEA\u2DEB\u2DEE\u2E08\u2E0D\u2E10\u2E16\u6228r\xF2\u1A86\u0200;efm\u2DF7\u2DF8\u2E02\u2E05\u6A5Dr\u0100;o\u2DFE\u2DFF\u6134f\xBB\u2DFF\u803B\xAA\u40AA\u803B\xBA\u40BAgof;\u62B6r;\u6A56lope;\u6A57;\u6A5B\u0180clo\u2E1F\u2E21\u2E27\xF2\u2E01ash\u803B\xF8\u40F8l;\u6298i\u016C\u2E2F\u2E34de\u803B\xF5\u40F5es\u0100;a\u01DB\u2E3As;\u6A36ml\u803B\xF6\u40F6bar;\u633D\u0AE1\u2E5E\0\u2E7D\0\u2E80\u2E9D\0\u2EA2\u2EB9\0\0\u2ECB\u0E9C\0\u2F13\0\0\u2F2B\u2FBC\0\u2FC8r\u0200;ast\u0403\u2E67\u2E72\u0E85\u8100\xB6;l\u2E6D\u2E6E\u40B6le\xEC\u0403\u0269\u2E78\0\0\u2E7Bm;\u6AF3;\u6AFDy;\u443Fr\u0280cimpt\u2E8B\u2E8F\u2E93\u1865\u2E97nt;\u4025od;\u402Eil;\u6030enk;\u6031r;\uC000\u{1D52D}\u0180imo\u2EA8\u2EB0\u2EB4\u0100;v\u2EAD\u2EAE\u43C6;\u43D5ma\xF4\u0A76ne;\u660E\u0180;tv\u2EBF\u2EC0\u2EC8\u43C0chfork\xBB\u1FFD;\u43D6\u0100au\u2ECF\u2EDFn\u0100ck\u2ED5\u2EDDk\u0100;h\u21F4\u2EDB;\u610E\xF6\u21F4s\u0480;abcdemst\u2EF3\u2EF4\u1908\u2EF9\u2EFD\u2F04\u2F06\u2F0A\u2F0E\u402Bcir;\u6A23ir;\u6A22\u0100ou\u1D40\u2F02;\u6A25;\u6A72n\u80BB\xB1\u0E9Dim;\u6A26wo;\u6A27\u0180ipu\u2F19\u2F20\u2F25ntint;\u6A15f;\uC000\u{1D561}nd\u803B\xA3\u40A3\u0500;Eaceinosu\u0EC8\u2F3F\u2F41\u2F44\u2F47\u2F81\u2F89\u2F92\u2F7E\u2FB6;\u6AB3p;\u6AB7u\xE5\u0ED9\u0100;c\u0ECE\u2F4C\u0300;acens\u0EC8\u2F59\u2F5F\u2F66\u2F68\u2F7Eppro\xF8\u2F43urlye\xF1\u0ED9\xF1\u0ECE\u0180aes\u2F6F\u2F76\u2F7Approx;\u6AB9qq;\u6AB5im;\u62E8i\xED\u0EDFme\u0100;s\u2F88\u0EAE\u6032\u0180Eas\u2F78\u2F90\u2F7A\xF0\u2F75\u0180dfp\u0EEC\u2F99\u2FAF\u0180als\u2FA0\u2FA5\u2FAAlar;\u632Eine;\u6312urf;\u6313\u0100;t\u0EFB\u2FB4\xEF\u0EFBrel;\u62B0\u0100ci\u2FC0\u2FC5r;\uC000\u{1D4C5};\u43C8ncsp;\u6008\u0300fiopsu\u2FDA\u22E2\u2FDF\u2FE5\u2FEB\u2FF1r;\uC000\u{1D52E}pf;\uC000\u{1D562}rime;\u6057cr;\uC000\u{1D4C6}\u0180aeo\u2FF8\u3009\u3013t\u0100ei\u2FFE\u3005rnion\xF3\u06B0nt;\u6A16st\u0100;e\u3010\u3011\u403F\xF1\u1F19\xF4\u0F14\u0A80ABHabcdefhilmnoprstux\u3040\u3051\u3055\u3059\u30E0\u310E\u312B\u3147\u3162\u3172\u318E\u3206\u3215\u3224\u3229\u3258\u326E\u3272\u3290\u32B0\u32B7\u0180art\u3047\u304A\u304Cr\xF2\u10B3\xF2\u03DDail;\u691Car\xF2\u1C65ar;\u6964\u0380cdenqrt\u3068\u3075\u3078\u307F\u308F\u3094\u30CC\u0100eu\u306D\u3071;\uC000\u223D\u0331te;\u4155i\xE3\u116Emptyv;\u69B3g\u0200;del\u0FD1\u3089\u308B\u308D;\u6992;\u69A5\xE5\u0FD1uo\u803B\xBB\u40BBr\u0580;abcfhlpstw\u0FDC\u30AC\u30AF\u30B7\u30B9\u30BC\u30BE\u30C0\u30C3\u30C7\u30CAp;\u6975\u0100;f\u0FE0\u30B4s;\u6920;\u6933s;\u691E\xEB\u225D\xF0\u272El;\u6945im;\u6974l;\u61A3;\u619D\u0100ai\u30D1\u30D5il;\u691Ao\u0100;n\u30DB\u30DC\u6236al\xF3\u0F1E\u0180abr\u30E7\u30EA\u30EEr\xF2\u17E5rk;\u6773\u0100ak\u30F3\u30FDc\u0100ek\u30F9\u30FB;\u407D;\u405D\u0100es\u3102\u3104;\u698Cl\u0100du\u310A\u310C;\u698E;\u6990\u0200aeuy\u3117\u311C\u3127\u3129ron;\u4159\u0100di\u3121\u3125il;\u4157\xEC\u0FF2\xE2\u30FA;\u4440\u0200clqs\u3134\u3137\u313D\u3144a;\u6937dhar;\u6969uo\u0100;r\u020E\u020Dh;\u61B3\u0180acg\u314E\u315F\u0F44l\u0200;ips\u0F78\u3158\u315B\u109Cn\xE5\u10BBar\xF4\u0FA9t;\u65AD\u0180ilr\u3169\u1023\u316Esht;\u697D;\uC000\u{1D52F}\u0100ao\u3177\u3186r\u0100du\u317D\u317F\xBB\u047B\u0100;l\u1091\u3184;\u696C\u0100;v\u318B\u318C\u43C1;\u43F1\u0180gns\u3195\u31F9\u31FCht\u0300ahlrst\u31A4\u31B0\u31C2\u31D8\u31E4\u31EErrow\u0100;t\u0FDC\u31ADa\xE9\u30C8arpoon\u0100du\u31BB\u31BFow\xEE\u317Ep\xBB\u1092eft\u0100ah\u31CA\u31D0rrow\xF3\u0FEAarpoon\xF3\u0551ightarrows;\u61C9quigarro\xF7\u30CBhreetimes;\u62CCg;\u42DAingdotse\xF1\u1F32\u0180ahm\u320D\u3210\u3213r\xF2\u0FEAa\xF2\u0551;\u600Foust\u0100;a\u321E\u321F\u63B1che\xBB\u321Fmid;\u6AEE\u0200abpt\u3232\u323D\u3240\u3252\u0100nr\u3237\u323Ag;\u67EDr;\u61FEr\xEB\u1003\u0180afl\u3247\u324A\u324Er;\u6986;\uC000\u{1D563}us;\u6A2Eimes;\u6A35\u0100ap\u325D\u3267r\u0100;g\u3263\u3264\u4029t;\u6994olint;\u6A12ar\xF2\u31E3\u0200achq\u327B\u3280\u10BC\u3285quo;\u603Ar;\uC000\u{1D4C7}\u0100bu\u30FB\u328Ao\u0100;r\u0214\u0213\u0180hir\u3297\u329B\u32A0re\xE5\u31F8mes;\u62CAi\u0200;efl\u32AA\u1059\u1821\u32AB\u65B9tri;\u69CEluhar;\u6968;\u611E\u0D61\u32D5\u32DB\u32DF\u332C\u3338\u3371\0\u337A\u33A4\0\0\u33EC\u33F0\0\u3428\u3448\u345A\u34AD\u34B1\u34CA\u34F1\0\u3616\0\0\u3633cute;\u415Bqu\xEF\u27BA\u0500;Eaceinpsy\u11ED\u32F3\u32F5\u32FF\u3302\u330B\u330F\u331F\u3326\u3329;\u6AB4\u01F0\u32FA\0\u32FC;\u6AB8on;\u4161u\xE5\u11FE\u0100;d\u11F3\u3307il;\u415Frc;\u415D\u0180Eas\u3316\u3318\u331B;\u6AB6p;\u6ABAim;\u62E9olint;\u6A13i\xED\u1204;\u4441ot\u0180;be\u3334\u1D47\u3335\u62C5;\u6A66\u0380Aacmstx\u3346\u334A\u3357\u335B\u335E\u3363\u336Drr;\u61D8r\u0100hr\u3350\u3352\xEB\u2228\u0100;o\u0A36\u0A34t\u803B\xA7\u40A7i;\u403Bwar;\u6929m\u0100in\u3369\xF0nu\xF3\xF1t;\u6736r\u0100;o\u3376\u2055\uC000\u{1D530}\u0200acoy\u3382\u3386\u3391\u33A0rp;\u666F\u0100hy\u338B\u338Fcy;\u4449;\u4448rt\u026D\u3399\0\0\u339Ci\xE4\u1464ara\xEC\u2E6F\u803B\xAD\u40AD\u0100gm\u33A8\u33B4ma\u0180;fv\u33B1\u33B2\u33B2\u43C3;\u43C2\u0400;deglnpr\u12AB\u33C5\u33C9\u33CE\u33D6\u33DE\u33E1\u33E6ot;\u6A6A\u0100;q\u12B1\u12B0\u0100;E\u33D3\u33D4\u6A9E;\u6AA0\u0100;E\u33DB\u33DC\u6A9D;\u6A9Fe;\u6246lus;\u6A24arr;\u6972ar\xF2\u113D\u0200aeit\u33F8\u3408\u340F\u3417\u0100ls\u33FD\u3404lsetm\xE9\u336Ahp;\u6A33parsl;\u69E4\u0100dl\u1463\u3414e;\u6323\u0100;e\u341C\u341D\u6AAA\u0100;s\u3422\u3423\u6AAC;\uC000\u2AAC\uFE00\u0180flp\u342E\u3433\u3442tcy;\u444C\u0100;b\u3438\u3439\u402F\u0100;a\u343E\u343F\u69C4r;\u633Ff;\uC000\u{1D564}a\u0100dr\u344D\u0402es\u0100;u\u3454\u3455\u6660it\xBB\u3455\u0180csu\u3460\u3479\u349F\u0100au\u3465\u346Fp\u0100;s\u1188\u346B;\uC000\u2293\uFE00p\u0100;s\u11B4\u3475;\uC000\u2294\uFE00u\u0100bp\u347F\u348F\u0180;es\u1197\u119C\u3486et\u0100;e\u1197\u348D\xF1\u119D\u0180;es\u11A8\u11AD\u3496et\u0100;e\u11A8\u349D\xF1\u11AE\u0180;af\u117B\u34A6\u05B0r\u0165\u34AB\u05B1\xBB\u117Car\xF2\u1148\u0200cemt\u34B9\u34BE\u34C2\u34C5r;\uC000\u{1D4C8}tm\xEE\xF1i\xEC\u3415ar\xE6\u11BE\u0100ar\u34CE\u34D5r\u0100;f\u34D4\u17BF\u6606\u0100an\u34DA\u34EDight\u0100ep\u34E3\u34EApsilo\xEE\u1EE0h\xE9\u2EAFs\xBB\u2852\u0280bcmnp\u34FB\u355E\u1209\u358B\u358E\u0480;Edemnprs\u350E\u350F\u3511\u3515\u351E\u3523\u352C\u3531\u3536\u6282;\u6AC5ot;\u6ABD\u0100;d\u11DA\u351Aot;\u6AC3ult;\u6AC1\u0100Ee\u3528\u352A;\u6ACB;\u628Alus;\u6ABFarr;\u6979\u0180eiu\u353D\u3552\u3555t\u0180;en\u350E\u3545\u354Bq\u0100;q\u11DA\u350Feq\u0100;q\u352B\u3528m;\u6AC7\u0100bp\u355A\u355C;\u6AD5;\u6AD3c\u0300;acens\u11ED\u356C\u3572\u3579\u357B\u3326ppro\xF8\u32FAurlye\xF1\u11FE\xF1\u11F3\u0180aes\u3582\u3588\u331Bppro\xF8\u331Aq\xF1\u3317g;\u666A\u0680123;Edehlmnps\u35A9\u35AC\u35AF\u121C\u35B2\u35B4\u35C0\u35C9\u35D5\u35DA\u35DF\u35E8\u35ED\u803B\xB9\u40B9\u803B\xB2\u40B2\u803B\xB3\u40B3;\u6AC6\u0100os\u35B9\u35BCt;\u6ABEub;\u6AD8\u0100;d\u1222\u35C5ot;\u6AC4s\u0100ou\u35CF\u35D2l;\u67C9b;\u6AD7arr;\u697Bult;\u6AC2\u0100Ee\u35E4\u35E6;\u6ACC;\u628Blus;\u6AC0\u0180eiu\u35F4\u3609\u360Ct\u0180;en\u121C\u35FC\u3602q\u0100;q\u1222\u35B2eq\u0100;q\u35E7\u35E4m;\u6AC8\u0100bp\u3611\u3613;\u6AD4;\u6AD6\u0180Aan\u361C\u3620\u362Drr;\u61D9r\u0100hr\u3626\u3628\xEB\u222E\u0100;o\u0A2B\u0A29war;\u692Alig\u803B\xDF\u40DF\u0BE1\u3651\u365D\u3660\u12CE\u3673\u3679\0\u367E\u36C2\0\0\0\0\0\u36DB\u3703\0\u3709\u376C\0\0\0\u3787\u0272\u3656\0\0\u365Bget;\u6316;\u43C4r\xEB\u0E5F\u0180aey\u3666\u366B\u3670ron;\u4165dil;\u4163;\u4442lrec;\u6315r;\uC000\u{1D531}\u0200eiko\u3686\u369D\u36B5\u36BC\u01F2\u368B\0\u3691e\u01004f\u1284\u1281a\u0180;sv\u3698\u3699\u369B\u43B8ym;\u43D1\u0100cn\u36A2\u36B2k\u0100as\u36A8\u36AEppro\xF8\u12C1im\xBB\u12ACs\xF0\u129E\u0100as\u36BA\u36AE\xF0\u12C1rn\u803B\xFE\u40FE\u01EC\u031F\u36C6\u22E7es\u8180\xD7;bd\u36CF\u36D0\u36D8\u40D7\u0100;a\u190F\u36D5r;\u6A31;\u6A30\u0180eps\u36E1\u36E3\u3700\xE1\u2A4D\u0200;bcf\u0486\u36EC\u36F0\u36F4ot;\u6336ir;\u6AF1\u0100;o\u36F9\u36FC\uC000\u{1D565}rk;\u6ADA\xE1\u3362rime;\u6034\u0180aip\u370F\u3712\u3764d\xE5\u1248\u0380adempst\u3721\u374D\u3740\u3751\u3757\u375C\u375Fngle\u0280;dlqr\u3730\u3731\u3736\u3740\u3742\u65B5own\xBB\u1DBBeft\u0100;e\u2800\u373E\xF1\u092E;\u625Cight\u0100;e\u32AA\u374B\xF1\u105Aot;\u65ECinus;\u6A3Alus;\u6A39b;\u69CDime;\u6A3Bezium;\u63E2\u0180cht\u3772\u377D\u3781\u0100ry\u3777\u377B;\uC000\u{1D4C9};\u4446cy;\u445Brok;\u4167\u0100io\u378B\u378Ex\xF4\u1777head\u0100lr\u3797\u37A0eftarro\xF7\u084Fightarrow\xBB\u0F5D\u0900AHabcdfghlmoprstuw\u37D0\u37D3\u37D7\u37E4\u37F0\u37FC\u380E\u381C\u3823\u3834\u3851\u385D\u386B\u38A9\u38CC\u38D2\u38EA\u38F6r\xF2\u03EDar;\u6963\u0100cr\u37DC\u37E2ute\u803B\xFA\u40FA\xF2\u1150r\u01E3\u37EA\0\u37EDy;\u445Eve;\u416D\u0100iy\u37F5\u37FArc\u803B\xFB\u40FB;\u4443\u0180abh\u3803\u3806\u380Br\xF2\u13ADlac;\u4171a\xF2\u13C3\u0100ir\u3813\u3818sht;\u697E;\uC000\u{1D532}rave\u803B\xF9\u40F9\u0161\u3827\u3831r\u0100lr\u382C\u382E\xBB\u0957\xBB\u1083lk;\u6580\u0100ct\u3839\u384D\u026F\u383F\0\0\u384Arn\u0100;e\u3845\u3846\u631Cr\xBB\u3846op;\u630Fri;\u65F8\u0100al\u3856\u385Acr;\u416B\u80BB\xA8\u0349\u0100gp\u3862\u3866on;\u4173f;\uC000\u{1D566}\u0300adhlsu\u114B\u3878\u387D\u1372\u3891\u38A0own\xE1\u13B3arpoon\u0100lr\u3888\u388Cef\xF4\u382Digh\xF4\u382Fi\u0180;hl\u3899\u389A\u389C\u43C5\xBB\u13FAon\xBB\u389Aparrows;\u61C8\u0180cit\u38B0\u38C4\u38C8\u026F\u38B6\0\0\u38C1rn\u0100;e\u38BC\u38BD\u631Dr\xBB\u38BDop;\u630Eng;\u416Fri;\u65F9cr;\uC000\u{1D4CA}\u0180dir\u38D9\u38DD\u38E2ot;\u62F0lde;\u4169i\u0100;f\u3730\u38E8\xBB\u1813\u0100am\u38EF\u38F2r\xF2\u38A8l\u803B\xFC\u40FCangle;\u69A7\u0780ABDacdeflnoprsz\u391C\u391F\u3929\u392D\u39B5\u39B8\u39BD\u39DF\u39E4\u39E8\u39F3\u39F9\u39FD\u3A01\u3A20r\xF2\u03F7ar\u0100;v\u3926\u3927\u6AE8;\u6AE9as\xE8\u03E1\u0100nr\u3932\u3937grt;\u699C\u0380eknprst\u34E3\u3946\u394B\u3952\u395D\u3964\u3996app\xE1\u2415othin\xE7\u1E96\u0180hir\u34EB\u2EC8\u3959op\xF4\u2FB5\u0100;h\u13B7\u3962\xEF\u318D\u0100iu\u3969\u396Dgm\xE1\u33B3\u0100bp\u3972\u3984setneq\u0100;q\u397D\u3980\uC000\u228A\uFE00;\uC000\u2ACB\uFE00setneq\u0100;q\u398F\u3992\uC000\u228B\uFE00;\uC000\u2ACC\uFE00\u0100hr\u399B\u399Fet\xE1\u369Ciangle\u0100lr\u39AA\u39AFeft\xBB\u0925ight\xBB\u1051y;\u4432ash\xBB\u1036\u0180elr\u39C4\u39D2\u39D7\u0180;be\u2DEA\u39CB\u39CFar;\u62BBq;\u625Alip;\u62EE\u0100bt\u39DC\u1468a\xF2\u1469r;\uC000\u{1D533}tr\xE9\u39AEsu\u0100bp\u39EF\u39F1\xBB\u0D1C\xBB\u0D59pf;\uC000\u{1D567}ro\xF0\u0EFBtr\xE9\u39B4\u0100cu\u3A06\u3A0Br;\uC000\u{1D4CB}\u0100bp\u3A10\u3A18n\u0100Ee\u3980\u3A16\xBB\u397En\u0100Ee\u3992\u3A1E\xBB\u3990igzag;\u699A\u0380cefoprs\u3A36\u3A3B\u3A56\u3A5B\u3A54\u3A61\u3A6Airc;\u4175\u0100di\u3A40\u3A51\u0100bg\u3A45\u3A49ar;\u6A5Fe\u0100;q\u15FA\u3A4F;\u6259erp;\u6118r;\uC000\u{1D534}pf;\uC000\u{1D568}\u0100;e\u1479\u3A66at\xE8\u1479cr;\uC000\u{1D4CC}\u0AE3\u178E\u3A87\0\u3A8B\0\u3A90\u3A9B\0\0\u3A9D\u3AA8\u3AAB\u3AAF\0\0\u3AC3\u3ACE\0\u3AD8\u17DC\u17DFtr\xE9\u17D1r;\uC000\u{1D535}\u0100Aa\u3A94\u3A97r\xF2\u03C3r\xF2\u09F6;\u43BE\u0100Aa\u3AA1\u3AA4r\xF2\u03B8r\xF2\u09EBa\xF0\u2713is;\u62FB\u0180dpt\u17A4\u3AB5\u3ABE\u0100fl\u3ABA\u17A9;\uC000\u{1D569}im\xE5\u17B2\u0100Aa\u3AC7\u3ACAr\xF2\u03CEr\xF2\u0A01\u0100cq\u3AD2\u17B8r;\uC000\u{1D4CD}\u0100pt\u17D6\u3ADCr\xE9\u17D4\u0400acefiosu\u3AF0\u3AFD\u3B08\u3B0C\u3B11\u3B15\u3B1B\u3B21c\u0100uy\u3AF6\u3AFBte\u803B\xFD\u40FD;\u444F\u0100iy\u3B02\u3B06rc;\u4177;\u444Bn\u803B\xA5\u40A5r;\uC000\u{1D536}cy;\u4457pf;\uC000\u{1D56A}cr;\uC000\u{1D4CE}\u0100cm\u3B26\u3B29y;\u444El\u803B\xFF\u40FF\u0500acdefhiosw\u3B42\u3B48\u3B54\u3B58\u3B64\u3B69\u3B6D\u3B74\u3B7A\u3B80cute;\u417A\u0100ay\u3B4D\u3B52ron;\u417E;\u4437ot;\u417C\u0100et\u3B5D\u3B61tr\xE6\u155Fa;\u43B6r;\uC000\u{1D537}cy;\u4436grarr;\u61DDpf;\uC000\u{1D56B}cr;\uC000\u{1D4CF}\u0100jn\u3B85\u3B87;\u600Dj;\u600C'.split("").map(C=>C.charCodeAt(0)));var yt,E0=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),St=(yt=String.fromCodePoint)!==null&&yt!==void 0?yt:function(C){let I="";return C>65535&&(C-=65536,I+=String.fromCharCode(C>>>10&1023|55296),C=56320|C&1023),I+=String.fromCharCode(C),I};function Xt(C){var I;return C>=55296&&C<=57343||C>1114111?65533:(I=E0.get(C))!==null&&I!==void 0?I:C}var Mg;(function(C){C[C.NUM=35]="NUM",C[C.SEMI=59]="SEMI",C[C.EQUALS=61]="EQUALS",C[C.ZERO=48]="ZERO",C[C.NINE=57]="NINE",C[C.LOWER_A=97]="LOWER_A",C[C.LOWER_F=102]="LOWER_F",C[C.LOWER_X=120]="LOWER_X",C[C.LOWER_Z=122]="LOWER_Z",C[C.UPPER_A=65]="UPPER_A",C[C.UPPER_F=70]="UPPER_F",C[C.UPPER_Z=90]="UPPER_Z"})(Mg||(Mg={}));var N0=32,UF;(function(C){C[C.VALUE_LENGTH=49152]="VALUE_LENGTH",C[C.BRANCH_LENGTH=16256]="BRANCH_LENGTH",C[C.JUMP_TABLE=127]="JUMP_TABLE"})(UF||(UF={}));function Wt(C){return C>=Mg.ZERO&&C<=Mg.NINE}function p0(C){return C>=Mg.UPPER_A&&C<=Mg.UPPER_F||C>=Mg.LOWER_A&&C<=Mg.LOWER_F}function H0(C){return C>=Mg.UPPER_A&&C<=Mg.UPPER_Z||C>=Mg.LOWER_A&&C<=Mg.LOWER_Z||Wt(C)}function Y0(C){return C===Mg.EQUALS||H0(C)}var zg;(function(C){C[C.EntityStart=0]="EntityStart",C[C.NumericStart=1]="NumericStart",C[C.NumericDecimal=2]="NumericDecimal",C[C.NumericHex=3]="NumericHex",C[C.NamedEntity=4]="NamedEntity"})(zg||(zg={}));var jC;(function(C){C[C.Legacy=0]="Legacy",C[C.Strict=1]="Strict",C[C.Attribute=2]="Attribute"})(jC||(jC={}));var as=class{constructor(I,g,B){this.decodeTree=I,this.emitCodePoint=g,this.errors=B,this.state=zg.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=jC.Strict}startEntity(I){this.decodeMode=I,this.state=zg.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1}write(I,g){switch(this.state){case zg.EntityStart:return I.charCodeAt(g)===Mg.NUM?(this.state=zg.NumericStart,this.consumed+=1,this.stateNumericStart(I,g+1)):(this.state=zg.NamedEntity,this.stateNamedEntity(I,g));case zg.NumericStart:return this.stateNumericStart(I,g);case zg.NumericDecimal:return this.stateNumericDecimal(I,g);case zg.NumericHex:return this.stateNumericHex(I,g);case zg.NamedEntity:return this.stateNamedEntity(I,g)}}stateNumericStart(I,g){return g>=I.length?-1:(I.charCodeAt(g)|N0)===Mg.LOWER_X?(this.state=zg.NumericHex,this.consumed+=1,this.stateNumericHex(I,g+1)):(this.state=zg.NumericDecimal,this.stateNumericDecimal(I,g))}addToNumericResult(I,g,B,F){if(g!==B){let A=B-g;this.result=this.result*Math.pow(F,A)+Number.parseInt(I.substr(g,A),F),this.consumed+=A}}stateNumericHex(I,g){let B=g;for(;g>14;for(;g>14,A!==0){if(Q===Mg.SEMI)return this.emitNamedEntityData(this.treeIndex,A,this.consumed+this.excess);this.decodeMode!==jC.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}return-1}emitNotTerminatedNamedEntity(){var I;let{result:g,decodeTree:B}=this,F=(B[g]&UF.VALUE_LENGTH)>>14;return this.emitNamedEntityData(g,F,this.consumed),(I=this.errors)===null||I===void 0||I.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(I,g,B){let{decodeTree:F}=this;return this.emitCodePoint(g===1?F[I]&~UF.VALUE_LENGTH:F[I+1],B),g===3&&this.emitCodePoint(F[I+2],B),B}end(){var I;switch(this.state){case zg.NamedEntity:return this.result!==0&&(this.decodeMode!==jC.Attribute||this.result===this.treeIndex)?this.emitNotTerminatedNamedEntity():0;case zg.NumericDecimal:return this.emitNumericEntity(0,2);case zg.NumericHex:return this.emitNumericEntity(0,3);case zg.NumericStart:return(I=this.errors)===null||I===void 0||I.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case zg.EntityStart:return 0}}};function J0(C){let I="",g=new as(C,B=>I+=St(B));return function(F,A){let Q=0,U=0;for(;(U=F.indexOf("&",U))>=0;){I+=F.slice(Q,U),g.startEntity(A);let l=g.write(F,U+1);if(l<0){Q=U+g.end();break}Q=U+l,U=l===0?Q+1:Q}let s=I+F.slice(Q);return I="",s}}function v0(C,I,g,B){let F=(I&UF.BRANCH_LENGTH)>>7,A=I&UF.JUMP_TABLE;if(F===0)return A!==0&&B===A?g:-1;if(A){let s=B-A;return s<0||s>=F?-1:C[g+s]-1}let Q=g,U=Q+F-1;for(;Q<=U;){let s=Q+U>>>1,l=C[s];if(lB)U=s-1;else return C[s+F]}return-1}var k0=J0(ot);function NA(C,I=jC.Legacy){return k0(C,I)}var D0=String.prototype.codePointAt==null?(C,I)=>(C.charCodeAt(I)&64512)===55296?(C.charCodeAt(I)-55296)*1024+C.charCodeAt(I+1)-56320+65536:C.charCodeAt(I):(C,I)=>C.codePointAt(I);var FG;(function(C){C[C.XML=0]="XML",C[C.HTML=1]="HTML"})(FG||(FG={}));var AG;(function(C){C[C.UTF8=0]="UTF8",C[C.ASCII=1]="ASCII",C[C.Extensive=2]="Extensive",C[C.Attribute=3]="Attribute",C[C.Text=4]="Text"})(AG||(AG={}));var Ih=require("obsidian");function NQ(C,I=!0,g=0,B="div",F=null,A){return C.type==="comment"?wi(C,A,I):C.postprocess(I,g,B,F,A)}async function ns(C,I,g){let B=null,F=null,A=null,Q=NA(C.innerHTML,jC.Strict);if(I){let e=I.getSectionInfo(C);if(e){let V=xQ(e.text),u=[...e.text.matchAll(/\n/g)].map(n=>n.index);if(F=e.lineStart?u[e.lineStart-1]+1:0,A=u[e.lineEnd]??e.text.length,B=V.filter(n=>n.partially_in_range(F,A)),!B.length)return;if(B.length===1){let n=B[0],R=!1,h=null;if(n.type==="substitution"?n.part_encloses_range(F,A,!0)&&(R=!0,h=!0)||n.part_encloses_range(F,A,!1)&&(R=!0,h=!1):R=n.encloses_range(F,A),R){n.type==="substitution"&&(Q=Q.replace(/~>/g,""));let m=F===n.from;if(A===n.to){let y=Q.lastIndexOf(ng[n.type].at(-1));Q=Q.substring(0,y)+Q.substring(y+3)}if(m){let y=Q.indexOf(ng[n.type][0]);Q=Q.substring(0,y)+Q.substring(y+3)}let L=NQ(n,!1,g.default_preview_mode,"div",h,Q);L instanceof HTMLElement?(C.innerHTML="",C.appendChild(L)):C.innerHTML=L;return}}}}Q=Q.replaceAll(/{|{<\/del>/g,"{~~").replaceAll(/}|<\/del>}/g,"~~}").replaceAll(/{|{<\/mark>/g,"{==").replaceAll(/}|<\/mark>}/g,"==}").replaceAll(/{==}|{=<\/mark>=}/g,"{====}");let U=xQ(Q);for(let e=0;eB[0].from,i=A",G.push(e));C.innerHTML=b,C.querySelectorAll("placeholder").forEach((e,V)=>{e.replaceWith(G[V])})}var K0=require("@codemirror/state"),rt=require("obsidian");function Nt(C){for(let I of C.workspace.getLeavesOfType("markdown"))if(I.view instanceof rt.MarkdownView){for(let g of I.view.previewMode.renderer.sections.filter(B=>B.el.querySelector(".commentator-preview")))g.rendered=!1,g.html="";I.view.previewMode.renderer.queueRender()}}function Rs(C){for(let I of C.workspace.getLeavesOfType("markdown"))I.view instanceof rt.MarkdownView&&I.view.previewMode.rerender(!0)}var hs=require("obsidian");var ms=class{constructor(I,g=!1){this.plugin=I;this.setRendering(g)}button=null;index=0;metadata_settings_toggles=[{icon:"lucide-user",text:"Author",attribute:"author"},{icon:"lucide-calendar",text:"Time",attribute:"timestamp"},{icon:"lucide-check",text:"Completed",attribute:"completed"},{icon:"brush",text:"Style",attribute:"style"},{icon:"paintbrush",text:"Color",attribute:"color"}];showMenu(I){us();let g=new hs.Menu;g.addItem(B=>{B.setTitle("Add metadata"),B.setIcon("tags"),B.setChecked(this.plugin.settings.add_metadata),B.onClick(async()=>{await this.plugin.setSetting("add_metadata",!this.plugin.settings.add_metadata),B.setChecked(this.plugin.settings.add_metadata),g.items.slice(1).forEach(F=>{F.setDisabled(!this.plugin.settings.add_metadata)})})});for(let{icon:B,text:F,attribute:A}of this.metadata_settings_toggles){let Q=`add_${A}_metadata`;g.addItem(U=>{U.setTitle(F),U.setIcon(B),U.setChecked(this.plugin.settings[Q]),U.setDisabled(!this.plugin.settings.add_metadata),U.onClick(async()=>{await this.plugin.setSetting(Q,!this.plugin.settings[Q]),U.checkIconEl?U.checkIconEl.style.display=this.plugin.settings[Q]?"flex":"none":U.setChecked(this.plugin.settings[Q])}),U.dom.addClass("cmtr-submenu-nested")})}g.showAtMouseEvent(I)}setRendering(I){I===void 0||I===!!this.button||(I?this.renderButton():this.detachButton())}renderButton(){this.button=this.plugin.addStatusBarItem();let I=this.button.createSpan({cls:"status-bar-item-icon"});(0,hs.setIcon)(I,"tags"),this.button.classList.add("mod-clickable"),this.button.setAttribute("aria-label","Metadata"),this.button.setAttribute("data-tooltip-position","top"),this.button.addEventListener("click",g=>this.showMenu(g)),this.button.addEventListener("contextmenu",g=>this.showMenu(g))}detachButton(){this.button&&(this.button.detach(),this.button=null)}};var wF=require("obsidian"),pQ=class{constructor(I,g,B,F,A=!1){this.states=I;this.onchange=g;this.getvalue=B;this.plugin=F;this.setRendering(A),this.plugin.app.workspace.onLayoutReady(()=>this.currentView=this.plugin.app.workspace.activeEditor)}button=null;value=0;changeEvent=null;currentView=null;showMenu(I){let g=new wF.Menu;for(let[B,F]of this.states.entries())g.addItem(A=>{A.setTitle(F.text),A.setIcon(F.icon),A.setChecked(B===this.value),A.onClick(()=>this.onchange(this.currentView,B))});g.showAtMouseEvent(I),I.preventDefault()}setRendering(I){I===void 0||I===!!this.button||(I?this.renderButton():this.detachButton())}updateButton(I){if(!this.button||I===void 0)return;this.value=I;let{icon:g,text:B}=this.states[I];(0,wF.setIcon)(this.button,g),this.button.setAttribute("aria-label",B)}renderButton(){let{icon:I,text:g}=this.states[this.value];this.changeEvent=this.plugin.app.workspace.on("active-leaf-change",F=>{F&&F.view instanceof wF.MarkdownView?(this.currentView=F.view,this.updateButton(this.getvalue(F.view.editor)),this.button.style.display=""):(this.currentView=null,this.button.style.display="none")}),this.button=this.plugin.addStatusBarItem();let B=this.button.createSpan({cls:"status-bar-item-icon"});(0,wF.setIcon)(B,I),this.button.classList.add("mod-clickable"),this.button.setAttribute("aria-label",g),this.button.setAttribute("data-tooltip-position","top"),this.button.addEventListener("click",F=>this.showMenu(F)),this.button.addEventListener("contextmenu",F=>this.showMenu(F))}detachButton(){this.button&&(this.button.detach(),this.button=null,this.plugin.app.workspace.offref(this.changeEvent))}};var sG=(C,I)=>new pQ([{icon:"message-square",text:"Showing all suggestions"},{icon:"check",text:'Previewing "accept all"'},{icon:"cross",text:'Previewing "reject all"'}],C.setPreviewMode.bind(C),g=>g.cm.state.facet(iC),C,I),lG=(C,I)=>new pQ([{icon:"pencil",text:"Editing (Regular)"},{icon:"edit",text:"Editing (Corrected)"},{icon:"file-edit",text:"Suggesting"}],C.setEditMode.bind(C),g=>g.cm.state.facet(aC),C,I),tG=(C,I)=>new ms(C,I);var sF=require("obsidian"),HQ=class{constructor(I,g,B,F,A,Q,U=!1){this.states=I;this.has_label=g;this.cls=B;this.onchange=F;this.getvalue=A;this.plugin=Q;this.setRendering(U)}active_mapping=new WeakMap;changeEvent=null;setRendering(I){I===void 0||I===!!this.changeEvent||(I?this.attachButtons():this.detachButtons())}setLabelRendering(I){if(!(I===void 0||!this.changeEvent||I===this.has_label)){this.has_label=I;for(let g of this.plugin.app.workspace.getLeavesOfType("markdown")){if(!(g.view instanceof sF.MarkdownView))continue;let{view:B}=g,{text:F}=this.states[this.getvalue(B)],A=this.active_mapping.get(B);if(A)if(A.status)A.status.detach(),A.status=null;else{let Q=A.button.createSpan({text:F,cls:this.cls});A.button.parentElement.insertBefore(Q,A.button),A.status=Q}}}}updateButton(I,g){let B=this.active_mapping.get(I);if(B)if(this.states[g]){let{tooltip:F,text:A}=this.states[g];(0,sF.setIcon)(B.button,this.states[(g+1)%this.states.length].icon),B.button.setAttribute("aria-label",F),B.button.style.display="",this.has_label&&(B.status.innerText=A)}else B.button.style.display="none"}attachButtons(){this.changeEvent||(this.changeEvent=this.plugin.app.workspace.on("layout-change",this.attachButtons.bind(this)));for(let I of this.plugin.app.workspace.getLeavesOfType("markdown")){if(!(I.view instanceof sF.MarkdownView))continue;let{view:g}=I;if(this.active_mapping.has(g))continue;let B=I.on("history-change",()=>{this.updateButton(g,this.getvalue(g))}),F=this.getvalue(g);if(F===void 0)return;let{tooltip:A,text:Q}=this.states[F],U=g.addAction(this.states[(F+1)%this.states.length].icon,A,async()=>{let l=(this.getvalue(g)+1)%this.states.length;this.onchange(g,l)}),s=this.has_label?U.createSpan({text:Q,cls:this.cls}):null;this.has_label&&U.parentElement.insertBefore(s,U),U.oncontextmenu=l=>{let d=new sF.Menu,c=this.getvalue(g);for(let[i,{icon:G,text:b}]of this.states.entries())d.addItem(e=>{e.setIcon(G).setTitle(b).setChecked(i===c).onClick(()=>{this.onchange(g,i)})});d.showAtMouseEvent(l)},this.active_mapping.set(g,{button:U,status:s,event:B})}}detachButton(I){let g=I.view,B=this.active_mapping.get(g);B&&(I.offref(B.event),B.button.detach(),B.status?.detach(),this.active_mapping.delete(g))}detachButtons(){if(this.changeEvent){for(let I of this.plugin.app.workspace.getLeavesOfType("markdown"))I.view instanceof sF.MarkdownView&&this.detachButton(I);this.plugin.app.workspace.offref(this.changeEvent),this.changeEvent=null}}};var cG=(C,I)=>new HQ([{icon:"message-square",tooltip:`Current mode: show all suggestions -Click to preview 'accept all'`,text:"Showing all suggestions"},{icon:"check",tooltip:`Current mode: preview 'accept all' -Click to preview 'reject all'`,text:'Previewing "accept all"'},{icon:"cross",tooltip:`Current mode: preview 'reject all' -Click to preview 'show all'`,text:'Previewing "reject all"'}],C.settings.toolbar_show_buttons_labels,"cmtr-suggestion-status",C.setPreviewMode.bind(C),g=>g.editor.cm.state.facet(iC),C,I),iG=(C,I)=>new HQ([{icon:"pencil",tooltip:`Current mode: editing (regular) -Click to edit (corrected)`,text:"Editing (REG)"},{icon:"edit",tooltip:`Current mode: editing (corrected) -Click to suggest`,text:"Editing (ALT)"},{icon:"file-edit",tooltip:`Current mode: suggesting -Click to edit (regular)`,text:"Suggesting"}],C.settings.toolbar_show_buttons_labels,"cmtr-suggestion-status",C.setEditMode.bind(C),g=>g.editor.cm.state.facet(aC),C,I);var hb=require("obsidian");var os=!0;var GG=globalThis.process?.env?.NODE_ENV,BI=GG&&!GG.toLowerCase().startsWith("prod");var OC=Array.isArray,dG=Array.prototype.indexOf,YQ=Array.from,pt=Object.keys,qg=Object.defineProperty,_C=Object.getOwnPropertyDescriptor,ys=Object.getOwnPropertyDescriptors,Ss=Object.prototype,bG=Array.prototype,lF=Object.getPrototypeOf,Ht=Object.isExtensible;function Yt(C){return typeof C=="function"}var Eg=()=>{};function JQ(C){for(var I=0;I0){let F=g.length>10?g.slice(0,7):g.slice(0,10),A=g.length-F.length,Q=F.map(U=>`- ${U}`).join(` -`);A>0&&(Q+=` -- ...and ${A} more`)}return B}return kQ(C,new Map,"",P0)}function kQ(C,I,g,B,F=null){if(typeof C=="object"&&C!==null){var A=I.get(C);if(A!==void 0)return A;if(C instanceof Map)return new Map(C);if(C instanceof Set)return new Set(C);if(OC(C)){var Q=Array(C.length);I.set(C,Q),F!==null&&I.set(F,Q);for(var U=0;U{B.d=!0}),BI&&(jI.function=g,YC=g)}function yI(C){let I=jI;if(I!==null){C!==void 0&&(I.x=C);let Q=I.e;if(Q!==null){var g=SI,B=NI;I.e=null;try{for(var F=0;F{var l=NI;Gg(Q);var d=s();return Gg(l),d};return B&&g.set("length",iI(C.length,A)),new Proxy(C,{defineProperty(s,l,d){(!("value"in d)||d.configurable===!1||d.enumerable===!1||d.writable===!1)&&oG();var c=g.get(l);return c===void 0?(c=U(()=>iI(d.value,A)),g.set(l,c)):p(c,U(()=>wI(d.value))),!0},deleteProperty(s,l){var d=g.get(l);if(d===void 0)l in s&&(g.set(l,U(()=>iI(og,A))),vt(F));else{if(B&&typeof l=="string"){var c=g.get("length"),i=Number(l);Number.isInteger(i)&&iiI(wI(i?s[l]:og),A)),g.set(l,c)),c!==void 0){var G=t(c);return G===og?void 0:G}return Reflect.get(s,l,d)},getOwnPropertyDescriptor(s,l){var d=Reflect.getOwnPropertyDescriptor(s,l);if(d&&"value"in d){var c=g.get(l);c&&(d.value=t(c))}else if(d===void 0){var i=g.get(l),G=i?.v;if(i!==void 0&&G!==og)return{enumerable:!0,configurable:!0,value:G,writable:!0}}return d},has(s,l){if(l===GC)return!0;var d=g.get(l),c=d!==void 0&&d.v!==og||Reflect.has(s,l);if(d!==void 0||SI!==null&&(!c||_C(s,l)?.writable)){d===void 0&&(d=U(()=>iI(c?wI(s[l]):og,A)),g.set(l,d));var i=t(d);if(i===og)return!1}return c},set(s,l,d,c){var i=g.get(l),G=l in s;if(B&&l==="length")for(var b=d;biI(og,A)),g.set(b+"",e))}i===void 0?(!G||_C(s,l)?.writable)&&(i=U(()=>iI(void 0,A)),p(i,U(()=>wI(d))),g.set(l,i)):(G=i.v!==og,p(i,U(()=>wI(d))));var V=Reflect.getOwnPropertyDescriptor(s,l);if(V?.set&&V.set.call(c,d),!G){if(B&&typeof l=="string"){var u=g.get("length"),n=Number(l);Number.isInteger(n)&&n>=u.v&&p(u,n+1)}vt(F)}return!0},ownKeys(s){t(F);var l=Reflect.ownKeys(s).filter(i=>{var G=g.get(i);return G===void 0||G.v!==og});for(var[d,c]of g)c.v!==og&&!(d in s)&&l.push(d);return l},setPrototypeOf(){yG()}})}function vt(C,I=1){p(C,C.v+I)}function YA(C){try{if(C!==null&&typeof C=="object"&&GC in C)return C[GC]}catch{}return C}function kt(C,I){return Object.is(YA(C),YA(I))}function iF(C){var I=2050,g=NI!==null&&(NI.f&2)!==0?NI:null;SI===null||g!==null&&(g.f&256)!==0?I|=256:SI.f|=1048576;let B={ctx:jI,deps:null,effects:null,equals:Xs,f:I,fn:C,reactions:null,rv:0,v:null,wv:0,parent:g??SI};return BI&&LB&&(B.created=vB("CreatedAt")),B}function sI(C){let I=iF(C);return rs(I),I}function KQ(C){let I=iF(C);return I.equals=HA,I}function Ws(C){var I=C.effects;if(I!==null){C.effects=null;for(var g=0;g0){let B=Array.from(zF);for(let F of B)(F.f&1024)!==0&&lC(F,4096),GF(F)&&kA(F);zF.clear()}}return I}function jQ(C,I=1){var g=t(C),B=I===1?g++:g--;return p(C,g),B}function NG(C,I){var g=C.reactions;if(g!==null)for(var B=UB(),F=g.length,A=0;A{C.indexOf=g,C.lastIndexOf=B,C.includes=F}}var Kt,JG,OQ,vG,kG;function Ns(){if(Kt===void 0){Kt=window,JG=document,OQ=/Firefox/.test(navigator.userAgent);var C=Element.prototype,I=Node.prototype,g=Text.prototype;vG=_C(I,"firstChild").get,kG=_C(I,"nextSibling").get,Ht(C)&&(C.__click=void 0,C.__className=void 0,C.__attributes=null,C.__style=void 0,C.__e=void 0),Ht(g)&&(g.__t=void 0),BI&&(C.__svelte_meta=null,YG())}}function hC(C=""){return document.createTextNode(C)}function Ng(C){return vG.call(C)}function $g(C){return kG.call(C)}function O(C,I){if(!GI)return Ng(C);var g=Ng(XI);if(g===null)g=XI.appendChild(hC());else if(I&&g.nodeType!==3){var B=hC();return g?.before(B),cg(B),B}return cg(g),g}function JI(C,I){if(!GI){var g=Ng(C);return g instanceof Comment&&g.data===""?$g(g):g}if(I&&XI?.nodeType!==3){var B=hC();return XI?.before(B),cg(B),B}return XI}function k(C,I=1,g=!1){let B=GI?XI:C;for(var F;I--;)F=B,B=$g(B);if(!GI)return B;var A=B?.nodeType;if(g&&A!==3){var Q=hC();return B===null?F?.after(Q):B.before(Q),cg(Q),Q}return cg(B),B}function _Q(C){C.textContent=""}function TG(C){SI===null&&NI===null&&LG(C),NI!==null&&(NI.f&256)!==0&&SI===null&&xG(),KF&&uG(C)}function _0(C,I){var g=I.last;g===null?I.last=I.first=C:(g.next=C,C.prev=g,I.last=C)}function jF(C,I,g,B=!0){var F=SI;if(BI)for(;F!==null&&(F.f&262144)!==0;)F=F.parent;var A={ctx:jI,deps:null,nodes_start:null,nodes_end:null,f:C|2048,first:null,fn:I,last:null,next:null,parent:F,prev:null,teardown:null,transitions:null,wv:0};if(BI&&(A.component_function=YC),g)try{kA(A),A.f|=32768}catch(s){throw sC(A),s}else I!==null&&DA(A);var Q=g&&A.deps===null&&A.first===null&&A.nodes_start===null&&A.teardown===null&&(A.f&1048704)===0;if(!Q&&B&&(F!==null&&_0(A,F),NI!==null&&(NI.f&2)!==0)){var U=NI;(U.effects??=[]).push(A)}return A}function mC(C){let I=jF(8,null,!1);return lC(I,1024),I.teardown=C,I}function pg(C){TG("$effect");var I=SI!==null&&(SI.f&32)!==0&&jI!==null&&!jI.m;if(BI&&qg(C,"name",{value:"$effect"}),I){var g=jI;(g.e??=[]).push({fn:C,effect:SI,reaction:NI})}else{var B=QC(C);return B}}function _t(C){let I=jF(64,C,!0);return()=>{sC(I)}}function wG(C){let I=jF(64,C,!0);return(g={})=>new Promise(B=>{g.outro?TC(I,()=>{sC(I),B(void 0)}):(sC(I),B(void 0))})}function QC(C){return jF(4,C,!1)}function eC(C){return jF(8,C,!0)}function lI(C,I=[],g=iF){let B=I.map(g),F=()=>C(...B.map(t));return BI&&qg(F,"name",{value:"{expression}"}),cC(F)}function cC(C,I=0){return jF(24|I,C,!0)}function Kg(C,I=!0){return jF(40,C,!0,I)}function qt(C){var I=C.teardown;if(I!==null){let g=KF,B=NI;Pt(!0),Gg(null);try{I.call(null)}finally{Pt(g),Gg(B)}}}function $t(C,I=!1){var g=C.first;for(C.first=C.last=null;g!==null;){var B=g.next;(g.f&64)!==0?g.parent=null:sC(g,I),g=B}}function fG(C){for(var I=C.first;I!==null;){var g=I.next;(I.f&32)===0&&sC(I),I=g}}function sC(C,I=!0){var g=!1;(I||(C.f&524288)!==0)&&C.nodes_start!==null&&(Ic(C.nodes_start,C.nodes_end),g=!0),$t(C,I&&!g),$Q(C,0),lC(C,16384);var B=C.transitions;if(B!==null)for(let A of B)A.stop();qt(C);var F=C.parent;F!==null&&F.first!==null&&gc(C),BI&&(C.component_function=null),C.next=C.prev=C.teardown=C.ctx=C.deps=C.fn=C.nodes_start=C.nodes_end=null}function Ic(C,I){for(;C!==null;){var g=C===I?null:$g(C);C.remove(),C=g}}function gc(C){var I=C.parent,g=C.prev,B=C.next;g!==null&&(g.next=B),B!==null&&(B.prev=g),I!==null&&(I.first===C&&(I.first=B),I.last===C&&(I.last=g))}function TC(C,I){var g=[];Hs(C,g,!0),Cc(g,()=>{sC(C),I&&I()})}function Cc(C,I){var g=C.length;if(g>0){var B=()=>--g||I();for(var F of C)F.out(B)}else I()}function Hs(C,I,g){if((C.f&8192)===0){if(C.f^=8192,C.transitions!==null)for(let Q of C.transitions)(Q.is_global||g)&&I.push(Q);for(var B=C.first;B!==null;){var F=B.next,A=(B.f&65536)!==0||(B.f&32)!==0;Hs(B,I,A?g:!1),B=F}}}function dF(C){zG(C,!0)}function zG(C,I){if((C.f&8192)!==0){C.f^=8192,(C.f&1024)===0&&(C.f^=1024),GF(C)&&(lC(C,2048),DA(C));for(var g=C.first;g!==null;){var B=g.next,F=(g.f&65536)!==0||(g.f&32)!==0;zG(g,F?I:!1),g=B}if(C.transitions!==null)for(let A of C.transitions)(A.is_global||I)&&A.in()}}var q0=typeof requestIdleCallback>"u"?C=>setTimeout(C,1):requestIdleCallback,IU=[],gU=[];function MG(){var C=IU;IU=[],JQ(C)}function KG(){var C=gU;gU=[],JQ(C)}function oC(C){IU.length===0&&queueMicrotask(MG),IU.push(C)}function PG(C){gU.length===0&&q0(KG),gU.push(C)}function Bc(){IU.length>0&&MG(),gU.length>0&&KG()}var jG=new WeakSet,Ys=!1,FU=!1,CU=null,OF=!1,KF=!1;function Pt(C){KF=C}var BU=[],Qc=[],NI=null,$C=!1;function Gg(C){NI=C}var SI=null;function vg(C){SI=C}var aB=null;function rs(C){NI!==null&&NI.f&2097152&&(aB===null?aB=[C]:aB.push(C))}var ZC=null,wC=0,vC=null;function pG(C){vC=C}var $G=1,vs=0,kB=!1,wQ=null;function PQ(){return++$G}function GF(C){var I=C.f;if((I&2048)!==0)return!0;if((I&4096)!==0){var g=C.deps,B=(I&256)!==0;if(g!==null){var F,A,Q=(I&512)!==0,U=B&&SI!==null&&!kB,s=g.length;if(Q||U){var l=C,d=l.parent;for(F=0;FC.wv)return!0}(!B||SI!==null&&!kB)&&lC(C,1024)}return!1}function $0(C,I){for(var g=I;g!==null;){if((g.f&128)!==0)try{g.fn(C);return}catch{g.f^=128}g=g.parent}throw Ys=!1,C}function OG(C){return(C.f&16384)===0&&(C.parent===null||(C.parent.f&128)===0)}function fA(C,I,g,B){if(Ys){if(g===null&&(Ys=!1),OG(I))throw C;return}if(g!==null&&(Ys=!0),BI&&B!==null&&C instanceof Error&&!jG.has(C)){jG.add(C);let A=[],Q=I.fn?.name;Q&&A.push(Q);let U=B;for(;U!==null;){var F=U.function?.[HC];if(F){let d=F.split("/").pop();A.push(d)}U=U.p}let s=OQ?" ":" ";qg(C,"message",{value:C.message+` -${A.map(d=>` -${s}in ${d}`).join("")} -`}),qg(C,"component_stack",{value:A});let l=C.stack;if(l){let d=l.split(` -`),c=[];for(let i=0;i0)for(c.length=wC+ZC.length,i=0;i0;){I++>1e3&&ge();var g=BU,B=g.length;BU=[];for(var F=0;F0;)FU=!0,Ac(),Bc();return I}async function MA(){await Promise.resolve(),zA()}function t(C){var I=C.f,g=(I&2)!==0;if(wQ!==null&&wQ.add(C),NI!==null&&!$C){if(!aB?.includes(C)){var B=NI.deps;C.rv>>0).toString(36)}var Qe=["allowfullscreen","async","autofocus","autoplay","checked","controls","default","disabled","formnovalidate","hidden","indeterminate","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","seamless","selected","webkitdirectory","defer","disablepictureinpicture","disableremoteplayback"];var ay=[...Qe,"formNoValidate","isMap","noModule","playsInline","readOnly","value","volume","defaultValue","defaultChecked","srcObject","noValidate","allowFullscreen","disablePictureInPicture","disableRemotePlayback"];var Ue=["touchstart","touchmove"];function Cd(C){return Ue.includes(C)}function Ts(C){return C?.replace(/\//g,"/\u200B")}var Bd=new Map;function Fd(C,I){var g=Bd.get(C);g||(g=new Set,Bd.set(C,g)),g.add(I)}var Ad=!1;function ws(){Ad||(Ad=!0,document.addEventListener("reset",C=>{Promise.resolve().then(()=>{if(!C.defaultPrevented)for(let I of C.target.elements)I.__on_r?.()})},{capture:!0}))}function KA(C){var I=NI,g=SI;Gg(null),vg(null);try{return C()}finally{Gg(I),vg(g)}}function Uc(C,I,g,B=g){C.addEventListener(I,()=>KA(g));let F=C.__on_r;F?C.__on_r=()=>{F(),B(!0)}:C.__on_r=()=>B(!0),ws()}var sc=new Set,fs=new Set;function Qd(C,I,g,B={}){function F(A){if(B.capture||PA.call(I,A),!A.cancelBubble)return KA(()=>g?.call(this,A))}return C.startsWith("pointer")||C.startsWith("touch")||C==="wheel"?oC(()=>{I.addEventListener(C,F,B)}):I.addEventListener(C,F,B),F}function VC(C,I,g,B,F){var A={capture:B,passive:F},Q=Qd(C,I,g,A);(I===document.body||I===window||I===document)&&mC(()=>{I.removeEventListener(C,Q,A)})}function qI(C){for(var I=0;I{throw n});throw i}}finally{C.__root=I,delete C.currentTarget,Gg(d),vg(c)}}}var se;function Ud(){se=void 0}function AU(C){var I=document.createElement("template");return I.innerHTML=C,I.content}function yC(C,I){var g=SI;g.nodes_start===null&&(g.nodes_start=C,g.nodes_end=I)}function f(C,I){var g=(I&1)!==0,B=(I&2)!==0,F,A=!C.startsWith("");return()=>{if(GI)return yC(XI,null),XI;F===void 0&&(F=AU(A?C:""+C),g||(F=Ng(F)));var Q=B||OQ?document.importNode(F,!0):F.cloneNode(!0);if(g){var U=Ng(Q),s=Q.lastChild;yC(U,s)}else yC(Q,Q);return Q}}function lc(C=""){if(!GI){var I=hC(C+"");return yC(I,I),I}var g=XI;return g.nodeType!==3&&(g.before(g=hC()),cg(g)),yC(g,g),g}function IC(){if(GI)return yC(XI,null),XI;var C=document.createDocumentFragment(),I=document.createComment(""),g=hC();return C.append(I,g),yC(I,g),C}function w(C,I){if(GI){SI.nodes_end=XI,rg();return}C!==null&&C.before(I)}var zs=!0;function PI(C,I){var g=I==null?"":typeof I=="object"?I+"":I;g!==(C.__t??=C.nodeValue)&&(C.__t=g,C.nodeValue=g+"")}function nB(C,I){return sd(C,I)}function cc(C,I){Ns(),I.intro=I.intro??!1;let g=I.target,B=GI,F=XI;try{for(var A=Ng(g);A&&(A.nodeType!==8||A.data!==tF);)A=$g(A);if(!A)throw JB;tC(!0),cg(A),rg();let Q=sd(C,{...I,anchor:A});if(XI===null||XI.nodeType!==8||XI.data!==fF)throw JB;return tC(!1),Q}catch(Q){if(Q===JB)return I.recover===!1&&nG(),Ns(),_Q(g),tC(!1),nB(C,I);throw Q}finally{tC(B),cg(F),Ud()}}var jA=new Map;function sd(C,{target:I,anchor:g,props:B={},events:F,context:A,intro:Q=!0}){Ns();var U=new Set,s=c=>{for(var i=0;i{var c=g??I.appendChild(hC());return Kg(()=>{if(A){oI({});var i=jI;i.c=A}F&&(B.$$events=F),GI&&yC(c,null),zs=Q,l=C(c,B)||{},zs=!0,GI&&(SI.nodes_end=XI),A&&yI()}),()=>{for(var i of U){I.removeEventListener(i,PA);var G=jA.get(i);--G===0?(document.removeEventListener(i,PA),jA.delete(i)):jA.set(i,G)}fs.delete(s),c!==g&&c.parentNode?.removeChild(c)}});return tc.set(l,d),l}var tc=new WeakMap;function wB(C,I){let g=tc.get(C);return g?(tc.delete(C),g(I)):(BI&&void 0,Promise.resolve())}function bI(C,I,[g,B]=[0,0]){GI&&g===0&&rg();var F=C,A=null,Q=null,U=og,s=g>0?65536:0,l=!1;let d=(i,G=!0)=>{l=!0,c(G,i)},c=(i,G)=>{if(U===(U=i))return;let b=!1;if(GI&&B!==-1){if(g===0){let V=F.data;V===tF?B=0:V===cF?B=1/0:(B=parseInt(V.substring(1)),B!==B&&(B=U?1/0:-1))}let e=B>g;!!U===e&&(F=PF(),cg(F),tC(!1),b=!0,B=-1)}U?(A?dF(A):G&&(A=Kg(()=>G(F))),Q&&TC(Q,()=>{Q=null})):(Q?dF(Q):G&&(Q=Kg(()=>G(F,[g+1,B]))),A&&TC(A,()=>{A=null})),b&&tC(!0)};cC(()=>{l=!1,I(d),l||c(null,null)},s),GI&&(F=XI)}function OA(C,I,g){GI&&rg();var B=C,F=og,A,Q=UB()?ZG:pA;cC(()=>{Q(F,F=I())&&(A&&TC(A),A=Kg(()=>g(B)))}),GI&&(B=XI)}var QU=null;function sg(C,I){return I}function de(C,I,g,B){for(var F=[],A=I.length,Q=0;Q0&&F.length===0&&g!==null;if(U){var s=g.parentNode;_Q(s),s.append(g),B.clear(),bF(C,I[0].prev,I[A-1].next)}Cc(F,()=>{for(var l=0;l{var G=g();return OC(G)?G:G==null?[]:YQ(G)});cC(()=>{var G=t(i),b=G.length;if(c&&b===0)return;c=b===0;let e=!1;if(GI){var V=Q.data===cF;V!==(b===0)&&(Q=PF(),cg(Q),tC(!1),e=!0)}if(GI){for(var u=null,n,R=0;R0&&cg(PF())}GI||be(G,U,Q,F,I,B,g),A!==null&&(b===0?d?dF(d):d=Kg(()=>A(Q)):d!==null&&TC(d,()=>{d=null})),e&&tC(!0),t(i)}),GI&&(Q=XI)}function be(C,I,g,B,F,A,Q){var U=(F&8)!==0,s=(F&3)!==0,l=C.length,d=I.items,c=I.first,i=c,G,b=null,e,V=[],u=[],n,R,h,m;if(U)for(m=0;m0){var j=(F&4)!==0&&l===0?g:null;if(U){for(m=0;m{if(e!==void 0)for(h of e)h.a?.apply()}),SI.first=I.first&&I.first.e,SI.last=b&&b.e}function ee(C,I,g,B){(B&1)!==0&&vA(C.v,I),(B&2)!==0?vA(C.i,g):C.i=g}function cd(C,I,g,B,F,A,Q,U,s,l){var d=QU,c=(s&1)!==0,i=(s&16)===0,G=c?i?TB(F):kg(F):F,b=(s&2)===0?Q:kg(Q);BI&&c&&(G.debug=()=>{var V=typeof b=="number"?Q:b.v;l()[V]});var e={i:b,v:G,k:A,a:null,e:null,prev:g,next:B};QU=e;try{return e.e=Kg(()=>U(C,G,b,l),GI),e.e.prev=g&&g.e,e.e.next=B&&B.e,g===null?I.first=e:(g.next=e,g.e.next=e.e),B!==null&&(B.prev=e,B.e.prev=e.e),e}finally{QU=d}}function ld(C,I,g){for(var B=C.next?C.next.e.nodes_start:g,F=I?I.e.nodes_start:g,A=C.e.nodes_start;A!==B;){var Q=$g(A);F.before(A),A=Q}}function bF(C,I,g){I===null?C.first=g:(I.next=g,I.e.next=g&&g.e),g!==null&&(g.prev=I,g.e.prev=I&&I.e)}function Ze(C,I,g){if(!I||I===gd(String(g??"")))return;let B,F=C.__svelte_meta?.loc;F?B=`near ${F.file}:${F.line}:${F.column}`:YC?.[HC]&&(B=`in ${YC[HC]}`),Ts(B)}function _F(C,I,g=!1,B=!1,F=!1){var A=C,Q="";lI(()=>{var U=SI;if(Q===(Q=I()??"")){GI&&rg();return}if(U.nodes_start!==null&&(Ic(U.nodes_start,U.nodes_end),U.nodes_start=U.nodes_end=null),Q!==""){if(GI){for(var s=XI.data,l=rg(),d=l;l!==null&&(l.nodeType!==8||l.data!=="");)d=l,l=$g(l);if(l===null)throw JB;BI&&!F&&Ze(l.parentNode,s,Q),yC(XI,d),A=cg(l);return}var c=Q+"";g?c=`${c}`:B&&(c=`${c}`);var i=AU(c);if((g||B)&&(i=Ng(i)),yC(Ng(i),i.lastChild),g||B)for(;Ng(i);)A.before(Ng(i));else A.before(i)}})}function SC(C,I,...g){var B=C,F=Eg,A;cC(()=>{F!==(F=I())&&(A&&(sC(A),A=null),BI&&F==null&&RG(),A=Kg(()=>F(B,...g)))},65536),GI&&(B=XI)}function dc(C,I,g){GI&&rg();var B=C,F,A;cC(()=>{F!==(F=I())&&(A&&(TC(A),A=null),F&&(A=Kg(()=>g(B,F))))},65536),GI&&(B=XI)}function fB(C,I){oC(()=>{var g=C.getRootNode(),B=g.host?g:g.head??g.ownerDocument.head;if(!B.querySelector("#"+I.hash)){let F=document.createElement("style");F.id=I.hash,F.textContent=I.code,B.appendChild(F),BI&&Fd(I.hash,F)}})}function Ms(C,I,g){QC(()=>{var B=Ag(()=>I(C,g?.())||{});if(g&&B?.update){var F=!1,A={};eC(()=>{var Q=g();Ds(Q),F&&pA(A,Q)&&(A=Q,B.update(Q))}),F=!0}if(B?.destroy)return()=>B.destroy()})}function id(C){var I,g,B="";if(typeof C=="string"||typeof C=="number")B+=C;else if(typeof C=="object")if(Array.isArray(C)){var F=C.length;for(I=0;I=0;){var U=Q+A;(Q===0||dd.includes(B[Q-1]))&&(U===B.length||dd.includes(B[U]))?B=(Q===0?"":B.substring(0,Q))+B.substring(U+1):Q=U}}return B===""?null:B}function bd(C,I=!1){var g=I?" !important;":";",B="";for(var F in C){var A=C[F];A!=null&&A!==""&&(B+=" "+F+": "+A+g)}return B}function bc(C){return C[0]!=="-"||C[1]!=="-"?C.toLowerCase():C}function Zd(C,I){if(I){var g="",B,F;if(Array.isArray(I)?(B=I[0],F=I[1]):B=I,C){C=String(C).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var A=!1,Q=0,U=!1,s=[];B&&s.push(...Object.keys(B).map(bc)),F&&s.push(...Object.keys(F).map(bc));var l=0,d=-1;let e=C.length;for(var c=0;c{if(!I){if(I=!0,C.hasAttribute("value")){var B=C.value;zI(C,"value",null),C.value=B}if(C.hasAttribute("checked")){var F=C.checked;zI(C,"checked",null),C.checked=F}}};C.__on_r=g,PG(g),ws()}}function eF(C,I){var g=xd(C);g.value===(g.value=I??void 0)||C.value===I&&(I!==0||C.nodeName!=="PROGRESS")||(C.value=I??"")}function zI(C,I,g,B){var F=xd(C);if(GI&&(F[I]=C.getAttribute(I),I==="src"||I==="srcset"||I==="href"&&C.nodeName==="LINK")){B||oe(C,I,g??"");return}F[I]!==(F[I]=g)&&(I==="loading"&&(C[eG]=g),g==null?C.removeAttribute(I):typeof g!="string"&&he(C).includes(I)?C[I]=g:C.setAttribute(I,g))}function xd(C){return C.__attributes??={[Re]:C.nodeName.includes("-"),[me]:C.namespaceURI===WG}}var Vd=new Map;function he(C){var I=Vd.get(C.nodeName);if(I)return I;Vd.set(C.nodeName,I=[]);for(var g,B=C,F=Element.prototype;F!==B;){g=ys(B);for(var A in g)g[A].set&&I.push(A);B=lF(B)}return I}function oe(C,I,g){BI&&(I==="srcset"&&ye(C,g)||Zc(C.getAttribute(I)??"",g)||(C.outerHTML.replace(C.innerHTML,C.innerHTML&&"..."),String(g),void 0))}function Zc(C,I){return C===I?!0:new URL(C,document.baseURI).href===new URL(I,document.baseURI).href}function ud(C){return C.split(",").map(I=>I.trim().split(" ").filter(Boolean))}function ye(C,I){var g=ud(C.srcset),B=ud(I);return B.length===g.length&&B.every(([F,A],Q)=>A===g[Q][1]&&(Zc(g[Q][0],F)||Zc(F,g[Q][0])))}var Se=os?()=>performance.now():()=>Date.now(),tB={tick:C=>(os?requestAnimationFrame:Eg)(C),now:()=>Se(),tasks:new Set};function Ld(){let C=tB.now();tB.tasks.forEach(I=>{I.c(C)||(tB.tasks.delete(I),I.f())}),tB.tasks.size!==0&&tB.tick(Ld)}function ad(C){let I;return tB.tasks.size===0&&tB.tick(Ld),{promise:new Promise(g=>{tB.tasks.add(I={c:C,f:g})}),abort(){tB.tasks.delete(I)}}}function Ks(C,I){KA(()=>{C.dispatchEvent(new CustomEvent(I))})}function re(C){if(C==="float")return"cssFloat";if(C==="offset")return"cssOffset";if(C.startsWith("--"))return C;let I=C.split("-");return I.length===1?I[0]:I[0]+I.slice(1).map(g=>g[0].toUpperCase()+g.slice(1)).join("")}function nd(C){let I={},g=C.split(";");for(let B of g){let[F,A]=B.split(":");if(!F||A===void 0)break;let Q=re(F.trim());I[Q]=A.trim()}return I}var Ne=C=>C;function CC(C,I,g,B){var F=(C&1)!==0,A=(C&2)!==0,Q=F&&A,U=(C&4)!==0,s=Q?"both":F?"in":"out",l,d=I.inert,c=I.style.overflow,i,G;function b(){var R=NI,h=SI;Gg(null),vg(null);try{return l??=g()(I,B?.()??{},{direction:s})}finally{Gg(R),vg(h)}}var e={is_global:U,in(){if(I.inert=d,!F){G?.abort(),G?.reset?.();return}A||i?.abort(),Ks(I,"introstart"),i=Vc(I,b(),G,1,()=>{Ks(I,"introend"),i?.abort(),i=l=void 0,I.style.overflow=c})},out(R){if(!A){R?.(),l=void 0;return}I.inert=!0,Ks(I,"outrostart"),G=Vc(I,b(),i,0,()=>{Ks(I,"outroend"),R?.()})},stop:()=>{i?.abort(),G?.abort()}},V=SI;if((V.transitions??=[]).push(e),F&&zs){var u=U;if(!u){for(var n=V.parent;n&&(n.f&65536)!==0;)for(;(n=n.parent)&&(n.f&16)===0;);u=!n||(n.f&32768)!==0}u&&QC(()=>{Ag(()=>e.in())})}}function Vc(C,I,g,B,F){var A=B===1;if(Yt(I)){var Q,U=!1;return oC(()=>{if(!U){var V=I({direction:A?"in":"out"});Q=Vc(C,V,g,B,F)}}),{abort:()=>{U=!0,Q?.abort()},deactivate:()=>Q.deactivate(),reset:()=>Q.reset(),t:()=>Q.t()}}if(g?.deactivate(),!I?.duration)return F(),{abort:Eg,deactivate:Eg,reset:Eg,t:()=>B};let{delay:s=0,css:l,tick:d,easing:c=Ne}=I;var i=[];if(A&&g===void 0&&(d&&d(0,1),l)){var G=nd(l(0,1));i.push(G,G)}var b=()=>1-B,e=C.animate(i,{duration:s});return e.onfinish=()=>{var V=g?.t()??1-B;g?.abort();var u=B-V,n=I.duration*Math.abs(u),R=[];if(n>0){var h=!1;if(l)for(var m=Math.ceil(n/16.666666666666668),a=0;a<=m;a+=1){var L=V+u*c(a/m),y=nd(l(L,1-L));R.push(y),h||=y.overflow==="hidden"}h&&(C.style.overflow="hidden"),b=()=>{var E=e.currentTime;return V+u*c(E/n)},d&&ad(()=>{if(e.playState!=="running")return!1;var E=b();return d(E,1-E),!0})}e=C.animate(R,{duration:n,fill:"forwards"}),e.onfinish=()=>{b=()=>B,d?.(B,1-B),F()}},{abort:()=>{e&&(e.cancel(),e.effect=null,e.onfinish=Eg)},deactivate:()=>{F=Eg},reset:()=>{B===0&&d?.(1,0)},t:()=>b()}}function Lc(C,I,g=I){var B=UB();Uc(C,"input",F=>{BI&&C.type==="checkbox"&&Jt();var A=F?C.defaultValue:C.value;if(A=uc(C)?xc(A):A,g(A),B&&A!==(A=I())){var Q=C.selectionStart,U=C.selectionEnd;C.value=A??"",U!==null&&(C.selectionStart=Q,C.selectionEnd=Math.min(U,C.value.length))}}),(GI&&C.defaultValue!==C.value||Ag(I)==null&&C.value)&&g(uc(C)?xc(C.value):C.value),eC(()=>{BI&&C.type==="checkbox"&&Jt();var F=I();uc(C)&&F===xc(C.value)||C.type==="date"&&!F&&!C.value||F!==C.value&&(C.value=F??"")})}function uc(C){var I=C.type;return I==="number"||I==="range"}function xc(C){return C===""?null:+C}function UU(C,I,g){if(C.multiple)return pe(C,I);for(var B of C.options){var F=Rd(B);if(kt(F,I)){B.selected=!0;return}}(!g||I!==void 0)&&(C.selectedIndex=-1)}function ac(C,I){let g=!0;QC(()=>{I&&UU(C,Ag(I),g),g=!1;var B=new MutationObserver(()=>{var F=C.__value;UU(C,F)});return B.observe(C,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),()=>{B.disconnect()}})}function pe(C,I){for(var g of C.options)g.selected=~I.indexOf(Rd(g))}function Rd(C){return"__value"in C?C.__value:C.value}var nc=class C{#I=new WeakMap;#g;#C;static entries=new WeakMap;constructor(I){this.#C=I}observe(I,g){var B=this.#I.get(I)||new Set;return B.add(g),this.#I.set(I,B),this.#B().observe(I,this.#C),()=>{var F=this.#I.get(I);F.delete(g),F.size===0&&(this.#I.delete(I),this.#g.unobserve(I))}}#B(){return this.#g??(this.#g=new ResizeObserver(I=>{for(var g of I){C.entries.set(g.target,g);for(var B of this.#I.get(g.target)||[])B(g)}}))}};var He=new nc({box:"border-box"});function js(C,I,g){var B=He.observe(C,()=>g(C[I]));QC(()=>(Ag(()=>g(C[I])),B))}function md(C,I){return C===I||C?.[GC]===I}function cB(C={},I,g,B){return QC(()=>{var F,A;return eC(()=>{F=A,A=B?.()||[],Ag(()=>{C!==g(...A)&&(I(C,...A),F&&md(g(...F),C)&&I(null,...F))})}),()=>{oC(()=>{A&&md(g(...A),C)&&I(null,...A)})}}),C}var Os=!1,Kr=Symbol();function mc(C){var I=Os;try{return Os=!1,[C(),Os]}finally{Os=I}}function od(C){return C.ctx?.d??!1}function H(C,I,g,B){var F=(g&1)!==0,A=!YB||(g&2)!==0,Q=(g&8)!==0,U=(g&16)!==0,s=!1,l;Q?[l,s]=mc(()=>C[I]):l=C[I];var d=GC in C||vQ in C,c=Q&&(_C(C,I)?.set??(d&&I in C&&(L=>C[I]=L)))||void 0,i=B,G=!0,b=!1,e=()=>(b=!0,G&&(G=!1,U?i=Ag(B):i=B),i);l===void 0&&B!==void 0&&(c&&A&&mG(I),l=e(),c&&c(l));var V;if(A)V=()=>{var L=C[I];return L===void 0?e():(G=!0,b=!1,L)};else{var u=(F?iF:KQ)(()=>C[I]);u.f|=131072,V=()=>{var L=t(u);return L!==void 0&&(i=void 0),L===void 0?i:L}}if((g&4)===0)return V;if(c){var n=C.$$legacy;return function(L,y){return arguments.length>0?((!A||!y||n||s)&&c(y?V():L),L):V()}}var R=!1,h=!1,m=TB(l),a=iF(()=>{var L=V(),y=t(m);return R?(R=!1,h=!0,y):(h=!1,m.v=L)});return Q&&t(a),F||(a.equals=HA),function(L,y){if(wQ!==null&&(R=h,V(),t(m)),arguments.length>0){let E=y?t(a):A&&Q?wI(L):L;if(!a.equals(E)){if(R=!0,p(m,E),b&&i!==void 0&&(i=E),od(a))return L;Ag(()=>t(a))}return L}return od(a)?a.v:t(a)}}function yd(C){return new hc(C)}var hc=class{#I;#g;constructor(I){var g=new Map,B=(A,Q)=>{var U=TB(Q);return g.set(A,U),U};let F=new Proxy({...I.props||{},$$events:{}},{get(A,Q){return t(g.get(Q)??B(Q,Reflect.get(A,Q)))},has(A,Q){return Q===vQ?!0:(t(g.get(Q)??B(Q,Reflect.get(A,Q))),Reflect.has(A,Q))},set(A,Q,U){return p(g.get(Q)??B(Q,U),U),Reflect.set(A,Q,U)}});this.#g=(I.hydrate?cc:nB)(I.component,{target:I.target,anchor:I.anchor,props:F,context:I.context,intro:I.intro??!1,recover:I.recover}),(!I?.props?.$$host||I.sync===!1)&&zA(),this.#I=F.$$events;for(let A of Object.keys(this.#g))A==="$set"||A==="$destroy"||A==="$on"||qg(this,A,{get(){return this.#g[A]},set(Q){this.#g[A]=Q},enumerable:!0});this.#g.$set=A=>{Object.assign(F,A)},this.#g.$destroy=()=>{wB(this.#g)}}$set(I){this.#g.$set(I)}$on(I,g){this.#I[I]=this.#I[I]||[];let B=(...F)=>g.call(this,...F);return this.#I[I].push(B),()=>{this.#I[I]=this.#I[I].filter(F=>F!==B)}}$destroy(){this.#g.$destroy()}};var je;typeof HTMLElement=="function"&&(je=class extends HTMLElement{$$ctor;$$s;$$c;$$cn=!1;$$d={};$$r=!1;$$p_d={};$$l={};$$l_u=new Map;$$me;constructor(C,I,g){super(),this.$$ctor=C,this.$$s=I,g&&this.attachShadow({mode:"open"})}addEventListener(C,I,g){if(this.$$l[C]=this.$$l[C]||[],this.$$l[C].push(I),this.$$c){let B=this.$$c.$on(C,I);this.$$l_u.set(I,B)}super.addEventListener(C,I,g)}removeEventListener(C,I,g){if(super.removeEventListener(C,I,g),this.$$c){let B=this.$$l_u.get(I);B&&(B(),this.$$l_u.delete(I))}}async connectedCallback(){if(this.$$cn=!0,!this.$$c){let C=function(B){return F=>{let A=document.createElement("slot");B!=="default"&&(A.name=B),w(F,A)}};if(await Promise.resolve(),!this.$$cn||this.$$c)return;let I={},g=Oe(this);for(let B of this.$$s)B in g&&(B==="default"&&!this.$$d.children?(this.$$d.children=C(B),I.default=!0):I[B]=C(B));for(let B of this.attributes){let F=this.$$g_p(B.name);F in this.$$d||(this.$$d[F]=oc(F,B.value,this.$$p_d,"toProp"))}for(let B in this.$$p_d)!(B in this.$$d)&&this[B]!==void 0&&(this.$$d[B]=this[B],delete this[B]);this.$$c=yd({component:this.$$ctor,target:this.shadowRoot||this,props:{...this.$$d,$$slots:I,$$host:this}}),this.$$me=_t(()=>{eC(()=>{this.$$r=!0;for(let B of pt(this.$$c)){if(!this.$$p_d[B]?.reflect)continue;this.$$d[B]=this.$$c[B];let F=oc(B,this.$$d[B],this.$$p_d,"toAttribute");F==null?this.removeAttribute(this.$$p_d[B].attribute||B):this.setAttribute(this.$$p_d[B].attribute||B,F)}this.$$r=!1})});for(let B in this.$$l)for(let F of this.$$l[B]){let A=this.$$c.$on(B,F);this.$$l_u.set(F,A)}this.$$l={}}}attributeChangedCallback(C,I,g){this.$$r||(C=this.$$g_p(C),this.$$d[C]=oc(C,g,this.$$p_d,"toProp"),this.$$c?.$set({[C]:this.$$d[C]}))}disconnectedCallback(){this.$$cn=!1,Promise.resolve().then(()=>{!this.$$cn&&this.$$c&&(this.$$c.$destroy(),this.$$me(),this.$$c=void 0)})}$$g_p(C){return pt(this.$$p_d).find(I=>this.$$p_d[I].attribute===C||!this.$$p_d[I].attribute&&I.toLowerCase()===C)||C}});function oc(C,I,g,B){let F=g[C]?.type;if(I=F==="Boolean"&&typeof I!="boolean"?I!=null:I,!B||!g[C])return I;if(B==="toAttribute")switch(F){case"Object":case"Array":return I==null?null:JSON.stringify(I);case"Boolean":return I?"":null;case"Number":return I??null;default:return I}else switch(F){case"Object":case"Array":return I&&JSON.parse(I);case"Boolean":return I;case"Number":return I!=null?+I:I;default:return I}}function Oe(C){let I={};return C.childNodes.forEach(g=>{I[g.slot||"default"]=!0}),I}if(BI){let C=function(I){if(!(I in globalThis)){let g;Object.defineProperty(globalThis,I,{configurable:!0,get:()=>{if(g!==void 0)return g;hG(I)},set:B=>{g=B}})}};C("$state"),C("$effect"),C("$derived"),C("$inspect"),C("$props"),C("$bindable")}function MB(C){jI===null&&fQ("onMount"),YB&&jI.l!==null?qe(jI).m.push(C):pg(()=>{let I=Ag(C);if(typeof I=="function")return I})}function Sd(C){jI===null&&fQ("onDestroy"),MB(()=>()=>Ag(C))}function qe(C){var I=C.l;return I.u??={a:[],b:[],m:[]}}var Xd="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(Xd);var $e=f("
"),IZ=f("");function RB(C,I){let g=H(I,"text",3,""),B=H(I,"icon",3,""),F=H(I,"tooltip",3,""),A=H(I,"size",3,null),Q=H(I,"onClick",3,()=>{}),U=H(I,"class",3,"");var s=IZ();let l;s.__click=function(...b){Q()?.apply(this,b)};var d=O(s);{var c=b=>{var e=$e(),V=O(e,!0);z(e),lI(()=>PI(V,g())),w(b,e)};bI(d,b=>{g()&&b(c)})}var i=k(d,2);{var G=b=>{uC(b,{get icon(){return B()},get size(){return A()}})};bI(i,b=>{B()&&b(G)})}z(s),lI(b=>{l=WI(s,1,gC(U()),null,l,b),zI(s,"aria-label",F())},[()=>({"svelcomlib-icon-text":B()})]),w(C,s)}qI(["click"]);var gZ=(C,I)=>I()(C.target.value,C.target),CZ=f(""),BZ=f("");function iB(C,I){oI(I,!0);let g=H(I,"onChange",3,()=>{}),B=H(I,"options",19,()=>[]),F=H(I,"value",3,""),A=H(I,"disabled",3,!1),Q=H(I,"class",3,"");var U=BZ();U.__change=[gZ,g],ac(U,F);var s;Ig(U,21,B,sg,(l,d,c,i)=>{let G=()=>t(d).value,b=()=>t(d).text;var e=CZ(),V={},u=O(e,!0);z(e),lI(()=>{V!==(V=G())&&(e.value=(e.__value=G())??""),PI(u,b())}),w(l,e)}),z(U),lI(()=>{WI(U,1,gC(Q()?Q()+" dropdown":"dropdown")),U.disabled=A(),s!==(s=F())&&(U.value=(U.__value=F())??"",UU(U,F()))}),w(C,U),yI()}qI(["change"]);var Wd=require("obsidian");function uC(C,I){oI(I,!0);let g=H(I,"icon",3,""),B=H(I,"size",3,null),F=H(I,"stroke_width",3,null),A=H(I,"class",3,""),Q=iI(null);pg(()=>{g().startsWith("{t(Q)&&B()&&(typeof B()=="number"?(t(Q).style.width=B()+"px",t(Q).style.height=B()+"px"):Array.isArray(B())?(t(Q).style.width=B()[0]+"px",t(Q).style.height=B()[1]+"px"):(t(Q).style.width=`var(--${B()})`,t(Q).style.height=`var(--${B()})`))}),pg(()=>{t(Q)&&F()&&(t(Q).style.strokeWidth=F()+"px")});var U=IC(),s=JI(U);_F(s,()=>t(Q)?.outerHTML??""),w(C,U),yI()}var FZ=(C,I)=>I()(C.target.value),AZ=f("");function qF(C,I){oI(I,!0);let g=H(I,"type",3,"text"),B=H(I,"value",3,""),F=H(I,"placeholder",3,""),A=H(I,"onChange",3,()=>{}),Q=H(I,"valid",3,!1),U=H(I,"readonly",3,!1),s=H(I,"class",3,"");var l=AZ();zB(l),l.__input=[FZ,A];let d;lI(c=>{zI(l,"type",g()),eF(l,B()),zI(l,"placeholder",F()),l.readOnly=U(),d=WI(l,1,gC(s()),null,d,c)},[()=>({"svelcomlib-input-success":Q(),"svelcomlib-input-fail":Q()===!1})]),w(C,l),yI()}qI(["input"]);var QZ=(C,I,g)=>{I()(g())},UZ=f('');function $F(C,I){oI(I,!0);let g=H(I,"min",3,0),B=H(I,"max",3,100),F=H(I,"step",3,1),A=H(I,"value",7,0),Q=H(I,"onChange",3,()=>{}),U=H(I,"getTooltip",3,l=>l.toString());var s=UZ();zB(s),s.__input=()=>{let l=document.body.lastChild;l.classList.contains("tooltip")&&(l.firstChild.textContent=U()(A()),l.style.width="auto")},s.__change=[QZ,Q,A],lI(l=>{zI(s,"min",g()),zI(s,"max",B()),zI(s,"step",F()),zI(s,"aria-label",l)},[()=>U()(A())]),Lc(s,A),w(C,s),yI()}qI(["input","change"]);var SY=f("");qI(["change","contextmenu"]);var sZ=(C,I,g,B)=>{I()||g()(!B()),B(!B())},lZ=f('
');function vI(C,I){oI(I,!0);let g=H(I,"value",7,!1),B=H(I,"onChange",3,()=>{}),F=H(I,"disabled",3,!1);var A=lZ();let Q;A.__click=[sZ,F,B,g];var U=O(A);z(A),lI(s=>{Q=WI(A,1,"checkbox-container",null,Q,s),U.disabled=F()},[()=>({"is-enabled":g()})]),w(C,A),yI()}qI(["click"]);var pY=f(''),HY=f(' '),YY=f('
');qI(["click"]);var kY=f('
');var tZ=(C,I,g,B)=>{I((I()+1)%g().length),B()()},cZ=f("
");function ZF(C,I){oI(I,!0);let g=H(I,"states",19,()=>[]),B=H(I,"value",15,0),F=H(I,"size",3,null),A=H(I,"onClick",3,()=>{}),Q=H(I,"onContextMenu",3,()=>{}),U=H(I,"class",3,"");var s=cZ();s.__click=[tZ,B,g,A],s.__contextmenu=function(...G){Q()?.apply(this,G)};var l=O(s);{var d=G=>{uC(G,{get icon(){return g()[B()].icon},get size(){return F()}})};bI(l,G=>{g()[B()].icon&&G(d)})}var c=k(l,2);{var i=G=>{var b=lc();lI(()=>PI(b,g()[B()].text)),w(G,b)};bI(c,G=>{g()[B()].text&&G(i)})}z(s),lI(()=>{WI(s,1,U()+" svelcomlib-icon-text"),zI(s,"aria-label",g()[B()].tooltip)}),w(C,s),yI()}qI(["click","contextmenu"]);var KY=f("");qI(["click"]);var _Y=f("
");qI(["input"]);var iZ=f('
'),GZ=f('
'),dZ={hash:"svelte-3kpd",code:""};function sU(C,I){oI(I,!0),fB(C,dZ);let g=H(I,"height",3,"100%"),B=H(I,"itemHeight",3,void 0),F=H(I,"start",7,0),A=H(I,"end",7,0),Q=wI([]),U=iI(wI([])),s=iI(void 0),l=iI(void 0),d=iI(0),c=iI(void 0),i=iI(0),G=iI(0),b=iI(0),e=iI(0),V=sI(()=>I.items.slice(F(),A()).map((a,L)=>({index:L+F(),data:a})));pg(()=>{t(c)&&u(I.items,t(d),B())});async function u(a,L,y){a.lengtha){F(L),p(i,y,!0);break}y+=Y,L+=1}for(;La+t(d))););A(L);let E=I.items.length-A();for(p(b,y/A());L{p(U,t(l).getElementsByClassName("svelcomlib-virtual-list-row"),!0),p(c,!0)});var h=GZ(),m=O(h);return Ig(m,21,()=>t(V),a=>a.index,(a,L)=>{var y=iZ(),E=O(y);SC(E,()=>I.item,()=>t(L).data,()=>t(L).index),z(y),w(a,y)}),z(m),cB(m,a=>p(l,a),()=>t(l)),z(h),cB(h,a=>p(s,a),()=>t(s)),lI(()=>{IB(h,`height: ${g()??""};`),IB(m,`padding-top: ${t(i)??""}px; padding-bottom: ${t(G)??""}px; --scroll-offset: ${t(e)??""}px`)}),VC("scroll",h,n),js(h,"offsetHeight",a=>p(d,a)),w(C,h),yI({scrollToIndex:R})}var _s=require("obsidian"),uZ=f("
");function IA(C,I){oI(I,!0);let g=H(I,"source",3,""),B=H(I,"class",3,""),F=iI(void 0);MB(async()=>{let Q=new _s.Component;await _s.MarkdownRenderer.render(I.plugin.app,I.text,t(F),g(),Q),Q.load()});var A=uZ();cB(A,Q=>p(F,Q),()=>t(F)),lI(()=>WI(A,1,gC(B()))),w(C,A),yI()}var xZ=f("Empty navheader"),LZ=f('');function lU(C,I){"use strict";var g=LZ(),B=O(g),F=O(B);{var A=U=>{var s=IC(),l=JI(s);SC(l,()=>I.container),w(U,s)},Q=U=>{var s=xZ();w(U,s)};bI(F,U=>{I.container?U(A):U(Q,!1)})}z(B),z(g),w(C,g)}var aZ=f("
"),nZ=f(" ",1),RZ=f('
',1);function tI(C,I){oI(I,!0);let g=H(I,"description",3,null),B=H(I,"type",3,null),F=H(I,"depth",3,0),A=H(I,"notices",19,()=>[]),Q=H(I,"class",3,""),U=sI(()=>{let L="";return F()&&(L+=" svelcomlib-"+"sub".repeat(F())+"setting"),B()==="heading"&&(L+=" svelcomlib-setting-"+"sub".repeat(F())+"heading"),L});var s=RZ(),l=JI(s);let d;var c=O(l),i=O(c),G=O(i),b=O(G);_F(b,()=>I.name),z(G),z(i);var e=k(i,2),V=O(e);_F(V,g);var u=k(V,2);Ig(u,17,A,sg,(L,y,E)=>{var Y=IC(),N=JI(Y);{var r=j=>{var _=nZ(),D=JI(_);{var UI=xI=>{var LI=aZ();w(xI,LI)};bI(D,xI=>{(g()||E!==0)&&xI(UI)})}var rI=k(D,2);let RI;var eI=O(rI);_F(eI,()=>t(y).text),z(rI),lI(xI=>RI=WI(rI,1,"svelcomlib-notice "+(t(y).style??""),null,RI,xI),[()=>({"svelcomlib-notice-info":t(y).type==="info","svelcomlib-notice-warning":t(y).type==="warning","svelcomlib-notice-error":t(y).type==="error"})]),w(j,_)};bI(N,j=>{t(y)&&j(r)})}w(L,Y)}),z(e),z(c);var n=k(c,2),R=O(n);{var h=L=>{var y=IC(),E=JI(y);SC(E,()=>I.control),w(L,y)};bI(R,L=>{I.control&&L(h)})}z(n),z(l);var m=k(l,2);{var a=L=>{var y=IC(),E=JI(y);SC(E,()=>I.subcontrol),w(L,y)};bI(m,L=>{I.subcontrol&&L(a)})}lI(L=>d=WI(l,1,(Q()??"")+" setting-item"+t(U),null,d,L),[()=>({"mod-dropdown":B()==="dropdown","mod-toggle":B()==="toggle","mod-slider":B()==="slider","setting-item-heading":B()==="heading"})]),w(C,s),yI()}var mZ=f(" ",1);function tU(C,I){"use strict";let g=H(I,"class",3,"");var B=mZ(),F=JI(B);{var A=s=>{var l=IC(),d=JI(l);SC(d,()=>I.header,g),w(s,l)};bI(F,s=>{I.header&&s(A)})}var Q=k(F,2);{var U=s=>{var l=IC(),d=JI(l);SC(d,()=>I.view,g),w(s,l)};bI(Q,s=>{I.view&&s(U)})}w(C,B)}var oZ=f(" ",1);function qs(C,I){oI(I,!0);let g=H(I,"plugin",7),B={addition:{icon:"plus-circle",tooltip:"Additions"},deletion:{icon:"minus-square",tooltip:"Deletions"},substitution:{icon:"replace",tooltip:"Substitutions"},highlight:{icon:"highlighter",tooltip:"Highlights"},comment:{icon:"message-square",tooltip:"Comments"}},F={"":{icon:"star",tooltip:"Regular"},...B},A=[{value:"unchanged",text:"Regular movement"},{value:"ignore_bracket",text:"Skip brackets"},{value:"ignore_metadata",text:"Skip brackets and metadata"},{value:"ignore_completely",text:"Skip completely"}],Q=[{value:"unchanged",text:"Regular movement"},{value:"stay_inside",text:"Keep cursor within range"},{value:"stay_outside",text:"Treat range as word group"}];var U=oZ(),s=JI(U);tI(s,{name:"Functionality",type:"heading"});var l=k(s,2);tI(l,{name:"Suggestion mode",type:"heading",depth:1});var d=k(l,2);tI(d,{name:"Cursor movement",type:"heading",depth:2});var c=k(d,2);Ig(c,17,()=>Object.keys(B),sg,(n,R)=>{tI(n,{get name(){return B[t(R)].tooltip},type:"dropdown",depth:2,control:m=>{iB(m,{get value(){return g().settings.suggestion_mode_operations.cursor_movement[t(R)]},options:A,onChange:a=>{g().settings.suggestion_mode_operations.cursor_movement[t(R)]=a,g().saveSettings()}})},$$slots:{control:!0}})});var i=k(c,2);tI(i,{name:"Bracket movement",type:"heading",depth:2});var G=k(i,2);Ig(G,17,()=>Object.keys(B),sg,(n,R)=>{tI(n,{get name(){return B[t(R)].tooltip},type:"dropdown",depth:2,control:m=>{iB(m,{get value(){return g().settings.suggestion_mode_operations.bracket_movement[t(R)]},options:Q,onChange:a=>{g().settings.suggestion_mode_operations.bracket_movement[t(R)]=a,g().saveSettings()}})},$$slots:{control:!0}})});var b=k(G,2);tI(b,{name:"Suggestion mode cursor movement",description:"Determine how the cursor should move through suggestions in suggestion mode",type:"dropdown"});var e=k(b,2);tI(e,{name:"Rendering",type:"heading"});var V=k(e,2);tI(V,{name:"Live Preview renderer",description:"Enable custom rendering of CriticMarkup syntax in Live Preview",type:"toggle",control:R=>{vI(R,{get value(){return g().settings.live_preview},onChange:()=>{g().settings.live_preview=!g().settings.live_preview,g().saveSettings()}})},$$slots:{control:!0}});var u=k(V,2);tI(u,{name:"Reading View renderer",description:"Enable custom rendering of CriticMarkup syntax in Reading View",type:"toggle",control:R=>{vI(R,{get value(){return g().settings.post_processor},onChange:()=>{g().settings.post_processor=!g().settings.post_processor,g().saveSettings()}})},$$slots:{control:!0}}),w(C,U),yI()}var yZ=f(" ",1);function $s(C,I){oI(I,!0);let g=H(I,"plugin",7),B=iI(wI(g().settings.comment_style)),F={inline:"Comments receive a background color and are fully visible (similar to suggestions)",icon:"Comments are displayed as icons and can be hovered over to reveal the comment",block:"Comments are displayed in the right-margin of the editor"};var A=yZ(),Q=JI(A);tI(Q,{name:"Editing features",type:"heading"});var U=k(Q,2);tI(U,{name:"Automatic tag completion",notices:[{type:"info",text:"When typing {++, the tag automatically gets completed with ++}"}],type:"toggle",control:e=>{vI(e,{get value(){return g().settings.tag_completion},onChange:()=>{g().settings.tag_completion=!g().settings.tag_completion,g().saveSettings()}})},$$slots:{control:!0}});var s=k(U,2);tI(s,{name:"Remove syntax on copy",description:"When copying in the editor to the clipboard, any CriticMarkup syntax is removed",notices:[{type:"info",text:"Copying my {++text++} will result in my text"}],type:"toggle",control:e=>{vI(e,{slot:"control",get value(){return g().settings.clipboard_remove_syntax},onChange:()=>{g().settings.clipboard_remove_syntax=!g().settings.clipboard_remove_syntax,g().saveSettings()}})},$$slots:{control:!0}});var l=k(s,2);tI(l,{name:"Automatic tag correction",description:"Dangling tags and redundant whitespaces automatically get removed to prevent invalid CriticMarkup syntax",type:"toggle",control:e=>{vI(e,{get value(){return g().settings.tag_correcter},onChange:()=>{g().settings.tag_correcter=!g().settings.tag_correcter,g().saveSettings()}})},$$slots:{control:!0}});var d=k(l,2);tI(d,{name:"Show style while editing",description:"Keep the style of suggestions visible while editing",type:"toggle",control:e=>{vI(e,{get value(){return g().settings.editor_styling},onChange:()=>{g().settings.editor_styling=!g().settings.editor_styling,g().saveSettings()}})},$$slots:{control:!0}});var c=k(d,2);tI(c,{name:"Comments Rendering",type:"heading"});var i=k(c,2);let G=sI(()=>[{type:"info",text:F[t(B)]}]);tI(i,{name:"Comment rendering mode",description:"Determine how comments are rendered inside the editor",get notices(){return t(G)},type:"dropdown",control:e=>{iB(e,{options:[{value:"inline",text:"Inline"},{value:"icon",text:"Icon"}],get value(){return t(B)},onChange:V=>{g().settings.comment_style=V,p(B,V,!0),g().saveSettings()}})},$$slots:{control:!0}}),w(C,A),yI()}var VF=require("obsidian");async function SZ(C){let I;if(VF.Platform.isMobileApp){let g=await Capacitor.nativePromise("App","getInfo");g&&(I=g.version+" ("+g.build+")")}else I=navigator.userAgent.match(/obsidian\/([\d.]+\d+)/)?.[1]||"unknown";return{plugin_version:C.plugins.plugins.commentator.manifest.version,platform:VF.Platform.isMobileApp?VF.Platform.isAndroidApp?"Android":VF.Platform.isIosApp?"iOS":"mobile":VF.Platform.isMacOS?"macOS":"Desktop",framework_version:I,obsidian_version:VF.apiVersion}}async function XZ(C,I,g={}){let B=I?`[BUG] ${I} \u2013 ADD A TITLE HERE`:"[BUG] ADD A TITLE HERE";try{let A={...await SZ(C),...g},Q=Object.entries(A).map(([U,s])=>`**${U}**: ${JSON.stringify(s)}`).join(` +"use strict";var Ob=Object.create;var yU=Object.defineProperty;var _b=Object.getOwnPropertyDescriptor;var qb=Object.getOwnPropertyNames;var $b=Object.getPrototypeOf,I0=Object.prototype.hasOwnProperty;var SU=(C,I)=>()=>(I||C((I={exports:{}}).exports,I),I.exports),g0=(C,I)=>{for(var g in I)yU(C,g,{get:I[g],enumerable:!0})},BG=(C,I,g,B)=>{if(I&&typeof I=="object"||typeof I=="function")for(let F of qb(I))!I0.call(C,F)&&F!==g&&yU(C,F,{get:()=>I[F],enumerable:!(B=_b(I,F))||B.enumerable});return C};var WU=(C,I,g)=>(g=C!=null?Ob($b(C)):{},BG(I||!C||!C.__esModule?yU(g,"default",{value:C,enumerable:!0}):g,C)),C0=C=>BG(yU({},"__esModule",{value:!0}),C);var Ci=SU((vn,rQ)=>{var _=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},Fg=-1,lg=1,NI=0;_.Diff=function(C,I){return[C,I]};_.prototype.diff_main=function(C,I,g,B){typeof B>"u"&&(this.Diff_Timeout<=0?B=Number.MAX_VALUE:B=new Date().getTime()+this.Diff_Timeout*1e3);var F=B;if(C==null||I==null)throw new Error("Null input. (diff_main)");if(C==I)return C?[new _.Diff(NI,C)]:[];typeof g>"u"&&(g=!0);var Q=g,A=this.diff_commonPrefix(C,I),U=C.substring(0,A);C=C.substring(A),I=I.substring(A),A=this.diff_commonSuffix(C,I);var l=C.substring(C.length-A);C=C.substring(0,C.length-A),I=I.substring(0,I.length-A);var s=this.diff_compute_(C,I,Q,F);return U&&s.unshift(new _.Diff(NI,U)),l&&s.push(new _.Diff(NI,l)),this.diff_cleanupMerge(s),s};_.prototype.diff_compute_=function(C,I,g,B){var F;if(!C)return[new _.Diff(lg,I)];if(!I)return[new _.Diff(Fg,C)];var Q=C.length>I.length?C:I,A=C.length>I.length?I:C,U=Q.indexOf(A);if(U!=-1)return F=[new _.Diff(lg,Q.substring(0,U)),new _.Diff(NI,A),new _.Diff(lg,Q.substring(U+A.length))],C.length>I.length&&(F[0][0]=F[2][0]=Fg),F;if(A.length==1)return[new _.Diff(Fg,C),new _.Diff(lg,I)];var l=this.diff_halfMatch_(C,I);if(l){var s=l[0],G=l[1],t=l[2],c=l[3],d=l[4],b=this.diff_main(s,t,g,B),Z=this.diff_main(G,c,g,B);return b.concat([new _.Diff(NI,d)],Z)}return g&&C.length>100&&I.length>100?this.diff_lineMode_(C,I,B):this.diff_bisect_(C,I,B)};_.prototype.diff_lineMode_=function(C,I,g){var B=this.diff_linesToChars_(C,I);C=B.chars1,I=B.chars2;var F=B.lineArray,Q=this.diff_main(C,I,!1,g);this.diff_charsToLines_(Q,F),this.diff_cleanupSemantic(Q),Q.push(new _.Diff(NI,""));for(var A=0,U=0,l=0,s="",G="";A=1&&l>=1){Q.splice(A-U-l,U+l),A=A-U-l;for(var t=this.diff_main(s,G,!1,g),c=t.length-1;c>=0;c--)Q.splice(A,0,t[c]);A=A+t.length}l=0,U=0,s="",G="";break}A++}return Q.pop(),Q};_.prototype.diff_bisect_=function(C,I,g){for(var B=C.length,F=I.length,Q=Math.ceil((B+F)/2),A=Q,U=2*Q,l=new Array(U),s=new Array(U),G=0;Gg);x++){for(var a=-x+d;a<=x-b;a+=2){var n=A+a,h;a==-x||a!=x&&l[n-1]B)b+=2;else if(m>F)d+=2;else if(c){var L=A+t-a;if(L>=0&&L=R)return this.diff_bisectSplit_(C,I,h,m,g)}}}for(var o=-x+Z;o<=x-e;o+=2){var L=A+o,R;o==-x||o!=x&&s[L-1]B)e+=2;else if(y>F)Z+=2;else if(!c){var n=A+t-o;if(n>=0&&n=R)return this.diff_bisectSplit_(C,I,h,m,g)}}}}return[new _.Diff(Fg,C),new _.Diff(lg,I)]};_.prototype.diff_bisectSplit_=function(C,I,g,B,F){var Q=C.substring(0,g),A=I.substring(0,B),U=C.substring(g),l=I.substring(B),s=this.diff_main(Q,A,!1,F),G=this.diff_main(U,l,!1,F);return s.concat(G)};_.prototype.diff_linesToChars_=function(C,I){var g=[],B={};g[0]="";function F(l){for(var s="",G=0,t=-1,c=g.length;tB?C=C.substring(g-B):gI.length?C:I,B=C.length>I.length?I:C;if(g.length<4||B.length*2=b.length?[h,m,L,R,n]:null}var A=Q(g,B,Math.ceil(g.length/4)),U=Q(g,B,Math.ceil(g.length/2)),l;if(!A&&!U)return null;U?A?l=A[4].length>U[4].length?A:U:l=U:l=A;var s,G,t,c;C.length>I.length?(s=l[0],G=l[1],t=l[2],c=l[3]):(t=l[0],c=l[1],s=l[2],G=l[3]);var d=l[4];return[s,G,t,c,d]};_.prototype.diff_cleanupSemantic=function(C){for(var I=!1,g=[],B=0,F=null,Q=0,A=0,U=0,l=0,s=0;Q0?g[B-1]:-1,A=0,U=0,l=0,s=0,F=null,I=!0)),Q++;for(I&&this.diff_cleanupMerge(C),this.diff_cleanupSemanticLossless(C),Q=1;Q=d?(c>=G.length/2||c>=t.length/2)&&(C.splice(Q,0,new _.Diff(NI,t.substring(0,c))),C[Q-1][1]=G.substring(0,G.length-c),C[Q+1][1]=t.substring(c),Q++):(d>=G.length/2||d>=t.length/2)&&(C.splice(Q,0,new _.Diff(NI,G.substring(0,d))),C[Q-1][0]=lg,C[Q-1][1]=t.substring(0,t.length-d),C[Q+1][0]=Fg,C[Q+1][1]=G.substring(d),Q++),Q++}Q++}};_.prototype.diff_cleanupSemanticLossless=function(C){function I(d,b){if(!d||!b)return 6;var Z=d.charAt(d.length-1),e=b.charAt(0),x=Z.match(_.nonAlphaNumericRegex_),a=e.match(_.nonAlphaNumericRegex_),n=x&&Z.match(_.whitespaceRegex_),h=a&&e.match(_.whitespaceRegex_),m=n&&Z.match(_.linebreakRegex_),L=h&&e.match(_.linebreakRegex_),R=m&&d.match(_.blanklineEndRegex_),o=L&&b.match(_.blanklineStartRegex_);return R||o?5:m||L?4:x&&!n&&h?3:n||h?2:x||a?1:0}for(var g=1;g=t&&(t=c,l=B,s=F,G=Q)}C[g-1][1]!=l&&(l?C[g-1][1]=l:(C.splice(g-1,1),g--),C[g][1]=s,G?C[g+1][1]=G:(C.splice(g+1,1),g--))}g++}};_.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;_.whitespaceRegex_=/\s/;_.linebreakRegex_=/[\r\n]/;_.blanklineEndRegex_=/\n\r?\n$/;_.blanklineStartRegex_=/^\r?\n\r?\n/;_.prototype.diff_cleanupEfficiency=function(C){for(var I=!1,g=[],B=0,F=null,Q=0,A=!1,U=!1,l=!1,s=!1;Q0?g[B-1]:-1,l=s=!1),I=!0)),Q++;I&&this.diff_cleanupMerge(C)};_.prototype.diff_cleanupMerge=function(C){C.push(new _.Diff(NI,""));for(var I=0,g=0,B=0,F="",Q="",A;I1?(g!==0&&B!==0&&(A=this.diff_commonPrefix(Q,F),A!==0&&(I-g-B>0&&C[I-g-B-1][0]==NI?C[I-g-B-1][1]+=Q.substring(0,A):(C.splice(0,0,new _.Diff(NI,Q.substring(0,A))),I++),Q=Q.substring(A),F=F.substring(A)),A=this.diff_commonSuffix(Q,F),A!==0&&(C[I][1]=Q.substring(Q.length-A)+C[I][1],Q=Q.substring(0,Q.length-A),F=F.substring(0,F.length-A))),I-=g+B,C.splice(I,g+B),F.length&&(C.splice(I,0,new _.Diff(Fg,F)),I++),Q.length&&(C.splice(I,0,new _.Diff(lg,Q)),I++),I++):I!==0&&C[I-1][0]==NI?(C[I-1][1]+=C[I][1],C.splice(I,1)):I++,B=0,g=0,F="",Q="";break}C[C.length-1][1]===""&&C.pop();var U=!1;for(I=1;II));A++)F=g,Q=B;return C.length!=A&&C[A][0]===Fg?Q:Q+(I-F)};_.prototype.diff_prettyHtml=function(C){for(var I=[],g=/&/g,B=//g,Q=/\n/g,A=0;A");switch(U){case lg:I[A]=''+s+"";break;case Fg:I[A]=''+s+"";break;case NI:I[A]=""+s+"";break}}return I.join("")};_.prototype.diff_text1=function(C){for(var I=[],g=0;gthis.Match_MaxBits)throw new Error("Pattern too long for this browser.");var B=this.match_alphabet_(I),F=this;function Q(h,m){var L=h/I.length,R=Math.abs(g-m);return F.Match_Distance?L+R/F.Match_Distance:R?1:L}var A=this.Match_Threshold,U=C.indexOf(I,g);U!=-1&&(A=Math.min(Q(0,U),A),U=C.lastIndexOf(I,g+I.length),U!=-1&&(A=Math.min(Q(0,U),A)));var l=1<=b;x--){var a=B[C.charAt(x-1)];if(d===0?e[x]=(e[x+1]<<1|1)&a:e[x]=(e[x+1]<<1|1)&a|((c[x+1]|c[x])<<1|1)|c[x+1],e[x]&l){var n=Q(d,x-1);if(n<=A)if(A=n,U=x-1,U>g)b=Math.max(1,2*g-U);else break}}if(Q(d+1,g)>A)break;c=e}return U};_.prototype.match_alphabet_=function(C){for(var I={},g=0;g"u")B=C,F=this.diff_main(B,I,!0),F.length>2&&(this.diff_cleanupSemantic(F),this.diff_cleanupEfficiency(F));else if(C&&typeof C=="object"&&typeof I>"u"&&typeof g>"u")F=C,B=this.diff_text1(F);else if(typeof C=="string"&&I&&typeof I=="object"&&typeof g>"u")B=C,F=I;else if(typeof C=="string"&&typeof I=="string"&&g&&typeof g=="object")B=C,F=g;else throw new Error("Unknown call format to patch_make.");if(F.length===0)return[];for(var Q=[],A=new _.patch_obj,U=0,l=0,s=0,G=B,t=B,c=0;c=2*this.Patch_Margin&&U&&(this.patch_addContext_(A,G),Q.push(A),A=new _.patch_obj,U=0,G=t,l=s);break}d!==lg&&(l+=b.length),d!==Fg&&(s+=b.length)}return U&&(this.patch_addContext_(A,G),Q.push(A)),Q};_.prototype.patch_deepCopy=function(C){for(var I=[],g=0;gthis.Match_MaxBits?(l=this.match_main(I,U.substring(0,this.Match_MaxBits),A),l!=-1&&(s=this.match_main(I,U.substring(U.length-this.Match_MaxBits),A+U.length-this.Match_MaxBits),(s==-1||l>=s)&&(l=-1))):l=this.match_main(I,U,A),l==-1)F[Q]=!1,B-=C[Q].length2-C[Q].length1;else{F[Q]=!0,B=l-A;var G;if(s==-1?G=I.substring(l,l+U.length):G=I.substring(l,s+this.Match_MaxBits),U==G)I=I.substring(0,l)+this.diff_text2(C[Q].diffs)+I.substring(l+U.length);else{var t=this.diff_main(U,G,!1);if(U.length>this.Match_MaxBits&&this.diff_levenshtein(t)/U.length>this.Patch_DeleteThreshold)F[Q]=!1;else{this.diff_cleanupSemanticLossless(t);for(var c=0,d,b=0;bQ[0][1].length){var A=I-Q[0][1].length;Q[0][1]=g.substring(Q[0][1].length)+Q[0][1],F.start1-=A,F.start2-=A,F.length1+=A,F.length2+=A}if(F=C[C.length-1],Q=F.diffs,Q.length==0||Q[Q.length-1][0]!=NI)Q.push(new _.Diff(NI,g)),F.length1+=I,F.length2+=I;else if(I>Q[Q.length-1][1].length){var A=I-Q[Q.length-1][1].length;Q[Q.length-1][1]+=g.substring(0,A),F.length1+=A,F.length2+=A}return g};_.prototype.patch_splitMax=function(C){for(var I=this.Match_MaxBits,g=0;g2*I?(U.length1+=G.length,F+=G.length,l=!1,U.diffs.push(new _.Diff(s,G)),B.diffs.shift()):(G=G.substring(0,I-U.length1-this.Patch_Margin),U.length1+=G.length,F+=G.length,s===NI?(U.length2+=G.length,Q+=G.length):l=!1,U.diffs.push(new _.Diff(s,G)),G==B.diffs[0][1]?B.diffs.shift():B.diffs[0][1]=B.diffs[0][1].substring(G.length))}A=this.diff_text2(U.diffs),A=A.substring(A.length-this.Patch_Margin);var t=this.diff_text1(B.diffs).substring(0,this.Patch_Margin);t!==""&&(U.length1+=t.length,U.length2+=t.length,U.diffs.length!==0&&U.diffs[U.diffs.length-1][0]===NI?U.diffs[U.diffs.length-1][1]+=t:U.diffs.push(new _.Diff(NI,t))),l||C.splice(++g,0,U)}}};_.prototype.patch_toText=function(C){for(var I=[],g=0;g{(function(C){if(typeof Fi=="object"&&typeof xt<"u")xt.exports=C();else if(typeof define=="function"&&define.amd)define([],C);else{var I;typeof window<"u"?I=window:typeof global<"u"?I=global:typeof self<"u"?I=self:I=this,I.localforage=C()}})(function(){var C,I,g;return function B(F,Q,A){function U(G,t){if(!Q[G]){if(!F[G]){var c=typeof require=="function"&&require;if(!t&&c)return c(G,!0);if(l)return l(G,!0);var d=new Error("Cannot find module '"+G+"'");throw d.code="MODULE_NOT_FOUND",d}var b=Q[G]={exports:{}};F[G][0].call(b.exports,function(Z){var e=F[G][1][Z];return U(e||Z)},b,b.exports,B,F,Q,A)}return Q[G].exports}for(var l=typeof require=="function"&&require,s=0;s"u"&&B(3);var c=Promise;function d(V,X){X&&V.then(function(u){X(null,u)},function(u){X(u)})}function b(V,X,u){typeof X=="function"&&V.then(X),typeof u=="function"&&V.catch(u)}function Z(V){return typeof V!="string"&&(V=String(V)),V}function e(){if(arguments.length&&typeof arguments[arguments.length-1]=="function")return arguments[arguments.length-1]}var x="local-forage-detect-blob-support",a=void 0,n={},h=Object.prototype.toString,m="readonly",L="readwrite";function R(V){for(var X=V.length,u=new ArrayBuffer(X),W=new Uint8Array(u),E=0;E=43)}}).catch(function(){return!1})}function y(V){return typeof a=="boolean"?c.resolve(a):o(V).then(function(X){return a=X,a})}function H(V){var X=n[V.name],u={};u.promise=new c(function(W,E){u.resolve=W,u.reject=E}),X.deferredOperations.push(u),X.dbReady?X.dbReady=X.dbReady.then(function(){return u.promise}):X.dbReady=u.promise}function r(V){var X=n[V.name],u=X.deferredOperations.pop();if(u)return u.resolve(),u.promise}function N(V,X){var u=n[V.name],W=u.deferredOperations.pop();if(W)return W.reject(X),W.promise}function T(V,X){return new c(function(u,W){if(n[V.name]=n[V.name]||wI(),V.db)if(X)H(V),V.db.close();else return u(V.db);var E=[V.name];X&&E.push(V.version);var S=s.open.apply(s,E);X&&(S.onupgradeneeded=function(k){var K=S.result;try{K.createObjectStore(V.storeName),k.oldVersion<=1&&K.createObjectStore(x)}catch(j){if(j.name!=="ConstraintError")throw j}}),S.onerror=function(k){k.preventDefault(),W(S.error)},S.onsuccess=function(){var k=S.result;k.onversionchange=function(K){K.target.close()},u(k),r(V)}})}function M(V){return T(V,!1)}function q(V){return T(V,!0)}function AI(V,X){if(!V.db)return!0;var u=!V.db.objectStoreNames.contains(V.storeName),W=V.versionV.db.version;if(W&&(V.version,V.version=V.db.version),E||u){if(u){var S=V.db.version+1;S>V.version&&(V.version=S)}return!0}return!1}function aI(V){return new c(function(X,u){var W=new FileReader;W.onerror=u,W.onloadend=function(E){var S=btoa(E.target.result||"");X({__local_forage_encoded_blob:!0,data:S,type:V.type})},W.readAsBinaryString(V)})}function uI(V){var X=R(atob(V.data));return t([X],{type:V.type})}function ZI(V){return V&&V.__local_forage_encoded_blob}function XI(V){var X=this,u=X._initReady().then(function(){var W=n[X._dbInfo.name];if(W&&W.dbReady)return W.dbReady});return b(u,V,V),u}function kI(V){H(V);for(var X=n[V.name],u=X.forages,W=0;W0&&(!V.db||S.name==="InvalidStateError"||S.name==="NotFoundError"))return c.resolve().then(function(){if(!V.db||S.name==="NotFoundError"&&!V.db.objectStoreNames.contains(V.storeName)&&V.version<=V.db.version)return V.db&&(V.version=V.db.version+1),q(V)}).then(function(){return kI(V).then(function(){mI(V,X,u,W-1)})}).catch(u);u(S)}}function wI(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function gg(V){var X=this,u={db:null};if(V)for(var W in V)u[W]=V[W];var E=n[u.name];E||(E=wI(),n[u.name]=E),E.forages.push(X),X._initReady||(X._initReady=X.ready,X.ready=XI);var S=[];function k(){return c.resolve()}for(var K=0;K>4,II[E++]=(k&15)<<4|K>>2,II[E++]=(K&3)<<6|j&63;return P}function Tg(V){var X=new Uint8Array(V),u="",W;for(W=0;W>2],u+=eI[(X[W]&3)<<4|X[W+1]>>4],u+=eI[(X[W+1]&15)<<2|X[W+2]>>6],u+=eI[X[W+2]&63];return X.length%3===2?u=u.substring(0,u.length-1)+"=":X.length%3===1&&(u=u.substring(0,u.length-2)+"=="),u}function Vg(V,X){var u="";if(V&&(u=Rg.call(V)),V&&(u==="[object ArrayBuffer]"||V.buffer&&Rg.call(V.buffer)==="[object ArrayBuffer]")){var W,E=jI;V instanceof ArrayBuffer?(W=V,E+=bg):(W=V.buffer,u==="[object Int8Array]"?E+=dI:u==="[object Uint8Array]"?E+=UI:u==="[object Uint8ClampedArray]"?E+=DI:u==="[object Int16Array]"?E+=Ug:u==="[object Uint16Array]"?E+=ZC:u==="[object Int32Array]"?E+=bC:u==="[object Uint32Array]"?E+=yg:u==="[object Float32Array]"?E+=eC:u==="[object Float64Array]"?E+=VC:X(new Error("Failed to get type for BinaryArray"))),X(E+Tg(W))}else if(u==="[object Blob]"){var S=new FileReader;S.onload=function(){var k=MI+V.type+"~"+Tg(this.result);X(jI+$+k)},S.readAsArrayBuffer(V)}else try{X(JSON.stringify(V))}catch(k){X(null,k)}}function $g(V){if(V.substring(0,YI)!==jI)return JSON.parse(V);var X=V.substring(kg),u=V.substring(YI,kg),W;if(u===$&&Ag.test(X)){var E=X.match(Ag);W=E[1],X=X.substring(E[0].length)}var S=Dg(X);switch(u){case bg:return S;case $:return t([S],{type:W});case dI:return new Int8Array(S);case UI:return new Uint8Array(S);case DI:return new Uint8ClampedArray(S);case Ug:return new Int16Array(S);case ZC:return new Uint16Array(S);case bC:return new Int32Array(S);case yg:return new Uint32Array(S);case eC:return new Float32Array(S);case VC:return new Float64Array(S);default:throw new Error("Unkown type: "+u)}}var xC={serialize:Vg,deserialize:$g,stringToBuffer:Dg,bufferToString:Tg};function uB(V,X,u,W){V.executeSql("CREATE TABLE IF NOT EXISTS "+X.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],u,W)}function WC(V){var X=this,u={db:null};if(V)for(var W in V)u[W]=typeof V[W]!="string"?V[W].toString():V[W];var E=new c(function(S,k){try{u.db=openDatabase(u.name,String(u.version),u.description,u.size)}catch(K){return k(K)}u.db.transaction(function(K){uB(K,u,function(){X._dbInfo=u,S()},function(j,P){k(P)})},k)});return u.serializer=xC,E}function ng(V,X,u,W,E,S){V.executeSql(u,W,E,function(k,K){K.code===K.SYNTAX_ERR?k.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[X.storeName],function(j,P){P.rows.length?S(j,K):uB(j,X,function(){j.executeSql(u,W,E,S)},S)},S):S(k,K)},S)}function WF(V,X){var u=this;V=Z(V);var W=new c(function(E,S){u.ready().then(function(){var k=u._dbInfo;k.db.transaction(function(K){ng(K,k,"SELECT * FROM "+k.storeName+" WHERE key = ? LIMIT 1",[V],function(j,P){var II=P.rows.length?P.rows.item(0).value:null;II&&(II=k.serializer.deserialize(II)),E(II)},function(j,P){S(P)})})}).catch(S)});return d(W,X),W}function FB(V,X){var u=this,W=new c(function(E,S){u.ready().then(function(){var k=u._dbInfo;k.db.transaction(function(K){ng(K,k,"SELECT * FROM "+k.storeName,[],function(j,P){for(var II=P.rows,cI=II.length,TI=0;TI0){k(EF.apply(E,[V,j,u,W-1]));return}K(TI)}})})}).catch(K)});return d(S,u),S}function lQ(V,X,u){return EF.apply(this,[V,X,u,1])}function AA(V,X){var u=this;V=Z(V);var W=new c(function(E,S){u.ready().then(function(){var k=u._dbInfo;k.db.transaction(function(K){ng(K,k,"DELETE FROM "+k.storeName+" WHERE key = ?",[V],function(){E()},function(j,P){S(P)})})}).catch(S)});return d(W,X),W}function nU(V){var X=this,u=new c(function(W,E){X.ready().then(function(){var S=X._dbInfo;S.db.transaction(function(k){ng(k,S,"DELETE FROM "+S.storeName,[],function(){W()},function(K,j){E(j)})})}).catch(E)});return d(u,V),u}function UA(V){var X=this,u=new c(function(W,E){X.ready().then(function(){var S=X._dbInfo;S.db.transaction(function(k){ng(k,S,"SELECT COUNT(key) as c FROM "+S.storeName,[],function(K,j){var P=j.rows.item(0).c;W(P)},function(K,j){E(j)})})}).catch(E)});return d(u,V),u}function aU(V,X){var u=this,W=new c(function(E,S){u.ready().then(function(){var k=u._dbInfo;k.db.transaction(function(K){ng(K,k,"SELECT key FROM "+k.storeName+" WHERE id = ? LIMIT 1",[V+1],function(j,P){var II=P.rows.length?P.rows.item(0).key:null;E(II)},function(j,P){S(P)})})}).catch(S)});return d(W,X),W}function sQ(V){var X=this,u=new c(function(W,E){X.ready().then(function(){var S=X._dbInfo;S.db.transaction(function(k){ng(k,S,"SELECT key FROM "+S.storeName,[],function(K,j){for(var P=[],II=0;II '__WebKitDatabaseInfoTable__'",[],function(E,S){for(var k=[],K=0;K0}function cQ(V){var X=this,u={};if(V)for(var W in V)u[W]=V[W];return u.keyPrefix=hU(V,X._defaultConfig),XU()?(X._dbInfo=u,u.serializer=xC,c.resolve()):c.reject()}function oU(V){var X=this,u=X.ready().then(function(){for(var W=X._dbInfo.keyPrefix,E=localStorage.length-1;E>=0;E--){var S=localStorage.key(E);S.indexOf(W)===0&&localStorage.removeItem(S)}});return d(u,V),u}function ms(V,X){var u=this;V=Z(V);var W=u.ready().then(function(){var E=u._dbInfo,S=localStorage.getItem(E.keyPrefix+V);return S&&(S=E.serializer.deserialize(S)),S});return d(W,X),W}function hs(V,X){var u=this,W=u.ready().then(function(){for(var E=u._dbInfo,S=E.keyPrefix,k=S.length,K=localStorage.length,j=1,P=0;P=0;k--){var K=localStorage.key(k);K.indexOf(S)===0&&localStorage.removeItem(K)}}):E=c.reject("Invalid arguments"),d(E,X),E}var uC={_driver:"localStorageWrapper",_initStorage:cQ,_support:as(),iterate:hs,getItem:ms,setItem:xg,removeItem:bI,clear:oU,length:gI,key:Xs,keys:os,dropInstance:wg},EC=function(X,u){return X===u||typeof X=="number"&&typeof u=="number"&&isNaN(X)&&isNaN(u)},Zg=function(X,u){for(var W=X.length,E=0;E"u"?"undefined":A(u))==="object"){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var W in u){if(W==="storeName"&&(u[W]=u[W].replace(/\W/g,"_")),W==="version"&&typeof u[W]!="number")return new Error("Database version must be a number.");this._config[W]=u[W]}return"driver"in u&&u.driver?this.setDriver(this._config.driver):!0}else return typeof u=="string"?this._config[u]:this._config},V.prototype.defineDriver=function(u,W,E){var S=new c(function(k,K){try{var j=u._driver,P=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!u._driver){K(P);return}for(var II=NB.concat("_initStorage"),cI=0,TI=II.length;cI{(function(C,I){typeof el=="object"&&typeof Qi<"u"?I(el,Zl()):typeof define=="function"&&define.amd?define(["exports","localforage"],I):I(C.localforageSetItems=C.localforageSetItems||{},C.localforage)})(el,function(C,I){"use strict";I="default"in I?I.default:I;function g(t){return g.result?g.result:!t||typeof t.getSerializer!="function"?Promise.reject(new Error("localforage.getSerializer() was not available! localforage v1.4+ is required!")):(g.result=t.getSerializer(),g.result)}function B(t,c){c&&t.then(function(d){c(null,d)},function(d){c(d)})}function F(t,c,d,b){function Z(m,L){var R=m||L;return(!m||typeof m!="function")&&typeof R=="string"&&(m=function(y){return y[R]}),m}var e=[];if(Object.prototype.toString.call(t)==="[object Array]"){c=Z(c,"key"),d=Z(d,"value");for(var x=0,a=t.length;x{(function(C,I){typeof Vl=="object"&&typeof Ui<"u"?I(Vl,Zl()):typeof define=="function"&&define.amd?define(["exports","localforage"],I):I(C.localforageGetItems=C.localforageGetItems||{},C.localforage)})(Vl,function(C,I){"use strict";I="default"in I?I.default:I;function g(b){return g.result?g.result:!b||typeof b.getSerializer!="function"?Promise.reject(new Error("localforage.getSerializer() was not available! localforage v1.4+ is required!")):(g.result=b.getSerializer(),g.result)}function B(b,Z){return Z&&b.then(function(e){Z(null,e)},function(e){Z(e)}),b}function F(b,Z){var e=this,x=e.getItem(b).then(function(a){return{key:b,value:a}});return B(x,Z),x}function Q(b){var Z=this,e=new Promise(function(x,a){for(var n=[],h=0,m=b.length;hn?1:0}var x=new Promise(function(a,n){Z.ready().then(function(){var h=Z._dbInfo,m=h.db.transaction(h.storeName,"readonly").objectStore(h.storeName),L=b.sort(e),R=l.bound(b[0],b[b.length-1],!1,!1),o;if("getAll"in m)o=m.getAll(R),o.onsuccess=function(){var r=o.result;r===void 0&&(r=null),a(r)};else{o=m.openCursor(R);var y={},H=0;o.onsuccess=function(){var r=o.result;if(!r){a(y);return}for(var N=r.key;N>L[H];)if(H++,H===L.length){a(y);return}if(N===L[H]){var T=r.value;T===void 0&&(T=null),y[N]=T,r.continue()}else r.continue(L[H])}}o.onerror=function(){n(o.error)}}).catch(n)});return x}function G(b){var Z=this,e=new Promise(function(x,a){Z.ready().then(function(){return g(Z)}).then(function(n){var h=Z._dbInfo;h.db.transaction(function(m){for(var L=new Array(b.length),R=0,o=b.length;RLs});module.exports=C0(kx);var xB=require("obsidian"),QA=require("@codemirror/state"),Mb=require("@codemirror/view");var cg=(Q=>(Q.ADDITION="addition",Q.DELETION="deletion",Q.SUBSTITUTION="substitution",Q.HIGHLIGHT="highlight",Q.COMMENT="comment",Q))(cg||{}),FG={Addition:"addition",Deletion:"deletion",Substitution:"substitution",Highlight:"highlight",Comment:"comment"};var eg={addition:["{++","++}"],deletion:["{--","--}"],substitution:["{~~","~>","~~}"],highlight:["{==","==}"],comment:["{>>","<<}"]},QG={"{++":["++}"],"{--":["--}"],"{~~":["~>","~~}"],"{==":["==}"],"{>>":["<<}"]},AG={addition:"plus-circle",deletion:"minus-square",substitution:"replace",highlight:"highlighter",comment:"message-square"};var EU={a:"author",t:"time",d:"done",s:"style",c:"color"},KC=class{constructor(I,g,B,F,Q,A){this.from=I;this.to=g;this.type=B;this.repr=F;this.text=Q;this.metadata=A;if(A!==void 0){let U=A-I,l=Q.slice(3,U);this.text=Q.slice(0,3)+Q.slice(U+2);try{this.fields=JSON.parse(l);for(let s in this.fields)s in EU&&(this.fields[EU[s]]=this.fields[s],delete this.fields[s])}catch{this.fields={}}}}fields={};replies=[];get base_range(){return this}get full_thread(){return[this,...this.replies]}get thread(){return[...this.replies]}get length(){return this.to-this.from-6}get full_text(){return this.text+this.replies.map(I=>I.text).join("")}get range_start(){return this.metadata?this.metadata+2:this.from+3}get range_front(){return this.metadata?this.metadata-1:this.from}get full_range_front(){return this.base_range.from}get full_range_back(){return this.base_range.replies.length?this.base_range.replies[this.base_range.replies.length-1].to:this.to}range_type(I,g){return this.type}remove_metadata(){return this.metadata?[{from:this.from+3,to:this.metadata+2,insert:""}]:[]}delete_metadata(I){return I in EU&&(I=EU[I]),I in this.fields&&(delete this.fields[I],Object.keys(this.fields).length===0?this.remove_metadata():this.set_metadata(this.fields)),[]}add_metadata(I,g){return this.fields[I]=g,this.set_metadata(this.fields)}set_metadata(I){return this.fields=I,this.metadata!==void 0?[{from:this.from+3,to:this.metadata,insert:JSON.stringify(I)}]:[{from:this.from+3,to:this.from+3,insert:JSON.stringify(I)+"@@"}]}has_comment(I){return this.thread.includes(I)}copy(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}equals(I){return this.type===I.type&&this.from===I.from&&this.to===I.to&&this.replies.length===I.replies.length&&this.full_text===I.full_text}left_adjacent(I){return this.from===I.to}right_adjacent(I){return this.to===I.from}part_is_empty(I){return!1}empty(){return this.to-this.from===6}unwrap(){return this.text.slice(3,-3)}unwrap_bracket(I=!1){return I?this.text.slice(3):this.text.slice(0,-3)}unwrap_parts(){return[this.unwrap()]}unwrap_slice(I,g){return I-=this.range_front,g-=this.range_front,g<=0||I===g?"":this.text.slice(Math.max(3,I),Math.min(this.text.length-3,g))}partially_in_range(I,g){return!(I>this.to||gthis.full_range_back||gg:this.from<=I&&this.to>=g}part_encloses_range(I,g,B){return this.encloses_range(I,g)}accept(I=!0){return this.text}reject(I=!0){return this.text}touches(I){return this.from===I||this.to===I}cursor_inside(I){return this.from<=I&&I<=this.to}cursor_before_range(I){return Ithis.to}cursor_move_inside(I,g=!1){return Math.min(Math.max(g&&this.metadata?this.metadata+2:this.from+3,I),this.to-3)}cursor_pass_syntax(I,g,B=!1){return g?(this.touches_left_bracket(I,!0,!1,B)&&(I=B&&this.metadata?this.metadata+2:this.from+3),this.touches_right_bracket(I,!1,!0)&&(I=this.to)):(this.touches_right_bracket(I,!0,!1)&&(I=this.to-3),this.touches_left_bracket(I,!1,!0,B)&&(I=this.from)),I}cursor_move_through(I,g,B){return B=="unchanged"||!this.cursor_inside(I)||(B=="ignore_completely"?I=g?this.to:this.from:I=this.cursor_pass_syntax(I,g,B=="ignore_metadata")),I}touches_left_bracket(I,g=!1,B=!1,F=!1){return I+(g?0:1)>=this.from&&I+(B?0:1)<=(F&&this.metadata?this.metadata+2:this.from+3)}touches_separator(I,g=!1,B=!1){return!1}touches_right_bracket(I,g=!1,B=!1){return I-(B?0:1)>=this.to-3&&I-(g?0:1)<=this.to}touches_bracket(I,g,B=!1,F=!1){return g?this.touches_left_bracket(I,B,F):this.touches_right_bracket(I,B,F)}postprocess(I=!0,g=0,B="div",F=null,Q){let A=Q??this.text;return!Q&&I&&(this.to>=A.length&&!A.endsWith(eg[this.type].at(-1))?A=this.unwrap_bracket(!0):A=this.unwrap()),`<${B} class='cmtr-${this.repr.toLowerCase()}'>${A}`}apply_offset(I){this.from+=I,this.to+=I,this.metadata!==void 0&&(this.metadata+=I)}split_range(I){return[this.text.slice(-3),this.text.slice(0,3)+(this.metadata?JSON.stringify(this.fields)+"@@":"")]}};var pF=class extends KC{constructor(I,g,B,F){super(I,g,"addition","Addition",B,F)}accept(){return this.unwrap()}reject(){return""}postprocess(I=!0,g=0,B="div",F=null,Q){let A=Q??this.text;!Q&&I&&(this.to>=A.length&&!A.endsWith(eg[this.type].at(-1))?A=this.unwrap_bracket(!0):A=this.unwrap());let U="cmtr-preview";return g===0?U+=" cmtr-addition":g===2&&(A=""),`<${B} class='${U}'>${A}`}};var GQ=class extends KC{reply_depth=0;attached_comment=null;get base_range(){return this.attached_comment||this}get thread(){return this.attached_comment?[...this.attached_comment.thread]:[this,...this.replies]}accept(I=!0){return I?"":this.unwrap()}reject(I=!0){return I?"":this.unwrap()}clear_references(){this.attached_comment=null,this.reply_depth=0}add_reply(I){this.attach_to_range(I.type==="comment"?I.base_range:I)}attach_to_range(I){I.replies.push(this),this.reply_depth=I.replies.length-(I.type==="comment"?0:1),this.attached_comment=I}constructor(I,g,B,F){super(I,g,"comment","Comment",B,F)}};var iQ=class extends KC{constructor(I,g,B,F){super(I,g,"deletion","Deletion",B,F)}accept(){return""}reject(){return this.unwrap()}postprocess(I=!0,g=0,B="div",F=null,Q){let A=Q??this.text;!Q&&I&&(this.to>=A.length&&!A.endsWith(eg[this.type].at(-1))?A=this.unwrap_bracket(!0):A=this.unwrap());let U="cmtr-preview";return g===0?U+=" cmtr-deletion":g===1&&(A=""),`<${B} class='${U}'>${A}`}};var dQ=class extends KC{constructor(I,g,B,F){super(I,g,"highlight","Highlight",B,F)}};var LB=class extends KC{constructor(g,B,F,Q,A){super(g,F,"substitution","Substitution",Q,A);this.middle=B}get length(){return this.to-this.from-8}get char_middle(){return this.middle-this.range_front}range_type(g,B){return B<=this.middle+2?"deletion":g>=this.middle?"addition":"substitution"}unwrap(){return this.text.slice(3,this.char_middle)+this.text.slice(this.char_middle+2,-3)}unwrap_parts(){return[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice_parts_inverted(g,B){return g-=this.range_front,B-=this.range_front,g=Math.max(0,g),B<=0?this.unwrap_parts():B<=this.char_middle?[this.text.slice(3,g)+this.text.slice(B,this.char_middle),this.text.slice(this.char_middle+2,-3)]:g>=this.char_middle+2?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,g)+this.text.slice(B,-3)]:[this.text.slice(3,g),this.text.slice(B,-3)]}unwrap_parts_bracket(g,B=0){return g?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2)]:[this.text.slice(0,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice(g,B){return g-=this.range_front,B-=this.range_front,B<=0||g===B?"":g>=this.char_middle?this.text.slice(Math.max(this.char_middle+2,g),Math.min(this.text.length-3,B)):B<=this.char_middle?this.text.slice(Math.max(3,g),Math.min(this.char_middle,B)):this.text.slice(Math.max(3,g),this.char_middle)+this.text.slice(this.char_middle+2,Math.min(this.text.length-3,B))}accept(){return this.unwrap_parts()[1]}reject(){return this.unwrap_parts()[0]}touches_separator(g,B=!1,F=!1){return g+(B?1:0)>=this.middle&&g-(F?0:1)<=this.middle+2}contains_separator(g,B){return g<=this.middle+2&&B>=this.middle}contains_part(g,B,F=!0){return F?Bthis.middle+2?!1:void 0:B<=this.middle?!0:g>=this.middle+2?!1:void 0}cursor_pass_syntax(g,B,F=!1){return B?(this.touches_left_bracket(g,!0,!1,F)&&(g=F&&this.metadata?this.metadata+2:this.from+3),this.touches_separator(g,!1,!0)&&(g=this.middle+2),this.touches_right_bracket(g,!1,!0)&&(g=this.to)):(this.touches_right_bracket(g,!0,!1)&&(g=this.to-3),this.touches_separator(g,!1,!0)&&(g=this.middle),this.touches_left_bracket(g,!1,!0,F)&&(g=this.from)),g}part_encloses_range(g,B,F){return F?this.from<=g&&B<=this.middle+2:this.middle<=g&&B<=this.to}empty(){return this.from+3===this.middle&&this.middle+2===this.to-3}part_is_empty(g){return g?this.from+3===this.middle:this.middle+2===this.to-3}postprocess(g=!0,B=0,F="div",Q=null,A){let U=A??this.text,l=[U];!A&&g&&(this.to>=U.length&&!U.endsWith(eg.substitution[2])?l=this.unwrap_parts_bracket(!0):this.from<=0&&!U.startsWith(eg.substitution[0])?l=this.unwrap_parts_bracket(!1):l=this.unwrap_parts());let s="cmtr-preview";return l.length===1&&(l[+Q]=l[0],l[+!Q]=""),U="",B===0?(l[0].length&&(U+=`<${F} class='${s} cmtr-deletion'>${l[0]}`),l[1].length&&(U+=`<${F} class='${s} cmtr-addition'>${l[1]}`)):B===1?l[1].length&&(U+=`<${F} class='${s}'>${l[1]}`):l[0].length&&(U+=`<${F} class='${s}'>${l[0]}`),U}apply_offset(g){this.from+=g,this.middle+=g,this.to+=g,this.metadata!==void 0&&(this.metadata+=g)}split_range(g){let B=super.split_range(g);return g<=this.middle?B[0]=eg.substitution[1]+B[0]:B[1]=B[1]+eg.substitution[1],B}cursor_move_inside(g,B=!1){return g=super.cursor_move_inside(g,B),g==this.middle+1&&(g=this.middle+2),g}};var xu=require("@codemirror/state");var B0=class Ws{constructor(I,g){this.low=I,this.high=g}clone(){return new Ws(this.low,this.high)}get max(){return this.clone()}less_than(I){return this.lowI.high?this.high:I.high)}output(){return[this.low,this.high]}static comparable_max(I,g){return I.merge(g)}static comparable_less_than(I,g){return Il&&([U,l]=[l,U]),this.item.key=new B0(U,l)}this.max=this.item.key?this.item.key.max:void 0}isNil(){return this.item.key===void 0&&this.item.value===void 0&&this.left===null&&this.right===null&&this.color===Ig}_value_less_than(I){return this.item.value&&I.item.value&&this.item.value.less_than?this.item.value.less_than(I.item.value):this.item.valueI++),I}get keys(){let I=[];return this.tree_walk(this.root,g=>I.push(g.item.key.output?g.item.key.output():g.item.key)),I}get values(){let I=[];return this.tree_walk(this.root,g=>I.push(g.item.value)),I}get items(){let I=[];return this.tree_walk(this.root,g=>I.push({key:g.item.key.output?g.item.key.output():g.item.key,value:g.item.value})),I}isEmpty(){return this.root==null||this.root===this.nil_node}clear(){this.root=null}insert(I,g=I){if(I===void 0)return;let B=new HB(I,g,this.nil_node,this.nil_node,null,zg);return this.tree_insert(B),this.recalc_max(B),B}exist(I,g=I){let B=new HB(I,g);return!!this.tree_search(this.root,B)}remove(I,g=I){let B=new HB(I,g),F=this.tree_search(this.root,B);return F&&this.tree_delete(F),F}search(I,g=(B,F)=>B===F?F.output():B){let B=new HB(I),F=[];return this.tree_search_interval(this.root,B,F),F.map(Q=>g(Q.item.value,Q.item.key))}intersect_any(I){let g=new HB(I);return this.tree_find_any_interval(this.root,g)}forEach(I){this.tree_walk(this.root,g=>I(g.item.key,g.item.value))}map(I){let g=new C;return this.tree_walk(this.root,B=>g.insert(B.item.key,I(B.item.value,B.item.key))),g}*iterate(I,g=(B,F)=>B===F?F.output():B){let B;for(I?B=this.tree_search_nearest_forward(this.root,new HB(I)):this.root&&(B=this.local_minimum(this.root));B;)yield g(B.item.value,B.item.key),B=this.tree_successor(B)}recalc_max(I){let g=I;for(;g.parent!=null;)g.parent.update_max(),g=g.parent}tree_insert(I){let g=this.root,B=null;if(this.root==null||this.root===this.nil_node)this.root=I;else{for(;g!==this.nil_node;)B=g,I.less_than(g)?g=g.left:g=g.right;I.parent=B,I.less_than(B)?B.left=I:B.right=I}this.insert_fixup(I)}insert_fixup(I){let g,B;for(g=I;g!==this.root&&g.parent.color===zg;)g.parent===g.parent.parent.left?(B=g.parent.parent.right,B.color===zg?(g.parent.color=Ig,B.color=Ig,g.parent.parent.color=zg,g=g.parent.parent):(g===g.parent.right&&(g=g.parent,this.rotate_left(g)),g.parent.color=Ig,g.parent.parent.color=zg,this.rotate_right(g.parent.parent))):(B=g.parent.parent.left,B.color===zg?(g.parent.color=Ig,B.color=Ig,g.parent.parent.color=zg,g=g.parent.parent):(g===g.parent.left&&(g=g.parent,this.rotate_right(g)),g.parent.color=Ig,g.parent.parent.color=zg,this.rotate_left(g.parent.parent)));this.root.color=Ig}tree_delete(I){let g,B;I.left===this.nil_node||I.right===this.nil_node?g=I:g=this.tree_successor(I),g.left!==this.nil_node?B=g.left:B=g.right,B.parent=g.parent,g===this.root?this.root=B:(g===g.parent.left?g.parent.left=B:g.parent.right=B,g.parent.update_max()),this.recalc_max(B),g!==I&&(I.copy_data(g),I.update_max(),this.recalc_max(I)),g.color===Ig&&this.delete_fixup(B)}delete_fixup(I){let g=I,B;for(;g!==this.root&&g.parent!=null&&g.color===Ig;)g===g.parent.left?(B=g.parent.right,B.color===zg&&(B.color=Ig,g.parent.color=zg,this.rotate_left(g.parent),B=g.parent.right),B.left.color===Ig&&B.right.color===Ig?(B.color=zg,g=g.parent):(B.right.color===Ig&&(B.color=zg,B.left.color=Ig,this.rotate_right(B),B=g.parent.right),B.color=g.parent.color,g.parent.color=Ig,B.right.color=Ig,this.rotate_left(g.parent),g=this.root)):(B=g.parent.left,B.color===zg&&(B.color=Ig,g.parent.color=zg,this.rotate_right(g.parent),B=g.parent.left),B.left.color===Ig&&B.right.color===Ig?(B.color=zg,g=g.parent):(B.left.color===Ig&&(B.color=zg,B.right.color=Ig,this.rotate_left(B),B=g.parent.left),B.color=g.parent.color,g.parent.color=Ig,B.left.color=Ig,this.rotate_right(g.parent),g=this.root));g.color=Ig}tree_search(I,g){if(!(I==null||I===this.nil_node))return g.equal_to(I)?I:g.less_than(I)?this.tree_search(I.left,g):this.tree_search(I.right,g)}tree_search_nearest_forward(I,g){let B,F=I;for(;F&&F!==this.nil_node;)F.less_than(g)?F.intersect(g)?(B=F,F=F.left):F=F.right:((!B||F.less_than(B))&&(B=F),F=F.left);return B||null}tree_search_interval(I,g,B){I!=null&&I!==this.nil_node&&(I.left!==this.nil_node&&!I.not_intersect_left_subtree(g)&&this.tree_search_interval(I.left,g,B),I.intersect(g)&&B.push(I),I.right!==this.nil_node&&!I.not_intersect_right_subtree(g)&&this.tree_search_interval(I.right,g,B))}tree_find_any_interval(I,g){let B=!1;return I!=null&&I!==this.nil_node&&(I.left!==this.nil_node&&!I.not_intersect_left_subtree(g)&&(B=this.tree_find_any_interval(I.left,g)),B||(B=I.intersect(g)),!B&&I.right!==this.nil_node&&!I.not_intersect_right_subtree(g)&&(B=this.tree_find_any_interval(I.right,g))),B}local_minimum(I){let g=I;for(;g.left!=null&&g.left!==this.nil_node;)g=g.left;return g}local_maximum(I){let g=I;for(;g.right!=null&&g.right!==this.nil_node;)g=g.right;return g}tree_successor(I){let g,B,F;if(I.right!==this.nil_node)g=this.local_minimum(I.right);else{for(B=I,F=I.parent;F!=null&&F.right===B;)B=F,F=F.parent;g=F}return g}rotate_left(I){let g=I.right;I.right=g.left,g.left!==this.nil_node&&(g.left.parent=I),g.parent=I.parent,I===this.root?this.root=g:I===I.parent.left?I.parent.left=g:I.parent.right=g,g.left=I,I.parent=g,I!=null&&I!==this.nil_node&&I.update_max(),g=I.parent,g!=null&&g!==this.nil_node&&g.update_max()}rotate_right(I){let g=I.left;I.left=g.right,g.right!==this.nil_node&&(g.right.parent=I),g.parent=I.parent,I===this.root?this.root=g:I===I.parent.left?I.parent.left=g:I.parent.right=g,g.right=I,I.parent=g,I!==null&&I!==this.nil_node&&I.update_max(),g=I.parent,g!=null&&g!==this.nil_node&&g.update_max()}tree_walk(I,g){I!=null&&I!==this.nil_node&&(this.tree_walk(I.left,g),g(I),this.tree_walk(I.right,g))}testRedBlackProperty(){let I=!0;return this.tree_walk(this.root,function(g){g.color===zg&&(g.left.color===Ig&&g.right.color===Ig||(I=!1))}),I}testBlackHeightProperty(I){let g=0,B=0,F=0;if(I.color===Ig&&g++,I.left!==this.nil_node?B=this.testBlackHeightProperty(I.left):B=1,I.right!==this.nil_node?F=this.testBlackHeightProperty(I.right):F=1,B!==F)throw new Error("Red-black height property violated");return g+=B,g}};var rU=class{ranges;tree;constructor(I){this.ranges=I,this.tree=new NU;for(let g of I)this.tree.insert([g.from,g.to],g)}empty(){return this.ranges.length===0}get(I){return I<0?this.ranges[this.ranges.length+I]:this.ranges[I]}at_cursor(I,g=!1){let B=this.tree.search([I,I]);return B.length?g&&B.length>1?B[1]:B[0]:void 0}contains_range(I,g){return this.tree.intersect_any([I,g])}range_adjacent_to_cursor(I,g,B=!1,F=!1){let Q=g?this.ranges.slice().reverse():this.ranges;return F?Q.find(A=>g?(B?A.from:A.to)g?(B?A.from:A.to)<=I:I<=(B?A.to:A.from))}adjacent_range(I,g,B=!1){let F=this.ranges.findIndex(A=>A===I);if(F===-1)return;let Q=g?this.ranges[F-1]:this.ranges[F+1];if(Q)if(B){if(g?Q.to===I.from:I.to===Q.from)return Q}else return Q}ranges_in_interval(I,g){return this.tree.search([I,g])}ranges_in_intervals(I){let g=new Set;for(let B of I)for(let F of this.tree.search([B.from,B.to]))if(g.add(F),F.base_range){g.add(F.base_range);for(let Q of F.base_range.replies)g.add(Q)}return Array.from(g).sort((B,F)=>B.from-F.from)}unwrap_in_range(I,g=0,B=I.length,F=null){let Q,A;if(F||(F=this.ranges_in_interval(g,B)),F.length===0)return{output:I.sliceString(g,B),from:g,to:B};let U="";g=F.at(-1).to?U+=I.sliceString(F.at(-1).to,B):A=F.at(-1);let s=Q?Q.cursor_pass_syntax(g,!1):g,G=A?A.cursor_pass_syntax(B,!0):B;return(s!==g||g===Q?.from)&&(Q=void 0),(G!==B||B===A?.to)&&(A=void 0),{output:U,from:s,to:G,front_range:Q,back_range:A}}};var rL=require("@codemirror/view");var Yu=require("@codemirror/state");var yu=require("@codemirror/state");function lG(C){return C.ranges.length===1&&C.ranges[0].anchor===C.ranges[0].head}function bQ(C){return C.startState.selection.ranges[0].from!==C.selection.ranges[0].from||C.startState.selection.ranges[0].to!==C.selection.ranges[0].to}function cA(C,I,g){let B=[],F=0;return I.iterChanges((Q,A,U,l,s)=>{B.push({from:Q,to:A,anchor:C.ranges[F].anchor,offset:{removed:A-Q,added:l-U},inserted:s.toString(),deleted:A-Q?g.sliceString(Q,A):"",selection:C.ranges[F].anchor!==C.ranges[F].head}),F{throw new Error("This node type doesn't define a deserialize function")})}add(I){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof I!="function"&&(I=JB.match(I)),g=>{let B=I(g);return B===void 0?null:[this,B]}}};dg.closedBy=new dg({deserialize:C=>C.split(" ")});dg.openedBy=new dg({deserialize:C=>C.split(" ")});dg.group=new dg({deserialize:C=>C.split(" ")});dg.isolate=new dg({deserialize:C=>{if(C&&C!="rtl"&&C!="ltr"&&C!="auto")throw new RangeError("Invalid value for isolate: "+C);return C||"auto"}});dg.contextHash=new dg({perNode:!0});dg.lookAhead=new dg({perNode:!0});dg.mounted=new dg({perNode:!0});var ZQ=class{constructor(I,g,B){this.tree=I,this.overlay=g,this.parser=B}static get(I){return I&&I.props&&I.props[dg.mounted.id]}},Q0=Object.create(null),JB=class C{constructor(I,g,B,F=0){this.name=I,this.props=g,this.id=B,this.flags=F}static define(I){let g=I.props&&I.props.length?Object.create(null):Q0,B=(I.top?1:0)|(I.skipped?2:0)|(I.error?4:0)|(I.name==null?8:0),F=new C(I.name||"",g,I.id,B);if(I.props){for(let Q of I.props)if(Array.isArray(Q)||(Q=Q(F)),Q){if(Q[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");g[Q[0].id]=Q[1]}}return F}prop(I){return this.props[I.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(I){if(typeof I=="string"){if(this.name==I)return!0;let g=this.prop(dg.group);return g?g.indexOf(I)>-1:!1}return this.id==I}static match(I){let g=Object.create(null);for(let B in I)for(let F of B.split(" "))g[F]=I[B];return B=>{for(let F=B.prop(dg.group),Q=-1;Q<(F?F.length:0);Q++){let A=g[Q<0?B.name:F[Q]];if(A)return A}}}};JB.none=new JB("",Object.create(null),0,8);var pU=new WeakMap,cG=new WeakMap,IC;(function(C){C[C.ExcludeBuffers=1]="ExcludeBuffers",C[C.IncludeAnonymous=2]="IncludeAnonymous",C[C.IgnoreMounts=4]="IgnoreMounts",C[C.IgnoreOverlays=8]="IgnoreOverlays"})(IC||(IC={}));var YB=class C{constructor(I,g,B,F,Q){if(this.type=I,this.children=g,this.positions=B,this.length=F,this.props=null,Q&&Q.length){this.props=Object.create(null);for(let[A,U]of Q)this.props[typeof A=="number"?A:A.id]=U}}toString(){let I=ZQ.get(this);if(I&&!I.overlay)return I.tree.toString();let g="";for(let B of this.children){let F=B.toString();F&&(g&&(g+=","),g+=F)}return this.type.name?(/\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(g.length?"("+g+")":""):g}cursor(I=0){return new dA(this.topNode,I)}cursorAt(I,g=0,B=0){let F=pU.get(this)||this.topNode,Q=new dA(F);return Q.moveTo(I,g),pU.set(this,Q._tree),Q}get topNode(){return new RB(this,0,0,null)}resolve(I,g=0){let B=GA(pU.get(this)||this.topNode,I,g,!1);return pU.set(this,B),B}resolveInner(I,g=0){let B=GA(cG.get(this)||this.topNode,I,g,!0);return cG.set(this,B),B}resolveStack(I,g=0){return A0(this,I,g)}iterate(I){let{enter:g,leave:B,from:F=0,to:Q=this.length}=I,A=I.mode||0,U=(A&IC.IncludeAnonymous)>0;for(let l=this.cursor(A|IC.IncludeAnonymous);;){let s=!1;if(l.from<=Q&&l.to>=F&&(!U&&l.type.isAnonymous||g(l)!==!1)){if(l.firstChild())continue;s=!0}for(;s&&B&&(U||!l.type.isAnonymous)&&B(l),!l.nextSibling();){if(!l.parent())return;s=!0}}}prop(I){return I.perNode?this.props?this.props[I.id]:void 0:this.type.prop(I)}get propValues(){let I=[];if(this.props)for(let g in this.props)I.push([+g,this.props[g]]);return I}balance(I={}){return this.children.length<=8?this:Ys(JB.none,this.children,this.positions,0,this.children.length,0,this.length,(g,B,F)=>new C(this.type,g,B,F,this.propValues),I.makeTree||((g,B,F)=>new C(JB.none,g,B,F)))}static build(I){return U0(I)}};YB.empty=new YB(JB.none,[],[],0);var Es=class C{constructor(I,g){this.buffer=I,this.index=g}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new C(this.buffer,this.index)}},lF=class C{constructor(I,g,B){this.buffer=I,this.length=g,this.set=B}get type(){return JB.none}toString(){let I=[];for(let g=0;g0));l=A[l+3]);return U}slice(I,g,B){let F=this.buffer,Q=new Uint16Array(g-I),A=0;for(let U=I,l=0;U=I&&gI;case 1:return g<=I&&B>I;case 2:return B>I;case 4:return!0}}function GA(C,I,g,B){for(var F;C.from==C.to||(g<1?C.from>=I:C.from>I)||(g>-1?C.to<=I:C.to0?U.length:-1;I!=s;I+=g){let G=U[I],t=l[I]+A.from;if(dG(F,B,t,t+G.length)){if(G instanceof lF){if(Q&IC.ExcludeBuffers)continue;let c=G.findChild(0,G.buffer.length,g,B-t,F);if(c>-1)return new iA(new rs(A,G,I,t),null,c)}else if(Q&IC.IncludeAnonymous||!G.type.isAnonymous||Hs(G)){let c;if(!(Q&IC.IgnoreMounts)&&(c=ZQ.get(G))&&!c.overlay)return new C(c.tree,t,I,A);let d=new C(G,t,I,A);return Q&IC.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(g<0?G.children.length-1:0,g,B,F)}}}if(Q&IC.IncludeAnonymous||!A.type.isAnonymous||(A.index>=0?I=A.index+g:I=g<0?-1:A._parent._tree.children.length,A=A._parent,!A))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(I){return this.nextChild(0,1,I,2)}childBefore(I){return this.nextChild(this._tree.children.length-1,-1,I,-2)}enter(I,g,B=0){let F;if(!(B&IC.IgnoreOverlays)&&(F=ZQ.get(this._tree))&&F.overlay){let Q=I-this.from;for(let{from:A,to:U}of F.overlay)if((g>0?A<=Q:A=Q:U>Q))return new C(F.tree,F.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,I,g,B)}nextSignificantParent(){let I=this;for(;I.type.isAnonymous&&I._parent;)I=I._parent;return I}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function GG(C,I,g,B){let F=C.cursor(),Q=[];if(!F.firstChild())return Q;if(g!=null){for(let A=!1;!A;)if(A=F.type.is(g),!F.nextSibling())return Q}for(;;){if(B!=null&&F.type.is(B))return Q;if(F.type.is(I)&&Q.push(F.node),!F.nextSibling())return B==null?Q:[]}}function Ns(C,I,g=I.length-1){for(let B=C;g>=0;B=B.parent){if(!B)return!1;if(!B.type.isAnonymous){if(I[g]&&I[g]!=B.name)return!1;g--}}return!0}var rs=class{constructor(I,g,B,F){this.parent=I,this.buffer=g,this.index=B,this.start=F}},iA=class C extends YU{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(I,g,B){super(),this.context=I,this._parent=g,this.index=B,this.type=I.buffer.set.types[I.buffer.buffer[B]]}child(I,g,B){let{buffer:F}=this.context,Q=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.context.start,B);return Q<0?null:new C(this.context,this,Q)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(I){return this.child(1,I,2)}childBefore(I){return this.child(-1,I,-2)}enter(I,g,B=0){if(B&IC.ExcludeBuffers)return null;let{buffer:F}=this.context,Q=F.findChild(this.index+4,F.buffer[this.index+3],g>0?1:-1,I-this.context.start,g);return Q<0?null:new C(this.context,this,Q)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(I){return this._parent?null:this.context.parent.nextChild(this.context.index+I,I,0,4)}get nextSibling(){let{buffer:I}=this.context,g=I.buffer[this.index+3];return g<(this._parent?I.buffer[this._parent.index+3]:I.buffer.length)?new C(this.context,this._parent,g):this.externalSibling(1)}get prevSibling(){let{buffer:I}=this.context,g=this._parent?this._parent.index+4:0;return this.index==g?this.externalSibling(-1):new C(this.context,this._parent,I.findChild(g,this.index,-1,0,4))}get tree(){return null}toTree(){let I=[],g=[],{buffer:B}=this.context,F=this.index+4,Q=B.buffer[this.index+3];if(Q>F){let A=B.buffer[this.index+1];I.push(B.slice(F,Q,A)),g.push(0)}return new YB(this.type,I,g,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function bG(C){if(!C.length)return null;let I=0,g=C[0];for(let Q=1;Qg.from||A.to=I){let U=new RB(A.tree,A.overlay[0].from+Q.from,-1,Q);(F||(F=[B])).push(GA(U,I,g,!1))}}return F?bG(F):B}var dA=class{get name(){return this.type.name}constructor(I,g=0){if(this.mode=g,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,I instanceof RB)this.yieldNode(I);else{this._tree=I.context.parent,this.buffer=I.context;for(let B=I._parent;B;B=B._parent)this.stack.unshift(B.index);this.bufferNode=I,this.yieldBuf(I.index)}}yieldNode(I){return I?(this._tree=I,this.type=I.type,this.from=I.from,this.to=I.to,!0):!1}yieldBuf(I,g){this.index=I;let{start:B,buffer:F}=this.buffer;return this.type=g||F.set.types[F.buffer[I]],this.from=B+F.buffer[I+1],this.to=B+F.buffer[I+2],!0}yield(I){return I?I instanceof RB?(this.buffer=null,this.yieldNode(I)):(this.buffer=I.context,this.yieldBuf(I.index,I.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(I,g,B){if(!this.buffer)return this.yield(this._tree.nextChild(I<0?this._tree._tree.children.length-1:0,I,g,B,this.mode));let{buffer:F}=this.buffer,Q=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.buffer.start,B);return Q<0?!1:(this.stack.push(this.index),this.yieldBuf(Q))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(I){return this.enterChild(1,I,2)}childBefore(I){return this.enterChild(-1,I,-2)}enter(I,g,B=this.mode){return this.buffer?B&IC.ExcludeBuffers?!1:this.enterChild(1,I,g):this.yield(this._tree.enter(I,g,B))}parent(){if(!this.buffer)return this.yieldNode(this.mode&IC.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let I=this.mode&IC.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(I)}sibling(I){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+I,I,0,4,this.mode)):!1;let{buffer:g}=this.buffer,B=this.stack.length-1;if(I<0){let F=B<0?0:this.stack[B]+4;if(this.index!=F)return this.yieldBuf(g.findChild(F,this.index,-1,0,4))}else{let F=g.buffer[this.index+3];if(F<(B<0?g.buffer.length:g.buffer[this.stack[B]+3]))return this.yieldBuf(F)}return B<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+I,I,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(I){let g,B,{buffer:F}=this;if(F){if(I>0){if(this.index-1)for(let Q=g+I,A=I<0?-1:B._tree.children.length;Q!=A;Q+=I){let U=B._tree.children[Q];if(this.mode&IC.IncludeAnonymous||U instanceof lF||!U.type.isAnonymous||Hs(U))return!1}return!0}move(I,g){if(g&&this.enterChild(I,0,4))return!0;for(;;){if(this.sibling(I))return!0;if(this.atLastNode(I)||!this.parent())return!1}}next(I=!0){return this.move(1,I)}prev(I=!0){return this.move(-1,I)}moveTo(I,g=0){for(;(this.from==this.to||(g<1?this.from>=I:this.from>I)||(g>-1?this.to<=I:this.to=0;){for(let A=I;A;A=A._parent)if(A.index==F){if(F==this.index)return A;g=A,B=Q+1;break I}F=this.stack[--Q]}for(let F=B;F=0;Q--){if(Q<0)return Ns(this._tree,I,F);let A=B[g.buffer[this.stack[Q]]];if(!A.isAnonymous){if(I[F]&&I[F]!=A.name)return!1;F--}}return!0}};function Hs(C){return C.children.some(I=>I instanceof lF||!I.type.isAnonymous||Hs(I))}function U0(C){var I;let{buffer:g,nodeSet:B,maxBufferLength:F=1024,reused:Q=[],minRepeatType:A=B.types.length}=C,U=Array.isArray(g)?new Es(g,g.length):g,l=B.types,s=0,G=0;function t(m,L,R,o,y,H){let{id:r,start:N,end:T,size:M}=U,q=G,AI=s;for(;M<0;)if(U.next(),M==-1){let kI=Q[r];R.push(kI),o.push(N-m);return}else if(M==-3){s=r;return}else if(M==-4){G=r;return}else throw new RangeError(`Unrecognized record size: ${M}`);let aI=l[r],uI,ZI,XI=N-m;if(T-N<=F&&(ZI=e(U.pos-L,y))){let kI=new Uint16Array(ZI.size-ZI.skip),mI=U.pos-ZI.size,wI=kI.length;for(;U.pos>mI;)wI=x(ZI.start,kI,wI);uI=new lF(kI,T-ZI.start,B),XI=ZI.start-m}else{let kI=U.pos-M;U.next();let mI=[],wI=[],gg=r>=A?r:-1,HI=0,hI=T;for(;U.pos>kI;)gg>=0&&U.id==gg&&U.size>=0?(U.end<=hI-F&&(b(mI,wI,N,HI,U.end,hI,gg,q,AI),HI=mI.length,hI=U.end),U.next()):H>2500?c(N,kI,mI,wI):t(N,kI,mI,wI,gg,H+1);if(gg>=0&&HI>0&&HI-1&&HI>0){let WI=d(aI,AI);uI=Ys(aI,mI,wI,0,mI.length,0,T-N,WI,WI)}else uI=Z(aI,mI,wI,T-N,q-T,AI)}R.push(uI),o.push(XI)}function c(m,L,R,o){let y=[],H=0,r=-1;for(;U.pos>L;){let{id:N,start:T,end:M,size:q}=U;if(q>4)U.next();else{if(r>-1&&T=0;M-=3)N[q++]=y[M],N[q++]=y[M+1]-T,N[q++]=y[M+2]-T,N[q++]=q;R.push(new lF(N,y[2]-T,B)),o.push(T-m)}}function d(m,L){return(R,o,y)=>{let H=0,r=R.length-1,N,T;if(r>=0&&(N=R[r])instanceof YB){if(!r&&N.type==m&&N.length==y)return N;(T=N.prop(dg.lookAhead))&&(H=o[r]+N.length+T)}return Z(m,R,o,y,H,L)}}function b(m,L,R,o,y,H,r,N,T){let M=[],q=[];for(;m.length>o;)M.push(m.pop()),q.push(L.pop()+R-y);m.push(Z(B.types[r],M,q,H-y,N-H,T)),L.push(y-R)}function Z(m,L,R,o,y,H,r){if(H){let N=[dg.contextHash,H];r=r?[N].concat(r):[N]}if(y>25){let N=[dg.lookAhead,y];r=r?[N].concat(r):[N]}return new YB(m,L,R,o,r)}function e(m,L){let R=U.fork(),o=0,y=0,H=0,r=R.end-F,N={size:0,start:0,skip:0};I:for(let T=R.pos-m;R.pos>T;){let M=R.size;if(R.id==L&&M>=0){N.size=o,N.start=y,N.skip=H,H+=4,o+=4,R.next();continue}let q=R.pos-M;if(M<0||q=A?4:0,aI=R.start;for(R.next();R.pos>q;){if(R.size<0)if(R.size==-3)AI+=4;else break I;else R.id>=A&&(AI+=4);R.next()}y=aI,o+=M,H+=AI}return(L<0||o==m)&&(N.size=o,N.start=y,N.skip=H),N.size>4?N:void 0}function x(m,L,R){let{id:o,start:y,end:H,size:r}=U;if(U.next(),r>=0&&o4){let T=U.pos-(r-4);for(;U.pos>T;)R=x(m,L,R)}L[--R]=N,L[--R]=H-m,L[--R]=y-m,L[--R]=o}else r==-3?s=o:r==-4&&(G=o);return R}let a=[],n=[];for(;U.pos>0;)t(C.start||0,C.bufferStart||0,a,n,-1,0);let h=(I=C.length)!==null&&I!==void 0?I:a.length?n[0]+a[0].length:0;return new YB(l[C.topID],a.reverse(),n.reverse(),h)}var iG=new WeakMap;function HU(C,I){if(!C.isAnonymous||I instanceof lF||I.type!=C)return 1;let g=iG.get(I);if(g==null){g=1;for(let B of I.children){if(B.type!=C||!(B instanceof YB)){g=1;break}g+=HU(C,B)}iG.set(I,g)}return g}function Ys(C,I,g,B,F,Q,A,U,l){let s=0;for(let b=B;b=G)break;L+=R}if(n==h+1){if(L>G){let R=b[h];d(R.children,R.positions,0,R.children.length,Z[h]+a);continue}t.push(b[h])}else{let R=Z[n-1]+b[n-1].length-m;t.push(Ys(C,b,Z,h,n,m,R,null,l))}c.push(m+a-Q)}}return d(I,g,B,F,0),(U||l)(t,c,A)}var eQ=class C{constructor(I,g,B,F,Q=!1,A=!1){this.from=I,this.to=g,this.tree=B,this.offset=F,this.open=(Q?1:0)|(A?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(I,g=[],B=!1){let F=[new C(0,I.length,I,0,!1,B)];for(let Q of g)Q.to>I.length&&F.push(Q);return F}static applyChanges(I,g,B=128){if(!g.length)return I;let F=[],Q=1,A=I.length?I[0]:null;for(let U=0,l=0,s=0;;U++){let G=U=B)for(;A&&A.from=c.from||t<=c.to||s){let d=Math.max(c.from,l)-s,b=Math.min(c.to,t)-s;c=d>=b?null:new C(d,b,c.tree,c.offset+s,U>0,!!G)}if(c&&F.push(c),A.to>t)break;A=Q{})(sg||={});var RC=require("@codemirror/state");var QB=RC.Facet.define({combine:C=>C[0]}),VQ=new RC.Compartment,HF=RC.Facet.define({combine:C=>C[0]}),Js=new RC.Compartment,Mg=RC.Facet.define({combine:C=>C[0]}),xQ=new RC.Compartment,nC=RC.Facet.define({combine:C=>C[0]}),uQ=new RC.Compartment,LQ=new RC.Compartment,RQ=RC.StateEffect.define();var gt=require("@codemirror/language");var l0=0,bA=class{constructor(I,g){this.from=I,this.to=g}},Bg=class{constructor(I={}){this.id=l0++,this.perNode=!!I.perNode,this.deserialize=I.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(I){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof I!="function"&&(I=PC.match(I)),g=>{let B=I(g);return B===void 0?null:[this,B]}}};Bg.closedBy=new Bg({deserialize:C=>C.split(" ")});Bg.openedBy=new Bg({deserialize:C=>C.split(" ")});Bg.group=new Bg({deserialize:C=>C.split(" ")});Bg.isolate=new Bg({deserialize:C=>{if(C&&C!="rtl"&&C!="ltr"&&C!="auto")throw new RangeError("Invalid value for isolate: "+C);return C||"auto"}});Bg.contextHash=new Bg({perNode:!0});Bg.lookAhead=new Bg({perNode:!0});Bg.mounted=new Bg({perNode:!0});var nQ=class{constructor(I,g,B){this.tree=I,this.overlay=g,this.parser=B}static get(I){return I&&I.props&&I.props[Bg.mounted.id]}},s0=Object.create(null),PC=class C{constructor(I,g,B,F=0){this.name=I,this.props=g,this.id=B,this.flags=F}static define(I){let g=I.props&&I.props.length?Object.create(null):s0,B=(I.top?1:0)|(I.skipped?2:0)|(I.error?4:0)|(I.name==null?8:0),F=new C(I.name||"",g,I.id,B);if(I.props){for(let Q of I.props)if(Array.isArray(Q)||(Q=Q(F)),Q){if(Q[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");g[Q[0].id]=Q[1]}}return F}prop(I){return this.props[I.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(I){if(typeof I=="string"){if(this.name==I)return!0;let g=this.prop(Bg.group);return g?g.indexOf(I)>-1:!1}return this.id==I}static match(I){let g=Object.create(null);for(let B in I)for(let F of B.split(" "))g[F]=I[B];return B=>{for(let F=B.prop(Bg.group),Q=-1;Q<(F?F.length:0);Q++){let A=g[Q<0?B.name:F[Q]];if(A)return A}}}};PC.none=new PC("",Object.create(null),0,8);var kU=class C{constructor(I){this.types=I;for(let g=0;g0;for(let l=this.cursor(A|pg.IncludeAnonymous);;){let s=!1;if(l.from<=Q&&l.to>=F&&(!U&&l.type.isAnonymous||g(l)!==!1)){if(l.firstChild())continue;s=!0}for(;s&&B&&(U||!l.type.isAnonymous)&&B(l),!l.nextSibling();){if(!l.parent())return;s=!0}}}prop(I){return I.perNode?this.props?this.props[I.id]:void 0:this.type.prop(I)}get propValues(){let I=[];if(this.props)for(let g in this.props)I.push([+g,this.props[g]]);return I}balance(I={}){return this.children.length<=8?this:zs(PC.none,this.children,this.positions,0,this.children.length,0,this.length,(g,B,F)=>new C(this.type,g,B,F,this.propValues),I.makeTree||((g,B,F)=>new C(PC.none,g,B,F)))}static build(I){return c0(I)}};aC.empty=new aC(PC.none,[],[],0);var vs=class C{constructor(I,g){this.buffer=I,this.index=g}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new C(this.buffer,this.index)}},sF=class C{constructor(I,g,B){this.buffer=I,this.length=g,this.set=B}get type(){return PC.none}toString(){let I=[];for(let g=0;g0));l=A[l+3]);return U}slice(I,g,B){let F=this.buffer,Q=new Uint16Array(g-I),A=0;for(let U=I,l=0;U=I&&gI;case 1:return g<=I&&B>I;case 2:return B>I;case 4:return!0}}function ZA(C,I,g,B){for(var F;C.from==C.to||(g<1?C.from>=I:C.from>I)||(g>-1?C.to<=I:C.to0?U.length:-1;I!=s;I+=g){let G=U[I],t=l[I]+A.from;if(xG(F,B,t,t+G.length)){if(G instanceof sF){if(Q&pg.ExcludeBuffers)continue;let c=G.findChild(0,G.buffer.length,g,B-t,F);if(c>-1)return new eA(new Ds(A,G,I,t),null,c)}else if(Q&pg.IncludeAnonymous||!G.type.isAnonymous||fs(G)){let c;if(!(Q&pg.IgnoreMounts)&&(c=nQ.get(G))&&!c.overlay)return new C(c.tree,t,I,A);let d=new C(G,t,I,A);return Q&pg.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(g<0?G.children.length-1:0,g,B,F)}}}if(Q&pg.IncludeAnonymous||!A.type.isAnonymous||(A.index>=0?I=A.index+g:I=g<0?-1:A._parent._tree.children.length,A=A._parent,!A))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(I){return this.nextChild(0,1,I,2)}childBefore(I){return this.nextChild(this._tree.children.length-1,-1,I,-2)}enter(I,g,B=0){let F;if(!(B&pg.IgnoreOverlays)&&(F=nQ.get(this._tree))&&F.overlay){let Q=I-this.from;for(let{from:A,to:U}of F.overlay)if((g>0?A<=Q:A=Q:U>Q))return new C(F.tree,F.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,I,g,B)}nextSignificantParent(){let I=this;for(;I.type.isAnonymous&&I._parent;)I=I._parent;return I}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function eG(C,I,g,B){let F=C.cursor(),Q=[];if(!F.firstChild())return Q;if(g!=null){for(let A=!1;!A;)if(A=F.type.is(g),!F.nextSibling())return Q}for(;;){if(B!=null&&F.type.is(B))return Q;if(F.type.is(I)&&Q.push(F.node),!F.nextSibling())return B==null?Q:[]}}function ks(C,I,g=I.length-1){for(let B=C;g>=0;B=B.parent){if(!B)return!1;if(!B.type.isAnonymous){if(I[g]&&I[g]!=B.name)return!1;g--}}return!0}var Ds=class{constructor(I,g,B,F){this.parent=I,this.buffer=g,this.index=B,this.start=F}},eA=class C extends DU{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(I,g,B){super(),this.context=I,this._parent=g,this.index=B,this.type=I.buffer.set.types[I.buffer.buffer[B]]}child(I,g,B){let{buffer:F}=this.context,Q=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.context.start,B);return Q<0?null:new C(this.context,this,Q)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(I){return this.child(1,I,2)}childBefore(I){return this.child(-1,I,-2)}enter(I,g,B=0){if(B&pg.ExcludeBuffers)return null;let{buffer:F}=this.context,Q=F.findChild(this.index+4,F.buffer[this.index+3],g>0?1:-1,I-this.context.start,g);return Q<0?null:new C(this.context,this,Q)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(I){return this._parent?null:this.context.parent.nextChild(this.context.index+I,I,0,4)}get nextSibling(){let{buffer:I}=this.context,g=I.buffer[this.index+3];return g<(this._parent?I.buffer[this._parent.index+3]:I.buffer.length)?new C(this.context,this._parent,g):this.externalSibling(1)}get prevSibling(){let{buffer:I}=this.context,g=this._parent?this._parent.index+4:0;return this.index==g?this.externalSibling(-1):new C(this.context,this._parent,I.findChild(g,this.index,-1,0,4))}get tree(){return null}toTree(){let I=[],g=[],{buffer:B}=this.context,F=this.index+4,Q=B.buffer[this.index+3];if(Q>F){let A=B.buffer[this.index+1];I.push(B.slice(F,Q,A)),g.push(0)}return new aC(this.type,I,g,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function uG(C){if(!C.length)return null;let I=0,g=C[0];for(let Q=1;Qg.from||A.to=I){let U=new nB(A.tree,A.overlay[0].from+Q.from,-1,Q);(F||(F=[B])).push(ZA(U,I,g,!1))}}return F?uG(F):B}var VA=class{get name(){return this.type.name}constructor(I,g=0){if(this.mode=g,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,I instanceof nB)this.yieldNode(I);else{this._tree=I.context.parent,this.buffer=I.context;for(let B=I._parent;B;B=B._parent)this.stack.unshift(B.index);this.bufferNode=I,this.yieldBuf(I.index)}}yieldNode(I){return I?(this._tree=I,this.type=I.type,this.from=I.from,this.to=I.to,!0):!1}yieldBuf(I,g){this.index=I;let{start:B,buffer:F}=this.buffer;return this.type=g||F.set.types[F.buffer[I]],this.from=B+F.buffer[I+1],this.to=B+F.buffer[I+2],!0}yield(I){return I?I instanceof nB?(this.buffer=null,this.yieldNode(I)):(this.buffer=I.context,this.yieldBuf(I.index,I.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(I,g,B){if(!this.buffer)return this.yield(this._tree.nextChild(I<0?this._tree._tree.children.length-1:0,I,g,B,this.mode));let{buffer:F}=this.buffer,Q=F.findChild(this.index+4,F.buffer[this.index+3],I,g-this.buffer.start,B);return Q<0?!1:(this.stack.push(this.index),this.yieldBuf(Q))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(I){return this.enterChild(1,I,2)}childBefore(I){return this.enterChild(-1,I,-2)}enter(I,g,B=this.mode){return this.buffer?B&pg.ExcludeBuffers?!1:this.enterChild(1,I,g):this.yield(this._tree.enter(I,g,B))}parent(){if(!this.buffer)return this.yieldNode(this.mode&pg.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let I=this.mode&pg.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(I)}sibling(I){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+I,I,0,4,this.mode)):!1;let{buffer:g}=this.buffer,B=this.stack.length-1;if(I<0){let F=B<0?0:this.stack[B]+4;if(this.index!=F)return this.yieldBuf(g.findChild(F,this.index,-1,0,4))}else{let F=g.buffer[this.index+3];if(F<(B<0?g.buffer.length:g.buffer[this.stack[B]+3]))return this.yieldBuf(F)}return B<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+I,I,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(I){let g,B,{buffer:F}=this;if(F){if(I>0){if(this.index-1)for(let Q=g+I,A=I<0?-1:B._tree.children.length;Q!=A;Q+=I){let U=B._tree.children[Q];if(this.mode&pg.IncludeAnonymous||U instanceof sF||!U.type.isAnonymous||fs(U))return!1}return!0}move(I,g){if(g&&this.enterChild(I,0,4))return!0;for(;;){if(this.sibling(I))return!0;if(this.atLastNode(I)||!this.parent())return!1}}next(I=!0){return this.move(1,I)}prev(I=!0){return this.move(-1,I)}moveTo(I,g=0){for(;(this.from==this.to||(g<1?this.from>=I:this.from>I)||(g>-1?this.to<=I:this.to=0;){for(let A=I;A;A=A._parent)if(A.index==F){if(F==this.index)return A;g=A,B=Q+1;break I}F=this.stack[--Q]}for(let F=B;F=0;Q--){if(Q<0)return ks(this._tree,I,F);let A=B[g.buffer[this.stack[Q]]];if(!A.isAnonymous){if(I[F]&&I[F]!=A.name)return!1;F--}}return!0}};function fs(C){return C.children.some(I=>I instanceof sF||!I.type.isAnonymous||fs(I))}function c0(C){var I;let{buffer:g,nodeSet:B,maxBufferLength:F=1024,reused:Q=[],minRepeatType:A=B.types.length}=C,U=Array.isArray(g)?new vs(g,g.length):g,l=B.types,s=0,G=0;function t(m,L,R,o,y,H){let{id:r,start:N,end:T,size:M}=U,q=G,AI=s;for(;M<0;)if(U.next(),M==-1){let kI=Q[r];R.push(kI),o.push(N-m);return}else if(M==-3){s=r;return}else if(M==-4){G=r;return}else throw new RangeError(`Unrecognized record size: ${M}`);let aI=l[r],uI,ZI,XI=N-m;if(T-N<=F&&(ZI=e(U.pos-L,y))){let kI=new Uint16Array(ZI.size-ZI.skip),mI=U.pos-ZI.size,wI=kI.length;for(;U.pos>mI;)wI=x(ZI.start,kI,wI);uI=new sF(kI,T-ZI.start,B),XI=ZI.start-m}else{let kI=U.pos-M;U.next();let mI=[],wI=[],gg=r>=A?r:-1,HI=0,hI=T;for(;U.pos>kI;)gg>=0&&U.id==gg&&U.size>=0?(U.end<=hI-F&&(b(mI,wI,N,HI,U.end,hI,gg,q,AI),HI=mI.length,hI=U.end),U.next()):H>2500?c(N,kI,mI,wI):t(N,kI,mI,wI,gg,H+1);if(gg>=0&&HI>0&&HI-1&&HI>0){let WI=d(aI,AI);uI=zs(aI,mI,wI,0,mI.length,0,T-N,WI,WI)}else uI=Z(aI,mI,wI,T-N,q-T,AI)}R.push(uI),o.push(XI)}function c(m,L,R,o){let y=[],H=0,r=-1;for(;U.pos>L;){let{id:N,start:T,end:M,size:q}=U;if(q>4)U.next();else{if(r>-1&&T=0;M-=3)N[q++]=y[M],N[q++]=y[M+1]-T,N[q++]=y[M+2]-T,N[q++]=q;R.push(new sF(N,y[2]-T,B)),o.push(T-m)}}function d(m,L){return(R,o,y)=>{let H=0,r=R.length-1,N,T;if(r>=0&&(N=R[r])instanceof aC){if(!r&&N.type==m&&N.length==y)return N;(T=N.prop(Bg.lookAhead))&&(H=o[r]+N.length+T)}return Z(m,R,o,y,H,L)}}function b(m,L,R,o,y,H,r,N,T){let M=[],q=[];for(;m.length>o;)M.push(m.pop()),q.push(L.pop()+R-y);m.push(Z(B.types[r],M,q,H-y,N-H,T)),L.push(y-R)}function Z(m,L,R,o,y,H,r){if(H){let N=[Bg.contextHash,H];r=r?[N].concat(r):[N]}if(y>25){let N=[Bg.lookAhead,y];r=r?[N].concat(r):[N]}return new aC(m,L,R,o,r)}function e(m,L){let R=U.fork(),o=0,y=0,H=0,r=R.end-F,N={size:0,start:0,skip:0};I:for(let T=R.pos-m;R.pos>T;){let M=R.size;if(R.id==L&&M>=0){N.size=o,N.start=y,N.skip=H,H+=4,o+=4,R.next();continue}let q=R.pos-M;if(M<0||q=A?4:0,aI=R.start;for(R.next();R.pos>q;){if(R.size<0)if(R.size==-3)AI+=4;else break I;else R.id>=A&&(AI+=4);R.next()}y=aI,o+=M,H+=AI}return(L<0||o==m)&&(N.size=o,N.start=y,N.skip=H),N.size>4?N:void 0}function x(m,L,R){let{id:o,start:y,end:H,size:r}=U;if(U.next(),r>=0&&o4){let T=U.pos-(r-4);for(;U.pos>T;)R=x(m,L,R)}L[--R]=N,L[--R]=H-m,L[--R]=y-m,L[--R]=o}else r==-3?s=o:r==-4&&(G=o);return R}let a=[],n=[];for(;U.pos>0;)t(C.start||0,C.bufferStart||0,a,n,-1,0);let h=(I=C.length)!==null&&I!==void 0?I:a.length?n[0]+a[0].length:0;return new aC(l[C.topID],a.reverse(),n.reverse(),h)}var VG=new WeakMap;function vU(C,I){if(!C.isAnonymous||I instanceof sF||I.type!=C)return 1;let g=VG.get(I);if(g==null){g=1;for(let B of I.children){if(B.type!=C||!(B instanceof aC)){g=1;break}g+=vU(C,B)}VG.set(I,g)}return g}function zs(C,I,g,B,F,Q,A,U,l){let s=0;for(let b=B;b=G)break;L+=R}if(n==h+1){if(L>G){let R=b[h];d(R.children,R.positions,0,R.children.length,Z[h]+a);continue}t.push(b[h])}else{let R=Z[n-1]+b[n-1].length-m;t.push(zs(C,b,Z,h,n,m,R,null,l))}c.push(m+a-Q)}}return d(I,g,B,F,0),(U||l)(t,c,A)}var TU=class{startParse(I,g,B){return typeof I=="string"&&(I=new ws(I)),B=B?B.length?B.map(F=>new bA(F.from,F.to)):[new bA(0,0)]:[new bA(0,I.length)],this.createParse(I,g||[],B)}parse(I,g,B){let F=this.startParse(I,g,B);for(;;){let Q=F.advance();if(Q)return Q}}},ws=class{constructor(I){this.string=I}get length(){return this.string.length}chunk(I){return this.string.slice(I)}get lineChunks(){return!1}read(I,g){return this.string.slice(I,g)}};var $u=new Bg({perNode:!0});var Ks=class C{constructor(I,g,B,F,Q,A,U,l,s,G=0,t){this.p=I,this.stack=g,this.state=B,this.reducePos=F,this.pos=Q,this.score=A,this.buffer=U,this.bufferBase=l,this.curContext=s,this.lookAhead=G,this.parent=t}toString(){return`[${this.stack.filter((I,g)=>g%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(I,g,B=0){let F=I.parser.context;return new C(I,[],g,B,B,0,[],0,F?new wU(F,F.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(I,g){this.stack.push(this.state,g,this.bufferBase+this.buffer.length),this.state=I}reduce(I){var g;let B=I>>19,F=I&65535,{parser:Q}=this.p,A=Q.dynamicPrecedence(F);if(A&&(this.score+=A),B==0){this.pushState(Q.getGoto(this.state,F,!0),this.reducePos),F=2e3&&!(!((g=this.p.parser.nodeSet.types[F])===null||g===void 0)&&g.isAnonymous)&&(l==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=s):this.p.lastBigReductionSizeU;)this.stack.pop();this.reduceContext(F,l)}storeNode(I,g,B,F=4,Q=!1){if(I==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&A.buffer[U-4]==0&&A.buffer[U-1]>-1){if(g==B)return;if(A.buffer[U-2]>=g){A.buffer[U-2]=B;return}}}if(!Q||this.pos==B)this.buffer.push(I,g,B,F);else{let A=this.buffer.length;if(A>0&&this.buffer[A-4]!=0)for(;A>0&&this.buffer[A-2]>B;)this.buffer[A]=this.buffer[A-4],this.buffer[A+1]=this.buffer[A-3],this.buffer[A+2]=this.buffer[A-2],this.buffer[A+3]=this.buffer[A-1],A-=4,F>4&&(F-=4);this.buffer[A]=I,this.buffer[A+1]=g,this.buffer[A+2]=B,this.buffer[A+3]=F}}shift(I,g,B,F){if(I&131072)this.pushState(I&65535,this.pos);else if((I&262144)==0){let Q=I,{parser:A}=this.p;(F>this.pos||g<=A.maxNode)&&(this.pos=F,A.stateFlag(Q,1)||(this.reducePos=F)),this.pushState(Q,B),this.shiftContext(g,B),g<=A.maxNode&&this.buffer.push(g,B,F,4)}else this.pos=F,this.shiftContext(g,B),g<=this.p.parser.maxNode&&this.buffer.push(g,B,F,4)}apply(I,g,B,F){I&65536?this.reduce(I):this.shift(I,g,B,F)}useNode(I,g){let B=this.p.reused.length-1;(B<0||this.p.reused[B]!=I)&&(this.p.reused.push(I),B++);let F=this.pos;this.reducePos=this.pos=F+I.length,this.pushState(g,F),this.buffer.push(B,F,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,I,this,this.p.stream.reset(this.pos-I.length)))}split(){let I=this,g=I.buffer.length;for(;g>0&&I.buffer[g-2]>I.reducePos;)g-=4;let B=I.buffer.slice(g),F=I.bufferBase+g;for(;I&&F==I.bufferBase;)I=I.parent;return new C(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,B,F,this.curContext,this.lookAhead,I)}recoverByDelete(I,g){let B=I<=this.p.parser.maxNode;B&&this.storeNode(I,this.pos,g,4),this.storeNode(0,this.pos,g,B?8:4),this.pos=this.reducePos=g,this.score-=190}canShift(I){for(let g=new Ps(this);;){let B=this.p.parser.stateSlot(g.state,4)||this.p.parser.hasAction(g.state,I);if(B==0)return!1;if((B&65536)==0)return!0;g.reduce(B)}}recoverByInsert(I){if(this.stack.length>=300)return[];let g=this.p.parser.nextStates(this.state);if(g.length>8||this.stack.length>=120){let F=[];for(let Q=0,A;Ql&1&&U==A)||F.push(g[Q],A)}g=F}let B=[];for(let F=0;F>19,F=g&65535,Q=this.stack.length-B*3;if(Q<0||I.getGoto(this.stack[Q],F,!1)<0){let A=this.findForcedReduction();if(A==null)return!1;g=A}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(g),!0}findForcedReduction(){let{parser:I}=this.p,g=[],B=(F,Q)=>{if(!g.includes(F))return g.push(F),I.allActions(F,A=>{if(!(A&393216))if(A&65536){let U=(A>>19)-Q;if(U>1){let l=A&65535,s=this.stack.length-U*3;if(s>=0&&I.getGoto(this.stack[s],l,!1)>=0)return U<<19|65536|l}}else{let U=B(A,Q+1);if(U!=null)return U}})};return B(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:I}=this.p;return I.data[I.stateSlot(this.state,1)]==65535&&!I.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(I){if(this.state!=I.state||this.stack.length!=I.stack.length)return!1;for(let g=0;gthis.lookAhead&&(this.emitLookAhead(),this.lookAhead=I)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}},wU=class{constructor(I,g){this.tracker=I,this.context=g,this.hash=I.strict?I.hash(g):0}},Ps=class{constructor(I){this.start=I,this.state=I.state,this.stack=I.stack,this.base=this.stack.length}reduce(I){let g=I&65535,B=I>>19;B==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(B-1)*3;let F=this.start.p.parser.getGoto(this.stack[this.base-3],g,!0);this.state=F}},js=class C{constructor(I,g,B){this.stack=I,this.pos=g,this.index=B,this.buffer=I.buffer,this.index==0&&this.maybeNext()}static create(I,g=I.bufferBase+I.buffer.length){return new C(I,g,g-I.bufferBase)}maybeNext(){let I=this.stack.parent;I!=null&&(this.index=this.stack.bufferBase-I.bufferBase,this.stack=I,this.buffer=I.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new C(this.stack,this.pos,this.index)}};function xA(C,I=Uint16Array){if(typeof C!="string")return C;let g=null;for(let B=0,F=0;B=92&&A--,A>=34&&A--;let l=A-32;if(l>=46&&(l-=46,U=!0),Q+=l,U)break;Q*=46}g?g[F++]=Q:g=new I(Q)}return g}var aQ=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},LG=new aQ,Os=class{constructor(I,g){this.input=I,this.ranges=g,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=LG,this.rangeIndex=0,this.pos=this.chunkPos=g[0].from,this.range=g[0],this.end=g[g.length-1].to,this.readNext()}resolveOffset(I,g){let B=this.range,F=this.rangeIndex,Q=this.pos+I;for(;QB.to:Q>=B.to;){if(F==this.ranges.length-1)return null;let A=this.ranges[++F];Q+=A.from-B.to,B=A}return Q}clipPos(I){if(I>=this.range.from&&II)return Math.max(I,g.from);return this.end}peek(I){let g=this.chunkOff+I,B,F;if(g>=0&&g=this.chunk2Pos&&BU.to&&(this.chunk2=this.chunk2.slice(0,U.to-B)),F=this.chunk2.charCodeAt(0)}}return B>=this.token.lookAhead&&(this.token.lookAhead=B+1),F}acceptToken(I,g=0){let B=g?this.resolveOffset(g,-1):this.pos;if(B==null||B=this.chunk2Pos&&this.posthis.range.to?I.slice(0,this.range.to-this.pos):I,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(I=1){for(this.chunkOff+=I;this.pos+I>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();I-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=I,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(I,g){if(g?(this.token=g,g.start=I,g.lookAhead=I+1,g.value=g.extended=-1):this.token=LG,this.pos!=I){if(this.pos=I,I==this.end)return this.setDone(),this;for(;I=this.range.to;)this.range=this.ranges[++this.rangeIndex];I>=this.chunkPos&&I=this.chunkPos&&g<=this.chunkPos+this.chunk.length)return this.chunk.slice(I-this.chunkPos,g-this.chunkPos);if(I>=this.chunk2Pos&&g<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(I-this.chunk2Pos,g-this.chunk2Pos);if(I>=this.range.from&&g<=this.range.to)return this.input.read(I,g);let B="";for(let F of this.ranges){if(F.from>=g)break;F.to>I&&(B+=this.input.read(Math.max(F.from,I),Math.min(F.to,g)))}return B}},tF=class{constructor(I,g){this.data=I,this.id=g}token(I,g){let{parser:B}=g.p;hG(this.data,I,g,this.id,B.data,B.tokenPrecTable)}};tF.prototype.contextual=tF.prototype.fallback=tF.prototype.extend=!1;var kB=class{constructor(I,g,B){this.precTable=g,this.elseToken=B,this.data=typeof I=="string"?xA(I):I}token(I,g){let B=I.pos,F=0;for(;;){let Q=I.next<0,A=I.resolveOffset(1,1);if(hG(this.data,I,g,0,this.data,this.precTable),I.token.value>-1)break;if(this.elseToken==null)return;if(Q||F++,A==null)break;I.reset(A,I.token)}F&&(I.reset(B,I.token),I.acceptToken(this.elseToken,F))}};kB.prototype.contextual=tF.prototype.fallback=tF.prototype.extend=!1;function hG(C,I,g,B,F,Q){let A=0,U=1<0){let b=C[d];if(l.allows(b)&&(I.token.value==-1||I.token.value==b||i0(b,I.token.value,F,Q))){I.acceptToken(b);break}}let G=I.next,t=0,c=C[A+2];if(I.next<0&&c>t&&C[s+c*3-3]==65535){A=C[s+c*3-1];continue I}for(;t>1,b=s+d+(d<<1),Z=C[b],e=C[b+1]||65536;if(G=e)t=d+1;else{A=C[b+2],I.advance();continue I}}break}}function RG(C,I,g){for(let B=I,F;(F=C[B])!=65535;B++)if(F==g)return B-I;return-1}function i0(C,I,g,B){let F=RG(g,B,I);return F<0||RG(g,B,C)I)&&!B.type.isError)return g<0?Math.max(0,Math.min(B.to-1,I-25)):Math.min(C.length,Math.max(B.from+1,I+25));if(g<0?B.prevSibling():B.nextSibling())break;if(!B.parent())return g<0?0:C.length}}var _s=class{constructor(I,g){this.fragments=I,this.nodeSet=g,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let I=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(I){for(this.safeFrom=I.openStart?nG(I.tree,I.from+I.offset,1)-I.offset:I.from,this.safeTo=I.openEnd?nG(I.tree,I.to+I.offset,-1)-I.offset:I.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(I.tree),this.start.push(-I.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(I){if(II)return this.nextStart=A,null;if(Q instanceof aC){if(A==I){if(A=Math.max(this.safeFrom,I)&&(this.trees.push(Q),this.start.push(A),this.index.push(0))}else this.index[g]++,this.nextStart=A+Q.length}}},qs=class{constructor(I,g){this.stream=g,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=I.tokenizers.map(B=>new aQ)}getActions(I){let g=0,B=null,{parser:F}=I.p,{tokenizers:Q}=F,A=F.stateSlot(I.state,3),U=I.curContext?I.curContext.hash:0,l=0;for(let s=0;st.end+25&&(l=Math.max(t.lookAhead,l)),t.value!=0)){let c=g;if(t.extended>-1&&(g=this.addActions(I,t.extended,t.end,g)),g=this.addActions(I,t.value,t.end,g),!G.extend&&(B=t,g>c))break}}for(;this.actions.length>g;)this.actions.pop();return l&&I.setLookAhead(l),!B&&I.pos==this.stream.end&&(B=new aQ,B.value=I.p.parser.eofTerm,B.start=B.end=I.pos,g=this.addActions(I,B.value,B.end,g)),this.mainToken=B,this.actions}getMainToken(I){if(this.mainToken)return this.mainToken;let g=new aQ,{pos:B,p:F}=I;return g.start=B,g.end=Math.min(B+1,F.stream.end),g.value=B==F.stream.end?F.parser.eofTerm:0,g}updateCachedToken(I,g,B){let F=this.stream.clipPos(B.pos);if(g.token(this.stream.reset(F,I),B),I.value>-1){let{parser:Q}=B.p;for(let A=0;A=0&&B.p.parser.dialect.allows(U>>1)){(U&1)==0?I.value=U>>1:I.extended=U>>1;break}}}else I.value=0,I.end=this.stream.clipPos(F+1)}putAction(I,g,B,F){for(let Q=0;QI.bufferLength*4?new _s(B,I.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let I=this.stacks,g=this.minStackPos,B=this.stacks=[],F,Q;if(this.bigReductionCount>300&&I.length==1){let[A]=I;for(;A.forceReduce()&&A.stack.length&&A.stack[A.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let A=0;Ag)B.push(U);else{if(this.advanceStack(U,B,I))continue;{F||(F=[],Q=[]),F.push(U);let l=this.tokens.getMainToken(U);Q.push(l.value,l.end)}}break}}if(!B.length){let A=F&&d0(F);if(A)return this.stackToTree(A);if(this.parser.strict)throw new SyntaxError("No parse at "+g);this.recovering||(this.recovering=5)}if(this.recovering&&F){let A=this.stoppedAt!=null&&F[0].pos>this.stoppedAt?F[0]:this.runRecovery(F,Q,B);if(A)return this.stackToTree(A.forceAll())}if(this.recovering){let A=this.recovering==1?1:this.recovering*3;if(B.length>A)for(B.sort((U,l)=>l.score-U.score);B.length>A;)B.pop();B.some(U=>U.reducePos>g)&&this.recovering--}else if(B.length>1){I:for(let A=0;A500&&s.buffer.length>500)if((U.score-s.score||U.buffer.length-s.buffer.length)>0)B.splice(l--,1);else{B.splice(A--,1);continue I}}}B.length>12&&B.splice(12,B.length-12)}this.minStackPos=B[0].pos;for(let A=1;A ":"";if(this.stoppedAt!=null&&F>this.stoppedAt)return I.forceReduce()?I:null;if(this.fragments){let s=I.curContext&&I.curContext.tracker.strict,G=s?I.curContext.hash:0;for(let t=this.fragments.nodeAt(F);t;){let c=this.parser.nodeSet.types[t.type.id]==t.type?Q.getGoto(I.state,t.type.id):-1;if(c>-1&&t.length&&(!s||(t.prop(Bg.contextHash)||0)==G))return I.useNode(t,c),!0;if(!(t instanceof aC)||t.children.length==0||t.positions[0]>0)break;let d=t.children[0];if(d instanceof aC&&t.positions[0]==0)t=d;else break}}let U=Q.stateSlot(I.state,4);if(U>0)return I.reduce(U),!0;if(I.stack.length>=8400)for(;I.stack.length>6e3&&I.forceReduce(););let l=this.tokens.getActions(I);for(let s=0;sF?g.push(b):B.push(b)}return!1}advanceFully(I,g){let B=I.pos;for(;;){if(!this.advanceStack(I,null,null))return!1;if(I.pos>B)return aG(I,g),!0}}runRecovery(I,g,B){let F=null,Q=!1;for(let A=0;A ":"";if(U.deadEnd&&(Q||(Q=!0,U.restart(),this.advanceFully(U,B))))continue;let t=U.split(),c=G;for(let d=0;t.forceReduce()&&d<10&&!this.advanceFully(t,B);d++)rC&&(c=this.stackID(t)+" -> ");for(let d of U.recoverByInsert(l))this.advanceFully(d,B);this.stream.end>U.pos?(s==U.pos&&(s++,l=0),U.recoverByDelete(l,s),aG(U,B)):(!F||F.scoreI.topRules[U][1]),F=[];for(let U=0;U=0)Q(G,l,U[s++]);else{let t=U[s+-G];for(let c=-G;c>0;c--)Q(U[s++],l,t);s++}}}this.nodeSet=new kU(g.map((U,l)=>PC.define({name:l>=this.minRepeatTerm?void 0:U,id:l,props:F[l],top:B.indexOf(l)>-1,error:l==0,skipped:I.skippedNodes&&I.skippedNodes.indexOf(l)>-1}))),I.propSources&&(this.nodeSet=this.nodeSet.extend(...I.propSources)),this.strict=!1,this.bufferLength=1024;let A=xA(I.tokenData);this.context=I.context,this.specializerSpecs=I.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let U=0;Utypeof U=="number"?new tF(A,U):U),this.topRules=I.topRules,this.dialects=I.dialects||{},this.dynamicPrecedences=I.dynamicPrecedences||null,this.tokenPrecTable=I.tokenPrec,this.termNames=I.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(I,g,B){let F=new $s(this,I,g,B);for(let Q of this.wrappers)F=Q(F,I,g,B);return F}getGoto(I,g,B=!1){let F=this.goto;if(g>=F[0])return-1;for(let Q=F[g+1];;){let A=F[Q++],U=A&1,l=F[Q++];if(U&&B)return l;for(let s=Q+(A>>1);Q0}validAction(I,g){return!!this.allActions(I,B=>B==g?!0:null)}allActions(I,g){let B=this.stateSlot(I,4),F=B?g(B):void 0;for(let Q=this.stateSlot(I,1);F==null;Q+=3){if(this.data[Q]==65535)if(this.data[Q+1]==1)Q=vB(this.data,Q+2);else break;F=g(vB(this.data,Q+1))}return F}nextStates(I){let g=[];for(let B=this.stateSlot(I,1);;B+=3){if(this.data[B]==65535)if(this.data[B+1]==1)B=vB(this.data,B+2);else break;if((this.data[B+2]&1)==0){let F=this.data[B+1];g.some((Q,A)=>A&1&&Q==F)||g.push(this.data[B],F)}}return g}configure(I){let g=Object.assign(Object.create(C.prototype),this);if(I.props&&(g.nodeSet=this.nodeSet.extend(...I.props)),I.top){let B=this.topRules[I.top];if(!B)throw new RangeError(`Invalid top rule name ${I.top}`);g.top=B}return I.tokenizers&&(g.tokenizers=this.tokenizers.map(B=>{let F=I.tokenizers.find(Q=>Q.from==B);return F?F.to:B})),I.specializers&&(g.specializers=this.specializers.slice(),g.specializerSpecs=this.specializerSpecs.map((B,F)=>{let Q=I.specializers.find(U=>U.from==B.external);if(!Q)return B;let A=Object.assign(Object.assign({},B),{external:Q.to});return g.specializers[F]=mG(A),A})),I.contextTracker&&(g.context=I.contextTracker),I.dialect&&(g.dialect=this.parseDialect(I.dialect)),I.strict!=null&&(g.strict=I.strict),I.wrap&&(g.wrappers=g.wrappers.concat(I.wrap)),I.bufferLength!=null&&(g.bufferLength=I.bufferLength),g}hasWrappers(){return this.wrappers.length>0}getName(I){return this.termNames?this.termNames[I]:String(I<=this.maxNode&&this.nodeSet.types[I].name||I)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(I){let g=this.dynamicPrecedences;return g==null?0:g[I]||0}parseDialect(I){let g=Object.keys(this.dialects),B=g.map(()=>!1);if(I)for(let Q of I.split(" ")){let A=g.indexOf(Q);A>=0&&(B[A]=!0)}let F=null;for(let Q=0;QB)&&g.p.parser.stateFlag(g.state,2)&&(!I||I.scoreC.external(g,B)<<1|I}return C.get}var b0=fU.deserialize({version:14,states:")`QQOPOOOfOQO'#C^OqOSO'#C`O|OWO'#CbO!XO`O'#CeO!dOpO'#CgOOOO'#Ck'#CkOOOO'#Ci'#CiQQOPOOOOOO,58x,58xO!oOQO,58xO!wOQO,58xOOOO,58z,58zO#POSO,58zO#XOSO,58zO#aOWO,58|O#iOWO,58|O#qOWO,58|OOOO,59P,59PO#yO`O,59PO$RO`O,59POOOO,59R,59RO$ZOpO,59RO$cOpO,59ROOOO-E6g-E6gOOOO1G.d1G.dO$kOQO1G.dO$nOQO1G.dOOOO1G.f1G.fO$sOSO1G.fO$vOSO1G.fOOOO1G.h1G.hO${OWO1G.hO%QOWO1G.hO%YOWO1G.hO%bOWO1G.hOOOO1G.k1G.kO%gO`O1G.kO%jO`O1G.kOOOO1G.m1G.mO%oOpO1G.mO%rOpO1G.mOOOO7+$O7+$OO%wOQO7+$OOOOO7+$Q7+$QO%|OSO7+$QOOOO7+$S7+$SO&ROWO7+$SO&WOWO7+$SO&`OWO7+$SOOOO7+$V7+$VO&eO`O7+$VOOOO7+$X7+$XO&jOpO7+$XOOOO<b.is(RQ)))return this.create(I.state);if(!I.docChanged)return C.inserted_ranges=[],C.deleted_ranges=[],C;let g=[];I.changes.iterChangedRanges((b,Z,e,x)=>g.push({fromA:b,toA:Z,fromB:e,toB:x}));let B=eQ.applyChanges(C.fragments,g),F=I.state.doc.toString(),Q=zU.parser.parse(new oG.DocInput(I.state.doc),B);B=eQ.addTree(Q,B);let A=new Map,U=[],l=new Map,s=new Set;for(let b of g){C.ranges.tree.search([b.fromA,b.toA],(Z,e)=>{C.ranges.tree.remove(e,Z),s.add(Z);for(let x of Z.base_range.thread)l.set(x.from,x);return!0});for(let Z of Ct(Q,F,b.fromB,b.toB))A.set(Z.from,Z);U.push([b.toA,b.toB-b.fromB-(b.toA-b.fromA)])}for(let b of s)b.type==="comment"&&l.delete(b.from);let G=0,t=C.ranges.tree.nil_node;function c(b){if(b!=null&&b!=t){for(c(b.left);U.length&&b.item.key.low>=U[0][0];)G+=U.shift()[1];b.item.value.apply_offset(G),b.item.key.low=b.item.value.from,b.item.key.high=b.item.value.to,c(b.right),b.left!=t&&(b.max.low=b.left.max.low),b.right!=t&&(b.max.high=b.right.max.high)}}c(C.ranges.tree.root);let d=Array.from(A.values());for(let b of d)C.ranges.tree.insert([b.from,b.to],b);for(let b of d)b.type==="comment"&&l.set(b.from,b);if(l.size){let b=[],Z,e=[];for(let x of Array.from(l.values()).sort((a,n)=>a.from-n.from))x.clear_references(),x.replies.length=0,!Z||Z?.right_adjacent(x)?e.push(x):(b.push(e),e=[x]),Z=x;b.push(e);for(let x of b){let a=x[0],n=C.ranges.tree.search([a.from,a.from])[0];n.replies.length=0;for(let h of x.slice(n===a?1:0))h.add_reply(n)}}return C.ranges.ranges=C.ranges.tree.values,{tree:Q,ranges:C.ranges,fragments:B,inserted_ranges:d,deleted_ranges:[...s]}}});function Z0(C,I){let g=sg.PLUGIN_SETTINGS.enable_metadata&&C.firstChild?.type.name.startsWith("MDSep")?C.firstChild.from:void 0,B;if(C.type.name==="Substitution"){let F=g?C.firstChild?.nextSibling:C.firstChild;if(!F||F.type.name!=="MSub")return;B=F.from}return e0(C.from,C.to,C.type.name,I.slice(C.from,C.to),B,g)}function Ct(C,I,g=0,B=I.length){let F=[],Q,A=C.cursor();if(A.childAfter(g-1),A.node.type.name==="CriticMarkup"||A.node.from>B)return F;if(A)do{let U=A.node;if(U.type.name==="\u26A0")continue;let l=Z0(U,I);l&&(l.type==="comment"&&Q&&Q.right_adjacent(l)&&l.add_reply(Q),F.push(l),Q=l)}while(A.nextSibling()&&A.node.from<=B);return F}function Bt(C){let I=C.field(JI).ranges;return I.ranges.length?C.selection.ranges.some(g=>I.contains_range(g.from,g.to)):!1}function uA(C){let I=zU.parser.parse(C);return Ct(I,C)}function e0(C,I,g,B,F,Q){switch(g){case"Addition":return new pF(C,I,B,Q);case"Deletion":return new iQ(C,I,B,Q);case"Substitution":return new LB(C,F,I,B,Q);case"Highlight":return new dQ(C,I,B,Q);case"Comment":return new GQ(C,I,B,Q);default:return new pF(C,I,B,Q)}}var LA={addition:pF,deletion:iQ,highlight:dQ,substitution:LB,comment:GQ};function MU(C){let I={};for(let{path:g,range:B}of C)I[g]||(I[g]=[]),I[g].push(B);return I}var KU=require("@codemirror/state");function yG(C,I,g,B=!1,F=null){let Q=C,A=g.doc.lineAt(Q),U=g.charCategorizer(Q);F===KU.CharCategory.Space&&(F=null);let l=null;for(F;;){if(Q==(I?A.to:A.from)){Q==C&&A.number!=(I?g.doc.lines:1)&&(Q+=I?1:-1);break}let s=(0,KU.findClusterBreak)(A.text,Q-A.from,I)+A.from,G=A.text.slice(Math.min(Q,s)-A.from,Math.max(Q,s)-A.from);if(l=U(G),F!=null&&l!=F)if(F==1&&B)B=!1;else break;(G!=" "||Q!=C)&&(F=l),Q=s}return[Q,F]}function Ft(C,I,g=!1){let B=I.doc.lineAt(C),F=I.charCategorizer(C);return g&&(C-=1),F(B.text.slice(C-B.from,C-B.from+1))}var xL=require("@codemirror/state");function PU(C){return C.annotations.map(I=>I.value).filter(I=>typeof I=="string")}function YF(){let C;return sg.PLUGIN_SETTINGS.add_metadata&&(C={},sg.PLUGIN_SETTINGS.add_author_metadata&&(C.author=sg.PLUGIN_SETTINGS.author||void 0),sg.PLUGIN_SETTINGS.add_timestamp_metadata&&(C.time=Math.floor(Date.now()/1e3)),Object.keys(C).length===0&&(C=void 0)),C}var V0={author:"split"};function jU(C,I,g=V0){if(!I)return{compatible:!0,merged_metadata:C.fields};if(!C.fields)return{compatible:!1,merged_metadata:void 0};let B=Object.assign({},C.fields,I);for(let F of[...new Set(Object.keys(I).concat(Object.keys(C.fields)))])if(I[F]!==C.fields[F]){let Q=g[F];if(Q==="split"||Q==="move_outside")return{compatible:!1,merged_metadata:void 0};Q==="old"&&(B[F]=C.fields[F])}return{compatible:!0,merged_metadata:B}}function SG(C,I,g){if(I.clipboardData&&C.clipboard_remove_syntax){let B=g.state.selection.main,Q=g.state.field(JI).ranges.unwrap_in_range(g.state.doc,B.from,B.to).output;I.clipboardData.setData("text/plain",Q),I.preventDefault()}}var nA=require("@codemirror/state");function x0(C){return C===nA.CharCategory.Space||C===null}function u0(C,I){return C!==null&&C!==nA.CharCategory.Space&&C!==I}function L0(C,I,g){if(g.cursor_inside(C))return g;{let B=g.cursor_before_range(C),F=I.ranges.indexOf(g)+(B?-1:1);for(;F>=0&&FmQ.RangeSet.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{}};function Qt(C,I,g){for(;C.value&&C.from<=g;)C.from<=g&&I.push(C.value),C.next()}function rG(C){return Array.isArray(C)?C:[C]}var hQ=class{dom;height=-1;above=0;markers=[];constructor(I,g,B,F){this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(I,g,B,F)}update(I,g,B,F){this.height!=g&&(this.height=g,this.dom.style.height=g+"px"),this.above!=B&&(this.dom.style.marginTop=(this.above=B)?B+"px":""),qU(this.markers,F)||this.setMarkers(I,F)}setMarkers(I,g){let B="cm-gutterElement",F=this.dom.firstChild;for(let Q=0,A=0;;){let U=A,l=Qthis.i;){let g=I.elements.pop();I.dom.removeChild(g.dom),g.destroy()}}},cF=class{constructor(I,g){this.view=I;this.config=g;this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let B in g.domEventHandlers)this.dom.addEventListener(B,F=>{let Q=F.target,A;if(Q!=this.dom&&this.dom.contains(Q)){for(;Q.parentNode!=this.dom;)Q=Q.parentNode;let l=Q.getBoundingClientRect();A=(l.top+l.bottom)/2}else A=F.clientY;let U=I.lineBlockAtHeight(A-I.documentTop);g.domEventHandlers[B](I,U,F)&&F.preventDefault()});this.markers=rG(g.markers(I)),g.initialSpacer&&(this.spacer=new hQ(I,0,0,[g.initialSpacer(I)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}dom;elements=[];markers;spacer=null;update(I){let g=this.markers;if(this.markers=rG(this.config.markers(I.view)),this.spacer&&this.config.updateSpacer){let F=this.config.updateSpacer(this.spacer.markers[0],I);F!=this.spacer.markers[0]&&this.spacer.update(I.view,0,0,[F])}let B=I.view.viewport;return!mQ.RangeSet.eq(this.markers,g,B.from,B.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(I):!1)}destroy(){for(let I of this.elements)I.destroy()}},XQ=class{constructor(I,g,B){this.view=I;this.unfixGutters=g;this.activeGutters=B;this.prevViewport=I.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.style.minHeight=this.view.contentHeight+"px",this.gutters=this.createGutters(I);for(let F of this.gutters)this.dom.appendChild(F.dom);this.fixed=!I.state.facet(this.unfixGutters),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),this.insertGutters(I)}gutters;dom;fixed;prevViewport;createGutters(I){return I.state.facet(this.activeGutters).map(g=>new cF(I,g))}insertGutters(I){I.contentDOM.parentNode.insertBefore(this.dom,I.contentDOM)}insertDetachedGutters(I){I.parentNode.insertBefore(this.dom,I)}getUpdateContexts(){return this.gutters.map(I=>new mA(I,this.view.viewport,-this.view.documentPadding.top))}update(I){if(this.updateGutters(I)){let g=this.prevViewport,B=I.view.viewport,F=Math.min(g.to,B.to)-Math.max(g.from,B.from);this.syncGutters(F<(B.to-B.from)*.8)}I.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight+"px"),this.view.state.facet(this.unfixGutters)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=I.view.viewport}syncGutters(I){let g=this.dom.nextSibling;I&&this.dom.remove();let B=mQ.RangeSet.iter(this.view.state.facet(pC.gutterLineClass),this.view.viewport.from),F=[],Q=this.getUpdateContexts();for(let A of this.view.viewportLineBlocks)if(F.length&&(F=[]),Array.isArray(A.type)){let U=!0;for(let l of A.type)if(l.type==pC.BlockType.Text&&U){Qt(B,F,l.from);for(let s of Q)s.line(this.view,l,F);U=!1}else if(l.widget)for(let s of Q)s.widget(this.view,l)}else if(A.type==pC.BlockType.Text){Qt(B,F,A.from);for(let U of Q)U.line(this.view,A,F)}for(let A of Q)A.finish();I&&this.insertDetachedGutters(g)}updateGutters(I){let g=I.startState.facet(this.activeGutters),B=I.state.facet(this.activeGutters),F=I.docChanged||I.heightChanged||I.viewportChanged||!mQ.RangeSet.eq(I.startState.facet(pC.gutterLineClass),I.state.facet(pC.gutterLineClass),I.view.viewport.from,I.view.viewport.to);if(g==B)for(let Q of this.gutters)Q.update(I)&&(F=!0);else{F=!0;let Q=[];for(let A of B){let U=g.indexOf(A);U<0?Q.push(new cF(this.view,A)):(this.gutters[U].update(I),Q.push(this.gutters[U]))}for(let A of this.gutters)A.dom.remove(),Q.indexOf(A)<0&&A.destroy();for(let A of Q)this.dom.appendChild(A.dom);this.gutters=Q}return F}destroy(){for(let I of this.gutters)I.destroy();this.dom.remove()}};function $U(C){return pC.ViewPlugin.fromClass(C,{provide:I=>pC.EditorView.scrollMargins.of(g=>{let B=g.plugin(I);return!B||B.gutters.length==0||!B.fixed?null:g.textDirection==pC.Direction.LTR?{left:B.dom.offsetWidth}:{right:B.dom.offsetWidth}})})}function h0(C,I,g){let B=[C];return I&&I.fixed===!1&&B.push(g.of(!0)),B}function Il(C,I,g,B){return[h0(C,{},B),g.of({...m0,...I})]}var Fl=require("@codemirror/state"),fG=require("@codemirror/view"),Kg=require("obsidian");var HG=require("obsidian"),Cl=require("@codemirror/state"),yQ=require("@codemirror/view");function oQ(C,I){let g=Object.keys(I).map(B=>X0(C,B,I[B]));return g.length===1?g[0]:function(){g.forEach(B=>B())}}function X0(C,I,g){let B=C[I],F=C.hasOwnProperty(I),Q=F?B:function(){return Object.getPrototypeOf(C)[I].apply(this,arguments)},A=g(Q);return B&&Object.setPrototypeOf(A,B),Object.setPrototypeOf(U,A),C[I]=U,l;function U(...s){return A===Q&&C[I]===U&&l(),A.apply(this,s)}function l(){C[I]===U&&(F?C[I]=Q:delete C[I]),A!==Q&&(A=Q,Object.setPrototypeOf(U,B||Function))}}function o0(C){let I=C.embedRegistry.embedByExtension.md({app:C,containerEl:document.createElement("div")},null,"");I.editable=!0,I.showEditor();let g=Object.getPrototypeOf(Object.getPrototypeOf(I.editMode));return I.unload(),g.constructor}var pG={cursorLocation:{anchor:0,head:0},value:"",cls:"",placeholder:"",focus:!0,filteredExtensions:[],onEnter:(C,I,g)=>(I&&C.options.onSubmit(C),I),onEscape:C=>{C.options.onBlur(C)},onSubmit:()=>{},onBlur:()=>{},onPaste:()=>{},onChange:()=>{}},gl=class extends o0(app){options;initial_value;scope;constructor(I,g,B){super(I,g,{app:I,onMarkdownScroll:()=>{},getMode:()=>"source"}),this.options={...pG,...B},this.initial_value=this.options.value,this.scope=new HG.Scope(this.app.scope),this.scope.register(["Mod"],"Enter",(F,Q)=>!0),this.owner.editMode=this,this.owner.editor=this.editor,this.set(B.value||"",!0),this.register(oQ(this.app.workspace,{setActiveLeaf:F=>(Q,A)=>{this.activeCM.hasFocus||F.call(this.app.workspace,Q,A)}})),this.options.onBlur!==pG.onBlur&&this.editor?.cm.contentDOM.addEventListener("blur",()=>{this._loaded&&this.options.onBlur(this)}),this.editor?.cm.contentDOM.addEventListener("focusin",()=>{this.app.keymap.pushScope(this.scope),this.app.workspace.activeEditor=this.owner}),this.editorEl.classList.remove("markdown-source-view"),B.cls&&this.editorEl.classList.add(B.cls),B.cursorLocation&&this.editor?.cm.dispatch({selection:Cl.EditorSelection.range(B.cursorLocation.anchor,B.cursorLocation.head)})}onUpdate(I,g){super.onUpdate(I,g),g&&this.options.onChange(I)}buildLocalExtensions(){let I=super.buildLocalExtensions();return this.options.placeholder&&I.push((0,yQ.placeholder)(this.options.placeholder)),I.push(yQ.EditorView.domEventHandlers({paste:g=>{this.options.onPaste(g,this)}})),I.push(Cl.Prec.highest(yQ.keymap.of([{key:"Enter",run:g=>this.options.onEnter(this,!1,!1),shift:g=>this.options.onEnter(this,!1,!0)},{key:"Mod-Enter",run:g=>this.options.onEnter(this,!0,!1),shift:g=>this.options.onEnter(this,!0,!0)},{key:"Escape",run:g=>(this.options.onEscape(this),!0),preventDefault:!0}]))),I}getDynamicExtensions(){return super.getDynamicExtensions().filter(I=>!this.options.filteredExtensions.includes(I))}updateBottomPadding(I){return 0}destroy(){this._loaded&&this.unload(),this.app.keymap.popScope(this.scope),this.app.workspace.activeEditor===this.owner&&(this.app.workspace.activeEditor=null),this.containerEl.empty(),super.destroy()}onunload(){super.onunload(),this.destroy()}onload(){super.onload(),this.options.focus&&this.editor?.focus()}};var y0="0.2.3",YG=4,SQ={version:y0,default_edit_mode:1,default_preview_mode:0,comment_style:"icon",editor_styling:!1,markup_focus:{0:{show_styling:!0,show_syntax:!0,show_metadata:!0,focus_annotation:!0,show_comment:!0},1:{show_styling:!0,show_syntax:!1,show_metadata:!1,focus_annotation:!0,show_comment:!1},2:{show_styling:!0,show_syntax:!1,show_metadata:!1,focus_annotation:!0,show_comment:!1}},diff_gutter:!0,diff_gutter_hide_empty:!0,annotation_gutter:!0,annotation_gutter_included_types:31,annotation_gutter_hide_empty:!0,annotation_gutter_default_fold_state:!1,annotation_gutter_fold_button:!0,annotation_gutter_resize_handle:!0,annotation_gutter_focus_on_click:!0,annotation_gutter_width:300,tag_completion:!0,tag_correcter:!0,clipboard_remove_syntax:!0,edit_info:!0,toolbar_preview_button:!0,toolbar_edit_button:!0,toolbar_show_buttons_labels:!0,status_bar_preview_button:!0,status_bar_edit_button:!0,status_bar_metadata_button:!0,database_workers:2,post_processor:!0,live_preview:!0,alternative_cursor_movement:!0,enable_metadata:!1,enable_author_metadata:!1,enable_timestamp_metadata:!1,enable_completed_metadata:!1,enable_style_metadata:!1,enable_color_metadata:!1,add_metadata:!1,add_author_metadata:!1,add_timestamp_metadata:!1,add_completed_metadata:!1,add_style_metadata:!1,add_color_metadata:!1,author:"",suggestion_mode_operations:{cursor_movement:{addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",highlight:"ignore_metadata",comment:"ignore_completely"},bracket_movement:{addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",highlight:"stay_inside",comment:"stay_inside"}}},JG=new Set(["live_preview","diff_gutter","annotation_gutter","annotation_gutter_focus_on_click","comment_style","tag_completion","tag_correcter"]),vG=new Set(["enable_metadata"]),kG=new Set(["enable_metadata"]),JF=(Q=>(Q[Q.ADDITION=1]="ADDITION",Q[Q.DELETION=2]="DELETION",Q[Q.SUBSTITUTION=4]="SUBSTITUTION",Q[Q.HIGHLIGHT=8]="HIGHLIGHT",Q[Q.COMMENT=16]="COMMENT",Q))(JF||{});var WQ=require("obsidian");var GF=(C=!1)=>{let I=oQ(WQ.Menu.prototype,{onEnter:g=>function(B){let F=this.items[this.selected];return F&&F instanceof WQ.MenuItem&&F.handleEvent(B)||!0},onMenuClick:g=>function(B){if(!C||this.currentSubmenu&&this.currentSubmenu.dom.contains(B.target))B.stopImmediatePropagation();else return g&&g.apply(this,[B])},hide:g=>function(){return this.parentMenu||I(),g&&g.apply(this)}});return I},DG=(C,I,g,B=()=>{})=>oQ(WQ.MarkdownView.prototype,{setState:F=>async function(...Q){return Q[0]&&await C(this,Q[0]),F&&F.apply(this,Q)},getState:F=>function(){let Q=F&&F.apply(this);return Q&&I(this,Q),Q},setData:F=>async function(...Q){Q[1]&&g(this);let A=F&&F.apply(this,Q);return Q[1]&&B(this),A}}),TG=(C,I,g)=>oQ(C.app.plugins,{uninstallPlugin:B=>async(...F)=>{try{F[0]===I&&await g()}catch{}B&&await B.apply(C.app.plugins,F)}});var Ut=class extends Kg.Component{constructor(g,B){super();this.range=g;this.marker=B;this.text=g.unwrap(),this.annotation_container=this.marker.annotation_thread.createDiv({cls:"cmtr-anno-gutter-annotation"}),this.annotation_container.addEventListener("blur",this.renderPreview.bind(this)),this.annotation_container.addEventListener("dblclick",this.renderSource.bind(this)),this.annotation_container.addEventListener("contextmenu",this.onCommentContextmenu.bind(this)),this.range.metadata&&this.renderMetadata(),this.annotation_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-view"}),this.renderPreview()}text;new_text=null;annotation_container;metadata_view=null;annotation_view;currentMode=null;editMode=null;onload(){super.onload()}onunload(){super.onunload(),this.annotation_container.remove(),this.editMode=null}renderMetadata(){if(this.metadata_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-metadata"}),this.range.fields.author){let g=createSpan({cls:"cmtr-anno-gutter-annotation-author-label",text:"Author: "});this.metadata_view.appendChild(g);let B=createSpan({cls:"cmtr-anno-gutter-annotation-author-name",text:this.range.fields.author});this.metadata_view.appendChild(B)}if(this.range.fields.time){if(this.metadata_view.children.length>0){let F=createSpan({cls:"cmtr-anno-gutter-annotation-metadata-separator",text:" \u2022 "});this.metadata_view.appendChild(F)}let g=createSpan({cls:"cmtr-anno-gutter-annotation-time-label",text:"Updated at: "});this.metadata_view.appendChild(g);let B=createSpan({cls:"cmtr-anno-gutter-annotation-time",text:window.moment.unix(this.range.fields.time).format("MMM DD YYYY, HH:mm")});this.metadata_view.appendChild(B)}}renderSource(g){if(this.range.type!=="comment")new Kg.Notice("[Commentator] You can only edit comments.");else{if(g?.stopPropagation(),this.currentMode==="source")return;let{app:B}=this.marker.view.state.field(Kg.editorInfoField);if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!0),this.range.fields.author&&this.range.fields.author!==B.plugins.plugins.commentator.settings.author){new Kg.Notice("[Commentator] You cannot edit comments from other authors.");return}this.annotation_view.empty(),this.editMode=this.addChild(new gl(B,this.annotation_view,{value:this.text,cls:"cmtr-anno-gutter-annotation-editor",onSubmit:F=>{this.new_text=F.get(),this.renderPreview()},filteredExtensions:[B.plugins.plugins.commentator.editorExtensions],onBlur:this.renderPreview.bind(this)})),this.currentMode="source"}}renderPreview(){if(this.currentMode!=="preview")if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!1),this.text===this.new_text||this.new_text===null){let{app:g}=this.marker.view.state.field(Kg.editorInfoField);if(this.new_text=null,this.editMode&&(this.removeChild(this.editMode),this.editMode=null),this.annotation_view.empty(),this.range.type!=="substitution")switch(Kg.MarkdownRenderer.render(g,this.text||" ",this.annotation_view,"",this),this.range.type){case"addition":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Added: "}));break;case"deletion":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Deleted: "}));break;case"highlight":break;case"comment":break}else{let B=this.range.unwrap_parts();Kg.MarkdownRenderer.render(g,B[0]||" ",this.annotation_view,"",this),this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Changed: "}));let F=this.annotation_view.children.length;Kg.MarkdownRenderer.render(g,B[1]||" ",this.annotation_view,"",this),this.annotation_view.children[F].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"To: "}))}this.annotation_view.addClass("cmtr-anno-gutter-annotation-"+this.range.type),this.currentMode="preview"}else this.text=this.new_text,setTimeout(()=>this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:_U("comment",this.new_text)}}))}onCommentContextmenu(g){g.preventDefault(),g.stopPropagation(),GF(!0);let B=new Kg.Menu;this.range.type!=="comment"&&this.range.type!=="highlight"&&(B.addItem(F=>{F.setTitle("Accept changes").setIcon("check").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:wB(this.marker.view.state,this.range.from,this.range.to)})})}),B.addItem(F=>{F.setTitle("Reject changes").setIcon("cross").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:fB(this.marker.view.state,this.range.from,this.range.to)})})})),this.range.type==="comment"?(this.range.replies.length>0&&B.addItem(F=>{F.setTitle("Close comment thread").setIcon("message-square-off").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.full_range_front,to:this.range.full_range_back,insert:""}})})}),B.addItem(F=>{F.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{jC(this.marker.view,this.range)})}),B.addItem(F=>{F.setTitle("Edit comment").setIcon("pencil").setSection("comment-handling").onClick(()=>{this.renderSource()})}),B.addItem(F=>{F.setTitle("Remove comment").setIcon("cross").setSection("comment-handling").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:""}})})})):this.range.type!=="highlight"?(B.addItem(F=>{F.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{jC(this.marker.view,this.range)})}),this.range.replies.length>0&&B.addItem(F=>{F.setTitle("Remove all comments").setIcon("message-square-x").setSection("comment-handling").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.replies[0].from,to:this.range.replies[this.range.replies.length-1].to,insert:""}})})})):B.addItem(F=>{F.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{jC(this.marker.view,this.range)})}),B.addItem(F=>{F.setTitle("Fold gutter").setSection("gutter-controls").setIcon("arrow-right-from-line").onClick(()=>{this.marker.view.dispatch({annotations:[iF.of(null)]})})}),B.addItem(F=>{let Q=F.setTitle("Included annotations").setIcon("eye").setSection("gutter-controls").setSubmenu(),A=this.marker.view.state.facet(QB);for(let{title:U,icon:l,value:s}of[{title:"Additions",icon:"plus-circle",value:1},{title:"Deletions",icon:"minus-square",value:2},{title:"Substitutions",icon:"replace",value:4},{title:"Highlights",icon:"highlighter",value:8},{title:"Comments",icon:"message-square",value:16}])Q.addItem(G=>{G.setTitle(U).setIcon(l).setChecked((A&s)!==0).onClick(()=>{A^=s;let t=(A&s)!==0;G.checkIconEl?G.checkIconEl.style.display=t?"flex":"none":G.setChecked(t),this.marker.view.dispatch(this.marker.view.state.update({effects:[VQ.reconfigure(QB.of(A))]}))})})}),B.showAtPosition(g)}},Bl=class extends fG.GutterMarker{constructor(g,B,F,Q=0){super();this.annotation=g;this.annotations=B;this.view=F;this.itr=Q}annotation_thread;component=new Kg.Component;preventUnload=!1;eq(g){return this.itr===g.itr&&this.annotations===g.annotations&&this.annotations[0].equals(g.annotations[0])}onCommentThreadClick(){this.view.dispatch({annotations:[Ql.of({marker:this,index:-1,scroll:!0,focus_markup:!0})]}),this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0)}toDOM(){this.annotation_thread=createDiv({cls:"cmtr-anno-gutter-thread"}),this.annotation_thread.addEventListener("click",this.onCommentThreadClick.bind(this));for(let g of this.annotations)this.component.addChild(new Ut(g,this));return this.component.load(),this.annotation_thread}focus(){this.annotation_thread.focus()}focus_annotation(g=-1,B=!1){g===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0):g>=0&&g{let F=this.view.lineBlockAt(this.annotations[0].from).top-100;this.view.scrollDOM.scrollTo({top:F,behavior:"smooth"})},200)}unfocus_annotation(g=-1){g===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!1):this.annotation_thread.children.item(g).classList.toggle("cmtr-anno-gutter-thread-highlight",!1)}destroy(g){this.component.unload(),this.annotation_thread.remove(),super.destroy(g)}};function wG(C,I,g){let B=C.field(Kg.editorEditorField),F=(g&1)!==0,Q=(g&2)!==0,A=(g&4)!==0,U=(g&8)!==0,l=(g&16)!==0,s=[];for(let G of I){let t=G.full_thread;switch(l||(t=t.slice(0,1)),G.type){case"addition":F||t.shift();break;case"deletion":Q||t.shift();break;case"substitution":A||t.shift();break;case"highlight":U||t.shift();break;case"comment":l||t.shift();break}if(t.length){let c=new Bl(G,t,B,zG);c.preventUnload=!0,s.push(c.range(G.from,G.to))}}return s}var zG=0,TB=Fl.StateField.define({create(C){let I=C.field(JI).ranges.ranges.reduce((g,B)=>{let F=B.base_range;return g.includes(F)||g.push(F),g},[]);return Fl.RangeSet.of(wG(C,I,C.facet(QB)))},update(C,I){let g=I.state.facet(QB);if(I.startState.facet(QB)!==g)return this.create(I.state);if(!I.docChanged)return C;zG+=1;let B=[];for(let Q of I.state.field(JI).inserted_ranges)B.includes(Q.base_range)||B.push(Q.base_range);let F=I.state.field(JI).deleted_ranges.map(Q=>Q.base_range);return C.map(I.changes).update({filter:(Q,A,U)=>{let l=!F.includes(U.annotation);return U.preventUnload=l,l},add:wG(I.state,B.map(Q=>Q.full_thread[0]),g)})}});var MG=require("@codemirror/view"),AB=require("obsidian");function lt(C,I,g=!1){let B=I??C.text;!I&&g&&(C.to>=B.length&&!B.endsWith(eg[C.type].at(-1))?B=C.unwrap_bracket(!0):B=C.unwrap());let F=document.createElement("span");F.classList.add("cmtr-comment-icon"),(0,AB.setIcon)(F,"message-square");let Q=null,A=new AB.Component;return F.onmouseenter=()=>{if(Q)return;Q=document.createElement("div"),Q.classList.add("cmtr-comment-tooltip"),AB.MarkdownRenderer.render(sg.app,B,Q,"",A),A.load(),F.appendChild(Q);let U=F.getBoundingClientRect(),l=Q.getBoundingClientRect();Q.style.left=U.x-l.x+12+"px"},F.onmouseleave=()=>{Q&&(A.unload(),F.removeChild(Q),Q=null)},F}var hA=class extends MG.WidgetType{constructor(g,B=!1){super();this.range=g;this.annotation_gutter=B;this.component=new AB.Component}tooltip=null;icon=null;component;focused=!1;renderTooltip(){if(!this.tooltip){this.tooltip=document.createElement("div"),this.tooltip.classList.add("cmtr-comment-tooltip"),AB.MarkdownRenderer.render(sg.app,this.range.text,this.tooltip,"",this.component),this.component.load(),this.icon.appendChild(this.tooltip);let g=this.icon.getBoundingClientRect(),B=this.tooltip.getBoundingClientRect();this.tooltip.style.left=g.x-B.x-B.width/2+12+"px"}}focusAnnotation(g,B){g.dispatch({annotations:[aB.of({from:this.range.from,to:this.range.to})]})}unrenderTooltip(){!this.focused&&this.tooltip&&(this.component.unload(),this.icon.removeChild(this.tooltip),this.tooltip=null)}toDOM(g){return this.icon=document.createElement("span"),this.icon.classList.add("cmtr-comment-icon"),(0,AB.setIcon)(this.icon,"message-square"),this.annotation_gutter?(this.icon.onclick=B=>this.focusAnnotation(g,B),this.icon.oncontextmenu=B=>{B.preventDefault();let F=new AB.Menu;F.addItem(Q=>{Q.setTitle("Focus annotation").setIcon("eye").onClick(this.focusAnnotation.bind(this,g))}),F.addItem(Q=>{Q.setTitle("Add comment").setIcon("message-square").onClick(A=>{A.preventDefault(),jC(g,this.range)})}),F.showAtMouseEvent(B)}):this.range.length&&(this.icon.onmouseenter=()=>{this.renderTooltip()},this.icon.onclick=()=>{this.renderTooltip(),this.focused=!0},this.icon.onmouseleave=()=>{this.unrenderTooltip(),this.focused=!1}),this.icon}};var vF=require("@codemirror/state"),EQ=require("@codemirror/view");var NQ=vF.StateEffect.define(),XA=vF.StateField.define({create(C){return{from:C.selection.main.from,to:C.selection.main.to}},update(C,I){for(let g of I.effects)if(g.is(NQ))return g.value;return C}}),st=vF.StateField.define({create(C){return EQ.Decoration.none},update(C,I){let g=I.startState.field(XA,!1),B=I.state.field(XA);if(g!==B){let F=I.state.field(JI).ranges.ranges_in_interval(B.from,B.to);return F.length&&F[0].base_range===F.at(-1)?.base_range&&B.from>=F[0].from&&B.to<=F.at(-1).to?vF.RangeSet.of([EQ.Decoration.mark({attributes:{class:"cmtr-focused"}}).range(F[0].full_range_front,F[0].full_range_back)]):EQ.Decoration.none}else return C},provide(C){return EQ.EditorView.decorations.from(C)}});var SA=require("@codemirror/state"),zB=require("@codemirror/view"),ll=require("obsidian");var yA=zB.Decoration.replace({}),tt=(C,I="",g=!1)=>zB.Decoration.mark({attributes:{"data-contents":"string","data-type":"cmtr-"+C.repr.toLowerCase(),class:I,style:g&&C.fields.color?`background-color: #${C.fields.color};`:""}});function HC(C,I,g,B=!1){B||(g===-1?C.push(yA.range(I.from,I.from+3)):g===1?C.push(yA.range(I.to-3,I.to)):C.push(yA.range(I.middle,I.middle+2)))}function oA(C,I,g=!1){!I.metadata||g||C.push(yA.range(I.from+3,I.metadata+2))}function Al(C,I){C.push(yA.range(I.from,I.to))}function kF(C,I,g,B=0,F=!1,Q=!0){let A=F?0:3;B===0?I.empty()||C.push(tt(I,g,Q).range(I.from+A,I.to-A)):B<0?I.part_is_empty(!0)||C.push(tt(I,g,Q).range(I.from+A,I.middle)):B>0&&(I.part_is_empty(!1)||C.push(tt(I,g,Q).range(I.middle+2,I.to-A)))}function ct(C,I,g=""){HC(C,I,-1),oA(C,I),kF(C,I,g),HC(C,I,1)}function Ul(C,I,g,B,F){let Q=[],{show_styling:A,show_syntax:U,show_metadata:l,show_comment:s}=F.markup_focus[B];for(let G of C)if(g===0){let t=I?I.ranges.some(e=>G.partially_in_full_range(e.from,e.to)):void 0,c=`cmtr-inline cmtr-${G.repr.toLowerCase()} `+(G.fields.style||"");G.replies.length&&(c+=" cmtr-has-reply");let d=t?U:void 0,b=t?l:void 0,Z=t?A:void 0;!(s&&t)&&G.type==="comment"&&F.comment_style!=="inline"?F.comment_style==="icon"&&G.base_range===G?Q.push(zB.Decoration.replace({widget:new hA(G,F.annotation_gutter)}).range(G.from,G.to)):Q.push(zB.Decoration.replace({}).range(G.from,G.to)):(HC(Q,G,-1,d),oA(Q,G,b),G.type==="substitution"?(kF(Q,G,c+" cmtr-deletion",-1,!1,Z),HC(Q,G,0,d),kF(Q,G,c+" cmtr-addition",1,!1,Z)):kF(Q,G,c,0,!1,Z),HC(Q,G,1,d))}else g===1?G.type==="addition"?ct(Q,G,"cmtr-accepted"):G.type==="deletion"?Al(Q,G):G.type==="substitution"?(HC(Q,G,-1),oA(Q,G),HC(Q,G,0),kF(Q,G,"cmtr-accepted",1),HC(Q,G,1)):G.type==="comment"?Al(Q,G):ct(Q,G,""):g===2&&(G.type==="addition"?Al(Q,G):G.type==="deletion"?(HC(Q,G,-1),oA(Q,G),kF(Q,G,"cmtr-accepted"),HC(Q,G,1)):G.type==="substitution"?(HC(Q,G,-1),oA(Q,G),kF(Q,G,"cmtr-accepted",-1),HC(Q,G,0),HC(Q,G,1)):G.type==="comment"?Al(Q,G):ct(Q,G,""));return Q}var Gt=C=>SA.StateField.define({create(I){if(!I.field(ll.editorLivePreviewField))return zB.Decoration.none;let B=I.facet(Mg),F=I.facet(nC),Q=I.field(JI);return SA.RangeSet.of(Ul(Q.ranges.ranges,null,B,F,C))},update(I,g){let B=g.state.field(ll.editorLivePreviewField);if(!B)return zB.Decoration.none;let F=g.state.facet(Mg),Q=g.state.facet(nC),A=g.state.field(JI);if(B!==g.startState.field(ll.editorLivePreviewField)||F!==g.startState.facet(Mg)||g.effects.some(U=>U.is(RQ)))return SA.RangeSet.of(Ul(A.ranges.ranges,g.state.selection,F,Q,C));if(g.docChanged||!g.docChanged&&A.inserted_ranges.length){let U=0;return I.update({filter:(l,s,G)=>{for(;U{for(;sC.some(I=>I)}),it=UB.Facet.define(),aB=UB.Annotation.define(),iF=UB.Annotation.define(),Ql=UB.Annotation.define(),tl=UB.Annotation.define(),cl=UB.Annotation.define(),Gl=UB.Annotation.define(),il=UB.Annotation.define(),sl=class extends XQ{previously_focused=void 0;constructor(I){super(I,PG,it),I.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{I.dispatch(I.state.update({effects:[bl.reconfigure([])]}))}))}debouncedMoveGutter=(0,MB.debounce)(this.moveGutter.bind(this),200);createGutters(I){return I.state.facet(it).map(g=>new bt(I,g,this.dom))}insertGutters(I){I.contentDOM.parentNode.insertBefore(this.dom,I.contentDOM.nextSibling)}insertDetachedGutters(I){this.view.contentDOM.parentNode.insertBefore(this.dom,this.view.contentDOM.nextSibling)}getUpdateContexts(){return this.gutters.map(I=>new dt(I,this.view.viewport,-this.view.documentPadding.top))}update(I){for(let g of I.transactions){let B=g.annotation(Ql);if(B){let{marker:F,index:Q,scroll:A=!1,focus_markup:U=!1}=B;this.unfocusAnnotation(),this.focusAnnotation(F,Q,A,U)}}super.update(I)}unfocusAnnotation(){this.previously_focused?.unfocus_annotation(),this.previously_focused=void 0}focusAnnotation(I,g,B=!1,F=!1){this.previously_focused=I,this.debouncedMoveGutter(I),I.focus_annotation(g,B),F&&setTimeout(()=>{this.view.dispatch(this.view.state.update({effects:[NQ.of({from:I.annotation.from,to:I.annotation.full_range_back})]}))})}updateGutters(I){let g=I.transactions.flatMap(B=>B.annotation(aB)).find(B=>B);if((g||I.startState.selection!==I.state.selection)&&this.unfocusAnnotation(),g){let{from:B,to:F,index:Q=-1,scroll:A=!1}=g;I:for(let U of this.gutters[0].elements)if(B>=U.block.from){for(let l of U.markers)if(B>=l.annotation.from&&F<=l.annotation.full_range_back){this.focusAnnotation(l,Q,A);break I}}else if(Bl.markers.includes(I));if(!B)return;let F=B.markers.indexOf(I),Q=B.block.top,A=B.dom.children[F].offsetTop,U=Q-A;if(Math.abs(U)>=10&&U){let l=g.elements[0];l.dom.style.marginTop=parseInt(l.dom.style.marginTop||"0")+U+"px"}}foldGutter(){this.gutters[0].foldGutter()}},dl=$U(sl);function jG(C){return Il(dl,C,it,PG)}var dt=class extends mA{constructor(g,B,F){super(g,B,F);this.gutter=g;this.height=F;this.previous_element_end=F}previous_element_end=0;new_gutter_elements=[];added_elements=[];async addElement(g,B,F){let Q=Math.max(B.top-this.previous_element_end,0),A=Q<=0?this.previous_element_end:B.top;F.sort((G,t)=>G.annotation.from-t.annotation.from);let l=this.gutter.elements[this.i]?.dom.clientHeight||36,s=this.gutter.elements.findIndex(G=>qU(G.markers,F));if(s!==-1){let G=this.gutter.elements[s];for(let t=this.i;t{this.folded=!this.folded,this.view.state.field(MB.editorInfoField).app.workspace.requestSaveLayout(),this.foldGutter()},this.setFoldButtonState(),this.view.dom.prepend(this.fold_button_el)}createResizeHandle(){this.resize_handle_el=createEl("hr",{cls:["cmtr-anno-gutter-resize-handle"]}),this.resize_handle_el.style.display=this.view.state.field(TB).size&&!this.folded?"":"none",this.resize_handle_el.addEventListener("mousedown",g=>{let B=g.clientX,F=(0,MB.debounce)(l=>{this.width=l,this.view.state.field(MB.editorInfoField).app.workspace.requestSaveLayout(),this.dom.style.width=this.width+"px",this.fold_button_el&&(this.fold_button_el.style.right=this.width+KG+"px")},25);this.resize_handle_el.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!0),this.fold_button_el?.classList.toggle("cmtr-anno-gutter-moving",!0),this.gutterDom.classList.toggle("cmtr-anno-gutter-moving",!0);let Q=parseInt(this.dom.style.width.slice(0,-2)),A=l=>{let s=l.clientX-B;return B=l.clientX,Q-=s,F(Q),!0},U=()=>{document.removeEventListener("mousemove",A),document.removeEventListener("mouseup",U),this.resize_handle_el.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!1),this.fold_button_el?.classList.toggle("cmtr-anno-gutter-moving",!1),this.gutterDom.classList.toggle("cmtr-anno-gutter-moving",!1)};return document.addEventListener("mousemove",A),document.addEventListener("mouseup",U),!0}),this.gutterDom.appendChild(this.resize_handle_el)}setFoldButtonState(){this.fold_button_el&&(this.folded?(this.fold_button_el.style.right="20px",this.fold_button_el.style.rotate="-180deg",this.fold_button_el.ariaLabel="Unfold gutter",this.resize_handle_el&&(this.resize_handle_el.style.display="none")):(this.fold_button_el.style.right=this.width+KG+"px",this.fold_button_el.style.rotate="0deg",this.fold_button_el.ariaLabel="Fold gutter",this.resize_handle_el&&(this.resize_handle_el.style.display="")))}foldGutter(){this.setFoldButtonState(),this.folded?this.elements.forEach(g=>{Array.from(g.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(B=>{B.setAttribute("style",`max-height: ${B.clientHeight}px; overflow: hidden;`)})}):this.dom.addEventListener("transitionend",()=>{this.elements.forEach(g=>{Array.from(g.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(B=>{B.setAttribute("style","")})})},{once:!0}),this.dom.style.width=this.folded?"0":this.width+"px"}update(g){let B=super.update(g),F=g.state.field(TB);for(let Q of g.transactions){let A=Q.annotation(iF),U=Q.annotation(tl),l=Q.annotation(cl),s=Q.annotation(Gl),G=Q.annotation(il);U!==void 0&&(this.width=U,!this.hide_on_empty&&!this.folded&&(this.dom.style.width=U+"px",this.setFoldButtonState())),A!==void 0&&(A===null?(this.folded=!this.folded,this.view.state.field(MB.editorInfoField).app.workspace.requestSaveLayout()):this.folded=A,this.foldGutter()),l!==void 0&&(this.hide_on_empty=l,this.hide_on_empty&&F.size===0?this.dom.style.width="0":this.dom.style.width=this.width+"px"),s!==void 0&&(this.add_fold_button=s,this.add_fold_button&&!this.fold_button_el?this.createFoldButton():!this.add_fold_button&&this.fold_button_el&&(this.fold_button_el.remove(),this.fold_button_el=void 0),this.setFoldButtonState()),G!==void 0&&(this.add_resize_handle=G,this.add_resize_handle&&!this.resize_handle_el?this.createResizeHandle():!this.add_resize_handle&&this.resize_handle_el&&(this.resize_handle_el.remove(),this.resize_handle_el=void 0))}return F.size!==g.startState.field(TB).size&&(F.size===0?(this.fold_button_el&&(this.fold_button_el.style.display="none"),this.resize_handle_el&&(this.resize_handle_el.style.display="none"),this.hide_on_empty&&(this.dom.style.width="0")):(this.fold_button_el&&(this.fold_button_el.style.display=""),this.resize_handle_el&&(this.resize_handle_el.style.display=""),this.folded||(this.dom.style.width=this.width+"px"))),B}destroy(){this.fold_button_el?.remove(),this.resize_handle_el?.remove(),super.destroy()}},Zt=class extends hQ{constructor(g,B,F,Q,A=null){super(g,B,F,Q);this.block=A}update(g,B,F,Q,A=null){this.block=A,this.above!=F&&(this.dom.style.marginTop=(this.above=F)?F+"px":""),qU(this.markers,Q)||this.setMarkers(g,Q)}};var _G=C=>[TB,jG({class:"cmtr-anno-gutter "+(C.app.vault.getConfig("cssTheme")==="Minimal"?" is-minimal":""),markers:I=>I.state.field(TB),foldState:C.settings.annotation_gutter_default_fold_state,width:C.settings.annotation_gutter_width,hideOnEmpty:C.settings.annotation_gutter_hide_empty,includeFoldButton:C.settings.annotation_gutter_fold_button,includeResizeHandle:C.settings.annotation_gutter_resize_handle})],bl=new OG.Compartment;function jC(C,I,g=!1){let B=I?I.full_range_back:C.state.selection.main.head,F=I?I.full_thread.length:-1;C.dispatch(C.state.update({changes:{from:B,to:B,insert:_U("comment","")},selection:qG.EditorSelection.cursor(B),scrollIntoView:g})),setTimeout(()=>{C.dispatch(C.state.update({annotations:[aB.of({from:B,to:B,index:F})]}))})}var Ln=require("@codemirror/state");function wB(C,I,g,B=!0){let F=C.field(JI).ranges;return(I||g?F.ranges_in_interval(I??0,g??1/0):F.ranges).filter(Q=>Q.type==="addition"||Q.type==="deletion"||Q.type==="substitution").map(Q=>({from:Q.from,to:B?Q.full_range_back:Q.to,insert:Q.accept()}))}function fB(C,I,g,B=!0){let F=C.field(JI).ranges;return(I||g?F.ranges_in_interval(I??0,g??1/0):F.ranges).filter(Q=>Q.type==="addition"||Q.type==="deletion"||Q.type==="substitution").map(Q=>({from:Q.from,to:B?Q.full_range_back:Q.to,insert:Q.reject()}))}async function lB(C,I,g,B){B.sort((A,U)=>A.from-U.from);let F=await I.vault.read(g),Q=sG(F,C,B);await I.vault.modify(g,Q)}var Vt=require("@codemirror/state");function Ii(C,I){return I==="regular"||I==="clear"?!0:!((C.type==="comment"||C.type==="highlight")&&C.type!==I)}function S0(C,I,g,B={}){return Ii(C,I)?!g||!C.fields?!1:[...new Set(Object.keys(g).concat(Object.keys(C.fields)))].some(F=>g[F]!==C.fields[F]&&(B[F]==="move_outside"||F==="author"&&C.type==="comment")):!0}function W0(C,I){if(C!=="substitution"&&C===I)return C;if(C==="deletion"&&I==="addition")return"substitution";if(C==="substitution"&&I==="addition")return"substitution";if(C==="deletion"&&I==="substitution")return"substitution"}function et(C,I,g,B,F=!1,Q=!1){if(!I||!g||!Ii(I,g))return{};if(!Q&&(F&&I.touches_left_bracket(C,!1,!0,!0)||!F&&I.touches_right_bracket(C,!1,!0)))return{};let{compatible:A,merged_metadata:U}=jU(I,B);if(!A)return{};let l,s;return F?(l=I.range_type(-1/0,C),s=g):(l=g,s=I.range_type(C,1/0)),g=W0(l,s),{type:g,merged_metadata:g?U:void 0}}function $G(C,I,g,B,F,Q,A){let U=C.ranges_in_interval(g,B),l=C.at_cursor(g,!1),s=C.at_cursor(B,!0),G=["",""],t=!1,c=F,d=0,b=0;function Z(x=!1){l?.type&&(l.touches_left_bracket(g,!1,!0,!0)?g=l.from:l.touches_right_bracket(g,!1,!0)?g=l.to:l.type==="substitution"&&(x||l.contains_separator(g,B))?(G[0]=DB("",l.unwrap_slice(0,g),"deletion",l.fields).insert,g=l.from):G[0]=l.split_range(g)[0])}function e(x=!1){if(s?.type)if(s.touches_right_bracket(B,!1,!0))B=s.to;else if(s.touches_left_bracket(B,!1,!0,!0))B=s.from;else if(s.type==="substitution"&&(x||s.contains_separator(g,B))){let a=s.unwrap_slice(B,1/0);G[1]=DB(a,"","addition",s.fields).insert,B=s.to,t=!0}else G[1]=s.split_range(B)[1]}if(Q==="none")B=g,c="";else if(Q==="regular")if(l!==void 0&&l===s){let x=g===B?"":l.unwrap_slice(g,B);if(x){if(g=l.cursor_move_inside(g,!0),B=l.cursor_move_inside(B,!1),l.type==="substitution"){let a=l.contains_part(g,B),n=l.unwrap_parts();if(a){let h=l.unwrap_slice(0,g);d+=h.length,b+=F.length-2;let m=l.unwrap_slice(B,l.middle);x=h+F+m,c=n[1]}else if(a===!1){x=n[0];let h=l.unwrap_slice(l.middle+2,g);d=x.length+h.length;let m=l.unwrap_slice(B,1/0);c=h+F+m}else{let[h,m]=l.unwrap_slice_parts_inverted(g,B);d=h.length,x=h,c=F+m}g=l.from,B=l.to,{insert:c,start_offset:d,end_offset:b}=aA(c,x,l.fields,d,b)}}else{let a=l.cursor_move_inside(g,!0);g=a,B=a,c=F}}else if(g===B?"":C.unwrap_in_range(I,g,B,U).output)Z(),e(),d+=G[0].length,t?c=G[0]+F+G[1]:(b=G[1].length,c=G[0]+G[1]+F);else{let a=l||s,n=a?a.cursor_move_inside(g,!0):g;g=n,B=n,c=F}else if(Q==="clear"){Z(),e();let x=g===B?"":C.unwrap_in_range(I,g,B,U).output;d+=G[0].length,b+=x.length,c=G[0]+x+G[1]}else if(l!==void 0&&l===s&&l.type==="substitution"){let x=l.contains_part(g,B),a=x?g:B,n=et(a,l,Q,A,x,!0);if(n.type){let h="",m=l.unwrap_parts();if(n.type==="addition"){h=m[0];let L=Math.clamp(a-l.middle-2,0,m[1].length);d=m[0].length+L,c=m[1].slice(0,L)+F+m[1].slice(L),{insert:c,start_offset:d,end_offset:b}=aA(c,h,n.merged_metadata,d,b),g=l.from,B=l.to}else if(n.type==="deletion")b=B-g,B=g,c="";else if(x){let L=l.unwrap_slice(0,g),R=l.unwrap_slice(g,B);e(),d=L.length,b=R.length,{insert:c,start_offset:d,end_offset:b}=DB(F,L+R,n.type,n.merged_metadata,d,b),g=l.from}else if(x===!1)h=l.unwrap_slice(g,B),b=h.length,c=F+l.unwrap_slice(B,1/0),F.length||(b-=2),Z(),{insert:c,start_offset:d,end_offset:b}=DB(c,h,n.type,n.merged_metadata,d,b),B=l.to;else{let L=Math.clamp(B-l.middle-2,0,m[1].length);h=m[0]+m[1].slice(0,L),d=g-l.range_start,b=L+(m[0].length-g+l.range_start),c=F+m[1].slice(L),c.length&&!F.length&&(b-=2),{insert:c,start_offset:d,end_offset:b}=aA(c,h,n.merged_metadata,d,b),g=l.from,B=l.to}}else{let h=l.unwrap_slice(g,B);Z(Bl.middle+2),{insert:c,start_offset:d,end_offset:b}=DB(F,h,Q,A,d,b+F.length+h.length)}}else{let x=g===B?"":C.unwrap_in_range(I,g,B,U).output;if(!x){if(Q==="substitution")Q="addition";else if(Q==="deletion")return{from:g,to:g,insert:"",start:g,end:g}}b=x.length;let a=et(g,l,Q,A,!0),n=a.merged_metadata;if(c=F,a.type){if(l.type==="substitution"){let m=l.unwrap_parts();d=m[0].length,b+=m[1].length,x=m[0]+x,c=m[1]+F}else{let m=l.unwrap_slice(0,g);d=m.length,x=m+x}g=l.from,A=n}else Z();let h=et(B,s,Q,A,!1);if(n=h.merged_metadata,h.type){if(s.type==="substitution"){let m=s.unwrap_slice_parts_inverted(g,B);c=F+m[1],x+=m[0]}else c+=s.unwrap_slice(B,1/0);B=s.to,A=n}else e();(a.type==="substitution"||h.type==="substitution")&&(Q="substitution"),{insert:c,start_offset:d,end_offset:b}=DB(c,x,Q,A,d,b)}return d+=G[0].length,c=G[0]+c+G[1],{from:g,to:B,insert:c,start:g+d,end:g+d+b+F.length}}function WA(C,I,g,B,F,Q,A,U=!1){let l=C.ranges_in_interval(g,B),s=l.at(0),G=l.at(-1);s?.touches_left_bracket(g,!0,!0,!0)&&(g=s.from),G?.touches_right_bracket(B,!0,!0)&&(B=G.to);let t=g,c=[];if(!U){for(let b of l)if(S0(b,Q,A)){if(tB&&(B=t);let d=$G(C,I,t,B,F,Q,A);return d&&c.push(d),c}function gi(C,I,g){let B=C.cm.state.field(JI).ranges,F=C.cm.state.selection.ranges,Q=[],A=[];for(let U of F){let l=WA(B,C.cm.state.doc,U.from,U.to,"",I,YF());A.push(...l),Q.push(Vt.EditorSelection.range(l[0].start,l[l.length-1].end))}C.cm.dispatch(C.cm.state.update({changes:A,selection:Vt.EditorSelection.create(Q)}))}var dF=WU(Ci(),1);dF.default.DIFF_DELETE=-1;dF.default.DIFF_INSERT=1;dF.default.DIFF_EQUAL=0;function E0(C,I){let g=new dF.default,B=g.diff_main(C,I);g.diff_cleanupSemantic(B);let F=0,Q=[],A=null;for(let[U,l]of B)U===dF.default.DIFF_EQUAL?(A&&(Q.push(A),A=null),F+=l.length):U===dF.default.DIFF_INSERT?A?A.insert?(Q.push(A),A={from:F,to:F,insert:l}):A.insert+=l:A={from:F,to:F,insert:l}:U===dF.default.DIFF_DELETE&&(A?(Q.push(A),A={from:F,to:F+l.length,insert:""}):A={from:F,to:F+l.length,insert:""},F+=l.length);return A&&Q.push(A),Q}function Bi(C,I){let g=E0(C,I),B="",F=0;for(let Q of g)Q.from>F&&(B+=C.slice(F,Q.from)),Q.insert&&(B+=NG(Q.insert,C.slice(Q.from,Q.to))),F=Q.to;return Ft in s?Zo(s,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[t]=e,Xs=(s,t)=>{for(var e in t||(t={}))gf.call(t,e)&&Qo(s,e,t[e]);if(pf)for(var e of pf(t))fg.call(t,e)&&Qo(s,e,t[e]);return s};var ug=(s,t)=>()=>(t||s((t={exports:{}}).exports,t),t.exports);var cg=(s,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ag(t))!gf.call(s,n)&&n!==e&&Zo(s,n,{get:()=>t[n],enumerable:!(i=lg(t,n))||i.enumerable});return s};var dg=(s,t,e)=>(e=s!=null?og(hg(s)):{},cg(t||!s||!s.__esModule?Zo(e,"default",{value:s,enumerable:!0}):e,s));var N=(s,t,e)=>Qo(s,typeof t!="symbol"?t+"":t,e);var sg=ug((Ux,Bn)=>{var C=function(){this.Diff_Timeout=1,this.Diff_EditCost=4,this.Match_Threshold=.5,this.Match_Distance=1e3,this.Patch_DeleteThreshold=.5,this.Patch_Margin=4,this.Match_MaxBits=32},it=-1,st=1,W=0;C.Diff=function(s,t){return[s,t]};C.prototype.diff_main=function(s,t,e,i){typeof i=="undefined"&&(this.Diff_Timeout<=0?i=Number.MAX_VALUE:i=new Date().getTime()+this.Diff_Timeout*1e3);var n=i;if(s==null||t==null)throw new Error("Null input. (diff_main)");if(s==t)return s?[new C.Diff(W,s)]:[];typeof e=="undefined"&&(e=!0);var r=e,o=this.diff_commonPrefix(s,t),l=s.substring(0,o);s=s.substring(o),t=t.substring(o),o=this.diff_commonSuffix(s,t);var a=s.substring(s.length-o);s=s.substring(0,s.length-o),t=t.substring(0,t.length-o);var h=this.diff_compute_(s,t,r,n);return l&&h.unshift(new C.Diff(W,l)),a&&h.push(new C.Diff(W,a)),this.diff_cleanupMerge(h),h};C.prototype.diff_compute_=function(s,t,e,i){var n;if(!s)return[new C.Diff(st,t)];if(!t)return[new C.Diff(it,s)];var r=s.length>t.length?s:t,o=s.length>t.length?t:s,l=r.indexOf(o);if(l!=-1)return n=[new C.Diff(st,r.substring(0,l)),new C.Diff(W,o),new C.Diff(st,r.substring(l+o.length))],s.length>t.length&&(n[0][0]=n[2][0]=it),n;if(o.length==1)return[new C.Diff(it,s),new C.Diff(st,t)];var a=this.diff_halfMatch_(s,t);if(a){var h=a[0],f=a[1],u=a[2],c=a[3],d=a[4],p=this.diff_main(h,u,e,i),g=this.diff_main(f,c,e,i);return p.concat([new C.Diff(W,d)],g)}return e&&s.length>100&&t.length>100?this.diff_lineMode_(s,t,i):this.diff_bisect_(s,t,i)};C.prototype.diff_lineMode_=function(s,t,e){var i=this.diff_linesToChars_(s,t);s=i.chars1,t=i.chars2;var n=i.lineArray,r=this.diff_main(s,t,!1,e);this.diff_charsToLines_(r,n),this.diff_cleanupSemantic(r),r.push(new C.Diff(W,""));for(var o=0,l=0,a=0,h="",f="";o=1&&a>=1){r.splice(o-l-a,l+a),o=o-l-a;for(var u=this.diff_main(h,f,!1,e),c=u.length-1;c>=0;c--)r.splice(o,0,u[c]);o=o+u.length}a=0,l=0,h="",f="";break}o++}return r.pop(),r};C.prototype.diff_bisect_=function(s,t,e){for(var i=s.length,n=t.length,r=Math.ceil((i+n)/2),o=r,l=2*r,a=new Array(l),h=new Array(l),f=0;fe);b++){for(var w=-b+d;w<=b-p;w+=2){var y=o+w,v;w==-b||w!=b&&a[y-1]i)p+=2;else if(x>n)d+=2;else if(c){var S=o+u-w;if(S>=0&&S=k)return this.diff_bisectSplit_(s,t,v,x,e)}}}for(var P=-b+g;P<=b-m;P+=2){var S=o+P,k;P==-b||P!=b&&h[S-1]i)m+=2;else if(R>n)g+=2;else if(!c){var y=o+u-P;if(y>=0&&y=k)return this.diff_bisectSplit_(s,t,v,x,e)}}}}return[new C.Diff(it,s),new C.Diff(st,t)]};C.prototype.diff_bisectSplit_=function(s,t,e,i,n){var r=s.substring(0,e),o=t.substring(0,i),l=s.substring(e),a=t.substring(i),h=this.diff_main(r,o,!1,n),f=this.diff_main(l,a,!1,n);return h.concat(f)};C.prototype.diff_linesToChars_=function(s,t){var e=[],i={};e[0]="";function n(a){for(var h="",f=0,u=-1,c=e.length;ui?s=s.substring(e-i):et.length?s:t,i=s.length>t.length?t:s;if(e.length<4||i.length*2=p.length?[v,x,S,k,y]:null}var o=r(e,i,Math.ceil(e.length/4)),l=r(e,i,Math.ceil(e.length/2)),a;if(!o&&!l)return null;l?o?a=o[4].length>l[4].length?o:l:a=l:a=o;var h,f,u,c;s.length>t.length?(h=a[0],f=a[1],u=a[2],c=a[3]):(u=a[0],c=a[1],h=a[2],f=a[3]);var d=a[4];return[h,f,u,c,d]};C.prototype.diff_cleanupSemantic=function(s){for(var t=!1,e=[],i=0,n=null,r=0,o=0,l=0,a=0,h=0;r0?e[i-1]:-1,o=0,l=0,a=0,h=0,n=null,t=!0)),r++;for(t&&this.diff_cleanupMerge(s),this.diff_cleanupSemanticLossless(s),r=1;r=d?(c>=f.length/2||c>=u.length/2)&&(s.splice(r,0,new C.Diff(W,u.substring(0,c))),s[r-1][1]=f.substring(0,f.length-c),s[r+1][1]=u.substring(c),r++):(d>=f.length/2||d>=u.length/2)&&(s.splice(r,0,new C.Diff(W,f.substring(0,d))),s[r-1][0]=st,s[r-1][1]=u.substring(0,u.length-d),s[r+1][0]=it,s[r+1][1]=f.substring(d),r++),r++}r++}};C.prototype.diff_cleanupSemanticLossless=function(s){function t(d,p){if(!d||!p)return 6;var g=d.charAt(d.length-1),m=p.charAt(0),b=g.match(C.nonAlphaNumericRegex_),w=m.match(C.nonAlphaNumericRegex_),y=b&&g.match(C.whitespaceRegex_),v=w&&m.match(C.whitespaceRegex_),x=y&&g.match(C.linebreakRegex_),S=v&&m.match(C.linebreakRegex_),k=x&&d.match(C.blanklineEndRegex_),P=S&&p.match(C.blanklineStartRegex_);return k||P?5:x||S?4:b&&!y&&v?3:y||v?2:b||w?1:0}for(var e=1;e=u&&(u=c,a=i,h=n,f=r)}s[e-1][1]!=a&&(a?s[e-1][1]=a:(s.splice(e-1,1),e--),s[e][1]=h,f?s[e+1][1]=f:(s.splice(e+1,1),e--))}e++}};C.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;C.whitespaceRegex_=/\\s/;C.linebreakRegex_=/[\\r\\n]/;C.blanklineEndRegex_=/\\n\\r?\\n$/;C.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;C.prototype.diff_cleanupEfficiency=function(s){for(var t=!1,e=[],i=0,n=null,r=0,o=!1,l=!1,a=!1,h=!1;r0?e[i-1]:-1,a=h=!1),t=!0)),r++;t&&this.diff_cleanupMerge(s)};C.prototype.diff_cleanupMerge=function(s){s.push(new C.Diff(W,""));for(var t=0,e=0,i=0,n="",r="",o;t1?(e!==0&&i!==0&&(o=this.diff_commonPrefix(r,n),o!==0&&(t-e-i>0&&s[t-e-i-1][0]==W?s[t-e-i-1][1]+=r.substring(0,o):(s.splice(0,0,new C.Diff(W,r.substring(0,o))),t++),r=r.substring(o),n=n.substring(o)),o=this.diff_commonSuffix(r,n),o!==0&&(s[t][1]=r.substring(r.length-o)+s[t][1],r=r.substring(0,r.length-o),n=n.substring(0,n.length-o))),t-=e+i,s.splice(t,e+i),n.length&&(s.splice(t,0,new C.Diff(it,n)),t++),r.length&&(s.splice(t,0,new C.Diff(st,r)),t++),t++):t!==0&&s[t-1][0]==W?(s[t-1][1]+=s[t][1],s.splice(t,1)):t++,i=0,e=0,n="",r="";break}s[s.length-1][1]===""&&s.pop();var l=!1;for(t=1;tt));o++)n=e,r=i;return s.length!=o&&s[o][0]===it?r:r+(t-n)};C.prototype.diff_prettyHtml=function(s){for(var t=[],e=/&/g,i=//g,r=/\\n/g,o=0;o");switch(l){case st:t[o]=\'\'+h+"";break;case it:t[o]=\'\'+h+"";break;case W:t[o]=""+h+"";break}}return t.join("")};C.prototype.diff_text1=function(s){for(var t=[],e=0;ethis.Match_MaxBits)throw new Error("Pattern too long for this browser.");var i=this.match_alphabet_(t),n=this;function r(v,x){var S=v/t.length,k=Math.abs(e-x);return n.Match_Distance?S+k/n.Match_Distance:k?1:S}var o=this.Match_Threshold,l=s.indexOf(t,e);l!=-1&&(o=Math.min(r(0,l),o),l=s.lastIndexOf(t,e+t.length),l!=-1&&(o=Math.min(r(0,l),o)));var a=1<=p;b--){var w=i[s.charAt(b-1)];if(d===0?m[b]=(m[b+1]<<1|1)&w:m[b]=(m[b+1]<<1|1)&w|((c[b+1]|c[b])<<1|1)|c[b+1],m[b]&a){var y=r(d,b-1);if(y<=o)if(o=y,l=b-1,l>e)p=Math.max(1,2*e-l);else break}}if(r(d+1,e)>o)break;c=m}return l};C.prototype.match_alphabet_=function(s){for(var t={},e=0;e2&&(this.diff_cleanupSemantic(n),this.diff_cleanupEfficiency(n));else if(s&&typeof s=="object"&&typeof t=="undefined"&&typeof e=="undefined")n=s,i=this.diff_text1(n);else if(typeof s=="string"&&t&&typeof t=="object"&&typeof e=="undefined")i=s,n=t;else if(typeof s=="string"&&typeof t=="string"&&e&&typeof e=="object")i=s,n=e;else throw new Error("Unknown call format to patch_make.");if(n.length===0)return[];for(var r=[],o=new C.patch_obj,l=0,a=0,h=0,f=i,u=i,c=0;c=2*this.Patch_Margin&&l&&(this.patch_addContext_(o,f),r.push(o),o=new C.patch_obj,l=0,f=u,a=h);break}d!==st&&(a+=p.length),d!==it&&(h+=p.length)}return l&&(this.patch_addContext_(o,f),r.push(o)),r};C.prototype.patch_deepCopy=function(s){for(var t=[],e=0;ethis.Match_MaxBits?(a=this.match_main(t,l.substring(0,this.Match_MaxBits),o),a!=-1&&(h=this.match_main(t,l.substring(l.length-this.Match_MaxBits),o+l.length-this.Match_MaxBits),(h==-1||a>=h)&&(a=-1))):a=this.match_main(t,l,o),a==-1)n[r]=!1,i-=s[r].length2-s[r].length1;else{n[r]=!0,i=a-o;var f;if(h==-1?f=t.substring(a,a+l.length):f=t.substring(a,h+this.Match_MaxBits),l==f)t=t.substring(0,a)+this.diff_text2(s[r].diffs)+t.substring(a+l.length);else{var u=this.diff_main(l,f,!1);if(l.length>this.Match_MaxBits&&this.diff_levenshtein(u)/l.length>this.Patch_DeleteThreshold)n[r]=!1;else{this.diff_cleanupSemanticLossless(u);for(var c=0,d,p=0;pr[0][1].length){var o=t-r[0][1].length;r[0][1]=e.substring(r[0][1].length)+r[0][1],n.start1-=o,n.start2-=o,n.length1+=o,n.length2+=o}if(n=s[s.length-1],r=n.diffs,r.length==0||r[r.length-1][0]!=W)r.push(new C.Diff(W,e)),n.length1+=t,n.length2+=t;else if(t>r[r.length-1][1].length){var o=t-r[r.length-1][1].length;r[r.length-1][1]+=e.substring(0,o),n.length1+=o,n.length2+=o}return e};C.prototype.patch_splitMax=function(s){for(var t=this.Match_MaxBits,e=0;e2*t?(l.length1+=f.length,n+=f.length,a=!1,l.diffs.push(new C.Diff(h,f)),i.diffs.shift()):(f=f.substring(0,t-l.length1-this.Patch_Margin),l.length1+=f.length,n+=f.length,h===W?(l.length2+=f.length,r+=f.length):a=!1,l.diffs.push(new C.Diff(h,f)),f==i.diffs[0][1]?i.diffs.shift():i.diffs[0][1]=i.diffs[0][1].substring(f.length))}o=this.diff_text2(l.diffs),o=o.substring(o.length-this.Patch_Margin);var u=this.diff_text1(i.diffs).substring(0,this.Patch_Margin);u!==""&&(l.length1+=u.length,l.length2+=u.length,l.diffs.length!==0&&l.diffs[l.diffs.length-1][0]===W?l.diffs[l.diffs.length-1][1]+=u:l.diffs.push(new C.Diff(W,u))),a||s.splice(++e,0,l)}}};C.prototype.patch_toText=function(s){for(var t=[],e=0;e","~~}"],highlight:["{==","==}"],comment:["{>>","<<}"]};var Js={a:"author",t:"time",d:"done",s:"style",c:"color"},ne=class{constructor(t,e,i,n,r,o){this.from=t;this.to=e;this.type=i;this.repr=n;this.text=r;this.metadata=o;N(this,"fields",{});N(this,"replies",[]);if(o!==void 0){let l=o-t,a=r.slice(3,l);this.text=r.slice(0,3)+r.slice(l+2);try{this.fields=JSON.parse(a);for(let h in this.fields)h in Js&&(this.fields[Js[h]]=this.fields[h],delete this.fields[h])}catch(h){this.fields={}}}}get base_range(){return this}get full_thread(){return[this,...this.replies]}get thread(){return[...this.replies]}get length(){return this.to-this.from-6}get full_text(){return this.text+this.replies.map(t=>t.text).join("")}get range_start(){return this.metadata?this.metadata+2:this.from+3}get range_front(){return this.metadata?this.metadata-1:this.from}get full_range_front(){return this.base_range.from}get full_range_back(){return this.base_range.replies.length?this.base_range.replies[this.base_range.replies.length-1].to:this.to}range_type(t,e){return this.type}remove_metadata(){return this.metadata?[{from:this.from+3,to:this.metadata+2,insert:""}]:[]}delete_metadata(t){return t in Js&&(t=Js[t]),t in this.fields&&(delete this.fields[t],Object.keys(this.fields).length===0?this.remove_metadata():this.set_metadata(this.fields)),[]}add_metadata(t,e){return this.fields[t]=e,this.set_metadata(this.fields)}set_metadata(t){return this.fields=t,this.metadata!==void 0?[{from:this.from+3,to:this.metadata,insert:JSON.stringify(t)}]:[{from:this.from+3,to:this.from+3,insert:JSON.stringify(t)+"@@"}]}has_comment(t){return this.thread.includes(t)}copy(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}equals(t){return this.type===t.type&&this.from===t.from&&this.to===t.to&&this.replies.length===t.replies.length&&this.full_text===t.full_text}left_adjacent(t){return this.from===t.to}right_adjacent(t){return this.to===t.from}part_is_empty(t){return!1}empty(){return this.to-this.from===6}unwrap(){return this.text.slice(3,-3)}unwrap_bracket(t=!1){return t?this.text.slice(3):this.text.slice(0,-3)}unwrap_parts(){return[this.unwrap()]}unwrap_slice(t,e){return t-=this.range_front,e-=this.range_front,e<=0||t===e?"":this.text.slice(Math.max(3,t),Math.min(this.text.length-3,e))}partially_in_range(t,e){return!(t>this.to||ethis.full_range_back||ee:this.from<=t&&this.to>=e}part_encloses_range(t,e,i){return this.encloses_range(t,e)}accept(t=!0){return this.text}reject(t=!0){return this.text}touches(t){return this.from===t||this.to===t}cursor_inside(t){return this.from<=t&&t<=this.to}cursor_before_range(t){return tthis.to}cursor_move_inside(t,e=!1){return Math.min(Math.max(e&&this.metadata?this.metadata+2:this.from+3,t),this.to-3)}cursor_pass_syntax(t,e,i=!1){return e?(this.touches_left_bracket(t,!0,!1,i)&&(t=i&&this.metadata?this.metadata+2:this.from+3),this.touches_right_bracket(t,!1,!0)&&(t=this.to)):(this.touches_right_bracket(t,!0,!1)&&(t=this.to-3),this.touches_left_bracket(t,!1,!0,i)&&(t=this.from)),t}cursor_move_through(t,e,i){return i=="unchanged"||!this.cursor_inside(t)||(i=="ignore_completely"?t=e?this.to:this.from:t=this.cursor_pass_syntax(t,e,i=="ignore_metadata")),t}touches_left_bracket(t,e=!1,i=!1,n=!1){return t+(e?0:1)>=this.from&&t+(i?0:1)<=(n&&this.metadata?this.metadata+2:this.from+3)}touches_separator(t,e=!1,i=!1){return!1}touches_right_bracket(t,e=!1,i=!1){return t-(i?0:1)>=this.to-3&&t-(e?0:1)<=this.to}touches_bracket(t,e,i=!1,n=!1){return e?this.touches_left_bracket(t,i,n):this.touches_right_bracket(t,i,n)}postprocess(t=!0,e=0,i="div",n=null,r){let o=r!=null?r:this.text;return!r&&t&&(this.to>=o.length&&!o.endsWith(Ft[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap()),`<${i} class=\'cmtr-${this.repr.toLowerCase()}\'>${o}`}apply_offset(t){this.from+=t,this.to+=t,this.metadata!==void 0&&(this.metadata+=t)}split_range(t){return[this.text.slice(-3),this.text.slice(0,3)+(this.metadata?JSON.stringify(this.fields)+"@@":"")]}};var Ai=class extends ne{constructor(t,e,i,n){super(t,e,"addition","Addition",i,n)}accept(){return this.unwrap()}reject(){return""}postprocess(t=!0,e=0,i="div",n=null,r){let o=r!=null?r:this.text;!r&&t&&(this.to>=o.length&&!o.endsWith(Ft[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap());let l="cmtr-preview";return e===0?l+=" cmtr-addition":e===2&&(o=""),`<${i} class=\'${l}\'>${o}`}};var Yi=class extends ne{constructor(e,i,n,r){super(e,i,"comment","Comment",n,r);N(this,"reply_depth",0);N(this,"attached_comment",null)}get base_range(){return this.attached_comment||this}get thread(){return this.attached_comment?[...this.attached_comment.thread]:[this,...this.replies]}accept(e=!0){return e?"":this.unwrap()}reject(e=!0){return e?"":this.unwrap()}clear_references(){this.attached_comment=null,this.reply_depth=0}add_reply(e){this.attach_to_range(e.type==="comment"?e.base_range:e)}attach_to_range(e){e.replies.push(this),this.reply_depth=e.replies.length-(e.type==="comment"?0:1),this.attached_comment=e}};var Xi=class extends ne{constructor(t,e,i,n){super(t,e,"deletion","Deletion",i,n)}accept(){return""}reject(){return this.unwrap()}postprocess(t=!0,e=0,i="div",n=null,r){let o=r!=null?r:this.text;!r&&t&&(this.to>=o.length&&!o.endsWith(Ft[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap());let l="cmtr-preview";return e===0?l+=" cmtr-deletion":e===1&&(o=""),`<${i} class=\'${l}\'>${o}`}};var Ji=class extends ne{constructor(t,e,i,n){super(t,e,"highlight","Highlight",i,n)}};var Qi=class extends ne{constructor(e,i,n,r,o){super(e,n,"substitution","Substitution",r,o);this.middle=i}get length(){return this.to-this.from-8}get char_middle(){return this.middle-this.range_front}range_type(e,i){return i<=this.middle+2?"deletion":e>=this.middle?"addition":"substitution"}unwrap(){return this.text.slice(3,this.char_middle)+this.text.slice(this.char_middle+2,-3)}unwrap_parts(){return[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice_parts_inverted(e,i){return e-=this.range_front,i-=this.range_front,e=Math.max(0,e),i<=0?this.unwrap_parts():i<=this.char_middle?[this.text.slice(3,e)+this.text.slice(i,this.char_middle),this.text.slice(this.char_middle+2,-3)]:e>=this.char_middle+2?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,e)+this.text.slice(i,-3)]:[this.text.slice(3,e),this.text.slice(i,-3)]}unwrap_parts_bracket(e,i=0){return e?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2)]:[this.text.slice(0,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice(e,i){return e-=this.range_front,i-=this.range_front,i<=0||e===i?"":e>=this.char_middle?this.text.slice(Math.max(this.char_middle+2,e),Math.min(this.text.length-3,i)):i<=this.char_middle?this.text.slice(Math.max(3,e),Math.min(this.char_middle,i)):this.text.slice(Math.max(3,e),this.char_middle)+this.text.slice(this.char_middle+2,Math.min(this.text.length-3,i))}accept(){return this.unwrap_parts()[1]}reject(){return this.unwrap_parts()[0]}touches_separator(e,i=!1,n=!1){return e+(i?1:0)>=this.middle&&e-(n?0:1)<=this.middle+2}contains_separator(e,i){return e<=this.middle+2&&i>=this.middle}contains_part(e,i,n=!0){return n?ithis.middle+2?!1:void 0:i<=this.middle?!0:e>=this.middle+2?!1:void 0}cursor_pass_syntax(e,i,n=!1){return i?(this.touches_left_bracket(e,!0,!1,n)&&(e=n&&this.metadata?this.metadata+2:this.from+3),this.touches_separator(e,!1,!0)&&(e=this.middle+2),this.touches_right_bracket(e,!1,!0)&&(e=this.to)):(this.touches_right_bracket(e,!0,!1)&&(e=this.to-3),this.touches_separator(e,!1,!0)&&(e=this.middle),this.touches_left_bracket(e,!1,!0,n)&&(e=this.from)),e}part_encloses_range(e,i,n){return n?this.from<=e&&i<=this.middle+2:this.middle<=e&&i<=this.to}empty(){return this.from+3===this.middle&&this.middle+2===this.to-3}part_is_empty(e){return e?this.from+3===this.middle:this.middle+2===this.to-3}postprocess(e=!0,i=0,n="div",r=null,o){let l=o!=null?o:this.text,a=[l];!o&&e&&(this.to>=l.length&&!l.endsWith(Ft.substitution[2])?a=this.unwrap_parts_bracket(!0):this.from<=0&&!l.startsWith(Ft.substitution[0])?a=this.unwrap_parts_bracket(!1):a=this.unwrap_parts());let h="cmtr-preview";return a.length===1&&(a[+r]=a[0],a[+!r]=""),l="",i===0?(a[0].length&&(l+=`<${n} class=\'${h} cmtr-deletion\'>${a[0]}`),a[1].length&&(l+=`<${n} class=\'${h} cmtr-addition\'>${a[1]}`)):i===1?a[1].length&&(l+=`<${n} class=\'${h}\'>${a[1]}`):a[0].length&&(l+=`<${n} class=\'${h}\'>${a[0]}`),l}apply_offset(e){this.from+=e,this.middle+=e,this.to+=e,this.metadata!==void 0&&(this.metadata+=e)}split_range(e){let i=super.split_range(e);return e<=this.middle?i[0]=Ft.substitution[1]+i[0]:i[1]=i[1]+Ft.substitution[1],i}cursor_move_inside(e,i=!1){return e=super.cursor_move_inside(e,i),e==this.middle+1&&(e=this.middle+2),e}};var el=[],vf=[];(()=>{let s="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(t=>t?parseInt(t,36):1);for(let t=0,e=0;t>1;if(s=vf[i])t=i+1;else return!0;if(t==e)return!1}}function bf(s){return s>=127462&&s<=127487}var wf=8205;function kf(s,t,e=!0,i=!0){return(e?xf:gg)(s,t,i)}function xf(s,t,e){if(t==s.length)return t;t&&Sf(s.charCodeAt(t))&&Cf(s.charCodeAt(t-1))&&t--;let i=tl(s,t);for(t+=yf(i);t=0&&bf(tl(s,o));)r++,o-=2;if(r%2==0)break;t+=2}else break}return t}function gg(s,t,e){for(;t>0;){let i=xf(s,t-2,e);if(i=56320&&s<57344}function Cf(s){return s>=55296&&s<56320}function yf(s){return s<65536?1:2}var $=class s{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,i){[t,e]=sn(this,t,e);let n=[];return this.decompose(0,t,n,2),i.length&&i.decompose(0,i.length,n,3),this.decompose(e,this.length,n,1),tn.from(n,this.length-(e-t)+i.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=sn(this,t,e);let i=[];return this.decompose(t,e,i,0),tn.from(i,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),n=new _i(this),r=new _i(t);for(let o=e,l=e;;){if(n.next(o),r.next(o),o=0,n.lineBreak!=r.lineBreak||n.done!=r.done||n.value!=r.value)return!1;if(l+=n.value.length,n.done||l>=i)return!0}}iter(t=1){return new _i(this,t)}iterRange(t,e=this.length){return new ir(this,t,e)}iterLines(t,e){let i;if(t==null)i=this.iter();else{e==null&&(e=this.lines+1);let n=this.line(t).from;i=this.iterRange(n,Math.max(n,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new nr(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(t){if(t.length==0)throw new RangeError("A document must have at least one line");return t.length==1&&!t[0]?s.empty:t.length<=32?new $t(t):tn.from($t.split(t,[]))}},$t=class s extends ${constructor(t,e=mg(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,n){for(let r=0;;r++){let o=this.text[r],l=n+o.length;if((e?i:l)>=t)return new nl(n,l,i,o);n=l+1,i++}}decompose(t,e,i,n){let r=t<=0&&e>=this.length?this:new s(Mf(this.text,t,e),Math.min(e,this.length)-Math.max(0,t));if(n&1){let o=i.pop(),l=er(r.text,o.text.slice(),0,r.length);if(l.length<=32)i.push(new s(l,o.length+r.length));else{let a=l.length>>1;i.push(new s(l.slice(0,a)),new s(l.slice(a)))}}else i.push(r)}replace(t,e,i){if(!(i instanceof s))return super.replace(t,e,i);[t,e]=sn(this,t,e);let n=er(this.text,er(i.text,Mf(this.text,0,t)),e),r=this.length+i.length-(e-t);return n.length<=32?new s(n,r):tn.from(s.split(n,[]),r)}sliceString(t,e=this.length,i=`\n`){[t,e]=sn(this,t,e);let n="";for(let r=0,o=0;r<=e&&ot&&o&&(n+=i),tr&&(n+=l.slice(Math.max(0,t-r),e-r)),r=a+1}return n}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,e){let i=[],n=-1;for(let r of t)i.push(r),n+=r.length+1,i.length==32&&(e.push(new s(i,n)),i=[],n=-1);return n>-1&&e.push(new s(i,n)),e}},tn=class s extends ${constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let i of t)this.lines+=i.lines}lineInner(t,e,i,n){for(let r=0;;r++){let o=this.children[r],l=n+o.length,a=i+o.lines-1;if((e?a:l)>=t)return o.lineInner(t,e,i,n);n=l+1,i=a+1}}decompose(t,e,i,n){for(let r=0,o=0;o<=e&&r=o){let h=n&((o<=t?1:0)|(a>=e?2:0));o>=t&&a<=e&&!h?i.push(l):l.decompose(t-o,e-o,i,h)}o=a+1}}replace(t,e,i){if([t,e]=sn(this,t,e),i.lines=r&&e<=l){let a=o.replace(t-r,e-r,i),h=this.lines-o.lines+a.lines;if(a.lines>4&&a.lines>h>>6){let f=this.children.slice();return f[n]=a,new s(f,this.length-(e-t)+i.length)}return super.replace(r,l,a)}r=l+1}return super.replace(t,e,i)}sliceString(t,e=this.length,i=`\n`){[t,e]=sn(this,t,e);let n="";for(let r=0,o=0;rt&&r&&(n+=i),to&&(n+=l.sliceString(t-o,e-o,i)),o=a+1}return n}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof s))return 0;let i=0,[n,r,o,l]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;n+=e,r+=e){if(n==o||r==l)return i;let a=this.children[n],h=t.children[r];if(a!=h)return i+a.scanIdentical(h,e);i+=a.length+1}}static from(t,e=t.reduce((i,n)=>i+n.length+1,-1)){let i=0;for(let d of t)i+=d.lines;if(i<32){let d=[];for(let p of t)p.flatten(d);return new $t(d,e)}let n=Math.max(32,i>>5),r=n<<1,o=n>>1,l=[],a=0,h=-1,f=[];function u(d){let p;if(d.lines>r&&d instanceof s)for(let g of d.children)u(g);else d.lines>o&&(a>o||!a)?(c(),l.push(d)):d instanceof $t&&a&&(p=f[f.length-1])instanceof $t&&d.lines+p.lines<=32?(a+=d.lines,h+=d.length+1,f[f.length-1]=new $t(p.text.concat(d.text),p.length+1+d.length)):(a+d.lines>n&&c(),a+=d.lines,h+=d.length+1,f.push(d))}function c(){a!=0&&(l.push(f.length==1?f[0]:s.from(f,h)),h=-1,a=f.length=0)}for(let d of t)u(d);return c(),l.length==1?l[0]:new s(l,e)}};$.empty=new $t([""],0);function mg(s){let t=-1;for(let e of s)t+=e.length+1;return t}function er(s,t,e=0,i=1e9){for(let n=0,r=0,o=!0;r=e&&(a>i&&(l=l.slice(0,i-n)),n0?1:(t instanceof $t?t.text.length:t.children.length)<<1]}nextInner(t,e){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,n=this.nodes[i],r=this.offsets[i],o=r>>1,l=n instanceof $t?n.text.length:n.children.length;if(o==(e>0?l:0)){if(i==0)return this.done=!0,this.value="",this;e>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((r&1)==(e>0?0:1)){if(this.offsets[i]+=e,t==0)return this.lineBreak=!0,this.value=`\n`,this;t--}else if(n instanceof $t){let a=n.text[o+(e<0?-1:0)];if(this.offsets[i]+=e,a.length>Math.max(0,t))return this.value=t==0?a:e>0?a.slice(t):a.slice(0,a.length-t),this;t-=a.length}else{let a=n.children[o+(e<0?-1:0)];t>a.length?(t-=a.length,this.offsets[i]+=e):(e<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(e>0?1:(a instanceof $t?a.text.length:a.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}},ir=class{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new _i(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:n}=this.cursor.next(t);return this.pos+=(n.length+t)*e,this.value=n.length<=i?n:e<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},nr=class{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:n}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol!="undefined"&&($.prototype[Symbol.iterator]=function(){return this.iter()},_i.prototype[Symbol.iterator]=ir.prototype[Symbol.iterator]=nr.prototype[Symbol.iterator]=function(){return this});var nl=class{constructor(t,e,i,n){this.from=t,this.to=e,this.number=i,this.text=n}get length(){return this.to-this.from}};function sn(s,t,e){return t=Math.max(0,Math.min(s.length,t)),[t,Math.max(t,Math.min(s.length,e))]}function Se(s,t,e=!0,i=!0){return kf(s,t,e,i)}function bg(s){return s>=56320&&s<57344}function wg(s){return s>=55296&&s<56320}function Ef(s,t){let e=s.charCodeAt(t);if(!wg(e)||t+1==s.length)return e;let i=s.charCodeAt(t+1);return bg(i)?(e-55296<<10)+(i-56320)+65536:e}function Df(s){return s<65536?1:2}var sl=/\\r\\n?|\\n/,Vt=function(s){return s[s.Simple=0]="Simple",s[s.TrackDel=1]="TrackDel",s[s.TrackBefore=2]="TrackBefore",s[s.TrackAfter=3]="TrackAfter",s}(Vt||(Vt={})),Ei=class s{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;et)return r+(t-n);r+=l}else{if(i!=Vt.Simple&&h>=t&&(i==Vt.TrackDel&&nt||i==Vt.TrackBefore&&nt))return null;if(h>t||h==t&&e<0&&!l)return t==n||e<0?r:r+a;r+=a}n=h}if(t>n)throw new RangeError(`Position ${t} is out of range for changeset of length ${n}`);return r}touchesRange(t,e=t){for(let i=0,n=0;i=0&&n<=e&&l>=t)return ne?"cover":!0;n=l}return!1}toString(){let t="";for(let e=0;e=0?":"+n:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new s(t)}static create(t){return new s(t)}},Kt=class s extends Ei{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return rl(this,(e,i,n,r,o)=>t=t.replace(n,n+(i-e),o),!1),t}mapDesc(t,e=!1){return ol(this,t,e,!0)}invert(t){let e=this.sections.slice(),i=[];for(let n=0,r=0;n=0){e[n]=l,e[n+1]=o;let a=n>>1;for(;i.length0&&ai(i,e,r.text),r.forward(f),l+=f}let h=t[o++];for(;l>1].toJSON()))}return t}static of(t,e,i){let n=[],r=[],o=0,l=null;function a(f=!1){if(!f&&!n.length)return;oc||u<0||c>e)throw new RangeError(`Invalid change range ${u} to ${c} (in doc of length ${e})`);let p=d?typeof d=="string"?$.of(d.split(i||sl)):d:$.empty,g=p.length;if(u==c&&g==0)return;uo&&Et(n,u-o,-1),Et(n,c-u,g),ai(r,n,p),o=c}}return h(t),a(!l),l}static empty(t){return new s(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw new RangeError("Invalid JSON representation of ChangeSet");let e=[],i=[];for(let n=0;nl&&typeof o!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(r.length==1)e.push(r[0],0);else{for(;i.length=0&&e<=0&&e==s[n+1]?s[n]+=t:n>=0&&t==0&&s[n]==0?s[n+1]+=e:i?(s[n]+=t,s[n+1]+=e):s.push(t,e)}function ai(s,t,e){if(e.length==0)return;let i=t.length-2>>1;if(i>1])),!(e||o==s.sections.length||s.sections[o+1]<0);)l=s.sections[o++],a=s.sections[o++];t(n,h,r,f,u),n=h,r=f}}}function ol(s,t,e,i=!1){let n=[],r=i?[]:null,o=new Di(s),l=new Di(t);for(let a=-1;;){if(o.done&&l.len||l.done&&o.len)throw new Error("Mismatched change set lengths");if(o.ins==-1&&l.ins==-1){let h=Math.min(o.len,l.len);Et(n,h,-1),o.forward(h),l.forward(h)}else if(l.ins>=0&&(o.ins<0||a==o.i||o.off==0&&(l.len=0&&a=0){let h=0,f=o.len;for(;f;)if(l.ins==-1){let u=Math.min(f,l.len);h+=u,f-=u,l.forward(u)}else if(l.ins==0&&l.lena||o.ins>=0&&o.len>a)&&(l||i.length>h),r.forward2(a),o.forward(a)}}}}var Di=class{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i>1;return e>=t.length?$.empty:t[e]}textBit(t){let{inserted:e}=this.set,i=this.i-2>>1;return i>=e.length&&!t?$.empty:e[i].slice(this.off,t==null?void 0:this.off+t)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){this.ins==-1?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}},Zi=class s{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let t=this.flags&7;return t==7?null:t}get goalColumn(){let t=this.flags>>6;return t==16777215?void 0:t}map(t,e=-1){let i,n;return this.empty?i=n=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),n=t.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new s(i,n,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return B.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return B.range(this.anchor,i)}eq(t,e=!1){return this.anchor==t.anchor&&this.head==t.head&&(!e||!this.empty||this.assoc==t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return B.range(t.anchor,t.head)}static create(t,e,i){return new s(t,e,i)}},B=class s{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:s.create(this.ranges.map(i=>i.map(t,e)),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;it.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!="number"||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new s(t.ranges.map(e=>Zi.fromJSON(e)),t.main)}static single(t,e=t){return new s([s.range(t,e)],0)}static create(t,e=0){if(t.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;nt?8:0)|r)}static normalized(t,e=0){let i=t[e];t.sort((n,r)=>n.from-r.from),e=t.indexOf(i);for(let n=1;nr.head?s.range(a,l):s.range(l,a))}}return new s(t,e)}};function Pf(s,t){for(let e of s.ranges)if(e.to>t)throw new RangeError("Selection points outside of document")}var ml=0,L=class s{constructor(t,e,i,n,r){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=n,this.id=ml++,this.default=t([]),this.extensions=typeof r=="function"?r(this):r}get reader(){return this}static define(t={}){return new s(t.combine||(e=>e),t.compareInput||((e,i)=>e===i),t.compare||(t.combine?(e,i)=>e===i:bl),!!t.static,t.enables)}of(t){return new en([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new en(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new en(t,this,2,e)}from(t,e){return e||(e=i=>i),this.compute([t],i=>e(i.field(t)))}};function bl(s,t){return s==t||s.length==t.length&&s.every((e,i)=>e===t[i])}var en=class{constructor(t,e,i,n){this.dependencies=t,this.facet=e,this.type=i,this.value=n,this.id=ml++}dynamicSlot(t){var e;let i=this.value,n=this.facet.compareInput,r=this.id,o=t[r]>>1,l=this.type==2,a=!1,h=!1,f=[];for(let u of this.dependencies)u=="doc"?a=!0:u=="selection"?h=!0:(((e=t[u.id])!==null&&e!==void 0?e:1)&1)==0&&f.push(t[u.id]);return{create(u){return u.values[o]=i(u),1},update(u,c){if(a&&c.docChanged||h&&(c.docChanged||c.selection)||ll(u,f)){let d=i(u);if(l?!Af(d,u.values[o],n):!n(d,u.values[o]))return u.values[o]=d,1}return 0},reconfigure:(u,c)=>{let d,p=c.config.address[r];if(p!=null){let g=or(c,p);if(this.dependencies.every(m=>m instanceof L?c.facet(m)===u.facet(m):m instanceof Ct?c.field(m,!1)==u.field(m,!1):!0)||(l?Af(d=i(u),g,n):n(d=i(u),g)))return u.values[o]=g,0}else d=i(u);return u.values[o]=d,1}}}};function Af(s,t,e){if(s.length!=t.length)return!1;for(let i=0;is[a.id]),n=e.map(a=>a.type),r=i.filter(a=>!(a&1)),o=s[t.id]>>1;function l(a){let h=[];for(let f=0;fi===n),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(Qs).find(i=>i.field==this);return((e==null?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:i=>(i.values[e]=this.create(i),1),update:(i,n)=>{let r=i.values[e],o=this.updateF(r,n);return this.compareF(r,o)?0:(i.values[e]=o,1)},reconfigure:(i,n)=>{let r=i.facet(Qs),o=n.facet(Qs),l;return(l=r.find(a=>a.field==this))&&l!=o.find(a=>a.field==this)?(i.values[e]=l.create(i),1):n.config.address[this.id]!=null?(i.values[e]=n.field(this),0):(i.values[e]=this.create(i),1)}}}init(t){return[this,Qs.of({field:this,create:t})]}get extension(){return this}},Ti={lowest:4,low:3,default:2,high:1,highest:0};function Vn(s){return t=>new sr(t,s)}var on={highest:Vn(Ti.highest),high:Vn(Ti.high),default:Vn(Ti.default),low:Vn(Ti.low),lowest:Vn(Ti.lowest)},sr=class{constructor(t,e){this.inner=t,this.prec=e}},se=class s{of(t){return new Wn(this,t)}reconfigure(t){return s.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}},Wn=class{constructor(t,e){this.compartment=t,this.inner=e}},rr=class s{constructor(t,e,i,n,r,o){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=n,this.staticValues=r,this.facets=o,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(t,e,i){let n=[],r=Object.create(null),o=new Map;for(let c of vg(t,e,o))c instanceof Ct?n.push(c):(r[c.facet.id]||(r[c.facet.id]=[])).push(c);let l=Object.create(null),a=[],h=[];for(let c of n)l[c.id]=h.length<<1,h.push(d=>c.slot(d));let f=i==null?void 0:i.config.facets;for(let c in r){let d=r[c],p=d[0].facet,g=f&&f[c]||[];if(d.every(m=>m.type==0))if(l[p.id]=a.length<<1|1,bl(g,d))a.push(i.facet(p));else{let m=p.combine(d.map(b=>b.value));a.push(i&&p.compare(m,i.facet(p))?i.facet(p):m)}else{for(let m of d)m.type==0?(l[m.id]=a.length<<1|1,a.push(m.value)):(l[m.id]=h.length<<1,h.push(b=>m.dynamicSlot(b)));l[p.id]=h.length<<1,h.push(m=>yg(m,p,d))}}let u=h.map(c=>c(l));return new s(t,o,u,l,a,r)}};function vg(s,t,e){let i=[[],[],[],[],[]],n=new Map;function r(o,l){let a=n.get(o);if(a!=null){if(a<=l)return;let h=i[a].indexOf(o);h>-1&&i[a].splice(h,1),o instanceof Wn&&e.delete(o.compartment)}if(n.set(o,l),Array.isArray(o))for(let h of o)r(h,l);else if(o instanceof Wn){if(e.has(o.compartment))throw new RangeError("Duplicate use of compartment in extensions");let h=t.get(o.compartment)||o.inner;e.set(o.compartment,h),r(h,l)}else if(o instanceof sr)r(o.inner,o.prec);else if(o instanceof Ct)i[l].push(o),o.provides&&r(o.provides,l);else if(o instanceof en)i[l].push(o),o.facet.extensions&&r(o.facet.extensions,Ti.default);else{let h=o.extension;if(!h)throw new Error(`Unrecognized extension value in extension set (${o}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(h,l)}}return r(s,Ti.default),i.reduce((o,l)=>o.concat(l))}function zn(s,t){if(t&1)return 2;let e=t>>1,i=s.status[e];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;s.status[e]=4;let n=s.computeSlot(s,s.config.dynamicSlots[e]);return s.status[e]=2|n}function or(s,t){return t&1?s.config.staticValues[t>>1]:s.values[t>>1]}var If=L.define(),al=L.define({combine:s=>s.some(t=>t),static:!0}),Nf=L.define({combine:s=>s.length?s[0]:void 0,static:!0}),Bf=L.define(),Lf=L.define(),Hf=L.define(),Ff=L.define({combine:s=>s.length?s[0]:!1}),Mt=class{constructor(t,e){this.type=t,this.value=e}static define(){return new hl}},hl=class{of(t){return new Mt(this,t)}},fl=class{constructor(t){this.map=t}of(t){return new ot(this,t)}},ot=class s{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return e===void 0?void 0:e==this.value?this:new s(this.type,e)}is(t){return this.type==t}static define(t={}){return new fl(t.map||(e=>e))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let n of t){let r=n.map(e);r&&i.push(r)}return i}};ot.reconfigure=ot.define();ot.appendConfig=ot.define();var zt=class s{constructor(t,e,i,n,r,o){this.startState=t,this.changes=e,this.selection=i,this.effects=n,this.annotations=r,this.scrollIntoView=o,this._doc=null,this._state=null,i&&Pf(i,e.newLength),r.some(l=>l.type==s.time)||(this.annotations=r.concat(s.time.of(Date.now())))}static create(t,e,i,n,r,o){return new s(t,e,i,n,r,o)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(s.userEvent);return!!(e&&(e==t||e.length>t.length&&e.slice(0,t.length)==t&&e[t.length]=="."))}};zt.time=Mt.define();zt.userEvent=Mt.define();zt.addToHistory=Mt.define();zt.remote=Mt.define();function kg(s,t){let e=[];for(let i=0,n=0;;){let r,o;if(i=s[i]))r=s[i++],o=s[i++];else if(n=0;n--){let r=i[n](s);r instanceof zt?s=r:Array.isArray(r)&&r.length==1&&r[0]instanceof zt?s=r[0]:s=zf(t,nn(r),!1)}return s}function Sg(s){let t=s.startState,e=t.facet(Hf),i=s;for(let n=e.length-1;n>=0;n--){let r=e[n](s);r&&Object.keys(r).length&&(i=Vf(i,ul(t,r,s.changes.newLength),!0))}return i==s?s:zt.create(t,s.changes,s.selection,i.effects,i.annotations,i.scrollIntoView)}var Cg=[];function nn(s){return s==null?Cg:Array.isArray(s)?s:[s]}var xe=function(s){return s[s.Word=0]="Word",s[s.Space=1]="Space",s[s.Other=2]="Other",s}(xe||(xe={})),Mg=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/,cl;try{cl=new RegExp("[\\\\p{Alphabetic}\\\\p{Number}_]","u")}catch(s){}function Ag(s){if(cl)return cl.test(s);for(let t=0;t"\\x80"&&(e.toUpperCase()!=e.toLowerCase()||Mg.test(e)))return!0}return!1}function Tg(s){return t=>{if(!/\\S/.test(t))return xe.Space;if(Ag(t))return xe.Word;for(let e=0;e-1)return xe.Word;return xe.Other}}var ut=class s{constructor(t,e,i,n,r,o){this.config=t,this.doc=e,this.selection=i,this.values=n,this.status=t.statusTemplate.slice(),this.computeSlot=r,o&&(o._state=this);for(let l=0;ln.set(h,a)),e=null),n.set(l.value.compartment,l.value.extension)):l.is(ot.reconfigure)?(e=null,i=l.value):l.is(ot.appendConfig)&&(e=null,i=nn(i).concat(l.value));let r;e?r=t.startState.values.slice():(e=rr.resolve(i,n,this),r=new s(e,this.doc,this.selection,e.dynamicSlots.map(()=>null),(a,h)=>h.reconfigure(a,this),null).values);let o=t.startState.facet(al)?t.newSelection:t.newSelection.asSingle();new s(e,t.newDoc,o,r,(l,a)=>a.update(l,t),t)}replaceSelection(t){return typeof t=="string"&&(t=this.toText(t)),this.changeByRange(e=>({changes:{from:e.from,to:e.to,insert:t},range:B.cursor(e.from+t.length)}))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),n=this.changes(i.changes),r=[i.range],o=nn(i.effects);for(let l=1;lo.spec.fromJSON(l,a)))}}return s.create({doc:t.doc,selection:B.fromJSON(t.selection),extensions:e.extensions?n.concat([e.extensions]):n})}static create(t={}){let e=rr.resolve(t.extensions||[],new Map),i=t.doc instanceof $?t.doc:$.of((t.doc||"").split(e.staticFacet(s.lineSeparator)||sl)),n=t.selection?t.selection instanceof B?t.selection:B.single(t.selection.anchor,t.selection.head):B.single(0);return Pf(n,i.length),e.staticFacet(al)||(n=n.asSingle()),new s(e,i,n,e.dynamicSlots.map(()=>null),(r,o)=>o.create(r),null)}get tabSize(){return this.facet(s.tabSize)}get lineBreak(){return this.facet(s.lineSeparator)||`\n`}get readOnly(){return this.facet(Ff)}phrase(t,...e){for(let i of this.facet(s.phrases))if(Object.prototype.hasOwnProperty.call(i,t)){t=i[t];break}return e.length&&(t=t.replace(/\\$(\\$|\\d*)/g,(i,n)=>{if(n=="$")return"$";let r=+(n||1);return!r||r>e.length?i:e[r-1]})),t}languageDataAt(t,e,i=-1){let n=[];for(let r of this.facet(If))for(let o of r(this,e,i))Object.prototype.hasOwnProperty.call(o,t)&&n.push(o[t]);return n}charCategorizer(t){return Tg(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:n}=this.doc.lineAt(t),r=this.charCategorizer(t),o=t-i,l=t-i;for(;o>0;){let a=Se(e,o,!1);if(r(e.slice(a,o))!=xe.Word)break;o=a}for(;ls.length?s[0]:4});ut.lineSeparator=Nf;ut.readOnly=Ff;ut.phrases=L.define({compare(s,t){let e=Object.keys(s),i=Object.keys(t);return e.length==i.length&&e.every(n=>s[n]==t[n])}});ut.languageData=If;ut.changeFilter=Bf;ut.transactionFilter=Lf;ut.transactionExtender=Hf;se.reconfigure=ot.define();var $e=class{eq(t){return this==t}range(t,e=t){return Gn.create(t,e,this)}};$e.prototype.startSide=$e.prototype.endSide=0;$e.prototype.point=!1;$e.prototype.mapMode=Vt.TrackDel;var Gn=class s{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(t,e,i){return new s(t,e,i)}};function dl(s,t){return s.from-t.from||s.value.startSide-t.value.startSide}var pl=class s{constructor(t,e,i,n){this.from=t,this.to=e,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,n=0){let r=i?this.to:this.from;for(let o=n,l=r.length;;){if(o==l)return o;let a=o+l>>1,h=r[a]-t||(i?this.value[a].endSide:this.value[a].startSide)-e;if(a==o)return h>=0?o:l;h>=0?l=a:o=a+1}}between(t,e,i,n){for(let r=this.findIndex(e,-1e9,!0),o=this.findIndex(i,1e9,!1,r);rd||c==d&&h.startSide>0&&h.endSide<=0)continue;(d-c||h.endSide-h.startSide)<0||(o<0&&(o=c),h.point&&(l=Math.max(l,d-c)),i.push(h),n.push(c-o),r.push(d-o))}return{mapped:i.length?new s(n,r,i,l):null,pos:o}}},Y=class s{constructor(t,e,i,n){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=n}static create(t,e,i,n){return new s(t,e,i,n)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:n=0,filterTo:r=this.length}=t,o=t.filter;if(e.length==0&&!o)return this;if(i&&(e=e.slice().sort(dl)),this.isEmpty)return e.length?s.of(e):this;let l=new lr(this,null,-1).goto(0),a=0,h=[],f=new rn;for(;l.value||a=0){let u=e[a++];f.addInner(u.from,u.to,u.value)||h.push(u)}else l.rangeIndex==1&&l.chunkIndexthis.chunkEnd(l.chunkIndex)||rl.to||r=r&&t<=r+o.length&&o.between(r,t-r,e-r,i)===!1)return}this.nextLayer.between(t,e,i)}}iter(t=0){return Un.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return Un.from(t).goto(e)}static compare(t,e,i,n,r=-1){let o=t.filter(u=>u.maxPoint>0||!u.isEmpty&&u.maxPoint>=r),l=e.filter(u=>u.maxPoint>0||!u.isEmpty&&u.maxPoint>=r),a=Tf(o,l,i),h=new Oi(o,a,r),f=new Oi(l,a,r);i.iterGaps((u,c,d)=>Of(h,u,f,c,d,n)),i.empty&&i.length==0&&Of(h,0,f,0,0,n)}static eq(t,e,i=0,n){n==null&&(n=999999999);let r=t.filter(f=>!f.isEmpty&&e.indexOf(f)<0),o=e.filter(f=>!f.isEmpty&&t.indexOf(f)<0);if(r.length!=o.length)return!1;if(!r.length)return!0;let l=Tf(r,o),a=new Oi(r,l,0).goto(i),h=new Oi(o,l,0).goto(i);for(;;){if(a.to!=h.to||!gl(a.active,h.active)||a.point&&(!h.point||!a.point.eq(h.point)))return!1;if(a.to>n)return!0;a.next(),h.next()}}static spans(t,e,i,n,r=-1){let o=new Oi(t,null,r).goto(e),l=e,a=o.openStart;for(;;){let h=Math.min(o.to,i);if(o.point){let f=o.activeForPoint(o.to),u=o.pointFroml&&(n.span(l,h,o.active,a),a=o.openEnd(h));if(o.to>i)return a+(o.point&&o.to>i?1:0);l=o.to,o.next()}}static of(t,e=!1){let i=new rn;for(let n of t instanceof Gn?[t]:e?Og(t):t)i.add(n.from,n.to,n.value);return i.finish()}static join(t){if(!t.length)return s.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let n=t[i];n!=s.empty;n=n.nextLayer)e=new s(n.chunkPos,n.chunk,e,Math.max(n.maxPoint,e.maxPoint));return e}};Y.empty=new Y([],[],null,-1);function Og(s){if(s.length>1)for(let t=s[0],e=1;e0)return s.slice().sort(dl);t=i}return s}Y.empty.nextLayer=Y.empty;var rn=class s{finishChunk(t){this.chunks.push(new pl(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new s)).add(t,e,i)}addInner(t,e,i){let n=t-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(Y.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return t;let e=Y.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}};function Tf(s,t,e){let i=new Map;for(let r of s)for(let o=0;o=this.minPoint)break}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new lr(o,e,i,r));return n.length==1?n[0]:new s(n)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let i=this.heap.length>>1;i>=0;i--)il(this.heap,i);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let i=this.heap.length>>1;i>=0;i--)il(this.heap,i);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),il(this.heap,0)}}};function il(s,t){for(let e=s[t];;){let i=(t<<1)+1;if(i>=s.length)break;let n=s[i];if(i+1=0&&(n=s[i+1],i++),e.compare(n)<0)break;s[i]=e,s[t]=n,t=i}}var Oi=class{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Un.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){Zs(this.active,t),Zs(this.activeTo,t),Zs(this.activeRank,t),this.minActive=_f(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:n,rank:r}=this.cursor;for(;e0;)e++;tr(this.active,e,i),tr(this.activeTo,e,n),tr(this.activeRank,e,r),t&&tr(t,e,this.cursor.from),this.minActive=_f(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>t){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&Zs(i,n)}else if(this.cursor.value)if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let r=this.cursor.value;if(!r.point)this.addActive(i),this.cursor.next();else if(e&&this.cursor.to==this.to&&this.cursor.from=0&&i[n]=0&&!(this.activeRank[i]t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}};function Of(s,t,e,i,n,r){s.goto(t),e.goto(i);let o=i+n,l=i,a=i-t;for(;;){let h=s.to+a-e.to,f=h||s.endSide-e.endSide,u=f<0?s.to+a:e.to,c=Math.min(u,o);if(s.point||e.point?s.point&&e.point&&(s.point==e.point||s.point.eq(e.point))&&gl(s.activeForPoint(s.to),e.activeForPoint(e.to))||r.comparePoint(l,c,s.point,e.point):c>l&&!gl(s.active,e.active)&&r.compareRange(l,c,s.active,e.active),u>o)break;(h||s.openEnd!=e.openEnd)&&r.boundChange&&r.boundChange(u),l=u,f<=0&&s.next(),f>=0&&e.next()}}function gl(s,t){if(s.length!=t.length)return!1;for(let e=0;e=t;i--)s[i+1]=s[i];s[t]=e}function _f(s,t){let e=-1,i=1e9;for(let n=0;n=t)return n;if(n==s.length)break;r+=s.charCodeAt(n)==9?e-r%e:1,n=Se(s,n)}return i===!0?-1:s.length}var _g=class wl{constructor(t,e){this.low=t,this.high=e}clone(){return new wl(this.low,this.high)}get max(){return this.clone()}less_than(t){return this.lowt.high?this.high:t.high)}output(){return[this.low,this.high]}static comparable_max(t,e){return t.merge(e)}static comparable_less_than(t,e){return ta&&([l,a]=[a,l]),this.item.key=new _g(l,a)}this.max=this.item.key?this.item.key.max:void 0}isNil(){return this.item.key===void 0&&this.item.value===void 0&&this.left===null&&this.right===null&&this.color===X}_value_less_than(t){return this.item.value&&t.item.value&&this.item.value.less_than?this.item.value.less_than(t.item.value):this.item.valuet++),t}get keys(){let t=[];return this.tree_walk(this.root,e=>t.push(e.item.key.output?e.item.key.output():e.item.key)),t}get values(){let t=[];return this.tree_walk(this.root,e=>t.push(e.item.value)),t}get items(){let t=[];return this.tree_walk(this.root,e=>t.push({key:e.item.key.output?e.item.key.output():e.item.key,value:e.item.value})),t}isEmpty(){return this.root==null||this.root===this.nil_node}clear(){this.root=null}insert(t,e=t){if(t===void 0)return;let i=new Ke(t,e,this.nil_node,this.nil_node,null,At);return this.tree_insert(i),this.recalc_max(i),i}exist(t,e=t){let i=new Ke(t,e);return!!this.tree_search(this.root,i)}remove(t,e=t){let i=new Ke(t,e),n=this.tree_search(this.root,i);return n&&this.tree_delete(n),n}search(t,e=(i,n)=>i===n?n.output():i){let i=new Ke(t),n=[];return this.tree_search_interval(this.root,i,n),n.map(r=>e(r.item.value,r.item.key))}intersect_any(t){let e=new Ke(t);return this.tree_find_any_interval(this.root,e)}forEach(t){this.tree_walk(this.root,e=>t(e.item.key,e.item.value))}map(t){let e=new s;return this.tree_walk(this.root,i=>e.insert(i.item.key,t(i.item.value,i.item.key))),e}*iterate(t,e=(i,n)=>i===n?n.output():i){let i;for(t?i=this.tree_search_nearest_forward(this.root,new Ke(t)):this.root&&(i=this.local_minimum(this.root));i;)yield e(i.item.value,i.item.key),i=this.tree_successor(i)}recalc_max(t){let e=t;for(;e.parent!=null;)e.parent.update_max(),e=e.parent}tree_insert(t){let e=this.root,i=null;if(this.root==null||this.root===this.nil_node)this.root=t;else{for(;e!==this.nil_node;)i=e,t.less_than(e)?e=e.left:e=e.right;t.parent=i,t.less_than(i)?i.left=t:i.right=t}this.insert_fixup(t)}insert_fixup(t){let e,i;for(e=t;e!==this.root&&e.parent.color===At;)e.parent===e.parent.parent.left?(i=e.parent.parent.right,i.color===At?(e.parent.color=X,i.color=X,e.parent.parent.color=At,e=e.parent.parent):(e===e.parent.right&&(e=e.parent,this.rotate_left(e)),e.parent.color=X,e.parent.parent.color=At,this.rotate_right(e.parent.parent))):(i=e.parent.parent.left,i.color===At?(e.parent.color=X,i.color=X,e.parent.parent.color=At,e=e.parent.parent):(e===e.parent.left&&(e=e.parent,this.rotate_right(e)),e.parent.color=X,e.parent.parent.color=At,this.rotate_left(e.parent.parent)));this.root.color=X}tree_delete(t){let e,i;t.left===this.nil_node||t.right===this.nil_node?e=t:e=this.tree_successor(t),e.left!==this.nil_node?i=e.left:i=e.right,i.parent=e.parent,e===this.root?this.root=i:(e===e.parent.left?e.parent.left=i:e.parent.right=i,e.parent.update_max()),this.recalc_max(i),e!==t&&(t.copy_data(e),t.update_max(),this.recalc_max(t)),e.color===X&&this.delete_fixup(i)}delete_fixup(t){let e=t,i;for(;e!==this.root&&e.parent!=null&&e.color===X;)e===e.parent.left?(i=e.parent.right,i.color===At&&(i.color=X,e.parent.color=At,this.rotate_left(e.parent),i=e.parent.right),i.left.color===X&&i.right.color===X?(i.color=At,e=e.parent):(i.right.color===X&&(i.color=At,i.left.color=X,this.rotate_right(i),i=e.parent.right),i.color=e.parent.color,e.parent.color=X,i.right.color=X,this.rotate_left(e.parent),e=this.root)):(i=e.parent.left,i.color===At&&(i.color=X,e.parent.color=At,this.rotate_right(e.parent),i=e.parent.left),i.left.color===X&&i.right.color===X?(i.color=At,e=e.parent):(i.left.color===X&&(i.color=At,i.right.color=X,this.rotate_left(i),i=e.parent.left),i.color=e.parent.color,e.parent.color=X,i.left.color=X,this.rotate_right(e.parent),e=this.root));e.color=X}tree_search(t,e){if(!(t==null||t===this.nil_node))return e.equal_to(t)?t:e.less_than(t)?this.tree_search(t.left,e):this.tree_search(t.right,e)}tree_search_nearest_forward(t,e){let i,n=t;for(;n&&n!==this.nil_node;)n.less_than(e)?n.intersect(e)?(i=n,n=n.left):n=n.right:((!i||n.less_than(i))&&(i=n),n=n.left);return i||null}tree_search_interval(t,e,i){t!=null&&t!==this.nil_node&&(t.left!==this.nil_node&&!t.not_intersect_left_subtree(e)&&this.tree_search_interval(t.left,e,i),t.intersect(e)&&i.push(t),t.right!==this.nil_node&&!t.not_intersect_right_subtree(e)&&this.tree_search_interval(t.right,e,i))}tree_find_any_interval(t,e){let i=!1;return t!=null&&t!==this.nil_node&&(t.left!==this.nil_node&&!t.not_intersect_left_subtree(e)&&(i=this.tree_find_any_interval(t.left,e)),i||(i=t.intersect(e)),!i&&t.right!==this.nil_node&&!t.not_intersect_right_subtree(e)&&(i=this.tree_find_any_interval(t.right,e))),i}local_minimum(t){let e=t;for(;e.left!=null&&e.left!==this.nil_node;)e=e.left;return e}local_maximum(t){let e=t;for(;e.right!=null&&e.right!==this.nil_node;)e=e.right;return e}tree_successor(t){let e,i,n;if(t.right!==this.nil_node)e=this.local_minimum(t.right);else{for(i=t,n=t.parent;n!=null&&n.right===i;)i=n,n=n.parent;e=n}return e}rotate_left(t){let e=t.right;t.right=e.left,e.left!==this.nil_node&&(e.left.parent=t),e.parent=t.parent,t===this.root?this.root=e:t===t.parent.left?t.parent.left=e:t.parent.right=e,e.left=t,t.parent=e,t!=null&&t!==this.nil_node&&t.update_max(),e=t.parent,e!=null&&e!==this.nil_node&&e.update_max()}rotate_right(t){let e=t.left;t.left=e.right,e.right!==this.nil_node&&(e.right.parent=t),e.parent=t.parent,t===this.root?this.root=e:t===t.parent.left?t.parent.left=e:t.parent.right=e,e.right=t,t.parent=e,t!==null&&t!==this.nil_node&&t.update_max(),e=t.parent,e!=null&&e!==this.nil_node&&e.update_max()}tree_walk(t,e){t!=null&&t!==this.nil_node&&(this.tree_walk(t.left,e),e(t),this.tree_walk(t.right,e))}testRedBlackProperty(){let t=!0;return this.tree_walk(this.root,function(e){e.color===At&&(e.left.color===X&&e.right.color===X||(t=!1))}),t}testBlackHeightProperty(t){let e=0,i=0,n=0;if(t.color===X&&e++,t.left!==this.nil_node?i=this.testBlackHeightProperty(t.left):i=1,t.right!==this.nil_node?n=this.testBlackHeightProperty(t.right):n=1,i!==n)throw new Error("Red-black height property violated");return e+=i,e}};var hr=class{constructor(t){N(this,"ranges");N(this,"tree");this.ranges=t,this.tree=new ar;for(let e of t)this.tree.insert([e.from,e.to],e)}empty(){return this.ranges.length===0}get(t){return t<0?this.ranges[this.ranges.length+t]:this.ranges[t]}at_cursor(t,e=!1){let i=this.tree.search([t,t]);return i.length?e&&i.length>1?i[1]:i[0]:void 0}contains_range(t,e){return this.tree.intersect_any([t,e])}range_adjacent_to_cursor(t,e,i=!1,n=!1){let r=e?this.ranges.slice().reverse():this.ranges;return n?r.find(o=>e?(i?o.from:o.to)e?(i?o.from:o.to)<=t:t<=(i?o.to:o.from))}adjacent_range(t,e,i=!1){let n=this.ranges.findIndex(o=>o===t);if(n===-1)return;let r=e?this.ranges[n-1]:this.ranges[n+1];if(r)if(i){if(e?r.to===t.from:t.to===r.from)return r}else return r}ranges_in_interval(t,e){return this.tree.search([t,e])}ranges_in_intervals(t){let e=new Set;for(let i of t)for(let n of this.tree.search([i.from,i.to]))if(e.add(n),n.base_range){e.add(n.base_range);for(let r of n.base_range.replies)e.add(r)}return Array.from(e).sort((i,n)=>i.from-n.from)}unwrap_in_range(t,e=0,i=t.length,n=null){let r,o;if(n||(n=this.ranges_in_interval(e,i)),n.length===0)return{output:t.sliceString(e,i),from:e,to:i};let l="";e=n.at(-1).to?l+=t.sliceString(n.at(-1).to,i):o=n.at(-1);let h=r?r.cursor_pass_syntax(e,!1):e,f=o?o.cursor_pass_syntax(i,!0):i;return(h!==e||e===(r==null?void 0:r.from))&&(r=void 0),(f!==i||i===(o==null?void 0:o.to))&&(o=void 0),{output:l,from:h,to:f,front_range:r,back_range:o}}};var yl="\\u037C",Gf=typeof Symbol=="undefined"?"__"+yl:Symbol.for(yl),vl=typeof Symbol=="undefined"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),Uf=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:{},re=class{constructor(t,e){this.rules=[];let{finish:i}=e||{};function n(o){return/^@/.test(o)?[o]:o.split(/,\\s*/)}function r(o,l,a,h){let f=[],u=/^@(\\w+)\\b/.exec(o[0]),c=u&&u[1]=="keyframes";if(u&&l==null)return a.push(o[0]+";");for(let d in l){let p=l[d];if(/&/.test(d))r(d.split(/,\\s*/).map(g=>o.map(m=>g.replace(/&/,m))).reduce((g,m)=>g.concat(m)),p,a);else if(p&&typeof p=="object"){if(!u)throw new RangeError("The value of a property ("+d+") should be a primitive value.");r(n(d),p,f,c)}else p!=null&&f.push(d.replace(/_.*/,"").replace(/[A-Z]/g,g=>"-"+g.toLowerCase())+": "+p+";")}(f.length||c)&&a.push((i&&!u&&!h?o.map(i):o).join(", ")+" {"+f.join(" ")+"}")}for(let o in t)r(n(o),t[o],this.rules)}getRules(){return this.rules.join(`\n`)}static newName(){let t=Uf[Gf]||1;return Uf[Gf]=t+1,yl+t.toString(36)}static mount(t,e,i){let n=t[vl],r=i&&i.nonce;n?r&&n.setNonce(r):n=new kl(t,r),n.mount(Array.isArray(e)?e:[e],t)}},qf=new Map,kl=class{constructor(t,e){let i=t.ownerDocument||t,n=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&n.CSSStyleSheet){let r=qf.get(i);if(r)return t[vl]=r;this.sheet=new n.CSSStyleSheet,qf.set(i,this)}else this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);this.modules=[],t[vl]=this}mount(t,e){let i=this.sheet,n=0,r=0;for(let o=0;o-1&&(this.modules.splice(a,1),r--,a=-1),a==-1){if(this.modules.splice(r++,0,l),i)for(let h=0;h",191:"?",192:"~",219:"{",220:"|",221:"}",222:\'"\'},Eg=typeof navigator!="undefined"&&/Mac/.test(navigator.platform),Dg=typeof navigator!="undefined"&&/MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);for(pt=0;pt<10;pt++)Ye[48+pt]=Ye[96+pt]=String(pt);var pt;for(pt=1;pt<=24;pt++)Ye[pt+111]="F"+pt;var pt;for(pt=65;pt<=90;pt++)Ye[pt]=String.fromCharCode(pt+32),ln[pt]=String.fromCharCode(pt);var pt;for(fr in Ye)ln.hasOwnProperty(fr)||(ln[fr]=Ye[fr]);var fr;function jf(s){var t=Eg&&s.metaKey&&s.shiftKey&&!s.ctrlKey&&!s.altKey||Dg&&s.shiftKey&&s.key&&s.key.length==1||s.key=="Unidentified",e=!t&&s.key||(s.shiftKey?ln:Ye)[s.keyCode]||s.key||"Unidentified";return e=="Esc"&&(e="Escape"),e=="Del"&&(e="Delete"),e=="Left"&&(e="ArrowLeft"),e=="Up"&&(e="ArrowUp"),e=="Right"&&(e="ArrowRight"),e=="Down"&&(e="ArrowDown"),e}function ts(s){let t;return s.nodeType==11?t=s.getSelection?s:s.ownerDocument:t=s,t.getSelection()}function Al(s,t){return t?s==t||s.contains(t.nodeType!=1?t.parentNode:t):!1}function yr(s,t){if(!t.anchorNode)return!1;try{return Al(s,t.anchorNode)}catch(e){return!1}}function un(s){return s.nodeType==3?Ii(s,0,s.nodeValue.length).getClientRects():s.nodeType==1?s.getClientRects():[]}function Yn(s,t,e,i){return e?$f(s,t,e,i,-1)||$f(s,t,e,i,1):!1}function Pi(s){for(var t=0;;t++)if(s=s.previousSibling,!s)return t}function Sr(s){return s.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\\d|SECTION|PRE)$/.test(s.nodeName)}function $f(s,t,e,i,n){for(;;){if(s==e&&t==i)return!0;if(t==(n<0?0:Oe(s))){if(s.nodeName=="DIV")return!1;let r=s.parentNode;if(!r||r.nodeType!=1)return!1;t=Pi(s)+(n<0?0:1),s=r}else if(s.nodeType==1){if(s=s.childNodes[t+(n<0?-1:0)],s.nodeType==1&&s.contentEditable=="false")return!1;t=n<0?Oe(s):0}else return!1}}function Oe(s){return s.nodeType==3?s.nodeValue.length:s.childNodes.length}function os(s,t){let e=t?s.left:s.right;return{left:e,right:e,top:s.top,bottom:s.bottom}}function Ig(s){let t=s.visualViewport;return t?{left:0,right:t.width,top:0,bottom:t.height}:{left:0,right:s.innerWidth,top:0,bottom:s.innerHeight}}function Cu(s,t){let e=t.width/s.offsetWidth,i=t.height/s.offsetHeight;return(e>.995&&e<1.005||!isFinite(e)||Math.abs(t.width-s.offsetWidth)<1)&&(e=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(t.height-s.offsetHeight)<1)&&(i=1),{scaleX:e,scaleY:i}}function Ng(s,t,e,i,n,r,o,l){let a=s.ownerDocument,h=a.defaultView||window;for(let f=s,u=!1;f&&!u;)if(f.nodeType==1){let c,d=f==a.body,p=1,g=1;if(d)c=Ig(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(f).position)&&(u=!0),f.scrollHeight<=f.clientHeight&&f.scrollWidth<=f.clientWidth){f=f.assignedSlot||f.parentNode;continue}let w=f.getBoundingClientRect();({scaleX:p,scaleY:g}=Cu(f,w)),c={left:w.left,right:w.left+f.clientWidth*p,top:w.top,bottom:w.top+f.clientHeight*g}}let m=0,b=0;if(n=="nearest")t.top0&&t.bottom>c.bottom+b&&(b=t.bottom-c.bottom+o)):t.bottom>c.bottom&&(b=t.bottom-c.bottom+o,e<0&&t.top-b0&&t.right>c.right+m&&(m=t.right-c.right+r)):t.right>c.right&&(m=t.right-c.right+r,e<0&&t.leftc.bottom||t.leftc.right)&&(t={left:Math.max(t.left,c.left),right:Math.min(t.right,c.right),top:Math.max(t.top,c.top),bottom:Math.min(t.bottom,c.bottom)}),f=f.assignedSlot||f.parentNode}else if(f.nodeType==11)f=f.host;else break}function Bg(s){let t=s.ownerDocument,e,i;for(let n=s.parentNode;n&&!(n==t.body||e&&i);)if(n.nodeType==1)!i&&n.scrollHeight>n.clientHeight&&(i=n),!e&&n.scrollWidth>n.clientWidth&&(e=n),n=n.assignedSlot||n.parentNode;else if(n.nodeType==11)n=n.host;else break;return{x:e,y:i}}var Tl=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?Oe(e):0),i,Math.min(t.focusOffset,i?Oe(i):0))}set(t,e,i,n){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=n}},an=null;function Mu(s){if(s.setActive)return s.setActive();if(an)return s.focus(an);let t=[];for(let e=s;e&&(t.push(e,e.scrollTop,e.scrollLeft),e!=e.ownerDocument);e=e.parentNode);if(s.focus(an==null?{get preventScroll(){return an={preventScroll:!0},!0}}:void 0),!an){an=!1;for(let e=0;eMath.max(1,s.scrollHeight-s.clientHeight-4)}function Ou(s,t){for(let e=s,i=t;;){if(e.nodeType==3&&i>0)return{node:e,offset:i};if(e.nodeType==1&&i>0){if(e.contentEditable=="false")return null;e=e.childNodes[i-1],i=Oe(e)}else if(e.parentNode&&!Sr(e))i=Pi(e),e=e.parentNode;else return null}}function _u(s,t){for(let e=s,i=t;;){if(e.nodeType==3&&ie)return u.domBoundsAround(t,e,h);if(c>=t&&n==-1&&(n=a,r=h),h>e&&u.dom.parentNode==this.dom){o=a,l=f;break}f=c,h=c+u.breakAfter}return{from:r,to:l<0?i+this.length:l,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:o=0?this.children[o].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),e.flags&1)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,this.flags&7&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=na){this.markDirty();for(let n=t;nthis.pos||t==this.pos&&(e>0||this.i==0||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}};function Eu(s,t,e,i,n,r,o,l,a){let{children:h}=s,f=h.length?h[t]:null,u=r.length?r[r.length-1]:null,c=u?u.breakAfter:o;if(!(t==i&&f&&!o&&!c&&r.length<2&&f.merge(e,n,r.length?u:null,e==0,l,a))){if(i0&&(!o&&r.length&&f.merge(e,f.length,r[0],!1,l,0)?f.breakAfter=r.shift().breakAfter:(e2),D={mac:Qf||/Mac/.test(Wt.platform),windows:/Win/.test(Wt.platform),linux:/Linux|X11/.test(Wt.platform),ie:Ir,ie_version:Ru?Ol.documentMode||6:El?+El[1]:_l?+_l[1]:0,gecko:Xf,gecko_version:Xf?+(/Firefox\\/(\\d+)/.exec(Wt.userAgent)||[0,0])[1]:0,chrome:!!xl,chrome_version:xl?+xl[1]:0,ios:Qf,android:/Android\\b/.test(Wt.userAgent),webkit:Jf,safari:Pu,webkit_version:Jf?+(/\\bAppleWebKit\\/(\\d+)/.exec(Wt.userAgent)||[0,0])[1]:0,tabSize:Ol.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"},Fg=256,_e=class s extends nt{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){t.nodeType==3&&this.createDOM(t)}merge(t,e,i){return this.flags&8||i&&(!(i instanceof s)||this.length-(e-t)+i.length>Fg||i.flags&8)?!1:(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new s(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=this.flags&8,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new Lt(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return Vg(this.dom,t,e)}},ui=class s extends nt{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let n of e)n.setParent(this)}setAttrs(t){if(Au(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!((this.flags|t.flags)&8)}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?this.flags&4&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,n,r,o){return i&&(!(i instanceof s&&i.mark.eq(this.mark))||t&&r<=0||et&&e.push(i=t&&(n=r),i=a,r++}let o=this.length-t;return this.length=t,n>-1&&(this.children.length=n,this.markDirty()),new s(this.mark,e,o)}domAtPos(t){return Iu(this,t)}coordsAt(t,e){return Bu(this,t,e)}};function Vg(s,t,e){let i=s.nodeValue.length;t>i&&(t=i);let n=t,r=t,o=0;t==0&&e<0||t==i&&e>=0?D.chrome||D.gecko||(t?(n--,o=1):r=0)?0:l.length-1];return D.safari&&!o&&a.width==0&&(a=Array.prototype.find.call(l,h=>h.width)||a),o?os(a,o<0):a||null}var Mr=class s extends nt{static create(t,e,i){return new s(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=s.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){(!this.dom||!this.widget.updateDOM(this.dom,t))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,n,r,o){return i&&(!(i instanceof s)||!this.widget.compare(i.widget)||t>0&&r<=0||e0)?Lt.before(this.dom):Lt.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let n=this.dom.getClientRects(),r=null;if(!n.length)return null;let o=this.side?this.side<0:t>0;for(let l=o?n.length-1:0;r=n[l],!(t>0?l==0:l==n.length-1||r.top0?Lt.before(this.dom):Lt.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return $.empty}get isHidden(){return!0}};_e.prototype.children=Mr.prototype.children=es.prototype.children=na;function Iu(s,t){let e=s.dom,{children:i}=s,n=0;for(let r=0;nr&&t0;r--){let o=i[r-1];if(o.dom.parentNode==e)return o.domAtPos(o.length)}for(let r=n;r0&&t instanceof ui&&n.length&&(i=n[n.length-1])instanceof ui&&i.mark.eq(t.mark)?Nu(i,t.children[0],e-1):(n.push(t),t.setParent(s)),s.length+=t.length}function Bu(s,t,e){let i=null,n=-1,r=null,o=-1;function l(h,f){for(let u=0,c=0;u=f&&(d.children.length?l(d,f-c):(!r||r.isHidden&&(e>0||Wg(r,d)))&&(p>f||c==p&&d.getSide()>0)?(r=d,o=f-c):(c-1?1:0)!=n.length-(e&&n.indexOf(e)>-1?1:0))return!1;for(let r of i)if(r!=e&&(n.indexOf(r)==-1||s[r]!==t[r]))return!1;return!0}function Rl(s,t,e){let i=!1;if(t)for(let n in t)e&&n in e||(i=!0,n=="style"?s.style.cssText="":s.removeAttribute(n));if(e)for(let n in e)t&&t[n]==e[n]||(i=!0,n=="style"?s.style.cssText=e[n]:s.setAttribute(n,e[n]));return i}function Gg(s){let t=Object.create(null);for(let e=0;e0?3e8:-4e8:e>0?1e8:-1e8,new ci(t,e,e,i,t.widget||null,!1)}static replace(t){let e=!!t.block,i,n;if(t.isBlockGap)i=-5e8,n=4e8;else{let{start:r,end:o}=Lu(t,e);i=(r?e?-3e8:-1:5e8)-1,n=(o?e?2e8:1:-6e8)+1}return new ci(t,i,n,e,t.widget||null,!0)}static line(t){return new ns(t)}static set(t,e=!1){return Y.of(t,e)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};J.none=Y.empty;var is=class s extends J{constructor(t){let{start:e,end:i}=Lu(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof s&&this.tagName==t.tagName&&(this.class||((e=this.attrs)===null||e===void 0?void 0:e.class))==(t.class||((i=t.attrs)===null||i===void 0?void 0:i.class))&&Ar(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}};is.prototype.point=!1;var ns=class s extends J{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof s&&this.spec.class==t.spec.class&&Ar(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}};ns.prototype.mapMode=Vt.TrackBefore;ns.prototype.point=!0;var ci=class s extends J{constructor(t,e,i,n,r,o){super(e,i,r,t),this.block=n,this.isReplace=o,this.mapMode=n?e<=0?Vt.TrackBefore:Vt.TrackAfter:Vt.TrackDel}get type(){return this.startSide!=this.endSide?Yt.WidgetRange:this.startSide<=0?Yt.WidgetBefore:Yt.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof s&&Ug(this.widget,t.widget)&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}};ci.prototype.point=!0;function Lu(s,t=!1){let{inclusiveStart:e,inclusiveEnd:i}=s;return e==null&&(e=s.inclusive),i==null&&(i=s.inclusive),{start:e!=null?e:t,end:i!=null?i:t}}function Ug(s,t){return s==t||!!(s&&t&&s.compare(t))}function vr(s,t,e,i=0){let n=e.length-1;n>=0&&e[n]+i>=s?e[n]=Math.max(e[n],t):e.push(s,t)}var Tt=class s extends nt{constructor(){super(...arguments),this.children=[],this.length=0,this.prevAttrs=void 0,this.attrs=null,this.breakAfter=0}merge(t,e,i,n,r,o){if(i){if(!(i instanceof s))return!1;this.dom||i.transferDOM(this)}return n&&this.setDeco(i?i.attrs:null),Du(this,t,e,i?i.children.slice():[],r,o),!0}split(t){let e=new s;if(e.breakAfter=this.breakAfter,this.length==0)return e;let{i,off:n}=this.childPos(t);n&&(e.append(this.children[i].split(n),0),this.children[i].merge(n,this.children[i].length,null,!1,0,0),i++);for(let r=i;r0&&this.children[i-1].length==0;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=this.prevAttrs===void 0?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){Ar(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){Nu(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=Dl(e,this.attrs||{})),i&&(this.attrs=Dl({class:i},this.attrs||{}))}domAtPos(t){return Iu(this,t)}reuseDOM(t){t.nodeName=="DIV"&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?this.flags&4&&(Au(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),this.prevAttrs!==void 0&&(Rl(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let n=this.dom.lastChild;for(;n&&nt.get(n)instanceof ui;)n=n.lastChild;if(!n||!this.length||n.nodeName!="BR"&&((i=nt.get(n))===null||i===void 0?void 0:i.isEditable)==!1&&(!D.ios||!this.children.some(r=>r instanceof _e))){let r=document.createElement("BR");r.cmIgnore=!0,this.dom.appendChild(r)}}measureTextSize(){if(this.children.length==0||this.length>20)return null;let t=0,e;for(let i of this.children){if(!(i instanceof _e)||/[^ -~]/.test(i.text))return null;let n=un(i.dom);if(n.length!=1)return null;t+=n[0].width,e=n[0].height}return t?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:t/this.length,textHeight:e}:null}coordsAt(t,e){let i=Bu(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:n}=this.parent.view.viewState,r=i.bottom-i.top;if(Math.abs(r-n.lineHeight)<2&&n.textHeight=e){if(r instanceof s)return r;if(o>e)break}n=o+r.breakAfter}return null}},Ri=class s extends nt{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,n,r,o){return i&&(!(i instanceof s)||!this.widget.compare(i.widget)||t>0&&r<=0||e0}},ss=class extends Ni{constructor(t){super(),this.height=t}toDOM(){let t=document.createElement("div");return t.className="cm-gap",this.updateDOM(t),t}eq(t){return t.height==this.height}updateDOM(t){return t.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}},Xn=class s{constructor(t,e,i,n){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(this.content.length==0)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof Ri&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new Tt),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(ur(new es(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,!this.posCovered()&&!(t&&this.content.length&&this.content[this.content.length-1]instanceof Ri)&&this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:r,lineBreak:o,done:l}=this.cursor.next(this.skip);if(this.skip=0,l)throw new Error("Ran out of text content when drawing inline views");if(o){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}else this.text=r,this.textOff=0}let n=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(ur(new _e(this.text.slice(this.textOff,this.textOff+n)),e),i),this.atCursorPos=!0,this.textOff+=n,t-=n,i=0}}span(t,e,i,n){this.buildText(e-t,i,n),this.pos=e,this.openStart<0&&(this.openStart=n)}point(t,e,i,n,r,o){if(this.disallowBlockEffectsFor[o]&&i instanceof ci){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let l=e-t;if(i instanceof ci)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new Ri(i.widget||di.block,l,i));else{let a=Mr.create(i.widget||di.inline,l,l?0:i.startSide),h=this.atCursorPos&&!a.isEditable&&r<=n.length&&(t0),f=!a.isEditable&&(tn.length||i.startSide<=0),u=this.getLine();this.pendingBuffer==2&&!h&&!a.isEditable&&(this.pendingBuffer=0),this.flushBuffer(n),h&&(u.append(ur(new es(1),n),r),r=n.length+Math.max(0,r-n.length)),u.append(ur(a,n),r),this.atCursorPos=f,this.pendingBuffer=f?tn.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);l&&(this.textOff+l<=this.text.length?this.textOff+=l:(this.skip+=l-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=r)}static build(t,e,i,n,r){let o=new s(t,e,i,r);return o.openEnd=Y.spans(n,e,i,o),o.openStart<0&&(o.openStart=o.openEnd),o.finish(o.openEnd),o}};function ur(s,t){for(let e of t)s=new ui(e,[s],s.length);return s}var di=class extends Ni{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}};di.inline=new di("span");di.block=new di("div");var gt=function(s){return s[s.LTR=0]="LTR",s[s.RTL=1]="RTL",s}(gt||(gt={})),Bi=gt.LTR,sa=gt.RTL;function Hu(s){let t=[];for(let e=0;e=e){if(l.level==i)return o;(r<0||(n!=0?n<0?l.frome:t[r].level>l.level))&&(r=o)}}if(r<0)throw new RangeError("Index out of range");return r}};function Vu(s,t){if(s.length!=t.length)return!1;for(let e=0;e=0;g-=3)if(Ce[g+1]==-d){let m=Ce[g+2],b=m&2?n:m&4?m&1?r:n:0;b&&(Z[u]=Z[Ce[g]]=b),l=g;break}}else{if(Ce.length==189)break;Ce[l++]=u,Ce[l++]=c,Ce[l++]=a}else if((p=Z[u])==2||p==1){let g=p==n;a=g?0:1;for(let m=l-3;m>=0;m-=3){let b=Ce[m+2];if(b&2)break;if(g)Ce[m+2]|=2;else{if(b&4)break;Ce[m+2]|=4}}}}}function Xg(s,t,e,i){for(let n=0,r=i;n<=e.length;n++){let o=n?e[n-1].to:s,l=na;)p==m&&(p=e[--g].from,m=g?e[g-1].to:s),Z[--p]=d;a=f}else r=h,a++}}}function Il(s,t,e,i,n,r,o){let l=i%2?2:1;if(i%2==n%2)for(let a=t,h=0;aa&&o.push(new Ae(a,g.from,d));let m=g.direction==Bi!=!(d%2);Nl(s,m?i+1:i,n,g.inner,g.from,g.to,o),a=g.to}p=g.to}else{if(p==e||(f?Z[p]!=l:Z[p]==l))break;p++}c?Il(s,a,p,i+1,n,c,o):at;){let f=!0,u=!1;if(!h||a>r[h-1].to){let g=Z[a-1];g!=l&&(f=!1,u=g==16)}let c=!f&&l==1?[]:null,d=f?i:i+1,p=a;t:for(;;)if(h&&p==r[h-1].to){if(u)break t;let g=r[--h];if(!f)for(let m=g.from,b=h;;){if(m==t)break t;if(b&&r[b-1].to==m)m=r[--b].from;else{if(Z[m-1]==l)break t;break}}if(c)c.push(g);else{g.toZ.length;)Z[Z.length]=256;let i=[],n=t==Bi?0:1;return Nl(s,n,n,e,0,s.length,i),i}function zu(s){return[new Ae(0,s,0)]}var Wu="";function Qg(s,t,e,i,n){var r;let o=i.head-s.from,l=Ae.find(t,o,(r=i.bidiLevel)!==null&&r!==void 0?r:-1,i.assoc),a=t[l],h=a.side(n,e);if(o==h){let c=l+=n?1:-1;if(c<0||c>=t.length)return null;a=t[l=c],o=a.side(!n,e),h=a.side(n,e)}let f=Se(s.text,o,a.forward(n,e));(fa.to)&&(f=h),Wu=s.text.slice(Math.min(o,f),Math.max(o,f));let u=l==(n?t.length-1:0)?null:t[l+(n?1:-1)];return u&&f==h&&u.level+(n?0:1)s.some(t=>t)}),tm=L.define({combine:s=>s.some(t=>t)}),Xu=L.define(),Jn=class s{constructor(t,e="nearest",i="nearest",n=5,r=5,o=!1){this.range=t,this.y=e,this.x=i,this.yMargin=n,this.xMargin=r,this.isSnapshot=o}map(t){return t.empty?this:new s(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new s(B.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},cr=ot.define({map:(s,t)=>s.map(t)}),Ju=ot.define();function ge(s,t,e){let i=s.facet(ju);i.length?i[0](t):window.onerror?window.onerror(String(t),e,void 0,void 0,t):e?console.error(e+":",t):console.error(t)}var Xe=L.define({combine:s=>s.length?s[0]:!0}),em=0,qn=L.define(),Je=class s{constructor(t,e,i,n,r){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=n,this.extension=r(this)}static define(t,e){let{eventHandlers:i,eventObservers:n,provide:r,decorations:o}=e||{};return new s(em++,t,i,n,l=>{let a=[qn.of(l)];return o&&a.push(rs.of(h=>{let f=h.plugin(l);return f?o(f):J.none})),r&&a.push(r(l)),a})}static fromClass(t,e){return s.define(i=>new t(i),e)}},Qn=class{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(i){if(ge(e.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(n){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){ge(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(!((e=this.value)===null||e===void 0)&&e.destroy)try{this.value.destroy()}catch(i){ge(t.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},Qu=L.define(),la=L.define(),rs=L.define(),Zu=L.define(),aa=L.define(),tc=L.define();function tu(s,t){let e=s.state.facet(tc);if(!e.length)return e;let i=e.map(r=>r instanceof Function?r(s):r),n=[];return Y.spans(i,t.from,t.to,{point(){},span(r,o,l,a){let h=r-t.from,f=o-t.from,u=n;for(let c=l.length-1;c>=0;c--,a--){let d=l[c].spec.bidiIsolate,p;if(d==null&&(d=Zg(t.text,h,f)),a>0&&u.length&&(p=u[u.length-1]).to==h&&p.direction==d)p.to=f,u=p.inner;else{let g={from:h,to:f,direction:d,inner:[]};u.push(g),u=g.inner}}}}),n}var ec=L.define();function ic(s){let t=0,e=0,i=0,n=0;for(let r of s.state.facet(ec)){let o=r(s);o&&(o.left!=null&&(t=Math.max(t,o.left)),o.right!=null&&(e=Math.max(e,o.right)),o.top!=null&&(i=Math.max(i,o.top)),o.bottom!=null&&(n=Math.max(n,o.bottom)))}return{left:t,right:e,top:i,bottom:n}}var jn=L.define(),Te=class s{constructor(t,e,i,n){this.fromA=t,this.toA=e,this.fromB=i,this.toB=n}join(t){return new s(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let n=t[e-1];if(!(n.fromA>i.toA)){if(n.toAf)break;r+=2}if(!a)return i;new s(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),o=a.toA,l=a.toB}}},Tr=class s{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=Kt.empty(this.startState.doc.length);for(let r of i)this.changes=this.changes.compose(r.changes);let n=[];this.changes.iterChangedRanges((r,o,l,a)=>n.push(new Te(r,o,l,a))),this.changedRanges=n}static create(t,e,i){return new s(t,e,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(t=>t.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},Or=class extends nt{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.editContextFormatting=J.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new Tt],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new Te(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:h,toA:f})=>fthis.minWidthTo)?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(t);let n=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((e=this.domChanged)===null||e===void 0)&&e.newSel?n=this.domChanged.newSel.head:!am(t.changes,this.hasComposition)&&!t.selectionSet&&(n=t.state.selection.main.head));let r=n>-1?nm(this.view,t.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:h,to:f}=this.hasComposition;i=new Te(h,f,t.changes.mapPos(h,-1),t.changes.mapPos(f,1)).addToSet(i.slice())}this.hasComposition=r?{from:r.range.fromB,to:r.range.toB}:null,(D.ie||D.chrome)&&!r&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let o=this.decorations,l=this.updateDeco(),a=om(o,l,t.changes);return i=Te.extendWithRanges(i,a),!(this.flags&7)&&i.length==0?!1:(this.updateInner(i,t.startState.doc.length,r),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:n}=this.view;n.ignore(()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=D.chrome||D.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,o),this.flags&=-8,o&&(o.written||n.selectionRange.focusNode!=o.node)&&(this.forceSelection=!0),this.dom.style.height=""}),this.markedForComposition.forEach(o=>o.flags&=-9);let r=[];if(this.view.viewport.from||this.view.viewport.to=0?n[o]:null;if(!l)break;let{fromA:a,toA:h,fromB:f,toB:u}=l,c,d,p,g;if(i&&i.range.fromBf){let v=Xn.build(this.view.state.doc,f,i.range.fromB,this.decorations,this.dynamicDecorationMap),x=Xn.build(this.view.state.doc,i.range.toB,u,this.decorations,this.dynamicDecorationMap);d=v.breakAtStart,p=v.openStart,g=x.openEnd;let S=this.compositionView(i);x.breakAtStart?S.breakAfter=1:x.content.length&&S.merge(S.length,S.length,x.content[0],!1,x.openStart,0)&&(S.breakAfter=x.content[0].breakAfter,x.content.shift()),v.content.length&&S.merge(0,0,v.content[v.content.length-1],!0,0,v.openEnd)&&v.content.pop(),c=v.content.concat(S).concat(x.content)}else({content:c,breakAtStart:d,openStart:p,openEnd:g}=Xn.build(this.view.state.doc,f,u,this.decorations,this.dynamicDecorationMap));let{i:m,off:b}=r.findPos(h,1),{i:w,off:y}=r.findPos(a,-1);Eu(this,w,y,m,b,c,d,p,g)}i&&this.fixCompositionDOM(i)}updateEditContextFormatting(t){this.editContextFormatting=this.editContextFormatting.map(t.changes);for(let e of t.transactions)for(let i of e.effects)i.is(Ju)&&(this.editContextFormatting=i.value)}compositionView(t){let e=new _e(t.text.nodeValue);e.flags|=8;for(let{deco:n}of t.marks)e=new ui(n,[e],e.length);let i=new Tt;return i.append(e,0),i}fixCompositionDOM(t){let e=(r,o)=>{o.flags|=8|(o.children.some(a=>a.flags&7)?1:0),this.markedForComposition.add(o);let l=nt.get(r);l&&l!=o&&(l.dom=null),o.setDOM(r)},i=this.childPos(t.range.fromB,1),n=this.children[i.i];e(t.line,n);for(let r=t.marks.length-1;r>=-1;r--)i=n.childPos(i.off,1),n=n.children[i.i],e(r>=0?t.marks[r].node:t.text,n)}updateSelection(t=!1,e=!1){(t||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,r=!n&&!(this.view.state.facet(Xe)||this.dom.tabIndex>-1)&&yr(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||e||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(l.anchor)),h=l.empty?a:this.moveToLine(this.domAtPos(l.head));if(D.gecko&&l.empty&&!this.hasComposition&&im(a)){let u=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(u,a.node.childNodes[a.offset]||null)),a=h=new Lt(u,0),o=!0}let f=this.view.observer.selectionRange;(o||!f.focusNode||(!Yn(a.node,a.offset,f.anchorNode,f.anchorOffset)||!Yn(h.node,h.offset,f.focusNode,f.focusOffset))&&!this.suppressWidgetCursorChange(f,l))&&(this.view.observer.ignore(()=>{D.android&&D.chrome&&this.dom.contains(f.focusNode)&&lm(f.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let u=ts(this.view.root);if(u)if(l.empty){if(D.gecko){let c=sm(a.node,a.offset);if(c&&c!=3){let d=(c==1?Ou:_u)(a.node,a.offset);d&&(a=new Lt(d.node,d.offset))}}u.collapse(a.node,a.offset),l.bidiLevel!=null&&u.caretBidiLevel!==void 0&&(u.caretBidiLevel=l.bidiLevel)}else if(u.extend){u.collapse(a.node,a.offset);try{u.extend(h.node,h.offset)}catch(c){}}else{let c=document.createRange();l.anchor>l.head&&([a,h]=[h,a]),c.setEnd(h.node,h.offset),c.setStart(a.node,a.offset),u.removeAllRanges(),u.addRange(c)}r&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())}),this.view.observer.setSelectionRange(a,h)),this.impreciseAnchor=a.precise?null:new Lt(f.anchorNode,f.anchorOffset),this.impreciseHead=h.precise?null:new Lt(f.focusNode,f.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&Yn(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=ts(t.root),{anchorNode:n,anchorOffset:r}=t.observer.selectionRange;if(!i||!e.empty||!e.assoc||!i.modify)return;let o=Tt.find(this,e.head);if(!o)return;let l=o.posAtStart;if(e.head==l||e.head==l+o.length)return;let a=this.coordsAt(e.head,-1),h=this.coordsAt(e.head,1);if(!a||!h||a.bottom>h.top)return;let f=this.domAtPos(e.head+e.assoc);i.collapse(f.node,f.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let u=t.observer.selectionRange;t.docView.posFromDOM(u.anchorNode,u.anchorOffset)!=e.from&&i.collapse(n,r)}moveToLine(t){let e=this.dom,i;if(t.node!=e)return t;for(let n=t.offset;!i&&n=0;n--){let r=nt.get(e.childNodes[n]);r instanceof Tt&&(i=r.domAtPos(r.length))}return i?new Lt(i.node,i.offset,!0):t}nearest(t){for(let e=t;e;){let i=nt.get(e);if(i&&i.rootView==this)return i;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e=0;o--){let l=this.children[o],a=r-l.breakAfter,h=a-l.length;if(at||l.covers(1))&&(!i||l instanceof Tt&&!(i instanceof Tt&&e>=0)))i=l,n=h;else if(i&&h==t&&a==t&&l instanceof Ri&&Math.abs(e)<2){if(l.deco.startSide<0)break;o&&(i=null)}r=h}return i?i.coordsAt(t-n,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),n=this.children[e];if(!(n instanceof Tt))return null;for(;n.children.length;){let{i:l,off:a}=n.childPos(i,1);for(;;l++){if(l==n.children.length)return null;if((n=n.children[l]).length)break}i=a}if(!(n instanceof _e))return null;let r=Se(n.text,i);if(r==i)return null;let o=Ii(n.dom,i,r).getClientRects();for(let l=0;lMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,l=-1,a=this.view.textDirection==gt.LTR;for(let h=0,f=0;fn)break;if(h>=i){let d=u.dom.getBoundingClientRect();if(e.push(d.height),o){let p=u.dom.lastChild,g=p?un(p):[];if(g.length){let m=g[g.length-1],b=a?m.right-d.left:d.right-m.left;b>l&&(l=b,this.minWidth=r,this.minWidthFrom=h,this.minWidthTo=c)}}}h=c+u.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return getComputedStyle(this.children[e].dom).direction=="rtl"?gt.RTL:gt.LTR}measureTextSize(){for(let r of this.children)if(r instanceof Tt){let o=r.measureTextSize();if(o)return o}let t=document.createElement("div"),e,i,n;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.dom.appendChild(t);let r=un(t.firstChild)[0];e=t.getBoundingClientRect().height,i=r?r.width/27:7,n=r?r.height:e,t.remove()}),{lineHeight:e,charWidth:i,textHeight:n}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new Cr(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,n=0;;n++){let r=n==e.viewports.length?null:e.viewports[n],o=r?r.from-1:this.length;if(o>i){let l=(e.lineBlockAt(o).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(J.replace({widget:new ss(l),block:!0,inclusive:!0,isBlockGap:!0}).range(i,o))}if(!r)break;i=r.to+1}return J.set(t)}updateDeco(){let t=1,e=this.view.state.facet(rs).map(r=>(this.dynamicDecorationMap[t++]=typeof r=="function")?r(this.view):r),i=!1,n=this.view.state.facet(Zu).map((r,o)=>{let l=typeof r=="function";return l&&(i=!0),l?r(this.view):r});for(n.length&&(this.dynamicDecorationMap[t++]=i,e.push(Y.join(n))),this.decorations=[this.editContextFormatting,...e,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];te.anchor?-1:1),n;if(!i)return;!e.empty&&(n=this.coordsAt(e.anchor,e.anchor>e.head?-1:1))&&(i={left:Math.min(i.left,n.left),top:Math.min(i.top,n.top),right:Math.max(i.right,n.right),bottom:Math.max(i.bottom,n.bottom)});let r=ic(this.view),o={left:i.left-r.left,top:i.top-r.top,right:i.right+r.right,bottom:i.bottom+r.bottom},{offsetWidth:l,offsetHeight:a}=this.view.scrollDOM;Ng(this.view.scrollDOM,o,e.head{it.from&&(e=!0)}),e}function hm(s,t,e=1){let i=s.charCategorizer(t),n=s.doc.lineAt(t),r=t-n.from;if(n.length==0)return B.cursor(t);r==0?e=1:r==n.length&&(e=-1);let o=r,l=r;e<0?o=Se(n.text,r,!1):l=Se(n.text,r);let a=i(n.text.slice(o,l));for(;o>0;){let h=Se(n.text,o,!1);if(i(n.text.slice(h,o))!=a)break;o=h}for(;ls?t.left-s:Math.max(0,s-t.right)}function um(s,t){return t.top>s?t.top-s:Math.max(0,s-t.bottom)}function Sl(s,t){return s.topt.top+1}function eu(s,t){return ts.bottom?{top:s.top,left:s.left,right:s.right,bottom:t}:s}function Ll(s,t,e){let i,n,r,o,l=!1,a,h,f,u;for(let p=s.firstChild;p;p=p.nextSibling){let g=un(p);for(let m=0;my||o==y&&r>w){i=p,n=b,r=w,o=y;let v=y?e0?m0)}w==0?e>b.bottom&&(!f||f.bottomb.top)&&(h=p,u=b):f&&Sl(f,b)?f=iu(f,b.bottom):u&&Sl(u,b)&&(u=eu(u,b.top))}}if(f&&f.bottom>=e?(i=a,n=f):u&&u.top<=e&&(i=h,n=u),!i)return{node:s,offset:0};let c=Math.max(n.left,Math.min(n.right,t));if(i.nodeType==3)return nu(i,c,e);if(l&&i.contentEditable!="false")return Ll(i,c,e);let d=Array.prototype.indexOf.call(s.childNodes,i)+(t>=(n.left+n.right)/2?1:0);return{node:s,offset:d}}function nu(s,t,e){let i=s.nodeValue.length,n=-1,r=1e9,o=0;for(let l=0;le?f.top-e:e-f.bottom)-1;if(f.left-1<=t&&f.right+1>=t&&u=(f.left+f.right)/2,d=c;if((D.chrome||D.gecko)&&Ii(s,l).getBoundingClientRect().left==f.right&&(d=!c),u<=0)return{node:s,offset:l+(d?1:0)};n=l+(d?1:0),r=u}}}return{node:s,offset:n>-1?n:o>0?s.nodeValue.length:0}}function sc(s,t,e,i=-1){var n,r;let o=s.contentDOM.getBoundingClientRect(),l=o.top+s.viewState.paddingTop,a,{docHeight:h}=s.viewState,{x:f,y:u}=t,c=u-l;if(c<0)return 0;if(c>h)return s.state.doc.length;for(let v=s.viewState.heightOracle.textHeight/2,x=!1;a=s.elementAtHeight(c),a.type!=Yt.Text;)for(;c=i>0?a.bottom+v:a.top-v,!(c>=0&&c<=h);){if(x)return e?null:0;x=!0,i=-i}u=l+c;let d=a.from;if(ds.viewport.to)return s.viewport.to==s.state.doc.length?s.state.doc.length:e?null:su(s,o,a,f,u);let p=s.dom.ownerDocument,g=s.root.elementFromPoint?s.root:p,m=g.elementFromPoint(f,u);m&&!s.contentDOM.contains(m)&&(m=null),m||(f=Math.max(o.left+1,Math.min(o.right-1,f)),m=g.elementFromPoint(f,u),m&&!s.contentDOM.contains(m)&&(m=null));let b,w=-1;if(m&&((n=s.docView.nearest(m))===null||n===void 0?void 0:n.isEditable)!=!1){if(p.caretPositionFromPoint){let v=p.caretPositionFromPoint(f,u);v&&({offsetNode:b,offset:w}=v)}else if(p.caretRangeFromPoint){let v=p.caretRangeFromPoint(f,u);v&&({startContainer:b,startOffset:w}=v,(!s.contentDOM.contains(b)||D.safari&&cm(b,w,f)||D.chrome&&dm(b,w,f))&&(b=void 0))}b&&(w=Math.min(Oe(b),w))}if(!b||!s.docView.dom.contains(b)){let v=Tt.find(s.docView,d);if(!v)return c>a.top+a.height/2?a.to:a.from;({node:b,offset:w}=Ll(v.dom,f,u))}let y=s.docView.nearest(b);if(!y)return null;if(y.isWidget&&((r=y.dom)===null||r===void 0?void 0:r.nodeType)==1){let v=y.dom.getBoundingClientRect();return t.ys.defaultLineHeight*1.5){let l=s.viewState.heightOracle.textHeight,a=Math.floor((n-e.top-(s.defaultLineHeight-l)*.5)/l);r+=a*s.viewState.heightOracle.lineLength}let o=s.state.sliceDoc(e.from,e.to);return e.from+Wf(o,r,s.state.tabSize)}function cm(s,t,e){let i;if(s.nodeType!=3||t!=(i=s.nodeValue.length))return!1;for(let n=s.nextSibling;n;n=n.nextSibling)if(n.nodeType!=1||n.nodeName!="BR")return!1;return Ii(s,i-1,i).getBoundingClientRect().left>e}function dm(s,t,e){if(t!=0)return!1;for(let n=s;;){let r=n.parentNode;if(!r||r.nodeType!=1||r.firstChild!=n)return!1;if(r.classList.contains("cm-line"))break;n=r}let i=s.nodeType==1?s.getBoundingClientRect():Ii(s,0,Math.max(s.nodeValue.length,1)).getBoundingClientRect();return e-i.left>5}function pm(s,t,e){let i=s.lineBlockAt(t);if(Array.isArray(i.type)){let n;for(let r of i.type){if(r.from>t)break;if(!(r.tot)return r;(!n||r.type==Yt.Text&&(n.type!=r.type||(e<0?r.fromt)))&&(n=r)}}return n||i}return i}function gm(s,t,e,i){let n=pm(s,t.head,t.assoc||-1),r=!i||n.type!=Yt.Text||!(s.lineWrapping||n.widgetLineBreaks)?null:s.coordsAtPos(t.assoc<0&&t.head>n.from?t.head-1:t.head);if(r){let o=s.dom.getBoundingClientRect(),l=s.textDirectionAt(n.from),a=s.posAtCoords({x:e==(l==gt.LTR)?o.right-1:o.left+1,y:(r.top+r.bottom)/2});if(a!=null)return B.cursor(a,e?-1:1)}return B.cursor(e?n.to:n.from,e?-1:1)}function ru(s,t,e,i){let n=s.state.doc.lineAt(t.head),r=s.bidiSpans(n),o=s.textDirectionAt(n.from);for(let l=t,a=null;;){let h=Qg(n,r,o,l,e),f=Wu;if(!h){if(n.number==(e?s.state.doc.lines:1))return l;f=`\n`,n=s.state.doc.line(n.number+(e?1:-1)),r=s.bidiSpans(n),h=s.visualLineSide(n,!e)}if(a){if(!a(f))return l}else{if(!i)return h;a=i(f)}l=h}}function mm(s,t,e){let i=s.state.charCategorizer(t),n=i(e);return r=>{let o=i(r);return n==xe.Space&&(n=o),n==o}}function bm(s,t,e,i){let n=t.head,r=e?1:-1;if(n==(e?s.state.doc.length:0))return B.cursor(n,t.assoc);let o=t.goalColumn,l,a=s.contentDOM.getBoundingClientRect(),h=s.coordsAtPos(n,t.assoc||-1),f=s.documentTop;if(h)o==null&&(o=h.left-a.left),l=r<0?h.top:h.bottom;else{let d=s.viewState.lineBlockAt(n);o==null&&(o=Math.min(a.right-a.left,s.defaultCharacterWidth*(n-d.from))),l=(r<0?d.top:d.bottom)+f}let u=a.left+o,c=i!=null?i:s.viewState.heightOracle.textHeight>>1;for(let d=0;;d+=10){let p=l+(c+d)*r,g=sc(s,{x:u,y:p},!1,r);if(pa.bottom||(r<0?gn)){let m=s.docView.coordsForChar(g),b=!m||p{if(t>r&&tn(s)),e.from,t.head>e.from?-1:1);return i==e.from?e:B.cursor(i,ir)&&this.lineBreak(),n=o}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,n=this.lineSeparator?null:/\\r\\n?|\\n/g;;){let r=-1,o=1,l;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(l=n.exec(e))&&(r=l.index,o=l[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let a of this.points)a.node==t&&a.pos>this.text.length&&(a.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=nt.get(t),i=e&&e.overrideDOMText;if(i!=null){this.findPointInside(t,i.length);for(let n=i.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else t.nodeType==3?this.readTextNode(t):t.nodeName=="BR"?t.nextSibling&&this.lineBreak():t.nodeType==1&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(t.nodeType==3?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+(wm(t,i.node,i.offset)?e:0))}};function wm(s,t,e){for(;;){if(!t||e-1;let{impreciseHead:r,impreciseAnchor:o}=t.docView;if(t.state.readOnly&&e>-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let l=r||o?[]:km(t),a=new Hl(l,t.state);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=xm(l,this.bounds.from)}else{let l=t.observer.selectionRange,a=r&&r.node==l.focusNode&&r.offset==l.focusOffset||!Al(t.contentDOM,l.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(l.focusNode,l.focusOffset),h=o&&o.node==l.anchorNode&&o.offset==l.anchorOffset||!Al(t.contentDOM,l.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(l.anchorNode,l.anchorOffset),f=t.viewport;if((D.ios||D.chrome)&&t.state.selection.main.empty&&a!=h&&(f.from>0||f.toDate.now()-100?s.inputState.lastKeyCode:-1;if(t.bounds){let{from:o,to:l}=t.bounds,a=n.from,h=null;(r===8||D.android&&t.text.length=n.from&&e.to<=n.to&&(e.from!=n.from||e.to!=n.to)&&n.to-n.from-(e.to-e.from)<=4?e={from:n.from,to:n.to,insert:s.state.doc.slice(n.from,e.from).append(e.insert).append(s.state.doc.slice(e.to,n.to))}:D.chrome&&e&&e.from==e.to&&e.from==n.head&&e.insert.toString()==`\n `&&s.lineWrapping&&(i&&(i=B.single(i.main.anchor-1,i.main.head-1)),e={from:n.from,to:n.to,insert:$.of([" "])}),e)return ha(s,e,i,r);if(i&&!i.main.eq(n)){let o=!1,l="select";return s.inputState.lastSelectionTime>Date.now()-50&&(s.inputState.lastSelectionOrigin=="select"&&(o=!0),l=s.inputState.lastSelectionOrigin),s.dispatch({selection:i,scrollIntoView:o,userEvent:l}),!0}else return!1}function ha(s,t,e,i=-1){if(D.ios&&s.inputState.flushIOSKey(t))return!0;let n=s.state.selection.main;if(D.android&&(t.to==n.to&&(t.from==n.from||t.from==n.from-1&&s.state.sliceDoc(t.from,n.from)==" ")&&t.insert.length==1&&t.insert.lines==2&&fn(s.contentDOM,"Enter",13)||(t.from==n.from-1&&t.to==n.to&&t.insert.length==0||i==8&&t.insert.lengthn.head)&&fn(s.contentDOM,"Backspace",8)||t.from==n.from&&t.to==n.to+1&&t.insert.length==0&&fn(s.contentDOM,"Delete",46)))return!0;let r=t.insert.toString();s.inputState.composing>=0&&s.inputState.composing++;let o,l=()=>o||(o=ym(s,t,e));return s.state.facet($u).some(a=>a(s,t.from,t.to,r,l))||s.dispatch(l()),!0}function ym(s,t,e){let i,n=s.state,r=n.selection.main;if(t.from>=r.from&&t.to<=r.to&&t.to-t.from>=(r.to-r.from)/3&&(!e||e.main.empty&&e.main.from==t.from+t.insert.length)&&s.inputState.composing<0){let l=r.fromt.to?n.sliceDoc(t.to,r.to):"";i=n.replaceSelection(s.state.toText(l+t.insert.sliceString(0,void 0,s.state.lineBreak)+a))}else{let l=n.changes(t),a=e&&e.main.to<=l.newLength?e.main:void 0;if(n.selection.ranges.length>1&&s.inputState.composing>=0&&t.to<=r.to&&t.to>=r.to-10){let h=s.state.sliceDoc(t.from,t.to),f,u=e&&nc(s,e.main.head);if(u){let p=t.insert.length-(t.to-t.from);f={from:u.from,to:u.to-p}}else f=s.state.doc.lineAt(r.head);let c=r.to-t.to,d=r.to-r.from;i=n.changeByRange(p=>{if(p.from==r.from&&p.to==r.to)return{changes:l,range:a||p.map(l)};let g=p.to-c,m=g-h.length;if(p.to-p.from!=d||s.state.sliceDoc(m,g)!=h||p.to>=f.from&&p.from<=f.to)return{range:p};let b=n.changes({from:m,to:g,insert:t.insert}),w=p.to-r.to;return{changes:b,range:a?B.range(Math.max(0,a.anchor+w),Math.max(0,a.head+w)):p.map(b)}})}else i={changes:l,selection:a&&n.selection.replaceRange(a)}}let o="input.type";return(s.composing||s.inputState.compositionPendingChange&&s.inputState.compositionEndedAt>Date.now()-50)&&(s.inputState.compositionPendingChange=!1,o+=".compose",s.inputState.compositionFirstChange&&(o+=".start",s.inputState.compositionFirstChange=!1)),n.update(i,{userEvent:o,scrollIntoView:!0})}function vm(s,t,e,i){let n=Math.min(s.length,t.length),r=0;for(;r0&&l>0&&s.charCodeAt(o-1)==t.charCodeAt(l-1);)o--,l--;if(i=="end"){let a=Math.max(0,r-Math.min(o,l));e-=o+a-r}if(o=o?r-e:0;r-=a,l=r+(l-o),o=r}else if(l=l?r-e:0;r-=a,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}function km(s){let t=[];if(s.root.activeElement!=s.contentDOM)return t;let{anchorNode:e,anchorOffset:i,focusNode:n,focusOffset:r}=s.observer.selectionRange;return e&&(t.push(new _r(e,i)),(n!=e||r!=i)&&t.push(new _r(n,r))),t}function xm(s,t){if(s.length==0)return null;let e=s[0].pos,i=s.length==2?s[1].pos:e;return e>-1&&i>-1?B.single(e+t,i+t):null}var Vl=class{setSelectionOrigin(t){this.lastSelectionOrigin=t,this.lastSelectionTime=Date.now()}constructor(t){this.view=t,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=t.hasFocus,D.safari&&t.contentDOM.addEventListener("input",()=>null),D.gecko&&Lm(t.contentDOM.ownerDocument)}handleEvent(t){!_m(this.view,t)||this.ignoreDuringComposition(t)||t.type=="keydown"&&this.keydown(t)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(t.type,t)):this.runHandlers(t.type,t))}runHandlers(t,e){let i=this.handlers[t];if(i){for(let n of i.observers)n(this.view,e);for(let n of i.handlers){if(e.defaultPrevented)break;if(n(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=Sm(t),i=this.handlers,n=this.view.contentDOM;for(let r in e)if(r!="scroll"){let o=!e[r].handlers.length,l=i[r];l&&o!=!l.handlers.length&&(n.removeEventListener(r,this.handleEvent),l=null),l||n.addEventListener(r,this.handleEvent,{passive:o})}for(let r in i)r!="scroll"&&!e[r]&&n.removeEventListener(r,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),t.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&t.keyCode!=27&&lc.indexOf(t.keyCode)<0&&(this.tabFocusMode=-1),D.android&&D.chrome&&!t.synthetic&&(t.keyCode==13||t.keyCode==8))return this.view.observer.delayAndroidKey(t.key,t.keyCode),!0;let e;return D.ios&&!t.synthetic&&!t.altKey&&!t.metaKey&&((e=oc.find(i=>i.keyCode==t.keyCode))&&!t.ctrlKey||Cm.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(this.pendingIOSKey=e||t,setTimeout(()=>this.flushIOSKey(),250),!0):(t.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(t){let e=this.pendingIOSKey;return!e||e.key=="Enter"&&t&&t.from0?!0:D.safari&&!D.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1:!1}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.view.observer.update(t),this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function ou(s,t){return(e,i)=>{try{return t.call(s,i,e)}catch(n){ge(e.state,n)}}}function Sm(s){let t=Object.create(null);function e(i){return t[i]||(t[i]={observers:[],handlers:[]})}for(let i of s){let n=i.spec;if(n&&n.domEventHandlers)for(let r in n.domEventHandlers){let o=n.domEventHandlers[r];o&&e(r).handlers.push(ou(i.value,o))}if(n&&n.domEventObservers)for(let r in n.domEventObservers){let o=n.domEventObservers[r];o&&e(r).observers.push(ou(i.value,o))}}for(let i in me)e(i).handlers.push(me[i]);for(let i in le)e(i).observers.push(le[i]);return t}var oc=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],Cm="dthko",lc=[16,17,18,20,91,92,224,225],dr=6;function pr(s){return Math.max(0,s)*.7+8}function Mm(s,t){return Math.max(Math.abs(s.clientX-t.clientX),Math.abs(s.clientY-t.clientY))}var zl=class{constructor(t,e,i,n){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParents=Bg(t.contentDOM),this.atoms=t.state.facet(aa).map(o=>o(t));let r=t.contentDOM.ownerDocument;r.addEventListener("mousemove",this.move=this.move.bind(this)),r.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(ut.allowMultipleSelections)&&Am(t,e),this.dragging=Om(t,e)&&fc(e)==1?null:!1}start(t){this.dragging===!1&&this.select(t)}move(t){if(t.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&Mm(this.startEvent,t)<10)return;this.select(this.lastEvent=t);let e=0,i=0,n=0,r=0,o=this.view.win.innerWidth,l=this.view.win.innerHeight;this.scrollParents.x&&({left:n,right:o}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:r,bottom:l}=this.scrollParents.y.getBoundingClientRect());let a=ic(this.view);t.clientX-a.left<=n+dr?e=-pr(n-t.clientX):t.clientX+a.right>=o-dr&&(e=pr(t.clientX-o)),t.clientY-a.top<=r+dr?i=-pr(r-t.clientY):t.clientY+a.bottom>=l-dr&&(i=pr(t.clientY-l)),this.setScrollSpeed(e,i)}up(t){this.dragging==null&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:t,y:e}=this.scrollSpeed;t&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=t,t=0),e&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=e,e=0),(t||e)&&this.view.win.scrollBy(t,e),this.dragging===!1&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;ie.isUserEvent("input.type"))?this.destroy():this.style.update(t)&&setTimeout(()=>this.select(this.lastEvent),20)}};function Am(s,t){let e=s.state.facet(Gu);return e.length?e[0](t):D.mac?t.metaKey:t.ctrlKey}function Tm(s,t){let e=s.state.facet(Uu);return e.length?e[0](t):D.mac?!t.altKey:!t.ctrlKey}function Om(s,t){let{main:e}=s.state.selection;if(e.empty)return!1;let i=ts(s.root);if(!i||i.rangeCount==0)return!0;let n=i.getRangeAt(0).getClientRects();for(let r=0;r=t.clientX&&o.top<=t.clientY&&o.bottom>=t.clientY)return!0}return!1}function _m(s,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let e=t.target,i;e!=s.contentDOM;e=e.parentNode)if(!e||e.nodeType==11||(i=nt.get(e))&&i.ignoreEvent(t))return!1;return!0}var me=Object.create(null),le=Object.create(null),ac=D.ie&&D.ie_version<15||D.ios&&D.webkit_version<604;function Em(s){let t=s.dom.parentNode;if(!t)return;let e=t.appendChild(document.createElement("textarea"));e.style.cssText="position: fixed; left: -10000px; top: 10px",e.focus(),setTimeout(()=>{s.focus(),e.remove(),hc(s,e.value)},50)}function Nr(s,t,e){for(let i of s.facet(t))e=i(e,s);return e}function hc(s,t){t=Nr(s.state,ra,t);let{state:e}=s,i,n=1,r=e.toText(t),o=r.lines==e.selection.ranges.length;if(Wl!=null&&e.selection.ranges.every(a=>a.empty)&&Wl==r.toString()){let a=-1;i=e.changeByRange(h=>{let f=e.doc.lineAt(h.from);if(f.from==a)return{range:h};a=f.from;let u=e.toText((o?r.line(n++).text:t)+e.lineBreak);return{changes:{from:f.from,insert:u},range:B.cursor(h.from+u.length)}})}else o?i=e.changeByRange(a=>{let h=r.line(n++);return{changes:{from:a.from,to:a.to,insert:h.text},range:B.cursor(a.from+h.length)}}):i=e.replaceSelection(r);s.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}le.scroll=s=>{s.inputState.lastScrollTop=s.scrollDOM.scrollTop,s.inputState.lastScrollLeft=s.scrollDOM.scrollLeft};me.keydown=(s,t)=>(s.inputState.setSelectionOrigin("select"),t.keyCode==27&&s.inputState.tabFocusMode!=0&&(s.inputState.tabFocusMode=Date.now()+2e3),!1);le.touchstart=(s,t)=>{s.inputState.lastTouchTime=Date.now(),s.inputState.setSelectionOrigin("select.pointer")};le.touchmove=s=>{s.inputState.setSelectionOrigin("select.pointer")};me.mousedown=(s,t)=>{if(s.observer.flush(),s.inputState.lastTouchTime>Date.now()-2e3)return!1;let e=null;for(let i of s.state.facet(qu))if(e=i(s,t),e)break;if(!e&&t.button==0&&(e=Pm(s,t)),e){let i=!s.hasFocus;s.inputState.startMouseSelection(new zl(s,t,e,i)),i&&s.observer.ignore(()=>{Mu(s.contentDOM);let r=s.root.activeElement;r&&!r.contains(s.contentDOM)&&r.blur()});let n=s.inputState.mouseSelection;if(n)return n.start(t),n.dragging===!1}return!1};function lu(s,t,e,i){if(i==1)return B.cursor(t,e);if(i==2)return hm(s.state,t,e);{let n=Tt.find(s.docView,t),r=s.state.doc.lineAt(n?n.posAtEnd:t),o=n?n.posAtStart:r.from,l=n?n.posAtEnd:r.to;return lt>=e.top&&t<=e.bottom&&s>=e.left&&s<=e.right;function Dm(s,t,e,i){let n=Tt.find(s.docView,t);if(!n)return 1;let r=t-n.posAtStart;if(r==0)return 1;if(r==n.length)return-1;let o=n.coordsAt(r,-1);if(o&&au(e,i,o))return-1;let l=n.coordsAt(r,1);return l&&au(e,i,l)?1:o&&o.bottom>=i?-1:1}function hu(s,t){let e=s.posAtCoords({x:t.clientX,y:t.clientY},!1);return{pos:e,bias:Dm(s,e,t.clientX,t.clientY)}}var Rm=D.ie&&D.ie_version<=11,fu=null,uu=0,cu=0;function fc(s){if(!Rm)return s.detail;let t=fu,e=cu;return fu=s,cu=Date.now(),uu=!t||e>Date.now()-400&&Math.abs(t.clientX-s.clientX)<2&&Math.abs(t.clientY-s.clientY)<2?(uu+1)%3:1}function Pm(s,t){let e=hu(s,t),i=fc(t),n=s.state.selection;return{update(r){r.docChanged&&(e.pos=r.changes.mapPos(e.pos),n=n.map(r.changes))},get(r,o,l){let a=hu(s,r),h,f=lu(s,a.pos,a.bias,i);if(e.pos!=a.pos&&!o){let u=lu(s,e.pos,e.bias,i),c=Math.min(u.from,f.from),d=Math.max(u.to,f.to);f=c1&&(h=Im(n,a.pos))?h:l?n.addRange(f):B.create([f])}}}function Im(s,t){for(let e=0;e=t)return B.create(s.ranges.slice(0,e).concat(s.ranges.slice(e+1)),s.mainIndex==e?0:s.mainIndex-(s.mainIndex>e?1:0))}return null}me.dragstart=(s,t)=>{let{selection:{main:e}}=s.state;if(t.target.draggable){let n=s.docView.nearest(t.target);if(n&&n.isWidget){let r=n.posAtStart,o=r+n.length;(r>=e.to||o<=e.from)&&(e=B.range(r,o))}}let{inputState:i}=s;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=e,t.dataTransfer&&(t.dataTransfer.setData("Text",Nr(s.state,oa,s.state.sliceDoc(e.from,e.to))),t.dataTransfer.effectAllowed="copyMove"),!1};me.dragend=s=>(s.inputState.draggedContent=null,!1);function du(s,t,e,i){if(e=Nr(s.state,ra,e),!e)return;let n=s.posAtCoords({x:t.clientX,y:t.clientY},!1),{draggedContent:r}=s.inputState,o=i&&r&&Tm(s,t)?{from:r.from,to:r.to}:null,l={from:n,insert:e},a=s.state.changes(o?[o,l]:l);s.focus(),s.dispatch({changes:a,selection:{anchor:a.mapPos(n,-1),head:a.mapPos(n,1)},userEvent:o?"move.drop":"input.drop"}),s.inputState.draggedContent=null}me.drop=(s,t)=>{if(!t.dataTransfer)return!1;if(s.state.readOnly)return!0;let e=t.dataTransfer.files;if(e&&e.length){let i=Array(e.length),n=0,r=()=>{++n==e.length&&du(s,t,i.filter(o=>o!=null).join(s.state.lineBreak),!1)};for(let o=0;o{/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(l.result)||(i[o]=l.result),r()},l.readAsText(e[o])}return!0}else{let i=t.dataTransfer.getData("Text");if(i)return du(s,t,i,!0),!0}return!1};me.paste=(s,t)=>{if(s.state.readOnly)return!0;s.observer.flush();let e=ac?null:t.clipboardData;return e?(hc(s,e.getData("text/plain")||e.getData("text/uri-list")),!0):(Em(s),!1)};function Nm(s,t){let e=s.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=t,i.focus(),i.selectionEnd=t.length,i.selectionStart=0,setTimeout(()=>{i.remove(),s.focus()},50)}function Bm(s){let t=[],e=[],i=!1;for(let n of s.selection.ranges)n.empty||(t.push(s.sliceDoc(n.from,n.to)),e.push(n));if(!t.length){let n=-1;for(let{from:r}of s.selection.ranges){let o=s.doc.lineAt(r);o.number>n&&(t.push(o.text),e.push({from:o.from,to:Math.min(s.doc.length,o.to+1)})),n=o.number}i=!0}return{text:Nr(s,oa,t.join(s.lineBreak)),ranges:e,linewise:i}}var Wl=null;me.copy=me.cut=(s,t)=>{let{text:e,ranges:i,linewise:n}=Bm(s.state);if(!e&&!n)return!1;Wl=n?e:null,t.type=="cut"&&!s.state.readOnly&&s.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let r=ac?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",e),!0):(Nm(s,e),!1)};var uc=Mt.define();function cc(s,t){let e=[];for(let i of s.facet(Ku)){let n=i(s,t);n&&e.push(n)}return e.length?s.update({effects:e,annotations:uc.of(!0)}):null}function dc(s){setTimeout(()=>{let t=s.hasFocus;if(t!=s.inputState.notifiedFocused){let e=cc(s.state,t);e?s.dispatch(e):s.update([])}},10)}le.focus=s=>{s.inputState.lastFocusTime=Date.now(),!s.scrollDOM.scrollTop&&(s.inputState.lastScrollTop||s.inputState.lastScrollLeft)&&(s.scrollDOM.scrollTop=s.inputState.lastScrollTop,s.scrollDOM.scrollLeft=s.inputState.lastScrollLeft),dc(s)};le.blur=s=>{s.observer.clearSelectionRange(),dc(s)};le.compositionstart=le.compositionupdate=s=>{s.observer.editContext||(s.inputState.compositionFirstChange==null&&(s.inputState.compositionFirstChange=!0),s.inputState.composing<0&&(s.inputState.composing=0))};le.compositionend=s=>{s.observer.editContext||(s.inputState.composing=-1,s.inputState.compositionEndedAt=Date.now(),s.inputState.compositionPendingKey=!0,s.inputState.compositionPendingChange=s.observer.pendingRecords().length>0,s.inputState.compositionFirstChange=null,D.chrome&&D.android?s.observer.flushSoon():s.inputState.compositionPendingChange?Promise.resolve().then(()=>s.observer.flush()):setTimeout(()=>{s.inputState.composing<0&&s.docView.hasComposition&&s.update([])},50))};le.contextmenu=s=>{s.inputState.lastContextMenu=Date.now()};me.beforeinput=(s,t)=>{var e,i;if(t.inputType=="insertReplacementText"&&s.observer.editContext){let r=(e=t.dataTransfer)===null||e===void 0?void 0:e.getData("text/plain"),o=t.getTargetRanges();if(r&&o.length){let l=o[0],a=s.posAtDOM(l.startContainer,l.startOffset),h=s.posAtDOM(l.endContainer,l.endOffset);return ha(s,{from:a,to:h,insert:s.state.toText(r)},null),!0}}let n;if(D.chrome&&D.android&&(n=oc.find(r=>r.inputType==t.inputType))&&(s.observer.delayAndroidKey(n.key,n.keyCode),n.key=="Backspace"||n.key=="Delete")){let r=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var o;(((o=window.visualViewport)===null||o===void 0?void 0:o.height)||0)>r+10&&s.hasFocus&&(s.contentDOM.blur(),s.focus())},100)}return D.ios&&t.inputType=="deleteContentForward"&&s.observer.flushSoon(),D.safari&&t.inputType=="insertText"&&s.inputState.composing>=0&&setTimeout(()=>le.compositionend(s,t),20),!1};var pu=new Set;function Lm(s){pu.has(s)||(pu.add(s),s.addEventListener("copy",()=>{}),s.addEventListener("cut",()=>{}))}var gu=["pre-wrap","normal","pre-line","break-spaces"],cn=!1;function mu(){cn=!1}var Gl=class{constructor(t){this.lineWrapping=t,this.doc=$.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){return this.lineWrapping?(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return gu.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=l;if(this.lineWrapping=l,this.lineHeight=e,this.charWidth=i,this.textHeight=n,this.lineLength=r,a){this.heightSamples={};for(let h=0;h0}set outdated(t){this.flags=(t?2:0)|this.flags&-3}setHeight(t){this.height!=t&&(Math.abs(this.height-t)>xr&&(cn=!0),this.height=t)}replace(t,e,i){return s.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,n){let r=this,o=i.doc;for(let l=n.length-1;l>=0;l--){let{fromA:a,toA:h,fromB:f,toB:u}=n[l],c=r.lineAt(a,lt.ByPosNoHeight,i.setDoc(e),0,0),d=c.to>=h?c:r.lineAt(h,lt.ByPosNoHeight,i,0,0);for(u+=d.to-h,h=d.to;l>0&&c.from<=n[l-1].toA;)a=n[l-1].fromA,f=n[l-1].fromB,l--,ar*2){let l=t[e-1];l.break?t.splice(--e,1,l.left,null,l.right):t.splice(--e,1,l.left,l.right),i+=1+l.break,n-=l.size}else if(r>n*2){let l=t[i];l.break?t.splice(i,1,l.left,null,l.right):t.splice(i,1,l.left,l.right),i+=2+l.break,r-=l.size}else break;else if(n=r&&o(this.blockAt(0,i,n,r))}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more&&this.setHeight(n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}},oe=class s extends Dr{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,n){return new Me(n,this.length,i,this.height,this.breaks)}replace(t,e,i){let n=i[0];return i.length==1&&(n instanceof s||n instanceof fi&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof fi?n=new s(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):Xt.of(i)}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more?this.setHeight(n.heights[n.index++]):(i||this.outdated)&&this.setHeight(Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},fi=class s extends Xt{constructor(t){super(t,0)}heightMetrics(t,e){let i=t.doc.lineAt(e).number,n=t.doc.lineAt(e+this.length).number,r=n-i+1,o,l=0;if(t.lineWrapping){let a=Math.min(this.height,t.lineHeight*r);o=a/r,this.length>r+1&&(l=(this.height-a)/(this.length-r-1))}else o=this.height/r;return{firstLine:i,lastLine:n,perLine:o,perChar:l}}blockAt(t,e,i,n){let{firstLine:r,lastLine:o,perLine:l,perChar:a}=this.heightMetrics(e,n);if(e.lineWrapping){let h=n+(t0){let r=i[i.length-1];r instanceof s?i[i.length-1]=new s(r.length+n):i.push(null,new s(n-1))}if(t>0){let r=i[0];r instanceof s?i[0]=new s(t+r.length):i.unshift(new s(t-1),null)}return Xt.of(i)}decomposeLeft(t,e){e.push(new s(t-1),null)}decomposeRight(t,e){e.push(null,new s(this.length-t-1))}updateHeight(t,e=0,i=!1,n){let r=e+this.length;if(n&&n.from<=e+this.length&&n.more){let o=[],l=Math.max(e,n.from),a=-1;for(n.from>e&&o.push(new s(n.from-e-1).updateHeight(t,e));l<=r&&n.more;){let f=t.doc.lineAt(l).length;o.length&&o.push(null);let u=n.heights[n.index++];a==-1?a=u:Math.abs(u-a)>=xr&&(a=-2);let c=new oe(f,u);c.outdated=!1,o.push(c),l+=f+1}l<=r&&o.push(null,new s(r-l).updateHeight(t,l));let h=Xt.of(o);return(a<0||Math.abs(h.height-this.height)>=xr||Math.abs(a-this.heightMetrics(t,e).perLine)>=xr)&&(cn=!0),Er(this,h)}else(i||this.outdated)&&(this.setHeight(t.heightForGap(e,e+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},ql=class extends Xt{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return this.flags&1}blockAt(t,e,i,n){let r=i+this.left.height;return tl))return h;let f=e==lt.ByPosNoHeight?lt.ByPosNoHeight:lt.ByPos;return a?h.join(this.right.lineAt(l,f,i,o,l)):this.left.lineAt(l,f,i,n,r).join(h)}forEachLine(t,e,i,n,r,o){let l=n+this.left.height,a=r+this.left.length+this.break;if(this.break)t=a&&this.right.forEachLine(t,e,i,l,a,o);else{let h=this.lineAt(a,lt.ByPos,i,n,r);t=t&&h.from<=e&&o(h),e>h.to&&this.right.forEachLine(h.to+1,e,i,l,a,o)}}replace(t,e,i){let n=this.left.length+this.break;if(ethis.left.length)return this.balanced(this.left,this.right.replace(t-n,e-n,i));let r=[];t>0&&this.decomposeLeft(t,r);let o=r.length;for(let l of i)r.push(l);if(t>0&&bu(r,o-1),e=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,n=i+this.break;if(t>=n)return this.right.decomposeRight(t-n,e);t2*e.size||e.size>2*t.size?Xt.of(this.break?[t,null,e]:[t,e]):(this.left=Er(this.left,t),this.right=Er(this.right,e),this.setHeight(t.height+e.height),this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,n){let{left:r,right:o}=this,l=e+r.length+this.break,a=null;return n&&n.from<=e+r.length&&n.more?a=r=r.updateHeight(t,e,i,n):r.updateHeight(t,e,i),n&&n.from<=l+o.length&&n.more?a=o=o.updateHeight(t,l,i,n):o.updateHeight(t,l,i),a?this.balanced(r,o):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function bu(s,t){let e,i;s[t]==null&&(e=s[t-1])instanceof fi&&(i=s[t+1])instanceof fi&&s.splice(t-1,3,new fi(e.length+1+i.length))}var Hm=5,jl=class s{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let i=Math.min(e,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof oe?n.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new oe(i-this.pos,-1)),this.writtenTo=i,e>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t=Hm)&&this.addLineDeco(n,r,o)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTot&&this.nodes.push(new oe(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new fi(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof oe)return t;let e=new oe(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,t),n.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(e instanceof oe)&&!this.isCovered?this.nodes.push(new oe(0,-1)):(this.writtenTof.clientHeight||f.scrollWidth>f.clientWidth)&&u.overflow!="visible"){let c=f.getBoundingClientRect();r=Math.max(r,c.left),o=Math.min(o,c.right),l=Math.max(l,c.top),a=Math.min(h==s.parentNode?n.innerHeight:a,c.bottom)}h=u.position=="absolute"||u.position=="fixed"?f.offsetParent:f.parentNode}else if(h.nodeType==11)h=h.host;else break;return{left:r-e.left,right:Math.max(r,o)-e.left,top:l-(e.top+t),bottom:Math.max(l,a)-(e.top+t)}}function zm(s){let t=s.getBoundingClientRect(),e=s.ownerDocument.defaultView||window;return t.left0&&t.top0}function Wm(s,t){let e=s.getBoundingClientRect();return{left:0,right:e.right-e.left,top:t,bottom:e.bottom-(e.top+t)}}var Zn=class{constructor(t,e,i,n){this.from=t,this.to=e,this.size=i,this.displaySize=n}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new Gl(e),this.stateDeco=t.facet(rs).filter(i=>typeof i!="function"),this.heightMap=Xt.empty().applyChanges(this.stateDeco,$.empty,this.heightOracle.setDoc(t.doc),[new Te(0,0,0,t.doc.length)]);for(let i=0;i<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());i++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=J.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let n=i?e.head:e.anchor;if(!t.some(({from:r,to:o})=>n>=r&&n<=o)){let{from:r,to:o}=this.lineBlockAt(n);t.push(new hn(r,o))}}return this.viewports=t.sort((i,n)=>i.from-n.from),this.updateScaler()}updateScaler(){let t=this.scaler;return this.scaler=this.heightMap.height<=7e6?wu:new Yl(this.heightOracle,this.heightMap,this.viewports),t.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,t=>{this.viewportLines.push(Kn(t,this.scaler))})}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(rs).filter(f=>typeof f!="function");let n=t.changedRanges,r=Te.extendWithRanges(n,Fm(i,this.stateDeco,t?t.changes:Kt.empty(this.state.doc.length))),o=this.heightMap.height,l=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);mu(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),r),(this.heightMap.height!=o||cn)&&(t.flags|=2),l?(this.scrollAnchorPos=t.changes.mapPos(l.from,-1),this.scrollAnchorHeight=l.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=o);let a=r.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let h=a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,t.flags|=this.updateForViewport(),(h||!t.changes.empty||t.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(t.changes),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(tm)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let e=t.contentDOM,i=window.getComputedStyle(e),n=this.heightOracle,r=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?gt.RTL:gt.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=e.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,f=0;if(l.width&&l.height){let{scaleX:v,scaleY:x}=Cu(e,l);(v>.005&&Math.abs(this.scaleX-v)>.005||x>.005&&Math.abs(this.scaleY-x)>.005)&&(this.scaleX=v,this.scaleY=x,h|=16,o=a=!0)}let u=(parseInt(i.paddingTop)||0)*this.scaleY,c=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=u||this.paddingBottom!=c)&&(this.paddingTop=u,this.paddingBottom=c,h|=18),this.editorWidth!=t.scrollDOM.clientWidth&&(n.lineWrapping&&(a=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=16);let d=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=Tu(t.scrollDOM);let p=(this.printing?Wm:Vm)(e,this.paddingTop),g=p.top-this.pixelViewport.top,m=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let b=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(b!=this.inView&&(this.inView=b,b&&(a=!0)),!this.inView&&!this.scrollTarget&&!zm(t.dom))return 0;let w=l.width;if((this.contentDOMWidth!=w||this.editorHeight!=t.scrollDOM.clientHeight)&&(this.contentDOMWidth=l.width,this.editorHeight=t.scrollDOM.clientHeight,h|=16),a){let v=t.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(v)&&(o=!0),o||n.lineWrapping&&Math.abs(w-this.contentDOMWidth)>n.charWidth){let{lineHeight:x,charWidth:S,textHeight:k}=t.docView.measureTextSize();o=x>0&&n.refresh(r,x,S,k,w/S,v),o&&(t.docView.minWidth=0,h|=16)}g>0&&m>0?f=Math.max(g,m):g<0&&m<0&&(f=Math.min(g,m)),mu();for(let x of this.viewports){let S=x.from==this.viewport.from?v:t.docView.measureVisibleLineHeights(x);this.heightMap=(o?Xt.empty().applyChanges(this.stateDeco,$.empty,this.heightOracle,[new Te(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(n,0,o,new Ul(x.from,S))}cn&&(h|=2)}let y=!this.viewportIsAppropriate(this.viewport,f)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return y&&(h&2&&(h|=this.updateScaler()),this.viewport=this.getViewport(f,this.scrollTarget),h|=this.updateForViewport()),(h&2||y)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),n=this.heightMap,r=this.heightOracle,{visibleTop:o,visibleBottom:l}=this,a=new hn(n.lineAt(o-i*1e3,lt.ByHeight,r,0,0).from,n.lineAt(l+(1-i)*1e3,lt.ByHeight,r,0,0).to);if(e){let{head:h}=e.range;if(ha.to){let f=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),u=n.lineAt(h,lt.ByPos,r,0,0),c;e.y=="center"?c=(u.top+u.bottom)/2-f/2:e.y=="start"||e.y=="nearest"&&h=l+Math.max(10,Math.min(i,250)))&&n>o-2*1e3&&r>1,o=n<<1;if(this.defaultTextDirection!=gt.LTR&&!i)return[];let l=[],a=(f,u,c,d)=>{if(u-ff&&bb.from>=c.from&&b.to<=c.to&&Math.abs(b.from-f)b.fromw));if(!m){if(uy.from<=u&&y.to>=u)){let y=e.moveToLineBoundary(B.cursor(u),!1,!0).head;y>f&&(u=y)}let b=this.gapSize(c,f,u,d),w=i||b<2e6?b:2e6;m=new Zn(f,u,b,w)}l.push(m)},h=f=>{if(f.length2e6)for(let S of t)S.from>=f.from&&S.fromf.from&&a(f.from,d,f,u),pe.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(t){let e=this.stateDeco;this.lineGaps.length&&(e=e.concat(this.lineGapDeco));let i=[];Y.spans(e,this.viewport.from,this.viewport.to,{span(r,o){i.push({from:r,to:o})},point(){}},20);let n=0;if(i.length!=this.visibleRanges.length)n=12;else for(let r=0;r=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find(e=>e.from<=t&&e.to>=t)||Kn(this.heightMap.lineAt(t,lt.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return t>=this.viewportLines[0].top&&t<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(e=>e.top<=t&&e.bottom>=t)||Kn(this.heightMap.lineAt(this.scaler.fromDOM(t),lt.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return Kn(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},hn=class{constructor(t,e){this.from=t,this.to=e}};function Gm(s,t,e){let i=[],n=s,r=0;return Y.spans(e,s,t,{span(){},point(o,l){o>n&&(i.push({from:n,to:o}),r+=o-n),n=l}},20),n=1)return t[t.length-1].to;let i=Math.floor(s*e);for(let n=0;;n++){let{from:r,to:o}=t[n],l=o-r;if(i<=l)return r+i;i-=l}}function mr(s,t){let e=0;for(let{from:i,to:n}of s.ranges){if(t<=n){e+=t-i;break}e+=n-i}return e/s.total}function Um(s,t){for(let e of s)if(t(e))return e}var wu={toDOM(s){return s},fromDOM(s){return s},scale:1,eq(s){return s==this}},Yl=class s{constructor(t,e,i){let n=0,r=0,o=0;this.viewports=i.map(({from:l,to:a})=>{let h=e.lineAt(l,lt.ByPos,t,0,0).top,f=e.lineAt(a,lt.ByPos,t,0,0).bottom;return n+=f-h,{from:l,to:a,top:h,bottom:f,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(e.height-n);for(let l of this.viewports)l.domTop=o+(l.top-r)*this.scale,o=l.domBottom=l.domTop+(l.bottom-l.top),r=l.bottom}toDOM(t){for(let e=0,i=0,n=0;;e++){let r=ee.from==t.viewports[i].from&&e.to==t.viewports[i].to):!1}};function Kn(s,t){if(t.scale==1)return s;let e=t.toDOM(s.top),i=t.toDOM(s.bottom);return new Me(s.from,s.length,e,i-e,Array.isArray(s._content)?s._content.map(n=>Kn(n,t)):s._content)}var br=L.define({combine:s=>s.join(" ")}),Xl=L.define({combine:s=>s.indexOf(!0)>-1}),Jl=re.newName(),pc=re.newName(),gc=re.newName(),mc={"&light":"."+pc,"&dark":"."+gc};function Ql(s,t,e){return new re(t,{finish(i){return/&/.test(i)?i.replace(/&\\w*/,n=>{if(n=="&")return s;if(!e||!e[n])throw new RangeError(`Unsupported selector: ${n}`);return e[n]}):s+" "+i}})}var qm=Ql("."+Jl,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url(\'data:image/svg+xml,\')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},mc),jm={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Ml=D.ie&&D.ie_version<=11,Zl=class{constructor(t){this.view=t,this.active=!1,this.editContext=null,this.selectionRange=new Tl,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver(e=>{for(let i of e)this.queue.push(i);(D.ie&&D.ie_version<=11||D.ios&&t.composing)&&e.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&t.constructor.EDIT_CONTEXT!==!1&&!(D.chrome&&D.chrome_version<126)&&(this.editContext=new ta(t),t.state.facet(Xe)&&(t.contentDOM.editContext=this.editContext.editContext)),Ml&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var e;((e=this.view.docView)===null||e===void 0?void 0:e.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(t){(t.type=="change"||!t.type)&&!t.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some((e,i)=>e!=t[i]))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(Xe)?i.root.activeElement!=this.dom:!yr(this.dom,n))return;let r=n.anchorNode&&i.docView.nearest(n.anchorNode);if(r&&r.ignoreEvent(t)){e||(this.selectionChanged=!1);return}(D.ie&&D.ie_version<=11||D.android&&D.chrome)&&!i.state.selection.main.empty&&n.focusNode&&Yn(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=ts(t.root);if(!e)return!1;let i=D.safari&&t.root.nodeType==11&&t.root.activeElement==this.dom&&$m(this.view,e)||e;if(!i||this.selectionRange.eq(i))return!1;let n=yr(this.dom,i);return n&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime{let r=this.delayedAndroidKey;r&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=r.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&r.force&&fn(this.dom,r.key,r.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||t=="Enter")&&(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,n=!1;for(let r of t){let o=this.readMutation(r);o&&(o.typeOver&&(n=!0),e==-1?{from:e,to:i}=o:(e=Math.min(o.from,e),i=Math.max(o.to,i)))}return{from:e,to:i,typeOver:n}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),n=this.selectionChanged&&yr(this.dom,this.selectionRange);if(t<0&&!n)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let r=new Fl(this.view,t,e,i);return this.view.docView.domChanged={newSel:r.newSel?r.newSel.main:null},r}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,n=rc(this.view,e);return this.view.state==i&&(e.domChanged||e.newSel&&!e.newSel.main.eq(this.view.state.selection.main))&&this.view.update([]),n}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty(t.type=="attributes"),t.type=="attributes"&&(e.flags|=4),t.type=="childList"){let i=yu(e,t.previousSibling||t.target.previousSibling,-1),n=yu(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:n?e.posBefore(n):e.posAtEnd,typeOver:!1}}else return t.type=="characterData"?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}update(t){this.editContext&&(this.editContext.update(t),t.startState.facet(Xe)!=t.state.facet(Xe)&&(t.view.contentDOM.editContext=t.state.facet(Xe)?this.editContext.editContext:null))}destroy(){var t,e,i;this.stop(),(t=this.intersection)===null||t===void 0||t.disconnect(),(e=this.gapIntersection)===null||e===void 0||e.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let n of this.scrollTargets)n.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function yu(s,t,e){for(;t;){let i=nt.get(t);if(i&&i.parent==s)return i;let n=t.parentNode;t=n!=s.dom?n:e>0?t.nextSibling:t.previousSibling}return null}function vu(s,t){let e=t.startContainer,i=t.startOffset,n=t.endContainer,r=t.endOffset,o=s.docView.domAtPos(s.state.selection.main.anchor);return Yn(o.node,o.offset,n,r)&&([e,i,n,r]=[n,r,e,i]),{anchorNode:e,anchorOffset:i,focusNode:n,focusOffset:r}}function $m(s,t){if(t.getComposedRanges){let n=t.getComposedRanges(s.root)[0];if(n)return vu(s,n)}let e=null;function i(n){n.preventDefault(),n.stopImmediatePropagation(),e=n.getTargetRanges()[0]}return s.contentDOM.addEventListener("beforeinput",i,!0),s.dom.ownerDocument.execCommand("indent"),s.contentDOM.removeEventListener("beforeinput",i,!0),e?vu(s,e):null}var ta=class{constructor(t){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(t.state);let e=this.editContext=new window.EditContext({text:t.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,t.state.selection.main.anchor))),selectionEnd:this.toContextPos(t.state.selection.main.head)});this.handlers.textupdate=i=>{let n=t.state.selection.main,{anchor:r,head:o}=n,l=this.toEditorPos(i.updateRangeStart),a=this.toEditorPos(i.updateRangeEnd);t.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:l,drifted:!1});let h={from:l,to:a,insert:$.of(i.text.split(`\n`))};if(h.from==this.from&&rthis.to&&(h.to=r),h.from==h.to&&!h.insert.length){let f=B.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));f.main.eq(n)||t.dispatch({selection:f,userEvent:"select"});return}if((D.mac||D.android)&&h.from==o-1&&/^\\. ?$/.test(i.text)&&t.contentDOM.getAttribute("autocorrect")=="off"&&(h={from:l,to:a,insert:$.of([i.text.replace("."," ")])}),this.pendingContextChange=h,!t.state.readOnly){let f=this.to-this.from+(h.to-h.from+h.insert.length);ha(t,h,B.single(this.toEditorPos(i.selectionStart,f),this.toEditorPos(i.selectionEnd,f)))}this.pendingContextChange&&(this.revertPending(t.state),this.setSelection(t.state))},this.handlers.characterboundsupdate=i=>{let n=[],r=null;for(let o=this.toEditorPos(i.rangeStart),l=this.toEditorPos(i.rangeEnd);o{let n=[];for(let r of i.getTextFormats()){let o=r.underlineStyle,l=r.underlineThickness;if(o!="None"&&l!="None"){let a=this.toEditorPos(r.rangeStart),h=this.toEditorPos(r.rangeEnd);if(a{t.inputState.composing<0&&(t.inputState.composing=0,t.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(t.inputState.composing=-1,t.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(t.state)}};for(let i in this.handlers)e.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let n=ts(i.root);n&&n.rangeCount&&this.editContext.updateSelectionBounds(n.getRangeAt(0).getBoundingClientRect())}}}applyEdits(t){let e=0,i=!1,n=this.pendingContextChange;return t.changes.iterChanges((r,o,l,a,h)=>{if(i)return;let f=h.length-(o-r);if(n&&o>=n.to)if(n.from==r&&n.to==o&&n.insert.eq(h)){n=this.pendingContextChange=null,e+=f,this.to+=f;return}else n=null,this.revertPending(t.state);if(r+=e,o+=e,o<=this.from)this.from+=f,this.to+=f;else if(rthis.to||this.to-this.from+h.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(r),this.toContextPos(o),h.toString()),this.to+=f}e+=f}),n&&!i&&this.revertPending(t.state),!i}update(t){let e=this.pendingContextChange,i=t.startState.selection.main;this.composing&&(this.composing.drifted||!t.changes.touchesRange(i.from,i.to)&&t.transactions.some(n=>!n.isUserEvent("input.type")&&n.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=t.changes.mapPos(this.composing.editorBase)):!this.applyEdits(t)||!this.rangeIsValid(t.state)?(this.pendingContextChange=null,this.reset(t.state)):(t.docChanged||t.selectionSet||e)&&this.setSelection(t.state),(t.geometryChanged||t.docChanged||t.selectionSet)&&t.view.requestMeasure(this.measureReq)}resetRange(t){let{head:e}=t.selection.main;this.from=Math.max(0,e-1e4),this.to=Math.min(t.doc.length,e+1e4)}reset(t){this.resetRange(t),this.editContext.updateText(0,this.editContext.text.length,t.doc.sliceString(this.from,this.to)),this.setSelection(t)}revertPending(t){let e=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(e.from),this.toContextPos(e.from+e.insert.length),t.doc.sliceString(e.from,e.to))}setSelection(t){let{main:e}=t.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,e.anchor))),n=this.toContextPos(e.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=n)&&this.editContext.updateSelection(i,n)}rangeIsValid(t){let{head:e}=t.selection.main;return!(this.from>0&&e-this.from<500||this.to1e4*3)}toEditorPos(t,e=this.to-this.from){t=Math.min(t,e);let i=this.composing;return i&&i.drifted?i.editorBase+(t-i.contextBase):t+this.from}toContextPos(t){let e=this.composing;return e&&e.drifted?e.contextBase+(t-e.editorBase):t-this.from}destroy(){for(let t in this.handlers)this.editContext.removeEventListener(t,this.handlers[t])}},G=class s{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){var e;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:i}=t;this.dispatchTransactions=t.dispatchTransactions||i&&(n=>n.forEach(r=>i(r,this)))||(n=>this.update(n)),this.dispatch=this.dispatch.bind(this),this._root=t.root||Lg(t.parent)||document,this.viewState=new Rr(t.state||ut.create(t)),t.scrollTo&&t.scrollTo.is(cr)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(qn).map(n=>new Qn(n));for(let n of this.plugins)n.update(this);this.observer=new Zl(this),this.inputState=new Vl(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Or(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((e=document.fonts)===null||e===void 0)&&e.ready&&document.fonts.ready.then(()=>this.requestMeasure())}dispatch(...t){let e=t.length==1&&t[0]instanceof zt?t:t.length==1&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e=!1,i=!1,n,r=this.state;for(let c of t){if(c.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn\'t start from the previous state.");r=c.state}if(this.destroyed){this.viewState.state=r;return}let o=this.hasFocus,l=0,a=null;t.some(c=>c.annotation(uc))?(this.inputState.notifiedFocused=o,l=1):o!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=o,a=cc(r,o),a||(l=1));let h=this.observer.delayedAndroidKey,f=null;if(h?(this.observer.clearDelayedAndroidKey(),f=this.observer.readChange(),(f&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(f=null)):this.observer.clear(),r.facet(ut.phrases)!=this.state.facet(ut.phrases))return this.setState(r);n=Tr.create(this,r,t),n.flags|=l;let u=this.viewState.scrollTarget;try{this.updateState=2;for(let c of t){if(u&&(u=u.map(c.changes)),c.scrollIntoView){let{main:d}=c.state.selection;u=new Jn(d.empty?d:B.cursor(d.head,d.head>d.anchor?-1:1))}for(let d of c.effects)d.is(cr)&&(u=d.value.clip(this.state))}this.viewState.update(n,u),this.bidiCache=Pr.update(this.bidiCache,n.changes),n.empty||(this.updatePlugins(n),this.inputState.update(n)),e=this.docView.update(n),this.state.facet(jn)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(e,t.some(c=>c.isUserEvent("select.pointer")))}finally{this.updateState=0}if(n.startState.facet(br)!=n.state.facet(br)&&(this.viewState.mustMeasureContent=!0),(e||i||u||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),e&&this.docViewUpdate(),!n.empty)for(let c of this.state.facet(Bl))try{c(n)}catch(d){ge(this.state,d,"update listener")}(a||f)&&Promise.resolve().then(()=>{a&&this.state==a.startState&&this.dispatch(a),f&&!rc(this,f)&&h.force&&fn(this.contentDOM,h.key,h.keyCode)})}setState(t){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=t;return}this.updateState=2;let e=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new Rr(t),this.plugins=t.facet(qn).map(i=>new Qn(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new Or(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(qn),i=t.state.facet(qn);if(e!=i){let n=[];for(let r of i){let o=e.indexOf(r);if(o<0)n.push(new Qn(r));else{let l=this.plugins[o];l.mustUpdate=t,n.push(l)}}for(let r of this.plugins)r.mustUpdate!=t&&r.destroy(this);this.plugins=n,this.pluginMap.clear()}else for(let n of this.plugins)n.mustUpdate=t;for(let n=0;n-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,n=i.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:o}=this.viewState;Math.abs(n-this.viewState.scrollTop)>1&&(o=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(o<0)if(Tu(i))r=-1,o=this.viewState.heightMap.height;else{let d=this.viewState.scrollAnchorAt(n);r=d.from,o=d.top}this.updateState=1;let a=this.viewState.measure(this);if(!a&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let h=[];a&4||([this.measureRequests,h]=[h,this.measureRequests]);let f=h.map(d=>{try{return d.read(this)}catch(p){return ge(this.state,p),ku}}),u=Tr.create(this,this.state,[]),c=!1;u.flags|=a,e?e.flags|=a:e=u,this.updateState=2,u.empty||(this.updatePlugins(u),this.inputState.update(u),this.updateAttrs(),c=this.docView.update(u),c&&this.docViewUpdate());for(let d=0;d1||p<-1){n=n+p,i.scrollTop=n/this.scaleY,o=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let l of this.state.facet(Bl))l(e)}get themeClasses(){return Jl+" "+(this.state.facet(Xl)?gc:pc)+" "+this.state.facet(br)}updateAttrs(){let t=xu(this,Qu,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(Xe)?"true":"false",class:"cm-content",style:`${D.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),xu(this,la,e);let i=this.observer.ignore(()=>{let n=Rl(this.contentDOM,this.contentAttrs,e),r=Rl(this.dom,this.editorAttrs,t);return n||r});return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let n of i.effects)if(n.is(s.announce)){e&&(this.announceDOM.textContent=""),e=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=n.value}}mountStyles(){this.styleModules=this.state.facet(jn);let t=this.state.facet(s.cspNonce);re.mount(this.root,this.styleModules.concat(qm).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn\'t allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),t){if(this.measureRequests.indexOf(t)>-1)return;if(t.key!=null){for(let e=0;ei.spec==t)||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return Cl(this,t,ru(this,t,e,i))}moveByGroup(t,e){return Cl(this,t,ru(this,t,e,i=>mm(this,t.head,i)))}visualLineSide(t,e){let i=this.bidiSpans(t),n=this.textDirectionAt(t.from),r=i[e?i.length-1:0];return B.cursor(r.side(e,n)+t.from,r.forward(!e,n)?1:-1)}moveToLineBoundary(t,e,i=!0){return gm(this,t,e,i)}moveVertically(t,e,i){return Cl(this,t,bm(this,t,e,i))}domAtPos(t){return this.docView.domAtPos(t)}posAtDOM(t,e=0){return this.docView.posFromDOM(t,e)}posAtCoords(t,e=!0){return this.readMeasured(),sc(this,t,e)}coordsAtPos(t,e=1){this.readMeasured();let i=this.docView.coordsAt(t,e);if(!i||i.left==i.right)return i;let n=this.state.doc.lineAt(t),r=this.bidiSpans(n),o=r[Ae.find(r,t-n.from,-1,e)];return os(i,o.dir==gt.LTR==e>0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(Yu)||tthis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>Km)return zu(t.length);let e=this.textDirectionAt(t.from),i;for(let r of this.bidiCache)if(r.from==t.from&&r.dir==e&&(r.fresh||Vu(r.isolates,i=tu(this,t))))return r.order;i||(i=tu(this,t));let n=Jg(t.text,e,i);return this.bidiCache.push(new Pr(t.from,t.to,e,i,!0,n)),n}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||D.safari&&((t=this.inputState)===null||t===void 0?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{Mu(this.contentDOM),this.docView.updateSelection()})}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((t.nodeType==9?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return cr.of(new Jn(typeof t=="number"?B.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return cr.of(new Jn(B.cursor(i.from),"start","start",i.top-t,e,!0))}setTabFocusMode(t){t==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof t=="boolean"?this.inputState.tabFocusMode=t?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+t)}static domEventHandlers(t){return Je.define(()=>({}),{eventHandlers:t})}static domEventObservers(t){return Je.define(()=>({}),{eventObservers:t})}static theme(t,e){let i=re.newName(),n=[br.of(i),jn.of(Ql(`.${i}`,t))];return e&&e.dark&&n.push(Xl.of(!0)),n}static baseTheme(t){return on.lowest(jn.of(Ql("."+Jl,t,mc)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),n=i&&nt.get(i)||nt.get(t);return((e=n==null?void 0:n.rootView)===null||e===void 0?void 0:e.view)||null}};G.styleModule=jn;G.inputHandler=$u;G.clipboardInputFilter=ra;G.clipboardOutputFilter=oa;G.scrollHandler=Xu;G.focusChangeEffect=Ku;G.perLineTextDirection=Yu;G.exceptionSink=ju;G.updateListener=Bl;G.editable=Xe;G.mouseSelectionStyle=qu;G.dragMovesSelection=Uu;G.clickAddsSelectionRange=Gu;G.decorations=rs;G.outerDecorations=Zu;G.atomicRanges=aa;G.bidiIsolatedRanges=tc;G.scrollMargins=ec;G.darkTheme=Xl;G.cspNonce=L.define({combine:s=>s.length?s[0]:""});G.contentAttributes=la;G.editorAttributes=Qu;G.lineWrapping=G.contentAttributes.of({class:"cm-lineWrapping"});G.announce=ot.define();var Km=4096,ku={},Pr=class s{constructor(t,e,i,n,r,o){this.from=t,this.to=e,this.dir=i,this.isolates=n,this.fresh=r,this.order=o}static update(t,e){if(e.empty&&!t.some(r=>r.fresh))return t;let i=[],n=t.length?t[t.length-1].dir:gt.LTR;for(let r=Math.max(0,t.length-10);r=0;n--){let r=i[n],o=typeof r=="function"?r(s):r;o&&Dl(o,e)}return e}var Ym=D.mac?"mac":D.windows?"win":D.linux?"linux":"key";function Xm(s,t){let e=s.split(/-(?!$)/),i=e[e.length-1];i=="Space"&&(i=" ");let n,r,o,l;for(let a=0;ai.concat(n),[]))),e}var hi=null,Zm=4e3;function t0(s,t=Ym){let e=Object.create(null),i=Object.create(null),n=(o,l)=>{let a=i[o];if(a==null)i[o]=l;else if(a!=l)throw new Error("Key binding "+o+" is used both as a regular binding and as a multi-stroke prefix")},r=(o,l,a,h,f)=>{var u,c;let d=e[o]||(e[o]=Object.create(null)),p=l.split(/ (?!$)/).map(b=>Xm(b,t));for(let b=1;b{let v=hi={view:y,prefix:w,scope:o};return setTimeout(()=>{hi==v&&(hi=null)},Zm),!0}]})}let g=p.join(" ");n(g,!1);let m=d[g]||(d[g]={preventDefault:!1,stopPropagation:!1,run:((c=(u=d._any)===null||u===void 0?void 0:u.run)===null||c===void 0?void 0:c.slice())||[]});a&&m.run.push(a),h&&(m.preventDefault=!0),f&&(m.stopPropagation=!0)};for(let o of s){let l=o.scope?o.scope.split(" "):["editor"];if(o.any)for(let h of l){let f=e[h]||(e[h]=Object.create(null));f._any||(f._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:u}=o;for(let c in f)f[c].run.push(d=>u(d,ea))}let a=o[t]||o.key;if(a)for(let h of l)r(h,a,o.run,o.preventDefault,o.stopPropagation),o.shift&&r(h,"Shift-"+a,o.shift,o.preventDefault,o.stopPropagation)}return e}var ea=null;function e0(s,t,e,i){ea=t;let n=jf(t),r=Ef(n,0),o=Df(r)==n.length&&n!=" ",l="",a=!1,h=!1,f=!1;hi&&hi.view==e&&hi.scope==i&&(l=hi.prefix+" ",lc.indexOf(t.keyCode)<0&&(h=!0,hi=null));let u=new Set,c=m=>{if(m){for(let b of m.run)if(!u.has(b)&&(u.add(b),b(e)))return m.stopPropagation&&(f=!0),!0;m.preventDefault&&(m.stopPropagation&&(f=!0),h=!0)}return!1},d=s[i],p,g;return d&&(c(d[l+wr(n,t,!o)])?a=!0:o&&(t.altKey||t.metaKey||t.ctrlKey)&&!(D.windows&&t.ctrlKey&&t.altKey)&&(p=Ye[t.keyCode])&&p!=n?(c(d[l+wr(p,t,!0)])||t.shiftKey&&(g=ln[t.keyCode])!=n&&g!=p&&c(d[l+wr(g,t,!1)]))&&(a=!0):o&&t.shiftKey&&c(d[l+wr(n,t,!0)])&&(a=!0),!a&&c(d._any)&&(a=!0)),h&&(a=!0),a&&f&&t.stopPropagation(),ea=null,a}var ky=/x/.unicode!=null?"gu":"g";var ia=class extends Ni{constructor(t){super(),this.content=t}toDOM(t){let e=document.createElement("span");return e.className="cm-placeholder",e.style.pointerEvents="none",e.appendChild(typeof this.content=="string"?document.createTextNode(this.content):typeof this.content=="function"?this.content(t):this.content.cloneNode(!0)),e.setAttribute("aria-hidden","true"),e}coordsAt(t){let e=t.firstChild?un(t.firstChild):[];if(!e.length)return null;let i=window.getComputedStyle(t.parentNode),n=os(e[0],i.direction!="rtl"),r=parseInt(i.lineHeight);return n.bottom-n.top>r*1.5?{left:n.left,right:n.right,top:n.top,bottom:n.top+r}:n}ignoreEvent(){return!1}};function bc(s){let t=Je.fromClass(class{constructor(e){this.view=e,this.placeholder=s?J.set([J.widget({widget:new ia(s),side:1}).range(0)]):J.none}get decorations(){return this.view.state.doc.length?J.none:this.placeholder}},{decorations:e=>e.decorations});return typeof s=="string"?[t,G.contentAttributes.of({"aria-placeholder":s})]:t}var xy=G.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:`${7*2}px`,position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"\'\'",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}});var be=class extends $e{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}};be.prototype.elementClass="";be.prototype.toDOM=void 0;be.prototype.mapMode=Vt.TrackBefore;be.prototype.startSide=be.prototype.endSide=-1;be.prototype.point=!0;var Br=L.define();var i0=0,ls=class{constructor(t,e){this.from=t,this.to=e}},Q=class{constructor(t={}){this.id=i0++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn\'t define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can\'t add per-node props to node types");return typeof t!="function"&&(t=ae.match(t)),e=>{let i=t(e);return i===void 0?null:[this,i]}}};Q.closedBy=new Q({deserialize:s=>s.split(" ")});Q.openedBy=new Q({deserialize:s=>s.split(" ")});Q.group=new Q({deserialize:s=>s.split(" ")});Q.isolate=new Q({deserialize:s=>{if(s&&s!="rtl"&&s!="ltr"&&s!="auto")throw new RangeError("Invalid value for isolate: "+s);return s||"auto"}});Q.contextHash=new Q({perNode:!0});Q.lookAhead=new Q({perNode:!0});Q.mounted=new Q({perNode:!0});var dn=class{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[Q.mounted.id]}},n0=Object.create(null),ae=class s{constructor(t,e,i,n=0){this.name=t,this.props=e,this.id=i,this.flags=n}static define(t){let e=t.props&&t.props.length?Object.create(null):n0,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(t.name==null?8:0),n=new s(t.name||"",e,t.id,i);if(t.props){for(let r of t.props)if(Array.isArray(r)||(r=r(n)),r){if(r[0].perNode)throw new RangeError("Can\'t store a per-node prop on a node type");e[r[0].id]=r[1]}}return n}prop(t){return this.props[t.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(t){if(typeof t=="string"){if(this.name==t)return!0;let e=this.prop(Q.group);return e?e.indexOf(t)>-1:!1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let n of i.split(" "))e[n]=t[i];return i=>{for(let n=i.prop(Q.group),r=-1;r<(n?n.length:0);r++){let o=e[r<0?i.name:n[r]];if(o)return o}}}};ae.none=new ae("",Object.create(null),0,8);var Lr=new WeakMap,wc=new WeakMap,kt;(function(s){s[s.ExcludeBuffers=1]="ExcludeBuffers",s[s.IncludeAnonymous=2]="IncludeAnonymous",s[s.IgnoreMounts=4]="IgnoreMounts",s[s.IgnoreOverlays=8]="IgnoreOverlays"})(kt||(kt={}));var Dt=class s{constructor(t,e,i,n,r){if(this.type=t,this.children=e,this.positions=i,this.length=n,this.props=null,r&&r.length){this.props=Object.create(null);for(let[o,l]of r)this.props[typeof o=="number"?o:o.id]=l}}toString(){let t=dn.get(this);if(t&&!t.overlay)return t.tree.toString();let e="";for(let i of this.children){let n=i.toString();n&&(e&&(e+=","),e+=n)}return this.type.name?(/\\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(e.length?"("+e+")":""):e}cursor(t=0){return new fs(this.topNode,t)}cursorAt(t,e=0,i=0){let n=Lr.get(this)||this.topNode,r=new fs(n);return r.moveTo(t,e),Lr.set(this,r._tree),r}get topNode(){return new Ee(this,0,0,null)}resolve(t,e=0){let i=as(Lr.get(this)||this.topNode,t,e,!1);return Lr.set(this,i),i}resolveInner(t,e=0){let i=as(wc.get(this)||this.topNode,t,e,!0);return wc.set(this,i),i}resolveStack(t,e=0){return s0(this,t,e)}iterate(t){let{enter:e,leave:i,from:n=0,to:r=this.length}=t,o=t.mode||0,l=(o&kt.IncludeAnonymous)>0;for(let a=this.cursor(o|kt.IncludeAnonymous);;){let h=!1;if(a.from<=r&&a.to>=n&&(!l&&a.type.isAnonymous||e(a)!==!1)){if(a.firstChild())continue;h=!0}for(;h&&i&&(l||!a.type.isAnonymous)&&i(a),!a.nextSibling();){if(!a.parent())return;h=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:ba(ae.none,this.children,this.positions,0,this.children.length,0,this.length,(e,i,n)=>new s(this.type,e,i,n,this.propValues),t.makeTree||((e,i,n)=>new s(ae.none,e,i,n)))}static build(t){return r0(t)}};Dt.empty=new Dt(ae.none,[],[],0);var ua=class s{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new s(this.buffer,this.index)}},pi=class s{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return ae.none}toString(){let t=[];for(let e=0;e0));a=o[a+3]);return l}slice(t,e,i){let n=this.buffer,r=new Uint16Array(e-t),o=0;for(let l=t,a=0;l=t&&et;case 1:return e<=t&&i>t;case 2:return i>t;case 4:return!0}}function as(s,t,e,i){for(var n;s.from==s.to||(e<1?s.from>=t:s.from>t)||(e>-1?s.to<=t:s.to0?l.length:-1;t!=h;t+=e){let f=l[t],u=a[t]+o.from;if(kc(n,i,u,u+f.length)){if(f instanceof pi){if(r&kt.ExcludeBuffers)continue;let c=f.findChild(0,f.buffer.length,e,i-u,n);if(c>-1)return new hs(new da(o,f,t,u),null,c)}else if(r&kt.IncludeAnonymous||!f.type.isAnonymous||ma(f)){let c;if(!(r&kt.IgnoreMounts)&&(c=dn.get(f))&&!c.overlay)return new s(c.tree,u,t,o);let d=new s(f,u,t,o);return r&kt.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(e<0?f.children.length-1:0,e,i,n)}}}if(r&kt.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?t=o.index+e:t=e<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let n;if(!(i&kt.IgnoreOverlays)&&(n=dn.get(this._tree))&&n.overlay){let r=t-this.from;for(let{from:o,to:l}of n.overlay)if((e>0?o<=r:o=r:l>r))return new s(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function yc(s,t,e,i){let n=s.cursor(),r=[];if(!n.firstChild())return r;if(e!=null){for(let o=!1;!o;)if(o=n.type.is(e),!n.nextSibling())return r}for(;;){if(i!=null&&n.type.is(i))return r;if(n.type.is(t)&&r.push(n.node),!n.nextSibling())return i==null?r:[]}}function ca(s,t,e=t.length-1){for(let i=s;e>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(t[e]&&t[e]!=i.name)return!1;e--}}return!0}var da=class{constructor(t,e,i,n){this.parent=t,this.buffer=e,this.index=i,this.start=n}},hs=class s extends Fr{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:n}=this.context,r=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.context.start,i);return r<0?null:new s(this.context,this,r)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&kt.ExcludeBuffers)return null;let{buffer:n}=this.context,r=n.findChild(this.index+4,n.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return r<0?null:new s(this.context,this,r)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new s(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new s(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,n=this.index+4,r=i.buffer[this.index+3];if(r>n){let o=i.buffer[this.index+1];t.push(i.slice(n,r,o)),e.push(0)}return new Dt(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function xc(s){if(!s.length)return null;let t=0,e=s[0];for(let r=1;re.from||o.to=t){let l=new Ee(o.tree,o.overlay[0].from+r.from,-1,r);(n||(n=[i])).push(as(l,t,e,!1))}}return n?xc(n):i}var fs=class{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof Ee)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let i=t._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return t?(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0):!1}yieldBuf(t,e){this.index=t;let{start:i,buffer:n}=this.buffer;return this.type=e||n.set.types[n.buffer[t]],this.from=i+n.buffer[t+1],this.to=i+n.buffer[t+2],!0}yield(t){return t?t instanceof Ee?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,i){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,i,this.mode));let{buffer:n}=this.buffer,r=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.buffer.start,i);return r<0?!1:(this.stack.push(this.index),this.yieldBuf(r))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,i=this.mode){return this.buffer?i&kt.ExcludeBuffers?!1:this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&kt.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&kt.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode)):!1;let{buffer:e}=this.buffer,i=this.stack.length-1;if(t<0){let n=i<0?0:this.stack[i]+4;if(this.index!=n)return this.yieldBuf(e.findChild(n,this.index,-1,0,4))}else{let n=e.buffer[this.index+3];if(n<(i<0?e.buffer.length:e.buffer[this.stack[i]+3]))return this.yieldBuf(n)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,i,{buffer:n}=this;if(n){if(t>0){if(this.index-1)for(let r=e+t,o=t<0?-1:i._tree.children.length;r!=o;r+=t){let l=i._tree.children[r];if(this.mode&kt.IncludeAnonymous||l instanceof pi||!l.type.isAnonymous||ma(l))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to=0;){for(let o=t;o;o=o._parent)if(o.index==n){if(n==this.index)return o;e=o,i=r+1;break t}n=this.stack[--r]}for(let n=i;n=0;r--){if(r<0)return ca(this._tree,t,n);let o=i[e.buffer[this.stack[r]]];if(!o.isAnonymous){if(t[n]&&t[n]!=o.name)return!1;n--}}return!0}};function ma(s){return s.children.some(t=>t instanceof pi||!t.type.isAnonymous||ma(t))}function r0(s){var t;let{buffer:e,nodeSet:i,maxBufferLength:n=1024,reused:r=[],minRepeatType:o=i.types.length}=s,l=Array.isArray(e)?new ua(e,e.length):e,a=i.types,h=0,f=0;function u(x,S,k,P,R,z){let{id:E,start:M,end:H,size:F}=l,q=f,St=h;for(;F<0;)if(l.next(),F==-1){let vt=r[E];k.push(vt),P.push(M-x);return}else if(F==-3){h=E;return}else if(F==-4){f=E;return}else throw new RangeError(`Unrecognized record size: ${F}`);let pe=a[E],qe,Nt,Ln=M-x;if(H-M<=n&&(Nt=m(l.pos-S,R))){let vt=new Uint16Array(Nt.size-Nt.skip),rt=l.pos-Nt.size,ft=vt.length;for(;l.pos>rt;)ft=b(Nt.start,vt,ft);qe=new pi(vt,H-Nt.start,i),Ln=Nt.start-x}else{let vt=l.pos-F;l.next();let rt=[],ft=[],Bt=E>=o?E:-1,qt=0,je=H;for(;l.pos>vt;)Bt>=0&&l.id==Bt&&l.size>=0?(l.end<=je-n&&(p(rt,ft,M,qt,l.end,je,Bt,q,St),qt=rt.length,je=l.end),l.next()):z>2500?c(M,vt,rt,ft):u(M,vt,rt,ft,Bt,z+1);if(Bt>=0&&qt>0&&qt-1&&qt>0){let Hn=d(pe,St);qe=ba(pe,rt,ft,0,rt.length,0,H-M,Hn,Hn)}else qe=g(pe,rt,ft,H-M,q-H,St)}k.push(qe),P.push(Ln)}function c(x,S,k,P){let R=[],z=0,E=-1;for(;l.pos>S;){let{id:M,start:H,end:F,size:q}=l;if(q>4)l.next();else{if(E>-1&&H=0;F-=3)M[q++]=R[F],M[q++]=R[F+1]-H,M[q++]=R[F+2]-H,M[q++]=q;k.push(new pi(M,R[2]-H,i)),P.push(H-x)}}function d(x,S){return(k,P,R)=>{let z=0,E=k.length-1,M,H;if(E>=0&&(M=k[E])instanceof Dt){if(!E&&M.type==x&&M.length==R)return M;(H=M.prop(Q.lookAhead))&&(z=P[E]+M.length+H)}return g(x,k,P,R,z,S)}}function p(x,S,k,P,R,z,E,M,H){let F=[],q=[];for(;x.length>P;)F.push(x.pop()),q.push(S.pop()+k-R);x.push(g(i.types[E],F,q,z-R,M-z,H)),S.push(R-k)}function g(x,S,k,P,R,z,E){if(z){let M=[Q.contextHash,z];E=E?[M].concat(E):[M]}if(R>25){let M=[Q.lookAhead,R];E=E?[M].concat(E):[M]}return new Dt(x,S,k,P,E)}function m(x,S){let k=l.fork(),P=0,R=0,z=0,E=k.end-n,M={size:0,start:0,skip:0};t:for(let H=k.pos-x;k.pos>H;){let F=k.size;if(k.id==S&&F>=0){M.size=P,M.start=R,M.skip=z,z+=4,P+=4,k.next();continue}let q=k.pos-F;if(F<0||q=o?4:0,pe=k.start;for(k.next();k.pos>q;){if(k.size<0)if(k.size==-3)St+=4;else break t;else k.id>=o&&(St+=4);k.next()}R=pe,P+=F,z+=St}return(S<0||P==x)&&(M.size=P,M.start=R,M.skip=z),M.size>4?M:void 0}function b(x,S,k){let{id:P,start:R,end:z,size:E}=l;if(l.next(),E>=0&&P4){let H=l.pos-(E-4);for(;l.pos>H;)k=b(x,S,k)}S[--k]=M,S[--k]=z-x,S[--k]=R-x,S[--k]=P}else E==-3?h=P:E==-4&&(f=P);return k}let w=[],y=[];for(;l.pos>0;)u(s.start||0,s.bufferStart||0,w,y,-1,0);let v=(t=s.length)!==null&&t!==void 0?t:w.length?y[0]+w[0].length:0;return new Dt(a[s.topID],w.reverse(),y.reverse(),v)}var vc=new WeakMap;function Hr(s,t){if(!s.isAnonymous||t instanceof pi||t.type!=s)return 1;let e=vc.get(t);if(e==null){e=1;for(let i of t.children){if(i.type!=s||!(i instanceof Dt)){e=1;break}e+=Hr(s,i)}vc.set(t,e)}return e}function ba(s,t,e,i,n,r,o,l,a){let h=0;for(let p=i;p=f)break;S+=k}if(y==v+1){if(S>f){let k=p[v];d(k.children,k.positions,0,k.children.length,g[v]+w);continue}u.push(p[v])}else{let k=g[y-1]+p[y-1].length-x;u.push(ba(s,p,g,v,y,x,k,null,a))}c.push(x+w-r)}}return d(t,e,i,n,0),(l||a)(u,c,o)}var we=class s{constructor(t,e,i,n,r=!1,o=!1){this.from=t,this.to=e,this.tree=i,this.offset=n,this.open=(r?1:0)|(o?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(t,e=[],i=!1){let n=[new s(0,t.length,t,0,!1,i)];for(let r of e)r.to>t.length&&n.push(r);return n}static applyChanges(t,e,i=128){if(!e.length)return t;let n=[],r=1,o=t.length?t[0]:null;for(let l=0,a=0,h=0;;l++){let f=l=i)for(;o&&o.from=c.from||u<=c.to||h){let d=Math.max(c.from,a)-h,p=Math.min(c.to,u)-h;c=d>=p?null:new s(d,p,c.tree,c.offset+h,l>0,!!f)}if(c&&n.push(c),o.to>u)break;o=rnew ls(n.from,n.to)):[new ls(0,0)]:[new ls(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let n=this.startParse(t,e,i);for(;;){let r=n.advance();if(r)return r}}},ga=class{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}};var Py=new Q({perNode:!0});var o0=0,ye=class s{constructor(t,e,i,n){this.name=t,this.set=e,this.base=i,this.modified=n,this.id=o0++}toString(){let{name:t}=this;for(let e of this.modified)e.name&&(t=`${e.name}(${t})`);return t}static define(t,e){let i=typeof t=="string"?t:"?";if(t instanceof s&&(e=t),e!=null&&e.base)throw new Error("Can not derive from a modified tag");let n=new s(i,[],null,[]);if(n.set.push(n),e)for(let r of e.set)n.set.push(r);return n}static defineModifier(t){let e=new Ur(t);return i=>i.modified.indexOf(e)>-1?i:Ur.get(i.base||i,i.modified.concat(e).sort((n,r)=>n.id-r.id))}},l0=0,Ur=class s{constructor(t){this.name=t,this.instances=[],this.id=l0++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find(l=>l.base==t&&a0(e,l.modified));if(i)return i;let n=[],r=new ye(t.name,n,t,e);for(let l of e)l.instances.push(r);let o=h0(e);for(let l of t.set)if(!l.modified.length)for(let a of o)n.push(s.get(l,a));return r}};function a0(s,t){return s.length==t.length&&s.every((e,i)=>e==t[i])}function h0(s){let t=[[]];for(let e=0;ei.length-e.length)}var By=new Q,qr=class{constructor(t,e,i,n){this.tags=t,this.mode=e,this.context=i,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(t){return!t||t.depth{let o=n;for(let l of r)for(let a of l.set){let h=e[a.id];if(h){o=o?o+" "+h:h;break}}return o},scope:i}}var A=ye.define,zr=A(),gi=A(),Sc=A(gi),Cc=A(gi),mi=A(),Wr=A(mi),wa=A(mi),Pe=A(),Li=A(Pe),De=A(),Re=A(),ya=A(),us=A(ya),Gr=A(),O={comment:zr,lineComment:A(zr),blockComment:A(zr),docComment:A(zr),name:gi,variableName:A(gi),typeName:Sc,tagName:A(Sc),propertyName:Cc,attributeName:A(Cc),className:A(gi),labelName:A(gi),namespace:A(gi),macroName:A(gi),literal:mi,string:Wr,docString:A(Wr),character:A(Wr),attributeValue:A(Wr),number:wa,integer:A(wa),float:A(wa),bool:A(mi),regexp:A(mi),escape:A(mi),color:A(mi),url:A(mi),keyword:De,self:A(De),null:A(De),atom:A(De),unit:A(De),modifier:A(De),operatorKeyword:A(De),controlKeyword:A(De),definitionKeyword:A(De),moduleKeyword:A(De),operator:Re,derefOperator:A(Re),arithmeticOperator:A(Re),logicOperator:A(Re),bitwiseOperator:A(Re),compareOperator:A(Re),updateOperator:A(Re),definitionOperator:A(Re),typeOperator:A(Re),controlOperator:A(Re),punctuation:ya,separator:A(ya),bracket:us,angleBracket:A(us),squareBracket:A(us),paren:A(us),brace:A(us),content:Pe,heading:Li,heading1:A(Li),heading2:A(Li),heading3:A(Li),heading4:A(Li),heading5:A(Li),heading6:A(Li),contentSeparator:A(Pe),list:A(Pe),quote:A(Pe),emphasis:A(Pe),strong:A(Pe),link:A(Pe),monospace:A(Pe),strikethrough:A(Pe),inserted:A(),deleted:A(),changed:A(),invalid:A(),meta:Gr,documentMeta:A(Gr),annotation:A(Gr),processingInstruction:A(Gr),definition:ye.defineModifier("definition"),constant:ye.defineModifier("constant"),function:ye.defineModifier("function"),standard:ye.defineModifier("standard"),local:ye.defineModifier("local"),special:ye.defineModifier("special")};for(let s in O){let t=O[s];t instanceof ye&&(t.name=s)}var Ly=va([{tag:O.link,class:"tok-link"},{tag:O.heading,class:"tok-heading"},{tag:O.emphasis,class:"tok-emphasis"},{tag:O.strong,class:"tok-strong"},{tag:O.keyword,class:"tok-keyword"},{tag:O.atom,class:"tok-atom"},{tag:O.bool,class:"tok-bool"},{tag:O.url,class:"tok-url"},{tag:O.labelName,class:"tok-labelName"},{tag:O.inserted,class:"tok-inserted"},{tag:O.deleted,class:"tok-deleted"},{tag:O.literal,class:"tok-literal"},{tag:O.string,class:"tok-string"},{tag:O.number,class:"tok-number"},{tag:[O.regexp,O.escape,O.special(O.string)],class:"tok-string2"},{tag:O.variableName,class:"tok-variableName"},{tag:O.local(O.variableName),class:"tok-variableName tok-local"},{tag:O.definition(O.variableName),class:"tok-variableName tok-definition"},{tag:O.special(O.variableName),class:"tok-variableName2"},{tag:O.definition(O.propertyName),class:"tok-propertyName tok-definition"},{tag:O.typeName,class:"tok-typeName"},{tag:O.namespace,class:"tok-namespace"},{tag:O.className,class:"tok-className"},{tag:O.macroName,class:"tok-macroName"},{tag:O.propertyName,class:"tok-propertyName"},{tag:O.operator,class:"tok-operator"},{tag:O.comment,class:"tok-comment"},{tag:O.meta,class:"tok-meta"},{tag:O.invalid,class:"tok-invalid"},{tag:O.punctuation,class:"tok-punctuation"}]);var ka,ds=new Q;var f0=new Q,he=class{constructor(t,e,i=[],n=""){this.data=t,this.name=n,ut.prototype.hasOwnProperty("tree")||Object.defineProperty(ut.prototype,"tree",{get(){return Sa(this)}}),this.parser=e,this.extension=[pn.of(this),ut.languageData.of((r,o,l)=>{let a=Mc(r,o,l),h=a.type.prop(ds);if(!h)return[];let f=r.facet(h),u=a.type.prop(f0);if(u){let c=a.resolve(o-a.from,l);for(let d of u)if(d.test(c,r)){let p=r.facet(d.facet);return d.type=="replace"?p:p.concat(f)}}return f})].concat(i)}isActiveAt(t,e,i=-1){return Mc(t,e,i).type.prop(ds)==this.data}findRegions(t){let e=t.facet(pn);if((e==null?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],n=(r,o)=>{if(r.prop(ds)==this.data){i.push({from:o,to:o+r.length});return}let l=r.prop(Q.mounted);if(l){if(l.tree.prop(ds)==this.data){if(l.overlay)for(let a of l.overlay)i.push({from:a.from+o,to:a.to+o});else i.push({from:o,to:o+r.length});return}else if(l.overlay){let a=i.length;if(n(l.tree,l.overlay[0].from+o),i.length>a)return}}for(let a=0;a=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}},cs=null,Ca=class s{constructor(t,e,i=[],n,r,o,l,a){this.parser=t,this.state=e,this.fragments=i,this.tree=n,this.treeLen=r,this.viewport=o,this.skipped=l,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new s(t,e,[],Dt.empty,0,i,[],null)}startParse(){return this.parser.startParse(new ps(this.state.doc),this.fragments)}work(t,e){return e!=null&&e>=this.state.doc.length&&(e=void 0),this.tree!=Dt.empty&&this.isDone(e!=null?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof t=="number"){let n=Date.now()+t;t=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),e!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&e=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext(()=>{for(;!(e=this.parse.advance()););}),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(we.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=cs;cs=this;try{return t()}finally{cs=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=Ac(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:n,treeLen:r,viewport:o,skipped:l}=this;if(this.takeTree(),!t.empty){let a=[];if(t.iterChangedRanges((h,f,u,c)=>a.push({fromA:h,toA:f,fromB:u,toB:c})),i=we.applyChanges(i,a),n=Dt.empty,r=0,o={from:t.mapPos(o.from,-1),to:t.mapPos(o.to,1)},this.skipped.length){l=[];for(let h of this.skipped){let f=t.mapPos(h.from,1),u=t.mapPos(h.to,-1);ft.from&&(this.fragments=Ac(this.fragments,n,r),this.skipped.splice(i--,1))}return this.skipped.length>=e?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends Vr{createParse(e,i,n){let r=n[0].from,o=n[n.length-1].to;return{parsedPos:r,advance(){let a=cs;if(a){for(let h of n)a.tempSkipped.push(h);t&&(a.scheduleOn=a.scheduleOn?Promise.all([a.scheduleOn,t]):t)}return this.parsedPos=o,new Dt(ae.none,[],[],o-r)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&e[0].from==0&&e[0].to>=t}static get(){return cs}};function Ac(s,t,e){return we.applyChanges(s,[{fromA:t,toA:e,fromB:t,toB:e}])}var gs=class s{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new s(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=Ca.create(t.facet(pn).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new s(i)}};he.state=Ct.define({create:gs.init,update(s,t){for(let e of t.effects)if(e.is(he.setState))return e.value;return t.startState.facet(pn)!=t.state.facet(pn)?gs.init(t.state):s.apply(t)}});var Tc=s=>{let t=setTimeout(()=>s(),500);return()=>clearTimeout(t)};typeof requestIdleCallback!="undefined"&&(Tc=s=>{let t=-1,e=setTimeout(()=>{t=requestIdleCallback(s,{timeout:400})},100);return()=>t<0?clearTimeout(e):cancelIdleCallback(t)});var xa=typeof navigator!="undefined"&&(!((ka=navigator.scheduling)===null||ka===void 0)&&ka.isInputPending)?()=>navigator.scheduling.isInputPending():null,u0=Je.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(he.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(he.state);(e.tree!=e.context.tree||!e.context.isDone(t.doc.length))&&(this.working=Tc(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEndn+1e3,a=r.context.work(()=>xa&&xa()||Date.now()>o,n+(l?0:1e5));this.chunkBudget-=Date.now()-e,(a||this.chunkBudget<=0)&&(r.context.takeTree(),this.view.dispatch({effects:he.setState.of(new gs(r.context))})),this.chunkBudget>0&&!(a&&!l)&&this.scheduleWork(),this.checkAsyncSchedule(r.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then(()=>this.scheduleWork()).catch(e=>ge(this.view.state,e)).then(()=>this.workScheduled--),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),pn=L.define({combine(s){return s.length?s[0]:null},enables:s=>[he.state,u0,G.contentAttributes.compute([s],t=>{let e=t.facet(s);return e&&e.name?{"data-language":e.name}:{}})]});var Ma=class s{constructor(t,e){this.specs=t;let i;function n(l){let a=re.newName();return(i||(i=Object.create(null)))["."+a]=l,a}let r=typeof e.all=="string"?e.all:e.all?n(e.all):void 0,o=e.scope;this.scope=o instanceof he?l=>l.prop(ds)==o.data:o?l=>l==o:void 0,this.style=va(t.map(l=>({tag:l.tag,class:l.class||n(Object.assign({},l,{tag:null}))})),{all:r}).style,this.module=i?new re(i):null,this.themeType=e.themeType}static define(t,e){return new s(t,e||{})}};var Ky=Ma.define([{tag:O.meta,color:"#404740"},{tag:O.link,textDecoration:"underline"},{tag:O.heading,textDecoration:"underline",fontWeight:"bold"},{tag:O.emphasis,fontStyle:"italic"},{tag:O.strong,fontWeight:"bold"},{tag:O.strikethrough,textDecoration:"line-through"},{tag:O.keyword,color:"#708"},{tag:[O.atom,O.bool,O.url,O.contentSeparator,O.labelName],color:"#219"},{tag:[O.literal,O.inserted],color:"#164"},{tag:[O.string,O.deleted],color:"#a11"},{tag:[O.regexp,O.escape,O.special(O.string)],color:"#e40"},{tag:O.definition(O.variableName),color:"#00f"},{tag:O.local(O.variableName),color:"#30a"},{tag:[O.typeName,O.namespace],color:"#085"},{tag:O.className,color:"#167"},{tag:[O.special(O.variableName),O.macroName],color:"#256"},{tag:O.definition(O.propertyName),color:"#00c"},{tag:O.comment,color:"#940"},{tag:O.invalid,color:"#f00"}]);var Yy=[ae.none];var Xy={rtl:J.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:gt.RTL}),ltr:J.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:gt.LTR}),auto:J.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var fe;(e=>{})(fe||(fe={}));var gn=L.define({combine:s=>s[0]}),Oc=new se,o1=L.define({combine:s=>s[0]}),l1=new se,c0=L.define({combine:s=>s[0]}),a1=new se,d0=L.define({combine:s=>s[0]}),h1=new se,f1=new se,Aa=ot.define();var p0=0,ms=class{constructor(t,e){this.from=t,this.to=e}},j=class{constructor(t={}){this.id=p0++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn\'t define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can\'t add per-node props to node types");return typeof t!="function"&&(t=Rt.match(t)),e=>{let i=t(e);return i===void 0?null:[this,i]}}};j.closedBy=new j({deserialize:s=>s.split(" ")});j.openedBy=new j({deserialize:s=>s.split(" ")});j.group=new j({deserialize:s=>s.split(" ")});j.isolate=new j({deserialize:s=>{if(s&&s!="rtl"&&s!="ltr"&&s!="auto")throw new RangeError("Invalid value for isolate: "+s);return s||"auto"}});j.contextHash=new j({perNode:!0});j.lookAhead=new j({perNode:!0});j.mounted=new j({perNode:!0});var mn=class{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[j.mounted.id]}},g0=Object.create(null),Rt=class s{constructor(t,e,i,n=0){this.name=t,this.props=e,this.id=i,this.flags=n}static define(t){let e=t.props&&t.props.length?Object.create(null):g0,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(t.name==null?8:0),n=new s(t.name||"",e,t.id,i);if(t.props){for(let r of t.props)if(Array.isArray(r)||(r=r(n)),r){if(r[0].perNode)throw new RangeError("Can\'t store a per-node prop on a node type");e[r[0].id]=r[1]}}return n}prop(t){return this.props[t.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(t){if(typeof t=="string"){if(this.name==t)return!0;let e=this.prop(j.group);return e?e.indexOf(t)>-1:!1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let n of i.split(" "))e[n]=t[i];return i=>{for(let n=i.prop(j.group),r=-1;r<(n?n.length:0);r++){let o=e[r<0?i.name:n[r]];if(o)return o}}}};Rt.none=new Rt("",Object.create(null),0,8);var bs=class s{constructor(t){this.types=t;for(let e=0;e0;for(let a=this.cursor(o|mt.IncludeAnonymous);;){let h=!1;if(a.from<=r&&a.to>=n&&(!l&&a.type.isAnonymous||e(a)!==!1)){if(a.firstChild())continue;h=!0}for(;h&&i&&(l||!a.type.isAnonymous)&&i(a),!a.nextSibling();){if(!a.parent())return;h=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:Pa(Rt.none,this.children,this.positions,0,this.children.length,0,this.length,(e,i,n)=>new s(this.type,e,i,n,this.propValues),t.makeTree||((e,i,n)=>new s(Rt.none,e,i,n)))}static build(t){return b0(t)}};ct.empty=new ct(Rt.none,[],[],0);var Ta=class s{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new s(this.buffer,this.index)}},bi=class s{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return Rt.none}toString(){let t=[];for(let e=0;e0));a=o[a+3]);return l}slice(t,e,i){let n=this.buffer,r=new Uint16Array(e-t),o=0;for(let l=t,a=0;l=t&&et;case 1:return e<=t&&i>t;case 2:return i>t;case 4:return!0}}function ws(s,t,e,i){for(var n;s.from==s.to||(e<1?s.from>=t:s.from>t)||(e>-1?s.to<=t:s.to0?l.length:-1;t!=h;t+=e){let f=l[t],u=a[t]+o.from;if(Rc(n,i,u,u+f.length)){if(f instanceof bi){if(r&mt.ExcludeBuffers)continue;let c=f.findChild(0,f.buffer.length,e,i-u,n);if(c>-1)return new ys(new _a(o,f,t,u),null,c)}else if(r&mt.IncludeAnonymous||!f.type.isAnonymous||Ra(f)){let c;if(!(r&mt.IgnoreMounts)&&(c=mn.get(f))&&!c.overlay)return new s(c.tree,u,t,o);let d=new s(f,u,t,o);return r&mt.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(e<0?f.children.length-1:0,e,i,n)}}}if(r&mt.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?t=o.index+e:t=e<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let n;if(!(i&mt.IgnoreOverlays)&&(n=mn.get(this._tree))&&n.overlay){let r=t-this.from;for(let{from:o,to:l}of n.overlay)if((e>0?o<=r:o=r:l>r))return new s(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Ec(s,t,e,i){let n=s.cursor(),r=[];if(!n.firstChild())return r;if(e!=null){for(let o=!1;!o;)if(o=n.type.is(e),!n.nextSibling())return r}for(;;){if(i!=null&&n.type.is(i))return r;if(n.type.is(t)&&r.push(n.node),!n.nextSibling())return i==null?r:[]}}function Oa(s,t,e=t.length-1){for(let i=s;e>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(t[e]&&t[e]!=i.name)return!1;e--}}return!0}var _a=class{constructor(t,e,i,n){this.parent=t,this.buffer=e,this.index=i,this.start=n}},ys=class s extends Kr{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:n}=this.context,r=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.context.start,i);return r<0?null:new s(this.context,this,r)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&mt.ExcludeBuffers)return null;let{buffer:n}=this.context,r=n.findChild(this.index+4,n.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return r<0?null:new s(this.context,this,r)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new s(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new s(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,n=this.index+4,r=i.buffer[this.index+3];if(r>n){let o=i.buffer[this.index+1];t.push(i.slice(n,r,o)),e.push(0)}return new ct(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Pc(s){if(!s.length)return null;let t=0,e=s[0];for(let r=1;re.from||o.to=t){let l=new Ie(o.tree,o.overlay[0].from+r.from,-1,r);(n||(n=[i])).push(ws(l,t,e,!1))}}return n?Pc(n):i}var vs=class{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof Ie)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let i=t._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return t?(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0):!1}yieldBuf(t,e){this.index=t;let{start:i,buffer:n}=this.buffer;return this.type=e||n.set.types[n.buffer[t]],this.from=i+n.buffer[t+1],this.to=i+n.buffer[t+2],!0}yield(t){return t?t instanceof Ie?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,i){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,i,this.mode));let{buffer:n}=this.buffer,r=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.buffer.start,i);return r<0?!1:(this.stack.push(this.index),this.yieldBuf(r))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,i=this.mode){return this.buffer?i&mt.ExcludeBuffers?!1:this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&mt.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&mt.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode)):!1;let{buffer:e}=this.buffer,i=this.stack.length-1;if(t<0){let n=i<0?0:this.stack[i]+4;if(this.index!=n)return this.yieldBuf(e.findChild(n,this.index,-1,0,4))}else{let n=e.buffer[this.index+3];if(n<(i<0?e.buffer.length:e.buffer[this.stack[i]+3]))return this.yieldBuf(n)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,i,{buffer:n}=this;if(n){if(t>0){if(this.index-1)for(let r=e+t,o=t<0?-1:i._tree.children.length;r!=o;r+=t){let l=i._tree.children[r];if(this.mode&mt.IncludeAnonymous||l instanceof bi||!l.type.isAnonymous||Ra(l))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to=0;){for(let o=t;o;o=o._parent)if(o.index==n){if(n==this.index)return o;e=o,i=r+1;break t}n=this.stack[--r]}for(let n=i;n=0;r--){if(r<0)return Oa(this._tree,t,n);let o=i[e.buffer[this.stack[r]]];if(!o.isAnonymous){if(t[n]&&t[n]!=o.name)return!1;n--}}return!0}};function Ra(s){return s.children.some(t=>t instanceof bi||!t.type.isAnonymous||Ra(t))}function b0(s){var t;let{buffer:e,nodeSet:i,maxBufferLength:n=1024,reused:r=[],minRepeatType:o=i.types.length}=s,l=Array.isArray(e)?new Ta(e,e.length):e,a=i.types,h=0,f=0;function u(x,S,k,P,R,z){let{id:E,start:M,end:H,size:F}=l,q=f,St=h;for(;F<0;)if(l.next(),F==-1){let vt=r[E];k.push(vt),P.push(M-x);return}else if(F==-3){h=E;return}else if(F==-4){f=E;return}else throw new RangeError(`Unrecognized record size: ${F}`);let pe=a[E],qe,Nt,Ln=M-x;if(H-M<=n&&(Nt=m(l.pos-S,R))){let vt=new Uint16Array(Nt.size-Nt.skip),rt=l.pos-Nt.size,ft=vt.length;for(;l.pos>rt;)ft=b(Nt.start,vt,ft);qe=new bi(vt,H-Nt.start,i),Ln=Nt.start-x}else{let vt=l.pos-F;l.next();let rt=[],ft=[],Bt=E>=o?E:-1,qt=0,je=H;for(;l.pos>vt;)Bt>=0&&l.id==Bt&&l.size>=0?(l.end<=je-n&&(p(rt,ft,M,qt,l.end,je,Bt,q,St),qt=rt.length,je=l.end),l.next()):z>2500?c(M,vt,rt,ft):u(M,vt,rt,ft,Bt,z+1);if(Bt>=0&&qt>0&&qt-1&&qt>0){let Hn=d(pe,St);qe=Pa(pe,rt,ft,0,rt.length,0,H-M,Hn,Hn)}else qe=g(pe,rt,ft,H-M,q-H,St)}k.push(qe),P.push(Ln)}function c(x,S,k,P){let R=[],z=0,E=-1;for(;l.pos>S;){let{id:M,start:H,end:F,size:q}=l;if(q>4)l.next();else{if(E>-1&&H=0;F-=3)M[q++]=R[F],M[q++]=R[F+1]-H,M[q++]=R[F+2]-H,M[q++]=q;k.push(new bi(M,R[2]-H,i)),P.push(H-x)}}function d(x,S){return(k,P,R)=>{let z=0,E=k.length-1,M,H;if(E>=0&&(M=k[E])instanceof ct){if(!E&&M.type==x&&M.length==R)return M;(H=M.prop(j.lookAhead))&&(z=P[E]+M.length+H)}return g(x,k,P,R,z,S)}}function p(x,S,k,P,R,z,E,M,H){let F=[],q=[];for(;x.length>P;)F.push(x.pop()),q.push(S.pop()+k-R);x.push(g(i.types[E],F,q,z-R,M-z,H)),S.push(R-k)}function g(x,S,k,P,R,z,E){if(z){let M=[j.contextHash,z];E=E?[M].concat(E):[M]}if(R>25){let M=[j.lookAhead,R];E=E?[M].concat(E):[M]}return new ct(x,S,k,P,E)}function m(x,S){let k=l.fork(),P=0,R=0,z=0,E=k.end-n,M={size:0,start:0,skip:0};t:for(let H=k.pos-x;k.pos>H;){let F=k.size;if(k.id==S&&F>=0){M.size=P,M.start=R,M.skip=z,z+=4,P+=4,k.next();continue}let q=k.pos-F;if(F<0||q=o?4:0,pe=k.start;for(k.next();k.pos>q;){if(k.size<0)if(k.size==-3)St+=4;else break t;else k.id>=o&&(St+=4);k.next()}R=pe,P+=F,z+=St}return(S<0||P==x)&&(M.size=P,M.start=R,M.skip=z),M.size>4?M:void 0}function b(x,S,k){let{id:P,start:R,end:z,size:E}=l;if(l.next(),E>=0&&P4){let H=l.pos-(E-4);for(;l.pos>H;)k=b(x,S,k)}S[--k]=M,S[--k]=z-x,S[--k]=R-x,S[--k]=P}else E==-3?h=P:E==-4&&(f=P);return k}let w=[],y=[];for(;l.pos>0;)u(s.start||0,s.bufferStart||0,w,y,-1,0);let v=(t=s.length)!==null&&t!==void 0?t:w.length?y[0]+w[0].length:0;return new ct(a[s.topID],w.reverse(),y.reverse(),v)}var Dc=new WeakMap;function $r(s,t){if(!s.isAnonymous||t instanceof bi||t.type!=s)return 1;let e=Dc.get(t);if(e==null){e=1;for(let i of t.children){if(i.type!=s||!(i instanceof ct)){e=1;break}e+=$r(s,i)}Dc.set(t,e)}return e}function Pa(s,t,e,i,n,r,o,l,a){let h=0;for(let p=i;p=f)break;S+=k}if(y==v+1){if(S>f){let k=p[v];d(k.children,k.positions,0,k.children.length,g[v]+w);continue}u.push(p[v])}else{let k=g[y-1]+p[y-1].length-x;u.push(Pa(s,p,g,v,y,x,k,null,a))}c.push(x+w-r)}}return d(t,e,i,n,0),(l||a)(u,c,o)}var Hi=class s{constructor(t,e,i,n,r=!1,o=!1){this.from=t,this.to=e,this.tree=i,this.offset=n,this.open=(r?1:0)|(o?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(t,e=[],i=!1){let n=[new s(0,t.length,t,0,!1,i)];for(let r of e)r.to>t.length&&n.push(r);return n}static applyChanges(t,e,i=128){if(!e.length)return t;let n=[],r=1,o=t.length?t[0]:null;for(let l=0,a=0,h=0;;l++){let f=l=i)for(;o&&o.from=c.from||u<=c.to||h){let d=Math.max(c.from,a)-h,p=Math.min(c.to,u)-h;c=d>=p?null:new s(d,p,c.tree,c.offset+h,l>0,!!f)}if(c&&n.push(c),o.to>u)break;o=rnew ms(n.from,n.to)):[new ms(0,0)]:[new ms(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let n=this.startParse(t,e,i);for(;;){let r=n.advance();if(r)return r}}},Da=class{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}};var c1=new j({perNode:!0});var K=class s{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,i){[t,e]=Sn(this,t,e);let n=[];return this.decompose(0,t,n,2),i.length&&i.decompose(0,i.length,n,3),this.decompose(e,this.length,n,1),yn.from(n,this.length-(e-t)+i.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=Sn(this,t,e);let i=[];return this.decompose(t,e,i,0),yn.from(i,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),n=new zi(this),r=new zi(t);for(let o=e,l=e;;){if(n.next(o),r.next(o),o=0,n.lineBreak!=r.lineBreak||n.done!=r.done||n.value!=r.value)return!1;if(l+=n.value.length,n.done||l>=i)return!0}}iter(t=1){return new zi(this,t)}iterRange(t,e=this.length){return new Zr(this,t,e)}iterLines(t,e){let i;if(t==null)i=this.iter();else{e==null&&(e=this.lines+1);let n=this.line(t).from;i=this.iterRange(n,Math.max(n,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new to(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(t){if(t.length==0)throw new RangeError("A document must have at least one line");return t.length==1&&!t[0]?s.empty:t.length<=32?new Jt(t):yn.from(Jt.split(t,[]))}},Jt=class s extends K{constructor(t,e=w0(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,n){for(let r=0;;r++){let o=this.text[r],l=n+o.length;if((e?i:l)>=t)return new Na(n,l,i,o);n=l+1,i++}}decompose(t,e,i,n){let r=t<=0&&e>=this.length?this:new s(Ic(this.text,t,e),Math.min(e,this.length)-Math.max(0,t));if(n&1){let o=i.pop(),l=Jr(r.text,o.text.slice(),0,r.length);if(l.length<=32)i.push(new s(l,o.length+r.length));else{let a=l.length>>1;i.push(new s(l.slice(0,a)),new s(l.slice(a)))}}else i.push(r)}replace(t,e,i){if(!(i instanceof s))return super.replace(t,e,i);[t,e]=Sn(this,t,e);let n=Jr(this.text,Jr(i.text,Ic(this.text,0,t)),e),r=this.length+i.length-(e-t);return n.length<=32?new s(n,r):yn.from(s.split(n,[]),r)}sliceString(t,e=this.length,i=`\n`){[t,e]=Sn(this,t,e);let n="";for(let r=0,o=0;r<=e&&ot&&o&&(n+=i),tr&&(n+=l.slice(Math.max(0,t-r),e-r)),r=a+1}return n}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,e){let i=[],n=-1;for(let r of t)i.push(r),n+=r.length+1,i.length==32&&(e.push(new s(i,n)),i=[],n=-1);return n>-1&&e.push(new s(i,n)),e}},yn=class s extends K{constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let i of t)this.lines+=i.lines}lineInner(t,e,i,n){for(let r=0;;r++){let o=this.children[r],l=n+o.length,a=i+o.lines-1;if((e?a:l)>=t)return o.lineInner(t,e,i,n);n=l+1,i=a+1}}decompose(t,e,i,n){for(let r=0,o=0;o<=e&&r=o){let h=n&((o<=t?1:0)|(a>=e?2:0));o>=t&&a<=e&&!h?i.push(l):l.decompose(t-o,e-o,i,h)}o=a+1}}replace(t,e,i){if([t,e]=Sn(this,t,e),i.lines=r&&e<=l){let a=o.replace(t-r,e-r,i),h=this.lines-o.lines+a.lines;if(a.lines>4&&a.lines>h>>6){let f=this.children.slice();return f[n]=a,new s(f,this.length-(e-t)+i.length)}return super.replace(r,l,a)}r=l+1}return super.replace(t,e,i)}sliceString(t,e=this.length,i=`\n`){[t,e]=Sn(this,t,e);let n="";for(let r=0,o=0;rt&&r&&(n+=i),to&&(n+=l.sliceString(t-o,e-o,i)),o=a+1}return n}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof s))return 0;let i=0,[n,r,o,l]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;n+=e,r+=e){if(n==o||r==l)return i;let a=this.children[n],h=t.children[r];if(a!=h)return i+a.scanIdentical(h,e);i+=a.length+1}}static from(t,e=t.reduce((i,n)=>i+n.length+1,-1)){let i=0;for(let d of t)i+=d.lines;if(i<32){let d=[];for(let p of t)p.flatten(d);return new Jt(d,e)}let n=Math.max(32,i>>5),r=n<<1,o=n>>1,l=[],a=0,h=-1,f=[];function u(d){let p;if(d.lines>r&&d instanceof s)for(let g of d.children)u(g);else d.lines>o&&(a>o||!a)?(c(),l.push(d)):d instanceof Jt&&a&&(p=f[f.length-1])instanceof Jt&&d.lines+p.lines<=32?(a+=d.lines,h+=d.length+1,f[f.length-1]=new Jt(p.text.concat(d.text),p.length+1+d.length)):(a+d.lines>n&&c(),a+=d.lines,h+=d.length+1,f.push(d))}function c(){a!=0&&(l.push(f.length==1?f[0]:s.from(f,h)),h=-1,a=f.length=0)}for(let d of t)u(d);return c(),l.length==1?l[0]:new s(l,e)}};K.empty=new Jt([""],0);function w0(s){let t=-1;for(let e of s)t+=e.length+1;return t}function Jr(s,t,e=0,i=1e9){for(let n=0,r=0,o=!0;r=e&&(a>i&&(l=l.slice(0,i-n)),n0?1:(t instanceof Jt?t.text.length:t.children.length)<<1]}nextInner(t,e){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,n=this.nodes[i],r=this.offsets[i],o=r>>1,l=n instanceof Jt?n.text.length:n.children.length;if(o==(e>0?l:0)){if(i==0)return this.done=!0,this.value="",this;e>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((r&1)==(e>0?0:1)){if(this.offsets[i]+=e,t==0)return this.lineBreak=!0,this.value=`\n`,this;t--}else if(n instanceof Jt){let a=n.text[o+(e<0?-1:0)];if(this.offsets[i]+=e,a.length>Math.max(0,t))return this.value=t==0?a:e>0?a.slice(t):a.slice(0,a.length-t),this;t-=a.length}else{let a=n.children[o+(e<0?-1:0)];t>a.length?(t-=a.length,this.offsets[i]+=e):(e<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(e>0?1:(a instanceof Jt?a.text.length:a.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}},Zr=class{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new zi(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:n}=this.cursor.next(t);return this.pos+=(n.length+t)*e,this.value=n.length<=i?n:e<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},to=class{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:n}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol!="undefined"&&(K.prototype[Symbol.iterator]=function(){return this.iter()},zi.prototype[Symbol.iterator]=Zr.prototype[Symbol.iterator]=to.prototype[Symbol.iterator]=function(){return this});var Na=class{constructor(t,e,i,n){this.from=t,this.to=e,this.number=i,this.text=n}get length(){return this.to-this.from}};function Sn(s,t,e){return t=Math.max(0,Math.min(s.length,t)),[t,Math.max(t,Math.min(s.length,e))]}var vn="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(s=>s?parseInt(s,36):1);for(let s=1;ss)return vn[t-1]<=s;return!1}function Nc(s){return s>=127462&&s<=127487}var Bc=8205;function Be(s,t,e=!0,i=!0){return(e?Wc:v0)(s,t,i)}function Wc(s,t,e){if(t==s.length)return t;t&&Gc(s.charCodeAt(t))&&Uc(s.charCodeAt(t-1))&&t--;let i=Qr(s,t);for(t+=Ba(i);t=0&&Nc(Qr(s,o));)r++,o-=2;if(r%2==0)break;t+=2}else break}return t}function v0(s,t,e){for(;t>0;){let i=Wc(s,t-2,e);if(i=56320&&s<57344}function Uc(s){return s>=55296&&s<56320}function Qr(s,t){let e=s.charCodeAt(t);if(!Uc(e)||t+1==s.length)return e;let i=s.charCodeAt(t+1);return Gc(i)?(e-55296<<10)+(i-56320)+65536:e}function Ba(s){return s<65536?1:2}var La=/\\r\\n?|\\n/,Gt=function(s){return s[s.Simple=0]="Simple",s[s.TrackDel=1]="TrackDel",s[s.TrackBefore=2]="TrackBefore",s[s.TrackAfter=3]="TrackAfter",s}(Gt||(Gt={})),Wi=class s{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;et)return r+(t-n);r+=l}else{if(i!=Gt.Simple&&h>=t&&(i==Gt.TrackDel&&nt||i==Gt.TrackBefore&&nt))return null;if(h>t||h==t&&e<0&&!l)return t==n||e<0?r:r+a;r+=a}n=h}if(t>n)throw new RangeError(`Position ${t} is out of range for changeset of length ${n}`);return r}touchesRange(t,e=t){for(let i=0,n=0;i=0&&n<=e&&l>=t)return ne?"cover":!0;n=l}return!1}toString(){let t="";for(let e=0;e=0?":"+n:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new s(t)}static create(t){return new s(t)}},Qt=class s extends Wi{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return Ha(this,(e,i,n,r,o)=>t=t.replace(n,n+(i-e),o),!1),t}mapDesc(t,e=!1){return Fa(this,t,e,!0)}invert(t){let e=this.sections.slice(),i=[];for(let n=0,r=0;n=0){e[n]=l,e[n+1]=o;let a=n>>1;for(;i.length0&&wi(i,e,r.text),r.forward(f),l+=f}let h=t[o++];for(;l>1].toJSON()))}return t}static of(t,e,i){let n=[],r=[],o=0,l=null;function a(f=!1){if(!f&&!n.length)return;oc||u<0||c>e)throw new RangeError(`Invalid change range ${u} to ${c} (in doc of length ${e})`);let p=d?typeof d=="string"?K.of(d.split(i||La)):d:K.empty,g=p.length;if(u==c&&g==0)return;uo&&Pt(n,u-o,-1),Pt(n,c-u,g),wi(r,n,p),o=c}}return h(t),a(!l),l}static empty(t){return new s(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw new RangeError("Invalid JSON representation of ChangeSet");let e=[],i=[];for(let n=0;nl&&typeof o!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(r.length==1)e.push(r[0],0);else{for(;i.length=0&&e<=0&&e==s[n+1]?s[n]+=t:t==0&&s[n]==0?s[n+1]+=e:i?(s[n]+=t,s[n+1]+=e):s.push(t,e)}function wi(s,t,e){if(e.length==0)return;let i=t.length-2>>1;if(i>1])),!(e||o==s.sections.length||s.sections[o+1]<0);)l=s.sections[o++],a=s.sections[o++];t(n,h,r,f,u),n=h,r=f}}}function Fa(s,t,e,i=!1){let n=[],r=i?[]:null,o=new Gi(s),l=new Gi(t);for(let a=-1;;)if(o.ins==-1&&l.ins==-1){let h=Math.min(o.len,l.len);Pt(n,h,-1),o.forward(h),l.forward(h)}else if(l.ins>=0&&(o.ins<0||a==o.i||o.off==0&&(l.len=0&&a=0){let h=0,f=o.len;for(;f;)if(l.ins==-1){let u=Math.min(f,l.len);h+=u,f-=u,l.forward(u)}else if(l.ins==0&&l.lena||o.ins>=0&&o.len>a)&&(l||i.length>h),r.forward2(a),o.forward(a)}}}}var Gi=class{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i>1;return e>=t.length?K.empty:t[e]}textBit(t){let{inserted:e}=this.set,i=this.i-2>>1;return i>=e.length&&!t?K.empty:e[i].slice(this.off,t==null?void 0:this.off+t)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){this.ins==-1?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}},wn=class s{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let t=this.flags&7;return t==7?null:t}get goalColumn(){let t=this.flags>>6;return t==16777215?void 0:t}map(t,e=-1){let i,n;return this.empty?i=n=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),n=t.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new s(i,n,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return V.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return V.range(this.anchor,i)}eq(t,e=!1){return this.anchor==t.anchor&&this.head==t.head&&(!e||!this.empty||this.assoc==t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return V.range(t.anchor,t.head)}static create(t,e,i){return new s(t,e,i)}},V=class s{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:s.create(this.ranges.map(i=>i.map(t,e)),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;it.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!="number"||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new s(t.ranges.map(e=>wn.fromJSON(e)),t.main)}static single(t,e=t){return new s([s.range(t,e)],0)}static create(t,e=0){if(t.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;nt?8:0)|r)}static normalized(t,e=0){let i=t[e];t.sort((n,r)=>n.from-r.from),e=t.indexOf(i);for(let n=1;nr.head?s.range(a,l):s.range(l,a))}}return new s(t,e)}};function jc(s,t){for(let e of s.ranges)if(e.to>t)throw new RangeError("Selection points outside of document")}var Ya=0,U=class s{constructor(t,e,i,n,r){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=n,this.id=Ya++,this.default=t([]),this.extensions=typeof r=="function"?r(this):r}get reader(){return this}static define(t={}){return new s(t.combine||(e=>e),t.compareInput||((e,i)=>e===i),t.compare||(t.combine?(e,i)=>e===i:Xa),!!t.static,t.enables)}of(t){return new kn([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new kn(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new kn(t,this,2,e)}from(t,e){return e||(e=i=>i),this.compute([t],i=>e(i.field(t)))}};function Xa(s,t){return s==t||s.length==t.length&&s.every((e,i)=>e===t[i])}var kn=class{constructor(t,e,i,n){this.dependencies=t,this.facet=e,this.type=i,this.value=n,this.id=Ya++}dynamicSlot(t){var e;let i=this.value,n=this.facet.compareInput,r=this.id,o=t[r]>>1,l=this.type==2,a=!1,h=!1,f=[];for(let u of this.dependencies)u=="doc"?a=!0:u=="selection"?h=!0:(((e=t[u.id])!==null&&e!==void 0?e:1)&1)==0&&f.push(t[u.id]);return{create(u){return u.values[o]=i(u),1},update(u,c){if(a&&c.docChanged||h&&(c.docChanged||c.selection)||Va(u,f)){let d=i(u);if(l?!Lc(d,u.values[o],n):!n(d,u.values[o]))return u.values[o]=d,1}return 0},reconfigure:(u,c)=>{let d,p=c.config.address[r];if(p!=null){let g=so(c,p);if(this.dependencies.every(m=>m instanceof U?c.facet(m)===u.facet(m):m instanceof Qe?c.field(m,!1)==u.field(m,!1):!0)||(l?Lc(d=i(u),g,n):n(d=i(u),g)))return u.values[o]=g,0}else d=i(u);return u.values[o]=d,1}}}};function Lc(s,t,e){if(s.length!=t.length)return!1;for(let i=0;is[a.id]),n=e.map(a=>a.type),r=i.filter(a=>!(a&1)),o=s[t.id]>>1;function l(a){let h=[];for(let f=0;fi===n),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(Hc).find(i=>i.field==this);return((e==null?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:i=>(i.values[e]=this.create(i),1),update:(i,n)=>{let r=i.values[e],o=this.updateF(r,n);return this.compareF(r,o)?0:(i.values[e]=o,1)},reconfigure:(i,n)=>n.config.address[this.id]!=null?(i.values[e]=n.field(this),0):(i.values[e]=this.create(i),1)}}init(t){return[this,Hc.of({field:this,create:t})]}get extension(){return this}},Fi={lowest:4,low:3,default:2,high:1,highest:0};function ks(s){return t=>new eo(t,s)}var Ja={highest:ks(Fi.highest),high:ks(Fi.high),default:ks(Fi.default),low:ks(Fi.low),lowest:ks(Fi.lowest)},eo=class{constructor(t,e){this.inner=t,this.prec=e}},io=class s{of(t){return new Ss(this,t)}reconfigure(t){return s.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}},Ss=class{constructor(t,e){this.compartment=t,this.inner=e}},no=class s{constructor(t,e,i,n,r,o){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=n,this.staticValues=r,this.facets=o,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(t,e,i){let n=[],r=Object.create(null),o=new Map;for(let c of x0(t,e,o))c instanceof Qe?n.push(c):(r[c.facet.id]||(r[c.facet.id]=[])).push(c);let l=Object.create(null),a=[],h=[];for(let c of n)l[c.id]=h.length<<1,h.push(d=>c.slot(d));let f=i==null?void 0:i.config.facets;for(let c in r){let d=r[c],p=d[0].facet,g=f&&f[c]||[];if(d.every(m=>m.type==0))if(l[p.id]=a.length<<1|1,Xa(g,d))a.push(i.facet(p));else{let m=p.combine(d.map(b=>b.value));a.push(i&&p.compare(m,i.facet(p))?i.facet(p):m)}else{for(let m of d)m.type==0?(l[m.id]=a.length<<1|1,a.push(m.value)):(l[m.id]=h.length<<1,h.push(b=>m.dynamicSlot(b)));l[p.id]=h.length<<1,h.push(m=>k0(m,p,d))}}let u=h.map(c=>c(l));return new s(t,o,u,l,a,r)}};function x0(s,t,e){let i=[[],[],[],[],[]],n=new Map;function r(o,l){let a=n.get(o);if(a!=null){if(a<=l)return;let h=i[a].indexOf(o);h>-1&&i[a].splice(h,1),o instanceof Ss&&e.delete(o.compartment)}if(n.set(o,l),Array.isArray(o))for(let h of o)r(h,l);else if(o instanceof Ss){if(e.has(o.compartment))throw new RangeError("Duplicate use of compartment in extensions");let h=t.get(o.compartment)||o.inner;e.set(o.compartment,h),r(h,l)}else if(o instanceof eo)r(o.inner,o.prec);else if(o instanceof Qe)i[l].push(o),o.provides&&r(o.provides,l);else if(o instanceof kn)i[l].push(o),o.facet.extensions&&r(o.facet.extensions,Fi.default);else{let h=o.extension;if(!h)throw new Error(`Unrecognized extension value in extension set (${o}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(h,l)}}return r(s,Fi.default),i.reduce((o,l)=>o.concat(l))}function xs(s,t){if(t&1)return 2;let e=t>>1,i=s.status[e];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;s.status[e]=4;let n=s.computeSlot(s,s.config.dynamicSlots[e]);return s.status[e]=2|n}function so(s,t){return t&1?s.config.staticValues[t>>1]:s.values[t>>1]}var $c=U.define(),za=U.define({combine:s=>s.some(t=>t),static:!0}),Kc=U.define({combine:s=>s.length?s[0]:void 0,static:!0}),Yc=U.define(),Xc=U.define(),Jc=U.define(),Qc=U.define({combine:s=>s.length?s[0]:!1}),Ze=class{constructor(t,e){this.type=t,this.value=e}static define(){return new Wa}},Wa=class{of(t){return new Ze(this,t)}},Ga=class{constructor(t){this.map=t}of(t){return new bt(this,t)}},bt=class s{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return e===void 0?void 0:e==this.value?this:new s(this.type,e)}is(t){return this.type==t}static define(t={}){return new Ga(t.map||(e=>e))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let n of t){let r=n.map(e);r&&i.push(r)}return i}};bt.reconfigure=bt.define();bt.appendConfig=bt.define();var Ut=class s{constructor(t,e,i,n,r,o){this.startState=t,this.changes=e,this.selection=i,this.effects=n,this.annotations=r,this.scrollIntoView=o,this._doc=null,this._state=null,i&&jc(i,e.newLength),r.some(l=>l.type==s.time)||(this.annotations=r.concat(s.time.of(Date.now())))}static create(t,e,i,n,r,o){return new s(t,e,i,n,r,o)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(s.userEvent);return!!(e&&(e==t||e.length>t.length&&e.slice(0,t.length)==t&&e[t.length]=="."))}};Ut.time=Ze.define();Ut.userEvent=Ze.define();Ut.addToHistory=Ze.define();Ut.remote=Ze.define();function S0(s,t){let e=[];for(let i=0,n=0;;){let r,o;if(i=s[i]))r=s[i++],o=s[i++];else if(n=0;n--){let r=i[n](s);r instanceof Ut?s=r:Array.isArray(r)&&r.length==1&&r[0]instanceof Ut?s=r[0]:s=td(t,xn(r),!1)}return s}function M0(s){let t=s.startState,e=t.facet(Jc),i=s;for(let n=e.length-1;n>=0;n--){let r=e[n](s);r&&Object.keys(r).length&&(i=Zc(i,Ua(t,r,s.changes.newLength),!0))}return i==s?s:Ut.create(t,s.changes,s.selection,i.effects,i.annotations,i.scrollIntoView)}var A0=[];function xn(s){return s==null?A0:Array.isArray(s)?s:[s]}var Ne=function(s){return s[s.Word=0]="Word",s[s.Space=1]="Space",s[s.Other=2]="Other",s}(Ne||(Ne={})),T0=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/,qa;try{qa=new RegExp("[\\\\p{Alphabetic}\\\\p{Number}_]","u")}catch(s){}function O0(s){if(qa)return qa.test(s);for(let t=0;t"\\x80"&&(e.toUpperCase()!=e.toLowerCase()||T0.test(e)))return!0}return!1}function _0(s){return t=>{if(!/\\S/.test(t))return Ne.Space;if(O0(t))return Ne.Word;for(let e=0;e-1)return Ne.Word;return Ne.Other}}var dt=class s{constructor(t,e,i,n,r,o){this.config=t,this.doc=e,this.selection=i,this.values=n,this.status=t.statusTemplate.slice(),this.computeSlot=r,o&&(o._state=this);for(let l=0;ln.set(h,a)),e=null),n.set(l.value.compartment,l.value.extension)):l.is(bt.reconfigure)?(e=null,i=l.value):l.is(bt.appendConfig)&&(e=null,i=xn(i).concat(l.value));let r;e?r=t.startState.values.slice():(e=no.resolve(i,n,this),r=new s(e,this.doc,this.selection,e.dynamicSlots.map(()=>null),(a,h)=>h.reconfigure(a,this),null).values);let o=t.startState.facet(za)?t.newSelection:t.newSelection.asSingle();new s(e,t.newDoc,o,r,(l,a)=>a.update(l,t),t)}replaceSelection(t){return typeof t=="string"&&(t=this.toText(t)),this.changeByRange(e=>({changes:{from:e.from,to:e.to,insert:t},range:V.cursor(e.from+t.length)}))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),n=this.changes(i.changes),r=[i.range],o=xn(i.effects);for(let l=1;lo.spec.fromJSON(l,a)))}}return s.create({doc:t.doc,selection:V.fromJSON(t.selection),extensions:e.extensions?n.concat([e.extensions]):n})}static create(t={}){let e=no.resolve(t.extensions||[],new Map),i=t.doc instanceof K?t.doc:K.of((t.doc||"").split(e.staticFacet(s.lineSeparator)||La)),n=t.selection?t.selection instanceof V?t.selection:V.single(t.selection.anchor,t.selection.head):V.single(0);return jc(n,i.length),e.staticFacet(za)||(n=n.asSingle()),new s(e,i,n,e.dynamicSlots.map(()=>null),(r,o)=>o.create(r),null)}get tabSize(){return this.facet(s.tabSize)}get lineBreak(){return this.facet(s.lineSeparator)||`\n`}get readOnly(){return this.facet(Qc)}phrase(t,...e){for(let i of this.facet(s.phrases))if(Object.prototype.hasOwnProperty.call(i,t)){t=i[t];break}return e.length&&(t=t.replace(/\\$(\\$|\\d*)/g,(i,n)=>{if(n=="$")return"$";let r=+(n||1);return!r||r>e.length?i:e[r-1]})),t}languageDataAt(t,e,i=-1){let n=[];for(let r of this.facet($c))for(let o of r(this,e,i))Object.prototype.hasOwnProperty.call(o,t)&&n.push(o[t]);return n}charCategorizer(t){return _0(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:n}=this.doc.lineAt(t),r=this.charCategorizer(t),o=t-i,l=t-i;for(;o>0;){let a=Be(e,o,!1);if(r(e.slice(a,o))!=Ne.Word)break;o=a}for(;ls.length?s[0]:4});dt.lineSeparator=Kc;dt.readOnly=Qc;dt.phrases=U.define({compare(s,t){let e=Object.keys(s),i=Object.keys(t);return e.length==i.length&&e.every(n=>s[n]==t[n])}});dt.languageData=$c;dt.changeFilter=Yc;dt.transactionFilter=Xc;dt.transactionExtender=Jc;io.reconfigure=bt.define();var ti=class{eq(t){return this==t}range(t,e=t){return Cs.create(t,e,this)}};ti.prototype.startSide=ti.prototype.endSide=0;ti.prototype.point=!1;ti.prototype.mapMode=Gt.TrackDel;var Cs=class s{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(t,e,i){return new s(t,e,i)}};function ja(s,t){return s.from-t.from||s.value.startSide-t.value.startSide}var $a=class s{constructor(t,e,i,n){this.from=t,this.to=e,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,n=0){let r=i?this.to:this.from;for(let o=n,l=r.length;;){if(o==l)return o;let a=o+l>>1,h=r[a]-t||(i?this.value[a].endSide:this.value[a].startSide)-e;if(a==o)return h>=0?o:l;h>=0?l=a:o=a+1}}between(t,e,i,n){for(let r=this.findIndex(e,-1e9,!0),o=this.findIndex(i,1e9,!1,r);rd||c==d&&h.startSide>0&&h.endSide<=0)continue;(d-c||h.endSide-h.startSide)<0||(o<0&&(o=c),h.point&&(l=Math.max(l,d-c)),i.push(h),n.push(c-o),r.push(d-o))}return{mapped:i.length?new s(n,r,i,l):null,pos:o}}},wt=class s{constructor(t,e,i,n){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=n}static create(t,e,i,n){return new s(t,e,i,n)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:n=0,filterTo:r=this.length}=t,o=t.filter;if(e.length==0&&!o)return this;if(i&&(e=e.slice().sort(ja)),this.isEmpty)return e.length?s.of(e):this;let l=new ro(this,null,-1).goto(0),a=0,h=[],f=new Cn;for(;l.value||a=0){let u=e[a++];f.addInner(u.from,u.to,u.value)||h.push(u)}else l.rangeIndex==1&&l.chunkIndexthis.chunkEnd(l.chunkIndex)||rl.to||r=r&&t<=r+o.length&&o.between(r,t-r,e-r,i)===!1)return}this.nextLayer.between(t,e,i)}}iter(t=0){return Ms.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return Ms.from(t).goto(e)}static compare(t,e,i,n,r=-1){let o=t.filter(u=>u.maxPoint>0||!u.isEmpty&&u.maxPoint>=r),l=e.filter(u=>u.maxPoint>0||!u.isEmpty&&u.maxPoint>=r),a=Fc(o,l,i),h=new Vi(o,a,r),f=new Vi(l,a,r);i.iterGaps((u,c,d)=>Vc(h,u,f,c,d,n)),i.empty&&i.length==0&&Vc(h,0,f,0,0,n)}static eq(t,e,i=0,n){n==null&&(n=999999999);let r=t.filter(f=>!f.isEmpty&&e.indexOf(f)<0),o=e.filter(f=>!f.isEmpty&&t.indexOf(f)<0);if(r.length!=o.length)return!1;if(!r.length)return!0;let l=Fc(r,o),a=new Vi(r,l,0).goto(i),h=new Vi(o,l,0).goto(i);for(;;){if(a.to!=h.to||!Ka(a.active,h.active)||a.point&&(!h.point||!a.point.eq(h.point)))return!1;if(a.to>n)return!0;a.next(),h.next()}}static spans(t,e,i,n,r=-1){let o=new Vi(t,null,r).goto(e),l=e,a=o.openStart;for(;;){let h=Math.min(o.to,i);if(o.point){let f=o.activeForPoint(o.to),u=o.pointFroml&&(n.span(l,h,o.active,a),a=o.openEnd(h));if(o.to>i)return a+(o.point&&o.to>i?1:0);l=o.to,o.next()}}static of(t,e=!1){let i=new Cn;for(let n of t instanceof Cs?[t]:e?E0(t):t)i.add(n.from,n.to,n.value);return i.finish()}static join(t){if(!t.length)return s.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let n=t[i];n!=s.empty;n=n.nextLayer)e=new s(n.chunkPos,n.chunk,e,Math.max(n.maxPoint,e.maxPoint));return e}};wt.empty=new wt([],[],null,-1);function E0(s){if(s.length>1)for(let t=s[0],e=1;e0)return s.slice().sort(ja);t=i}return s}wt.empty.nextLayer=wt.empty;var Cn=class s{finishChunk(t){this.chunks.push(new $a(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new s)).add(t,e,i)}addInner(t,e,i){let n=t-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(wt.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return t;let e=wt.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}};function Fc(s,t,e){let i=new Map;for(let r of s)for(let o=0;o=this.minPoint)break}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new ro(o,e,i,r));return n.length==1?n[0]:new s(n)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let i=this.heap.length>>1;i>=0;i--)Ia(this.heap,i);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let i=this.heap.length>>1;i>=0;i--)Ia(this.heap,i);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),Ia(this.heap,0)}}};function Ia(s,t){for(let e=s[t];;){let i=(t<<1)+1;if(i>=s.length)break;let n=s[i];if(i+1=0&&(n=s[i+1],i++),e.compare(n)<0)break;s[i]=e,s[t]=n,t=i}}var Vi=class{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Ms.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){Yr(this.active,t),Yr(this.activeTo,t),Yr(this.activeRank,t),this.minActive=zc(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:n,rank:r}=this.cursor;for(;e0;)e++;Xr(this.active,e,i),Xr(this.activeTo,e,n),Xr(this.activeRank,e,r),t&&Xr(t,e,this.cursor.from),this.minActive=zc(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>t){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&Yr(i,n)}else if(this.cursor.value)if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let r=this.cursor.value;if(!r.point)this.addActive(i),this.cursor.next();else if(e&&this.cursor.to==this.to&&this.cursor.from=0&&i[n]=0&&!(this.activeRank[i]t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}};function Vc(s,t,e,i,n,r){s.goto(t),e.goto(i);let o=i+n,l=i,a=i-t;for(;;){let h=s.to+a-e.to||s.endSide-e.endSide,f=h<0?s.to+a:e.to,u=Math.min(f,o);if(s.point||e.point?s.point&&e.point&&(s.point==e.point||s.point.eq(e.point))&&Ka(s.activeForPoint(s.to),e.activeForPoint(e.to))||r.comparePoint(l,u,s.point,e.point):u>l&&!Ka(s.active,e.active)&&r.compareRange(l,u,s.active,e.active),f>o)break;l=f,h<=0&&s.next(),h>=0&&e.next()}}function Ka(s,t){if(s.length!=t.length)return!1;for(let e=0;e=t;i--)s[i+1]=s[i];s[t]=e}function zc(s,t){let e=-1,i=1e9;for(let n=0;n=t)return n;if(n==s.length)break;r+=s.charCodeAt(n)==9?e-r%e:1,n=Be(s,n)}return i===!0?-1:s.length}var Qa="\\u037C",id=typeof Symbol=="undefined"?"__"+Qa:Symbol.for(Qa),Za=typeof Symbol=="undefined"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),nd=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:{},ue=class{constructor(t,e){this.rules=[];let{finish:i}=e||{};function n(o){return/^@/.test(o)?[o]:o.split(/,\\s*/)}function r(o,l,a,h){let f=[],u=/^@(\\w+)\\b/.exec(o[0]),c=u&&u[1]=="keyframes";if(u&&l==null)return a.push(o[0]+";");for(let d in l){let p=l[d];if(/&/.test(d))r(d.split(/,\\s*/).map(g=>o.map(m=>g.replace(/&/,m))).reduce((g,m)=>g.concat(m)),p,a);else if(p&&typeof p=="object"){if(!u)throw new RangeError("The value of a property ("+d+") should be a primitive value.");r(n(d),p,f,c)}else p!=null&&f.push(d.replace(/_.*/,"").replace(/[A-Z]/g,g=>"-"+g.toLowerCase())+": "+p+";")}(f.length||c)&&a.push((i&&!u&&!h?o.map(i):o).join(", ")+" {"+f.join(" ")+"}")}for(let o in t)r(n(o),t[o],this.rules)}getRules(){return this.rules.join(`\n`)}static newName(){let t=nd[id]||1;return nd[id]=t+1,Qa+t.toString(36)}static mount(t,e,i){let n=t[Za],r=i&&i.nonce;n?r&&n.setNonce(r):n=new th(t,r),n.mount(Array.isArray(e)?e:[e])}},sd=new Map,th=class{constructor(t,e){let i=t.ownerDocument||t,n=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&n.CSSStyleSheet){let r=sd.get(i);if(r)return t.adoptedStyleSheets=[r.sheet,...t.adoptedStyleSheets],t[Za]=r;this.sheet=new n.CSSStyleSheet,t.adoptedStyleSheets=[this.sheet,...t.adoptedStyleSheets],sd.set(i,this)}else{this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);let r=t.head||t;r.insertBefore(this.styleTag,r.firstChild)}this.modules=[],t[Za]=this}mount(t){let e=this.sheet,i=0,n=0;for(let r=0;r-1&&(this.modules.splice(l,1),n--,l=-1),l==-1){if(this.modules.splice(n++,0,o),e)for(let a=0;a",191:"?",192:"~",219:"{",220:"|",221:"}",222:\'"\'},m1=typeof navigator!="undefined"&&/Mac/.test(navigator.platform),b1=typeof navigator!="undefined"&&/MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);for(yt=0;yt<10;yt++)Ui[48+yt]=Ui[96+yt]=String(yt);var yt;for(yt=1;yt<=24;yt++)Ui[yt+111]="F"+yt;var yt;for(yt=65;yt<=90;yt++)Ui[yt]=String.fromCharCode(yt+32),lo[yt]=String.fromCharCode(yt);var yt;for(oo in Ui)lo.hasOwnProperty(oo)||(lo[oo]=Ui[oo]);var oo;function yo(s){let t;return s.nodeType==11?t=s.getSelection?s:s.ownerDocument:t=s,t.getSelection()}function rh(s,t){return t?s==t||s.contains(t.nodeType!=1?t.parentNode:t):!1}function P0(s){let t=s.activeElement;for(;t&&t.shadowRoot;)t=t.shadowRoot.activeElement;return t}function mo(s,t){if(!t.anchorNode)return!1;try{return rh(s,t.anchorNode)}catch(e){return!1}}function Ns(s){return s.nodeType==3?qi(s,0,s.nodeValue.length).getClientRects():s.nodeType==1?s.getClientRects():[]}function Es(s,t,e,i){return e?rd(s,t,e,i,-1)||rd(s,t,e,i,1):!1}function Bs(s){for(var t=0;;t++)if(s=s.previousSibling,!s)return t}function rd(s,t,e,i,n){for(;;){if(s==e&&t==i)return!0;if(t==(n<0?0:ni(s))){if(s.nodeName=="DIV")return!1;let r=s.parentNode;if(!r||r.nodeType!=1)return!1;t=Bs(s)+(n<0?0:1),s=r}else if(s.nodeType==1){if(s=s.childNodes[t+(n<0?-1:0)],s.nodeType==1&&s.contentEditable=="false")return!1;t=n<0?ni(s):0}else return!1}}function ni(s){return s.nodeType==3?s.nodeValue.length:s.childNodes.length}function Ih(s,t){let e=t?s.left:s.right;return{left:e,right:e,top:s.top,bottom:s.bottom}}function I0(s){return{left:0,right:s.innerWidth,top:0,bottom:s.innerHeight}}function Nd(s,t){let e=t.width/s.offsetWidth,i=t.height/s.offsetHeight;return(e>.995&&e<1.005||!isFinite(e)||Math.abs(t.width-s.offsetWidth)<1)&&(e=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(t.height-s.offsetHeight)<1)&&(i=1),{scaleX:e,scaleY:i}}function N0(s,t,e,i,n,r,o,l){let a=s.ownerDocument,h=a.defaultView||window;for(let f=s,u=!1;f&&!u;)if(f.nodeType==1){let c,d=f==a.body,p=1,g=1;if(d)c=I0(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(f).position)&&(u=!0),f.scrollHeight<=f.clientHeight&&f.scrollWidth<=f.clientWidth){f=f.assignedSlot||f.parentNode;continue}let w=f.getBoundingClientRect();({scaleX:p,scaleY:g}=Nd(f,w)),c={left:w.left,right:w.left+f.clientWidth*p,top:w.top,bottom:w.top+f.clientHeight*g}}let m=0,b=0;if(n=="nearest")t.top0&&t.bottom>c.bottom+b&&(b=t.bottom-c.bottom+b+o)):t.bottom>c.bottom&&(b=t.bottom-c.bottom+o,e<0&&t.top-b0&&t.right>c.right+m&&(m=t.right-c.right+m+r)):t.right>c.right&&(m=t.right-c.right+r,e<0&&t.lefte.clientHeight||e.scrollWidth>e.clientWidth)return e;e=e.assignedSlot||e.parentNode}else if(e.nodeType==11)e=e.host;else break;return null}var oh=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?ni(e):0),i,Math.min(t.focusOffset,i?ni(i):0))}set(t,e,i,n){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=n}},Mn=null;function Bd(s){if(s.setActive)return s.setActive();if(Mn)return s.focus(Mn);let t=[];for(let e=s;e&&(t.push(e,e.scrollTop,e.scrollLeft),e!=e.ownerDocument);e=e.parentNode);if(s.focus(Mn==null?{get preventScroll(){return Mn={preventScroll:!0},!0}}:void 0),!Mn){Mn=!1;for(let e=0;eMath.max(1,s.scrollHeight-s.clientHeight-4)}var Ht=class s{constructor(t,e,i=!0){this.node=t,this.offset=e,this.precise=i}static before(t,e){return new s(t.parentNode,Bs(t),e)}static after(t,e){return new s(t.parentNode,Bs(t)+1,e)}},Nh=[],ht=class s{constructor(){this.parent=null,this.dom=null,this.flags=2}get overrideDOMText(){return null}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(t){let e=this.posAtStart;for(let i of this.children){if(i==t)return e;e+=i.length+i.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(t){return this.posBefore(t)+t.length}sync(t,e){if(this.flags&2){let i=this.dom,n=null,r;for(let o of this.children){if(o.flags&7){if(!o.dom&&(r=n?n.nextSibling:i.firstChild)){let l=s.get(r);(!l||!l.parent&&l.canReuseDOM(o))&&o.reuseDOM(r)}o.sync(t,e),o.flags&=-8}if(r=n?n.nextSibling:i.firstChild,e&&!e.written&&e.node==i&&r!=o.dom&&(e.written=!0),o.dom.parentNode==i)for(;r&&r!=o.dom;)r=ld(r);else i.insertBefore(o.dom,r);n=o.dom}for(r=n?n.nextSibling:i.firstChild,r&&e&&e.node==i&&(e.written=!0);r;)r=ld(r)}else if(this.flags&1)for(let i of this.children)i.flags&7&&(i.sync(t,e),i.flags&=-8)}reuseDOM(t){}localPosFromDOM(t,e){let i;if(t==this.dom)i=this.dom.childNodes[e];else{let n=ni(t)==0?0:e==0?-1:1;for(;;){let r=t.parentNode;if(r==this.dom)break;n==0&&r.firstChild!=r.lastChild&&(t==r.firstChild?n=-1:n=1),t=r}n<0?i=t:i=t.nextSibling}if(i==this.dom.firstChild)return 0;for(;i&&!s.get(i);)i=i.nextSibling;if(!i)return this.length;for(let n=0,r=0;;n++){let o=this.children[n];if(o.dom==i)return r;r+=o.length+o.breakAfter}}domBoundsAround(t,e,i=0){let n=-1,r=-1,o=-1,l=-1;for(let a=0,h=i,f=i;ae)return u.domBoundsAround(t,e,h);if(c>=t&&n==-1&&(n=a,r=h),h>e&&u.dom.parentNode==this.dom){o=a,l=f;break}f=c,h=c+u.breakAfter}return{from:r,to:l<0?i+this.length:l,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:o=0?this.children[o].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),e.flags&1)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,this.flags&7&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=Nh){this.markDirty();for(let n=t;nthis.pos||t==this.pos&&(e>0||this.i==0||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}};function Fd(s,t,e,i,n,r,o,l,a){let{children:h}=s,f=h.length?h[t]:null,u=r.length?r[r.length-1]:null,c=u?u.breakAfter:o;if(!(t==i&&f&&!o&&!c&&r.length<2&&f.merge(e,n,r.length?u:null,e==0,l,a))){if(i0&&(!o&&r.length&&f.merge(e,f.length,r[0],!1,l,0)?f.breakAfter=r.shift().breakAfter:(e2),I={mac:fd||/Mac/.test(Zt.platform),windows:/Win/.test(Zt.platform),linux:/Linux|X11/.test(Zt.platform),ie:Eo,ie_version:zd?lh.documentMode||6:hh?+hh[1]:ah?+ah[1]:0,gecko:ad,gecko_version:ad?+(/Firefox\\/(\\d+)/.exec(Zt.userAgent)||[0,0])[1]:0,chrome:!!eh,chrome_version:eh?+eh[1]:0,ios:fd,android:/Android\\b/.test(Zt.userAgent),webkit:hd,safari:Wd,webkit_version:hd?+(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent)||[0,0])[1]:0,tabSize:lh.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"},F0=256,vi=class s extends ht{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){t.nodeType==3&&this.createDOM(t)}merge(t,e,i){return this.flags&8||i&&(!(i instanceof s)||this.length-(e-t)+i.length>F0||i.flags&8)?!1:(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new s(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=this.flags&8,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new Ht(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return V0(this.dom,t,e)}},ki=class s extends ht{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let n of e)n.setParent(this)}setAttrs(t){if(Ld(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!((this.flags|t.flags)&8)}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?this.flags&4&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,n,r,o){return i&&(!(i instanceof s&&i.mark.eq(this.mark))||t&&r<=0||et&&e.push(i=t&&(n=r),i=a,r++}let o=this.length-t;return this.length=t,n>-1&&(this.children.length=n,this.markDirty()),new s(this.mark,e,o)}domAtPos(t){return Gd(this,t)}coordsAt(t,e){return qd(this,t,e)}};function V0(s,t,e){let i=s.nodeValue.length;t>i&&(t=i);let n=t,r=t,o=0;t==0&&e<0||t==i&&e>=0?I.chrome||I.gecko||(t?(n--,o=1):r=0)?0:l.length-1];return I.safari&&!o&&a.width==0&&(a=Array.prototype.find.call(l,h=>h.width)||a),o?Ih(a,o<0):a||null}var ko=class s extends ht{static create(t,e,i){return new s(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=s.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){(!this.dom||!this.widget.updateDOM(this.dom,t))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,n,r,o){return i&&(!(i instanceof s)||!this.widget.compare(i.widget)||t>0&&r<=0||e0)?Ht.before(this.dom):Ht.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let n=this.dom.getClientRects(),r=null;if(!n.length)return null;let o=this.side?this.side<0:t>0;for(let l=o?n.length-1:0;r=n[l],!(t>0?l==0:l==n.length-1||r.top0?Ht.before(this.dom):Ht.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return K.empty}get isHidden(){return!0}};vi.prototype.children=ko.prototype.children=Ls.prototype.children=Nh;function Gd(s,t){let e=s.dom,{children:i}=s,n=0;for(let r=0;nr&&t0;r--){let o=i[r-1];if(o.dom.parentNode==e)return o.domAtPos(o.length)}for(let r=n;r0&&t instanceof ki&&n.length&&(i=n[n.length-1])instanceof ki&&i.mark.eq(t.mark)?Ud(i,t.children[0],e-1):(n.push(t),t.setParent(s)),s.length+=t.length}function qd(s,t,e){let i=null,n=-1,r=null,o=-1;function l(h,f){for(let u=0,c=0;u=f&&(d.children.length?l(d,f-c):(!r||r.isHidden&&e>0)&&(p>f||c==p&&d.getSide()>0)?(r=d,o=f-c):(c-1?1:0)!=n.length-(e&&n.indexOf(e)>-1?1:0))return!1;for(let r of i)if(r!=e&&(n.indexOf(r)==-1||s[r]!==t[r]))return!1;return!0}function uh(s,t,e){let i=!1;if(t)for(let n in t)e&&n in e||(i=!0,n=="style"?s.style.cssText="":s.removeAttribute(n));if(e)for(let n in e)t&&t[n]==e[n]||(i=!0,n=="style"?s.style.cssText=e[n]:s.setAttribute(n,e[n]));return i}function W0(s){let t=Object.create(null);for(let e=0;e0&&this.children[i-1].length==0;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=this.prevAttrs===void 0?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){Bh(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){Ud(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=fh(e,this.attrs||{})),i&&(this.attrs=fh({class:i},this.attrs||{}))}domAtPos(t){return Gd(this,t)}reuseDOM(t){t.nodeName=="DIV"&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?this.flags&4&&(Ld(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),this.prevAttrs!==void 0&&(uh(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let n=this.dom.lastChild;for(;n&&ht.get(n)instanceof ki;)n=n.lastChild;if(!n||!this.length||n.nodeName!="BR"&&((i=ht.get(n))===null||i===void 0?void 0:i.isEditable)==!1&&(!I.ios||!this.children.some(r=>r instanceof vi))){let r=document.createElement("BR");r.cmIgnore=!0,this.dom.appendChild(r)}}measureTextSize(){if(this.children.length==0||this.length>20)return null;let t=0,e;for(let i of this.children){if(!(i instanceof vi)||/[^ -~]/.test(i.text))return null;let n=Ns(i.dom);if(n.length!=1)return null;t+=n[0].width,e=n[0].height}return t?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:t/this.length,textHeight:e}:null}coordsAt(t,e){let i=qd(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:n}=this.parent.view.viewState,r=i.bottom-i.top;if(Math.abs(r-n.lineHeight)<2&&n.textHeight=e){if(r instanceof s)return r;if(o>e)break}n=o+r.breakAfter}return null}},On=class s extends ht{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,n,r,o){return i&&(!(i instanceof s)||!this.widget.compare(i.widget)||t>0&&r<=0||e0}},_n=class{eq(t){return!1}updateDOM(t,e){return!1}compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}get estimatedHeight(){return-1}get lineBreaks(){return 0}ignoreEvent(t){return!0}coordsAt(t,e,i){return null}get isHidden(){return!1}get editable(){return!1}destroy(t){}},ei=function(s){return s[s.Text=0]="Text",s[s.WidgetBefore=1]="WidgetBefore",s[s.WidgetAfter=2]="WidgetAfter",s[s.WidgetRange=3]="WidgetRange",s}(ei||(ei={})),It=class extends ti{constructor(t,e,i,n){super(),this.startSide=t,this.endSide=e,this.widget=i,this.spec=n}get heightRelevant(){return!1}static mark(t){return new Hs(t)}static widget(t){let e=Math.max(-1e4,Math.min(1e4,t.side||0)),i=!!t.block;return e+=i&&!t.inlineOrder?e>0?3e8:-4e8:e>0?1e8:-1e8,new xi(t,e,e,i,t.widget||null,!1)}static replace(t){let e=!!t.block,i,n;if(t.isBlockGap)i=-5e8,n=4e8;else{let{start:r,end:o}=jd(t,e);i=(r?e?-3e8:-1:5e8)-1,n=(o?e?2e8:1:-6e8)+1}return new xi(t,i,n,e,t.widget||null,!0)}static line(t){return new Fs(t)}static set(t,e=!1){return wt.of(t,e)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};It.none=wt.empty;var Hs=class s extends It{constructor(t){let{start:e,end:i}=jd(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof s&&this.tagName==t.tagName&&(this.class||((e=this.attrs)===null||e===void 0?void 0:e.class))==(t.class||((i=t.attrs)===null||i===void 0?void 0:i.class))&&Bh(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}};Hs.prototype.point=!1;var Fs=class s extends It{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof s&&this.spec.class==t.spec.class&&Bh(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}};Fs.prototype.mapMode=Gt.TrackBefore;Fs.prototype.point=!0;var xi=class s extends It{constructor(t,e,i,n,r,o){super(e,i,r,t),this.block=n,this.isReplace=o,this.mapMode=n?e<=0?Gt.TrackBefore:Gt.TrackAfter:Gt.TrackDel}get type(){return this.startSide!=this.endSide?ei.WidgetRange:this.startSide<=0?ei.WidgetBefore:ei.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof s&&G0(this.widget,t.widget)&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}};xi.prototype.point=!0;function jd(s,t=!1){let{inclusiveStart:e,inclusiveEnd:i}=s;return e==null&&(e=s.inclusive),i==null&&(i=s.inclusive),{start:e!=null?e:t,end:i!=null?i:t}}function G0(s,t){return s==t||!!(s&&t&&s.compare(t))}function ch(s,t,e,i=0){let n=e.length-1;n>=0&&e[n]+i>=s?e[n]=Math.max(e[n],t):e.push(s,t)}var Ds=class s{constructor(t,e,i,n){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(this.content.length==0)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof On&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new Ot),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(ao(new Ls(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,!this.posCovered()&&!(t&&this.content.length&&this.content[this.content.length-1]instanceof On)&&this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:r,lineBreak:o,done:l}=this.cursor.next(this.skip);if(this.skip=0,l)throw new Error("Ran out of text content when drawing inline views");if(o){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}else this.text=r,this.textOff=0}let n=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(ao(new vi(this.text.slice(this.textOff,this.textOff+n)),e),i),this.atCursorPos=!0,this.textOff+=n,t-=n,i=0}}span(t,e,i,n){this.buildText(e-t,i,n),this.pos=e,this.openStart<0&&(this.openStart=n)}point(t,e,i,n,r,o){if(this.disallowBlockEffectsFor[o]&&i instanceof xi){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let l=e-t;if(i instanceof xi)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new On(i.widget||new xo("div"),l,i));else{let a=ko.create(i.widget||new xo("span"),l,l?0:i.startSide),h=this.atCursorPos&&!a.isEditable&&r<=n.length&&(t0),f=!a.isEditable&&(tn.length||i.startSide<=0),u=this.getLine();this.pendingBuffer==2&&!h&&!a.isEditable&&(this.pendingBuffer=0),this.flushBuffer(n),h&&(u.append(ao(new Ls(1),n),r),r=n.length+Math.max(0,r-n.length)),u.append(ao(a,n),r),this.atCursorPos=f,this.pendingBuffer=f?tn.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);l&&(this.textOff+l<=this.text.length?this.textOff+=l:(this.skip+=l-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=r)}static build(t,e,i,n,r){let o=new s(t,e,i,r);return o.openEnd=wt.spans(n,e,i,o),o.openStart<0&&(o.openStart=o.openEnd),o.finish(o.openEnd),o}};function ao(s,t){for(let e of t)s=new ki(e,[s],s.length);return s}var xo=class extends _n{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}},xt=function(s){return s[s.LTR=0]="LTR",s[s.RTL=1]="RTL",s}(xt||(xt={})),ji=xt.LTR,Lh=xt.RTL;function $d(s){let t=[];for(let e=0;e=e){if(l.level==i)return o;(r<0||(n!=0?n<0?l.frome:t[r].level>l.level))&&(r=o)}}if(r<0)throw new RangeError("Index out of range");return r}};function Yd(s,t){if(s.length!=t.length)return!1;for(let e=0;e=0;g-=3)if(Le[g+1]==-d){let m=Le[g+2],b=m&2?n:m&4?m&1?r:n:0;b&&(tt[u]=tt[Le[g]]=b),l=g;break}}else{if(Le.length==189)break;Le[l++]=u,Le[l++]=c,Le[l++]=a}else if((p=tt[u])==2||p==1){let g=p==n;a=g?0:1;for(let m=l-3;m>=0;m-=3){let b=Le[m+2];if(b&2)break;if(g)Le[m+2]|=2;else{if(b&4)break;Le[m+2]|=4}}}}}function Y0(s,t,e,i){for(let n=0,r=i;n<=e.length;n++){let o=n?e[n-1].to:s,l=na;)p==m&&(p=e[--g].from,m=g?e[g-1].to:s),tt[--p]=d;a=f}else r=h,a++}}}function ph(s,t,e,i,n,r,o){let l=i%2?2:1;if(i%2==n%2)for(let a=t,h=0;aa&&o.push(new Fe(a,g.from,d));let m=g.direction==ji!=!(d%2);gh(s,m?i+1:i,n,g.inner,g.from,g.to,o),a=g.to}p=g.to}else{if(p==e||(f?tt[p]!=l:tt[p]==l))break;p++}c?ph(s,a,p,i+1,n,c,o):at;){let f=!0,u=!1;if(!h||a>r[h-1].to){let g=tt[a-1];g!=l&&(f=!1,u=g==16)}let c=!f&&l==1?[]:null,d=f?i:i+1,p=a;t:for(;;)if(h&&p==r[h-1].to){if(u)break t;let g=r[--h];if(!f)for(let m=g.from,b=h;;){if(m==t)break t;if(b&&r[b-1].to==m)m=r[--b].from;else{if(tt[m-1]==l)break t;break}}if(c)c.push(g);else{g.tott.length;)tt[tt.length]=256;let i=[],n=t==ji?0:1;return gh(s,n,n,e,0,s.length,i),i}function Xd(s){return[new Fe(0,s,0)]}var Jd="";function J0(s,t,e,i,n){var r;let o=i.head-s.from,l=Fe.find(t,o,(r=i.bidiLevel)!==null&&r!==void 0?r:-1,i.assoc),a=t[l],h=a.side(n,e);if(o==h){let c=l+=n?1:-1;if(c<0||c>=t.length)return null;a=t[l=c],o=a.side(!n,e),h=a.side(n,e)}let f=Be(s.text,o,a.forward(n,e));(fa.to)&&(f=h),Jd=s.text.slice(Math.min(o,f),Math.max(o,f));let u=l==(n?t.length-1:0)?null:t[l+(n?1:-1)];return u&&f==h&&u.level+(n?0:1)s.some(t=>t)}),Z0=U.define({combine:s=>s.some(t=>t)}),Rs=class s{constructor(t,e="nearest",i="nearest",n=5,r=5,o=!1){this.range=t,this.y=e,this.x=i,this.yMargin=n,this.xMargin=r,this.isSnapshot=o}map(t){return t.empty?this:new s(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new s(V.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},ho=bt.define({map:(s,t)=>s.map(t)});function ii(s,t,e){let i=s.facet(ep);i.length?i[0](t):window.onerror?window.onerror(String(t),e,void 0,void 0,t):e?console.error(e+":",t):console.error(t)}var Do=U.define({combine:s=>s.length?s[0]:!0}),tb=0,As=U.define(),En=class s{constructor(t,e,i,n,r){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=n,this.extension=r(this)}static define(t,e){let{eventHandlers:i,eventObservers:n,provide:r,decorations:o}=e||{};return new s(tb++,t,i,n,l=>{let a=[As.of(l)];return o&&a.push(Vs.of(h=>{let f=h.plugin(l);return f?o(f):It.none})),r&&a.push(r(l)),a})}static fromClass(t,e){return s.define(i=>new t(i),e)}},Ps=class{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(i){if(ii(e.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(n){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){ii(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(!((e=this.value)===null||e===void 0)&&e.destroy)try{this.value.destroy()}catch(i){ii(t.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},rp=U.define(),Hh=U.define(),Vs=U.define(),op=U.define(),Fh=U.define(),lp=U.define();function cd(s,t){let e=s.state.facet(lp);if(!e.length)return e;let i=e.map(r=>r instanceof Function?r(s):r),n=[];return wt.spans(i,t.from,t.to,{point(){},span(r,o,l,a){let h=r-t.from,f=o-t.from,u=n;for(let c=l.length-1;c>=0;c--,a--){let d=l[c].spec.bidiIsolate,p;if(d==null&&(d=Q0(t.text,h,f)),a>0&&u.length&&(p=u[u.length-1]).to==h&&p.direction==d)p.to=f,u=p.inner;else{let g={from:h,to:f,direction:d,inner:[]};u.push(g),u=g.inner}}}}),n}var ap=U.define();function hp(s){let t=0,e=0,i=0,n=0;for(let r of s.state.facet(ap)){let o=r(s);o&&(o.left!=null&&(t=Math.max(t,o.left)),o.right!=null&&(e=Math.max(e,o.right)),o.top!=null&&(i=Math.max(i,o.top)),o.bottom!=null&&(n=Math.max(n,o.bottom)))}return{left:t,right:e,top:i,bottom:n}}var Ts=U.define(),Ve=class s{constructor(t,e,i,n){this.fromA=t,this.toA=e,this.fromB=i,this.toB=n}join(t){return new s(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let n=t[e-1];if(!(n.fromA>i.toA)){if(n.toAf)break;r+=2}if(!a)return i;new s(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),o=a.toA,l=a.toB}}},So=class s{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=Qt.empty(this.startState.doc.length);for(let r of i)this.changes=this.changes.compose(r.changes);let n=[];this.changes.iterChangedRanges((r,o,l,a)=>n.push(new Ve(r,o,l,a))),this.changedRanges=n}static create(t,e,i){return new s(t,e,i)}get viewportChanged(){return(this.flags&4)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&10)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(t=>t.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},Co=class extends ht{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new Ot],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new Ve(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:h,toA:f})=>fthis.minWidthTo)?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0);let n=-1;this.view.inputState.composing>=0&&(!((e=this.domChanged)===null||e===void 0)&&e.newSel?n=this.domChanged.newSel.head:!lb(t.changes,this.hasComposition)&&!t.selectionSet&&(n=t.state.selection.main.head));let r=n>-1?ib(this.view,t.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:h,to:f}=this.hasComposition;i=new Ve(h,f,t.changes.mapPos(h,-1),t.changes.mapPos(f,1)).addToSet(i.slice())}this.hasComposition=r?{from:r.range.fromB,to:r.range.toB}:null,(I.ie||I.chrome)&&!r&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let o=this.decorations,l=this.updateDeco(),a=rb(o,l,t.changes);return i=Ve.extendWithRanges(i,a),!(this.flags&7)&&i.length==0?!1:(this.updateInner(i,t.startState.doc.length,r),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:n}=this.view;n.ignore(()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=I.chrome||I.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,o),this.flags&=-8,o&&(o.written||n.selectionRange.focusNode!=o.node)&&(this.forceSelection=!0),this.dom.style.height=""}),this.markedForComposition.forEach(o=>o.flags&=-9);let r=[];if(this.view.viewport.from||this.view.viewport.to=0?n[o]:null;if(!l)break;let{fromA:a,toA:h,fromB:f,toB:u}=l,c,d,p,g;if(i&&i.range.fromBf){let v=Ds.build(this.view.state.doc,f,i.range.fromB,this.decorations,this.dynamicDecorationMap),x=Ds.build(this.view.state.doc,i.range.toB,u,this.decorations,this.dynamicDecorationMap);d=v.breakAtStart,p=v.openStart,g=x.openEnd;let S=this.compositionView(i);x.breakAtStart?S.breakAfter=1:x.content.length&&S.merge(S.length,S.length,x.content[0],!1,x.openStart,0)&&(S.breakAfter=x.content[0].breakAfter,x.content.shift()),v.content.length&&S.merge(0,0,v.content[v.content.length-1],!0,0,v.openEnd)&&v.content.pop(),c=v.content.concat(S).concat(x.content)}else({content:c,breakAtStart:d,openStart:p,openEnd:g}=Ds.build(this.view.state.doc,f,u,this.decorations,this.dynamicDecorationMap));let{i:m,off:b}=r.findPos(h,1),{i:w,off:y}=r.findPos(a,-1);Fd(this,w,y,m,b,c,d,p,g)}i&&this.fixCompositionDOM(i)}compositionView(t){let e=new vi(t.text.nodeValue);e.flags|=8;for(let{deco:n}of t.marks)e=new ki(n,[e],e.length);let i=new Ot;return i.append(e,0),i}fixCompositionDOM(t){let e=(r,o)=>{o.flags|=8|(o.children.some(a=>a.flags&7)?1:0),this.markedForComposition.add(o);let l=ht.get(r);l&&l!=o&&(l.dom=null),o.setDOM(r)},i=this.childPos(t.range.fromB,1),n=this.children[i.i];e(t.line,n);for(let r=t.marks.length-1;r>=-1;r--)i=n.childPos(i.off,1),n=n.children[i.i],e(r>=0?t.marks[r].node:t.text,n)}updateSelection(t=!1,e=!1){(t||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,r=!n&&mo(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||e||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(l.anchor)),h=l.empty?a:this.moveToLine(this.domAtPos(l.head));if(I.gecko&&l.empty&&!this.hasComposition&&eb(a)){let u=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(u,a.node.childNodes[a.offset]||null)),a=h=new Ht(u,0),o=!0}let f=this.view.observer.selectionRange;(o||!f.focusNode||(!Es(a.node,a.offset,f.anchorNode,f.anchorOffset)||!Es(h.node,h.offset,f.focusNode,f.focusOffset))&&!this.suppressWidgetCursorChange(f,l))&&(this.view.observer.ignore(()=>{I.android&&I.chrome&&this.dom.contains(f.focusNode)&&ob(f.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let u=yo(this.view.root);if(u)if(l.empty){if(I.gecko){let c=nb(a.node,a.offset);if(c&&c!=3){let d=up(a.node,a.offset,c==1?1:-1);d&&(a=new Ht(d.node,d.offset))}}u.collapse(a.node,a.offset),l.bidiLevel!=null&&u.caretBidiLevel!==void 0&&(u.caretBidiLevel=l.bidiLevel)}else if(u.extend){u.collapse(a.node,a.offset);try{u.extend(h.node,h.offset)}catch(c){}}else{let c=document.createRange();l.anchor>l.head&&([a,h]=[h,a]),c.setEnd(h.node,h.offset),c.setStart(a.node,a.offset),u.removeAllRanges(),u.addRange(c)}r&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())}),this.view.observer.setSelectionRange(a,h)),this.impreciseAnchor=a.precise?null:new Ht(f.anchorNode,f.anchorOffset),this.impreciseHead=h.precise?null:new Ht(f.focusNode,f.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&Es(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=yo(t.root),{anchorNode:n,anchorOffset:r}=t.observer.selectionRange;if(!i||!e.empty||!e.assoc||!i.modify)return;let o=Ot.find(this,e.head);if(!o)return;let l=o.posAtStart;if(e.head==l||e.head==l+o.length)return;let a=this.coordsAt(e.head,-1),h=this.coordsAt(e.head,1);if(!a||!h||a.bottom>h.top)return;let f=this.domAtPos(e.head+e.assoc);i.collapse(f.node,f.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let u=t.observer.selectionRange;t.docView.posFromDOM(u.anchorNode,u.anchorOffset)!=e.from&&i.collapse(n,r)}moveToLine(t){let e=this.dom,i;if(t.node!=e)return t;for(let n=t.offset;!i&&n=0;n--){let r=ht.get(e.childNodes[n]);r instanceof Ot&&(i=r.domAtPos(r.length))}return i?new Ht(i.node,i.offset,!0):t}nearest(t){for(let e=t;e;){let i=ht.get(e);if(i&&i.rootView==this)return i;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e=0;o--){let l=this.children[o],a=r-l.breakAfter,h=a-l.length;if(at||l.covers(1))&&(!i||l instanceof Ot&&!(i instanceof Ot&&e>=0))&&(i=l,n=h),r=h}return i?i.coordsAt(t-n,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),n=this.children[e];if(!(n instanceof Ot))return null;for(;n.children.length;){let{i:l,off:a}=n.childPos(i,1);for(;;l++){if(l==n.children.length)return null;if((n=n.children[l]).length)break}i=a}if(!(n instanceof vi))return null;let r=Be(n.text,i);if(r==i)return null;let o=qi(n.dom,i,r).getClientRects();for(let l=0;lMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,l=-1,a=this.view.textDirection==xt.LTR;for(let h=0,f=0;fn)break;if(h>=i){let d=u.dom.getBoundingClientRect();if(e.push(d.height),o){let p=u.dom.lastChild,g=p?Ns(p):[];if(g.length){let m=g[g.length-1],b=a?m.right-d.left:d.right-m.left;b>l&&(l=b,this.minWidth=r,this.minWidthFrom=h,this.minWidthTo=c)}}}h=c+u.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return getComputedStyle(this.children[e].dom).direction=="rtl"?xt.RTL:xt.LTR}measureTextSize(){for(let r of this.children)if(r instanceof Ot){let o=r.measureTextSize();if(o)return o}let t=document.createElement("div"),e,i,n;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.dom.appendChild(t);let r=Ns(t.firstChild)[0];e=t.getBoundingClientRect().height,i=r?r.width/27:7,n=r?r.height:e,t.remove()}),{lineHeight:e,charWidth:i,textHeight:n}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new vo(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,n=0;;n++){let r=n==e.viewports.length?null:e.viewports[n],o=r?r.from-1:this.length;if(o>i){let l=(e.lineBlockAt(o).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(It.replace({widget:new Mo(l),block:!0,inclusive:!0,isBlockGap:!0}).range(i,o))}if(!r)break;i=r.to+1}return It.set(t)}updateDeco(){let t=this.view.state.facet(Vs).map((n,r)=>(this.dynamicDecorationMap[r]=typeof n=="function")?n(this.view):n),e=!1,i=this.view.state.facet(op).map((n,r)=>{let o=typeof n=="function";return o&&(e=!0),o?n(this.view):n});i.length&&(this.dynamicDecorationMap[t.length]=e,t.push(wt.join(i)));for(let n=t.length;ne.anchor?-1:1),n;if(!i)return;!e.empty&&(n=this.coordsAt(e.anchor,e.anchor>e.head?-1:1))&&(i={left:Math.min(i.left,n.left),top:Math.min(i.top,n.top),right:Math.max(i.right,n.right),bottom:Math.max(i.bottom,n.bottom)});let r=hp(this.view),o={left:i.left-r.left,top:i.top-r.top,right:i.right+r.right,bottom:i.bottom+r.bottom},{offsetWidth:l,offsetHeight:a}=this.view.scrollDOM;N0(this.view.scrollDOM,o,e.head0)i=i.childNodes[n-1],n=ni(i);else break}if(e>=0)for(let i=s,n=t;;){if(i.nodeType==3)return{node:i,offset:n};if(i.nodeType==1&&n=0)i=i.childNodes[n],n=0;else break}return null}function nb(s,t){return s.nodeType!=1?0:(t&&s.childNodes[t-1].contentEditable=="false"?1:0)|(t{it.from&&(e=!0)}),e}function ab(s,t,e=1){let i=s.charCategorizer(t),n=s.doc.lineAt(t),r=t-n.from;if(n.length==0)return V.cursor(t);r==0?e=1:r==n.length&&(e=-1);let o=r,l=r;e<0?o=Be(n.text,r,!1):l=Be(n.text,r);let a=i(n.text.slice(o,l));for(;o>0;){let h=Be(n.text,o,!1);if(i(n.text.slice(h,o))!=a)break;o=h}for(;ls?t.left-s:Math.max(0,s-t.right)}function fb(s,t){return t.top>s?t.top-s:Math.max(0,s-t.bottom)}function ih(s,t){return s.topt.top+1}function dd(s,t){return ts.bottom?{top:s.top,left:s.left,right:s.right,bottom:t}:s}function bh(s,t,e){let i,n,r,o,l=!1,a,h,f,u;for(let p=s.firstChild;p;p=p.nextSibling){let g=Ns(p);for(let m=0;my||o==y&&r>w){i=p,n=b,r=w,o=y;let v=y?e0?m0)}w==0?e>b.bottom&&(!f||f.bottomb.top)&&(h=p,u=b):f&&ih(f,b)?f=pd(f,b.bottom):u&&ih(u,b)&&(u=dd(u,b.top))}}if(f&&f.bottom>=e?(i=a,n=f):u&&u.top<=e&&(i=h,n=u),!i)return{node:s,offset:0};let c=Math.max(n.left,Math.min(n.right,t));if(i.nodeType==3)return gd(i,c,e);if(l&&i.contentEditable!="false")return bh(i,c,e);let d=Array.prototype.indexOf.call(s.childNodes,i)+(t>=(n.left+n.right)/2?1:0);return{node:s,offset:d}}function gd(s,t,e){let i=s.nodeValue.length,n=-1,r=1e9,o=0;for(let l=0;le?f.top-e:e-f.bottom)-1;if(f.left-1<=t&&f.right+1>=t&&u=(f.left+f.right)/2,d=c;if((I.chrome||I.gecko)&&qi(s,l).getBoundingClientRect().left==f.right&&(d=!c),u<=0)return{node:s,offset:l+(d?1:0)};n=l+(d?1:0),r=u}}}return{node:s,offset:n>-1?n:o>0?s.nodeValue.length:0}}function cp(s,t,e,i=-1){var n,r;let o=s.contentDOM.getBoundingClientRect(),l=o.top+s.viewState.paddingTop,a,{docHeight:h}=s.viewState,{x:f,y:u}=t,c=u-l;if(c<0)return 0;if(c>h)return s.state.doc.length;for(let v=s.viewState.heightOracle.textHeight/2,x=!1;a=s.elementAtHeight(c),a.type!=ei.Text;)for(;c=i>0?a.bottom+v:a.top-v,!(c>=0&&c<=h);){if(x)return e?null:0;x=!0,i=-i}u=l+c;let d=a.from;if(ds.viewport.to)return s.viewport.to==s.state.doc.length?s.state.doc.length:e?null:md(s,o,a,f,u);let p=s.dom.ownerDocument,g=s.root.elementFromPoint?s.root:p,m=g.elementFromPoint(f,u);m&&!s.contentDOM.contains(m)&&(m=null),m||(f=Math.max(o.left+1,Math.min(o.right-1,f)),m=g.elementFromPoint(f,u),m&&!s.contentDOM.contains(m)&&(m=null));let b,w=-1;if(m&&((n=s.docView.nearest(m))===null||n===void 0?void 0:n.isEditable)!=!1){if(p.caretPositionFromPoint){let v=p.caretPositionFromPoint(f,u);v&&({offsetNode:b,offset:w}=v)}else if(p.caretRangeFromPoint){let v=p.caretRangeFromPoint(f,u);v&&({startContainer:b,startOffset:w}=v,(!s.contentDOM.contains(b)||I.safari&&ub(b,w,f)||I.chrome&&cb(b,w,f))&&(b=void 0))}}if(!b||!s.docView.dom.contains(b)){let v=Ot.find(s.docView,d);if(!v)return c>a.top+a.height/2?a.to:a.from;({node:b,offset:w}=bh(v.dom,f,u))}let y=s.docView.nearest(b);if(!y)return null;if(y.isWidget&&((r=y.dom)===null||r===void 0?void 0:r.nodeType)==1){let v=y.dom.getBoundingClientRect();return t.ys.defaultLineHeight*1.5){let l=s.viewState.heightOracle.textHeight,a=Math.floor((n-e.top-(s.defaultLineHeight-l)*.5)/l);r+=a*s.viewState.heightOracle.lineLength}let o=s.state.sliceDoc(e.from,e.to);return e.from+ed(o,r,s.state.tabSize)}function ub(s,t,e){let i;if(s.nodeType!=3||t!=(i=s.nodeValue.length))return!1;for(let n=s.nextSibling;n;n=n.nextSibling)if(n.nodeType!=1||n.nodeName!="BR")return!1;return qi(s,i-1,i).getBoundingClientRect().left>e}function cb(s,t,e){if(t!=0)return!1;for(let n=s;;){let r=n.parentNode;if(!r||r.nodeType!=1||r.firstChild!=n)return!1;if(r.classList.contains("cm-line"))break;n=r}let i=s.nodeType==1?s.getBoundingClientRect():qi(s,0,Math.max(s.nodeValue.length,1)).getBoundingClientRect();return e-i.left>5}function db(s,t){let e=s.lineBlockAt(t);if(Array.isArray(e.type)){for(let i of e.type)if(i.to>t||i.to==t&&(i.to==e.to||i.type==ei.Text))return i}return e}function pb(s,t,e,i){let n=db(s,t.head),r=!i||n.type!=ei.Text||!(s.lineWrapping||n.widgetLineBreaks)?null:s.coordsAtPos(t.assoc<0&&t.head>n.from?t.head-1:t.head);if(r){let o=s.dom.getBoundingClientRect(),l=s.textDirectionAt(n.from),a=s.posAtCoords({x:e==(l==xt.LTR)?o.right-1:o.left+1,y:(r.top+r.bottom)/2});if(a!=null)return V.cursor(a,e?-1:1)}return V.cursor(e?n.to:n.from,e?-1:1)}function bd(s,t,e,i){let n=s.state.doc.lineAt(t.head),r=s.bidiSpans(n),o=s.textDirectionAt(n.from);for(let l=t,a=null;;){let h=J0(n,r,o,l,e),f=Jd;if(!h){if(n.number==(e?s.state.doc.lines:1))return l;f=`\n`,n=s.state.doc.line(n.number+(e?1:-1)),r=s.bidiSpans(n),h=s.visualLineSide(n,!e)}if(a){if(!a(f))return l}else{if(!i)return h;a=i(f)}l=h}}function gb(s,t,e){let i=s.state.charCategorizer(t),n=i(e);return r=>{let o=i(r);return n==Ne.Space&&(n=o),n==o}}function mb(s,t,e,i){let n=t.head,r=e?1:-1;if(n==(e?s.state.doc.length:0))return V.cursor(n,t.assoc);let o=t.goalColumn,l,a=s.contentDOM.getBoundingClientRect(),h=s.coordsAtPos(n,t.assoc||-1),f=s.documentTop;if(h)o==null&&(o=h.left-a.left),l=r<0?h.top:h.bottom;else{let d=s.viewState.lineBlockAt(n);o==null&&(o=Math.min(a.right-a.left,s.defaultCharacterWidth*(n-d.from))),l=(r<0?d.top:d.bottom)+f}let u=a.left+o,c=i!=null?i:s.viewState.heightOracle.textHeight>>1;for(let d=0;;d+=10){let p=l+(c+d)*r,g=cp(s,{x:u,y:p},!1,r);if(pa.bottom||(r<0?gn)){let m=s.docView.coordsForChar(g),b=!m||p{if(t>r&&tn(s)),e.from,t.head>e.from?-1:1);return i==e.from?e:V.cursor(i,inull),I.gecko&&Rb(t.contentDOM.ownerDocument)}handleEvent(t){!Cb(this.view,t)||this.ignoreDuringComposition(t)||t.type=="keydown"&&this.keydown(t)||this.runHandlers(t.type,t)}runHandlers(t,e){let i=this.handlers[t];if(i){for(let n of i.observers)n(this.view,e);for(let n of i.handlers){if(e.defaultPrevented)break;if(n(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=bb(t),i=this.handlers,n=this.view.contentDOM;for(let r in e)if(r!="scroll"){let o=!e[r].handlers.length,l=i[r];l&&o!=!l.handlers.length&&(n.removeEventListener(r,this.handleEvent),l=null),l||n.addEventListener(r,this.handleEvent,{passive:o})}for(let r in i)r!="scroll"&&!e[r]&&n.removeEventListener(r,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),t.keyCode==9&&Date.now()i.keyCode==t.keyCode))&&!t.ctrlKey||wb.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(this.pendingIOSKey=e||t,setTimeout(()=>this.flushIOSKey(),250),!0):(t.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(){let t=this.pendingIOSKey;return t?(this.pendingIOSKey=void 0,Tn(this.view.contentDOM,t.key,t.keyCode)):!1}ignoreDuringComposition(t){return/^key/.test(t.type)?this.composing>0?!0:I.safari&&!I.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1:!1}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function wd(s,t){return(e,i)=>{try{return t.call(s,i,e)}catch(n){ii(e.state,n)}}}function bb(s){let t=Object.create(null);function e(i){return t[i]||(t[i]={observers:[],handlers:[]})}for(let i of s){let n=i.spec;if(n&&n.domEventHandlers)for(let r in n.domEventHandlers){let o=n.domEventHandlers[r];o&&e(r).handlers.push(wd(i.value,o))}if(n&&n.domEventObservers)for(let r in n.domEventObservers){let o=n.domEventObservers[r];o&&e(r).observers.push(wd(i.value,o))}}for(let i in ve)e(i).handlers.push(ve[i]);for(let i in ke)e(i).observers.push(ke[i]);return t}var dp=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],wb="dthko",yb=[16,17,18,20,91,92,224,225],fo=6;function uo(s){return Math.max(0,s)*.7+8}function vb(s,t){return Math.max(Math.abs(s.clientX-t.clientX),Math.abs(s.clientY-t.clientY))}var yh=class{constructor(t,e,i,n){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParent=B0(t.contentDOM),this.atoms=t.state.facet(Fh).map(o=>o(t));let r=t.contentDOM.ownerDocument;r.addEventListener("mousemove",this.move=this.move.bind(this)),r.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(dt.allowMultipleSelections)&&kb(t,e),this.dragging=Sb(t,e)&&bp(e)==1?null:!1}start(t){this.dragging===!1&&this.select(t)}move(t){var e;if(t.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&vb(this.startEvent,t)<10)return;this.select(this.lastEvent=t);let i=0,n=0,r=((e=this.scrollParent)===null||e===void 0?void 0:e.getBoundingClientRect())||{left:0,top:0,right:this.view.win.innerWidth,bottom:this.view.win.innerHeight},o=hp(this.view);t.clientX-o.left<=r.left+fo?i=-uo(r.left-t.clientX):t.clientX+o.right>=r.right-fo&&(i=uo(t.clientX-r.right)),t.clientY-o.top<=r.top+fo?n=-uo(r.top-t.clientY):t.clientY+o.bottom>=r.bottom-fo&&(n=uo(t.clientY-r.bottom)),this.setScrollSpeed(i,n)}up(t){this.dragging==null&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){this.scrollParent?(this.scrollParent.scrollLeft+=this.scrollSpeed.x,this.scrollParent.scrollTop+=this.scrollSpeed.y):this.view.win.scrollBy(this.scrollSpeed.x,this.scrollSpeed.y),this.dragging===!1&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;ithis.select(this.lastEvent),20)}};function kb(s,t){let e=s.state.facet(Qd);return e.length?e[0](t):I.mac?t.metaKey:t.ctrlKey}function xb(s,t){let e=s.state.facet(Zd);return e.length?e[0](t):I.mac?!t.altKey:!t.ctrlKey}function Sb(s,t){let{main:e}=s.state.selection;if(e.empty)return!1;let i=yo(s.root);if(!i||i.rangeCount==0)return!0;let n=i.getRangeAt(0).getClientRects();for(let r=0;r=t.clientX&&o.top<=t.clientY&&o.bottom>=t.clientY)return!0}return!1}function Cb(s,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let e=t.target,i;e!=s.contentDOM;e=e.parentNode)if(!e||e.nodeType==11||(i=ht.get(e))&&i.ignoreEvent(t))return!1;return!0}var ve=Object.create(null),ke=Object.create(null),pp=I.ie&&I.ie_version<15||I.ios&&I.webkit_version<604;function Mb(s){let t=s.dom.parentNode;if(!t)return;let e=t.appendChild(document.createElement("textarea"));e.style.cssText="position: fixed; left: -10000px; top: 10px",e.focus(),setTimeout(()=>{s.focus(),e.remove(),gp(s,e.value)},50)}function gp(s,t){let{state:e}=s,i,n=1,r=e.toText(t),o=r.lines==e.selection.ranges.length;if(vh!=null&&e.selection.ranges.every(a=>a.empty)&&vh==r.toString()){let a=-1;i=e.changeByRange(h=>{let f=e.doc.lineAt(h.from);if(f.from==a)return{range:h};a=f.from;let u=e.toText((o?r.line(n++).text:t)+e.lineBreak);return{changes:{from:f.from,insert:u},range:V.cursor(h.from+u.length)}})}else o?i=e.changeByRange(a=>{let h=r.line(n++);return{changes:{from:a.from,to:a.to,insert:h.text},range:V.cursor(a.from+h.length)}}):i=e.replaceSelection(r);s.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}ke.scroll=s=>{s.inputState.lastScrollTop=s.scrollDOM.scrollTop,s.inputState.lastScrollLeft=s.scrollDOM.scrollLeft};ve.keydown=(s,t)=>(s.inputState.setSelectionOrigin("select"),t.keyCode==27&&(s.inputState.lastEscPress=Date.now()),!1);ke.touchstart=(s,t)=>{s.inputState.lastTouchTime=Date.now(),s.inputState.setSelectionOrigin("select.pointer")};ke.touchmove=s=>{s.inputState.setSelectionOrigin("select.pointer")};ve.mousedown=(s,t)=>{if(s.observer.flush(),s.inputState.lastTouchTime>Date.now()-2e3)return!1;let e=null;for(let i of s.state.facet(tp))if(e=i(s,t),e)break;if(!e&&t.button==0&&(e=Ob(s,t)),e){let i=!s.hasFocus;s.inputState.startMouseSelection(new yh(s,t,e,i)),i&&s.observer.ignore(()=>Bd(s.contentDOM));let n=s.inputState.mouseSelection;if(n)return n.start(t),n.dragging===!1}return!1};function yd(s,t,e,i){if(i==1)return V.cursor(t,e);if(i==2)return ab(s.state,t,e);{let n=Ot.find(s.docView,t),r=s.state.doc.lineAt(n?n.posAtEnd:t),o=n?n.posAtStart:r.from,l=n?n.posAtEnd:r.to;return ls>=t.top&&s<=t.bottom,vd=(s,t,e)=>mp(t,e)&&s>=e.left&&s<=e.right;function Ab(s,t,e,i){let n=Ot.find(s.docView,t);if(!n)return 1;let r=t-n.posAtStart;if(r==0)return 1;if(r==n.length)return-1;let o=n.coordsAt(r,-1);if(o&&vd(e,i,o))return-1;let l=n.coordsAt(r,1);return l&&vd(e,i,l)?1:o&&mp(i,o)?-1:1}function kd(s,t){let e=s.posAtCoords({x:t.clientX,y:t.clientY},!1);return{pos:e,bias:Ab(s,e,t.clientX,t.clientY)}}var Tb=I.ie&&I.ie_version<=11,xd=null,Sd=0,Cd=0;function bp(s){if(!Tb)return s.detail;let t=xd,e=Cd;return xd=s,Cd=Date.now(),Sd=!t||e>Date.now()-400&&Math.abs(t.clientX-s.clientX)<2&&Math.abs(t.clientY-s.clientY)<2?(Sd+1)%3:1}function Ob(s,t){let e=kd(s,t),i=bp(t),n=s.state.selection;return{update(r){r.docChanged&&(e.pos=r.changes.mapPos(e.pos),n=n.map(r.changes))},get(r,o,l){let a=kd(s,r),h,f=yd(s,a.pos,a.bias,i);if(e.pos!=a.pos&&!o){let u=yd(s,e.pos,e.bias,i),c=Math.min(u.from,f.from),d=Math.max(u.to,f.to);f=c1&&(h=_b(n,a.pos))?h:l?n.addRange(f):V.create([f])}}}function _b(s,t){for(let e=0;e=t)return V.create(s.ranges.slice(0,e).concat(s.ranges.slice(e+1)),s.mainIndex==e?0:s.mainIndex-(s.mainIndex>e?1:0))}return null}ve.dragstart=(s,t)=>{let{selection:{main:e}}=s.state;if(t.target.draggable){let n=s.docView.nearest(t.target);if(n&&n.isWidget){let r=n.posAtStart,o=r+n.length;(r>=e.to||o<=e.from)&&(e=V.range(r,o))}}let{inputState:i}=s;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=e,t.dataTransfer&&(t.dataTransfer.setData("Text",s.state.sliceDoc(e.from,e.to)),t.dataTransfer.effectAllowed="copyMove"),!1};ve.dragend=s=>(s.inputState.draggedContent=null,!1);function Md(s,t,e,i){if(!e)return;let n=s.posAtCoords({x:t.clientX,y:t.clientY},!1),{draggedContent:r}=s.inputState,o=i&&r&&xb(s,t)?{from:r.from,to:r.to}:null,l={from:n,insert:e},a=s.state.changes(o?[o,l]:l);s.focus(),s.dispatch({changes:a,selection:{anchor:a.mapPos(n,-1),head:a.mapPos(n,1)},userEvent:o?"move.drop":"input.drop"}),s.inputState.draggedContent=null}ve.drop=(s,t)=>{if(!t.dataTransfer)return!1;if(s.state.readOnly)return!0;let e=t.dataTransfer.files;if(e&&e.length){let i=Array(e.length),n=0,r=()=>{++n==e.length&&Md(s,t,i.filter(o=>o!=null).join(s.state.lineBreak),!1)};for(let o=0;o{/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(l.result)||(i[o]=l.result),r()},l.readAsText(e[o])}return!0}else{let i=t.dataTransfer.getData("Text");if(i)return Md(s,t,i,!0),!0}return!1};ve.paste=(s,t)=>{if(s.state.readOnly)return!0;s.observer.flush();let e=pp?null:t.clipboardData;return e?(gp(s,e.getData("text/plain")||e.getData("text/uri-text")),!0):(Mb(s),!1)};function Eb(s,t){let e=s.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=t,i.focus(),i.selectionEnd=t.length,i.selectionStart=0,setTimeout(()=>{i.remove(),s.focus()},50)}function Db(s){let t=[],e=[],i=!1;for(let n of s.selection.ranges)n.empty||(t.push(s.sliceDoc(n.from,n.to)),e.push(n));if(!t.length){let n=-1;for(let{from:r}of s.selection.ranges){let o=s.doc.lineAt(r);o.number>n&&(t.push(o.text),e.push({from:o.from,to:Math.min(s.doc.length,o.to+1)})),n=o.number}i=!0}return{text:t.join(s.lineBreak),ranges:e,linewise:i}}var vh=null;ve.copy=ve.cut=(s,t)=>{let{text:e,ranges:i,linewise:n}=Db(s.state);if(!e&&!n)return!1;vh=n?e:null,t.type=="cut"&&!s.state.readOnly&&s.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let r=pp?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",e),!0):(Eb(s,e),!1)};var wp=Ze.define();function yp(s,t){let e=[];for(let i of s.facet(np)){let n=i(s,t);n&&e.push(n)}return e?s.update({effects:e,annotations:wp.of(!0)}):null}function vp(s){setTimeout(()=>{let t=s.hasFocus;if(t!=s.inputState.notifiedFocused){let e=yp(s.state,t);e?s.dispatch(e):s.update([])}},10)}ke.focus=s=>{s.inputState.lastFocusTime=Date.now(),!s.scrollDOM.scrollTop&&(s.inputState.lastScrollTop||s.inputState.lastScrollLeft)&&(s.scrollDOM.scrollTop=s.inputState.lastScrollTop,s.scrollDOM.scrollLeft=s.inputState.lastScrollLeft),vp(s)};ke.blur=s=>{s.observer.clearSelectionRange(),vp(s)};ke.compositionstart=ke.compositionupdate=s=>{s.inputState.compositionFirstChange==null&&(s.inputState.compositionFirstChange=!0),s.inputState.composing<0&&(s.inputState.composing=0)};ke.compositionend=s=>{s.inputState.composing=-1,s.inputState.compositionEndedAt=Date.now(),s.inputState.compositionPendingKey=!0,s.inputState.compositionPendingChange=s.observer.pendingRecords().length>0,s.inputState.compositionFirstChange=null,I.chrome&&I.android?s.observer.flushSoon():s.inputState.compositionPendingChange?Promise.resolve().then(()=>s.observer.flush()):setTimeout(()=>{s.inputState.composing<0&&s.docView.hasComposition&&s.update([])},50)};ke.contextmenu=s=>{s.inputState.lastContextMenu=Date.now()};ve.beforeinput=(s,t)=>{var e;let i;if(I.chrome&&I.android&&(i=dp.find(n=>n.inputType==t.inputType))&&(s.observer.delayAndroidKey(i.key,i.keyCode),i.key=="Backspace"||i.key=="Delete")){let n=((e=window.visualViewport)===null||e===void 0?void 0:e.height)||0;setTimeout(()=>{var r;(((r=window.visualViewport)===null||r===void 0?void 0:r.height)||0)>n+10&&s.hasFocus&&(s.contentDOM.blur(),s.focus())},100)}return!1};var Ad=new Set;function Rb(s){Ad.has(s)||(Ad.add(s),s.addEventListener("copy",()=>{}),s.addEventListener("cut",()=>{}))}var Td=["pre-wrap","normal","pre-line","break-spaces"],kh=class{constructor(t){this.lineWrapping=t,this.doc=K.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30,this.heightChanged=!1}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){return this.lineWrapping?(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return Td.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=l;if(this.lineWrapping=l,this.lineHeight=e,this.charWidth=i,this.textHeight=n,this.lineLength=r,a){this.heightSamples={};for(let h=0;h0}set outdated(t){this.flags=(t?2:0)|this.flags&-3}setHeight(t,e){this.height!=e&&(Math.abs(this.height-e)>wo&&(t.heightChanged=!0),this.height=e)}replace(t,e,i){return s.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,n){let r=this,o=i.doc;for(let l=n.length-1;l>=0;l--){let{fromA:a,toA:h,fromB:f,toB:u}=n[l],c=r.lineAt(a,at.ByPosNoHeight,i.setDoc(e),0,0),d=c.to>=h?c:r.lineAt(h,at.ByPosNoHeight,i,0,0);for(u+=d.to-h,h=d.to;l>0&&c.from<=n[l-1].toA;)a=n[l-1].fromA,f=n[l-1].fromB,l--,ar*2){let l=t[e-1];l.break?t.splice(--e,1,l.left,null,l.right):t.splice(--e,1,l.left,l.right),i+=1+l.break,n-=l.size}else if(r>n*2){let l=t[i];l.break?t.splice(i,1,l.left,null,l.right):t.splice(i,1,l.left,l.right),i+=2+l.break,r-=l.size}else break;else if(n=r&&o(this.blockAt(0,i,n,r))}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more&&this.setHeight(t,n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}},ce=class s extends Ao{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,n){return new He(n,this.length,i,this.height,this.breaks)}replace(t,e,i){let n=i[0];return i.length==1&&(n instanceof s||n instanceof yi&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof yi?n=new s(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):te.of(i)}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more?this.setHeight(t,n.heights[n.index++]):(i||this.outdated)&&this.setHeight(t,Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},yi=class s extends te{constructor(t){super(t,0)}heightMetrics(t,e){let i=t.doc.lineAt(e).number,n=t.doc.lineAt(e+this.length).number,r=n-i+1,o,l=0;if(t.lineWrapping){let a=Math.min(this.height,t.lineHeight*r);o=a/r,this.length>r+1&&(l=(this.height-a)/(this.length-r-1))}else o=this.height/r;return{firstLine:i,lastLine:n,perLine:o,perChar:l}}blockAt(t,e,i,n){let{firstLine:r,lastLine:o,perLine:l,perChar:a}=this.heightMetrics(e,n);if(e.lineWrapping){let h=n+Math.round(Math.max(0,Math.min(1,(t-i)/this.height))*this.length),f=e.doc.lineAt(h),u=l+f.length*a,c=Math.max(i,t-u/2);return new He(f.from,f.length,c,u,0)}else{let h=Math.max(0,Math.min(o-r,Math.floor((t-i)/l))),{from:f,length:u}=e.doc.line(r+h);return new He(f,u,i+l*h,l,0)}}lineAt(t,e,i,n,r){if(e==at.ByHeight)return this.blockAt(t,i,n,r);if(e==at.ByPosNoHeight){let{from:d,to:p}=i.doc.lineAt(t);return new He(d,p-d,0,0,0)}let{firstLine:o,perLine:l,perChar:a}=this.heightMetrics(i,r),h=i.doc.lineAt(t),f=l+h.length*a,u=h.number-o,c=n+l*u+a*(h.from-r-u);return new He(h.from,h.length,Math.max(n,Math.min(c,n+this.height-f)),f,0)}forEachLine(t,e,i,n,r,o){t=Math.max(t,r),e=Math.min(e,r+this.length);let{firstLine:l,perLine:a,perChar:h}=this.heightMetrics(i,r);for(let f=t,u=n;f<=e;){let c=i.doc.lineAt(f);if(f==t){let p=c.number-l;u+=a*p+h*(t-r-p)}let d=a+h*c.length;o(new He(c.from,c.length,u,d,0)),u+=d,f=c.to+1}}replace(t,e,i){let n=this.length-e;if(n>0){let r=i[i.length-1];r instanceof s?i[i.length-1]=new s(r.length+n):i.push(null,new s(n-1))}if(t>0){let r=i[0];r instanceof s?i[0]=new s(t+r.length):i.unshift(new s(t-1),null)}return te.of(i)}decomposeLeft(t,e){e.push(new s(t-1),null)}decomposeRight(t,e){e.push(null,new s(this.length-t-1))}updateHeight(t,e=0,i=!1,n){let r=e+this.length;if(n&&n.from<=e+this.length&&n.more){let o=[],l=Math.max(e,n.from),a=-1;for(n.from>e&&o.push(new s(n.from-e-1).updateHeight(t,e));l<=r&&n.more;){let f=t.doc.lineAt(l).length;o.length&&o.push(null);let u=n.heights[n.index++];a==-1?a=u:Math.abs(u-a)>=wo&&(a=-2);let c=new ce(f,u);c.outdated=!1,o.push(c),l+=f+1}l<=r&&o.push(null,new s(r-l).updateHeight(t,l));let h=te.of(o);return(a<0||Math.abs(h.height-this.height)>=wo||Math.abs(a-this.heightMetrics(t,e).perLine)>=wo)&&(t.heightChanged=!0),h}else(i||this.outdated)&&(this.setHeight(t,t.heightForGap(e,e+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},Sh=class extends te{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return this.flags&1}blockAt(t,e,i,n){let r=i+this.left.height;return tl))return h;let f=e==at.ByPosNoHeight?at.ByPosNoHeight:at.ByPos;return a?h.join(this.right.lineAt(l,f,i,o,l)):this.left.lineAt(l,f,i,n,r).join(h)}forEachLine(t,e,i,n,r,o){let l=n+this.left.height,a=r+this.left.length+this.break;if(this.break)t=a&&this.right.forEachLine(t,e,i,l,a,o);else{let h=this.lineAt(a,at.ByPos,i,n,r);t=t&&h.from<=e&&o(h),e>h.to&&this.right.forEachLine(h.to+1,e,i,l,a,o)}}replace(t,e,i){let n=this.left.length+this.break;if(ethis.left.length)return this.balanced(this.left,this.right.replace(t-n,e-n,i));let r=[];t>0&&this.decomposeLeft(t,r);let o=r.length;for(let l of i)r.push(l);if(t>0&&Od(r,o-1),e=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,n=i+this.break;if(t>=n)return this.right.decomposeRight(t-n,e);t2*e.size||e.size>2*t.size?te.of(this.break?[t,null,e]:[t,e]):(this.left=t,this.right=e,this.height=t.height+e.height,this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,n){let{left:r,right:o}=this,l=e+r.length+this.break,a=null;return n&&n.from<=e+r.length&&n.more?a=r=r.updateHeight(t,e,i,n):r.updateHeight(t,e,i),n&&n.from<=l+o.length&&n.more?a=o=o.updateHeight(t,l,i,n):o.updateHeight(t,l,i),a?this.balanced(r,o):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function Od(s,t){let e,i;s[t]==null&&(e=s[t-1])instanceof yi&&(i=s[t+1])instanceof yi&&s.splice(t-1,3,new yi(e.length+1+i.length))}var Pb=5,Ch=class s{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let i=Math.min(e,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof ce?n.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new ce(i-this.pos,-1)),this.writtenTo=i,e>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t=Pb)&&this.addLineDeco(n,r,o)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTot&&this.nodes.push(new ce(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new yi(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof ce)return t;let e=new ce(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,t),n.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(e instanceof ce)&&!this.isCovered?this.nodes.push(new ce(0,-1)):(this.writtenTof.clientHeight||f.scrollWidth>f.clientWidth)&&u.overflow!="visible"){let c=f.getBoundingClientRect();r=Math.max(r,c.left),o=Math.min(o,c.right),l=Math.max(l,c.top),a=h==s.parentNode?c.bottom:Math.min(a,c.bottom)}h=u.position=="absolute"||u.position=="fixed"?f.offsetParent:f.parentNode}else if(h.nodeType==11)h=h.host;else break;return{left:r-e.left,right:Math.max(r,o)-e.left,top:l-(e.top+t),bottom:Math.max(l,a)-(e.top+t)}}function Bb(s,t){let e=s.getBoundingClientRect();return{left:0,right:e.right-e.left,top:t,bottom:e.bottom-(e.top+t)}}var Is=class{constructor(t,e,i){this.from=t,this.to=e,this.size=i}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new kh(e),this.stateDeco=t.facet(Vs).filter(i=>typeof i!="function"),this.heightMap=te.empty().applyChanges(this.stateDeco,K.empty,this.heightOracle.setDoc(t.doc),[new Ve(0,0,0,t.doc.length)]),this.viewport=this.getViewport(0,null),this.updateViewportLines(),this.updateForViewport(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=It.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let n=i?e.head:e.anchor;if(!t.some(({from:r,to:o})=>n>=r&&n<=o)){let{from:r,to:o}=this.lineBlockAt(n);t.push(new An(r,o))}}this.viewports=t.sort((i,n)=>i.from-n.from),this.scaler=this.heightMap.height<=7e6?_d:new Th(this.heightOracle,this.heightMap,this.viewports)}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,t=>{this.viewportLines.push(this.scaler.scale==1?t:Os(t,this.scaler))})}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(Vs).filter(f=>typeof f!="function");let n=t.changedRanges,r=Ve.extendWithRanges(n,Ib(i,this.stateDeco,t?t.changes:Qt.empty(this.state.doc.length))),o=this.heightMap.height,l=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),r),this.heightMap.height!=o&&(t.flags|=2),l?(this.scrollAnchorPos=t.changes.mapPos(l.from,-1),this.scrollAnchorHeight=l.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=this.heightMap.height);let a=r.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let h=!t.changes.empty||t.flags&2||a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,this.updateForViewport(),h&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(Z0)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let e=t.contentDOM,i=window.getComputedStyle(e),n=this.heightOracle,r=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?xt.RTL:xt.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=e.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,f=0;if(l.width&&l.height){let{scaleX:v,scaleY:x}=Nd(e,l);(this.scaleX!=v||this.scaleY!=x)&&(this.scaleX=v,this.scaleY=x,h|=8,o=a=!0)}let u=(parseInt(i.paddingTop)||0)*this.scaleY,c=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=u||this.paddingBottom!=c)&&(this.paddingTop=u,this.paddingBottom=c,h|=10),this.editorWidth!=t.scrollDOM.clientWidth&&(n.lineWrapping&&(a=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=8);let d=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=Hd(t.scrollDOM);let p=(this.printing?Bb:Nb)(e,this.paddingTop),g=p.top-this.pixelViewport.top,m=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let b=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(b!=this.inView&&(this.inView=b,b&&(a=!0)),!this.inView&&!this.scrollTarget)return 0;let w=l.width;if((this.contentDOMWidth!=w||this.editorHeight!=t.scrollDOM.clientHeight)&&(this.contentDOMWidth=l.width,this.editorHeight=t.scrollDOM.clientHeight,h|=8),a){let v=t.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(v)&&(o=!0),o||n.lineWrapping&&Math.abs(w-this.contentDOMWidth)>n.charWidth){let{lineHeight:x,charWidth:S,textHeight:k}=t.docView.measureTextSize();o=x>0&&n.refresh(r,x,S,k,w/S,v),o&&(t.docView.minWidth=0,h|=8)}g>0&&m>0?f=Math.max(g,m):g<0&&m<0&&(f=Math.min(g,m)),n.heightChanged=!1;for(let x of this.viewports){let S=x.from==this.viewport.from?v:t.docView.measureVisibleLineHeights(x);this.heightMap=(o?te.empty().applyChanges(this.stateDeco,K.empty,this.heightOracle,[new Ve(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(n,0,o,new xh(x.from,S))}n.heightChanged&&(h|=2)}let y=!this.viewportIsAppropriate(this.viewport,f)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return y&&(this.viewport=this.getViewport(f,this.scrollTarget)),this.updateForViewport(),(h&2||y)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),n=this.heightMap,r=this.heightOracle,{visibleTop:o,visibleBottom:l}=this,a=new An(n.lineAt(o-i*1e3,at.ByHeight,r,0,0).from,n.lineAt(l+(1-i)*1e3,at.ByHeight,r,0,0).to);if(e){let{head:h}=e.range;if(ha.to){let f=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),u=n.lineAt(h,at.ByPos,r,0,0),c;e.y=="center"?c=(u.top+u.bottom)/2-f/2:e.y=="start"||e.y=="nearest"&&h=l+Math.max(10,Math.min(i,250)))&&n>o-2*1e3&&r>1,o=n<<1;if(this.defaultTextDirection!=xt.LTR&&!i)return[];let l=[],a=(h,f,u,c)=>{if(f-hh&&mm.from>=u.from&&m.to<=u.to&&Math.abs(m.from-h)m.fromb));if(!g){if(fm.from<=f&&m.to>=f)){let m=e.moveToLineBoundary(V.cursor(f),!1,!0).head;m>h&&(f=m)}g=new Is(h,f,this.gapSize(u,h,f,c))}l.push(g)};for(let h of this.viewportLines){if(h.lengthh.from&&a(h.from,c,h,f),de.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let e=[];wt.spans(t,this.viewport.from,this.viewport.to,{span(n,r){e.push({from:n,to:r})},point(){}},20);let i=e.length!=this.visibleRanges.length||this.visibleRanges.some((n,r)=>n.from!=e[r].from||n.to!=e[r].to);return this.visibleRanges=e,i?4:0}lineBlockAt(t){return t>=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find(e=>e.from<=t&&e.to>=t)||Os(this.heightMap.lineAt(t,at.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return Os(this.heightMap.lineAt(this.scaler.fromDOM(t),at.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return Os(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},An=class{constructor(t,e){this.from=t,this.to=e}};function Lb(s,t,e){let i=[],n=s,r=0;return wt.spans(e,s,t,{span(){},point(o,l){o>n&&(i.push({from:n,to:o}),r+=o-n),n=l}},20),n=1)return t[t.length-1].to;let i=Math.floor(s*e);for(let n=0;;n++){let{from:r,to:o}=t[n],l=o-r;if(i<=l)return r+i;i-=l}}function po(s,t){let e=0;for(let{from:i,to:n}of s.ranges){if(t<=n){e+=t-i;break}e+=n-i}return e/s.total}function Hb(s,t){for(let e of s)if(t(e))return e}var _d={toDOM(s){return s},fromDOM(s){return s},scale:1},Th=class{constructor(t,e,i){let n=0,r=0,o=0;this.viewports=i.map(({from:l,to:a})=>{let h=e.lineAt(l,at.ByPos,t,0,0).top,f=e.lineAt(a,at.ByPos,t,0,0).bottom;return n+=f-h,{from:l,to:a,top:h,bottom:f,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(e.height-n);for(let l of this.viewports)l.domTop=o+(l.top-r)*this.scale,o=l.domBottom=l.domTop+(l.bottom-l.top),r=l.bottom}toDOM(t){for(let e=0,i=0,n=0;;e++){let r=eOs(n,t)):s._content)}var go=U.define({combine:s=>s.join(" ")}),Oh=U.define({combine:s=>s.indexOf(!0)>-1}),_h=ue.newName(),kp=ue.newName(),xp=ue.newName(),Sp={"&light":"."+kp,"&dark":"."+xp};function Eh(s,t,e){return new ue(t,{finish(i){return/&/.test(i)?i.replace(/&\\w*/,n=>{if(n=="&")return s;if(!e||!e[n])throw new RangeError(`Unsupported selector: ${n}`);return e[n]}):s+" "+i}})}var Fb=Eh("."+_h,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#444"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top"},".cm-highlightSpace:before":{content:"attr(data-display)",position:"absolute",pointerEvents:"none",color:"#888"},".cm-highlightTab":{backgroundImage:`url(\'data:image/svg+xml,\')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Sp),_s="\\uFFFF",Dh=class{constructor(t,e){this.points=t,this.text="",this.lineSeparator=e.facet(dt.lineSeparator)}append(t){this.text+=t}lineBreak(){this.text+=_s}readRange(t,e){if(!t)return this;let i=t.parentNode;for(let n=t;;){this.findPointBefore(i,n);let r=this.text.length;this.readNode(n);let o=n.nextSibling;if(o==e)break;let l=ht.get(n),a=ht.get(o);(l&&a?l.breakAfter:(l?l.breakAfter:Ed(n))||Ed(o)&&(n.nodeName!="BR"||n.cmIgnore)&&this.text.length>r)&&this.lineBreak(),n=o}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,n=this.lineSeparator?null:/\\r\\n?|\\n/g;;){let r=-1,o=1,l;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(l=n.exec(e))&&(r=l.index,o=l[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let a of this.points)a.node==t&&a.pos>this.text.length&&(a.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=ht.get(t),i=e&&e.overrideDOMText;if(i!=null){this.findPointInside(t,i.length);for(let n=i.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else t.nodeType==3?this.readTextNode(t):t.nodeName=="BR"?t.nextSibling&&this.lineBreak():t.nodeType==1&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(t.nodeType==3?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+(Vb(t,i.node,i.offset)?e:0))}};function Vb(s,t,e){for(;;){if(!t||e-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let l=r||o?[]:Gb(t),a=new Dh(l,t.state);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=Ub(l,this.bounds.from)}else{let l=t.observer.selectionRange,a=r&&r.node==l.focusNode&&r.offset==l.focusOffset||!rh(t.contentDOM,l.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(l.focusNode,l.focusOffset),h=o&&o.node==l.anchorNode&&o.offset==l.anchorOffset||!rh(t.contentDOM,l.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(l.anchorNode,l.anchorOffset),f=t.viewport;if(I.ios&&t.state.selection.main.empty&&a!=h&&(f.from>0||f.toDate.now()-100?s.inputState.lastKeyCode:-1;if(t.bounds){let{from:o,to:l}=t.bounds,a=n.from,h=null;(r===8||I.android&&t.text.length=n.from&&e.to<=n.to&&(e.from!=n.from||e.to!=n.to)&&n.to-n.from-(e.to-e.from)<=4?e={from:n.from,to:n.to,insert:s.state.doc.slice(n.from,e.from).append(e.insert).append(s.state.doc.slice(e.to,n.to))}:(I.mac||I.android)&&e&&e.from==e.to&&e.from==n.head-1&&/^\\. ?$/.test(e.insert.toString())&&s.contentDOM.getAttribute("autocorrect")=="off"?(i&&e.insert.length==2&&(i=V.single(i.main.anchor-1,i.main.head-1)),e={from:n.from,to:n.to,insert:K.of([" "])}):I.chrome&&e&&e.from==e.to&&e.from==n.head&&e.insert.toString()==`\n `&&s.lineWrapping&&(i&&(i=V.single(i.main.anchor-1,i.main.head-1)),e={from:n.from,to:n.to,insert:K.of([" "])}),e){if(I.ios&&s.inputState.flushIOSKey()||I.android&&(e.from==n.from&&e.to==n.to&&e.insert.length==1&&e.insert.lines==2&&Tn(s.contentDOM,"Enter",13)||(e.from==n.from-1&&e.to==n.to&&e.insert.length==0||r==8&&e.insert.lengthn.head)&&Tn(s.contentDOM,"Backspace",8)||e.from==n.from&&e.to==n.to+1&&e.insert.length==0&&Tn(s.contentDOM,"Delete",46)))return!0;let o=e.insert.toString();s.inputState.composing>=0&&s.inputState.composing++;let l,a=()=>l||(l=zb(s,e,i));return s.state.facet(ip).some(h=>h(s,e.from,e.to,o,a))||s.dispatch(a()),!0}else if(i&&!i.main.eq(n)){let o=!1,l="select";return s.inputState.lastSelectionTime>Date.now()-50&&(s.inputState.lastSelectionOrigin=="select"&&(o=!0),l=s.inputState.lastSelectionOrigin),s.dispatch({selection:i,scrollIntoView:o,userEvent:l}),!0}else return!1}function zb(s,t,e){let i,n=s.state,r=n.selection.main;if(t.from>=r.from&&t.to<=r.to&&t.to-t.from>=(r.to-r.from)/3&&(!e||e.main.empty&&e.main.from==t.from+t.insert.length)&&s.inputState.composing<0){let l=r.fromt.to?n.sliceDoc(t.to,r.to):"";i=n.replaceSelection(s.state.toText(l+t.insert.sliceString(0,void 0,s.state.lineBreak)+a))}else{let l=n.changes(t),a=e&&e.main.to<=l.newLength?e.main:void 0;if(n.selection.ranges.length>1&&s.inputState.composing>=0&&t.to<=r.to&&t.to>=r.to-10){let h=s.state.sliceDoc(t.from,t.to),f,u=e&&fp(s,e.main.head);if(u){let p=t.insert.length-(t.to-t.from);f={from:u.from,to:u.to-p}}else f=s.state.doc.lineAt(r.head);let c=r.to-t.to,d=r.to-r.from;i=n.changeByRange(p=>{if(p.from==r.from&&p.to==r.to)return{changes:l,range:a||p.map(l)};let g=p.to-c,m=g-h.length;if(p.to-p.from!=d||s.state.sliceDoc(m,g)!=h||p.to>=f.from&&p.from<=f.to)return{range:p};let b=n.changes({from:m,to:g,insert:t.insert}),w=p.to-r.to;return{changes:b,range:a?V.range(Math.max(0,a.anchor+w),Math.max(0,a.head+w)):p.map(b)}})}else i={changes:l,selection:a&&n.selection.replaceRange(a)}}let o="input.type";return(s.composing||s.inputState.compositionPendingChange&&s.inputState.compositionEndedAt>Date.now()-50)&&(s.inputState.compositionPendingChange=!1,o+=".compose",s.inputState.compositionFirstChange&&(o+=".start",s.inputState.compositionFirstChange=!1)),n.update(i,{userEvent:o,scrollIntoView:!0})}function Wb(s,t,e,i){let n=Math.min(s.length,t.length),r=0;for(;r0&&l>0&&s.charCodeAt(o-1)==t.charCodeAt(l-1);)o--,l--;if(i=="end"){let a=Math.max(0,r-Math.min(o,l));e-=o+a-r}if(o=o?r-e:0;r-=a,l=r+(l-o),o=r}else if(l=l?r-e:0;r-=a,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}function Gb(s){let t=[];if(s.root.activeElement!=s.contentDOM)return t;let{anchorNode:e,anchorOffset:i,focusNode:n,focusOffset:r}=s.observer.selectionRange;return e&&(t.push(new Oo(e,i)),(n!=e||r!=i)&&t.push(new Oo(n,r))),t}function Ub(s,t){if(s.length==0)return null;let e=s[0].pos,i=s.length==2?s[1].pos:e;return e>-1&&i>-1?V.single(e+t,i+t):null}var qb={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},sh=I.ie&&I.ie_version<=11,Ph=class{constructor(t){this.view=t,this.active=!1,this.selectionRange=new oh,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver(e=>{for(let i of e)this.queue.push(i);(I.ie&&I.ie_version<=11||I.ios&&t.composing)&&e.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),sh&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var e;((e=this.view.docView)===null||e===void 0?void 0:e.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(){this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500)}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some((e,i)=>e!=t[i]))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(Do)?i.root.activeElement!=this.dom:!mo(i.dom,n))return;let r=n.anchorNode&&i.docView.nearest(n.anchorNode);if(r&&r.ignoreEvent(t)){e||(this.selectionChanged=!1);return}(I.ie&&I.ie_version<=11||I.android&&I.chrome)&&!i.state.selection.main.empty&&n.focusNode&&Es(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=I.safari&&t.root.nodeType==11&&P0(this.dom.ownerDocument)==this.dom&&jb(this.view)||yo(t.root);if(!e||this.selectionRange.eq(e))return!1;let i=mo(this.dom,e);return i&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime{let r=this.delayedAndroidKey;r&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=r.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&r.force&&Tn(this.dom,r.key,r.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||t=="Enter")&&(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,n=!1;for(let r of t){let o=this.readMutation(r);o&&(o.typeOver&&(n=!0),e==-1?{from:e,to:i}=o:(e=Math.min(o.from,e),i=Math.max(o.to,i)))}return{from:e,to:i,typeOver:n}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),n=this.selectionChanged&&mo(this.dom,this.selectionRange);if(t<0&&!n)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let r=new Rh(this.view,t,e,i);return this.view.docView.domChanged={newSel:r.newSel?r.newSel.main:null},r}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,n=Cp(this.view,e);return this.view.state==i&&this.view.update([]),n}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty(t.type=="attributes"),t.type=="attributes"&&(e.flags|=4),t.type=="childList"){let i=Dd(e,t.previousSibling||t.target.previousSibling,-1),n=Dd(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:n?e.posBefore(n):e.posAtEnd,typeOver:!1}}else return t.type=="characterData"?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}destroy(){var t,e,i;this.stop(),(t=this.intersection)===null||t===void 0||t.disconnect(),(e=this.gapIntersection)===null||e===void 0||e.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let n of this.scrollTargets)n.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey)}};function Dd(s,t,e){for(;t;){let i=ht.get(t);if(i&&i.parent==s)return i;let n=t.parentNode;t=n!=s.dom?n:e>0?t.nextSibling:t.previousSibling}return null}function jb(s){let t=null;function e(a){a.preventDefault(),a.stopImmediatePropagation(),t=a.getTargetRanges()[0]}if(s.contentDOM.addEventListener("beforeinput",e,!0),s.dom.ownerDocument.execCommand("indent"),s.contentDOM.removeEventListener("beforeinput",e,!0),!t)return null;let i=t.startContainer,n=t.startOffset,r=t.endContainer,o=t.endOffset,l=s.docView.domAtPos(s.state.selection.main.anchor);return Es(l.node,l.offset,r,o)&&([i,n,r,o]=[r,o,i,n]),{anchorNode:i,anchorOffset:n,focusNode:r,focusOffset:o}}var et=class s{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return this.inputState.composing>0}get compositionStarted(){return this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:e}=t;this.dispatchTransactions=t.dispatchTransactions||e&&(i=>i.forEach(n=>e(n,this)))||(i=>this.update(i)),this.dispatch=this.dispatch.bind(this),this._root=t.root||L0(t.parent)||document,this.viewState=new To(t.state||dt.create(t)),t.scrollTo&&t.scrollTo.is(ho)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(As).map(i=>new Ps(i));for(let i of this.plugins)i.update(this);this.observer=new Ph(this),this.inputState=new wh(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Co(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure()}dispatch(...t){let e=t.length==1&&t[0]instanceof Ut?t:t.length==1&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e=!1,i=!1,n,r=this.state;for(let c of t){if(c.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn\'t start from the previous state.");r=c.state}if(this.destroyed){this.viewState.state=r;return}let o=this.hasFocus,l=0,a=null;t.some(c=>c.annotation(wp))?(this.inputState.notifiedFocused=o,l=1):o!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=o,a=yp(r,o),a||(l=1));let h=this.observer.delayedAndroidKey,f=null;if(h?(this.observer.clearDelayedAndroidKey(),f=this.observer.readChange(),(f&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(f=null)):this.observer.clear(),r.facet(dt.phrases)!=this.state.facet(dt.phrases))return this.setState(r);n=So.create(this,r,t),n.flags|=l;let u=this.viewState.scrollTarget;try{this.updateState=2;for(let c of t){if(u&&(u=u.map(c.changes)),c.scrollIntoView){let{main:d}=c.state.selection;u=new Rs(d.empty?d:V.cursor(d.head,d.head>d.anchor?-1:1))}for(let d of c.effects)d.is(ho)&&(u=d.value.clip(this.state))}this.viewState.update(n,u),this.bidiCache=_o.update(this.bidiCache,n.changes),n.empty||(this.updatePlugins(n),this.inputState.update(n)),e=this.docView.update(n),this.state.facet(Ts)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(e,t.some(c=>c.isUserEvent("select.pointer")))}finally{this.updateState=0}if(n.startState.facet(go)!=n.state.facet(go)&&(this.viewState.mustMeasureContent=!0),(e||i||u||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),!n.empty)for(let c of this.state.facet(mh))try{c(n)}catch(d){ii(this.state,d,"update listener")}(a||f)&&Promise.resolve().then(()=>{a&&this.state==a.startState&&this.dispatch(a),f&&!Cp(this,f)&&h.force&&Tn(this.contentDOM,h.key,h.keyCode)})}setState(t){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=t;return}this.updateState=2;let e=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new To(t),this.plugins=t.facet(As).map(i=>new Ps(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new Co(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(As),i=t.state.facet(As);if(e!=i){let n=[];for(let r of i){let o=e.indexOf(r);if(o<0)n.push(new Ps(r));else{let l=this.plugins[o];l.mustUpdate=t,n.push(l)}}for(let r of this.plugins)r.mustUpdate!=t&&r.destroy(this);this.plugins=n,this.pluginMap.clear()}else for(let n of this.plugins)n.mustUpdate=t;for(let n=0;n-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,n=i.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:o}=this.viewState;Math.abs(n-this.viewState.scrollTop)>1&&(o=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(o<0)if(Hd(i))r=-1,o=this.viewState.heightMap.height;else{let d=this.viewState.scrollAnchorAt(n);r=d.from,o=d.top}this.updateState=1;let a=this.viewState.measure(this);if(!a&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let h=[];a&4||([this.measureRequests,h]=[h,this.measureRequests]);let f=h.map(d=>{try{return d.read(this)}catch(p){return ii(this.state,p),Rd}}),u=So.create(this,this.state,[]),c=!1;u.flags|=a,e?e.flags|=a:e=u,this.updateState=2,u.empty||(this.updatePlugins(u),this.inputState.update(u),this.updateAttrs(),c=this.docView.update(u));for(let d=0;d1||p<-1){n=n+p,i.scrollTop=n/this.scaleY,o=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let l of this.state.facet(mh))l(e)}get themeClasses(){return _h+" "+(this.state.facet(Oh)?xp:kp)+" "+this.state.facet(go)}updateAttrs(){let t=Pd(this,rp,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",translate:"no",contenteditable:this.state.facet(Do)?"true":"false",class:"cm-content",style:`${I.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),Pd(this,Hh,e);let i=this.observer.ignore(()=>{let n=uh(this.contentDOM,this.contentAttrs,e),r=uh(this.dom,this.editorAttrs,t);return n||r});return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let n of i.effects)if(n.is(s.announce)){e&&(this.announceDOM.textContent=""),e=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=n.value}}mountStyles(){this.styleModules=this.state.facet(Ts);let t=this.state.facet(s.cspNonce);ue.mount(this.root,this.styleModules.concat(Fb).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn\'t allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),t){if(this.measureRequests.indexOf(t)>-1)return;if(t.key!=null){for(let e=0;ei.spec==t)||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return nh(this,t,bd(this,t,e,i))}moveByGroup(t,e){return nh(this,t,bd(this,t,e,i=>gb(this,t.head,i)))}visualLineSide(t,e){let i=this.bidiSpans(t),n=this.textDirectionAt(t.from),r=i[e?i.length-1:0];return V.cursor(r.side(e,n)+t.from,r.forward(!e,n)?1:-1)}moveToLineBoundary(t,e,i=!0){return pb(this,t,e,i)}moveVertically(t,e,i){return nh(this,t,mb(this,t,e,i))}domAtPos(t){return this.docView.domAtPos(t)}posAtDOM(t,e=0){return this.docView.posFromDOM(t,e)}posAtCoords(t,e=!0){return this.readMeasured(),cp(this,t,e)}coordsAtPos(t,e=1){this.readMeasured();let i=this.docView.coordsAt(t,e);if(!i||i.left==i.right)return i;let n=this.state.doc.lineAt(t),r=this.bidiSpans(n),o=r[Fe.find(r,t-n.from,-1,e)];return Ih(i,o.dir==xt.LTR==e>0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(sp)||tthis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>$b)return Xd(t.length);let e=this.textDirectionAt(t.from),i;for(let r of this.bidiCache)if(r.from==t.from&&r.dir==e&&(r.fresh||Yd(r.isolates,i=cd(this,t))))return r.order;i||(i=cd(this,t));let n=X0(t.text,e,i);return this.bidiCache.push(new _o(t.from,t.to,e,i,!0,n)),n}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||I.safari&&((t=this.inputState)===null||t===void 0?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{Bd(this.contentDOM),this.docView.updateSelection()})}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((t.nodeType==9?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return ho.of(new Rs(typeof t=="number"?V.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return ho.of(new Rs(V.cursor(i.from),"start","start",i.top-t,e,!0))}static domEventHandlers(t){return En.define(()=>({}),{eventHandlers:t})}static domEventObservers(t){return En.define(()=>({}),{eventObservers:t})}static theme(t,e){let i=ue.newName(),n=[go.of(i),Ts.of(Eh(`.${i}`,t))];return e&&e.dark&&n.push(Oh.of(!0)),n}static baseTheme(t){return Ja.lowest(Ts.of(Eh("."+_h,t,Sp)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),n=i&&ht.get(i)||ht.get(t);return((e=n==null?void 0:n.rootView)===null||e===void 0?void 0:e.view)||null}};et.styleModule=Ts;et.inputHandler=ip;et.focusChangeEffect=np;et.perLineTextDirection=sp;et.exceptionSink=ep;et.updateListener=mh;et.editable=Do;et.mouseSelectionStyle=tp;et.dragMovesSelection=Zd;et.clickAddsSelectionRange=Qd;et.decorations=Vs;et.outerDecorations=op;et.atomicRanges=Fh;et.bidiIsolatedRanges=lp;et.scrollMargins=ap;et.darkTheme=Oh;et.cspNonce=U.define({combine:s=>s.length?s[0]:""});et.contentAttributes=Hh;et.editorAttributes=rp;et.lineWrapping=et.contentAttributes.of({class:"cm-lineWrapping"});et.announce=bt.define();var $b=4096,Rd={},_o=class s{constructor(t,e,i,n,r,o){this.from=t,this.to=e,this.dir=i,this.isolates=n,this.fresh=r,this.order=o}static update(t,e){if(e.empty&&!t.some(r=>r.fresh))return t;let i=[],n=t.length?t[t.length-1].dir:xt.LTR;for(let r=Math.max(0,t.length-10);r=0;n--){let r=i[n],o=typeof r=="function"?r(s):r;o&&fh(o,e)}return e}var C1=I.mac?"mac":I.windows?"win":I.linux?"linux":"key";var Kb=!I.ios;var Id={".cm-line":{"& ::selection":{backgroundColor:"transparent !important"},"&::selection":{backgroundColor:"transparent !important"}}};Kb&&(Id[".cm-line"].caretColor="transparent !important",Id[".cm-content"]={caretColor:"transparent !important"});var M1=/x/.unicode!=null?"gu":"g";var A1=et.baseTheme({".cm-tooltip":{zIndex:100,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:`${7*2}px`,position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"\'\'",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}});var si=class extends ti{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}};si.prototype.elementClass="";si.prototype.toDOM=void 0;si.prototype.mapMode=Gt.TrackBefore;si.prototype.startSide=si.prototype.endSide=-1;si.prototype.point=!0;var Yb=0,Ue=class s{constructor(t,e,i){this.set=t,this.base=e,this.modified=i,this.id=Yb++}static define(t){if(t!=null&&t.base)throw new Error("Can not derive from a modified tag");let e=new s([],null,[]);if(e.set.push(e),t)for(let i of t.set)e.set.push(i);return e}static defineModifier(){let t=new No;return e=>e.modified.indexOf(t)>-1?e:No.get(e.base||e,e.modified.concat(t).sort((i,n)=>i.id-n.id))}},Xb=0,No=class s{constructor(){this.instances=[],this.id=Xb++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find(l=>l.base==t&&Jb(e,l.modified));if(i)return i;let n=[],r=new Ue(n,t,e);for(let l of e)l.instances.push(r);let o=Qb(e);for(let l of t.set)if(!l.modified.length)for(let a of o)n.push(s.get(l,a));return r}};function Jb(s,t){return s.length==t.length&&s.every((e,i)=>e==t[i])}function Qb(s){let t=[[]];for(let e=0;ei.length-e.length)}function Tp(s){let t=Object.create(null);for(let e in s){let i=s[e];Array.isArray(i)||(i=[i]);for(let n of e.split(" "))if(n){let r=[],o=2,l=n;for(let u=0;;){if(l=="..."&&u>0&&u+3==n.length){o=1;break}let c=/^"(?:[^"\\\\]|\\\\.)*?"|[^\\/!]+/.exec(l);if(!c)throw new RangeError("Invalid path: "+n);if(r.push(c[0]=="*"?"":c[0][0]==\'"\'?JSON.parse(c[0]):c[0]),u+=c[0].length,u==n.length)break;let d=n[u++];if(u==n.length&&d=="!"){o=0;break}if(d!="/")throw new RangeError("Invalid path: "+n);l=n.slice(u)}let a=r.length-1,h=r[a];if(!h)throw new RangeError("Invalid path: "+n);let f=new Ws(i,o,a>0?r.slice(0,a):null);t[h]=f.sort(t[h])}}return Zb.add(t)}var Zb=new j,Ws=class{constructor(t,e,i,n){this.tags=t,this.mode=e,this.context=i,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(t){return!t||t.depth{let o=n;for(let l of r)for(let a of l.set){let h=e[a.id];if(h){o=o?o+" "+h:h;break}}return o},scope:i}}var T=Ue.define,Ro=T(),Si=T(),Mp=T(Si),Ap=T(Si),Ci=T(),Po=T(Ci),Vh=T(Ci),Ge=T(),$i=T(Ge),ze=T(),We=T(),zh=T(),zs=T(zh),Io=T(),_={comment:Ro,lineComment:T(Ro),blockComment:T(Ro),docComment:T(Ro),name:Si,variableName:T(Si),typeName:Mp,tagName:T(Mp),propertyName:Ap,attributeName:T(Ap),className:T(Si),labelName:T(Si),namespace:T(Si),macroName:T(Si),literal:Ci,string:Po,docString:T(Po),character:T(Po),attributeValue:T(Po),number:Vh,integer:T(Vh),float:T(Vh),bool:T(Ci),regexp:T(Ci),escape:T(Ci),color:T(Ci),url:T(Ci),keyword:ze,self:T(ze),null:T(ze),atom:T(ze),unit:T(ze),modifier:T(ze),operatorKeyword:T(ze),controlKeyword:T(ze),definitionKeyword:T(ze),moduleKeyword:T(ze),operator:We,derefOperator:T(We),arithmeticOperator:T(We),logicOperator:T(We),bitwiseOperator:T(We),compareOperator:T(We),updateOperator:T(We),definitionOperator:T(We),typeOperator:T(We),controlOperator:T(We),punctuation:zh,separator:T(zh),bracket:zs,angleBracket:T(zs),squareBracket:T(zs),paren:T(zs),brace:T(zs),content:Ge,heading:$i,heading1:T($i),heading2:T($i),heading3:T($i),heading4:T($i),heading5:T($i),heading6:T($i),contentSeparator:T(Ge),list:T(Ge),quote:T(Ge),emphasis:T(Ge),strong:T(Ge),link:T(Ge),monospace:T(Ge),strikethrough:T(Ge),inserted:T(),deleted:T(),changed:T(),invalid:T(),meta:Io,documentMeta:T(Io),annotation:T(Io),processingInstruction:T(Io),definition:Ue.defineModifier(),constant:Ue.defineModifier(),function:Ue.defineModifier(),standard:Ue.defineModifier(),local:Ue.defineModifier(),special:Ue.defineModifier()},_1=Wh([{tag:_.link,class:"tok-link"},{tag:_.heading,class:"tok-heading"},{tag:_.emphasis,class:"tok-emphasis"},{tag:_.strong,class:"tok-strong"},{tag:_.keyword,class:"tok-keyword"},{tag:_.atom,class:"tok-atom"},{tag:_.bool,class:"tok-bool"},{tag:_.url,class:"tok-url"},{tag:_.labelName,class:"tok-labelName"},{tag:_.inserted,class:"tok-inserted"},{tag:_.deleted,class:"tok-deleted"},{tag:_.literal,class:"tok-literal"},{tag:_.string,class:"tok-string"},{tag:_.number,class:"tok-number"},{tag:[_.regexp,_.escape,_.special(_.string)],class:"tok-string2"},{tag:_.variableName,class:"tok-variableName"},{tag:_.local(_.variableName),class:"tok-variableName tok-local"},{tag:_.definition(_.variableName),class:"tok-variableName tok-definition"},{tag:_.special(_.variableName),class:"tok-variableName2"},{tag:_.definition(_.propertyName),class:"tok-propertyName tok-definition"},{tag:_.typeName,class:"tok-typeName"},{tag:_.namespace,class:"tok-namespace"},{tag:_.className,class:"tok-className"},{tag:_.macroName,class:"tok-macroName"},{tag:_.propertyName,class:"tok-propertyName"},{tag:_.operator,class:"tok-operator"},{tag:_.comment,class:"tok-comment"},{tag:_.meta,class:"tok-meta"},{tag:_.invalid,class:"tok-invalid"},{tag:_.punctuation,class:"tok-punctuation"}]);var Gh,Dn=new j;function tw(s){return U.define({combine:s?t=>t.concat(s):void 0})}var ew=new j,ee=class{constructor(t,e,i=[],n=""){this.data=t,this.name=n,dt.prototype.hasOwnProperty("tree")||Object.defineProperty(dt.prototype,"tree",{get(){return jh(this)}}),this.parser=e,this.extension=[Rn.of(this),dt.languageData.of((r,o,l)=>{let a=Op(r,o,l),h=a.type.prop(Dn);if(!h)return[];let f=r.facet(h),u=a.type.prop(ew);if(u){let c=a.resolve(o-a.from,l);for(let d of u)if(d.test(c,r)){let p=r.facet(d.facet);return d.type=="replace"?p:p.concat(f)}}return f})].concat(i)}isActiveAt(t,e,i=-1){return Op(t,e,i).type.prop(Dn)==this.data}findRegions(t){let e=t.facet(Rn);if((e==null?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],n=(r,o)=>{if(r.prop(Dn)==this.data){i.push({from:o,to:o+r.length});return}let l=r.prop(j.mounted);if(l){if(l.tree.prop(Dn)==this.data){if(l.overlay)for(let a of l.overlay)i.push({from:a.from+o,to:a.to+o});else i.push({from:o,to:o+r.length});return}else if(l.overlay){let a=i.length;if(n(l.tree,l.overlay[0].from+o),i.length>a)return}}for(let a=0;ai.isTop?e:void 0)]}),t.name)}configure(t,e){return new s(this.data,this.parser.configure(t),e||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function jh(s){let t=s.field(ee.state,!1);return t?t.tree:ct.empty}var $h=class{constructor(t){this.doc=t,this.cursorPos=0,this.string="",this.cursor=t.iter()}get length(){return this.doc.length}syncTo(t){return this.string=this.cursor.next(t-this.cursorPos).value,this.cursorPos=t+this.string.length,this.cursorPos-this.string.length}chunk(t){return this.syncTo(t),this.string}get lineChunks(){return!0}read(t,e){let i=this.cursorPos-this.string.length;return t=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}},Gs=null,Kh=class s{constructor(t,e,i=[],n,r,o,l,a){this.parser=t,this.state=e,this.fragments=i,this.tree=n,this.treeLen=r,this.viewport=o,this.skipped=l,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new s(t,e,[],ct.empty,0,i,[],null)}startParse(){return this.parser.startParse(new $h(this.state.doc),this.fragments)}work(t,e){return e!=null&&e>=this.state.doc.length&&(e=void 0),this.tree!=ct.empty&&this.isDone(e!=null?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof t=="number"){let n=Date.now()+t;t=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),e!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&e=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext(()=>{for(;!(e=this.parse.advance()););}),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(Hi.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=Gs;Gs=this;try{return t()}finally{Gs=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=_p(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:n,treeLen:r,viewport:o,skipped:l}=this;if(this.takeTree(),!t.empty){let a=[];if(t.iterChangedRanges((h,f,u,c)=>a.push({fromA:h,toA:f,fromB:u,toB:c})),i=Hi.applyChanges(i,a),n=ct.empty,r=0,o={from:t.mapPos(o.from,-1),to:t.mapPos(o.to,1)},this.skipped.length){l=[];for(let h of this.skipped){let f=t.mapPos(h.from,1),u=t.mapPos(h.to,-1);ft.from&&(this.fragments=_p(this.fragments,n,r),this.skipped.splice(i--,1))}return this.skipped.length>=e?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends bn{createParse(e,i,n){let r=n[0].from,o=n[n.length-1].to;return{parsedPos:r,advance(){let a=Gs;if(a){for(let h of n)a.tempSkipped.push(h);t&&(a.scheduleOn=a.scheduleOn?Promise.all([a.scheduleOn,t]):t)}return this.parsedPos=o,new ct(Rt.none,[],[],o-r)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&e[0].from==0&&e[0].to>=t}static get(){return Gs}};function _p(s,t,e){return Hi.applyChanges(s,[{fromA:t,toA:e,fromB:t,toB:e}])}var Us=class s{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new s(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=Kh.create(t.facet(Rn).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new s(i)}};ee.state=Qe.define({create:Us.init,update(s,t){for(let e of t.effects)if(e.is(ee.setState))return e.value;return t.startState.facet(Rn)!=t.state.facet(Rn)?Us.init(t.state):s.apply(t)}});var Pp=s=>{let t=setTimeout(()=>s(),500);return()=>clearTimeout(t)};typeof requestIdleCallback!="undefined"&&(Pp=s=>{let t=-1,e=setTimeout(()=>{t=requestIdleCallback(s,{timeout:400})},100);return()=>t<0?clearTimeout(e):cancelIdleCallback(t)});var Uh=typeof navigator!="undefined"&&(!((Gh=navigator.scheduling)===null||Gh===void 0)&&Gh.isInputPending)?()=>navigator.scheduling.isInputPending():null,iw=En.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(ee.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(ee.state);(e.tree!=e.context.tree||!e.context.isDone(t.doc.length))&&(this.working=Pp(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEndn+1e3,a=r.context.work(()=>Uh&&Uh()||Date.now()>o,n+(l?0:1e5));this.chunkBudget-=Date.now()-e,(a||this.chunkBudget<=0)&&(r.context.takeTree(),this.view.dispatch({effects:ee.setState.of(new Us(r.context))})),this.chunkBudget>0&&!(a&&!l)&&this.scheduleWork(),this.checkAsyncSchedule(r.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then(()=>this.scheduleWork()).catch(e=>ii(this.view.state,e)).then(()=>this.workScheduled--),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),Rn=U.define({combine(s){return s.length?s[0]:null},enables:s=>[ee.state,iw,et.contentAttributes.compute([s],t=>{let e=t.facet(s);return e&&e.name?{"data-language":e.name}:{}})]});var Yh=class s{constructor(t,e){this.specs=t;let i;function n(l){let a=ue.newName();return(i||(i=Object.create(null)))["."+a]=l,a}let r=typeof e.all=="string"?e.all:e.all?n(e.all):void 0,o=e.scope;this.scope=o instanceof ee?l=>l.prop(Dn)==o.data:o?l=>l==o:void 0,this.style=Wh(t.map(l=>({tag:l.tag,class:l.class||n(Object.assign({},l,{tag:null}))})),{all:r}).style,this.module=i?new ue(i):null,this.themeType=e.themeType}static define(t,e){return new s(t,e||{})}};var F1=Yh.define([{tag:_.meta,color:"#404740"},{tag:_.link,textDecoration:"underline"},{tag:_.heading,textDecoration:"underline",fontWeight:"bold"},{tag:_.emphasis,fontStyle:"italic"},{tag:_.strong,fontWeight:"bold"},{tag:_.strikethrough,textDecoration:"line-through"},{tag:_.keyword,color:"#708"},{tag:[_.atom,_.bool,_.url,_.contentSeparator,_.labelName],color:"#219"},{tag:[_.literal,_.inserted],color:"#164"},{tag:[_.string,_.deleted],color:"#a11"},{tag:[_.regexp,_.escape,_.special(_.string)],color:"#e40"},{tag:_.definition(_.variableName),color:"#00f"},{tag:_.local(_.variableName),color:"#30a"},{tag:[_.typeName,_.namespace],color:"#085"},{tag:_.className,color:"#167"},{tag:[_.special(_.variableName),_.macroName],color:"#256"},{tag:_.definition(_.propertyName),color:"#00c"},{tag:_.comment,color:"#940"},{tag:_.invalid,color:"#f00"}]);var nw=Object.create(null),Ep=[Rt.none];var Dp=[],Rp=Object.create(null),sw=Object.create(null);for(let[s,t]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])sw[s]=rw(nw,t);function qh(s,t){Dp.indexOf(s)>-1||(Dp.push(s),console.warn(t))}function rw(s,t){let e=[];for(let l of t.split(" ")){let a=[];for(let h of l.split(".")){let f=s[h]||_[h];f?typeof f=="function"?a.length?a=a.map(f):qh(h,`Modifier ${h} used at start of tag`):a.length?qh(h,`Tag ${h} used as modifier`):a=Array.isArray(f)?f:[f]:qh(h,`Unknown highlighting tag ${h}`)}for(let h of a)e.push(h)}if(!e.length)return 0;let i=t.replace(/ /g,"_"),n=i+" "+e.map(l=>l.id),r=Rp[n];if(r)return r.id;let o=Rp[n]=Rt.define({id:Ep.length,name:i,props:[Tp({[i]:e})]});return Ep.push(o),o.id}var V1={rtl:It.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:xt.RTL}),ltr:It.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:xt.LTR}),auto:It.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var Jh=class s{constructor(t,e,i,n,r,o,l,a,h,f=0,u){this.p=t,this.stack=e,this.state=i,this.reducePos=n,this.pos=r,this.score=o,this.buffer=l,this.bufferBase=a,this.curContext=h,this.lookAhead=f,this.parent=u}toString(){return`[${this.stack.filter((t,e)=>e%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(t,e,i=0){let n=t.parser.context;return new s(t,[],e,i,i,0,[],0,n?new Lo(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(t,e){this.stack.push(this.state,e,this.bufferBase+this.buffer.length),this.state=t}reduce(t){var e;let i=t>>19,n=t&65535,{parser:r}=this.p,o=r.dynamicPrecedence(n);if(o&&(this.score+=o),i==0){this.pushState(r.getGoto(this.state,n,!0),this.reducePos),n=2e3&&!(!((e=this.p.parser.nodeSet.types[n])===null||e===void 0)&&e.isAnonymous)&&(a==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=h):this.p.lastBigReductionSizel;)this.stack.pop();this.reduceContext(n,a)}storeNode(t,e,i,n=4,r=!1){if(t==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&o.buffer[l-4]==0&&o.buffer[l-1]>-1){if(e==i)return;if(o.buffer[l-2]>=e){o.buffer[l-2]=i;return}}}if(!r||this.pos==i)this.buffer.push(t,e,i,n);else{let o=this.buffer.length;if(o>0&&this.buffer[o-4]!=0)for(;o>0&&this.buffer[o-2]>i;)this.buffer[o]=this.buffer[o-4],this.buffer[o+1]=this.buffer[o-3],this.buffer[o+2]=this.buffer[o-2],this.buffer[o+3]=this.buffer[o-1],o-=4,n>4&&(n-=4);this.buffer[o]=t,this.buffer[o+1]=e,this.buffer[o+2]=i,this.buffer[o+3]=n}}shift(t,e,i,n){if(t&131072)this.pushState(t&65535,this.pos);else if((t&262144)==0){let r=t,{parser:o}=this.p;(n>this.pos||e<=o.maxNode)&&(this.pos=n,o.stateFlag(r,1)||(this.reducePos=n)),this.pushState(r,i),this.shiftContext(e,i),e<=o.maxNode&&this.buffer.push(e,i,n,4)}else this.pos=n,this.shiftContext(e,i),e<=this.p.parser.maxNode&&this.buffer.push(e,i,n,4)}apply(t,e,i,n){t&65536?this.reduce(t):this.shift(t,e,i,n)}useNode(t,e){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=t)&&(this.p.reused.push(t),i++);let n=this.pos;this.reducePos=this.pos=n+t.length,this.pushState(e,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,t,this,this.p.stream.reset(this.pos-t.length)))}split(){let t=this,e=t.buffer.length;for(;e>0&&t.buffer[e-2]>t.reducePos;)e-=4;let i=t.buffer.slice(e),n=t.bufferBase+e;for(;t&&n==t.bufferBase;)t=t.parent;return new s(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,t)}recoverByDelete(t,e){let i=t<=this.p.parser.maxNode;i&&this.storeNode(t,this.pos,e,4),this.storeNode(0,this.pos,e,i?8:4),this.pos=this.reducePos=e,this.score-=190}canShift(t){for(let e=new Qh(this);;){let i=this.p.parser.stateSlot(e.state,4)||this.p.parser.hasAction(e.state,t);if(i==0)return!1;if((i&65536)==0)return!0;e.reduce(i)}}recoverByInsert(t){if(this.stack.length>=300)return[];let e=this.p.parser.nextStates(this.state);if(e.length>8||this.stack.length>=120){let n=[];for(let r=0,o;ra&1&&l==o)||n.push(e[r],o)}e=n}let i=[];for(let n=0;n>19,n=e&65535,r=this.stack.length-i*3;if(r<0||t.getGoto(this.stack[r],n,!1)<0){let o=this.findForcedReduction();if(o==null)return!1;e=o}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(e),!0}findForcedReduction(){let{parser:t}=this.p,e=[],i=(n,r)=>{if(!e.includes(n))return e.push(n),t.allActions(n,o=>{if(!(o&393216))if(o&65536){let l=(o>>19)-r;if(l>1){let a=o&65535,h=this.stack.length-l*3;if(h>=0&&t.getGoto(this.stack[h],a,!1)>=0)return l<<19|65536|a}}else{let l=i(o,r+1);if(l!=null)return l}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:t}=this.p;return t.data[t.stateSlot(this.state,1)]==65535&&!t.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(t){if(this.state!=t.state||this.stack.length!=t.stack.length)return!1;for(let e=0;ethis.lookAhead&&(this.emitLookAhead(),this.lookAhead=t)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}},Lo=class{constructor(t,e){this.tracker=t,this.context=e,this.hash=t.strict?t.hash(e):0}},Qh=class{constructor(t){this.start=t,this.state=t.state,this.stack=t.stack,this.base=this.stack.length}reduce(t){let e=t&65535,i=t>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let n=this.start.p.parser.getGoto(this.stack[this.base-3],e,!0);this.state=n}},Zh=class s{constructor(t,e,i){this.stack=t,this.pos=e,this.index=i,this.buffer=t.buffer,this.index==0&&this.maybeNext()}static create(t,e=t.bufferBase+t.buffer.length){return new s(t,e,e-t.bufferBase)}maybeNext(){let t=this.stack.parent;t!=null&&(this.index=this.stack.bufferBase-t.bufferBase,this.stack=t,this.buffer=t.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new s(this.stack,this.pos,this.index)}};function qs(s,t=Uint16Array){if(typeof s!="string")return s;let e=null;for(let i=0,n=0;i=92&&o--,o>=34&&o--;let a=o-32;if(a>=46&&(a-=46,l=!0),r+=a,l)break;r*=46}e?e[n++]=r:e=new t(r)}return e}var Pn=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},Ip=new Pn,tf=class{constructor(t,e){this.input=t,this.ranges=e,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Ip,this.rangeIndex=0,this.pos=this.chunkPos=e[0].from,this.range=e[0],this.end=e[e.length-1].to,this.readNext()}resolveOffset(t,e){let i=this.range,n=this.rangeIndex,r=this.pos+t;for(;ri.to:r>=i.to;){if(n==this.ranges.length-1)return null;let o=this.ranges[++n];r+=o.from-i.to,i=o}return r}clipPos(t){if(t>=this.range.from&&tt)return Math.max(t,e.from);return this.end}peek(t){let e=this.chunkOff+t,i,n;if(e>=0&&e=this.chunk2Pos&&il.to&&(this.chunk2=this.chunk2.slice(0,l.to-i)),n=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),n}acceptToken(t,e=0){let i=e?this.resolveOffset(e,-1):this.pos;if(i==null||i=this.chunk2Pos&&this.posthis.range.to?t.slice(0,this.range.to-this.pos):t,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(t=1){for(this.chunkOff+=t;this.pos+t>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();t-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=t,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(t,e){if(e?(this.token=e,e.start=t,e.lookAhead=t+1,e.value=e.extended=-1):this.token=Ip,this.pos!=t){if(this.pos=t,t==this.end)return this.setDone(),this;for(;t=this.range.to;)this.range=this.ranges[++this.rangeIndex];t>=this.chunkPos&&t=this.chunkPos&&e<=this.chunkPos+this.chunk.length)return this.chunk.slice(t-this.chunkPos,e-this.chunkPos);if(t>=this.chunk2Pos&&e<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(t-this.chunk2Pos,e-this.chunk2Pos);if(t>=this.range.from&&e<=this.range.to)return this.input.read(t,e);let i="";for(let n of this.ranges){if(n.from>=e)break;n.to>t&&(i+=this.input.read(Math.max(n.from,t),Math.min(n.to,e)))}return i}},Mi=class{constructor(t,e){this.data=t,this.id=e}token(t,e){let{parser:i}=e.p;Fp(this.data,t,e,this.id,i.data,i.tokenPrecTable)}};Mi.prototype.contextual=Mi.prototype.fallback=Mi.prototype.extend=!1;var oi=class{constructor(t,e,i){this.precTable=e,this.elseToken=i,this.data=typeof t=="string"?qs(t):t}token(t,e){let i=t.pos,n=0;for(;;){let r=t.next<0,o=t.resolveOffset(1,1);if(Fp(this.data,t,e,0,this.data,this.precTable),t.token.value>-1)break;if(this.elseToken==null)return;if(r||n++,o==null)break;t.reset(o,t.token)}n&&(t.reset(i,t.token),t.acceptToken(this.elseToken,n))}};oi.prototype.contextual=Mi.prototype.fallback=Mi.prototype.extend=!1;function Fp(s,t,e,i,n,r){let o=0,l=1<0){let p=s[d];if(a.allows(p)&&(t.token.value==-1||t.token.value==p||lw(p,t.token.value,n,r))){t.acceptToken(p);break}}let f=t.next,u=0,c=s[o+2];if(t.next<0&&c>u&&s[h+c*3-3]==65535){o=s[h+c*3-1];continue t}for(;u>1,p=h+d+(d<<1),g=s[p],m=s[p+1]||65536;if(f=m)u=d+1;else{o=s[p+2],t.advance();continue t}}break}}function Np(s,t,e){for(let i=t,n;(n=s[i])!=65535;i++)if(n==e)return i-t;return-1}function lw(s,t,e,i){let n=Np(e,i,t);return n<0||Np(e,i,s)t)&&!i.type.isError)return e<0?Math.max(0,Math.min(i.to-1,t-25)):Math.min(s.length,Math.max(i.from+1,t+25));if(e<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return e<0?0:s.length}}var ef=class{constructor(t,e){this.fragments=t,this.nodeSet=e,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let t=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(t){for(this.safeFrom=t.openStart?Bp(t.tree,t.from+t.offset,1)-t.offset:t.from,this.safeTo=t.openEnd?Bp(t.tree,t.to+t.offset,-1)-t.offset:t.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(t.tree),this.start.push(-t.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(t){if(tt)return this.nextStart=o,null;if(r instanceof ct){if(o==t){if(o=Math.max(this.safeFrom,t)&&(this.trees.push(r),this.start.push(o),this.index.push(0))}else this.index[e]++,this.nextStart=o+r.length}}},nf=class{constructor(t,e){this.stream=e,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=t.tokenizers.map(i=>new Pn)}getActions(t){let e=0,i=null,{parser:n}=t.p,{tokenizers:r}=n,o=n.stateSlot(t.state,3),l=t.curContext?t.curContext.hash:0,a=0;for(let h=0;hu.end+25&&(a=Math.max(u.lookAhead,a)),u.value!=0)){let c=e;if(u.extended>-1&&(e=this.addActions(t,u.extended,u.end,e)),e=this.addActions(t,u.value,u.end,e),!f.extend&&(i=u,e>c))break}}for(;this.actions.length>e;)this.actions.pop();return a&&t.setLookAhead(a),!i&&t.pos==this.stream.end&&(i=new Pn,i.value=t.p.parser.eofTerm,i.start=i.end=t.pos,e=this.addActions(t,i.value,i.end,e)),this.mainToken=i,this.actions}getMainToken(t){if(this.mainToken)return this.mainToken;let e=new Pn,{pos:i,p:n}=t;return e.start=i,e.end=Math.min(i+1,n.stream.end),e.value=i==n.stream.end?n.parser.eofTerm:0,e}updateCachedToken(t,e,i){let n=this.stream.clipPos(i.pos);if(e.token(this.stream.reset(n,t),i),t.value>-1){let{parser:r}=i.p;for(let o=0;o=0&&i.p.parser.dialect.allows(l>>1)){(l&1)==0?t.value=l>>1:t.extended=l>>1;break}}}else t.value=0,t.end=this.stream.clipPos(n+1)}putAction(t,e,i,n){for(let r=0;rt.bufferLength*4?new ef(i,t.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let t=this.stacks,e=this.minStackPos,i=this.stacks=[],n,r;if(this.bigReductionCount>300&&t.length==1){let[o]=t;for(;o.forceReduce()&&o.stack.length&&o.stack[o.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let o=0;oe)i.push(l);else{if(this.advanceStack(l,i,t))continue;{n||(n=[],r=[]),n.push(l);let a=this.tokens.getMainToken(l);r.push(a.value,a.end)}}break}}if(!i.length){let o=n&&aw(n);if(o)return ie&&console.log("Finish with "+this.stackID(o)),this.stackToTree(o);if(this.parser.strict)throw ie&&n&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+e);this.recovering||(this.recovering=5)}if(this.recovering&&n){let o=this.stoppedAt!=null&&n[0].pos>this.stoppedAt?n[0]:this.runRecovery(n,r,i);if(o)return ie&&console.log("Force-finish "+this.stackID(o)),this.stackToTree(o.forceAll())}if(this.recovering){let o=this.recovering==1?1:this.recovering*3;if(i.length>o)for(i.sort((l,a)=>a.score-l.score);i.length>o;)i.pop();i.some(l=>l.reducePos>e)&&this.recovering--}else if(i.length>1){t:for(let o=0;o500&&h.buffer.length>500)if((l.score-h.score||l.buffer.length-h.buffer.length)>0)i.splice(a--,1);else{i.splice(o--,1);continue t}}}i.length>12&&i.splice(12,i.length-12)}this.minStackPos=i[0].pos;for(let o=1;o ":"";if(this.stoppedAt!=null&&n>this.stoppedAt)return t.forceReduce()?t:null;if(this.fragments){let h=t.curContext&&t.curContext.tracker.strict,f=h?t.curContext.hash:0;for(let u=this.fragments.nodeAt(n);u;){let c=this.parser.nodeSet.types[u.type.id]==u.type?r.getGoto(t.state,u.type.id):-1;if(c>-1&&u.length&&(!h||(u.prop(j.contextHash)||0)==f))return t.useNode(u,c),ie&&console.log(o+this.stackID(t)+` (via reuse of ${r.getName(u.type.id)})`),!0;if(!(u instanceof ct)||u.children.length==0||u.positions[0]>0)break;let d=u.children[0];if(d instanceof ct&&u.positions[0]==0)u=d;else break}}let l=r.stateSlot(t.state,4);if(l>0)return t.reduce(l),ie&&console.log(o+this.stackID(t)+` (via always-reduce ${r.getName(l&65535)})`),!0;if(t.stack.length>=8400)for(;t.stack.length>6e3&&t.forceReduce(););let a=this.tokens.getActions(t);for(let h=0;hn?e.push(p):i.push(p)}return!1}advanceFully(t,e){let i=t.pos;for(;;){if(!this.advanceStack(t,null,null))return!1;if(t.pos>i)return Lp(t,e),!0}}runRecovery(t,e,i){let n=null,r=!1;for(let o=0;o ":"";if(l.deadEnd&&(r||(r=!0,l.restart(),ie&&console.log(f+this.stackID(l)+" (restarted)"),this.advanceFully(l,i))))continue;let u=l.split(),c=f;for(let d=0;u.forceReduce()&&d<10&&(ie&&console.log(c+this.stackID(u)+" (via force-reduce)"),!this.advanceFully(u,i));d++)ie&&(c=this.stackID(u)+" -> ");for(let d of l.recoverByInsert(a))ie&&console.log(f+this.stackID(d)+" (via recover-insert)"),this.advanceFully(d,i);this.stream.end>l.pos?(h==l.pos&&(h++,a=0),l.recoverByDelete(a,h),ie&&console.log(f+this.stackID(l)+` (via recover-delete ${this.parser.getName(a)})`),Lp(l,i)):(!n||n.scoret.topRules[l][1]),n=[];for(let l=0;l=0)r(f,a,l[h++]);else{let u=l[h+-f];for(let c=-f;c>0;c--)r(l[h++],a,u);h++}}}this.nodeSet=new bs(e.map((l,a)=>Rt.define({name:a>=this.minRepeatTerm?void 0:l,id:a,props:n[a],top:i.indexOf(a)>-1,error:a==0,skipped:t.skippedNodes&&t.skippedNodes.indexOf(a)>-1}))),t.propSources&&(this.nodeSet=this.nodeSet.extend(...t.propSources)),this.strict=!1,this.bufferLength=1024;let o=qs(t.tokenData);this.context=t.context,this.specializerSpecs=t.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let l=0;ltypeof l=="number"?new Mi(o,l):l),this.topRules=t.topRules,this.dialects=t.dialects||{},this.dynamicPrecedences=t.dynamicPrecedences||null,this.tokenPrecTable=t.tokenPrec,this.termNames=t.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(t,e,i){let n=new sf(this,t,e,i);for(let r of this.wrappers)n=r(n,t,e,i);return n}getGoto(t,e,i=!1){let n=this.goto;if(e>=n[0])return-1;for(let r=n[e+1];;){let o=n[r++],l=o&1,a=n[r++];if(l&&i)return a;for(let h=r+(o>>1);r0}validAction(t,e){return!!this.allActions(t,i=>i==e?!0:null)}allActions(t,e){let i=this.stateSlot(t,4),n=i?e(i):void 0;for(let r=this.stateSlot(t,1);n==null;r+=3){if(this.data[r]==65535)if(this.data[r+1]==1)r=ri(this.data,r+2);else break;n=e(ri(this.data,r+1))}return n}nextStates(t){let e=[];for(let i=this.stateSlot(t,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=ri(this.data,i+2);else break;if((this.data[i+2]&1)==0){let n=this.data[i+1];e.some((r,o)=>o&1&&r==n)||e.push(this.data[i],n)}}return e}configure(t){let e=Object.assign(Object.create(s.prototype),this);if(t.props&&(e.nodeSet=this.nodeSet.extend(...t.props)),t.top){let i=this.topRules[t.top];if(!i)throw new RangeError(`Invalid top rule name ${t.top}`);e.top=i}return t.tokenizers&&(e.tokenizers=this.tokenizers.map(i=>{let n=t.tokenizers.find(r=>r.from==i);return n?n.to:i})),t.specializers&&(e.specializers=this.specializers.slice(),e.specializerSpecs=this.specializerSpecs.map((i,n)=>{let r=t.specializers.find(l=>l.from==i.external);if(!r)return i;let o=Object.assign(Object.assign({},i),{external:r.to});return e.specializers[n]=Hp(o),o})),t.contextTracker&&(e.context=t.contextTracker),t.dialect&&(e.dialect=this.parseDialect(t.dialect)),t.strict!=null&&(e.strict=t.strict),t.wrap&&(e.wrappers=e.wrappers.concat(t.wrap)),t.bufferLength!=null&&(e.bufferLength=t.bufferLength),e}hasWrappers(){return this.wrappers.length>0}getName(t){return this.termNames?this.termNames[t]:String(t<=this.maxNode&&this.nodeSet.types[t].name||t)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(t){let e=this.dynamicPrecedences;return e==null?0:e[t]||0}parseDialect(t){let e=Object.keys(this.dialects),i=e.map(()=>!1);if(t)for(let r of t.split(" ")){let o=e.indexOf(r);o>=0&&(i[o]=!0)}let n=null;for(let r=0;ri)&&e.p.parser.stateFlag(e.state,2)&&(!t||t.scores.external(e,i)<<1|t}return s.get}var hw=Ho.deserialize({version:14,states:")`QQOPOOOfOQO\'#C^OqOSO\'#C`O|OWO\'#CbO!XO`O\'#CeO!dOpO\'#CgOOOO\'#Ck\'#CkOOOO\'#Ci\'#CiQQOPOOOOOO,58x,58xO!oOQO,58xO!wOQO,58xOOOO,58z,58zO#POSO,58zO#XOSO,58zO#aOWO,58|O#iOWO,58|O#qOWO,58|OOOO,59P,59PO#yO`O,59PO$RO`O,59POOOO,59R,59RO$ZOpO,59RO$cOpO,59ROOOO-E6g-E6gOOOO1G.d1G.dO$kOQO1G.dO$nOQO1G.dOOOO1G.f1G.fO$sOSO1G.fO$vOSO1G.fOOOO1G.h1G.hO${OWO1G.hO%QOWO1G.hO%YOWO1G.hO%bOWO1G.hOOOO1G.k1G.kO%gO`O1G.kO%jO`O1G.kOOOO1G.m1G.mO%oOpO1G.mO%rOpO1G.mOOOO7+$O7+$OO%wOQO7+$OOOOO7+$Q7+$QO%|OSO7+$QOOOO7+$S7+$SO&ROWO7+$SO&WOWO7+$SO&`OWO7+$SOOOO7+$V7+$VO&eO`O7+$VOOOO7+$X7+$XO&jOpO7+$XOOOO<p.is(Aa)))return this.create(t.state);if(!t.docChanged)return s.inserted_ranges=[],s.deleted_ranges=[],s;let e=[];t.changes.iterChangedRanges((p,g,m,b)=>e.push({fromA:p,toA:g,fromB:m,toB:b}));let i=we.applyChanges(s.fragments,e),n=t.state.doc.toString(),r=Fo.parser.parse(new ps(t.state.doc),i);i=we.addTree(r,i);let o=new Map,l=[],a=new Map,h=new Set;for(let p of e){s.ranges.tree.search([p.fromA,p.toA],(g,m)=>{s.ranges.tree.remove(m,g),h.add(g);for(let b of g.base_range.thread)a.set(b.from,b);return!0});for(let g of of(r,n,p.fromB,p.toB))o.set(g.from,g);l.push([p.toA,p.toB-p.fromB-(p.toA-p.fromA)])}for(let p of h)p.type==="comment"&&a.delete(p.from);let f=0,u=s.ranges.tree.nil_node;function c(p){if(p!=null&&p!=u){for(c(p.left);l.length&&p.item.key.low>=l[0][0];)f+=l.shift()[1];p.item.value.apply_offset(f),p.item.key.low=p.item.value.from,p.item.key.high=p.item.value.to,c(p.right),p.left!=u&&(p.max.low=p.left.max.low),p.right!=u&&(p.max.high=p.right.max.high)}}c(s.ranges.tree.root);let d=Array.from(o.values());for(let p of d)s.ranges.tree.insert([p.from,p.to],p);for(let p of d)p.type==="comment"&&a.set(p.from,p);if(a.size){let p=[],g,m=[];for(let b of Array.from(a.values()).sort((w,y)=>w.from-y.from))b.clear_references(),b.replies.length=0,!g||g!=null&&g.right_adjacent(b)?m.push(b):(p.push(m),m=[b]),g=b;p.push(m);for(let b of p){let w=b[0],y=s.ranges.tree.search([w.from,w.from])[0];y.replies.length=0;for(let v of b.slice(y===w?1:0))v.add_reply(y)}}return s.ranges.ranges=s.ranges.tree.values,{tree:r,ranges:s.ranges,fragments:i,inserted_ranges:d,deleted_ranges:[...h]}}});function fw(s,t){var n,r;let e=fe.PLUGIN_SETTINGS.enable_metadata&&((n=s.firstChild)!=null&&n.type.name.startsWith("MDSep"))?s.firstChild.from:void 0,i;if(s.type.name==="Substitution"){let o=e?(r=s.firstChild)==null?void 0:r.nextSibling:s.firstChild;if(!o||o.type.name!=="MSub")return;i=o.from}return uw(s.from,s.to,s.type.name,t.slice(s.from,s.to),i,e)}function of(s,t,e=0,i=t.length){let n=[],r,o=s.cursor();if(o.childAfter(e-1),o.node.type.name==="CriticMarkup"||o.node.from>i)return n;if(o)do{let l=o.node;if(l.type.name==="\\u26A0")continue;let a=fw(l,t);a&&(a.type==="comment"&&r&&r.right_adjacent(a)&&a.add_reply(r),n.push(a),r=a)}while(o.nextSibling()&&o.node.from<=i);return n}function Vp(s){let t=Fo.parser.parse(s);return of(t,s)}function uw(s,t,e,i,n,r){switch(e){case"Addition":return new Ai(s,t,i,r);case"Deletion":return new Xi(s,t,i,r);case"Substitution":return new Qi(s,n,t,i,r);case"Highlight":return new Ji(s,t,i,r);case"Comment":return new Yi(s,t,i,r);default:return new Ai(s,t,i,r)}}var lv={addition:Ai,deletion:Xi,highlight:Ji,substitution:Qi,comment:Yi};function lf(){let s;return fe.PLUGIN_SETTINGS.add_metadata&&(s={},fe.PLUGIN_SETTINGS.add_author_metadata&&(s.author=fe.PLUGIN_SETTINGS.author||void 0),fe.PLUGIN_SETTINGS.add_timestamp_metadata&&(s.time=Math.floor(Date.now()/1e3)),Object.keys(s).length===0&&(s=void 0)),s}var Iv={addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",comment:"ignore_metadata",highlight:"ignore_metadata"},Nv={addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",comment:"stay_inside",highlight:"stay_inside"};function zp(s,t,e,i,n=0,r=0){if(!e)return{insert:t+s,start_offset:n,end_offset:r};let o=Ft[e],l=i&&Object.keys(i).length?JSON.stringify(i)+"@@":"",a=o[0]+l+(e==="substitution"?t+o[1]+s+o[2]:t+s+o[1]),h=o[0].length+l.length;return n+=h,r+=e==="substitution"?o[1].length:0,{insert:a,start_offset:n,end_offset:r}}function Vo(s,t,e=""){return zp(t,e,s,lf()).insert}var li=require("obsidian");function Wo(s,t){if(s.length!=t.length)return!1;for(let e=0;ethis.i;){let e=t.elements.pop();t.dom.removeChild(e.dom),e.destroy()}}},Nn=class{constructor(t,e){this.view=t;this.config=e;N(this,"dom");N(this,"elements",[]);N(this,"markers");N(this,"spacer",null);this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in e.domEventHandlers)this.dom.addEventListener(i,n=>{let r=n.target,o;if(r!=this.dom&&this.dom.contains(r)){for(;r.parentNode!=this.dom;)r=r.parentNode;let a=r.getBoundingClientRect();o=(a.top+a.bottom)/2}else o=n.clientY;let l=t.lineBlockAtHeight(o-t.documentTop);e.domEventHandlers[i](t,l,n)&&n.preventDefault()});this.markers=Wp(e.markers(t)),e.initialSpacer&&(this.spacer=new In(t,0,0,[e.initialSpacer(t)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(t){let e=this.markers;if(this.markers=Wp(this.config.markers(t.view)),this.spacer&&this.config.updateSpacer){let n=this.config.updateSpacer(this.spacer.markers[0],t);n!=this.spacer.markers[0]&&this.spacer.update(t.view,0,0,[n])}let i=t.view.viewport;return!Y.eq(this.markers,e,i.from,i.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(t):!1)}destroy(){for(let t of this.elements)t.destroy()}},zo=class{constructor(t,e,i){this.view=t;this.unfixGutters=e;this.activeGutters=i;N(this,"gutters");N(this,"dom");N(this,"fixed");N(this,"prevViewport");this.prevViewport=t.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.style.minHeight=this.view.contentHeight+"px",this.gutters=this.createGutters(t);for(let n of this.gutters)this.dom.appendChild(n.dom);this.fixed=!t.state.facet(this.unfixGutters),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),this.insertGutters(t)}createGutters(t){return t.state.facet(this.activeGutters).map(e=>new Nn(t,e))}insertGutters(t){t.contentDOM.parentNode.insertBefore(this.dom,t.contentDOM)}insertDetachedGutters(t){t.parentNode.insertBefore(this.dom,t)}getUpdateContexts(){return this.gutters.map(t=>new js(t,this.view.viewport,-this.view.documentPadding.top))}update(t){if(this.updateGutters(t)){let e=this.prevViewport,i=t.view.viewport,n=Math.min(e.to,i.to)-Math.max(e.from,i.from);this.syncGutters(n<(i.to-i.from)*.8)}t.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight+"px"),this.view.state.facet(this.unfixGutters)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=t.view.viewport}syncGutters(t){let e=this.dom.nextSibling;t&&this.dom.remove();let i=Y.iter(this.view.state.facet(Br),this.view.viewport.from),n=[],r=this.getUpdateContexts();for(let o of this.view.viewportLineBlocks)if(n.length&&(n=[]),Array.isArray(o.type)){let l=!0;for(let a of o.type)if(a.type==Yt.Text&&l){af(i,n,a.from);for(let h of r)h.line(this.view,a,n);l=!1}else if(a.widget)for(let h of r)h.widget(this.view,a)}else if(o.type==Yt.Text){af(i,n,o.from);for(let l of r)l.line(this.view,o,n)}for(let o of r)o.finish();t&&this.insertDetachedGutters(e)}updateGutters(t){let e=t.startState.facet(this.activeGutters),i=t.state.facet(this.activeGutters),n=t.docChanged||t.heightChanged||t.viewportChanged||!Y.eq(t.startState.facet(Br),t.state.facet(Br),t.view.viewport.from,t.view.viewport.to);if(e==i)for(let r of this.gutters)r.update(t)&&(n=!0);else{n=!0;let r=[];for(let o of i){let l=e.indexOf(o);l<0?r.push(new Nn(this.view,o)):(this.gutters[l].update(t),r.push(this.gutters[l]))}for(let o of this.gutters)o.dom.remove(),r.indexOf(o)<0&&o.destroy();for(let o of r)this.dom.appendChild(o.dom);this.gutters=r}return n}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove()}};function Gp(s){return Je.fromClass(s,{provide:t=>G.scrollMargins.of(e=>{let i=e.plugin(t);return!i||i.gutters.length==0||!i.fixed?null:e.textDirection==gt.LTR?{left:i.dom.offsetWidth}:{right:i.dom.offsetWidth}})})}var _t=require("obsidian");var qp=require("obsidian");function Go(s,t){let e=Object.keys(t).map(i=>dw(s,i,t[i]));return e.length===1?e[0]:function(){e.forEach(i=>i())}}function dw(s,t,e){let i=s[t],n=s.hasOwnProperty(t),r=n?i:function(){return Object.getPrototypeOf(s)[t].apply(this,arguments)},o=e(r);return i&&Object.setPrototypeOf(o,i),Object.setPrototypeOf(l,o),s[t]=l,a;function l(...h){return o===r&&s[t]===l&&a(),o.apply(this,h)}function a(){s[t]===l&&(n?s[t]=r:delete s[t]),o!==r&&(o=r,Object.setPrototypeOf(l,i||Function))}}function pw(s){let t=s.embedRegistry.embedByExtension.md({app:s,containerEl:document.createElement("div")},null,"");t.editable=!0,t.showEditor();let e=Object.getPrototypeOf(Object.getPrototypeOf(t.editMode));return t.unload(),e.constructor}var Up={cursorLocation:{anchor:0,head:0},value:"",cls:"",placeholder:"",focus:!0,filteredExtensions:[],onEnter:(s,t,e)=>(t&&s.options.onSubmit(s),t),onEscape:s=>{s.options.onBlur(s)},onSubmit:()=>{},onBlur:()=>{},onPaste:()=>{},onChange:()=>{}},Uo=class extends pw(app){constructor(e,i,n){var r,o,l;super(e,i,{app:e,onMarkdownScroll:()=>{},getMode:()=>"source"});N(this,"options");N(this,"initial_value");N(this,"scope");this.options=Xs(Xs({},Up),n),this.initial_value=this.options.value,this.scope=new qp.Scope(this.app.scope),this.scope.register(["Mod"],"Enter",(a,h)=>!0),this.owner.editMode=this,this.owner.editor=this.editor,this.set(n.value||"",!0),this.register(Go(this.app.workspace,{setActiveLeaf:a=>(h,f)=>{this.activeCM.hasFocus||a.call(this.app.workspace,h,f)}})),this.options.onBlur!==Up.onBlur&&((r=this.editor)==null||r.cm.contentDOM.addEventListener("blur",()=>{this._loaded&&this.options.onBlur(this)})),(o=this.editor)==null||o.cm.contentDOM.addEventListener("focusin",()=>{this.app.keymap.pushScope(this.scope),this.app.workspace.activeEditor=this.owner}),this.editorEl.classList.remove("markdown-source-view"),n.cls&&this.editorEl.classList.add(n.cls),n.cursorLocation&&((l=this.editor)==null||l.cm.dispatch({selection:B.range(n.cursorLocation.anchor,n.cursorLocation.head)}))}onUpdate(e,i){super.onUpdate(e,i),i&&this.options.onChange(e)}buildLocalExtensions(){let e=super.buildLocalExtensions();return this.options.placeholder&&e.push(bc(this.options.placeholder)),e.push(G.domEventHandlers({paste:i=>{this.options.onPaste(i,this)}})),e.push(on.highest(fa.of([{key:"Enter",run:i=>this.options.onEnter(this,!1,!1),shift:i=>this.options.onEnter(this,!1,!0)},{key:"Mod-Enter",run:i=>this.options.onEnter(this,!0,!1),shift:i=>this.options.onEnter(this,!0,!0)},{key:"Escape",run:i=>(this.options.onEscape(this),!0),preventDefault:!0}]))),e}getDynamicExtensions(){return super.getDynamicExtensions().filter(e=>!this.options.filteredExtensions.includes(e))}updateBottomPadding(e){return 0}destroy(){this._loaded&&this.unload(),this.app.keymap.popScope(this.scope),this.app.workspace.activeEditor===this.owner&&(this.app.workspace.activeEditor=null),this.containerEl.empty(),super.destroy()}onunload(){super.onunload(),this.destroy()}onload(){var e;super.onload(),this.options.focus&&((e=this.editor)==null||e.focus())}};var gw="0.2.3";var pk={version:gw,default_edit_mode:1,default_preview_mode:0,comment_style:"icon",editor_styling:!1,markup_focus:{0:{show_styling:!0,show_syntax:!0,show_metadata:!0,focus_annotation:!0,show_comment:!0},1:{show_styling:!0,show_syntax:!1,show_metadata:!1,focus_annotation:!0,show_comment:!1},2:{show_styling:!0,show_syntax:!1,show_metadata:!1,focus_annotation:!0,show_comment:!1}},diff_gutter:!0,diff_gutter_hide_empty:!0,annotation_gutter:!0,annotation_gutter_included_types:31,annotation_gutter_hide_empty:!0,annotation_gutter_default_fold_state:!1,annotation_gutter_fold_button:!0,annotation_gutter_resize_handle:!0,annotation_gutter_focus_on_click:!0,annotation_gutter_width:300,tag_completion:!0,tag_correcter:!0,clipboard_remove_syntax:!0,edit_info:!0,toolbar_preview_button:!0,toolbar_edit_button:!0,toolbar_show_buttons_labels:!0,status_bar_preview_button:!0,status_bar_edit_button:!0,status_bar_metadata_button:!0,database_workers:2,post_processor:!0,live_preview:!0,alternative_cursor_movement:!0,enable_metadata:!1,enable_author_metadata:!1,enable_timestamp_metadata:!1,enable_completed_metadata:!1,enable_style_metadata:!1,enable_color_metadata:!1,add_metadata:!1,add_author_metadata:!1,add_timestamp_metadata:!1,add_completed_metadata:!1,add_style_metadata:!1,add_color_metadata:!1,author:"",suggestion_mode_operations:{cursor_movement:{addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",highlight:"ignore_metadata",comment:"ignore_completely"},bracket_movement:{addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",highlight:"stay_inside",comment:"stay_inside"}}};var $s=require("obsidian");var jp=(s=!1)=>{let t=Go($s.Menu.prototype,{onEnter:e=>function(i){let n=this.items[this.selected];return n&&n instanceof $s.MenuItem&&n.handleEvent(i)||!0},onMenuClick:e=>function(i){if(!s||this.currentSubmenu&&this.currentSubmenu.dom.contains(i.target))i.stopImmediatePropagation();else return e&&e.apply(this,[i])},hide:e=>function(){return this.parentMenu||t(),e&&e.apply(this)}});return t};var hf=class extends _t.Component{constructor(e,i){super();this.range=e;this.marker=i;N(this,"text");N(this,"new_text",null);N(this,"annotation_container");N(this,"metadata_view",null);N(this,"annotation_view");N(this,"currentMode",null);N(this,"editMode",null);this.text=e.unwrap(),this.annotation_container=this.marker.annotation_thread.createDiv({cls:"cmtr-anno-gutter-annotation"}),this.annotation_container.addEventListener("blur",this.renderPreview.bind(this)),this.annotation_container.addEventListener("dblclick",this.renderSource.bind(this)),this.annotation_container.addEventListener("contextmenu",this.onCommentContextmenu.bind(this)),this.range.metadata&&this.renderMetadata(),this.annotation_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-view"}),this.renderPreview()}onload(){super.onload()}onunload(){super.onunload(),this.annotation_container.remove(),this.editMode=null}renderMetadata(){if(this.metadata_view=this.annotation_container.createDiv({cls:"cmtr-anno-gutter-annotation-metadata"}),this.range.fields.author){let e=createSpan({cls:"cmtr-anno-gutter-annotation-author-label",text:"Author: "});this.metadata_view.appendChild(e);let i=createSpan({cls:"cmtr-anno-gutter-annotation-author-name",text:this.range.fields.author});this.metadata_view.appendChild(i)}if(this.range.fields.time){if(this.metadata_view.children.length>0){let n=createSpan({cls:"cmtr-anno-gutter-annotation-metadata-separator",text:" \\u2022 "});this.metadata_view.appendChild(n)}let e=createSpan({cls:"cmtr-anno-gutter-annotation-time-label",text:"Updated at: "});this.metadata_view.appendChild(e);let i=createSpan({cls:"cmtr-anno-gutter-annotation-time",text:window.moment.unix(this.range.fields.time).format("MMM DD YYYY, HH:mm")});this.metadata_view.appendChild(i)}}renderSource(e){if(this.range.type!=="comment")new _t.Notice("[Commentator] You can only edit comments.");else{if(e==null||e.stopPropagation(),this.currentMode==="source")return;let{app:i}=this.marker.view.state.field(_t.editorInfoField);if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!0),this.range.fields.author&&this.range.fields.author!==i.plugins.plugins.commentator.settings.author){new _t.Notice("[Commentator] You cannot edit comments from other authors.");return}this.annotation_view.empty(),this.editMode=this.addChild(new Uo(i,this.annotation_view,{value:this.text,cls:"cmtr-anno-gutter-annotation-editor",onSubmit:n=>{this.new_text=n.get(),this.renderPreview()},filteredExtensions:[i.plugins.plugins.commentator.editorExtensions],onBlur:this.renderPreview.bind(this)})),this.currentMode="source"}}renderPreview(){if(this.currentMode!=="preview")if(this.annotation_container.toggleClass("cmtr-anno-gutter-annotation-editing",!1),this.text===this.new_text||this.new_text===null){let{app:e}=this.marker.view.state.field(_t.editorInfoField);if(this.new_text=null,this.editMode&&(this.removeChild(this.editMode),this.editMode=null),this.annotation_view.empty(),this.range.type!=="substitution")switch(_t.MarkdownRenderer.render(e,this.text||" ",this.annotation_view,"",this),this.range.type){case"addition":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Added: "}));break;case"deletion":this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Deleted: "}));break;case"highlight":break;case"comment":break}else{let i=this.range.unwrap_parts();_t.MarkdownRenderer.render(e,i[0]||" ",this.annotation_view,"",this),this.annotation_view.children[0].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"Changed: "}));let n=this.annotation_view.children.length;_t.MarkdownRenderer.render(e,i[1]||" ",this.annotation_view,"",this),this.annotation_view.children[n].prepend(createSpan({cls:"cmtr-anno-gutter-annotation-desc",text:"To: "}))}this.annotation_view.addClass("cmtr-anno-gutter-annotation-"+this.range.type),this.currentMode="preview"}else this.text=this.new_text,setTimeout(()=>this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:Vo("comment",this.new_text)}}))}onCommentContextmenu(e){e.preventDefault(),e.stopPropagation(),jp(!0);let i=new _t.Menu;this.range.type!=="comment"&&this.range.type!=="highlight"&&(i.addItem(n=>{n.setTitle("Accept changes").setIcon("check").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:Yp(this.marker.view.state,this.range.from,this.range.to)})})}),i.addItem(n=>{n.setTitle("Reject changes").setIcon("cross").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:Xp(this.marker.view.state,this.range.from,this.range.to)})})})),this.range.type==="comment"?(this.range.replies.length>0&&i.addItem(n=>{n.setTitle("Close comment thread").setIcon("message-square-off").setSection("close-annotation").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.full_range_front,to:this.range.full_range_back,insert:""}})})}),i.addItem(n=>{n.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{Ks(this.marker.view,this.range)})}),i.addItem(n=>{n.setTitle("Edit comment").setIcon("pencil").setSection("comment-handling").onClick(()=>{this.renderSource()})}),i.addItem(n=>{n.setTitle("Remove comment").setIcon("cross").setSection("comment-handling").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.from,to:this.range.to,insert:""}})})})):this.range.type!=="highlight"?(i.addItem(n=>{n.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{Ks(this.marker.view,this.range)})}),this.range.replies.length>0&&i.addItem(n=>{n.setTitle("Remove all comments").setIcon("message-square-x").setSection("comment-handling").onClick(()=>{this.marker.view.dispatch({changes:{from:this.range.replies[0].from,to:this.range.replies[this.range.replies.length-1].to,insert:""}})})})):i.addItem(n=>{n.setTitle("Add reply").setSection("comment-handling").setIcon("reply").onClick(()=>{Ks(this.marker.view,this.range)})}),i.addItem(n=>{n.setTitle("Fold gutter").setSection("gutter-controls").setIcon("arrow-right-from-line").onClick(()=>{this.marker.view.dispatch({annotations:[jo.of(null)]})})}),i.addItem(n=>{let r=n.setTitle("Included annotations").setIcon("eye").setSection("gutter-controls").setSubmenu(),o=this.marker.view.state.facet(gn);for(let{title:l,icon:a,value:h}of[{title:"Additions",icon:"plus-circle",value:1},{title:"Deletions",icon:"minus-square",value:2},{title:"Substitutions",icon:"replace",value:4},{title:"Highlights",icon:"highlighter",value:8},{title:"Comments",icon:"message-square",value:16}])r.addItem(f=>{f.setTitle(l).setIcon(a).setChecked((o&h)!==0).onClick(()=>{o^=h;let u=(o&h)!==0;f.checkIconEl?f.checkIconEl.style.display=u?"flex":"none":f.setChecked(u),this.marker.view.dispatch(this.marker.view.state.update({effects:[Oc.reconfigure(gn.of(o))]}))})})}),i.showAtPosition(e)}},qo=class extends be{constructor(e,i,n,r=0){super();this.annotation=e;this.annotations=i;this.view=n;this.itr=r;N(this,"annotation_thread");N(this,"component",new _t.Component);N(this,"preventUnload",!1)}eq(e){return this.itr===e.itr&&this.annotations===e.annotations&&this.annotations[0].equals(e.annotations[0])}onCommentThreadClick(){this.view.dispatch({annotations:[$o.of({marker:this,index:-1,scroll:!0,focus_markup:!0})]}),this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0)}toDOM(){this.annotation_thread=createDiv({cls:"cmtr-anno-gutter-thread"}),this.annotation_thread.addEventListener("click",this.onCommentThreadClick.bind(this));for(let e of this.annotations)this.component.addChild(new hf(e,this));return this.component.load(),this.annotation_thread}focus(){this.annotation_thread.focus()}focus_annotation(e=-1,i=!1){e===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!0):e>=0&&e{let n=this.view.lineBlockAt(this.annotations[0].from).top-100;this.view.scrollDOM.scrollTo({top:n,behavior:"smooth"})},200)}unfocus_annotation(e=-1){e===-1?this.annotation_thread.classList.toggle("cmtr-anno-gutter-thread-highlight",!1):this.annotation_thread.children.item(e).classList.toggle("cmtr-anno-gutter-thread-highlight",!1)}destroy(e){this.component.unload(),this.annotation_thread.remove(),super.destroy(e)}};function $p(s,t,e){let i=s.field(_t.editorEditorField),n=(e&1)!==0,r=(e&2)!==0,o=(e&4)!==0,l=(e&8)!==0,a=(e&16)!==0,h=[];for(let f of t){let u=f.full_thread;switch(a||(u=u.slice(0,1)),f.type){case"addition":n||u.shift();break;case"deletion":r||u.shift();break;case"substitution":o||u.shift();break;case"highlight":l||u.shift();break;case"comment":a||u.shift();break}if(u.length){let c=new qo(f,u,i,Kp);c.preventUnload=!0,h.push(c.range(f.from,f.to))}}return h}var Kp=0,Ki=Ct.define({create(s){let t=s.field(de).ranges.ranges.reduce((e,i)=>{let n=i.base_range;return e.includes(n)||e.push(n),e},[]);return Y.of($p(s,t,s.facet(gn)))},update(s,t){let e=t.state.facet(gn);if(t.startState.facet(gn)!==e)return this.create(t.state);if(!t.docChanged)return s;Kp+=1;let i=[];for(let r of t.state.field(de).inserted_ranges)i.includes(r.base_range)||i.push(r.base_range);let n=t.state.field(de).deleted_ranges.map(r=>r.base_range);return s.map(t.changes).update({filter:(r,o,l)=>{let a=!n.includes(l.annotation);return l.preventUnload=a,a},add:$p(t.state,i.map(r=>r.full_thread[0]),e)})}});var Ko=require("obsidian");var Yo=ot.define(),ff=Ct.define({create(s){return{from:s.selection.main.from,to:s.selection.main.to}},update(s,t){for(let e of t.effects)if(e.is(Yo))return e.value;return s}}),mw=Ct.define({create(s){return J.none},update(s,t){var n;let e=t.startState.field(ff,!1),i=t.state.field(ff);if(e!==i){let r=t.state.field(de).ranges.ranges_in_interval(i.from,i.to);return r.length&&r[0].base_range===((n=r.at(-1))==null?void 0:n.base_range)&&i.from>=r[0].from&&i.to<=r.at(-1).to?Y.of([J.mark({attributes:{class:"cmtr-focused"}}).range(r[0].full_range_front,r[0].full_range_back)]):J.none}else return s},provide(s){return G.decorations.from(s)}});var ww=require("obsidian");var Qk=J.replace({});var Jp=60,yw=L.define({combine:s=>s.some(t=>t)}),Qp=L.define(),Ys=Mt.define(),jo=Mt.define(),$o=Mt.define(),Zp=Mt.define(),tg=Mt.define(),eg=Mt.define(),ig=Mt.define(),Xo=class extends zo{constructor(e){super(e,yw,Qp);N(this,"previously_focused");N(this,"debouncedMoveGutter",(0,li.debounce)(this.moveGutter.bind(this),200));e.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{e.dispatch(e.state.update({effects:[ng.reconfigure([])]}))}))}createGutters(e){return e.state.facet(Qp).map(i=>new cf(e,i,this.dom))}insertGutters(e){e.contentDOM.parentNode.insertBefore(this.dom,e.contentDOM.nextSibling)}insertDetachedGutters(e){this.view.contentDOM.parentNode.insertBefore(this.dom,this.view.contentDOM.nextSibling)}getUpdateContexts(){return this.gutters.map(e=>new uf(e,this.view.viewport,-this.view.documentPadding.top))}update(e){for(let i of e.transactions){let n=i.annotation($o);if(n){let{marker:r,index:o,scroll:l=!1,focus_markup:a=!1}=n;this.unfocusAnnotation(),this.focusAnnotation(r,o,l,a)}}super.update(e)}unfocusAnnotation(){var e;(e=this.previously_focused)==null||e.unfocus_annotation(),this.previously_focused=void 0}focusAnnotation(e,i,n=!1,r=!1){this.previously_focused=e,this.debouncedMoveGutter(e),e.focus_annotation(i,n),r&&setTimeout(()=>{this.view.dispatch(this.view.state.update({effects:[Yo.of({from:e.annotation.from,to:e.annotation.full_range_back})]}))})}updateGutters(e){let i=e.transactions.flatMap(n=>n.annotation(Ys)).find(n=>n);if((i||e.startState.selection!==e.state.selection)&&this.unfocusAnnotation(),i){let{from:n,to:r,index:o=-1,scroll:l=!1}=i;t:for(let a of this.gutters[0].elements)if(n>=a.block.from){for(let h of a.markers)if(n>=h.annotation.from&&r<=h.annotation.full_range_back){this.focusAnnotation(h,o,l);break t}}else if(nh.markers.includes(e));if(!n)return;let r=n.markers.indexOf(e),o=n.block.top,l=n.dom.children[r].offsetTop,a=o-l;if(Math.abs(a)>=10&&a){let h=i.elements[0];h.dom.style.marginTop=parseInt(h.dom.style.marginTop||"0")+a+"px"}}foldGutter(){this.gutters[0].foldGutter()}},vw=Gp(Xo);var uf=class extends js{constructor(e,i,n){super(e,i,n);this.gutter=e;this.height=n;N(this,"previous_element_end",0);N(this,"new_gutter_elements",[]);N(this,"added_elements",[]);this.previous_element_end=n}async addElement(e,i,n){var f;let r=Math.max(i.top-this.previous_element_end,0),o=r<=0?this.previous_element_end:i.top;n.sort((u,c)=>u.annotation.from-c.annotation.from);let a=((f=this.gutter.elements[this.i])==null?void 0:f.dom.clientHeight)||36,h=this.gutter.elements.findIndex(u=>Wo(u.markers,n));if(h!==-1){let u=this.gutter.elements[h];for(let c=this.i;c{this.folded=!this.folded,this.view.state.field(li.editorInfoField).app.workspace.requestSaveLayout(),this.foldGutter()},this.setFoldButtonState(),this.view.dom.prepend(this.fold_button_el)}createResizeHandle(){this.resize_handle_el=createEl("hr",{cls:["cmtr-anno-gutter-resize-handle"]}),this.resize_handle_el.style.display=this.view.state.field(Ki).size&&!this.folded?"":"none",this.resize_handle_el.addEventListener("mousedown",e=>{var a;let i=e.clientX,n=(0,li.debounce)(h=>{this.width=h,this.view.state.field(li.editorInfoField).app.workspace.requestSaveLayout(),this.dom.style.width=this.width+"px",this.fold_button_el&&(this.fold_button_el.style.right=this.width+Jp+"px")},25);this.resize_handle_el.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!0),(a=this.fold_button_el)==null||a.classList.toggle("cmtr-anno-gutter-moving",!0),this.gutterDom.classList.toggle("cmtr-anno-gutter-moving",!0);let r=parseInt(this.dom.style.width.slice(0,-2)),o=h=>{let f=h.clientX-i;return i=h.clientX,r-=f,n(r),!0},l=()=>{var h;document.removeEventListener("mousemove",o),document.removeEventListener("mouseup",l),this.resize_handle_el.classList.toggle("cmtr-anno-gutter-resize-handle-hover",!1),(h=this.fold_button_el)==null||h.classList.toggle("cmtr-anno-gutter-moving",!1),this.gutterDom.classList.toggle("cmtr-anno-gutter-moving",!1)};return document.addEventListener("mousemove",o),document.addEventListener("mouseup",l),!0}),this.gutterDom.appendChild(this.resize_handle_el)}setFoldButtonState(){this.fold_button_el&&(this.folded?(this.fold_button_el.style.right="20px",this.fold_button_el.style.rotate="-180deg",this.fold_button_el.ariaLabel="Unfold gutter",this.resize_handle_el&&(this.resize_handle_el.style.display="none")):(this.fold_button_el.style.right=this.width+Jp+"px",this.fold_button_el.style.rotate="0deg",this.fold_button_el.ariaLabel="Fold gutter",this.resize_handle_el&&(this.resize_handle_el.style.display="")))}foldGutter(){this.setFoldButtonState(),this.folded?this.elements.forEach(e=>{Array.from(e.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(i=>{i.setAttribute("style",`max-height: ${i.clientHeight}px; overflow: hidden;`)})}):this.dom.addEventListener("transitionend",()=>{this.elements.forEach(e=>{Array.from(e.dom.getElementsByClassName("cmtr-anno-gutter-annotation")).forEach(i=>{i.setAttribute("style","")})})},{once:!0}),this.dom.style.width=this.folded?"0":this.width+"px"}update(e){let i=super.update(e),n=e.state.field(Ki);for(let r of e.transactions){let o=r.annotation(jo),l=r.annotation(Zp),a=r.annotation(tg),h=r.annotation(eg),f=r.annotation(ig);l!==void 0&&(this.width=l,!this.hide_on_empty&&!this.folded&&(this.dom.style.width=l+"px",this.setFoldButtonState())),o!==void 0&&(o===null?(this.folded=!this.folded,this.view.state.field(li.editorInfoField).app.workspace.requestSaveLayout()):this.folded=o,this.foldGutter()),a!==void 0&&(this.hide_on_empty=a,this.hide_on_empty&&n.size===0?this.dom.style.width="0":this.dom.style.width=this.width+"px"),h!==void 0&&(this.add_fold_button=h,this.add_fold_button&&!this.fold_button_el?this.createFoldButton():!this.add_fold_button&&this.fold_button_el&&(this.fold_button_el.remove(),this.fold_button_el=void 0),this.setFoldButtonState()),f!==void 0&&(this.add_resize_handle=f,this.add_resize_handle&&!this.resize_handle_el?this.createResizeHandle():!this.add_resize_handle&&this.resize_handle_el&&(this.resize_handle_el.remove(),this.resize_handle_el=void 0))}return n.size!==e.startState.field(Ki).size&&(n.size===0?(this.fold_button_el&&(this.fold_button_el.style.display="none"),this.resize_handle_el&&(this.resize_handle_el.style.display="none"),this.hide_on_empty&&(this.dom.style.width="0")):(this.fold_button_el&&(this.fold_button_el.style.display=""),this.resize_handle_el&&(this.resize_handle_el.style.display=""),this.folded||(this.dom.style.width=this.width+"px"))),i}destroy(){var e,i;(e=this.fold_button_el)==null||e.remove(),(i=this.resize_handle_el)==null||i.remove(),super.destroy()}},df=class extends In{constructor(e,i,n,r,o=null){super(e,i,n,r);this.block=o}update(e,i,n,r,o=null){this.block=o,this.above!=n&&(this.dom.style.marginTop=(this.above=n)?n+"px":""),Wo(this.markers,r)||this.setMarkers(e,r)}};var ng=new se;function Ks(s,t,e=!1){let i=t?t.full_range_back:s.state.selection.main.head,n=t?t.full_thread.length:-1;s.dispatch(s.state.update({changes:{from:i,to:i,insert:Vo("comment","")},selection:B.cursor(i),scrollIntoView:e})),setTimeout(()=>{s.dispatch(s.state.update({annotations:[Ys.of({from:i,to:i,index:n})]}))})}function Yp(s,t,e,i=!0){let n=s.field(de).ranges;return(t||e?n.ranges_in_interval(t!=null?t:0,e!=null?e:1/0):n.ranges).filter(r=>r.type==="addition"||r.type==="deletion"||r.type==="substitution").map(r=>({from:r.from,to:i?r.full_range_back:r.to,insert:r.accept()}))}function Xp(s,t,e,i=!0){let n=s.field(de).ranges;return(t||e?n.ranges_in_interval(t!=null?t:0,e!=null?e:1/0):n.ranges).filter(r=>r.type==="addition"||r.type==="deletion"||r.type==="substitution").map(r=>({from:r.from,to:i?r.full_range_back:r.to,insert:r.reject()}))}var Jo=dg(sg(),1);Jo.default.DIFF_DELETE=-1;Jo.default.DIFF_INSERT=1;Jo.default.DIFF_EQUAL=0;async function rg(s,t){return fe.PLUGIN_SETTINGS=t,await Promise.all(s.map(async e=>Vp(e)))}self.onmessage=async s=>{self.postMessage(await rg(s.data.files,s.data.settings))};\n//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vZGlmZi1tYXRjaC1wYXRjaC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL2RlZmluaXRpb25zLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9yYW5nZXMvYmFzZV9yYW5nZS50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL3R5cGVzL2FkZGl0aW9uX3JhbmdlLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9yYW5nZXMvdHlwZXMvY29tbWVudF9yYW5nZS50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL3R5cGVzL2RlbGV0aW9uX3JhbmdlLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9yYW5nZXMvdHlwZXMvaGlnaGxpZ2h0X3JhbmdlLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9yYW5nZXMvdHlwZXMvc3Vic3RpdHV0aW9uX3JhbmdlLnRzIiwgIi4uLy4uL0BtYXJpam4vZmluZC1jbHVzdGVyLWJyZWFrL3NyYy9pbmRleC5qcyIsICIuLi8uLi9AY29kZW1pcnJvci9zdGF0ZS9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL0BmbGF0dGVuLWpzL2ludGVydmFsLXRyZWUvZGlzdC9tYWluLm1qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL2dyb3VwZWRfcmFuZ2UudHMiLCAiLi4vLi4vc3R5bGUtbW9kL3NyYy9zdHlsZS1tb2QuanMiLCAiLi4vLi4vdzNjLWtleW5hbWUvaW5kZXguanMiLCAiLi4vLi4vQGNvZGVtaXJyb3Ivdmlldy9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL0BsZXplci9jb21tb24vZGlzdC9pbmRleC5qcyIsICIuLi8uLi9AbGV6ZXIvaGlnaGxpZ2h0L2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vQGNvZGVtaXJyb3IvbGFuZ3VhZ2UvZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZ2xvYmFsLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3Ivc2V0dGluZ3MvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3BhcnNlci9ub2RlX21vZHVsZXMvQGxlemVyL2NvbW1vbi9kaXN0L2luZGV4LmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL0Bjb2RlbWlycm9yL3N0YXRlL2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3BhcnNlci9ub2RlX21vZHVsZXMvc3R5bGUtbW9kL3NyYy9zdHlsZS1tb2QuanMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3BhcnNlci9ub2RlX21vZHVsZXMvdzNjLWtleW5hbWUvaW5kZXguanMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3BhcnNlci9ub2RlX21vZHVsZXMvQGNvZGVtaXJyb3Ivdmlldy9kaXN0L2luZGV4LmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL0BsZXplci9oaWdobGlnaHQvZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcGFyc2VyL25vZGVfbW9kdWxlcy9AY29kZW1pcnJvci9sYW5ndWFnZS9kaXN0L2luZGV4LmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL0BsZXplci9sci9kaXN0L2luZGV4LmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvZWRpdC11dGlsL3JhbmdlLXBhcnNlci50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvZWRpdC11dGlsL21ldGFkYXRhLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9lZGl0LWhhbmRsZXIvY3Vyc29yLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9lZGl0LXV0aWwvcmFuZ2UtY3JlYXRlLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvcmVuZGVyZXJzL2d1dHRlcnMvYW5ub3RhdGlvbnMtZ3V0dGVyL2Fubm90YXRpb24tZ3V0dGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvcmVuZGVyZXJzL2d1dHRlcnMvYmFzZS50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL3JlbmRlcmVycy9ndXR0ZXJzL2Fubm90YXRpb25zLWd1dHRlci9tYXJrZXIudHMiLCAiLi4vLi4vLi4vc3JjL3VpL2VtYmVkZGFibGUtZWRpdG9yLnRzIiwgIi4uLy4uL21vbmtleS1hcm91bmQvZGlzdC9pbmRleC5tanMiLCAiLi4vLi4vLi4vc3JjL2NvbnN0YW50cy50cyIsICIuLi8uLi8uLi9zcmMvcGF0Y2hlcy50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL3JlbmRlcmVycy9saXZlLXByZXZpZXcvY29tbWVudC13aWRnZXQudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9yZW5kZXJlcnMvbGl2ZS1wcmV2aWV3L2ZvY3VzLXJlbmRlcmVyLnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvcmVuZGVyZXJzL2xpdmUtcHJldmlldy9tYXJrdXAtcmVuZGVyZXIudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9yZW5kZXJlcnMvZ3V0dGVycy9hbm5vdGF0aW9ucy1ndXR0ZXIvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL2VkaXQtbG9naWMvYWRkLWNvbW1lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL2VkaXQtbG9naWMvYWx0ZXItc3VnZ2VzdGlvbi50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvZWRpdC1sb2dpYy90ZXh0LWRpZmYudHMiLCAiLi4vLi4vLi4vc3JjL2luZGV4LXdvcmtlci50cyIsICIuLi8uLi8uLi9zcmMvZGF0YWJhc2UvaW5kZXhlci53b3JrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogRGlmZiBNYXRjaCBhbmQgUGF0Y2hcbiAqIENvcHlyaWdodCAyMDE4IFRoZSBkaWZmLW1hdGNoLXBhdGNoIEF1dGhvcnMuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2RpZmYtbWF0Y2gtcGF0Y2hcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBDb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byB0ZXh0cyB0byBjcmVhdGUgYSBwYXRjaC5cbiAqIEFwcGxpZXMgdGhlIHBhdGNoIG9udG8gYW5vdGhlciB0ZXh0LCBhbGxvd2luZyBmb3IgZXJyb3JzLlxuICogQGF1dGhvciBmcmFzZXJAZ29vZ2xlLmNvbSAoTmVpbCBGcmFzZXIpXG4gKi9cblxuLyoqXG4gKiBDbGFzcyBjb250YWluaW5nIHRoZSBkaWZmLCBtYXRjaCBhbmQgcGF0Y2ggbWV0aG9kcy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG52YXIgZGlmZl9tYXRjaF9wYXRjaCA9IGZ1bmN0aW9uKCkge1xuXG4gIC8vIERlZmF1bHRzLlxuICAvLyBSZWRlZmluZSB0aGVzZSBpbiB5b3VyIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLlxuXG4gIC8vIE51bWJlciBvZiBzZWNvbmRzIHRvIG1hcCBhIGRpZmYgYmVmb3JlIGdpdmluZyB1cCAoMCBmb3IgaW5maW5pdHkpLlxuICB0aGlzLkRpZmZfVGltZW91dCA9IDEuMDtcbiAgLy8gQ29zdCBvZiBhbiBlbXB0eSBlZGl0IG9wZXJhdGlvbiBpbiB0ZXJtcyBvZiBlZGl0IGNoYXJhY3RlcnMuXG4gIHRoaXMuRGlmZl9FZGl0Q29zdCA9IDQ7XG4gIC8vIEF0IHdoYXQgcG9pbnQgaXMgbm8gbWF0Y2ggZGVjbGFyZWQgKDAuMCA9IHBlcmZlY3Rpb24sIDEuMCA9IHZlcnkgbG9vc2UpLlxuICB0aGlzLk1hdGNoX1RocmVzaG9sZCA9IDAuNTtcbiAgLy8gSG93IGZhciB0byBzZWFyY2ggZm9yIGEgbWF0Y2ggKDAgPSBleGFjdCBsb2NhdGlvbiwgMTAwMCsgPSBicm9hZCBtYXRjaCkuXG4gIC8vIEEgbWF0Y2ggdGhpcyBtYW55IGNoYXJhY3RlcnMgYXdheSBmcm9tIHRoZSBleHBlY3RlZCBsb2NhdGlvbiB3aWxsIGFkZFxuICAvLyAxLjAgdG8gdGhlIHNjb3JlICgwLjAgaXMgYSBwZXJmZWN0IG1hdGNoKS5cbiAgdGhpcy5NYXRjaF9EaXN0YW5jZSA9IDEwMDA7XG4gIC8vIFdoZW4gZGVsZXRpbmcgYSBsYXJnZSBibG9jayBvZiB0ZXh0IChvdmVyIH42NCBjaGFyYWN0ZXJzKSwgaG93IGNsb3NlIGRvXG4gIC8vIHRoZSBjb250ZW50cyBoYXZlIHRvIGJlIHRvIG1hdGNoIHRoZSBleHBlY3RlZCBjb250ZW50cy4gKDAuMCA9IHBlcmZlY3Rpb24sXG4gIC8vIDEuMCA9IHZlcnkgbG9vc2UpLiAgTm90ZSB0aGF0IE1hdGNoX1RocmVzaG9sZCBjb250cm9scyBob3cgY2xvc2VseSB0aGVcbiAgLy8gZW5kIHBvaW50cyBvZiBhIGRlbGV0ZSBuZWVkIHRvIG1hdGNoLlxuICB0aGlzLlBhdGNoX0RlbGV0ZVRocmVzaG9sZCA9IDAuNTtcbiAgLy8gQ2h1bmsgc2l6ZSBmb3IgY29udGV4dCBsZW5ndGguXG4gIHRoaXMuUGF0Y2hfTWFyZ2luID0gNDtcblxuICAvLyBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gYW4gaW50LlxuICB0aGlzLk1hdGNoX01heEJpdHMgPSAzMjtcbn07XG5cblxuLy8gIERJRkYgRlVOQ1RJT05TXG5cblxuLyoqXG4gKiBUaGUgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgZGlmZiBpcyBhbiBhcnJheSBvZiB0dXBsZXM6XG4gKiBbW0RJRkZfREVMRVRFLCAnSGVsbG8nXSwgW0RJRkZfSU5TRVJULCAnR29vZGJ5ZSddLCBbRElGRl9FUVVBTCwgJyB3b3JsZC4nXV1cbiAqIHdoaWNoIG1lYW5zOiBkZWxldGUgJ0hlbGxvJywgYWRkICdHb29kYnllJyBhbmQga2VlcCAnIHdvcmxkLidcbiAqL1xudmFyIERJRkZfREVMRVRFID0gLTE7XG52YXIgRElGRl9JTlNFUlQgPSAxO1xudmFyIERJRkZfRVFVQUwgPSAwO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBvbmUgZGlmZiB0dXBsZS5cbiAqIH5BdHRlbXB0cyB0byBsb29rIGxpa2UgYSB0d28tZWxlbWVudCBhcnJheSAod2hpY2ggaXMgd2hhdCB0aGlzIHVzZWQgdG8gYmUpLn5cbiAqIENvbnN0cnVjdG9yIHJldHVybnMgYW4gYWN0dWFsIHR3by1lbGVtZW50IGFycmF5LCB0byBhbGxvdyBkZXN0cnVjdGluZyBASmFja3VCXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0phY2t1Qi9kaWZmLW1hdGNoLXBhdGNoL2lzc3Vlcy8xNCBmb3IgZGV0YWlsc1xuICogQHBhcmFtIHtudW1iZXJ9IG9wIE9wZXJhdGlvbiwgb25lIG9mOiBESUZGX0RFTEVURSwgRElGRl9JTlNFUlQsIERJRkZfRVFVQUwuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUZXh0IHRvIGJlIGRlbGV0ZWQsIGluc2VydGVkLCBvciByZXRhaW5lZC5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5kaWZmX21hdGNoX3BhdGNoLkRpZmYgPSBmdW5jdGlvbihvcCwgdGV4dCkge1xuICByZXR1cm4gW29wLCB0ZXh0XTtcbn07XG5cbi8qKlxuICogRmluZCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gdGV4dHMuICBTaW1wbGlmaWVzIHRoZSBwcm9ibGVtIGJ5IHN0cmlwcGluZ1xuICogYW55IGNvbW1vbiBwcmVmaXggb3Igc3VmZml4IG9mZiB0aGUgdGV4dHMgYmVmb3JlIGRpZmZpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgT2xkIHN0cmluZyB0byBiZSBkaWZmZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgTmV3IHN0cmluZyB0byBiZSBkaWZmZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfY2hlY2tsaW5lcyBPcHRpb25hbCBzcGVlZHVwIGZsYWcuIElmIHByZXNlbnQgYW5kIGZhbHNlLFxuICogICAgIHRoZW4gZG9uJ3QgcnVuIGEgbGluZS1sZXZlbCBkaWZmIGZpcnN0IHRvIGlkZW50aWZ5IHRoZSBjaGFuZ2VkIGFyZWFzLlxuICogICAgIERlZmF1bHRzIHRvIHRydWUsIHdoaWNoIGRvZXMgYSBmYXN0ZXIsIHNsaWdodGx5IGxlc3Mgb3B0aW1hbCBkaWZmLlxuICogQHBhcmFtIHtudW1iZXI9fSBvcHRfZGVhZGxpbmUgT3B0aW9uYWwgdGltZSB3aGVuIHRoZSBkaWZmIHNob3VsZCBiZSBjb21wbGV0ZVxuICogICAgIGJ5LiAgVXNlZCBpbnRlcm5hbGx5IGZvciByZWN1cnNpdmUgY2FsbHMuICBVc2VycyBzaG91bGQgc2V0IERpZmZUaW1lb3V0XG4gKiAgICAgaW5zdGVhZC5cbiAqIEByZXR1cm4geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX21haW4gPSBmdW5jdGlvbih0ZXh0MSwgdGV4dDIsIG9wdF9jaGVja2xpbmVzLFxuICAgIG9wdF9kZWFkbGluZSkge1xuICAvLyBTZXQgYSBkZWFkbGluZSBieSB3aGljaCB0aW1lIHRoZSBkaWZmIG11c3QgYmUgY29tcGxldGUuXG4gIGlmICh0eXBlb2Ygb3B0X2RlYWRsaW5lID09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHRoaXMuRGlmZl9UaW1lb3V0IDw9IDApIHtcbiAgICAgIG9wdF9kZWFkbGluZSA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdF9kZWFkbGluZSA9IChuZXcgRGF0ZSkuZ2V0VGltZSgpICsgdGhpcy5EaWZmX1RpbWVvdXQgKiAxMDAwO1xuICAgIH1cbiAgfVxuICB2YXIgZGVhZGxpbmUgPSBvcHRfZGVhZGxpbmU7XG5cbiAgLy8gQ2hlY2sgZm9yIG51bGwgaW5wdXRzLlxuICBpZiAodGV4dDEgPT0gbnVsbCB8fCB0ZXh0MiA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOdWxsIGlucHV0LiAoZGlmZl9tYWluKScpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGVxdWFsaXR5IChzcGVlZHVwKS5cbiAgaWYgKHRleHQxID09IHRleHQyKSB7XG4gICAgaWYgKHRleHQxKSB7XG4gICAgICByZXR1cm4gW25ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9FUVVBTCwgdGV4dDEpXTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRfY2hlY2tsaW5lcyA9PSAndW5kZWZpbmVkJykge1xuICAgIG9wdF9jaGVja2xpbmVzID0gdHJ1ZTtcbiAgfVxuICB2YXIgY2hlY2tsaW5lcyA9IG9wdF9jaGVja2xpbmVzO1xuXG4gIC8vIFRyaW0gb2ZmIGNvbW1vbiBwcmVmaXggKHNwZWVkdXApLlxuICB2YXIgY29tbW9ubGVuZ3RoID0gdGhpcy5kaWZmX2NvbW1vblByZWZpeCh0ZXh0MSwgdGV4dDIpO1xuICB2YXIgY29tbW9ucHJlZml4ID0gdGV4dDEuc3Vic3RyaW5nKDAsIGNvbW1vbmxlbmd0aCk7XG4gIHRleHQxID0gdGV4dDEuc3Vic3RyaW5nKGNvbW1vbmxlbmd0aCk7XG4gIHRleHQyID0gdGV4dDIuc3Vic3RyaW5nKGNvbW1vbmxlbmd0aCk7XG5cbiAgLy8gVHJpbSBvZmYgY29tbW9uIHN1ZmZpeCAoc3BlZWR1cCkuXG4gIGNvbW1vbmxlbmd0aCA9IHRoaXMuZGlmZl9jb21tb25TdWZmaXgodGV4dDEsIHRleHQyKTtcbiAgdmFyIGNvbW1vbnN1ZmZpeCA9IHRleHQxLnN1YnN0cmluZyh0ZXh0MS5sZW5ndGggLSBjb21tb25sZW5ndGgpO1xuICB0ZXh0MSA9IHRleHQxLnN1YnN0cmluZygwLCB0ZXh0MS5sZW5ndGggLSBjb21tb25sZW5ndGgpO1xuICB0ZXh0MiA9IHRleHQyLnN1YnN0cmluZygwLCB0ZXh0Mi5sZW5ndGggLSBjb21tb25sZW5ndGgpO1xuXG4gIC8vIENvbXB1dGUgdGhlIGRpZmYgb24gdGhlIG1pZGRsZSBibG9jay5cbiAgdmFyIGRpZmZzID0gdGhpcy5kaWZmX2NvbXB1dGVfKHRleHQxLCB0ZXh0MiwgY2hlY2tsaW5lcywgZGVhZGxpbmUpO1xuXG4gIC8vIFJlc3RvcmUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICBpZiAoY29tbW9ucHJlZml4KSB7XG4gICAgZGlmZnMudW5zaGlmdChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsIGNvbW1vbnByZWZpeCkpO1xuICB9XG4gIGlmIChjb21tb25zdWZmaXgpIHtcbiAgICBkaWZmcy5wdXNoKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9FUVVBTCwgY29tbW9uc3VmZml4KSk7XG4gIH1cbiAgdGhpcy5kaWZmX2NsZWFudXBNZXJnZShkaWZmcyk7XG4gIHJldHVybiBkaWZmcztcbn07XG5cblxuLyoqXG4gKiBGaW5kIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byB0ZXh0cy4gIEFzc3VtZXMgdGhhdCB0aGUgdGV4dHMgZG8gbm90XG4gKiBoYXZlIGFueSBjb21tb24gcHJlZml4IG9yIHN1ZmZpeC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3RyaW5nIHRvIGJlIGRpZmZlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tsaW5lcyBTcGVlZHVwIGZsYWcuICBJZiBmYWxzZSwgdGhlbiBkb24ndCBydW4gYVxuICogICAgIGxpbmUtbGV2ZWwgZGlmZiBmaXJzdCB0byBpZGVudGlmeSB0aGUgY2hhbmdlZCBhcmVhcy5cbiAqICAgICBJZiB0cnVlLCB0aGVuIHJ1biBhIGZhc3Rlciwgc2xpZ2h0bHkgbGVzcyBvcHRpbWFsIGRpZmYuXG4gKiBAcGFyYW0ge251bWJlcn0gZGVhZGxpbmUgVGltZSB3aGVuIHRoZSBkaWZmIHNob3VsZCBiZSBjb21wbGV0ZSBieS5cbiAqIEByZXR1cm4geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICogQHByaXZhdGVcbiAqL1xuZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl9jb21wdXRlXyA9IGZ1bmN0aW9uKHRleHQxLCB0ZXh0MiwgY2hlY2tsaW5lcyxcbiAgICBkZWFkbGluZSkge1xuICB2YXIgZGlmZnM7XG5cbiAgaWYgKCF0ZXh0MSkge1xuICAgIC8vIEp1c3QgYWRkIHNvbWUgdGV4dCAoc3BlZWR1cCkuXG4gICAgcmV0dXJuIFtuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfSU5TRVJULCB0ZXh0MildO1xuICB9XG5cbiAgaWYgKCF0ZXh0Mikge1xuICAgIC8vIEp1c3QgZGVsZXRlIHNvbWUgdGV4dCAoc3BlZWR1cCkuXG4gICAgcmV0dXJuIFtuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfREVMRVRFLCB0ZXh0MSldO1xuICB9XG5cbiAgdmFyIGxvbmd0ZXh0ID0gdGV4dDEubGVuZ3RoID4gdGV4dDIubGVuZ3RoID8gdGV4dDEgOiB0ZXh0MjtcbiAgdmFyIHNob3J0dGV4dCA9IHRleHQxLmxlbmd0aCA+IHRleHQyLmxlbmd0aCA/IHRleHQyIDogdGV4dDE7XG4gIHZhciBpID0gbG9uZ3RleHQuaW5kZXhPZihzaG9ydHRleHQpO1xuICBpZiAoaSAhPSAtMSkge1xuICAgIC8vIFNob3J0ZXIgdGV4dCBpcyBpbnNpZGUgdGhlIGxvbmdlciB0ZXh0IChzcGVlZHVwKS5cbiAgICBkaWZmcyA9IFtuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfSU5TRVJULCBsb25ndGV4dC5zdWJzdHJpbmcoMCwgaSkpLFxuICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9FUVVBTCwgc2hvcnR0ZXh0KSxcbiAgICAgICAgICAgICBuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfSU5TRVJULFxuICAgICAgICAgICAgICAgICBsb25ndGV4dC5zdWJzdHJpbmcoaSArIHNob3J0dGV4dC5sZW5ndGgpKV07XG4gICAgLy8gU3dhcCBpbnNlcnRpb25zIGZvciBkZWxldGlvbnMgaWYgZGlmZiBpcyByZXZlcnNlZC5cbiAgICBpZiAodGV4dDEubGVuZ3RoID4gdGV4dDIubGVuZ3RoKSB7XG4gICAgICBkaWZmc1swXVswXSA9IGRpZmZzWzJdWzBdID0gRElGRl9ERUxFVEU7XG4gICAgfVxuICAgIHJldHVybiBkaWZmcztcbiAgfVxuXG4gIGlmIChzaG9ydHRleHQubGVuZ3RoID09IDEpIHtcbiAgICAvLyBTaW5nbGUgY2hhcmFjdGVyIHN0cmluZy5cbiAgICAvLyBBZnRlciB0aGUgcHJldmlvdXMgc3BlZWR1cCwgdGhlIGNoYXJhY3RlciBjYW4ndCBiZSBhbiBlcXVhbGl0eS5cbiAgICByZXR1cm4gW25ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9ERUxFVEUsIHRleHQxKSxcbiAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9JTlNFUlQsIHRleHQyKV07XG4gIH1cblxuICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2JsZW0gY2FuIGJlIHNwbGl0IGluIHR3by5cbiAgdmFyIGhtID0gdGhpcy5kaWZmX2hhbGZNYXRjaF8odGV4dDEsIHRleHQyKTtcbiAgaWYgKGhtKSB7XG4gICAgLy8gQSBoYWxmLW1hdGNoIHdhcyBmb3VuZCwgc29ydCBvdXQgdGhlIHJldHVybiBkYXRhLlxuICAgIHZhciB0ZXh0MV9hID0gaG1bMF07XG4gICAgdmFyIHRleHQxX2IgPSBobVsxXTtcbiAgICB2YXIgdGV4dDJfYSA9IGhtWzJdO1xuICAgIHZhciB0ZXh0Ml9iID0gaG1bM107XG4gICAgdmFyIG1pZF9jb21tb24gPSBobVs0XTtcbiAgICAvLyBTZW5kIGJvdGggcGFpcnMgb2ZmIGZvciBzZXBhcmF0ZSBwcm9jZXNzaW5nLlxuICAgIHZhciBkaWZmc19hID0gdGhpcy5kaWZmX21haW4odGV4dDFfYSwgdGV4dDJfYSwgY2hlY2tsaW5lcywgZGVhZGxpbmUpO1xuICAgIHZhciBkaWZmc19iID0gdGhpcy5kaWZmX21haW4odGV4dDFfYiwgdGV4dDJfYiwgY2hlY2tsaW5lcywgZGVhZGxpbmUpO1xuICAgIC8vIE1lcmdlIHRoZSByZXN1bHRzLlxuICAgIHJldHVybiBkaWZmc19hLmNvbmNhdChbbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLCBtaWRfY29tbW9uKV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZzX2IpO1xuICB9XG5cbiAgaWYgKGNoZWNrbGluZXMgJiYgdGV4dDEubGVuZ3RoID4gMTAwICYmIHRleHQyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybiB0aGlzLmRpZmZfbGluZU1vZGVfKHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZGlmZl9iaXNlY3RfKHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUpO1xufTtcblxuXG4vKipcbiAqIERvIGEgcXVpY2sgbGluZS1sZXZlbCBkaWZmIG9uIGJvdGggc3RyaW5ncywgdGhlbiByZWRpZmYgdGhlIHBhcnRzIGZvclxuICogZ3JlYXRlciBhY2N1cmFjeS5cbiAqIFRoaXMgc3BlZWR1cCBjYW4gcHJvZHVjZSBub24tbWluaW1hbCBkaWZmcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3RyaW5nIHRvIGJlIGRpZmZlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWFkbGluZSBUaW1lIHdoZW4gdGhlIGRpZmYgc2hvdWxkIGJlIGNvbXBsZXRlIGJ5LlxuICogQHJldHVybiB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5EaWZmPn0gQXJyYXkgb2YgZGlmZiB0dXBsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2xpbmVNb2RlXyA9IGZ1bmN0aW9uKHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUpIHtcbiAgLy8gU2NhbiB0aGUgdGV4dCBvbiBhIGxpbmUtYnktbGluZSBiYXNpcyBmaXJzdC5cbiAgdmFyIGEgPSB0aGlzLmRpZmZfbGluZXNUb0NoYXJzXyh0ZXh0MSwgdGV4dDIpO1xuICB0ZXh0MSA9IGEuY2hhcnMxO1xuICB0ZXh0MiA9IGEuY2hhcnMyO1xuICB2YXIgbGluZWFycmF5ID0gYS5saW5lQXJyYXk7XG5cbiAgdmFyIGRpZmZzID0gdGhpcy5kaWZmX21haW4odGV4dDEsIHRleHQyLCBmYWxzZSwgZGVhZGxpbmUpO1xuXG4gIC8vIENvbnZlcnQgdGhlIGRpZmYgYmFjayB0byBvcmlnaW5hbCB0ZXh0LlxuICB0aGlzLmRpZmZfY2hhcnNUb0xpbmVzXyhkaWZmcywgbGluZWFycmF5KTtcbiAgLy8gRWxpbWluYXRlIGZyZWFrIG1hdGNoZXMgKGUuZy4gYmxhbmsgbGluZXMpXG4gIHRoaXMuZGlmZl9jbGVhbnVwU2VtYW50aWMoZGlmZnMpO1xuXG4gIC8vIFJlZGlmZiBhbnkgcmVwbGFjZW1lbnQgYmxvY2tzLCB0aGlzIHRpbWUgY2hhcmFjdGVyLWJ5LWNoYXJhY3Rlci5cbiAgLy8gQWRkIGEgZHVtbXkgZW50cnkgYXQgdGhlIGVuZC5cbiAgZGlmZnMucHVzaChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsICcnKSk7XG4gIHZhciBwb2ludGVyID0gMDtcbiAgdmFyIGNvdW50X2RlbGV0ZSA9IDA7XG4gIHZhciBjb3VudF9pbnNlcnQgPSAwO1xuICB2YXIgdGV4dF9kZWxldGUgPSAnJztcbiAgdmFyIHRleHRfaW5zZXJ0ID0gJyc7XG4gIHdoaWxlIChwb2ludGVyIDwgZGlmZnMubGVuZ3RoKSB7XG4gICAgc3dpdGNoIChkaWZmc1twb2ludGVyXVswXSkge1xuICAgICAgY2FzZSBESUZGX0lOU0VSVDpcbiAgICAgICAgY291bnRfaW5zZXJ0Kys7XG4gICAgICAgIHRleHRfaW5zZXJ0ICs9IGRpZmZzW3BvaW50ZXJdWzFdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElGRl9ERUxFVEU6XG4gICAgICAgIGNvdW50X2RlbGV0ZSsrO1xuICAgICAgICB0ZXh0X2RlbGV0ZSArPSBkaWZmc1twb2ludGVyXVsxXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJRkZfRVFVQUw6XG4gICAgICAgIC8vIFVwb24gcmVhY2hpbmcgYW4gZXF1YWxpdHksIGNoZWNrIGZvciBwcmlvciByZWR1bmRhbmNpZXMuXG4gICAgICAgIGlmIChjb3VudF9kZWxldGUgPj0gMSAmJiBjb3VudF9pbnNlcnQgPj0gMSkge1xuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgb2ZmZW5kaW5nIHJlY29yZHMgYW5kIGFkZCB0aGUgbWVyZ2VkIG9uZXMuXG4gICAgICAgICAgZGlmZnMuc3BsaWNlKHBvaW50ZXIgLSBjb3VudF9kZWxldGUgLSBjb3VudF9pbnNlcnQsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvdW50X2RlbGV0ZSArIGNvdW50X2luc2VydCk7XG4gICAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIgLSBjb3VudF9kZWxldGUgLSBjb3VudF9pbnNlcnQ7XG4gICAgICAgICAgdmFyIHN1YkRpZmYgPVxuICAgICAgICAgICAgICB0aGlzLmRpZmZfbWFpbih0ZXh0X2RlbGV0ZSwgdGV4dF9pbnNlcnQsIGZhbHNlLCBkZWFkbGluZSk7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IHN1YkRpZmYubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgIGRpZmZzLnNwbGljZShwb2ludGVyLCAwLCBzdWJEaWZmW2pdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIgKyBzdWJEaWZmLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjb3VudF9pbnNlcnQgPSAwO1xuICAgICAgICBjb3VudF9kZWxldGUgPSAwO1xuICAgICAgICB0ZXh0X2RlbGV0ZSA9ICcnO1xuICAgICAgICB0ZXh0X2luc2VydCA9ICcnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcG9pbnRlcisrO1xuICB9XG4gIGRpZmZzLnBvcCgpOyAgLy8gUmVtb3ZlIHRoZSBkdW1teSBlbnRyeSBhdCB0aGUgZW5kLlxuXG4gIHJldHVybiBkaWZmcztcbn07XG5cblxuLyoqXG4gKiBGaW5kIHRoZSAnbWlkZGxlIHNuYWtlJyBvZiBhIGRpZmYsIHNwbGl0IHRoZSBwcm9ibGVtIGluIHR3b1xuICogYW5kIHJldHVybiB0aGUgcmVjdXJzaXZlbHkgY29uc3RydWN0ZWQgZGlmZi5cbiAqIFNlZSBNeWVycyAxOTg2IHBhcGVyOiBBbiBPKE5EKSBEaWZmZXJlbmNlIEFsZ29yaXRobSBhbmQgSXRzIFZhcmlhdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgT2xkIHN0cmluZyB0byBiZSBkaWZmZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgTmV3IHN0cmluZyB0byBiZSBkaWZmZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gZGVhZGxpbmUgVGltZSBhdCB3aGljaCB0byBiYWlsIGlmIG5vdCB5ZXQgY29tcGxldGUuXG4gKiBAcmV0dXJuIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSBBcnJheSBvZiBkaWZmIHR1cGxlcy5cbiAqIEBwcml2YXRlXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfYmlzZWN0XyA9IGZ1bmN0aW9uKHRleHQxLCB0ZXh0MiwgZGVhZGxpbmUpIHtcbiAgLy8gQ2FjaGUgdGhlIHRleHQgbGVuZ3RocyB0byBwcmV2ZW50IG11bHRpcGxlIGNhbGxzLlxuICB2YXIgdGV4dDFfbGVuZ3RoID0gdGV4dDEubGVuZ3RoO1xuICB2YXIgdGV4dDJfbGVuZ3RoID0gdGV4dDIubGVuZ3RoO1xuICB2YXIgbWF4X2QgPSBNYXRoLmNlaWwoKHRleHQxX2xlbmd0aCArIHRleHQyX2xlbmd0aCkgLyAyKTtcbiAgdmFyIHZfb2Zmc2V0ID0gbWF4X2Q7XG4gIHZhciB2X2xlbmd0aCA9IDIgKiBtYXhfZDtcbiAgdmFyIHYxID0gbmV3IEFycmF5KHZfbGVuZ3RoKTtcbiAgdmFyIHYyID0gbmV3IEFycmF5KHZfbGVuZ3RoKTtcbiAgLy8gU2V0dGluZyBhbGwgZWxlbWVudHMgdG8gLTEgaXMgZmFzdGVyIGluIENocm9tZSAmIEZpcmVmb3ggdGhhbiBtaXhpbmdcbiAgLy8gaW50ZWdlcnMgYW5kIHVuZGVmaW5lZC5cbiAgZm9yICh2YXIgeCA9IDA7IHggPCB2X2xlbmd0aDsgeCsrKSB7XG4gICAgdjFbeF0gPSAtMTtcbiAgICB2Mlt4XSA9IC0xO1xuICB9XG4gIHYxW3Zfb2Zmc2V0ICsgMV0gPSAwO1xuICB2Mlt2X29mZnNldCArIDFdID0gMDtcbiAgdmFyIGRlbHRhID0gdGV4dDFfbGVuZ3RoIC0gdGV4dDJfbGVuZ3RoO1xuICAvLyBJZiB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaXMgb2RkLCB0aGVuIHRoZSBmcm9udCBwYXRoIHdpbGwgY29sbGlkZVxuICAvLyB3aXRoIHRoZSByZXZlcnNlIHBhdGguXG4gIHZhciBmcm9udCA9IChkZWx0YSAlIDIgIT0gMCk7XG4gIC8vIE9mZnNldHMgZm9yIHN0YXJ0IGFuZCBlbmQgb2YgayBsb29wLlxuICAvLyBQcmV2ZW50cyBtYXBwaW5nIG9mIHNwYWNlIGJleW9uZCB0aGUgZ3JpZC5cbiAgdmFyIGsxc3RhcnQgPSAwO1xuICB2YXIgazFlbmQgPSAwO1xuICB2YXIgazJzdGFydCA9IDA7XG4gIHZhciBrMmVuZCA9IDA7XG4gIGZvciAodmFyIGQgPSAwOyBkIDwgbWF4X2Q7IGQrKykge1xuICAgIC8vIEJhaWwgb3V0IGlmIGRlYWRsaW5lIGlzIHJlYWNoZWQuXG4gICAgaWYgKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgPiBkZWFkbGluZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gV2FsayB0aGUgZnJvbnQgcGF0aCBvbmUgc3RlcC5cbiAgICBmb3IgKHZhciBrMSA9IC1kICsgazFzdGFydDsgazEgPD0gZCAtIGsxZW5kOyBrMSArPSAyKSB7XG4gICAgICB2YXIgazFfb2Zmc2V0ID0gdl9vZmZzZXQgKyBrMTtcbiAgICAgIHZhciB4MTtcbiAgICAgIGlmIChrMSA9PSAtZCB8fCAoazEgIT0gZCAmJiB2MVtrMV9vZmZzZXQgLSAxXSA8IHYxW2sxX29mZnNldCArIDFdKSkge1xuICAgICAgICB4MSA9IHYxW2sxX29mZnNldCArIDFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeDEgPSB2MVtrMV9vZmZzZXQgLSAxXSArIDE7XG4gICAgICB9XG4gICAgICB2YXIgeTEgPSB4MSAtIGsxO1xuICAgICAgd2hpbGUgKHgxIDwgdGV4dDFfbGVuZ3RoICYmIHkxIDwgdGV4dDJfbGVuZ3RoICYmXG4gICAgICAgICAgICAgdGV4dDEuY2hhckF0KHgxKSA9PSB0ZXh0Mi5jaGFyQXQoeTEpKSB7XG4gICAgICAgIHgxKys7XG4gICAgICAgIHkxKys7XG4gICAgICB9XG4gICAgICB2MVtrMV9vZmZzZXRdID0geDE7XG4gICAgICBpZiAoeDEgPiB0ZXh0MV9sZW5ndGgpIHtcbiAgICAgICAgLy8gUmFuIG9mZiB0aGUgcmlnaHQgb2YgdGhlIGdyYXBoLlxuICAgICAgICBrMWVuZCArPSAyO1xuICAgICAgfSBlbHNlIGlmICh5MSA+IHRleHQyX2xlbmd0aCkge1xuICAgICAgICAvLyBSYW4gb2ZmIHRoZSBib3R0b20gb2YgdGhlIGdyYXBoLlxuICAgICAgICBrMXN0YXJ0ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKGZyb250KSB7XG4gICAgICAgIHZhciBrMl9vZmZzZXQgPSB2X29mZnNldCArIGRlbHRhIC0gazE7XG4gICAgICAgIGlmIChrMl9vZmZzZXQgPj0gMCAmJiBrMl9vZmZzZXQgPCB2X2xlbmd0aCAmJiB2MltrMl9vZmZzZXRdICE9IC0xKSB7XG4gICAgICAgICAgLy8gTWlycm9yIHgyIG9udG8gdG9wLWxlZnQgY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICAgICAgdmFyIHgyID0gdGV4dDFfbGVuZ3RoIC0gdjJbazJfb2Zmc2V0XTtcbiAgICAgICAgICBpZiAoeDEgPj0geDIpIHtcbiAgICAgICAgICAgIC8vIE92ZXJsYXAgZGV0ZWN0ZWQuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaWZmX2Jpc2VjdFNwbGl0Xyh0ZXh0MSwgdGV4dDIsIHgxLCB5MSwgZGVhZGxpbmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdhbGsgdGhlIHJldmVyc2UgcGF0aCBvbmUgc3RlcC5cbiAgICBmb3IgKHZhciBrMiA9IC1kICsgazJzdGFydDsgazIgPD0gZCAtIGsyZW5kOyBrMiArPSAyKSB7XG4gICAgICB2YXIgazJfb2Zmc2V0ID0gdl9vZmZzZXQgKyBrMjtcbiAgICAgIHZhciB4MjtcbiAgICAgIGlmIChrMiA9PSAtZCB8fCAoazIgIT0gZCAmJiB2MltrMl9vZmZzZXQgLSAxXSA8IHYyW2syX29mZnNldCArIDFdKSkge1xuICAgICAgICB4MiA9IHYyW2syX29mZnNldCArIDFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeDIgPSB2MltrMl9vZmZzZXQgLSAxXSArIDE7XG4gICAgICB9XG4gICAgICB2YXIgeTIgPSB4MiAtIGsyO1xuICAgICAgd2hpbGUgKHgyIDwgdGV4dDFfbGVuZ3RoICYmIHkyIDwgdGV4dDJfbGVuZ3RoICYmXG4gICAgICAgICAgICAgdGV4dDEuY2hhckF0KHRleHQxX2xlbmd0aCAtIHgyIC0gMSkgPT1cbiAgICAgICAgICAgICB0ZXh0Mi5jaGFyQXQodGV4dDJfbGVuZ3RoIC0geTIgLSAxKSkge1xuICAgICAgICB4MisrO1xuICAgICAgICB5MisrO1xuICAgICAgfVxuICAgICAgdjJbazJfb2Zmc2V0XSA9IHgyO1xuICAgICAgaWYgKHgyID4gdGV4dDFfbGVuZ3RoKSB7XG4gICAgICAgIC8vIFJhbiBvZmYgdGhlIGxlZnQgb2YgdGhlIGdyYXBoLlxuICAgICAgICBrMmVuZCArPSAyO1xuICAgICAgfSBlbHNlIGlmICh5MiA+IHRleHQyX2xlbmd0aCkge1xuICAgICAgICAvLyBSYW4gb2ZmIHRoZSB0b3Agb2YgdGhlIGdyYXBoLlxuICAgICAgICBrMnN0YXJ0ICs9IDI7XG4gICAgICB9IGVsc2UgaWYgKCFmcm9udCkge1xuICAgICAgICB2YXIgazFfb2Zmc2V0ID0gdl9vZmZzZXQgKyBkZWx0YSAtIGsyO1xuICAgICAgICBpZiAoazFfb2Zmc2V0ID49IDAgJiYgazFfb2Zmc2V0IDwgdl9sZW5ndGggJiYgdjFbazFfb2Zmc2V0XSAhPSAtMSkge1xuICAgICAgICAgIHZhciB4MSA9IHYxW2sxX29mZnNldF07XG4gICAgICAgICAgdmFyIHkxID0gdl9vZmZzZXQgKyB4MSAtIGsxX29mZnNldDtcbiAgICAgICAgICAvLyBNaXJyb3IgeDIgb250byB0b3AtbGVmdCBjb29yZGluYXRlIHN5c3RlbS5cbiAgICAgICAgICB4MiA9IHRleHQxX2xlbmd0aCAtIHgyO1xuICAgICAgICAgIGlmICh4MSA+PSB4Mikge1xuICAgICAgICAgICAgLy8gT3ZlcmxhcCBkZXRlY3RlZC5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpZmZfYmlzZWN0U3BsaXRfKHRleHQxLCB0ZXh0MiwgeDEsIHkxLCBkZWFkbGluZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIERpZmYgdG9vayB0b28gbG9uZyBhbmQgaGl0IHRoZSBkZWFkbGluZSBvclxuICAvLyBudW1iZXIgb2YgZGlmZnMgZXF1YWxzIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBubyBjb21tb25hbGl0eSBhdCBhbGwuXG4gIHJldHVybiBbbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0RFTEVURSwgdGV4dDEpLFxuICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9JTlNFUlQsIHRleHQyKV07XG59O1xuXG5cbi8qKlxuICogR2l2ZW4gdGhlIGxvY2F0aW9uIG9mIHRoZSAnbWlkZGxlIHNuYWtlJywgc3BsaXQgdGhlIGRpZmYgaW4gdHdvIHBhcnRzXG4gKiBhbmQgcmVjdXJzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBPbGQgc3RyaW5nIHRvIGJlIGRpZmZlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBOZXcgc3RyaW5nIHRvIGJlIGRpZmZlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB4IEluZGV4IG9mIHNwbGl0IHBvaW50IGluIHRleHQxLlxuICogQHBhcmFtIHtudW1iZXJ9IHkgSW5kZXggb2Ygc3BsaXQgcG9pbnQgaW4gdGV4dDIuXG4gKiBAcGFyYW0ge251bWJlcn0gZGVhZGxpbmUgVGltZSBhdCB3aGljaCB0byBiYWlsIGlmIG5vdCB5ZXQgY29tcGxldGUuXG4gKiBAcmV0dXJuIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSBBcnJheSBvZiBkaWZmIHR1cGxlcy5cbiAqIEBwcml2YXRlXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfYmlzZWN0U3BsaXRfID0gZnVuY3Rpb24odGV4dDEsIHRleHQyLCB4LCB5LFxuICAgIGRlYWRsaW5lKSB7XG4gIHZhciB0ZXh0MWEgPSB0ZXh0MS5zdWJzdHJpbmcoMCwgeCk7XG4gIHZhciB0ZXh0MmEgPSB0ZXh0Mi5zdWJzdHJpbmcoMCwgeSk7XG4gIHZhciB0ZXh0MWIgPSB0ZXh0MS5zdWJzdHJpbmcoeCk7XG4gIHZhciB0ZXh0MmIgPSB0ZXh0Mi5zdWJzdHJpbmcoeSk7XG5cbiAgLy8gQ29tcHV0ZSBib3RoIGRpZmZzIHNlcmlhbGx5LlxuICB2YXIgZGlmZnMgPSB0aGlzLmRpZmZfbWFpbih0ZXh0MWEsIHRleHQyYSwgZmFsc2UsIGRlYWRsaW5lKTtcbiAgdmFyIGRpZmZzYiA9IHRoaXMuZGlmZl9tYWluKHRleHQxYiwgdGV4dDJiLCBmYWxzZSwgZGVhZGxpbmUpO1xuXG4gIHJldHVybiBkaWZmcy5jb25jYXQoZGlmZnNiKTtcbn07XG5cblxuLyoqXG4gKiBTcGxpdCB0d28gdGV4dHMgaW50byBhbiBhcnJheSBvZiBzdHJpbmdzLiAgUmVkdWNlIHRoZSB0ZXh0cyB0byBhIHN0cmluZyBvZlxuICogaGFzaGVzIHdoZXJlIGVhY2ggVW5pY29kZSBjaGFyYWN0ZXIgcmVwcmVzZW50cyBvbmUgbGluZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBGaXJzdCBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgU2Vjb25kIHN0cmluZy5cbiAqIEByZXR1cm4ge3tjaGFyczE6IHN0cmluZywgY2hhcnMyOiBzdHJpbmcsIGxpbmVBcnJheTogIUFycmF5LjxzdHJpbmc+fX1cbiAqICAgICBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZW5jb2RlZCB0ZXh0MSwgdGhlIGVuY29kZWQgdGV4dDIgYW5kXG4gKiAgICAgdGhlIGFycmF5IG9mIHVuaXF1ZSBzdHJpbmdzLlxuICogICAgIFRoZSB6ZXJvdGggZWxlbWVudCBvZiB0aGUgYXJyYXkgb2YgdW5pcXVlIHN0cmluZ3MgaXMgaW50ZW50aW9uYWxseSBibGFuay5cbiAqIEBwcml2YXRlXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfbGluZXNUb0NoYXJzXyA9IGZ1bmN0aW9uKHRleHQxLCB0ZXh0Mikge1xuICB2YXIgbGluZUFycmF5ID0gW107ICAvLyBlLmcuIGxpbmVBcnJheVs0XSA9PSAnSGVsbG9cXG4nXG4gIHZhciBsaW5lSGFzaCA9IHt9OyAgIC8vIGUuZy4gbGluZUhhc2hbJ0hlbGxvXFxuJ10gPT0gNFxuXG4gIC8vICdcXHgwMCcgaXMgYSB2YWxpZCBjaGFyYWN0ZXIsIGJ1dCB2YXJpb3VzIGRlYnVnZ2VycyBkb24ndCBsaWtlIGl0LlxuICAvLyBTbyB3ZSdsbCBpbnNlcnQgYSBqdW5rIGVudHJ5IHRvIGF2b2lkIGdlbmVyYXRpbmcgYSBudWxsIGNoYXJhY3Rlci5cbiAgbGluZUFycmF5WzBdID0gJyc7XG5cbiAgLyoqXG4gICAqIFNwbGl0IGEgdGV4dCBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MuICBSZWR1Y2UgdGhlIHRleHRzIHRvIGEgc3RyaW5nIG9mXG4gICAqIGhhc2hlcyB3aGVyZSBlYWNoIFVuaWNvZGUgY2hhcmFjdGVyIHJlcHJlc2VudHMgb25lIGxpbmUuXG4gICAqIE1vZGlmaWVzIGxpbmVhcnJheSBhbmQgbGluZWhhc2ggdGhyb3VnaCBiZWluZyBhIGNsb3N1cmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFN0cmluZyB0byBlbmNvZGUuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gRW5jb2RlZCBzdHJpbmcuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBkaWZmX2xpbmVzVG9DaGFyc011bmdlXyh0ZXh0KSB7XG4gICAgdmFyIGNoYXJzID0gJyc7XG4gICAgLy8gV2FsayB0aGUgdGV4dCwgcHVsbGluZyBvdXQgYSBzdWJzdHJpbmcgZm9yIGVhY2ggbGluZS5cbiAgICAvLyB0ZXh0LnNwbGl0KCdcXG4nKSB3b3VsZCB3b3VsZCB0ZW1wb3JhcmlseSBkb3VibGUgb3VyIG1lbW9yeSBmb290cHJpbnQuXG4gICAgLy8gTW9kaWZ5aW5nIHRleHQgd291bGQgY3JlYXRlIG1hbnkgbGFyZ2Ugc3RyaW5ncyB0byBnYXJiYWdlIGNvbGxlY3QuXG4gICAgdmFyIGxpbmVTdGFydCA9IDA7XG4gICAgdmFyIGxpbmVFbmQgPSAtMTtcbiAgICAvLyBLZWVwaW5nIG91ciBvd24gbGVuZ3RoIHZhcmlhYmxlIGlzIGZhc3RlciB0aGFuIGxvb2tpbmcgaXQgdXAuXG4gICAgdmFyIGxpbmVBcnJheUxlbmd0aCA9IGxpbmVBcnJheS5sZW5ndGg7XG4gICAgd2hpbGUgKGxpbmVFbmQgPCB0ZXh0Lmxlbmd0aCAtIDEpIHtcbiAgICAgIGxpbmVFbmQgPSB0ZXh0LmluZGV4T2YoJ1xcbicsIGxpbmVTdGFydCk7XG4gICAgICBpZiAobGluZUVuZCA9PSAtMSkge1xuICAgICAgICBsaW5lRW5kID0gdGV4dC5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgICAgdmFyIGxpbmUgPSB0ZXh0LnN1YnN0cmluZyhsaW5lU3RhcnQsIGxpbmVFbmQgKyAxKTtcblxuICAgICAgaWYgKGxpbmVIYXNoLmhhc093blByb3BlcnR5ID8gbGluZUhhc2guaGFzT3duUHJvcGVydHkobGluZSkgOlxuICAgICAgICAgIChsaW5lSGFzaFtsaW5lXSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBjaGFycyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxpbmVIYXNoW2xpbmVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsaW5lQXJyYXlMZW5ndGggPT0gbWF4TGluZXMpIHtcbiAgICAgICAgICAvLyBCYWlsIG91dCBhdCA2NTUzNSBiZWNhdXNlXG4gICAgICAgICAgLy8gU3RyaW5nLmZyb21DaGFyQ29kZSg2NTUzNikgPT0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKVxuICAgICAgICAgIGxpbmUgPSB0ZXh0LnN1YnN0cmluZyhsaW5lU3RhcnQpO1xuICAgICAgICAgIGxpbmVFbmQgPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjaGFycyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxpbmVBcnJheUxlbmd0aCk7XG4gICAgICAgIGxpbmVIYXNoW2xpbmVdID0gbGluZUFycmF5TGVuZ3RoO1xuICAgICAgICBsaW5lQXJyYXlbbGluZUFycmF5TGVuZ3RoKytdID0gbGluZTtcbiAgICAgIH1cbiAgICAgIGxpbmVTdGFydCA9IGxpbmVFbmQgKyAxO1xuICAgIH1cbiAgICByZXR1cm4gY2hhcnM7XG4gIH1cbiAgLy8gQWxsb2NhdGUgMi8zcmRzIG9mIHRoZSBzcGFjZSBmb3IgdGV4dDEsIHRoZSByZXN0IGZvciB0ZXh0Mi5cbiAgdmFyIG1heExpbmVzID0gNDAwMDA7XG4gIHZhciBjaGFyczEgPSBkaWZmX2xpbmVzVG9DaGFyc011bmdlXyh0ZXh0MSk7XG4gIG1heExpbmVzID0gNjU1MzU7XG4gIHZhciBjaGFyczIgPSBkaWZmX2xpbmVzVG9DaGFyc011bmdlXyh0ZXh0Mik7XG4gIHJldHVybiB7Y2hhcnMxOiBjaGFyczEsIGNoYXJzMjogY2hhcnMyLCBsaW5lQXJyYXk6IGxpbmVBcnJheX07XG59O1xuXG5cbi8qKlxuICogUmVoeWRyYXRlIHRoZSB0ZXh0IGluIGEgZGlmZiBmcm9tIGEgc3RyaW5nIG9mIGxpbmUgaGFzaGVzIHRvIHJlYWwgbGluZXMgb2ZcbiAqIHRleHQuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICogQHBhcmFtIHshQXJyYXkuPHN0cmluZz59IGxpbmVBcnJheSBBcnJheSBvZiB1bmlxdWUgc3RyaW5ncy5cbiAqIEBwcml2YXRlXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfY2hhcnNUb0xpbmVzXyA9IGZ1bmN0aW9uKGRpZmZzLCBsaW5lQXJyYXkpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGFycyA9IGRpZmZzW2ldWzFdO1xuICAgIHZhciB0ZXh0ID0gW107XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBjaGFycy5sZW5ndGg7IGorKykge1xuICAgICAgdGV4dFtqXSA9IGxpbmVBcnJheVtjaGFycy5jaGFyQ29kZUF0KGopXTtcbiAgICB9XG4gICAgZGlmZnNbaV1bMV0gPSB0ZXh0LmpvaW4oJycpO1xuICB9XG59O1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lIHRoZSBjb21tb24gcHJlZml4IG9mIHR3byBzdHJpbmdzLlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQxIEZpcnN0IHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MiBTZWNvbmQgc3RyaW5nLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29tbW9uIHRvIHRoZSBzdGFydCBvZiBlYWNoXG4gKiAgICAgc3RyaW5nLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NvbW1vblByZWZpeCA9IGZ1bmN0aW9uKHRleHQxLCB0ZXh0Mikge1xuICAvLyBRdWljayBjaGVjayBmb3IgY29tbW9uIG51bGwgY2FzZXMuXG4gIGlmICghdGV4dDEgfHwgIXRleHQyIHx8IHRleHQxLmNoYXJBdCgwKSAhPSB0ZXh0Mi5jaGFyQXQoMCkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICAvLyBCaW5hcnkgc2VhcmNoLlxuICAvLyBQZXJmb3JtYW5jZSBhbmFseXNpczogaHR0cHM6Ly9uZWlsLmZyYXNlci5uYW1lL25ld3MvMjAwNy8xMC8wOS9cbiAgdmFyIHBvaW50ZXJtaW4gPSAwO1xuICB2YXIgcG9pbnRlcm1heCA9IE1hdGgubWluKHRleHQxLmxlbmd0aCwgdGV4dDIubGVuZ3RoKTtcbiAgdmFyIHBvaW50ZXJtaWQgPSBwb2ludGVybWF4O1xuICB2YXIgcG9pbnRlcnN0YXJ0ID0gMDtcbiAgd2hpbGUgKHBvaW50ZXJtaW4gPCBwb2ludGVybWlkKSB7XG4gICAgaWYgKHRleHQxLnN1YnN0cmluZyhwb2ludGVyc3RhcnQsIHBvaW50ZXJtaWQpID09XG4gICAgICAgIHRleHQyLnN1YnN0cmluZyhwb2ludGVyc3RhcnQsIHBvaW50ZXJtaWQpKSB7XG4gICAgICBwb2ludGVybWluID0gcG9pbnRlcm1pZDtcbiAgICAgIHBvaW50ZXJzdGFydCA9IHBvaW50ZXJtaW47XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvaW50ZXJtYXggPSBwb2ludGVybWlkO1xuICAgIH1cbiAgICBwb2ludGVybWlkID0gTWF0aC5mbG9vcigocG9pbnRlcm1heCAtIHBvaW50ZXJtaW4pIC8gMiArIHBvaW50ZXJtaW4pO1xuICB9XG4gIHJldHVybiBwb2ludGVybWlkO1xufTtcblxuXG4vKipcbiAqIERldGVybWluZSB0aGUgY29tbW9uIHN1ZmZpeCBvZiB0d28gc3RyaW5ncy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0MSBGaXJzdCBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDIgU2Vjb25kIHN0cmluZy5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvbW1vbiB0byB0aGUgZW5kIG9mIGVhY2ggc3RyaW5nLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NvbW1vblN1ZmZpeCA9IGZ1bmN0aW9uKHRleHQxLCB0ZXh0Mikge1xuICAvLyBRdWljayBjaGVjayBmb3IgY29tbW9uIG51bGwgY2FzZXMuXG4gIGlmICghdGV4dDEgfHwgIXRleHQyIHx8XG4gICAgICB0ZXh0MS5jaGFyQXQodGV4dDEubGVuZ3RoIC0gMSkgIT0gdGV4dDIuY2hhckF0KHRleHQyLmxlbmd0aCAtIDEpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgLy8gQmluYXJ5IHNlYXJjaC5cbiAgLy8gUGVyZm9ybWFuY2UgYW5hbHlzaXM6IGh0dHBzOi8vbmVpbC5mcmFzZXIubmFtZS9uZXdzLzIwMDcvMTAvMDkvXG4gIHZhciBwb2ludGVybWluID0gMDtcbiAgdmFyIHBvaW50ZXJtYXggPSBNYXRoLm1pbih0ZXh0MS5sZW5ndGgsIHRleHQyLmxlbmd0aCk7XG4gIHZhciBwb2ludGVybWlkID0gcG9pbnRlcm1heDtcbiAgdmFyIHBvaW50ZXJlbmQgPSAwO1xuICB3aGlsZSAocG9pbnRlcm1pbiA8IHBvaW50ZXJtaWQpIHtcbiAgICBpZiAodGV4dDEuc3Vic3RyaW5nKHRleHQxLmxlbmd0aCAtIHBvaW50ZXJtaWQsIHRleHQxLmxlbmd0aCAtIHBvaW50ZXJlbmQpID09XG4gICAgICAgIHRleHQyLnN1YnN0cmluZyh0ZXh0Mi5sZW5ndGggLSBwb2ludGVybWlkLCB0ZXh0Mi5sZW5ndGggLSBwb2ludGVyZW5kKSkge1xuICAgICAgcG9pbnRlcm1pbiA9IHBvaW50ZXJtaWQ7XG4gICAgICBwb2ludGVyZW5kID0gcG9pbnRlcm1pbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnRlcm1heCA9IHBvaW50ZXJtaWQ7XG4gICAgfVxuICAgIHBvaW50ZXJtaWQgPSBNYXRoLmZsb29yKChwb2ludGVybWF4IC0gcG9pbnRlcm1pbikgLyAyICsgcG9pbnRlcm1pbik7XG4gIH1cbiAgcmV0dXJuIHBvaW50ZXJtaWQ7XG59O1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBzdWZmaXggb2Ygb25lIHN0cmluZyBpcyB0aGUgcHJlZml4IG9mIGFub3RoZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIFNlY29uZCBzdHJpbmcuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjb21tb24gdG8gdGhlIGVuZCBvZiB0aGUgZmlyc3RcbiAqICAgICBzdHJpbmcgYW5kIHRoZSBzdGFydCBvZiB0aGUgc2Vjb25kIHN0cmluZy5cbiAqIEBwcml2YXRlXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfY29tbW9uT3ZlcmxhcF8gPSBmdW5jdGlvbih0ZXh0MSwgdGV4dDIpIHtcbiAgLy8gQ2FjaGUgdGhlIHRleHQgbGVuZ3RocyB0byBwcmV2ZW50IG11bHRpcGxlIGNhbGxzLlxuICB2YXIgdGV4dDFfbGVuZ3RoID0gdGV4dDEubGVuZ3RoO1xuICB2YXIgdGV4dDJfbGVuZ3RoID0gdGV4dDIubGVuZ3RoO1xuICAvLyBFbGltaW5hdGUgdGhlIG51bGwgY2FzZS5cbiAgaWYgKHRleHQxX2xlbmd0aCA9PSAwIHx8IHRleHQyX2xlbmd0aCA9PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgLy8gVHJ1bmNhdGUgdGhlIGxvbmdlciBzdHJpbmcuXG4gIGlmICh0ZXh0MV9sZW5ndGggPiB0ZXh0Ml9sZW5ndGgpIHtcbiAgICB0ZXh0MSA9IHRleHQxLnN1YnN0cmluZyh0ZXh0MV9sZW5ndGggLSB0ZXh0Ml9sZW5ndGgpO1xuICB9IGVsc2UgaWYgKHRleHQxX2xlbmd0aCA8IHRleHQyX2xlbmd0aCkge1xuICAgIHRleHQyID0gdGV4dDIuc3Vic3RyaW5nKDAsIHRleHQxX2xlbmd0aCk7XG4gIH1cbiAgdmFyIHRleHRfbGVuZ3RoID0gTWF0aC5taW4odGV4dDFfbGVuZ3RoLCB0ZXh0Ml9sZW5ndGgpO1xuICAvLyBRdWljayBjaGVjayBmb3IgdGhlIHdvcnN0IGNhc2UuXG4gIGlmICh0ZXh0MSA9PSB0ZXh0Mikge1xuICAgIHJldHVybiB0ZXh0X2xlbmd0aDtcbiAgfVxuXG4gIC8vIFN0YXJ0IGJ5IGxvb2tpbmcgZm9yIGEgc2luZ2xlIGNoYXJhY3RlciBtYXRjaFxuICAvLyBhbmQgaW5jcmVhc2UgbGVuZ3RoIHVudGlsIG5vIG1hdGNoIGlzIGZvdW5kLlxuICAvLyBQZXJmb3JtYW5jZSBhbmFseXNpczogaHR0cHM6Ly9uZWlsLmZyYXNlci5uYW1lL25ld3MvMjAxMC8xMS8wNC9cbiAgdmFyIGJlc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gMTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgcGF0dGVybiA9IHRleHQxLnN1YnN0cmluZyh0ZXh0X2xlbmd0aCAtIGxlbmd0aCk7XG4gICAgdmFyIGZvdW5kID0gdGV4dDIuaW5kZXhPZihwYXR0ZXJuKTtcbiAgICBpZiAoZm91bmQgPT0gLTEpIHtcbiAgICAgIHJldHVybiBiZXN0O1xuICAgIH1cbiAgICBsZW5ndGggKz0gZm91bmQ7XG4gICAgaWYgKGZvdW5kID09IDAgfHwgdGV4dDEuc3Vic3RyaW5nKHRleHRfbGVuZ3RoIC0gbGVuZ3RoKSA9PVxuICAgICAgICB0ZXh0Mi5zdWJzdHJpbmcoMCwgbGVuZ3RoKSkge1xuICAgICAgYmVzdCA9IGxlbmd0aDtcbiAgICAgIGxlbmd0aCsrO1xuICAgIH1cbiAgfVxufTtcblxuXG4vKipcbiAqIERvIHRoZSB0d28gdGV4dHMgc2hhcmUgYSBzdWJzdHJpbmcgd2hpY2ggaXMgYXQgbGVhc3QgaGFsZiB0aGUgbGVuZ3RoIG9mIHRoZVxuICogbG9uZ2VyIHRleHQ/XG4gKiBUaGlzIHNwZWVkdXAgY2FuIHByb2R1Y2Ugbm9uLW1pbmltYWwgZGlmZnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgRmlyc3Qgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQyIFNlY29uZCBzdHJpbmcuXG4gKiBAcmV0dXJuIHtBcnJheS48c3RyaW5nPn0gRml2ZSBlbGVtZW50IEFycmF5LCBjb250YWluaW5nIHRoZSBwcmVmaXggb2ZcbiAqICAgICB0ZXh0MSwgdGhlIHN1ZmZpeCBvZiB0ZXh0MSwgdGhlIHByZWZpeCBvZiB0ZXh0MiwgdGhlIHN1ZmZpeCBvZlxuICogICAgIHRleHQyIGFuZCB0aGUgY29tbW9uIG1pZGRsZS4gIE9yIG51bGwgaWYgdGhlcmUgd2FzIG5vIG1hdGNoLlxuICogQHByaXZhdGVcbiAqL1xuZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl9oYWxmTWF0Y2hfID0gZnVuY3Rpb24odGV4dDEsIHRleHQyKSB7XG4gIGlmICh0aGlzLkRpZmZfVGltZW91dCA8PSAwKSB7XG4gICAgLy8gRG9uJ3QgcmlzayByZXR1cm5pbmcgYSBub24tb3B0aW1hbCBkaWZmIGlmIHdlIGhhdmUgdW5saW1pdGVkIHRpbWUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGxvbmd0ZXh0ID0gdGV4dDEubGVuZ3RoID4gdGV4dDIubGVuZ3RoID8gdGV4dDEgOiB0ZXh0MjtcbiAgdmFyIHNob3J0dGV4dCA9IHRleHQxLmxlbmd0aCA+IHRleHQyLmxlbmd0aCA/IHRleHQyIDogdGV4dDE7XG4gIGlmIChsb25ndGV4dC5sZW5ndGggPCA0IHx8IHNob3J0dGV4dC5sZW5ndGggKiAyIDwgbG9uZ3RleHQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7ICAvLyBQb2ludGxlc3MuXG4gIH1cbiAgdmFyIGRtcCA9IHRoaXM7ICAvLyAndGhpcycgYmVjb21lcyAnd2luZG93JyBpbiBhIGNsb3N1cmUuXG5cbiAgLyoqXG4gICAqIERvZXMgYSBzdWJzdHJpbmcgb2Ygc2hvcnR0ZXh0IGV4aXN0IHdpdGhpbiBsb25ndGV4dCBzdWNoIHRoYXQgdGhlIHN1YnN0cmluZ1xuICAgKiBpcyBhdCBsZWFzdCBoYWxmIHRoZSBsZW5ndGggb2YgbG9uZ3RleHQ/XG4gICAqIENsb3N1cmUsIGJ1dCBkb2VzIG5vdCByZWZlcmVuY2UgYW55IGV4dGVybmFsIHZhcmlhYmxlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvbmd0ZXh0IExvbmdlciBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzaG9ydHRleHQgU2hvcnRlciBzdHJpbmcuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpIFN0YXJ0IGluZGV4IG9mIHF1YXJ0ZXIgbGVuZ3RoIHN1YnN0cmluZyB3aXRoaW4gbG9uZ3RleHQuXG4gICAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSBGaXZlIGVsZW1lbnQgQXJyYXksIGNvbnRhaW5pbmcgdGhlIHByZWZpeCBvZlxuICAgKiAgICAgbG9uZ3RleHQsIHRoZSBzdWZmaXggb2YgbG9uZ3RleHQsIHRoZSBwcmVmaXggb2Ygc2hvcnR0ZXh0LCB0aGUgc3VmZml4XG4gICAqICAgICBvZiBzaG9ydHRleHQgYW5kIHRoZSBjb21tb24gbWlkZGxlLiAgT3IgbnVsbCBpZiB0aGVyZSB3YXMgbm8gbWF0Y2guXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBkaWZmX2hhbGZNYXRjaElfKGxvbmd0ZXh0LCBzaG9ydHRleHQsIGkpIHtcbiAgICAvLyBTdGFydCB3aXRoIGEgMS80IGxlbmd0aCBzdWJzdHJpbmcgYXQgcG9zaXRpb24gaSBhcyBhIHNlZWQuXG4gICAgdmFyIHNlZWQgPSBsb25ndGV4dC5zdWJzdHJpbmcoaSwgaSArIE1hdGguZmxvb3IobG9uZ3RleHQubGVuZ3RoIC8gNCkpO1xuICAgIHZhciBqID0gLTE7XG4gICAgdmFyIGJlc3RfY29tbW9uID0gJyc7XG4gICAgdmFyIGJlc3RfbG9uZ3RleHRfYSwgYmVzdF9sb25ndGV4dF9iLCBiZXN0X3Nob3J0dGV4dF9hLCBiZXN0X3Nob3J0dGV4dF9iO1xuICAgIHdoaWxlICgoaiA9IHNob3J0dGV4dC5pbmRleE9mKHNlZWQsIGogKyAxKSkgIT0gLTEpIHtcbiAgICAgIHZhciBwcmVmaXhMZW5ndGggPSBkbXAuZGlmZl9jb21tb25QcmVmaXgobG9uZ3RleHQuc3Vic3RyaW5nKGkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydHRleHQuc3Vic3RyaW5nKGopKTtcbiAgICAgIHZhciBzdWZmaXhMZW5ndGggPSBkbXAuZGlmZl9jb21tb25TdWZmaXgobG9uZ3RleHQuc3Vic3RyaW5nKDAsIGkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydHRleHQuc3Vic3RyaW5nKDAsIGopKTtcbiAgICAgIGlmIChiZXN0X2NvbW1vbi5sZW5ndGggPCBzdWZmaXhMZW5ndGggKyBwcmVmaXhMZW5ndGgpIHtcbiAgICAgICAgYmVzdF9jb21tb24gPSBzaG9ydHRleHQuc3Vic3RyaW5nKGogLSBzdWZmaXhMZW5ndGgsIGopICtcbiAgICAgICAgICAgIHNob3J0dGV4dC5zdWJzdHJpbmcoaiwgaiArIHByZWZpeExlbmd0aCk7XG4gICAgICAgIGJlc3RfbG9uZ3RleHRfYSA9IGxvbmd0ZXh0LnN1YnN0cmluZygwLCBpIC0gc3VmZml4TGVuZ3RoKTtcbiAgICAgICAgYmVzdF9sb25ndGV4dF9iID0gbG9uZ3RleHQuc3Vic3RyaW5nKGkgKyBwcmVmaXhMZW5ndGgpO1xuICAgICAgICBiZXN0X3Nob3J0dGV4dF9hID0gc2hvcnR0ZXh0LnN1YnN0cmluZygwLCBqIC0gc3VmZml4TGVuZ3RoKTtcbiAgICAgICAgYmVzdF9zaG9ydHRleHRfYiA9IHNob3J0dGV4dC5zdWJzdHJpbmcoaiArIHByZWZpeExlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChiZXN0X2NvbW1vbi5sZW5ndGggKiAyID49IGxvbmd0ZXh0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtiZXN0X2xvbmd0ZXh0X2EsIGJlc3RfbG9uZ3RleHRfYixcbiAgICAgICAgICAgICAgYmVzdF9zaG9ydHRleHRfYSwgYmVzdF9zaG9ydHRleHRfYiwgYmVzdF9jb21tb25dO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBGaXJzdCBjaGVjayBpZiB0aGUgc2Vjb25kIHF1YXJ0ZXIgaXMgdGhlIHNlZWQgZm9yIGEgaGFsZi1tYXRjaC5cbiAgdmFyIGhtMSA9IGRpZmZfaGFsZk1hdGNoSV8obG9uZ3RleHQsIHNob3J0dGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5jZWlsKGxvbmd0ZXh0Lmxlbmd0aCAvIDQpKTtcbiAgLy8gQ2hlY2sgYWdhaW4gYmFzZWQgb24gdGhlIHRoaXJkIHF1YXJ0ZXIuXG4gIHZhciBobTIgPSBkaWZmX2hhbGZNYXRjaElfKGxvbmd0ZXh0LCBzaG9ydHRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguY2VpbChsb25ndGV4dC5sZW5ndGggLyAyKSk7XG4gIHZhciBobTtcbiAgaWYgKCFobTEgJiYgIWhtMikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKCFobTIpIHtcbiAgICBobSA9IGhtMTtcbiAgfSBlbHNlIGlmICghaG0xKSB7XG4gICAgaG0gPSBobTI7XG4gIH0gZWxzZSB7XG4gICAgLy8gQm90aCBtYXRjaGVkLiAgU2VsZWN0IHRoZSBsb25nZXN0LlxuICAgIGhtID0gaG0xWzRdLmxlbmd0aCA+IGhtMls0XS5sZW5ndGggPyBobTEgOiBobTI7XG4gIH1cblxuICAvLyBBIGhhbGYtbWF0Y2ggd2FzIGZvdW5kLCBzb3J0IG91dCB0aGUgcmV0dXJuIGRhdGEuXG4gIHZhciB0ZXh0MV9hLCB0ZXh0MV9iLCB0ZXh0Ml9hLCB0ZXh0Ml9iO1xuICBpZiAodGV4dDEubGVuZ3RoID4gdGV4dDIubGVuZ3RoKSB7XG4gICAgdGV4dDFfYSA9IGhtWzBdO1xuICAgIHRleHQxX2IgPSBobVsxXTtcbiAgICB0ZXh0Ml9hID0gaG1bMl07XG4gICAgdGV4dDJfYiA9IGhtWzNdO1xuICB9IGVsc2Uge1xuICAgIHRleHQyX2EgPSBobVswXTtcbiAgICB0ZXh0Ml9iID0gaG1bMV07XG4gICAgdGV4dDFfYSA9IGhtWzJdO1xuICAgIHRleHQxX2IgPSBobVszXTtcbiAgfVxuICB2YXIgbWlkX2NvbW1vbiA9IGhtWzRdO1xuICByZXR1cm4gW3RleHQxX2EsIHRleHQxX2IsIHRleHQyX2EsIHRleHQyX2IsIG1pZF9jb21tb25dO1xufTtcblxuXG4vKipcbiAqIFJlZHVjZSB0aGUgbnVtYmVyIG9mIGVkaXRzIGJ5IGVsaW1pbmF0aW5nIHNlbWFudGljYWxseSB0cml2aWFsIGVxdWFsaXRpZXMuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NsZWFudXBTZW1hbnRpYyA9IGZ1bmN0aW9uKGRpZmZzKSB7XG4gIHZhciBjaGFuZ2VzID0gZmFsc2U7XG4gIHZhciBlcXVhbGl0aWVzID0gW107ICAvLyBTdGFjayBvZiBpbmRpY2VzIHdoZXJlIGVxdWFsaXRpZXMgYXJlIGZvdW5kLlxuICB2YXIgZXF1YWxpdGllc0xlbmd0aCA9IDA7ICAvLyBLZWVwaW5nIG91ciBvd24gbGVuZ3RoIHZhciBpcyBmYXN0ZXIgaW4gSlMuXG4gIC8qKiBAdHlwZSB7P3N0cmluZ30gKi9cbiAgdmFyIGxhc3RFcXVhbGl0eSA9IG51bGw7XG4gIC8vIEFsd2F5cyBlcXVhbCB0byBkaWZmc1tlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXV1bMV1cbiAgdmFyIHBvaW50ZXIgPSAwOyAgLy8gSW5kZXggb2YgY3VycmVudCBwb3NpdGlvbi5cbiAgLy8gTnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBjaGFuZ2VkIHByaW9yIHRvIHRoZSBlcXVhbGl0eS5cbiAgdmFyIGxlbmd0aF9pbnNlcnRpb25zMSA9IDA7XG4gIHZhciBsZW5ndGhfZGVsZXRpb25zMSA9IDA7XG4gIC8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgY2hhbmdlZCBhZnRlciB0aGUgZXF1YWxpdHkuXG4gIHZhciBsZW5ndGhfaW5zZXJ0aW9uczIgPSAwO1xuICB2YXIgbGVuZ3RoX2RlbGV0aW9uczIgPSAwO1xuICB3aGlsZSAocG9pbnRlciA8IGRpZmZzLmxlbmd0aCkge1xuICAgIGlmIChkaWZmc1twb2ludGVyXVswXSA9PSBESUZGX0VRVUFMKSB7ICAvLyBFcXVhbGl0eSBmb3VuZC5cbiAgICAgIGVxdWFsaXRpZXNbZXF1YWxpdGllc0xlbmd0aCsrXSA9IHBvaW50ZXI7XG4gICAgICBsZW5ndGhfaW5zZXJ0aW9uczEgPSBsZW5ndGhfaW5zZXJ0aW9uczI7XG4gICAgICBsZW5ndGhfZGVsZXRpb25zMSA9IGxlbmd0aF9kZWxldGlvbnMyO1xuICAgICAgbGVuZ3RoX2luc2VydGlvbnMyID0gMDtcbiAgICAgIGxlbmd0aF9kZWxldGlvbnMyID0gMDtcbiAgICAgIGxhc3RFcXVhbGl0eSA9IGRpZmZzW3BvaW50ZXJdWzFdO1xuICAgIH0gZWxzZSB7ICAvLyBBbiBpbnNlcnRpb24gb3IgZGVsZXRpb24uXG4gICAgICBpZiAoZGlmZnNbcG9pbnRlcl1bMF0gPT0gRElGRl9JTlNFUlQpIHtcbiAgICAgICAgbGVuZ3RoX2luc2VydGlvbnMyICs9IGRpZmZzW3BvaW50ZXJdWzFdLmxlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlbmd0aF9kZWxldGlvbnMyICs9IGRpZmZzW3BvaW50ZXJdWzFdLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIC8vIEVsaW1pbmF0ZSBhbiBlcXVhbGl0eSB0aGF0IGlzIHNtYWxsZXIgb3IgZXF1YWwgdG8gdGhlIGVkaXRzIG9uIGJvdGhcbiAgICAgIC8vIHNpZGVzIG9mIGl0LlxuICAgICAgaWYgKGxhc3RFcXVhbGl0eSAmJiAobGFzdEVxdWFsaXR5Lmxlbmd0aCA8PVxuICAgICAgICAgIE1hdGgubWF4KGxlbmd0aF9pbnNlcnRpb25zMSwgbGVuZ3RoX2RlbGV0aW9uczEpKSAmJlxuICAgICAgICAgIChsYXN0RXF1YWxpdHkubGVuZ3RoIDw9IE1hdGgubWF4KGxlbmd0aF9pbnNlcnRpb25zMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfZGVsZXRpb25zMikpKSB7XG4gICAgICAgIC8vIER1cGxpY2F0ZSByZWNvcmQuXG4gICAgICAgIGRpZmZzLnNwbGljZShlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXSwgMCxcbiAgICAgICAgICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9ERUxFVEUsIGxhc3RFcXVhbGl0eSkpO1xuICAgICAgICAvLyBDaGFuZ2Ugc2Vjb25kIGNvcHkgdG8gaW5zZXJ0LlxuICAgICAgICBkaWZmc1tlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXSArIDFdWzBdID0gRElGRl9JTlNFUlQ7XG4gICAgICAgIC8vIFRocm93IGF3YXkgdGhlIGVxdWFsaXR5IHdlIGp1c3QgZGVsZXRlZC5cbiAgICAgICAgZXF1YWxpdGllc0xlbmd0aC0tO1xuICAgICAgICAvLyBUaHJvdyBhd2F5IHRoZSBwcmV2aW91cyBlcXVhbGl0eSAoaXQgbmVlZHMgdG8gYmUgcmVldmFsdWF0ZWQpLlxuICAgICAgICBlcXVhbGl0aWVzTGVuZ3RoLS07XG4gICAgICAgIHBvaW50ZXIgPSBlcXVhbGl0aWVzTGVuZ3RoID4gMCA/IGVxdWFsaXRpZXNbZXF1YWxpdGllc0xlbmd0aCAtIDFdIDogLTE7XG4gICAgICAgIGxlbmd0aF9pbnNlcnRpb25zMSA9IDA7ICAvLyBSZXNldCB0aGUgY291bnRlcnMuXG4gICAgICAgIGxlbmd0aF9kZWxldGlvbnMxID0gMDtcbiAgICAgICAgbGVuZ3RoX2luc2VydGlvbnMyID0gMDtcbiAgICAgICAgbGVuZ3RoX2RlbGV0aW9uczIgPSAwO1xuICAgICAgICBsYXN0RXF1YWxpdHkgPSBudWxsO1xuICAgICAgICBjaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcG9pbnRlcisrO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBkaWZmLlxuICBpZiAoY2hhbmdlcykge1xuICAgIHRoaXMuZGlmZl9jbGVhbnVwTWVyZ2UoZGlmZnMpO1xuICB9XG4gIHRoaXMuZGlmZl9jbGVhbnVwU2VtYW50aWNMb3NzbGVzcyhkaWZmcyk7XG5cbiAgLy8gRmluZCBhbnkgb3ZlcmxhcHMgYmV0d2VlbiBkZWxldGlvbnMgYW5kIGluc2VydGlvbnMuXG4gIC8vIGUuZzogPGRlbD5hYmN4eHg8L2RlbD48aW5zPnh4eGRlZjwvaW5zPlxuICAvLyAgIC0+IDxkZWw+YWJjPC9kZWw+eHh4PGlucz5kZWY8L2lucz5cbiAgLy8gZS5nOiA8ZGVsPnh4eGFiYzwvZGVsPjxpbnM+ZGVmeHh4PC9pbnM+XG4gIC8vICAgLT4gPGlucz5kZWY8L2lucz54eHg8ZGVsPmFiYzwvZGVsPlxuICAvLyBPbmx5IGV4dHJhY3QgYW4gb3ZlcmxhcCBpZiBpdCBpcyBhcyBiaWcgYXMgdGhlIGVkaXQgYWhlYWQgb3IgYmVoaW5kIGl0LlxuICBwb2ludGVyID0gMTtcbiAgd2hpbGUgKHBvaW50ZXIgPCBkaWZmcy5sZW5ndGgpIHtcbiAgICBpZiAoZGlmZnNbcG9pbnRlciAtIDFdWzBdID09IERJRkZfREVMRVRFICYmXG4gICAgICAgIGRpZmZzW3BvaW50ZXJdWzBdID09IERJRkZfSU5TRVJUKSB7XG4gICAgICB2YXIgZGVsZXRpb24gPSBkaWZmc1twb2ludGVyIC0gMV1bMV07XG4gICAgICB2YXIgaW5zZXJ0aW9uID0gZGlmZnNbcG9pbnRlcl1bMV07XG4gICAgICB2YXIgb3ZlcmxhcF9sZW5ndGgxID0gdGhpcy5kaWZmX2NvbW1vbk92ZXJsYXBfKGRlbGV0aW9uLCBpbnNlcnRpb24pO1xuICAgICAgdmFyIG92ZXJsYXBfbGVuZ3RoMiA9IHRoaXMuZGlmZl9jb21tb25PdmVybGFwXyhpbnNlcnRpb24sIGRlbGV0aW9uKTtcbiAgICAgIGlmIChvdmVybGFwX2xlbmd0aDEgPj0gb3ZlcmxhcF9sZW5ndGgyKSB7XG4gICAgICAgIGlmIChvdmVybGFwX2xlbmd0aDEgPj0gZGVsZXRpb24ubGVuZ3RoIC8gMiB8fFxuICAgICAgICAgICAgb3ZlcmxhcF9sZW5ndGgxID49IGluc2VydGlvbi5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgLy8gT3ZlcmxhcCBmb3VuZC4gIEluc2VydCBhbiBlcXVhbGl0eSBhbmQgdHJpbSB0aGUgc3Vycm91bmRpbmcgZWRpdHMuXG4gICAgICAgICAgZGlmZnMuc3BsaWNlKHBvaW50ZXIsIDAsIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9FUVVBTCxcbiAgICAgICAgICAgICAgaW5zZXJ0aW9uLnN1YnN0cmluZygwLCBvdmVybGFwX2xlbmd0aDEpKSk7XG4gICAgICAgICAgZGlmZnNbcG9pbnRlciAtIDFdWzFdID1cbiAgICAgICAgICAgICAgZGVsZXRpb24uc3Vic3RyaW5nKDAsIGRlbGV0aW9uLmxlbmd0aCAtIG92ZXJsYXBfbGVuZ3RoMSk7XG4gICAgICAgICAgZGlmZnNbcG9pbnRlciArIDFdWzFdID0gaW5zZXJ0aW9uLnN1YnN0cmluZyhvdmVybGFwX2xlbmd0aDEpO1xuICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG92ZXJsYXBfbGVuZ3RoMiA+PSBkZWxldGlvbi5sZW5ndGggLyAyIHx8XG4gICAgICAgICAgICBvdmVybGFwX2xlbmd0aDIgPj0gaW5zZXJ0aW9uLmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICAvLyBSZXZlcnNlIG92ZXJsYXAgZm91bmQuXG4gICAgICAgICAgLy8gSW5zZXJ0IGFuIGVxdWFsaXR5IGFuZCBzd2FwIGFuZCB0cmltIHRoZSBzdXJyb3VuZGluZyBlZGl0cy5cbiAgICAgICAgICBkaWZmcy5zcGxpY2UocG9pbnRlciwgMCwgbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLFxuICAgICAgICAgICAgICBkZWxldGlvbi5zdWJzdHJpbmcoMCwgb3ZlcmxhcF9sZW5ndGgyKSkpO1xuICAgICAgICAgIGRpZmZzW3BvaW50ZXIgLSAxXVswXSA9IERJRkZfSU5TRVJUO1xuICAgICAgICAgIGRpZmZzW3BvaW50ZXIgLSAxXVsxXSA9XG4gICAgICAgICAgICAgIGluc2VydGlvbi5zdWJzdHJpbmcoMCwgaW5zZXJ0aW9uLmxlbmd0aCAtIG92ZXJsYXBfbGVuZ3RoMik7XG4gICAgICAgICAgZGlmZnNbcG9pbnRlciArIDFdWzBdID0gRElGRl9ERUxFVEU7XG4gICAgICAgICAgZGlmZnNbcG9pbnRlciArIDFdWzFdID1cbiAgICAgICAgICAgICAgZGVsZXRpb24uc3Vic3RyaW5nKG92ZXJsYXBfbGVuZ3RoMik7XG4gICAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwb2ludGVyKys7XG4gICAgfVxuICAgIHBvaW50ZXIrKztcbiAgfVxufTtcblxuXG4vKipcbiAqIExvb2sgZm9yIHNpbmdsZSBlZGl0cyBzdXJyb3VuZGVkIG9uIGJvdGggc2lkZXMgYnkgZXF1YWxpdGllc1xuICogd2hpY2ggY2FuIGJlIHNoaWZ0ZWQgc2lkZXdheXMgdG8gYWxpZ24gdGhlIGVkaXQgdG8gYSB3b3JkIGJvdW5kYXJ5LlxuICogZS5nOiBUaGUgYzxpbnM+YXQgYzwvaW5zPmFtZS4gLT4gVGhlIDxpbnM+Y2F0IDwvaW5zPmNhbWUuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NsZWFudXBTZW1hbnRpY0xvc3NsZXNzID0gZnVuY3Rpb24oZGlmZnMpIHtcbiAgLyoqXG4gICAqIEdpdmVuIHR3byBzdHJpbmdzLCBjb21wdXRlIGEgc2NvcmUgcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIGludGVybmFsXG4gICAqIGJvdW5kYXJ5IGZhbGxzIG9uIGxvZ2ljYWwgYm91bmRhcmllcy5cbiAgICogU2NvcmVzIHJhbmdlIGZyb20gNiAoYmVzdCkgdG8gMCAod29yc3QpLlxuICAgKiBDbG9zdXJlLCBidXQgZG9lcyBub3QgcmVmZXJlbmNlIGFueSBleHRlcm5hbCB2YXJpYWJsZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvbmUgRmlyc3Qgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHdvIFNlY29uZCBzdHJpbmcuXG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHNjb3JlLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gZGlmZl9jbGVhbnVwU2VtYW50aWNTY29yZV8ob25lLCB0d28pIHtcbiAgICBpZiAoIW9uZSB8fCAhdHdvKSB7XG4gICAgICAvLyBFZGdlcyBhcmUgdGhlIGJlc3QuXG4gICAgICByZXR1cm4gNjtcbiAgICB9XG5cbiAgICAvLyBFYWNoIHBvcnQgb2YgdGhpcyBmdW5jdGlvbiBiZWhhdmVzIHNsaWdodGx5IGRpZmZlcmVudGx5IGR1ZSB0b1xuICAgIC8vIHN1YnRsZSBkaWZmZXJlbmNlcyBpbiBlYWNoIGxhbmd1YWdlJ3MgZGVmaW5pdGlvbiBvZiB0aGluZ3MgbGlrZVxuICAgIC8vICd3aGl0ZXNwYWNlJy4gIFNpbmNlIHRoaXMgZnVuY3Rpb24ncyBwdXJwb3NlIGlzIGxhcmdlbHkgY29zbWV0aWMsXG4gICAgLy8gdGhlIGNob2ljZSBoYXMgYmVlbiBtYWRlIHRvIHVzZSBlYWNoIGxhbmd1YWdlJ3MgbmF0aXZlIGZlYXR1cmVzXG4gICAgLy8gcmF0aGVyIHRoYW4gZm9yY2UgdG90YWwgY29uZm9ybWl0eS5cbiAgICB2YXIgY2hhcjEgPSBvbmUuY2hhckF0KG9uZS5sZW5ndGggLSAxKTtcbiAgICB2YXIgY2hhcjIgPSB0d28uY2hhckF0KDApO1xuICAgIHZhciBub25BbHBoYU51bWVyaWMxID0gY2hhcjEubWF0Y2goZGlmZl9tYXRjaF9wYXRjaC5ub25BbHBoYU51bWVyaWNSZWdleF8pO1xuICAgIHZhciBub25BbHBoYU51bWVyaWMyID0gY2hhcjIubWF0Y2goZGlmZl9tYXRjaF9wYXRjaC5ub25BbHBoYU51bWVyaWNSZWdleF8pO1xuICAgIHZhciB3aGl0ZXNwYWNlMSA9IG5vbkFscGhhTnVtZXJpYzEgJiZcbiAgICAgICAgY2hhcjEubWF0Y2goZGlmZl9tYXRjaF9wYXRjaC53aGl0ZXNwYWNlUmVnZXhfKTtcbiAgICB2YXIgd2hpdGVzcGFjZTIgPSBub25BbHBoYU51bWVyaWMyICYmXG4gICAgICAgIGNoYXIyLm1hdGNoKGRpZmZfbWF0Y2hfcGF0Y2gud2hpdGVzcGFjZVJlZ2V4Xyk7XG4gICAgdmFyIGxpbmVCcmVhazEgPSB3aGl0ZXNwYWNlMSAmJlxuICAgICAgICBjaGFyMS5tYXRjaChkaWZmX21hdGNoX3BhdGNoLmxpbmVicmVha1JlZ2V4Xyk7XG4gICAgdmFyIGxpbmVCcmVhazIgPSB3aGl0ZXNwYWNlMiAmJlxuICAgICAgICBjaGFyMi5tYXRjaChkaWZmX21hdGNoX3BhdGNoLmxpbmVicmVha1JlZ2V4Xyk7XG4gICAgdmFyIGJsYW5rTGluZTEgPSBsaW5lQnJlYWsxICYmXG4gICAgICAgIG9uZS5tYXRjaChkaWZmX21hdGNoX3BhdGNoLmJsYW5rbGluZUVuZFJlZ2V4Xyk7XG4gICAgdmFyIGJsYW5rTGluZTIgPSBsaW5lQnJlYWsyICYmXG4gICAgICAgIHR3by5tYXRjaChkaWZmX21hdGNoX3BhdGNoLmJsYW5rbGluZVN0YXJ0UmVnZXhfKTtcblxuICAgIGlmIChibGFua0xpbmUxIHx8IGJsYW5rTGluZTIpIHtcbiAgICAgIC8vIEZpdmUgcG9pbnRzIGZvciBibGFuayBsaW5lcy5cbiAgICAgIHJldHVybiA1O1xuICAgIH0gZWxzZSBpZiAobGluZUJyZWFrMSB8fCBsaW5lQnJlYWsyKSB7XG4gICAgICAvLyBGb3VyIHBvaW50cyBmb3IgbGluZSBicmVha3MuXG4gICAgICByZXR1cm4gNDtcbiAgICB9IGVsc2UgaWYgKG5vbkFscGhhTnVtZXJpYzEgJiYgIXdoaXRlc3BhY2UxICYmIHdoaXRlc3BhY2UyKSB7XG4gICAgICAvLyBUaHJlZSBwb2ludHMgZm9yIGVuZCBvZiBzZW50ZW5jZXMuXG4gICAgICByZXR1cm4gMztcbiAgICB9IGVsc2UgaWYgKHdoaXRlc3BhY2UxIHx8IHdoaXRlc3BhY2UyKSB7XG4gICAgICAvLyBUd28gcG9pbnRzIGZvciB3aGl0ZXNwYWNlLlxuICAgICAgcmV0dXJuIDI7XG4gICAgfSBlbHNlIGlmIChub25BbHBoYU51bWVyaWMxIHx8IG5vbkFscGhhTnVtZXJpYzIpIHtcbiAgICAgIC8vIE9uZSBwb2ludCBmb3Igbm9uLWFscGhhbnVtZXJpYy5cbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciBwb2ludGVyID0gMTtcbiAgLy8gSW50ZW50aW9uYWxseSBpZ25vcmUgdGhlIGZpcnN0IGFuZCBsYXN0IGVsZW1lbnQgKGRvbid0IG5lZWQgY2hlY2tpbmcpLlxuICB3aGlsZSAocG9pbnRlciA8IGRpZmZzLmxlbmd0aCAtIDEpIHtcbiAgICBpZiAoZGlmZnNbcG9pbnRlciAtIDFdWzBdID09IERJRkZfRVFVQUwgJiZcbiAgICAgICAgZGlmZnNbcG9pbnRlciArIDFdWzBdID09IERJRkZfRVFVQUwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBzaW5nbGUgZWRpdCBzdXJyb3VuZGVkIGJ5IGVxdWFsaXRpZXMuXG4gICAgICB2YXIgZXF1YWxpdHkxID0gZGlmZnNbcG9pbnRlciAtIDFdWzFdO1xuICAgICAgdmFyIGVkaXQgPSBkaWZmc1twb2ludGVyXVsxXTtcbiAgICAgIHZhciBlcXVhbGl0eTIgPSBkaWZmc1twb2ludGVyICsgMV1bMV07XG5cbiAgICAgIC8vIEZpcnN0LCBzaGlmdCB0aGUgZWRpdCBhcyBmYXIgbGVmdCBhcyBwb3NzaWJsZS5cbiAgICAgIHZhciBjb21tb25PZmZzZXQgPSB0aGlzLmRpZmZfY29tbW9uU3VmZml4KGVxdWFsaXR5MSwgZWRpdCk7XG4gICAgICBpZiAoY29tbW9uT2Zmc2V0KSB7XG4gICAgICAgIHZhciBjb21tb25TdHJpbmcgPSBlZGl0LnN1YnN0cmluZyhlZGl0Lmxlbmd0aCAtIGNvbW1vbk9mZnNldCk7XG4gICAgICAgIGVxdWFsaXR5MSA9IGVxdWFsaXR5MS5zdWJzdHJpbmcoMCwgZXF1YWxpdHkxLmxlbmd0aCAtIGNvbW1vbk9mZnNldCk7XG4gICAgICAgIGVkaXQgPSBjb21tb25TdHJpbmcgKyBlZGl0LnN1YnN0cmluZygwLCBlZGl0Lmxlbmd0aCAtIGNvbW1vbk9mZnNldCk7XG4gICAgICAgIGVxdWFsaXR5MiA9IGNvbW1vblN0cmluZyArIGVxdWFsaXR5MjtcbiAgICAgIH1cblxuICAgICAgLy8gU2Vjb25kLCBzdGVwIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIgcmlnaHQsIGxvb2tpbmcgZm9yIHRoZSBiZXN0IGZpdC5cbiAgICAgIHZhciBiZXN0RXF1YWxpdHkxID0gZXF1YWxpdHkxO1xuICAgICAgdmFyIGJlc3RFZGl0ID0gZWRpdDtcbiAgICAgIHZhciBiZXN0RXF1YWxpdHkyID0gZXF1YWxpdHkyO1xuICAgICAgdmFyIGJlc3RTY29yZSA9IGRpZmZfY2xlYW51cFNlbWFudGljU2NvcmVfKGVxdWFsaXR5MSwgZWRpdCkgK1xuICAgICAgICAgIGRpZmZfY2xlYW51cFNlbWFudGljU2NvcmVfKGVkaXQsIGVxdWFsaXR5Mik7XG4gICAgICB3aGlsZSAoZWRpdC5jaGFyQXQoMCkgPT09IGVxdWFsaXR5Mi5jaGFyQXQoMCkpIHtcbiAgICAgICAgZXF1YWxpdHkxICs9IGVkaXQuY2hhckF0KDApO1xuICAgICAgICBlZGl0ID0gZWRpdC5zdWJzdHJpbmcoMSkgKyBlcXVhbGl0eTIuY2hhckF0KDApO1xuICAgICAgICBlcXVhbGl0eTIgPSBlcXVhbGl0eTIuc3Vic3RyaW5nKDEpO1xuICAgICAgICB2YXIgc2NvcmUgPSBkaWZmX2NsZWFudXBTZW1hbnRpY1Njb3JlXyhlcXVhbGl0eTEsIGVkaXQpICtcbiAgICAgICAgICAgIGRpZmZfY2xlYW51cFNlbWFudGljU2NvcmVfKGVkaXQsIGVxdWFsaXR5Mik7XG4gICAgICAgIC8vIFRoZSA+PSBlbmNvdXJhZ2VzIHRyYWlsaW5nIHJhdGhlciB0aGFuIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiBlZGl0cy5cbiAgICAgICAgaWYgKHNjb3JlID49IGJlc3RTY29yZSkge1xuICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlO1xuICAgICAgICAgIGJlc3RFcXVhbGl0eTEgPSBlcXVhbGl0eTE7XG4gICAgICAgICAgYmVzdEVkaXQgPSBlZGl0O1xuICAgICAgICAgIGJlc3RFcXVhbGl0eTIgPSBlcXVhbGl0eTI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGRpZmZzW3BvaW50ZXIgLSAxXVsxXSAhPSBiZXN0RXF1YWxpdHkxKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgYW4gaW1wcm92ZW1lbnQsIHNhdmUgaXQgYmFjayB0byB0aGUgZGlmZi5cbiAgICAgICAgaWYgKGJlc3RFcXVhbGl0eTEpIHtcbiAgICAgICAgICBkaWZmc1twb2ludGVyIC0gMV1bMV0gPSBiZXN0RXF1YWxpdHkxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpZmZzLnNwbGljZShwb2ludGVyIC0gMSwgMSk7XG4gICAgICAgICAgcG9pbnRlci0tO1xuICAgICAgICB9XG4gICAgICAgIGRpZmZzW3BvaW50ZXJdWzFdID0gYmVzdEVkaXQ7XG4gICAgICAgIGlmIChiZXN0RXF1YWxpdHkyKSB7XG4gICAgICAgICAgZGlmZnNbcG9pbnRlciArIDFdWzFdID0gYmVzdEVxdWFsaXR5MjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaWZmcy5zcGxpY2UocG9pbnRlciArIDEsIDEpO1xuICAgICAgICAgIHBvaW50ZXItLTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwb2ludGVyKys7XG4gIH1cbn07XG5cbi8vIERlZmluZSBzb21lIHJlZ2V4IHBhdHRlcm5zIGZvciBtYXRjaGluZyBib3VuZGFyaWVzLlxuZGlmZl9tYXRjaF9wYXRjaC5ub25BbHBoYU51bWVyaWNSZWdleF8gPSAvW15hLXpBLVowLTldLztcbmRpZmZfbWF0Y2hfcGF0Y2gud2hpdGVzcGFjZVJlZ2V4XyA9IC9cXHMvO1xuZGlmZl9tYXRjaF9wYXRjaC5saW5lYnJlYWtSZWdleF8gPSAvW1xcclxcbl0vO1xuZGlmZl9tYXRjaF9wYXRjaC5ibGFua2xpbmVFbmRSZWdleF8gPSAvXFxuXFxyP1xcbiQvO1xuZGlmZl9tYXRjaF9wYXRjaC5ibGFua2xpbmVTdGFydFJlZ2V4XyA9IC9eXFxyP1xcblxccj9cXG4vO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgbnVtYmVyIG9mIGVkaXRzIGJ5IGVsaW1pbmF0aW5nIG9wZXJhdGlvbmFsbHkgdHJpdmlhbCBlcXVhbGl0aWVzLlxuICogQHBhcmFtIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxlcy5cbiAqL1xuZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUuZGlmZl9jbGVhbnVwRWZmaWNpZW5jeSA9IGZ1bmN0aW9uKGRpZmZzKSB7XG4gIHZhciBjaGFuZ2VzID0gZmFsc2U7XG4gIHZhciBlcXVhbGl0aWVzID0gW107ICAvLyBTdGFjayBvZiBpbmRpY2VzIHdoZXJlIGVxdWFsaXRpZXMgYXJlIGZvdW5kLlxuICB2YXIgZXF1YWxpdGllc0xlbmd0aCA9IDA7ICAvLyBLZWVwaW5nIG91ciBvd24gbGVuZ3RoIHZhciBpcyBmYXN0ZXIgaW4gSlMuXG4gIC8qKiBAdHlwZSB7P3N0cmluZ30gKi9cbiAgdmFyIGxhc3RFcXVhbGl0eSA9IG51bGw7XG4gIC8vIEFsd2F5cyBlcXVhbCB0byBkaWZmc1tlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXV1bMV1cbiAgdmFyIHBvaW50ZXIgPSAwOyAgLy8gSW5kZXggb2YgY3VycmVudCBwb3NpdGlvbi5cbiAgLy8gSXMgdGhlcmUgYW4gaW5zZXJ0aW9uIG9wZXJhdGlvbiBiZWZvcmUgdGhlIGxhc3QgZXF1YWxpdHkuXG4gIHZhciBwcmVfaW5zID0gZmFsc2U7XG4gIC8vIElzIHRoZXJlIGEgZGVsZXRpb24gb3BlcmF0aW9uIGJlZm9yZSB0aGUgbGFzdCBlcXVhbGl0eS5cbiAgdmFyIHByZV9kZWwgPSBmYWxzZTtcbiAgLy8gSXMgdGhlcmUgYW4gaW5zZXJ0aW9uIG9wZXJhdGlvbiBhZnRlciB0aGUgbGFzdCBlcXVhbGl0eS5cbiAgdmFyIHBvc3RfaW5zID0gZmFsc2U7XG4gIC8vIElzIHRoZXJlIGEgZGVsZXRpb24gb3BlcmF0aW9uIGFmdGVyIHRoZSBsYXN0IGVxdWFsaXR5LlxuICB2YXIgcG9zdF9kZWwgPSBmYWxzZTtcbiAgd2hpbGUgKHBvaW50ZXIgPCBkaWZmcy5sZW5ndGgpIHtcbiAgICBpZiAoZGlmZnNbcG9pbnRlcl1bMF0gPT0gRElGRl9FUVVBTCkgeyAgLy8gRXF1YWxpdHkgZm91bmQuXG4gICAgICBpZiAoZGlmZnNbcG9pbnRlcl1bMV0ubGVuZ3RoIDwgdGhpcy5EaWZmX0VkaXRDb3N0ICYmXG4gICAgICAgICAgKHBvc3RfaW5zIHx8IHBvc3RfZGVsKSkge1xuICAgICAgICAvLyBDYW5kaWRhdGUgZm91bmQuXG4gICAgICAgIGVxdWFsaXRpZXNbZXF1YWxpdGllc0xlbmd0aCsrXSA9IHBvaW50ZXI7XG4gICAgICAgIHByZV9pbnMgPSBwb3N0X2lucztcbiAgICAgICAgcHJlX2RlbCA9IHBvc3RfZGVsO1xuICAgICAgICBsYXN0RXF1YWxpdHkgPSBkaWZmc1twb2ludGVyXVsxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBhIGNhbmRpZGF0ZSwgYW5kIGNhbiBuZXZlciBiZWNvbWUgb25lLlxuICAgICAgICBlcXVhbGl0aWVzTGVuZ3RoID0gMDtcbiAgICAgICAgbGFzdEVxdWFsaXR5ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHBvc3RfaW5zID0gcG9zdF9kZWwgPSBmYWxzZTtcbiAgICB9IGVsc2UgeyAgLy8gQW4gaW5zZXJ0aW9uIG9yIGRlbGV0aW9uLlxuICAgICAgaWYgKGRpZmZzW3BvaW50ZXJdWzBdID09IERJRkZfREVMRVRFKSB7XG4gICAgICAgIHBvc3RfZGVsID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvc3RfaW5zID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qXG4gICAgICAgKiBGaXZlIHR5cGVzIHRvIGJlIHNwbGl0OlxuICAgICAgICogPGlucz5BPC9pbnM+PGRlbD5CPC9kZWw+WFk8aW5zPkM8L2lucz48ZGVsPkQ8L2RlbD5cbiAgICAgICAqIDxpbnM+QTwvaW5zPlg8aW5zPkM8L2lucz48ZGVsPkQ8L2RlbD5cbiAgICAgICAqIDxpbnM+QTwvaW5zPjxkZWw+QjwvZGVsPlg8aW5zPkM8L2lucz5cbiAgICAgICAqIDxpbnM+QTwvZGVsPlg8aW5zPkM8L2lucz48ZGVsPkQ8L2RlbD5cbiAgICAgICAqIDxpbnM+QTwvaW5zPjxkZWw+QjwvZGVsPlg8ZGVsPkM8L2RlbD5cbiAgICAgICAqL1xuICAgICAgaWYgKGxhc3RFcXVhbGl0eSAmJiAoKHByZV9pbnMgJiYgcHJlX2RlbCAmJiBwb3N0X2lucyAmJiBwb3N0X2RlbCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGFzdEVxdWFsaXR5Lmxlbmd0aCA8IHRoaXMuRGlmZl9FZGl0Q29zdCAvIDIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZV9pbnMgKyBwcmVfZGVsICsgcG9zdF9pbnMgKyBwb3N0X2RlbCkgPT0gMykpKSB7XG4gICAgICAgIC8vIER1cGxpY2F0ZSByZWNvcmQuXG4gICAgICAgIGRpZmZzLnNwbGljZShlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXSwgMCxcbiAgICAgICAgICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9ERUxFVEUsIGxhc3RFcXVhbGl0eSkpO1xuICAgICAgICAvLyBDaGFuZ2Ugc2Vjb25kIGNvcHkgdG8gaW5zZXJ0LlxuICAgICAgICBkaWZmc1tlcXVhbGl0aWVzW2VxdWFsaXRpZXNMZW5ndGggLSAxXSArIDFdWzBdID0gRElGRl9JTlNFUlQ7XG4gICAgICAgIGVxdWFsaXRpZXNMZW5ndGgtLTsgIC8vIFRocm93IGF3YXkgdGhlIGVxdWFsaXR5IHdlIGp1c3QgZGVsZXRlZDtcbiAgICAgICAgbGFzdEVxdWFsaXR5ID0gbnVsbDtcbiAgICAgICAgaWYgKHByZV9pbnMgJiYgcHJlX2RlbCkge1xuICAgICAgICAgIC8vIE5vIGNoYW5nZXMgbWFkZSB3aGljaCBjb3VsZCBhZmZlY3QgcHJldmlvdXMgZW50cnksIGtlZXAgZ29pbmcuXG4gICAgICAgICAgcG9zdF9pbnMgPSBwb3N0X2RlbCA9IHRydWU7XG4gICAgICAgICAgZXF1YWxpdGllc0xlbmd0aCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXF1YWxpdGllc0xlbmd0aC0tOyAgLy8gVGhyb3cgYXdheSB0aGUgcHJldmlvdXMgZXF1YWxpdHkuXG4gICAgICAgICAgcG9pbnRlciA9IGVxdWFsaXRpZXNMZW5ndGggPiAwID9cbiAgICAgICAgICAgICAgZXF1YWxpdGllc1tlcXVhbGl0aWVzTGVuZ3RoIC0gMV0gOiAtMTtcbiAgICAgICAgICBwb3N0X2lucyA9IHBvc3RfZGVsID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHBvaW50ZXIrKztcbiAgfVxuXG4gIGlmIChjaGFuZ2VzKSB7XG4gICAgdGhpcy5kaWZmX2NsZWFudXBNZXJnZShkaWZmcyk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBSZW9yZGVyIGFuZCBtZXJnZSBsaWtlIGVkaXQgc2VjdGlvbnMuICBNZXJnZSBlcXVhbGl0aWVzLlxuICogQW55IGVkaXQgc2VjdGlvbiBjYW4gbW92ZSBhcyBsb25nIGFzIGl0IGRvZXNuJ3QgY3Jvc3MgYW4gZXF1YWxpdHkuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2NsZWFudXBNZXJnZSA9IGZ1bmN0aW9uKGRpZmZzKSB7XG4gIC8vIEFkZCBhIGR1bW15IGVudHJ5IGF0IHRoZSBlbmQuXG4gIGRpZmZzLnB1c2gobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLCAnJykpO1xuICB2YXIgcG9pbnRlciA9IDA7XG4gIHZhciBjb3VudF9kZWxldGUgPSAwO1xuICB2YXIgY291bnRfaW5zZXJ0ID0gMDtcbiAgdmFyIHRleHRfZGVsZXRlID0gJyc7XG4gIHZhciB0ZXh0X2luc2VydCA9ICcnO1xuICB2YXIgY29tbW9ubGVuZ3RoO1xuICB3aGlsZSAocG9pbnRlciA8IGRpZmZzLmxlbmd0aCkge1xuICAgIHN3aXRjaCAoZGlmZnNbcG9pbnRlcl1bMF0pIHtcbiAgICAgIGNhc2UgRElGRl9JTlNFUlQ6XG4gICAgICAgIGNvdW50X2luc2VydCsrO1xuICAgICAgICB0ZXh0X2luc2VydCArPSBkaWZmc1twb2ludGVyXVsxXTtcbiAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElGRl9ERUxFVEU6XG4gICAgICAgIGNvdW50X2RlbGV0ZSsrO1xuICAgICAgICB0ZXh0X2RlbGV0ZSArPSBkaWZmc1twb2ludGVyXVsxXTtcbiAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElGRl9FUVVBTDpcbiAgICAgICAgLy8gVXBvbiByZWFjaGluZyBhbiBlcXVhbGl0eSwgY2hlY2sgZm9yIHByaW9yIHJlZHVuZGFuY2llcy5cbiAgICAgICAgaWYgKGNvdW50X2RlbGV0ZSArIGNvdW50X2luc2VydCA+IDEpIHtcbiAgICAgICAgICBpZiAoY291bnRfZGVsZXRlICE9PSAwICYmIGNvdW50X2luc2VydCAhPT0gMCkge1xuICAgICAgICAgICAgLy8gRmFjdG9yIG91dCBhbnkgY29tbW9uIHByZWZpeGllcy5cbiAgICAgICAgICAgIGNvbW1vbmxlbmd0aCA9IHRoaXMuZGlmZl9jb21tb25QcmVmaXgodGV4dF9pbnNlcnQsIHRleHRfZGVsZXRlKTtcbiAgICAgICAgICAgIGlmIChjb21tb25sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgaWYgKChwb2ludGVyIC0gY291bnRfZGVsZXRlIC0gY291bnRfaW5zZXJ0KSA+IDAgJiZcbiAgICAgICAgICAgICAgICAgIGRpZmZzW3BvaW50ZXIgLSBjb3VudF9kZWxldGUgLSBjb3VudF9pbnNlcnQgLSAxXVswXSA9PVxuICAgICAgICAgICAgICAgICAgRElGRl9FUVVBTCkge1xuICAgICAgICAgICAgICAgIGRpZmZzW3BvaW50ZXIgLSBjb3VudF9kZWxldGUgLSBjb3VudF9pbnNlcnQgLSAxXVsxXSArPVxuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luc2VydC5zdWJzdHJpbmcoMCwgY29tbW9ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaWZmcy5zcGxpY2UoMCwgMCwgbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luc2VydC5zdWJzdHJpbmcoMCwgY29tbW9ubGVuZ3RoKSkpO1xuICAgICAgICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0ZXh0X2luc2VydCA9IHRleHRfaW5zZXJ0LnN1YnN0cmluZyhjb21tb25sZW5ndGgpO1xuICAgICAgICAgICAgICB0ZXh0X2RlbGV0ZSA9IHRleHRfZGVsZXRlLnN1YnN0cmluZyhjb21tb25sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRmFjdG9yIG91dCBhbnkgY29tbW9uIHN1ZmZpeGllcy5cbiAgICAgICAgICAgIGNvbW1vbmxlbmd0aCA9IHRoaXMuZGlmZl9jb21tb25TdWZmaXgodGV4dF9pbnNlcnQsIHRleHRfZGVsZXRlKTtcbiAgICAgICAgICAgIGlmIChjb21tb25sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgZGlmZnNbcG9pbnRlcl1bMV0gPSB0ZXh0X2luc2VydC5zdWJzdHJpbmcodGV4dF9pbnNlcnQubGVuZ3RoIC1cbiAgICAgICAgICAgICAgICAgIGNvbW1vbmxlbmd0aCkgKyBkaWZmc1twb2ludGVyXVsxXTtcbiAgICAgICAgICAgICAgdGV4dF9pbnNlcnQgPSB0ZXh0X2luc2VydC5zdWJzdHJpbmcoMCwgdGV4dF9pbnNlcnQubGVuZ3RoIC1cbiAgICAgICAgICAgICAgICAgIGNvbW1vbmxlbmd0aCk7XG4gICAgICAgICAgICAgIHRleHRfZGVsZXRlID0gdGV4dF9kZWxldGUuc3Vic3RyaW5nKDAsIHRleHRfZGVsZXRlLmxlbmd0aCAtXG4gICAgICAgICAgICAgICAgICBjb21tb25sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIG9mZmVuZGluZyByZWNvcmRzIGFuZCBhZGQgdGhlIG1lcmdlZCBvbmVzLlxuICAgICAgICAgIHBvaW50ZXIgLT0gY291bnRfZGVsZXRlICsgY291bnRfaW5zZXJ0O1xuICAgICAgICAgIGRpZmZzLnNwbGljZShwb2ludGVyLCBjb3VudF9kZWxldGUgKyBjb3VudF9pbnNlcnQpO1xuICAgICAgICAgIGlmICh0ZXh0X2RlbGV0ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpZmZzLnNwbGljZShwb2ludGVyLCAwLFxuICAgICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9ERUxFVEUsIHRleHRfZGVsZXRlKSk7XG4gICAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0ZXh0X2luc2VydC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpZmZzLnNwbGljZShwb2ludGVyLCAwLFxuICAgICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9JTlNFUlQsIHRleHRfaW5zZXJ0KSk7XG4gICAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludGVyICE9PSAwICYmIGRpZmZzW3BvaW50ZXIgLSAxXVswXSA9PSBESUZGX0VRVUFMKSB7XG4gICAgICAgICAgLy8gTWVyZ2UgdGhpcyBlcXVhbGl0eSB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgICAgZGlmZnNbcG9pbnRlciAtIDFdWzFdICs9IGRpZmZzW3BvaW50ZXJdWzFdO1xuICAgICAgICAgIGRpZmZzLnNwbGljZShwb2ludGVyLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgIH1cbiAgICAgICAgY291bnRfaW5zZXJ0ID0gMDtcbiAgICAgICAgY291bnRfZGVsZXRlID0gMDtcbiAgICAgICAgdGV4dF9kZWxldGUgPSAnJztcbiAgICAgICAgdGV4dF9pbnNlcnQgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChkaWZmc1tkaWZmcy5sZW5ndGggLSAxXVsxXSA9PT0gJycpIHtcbiAgICBkaWZmcy5wb3AoKTsgIC8vIFJlbW92ZSB0aGUgZHVtbXkgZW50cnkgYXQgdGhlIGVuZC5cbiAgfVxuXG4gIC8vIFNlY29uZCBwYXNzOiBsb29rIGZvciBzaW5nbGUgZWRpdHMgc3Vycm91bmRlZCBvbiBib3RoIHNpZGVzIGJ5IGVxdWFsaXRpZXNcbiAgLy8gd2hpY2ggY2FuIGJlIHNoaWZ0ZWQgc2lkZXdheXMgdG8gZWxpbWluYXRlIGFuIGVxdWFsaXR5LlxuICAvLyBlLmc6IEE8aW5zPkJBPC9pbnM+QyAtPiA8aW5zPkFCPC9pbnM+QUNcbiAgdmFyIGNoYW5nZXMgPSBmYWxzZTtcbiAgcG9pbnRlciA9IDE7XG4gIC8vIEludGVudGlvbmFsbHkgaWdub3JlIHRoZSBmaXJzdCBhbmQgbGFzdCBlbGVtZW50IChkb24ndCBuZWVkIGNoZWNraW5nKS5cbiAgd2hpbGUgKHBvaW50ZXIgPCBkaWZmcy5sZW5ndGggLSAxKSB7XG4gICAgaWYgKGRpZmZzW3BvaW50ZXIgLSAxXVswXSA9PSBESUZGX0VRVUFMICYmXG4gICAgICAgIGRpZmZzW3BvaW50ZXIgKyAxXVswXSA9PSBESUZGX0VRVUFMKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgc2luZ2xlIGVkaXQgc3Vycm91bmRlZCBieSBlcXVhbGl0aWVzLlxuICAgICAgaWYgKGRpZmZzW3BvaW50ZXJdWzFdLnN1YnN0cmluZyhkaWZmc1twb2ludGVyXVsxXS5sZW5ndGggLVxuICAgICAgICAgIGRpZmZzW3BvaW50ZXIgLSAxXVsxXS5sZW5ndGgpID09IGRpZmZzW3BvaW50ZXIgLSAxXVsxXSkge1xuICAgICAgICAvLyBTaGlmdCB0aGUgZWRpdCBvdmVyIHRoZSBwcmV2aW91cyBlcXVhbGl0eS5cbiAgICAgICAgZGlmZnNbcG9pbnRlcl1bMV0gPSBkaWZmc1twb2ludGVyIC0gMV1bMV0gK1xuICAgICAgICAgICAgZGlmZnNbcG9pbnRlcl1bMV0uc3Vic3RyaW5nKDAsIGRpZmZzW3BvaW50ZXJdWzFdLmxlbmd0aCAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZnNbcG9pbnRlciAtIDFdWzFdLmxlbmd0aCk7XG4gICAgICAgIGRpZmZzW3BvaW50ZXIgKyAxXVsxXSA9IGRpZmZzW3BvaW50ZXIgLSAxXVsxXSArIGRpZmZzW3BvaW50ZXIgKyAxXVsxXTtcbiAgICAgICAgZGlmZnMuc3BsaWNlKHBvaW50ZXIgLSAxLCAxKTtcbiAgICAgICAgY2hhbmdlcyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGRpZmZzW3BvaW50ZXJdWzFdLnN1YnN0cmluZygwLCBkaWZmc1twb2ludGVyICsgMV1bMV0ubGVuZ3RoKSA9PVxuICAgICAgICAgIGRpZmZzW3BvaW50ZXIgKyAxXVsxXSkge1xuICAgICAgICAvLyBTaGlmdCB0aGUgZWRpdCBvdmVyIHRoZSBuZXh0IGVxdWFsaXR5LlxuICAgICAgICBkaWZmc1twb2ludGVyIC0gMV1bMV0gKz0gZGlmZnNbcG9pbnRlciArIDFdWzFdO1xuICAgICAgICBkaWZmc1twb2ludGVyXVsxXSA9XG4gICAgICAgICAgICBkaWZmc1twb2ludGVyXVsxXS5zdWJzdHJpbmcoZGlmZnNbcG9pbnRlciArIDFdWzFdLmxlbmd0aCkgK1xuICAgICAgICAgICAgZGlmZnNbcG9pbnRlciArIDFdWzFdO1xuICAgICAgICBkaWZmcy5zcGxpY2UocG9pbnRlciArIDEsIDEpO1xuICAgICAgICBjaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcG9pbnRlcisrO1xuICB9XG4gIC8vIElmIHNoaWZ0cyB3ZXJlIG1hZGUsIHRoZSBkaWZmIG5lZWRzIHJlb3JkZXJpbmcgYW5kIGFub3RoZXIgc2hpZnQgc3dlZXAuXG4gIGlmIChjaGFuZ2VzKSB7XG4gICAgdGhpcy5kaWZmX2NsZWFudXBNZXJnZShkaWZmcyk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBsb2MgaXMgYSBsb2NhdGlvbiBpbiB0ZXh0MSwgY29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBlcXVpdmFsZW50IGxvY2F0aW9uIGluXG4gKiB0ZXh0Mi5cbiAqIGUuZy4gJ1RoZSBjYXQnIHZzICdUaGUgYmlnIGNhdCcsIDEtPjEsIDUtPjhcbiAqIEBwYXJhbSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gbG9jIExvY2F0aW9uIHdpdGhpbiB0ZXh0MS5cbiAqIEByZXR1cm4ge251bWJlcn0gTG9jYXRpb24gd2l0aGluIHRleHQyLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX3hJbmRleCA9IGZ1bmN0aW9uKGRpZmZzLCBsb2MpIHtcbiAgdmFyIGNoYXJzMSA9IDA7XG4gIHZhciBjaGFyczIgPSAwO1xuICB2YXIgbGFzdF9jaGFyczEgPSAwO1xuICB2YXIgbGFzdF9jaGFyczIgPSAwO1xuICB2YXIgeDtcbiAgZm9yICh4ID0gMDsgeCA8IGRpZmZzLmxlbmd0aDsgeCsrKSB7XG4gICAgaWYgKGRpZmZzW3hdWzBdICE9PSBESUZGX0lOU0VSVCkgeyAgLy8gRXF1YWxpdHkgb3IgZGVsZXRpb24uXG4gICAgICBjaGFyczEgKz0gZGlmZnNbeF1bMV0ubGVuZ3RoO1xuICAgIH1cbiAgICBpZiAoZGlmZnNbeF1bMF0gIT09IERJRkZfREVMRVRFKSB7ICAvLyBFcXVhbGl0eSBvciBpbnNlcnRpb24uXG4gICAgICBjaGFyczIgKz0gZGlmZnNbeF1bMV0ubGVuZ3RoO1xuICAgIH1cbiAgICBpZiAoY2hhcnMxID4gbG9jKSB7ICAvLyBPdmVyc2hvdCB0aGUgbG9jYXRpb24uXG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbGFzdF9jaGFyczEgPSBjaGFyczE7XG4gICAgbGFzdF9jaGFyczIgPSBjaGFyczI7XG4gIH1cbiAgLy8gV2FzIHRoZSBsb2NhdGlvbiB3YXMgZGVsZXRlZD9cbiAgaWYgKGRpZmZzLmxlbmd0aCAhPSB4ICYmIGRpZmZzW3hdWzBdID09PSBESUZGX0RFTEVURSkge1xuICAgIHJldHVybiBsYXN0X2NoYXJzMjtcbiAgfVxuICAvLyBBZGQgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXIgbGVuZ3RoLlxuICByZXR1cm4gbGFzdF9jaGFyczIgKyAobG9jIC0gbGFzdF9jaGFyczEpO1xufTtcblxuXG4vKipcbiAqIENvbnZlcnQgYSBkaWZmIGFycmF5IGludG8gYSBwcmV0dHkgSFRNTCByZXBvcnQuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHJlcHJlc2VudGF0aW9uLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX3ByZXR0eUh0bWwgPSBmdW5jdGlvbihkaWZmcykge1xuICB2YXIgaHRtbCA9IFtdO1xuICB2YXIgcGF0dGVybl9hbXAgPSAvJi9nO1xuICB2YXIgcGF0dGVybl9sdCA9IC88L2c7XG4gIHZhciBwYXR0ZXJuX2d0ID0gLz4vZztcbiAgdmFyIHBhdHRlcm5fcGFyYSA9IC9cXG4vZztcbiAgZm9yICh2YXIgeCA9IDA7IHggPCBkaWZmcy5sZW5ndGg7IHgrKykge1xuICAgIHZhciBvcCA9IGRpZmZzW3hdWzBdOyAgICAvLyBPcGVyYXRpb24gKGluc2VydCwgZGVsZXRlLCBlcXVhbClcbiAgICB2YXIgZGF0YSA9IGRpZmZzW3hdWzFdOyAgLy8gVGV4dCBvZiBjaGFuZ2UuXG4gICAgdmFyIHRleHQgPSBkYXRhLnJlcGxhY2UocGF0dGVybl9hbXAsICcmYW1wOycpLnJlcGxhY2UocGF0dGVybl9sdCwgJyZsdDsnKVxuICAgICAgICAucmVwbGFjZShwYXR0ZXJuX2d0LCAnJmd0OycpLnJlcGxhY2UocGF0dGVybl9wYXJhLCAnJnBhcmE7PGJyPicpO1xuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgRElGRl9JTlNFUlQ6XG4gICAgICAgIGh0bWxbeF0gPSAnPGlucyBzdHlsZT1cImJhY2tncm91bmQ6I2U2ZmZlNjtcIj4nICsgdGV4dCArICc8L2lucz4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElGRl9ERUxFVEU6XG4gICAgICAgIGh0bWxbeF0gPSAnPGRlbCBzdHlsZT1cImJhY2tncm91bmQ6I2ZmZTZlNjtcIj4nICsgdGV4dCArICc8L2RlbD4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElGRl9FUVVBTDpcbiAgICAgICAgaHRtbFt4XSA9ICc8c3Bhbj4nICsgdGV4dCArICc8L3NwYW4+JztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBodG1sLmpvaW4oJycpO1xufTtcblxuXG4vKipcbiAqIENvbXB1dGUgYW5kIHJldHVybiB0aGUgc291cmNlIHRleHQgKGFsbCBlcXVhbGl0aWVzIGFuZCBkZWxldGlvbnMpLlxuICogQHBhcmFtIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSBkaWZmcyBBcnJheSBvZiBkaWZmIHR1cGxlcy5cbiAqIEByZXR1cm4ge3N0cmluZ30gU291cmNlIHRleHQuXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfdGV4dDEgPSBmdW5jdGlvbihkaWZmcykge1xuICB2YXIgdGV4dCA9IFtdO1xuICBmb3IgKHZhciB4ID0gMDsgeCA8IGRpZmZzLmxlbmd0aDsgeCsrKSB7XG4gICAgaWYgKGRpZmZzW3hdWzBdICE9PSBESUZGX0lOU0VSVCkge1xuICAgICAgdGV4dFt4XSA9IGRpZmZzW3hdWzFdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGV4dC5qb2luKCcnKTtcbn07XG5cblxuLyoqXG4gKiBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGRlc3RpbmF0aW9uIHRleHQgKGFsbCBlcXVhbGl0aWVzIGFuZCBpbnNlcnRpb25zKS5cbiAqIEBwYXJhbSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IERlc3RpbmF0aW9uIHRleHQuXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLmRpZmZfdGV4dDIgPSBmdW5jdGlvbihkaWZmcykge1xuICB2YXIgdGV4dCA9IFtdO1xuICBmb3IgKHZhciB4ID0gMDsgeCA8IGRpZmZzLmxlbmd0aDsgeCsrKSB7XG4gICAgaWYgKGRpZmZzW3hdWzBdICE9PSBESUZGX0RFTEVURSkge1xuICAgICAgdGV4dFt4XSA9IGRpZmZzW3hdWzFdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGV4dC5qb2luKCcnKTtcbn07XG5cblxuLyoqXG4gKiBDb21wdXRlIHRoZSBMZXZlbnNodGVpbiBkaXN0YW5jZTsgdGhlIG51bWJlciBvZiBpbnNlcnRlZCwgZGVsZXRlZCBvclxuICogc3Vic3RpdHV0ZWQgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5EaWZmPn0gZGlmZnMgQXJyYXkgb2YgZGlmZiB0dXBsZXMuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IE51bWJlciBvZiBjaGFuZ2VzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2xldmVuc2h0ZWluID0gZnVuY3Rpb24oZGlmZnMpIHtcbiAgdmFyIGxldmVuc2h0ZWluID0gMDtcbiAgdmFyIGluc2VydGlvbnMgPSAwO1xuICB2YXIgZGVsZXRpb25zID0gMDtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCBkaWZmcy5sZW5ndGg7IHgrKykge1xuICAgIHZhciBvcCA9IGRpZmZzW3hdWzBdO1xuICAgIHZhciBkYXRhID0gZGlmZnNbeF1bMV07XG4gICAgc3dpdGNoIChvcCkge1xuICAgICAgY2FzZSBESUZGX0lOU0VSVDpcbiAgICAgICAgaW5zZXJ0aW9ucyArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJRkZfREVMRVRFOlxuICAgICAgICBkZWxldGlvbnMgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBESUZGX0VRVUFMOlxuICAgICAgICAvLyBBIGRlbGV0aW9uIGFuZCBhbiBpbnNlcnRpb24gaXMgb25lIHN1YnN0aXR1dGlvbi5cbiAgICAgICAgbGV2ZW5zaHRlaW4gKz0gTWF0aC5tYXgoaW5zZXJ0aW9ucywgZGVsZXRpb25zKTtcbiAgICAgICAgaW5zZXJ0aW9ucyA9IDA7XG4gICAgICAgIGRlbGV0aW9ucyA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBsZXZlbnNodGVpbiArPSBNYXRoLm1heChpbnNlcnRpb25zLCBkZWxldGlvbnMpO1xuICByZXR1cm4gbGV2ZW5zaHRlaW47XG59O1xuXG5cbi8qKlxuICogQ3J1c2ggdGhlIGRpZmYgaW50byBhbiBlbmNvZGVkIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlIG9wZXJhdGlvbnNcbiAqIHJlcXVpcmVkIHRvIHRyYW5zZm9ybSB0ZXh0MSBpbnRvIHRleHQyLlxuICogRS5nLiA9M1xcdC0yXFx0K2luZyAgLT4gS2VlcCAzIGNoYXJzLCBkZWxldGUgMiBjaGFycywgaW5zZXJ0ICdpbmcnLlxuICogT3BlcmF0aW9ucyBhcmUgdGFiLXNlcGFyYXRlZC4gIEluc2VydGVkIHRleHQgaXMgZXNjYXBlZCB1c2luZyAleHggbm90YXRpb24uXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IGRpZmZzIEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICogQHJldHVybiB7c3RyaW5nfSBEZWx0YSB0ZXh0LlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX3RvRGVsdGEgPSBmdW5jdGlvbihkaWZmcykge1xuICB2YXIgdGV4dCA9IFtdO1xuICBmb3IgKHZhciB4ID0gMDsgeCA8IGRpZmZzLmxlbmd0aDsgeCsrKSB7XG4gICAgc3dpdGNoIChkaWZmc1t4XVswXSkge1xuICAgICAgY2FzZSBESUZGX0lOU0VSVDpcbiAgICAgICAgdGV4dFt4XSA9ICcrJyArIGVuY29kZVVSSShkaWZmc1t4XVsxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBESUZGX0RFTEVURTpcbiAgICAgICAgdGV4dFt4XSA9ICctJyArIGRpZmZzW3hdWzFdLmxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJRkZfRVFVQUw6XG4gICAgICAgIHRleHRbeF0gPSAnPScgKyBkaWZmc1t4XVsxXS5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGV4dC5qb2luKCdcXHQnKS5yZXBsYWNlKC8lMjAvZywgJyAnKTtcbn07XG5cblxuLyoqXG4gKiBHaXZlbiB0aGUgb3JpZ2luYWwgdGV4dDEsIGFuZCBhbiBlbmNvZGVkIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlXG4gKiBvcGVyYXRpb25zIHJlcXVpcmVkIHRvIHRyYW5zZm9ybSB0ZXh0MSBpbnRvIHRleHQyLCBjb21wdXRlIHRoZSBmdWxsIGRpZmYuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dDEgU291cmNlIHN0cmluZyBmb3IgdGhlIGRpZmYuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVsdGEgRGVsdGEgdGV4dC5cbiAqIEByZXR1cm4geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2guRGlmZj59IEFycmF5IG9mIGRpZmYgdHVwbGVzLlxuICogQHRocm93cyB7IUVycm9yfSBJZiBpbnZhbGlkIGlucHV0LlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5kaWZmX2Zyb21EZWx0YSA9IGZ1bmN0aW9uKHRleHQxLCBkZWx0YSkge1xuICB2YXIgZGlmZnMgPSBbXTtcbiAgdmFyIGRpZmZzTGVuZ3RoID0gMDsgIC8vIEtlZXBpbmcgb3VyIG93biBsZW5ndGggdmFyIGlzIGZhc3RlciBpbiBKUy5cbiAgdmFyIHBvaW50ZXIgPSAwOyAgLy8gQ3Vyc29yIGluIHRleHQxXG4gIHZhciB0b2tlbnMgPSBkZWx0YS5zcGxpdCgvXFx0L2cpO1xuICBmb3IgKHZhciB4ID0gMDsgeCA8IHRva2Vucy5sZW5ndGg7IHgrKykge1xuICAgIC8vIEVhY2ggdG9rZW4gYmVnaW5zIHdpdGggYSBvbmUgY2hhcmFjdGVyIHBhcmFtZXRlciB3aGljaCBzcGVjaWZpZXMgdGhlXG4gICAgLy8gb3BlcmF0aW9uIG9mIHRoaXMgdG9rZW4gKGRlbGV0ZSwgaW5zZXJ0LCBlcXVhbGl0eSkuXG4gICAgdmFyIHBhcmFtID0gdG9rZW5zW3hdLnN1YnN0cmluZygxKTtcbiAgICBzd2l0Y2ggKHRva2Vuc1t4XS5jaGFyQXQoMCkpIHtcbiAgICAgIGNhc2UgJysnOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGRpZmZzW2RpZmZzTGVuZ3RoKytdID1cbiAgICAgICAgICAgICAgbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0lOU0VSVCwgZGVjb2RlVVJJKHBhcmFtKSk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgLy8gTWFsZm9ybWVkIFVSSSBzZXF1ZW5jZS5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgZXNjYXBlIGluIGRpZmZfZnJvbURlbHRhOiAnICsgcGFyYW0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnLSc6XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJz0nOlxuICAgICAgICB2YXIgbiA9IHBhcnNlSW50KHBhcmFtLCAxMCk7XG4gICAgICAgIGlmIChpc05hTihuKSB8fCBuIDwgMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBudW1iZXIgaW4gZGlmZl9mcm9tRGVsdGE6ICcgKyBwYXJhbSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRleHQgPSB0ZXh0MS5zdWJzdHJpbmcocG9pbnRlciwgcG9pbnRlciArPSBuKTtcbiAgICAgICAgaWYgKHRva2Vuc1t4XS5jaGFyQXQoMCkgPT0gJz0nKSB7XG4gICAgICAgICAgZGlmZnNbZGlmZnNMZW5ndGgrK10gPSBuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsIHRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpZmZzW2RpZmZzTGVuZ3RoKytdID0gbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0RFTEVURSwgdGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBCbGFuayB0b2tlbnMgYXJlIG9rIChmcm9tIGEgdHJhaWxpbmcgXFx0KS5cbiAgICAgICAgLy8gQW55dGhpbmcgZWxzZSBpcyBhbiBlcnJvci5cbiAgICAgICAgaWYgKHRva2Vuc1t4XSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkaWZmIG9wZXJhdGlvbiBpbiBkaWZmX2Zyb21EZWx0YTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vuc1t4XSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHBvaW50ZXIgIT0gdGV4dDEubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEZWx0YSBsZW5ndGggKCcgKyBwb2ludGVyICtcbiAgICAgICAgJykgZG9lcyBub3QgZXF1YWwgc291cmNlIHRleHQgbGVuZ3RoICgnICsgdGV4dDEubGVuZ3RoICsgJykuJyk7XG4gIH1cbiAgcmV0dXJuIGRpZmZzO1xufTtcblxuXG4vLyAgTUFUQ0ggRlVOQ1RJT05TXG5cblxuLyoqXG4gKiBMb2NhdGUgdGhlIGJlc3QgaW5zdGFuY2Ugb2YgJ3BhdHRlcm4nIGluICd0ZXh0JyBuZWFyICdsb2MnLlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGhlIHRleHQgdG8gc2VhcmNoLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsb2MgVGhlIGxvY2F0aW9uIHRvIHNlYXJjaCBhcm91bmQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEJlc3QgbWF0Y2ggaW5kZXggb3IgLTEuXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLm1hdGNoX21haW4gPSBmdW5jdGlvbih0ZXh0LCBwYXR0ZXJuLCBsb2MpIHtcbiAgLy8gQ2hlY2sgZm9yIG51bGwgaW5wdXRzLlxuICBpZiAodGV4dCA9PSBudWxsIHx8IHBhdHRlcm4gPT0gbnVsbCB8fCBsb2MgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTnVsbCBpbnB1dC4gKG1hdGNoX21haW4pJyk7XG4gIH1cblxuICBsb2MgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihsb2MsIHRleHQubGVuZ3RoKSk7XG4gIGlmICh0ZXh0ID09IHBhdHRlcm4pIHtcbiAgICAvLyBTaG9ydGN1dCAocG90ZW50aWFsbHkgbm90IGd1YXJhbnRlZWQgYnkgdGhlIGFsZ29yaXRobSlcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIGlmICghdGV4dC5sZW5ndGgpIHtcbiAgICAvLyBOb3RoaW5nIHRvIG1hdGNoLlxuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIGlmICh0ZXh0LnN1YnN0cmluZyhsb2MsIGxvYyArIHBhdHRlcm4ubGVuZ3RoKSA9PSBwYXR0ZXJuKSB7XG4gICAgLy8gUGVyZmVjdCBtYXRjaCBhdCB0aGUgcGVyZmVjdCBzcG90ISAgKEluY2x1ZGVzIGNhc2Ugb2YgbnVsbCBwYXR0ZXJuKVxuICAgIHJldHVybiBsb2M7XG4gIH0gZWxzZSB7XG4gICAgLy8gRG8gYSBmdXp6eSBjb21wYXJlLlxuICAgIHJldHVybiB0aGlzLm1hdGNoX2JpdGFwXyh0ZXh0LCBwYXR0ZXJuLCBsb2MpO1xuICB9XG59O1xuXG5cbi8qKlxuICogTG9jYXRlIHRoZSBiZXN0IGluc3RhbmNlIG9mICdwYXR0ZXJuJyBpbiAndGV4dCcgbmVhciAnbG9jJyB1c2luZyB0aGVcbiAqIEJpdGFwIGFsZ29yaXRobS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gbG9jIFRoZSBsb2NhdGlvbiB0byBzZWFyY2ggYXJvdW5kLlxuICogQHJldHVybiB7bnVtYmVyfSBCZXN0IG1hdGNoIGluZGV4IG9yIC0xLlxuICogQHByaXZhdGVcbiAqL1xuZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUubWF0Y2hfYml0YXBfID0gZnVuY3Rpb24odGV4dCwgcGF0dGVybiwgbG9jKSB7XG4gIGlmIChwYXR0ZXJuLmxlbmd0aCA+IHRoaXMuTWF0Y2hfTWF4Qml0cykge1xuICAgIHRocm93IG5ldyBFcnJvcignUGF0dGVybiB0b28gbG9uZyBmb3IgdGhpcyBicm93c2VyLicpO1xuICB9XG5cbiAgLy8gSW5pdGlhbGlzZSB0aGUgYWxwaGFiZXQuXG4gIHZhciBzID0gdGhpcy5tYXRjaF9hbHBoYWJldF8ocGF0dGVybik7XG5cbiAgdmFyIGRtcCA9IHRoaXM7ICAvLyAndGhpcycgYmVjb21lcyAnd2luZG93JyBpbiBhIGNsb3N1cmUuXG5cbiAgLyoqXG4gICAqIENvbXB1dGUgYW5kIHJldHVybiB0aGUgc2NvcmUgZm9yIGEgbWF0Y2ggd2l0aCBlIGVycm9ycyBhbmQgeCBsb2NhdGlvbi5cbiAgICogQWNjZXNzZXMgbG9jIGFuZCBwYXR0ZXJuIHRocm91Z2ggYmVpbmcgYSBjbG9zdXJlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZSBOdW1iZXIgb2YgZXJyb3JzIGluIG1hdGNoLlxuICAgKiBAcGFyYW0ge251bWJlcn0geCBMb2NhdGlvbiBvZiBtYXRjaC5cbiAgICogQHJldHVybiB7bnVtYmVyfSBPdmVyYWxsIHNjb3JlIGZvciBtYXRjaCAoMC4wID0gZ29vZCwgMS4wID0gYmFkKS5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoX2JpdGFwU2NvcmVfKGUsIHgpIHtcbiAgICB2YXIgYWNjdXJhY3kgPSBlIC8gcGF0dGVybi5sZW5ndGg7XG4gICAgdmFyIHByb3hpbWl0eSA9IE1hdGguYWJzKGxvYyAtIHgpO1xuICAgIGlmICghZG1wLk1hdGNoX0Rpc3RhbmNlKSB7XG4gICAgICAvLyBEb2RnZSBkaXZpZGUgYnkgemVybyBlcnJvci5cbiAgICAgIHJldHVybiBwcm94aW1pdHkgPyAxLjAgOiBhY2N1cmFjeTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VyYWN5ICsgKHByb3hpbWl0eSAvIGRtcC5NYXRjaF9EaXN0YW5jZSk7XG4gIH1cblxuICAvLyBIaWdoZXN0IHNjb3JlIGJleW9uZCB3aGljaCB3ZSBnaXZlIHVwLlxuICB2YXIgc2NvcmVfdGhyZXNob2xkID0gdGhpcy5NYXRjaF9UaHJlc2hvbGQ7XG4gIC8vIElzIHRoZXJlIGEgbmVhcmJ5IGV4YWN0IG1hdGNoPyAoc3BlZWR1cClcbiAgdmFyIGJlc3RfbG9jID0gdGV4dC5pbmRleE9mKHBhdHRlcm4sIGxvYyk7XG4gIGlmIChiZXN0X2xvYyAhPSAtMSkge1xuICAgIHNjb3JlX3RocmVzaG9sZCA9IE1hdGgubWluKG1hdGNoX2JpdGFwU2NvcmVfKDAsIGJlc3RfbG9jKSwgc2NvcmVfdGhyZXNob2xkKTtcbiAgICAvLyBXaGF0IGFib3V0IGluIHRoZSBvdGhlciBkaXJlY3Rpb24/IChzcGVlZHVwKVxuICAgIGJlc3RfbG9jID0gdGV4dC5sYXN0SW5kZXhPZihwYXR0ZXJuLCBsb2MgKyBwYXR0ZXJuLmxlbmd0aCk7XG4gICAgaWYgKGJlc3RfbG9jICE9IC0xKSB7XG4gICAgICBzY29yZV90aHJlc2hvbGQgPVxuICAgICAgICAgIE1hdGgubWluKG1hdGNoX2JpdGFwU2NvcmVfKDAsIGJlc3RfbG9jKSwgc2NvcmVfdGhyZXNob2xkKTtcbiAgICB9XG4gIH1cblxuICAvLyBJbml0aWFsaXNlIHRoZSBiaXQgYXJyYXlzLlxuICB2YXIgbWF0Y2htYXNrID0gMSA8PCAocGF0dGVybi5sZW5ndGggLSAxKTtcbiAgYmVzdF9sb2MgPSAtMTtcblxuICB2YXIgYmluX21pbiwgYmluX21pZDtcbiAgdmFyIGJpbl9tYXggPSBwYXR0ZXJuLmxlbmd0aCArIHRleHQubGVuZ3RoO1xuICB2YXIgbGFzdF9yZDtcbiAgZm9yICh2YXIgZCA9IDA7IGQgPCBwYXR0ZXJuLmxlbmd0aDsgZCsrKSB7XG4gICAgLy8gU2NhbiBmb3IgdGhlIGJlc3QgbWF0Y2g7IGVhY2ggaXRlcmF0aW9uIGFsbG93cyBmb3Igb25lIG1vcmUgZXJyb3IuXG4gICAgLy8gUnVuIGEgYmluYXJ5IHNlYXJjaCB0byBkZXRlcm1pbmUgaG93IGZhciBmcm9tICdsb2MnIHdlIGNhbiBzdHJheSBhdCB0aGlzXG4gICAgLy8gZXJyb3IgbGV2ZWwuXG4gICAgYmluX21pbiA9IDA7XG4gICAgYmluX21pZCA9IGJpbl9tYXg7XG4gICAgd2hpbGUgKGJpbl9taW4gPCBiaW5fbWlkKSB7XG4gICAgICBpZiAobWF0Y2hfYml0YXBTY29yZV8oZCwgbG9jICsgYmluX21pZCkgPD0gc2NvcmVfdGhyZXNob2xkKSB7XG4gICAgICAgIGJpbl9taW4gPSBiaW5fbWlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmluX21heCA9IGJpbl9taWQ7XG4gICAgICB9XG4gICAgICBiaW5fbWlkID0gTWF0aC5mbG9vcigoYmluX21heCAtIGJpbl9taW4pIC8gMiArIGJpbl9taW4pO1xuICAgIH1cbiAgICAvLyBVc2UgdGhlIHJlc3VsdCBmcm9tIHRoaXMgaXRlcmF0aW9uIGFzIHRoZSBtYXhpbXVtIGZvciB0aGUgbmV4dC5cbiAgICBiaW5fbWF4ID0gYmluX21pZDtcbiAgICB2YXIgc3RhcnQgPSBNYXRoLm1heCgxLCBsb2MgLSBiaW5fbWlkICsgMSk7XG4gICAgdmFyIGZpbmlzaCA9IE1hdGgubWluKGxvYyArIGJpbl9taWQsIHRleHQubGVuZ3RoKSArIHBhdHRlcm4ubGVuZ3RoO1xuXG4gICAgdmFyIHJkID0gQXJyYXkoZmluaXNoICsgMik7XG4gICAgcmRbZmluaXNoICsgMV0gPSAoMSA8PCBkKSAtIDE7XG4gICAgZm9yICh2YXIgaiA9IGZpbmlzaDsgaiA+PSBzdGFydDsgai0tKSB7XG4gICAgICAvLyBUaGUgYWxwaGFiZXQgKHMpIGlzIGEgc3BhcnNlIGhhc2gsIHNvIHRoZSBmb2xsb3dpbmcgbGluZSBnZW5lcmF0ZXNcbiAgICAgIC8vIHdhcm5pbmdzLlxuICAgICAgdmFyIGNoYXJNYXRjaCA9IHNbdGV4dC5jaGFyQXQoaiAtIDEpXTtcbiAgICAgIGlmIChkID09PSAwKSB7ICAvLyBGaXJzdCBwYXNzOiBleGFjdCBtYXRjaC5cbiAgICAgICAgcmRbal0gPSAoKHJkW2ogKyAxXSA8PCAxKSB8IDEpICYgY2hhck1hdGNoO1xuICAgICAgfSBlbHNlIHsgIC8vIFN1YnNlcXVlbnQgcGFzc2VzOiBmdXp6eSBtYXRjaC5cbiAgICAgICAgcmRbal0gPSAoKChyZFtqICsgMV0gPDwgMSkgfCAxKSAmIGNoYXJNYXRjaCkgfFxuICAgICAgICAgICAgICAgICgoKGxhc3RfcmRbaiArIDFdIHwgbGFzdF9yZFtqXSkgPDwgMSkgfCAxKSB8XG4gICAgICAgICAgICAgICAgbGFzdF9yZFtqICsgMV07XG4gICAgICB9XG4gICAgICBpZiAocmRbal0gJiBtYXRjaG1hc2spIHtcbiAgICAgICAgdmFyIHNjb3JlID0gbWF0Y2hfYml0YXBTY29yZV8oZCwgaiAtIDEpO1xuICAgICAgICAvLyBUaGlzIG1hdGNoIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBiZXR0ZXIgdGhhbiBhbnkgZXhpc3RpbmcgbWF0Y2guXG4gICAgICAgIC8vIEJ1dCBjaGVjayBhbnl3YXkuXG4gICAgICAgIGlmIChzY29yZSA8PSBzY29yZV90aHJlc2hvbGQpIHtcbiAgICAgICAgICAvLyBUb2xkIHlvdSBzby5cbiAgICAgICAgICBzY29yZV90aHJlc2hvbGQgPSBzY29yZTtcbiAgICAgICAgICBiZXN0X2xvYyA9IGogLSAxO1xuICAgICAgICAgIGlmIChiZXN0X2xvYyA+IGxvYykge1xuICAgICAgICAgICAgLy8gV2hlbiBwYXNzaW5nIGxvYywgZG9uJ3QgZXhjZWVkIG91ciBjdXJyZW50IGRpc3RhbmNlIGZyb20gbG9jLlxuICAgICAgICAgICAgc3RhcnQgPSBNYXRoLm1heCgxLCAyICogbG9jIC0gYmVzdF9sb2MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IHBhc3NlZCBsb2MsIGRvd25oaWxsIGZyb20gaGVyZSBvbiBpbi5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBObyBob3BlIGZvciBhIChiZXR0ZXIpIG1hdGNoIGF0IGdyZWF0ZXIgZXJyb3IgbGV2ZWxzLlxuICAgIGlmIChtYXRjaF9iaXRhcFNjb3JlXyhkICsgMSwgbG9jKSA+IHNjb3JlX3RocmVzaG9sZCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxhc3RfcmQgPSByZDtcbiAgfVxuICByZXR1cm4gYmVzdF9sb2M7XG59O1xuXG5cbi8qKlxuICogSW5pdGlhbGlzZSB0aGUgYWxwaGFiZXQgZm9yIHRoZSBCaXRhcCBhbGdvcml0aG0uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiBUaGUgdGV4dCB0byBlbmNvZGUuXG4gKiBAcmV0dXJuIHshT2JqZWN0fSBIYXNoIG9mIGNoYXJhY3RlciBsb2NhdGlvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5tYXRjaF9hbHBoYWJldF8gPSBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gIHZhciBzID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGg7IGkrKykge1xuICAgIHNbcGF0dGVybi5jaGFyQXQoaSldID0gMDtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoOyBpKyspIHtcbiAgICBzW3BhdHRlcm4uY2hhckF0KGkpXSB8PSAxIDw8IChwYXR0ZXJuLmxlbmd0aCAtIGkgLSAxKTtcbiAgfVxuICByZXR1cm4gcztcbn07XG5cblxuLy8gIFBBVENIIEZVTkNUSU9OU1xuXG5cbi8qKlxuICogSW5jcmVhc2UgdGhlIGNvbnRleHQgdW50aWwgaXQgaXMgdW5pcXVlLFxuICogYnV0IGRvbid0IGxldCB0aGUgcGF0dGVybiBleHBhbmQgYmV5b25kIE1hdGNoX01heEJpdHMuXG4gKiBAcGFyYW0geyFkaWZmX21hdGNoX3BhdGNoLnBhdGNoX29ian0gcGF0Y2ggVGhlIHBhdGNoIHRvIGdyb3cuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBTb3VyY2UgdGV4dC5cbiAqIEBwcml2YXRlXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLnBhdGNoX2FkZENvbnRleHRfID0gZnVuY3Rpb24ocGF0Y2gsIHRleHQpIHtcbiAgaWYgKHRleHQubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHBhdGNoLnN0YXJ0MiA9PT0gbnVsbCkge1xuICAgIHRocm93IEVycm9yKCdwYXRjaCBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgfVxuICB2YXIgcGF0dGVybiA9IHRleHQuc3Vic3RyaW5nKHBhdGNoLnN0YXJ0MiwgcGF0Y2guc3RhcnQyICsgcGF0Y2gubGVuZ3RoMSk7XG4gIHZhciBwYWRkaW5nID0gMDtcblxuICAvLyBMb29rIGZvciB0aGUgZmlyc3QgYW5kIGxhc3QgbWF0Y2hlcyBvZiBwYXR0ZXJuIGluIHRleHQuICBJZiB0d28gZGlmZmVyZW50XG4gIC8vIG1hdGNoZXMgYXJlIGZvdW5kLCBpbmNyZWFzZSB0aGUgcGF0dGVybiBsZW5ndGguXG4gIHdoaWxlICh0ZXh0LmluZGV4T2YocGF0dGVybikgIT0gdGV4dC5sYXN0SW5kZXhPZihwYXR0ZXJuKSAmJlxuICAgICAgICAgcGF0dGVybi5sZW5ndGggPCB0aGlzLk1hdGNoX01heEJpdHMgLSB0aGlzLlBhdGNoX01hcmdpbiAtXG4gICAgICAgICB0aGlzLlBhdGNoX01hcmdpbikge1xuICAgIHBhZGRpbmcgKz0gdGhpcy5QYXRjaF9NYXJnaW47XG4gICAgcGF0dGVybiA9IHRleHQuc3Vic3RyaW5nKHBhdGNoLnN0YXJ0MiAtIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLnN0YXJ0MiArIHBhdGNoLmxlbmd0aDEgKyBwYWRkaW5nKTtcbiAgfVxuICAvLyBBZGQgb25lIGNodW5rIGZvciBnb29kIGx1Y2suXG4gIHBhZGRpbmcgKz0gdGhpcy5QYXRjaF9NYXJnaW47XG5cbiAgLy8gQWRkIHRoZSBwcmVmaXguXG4gIHZhciBwcmVmaXggPSB0ZXh0LnN1YnN0cmluZyhwYXRjaC5zdGFydDIgLSBwYWRkaW5nLCBwYXRjaC5zdGFydDIpO1xuICBpZiAocHJlZml4KSB7XG4gICAgcGF0Y2guZGlmZnMudW5zaGlmdChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsIHByZWZpeCkpO1xuICB9XG4gIC8vIEFkZCB0aGUgc3VmZml4LlxuICB2YXIgc3VmZml4ID0gdGV4dC5zdWJzdHJpbmcocGF0Y2guc3RhcnQyICsgcGF0Y2gubGVuZ3RoMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLnN0YXJ0MiArIHBhdGNoLmxlbmd0aDEgKyBwYWRkaW5nKTtcbiAgaWYgKHN1ZmZpeCkge1xuICAgIHBhdGNoLmRpZmZzLnB1c2gobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLCBzdWZmaXgpKTtcbiAgfVxuXG4gIC8vIFJvbGwgYmFjayB0aGUgc3RhcnQgcG9pbnRzLlxuICBwYXRjaC5zdGFydDEgLT0gcHJlZml4Lmxlbmd0aDtcbiAgcGF0Y2guc3RhcnQyIC09IHByZWZpeC5sZW5ndGg7XG4gIC8vIEV4dGVuZCB0aGUgbGVuZ3Rocy5cbiAgcGF0Y2gubGVuZ3RoMSArPSBwcmVmaXgubGVuZ3RoICsgc3VmZml4Lmxlbmd0aDtcbiAgcGF0Y2gubGVuZ3RoMiArPSBwcmVmaXgubGVuZ3RoICsgc3VmZml4Lmxlbmd0aDtcbn07XG5cblxuLyoqXG4gKiBDb21wdXRlIGEgbGlzdCBvZiBwYXRjaGVzIHRvIHR1cm4gdGV4dDEgaW50byB0ZXh0Mi5cbiAqIFVzZSBkaWZmcyBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGNvbXB1dGUgaXQgb3Vyc2VsdmVzLlxuICogVGhlcmUgYXJlIGZvdXIgd2F5cyB0byBjYWxsIHRoaXMgZnVuY3Rpb24sIGRlcGVuZGluZyBvbiB3aGF0IGRhdGEgaXNcbiAqIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyOlxuICogTWV0aG9kIDE6XG4gKiBhID0gdGV4dDEsIGIgPSB0ZXh0MlxuICogTWV0aG9kIDI6XG4gKiBhID0gZGlmZnNcbiAqIE1ldGhvZCAzIChvcHRpbWFsKTpcbiAqIGEgPSB0ZXh0MSwgYiA9IGRpZmZzXG4gKiBNZXRob2QgNCAoZGVwcmVjYXRlZCwgdXNlIG1ldGhvZCAzKTpcbiAqIGEgPSB0ZXh0MSwgYiA9IHRleHQyLCBjID0gZGlmZnNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3whQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSBhIHRleHQxIChtZXRob2RzIDEsMyw0KSBvclxuICogQXJyYXkgb2YgZGlmZiB0dXBsZXMgZm9yIHRleHQxIHRvIHRleHQyIChtZXRob2QgMikuXG4gKiBAcGFyYW0ge3N0cmluZ3whQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+PX0gb3B0X2IgdGV4dDIgKG1ldGhvZHMgMSw0KSBvclxuICogQXJyYXkgb2YgZGlmZiB0dXBsZXMgZm9yIHRleHQxIHRvIHRleHQyIChtZXRob2QgMykgb3IgdW5kZWZpbmVkIChtZXRob2QgMikuXG4gKiBAcGFyYW0ge3N0cmluZ3whQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+PX0gb3B0X2MgQXJyYXkgb2YgZGlmZiB0dXBsZXNcbiAqIGZvciB0ZXh0MSB0byB0ZXh0MiAobWV0aG9kIDQpIG9yIHVuZGVmaW5lZCAobWV0aG9kcyAxLDIsMykuXG4gKiBAcmV0dXJuIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLnBhdGNoX29iaj59IEFycmF5IG9mIFBhdGNoIG9iamVjdHMuXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucHJvdG90eXBlLnBhdGNoX21ha2UgPSBmdW5jdGlvbihhLCBvcHRfYiwgb3B0X2MpIHtcbiAgdmFyIHRleHQxLCBkaWZmcztcbiAgaWYgKHR5cGVvZiBhID09ICdzdHJpbmcnICYmIHR5cGVvZiBvcHRfYiA9PSAnc3RyaW5nJyAmJlxuICAgICAgdHlwZW9mIG9wdF9jID09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTWV0aG9kIDE6IHRleHQxLCB0ZXh0MlxuICAgIC8vIENvbXB1dGUgZGlmZnMgZnJvbSB0ZXh0MSBhbmQgdGV4dDIuXG4gICAgdGV4dDEgPSAvKiogQHR5cGUge3N0cmluZ30gKi8oYSk7XG4gICAgZGlmZnMgPSB0aGlzLmRpZmZfbWFpbih0ZXh0MSwgLyoqIEB0eXBlIHtzdHJpbmd9ICovKG9wdF9iKSwgdHJ1ZSk7XG4gICAgaWYgKGRpZmZzLmxlbmd0aCA+IDIpIHtcbiAgICAgIHRoaXMuZGlmZl9jbGVhbnVwU2VtYW50aWMoZGlmZnMpO1xuICAgICAgdGhpcy5kaWZmX2NsZWFudXBFZmZpY2llbmN5KGRpZmZzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYSAmJiB0eXBlb2YgYSA9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb3B0X2IgPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBvcHRfYyA9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIE1ldGhvZCAyOiBkaWZmc1xuICAgIC8vIENvbXB1dGUgdGV4dDEgZnJvbSBkaWZmcy5cbiAgICBkaWZmcyA9IC8qKiBAdHlwZSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5EaWZmPn0gKi8oYSk7XG4gICAgdGV4dDEgPSB0aGlzLmRpZmZfdGV4dDEoZGlmZnMpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBhID09ICdzdHJpbmcnICYmIG9wdF9iICYmIHR5cGVvZiBvcHRfYiA9PSAnb2JqZWN0JyAmJlxuICAgICAgdHlwZW9mIG9wdF9jID09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTWV0aG9kIDM6IHRleHQxLCBkaWZmc1xuICAgIHRleHQxID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovKGEpO1xuICAgIGRpZmZzID0gLyoqIEB0eXBlIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSAqLyhvcHRfYik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGEgPT0gJ3N0cmluZycgJiYgdHlwZW9mIG9wdF9iID09ICdzdHJpbmcnICYmXG4gICAgICBvcHRfYyAmJiB0eXBlb2Ygb3B0X2MgPT0gJ29iamVjdCcpIHtcbiAgICAvLyBNZXRob2QgNDogdGV4dDEsIHRleHQyLCBkaWZmc1xuICAgIC8vIHRleHQyIGlzIG5vdCB1c2VkLlxuICAgIHRleHQxID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovKGEpO1xuICAgIGRpZmZzID0gLyoqIEB0eXBlIHshQXJyYXkuPCFkaWZmX21hdGNoX3BhdGNoLkRpZmY+fSAqLyhvcHRfYyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGNhbGwgZm9ybWF0IHRvIHBhdGNoX21ha2UuJyk7XG4gIH1cblxuICBpZiAoZGlmZnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdOyAgLy8gR2V0IHJpZCBvZiB0aGUgbnVsbCBjYXNlLlxuICB9XG4gIHZhciBwYXRjaGVzID0gW107XG4gIHZhciBwYXRjaCA9IG5ldyBkaWZmX21hdGNoX3BhdGNoLnBhdGNoX29iaigpO1xuICB2YXIgcGF0Y2hEaWZmTGVuZ3RoID0gMDsgIC8vIEtlZXBpbmcgb3VyIG93biBsZW5ndGggdmFyIGlzIGZhc3RlciBpbiBKUy5cbiAgdmFyIGNoYXJfY291bnQxID0gMDsgIC8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIGludG8gdGhlIHRleHQxIHN0cmluZy5cbiAgdmFyIGNoYXJfY291bnQyID0gMDsgIC8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIGludG8gdGhlIHRleHQyIHN0cmluZy5cbiAgLy8gU3RhcnQgd2l0aCB0ZXh0MSAocHJlcGF0Y2hfdGV4dCkgYW5kIGFwcGx5IHRoZSBkaWZmcyB1bnRpbCB3ZSBhcnJpdmUgYXRcbiAgLy8gdGV4dDIgKHBvc3RwYXRjaF90ZXh0KS4gIFdlIHJlY3JlYXRlIHRoZSBwYXRjaGVzIG9uZSBieSBvbmUgdG8gZGV0ZXJtaW5lXG4gIC8vIGNvbnRleHQgaW5mby5cbiAgdmFyIHByZXBhdGNoX3RleHQgPSB0ZXh0MTtcbiAgdmFyIHBvc3RwYXRjaF90ZXh0ID0gdGV4dDE7XG4gIGZvciAodmFyIHggPSAwOyB4IDwgZGlmZnMubGVuZ3RoOyB4KyspIHtcbiAgICB2YXIgZGlmZl90eXBlID0gZGlmZnNbeF1bMF07XG4gICAgdmFyIGRpZmZfdGV4dCA9IGRpZmZzW3hdWzFdO1xuXG4gICAgaWYgKCFwYXRjaERpZmZMZW5ndGggJiYgZGlmZl90eXBlICE9PSBESUZGX0VRVUFMKSB7XG4gICAgICAvLyBBIG5ldyBwYXRjaCBzdGFydHMgaGVyZS5cbiAgICAgIHBhdGNoLnN0YXJ0MSA9IGNoYXJfY291bnQxO1xuICAgICAgcGF0Y2guc3RhcnQyID0gY2hhcl9jb3VudDI7XG4gICAgfVxuXG4gICAgc3dpdGNoIChkaWZmX3R5cGUpIHtcbiAgICAgIGNhc2UgRElGRl9JTlNFUlQ6XG4gICAgICAgIHBhdGNoLmRpZmZzW3BhdGNoRGlmZkxlbmd0aCsrXSA9IGRpZmZzW3hdO1xuICAgICAgICBwYXRjaC5sZW5ndGgyICs9IGRpZmZfdGV4dC5sZW5ndGg7XG4gICAgICAgIHBvc3RwYXRjaF90ZXh0ID0gcG9zdHBhdGNoX3RleHQuc3Vic3RyaW5nKDAsIGNoYXJfY291bnQyKSArIGRpZmZfdGV4dCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHBhdGNoX3RleHQuc3Vic3RyaW5nKGNoYXJfY291bnQyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJRkZfREVMRVRFOlxuICAgICAgICBwYXRjaC5sZW5ndGgxICs9IGRpZmZfdGV4dC5sZW5ndGg7XG4gICAgICAgIHBhdGNoLmRpZmZzW3BhdGNoRGlmZkxlbmd0aCsrXSA9IGRpZmZzW3hdO1xuICAgICAgICBwb3N0cGF0Y2hfdGV4dCA9IHBvc3RwYXRjaF90ZXh0LnN1YnN0cmluZygwLCBjaGFyX2NvdW50MikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RwYXRjaF90ZXh0LnN1YnN0cmluZyhjaGFyX2NvdW50MiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZfdGV4dC5sZW5ndGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElGRl9FUVVBTDpcbiAgICAgICAgaWYgKGRpZmZfdGV4dC5sZW5ndGggPD0gMiAqIHRoaXMuUGF0Y2hfTWFyZ2luICYmXG4gICAgICAgICAgICBwYXRjaERpZmZMZW5ndGggJiYgZGlmZnMubGVuZ3RoICE9IHggKyAxKSB7XG4gICAgICAgICAgLy8gU21hbGwgZXF1YWxpdHkgaW5zaWRlIGEgcGF0Y2guXG4gICAgICAgICAgcGF0Y2guZGlmZnNbcGF0Y2hEaWZmTGVuZ3RoKytdID0gZGlmZnNbeF07XG4gICAgICAgICAgcGF0Y2gubGVuZ3RoMSArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgICAgICAgIHBhdGNoLmxlbmd0aDIgKz0gZGlmZl90ZXh0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChkaWZmX3RleHQubGVuZ3RoID49IDIgKiB0aGlzLlBhdGNoX01hcmdpbikge1xuICAgICAgICAgIC8vIFRpbWUgZm9yIGEgbmV3IHBhdGNoLlxuICAgICAgICAgIGlmIChwYXRjaERpZmZMZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucGF0Y2hfYWRkQ29udGV4dF8ocGF0Y2gsIHByZXBhdGNoX3RleHQpO1xuICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHBhdGNoKTtcbiAgICAgICAgICAgIHBhdGNoID0gbmV3IGRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqKCk7XG4gICAgICAgICAgICBwYXRjaERpZmZMZW5ndGggPSAwO1xuICAgICAgICAgICAgLy8gVW5saWtlIFVuaWRpZmYsIG91ciBwYXRjaCBsaXN0cyBoYXZlIGEgcm9sbGluZyBjb250ZXh0LlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9kaWZmLW1hdGNoLXBhdGNoL3dpa2kvVW5pZGlmZlxuICAgICAgICAgICAgLy8gVXBkYXRlIHByZXBhdGNoIHRleHQgJiBwb3MgdG8gcmVmbGVjdCB0aGUgYXBwbGljYXRpb24gb2YgdGhlXG4gICAgICAgICAgICAvLyBqdXN0IGNvbXBsZXRlZCBwYXRjaC5cbiAgICAgICAgICAgIHByZXBhdGNoX3RleHQgPSBwb3N0cGF0Y2hfdGV4dDtcbiAgICAgICAgICAgIGNoYXJfY291bnQxID0gY2hhcl9jb3VudDI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBjaGFyYWN0ZXIgY291bnQuXG4gICAgaWYgKGRpZmZfdHlwZSAhPT0gRElGRl9JTlNFUlQpIHtcbiAgICAgIGNoYXJfY291bnQxICs9IGRpZmZfdGV4dC5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChkaWZmX3R5cGUgIT09IERJRkZfREVMRVRFKSB7XG4gICAgICBjaGFyX2NvdW50MiArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgIH1cbiAgfVxuICAvLyBQaWNrIHVwIHRoZSBsZWZ0b3ZlciBwYXRjaCBpZiBub3QgZW1wdHkuXG4gIGlmIChwYXRjaERpZmZMZW5ndGgpIHtcbiAgICB0aGlzLnBhdGNoX2FkZENvbnRleHRfKHBhdGNoLCBwcmVwYXRjaF90ZXh0KTtcbiAgICBwYXRjaGVzLnB1c2gocGF0Y2gpO1xuICB9XG5cbiAgcmV0dXJuIHBhdGNoZXM7XG59O1xuXG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgcGF0Y2hlcywgcmV0dXJuIGFub3RoZXIgYXJyYXkgdGhhdCBpcyBpZGVudGljYWwuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqPn0gcGF0Y2hlcyBBcnJheSBvZiBQYXRjaCBvYmplY3RzLlxuICogQHJldHVybiB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5wYXRjaF9vYmo+fSBBcnJheSBvZiBQYXRjaCBvYmplY3RzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5wYXRjaF9kZWVwQ29weSA9IGZ1bmN0aW9uKHBhdGNoZXMpIHtcbiAgLy8gTWFraW5nIGRlZXAgY29waWVzIGlzIGhhcmQgaW4gSmF2YVNjcmlwdC5cbiAgdmFyIHBhdGNoZXNDb3B5ID0gW107XG4gIGZvciAodmFyIHggPSAwOyB4IDwgcGF0Y2hlcy5sZW5ndGg7IHgrKykge1xuICAgIHZhciBwYXRjaCA9IHBhdGNoZXNbeF07XG4gICAgdmFyIHBhdGNoQ29weSA9IG5ldyBkaWZmX21hdGNoX3BhdGNoLnBhdGNoX29iaigpO1xuICAgIHBhdGNoQ29weS5kaWZmcyA9IFtdO1xuICAgIGZvciAodmFyIHkgPSAwOyB5IDwgcGF0Y2guZGlmZnMubGVuZ3RoOyB5KyspIHtcbiAgICAgIHBhdGNoQ29weS5kaWZmc1t5XSA9XG4gICAgICAgICAgbmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihwYXRjaC5kaWZmc1t5XVswXSwgcGF0Y2guZGlmZnNbeV1bMV0pO1xuICAgIH1cbiAgICBwYXRjaENvcHkuc3RhcnQxID0gcGF0Y2guc3RhcnQxO1xuICAgIHBhdGNoQ29weS5zdGFydDIgPSBwYXRjaC5zdGFydDI7XG4gICAgcGF0Y2hDb3B5Lmxlbmd0aDEgPSBwYXRjaC5sZW5ndGgxO1xuICAgIHBhdGNoQ29weS5sZW5ndGgyID0gcGF0Y2gubGVuZ3RoMjtcbiAgICBwYXRjaGVzQ29weVt4XSA9IHBhdGNoQ29weTtcbiAgfVxuICByZXR1cm4gcGF0Y2hlc0NvcHk7XG59O1xuXG5cbi8qKlxuICogTWVyZ2UgYSBzZXQgb2YgcGF0Y2hlcyBvbnRvIHRoZSB0ZXh0LiAgUmV0dXJuIGEgcGF0Y2hlZCB0ZXh0LCBhcyB3ZWxsXG4gKiBhcyBhIGxpc3Qgb2YgdHJ1ZS9mYWxzZSB2YWx1ZXMgaW5kaWNhdGluZyB3aGljaCBwYXRjaGVzIHdlcmUgYXBwbGllZC5cbiAqIEBwYXJhbSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5wYXRjaF9vYmo+fSBwYXRjaGVzIEFycmF5IG9mIFBhdGNoIG9iamVjdHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBPbGQgdGV4dC5cbiAqIEByZXR1cm4geyFBcnJheS48c3RyaW5nfCFBcnJheS48Ym9vbGVhbj4+fSBUd28gZWxlbWVudCBBcnJheSwgY29udGFpbmluZyB0aGVcbiAqICAgICAgbmV3IHRleHQgYW5kIGFuIGFycmF5IG9mIGJvb2xlYW4gdmFsdWVzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5wYXRjaF9hcHBseSA9IGZ1bmN0aW9uKHBhdGNoZXMsIHRleHQpIHtcbiAgaWYgKHBhdGNoZXMubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm4gW3RleHQsIFtdXTtcbiAgfVxuXG4gIC8vIERlZXAgY29weSB0aGUgcGF0Y2hlcyBzbyB0aGF0IG5vIGNoYW5nZXMgYXJlIG1hZGUgdG8gb3JpZ2luYWxzLlxuICBwYXRjaGVzID0gdGhpcy5wYXRjaF9kZWVwQ29weShwYXRjaGVzKTtcblxuICB2YXIgbnVsbFBhZGRpbmcgPSB0aGlzLnBhdGNoX2FkZFBhZGRpbmcocGF0Y2hlcyk7XG4gIHRleHQgPSBudWxsUGFkZGluZyArIHRleHQgKyBudWxsUGFkZGluZztcblxuICB0aGlzLnBhdGNoX3NwbGl0TWF4KHBhdGNoZXMpO1xuICAvLyBkZWx0YSBrZWVwcyB0cmFjayBvZiB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGV4cGVjdGVkIGFuZCBhY3R1YWwgbG9jYXRpb25cbiAgLy8gb2YgdGhlIHByZXZpb3VzIHBhdGNoLiAgSWYgdGhlcmUgYXJlIHBhdGNoZXMgZXhwZWN0ZWQgYXQgcG9zaXRpb25zIDEwIGFuZFxuICAvLyAyMCwgYnV0IHRoZSBmaXJzdCBwYXRjaCB3YXMgZm91bmQgYXQgMTIsIGRlbHRhIGlzIDIgYW5kIHRoZSBzZWNvbmQgcGF0Y2hcbiAgLy8gaGFzIGFuIGVmZmVjdGl2ZSBleHBlY3RlZCBwb3NpdGlvbiBvZiAyMi5cbiAgdmFyIGRlbHRhID0gMDtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgZm9yICh2YXIgeCA9IDA7IHggPCBwYXRjaGVzLmxlbmd0aDsgeCsrKSB7XG4gICAgdmFyIGV4cGVjdGVkX2xvYyA9IHBhdGNoZXNbeF0uc3RhcnQyICsgZGVsdGE7XG4gICAgdmFyIHRleHQxID0gdGhpcy5kaWZmX3RleHQxKHBhdGNoZXNbeF0uZGlmZnMpO1xuICAgIHZhciBzdGFydF9sb2M7XG4gICAgdmFyIGVuZF9sb2MgPSAtMTtcbiAgICBpZiAodGV4dDEubGVuZ3RoID4gdGhpcy5NYXRjaF9NYXhCaXRzKSB7XG4gICAgICAvLyBwYXRjaF9zcGxpdE1heCB3aWxsIG9ubHkgcHJvdmlkZSBhbiBvdmVyc2l6ZWQgcGF0dGVybiBpbiB0aGUgY2FzZSBvZlxuICAgICAgLy8gYSBtb25zdGVyIGRlbGV0ZS5cbiAgICAgIHN0YXJ0X2xvYyA9IHRoaXMubWF0Y2hfbWFpbih0ZXh0LCB0ZXh0MS5zdWJzdHJpbmcoMCwgdGhpcy5NYXRjaF9NYXhCaXRzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9sb2MpO1xuICAgICAgaWYgKHN0YXJ0X2xvYyAhPSAtMSkge1xuICAgICAgICBlbmRfbG9jID0gdGhpcy5tYXRjaF9tYWluKHRleHQsXG4gICAgICAgICAgICB0ZXh0MS5zdWJzdHJpbmcodGV4dDEubGVuZ3RoIC0gdGhpcy5NYXRjaF9NYXhCaXRzKSxcbiAgICAgICAgICAgIGV4cGVjdGVkX2xvYyArIHRleHQxLmxlbmd0aCAtIHRoaXMuTWF0Y2hfTWF4Qml0cyk7XG4gICAgICAgIGlmIChlbmRfbG9jID09IC0xIHx8IHN0YXJ0X2xvYyA+PSBlbmRfbG9jKSB7XG4gICAgICAgICAgLy8gQ2FuJ3QgZmluZCB2YWxpZCB0cmFpbGluZyBjb250ZXh0LiAgRHJvcCB0aGlzIHBhdGNoLlxuICAgICAgICAgIHN0YXJ0X2xvYyA9IC0xO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0X2xvYyA9IHRoaXMubWF0Y2hfbWFpbih0ZXh0LCB0ZXh0MSwgZXhwZWN0ZWRfbG9jKTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0X2xvYyA9PSAtMSkge1xuICAgICAgLy8gTm8gbWF0Y2ggZm91bmQuICA6KFxuICAgICAgcmVzdWx0c1t4XSA9IGZhbHNlO1xuICAgICAgLy8gU3VidHJhY3QgdGhlIGRlbHRhIGZvciB0aGlzIGZhaWxlZCBwYXRjaCBmcm9tIHN1YnNlcXVlbnQgcGF0Y2hlcy5cbiAgICAgIGRlbHRhIC09IHBhdGNoZXNbeF0ubGVuZ3RoMiAtIHBhdGNoZXNbeF0ubGVuZ3RoMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm91bmQgYSBtYXRjaC4gIDopXG4gICAgICByZXN1bHRzW3hdID0gdHJ1ZTtcbiAgICAgIGRlbHRhID0gc3RhcnRfbG9jIC0gZXhwZWN0ZWRfbG9jO1xuICAgICAgdmFyIHRleHQyO1xuICAgICAgaWYgKGVuZF9sb2MgPT0gLTEpIHtcbiAgICAgICAgdGV4dDIgPSB0ZXh0LnN1YnN0cmluZyhzdGFydF9sb2MsIHN0YXJ0X2xvYyArIHRleHQxLmxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0MiA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0X2xvYywgZW5kX2xvYyArIHRoaXMuTWF0Y2hfTWF4Qml0cyk7XG4gICAgICB9XG4gICAgICBpZiAodGV4dDEgPT0gdGV4dDIpIHtcbiAgICAgICAgLy8gUGVyZmVjdCBtYXRjaCwganVzdCBzaG92ZSB0aGUgcmVwbGFjZW1lbnQgdGV4dCBpbi5cbiAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0X2xvYykgK1xuICAgICAgICAgICAgICAgdGhpcy5kaWZmX3RleHQyKHBhdGNoZXNbeF0uZGlmZnMpICtcbiAgICAgICAgICAgICAgIHRleHQuc3Vic3RyaW5nKHN0YXJ0X2xvYyArIHRleHQxLmxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbXBlcmZlY3QgbWF0Y2guICBSdW4gYSBkaWZmIHRvIGdldCBhIGZyYW1ld29yayBvZiBlcXVpdmFsZW50XG4gICAgICAgIC8vIGluZGljZXMuXG4gICAgICAgIHZhciBkaWZmcyA9IHRoaXMuZGlmZl9tYWluKHRleHQxLCB0ZXh0MiwgZmFsc2UpO1xuICAgICAgICBpZiAodGV4dDEubGVuZ3RoID4gdGhpcy5NYXRjaF9NYXhCaXRzICYmXG4gICAgICAgICAgICB0aGlzLmRpZmZfbGV2ZW5zaHRlaW4oZGlmZnMpIC8gdGV4dDEubGVuZ3RoID5cbiAgICAgICAgICAgIHRoaXMuUGF0Y2hfRGVsZXRlVGhyZXNob2xkKSB7XG4gICAgICAgICAgLy8gVGhlIGVuZCBwb2ludHMgbWF0Y2gsIGJ1dCB0aGUgY29udGVudCBpcyB1bmFjY2VwdGFibHkgYmFkLlxuICAgICAgICAgIHJlc3VsdHNbeF0gPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRpZmZfY2xlYW51cFNlbWFudGljTG9zc2xlc3MoZGlmZnMpO1xuICAgICAgICAgIHZhciBpbmRleDEgPSAwO1xuICAgICAgICAgIHZhciBpbmRleDI7XG4gICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBwYXRjaGVzW3hdLmRpZmZzLmxlbmd0aDsgeSsrKSB7XG4gICAgICAgICAgICB2YXIgbW9kID0gcGF0Y2hlc1t4XS5kaWZmc1t5XTtcbiAgICAgICAgICAgIGlmIChtb2RbMF0gIT09IERJRkZfRVFVQUwpIHtcbiAgICAgICAgICAgICAgaW5kZXgyID0gdGhpcy5kaWZmX3hJbmRleChkaWZmcywgaW5kZXgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb2RbMF0gPT09IERJRkZfSU5TRVJUKSB7ICAvLyBJbnNlcnRpb25cbiAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0X2xvYyArIGluZGV4MikgKyBtb2RbMV0gK1xuICAgICAgICAgICAgICAgICAgICAgdGV4dC5zdWJzdHJpbmcoc3RhcnRfbG9jICsgaW5kZXgyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kWzBdID09PSBESUZGX0RFTEVURSkgeyAgLy8gRGVsZXRpb25cbiAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0X2xvYyArIGluZGV4MikgK1xuICAgICAgICAgICAgICAgICAgICAgdGV4dC5zdWJzdHJpbmcoc3RhcnRfbG9jICsgdGhpcy5kaWZmX3hJbmRleChkaWZmcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDEgKyBtb2RbMV0ubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9kWzBdICE9PSBESUZGX0RFTEVURSkge1xuICAgICAgICAgICAgICBpbmRleDEgKz0gbW9kWzFdLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gU3RyaXAgdGhlIHBhZGRpbmcgb2ZmLlxuICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcobnVsbFBhZGRpbmcubGVuZ3RoLCB0ZXh0Lmxlbmd0aCAtIG51bGxQYWRkaW5nLmxlbmd0aCk7XG4gIHJldHVybiBbdGV4dCwgcmVzdWx0c107XG59O1xuXG5cbi8qKlxuICogQWRkIHNvbWUgcGFkZGluZyBvbiB0ZXh0IHN0YXJ0IGFuZCBlbmQgc28gdGhhdCBlZGdlcyBjYW4gbWF0Y2ggc29tZXRoaW5nLlxuICogSW50ZW5kZWQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gcGF0Y2hfYXBwbHkuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqPn0gcGF0Y2hlcyBBcnJheSBvZiBQYXRjaCBvYmplY3RzLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgcGFkZGluZyBzdHJpbmcgYWRkZWQgdG8gZWFjaCBzaWRlLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5wYXRjaF9hZGRQYWRkaW5nID0gZnVuY3Rpb24ocGF0Y2hlcykge1xuICB2YXIgcGFkZGluZ0xlbmd0aCA9IHRoaXMuUGF0Y2hfTWFyZ2luO1xuICB2YXIgbnVsbFBhZGRpbmcgPSAnJztcbiAgZm9yICh2YXIgeCA9IDE7IHggPD0gcGFkZGluZ0xlbmd0aDsgeCsrKSB7XG4gICAgbnVsbFBhZGRpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh4KTtcbiAgfVxuXG4gIC8vIEJ1bXAgYWxsIHRoZSBwYXRjaGVzIGZvcndhcmQuXG4gIGZvciAodmFyIHggPSAwOyB4IDwgcGF0Y2hlcy5sZW5ndGg7IHgrKykge1xuICAgIHBhdGNoZXNbeF0uc3RhcnQxICs9IHBhZGRpbmdMZW5ndGg7XG4gICAgcGF0Y2hlc1t4XS5zdGFydDIgKz0gcGFkZGluZ0xlbmd0aDtcbiAgfVxuXG4gIC8vIEFkZCBzb21lIHBhZGRpbmcgb24gc3RhcnQgb2YgZmlyc3QgZGlmZi5cbiAgdmFyIHBhdGNoID0gcGF0Y2hlc1swXTtcbiAgdmFyIGRpZmZzID0gcGF0Y2guZGlmZnM7XG4gIGlmIChkaWZmcy5sZW5ndGggPT0gMCB8fCBkaWZmc1swXVswXSAhPSBESUZGX0VRVUFMKSB7XG4gICAgLy8gQWRkIG51bGxQYWRkaW5nIGVxdWFsaXR5LlxuICAgIGRpZmZzLnVuc2hpZnQobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLCBudWxsUGFkZGluZykpO1xuICAgIHBhdGNoLnN0YXJ0MSAtPSBwYWRkaW5nTGVuZ3RoOyAgLy8gU2hvdWxkIGJlIDAuXG4gICAgcGF0Y2guc3RhcnQyIC09IHBhZGRpbmdMZW5ndGg7ICAvLyBTaG91bGQgYmUgMC5cbiAgICBwYXRjaC5sZW5ndGgxICs9IHBhZGRpbmdMZW5ndGg7XG4gICAgcGF0Y2gubGVuZ3RoMiArPSBwYWRkaW5nTGVuZ3RoO1xuICB9IGVsc2UgaWYgKHBhZGRpbmdMZW5ndGggPiBkaWZmc1swXVsxXS5sZW5ndGgpIHtcbiAgICAvLyBHcm93IGZpcnN0IGVxdWFsaXR5LlxuICAgIHZhciBleHRyYUxlbmd0aCA9IHBhZGRpbmdMZW5ndGggLSBkaWZmc1swXVsxXS5sZW5ndGg7XG4gICAgZGlmZnNbMF1bMV0gPSBudWxsUGFkZGluZy5zdWJzdHJpbmcoZGlmZnNbMF1bMV0ubGVuZ3RoKSArIGRpZmZzWzBdWzFdO1xuICAgIHBhdGNoLnN0YXJ0MSAtPSBleHRyYUxlbmd0aDtcbiAgICBwYXRjaC5zdGFydDIgLT0gZXh0cmFMZW5ndGg7XG4gICAgcGF0Y2gubGVuZ3RoMSArPSBleHRyYUxlbmd0aDtcbiAgICBwYXRjaC5sZW5ndGgyICs9IGV4dHJhTGVuZ3RoO1xuICB9XG5cbiAgLy8gQWRkIHNvbWUgcGFkZGluZyBvbiBlbmQgb2YgbGFzdCBkaWZmLlxuICBwYXRjaCA9IHBhdGNoZXNbcGF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgZGlmZnMgPSBwYXRjaC5kaWZmcztcbiAgaWYgKGRpZmZzLmxlbmd0aCA9PSAwIHx8IGRpZmZzW2RpZmZzLmxlbmd0aCAtIDFdWzBdICE9IERJRkZfRVFVQUwpIHtcbiAgICAvLyBBZGQgbnVsbFBhZGRpbmcgZXF1YWxpdHkuXG4gICAgZGlmZnMucHVzaChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsIG51bGxQYWRkaW5nKSk7XG4gICAgcGF0Y2gubGVuZ3RoMSArPSBwYWRkaW5nTGVuZ3RoO1xuICAgIHBhdGNoLmxlbmd0aDIgKz0gcGFkZGluZ0xlbmd0aDtcbiAgfSBlbHNlIGlmIChwYWRkaW5nTGVuZ3RoID4gZGlmZnNbZGlmZnMubGVuZ3RoIC0gMV1bMV0ubGVuZ3RoKSB7XG4gICAgLy8gR3JvdyBsYXN0IGVxdWFsaXR5LlxuICAgIHZhciBleHRyYUxlbmd0aCA9IHBhZGRpbmdMZW5ndGggLSBkaWZmc1tkaWZmcy5sZW5ndGggLSAxXVsxXS5sZW5ndGg7XG4gICAgZGlmZnNbZGlmZnMubGVuZ3RoIC0gMV1bMV0gKz0gbnVsbFBhZGRpbmcuc3Vic3RyaW5nKDAsIGV4dHJhTGVuZ3RoKTtcbiAgICBwYXRjaC5sZW5ndGgxICs9IGV4dHJhTGVuZ3RoO1xuICAgIHBhdGNoLmxlbmd0aDIgKz0gZXh0cmFMZW5ndGg7XG4gIH1cblxuICByZXR1cm4gbnVsbFBhZGRpbmc7XG59O1xuXG5cbi8qKlxuICogTG9vayB0aHJvdWdoIHRoZSBwYXRjaGVzIGFuZCBicmVhayB1cCBhbnkgd2hpY2ggYXJlIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtXG4gKiBsaW1pdCBvZiB0aGUgbWF0Y2ggYWxnb3JpdGhtLlxuICogSW50ZW5kZWQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gcGF0Y2hfYXBwbHkuXG4gKiBAcGFyYW0geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqPn0gcGF0Y2hlcyBBcnJheSBvZiBQYXRjaCBvYmplY3RzLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnByb3RvdHlwZS5wYXRjaF9zcGxpdE1heCA9IGZ1bmN0aW9uKHBhdGNoZXMpIHtcbiAgdmFyIHBhdGNoX3NpemUgPSB0aGlzLk1hdGNoX01heEJpdHM7XG4gIGZvciAodmFyIHggPSAwOyB4IDwgcGF0Y2hlcy5sZW5ndGg7IHgrKykge1xuICAgIGlmIChwYXRjaGVzW3hdLmxlbmd0aDEgPD0gcGF0Y2hfc2l6ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBiaWdwYXRjaCA9IHBhdGNoZXNbeF07XG4gICAgLy8gUmVtb3ZlIHRoZSBiaWcgb2xkIHBhdGNoLlxuICAgIHBhdGNoZXMuc3BsaWNlKHgtLSwgMSk7XG4gICAgdmFyIHN0YXJ0MSA9IGJpZ3BhdGNoLnN0YXJ0MTtcbiAgICB2YXIgc3RhcnQyID0gYmlncGF0Y2guc3RhcnQyO1xuICAgIHZhciBwcmVjb250ZXh0ID0gJyc7XG4gICAgd2hpbGUgKGJpZ3BhdGNoLmRpZmZzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gQ3JlYXRlIG9uZSBvZiBzZXZlcmFsIHNtYWxsZXIgcGF0Y2hlcy5cbiAgICAgIHZhciBwYXRjaCA9IG5ldyBkaWZmX21hdGNoX3BhdGNoLnBhdGNoX29iaigpO1xuICAgICAgdmFyIGVtcHR5ID0gdHJ1ZTtcbiAgICAgIHBhdGNoLnN0YXJ0MSA9IHN0YXJ0MSAtIHByZWNvbnRleHQubGVuZ3RoO1xuICAgICAgcGF0Y2guc3RhcnQyID0gc3RhcnQyIC0gcHJlY29udGV4dC5sZW5ndGg7XG4gICAgICBpZiAocHJlY29udGV4dCAhPT0gJycpIHtcbiAgICAgICAgcGF0Y2gubGVuZ3RoMSA9IHBhdGNoLmxlbmd0aDIgPSBwcmVjb250ZXh0Lmxlbmd0aDtcbiAgICAgICAgcGF0Y2guZGlmZnMucHVzaChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsIHByZWNvbnRleHQpKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChiaWdwYXRjaC5kaWZmcy5sZW5ndGggIT09IDAgJiZcbiAgICAgICAgICAgICBwYXRjaC5sZW5ndGgxIDwgcGF0Y2hfc2l6ZSAtIHRoaXMuUGF0Y2hfTWFyZ2luKSB7XG4gICAgICAgIHZhciBkaWZmX3R5cGUgPSBiaWdwYXRjaC5kaWZmc1swXVswXTtcbiAgICAgICAgdmFyIGRpZmZfdGV4dCA9IGJpZ3BhdGNoLmRpZmZzWzBdWzFdO1xuICAgICAgICBpZiAoZGlmZl90eXBlID09PSBESUZGX0lOU0VSVCkge1xuICAgICAgICAgIC8vIEluc2VydGlvbnMgYXJlIGhhcm1sZXNzLlxuICAgICAgICAgIHBhdGNoLmxlbmd0aDIgKz0gZGlmZl90ZXh0Lmxlbmd0aDtcbiAgICAgICAgICBzdGFydDIgKz0gZGlmZl90ZXh0Lmxlbmd0aDtcbiAgICAgICAgICBwYXRjaC5kaWZmcy5wdXNoKGJpZ3BhdGNoLmRpZmZzLnNoaWZ0KCkpO1xuICAgICAgICAgIGVtcHR5ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlmZl90eXBlID09PSBESUZGX0RFTEVURSAmJiBwYXRjaC5kaWZmcy5sZW5ndGggPT0gMSAmJlxuICAgICAgICAgICAgICAgICAgIHBhdGNoLmRpZmZzWzBdWzBdID09IERJRkZfRVFVQUwgJiZcbiAgICAgICAgICAgICAgICAgICBkaWZmX3RleHQubGVuZ3RoID4gMiAqIHBhdGNoX3NpemUpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbGFyZ2UgZGVsZXRpb24uICBMZXQgaXQgcGFzcyBpbiBvbmUgY2h1bmsuXG4gICAgICAgICAgcGF0Y2gubGVuZ3RoMSArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgICAgICAgIHN0YXJ0MSArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgICAgICAgIGVtcHR5ID0gZmFsc2U7XG4gICAgICAgICAgcGF0Y2guZGlmZnMucHVzaChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKGRpZmZfdHlwZSwgZGlmZl90ZXh0KSk7XG4gICAgICAgICAgYmlncGF0Y2guZGlmZnMuc2hpZnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZWxldGlvbiBvciBlcXVhbGl0eS4gIE9ubHkgdGFrZSBhcyBtdWNoIGFzIHdlIGNhbiBzdG9tYWNoLlxuICAgICAgICAgIGRpZmZfdGV4dCA9IGRpZmZfdGV4dC5zdWJzdHJpbmcoMCxcbiAgICAgICAgICAgICAgcGF0Y2hfc2l6ZSAtIHBhdGNoLmxlbmd0aDEgLSB0aGlzLlBhdGNoX01hcmdpbik7XG4gICAgICAgICAgcGF0Y2gubGVuZ3RoMSArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgICAgICAgIHN0YXJ0MSArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgICAgICAgIGlmIChkaWZmX3R5cGUgPT09IERJRkZfRVFVQUwpIHtcbiAgICAgICAgICAgIHBhdGNoLmxlbmd0aDIgKz0gZGlmZl90ZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgIHN0YXJ0MiArPSBkaWZmX3RleHQubGVuZ3RoO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbXB0eSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRjaC5kaWZmcy5wdXNoKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoZGlmZl90eXBlLCBkaWZmX3RleHQpKTtcbiAgICAgICAgICBpZiAoZGlmZl90ZXh0ID09IGJpZ3BhdGNoLmRpZmZzWzBdWzFdKSB7XG4gICAgICAgICAgICBiaWdwYXRjaC5kaWZmcy5zaGlmdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiaWdwYXRjaC5kaWZmc1swXVsxXSA9XG4gICAgICAgICAgICAgICAgYmlncGF0Y2guZGlmZnNbMF1bMV0uc3Vic3RyaW5nKGRpZmZfdGV4dC5sZW5ndGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ29tcHV0ZSB0aGUgaGVhZCBjb250ZXh0IGZvciB0aGUgbmV4dCBwYXRjaC5cbiAgICAgIHByZWNvbnRleHQgPSB0aGlzLmRpZmZfdGV4dDIocGF0Y2guZGlmZnMpO1xuICAgICAgcHJlY29udGV4dCA9XG4gICAgICAgICAgcHJlY29udGV4dC5zdWJzdHJpbmcocHJlY29udGV4dC5sZW5ndGggLSB0aGlzLlBhdGNoX01hcmdpbik7XG4gICAgICAvLyBBcHBlbmQgdGhlIGVuZCBjb250ZXh0IGZvciB0aGlzIHBhdGNoLlxuICAgICAgdmFyIHBvc3Rjb250ZXh0ID0gdGhpcy5kaWZmX3RleHQxKGJpZ3BhdGNoLmRpZmZzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgdGhpcy5QYXRjaF9NYXJnaW4pO1xuICAgICAgaWYgKHBvc3Rjb250ZXh0ICE9PSAnJykge1xuICAgICAgICBwYXRjaC5sZW5ndGgxICs9IHBvc3Rjb250ZXh0Lmxlbmd0aDtcbiAgICAgICAgcGF0Y2gubGVuZ3RoMiArPSBwb3N0Y29udGV4dC5sZW5ndGg7XG4gICAgICAgIGlmIChwYXRjaC5kaWZmcy5sZW5ndGggIT09IDAgJiZcbiAgICAgICAgICAgIHBhdGNoLmRpZmZzW3BhdGNoLmRpZmZzLmxlbmd0aCAtIDFdWzBdID09PSBESUZGX0VRVUFMKSB7XG4gICAgICAgICAgcGF0Y2guZGlmZnNbcGF0Y2guZGlmZnMubGVuZ3RoIC0gMV1bMV0gKz0gcG9zdGNvbnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0Y2guZGlmZnMucHVzaChuZXcgZGlmZl9tYXRjaF9wYXRjaC5EaWZmKERJRkZfRVFVQUwsIHBvc3Rjb250ZXh0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZW1wdHkpIHtcbiAgICAgICAgcGF0Y2hlcy5zcGxpY2UoKyt4LCAwLCBwYXRjaCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5cbi8qKlxuICogVGFrZSBhIGxpc3Qgb2YgcGF0Y2hlcyBhbmQgcmV0dXJuIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5wYXRjaF9vYmo+fSBwYXRjaGVzIEFycmF5IG9mIFBhdGNoIG9iamVjdHMuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRleHQgcmVwcmVzZW50YXRpb24gb2YgcGF0Y2hlcy5cbiAqL1xuZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUucGF0Y2hfdG9UZXh0ID0gZnVuY3Rpb24ocGF0Y2hlcykge1xuICB2YXIgdGV4dCA9IFtdO1xuICBmb3IgKHZhciB4ID0gMDsgeCA8IHBhdGNoZXMubGVuZ3RoOyB4KyspIHtcbiAgICB0ZXh0W3hdID0gcGF0Y2hlc1t4XTtcbiAgfVxuICByZXR1cm4gdGV4dC5qb2luKCcnKTtcbn07XG5cblxuLyoqXG4gKiBQYXJzZSBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgcGF0Y2hlcyBhbmQgcmV0dXJuIGEgbGlzdCBvZiBQYXRjaCBvYmplY3RzLlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRsaW5lIFRleHQgcmVwcmVzZW50YXRpb24gb2YgcGF0Y2hlcy5cbiAqIEByZXR1cm4geyFBcnJheS48IWRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqPn0gQXJyYXkgb2YgUGF0Y2ggb2JqZWN0cy5cbiAqIEB0aHJvd3MgeyFFcnJvcn0gSWYgaW52YWxpZCBpbnB1dC5cbiAqL1xuZGlmZl9tYXRjaF9wYXRjaC5wcm90b3R5cGUucGF0Y2hfZnJvbVRleHQgPSBmdW5jdGlvbih0ZXh0bGluZSkge1xuICB2YXIgcGF0Y2hlcyA9IFtdO1xuICBpZiAoIXRleHRsaW5lKSB7XG4gICAgcmV0dXJuIHBhdGNoZXM7XG4gIH1cbiAgdmFyIHRleHQgPSB0ZXh0bGluZS5zcGxpdCgnXFxuJyk7XG4gIHZhciB0ZXh0UG9pbnRlciA9IDA7XG4gIHZhciBwYXRjaEhlYWRlciA9IC9eQEAgLShcXGQrKSw/KFxcZCopIFxcKyhcXGQrKSw/KFxcZCopIEBAJC87XG4gIHdoaWxlICh0ZXh0UG9pbnRlciA8IHRleHQubGVuZ3RoKSB7XG4gICAgdmFyIG0gPSB0ZXh0W3RleHRQb2ludGVyXS5tYXRjaChwYXRjaEhlYWRlcik7XG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGF0Y2ggc3RyaW5nOiAnICsgdGV4dFt0ZXh0UG9pbnRlcl0pO1xuICAgIH1cbiAgICB2YXIgcGF0Y2ggPSBuZXcgZGlmZl9tYXRjaF9wYXRjaC5wYXRjaF9vYmooKTtcbiAgICBwYXRjaGVzLnB1c2gocGF0Y2gpO1xuICAgIHBhdGNoLnN0YXJ0MSA9IHBhcnNlSW50KG1bMV0sIDEwKTtcbiAgICBpZiAobVsyXSA9PT0gJycpIHtcbiAgICAgIHBhdGNoLnN0YXJ0MS0tO1xuICAgICAgcGF0Y2gubGVuZ3RoMSA9IDE7XG4gICAgfSBlbHNlIGlmIChtWzJdID09ICcwJykge1xuICAgICAgcGF0Y2gubGVuZ3RoMSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGNoLnN0YXJ0MS0tO1xuICAgICAgcGF0Y2gubGVuZ3RoMSA9IHBhcnNlSW50KG1bMl0sIDEwKTtcbiAgICB9XG5cbiAgICBwYXRjaC5zdGFydDIgPSBwYXJzZUludChtWzNdLCAxMCk7XG4gICAgaWYgKG1bNF0gPT09ICcnKSB7XG4gICAgICBwYXRjaC5zdGFydDItLTtcbiAgICAgIHBhdGNoLmxlbmd0aDIgPSAxO1xuICAgIH0gZWxzZSBpZiAobVs0XSA9PSAnMCcpIHtcbiAgICAgIHBhdGNoLmxlbmd0aDIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRjaC5zdGFydDItLTtcbiAgICAgIHBhdGNoLmxlbmd0aDIgPSBwYXJzZUludChtWzRdLCAxMCk7XG4gICAgfVxuICAgIHRleHRQb2ludGVyKys7XG5cbiAgICB3aGlsZSAodGV4dFBvaW50ZXIgPCB0ZXh0Lmxlbmd0aCkge1xuICAgICAgdmFyIHNpZ24gPSB0ZXh0W3RleHRQb2ludGVyXS5jaGFyQXQoMCk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbGluZSA9IGRlY29kZVVSSSh0ZXh0W3RleHRQb2ludGVyXS5zdWJzdHJpbmcoMSkpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgLy8gTWFsZm9ybWVkIFVSSSBzZXF1ZW5jZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGVzY2FwZSBpbiBwYXRjaF9mcm9tVGV4dDogJyArIGxpbmUpO1xuICAgICAgfVxuICAgICAgaWYgKHNpZ24gPT0gJy0nKSB7XG4gICAgICAgIC8vIERlbGV0aW9uLlxuICAgICAgICBwYXRjaC5kaWZmcy5wdXNoKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9ERUxFVEUsIGxpbmUpKTtcbiAgICAgIH0gZWxzZSBpZiAoc2lnbiA9PSAnKycpIHtcbiAgICAgICAgLy8gSW5zZXJ0aW9uLlxuICAgICAgICBwYXRjaC5kaWZmcy5wdXNoKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoRElGRl9JTlNFUlQsIGxpbmUpKTtcbiAgICAgIH0gZWxzZSBpZiAoc2lnbiA9PSAnICcpIHtcbiAgICAgICAgLy8gTWlub3IgZXF1YWxpdHkuXG4gICAgICAgIHBhdGNoLmRpZmZzLnB1c2gobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihESUZGX0VRVUFMLCBsaW5lKSk7XG4gICAgICB9IGVsc2UgaWYgKHNpZ24gPT0gJ0AnKSB7XG4gICAgICAgIC8vIFN0YXJ0IG9mIG5leHQgcGF0Y2guXG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIGlmIChzaWduID09PSAnJykge1xuICAgICAgICAvLyBCbGFuayBsaW5lPyAgV2hhdGV2ZXIuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXVEY/XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXRjaCBtb2RlIFwiJyArIHNpZ24gKyAnXCIgaW46ICcgKyBsaW5lKTtcbiAgICAgIH1cbiAgICAgIHRleHRQb2ludGVyKys7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXRjaGVzO1xufTtcblxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBvbmUgcGF0Y2ggb3BlcmF0aW9uLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmRpZmZfbWF0Y2hfcGF0Y2gucGF0Y2hfb2JqID0gZnVuY3Rpb24oKSB7XG4gIC8qKiBAdHlwZSB7IUFycmF5LjwhZGlmZl9tYXRjaF9wYXRjaC5EaWZmPn0gKi9cbiAgdGhpcy5kaWZmcyA9IFtdO1xuICAvKiogQHR5cGUgez9udW1iZXJ9ICovXG4gIHRoaXMuc3RhcnQxID0gbnVsbDtcbiAgLyoqIEB0eXBlIHs/bnVtYmVyfSAqL1xuICB0aGlzLnN0YXJ0MiA9IG51bGw7XG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICB0aGlzLmxlbmd0aDEgPSAwO1xuICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgdGhpcy5sZW5ndGgyID0gMDtcbn07XG5cblxuLyoqXG4gKiBFbXVsYXRlIEdOVSBkaWZmJ3MgZm9ybWF0LlxuICogSGVhZGVyOiBAQCAtMzgyLDggKzQ4MSw5IEBAXG4gKiBJbmRpY2VzIGFyZSBwcmludGVkIGFzIDEtYmFzZWQsIG5vdCAwLWJhc2VkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgR05VIGRpZmYgc3RyaW5nLlxuICovXG5kaWZmX21hdGNoX3BhdGNoLnBhdGNoX29iai5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNvb3JkczEsIGNvb3JkczI7XG4gIGlmICh0aGlzLmxlbmd0aDEgPT09IDApIHtcbiAgICBjb29yZHMxID0gdGhpcy5zdGFydDEgKyAnLDAnO1xuICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoMSA9PSAxKSB7XG4gICAgY29vcmRzMSA9IHRoaXMuc3RhcnQxICsgMTtcbiAgfSBlbHNlIHtcbiAgICBjb29yZHMxID0gKHRoaXMuc3RhcnQxICsgMSkgKyAnLCcgKyB0aGlzLmxlbmd0aDE7XG4gIH1cbiAgaWYgKHRoaXMubGVuZ3RoMiA9PT0gMCkge1xuICAgIGNvb3JkczIgPSB0aGlzLnN0YXJ0MiArICcsMCc7XG4gIH0gZWxzZSBpZiAodGhpcy5sZW5ndGgyID09IDEpIHtcbiAgICBjb29yZHMyID0gdGhpcy5zdGFydDIgKyAxO1xuICB9IGVsc2Uge1xuICAgIGNvb3JkczIgPSAodGhpcy5zdGFydDIgKyAxKSArICcsJyArIHRoaXMubGVuZ3RoMjtcbiAgfVxuICB2YXIgdGV4dCA9IFsnQEAgLScgKyBjb29yZHMxICsgJyArJyArIGNvb3JkczIgKyAnIEBAXFxuJ107XG4gIHZhciBvcDtcbiAgLy8gRXNjYXBlIHRoZSBib2R5IG9mIHRoZSBwYXRjaCB3aXRoICV4eCBub3RhdGlvbi5cbiAgZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLmRpZmZzLmxlbmd0aDsgeCsrKSB7XG4gICAgc3dpdGNoICh0aGlzLmRpZmZzW3hdWzBdKSB7XG4gICAgICBjYXNlIERJRkZfSU5TRVJUOlxuICAgICAgICBvcCA9ICcrJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJRkZfREVMRVRFOlxuICAgICAgICBvcCA9ICctJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJRkZfRVFVQUw6XG4gICAgICAgIG9wID0gJyAnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGV4dFt4ICsgMV0gPSBvcCArIGVuY29kZVVSSSh0aGlzLmRpZmZzW3hdWzFdKSArICdcXG4nO1xuICB9XG4gIHJldHVybiB0ZXh0LmpvaW4oJycpLnJlcGxhY2UoLyUyMC9nLCAnICcpO1xufTtcblxuXG4vLyBUaGUgZm9sbG93aW5nIGV4cG9ydCBjb2RlIHdhcyBhZGRlZCBieSBARm9yYmVzTGluZGVzYXlcbm1vZHVsZS5leHBvcnRzID0gZGlmZl9tYXRjaF9wYXRjaDtcbm1vZHVsZS5leHBvcnRzWydkaWZmX21hdGNoX3BhdGNoJ10gPSBkaWZmX21hdGNoX3BhdGNoO1xubW9kdWxlLmV4cG9ydHNbJ0RJRkZfREVMRVRFJ10gPSBESUZGX0RFTEVURTtcbm1vZHVsZS5leHBvcnRzWydESUZGX0lOU0VSVCddID0gRElGRl9JTlNFUlQ7XG5tb2R1bGUuZXhwb3J0c1snRElGRl9FUVVBTCddID0gRElGRl9FUVVBTDsiLCAidHlwZSBFbnVtRGljdGlvbmFyeTxUIGV4dGVuZHMgc3RyaW5nIHwgc3ltYm9sIHwgbnVtYmVyLCBVPiA9IHtcblx0W0sgaW4gVF06IFU7XG59O1xuXG5leHBvcnQgdHlwZSBTVFJJTkdfU1VHR0VTVElPTl9UWVBFID0gXCJBZGRpdGlvblwiIHwgXCJEZWxldGlvblwiIHwgXCJTdWJzdGl0dXRpb25cIiB8IFwiSGlnaGxpZ2h0XCIgfCBcIkNvbW1lbnRcIjtcblxuZXhwb3J0IHR5cGUgTUVUQURBVEFfVFlQRSA9IFwiYXV0aG9yXCIgfCBcImRhdGVcIiB8IFwiY29tcGxldGVkXCIgfCBcInVyZ2VuY3lcIiB8IFwic3R5bGVcIjtcblxuLy8gRklYTUU6IENoYW5nZWQgdG8gc3RyaW5nIHR5cGVzLCBidXQgYmV5b25kIGlkZWFsIC0tLSBmYXIgdG9vIG11Y2ggYmxvYXRcbmV4cG9ydCBlbnVtIFN1Z2dlc3Rpb25UeXBlIHtcblx0QURESVRJT04gPSBcImFkZGl0aW9uXCIsXG5cdERFTEVUSU9OID0gXCJkZWxldGlvblwiLFxuXHRTVUJTVElUVVRJT04gPSBcInN1YnN0aXR1dGlvblwiLFxuXHRISUdITElHSFQgPSBcImhpZ2hsaWdodFwiLFxuXHRDT01NRU5UID0gXCJjb21tZW50XCIsXG59XG5cbmV4cG9ydCB0eXBlIFJhbmdlVHlwZSA9IFN1Z2dlc3Rpb25UeXBlIHwgXCJcIjtcblxuZXhwb3J0IGNvbnN0IENNX1N1Z2dlc3Rpb25UeXBlczogRW51bURpY3Rpb25hcnk8c3RyaW5nLCBTdWdnZXN0aW9uVHlwZT4gPSB7XG5cdFwiQWRkaXRpb25cIjogU3VnZ2VzdGlvblR5cGUuQURESVRJT04sXG5cdFwiRGVsZXRpb25cIjogU3VnZ2VzdGlvblR5cGUuREVMRVRJT04sXG5cdFwiU3Vic3RpdHV0aW9uXCI6IFN1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTixcblx0XCJIaWdobGlnaHRcIjogU3VnZ2VzdGlvblR5cGUuSElHSExJR0hULFxuXHRcIkNvbW1lbnRcIjogU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCxcbn07XG5cbmV4cG9ydCBjb25zdCBDTV9TeW50YXg6IEVudW1EaWN0aW9uYXJ5PFN1Z2dlc3Rpb25UeXBlLCBbc3RyaW5nLCBzdHJpbmddPiA9IHtcblx0W1N1Z2dlc3Rpb25UeXBlLkFERElUSU9OXTogW1wiK1wiLCBcIitcIl0sXG5cdFtTdWdnZXN0aW9uVHlwZS5ERUxFVElPTl06IFtcIi1cIiwgXCItXCJdLFxuXHRbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXTogW1wiflwiLCBcIn5cIl0sXG5cdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBbXCI9XCIsIFwiPVwiXSxcblx0W1N1Z2dlc3Rpb25UeXBlLkNPTU1FTlRdOiBbXCI+XCIsIFwiPFwiXSxcbn07XG5cbmV4cG9ydCBjb25zdCBDTV9BbGxfQnJhY2tldHM6IEVudW1EaWN0aW9uYXJ5PFN1Z2dlc3Rpb25UeXBlLCBzdHJpbmdbXT4gPSB7XG5cdFtTdWdnZXN0aW9uVHlwZS5BRERJVElPTl06IFtcInsrK1wiLCBcIisrfVwiXSxcblx0W1N1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OXTogW1wiey0tXCIsIFwiLS19XCJdLFxuXHRbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXTogW1wie35+XCIsIFwifj5cIiwgXCJ+fn1cIl0sXG5cdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBbXCJ7PT1cIiwgXCI9PX1cIl0sXG5cdFtTdWdnZXN0aW9uVHlwZS5DT01NRU5UXTogW1wiez4+XCIsIFwiPDx9XCJdLFxufTtcblxuZXhwb3J0IGNvbnN0IENNX0JyYWNrZXRzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7XG5cdFwieysrXCI6IFtcIisrfVwiXSxcblx0XCJ7LS1cIjogW1wiLS19XCJdLFxuXHRcInt+flwiOiBbXCJ+PlwiLCBcIn5+fVwiXSxcblx0XCJ7PT1cIjogW1wiPT19XCJdLFxuXHRcIns+PlwiOiBbXCI8PH1cIl0sXG59O1xuXG5leHBvcnQgY29uc3QgU1VHR0VTVElPTl9JQ09OX01BUFBFUiA9IHtcblx0W1N1Z2dlc3Rpb25UeXBlLkFERElUSU9OXTogXCJwbHVzLWNpcmNsZVwiLFxuXHRbU3VnZ2VzdGlvblR5cGUuREVMRVRJT05dOiBcIm1pbnVzLXNxdWFyZVwiLFxuXHRbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXTogXCJyZXBsYWNlXCIsXG5cdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBcImhpZ2hsaWdodGVyXCIsXG5cdFtTdWdnZXN0aW9uVHlwZS5DT01NRU5UXTogXCJtZXNzYWdlLXNxdWFyZVwiLFxufTtcbiIsICJpbXBvcnQgeyBQcmV2aWV3TW9kZSwgUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTiB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBFZGl0b3JDaGFuZ2UgfSBmcm9tIFwiLi4vZWRpdC1oYW5kbGVyXCI7XG5pbXBvcnQgeyBDTV9BbGxfQnJhY2tldHMsIHR5cGUgU1RSSU5HX1NVR0dFU1RJT05fVFlQRSwgdHlwZSBTdWdnZXN0aW9uVHlwZSB9IGZyb20gXCIuL2RlZmluaXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIENvbW1lbnRSYW5nZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IHNob3J0SGFuZE1hcHBpbmcgPSB7XG5cdFwiYVwiOiBcImF1dGhvclwiLFxuXHRcInRcIjogXCJ0aW1lXCIsXG5cdFwiZFwiOiBcImRvbmVcIixcblx0XCJzXCI6IFwic3R5bGVcIixcblx0XCJjXCI6IFwiY29sb3JcIixcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhdGFGaWVsZHMge1xuXHRhdXRob3I/OiBzdHJpbmc7XG5cdHRpbWU/OiBudW1iZXI7XG5cdGRvbmU/OiBib29sZWFuO1xuXHRzdHlsZT86IHN0cmluZztcblx0Y29sb3I/OiBzdHJpbmc7XG5cdFtwcm9wOiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCB0eXBlIENyaXRpY01hcmt1cFJhbmdlRW50cnkgPSB7IHBhdGg6IHN0cmluZywgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlIH07XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdGZpZWxkczogTWV0YWRhdGFGaWVsZHMgPSB7fTtcblx0cmVwbGllczogQ29tbWVudFJhbmdlW10gPSBbXTtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG5cdFx0cHVibGljIGZyb206IG51bWJlcixcblx0XHRwdWJsaWMgdG86IG51bWJlcixcblx0XHRwdWJsaWMgdHlwZTogU3VnZ2VzdGlvblR5cGUsXG5cdFx0cHVibGljIHJlcHI6IFNUUklOR19TVUdHRVNUSU9OX1RZUEUsXG5cdFx0cHVibGljIHRleHQ6IHN0cmluZyxcblx0XHRwdWJsaWMgbWV0YWRhdGE/OiBudW1iZXIsXG5cdCkge1xuXHRcdGlmIChtZXRhZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBtZXRhZGF0YV9zZXBhcmF0b3IgPSBtZXRhZGF0YSAtIGZyb207XG5cdFx0XHRjb25zdCBtZXRhZGF0YV90ZXh0ID0gdGV4dC5zbGljZSgzLCBtZXRhZGF0YV9zZXBhcmF0b3IpO1xuXHRcdFx0dGhpcy50ZXh0ID0gdGV4dC5zbGljZSgwLCAzKSArIHRleHQuc2xpY2UobWV0YWRhdGFfc2VwYXJhdG9yICsgMik7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBUT0RPOiBEZXRlcm1pbmUgd2hldGhlciBtZXRhZGF0YSBzcGVjaWZpY2F0aW9uIHNob3VsZCBoYXZlIHF1b3RlcyBhcm91bmQga2V5d29yZHNcblx0XHRcdFx0Ly8gICArIENsZWFuZXIsIHNob3J0ZXJcblx0XHRcdFx0Ly8gICAtIE5vdCB2YWxpZCBKU09OXG5cdFx0XHRcdC8vIFRPRE86IEpTIGNhbiBiZSBpbmplY3RlZCBoZXJlLCBwb3NzaWJsZSBzZWN1cml0eSByaXNrXG5cdFx0XHRcdC8vIHRoaXMuZmllbGRzID0gSlNPTi5wYXJzZShgeyR7bWV0YWRhdGFfdGV4dH19YCk7XG5cdFx0XHRcdHRoaXMuZmllbGRzID0gSlNPTi5wYXJzZShtZXRhZGF0YV90ZXh0KTtcblx0XHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gdGhpcy5maWVsZHMpIHtcblx0XHRcdFx0XHRpZiAoa2V5IGluIHNob3J0SGFuZE1hcHBpbmcpIHtcblx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmUgKFRoaXMgaXMgYSBwYWluIHRvIHR5cGUsIHRoZSB0cy1pZ25vcmUgaXMgMTAwJSB3b3J0aCBpdClcblx0XHRcdFx0XHRcdHRoaXMuZmllbGRzW3Nob3J0SGFuZE1hcHBpbmdba2V5XV0gPSB0aGlzLmZpZWxkc1trZXldO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuZmllbGRzW2tleSBhcyBrZXlvZiB0eXBlb2YgdGhpcy5maWVsZHNdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHQvLyBUT0RPOiBNYXJrIGFzIGludmFsaWQgbWFya2Rvd24gKHRoaXMgY2FuIGhhcHBlbiB3aGVuIHNlcGFyYXRvciBAQCBleGlzdHMsIGJ1dCB7fSBpcyBub3QgZ2l2ZW5cblx0XHRcdFx0dGhpcy5maWVsZHMgPSB7fTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRnZXQgYmFzZV9yYW5nZSgpOiBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRnZXQgZnVsbF90aHJlYWQoKTogQ3JpdGljTWFya3VwUmFuZ2VbXSB7XG5cdFx0cmV0dXJuIFt0aGlzLCAuLi50aGlzLnJlcGxpZXNdO1xuXHR9XG5cblx0Z2V0IHRocmVhZCgpOiBDb21tZW50UmFuZ2VbXSB7XG5cdFx0cmV0dXJuIFsuLi50aGlzLnJlcGxpZXNdO1xuXHR9XG5cblx0Z2V0IGxlbmd0aCgpIHtcblx0XHRyZXR1cm4gdGhpcy50byAtIHRoaXMuZnJvbSAtIDY7XG5cdH1cblxuXHRnZXQgZnVsbF90ZXh0KCkge1xuXHRcdHJldHVybiB0aGlzLnRleHQgKyB0aGlzLnJlcGxpZXMubWFwKHJlcGx5ID0+IHJlcGx5LnRleHQpLmpvaW4oXCJcIik7XG5cdH1cblxuXHQvKipcblx0ICogTG9jYXRpb246IHsqKntcIm1ldGFcIjogXCJkYXRhXCJ9QEBcdTI1OTFzb21lO3RleHQqKn0sIHsqKlx1MjU5MXNvbWUgdGV4dCoqfVxuXHQgKi9cblx0Z2V0IHJhbmdlX3N0YXJ0KCkge1xuXHRcdHJldHVybiB0aGlzLm1ldGFkYXRhID8gdGhpcy5tZXRhZGF0YSArIDIgOiB0aGlzLmZyb20gKyAzO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvY2F0aW9uOiB7Kip7XCJtZXRhXCI6IFwiZGF0YVwifVx1MjU5MUBAc29tZTt0ZXh0Kip9LCBcdTI1OTF7Kipzb21lIHRleHQqKn1cblx0ICovXG5cdGdldCByYW5nZV9mcm9udCgpIHtcblx0XHRyZXR1cm4gdGhpcy5tZXRhZGF0YSA/IHRoaXMubWV0YWRhdGEgLSAxIDogdGhpcy5mcm9tO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvY2F0aW9uOiBcdTI1OTF7Kipzb21lO3RleHQqKn17Pj5jb21tZW50PDx9LCBcdTI1OTF7Kipzb21lIHRleHQqKn1cblx0ICovXG5cdGdldCBmdWxsX3JhbmdlX2Zyb250KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZV9yYW5nZS5mcm9tO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvY2F0aW9uOiB7Kipzb21lO3RleHQqKn17Pj5jb21tZW50PDx9XHUyNTkxLCB7Kipzb21lIHRleHQqKn1cdTI1OTFcblx0ICovXG5cdGdldCBmdWxsX3JhbmdlX2JhY2soKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlX3JhbmdlLnJlcGxpZXMubGVuZ3RoID9cblx0XHRcdHRoaXMuYmFzZV9yYW5nZS5yZXBsaWVzW3RoaXMuYmFzZV9yYW5nZS5yZXBsaWVzLmxlbmd0aCAtIDFdLnRvIDpcblx0XHRcdHRoaXMudG87XG5cdH1cblxuXHRyYW5nZV90eXBlKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IFN1Z2dlc3Rpb25UeXBlIHtcblx0XHRyZXR1cm4gdGhpcy50eXBlO1xuXHR9XG5cblx0cmVtb3ZlX21ldGFkYXRhKCk6IEVkaXRvckNoYW5nZVtdIHtcblx0XHRpZiAoIXRoaXMubWV0YWRhdGEpIHJldHVybiBbXTtcblx0XHRyZXR1cm4gW3tcblx0XHRcdGZyb206IHRoaXMuZnJvbSArIDMsXG5cdFx0XHR0bzogdGhpcy5tZXRhZGF0YSArIDIsXG5cdFx0XHRpbnNlcnQ6IFwiXCIsXG5cdFx0fV07XG5cdH1cblxuXHRkZWxldGVfbWV0YWRhdGEoa2V5OiBzdHJpbmcpOiBFZGl0b3JDaGFuZ2VbXSB7XG5cdFx0aWYgKGtleSBpbiBzaG9ydEhhbmRNYXBwaW5nKSBrZXkgPSBzaG9ydEhhbmRNYXBwaW5nW2tleSBhcyBrZXlvZiB0eXBlb2Ygc2hvcnRIYW5kTWFwcGluZ107XG5cblx0XHRpZiAoa2V5IGluIHRoaXMuZmllbGRzKSB7XG5cdFx0XHRkZWxldGUgdGhpcy5maWVsZHNba2V5IGFzIGtleW9mIHR5cGVvZiB0aGlzLmZpZWxkc107XG5cdFx0XHRpZiAoT2JqZWN0LmtleXModGhpcy5maWVsZHMpLmxlbmd0aCA9PT0gMClcblx0XHRcdFx0dGhpcy5yZW1vdmVfbWV0YWRhdGEoKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5zZXRfbWV0YWRhdGEodGhpcy5maWVsZHMpO1xuXHRcdH1cblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHRhZGRfbWV0YWRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogRWRpdG9yQ2hhbmdlW10ge1xuXHRcdHRoaXMuZmllbGRzW2tleSBhcyBrZXlvZiB0eXBlb2YgdGhpcy5maWVsZHNdID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXMuc2V0X21ldGFkYXRhKHRoaXMuZmllbGRzKTtcblx0fVxuXG5cdHNldF9tZXRhZGF0YShmaWVsZHM6IE1ldGFkYXRhRmllbGRzKTogRWRpdG9yQ2hhbmdlW10ge1xuXHRcdC8vIFRPRE86IFBvc3NpYmx5IHJlZHVuZGFudCBhc3NpZ25tZW50LCByYW5nZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGdldCByZS1jb25zdHJ1Y3RlZCB3aXRoIHRoZSBFZGl0b3JDaGFuZ2Vcblx0XHR0aGlzLmZpZWxkcyA9IGZpZWxkcztcblx0XHRpZiAodGhpcy5tZXRhZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gW3tcblx0XHRcdFx0ZnJvbTogdGhpcy5mcm9tICsgMyxcblx0XHRcdFx0dG86IHRoaXMubWV0YWRhdGEsXG5cdFx0XHRcdGluc2VydDogSlNPTi5zdHJpbmdpZnkoZmllbGRzKSxcblx0XHRcdH1dO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gW3tcblx0XHRcdFx0ZnJvbTogdGhpcy5mcm9tICsgMyxcblx0XHRcdFx0dG86IHRoaXMuZnJvbSArIDMsXG5cdFx0XHRcdGluc2VydDogSlNPTi5zdHJpbmdpZnkoZmllbGRzKSArIFwiQEBcIixcblx0XHRcdH1dO1xuXHRcdH1cblx0fVxuXG5cdGhhc19jb21tZW50KHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnRocmVhZC5pbmNsdWRlcyhyYW5nZSBhcyBDb21tZW50UmFuZ2UpO1xuXHR9XG5cblx0Y29weSgpOiBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpLCB0aGlzKTtcblx0fVxuXG5cdGVxdWFscyhvdGhlcjogQ3JpdGljTWFya3VwUmFuZ2UpIHtcblx0XHRyZXR1cm4gdGhpcy50eXBlID09PSBvdGhlci50eXBlICYmIHRoaXMuZnJvbSA9PT0gb3RoZXIuZnJvbSAmJiB0aGlzLnRvID09PSBvdGhlci50byAmJlxuXHRcdFx0dGhpcy5yZXBsaWVzLmxlbmd0aCA9PT0gb3RoZXIucmVwbGllcy5sZW5ndGggJiYgdGhpcy5mdWxsX3RleHQgPT09IG90aGVyLmZ1bGxfdGV4dDtcblx0fVxuXG5cdGxlZnRfYWRqYWNlbnQob3RoZXI6IENyaXRpY01hcmt1cFJhbmdlKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbSA9PT0gb3RoZXIudG87XG5cdH1cblxuXHRyaWdodF9hZGphY2VudChvdGhlcjogQ3JpdGljTWFya3VwUmFuZ2UpIHtcblx0XHRyZXR1cm4gdGhpcy50byA9PT0gb3RoZXIuZnJvbTtcblx0fVxuXG5cdHBhcnRfaXNfZW1wdHkobGVmdDogYm9vbGVhbikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGVtcHR5KCkge1xuXHRcdHJldHVybiA2ID09PSB0aGlzLnRvIC0gdGhpcy5mcm9tO1xuXHR9XG5cblx0dW53cmFwKCkge1xuXHRcdHJldHVybiB0aGlzLnRleHQuc2xpY2UoMywgLTMpO1xuXHR9XG5cblx0dW53cmFwX2JyYWNrZXQobGVmdCA9IGZhbHNlKSB7XG5cdFx0cmV0dXJuIGxlZnQgPyB0aGlzLnRleHQuc2xpY2UoMykgOiB0aGlzLnRleHQuc2xpY2UoMCwgLTMpO1xuXHR9XG5cblx0dW53cmFwX3BhcnRzKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gW3RoaXMudW53cmFwKCldO1xuXHR9XG5cblx0dW53cmFwX3NsaWNlKGZyb206IG51bWJlciwgdG86IG51bWJlcikge1xuXHRcdGZyb20gLT0gdGhpcy5yYW5nZV9mcm9udDtcblx0XHR0byAtPSB0aGlzLnJhbmdlX2Zyb250O1xuXHRcdGlmICh0byA8PSAwIHx8IGZyb20gPT09IHRvKSByZXR1cm4gXCJcIjtcblxuXHRcdHJldHVybiB0aGlzLnRleHQuc2xpY2UoTWF0aC5tYXgoMywgZnJvbSksIE1hdGgubWluKHRoaXMudGV4dC5sZW5ndGggLSAzLCB0bykpO1xuXHR9XG5cblx0cGFydGlhbGx5X2luX3JhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSB7XG5cdFx0Ly8gcmV0dXJuIHRoaXMuZnJvbSA8IGVuZCAmJiBzdGFydCA8IHRoaXMudG87XG5cdFx0cmV0dXJuICEoc3RhcnQgPiB0aGlzLnRvIHx8IGVuZCA8IHRoaXMuZnJvbSk7XG5cdH1cblxuXHRwYXJ0aWFsbHlfaW5fZnVsbF9yYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuXHRcdHJldHVybiAhKHN0YXJ0ID4gdGhpcy5mdWxsX3JhbmdlX2JhY2sgfHwgZW5kIDwgdGhpcy5mdWxsX3JhbmdlX2Zyb250KTtcblx0fVxuXG5cdGVuY2xvc2VzX3JhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBzdHJpY3QgPSBmYWxzZSkge1xuXHRcdGlmIChzdHJpY3QpIHJldHVybiB0aGlzLmZyb20gPCBzdGFydCAmJiB0aGlzLnRvID4gZW5kO1xuXHRcdHJldHVybiB0aGlzLmZyb20gPD0gc3RhcnQgJiYgdGhpcy50byA+PSBlbmQ7XG5cdH1cblxuXHRwYXJ0X2VuY2xvc2VzX3JhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBsZWZ0OiBib29sZWFuKSB7XG5cdFx0cmV0dXJuIHRoaXMuZW5jbG9zZXNfcmFuZ2Uoc3RhcnQsIGVuZCk7XG5cdH1cblxuXHRhY2NlcHQocmVtb3ZlQ29tbWVudHMgPSB0cnVlKSB7XG5cdFx0cmV0dXJuIHRoaXMudGV4dDtcblx0fVxuXG5cdHJlamVjdChyZW1vdmVDb21tZW50cyA9IHRydWUpIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0O1xuXHR9XG5cblx0dG91Y2hlcyhjdXJzb3I6IG51bWJlcikge1xuXHRcdHJldHVybiB0aGlzLmZyb20gPT09IGN1cnNvciB8fCB0aGlzLnRvID09PSBjdXJzb3I7XG5cdH1cblxuXHRjdXJzb3JfaW5zaWRlKGN1cnNvcjogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbSA8PSBjdXJzb3IgJiYgY3Vyc29yIDw9IHRoaXMudG87XG5cdH1cblxuXHRjdXJzb3JfYmVmb3JlX3JhbmdlKGN1cnNvcjogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIGN1cnNvciA8IHRoaXMuZnJvbTtcblx0fVxuXG5cdGN1cnNvcl9hZnRlcl9yYW5nZShjdXJzb3I6IG51bWJlcikge1xuXHRcdHJldHVybiBjdXJzb3IgPiB0aGlzLnRvO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1vdmVzIGEgY3Vyc29yIGluc2lkZSB0aGUgZmlyc3Qgbm9uLXN5bnRheC9tZXRhZGF0YSBpZiBpdCBpcyBlaXRoZXIgb3V0c2lkZSB0aGUgcmFuZ2UsIG9yIGluc2lkZSBzeW50YXhcblx0ICogQHBhcmFtIGN1cnNvciBDdXJzb3IgdG8gbW92ZVxuXHQgKiBAcGFyYW0gc2tpcF9tZXRhZGF0YSBXaGV0aGVyIHRvIHNraXAgbWV0YWRhdGFcblx0ICogQHJlbWFyayBDdXJzb3Igd2lsbCBqdW1wIHRvIHJhbmdlIHJlZ2FyZGxlc3Mgd2hldGhlciBpdCBpcyBhZGphY2VudCB0byB0aGUgcmFuZ2Ugb3Igbm90XG5cdCAqL1xuXHRjdXJzb3JfbW92ZV9pbnNpZGUoY3Vyc29yOiBudW1iZXIsIHNraXBfbWV0YWRhdGEgPSBmYWxzZSkge1xuXHRcdHJldHVybiBNYXRoLm1pbihcblx0XHRcdE1hdGgubWF4KChza2lwX21ldGFkYXRhICYmIHRoaXMubWV0YWRhdGEpID8gdGhpcy5tZXRhZGF0YSArIDIgOiB0aGlzLmZyb20gKyAzLCBjdXJzb3IpLFxuXHRcdFx0dGhpcy50byAtIDMsXG5cdFx0KTtcblx0fVxuXG5cdGN1cnNvcl9wYXNzX3N5bnRheChjdXJzb3I6IG51bWJlciwgcmlnaHQ6IGJvb2xlYW4sIHNraXBfbWV0YWRhdGE6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHRcdGlmIChyaWdodCkge1xuXHRcdFx0aWYgKHRoaXMudG91Y2hlc19sZWZ0X2JyYWNrZXQoY3Vyc29yLCB0cnVlLCBmYWxzZSwgc2tpcF9tZXRhZGF0YSkpXG5cdFx0XHRcdGN1cnNvciA9IChza2lwX21ldGFkYXRhICYmIHRoaXMubWV0YWRhdGEpID8gKHRoaXMubWV0YWRhdGEhICsgMikgOiAodGhpcy5mcm9tICsgMyk7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX3JpZ2h0X2JyYWNrZXQoY3Vyc29yLCBmYWxzZSwgdHJ1ZSkpXG5cdFx0XHRcdGN1cnNvciA9IHRoaXMudG87XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfcmlnaHRfYnJhY2tldChjdXJzb3IsIHRydWUsIGZhbHNlKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy50byAtIDM7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX2xlZnRfYnJhY2tldChjdXJzb3IsIGZhbHNlLCB0cnVlLCBza2lwX21ldGFkYXRhKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy5mcm9tO1xuXHRcdH1cblx0XHRyZXR1cm4gY3Vyc29yO1xuXHR9XG5cblx0Y3Vyc29yX21vdmVfdGhyb3VnaChjdXJzb3I6IG51bWJlciwgcmlnaHQ6IGJvb2xlYW4sIG1vdmVtZW50OiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OKSB7XG5cdFx0aWYgKG1vdmVtZW50ID09IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04uVU5DSEFOR0VEIHx8ICF0aGlzLmN1cnNvcl9pbnNpZGUoY3Vyc29yKSkgeyAvKiBObyBhY3Rpb24gKi8gfVxuXHRcdGVsc2UgaWYgKG1vdmVtZW50ID09IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04uSUdOT1JFX0NPTVBMRVRFTFkpXG5cdFx0XHRjdXJzb3IgPSByaWdodCA/IHRoaXMudG8gOiB0aGlzLmZyb207XG5cdFx0ZWxzZVxuXHRcdFx0Y3Vyc29yID0gdGhpcy5jdXJzb3JfcGFzc19zeW50YXgoY3Vyc29yLCByaWdodCwgbW92ZW1lbnQgPT0gUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5JR05PUkVfTUVUQURBVEEpO1xuXHRcdHJldHVybiBjdXJzb3I7XG5cdH1cblxuXHR0b3VjaGVzX2xlZnRfYnJhY2tldChjdXJzb3I6IG51bWJlciwgb3V0c2lkZV9sb29zZSA9IGZhbHNlLCBpbnNpZGVfbG9vc2UgPSBmYWxzZSwgaW5jbHVkZV9tZXRhZGF0YSA9IGZhbHNlKSB7XG5cdFx0cmV0dXJuIGN1cnNvciArIChvdXRzaWRlX2xvb3NlID8gMCA6IDEpID49IHRoaXMuZnJvbSAmJlxuXHRcdFx0Y3Vyc29yICsgKGluc2lkZV9sb29zZSA/IDAgOiAxKSA8PVxuXHRcdFx0XHQoKGluY2x1ZGVfbWV0YWRhdGEgJiYgdGhpcy5tZXRhZGF0YSkgPyB0aGlzLm1ldGFkYXRhICsgMiA6IHRoaXMuZnJvbSArIDMpO1xuXHR9XG5cblx0dG91Y2hlc19zZXBhcmF0b3IoY3Vyc29yOiBudW1iZXIsIGxlZnRfbG9vc2UgPSBmYWxzZSwgcmlnaHRfbG9vc2UgPSBmYWxzZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHRvdWNoZXNfcmlnaHRfYnJhY2tldChjdXJzb3I6IG51bWJlciwgb3V0c2lkZV9sb29zZSA9IGZhbHNlLCBpbnNpZGVfbG9vc2UgPSBmYWxzZSkge1xuXHRcdHJldHVybiBjdXJzb3IgLSAoaW5zaWRlX2xvb3NlID8gMCA6IDEpID49IHRoaXMudG8gLSAzICYmIGN1cnNvciAtIChvdXRzaWRlX2xvb3NlID8gMCA6IDEpIDw9IHRoaXMudG87XG5cdH1cblxuXHR0b3VjaGVzX2JyYWNrZXQoY3Vyc29yOiBudW1iZXIsIGxlZnQ6IGJvb2xlYW4sIG91dHNpZGVfbG9vc2UgPSBmYWxzZSwgaW5zaWRlX2xvb3NlID0gZmFsc2UpIHtcblx0XHRyZXR1cm4gbGVmdCA/XG5cdFx0XHR0aGlzLnRvdWNoZXNfbGVmdF9icmFja2V0KGN1cnNvciwgb3V0c2lkZV9sb29zZSwgaW5zaWRlX2xvb3NlKSA6XG5cdFx0XHR0aGlzLnRvdWNoZXNfcmlnaHRfYnJhY2tldChjdXJzb3IsIG91dHNpZGVfbG9vc2UsIGluc2lkZV9sb29zZSk7XG5cdH1cblxuXHRwb3N0cHJvY2Vzcyhcblx0XHR1bndyYXA6IGJvb2xlYW4gPSB0cnVlLFxuXHRcdHByZXZpZXdNb2RlOiBQcmV2aWV3TW9kZSA9IFByZXZpZXdNb2RlLkFMTCxcblx0XHR0YWc6IGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcCA9IFwiZGl2XCIsXG5cdFx0bGVmdDogYm9vbGVhbiB8IG51bGwgPSBudWxsLFxuXHRcdHRleHQ/OiBzdHJpbmcsXG5cdCk6IHN0cmluZyB8IEhUTUxFbGVtZW50IHtcblx0XHRsZXQgc3RyID0gdGV4dCA/PyB0aGlzLnRleHQ7XG5cdFx0aWYgKCF0ZXh0ICYmIHVud3JhcCkge1xuXHRcdFx0aWYgKHRoaXMudG8gPj0gc3RyLmxlbmd0aCAmJiAhc3RyLmVuZHNXaXRoKENNX0FsbF9CcmFja2V0c1t0aGlzLnR5cGVdLmF0KC0xKSEpKVxuXHRcdFx0XHRzdHIgPSB0aGlzLnVud3JhcF9icmFja2V0KHRydWUpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRzdHIgPSB0aGlzLnVud3JhcCgpO1xuXHRcdH1cblx0XHRyZXR1cm4gYDwke3RhZ30gY2xhc3M9J2NtdHItJHt0aGlzLnJlcHIudG9Mb3dlckNhc2UoKX0nPiR7c3RyfTwvJHt0YWd9PmA7XG5cdH1cblxuXHRhcHBseV9vZmZzZXQob2Zmc2V0OiBudW1iZXIpIHtcblx0XHR0aGlzLmZyb20gKz0gb2Zmc2V0O1xuXHRcdHRoaXMudG8gKz0gb2Zmc2V0O1xuXHRcdGlmICh0aGlzLm1ldGFkYXRhICE9PSB1bmRlZmluZWQpIHRoaXMubWV0YWRhdGEgKz0gb2Zmc2V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgcmVxdWlyZWQgY2hhcmFjdGVycyB0byBmaXggYSByYW5nZSB3aGVuIHNwbGl0dGluZyBhIHJhbmdlIGF0IGdpdmVuIGN1cnNvciBwb3NpdGlvblxuXHQgKiBAcGFyYW0gY3Vyc29yIEN1cnNvciBwb3NpdGlvbiB0byBzcGxpdCBhdFxuXHQgKi9cblx0c3BsaXRfcmFuZ2UoY3Vyc29yOiBudW1iZXIpOiBbc3RyaW5nLCBzdHJpbmddIHtcblx0XHRyZXR1cm4gW3RoaXMudGV4dC5zbGljZSgtMyksIHRoaXMudGV4dC5zbGljZSgwLCAzKSArICh0aGlzLm1ldGFkYXRhID8gSlNPTi5zdHJpbmdpZnkodGhpcy5maWVsZHMpICsgXCJAQFwiIDogXCJcIildO1xuXHR9XG59XG4iLCAiaW1wb3J0IHsgUHJldmlld01vZGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IENyaXRpY01hcmt1cFJhbmdlIH0gZnJvbSBcIi4uL2Jhc2VfcmFuZ2VcIjtcbmltcG9ydCB7IENNX0FsbF9CcmFja2V0cywgU3VnZ2VzdGlvblR5cGUgfSBmcm9tIFwiLi4vZGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZGl0aW9uUmFuZ2UgZXh0ZW5kcyBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdGNvbnN0cnVjdG9yKGZyb206IG51bWJlciwgdG86IG51bWJlciwgdGV4dDogc3RyaW5nLCBtZXRhZGF0YT86IG51bWJlcikge1xuXHRcdHN1cGVyKGZyb20sIHRvLCBTdWdnZXN0aW9uVHlwZS5BRERJVElPTiwgXCJBZGRpdGlvblwiLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdH1cblxuXHRhY2NlcHQoKSB7XG5cdFx0cmV0dXJuIHRoaXMudW53cmFwKCk7XG5cdH1cblxuXHRyZWplY3QoKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRwb3N0cHJvY2Vzcyhcblx0XHR1bndyYXA6IGJvb2xlYW4gPSB0cnVlLFxuXHRcdHByZXZpZXdNb2RlOiBQcmV2aWV3TW9kZSA9IFByZXZpZXdNb2RlLkFMTCxcblx0XHR0YWc6IGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcCA9IFwiZGl2XCIsXG5cdFx0bGVmdDogYm9vbGVhbiB8IG51bGwgPSBudWxsLFxuXHRcdHRleHQ/OiBzdHJpbmcsXG5cdCkge1xuXHRcdGxldCBzdHIgPSB0ZXh0ID8/IHRoaXMudGV4dDtcblx0XHRpZiAoIXRleHQgJiYgdW53cmFwKSB7XG5cdFx0XHRpZiAodGhpcy50byA+PSBzdHIubGVuZ3RoICYmICFzdHIuZW5kc1dpdGgoQ01fQWxsX0JyYWNrZXRzW3RoaXMudHlwZV0uYXQoLTEpISkpXG5cdFx0XHRcdHN0ciA9IHRoaXMudW53cmFwX2JyYWNrZXQodHJ1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHN0ciA9IHRoaXMudW53cmFwKCk7XG5cdFx0fVxuXG5cdFx0bGV0IGNscyA9IFwiY210ci1wcmV2aWV3XCI7XG5cdFx0aWYgKHByZXZpZXdNb2RlID09PSBQcmV2aWV3TW9kZS5BTEwpXG5cdFx0XHRjbHMgKz0gXCIgY210ci1hZGRpdGlvblwiO1xuXHRcdGVsc2UgaWYgKHByZXZpZXdNb2RlID09PSBQcmV2aWV3TW9kZS5SRUpFQ1QpXG5cdFx0XHRzdHIgPSBcIlwiO1xuXG5cdFx0cmV0dXJuIGA8JHt0YWd9IGNsYXNzPScke2Nsc30nPiR7c3RyfTwvJHt0YWd9PmA7XG5cdH1cbn1cbiIsICJpbXBvcnQgeyBDcml0aWNNYXJrdXBSYW5nZSB9IGZyb20gXCIuLi9iYXNlX3JhbmdlXCI7XG5pbXBvcnQgeyBTdWdnZXN0aW9uVHlwZSB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgQ29tbWVudFJhbmdlIGV4dGVuZHMgQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRyZXBseV9kZXB0aCA9IDA7XG5cdGF0dGFjaGVkX2NvbW1lbnQ6IENyaXRpY01hcmt1cFJhbmdlIHwgbnVsbCA9IG51bGw7XG5cblx0Z2V0IGJhc2VfcmFuZ2UoKTogQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRcdHJldHVybiB0aGlzLmF0dGFjaGVkX2NvbW1lbnQgfHwgdGhpcztcblx0fVxuXG5cdGdldCB0aHJlYWQoKTogQ29tbWVudFJhbmdlW10ge1xuXHRcdHJldHVybiB0aGlzLmF0dGFjaGVkX2NvbW1lbnQgPyBbLi4udGhpcy5hdHRhY2hlZF9jb21tZW50LnRocmVhZF0gOiBbdGhpcywgLi4udGhpcy5yZXBsaWVzXTtcblx0fVxuXG5cdGFjY2VwdChyZW1vdmVDb21tZW50czogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuXHRcdGlmIChyZW1vdmVDb21tZW50cykge1xuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnVud3JhcCgpO1xuXHRcdH1cblx0fVxuXG5cdHJlamVjdChyZW1vdmVDb21tZW50czogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuXHRcdGlmIChyZW1vdmVDb21tZW50cykge1xuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnVud3JhcCgpO1xuXHRcdH1cblx0fVxuXG5cdGNsZWFyX3JlZmVyZW5jZXMoKSB7XG5cdFx0dGhpcy5hdHRhY2hlZF9jb21tZW50ID0gbnVsbDtcblx0XHR0aGlzLnJlcGx5X2RlcHRoID0gMDtcblx0fVxuXG5cdGFkZF9yZXBseShyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UpIHtcblx0XHR0aGlzLmF0dGFjaF90b19yYW5nZShyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5DT01NRU5UID8gKHJhbmdlIGFzIENvbW1lbnRSYW5nZSkuYmFzZV9yYW5nZSA6IHJhbmdlKTtcblx0fVxuXG5cdGF0dGFjaF90b19yYW5nZShyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UpIHtcblx0XHRyYW5nZS5yZXBsaWVzLnB1c2godGhpcyk7XG5cdFx0dGhpcy5yZXBseV9kZXB0aCA9IHJhbmdlLnJlcGxpZXMubGVuZ3RoIC0gKHJhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLkNPTU1FTlQgPyAwIDogMSk7XG5cdFx0dGhpcy5hdHRhY2hlZF9jb21tZW50ID0gcmFuZ2U7XG5cdH1cblxuXHRjb25zdHJ1Y3Rvcihmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIHRleHQ6IHN0cmluZywgbWV0YWRhdGE/OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcm9tLCB0bywgU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCwgXCJDb21tZW50XCIsIHRleHQsIG1ldGFkYXRhKTtcblx0fVxufVxuIiwgImltcG9ydCB7IFByZXZpZXdNb2RlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBDcml0aWNNYXJrdXBSYW5nZSB9IGZyb20gXCIuLi9iYXNlX3JhbmdlXCI7XG5pbXBvcnQgeyBDTV9BbGxfQnJhY2tldHMsIFN1Z2dlc3Rpb25UeXBlIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBEZWxldGlvblJhbmdlIGV4dGVuZHMgQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRjb25zdHJ1Y3Rvcihmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIHRleHQ6IHN0cmluZywgbWV0YWRhdGE/OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcm9tLCB0bywgU3VnZ2VzdGlvblR5cGUuREVMRVRJT04sIFwiRGVsZXRpb25cIiwgdGV4dCwgbWV0YWRhdGEpO1xuXHR9XG5cblx0YWNjZXB0KCkge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cblx0cmVqZWN0KCkge1xuXHRcdHJldHVybiB0aGlzLnVud3JhcCgpO1xuXHR9XG5cblx0cG9zdHByb2Nlc3MoXG5cdFx0dW53cmFwOiBib29sZWFuID0gdHJ1ZSxcblx0XHRwcmV2aWV3TW9kZTogUHJldmlld01vZGUgPSBQcmV2aWV3TW9kZS5BTEwsXG5cdFx0dGFnOiBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXAgPSBcImRpdlwiLFxuXHRcdGxlZnQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbCxcblx0XHR0ZXh0Pzogc3RyaW5nLFxuXHQpIHtcblx0XHRsZXQgc3RyID0gdGV4dCA/PyB0aGlzLnRleHQ7XG5cdFx0aWYgKCF0ZXh0ICYmIHVud3JhcCkge1xuXHRcdFx0aWYgKHRoaXMudG8gPj0gc3RyLmxlbmd0aCAmJiAhc3RyLmVuZHNXaXRoKENNX0FsbF9CcmFja2V0c1t0aGlzLnR5cGVdLmF0KC0xKSEpKVxuXHRcdFx0XHRzdHIgPSB0aGlzLnVud3JhcF9icmFja2V0KHRydWUpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRzdHIgPSB0aGlzLnVud3JhcCgpO1xuXHRcdH1cblxuXHRcdGxldCBjbHMgPSBcImNtdHItcHJldmlld1wiO1xuXHRcdGlmIChwcmV2aWV3TW9kZSA9PT0gUHJldmlld01vZGUuQUxMKVxuXHRcdFx0Y2xzICs9IFwiIGNtdHItZGVsZXRpb25cIjtcblx0XHRlbHNlIGlmIChwcmV2aWV3TW9kZSA9PT0gUHJldmlld01vZGUuQUNDRVBUKVxuXHRcdFx0c3RyID0gXCJcIjtcblxuXHRcdHJldHVybiBgPCR7dGFnfSBjbGFzcz0nJHtjbHN9Jz4ke3N0cn08LyR7dGFnfT5gO1xuXHR9XG59XG4iLCAiaW1wb3J0IHsgQ3JpdGljTWFya3VwUmFuZ2UgfSBmcm9tIFwiLi4vYmFzZV9yYW5nZVwiO1xuaW1wb3J0IHsgU3VnZ2VzdGlvblR5cGUgfSBmcm9tIFwiLi4vZGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGNsYXNzIEhpZ2hsaWdodFJhbmdlIGV4dGVuZHMgQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRjb25zdHJ1Y3Rvcihmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIHRleHQ6IHN0cmluZywgbWV0YWRhdGE/OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcm9tLCB0bywgU3VnZ2VzdGlvblR5cGUuSElHSExJR0hULCBcIkhpZ2hsaWdodFwiLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdH1cbn1cbiIsICJpbXBvcnQgeyBQcmV2aWV3TW9kZSB9IGZyb20gXCIuLi8uLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgQ3JpdGljTWFya3VwUmFuZ2UgfSBmcm9tIFwiLi4vYmFzZV9yYW5nZVwiO1xuaW1wb3J0IHsgQ01fQWxsX0JyYWNrZXRzLCBTdWdnZXN0aW9uVHlwZSB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgU3Vic3RpdHV0aW9uUmFuZ2UgZXh0ZW5kcyBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdGNvbnN0cnVjdG9yKGZyb206IG51bWJlciwgcHVibGljIG1pZGRsZTogbnVtYmVyLCB0bzogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIG1ldGFkYXRhPzogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJvbSwgdG8sIFN1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTiwgXCJTdWJzdGl0dXRpb25cIiwgdGV4dCwgbWV0YWRhdGEpO1xuXHR9XG5cblx0Z2V0IGxlbmd0aCgpIHtcblx0XHRyZXR1cm4gdGhpcy50byAtIHRoaXMuZnJvbSAtIDg7XG5cdH1cblxuXHRnZXQgY2hhcl9taWRkbGUoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWlkZGxlIC0gdGhpcy5yYW5nZV9mcm9udDtcblx0fVxuXG5cdHJhbmdlX3R5cGUoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIHRvIDw9IHRoaXMubWlkZGxlICsgMiA/XG5cdFx0XHRTdWdnZXN0aW9uVHlwZS5ERUxFVElPTiA6XG5cdFx0XHRmcm9tID49IHRoaXMubWlkZGxlID9cblx0XHRcdFN1Z2dlc3Rpb25UeXBlLkFERElUSU9OIDpcblx0XHRcdFN1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTjtcblx0fVxuXG5cdHVud3JhcCgpIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0LnNsaWNlKDMsIHRoaXMuY2hhcl9taWRkbGUpICsgdGhpcy50ZXh0LnNsaWNlKHRoaXMuY2hhcl9taWRkbGUgKyAyLCAtMyk7XG5cdH1cblxuXHR1bndyYXBfcGFydHMoKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHRoaXMudGV4dC5zbGljZSgzLCB0aGlzLmNoYXJfbWlkZGxlKSxcblx0XHRcdHRoaXMudGV4dC5zbGljZSh0aGlzLmNoYXJfbWlkZGxlICsgMiwgLTMpLFxuXHRcdF07XG5cdH1cblxuXHR1bndyYXBfc2xpY2VfcGFydHNfaW52ZXJ0ZWQoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSB7XG5cdFx0ZnJvbSAtPSB0aGlzLnJhbmdlX2Zyb250O1xuXHRcdHRvIC09IHRoaXMucmFuZ2VfZnJvbnQ7XG5cblx0XHRmcm9tID0gTWF0aC5tYXgoMCwgZnJvbSk7XG5cblx0XHRpZiAodG8gPD0gMCkgcmV0dXJuIHRoaXMudW53cmFwX3BhcnRzKCk7XG5cdFx0aWYgKHRvIDw9IHRoaXMuY2hhcl9taWRkbGUpIHtcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdHRoaXMudGV4dC5zbGljZSgzLCBmcm9tKSArIHRoaXMudGV4dC5zbGljZSh0bywgdGhpcy5jaGFyX21pZGRsZSksXG5cdFx0XHRcdHRoaXMudGV4dC5zbGljZSh0aGlzLmNoYXJfbWlkZGxlICsgMiwgLTMpLFxuXHRcdFx0XTtcblx0XHR9XG5cdFx0aWYgKGZyb20gPj0gdGhpcy5jaGFyX21pZGRsZSArIDIpIHtcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdHRoaXMudGV4dC5zbGljZSgzLCB0aGlzLmNoYXJfbWlkZGxlKSxcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKHRoaXMuY2hhcl9taWRkbGUgKyAyLCBmcm9tKSArIHRoaXMudGV4dC5zbGljZSh0bywgLTMpLFxuXHRcdFx0XTtcblx0XHR9XG5cdFx0cmV0dXJuIFtcblx0XHRcdHRoaXMudGV4dC5zbGljZSgzLCBmcm9tKSxcblx0XHRcdHRoaXMudGV4dC5zbGljZSh0bywgLTMpLFxuXHRcdF07XG5cdH1cblxuXHR1bndyYXBfcGFydHNfYnJhY2tldChsZWZ0OiBib29sZWFuLCBvZmZzZXQgPSAwKSB7XG5cdFx0aWYgKGxlZnQpIHtcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdHRoaXMudGV4dC5zbGljZSgzLCB0aGlzLmNoYXJfbWlkZGxlKSxcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKHRoaXMuY2hhcl9taWRkbGUgKyAyKSxcblx0XHRcdF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdHRoaXMudGV4dC5zbGljZSgwLCB0aGlzLmNoYXJfbWlkZGxlKSxcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKHRoaXMuY2hhcl9taWRkbGUgKyAyLCAtMyksXG5cdFx0XHRdO1xuXHRcdH1cblx0fVxuXG5cdHVud3JhcF9zbGljZShmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpIHtcblx0XHRmcm9tIC09IHRoaXMucmFuZ2VfZnJvbnQ7XG5cdFx0dG8gLT0gdGhpcy5yYW5nZV9mcm9udDtcblx0XHRpZiAodG8gPD0gMCB8fCBmcm9tID09PSB0bykgcmV0dXJuIFwiXCI7XG5cblx0XHRpZiAoZnJvbSA+PSB0aGlzLmNoYXJfbWlkZGxlKVxuXHRcdFx0cmV0dXJuIHRoaXMudGV4dC5zbGljZShNYXRoLm1heCh0aGlzLmNoYXJfbWlkZGxlICsgMiwgZnJvbSksIE1hdGgubWluKHRoaXMudGV4dC5sZW5ndGggLSAzLCB0bykpO1xuXHRcdGlmICh0byA8PSB0aGlzLmNoYXJfbWlkZGxlKVxuXHRcdFx0cmV0dXJuIHRoaXMudGV4dC5zbGljZShNYXRoLm1heCgzLCBmcm9tKSwgTWF0aC5taW4odGhpcy5jaGFyX21pZGRsZSwgdG8pKTtcblx0XHRyZXR1cm4gdGhpcy50ZXh0LnNsaWNlKE1hdGgubWF4KDMsIGZyb20pLCB0aGlzLmNoYXJfbWlkZGxlKSArXG5cdFx0XHR0aGlzLnRleHQuc2xpY2UodGhpcy5jaGFyX21pZGRsZSArIDIsIE1hdGgubWluKHRoaXMudGV4dC5sZW5ndGggLSAzLCB0bykpO1xuXHR9XG5cblx0YWNjZXB0KCkge1xuXHRcdHJldHVybiB0aGlzLnVud3JhcF9wYXJ0cygpWzFdO1xuXHR9XG5cblx0cmVqZWN0KCkge1xuXHRcdHJldHVybiB0aGlzLnVud3JhcF9wYXJ0cygpWzBdO1xuXHR9XG5cblx0dG91Y2hlc19zZXBhcmF0b3IoY3Vyc29yOiBudW1iZXIsIGxlZnRfbG9vc2UgPSBmYWxzZSwgcmlnaHRfbG9vc2UgPSBmYWxzZSkge1xuXHRcdHJldHVybiBjdXJzb3IgKyAobGVmdF9sb29zZSA/IDEgOiAwKSA+PSB0aGlzLm1pZGRsZSAmJiBjdXJzb3IgLSAocmlnaHRfbG9vc2UgPyAwIDogMSkgPD0gdGhpcy5taWRkbGUgKyAyO1xuXHR9XG5cblx0Y29udGFpbnNfc2VwYXJhdG9yKGZyb206IG51bWJlciwgdG86IG51bWJlcikge1xuXHRcdHJldHVybiBmcm9tIDw9IHRoaXMubWlkZGxlICsgMiAmJiB0byA+PSB0aGlzLm1pZGRsZTtcblx0fVxuXG5cdGNvbnRhaW5zX3BhcnQoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCBzdHJpY3QgPSB0cnVlKSB7XG5cdFx0aWYgKHN0cmljdClcblx0XHRcdHJldHVybiB0byA8IHRoaXMubWlkZGxlID8gdHJ1ZSA6IGZyb20gPiB0aGlzLm1pZGRsZSArIDIgPyBmYWxzZSA6IHVuZGVmaW5lZDtcblx0XHRyZXR1cm4gdG8gPD0gdGhpcy5taWRkbGUgPyB0cnVlIDogZnJvbSA+PSB0aGlzLm1pZGRsZSArIDIgPyBmYWxzZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdGN1cnNvcl9wYXNzX3N5bnRheChjdXJzb3I6IG51bWJlciwgcmlnaHQ6IGJvb2xlYW4sIHNraXBfbWV0YWRhdGE6IGJvb2xlYW4gPSBmYWxzZSk6IG51bWJlciB7XG5cdFx0aWYgKHJpZ2h0KSB7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX2xlZnRfYnJhY2tldChjdXJzb3IsIHRydWUsIGZhbHNlLCBza2lwX21ldGFkYXRhKSlcblx0XHRcdFx0Y3Vyc29yID0gKHNraXBfbWV0YWRhdGEgJiYgdGhpcy5tZXRhZGF0YSkgPyAodGhpcy5tZXRhZGF0YSEgKyAyKSA6ICh0aGlzLmZyb20gKyAzKTtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfc2VwYXJhdG9yKGN1cnNvciwgZmFsc2UsIHRydWUpKVxuXHRcdFx0XHRjdXJzb3IgPSB0aGlzLm1pZGRsZSArIDI7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX3JpZ2h0X2JyYWNrZXQoY3Vyc29yLCBmYWxzZSwgdHJ1ZSkpXG5cdFx0XHRcdGN1cnNvciA9IHRoaXMudG87XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfcmlnaHRfYnJhY2tldChjdXJzb3IsIHRydWUsIGZhbHNlKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy50byAtIDM7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX3NlcGFyYXRvcihjdXJzb3IsIGZhbHNlLCB0cnVlKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy5taWRkbGU7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX2xlZnRfYnJhY2tldChjdXJzb3IsIGZhbHNlLCB0cnVlLCBza2lwX21ldGFkYXRhKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy5mcm9tO1xuXHRcdH1cblx0XHRyZXR1cm4gY3Vyc29yO1xuXHR9XG5cblx0cGFydF9lbmNsb3Nlc19yYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgbGVmdDogYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdGlmIChsZWZ0KVxuXHRcdFx0cmV0dXJuIHRoaXMuZnJvbSA8PSBzdGFydCAmJiBlbmQgPD0gdGhpcy5taWRkbGUgKyAyO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB0aGlzLm1pZGRsZSA8PSBzdGFydCAmJiBlbmQgPD0gdGhpcy50bztcblx0fVxuXG5cdGVtcHR5KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmZyb20gKyAzID09PSB0aGlzLm1pZGRsZSAmJiB0aGlzLm1pZGRsZSArIDIgPT09IHRoaXMudG8gLSAzO1xuXHR9XG5cblx0cGFydF9pc19lbXB0eShsZWZ0OiBib29sZWFuKSB7XG5cdFx0cmV0dXJuIGxlZnQgPyB0aGlzLmZyb20gKyAzID09PSB0aGlzLm1pZGRsZSA6IHRoaXMubWlkZGxlICsgMiA9PT0gdGhpcy50byAtIDM7XG5cdH1cblxuXHRwb3N0cHJvY2Vzcyhcblx0XHR1bndyYXA6IGJvb2xlYW4gPSB0cnVlLFxuXHRcdHByZXZpZXdNb2RlOiBQcmV2aWV3TW9kZSA9IFByZXZpZXdNb2RlLkFMTCxcblx0XHR0YWc6IGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcCA9IFwiZGl2XCIsXG5cdFx0bGVmdDogYm9vbGVhbiB8IG51bGwgPSBudWxsLFxuXHRcdHRleHQ/OiBzdHJpbmcsXG5cdCkge1xuXHRcdGxldCBzdHIgPSB0ZXh0ID8/IHRoaXMudGV4dDtcblx0XHRsZXQgcGFydHM6IHN0cmluZ1tdID0gW3N0cl07XG5cdFx0aWYgKCF0ZXh0ICYmIHVud3JhcCkge1xuXHRcdFx0Ly8gUmFuZ2UgaXMgbGFyZ2VyIHRoYW4gd2hhdCBpcyBhY3R1YWxseSBnaXZlbiAobm8gZW5kIGJyYWNrZXQgZm91bmQgd2l0aGluIHRleHQpXG5cdFx0XHRpZiAodGhpcy50byA+PSBzdHIubGVuZ3RoICYmICFzdHIuZW5kc1dpdGgoQ01fQWxsX0JyYWNrZXRzW1N1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTl1bMl0pKVxuXHRcdFx0XHRwYXJ0cyA9IHRoaXMudW53cmFwX3BhcnRzX2JyYWNrZXQodHJ1ZSk7XG5cdFx0XHRlbHNlIGlmICh0aGlzLmZyb20gPD0gMCAmJiAhc3RyLnN0YXJ0c1dpdGgoQ01fQWxsX0JyYWNrZXRzW1N1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTl1bMF0pKVxuXHRcdFx0XHRwYXJ0cyA9IHRoaXMudW53cmFwX3BhcnRzX2JyYWNrZXQoZmFsc2UpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRwYXJ0cyA9IHRoaXMudW53cmFwX3BhcnRzKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2xzID0gXCJjbXRyLXByZXZpZXdcIjtcblx0XHRpZiAocGFydHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRwYXJ0c1srKGxlZnQgYXMgYm9vbGVhbildID0gcGFydHNbMF07XG5cdFx0XHRwYXJ0c1srIWxlZnRdID0gXCJcIjtcblx0XHR9XG5cblx0XHRzdHIgPSBcIlwiO1xuXHRcdGlmIChwcmV2aWV3TW9kZSA9PT0gUHJldmlld01vZGUuQUxMKSB7XG5cdFx0XHRpZiAocGFydHNbMF0ubGVuZ3RoKVxuXHRcdFx0XHRzdHIgKz0gYDwke3RhZ30gY2xhc3M9JyR7Y2xzfSBjbXRyLWRlbGV0aW9uJz4ke3BhcnRzWzBdfTwvJHt0YWd9PmA7XG5cdFx0XHRpZiAocGFydHNbMV0ubGVuZ3RoKVxuXHRcdFx0XHRzdHIgKz0gYDwke3RhZ30gY2xhc3M9JyR7Y2xzfSBjbXRyLWFkZGl0aW9uJz4ke3BhcnRzWzFdfTwvJHt0YWd9PmA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChwcmV2aWV3TW9kZSA9PT0gUHJldmlld01vZGUuQUNDRVBUKSB7XG5cdFx0XHRcdGlmIChwYXJ0c1sxXS5sZW5ndGgpXG5cdFx0XHRcdFx0c3RyICs9IGA8JHt0YWd9IGNsYXNzPScke2Nsc30nPiR7cGFydHNbMV19PC8ke3RhZ30+YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChwYXJ0c1swXS5sZW5ndGgpXG5cdFx0XHRcdFx0c3RyICs9IGA8JHt0YWd9IGNsYXNzPScke2Nsc30nPiR7cGFydHNbMF19PC8ke3RhZ30+YDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHN0cjtcblx0fVxuXG5cdGFwcGx5X29mZnNldChvZmZzZXQ6IG51bWJlcikge1xuXHRcdHRoaXMuZnJvbSArPSBvZmZzZXQ7XG5cdFx0dGhpcy5taWRkbGUgKz0gb2Zmc2V0O1xuXHRcdHRoaXMudG8gKz0gb2Zmc2V0O1xuXHRcdGlmICh0aGlzLm1ldGFkYXRhICE9PSB1bmRlZmluZWQpIHRoaXMubWV0YWRhdGEgKz0gb2Zmc2V0O1xuXHR9XG5cblx0c3BsaXRfcmFuZ2UoY3Vyc29yOiBudW1iZXIpOiBbc3RyaW5nLCBzdHJpbmddIHtcblx0XHRjb25zdCByYW5nZSA9IHN1cGVyLnNwbGl0X3JhbmdlKGN1cnNvcik7XG5cdFx0aWYgKGN1cnNvciA8PSB0aGlzLm1pZGRsZSlcblx0XHRcdHJhbmdlWzBdID0gQ01fQWxsX0JyYWNrZXRzLnN1YnN0aXR1dGlvblsxXSArIHJhbmdlWzBdO1xuXHRcdGVsc2Vcblx0XHRcdHJhbmdlWzFdID0gcmFuZ2VbMV0gKyBDTV9BbGxfQnJhY2tldHMuc3Vic3RpdHV0aW9uWzFdO1xuXHRcdHJldHVybiByYW5nZTtcblx0fVxuXG5cdGN1cnNvcl9tb3ZlX2luc2lkZShjdXJzb3I6IG51bWJlciwgc2tpcF9tZXRhZGF0YSA9IGZhbHNlKSB7XG5cdFx0Y3Vyc29yID0gc3VwZXIuY3Vyc29yX21vdmVfaW5zaWRlKGN1cnNvciwgc2tpcF9tZXRhZGF0YSk7XG5cdFx0aWYgKGN1cnNvciA9PSB0aGlzLm1pZGRsZSArIDEpXG5cdFx0XHRjdXJzb3IgPSB0aGlzLm1pZGRsZSArIDI7XG5cdFx0cmV0dXJuIGN1cnNvcjtcblx0fVxufVxuIiwgIi8vIFRoZXNlIGFyZSBmaWxsZWQgd2l0aCByYW5nZXMgKHJhbmdlRnJvbVtpXSB1cCB0byBidXQgbm90IGluY2x1ZGluZ1xuLy8gcmFuZ2VUb1tpXSkgb2YgY29kZSBwb2ludHMgdGhhdCBjb3VudCBhcyBleHRlbmRpbmcgY2hhcmFjdGVycy5cbmxldCByYW5nZUZyb20gPSBbXSwgcmFuZ2VUbyA9IFtdXG5cbjsoKCkgPT4ge1xuICAvLyBDb21wcmVzc2VkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBHcmFwaGVtZV9DbHVzdGVyX0JyZWFrPUV4dGVuZFxuICAvLyBpbmZvcm1hdGlvbiBmcm9tXG4gIC8vIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzE2LjAuMC91Y2QvYXV4aWxpYXJ5L0dyYXBoZW1lQnJlYWtQcm9wZXJ0eS50eHQuXG4gIC8vIEVhY2ggcGFpciBvZiBlbGVtZW50cyByZXByZXNlbnRzIGEgcmFuZ2UsIGFzIGFuIG9mZmV0IGZyb20gdGhlXG4gIC8vIHByZXZpb3VzIHJhbmdlIGFuZCBhIGxlbmd0aC4gTnVtYmVycyBhcmUgaW4gYmFzZS0zNiwgd2l0aCB0aGUgZW1wdHlcbiAgLy8gc3RyaW5nIGJlaW5nIGEgc2hvcnRoYW5kIGZvciAxLlxuICBsZXQgbnVtYmVycyA9IFwibGMsMzQsN24sNyw3YiwxOSwsLCwyLCwyLCwsMjAsYiwxYyxsLGcsLDJ0LDcsMiw2LDIsMiwsNCx6LCx1LHIsMmosYiwxbSw5LDksLG8sNCwsOSwsMywsNSwxNywzLDNiLGYsLHcsMWosLCwsNCw4LDQsLDMsNyxhLDIsdCwsMW0sLCwsMiw0LDgsLDksLGEsMixxLCwyLDIsMWwsLDQsMiw0LDIsMiwzLDMsLHUsMiwzLCxiLDIsMWwsLDQsNSwsMiw0LCxrLDIsbSw2LCwsMW0sLCwyLCw0LDgsLDcsMyxhLDIsdSwsMW4sLCwsYywsOSwsMTQsLDMsLDFsLDMsNSwzLCw0LDcsMixiLDIsdCwsMW0sLDIsLDIsLDMsLDUsMiw3LDIsYiwyLHMsMiwxbCwyLCwsMiw0LDgsLDksLGEsMix0LCwyMCwsNCwsMiwzLCwsOCwsMjksLDIsNyxjLDgsMnEsLDIsOSxiLDYsMjIsMixyLCwsLCwsMWosZSwsNSwsMiw1LGIsLDEwLDksLDJ1LDQsLDYsLDIsMiwyLHAsMiw0LDMsZyw0LGQsLDIsMiw2LCxmLCxqaiwzLHFhLDMsdCwzLHQsMix1LDIsMXMsMiwsNyw4LCwyLGIsOSwsMTksMywzYiwyLHksLDNhLDMsNCwyLDksLDYsMyw2MywyLDIsLDFtLCwsNywsLCwsMiw4LDYsYSwyLCwxYyxoLDFyLDQsMWMsNywsLDUsLDE0LDksYywyLHcsNCwyLDIsLDMsMWssLCwyLDMsLCwzLDFtLDgsMiwyLDQ4LDMsLGQsLDcsNCwsNiwsMywyLDVpLDFtLCw1LGVrLCw1Zix4LDJkYSwzLDN4LCwybyx3LGZlLDYsMngsMixuOXcsNCwsYSx3LDIsMjgsMiw3aywsMywsNCwscCwyLDUsLDQ3LDIscSxpLGQsLDEyLDgscCxiLDFhLDMsMWMsLDIsNCwyLDIsMTMsLDF2LDYsMiwyLDIsMixjLCw4LCwxYiwsMWYsLCwzLDIsMiw1LDIsLCwxNiwyLDgsLDZtLCwyLCw0LCxmbjQsLGtoLGcsZyxnLGE2LDIsZ3QsLDZhLCw0NSw1LDFhZSwzLCwyLDUsNCwxNCwzLDQsLDRsLDIsZngsNCxhciwyLDQ5LGIsNHcsLDFpLGYsMWssMywxZCw0LDIsMiwxeCwzLDEwLDUsLDgsMXEsLGMsMiwxZyw5LGEsNCwyLCwybiwzLDIsLCwyLDYsLDRnLCwzLDgsbCwyLDFsLDIsLCwsLG0sLGUsNywzLDUsNWYsOCwyLDMsLCxuLCwyOSwsMiw2LCwsMiwsLDIsLDIsNmosLDIsNCw2LDIsLDIsciwyLDJkLDgsMiwsLDIsMnksLCwsMiw2LCwsMnQsMywyLDQsLDUsNzcsOSwsMiw2dCwsYSwyLCwsNCwsNDAsNCwyLDIsNCwsdyxhLDE0LDYsMiw0LDgsLDksNiwyLDMsMWEsZCwsMixiYSw3LCw2LCwsMmEsbSwyLDcsLDIsLDIsM2UsNiwzLCwsMiwsNywsLDIwLDIsMywsLCw5biwyLGYwYiw1LDFuLDcsdDQsLDFyLDQsMjksLGY1aywyLDQzcSwsLDMsNCw1LDgsOCwyLDcsdSw0LDQ0LDMsMWl6LDFqLDQsMWUsOCwsZSwsbSw1LCxmLDExcyw3LCxoLDIsNywsMiwsNSw3OSw3LGM1LDQsMTVzLDcsMzEsNywyNDAsNSxneDdrLDJvLDNrLDZvXCIuc3BsaXQoXCIsXCIpLm1hcChzID0+IHMgPyBwYXJzZUludChzLCAzNikgOiAxKVxuICBmb3IgKGxldCBpID0gMCwgbiA9IDA7IGkgPCBudW1iZXJzLmxlbmd0aDsgaSsrKVxuICAgIChpICUgMiA/IHJhbmdlVG8gOiByYW5nZUZyb20pLnB1c2gobiA9IG4gKyBudW1iZXJzW2ldKVxufSkoKVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFeHRlbmRpbmdDaGFyKGNvZGUpIHtcbiAgaWYgKGNvZGUgPCA3NjgpIHJldHVybiBmYWxzZVxuICBmb3IgKGxldCBmcm9tID0gMCwgdG8gPSByYW5nZUZyb20ubGVuZ3RoOzspIHtcbiAgICBsZXQgbWlkID0gKGZyb20gKyB0bykgPj4gMVxuICAgIGlmIChjb2RlIDwgcmFuZ2VGcm9tW21pZF0pIHRvID0gbWlkXG4gICAgZWxzZSBpZiAoY29kZSA+PSByYW5nZVRvW21pZF0pIGZyb20gPSBtaWQgKyAxXG4gICAgZWxzZSByZXR1cm4gdHJ1ZVxuICAgIGlmIChmcm9tID09IHRvKSByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1JlZ2lvbmFsSW5kaWNhdG9yKGNvZGUpIHtcbiAgcmV0dXJuIGNvZGUgPj0gMHgxRjFFNiAmJiBjb2RlIDw9IDB4MUYxRkZcbn1cblxuZnVuY3Rpb24gY2hlY2soY29kZSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlRnJvbS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyYW5nZVRvW2ldID4gY29kZSkgcmV0dXJuIHJhbmdlRnJvbVtpXSA8PSBjb2RlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IFpXSiA9IDB4MjAwZFxuXG5leHBvcnQgZnVuY3Rpb24gZmluZENsdXN0ZXJCcmVhayhzdHIsIHBvcywgZm9yd2FyZCA9IHRydWUsIGluY2x1ZGVFeHRlbmRpbmcgPSB0cnVlKSB7XG4gIHJldHVybiAoZm9yd2FyZCA/IG5leHRDbHVzdGVyQnJlYWsgOiBwcmV2Q2x1c3RlckJyZWFrKShzdHIsIHBvcywgaW5jbHVkZUV4dGVuZGluZylcbn1cblxuZnVuY3Rpb24gbmV4dENsdXN0ZXJCcmVhayhzdHIsIHBvcywgaW5jbHVkZUV4dGVuZGluZykge1xuICBpZiAocG9zID09IHN0ci5sZW5ndGgpIHJldHVybiBwb3NcbiAgLy8gSWYgcG9zIGlzIGluIHRoZSBtaWRkbGUgb2YgYSBzdXJyb2dhdGUgcGFpciwgbW92ZSB0byBpdHMgc3RhcnRcbiAgaWYgKHBvcyAmJiBzdXJyb2dhdGVMb3coc3RyLmNoYXJDb2RlQXQocG9zKSkgJiYgc3Vycm9nYXRlSGlnaChzdHIuY2hhckNvZGVBdChwb3MgLSAxKSkpIHBvcy0tXG4gIGxldCBwcmV2ID0gY29kZVBvaW50QXQoc3RyLCBwb3MpXG4gIHBvcyArPSBjb2RlUG9pbnRTaXplKHByZXYpXG4gIHdoaWxlIChwb3MgPCBzdHIubGVuZ3RoKSB7XG4gICAgbGV0IG5leHQgPSBjb2RlUG9pbnRBdChzdHIsIHBvcylcbiAgICBpZiAocHJldiA9PSBaV0ogfHwgbmV4dCA9PSBaV0ogfHwgaW5jbHVkZUV4dGVuZGluZyAmJiBpc0V4dGVuZGluZ0NoYXIobmV4dCkpIHtcbiAgICAgIHBvcyArPSBjb2RlUG9pbnRTaXplKG5leHQpXG4gICAgICBwcmV2ID0gbmV4dFxuICAgIH0gZWxzZSBpZiAoaXNSZWdpb25hbEluZGljYXRvcihuZXh0KSkge1xuICAgICAgbGV0IGNvdW50QmVmb3JlID0gMCwgaSA9IHBvcyAtIDJcbiAgICAgIHdoaWxlIChpID49IDAgJiYgaXNSZWdpb25hbEluZGljYXRvcihjb2RlUG9pbnRBdChzdHIsIGkpKSkgeyBjb3VudEJlZm9yZSsrOyBpIC09IDIgfVxuICAgICAgaWYgKGNvdW50QmVmb3JlICUgMiA9PSAwKSBicmVha1xuICAgICAgZWxzZSBwb3MgKz0gMlxuICAgIH0gZWxzZSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gcG9zXG59XG5cbmZ1bmN0aW9uIHByZXZDbHVzdGVyQnJlYWsoc3RyLCBwb3MsIGluY2x1ZGVFeHRlbmRpbmcpIHtcbiAgd2hpbGUgKHBvcyA+IDApIHtcbiAgICBsZXQgZm91bmQgPSBuZXh0Q2x1c3RlckJyZWFrKHN0ciwgcG9zIC0gMiwgaW5jbHVkZUV4dGVuZGluZylcbiAgICBpZiAoZm91bmQgPCBwb3MpIHJldHVybiBmb3VuZFxuICAgIHBvcy0tXG4gIH1cbiAgcmV0dXJuIDBcbn1cblxuZnVuY3Rpb24gY29kZVBvaW50QXQoc3RyLCBwb3MpIHtcbiAgbGV0IGNvZGUwID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICBpZiAoIXN1cnJvZ2F0ZUhpZ2goY29kZTApIHx8IHBvcyArIDEgPT0gc3RyLmxlbmd0aCkgcmV0dXJuIGNvZGUwXG4gIGxldCBjb2RlMSA9IHN0ci5jaGFyQ29kZUF0KHBvcyArIDEpXG4gIGlmICghc3Vycm9nYXRlTG93KGNvZGUxKSkgcmV0dXJuIGNvZGUwXG4gIHJldHVybiAoKGNvZGUwIC0gMHhkODAwKSA8PCAxMCkgKyAoY29kZTEgLSAweGRjMDApICsgMHgxMDAwMFxufVxuXG5mdW5jdGlvbiBzdXJyb2dhdGVMb3coY2gpIHsgcmV0dXJuIGNoID49IDB4REMwMCAmJiBjaCA8IDB4RTAwMCB9XG5mdW5jdGlvbiBzdXJyb2dhdGVIaWdoKGNoKSB7IHJldHVybiBjaCA+PSAweEQ4MDAgJiYgY2ggPCAweERDMDAgfVxuZnVuY3Rpb24gY29kZVBvaW50U2l6ZShjb2RlKSB7IHJldHVybiBjb2RlIDwgMHgxMDAwMCA/IDEgOiAyIH1cbiIsICJpbXBvcnQgeyBmaW5kQ2x1c3RlckJyZWFrIGFzIGZpbmRDbHVzdGVyQnJlYWskMSB9IGZyb20gJ0BtYXJpam4vZmluZC1jbHVzdGVyLWJyZWFrJztcblxuLyoqXG5UaGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGRvY3VtZW50cy4gQG5vbmFic3RyYWN0XG4qL1xuY2xhc3MgVGV4dCB7XG4gICAgLyoqXG4gICAgR2V0IHRoZSBsaW5lIGRlc2NyaXB0aW9uIGFyb3VuZCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBsaW5lQXQocG9zKSB7XG4gICAgICAgIGlmIChwb3MgPCAwIHx8IHBvcyA+IHRoaXMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgcG9zaXRpb24gJHtwb3N9IGluIGRvY3VtZW50IG9mIGxlbmd0aCAke3RoaXMubGVuZ3RofWApO1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lSW5uZXIocG9zLCBmYWxzZSwgMSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBnaXZlbiAoMS1iYXNlZCkgbGluZSBudW1iZXIuXG4gICAgKi9cbiAgICBsaW5lKG4pIHtcbiAgICAgICAgaWYgKG4gPCAxIHx8IG4gPiB0aGlzLmxpbmVzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgbGluZSBudW1iZXIgJHtufSBpbiAke3RoaXMubGluZXN9LWxpbmUgZG9jdW1lbnRgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZUlubmVyKG4sIHRydWUsIDEsIDApO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIGEgcmFuZ2Ugb2YgdGhlIHRleHQgd2l0aCB0aGUgZ2l2ZW4gY29udGVudC5cbiAgICAqL1xuICAgIHJlcGxhY2UoZnJvbSwgdG8sIHRleHQpIHtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBsZXQgcGFydHMgPSBbXTtcbiAgICAgICAgdGhpcy5kZWNvbXBvc2UoMCwgZnJvbSwgcGFydHMsIDIgLyogT3Blbi5UbyAqLyk7XG4gICAgICAgIGlmICh0ZXh0Lmxlbmd0aClcbiAgICAgICAgICAgIHRleHQuZGVjb21wb3NlKDAsIHRleHQubGVuZ3RoLCBwYXJ0cywgMSAvKiBPcGVuLkZyb20gKi8gfCAyIC8qIE9wZW4uVG8gKi8pO1xuICAgICAgICB0aGlzLmRlY29tcG9zZSh0bywgdGhpcy5sZW5ndGgsIHBhcnRzLCAxIC8qIE9wZW4uRnJvbSAqLyk7XG4gICAgICAgIHJldHVybiBUZXh0Tm9kZS5mcm9tKHBhcnRzLCB0aGlzLmxlbmd0aCAtICh0byAtIGZyb20pICsgdGV4dC5sZW5ndGgpO1xuICAgIH1cbiAgICAvKipcbiAgICBBcHBlbmQgYW5vdGhlciBkb2N1bWVudCB0byB0aGlzIG9uZS5cbiAgICAqL1xuICAgIGFwcGVuZChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlKHRoaXMubGVuZ3RoLCB0aGlzLmxlbmd0aCwgb3RoZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZSB0aGUgdGV4dCBiZXR3ZWVuIHRoZSBnaXZlbiBwb2ludHMuXG4gICAgKi9cbiAgICBzbGljZShmcm9tLCB0byA9IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgbGV0IHBhcnRzID0gW107XG4gICAgICAgIHRoaXMuZGVjb21wb3NlKGZyb20sIHRvLCBwYXJ0cywgMCk7XG4gICAgICAgIHJldHVybiBUZXh0Tm9kZS5mcm9tKHBhcnRzLCB0byAtIGZyb20pO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhpcyB0ZXh0IGlzIGVxdWFsIHRvIGFub3RoZXIgaW5zdGFuY2UuXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgPT0gdGhpcylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAob3RoZXIubGVuZ3RoICE9IHRoaXMubGVuZ3RoIHx8IG90aGVyLmxpbmVzICE9IHRoaXMubGluZXMpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBzdGFydCA9IHRoaXMuc2NhbklkZW50aWNhbChvdGhlciwgMSksIGVuZCA9IHRoaXMubGVuZ3RoIC0gdGhpcy5zY2FuSWRlbnRpY2FsKG90aGVyLCAtMSk7XG4gICAgICAgIGxldCBhID0gbmV3IFJhd1RleHRDdXJzb3IodGhpcyksIGIgPSBuZXcgUmF3VGV4dEN1cnNvcihvdGhlcik7XG4gICAgICAgIGZvciAobGV0IHNraXAgPSBzdGFydCwgcG9zID0gc3RhcnQ7Oykge1xuICAgICAgICAgICAgYS5uZXh0KHNraXApO1xuICAgICAgICAgICAgYi5uZXh0KHNraXApO1xuICAgICAgICAgICAgc2tpcCA9IDA7XG4gICAgICAgICAgICBpZiAoYS5saW5lQnJlYWsgIT0gYi5saW5lQnJlYWsgfHwgYS5kb25lICE9IGIuZG9uZSB8fCBhLnZhbHVlICE9IGIudmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcG9zICs9IGEudmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGEuZG9uZSB8fCBwb3MgPj0gZW5kKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgdGV4dC4gV2hlbiBgZGlyYCBpcyBgLTFgLCBpdGVyYXRpb24gaGFwcGVuc1xuICAgIGZyb20gZW5kIHRvIHN0YXJ0LiBUaGlzIHdpbGwgcmV0dXJuIGxpbmVzIGFuZCB0aGUgYnJlYWtzIGJldHdlZW5cbiAgICB0aGVtIGFzIHNlcGFyYXRlIHN0cmluZ3MuXG4gICAgKi9cbiAgICBpdGVyKGRpciA9IDEpIHsgcmV0dXJuIG5ldyBSYXdUZXh0Q3Vyc29yKHRoaXMsIGRpcik7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgYSByYW5nZSBvZiB0aGUgdGV4dC4gV2hlbiBgZnJvbWAgPiBgdG9gLCB0aGVcbiAgICBpdGVyYXRvciB3aWxsIHJ1biBpbiByZXZlcnNlLlxuICAgICovXG4gICAgaXRlclJhbmdlKGZyb20sIHRvID0gdGhpcy5sZW5ndGgpIHsgcmV0dXJuIG5ldyBQYXJ0aWFsVGV4dEN1cnNvcih0aGlzLCBmcm9tLCB0byk7IH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBjdXJzb3IgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSBnaXZlbiByYW5nZSBvZiBsaW5lcyxcbiAgICBfd2l0aG91dF8gcmV0dXJuaW5nIHRoZSBsaW5lIGJyZWFrcyBiZXR3ZWVuLCBhbmQgeWllbGRpbmcgZW1wdHlcbiAgICBzdHJpbmdzIGZvciBlbXB0eSBsaW5lcy5cbiAgICBcbiAgICBXaGVuIGBmcm9tYCBhbmQgYHRvYCBhcmUgZ2l2ZW4sIHRoZXkgc2hvdWxkIGJlIDEtYmFzZWQgbGluZSBudW1iZXJzLlxuICAgICovXG4gICAgaXRlckxpbmVzKGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBpbm5lcjtcbiAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkge1xuICAgICAgICAgICAgaW5uZXIgPSB0aGlzLml0ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0byA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHRvID0gdGhpcy5saW5lcyArIDE7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmxpbmUoZnJvbSkuZnJvbTtcbiAgICAgICAgICAgIGlubmVyID0gdGhpcy5pdGVyUmFuZ2Uoc3RhcnQsIE1hdGgubWF4KHN0YXJ0LCB0byA9PSB0aGlzLmxpbmVzICsgMSA/IHRoaXMubGVuZ3RoIDogdG8gPD0gMSA/IDAgOiB0aGlzLmxpbmUodG8gLSAxKS50bykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTGluZUN1cnNvcihpbm5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgZG9jdW1lbnQgYXMgYSBzdHJpbmcsIHVzaW5nIG5ld2xpbmUgY2hhcmFjdGVycyB0b1xuICAgIHNlcGFyYXRlIGxpbmVzLlxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiB0aGlzLnNsaWNlU3RyaW5nKDApOyB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGUgZG9jdW1lbnQgdG8gYW4gYXJyYXkgb2YgbGluZXMgKHdoaWNoIGNhbiBiZVxuICAgIGRlc2VyaWFsaXplZCBhZ2FpbiB2aWEgW2BUZXh0Lm9mYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UZXh0Xm9mKSkuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBsaW5lcyA9IFtdO1xuICAgICAgICB0aGlzLmZsYXR0ZW4obGluZXMpO1xuICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBgVGV4dGAgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBhcnJheSBvZiBsaW5lcy5cbiAgICAqL1xuICAgIHN0YXRpYyBvZih0ZXh0KSB7XG4gICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBIGRvY3VtZW50IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbGluZVwiKTtcbiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDEgJiYgIXRleHRbMF0pXG4gICAgICAgICAgICByZXR1cm4gVGV4dC5lbXB0eTtcbiAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoIDw9IDMyIC8qIFRyZWUuQnJhbmNoICovID8gbmV3IFRleHRMZWFmKHRleHQpIDogVGV4dE5vZGUuZnJvbShUZXh0TGVhZi5zcGxpdCh0ZXh0LCBbXSkpO1xuICAgIH1cbn1cbi8vIExlYXZlcyBzdG9yZSBhbiBhcnJheSBvZiBsaW5lIHN0cmluZ3MuIFRoZXJlIGFyZSBhbHdheXMgbGluZSBicmVha3Ncbi8vIGJldHdlZW4gdGhlc2Ugc3RyaW5ncy4gTGVhdmVzIGFyZSBsaW1pdGVkIGluIHNpemUgYW5kIGhhdmUgdG8gYmVcbi8vIGNvbnRhaW5lZCBpbiBUZXh0Tm9kZSBpbnN0YW5jZXMgZm9yIGJpZ2dlciBkb2N1bWVudHMuXG5jbGFzcyBUZXh0TGVhZiBleHRlbmRzIFRleHQge1xuICAgIGNvbnN0cnVjdG9yKHRleHQsIGxlbmd0aCA9IHRleHRMZW5ndGgodGV4dCkpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgfVxuICAgIGdldCBsaW5lcygpIHsgcmV0dXJuIHRoaXMudGV4dC5sZW5ndGg7IH1cbiAgICBnZXQgY2hpbGRyZW4oKSB7IHJldHVybiBudWxsOyB9XG4gICAgbGluZUlubmVyKHRhcmdldCwgaXNMaW5lLCBsaW5lLCBvZmZzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdHJpbmcgPSB0aGlzLnRleHRbaV0sIGVuZCA9IG9mZnNldCArIHN0cmluZy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoKGlzTGluZSA/IGxpbmUgOiBlbmQpID49IHRhcmdldClcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpbmUob2Zmc2V0LCBlbmQsIGxpbmUsIHN0cmluZyk7XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQgKyAxO1xuICAgICAgICAgICAgbGluZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlY29tcG9zZShmcm9tLCB0bywgdGFyZ2V0LCBvcGVuKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gZnJvbSA8PSAwICYmIHRvID49IHRoaXMubGVuZ3RoID8gdGhpc1xuICAgICAgICAgICAgOiBuZXcgVGV4dExlYWYoc2xpY2VUZXh0KHRoaXMudGV4dCwgZnJvbSwgdG8pLCBNYXRoLm1pbih0bywgdGhpcy5sZW5ndGgpIC0gTWF0aC5tYXgoMCwgZnJvbSkpO1xuICAgICAgICBpZiAob3BlbiAmIDEgLyogT3Blbi5Gcm9tICovKSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IHRhcmdldC5wb3AoKTtcbiAgICAgICAgICAgIGxldCBqb2luZWQgPSBhcHBlbmRUZXh0KHRleHQudGV4dCwgcHJldi50ZXh0LnNsaWNlKCksIDAsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChqb2luZWQubGVuZ3RoIDw9IDMyIC8qIFRyZWUuQnJhbmNoICovKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2gobmV3IFRleHRMZWFmKGpvaW5lZCwgcHJldi5sZW5ndGggKyB0ZXh0Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1pZCA9IGpvaW5lZC5sZW5ndGggPj4gMTtcbiAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChuZXcgVGV4dExlYWYoam9pbmVkLnNsaWNlKDAsIG1pZCkpLCBuZXcgVGV4dExlYWYoam9pbmVkLnNsaWNlKG1pZCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHRleHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UoZnJvbSwgdG8sIHRleHQpIHtcbiAgICAgICAgaWYgKCEodGV4dCBpbnN0YW5jZW9mIFRleHRMZWFmKSlcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKGZyb20sIHRvLCB0ZXh0KTtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBsZXQgbGluZXMgPSBhcHBlbmRUZXh0KHRoaXMudGV4dCwgYXBwZW5kVGV4dCh0ZXh0LnRleHQsIHNsaWNlVGV4dCh0aGlzLnRleHQsIDAsIGZyb20pKSwgdG8pO1xuICAgICAgICBsZXQgbmV3TGVuID0gdGhpcy5sZW5ndGggKyB0ZXh0Lmxlbmd0aCAtICh0byAtIGZyb20pO1xuICAgICAgICBpZiAobGluZXMubGVuZ3RoIDw9IDMyIC8qIFRyZWUuQnJhbmNoICovKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0TGVhZihsaW5lcywgbmV3TGVuKTtcbiAgICAgICAgcmV0dXJuIFRleHROb2RlLmZyb20oVGV4dExlYWYuc3BsaXQobGluZXMsIFtdKSwgbmV3TGVuKTtcbiAgICB9XG4gICAgc2xpY2VTdHJpbmcoZnJvbSwgdG8gPSB0aGlzLmxlbmd0aCwgbGluZVNlcCA9IFwiXFxuXCIpIHtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gMCwgaSA9IDA7IHBvcyA8PSB0byAmJiBpIDwgdGhpcy50ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHRoaXMudGV4dFtpXSwgZW5kID0gcG9zICsgbGluZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAocG9zID4gZnJvbSAmJiBpKVxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsaW5lU2VwO1xuICAgICAgICAgICAgaWYgKGZyb20gPCBlbmQgJiYgdG8gPiBwb3MpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUuc2xpY2UoTWF0aC5tYXgoMCwgZnJvbSAtIHBvcyksIHRvIC0gcG9zKTtcbiAgICAgICAgICAgIHBvcyA9IGVuZCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZmxhdHRlbih0YXJnZXQpIHtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiB0aGlzLnRleHQpXG4gICAgICAgICAgICB0YXJnZXQucHVzaChsaW5lKTtcbiAgICB9XG4gICAgc2NhbklkZW50aWNhbCgpIHsgcmV0dXJuIDA7IH1cbiAgICBzdGF0aWMgc3BsaXQodGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBwYXJ0ID0gW10sIGxlbiA9IC0xO1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHRleHQpIHtcbiAgICAgICAgICAgIHBhcnQucHVzaChsaW5lKTtcbiAgICAgICAgICAgIGxlbiArPSBsaW5lLmxlbmd0aCArIDE7XG4gICAgICAgICAgICBpZiAocGFydC5sZW5ndGggPT0gMzIgLyogVHJlZS5CcmFuY2ggKi8pIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChuZXcgVGV4dExlYWYocGFydCwgbGVuKSk7XG4gICAgICAgICAgICAgICAgcGFydCA9IFtdO1xuICAgICAgICAgICAgICAgIGxlbiA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsZW4gPiAtMSlcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKG5ldyBUZXh0TGVhZihwYXJ0LCBsZW4pKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG59XG4vLyBOb2RlcyBwcm92aWRlIHRoZSB0cmVlIHN0cnVjdHVyZSBvZiB0aGUgYFRleHRgIHR5cGUuIFRoZXkgc3RvcmUgYVxuLy8gbnVtYmVyIG9mIG90aGVyIG5vZGVzIG9yIGxlYXZlcywgdGFraW5nIGNhcmUgdG8gYmFsYW5jZSB0aGVtc2VsdmVzXG4vLyBvbiBjaGFuZ2VzLiBUaGVyZSBhcmUgaW1wbGllZCBsaW5lIGJyZWFrcyBfYmV0d2Vlbl8gdGhlIGNoaWxkcmVuIG9mXG4vLyBhIG5vZGUgKGJ1dCBub3QgYmVmb3JlIHRoZSBmaXJzdCBvciBhZnRlciB0aGUgbGFzdCBjaGlsZCkuXG5jbGFzcyBUZXh0Tm9kZSBleHRlbmRzIFRleHQge1xuICAgIGNvbnN0cnVjdG9yKGNoaWxkcmVuLCBsZW5ndGgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5saW5lcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKVxuICAgICAgICAgICAgdGhpcy5saW5lcyArPSBjaGlsZC5saW5lcztcbiAgICB9XG4gICAgbGluZUlubmVyKHRhcmdldCwgaXNMaW5lLCBsaW5lLCBvZmZzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZnNldCArIGNoaWxkLmxlbmd0aCwgZW5kTGluZSA9IGxpbmUgKyBjaGlsZC5saW5lcyAtIDE7XG4gICAgICAgICAgICBpZiAoKGlzTGluZSA/IGVuZExpbmUgOiBlbmQpID49IHRhcmdldClcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQubGluZUlubmVyKHRhcmdldCwgaXNMaW5lLCBsaW5lLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kICsgMTtcbiAgICAgICAgICAgIGxpbmUgPSBlbmRMaW5lICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWNvbXBvc2UoZnJvbSwgdG8sIHRhcmdldCwgb3Blbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgcG9zIDw9IHRvICYmIGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBwb3MgKyBjaGlsZC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZnJvbSA8PSBlbmQgJiYgdG8gPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkT3BlbiA9IG9wZW4gJiAoKHBvcyA8PSBmcm9tID8gMSAvKiBPcGVuLkZyb20gKi8gOiAwKSB8IChlbmQgPj0gdG8gPyAyIC8qIE9wZW4uVG8gKi8gOiAwKSk7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBmcm9tICYmIGVuZCA8PSB0byAmJiAhY2hpbGRPcGVuKVxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5kZWNvbXBvc2UoZnJvbSAtIHBvcywgdG8gLSBwb3MsIHRhcmdldCwgY2hpbGRPcGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcyA9IGVuZCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShmcm9tLCB0bywgdGV4dCkge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGlmICh0ZXh0LmxpbmVzIDwgdGhpcy5saW5lcylcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAvLyBGYXN0IHBhdGg6IGlmIHRoZSBjaGFuZ2Ugb25seSBhZmZlY3RzIG9uZSBjaGlsZCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgLy8gY2hpbGQncyBzaXplIHJlbWFpbnMgaW4gdGhlIGFjY2VwdGFibGUgcmFuZ2UsIG9ubHkgdXBkYXRlXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBjaGlsZFxuICAgICAgICAgICAgICAgIGlmIChmcm9tID49IHBvcyAmJiB0byA8PSBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSBjaGlsZC5yZXBsYWNlKGZyb20gLSBwb3MsIHRvIC0gcG9zLCB0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsTGluZXMgPSB0aGlzLmxpbmVzIC0gY2hpbGQubGluZXMgKyB1cGRhdGVkLmxpbmVzO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZC5saW5lcyA8ICh0b3RhbExpbmVzID4+ICg1IC8qIFRyZWUuQnJhbmNoU2hpZnQgKi8gLSAxKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQubGluZXMgPiAodG90YWxMaW5lcyA+PiAoNSAvKiBUcmVlLkJyYW5jaFNoaWZ0ICovICsgMSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29weSA9IHRoaXMuY2hpbGRyZW4uc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlbaV0gPSB1cGRhdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0Tm9kZShjb3B5LCB0aGlzLmxlbmd0aCAtICh0byAtIGZyb20pICsgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKHBvcywgZW5kLCB1cGRhdGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2UoZnJvbSwgdG8sIHRleHQpO1xuICAgIH1cbiAgICBzbGljZVN0cmluZyhmcm9tLCB0byA9IHRoaXMubGVuZ3RoLCBsaW5lU2VwID0gXCJcXG5cIikge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoICYmIHBvcyA8PSB0bzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBwb3MgKyBjaGlsZC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAocG9zID4gZnJvbSAmJiBpKVxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsaW5lU2VwO1xuICAgICAgICAgICAgaWYgKGZyb20gPCBlbmQgJiYgdG8gPiBwb3MpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNoaWxkLnNsaWNlU3RyaW5nKGZyb20gLSBwb3MsIHRvIC0gcG9zLCBsaW5lU2VwKTtcbiAgICAgICAgICAgIHBvcyA9IGVuZCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZmxhdHRlbih0YXJnZXQpIHtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgIGNoaWxkLmZsYXR0ZW4odGFyZ2V0KTtcbiAgICB9XG4gICAgc2NhbklkZW50aWNhbChvdGhlciwgZGlyKSB7XG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgVGV4dE5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBsZW5ndGggPSAwO1xuICAgICAgICBsZXQgW2lBLCBpQiwgZUEsIGVCXSA9IGRpciA+IDAgPyBbMCwgMCwgdGhpcy5jaGlsZHJlbi5sZW5ndGgsIG90aGVyLmNoaWxkcmVuLmxlbmd0aF1cbiAgICAgICAgICAgIDogW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMSwgb3RoZXIuY2hpbGRyZW4ubGVuZ3RoIC0gMSwgLTEsIC0xXTtcbiAgICAgICAgZm9yICg7OyBpQSArPSBkaXIsIGlCICs9IGRpcikge1xuICAgICAgICAgICAgaWYgKGlBID09IGVBIHx8IGlCID09IGVCKVxuICAgICAgICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgICAgICBsZXQgY2hBID0gdGhpcy5jaGlsZHJlbltpQV0sIGNoQiA9IG90aGVyLmNoaWxkcmVuW2lCXTtcbiAgICAgICAgICAgIGlmIChjaEEgIT0gY2hCKVxuICAgICAgICAgICAgICAgIHJldHVybiBsZW5ndGggKyBjaEEuc2NhbklkZW50aWNhbChjaEIsIGRpcik7XG4gICAgICAgICAgICBsZW5ndGggKz0gY2hBLmxlbmd0aCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGZyb20oY2hpbGRyZW4sIGxlbmd0aCA9IGNoaWxkcmVuLnJlZHVjZSgobCwgY2gpID0+IGwgKyBjaC5sZW5ndGggKyAxLCAtMSkpIHtcbiAgICAgICAgbGV0IGxpbmVzID0gMDtcbiAgICAgICAgZm9yIChsZXQgY2ggb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICBsaW5lcyArPSBjaC5saW5lcztcbiAgICAgICAgaWYgKGxpbmVzIDwgMzIgLyogVHJlZS5CcmFuY2ggKi8pIHtcbiAgICAgICAgICAgIGxldCBmbGF0ID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBjaCBvZiBjaGlsZHJlbilcbiAgICAgICAgICAgICAgICBjaC5mbGF0dGVuKGZsYXQpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0TGVhZihmbGF0LCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjaHVuayA9IE1hdGgubWF4KDMyIC8qIFRyZWUuQnJhbmNoICovLCBsaW5lcyA+PiA1IC8qIFRyZWUuQnJhbmNoU2hpZnQgKi8pLCBtYXhDaHVuayA9IGNodW5rIDw8IDEsIG1pbkNodW5rID0gY2h1bmsgPj4gMTtcbiAgICAgICAgbGV0IGNodW5rZWQgPSBbXSwgY3VycmVudExpbmVzID0gMCwgY3VycmVudExlbiA9IC0xLCBjdXJyZW50Q2h1bmsgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gYWRkKGNoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbGFzdDtcbiAgICAgICAgICAgIGlmIChjaGlsZC5saW5lcyA+IG1heENodW5rICYmIGNoaWxkIGluc3RhbmNlb2YgVGV4dE5vZGUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBub2RlIG9mIGNoaWxkLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgICAgICBhZGQobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGlsZC5saW5lcyA+IG1pbkNodW5rICYmIChjdXJyZW50TGluZXMgPiBtaW5DaHVuayB8fCAhY3VycmVudExpbmVzKSkge1xuICAgICAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgICAgICAgICAgY2h1bmtlZC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dExlYWYgJiYgY3VycmVudExpbmVzICYmXG4gICAgICAgICAgICAgICAgKGxhc3QgPSBjdXJyZW50Q2h1bmtbY3VycmVudENodW5rLmxlbmd0aCAtIDFdKSBpbnN0YW5jZW9mIFRleHRMZWFmICYmXG4gICAgICAgICAgICAgICAgY2hpbGQubGluZXMgKyBsYXN0LmxpbmVzIDw9IDMyIC8qIFRyZWUuQnJhbmNoICovKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVzICs9IGNoaWxkLmxpbmVzO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMZW4gKz0gY2hpbGQubGVuZ3RoICsgMTtcbiAgICAgICAgICAgICAgICBjdXJyZW50Q2h1bmtbY3VycmVudENodW5rLmxlbmd0aCAtIDFdID0gbmV3IFRleHRMZWFmKGxhc3QudGV4dC5jb25jYXQoY2hpbGQudGV4dCksIGxhc3QubGVuZ3RoICsgMSArIGNoaWxkLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudExpbmVzICsgY2hpbGQubGluZXMgPiBjaHVuaylcbiAgICAgICAgICAgICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZXMgKz0gY2hpbGQubGluZXM7XG4gICAgICAgICAgICAgICAgY3VycmVudExlbiArPSBjaGlsZC5sZW5ndGggKyAxO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDaHVuay5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50TGluZXMgPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjaHVua2VkLnB1c2goY3VycmVudENodW5rLmxlbmd0aCA9PSAxID8gY3VycmVudENodW5rWzBdIDogVGV4dE5vZGUuZnJvbShjdXJyZW50Q2h1bmssIGN1cnJlbnRMZW4pKTtcbiAgICAgICAgICAgIGN1cnJlbnRMZW4gPSAtMTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lcyA9IGN1cnJlbnRDaHVuay5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKVxuICAgICAgICAgICAgYWRkKGNoaWxkKTtcbiAgICAgICAgZmx1c2goKTtcbiAgICAgICAgcmV0dXJuIGNodW5rZWQubGVuZ3RoID09IDEgPyBjaHVua2VkWzBdIDogbmV3IFRleHROb2RlKGNodW5rZWQsIGxlbmd0aCk7XG4gICAgfVxufVxuVGV4dC5lbXB0eSA9IC8qQF9fUFVSRV9fKi9uZXcgVGV4dExlYWYoW1wiXCJdLCAwKTtcbmZ1bmN0aW9uIHRleHRMZW5ndGgodGV4dCkge1xuICAgIGxldCBsZW5ndGggPSAtMTtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHRleHQpXG4gICAgICAgIGxlbmd0aCArPSBsaW5lLmxlbmd0aCArIDE7XG4gICAgcmV0dXJuIGxlbmd0aDtcbn1cbmZ1bmN0aW9uIGFwcGVuZFRleHQodGV4dCwgdGFyZ2V0LCBmcm9tID0gMCwgdG8gPSAxZTkpIHtcbiAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMCwgZmlyc3QgPSB0cnVlOyBpIDwgdGV4dC5sZW5ndGggJiYgcG9zIDw9IHRvOyBpKyspIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0ZXh0W2ldLCBlbmQgPSBwb3MgKyBsaW5lLmxlbmd0aDtcbiAgICAgICAgaWYgKGVuZCA+PSBmcm9tKSB7XG4gICAgICAgICAgICBpZiAoZW5kID4gdG8pXG4gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc2xpY2UoMCwgdG8gLSBwb3MpO1xuICAgICAgICAgICAgaWYgKHBvcyA8IGZyb20pXG4gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc2xpY2UoZnJvbSAtIHBvcyk7XG4gICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbdGFyZ2V0Lmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBlbmQgKyAxO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gc2xpY2VUZXh0KHRleHQsIGZyb20sIHRvKSB7XG4gICAgcmV0dXJuIGFwcGVuZFRleHQodGV4dCwgW1wiXCJdLCBmcm9tLCB0byk7XG59XG5jbGFzcyBSYXdUZXh0Q3Vyc29yIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZXh0LCBkaXIgPSAxKSB7XG4gICAgICAgIHRoaXMuZGlyID0gZGlyO1xuICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5saW5lQnJlYWsgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbdGV4dF07XG4gICAgICAgIHRoaXMub2Zmc2V0cyA9IFtkaXIgPiAwID8gMSA6ICh0ZXh0IGluc3RhbmNlb2YgVGV4dExlYWYgPyB0ZXh0LnRleHQubGVuZ3RoIDogdGV4dC5jaGlsZHJlbi5sZW5ndGgpIDw8IDFdO1xuICAgIH1cbiAgICBuZXh0SW5uZXIoc2tpcCwgZGlyKSB7XG4gICAgICAgIHRoaXMuZG9uZSA9IHRoaXMubGluZUJyZWFrID0gZmFsc2U7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gdGhpcy5ub2Rlcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMubm9kZXNbbGFzdF0sIG9mZnNldFZhbHVlID0gdGhpcy5vZmZzZXRzW2xhc3RdLCBvZmZzZXQgPSBvZmZzZXRWYWx1ZSA+PiAxO1xuICAgICAgICAgICAgbGV0IHNpemUgPSB0b3AgaW5zdGFuY2VvZiBUZXh0TGVhZiA/IHRvcC50ZXh0Lmxlbmd0aCA6IHRvcC5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09IChkaXIgPiAwID8gc2l6ZSA6IDApKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaXIgPiAwKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbbGFzdCAtIDFdKys7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHMucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgob2Zmc2V0VmFsdWUgJiAxKSA9PSAoZGlyID4gMCA/IDAgOiAxKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0XSArPSBkaXI7XG4gICAgICAgICAgICAgICAgaWYgKHNraXAgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVCcmVhayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlxcblwiO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2tpcC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodG9wIGluc3RhbmNlb2YgVGV4dExlYWYpIHtcbiAgICAgICAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHN0cmluZ1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdG9wLnRleHRbb2Zmc2V0ICsgKGRpciA8IDAgPyAtMSA6IDApXTtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbbGFzdF0gKz0gZGlyO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0Lmxlbmd0aCA+IE1hdGgubWF4KDAsIHNraXApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBza2lwID09IDAgPyBuZXh0IDogZGlyID4gMCA/IG5leHQuc2xpY2Uoc2tpcCkgOiBuZXh0LnNsaWNlKDAsIG5leHQubGVuZ3RoIC0gc2tpcCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBza2lwIC09IG5leHQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0b3AuY2hpbGRyZW5bb2Zmc2V0ICsgKGRpciA8IDAgPyAtMSA6IDApXTtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcCA+IG5leHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNraXAgLT0gbmV4dC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0XSArPSBkaXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyIDwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0XS0tO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2gobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0cy5wdXNoKGRpciA+IDAgPyAxIDogKG5leHQgaW5zdGFuY2VvZiBUZXh0TGVhZiA/IG5leHQudGV4dC5sZW5ndGggOiBuZXh0LmNoaWxkcmVuLmxlbmd0aCkgPDwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG5leHQoc2tpcCA9IDApIHtcbiAgICAgICAgaWYgKHNraXAgPCAwKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRJbm5lcigtc2tpcCwgKC10aGlzLmRpcikpO1xuICAgICAgICAgICAgc2tpcCA9IHRoaXMudmFsdWUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5leHRJbm5lcihza2lwLCB0aGlzLmRpcik7XG4gICAgfVxufVxuY2xhc3MgUGFydGlhbFRleHRDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKHRleHQsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnNvciA9IG5ldyBSYXdUZXh0Q3Vyc29yKHRleHQsIHN0YXJ0ID4gZW5kID8gLTEgOiAxKTtcbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydCA+IGVuZCA/IHRleHQubGVuZ3RoIDogMDtcbiAgICAgICAgdGhpcy5mcm9tID0gTWF0aC5taW4oc3RhcnQsIGVuZCk7XG4gICAgICAgIHRoaXMudG8gPSBNYXRoLm1heChzdGFydCwgZW5kKTtcbiAgICB9XG4gICAgbmV4dElubmVyKHNraXAsIGRpcikge1xuICAgICAgICBpZiAoZGlyIDwgMCA/IHRoaXMucG9zIDw9IHRoaXMuZnJvbSA6IHRoaXMucG9zID49IHRoaXMudG8pIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHNraXAgKz0gTWF0aC5tYXgoMCwgZGlyIDwgMCA/IHRoaXMucG9zIC0gdGhpcy50byA6IHRoaXMuZnJvbSAtIHRoaXMucG9zKTtcbiAgICAgICAgbGV0IGxpbWl0ID0gZGlyIDwgMCA/IHRoaXMucG9zIC0gdGhpcy5mcm9tIDogdGhpcy50byAtIHRoaXMucG9zO1xuICAgICAgICBpZiAoc2tpcCA+IGxpbWl0KVxuICAgICAgICAgICAgc2tpcCA9IGxpbWl0O1xuICAgICAgICBsaW1pdCAtPSBza2lwO1xuICAgICAgICBsZXQgeyB2YWx1ZSB9ID0gdGhpcy5jdXJzb3IubmV4dChza2lwKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gKHZhbHVlLmxlbmd0aCArIHNraXApICogZGlyO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWUubGVuZ3RoIDw9IGxpbWl0ID8gdmFsdWUgOiBkaXIgPCAwID8gdmFsdWUuc2xpY2UodmFsdWUubGVuZ3RoIC0gbGltaXQpIDogdmFsdWUuc2xpY2UoMCwgbGltaXQpO1xuICAgICAgICB0aGlzLmRvbmUgPSAhdGhpcy52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG5leHQoc2tpcCA9IDApIHtcbiAgICAgICAgaWYgKHNraXAgPCAwKVxuICAgICAgICAgICAgc2tpcCA9IE1hdGgubWF4KHNraXAsIHRoaXMuZnJvbSAtIHRoaXMucG9zKTtcbiAgICAgICAgZWxzZSBpZiAoc2tpcCA+IDApXG4gICAgICAgICAgICBza2lwID0gTWF0aC5taW4oc2tpcCwgdGhpcy50byAtIHRoaXMucG9zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dElubmVyKHNraXAsIHRoaXMuY3Vyc29yLmRpcik7XG4gICAgfVxuICAgIGdldCBsaW5lQnJlYWsoKSB7IHJldHVybiB0aGlzLmN1cnNvci5saW5lQnJlYWsgJiYgdGhpcy52YWx1ZSAhPSBcIlwiOyB9XG59XG5jbGFzcyBMaW5lQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3Rvcihpbm5lcikge1xuICAgICAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gICAgICAgIHRoaXMuYWZ0ZXJCcmVhayA9IHRydWU7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICB9XG4gICAgbmV4dChza2lwID0gMCkge1xuICAgICAgICBsZXQgeyBkb25lLCBsaW5lQnJlYWssIHZhbHVlIH0gPSB0aGlzLmlubmVyLm5leHQoc2tpcCk7XG4gICAgICAgIGlmIChkb25lICYmIHRoaXMuYWZ0ZXJCcmVhaykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICB0aGlzLmFmdGVyQnJlYWsgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkb25lKSB7XG4gICAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGluZUJyZWFrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hZnRlckJyZWFrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFmdGVyQnJlYWsgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5hZnRlckJyZWFrID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdldCBsaW5lQnJlYWsoKSB7IHJldHVybiBmYWxzZTsgfVxufVxuaWYgKHR5cGVvZiBTeW1ib2wgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgIFRleHQucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLml0ZXIoKTsgfTtcbiAgICBSYXdUZXh0Q3Vyc29yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gUGFydGlhbFRleHRDdXJzb3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPVxuICAgICAgICBMaW5lQ3Vyc29yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcbn1cbi8qKlxuVGhpcyB0eXBlIGRlc2NyaWJlcyBhIGxpbmUgaW4gdGhlIGRvY3VtZW50LiBJdCBpcyBjcmVhdGVkXG5vbi1kZW1hbmQgd2hlbiBsaW5lcyBhcmUgW3F1ZXJpZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVGV4dC5saW5lQXQpLlxuKi9cbmNsYXNzIExpbmUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIChfYmVmb3JlXyB0aGUgbGluZSBicmVhayxcbiAgICBvciBhdCB0aGUgZW5kIG9mIGRvY3VtZW50IGZvciB0aGUgbGFzdCBsaW5lKS5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGlzIGxpbmUncyBsaW5lIG51bWJlciAoMS1iYXNlZCkuXG4gICAgKi9cbiAgICBudW1iZXIsIFxuICAgIC8qKlxuICAgIFRoZSBsaW5lJ3MgY29udGVudC5cbiAgICAqL1xuICAgIHRleHQpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGxlbmd0aCBvZiB0aGUgbGluZSAobm90IGluY2x1ZGluZyBhbnkgbGluZSBicmVhayBhZnRlciBpdCkuXG4gICAgKi9cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gdGhpcy50byAtIHRoaXMuZnJvbTsgfVxufVxuZnVuY3Rpb24gY2xpcCh0ZXh0LCBmcm9tLCB0bykge1xuICAgIGZyb20gPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0ZXh0Lmxlbmd0aCwgZnJvbSkpO1xuICAgIHJldHVybiBbZnJvbSwgTWF0aC5tYXgoZnJvbSwgTWF0aC5taW4odGV4dC5sZW5ndGgsIHRvKSldO1xufVxuXG4vKipcblJldHVybnMgYSBuZXh0IGdyYXBoZW1lIGNsdXN0ZXIgYnJlYWsgX2FmdGVyXyAobm90IGVxdWFsIHRvKVxuYHBvc2AsIGlmIGBmb3J3YXJkYCBpcyB0cnVlLCBvciBiZWZvcmUgb3RoZXJ3aXNlLiBSZXR1cm5zIGBwb3NgXG5pdHNlbGYgaWYgbm8gZnVydGhlciBjbHVzdGVyIGJyZWFrIGlzIGF2YWlsYWJsZSBpbiB0aGUgc3RyaW5nLlxuTW92ZXMgYWNyb3NzIHN1cnJvZ2F0ZSBwYWlycywgZXh0ZW5kaW5nIGNoYXJhY3RlcnMgKHdoZW5cbmBpbmNsdWRlRXh0ZW5kaW5nYCBpcyB0cnVlKSwgY2hhcmFjdGVycyBqb2luZWQgd2l0aCB6ZXJvLXdpZHRoXG5qb2luZXJzLCBhbmQgZmxhZyBlbW9qaS5cbiovXG5mdW5jdGlvbiBmaW5kQ2x1c3RlckJyZWFrKHN0ciwgcG9zLCBmb3J3YXJkID0gdHJ1ZSwgaW5jbHVkZUV4dGVuZGluZyA9IHRydWUpIHtcbiAgICByZXR1cm4gZmluZENsdXN0ZXJCcmVhayQxKHN0ciwgcG9zLCBmb3J3YXJkLCBpbmNsdWRlRXh0ZW5kaW5nKTtcbn1cbmZ1bmN0aW9uIHN1cnJvZ2F0ZUxvdyhjaCkgeyByZXR1cm4gY2ggPj0gMHhEQzAwICYmIGNoIDwgMHhFMDAwOyB9XG5mdW5jdGlvbiBzdXJyb2dhdGVIaWdoKGNoKSB7IHJldHVybiBjaCA+PSAweEQ4MDAgJiYgY2ggPCAweERDMDA7IH1cbi8qKlxuRmluZCB0aGUgY29kZSBwb2ludCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gYSBzdHJpbmcgKGxpa2UgdGhlXG5bYGNvZGVQb2ludEF0YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2NvZGVQb2ludEF0KVxuc3RyaW5nIG1ldGhvZCkuXG4qL1xuZnVuY3Rpb24gY29kZVBvaW50QXQoc3RyLCBwb3MpIHtcbiAgICBsZXQgY29kZTAgPSBzdHIuY2hhckNvZGVBdChwb3MpO1xuICAgIGlmICghc3Vycm9nYXRlSGlnaChjb2RlMCkgfHwgcG9zICsgMSA9PSBzdHIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gY29kZTA7XG4gICAgbGV0IGNvZGUxID0gc3RyLmNoYXJDb2RlQXQocG9zICsgMSk7XG4gICAgaWYgKCFzdXJyb2dhdGVMb3coY29kZTEpKVxuICAgICAgICByZXR1cm4gY29kZTA7XG4gICAgcmV0dXJuICgoY29kZTAgLSAweGQ4MDApIDw8IDEwKSArIChjb2RlMSAtIDB4ZGMwMCkgKyAweDEwMDAwO1xufVxuLyoqXG5HaXZlbiBhIFVuaWNvZGUgY29kZXBvaW50LCByZXR1cm4gdGhlIEphdmFTY3JpcHQgc3RyaW5nIHRoYXRcbnJlc3ByZXNlbnRzIGl0IChsaWtlXG5bYFN0cmluZy5mcm9tQ29kZVBvaW50YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2Zyb21Db2RlUG9pbnQpKS5cbiovXG5mdW5jdGlvbiBmcm9tQ29kZVBvaW50KGNvZGUpIHtcbiAgICBpZiAoY29kZSA8PSAweGZmZmYpXG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgIGNvZGUgLT0gMHgxMDAwMDtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZSA+PiAxMCkgKyAweGQ4MDAsIChjb2RlICYgMTAyMykgKyAweGRjMDApO1xufVxuLyoqXG5UaGUgYW1vdW50IG9mIHBvc2l0aW9ucyBhIGNoYXJhY3RlciB0YWtlcyB1cCBpbiBhIEphdmFTY3JpcHQgc3RyaW5nLlxuKi9cbmZ1bmN0aW9uIGNvZGVQb2ludFNpemUoY29kZSkgeyByZXR1cm4gY29kZSA8IDB4MTAwMDAgPyAxIDogMjsgfVxuXG5jb25zdCBEZWZhdWx0U3BsaXQgPSAvXFxyXFxuP3xcXG4vO1xuLyoqXG5EaXN0aW5ndWlzaGVzIGRpZmZlcmVudCB3YXlzIGluIHdoaWNoIHBvc2l0aW9ucyBjYW4gYmUgbWFwcGVkLlxuKi9cbnZhciBNYXBNb2RlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoTWFwTW9kZSkge1xuICAgIC8qKlxuICAgIE1hcCBhIHBvc2l0aW9uIHRvIGEgdmFsaWQgbmV3IHBvc2l0aW9uLCBldmVuIHdoZW4gaXRzIGNvbnRleHRcbiAgICB3YXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlNpbXBsZVwiXSA9IDBdID0gXCJTaW1wbGVcIjtcbiAgICAvKipcbiAgICBSZXR1cm4gbnVsbCBpZiBkZWxldGlvbiBoYXBwZW5zIGFjcm9zcyB0aGUgcG9zaXRpb24uXG4gICAgKi9cbiAgICBNYXBNb2RlW01hcE1vZGVbXCJUcmFja0RlbFwiXSA9IDFdID0gXCJUcmFja0RlbFwiO1xuICAgIC8qKlxuICAgIFJldHVybiBudWxsIGlmIHRoZSBjaGFyYWN0ZXIgX2JlZm9yZV8gdGhlIHBvc2l0aW9uIGlzIGRlbGV0ZWQuXG4gICAgKi9cbiAgICBNYXBNb2RlW01hcE1vZGVbXCJUcmFja0JlZm9yZVwiXSA9IDJdID0gXCJUcmFja0JlZm9yZVwiO1xuICAgIC8qKlxuICAgIFJldHVybiBudWxsIGlmIHRoZSBjaGFyYWN0ZXIgX2FmdGVyXyB0aGUgcG9zaXRpb24gaXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlRyYWNrQWZ0ZXJcIl0gPSAzXSA9IFwiVHJhY2tBZnRlclwiO1xucmV0dXJuIE1hcE1vZGV9KShNYXBNb2RlIHx8IChNYXBNb2RlID0ge30pKTtcbi8qKlxuQSBjaGFuZ2UgZGVzY3JpcHRpb24gaXMgYSB2YXJpYW50IG9mIFtjaGFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZVNldClcbnRoYXQgZG9lc24ndCBzdG9yZSB0aGUgaW5zZXJ0ZWQgdGV4dC4gQXMgc3VjaCwgaXQgY2FuJ3QgYmVcbmFwcGxpZWQsIGJ1dCBpcyBjaGVhcGVyIHRvIHN0b3JlIGFuZCBtYW5pcHVsYXRlLlxuKi9cbmNsYXNzIENoYW5nZURlc2Mge1xuICAgIC8vIFNlY3Rpb25zIGFyZSBlbmNvZGVkIGFzIHBhaXJzIG9mIGludGVnZXJzLiBUaGUgZmlyc3QgaXMgdGhlXG4gICAgLy8gbGVuZ3RoIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LCBhbmQgdGhlIHNlY29uZCBpcyAtMSBmb3JcbiAgICAvLyB1bmFmZmVjdGVkIHNlY3Rpb25zLCBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgcmVwbGFjZW1lbnQgY29udGVudFxuICAgIC8vIG90aGVyd2lzZS4gU28gYW4gaW5zZXJ0aW9uIHdvdWxkIGJlICgwLCBuPjApLCBhIGRlbGV0aW9uIChuPjAsXG4gICAgLy8gMCksIGFuZCBhIHJlcGxhY2VtZW50IHR3byBwb3NpdGl2ZSBudW1iZXJzLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzZWN0aW9ucykge1xuICAgICAgICB0aGlzLnNlY3Rpb25zID0gc2VjdGlvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IGJlZm9yZSB0aGUgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnNlY3Rpb25zW2ldO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCBhZnRlciB0aGUgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IG5ld0xlbmd0aCgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGlucyA9IHRoaXMuc2VjdGlvbnNbaSArIDFdO1xuICAgICAgICAgICAgcmVzdWx0ICs9IGlucyA8IDAgPyB0aGlzLnNlY3Rpb25zW2ldIDogaW5zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEZhbHNlIHdoZW4gdGhlcmUgYXJlIGFjdHVhbCBjaGFuZ2VzIGluIHRoaXMgc2V0LlxuICAgICovXG4gICAgZ2V0IGVtcHR5KCkgeyByZXR1cm4gdGhpcy5zZWN0aW9ucy5sZW5ndGggPT0gMCB8fCB0aGlzLnNlY3Rpb25zLmxlbmd0aCA9PSAyICYmIHRoaXMuc2VjdGlvbnNbMV0gPCAwOyB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSB1bmNoYW5nZWQgcGFydHMgbGVmdCBieSB0aGVzZSBjaGFuZ2VzLiBgcG9zQWBcbiAgICBwcm92aWRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHJhbmdlIGluIHRoZSBvbGQgZG9jdW1lbnQsIGBwb3NCYFxuICAgIHRoZSBuZXcgcG9zaXRpb24gaW4gdGhlIGNoYW5nZWQgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBpdGVyR2FwcyhmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3NBID0gMCwgcG9zQiA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDspIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnNlY3Rpb25zW2krK10sIGlucyA9IHRoaXMuc2VjdGlvbnNbaSsrXTtcbiAgICAgICAgICAgIGlmIChpbnMgPCAwKSB7XG4gICAgICAgICAgICAgICAgZihwb3NBLCBwb3NCLCBsZW4pO1xuICAgICAgICAgICAgICAgIHBvc0IgKz0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBpbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3NBICs9IGxlbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyBjaGFuZ2VkIGJ5IHRoZXNlIGNoYW5nZXMuIChTZWVcbiAgICBbYENoYW5nZVNldC5pdGVyQ2hhbmdlc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0Lml0ZXJDaGFuZ2VzKSBmb3IgYVxuICAgIHZhcmlhbnQgdGhhdCBhbHNvIHByb3ZpZGVzIHlvdSB3aXRoIHRoZSBpbnNlcnRlZCB0ZXh0LilcbiAgICBgZnJvbUFgL2B0b0FgIHByb3ZpZGVzIHRoZSBleHRlbnQgb2YgdGhlIGNoYW5nZSBpbiB0aGUgc3RhcnRpbmdcbiAgICBkb2N1bWVudCwgYGZyb21CYC9gdG9CYCB0aGUgZXh0ZW50IG9mIHRoZSByZXBsYWNlbWVudCBpbiB0aGVcbiAgICBjaGFuZ2VkIGRvY3VtZW50LlxuICAgIFxuICAgIFdoZW4gYGluZGl2aWR1YWxgIGlzIHRydWUsIGFkamFjZW50IGNoYW5nZXMgKHdoaWNoIGFyZSBrZXB0XG4gICAgc2VwYXJhdGUgZm9yIFtwb3NpdGlvbiBtYXBwaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZURlc2MubWFwUG9zKSkgYXJlXG4gICAgcmVwb3J0ZWQgc2VwYXJhdGVseS5cbiAgICAqL1xuICAgIGl0ZXJDaGFuZ2VkUmFuZ2VzKGYsIGluZGl2aWR1YWwgPSBmYWxzZSkge1xuICAgICAgICBpdGVyQ2hhbmdlcyh0aGlzLCBmLCBpbmRpdmlkdWFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgZGVzY3JpcHRpb24gb2YgdGhlIGludmVydGVkIGZvcm0gb2YgdGhlc2UgY2hhbmdlcy5cbiAgICAqL1xuICAgIGdldCBpbnZlcnRlZERlc2MoKSB7XG4gICAgICAgIGxldCBzZWN0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApXG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChsZW4sIGlucyk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChpbnMsIGxlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VEZXNjKHNlY3Rpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcHV0ZSB0aGUgY29tYmluZWQgZWZmZWN0IG9mIGFwcGx5aW5nIGFub3RoZXIgc2V0IG9mIGNoYW5nZXNcbiAgICBhZnRlciB0aGlzIG9uZS4gVGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgdGhpcyBzZXQgc2hvdWxkXG4gICAgbWF0Y2ggdGhlIGxlbmd0aCBiZWZvcmUgYG90aGVyYC5cbiAgICAqL1xuICAgIGNvbXBvc2VEZXNjKG90aGVyKSB7IHJldHVybiB0aGlzLmVtcHR5ID8gb3RoZXIgOiBvdGhlci5lbXB0eSA/IHRoaXMgOiBjb21wb3NlU2V0cyh0aGlzLCBvdGhlcik7IH1cbiAgICAvKipcbiAgICBNYXAgdGhpcyBkZXNjcmlwdGlvbiwgd2hpY2ggc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHNhbWUgZG9jdW1lbnRcbiAgICBhcyBgb3RoZXJgLCBvdmVyIGFub3RoZXIgc2V0IG9mIGNoYW5nZXMsIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgYXBwbGllZCBhZnRlciBpdC4gV2hlbiBgYmVmb3JlYCBpcyB0cnVlLCBtYXAgYXMgaWYgdGhlIGNoYW5nZXNcbiAgICBpbiBgdGhpc2AgaGFwcGVuZWQgYmVmb3JlIHRoZSBvbmVzIGluIGBvdGhlcmAuXG4gICAgKi9cbiAgICBtYXBEZXNjKG90aGVyLCBiZWZvcmUgPSBmYWxzZSkgeyByZXR1cm4gb3RoZXIuZW1wdHkgPyB0aGlzIDogbWFwU2V0KHRoaXMsIG90aGVyLCBiZWZvcmUpOyB9XG4gICAgbWFwUG9zKHBvcywgYXNzb2MgPSAtMSwgbW9kZSA9IE1hcE1vZGUuU2ltcGxlKSB7XG4gICAgICAgIGxldCBwb3NBID0gMCwgcG9zQiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK10sIGVuZEEgPSBwb3NBICsgbGVuO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoZW5kQSA+IHBvcylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc0IgKyAocG9zIC0gcG9zQSk7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSAhPSBNYXBNb2RlLlNpbXBsZSAmJiBlbmRBID49IHBvcyAmJlxuICAgICAgICAgICAgICAgICAgICAobW9kZSA9PSBNYXBNb2RlLlRyYWNrRGVsICYmIHBvc0EgPCBwb3MgJiYgZW5kQSA+IHBvcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PSBNYXBNb2RlLlRyYWNrQmVmb3JlICYmIHBvc0EgPCBwb3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPT0gTWFwTW9kZS5UcmFja0FmdGVyICYmIGVuZEEgPiBwb3MpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoZW5kQSA+IHBvcyB8fCBlbmRBID09IHBvcyAmJiBhc3NvYyA8IDAgJiYgIWxlbilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvcyA9PSBwb3NBIHx8IGFzc29jIDwgMCA/IHBvc0IgOiBwb3NCICsgaW5zO1xuICAgICAgICAgICAgICAgIHBvc0IgKz0gaW5zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zQSA9IGVuZEE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA+IHBvc0EpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUG9zaXRpb24gJHtwb3N9IGlzIG91dCBvZiByYW5nZSBmb3IgY2hhbmdlc2V0IG9mIGxlbmd0aCAke3Bvc0F9YCk7XG4gICAgICAgIHJldHVybiBwb3NCO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoZXNlIGNoYW5nZXMgdG91Y2ggYSBnaXZlbiByYW5nZS4gV2hlbiBvbmUgb2YgdGhlXG4gICAgY2hhbmdlcyBlbnRpcmVseSBjb3ZlcnMgdGhlIHJhbmdlLCB0aGUgc3RyaW5nIGBcImNvdmVyXCJgIGlzXG4gICAgcmV0dXJuZWQuXG4gICAgKi9cbiAgICB0b3VjaGVzUmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGggJiYgcG9zIDw9IHRvOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdLCBlbmQgPSBwb3MgKyBsZW47XG4gICAgICAgICAgICBpZiAoaW5zID49IDAgJiYgcG9zIDw9IHRvICYmIGVuZCA+PSBmcm9tKVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3MgPCBmcm9tICYmIGVuZCA+IHRvID8gXCJjb3ZlclwiIDogdHJ1ZTtcbiAgICAgICAgICAgIHBvcyA9IGVuZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgcmVzdWx0ICs9IChyZXN1bHQgPyBcIiBcIiA6IFwiXCIpICsgbGVuICsgKGlucyA+PSAwID8gXCI6XCIgKyBpbnMgOiBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBTZXJpYWxpemUgdGhpcyBjaGFuZ2UgZGVzYyB0byBhIEpTT04tcmVwcmVzZW50YWJsZSB2YWx1ZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHsgcmV0dXJuIHRoaXMuc2VjdGlvbnM7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjaGFuZ2UgZGVzYyBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uIChhcyBwcm9kdWNlZFxuICAgIGJ5IFtgdG9KU09OYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VEZXNjLnRvSlNPTikuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbikgfHwganNvbi5sZW5ndGggJSAyIHx8IGpzb24uc29tZShhID0+IHR5cGVvZiBhICE9IFwibnVtYmVyXCIpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gb2YgQ2hhbmdlRGVzY1wiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VEZXNjKGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoc2VjdGlvbnMpIHsgcmV0dXJuIG5ldyBDaGFuZ2VEZXNjKHNlY3Rpb25zKTsgfVxufVxuLyoqXG5BIGNoYW5nZSBzZXQgcmVwcmVzZW50cyBhIGdyb3VwIG9mIG1vZGlmaWNhdGlvbnMgdG8gYSBkb2N1bWVudC4gSXRcbnN0b3JlcyB0aGUgZG9jdW1lbnQgbGVuZ3RoLCBhbmQgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBkb2N1bWVudHNcbndpdGggZXhhY3RseSB0aGF0IGxlbmd0aC5cbiovXG5jbGFzcyBDaGFuZ2VTZXQgZXh0ZW5kcyBDaGFuZ2VEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihzZWN0aW9ucywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpbnNlcnRlZCkge1xuICAgICAgICBzdXBlcihzZWN0aW9ucyk7XG4gICAgICAgIHRoaXMuaW5zZXJ0ZWQgPSBpbnNlcnRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQXBwbHkgdGhlIGNoYW5nZXMgdG8gYSBkb2N1bWVudCwgcmV0dXJuaW5nIHRoZSBtb2RpZmllZFxuICAgIGRvY3VtZW50LlxuICAgICovXG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCAhPSBkb2MubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBcHBseWluZyBjaGFuZ2Ugc2V0IHRvIGEgZG9jdW1lbnQgd2l0aCB0aGUgd3JvbmcgbGVuZ3RoXCIpO1xuICAgICAgICBpdGVyQ2hhbmdlcyh0aGlzLCAoZnJvbUEsIHRvQSwgZnJvbUIsIF90b0IsIHRleHQpID0+IGRvYyA9IGRvYy5yZXBsYWNlKGZyb21CLCBmcm9tQiArICh0b0EgLSBmcm9tQSksIHRleHQpLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBkb2M7XG4gICAgfVxuICAgIG1hcERlc2Mob3RoZXIsIGJlZm9yZSA9IGZhbHNlKSB7IHJldHVybiBtYXBTZXQodGhpcywgb3RoZXIsIGJlZm9yZSwgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBHaXZlbiB0aGUgZG9jdW1lbnQgYXMgaXQgZXhpc3RlZCBfYmVmb3JlXyB0aGUgY2hhbmdlcywgcmV0dXJuIGFcbiAgICBjaGFuZ2Ugc2V0IHRoYXQgcmVwcmVzZW50cyB0aGUgaW52ZXJzZSBvZiB0aGlzIHNldCwgd2hpY2ggY291bGRcbiAgICBiZSB1c2VkIHRvIGdvIGZyb20gdGhlIGRvY3VtZW50IGNyZWF0ZWQgYnkgdGhlIGNoYW5nZXMgYmFjayB0b1xuICAgIHRoZSBkb2N1bWVudCBhcyBpdCBleGlzdGVkIGJlZm9yZSB0aGUgY2hhbmdlcy5cbiAgICAqL1xuICAgIGludmVydChkb2MpIHtcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gdGhpcy5zZWN0aW9ucy5zbGljZSgpLCBpbnNlcnRlZCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IHNlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gc2VjdGlvbnNbaV0sIGlucyA9IHNlY3Rpb25zW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChpbnMgPj0gMCkge1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zW2ldID0gaW5zO1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zW2kgKyAxXSA9IGxlbjtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBpID4+IDE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGluc2VydGVkLmxlbmd0aCA8IGluZGV4KVxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZC5wdXNoKFRleHQuZW1wdHkpO1xuICAgICAgICAgICAgICAgIGluc2VydGVkLnB1c2gobGVuID8gZG9jLnNsaWNlKHBvcywgcG9zICsgbGVuKSA6IFRleHQuZW1wdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zICs9IGxlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENoYW5nZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21iaW5lIHR3byBzdWJzZXF1ZW50IGNoYW5nZSBzZXRzIGludG8gYSBzaW5nbGUgc2V0LiBgb3RoZXJgXG4gICAgbXVzdCBzdGFydCBpbiB0aGUgZG9jdW1lbnQgcHJvZHVjZWQgYnkgYHRoaXNgLiBJZiBgdGhpc2AgZ29lc1xuICAgIGBkb2NBYCBcdTIxOTIgYGRvY0JgIGFuZCBgb3RoZXJgIHJlcHJlc2VudHMgYGRvY0JgIFx1MjE5MiBgZG9jQ2AsIHRoZVxuICAgIHJldHVybmVkIHZhbHVlIHdpbGwgcmVwcmVzZW50IHRoZSBjaGFuZ2UgYGRvY0FgIFx1MjE5MiBgZG9jQ2AuXG4gICAgKi9cbiAgICBjb21wb3NlKG90aGVyKSB7IHJldHVybiB0aGlzLmVtcHR5ID8gb3RoZXIgOiBvdGhlci5lbXB0eSA/IHRoaXMgOiBjb21wb3NlU2V0cyh0aGlzLCBvdGhlciwgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBHaXZlbiBhbm90aGVyIGNoYW5nZSBzZXQgc3RhcnRpbmcgaW4gdGhlIHNhbWUgZG9jdW1lbnQsIG1hcHMgdGhpc1xuICAgIGNoYW5nZSBzZXQgb3ZlciB0aGUgb3RoZXIsIHByb2R1Y2luZyBhIG5ldyBjaGFuZ2Ugc2V0IHRoYXQgY2FuIGJlXG4gICAgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQgcHJvZHVjZWQgYnkgYXBwbHlpbmcgYG90aGVyYC4gV2hlblxuICAgIGBiZWZvcmVgIGlzIGB0cnVlYCwgb3JkZXIgY2hhbmdlcyBhcyBpZiBgdGhpc2AgY29tZXMgYmVmb3JlXG4gICAgYG90aGVyYCwgb3RoZXJ3aXNlICh0aGUgZGVmYXVsdCkgdHJlYXQgYG90aGVyYCBhcyBjb21pbmcgZmlyc3QuXG4gICAgXG4gICAgR2l2ZW4gdHdvIGNoYW5nZXMgYEFgIGFuZCBgQmAsIGBBLmNvbXBvc2UoQi5tYXAoQSkpYCBhbmRcbiAgICBgQi5jb21wb3NlKEEubWFwKEIsIHRydWUpKWAgd2lsbCBwcm9kdWNlIHRoZSBzYW1lIGRvY3VtZW50LiBUaGlzXG4gICAgcHJvdmlkZXMgYSBiYXNpYyBmb3JtIG9mIFtvcGVyYXRpb25hbFxuICAgIHRyYW5zZm9ybWF0aW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PcGVyYXRpb25hbF90cmFuc2Zvcm1hdGlvbiksXG4gICAgYW5kIGNhbiBiZSB1c2VkIGZvciBjb2xsYWJvcmF0aXZlIGVkaXRpbmcuXG4gICAgKi9cbiAgICBtYXAob3RoZXIsIGJlZm9yZSA9IGZhbHNlKSB7IHJldHVybiBvdGhlci5lbXB0eSA/IHRoaXMgOiBtYXBTZXQodGhpcywgb3RoZXIsIGJlZm9yZSwgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIGNoYW5nZWQgcmFuZ2VzIGluIHRoZSBkb2N1bWVudCwgY2FsbGluZyBgZmAgZm9yXG4gICAgZWFjaCwgd2l0aCB0aGUgcmFuZ2UgaW4gdGhlIG9yaWdpbmFsIGRvY3VtZW50IChgZnJvbUFgLWB0b0FgKVxuICAgIGFuZCB0aGUgcmFuZ2UgdGhhdCByZXBsYWNlcyBpdCBpbiB0aGUgbmV3IGRvY3VtZW50XG4gICAgKGBmcm9tQmAtYHRvQmApLlxuICAgIFxuICAgIFdoZW4gYGluZGl2aWR1YWxgIGlzIHRydWUsIGFkamFjZW50IGNoYW5nZXMgYXJlIHJlcG9ydGVkXG4gICAgc2VwYXJhdGVseS5cbiAgICAqL1xuICAgIGl0ZXJDaGFuZ2VzKGYsIGluZGl2aWR1YWwgPSBmYWxzZSkge1xuICAgICAgICBpdGVyQ2hhbmdlcyh0aGlzLCBmLCBpbmRpdmlkdWFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgW2NoYW5nZSBkZXNjcmlwdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VEZXNjKSBmb3IgdGhpcyBjaGFuZ2VcbiAgICBzZXQuXG4gICAgKi9cbiAgICBnZXQgZGVzYygpIHsgcmV0dXJuIENoYW5nZURlc2MuY3JlYXRlKHRoaXMuc2VjdGlvbnMpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmaWx0ZXIocmFuZ2VzKSB7XG4gICAgICAgIGxldCByZXN1bHRTZWN0aW9ucyA9IFtdLCByZXN1bHRJbnNlcnRlZCA9IFtdLCBmaWx0ZXJlZFNlY3Rpb25zID0gW107XG4gICAgICAgIGxldCBpdGVyID0gbmV3IFNlY3Rpb25JdGVyKHRoaXMpO1xuICAgICAgICBkb25lOiBmb3IgKGxldCBpID0gMCwgcG9zID0gMDs7KSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGkgPT0gcmFuZ2VzLmxlbmd0aCA/IDFlOSA6IHJhbmdlc1tpKytdO1xuICAgICAgICAgICAgd2hpbGUgKHBvcyA8IG5leHQgfHwgcG9zID09IG5leHQgJiYgaXRlci5sZW4gPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyLmRvbmUpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIGRvbmU7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGl0ZXIubGVuLCBuZXh0IC0gcG9zKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKGZpbHRlcmVkU2VjdGlvbnMsIGxlbiwgLTEpO1xuICAgICAgICAgICAgICAgIGxldCBpbnMgPSBpdGVyLmlucyA9PSAtMSA/IC0xIDogaXRlci5vZmYgPT0gMCA/IGl0ZXIuaW5zIDogMDtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHJlc3VsdFNlY3Rpb25zLCBsZW4sIGlucyk7XG4gICAgICAgICAgICAgICAgaWYgKGlucyA+IDApXG4gICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChyZXN1bHRJbnNlcnRlZCwgcmVzdWx0U2VjdGlvbnMsIGl0ZXIudGV4dCk7XG4gICAgICAgICAgICAgICAgaXRlci5mb3J3YXJkKGxlbik7XG4gICAgICAgICAgICAgICAgcG9zICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBlbmQgPSByYW5nZXNbaSsrXTtcbiAgICAgICAgICAgIHdoaWxlIChwb3MgPCBlbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlci5kb25lKVxuICAgICAgICAgICAgICAgICAgICBicmVhayBkb25lO1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBNYXRoLm1pbihpdGVyLmxlbiwgZW5kIC0gcG9zKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHJlc3VsdFNlY3Rpb25zLCBsZW4sIC0xKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKGZpbHRlcmVkU2VjdGlvbnMsIGxlbiwgaXRlci5pbnMgPT0gLTEgPyAtMSA6IGl0ZXIub2ZmID09IDAgPyBpdGVyLmlucyA6IDApO1xuICAgICAgICAgICAgICAgIGl0ZXIuZm9yd2FyZChsZW4pO1xuICAgICAgICAgICAgICAgIHBvcyArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY2hhbmdlczogbmV3IENoYW5nZVNldChyZXN1bHRTZWN0aW9ucywgcmVzdWx0SW5zZXJ0ZWQpLFxuICAgICAgICAgICAgZmlsdGVyZWQ6IENoYW5nZURlc2MuY3JlYXRlKGZpbHRlcmVkU2VjdGlvbnMpIH07XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGlzIGNoYW5nZSBzZXQgdG8gYSBKU09OLXJlcHJlc2VudGFibGUgdmFsdWUuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnNlY3Rpb25zW2ldLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChpbnMgPCAwKVxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gobGVuKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlucyA9PSAwKVxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goW2xlbl0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goW2xlbl0uY29uY2F0KHRoaXMuaW5zZXJ0ZWRbaSA+PiAxXS50b0pTT04oKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0cztcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgY2hhbmdlIHNldCBmb3IgdGhlIGdpdmVuIGNoYW5nZXMsIGZvciBhIGRvY3VtZW50IG9mIHRoZVxuICAgIGdpdmVuIGxlbmd0aCwgdXNpbmcgYGxpbmVTZXBgIGFzIGxpbmUgc2VwYXJhdG9yLlxuICAgICovXG4gICAgc3RhdGljIG9mKGNoYW5nZXMsIGxlbmd0aCwgbGluZVNlcCkge1xuICAgICAgICBsZXQgc2VjdGlvbnMgPSBbXSwgaW5zZXJ0ZWQgPSBbXSwgcG9zID0gMDtcbiAgICAgICAgbGV0IHRvdGFsID0gbnVsbDtcbiAgICAgICAgZnVuY3Rpb24gZmx1c2goZm9yY2UgPSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiAhc2VjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmIChwb3MgPCBsZW5ndGgpXG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuZ3RoIC0gcG9zLCAtMSk7XG4gICAgICAgICAgICBsZXQgc2V0ID0gbmV3IENoYW5nZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpO1xuICAgICAgICAgICAgdG90YWwgPSB0b3RhbCA/IHRvdGFsLmNvbXBvc2Uoc2V0Lm1hcCh0b3RhbCkpIDogc2V0O1xuICAgICAgICAgICAgc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGluc2VydGVkID0gW107XG4gICAgICAgICAgICBwb3MgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3Moc3BlYykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3BlYykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzdWIgb2Ygc3BlYylcbiAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyhzdWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3BlYyBpbnN0YW5jZW9mIENoYW5nZVNldCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGVjLmxlbmd0aCAhPSBsZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBNaXNtYXRjaGVkIGNoYW5nZSBzZXQgbGVuZ3RoIChnb3QgJHtzcGVjLmxlbmd0aH0sIGV4cGVjdGVkICR7bGVuZ3RofSlgKTtcbiAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIHRvdGFsID0gdG90YWwgPyB0b3RhbC5jb21wb3NlKHNwZWMubWFwKHRvdGFsKSkgOiBzcGVjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gPSBmcm9tLCBpbnNlcnQgfSA9IHNwZWM7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPiB0byB8fCBmcm9tIDwgMCB8fCB0byA+IGxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgY2hhbmdlIHJhbmdlICR7ZnJvbX0gdG8gJHt0b30gKGluIGRvYyBvZiBsZW5ndGggJHtsZW5ndGh9KWApO1xuICAgICAgICAgICAgICAgIGxldCBpbnNUZXh0ID0gIWluc2VydCA/IFRleHQuZW1wdHkgOiB0eXBlb2YgaW5zZXJ0ID09IFwic3RyaW5nXCIgPyBUZXh0Lm9mKGluc2VydC5zcGxpdChsaW5lU2VwIHx8IERlZmF1bHRTcGxpdCkpIDogaW5zZXJ0O1xuICAgICAgICAgICAgICAgIGxldCBpbnNMZW4gPSBpbnNUZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA9PSB0byAmJiBpbnNMZW4gPT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tIDwgcG9zKVxuICAgICAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBmcm9tIC0gcG9zLCAtMSk7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgdG8gLSBmcm9tLCBpbnNMZW4pO1xuICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnRlZCwgc2VjdGlvbnMsIGluc1RleHQpO1xuICAgICAgICAgICAgICAgIHBvcyA9IHRvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MoY2hhbmdlcyk7XG4gICAgICAgIGZsdXNoKCF0b3RhbCk7XG4gICAgICAgIHJldHVybiB0b3RhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGVtcHR5IGNoYW5nZXNldCBvZiB0aGUgZ2l2ZW4gbGVuZ3RoLlxuICAgICovXG4gICAgc3RhdGljIGVtcHR5KGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IENoYW5nZVNldChsZW5ndGggPyBbbGVuZ3RoLCAtMV0gOiBbXSwgW10pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjaGFuZ2VzZXQgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbiAoYXMgcHJvZHVjZWQgYnlcbiAgICBbYHRvSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0LnRvSlNPTikuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBDaGFuZ2VTZXRcIik7XG4gICAgICAgIGxldCBzZWN0aW9ucyA9IFtdLCBpbnNlcnRlZCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwYXJ0ID0ganNvbltpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFydCA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChwYXJ0LCAtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghQXJyYXkuaXNBcnJheShwYXJ0KSB8fCB0eXBlb2YgcGFydFswXSAhPSBcIm51bWJlclwiIHx8IHBhcnQuc29tZSgoZSwgaSkgPT4gaSAmJiB0eXBlb2YgZSAhPSBcInN0cmluZ1wiKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIG9mIENoYW5nZVNldFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcnQubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHBhcnRbMF0sIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGluc2VydGVkLmxlbmd0aCA8IGkpXG4gICAgICAgICAgICAgICAgICAgIGluc2VydGVkLnB1c2goVGV4dC5lbXB0eSk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0ZWRbaV0gPSBUZXh0Lm9mKHBhcnQuc2xpY2UoMSkpO1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zLnB1c2gocGFydFswXSwgaW5zZXJ0ZWRbaV0ubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENoYW5nZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVTZXQoc2VjdGlvbnMsIGluc2VydGVkKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuLCBpbnMsIGZvcmNlSm9pbiA9IGZhbHNlKSB7XG4gICAgaWYgKGxlbiA9PSAwICYmIGlucyA8PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IGxhc3QgPSBzZWN0aW9ucy5sZW5ndGggLSAyO1xuICAgIGlmIChsYXN0ID49IDAgJiYgaW5zIDw9IDAgJiYgaW5zID09IHNlY3Rpb25zW2xhc3QgKyAxXSlcbiAgICAgICAgc2VjdGlvbnNbbGFzdF0gKz0gbGVuO1xuICAgIGVsc2UgaWYgKGxhc3QgPj0gMCAmJiBsZW4gPT0gMCAmJiBzZWN0aW9uc1tsYXN0XSA9PSAwKVxuICAgICAgICBzZWN0aW9uc1tsYXN0ICsgMV0gKz0gaW5zO1xuICAgIGVsc2UgaWYgKGZvcmNlSm9pbikge1xuICAgICAgICBzZWN0aW9uc1tsYXN0XSArPSBsZW47XG4gICAgICAgIHNlY3Rpb25zW2xhc3QgKyAxXSArPSBpbnM7XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgc2VjdGlvbnMucHVzaChsZW4sIGlucyk7XG59XG5mdW5jdGlvbiBhZGRJbnNlcnQodmFsdWVzLCBzZWN0aW9ucywgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgaW5kZXggPSAoc2VjdGlvbnMubGVuZ3RoIC0gMikgPj4gMTtcbiAgICBpZiAoaW5kZXggPCB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0gPSB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdLmFwcGVuZCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB3aGlsZSAodmFsdWVzLmxlbmd0aCA8IGluZGV4KVxuICAgICAgICAgICAgdmFsdWVzLnB1c2goVGV4dC5lbXB0eSk7XG4gICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpdGVyQ2hhbmdlcyhkZXNjLCBmLCBpbmRpdmlkdWFsKSB7XG4gICAgbGV0IGluc2VydGVkID0gZGVzYy5pbnNlcnRlZDtcbiAgICBmb3IgKGxldCBwb3NBID0gMCwgcG9zQiA9IDAsIGkgPSAwOyBpIDwgZGVzYy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgIGxldCBsZW4gPSBkZXNjLnNlY3Rpb25zW2krK10sIGlucyA9IGRlc2Muc2VjdGlvbnNbaSsrXTtcbiAgICAgICAgaWYgKGlucyA8IDApIHtcbiAgICAgICAgICAgIHBvc0EgKz0gbGVuO1xuICAgICAgICAgICAgcG9zQiArPSBsZW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZW5kQSA9IHBvc0EsIGVuZEIgPSBwb3NCLCB0ZXh0ID0gVGV4dC5lbXB0eTtcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBlbmRBICs9IGxlbjtcbiAgICAgICAgICAgICAgICBlbmRCICs9IGlucztcbiAgICAgICAgICAgICAgICBpZiAoaW5zICYmIGluc2VydGVkKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5hcHBlbmQoaW5zZXJ0ZWRbKGkgLSAyKSA+PiAxXSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGl2aWR1YWwgfHwgaSA9PSBkZXNjLnNlY3Rpb25zLmxlbmd0aCB8fCBkZXNjLnNlY3Rpb25zW2kgKyAxXSA8IDApXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGxlbiA9IGRlc2Muc2VjdGlvbnNbaSsrXTtcbiAgICAgICAgICAgICAgICBpbnMgPSBkZXNjLnNlY3Rpb25zW2krK107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmKHBvc0EsIGVuZEEsIHBvc0IsIGVuZEIsIHRleHQpO1xuICAgICAgICAgICAgcG9zQSA9IGVuZEE7XG4gICAgICAgICAgICBwb3NCID0gZW5kQjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIG1hcFNldChzZXRBLCBzZXRCLCBiZWZvcmUsIG1rU2V0ID0gZmFsc2UpIHtcbiAgICAvLyBQcm9kdWNlIGEgY29weSBvZiBzZXRBIHRoYXQgYXBwbGllcyB0byB0aGUgZG9jdW1lbnQgYWZ0ZXIgc2V0QlxuICAgIC8vIGhhcyBiZWVuIGFwcGxpZWQgKGFzc3VtaW5nIGJvdGggc3RhcnQgYXQgdGhlIHNhbWUgZG9jdW1lbnQpLlxuICAgIGxldCBzZWN0aW9ucyA9IFtdLCBpbnNlcnQgPSBta1NldCA/IFtdIDogbnVsbDtcbiAgICBsZXQgYSA9IG5ldyBTZWN0aW9uSXRlcihzZXRBKSwgYiA9IG5ldyBTZWN0aW9uSXRlcihzZXRCKTtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYm90aCBzZXRzIGluIHBhcmFsbGVsLiBpbnNlcnRlZCB0cmFja3MsIGZvciBjaGFuZ2VzXG4gICAgLy8gaW4gQSB0aGF0IGhhdmUgdG8gYmUgcHJvY2Vzc2VkIHBpZWNlLWJ5LXBpZWNlLCB3aGV0aGVyIHRoZWlyXG4gICAgLy8gY29udGVudCBoYXMgYmVlbiBpbnNlcnRlZCBhbHJlYWR5LCBhbmQgcmVmZXJzIHRvIHRoZSBzZWN0aW9uXG4gICAgLy8gaW5kZXguXG4gICAgZm9yIChsZXQgaW5zZXJ0ZWQgPSAtMTs7KSB7XG4gICAgICAgIGlmIChhLmRvbmUgJiYgYi5sZW4gfHwgYi5kb25lICYmIGEubGVuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNtYXRjaGVkIGNoYW5nZSBzZXQgbGVuZ3Roc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmlucyA9PSAtMSAmJiBiLmlucyA9PSAtMSkge1xuICAgICAgICAgICAgLy8gTW92ZSBhY3Jvc3MgcmFuZ2VzIHNraXBwZWQgYnkgYm90aCBzZXRzLlxuICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGEubGVuLCBiLmxlbik7XG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW4sIC0xKTtcbiAgICAgICAgICAgIGEuZm9yd2FyZChsZW4pO1xuICAgICAgICAgICAgYi5mb3J3YXJkKGxlbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYi5pbnMgPj0gMCAmJiAoYS5pbnMgPCAwIHx8IGluc2VydGVkID09IGEuaSB8fCBhLm9mZiA9PSAwICYmIChiLmxlbiA8IGEubGVuIHx8IGIubGVuID09IGEubGVuICYmICFiZWZvcmUpKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIGNoYW5nZSBpbiBCIHRoYXQgY29tZXMgYmVmb3JlIHRoZSBuZXh0IGNoYW5nZSBpblxuICAgICAgICAgICAgLy8gQSAob3JkZXJlZCBieSBzdGFydCBwb3MsIHRoZW4gbGVuLCB0aGVuIGJlZm9yZSBmbGFnKSwgc2tpcFxuICAgICAgICAgICAgLy8gdGhhdCAoYW5kIHByb2Nlc3MgYW55IGNoYW5nZXMgaW4gQSBpdCBjb3ZlcnMpLlxuICAgICAgICAgICAgbGV0IGxlbiA9IGIubGVuO1xuICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgYi5pbnMsIC0xKTtcbiAgICAgICAgICAgIHdoaWxlIChsZW4pIHtcbiAgICAgICAgICAgICAgICBsZXQgcGllY2UgPSBNYXRoLm1pbihhLmxlbiwgbGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoYS5pbnMgPj0gMCAmJiBpbnNlcnRlZCA8IGEuaSAmJiBhLmxlbiA8PSBwaWVjZSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCAwLCBhLmlucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYS50ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQgPSBhLmk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGEuZm9yd2FyZChwaWVjZSk7XG4gICAgICAgICAgICAgICAgbGVuIC09IHBpZWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYi5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYS5pbnMgPj0gMCkge1xuICAgICAgICAgICAgLy8gUHJvY2VzcyB0aGUgcGFydCBvZiBhIGNoYW5nZSBpbiBBIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dFxuICAgICAgICAgICAgLy8gbm9uLWRlbGV0aW9uIGNoYW5nZSBpbiBCIChpZiBvdmVybGFwcGluZykuXG4gICAgICAgICAgICBsZXQgbGVuID0gMCwgbGVmdCA9IGEubGVuO1xuICAgICAgICAgICAgd2hpbGUgKGxlZnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYi5pbnMgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBpZWNlID0gTWF0aC5taW4obGVmdCwgYi5sZW4pO1xuICAgICAgICAgICAgICAgICAgICBsZW4gKz0gcGllY2U7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQgLT0gcGllY2U7XG4gICAgICAgICAgICAgICAgICAgIGIuZm9yd2FyZChwaWVjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIuaW5zID09IDAgJiYgYi5sZW4gPCBsZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQgLT0gYi5sZW47XG4gICAgICAgICAgICAgICAgICAgIGIubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuLCBpbnNlcnRlZCA8IGEuaSA/IGEuaW5zIDogMCk7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0ICYmIGluc2VydGVkIDwgYS5pKVxuICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBhLnRleHQpO1xuICAgICAgICAgICAgaW5zZXJ0ZWQgPSBhLmk7XG4gICAgICAgICAgICBhLmZvcndhcmQoYS5sZW4gLSBsZWZ0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmRvbmUgJiYgYi5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zZXJ0ID8gQ2hhbmdlU2V0LmNyZWF0ZVNldChzZWN0aW9ucywgaW5zZXJ0KSA6IENoYW5nZURlc2MuY3JlYXRlKHNlY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc21hdGNoZWQgY2hhbmdlIHNldCBsZW5ndGhzXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcG9zZVNldHMoc2V0QSwgc2V0QiwgbWtTZXQgPSBmYWxzZSkge1xuICAgIGxldCBzZWN0aW9ucyA9IFtdO1xuICAgIGxldCBpbnNlcnQgPSBta1NldCA/IFtdIDogbnVsbDtcbiAgICBsZXQgYSA9IG5ldyBTZWN0aW9uSXRlcihzZXRBKSwgYiA9IG5ldyBTZWN0aW9uSXRlcihzZXRCKTtcbiAgICBmb3IgKGxldCBvcGVuID0gZmFsc2U7Oykge1xuICAgICAgICBpZiAoYS5kb25lICYmIGIuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIGluc2VydCA/IENoYW5nZVNldC5jcmVhdGVTZXQoc2VjdGlvbnMsIGluc2VydCkgOiBDaGFuZ2VEZXNjLmNyZWF0ZShzZWN0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYS5pbnMgPT0gMCkgeyAvLyBEZWxldGlvbiBpbiBBXG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBhLmxlbiwgMCwgb3Blbik7XG4gICAgICAgICAgICBhLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiLmxlbiA9PSAwICYmICFiLmRvbmUpIHsgLy8gSW5zZXJ0aW9uIGluIEJcbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIDAsIGIuaW5zLCBvcGVuKTtcbiAgICAgICAgICAgIGlmIChpbnNlcnQpXG4gICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGIudGV4dCk7XG4gICAgICAgICAgICBiLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmRvbmUgfHwgYi5kb25lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNtYXRjaGVkIGNoYW5nZSBzZXQgbGVuZ3Roc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSBNYXRoLm1pbihhLmxlbjIsIGIubGVuKSwgc2VjdGlvbkxlbiA9IHNlY3Rpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChhLmlucyA9PSAtMSkge1xuICAgICAgICAgICAgICAgIGxldCBpbnNCID0gYi5pbnMgPT0gLTEgPyAtMSA6IGIub2ZmID8gMCA6IGIuaW5zO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGxlbiwgaW5zQiwgb3Blbik7XG4gICAgICAgICAgICAgICAgaWYgKGluc2VydCAmJiBpbnNCKVxuICAgICAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYi50ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGIuaW5zID09IC0xKSB7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgYS5vZmYgPyAwIDogYS5sZW4sIGxlbiwgb3Blbik7XG4gICAgICAgICAgICAgICAgaWYgKGluc2VydClcbiAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGEudGV4dEJpdChsZW4pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGEub2ZmID8gMCA6IGEubGVuLCBiLm9mZiA/IDAgOiBiLmlucywgb3Blbik7XG4gICAgICAgICAgICAgICAgaWYgKGluc2VydCAmJiAhYi5vZmYpXG4gICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBiLnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3BlbiA9IChhLmlucyA+IGxlbiB8fCBiLmlucyA+PSAwICYmIGIubGVuID4gbGVuKSAmJiAob3BlbiB8fCBzZWN0aW9ucy5sZW5ndGggPiBzZWN0aW9uTGVuKTtcbiAgICAgICAgICAgIGEuZm9yd2FyZDIobGVuKTtcbiAgICAgICAgICAgIGIuZm9yd2FyZChsZW4pO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgU2VjdGlvbkl0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHNldCkge1xuICAgICAgICB0aGlzLnNldCA9IHNldDtcbiAgICAgICAgdGhpcy5pID0gMDtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGxldCB7IHNlY3Rpb25zIH0gPSB0aGlzLnNldDtcbiAgICAgICAgaWYgKHRoaXMuaSA8IHNlY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5sZW4gPSBzZWN0aW9uc1t0aGlzLmkrK107XG4gICAgICAgICAgICB0aGlzLmlucyA9IHNlY3Rpb25zW3RoaXMuaSsrXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGVuID0gMDtcbiAgICAgICAgICAgIHRoaXMuaW5zID0gLTI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vZmYgPSAwO1xuICAgIH1cbiAgICBnZXQgZG9uZSgpIHsgcmV0dXJuIHRoaXMuaW5zID09IC0yOyB9XG4gICAgZ2V0IGxlbjIoKSB7IHJldHVybiB0aGlzLmlucyA8IDAgPyB0aGlzLmxlbiA6IHRoaXMuaW5zOyB9XG4gICAgZ2V0IHRleHQoKSB7XG4gICAgICAgIGxldCB7IGluc2VydGVkIH0gPSB0aGlzLnNldCwgaW5kZXggPSAodGhpcy5pIC0gMikgPj4gMTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IGluc2VydGVkLmxlbmd0aCA/IFRleHQuZW1wdHkgOiBpbnNlcnRlZFtpbmRleF07XG4gICAgfVxuICAgIHRleHRCaXQobGVuKSB7XG4gICAgICAgIGxldCB7IGluc2VydGVkIH0gPSB0aGlzLnNldCwgaW5kZXggPSAodGhpcy5pIC0gMikgPj4gMTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IGluc2VydGVkLmxlbmd0aCAmJiAhbGVuID8gVGV4dC5lbXB0eVxuICAgICAgICAgICAgOiBpbnNlcnRlZFtpbmRleF0uc2xpY2UodGhpcy5vZmYsIGxlbiA9PSBudWxsID8gdW5kZWZpbmVkIDogdGhpcy5vZmYgKyBsZW4pO1xuICAgIH1cbiAgICBmb3J3YXJkKGxlbikge1xuICAgICAgICBpZiAobGVuID09IHRoaXMubGVuKVxuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sZW4gLT0gbGVuO1xuICAgICAgICAgICAgdGhpcy5vZmYgKz0gbGVuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvcndhcmQyKGxlbikge1xuICAgICAgICBpZiAodGhpcy5pbnMgPT0gLTEpXG4gICAgICAgICAgICB0aGlzLmZvcndhcmQobGVuKTtcbiAgICAgICAgZWxzZSBpZiAobGVuID09IHRoaXMuaW5zKVxuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbnMgLT0gbGVuO1xuICAgICAgICAgICAgdGhpcy5vZmYgKz0gbGVuO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbkEgc2luZ2xlIHNlbGVjdGlvbiByYW5nZS4gV2hlblxuW2BhbGxvd011bHRpcGxlU2VsZWN0aW9uc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVeYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMpXG5pcyBlbmFibGVkLCBhIFtzZWxlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU2VsZWN0aW9uKSBtYXkgaG9sZFxubXVsdGlwbGUgcmFuZ2VzLiBCeSBkZWZhdWx0LCBzZWxlY3Rpb25zIGhvbGQgZXhhY3RseSBvbmUgcmFuZ2UuXG4qL1xuY2xhc3MgU2VsZWN0aW9uUmFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIHJhbmdlLlxuICAgICovXG4gICAgdG8sIGZsYWdzKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgYW5jaG9yIG9mIHRoZSByYW5nZVx1MjAxNHRoZSBzaWRlIHRoYXQgZG9lc24ndCBtb3ZlIHdoZW4geW91XG4gICAgZXh0ZW5kIGl0LlxuICAgICovXG4gICAgZ2V0IGFuY2hvcigpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgJiAzMiAvKiBSYW5nZUZsYWcuSW52ZXJ0ZWQgKi8gPyB0aGlzLnRvIDogdGhpcy5mcm9tOyB9XG4gICAgLyoqXG4gICAgVGhlIGhlYWQgb2YgdGhlIHJhbmdlLCB3aGljaCBpcyBtb3ZlZCB3aGVuIHRoZSByYW5nZSBpc1xuICAgIFtleHRlbmRlZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25SYW5nZS5leHRlbmQpLlxuICAgICovXG4gICAgZ2V0IGhlYWQoKSB7IHJldHVybiB0aGlzLmZsYWdzICYgMzIgLyogUmFuZ2VGbGFnLkludmVydGVkICovID8gdGhpcy5mcm9tIDogdGhpcy50bzsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiBgYW5jaG9yYCBhbmQgYGhlYWRgIGFyZSBhdCB0aGUgc2FtZSBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGdldCBlbXB0eSgpIHsgcmV0dXJuIHRoaXMuZnJvbSA9PSB0aGlzLnRvOyB9XG4gICAgLyoqXG4gICAgSWYgdGhpcyBpcyBhIGN1cnNvciB0aGF0IGlzIGV4cGxpY2l0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgIGNoYXJhY3RlciBvbiBvbmUgb2YgaXRzIHNpZGVzLCB0aGlzIHJldHVybnMgdGhlIHNpZGUuIC0xIG1lYW5zXG4gICAgdGhlIGNoYXJhY3RlciBiZWZvcmUgaXRzIHBvc2l0aW9uLCAxIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIsIGFuZCAwXG4gICAgbWVhbnMgbm8gYXNzb2NpYXRpb24uXG4gICAgKi9cbiAgICBnZXQgYXNzb2MoKSB7IHJldHVybiB0aGlzLmZsYWdzICYgOCAvKiBSYW5nZUZsYWcuQXNzb2NCZWZvcmUgKi8gPyAtMSA6IHRoaXMuZmxhZ3MgJiAxNiAvKiBSYW5nZUZsYWcuQXNzb2NBZnRlciAqLyA/IDEgOiAwOyB9XG4gICAgLyoqXG4gICAgVGhlIGJpZGlyZWN0aW9uYWwgdGV4dCBsZXZlbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjdXJzb3IsIGlmXG4gICAgYW55LlxuICAgICovXG4gICAgZ2V0IGJpZGlMZXZlbCgpIHtcbiAgICAgICAgbGV0IGxldmVsID0gdGhpcy5mbGFncyAmIDcgLyogUmFuZ2VGbGFnLkJpZGlMZXZlbE1hc2sgKi87XG4gICAgICAgIHJldHVybiBsZXZlbCA9PSA3ID8gbnVsbCA6IGxldmVsO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZ29hbCBjb2x1bW4gKHN0b3JlZCB2ZXJ0aWNhbCBvZmZzZXQpIGFzc29jaWF0ZWQgd2l0aCBhXG4gICAgY3Vyc29yLiBUaGlzIGlzIHVzZWQgdG8gcHJlc2VydmUgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIHdoZW5cbiAgICBbbW92aW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5tb3ZlVmVydGljYWxseSkgYWNyb3NzXG4gICAgbGluZXMgb2YgZGlmZmVyZW50IGxlbmd0aC5cbiAgICAqL1xuICAgIGdldCBnb2FsQ29sdW1uKCkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmZsYWdzID4+IDYgLyogUmFuZ2VGbGFnLkdvYWxDb2x1bW5PZmZzZXQgKi87XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PSAxNjc3NzIxNSAvKiBSYW5nZUZsYWcuTm9Hb2FsQ29sdW1uICovID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIHJhbmdlIHRocm91Z2ggYSBjaGFuZ2UsIHByb2R1Y2luZyBhIHZhbGlkIHJhbmdlIGluIHRoZVxuICAgIHVwZGF0ZWQgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBtYXAoY2hhbmdlLCBhc3NvYyA9IC0xKSB7XG4gICAgICAgIGxldCBmcm9tLCB0bztcbiAgICAgICAgaWYgKHRoaXMuZW1wdHkpIHtcbiAgICAgICAgICAgIGZyb20gPSB0byA9IGNoYW5nZS5tYXBQb3ModGhpcy5mcm9tLCBhc3NvYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmcm9tID0gY2hhbmdlLm1hcFBvcyh0aGlzLmZyb20sIDEpO1xuICAgICAgICAgICAgdG8gPSBjaGFuZ2UubWFwUG9zKHRoaXMudG8sIC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJvbSA9PSB0aGlzLmZyb20gJiYgdG8gPT0gdGhpcy50byA/IHRoaXMgOiBuZXcgU2VsZWN0aW9uUmFuZ2UoZnJvbSwgdG8sIHRoaXMuZmxhZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBFeHRlbmQgdGhpcyByYW5nZSB0byBjb3ZlciBhdCBsZWFzdCBgZnJvbWAgdG8gYHRvYC5cbiAgICAqL1xuICAgIGV4dGVuZChmcm9tLCB0byA9IGZyb20pIHtcbiAgICAgICAgaWYgKGZyb20gPD0gdGhpcy5hbmNob3IgJiYgdG8gPj0gdGhpcy5hbmNob3IpXG4gICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20sIHRvKTtcbiAgICAgICAgbGV0IGhlYWQgPSBNYXRoLmFicyhmcm9tIC0gdGhpcy5hbmNob3IpID4gTWF0aC5hYnModG8gLSB0aGlzLmFuY2hvcikgPyBmcm9tIDogdG87XG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UodGhpcy5hbmNob3IsIGhlYWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgcmFuZ2UgdG8gYW5vdGhlciByYW5nZS5cbiAgICAqL1xuICAgIGVxKG90aGVyLCBpbmNsdWRlQXNzb2MgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmNob3IgPT0gb3RoZXIuYW5jaG9yICYmIHRoaXMuaGVhZCA9PSBvdGhlci5oZWFkICYmXG4gICAgICAgICAgICAoIWluY2x1ZGVBc3NvYyB8fCAhdGhpcy5lbXB0eSB8fCB0aGlzLmFzc29jID09IG90aGVyLmFzc29jKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgSlNPTi1zZXJpYWxpemFibGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7IHJldHVybiB7IGFuY2hvcjogdGhpcy5hbmNob3IsIGhlYWQ6IHRoaXMuaGVhZCB9OyB9XG4gICAgLyoqXG4gICAgQ29udmVydCBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYSByYW5nZSB0byBhIGBTZWxlY3Rpb25SYW5nZWBcbiAgICBpbnN0YW5jZS5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghanNvbiB8fCB0eXBlb2YganNvbi5hbmNob3IgIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi5oZWFkICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgU2VsZWN0aW9uUmFuZ2VcIik7XG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoanNvbi5hbmNob3IsIGpzb24uaGVhZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShmcm9tLCB0bywgZmxhZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25SYW5nZShmcm9tLCB0bywgZmxhZ3MpO1xuICAgIH1cbn1cbi8qKlxuQW4gZWRpdG9yIHNlbGVjdGlvbiBob2xkcyBvbmUgb3IgbW9yZSBzZWxlY3Rpb24gcmFuZ2VzLlxuKi9cbmNsYXNzIEVkaXRvclNlbGVjdGlvbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHJhbmdlcyBpbiB0aGUgc2VsZWN0aW9uLCBzb3J0ZWQgYnkgcG9zaXRpb24uIFJhbmdlcyBjYW5ub3RcbiAgICBvdmVybGFwIChidXQgdGhleSBtYXkgdG91Y2gsIGlmIHRoZXkgYXJlbid0IGVtcHR5KS5cbiAgICAqL1xuICAgIHJhbmdlcywgXG4gICAgLyoqXG4gICAgVGhlIGluZGV4IG9mIHRoZSBfbWFpbl8gcmFuZ2UgaW4gdGhlIHNlbGVjdGlvbiAod2hpY2ggaXNcbiAgICB1c3VhbGx5IHRoZSByYW5nZSB0aGF0IHdhcyBhZGRlZCBsYXN0KS5cbiAgICAqL1xuICAgIG1haW5JbmRleCkge1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcztcbiAgICAgICAgdGhpcy5tYWluSW5kZXggPSBtYWluSW5kZXg7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCBhIHNlbGVjdGlvbiB0aHJvdWdoIGEgY2hhbmdlLiBVc2VkIHRvIGFkanVzdCB0aGUgc2VsZWN0aW9uXG4gICAgcG9zaXRpb24gZm9yIGNoYW5nZXMuXG4gICAgKi9cbiAgICBtYXAoY2hhbmdlLCBhc3NvYyA9IC0xKSB7XG4gICAgICAgIGlmIChjaGFuZ2UuZW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUodGhpcy5yYW5nZXMubWFwKHIgPT4gci5tYXAoY2hhbmdlLCBhc3NvYykpLCB0aGlzLm1haW5JbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyBzZWxlY3Rpb24gdG8gYW5vdGhlciBzZWxlY3Rpb24uIEJ5IGRlZmF1bHQsIHJhbmdlc1xuICAgIGFyZSBjb21wYXJlZCBvbmx5IGJ5IHBvc2l0aW9uLiBXaGVuIGBpbmNsdWRlQXNzb2NgIGlzIHRydWUsXG4gICAgY3Vyc29yIHJhbmdlcyBtdXN0IGFsc28gaGF2ZSB0aGUgc2FtZVxuICAgIFtgYXNzb2NgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvblJhbmdlLmFzc29jKSB2YWx1ZS5cbiAgICAqL1xuICAgIGVxKG90aGVyLCBpbmNsdWRlQXNzb2MgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5yYW5nZXMubGVuZ3RoICE9IG90aGVyLnJhbmdlcy5sZW5ndGggfHxcbiAgICAgICAgICAgIHRoaXMubWFpbkluZGV4ICE9IG90aGVyLm1haW5JbmRleClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghdGhpcy5yYW5nZXNbaV0uZXEob3RoZXIucmFuZ2VzW2ldLCBpbmNsdWRlQXNzb2MpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgcHJpbWFyeSBzZWxlY3Rpb24gcmFuZ2UuIFVzdWFsbHksIHlvdSBzaG91bGQgbWFrZSBzdXJlXG4gICAgeW91ciBjb2RlIGFwcGxpZXMgdG8gX2FsbF8gcmFuZ2VzLCBieSB1c2luZyBtZXRob2RzIGxpa2VcbiAgICBbYGNoYW5nZUJ5UmFuZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmNoYW5nZUJ5UmFuZ2UpLlxuICAgICovXG4gICAgZ2V0IG1haW4oKSB7IHJldHVybiB0aGlzLnJhbmdlc1t0aGlzLm1haW5JbmRleF07IH1cbiAgICAvKipcbiAgICBNYWtlIHN1cmUgdGhlIHNlbGVjdGlvbiBvbmx5IGhhcyBvbmUgcmFuZ2UuIFJldHVybnMgYSBzZWxlY3Rpb25cbiAgICBob2xkaW5nIG9ubHkgdGhlIG1haW4gcmFuZ2UgZnJvbSB0aGlzIHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIGFzU2luZ2xlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZXMubGVuZ3RoID09IDEgPyB0aGlzIDogbmV3IEVkaXRvclNlbGVjdGlvbihbdGhpcy5tYWluXSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEV4dGVuZCB0aGlzIHNlbGVjdGlvbiB3aXRoIGFuIGV4dHJhIHJhbmdlLlxuICAgICovXG4gICAgYWRkUmFuZ2UocmFuZ2UsIG1haW4gPSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKFtyYW5nZV0uY29uY2F0KHRoaXMucmFuZ2VzKSwgbWFpbiA/IDAgOiB0aGlzLm1haW5JbmRleCArIDEpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIGEgZ2l2ZW4gcmFuZ2Ugd2l0aCBhbm90aGVyIHJhbmdlLCBhbmQgdGhlbiBub3JtYWxpemUgdGhlXG4gICAgc2VsZWN0aW9uIHRvIG1lcmdlIGFuZCBzb3J0IHJhbmdlcyBpZiBuZWNlc3NhcnkuXG4gICAgKi9cbiAgICByZXBsYWNlUmFuZ2UocmFuZ2UsIHdoaWNoID0gdGhpcy5tYWluSW5kZXgpIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IHRoaXMucmFuZ2VzLnNsaWNlKCk7XG4gICAgICAgIHJhbmdlc1t3aGljaF0gPSByYW5nZTtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzLCB0aGlzLm1haW5JbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnZlcnQgdGhpcyBzZWxlY3Rpb24gdG8gYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHNlcmlhbGl6ZWQgdG9cbiAgICBKU09OLlxuICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyByYW5nZXM6IHRoaXMucmFuZ2VzLm1hcChyID0+IHIudG9KU09OKCkpLCBtYWluOiB0aGlzLm1haW5JbmRleCB9O1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZWxlY3Rpb24gZnJvbSBhIEpTT04gcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIWpzb24gfHwgIUFycmF5LmlzQXJyYXkoanNvbi5yYW5nZXMpIHx8IHR5cGVvZiBqc29uLm1haW4gIT0gXCJudW1iZXJcIiB8fCBqc29uLm1haW4gPj0ganNvbi5yYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEVkaXRvclNlbGVjdGlvblwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFZGl0b3JTZWxlY3Rpb24oanNvbi5yYW5nZXMubWFwKChyKSA9PiBTZWxlY3Rpb25SYW5nZS5mcm9tSlNPTihyKSksIGpzb24ubWFpbik7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNlbGVjdGlvbiBob2xkaW5nIGEgc2luZ2xlIHJhbmdlLlxuICAgICovXG4gICAgc3RhdGljIHNpbmdsZShhbmNob3IsIGhlYWQgPSBhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFZGl0b3JTZWxlY3Rpb24oW0VkaXRvclNlbGVjdGlvbi5yYW5nZShhbmNob3IsIGhlYWQpXSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFNvcnQgYW5kIG1lcmdlIHRoZSBnaXZlbiBzZXQgb2YgcmFuZ2VzLCBjcmVhdGluZyBhIHZhbGlkXG4gICAgc2VsZWN0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShyYW5nZXMsIG1haW5JbmRleCA9IDApIHtcbiAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQSBzZWxlY3Rpb24gbmVlZHMgYXQgbGVhc3Qgb25lIHJhbmdlXCIpO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gcmFuZ2VzW2ldO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVtcHR5ID8gcmFuZ2UuZnJvbSA8PSBwb3MgOiByYW5nZS5mcm9tIDwgcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24ubm9ybWFsaXplZChyYW5nZXMuc2xpY2UoKSwgbWFpbkluZGV4KTtcbiAgICAgICAgICAgIHBvcyA9IHJhbmdlLnRvO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRWRpdG9yU2VsZWN0aW9uKHJhbmdlcywgbWFpbkluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgY3Vyc29yIHNlbGVjdGlvbiByYW5nZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uIFlvdSBjYW5cbiAgICBzYWZlbHkgaWdub3JlIHRoZSBvcHRpb25hbCBhcmd1bWVudHMgaW4gbW9zdCBzaXR1YXRpb25zLlxuICAgICovXG4gICAgc3RhdGljIGN1cnNvcihwb3MsIGFzc29jID0gMCwgYmlkaUxldmVsLCBnb2FsQ29sdW1uKSB7XG4gICAgICAgIHJldHVybiBTZWxlY3Rpb25SYW5nZS5jcmVhdGUocG9zLCBwb3MsIChhc3NvYyA9PSAwID8gMCA6IGFzc29jIDwgMCA/IDggLyogUmFuZ2VGbGFnLkFzc29jQmVmb3JlICovIDogMTYgLyogUmFuZ2VGbGFnLkFzc29jQWZ0ZXIgKi8pIHxcbiAgICAgICAgICAgIChiaWRpTGV2ZWwgPT0gbnVsbCA/IDcgOiBNYXRoLm1pbig2LCBiaWRpTGV2ZWwpKSB8XG4gICAgICAgICAgICAoKGdvYWxDb2x1bW4gIT09IG51bGwgJiYgZ29hbENvbHVtbiAhPT0gdm9pZCAwID8gZ29hbENvbHVtbiA6IDE2Nzc3MjE1IC8qIFJhbmdlRmxhZy5Ob0dvYWxDb2x1bW4gKi8pIDw8IDYgLyogUmFuZ2VGbGFnLkdvYWxDb2x1bW5PZmZzZXQgKi8pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2VsZWN0aW9uIHJhbmdlLlxuICAgICovXG4gICAgc3RhdGljIHJhbmdlKGFuY2hvciwgaGVhZCwgZ29hbENvbHVtbiwgYmlkaUxldmVsKSB7XG4gICAgICAgIGxldCBmbGFncyA9ICgoZ29hbENvbHVtbiAhPT0gbnVsbCAmJiBnb2FsQ29sdW1uICE9PSB2b2lkIDAgPyBnb2FsQ29sdW1uIDogMTY3NzcyMTUgLyogUmFuZ2VGbGFnLk5vR29hbENvbHVtbiAqLykgPDwgNiAvKiBSYW5nZUZsYWcuR29hbENvbHVtbk9mZnNldCAqLykgfFxuICAgICAgICAgICAgKGJpZGlMZXZlbCA9PSBudWxsID8gNyA6IE1hdGgubWluKDYsIGJpZGlMZXZlbCkpO1xuICAgICAgICByZXR1cm4gaGVhZCA8IGFuY2hvciA/IFNlbGVjdGlvblJhbmdlLmNyZWF0ZShoZWFkLCBhbmNob3IsIDMyIC8qIFJhbmdlRmxhZy5JbnZlcnRlZCAqLyB8IDE2IC8qIFJhbmdlRmxhZy5Bc3NvY0FmdGVyICovIHwgZmxhZ3MpXG4gICAgICAgICAgICA6IFNlbGVjdGlvblJhbmdlLmNyZWF0ZShhbmNob3IsIGhlYWQsIChoZWFkID4gYW5jaG9yID8gOCAvKiBSYW5nZUZsYWcuQXNzb2NCZWZvcmUgKi8gOiAwKSB8IGZsYWdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgbm9ybWFsaXplZChyYW5nZXMsIG1haW5JbmRleCA9IDApIHtcbiAgICAgICAgbGV0IG1haW4gPSByYW5nZXNbbWFpbkluZGV4XTtcbiAgICAgICAgcmFuZ2VzLnNvcnQoKGEsIGIpID0+IGEuZnJvbSAtIGIuZnJvbSk7XG4gICAgICAgIG1haW5JbmRleCA9IHJhbmdlcy5pbmRleE9mKG1haW4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gcmFuZ2VzW2ldLCBwcmV2ID0gcmFuZ2VzW2kgLSAxXTtcbiAgICAgICAgICAgIGlmIChyYW5nZS5lbXB0eSA/IHJhbmdlLmZyb20gPD0gcHJldi50byA6IHJhbmdlLmZyb20gPCBwcmV2LnRvKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBwcmV2LmZyb20sIHRvID0gTWF0aC5tYXgocmFuZ2UudG8sIHByZXYudG8pO1xuICAgICAgICAgICAgICAgIGlmIChpIDw9IG1haW5JbmRleClcbiAgICAgICAgICAgICAgICAgICAgbWFpbkluZGV4LS07XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnNwbGljZSgtLWksIDIsIHJhbmdlLmFuY2hvciA+IHJhbmdlLmhlYWQgPyBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UodG8sIGZyb20pIDogRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20sIHRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFZGl0b3JTZWxlY3Rpb24ocmFuZ2VzLCBtYWluSW5kZXgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrU2VsZWN0aW9uKHNlbGVjdGlvbiwgZG9jTGVuZ3RoKSB7XG4gICAgZm9yIChsZXQgcmFuZ2Ugb2Ygc2VsZWN0aW9uLnJhbmdlcylcbiAgICAgICAgaWYgKHJhbmdlLnRvID4gZG9jTGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJTZWxlY3Rpb24gcG9pbnRzIG91dHNpZGUgb2YgZG9jdW1lbnRcIik7XG59XG5cbmxldCBuZXh0SUQgPSAwO1xuLyoqXG5BIGZhY2V0IGlzIGEgbGFiZWxlZCB2YWx1ZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlZGl0b3JcbnN0YXRlLiBJdCB0YWtlcyBpbnB1dHMgZnJvbSBhbnkgbnVtYmVyIG9mIGV4dGVuc2lvbnMsIGFuZCBjb21iaW5lc1xudGhvc2UgaW50byBhIHNpbmdsZSBvdXRwdXQgdmFsdWUuXG5cbkV4YW1wbGVzIG9mIHVzZXMgb2YgZmFjZXRzIGFyZSB0aGUgW3RhYlxuc2l6ZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50YWJTaXplKSwgW2VkaXRvclxuYXR0cmlidXRlc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeZWRpdG9yQXR0cmlidXRlcyksIGFuZCBbdXBkYXRlXG5saXN0ZW5lcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnVwZGF0ZUxpc3RlbmVyKS5cblxuTm90ZSB0aGF0IGBGYWNldGAgaW5zdGFuY2VzIGNhbiBiZSB1c2VkIGFueXdoZXJlIHdoZXJlXG5bYEZhY2V0UmVhZGVyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5GYWNldFJlYWRlcikgaXMgZXhwZWN0ZWQuXG4qL1xuY2xhc3MgRmFjZXQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tYmluZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXJlSW5wdXQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcGFyZSwgaXNTdGF0aWMsIGVuYWJsZXMpIHtcbiAgICAgICAgdGhpcy5jb21iaW5lID0gY29tYmluZTtcbiAgICAgICAgdGhpcy5jb21wYXJlSW5wdXQgPSBjb21wYXJlSW5wdXQ7XG4gICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmU7XG4gICAgICAgIHRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gbmV4dElEKys7XG4gICAgICAgIHRoaXMuZGVmYXVsdCA9IGNvbWJpbmUoW10pO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSB0eXBlb2YgZW5hYmxlcyA9PSBcImZ1bmN0aW9uXCIgPyBlbmFibGVzKHRoaXMpIDogZW5hYmxlcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhIGZhY2V0IHJlYWRlciBmb3IgdGhpcyBmYWNldCwgd2hpY2ggY2FuIGJlIHVzZWQgdG9cbiAgICBbcmVhZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5mYWNldCkgaXQgYnV0IG5vdCB0byBkZWZpbmUgdmFsdWVzIGZvciBpdC5cbiAgICAqL1xuICAgIGdldCByZWFkZXIoKSB7IHJldHVybiB0aGlzOyB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbmV3IGZhY2V0LlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShjb25maWcgPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IEZhY2V0KGNvbmZpZy5jb21iaW5lIHx8ICgoYSkgPT4gYSksIGNvbmZpZy5jb21wYXJlSW5wdXQgfHwgKChhLCBiKSA9PiBhID09PSBiKSwgY29uZmlnLmNvbXBhcmUgfHwgKCFjb25maWcuY29tYmluZSA/IHNhbWVBcnJheSA6IChhLCBiKSA9PiBhID09PSBiKSwgISFjb25maWcuc3RhdGljLCBjb25maWcuZW5hYmxlcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgYWRkcyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhpcyBmYWNldC5cbiAgICAqL1xuICAgIG9mKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmFjZXRQcm92aWRlcihbXSwgdGhpcywgMCAvKiBQcm92aWRlci5TdGF0aWMgKi8sIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IGNvbXB1dGVzIGEgdmFsdWUgZm9yIHRoZSBmYWNldCBmcm9tIGFcbiAgICBzdGF0ZS4gWW91IG11c3QgdGFrZSBjYXJlIHRvIGRlY2xhcmUgdGhlIHBhcnRzIG9mIHRoZSBzdGF0ZSB0aGF0XG4gICAgdGhpcyB2YWx1ZSBkZXBlbmRzIG9uLCBzaW5jZSB5b3VyIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGFnYWluXG4gICAgZm9yIGEgbmV3IHN0YXRlIHdoZW4gb25lIG9mIHRob3NlIHBhcnRzIGNoYW5nZWQuXG4gICAgXG4gICAgSW4gY2FzZXMgd2hlcmUgeW91ciB2YWx1ZSBkZXBlbmRzIG9ubHkgb24gYSBzaW5nbGUgZmllbGQsIHlvdSdsbFxuICAgIHdhbnQgdG8gdXNlIHRoZSBbYGZyb21gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkZhY2V0LmZyb20pIG1ldGhvZCBpbnN0ZWFkLlxuICAgICovXG4gICAgY29tcHV0ZShkZXBzLCBnZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTdGF0aWMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjb21wdXRlIGEgc3RhdGljIGZhY2V0XCIpO1xuICAgICAgICByZXR1cm4gbmV3IEZhY2V0UHJvdmlkZXIoZGVwcywgdGhpcywgMSAvKiBQcm92aWRlci5TaW5nbGUgKi8sIGdldCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBjb21wdXRlcyB6ZXJvIG9yIG1vcmUgdmFsdWVzIGZvciB0aGlzXG4gICAgZmFjZXQgZnJvbSBhIHN0YXRlLlxuICAgICovXG4gICAgY29tcHV0ZU4oZGVwcywgZ2V0KSB7XG4gICAgICAgIGlmICh0aGlzLmlzU3RhdGljKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY29tcHV0ZSBhIHN0YXRpYyBmYWNldFwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWNldFByb3ZpZGVyKGRlcHMsIHRoaXMsIDIgLyogUHJvdmlkZXIuTXVsdGkgKi8sIGdldCk7XG4gICAgfVxuICAgIGZyb20oZmllbGQsIGdldCkge1xuICAgICAgICBpZiAoIWdldClcbiAgICAgICAgICAgIGdldCA9IHggPT4geDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZShbZmllbGRdLCBzdGF0ZSA9PiBnZXQoc3RhdGUuZmllbGQoZmllbGQpKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZUFycmF5KGEsIGIpIHtcbiAgICByZXR1cm4gYSA9PSBiIHx8IGEubGVuZ3RoID09IGIubGVuZ3RoICYmIGEuZXZlcnkoKGUsIGkpID0+IGUgPT09IGJbaV0pO1xufVxuY2xhc3MgRmFjZXRQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoZGVwZW5kZW5jaWVzLCBmYWNldCwgdHlwZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXM7XG4gICAgICAgIHRoaXMuZmFjZXQgPSBmYWNldDtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmlkID0gbmV4dElEKys7XG4gICAgfVxuICAgIGR5bmFtaWNTbG90KGFkZHJlc3Nlcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBnZXR0ZXIgPSB0aGlzLnZhbHVlO1xuICAgICAgICBsZXQgY29tcGFyZSA9IHRoaXMuZmFjZXQuY29tcGFyZUlucHV0O1xuICAgICAgICBsZXQgaWQgPSB0aGlzLmlkLCBpZHggPSBhZGRyZXNzZXNbaWRdID4+IDEsIG11bHRpID0gdGhpcy50eXBlID09IDIgLyogUHJvdmlkZXIuTXVsdGkgKi87XG4gICAgICAgIGxldCBkZXBEb2MgPSBmYWxzZSwgZGVwU2VsID0gZmFsc2UsIGRlcEFkZHJzID0gW107XG4gICAgICAgIGZvciAobGV0IGRlcCBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgaWYgKGRlcCA9PSBcImRvY1wiKVxuICAgICAgICAgICAgICAgIGRlcERvYyA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChkZXAgPT0gXCJzZWxlY3Rpb25cIilcbiAgICAgICAgICAgICAgICBkZXBTZWwgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoKCgoX2EgPSBhZGRyZXNzZXNbZGVwLmlkXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMSkgJiAxKSA9PSAwKVxuICAgICAgICAgICAgICAgIGRlcEFkZHJzLnB1c2goYWRkcmVzc2VzW2RlcC5pZF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjcmVhdGUoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IGdldHRlcihzdGF0ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZShzdGF0ZSwgdHIpIHtcbiAgICAgICAgICAgICAgICBpZiAoKGRlcERvYyAmJiB0ci5kb2NDaGFuZ2VkKSB8fCAoZGVwU2VsICYmICh0ci5kb2NDaGFuZ2VkIHx8IHRyLnNlbGVjdGlvbikpIHx8IGVuc3VyZUFsbChzdGF0ZSwgZGVwQWRkcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdWYWwgPSBnZXR0ZXIoc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGkgPyAhY29tcGFyZUFycmF5KG5ld1ZhbCwgc3RhdGUudmFsdWVzW2lkeF0sIGNvbXBhcmUpIDogIWNvbXBhcmUobmV3VmFsLCBzdGF0ZS52YWx1ZXNbaWR4XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gbmV3VmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlY29uZmlndXJlOiAoc3RhdGUsIG9sZFN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1ZhbCwgb2xkQWRkciA9IG9sZFN0YXRlLmNvbmZpZy5hZGRyZXNzW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAob2xkQWRkciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvbGRWYWwgPSBnZXRBZGRyKG9sZFN0YXRlLCBvbGRBZGRyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzLmV2ZXJ5KGRlcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVwIGluc3RhbmNlb2YgRmFjZXQgPyBvbGRTdGF0ZS5mYWNldChkZXApID09PSBzdGF0ZS5mYWNldChkZXApIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXAgaW5zdGFuY2VvZiBTdGF0ZUZpZWxkID8gb2xkU3RhdGUuZmllbGQoZGVwLCBmYWxzZSkgPT0gc3RhdGUuZmllbGQoZGVwLCBmYWxzZSkgOiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9KSB8fCAobXVsdGkgPyBjb21wYXJlQXJyYXkobmV3VmFsID0gZ2V0dGVyKHN0YXRlKSwgb2xkVmFsLCBjb21wYXJlKSA6IGNvbXBhcmUobmV3VmFsID0gZ2V0dGVyKHN0YXRlKSwgb2xkVmFsKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gb2xkVmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbCA9IGdldHRlcihzdGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gbmV3VmFsO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21wYXJlQXJyYXkoYSwgYiwgY29tcGFyZSkge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCFjb21wYXJlKGFbaV0sIGJbaV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZW5zdXJlQWxsKHN0YXRlLCBhZGRycykge1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgYWRkciBvZiBhZGRycylcbiAgICAgICAgaWYgKGVuc3VyZUFkZHIoc3RhdGUsIGFkZHIpICYgMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi8pXG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gY2hhbmdlZDtcbn1cbmZ1bmN0aW9uIGR5bmFtaWNGYWNldFNsb3QoYWRkcmVzc2VzLCBmYWNldCwgcHJvdmlkZXJzKSB7XG4gICAgbGV0IHByb3ZpZGVyQWRkcnMgPSBwcm92aWRlcnMubWFwKHAgPT4gYWRkcmVzc2VzW3AuaWRdKTtcbiAgICBsZXQgcHJvdmlkZXJUeXBlcyA9IHByb3ZpZGVycy5tYXAocCA9PiBwLnR5cGUpO1xuICAgIGxldCBkeW5hbWljID0gcHJvdmlkZXJBZGRycy5maWx0ZXIocCA9PiAhKHAgJiAxKSk7XG4gICAgbGV0IGlkeCA9IGFkZHJlc3Nlc1tmYWNldC5pZF0gPj4gMTtcbiAgICBmdW5jdGlvbiBnZXQoc3RhdGUpIHtcbiAgICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3ZpZGVyQWRkcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldEFkZHIoc3RhdGUsIHByb3ZpZGVyQWRkcnNbaV0pO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVyVHlwZXNbaV0gPT0gMiAvKiBQcm92aWRlci5NdWx0aSAqLylcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB2YWwgb2YgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWNldC5jb21iaW5lKHZhbHVlcyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgYWRkciBvZiBwcm92aWRlckFkZHJzKVxuICAgICAgICAgICAgICAgIGVuc3VyZUFkZHIoc3RhdGUsIGFkZHIpO1xuICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBnZXQoc3RhdGUpO1xuICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICB9LFxuICAgICAgICB1cGRhdGUoc3RhdGUsIHRyKSB7XG4gICAgICAgICAgICBpZiAoIWVuc3VyZUFsbChzdGF0ZSwgZHluYW1pYykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBnZXQoc3RhdGUpO1xuICAgICAgICAgICAgaWYgKGZhY2V0LmNvbXBhcmUodmFsdWUsIHN0YXRlLnZhbHVlc1tpZHhdKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgIH0sXG4gICAgICAgIHJlY29uZmlndXJlKHN0YXRlLCBvbGRTdGF0ZSkge1xuICAgICAgICAgICAgbGV0IGRlcENoYW5nZWQgPSBlbnN1cmVBbGwoc3RhdGUsIHByb3ZpZGVyQWRkcnMpO1xuICAgICAgICAgICAgbGV0IG9sZFByb3ZpZGVycyA9IG9sZFN0YXRlLmNvbmZpZy5mYWNldHNbZmFjZXQuaWRdLCBvbGRWYWx1ZSA9IG9sZFN0YXRlLmZhY2V0KGZhY2V0KTtcbiAgICAgICAgICAgIGlmIChvbGRQcm92aWRlcnMgJiYgIWRlcENoYW5nZWQgJiYgc2FtZUFycmF5KHByb3ZpZGVycywgb2xkUHJvdmlkZXJzKSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gb2xkVmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBnZXQoc3RhdGUpO1xuICAgICAgICAgICAgaWYgKGZhY2V0LmNvbXBhcmUodmFsdWUsIG9sZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gb2xkVmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmNvbnN0IGluaXRGaWVsZCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBzdGF0aWM6IHRydWUgfSk7XG4vKipcbkZpZWxkcyBjYW4gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiBhbiBlZGl0b3Igc3RhdGUsIGFuZFxua2VlcCBpdCBpbiBzeW5jIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHN0YXRlLlxuKi9cbmNsYXNzIFN0YXRlRmllbGQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaWQsIGNyZWF0ZUYsIHVwZGF0ZUYsIGNvbXBhcmVGLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNwZWMpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmNyZWF0ZUYgPSBjcmVhdGVGO1xuICAgICAgICB0aGlzLnVwZGF0ZUYgPSB1cGRhdGVGO1xuICAgICAgICB0aGlzLmNvbXBhcmVGID0gY29tcGFyZUY7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcm92aWRlcyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgc3RhdGUgZmllbGQuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKGNvbmZpZykge1xuICAgICAgICBsZXQgZmllbGQgPSBuZXcgU3RhdGVGaWVsZChuZXh0SUQrKywgY29uZmlnLmNyZWF0ZSwgY29uZmlnLnVwZGF0ZSwgY29uZmlnLmNvbXBhcmUgfHwgKChhLCBiKSA9PiBhID09PSBiKSwgY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlKVxuICAgICAgICAgICAgZmllbGQucHJvdmlkZXMgPSBjb25maWcucHJvdmlkZShmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG4gICAgY3JlYXRlKHN0YXRlKSB7XG4gICAgICAgIGxldCBpbml0ID0gc3RhdGUuZmFjZXQoaW5pdEZpZWxkKS5maW5kKGkgPT4gaS5maWVsZCA9PSB0aGlzKTtcbiAgICAgICAgcmV0dXJuICgoaW5pdCA9PT0gbnVsbCB8fCBpbml0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbml0LmNyZWF0ZSkgfHwgdGhpcy5jcmVhdGVGKShzdGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2xvdChhZGRyZXNzZXMpIHtcbiAgICAgICAgbGV0IGlkeCA9IGFkZHJlc3Nlc1t0aGlzLmlkXSA+PiAxO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3JlYXRlOiAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHRoaXMuY3JlYXRlKHN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlOiAoc3RhdGUsIHRyKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG9sZFZhbCA9IHN0YXRlLnZhbHVlc1tpZHhdO1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMudXBkYXRlRihvbGRWYWwsIHRyKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYXJlRihvbGRWYWwsIHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVjb25maWd1cmU6IChzdGF0ZSwgb2xkU3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW5pdCA9IHN0YXRlLmZhY2V0KGluaXRGaWVsZCksIG9sZEluaXQgPSBvbGRTdGF0ZS5mYWNldChpbml0RmllbGQpLCByZUluaXQ7XG4gICAgICAgICAgICAgICAgaWYgKChyZUluaXQgPSBpbml0LmZpbmQoaSA9PiBpLmZpZWxkID09IHRoaXMpKSAmJiByZUluaXQgIT0gb2xkSW5pdC5maW5kKGkgPT4gaS5maWVsZCA9PSB0aGlzKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHJlSW5pdC5jcmVhdGUoc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvbGRTdGF0ZS5jb25maWcuYWRkcmVzc1t0aGlzLmlkXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gb2xkU3RhdGUuZmllbGQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHRoaXMuY3JlYXRlKHN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyB0aGlzIGZpZWxkIGFuZCBvdmVycmlkZXMgdGhlXG4gICAgd2F5IGl0IGlzIGluaXRpYWxpemVkLiBDYW4gYmUgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gcHJvdmlkZSBhXG4gICAgbm9uLWRlZmF1bHQgc3RhcnRpbmcgdmFsdWUgZm9yIHRoZSBmaWVsZC5cbiAgICAqL1xuICAgIGluaXQoY3JlYXRlKSB7XG4gICAgICAgIHJldHVybiBbdGhpcywgaW5pdEZpZWxkLm9mKHsgZmllbGQ6IHRoaXMsIGNyZWF0ZSB9KV07XG4gICAgfVxuICAgIC8qKlxuICAgIFN0YXRlIGZpZWxkIGluc3RhbmNlcyBjYW4gYmUgdXNlZCBhc1xuICAgIFtgRXh0ZW5zaW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FeHRlbnNpb24pIHZhbHVlcyB0byBlbmFibGUgdGhlIGZpZWxkIGluIGFcbiAgICBnaXZlbiBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCBleHRlbnNpb24oKSB7IHJldHVybiB0aGlzOyB9XG59XG5jb25zdCBQcmVjXyA9IHsgbG93ZXN0OiA0LCBsb3c6IDMsIGRlZmF1bHQ6IDIsIGhpZ2g6IDEsIGhpZ2hlc3Q6IDAgfTtcbmZ1bmN0aW9uIHByZWModmFsdWUpIHtcbiAgICByZXR1cm4gKGV4dCkgPT4gbmV3IFByZWNFeHRlbnNpb24oZXh0LCB2YWx1ZSk7XG59XG4vKipcbkJ5IGRlZmF1bHQgZXh0ZW5zaW9ucyBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZm91bmRcbmluIHRoZSBmbGF0dGVuZWQgZm9ybSBvZiBuZXN0ZWQgYXJyYXkgdGhhdCB3YXMgcHJvdmlkZWQuXG5JbmRpdmlkdWFsIGV4dGVuc2lvbiB2YWx1ZXMgY2FuIGJlIGFzc2lnbmVkIGEgcHJlY2VkZW5jZSB0b1xub3ZlcnJpZGUgdGhpcy4gRXh0ZW5zaW9ucyB0aGF0IGRvIG5vdCBoYXZlIGEgcHJlY2VkZW5jZSBzZXQgZ2V0XG50aGUgcHJlY2VkZW5jZSBvZiB0aGUgbmVhcmVzdCBwYXJlbnQgd2l0aCBhIHByZWNlZGVuY2UsIG9yXG5bYGRlZmF1bHRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlByZWMuZGVmYXVsdCkgaWYgdGhlcmUgaXMgbm8gc3VjaCBwYXJlbnQuIFRoZVxuZmluYWwgb3JkZXJpbmcgb2YgZXh0ZW5zaW9ucyBpcyBkZXRlcm1pbmVkIGJ5IGZpcnN0IHNvcnRpbmcgYnlcbnByZWNlZGVuY2UgYW5kIHRoZW4gYnkgb3JkZXIgd2l0aGluIGVhY2ggcHJlY2VkZW5jZS5cbiovXG5jb25zdCBQcmVjID0ge1xuICAgIC8qKlxuICAgIFRoZSBoaWdoZXN0IHByZWNlZGVuY2UgbGV2ZWwsIGZvciBleHRlbnNpb25zIHRoYXQgc2hvdWxkIGVuZCB1cFxuICAgIG5lYXIgdGhlIHN0YXJ0IG9mIHRoZSBwcmVjZWRlbmNlIG9yZGVyaW5nLlxuICAgICovXG4gICAgaGlnaGVzdDogLypAX19QVVJFX18qL3ByZWMoUHJlY18uaGlnaGVzdCksXG4gICAgLyoqXG4gICAgQSBoaWdoZXItdGhhbi1kZWZhdWx0IHByZWNlZGVuY2UsIGZvciBleHRlbnNpb25zIHRoYXQgc2hvdWxkXG4gICAgY29tZSBiZWZvcmUgdGhvc2Ugd2l0aCBkZWZhdWx0IHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBoaWdoOiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5oaWdoKSxcbiAgICAvKipcbiAgICBUaGUgZGVmYXVsdCBwcmVjZWRlbmNlLCB3aGljaCBpcyBhbHNvIHVzZWQgZm9yIGV4dGVuc2lvbnNcbiAgICB3aXRob3V0IGFuIGV4cGxpY2l0IHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBkZWZhdWx0OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5kZWZhdWx0KSxcbiAgICAvKipcbiAgICBBIGxvd2VyLXRoYW4tZGVmYXVsdCBwcmVjZWRlbmNlLlxuICAgICovXG4gICAgbG93OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5sb3cpLFxuICAgIC8qKlxuICAgIFRoZSBsb3dlc3QgcHJlY2VkZW5jZSBsZXZlbC4gTWVhbnQgZm9yIHRoaW5ncyB0aGF0IHNob3VsZCBlbmQgdXBcbiAgICBuZWFyIHRoZSBlbmQgb2YgdGhlIGV4dGVuc2lvbiBvcmRlci5cbiAgICAqL1xuICAgIGxvd2VzdDogLypAX19QVVJFX18qL3ByZWMoUHJlY18ubG93ZXN0KVxufTtcbmNsYXNzIFByZWNFeHRlbnNpb24ge1xuICAgIGNvbnN0cnVjdG9yKGlubmVyLCBwcmVjKSB7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBpbm5lcjtcbiAgICAgICAgdGhpcy5wcmVjID0gcHJlYztcbiAgICB9XG59XG4vKipcbkV4dGVuc2lvbiBjb21wYXJ0bWVudHMgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIGNvbmZpZ3VyYXRpb25cbmR5bmFtaWMuIEJ5IFt3cmFwcGluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5Db21wYXJ0bWVudC5vZikgcGFydCBvZiB5b3VyXG5jb25maWd1cmF0aW9uIGluIGEgY29tcGFydG1lbnQsIHlvdSBjYW4gbGF0ZXJcbltyZXBsYWNlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNvbXBhcnRtZW50LnJlY29uZmlndXJlKSB0aGF0IHBhcnQgdGhyb3VnaCBhXG50cmFuc2FjdGlvbi5cbiovXG5jbGFzcyBDb21wYXJ0bWVudCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY29tcGFydG1lbnQgdG8gYWRkIHRvIHlvdXIgW3N0YXRlXG4gICAgY29uZmlndXJhdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZUNvbmZpZy5leHRlbnNpb25zKS5cbiAgICAqL1xuICAgIG9mKGV4dCkgeyByZXR1cm4gbmV3IENvbXBhcnRtZW50SW5zdGFuY2UodGhpcywgZXh0KTsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBbZWZmZWN0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5lZmZlY3RzKSB0aGF0XG4gICAgcmVjb25maWd1cmVzIHRoaXMgY29tcGFydG1lbnQuXG4gICAgKi9cbiAgICByZWNvbmZpZ3VyZShjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZS5vZih7IGNvbXBhcnRtZW50OiB0aGlzLCBleHRlbnNpb246IGNvbnRlbnQgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBjb21wYXJ0bWVudCBpbiB0aGUgc3RhdGUsIG9yXG4gICAgYHVuZGVmaW5lZGAgaWYgaXQgaXNuJ3QgcHJlc2VudC5cbiAgICAqL1xuICAgIGdldChzdGF0ZSkge1xuICAgICAgICByZXR1cm4gc3RhdGUuY29uZmlnLmNvbXBhcnRtZW50cy5nZXQodGhpcyk7XG4gICAgfVxufVxuY2xhc3MgQ29tcGFydG1lbnRJbnN0YW5jZSB7XG4gICAgY29uc3RydWN0b3IoY29tcGFydG1lbnQsIGlubmVyKSB7XG4gICAgICAgIHRoaXMuY29tcGFydG1lbnQgPSBjb21wYXJ0bWVudDtcbiAgICAgICAgdGhpcy5pbm5lciA9IGlubmVyO1xuICAgIH1cbn1cbmNsYXNzIENvbmZpZ3VyYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIGNvbXBhcnRtZW50cywgZHluYW1pY1Nsb3RzLCBhZGRyZXNzLCBzdGF0aWNWYWx1ZXMsIGZhY2V0cykge1xuICAgICAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgICAgICB0aGlzLmNvbXBhcnRtZW50cyA9IGNvbXBhcnRtZW50cztcbiAgICAgICAgdGhpcy5keW5hbWljU2xvdHMgPSBkeW5hbWljU2xvdHM7XG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgICAgIHRoaXMuc3RhdGljVmFsdWVzID0gc3RhdGljVmFsdWVzO1xuICAgICAgICB0aGlzLmZhY2V0cyA9IGZhY2V0cztcbiAgICAgICAgdGhpcy5zdGF0dXNUZW1wbGF0ZSA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5zdGF0dXNUZW1wbGF0ZS5sZW5ndGggPCBkeW5hbWljU2xvdHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5zdGF0dXNUZW1wbGF0ZS5wdXNoKDAgLyogU2xvdFN0YXR1cy5VbnJlc29sdmVkICovKTtcbiAgICB9XG4gICAgc3RhdGljRmFjZXQoZmFjZXQpIHtcbiAgICAgICAgbGV0IGFkZHIgPSB0aGlzLmFkZHJlc3NbZmFjZXQuaWRdO1xuICAgICAgICByZXR1cm4gYWRkciA9PSBudWxsID8gZmFjZXQuZGVmYXVsdCA6IHRoaXMuc3RhdGljVmFsdWVzW2FkZHIgPj4gMV07XG4gICAgfVxuICAgIHN0YXRpYyByZXNvbHZlKGJhc2UsIGNvbXBhcnRtZW50cywgb2xkU3RhdGUpIHtcbiAgICAgICAgbGV0IGZpZWxkcyA9IFtdO1xuICAgICAgICBsZXQgZmFjZXRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IG5ld0NvbXBhcnRtZW50cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChsZXQgZXh0IG9mIGZsYXR0ZW4oYmFzZSwgY29tcGFydG1lbnRzLCBuZXdDb21wYXJ0bWVudHMpKSB7XG4gICAgICAgICAgICBpZiAoZXh0IGluc3RhbmNlb2YgU3RhdGVGaWVsZClcbiAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChleHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIChmYWNldHNbZXh0LmZhY2V0LmlkXSB8fCAoZmFjZXRzW2V4dC5mYWNldC5pZF0gPSBbXSkpLnB1c2goZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWRkcmVzcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGxldCBzdGF0aWNWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IGR5bmFtaWNTbG90cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGFkZHJlc3NbZmllbGQuaWRdID0gZHluYW1pY1Nsb3RzLmxlbmd0aCA8PCAxO1xuICAgICAgICAgICAgZHluYW1pY1Nsb3RzLnB1c2goYSA9PiBmaWVsZC5zbG90KGEpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb2xkRmFjZXRzID0gb2xkU3RhdGUgPT09IG51bGwgfHwgb2xkU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9sZFN0YXRlLmNvbmZpZy5mYWNldHM7XG4gICAgICAgIGZvciAobGV0IGlkIGluIGZhY2V0cykge1xuICAgICAgICAgICAgbGV0IHByb3ZpZGVycyA9IGZhY2V0c1tpZF0sIGZhY2V0ID0gcHJvdmlkZXJzWzBdLmZhY2V0O1xuICAgICAgICAgICAgbGV0IG9sZFByb3ZpZGVycyA9IG9sZEZhY2V0cyAmJiBvbGRGYWNldHNbaWRdIHx8IFtdO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVycy5ldmVyeShwID0+IHAudHlwZSA9PSAwIC8qIFByb3ZpZGVyLlN0YXRpYyAqLykpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzW2ZhY2V0LmlkXSA9IChzdGF0aWNWYWx1ZXMubGVuZ3RoIDw8IDEpIHwgMTtcbiAgICAgICAgICAgICAgICBpZiAoc2FtZUFycmF5KG9sZFByb3ZpZGVycywgcHJvdmlkZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWNWYWx1ZXMucHVzaChvbGRTdGF0ZS5mYWNldChmYWNldCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZmFjZXQuY29tYmluZShwcm92aWRlcnMubWFwKHAgPT4gcC52YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWNWYWx1ZXMucHVzaChvbGRTdGF0ZSAmJiBmYWNldC5jb21wYXJlKHZhbHVlLCBvbGRTdGF0ZS5mYWNldChmYWNldCkpID8gb2xkU3RhdGUuZmFjZXQoZmFjZXQpIDogdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgb2YgcHJvdmlkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwLnR5cGUgPT0gMCAvKiBQcm92aWRlci5TdGF0aWMgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NbcC5pZF0gPSAoc3RhdGljVmFsdWVzLmxlbmd0aCA8PCAxKSB8IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNWYWx1ZXMucHVzaChwLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NbcC5pZF0gPSBkeW5hbWljU2xvdHMubGVuZ3RoIDw8IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljU2xvdHMucHVzaChhID0+IHAuZHluYW1pY1Nsb3QoYSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZHJlc3NbZmFjZXQuaWRdID0gZHluYW1pY1Nsb3RzLmxlbmd0aCA8PCAxO1xuICAgICAgICAgICAgICAgIGR5bmFtaWNTbG90cy5wdXNoKGEgPT4gZHluYW1pY0ZhY2V0U2xvdChhLCBmYWNldCwgcHJvdmlkZXJzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGR5bmFtaWMgPSBkeW5hbWljU2xvdHMubWFwKGYgPT4gZihhZGRyZXNzKSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmlndXJhdGlvbihiYXNlLCBuZXdDb21wYXJ0bWVudHMsIGR5bmFtaWMsIGFkZHJlc3MsIHN0YXRpY1ZhbHVlcywgZmFjZXRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBmbGF0dGVuKGV4dGVuc2lvbiwgY29tcGFydG1lbnRzLCBuZXdDb21wYXJ0bWVudHMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW1tdLCBbXSwgW10sIFtdLCBbXV07XG4gICAgbGV0IHNlZW4gPSBuZXcgTWFwKCk7XG4gICAgZnVuY3Rpb24gaW5uZXIoZXh0LCBwcmVjKSB7XG4gICAgICAgIGxldCBrbm93biA9IHNlZW4uZ2V0KGV4dCk7XG4gICAgICAgIGlmIChrbm93biAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoa25vd24gPD0gcHJlYylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgZm91bmQgPSByZXN1bHRba25vd25dLmluZGV4T2YoZXh0KTtcbiAgICAgICAgICAgIGlmIChmb3VuZCA+IC0xKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtrbm93bl0uc3BsaWNlKGZvdW5kLCAxKTtcbiAgICAgICAgICAgIGlmIChleHQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEluc3RhbmNlKVxuICAgICAgICAgICAgICAgIG5ld0NvbXBhcnRtZW50cy5kZWxldGUoZXh0LmNvbXBhcnRtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuLnNldChleHQsIHByZWMpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleHQpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBlIG9mIGV4dClcbiAgICAgICAgICAgICAgICBpbm5lcihlLCBwcmVjKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEluc3RhbmNlKSB7XG4gICAgICAgICAgICBpZiAobmV3Q29tcGFydG1lbnRzLmhhcyhleHQuY29tcGFydG1lbnQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBEdXBsaWNhdGUgdXNlIG9mIGNvbXBhcnRtZW50IGluIGV4dGVuc2lvbnNgKTtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gY29tcGFydG1lbnRzLmdldChleHQuY29tcGFydG1lbnQpIHx8IGV4dC5pbm5lcjtcbiAgICAgICAgICAgIG5ld0NvbXBhcnRtZW50cy5zZXQoZXh0LmNvbXBhcnRtZW50LCBjb250ZW50KTtcbiAgICAgICAgICAgIGlubmVyKGNvbnRlbnQsIHByZWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4dCBpbnN0YW5jZW9mIFByZWNFeHRlbnNpb24pIHtcbiAgICAgICAgICAgIGlubmVyKGV4dC5pbm5lciwgZXh0LnByZWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4dCBpbnN0YW5jZW9mIFN0YXRlRmllbGQpIHtcbiAgICAgICAgICAgIHJlc3VsdFtwcmVjXS5wdXNoKGV4dCk7XG4gICAgICAgICAgICBpZiAoZXh0LnByb3ZpZGVzKVxuICAgICAgICAgICAgICAgIGlubmVyKGV4dC5wcm92aWRlcywgcHJlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0IGluc3RhbmNlb2YgRmFjZXRQcm92aWRlcikge1xuICAgICAgICAgICAgcmVzdWx0W3ByZWNdLnB1c2goZXh0KTtcbiAgICAgICAgICAgIGlmIChleHQuZmFjZXQuZXh0ZW5zaW9ucylcbiAgICAgICAgICAgICAgICBpbm5lcihleHQuZmFjZXQuZXh0ZW5zaW9ucywgUHJlY18uZGVmYXVsdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29udGVudCA9IGV4dC5leHRlbnNpb247XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgZXh0ZW5zaW9uIHZhbHVlIGluIGV4dGVuc2lvbiBzZXQgKCR7ZXh0fSkuIFRoaXMgc29tZXRpbWVzIGhhcHBlbnMgYmVjYXVzZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgQGNvZGVtaXJyb3Ivc3RhdGUgYXJlIGxvYWRlZCwgYnJlYWtpbmcgaW5zdGFuY2VvZiBjaGVja3MuYCk7XG4gICAgICAgICAgICBpbm5lcihjb250ZW50LCBwcmVjKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbm5lcihleHRlbnNpb24sIFByZWNfLmRlZmF1bHQpO1xuICAgIHJldHVybiByZXN1bHQucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSk7XG59XG5mdW5jdGlvbiBlbnN1cmVBZGRyKHN0YXRlLCBhZGRyKSB7XG4gICAgaWYgKGFkZHIgJiAxKVxuICAgICAgICByZXR1cm4gMiAvKiBTbG90U3RhdHVzLkNvbXB1dGVkICovO1xuICAgIGxldCBpZHggPSBhZGRyID4+IDE7XG4gICAgbGV0IHN0YXR1cyA9IHN0YXRlLnN0YXR1c1tpZHhdO1xuICAgIGlmIChzdGF0dXMgPT0gNCAvKiBTbG90U3RhdHVzLkNvbXB1dGluZyAqLylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ3ljbGljIGRlcGVuZGVuY3kgYmV0d2VlbiBmaWVsZHMgYW5kL29yIGZhY2V0c1wiKTtcbiAgICBpZiAoc3RhdHVzICYgMiAvKiBTbG90U3RhdHVzLkNvbXB1dGVkICovKVxuICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgIHN0YXRlLnN0YXR1c1tpZHhdID0gNCAvKiBTbG90U3RhdHVzLkNvbXB1dGluZyAqLztcbiAgICBsZXQgY2hhbmdlZCA9IHN0YXRlLmNvbXB1dGVTbG90KHN0YXRlLCBzdGF0ZS5jb25maWcuZHluYW1pY1Nsb3RzW2lkeF0pO1xuICAgIHJldHVybiBzdGF0ZS5zdGF0dXNbaWR4XSA9IDIgLyogU2xvdFN0YXR1cy5Db21wdXRlZCAqLyB8IGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBnZXRBZGRyKHN0YXRlLCBhZGRyKSB7XG4gICAgcmV0dXJuIGFkZHIgJiAxID8gc3RhdGUuY29uZmlnLnN0YXRpY1ZhbHVlc1thZGRyID4+IDFdIDogc3RhdGUudmFsdWVzW2FkZHIgPj4gMV07XG59XG5cbmNvbnN0IGxhbmd1YWdlRGF0YSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5zb21lKHYgPT4gdiksXG4gICAgc3RhdGljOiB0cnVlXG59KTtcbmNvbnN0IGxpbmVTZXBhcmF0b3IgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IHVuZGVmaW5lZCxcbiAgICBzdGF0aWM6IHRydWVcbn0pO1xuY29uc3QgY2hhbmdlRmlsdGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgdHJhbnNhY3Rpb25GaWx0ZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCB0cmFuc2FjdGlvbkV4dGVuZGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgcmVhZE9ubHkgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IGZhbHNlXG59KTtcblxuLyoqXG5Bbm5vdGF0aW9ucyBhcmUgdGFnZ2VkIHZhbHVlcyB0aGF0IGFyZSB1c2VkIHRvIGFkZCBtZXRhZGF0YSB0b1xudHJhbnNhY3Rpb25zIGluIGFuIGV4dGVuc2libGUgd2F5LiBUaGV5IHNob3VsZCBiZSB1c2VkIHRvIG1vZGVsXG50aGluZ3MgdGhhdCBlZmZlY3QgdGhlIGVudGlyZSB0cmFuc2FjdGlvbiAoc3VjaCBhcyBpdHMgW3RpbWVcbnN0YW1wXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uXnRpbWUpIG9yIGluZm9ybWF0aW9uIGFib3V0IGl0c1xuW29yaWdpbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbl51c2VyRXZlbnQpKS4gRm9yIGVmZmVjdHMgdGhhdCBoYXBwZW5cbl9hbG9uZ3NpZGVfIHRoZSBvdGhlciBjaGFuZ2VzIG1hZGUgYnkgdGhlIHRyYW5zYWN0aW9uLCBbc3RhdGVcbmVmZmVjdHNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3QpIGFyZSBtb3JlIGFwcHJvcHJpYXRlLlxuKi9cbmNsYXNzIEFubm90YXRpb24ge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGFubm90YXRpb24gdHlwZS5cbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBvZiB0aGlzIGFubm90YXRpb24uXG4gICAgKi9cbiAgICB2YWx1ZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIG5ldyB0eXBlIG9mIGFubm90YXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKCkgeyByZXR1cm4gbmV3IEFubm90YXRpb25UeXBlKCk7IH1cbn1cbi8qKlxuTWFya2VyIHRoYXQgaWRlbnRpZmllcyBhIHR5cGUgb2YgW2Fubm90YXRpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQW5ub3RhdGlvbikuXG4qL1xuY2xhc3MgQW5ub3RhdGlvblR5cGUge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGFubm90YXRpb24uXG4gICAgKi9cbiAgICBvZih2YWx1ZSkgeyByZXR1cm4gbmV3IEFubm90YXRpb24odGhpcywgdmFsdWUpOyB9XG59XG4vKipcblJlcHJlc2VudGF0aW9uIG9mIGEgdHlwZSBvZiBzdGF0ZSBlZmZlY3QuIERlZmluZWQgd2l0aFxuW2BTdGF0ZUVmZmVjdC5kZWZpbmVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0XmRlZmluZSkuXG4qL1xuY2xhc3MgU3RhdGVFZmZlY3RUeXBlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRoZSBgYW55YCB0eXBlcyBpbiB0aGVzZSBmdW5jdGlvbiB0eXBlcyBhcmUgdGhlcmUgdG8gd29ya1xuICAgIC8vIGFyb3VuZCBUeXBlU2NyaXB0IGlzc3VlICMzNzYzMSwgd2hlcmUgdGhlIHR5cGUgZ3VhcmQgb25cbiAgICAvLyBgU3RhdGVFZmZlY3QuaXNgIG15c3RlcmlvdXNseSBzdG9wcyB3b3JraW5nIHdoZW4gdGhlc2UgcHJvcGVybHlcbiAgICAvLyBoYXZlIHR5cGUgYFZhbHVlYC5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgW3N0YXRlIGVmZmVjdF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdCkgaW5zdGFuY2Ugb2YgdGhpc1xuICAgIHR5cGUuXG4gICAgKi9cbiAgICBvZih2YWx1ZSkgeyByZXR1cm4gbmV3IFN0YXRlRWZmZWN0KHRoaXMsIHZhbHVlKTsgfVxufVxuLyoqXG5TdGF0ZSBlZmZlY3RzIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhZGRpdGlvbmFsIGVmZmVjdHNcbmFzc29jaWF0ZWQgd2l0aCBhIFt0cmFuc2FjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5lZmZlY3RzKS4gVGhleVxuYXJlIG9mdGVuIHVzZWZ1bCB0byBtb2RlbCBjaGFuZ2VzIHRvIGN1c3RvbSBbc3RhdGVcbmZpZWxkc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUZpZWxkKSwgd2hlbiB0aG9zZSBjaGFuZ2VzIGFyZW4ndCBpbXBsaWNpdCBpblxuZG9jdW1lbnQgb3Igc2VsZWN0aW9uIGNoYW5nZXMuXG4qL1xuY2xhc3MgU3RhdGVFZmZlY3Qge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBUaGUgdmFsdWUgb2YgdGhpcyBlZmZlY3QuXG4gICAgKi9cbiAgICB2YWx1ZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIGVmZmVjdCB0aHJvdWdoIGEgcG9zaXRpb24gbWFwcGluZy4gV2lsbCByZXR1cm5cbiAgICBgdW5kZWZpbmVkYCB3aGVuIHRoYXQgZW5kcyB1cCBkZWxldGluZyB0aGUgZWZmZWN0LlxuICAgICovXG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IG1hcHBlZCA9IHRoaXMudHlwZS5tYXAodGhpcy52YWx1ZSwgbWFwcGluZyk7XG4gICAgICAgIHJldHVybiBtYXBwZWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG1hcHBlZCA9PSB0aGlzLnZhbHVlID8gdGhpcyA6IG5ldyBTdGF0ZUVmZmVjdCh0aGlzLnR5cGUsIG1hcHBlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlbGxzIHlvdSB3aGV0aGVyIHRoaXMgZWZmZWN0IG9iamVjdCBpcyBvZiBhIGdpdmVuXG4gICAgW3R5cGVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3RUeXBlKS5cbiAgICAqL1xuICAgIGlzKHR5cGUpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSB0eXBlOyB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbmV3IGVmZmVjdCB0eXBlLiBUaGUgdHlwZSBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSB0eXBlXG4gICAgb2YgdmFsdWVzIHRoYXQgaGlzIGVmZmVjdCBob2xkcy4gSXQgc2hvdWxkIGJlIGEgdHlwZSB0aGF0XG4gICAgZG9lc24ndCBpbmNsdWRlIGB1bmRlZmluZWRgLCBzaW5jZSB0aGF0IGlzIHVzZWQgaW5cbiAgICBbbWFwcGluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdC5tYXApIHRvIGluZGljYXRlIHRoYXQgYW4gZWZmZWN0IGlzXG4gICAgcmVtb3ZlZC5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlYyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RhdGVFZmZlY3RUeXBlKHNwZWMubWFwIHx8ICh2ID0+IHYpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIGFuIGFycmF5IG9mIGVmZmVjdHMgdGhyb3VnaCBhIGNoYW5nZSBzZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgbWFwRWZmZWN0cyhlZmZlY3RzLCBtYXBwaW5nKSB7XG4gICAgICAgIGlmICghZWZmZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZWZmZWN0cztcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgZWZmZWN0cykge1xuICAgICAgICAgICAgbGV0IG1hcHBlZCA9IGVmZmVjdC5tYXAobWFwcGluZyk7XG4gICAgICAgICAgICBpZiAobWFwcGVkKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG1hcHBlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcblRoaXMgZWZmZWN0IGNhbiBiZSB1c2VkIHRvIHJlY29uZmlndXJlIHRoZSByb290IGV4dGVuc2lvbnMgb2ZcbnRoZSBlZGl0b3IuIERvaW5nIHRoaXMgd2lsbCBkaXNjYXJkIGFueSBleHRlbnNpb25zXG5bYXBwZW5kZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3ReYXBwZW5kQ29uZmlnKSwgYnV0IGRvZXMgbm90IHJlc2V0XG50aGUgY29udGVudCBvZiBbcmVjb25maWd1cmVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNvbXBhcnRtZW50LnJlY29uZmlndXJlKVxuY29tcGFydG1lbnRzLlxuKi9cblN0YXRlRWZmZWN0LnJlY29uZmlndXJlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLyoqXG5BcHBlbmQgZXh0ZW5zaW9ucyB0byB0aGUgdG9wLWxldmVsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGVkaXRvci5cbiovXG5TdGF0ZUVmZmVjdC5hcHBlbmRDb25maWcgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4vKipcbkNoYW5nZXMgdG8gdGhlIGVkaXRvciBzdGF0ZSBhcmUgZ3JvdXBlZCBpbnRvIHRyYW5zYWN0aW9ucy5cblR5cGljYWxseSwgYSB1c2VyIGFjdGlvbiBjcmVhdGVzIGEgc2luZ2xlIHRyYW5zYWN0aW9uLCB3aGljaCBtYXlcbmNvbnRhaW4gYW55IG51bWJlciBvZiBkb2N1bWVudCBjaGFuZ2VzLCBtYXkgY2hhbmdlIHRoZSBzZWxlY3Rpb24sXG5vciBoYXZlIG90aGVyIGVmZmVjdHMuIENyZWF0ZSBhIHRyYW5zYWN0aW9uIGJ5IGNhbGxpbmdcbltgRWRpdG9yU3RhdGUudXBkYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpLCBvciBpbW1lZGlhdGVseVxuZGlzcGF0Y2ggb25lIGJ5IGNhbGxpbmdcbltgRWRpdG9yVmlldy5kaXNwYXRjaGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRpc3BhdGNoKS5cbiovXG5jbGFzcyBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXRlIGZyb20gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIHN0YXJ0cy5cbiAgICAqL1xuICAgIHN0YXJ0U3RhdGUsIFxuICAgIC8qKlxuICAgIFRoZSBkb2N1bWVudCBjaGFuZ2VzIG1hZGUgYnkgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIGNoYW5nZXMsIFxuICAgIC8qKlxuICAgIFRoZSBzZWxlY3Rpb24gc2V0IGJ5IHRoaXMgdHJhbnNhY3Rpb24sIG9yIHVuZGVmaW5lZCBpZiBpdFxuICAgIGRvZXNuJ3QgZXhwbGljaXRseSBzZXQgYSBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBzZWxlY3Rpb24sIFxuICAgIC8qKlxuICAgIFRoZSBlZmZlY3RzIGFkZGVkIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIGVmZmVjdHMsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYW5ub3RhdGlvbnMsIFxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3IGFmdGVyIHRoaXNcbiAgICB0cmFuc2FjdGlvbiBpcyBkaXNwYXRjaGVkLlxuICAgICovXG4gICAgc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgdGhpcy5zdGFydFN0YXRlID0gc3RhcnRTdGF0ZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gY2hhbmdlcztcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMuZWZmZWN0cyA9IGVmZmVjdHM7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5zY3JvbGxJbnRvVmlldyA9IHNjcm9sbEludG9WaWV3O1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuX2RvYyA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fc3RhdGUgPSBudWxsO1xuICAgICAgICBpZiAoc2VsZWN0aW9uKVxuICAgICAgICAgICAgY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uLCBjaGFuZ2VzLm5ld0xlbmd0aCk7XG4gICAgICAgIGlmICghYW5ub3RhdGlvbnMuc29tZSgoYSkgPT4gYS50eXBlID09IFRyYW5zYWN0aW9uLnRpbWUpKVxuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zLmNvbmNhdChUcmFuc2FjdGlvbi50aW1lLm9mKERhdGUubm93KCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHN0YXJ0U3RhdGUsIGNoYW5nZXMsIHNlbGVjdGlvbiwgZWZmZWN0cywgYW5ub3RhdGlvbnMsIHNjcm9sbEludG9WaWV3KSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oc3RhcnRTdGF0ZSwgY2hhbmdlcywgc2VsZWN0aW9uLCBlZmZlY3RzLCBhbm5vdGF0aW9ucywgc2Nyb2xsSW50b1ZpZXcpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbmV3IGRvY3VtZW50IHByb2R1Y2VkIGJ5IHRoZSB0cmFuc2FjdGlvbi4gQ29udHJhcnkgdG9cbiAgICBbYC5zdGF0ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uc3RhdGUpYC5kb2NgLCBhY2Nlc3NpbmcgdGhpcyB3b24ndFxuICAgIGZvcmNlIHRoZSBlbnRpcmUgbmV3IHN0YXRlIHRvIGJlIGNvbXB1dGVkIHJpZ2h0IGF3YXksIHNvIGl0IGlzXG4gICAgcmVjb21tZW5kZWQgdGhhdCBbdHJhbnNhY3Rpb25cbiAgICBmaWx0ZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRyYW5zYWN0aW9uRmlsdGVyKSB1c2UgdGhpcyBnZXR0ZXJcbiAgICB3aGVuIHRoZXkgbmVlZCB0byBsb29rIGF0IHRoZSBuZXcgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXQgbmV3RG9jKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jIHx8ICh0aGlzLl9kb2MgPSB0aGlzLmNoYW5nZXMuYXBwbHkodGhpcy5zdGFydFN0YXRlLmRvYykpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbmV3IHNlbGVjdGlvbiBwcm9kdWNlZCBieSB0aGUgdHJhbnNhY3Rpb24uIElmXG4gICAgW2B0aGlzLnNlbGVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uc2VsZWN0aW9uKSBpcyB1bmRlZmluZWQsXG4gICAgdGhpcyB3aWxsIFttYXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU2VsZWN0aW9uLm1hcCkgdGhlIHN0YXJ0IHN0YXRlJ3NcbiAgICBjdXJyZW50IHNlbGVjdGlvbiB0aHJvdWdoIHRoZSBjaGFuZ2VzIG1hZGUgYnkgdGhlIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZ2V0IG5ld1NlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uIHx8IHRoaXMuc3RhcnRTdGF0ZS5zZWxlY3Rpb24ubWFwKHRoaXMuY2hhbmdlcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBuZXcgc3RhdGUgY3JlYXRlZCBieSB0aGUgdHJhbnNhY3Rpb24uIENvbXB1dGVkIG9uIGRlbWFuZFxuICAgIChidXQgcmV0YWluZWQgZm9yIHN1YnNlcXVlbnQgYWNjZXNzKSwgc28gaXQgaXMgcmVjb21tZW5kZWQgbm90IHRvXG4gICAgYWNjZXNzIGl0IGluIFt0cmFuc2FjdGlvblxuICAgIGZpbHRlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedHJhbnNhY3Rpb25GaWx0ZXIpIHdoZW4gcG9zc2libGUuXG4gICAgKi9cbiAgICBnZXQgc3RhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3RhdGUpXG4gICAgICAgICAgICB0aGlzLnN0YXJ0U3RhdGUuYXBwbHlUcmFuc2FjdGlvbih0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBhbm5vdGF0aW9uIHR5cGUsIGlmIGFueS5cbiAgICAqL1xuICAgIGFubm90YXRpb24odHlwZSkge1xuICAgICAgICBmb3IgKGxldCBhbm4gb2YgdGhpcy5hbm5vdGF0aW9ucylcbiAgICAgICAgICAgIGlmIChhbm4udHlwZSA9PSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBhbm4udmFsdWU7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiBjaGFuZ2VkIHRoZSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBkb2NDaGFuZ2VkKCkgeyByZXR1cm4gIXRoaXMuY2hhbmdlcy5lbXB0eTsgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJhbnNhY3Rpb24gcmVjb25maWd1cmVzIHRoZSBzdGF0ZVxuICAgICh0aHJvdWdoIGEgW2NvbmZpZ3VyYXRpb24gY29tcGFydG1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ29tcGFydG1lbnQpIG9yXG4gICAgd2l0aCBhIHRvcC1sZXZlbCBjb25maWd1cmF0aW9uXG4gICAgW2VmZmVjdF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdF5yZWNvbmZpZ3VyZSkuXG4gICAgKi9cbiAgICBnZXQgcmVjb25maWd1cmVkKCkgeyByZXR1cm4gdGhpcy5zdGFydFN0YXRlLmNvbmZpZyAhPSB0aGlzLnN0YXRlLmNvbmZpZzsgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNhY3Rpb24gaGFzIGEgW3VzZXJcbiAgICBldmVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbl51c2VyRXZlbnQpIGFubm90YXRpb24gdGhhdCBpcyBlcXVhbCB0b1xuICAgIG9yIG1vcmUgc3BlY2lmaWMgdGhhbiBgZXZlbnRgLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHRyYW5zYWN0aW9uXG4gICAgaGFzIGBcInNlbGVjdC5wb2ludGVyXCJgIGFzIHVzZXIgZXZlbnQsIGBcInNlbGVjdFwiYCBhbmRcbiAgICBgXCJzZWxlY3QucG9pbnRlclwiYCB3aWxsIG1hdGNoIGl0LlxuICAgICovXG4gICAgaXNVc2VyRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLmFubm90YXRpb24oVHJhbnNhY3Rpb24udXNlckV2ZW50KTtcbiAgICAgICAgcmV0dXJuICEhKGUgJiYgKGUgPT0gZXZlbnQgfHwgZS5sZW5ndGggPiBldmVudC5sZW5ndGggJiYgZS5zbGljZSgwLCBldmVudC5sZW5ndGgpID09IGV2ZW50ICYmIGVbZXZlbnQubGVuZ3RoXSA9PSBcIi5cIikpO1xuICAgIH1cbn1cbi8qKlxuQW5ub3RhdGlvbiB1c2VkIHRvIHN0b3JlIHRyYW5zYWN0aW9uIHRpbWVzdGFtcHMuIEF1dG9tYXRpY2FsbHlcbmFkZGVkIHRvIGV2ZXJ5IHRyYW5zYWN0aW9uLCBob2xkaW5nIGBEYXRlLm5vdygpYC5cbiovXG5UcmFuc2FjdGlvbi50aW1lID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG4vKipcbkFubm90YXRpb24gdXNlZCB0byBhc3NvY2lhdGUgYSB0cmFuc2FjdGlvbiB3aXRoIGEgdXNlciBpbnRlcmZhY2VcbmV2ZW50LiBIb2xkcyBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgZXZlbnQsIHVzaW5nIGFcbmRvdC1zZXBhcmF0ZWQgZm9ybWF0IHRvIHN1cHBvcnQgYXR0YWNoaW5nIG1vcmUgc3BlY2lmaWNcbmluZm9ybWF0aW9uLiBUaGUgZXZlbnRzIHVzZWQgYnkgdGhlIGNvcmUgbGlicmFyaWVzIGFyZTpcblxuIC0gYFwiaW5wdXRcImAgd2hlbiBjb250ZW50IGlzIGVudGVyZWRcbiAgIC0gYFwiaW5wdXQudHlwZVwiYCBmb3IgdHlwZWQgaW5wdXRcbiAgICAgLSBgXCJpbnB1dC50eXBlLmNvbXBvc2VcImAgZm9yIGNvbXBvc2l0aW9uXG4gICAtIGBcImlucHV0LnBhc3RlXCJgIGZvciBwYXN0ZWQgaW5wdXRcbiAgIC0gYFwiaW5wdXQuZHJvcFwiYCB3aGVuIGFkZGluZyBjb250ZW50IHdpdGggZHJhZy1hbmQtZHJvcFxuICAgLSBgXCJpbnB1dC5jb21wbGV0ZVwiYCB3aGVuIGF1dG9jb21wbGV0aW5nXG4gLSBgXCJkZWxldGVcImAgd2hlbiB0aGUgdXNlciBkZWxldGVzIGNvbnRlbnRcbiAgIC0gYFwiZGVsZXRlLnNlbGVjdGlvblwiYCB3aGVuIGRlbGV0aW5nIHRoZSBzZWxlY3Rpb25cbiAgIC0gYFwiZGVsZXRlLmZvcndhcmRcImAgd2hlbiBkZWxldGluZyBmb3J3YXJkIGZyb20gdGhlIHNlbGVjdGlvblxuICAgLSBgXCJkZWxldGUuYmFja3dhcmRcImAgd2hlbiBkZWxldGluZyBiYWNrd2FyZCBmcm9tIHRoZSBzZWxlY3Rpb25cbiAgIC0gYFwiZGVsZXRlLmN1dFwiYCB3aGVuIGN1dHRpbmcgdG8gdGhlIGNsaXBib2FyZFxuIC0gYFwibW92ZVwiYCB3aGVuIGNvbnRlbnQgaXMgbW92ZWRcbiAgIC0gYFwibW92ZS5kcm9wXCJgIHdoZW4gY29udGVudCBpcyBtb3ZlZCB3aXRoaW4gdGhlIGVkaXRvciB0aHJvdWdoIGRyYWctYW5kLWRyb3BcbiAtIGBcInNlbGVjdFwiYCB3aGVuIGV4cGxpY2l0bHkgY2hhbmdpbmcgdGhlIHNlbGVjdGlvblxuICAgLSBgXCJzZWxlY3QucG9pbnRlclwiYCB3aGVuIHNlbGVjdGluZyB3aXRoIGEgbW91c2Ugb3Igb3RoZXIgcG9pbnRpbmcgZGV2aWNlXG4gLSBgXCJ1bmRvXCJgIGFuZCBgXCJyZWRvXCJgIGZvciBoaXN0b3J5IGFjdGlvbnNcblxuVXNlIFtgaXNVc2VyRXZlbnRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLmlzVXNlckV2ZW50KSB0byBjaGVja1xud2hldGhlciB0aGUgYW5ub3RhdGlvbiBtYXRjaGVzIGEgZ2l2ZW4gZXZlbnQuXG4qL1xuVHJhbnNhY3Rpb24udXNlckV2ZW50ID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG4vKipcbkFubm90YXRpb24gaW5kaWNhdGluZyB3aGV0aGVyIGEgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFkZGVkIHRvXG50aGUgdW5kbyBoaXN0b3J5IG9yIG5vdC5cbiovXG5UcmFuc2FjdGlvbi5hZGRUb0hpc3RvcnkgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbi8qKlxuQW5ub3RhdGlvbiBpbmRpY2F0aW5nICh3aGVuIHByZXNlbnQgYW5kIHRydWUpIHRoYXQgYSB0cmFuc2FjdGlvblxucmVwcmVzZW50cyBhIGNoYW5nZSBtYWRlIGJ5IHNvbWUgb3RoZXIgYWN0b3IsIG5vdCB0aGUgdXNlci4gVGhpc1xuaXMgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHRhZyBvdGhlciBwZW9wbGUncyBjaGFuZ2VzIGluXG5jb2xsYWJvcmF0aXZlIGVkaXRpbmcuXG4qL1xuVHJhbnNhY3Rpb24ucmVtb3RlID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG5mdW5jdGlvbiBqb2luUmFuZ2VzKGEsIGIpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaUEgPSAwLCBpQiA9IDA7Oykge1xuICAgICAgICBsZXQgZnJvbSwgdG87XG4gICAgICAgIGlmIChpQSA8IGEubGVuZ3RoICYmIChpQiA9PSBiLmxlbmd0aCB8fCBiW2lCXSA+PSBhW2lBXSkpIHtcbiAgICAgICAgICAgIGZyb20gPSBhW2lBKytdO1xuICAgICAgICAgICAgdG8gPSBhW2lBKytdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlCIDwgYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZyb20gPSBiW2lCKytdO1xuICAgICAgICAgICAgdG8gPSBiW2lCKytdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCB8fCByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdIDwgZnJvbSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyb20sIHRvKTtcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA8IHRvKVxuICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IHRvO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1lcmdlVHJhbnNhY3Rpb24oYSwgYiwgc2VxdWVudGlhbCkge1xuICAgIHZhciBfYTtcbiAgICBsZXQgbWFwRm9yQSwgbWFwRm9yQiwgY2hhbmdlcztcbiAgICBpZiAoc2VxdWVudGlhbCkge1xuICAgICAgICBtYXBGb3JBID0gYi5jaGFuZ2VzO1xuICAgICAgICBtYXBGb3JCID0gQ2hhbmdlU2V0LmVtcHR5KGIuY2hhbmdlcy5sZW5ndGgpO1xuICAgICAgICBjaGFuZ2VzID0gYS5jaGFuZ2VzLmNvbXBvc2UoYi5jaGFuZ2VzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG1hcEZvckEgPSBiLmNoYW5nZXMubWFwKGEuY2hhbmdlcyk7XG4gICAgICAgIG1hcEZvckIgPSBhLmNoYW5nZXMubWFwRGVzYyhiLmNoYW5nZXMsIHRydWUpO1xuICAgICAgICBjaGFuZ2VzID0gYS5jaGFuZ2VzLmNvbXBvc2UobWFwRm9yQSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZXMsXG4gICAgICAgIHNlbGVjdGlvbjogYi5zZWxlY3Rpb24gPyBiLnNlbGVjdGlvbi5tYXAobWFwRm9yQikgOiAoX2EgPSBhLnNlbGVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcChtYXBGb3JBKSxcbiAgICAgICAgZWZmZWN0czogU3RhdGVFZmZlY3QubWFwRWZmZWN0cyhhLmVmZmVjdHMsIG1hcEZvckEpLmNvbmNhdChTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGIuZWZmZWN0cywgbWFwRm9yQikpLFxuICAgICAgICBhbm5vdGF0aW9uczogYS5hbm5vdGF0aW9ucy5sZW5ndGggPyBhLmFubm90YXRpb25zLmNvbmNhdChiLmFubm90YXRpb25zKSA6IGIuYW5ub3RhdGlvbnMsXG4gICAgICAgIHNjcm9sbEludG9WaWV3OiBhLnNjcm9sbEludG9WaWV3IHx8IGIuc2Nyb2xsSW50b1ZpZXdcbiAgICB9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zYWN0aW9uSW5uZXIoc3RhdGUsIHNwZWMsIGRvY1NpemUpIHtcbiAgICBsZXQgc2VsID0gc3BlYy5zZWxlY3Rpb24sIGFubm90YXRpb25zID0gYXNBcnJheShzcGVjLmFubm90YXRpb25zKTtcbiAgICBpZiAoc3BlYy51c2VyRXZlbnQpXG4gICAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuY29uY2F0KFRyYW5zYWN0aW9uLnVzZXJFdmVudC5vZihzcGVjLnVzZXJFdmVudCkpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZXM6IHNwZWMuY2hhbmdlcyBpbnN0YW5jZW9mIENoYW5nZVNldCA/IHNwZWMuY2hhbmdlc1xuICAgICAgICAgICAgOiBDaGFuZ2VTZXQub2Yoc3BlYy5jaGFuZ2VzIHx8IFtdLCBkb2NTaXplLCBzdGF0ZS5mYWNldChsaW5lU2VwYXJhdG9yKSksXG4gICAgICAgIHNlbGVjdGlvbjogc2VsICYmIChzZWwgaW5zdGFuY2VvZiBFZGl0b3JTZWxlY3Rpb24gPyBzZWwgOiBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKHNlbC5hbmNob3IsIHNlbC5oZWFkKSksXG4gICAgICAgIGVmZmVjdHM6IGFzQXJyYXkoc3BlYy5lZmZlY3RzKSxcbiAgICAgICAgYW5ub3RhdGlvbnMsXG4gICAgICAgIHNjcm9sbEludG9WaWV3OiAhIXNwZWMuc2Nyb2xsSW50b1ZpZXdcbiAgICB9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zYWN0aW9uKHN0YXRlLCBzcGVjcywgZmlsdGVyKSB7XG4gICAgbGV0IHMgPSByZXNvbHZlVHJhbnNhY3Rpb25Jbm5lcihzdGF0ZSwgc3BlY3MubGVuZ3RoID8gc3BlY3NbMF0gOiB7fSwgc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgaWYgKHNwZWNzLmxlbmd0aCAmJiBzcGVjc1swXS5maWx0ZXIgPT09IGZhbHNlKVxuICAgICAgICBmaWx0ZXIgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNwZWNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzcGVjc1tpXS5maWx0ZXIgPT09IGZhbHNlKVxuICAgICAgICAgICAgZmlsdGVyID0gZmFsc2U7XG4gICAgICAgIGxldCBzZXEgPSAhIXNwZWNzW2ldLnNlcXVlbnRpYWw7XG4gICAgICAgIHMgPSBtZXJnZVRyYW5zYWN0aW9uKHMsIHJlc29sdmVUcmFuc2FjdGlvbklubmVyKHN0YXRlLCBzcGVjc1tpXSwgc2VxID8gcy5jaGFuZ2VzLm5ld0xlbmd0aCA6IHN0YXRlLmRvYy5sZW5ndGgpLCBzZXEpO1xuICAgIH1cbiAgICBsZXQgdHIgPSBUcmFuc2FjdGlvbi5jcmVhdGUoc3RhdGUsIHMuY2hhbmdlcywgcy5zZWxlY3Rpb24sIHMuZWZmZWN0cywgcy5hbm5vdGF0aW9ucywgcy5zY3JvbGxJbnRvVmlldyk7XG4gICAgcmV0dXJuIGV4dGVuZFRyYW5zYWN0aW9uKGZpbHRlciA/IGZpbHRlclRyYW5zYWN0aW9uKHRyKSA6IHRyKTtcbn1cbi8vIEZpbmlzaCBhIHRyYW5zYWN0aW9uIGJ5IGFwcGx5aW5nIGZpbHRlcnMgaWYgbmVjZXNzYXJ5LlxuZnVuY3Rpb24gZmlsdGVyVHJhbnNhY3Rpb24odHIpIHtcbiAgICBsZXQgc3RhdGUgPSB0ci5zdGFydFN0YXRlO1xuICAgIC8vIENoYW5nZSBmaWx0ZXJzXG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZm9yIChsZXQgZmlsdGVyIG9mIHN0YXRlLmZhY2V0KGNoYW5nZUZpbHRlcikpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZmlsdGVyKHRyKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgPT09IHRydWUgPyB2YWx1ZSA6IGpvaW5SYW5nZXMocmVzdWx0LCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgbGV0IGNoYW5nZXMsIGJhY2s7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBiYWNrID0gdHIuY2hhbmdlcy5pbnZlcnRlZERlc2M7XG4gICAgICAgICAgICBjaGFuZ2VzID0gQ2hhbmdlU2V0LmVtcHR5KHN0YXRlLmRvYy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZpbHRlcmVkID0gdHIuY2hhbmdlcy5maWx0ZXIocmVzdWx0KTtcbiAgICAgICAgICAgIGNoYW5nZXMgPSBmaWx0ZXJlZC5jaGFuZ2VzO1xuICAgICAgICAgICAgYmFjayA9IGZpbHRlcmVkLmZpbHRlcmVkLm1hcERlc2MoZmlsdGVyZWQuY2hhbmdlcykuaW52ZXJ0ZWREZXNjO1xuICAgICAgICB9XG4gICAgICAgIHRyID0gVHJhbnNhY3Rpb24uY3JlYXRlKHN0YXRlLCBjaGFuZ2VzLCB0ci5zZWxlY3Rpb24gJiYgdHIuc2VsZWN0aW9uLm1hcChiYWNrKSwgU3RhdGVFZmZlY3QubWFwRWZmZWN0cyh0ci5lZmZlY3RzLCBiYWNrKSwgdHIuYW5ub3RhdGlvbnMsIHRyLnNjcm9sbEludG9WaWV3KTtcbiAgICB9XG4gICAgLy8gVHJhbnNhY3Rpb24gZmlsdGVyc1xuICAgIGxldCBmaWx0ZXJzID0gc3RhdGUuZmFjZXQodHJhbnNhY3Rpb25GaWx0ZXIpO1xuICAgIGZvciAobGV0IGkgPSBmaWx0ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGxldCBmaWx0ZXJlZCA9IGZpbHRlcnNbaV0odHIpO1xuICAgICAgICBpZiAoZmlsdGVyZWQgaW5zdGFuY2VvZiBUcmFuc2FjdGlvbilcbiAgICAgICAgICAgIHRyID0gZmlsdGVyZWQ7XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyZWQpICYmIGZpbHRlcmVkLmxlbmd0aCA9PSAxICYmIGZpbHRlcmVkWzBdIGluc3RhbmNlb2YgVHJhbnNhY3Rpb24pXG4gICAgICAgICAgICB0ciA9IGZpbHRlcmVkWzBdO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ciA9IHJlc29sdmVUcmFuc2FjdGlvbihzdGF0ZSwgYXNBcnJheShmaWx0ZXJlZCksIGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyO1xufVxuZnVuY3Rpb24gZXh0ZW5kVHJhbnNhY3Rpb24odHIpIHtcbiAgICBsZXQgc3RhdGUgPSB0ci5zdGFydFN0YXRlLCBleHRlbmRlcnMgPSBzdGF0ZS5mYWNldCh0cmFuc2FjdGlvbkV4dGVuZGVyKSwgc3BlYyA9IHRyO1xuICAgIGZvciAobGV0IGkgPSBleHRlbmRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IGV4dGVuc2lvbiA9IGV4dGVuZGVyc1tpXSh0cik7XG4gICAgICAgIGlmIChleHRlbnNpb24gJiYgT2JqZWN0LmtleXMoZXh0ZW5zaW9uKS5sZW5ndGgpXG4gICAgICAgICAgICBzcGVjID0gbWVyZ2VUcmFuc2FjdGlvbihzcGVjLCByZXNvbHZlVHJhbnNhY3Rpb25Jbm5lcihzdGF0ZSwgZXh0ZW5zaW9uLCB0ci5jaGFuZ2VzLm5ld0xlbmd0aCksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gc3BlYyA9PSB0ciA/IHRyIDogVHJhbnNhY3Rpb24uY3JlYXRlKHN0YXRlLCB0ci5jaGFuZ2VzLCB0ci5zZWxlY3Rpb24sIHNwZWMuZWZmZWN0cywgc3BlYy5hbm5vdGF0aW9ucywgc3BlYy5zY3JvbGxJbnRvVmlldyk7XG59XG5jb25zdCBub25lID0gW107XG5mdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBub25lIDogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbi8qKlxuVGhlIGNhdGVnb3JpZXMgcHJvZHVjZWQgYnkgYSBbY2hhcmFjdGVyXG5jYXRlZ29yaXplcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIpLiBUaGVzZSBhcmUgdXNlZFxuZG8gdGhpbmdzIGxpa2Ugc2VsZWN0aW5nIGJ5IHdvcmQuXG4qL1xudmFyIENoYXJDYXRlZ29yeSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKENoYXJDYXRlZ29yeSkge1xuICAgIC8qKlxuICAgIFdvcmQgY2hhcmFjdGVycy5cbiAgICAqL1xuICAgIENoYXJDYXRlZ29yeVtDaGFyQ2F0ZWdvcnlbXCJXb3JkXCJdID0gMF0gPSBcIldvcmRcIjtcbiAgICAvKipcbiAgICBXaGl0ZXNwYWNlLlxuICAgICovXG4gICAgQ2hhckNhdGVnb3J5W0NoYXJDYXRlZ29yeVtcIlNwYWNlXCJdID0gMV0gPSBcIlNwYWNlXCI7XG4gICAgLyoqXG4gICAgQW55dGhpbmcgZWxzZS5cbiAgICAqL1xuICAgIENoYXJDYXRlZ29yeVtDaGFyQ2F0ZWdvcnlbXCJPdGhlclwiXSA9IDJdID0gXCJPdGhlclwiO1xucmV0dXJuIENoYXJDYXRlZ29yeX0pKENoYXJDYXRlZ29yeSB8fCAoQ2hhckNhdGVnb3J5ID0ge30pKTtcbmNvbnN0IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyID0gL1tcXHUwMGRmXFx1MDU4N1xcdTA1OTAtXFx1MDVmNFxcdTA2MDAtXFx1MDZmZlxcdTMwNDAtXFx1MzA5ZlxcdTMwYTAtXFx1MzBmZlxcdTM0MDAtXFx1NGRiNVxcdTRlMDAtXFx1OWZjY1xcdWFjMDAtXFx1ZDdhZl0vO1xubGV0IHdvcmRDaGFyO1xudHJ5IHtcbiAgICB3b3JkQ2hhciA9IC8qQF9fUFVSRV9fKi9uZXcgUmVnRXhwKFwiW1xcXFxwe0FscGhhYmV0aWN9XFxcXHB7TnVtYmVyfV9dXCIsIFwidVwiKTtcbn1cbmNhdGNoIChfKSB7IH1cbmZ1bmN0aW9uIGhhc1dvcmRDaGFyKHN0cikge1xuICAgIGlmICh3b3JkQ2hhcilcbiAgICAgICAgcmV0dXJuIHdvcmRDaGFyLnRlc3Qoc3RyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2ggPSBzdHJbaV07XG4gICAgICAgIGlmICgvXFx3Ly50ZXN0KGNoKSB8fCBjaCA+IFwiXFx4ODBcIiAmJiAoY2gudG9VcHBlckNhc2UoKSAhPSBjaC50b0xvd2VyQ2FzZSgpIHx8IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyLnRlc3QoY2gpKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBtYWtlQ2F0ZWdvcml6ZXIod29yZENoYXJzKSB7XG4gICAgcmV0dXJuIChjaGFyKSA9PiB7XG4gICAgICAgIGlmICghL1xcUy8udGVzdChjaGFyKSlcbiAgICAgICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuU3BhY2U7XG4gICAgICAgIGlmIChoYXNXb3JkQ2hhcihjaGFyKSlcbiAgICAgICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuV29yZDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3JkQ2hhcnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoY2hhci5pbmRleE9mKHdvcmRDaGFyc1tpXSkgPiAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2hhckNhdGVnb3J5LldvcmQ7XG4gICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuT3RoZXI7XG4gICAgfTtcbn1cblxuLyoqXG5UaGUgZWRpdG9yIHN0YXRlIGNsYXNzIGlzIGEgcGVyc2lzdGVudCAoaW1tdXRhYmxlKSBkYXRhIHN0cnVjdHVyZS5cblRvIHVwZGF0ZSBhIHN0YXRlLCB5b3UgW2NyZWF0ZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpIGFcblt0cmFuc2FjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbiksIHdoaWNoIHByb2R1Y2VzIGEgX25ld18gc3RhdGVcbmluc3RhbmNlLCB3aXRob3V0IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuXG5BcyBzdWNoLCBfbmV2ZXJfIG11dGF0ZSBwcm9wZXJ0aWVzIG9mIGEgc3RhdGUgZGlyZWN0bHkuIFRoYXQnbGxcbmp1c3QgYnJlYWsgdGhpbmdzLlxuKi9cbmNsYXNzIEVkaXRvclN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbmZpZywgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBkb2MsIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIHNlbGVjdGlvbiwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB2YWx1ZXMsIGNvbXB1dGVTbG90LCB0cikge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBjb25maWcuc3RhdHVzVGVtcGxhdGUuc2xpY2UoKTtcbiAgICAgICAgdGhpcy5jb21wdXRlU2xvdCA9IGNvbXB1dGVTbG90O1xuICAgICAgICAvLyBGaWxsIGluIHRoZSBjb21wdXRlZCBzdGF0ZSBpbW1lZGlhdGVseSwgc28gdGhhdCBmdXJ0aGVyIHF1ZXJpZXNcbiAgICAgICAgLy8gZm9yIGl0IG1hZGUgZHVyaW5nIHRoZSB1cGRhdGUgcmV0dXJuIHRoaXMgc3RhdGVcbiAgICAgICAgaWYgKHRyKVxuICAgICAgICAgICAgdHIuX3N0YXRlID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmZpZy5keW5hbWljU2xvdHMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBlbnN1cmVBZGRyKHRoaXMsIGkgPDwgMSk7XG4gICAgICAgIHRoaXMuY29tcHV0ZVNsb3QgPSBudWxsO1xuICAgIH1cbiAgICBmaWVsZChmaWVsZCwgcmVxdWlyZSA9IHRydWUpIHtcbiAgICAgICAgbGV0IGFkZHIgPSB0aGlzLmNvbmZpZy5hZGRyZXNzW2ZpZWxkLmlkXTtcbiAgICAgICAgaWYgKGFkZHIgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJGaWVsZCBpcyBub3QgcHJlc2VudCBpbiB0aGlzIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbnN1cmVBZGRyKHRoaXMsIGFkZHIpO1xuICAgICAgICByZXR1cm4gZ2V0QWRkcih0aGlzLCBhZGRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgW3RyYW5zYWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uKSB0aGF0IHVwZGF0ZXMgdGhpc1xuICAgIHN0YXRlLiBBbnkgbnVtYmVyIG9mIFt0cmFuc2FjdGlvbiBzcGVjc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMpXG4gICAgY2FuIGJlIHBhc3NlZC4gVW5sZXNzXG4gICAgW2BzZXF1ZW50aWFsYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuc2VxdWVudGlhbCkgaXMgc2V0LCB0aGVcbiAgICBbY2hhbmdlc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuY2hhbmdlcykgKGlmIGFueSkgb2YgZWFjaCBzcGVjXG4gICAgYXJlIGFzc3VtZWQgdG8gc3RhcnQgaW4gdGhlIF9jdXJyZW50XyBkb2N1bWVudCAobm90IHRoZSBkb2N1bWVudFxuICAgIHByb2R1Y2VkIGJ5IHByZXZpb3VzIHNwZWNzKSwgYW5kIGl0c1xuICAgIFtzZWxlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLnNlbGVjdGlvbikgYW5kXG4gICAgW2VmZmVjdHNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpIGFyZSBhc3N1bWVkIHRvIHJlZmVyXG4gICAgdG8gdGhlIGRvY3VtZW50IGNyZWF0ZWQgYnkgaXRzIF9vd25fIGNoYW5nZXMuIFRoZSByZXN1bHRpbmdcbiAgICB0cmFuc2FjdGlvbiBjb250YWlucyB0aGUgY29tYmluZWQgZWZmZWN0IG9mIGFsbCB0aGUgZGlmZmVyZW50XG4gICAgc3BlY3MuIEZvciBbc2VsZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5zZWxlY3Rpb24pLCBsYXRlclxuICAgIHNwZWNzIHRha2UgcHJlY2VkZW5jZSBvdmVyIGVhcmxpZXIgb25lcy5cbiAgICAqL1xuICAgIHVwZGF0ZSguLi5zcGVjcykge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZVRyYW5zYWN0aW9uKHRoaXMsIHNwZWNzLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhcHBseVRyYW5zYWN0aW9uKHRyKSB7XG4gICAgICAgIGxldCBjb25mID0gdGhpcy5jb25maWcsIHsgYmFzZSwgY29tcGFydG1lbnRzIH0gPSBjb25mO1xuICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgdHIuZWZmZWN0cykge1xuICAgICAgICAgICAgaWYgKGVmZmVjdC5pcyhDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZikge1xuICAgICAgICAgICAgICAgICAgICBjb21wYXJ0bWVudHMgPSBuZXcgTWFwO1xuICAgICAgICAgICAgICAgICAgICBjb25mLmNvbXBhcnRtZW50cy5mb3JFYWNoKCh2YWwsIGtleSkgPT4gY29tcGFydG1lbnRzLnNldChrZXksIHZhbCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25mID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcGFydG1lbnRzLnNldChlZmZlY3QudmFsdWUuY29tcGFydG1lbnQsIGVmZmVjdC52YWx1ZS5leHRlbnNpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZWZmZWN0LmlzKFN0YXRlRWZmZWN0LnJlY29uZmlndXJlKSkge1xuICAgICAgICAgICAgICAgIGNvbmYgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJhc2UgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlZmZlY3QuaXMoU3RhdGVFZmZlY3QuYXBwZW5kQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbmYgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJhc2UgPSBhc0FycmF5KGJhc2UpLmNvbmNhdChlZmZlY3QudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydFZhbHVlcztcbiAgICAgICAgaWYgKCFjb25mKSB7XG4gICAgICAgICAgICBjb25mID0gQ29uZmlndXJhdGlvbi5yZXNvbHZlKGJhc2UsIGNvbXBhcnRtZW50cywgdGhpcyk7XG4gICAgICAgICAgICBsZXQgaW50ZXJtZWRpYXRlU3RhdGUgPSBuZXcgRWRpdG9yU3RhdGUoY29uZiwgdGhpcy5kb2MsIHRoaXMuc2VsZWN0aW9uLCBjb25mLmR5bmFtaWNTbG90cy5tYXAoKCkgPT4gbnVsbCksIChzdGF0ZSwgc2xvdCkgPT4gc2xvdC5yZWNvbmZpZ3VyZShzdGF0ZSwgdGhpcyksIG51bGwpO1xuICAgICAgICAgICAgc3RhcnRWYWx1ZXMgPSBpbnRlcm1lZGlhdGVTdGF0ZS52YWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydFZhbHVlcyA9IHRyLnN0YXJ0U3RhdGUudmFsdWVzLnNsaWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IHRyLnN0YXJ0U3RhdGUuZmFjZXQoYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMpID8gdHIubmV3U2VsZWN0aW9uIDogdHIubmV3U2VsZWN0aW9uLmFzU2luZ2xlKCk7XG4gICAgICAgIG5ldyBFZGl0b3JTdGF0ZShjb25mLCB0ci5uZXdEb2MsIHNlbGVjdGlvbiwgc3RhcnRWYWx1ZXMsIChzdGF0ZSwgc2xvdCkgPT4gc2xvdC51cGRhdGUoc3RhdGUsIHRyKSwgdHIpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbdHJhbnNhY3Rpb24gc3BlY10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMpIHRoYXRcbiAgICByZXBsYWNlcyBldmVyeSBzZWxlY3Rpb24gcmFuZ2Ugd2l0aCB0aGUgZ2l2ZW4gY29udGVudC5cbiAgICAqL1xuICAgIHJlcGxhY2VTZWxlY3Rpb24odGV4dCkge1xuICAgICAgICBpZiAodHlwZW9mIHRleHQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHRleHQgPSB0aGlzLnRvVGV4dCh0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlQnlSYW5nZShyYW5nZSA9PiAoeyBjaGFuZ2VzOiB7IGZyb206IHJhbmdlLmZyb20sIHRvOiByYW5nZS50bywgaW5zZXJ0OiB0ZXh0IH0sXG4gICAgICAgICAgICByYW5nZTogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyYW5nZS5mcm9tICsgdGV4dC5sZW5ndGgpIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IG9mIGNoYW5nZXMgYW5kIGEgbmV3IHNlbGVjdGlvbiBieSBydW5uaW5nIHRoZSBnaXZlblxuICAgIGZ1bmN0aW9uIGZvciBlYWNoIHJhbmdlIGluIHRoZSBhY3RpdmUgc2VsZWN0aW9uLiBUaGUgZnVuY3Rpb25cbiAgICBjYW4gcmV0dXJuIGFuIG9wdGlvbmFsIHNldCBvZiBjaGFuZ2VzIChpbiB0aGUgY29vcmRpbmF0ZSBzcGFjZVxuICAgIG9mIHRoZSBzdGFydCBkb2N1bWVudCksIHBsdXMgYW4gdXBkYXRlZCByYW5nZSAoaW4gdGhlIGNvb3JkaW5hdGVcbiAgICBzcGFjZSBvZiB0aGUgZG9jdW1lbnQgcHJvZHVjZWQgYnkgdGhlIGNhbGwncyBvd24gY2hhbmdlcykuIFRoaXNcbiAgICBtZXRob2Qgd2lsbCBtZXJnZSBhbGwgdGhlIGNoYW5nZXMgYW5kIHJhbmdlcyBpbnRvIGEgc2luZ2xlXG4gICAgY2hhbmdlc2V0IGFuZCBzZWxlY3Rpb24sIGFuZCByZXR1cm4gaXQgYXMgYSBbdHJhbnNhY3Rpb25cbiAgICBzcGVjXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYyksIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG9cbiAgICBbYHVwZGF0ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUudXBkYXRlKS5cbiAgICAqL1xuICAgIGNoYW5nZUJ5UmFuZ2UoZikge1xuICAgICAgICBsZXQgc2VsID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICAgIGxldCByZXN1bHQxID0gZihzZWwucmFuZ2VzWzBdKTtcbiAgICAgICAgbGV0IGNoYW5nZXMgPSB0aGlzLmNoYW5nZXMocmVzdWx0MS5jaGFuZ2VzKSwgcmFuZ2VzID0gW3Jlc3VsdDEucmFuZ2VdO1xuICAgICAgICBsZXQgZWZmZWN0cyA9IGFzQXJyYXkocmVzdWx0MS5lZmZlY3RzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZihzZWwucmFuZ2VzW2ldKTtcbiAgICAgICAgICAgIGxldCBuZXdDaGFuZ2VzID0gdGhpcy5jaGFuZ2VzKHJlc3VsdC5jaGFuZ2VzKSwgbmV3TWFwcGVkID0gbmV3Q2hhbmdlcy5tYXAoY2hhbmdlcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGk7IGorKylcbiAgICAgICAgICAgICAgICByYW5nZXNbal0gPSByYW5nZXNbal0ubWFwKG5ld01hcHBlZCk7XG4gICAgICAgICAgICBsZXQgbWFwQnkgPSBjaGFuZ2VzLm1hcERlc2MobmV3Q2hhbmdlcywgdHJ1ZSk7XG4gICAgICAgICAgICByYW5nZXMucHVzaChyZXN1bHQucmFuZ2UubWFwKG1hcEJ5KSk7XG4gICAgICAgICAgICBjaGFuZ2VzID0gY2hhbmdlcy5jb21wb3NlKG5ld01hcHBlZCk7XG4gICAgICAgICAgICBlZmZlY3RzID0gU3RhdGVFZmZlY3QubWFwRWZmZWN0cyhlZmZlY3RzLCBuZXdNYXBwZWQpLmNvbmNhdChTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGFzQXJyYXkocmVzdWx0LmVmZmVjdHMpLCBtYXBCeSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGFuZ2VzLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcywgc2VsLm1haW5JbmRleCksXG4gICAgICAgICAgICBlZmZlY3RzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIFtjaGFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZVNldCkgZnJvbSB0aGUgZ2l2ZW4gY2hhbmdlXG4gICAgZGVzY3JpcHRpb24sIHRha2luZyB0aGUgc3RhdGUncyBkb2N1bWVudCBsZW5ndGggYW5kIGxpbmVcbiAgICBzZXBhcmF0b3IgaW50byBhY2NvdW50LlxuICAgICovXG4gICAgY2hhbmdlcyhzcGVjID0gW10pIHtcbiAgICAgICAgaWYgKHNwZWMgaW5zdGFuY2VvZiBDaGFuZ2VTZXQpXG4gICAgICAgICAgICByZXR1cm4gc3BlYztcbiAgICAgICAgcmV0dXJuIENoYW5nZVNldC5vZihzcGVjLCB0aGlzLmRvYy5sZW5ndGgsIHRoaXMuZmFjZXQoRWRpdG9yU3RhdGUubGluZVNlcGFyYXRvcikpO1xuICAgIH1cbiAgICAvKipcbiAgICBVc2luZyB0aGUgc3RhdGUncyBbbGluZVxuICAgIHNlcGFyYXRvcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5saW5lU2VwYXJhdG9yKSwgY3JlYXRlIGFcbiAgICBbYFRleHRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHQpIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIHN0cmluZy5cbiAgICAqL1xuICAgIHRvVGV4dChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIFRleHQub2Yoc3RyaW5nLnNwbGl0KHRoaXMuZmFjZXQoRWRpdG9yU3RhdGUubGluZVNlcGFyYXRvcikgfHwgRGVmYXVsdFNwbGl0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGRvY3VtZW50IGFzIGEgc3RyaW5nLlxuICAgICovXG4gICAgc2xpY2VEb2MoZnJvbSA9IDAsIHRvID0gdGhpcy5kb2MubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5zbGljZVN0cmluZyhmcm9tLCB0bywgdGhpcy5saW5lQnJlYWspO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIGEgc3RhdGUgW2ZhY2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkZhY2V0KS5cbiAgICAqL1xuICAgIGZhY2V0KGZhY2V0KSB7XG4gICAgICAgIGxldCBhZGRyID0gdGhpcy5jb25maWcuYWRkcmVzc1tmYWNldC5pZF07XG4gICAgICAgIGlmIChhZGRyID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gZmFjZXQuZGVmYXVsdDtcbiAgICAgICAgZW5zdXJlQWRkcih0aGlzLCBhZGRyKTtcbiAgICAgICAgcmV0dXJuIGdldEFkZHIodGhpcywgYWRkcik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnZlcnQgdGhpcyBzdGF0ZSB0byBhIEpTT04tc2VyaWFsaXphYmxlIG9iamVjdC4gV2hlbiBjdXN0b21cbiAgICBmaWVsZHMgc2hvdWxkIGJlIHNlcmlhbGl6ZWQsIHlvdSBjYW4gcGFzcyB0aGVtIGluIGFzIGFuIG9iamVjdFxuICAgIG1hcHBpbmcgcHJvcGVydHkgbmFtZXMgKGluIHRoZSByZXN1bHRpbmcgb2JqZWN0LCB3aGljaCBzaG91bGRcbiAgICBub3QgdXNlIGBkb2NgIG9yIGBzZWxlY3Rpb25gKSB0byBmaWVsZHMuXG4gICAgKi9cbiAgICB0b0pTT04oZmllbGRzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBkb2M6IHRoaXMuc2xpY2VEb2MoKSxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb24udG9KU09OKClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZpZWxkcylcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZmllbGRzW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0YXRlRmllbGQgJiYgdGhpcy5jb25maWcuYWRkcmVzc1t2YWx1ZS5pZF0gIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BdID0gdmFsdWUuc3BlYy50b0pTT04odGhpcy5maWVsZChmaWVsZHNbcHJvcF0pLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBzdGF0ZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBXaGVuIGN1c3RvbVxuICAgIGZpZWxkcyBzaG91bGQgYmUgZGVzZXJpYWxpemVkLCBwYXNzIHRoZSBzYW1lIG9iamVjdCB5b3UgcGFzc2VkXG4gICAgdG8gW2B0b0pTT05gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnRvSlNPTikgd2hlbiBzZXJpYWxpemluZyBhc1xuICAgIHRoaXJkIGFyZ3VtZW50LlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbmZpZyA9IHt9LCBmaWVsZHMpIHtcbiAgICAgICAgaWYgKCFqc29uIHx8IHR5cGVvZiBqc29uLmRvYyAhPSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEVkaXRvclN0YXRlXCIpO1xuICAgICAgICBsZXQgZmllbGRJbml0ID0gW107XG4gICAgICAgIGlmIChmaWVsZHMpXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIGZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoanNvbiwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzW3Byb3BdLCB2YWx1ZSA9IGpzb25bcHJvcF07XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkSW5pdC5wdXNoKGZpZWxkLmluaXQoc3RhdGUgPT4gZmllbGQuc3BlYy5mcm9tSlNPTih2YWx1ZSwgc3RhdGUpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gRWRpdG9yU3RhdGUuY3JlYXRlKHtcbiAgICAgICAgICAgIGRvYzoganNvbi5kb2MsXG4gICAgICAgICAgICBzZWxlY3Rpb246IEVkaXRvclNlbGVjdGlvbi5mcm9tSlNPTihqc29uLnNlbGVjdGlvbiksXG4gICAgICAgICAgICBleHRlbnNpb25zOiBjb25maWcuZXh0ZW5zaW9ucyA/IGZpZWxkSW5pdC5jb25jYXQoW2NvbmZpZy5leHRlbnNpb25zXSkgOiBmaWVsZEluaXRcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBzdGF0ZS4gWW91J2xsIHVzdWFsbHkgb25seSBuZWVkIHRoaXMgd2hlblxuICAgIGluaXRpYWxpemluZyBhbiBlZGl0b3JcdTIwMTR1cGRhdGVkIHN0YXRlcyBhcmUgY3JlYXRlZCBieSBhcHBseWluZ1xuICAgIHRyYW5zYWN0aW9ucy5cbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoY29uZmlnID0ge30pIHtcbiAgICAgICAgbGV0IGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uLnJlc29sdmUoY29uZmlnLmV4dGVuc2lvbnMgfHwgW10sIG5ldyBNYXApO1xuICAgICAgICBsZXQgZG9jID0gY29uZmlnLmRvYyBpbnN0YW5jZW9mIFRleHQgPyBjb25maWcuZG9jXG4gICAgICAgICAgICA6IFRleHQub2YoKGNvbmZpZy5kb2MgfHwgXCJcIikuc3BsaXQoY29uZmlndXJhdGlvbi5zdGF0aWNGYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSB8fCBEZWZhdWx0U3BsaXQpKTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9ICFjb25maWcuc2VsZWN0aW9uID8gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZSgwKVxuICAgICAgICAgICAgOiBjb25maWcuc2VsZWN0aW9uIGluc3RhbmNlb2YgRWRpdG9yU2VsZWN0aW9uID8gY29uZmlnLnNlbGVjdGlvblxuICAgICAgICAgICAgICAgIDogRWRpdG9yU2VsZWN0aW9uLnNpbmdsZShjb25maWcuc2VsZWN0aW9uLmFuY2hvciwgY29uZmlnLnNlbGVjdGlvbi5oZWFkKTtcbiAgICAgICAgY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uLCBkb2MubGVuZ3RoKTtcbiAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uLnN0YXRpY0ZhY2V0KGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zKSlcbiAgICAgICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5hc1NpbmdsZSgpO1xuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclN0YXRlKGNvbmZpZ3VyYXRpb24sIGRvYywgc2VsZWN0aW9uLCBjb25maWd1cmF0aW9uLmR5bmFtaWNTbG90cy5tYXAoKCkgPT4gbnVsbCksIChzdGF0ZSwgc2xvdCkgPT4gc2xvdC5jcmVhdGUoc3RhdGUpLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHNpemUgKGluIGNvbHVtbnMpIG9mIGEgdGFiIGluIHRoZSBkb2N1bWVudCwgZGV0ZXJtaW5lZCBieVxuICAgIHRoZSBbYHRhYlNpemVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRhYlNpemUpIGZhY2V0LlxuICAgICovXG4gICAgZ2V0IHRhYlNpemUoKSB7IHJldHVybiB0aGlzLmZhY2V0KEVkaXRvclN0YXRlLnRhYlNpemUpOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBwcm9wZXIgW2xpbmUtYnJlYWtdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVebGluZVNlcGFyYXRvcilcbiAgICBzdHJpbmcgZm9yIHRoaXMgc3RhdGUuXG4gICAgKi9cbiAgICBnZXQgbGluZUJyZWFrKCkgeyByZXR1cm4gdGhpcy5mYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSB8fCBcIlxcblwiOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIHdoZW4gdGhlIGVkaXRvciBpc1xuICAgIFtjb25maWd1cmVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnJlYWRPbmx5KSB0byBiZSByZWFkLW9ubHkuXG4gICAgKi9cbiAgICBnZXQgcmVhZE9ubHkoKSB7IHJldHVybiB0aGlzLmZhY2V0KHJlYWRPbmx5KTsgfVxuICAgIC8qKlxuICAgIExvb2sgdXAgYSB0cmFuc2xhdGlvbiBmb3IgdGhlIGdpdmVuIHBocmFzZSAodmlhIHRoZVxuICAgIFtgcGhyYXNlc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVecGhyYXNlcykgZmFjZXQpLCBvciByZXR1cm4gdGhlXG4gICAgb3JpZ2luYWwgc3RyaW5nIGlmIG5vIHRyYW5zbGF0aW9uIGlzIGZvdW5kLlxuICAgIFxuICAgIElmIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwYXNzZWQsIHRoZXkgd2lsbCBiZSBpbnNlcnRlZCBpblxuICAgIHBsYWNlIG9mIG1hcmtlcnMgbGlrZSBgJDFgIChmb3IgdGhlIGZpcnN0IHZhbHVlKSBhbmQgYCQyYCwgZXRjLlxuICAgIEEgc2luZ2xlIGAkYCBpcyBlcXVpdmFsZW50IHRvIGAkMWAsIGFuZCBgJCRgIHdpbGwgcHJvZHVjZSBhXG4gICAgbGl0ZXJhbCBkb2xsYXIgc2lnbi5cbiAgICAqL1xuICAgIHBocmFzZShwaHJhc2UsIC4uLmluc2VydCkge1xuICAgICAgICBmb3IgKGxldCBtYXAgb2YgdGhpcy5mYWNldChFZGl0b3JTdGF0ZS5waHJhc2VzKSlcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobWFwLCBwaHJhc2UpKSB7XG4gICAgICAgICAgICAgICAgcGhyYXNlID0gbWFwW3BocmFzZV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChpbnNlcnQubGVuZ3RoKVxuICAgICAgICAgICAgcGhyYXNlID0gcGhyYXNlLnJlcGxhY2UoL1xcJChcXCR8XFxkKikvZywgKG0sIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBcIiRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiJFwiO1xuICAgICAgICAgICAgICAgIGxldCBuID0gKyhpIHx8IDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiAhbiB8fCBuID4gaW5zZXJ0Lmxlbmd0aCA/IG0gOiBpbnNlcnRbbiAtIDFdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwaHJhc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIHZhbHVlcyBmb3IgYSBnaXZlbiBsYW5ndWFnZSBkYXRhIGZpZWxkLCBwcm92aWRlZCBieSB0aGVcbiAgICB0aGUgW2BsYW5ndWFnZURhdGFgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmxhbmd1YWdlRGF0YSkgZmFjZXQuXG4gICAgXG4gICAgRXhhbXBsZXMgb2YgbGFuZ3VhZ2UgZGF0YSBmaWVsZHMgYXJlLi4uXG4gICAgXG4gICAgLSBbYFwiY29tbWVudFRva2Vuc1wiYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNjb21tYW5kcy5Db21tZW50VG9rZW5zKSBmb3Igc3BlY2lmeWluZ1xuICAgICAgY29tbWVudCBzeW50YXguXG4gICAgLSBbYFwiYXV0b2NvbXBsZXRlXCJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2F1dG9jb21wbGV0ZS5hdXRvY29tcGxldGlvbl5jb25maWcub3ZlcnJpZGUpXG4gICAgICBmb3IgcHJvdmlkaW5nIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBsZXRpb24gc291cmNlcy5cbiAgICAtIFtgXCJ3b3JkQ2hhcnNcImBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuY2hhckNhdGVnb3JpemVyKSBmb3IgYWRkaW5nXG4gICAgICBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcGFydCBvZiB3b3JkcyBpbiB0aGlzXG4gICAgICBsYW5ndWFnZS5cbiAgICAtIFtgXCJjbG9zZUJyYWNrZXRzXCJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2F1dG9jb21wbGV0ZS5DbG9zZUJyYWNrZXRDb25maWcpIGNvbnRyb2xzXG4gICAgICBicmFja2V0IGNsb3NpbmcgYmVoYXZpb3IuXG4gICAgKi9cbiAgICBsYW5ndWFnZURhdGFBdChuYW1lLCBwb3MsIHNpZGUgPSAtMSkge1xuICAgICAgICBsZXQgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IHByb3ZpZGVyIG9mIHRoaXMuZmFjZXQobGFuZ3VhZ2VEYXRhKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgcmVzdWx0IG9mIHByb3ZpZGVyKHRoaXMsIHBvcywgc2lkZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgbmFtZSkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHJlc3VsdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gY2F0ZWdvcml6ZSBzdHJpbmdzIChleHBlY3RlZCB0b1xuICAgIHJlcHJlc2VudCBhIHNpbmdsZSBbZ3JhcGhlbWUgY2x1c3Rlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5maW5kQ2x1c3RlckJyZWFrKSlcbiAgICBpbnRvIG9uZSBvZjpcbiAgICBcbiAgICAgLSBXb3JkIChjb250YWlucyBhbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVyIG9yIGEgY2hhcmFjdGVyXG4gICAgICAgZXhwbGljaXRseSBsaXN0ZWQgaW4gdGhlIGxvY2FsIGxhbmd1YWdlJ3MgYFwid29yZENoYXJzXCJgXG4gICAgICAgbGFuZ3VhZ2UgZGF0YSwgd2hpY2ggc2hvdWxkIGJlIGEgc3RyaW5nKVxuICAgICAtIFNwYWNlIChjb250YWlucyBvbmx5IHdoaXRlc3BhY2UpXG4gICAgIC0gT3RoZXIgKGFueXRoaW5nIGVsc2UpXG4gICAgKi9cbiAgICBjaGFyQ2F0ZWdvcml6ZXIoYXQpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VDYXRlZ29yaXplcih0aGlzLmxhbmd1YWdlRGF0YUF0KFwid29yZENoYXJzXCIsIGF0KS5qb2luKFwiXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgd29yZCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24sIG1lYW5pbmcgdGhlIHJhbmdlXG4gICAgY29udGFpbmluZyBhbGwgW3dvcmRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhckNhdGVnb3J5LldvcmQpIGNoYXJhY3RlcnNcbiAgICBhcm91bmQgaXQuIElmIG5vIHdvcmQgY2hhcmFjdGVycyBhcmUgYWRqYWNlbnQgdG8gdGhlIHBvc2l0aW9uLFxuICAgIHRoaXMgcmV0dXJucyBudWxsLlxuICAgICovXG4gICAgd29yZEF0KHBvcykge1xuICAgICAgICBsZXQgeyB0ZXh0LCBmcm9tLCBsZW5ndGggfSA9IHRoaXMuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICBsZXQgY2F0ID0gdGhpcy5jaGFyQ2F0ZWdvcml6ZXIocG9zKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gcG9zIC0gZnJvbSwgZW5kID0gcG9zIC0gZnJvbTtcbiAgICAgICAgd2hpbGUgKHN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgbGV0IHByZXYgPSBmaW5kQ2x1c3RlckJyZWFrKHRleHQsIHN0YXJ0LCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoY2F0KHRleHQuc2xpY2UocHJldiwgc3RhcnQpKSAhPSBDaGFyQ2F0ZWdvcnkuV29yZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHN0YXJ0ID0gcHJldjtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoZW5kIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGZpbmRDbHVzdGVyQnJlYWsodGV4dCwgZW5kKTtcbiAgICAgICAgICAgIGlmIChjYXQodGV4dC5zbGljZShlbmQsIG5leHQpKSAhPSBDaGFyQ2F0ZWdvcnkuV29yZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGVuZCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXJ0ID09IGVuZCA/IG51bGwgOiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2Uoc3RhcnQgKyBmcm9tLCBlbmQgKyBmcm9tKTtcbiAgICB9XG59XG4vKipcbkEgZmFjZXQgdGhhdCwgd2hlbiBlbmFibGVkLCBjYXVzZXMgdGhlIGVkaXRvciB0byBhbGxvdyBtdWx0aXBsZVxucmFuZ2VzIHRvIGJlIHNlbGVjdGVkLiBCZSBjYXJlZnVsIHRob3VnaCwgYmVjYXVzZSBieSBkZWZhdWx0IHRoZVxuZWRpdG9yIHJlbGllcyBvbiB0aGUgbmF0aXZlIERPTSBzZWxlY3Rpb24sIHdoaWNoIGNhbm5vdCBoYW5kbGVcbm11bHRpcGxlIHNlbGVjdGlvbnMuIEFuIGV4dGVuc2lvbiBsaWtlXG5bYGRyYXdTZWxlY3Rpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuZHJhd1NlbGVjdGlvbikgY2FuIGJlIHVzZWQgdG8gbWFrZVxuc2Vjb25kYXJ5IHNlbGVjdGlvbnMgdmlzaWJsZSB0byB0aGUgdXNlci5cbiovXG5FZGl0b3JTdGF0ZS5hbGxvd011bHRpcGxlU2VsZWN0aW9ucyA9IGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zO1xuLyoqXG5Db25maWd1cmVzIHRoZSB0YWIgc2l6ZSB0byB1c2UgaW4gdGhpcyBzdGF0ZS4gVGhlIGZpcnN0XG4oaGlnaGVzdC1wcmVjZWRlbmNlKSB2YWx1ZSBvZiB0aGUgZmFjZXQgaXMgdXNlZC4gSWYgbm8gdmFsdWUgaXNcbmdpdmVuLCB0aGlzIGRlZmF1bHRzIHRvIDQuXG4qL1xuRWRpdG9yU3RhdGUudGFiU2l6ZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogNFxufSk7XG4vKipcblRoZSBsaW5lIHNlcGFyYXRvciB0byB1c2UuIEJ5IGRlZmF1bHQsIGFueSBvZiBgXCJcXG5cImAsIGBcIlxcclxcblwiYFxuYW5kIGBcIlxcclwiYCBpcyB0cmVhdGVkIGFzIGEgc2VwYXJhdG9yIHdoZW4gc3BsaXR0aW5nIGxpbmVzLCBhbmRcbmxpbmVzIGFyZSBqb2luZWQgd2l0aCBgXCJcXG5cImAuXG5cbldoZW4geW91IGNvbmZpZ3VyZSBhIHZhbHVlIGhlcmUsIG9ubHkgdGhhdCBwcmVjaXNlIHNlcGFyYXRvclxud2lsbCBiZSB1c2VkLCBhbGxvd2luZyB5b3UgdG8gcm91bmQtdHJpcCBkb2N1bWVudHMgdGhyb3VnaCB0aGVcbmVkaXRvciB3aXRob3V0IG5vcm1hbGl6aW5nIGxpbmUgc2VwYXJhdG9ycy5cbiovXG5FZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yID0gbGluZVNlcGFyYXRvcjtcbi8qKlxuVGhpcyBmYWNldCBjb250cm9scyB0aGUgdmFsdWUgb2YgdGhlXG5bYHJlYWRPbmx5YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5yZWFkT25seSkgZ2V0dGVyLCB3aGljaCBpc1xuY29uc3VsdGVkIGJ5IGNvbW1hbmRzIGFuZCBleHRlbnNpb25zIHRoYXQgaW1wbGVtZW50IGVkaXRpbmdcbmZ1bmN0aW9uYWxpdHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhleSBzaG91bGQgYXBwbHkuIEl0XG5kZWZhdWx0cyB0byBmYWxzZSwgYnV0IHdoZW4gaXRzIGhpZ2hlc3QtcHJlY2VkZW5jZSB2YWx1ZSBpc1xuYHRydWVgLCBzdWNoIGZ1bmN0aW9uYWxpdHkgZGlzYWJsZXMgaXRzZWxmLlxuXG5Ob3QgdG8gYmUgY29uZnVzZWQgd2l0aFxuW2BFZGl0b3JWaWV3LmVkaXRhYmxlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeZWRpdGFibGUpLCB3aGljaFxuY29udHJvbHMgd2hldGhlciB0aGUgZWRpdG9yJ3MgRE9NIGlzIHNldCB0byBiZSBlZGl0YWJsZSAoYW5kXG50aHVzIGZvY3VzYWJsZSkuXG4qL1xuRWRpdG9yU3RhdGUucmVhZE9ubHkgPSByZWFkT25seTtcbi8qKlxuUmVnaXN0ZXJzIHRyYW5zbGF0aW9uIHBocmFzZXMuIFRoZVxuW2BwaHJhc2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnBocmFzZSkgbWV0aG9kIHdpbGwgbG9vayB0aHJvdWdoXG5hbGwgb2JqZWN0cyByZWdpc3RlcmVkIHdpdGggdGhpcyBmYWNldCB0byBmaW5kIHRyYW5zbGF0aW9ucyBmb3Jcbml0cyBhcmd1bWVudC5cbiovXG5FZGl0b3JTdGF0ZS5waHJhc2VzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tcGFyZShhLCBiKSB7XG4gICAgICAgIGxldCBrQSA9IE9iamVjdC5rZXlzKGEpLCBrQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICByZXR1cm4ga0EubGVuZ3RoID09IGtCLmxlbmd0aCAmJiBrQS5ldmVyeShrID0+IGFba10gPT0gYltrXSk7XG4gICAgfVxufSk7XG4vKipcbkEgZmFjZXQgdXNlZCB0byByZWdpc3RlciBbbGFuZ3VhZ2VcbmRhdGFdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhQXQpIHByb3ZpZGVycy5cbiovXG5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGEgPSBsYW5ndWFnZURhdGE7XG4vKipcbkZhY2V0IHVzZWQgdG8gcmVnaXN0ZXIgY2hhbmdlIGZpbHRlcnMsIHdoaWNoIGFyZSBjYWxsZWQgZm9yIGVhY2hcbnRyYW5zYWN0aW9uICh1bmxlc3MgZXhwbGljaXRseVxuW2Rpc2FibGVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5maWx0ZXIpKSwgYW5kIGNhbiBzdXBwcmVzc1xucGFydCBvZiB0aGUgdHJhbnNhY3Rpb24ncyBjaGFuZ2VzLlxuXG5TdWNoIGEgZnVuY3Rpb24gY2FuIHJldHVybiBgdHJ1ZWAgdG8gaW5kaWNhdGUgdGhhdCBpdCBkb2Vzbid0XG53YW50IHRvIGRvIGFueXRoaW5nLCBgZmFsc2VgIHRvIGNvbXBsZXRlbHkgc3RvcCB0aGUgY2hhbmdlcyBpblxudGhlIHRyYW5zYWN0aW9uLCBvciBhIHNldCBvZiByYW5nZXMgaW4gd2hpY2ggY2hhbmdlcyBzaG91bGQgYmVcbnN1cHByZXNzZWQuIFN1Y2ggcmFuZ2VzIGFyZSByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiBudW1iZXJzLFxud2l0aCBlYWNoIHBhaXIgb2YgdHdvIG51bWJlcnMgaW5kaWNhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhXG5yYW5nZS4gU28gZm9yIGV4YW1wbGUgYFsxMCwgMjAsIDEwMCwgMTEwXWAgc3VwcHJlc3NlcyBjaGFuZ2VzXG5iZXR3ZWVuIDEwIGFuZCAyMCwgYW5kIGJldHdlZW4gMTAwIGFuZCAxMTAuXG4qL1xuRWRpdG9yU3RhdGUuY2hhbmdlRmlsdGVyID0gY2hhbmdlRmlsdGVyO1xuLyoqXG5GYWNldCB1c2VkIHRvIHJlZ2lzdGVyIGEgaG9vayB0aGF0IGdldHMgYSBjaGFuY2UgdG8gdXBkYXRlIG9yXG5yZXBsYWNlIHRyYW5zYWN0aW9uIHNwZWNzIGJlZm9yZSB0aGV5IGFyZSBhcHBsaWVkLiBUaGlzIHdpbGxcbm9ubHkgYmUgYXBwbGllZCBmb3IgdHJhbnNhY3Rpb25zIHRoYXQgZG9uJ3QgaGF2ZVxuW2BmaWx0ZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5maWx0ZXIpIHNldCB0byBgZmFsc2VgLiBZb3VcbmNhbiBlaXRoZXIgcmV0dXJuIGEgc2luZ2xlIHRyYW5zYWN0aW9uIHNwZWMgKHBvc3NpYmx5IHRoZSBpbnB1dFxudHJhbnNhY3Rpb24pLCBvciBhbiBhcnJheSBvZiBzcGVjcyAod2hpY2ggd2lsbCBiZSBjb21iaW5lZCBpblxudGhlIHNhbWUgd2F5IGFzIHRoZSBhcmd1bWVudHMgdG9cbltgRWRpdG9yU3RhdGUudXBkYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpKS5cblxuV2hlbiBwb3NzaWJsZSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gYXZvaWQgYWNjZXNzaW5nXG5bYFRyYW5zYWN0aW9uLnN0YXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zdGF0ZSkgaW4gYSBmaWx0ZXIsXG5zaW5jZSBpdCB3aWxsIGZvcmNlIGNyZWF0aW9uIG9mIGEgc3RhdGUgdGhhdCB3aWxsIHRoZW4gYmVcbmRpc2NhcmRlZCBhZ2FpbiwgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIGFjdHVhbGx5IGZpbHRlcmVkLlxuXG4oVGhpcyBmdW5jdGlvbmFsaXR5IHNob3VsZCBiZSB1c2VkIHdpdGggY2FyZS4gSW5kaXNjcmltaW5hdGVseVxubW9kaWZ5aW5nIHRyYW5zYWN0aW9uIGlzIGxpa2VseSB0byBicmVhayBzb21ldGhpbmcgb3IgZGVncmFkZVxudGhlIHVzZXIgZXhwZXJpZW5jZS4pXG4qL1xuRWRpdG9yU3RhdGUudHJhbnNhY3Rpb25GaWx0ZXIgPSB0cmFuc2FjdGlvbkZpbHRlcjtcbi8qKlxuVGhpcyBpcyBhIG1vcmUgbGltaXRlZCBmb3JtIG9mXG5bYHRyYW5zYWN0aW9uRmlsdGVyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50cmFuc2FjdGlvbkZpbHRlciksXG53aGljaCBjYW4gb25seSBhZGRcblthbm5vdGF0aW9uc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuYW5ub3RhdGlvbnMpIGFuZFxuW2VmZmVjdHNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpLiBfQnV0XywgdGhpcyB0eXBlXG5vZiBmaWx0ZXIgcnVucyBldmVuIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgZGlzYWJsZWQgcmVndWxhclxuW2ZpbHRlcmluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZmlsdGVyKSwgbWFraW5nIGl0IHN1aXRhYmxlXG5mb3IgZWZmZWN0cyB0aGF0IGRvbid0IG5lZWQgdG8gdG91Y2ggdGhlIGNoYW5nZXMgb3Igc2VsZWN0aW9uLFxuYnV0IGRvIHdhbnQgdG8gcHJvY2VzcyBldmVyeSB0cmFuc2FjdGlvbi5cblxuRXh0ZW5kZXJzIHJ1biBfYWZ0ZXJfIGZpbHRlcnMsIHdoZW4gYm90aCBhcmUgcHJlc2VudC5cbiovXG5FZGl0b3JTdGF0ZS50cmFuc2FjdGlvbkV4dGVuZGVyID0gdHJhbnNhY3Rpb25FeHRlbmRlcjtcbkNvbXBhcnRtZW50LnJlY29uZmlndXJlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuXG4vKipcblV0aWxpdHkgZnVuY3Rpb24gZm9yIGNvbWJpbmluZyBiZWhhdmlvcnMgdG8gZmlsbCBpbiBhIGNvbmZpZ1xub2JqZWN0IGZyb20gYW4gYXJyYXkgb2YgcHJvdmlkZWQgY29uZmlncy4gYGRlZmF1bHRzYCBzaG91bGQgaG9sZFxuZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMgaW4gYENvbmZpZ2AuXG5cblRoZSBmdW5jdGlvbiB3aWxsLCBieSBkZWZhdWx0LCBlcnJvclxud2hlbiBhIGZpZWxkIGdldHMgdHdvIHZhbHVlcyB0aGF0IGFyZW4ndCBgPT09YC1lcXVhbCwgYnV0IHlvdSBjYW5cbnByb3ZpZGUgY29tYmluZSBmdW5jdGlvbnMgcGVyIGZpZWxkIHRvIGRvIHNvbWV0aGluZyBlbHNlLlxuKi9cbmZ1bmN0aW9uIGNvbWJpbmVDb25maWcoY29uZmlncywgZGVmYXVsdHMsIC8vIFNob3VsZCBob2xkIG9ubHkgdGhlIG9wdGlvbmFsIHByb3BlcnRpZXMgb2YgQ29uZmlnLCBidXQgSSBoYXZlbid0IG1hbmFnZWQgdG8gZXhwcmVzcyB0aGF0XG5jb21iaW5lID0ge30pIHtcbiAgICBsZXQgcmVzdWx0ID0ge307XG4gICAgZm9yIChsZXQgY29uZmlnIG9mIGNvbmZpZ3MpXG4gICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBjb25maWdba2V5XSwgY3VycmVudCA9IHJlc3VsdFtrZXldO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudCA9PT0gdmFsdWUgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgOyAvLyBObyBjb25mbGljdFxuICAgICAgICAgICAgZWxzZSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoY29tYmluZSwga2V5KSlcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IGNvbWJpbmVba2V5XShjdXJyZW50LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlnIG1lcmdlIGNvbmZsaWN0IGZvciBmaWVsZCBcIiArIGtleSk7XG4gICAgICAgIH1cbiAgICBmb3IgKGxldCBrZXkgaW4gZGVmYXVsdHMpXG4gICAgICAgIGlmIChyZXN1bHRba2V5XSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBkZWZhdWx0c1trZXldO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuRWFjaCByYW5nZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB2YWx1ZSwgd2hpY2ggbXVzdCBpbmhlcml0IGZyb21cbnRoaXMgY2xhc3MuXG4qL1xuY2xhc3MgUmFuZ2VWYWx1ZSB7XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIHZhbHVlIHdpdGggYW5vdGhlciB2YWx1ZS4gVXNlZCB3aGVuIGNvbXBhcmluZ1xuICAgIHJhbmdlc2V0cy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY29tcGFyZXMgYnkgaWRlbnRpdHkuXG4gICAgVW5sZXNzIHlvdSBhcmUgb25seSBjcmVhdGluZyBhIGZpeGVkIG51bWJlciBvZiB1bmlxdWUgaW5zdGFuY2VzXG4gICAgb2YgeW91ciB2YWx1ZSB0eXBlLCBpdCBpcyBhIGdvb2QgaWRlYSB0byBpbXBsZW1lbnQgdGhpc1xuICAgIHByb3Blcmx5LlxuICAgICovXG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMgPT0gb3RoZXI7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbcmFuZ2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpIHdpdGggdGhpcyB2YWx1ZS5cbiAgICAqL1xuICAgIHJhbmdlKGZyb20sIHRvID0gZnJvbSkgeyByZXR1cm4gUmFuZ2UuY3JlYXRlKGZyb20sIHRvLCB0aGlzKTsgfVxufVxuUmFuZ2VWYWx1ZS5wcm90b3R5cGUuc3RhcnRTaWRlID0gUmFuZ2VWYWx1ZS5wcm90b3R5cGUuZW5kU2lkZSA9IDA7XG5SYW5nZVZhbHVlLnByb3RvdHlwZS5wb2ludCA9IGZhbHNlO1xuUmFuZ2VWYWx1ZS5wcm90b3R5cGUubWFwTW9kZSA9IE1hcE1vZGUuVHJhY2tEZWw7XG4vKipcbkEgcmFuZ2UgYXNzb2NpYXRlcyBhIHZhbHVlIHdpdGggYSByYW5nZSBvZiBwb3NpdGlvbnMuXG4qL1xuY2xhc3MgUmFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSByYW5nZSdzIHN0YXJ0IHBvc2l0aW9uLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgSXRzIGVuZCBwb3NpdGlvbi5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmFuZ2UuXG4gICAgKi9cbiAgICB2YWx1ZSkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGZyb20sIHRvLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKGZyb20sIHRvLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY21wUmFuZ2UoYSwgYikge1xuICAgIHJldHVybiBhLmZyb20gLSBiLmZyb20gfHwgYS52YWx1ZS5zdGFydFNpZGUgLSBiLnZhbHVlLnN0YXJ0U2lkZTtcbn1cbmNsYXNzIENodW5rIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bywgdmFsdWUsIFxuICAgIC8vIENodW5rcyBhcmUgbWFya2VkIHdpdGggdGhlIGxhcmdlc3QgcG9pbnQgdGhhdCBvY2N1cnNcbiAgICAvLyBpbiB0aGVtIChvciAtMSBmb3Igbm8gcG9pbnRzKSwgc28gdGhhdCBzY2FucyB0aGF0IGFyZVxuICAgIC8vIG9ubHkgaW50ZXJlc3RlZCBpbiBwb2ludHMgKHN1Y2ggYXMgdGhlXG4gICAgLy8gaGVpZ2h0bWFwLXJlbGF0ZWQgbG9naWMpIGNhbiBza2lwIHJhbmdlLW9ubHkgY2h1bmtzLlxuICAgIG1heFBvaW50KSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm1heFBvaW50ID0gbWF4UG9pbnQ7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnRvW3RoaXMudG8ubGVuZ3RoIC0gMV07IH1cbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHNpZGUuIFVzZSB0aGUgcmFuZ2VzJ1xuICAgIC8vIGBmcm9tYCBwb3Mgd2hlbiBgZW5kID09IGZhbHNlYCwgYHRvYCB3aGVuIGBlbmQgPT0gdHJ1ZWAuXG4gICAgZmluZEluZGV4KHBvcywgc2lkZSwgZW5kLCBzdGFydEF0ID0gMCkge1xuICAgICAgICBsZXQgYXJyID0gZW5kID8gdGhpcy50byA6IHRoaXMuZnJvbTtcbiAgICAgICAgZm9yIChsZXQgbG8gPSBzdGFydEF0LCBoaSA9IGFyci5sZW5ndGg7Oykge1xuICAgICAgICAgICAgaWYgKGxvID09IGhpKVxuICAgICAgICAgICAgICAgIHJldHVybiBsbztcbiAgICAgICAgICAgIGxldCBtaWQgPSAobG8gKyBoaSkgPj4gMTtcbiAgICAgICAgICAgIGxldCBkaWZmID0gYXJyW21pZF0gLSBwb3MgfHwgKGVuZCA/IHRoaXMudmFsdWVbbWlkXS5lbmRTaWRlIDogdGhpcy52YWx1ZVttaWRdLnN0YXJ0U2lkZSkgLSBzaWRlO1xuICAgICAgICAgICAgaWYgKG1pZCA9PSBsbylcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlmZiA+PSAwID8gbG8gOiBoaTtcbiAgICAgICAgICAgIGlmIChkaWZmID49IDApXG4gICAgICAgICAgICAgICAgaGkgPSBtaWQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbG8gPSBtaWQgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJldHdlZW4ob2Zmc2V0LCBmcm9tLCB0bywgZikge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5maW5kSW5kZXgoZnJvbSwgLTEwMDAwMDAwMDAgLyogQy5GYXIgKi8sIHRydWUpLCBlID0gdGhpcy5maW5kSW5kZXgodG8sIDEwMDAwMDAwMDAgLyogQy5GYXIgKi8sIGZhbHNlLCBpKTsgaSA8IGU7IGkrKylcbiAgICAgICAgICAgIGlmIChmKHRoaXMuZnJvbVtpXSArIG9mZnNldCwgdGhpcy50b1tpXSArIG9mZnNldCwgdGhpcy52YWx1ZVtpXSkgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbWFwKG9mZnNldCwgY2hhbmdlcykge1xuICAgICAgICBsZXQgdmFsdWUgPSBbXSwgZnJvbSA9IFtdLCB0byA9IFtdLCBuZXdQb3MgPSAtMSwgbWF4UG9pbnQgPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdmFsID0gdGhpcy52YWx1ZVtpXSwgY3VyRnJvbSA9IHRoaXMuZnJvbVtpXSArIG9mZnNldCwgY3VyVG8gPSB0aGlzLnRvW2ldICsgb2Zmc2V0LCBuZXdGcm9tLCBuZXdUbztcbiAgICAgICAgICAgIGlmIChjdXJGcm9tID09IGN1clRvKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcHBlZCA9IGNoYW5nZXMubWFwUG9zKGN1ckZyb20sIHZhbC5zdGFydFNpZGUsIHZhbC5tYXBNb2RlKTtcbiAgICAgICAgICAgICAgICBpZiAobWFwcGVkID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG5ld0Zyb20gPSBuZXdUbyA9IG1hcHBlZDtcbiAgICAgICAgICAgICAgICBpZiAodmFsLnN0YXJ0U2lkZSAhPSB2YWwuZW5kU2lkZSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdUbyA9IGNoYW5nZXMubWFwUG9zKGN1ckZyb20sIHZhbC5lbmRTaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1RvIDwgbmV3RnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld0Zyb20gPSBjaGFuZ2VzLm1hcFBvcyhjdXJGcm9tLCB2YWwuc3RhcnRTaWRlKTtcbiAgICAgICAgICAgICAgICBuZXdUbyA9IGNoYW5nZXMubWFwUG9zKGN1clRvLCB2YWwuZW5kU2lkZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Zyb20gPiBuZXdUbyB8fCBuZXdGcm9tID09IG5ld1RvICYmIHZhbC5zdGFydFNpZGUgPiAwICYmIHZhbC5lbmRTaWRlIDw9IDApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChuZXdUbyAtIG5ld0Zyb20gfHwgdmFsLmVuZFNpZGUgLSB2YWwuc3RhcnRTaWRlKSA8IDApXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAobmV3UG9zIDwgMClcbiAgICAgICAgICAgICAgICBuZXdQb3MgPSBuZXdGcm9tO1xuICAgICAgICAgICAgaWYgKHZhbC5wb2ludClcbiAgICAgICAgICAgICAgICBtYXhQb2ludCA9IE1hdGgubWF4KG1heFBvaW50LCBuZXdUbyAtIG5ld0Zyb20pO1xuICAgICAgICAgICAgdmFsdWUucHVzaCh2YWwpO1xuICAgICAgICAgICAgZnJvbS5wdXNoKG5ld0Zyb20gLSBuZXdQb3MpO1xuICAgICAgICAgICAgdG8ucHVzaChuZXdUbyAtIG5ld1Bvcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWFwcGVkOiB2YWx1ZS5sZW5ndGggPyBuZXcgQ2h1bmsoZnJvbSwgdG8sIHZhbHVlLCBtYXhQb2ludCkgOiBudWxsLCBwb3M6IG5ld1BvcyB9O1xuICAgIH1cbn1cbi8qKlxuQSByYW5nZSBzZXQgc3RvcmVzIGEgY29sbGVjdGlvbiBvZiBbcmFuZ2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlKSBpbiBhXG53YXkgdGhhdCBtYWtlcyB0aGVtIGVmZmljaWVudCB0byBbbWFwXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0Lm1hcCkgYW5kXG5bdXBkYXRlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0LnVwZGF0ZSkuIFRoaXMgaXMgYW4gaW1tdXRhYmxlIGRhdGFcbnN0cnVjdHVyZS5cbiovXG5jbGFzcyBSYW5nZVNldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaHVua1BvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaHVuaywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBuZXh0TGF5ZXIsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWF4UG9pbnQpIHtcbiAgICAgICAgdGhpcy5jaHVua1BvcyA9IGNodW5rUG9zO1xuICAgICAgICB0aGlzLmNodW5rID0gY2h1bms7XG4gICAgICAgIHRoaXMubmV4dExheWVyID0gbmV4dExheWVyO1xuICAgICAgICB0aGlzLm1heFBvaW50ID0gbWF4UG9pbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShjaHVua1BvcywgY2h1bmssIG5leHRMYXllciwgbWF4UG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZVNldChjaHVua1BvcywgY2h1bmssIG5leHRMYXllciwgbWF4UG9pbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5jaHVuay5sZW5ndGggLSAxO1xuICAgICAgICByZXR1cm4gbGFzdCA8IDAgPyAwIDogTWF0aC5tYXgodGhpcy5jaHVua0VuZChsYXN0KSwgdGhpcy5uZXh0TGF5ZXIubGVuZ3RoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIG51bWJlciBvZiByYW5nZXMgaW4gdGhlIHNldC5cbiAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBzaXplID0gdGhpcy5uZXh0TGF5ZXIuc2l6ZTtcbiAgICAgICAgZm9yIChsZXQgY2h1bmsgb2YgdGhpcy5jaHVuaylcbiAgICAgICAgICAgIHNpemUgKz0gY2h1bmsudmFsdWUubGVuZ3RoO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaHVua0VuZChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaHVua1Bvc1tpbmRleF0gKyB0aGlzLmNodW5rW2luZGV4XS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgcmFuZ2Ugc2V0LCBvcHRpb25hbGx5IGFkZGluZyBuZXcgcmFuZ2VzIG9yIGZpbHRlcmluZ1xuICAgIG91dCBleGlzdGluZyBvbmVzLlxuICAgIFxuICAgIChOb3RlOiBUaGUgdHlwZSBwYXJhbWV0ZXIgaXMganVzdCB0aGVyZSBhcyBhIGtsdWRnZSB0byB3b3JrXG4gICAgYXJvdW5kIFR5cGVTY3JpcHQgdmFyaWFuY2UgaXNzdWVzIHRoYXQgcHJldmVudGVkIGBSYW5nZVNldDxYPmBcbiAgICBmcm9tIGJlaW5nIGEgc3VidHlwZSBvZiBgUmFuZ2VTZXQ8WT5gIHdoZW4gYFhgIGlzIGEgc3VidHlwZSBvZlxuICAgIGBZYC4pXG4gICAgKi9cbiAgICB1cGRhdGUodXBkYXRlU3BlYykge1xuICAgICAgICBsZXQgeyBhZGQgPSBbXSwgc29ydCA9IGZhbHNlLCBmaWx0ZXJGcm9tID0gMCwgZmlsdGVyVG8gPSB0aGlzLmxlbmd0aCB9ID0gdXBkYXRlU3BlYztcbiAgICAgICAgbGV0IGZpbHRlciA9IHVwZGF0ZVNwZWMuZmlsdGVyO1xuICAgICAgICBpZiAoYWRkLmxlbmd0aCA9PSAwICYmICFmaWx0ZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHNvcnQpXG4gICAgICAgICAgICBhZGQgPSBhZGQuc2xpY2UoKS5zb3J0KGNtcFJhbmdlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBhZGQubGVuZ3RoID8gUmFuZ2VTZXQub2YoYWRkKSA6IHRoaXM7XG4gICAgICAgIGxldCBjdXIgPSBuZXcgTGF5ZXJDdXJzb3IodGhpcywgbnVsbCwgLTEpLmdvdG8oMCksIGkgPSAwLCBzcGlsbCA9IFtdO1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICAgICAgd2hpbGUgKGN1ci52YWx1ZSB8fCBpIDwgYWRkLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGkgPCBhZGQubGVuZ3RoICYmIChjdXIuZnJvbSAtIGFkZFtpXS5mcm9tIHx8IGN1ci5zdGFydFNpZGUgLSBhZGRbaV0udmFsdWUuc3RhcnRTaWRlKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gYWRkW2krK107XG4gICAgICAgICAgICAgICAgaWYgKCFidWlsZGVyLmFkZElubmVyKHJhbmdlLmZyb20sIHJhbmdlLnRvLCByYW5nZS52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIHNwaWxsLnB1c2gocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3VyLnJhbmdlSW5kZXggPT0gMSAmJiBjdXIuY2h1bmtJbmRleCA8IHRoaXMuY2h1bmsubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgKGkgPT0gYWRkLmxlbmd0aCB8fCB0aGlzLmNodW5rRW5kKGN1ci5jaHVua0luZGV4KSA8IGFkZFtpXS5mcm9tKSAmJlxuICAgICAgICAgICAgICAgICghZmlsdGVyIHx8IGZpbHRlckZyb20gPiB0aGlzLmNodW5rRW5kKGN1ci5jaHVua0luZGV4KSB8fCBmaWx0ZXJUbyA8IHRoaXMuY2h1bmtQb3NbY3VyLmNodW5rSW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ2h1bmsodGhpcy5jaHVua1Bvc1tjdXIuY2h1bmtJbmRleF0sIHRoaXMuY2h1bmtbY3VyLmNodW5rSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGN1ci5uZXh0Q2h1bmsoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlckZyb20gPiBjdXIudG8gfHwgZmlsdGVyVG8gPCBjdXIuZnJvbSB8fCBmaWx0ZXIoY3VyLmZyb20sIGN1ci50bywgY3VyLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1aWxkZXIuYWRkSW5uZXIoY3VyLmZyb20sIGN1ci50bywgY3VyLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwaWxsLnB1c2goUmFuZ2UuY3JlYXRlKGN1ci5mcm9tLCBjdXIudG8sIGN1ci52YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXIubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmZpbmlzaElubmVyKHRoaXMubmV4dExheWVyLmlzRW1wdHkgJiYgIXNwaWxsLmxlbmd0aCA/IFJhbmdlU2V0LmVtcHR5XG4gICAgICAgICAgICA6IHRoaXMubmV4dExheWVyLnVwZGF0ZSh7IGFkZDogc3BpbGwsIGZpbHRlciwgZmlsdGVyRnJvbSwgZmlsdGVyVG8gfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgdGhpcyByYW5nZSBzZXQgdGhyb3VnaCBhIHNldCBvZiBjaGFuZ2VzLCByZXR1cm4gdGhlIG5ldyBzZXQuXG4gICAgKi9cbiAgICBtYXAoY2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5lbXB0eSB8fCB0aGlzLmlzRW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IGNodW5rcyA9IFtdLCBjaHVua1BvcyA9IFtdLCBtYXhQb2ludCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2h1bmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuY2h1bmtQb3NbaV0sIGNodW5rID0gdGhpcy5jaHVua1tpXTtcbiAgICAgICAgICAgIGxldCB0b3VjaCA9IGNoYW5nZXMudG91Y2hlc1JhbmdlKHN0YXJ0LCBzdGFydCArIGNodW5rLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAodG91Y2ggPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgbWF4UG9pbnQgPSBNYXRoLm1heChtYXhQb2ludCwgY2h1bmsubWF4UG9pbnQpO1xuICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgICAgICBjaHVua1Bvcy5wdXNoKGNoYW5nZXMubWFwUG9zKHN0YXJ0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0b3VjaCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCB7IG1hcHBlZCwgcG9zIH0gPSBjaHVuay5tYXAoc3RhcnQsIGNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIGlmIChtYXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4UG9pbnQgPSBNYXRoLm1heChtYXhQb2ludCwgbWFwcGVkLm1heFBvaW50KTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2gobWFwcGVkKTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtQb3MucHVzaChwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dCA9IHRoaXMubmV4dExheWVyLm1hcChjaGFuZ2VzKTtcbiAgICAgICAgcmV0dXJuIGNodW5rcy5sZW5ndGggPT0gMCA/IG5leHQgOiBuZXcgUmFuZ2VTZXQoY2h1bmtQb3MsIGNodW5rcywgbmV4dCB8fCBSYW5nZVNldC5lbXB0eSwgbWF4UG9pbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyB0aGF0IHRvdWNoIHRoZSByZWdpb24gYGZyb21gIHRvIGB0b2AsXG4gICAgY2FsbGluZyBgZmAgZm9yIGVhY2guIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSByYW5nZXMgd2lsbFxuICAgIGJlIHJlcG9ydGVkIGluIGFueSBzcGVjaWZpYyBvcmRlci4gV2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJuc1xuICAgIGBmYWxzZWAsIGl0ZXJhdGlvbiBzdG9wcy5cbiAgICAqL1xuICAgIGJldHdlZW4oZnJvbSwgdG8sIGYpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNodW5rLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmNodW5rUG9zW2ldLCBjaHVuayA9IHRoaXMuY2h1bmtbaV07XG4gICAgICAgICAgICBpZiAodG8gPj0gc3RhcnQgJiYgZnJvbSA8PSBzdGFydCArIGNodW5rLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIGNodW5rLmJldHdlZW4oc3RhcnQsIGZyb20gLSBzdGFydCwgdG8gLSBzdGFydCwgZikgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5leHRMYXllci5iZXR3ZWVuKGZyb20sIHRvLCBmKTtcbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSByYW5nZXMgaW4gdGhpcyBzZXQsIGluIG9yZGVyLCBpbmNsdWRpbmcgYWxsXG4gICAgcmFuZ2VzIHRoYXQgZW5kIGF0IG9yIGFmdGVyIGBmcm9tYC5cbiAgICAqL1xuICAgIGl0ZXIoZnJvbSA9IDApIHtcbiAgICAgICAgcmV0dXJuIEhlYXBDdXJzb3IuZnJvbShbdGhpc10pLmdvdG8oZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGlzRW1wdHkoKSB7IHJldHVybiB0aGlzLm5leHRMYXllciA9PSB0aGlzOyB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSByYW5nZXMgaW4gYSBjb2xsZWN0aW9uIG9mIHNldHMsIGluIG9yZGVyLFxuICAgIHN0YXJ0aW5nIGZyb20gYGZyb21gLlxuICAgICovXG4gICAgc3RhdGljIGl0ZXIoc2V0cywgZnJvbSA9IDApIHtcbiAgICAgICAgcmV0dXJuIEhlYXBDdXJzb3IuZnJvbShzZXRzKS5nb3RvKGZyb20pO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdHdvIGdyb3VwcyBvZiBzZXRzLCBjYWxsaW5nIG1ldGhvZHMgb24gYGNvbXBhcmF0b3JgXG4gICAgdG8gbm90aWZ5IGl0IG9mIHBvc3NpYmxlIGRpZmZlcmVuY2VzLlxuICAgICovXG4gICAgc3RhdGljIGNvbXBhcmUob2xkU2V0cywgbmV3U2V0cywgXG4gICAgLyoqXG4gICAgVGhpcyBpbmRpY2F0ZXMgaG93IHRoZSB1bmRlcmx5aW5nIGRhdGEgY2hhbmdlZCBiZXR3ZWVuIHRoZXNlXG4gICAgcmFuZ2VzLCBhbmQgaXMgbmVlZGVkIHRvIHN5bmNocm9uaXplIHRoZSBpdGVyYXRpb24uXG4gICAgKi9cbiAgICB0ZXh0RGlmZiwgY29tcGFyYXRvciwgXG4gICAgLyoqXG4gICAgQ2FuIGJlIHVzZWQgdG8gaWdub3JlIGFsbCBub24tcG9pbnQgcmFuZ2VzLCBhbmQgcG9pbnRzIGJlbG93XG4gICAgdGhlIGdpdmVuIHNpemUuIFdoZW4gLTEsIGFsbCByYW5nZXMgYXJlIGNvbXBhcmVkLlxuICAgICovXG4gICAgbWluUG9pbnRTaXplID0gLTEpIHtcbiAgICAgICAgbGV0IGEgPSBvbGRTZXRzLmZpbHRlcihzZXQgPT4gc2V0Lm1heFBvaW50ID4gMCB8fCAhc2V0LmlzRW1wdHkgJiYgc2V0Lm1heFBvaW50ID49IG1pblBvaW50U2l6ZSk7XG4gICAgICAgIGxldCBiID0gbmV3U2V0cy5maWx0ZXIoc2V0ID0+IHNldC5tYXhQb2ludCA+IDAgfHwgIXNldC5pc0VtcHR5ICYmIHNldC5tYXhQb2ludCA+PSBtaW5Qb2ludFNpemUpO1xuICAgICAgICBsZXQgc2hhcmVkQ2h1bmtzID0gZmluZFNoYXJlZENodW5rcyhhLCBiLCB0ZXh0RGlmZik7XG4gICAgICAgIGxldCBzaWRlQSA9IG5ldyBTcGFuQ3Vyc29yKGEsIHNoYXJlZENodW5rcywgbWluUG9pbnRTaXplKTtcbiAgICAgICAgbGV0IHNpZGVCID0gbmV3IFNwYW5DdXJzb3IoYiwgc2hhcmVkQ2h1bmtzLCBtaW5Qb2ludFNpemUpO1xuICAgICAgICB0ZXh0RGlmZi5pdGVyR2FwcygoZnJvbUEsIGZyb21CLCBsZW5ndGgpID0+IGNvbXBhcmUoc2lkZUEsIGZyb21BLCBzaWRlQiwgZnJvbUIsIGxlbmd0aCwgY29tcGFyYXRvcikpO1xuICAgICAgICBpZiAodGV4dERpZmYuZW1wdHkgJiYgdGV4dERpZmYubGVuZ3RoID09IDApXG4gICAgICAgICAgICBjb21wYXJlKHNpZGVBLCAwLCBzaWRlQiwgMCwgMCwgY29tcGFyYXRvcik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhlIGNvbnRlbnRzIG9mIHR3byBncm91cHMgb2YgcmFuZ2Ugc2V0cywgcmV0dXJuaW5nIHRydWVcbiAgICBpZiB0aGV5IGFyZSBlcXVpdmFsZW50IGluIHRoZSBnaXZlbiByYW5nZS5cbiAgICAqL1xuICAgIHN0YXRpYyBlcShvbGRTZXRzLCBuZXdTZXRzLCBmcm9tID0gMCwgdG8pIHtcbiAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICB0byA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi8gLSAxO1xuICAgICAgICBsZXQgYSA9IG9sZFNldHMuZmlsdGVyKHNldCA9PiAhc2V0LmlzRW1wdHkgJiYgbmV3U2V0cy5pbmRleE9mKHNldCkgPCAwKTtcbiAgICAgICAgbGV0IGIgPSBuZXdTZXRzLmZpbHRlcihzZXQgPT4gIXNldC5pc0VtcHR5ICYmIG9sZFNldHMuaW5kZXhPZihzZXQpIDwgMCk7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFhLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgc2hhcmVkQ2h1bmtzID0gZmluZFNoYXJlZENodW5rcyhhLCBiKTtcbiAgICAgICAgbGV0IHNpZGVBID0gbmV3IFNwYW5DdXJzb3IoYSwgc2hhcmVkQ2h1bmtzLCAwKS5nb3RvKGZyb20pLCBzaWRlQiA9IG5ldyBTcGFuQ3Vyc29yKGIsIHNoYXJlZENodW5rcywgMCkuZ290byhmcm9tKTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKHNpZGVBLnRvICE9IHNpZGVCLnRvIHx8XG4gICAgICAgICAgICAgICAgIXNhbWVWYWx1ZXMoc2lkZUEuYWN0aXZlLCBzaWRlQi5hY3RpdmUpIHx8XG4gICAgICAgICAgICAgICAgc2lkZUEucG9pbnQgJiYgKCFzaWRlQi5wb2ludCB8fCAhc2lkZUEucG9pbnQuZXEoc2lkZUIucG9pbnQpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoc2lkZUEudG8gPiB0bylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHNpZGVBLm5leHQoKTtcbiAgICAgICAgICAgIHNpZGVCLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgYSBncm91cCBvZiByYW5nZSBzZXRzIGF0IHRoZSBzYW1lIHRpbWUsIG5vdGlmeWluZ1xuICAgIHRoZSBpdGVyYXRvciBhYm91dCB0aGUgcmFuZ2VzIGNvdmVyaW5nIGV2ZXJ5IGdpdmVuIHBpZWNlIG9mXG4gICAgY29udGVudC4gUmV0dXJucyB0aGUgb3BlbiBjb3VudCAoc2VlXG4gICAgW2BTcGFuSXRlcmF0b3Iuc3BhbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3Bhbkl0ZXJhdG9yLnNwYW4pKSBhdCB0aGUgZW5kXG4gICAgb2YgdGhlIGl0ZXJhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBzcGFucyhzZXRzLCBmcm9tLCB0bywgaXRlcmF0b3IsIFxuICAgIC8qKlxuICAgIFdoZW4gZ2l2ZW4gYW5kIGdyZWF0ZXIgdGhhbiAtMSwgb25seSBwb2ludHMgb2YgYXQgbGVhc3QgdGhpc1xuICAgIHNpemUgYXJlIHRha2VuIGludG8gYWNjb3VudC5cbiAgICAqL1xuICAgIG1pblBvaW50U2l6ZSA9IC0xKSB7XG4gICAgICAgIGxldCBjdXJzb3IgPSBuZXcgU3BhbkN1cnNvcihzZXRzLCBudWxsLCBtaW5Qb2ludFNpemUpLmdvdG8oZnJvbSksIHBvcyA9IGZyb207XG4gICAgICAgIGxldCBvcGVuUmFuZ2VzID0gY3Vyc29yLm9wZW5TdGFydDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGN1clRvID0gTWF0aC5taW4oY3Vyc29yLnRvLCB0byk7XG4gICAgICAgICAgICBpZiAoY3Vyc29yLnBvaW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IGFjdGl2ZSA9IGN1cnNvci5hY3RpdmVGb3JQb2ludChjdXJzb3IudG8pO1xuICAgICAgICAgICAgICAgIGxldCBvcGVuQ291bnQgPSBjdXJzb3IucG9pbnRGcm9tIDwgZnJvbSA/IGFjdGl2ZS5sZW5ndGggKyAxXG4gICAgICAgICAgICAgICAgICAgIDogY3Vyc29yLnBvaW50LnN0YXJ0U2lkZSA8IDAgPyBhY3RpdmUubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA6IE1hdGgubWluKGFjdGl2ZS5sZW5ndGgsIG9wZW5SYW5nZXMpO1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnBvaW50KHBvcywgY3VyVG8sIGN1cnNvci5wb2ludCwgYWN0aXZlLCBvcGVuQ291bnQsIGN1cnNvci5wb2ludFJhbmspO1xuICAgICAgICAgICAgICAgIG9wZW5SYW5nZXMgPSBNYXRoLm1pbihjdXJzb3Iub3BlbkVuZChjdXJUbyksIGFjdGl2ZS5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3VyVG8gPiBwb3MpIHtcbiAgICAgICAgICAgICAgICBpdGVyYXRvci5zcGFuKHBvcywgY3VyVG8sIGN1cnNvci5hY3RpdmUsIG9wZW5SYW5nZXMpO1xuICAgICAgICAgICAgICAgIG9wZW5SYW5nZXMgPSBjdXJzb3Iub3BlbkVuZChjdXJUbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3Vyc29yLnRvID4gdG8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5SYW5nZXMgKyAoY3Vyc29yLnBvaW50ICYmIGN1cnNvci50byA+IHRvID8gMSA6IDApO1xuICAgICAgICAgICAgcG9zID0gY3Vyc29yLnRvO1xuICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSByYW5nZSBzZXQgZm9yIHRoZSBnaXZlbiByYW5nZSBvciBhcnJheSBvZiByYW5nZXMuIEJ5XG4gICAgZGVmYXVsdCwgdGhpcyBleHBlY3RzIHRoZSByYW5nZXMgdG8gYmUgX3NvcnRlZF8gKGJ5IHN0YXJ0XG4gICAgcG9zaXRpb24gYW5kLCBpZiB0d28gc3RhcnQgYXQgdGhlIHNhbWUgcG9zaXRpb24sXG4gICAgYHZhbHVlLnN0YXJ0U2lkZWApLiBZb3UgY2FuIHBhc3MgYHRydWVgIGFzIHNlY29uZCBhcmd1bWVudCB0b1xuICAgIGNhdXNlIHRoZSBtZXRob2QgdG8gc29ydCB0aGVtLlxuICAgICovXG4gICAgc3RhdGljIG9mKHJhbmdlcywgc29ydCA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBidWlsZCA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICAgICAgZm9yIChsZXQgcmFuZ2Ugb2YgcmFuZ2VzIGluc3RhbmNlb2YgUmFuZ2UgPyBbcmFuZ2VzXSA6IHNvcnQgPyBsYXp5U29ydChyYW5nZXMpIDogcmFuZ2VzKVxuICAgICAgICAgICAgYnVpbGQuYWRkKHJhbmdlLmZyb20sIHJhbmdlLnRvLCByYW5nZS52YWx1ZSk7XG4gICAgICAgIHJldHVybiBidWlsZC5maW5pc2goKTtcbiAgICB9XG4gICAgLyoqXG4gICAgSm9pbiBhbiBhcnJheSBvZiByYW5nZSBzZXRzIGludG8gYSBzaW5nbGUgc2V0LlxuICAgICovXG4gICAgc3RhdGljIGpvaW4oc2V0cykge1xuICAgICAgICBpZiAoIXNldHMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIFJhbmdlU2V0LmVtcHR5O1xuICAgICAgICBsZXQgcmVzdWx0ID0gc2V0c1tzZXRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBmb3IgKGxldCBpID0gc2V0cy5sZW5ndGggLSAyOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgZm9yIChsZXQgbGF5ZXIgPSBzZXRzW2ldOyBsYXllciAhPSBSYW5nZVNldC5lbXB0eTsgbGF5ZXIgPSBsYXllci5uZXh0TGF5ZXIpXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFJhbmdlU2V0KGxheWVyLmNodW5rUG9zLCBsYXllci5jaHVuaywgcmVzdWx0LCBNYXRoLm1heChsYXllci5tYXhQb2ludCwgcmVzdWx0Lm1heFBvaW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcblRoZSBlbXB0eSBzZXQgb2YgcmFuZ2VzLlxuKi9cblJhbmdlU2V0LmVtcHR5ID0gLypAX19QVVJFX18qL25ldyBSYW5nZVNldChbXSwgW10sIG51bGwsIC0xKTtcbmZ1bmN0aW9uIGxhenlTb3J0KHJhbmdlcykge1xuICAgIGlmIChyYW5nZXMubGVuZ3RoID4gMSlcbiAgICAgICAgZm9yIChsZXQgcHJldiA9IHJhbmdlc1swXSwgaSA9IDE7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSByYW5nZXNbaV07XG4gICAgICAgICAgICBpZiAoY21wUmFuZ2UocHJldiwgY3VyKSA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlcy5zbGljZSgpLnNvcnQoY21wUmFuZ2UpO1xuICAgICAgICAgICAgcHJldiA9IGN1cjtcbiAgICAgICAgfVxuICAgIHJldHVybiByYW5nZXM7XG59XG5SYW5nZVNldC5lbXB0eS5uZXh0TGF5ZXIgPSBSYW5nZVNldC5lbXB0eTtcbi8qKlxuQSByYW5nZSBzZXQgYnVpbGRlciBpcyBhIGRhdGEgc3RydWN0dXJlIHRoYXQgaGVscHMgYnVpbGQgdXAgYVxuW3JhbmdlIHNldF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZVNldCkgZGlyZWN0bHksIHdpdGhvdXQgZmlyc3QgYWxsb2NhdGluZ1xuYW4gYXJyYXkgb2YgW2BSYW5nZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpIG9iamVjdHMuXG4qL1xuY2xhc3MgUmFuZ2VTZXRCdWlsZGVyIHtcbiAgICBmaW5pc2hDaHVuayhuZXdBcnJheXMpIHtcbiAgICAgICAgdGhpcy5jaHVua3MucHVzaChuZXcgQ2h1bmsodGhpcy5mcm9tLCB0aGlzLnRvLCB0aGlzLnZhbHVlLCB0aGlzLm1heFBvaW50KSk7XG4gICAgICAgIHRoaXMuY2h1bmtQb3MucHVzaCh0aGlzLmNodW5rU3RhcnQpO1xuICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5zZXRNYXhQb2ludCA9IE1hdGgubWF4KHRoaXMuc2V0TWF4UG9pbnQsIHRoaXMubWF4UG9pbnQpO1xuICAgICAgICB0aGlzLm1heFBvaW50ID0gLTE7XG4gICAgICAgIGlmIChuZXdBcnJheXMpIHtcbiAgICAgICAgICAgIHRoaXMuZnJvbSA9IFtdO1xuICAgICAgICAgICAgdGhpcy50byA9IFtdO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBlbXB0eSBidWlsZGVyLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuY2h1bmtQb3MgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1N0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMubGFzdCA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEZyb20gPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgdGhpcy5sYXN0VG8gPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgdGhpcy5mcm9tID0gW107XG4gICAgICAgIHRoaXMudG8gPSBbXTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgICAgICB0aGlzLm1heFBvaW50ID0gLTE7XG4gICAgICAgIHRoaXMuc2V0TWF4UG9pbnQgPSAtMTtcbiAgICAgICAgdGhpcy5uZXh0TGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgYSByYW5nZS4gUmFuZ2VzIHNob3VsZCBiZSBhZGRlZCBpbiBzb3J0ZWQgKGJ5IGBmcm9tYCBhbmRcbiAgICBgdmFsdWUuc3RhcnRTaWRlYCkgb3JkZXIuXG4gICAgKi9cbiAgICBhZGQoZnJvbSwgdG8sIHZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy5hZGRJbm5lcihmcm9tLCB0bywgdmFsdWUpKVxuICAgICAgICAgICAgKHRoaXMubmV4dExheWVyIHx8ICh0aGlzLm5leHRMYXllciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIpKS5hZGQoZnJvbSwgdG8sIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhZGRJbm5lcihmcm9tLCB0bywgdmFsdWUpIHtcbiAgICAgICAgbGV0IGRpZmYgPSBmcm9tIC0gdGhpcy5sYXN0VG8gfHwgdmFsdWUuc3RhcnRTaWRlIC0gdGhpcy5sYXN0LmVuZFNpZGU7XG4gICAgICAgIGlmIChkaWZmIDw9IDAgJiYgKGZyb20gLSB0aGlzLmxhc3RGcm9tIHx8IHZhbHVlLnN0YXJ0U2lkZSAtIHRoaXMubGFzdC5zdGFydFNpZGUpIDwgMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJhbmdlcyBtdXN0IGJlIGFkZGVkIHNvcnRlZCBieSBgZnJvbWAgcG9zaXRpb24gYW5kIGBzdGFydFNpZGVgXCIpO1xuICAgICAgICBpZiAoZGlmZiA8IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmZyb20ubGVuZ3RoID09IDI1MCAvKiBDLkNodW5rU2l6ZSAqLylcbiAgICAgICAgICAgIHRoaXMuZmluaXNoQ2h1bmsodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmNodW5rU3RhcnQgPCAwKVxuICAgICAgICAgICAgdGhpcy5jaHVua1N0YXJ0ID0gZnJvbTtcbiAgICAgICAgdGhpcy5mcm9tLnB1c2goZnJvbSAtIHRoaXMuY2h1bmtTdGFydCk7XG4gICAgICAgIHRoaXMudG8ucHVzaCh0byAtIHRoaXMuY2h1bmtTdGFydCk7XG4gICAgICAgIHRoaXMubGFzdCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmxhc3RGcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy5sYXN0VG8gPSB0bztcbiAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHZhbHVlKTtcbiAgICAgICAgaWYgKHZhbHVlLnBvaW50KVxuICAgICAgICAgICAgdGhpcy5tYXhQb2ludCA9IE1hdGgubWF4KHRoaXMubWF4UG9pbnQsIHRvIC0gZnJvbSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFkZENodW5rKGZyb20sIGNodW5rKSB7XG4gICAgICAgIGlmICgoZnJvbSAtIHRoaXMubGFzdFRvIHx8IGNodW5rLnZhbHVlWzBdLnN0YXJ0U2lkZSAtIHRoaXMubGFzdC5lbmRTaWRlKSA8IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmZyb20ubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5maW5pc2hDaHVuayh0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRNYXhQb2ludCA9IE1hdGgubWF4KHRoaXMuc2V0TWF4UG9pbnQsIGNodW5rLm1heFBvaW50KTtcbiAgICAgICAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIHRoaXMuY2h1bmtQb3MucHVzaChmcm9tKTtcbiAgICAgICAgbGV0IGxhc3QgPSBjaHVuay52YWx1ZS5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLmxhc3QgPSBjaHVuay52YWx1ZVtsYXN0XTtcbiAgICAgICAgdGhpcy5sYXN0RnJvbSA9IGNodW5rLmZyb21bbGFzdF0gKyBmcm9tO1xuICAgICAgICB0aGlzLmxhc3RUbyA9IGNodW5rLnRvW2xhc3RdICsgZnJvbTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmlzaCB0aGUgcmFuZ2Ugc2V0LiBSZXR1cm5zIHRoZSBuZXcgc2V0LiBUaGUgYnVpbGRlciBjYW4ndCBiZVxuICAgIHVzZWQgYW55bW9yZSBhZnRlciB0aGlzIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAqL1xuICAgIGZpbmlzaCgpIHsgcmV0dXJuIHRoaXMuZmluaXNoSW5uZXIoUmFuZ2VTZXQuZW1wdHkpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmaW5pc2hJbm5lcihuZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLmZyb20ubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5maW5pc2hDaHVuayhmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmNodW5rcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICBsZXQgcmVzdWx0ID0gUmFuZ2VTZXQuY3JlYXRlKHRoaXMuY2h1bmtQb3MsIHRoaXMuY2h1bmtzLCB0aGlzLm5leHRMYXllciA/IHRoaXMubmV4dExheWVyLmZpbmlzaElubmVyKG5leHQpIDogbmV4dCwgdGhpcy5zZXRNYXhQb2ludCk7XG4gICAgICAgIHRoaXMuZnJvbSA9IG51bGw7IC8vIE1ha2Ugc3VyZSBmdXJ0aGVyIGBhZGRgIGNhbGxzIHByb2R1Y2UgZXJyb3JzXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZmluZFNoYXJlZENodW5rcyhhLCBiLCB0ZXh0RGlmZikge1xuICAgIGxldCBpbkEgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChsZXQgc2V0IG9mIGEpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0LmNodW5rLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHNldC5jaHVua1tpXS5tYXhQb2ludCA8PSAwKVxuICAgICAgICAgICAgICAgIGluQS5zZXQoc2V0LmNodW5rW2ldLCBzZXQuY2h1bmtQb3NbaV0pO1xuICAgIGxldCBzaGFyZWQgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChsZXQgc2V0IG9mIGIpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0LmNodW5rLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQga25vd24gPSBpbkEuZ2V0KHNldC5jaHVua1tpXSk7XG4gICAgICAgICAgICBpZiAoa25vd24gIT0gbnVsbCAmJiAodGV4dERpZmYgPyB0ZXh0RGlmZi5tYXBQb3Moa25vd24pIDoga25vd24pID09IHNldC5jaHVua1Bvc1tpXSAmJlxuICAgICAgICAgICAgICAgICEodGV4dERpZmYgPT09IG51bGwgfHwgdGV4dERpZmYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHREaWZmLnRvdWNoZXNSYW5nZShrbm93biwga25vd24gKyBzZXQuY2h1bmtbaV0ubGVuZ3RoKSkpXG4gICAgICAgICAgICAgICAgc2hhcmVkLmFkZChzZXQuY2h1bmtbaV0pO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHNoYXJlZDtcbn1cbmNsYXNzIExheWVyQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihsYXllciwgc2tpcCwgbWluUG9pbnQsIHJhbmsgPSAwKSB7XG4gICAgICAgIHRoaXMubGF5ZXIgPSBsYXllcjtcbiAgICAgICAgdGhpcy5za2lwID0gc2tpcDtcbiAgICAgICAgdGhpcy5taW5Qb2ludCA9IG1pblBvaW50O1xuICAgICAgICB0aGlzLnJhbmsgPSByYW5rO1xuICAgIH1cbiAgICBnZXQgc3RhcnRTaWRlKCkgeyByZXR1cm4gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUuc3RhcnRTaWRlIDogMDsgfVxuICAgIGdldCBlbmRTaWRlKCkgeyByZXR1cm4gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUuZW5kU2lkZSA6IDA7IH1cbiAgICBnb3RvKHBvcywgc2lkZSA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovKSB7XG4gICAgICAgIHRoaXMuY2h1bmtJbmRleCA9IHRoaXMucmFuZ2VJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuZ290b0lubmVyKHBvcywgc2lkZSwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZ290b0lubmVyKHBvcywgc2lkZSwgZm9yd2FyZCkge1xuICAgICAgICB3aGlsZSAodGhpcy5jaHVua0luZGV4IDwgdGhpcy5sYXllci5jaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5sYXllci5jaHVua1t0aGlzLmNodW5rSW5kZXhdO1xuICAgICAgICAgICAgaWYgKCEodGhpcy5za2lwICYmIHRoaXMuc2tpcC5oYXMobmV4dCkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmxheWVyLmNodW5rRW5kKHRoaXMuY2h1bmtJbmRleCkgPCBwb3MgfHxcbiAgICAgICAgICAgICAgICBuZXh0Lm1heFBvaW50IDwgdGhpcy5taW5Qb2ludCkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB0aGlzLmNodW5rSW5kZXgrKztcbiAgICAgICAgICAgIGZvcndhcmQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaHVua0luZGV4IDwgdGhpcy5sYXllci5jaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByYW5nZUluZGV4ID0gdGhpcy5sYXllci5jaHVua1t0aGlzLmNodW5rSW5kZXhdLmZpbmRJbmRleChwb3MgLSB0aGlzLmxheWVyLmNodW5rUG9zW3RoaXMuY2h1bmtJbmRleF0sIHNpZGUsIHRydWUpO1xuICAgICAgICAgICAgaWYgKCFmb3J3YXJkIHx8IHRoaXMucmFuZ2VJbmRleCA8IHJhbmdlSW5kZXgpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZUluZGV4KHJhbmdlSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICBmb3J3YXJkKHBvcywgc2lkZSkge1xuICAgICAgICBpZiAoKHRoaXMudG8gLSBwb3MgfHwgdGhpcy5lbmRTaWRlIC0gc2lkZSkgPCAwKVxuICAgICAgICAgICAgdGhpcy5nb3RvSW5uZXIocG9zLCBzaWRlLCB0cnVlKTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2h1bmtJbmRleCA9PSB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJvbSA9IHRoaXMudG8gPSAxMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGNodW5rUG9zID0gdGhpcy5sYXllci5jaHVua1Bvc1t0aGlzLmNodW5rSW5kZXhdLCBjaHVuayA9IHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XTtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IGNodW5rUG9zICsgY2h1bmsuZnJvbVt0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgICAgICAgICAgdGhpcy50byA9IGNodW5rUG9zICsgY2h1bmsudG9bdGhpcy5yYW5nZUluZGV4XTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gY2h1bmsudmFsdWVbdGhpcy5yYW5nZUluZGV4XTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlSW5kZXgodGhpcy5yYW5nZUluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWluUG9pbnQgPCAwIHx8IHRoaXMudmFsdWUucG9pbnQgJiYgdGhpcy50byAtIHRoaXMuZnJvbSA+PSB0aGlzLm1pblBvaW50KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRSYW5nZUluZGV4KGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA9PSB0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF0udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNodW5rSW5kZXgrKztcbiAgICAgICAgICAgIGlmICh0aGlzLnNraXApIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5jaHVua0luZGV4IDwgdGhpcy5sYXllci5jaHVuay5sZW5ndGggJiYgdGhpcy5za2lwLmhhcyh0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF0pKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNodW5rSW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJhbmdlSW5kZXggPSBpbmRleDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZXh0Q2h1bmsoKSB7XG4gICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICB0aGlzLnJhbmdlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gICAgY29tcGFyZShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tIC0gb3RoZXIuZnJvbSB8fCB0aGlzLnN0YXJ0U2lkZSAtIG90aGVyLnN0YXJ0U2lkZSB8fCB0aGlzLnJhbmsgLSBvdGhlci5yYW5rIHx8XG4gICAgICAgICAgICB0aGlzLnRvIC0gb3RoZXIudG8gfHwgdGhpcy5lbmRTaWRlIC0gb3RoZXIuZW5kU2lkZTtcbiAgICB9XG59XG5jbGFzcyBIZWFwQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihoZWFwKSB7XG4gICAgICAgIHRoaXMuaGVhcCA9IGhlYXA7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tKHNldHMsIHNraXAgPSBudWxsLCBtaW5Qb2ludCA9IC0xKSB7XG4gICAgICAgIGxldCBoZWFwID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgY3VyID0gc2V0c1tpXTsgIWN1ci5pc0VtcHR5OyBjdXIgPSBjdXIubmV4dExheWVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1ci5tYXhQb2ludCA+PSBtaW5Qb2ludClcbiAgICAgICAgICAgICAgICAgICAgaGVhcC5wdXNoKG5ldyBMYXllckN1cnNvcihjdXIsIHNraXAsIG1pblBvaW50LCBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYXAubGVuZ3RoID09IDEgPyBoZWFwWzBdIDogbmV3IEhlYXBDdXJzb3IoaGVhcCk7XG4gICAgfVxuICAgIGdldCBzdGFydFNpZGUoKSB7IHJldHVybiB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5zdGFydFNpZGUgOiAwOyB9XG4gICAgZ290byhwb3MsIHNpZGUgPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLykge1xuICAgICAgICBmb3IgKGxldCBjdXIgb2YgdGhpcy5oZWFwKVxuICAgICAgICAgICAgY3VyLmdvdG8ocG9zLCBzaWRlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaGVhcC5sZW5ndGggPj4gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBoZWFwQnViYmxlKHRoaXMuaGVhcCwgaSk7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZm9yd2FyZChwb3MsIHNpZGUpIHtcbiAgICAgICAgZm9yIChsZXQgY3VyIG9mIHRoaXMuaGVhcClcbiAgICAgICAgICAgIGN1ci5mb3J3YXJkKHBvcywgc2lkZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmhlYXAubGVuZ3RoID4+IDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICAgICAgaGVhcEJ1YmJsZSh0aGlzLmhlYXAsIGkpO1xuICAgICAgICBpZiAoKHRoaXMudG8gLSBwb3MgfHwgdGhpcy52YWx1ZS5lbmRTaWRlIC0gc2lkZSkgPCAwKVxuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmhlYXAubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZnJvbSA9IHRoaXMudG8gPSAxMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnJhbmsgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0b3AgPSB0aGlzLmhlYXBbMF07XG4gICAgICAgICAgICB0aGlzLmZyb20gPSB0b3AuZnJvbTtcbiAgICAgICAgICAgIHRoaXMudG8gPSB0b3AudG87XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdG9wLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5yYW5rID0gdG9wLnJhbms7XG4gICAgICAgICAgICBpZiAodG9wLnZhbHVlKVxuICAgICAgICAgICAgICAgIHRvcC5uZXh0KCk7XG4gICAgICAgICAgICBoZWFwQnViYmxlKHRoaXMuaGVhcCwgMCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBoZWFwQnViYmxlKGhlYXAsIGluZGV4KSB7XG4gICAgZm9yIChsZXQgY3VyID0gaGVhcFtpbmRleF07Oykge1xuICAgICAgICBsZXQgY2hpbGRJbmRleCA9IChpbmRleCA8PCAxKSArIDE7XG4gICAgICAgIGlmIChjaGlsZEluZGV4ID49IGhlYXAubGVuZ3RoKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGxldCBjaGlsZCA9IGhlYXBbY2hpbGRJbmRleF07XG4gICAgICAgIGlmIChjaGlsZEluZGV4ICsgMSA8IGhlYXAubGVuZ3RoICYmIGNoaWxkLmNvbXBhcmUoaGVhcFtjaGlsZEluZGV4ICsgMV0pID49IDApIHtcbiAgICAgICAgICAgIGNoaWxkID0gaGVhcFtjaGlsZEluZGV4ICsgMV07XG4gICAgICAgICAgICBjaGlsZEluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1ci5jb21wYXJlKGNoaWxkKSA8IDApXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaGVhcFtjaGlsZEluZGV4XSA9IGN1cjtcbiAgICAgICAgaGVhcFtpbmRleF0gPSBjaGlsZDtcbiAgICAgICAgaW5kZXggPSBjaGlsZEluZGV4O1xuICAgIH1cbn1cbmNsYXNzIFNwYW5DdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKHNldHMsIHNraXAsIG1pblBvaW50KSB7XG4gICAgICAgIHRoaXMubWluUG9pbnQgPSBtaW5Qb2ludDtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVUbyA9IFtdO1xuICAgICAgICB0aGlzLmFjdGl2ZVJhbmsgPSBbXTtcbiAgICAgICAgdGhpcy5taW5BY3RpdmUgPSAtMTtcbiAgICAgICAgLy8gQSBjdXJyZW50bHkgYWN0aXZlIHBvaW50IHJhbmdlLCBpZiBhbnlcbiAgICAgICAgdGhpcy5wb2ludCA9IG51bGw7XG4gICAgICAgIHRoaXMucG9pbnRGcm9tID0gMDtcbiAgICAgICAgdGhpcy5wb2ludFJhbmsgPSAwO1xuICAgICAgICB0aGlzLnRvID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgIHRoaXMuZW5kU2lkZSA9IDA7XG4gICAgICAgIC8vIFRoZSBhbW91bnQgb2Ygb3BlbiBhY3RpdmUgcmFuZ2VzIGF0IHRoZSBzdGFydCBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgIC8vIE5vdCBpbmNsdWRpbmcgcG9pbnRzLlxuICAgICAgICB0aGlzLm9wZW5TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLmN1cnNvciA9IEhlYXBDdXJzb3IuZnJvbShzZXRzLCBza2lwLCBtaW5Qb2ludCk7XG4gICAgfVxuICAgIGdvdG8ocG9zLCBzaWRlID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi8pIHtcbiAgICAgICAgdGhpcy5jdXJzb3IuZ290byhwb3MsIHNpZGUpO1xuICAgICAgICB0aGlzLmFjdGl2ZS5sZW5ndGggPSB0aGlzLmFjdGl2ZVRvLmxlbmd0aCA9IHRoaXMuYWN0aXZlUmFuay5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLm1pbkFjdGl2ZSA9IC0xO1xuICAgICAgICB0aGlzLnRvID0gcG9zO1xuICAgICAgICB0aGlzLmVuZFNpZGUgPSBzaWRlO1xuICAgICAgICB0aGlzLm9wZW5TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGZvcndhcmQocG9zLCBzaWRlKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLm1pbkFjdGl2ZSA+IC0xICYmICh0aGlzLmFjdGl2ZVRvW3RoaXMubWluQWN0aXZlXSAtIHBvcyB8fCB0aGlzLmFjdGl2ZVt0aGlzLm1pbkFjdGl2ZV0uZW5kU2lkZSAtIHNpZGUpIDwgMClcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQWN0aXZlKHRoaXMubWluQWN0aXZlKTtcbiAgICAgICAgdGhpcy5jdXJzb3IuZm9yd2FyZChwb3MsIHNpZGUpO1xuICAgIH1cbiAgICByZW1vdmVBY3RpdmUoaW5kZXgpIHtcbiAgICAgICAgcmVtb3ZlKHRoaXMuYWN0aXZlLCBpbmRleCk7XG4gICAgICAgIHJlbW92ZSh0aGlzLmFjdGl2ZVRvLCBpbmRleCk7XG4gICAgICAgIHJlbW92ZSh0aGlzLmFjdGl2ZVJhbmssIGluZGV4KTtcbiAgICAgICAgdGhpcy5taW5BY3RpdmUgPSBmaW5kTWluSW5kZXgodGhpcy5hY3RpdmUsIHRoaXMuYWN0aXZlVG8pO1xuICAgIH1cbiAgICBhZGRBY3RpdmUodHJhY2tPcGVuKSB7XG4gICAgICAgIGxldCBpID0gMCwgeyB2YWx1ZSwgdG8sIHJhbmsgfSA9IHRoaXMuY3Vyc29yO1xuICAgICAgICAvLyBPcmdhbml6ZSBhY3RpdmUgbWFya3MgYnkgcmFuayBmaXJzdCwgdGhlbiBieSBzaXplXG4gICAgICAgIHdoaWxlIChpIDwgdGhpcy5hY3RpdmVSYW5rLmxlbmd0aCAmJiAocmFuayAtIHRoaXMuYWN0aXZlUmFua1tpXSB8fCB0byAtIHRoaXMuYWN0aXZlVG9baV0pID4gMClcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgaW5zZXJ0KHRoaXMuYWN0aXZlLCBpLCB2YWx1ZSk7XG4gICAgICAgIGluc2VydCh0aGlzLmFjdGl2ZVRvLCBpLCB0byk7XG4gICAgICAgIGluc2VydCh0aGlzLmFjdGl2ZVJhbmssIGksIHJhbmspO1xuICAgICAgICBpZiAodHJhY2tPcGVuKVxuICAgICAgICAgICAgaW5zZXJ0KHRyYWNrT3BlbiwgaSwgdGhpcy5jdXJzb3IuZnJvbSk7XG4gICAgICAgIHRoaXMubWluQWN0aXZlID0gZmluZE1pbkluZGV4KHRoaXMuYWN0aXZlLCB0aGlzLmFjdGl2ZVRvKTtcbiAgICB9XG4gICAgLy8gQWZ0ZXIgY2FsbGluZyB0aGlzLCBpZiBgdGhpcy5wb2ludGAgIT0gbnVsbCwgdGhlIG5leHQgcmFuZ2UgaXMgYVxuICAgIC8vIHBvaW50LiBPdGhlcndpc2UsIGl0J3MgYSByZWd1bGFyIHJhbmdlLCBjb3ZlcmVkIGJ5IGB0aGlzLmFjdGl2ZWAuXG4gICAgbmV4dCgpIHtcbiAgICAgICAgbGV0IGZyb20gPSB0aGlzLnRvLCB3YXNQb2ludCA9IHRoaXMucG9pbnQ7XG4gICAgICAgIHRoaXMucG9pbnQgPSBudWxsO1xuICAgICAgICBsZXQgdHJhY2tPcGVuID0gdGhpcy5vcGVuU3RhcnQgPCAwID8gW10gOiBudWxsO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgYSA9IHRoaXMubWluQWN0aXZlO1xuICAgICAgICAgICAgaWYgKGEgPiAtMSAmJiAodGhpcy5hY3RpdmVUb1thXSAtIHRoaXMuY3Vyc29yLmZyb20gfHwgdGhpcy5hY3RpdmVbYV0uZW5kU2lkZSAtIHRoaXMuY3Vyc29yLnN0YXJ0U2lkZSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlVG9bYV0gPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG8gPSB0aGlzLmFjdGl2ZVRvW2FdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZFNpZGUgPSB0aGlzLmFjdGl2ZVthXS5lbmRTaWRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVBY3RpdmUoYSk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNrT3BlbilcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHRyYWNrT3BlbiwgYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5jdXJzb3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvID0gdGhpcy5lbmRTaWRlID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY3Vyc29yLmZyb20gPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50byA9IHRoaXMuY3Vyc29yLmZyb207XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRTaWRlID0gdGhpcy5jdXJzb3Iuc3RhcnRTaWRlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRWYWwgPSB0aGlzLmN1cnNvci52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIW5leHRWYWwucG9pbnQpIHsgLy8gT3BlbmluZyBhIHJhbmdlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQWN0aXZlKHRyYWNrT3Blbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAod2FzUG9pbnQgJiYgdGhpcy5jdXJzb3IudG8gPT0gdGhpcy50byAmJiB0aGlzLmN1cnNvci5mcm9tIDwgdGhpcy5jdXJzb3IudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGFueSBub24tZW1wdHkgcG9pbnRzIHRoYXQgZW5kIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIHRoZSBwcmV2IHBvaW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIE5ldyBwb2ludFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50ID0gbmV4dFZhbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludEZyb20gPSB0aGlzLmN1cnNvci5mcm9tO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50UmFuayA9IHRoaXMuY3Vyc29yLnJhbms7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG8gPSB0aGlzLmN1cnNvci50bztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRTaWRlID0gbmV4dFZhbC5lbmRTaWRlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9yd2FyZCh0aGlzLnRvLCB0aGlzLmVuZFNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNrT3Blbikge1xuICAgICAgICAgICAgdGhpcy5vcGVuU3RhcnQgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRyYWNrT3Blbi5sZW5ndGggLSAxOyBpID49IDAgJiYgdHJhY2tPcGVuW2ldIDwgZnJvbTsgaS0tKVxuICAgICAgICAgICAgICAgIHRoaXMub3BlblN0YXJ0Kys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWN0aXZlRm9yUG9pbnQodG8pIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmU7XG4gICAgICAgIGxldCBhY3RpdmUgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYWN0aXZlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVSYW5rW2ldIDwgdGhpcy5wb2ludFJhbmspXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVUb1tpXSA+IHRvIHx8IHRoaXMuYWN0aXZlVG9baV0gPT0gdG8gJiYgdGhpcy5hY3RpdmVbaV0uZW5kU2lkZSA+PSB0aGlzLnBvaW50LmVuZFNpZGUpXG4gICAgICAgICAgICAgICAgYWN0aXZlLnB1c2godGhpcy5hY3RpdmVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY3RpdmUucmV2ZXJzZSgpO1xuICAgIH1cbiAgICBvcGVuRW5kKHRvKSB7XG4gICAgICAgIGxldCBvcGVuID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYWN0aXZlVG8ubGVuZ3RoIC0gMTsgaSA+PSAwICYmIHRoaXMuYWN0aXZlVG9baV0gPiB0bzsgaS0tKVxuICAgICAgICAgICAgb3BlbisrO1xuICAgICAgICByZXR1cm4gb3BlbjtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21wYXJlKGEsIHN0YXJ0QSwgYiwgc3RhcnRCLCBsZW5ndGgsIGNvbXBhcmF0b3IpIHtcbiAgICBhLmdvdG8oc3RhcnRBKTtcbiAgICBiLmdvdG8oc3RhcnRCKTtcbiAgICBsZXQgZW5kQiA9IHN0YXJ0QiArIGxlbmd0aDtcbiAgICBsZXQgcG9zID0gc3RhcnRCLCBkUG9zID0gc3RhcnRCIC0gc3RhcnRBO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgbGV0IGRFbmQgPSAoYS50byArIGRQb3MpIC0gYi50bywgZGlmZiA9IGRFbmQgfHwgYS5lbmRTaWRlIC0gYi5lbmRTaWRlO1xuICAgICAgICBsZXQgZW5kID0gZGlmZiA8IDAgPyBhLnRvICsgZFBvcyA6IGIudG8sIGNsaXBFbmQgPSBNYXRoLm1pbihlbmQsIGVuZEIpO1xuICAgICAgICBpZiAoYS5wb2ludCB8fCBiLnBvaW50KSB7XG4gICAgICAgICAgICBpZiAoIShhLnBvaW50ICYmIGIucG9pbnQgJiYgKGEucG9pbnQgPT0gYi5wb2ludCB8fCBhLnBvaW50LmVxKGIucG9pbnQpKSAmJlxuICAgICAgICAgICAgICAgIHNhbWVWYWx1ZXMoYS5hY3RpdmVGb3JQb2ludChhLnRvKSwgYi5hY3RpdmVGb3JQb2ludChiLnRvKSkpKVxuICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IuY29tcGFyZVBvaW50KHBvcywgY2xpcEVuZCwgYS5wb2ludCwgYi5wb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY2xpcEVuZCA+IHBvcyAmJiAhc2FtZVZhbHVlcyhhLmFjdGl2ZSwgYi5hY3RpdmUpKVxuICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IuY29tcGFyZVJhbmdlKHBvcywgY2xpcEVuZCwgYS5hY3RpdmUsIGIuYWN0aXZlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kID4gZW5kQilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAoKGRFbmQgfHwgYS5vcGVuRW5kICE9IGIub3BlbkVuZCkgJiYgY29tcGFyYXRvci5ib3VuZENoYW5nZSlcbiAgICAgICAgICAgIGNvbXBhcmF0b3IuYm91bmRDaGFuZ2UoZW5kKTtcbiAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICBpZiAoZGlmZiA8PSAwKVxuICAgICAgICAgICAgYS5uZXh0KCk7XG4gICAgICAgIGlmIChkaWZmID49IDApXG4gICAgICAgICAgICBiLm5leHQoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzYW1lVmFsdWVzKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChhW2ldICE9IGJbaV0gJiYgIWFbaV0uZXEoYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZW1vdmUoYXJyYXksIGluZGV4KSB7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4LCBlID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA8IGU7IGkrKylcbiAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtpICsgMV07XG4gICAgYXJyYXkucG9wKCk7XG59XG5mdW5jdGlvbiBpbnNlcnQoYXJyYXksIGluZGV4LCB2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IGluZGV4OyBpLS0pXG4gICAgICAgIGFycmF5W2kgKyAxXSA9IGFycmF5W2ldO1xuICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gZmluZE1pbkluZGV4KHZhbHVlLCBhcnJheSkge1xuICAgIGxldCBmb3VuZCA9IC0xLCBmb3VuZFBvcyA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKChhcnJheVtpXSAtIGZvdW5kUG9zIHx8IHZhbHVlW2ldLmVuZFNpZGUgLSB2YWx1ZVtmb3VuZF0uZW5kU2lkZSkgPCAwKSB7XG4gICAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgICBmb3VuZFBvcyA9IGFycmF5W2ldO1xuICAgICAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuXG4vKipcbkNvdW50IHRoZSBjb2x1bW4gcG9zaXRpb24gYXQgdGhlIGdpdmVuIG9mZnNldCBpbnRvIHRoZSBzdHJpbmcsXG50YWtpbmcgZXh0ZW5kaW5nIGNoYXJhY3RlcnMgYW5kIHRhYiBzaXplIGludG8gYWNjb3VudC5cbiovXG5mdW5jdGlvbiBjb3VudENvbHVtbihzdHJpbmcsIHRhYlNpemUsIHRvID0gc3RyaW5nLmxlbmd0aCkge1xuICAgIGxldCBuID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvICYmIGkgPCBzdHJpbmcubGVuZ3RoOykge1xuICAgICAgICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoaSkgPT0gOSkge1xuICAgICAgICAgICAgbiArPSB0YWJTaXplIC0gKG4gJSB0YWJTaXplKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG4rKztcbiAgICAgICAgICAgIGkgPSBmaW5kQ2x1c3RlckJyZWFrKHN0cmluZywgaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG4vKipcbkZpbmQgdGhlIG9mZnNldCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBjb2x1bW4gcG9zaXRpb24gaW4gYVxuc3RyaW5nLCB0YWtpbmcgZXh0ZW5kaW5nIGNoYXJhY3RlcnMgYW5kIHRhYiBzaXplIGludG8gYWNjb3VudC4gQnlcbmRlZmF1bHQsIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIHJldHVybmVkIHdoZW4gaXQgaXMgdG9vIHNob3J0IHRvXG5yZWFjaCB0aGUgY29sdW1uLiBQYXNzIGBzdHJpY3RgIHRydWUgdG8gbWFrZSBpdCByZXR1cm4gLTEgaW4gdGhhdFxuc2l0dWF0aW9uLlxuKi9cbmZ1bmN0aW9uIGZpbmRDb2x1bW4oc3RyaW5nLCBjb2wsIHRhYlNpemUsIHN0cmljdCkge1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gMDs7KSB7XG4gICAgICAgIGlmIChuID49IGNvbClcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICBpZiAoaSA9PSBzdHJpbmcubGVuZ3RoKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIG4gKz0gc3RyaW5nLmNoYXJDb2RlQXQoaSkgPT0gOSA/IHRhYlNpemUgLSAobiAlIHRhYlNpemUpIDogMTtcbiAgICAgICAgaSA9IGZpbmRDbHVzdGVyQnJlYWsoc3RyaW5nLCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cmljdCA9PT0gdHJ1ZSA/IC0xIDogc3RyaW5nLmxlbmd0aDtcbn1cblxuZXhwb3J0IHsgQW5ub3RhdGlvbiwgQW5ub3RhdGlvblR5cGUsIENoYW5nZURlc2MsIENoYW5nZVNldCwgQ2hhckNhdGVnb3J5LCBDb21wYXJ0bWVudCwgRWRpdG9yU2VsZWN0aW9uLCBFZGl0b3JTdGF0ZSwgRmFjZXQsIExpbmUsIE1hcE1vZGUsIFByZWMsIFJhbmdlLCBSYW5nZVNldCwgUmFuZ2VTZXRCdWlsZGVyLCBSYW5nZVZhbHVlLCBTZWxlY3Rpb25SYW5nZSwgU3RhdGVFZmZlY3QsIFN0YXRlRWZmZWN0VHlwZSwgU3RhdGVGaWVsZCwgVGV4dCwgVHJhbnNhY3Rpb24sIGNvZGVQb2ludEF0LCBjb2RlUG9pbnRTaXplLCBjb21iaW5lQ29uZmlnLCBjb3VudENvbHVtbiwgZmluZENsdXN0ZXJCcmVhaywgZmluZENvbHVtbiwgZnJvbUNvZGVQb2ludCB9O1xuIiwgIi8qKlxuICogQ3JlYXRlZCBieSBBbGV4IEJvbCBvbiA0LzEvMjAxNy5cbiAqL1xuXG4vKipcbiAqIEludGVydmFsIGlzIGEgcGFpciBvZiBudW1iZXJzIG9yIGEgcGFpciBvZiBhbnkgY29tcGFyYWJsZSBvYmplY3RzIG9uIHdoaWNoIG1heSBiZSBkZWZpbmVkIHByZWRpY2F0ZXNcbiAqICplcXVhbCosICpsZXNzKiBhbmQgbWV0aG9kICptYXgocDEsIHAxKSogdGhhdCByZXR1cm5zIG1heGltdW0gaW4gYSBwYWlyLlxuICogV2hlbiBpbnRlcnZhbCBpcyBhbiBvYmplY3QgcmF0aGVyIHRoYW4gYSBwYWlyIG9mIG51bWJlcnMsIHRoaXMgb2JqZWN0IHNob3VsZCBoYXZlIHByb3BlcnRpZXMgKmxvdyosICpoaWdoKiwgKm1heCpcbiAqIGFuZCBpbXBsZW1lbnQgbWV0aG9kcyAqbGVzc190aGFuKCksIGVxdWFsX3RvKCksIGludGVyc2VjdCgpLCBub3RfaW50ZXJzZWN0KCksIGNsb25lKCksIG91dHB1dCgpKi5cbiAqIFR3byBzdGF0aWMgbWV0aG9kcyAqY29tcGFyYWJsZV9tYXgoKSwgY29tcGFyYWJsZV9sZXNzX3RoYW4oKSogZGVmaW5lIGhvdyB0byBjb21wYXJlIHZhbHVlcyBpbiBwYWlyLiA8YnIvPlxuICogVGhpcyBpbnRlcmZhY2UgaXMgZGVzY3JpYmVkIGluIHR5cGVzY3JpcHQgZGVmaW5pdGlvbiBmaWxlICppbmRleC5kLnRzKlxuICpcbiAqIEF4aXMgYWxpZ25lZCByZWN0YW5nbGUgaXMgYW4gZXhhbXBsZSBvZiBzdWNoIGludGVydmFsLlxuICogV2UgbWF5IGxvb2sgYXQgcmVjdGFuZ2xlIGFzIGFuIGludGVydmFsIGJldHdlZW4gaXRzIGxvdyBsZWZ0IGFuZCB0b3AgcmlnaHQgY29ybmVycy5cbiAqIFNlZSAqKkJveCoqIGNsYXNzIGluIFtmbGF0dGVuLWpzXShodHRwczovL2dpdGh1Yi5jb20vYWxleGJvbDk5L2ZsYXR0ZW4tanMpIGxpYnJhcnkgYXMgdGhlIGV4YW1wbGVcbiAqIG9mIEludGVydmFsIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvblxuICogQHR5cGUge0ludGVydmFsfVxuICovXG5jb25zdCBJbnRlcnZhbCA9IGNsYXNzIEludGVydmFsIHtcbiAgICAvKipcbiAgICAgKiBBY2NlcHQgdHdvIGNvbXBhcmFibGUgdmFsdWVzIGFuZCBjcmVhdGVzIG5ldyBpbnN0YW5jZSBvZiBpbnRlcnZhbFxuICAgICAqIFByZWRpY2F0ZSBJbnRlcnZhbC5jb21wYXJhYmxlX2xlc3MobG93LCBoaWdoKSBzdXBwb3NlZCB0byByZXR1cm4gdHJ1ZSBvbiB0aGVzZSB2YWx1ZXNcbiAgICAgKiBAcGFyYW0gbG93XG4gICAgICogQHBhcmFtIGhpZ2hcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihsb3csIGhpZ2gpIHtcbiAgICAgICAgdGhpcy5sb3cgPSBsb3c7XG4gICAgICAgIHRoaXMuaGlnaCA9IGhpZ2g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvbmUgaW50ZXJ2YWxcbiAgICAgKiBAcmV0dXJucyB7SW50ZXJ2YWx9XG4gICAgICovXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwodGhpcy5sb3csIHRoaXMuaGlnaCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvcGVyeSBtYXggcmV0dXJucyBjbG9uZSBvZiB0aGlzIGludGVydmFsXG4gICAgICogQHJldHVybnMge0ludGVydmFsfVxuICAgICAqL1xuICAgIGdldCBtYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCk7ICAgLy8gdGhpcy5oaWdoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZWRpY2F0ZSByZXR1cm5zIHRydWUgaXMgdGhpcyBpbnRlcnZhbCBsZXNzIHRoYW4gb3RoZXIgaW50ZXJ2YWxcbiAgICAgKiBAcGFyYW0gb3RoZXJfaW50ZXJ2YWxcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBsZXNzX3RoYW4ob3RoZXJfaW50ZXJ2YWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG93IDwgb3RoZXJfaW50ZXJ2YWwubG93IHx8XG4gICAgICAgICAgICB0aGlzLmxvdyA9PT0gb3RoZXJfaW50ZXJ2YWwubG93ICYmIHRoaXMuaGlnaCA8IG90aGVyX2ludGVydmFsLmhpZ2g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlZGljYXRlIHJldHVybnMgdHJ1ZSBpcyB0aGlzIGludGVydmFsIGVxdWFscyB0byBvdGhlciBpbnRlcnZhbFxuICAgICAqIEBwYXJhbSBvdGhlcl9pbnRlcnZhbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGVxdWFsX3RvKG90aGVyX2ludGVydmFsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvdyA9PT0gb3RoZXJfaW50ZXJ2YWwubG93ICYmIHRoaXMuaGlnaCA9PT0gb3RoZXJfaW50ZXJ2YWwuaGlnaDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVkaWNhdGUgcmV0dXJucyB0cnVlIGlmIHRoaXMgaW50ZXJ2YWwgaW50ZXJzZWN0cyBvdGhlciBpbnRlcnZhbFxuICAgICAqIEBwYXJhbSBvdGhlcl9pbnRlcnZhbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGludGVyc2VjdChvdGhlcl9pbnRlcnZhbCkge1xuICAgICAgICByZXR1cm4gIXRoaXMubm90X2ludGVyc2VjdChvdGhlcl9pbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlZGljYXRlIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGludGVydmFsIGRvZXMgbm90IGludGVyc2VjdCBvdGhlciBpbnRlcnZhbFxuICAgICAqIEBwYXJhbSBvdGhlcl9pbnRlcnZhbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIG5vdF9pbnRlcnNlY3Qob3RoZXJfaW50ZXJ2YWwpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmhpZ2ggPCBvdGhlcl9pbnRlcnZhbC5sb3cgfHwgb3RoZXJfaW50ZXJ2YWwuaGlnaCA8IHRoaXMubG93KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIG5ldyBpbnRlcnZhbCBtZXJnZWQgd2l0aCBvdGhlciBpbnRlcnZhbFxuICAgICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyX2ludGVydmFsIC0gT3RoZXIgaW50ZXJ2YWwgdG8gbWVyZ2Ugd2l0aFxuICAgICAqIEByZXR1cm5zIHtJbnRlcnZhbH1cbiAgICAgKi9cbiAgICBtZXJnZShvdGhlcl9pbnRlcnZhbCkge1xuICAgICAgICByZXR1cm4gbmV3IEludGVydmFsKFxuICAgICAgICAgICAgdGhpcy5sb3cgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgb3RoZXJfaW50ZXJ2YWwubG93IDogKHRoaXMubG93IDwgb3RoZXJfaW50ZXJ2YWwubG93ID8gdGhpcy5sb3cgOiBvdGhlcl9pbnRlcnZhbC5sb3cpLFxuICAgICAgICAgICAgdGhpcy5oaWdoID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgIG90aGVyX2ludGVydmFsLmhpZ2ggOiAodGhpcy5oaWdoID4gb3RoZXJfaW50ZXJ2YWwuaGlnaCA/IHRoaXMuaGlnaCA6IG90aGVyX2ludGVydmFsLmhpZ2gpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBob3cga2V5IHNob3VsZCByZXR1cm5cbiAgICAgKi9cbiAgICBvdXRwdXQoKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5sb3csIHRoaXMuaGlnaF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gcmV0dXJucyBtYXhpbXVtIGJldHdlZW4gdHdvIGNvbXBhcmFibGUgdmFsdWVzXG4gICAgICogQHBhcmFtIGludGVydmFsMVxuICAgICAqIEBwYXJhbSBpbnRlcnZhbDJcbiAgICAgKiBAcmV0dXJucyB7SW50ZXJ2YWx9XG4gICAgICovXG4gICAgc3RhdGljIGNvbXBhcmFibGVfbWF4KGludGVydmFsMSwgaW50ZXJ2YWwyKSB7XG4gICAgICAgIHJldHVybiBpbnRlcnZhbDEubWVyZ2UoaW50ZXJ2YWwyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVkaWNhdGUgcmV0dXJucyB0cnVlIGlmIGZpcnN0IHZhbHVlIGxlc3MgdGhhbiBzZWNvbmQgdmFsdWVcbiAgICAgKiBAcGFyYW0gdmFsMVxuICAgICAqIEBwYXJhbSB2YWwyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGNvbXBhcmFibGVfbGVzc190aGFuKHZhbDEsIHZhbDIgKSB7XG4gICAgICAgIHJldHVybiB2YWwxIDwgdmFsMjtcbiAgICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZWQgYnkgQWxleCBCb2wgb24gMy8yOC8yMDE3LlxuICovXG5cblxuLy8gbW9kdWxlLmV4cG9ydHMgPSB7XG4vLyAgICAgUkJfVFJFRV9DT0xPUl9SRUQ6IDAsXG4vLyAgICAgUkJfVFJFRV9DT0xPUl9CTEFDSzogMVxuLy8gfTtcblxuY29uc3QgUkJfVFJFRV9DT0xPUl9SRUQgPSAwO1xuY29uc3QgUkJfVFJFRV9DT0xPUl9CTEFDSyA9IDE7XG5cbi8qKlxuICogQ3JlYXRlZCBieSBBbGV4IEJvbCBvbiA0LzEvMjAxNy5cbiAqL1xuXG5cbmNsYXNzIE5vZGUge1xuICAgIGNvbnN0cnVjdG9yKGtleSA9IHVuZGVmaW5lZCwgdmFsdWUgPSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbGVmdCA9IG51bGwsIHJpZ2h0ID0gbnVsbCwgcGFyZW50ID0gbnVsbCwgY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLKSB7XG4gICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7ICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIGxlZnQgY2hpbGQgbm9kZVxuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7ICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSB0byByaWdodCBjaGlsZCBub2RlXG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OyAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBub2RlXG4gICAgICAgIHRoaXMuY29sb3IgPSBjb2xvcjtcblxuICAgICAgICB0aGlzLml0ZW0gPSB7a2V5OiBrZXksIHZhbHVlOiB2YWx1ZX07ICAgLy8ga2V5IGlzIHN1cHBvc2VkIHRvIGJlIGluc3RhbmNlIG9mIEludGVydmFsXG5cbiAgICAgICAgLyogSWYgbm90LCB0aGlzIHNob3VsZCBieSBhbiBhcnJheSBvZiB0d28gbnVtYmVycyAqL1xuICAgICAgICBpZiAoa2V5ICYmIGtleSBpbnN0YW5jZW9mIEFycmF5ICYmIGtleS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGtleVswXSkgJiYgIU51bWJlci5pc05hTihrZXlbMV0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtsb3csIGhpZ2hdID0ga2V5O1xuICAgICAgICAgICAgICAgIGlmIChsb3cgPiBoaWdoKSBbbG93LCBoaWdoXSA9IFtoaWdoLCBsb3ddO1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbS5rZXkgPSBuZXcgSW50ZXJ2YWwobG93LCBoaWdoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWF4ID0gdGhpcy5pdGVtLmtleSA/IHRoaXMuaXRlbS5rZXkubWF4IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlzTmlsKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaXRlbS5rZXkgPT09IHVuZGVmaW5lZCAmJiB0aGlzLml0ZW0udmFsdWUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdGhpcy5sZWZ0ID09PSBudWxsICYmIHRoaXMucmlnaHQgPT09IG51bGwgJiYgdGhpcy5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSyk7XG4gICAgfVxuXG4gICAgX3ZhbHVlX2xlc3NfdGhhbihvdGhlcl9ub2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW0udmFsdWUgJiYgb3RoZXJfbm9kZS5pdGVtLnZhbHVlICYmIHRoaXMuaXRlbS52YWx1ZS5sZXNzX3RoYW4gP1xuICAgICAgICAgICAgdGhpcy5pdGVtLnZhbHVlLmxlc3NfdGhhbihvdGhlcl9ub2RlLml0ZW0udmFsdWUpIDpcbiAgICAgICAgICAgIHRoaXMuaXRlbS52YWx1ZSA8IG90aGVyX25vZGUuaXRlbS52YWx1ZTtcbiAgICB9XG5cbiAgICBsZXNzX3RoYW4ob3RoZXJfbm9kZSkge1xuICAgICAgICAvLyBpZiB0cmVlIHN0b3JlcyBvbmx5IGtleXNcbiAgICAgICAgaWYgKHRoaXMuaXRlbS52YWx1ZSA9PT0gdGhpcy5pdGVtLmtleSAmJiBvdGhlcl9ub2RlLml0ZW0udmFsdWUgPT09IG90aGVyX25vZGUuaXRlbS5rZXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW0ua2V5Lmxlc3NfdGhhbihvdGhlcl9ub2RlLml0ZW0ua2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgICAgLy8gaWYgdHJlZSBzdG9yZXMga2V5cyBhbmQgdmFsdWVzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtLmtleS5sZXNzX3RoYW4ob3RoZXJfbm9kZS5pdGVtLmtleSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW0ua2V5LmVxdWFsX3RvKChvdGhlcl9ub2RlLml0ZW0ua2V5KSkgJiYgdGhpcy5fdmFsdWVfbGVzc190aGFuKG90aGVyX25vZGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdmFsdWVfZXF1YWwob3RoZXJfbm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtLnZhbHVlICYmIG90aGVyX25vZGUuaXRlbS52YWx1ZSAmJiB0aGlzLml0ZW0udmFsdWUuZXF1YWxfdG8gP1xuICAgICAgICAgICAgdGhpcy5pdGVtLnZhbHVlLmVxdWFsX3RvKG90aGVyX25vZGUuaXRlbS52YWx1ZSkgOlxuICAgICAgICAgICAgdGhpcy5pdGVtLnZhbHVlID09PSBvdGhlcl9ub2RlLml0ZW0udmFsdWU7XG4gICAgfVxuICAgIGVxdWFsX3RvKG90aGVyX25vZGUpIHtcbiAgICAgICAgLy8gaWYgdHJlZSBzdG9yZXMgb25seSBrZXlzXG4gICAgICAgIGlmICh0aGlzLml0ZW0udmFsdWUgPT09IHRoaXMuaXRlbS5rZXkgJiYgb3RoZXJfbm9kZS5pdGVtLnZhbHVlID09PSBvdGhlcl9ub2RlLml0ZW0ua2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtLmtleS5lcXVhbF90byhvdGhlcl9ub2RlLml0ZW0ua2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgICAgLy8gaWYgdHJlZSBzdG9yZXMga2V5cyBhbmQgdmFsdWVzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtLmtleS5lcXVhbF90byhvdGhlcl9ub2RlLml0ZW0ua2V5KSAmJiB0aGlzLl92YWx1ZV9lcXVhbChvdGhlcl9ub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGludGVyc2VjdChvdGhlcl9ub2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW0ua2V5LmludGVyc2VjdChvdGhlcl9ub2RlLml0ZW0ua2V5KTtcbiAgICB9XG5cbiAgICBjb3B5X2RhdGEob3RoZXJfbm9kZSkge1xuICAgICAgICB0aGlzLml0ZW0ua2V5ID0gb3RoZXJfbm9kZS5pdGVtLmtleTtcbiAgICAgICAgdGhpcy5pdGVtLnZhbHVlID0gb3RoZXJfbm9kZS5pdGVtLnZhbHVlO1xuICAgIH1cblxuICAgIHVwZGF0ZV9tYXgoKSB7XG4gICAgICAgIC8vIHVzZSBrZXkgKEludGVydmFsKSBtYXggcHJvcGVydHkgaW5zdGVhZCBvZiBrZXkuaGlnaFxuICAgICAgICB0aGlzLm1heCA9IHRoaXMuaXRlbS5rZXkgPyB0aGlzLml0ZW0ua2V5Lm1heCA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMucmlnaHQgJiYgdGhpcy5yaWdodC5tYXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBhcmFibGVfbWF4ID0gdGhpcy5pdGVtLmtleS5jb25zdHJ1Y3Rvci5jb21wYXJhYmxlX21heDsgIC8vIHN0YXRpYyBtZXRob2RcbiAgICAgICAgICAgIHRoaXMubWF4ID0gY29tcGFyYWJsZV9tYXgodGhpcy5tYXgsIHRoaXMucmlnaHQubWF4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sZWZ0ICYmIHRoaXMubGVmdC5tYXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBhcmFibGVfbWF4ID0gdGhpcy5pdGVtLmtleS5jb25zdHJ1Y3Rvci5jb21wYXJhYmxlX21heDsgIC8vIHN0YXRpYyBtZXRob2RcbiAgICAgICAgICAgIHRoaXMubWF4ID0gY29tcGFyYWJsZV9tYXgodGhpcy5tYXgsIHRoaXMubGVmdC5tYXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3RoZXJfbm9kZSBkb2VzIG5vdCBpbnRlcnNlY3QgYW55IG5vZGUgb2YgbGVmdCBzdWJ0cmVlLCBpZiB0aGlzLmxlZnQubWF4IDwgb3RoZXJfbm9kZS5pdGVtLmtleS5sb3dcbiAgICBub3RfaW50ZXJzZWN0X2xlZnRfc3VidHJlZShzZWFyY2hfbm9kZSkge1xuICAgICAgICBjb25zdCBjb21wYXJhYmxlX2xlc3NfdGhhbiA9IHRoaXMuaXRlbS5rZXkuY29uc3RydWN0b3IuY29tcGFyYWJsZV9sZXNzX3RoYW47ICAvLyBzdGF0aWMgbWV0aG9kXG4gICAgICAgIGxldCBoaWdoID0gdGhpcy5sZWZ0Lm1heC5oaWdoICE9PSB1bmRlZmluZWQgPyB0aGlzLmxlZnQubWF4LmhpZ2ggOiB0aGlzLmxlZnQubWF4O1xuICAgICAgICByZXR1cm4gY29tcGFyYWJsZV9sZXNzX3RoYW4oaGlnaCwgc2VhcmNoX25vZGUuaXRlbS5rZXkubG93KTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcl9ub2RlIGRvZXMgbm90IGludGVyc2VjdCByaWdodCBzdWJ0cmVlIGlmIG90aGVyX25vZGUuaXRlbS5rZXkuaGlnaCA8IHRoaXMucmlnaHQua2V5Lmxvd1xuICAgIG5vdF9pbnRlcnNlY3RfcmlnaHRfc3VidHJlZShzZWFyY2hfbm9kZSkge1xuICAgICAgICBjb25zdCBjb21wYXJhYmxlX2xlc3NfdGhhbiA9IHRoaXMuaXRlbS5rZXkuY29uc3RydWN0b3IuY29tcGFyYWJsZV9sZXNzX3RoYW47ICAvLyBzdGF0aWMgbWV0aG9kXG4gICAgICAgIGxldCBsb3cgPSB0aGlzLnJpZ2h0Lm1heC5sb3cgIT09IHVuZGVmaW5lZCA/IHRoaXMucmlnaHQubWF4LmxvdyA6IHRoaXMucmlnaHQuaXRlbS5rZXkubG93O1xuICAgICAgICByZXR1cm4gY29tcGFyYWJsZV9sZXNzX3RoYW4oc2VhcmNoX25vZGUuaXRlbS5rZXkuaGlnaCwgbG93KTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlZCBieSBBbGV4IEJvbCBvbiAzLzMxLzIwMTcuXG4gKi9cblxuLy8gY29uc3QgbmlsX25vZGUgPSBuZXcgTm9kZSgpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGludGVydmFsIGJpbmFyeSBzZWFyY2ggdHJlZSA8YnIvPlxuICogSW50ZXJ2YWwgdHJlZSBzdG9yZXMgaXRlbXMgd2hpY2ggYXJlIGNvdXBsZXMgb2Yge2tleTppbnRlcnZhbCwgdmFsdWU6IHZhbHVlfSA8YnIvPlxuICogSW50ZXJ2YWwgaXMgYW4gb2JqZWN0IHdpdGggaGlnaCBhbmQgbG93IHByb3BlcnRpZXMgb3Igc2ltcGx5IHBhaXIgW2xvdyxoaWdoXSBvZiBudW1lcmljIHZhbHVlcyA8YnIgLz5cbiAqIEB0eXBlIHtJbnRlcnZhbFRyZWV9XG4gKi9cbmNsYXNzIEludGVydmFsVHJlZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IG5ldyBlbXB0eSBpbnN0YW5jZSBvZiBJbnRlcnZhbFRyZWVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5yb290ID0gbnVsbDtcbiAgICAgICAgdGhpcy5uaWxfbm9kZSA9IG5ldyBOb2RlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBudW1iZXIgb2YgaXRlbXMgc3RvcmVkIGluIHRoZSBpbnRlcnZhbCB0cmVlXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgdGhpcy50cmVlX3dhbGsodGhpcy5yb290LCAoKSA9PiBjb3VudCsrKTtcbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYXJyYXkgb2Ygc29ydGVkIGtleXMgaW4gdGhlIGFzY2VuZGluZyBvcmRlclxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBnZXQga2V5cygpIHtcbiAgICAgICAgbGV0IHJlcyA9IFtdO1xuICAgICAgICB0aGlzLnRyZWVfd2Fsayh0aGlzLnJvb3QsIChub2RlKSA9PiByZXMucHVzaChcbiAgICAgICAgICAgIG5vZGUuaXRlbS5rZXkub3V0cHV0ID8gbm9kZS5pdGVtLmtleS5vdXRwdXQoKSA6IG5vZGUuaXRlbS5rZXlcbiAgICAgICAgKSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFycmF5IG9mIHZhbHVlcyBpbiB0aGUgYXNjZW5kaW5nIGtleXMgb3JkZXJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgZ2V0IHZhbHVlcygpIHtcbiAgICAgICAgbGV0IHJlcyA9IFtdO1xuICAgICAgICB0aGlzLnRyZWVfd2Fsayh0aGlzLnJvb3QsIChub2RlKSA9PiByZXMucHVzaChub2RlLml0ZW0udmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFycmF5IG9mIGl0ZW1zICg8a2V5LHZhbHVlPiBwYWlycykgaW4gdGhlIGFzY2VuZGVkIGtleXMgb3JkZXJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgZ2V0IGl0ZW1zKCkge1xuICAgICAgICBsZXQgcmVzID0gW107XG4gICAgICAgIHRoaXMudHJlZV93YWxrKHRoaXMucm9vdCwgKG5vZGUpID0+IHJlcy5wdXNoKHtcbiAgICAgICAgICAgIGtleTogbm9kZS5pdGVtLmtleS5vdXRwdXQgPyBub2RlLml0ZW0ua2V5Lm91dHB1dCgpIDogbm9kZS5pdGVtLmtleSxcbiAgICAgICAgICAgIHZhbHVlOiBub2RlLml0ZW0udmFsdWVcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0cmVlIGlzIGVtcHR5XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnJvb3QgPT0gbnVsbCB8fCB0aGlzLnJvb3QgPT09IHRoaXMubmlsX25vZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRyZWVcbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5yb290ID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgbmV3IGl0ZW0gaW50byBpbnRlcnZhbCB0cmVlXG4gICAgICogQHBhcmFtIHtJbnRlcnZhbH0ga2V5IC0gaW50ZXJ2YWwgb2JqZWN0IG9yIGFycmF5IG9mIHR3byBudW1iZXJzIFtsb3csIGhpZ2hdXG4gICAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gdmFsdWUgcmVwcmVzZW50aW5nIGFueSBvYmplY3QgKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm5zIHtOb2RlfSByZXR1cm5zIHJlZmVyZW5jZSB0byBpbnNlcnRlZCBub2RlIGFzIGFuIG9iamVjdCB7a2V5OmludGVydmFsLCB2YWx1ZTogdmFsdWV9XG4gICAgICovXG4gICAgaW5zZXJ0KGtleSwgdmFsdWUgPSBrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBpbnNlcnRfbm9kZSA9IG5ldyBOb2RlKGtleSwgdmFsdWUsIHRoaXMubmlsX25vZGUsIHRoaXMubmlsX25vZGUsIG51bGwsIFJCX1RSRUVfQ09MT1JfUkVEKTtcbiAgICAgICAgdGhpcy50cmVlX2luc2VydChpbnNlcnRfbm9kZSk7XG4gICAgICAgIHRoaXMucmVjYWxjX21heChpbnNlcnRfbm9kZSk7XG4gICAgICAgIHJldHVybiBpbnNlcnRfbm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgaXRlbSB7a2V5LHZhbHVlfSBleGlzdCBpbiB0aGUgdHJlZVxuICAgICAqIEBwYXJhbSB7SW50ZXJ2YWx9IGtleSAtIGludGVydmFsIGNvcnJlc3BvbmRlbnQgdG8ga2V5cyBzdG9yZWQgaW4gdGhlIHRyZWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSB2YWx1ZSBvYmplY3QgdG8gYmUgY2hlY2tlZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGl0ZW0ge2tleSwgdmFsdWV9IGV4aXN0IGluIHRoZSB0cmVlLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBleGlzdChrZXksIHZhbHVlID0ga2V5KSB7XG4gICAgICAgIGxldCBzZWFyY2hfbm9kZSA9IG5ldyBOb2RlKGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gISF0aGlzLnRyZWVfc2VhcmNoKHRoaXMucm9vdCwgc2VhcmNoX25vZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBlbnRyeSB7a2V5LCB2YWx1ZX0gZnJvbSB0aGUgdHJlZVxuICAgICAqIEBwYXJhbSB7SW50ZXJ2YWx9IGtleSAtIGludGVydmFsIGNvcnJlc3BvbmRlbnQgdG8ga2V5cyBzdG9yZWQgaW4gdGhlIHRyZWVcbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSB2YWx1ZSBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBpdGVtIHtrZXksIHZhbHVlfSBkZWxldGVkLCBmYWxzZSBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICByZW1vdmUoa2V5LCB2YWx1ZSA9IGtleSkge1xuICAgICAgICBsZXQgc2VhcmNoX25vZGUgPSBuZXcgTm9kZShrZXksIHZhbHVlKTtcbiAgICAgICAgbGV0IGRlbGV0ZV9ub2RlID0gdGhpcy50cmVlX3NlYXJjaCh0aGlzLnJvb3QsIHNlYXJjaF9ub2RlKTtcbiAgICAgICAgaWYgKGRlbGV0ZV9ub2RlKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVfZGVsZXRlKGRlbGV0ZV9ub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsZXRlX25vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhcnJheSBvZiBlbnRyeSB2YWx1ZXMgd2hpY2gga2V5cyBpbnRlcnNlY3Qgd2l0aCBnaXZlbiBpbnRlcnZhbCA8YnIvPlxuICAgICAqIElmIG5vIHZhbHVlcyBzdG9yZWQgaW4gdGhlIHRyZWUsIHJldHVybnMgYXJyYXkgb2Yga2V5cyB3aGljaCBpbnRlcnNlY3QgZ2l2ZW4gaW50ZXJ2YWxcbiAgICAgKiBAcGFyYW0ge0ludGVydmFsfSBpbnRlcnZhbCAtIHNlYXJjaCBpbnRlcnZhbCwgb3IgdHVwbGUgW2xvdywgaGlnaF1cbiAgICAgKiBAcGFyYW0gb3V0cHV0TWFwcGVyRm4odmFsdWUsa2V5KSAtIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgbWFwcyAodmFsdWUsIGtleSkgdG8gY3VzdG9tIG91dHB1dFxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBzZWFyY2goaW50ZXJ2YWwsIG91dHB1dE1hcHBlckZuID0gKHZhbHVlLCBrZXkpID0+IHZhbHVlID09PSBrZXkgPyBrZXkub3V0cHV0KCkgOiB2YWx1ZSkge1xuICAgICAgICBsZXQgc2VhcmNoX25vZGUgPSBuZXcgTm9kZShpbnRlcnZhbCk7XG4gICAgICAgIGxldCByZXNwX25vZGVzID0gW107XG4gICAgICAgIHRoaXMudHJlZV9zZWFyY2hfaW50ZXJ2YWwodGhpcy5yb290LCBzZWFyY2hfbm9kZSwgcmVzcF9ub2Rlcyk7XG4gICAgICAgIHJldHVybiByZXNwX25vZGVzLm1hcChub2RlID0+IG91dHB1dE1hcHBlckZuKG5vZGUuaXRlbS52YWx1ZSwgbm9kZS5pdGVtLmtleSkpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGludGVyc2VjdGlvbiBiZXR3ZWVuIGdpdmVuIGFuZCBhbnkgaW50ZXJ2YWwgc3RvcmVkIGluIHRoZSB0cmVlIGZvdW5kXG4gICAgICogQHBhcmFtIHtJbnRlcnZhbH0gaW50ZXJ2YWwgLSBzZWFyY2ggaW50ZXJ2YWwgb3IgdHVwbGUgW2xvdywgaGlnaF1cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpbnRlcnNlY3RfYW55KGludGVydmFsKSB7XG4gICAgICAgIGxldCBzZWFyY2hfbm9kZSA9IG5ldyBOb2RlKGludGVydmFsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZV9maW5kX2FueV9pbnRlcnZhbCh0aGlzLnJvb3QsIHNlYXJjaF9ub2RlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmVlIHZpc2l0b3IuIEZvciBlYWNoIG5vZGUgaW1wbGVtZW50IGEgY2FsbGJhY2sgZnVuY3Rpb24uIDxici8+XG4gICAgICogTWV0aG9kIGNhbGxzIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCB0d28gcGFyYW1ldGVycyAoa2V5LCB2YWx1ZSlcbiAgICAgKiBAcGFyYW0gdmlzaXRvcihrZXksdmFsdWUpIC0gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGZvciBlYWNoIHRyZWUgaXRlbVxuICAgICAqL1xuICAgIGZvckVhY2godmlzaXRvcikge1xuICAgICAgICB0aGlzLnRyZWVfd2Fsayh0aGlzLnJvb3QsIChub2RlKSA9PiB2aXNpdG9yKG5vZGUuaXRlbS5rZXksIG5vZGUuaXRlbS52YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbHVlIE1hcHBlci4gV2FsayB0aHJvdWdoIGV2ZXJ5IG5vZGUgYW5kIG1hcCBub2RlIHZhbHVlIHRvIGFub3RoZXIgdmFsdWVcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sodmFsdWUsa2V5KSAtIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCB0cmVlIGl0ZW1cbiAgICAgKi9cbiAgICBtYXAoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgdHJlZSA9IG5ldyBJbnRlcnZhbFRyZWUoKTtcbiAgICAgICAgdGhpcy50cmVlX3dhbGsodGhpcy5yb290LCAobm9kZSkgPT4gdHJlZS5pbnNlcnQobm9kZS5pdGVtLmtleSwgY2FsbGJhY2sobm9kZS5pdGVtLnZhbHVlLCBub2RlLml0ZW0ua2V5KSkpO1xuICAgICAgICByZXR1cm4gdHJlZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0ludGVydmFsfSBpbnRlcnZhbCAtIG9wdGlvbmFsIGlmIHRoZSBpdGVyYXRvciBpcyBpbnRlbmRlZCB0byBzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmdcbiAgICAgKiBAcGFyYW0gb3V0cHV0TWFwcGVyRm4odmFsdWUsa2V5KSAtIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgbWFwcyAodmFsdWUsIGtleSkgdG8gY3VzdG9tIG91dHB1dFxuICAgICAqIEByZXR1cm5zIHtJdGVyYXRvcn1cbiAgICAgKi9cbiAgICAqaXRlcmF0ZShpbnRlcnZhbCwgb3V0cHV0TWFwcGVyRm4gPSAodmFsdWUsIGtleSkgPT4gdmFsdWUgPT09IGtleSA/IGtleS5vdXRwdXQoKSA6IHZhbHVlKSB7XG4gICAgICAgIGxldCBub2RlO1xuICAgICAgICBpZiAoaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIG5vZGUgPSB0aGlzLnRyZWVfc2VhcmNoX25lYXJlc3RfZm9yd2FyZCh0aGlzLnJvb3QsIG5ldyBOb2RlKGludGVydmFsKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICBub2RlID0gdGhpcy5sb2NhbF9taW5pbXVtKHRoaXMucm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgIHlpZWxkIG91dHB1dE1hcHBlckZuKG5vZGUuaXRlbS52YWx1ZSwgbm9kZS5pdGVtLmtleSk7XG4gICAgICAgICAgICBub2RlID0gdGhpcy50cmVlX3N1Y2Nlc3Nvcihub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlY2FsY19tYXgobm9kZSkge1xuICAgICAgICBsZXQgbm9kZV9jdXJyZW50ID0gbm9kZTtcbiAgICAgICAgd2hpbGUgKG5vZGVfY3VycmVudC5wYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZV9jdXJyZW50LnBhcmVudC51cGRhdGVfbWF4KCk7XG4gICAgICAgICAgICBub2RlX2N1cnJlbnQgPSBub2RlX2N1cnJlbnQucGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJlZV9pbnNlcnQoaW5zZXJ0X25vZGUpIHtcbiAgICAgICAgbGV0IGN1cnJlbnRfbm9kZSA9IHRoaXMucm9vdDtcbiAgICAgICAgbGV0IHBhcmVudF9ub2RlID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5yb290ID09IG51bGwgfHwgdGhpcy5yb290ID09PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBpbnNlcnRfbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50X25vZGUgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0X25vZGUubGVzc190aGFuKGN1cnJlbnRfbm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gY3VycmVudF9ub2RlLmxlZnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBjdXJyZW50X25vZGUucmlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnNlcnRfbm9kZS5wYXJlbnQgPSBwYXJlbnRfbm9kZTtcblxuICAgICAgICAgICAgaWYgKGluc2VydF9ub2RlLmxlc3NfdGhhbihwYXJlbnRfbm9kZSkpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRfbm9kZS5sZWZ0ID0gaW5zZXJ0X25vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRfbm9kZS5yaWdodCA9IGluc2VydF9ub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnNlcnRfZml4dXAoaW5zZXJ0X25vZGUpO1xuICAgIH1cblxuLy8gQWZ0ZXIgaW5zZXJ0aW9uIGluc2VydF9ub2RlIG1heSBoYXZlIHJlZC1jb2xvcmVkIHBhcmVudCwgYW5kIHRoaXMgaXMgYSBzaW5nbGUgcG9zc2libGUgdmlvbGF0aW9uXG4vLyBHbyB1cHdvcmRzIHRvIHRoZSByb290IGFuZCByZS1jb2xvciB1bnRpbCB2aW9sYXRpb24gd2lsbCBiZSByZXNvbHZlZFxuICAgIGluc2VydF9maXh1cChpbnNlcnRfbm9kZSkge1xuICAgICAgICBsZXQgY3VycmVudF9ub2RlO1xuICAgICAgICBsZXQgdW5jbGVfbm9kZTtcblxuICAgICAgICBjdXJyZW50X25vZGUgPSBpbnNlcnRfbm9kZTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRfbm9kZSAhPT0gdGhpcy5yb290ICYmIGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfUkVEKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudF9ub2RlLnBhcmVudCA9PT0gY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQubGVmdCkgeyAgIC8vIHBhcmVudCBpcyBsZWZ0IGNoaWxkIG9mIGdyYW5kZmF0aGVyXG4gICAgICAgICAgICAgICAgdW5jbGVfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQucGFyZW50LnJpZ2h0OyAgICAgICAgICAgICAgLy8gcmlnaHQgYnJvdGhlciBvZiBwYXJlbnRcbiAgICAgICAgICAgICAgICBpZiAodW5jbGVfbm9kZS5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9SRUQpIHsgICAgICAgICAgICAgLy8gQ2FzZSAxLiBVbmNsZSBpcyByZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gcmUtY29sb3IgZmF0aGVyIGFuZCB1bmNsZSBpbnRvIGJsYWNrXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgICAgICAgICAgICAgICAgICB1bmNsZV9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSztcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX1JFRDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXNlIDIgJiAzLiBVbmNsZSBpcyBibGFja1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudF9ub2RlID09PSBjdXJyZW50X25vZGUucGFyZW50LnJpZ2h0KSB7ICAgICAvLyBDYXNlIDIuIEN1cnJlbnQgaWYgcmlnaHQgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FzZSBpcyB0cmFuc2Zvcm1lZCBpbnRvIENhc2UgMy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9sZWZ0KGN1cnJlbnRfbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7ICAgIC8vIENhc2UgMy4gQ3VycmVudCBpcyBsZWZ0IGNoaWxkLlxuICAgICAgICAgICAgICAgICAgICAvLyBSZS1jb2xvciBmYXRoZXIgYW5kIGdyYW5kZmF0aGVyLCByb3RhdGUgZ3JhbmRmYXRoZXIgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX1JFRDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3RhdGVfcmlnaHQoY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmVudCBpcyByaWdodCBjaGlsZCBvZiBncmFuZGZhdGhlclxuICAgICAgICAgICAgICAgIHVuY2xlX25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudC5sZWZ0OyAgICAgICAgICAgICAgLy8gbGVmdCBicm90aGVyIG9mIHBhcmVudFxuICAgICAgICAgICAgICAgIGlmICh1bmNsZV9ub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX1JFRCkgeyAgICAgICAgICAgICAvLyBDYXNlIDQuIFVuY2xlIGlzIHJlZFxuICAgICAgICAgICAgICAgICAgICAvLyByZS1jb2xvciBmYXRoZXIgYW5kIHVuY2xlIGludG8gYmxhY2tcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgICAgICAgICAgICAgICAgIHVuY2xlX25vZGUuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X25vZGUgPT09IGN1cnJlbnRfbm9kZS5wYXJlbnQubGVmdCkgeyAgICAgICAgICAgICAvLyBDYXNlIDUuIEN1cnJlbnQgaXMgbGVmdCBjaGlsZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGludG8gY2FzZSA2XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3RhdGVfcmlnaHQoY3VycmVudF9ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSzsgICAgLy8gQ2FzZSA2LiBDdXJyZW50IGlzIHJpZ2h0IGNoaWxkLlxuICAgICAgICAgICAgICAgICAgICAvLyBSZS1jb2xvciBmYXRoZXIgYW5kIGdyYW5kZmF0aGVyLCByb3RhdGUgZ3JhbmRmYXRoZXIgbGVmdFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9sZWZ0KGN1cnJlbnRfbm9kZS5wYXJlbnQucGFyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJvb3QuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgIH1cblxuICAgIHRyZWVfZGVsZXRlKGRlbGV0ZV9ub2RlKSB7XG4gICAgICAgIGxldCBjdXRfbm9kZTsgICAvLyBub2RlIHRvIGJlIGN1dCAtIGVpdGhlciBkZWxldGVfbm9kZSBvciBzdWNjZXNzb3Jfbm9kZSAgKFwieVwiIGZyb20gMTQuNClcbiAgICAgICAgbGV0IGZpeF9ub2RlOyAgIC8vIG5vZGUgdG8gZml4IHJiIHRyZWUgcHJvcGVydHkgICAoXCJ4XCIgZnJvbSAxNC40KVxuXG4gICAgICAgIGlmIChkZWxldGVfbm9kZS5sZWZ0ID09PSB0aGlzLm5pbF9ub2RlIHx8IGRlbGV0ZV9ub2RlLnJpZ2h0ID09PSB0aGlzLm5pbF9ub2RlKSB7ICAvLyBkZWxldGVfbm9kZSBoYXMgbGVzcyB0aGVuIDIgY2hpbGRyZW5cbiAgICAgICAgICAgIGN1dF9ub2RlID0gZGVsZXRlX25vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZV9ub2RlIGhhcyAyIGNoaWxkcmVuXG4gICAgICAgICAgICBjdXRfbm9kZSA9IHRoaXMudHJlZV9zdWNjZXNzb3IoZGVsZXRlX25vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZml4X25vZGUgaWYgc2luZ2xlIGNoaWxkIG9mIGN1dF9ub2RlXG4gICAgICAgIGlmIChjdXRfbm9kZS5sZWZ0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICBmaXhfbm9kZSA9IGN1dF9ub2RlLmxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaXhfbm9kZSA9IGN1dF9ub2RlLnJpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGN1dF9ub2RlIGZyb20gcGFyZW50XG4gICAgICAgIC8qaWYgKGZpeF9ub2RlICE9IHRoaXMubmlsX25vZGUpIHsqL1xuICAgICAgICAgICAgZml4X25vZGUucGFyZW50ID0gY3V0X25vZGUucGFyZW50O1xuICAgICAgICAvKn0qL1xuXG4gICAgICAgIGlmIChjdXRfbm9kZSA9PT0gdGhpcy5yb290KSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBmaXhfbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXRfbm9kZSA9PT0gY3V0X25vZGUucGFyZW50LmxlZnQpIHtcbiAgICAgICAgICAgICAgICBjdXRfbm9kZS5wYXJlbnQubGVmdCA9IGZpeF9ub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY3V0X25vZGUucGFyZW50LnJpZ2h0ID0gZml4X25vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXRfbm9kZS5wYXJlbnQudXBkYXRlX21heCgpOyAgICAgICAgLy8gdXBkYXRlIG1heCBwcm9wZXJ0eSBvZiB0aGUgcGFyZW50XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlY2FsY19tYXgoZml4X25vZGUpOyAgICAgICAgICAgICAgLy8gdXBkYXRlIG1heCBwcm9wZXJ0eSB1cHdhcmQgZnJvbSBmaXhfbm9kZSB0byByb290XG5cbiAgICAgICAgLy8gQ09QWSBEQVRBICEhIVxuICAgICAgICAvLyBEZWxldGVfbm9kZSBiZWNvbWVzIGN1dF9ub2RlLCBpdCBtZWFucyB0aGF0IHdlIGNhbm5vdCBob2xkIHJlZmVyZW5jZVxuICAgICAgICAvLyB0byBub2RlIGluIG91dGVyIHN0cnVjdHVyZSBhbmQgd2Ugd2lsbCBoYXZlIHRvIGRlbGV0ZSBieSBrZXksIGFkZGl0aW9uYWwgc2VhcmNoIG5lZWRcbiAgICAgICAgaWYgKGN1dF9ub2RlICE9PSBkZWxldGVfbm9kZSkge1xuICAgICAgICAgICAgZGVsZXRlX25vZGUuY29weV9kYXRhKGN1dF9ub2RlKTtcbiAgICAgICAgICAgIGRlbGV0ZV9ub2RlLnVwZGF0ZV9tYXgoKTsgICAgICAgICAgIC8vIHVwZGF0ZSBtYXggcHJvcGVydHkgb2YgdGhlIGN1dCBub2RlIGF0IHRoZSBuZXcgcGxhY2VcbiAgICAgICAgICAgIHRoaXMucmVjYWxjX21heChkZWxldGVfbm9kZSk7ICAgICAgIC8vIHVwZGF0ZSBtYXggcHJvcGVydHkgdXB3YXJkIGZyb20gZGVsZXRlX25vZGUgdG8gcm9vdFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC8qZml4X25vZGUgIT0gdGhpcy5uaWxfbm9kZSAmJiAqL2N1dF9ub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZV9maXh1cChmaXhfbm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZWxldGVfZml4dXAoZml4X25vZGUpIHtcbiAgICAgICAgbGV0IGN1cnJlbnRfbm9kZSA9IGZpeF9ub2RlO1xuICAgICAgICBsZXQgYnJvdGhlcl9ub2RlO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50X25vZGUgIT09IHRoaXMucm9vdCAmJiBjdXJyZW50X25vZGUucGFyZW50ICE9IG51bGwgJiYgY3VycmVudF9ub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudF9ub2RlID09PSBjdXJyZW50X25vZGUucGFyZW50LmxlZnQpIHsgICAgICAgICAgLy8gZml4IG5vZGUgaXMgbGVmdCBjaGlsZFxuICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQucmlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKGJyb3RoZXJfbm9kZS5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9SRUQpIHsgICAvLyBDYXNlIDEuIEJyb3RoZXIgaXMgcmVkXG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7ICAgICAgICAgLy8gcmUtY29sb3IgYnJvdGhlclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7ICAgIC8vIHJlLWNvbG9yIGZhdGhlclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9sZWZ0KGN1cnJlbnRfbm9kZS5wYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LnJpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYnJvdGhlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBEZXJpdmUgdG8gY2FzZXMgMi4uNDogYnJvdGhlciBpcyBibGFja1xuICAgICAgICAgICAgICAgIGlmIChicm90aGVyX25vZGUubGVmdC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSyAmJlxuICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUucmlnaHQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHsgIC8vIGNhc2UgMjogYm90aCBuZXBoZXdzIGJsYWNrXG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEOyAgICAgICAgICAgICAgLy8gcmUtY29sb3IgYnJvdGhlclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50OyAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIGl0ZXJhdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJyb3RoZXJfbm9kZS5yaWdodC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSykgeyAgIC8vIGNhc2UgMzogbGVmdCBuZXBoZXcgcmVkLCByaWdodCBuZXBoZXcgYmxhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEOyAgICAgICAgICAvLyByZS1jb2xvciBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUubGVmdC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7ICAgLy8gcmUtY29sb3IgbmVwaGV3XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9yaWdodChicm90aGVyX25vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudC5yaWdodDsgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYnJvdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVyaXZlIHRvIGNhc2UgNDogbGVmdCBuZXBoZXcgYmxhY2ssIHJpZ2h0IG5lcGhldyByZWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDQ6IGxlZnQgbmVwaGV3IGJsYWNrLCByaWdodCBuZXBoZXcgcmVkXG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3I7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUucmlnaHQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9sZWZ0KGN1cnJlbnRfbm9kZS5wYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSB0aGlzLnJvb3Q7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXQgZnJvbSBsb29wXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4IG5vZGUgaXMgcmlnaHQgY2hpbGRcbiAgICAgICAgICAgICAgICBicm90aGVyX25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LmxlZnQ7XG4gICAgICAgICAgICAgICAgaWYgKGJyb3RoZXJfbm9kZS5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9SRUQpIHsgICAvLyBDYXNlIDEuIEJyb3RoZXIgaXMgcmVkXG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7ICAgICAgICAgLy8gcmUtY29sb3IgYnJvdGhlclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7ICAgIC8vIHJlLWNvbG9yIGZhdGhlclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9yaWdodChjdXJyZW50X25vZGUucGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudC5sZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBicm90aGVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEdvIHRvIGNhc2VzIDIuLjRcbiAgICAgICAgICAgICAgICBpZiAoYnJvdGhlcl9ub2RlLmxlZnQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0sgJiZcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLnJpZ2h0LmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLKSB7ICAgLy8gY2FzZSAyXG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEOyAgICAgICAgICAgICAvLyByZS1jb2xvciBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgaXRlcmF0aW9uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnJvdGhlcl9ub2RlLmxlZnQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHsgIC8vIGNhc2UgMzogcmlnaHQgbmVwaGV3IHJlZCwgbGVmdCBuZXBoZXcgYmxhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEOyAgICAgICAgICAgIC8vIHJlLWNvbG9yIGJyb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5yaWdodC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7ICAgIC8vIHJlLWNvbG9yIG5lcGhld1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3RhdGVfbGVmdChicm90aGVyX25vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudC5sZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXJpdmUgdG8gY2FzZSA0OiByaWdodCBuZXBoZXcgYmxhY2ssIGxlZnQgbmVwaGV3IHJlZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgNDogcmlnaHQgbmVwaGV3IGJsYWNrLCBsZWZ0IG5lcGhldyByZWRcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gY3VycmVudF9ub2RlLnBhcmVudC5jb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5sZWZ0LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3RhdGVfcmlnaHQoY3VycmVudF9ub2RlLnBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IHRoaXMucm9vdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgZXhpdCBmcm9tIGxvb3BcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50X25vZGUuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgIH1cblxuICAgIHRyZWVfc2VhcmNoKG5vZGUsIHNlYXJjaF9ub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwgfHwgbm9kZSA9PT0gdGhpcy5uaWxfbm9kZSlcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHNlYXJjaF9ub2RlLmVxdWFsX3RvKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VhcmNoX25vZGUubGVzc190aGFuKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmVlX3NlYXJjaChub2RlLmxlZnQsIHNlYXJjaF9ub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyZWVfc2VhcmNoKG5vZGUucmlnaHQsIHNlYXJjaF9ub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyZWVfc2VhcmNoX25lYXJlc3RfZm9yd2FyZChub2RlLCBzZWFyY2hfbm9kZSkge1xuICAgICAgICBsZXQgYmVzdDtcbiAgICAgICAgbGV0IGN1cnIgPSBub2RlO1xuICAgICAgICB3aGlsZSAoY3VyciAmJiBjdXJyICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICBpZiAoY3Vyci5sZXNzX3RoYW4oc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnIuaW50ZXJzZWN0KHNlYXJjaF9ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY3VycjtcbiAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnIubGVmdDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3Vyci5yaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghYmVzdCB8fCBjdXJyLmxlc3NfdGhhbihiZXN0KSkgYmVzdCA9IGN1cnI7XG4gICAgICAgICAgICAgICAgY3VyciA9IGN1cnIubGVmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmVzdCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8vIE9yaWdpbmFsIHNlYXJjaF9pbnRlcnZhbCBtZXRob2Q7IGNvbnRhaW5lciByZXMgc3VwcG9ydCBwdXNoKCkgaW5zZXJ0aW9uXG4gICAgLy8gU2VhcmNoIGFsbCBpbnRlcnZhbHMgaW50ZXJzZWN0aW5nIGdpdmVuIG9uZVxuICAgIHRyZWVfc2VhcmNoX2ludGVydmFsKG5vZGUsIHNlYXJjaF9ub2RlLCByZXMpIHtcbiAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICAvLyBpZiAobm9kZS0+bGVmdCAhPSB0aGlzLm5pbF9ub2RlICYmIG5vZGUtPmxlZnQtPm1heCA+PSBsb3cpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxlZnQgIT09IHRoaXMubmlsX25vZGUgJiYgIW5vZGUubm90X2ludGVyc2VjdF9sZWZ0X3N1YnRyZWUoc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlX3NlYXJjaF9pbnRlcnZhbChub2RlLmxlZnQsIHNlYXJjaF9ub2RlLCByZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgKGxvdyA8PSBub2RlLT5oaWdoICYmIG5vZGUtPmxvdyA8PSBoaWdoKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5pbnRlcnNlY3Qoc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAobm9kZS0+cmlnaHQgIT0gdGhpcy5uaWxfbm9kZSAmJiBub2RlLT5sb3cgPD0gaGlnaCkge1xuICAgICAgICAgICAgaWYgKG5vZGUucmlnaHQgIT09IHRoaXMubmlsX25vZGUgJiYgIW5vZGUubm90X2ludGVyc2VjdF9yaWdodF9zdWJ0cmVlKHNlYXJjaF9ub2RlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJlZV9zZWFyY2hfaW50ZXJ2YWwobm9kZS5yaWdodCwgc2VhcmNoX25vZGUsIHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmVlX2ZpbmRfYW55X2ludGVydmFsKG5vZGUsIHNlYXJjaF9ub2RlKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICBpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmxlZnQgIT09IHRoaXMubmlsX25vZGUgJiYgIW5vZGUubm90X2ludGVyc2VjdF9sZWZ0X3N1YnRyZWUoc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgZm91bmQgPSB0aGlzLnRyZWVfZmluZF9hbnlfaW50ZXJ2YWwobm9kZS5sZWZ0LCBzZWFyY2hfbm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgZm91bmQgPSBub2RlLmludGVyc2VjdChzZWFyY2hfbm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZvdW5kICYmIG5vZGUucmlnaHQgIT09IHRoaXMubmlsX25vZGUgJiYgIW5vZGUubm90X2ludGVyc2VjdF9yaWdodF9zdWJ0cmVlKHNlYXJjaF9ub2RlKSkge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gdGhpcy50cmVlX2ZpbmRfYW55X2ludGVydmFsKG5vZGUucmlnaHQsIHNlYXJjaF9ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuXG4gICAgbG9jYWxfbWluaW11bShub2RlKSB7XG4gICAgICAgIGxldCBub2RlX21pbiA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChub2RlX21pbi5sZWZ0ICE9IG51bGwgJiYgbm9kZV9taW4ubGVmdCAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgbm9kZV9taW4gPSBub2RlX21pbi5sZWZ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlX21pbjtcbiAgICB9XG5cbiAgICAvLyBub3QgaW4gdXNlXG4gICAgbG9jYWxfbWF4aW11bShub2RlKSB7XG4gICAgICAgIGxldCBub2RlX21heCA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChub2RlX21heC5yaWdodCAhPSBudWxsICYmIG5vZGVfbWF4LnJpZ2h0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICBub2RlX21heCA9IG5vZGVfbWF4LnJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlX21heDtcbiAgICB9XG5cbiAgICB0cmVlX3N1Y2Nlc3Nvcihub2RlKSB7XG4gICAgICAgIGxldCBub2RlX3N1Y2Nlc3NvcjtcbiAgICAgICAgbGV0IGN1cnJlbnRfbm9kZTtcbiAgICAgICAgbGV0IHBhcmVudF9ub2RlO1xuXG4gICAgICAgIGlmIChub2RlLnJpZ2h0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICBub2RlX3N1Y2Nlc3NvciA9IHRoaXMubG9jYWxfbWluaW11bShub2RlLnJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IG5vZGU7XG4gICAgICAgICAgICBwYXJlbnRfbm9kZSA9IG5vZGUucGFyZW50O1xuICAgICAgICAgICAgd2hpbGUgKHBhcmVudF9ub2RlICE9IG51bGwgJiYgcGFyZW50X25vZGUucmlnaHQgPT09IGN1cnJlbnRfbm9kZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IHBhcmVudF9ub2RlO1xuICAgICAgICAgICAgICAgIHBhcmVudF9ub2RlID0gcGFyZW50X25vZGUucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZV9zdWNjZXNzb3IgPSBwYXJlbnRfbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZV9zdWNjZXNzb3I7XG4gICAgfVxuXG4gICAgLy8gICAgICAgICAgIHwgICAgICAgICAgICByaWdodC1yb3RhdGUoVCx5KSAgICAgICB8XG4gICAgLy8gICAgICAgICAgIHkgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0uICAgICAgIHhcbiAgICAvLyAgICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFxcbiAgICAvLyAgICAgICAgIHggICBjICAgICAgICAgIGxlZnQtcm90YXRlKFQseCkgICAgICBhICAgeVxuICAgIC8vICAgICAgICAvIFxcICAgICAgICAgICAgIDwtLS0tLS0tLS0tLS0tLS0gICAgICAgICAvIFxcXG4gICAgLy8gICAgICAgYSAgIGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICAgY1xuXG4gICAgcm90YXRlX2xlZnQoeCkge1xuICAgICAgICBsZXQgeSA9IHgucmlnaHQ7XG5cbiAgICAgICAgeC5yaWdodCA9IHkubGVmdDsgICAgICAgICAgIC8vIGIgZ29lcyB0byB4LnJpZ2h0XG5cbiAgICAgICAgaWYgKHkubGVmdCAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgeS5sZWZ0LnBhcmVudCA9IHg7ICAgICAvLyB4IGJlY29tZXMgcGFyZW50IG9mIGJcbiAgICAgICAgfVxuICAgICAgICB5LnBhcmVudCA9IHgucGFyZW50OyAgICAgICAvLyBtb3ZlIHBhcmVudFxuXG4gICAgICAgIGlmICh4ID09PSB0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHk7ICAgICAgICAgICAvLyB5IGJlY29tZXMgcm9vdFxuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHkgYmVjb21lcyBjaGlsZCBvZiB4LnBhcmVudFxuICAgICAgICAgICAgaWYgKHggPT09IHgucGFyZW50LmxlZnQpIHtcbiAgICAgICAgICAgICAgICB4LnBhcmVudC5sZWZ0ID0geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHgucGFyZW50LnJpZ2h0ID0geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5LmxlZnQgPSB4OyAgICAgICAgICAgICAgICAgLy8geCBiZWNvbWVzIGxlZnQgY2hpbGQgb2YgeVxuICAgICAgICB4LnBhcmVudCA9IHk7ICAgICAgICAgICAgICAgLy8gYW5kIHkgYmVjb21lcyBwYXJlbnQgb2YgeFxuXG4gICAgICAgIGlmICh4ICE9IG51bGwgJiYgeCAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgeC51cGRhdGVfbWF4KCk7XG4gICAgICAgIH1cblxuICAgICAgICB5ID0geC5wYXJlbnQ7XG4gICAgICAgIGlmICh5ICE9IG51bGwgJiYgeSAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgeS51cGRhdGVfbWF4KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByb3RhdGVfcmlnaHQoeSkge1xuICAgICAgICBsZXQgeCA9IHkubGVmdDtcblxuICAgICAgICB5LmxlZnQgPSB4LnJpZ2h0OyAgICAgICAgICAgLy8gYiBnb2VzIHRvIHkubGVmdFxuXG4gICAgICAgIGlmICh4LnJpZ2h0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB4LnJpZ2h0LnBhcmVudCA9IHk7ICAgICAgICAvLyB5IGJlY29tZXMgcGFyZW50IG9mIGJcbiAgICAgICAgfVxuICAgICAgICB4LnBhcmVudCA9IHkucGFyZW50OyAgICAgICAgICAvLyBtb3ZlIHBhcmVudFxuXG4gICAgICAgIGlmICh5ID09PSB0aGlzLnJvb3QpIHsgICAgICAgIC8vIHggYmVjb21lcyByb290XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSB4O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHkgYmVjb21lcyBjaGlsZCBvZiB4LnBhcmVudFxuICAgICAgICAgICAgaWYgKHkgPT09IHkucGFyZW50LmxlZnQpIHtcbiAgICAgICAgICAgICAgICB5LnBhcmVudC5sZWZ0ID0geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHkucGFyZW50LnJpZ2h0ID0geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB4LnJpZ2h0ID0geTsgICAgICAgICAgICAgICAgIC8vIHkgYmVjb21lcyByaWdodCBjaGlsZCBvZiB4XG4gICAgICAgIHkucGFyZW50ID0geDsgICAgICAgICAgICAgICAvLyBhbmQgeCBiZWNvbWVzIHBhcmVudCBvZiB5XG5cbiAgICAgICAgaWYgKHkgIT09IG51bGwgJiYgeSAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgeS51cGRhdGVfbWF4KCk7XG4gICAgICAgIH1cblxuICAgICAgICB4ID0geS5wYXJlbnQ7XG4gICAgICAgIGlmICh4ICE9IG51bGwgJiYgeCAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgeC51cGRhdGVfbWF4KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmVlX3dhbGsobm9kZSwgYWN0aW9uKSB7XG4gICAgICAgIGlmIChub2RlICE9IG51bGwgJiYgbm9kZSAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgdGhpcy50cmVlX3dhbGsobm9kZS5sZWZ0LCBhY3Rpb24pO1xuICAgICAgICAgICAgLy8gYXJyLnB1c2gobm9kZS50b0FycmF5KCkpO1xuICAgICAgICAgICAgYWN0aW9uKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy50cmVlX3dhbGsobm9kZS5yaWdodCwgYWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qIFJldHVybiB0cnVlIGlmIGFsbCByZWQgbm9kZXMgaGF2ZSBleGFjdGx5IHR3byBibGFjayBjaGlsZCBub2RlcyAqL1xuICAgIHRlc3RSZWRCbGFja1Byb3BlcnR5KCkge1xuICAgICAgICBsZXQgcmVzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50cmVlX3dhbGsodGhpcy5yb290LCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfUkVEKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEobm9kZS5sZWZ0LmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLICYmIG5vZGUucmlnaHQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyogVGhyb3cgZXJyb3IgaWYgbm90IGV2ZXJ5IHBhdGggZnJvbSByb290IHRvIGJvdHRvbSBoYXMgc2FtZSBibGFjayBoZWlnaHQgKi9cbiAgICB0ZXN0QmxhY2tIZWlnaHRQcm9wZXJ0eShub2RlKSB7XG4gICAgICAgIGxldCBoZWlnaHQgPSAwO1xuICAgICAgICBsZXQgaGVpZ2h0TGVmdCA9IDA7XG4gICAgICAgIGxldCBoZWlnaHRSaWdodCA9IDA7XG4gICAgICAgIGlmIChub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLKSB7XG4gICAgICAgICAgICBoZWlnaHQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5sZWZ0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICBoZWlnaHRMZWZ0ID0gdGhpcy50ZXN0QmxhY2tIZWlnaHRQcm9wZXJ0eShub2RlLmxlZnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0TGVmdCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucmlnaHQgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIGhlaWdodFJpZ2h0ID0gdGhpcy50ZXN0QmxhY2tIZWlnaHRQcm9wZXJ0eShub2RlLnJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhlaWdodFJpZ2h0ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVpZ2h0TGVmdCAhPT0gaGVpZ2h0UmlnaHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVkLWJsYWNrIGhlaWdodCBwcm9wZXJ0eSB2aW9sYXRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGhlaWdodCArPSBoZWlnaHRMZWZ0O1xuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cbn1cblxuZXhwb3J0IHsgSW50ZXJ2YWwsIE5vZGUsIEludGVydmFsVHJlZSBhcyBkZWZhdWx0IH07XG4iLCAiaW1wb3J0IHsgVGV4dCB9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IEludGVydmFsVHJlZSBmcm9tIFwiQGZsYXR0ZW4tanMvaW50ZXJ2YWwtdHJlZVwiO1xuaW1wb3J0IHsgdHlwZSBDcml0aWNNYXJrdXBSYW5nZSB9IGZyb20gXCIuL2Jhc2VfcmFuZ2VcIjtcblxuZXhwb3J0IGNsYXNzIENyaXRpY01hcmt1cFJhbmdlcyB7XG5cdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXTtcblx0dHJlZTogSW50ZXJ2YWxUcmVlPENyaXRpY01hcmt1cFJhbmdlPjtcblxuXHRjb25zdHJ1Y3RvcihyYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlW10pIHtcblx0XHR0aGlzLnJhbmdlcyA9IHJhbmdlcztcblx0XHR0aGlzLnRyZWUgPSBuZXcgSW50ZXJ2YWxUcmVlKCk7XG5cdFx0Zm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpXG5cdFx0XHR0aGlzLnRyZWUuaW5zZXJ0KFtyYW5nZS5mcm9tLCByYW5nZS50b10sIHJhbmdlKTtcblx0fVxuXG5cdGVtcHR5KCkge1xuXHRcdHJldHVybiB0aGlzLnJhbmdlcy5sZW5ndGggPT09IDA7XG5cdH1cblxuXHRnZXQoaW5kZXg6IG51bWJlcikge1xuXHRcdGlmIChpbmRleCA8IDApXG5cdFx0XHRyZXR1cm4gdGhpcy5yYW5nZXNbdGhpcy5yYW5nZXMubGVuZ3RoICsgaW5kZXhdO1xuXHRcdHJldHVybiB0aGlzLnJhbmdlc1tpbmRleF07XG5cdH1cblxuXHQvLyBSaWdodCBicmVha3MgdGllcyBpZiBjdXJzb3IgYmV0d2VlbiB0d28gcmFuZ2VzLCBkZWZhdWx0cyB0byB0aGUgbGVmdCByYW5nZVxuXHRhdF9jdXJzb3IoY3Vyc29yOiBudW1iZXIsIHJpZ2h0ID0gZmFsc2UpOiBDcml0aWNNYXJrdXBSYW5nZSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgc2VhcmNoID0gdGhpcy50cmVlLnNlYXJjaChbY3Vyc29yLCBjdXJzb3JdKTtcblx0XHRyZXR1cm4gc2VhcmNoLmxlbmd0aCA/IChyaWdodCAmJiBzZWFyY2gubGVuZ3RoID4gMSkgPyBzZWFyY2hbMV0gOiBzZWFyY2hbMF0gOiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb250YWluc19yYW5nZShmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy50cmVlLmludGVyc2VjdF9hbnkoW2Zyb20sIHRvXSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSByYW5nZSB0aGF0IGlzIChub3QgZGlyZWN0bHkpIGFkamFjZW50IHRvIHRoZSBjdXJzb3IgaW4gZ2l2ZW4gZGlyZWN0aW9uXG5cdCAqIEBwYXJhbSBjdXJzb3IgLSBDdXJzb3IgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBsZWZ0IC0gV2hldGhlciB0byBsb29rIGxlZnQgb3IgcmlnaHQgb2YgdGhlIGN1cnNvclxuXHQgKiBAcGFyYW0gbG9vc2UgLSBXaGV0aGVyIHRvIGluY2x1ZGUgcmFuZ2VzIHRoYXQgYXJlIHBhcnRpYWxseSBhZGphY2VudCB0byB0aGUgY3Vyc29yXG5cdCAqIEBwYXJhbSBpbmNsdWRlX2VkZ2UgLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGVkZ2VzIG9mIHRoZSByYW5nZVxuXHQgKi9cblx0cmFuZ2VfYWRqYWNlbnRfdG9fY3Vyc29yKGN1cnNvcjogbnVtYmVyLCBsZWZ0OiBib29sZWFuLCBsb29zZSA9IGZhbHNlLCBpbmNsdWRlX2VkZ2UgPSBmYWxzZSkge1xuXHRcdGNvbnN0IHJhbmdlcyA9IGxlZnQgPyB0aGlzLnJhbmdlcy5zbGljZSgpLnJldmVyc2UoKSA6IHRoaXMucmFuZ2VzO1xuXHRcdGlmIChpbmNsdWRlX2VkZ2UpIHtcblx0XHRcdHJldHVybiByYW5nZXMuZmluZChyYW5nZSA9PlxuXHRcdFx0XHRsZWZ0ID8gKChsb29zZSA/IHJhbmdlLmZyb20gOiByYW5nZS50bykgPCBjdXJzb3IpIDogKGN1cnNvciA8IChsb29zZSA/IHJhbmdlLnRvIDogcmFuZ2UuZnJvbSkpXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gcmFuZ2VzLmZpbmQocmFuZ2UgPT5cblx0XHRcdFx0bGVmdCA/ICgobG9vc2UgPyByYW5nZS5mcm9tIDogcmFuZ2UudG8pIDw9IGN1cnNvcikgOiAoY3Vyc29yIDw9IChsb29zZSA/IHJhbmdlLnRvIDogcmFuZ2UuZnJvbSkpXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGFkamFjZW50X3JhbmdlKHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSwgbGVmdDogYm9vbGVhbiwgZGlyZWN0bHlfYWRqYWNlbnQgPSBmYWxzZSkge1xuXHRcdGNvbnN0IHJhbmdlX2lkeCA9IHRoaXMucmFuZ2VzLmZpbmRJbmRleChuID0+IG4gPT09IHJhbmdlKTtcblx0XHRpZiAocmFuZ2VfaWR4ID09PSAtMSlcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgYWRqYWNlbnQgPSBsZWZ0ID8gdGhpcy5yYW5nZXNbcmFuZ2VfaWR4IC0gMV0gOiB0aGlzLnJhbmdlc1tyYW5nZV9pZHggKyAxXTtcblx0XHRpZiAoIWFkamFjZW50KVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdGlmIChkaXJlY3RseV9hZGphY2VudCkge1xuXHRcdFx0aWYgKGxlZnQgPyBhZGphY2VudC50byA9PT0gcmFuZ2UuZnJvbSA6IHJhbmdlLnRvID09PSBhZGphY2VudC5mcm9tKVxuXHRcdFx0XHRyZXR1cm4gYWRqYWNlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBhZGphY2VudDtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHJhbmdlc19pbl9pbnRlcnZhbChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuXHRcdHJldHVybiB0aGlzLnRyZWUuc2VhcmNoKFtzdGFydCwgZW5kXSkgYXMgQ3JpdGljTWFya3VwUmFuZ2VbXTtcblx0fVxuXG5cdHJhbmdlc19pbl9pbnRlcnZhbHMoaW50ZXJ2YWxzOiB7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9W10pIHtcblx0XHRjb25zdCB1bmlxdWVfcmFuZ2VzID0gbmV3IFNldDxDcml0aWNNYXJrdXBSYW5nZT4oKTtcblx0XHRmb3IgKGNvbnN0IHJhbmdlIG9mIGludGVydmFscykge1xuXHRcdFx0Zm9yIChjb25zdCBmb3VuZF9yYW5nZSBvZiB0aGlzLnRyZWUuc2VhcmNoKFtyYW5nZS5mcm9tLCByYW5nZS50b10pIGFzIENyaXRpY01hcmt1cFJhbmdlW10pIHtcblx0XHRcdFx0dW5pcXVlX3Jhbmdlcy5hZGQoZm91bmRfcmFuZ2UpO1xuXHRcdFx0XHRpZiAoZm91bmRfcmFuZ2UuYmFzZV9yYW5nZSkge1xuXHRcdFx0XHRcdHVuaXF1ZV9yYW5nZXMuYWRkKGZvdW5kX3JhbmdlLmJhc2VfcmFuZ2UpO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcmVwbHkgb2YgZm91bmRfcmFuZ2UuYmFzZV9yYW5nZS5yZXBsaWVzKSB7XG5cdFx0XHRcdFx0XHR1bmlxdWVfcmFuZ2VzLmFkZChyZXBseSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZV9yYW5nZXMpLnNvcnQoKGEsIGIpID0+IGEuZnJvbSAtIGIuZnJvbSk7XG5cdH1cblxuXHQvLyByYW5nZXNfZnVsbHlfaW5fcmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcblx0Ly8gXHRjb25zdCByYW5nZXMgPSB0aGlzLnJhbmdlc19pbl9yYW5nZShzdGFydCwgZW5kKTtcblx0Ly8gXHRpZiAocmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXT8udG91Y2hlc19sZWZ0X2JyYWNrZXQoc3RhcnQsIGZhbHNlLCB0cnVlLCB0cnVlKSlcblx0Ly8gXHRcdHJhbmdlcy5wb3AoKTtcblx0Ly8gXHRpZiAocmFuZ2VzWzBdPy50b3VjaGVzX3JpZ2h0X2JyYWNrZXQoZW5kLCBmYWxzZSwgdHJ1ZSkpXG5cdC8vIFx0XHRyYW5nZXMuc2hpZnQoKTtcblx0Ly8gXHRyZXR1cm4gcmFuZ2VzO1xuXHQvLyB9XG5cblx0dW53cmFwX2luX3JhbmdlKFxuXHRcdGRvYzogVGV4dCxcblx0XHRmcm9tID0gMCxcblx0XHR0byA9IGRvYy5sZW5ndGgsXG5cdFx0cmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZVtdIHwgbnVsbCA9IG51bGwsXG5cdCk6IHsgb3V0cHV0OiBzdHJpbmc7IGZyb206IG51bWJlcjsgdG86IG51bWJlcjsgZnJvbnRfcmFuZ2U/OiBDcml0aWNNYXJrdXBSYW5nZTsgYmFja19yYW5nZT86IENyaXRpY01hcmt1cFJhbmdlIH0ge1xuXHRcdGxldCBmcm9udF9yYW5nZTogdW5kZWZpbmVkIHwgQ3JpdGljTWFya3VwUmFuZ2UsIGJhY2tfcmFuZ2U6IHVuZGVmaW5lZCB8IENyaXRpY01hcmt1cFJhbmdlO1xuXG5cdFx0aWYgKCFyYW5nZXMpXG5cdFx0XHRyYW5nZXMgPSB0aGlzLnJhbmdlc19pbl9pbnRlcnZhbChmcm9tLCB0byk7XG5cblx0XHRpZiAocmFuZ2VzLmxlbmd0aCA9PT0gMClcblx0XHRcdHJldHVybiB7IG91dHB1dDogZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvKSwgZnJvbSwgdG8gfTtcblxuXHRcdGxldCBvdXRwdXQgPSBcIlwiO1xuXHRcdGlmIChmcm9tIDwgcmFuZ2VzWzBdLmZyb20pXG5cdFx0XHRvdXRwdXQgKz0gZG9jLnNsaWNlU3RyaW5nKGZyb20sIHJhbmdlc1swXS5mcm9tKTtcblx0XHRlbHNlXG5cdFx0XHRmcm9udF9yYW5nZSA9IHJhbmdlc1swXTtcblxuXHRcdGxldCBwcmV2X3JhbmdlID0gLTE7XG5cdFx0Zm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHtcblx0XHRcdGlmIChwcmV2X3JhbmdlICE9PSAtMSlcblx0XHRcdFx0b3V0cHV0ICs9IGRvYy5zbGljZVN0cmluZyhwcmV2X3JhbmdlLCByYW5nZS5mcm9tKTtcblx0XHRcdG91dHB1dCArPSByYW5nZS51bndyYXBfc2xpY2UoTWF0aC5tYXgoMCwgZnJvbSksIHRvKTtcblx0XHRcdHByZXZfcmFuZ2UgPSByYW5nZS50bztcblx0XHR9XG5cblx0XHRpZiAodG8gPj0gcmFuZ2VzLmF0KC0xKSEudG8pXG5cdFx0XHRvdXRwdXQgKz0gZG9jLnNsaWNlU3RyaW5nKHJhbmdlcy5hdCgtMSkhLnRvLCB0byk7XG5cdFx0ZWxzZVxuXHRcdFx0YmFja19yYW5nZSA9IHJhbmdlcy5hdCgtMSkhO1xuXG5cdFx0Y29uc3QgbmV3X2Zyb20gPSBmcm9udF9yYW5nZSA/IGZyb250X3JhbmdlLmN1cnNvcl9wYXNzX3N5bnRheChmcm9tLCBmYWxzZSkgOiBmcm9tO1xuXHRcdGNvbnN0IG5ld190byA9IGJhY2tfcmFuZ2UgPyBiYWNrX3JhbmdlLmN1cnNvcl9wYXNzX3N5bnRheCh0bywgdHJ1ZSkgOiB0bztcblx0XHRpZiAobmV3X2Zyb20gIT09IGZyb20gfHwgZnJvbSA9PT0gZnJvbnRfcmFuZ2U/LmZyb20pIGZyb250X3JhbmdlID0gdW5kZWZpbmVkO1xuXHRcdGlmIChuZXdfdG8gIT09IHRvIHx8IHRvID09PSBiYWNrX3JhbmdlPy50bykgYmFja19yYW5nZSA9IHVuZGVmaW5lZDtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRvdXRwdXQsXG5cdFx0XHRmcm9tOiBuZXdfZnJvbSxcblx0XHRcdHRvOiBuZXdfdG8sXG5cdFx0XHRmcm9udF9yYW5nZSxcblx0XHRcdGJhY2tfcmFuZ2UsXG5cdFx0fTtcblx0fVxufVxuIiwgImNvbnN0IEMgPSBcIlxcdTAzN2NcIlxuY29uc3QgQ09VTlQgPSB0eXBlb2YgU3ltYm9sID09IFwidW5kZWZpbmVkXCIgPyBcIl9fXCIgKyBDIDogU3ltYm9sLmZvcihDKVxuY29uc3QgU0VUID0gdHlwZW9mIFN5bWJvbCA9PSBcInVuZGVmaW5lZFwiID8gXCJfX3N0eWxlU2V0XCIgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTgpIDogU3ltYm9sKFwic3R5bGVTZXRcIilcbmNvbnN0IHRvcCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9IFwidW5kZWZpbmVkXCIgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge31cblxuLy8gOjogLSBTdHlsZSBtb2R1bGVzIGVuY2Fwc3VsYXRlIGEgc2V0IG9mIENTUyBydWxlcyBkZWZpbmVkIGZyb21cbi8vIEphdmFTY3JpcHQuIFRoZWlyIGRlZmluaXRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBhIGdpdmVuIERPTVxuLy8gcm9vdCBhZnRlciBpdCBoYXMgYmVlbiBfbW91bnRlZF8gdGhlcmUgd2l0aCBgU3R5bGVNb2R1bGUubW91bnRgLlxuLy9cbi8vIFN0eWxlIG1vZHVsZXMgc2hvdWxkIGJlIGNyZWF0ZWQgb25jZSBhbmQgc3RvcmVkIHNvbWV3aGVyZSwgYXNcbi8vIG9wcG9zZWQgdG8gcmUtY3JlYXRpbmcgdGhlbSBldmVyeSB0aW1lIHlvdSBuZWVkIHRoZW0uIFRoZSBhbW91bnQgb2Zcbi8vIENTUyBydWxlcyBnZW5lcmF0ZWQgZm9yIGEgZ2l2ZW4gRE9NIHJvb3QgaXMgYm91bmRlZCBieSB0aGUgYW1vdW50XG4vLyBvZiBzdHlsZSBtb2R1bGVzIHRoYXQgd2VyZSB1c2VkLiBTbyB0byBhdm9pZCBsZWFraW5nIHJ1bGVzLCBkb24ndFxuLy8gY3JlYXRlIHRoZXNlIGR5bmFtaWNhbGx5LCBidXQgdHJlYXQgdGhlbSBhcyBvbmUtdGltZSBhbGxvY2F0aW9ucy5cbmV4cG9ydCBjbGFzcyBTdHlsZU1vZHVsZSB7XG4gIC8vIDo6IChPYmplY3Q8U3R5bGU+LCA/e2ZpbmlzaDogPyhzdHJpbmcpIFx1MjE5MiBzdHJpbmd9KVxuICAvLyBDcmVhdGUgYSBzdHlsZSBtb2R1bGUgZnJvbSB0aGUgZ2l2ZW4gc3BlYy5cbiAgLy9cbiAgLy8gV2hlbiBgZmluaXNoYCBpcyBnaXZlbiwgaXQgaXMgY2FsbGVkIG9uIHJlZ3VsYXIgKG5vbi1gQGApXG4gIC8vIHNlbGVjdG9ycyAoYWZ0ZXIgYCZgIGV4cGFuc2lvbikgdG8gY29tcHV0ZSB0aGUgZmluYWwgc2VsZWN0b3IuXG4gIGNvbnN0cnVjdG9yKHNwZWMsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnJ1bGVzID0gW11cbiAgICBsZXQge2ZpbmlzaH0gPSBvcHRpb25zIHx8IHt9XG5cbiAgICBmdW5jdGlvbiBzcGxpdFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gL15ALy50ZXN0KHNlbGVjdG9yKSA/IFtzZWxlY3Rvcl0gOiBzZWxlY3Rvci5zcGxpdCgvLFxccyovKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbmRlcihzZWxlY3RvcnMsIHNwZWMsIHRhcmdldCwgaXNLZXlmcmFtZXMpIHtcbiAgICAgIGxldCBsb2NhbCA9IFtdLCBpc0F0ID0gL15AKFxcdyspXFxiLy5leGVjKHNlbGVjdG9yc1swXSksIGtleWZyYW1lcyA9IGlzQXQgJiYgaXNBdFsxXSA9PSBcImtleWZyYW1lc1wiXG4gICAgICBpZiAoaXNBdCAmJiBzcGVjID09IG51bGwpIHJldHVybiB0YXJnZXQucHVzaChzZWxlY3RvcnNbMF0gKyBcIjtcIilcbiAgICAgIGZvciAobGV0IHByb3AgaW4gc3BlYykge1xuICAgICAgICBsZXQgdmFsdWUgPSBzcGVjW3Byb3BdXG4gICAgICAgIGlmICgvJi8udGVzdChwcm9wKSkge1xuICAgICAgICAgIHJlbmRlcihwcm9wLnNwbGl0KC8sXFxzKi8pLm1hcChwYXJ0ID0+IHNlbGVjdG9ycy5tYXAoc2VsID0+IHBhcnQucmVwbGFjZSgvJi8sIHNlbCkpKS5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpKSxcbiAgICAgICAgICAgICAgICAgdmFsdWUsIHRhcmdldClcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmICghaXNBdCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSAoXCIgKyBwcm9wICsgXCIpIHNob3VsZCBiZSBhIHByaW1pdGl2ZSB2YWx1ZS5cIilcbiAgICAgICAgICByZW5kZXIoc3BsaXRTZWxlY3Rvcihwcm9wKSwgdmFsdWUsIGxvY2FsLCBrZXlmcmFtZXMpXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsLnB1c2gocHJvcC5yZXBsYWNlKC9fLiovLCBcIlwiKS5yZXBsYWNlKC9bQS1aXS9nLCBsID0+IFwiLVwiICsgbC50b0xvd2VyQ2FzZSgpKSArIFwiOiBcIiArIHZhbHVlICsgXCI7XCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb2NhbC5sZW5ndGggfHwga2V5ZnJhbWVzKSB7XG4gICAgICAgIHRhcmdldC5wdXNoKChmaW5pc2ggJiYgIWlzQXQgJiYgIWlzS2V5ZnJhbWVzID8gc2VsZWN0b3JzLm1hcChmaW5pc2gpIDogc2VsZWN0b3JzKS5qb2luKFwiLCBcIikgK1xuICAgICAgICAgICAgICAgICAgICBcIiB7XCIgKyBsb2NhbC5qb2luKFwiIFwiKSArIFwifVwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IHByb3AgaW4gc3BlYykgcmVuZGVyKHNwbGl0U2VsZWN0b3IocHJvcCksIHNwZWNbcHJvcF0sIHRoaXMucnVsZXMpXG4gIH1cblxuICAvLyA6OiAoKSBcdTIxOTIgc3RyaW5nXG4gIC8vIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbW9kdWxlJ3MgQ1NTIHJ1bGVzLlxuICBnZXRSdWxlcygpIHsgcmV0dXJuIHRoaXMucnVsZXMuam9pbihcIlxcblwiKSB9XG5cbiAgLy8gOjogKCkgXHUyMTkyIHN0cmluZ1xuICAvLyBHZW5lcmF0ZSBhIG5ldyB1bmlxdWUgQ1NTIGNsYXNzIG5hbWUuXG4gIHN0YXRpYyBuZXdOYW1lKCkge1xuICAgIGxldCBpZCA9IHRvcFtDT1VOVF0gfHwgMVxuICAgIHRvcFtDT1VOVF0gPSBpZCArIDFcbiAgICByZXR1cm4gQyArIGlkLnRvU3RyaW5nKDM2KVxuICB9XG5cbiAgLy8gOjogKHVuaW9uPERvY3VtZW50LCBTaGFkb3dSb290PiwgdW5pb248W1N0eWxlTW9kdWxlXSwgU3R5bGVNb2R1bGU+LCA/e25vbmNlOiA/c3RyaW5nfSlcbiAgLy9cbiAgLy8gTW91bnQgdGhlIGdpdmVuIHNldCBvZiBtb2R1bGVzIGluIHRoZSBnaXZlbiBET00gcm9vdCwgd2hpY2ggZW5zdXJlc1xuICAvLyB0aGF0IHRoZSBDU1MgcnVsZXMgZGVmaW5lZCBieSB0aGUgbW9kdWxlIGFyZSBhdmFpbGFibGUgaW4gdGhhdFxuICAvLyBjb250ZXh0LlxuICAvL1xuICAvLyBSdWxlcyBhcmUgb25seSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgb25jZSBwZXIgcm9vdC5cbiAgLy9cbiAgLy8gUnVsZSBvcmRlciB3aWxsIGZvbGxvdyB0aGUgb3JkZXIgb2YgdGhlIG1vZHVsZXMsIHNvIHRoYXQgcnVsZXMgZnJvbVxuICAvLyBtb2R1bGVzIGxhdGVyIGluIHRoZSBhcnJheSB0YWtlIHByZWNlZGVuY2Ugb2YgdGhvc2UgZnJvbSBlYXJsaWVyXG4gIC8vIG1vZHVsZXMuIElmIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIHJvb3RcbiAgLy8gaW4gYSB3YXkgdGhhdCBjaGFuZ2VzIHRoZSBvcmRlciBvZiBhbHJlYWR5IG1vdW50ZWQgbW9kdWxlcywgdGhlIG9sZFxuICAvLyBvcmRlciB3aWxsIGJlIGNoYW5nZWQuXG4gIC8vXG4gIC8vIElmIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgbm9uY2UgaXMgcHJvdmlkZWQsIGl0IGlzIGFkZGVkIHRvXG4gIC8vIHRoZSBgPHN0eWxlPmAgdGFnIGdlbmVyYXRlZCBieSB0aGUgbGlicmFyeS5cbiAgc3RhdGljIG1vdW50KHJvb3QsIG1vZHVsZXMsIG9wdGlvbnMpIHtcbiAgICBsZXQgc2V0ID0gcm9vdFtTRVRdLCBub25jZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5ub25jZVxuICAgIGlmICghc2V0KSBzZXQgPSBuZXcgU3R5bGVTZXQocm9vdCwgbm9uY2UpXG4gICAgZWxzZSBpZiAobm9uY2UpIHNldC5zZXROb25jZShub25jZSlcbiAgICBzZXQubW91bnQoQXJyYXkuaXNBcnJheShtb2R1bGVzKSA/IG1vZHVsZXMgOiBbbW9kdWxlc10sIHJvb3QpXG4gIH1cbn1cblxubGV0IGFkb3B0ZWRTZXQgPSBuZXcgTWFwIC8vPERvY3VtZW50LCBTdHlsZVNldD5cblxuY2xhc3MgU3R5bGVTZXQge1xuICBjb25zdHJ1Y3Rvcihyb290LCBub25jZSkge1xuICAgIGxldCBkb2MgPSByb290Lm93bmVyRG9jdW1lbnQgfHwgcm9vdCwgd2luID0gZG9jLmRlZmF1bHRWaWV3XG4gICAgaWYgKCFyb290LmhlYWQgJiYgcm9vdC5hZG9wdGVkU3R5bGVTaGVldHMgJiYgd2luLkNTU1N0eWxlU2hlZXQpIHtcbiAgICAgIGxldCBhZG9wdGVkID0gYWRvcHRlZFNldC5nZXQoZG9jKVxuICAgICAgaWYgKGFkb3B0ZWQpIHJldHVybiByb290W1NFVF0gPSBhZG9wdGVkXG4gICAgICB0aGlzLnNoZWV0ID0gbmV3IHdpbi5DU1NTdHlsZVNoZWV0XG4gICAgICBhZG9wdGVkU2V0LnNldChkb2MsIHRoaXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3R5bGVUYWcgPSBkb2MuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpXG4gICAgICBpZiAobm9uY2UpIHRoaXMuc3R5bGVUYWcuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpXG4gICAgfVxuICAgIHRoaXMubW9kdWxlcyA9IFtdXG4gICAgcm9vdFtTRVRdID0gdGhpc1xuICB9XG5cbiAgbW91bnQobW9kdWxlcywgcm9vdCkge1xuICAgIGxldCBzaGVldCA9IHRoaXMuc2hlZXRcbiAgICBsZXQgcG9zID0gMCAvKiBDdXJyZW50IHJ1bGUgb2Zmc2V0ICovLCBqID0gMCAvKiBJbmRleCBpbnRvIHRoaXMubW9kdWxlcyAqL1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IG1vZCA9IG1vZHVsZXNbaV0sIGluZGV4ID0gdGhpcy5tb2R1bGVzLmluZGV4T2YobW9kKVxuICAgICAgaWYgKGluZGV4IDwgaiAmJiBpbmRleCA+IC0xKSB7IC8vIE9yZGVyaW5nIGNvbmZsaWN0XG4gICAgICAgIHRoaXMubW9kdWxlcy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgIGotLVxuICAgICAgICBpbmRleCA9IC0xXG4gICAgICB9XG4gICAgICBpZiAoaW5kZXggPT0gLTEpIHtcbiAgICAgICAgdGhpcy5tb2R1bGVzLnNwbGljZShqKyssIDAsIG1vZClcbiAgICAgICAgaWYgKHNoZWV0KSBmb3IgKGxldCBrID0gMDsgayA8IG1vZC5ydWxlcy5sZW5ndGg7IGsrKylcbiAgICAgICAgICBzaGVldC5pbnNlcnRSdWxlKG1vZC5ydWxlc1trXSwgcG9zKyspXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAoaiA8IGluZGV4KSBwb3MgKz0gdGhpcy5tb2R1bGVzW2orK10ucnVsZXMubGVuZ3RoXG4gICAgICAgIHBvcyArPSBtb2QucnVsZXMubGVuZ3RoXG4gICAgICAgIGorK1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaGVldCkge1xuICAgICAgaWYgKHJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzLmluZGV4T2YodGhpcy5zaGVldCkgPCAwKVxuICAgICAgICByb290LmFkb3B0ZWRTdHlsZVNoZWV0cyA9IFt0aGlzLnNoZWV0LCAuLi5yb290LmFkb3B0ZWRTdHlsZVNoZWV0c11cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRleHQgPSBcIlwiXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubW9kdWxlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgdGV4dCArPSB0aGlzLm1vZHVsZXNbaV0uZ2V0UnVsZXMoKSArIFwiXFxuXCJcbiAgICAgIHRoaXMuc3R5bGVUYWcudGV4dENvbnRlbnQgPSB0ZXh0XG4gICAgICBsZXQgdGFyZ2V0ID0gcm9vdC5oZWFkIHx8IHJvb3RcbiAgICAgIGlmICh0aGlzLnN0eWxlVGFnLnBhcmVudE5vZGUgIT0gdGFyZ2V0KVxuICAgICAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKHRoaXMuc3R5bGVUYWcsIHRhcmdldC5maXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIHNldE5vbmNlKG5vbmNlKSB7XG4gICAgaWYgKHRoaXMuc3R5bGVUYWcgJiYgdGhpcy5zdHlsZVRhZy5nZXRBdHRyaWJ1dGUoXCJub25jZVwiKSAhPSBub25jZSlcbiAgICAgIHRoaXMuc3R5bGVUYWcuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpXG4gIH1cbn1cblxuLy8gU3R5bGU6Ok9iamVjdDx1bmlvbjxTdHlsZSxzdHJpbmc+PlxuLy9cbi8vIEEgc3R5bGUgaXMgYW4gb2JqZWN0IHRoYXQsIGluIHRoZSBzaW1wbGUgY2FzZSwgbWFwcyBDU1MgcHJvcGVydHlcbi8vIG5hbWVzIHRvIHN0cmluZ3MgaG9sZGluZyB0aGVpciB2YWx1ZXMsIGFzIGluIGB7Y29sb3I6IFwicmVkXCIsXG4vLyBmb250V2VpZ2h0OiBcImJvbGRcIn1gLiBUaGUgcHJvcGVydHkgbmFtZXMgY2FuIGJlIGdpdmVuIGluXG4vLyBjYW1lbC1jYXNlXHUyMDE0dGhlIGxpYnJhcnkgd2lsbCBpbnNlcnQgYSBkYXNoIGJlZm9yZSBjYXBpdGFsIGxldHRlcnNcbi8vIHdoZW4gY29udmVydGluZyB0aGVtIHRvIENTUy5cbi8vXG4vLyBJZiB5b3UgaW5jbHVkZSBhbiB1bmRlcnNjb3JlIGluIGEgcHJvcGVydHkgbmFtZSwgaXQgYW5kIGV2ZXJ5dGhpbmdcbi8vIGFmdGVyIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBvdXRwdXQsIHdoaWNoIGNhbiBiZSB1c2VmdWwgd2hlblxuLy8gcHJvdmlkaW5nIGEgcHJvcGVydHkgbXVsdGlwbGUgdGltZXMsIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbi8vIHJlYXNvbnMuXG4vL1xuLy8gQSBwcm9wZXJ0eSBpbiBhIHN0eWxlIG9iamVjdCBjYW4gYWxzbyBiZSBhIHN1Yi1zZWxlY3Rvciwgd2hpY2hcbi8vIGV4dGVuZHMgdGhlIGN1cnJlbnQgY29udGV4dCB0byBhZGQgYSBwc2V1ZG8tc2VsZWN0b3Igb3IgYSBjaGlsZFxuLy8gc2VsZWN0b3IuIFN1Y2ggYSBwcm9wZXJ0eSBzaG91bGQgY29udGFpbiBhIGAmYCBjaGFyYWN0ZXIsIHdoaWNoXG4vLyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBjdXJyZW50IHNlbGVjdG9yLiBGb3IgZXhhbXBsZSBge1wiJjpiZWZvcmVcIjpcbi8vIHtjb250ZW50OiAnXCJoaVwiJ319YC4gU3ViLXNlbGVjdG9ycyBhbmQgcmVndWxhciBwcm9wZXJ0aWVzIGNhblxuLy8gZnJlZWx5IGJlIG1peGVkIGluIGEgZ2l2ZW4gb2JqZWN0LiBBbnkgcHJvcGVydHkgY29udGFpbmluZyBhIGAmYCBpc1xuLy8gYXNzdW1lZCB0byBiZSBhIHN1Yi1zZWxlY3Rvci5cbi8vXG4vLyBGaW5hbGx5LCBhIHByb3BlcnR5IGNhbiBzcGVjaWZ5IGFuIEAtYmxvY2sgdG8gYmUgd3JhcHBlZCBhcm91bmQgdGhlXG4vLyBzdHlsZXMgZGVmaW5lZCBpbnNpZGUgdGhlIG9iamVjdCB0aGF0J3MgdGhlIHByb3BlcnR5J3MgdmFsdWUuIEZvclxuLy8gZXhhbXBsZSB0byBjcmVhdGUgYSBtZWRpYSBxdWVyeSB5b3UgY2FuIGRvIGB7XCJAbWVkaWEgc2NyZWVuIGFuZFxuLy8gKG1pbi13aWR0aDogNDAwcHgpXCI6IHsuLi59fWAuXG4iLCAiZXhwb3J0IHZhciBiYXNlID0ge1xuICA4OiBcIkJhY2tzcGFjZVwiLFxuICA5OiBcIlRhYlwiLFxuICAxMDogXCJFbnRlclwiLFxuICAxMjogXCJOdW1Mb2NrXCIsXG4gIDEzOiBcIkVudGVyXCIsXG4gIDE2OiBcIlNoaWZ0XCIsXG4gIDE3OiBcIkNvbnRyb2xcIixcbiAgMTg6IFwiQWx0XCIsXG4gIDIwOiBcIkNhcHNMb2NrXCIsXG4gIDI3OiBcIkVzY2FwZVwiLFxuICAzMjogXCIgXCIsXG4gIDMzOiBcIlBhZ2VVcFwiLFxuICAzNDogXCJQYWdlRG93blwiLFxuICAzNTogXCJFbmRcIixcbiAgMzY6IFwiSG9tZVwiLFxuICAzNzogXCJBcnJvd0xlZnRcIixcbiAgMzg6IFwiQXJyb3dVcFwiLFxuICAzOTogXCJBcnJvd1JpZ2h0XCIsXG4gIDQwOiBcIkFycm93RG93blwiLFxuICA0NDogXCJQcmludFNjcmVlblwiLFxuICA0NTogXCJJbnNlcnRcIixcbiAgNDY6IFwiRGVsZXRlXCIsXG4gIDU5OiBcIjtcIixcbiAgNjE6IFwiPVwiLFxuICA5MTogXCJNZXRhXCIsXG4gIDkyOiBcIk1ldGFcIixcbiAgMTA2OiBcIipcIixcbiAgMTA3OiBcIitcIixcbiAgMTA4OiBcIixcIixcbiAgMTA5OiBcIi1cIixcbiAgMTEwOiBcIi5cIixcbiAgMTExOiBcIi9cIixcbiAgMTQ0OiBcIk51bUxvY2tcIixcbiAgMTQ1OiBcIlNjcm9sbExvY2tcIixcbiAgMTYwOiBcIlNoaWZ0XCIsXG4gIDE2MTogXCJTaGlmdFwiLFxuICAxNjI6IFwiQ29udHJvbFwiLFxuICAxNjM6IFwiQ29udHJvbFwiLFxuICAxNjQ6IFwiQWx0XCIsXG4gIDE2NTogXCJBbHRcIixcbiAgMTczOiBcIi1cIixcbiAgMTg2OiBcIjtcIixcbiAgMTg3OiBcIj1cIixcbiAgMTg4OiBcIixcIixcbiAgMTg5OiBcIi1cIixcbiAgMTkwOiBcIi5cIixcbiAgMTkxOiBcIi9cIixcbiAgMTkyOiBcImBcIixcbiAgMjE5OiBcIltcIixcbiAgMjIwOiBcIlxcXFxcIixcbiAgMjIxOiBcIl1cIixcbiAgMjIyOiBcIidcIlxufVxuXG5leHBvcnQgdmFyIHNoaWZ0ID0ge1xuICA0ODogXCIpXCIsXG4gIDQ5OiBcIiFcIixcbiAgNTA6IFwiQFwiLFxuICA1MTogXCIjXCIsXG4gIDUyOiBcIiRcIixcbiAgNTM6IFwiJVwiLFxuICA1NDogXCJeXCIsXG4gIDU1OiBcIiZcIixcbiAgNTY6IFwiKlwiLFxuICA1NzogXCIoXCIsXG4gIDU5OiBcIjpcIixcbiAgNjE6IFwiK1wiLFxuICAxNzM6IFwiX1wiLFxuICAxODY6IFwiOlwiLFxuICAxODc6IFwiK1wiLFxuICAxODg6IFwiPFwiLFxuICAxODk6IFwiX1wiLFxuICAxOTA6IFwiPlwiLFxuICAxOTE6IFwiP1wiLFxuICAxOTI6IFwiflwiLFxuICAyMTk6IFwie1wiLFxuICAyMjA6IFwifFwiLFxuICAyMjE6IFwifVwiLFxuICAyMjI6IFwiXFxcIlwiXG59XG5cbnZhciBtYWMgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL01hYy8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pXG52YXIgaWUgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL01TSUUgXFxkfFRyaWRlbnRcXC8oPzpbNy05XXxcXGR7Mix9KVxcLi4qcnY6KFxcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbi8vIEZpbGwgaW4gdGhlIGRpZ2l0IGtleXNcbmZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykgYmFzZVs0OCArIGldID0gYmFzZVs5NiArIGldID0gU3RyaW5nKGkpXG5cbi8vIFRoZSBmdW5jdGlvbiBrZXlzXG5mb3IgKHZhciBpID0gMTsgaSA8PSAyNDsgaSsrKSBiYXNlW2kgKyAxMTFdID0gXCJGXCIgKyBpXG5cbi8vIEFuZCB0aGUgYWxwaGFiZXRpYyBrZXlzXG5mb3IgKHZhciBpID0gNjU7IGkgPD0gOTA7IGkrKykge1xuICBiYXNlW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShpICsgMzIpXG4gIHNoaWZ0W2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKVxufVxuXG4vLyBGb3IgZWFjaCBjb2RlIHRoYXQgZG9lc24ndCBoYXZlIGEgc2hpZnQtZXF1aXZhbGVudCwgY29weSB0aGUgYmFzZSBuYW1lXG5mb3IgKHZhciBjb2RlIGluIGJhc2UpIGlmICghc2hpZnQuaGFzT3duUHJvcGVydHkoY29kZSkpIHNoaWZ0W2NvZGVdID0gYmFzZVtjb2RlXVxuXG5leHBvcnQgZnVuY3Rpb24ga2V5TmFtZShldmVudCkge1xuICAvLyBPbiBtYWNPUywga2V5cyBoZWxkIHdpdGggU2hpZnQgYW5kIENtZCBkb24ndCByZWZsZWN0IHRoZSBlZmZlY3Qgb2YgU2hpZnQgaW4gYC5rZXlgLlxuICAvLyBPbiBJRSwgc2hpZnQgZWZmZWN0IGlzIG5ldmVyIGluY2x1ZGVkIGluIGAua2V5YC5cbiAgdmFyIGlnbm9yZUtleSA9IG1hYyAmJiBldmVudC5tZXRhS2V5ICYmIGV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgfHxcbiAgICAgIGllICYmIGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSAmJiBldmVudC5rZXkubGVuZ3RoID09IDEgfHxcbiAgICAgIGV2ZW50LmtleSA9PSBcIlVuaWRlbnRpZmllZFwiXG4gIHZhciBuYW1lID0gKCFpZ25vcmVLZXkgJiYgZXZlbnQua2V5KSB8fFxuICAgIChldmVudC5zaGlmdEtleSA/IHNoaWZ0IDogYmFzZSlbZXZlbnQua2V5Q29kZV0gfHxcbiAgICBldmVudC5rZXkgfHwgXCJVbmlkZW50aWZpZWRcIlxuICAvLyBFZGdlIHNvbWV0aW1lcyBwcm9kdWNlcyB3cm9uZyBuYW1lcyAoSXNzdWUgIzMpXG4gIGlmIChuYW1lID09IFwiRXNjXCIpIG5hbWUgPSBcIkVzY2FwZVwiXG4gIGlmIChuYW1lID09IFwiRGVsXCIpIG5hbWUgPSBcIkRlbGV0ZVwiXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzg4NjA1NzEvXG4gIGlmIChuYW1lID09IFwiTGVmdFwiKSBuYW1lID0gXCJBcnJvd0xlZnRcIlxuICBpZiAobmFtZSA9PSBcIlVwXCIpIG5hbWUgPSBcIkFycm93VXBcIlxuICBpZiAobmFtZSA9PSBcIlJpZ2h0XCIpIG5hbWUgPSBcIkFycm93UmlnaHRcIlxuICBpZiAobmFtZSA9PSBcIkRvd25cIikgbmFtZSA9IFwiQXJyb3dEb3duXCJcbiAgcmV0dXJuIG5hbWVcbn1cbiIsICJpbXBvcnQgeyBUZXh0LCBSYW5nZVNldCwgTWFwTW9kZSwgUmFuZ2VWYWx1ZSwgZmluZENsdXN0ZXJCcmVhaywgRWRpdG9yU2VsZWN0aW9uLCBGYWNldCwgU3RhdGVFZmZlY3QsIENoYW5nZVNldCwgZmluZENvbHVtbiwgQ2hhckNhdGVnb3J5LCBFZGl0b3JTdGF0ZSwgQW5ub3RhdGlvbiwgVHJhbnNhY3Rpb24sIFByZWMsIGNvZGVQb2ludEF0LCBjb2RlUG9pbnRTaXplLCBjb21iaW5lQ29uZmlnLCBTdGF0ZUZpZWxkLCBSYW5nZVNldEJ1aWxkZXIsIGNvdW50Q29sdW1uIH0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuaW1wb3J0IHsgU3R5bGVNb2R1bGUgfSBmcm9tICdzdHlsZS1tb2QnO1xuaW1wb3J0IHsga2V5TmFtZSwgYmFzZSwgc2hpZnQgfSBmcm9tICd3M2Mta2V5bmFtZSc7XG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbihyb290KSB7XG4gICAgbGV0IHRhcmdldDtcbiAgICAvLyBCcm93c2VycyBkaWZmZXIgb24gd2hldGhlciBzaGFkb3cgcm9vdHMgaGF2ZSBhIGdldFNlbGVjdGlvblxuICAgIC8vIG1ldGhvZC4gSWYgaXQgZXhpc3RzLCB1c2UgdGhhdCwgb3RoZXJ3aXNlLCBjYWxsIGl0IG9uIHRoZVxuICAgIC8vIGRvY3VtZW50LlxuICAgIGlmIChyb290Lm5vZGVUeXBlID09IDExKSB7IC8vIFNoYWRvdyByb290XG4gICAgICAgIHRhcmdldCA9IHJvb3QuZ2V0U2VsZWN0aW9uID8gcm9vdCA6IHJvb3Qub3duZXJEb2N1bWVudDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IHJvb3Q7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQuZ2V0U2VsZWN0aW9uKCk7XG59XG5mdW5jdGlvbiBjb250YWlucyhkb20sIG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZSA/IGRvbSA9PSBub2RlIHx8IGRvbS5jb250YWlucyhub2RlLm5vZGVUeXBlICE9IDEgPyBub2RlLnBhcmVudE5vZGUgOiBub2RlKSA6IGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uKGRvbSwgc2VsZWN0aW9uKSB7XG4gICAgaWYgKCFzZWxlY3Rpb24uYW5jaG9yTm9kZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEZpcmVmb3ggd2lsbCByYWlzZSAncGVybWlzc2lvbiBkZW5pZWQnIGVycm9ycyB3aGVuIGFjY2Vzc2luZ1xuICAgICAgICAvLyBwcm9wZXJ0aWVzIG9mIGBzZWwuYW5jaG9yTm9kZWAgd2hlbiBpdCdzIGluIGEgZ2VuZXJhdGVkIENTU1xuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICByZXR1cm4gY29udGFpbnMoZG9tLCBzZWxlY3Rpb24uYW5jaG9yTm9kZSk7XG4gICAgfVxuICAgIGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbGllbnRSZWN0c0Zvcihkb20pIHtcbiAgICBpZiAoZG9tLm5vZGVUeXBlID09IDMpXG4gICAgICAgIHJldHVybiB0ZXh0UmFuZ2UoZG9tLCAwLCBkb20ubm9kZVZhbHVlLmxlbmd0aCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBlbHNlIGlmIChkb20ubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgcmV0dXJuIGRvbS5nZXRDbGllbnRSZWN0cygpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIFtdO1xufVxuLy8gU2NhbnMgZm9yd2FyZCBhbmQgYmFja3dhcmQgdGhyb3VnaCBET00gcG9zaXRpb25zIGVxdWl2YWxlbnQgdG8gdGhlXG4vLyBnaXZlbiBvbmUgdG8gc2VlIGlmIHRoZSB0d28gYXJlIGluIHRoZSBzYW1lIHBsYWNlIChpLmUuIGFmdGVyIGFcbi8vIHRleHQgbm9kZSB2cyBhdCB0aGUgZW5kIG9mIHRoYXQgdGV4dCBub2RlKVxuZnVuY3Rpb24gaXNFcXVpdmFsZW50UG9zaXRpb24obm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYpIHtcbiAgICByZXR1cm4gdGFyZ2V0Tm9kZSA/IChzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCAtMSkgfHxcbiAgICAgICAgc2NhbkZvcihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZiwgMSkpIDogZmFsc2U7XG59XG5mdW5jdGlvbiBkb21JbmRleChub2RlKSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOzsgaW5kZXgrKykge1xuICAgICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0Jsb2NrRWxlbWVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gMSAmJiAvXihESVZ8UHxMSXxVTHxPTHxCTE9DS1FVT1RFfEREfERUfEhcXGR8U0VDVElPTnxQUkUpJC8udGVzdChub2RlLm5vZGVOYW1lKTtcbn1cbmZ1bmN0aW9uIHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIGRpcikge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gdGFyZ2V0Tm9kZSAmJiBvZmYgPT0gdGFyZ2V0T2ZmKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvZmYgPT0gKGRpciA8IDAgPyAwIDogbWF4T2Zmc2V0KG5vZGUpKSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJESVZcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50Lm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgb2ZmID0gZG9tSW5kZXgobm9kZSkgKyAoZGlyIDwgMCA/IDAgOiAxKTtcbiAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZiArIChkaXIgPCAwID8gLTEgOiAwKV07XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBvZmYgPSBkaXIgPCAwID8gbWF4T2Zmc2V0KG5vZGUpIDogMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIG1heE9mZnNldChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gMyA/IG5vZGUubm9kZVZhbHVlLmxlbmd0aCA6IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG59XG5mdW5jdGlvbiBmbGF0dGVuUmVjdChyZWN0LCBsZWZ0KSB7XG4gICAgbGV0IHggPSBsZWZ0ID8gcmVjdC5sZWZ0IDogcmVjdC5yaWdodDtcbiAgICByZXR1cm4geyBsZWZ0OiB4LCByaWdodDogeCwgdG9wOiByZWN0LnRvcCwgYm90dG9tOiByZWN0LmJvdHRvbSB9O1xufVxuZnVuY3Rpb24gd2luZG93UmVjdCh3aW4pIHtcbiAgICBsZXQgdnAgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gICAgaWYgKHZwKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVmdDogMCwgcmlnaHQ6IHZwLndpZHRoLFxuICAgICAgICAgICAgdG9wOiAwLCBib3R0b206IHZwLmhlaWdodFxuICAgICAgICB9O1xuICAgIHJldHVybiB7IGxlZnQ6IDAsIHJpZ2h0OiB3aW4uaW5uZXJXaWR0aCxcbiAgICAgICAgdG9wOiAwLCBib3R0b206IHdpbi5pbm5lckhlaWdodCB9O1xufVxuZnVuY3Rpb24gZ2V0U2NhbGUoZWx0LCByZWN0KSB7XG4gICAgbGV0IHNjYWxlWCA9IHJlY3Qud2lkdGggLyBlbHQub2Zmc2V0V2lkdGg7XG4gICAgbGV0IHNjYWxlWSA9IHJlY3QuaGVpZ2h0IC8gZWx0Lm9mZnNldEhlaWdodDtcbiAgICBpZiAoc2NhbGVYID4gMC45OTUgJiYgc2NhbGVYIDwgMS4wMDUgfHwgIWlzRmluaXRlKHNjYWxlWCkgfHwgTWF0aC5hYnMocmVjdC53aWR0aCAtIGVsdC5vZmZzZXRXaWR0aCkgPCAxKVxuICAgICAgICBzY2FsZVggPSAxO1xuICAgIGlmIChzY2FsZVkgPiAwLjk5NSAmJiBzY2FsZVkgPCAxLjAwNSB8fCAhaXNGaW5pdGUoc2NhbGVZKSB8fCBNYXRoLmFicyhyZWN0LmhlaWdodCAtIGVsdC5vZmZzZXRIZWlnaHQpIDwgMSlcbiAgICAgICAgc2NhbGVZID0gMTtcbiAgICByZXR1cm4geyBzY2FsZVgsIHNjYWxlWSB9O1xufVxuZnVuY3Rpb24gc2Nyb2xsUmVjdEludG9WaWV3KGRvbSwgcmVjdCwgc2lkZSwgeCwgeSwgeE1hcmdpbiwgeU1hcmdpbiwgbHRyKSB7XG4gICAgbGV0IGRvYyA9IGRvbS5vd25lckRvY3VtZW50LCB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIGZvciAobGV0IGN1ciA9IGRvbSwgc3RvcCA9IGZhbHNlOyBjdXIgJiYgIXN0b3A7KSB7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgPT0gMSkgeyAvLyBFbGVtZW50XG4gICAgICAgICAgICBsZXQgYm91bmRpbmcsIHRvcCA9IGN1ciA9PSBkb2MuYm9keTtcbiAgICAgICAgICAgIGxldCBzY2FsZVggPSAxLCBzY2FsZVkgPSAxO1xuICAgICAgICAgICAgaWYgKHRvcCkge1xuICAgICAgICAgICAgICAgIGJvdW5kaW5nID0gd2luZG93UmVjdCh3aW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKC9eKGZpeGVkfHN0aWNreSkkLy50ZXN0KGdldENvbXB1dGVkU3R5bGUoY3VyKS5wb3NpdGlvbikpXG4gICAgICAgICAgICAgICAgICAgIHN0b3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChjdXIuc2Nyb2xsSGVpZ2h0IDw9IGN1ci5jbGllbnRIZWlnaHQgJiYgY3VyLnNjcm9sbFdpZHRoIDw9IGN1ci5jbGllbnRXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjdXIgPSBjdXIuYXNzaWduZWRTbG90IHx8IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlY3QgPSBjdXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgKHsgc2NhbGVYLCBzY2FsZVkgfSA9IGdldFNjYWxlKGN1ciwgcmVjdCkpO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBzY3JvbGxiYXIgd2lkdGggaXNuJ3QgaW5jbHVkZWQgaW4gdGhlIHJlY3RhbmdsZVxuICAgICAgICAgICAgICAgIGJvdW5kaW5nID0geyBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LmxlZnQgKyBjdXIuY2xpZW50V2lkdGggKiBzY2FsZVgsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC50b3AgKyBjdXIuY2xpZW50SGVpZ2h0ICogc2NhbGVZIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbW92ZVggPSAwLCBtb3ZlWSA9IDA7XG4gICAgICAgICAgICBpZiAoeSA9PSBcIm5lYXJlc3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChyZWN0LnRvcCA8IGJvdW5kaW5nLnRvcCkge1xuICAgICAgICAgICAgICAgICAgICBtb3ZlWSA9IHJlY3QudG9wIC0gKGJvdW5kaW5nLnRvcCArIHlNYXJnaW4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZSA+IDAgJiYgcmVjdC5ib3R0b20gPiBib3VuZGluZy5ib3R0b20gKyBtb3ZlWSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVZID0gcmVjdC5ib3R0b20gLSBib3VuZGluZy5ib3R0b20gKyB5TWFyZ2luO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWN0LmJvdHRvbSA+IGJvdW5kaW5nLmJvdHRvbSkge1xuICAgICAgICAgICAgICAgICAgICBtb3ZlWSA9IHJlY3QuYm90dG9tIC0gYm91bmRpbmcuYm90dG9tICsgeU1hcmdpbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpZGUgPCAwICYmIChyZWN0LnRvcCAtIG1vdmVZKSA8IGJvdW5kaW5nLnRvcClcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVZID0gcmVjdC50b3AgLSAoYm91bmRpbmcudG9wICsgeU1hcmdpbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlY3RIZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wLCBib3VuZGluZ0hlaWdodCA9IGJvdW5kaW5nLmJvdHRvbSAtIGJvdW5kaW5nLnRvcDtcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0VG9wID0geSA9PSBcImNlbnRlclwiICYmIHJlY3RIZWlnaHQgPD0gYm91bmRpbmdIZWlnaHQgPyByZWN0LnRvcCArIHJlY3RIZWlnaHQgLyAyIC0gYm91bmRpbmdIZWlnaHQgLyAyIDpcbiAgICAgICAgICAgICAgICAgICAgeSA9PSBcInN0YXJ0XCIgfHwgeSA9PSBcImNlbnRlclwiICYmIHNpZGUgPCAwID8gcmVjdC50b3AgLSB5TWFyZ2luIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tIC0gYm91bmRpbmdIZWlnaHQgKyB5TWFyZ2luO1xuICAgICAgICAgICAgICAgIG1vdmVZID0gdGFyZ2V0VG9wIC0gYm91bmRpbmcudG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHggPT0gXCJuZWFyZXN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVjdC5sZWZ0IDwgYm91bmRpbmcubGVmdCkge1xuICAgICAgICAgICAgICAgICAgICBtb3ZlWCA9IHJlY3QubGVmdCAtIChib3VuZGluZy5sZWZ0ICsgeE1hcmdpbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlID4gMCAmJiByZWN0LnJpZ2h0ID4gYm91bmRpbmcucmlnaHQgKyBtb3ZlWClcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVYID0gcmVjdC5yaWdodCAtIGJvdW5kaW5nLnJpZ2h0ICsgeE1hcmdpbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVjdC5yaWdodCA+IGJvdW5kaW5nLnJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVYID0gcmVjdC5yaWdodCAtIGJvdW5kaW5nLnJpZ2h0ICsgeE1hcmdpbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpZGUgPCAwICYmIHJlY3QubGVmdCA8IGJvdW5kaW5nLmxlZnQgKyBtb3ZlWClcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVYID0gcmVjdC5sZWZ0IC0gKGJvdW5kaW5nLmxlZnQgKyB4TWFyZ2luKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0TGVmdCA9IHggPT0gXCJjZW50ZXJcIiA/IHJlY3QubGVmdCArIChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0KSAvIDIgLSAoYm91bmRpbmcucmlnaHQgLSBib3VuZGluZy5sZWZ0KSAvIDIgOlxuICAgICAgICAgICAgICAgICAgICAoeCA9PSBcInN0YXJ0XCIpID09IGx0ciA/IHJlY3QubGVmdCAtIHhNYXJnaW4gOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5yaWdodCAtIChib3VuZGluZy5yaWdodCAtIGJvdW5kaW5nLmxlZnQpICsgeE1hcmdpbjtcbiAgICAgICAgICAgICAgICBtb3ZlWCA9IHRhcmdldExlZnQgLSBib3VuZGluZy5sZWZ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vdmVYIHx8IG1vdmVZKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRvcCkge1xuICAgICAgICAgICAgICAgICAgICB3aW4uc2Nyb2xsQnkobW92ZVgsIG1vdmVZKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtb3ZlZFggPSAwLCBtb3ZlZFkgPSAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW92ZVkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IGN1ci5zY3JvbGxUb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXIuc2Nyb2xsVG9wICs9IG1vdmVZIC8gc2NhbGVZO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZWRZID0gKGN1ci5zY3JvbGxUb3AgLSBzdGFydCkgKiBzY2FsZVk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVYKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBjdXIuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ci5zY3JvbGxMZWZ0ICs9IG1vdmVYIC8gc2NhbGVYO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZWRYID0gKGN1ci5zY3JvbGxMZWZ0IC0gc3RhcnQpICogc2NhbGVYO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlY3QgPSB7IGxlZnQ6IHJlY3QubGVmdCAtIG1vdmVkWCwgdG9wOiByZWN0LnRvcCAtIG1vdmVkWSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0IC0gbW92ZWRYLCBib3R0b206IHJlY3QuYm90dG9tIC0gbW92ZWRZIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlZFggJiYgTWF0aC5hYnMobW92ZWRYIC0gbW92ZVgpIDwgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBcIm5lYXJlc3RcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVkWSAmJiBNYXRoLmFicyhtb3ZlZFkgLSBtb3ZlWSkgPCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFwibmVhcmVzdFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b3ApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAocmVjdC50b3AgPCBib3VuZGluZy50b3AgfHwgcmVjdC5ib3R0b20gPiBib3VuZGluZy5ib3R0b20gfHxcbiAgICAgICAgICAgICAgICByZWN0LmxlZnQgPCBib3VuZGluZy5sZWZ0IHx8IHJlY3QucmlnaHQgPiBib3VuZGluZy5yaWdodClcbiAgICAgICAgICAgICAgICByZWN0ID0geyBsZWZ0OiBNYXRoLm1heChyZWN0LmxlZnQsIGJvdW5kaW5nLmxlZnQpLCByaWdodDogTWF0aC5taW4ocmVjdC5yaWdodCwgYm91bmRpbmcucmlnaHQpLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IE1hdGgubWF4KHJlY3QudG9wLCBib3VuZGluZy50b3ApLCBib3R0b206IE1hdGgubWluKHJlY3QuYm90dG9tLCBib3VuZGluZy5ib3R0b20pIH07XG4gICAgICAgICAgICBjdXIgPSBjdXIuYXNzaWduZWRTbG90IHx8IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1ci5ub2RlVHlwZSA9PSAxMSkgeyAvLyBBIHNoYWRvdyByb290XG4gICAgICAgICAgICBjdXIgPSBjdXIuaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2Nyb2xsYWJsZVBhcmVudHMoZG9tKSB7XG4gICAgbGV0IGRvYyA9IGRvbS5vd25lckRvY3VtZW50LCB4LCB5O1xuICAgIGZvciAobGV0IGN1ciA9IGRvbS5wYXJlbnROb2RlOyBjdXI7KSB7XG4gICAgICAgIGlmIChjdXIgPT0gZG9jLmJvZHkgfHwgKHggJiYgeSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1ci5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICBpZiAoIXkgJiYgY3VyLnNjcm9sbEhlaWdodCA+IGN1ci5jbGllbnRIZWlnaHQpXG4gICAgICAgICAgICAgICAgeSA9IGN1cjtcbiAgICAgICAgICAgIGlmICgheCAmJiBjdXIuc2Nyb2xsV2lkdGggPiBjdXIuY2xpZW50V2lkdGgpXG4gICAgICAgICAgICAgICAgeCA9IGN1cjtcbiAgICAgICAgICAgIGN1ciA9IGN1ci5hc3NpZ25lZFNsb3QgfHwgY3VyLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VyLm5vZGVUeXBlID09IDExKSB7XG4gICAgICAgICAgICBjdXIgPSBjdXIuaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHgsIHkgfTtcbn1cbmNsYXNzIERPTVNlbGVjdGlvblN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hbmNob3JOb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbmNob3JPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmZvY3VzTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9jdXNPZmZzZXQgPSAwO1xuICAgIH1cbiAgICBlcShkb21TZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5jaG9yTm9kZSA9PSBkb21TZWwuYW5jaG9yTm9kZSAmJiB0aGlzLmFuY2hvck9mZnNldCA9PSBkb21TZWwuYW5jaG9yT2Zmc2V0ICYmXG4gICAgICAgICAgICB0aGlzLmZvY3VzTm9kZSA9PSBkb21TZWwuZm9jdXNOb2RlICYmIHRoaXMuZm9jdXNPZmZzZXQgPT0gZG9tU2VsLmZvY3VzT2Zmc2V0O1xuICAgIH1cbiAgICBzZXRSYW5nZShyYW5nZSkge1xuICAgICAgICBsZXQgeyBhbmNob3JOb2RlLCBmb2N1c05vZGUgfSA9IHJhbmdlO1xuICAgICAgICAvLyBDbGlwIG9mZnNldHMgdG8gbm9kZSBzaXplIHRvIGF2b2lkIGNyYXNoZXMgd2hlbiBTYWZhcmkgcmVwb3J0cyBib2d1cyBvZmZzZXRzICgjMTE1MilcbiAgICAgICAgdGhpcy5zZXQoYW5jaG9yTm9kZSwgTWF0aC5taW4ocmFuZ2UuYW5jaG9yT2Zmc2V0LCBhbmNob3JOb2RlID8gbWF4T2Zmc2V0KGFuY2hvck5vZGUpIDogMCksIGZvY3VzTm9kZSwgTWF0aC5taW4ocmFuZ2UuZm9jdXNPZmZzZXQsIGZvY3VzTm9kZSA/IG1heE9mZnNldChmb2N1c05vZGUpIDogMCkpO1xuICAgIH1cbiAgICBzZXQoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IGFuY2hvck5vZGU7XG4gICAgICAgIHRoaXMuYW5jaG9yT2Zmc2V0ID0gYW5jaG9yT2Zmc2V0O1xuICAgICAgICB0aGlzLmZvY3VzTm9kZSA9IGZvY3VzTm9kZTtcbiAgICAgICAgdGhpcy5mb2N1c09mZnNldCA9IGZvY3VzT2Zmc2V0O1xuICAgIH1cbn1cbmxldCBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gbnVsbDtcbi8vIEZlYXR1cmUtZGV0ZWN0cyBzdXBwb3J0IGZvciAuZm9jdXMoe3ByZXZlbnRTY3JvbGw6IHRydWV9KSwgYW5kIHVzZXNcbi8vIGEgZmFsbGJhY2sga2x1ZGdlIHdoZW4gbm90IHN1cHBvcnRlZC5cbmZ1bmN0aW9uIGZvY3VzUHJldmVudFNjcm9sbChkb20pIHtcbiAgICBpZiAoZG9tLnNldEFjdGl2ZSlcbiAgICAgICAgcmV0dXJuIGRvbS5zZXRBY3RpdmUoKTsgLy8gaW4gSUVcbiAgICBpZiAocHJldmVudFNjcm9sbFN1cHBvcnRlZClcbiAgICAgICAgcmV0dXJuIGRvbS5mb2N1cyhwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkKTtcbiAgICBsZXQgc3RhY2sgPSBbXTtcbiAgICBmb3IgKGxldCBjdXIgPSBkb207IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgc3RhY2sucHVzaChjdXIsIGN1ci5zY3JvbGxUb3AsIGN1ci5zY3JvbGxMZWZ0KTtcbiAgICAgICAgaWYgKGN1ciA9PSBjdXIub3duZXJEb2N1bWVudClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCA9PSBudWxsID8ge1xuICAgICAgICBnZXQgcHJldmVudFNjcm9sbCgpIHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSB7IHByZXZlbnRTY3JvbGw6IHRydWUgfTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKCFwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkKSB7XG4gICAgICAgIHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgZWx0ID0gc3RhY2tbaSsrXSwgdG9wID0gc3RhY2tbaSsrXSwgbGVmdCA9IHN0YWNrW2krK107XG4gICAgICAgICAgICBpZiAoZWx0LnNjcm9sbFRvcCAhPSB0b3ApXG4gICAgICAgICAgICAgICAgZWx0LnNjcm9sbFRvcCA9IHRvcDtcbiAgICAgICAgICAgIGlmIChlbHQuc2Nyb2xsTGVmdCAhPSBsZWZ0KVxuICAgICAgICAgICAgICAgIGVsdC5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmxldCBzY3JhdGNoUmFuZ2U7XG5mdW5jdGlvbiB0ZXh0UmFuZ2Uobm9kZSwgZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgbGV0IHJhbmdlID0gc2NyYXRjaFJhbmdlIHx8IChzY3JhdGNoUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpKTtcbiAgICByYW5nZS5zZXRFbmQobm9kZSwgdG8pO1xuICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGZyb20pO1xuICAgIHJldHVybiByYW5nZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoS2V5KGVsdCwgbmFtZSwgY29kZSwgbW9kcykge1xuICAgIGxldCBvcHRpb25zID0geyBrZXk6IG5hbWUsIGNvZGU6IG5hbWUsIGtleUNvZGU6IGNvZGUsIHdoaWNoOiBjb2RlLCBjYW5jZWxhYmxlOiB0cnVlIH07XG4gICAgaWYgKG1vZHMpXG4gICAgICAgICh7IGFsdEtleTogb3B0aW9ucy5hbHRLZXksIGN0cmxLZXk6IG9wdGlvbnMuY3RybEtleSwgc2hpZnRLZXk6IG9wdGlvbnMuc2hpZnRLZXksIG1ldGFLZXk6IG9wdGlvbnMubWV0YUtleSB9ID0gbW9kcyk7XG4gICAgbGV0IGRvd24gPSBuZXcgS2V5Ym9hcmRFdmVudChcImtleWRvd25cIiwgb3B0aW9ucyk7XG4gICAgZG93bi5zeW50aGV0aWMgPSB0cnVlO1xuICAgIGVsdC5kaXNwYXRjaEV2ZW50KGRvd24pO1xuICAgIGxldCB1cCA9IG5ldyBLZXlib2FyZEV2ZW50KFwia2V5dXBcIiwgb3B0aW9ucyk7XG4gICAgdXAuc3ludGhldGljID0gdHJ1ZTtcbiAgICBlbHQuZGlzcGF0Y2hFdmVudCh1cCk7XG4gICAgcmV0dXJuIGRvd24uZGVmYXVsdFByZXZlbnRlZCB8fCB1cC5kZWZhdWx0UHJldmVudGVkO1xufVxuZnVuY3Rpb24gZ2V0Um9vdChub2RlKSB7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgJiYgKG5vZGUubm9kZVR5cGUgPT0gOSB8fCBub2RlLm5vZGVUeXBlID09IDExICYmIG5vZGUuaG9zdCkpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuYXNzaWduZWRTbG90IHx8IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjbGVhckF0dHJpYnV0ZXMobm9kZSkge1xuICAgIHdoaWxlIChub2RlLmF0dHJpYnV0ZXMubGVuZ3RoKVxuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZU5vZGUobm9kZS5hdHRyaWJ1dGVzWzBdKTtcbn1cbmZ1bmN0aW9uIGF0RWxlbWVudFN0YXJ0KGRvYywgc2VsZWN0aW9uKSB7XG4gICAgbGV0IG5vZGUgPSBzZWxlY3Rpb24uZm9jdXNOb2RlLCBvZmZzZXQgPSBzZWxlY3Rpb24uZm9jdXNPZmZzZXQ7XG4gICAgaWYgKCFub2RlIHx8IHNlbGVjdGlvbi5hbmNob3JOb2RlICE9IG5vZGUgfHwgc2VsZWN0aW9uLmFuY2hvck9mZnNldCAhPSBvZmZzZXQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBTYWZhcmkgY2FuIHJlcG9ydCBib2d1cyBvZmZzZXRzICgjMTE1MilcbiAgICBvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIG1heE9mZnNldChub2RlKSk7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAob2Zmc2V0KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgaWYgKHByZXYuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICBvZmZzZXQtLTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBwcmV2O1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IG1heE9mZnNldChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlID09IGRvYykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBpc1Njcm9sbGVkVG9Cb3R0b20oZWx0KSB7XG4gICAgcmV0dXJuIGVsdC5zY3JvbGxUb3AgPiBNYXRoLm1heCgxLCBlbHQuc2Nyb2xsSGVpZ2h0IC0gZWx0LmNsaWVudEhlaWdodCAtIDQpO1xufVxuZnVuY3Rpb24gdGV4dE5vZGVCZWZvcmUoc3RhcnROb2RlLCBzdGFydE9mZnNldCkge1xuICAgIGZvciAobGV0IG5vZGUgPSBzdGFydE5vZGUsIG9mZnNldCA9IHN0YXJ0T2Zmc2V0OzspIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiBvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiBub2RlLCBvZmZzZXQ6IG9mZnNldCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgIG9mZnNldCA9IG1heE9mZnNldChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgJiYgIWlzQmxvY2tFbGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHRleHROb2RlQWZ0ZXIoc3RhcnROb2RlLCBzdGFydE9mZnNldCkge1xuICAgIGZvciAobGV0IG5vZGUgPSBzdGFydE5vZGUsIG9mZnNldCA9IHN0YXJ0T2Zmc2V0OzspIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiBvZmZzZXQgPCBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IG5vZGUsIG9mZnNldDogb2Zmc2V0IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUucGFyZW50Tm9kZSAmJiAhaXNCbG9ja0VsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IGRvbUluZGV4KG5vZGUpICsgMTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgRE9NUG9zIHtcbiAgICBjb25zdHJ1Y3Rvcihub2RlLCBvZmZzZXQsIHByZWNpc2UgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLnByZWNpc2UgPSBwcmVjaXNlO1xuICAgIH1cbiAgICBzdGF0aWMgYmVmb3JlKGRvbSwgcHJlY2lzZSkgeyByZXR1cm4gbmV3IERPTVBvcyhkb20ucGFyZW50Tm9kZSwgZG9tSW5kZXgoZG9tKSwgcHJlY2lzZSk7IH1cbiAgICBzdGF0aWMgYWZ0ZXIoZG9tLCBwcmVjaXNlKSB7IHJldHVybiBuZXcgRE9NUG9zKGRvbS5wYXJlbnROb2RlLCBkb21JbmRleChkb20pICsgMSwgcHJlY2lzZSk7IH1cbn1cbmNvbnN0IG5vQ2hpbGRyZW4gPSBbXTtcbmNsYXNzIENvbnRlbnRWaWV3IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmRvbSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICB9XG4gICAgZ2V0IG92ZXJyaWRlRE9NVGV4dCgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBnZXQgcG9zQXRTdGFydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQucG9zQmVmb3JlKHRoaXMpIDogMDtcbiAgICB9XG4gICAgZ2V0IHBvc0F0RW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgdGhpcy5sZW5ndGg7XG4gICAgfVxuICAgIHBvc0JlZm9yZSh2aWV3KSB7XG4gICAgICAgIGxldCBwb3MgPSB0aGlzLnBvc0F0U3RhcnQ7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZCA9PSB2aWV3KVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgICBwb3MgKz0gY2hpbGQubGVuZ3RoICsgY2hpbGQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgY2hpbGQgaW4gcG9zQmVmb3JlXCIpO1xuICAgIH1cbiAgICBwb3NBZnRlcih2aWV3KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc0JlZm9yZSh2aWV3KSArIHZpZXcubGVuZ3RoO1xuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmZsYWdzICYgMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi8pIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmRvbTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gbnVsbCwgbmV4dDtcbiAgICAgICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZmxhZ3MgJiA3IC8qIFZpZXdGbGFnLkRpcnR5ICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuZG9tICYmIChuZXh0ID0gcHJldiA/IHByZXYubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50VmlldyA9IENvbnRlbnRWaWV3LmdldChuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudFZpZXcgfHwgIWNvbnRlbnRWaWV3LnBhcmVudCAmJiBjb250ZW50Vmlldy5jYW5SZXVzZURPTShjaGlsZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucmV1c2VET00obmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmZsYWdzICY9IH43IC8qIFZpZXdGbGFnLkRpcnR5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXh0ID0gcHJldiA/IHByZXYubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2sgJiYgIXRyYWNrLndyaXR0ZW4gJiYgdHJhY2subm9kZSA9PSBwYXJlbnQgJiYgbmV4dCAhPSBjaGlsZC5kb20pXG4gICAgICAgICAgICAgICAgICAgIHRyYWNrLndyaXR0ZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5kb20ucGFyZW50Tm9kZSA9PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5leHQgJiYgbmV4dCAhPSBjaGlsZC5kb20pXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gcm0kMShuZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQuZG9tLCBuZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJldiA9IGNoaWxkLmRvbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHQgPSBwcmV2ID8gcHJldi5uZXh0U2libGluZyA6IHBhcmVudC5maXJzdENoaWxkO1xuICAgICAgICAgICAgaWYgKG5leHQgJiYgdHJhY2sgJiYgdHJhY2subm9kZSA9PSBwYXJlbnQpXG4gICAgICAgICAgICAgICAgdHJhY2sud3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICB3aGlsZSAobmV4dClcbiAgICAgICAgICAgICAgICBuZXh0ID0gcm0kMShuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZsYWdzICYgMSAvKiBWaWV3RmxhZy5DaGlsZERpcnR5ICovKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmZsYWdzICY9IH43IC8qIFZpZXdGbGFnLkRpcnR5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXVzZURPTShfZG9tKSB7IH1cbiAgICBsb2NhbFBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBhZnRlcjtcbiAgICAgICAgaWYgKG5vZGUgPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgIGFmdGVyID0gdGhpcy5kb20uY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGJpYXMgPSBtYXhPZmZzZXQobm9kZSkgPT0gMCA/IDAgOiBvZmZzZXQgPT0gMCA/IC0xIDogMTtcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gdGhpcy5kb20pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChiaWFzID09IDAgJiYgcGFyZW50LmZpcnN0Q2hpbGQgIT0gcGFyZW50Lmxhc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYmlhcyA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmlhcyA8IDApXG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBub2RlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGFmdGVyID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWZ0ZXIgPT0gdGhpcy5kb20uZmlyc3RDaGlsZClcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB3aGlsZSAoYWZ0ZXIgJiYgIUNvbnRlbnRWaWV3LmdldChhZnRlcikpXG4gICAgICAgICAgICBhZnRlciA9IGFmdGVyLm5leHRTaWJsaW5nO1xuICAgICAgICBpZiAoIWFmdGVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjaGlsZC5kb20gPT0gYWZ0ZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgICAgIHBvcyArPSBjaGlsZC5sZW5ndGggKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZChmcm9tLCB0bywgb2Zmc2V0ID0gMCkge1xuICAgICAgICBsZXQgZnJvbUkgPSAtMSwgZnJvbVN0YXJ0ID0gLTEsIHRvSSA9IC0xLCB0b0VuZCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gb2Zmc2V0LCBwcmV2RW5kID0gb2Zmc2V0OyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHBvcyA8IGZyb20gJiYgZW5kID4gdG8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmRvbUJvdW5kc0Fyb3VuZChmcm9tLCB0bywgcG9zKTtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gZnJvbSAmJiBmcm9tSSA9PSAtMSkge1xuICAgICAgICAgICAgICAgIGZyb21JID0gaTtcbiAgICAgICAgICAgICAgICBmcm9tU3RhcnQgPSBwb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zID4gdG8gJiYgY2hpbGQuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICB0b0kgPSBpO1xuICAgICAgICAgICAgICAgIHRvRW5kID0gcHJldkVuZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZFbmQgPSBlbmQ7XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZyb206IGZyb21TdGFydCwgdG86IHRvRW5kIDwgMCA/IG9mZnNldCArIHRoaXMubGVuZ3RoIDogdG9FbmQsXG4gICAgICAgICAgICBzdGFydERPTTogKGZyb21JID8gdGhpcy5jaGlsZHJlbltmcm9tSSAtIDFdLmRvbS5uZXh0U2libGluZyA6IG51bGwpIHx8IHRoaXMuZG9tLmZpcnN0Q2hpbGQsXG4gICAgICAgICAgICBlbmRET006IHRvSSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoICYmIHRvSSA+PSAwID8gdGhpcy5jaGlsZHJlblt0b0ldLmRvbSA6IG51bGwgfTtcbiAgICB9XG4gICAgbWFya0RpcnR5KGFuZFBhcmVudCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZmxhZ3MgfD0gMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi87XG4gICAgICAgIHRoaXMubWFya1BhcmVudHNEaXJ0eShhbmRQYXJlbnQpO1xuICAgIH1cbiAgICBtYXJrUGFyZW50c0RpcnR5KGNoaWxkTGlzdCkge1xuICAgICAgICBmb3IgKGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudDsgcGFyZW50OyBwYXJlbnQgPSBwYXJlbnQucGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoY2hpbGRMaXN0KVxuICAgICAgICAgICAgICAgIHBhcmVudC5mbGFncyB8PSAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgICAgIGlmIChwYXJlbnQuZmxhZ3MgJiAxIC8qIFZpZXdGbGFnLkNoaWxkRGlydHkgKi8pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgcGFyZW50LmZsYWdzIHw9IDEgLyogVmlld0ZsYWcuQ2hpbGREaXJ0eSAqLztcbiAgICAgICAgICAgIGNoaWxkTGlzdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFBhcmVudChwYXJlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50ICE9IHBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICBpZiAodGhpcy5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrUGFyZW50c0RpcnR5KHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldERPTShkb20pIHtcbiAgICAgICAgaWYgKHRoaXMuZG9tID09IGRvbSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy5kb20uY21WaWV3ID0gbnVsbDtcbiAgICAgICAgdGhpcy5kb20gPSBkb207XG4gICAgICAgIGRvbS5jbVZpZXcgPSB0aGlzO1xuICAgIH1cbiAgICBnZXQgcm9vdFZpZXcoKSB7XG4gICAgICAgIGZvciAobGV0IHYgPSB0aGlzOzspIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB2LnBhcmVudDtcbiAgICAgICAgICAgIGlmICghcGFyZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgdiA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlQ2hpbGRyZW4oZnJvbSwgdG8sIGNoaWxkcmVuID0gbm9DaGlsZHJlbikge1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAoY2hpbGQucGFyZW50ID09IHRoaXMgJiYgY2hpbGRyZW4uaW5kZXhPZihjaGlsZCkgPCAwKVxuICAgICAgICAgICAgICAgIGNoaWxkLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoIDwgMjUwKVxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoZnJvbSwgdG8gLSBmcm9tLCAuLi5jaGlsZHJlbik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXS5jb25jYXQodGhpcy5jaGlsZHJlbi5zbGljZSgwLCBmcm9tKSwgY2hpbGRyZW4sIHRoaXMuY2hpbGRyZW4uc2xpY2UodG8pKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGNoaWxkcmVuW2ldLnNldFBhcmVudCh0aGlzKTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24oX3JlYykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZ25vcmVFdmVudChfZXZlbnQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY2hpbGRDdXJzb3IocG9zID0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGlsZEN1cnNvcih0aGlzLmNoaWxkcmVuLCBwb3MsIHRoaXMuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICB9XG4gICAgY2hpbGRQb3MocG9zLCBiaWFzID0gMSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZEN1cnNvcigpLmZpbmRQb3MocG9zLCBiaWFzKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBuYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLnJlcGxhY2UoXCJWaWV3XCIsIFwiXCIpO1xuICAgICAgICByZXR1cm4gbmFtZSArICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA/IFwiKFwiICsgdGhpcy5jaGlsZHJlbi5qb2luKCkgKyBcIilcIiA6XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA/IFwiW1wiICsgKG5hbWUgPT0gXCJUZXh0XCIgPyB0aGlzLnRleHQgOiB0aGlzLmxlbmd0aCkgKyBcIl1cIiA6IFwiXCIpICtcbiAgICAgICAgICAgICh0aGlzLmJyZWFrQWZ0ZXIgPyBcIiNcIiA6IFwiXCIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0KG5vZGUpIHsgcmV0dXJuIG5vZGUuY21WaWV3OyB9XG4gICAgZ2V0IGlzRWRpdGFibGUoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IGlzV2lkZ2V0KCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIGhhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBiZWNvbWUob3RoZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY2FuUmV1c2VET00ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyLmNvbnN0cnVjdG9yID09IHRoaXMuY29uc3RydWN0b3IgJiYgISgodGhpcy5mbGFncyB8IG90aGVyLmZsYWdzKSAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pO1xuICAgIH1cbiAgICAvLyBXaGVuIHRoaXMgaXMgYSB6ZXJvLWxlbmd0aCB2aWV3IHdpdGggYSBzaWRlLCB0aGlzIHNob3VsZCByZXR1cm4gYVxuICAgIC8vIG51bWJlciA8PSAwIHRvIGluZGljYXRlIGl0IGlzIGJlZm9yZSBpdHMgcG9zaXRpb24sIG9yIGFcbiAgICAvLyBudW1iZXIgPiAwIHdoZW4gYWZ0ZXIgaXRzIHBvc2l0aW9uLlxuICAgIGdldFNpZGUoKSB7IHJldHVybiAwOyB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgIGlmIChjaGlsZC5wYXJlbnQgPT0gdGhpcylcbiAgICAgICAgICAgICAgICBjaGlsZC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICB9XG59XG5Db250ZW50Vmlldy5wcm90b3R5cGUuYnJlYWtBZnRlciA9IDA7XG4vLyBSZW1vdmUgYSBET00gbm9kZSBhbmQgcmV0dXJuIGl0cyBuZXh0IHNpYmxpbmcuXG5mdW5jdGlvbiBybSQxKGRvbSkge1xuICAgIGxldCBuZXh0ID0gZG9tLm5leHRTaWJsaW5nO1xuICAgIGRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbSk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG5jbGFzcyBDaGlsZEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoY2hpbGRyZW4sIHBvcywgaSkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmkgPSBpO1xuICAgICAgICB0aGlzLm9mZiA9IDA7XG4gICAgfVxuICAgIGZpbmRQb3MocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAocG9zID4gdGhpcy5wb3MgfHwgcG9zID09IHRoaXMucG9zICYmXG4gICAgICAgICAgICAgICAgKGJpYXMgPiAwIHx8IHRoaXMuaSA9PSAwIHx8IHRoaXMuY2hpbGRyZW5bdGhpcy5pIC0gMV0uYnJlYWtBZnRlcikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZiA9IHBvcyAtIHRoaXMucG9zO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmNoaWxkcmVuWy0tdGhpcy5pXTtcbiAgICAgICAgICAgIHRoaXMucG9zIC09IG5leHQubGVuZ3RoICsgbmV4dC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcmVwbGFjZVJhbmdlKHBhcmVudCwgZnJvbUksIGZyb21PZmYsIHRvSSwgdG9PZmYsIGluc2VydCwgYnJlYWtBdFN0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICBsZXQgeyBjaGlsZHJlbiB9ID0gcGFyZW50O1xuICAgIGxldCBiZWZvcmUgPSBjaGlsZHJlbi5sZW5ndGggPyBjaGlsZHJlbltmcm9tSV0gOiBudWxsO1xuICAgIGxldCBsYXN0ID0gaW5zZXJ0Lmxlbmd0aCA/IGluc2VydFtpbnNlcnQubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgIGxldCBicmVha0F0RW5kID0gbGFzdCA/IGxhc3QuYnJlYWtBZnRlciA6IGJyZWFrQXRTdGFydDtcbiAgICAvLyBDaGFuZ2Ugd2l0aGluIGEgc2luZ2xlIGNoaWxkXG4gICAgaWYgKGZyb21JID09IHRvSSAmJiBiZWZvcmUgJiYgIWJyZWFrQXRTdGFydCAmJiAhYnJlYWtBdEVuZCAmJiBpbnNlcnQubGVuZ3RoIDwgMiAmJlxuICAgICAgICBiZWZvcmUubWVyZ2UoZnJvbU9mZiwgdG9PZmYsIGluc2VydC5sZW5ndGggPyBsYXN0IDogbnVsbCwgZnJvbU9mZiA9PSAwLCBvcGVuU3RhcnQsIG9wZW5FbmQpKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKHRvSSA8IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBsZXQgYWZ0ZXIgPSBjaGlsZHJlblt0b0ldO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGVuZCBvZiB0aGUgY2hpbGQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyBwcmVzZXJ2ZWQgaW4gYGFmdGVyYFxuICAgICAgICBpZiAoYWZ0ZXIgJiYgKHRvT2ZmIDwgYWZ0ZXIubGVuZ3RoIHx8IGFmdGVyLmJyZWFrQWZ0ZXIgJiYgKGxhc3QgPT09IG51bGwgfHwgbGFzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGFzdC5icmVha0FmdGVyKSkpIHtcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIHNwbGl0dGluZyBhIGNoaWxkLCBzZXBhcmF0ZSBwYXJ0IG9mIGl0IHRvIGF2b2lkIHRoYXRcbiAgICAgICAgICAgIC8vIGJlaW5nIG1hbmdsZWQgd2hlbiB1cGRhdGluZyB0aGUgY2hpbGQgYmVmb3JlIHRoZSB1cGRhdGUuXG4gICAgICAgICAgICBpZiAoZnJvbUkgPT0gdG9JKSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci5zcGxpdCh0b09mZik7XG4gICAgICAgICAgICAgICAgdG9PZmYgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIHJlcGxhY2VtZW50IHNob3VsZCBiZSBtZXJnZWQgd2l0aFxuICAgICAgICAgICAgLy8gdGhlIGxhc3QgcmVwbGFjaW5nIGVsZW1lbnQsIHVwZGF0ZSBgY29udGVudGBcbiAgICAgICAgICAgIGlmICghYnJlYWtBdEVuZCAmJiBsYXN0ICYmIGFmdGVyLm1lcmdlKDAsIHRvT2ZmLCBsYXN0LCB0cnVlLCAwLCBvcGVuRW5kKSkge1xuICAgICAgICAgICAgICAgIGluc2VydFtpbnNlcnQubGVuZ3RoIC0gMV0gPSBhZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3RhcnQgb2YgdGhlIGFmdGVyIGVsZW1lbnQsIGlmIG5lY2Vzc2FyeSwgYW5kXG4gICAgICAgICAgICAgICAgLy8gYWRkIGl0IHRvIGBjb250ZW50YC5cbiAgICAgICAgICAgICAgICBpZiAodG9PZmYgfHwgYWZ0ZXIuY2hpbGRyZW4ubGVuZ3RoICYmICFhZnRlci5jaGlsZHJlblswXS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyLm1lcmdlKDAsIHRvT2ZmLCBudWxsLCBmYWxzZSwgMCwgb3BlbkVuZCk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0LnB1c2goYWZ0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFmdGVyID09PSBudWxsIHx8IGFmdGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZnRlci5icmVha0FmdGVyKSB7XG4gICAgICAgICAgICAvLyBUaGUgZWxlbWVudCBhdCBgdG9JYCBpcyBlbnRpcmVseSBjb3ZlcmVkIGJ5IHRoaXMgcmFuZ2UuXG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSBpdHMgbGluZSBicmVhaywgaWYgYW55LlxuICAgICAgICAgICAgaWYgKGxhc3QpXG4gICAgICAgICAgICAgICAgbGFzdC5icmVha0FmdGVyID0gMTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBicmVha0F0U3RhcnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmNlIHdlJ3ZlIGhhbmRsZWQgdGhlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBjdXJyZW50IGVsZW1lbnRzXG4gICAgICAgIC8vIG5vdywgbWFrZSBzdXJlIGB0b0lgIHBvaW50cyBhZnRlciB0aGF0LlxuICAgICAgICB0b0krKztcbiAgICB9XG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgICBiZWZvcmUuYnJlYWtBZnRlciA9IGJyZWFrQXRTdGFydDtcbiAgICAgICAgaWYgKGZyb21PZmYgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWJyZWFrQXRTdGFydCAmJiBpbnNlcnQubGVuZ3RoICYmIGJlZm9yZS5tZXJnZShmcm9tT2ZmLCBiZWZvcmUubGVuZ3RoLCBpbnNlcnRbMF0sIGZhbHNlLCBvcGVuU3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlLmJyZWFrQWZ0ZXIgPSBpbnNlcnQuc2hpZnQoKS5icmVha0FmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZnJvbU9mZiA8IGJlZm9yZS5sZW5ndGggfHwgYmVmb3JlLmNoaWxkcmVuLmxlbmd0aCAmJiBiZWZvcmUuY2hpbGRyZW5bYmVmb3JlLmNoaWxkcmVuLmxlbmd0aCAtIDFdLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlLm1lcmdlKGZyb21PZmYsIGJlZm9yZS5sZW5ndGgsIG51bGwsIGZhbHNlLCBvcGVuU3RhcnQsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnJvbUkrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gbWVyZ2Ugd2lkZ2V0cyBvbiB0aGUgYm91bmRhcmllcyBvZiB0aGUgcmVwbGFjZW1lbnRcbiAgICB3aGlsZSAoZnJvbUkgPCB0b0kgJiYgaW5zZXJ0Lmxlbmd0aCkge1xuICAgICAgICBpZiAoY2hpbGRyZW5bdG9JIC0gMV0uYmVjb21lKGluc2VydFtpbnNlcnQubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgICAgICB0b0ktLTtcbiAgICAgICAgICAgIGluc2VydC5wb3AoKTtcbiAgICAgICAgICAgIG9wZW5FbmQgPSBpbnNlcnQubGVuZ3RoID8gMCA6IG9wZW5TdGFydDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaGlsZHJlbltmcm9tSV0uYmVjb21lKGluc2VydFswXSkpIHtcbiAgICAgICAgICAgIGZyb21JKys7XG4gICAgICAgICAgICBpbnNlcnQuc2hpZnQoKTtcbiAgICAgICAgICAgIG9wZW5TdGFydCA9IGluc2VydC5sZW5ndGggPyAwIDogb3BlbkVuZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghaW5zZXJ0Lmxlbmd0aCAmJiBmcm9tSSAmJiB0b0kgPCBjaGlsZHJlbi5sZW5ndGggJiYgIWNoaWxkcmVuW2Zyb21JIC0gMV0uYnJlYWtBZnRlciAmJlxuICAgICAgICBjaGlsZHJlblt0b0ldLm1lcmdlKDAsIDAsIGNoaWxkcmVuW2Zyb21JIC0gMV0sIGZhbHNlLCBvcGVuU3RhcnQsIG9wZW5FbmQpKVxuICAgICAgICBmcm9tSS0tO1xuICAgIGlmIChmcm9tSSA8IHRvSSB8fCBpbnNlcnQubGVuZ3RoKVxuICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkcmVuKGZyb21JLCB0b0ksIGluc2VydCk7XG59XG5mdW5jdGlvbiBtZXJnZUNoaWxkcmVuSW50byhwYXJlbnQsIGZyb20sIHRvLCBpbnNlcnQsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgIGxldCBjdXIgPSBwYXJlbnQuY2hpbGRDdXJzb3IoKTtcbiAgICBsZXQgeyBpOiB0b0ksIG9mZjogdG9PZmYgfSA9IGN1ci5maW5kUG9zKHRvLCAxKTtcbiAgICBsZXQgeyBpOiBmcm9tSSwgb2ZmOiBmcm9tT2ZmIH0gPSBjdXIuZmluZFBvcyhmcm9tLCAtMSk7XG4gICAgbGV0IGRMZW4gPSBmcm9tIC0gdG87XG4gICAgZm9yIChsZXQgdmlldyBvZiBpbnNlcnQpXG4gICAgICAgIGRMZW4gKz0gdmlldy5sZW5ndGg7XG4gICAgcGFyZW50Lmxlbmd0aCArPSBkTGVuO1xuICAgIHJlcGxhY2VSYW5nZShwYXJlbnQsIGZyb21JLCBmcm9tT2ZmLCB0b0ksIHRvT2ZmLCBpbnNlcnQsIDAsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG59XG5cbmxldCBuYXYgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IgOiB7IHVzZXJBZ2VudDogXCJcIiwgdmVuZG9yOiBcIlwiLCBwbGF0Zm9ybTogXCJcIiB9O1xubGV0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiID8gZG9jdW1lbnQgOiB7IGRvY3VtZW50RWxlbWVudDogeyBzdHlsZToge30gfSB9O1xuY29uc3QgaWVfZWRnZSA9IC8qQF9fUFVSRV9fKi8vRWRnZVxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KTtcbmNvbnN0IGllX3VwdG8xMCA9IC8qQF9fUFVSRV9fKi8vTVNJRSBcXGQvLnRlc3QobmF2LnVzZXJBZ2VudCk7XG5jb25zdCBpZV8xMXVwID0gLypAX19QVVJFX18qLy9UcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KTtcbmNvbnN0IGllID0gISEoaWVfdXB0bzEwIHx8IGllXzExdXAgfHwgaWVfZWRnZSk7XG5jb25zdCBnZWNrbyA9ICFpZSAmJiAvKkBfX1BVUkVfXyovL2dlY2tvXFwvKFxcZCspL2kudGVzdChuYXYudXNlckFnZW50KTtcbmNvbnN0IGNocm9tZSA9ICFpZSAmJiAvKkBfX1BVUkVfXyovL0Nocm9tZVxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KTtcbmNvbnN0IHdlYmtpdCA9IFwid2Via2l0Rm9udFNtb290aGluZ1wiIGluIGRvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG5jb25zdCBzYWZhcmkgPSAhaWUgJiYgLypAX19QVVJFX18qLy9BcHBsZSBDb21wdXRlci8udGVzdChuYXYudmVuZG9yKTtcbmNvbnN0IGlvcyA9IHNhZmFyaSAmJiAoLypAX19QVVJFX18qLy9Nb2JpbGVcXC9cXHcrLy50ZXN0KG5hdi51c2VyQWdlbnQpIHx8IG5hdi5tYXhUb3VjaFBvaW50cyA+IDIpO1xudmFyIGJyb3dzZXIgPSB7XG4gICAgbWFjOiBpb3MgfHwgLypAX19QVVJFX18qLy9NYWMvLnRlc3QobmF2LnBsYXRmb3JtKSxcbiAgICB3aW5kb3dzOiAvKkBfX1BVUkVfXyovL1dpbi8udGVzdChuYXYucGxhdGZvcm0pLFxuICAgIGxpbnV4OiAvKkBfX1BVUkVfXyovL0xpbnV4fFgxMS8udGVzdChuYXYucGxhdGZvcm0pLFxuICAgIGllLFxuICAgIGllX3ZlcnNpb246IGllX3VwdG8xMCA/IGRvYy5kb2N1bWVudE1vZGUgfHwgNiA6IGllXzExdXAgPyAraWVfMTF1cFsxXSA6IGllX2VkZ2UgPyAraWVfZWRnZVsxXSA6IDAsXG4gICAgZ2Vja28sXG4gICAgZ2Vja29fdmVyc2lvbjogZ2Vja28gPyArKC8qQF9fUFVSRV9fKi8vRmlyZWZveFxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KSB8fCBbMCwgMF0pWzFdIDogMCxcbiAgICBjaHJvbWU6ICEhY2hyb21lLFxuICAgIGNocm9tZV92ZXJzaW9uOiBjaHJvbWUgPyArY2hyb21lWzFdIDogMCxcbiAgICBpb3MsXG4gICAgYW5kcm9pZDogLypAX19QVVJFX18qLy9BbmRyb2lkXFxiLy50ZXN0KG5hdi51c2VyQWdlbnQpLFxuICAgIHdlYmtpdCxcbiAgICBzYWZhcmksXG4gICAgd2Via2l0X3ZlcnNpb246IHdlYmtpdCA/ICsoLypAX19QVVJFX18qLy9cXGJBcHBsZVdlYktpdFxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KSB8fCBbMCwgMF0pWzFdIDogMCxcbiAgICB0YWJTaXplOiBkb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnRhYlNpemUgIT0gbnVsbCA/IFwidGFiLXNpemVcIiA6IFwiLW1vei10YWItc2l6ZVwiXG59O1xuXG5jb25zdCBNYXhKb2luTGVuID0gMjU2O1xuY2xhc3MgVGV4dFZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3IodGV4dCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDsgfVxuICAgIGNyZWF0ZURPTSh0ZXh0RE9NKSB7XG4gICAgICAgIHRoaXMuc2V0RE9NKHRleHRET00gfHwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy50ZXh0KSk7XG4gICAgfVxuICAgIHN5bmModmlldywgdHJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSlcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRE9NKCk7XG4gICAgICAgIGlmICh0aGlzLmRvbS5ub2RlVmFsdWUgIT0gdGhpcy50ZXh0KSB7XG4gICAgICAgICAgICBpZiAodHJhY2sgJiYgdHJhY2subm9kZSA9PSB0aGlzLmRvbSlcbiAgICAgICAgICAgICAgICB0cmFjay53cml0dGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZG9tLm5vZGVWYWx1ZSA9IHRoaXMudGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXVzZURPTShkb20pIHtcbiAgICAgICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgdGhpcy5jcmVhdGVET00oZG9tKTtcbiAgICB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSkge1xuICAgICAgICBpZiAoKHRoaXMuZmxhZ3MgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKSB8fFxuICAgICAgICAgICAgc291cmNlICYmICghKHNvdXJjZSBpbnN0YW5jZW9mIFRleHRWaWV3KSB8fFxuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoIC0gKHRvIC0gZnJvbSkgKyBzb3VyY2UubGVuZ3RoID4gTWF4Sm9pbkxlbiB8fFxuICAgICAgICAgICAgICAgIChzb3VyY2UuZmxhZ3MgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5zbGljZSgwLCBmcm9tKSArIChzb3VyY2UgPyBzb3VyY2UudGV4dCA6IFwiXCIpICsgdGhpcy50ZXh0LnNsaWNlKHRvKTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNwbGl0KGZyb20pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUZXh0Vmlldyh0aGlzLnRleHQuc2xpY2UoZnJvbSkpO1xuICAgICAgICB0aGlzLnRleHQgPSB0aGlzLnRleHQuc2xpY2UoMCwgZnJvbSk7XG4gICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIHJlc3VsdC5mbGFncyB8PSB0aGlzLmZsYWdzICYgOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLztcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbm9kZSA9PSB0aGlzLmRvbSA/IG9mZnNldCA6IG9mZnNldCA/IHRoaXMudGV4dC5sZW5ndGggOiAwO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHsgcmV0dXJuIG5ldyBET01Qb3ModGhpcy5kb20sIHBvcyk7IH1cbiAgICBkb21Cb3VuZHNBcm91bmQoX2Zyb20sIF90bywgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB7IGZyb206IG9mZnNldCwgdG86IG9mZnNldCArIHRoaXMubGVuZ3RoLCBzdGFydERPTTogdGhpcy5kb20sIGVuZERPTTogdGhpcy5kb20ubmV4dFNpYmxpbmcgfTtcbiAgICB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIHJldHVybiB0ZXh0Q29vcmRzKHRoaXMuZG9tLCBwb3MsIHNpZGUpO1xuICAgIH1cbn1cbmNsYXNzIE1hcmtWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKG1hcmssIGNoaWxkcmVuID0gW10sIGxlbmd0aCA9IDApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5tYXJrID0gbWFyaztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgY2ggb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICBjaC5zZXRQYXJlbnQodGhpcyk7XG4gICAgfVxuICAgIHNldEF0dHJzKGRvbSkge1xuICAgICAgICBjbGVhckF0dHJpYnV0ZXMoZG9tKTtcbiAgICAgICAgaWYgKHRoaXMubWFyay5jbGFzcylcbiAgICAgICAgICAgIGRvbS5jbGFzc05hbWUgPSB0aGlzLm1hcmsuY2xhc3M7XG4gICAgICAgIGlmICh0aGlzLm1hcmsuYXR0cnMpXG4gICAgICAgICAgICBmb3IgKGxldCBuYW1lIGluIHRoaXMubWFyay5hdHRycylcbiAgICAgICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKG5hbWUsIHRoaXMubWFyay5hdHRyc1tuYW1lXSk7XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIGNhblJldXNlRE9NKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5jYW5SZXVzZURPTShvdGhlcikgJiYgISgodGhpcy5mbGFncyB8IG90aGVyLmZsYWdzKSAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pO1xuICAgIH1cbiAgICByZXVzZURPTShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IHRoaXMubWFyay50YWdOYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5mbGFncyB8PSA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi8gfCAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLnNldERPTSh0aGlzLnNldEF0dHJzKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5tYXJrLnRhZ05hbWUpKSk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZmxhZ3MgJiA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi8pXG4gICAgICAgICAgICB0aGlzLnNldEF0dHJzKHRoaXMuZG9tKTtcbiAgICAgICAgc3VwZXIuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIF9oYXNTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgICAgIGlmIChzb3VyY2UgJiYgKCEoc291cmNlIGluc3RhbmNlb2YgTWFya1ZpZXcgJiYgc291cmNlLm1hcmsuZXEodGhpcy5tYXJrKSkgfHxcbiAgICAgICAgICAgIChmcm9tICYmIG9wZW5TdGFydCA8PSAwKSB8fCAodG8gPCB0aGlzLmxlbmd0aCAmJiBvcGVuRW5kIDw9IDApKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbWVyZ2VDaGlsZHJlbkludG8odGhpcywgZnJvbSwgdG8sIHNvdXJjZSA/IHNvdXJjZS5jaGlsZHJlbi5zbGljZSgpIDogW10sIG9wZW5TdGFydCAtIDEsIG9wZW5FbmQgLSAxKTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNwbGl0KGZyb20pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdLCBvZmYgPSAwLCBkZXRhY2hGcm9tID0gLTEsIGkgPSAwO1xuICAgICAgICBmb3IgKGxldCBlbHQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgbGV0IGVuZCA9IG9mZiArIGVsdC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID4gZnJvbSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvZmYgPCBmcm9tID8gZWx0LnNwbGl0KGZyb20gLSBvZmYpIDogZWx0KTtcbiAgICAgICAgICAgIGlmIChkZXRhY2hGcm9tIDwgMCAmJiBvZmYgPj0gZnJvbSlcbiAgICAgICAgICAgICAgICBkZXRhY2hGcm9tID0gaTtcbiAgICAgICAgICAgIG9mZiA9IGVuZDtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGVuZ3RoID0gdGhpcy5sZW5ndGggLSBmcm9tO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGZyb207XG4gICAgICAgIGlmIChkZXRhY2hGcm9tID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gZGV0YWNoRnJvbTtcbiAgICAgICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrVmlldyh0aGlzLm1hcmssIHJlc3VsdCwgbGVuZ3RoKTtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiBpbmxpbmVET01BdFBvcyh0aGlzLCBwb3MpO1xuICAgIH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgcmV0dXJuIGNvb3Jkc0luQ2hpbGRyZW4odGhpcywgcG9zLCBzaWRlKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0ZXh0Q29vcmRzKHRleHQsIHBvcywgc2lkZSkge1xuICAgIGxldCBsZW5ndGggPSB0ZXh0Lm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgaWYgKHBvcyA+IGxlbmd0aClcbiAgICAgICAgcG9zID0gbGVuZ3RoO1xuICAgIGxldCBmcm9tID0gcG9zLCB0byA9IHBvcywgZmxhdHRlbiA9IDA7XG4gICAgaWYgKHBvcyA9PSAwICYmIHNpZGUgPCAwIHx8IHBvcyA9PSBsZW5ndGggJiYgc2lkZSA+PSAwKSB7XG4gICAgICAgIGlmICghKGJyb3dzZXIuY2hyb21lIHx8IGJyb3dzZXIuZ2Vja28pKSB7IC8vIFRoZXNlIGJyb3dzZXJzIHJlbGlhYmx5IHJldHVybiB2YWxpZCByZWN0YW5nbGVzIGZvciBlbXB0eSByYW5nZXNcbiAgICAgICAgICAgIGlmIChwb3MpIHtcbiAgICAgICAgICAgICAgICBmcm9tLS07XG4gICAgICAgICAgICAgICAgZmxhdHRlbiA9IDE7XG4gICAgICAgICAgICB9IC8vIEZJWE1FIHRoaXMgaXMgd3JvbmcgaW4gUlRMIHRleHRcbiAgICAgICAgICAgIGVsc2UgaWYgKHRvIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdG8rKztcbiAgICAgICAgICAgICAgICBmbGF0dGVuID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChzaWRlIDwgMClcbiAgICAgICAgICAgIGZyb20tLTtcbiAgICAgICAgZWxzZSBpZiAodG8gPCBsZW5ndGgpXG4gICAgICAgICAgICB0bysrO1xuICAgIH1cbiAgICBsZXQgcmVjdHMgPSB0ZXh0UmFuZ2UodGV4dCwgZnJvbSwgdG8pLmdldENsaWVudFJlY3RzKCk7XG4gICAgaWYgKCFyZWN0cy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCByZWN0ID0gcmVjdHNbKGZsYXR0ZW4gPyBmbGF0dGVuIDwgMCA6IHNpZGUgPj0gMCkgPyAwIDogcmVjdHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKGJyb3dzZXIuc2FmYXJpICYmICFmbGF0dGVuICYmIHJlY3Qud2lkdGggPT0gMClcbiAgICAgICAgcmVjdCA9IEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwocmVjdHMsIHIgPT4gci53aWR0aCkgfHwgcmVjdDtcbiAgICByZXR1cm4gZmxhdHRlbiA/IGZsYXR0ZW5SZWN0KHJlY3QsIGZsYXR0ZW4gPCAwKSA6IHJlY3QgfHwgbnVsbDtcbn1cbi8vIEFsc28gdXNlZCBmb3IgY29sbGFwc2VkIHJhbmdlcyB0aGF0IGRvbid0IGhhdmUgYSBwbGFjZWhvbGRlciB3aWRnZXQhXG5jbGFzcyBXaWRnZXRWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIHN0YXRpYyBjcmVhdGUod2lkZ2V0LCBsZW5ndGgsIHNpZGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaWRnZXRWaWV3KHdpZGdldCwgbGVuZ3RoLCBzaWRlKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Iod2lkZ2V0LCBsZW5ndGgsIHNpZGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLnNpZGUgPSBzaWRlO1xuICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSBudWxsO1xuICAgIH1cbiAgICBzcGxpdChmcm9tKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBXaWRnZXRWaWV3LmNyZWF0ZSh0aGlzLndpZGdldCwgdGhpcy5sZW5ndGggLSBmcm9tLCB0aGlzLnNpZGUpO1xuICAgICAgICB0aGlzLmxlbmd0aCAtPSBmcm9tO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzeW5jKHZpZXcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSB8fCAhdGhpcy53aWRnZXQudXBkYXRlRE9NKHRoaXMuZG9tLCB2aWV3KSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZG9tICYmIHRoaXMucHJldldpZGdldClcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQuZGVzdHJveSh0aGlzLmRvbSk7XG4gICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zZXRET00odGhpcy53aWRnZXQudG9ET00odmlldykpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLndpZGdldC5lZGl0YWJsZSlcbiAgICAgICAgICAgICAgICB0aGlzLmRvbS5jb250ZW50RWRpdGFibGUgPSBcImZhbHNlXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0U2lkZSgpIHsgcmV0dXJuIHRoaXMuc2lkZTsgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIGhhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiAoIShzb3VyY2UgaW5zdGFuY2VvZiBXaWRnZXRWaWV3KSB8fCAhdGhpcy53aWRnZXQuY29tcGFyZShzb3VyY2Uud2lkZ2V0KSB8fFxuICAgICAgICAgICAgZnJvbSA+IDAgJiYgb3BlblN0YXJ0IDw9IDAgfHwgdG8gPCB0aGlzLmxlbmd0aCAmJiBvcGVuRW5kIDw9IDApKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGZyb20gKyAoc291cmNlID8gc291cmNlLmxlbmd0aCA6IDApICsgKHRoaXMubGVuZ3RoIC0gdG8pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFdpZGdldFZpZXcgJiYgb3RoZXIuc2lkZSA9PSB0aGlzLnNpZGUgJiZcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmNvbnN0cnVjdG9yID09IG90aGVyLndpZGdldC5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLndpZGdldC5jb21wYXJlKG90aGVyLndpZGdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgIXRoaXMucHJldldpZGdldClcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSB0aGlzLndpZGdldDtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0ID0gb3RoZXIud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBvdGhlci5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGlnbm9yZUV2ZW50KGV2ZW50KSB7IHJldHVybiB0aGlzLndpZGdldC5pZ25vcmVFdmVudChldmVudCk7IH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBUZXh0LmVtcHR5O1xuICAgICAgICBsZXQgdG9wID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHRvcC5wYXJlbnQpXG4gICAgICAgICAgICB0b3AgPSB0b3AucGFyZW50O1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0b3AsIHRleHQgPSB2aWV3ICYmIHZpZXcuc3RhdGUuZG9jLCBzdGFydCA9IHRoaXMucG9zQXRTdGFydDtcbiAgICAgICAgcmV0dXJuIHRleHQgPyB0ZXh0LnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMubGVuZ3RoKSA6IFRleHQuZW1wdHk7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICByZXR1cm4gKHRoaXMubGVuZ3RoID8gcG9zID09IDAgOiB0aGlzLnNpZGUgPiAwKVxuICAgICAgICAgICAgPyBET01Qb3MuYmVmb3JlKHRoaXMuZG9tKVxuICAgICAgICAgICAgOiBET01Qb3MuYWZ0ZXIodGhpcy5kb20sIHBvcyA9PSB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZCgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IGN1c3RvbSA9IHRoaXMud2lkZ2V0LmNvb3Jkc0F0KHRoaXMuZG9tLCBwb3MsIHNpZGUpO1xuICAgICAgICBpZiAoY3VzdG9tKVxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbTtcbiAgICAgICAgbGV0IHJlY3RzID0gdGhpcy5kb20uZ2V0Q2xpZW50UmVjdHMoKSwgcmVjdCA9IG51bGw7XG4gICAgICAgIGlmICghcmVjdHMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBmcm9tQmFjayA9IHRoaXMuc2lkZSA/IHRoaXMuc2lkZSA8IDAgOiBwb3MgPiAwO1xuICAgICAgICBmb3IgKGxldCBpID0gZnJvbUJhY2sgPyByZWN0cy5sZW5ndGggLSAxIDogMDs7IGkgKz0gKGZyb21CYWNrID8gLTEgOiAxKSkge1xuICAgICAgICAgICAgcmVjdCA9IHJlY3RzW2ldO1xuICAgICAgICAgICAgaWYgKHBvcyA+IDAgPyBpID09IDAgOiBpID09IHJlY3RzLmxlbmd0aCAtIDEgfHwgcmVjdC50b3AgPCByZWN0LmJvdHRvbSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHRlblJlY3QocmVjdCwgIWZyb21CYWNrKTtcbiAgICB9XG4gICAgZ2V0IGlzRWRpdGFibGUoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGdldCBpc1dpZGdldCgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiB0aGlzLndpZGdldC5pc0hpZGRlbjsgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy53aWRnZXQuZGVzdHJveSh0aGlzLmRvbSk7XG4gICAgfVxufVxuLy8gVGhlc2UgYXJlIGRyYXduIGFyb3VuZCB1bmVkaXRhYmxlIHdpZGdldHMgdG8gYXZvaWQgYSBudW1iZXIgb2Zcbi8vIGJyb3dzZXIgYnVncyB0aGF0IHNob3cgdXAgd2hlbiB0aGUgY3Vyc29yIGlzIGRpcmVjdGx5IG5leHQgdG9cbi8vIHVuZWRpdGFibGUgaW5saW5lIGNvbnRlbnQuXG5jbGFzcyBXaWRnZXRCdWZmZXJWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKHNpZGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zaWRlID0gc2lkZTtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIDA7IH1cbiAgICBtZXJnZSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFdpZGdldEJ1ZmZlclZpZXcgJiYgb3RoZXIuc2lkZSA9PSB0aGlzLnNpZGU7XG4gICAgfVxuICAgIHNwbGl0KCkgeyByZXR1cm4gbmV3IFdpZGdldEJ1ZmZlclZpZXcodGhpcy5zaWRlKTsgfVxuICAgIHN5bmMoKSB7XG4gICAgICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgICAgICAgIGxldCBkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAgICAgZG9tLmNsYXNzTmFtZSA9IFwiY20td2lkZ2V0QnVmZmVyXCI7XG4gICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgdGhpcy5zZXRET00oZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRTaWRlKCkgeyByZXR1cm4gdGhpcy5zaWRlOyB9XG4gICAgZG9tQXRQb3MocG9zKSB7IHJldHVybiB0aGlzLnNpZGUgPiAwID8gRE9NUG9zLmJlZm9yZSh0aGlzLmRvbSkgOiBET01Qb3MuYWZ0ZXIodGhpcy5kb20pOyB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKCkgeyByZXR1cm4gMDsgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZCgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBjb29yZHNBdChwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkge1xuICAgICAgICByZXR1cm4gVGV4dC5lbXB0eTtcbiAgICB9XG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gdHJ1ZTsgfVxufVxuVGV4dFZpZXcucHJvdG90eXBlLmNoaWxkcmVuID0gV2lkZ2V0Vmlldy5wcm90b3R5cGUuY2hpbGRyZW4gPSBXaWRnZXRCdWZmZXJWaWV3LnByb3RvdHlwZS5jaGlsZHJlbiA9IG5vQ2hpbGRyZW47XG5mdW5jdGlvbiBpbmxpbmVET01BdFBvcyhwYXJlbnQsIHBvcykge1xuICAgIGxldCBkb20gPSBwYXJlbnQuZG9tLCB7IGNoaWxkcmVuIH0gPSBwYXJlbnQsIGkgPSAwO1xuICAgIGZvciAobGV0IG9mZiA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBjaGlsZHJlbltpXSwgZW5kID0gb2ZmICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICBpZiAoZW5kID09IG9mZiAmJiBjaGlsZC5nZXRTaWRlKCkgPD0gMClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAocG9zID4gb2ZmICYmIHBvcyA8IGVuZCAmJiBjaGlsZC5kb20ucGFyZW50Tm9kZSA9PSBkb20pXG4gICAgICAgICAgICByZXR1cm4gY2hpbGQuZG9tQXRQb3MocG9zIC0gb2ZmKTtcbiAgICAgICAgaWYgKHBvcyA8PSBvZmYpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgb2ZmID0gZW5kO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gaTsgaiA+IDA7IGotLSkge1xuICAgICAgICBsZXQgcHJldiA9IGNoaWxkcmVuW2ogLSAxXTtcbiAgICAgICAgaWYgKHByZXYuZG9tLnBhcmVudE5vZGUgPT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuIHByZXYuZG9tQXRQb3MocHJldi5sZW5ndGgpO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGxldCBuZXh0ID0gY2hpbGRyZW5bal07XG4gICAgICAgIGlmIChuZXh0LmRvbS5wYXJlbnROb2RlID09IGRvbSlcbiAgICAgICAgICAgIHJldHVybiBuZXh0LmRvbUF0UG9zKDApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERPTVBvcyhkb20sIDApO1xufVxuLy8gQXNzdW1lcyBgdmlld2AsIGlmIGEgbWFyayB2aWV3LCBoYXMgcHJlY2lzZWx5IDEgY2hpbGQuXG5mdW5jdGlvbiBqb2luSW5saW5lSW50byhwYXJlbnQsIHZpZXcsIG9wZW4pIHtcbiAgICBsZXQgbGFzdCwgeyBjaGlsZHJlbiB9ID0gcGFyZW50O1xuICAgIGlmIChvcGVuID4gMCAmJiB2aWV3IGluc3RhbmNlb2YgTWFya1ZpZXcgJiYgY2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgIChsYXN0ID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0pIGluc3RhbmNlb2YgTWFya1ZpZXcgJiYgbGFzdC5tYXJrLmVxKHZpZXcubWFyaykpIHtcbiAgICAgICAgam9pbklubGluZUludG8obGFzdCwgdmlldy5jaGlsZHJlblswXSwgb3BlbiAtIDEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaCh2aWV3KTtcbiAgICAgICAgdmlldy5zZXRQYXJlbnQocGFyZW50KTtcbiAgICB9XG4gICAgcGFyZW50Lmxlbmd0aCArPSB2aWV3Lmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGNvb3Jkc0luQ2hpbGRyZW4odmlldywgcG9zLCBzaWRlKSB7XG4gICAgbGV0IGJlZm9yZSA9IG51bGwsIGJlZm9yZVBvcyA9IC0xLCBhZnRlciA9IG51bGwsIGFmdGVyUG9zID0gLTE7XG4gICAgZnVuY3Rpb24gc2Nhbih2aWV3LCBwb3MpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG9mZiA9IDA7IGkgPCB2aWV3LmNoaWxkcmVuLmxlbmd0aCAmJiBvZmYgPD0gcG9zOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHZpZXcuY2hpbGRyZW5baV0sIGVuZCA9IG9mZiArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBzY2FuKGNoaWxkLCBwb3MgLSBvZmYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgoIWFmdGVyIHx8IGFmdGVyLmlzSGlkZGVuICYmIChzaWRlID4gMCB8fCBvblNhbWVMaW5lKGFmdGVyLCBjaGlsZCkpKSAmJlxuICAgICAgICAgICAgICAgICAgICAoZW5kID4gcG9zIHx8IG9mZiA9PSBlbmQgJiYgY2hpbGQuZ2V0U2lkZSgpID4gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQb3MgPSBwb3MgLSBvZmY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9mZiA8IHBvcyB8fCAob2ZmID09IGVuZCAmJiBjaGlsZC5nZXRTaWRlKCkgPCAwKSAmJiAhY2hpbGQuaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZVBvcyA9IHBvcyAtIG9mZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmYgPSBlbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2Nhbih2aWV3LCBwb3MpO1xuICAgIGxldCB0YXJnZXQgPSAoc2lkZSA8IDAgPyBiZWZvcmUgOiBhZnRlcikgfHwgYmVmb3JlIHx8IGFmdGVyO1xuICAgIGlmICh0YXJnZXQpXG4gICAgICAgIHJldHVybiB0YXJnZXQuY29vcmRzQXQoTWF0aC5tYXgoMCwgdGFyZ2V0ID09IGJlZm9yZSA/IGJlZm9yZVBvcyA6IGFmdGVyUG9zKSwgc2lkZSk7XG4gICAgcmV0dXJuIGZhbGxiYWNrUmVjdCh2aWV3KTtcbn1cbmZ1bmN0aW9uIGZhbGxiYWNrUmVjdCh2aWV3KSB7XG4gICAgbGV0IGxhc3QgPSB2aWV3LmRvbS5sYXN0Q2hpbGQ7XG4gICAgaWYgKCFsYXN0KVxuICAgICAgICByZXR1cm4gdmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHJlY3RzID0gY2xpZW50UmVjdHNGb3IobGFzdCk7XG4gICAgcmV0dXJuIHJlY3RzW3JlY3RzLmxlbmd0aCAtIDFdIHx8IG51bGw7XG59XG5mdW5jdGlvbiBvblNhbWVMaW5lKGEsIGIpIHtcbiAgICBsZXQgcG9zQSA9IGEuY29vcmRzQXQoMCwgMSksIHBvc0IgPSBiLmNvb3Jkc0F0KDAsIDEpO1xuICAgIHJldHVybiBwb3NBICYmIHBvc0IgJiYgcG9zQi50b3AgPCBwb3NBLmJvdHRvbTtcbn1cblxuZnVuY3Rpb24gY29tYmluZUF0dHJzKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKG5hbWUgPT0gXCJjbGFzc1wiICYmIHRhcmdldC5jbGFzcylcbiAgICAgICAgICAgIHRhcmdldC5jbGFzcyArPSBcIiBcIiArIHNvdXJjZS5jbGFzcztcbiAgICAgICAgZWxzZSBpZiAobmFtZSA9PSBcInN0eWxlXCIgJiYgdGFyZ2V0LnN0eWxlKVxuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlICs9IFwiO1wiICsgc291cmNlLnN0eWxlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0YXJnZXRbbmFtZV0gPSBzb3VyY2VbbmFtZV07XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5jb25zdCBub0F0dHJzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5mdW5jdGlvbiBhdHRyc0VxKGEsIGIsIGlnbm9yZSkge1xuICAgIGlmIChhID09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghYSlcbiAgICAgICAgYSA9IG5vQXR0cnM7XG4gICAgaWYgKCFiKVxuICAgICAgICBiID0gbm9BdHRycztcbiAgICBsZXQga2V5c0EgPSBPYmplY3Qua2V5cyhhKSwga2V5c0IgPSBPYmplY3Qua2V5cyhiKTtcbiAgICBpZiAoa2V5c0EubGVuZ3RoIC0gKGlnbm9yZSAmJiBrZXlzQS5pbmRleE9mKGlnbm9yZSkgPiAtMSA/IDEgOiAwKSAhPVxuICAgICAgICBrZXlzQi5sZW5ndGggLSAoaWdub3JlICYmIGtleXNCLmluZGV4T2YoaWdub3JlKSA+IC0xID8gMSA6IDApKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQga2V5IG9mIGtleXNBKSB7XG4gICAgICAgIGlmIChrZXkgIT0gaWdub3JlICYmIChrZXlzQi5pbmRleE9mKGtleSkgPT0gLTEgfHwgYVtrZXldICE9PSBiW2tleV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUF0dHJzKGRvbSwgcHJldiwgYXR0cnMpIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGlmIChwcmV2KVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHByZXYpXG4gICAgICAgICAgICBpZiAoIShhdHRycyAmJiBuYW1lIGluIGF0dHJzKSkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IFwic3R5bGVcIilcbiAgICAgICAgICAgICAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICBpZiAoYXR0cnMpXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpXG4gICAgICAgICAgICBpZiAoIShwcmV2ICYmIHByZXZbbmFtZV0gPT0gYXR0cnNbbmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgICAgICBkb20uc3R5bGUuY3NzVGV4dCA9IGF0dHJzW25hbWVdO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShuYW1lLCBhdHRyc1tuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBnZXRBdHRycyhkb20pIHtcbiAgICBsZXQgYXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGF0dHIgPSBkb20uYXR0cmlidXRlc1tpXTtcbiAgICAgICAgYXR0cnNbYXR0ci5uYW1lXSA9IGF0dHIudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBhdHRycztcbn1cblxuLyoqXG5XaWRnZXRzIGFkZGVkIHRvIHRoZSBjb250ZW50IGFyZSBkZXNjcmliZWQgYnkgc3ViY2xhc3NlcyBvZiB0aGlzXG5jbGFzcy4gVXNpbmcgYSBkZXNjcmlwdGlvbiBvYmplY3QgbGlrZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvXG5kZWxheSBjcmVhdGluZyBvZiB0aGUgRE9NIHN0cnVjdHVyZSBmb3IgYSB3aWRnZXQgdW50aWwgaXQgaXNcbm5lZWRlZCwgYW5kIHRvIGF2b2lkIHJlZHJhd2luZyB3aWRnZXRzIGV2ZW4gaWYgdGhlIGRlY29yYXRpb25zXG50aGF0IGRlZmluZSB0aGVtIGFyZSByZWNyZWF0ZWQuXG4qL1xuY2xhc3MgV2lkZ2V0VHlwZSB7XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIGluc3RhbmNlIHRvIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgdHlwZS5cbiAgICAoVHlwZVNjcmlwdCBjYW4ndCBleHByZXNzIHRoaXMsIGJ1dCBvbmx5IGluc3RhbmNlcyBvZiB0aGUgc2FtZVxuICAgIHNwZWNpZmljIGNsYXNzIHdpbGwgYmUgcGFzc2VkIHRvIHRoaXMgbWV0aG9kLikgVGhpcyBpcyB1c2VkIHRvXG4gICAgYXZvaWQgcmVkcmF3aW5nIHdpZGdldHMgd2hlbiB0aGV5IGFyZSByZXBsYWNlZCBieSBhIG5ld1xuICAgIGRlY29yYXRpb24gb2YgdGhlIHNhbWUgdHlwZS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdFxuICAgIHJldHVybnMgYGZhbHNlYCwgd2hpY2ggd2lsbCBjYXVzZSBuZXcgaW5zdGFuY2VzIG9mIHRoZSB3aWRnZXQgdG9cbiAgICBhbHdheXMgYmUgcmVkcmF3bi5cbiAgICAqL1xuICAgIGVxKHdpZGdldCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICBVcGRhdGUgYSBET00gZWxlbWVudCBjcmVhdGVkIGJ5IGEgd2lkZ2V0IG9mIHRoZSBzYW1lIHR5cGUgKGJ1dFxuICAgIGRpZmZlcmVudCwgbm9uLWBlcWAgY29udGVudCkgdG8gcmVmbGVjdCB0aGlzIHdpZGdldC4gTWF5IHJldHVyblxuICAgIHRydWUgdG8gaW5kaWNhdGUgdGhhdCBpdCBjb3VsZCB1cGRhdGUsIGZhbHNlIHRvIGluZGljYXRlIGl0XG4gICAgY291bGRuJ3QgKGluIHdoaWNoIGNhc2UgdGhlIHdpZGdldCB3aWxsIGJlIHJlZHJhd24pLiBUaGUgZGVmYXVsdFxuICAgIGltcGxlbWVudGF0aW9uIGp1c3QgcmV0dXJucyBmYWxzZS5cbiAgICAqL1xuICAgIHVwZGF0ZURPTShkb20sIHZpZXcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXJlKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8IHRoaXMuY29uc3RydWN0b3IgPT0gb3RoZXIuY29uc3RydWN0b3IgJiYgdGhpcy5lcShvdGhlcik7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBlc3RpbWF0ZWQgaGVpZ2h0IHRoaXMgd2lkZ2V0IHdpbGwgaGF2ZSwgdG8gYmUgdXNlZCB3aGVuXG4gICAgZXN0aW1hdGluZyB0aGUgaGVpZ2h0IG9mIGNvbnRlbnQgdGhhdCBoYXNuJ3QgYmVlbiBkcmF3bi4gTWF5XG4gICAgcmV0dXJuIC0xIHRvIGluZGljYXRlIHlvdSBkb24ndCBrbm93LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvblxuICAgIHJldHVybnMgLTEuXG4gICAgKi9cbiAgICBnZXQgZXN0aW1hdGVkSGVpZ2h0KCkgeyByZXR1cm4gLTE7IH1cbiAgICAvKipcbiAgICBGb3IgaW5saW5lIHdpZGdldHMgdGhhdCBhcmUgZGlzcGxheWVkIGlubGluZSAoYXMgb3Bwb3NlZCB0b1xuICAgIGBpbmxpbmUtYmxvY2tgKSBhbmQgaW50cm9kdWNlIGxpbmUgYnJlYWtzICh0aHJvdWdoIGA8YnI+YCB0YWdzXG4gICAgb3IgdGV4dHVhbCBuZXdsaW5lcyksIHRoaXMgbXVzdCBpbmRpY2F0ZSB0aGUgYW1vdW50IG9mIGxpbmVcbiAgICBicmVha3MgdGhleSBpbnRyb2R1Y2UuIERlZmF1bHRzIHRvIDAuXG4gICAgKi9cbiAgICBnZXQgbGluZUJyZWFrcygpIHsgcmV0dXJuIDA7IH1cbiAgICAvKipcbiAgICBDYW4gYmUgdXNlZCB0byBjb25maWd1cmUgd2hpY2gga2luZHMgb2YgZXZlbnRzIGluc2lkZSB0aGUgd2lkZ2V0XG4gICAgc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlIGVkaXRvci4gVGhlIGRlZmF1bHQgaXMgdG8gaWdub3JlIGFsbFxuICAgIGV2ZW50cy5cbiAgICAqL1xuICAgIGlnbm9yZUV2ZW50KGV2ZW50KSB7IHJldHVybiB0cnVlOyB9XG4gICAgLyoqXG4gICAgT3ZlcnJpZGUgdGhlIHdheSBzY3JlZW4gY29vcmRpbmF0ZXMgZm9yIHBvc2l0aW9ucyBhdC9pbiB0aGVcbiAgICB3aWRnZXQgYXJlIGZvdW5kLiBgcG9zYCB3aWxsIGJlIHRoZSBvZmZzZXQgaW50byB0aGUgd2lkZ2V0LCBhbmRcbiAgICBgc2lkZWAgdGhlIHNpZGUgb2YgdGhlIHBvc2l0aW9uIHRoYXQgaXMgYmVpbmcgcXVlcmllZFx1MjAxNGxlc3MgdGhhblxuICAgIHplcm8gZm9yIGJlZm9yZSwgZ3JlYXRlciB0aGFuIHplcm8gZm9yIGFmdGVyLCBhbmQgemVybyBmb3JcbiAgICBkaXJlY3RseSBhdCB0aGF0IHBvc2l0aW9uLlxuICAgICovXG4gICAgY29vcmRzQXQoZG9tLCBwb3MsIHNpZGUpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBpc0hpZGRlbigpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgZWRpdGFibGUoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFuIGluc3RhbmNlIG9mIHRoZSB3aWRnZXQgaXMgcmVtb3ZlZFxuICAgIGZyb20gdGhlIGVkaXRvciB2aWV3LlxuICAgICovXG4gICAgZGVzdHJveShkb20pIHsgfVxufVxuLyoqXG5UaGUgZGlmZmVyZW50IHR5cGVzIG9mIGJsb2NrcyB0aGF0IGNhbiBvY2N1ciBpbiBhbiBlZGl0b3Igdmlldy5cbiovXG52YXIgQmxvY2tUeXBlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQmxvY2tUeXBlKSB7XG4gICAgLyoqXG4gICAgQSBsaW5lIG9mIHRleHQuXG4gICAgKi9cbiAgICBCbG9ja1R5cGVbQmxvY2tUeXBlW1wiVGV4dFwiXSA9IDBdID0gXCJUZXh0XCI7XG4gICAgLyoqXG4gICAgQSBibG9jayB3aWRnZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3NpdGlvbiBhZnRlciBpdC5cbiAgICAqL1xuICAgIEJsb2NrVHlwZVtCbG9ja1R5cGVbXCJXaWRnZXRCZWZvcmVcIl0gPSAxXSA9IFwiV2lkZ2V0QmVmb3JlXCI7XG4gICAgLyoqXG4gICAgQSBibG9jayB3aWRnZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3NpdGlvbiBiZWZvcmUgaXQuXG4gICAgKi9cbiAgICBCbG9ja1R5cGVbQmxvY2tUeXBlW1wiV2lkZ2V0QWZ0ZXJcIl0gPSAyXSA9IFwiV2lkZ2V0QWZ0ZXJcIjtcbiAgICAvKipcbiAgICBBIGJsb2NrIHdpZGdldCBbcmVwbGFjaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvbl5yZXBsYWNlKSBhIHJhbmdlIG9mIGNvbnRlbnQuXG4gICAgKi9cbiAgICBCbG9ja1R5cGVbQmxvY2tUeXBlW1wiV2lkZ2V0UmFuZ2VcIl0gPSAzXSA9IFwiV2lkZ2V0UmFuZ2VcIjtcbnJldHVybiBCbG9ja1R5cGV9KShCbG9ja1R5cGUgfHwgKEJsb2NrVHlwZSA9IHt9KSk7XG4vKipcbkEgZGVjb3JhdGlvbiBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZHJhdyBvciBzdHlsZSBhIHBpZWNlXG5vZiBjb250ZW50LiBZb3UnbGwgdXN1YWxseSB1c2UgaXQgd3JhcHBlZCBpbiBhXG5bYFJhbmdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZSksIHdoaWNoIGFkZHMgYSBzdGFydCBhbmQgZW5kIHBvc2l0aW9uLlxuQG5vbmFic3RyYWN0XG4qL1xuY2xhc3MgRGVjb3JhdGlvbiBleHRlbmRzIFJhbmdlVmFsdWUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhcnRTaWRlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGVuZFNpZGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgd2lkZ2V0LCBcbiAgICAvKipcbiAgICBUaGUgY29uZmlnIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGlzIGRlY29yYXRpb24uIFlvdSBjYW5cbiAgICBpbmNsdWRlIGFkZGl0aW9uYWwgcHJvcGVydGllcyBpbiB0aGVyZSB0byBzdG9yZSBtZXRhZGF0YSBhYm91dFxuICAgIHlvdXIgZGVjb3JhdGlvbi5cbiAgICAqL1xuICAgIHNwZWMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zdGFydFNpZGUgPSBzdGFydFNpZGU7XG4gICAgICAgIHRoaXMuZW5kU2lkZSA9IGVuZFNpZGU7XG4gICAgICAgIHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBoZWlnaHRSZWxldmFudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyayBkZWNvcmF0aW9uLCB3aGljaCBpbmZsdWVuY2VzIHRoZSBzdHlsaW5nIG9mIHRoZVxuICAgIGNvbnRlbnQgaW4gaXRzIHJhbmdlLiBOZXN0ZWQgbWFyayBkZWNvcmF0aW9ucyB3aWxsIGNhdXNlIG5lc3RlZFxuICAgIERPTSBlbGVtZW50cyB0byBiZSBjcmVhdGVkLiBOZXN0aW5nIG9yZGVyIGlzIGRldGVybWluZWQgYnlcbiAgICBwcmVjZWRlbmNlIG9mIHRoZSBbZmFjZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmRlY29yYXRpb25zKSwgd2l0aFxuICAgIHRoZSBoaWdoZXItcHJlY2VkZW5jZSBkZWNvcmF0aW9ucyBjcmVhdGluZyB0aGUgaW5uZXIgRE9NIG5vZGVzLlxuICAgIFN1Y2ggZWxlbWVudHMgYXJlIHNwbGl0IG9uIGxpbmUgYm91bmRhcmllcyBhbmQgb24gdGhlIGJvdW5kYXJpZXNcbiAgICBvZiBsb3dlci1wcmVjZWRlbmNlIGRlY29yYXRpb25zLlxuICAgICovXG4gICAgc3RhdGljIG1hcmsoc3BlYykge1xuICAgICAgICByZXR1cm4gbmV3IE1hcmtEZWNvcmF0aW9uKHNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSB3aWRnZXQgZGVjb3JhdGlvbiwgd2hpY2ggZGlzcGxheXMgYSBET00gZWxlbWVudCBhdCB0aGVcbiAgICBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyB3aWRnZXQoc3BlYykge1xuICAgICAgICBsZXQgc2lkZSA9IE1hdGgubWF4KC0xMDAwMCwgTWF0aC5taW4oMTAwMDAsIHNwZWMuc2lkZSB8fCAwKSksIGJsb2NrID0gISFzcGVjLmJsb2NrO1xuICAgICAgICBzaWRlICs9IChibG9jayAmJiAhc3BlYy5pbmxpbmVPcmRlcilcbiAgICAgICAgICAgID8gKHNpZGUgPiAwID8gMzAwMDAwMDAwIC8qIFNpZGUuQmxvY2tBZnRlciAqLyA6IC00MDAwMDAwMDAgLyogU2lkZS5CbG9ja0JlZm9yZSAqLylcbiAgICAgICAgICAgIDogKHNpZGUgPiAwID8gMTAwMDAwMDAwIC8qIFNpZGUuSW5saW5lQWZ0ZXIgKi8gOiAtMTAwMDAwMDAwIC8qIFNpZGUuSW5saW5lQmVmb3JlICovKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludERlY29yYXRpb24oc3BlYywgc2lkZSwgc2lkZSwgYmxvY2ssIHNwZWMud2lkZ2V0IHx8IG51bGwsIGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcmVwbGFjZSBkZWNvcmF0aW9uIHdoaWNoIHJlcGxhY2VzIHRoZSBnaXZlbiByYW5nZSB3aXRoXG4gICAgYSB3aWRnZXQsIG9yIHNpbXBseSBoaWRlcyBpdC5cbiAgICAqL1xuICAgIHN0YXRpYyByZXBsYWNlKHNwZWMpIHtcbiAgICAgICAgbGV0IGJsb2NrID0gISFzcGVjLmJsb2NrLCBzdGFydFNpZGUsIGVuZFNpZGU7XG4gICAgICAgIGlmIChzcGVjLmlzQmxvY2tHYXApIHtcbiAgICAgICAgICAgIHN0YXJ0U2lkZSA9IC01MDAwMDAwMDAgLyogU2lkZS5HYXBTdGFydCAqLztcbiAgICAgICAgICAgIGVuZFNpZGUgPSA0MDAwMDAwMDAgLyogU2lkZS5HYXBFbmQgKi87XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgeyBzdGFydCwgZW5kIH0gPSBnZXRJbmNsdXNpdmUoc3BlYywgYmxvY2spO1xuICAgICAgICAgICAgc3RhcnRTaWRlID0gKHN0YXJ0ID8gKGJsb2NrID8gLTMwMDAwMDAwMCAvKiBTaWRlLkJsb2NrSW5jU3RhcnQgKi8gOiAtMSAvKiBTaWRlLklubGluZUluY1N0YXJ0ICovKSA6IDUwMDAwMDAwMCAvKiBTaWRlLk5vbkluY1N0YXJ0ICovKSAtIDE7XG4gICAgICAgICAgICBlbmRTaWRlID0gKGVuZCA/IChibG9jayA/IDIwMDAwMDAwMCAvKiBTaWRlLkJsb2NrSW5jRW5kICovIDogMSAvKiBTaWRlLklubGluZUluY0VuZCAqLykgOiAtNjAwMDAwMDAwIC8qIFNpZGUuTm9uSW5jRW5kICovKSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludERlY29yYXRpb24oc3BlYywgc3RhcnRTaWRlLCBlbmRTaWRlLCBibG9jaywgc3BlYy53aWRnZXQgfHwgbnVsbCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGxpbmUgZGVjb3JhdGlvbiwgd2hpY2ggY2FuIGFkZCBET00gYXR0cmlidXRlcyB0byB0aGVcbiAgICBsaW5lIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBsaW5lKHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lRGVjb3JhdGlvbihzcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQnVpbGQgYSBbYERlY29yYXRpb25TZXRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvblNldCkgZnJvbSB0aGUgZ2l2ZW5cbiAgICBkZWNvcmF0ZWQgcmFuZ2Ugb3IgcmFuZ2VzLiBJZiB0aGUgcmFuZ2VzIGFyZW4ndCBhbHJlYWR5IHNvcnRlZCxcbiAgICBwYXNzIGB0cnVlYCBmb3IgYHNvcnRgIHRvIG1ha2UgdGhlIGxpYnJhcnkgc29ydCB0aGVtIGZvciB5b3UuXG4gICAgKi9cbiAgICBzdGF0aWMgc2V0KG9mLCBzb3J0ID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlU2V0Lm9mKG9mLCBzb3J0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBoYXNIZWlnaHQoKSB7IHJldHVybiB0aGlzLndpZGdldCA/IHRoaXMud2lkZ2V0LmVzdGltYXRlZEhlaWdodCA+IC0xIDogZmFsc2U7IH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNldCBvZiBkZWNvcmF0aW9ucy5cbiovXG5EZWNvcmF0aW9uLm5vbmUgPSBSYW5nZVNldC5lbXB0eTtcbmNsYXNzIE1hcmtEZWNvcmF0aW9uIGV4dGVuZHMgRGVjb3JhdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc3BlYykge1xuICAgICAgICBsZXQgeyBzdGFydCwgZW5kIH0gPSBnZXRJbmNsdXNpdmUoc3BlYyk7XG4gICAgICAgIHN1cGVyKHN0YXJ0ID8gLTEgLyogU2lkZS5JbmxpbmVJbmNTdGFydCAqLyA6IDUwMDAwMDAwMCAvKiBTaWRlLk5vbkluY1N0YXJ0ICovLCBlbmQgPyAxIC8qIFNpZGUuSW5saW5lSW5jRW5kICovIDogLTYwMDAwMDAwMCAvKiBTaWRlLk5vbkluY0VuZCAqLywgbnVsbCwgc3BlYyk7XG4gICAgICAgIHRoaXMudGFnTmFtZSA9IHNwZWMudGFnTmFtZSB8fCBcInNwYW5cIjtcbiAgICAgICAgdGhpcy5jbGFzcyA9IHNwZWMuY2xhc3MgfHwgXCJcIjtcbiAgICAgICAgdGhpcy5hdHRycyA9IHNwZWMuYXR0cmlidXRlcyB8fCBudWxsO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fFxuICAgICAgICAgICAgb3RoZXIgaW5zdGFuY2VvZiBNYXJrRGVjb3JhdGlvbiAmJlxuICAgICAgICAgICAgICAgIHRoaXMudGFnTmFtZSA9PSBvdGhlci50YWdOYW1lICYmXG4gICAgICAgICAgICAgICAgKHRoaXMuY2xhc3MgfHwgKChfYSA9IHRoaXMuYXR0cnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jbGFzcykpID09IChvdGhlci5jbGFzcyB8fCAoKF9iID0gb3RoZXIuYXR0cnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jbGFzcykpICYmXG4gICAgICAgICAgICAgICAgYXR0cnNFcSh0aGlzLmF0dHJzLCBvdGhlci5hdHRycywgXCJjbGFzc1wiKTtcbiAgICB9XG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGlmIChmcm9tID49IHRvKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNYXJrIGRlY29yYXRpb25zIG1heSBub3QgYmUgZW1wdHlcIik7XG4gICAgICAgIHJldHVybiBzdXBlci5yYW5nZShmcm9tLCB0byk7XG4gICAgfVxufVxuTWFya0RlY29yYXRpb24ucHJvdG90eXBlLnBvaW50ID0gZmFsc2U7XG5jbGFzcyBMaW5lRGVjb3JhdGlvbiBleHRlbmRzIERlY29yYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNwZWMpIHtcbiAgICAgICAgc3VwZXIoLTIwMDAwMDAwMCAvKiBTaWRlLkxpbmUgKi8sIC0yMDAwMDAwMDAgLyogU2lkZS5MaW5lICovLCBudWxsLCBzcGVjKTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgTGluZURlY29yYXRpb24gJiZcbiAgICAgICAgICAgIHRoaXMuc3BlYy5jbGFzcyA9PSBvdGhlci5zcGVjLmNsYXNzICYmXG4gICAgICAgICAgICBhdHRyc0VxKHRoaXMuc3BlYy5hdHRyaWJ1dGVzLCBvdGhlci5zcGVjLmF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgICByYW5nZShmcm9tLCB0byA9IGZyb20pIHtcbiAgICAgICAgaWYgKHRvICE9IGZyb20pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkxpbmUgZGVjb3JhdGlvbiByYW5nZXMgbXVzdCBiZSB6ZXJvLWxlbmd0aFwiKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnJhbmdlKGZyb20sIHRvKTtcbiAgICB9XG59XG5MaW5lRGVjb3JhdGlvbi5wcm90b3R5cGUubWFwTW9kZSA9IE1hcE1vZGUuVHJhY2tCZWZvcmU7XG5MaW5lRGVjb3JhdGlvbi5wcm90b3R5cGUucG9pbnQgPSB0cnVlO1xuY2xhc3MgUG9pbnREZWNvcmF0aW9uIGV4dGVuZHMgRGVjb3JhdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc3BlYywgc3RhcnRTaWRlLCBlbmRTaWRlLCBibG9jaywgd2lkZ2V0LCBpc1JlcGxhY2UpIHtcbiAgICAgICAgc3VwZXIoc3RhcnRTaWRlLCBlbmRTaWRlLCB3aWRnZXQsIHNwZWMpO1xuICAgICAgICB0aGlzLmJsb2NrID0gYmxvY2s7XG4gICAgICAgIHRoaXMuaXNSZXBsYWNlID0gaXNSZXBsYWNlO1xuICAgICAgICB0aGlzLm1hcE1vZGUgPSAhYmxvY2sgPyBNYXBNb2RlLlRyYWNrRGVsIDogc3RhcnRTaWRlIDw9IDAgPyBNYXBNb2RlLlRyYWNrQmVmb3JlIDogTWFwTW9kZS5UcmFja0FmdGVyO1xuICAgIH1cbiAgICAvLyBPbmx5IHJlbGV2YW50IHdoZW4gdGhpcy5ibG9jayA9PSB0cnVlXG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0U2lkZSAhPSB0aGlzLmVuZFNpZGUgPyBCbG9ja1R5cGUuV2lkZ2V0UmFuZ2VcbiAgICAgICAgICAgIDogdGhpcy5zdGFydFNpZGUgPD0gMCA/IEJsb2NrVHlwZS5XaWRnZXRCZWZvcmUgOiBCbG9ja1R5cGUuV2lkZ2V0QWZ0ZXI7XG4gICAgfVxuICAgIGdldCBoZWlnaHRSZWxldmFudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2sgfHwgISF0aGlzLndpZGdldCAmJiAodGhpcy53aWRnZXQuZXN0aW1hdGVkSGVpZ2h0ID49IDUgfHwgdGhpcy53aWRnZXQubGluZUJyZWFrcyA+IDApO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBQb2ludERlY29yYXRpb24gJiZcbiAgICAgICAgICAgIHdpZGdldHNFcSh0aGlzLndpZGdldCwgb3RoZXIud2lkZ2V0KSAmJlxuICAgICAgICAgICAgdGhpcy5ibG9jayA9PSBvdGhlci5ibG9jayAmJlxuICAgICAgICAgICAgdGhpcy5zdGFydFNpZGUgPT0gb3RoZXIuc3RhcnRTaWRlICYmIHRoaXMuZW5kU2lkZSA9PSBvdGhlci5lbmRTaWRlO1xuICAgIH1cbiAgICByYW5nZShmcm9tLCB0byA9IGZyb20pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXBsYWNlICYmIChmcm9tID4gdG8gfHwgKGZyb20gPT0gdG8gJiYgdGhpcy5zdGFydFNpZGUgPiAwICYmIHRoaXMuZW5kU2lkZSA8PSAwKSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgcmFuZ2UgZm9yIHJlcGxhY2VtZW50IGRlY29yYXRpb25cIik7XG4gICAgICAgIGlmICghdGhpcy5pc1JlcGxhY2UgJiYgdG8gIT0gZnJvbSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiV2lkZ2V0IGRlY29yYXRpb25zIGNhbiBvbmx5IGhhdmUgemVyby1sZW5ndGggcmFuZ2VzXCIpO1xuICAgICAgICByZXR1cm4gc3VwZXIucmFuZ2UoZnJvbSwgdG8pO1xuICAgIH1cbn1cblBvaW50RGVjb3JhdGlvbi5wcm90b3R5cGUucG9pbnQgPSB0cnVlO1xuZnVuY3Rpb24gZ2V0SW5jbHVzaXZlKHNwZWMsIGJsb2NrID0gZmFsc2UpIHtcbiAgICBsZXQgeyBpbmNsdXNpdmVTdGFydDogc3RhcnQsIGluY2x1c2l2ZUVuZDogZW5kIH0gPSBzcGVjO1xuICAgIGlmIChzdGFydCA9PSBudWxsKVxuICAgICAgICBzdGFydCA9IHNwZWMuaW5jbHVzaXZlO1xuICAgIGlmIChlbmQgPT0gbnVsbClcbiAgICAgICAgZW5kID0gc3BlYy5pbmNsdXNpdmU7XG4gICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0ICE9PSBudWxsICYmIHN0YXJ0ICE9PSB2b2lkIDAgPyBzdGFydCA6IGJsb2NrLCBlbmQ6IGVuZCAhPT0gbnVsbCAmJiBlbmQgIT09IHZvaWQgMCA/IGVuZCA6IGJsb2NrIH07XG59XG5mdW5jdGlvbiB3aWRnZXRzRXEoYSwgYikge1xuICAgIHJldHVybiBhID09IGIgfHwgISEoYSAmJiBiICYmIGEuY29tcGFyZShiKSk7XG59XG5mdW5jdGlvbiBhZGRSYW5nZShmcm9tLCB0bywgcmFuZ2VzLCBtYXJnaW4gPSAwKSB7XG4gICAgbGV0IGxhc3QgPSByYW5nZXMubGVuZ3RoIC0gMTtcbiAgICBpZiAobGFzdCA+PSAwICYmIHJhbmdlc1tsYXN0XSArIG1hcmdpbiA+PSBmcm9tKVxuICAgICAgICByYW5nZXNbbGFzdF0gPSBNYXRoLm1heChyYW5nZXNbbGFzdF0sIHRvKTtcbiAgICBlbHNlXG4gICAgICAgIHJhbmdlcy5wdXNoKGZyb20sIHRvKTtcbn1cblxuY2xhc3MgTGluZVZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLnByZXZBdHRycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5hdHRycyA9IG51bGw7XG4gICAgICAgIHRoaXMuYnJlYWtBZnRlciA9IDA7XG4gICAgfVxuICAgIC8vIENvbnN1bWVzIHNvdXJjZVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIGhhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgTGluZVZpZXcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5kb20pXG4gICAgICAgICAgICAgICAgc291cmNlLnRyYW5zZmVyRE9NKHRoaXMpOyAvLyBSZXVzZSBzb3VyY2UuZG9tIHdoZW4gYXBwcm9wcmlhdGVcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzU3RhcnQpXG4gICAgICAgICAgICB0aGlzLnNldERlY28oc291cmNlID8gc291cmNlLmF0dHJzIDogbnVsbCk7XG4gICAgICAgIG1lcmdlQ2hpbGRyZW5JbnRvKHRoaXMsIGZyb20sIHRvLCBzb3VyY2UgPyBzb3VyY2UuY2hpbGRyZW4uc2xpY2UoKSA6IFtdLCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3BsaXQoYXQpIHtcbiAgICAgICAgbGV0IGVuZCA9IG5ldyBMaW5lVmlldztcbiAgICAgICAgZW5kLmJyZWFrQWZ0ZXIgPSB0aGlzLmJyZWFrQWZ0ZXI7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGVuZDtcbiAgICAgICAgbGV0IHsgaSwgb2ZmIH0gPSB0aGlzLmNoaWxkUG9zKGF0KTtcbiAgICAgICAgaWYgKG9mZikge1xuICAgICAgICAgICAgZW5kLmFwcGVuZCh0aGlzLmNoaWxkcmVuW2ldLnNwbGl0KG9mZiksIDApO1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5tZXJnZShvZmYsIHRoaXMuY2hpbGRyZW5baV0ubGVuZ3RoLCBudWxsLCBmYWxzZSwgMCwgMCk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgZW5kLmFwcGVuZCh0aGlzLmNoaWxkcmVuW2pdLCAwKTtcbiAgICAgICAgd2hpbGUgKGkgPiAwICYmIHRoaXMuY2hpbGRyZW5baSAtIDFdLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlblstLWldLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5sZW5ndGggPSBpO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGF0O1xuICAgICAgICByZXR1cm4gZW5kO1xuICAgIH1cbiAgICB0cmFuc2ZlckRPTShvdGhlcikge1xuICAgICAgICBpZiAoIXRoaXMuZG9tKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICBvdGhlci5zZXRET00odGhpcy5kb20pO1xuICAgICAgICBvdGhlci5wcmV2QXR0cnMgPSB0aGlzLnByZXZBdHRycyA9PT0gdW5kZWZpbmVkID8gdGhpcy5hdHRycyA6IHRoaXMucHJldkF0dHJzO1xuICAgICAgICB0aGlzLnByZXZBdHRycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5kb20gPSBudWxsO1xuICAgIH1cbiAgICBzZXREZWNvKGF0dHJzKSB7XG4gICAgICAgIGlmICghYXR0cnNFcSh0aGlzLmF0dHJzLCBhdHRycykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldkF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFwcGVuZChjaGlsZCwgb3BlblN0YXJ0KSB7XG4gICAgICAgIGpvaW5JbmxpbmVJbnRvKHRoaXMsIGNoaWxkLCBvcGVuU3RhcnQpO1xuICAgIH1cbiAgICAvLyBPbmx5IGNhbGxlZCB3aGVuIGJ1aWxkaW5nIGEgbGluZSB2aWV3IGluIENvbnRlbnRCdWlsZGVyXG4gICAgYWRkTGluZURlY28oZGVjbykge1xuICAgICAgICBsZXQgYXR0cnMgPSBkZWNvLnNwZWMuYXR0cmlidXRlcywgY2xzID0gZGVjby5zcGVjLmNsYXNzO1xuICAgICAgICBpZiAoYXR0cnMpXG4gICAgICAgICAgICB0aGlzLmF0dHJzID0gY29tYmluZUF0dHJzKGF0dHJzLCB0aGlzLmF0dHJzIHx8IHt9KTtcbiAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgIHRoaXMuYXR0cnMgPSBjb21iaW5lQXR0cnMoeyBjbGFzczogY2xzIH0sIHRoaXMuYXR0cnMgfHwge30pO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIGlubGluZURPTUF0UG9zKHRoaXMsIHBvcyk7XG4gICAgfVxuICAgIHJldXNlRE9NKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJESVZcIikge1xuICAgICAgICAgICAgdGhpcy5zZXRET00obm9kZSk7XG4gICAgICAgICAgICB0aGlzLmZsYWdzIHw9IDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLyB8IDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN5bmModmlldywgdHJhY2spIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMuZG9tKSB7XG4gICAgICAgICAgICB0aGlzLnNldERPTShkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tbGluZVwiO1xuICAgICAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB0aGlzLmF0dHJzID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZsYWdzICYgNCAvKiBWaWV3RmxhZy5BdHRyc0RpcnR5ICovKSB7XG4gICAgICAgICAgICBjbGVhckF0dHJpYnV0ZXModGhpcy5kb20pO1xuICAgICAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1saW5lXCI7XG4gICAgICAgICAgICB0aGlzLnByZXZBdHRycyA9IHRoaXMuYXR0cnMgPyBudWxsIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByZXZBdHRycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB1cGRhdGVBdHRycyh0aGlzLmRvbSwgdGhpcy5wcmV2QXR0cnMsIHRoaXMuYXR0cnMpO1xuICAgICAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChcImNtLWxpbmVcIik7XG4gICAgICAgICAgICB0aGlzLnByZXZBdHRycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5zeW5jKHZpZXcsIHRyYWNrKTtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmRvbS5sYXN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChsYXN0ICYmIENvbnRlbnRWaWV3LmdldChsYXN0KSBpbnN0YW5jZW9mIE1hcmtWaWV3KVxuICAgICAgICAgICAgbGFzdCA9IGxhc3QubGFzdENoaWxkO1xuICAgICAgICBpZiAoIWxhc3QgfHwgIXRoaXMubGVuZ3RoIHx8XG4gICAgICAgICAgICBsYXN0Lm5vZGVOYW1lICE9IFwiQlJcIiAmJiAoKF9hID0gQ29udGVudFZpZXcuZ2V0KGxhc3QpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNFZGl0YWJsZSkgPT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICAoIWJyb3dzZXIuaW9zIHx8ICF0aGlzLmNoaWxkcmVuLnNvbWUoY2ggPT4gY2ggaW5zdGFuY2VvZiBUZXh0VmlldykpKSB7XG4gICAgICAgICAgICBsZXQgaGFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJCUlwiKTtcbiAgICAgICAgICAgIGhhY2suY21JZ25vcmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQoaGFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWVhc3VyZVRleHRTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT0gMCB8fCB0aGlzLmxlbmd0aCA+IDIwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB0b3RhbFdpZHRoID0gMCwgdGV4dEhlaWdodDtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBUZXh0VmlldykgfHwgL1teIC1+XS8udGVzdChjaGlsZC50ZXh0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGxldCByZWN0cyA9IGNsaWVudFJlY3RzRm9yKGNoaWxkLmRvbSk7XG4gICAgICAgICAgICBpZiAocmVjdHMubGVuZ3RoICE9IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0b3RhbFdpZHRoICs9IHJlY3RzWzBdLndpZHRoO1xuICAgICAgICAgICAgdGV4dEhlaWdodCA9IHJlY3RzWzBdLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXRvdGFsV2lkdGggPyBudWxsIDoge1xuICAgICAgICAgICAgbGluZUhlaWdodDogdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LFxuICAgICAgICAgICAgY2hhcldpZHRoOiB0b3RhbFdpZHRoIC8gdGhpcy5sZW5ndGgsXG4gICAgICAgICAgICB0ZXh0SGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgcmVjdCA9IGNvb3Jkc0luQ2hpbGRyZW4odGhpcywgcG9zLCBzaWRlKTtcbiAgICAgICAgLy8gQ29ycmVjdCByZWN0YW5nbGUgaGVpZ2h0IGZvciBlbXB0eSBsaW5lcyB3aGVuIHRoZSByZXR1cm5lZFxuICAgICAgICAvLyBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhlIHRleHQgaGVpZ2h0LlxuICAgICAgICBpZiAoIXRoaXMuY2hpbGRyZW4ubGVuZ3RoICYmIHJlY3QgJiYgdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGxldCB7IGhlaWdodE9yYWNsZSB9ID0gdGhpcy5wYXJlbnQudmlldy52aWV3U3RhdGUsIGhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoaGVpZ2h0IC0gaGVpZ2h0T3JhY2xlLmxpbmVIZWlnaHQpIDwgMiAmJiBoZWlnaHRPcmFjbGUudGV4dEhlaWdodCA8IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIGxldCBkaXN0ID0gKGhlaWdodCAtIGhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0KSAvIDI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdG9wOiByZWN0LnRvcCArIGRpc3QsIGJvdHRvbTogcmVjdC5ib3R0b20gLSBkaXN0LCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LmxlZnQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIExpbmVWaWV3ICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09IDAgJiYgb3RoZXIuY2hpbGRyZW4ubGVuZ3RoID09IDAgJiZcbiAgICAgICAgICAgIGF0dHJzRXEodGhpcy5hdHRycywgb3RoZXIuYXR0cnMpICYmIHRoaXMuYnJlYWtBZnRlciA9PSBvdGhlci5icmVha0FmdGVyO1xuICAgIH1cbiAgICBjb3ZlcnMoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgc3RhdGljIGZpbmQoZG9jVmlldywgcG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBvZmYgPSAwOyBpIDwgZG9jVmlldy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGJsb2NrID0gZG9jVmlldy5jaGlsZHJlbltpXSwgZW5kID0gb2ZmICsgYmxvY2subGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2sgaW5zdGFuY2VvZiBMaW5lVmlldylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrO1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmID0gZW5kICsgYmxvY2suYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5jbGFzcyBCbG9ja1dpZGdldFZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3Iod2lkZ2V0LCBsZW5ndGgsIGRlY28pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLmRlY28gPSBkZWNvO1xuICAgICAgICB0aGlzLmJyZWFrQWZ0ZXIgPSAwO1xuICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSBudWxsO1xuICAgIH1cbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBfdGFrZURlY28sIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgICAgICBpZiAoc291cmNlICYmICghKHNvdXJjZSBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldykgfHwgIXRoaXMud2lkZ2V0LmNvbXBhcmUoc291cmNlLndpZGdldCkgfHxcbiAgICAgICAgICAgIGZyb20gPiAwICYmIG9wZW5TdGFydCA8PSAwIHx8IHRvIDwgdGhpcy5sZW5ndGggJiYgb3BlbkVuZCA8PSAwKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBmcm9tICsgKHNvdXJjZSA/IHNvdXJjZS5sZW5ndGggOiAwKSArICh0aGlzLmxlbmd0aCAtIHRvKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICByZXR1cm4gcG9zID09IDAgPyBET01Qb3MuYmVmb3JlKHRoaXMuZG9tKSA6IERPTVBvcy5hZnRlcih0aGlzLmRvbSwgcG9zID09IHRoaXMubGVuZ3RoKTtcbiAgICB9XG4gICAgc3BsaXQoYXQpIHtcbiAgICAgICAgbGV0IGxlbiA9IHRoaXMubGVuZ3RoIC0gYXQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gYXQ7XG4gICAgICAgIGxldCBlbmQgPSBuZXcgQmxvY2tXaWRnZXRWaWV3KHRoaXMud2lkZ2V0LCBsZW4sIHRoaXMuZGVjbyk7XG4gICAgICAgIGVuZC5icmVha0FmdGVyID0gdGhpcy5icmVha0FmdGVyO1xuICAgICAgICByZXR1cm4gZW5kO1xuICAgIH1cbiAgICBnZXQgY2hpbGRyZW4oKSB7IHJldHVybiBub0NoaWxkcmVuOyB9XG4gICAgc3luYyh2aWV3KSB7XG4gICAgICAgIGlmICghdGhpcy5kb20gfHwgIXRoaXMud2lkZ2V0LnVwZGF0ZURPTSh0aGlzLmRvbSwgdmlldykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSAmJiB0aGlzLnByZXZXaWRnZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0LmRlc3Ryb3kodGhpcy5kb20pO1xuICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKHRoaXMud2lkZ2V0LnRvRE9NKHZpZXcpKTtcbiAgICAgICAgICAgIGlmICghdGhpcy53aWRnZXQuZWRpdGFibGUpXG4gICAgICAgICAgICAgICAgdGhpcy5kb20uY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBvdmVycmlkZURPTVRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnZpZXcuc3RhdGUuZG9jLnNsaWNlKHRoaXMucG9zQXRTdGFydCwgdGhpcy5wb3NBdEVuZCkgOiBUZXh0LmVtcHR5O1xuICAgIH1cbiAgICBkb21Cb3VuZHNBcm91bmQoKSB7IHJldHVybiBudWxsOyB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldyAmJlxuICAgICAgICAgICAgb3RoZXIud2lkZ2V0LmNvbnN0cnVjdG9yID09IHRoaXMud2lkZ2V0LmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBpZiAoIW90aGVyLndpZGdldC5jb21wYXJlKHRoaXMud2lkZ2V0KSlcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtEaXJ0eSh0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSAmJiAhdGhpcy5wcmV2V2lkZ2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucHJldldpZGdldCA9IHRoaXMud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy53aWRnZXQgPSBvdGhlci53aWRnZXQ7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG90aGVyLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZGVjbyA9IG90aGVyLmRlY287XG4gICAgICAgICAgICB0aGlzLmJyZWFrQWZ0ZXIgPSBvdGhlci5icmVha0FmdGVyO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbigpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBpZ25vcmVFdmVudChldmVudCkgeyByZXR1cm4gdGhpcy53aWRnZXQuaWdub3JlRXZlbnQoZXZlbnQpOyB9XG4gICAgZ2V0IGlzRWRpdGFibGUoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGdldCBpc1dpZGdldCgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IGN1c3RvbSA9IHRoaXMud2lkZ2V0LmNvb3Jkc0F0KHRoaXMuZG9tLCBwb3MsIHNpZGUpO1xuICAgICAgICBpZiAoY3VzdG9tKVxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbTtcbiAgICAgICAgaWYgKHRoaXMud2lkZ2V0IGluc3RhbmNlb2YgQmxvY2tHYXBXaWRnZXQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5SZWN0KHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCB0aGlzLmxlbmd0aCA/IHBvcyA9PSAwIDogc2lkZSA8PSAwKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLndpZGdldC5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICB9XG4gICAgY292ZXJzKHNpZGUpIHtcbiAgICAgICAgbGV0IHsgc3RhcnRTaWRlLCBlbmRTaWRlIH0gPSB0aGlzLmRlY287XG4gICAgICAgIHJldHVybiBzdGFydFNpZGUgPT0gZW5kU2lkZSA/IGZhbHNlIDogc2lkZSA8IDAgPyBzdGFydFNpZGUgPCAwIDogZW5kU2lkZSA+IDA7XG4gICAgfVxufVxuY2xhc3MgQmxvY2tHYXBXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihoZWlnaHQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgfVxuICAgIHRvRE9NKCkge1xuICAgICAgICBsZXQgZWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZWx0LmNsYXNzTmFtZSA9IFwiY20tZ2FwXCI7XG4gICAgICAgIHRoaXMudXBkYXRlRE9NKGVsdCk7XG4gICAgICAgIHJldHVybiBlbHQ7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci5oZWlnaHQgPT0gdGhpcy5oZWlnaHQ7IH1cbiAgICB1cGRhdGVET00oZWx0KSB7XG4gICAgICAgIGVsdC5zdHlsZS5oZWlnaHQgPSB0aGlzLmhlaWdodCArIFwicHhcIjtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGdldCBlZGl0YWJsZSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBnZXQgZXN0aW1hdGVkSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy5oZWlnaHQ7IH1cbiAgICBpZ25vcmVFdmVudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5cbmNsYXNzIENvbnRlbnRCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihkb2MsIHBvcywgZW5kLCBkaXNhbGxvd0Jsb2NrRWZmZWN0c0Zvcikge1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuZW5kID0gZW5kO1xuICAgICAgICB0aGlzLmRpc2FsbG93QmxvY2tFZmZlY3RzRm9yID0gZGlzYWxsb3dCbG9ja0VmZmVjdHNGb3I7XG4gICAgICAgIHRoaXMuY29udGVudCA9IFtdO1xuICAgICAgICB0aGlzLmN1ckxpbmUgPSBudWxsO1xuICAgICAgICB0aGlzLmJyZWFrQXRTdGFydCA9IDA7XG4gICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICB0aGlzLmJ1ZmZlck1hcmtzID0gW107XG4gICAgICAgIC8vIFNldCB0byBmYWxzZSBkaXJlY3RseSBhZnRlciBhIHdpZGdldCB0aGF0IGNvdmVycyB0aGUgcG9zaXRpb24gYWZ0ZXIgaXRcbiAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IHRydWU7XG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMub3BlbkVuZCA9IC0xO1xuICAgICAgICB0aGlzLnRleHQgPSBcIlwiO1xuICAgICAgICB0aGlzLnRleHRPZmYgPSAwO1xuICAgICAgICB0aGlzLmN1cnNvciA9IGRvYy5pdGVyKCk7XG4gICAgICAgIHRoaXMuc2tpcCA9IHBvcztcbiAgICB9XG4gICAgcG9zQ292ZXJlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5icmVha0F0U3RhcnQgJiYgdGhpcy5kb2MubGluZUF0KHRoaXMucG9zKS5mcm9tICE9IHRoaXMucG9zO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiAhKGxhc3QuYnJlYWtBZnRlciB8fCBsYXN0IGluc3RhbmNlb2YgQmxvY2tXaWRnZXRWaWV3ICYmIGxhc3QuZGVjby5lbmRTaWRlIDwgMCk7XG4gICAgfVxuICAgIGdldExpbmUoKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXJMaW5lKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQucHVzaCh0aGlzLmN1ckxpbmUgPSBuZXcgTGluZVZpZXcpO1xuICAgICAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyTGluZTtcbiAgICB9XG4gICAgZmx1c2hCdWZmZXIoYWN0aXZlID0gdGhpcy5idWZmZXJNYXJrcykge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1ckxpbmUuYXBwZW5kKHdyYXBNYXJrcyhuZXcgV2lkZ2V0QnVmZmVyVmlldygtMSksIGFjdGl2ZSksIGFjdGl2ZS5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQnVmZmVyID0gMCAvKiBCdWYuTm8gKi87XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkQmxvY2tXaWRnZXQodmlldykge1xuICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuY3VyTGluZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY29udGVudC5wdXNoKHZpZXcpO1xuICAgIH1cbiAgICBmaW5pc2gob3BlbkVuZCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQnVmZmVyICYmIG9wZW5FbmQgPD0gdGhpcy5idWZmZXJNYXJrcy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICBpZiAoIXRoaXMucG9zQ292ZXJlZCgpICYmXG4gICAgICAgICAgICAhKG9wZW5FbmQgJiYgdGhpcy5jb250ZW50Lmxlbmd0aCAmJiB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgQmxvY2tXaWRnZXRWaWV3KSlcbiAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpO1xuICAgIH1cbiAgICBidWlsZFRleHQobGVuZ3RoLCBhY3RpdmUsIG9wZW5TdGFydCkge1xuICAgICAgICB3aGlsZSAobGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudGV4dE9mZiA9PSB0aGlzLnRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgdmFsdWUsIGxpbmVCcmVhaywgZG9uZSB9ID0gdGhpcy5jdXJzb3IubmV4dCh0aGlzLnNraXApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJhbiBvdXQgb2YgdGV4dCBjb250ZW50IHdoZW4gZHJhd2luZyBpbmxpbmUgdmlld3NcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVCcmVhaykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucG9zQ292ZXJlZCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50W3RoaXMuY29udGVudC5sZW5ndGggLSAxXS5icmVha0FmdGVyID0gMTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icmVha0F0U3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyTGluZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBsZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0T2ZmID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdGFrZSA9IE1hdGgubWluKHRoaXMudGV4dC5sZW5ndGggLSB0aGlzLnRleHRPZmYsIGxlbmd0aCwgNTEyIC8qIFQuQ2h1bmsgKi8pO1xuICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcihhY3RpdmUuc2xpY2UoYWN0aXZlLmxlbmd0aCAtIG9wZW5TdGFydCkpO1xuICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCkuYXBwZW5kKHdyYXBNYXJrcyhuZXcgVGV4dFZpZXcodGhpcy50ZXh0LnNsaWNlKHRoaXMudGV4dE9mZiwgdGhpcy50ZXh0T2ZmICsgdGFrZSkpLCBhY3RpdmUpLCBvcGVuU3RhcnQpO1xuICAgICAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnRleHRPZmYgKz0gdGFrZTtcbiAgICAgICAgICAgIGxlbmd0aCAtPSB0YWtlO1xuICAgICAgICAgICAgb3BlblN0YXJ0ID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzcGFuKGZyb20sIHRvLCBhY3RpdmUsIG9wZW5TdGFydCkge1xuICAgICAgICB0aGlzLmJ1aWxkVGV4dCh0byAtIGZyb20sIGFjdGl2ZSwgb3BlblN0YXJ0KTtcbiAgICAgICAgdGhpcy5wb3MgPSB0bztcbiAgICAgICAgaWYgKHRoaXMub3BlblN0YXJ0IDwgMClcbiAgICAgICAgICAgIHRoaXMub3BlblN0YXJ0ID0gb3BlblN0YXJ0O1xuICAgIH1cbiAgICBwb2ludChmcm9tLCB0bywgZGVjbywgYWN0aXZlLCBvcGVuU3RhcnQsIGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FsbG93QmxvY2tFZmZlY3RzRm9yW2luZGV4XSAmJiBkZWNvIGluc3RhbmNlb2YgUG9pbnREZWNvcmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZGVjby5ibG9jaylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJsb2NrIGRlY29yYXRpb25zIG1heSBub3QgYmUgc3BlY2lmaWVkIHZpYSBwbHVnaW5zXCIpO1xuICAgICAgICAgICAgaWYgKHRvID4gdGhpcy5kb2MubGluZUF0KHRoaXMucG9zKS50bylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkRlY29yYXRpb25zIHRoYXQgcmVwbGFjZSBsaW5lIGJyZWFrcyBtYXkgbm90IGJlIHNwZWNpZmllZCB2aWEgcGx1Z2luc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGVuID0gdG8gLSBmcm9tO1xuICAgICAgICBpZiAoZGVjbyBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbikge1xuICAgICAgICAgICAgaWYgKGRlY28uYmxvY2spIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjby5zdGFydFNpZGUgPiAwICYmICF0aGlzLnBvc0NvdmVyZWQoKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRCbG9ja1dpZGdldChuZXcgQmxvY2tXaWRnZXRWaWV3KGRlY28ud2lkZ2V0IHx8IE51bGxXaWRnZXQuYmxvY2ssIGxlbiwgZGVjbykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHZpZXcgPSBXaWRnZXRWaWV3LmNyZWF0ZShkZWNvLndpZGdldCB8fCBOdWxsV2lkZ2V0LmlubGluZSwgbGVuLCBsZW4gPyAwIDogZGVjby5zdGFydFNpZGUpO1xuICAgICAgICAgICAgICAgIGxldCBjdXJzb3JCZWZvcmUgPSB0aGlzLmF0Q3Vyc29yUG9zICYmICF2aWV3LmlzRWRpdGFibGUgJiYgb3BlblN0YXJ0IDw9IGFjdGl2ZS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgKGZyb20gPCB0byB8fCBkZWNvLnN0YXJ0U2lkZSA+IDApO1xuICAgICAgICAgICAgICAgIGxldCBjdXJzb3JBZnRlciA9ICF2aWV3LmlzRWRpdGFibGUgJiYgKGZyb20gPCB0byB8fCBvcGVuU3RhcnQgPiBhY3RpdmUubGVuZ3RoIHx8IGRlY28uc3RhcnRTaWRlIDw9IDApO1xuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlciA9PSAyIC8qIEJ1Zi5JZkN1cnNvciAqLyAmJiAhY3Vyc29yQmVmb3JlICYmICF2aWV3LmlzRWRpdGFibGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hCdWZmZXIoYWN0aXZlKTtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yQmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKHdyYXBNYXJrcyhuZXcgV2lkZ2V0QnVmZmVyVmlldygxKSwgYWN0aXZlKSwgb3BlblN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgb3BlblN0YXJ0ID0gYWN0aXZlLmxlbmd0aCArIE1hdGgubWF4KDAsIG9wZW5TdGFydCAtIGFjdGl2ZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCh3cmFwTWFya3ModmlldywgYWN0aXZlKSwgb3BlblN0YXJ0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0Q3Vyc29yUG9zID0gY3Vyc29yQWZ0ZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQnVmZmVyID0gIWN1cnNvckFmdGVyID8gMCAvKiBCdWYuTm8gKi8gOiBmcm9tIDwgdG8gfHwgb3BlblN0YXJ0ID4gYWN0aXZlLmxlbmd0aCA/IDEgLyogQnVmLlllcyAqLyA6IDIgLyogQnVmLklmQ3Vyc29yICovO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdCdWZmZXIpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyTWFya3MgPSBhY3RpdmUuc2xpY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmRvYy5saW5lQXQodGhpcy5wb3MpLmZyb20gPT0gdGhpcy5wb3MpIHsgLy8gTGluZSBkZWNvcmF0aW9uXG4gICAgICAgICAgICB0aGlzLmdldExpbmUoKS5hZGRMaW5lRGVjbyhkZWNvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAvLyBBZHZhbmNlIHRoZSBpdGVyYXRvciBwYXN0IHRoZSByZXBsYWNlZCBjb250ZW50XG4gICAgICAgICAgICBpZiAodGhpcy50ZXh0T2ZmICsgbGVuIDw9IHRoaXMudGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPZmYgKz0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lwICs9IGxlbiAtICh0aGlzLnRleHQubGVuZ3RoIC0gdGhpcy50ZXh0T2ZmKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9mZiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvcyA9IHRvO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdGFydCA8IDApXG4gICAgICAgICAgICB0aGlzLm9wZW5TdGFydCA9IG9wZW5TdGFydDtcbiAgICB9XG4gICAgc3RhdGljIGJ1aWxkKHRleHQsIGZyb20sIHRvLCBkZWNvcmF0aW9ucywgZHluYW1pY0RlY29yYXRpb25NYXApIHtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgQ29udGVudEJ1aWxkZXIodGV4dCwgZnJvbSwgdG8sIGR5bmFtaWNEZWNvcmF0aW9uTWFwKTtcbiAgICAgICAgYnVpbGRlci5vcGVuRW5kID0gUmFuZ2VTZXQuc3BhbnMoZGVjb3JhdGlvbnMsIGZyb20sIHRvLCBidWlsZGVyKTtcbiAgICAgICAgaWYgKGJ1aWxkZXIub3BlblN0YXJ0IDwgMClcbiAgICAgICAgICAgIGJ1aWxkZXIub3BlblN0YXJ0ID0gYnVpbGRlci5vcGVuRW5kO1xuICAgICAgICBidWlsZGVyLmZpbmlzaChidWlsZGVyLm9wZW5FbmQpO1xuICAgICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9XG59XG5mdW5jdGlvbiB3cmFwTWFya3ModmlldywgYWN0aXZlKSB7XG4gICAgZm9yIChsZXQgbWFyayBvZiBhY3RpdmUpXG4gICAgICAgIHZpZXcgPSBuZXcgTWFya1ZpZXcobWFyaywgW3ZpZXddLCB2aWV3Lmxlbmd0aCk7XG4gICAgcmV0dXJuIHZpZXc7XG59XG5jbGFzcyBOdWxsV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IodGFnKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIudGFnID09IHRoaXMudGFnOyB9XG4gICAgdG9ET00oKSB7IHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMudGFnKTsgfVxuICAgIHVwZGF0ZURPTShlbHQpIHsgcmV0dXJuIGVsdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IHRoaXMudGFnOyB9XG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gdHJ1ZTsgfVxufVxuTnVsbFdpZGdldC5pbmxpbmUgPSAvKkBfX1BVUkVfXyovbmV3IE51bGxXaWRnZXQoXCJzcGFuXCIpO1xuTnVsbFdpZGdldC5ibG9jayA9IC8qQF9fUFVSRV9fKi9uZXcgTnVsbFdpZGdldChcImRpdlwiKTtcblxuLyoqXG5Vc2VkIHRvIGluZGljYXRlIFt0ZXh0IGRpcmVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudGV4dERpcmVjdGlvbikuXG4qL1xudmFyIERpcmVjdGlvbiA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKERpcmVjdGlvbikge1xuICAgIC8vIChUaGVzZSBhcmUgY2hvc2VuIHRvIG1hdGNoIHRoZSBiYXNlIGxldmVscywgaW4gYmlkaSBhbGdvcml0aG1cbiAgICAvLyB0ZXJtcywgb2Ygc3BhbnMgaW4gdGhhdCBkaXJlY3Rpb24uKVxuICAgIC8qKlxuICAgIExlZnQtdG8tcmlnaHQuXG4gICAgKi9cbiAgICBEaXJlY3Rpb25bRGlyZWN0aW9uW1wiTFRSXCJdID0gMF0gPSBcIkxUUlwiO1xuICAgIC8qKlxuICAgIFJpZ2h0LXRvLWxlZnQuXG4gICAgKi9cbiAgICBEaXJlY3Rpb25bRGlyZWN0aW9uW1wiUlRMXCJdID0gMV0gPSBcIlJUTFwiO1xucmV0dXJuIERpcmVjdGlvbn0pKERpcmVjdGlvbiB8fCAoRGlyZWN0aW9uID0ge30pKTtcbmNvbnN0IExUUiA9IERpcmVjdGlvbi5MVFIsIFJUTCA9IERpcmVjdGlvbi5SVEw7XG4vLyBEZWNvZGUgYSBzdHJpbmcgd2l0aCBlYWNoIHR5cGUgZW5jb2RlZCBhcyBsb2cyKHR5cGUpXG5mdW5jdGlvbiBkZWMoc3RyKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKVxuICAgICAgICByZXN1bHQucHVzaCgxIDw8ICtzdHJbaV0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyBDaGFyYWN0ZXIgdHlwZXMgZm9yIGNvZGVwb2ludHMgMCB0byAweGY4XG5jb25zdCBMb3dUeXBlcyA9IC8qQF9fUFVSRV9fKi9kZWMoXCI4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODY2Njg4ODg4ODc4NzgzMzMzMzMzMzMzNzg4ODg4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODg4ODg4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4Nzg2NjY2ODg4ODA4ODg4ODY2MzM4MDg4ODMwODg4ODgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOFwiKTtcbi8vIENoYXJhY3RlciB0eXBlcyBmb3IgY29kZXBvaW50cyAweDYwMCB0byAweDZmOVxuY29uc3QgQXJhYmljVHlwZXMgPSAvKkBfX1BVUkVfXyovZGVjKFwiNDQ0NDQ0ODgyNjYyNzI4ODk5OTk5OTk5OTk5MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyOTk5OTk5OTk5OTk5OTk5OTk5OTk5NDQ0NDQ0NDQ0NDY0NDIyMjgyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjk5OTk5OTk0OTk5OTk5OTIyOTk4OTk5OTIyMzMzMzMzMzMzM1wiKTtcbmNvbnN0IEJyYWNrZXRzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCksIEJyYWNrZXRTdGFjayA9IFtdO1xuLy8gVGhlcmUncyBhIGxvdCBtb3JlIGluXG4vLyBodHRwczovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvVUNEL2xhdGVzdC91Y2QvQmlkaUJyYWNrZXRzLnR4dCxcbi8vIHdoaWNoIGFyZSBsZWZ0IG91dCB0byBrZWVwIGNvZGUgc2l6ZSBkb3duLlxuZm9yIChsZXQgcCBvZiBbXCIoKVwiLCBcIltdXCIsIFwie31cIl0pIHtcbiAgICBsZXQgbCA9IC8qQF9fUFVSRV9fKi9wLmNoYXJDb2RlQXQoMCksIHIgPSAvKkBfX1BVUkVfXyovcC5jaGFyQ29kZUF0KDEpO1xuICAgIEJyYWNrZXRzW2xdID0gcjtcbiAgICBCcmFja2V0c1tyXSA9IC1sO1xufVxuZnVuY3Rpb24gY2hhclR5cGUoY2gpIHtcbiAgICByZXR1cm4gY2ggPD0gMHhmNyA/IExvd1R5cGVzW2NoXSA6XG4gICAgICAgIDB4NTkwIDw9IGNoICYmIGNoIDw9IDB4NWY0ID8gMiAvKiBULlIgKi8gOlxuICAgICAgICAgICAgMHg2MDAgPD0gY2ggJiYgY2ggPD0gMHg2ZjkgPyBBcmFiaWNUeXBlc1tjaCAtIDB4NjAwXSA6XG4gICAgICAgICAgICAgICAgMHg2ZWUgPD0gY2ggJiYgY2ggPD0gMHg4YWMgPyA0IC8qIFQuQUwgKi8gOlxuICAgICAgICAgICAgICAgICAgICAweDIwMDAgPD0gY2ggJiYgY2ggPD0gMHgyMDBjID8gMjU2IC8qIFQuTkkgKi8gOlxuICAgICAgICAgICAgICAgICAgICAgICAgMHhmYjUwIDw9IGNoICYmIGNoIDw9IDB4ZmRmZiA/IDQgLyogVC5BTCAqLyA6IDEgLyogVC5MICovO1xufVxuY29uc3QgQmlkaVJFID0gL1tcXHUwNTkwLVxcdTA1ZjRcXHUwNjAwLVxcdTA2ZmZcXHUwNzAwLVxcdTA4YWNcXHVmYjUwLVxcdWZkZmZdLztcbi8qKlxuUmVwcmVzZW50cyBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgdGV4dCB0aGF0IGhhcyBhIHNpbmdsZSBkaXJlY3Rpb25cbihhcyBpbiBsZWZ0LXRvLXJpZ2h0IG9yIHJpZ2h0LXRvLWxlZnQpLlxuKi9cbmNsYXNzIEJpZGlTcGFuIHtcbiAgICAvKipcbiAgICBUaGUgZGlyZWN0aW9uIG9mIHRoaXMgc3Bhbi5cbiAgICAqL1xuICAgIGdldCBkaXIoKSB7IHJldHVybiB0aGlzLmxldmVsICUgMiA/IFJUTCA6IExUUjsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHRoZSBzcGFuIChyZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUpLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiB0aGUgc3Bhbi5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgW1wiYmlkaVxuICAgIGxldmVsXCJdKGh0dHBzOi8vdW5pY29kZS5vcmcvcmVwb3J0cy90cjkvI0Jhc2ljX0Rpc3BsYXlfQWxnb3JpdGhtKVxuICAgIG9mIHRoZSBzcGFuIChpbiB0aGlzIGNvbnRleHQsIDAgbWVhbnNcbiAgICBsZWZ0LXRvLXJpZ2h0LCAxIG1lYW5zIHJpZ2h0LXRvLWxlZnQsIDIgbWVhbnMgbGVmdC10by1yaWdodFxuICAgIG51bWJlciBpbnNpZGUgcmlnaHQtdG8tbGVmdCB0ZXh0KS5cbiAgICAqL1xuICAgIGxldmVsKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5sZXZlbCA9IGxldmVsO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNpZGUoZW5kLCBkaXIpIHsgcmV0dXJuICh0aGlzLmRpciA9PSBkaXIpID09IGVuZCA/IHRoaXMudG8gOiB0aGlzLmZyb207IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZvcndhcmQoZm9yd2FyZCwgZGlyKSB7IHJldHVybiBmb3J3YXJkID09ICh0aGlzLmRpciA9PSBkaXIpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZmluZChvcmRlciwgaW5kZXgsIGxldmVsLCBhc3NvYykge1xuICAgICAgICBsZXQgbWF5YmUgPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHNwYW4gPSBvcmRlcltpXTtcbiAgICAgICAgICAgIGlmIChzcGFuLmZyb20gPD0gaW5kZXggJiYgc3Bhbi50byA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFuLmxldmVsID09IGxldmVsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIG11bHRpcGxlIHNwYW5zIG1hdGNoLCBpZiBhc3NvYyAhPSAwLCB0YWtlIHRoZSBvbmUgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGNvdmVycyB0aGF0IHNpZGUsIG90aGVyd2lzZSB0YWtlIHRoZSBvbmUgd2l0aCB0aGUgbWluaW11bVxuICAgICAgICAgICAgICAgIC8vIGxldmVsLlxuICAgICAgICAgICAgICAgIGlmIChtYXliZSA8IDAgfHwgKGFzc29jICE9IDAgPyAoYXNzb2MgPCAwID8gc3Bhbi5mcm9tIDwgaW5kZXggOiBzcGFuLnRvID4gaW5kZXgpIDogb3JkZXJbbWF5YmVdLmxldmVsID4gc3Bhbi5sZXZlbCkpXG4gICAgICAgICAgICAgICAgICAgIG1heWJlID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWF5YmUgPCAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICAgIHJldHVybiBtYXliZTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc29sYXRlc0VxKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGlBID0gYVtpXSwgaUIgPSBiW2ldO1xuICAgICAgICBpZiAoaUEuZnJvbSAhPSBpQi5mcm9tIHx8IGlBLnRvICE9IGlCLnRvIHx8IGlBLmRpcmVjdGlvbiAhPSBpQi5kaXJlY3Rpb24gfHwgIWlzb2xhdGVzRXEoaUEuaW5uZXIsIGlCLmlubmVyKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBSZXVzZWQgYXJyYXkgb2YgY2hhcmFjdGVyIHR5cGVzXG5jb25zdCB0eXBlcyA9IFtdO1xuLy8gRmlsbCBpbiB0aGUgY2hhcmFjdGVyIHR5cGVzIChpbiBgdHlwZXNgKSBmcm9tIGBmcm9tYCB0byBgdG9gIGFuZFxuLy8gYXBwbHkgVyBub3JtYWxpemF0aW9uIHJ1bGVzLlxuZnVuY3Rpb24gY29tcHV0ZUNoYXJUeXBlcyhsaW5lLCByRnJvbSwgclRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKSB7XG4gICAgZm9yIChsZXQgaUkgPSAwOyBpSSA8PSBpc29sYXRlcy5sZW5ndGg7IGlJKyspIHtcbiAgICAgICAgbGV0IGZyb20gPSBpSSA/IGlzb2xhdGVzW2lJIC0gMV0udG8gOiByRnJvbSwgdG8gPSBpSSA8IGlzb2xhdGVzLmxlbmd0aCA/IGlzb2xhdGVzW2lJXS5mcm9tIDogclRvO1xuICAgICAgICBsZXQgcHJldlR5cGUgPSBpSSA/IDI1NiAvKiBULk5JICovIDogb3V0ZXJUeXBlO1xuICAgICAgICAvLyBXMS4gRXhhbWluZSBlYWNoIG5vbi1zcGFjaW5nIG1hcmsgKE5TTSkgaW4gdGhlIGxldmVsIHJ1biwgYW5kXG4gICAgICAgIC8vIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgTlNNIHRvIHRoZSB0eXBlIG9mIHRoZSBwcmV2aW91c1xuICAgICAgICAvLyBjaGFyYWN0ZXIuIElmIHRoZSBOU00gaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsZXZlbCBydW4sIGl0IHdpbGxcbiAgICAgICAgLy8gZ2V0IHRoZSB0eXBlIG9mIHNvci5cbiAgICAgICAgLy8gVzIuIFNlYXJjaCBiYWNrd2FyZHMgZnJvbSBlYWNoIGluc3RhbmNlIG9mIGEgRXVyb3BlYW4gbnVtYmVyXG4gICAgICAgIC8vIHVudGlsIHRoZSBmaXJzdCBzdHJvbmcgdHlwZSAoUiwgTCwgQUwsIG9yIHNvcikgaXMgZm91bmQuIElmIGFuXG4gICAgICAgIC8vIEFMIGlzIGZvdW5kLCBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIEV1cm9wZWFuIG51bWJlciB0byBBcmFiaWNcbiAgICAgICAgLy8gbnVtYmVyLlxuICAgICAgICAvLyBXMy4gQ2hhbmdlIGFsbCBBTHMgdG8gUi5cbiAgICAgICAgLy8gKExlZnQgYWZ0ZXIgdGhpczogTCwgUiwgRU4sIEFOLCBFVCwgQ1MsIE5JKVxuICAgICAgICBmb3IgKGxldCBpID0gZnJvbSwgcHJldiA9IHByZXZUeXBlLCBwcmV2U3Ryb25nID0gcHJldlR5cGU7IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IGNoYXJUeXBlKGxpbmUuY2hhckNvZGVBdChpKSk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PSA1MTIgLyogVC5OU00gKi8pXG4gICAgICAgICAgICAgICAgdHlwZSA9IHByZXY7XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IDggLyogVC5FTiAqLyAmJiBwcmV2U3Ryb25nID09IDQgLyogVC5BTCAqLylcbiAgICAgICAgICAgICAgICB0eXBlID0gMTYgLyogVC5BTiAqLztcbiAgICAgICAgICAgIHR5cGVzW2ldID0gdHlwZSA9PSA0IC8qIFQuQUwgKi8gPyAyIC8qIFQuUiAqLyA6IHR5cGU7XG4gICAgICAgICAgICBpZiAodHlwZSAmIDcgLyogVC5TdHJvbmcgKi8pXG4gICAgICAgICAgICAgICAgcHJldlN0cm9uZyA9IHR5cGU7XG4gICAgICAgICAgICBwcmV2ID0gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXNS4gQSBzZXF1ZW5jZSBvZiBFdXJvcGVhbiB0ZXJtaW5hdG9ycyBhZGphY2VudCB0byBFdXJvcGVhblxuICAgICAgICAvLyBudW1iZXJzIGNoYW5nZXMgdG8gYWxsIEV1cm9wZWFuIG51bWJlcnMuXG4gICAgICAgIC8vIFc2LiBPdGhlcndpc2UsIHNlcGFyYXRvcnMgYW5kIHRlcm1pbmF0b3JzIGNoYW5nZSB0byBPdGhlclxuICAgICAgICAvLyBOZXV0cmFsLlxuICAgICAgICAvLyBXNy4gU2VhcmNoIGJhY2t3YXJkcyBmcm9tIGVhY2ggaW5zdGFuY2Ugb2YgYSBFdXJvcGVhbiBudW1iZXJcbiAgICAgICAgLy8gdW50aWwgdGhlIGZpcnN0IHN0cm9uZyB0eXBlIChSLCBMLCBvciBzb3IpIGlzIGZvdW5kLiBJZiBhbiBMIGlzXG4gICAgICAgIC8vIGZvdW5kLCB0aGVuIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgRXVyb3BlYW4gbnVtYmVyIHRvIEwuXG4gICAgICAgIC8vIChMZWZ0IGFmdGVyIHRoaXM6IEwsIFIsIEVOK0FOLCBOSSlcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb20sIHByZXYgPSBwcmV2VHlwZSwgcHJldlN0cm9uZyA9IHByZXZUeXBlOyBpIDwgdG87IGkrKykge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSB0eXBlc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlID09IDEyOCAvKiBULkNTICovKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCB0byAtIDEgJiYgcHJldiA9PSB0eXBlc1tpICsgMV0gJiYgKHByZXYgJiAyNCAvKiBULk51bSAqLykpXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlc1tpXSA9IHByZXY7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0eXBlc1tpXSA9IDI1NiAvKiBULk5JICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSA2NCAvKiBULkVUICovKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIHdoaWxlIChlbmQgPCB0byAmJiB0eXBlc1tlbmRdID09IDY0IC8qIFQuRVQgKi8pXG4gICAgICAgICAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICAgICAgICAgIGxldCByZXBsYWNlID0gKGkgJiYgcHJldiA9PSA4IC8qIFQuRU4gKi8pIHx8IChlbmQgPCByVG8gJiYgdHlwZXNbZW5kXSA9PSA4IC8qIFQuRU4gKi8pID8gKHByZXZTdHJvbmcgPT0gMSAvKiBULkwgKi8gPyAxIC8qIFQuTCAqLyA6IDggLyogVC5FTiAqLykgOiAyNTYgLyogVC5OSSAqLztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IGVuZDsgaisrKVxuICAgICAgICAgICAgICAgICAgICB0eXBlc1tqXSA9IHJlcGxhY2U7XG4gICAgICAgICAgICAgICAgaSA9IGVuZCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IDggLyogVC5FTiAqLyAmJiBwcmV2U3Ryb25nID09IDEgLyogVC5MICovKSB7XG4gICAgICAgICAgICAgICAgdHlwZXNbaV0gPSAxIC8qIFQuTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXYgPSB0eXBlO1xuICAgICAgICAgICAgaWYgKHR5cGUgJiA3IC8qIFQuU3Ryb25nICovKVxuICAgICAgICAgICAgICAgIHByZXZTdHJvbmcgPSB0eXBlO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gUHJvY2VzcyBicmFja2V0cyB0aHJvdWdob3V0IGEgcnVuIHNlcXVlbmNlLlxuZnVuY3Rpb24gcHJvY2Vzc0JyYWNrZXRQYWlycyhsaW5lLCByRnJvbSwgclRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKSB7XG4gICAgbGV0IG9wcG9zaXRlVHlwZSA9IG91dGVyVHlwZSA9PSAxIC8qIFQuTCAqLyA/IDIgLyogVC5SICovIDogMSAvKiBULkwgKi87XG4gICAgZm9yIChsZXQgaUkgPSAwLCBzSSA9IDAsIGNvbnRleHQgPSAwOyBpSSA8PSBpc29sYXRlcy5sZW5ndGg7IGlJKyspIHtcbiAgICAgICAgbGV0IGZyb20gPSBpSSA/IGlzb2xhdGVzW2lJIC0gMV0udG8gOiByRnJvbSwgdG8gPSBpSSA8IGlzb2xhdGVzLmxlbmd0aCA/IGlzb2xhdGVzW2lJXS5mcm9tIDogclRvO1xuICAgICAgICAvLyBOMC4gUHJvY2VzcyBicmFja2V0IHBhaXJzIGluIGFuIGlzb2xhdGluZyBydW4gc2VxdWVuY2VcbiAgICAgICAgLy8gc2VxdWVudGlhbGx5IGluIHRoZSBsb2dpY2FsIG9yZGVyIG9mIHRoZSB0ZXh0IHBvc2l0aW9ucyBvZiB0aGVcbiAgICAgICAgLy8gb3BlbmluZyBwYWlyZWQgYnJhY2tldHMgdXNpbmcgdGhlIGxvZ2ljIGdpdmVuIGJlbG93LiBXaXRoaW4gdGhpc1xuICAgICAgICAvLyBzY29wZSwgYmlkaXJlY3Rpb25hbCB0eXBlcyBFTiBhbmQgQU4gYXJlIHRyZWF0ZWQgYXMgUi5cbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb20sIGNoLCBiciwgdHlwZTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEtlZXBzIFtzdGFydEluZGV4LCB0eXBlLCBzdHJvbmdTZWVuXSB0cmlwbGVzIGZvciBlYWNoIG9wZW5cbiAgICAgICAgICAgIC8vIGJyYWNrZXQgb24gQnJhY2tldFN0YWNrLlxuICAgICAgICAgICAgaWYgKGJyID0gQnJhY2tldHNbY2ggPSBsaW5lLmNoYXJDb2RlQXQoaSldKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJyIDwgMCkgeyAvLyBDbG9zaW5nIGJyYWNrZXRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc0ogPSBzSSAtIDM7IHNKID49IDA7IHNKIC09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCcmFja2V0U3RhY2tbc0ogKyAxXSA9PSAtYnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmxhZ3MgPSBCcmFja2V0U3RhY2tbc0ogKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IChmbGFncyAmIDIgLyogQnJhY2tldGVkLkVtYmVkSW5zaWRlICovKSA/IG91dGVyVHlwZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoZmxhZ3MgJiA0IC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUluc2lkZSAqLykgPyAwIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIDEgLyogQnJhY2tldGVkLk9wcG9zaXRlQmVmb3JlICovKSA/IG9wcG9zaXRlVHlwZSA6IG91dGVyVHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXNbaV0gPSB0eXBlc1tCcmFja2V0U3RhY2tbc0pdXSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc0kgPSBzSjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChCcmFja2V0U3RhY2subGVuZ3RoID09IDE4OSAvKiBCcmFja2V0ZWQuTWF4RGVwdGggKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBCcmFja2V0U3RhY2tbc0krK10gPSBpO1xuICAgICAgICAgICAgICAgICAgICBCcmFja2V0U3RhY2tbc0krK10gPSBjaDtcbiAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NJKytdID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgodHlwZSA9IHR5cGVzW2ldKSA9PSAyIC8qIFQuUiAqLyB8fCB0eXBlID09IDEgLyogVC5MICovKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVtYmVkID0gdHlwZSA9PSBvdXRlclR5cGU7XG4gICAgICAgICAgICAgICAgY29udGV4dCA9IGVtYmVkID8gMCA6IDEgLyogQnJhY2tldGVkLk9wcG9zaXRlQmVmb3JlICovO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNKID0gc0kgLSAzOyBzSiA+PSAwOyBzSiAtPSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXIgPSBCcmFja2V0U3RhY2tbc0ogKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1ciAmIDIgLyogQnJhY2tldGVkLkVtYmVkSW5zaWRlICovKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbWJlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NKICsgMl0gfD0gMiAvKiBCcmFja2V0ZWQuRW1iZWRJbnNpZGUgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyICYgNCAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVJbnNpZGUgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBCcmFja2V0U3RhY2tbc0ogKyAyXSB8PSA0IC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUluc2lkZSAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHByb2Nlc3NOZXV0cmFscyhyRnJvbSwgclRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKSB7XG4gICAgZm9yIChsZXQgaUkgPSAwLCBwcmV2ID0gb3V0ZXJUeXBlOyBpSSA8PSBpc29sYXRlcy5sZW5ndGg7IGlJKyspIHtcbiAgICAgICAgbGV0IGZyb20gPSBpSSA/IGlzb2xhdGVzW2lJIC0gMV0udG8gOiByRnJvbSwgdG8gPSBpSSA8IGlzb2xhdGVzLmxlbmd0aCA/IGlzb2xhdGVzW2lJXS5mcm9tIDogclRvO1xuICAgICAgICAvLyBOMS4gQSBzZXF1ZW5jZSBvZiBuZXV0cmFscyB0YWtlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZVxuICAgICAgICAvLyBzdXJyb3VuZGluZyBzdHJvbmcgdGV4dCBpZiB0aGUgdGV4dCBvbiBib3RoIHNpZGVzIGhhcyB0aGUgc2FtZVxuICAgICAgICAvLyBkaXJlY3Rpb24uIEV1cm9wZWFuIGFuZCBBcmFiaWMgbnVtYmVycyBhY3QgYXMgaWYgdGhleSB3ZXJlIFIgaW5cbiAgICAgICAgLy8gdGVybXMgb2YgdGhlaXIgaW5mbHVlbmNlIG9uIG5ldXRyYWxzLiBTdGFydC1vZi1sZXZlbC1ydW4gKHNvcilcbiAgICAgICAgLy8gYW5kIGVuZC1vZi1sZXZlbC1ydW4gKGVvcikgYXJlIHVzZWQgYXQgbGV2ZWwgcnVuIGJvdW5kYXJpZXMuXG4gICAgICAgIC8vIE4yLiBBbnkgcmVtYWluaW5nIG5ldXRyYWxzIHRha2UgdGhlIGVtYmVkZGluZyBkaXJlY3Rpb24uXG4gICAgICAgIC8vIChMZWZ0IGFmdGVyIHRoaXM6IEwsIFIsIEVOK0FOKVxuICAgICAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOykge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSB0eXBlc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlID09IDI1NiAvKiBULk5JICovKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZCA9PSB0bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlJID09IGlzb2xhdGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGlzb2xhdGVzW2lJKytdLnRvO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG8gPSBpSSA8IGlzb2xhdGVzLmxlbmd0aCA/IGlzb2xhdGVzW2lJXS5mcm9tIDogclRvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVzW2VuZF0gPT0gMjU2IC8qIFQuTkkgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGJlZm9yZUwgPSBwcmV2ID09IDEgLyogVC5MICovO1xuICAgICAgICAgICAgICAgIGxldCBhZnRlckwgPSAoZW5kIDwgclRvID8gdHlwZXNbZW5kXSA6IG91dGVyVHlwZSkgPT0gMSAvKiBULkwgKi87XG4gICAgICAgICAgICAgICAgbGV0IHJlcGxhY2UgPSBiZWZvcmVMID09IGFmdGVyTCA/IChiZWZvcmVMID8gMSAvKiBULkwgKi8gOiAyIC8qIFQuUiAqLykgOiBvdXRlclR5cGU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGVuZCwgakkgPSBpSSwgZnJvbUogPSBqSSA/IGlzb2xhdGVzW2pJIC0gMV0udG8gOiByRnJvbTsgaiA+IGk7KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqID09IGZyb21KKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBqID0gaXNvbGF0ZXNbLS1qSV0uZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21KID0gakkgPyBpc29sYXRlc1tqSSAtIDFdLnRvIDogckZyb207XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHlwZXNbLS1qXSA9IHJlcGxhY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkgPSBlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmV2ID0gdHlwZTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBGaW5kIHRoZSBjb250aWd1b3VzIHJhbmdlcyBvZiBjaGFyYWN0ZXIgdHlwZXMgaW4gYSBnaXZlbiByYW5nZSwgYW5kXG4vLyBlbWl0IHNwYW5zIGZvciB0aGVtLiBGbGlwIHRoZSBvcmRlciBvZiB0aGUgc3BhbnMgYXMgYXBwcm9wcmlhdGVcbi8vIGJhc2VkIG9uIHRoZSBsZXZlbCwgYW5kIGNhbGwgdGhyb3VnaCB0byBjb21wdXRlIHRoZSBzcGFucyBmb3Jcbi8vIGlzb2xhdGVzIGF0IHRoZSBwcm9wZXIgcG9pbnQuXG5mdW5jdGlvbiBlbWl0U3BhbnMobGluZSwgZnJvbSwgdG8sIGxldmVsLCBiYXNlTGV2ZWwsIGlzb2xhdGVzLCBvcmRlcikge1xuICAgIGxldCBvdXJUeXBlID0gbGV2ZWwgJSAyID8gMiAvKiBULlIgKi8gOiAxIC8qIFQuTCAqLztcbiAgICBpZiAoKGxldmVsICUgMikgPT0gKGJhc2VMZXZlbCAlIDIpKSB7IC8vIFNhbWUgZGlyIGFzIGJhc2UgZGlyZWN0aW9uLCBkb24ndCBmbGlwXG4gICAgICAgIGZvciAobGV0IGlDaCA9IGZyb20sIGlJID0gMDsgaUNoIDwgdG87KSB7XG4gICAgICAgICAgICAvLyBTY2FuIGEgc2VjdGlvbiBvZiBjaGFyYWN0ZXJzIGluIGRpcmVjdGlvbiBvdXJUeXBlLCB1bmxlc3NcbiAgICAgICAgICAgIC8vIHRoZXJlJ3MgYW5vdGhlciB0eXBlIG9mIGNoYXIgcmlnaHQgYWZ0ZXIgaUNoLCBpbiB3aGljaCBjYXNlXG4gICAgICAgICAgICAvLyB3ZSBzY2FuIGEgc2VjdGlvbiBvZiBvdGhlciBjaGFyYWN0ZXJzICh3aGljaCwgaWYgb3VyVHlwZSA9PVxuICAgICAgICAgICAgLy8gVC5MLCBtYXkgY29udGFpbiBib3RoIFQuUiBhbmQgVC5BTiBjaGFycykuXG4gICAgICAgICAgICBsZXQgc2FtZURpciA9IHRydWUsIGlzTnVtID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoaUkgPT0gaXNvbGF0ZXMubGVuZ3RoIHx8IGlDaCA8IGlzb2xhdGVzW2lJXS5mcm9tKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0eXBlc1tpQ2hdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9IG91clR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2FtZURpciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpc051bSA9IG5leHQgPT0gMTYgLyogVC5BTiAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIb2xkcyBhbiBhcnJheSBvZiBpc29sYXRlcyB0byBwYXNzIHRvIGEgcmVjdXJzaXZlIGNhbGwgaWYgd2VcbiAgICAgICAgICAgIC8vIG11c3QgcmVjdXJzZSAodG8gZGlzdGluZ3Vpc2ggVC5BTiBpbnNpZGUgYW4gUlRMIHNlY3Rpb24gaW5cbiAgICAgICAgICAgIC8vIExUUiB0ZXh0KSwgbnVsbCBpZiB3ZSBjYW4gZW1pdCBkaXJlY3RseVxuICAgICAgICAgICAgbGV0IHJlY3Vyc2UgPSAhc2FtZURpciAmJiBvdXJUeXBlID09IDEgLyogVC5MICovID8gW10gOiBudWxsO1xuICAgICAgICAgICAgbGV0IGxvY2FsTGV2ZWwgPSBzYW1lRGlyID8gbGV2ZWwgOiBsZXZlbCArIDE7XG4gICAgICAgICAgICBsZXQgaVNjYW4gPSBpQ2g7XG4gICAgICAgICAgICBydW46IGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBpZiAoaUkgPCBpc29sYXRlcy5sZW5ndGggJiYgaVNjYW4gPT0gaXNvbGF0ZXNbaUldLmZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTnVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcnVuO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNvID0gaXNvbGF0ZXNbaUldO1xuICAgICAgICAgICAgICAgICAgICAvLyBTY2FuIGFoZWFkIHRvIHZlcmlmeSB0aGF0IHRoZXJlIGlzIGFub3RoZXIgY2hhciBpbiB0aGlzIGRpciBhZnRlciB0aGUgaXNvbGF0ZShzKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNhbWVEaXIpXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB1cHRvID0gaXNvLnRvLCBqSSA9IGlJICsgMTs7KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwdG8gPT0gdG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakkgPCBpc29sYXRlcy5sZW5ndGggJiYgaXNvbGF0ZXNbakldLmZyb20gPT0gdXB0bylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXB0byA9IGlzb2xhdGVzW2pJKytdLnRvO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVzW3VwdG9dID09IG91clR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpSSsrO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjdXJzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZS5wdXNoKGlzbyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNvLmZyb20gPiBpQ2gpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIucHVzaChuZXcgQmlkaVNwYW4oaUNoLCBpc28uZnJvbSwgbG9jYWxMZXZlbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpclN3YXAgPSAoaXNvLmRpcmVjdGlvbiA9PSBMVFIpICE9ICEobG9jYWxMZXZlbCAlIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVNlY3Rpb25PcmRlcihsaW5lLCBkaXJTd2FwID8gbGV2ZWwgKyAxIDogbGV2ZWwsIGJhc2VMZXZlbCwgaXNvLmlubmVyLCBpc28uZnJvbSwgaXNvLnRvLCBvcmRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpQ2ggPSBpc28udG87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaVNjYW4gPSBpc28udG87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlTY2FuID09IHRvIHx8IChzYW1lRGlyID8gdHlwZXNbaVNjYW5dICE9IG91clR5cGUgOiB0eXBlc1tpU2Nhbl0gPT0gb3VyVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpU2NhbisrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZWN1cnNlKVxuICAgICAgICAgICAgICAgIGVtaXRTcGFucyhsaW5lLCBpQ2gsIGlTY2FuLCBsZXZlbCArIDEsIGJhc2VMZXZlbCwgcmVjdXJzZSwgb3JkZXIpO1xuICAgICAgICAgICAgZWxzZSBpZiAoaUNoIDwgaVNjYW4pXG4gICAgICAgICAgICAgICAgb3JkZXIucHVzaChuZXcgQmlkaVNwYW4oaUNoLCBpU2NhbiwgbG9jYWxMZXZlbCkpO1xuICAgICAgICAgICAgaUNoID0gaVNjYW47XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIEl0ZXJhdGUgaW4gcmV2ZXJzZSB0byBmbGlwIHRoZSBzcGFuIG9yZGVyLiBTYW1lIGNvZGUgYWdhaW4sIGJ1dFxuICAgICAgICAvLyBnb2luZyBmcm9tIHRoZSBiYWNrIG9mIHRoZSBzZWN0aW9uIHRvIHRoZSBmcm9udFxuICAgICAgICBmb3IgKGxldCBpQ2ggPSB0bywgaUkgPSBpc29sYXRlcy5sZW5ndGg7IGlDaCA+IGZyb207KSB7XG4gICAgICAgICAgICBsZXQgc2FtZURpciA9IHRydWUsIGlzTnVtID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIWlJIHx8IGlDaCA+IGlzb2xhdGVzW2lJIC0gMV0udG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHR5cGVzW2lDaCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9IG91clR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2FtZURpciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpc051bSA9IG5leHQgPT0gMTYgLyogVC5BTiAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVjdXJzZSA9ICFzYW1lRGlyICYmIG91clR5cGUgPT0gMSAvKiBULkwgKi8gPyBbXSA6IG51bGw7XG4gICAgICAgICAgICBsZXQgbG9jYWxMZXZlbCA9IHNhbWVEaXIgPyBsZXZlbCA6IGxldmVsICsgMTtcbiAgICAgICAgICAgIGxldCBpU2NhbiA9IGlDaDtcbiAgICAgICAgICAgIHJ1bjogZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGlmIChpSSAmJiBpU2NhbiA9PSBpc29sYXRlc1tpSSAtIDFdLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc051bSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzbyA9IGlzb2xhdGVzWy0taUldO1xuICAgICAgICAgICAgICAgICAgICAvLyBTY2FuIGFoZWFkIHRvIHZlcmlmeSB0aGF0IHRoZXJlIGlzIGFub3RoZXIgY2hhciBpbiB0aGlzIGRpciBhZnRlciB0aGUgaXNvbGF0ZShzKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNhbWVEaXIpXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB1cHRvID0gaXNvLmZyb20sIGpJID0gaUk7Oykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cHRvID09IGZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakkgJiYgaXNvbGF0ZXNbakkgLSAxXS50byA9PSB1cHRvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHRvID0gaXNvbGF0ZXNbLS1qSV0uZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlc1t1cHRvIC0gMV0gPT0gb3VyVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWN1cnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlLnB1c2goaXNvKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc28udG8gPCBpQ2gpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIucHVzaChuZXcgQmlkaVNwYW4oaXNvLnRvLCBpQ2gsIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXJTd2FwID0gKGlzby5kaXJlY3Rpb24gPT0gTFRSKSAhPSAhKGxvY2FsTGV2ZWwgJSAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVTZWN0aW9uT3JkZXIobGluZSwgZGlyU3dhcCA/IGxldmVsICsgMSA6IGxldmVsLCBiYXNlTGV2ZWwsIGlzby5pbm5lciwgaXNvLmZyb20sIGlzby50bywgb3JkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaUNoID0gaXNvLmZyb207XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaVNjYW4gPSBpc28uZnJvbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaVNjYW4gPT0gZnJvbSB8fCAoc2FtZURpciA/IHR5cGVzW2lTY2FuIC0gMV0gIT0gb3VyVHlwZSA6IHR5cGVzW2lTY2FuIC0gMV0gPT0gb3VyVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpU2Nhbi0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZWN1cnNlKVxuICAgICAgICAgICAgICAgIGVtaXRTcGFucyhsaW5lLCBpU2NhbiwgaUNoLCBsZXZlbCArIDEsIGJhc2VMZXZlbCwgcmVjdXJzZSwgb3JkZXIpO1xuICAgICAgICAgICAgZWxzZSBpZiAoaVNjYW4gPCBpQ2gpXG4gICAgICAgICAgICAgICAgb3JkZXIucHVzaChuZXcgQmlkaVNwYW4oaVNjYW4sIGlDaCwgbG9jYWxMZXZlbCkpO1xuICAgICAgICAgICAgaUNoID0gaVNjYW47XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjb21wdXRlU2VjdGlvbk9yZGVyKGxpbmUsIGxldmVsLCBiYXNlTGV2ZWwsIGlzb2xhdGVzLCBmcm9tLCB0bywgb3JkZXIpIHtcbiAgICBsZXQgb3V0ZXJUeXBlID0gKGxldmVsICUgMiA/IDIgLyogVC5SICovIDogMSAvKiBULkwgKi8pO1xuICAgIGNvbXB1dGVDaGFyVHlwZXMobGluZSwgZnJvbSwgdG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpO1xuICAgIHByb2Nlc3NCcmFja2V0UGFpcnMobGluZSwgZnJvbSwgdG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpO1xuICAgIHByb2Nlc3NOZXV0cmFscyhmcm9tLCB0bywgaXNvbGF0ZXMsIG91dGVyVHlwZSk7XG4gICAgZW1pdFNwYW5zKGxpbmUsIGZyb20sIHRvLCBsZXZlbCwgYmFzZUxldmVsLCBpc29sYXRlcywgb3JkZXIpO1xufVxuZnVuY3Rpb24gY29tcHV0ZU9yZGVyKGxpbmUsIGRpcmVjdGlvbiwgaXNvbGF0ZXMpIHtcbiAgICBpZiAoIWxpbmUpXG4gICAgICAgIHJldHVybiBbbmV3IEJpZGlTcGFuKDAsIDAsIGRpcmVjdGlvbiA9PSBSVEwgPyAxIDogMCldO1xuICAgIGlmIChkaXJlY3Rpb24gPT0gTFRSICYmICFpc29sYXRlcy5sZW5ndGggJiYgIUJpZGlSRS50ZXN0KGxpbmUpKVxuICAgICAgICByZXR1cm4gdHJpdmlhbE9yZGVyKGxpbmUubGVuZ3RoKTtcbiAgICBpZiAoaXNvbGF0ZXMubGVuZ3RoKVxuICAgICAgICB3aGlsZSAobGluZS5sZW5ndGggPiB0eXBlcy5sZW5ndGgpXG4gICAgICAgICAgICB0eXBlc1t0eXBlcy5sZW5ndGhdID0gMjU2IC8qIFQuTkkgKi87IC8vIE1ha2Ugc3VyZSB0eXBlcyBhcnJheSBoYXMgbm8gZ2Fwc1xuICAgIGxldCBvcmRlciA9IFtdLCBsZXZlbCA9IGRpcmVjdGlvbiA9PSBMVFIgPyAwIDogMTtcbiAgICBjb21wdXRlU2VjdGlvbk9yZGVyKGxpbmUsIGxldmVsLCBsZXZlbCwgaXNvbGF0ZXMsIDAsIGxpbmUubGVuZ3RoLCBvcmRlcik7XG4gICAgcmV0dXJuIG9yZGVyO1xufVxuZnVuY3Rpb24gdHJpdmlhbE9yZGVyKGxlbmd0aCkge1xuICAgIHJldHVybiBbbmV3IEJpZGlTcGFuKDAsIGxlbmd0aCwgMCldO1xufVxubGV0IG1vdmVkT3ZlciA9IFwiXCI7XG4vLyBUaGlzIGltcGxlbWVudGF0aW9uIG1vdmVzIHN0cmljdGx5IHZpc3VhbGx5LCB3aXRob3V0IGNvbmNlcm4gZm9yIGFcbi8vIHRyYXZlcnNhbCB2aXNpdGluZyBldmVyeSBsb2dpY2FsIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcuIEl0IHdpbGxcbi8vIHN0aWxsIGRvIHNvIGZvciBzaW1wbGUgaW5wdXQsIGJ1dCBzaXR1YXRpb25zIGxpa2UgbXVsdGlwbGUgaXNvbGF0ZXNcbi8vIHdpdGggdGhlIHNhbWUgbGV2ZWwgbmV4dCB0byBlYWNoIG90aGVyLCBvciB0ZXh0IGdvaW5nIGFnYWluc3QgdGhlXG4vLyBtYWluIGRpciBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLCB3aWxsIG1ha2Ugc29tZSBwb3NpdGlvbnNcbi8vIHVucmVhY2hhYmxlIHdpdGggdGhpcyBtb3Rpb24uIEVhY2ggdmlzaWJsZSBjdXJzb3IgcG9zaXRpb24gd2lsbFxuLy8gY29ycmVzcG9uZCB0byB0aGUgbG93ZXItbGV2ZWwgYmlkaSBzcGFuIHRoYXQgdG91Y2hlcyBpdC5cbi8vXG4vLyBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gc29sdmUgYW4gb3JkZXIgZ2xvYmFsbHkgZm9yIGEgZ2l2ZW5cbi8vIGxpbmUsIG1ha2luZyBzdXJlIHRoYXQgaXQgaW5jbHVkZXMgZXZlcnkgcG9zaXRpb24sIGJ1dCB0aGF0IHdvdWxkXG4vLyByZXF1aXJlIGFzc29jaWF0aW5nIG5vbi1jYW5vbmljYWwgKGhpZ2hlciBiaWRpIHNwYW4gbGV2ZWwpXG4vLyBwb3NpdGlvbnMgd2l0aCBhIGdpdmVuIHZpc3VhbCBwb3NpdGlvbiwgd2hpY2ggaXMgbGlrZWx5IHRvIGNvbmZ1c2Vcbi8vIHBlb3BsZS4gKEFuZCB3b3VsZCBnZW5lcmFsbHkgYmUgYSBsb3QgbW9yZSBjb21wbGljYXRlZC4pXG5mdW5jdGlvbiBtb3ZlVmlzdWFsbHkobGluZSwgb3JkZXIsIGRpciwgc3RhcnQsIGZvcndhcmQpIHtcbiAgICB2YXIgX2E7XG4gICAgbGV0IHN0YXJ0SW5kZXggPSBzdGFydC5oZWFkIC0gbGluZS5mcm9tO1xuICAgIGxldCBzcGFuSSA9IEJpZGlTcGFuLmZpbmQob3JkZXIsIHN0YXJ0SW5kZXgsIChfYSA9IHN0YXJ0LmJpZGlMZXZlbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogLTEsIHN0YXJ0LmFzc29jKTtcbiAgICBsZXQgc3BhbiA9IG9yZGVyW3NwYW5JXSwgc3BhbkVuZCA9IHNwYW4uc2lkZShmb3J3YXJkLCBkaXIpO1xuICAgIC8vIEVuZCBvZiBzcGFuXG4gICAgaWYgKHN0YXJ0SW5kZXggPT0gc3BhbkVuZCkge1xuICAgICAgICBsZXQgbmV4dEkgPSBzcGFuSSArPSBmb3J3YXJkID8gMSA6IC0xO1xuICAgICAgICBpZiAobmV4dEkgPCAwIHx8IG5leHRJID49IG9yZGVyLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBzcGFuID0gb3JkZXJbc3BhbkkgPSBuZXh0SV07XG4gICAgICAgIHN0YXJ0SW5kZXggPSBzcGFuLnNpZGUoIWZvcndhcmQsIGRpcik7XG4gICAgICAgIHNwYW5FbmQgPSBzcGFuLnNpZGUoZm9yd2FyZCwgZGlyKTtcbiAgICB9XG4gICAgbGV0IG5leHRJbmRleCA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCBzdGFydEluZGV4LCBzcGFuLmZvcndhcmQoZm9yd2FyZCwgZGlyKSk7XG4gICAgaWYgKG5leHRJbmRleCA8IHNwYW4uZnJvbSB8fCBuZXh0SW5kZXggPiBzcGFuLnRvKVxuICAgICAgICBuZXh0SW5kZXggPSBzcGFuRW5kO1xuICAgIG1vdmVkT3ZlciA9IGxpbmUudGV4dC5zbGljZShNYXRoLm1pbihzdGFydEluZGV4LCBuZXh0SW5kZXgpLCBNYXRoLm1heChzdGFydEluZGV4LCBuZXh0SW5kZXgpKTtcbiAgICBsZXQgbmV4dFNwYW4gPSBzcGFuSSA9PSAoZm9yd2FyZCA/IG9yZGVyLmxlbmd0aCAtIDEgOiAwKSA/IG51bGwgOiBvcmRlcltzcGFuSSArIChmb3J3YXJkID8gMSA6IC0xKV07XG4gICAgaWYgKG5leHRTcGFuICYmIG5leHRJbmRleCA9PSBzcGFuRW5kICYmIG5leHRTcGFuLmxldmVsICsgKGZvcndhcmQgPyAwIDogMSkgPCBzcGFuLmxldmVsKVxuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihuZXh0U3Bhbi5zaWRlKCFmb3J3YXJkLCBkaXIpICsgbGluZS5mcm9tLCBuZXh0U3Bhbi5mb3J3YXJkKGZvcndhcmQsIGRpcikgPyAxIDogLTEsIG5leHRTcGFuLmxldmVsKTtcbiAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihuZXh0SW5kZXggKyBsaW5lLmZyb20sIHNwYW4uZm9yd2FyZChmb3J3YXJkLCBkaXIpID8gLTEgOiAxLCBzcGFuLmxldmVsKTtcbn1cbmZ1bmN0aW9uIGF1dG9EaXJlY3Rpb24odGV4dCwgZnJvbSwgdG8pIHtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgbGV0IHR5cGUgPSBjaGFyVHlwZSh0ZXh0LmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICBpZiAodHlwZSA9PSAxIC8qIFQuTCAqLylcbiAgICAgICAgICAgIHJldHVybiBMVFI7XG4gICAgICAgIGlmICh0eXBlID09IDIgLyogVC5SICovIHx8IHR5cGUgPT0gNCAvKiBULkFMICovKVxuICAgICAgICAgICAgcmV0dXJuIFJUTDtcbiAgICB9XG4gICAgcmV0dXJuIExUUjtcbn1cblxuY29uc3QgY2xpY2tBZGRzU2VsZWN0aW9uUmFuZ2UgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBkcmFnTW92ZXNTZWxlY3Rpb24kMSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IG1vdXNlU2VsZWN0aW9uU3R5bGUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBleGNlcHRpb25TaW5rID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgdXBkYXRlTGlzdGVuZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBpbnB1dEhhbmRsZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBmb2N1c0NoYW5nZUVmZmVjdCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGNsaXBib2FyZElucHV0RmlsdGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgY2xpcGJvYXJkT3V0cHV0RmlsdGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgcGVyTGluZVRleHREaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KVxufSk7XG5jb25zdCBuYXRpdmVTZWxlY3Rpb25IaWRkZW4gPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KVxufSk7XG5jb25zdCBzY3JvbGxIYW5kbGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY2xhc3MgU2Nyb2xsVGFyZ2V0IHtcbiAgICBjb25zdHJ1Y3RvcihyYW5nZSwgeSA9IFwibmVhcmVzdFwiLCB4ID0gXCJuZWFyZXN0XCIsIHlNYXJnaW4gPSA1LCB4TWFyZ2luID0gNSwgXG4gICAgLy8gVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBhYnVzZWQgdG8gYWxzbyBzdG9yZSBwcmVjaXNlIHNjcm9sbFxuICAgIC8vIHNuYXBzaG90cywgaW5zdGVhZCBvZiBhIGBzY3JvbGxJbnRvVmlld2AgcmVxdWVzdC4gV2hlbiB0aGlzXG4gICAgLy8gZmxhZyBpcyBgdHJ1ZWAsIGByYW5nZWAgcG9pbnRzIGF0IGEgcG9zaXRpb24gaW4gdGhlIHJlZmVyZW5jZVxuICAgIC8vIGxpbmUsIGB5TWFyZ2luYCBob2xkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0b3Agb2YgdGhhdFxuICAgIC8vIGxpbmUgYW5kIHRoZSB0b3Agb2YgdGhlIGVkaXRvciwgYW5kIGB4TWFyZ2luYCBob2xkcyB0aGVcbiAgICAvLyBlZGl0b3IncyBgc2Nyb2xsTGVmdGAuXG4gICAgaXNTbmFwc2hvdCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZTtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55TWFyZ2luID0geU1hcmdpbjtcbiAgICAgICAgdGhpcy54TWFyZ2luID0geE1hcmdpbjtcbiAgICAgICAgdGhpcy5pc1NuYXBzaG90ID0gaXNTbmFwc2hvdDtcbiAgICB9XG4gICAgbWFwKGNoYW5nZXMpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5nZXMuZW1wdHkgPyB0aGlzIDpcbiAgICAgICAgICAgIG5ldyBTY3JvbGxUYXJnZXQodGhpcy5yYW5nZS5tYXAoY2hhbmdlcyksIHRoaXMueSwgdGhpcy54LCB0aGlzLnlNYXJnaW4sIHRoaXMueE1hcmdpbiwgdGhpcy5pc1NuYXBzaG90KTtcbiAgICB9XG4gICAgY2xpcChzdGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZS50byA8PSBzdGF0ZS5kb2MubGVuZ3RoID8gdGhpcyA6XG4gICAgICAgICAgICBuZXcgU2Nyb2xsVGFyZ2V0KEVkaXRvclNlbGVjdGlvbi5jdXJzb3Ioc3RhdGUuZG9jLmxlbmd0aCksIHRoaXMueSwgdGhpcy54LCB0aGlzLnlNYXJnaW4sIHRoaXMueE1hcmdpbiwgdGhpcy5pc1NuYXBzaG90KTtcbiAgICB9XG59XG5jb25zdCBzY3JvbGxJbnRvVmlldyA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoeyBtYXA6ICh0LCBjaCkgPT4gdC5tYXAoY2gpIH0pO1xuY29uc3Qgc2V0RWRpdENvbnRleHRGb3JtYXR0aW5nID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLyoqXG5Mb2cgb3IgcmVwb3J0IGFuIHVuaGFuZGxlZCBleGNlcHRpb24gaW4gY2xpZW50IGNvZGUuIFNob3VsZFxucHJvYmFibHkgb25seSBiZSB1c2VkIGJ5IGV4dGVuc2lvbiBjb2RlIHRoYXQgYWxsb3dzIGNsaWVudCBjb2RlIHRvXG5wcm92aWRlIGZ1bmN0aW9ucywgYW5kIGNhbGxzIHRob3NlIGZ1bmN0aW9ucyBpbiBhIGNvbnRleHQgd2hlcmUgYW5cbmV4Y2VwdGlvbiBjYW4ndCBiZSBwcm9wYWdhdGVkIHRvIGNhbGxpbmcgY29kZSBpbiBhIHJlYXNvbmFibGUgd2F5XG4oZm9yIGV4YW1wbGUgd2hlbiBpbiBhbiBldmVudCBoYW5kbGVyKS5cblxuRWl0aGVyIGNhbGxzIGEgaGFuZGxlciByZWdpc3RlcmVkIHdpdGhcbltgRWRpdG9yVmlldy5leGNlcHRpb25TaW5rYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeZXhjZXB0aW9uU2luayksXG5gd2luZG93Lm9uZXJyb3JgLCBpZiBkZWZpbmVkLCBvciBgY29uc29sZS5lcnJvcmAgKGluIHdoaWNoIGNhc2Vcbml0J2xsIHBhc3MgYGNvbnRleHRgLCB3aGVuIGdpdmVuLCBhcyBmaXJzdCBhcmd1bWVudCkuXG4qL1xuZnVuY3Rpb24gbG9nRXhjZXB0aW9uKHN0YXRlLCBleGNlcHRpb24sIGNvbnRleHQpIHtcbiAgICBsZXQgaGFuZGxlciA9IHN0YXRlLmZhY2V0KGV4Y2VwdGlvblNpbmspO1xuICAgIGlmIChoYW5kbGVyLmxlbmd0aClcbiAgICAgICAgaGFuZGxlclswXShleGNlcHRpb24pO1xuICAgIGVsc2UgaWYgKHdpbmRvdy5vbmVycm9yKVxuICAgICAgICB3aW5kb3cub25lcnJvcihTdHJpbmcoZXhjZXB0aW9uKSwgY29udGV4dCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGV4Y2VwdGlvbik7XG4gICAgZWxzZSBpZiAoY29udGV4dClcbiAgICAgICAgY29uc29sZS5lcnJvcihjb250ZXh0ICsgXCI6XCIsIGV4Y2VwdGlvbik7XG4gICAgZWxzZVxuICAgICAgICBjb25zb2xlLmVycm9yKGV4Y2VwdGlvbik7XG59XG5jb25zdCBlZGl0YWJsZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IHRydWUgfSk7XG5sZXQgbmV4dFBsdWdpbklEID0gMDtcbmNvbnN0IHZpZXdQbHVnaW4gPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcblZpZXcgcGx1Z2lucyBhc3NvY2lhdGUgc3RhdGVmdWwgdmFsdWVzIHdpdGggYSB2aWV3LiBUaGV5IGNhblxuaW5mbHVlbmNlIHRoZSB3YXkgdGhlIGNvbnRlbnQgaXMgZHJhd24sIGFuZCBhcmUgbm90aWZpZWQgb2YgdGhpbmdzXG50aGF0IGhhcHBlbiBpbiB0aGUgdmlldy5cbiovXG5jbGFzcyBWaWV3UGx1Z2luIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGlkLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNyZWF0ZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkb21FdmVudEhhbmRsZXJzLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGRvbUV2ZW50T2JzZXJ2ZXJzLCBidWlsZEV4dGVuc2lvbnMpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAgICAgdGhpcy5kb21FdmVudEhhbmRsZXJzID0gZG9tRXZlbnRIYW5kbGVycztcbiAgICAgICAgdGhpcy5kb21FdmVudE9ic2VydmVycyA9IGRvbUV2ZW50T2JzZXJ2ZXJzO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IGJ1aWxkRXh0ZW5zaW9ucyh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgcGx1Z2luIGZyb20gYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgdGhlXG4gICAgcGx1Z2luJ3MgdmFsdWUsIGdpdmVuIGFuIGVkaXRvciB2aWV3LlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShjcmVhdGUsIHNwZWMpIHtcbiAgICAgICAgY29uc3QgeyBldmVudEhhbmRsZXJzLCBldmVudE9ic2VydmVycywgcHJvdmlkZSwgZGVjb3JhdGlvbnM6IGRlY28gfSA9IHNwZWMgfHwge307XG4gICAgICAgIHJldHVybiBuZXcgVmlld1BsdWdpbihuZXh0UGx1Z2luSUQrKywgY3JlYXRlLCBldmVudEhhbmRsZXJzLCBldmVudE9ic2VydmVycywgcGx1Z2luID0+IHtcbiAgICAgICAgICAgIGxldCBleHQgPSBbdmlld1BsdWdpbi5vZihwbHVnaW4pXTtcbiAgICAgICAgICAgIGlmIChkZWNvKVxuICAgICAgICAgICAgICAgIGV4dC5wdXNoKGRlY29yYXRpb25zLm9mKHZpZXcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGx1Z2luSW5zdCA9IHZpZXcucGx1Z2luKHBsdWdpbik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwbHVnaW5JbnN0ID8gZGVjbyhwbHVnaW5JbnN0KSA6IERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBpZiAocHJvdmlkZSlcbiAgICAgICAgICAgICAgICBleHQucHVzaChwcm92aWRlKHBsdWdpbikpO1xuICAgICAgICAgICAgcmV0dXJuIGV4dDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBsdWdpbiBmb3IgYSBjbGFzcyB3aG9zZSBjb25zdHJ1Y3RvciB0YWtlcyBhIHNpbmdsZVxuICAgIGVkaXRvciB2aWV3IGFzIGFyZ3VtZW50LlxuICAgICovXG4gICAgc3RhdGljIGZyb21DbGFzcyhjbHMsIHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIFZpZXdQbHVnaW4uZGVmaW5lKHZpZXcgPT4gbmV3IGNscyh2aWV3KSwgc3BlYyk7XG4gICAgfVxufVxuY2xhc3MgUGx1Z2luSW5zdGFuY2Uge1xuICAgIGNvbnN0cnVjdG9yKHNwZWMpIHtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgLy8gV2hlbiBzdGFydGluZyBhbiB1cGRhdGUsIGFsbCBwbHVnaW5zIGhhdmUgdGhpcyBmaWVsZCBzZXQgdG8gdGhlXG4gICAgICAgIC8vIHVwZGF0ZSBvYmplY3QsIGluZGljYXRpbmcgdGhleSBuZWVkIHRvIGJlIHVwZGF0ZWQuIFdoZW4gZmluaXNoZWRcbiAgICAgICAgLy8gdXBkYXRpbmcsIGl0IGlzIHNldCB0byBgZmFsc2VgLiBSZXRyaWV2aW5nIGEgcGx1Z2luIHRoYXQgbmVlZHMgdG9cbiAgICAgICAgLy8gYmUgdXBkYXRlZCB3aXRoIGB2aWV3LnBsdWdpbmAgZm9yY2VzIGFuIGVhZ2VyIHVwZGF0ZS5cbiAgICAgICAgdGhpcy5tdXN0VXBkYXRlID0gbnVsbDtcbiAgICAgICAgLy8gVGhpcyBpcyBudWxsIHdoZW4gdGhlIHBsdWdpbiBpcyBpbml0aWFsbHkgY3JlYXRlZCwgYnV0XG4gICAgICAgIC8vIGluaXRpYWxpemVkIG9uIHRoZSBmaXJzdCB1cGRhdGUuXG4gICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICB1cGRhdGUodmlldykge1xuICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNwZWMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5zcGVjLmNyZWF0ZSh2aWV3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHZpZXcuc3RhdGUsIGUsIFwiQ29kZU1pcnJvciBwbHVnaW4gY3Jhc2hlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubXVzdFVwZGF0ZSkge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZSA9IHRoaXMubXVzdFVwZGF0ZTtcbiAgICAgICAgICAgIHRoaXMubXVzdFVwZGF0ZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZS51cGRhdGUpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odXBkYXRlLnN0YXRlLCBlLCBcIkNvZGVNaXJyb3IgcGx1Z2luIGNyYXNoZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLmRlc3Ryb3kpXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlc3Ryb3kodmlldykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICgoX2EgPSB0aGlzLnZhbHVlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVzdHJveSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHZpZXcuc3RhdGUsIGUsIFwiQ29kZU1pcnJvciBwbHVnaW4gY3Jhc2hlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWFjdGl2YXRlKCkge1xuICAgICAgICB0aGlzLnNwZWMgPSB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG59XG5jb25zdCBlZGl0b3JBdHRyaWJ1dGVzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgY29udGVudEF0dHJpYnV0ZXMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vLyBQcm92aWRlIGRlY29yYXRpb25zXG5jb25zdCBkZWNvcmF0aW9ucyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IG91dGVyRGVjb3JhdGlvbnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBhdG9taWNSYW5nZXMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBiaWRpSXNvbGF0ZWRSYW5nZXMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5mdW5jdGlvbiBnZXRJc29sYXRlZFJhbmdlcyh2aWV3LCBsaW5lKSB7XG4gICAgbGV0IGlzb2xhdGVzID0gdmlldy5zdGF0ZS5mYWNldChiaWRpSXNvbGF0ZWRSYW5nZXMpO1xuICAgIGlmICghaXNvbGF0ZXMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gaXNvbGF0ZXM7XG4gICAgbGV0IHNldHMgPSBpc29sYXRlcy5tYXAoaSA9PiBpIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBpKHZpZXcpIDogaSk7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIFJhbmdlU2V0LnNwYW5zKHNldHMsIGxpbmUuZnJvbSwgbGluZS50bywge1xuICAgICAgICBwb2ludCgpIHsgfSxcbiAgICAgICAgc3Bhbihmcm9tRG9jLCB0b0RvYywgYWN0aXZlLCBvcGVuKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGZyb21Eb2MgLSBsaW5lLmZyb20sIHRvID0gdG9Eb2MgLSBsaW5lLmZyb207XG4gICAgICAgICAgICBsZXQgbGV2ZWwgPSByZXN1bHQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gYWN0aXZlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tLCBvcGVuLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aW9uID0gYWN0aXZlW2ldLnNwZWMuYmlkaUlzb2xhdGUsIHVwZGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGF1dG9EaXJlY3Rpb24obGluZS50ZXh0LCBmcm9tLCB0byk7XG4gICAgICAgICAgICAgICAgaWYgKG9wZW4gPiAwICYmIGxldmVsLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAodXBkYXRlID0gbGV2ZWxbbGV2ZWwubGVuZ3RoIC0gMV0pLnRvID09IGZyb20gJiYgdXBkYXRlLmRpcmVjdGlvbiA9PSBkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnRvID0gdG87XG4gICAgICAgICAgICAgICAgICAgIGxldmVsID0gdXBkYXRlLmlubmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZCA9IHsgZnJvbSwgdG8sIGRpcmVjdGlvbiwgaW5uZXI6IFtdIH07XG4gICAgICAgICAgICAgICAgICAgIGxldmVsLnB1c2goYWRkKTtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBhZGQuaW5uZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IHNjcm9sbE1hcmdpbnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5mdW5jdGlvbiBnZXRTY3JvbGxNYXJnaW5zKHZpZXcpIHtcbiAgICBsZXQgbGVmdCA9IDAsIHJpZ2h0ID0gMCwgdG9wID0gMCwgYm90dG9tID0gMDtcbiAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygdmlldy5zdGF0ZS5mYWNldChzY3JvbGxNYXJnaW5zKSkge1xuICAgICAgICBsZXQgbSA9IHNvdXJjZSh2aWV3KTtcbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgIGlmIChtLmxlZnQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICBsZWZ0ID0gTWF0aC5tYXgobGVmdCwgbS5sZWZ0KTtcbiAgICAgICAgICAgIGlmIChtLnJpZ2h0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgcmlnaHQgPSBNYXRoLm1heChyaWdodCwgbS5yaWdodCk7XG4gICAgICAgICAgICBpZiAobS50b3AgIT0gbnVsbClcbiAgICAgICAgICAgICAgICB0b3AgPSBNYXRoLm1heCh0b3AsIG0udG9wKTtcbiAgICAgICAgICAgIGlmIChtLmJvdHRvbSAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGJvdHRvbSA9IE1hdGgubWF4KGJvdHRvbSwgbS5ib3R0b20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSB9O1xufVxuY29uc3Qgc3R5bGVNb2R1bGUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jbGFzcyBDaGFuZ2VkUmFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKGZyb21BLCB0b0EsIGZyb21CLCB0b0IpIHtcbiAgICAgICAgdGhpcy5mcm9tQSA9IGZyb21BO1xuICAgICAgICB0aGlzLnRvQSA9IHRvQTtcbiAgICAgICAgdGhpcy5mcm9tQiA9IGZyb21CO1xuICAgICAgICB0aGlzLnRvQiA9IHRvQjtcbiAgICB9XG4gICAgam9pbihvdGhlcikge1xuICAgICAgICByZXR1cm4gbmV3IENoYW5nZWRSYW5nZShNYXRoLm1pbih0aGlzLmZyb21BLCBvdGhlci5mcm9tQSksIE1hdGgubWF4KHRoaXMudG9BLCBvdGhlci50b0EpLCBNYXRoLm1pbih0aGlzLmZyb21CLCBvdGhlci5mcm9tQiksIE1hdGgubWF4KHRoaXMudG9CLCBvdGhlci50b0IpKTtcbiAgICB9XG4gICAgYWRkVG9TZXQoc2V0KSB7XG4gICAgICAgIGxldCBpID0gc2V0Lmxlbmd0aCwgbWUgPSB0aGlzO1xuICAgICAgICBmb3IgKDsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gc2V0W2kgLSAxXTtcbiAgICAgICAgICAgIGlmIChyYW5nZS5mcm9tQSA+IG1lLnRvQSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyYW5nZS50b0EgPCBtZS5mcm9tQSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIG1lID0gbWUuam9pbihyYW5nZSk7XG4gICAgICAgICAgICBzZXQuc3BsaWNlKGkgLSAxLCAxKTtcbiAgICAgICAgfVxuICAgICAgICBzZXQuc3BsaWNlKGksIDAsIG1lKTtcbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG4gICAgc3RhdGljIGV4dGVuZFdpdGhSYW5nZXMoZGlmZiwgcmFuZ2VzKSB7XG4gICAgICAgIGlmIChyYW5nZXMubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gZGlmZjtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBkSSA9IDAsIHJJID0gMCwgcG9zQSA9IDAsIHBvc0IgPSAwOzsgZEkrKykge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBkSSA9PSBkaWZmLmxlbmd0aCA/IG51bGwgOiBkaWZmW2RJXSwgb2ZmID0gcG9zQSAtIHBvc0I7XG4gICAgICAgICAgICBsZXQgZW5kID0gbmV4dCA/IG5leHQuZnJvbUIgOiAxZTk7XG4gICAgICAgICAgICB3aGlsZSAockkgPCByYW5nZXMubGVuZ3RoICYmIHJhbmdlc1tySV0gPCBlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IHJhbmdlc1tySV0sIHRvID0gcmFuZ2VzW3JJICsgMV07XG4gICAgICAgICAgICAgICAgbGV0IGZyb21CID0gTWF0aC5tYXgocG9zQiwgZnJvbSksIHRvQiA9IE1hdGgubWluKGVuZCwgdG8pO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tQiA8PSB0b0IpXG4gICAgICAgICAgICAgICAgICAgIG5ldyBDaGFuZ2VkUmFuZ2UoZnJvbUIgKyBvZmYsIHRvQiArIG9mZiwgZnJvbUIsIHRvQikuYWRkVG9TZXQocmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAodG8gPiBlbmQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgckkgKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbmV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgbmV3IENoYW5nZWRSYW5nZShuZXh0LmZyb21BLCBuZXh0LnRvQSwgbmV4dC5mcm9tQiwgbmV4dC50b0IpLmFkZFRvU2V0KHJlc3VsdCk7XG4gICAgICAgICAgICBwb3NBID0gbmV4dC50b0E7XG4gICAgICAgICAgICBwb3NCID0gbmV4dC50b0I7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcblZpZXcgW3BsdWdpbnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5WaWV3UGx1Z2luKSBhcmUgZ2l2ZW4gaW5zdGFuY2VzIG9mIHRoaXNcbmNsYXNzLCB3aGljaCBkZXNjcmliZSB3aGF0IGhhcHBlbmVkLCB3aGVuZXZlciB0aGUgdmlldyBpcyB1cGRhdGVkLlxuKi9cbmNsYXNzIFZpZXdVcGRhdGUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBlZGl0b3IgdmlldyB0aGF0IHRoZSB1cGRhdGUgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgICovXG4gICAgdmlldywgXG4gICAgLyoqXG4gICAgVGhlIG5ldyBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBzdGF0ZSwgXG4gICAgLyoqXG4gICAgVGhlIHRyYW5zYWN0aW9ucyBpbnZvbHZlZCBpbiB0aGUgdXBkYXRlLiBNYXkgYmUgZW1wdHkuXG4gICAgKi9cbiAgICB0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucyA9IHRyYW5zYWN0aW9ucztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmZsYWdzID0gMDtcbiAgICAgICAgdGhpcy5zdGFydFN0YXRlID0gdmlldy5zdGF0ZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gQ2hhbmdlU2V0LmVtcHR5KHRoaXMuc3RhcnRTdGF0ZS5kb2MubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgdHIgb2YgdHJhbnNhY3Rpb25zKVxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VzID0gdGhpcy5jaGFuZ2VzLmNvbXBvc2UodHIuY2hhbmdlcyk7XG4gICAgICAgIGxldCBjaGFuZ2VkUmFuZ2VzID0gW107XG4gICAgICAgIHRoaXMuY2hhbmdlcy5pdGVyQ2hhbmdlZFJhbmdlcygoZnJvbUEsIHRvQSwgZnJvbUIsIHRvQikgPT4gY2hhbmdlZFJhbmdlcy5wdXNoKG5ldyBDaGFuZ2VkUmFuZ2UoZnJvbUEsIHRvQSwgZnJvbUIsIHRvQikpKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkUmFuZ2VzID0gY2hhbmdlZFJhbmdlcztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHZpZXcsIHN0YXRlLCB0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWaWV3VXBkYXRlKHZpZXcsIHN0YXRlLCB0cmFuc2FjdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBUZWxscyB5b3Ugd2hldGhlciB0aGUgW3ZpZXdwb3J0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy52aWV3cG9ydCkgb3JcbiAgICBbdmlzaWJsZSByYW5nZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnZpc2libGVSYW5nZXMpIGNoYW5nZWQgaW4gdGhpc1xuICAgIHVwZGF0ZS5cbiAgICAqL1xuICAgIGdldCB2aWV3cG9ydENoYW5nZWQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5mbGFncyAmIDQgLyogVXBkYXRlRmxhZy5WaWV3cG9ydCAqLykgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgd2hlblxuICAgIFtgdmlld3BvcnRDaGFuZ2VkYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LlZpZXdVcGRhdGUudmlld3BvcnRDaGFuZ2VkKSBpcyB0cnVlXG4gICAgYW5kIHRoZSB2aWV3cG9ydCBjaGFuZ2UgaXMgbm90IGp1c3QgdGhlIHJlc3VsdCBvZiBtYXBwaW5nIGl0IGluXG4gICAgcmVzcG9uc2UgdG8gZG9jdW1lbnQgY2hhbmdlcy5cbiAgICAqL1xuICAgIGdldCB2aWV3cG9ydE1vdmVkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiA4IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnRNb3ZlZCAqLykgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaGVpZ2h0IG9mIGEgYmxvY2sgZWxlbWVudCBpbiB0aGUgZWRpdG9yXG4gICAgY2hhbmdlZCBpbiB0aGlzIHVwZGF0ZS5cbiAgICAqL1xuICAgIGdldCBoZWlnaHRDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBkb2N1bWVudCB3YXMgbW9kaWZpZWQgb3IgdGhlIHNpemUgb2YgdGhlXG4gICAgZWRpdG9yLCBvciBlbGVtZW50cyB3aXRoaW4gdGhlIGVkaXRvciwgY2hhbmdlZC5cbiAgICAqL1xuICAgIGdldCBnZW9tZXRyeUNoYW5nZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY0NoYW5nZWQgfHwgKHRoaXMuZmxhZ3MgJiAoMTYgLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLyB8IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi8pKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIHVwZGF0ZSBpbmRpY2F0ZXMgYSBmb2N1cyBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgZm9jdXNDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiAxIC8qIFVwZGF0ZUZsYWcuRm9jdXMgKi8pID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgZG9jdW1lbnQgY2hhbmdlZCBpbiB0aGlzIHVwZGF0ZS5cbiAgICAqL1xuICAgIGdldCBkb2NDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuY2hhbmdlcy5lbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgc2VsZWN0aW9uIHdhcyBleHBsaWNpdGx5IHNldCBpbiB0aGlzIHVwZGF0ZS5cbiAgICAqL1xuICAgIGdldCBzZWxlY3Rpb25TZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5zb21lKHRyID0+IHRyLnNlbGVjdGlvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGVtcHR5KCkgeyByZXR1cm4gdGhpcy5mbGFncyA9PSAwICYmIHRoaXMudHJhbnNhY3Rpb25zLmxlbmd0aCA9PSAwOyB9XG59XG5cbmNsYXNzIERvY1ZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMudmlldy5zdGF0ZS5kb2MubGVuZ3RoOyB9XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gW107XG4gICAgICAgIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXAgPSBbZmFsc2VdO1xuICAgICAgICB0aGlzLmRvbUNoYW5nZWQgPSBudWxsO1xuICAgICAgICB0aGlzLmhhc0NvbXBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JDb21wb3NpdGlvbiA9IG5ldyBTZXQ7XG4gICAgICAgIHRoaXMuZWRpdENvbnRleHRGb3JtYXR0aW5nID0gRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICB0aGlzLmxhc3RDb21wb3NpdGlvbkFmdGVyQ3Vyc29yID0gZmFsc2U7XG4gICAgICAgIC8vIFRyYWNrIGEgbWluaW11bSB3aWR0aCBmb3IgdGhlIGVkaXRvci4gV2hlbiBtZWFzdXJpbmcgc2l6ZXMgaW5cbiAgICAgICAgLy8gbWVhc3VyZVZpc2libGVMaW5lSGVpZ2h0cywgdGhpcyBpcyB1cGRhdGVkIHRvIHBvaW50IGF0IHRoZSB3aWR0aFxuICAgICAgICAvLyBvZiBhIGdpdmVuIGVsZW1lbnQgYW5kIGl0cyBleHRlbnQgaW4gdGhlIGRvY3VtZW50LiBXaGVuIGEgY2hhbmdlXG4gICAgICAgIC8vIGhhcHBlbnMgaW4gdGhhdCByYW5nZSwgdGhlc2UgYXJlIHJlc2V0LiBUaGF0IHdheSwgb25jZSB3ZSd2ZSBzZWVuXG4gICAgICAgIC8vIGEgbGluZS9lbGVtZW50IG9mIGEgZ2l2ZW4gbGVuZ3RoLCB3ZSBrZWVwIHRoZSBlZGl0b3Igd2lkZSBlbm91Z2hcbiAgICAgICAgLy8gdG8gZml0IGF0IGxlYXN0IHRoYXQgZWxlbWVudCwgdW50aWwgaXQgaXMgY2hhbmdlZCwgYXQgd2hpY2ggcG9pbnRcbiAgICAgICAgLy8gd2UgZm9yZ2V0IGl0IGFnYWluLlxuICAgICAgICB0aGlzLm1pbldpZHRoID0gMDtcbiAgICAgICAgdGhpcy5taW5XaWR0aEZyb20gPSAwO1xuICAgICAgICB0aGlzLm1pbldpZHRoVG8gPSAwO1xuICAgICAgICAvLyBUcmFjayB3aGV0aGVyIHRoZSBET00gc2VsZWN0aW9uIHdhcyBzZXQgaW4gYSBsb3NzeSB3YXksIHNvIHRoYXRcbiAgICAgICAgLy8gd2UgZG9uJ3QgbWVzcyBpdCB1cCB3aGVuIHJlYWRpbmcgaXQgYmFjayBpdFxuICAgICAgICB0aGlzLmltcHJlY2lzZUFuY2hvciA9IG51bGw7XG4gICAgICAgIHRoaXMuaW1wcmVjaXNlSGVhZCA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9yY2VTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgLy8gVXNlZCBieSB0aGUgcmVzaXplIG9ic2VydmVyIHRvIGlnbm9yZSByZXNpemVzIHRoYXQgd2UgY2F1c2VkXG4gICAgICAgIC8vIG91cnNlbHZlc1xuICAgICAgICB0aGlzLmxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnNldERPTSh2aWV3LmNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW25ldyBMaW5lVmlld107XG4gICAgICAgIHRoaXMuY2hpbGRyZW5bMF0uc2V0UGFyZW50KHRoaXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZURlY28oKTtcbiAgICAgICAgdGhpcy51cGRhdGVJbm5lcihbbmV3IENoYW5nZWRSYW5nZSgwLCAwLCAwLCB2aWV3LnN0YXRlLmRvYy5sZW5ndGgpXSwgMCwgbnVsbCk7XG4gICAgfVxuICAgIC8vIFVwZGF0ZSB0aGUgZG9jdW1lbnQgdmlldyB0byBhIGdpdmVuIHN0YXRlLlxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY2hhbmdlZFJhbmdlcyA9IHVwZGF0ZS5jaGFuZ2VkUmFuZ2VzO1xuICAgICAgICBpZiAodGhpcy5taW5XaWR0aCA+IDAgJiYgY2hhbmdlZFJhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghY2hhbmdlZFJhbmdlcy5ldmVyeSgoeyBmcm9tQSwgdG9BIH0pID0+IHRvQSA8IHRoaXMubWluV2lkdGhGcm9tIHx8IGZyb21BID4gdGhpcy5taW5XaWR0aFRvKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWluV2lkdGggPSB0aGlzLm1pbldpZHRoRnJvbSA9IHRoaXMubWluV2lkdGhUbyA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoRnJvbSA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh0aGlzLm1pbldpZHRoRnJvbSwgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aFRvID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHRoaXMubWluV2lkdGhUbywgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVFZGl0Q29udGV4dEZvcm1hdHRpbmcodXBkYXRlKTtcbiAgICAgICAgbGV0IHJlYWRDb21wb3NpdGlvbkF0ID0gLTE7XG4gICAgICAgIGlmICh0aGlzLnZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPj0gMCAmJiAhdGhpcy52aWV3Lm9ic2VydmVyLmVkaXRDb250ZXh0KSB7XG4gICAgICAgICAgICBpZiAoKF9hID0gdGhpcy5kb21DaGFuZ2VkKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmV3U2VsKVxuICAgICAgICAgICAgICAgIHJlYWRDb21wb3NpdGlvbkF0ID0gdGhpcy5kb21DaGFuZ2VkLm5ld1NlbC5oZWFkO1xuICAgICAgICAgICAgZWxzZSBpZiAoIXRvdWNoZXNDb21wb3NpdGlvbih1cGRhdGUuY2hhbmdlcywgdGhpcy5oYXNDb21wb3NpdGlvbikgJiYgIXVwZGF0ZS5zZWxlY3Rpb25TZXQpXG4gICAgICAgICAgICAgICAgcmVhZENvbXBvc2l0aW9uQXQgPSB1cGRhdGUuc3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29tcG9zaXRpb24gPSByZWFkQ29tcG9zaXRpb25BdCA+IC0xID8gZmluZENvbXBvc2l0aW9uUmFuZ2UodGhpcy52aWV3LCB1cGRhdGUuY2hhbmdlcywgcmVhZENvbXBvc2l0aW9uQXQpIDogbnVsbDtcbiAgICAgICAgdGhpcy5kb21DaGFuZ2VkID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24uY2xlYXIoKTtcbiAgICAgICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSB0aGlzLmhhc0NvbXBvc2l0aW9uO1xuICAgICAgICAgICAgY2hhbmdlZFJhbmdlcyA9IG5ldyBDaGFuZ2VkUmFuZ2UoZnJvbSwgdG8sIHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyhmcm9tLCAtMSksIHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh0bywgMSkpXG4gICAgICAgICAgICAgICAgLmFkZFRvU2V0KGNoYW5nZWRSYW5nZXMuc2xpY2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYXNDb21wb3NpdGlvbiA9IGNvbXBvc2l0aW9uID8geyBmcm9tOiBjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiwgdG86IGNvbXBvc2l0aW9uLnJhbmdlLnRvQiB9IDogbnVsbDtcbiAgICAgICAgLy8gV2hlbiB0aGUgRE9NIG5vZGVzIGFyb3VuZCB0aGUgc2VsZWN0aW9uIGFyZSBtb3ZlZCB0byBhbm90aGVyXG4gICAgICAgIC8vIHBhcmVudCwgQ2hyb21lIHNvbWV0aW1lcyByZXBvcnRzIGEgZGlmZmVyZW50IHNlbGVjdGlvbiB0aHJvdWdoXG4gICAgICAgIC8vIGdldFNlbGVjdGlvbiB0aGFuIHRoZSBvbmUgdGhhdCBpdCBhY3R1YWxseSBzaG93cyB0byB0aGUgdXNlci5cbiAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBzZWxlY3Rpb24gdXBkYXRlIHdoZW4gbGluZXMgYXJlIGpvaW5lZCB0byB3b3JrXG4gICAgICAgIC8vIGFyb3VuZCB0aGF0LiBJc3N1ZSAjNTRcbiAgICAgICAgaWYgKChicm93c2VyLmllIHx8IGJyb3dzZXIuY2hyb21lKSAmJiAhY29tcG9zaXRpb24gJiYgdXBkYXRlICYmXG4gICAgICAgICAgICB1cGRhdGUuc3RhdGUuZG9jLmxpbmVzICE9IHVwZGF0ZS5zdGFydFN0YXRlLmRvYy5saW5lcylcbiAgICAgICAgICAgIHRoaXMuZm9yY2VTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICBsZXQgcHJldkRlY28gPSB0aGlzLmRlY29yYXRpb25zLCBkZWNvID0gdGhpcy51cGRhdGVEZWNvKCk7XG4gICAgICAgIGxldCBkZWNvRGlmZiA9IGZpbmRDaGFuZ2VkRGVjbyhwcmV2RGVjbywgZGVjbywgdXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICBjaGFuZ2VkUmFuZ2VzID0gQ2hhbmdlZFJhbmdlLmV4dGVuZFdpdGhSYW5nZXMoY2hhbmdlZFJhbmdlcywgZGVjb0RpZmYpO1xuICAgICAgICBpZiAoISh0aGlzLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLykgJiYgY2hhbmdlZFJhbmdlcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbm5lcihjaGFuZ2VkUmFuZ2VzLCB1cGRhdGUuc3RhcnRTdGF0ZS5kb2MubGVuZ3RoLCBjb21wb3NpdGlvbik7XG4gICAgICAgICAgICBpZiAodXBkYXRlLnRyYW5zYWN0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFVzZWQgYnkgdXBkYXRlIGFuZCB0aGUgY29uc3RydWN0b3IgZG8gcGVyZm9ybSB0aGUgYWN0dWFsIERPTVxuICAgIC8vIHVwZGF0ZVxuICAgIHVwZGF0ZUlubmVyKGNoYW5nZXMsIG9sZExlbmd0aCwgY29tcG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy52aWV3LnZpZXdTdGF0ZS5tdXN0TWVhc3VyZUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKGNoYW5nZXMsIG9sZExlbmd0aCwgY29tcG9zaXRpb24pO1xuICAgICAgICBsZXQgeyBvYnNlcnZlciB9ID0gdGhpcy52aWV3O1xuICAgICAgICBvYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gTG9jayB0aGUgaGVpZ2h0IGR1cmluZyByZWRyYXdpbmcsIHNpbmNlIENocm9tZSBzb21ldGltZXNcbiAgICAgICAgICAgIC8vIG1lc3NlcyB3aXRoIHRoZSBzY3JvbGwgcG9zaXRpb24gZHVyaW5nIERPTSBtdXRhdGlvbiAodGhvdWdoXG4gICAgICAgICAgICAvLyBubyByZWxheW91dCBpcyB0cmlnZ2VyZWQgYW5kIEkgY2Fubm90IGltYWdpbmUgaG93IGl0IGNhblxuICAgICAgICAgICAgLy8gcmVjb21wdXRlIHRoZSBzY3JvbGwgcG9zaXRpb24gd2l0aG91dCBhIGxheW91dClcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmhlaWdodCA9IHRoaXMudmlldy52aWV3U3RhdGUuY29udGVudEhlaWdodCAvIHRoaXMudmlldy5zY2FsZVkgKyBcInB4XCI7XG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5mbGV4QmFzaXMgPSB0aGlzLm1pbldpZHRoID8gdGhpcy5taW5XaWR0aCArIFwicHhcIiA6IFwiXCI7XG4gICAgICAgICAgICAvLyBDaHJvbWUgd2lsbCBzb21ldGltZXMsIHdoZW4gRE9NIG11dGF0aW9ucyBvY2N1ciBkaXJlY3RseVxuICAgICAgICAgICAgLy8gYXJvdW5kIHRoZSBzZWxlY3Rpb24sIGdldCBjb25mdXNlZCBhbmQgcmVwb3J0IGEgZGlmZmVyZW50XG4gICAgICAgICAgICAvLyBzZWxlY3Rpb24gZnJvbSB0aGUgb25lIGl0IGRpc3BsYXlzIChpc3N1ZSAjMjE4KS4gVGhpcyB0cmllc1xuICAgICAgICAgICAgLy8gdG8gZGV0ZWN0IHRoYXQgc2l0dWF0aW9uLlxuICAgICAgICAgICAgbGV0IHRyYWNrID0gYnJvd3Nlci5jaHJvbWUgfHwgYnJvd3Nlci5pb3MgPyB7IG5vZGU6IG9ic2VydmVyLnNlbGVjdGlvblJhbmdlLmZvY3VzTm9kZSwgd3JpdHRlbjogZmFsc2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLnZpZXcsIHRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3MgJj0gfjcgLyogVmlld0ZsYWcuRGlydHkgKi87XG4gICAgICAgICAgICBpZiAodHJhY2sgJiYgKHRyYWNrLndyaXR0ZW4gfHwgb2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2UuZm9jdXNOb2RlICE9IHRyYWNrLm5vZGUpKVxuICAgICAgICAgICAgICAgIHRoaXMuZm9yY2VTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gXCJcIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24uZm9yRWFjaChjVmlldyA9PiBjVmlldy5mbGFncyAmPSB+OCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLyk7XG4gICAgICAgIGxldCBnYXBzID0gW107XG4gICAgICAgIGlmICh0aGlzLnZpZXcudmlld3BvcnQuZnJvbSB8fCB0aGlzLnZpZXcudmlld3BvcnQudG8gPCB0aGlzLnZpZXcuc3RhdGUuZG9jLmxlbmd0aClcbiAgICAgICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQmxvY2tXaWRnZXRWaWV3ICYmIGNoaWxkLndpZGdldCBpbnN0YW5jZW9mIEJsb2NrR2FwV2lkZ2V0KVxuICAgICAgICAgICAgICAgICAgICBnYXBzLnB1c2goY2hpbGQuZG9tKTtcbiAgICAgICAgb2JzZXJ2ZXIudXBkYXRlR2FwcyhnYXBzKTtcbiAgICB9XG4gICAgdXBkYXRlQ2hpbGRyZW4oY2hhbmdlcywgb2xkTGVuZ3RoLCBjb21wb3NpdGlvbikge1xuICAgICAgICBsZXQgcmFuZ2VzID0gY29tcG9zaXRpb24gPyBjb21wb3NpdGlvbi5yYW5nZS5hZGRUb1NldChjaGFuZ2VzLnNsaWNlKCkpIDogY2hhbmdlcztcbiAgICAgICAgbGV0IGN1cnNvciA9IHRoaXMuY2hpbGRDdXJzb3Iob2xkTGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHJhbmdlcy5sZW5ndGggLSAxOzsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGkgPj0gMCA/IHJhbmdlc1tpXSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoIW5leHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgeyBmcm9tQSwgdG9BLCBmcm9tQiwgdG9CIH0gPSBuZXh0LCBjb250ZW50LCBicmVha0F0U3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZDtcbiAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbiAmJiBjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiA8IHRvQiAmJiBjb21wb3NpdGlvbi5yYW5nZS50b0IgPiBmcm9tQikge1xuICAgICAgICAgICAgICAgIGxldCBiZWZvcmUgPSBDb250ZW50QnVpbGRlci5idWlsZCh0aGlzLnZpZXcuc3RhdGUuZG9jLCBmcm9tQiwgY29tcG9zaXRpb24ucmFuZ2UuZnJvbUIsIHRoaXMuZGVjb3JhdGlvbnMsIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXApO1xuICAgICAgICAgICAgICAgIGxldCBhZnRlciA9IENvbnRlbnRCdWlsZGVyLmJ1aWxkKHRoaXMudmlldy5zdGF0ZS5kb2MsIGNvbXBvc2l0aW9uLnJhbmdlLnRvQiwgdG9CLCB0aGlzLmRlY29yYXRpb25zLCB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwKTtcbiAgICAgICAgICAgICAgICBicmVha0F0U3RhcnQgPSBiZWZvcmUuYnJlYWtBdFN0YXJ0O1xuICAgICAgICAgICAgICAgIG9wZW5TdGFydCA9IGJlZm9yZS5vcGVuU3RhcnQ7XG4gICAgICAgICAgICAgICAgb3BlbkVuZCA9IGFmdGVyLm9wZW5FbmQ7XG4gICAgICAgICAgICAgICAgbGV0IGNvbXBMaW5lID0gdGhpcy5jb21wb3NpdGlvblZpZXcoY29tcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGlmIChhZnRlci5icmVha0F0U3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcExpbmUuYnJlYWtBZnRlciA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFmdGVyLmNvbnRlbnQubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbXBMaW5lLm1lcmdlKGNvbXBMaW5lLmxlbmd0aCwgY29tcExpbmUubGVuZ3RoLCBhZnRlci5jb250ZW50WzBdLCBmYWxzZSwgYWZ0ZXIub3BlblN0YXJ0LCAwKSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wTGluZS5icmVha0FmdGVyID0gYWZ0ZXIuY29udGVudFswXS5icmVha0FmdGVyO1xuICAgICAgICAgICAgICAgICAgICBhZnRlci5jb250ZW50LnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChiZWZvcmUuY29udGVudC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgY29tcExpbmUubWVyZ2UoMCwgMCwgYmVmb3JlLmNvbnRlbnRbYmVmb3JlLmNvbnRlbnQubGVuZ3RoIC0gMV0sIHRydWUsIDAsIGJlZm9yZS5vcGVuRW5kKSkge1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmUuY29udGVudC5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGJlZm9yZS5jb250ZW50LmNvbmNhdChjb21wTGluZSkuY29uY2F0KGFmdGVyLmNvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgKHsgY29udGVudCwgYnJlYWtBdFN0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9XG4gICAgICAgICAgICAgICAgICAgIENvbnRlbnRCdWlsZGVyLmJ1aWxkKHRoaXMudmlldy5zdGF0ZS5kb2MsIGZyb21CLCB0b0IsIHRoaXMuZGVjb3JhdGlvbnMsIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB7IGk6IHRvSSwgb2ZmOiB0b09mZiB9ID0gY3Vyc29yLmZpbmRQb3ModG9BLCAxKTtcbiAgICAgICAgICAgIGxldCB7IGk6IGZyb21JLCBvZmY6IGZyb21PZmYgfSA9IGN1cnNvci5maW5kUG9zKGZyb21BLCAtMSk7XG4gICAgICAgICAgICByZXBsYWNlUmFuZ2UodGhpcywgZnJvbUksIGZyb21PZmYsIHRvSSwgdG9PZmYsIGNvbnRlbnQsIGJyZWFrQXRTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9zaXRpb24pXG4gICAgICAgICAgICB0aGlzLmZpeENvbXBvc2l0aW9uRE9NKGNvbXBvc2l0aW9uKTtcbiAgICB9XG4gICAgdXBkYXRlRWRpdENvbnRleHRGb3JtYXR0aW5nKHVwZGF0ZSkge1xuICAgICAgICB0aGlzLmVkaXRDb250ZXh0Rm9ybWF0dGluZyA9IHRoaXMuZWRpdENvbnRleHRGb3JtYXR0aW5nLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHVwZGF0ZS50cmFuc2FjdGlvbnMpXG4gICAgICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgdHIuZWZmZWN0cylcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LmlzKHNldEVkaXRDb250ZXh0Rm9ybWF0dGluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dEZvcm1hdHRpbmcgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgIH1cbiAgICBjb21wb3NpdGlvblZpZXcoY29tcG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGN1ciA9IG5ldyBUZXh0Vmlldyhjb21wb3NpdGlvbi50ZXh0Lm5vZGVWYWx1ZSk7XG4gICAgICAgIGN1ci5mbGFncyB8PSA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovO1xuICAgICAgICBmb3IgKGxldCB7IGRlY28gfSBvZiBjb21wb3NpdGlvbi5tYXJrcylcbiAgICAgICAgICAgIGN1ciA9IG5ldyBNYXJrVmlldyhkZWNvLCBbY3VyXSwgY3VyLmxlbmd0aCk7XG4gICAgICAgIGxldCBsaW5lID0gbmV3IExpbmVWaWV3O1xuICAgICAgICBsaW5lLmFwcGVuZChjdXIsIDApO1xuICAgICAgICByZXR1cm4gbGluZTtcbiAgICB9XG4gICAgZml4Q29tcG9zaXRpb25ET00oY29tcG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGZpeCA9IChkb20sIGNWaWV3KSA9PiB7XG4gICAgICAgICAgICBjVmlldy5mbGFncyB8PSA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovIHwgKGNWaWV3LmNoaWxkcmVuLnNvbWUoYyA9PiBjLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLykgPyAxIC8qIFZpZXdGbGFnLkNoaWxkRGlydHkgKi8gOiAwKTtcbiAgICAgICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24uYWRkKGNWaWV3KTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gQ29udGVudFZpZXcuZ2V0KGRvbSk7XG4gICAgICAgICAgICBpZiAocHJldiAmJiBwcmV2ICE9IGNWaWV3KVxuICAgICAgICAgICAgICAgIHByZXYuZG9tID0gbnVsbDtcbiAgICAgICAgICAgIGNWaWV3LnNldERPTShkb20pO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5jaGlsZFBvcyhjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiwgMSk7XG4gICAgICAgIGxldCBjVmlldyA9IHRoaXMuY2hpbGRyZW5bcG9zLmldO1xuICAgICAgICBmaXgoY29tcG9zaXRpb24ubGluZSwgY1ZpZXcpO1xuICAgICAgICBmb3IgKGxldCBpID0gY29tcG9zaXRpb24ubWFya3MubGVuZ3RoIC0gMTsgaSA+PSAtMTsgaS0tKSB7XG4gICAgICAgICAgICBwb3MgPSBjVmlldy5jaGlsZFBvcyhwb3Mub2ZmLCAxKTtcbiAgICAgICAgICAgIGNWaWV3ID0gY1ZpZXcuY2hpbGRyZW5bcG9zLmldO1xuICAgICAgICAgICAgZml4KGkgPj0gMCA/IGNvbXBvc2l0aW9uLm1hcmtzW2ldLm5vZGUgOiBjb21wb3NpdGlvbi50ZXh0LCBjVmlldyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU3luYyB0aGUgRE9NIHNlbGVjdGlvbiB0byB0aGlzLnN0YXRlLnNlbGVjdGlvblxuICAgIHVwZGF0ZVNlbGVjdGlvbihtdXN0UmVhZCA9IGZhbHNlLCBmcm9tUG9pbnRlciA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChtdXN0UmVhZCB8fCAhdGhpcy52aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlLmZvY3VzTm9kZSlcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IGFjdGl2ZUVsdCA9IHRoaXMudmlldy5yb290LmFjdGl2ZUVsZW1lbnQsIGZvY3VzZWQgPSBhY3RpdmVFbHQgPT0gdGhpcy5kb207XG4gICAgICAgIGxldCBzZWxlY3Rpb25Ob3RGb2N1cyA9ICFmb2N1c2VkICYmICEodGhpcy52aWV3LnN0YXRlLmZhY2V0KGVkaXRhYmxlKSB8fCB0aGlzLmRvbS50YWJJbmRleCA+IC0xKSAmJlxuICAgICAgICAgICAgaGFzU2VsZWN0aW9uKHRoaXMuZG9tLCB0aGlzLnZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2UpICYmICEoYWN0aXZlRWx0ICYmIHRoaXMuZG9tLmNvbnRhaW5zKGFjdGl2ZUVsdCkpO1xuICAgICAgICBpZiAoIShmb2N1c2VkIHx8IGZyb21Qb2ludGVyIHx8IHNlbGVjdGlvbk5vdEZvY3VzKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGZvcmNlID0gdGhpcy5mb3JjZVNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5mb3JjZVNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICBsZXQgbWFpbiA9IHRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgbGV0IGFuY2hvciA9IHRoaXMubW92ZVRvTGluZSh0aGlzLmRvbUF0UG9zKG1haW4uYW5jaG9yKSk7XG4gICAgICAgIGxldCBoZWFkID0gbWFpbi5lbXB0eSA/IGFuY2hvciA6IHRoaXMubW92ZVRvTGluZSh0aGlzLmRvbUF0UG9zKG1haW4uaGVhZCkpO1xuICAgICAgICAvLyBBbHdheXMgcmVzZXQgb24gRmlyZWZveCB3aGVuIG5leHQgdG8gYW4gdW5lZGl0YWJsZSBub2RlIHRvXG4gICAgICAgIC8vIGF2b2lkIGludmlzaWJsZSBjdXJzb3IgYnVncyAoIzExMSlcbiAgICAgICAgaWYgKGJyb3dzZXIuZ2Vja28gJiYgbWFpbi5lbXB0eSAmJiAhdGhpcy5oYXNDb21wb3NpdGlvbiAmJiBiZXR3ZWVuVW5lZGl0YWJsZShhbmNob3IpKSB7XG4gICAgICAgICAgICBsZXQgZHVtbXkgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5pZ25vcmUoKCkgPT4gYW5jaG9yLm5vZGUuaW5zZXJ0QmVmb3JlKGR1bW15LCBhbmNob3Iubm9kZS5jaGlsZE5vZGVzW2FuY2hvci5vZmZzZXRdIHx8IG51bGwpKTtcbiAgICAgICAgICAgIGFuY2hvciA9IGhlYWQgPSBuZXcgRE9NUG9zKGR1bW15LCAwKTtcbiAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZG9tU2VsID0gdGhpcy52aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGFscmVhZHkgaGVyZSwgb3IgaW4gYW4gZXF1aXZhbGVudCBwb3NpdGlvbiwgZG9uJ3QgdG91Y2ggaXRcbiAgICAgICAgaWYgKGZvcmNlIHx8ICFkb21TZWwuZm9jdXNOb2RlIHx8ICghaXNFcXVpdmFsZW50UG9zaXRpb24oYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQsIGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KSB8fFxuICAgICAgICAgICAgIWlzRXF1aXZhbGVudFBvc2l0aW9uKGhlYWQubm9kZSwgaGVhZC5vZmZzZXQsIGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCkpICYmICF0aGlzLnN1cHByZXNzV2lkZ2V0Q3Vyc29yQ2hhbmdlKGRvbVNlbCwgbWFpbikpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENocm9tZSBBbmRyb2lkIHdpbGwgaGlkZSB0aGUgdmlydHVhbCBrZXlib2FyZCB3aGVuIHRhcHBpbmdcbiAgICAgICAgICAgICAgICAvLyBpbnNpZGUgYW4gdW5lZGl0YWJsZSBub2RlLCBhbmQgbm90IGJyaW5nIGl0IGJhY2sgd2hlbiB3ZVxuICAgICAgICAgICAgICAgIC8vIG1vdmUgdGhlIGN1cnNvciB0byBpdHMgcHJvcGVyIHBvc2l0aW9uLiBUaGlzIHRyaWVzIHRvXG4gICAgICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUga2V5Ym9hcmQgYnkgY3ljbGluZyBmb2N1cy5cbiAgICAgICAgICAgICAgICBpZiAoYnJvd3Nlci5hbmRyb2lkICYmIGJyb3dzZXIuY2hyb21lICYmIHRoaXMuZG9tLmNvbnRhaW5zKGRvbVNlbC5mb2N1c05vZGUpICYmXG4gICAgICAgICAgICAgICAgICAgIGluVW5lZGl0YWJsZShkb21TZWwuZm9jdXNOb2RlLCB0aGlzLmRvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uYmx1cigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByYXdTZWwgPSBnZXRTZWxlY3Rpb24odGhpcy52aWV3LnJvb3QpO1xuICAgICAgICAgICAgICAgIGlmICghcmF3U2VsKSA7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWFpbi5lbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXb3JrIGFyb3VuZCBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjEyMDc2XG4gICAgICAgICAgICAgICAgICAgIGlmIChicm93c2VyLmdlY2tvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFRvID0gbmV4dFRvVW5lZGl0YWJsZShhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFRvICYmIG5leHRUbyAhPSAoMSAvKiBOZXh0VG8uQmVmb3JlICovIHwgMiAvKiBOZXh0VG8uQWZ0ZXIgKi8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQgPSAobmV4dFRvID09IDEgLyogTmV4dFRvLkJlZm9yZSAqLyA/IHRleHROb2RlQmVmb3JlIDogdGV4dE5vZGVBZnRlcikoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3IgPSBuZXcgRE9NUG9zKHRleHQubm9kZSwgdGV4dC5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJhd1NlbC5jb2xsYXBzZShhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYWluLmJpZGlMZXZlbCAhPSBudWxsICYmIHJhd1NlbC5jYXJldEJpZGlMZXZlbCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmNhcmV0QmlkaUxldmVsID0gbWFpbi5iaWRpTGV2ZWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhd1NlbC5leHRlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VsZWN0aW9uLmV4dGVuZCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gJ2ludmVydGVkJyBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gKG9uZSB3aGVyZSB0aGUgZm9jdXMgaXMgYmVmb3JlIHRoZSBhbmNob3IpLCBidXQgbm90IGFsbFxuICAgICAgICAgICAgICAgICAgICAvLyBicm93c2VycyBzdXBwb3J0IGl0IHlldC5cbiAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmNvbGxhcHNlKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2FmYXJpIHdpbGwgaWdub3JlIHRoZSBjYWxsIGFib3ZlIHdoZW4gdGhlIGVkaXRvciBpc1xuICAgICAgICAgICAgICAgICAgICAvLyBoaWRkZW4sIGFuZCB0aGVuIHJhaXNlIGFuIGVycm9yIG9uIHRoZSBjYWxsIHRvIGV4dGVuZFxuICAgICAgICAgICAgICAgICAgICAvLyAoIzk0MCkuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByYXdTZWwuZXh0ZW5kKGhlYWQubm9kZSwgaGVhZC5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByaW1pdGl2ZSAoSUUpIHdheVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFpbi5hbmNob3IgPiBtYWluLmhlYWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBbYW5jaG9yLCBoZWFkXSA9IFtoZWFkLCBhbmNob3JdO1xuICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRFbmQoaGVhZC5ub2RlLCBoZWFkLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgcmF3U2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICByYXdTZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uTm90Rm9jdXMgJiYgdGhpcy52aWV3LnJvb3QuYWN0aXZlRWxlbWVudCA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5ibHVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVFbHQpXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVFbHQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5zZXRTZWxlY3Rpb25SYW5nZShhbmNob3IsIGhlYWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW1wcmVjaXNlQW5jaG9yID0gYW5jaG9yLnByZWNpc2UgPyBudWxsIDogbmV3IERPTVBvcyhkb21TZWwuYW5jaG9yTm9kZSwgZG9tU2VsLmFuY2hvck9mZnNldCk7XG4gICAgICAgIHRoaXMuaW1wcmVjaXNlSGVhZCA9IGhlYWQucHJlY2lzZSA/IG51bGwgOiBuZXcgRE9NUG9zKGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCk7XG4gICAgfVxuICAgIC8vIElmIGEgemVyby1sZW5ndGggd2lkZ2V0IGlzIGluc2VydGVkIG5leHQgdG8gdGhlIGN1cnNvciBkdXJpbmdcbiAgICAvLyBjb21wb3NpdGlvbiwgYXZvaWQgbW92aW5nIGl0IGFjcm9zcyBpdCBhbmQgZGlzcnVwdGluZyB0aGVcbiAgICAvLyBjb21wb3NpdGlvbi5cbiAgICBzdXBwcmVzc1dpZGdldEN1cnNvckNoYW5nZShzZWwsIGN1cnNvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNDb21wb3NpdGlvbiAmJiBjdXJzb3IuZW1wdHkgJiZcbiAgICAgICAgICAgIGlzRXF1aXZhbGVudFBvc2l0aW9uKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQpICYmXG4gICAgICAgICAgICB0aGlzLnBvc0Zyb21ET00oc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KSA9PSBjdXJzb3IuaGVhZDtcbiAgICB9XG4gICAgZW5mb3JjZUN1cnNvckFzc29jKCkge1xuICAgICAgICBpZiAodGhpcy5oYXNDb21wb3NpdGlvbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdGhpcywgY3Vyc29yID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgbGV0IHNlbCA9IGdldFNlbGVjdGlvbih2aWV3LnJvb3QpO1xuICAgICAgICBsZXQgeyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQgfSA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgIGlmICghc2VsIHx8ICFjdXJzb3IuZW1wdHkgfHwgIWN1cnNvci5hc3NvYyB8fCAhc2VsLm1vZGlmeSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGxpbmUgPSBMaW5lVmlldy5maW5kKHRoaXMsIGN1cnNvci5oZWFkKTtcbiAgICAgICAgaWYgKCFsaW5lKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbGluZVN0YXJ0ID0gbGluZS5wb3NBdFN0YXJ0O1xuICAgICAgICBpZiAoY3Vyc29yLmhlYWQgPT0gbGluZVN0YXJ0IHx8IGN1cnNvci5oZWFkID09IGxpbmVTdGFydCArIGxpbmUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgYmVmb3JlID0gdGhpcy5jb29yZHNBdChjdXJzb3IuaGVhZCwgLTEpLCBhZnRlciA9IHRoaXMuY29vcmRzQXQoY3Vyc29yLmhlYWQsIDEpO1xuICAgICAgICBpZiAoIWJlZm9yZSB8fCAhYWZ0ZXIgfHwgYmVmb3JlLmJvdHRvbSA+IGFmdGVyLnRvcClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGRvbSA9IHRoaXMuZG9tQXRQb3MoY3Vyc29yLmhlYWQgKyBjdXJzb3IuYXNzb2MpO1xuICAgICAgICBzZWwuY29sbGFwc2UoZG9tLm5vZGUsIGRvbS5vZmZzZXQpO1xuICAgICAgICBzZWwubW9kaWZ5KFwibW92ZVwiLCBjdXJzb3IuYXNzb2MgPCAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIsIFwibGluZWJvdW5kYXJ5XCIpO1xuICAgICAgICAvLyBUaGlzIGNhbiBnbyB3cm9uZyBpbiBjb3JuZXIgY2FzZXMgbGlrZSBzaW5nbGUtY2hhcmFjdGVyIGxpbmVzLFxuICAgICAgICAvLyBzbyBjaGVjayBhbmQgcmVzZXQgaWYgbmVjZXNzYXJ5LlxuICAgICAgICB2aWV3Lm9ic2VydmVyLnJlYWRTZWxlY3Rpb25SYW5nZSgpO1xuICAgICAgICBsZXQgbmV3UmFuZ2UgPSB2aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICBpZiAodmlldy5kb2NWaWV3LnBvc0Zyb21ET00obmV3UmFuZ2UuYW5jaG9yTm9kZSwgbmV3UmFuZ2UuYW5jaG9yT2Zmc2V0KSAhPSBjdXJzb3IuZnJvbSlcbiAgICAgICAgICAgIHNlbC5jb2xsYXBzZShhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpO1xuICAgIH1cbiAgICAvLyBJZiBhIHBvc2l0aW9uIGlzIGluL25lYXIgYSBibG9jayB3aWRnZXQsIG1vdmUgaXQgdG8gYSBuZWFyYnkgdGV4dFxuICAgIC8vIGxpbmUsIHNpbmNlIHdlIGRvbid0IHdhbnQgdGhlIGN1cnNvciBpbnNpZGUgYSBibG9jayB3aWRnZXQuXG4gICAgbW92ZVRvTGluZShwb3MpIHtcbiAgICAgICAgLy8gQmxvY2sgd2lkZ2V0cyB3aWxsIHJldHVybiBwb3NpdGlvbnMgYmVmb3JlL2FmdGVyIHRoZW0sIHdoaWNoXG4gICAgICAgIC8vIGFyZSB0aHVzIGRpcmVjdGx5IGluIHRoZSBkb2N1bWVudCBET00gZWxlbWVudC5cbiAgICAgICAgbGV0IGRvbSA9IHRoaXMuZG9tLCBuZXdQb3M7XG4gICAgICAgIGlmIChwb3Mubm9kZSAhPSBkb20pXG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICBmb3IgKGxldCBpID0gcG9zLm9mZnNldDsgIW5ld1BvcyAmJiBpIDwgZG9tLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2aWV3ID0gQ29udGVudFZpZXcuZ2V0KGRvbS5jaGlsZE5vZGVzW2ldKTtcbiAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgTGluZVZpZXcpXG4gICAgICAgICAgICAgICAgbmV3UG9zID0gdmlldy5kb21BdFBvcygwKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gcG9zLm9mZnNldCAtIDE7ICFuZXdQb3MgJiYgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB2aWV3ID0gQ29udGVudFZpZXcuZ2V0KGRvbS5jaGlsZE5vZGVzW2ldKTtcbiAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgTGluZVZpZXcpXG4gICAgICAgICAgICAgICAgbmV3UG9zID0gdmlldy5kb21BdFBvcyh2aWV3Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1BvcyA/IG5ldyBET01Qb3MobmV3UG9zLm5vZGUsIG5ld1Bvcy5vZmZzZXQsIHRydWUpIDogcG9zO1xuICAgIH1cbiAgICBuZWFyZXN0KGRvbSkge1xuICAgICAgICBmb3IgKGxldCBjdXIgPSBkb207IGN1cjspIHtcbiAgICAgICAgICAgIGxldCBkb21WaWV3ID0gQ29udGVudFZpZXcuZ2V0KGN1cik7XG4gICAgICAgICAgICBpZiAoZG9tVmlldyAmJiBkb21WaWV3LnJvb3RWaWV3ID09IHRoaXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbVZpZXc7XG4gICAgICAgICAgICBjdXIgPSBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcG9zRnJvbURPTShub2RlLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IHZpZXcgPSB0aGlzLm5lYXJlc3Qobm9kZSk7XG4gICAgICAgIGlmICghdmlldylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVHJ5aW5nIHRvIGZpbmQgcG9zaXRpb24gZm9yIGEgRE9NIHBvc2l0aW9uIG91dHNpZGUgb2YgdGhlIGRvY3VtZW50XCIpO1xuICAgICAgICByZXR1cm4gdmlldy5sb2NhbFBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSArIHZpZXcucG9zQXRTdGFydDtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIGxldCB7IGksIG9mZiB9ID0gdGhpcy5jaGlsZEN1cnNvcigpLmZpbmRQb3MocG9zLCAtMSk7XG4gICAgICAgIGZvciAoOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxOykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChvZmYgPCBjaGlsZC5sZW5ndGggfHwgY2hpbGQgaW5zdGFuY2VvZiBMaW5lVmlldylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIG9mZiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5baV0uZG9tQXRQb3Mob2ZmKTtcbiAgICB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCBiZXN0ID0gbnVsbCwgYmVzdFBvcyA9IDA7XG4gICAgICAgIGZvciAobGV0IG9mZiA9IHRoaXMubGVuZ3RoLCBpID0gdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2ZmIC0gY2hpbGQuYnJlYWtBZnRlciwgc3RhcnQgPSBlbmQgLSBjaGlsZC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kIDwgcG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKHN0YXJ0IDw9IHBvcyAmJiAoc3RhcnQgPCBwb3MgfHwgY2hpbGQuY292ZXJzKC0xKSkgJiYgKGVuZCA+IHBvcyB8fCBjaGlsZC5jb3ZlcnMoMSkpICYmXG4gICAgICAgICAgICAgICAgKCFiZXN0IHx8IGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcgJiYgIShiZXN0IGluc3RhbmNlb2YgTGluZVZpZXcgJiYgc2lkZSA+PSAwKSkpIHtcbiAgICAgICAgICAgICAgICBiZXN0ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgYmVzdFBvcyA9IHN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmVzdCAmJiBzdGFydCA9PSBwb3MgJiYgZW5kID09IHBvcyAmJiBjaGlsZCBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldyAmJiBNYXRoLmFicyhzaWRlKSA8IDIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZGVjby5zdGFydFNpZGUgPCAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpKVxuICAgICAgICAgICAgICAgICAgICBiZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IHN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0ID8gYmVzdC5jb29yZHNBdChwb3MgLSBiZXN0UG9zLCBzaWRlKSA6IG51bGw7XG4gICAgfVxuICAgIGNvb3Jkc0ZvckNoYXIocG9zKSB7XG4gICAgICAgIGxldCB7IGksIG9mZiB9ID0gdGhpcy5jaGlsZFBvcyhwb3MsIDEpLCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHdoaWxlIChjaGlsZC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCB7IGksIG9mZjogY2hpbGRPZmYgfSA9IGNoaWxkLmNoaWxkUG9zKG9mZiwgMSk7XG4gICAgICAgICAgICBmb3IgKDs7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpID09IGNoaWxkLmNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKChjaGlsZCA9IGNoaWxkLmNoaWxkcmVuW2ldKS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmID0gY2hpbGRPZmY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBUZXh0VmlldykpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGVuZCA9IGZpbmRDbHVzdGVyQnJlYWsoY2hpbGQudGV4dCwgb2ZmKTtcbiAgICAgICAgaWYgKGVuZCA9PSBvZmYpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHJlY3RzID0gdGV4dFJhbmdlKGNoaWxkLmRvbSwgb2ZmLCBlbmQpLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAoaSA9PSByZWN0cy5sZW5ndGggLSAxIHx8IHJlY3QudG9wIDwgcmVjdC5ib3R0b20gJiYgcmVjdC5sZWZ0IDwgcmVjdC5yaWdodClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbWVhc3VyZVZpc2libGVMaW5lSGVpZ2h0cyh2aWV3cG9ydCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW10sIHsgZnJvbSwgdG8gfSA9IHZpZXdwb3J0O1xuICAgICAgICBsZXQgY29udGVudFdpZHRoID0gdGhpcy52aWV3LmNvbnRlbnRET00uY2xpZW50V2lkdGg7XG4gICAgICAgIGxldCBpc1dpZGVyID0gY29udGVudFdpZHRoID4gTWF0aC5tYXgodGhpcy52aWV3LnNjcm9sbERPTS5jbGllbnRXaWR0aCwgdGhpcy5taW5XaWR0aCkgKyAxO1xuICAgICAgICBsZXQgd2lkZXN0ID0gLTEsIGx0ciA9IHRoaXMudmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKHBvcyA+PSBmcm9tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkUmVjdCA9IGNoaWxkLmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZFJlY3QuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNXaWRlcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGNoaWxkLmRvbS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWN0cyA9IGxhc3QgPyBjbGllbnRSZWN0c0ZvcihsYXN0KSA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW3JlY3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gbHRyID8gcmVjdC5yaWdodCAtIGNoaWxkUmVjdC5sZWZ0IDogY2hpbGRSZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gd2lkZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZXN0ID0gd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aCA9IGNvbnRlbnRXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoRnJvbSA9IHBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoVG8gPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRleHREaXJlY3Rpb25BdChwb3MpIHtcbiAgICAgICAgbGV0IHsgaSB9ID0gdGhpcy5jaGlsZFBvcyhwb3MsIDEpO1xuICAgICAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmNoaWxkcmVuW2ldLmRvbSkuZGlyZWN0aW9uID09IFwicnRsXCIgPyBEaXJlY3Rpb24uUlRMIDogRGlyZWN0aW9uLkxUUjtcbiAgICB9XG4gICAgbWVhc3VyZVRleHRTaXplKCkge1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBMaW5lVmlldykge1xuICAgICAgICAgICAgICAgIGxldCBtZWFzdXJlID0gY2hpbGQubWVhc3VyZVRleHRTaXplKCk7XG4gICAgICAgICAgICAgICAgaWYgKG1lYXN1cmUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vIHdvcmthYmxlIGxpbmUgZXhpc3RzLCBmb3JjZSBhIGxheW91dCBvZiBhIG1lYXN1cmFibGUgZWxlbWVudFxuICAgICAgICBsZXQgZHVtbXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLCBsaW5lSGVpZ2h0LCBjaGFyV2lkdGgsIHRleHRIZWlnaHQ7XG4gICAgICAgIGR1bW15LmNsYXNzTmFtZSA9IFwiY20tbGluZVwiO1xuICAgICAgICBkdW1teS5zdHlsZS53aWR0aCA9IFwiOTk5OTlweFwiO1xuICAgICAgICBkdW1teS5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgZHVtbXkudGV4dENvbnRlbnQgPSBcImFiYyBkZWYgZ2hpIGprbCBtbm8gcHFyIHN0dVwiO1xuICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuaWdub3JlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGR1bW15KTtcbiAgICAgICAgICAgIGxldCByZWN0ID0gY2xpZW50UmVjdHNGb3IoZHVtbXkuZmlyc3RDaGlsZClbMF07XG4gICAgICAgICAgICBsaW5lSGVpZ2h0ID0gZHVtbXkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgY2hhcldpZHRoID0gcmVjdCA/IHJlY3Qud2lkdGggLyAyNyA6IDc7XG4gICAgICAgICAgICB0ZXh0SGVpZ2h0ID0gcmVjdCA/IHJlY3QuaGVpZ2h0IDogbGluZUhlaWdodDtcbiAgICAgICAgICAgIGR1bW15LnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0IH07XG4gICAgfVxuICAgIGNoaWxkQ3Vyc29yKHBvcyA9IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIE1vdmUgYmFjayB0byBzdGFydCBvZiBsYXN0IGVsZW1lbnQgd2hlbiBwb3NzaWJsZSwgc28gdGhhdFxuICAgICAgICAvLyBgQ2hpbGRDdXJzb3IuZmluZFBvc2AgZG9lc24ndCBoYXZlIHRvIGRlYWwgd2l0aCB0aGUgZWRnZSBjYXNlXG4gICAgICAgIC8vIG9mIGJlaW5nIGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQuXG4gICAgICAgIGxldCBpID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgIGlmIChpKVxuICAgICAgICAgICAgcG9zIC09IHRoaXMuY2hpbGRyZW5bLS1pXS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBuZXcgQ2hpbGRDdXJzb3IodGhpcy5jaGlsZHJlbiwgcG9zLCBpKTtcbiAgICB9XG4gICAgY29tcHV0ZUJsb2NrR2FwRGVjbygpIHtcbiAgICAgICAgbGV0IGRlY28gPSBbXSwgdnMgPSB0aGlzLnZpZXcudmlld1N0YXRlO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBpID09IHZzLnZpZXdwb3J0cy5sZW5ndGggPyBudWxsIDogdnMudmlld3BvcnRzW2ldO1xuICAgICAgICAgICAgbGV0IGVuZCA9IG5leHQgPyBuZXh0LmZyb20gLSAxIDogdGhpcy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9ICh2cy5saW5lQmxvY2tBdChlbmQpLmJvdHRvbSAtIHZzLmxpbmVCbG9ja0F0KHBvcykudG9wKSAvIHRoaXMudmlldy5zY2FsZVk7XG4gICAgICAgICAgICAgICAgZGVjby5wdXNoKERlY29yYXRpb24ucmVwbGFjZSh7XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldDogbmV3IEJsb2NrR2FwV2lkZ2V0KGhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGlzQmxvY2tHYXA6IHRydWUsXG4gICAgICAgICAgICAgICAgfSkucmFuZ2UocG9zLCBlbmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbmV4dClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHBvcyA9IG5leHQudG8gKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChkZWNvKTtcbiAgICB9XG4gICAgdXBkYXRlRGVjbygpIHtcbiAgICAgICAgbGV0IGkgPSAxO1xuICAgICAgICBsZXQgYWxsRGVjbyA9IHRoaXMudmlldy5zdGF0ZS5mYWNldChkZWNvcmF0aW9ucykubWFwKGQgPT4ge1xuICAgICAgICAgICAgbGV0IGR5bmFtaWMgPSB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwW2krK10gPSB0eXBlb2YgZCA9PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgICAgICByZXR1cm4gZHluYW1pYyA/IGQodGhpcy52aWV3KSA6IGQ7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZHluYW1pY091dGVyID0gZmFsc2UsIG91dGVyRGVjbyA9IHRoaXMudmlldy5zdGF0ZS5mYWNldChvdXRlckRlY29yYXRpb25zKS5tYXAoKGQsIGkpID0+IHtcbiAgICAgICAgICAgIGxldCBkeW5hbWljID0gdHlwZW9mIGQgPT0gXCJmdW5jdGlvblwiO1xuICAgICAgICAgICAgaWYgKGR5bmFtaWMpXG4gICAgICAgICAgICAgICAgZHluYW1pY091dGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBkeW5hbWljID8gZCh0aGlzLnZpZXcpIDogZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvdXRlckRlY28ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwW2krK10gPSBkeW5hbWljT3V0ZXI7XG4gICAgICAgICAgICBhbGxEZWNvLnB1c2goUmFuZ2VTZXQuam9pbihvdXRlckRlY28pKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gW1xuICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dEZvcm1hdHRpbmcsXG4gICAgICAgICAgICAuLi5hbGxEZWNvLFxuICAgICAgICAgICAgdGhpcy5jb21wdXRlQmxvY2tHYXBEZWNvKCksXG4gICAgICAgICAgICB0aGlzLnZpZXcudmlld1N0YXRlLmxpbmVHYXBEZWNvXG4gICAgICAgIF07XG4gICAgICAgIHdoaWxlIChpIDwgdGhpcy5kZWNvcmF0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwW2krK10gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjb3JhdGlvbnM7XG4gICAgfVxuICAgIHNjcm9sbEludG9WaWV3KHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0LmlzU25hcHNob3QpIHtcbiAgICAgICAgICAgIGxldCByZWYgPSB0aGlzLnZpZXcudmlld1N0YXRlLmxpbmVCbG9ja0F0KHRhcmdldC5yYW5nZS5oZWFkKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxET00uc2Nyb2xsVG9wID0gcmVmLnRvcCAtIHRhcmdldC55TWFyZ2luO1xuICAgICAgICAgICAgdGhpcy52aWV3LnNjcm9sbERPTS5zY3JvbGxMZWZ0ID0gdGFyZ2V0LnhNYXJnaW47XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaGFuZGxlciBvZiB0aGlzLnZpZXcuc3RhdGUuZmFjZXQoc2Nyb2xsSGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIodGhpcy52aWV3LCB0YXJnZXQucmFuZ2UsIHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odGhpcy52aWV3LnN0YXRlLCBlLCBcInNjcm9sbCBoYW5kbGVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB7IHJhbmdlIH0gPSB0YXJnZXQ7XG4gICAgICAgIGxldCByZWN0ID0gdGhpcy5jb29yZHNBdChyYW5nZS5oZWFkLCByYW5nZS5lbXB0eSA/IHJhbmdlLmFzc29jIDogcmFuZ2UuaGVhZCA+IHJhbmdlLmFuY2hvciA/IC0xIDogMSksIG90aGVyO1xuICAgICAgICBpZiAoIXJlY3QpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICghcmFuZ2UuZW1wdHkgJiYgKG90aGVyID0gdGhpcy5jb29yZHNBdChyYW5nZS5hbmNob3IsIHJhbmdlLmFuY2hvciA+IHJhbmdlLmhlYWQgPyAtMSA6IDEpKSlcbiAgICAgICAgICAgIHJlY3QgPSB7IGxlZnQ6IE1hdGgubWluKHJlY3QubGVmdCwgb3RoZXIubGVmdCksIHRvcDogTWF0aC5taW4ocmVjdC50b3AsIG90aGVyLnRvcCksXG4gICAgICAgICAgICAgICAgcmlnaHQ6IE1hdGgubWF4KHJlY3QucmlnaHQsIG90aGVyLnJpZ2h0KSwgYm90dG9tOiBNYXRoLm1heChyZWN0LmJvdHRvbSwgb3RoZXIuYm90dG9tKSB9O1xuICAgICAgICBsZXQgbWFyZ2lucyA9IGdldFNjcm9sbE1hcmdpbnModGhpcy52aWV3KTtcbiAgICAgICAgbGV0IHRhcmdldFJlY3QgPSB7XG4gICAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQgLSBtYXJnaW5zLmxlZnQsIHRvcDogcmVjdC50b3AgLSBtYXJnaW5zLnRvcCxcbiAgICAgICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0ICsgbWFyZ2lucy5yaWdodCwgYm90dG9tOiByZWN0LmJvdHRvbSArIG1hcmdpbnMuYm90dG9tXG4gICAgICAgIH07XG4gICAgICAgIGxldCB7IG9mZnNldFdpZHRoLCBvZmZzZXRIZWlnaHQgfSA9IHRoaXMudmlldy5zY3JvbGxET007XG4gICAgICAgIHNjcm9sbFJlY3RJbnRvVmlldyh0aGlzLnZpZXcuc2Nyb2xsRE9NLCB0YXJnZXRSZWN0LCByYW5nZS5oZWFkIDwgcmFuZ2UuYW5jaG9yID8gLTEgOiAxLCB0YXJnZXQueCwgdGFyZ2V0LnksIE1hdGgubWF4KE1hdGgubWluKHRhcmdldC54TWFyZ2luLCBvZmZzZXRXaWR0aCksIC1vZmZzZXRXaWR0aCksIE1hdGgubWF4KE1hdGgubWluKHRhcmdldC55TWFyZ2luLCBvZmZzZXRIZWlnaHQpLCAtb2Zmc2V0SGVpZ2h0KSwgdGhpcy52aWV3LnRleHREaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUik7XG4gICAgfVxufVxuZnVuY3Rpb24gYmV0d2VlblVuZWRpdGFibGUocG9zKSB7XG4gICAgcmV0dXJuIHBvcy5ub2RlLm5vZGVUeXBlID09IDEgJiYgcG9zLm5vZGUuZmlyc3RDaGlsZCAmJlxuICAgICAgICAocG9zLm9mZnNldCA9PSAwIHx8IHBvcy5ub2RlLmNoaWxkTm9kZXNbcG9zLm9mZnNldCAtIDFdLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpICYmXG4gICAgICAgIChwb3Mub2Zmc2V0ID09IHBvcy5ub2RlLmNoaWxkTm9kZXMubGVuZ3RoIHx8IHBvcy5ub2RlLmNoaWxkTm9kZXNbcG9zLm9mZnNldF0uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIik7XG59XG5mdW5jdGlvbiBmaW5kQ29tcG9zaXRpb25Ob2RlKHZpZXcsIGhlYWRQb3MpIHtcbiAgICBsZXQgc2VsID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICBpZiAoIXNlbC5mb2N1c05vZGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCB0ZXh0QmVmb3JlID0gdGV4dE5vZGVCZWZvcmUoc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICBsZXQgdGV4dEFmdGVyID0gdGV4dE5vZGVBZnRlcihzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQpO1xuICAgIGxldCB0ZXh0Tm9kZSA9IHRleHRCZWZvcmUgfHwgdGV4dEFmdGVyO1xuICAgIGlmICh0ZXh0QWZ0ZXIgJiYgdGV4dEJlZm9yZSAmJiB0ZXh0QWZ0ZXIubm9kZSAhPSB0ZXh0QmVmb3JlLm5vZGUpIHtcbiAgICAgICAgbGV0IGRlc2NBZnRlciA9IENvbnRlbnRWaWV3LmdldCh0ZXh0QWZ0ZXIubm9kZSk7XG4gICAgICAgIGlmICghZGVzY0FmdGVyIHx8IGRlc2NBZnRlciBpbnN0YW5jZW9mIFRleHRWaWV3ICYmIGRlc2NBZnRlci50ZXh0ICE9IHRleHRBZnRlci5ub2RlLm5vZGVWYWx1ZSkge1xuICAgICAgICAgICAgdGV4dE5vZGUgPSB0ZXh0QWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmlldy5kb2NWaWV3Lmxhc3RDb21wb3NpdGlvbkFmdGVyQ3Vyc29yKSB7XG4gICAgICAgICAgICBsZXQgZGVzY0JlZm9yZSA9IENvbnRlbnRWaWV3LmdldCh0ZXh0QmVmb3JlLm5vZGUpO1xuICAgICAgICAgICAgaWYgKCEoIWRlc2NCZWZvcmUgfHwgZGVzY0JlZm9yZSBpbnN0YW5jZW9mIFRleHRWaWV3ICYmIGRlc2NCZWZvcmUudGV4dCAhPSB0ZXh0QmVmb3JlLm5vZGUubm9kZVZhbHVlKSlcbiAgICAgICAgICAgICAgICB0ZXh0Tm9kZSA9IHRleHRBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3LmRvY1ZpZXcubGFzdENvbXBvc2l0aW9uQWZ0ZXJDdXJzb3IgPSB0ZXh0Tm9kZSAhPSB0ZXh0QmVmb3JlO1xuICAgIGlmICghdGV4dE5vZGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBmcm9tID0gaGVhZFBvcyAtIHRleHROb2RlLm9mZnNldDtcbiAgICByZXR1cm4geyBmcm9tLCB0bzogZnJvbSArIHRleHROb2RlLm5vZGUubm9kZVZhbHVlLmxlbmd0aCwgbm9kZTogdGV4dE5vZGUubm9kZSB9O1xufVxuZnVuY3Rpb24gZmluZENvbXBvc2l0aW9uUmFuZ2UodmlldywgY2hhbmdlcywgaGVhZFBvcykge1xuICAgIGxldCBmb3VuZCA9IGZpbmRDb21wb3NpdGlvbk5vZGUodmlldywgaGVhZFBvcyk7XG4gICAgaWYgKCFmb3VuZClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHsgbm9kZTogdGV4dE5vZGUsIGZyb20sIHRvIH0gPSBmb3VuZCwgdGV4dCA9IHRleHROb2RlLm5vZGVWYWx1ZTtcbiAgICAvLyBEb24ndCB0cnkgdG8gcHJlc2VydmUgbXVsdGktbGluZSBjb21wb3NpdGlvbnNcbiAgICBpZiAoL1tcXG5cXHJdLy50ZXN0KHRleHQpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAodmlldy5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcoZm91bmQuZnJvbSwgZm91bmQudG8pICE9IHRleHQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBpbnYgPSBjaGFuZ2VzLmludmVydGVkRGVzYztcbiAgICBsZXQgcmFuZ2UgPSBuZXcgQ2hhbmdlZFJhbmdlKGludi5tYXBQb3MoZnJvbSksIGludi5tYXBQb3ModG8pLCBmcm9tLCB0byk7XG4gICAgbGV0IG1hcmtzID0gW107XG4gICAgZm9yIChsZXQgcGFyZW50ID0gdGV4dE5vZGUucGFyZW50Tm9kZTs7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGxldCBwYXJlbnRWaWV3ID0gQ29udGVudFZpZXcuZ2V0KHBhcmVudCk7XG4gICAgICAgIGlmIChwYXJlbnRWaWV3IGluc3RhbmNlb2YgTWFya1ZpZXcpXG4gICAgICAgICAgICBtYXJrcy5wdXNoKHsgbm9kZTogcGFyZW50LCBkZWNvOiBwYXJlbnRWaWV3Lm1hcmsgfSk7XG4gICAgICAgIGVsc2UgaWYgKHBhcmVudFZpZXcgaW5zdGFuY2VvZiBMaW5lVmlldyB8fCBwYXJlbnQubm9kZU5hbWUgPT0gXCJESVZcIiAmJiBwYXJlbnQucGFyZW50Tm9kZSA9PSB2aWV3LmNvbnRlbnRET00pXG4gICAgICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dDogdGV4dE5vZGUsIG1hcmtzLCBsaW5lOiBwYXJlbnQgfTtcbiAgICAgICAgZWxzZSBpZiAocGFyZW50ICE9IHZpZXcuY29udGVudERPTSlcbiAgICAgICAgICAgIG1hcmtzLnB1c2goeyBub2RlOiBwYXJlbnQsIGRlY286IG5ldyBNYXJrRGVjb3JhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogZ2V0QXR0cnMocGFyZW50KSxcbiAgICAgICAgICAgICAgICAgICAgdGFnTmFtZTogcGFyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIH0pIH0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5mdW5jdGlvbiBuZXh0VG9VbmVkaXRhYmxlKG5vZGUsIG9mZnNldCkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDEpXG4gICAgICAgIHJldHVybiAwO1xuICAgIHJldHVybiAob2Zmc2V0ICYmIG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiID8gMSAvKiBOZXh0VG8uQmVmb3JlICovIDogMCkgfFxuICAgICAgICAob2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCAmJiBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiID8gMiAvKiBOZXh0VG8uQWZ0ZXIgKi8gOiAwKTtcbn1cbmxldCBEZWNvcmF0aW9uQ29tcGFyYXRvciQxID0gY2xhc3MgRGVjb3JhdGlvbkNvbXBhcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBbXTtcbiAgICB9XG4gICAgY29tcGFyZVJhbmdlKGZyb20sIHRvKSB7IGFkZFJhbmdlKGZyb20sIHRvLCB0aGlzLmNoYW5nZXMpOyB9XG4gICAgY29tcGFyZVBvaW50KGZyb20sIHRvKSB7IGFkZFJhbmdlKGZyb20sIHRvLCB0aGlzLmNoYW5nZXMpOyB9XG4gICAgYm91bmRDaGFuZ2UocG9zKSB7IGFkZFJhbmdlKHBvcywgcG9zLCB0aGlzLmNoYW5nZXMpOyB9XG59O1xuZnVuY3Rpb24gZmluZENoYW5nZWREZWNvKGEsIGIsIGRpZmYpIHtcbiAgICBsZXQgY29tcCA9IG5ldyBEZWNvcmF0aW9uQ29tcGFyYXRvciQxO1xuICAgIFJhbmdlU2V0LmNvbXBhcmUoYSwgYiwgZGlmZiwgY29tcCk7XG4gICAgcmV0dXJuIGNvbXAuY2hhbmdlcztcbn1cbmZ1bmN0aW9uIGluVW5lZGl0YWJsZShub2RlLCBpbnNpZGUpIHtcbiAgICBmb3IgKGxldCBjdXIgPSBub2RlOyBjdXIgJiYgY3VyICE9IGluc2lkZTsgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZSkge1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09IDEgJiYgY3VyLmNvbnRlbnRFZGl0YWJsZSA9PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiB0b3VjaGVzQ29tcG9zaXRpb24oY2hhbmdlcywgY29tcG9zaXRpb24pIHtcbiAgICBsZXQgdG91Y2hlZCA9IGZhbHNlO1xuICAgIGlmIChjb21wb3NpdGlvbilcbiAgICAgICAgY2hhbmdlcy5pdGVyQ2hhbmdlZFJhbmdlcygoZnJvbSwgdG8pID0+IHtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgY29tcG9zaXRpb24udG8gJiYgdG8gPiBjb21wb3NpdGlvbi5mcm9tKVxuICAgICAgICAgICAgICAgIHRvdWNoZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICByZXR1cm4gdG91Y2hlZDtcbn1cblxuZnVuY3Rpb24gZ3JvdXBBdChzdGF0ZSwgcG9zLCBiaWFzID0gMSkge1xuICAgIGxldCBjYXRlZ29yaXplID0gc3RhdGUuY2hhckNhdGVnb3JpemVyKHBvcyk7XG4gICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KHBvcyksIGxpbmVQb3MgPSBwb3MgLSBsaW5lLmZyb207XG4gICAgaWYgKGxpbmUubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcyk7XG4gICAgaWYgKGxpbmVQb3MgPT0gMClcbiAgICAgICAgYmlhcyA9IDE7XG4gICAgZWxzZSBpZiAobGluZVBvcyA9PSBsaW5lLmxlbmd0aClcbiAgICAgICAgYmlhcyA9IC0xO1xuICAgIGxldCBmcm9tID0gbGluZVBvcywgdG8gPSBsaW5lUG9zO1xuICAgIGlmIChiaWFzIDwgMClcbiAgICAgICAgZnJvbSA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCBsaW5lUG9zLCBmYWxzZSk7XG4gICAgZWxzZVxuICAgICAgICB0byA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCBsaW5lUG9zKTtcbiAgICBsZXQgY2F0ID0gY2F0ZWdvcml6ZShsaW5lLnRleHQuc2xpY2UoZnJvbSwgdG8pKTtcbiAgICB3aGlsZSAoZnJvbSA+IDApIHtcbiAgICAgICAgbGV0IHByZXYgPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgZnJvbSwgZmFsc2UpO1xuICAgICAgICBpZiAoY2F0ZWdvcml6ZShsaW5lLnRleHQuc2xpY2UocHJldiwgZnJvbSkpICE9IGNhdClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBmcm9tID0gcHJldjtcbiAgICB9XG4gICAgd2hpbGUgKHRvIDwgbGluZS5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG5leHQgPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgdG8pO1xuICAgICAgICBpZiAoY2F0ZWdvcml6ZShsaW5lLnRleHQuc2xpY2UodG8sIG5leHQpKSAhPSBjYXQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgdG8gPSBuZXh0O1xuICAgIH1cbiAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20gKyBsaW5lLmZyb20sIHRvICsgbGluZS5mcm9tKTtcbn1cbi8vIFNlYXJjaCB0aGUgRE9NIGZvciB0aGUge25vZGUsIG9mZnNldH0gcG9zaXRpb24gY2xvc2VzdCB0byB0aGUgZ2l2ZW5cbi8vIGNvb3JkaW5hdGVzLiBWZXJ5IGluZWZmaWNpZW50IGFuZCBjcnVkZSwgYnV0IGNhbiB1c3VhbGx5IGJlIGF2b2lkZWRcbi8vIGJ5IGNhbGxpbmcgY2FyZXQoUG9zaXRpb258UmFuZ2UpRnJvbVBvaW50IGluc3RlYWQuXG5mdW5jdGlvbiBnZXRkeCh4LCByZWN0KSB7XG4gICAgcmV0dXJuIHJlY3QubGVmdCA+IHggPyByZWN0LmxlZnQgLSB4IDogTWF0aC5tYXgoMCwgeCAtIHJlY3QucmlnaHQpO1xufVxuZnVuY3Rpb24gZ2V0ZHkoeSwgcmVjdCkge1xuICAgIHJldHVybiByZWN0LnRvcCA+IHkgPyByZWN0LnRvcCAtIHkgOiBNYXRoLm1heCgwLCB5IC0gcmVjdC5ib3R0b20pO1xufVxuZnVuY3Rpb24geU92ZXJsYXAoYSwgYikge1xuICAgIHJldHVybiBhLnRvcCA8IGIuYm90dG9tIC0gMSAmJiBhLmJvdHRvbSA+IGIudG9wICsgMTtcbn1cbmZ1bmN0aW9uIHVwVG9wKHJlY3QsIHRvcCkge1xuICAgIHJldHVybiB0b3AgPCByZWN0LnRvcCA/IHsgdG9wLCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LnJpZ2h0LCBib3R0b206IHJlY3QuYm90dG9tIH0gOiByZWN0O1xufVxuZnVuY3Rpb24gdXBCb3QocmVjdCwgYm90dG9tKSB7XG4gICAgcmV0dXJuIGJvdHRvbSA+IHJlY3QuYm90dG9tID8geyB0b3A6IHJlY3QudG9wLCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LnJpZ2h0LCBib3R0b20gfSA6IHJlY3Q7XG59XG5mdW5jdGlvbiBkb21Qb3NBdENvb3JkcyhwYXJlbnQsIHgsIHkpIHtcbiAgICBsZXQgY2xvc2VzdCwgY2xvc2VzdFJlY3QsIGNsb3Nlc3RYLCBjbG9zZXN0WSwgY2xvc2VzdE92ZXJsYXAgPSBmYWxzZTtcbiAgICBsZXQgYWJvdmUsIGJlbG93LCBhYm92ZVJlY3QsIGJlbG93UmVjdDtcbiAgICBmb3IgKGxldCBjaGlsZCA9IHBhcmVudC5maXJzdENoaWxkOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBsZXQgcmVjdHMgPSBjbGllbnRSZWN0c0ZvcihjaGlsZCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAoY2xvc2VzdFJlY3QgJiYgeU92ZXJsYXAoY2xvc2VzdFJlY3QsIHJlY3QpKVxuICAgICAgICAgICAgICAgIHJlY3QgPSB1cFRvcCh1cEJvdChyZWN0LCBjbG9zZXN0UmVjdC5ib3R0b20pLCBjbG9zZXN0UmVjdC50b3ApO1xuICAgICAgICAgICAgbGV0IGR4ID0gZ2V0ZHgoeCwgcmVjdCksIGR5ID0gZ2V0ZHkoeSwgcmVjdCk7XG4gICAgICAgICAgICBpZiAoZHggPT0gMCAmJiBkeSA9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5ub2RlVHlwZSA9PSAzID8gZG9tUG9zSW5UZXh0KGNoaWxkLCB4LCB5KSA6IGRvbVBvc0F0Q29vcmRzKGNoaWxkLCB4LCB5KTtcbiAgICAgICAgICAgIGlmICghY2xvc2VzdCB8fCBjbG9zZXN0WSA+IGR5IHx8IGNsb3Nlc3RZID09IGR5ICYmIGNsb3Nlc3RYID4gZHgpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFJlY3QgPSByZWN0O1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RYID0gZHg7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFkgPSBkeTtcbiAgICAgICAgICAgICAgICBsZXQgc2lkZSA9IGR5ID8gKHkgPCByZWN0LnRvcCA/IC0xIDogMSkgOiBkeCA/ICh4IDwgcmVjdC5sZWZ0ID8gLTEgOiAxKSA6IDA7XG4gICAgICAgICAgICAgICAgY2xvc2VzdE92ZXJsYXAgPSAhc2lkZSB8fCAoc2lkZSA+IDAgPyBpIDwgcmVjdHMubGVuZ3RoIC0gMSA6IGkgPiAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkeCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHkgPiByZWN0LmJvdHRvbSAmJiAoIWFib3ZlUmVjdCB8fCBhYm92ZVJlY3QuYm90dG9tIDwgcmVjdC5ib3R0b20pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3ZlID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGFib3ZlUmVjdCA9IHJlY3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHkgPCByZWN0LnRvcCAmJiAoIWJlbG93UmVjdCB8fCBiZWxvd1JlY3QudG9wID4gcmVjdC50b3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93UmVjdCA9IHJlY3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWJvdmVSZWN0ICYmIHlPdmVybGFwKGFib3ZlUmVjdCwgcmVjdCkpIHtcbiAgICAgICAgICAgICAgICBhYm92ZVJlY3QgPSB1cEJvdChhYm92ZVJlY3QsIHJlY3QuYm90dG9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJlbG93UmVjdCAmJiB5T3ZlcmxhcChiZWxvd1JlY3QsIHJlY3QpKSB7XG4gICAgICAgICAgICAgICAgYmVsb3dSZWN0ID0gdXBUb3AoYmVsb3dSZWN0LCByZWN0LnRvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFib3ZlUmVjdCAmJiBhYm92ZVJlY3QuYm90dG9tID49IHkpIHtcbiAgICAgICAgY2xvc2VzdCA9IGFib3ZlO1xuICAgICAgICBjbG9zZXN0UmVjdCA9IGFib3ZlUmVjdDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYmVsb3dSZWN0ICYmIGJlbG93UmVjdC50b3AgPD0geSkge1xuICAgICAgICBjbG9zZXN0ID0gYmVsb3c7XG4gICAgICAgIGNsb3Nlc3RSZWN0ID0gYmVsb3dSZWN0O1xuICAgIH1cbiAgICBpZiAoIWNsb3Nlc3QpXG4gICAgICAgIHJldHVybiB7IG5vZGU6IHBhcmVudCwgb2Zmc2V0OiAwIH07XG4gICAgbGV0IGNsaXBYID0gTWF0aC5tYXgoY2xvc2VzdFJlY3QubGVmdCwgTWF0aC5taW4oY2xvc2VzdFJlY3QucmlnaHQsIHgpKTtcbiAgICBpZiAoY2xvc2VzdC5ub2RlVHlwZSA9PSAzKVxuICAgICAgICByZXR1cm4gZG9tUG9zSW5UZXh0KGNsb3Nlc3QsIGNsaXBYLCB5KTtcbiAgICBpZiAoY2xvc2VzdE92ZXJsYXAgJiYgY2xvc2VzdC5jb250ZW50RWRpdGFibGUgIT0gXCJmYWxzZVwiKVxuICAgICAgICByZXR1cm4gZG9tUG9zQXRDb29yZHMoY2xvc2VzdCwgY2xpcFgsIHkpO1xuICAgIGxldCBvZmZzZXQgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHBhcmVudC5jaGlsZE5vZGVzLCBjbG9zZXN0KSArXG4gICAgICAgICh4ID49IChjbG9zZXN0UmVjdC5sZWZ0ICsgY2xvc2VzdFJlY3QucmlnaHQpIC8gMiA/IDEgOiAwKTtcbiAgICByZXR1cm4geyBub2RlOiBwYXJlbnQsIG9mZnNldCB9O1xufVxuZnVuY3Rpb24gZG9tUG9zSW5UZXh0KG5vZGUsIHgsIHkpIHtcbiAgICBsZXQgbGVuID0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoO1xuICAgIGxldCBjbG9zZXN0T2Zmc2V0ID0gLTEsIGNsb3Nlc3REWSA9IDFlOSwgZ2VuZXJhbFNpZGUgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgbGV0IHJlY3RzID0gdGV4dFJhbmdlKG5vZGUsIGksIGkgKyAxKS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlY3RzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgaWYgKHJlY3QudG9wID09IHJlY3QuYm90dG9tKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFnZW5lcmFsU2lkZSlcbiAgICAgICAgICAgICAgICBnZW5lcmFsU2lkZSA9IHggLSByZWN0LmxlZnQ7XG4gICAgICAgICAgICBsZXQgZHkgPSAocmVjdC50b3AgPiB5ID8gcmVjdC50b3AgLSB5IDogeSAtIHJlY3QuYm90dG9tKSAtIDE7XG4gICAgICAgICAgICBpZiAocmVjdC5sZWZ0IC0gMSA8PSB4ICYmIHJlY3QucmlnaHQgKyAxID49IHggJiYgZHkgPCBjbG9zZXN0RFkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmlnaHQgPSB4ID49IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIsIGFmdGVyID0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKGJyb3dzZXIuY2hyb21lIHx8IGJyb3dzZXIuZ2Vja28pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFJUTCBvbiBicm93c2VycyB0aGF0IHN1cHBvcnQgZ2V0dGluZyBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVjdHMgZm9yIGVtcHR5IHJhbmdlcy5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3RCZWZvcmUgPSB0ZXh0UmFuZ2Uobm9kZSwgaSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWN0QmVmb3JlLmxlZnQgPT0gcmVjdC5yaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyID0gIXJpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZHkgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiBpICsgKGFmdGVyID8gMSA6IDApIH07XG4gICAgICAgICAgICAgICAgY2xvc2VzdE9mZnNldCA9IGkgKyAoYWZ0ZXIgPyAxIDogMCk7XG4gICAgICAgICAgICAgICAgY2xvc2VzdERZID0gZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiBjbG9zZXN0T2Zmc2V0ID4gLTEgPyBjbG9zZXN0T2Zmc2V0IDogZ2VuZXJhbFNpZGUgPiAwID8gbm9kZS5ub2RlVmFsdWUubGVuZ3RoIDogMCB9O1xufVxuZnVuY3Rpb24gcG9zQXRDb29yZHModmlldywgY29vcmRzLCBwcmVjaXNlLCBiaWFzID0gLTEpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGxldCBjb250ZW50ID0gdmlldy5jb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBkb2NUb3AgPSBjb250ZW50LnRvcCArIHZpZXcudmlld1N0YXRlLnBhZGRpbmdUb3A7XG4gICAgbGV0IGJsb2NrLCB7IGRvY0hlaWdodCB9ID0gdmlldy52aWV3U3RhdGU7XG4gICAgbGV0IHsgeCwgeSB9ID0gY29vcmRzLCB5T2Zmc2V0ID0geSAtIGRvY1RvcDtcbiAgICBpZiAoeU9mZnNldCA8IDApXG4gICAgICAgIHJldHVybiAwO1xuICAgIGlmICh5T2Zmc2V0ID4gZG9jSGVpZ2h0KVxuICAgICAgICByZXR1cm4gdmlldy5zdGF0ZS5kb2MubGVuZ3RoO1xuICAgIC8vIFNjYW4gZm9yIGEgdGV4dCBibG9jayBuZWFyIHRoZSBxdWVyaWVkIHkgcG9zaXRpb25cbiAgICBmb3IgKGxldCBoYWxmTGluZSA9IHZpZXcudmlld1N0YXRlLmhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0IC8gMiwgYm91bmNlZCA9IGZhbHNlOzspIHtcbiAgICAgICAgYmxvY2sgPSB2aWV3LmVsZW1lbnRBdEhlaWdodCh5T2Zmc2V0KTtcbiAgICAgICAgaWYgKGJsb2NrLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgLy8gTW92ZSB0aGUgeSBwb3NpdGlvbiBvdXQgb2YgdGhpcyBibG9ja1xuICAgICAgICAgICAgeU9mZnNldCA9IGJpYXMgPiAwID8gYmxvY2suYm90dG9tICsgaGFsZkxpbmUgOiBibG9jay50b3AgLSBoYWxmTGluZTtcbiAgICAgICAgICAgIGlmICh5T2Zmc2V0ID49IDAgJiYgeU9mZnNldCA8PSBkb2NIZWlnaHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZG9jdW1lbnQgY29uc2lzdHMgZW50aXJlbHkgb2YgcmVwbGFjZWQgd2lkZ2V0cywgd2VcbiAgICAgICAgICAgIC8vIHdvbid0IGZpbmQgYSB0ZXh0IGJsb2NrLCBzbyByZXR1cm4gMFxuICAgICAgICAgICAgaWYgKGJvdW5jZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWNpc2UgPyBudWxsIDogMDtcbiAgICAgICAgICAgIGJvdW5jZWQgPSB0cnVlO1xuICAgICAgICAgICAgYmlhcyA9IC1iaWFzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHkgPSBkb2NUb3AgKyB5T2Zmc2V0O1xuICAgIGxldCBsaW5lU3RhcnQgPSBibG9jay5mcm9tO1xuICAgIC8vIElmIHRoaXMgaXMgb3V0c2lkZSBvZiB0aGUgcmVuZGVyZWQgdmlld3BvcnQsIHdlIGNhbid0IGRldGVybWluZSBhIHBvc2l0aW9uXG4gICAgaWYgKGxpbmVTdGFydCA8IHZpZXcudmlld3BvcnQuZnJvbSlcbiAgICAgICAgcmV0dXJuIHZpZXcudmlld3BvcnQuZnJvbSA9PSAwID8gMCA6IHByZWNpc2UgPyBudWxsIDogcG9zQXRDb29yZHNJbXByZWNpc2UodmlldywgY29udGVudCwgYmxvY2ssIHgsIHkpO1xuICAgIGlmIChsaW5lU3RhcnQgPiB2aWV3LnZpZXdwb3J0LnRvKVxuICAgICAgICByZXR1cm4gdmlldy52aWV3cG9ydC50byA9PSB2aWV3LnN0YXRlLmRvYy5sZW5ndGggPyB2aWV3LnN0YXRlLmRvYy5sZW5ndGggOlxuICAgICAgICAgICAgcHJlY2lzZSA/IG51bGwgOiBwb3NBdENvb3Jkc0ltcHJlY2lzZSh2aWV3LCBjb250ZW50LCBibG9jaywgeCwgeSk7XG4gICAgLy8gUHJlZmVyIFNoYWRvd1Jvb3RPckRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQgaWYgcHJlc2VudCwgZmFsbCBiYWNrIHRvIGRvY3VtZW50IGlmIG5vdFxuICAgIGxldCBkb2MgPSB2aWV3LmRvbS5vd25lckRvY3VtZW50O1xuICAgIGxldCByb290ID0gdmlldy5yb290LmVsZW1lbnRGcm9tUG9pbnQgPyB2aWV3LnJvb3QgOiBkb2M7XG4gICAgbGV0IGVsZW1lbnQgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgaWYgKGVsZW1lbnQgJiYgIXZpZXcuY29udGVudERPTS5jb250YWlucyhlbGVtZW50KSlcbiAgICAgICAgZWxlbWVudCA9IG51bGw7XG4gICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgdW5leHBlY3RlZCwgY2xpcCB4IGF0IHRoZSBzaWRlcyBvZiB0aGUgY29udGVudCBhcmVhIGFuZCB0cnkgYWdhaW5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgeCA9IE1hdGgubWF4KGNvbnRlbnQubGVmdCArIDEsIE1hdGgubWluKGNvbnRlbnQucmlnaHQgLSAxLCB4KSk7XG4gICAgICAgIGVsZW1lbnQgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgIGlmIChlbGVtZW50ICYmICF2aWV3LmNvbnRlbnRET00uY29udGFpbnMoZWxlbWVudCkpXG4gICAgICAgICAgICBlbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgLy8gVGhlcmUncyB2aXNpYmxlIGVkaXRvciBjb250ZW50IHVuZGVyIHRoZSBwb2ludCwgc28gd2UgY2FuIHRyeVxuICAgIC8vIHVzaW5nIGNhcmV0KFBvc2l0aW9ufFJhbmdlKUZyb21Qb2ludCBhcyBhIHNob3J0Y3V0XG4gICAgbGV0IG5vZGUsIG9mZnNldCA9IC0xO1xuICAgIGlmIChlbGVtZW50ICYmICgoX2EgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdChlbGVtZW50KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzRWRpdGFibGUpICE9IGZhbHNlKSB7XG4gICAgICAgIGlmIChkb2MuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCkge1xuICAgICAgICAgICAgbGV0IHBvcyA9IGRvYy5jYXJldFBvc2l0aW9uRnJvbVBvaW50KHgsIHkpO1xuICAgICAgICAgICAgaWYgKHBvcylcbiAgICAgICAgICAgICAgICAoeyBvZmZzZXROb2RlOiBub2RlLCBvZmZzZXQgfSA9IHBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZG9jLmNhcmV0UmFuZ2VGcm9tUG9pbnQpIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KHgsIHkpO1xuICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgKHsgc3RhcnRDb250YWluZXI6IG5vZGUsIHN0YXJ0T2Zmc2V0OiBvZmZzZXQgfSA9IHJhbmdlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZpZXcuY29udGVudERPTS5jb250YWlucyhub2RlKSB8fFxuICAgICAgICAgICAgICAgICAgICBicm93c2VyLnNhZmFyaSAmJiBpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdChub2RlLCBvZmZzZXQsIHgpIHx8XG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXIuY2hyb21lICYmIGlzU3VzcGljaW91c0Nocm9tZUNhcmV0UmVzdWx0KG5vZGUsIG9mZnNldCwgeCkpXG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hyb21lIHdpbGwgcmV0dXJuIG9mZnNldHMgaW50byA8aW5wdXQ+IGVsZW1lbnRzIHdpdGhvdXQgY2hpbGRcbiAgICAgICAgLy8gbm9kZXMsIHdoaWNoIHdpbGwgbGVhZCB0byBhIG51bGwgZGVyZWYgYmVsb3csIHNvIGNsaXAgdGhlXG4gICAgICAgIC8vIG9mZnNldCB0byB0aGUgbm9kZSBzaXplLlxuICAgICAgICBpZiAobm9kZSlcbiAgICAgICAgICAgIG9mZnNldCA9IE1hdGgubWluKG1heE9mZnNldChub2RlKSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gTm8gbHVjaywgZG8gb3VyIG93biAocG90ZW50aWFsbHkgZXhwZW5zaXZlKSBzZWFyY2hcbiAgICBpZiAoIW5vZGUgfHwgIXZpZXcuZG9jVmlldy5kb20uY29udGFpbnMobm9kZSkpIHtcbiAgICAgICAgbGV0IGxpbmUgPSBMaW5lVmlldy5maW5kKHZpZXcuZG9jVmlldywgbGluZVN0YXJ0KTtcbiAgICAgICAgaWYgKCFsaW5lKVxuICAgICAgICAgICAgcmV0dXJuIHlPZmZzZXQgPiBibG9jay50b3AgKyBibG9jay5oZWlnaHQgLyAyID8gYmxvY2sudG8gOiBibG9jay5mcm9tO1xuICAgICAgICAoeyBub2RlLCBvZmZzZXQgfSA9IGRvbVBvc0F0Q29vcmRzKGxpbmUuZG9tLCB4LCB5KSk7XG4gICAgfVxuICAgIGxldCBuZWFyZXN0ID0gdmlldy5kb2NWaWV3Lm5lYXJlc3Qobm9kZSk7XG4gICAgaWYgKCFuZWFyZXN0KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAobmVhcmVzdC5pc1dpZGdldCAmJiAoKF9iID0gbmVhcmVzdC5kb20pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5ub2RlVHlwZSkgPT0gMSkge1xuICAgICAgICBsZXQgcmVjdCA9IG5lYXJlc3QuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4gY29vcmRzLnkgPCByZWN0LnRvcCB8fCBjb29yZHMueSA8PSByZWN0LmJvdHRvbSAmJiBjb29yZHMueCA8PSAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyXG4gICAgICAgICAgICA/IG5lYXJlc3QucG9zQXRTdGFydCA6IG5lYXJlc3QucG9zQXRFbmQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbmVhcmVzdC5sb2NhbFBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSArIG5lYXJlc3QucG9zQXRTdGFydDtcbiAgICB9XG59XG5mdW5jdGlvbiBwb3NBdENvb3Jkc0ltcHJlY2lzZSh2aWV3LCBjb250ZW50UmVjdCwgYmxvY2ssIHgsIHkpIHtcbiAgICBsZXQgaW50byA9IE1hdGgucm91bmQoKHggLSBjb250ZW50UmVjdC5sZWZ0KSAqIHZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoKTtcbiAgICBpZiAodmlldy5saW5lV3JhcHBpbmcgJiYgYmxvY2suaGVpZ2h0ID4gdmlldy5kZWZhdWx0TGluZUhlaWdodCAqIDEuNSkge1xuICAgICAgICBsZXQgdGV4dEhlaWdodCA9IHZpZXcudmlld1N0YXRlLmhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0O1xuICAgICAgICBsZXQgbGluZSA9IE1hdGguZmxvb3IoKHkgLSBibG9jay50b3AgLSAodmlldy5kZWZhdWx0TGluZUhlaWdodCAtIHRleHRIZWlnaHQpICogMC41KSAvIHRleHRIZWlnaHQpO1xuICAgICAgICBpbnRvICs9IGxpbmUgKiB2aWV3LnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUubGluZUxlbmd0aDtcbiAgICB9XG4gICAgbGV0IGNvbnRlbnQgPSB2aWV3LnN0YXRlLnNsaWNlRG9jKGJsb2NrLmZyb20sIGJsb2NrLnRvKTtcbiAgICByZXR1cm4gYmxvY2suZnJvbSArIGZpbmRDb2x1bW4oY29udGVudCwgaW50bywgdmlldy5zdGF0ZS50YWJTaXplKTtcbn1cbi8vIEluIGNhc2Ugb2YgYSBoaWdoIGxpbmUgaGVpZ2h0LCBTYWZhcmkncyBjYXJldFJhbmdlRnJvbVBvaW50IHRyZWF0c1xuLy8gdGhlIHNwYWNlIGJldHdlZW4gbGluZXMgYXMgYmVsb25naW5nIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGVcbi8vIGxpbmUgYmVmb3JlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZWN0IHN1Y2ggYSByZXN1bHQgc28gdGhhdCBpdCBjYW4gYmVcbi8vIGlnbm9yZWQgKGlzc3VlICM0MDEpLlxuZnVuY3Rpb24gaXNTdXNwaWNpb3VzU2FmYXJpQ2FyZXRSZXN1bHQobm9kZSwgb2Zmc2V0LCB4KSB7XG4gICAgbGV0IGxlbjtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAzIHx8IG9mZnNldCAhPSAobGVuID0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IG5leHQgPSBub2RlLm5leHRTaWJsaW5nOyBuZXh0OyBuZXh0ID0gbmV4dC5uZXh0U2libGluZylcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgIT0gMSB8fCBuZXh0Lm5vZGVOYW1lICE9IFwiQlJcIilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGV4dFJhbmdlKG5vZGUsIGxlbiAtIDEsIGxlbikuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCA+IHg7XG59XG4vLyBDaHJvbWUgd2lsbCBtb3ZlIHBvc2l0aW9ucyBiZXR3ZWVuIGxpbmVzIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lXG5mdW5jdGlvbiBpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdChub2RlLCBvZmZzZXQsIHgpIHtcbiAgICBpZiAob2Zmc2V0ICE9IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBjdXIgPSBub2RlOzspIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQubm9kZVR5cGUgIT0gMSB8fCBwYXJlbnQuZmlyc3RDaGlsZCAhPSBjdXIpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiY20tbGluZVwiKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjdXIgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGxldCByZWN0ID0gbm9kZS5ub2RlVHlwZSA9PSAxID8gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICA6IHRleHRSYW5nZShub2RlLCAwLCBNYXRoLm1heChub2RlLm5vZGVWYWx1ZS5sZW5ndGgsIDEpKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4geCAtIHJlY3QubGVmdCA+IDU7XG59XG5mdW5jdGlvbiBibG9ja0F0KHZpZXcsIHBvcywgc2lkZSkge1xuICAgIGxldCBsaW5lID0gdmlldy5saW5lQmxvY2tBdChwb3MpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxpbmUudHlwZSkpIHtcbiAgICAgICAgbGV0IGJlc3Q7XG4gICAgICAgIGZvciAobGV0IGwgb2YgbGluZS50eXBlKSB7XG4gICAgICAgICAgICBpZiAobC5mcm9tID4gcG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKGwudG8gPCBwb3MpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAobC5mcm9tIDwgcG9zICYmIGwudG8gPiBwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGw7XG4gICAgICAgICAgICBpZiAoIWJlc3QgfHwgKGwudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCAmJiAoYmVzdC50eXBlICE9IGwudHlwZSB8fCAoc2lkZSA8IDAgPyBsLmZyb20gPCBwb3MgOiBsLnRvID4gcG9zKSkpKVxuICAgICAgICAgICAgICAgIGJlc3QgPSBsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0IHx8IGxpbmU7XG4gICAgfVxuICAgIHJldHVybiBsaW5lO1xufVxuZnVuY3Rpb24gbW92ZVRvTGluZUJvdW5kYXJ5KHZpZXcsIHN0YXJ0LCBmb3J3YXJkLCBpbmNsdWRlV3JhcCkge1xuICAgIGxldCBsaW5lID0gYmxvY2tBdCh2aWV3LCBzdGFydC5oZWFkLCBzdGFydC5hc3NvYyB8fCAtMSk7XG4gICAgbGV0IGNvb3JkcyA9ICFpbmNsdWRlV3JhcCB8fCBsaW5lLnR5cGUgIT0gQmxvY2tUeXBlLlRleHQgfHwgISh2aWV3LmxpbmVXcmFwcGluZyB8fCBsaW5lLndpZGdldExpbmVCcmVha3MpID8gbnVsbFxuICAgICAgICA6IHZpZXcuY29vcmRzQXRQb3Moc3RhcnQuYXNzb2MgPCAwICYmIHN0YXJ0LmhlYWQgPiBsaW5lLmZyb20gPyBzdGFydC5oZWFkIC0gMSA6IHN0YXJ0LmhlYWQpO1xuICAgIGlmIChjb29yZHMpIHtcbiAgICAgICAgbGV0IGVkaXRvclJlY3QgPSB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbGV0IGRpcmVjdGlvbiA9IHZpZXcudGV4dERpcmVjdGlvbkF0KGxpbmUuZnJvbSk7XG4gICAgICAgIGxldCBwb3MgPSB2aWV3LnBvc0F0Q29vcmRzKHsgeDogZm9yd2FyZCA9PSAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFIpID8gZWRpdG9yUmVjdC5yaWdodCAtIDEgOiBlZGl0b3JSZWN0LmxlZnQgKyAxLFxuICAgICAgICAgICAgeTogKGNvb3Jkcy50b3AgKyBjb29yZHMuYm90dG9tKSAvIDIgfSk7XG4gICAgICAgIGlmIChwb3MgIT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcywgZm9yd2FyZCA/IC0xIDogMSk7XG4gICAgfVxuICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKGZvcndhcmQgPyBsaW5lLnRvIDogbGluZS5mcm9tLCBmb3J3YXJkID8gLTEgOiAxKTtcbn1cbmZ1bmN0aW9uIG1vdmVCeUNoYXIodmlldywgc3RhcnQsIGZvcndhcmQsIGJ5KSB7XG4gICAgbGV0IGxpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQoc3RhcnQuaGVhZCksIHNwYW5zID0gdmlldy5iaWRpU3BhbnMobGluZSk7XG4gICAgbGV0IGRpcmVjdGlvbiA9IHZpZXcudGV4dERpcmVjdGlvbkF0KGxpbmUuZnJvbSk7XG4gICAgZm9yIChsZXQgY3VyID0gc3RhcnQsIGNoZWNrID0gbnVsbDs7KSB7XG4gICAgICAgIGxldCBuZXh0ID0gbW92ZVZpc3VhbGx5KGxpbmUsIHNwYW5zLCBkaXJlY3Rpb24sIGN1ciwgZm9yd2FyZCksIGNoYXIgPSBtb3ZlZE92ZXI7XG4gICAgICAgIGlmICghbmV4dCkge1xuICAgICAgICAgICAgaWYgKGxpbmUubnVtYmVyID09IChmb3J3YXJkID8gdmlldy5zdGF0ZS5kb2MubGluZXMgOiAxKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VyO1xuICAgICAgICAgICAgY2hhciA9IFwiXFxuXCI7XG4gICAgICAgICAgICBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZShsaW5lLm51bWJlciArIChmb3J3YXJkID8gMSA6IC0xKSk7XG4gICAgICAgICAgICBzcGFucyA9IHZpZXcuYmlkaVNwYW5zKGxpbmUpO1xuICAgICAgICAgICAgbmV4dCA9IHZpZXcudmlzdWFsTGluZVNpZGUobGluZSwgIWZvcndhcmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hlY2spIHtcbiAgICAgICAgICAgIGlmICghYnkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICBjaGVjayA9IGJ5KGNoYXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFjaGVjayhjaGFyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cjtcbiAgICAgICAgfVxuICAgICAgICBjdXIgPSBuZXh0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJ5R3JvdXAodmlldywgcG9zLCBzdGFydCkge1xuICAgIGxldCBjYXRlZ29yaXplID0gdmlldy5zdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIocG9zKTtcbiAgICBsZXQgY2F0ID0gY2F0ZWdvcml6ZShzdGFydCk7XG4gICAgcmV0dXJuIChuZXh0KSA9PiB7XG4gICAgICAgIGxldCBuZXh0Q2F0ID0gY2F0ZWdvcml6ZShuZXh0KTtcbiAgICAgICAgaWYgKGNhdCA9PSBDaGFyQ2F0ZWdvcnkuU3BhY2UpXG4gICAgICAgICAgICBjYXQgPSBuZXh0Q2F0O1xuICAgICAgICByZXR1cm4gY2F0ID09IG5leHRDYXQ7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1vdmVWZXJ0aWNhbGx5KHZpZXcsIHN0YXJ0LCBmb3J3YXJkLCBkaXN0YW5jZSkge1xuICAgIGxldCBzdGFydFBvcyA9IHN0YXJ0LmhlYWQsIGRpciA9IGZvcndhcmQgPyAxIDogLTE7XG4gICAgaWYgKHN0YXJ0UG9zID09IChmb3J3YXJkID8gdmlldy5zdGF0ZS5kb2MubGVuZ3RoIDogMCkpXG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHN0YXJ0UG9zLCBzdGFydC5hc3NvYyk7XG4gICAgbGV0IGdvYWwgPSBzdGFydC5nb2FsQ29sdW1uLCBzdGFydFk7XG4gICAgbGV0IHJlY3QgPSB2aWV3LmNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHN0YXJ0Q29vcmRzID0gdmlldy5jb29yZHNBdFBvcyhzdGFydFBvcywgc3RhcnQuYXNzb2MgfHwgLTEpLCBkb2NUb3AgPSB2aWV3LmRvY3VtZW50VG9wO1xuICAgIGlmIChzdGFydENvb3Jkcykge1xuICAgICAgICBpZiAoZ29hbCA9PSBudWxsKVxuICAgICAgICAgICAgZ29hbCA9IHN0YXJ0Q29vcmRzLmxlZnQgLSByZWN0LmxlZnQ7XG4gICAgICAgIHN0YXJ0WSA9IGRpciA8IDAgPyBzdGFydENvb3Jkcy50b3AgOiBzdGFydENvb3Jkcy5ib3R0b207XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgbGluZSA9IHZpZXcudmlld1N0YXRlLmxpbmVCbG9ja0F0KHN0YXJ0UG9zKTtcbiAgICAgICAgaWYgKGdvYWwgPT0gbnVsbClcbiAgICAgICAgICAgIGdvYWwgPSBNYXRoLm1pbihyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LCB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCAqIChzdGFydFBvcyAtIGxpbmUuZnJvbSkpO1xuICAgICAgICBzdGFydFkgPSAoZGlyIDwgMCA/IGxpbmUudG9wIDogbGluZS5ib3R0b20pICsgZG9jVG9wO1xuICAgIH1cbiAgICBsZXQgcmVzb2x2ZWRHb2FsID0gcmVjdC5sZWZ0ICsgZ29hbDtcbiAgICBsZXQgZGlzdCA9IGRpc3RhbmNlICE9PSBudWxsICYmIGRpc3RhbmNlICE9PSB2b2lkIDAgPyBkaXN0YW5jZSA6ICh2aWV3LnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUudGV4dEhlaWdodCA+PiAxKTtcbiAgICBmb3IgKGxldCBleHRyYSA9IDA7OyBleHRyYSArPSAxMCkge1xuICAgICAgICBsZXQgY3VyWSA9IHN0YXJ0WSArIChkaXN0ICsgZXh0cmEpICogZGlyO1xuICAgICAgICBsZXQgcG9zID0gcG9zQXRDb29yZHModmlldywgeyB4OiByZXNvbHZlZEdvYWwsIHk6IGN1clkgfSwgZmFsc2UsIGRpcik7XG4gICAgICAgIGlmIChjdXJZIDwgcmVjdC50b3AgfHwgY3VyWSA+IHJlY3QuYm90dG9tIHx8IChkaXIgPCAwID8gcG9zIDwgc3RhcnRQb3MgOiBwb3MgPiBzdGFydFBvcykpIHtcbiAgICAgICAgICAgIGxldCBjaGFyUmVjdCA9IHZpZXcuZG9jVmlldy5jb29yZHNGb3JDaGFyKHBvcyk7XG4gICAgICAgICAgICBsZXQgYXNzb2MgPSAhY2hhclJlY3QgfHwgY3VyWSA8IGNoYXJSZWN0LnRvcCA/IC0xIDogMTtcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcywgYXNzb2MsIHVuZGVmaW5lZCwgZ29hbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBza2lwQXRvbWljUmFuZ2VzKGF0b21zLCBwb3MsIGJpYXMpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGxldCBtb3ZlZCA9IDA7XG4gICAgICAgIGZvciAobGV0IHNldCBvZiBhdG9tcykge1xuICAgICAgICAgICAgc2V0LmJldHdlZW4ocG9zIC0gMSwgcG9zICsgMSwgKGZyb20sIHRvLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tICYmIHBvcyA8IHRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaWRlID0gbW92ZWQgfHwgYmlhcyB8fCAocG9zIC0gZnJvbSA8IHRvIC0gcG9zID8gLTEgOiAxKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gc2lkZSA8IDAgPyBmcm9tIDogdG87XG4gICAgICAgICAgICAgICAgICAgIG1vdmVkID0gc2lkZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vdmVkKVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG59XG5mdW5jdGlvbiBza2lwQXRvbXModmlldywgb2xkUG9zLCBwb3MpIHtcbiAgICBsZXQgbmV3UG9zID0gc2tpcEF0b21pY1Jhbmdlcyh2aWV3LnN0YXRlLmZhY2V0KGF0b21pY1JhbmdlcykubWFwKGYgPT4gZih2aWV3KSksIHBvcy5mcm9tLCBvbGRQb3MuaGVhZCA+IHBvcy5mcm9tID8gLTEgOiAxKTtcbiAgICByZXR1cm4gbmV3UG9zID09IHBvcy5mcm9tID8gcG9zIDogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihuZXdQb3MsIG5ld1BvcyA8IHBvcy5mcm9tID8gMSA6IC0xKTtcbn1cblxuY29uc3QgTGluZUJyZWFrUGxhY2Vob2xkZXIgPSBcIlxcdWZmZmZcIjtcbmNsYXNzIERPTVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocG9pbnRzLCBzdGF0ZSkge1xuICAgICAgICB0aGlzLnBvaW50cyA9IHBvaW50cztcbiAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5saW5lU2VwYXJhdG9yID0gc3RhdGUuZmFjZXQoRWRpdG9yU3RhdGUubGluZVNlcGFyYXRvcik7XG4gICAgfVxuICAgIGFwcGVuZCh0ZXh0KSB7XG4gICAgICAgIHRoaXMudGV4dCArPSB0ZXh0O1xuICAgIH1cbiAgICBsaW5lQnJlYWsoKSB7XG4gICAgICAgIHRoaXMudGV4dCArPSBMaW5lQnJlYWtQbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgcmVhZFJhbmdlKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKCFzdGFydClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgcGFyZW50ID0gc3RhcnQucGFyZW50Tm9kZTtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gc3RhcnQ7Oykge1xuICAgICAgICAgICAgdGhpcy5maW5kUG9pbnRCZWZvcmUocGFyZW50LCBjdXIpO1xuICAgICAgICAgICAgbGV0IG9sZExlbiA9IHRoaXMudGV4dC5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnJlYWROb2RlKGN1cik7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGN1ci5uZXh0U2libGluZztcbiAgICAgICAgICAgIGlmIChuZXh0ID09IGVuZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCB2aWV3ID0gQ29udGVudFZpZXcuZ2V0KGN1ciksIG5leHRWaWV3ID0gQ29udGVudFZpZXcuZ2V0KG5leHQpO1xuICAgICAgICAgICAgaWYgKHZpZXcgJiYgbmV4dFZpZXcgPyB2aWV3LmJyZWFrQWZ0ZXIgOlxuICAgICAgICAgICAgICAgICh2aWV3ID8gdmlldy5icmVha0FmdGVyIDogaXNCbG9ja0VsZW1lbnQoY3VyKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGlzQmxvY2tFbGVtZW50KG5leHQpICYmIChjdXIubm9kZU5hbWUgIT0gXCJCUlwiIHx8IGN1ci5jbUlnbm9yZSkgJiYgdGhpcy50ZXh0Lmxlbmd0aCA+IG9sZExlbikpXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsoKTtcbiAgICAgICAgICAgIGN1ciA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5kUG9pbnRCZWZvcmUocGFyZW50LCBlbmQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVhZFRleHROb2RlKG5vZGUpIHtcbiAgICAgICAgbGV0IHRleHQgPSBub2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgZm9yIChsZXQgcG9pbnQgb2YgdGhpcy5wb2ludHMpXG4gICAgICAgICAgICBpZiAocG9pbnQubm9kZSA9PSBub2RlKVxuICAgICAgICAgICAgICAgIHBvaW50LnBvcyA9IHRoaXMudGV4dC5sZW5ndGggKyBNYXRoLm1pbihwb2ludC5vZmZzZXQsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgb2ZmID0gMCwgcmUgPSB0aGlzLmxpbmVTZXBhcmF0b3IgPyBudWxsIDogL1xcclxcbj98XFxuL2c7Oykge1xuICAgICAgICAgICAgbGV0IG5leHRCcmVhayA9IC0xLCBicmVha1NpemUgPSAxLCBtO1xuICAgICAgICAgICAgaWYgKHRoaXMubGluZVNlcGFyYXRvcikge1xuICAgICAgICAgICAgICAgIG5leHRCcmVhayA9IHRleHQuaW5kZXhPZih0aGlzLmxpbmVTZXBhcmF0b3IsIG9mZik7XG4gICAgICAgICAgICAgICAgYnJlYWtTaXplID0gdGhpcy5saW5lU2VwYXJhdG9yLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG0gPSByZS5leGVjKHRleHQpKSB7XG4gICAgICAgICAgICAgICAgbmV4dEJyZWFrID0gbS5pbmRleDtcbiAgICAgICAgICAgICAgICBicmVha1NpemUgPSBtWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRleHQuc2xpY2Uob2ZmLCBuZXh0QnJlYWsgPCAwID8gdGV4dC5sZW5ndGggOiBuZXh0QnJlYWspKTtcbiAgICAgICAgICAgIGlmIChuZXh0QnJlYWsgPCAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsoKTtcbiAgICAgICAgICAgIGlmIChicmVha1NpemUgPiAxKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHBvaW50IG9mIHRoaXMucG9pbnRzKVxuICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnQubm9kZSA9PSBub2RlICYmIHBvaW50LnBvcyA+IHRoaXMudGV4dC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC5wb3MgLT0gYnJlYWtTaXplIC0gMTtcbiAgICAgICAgICAgIG9mZiA9IG5leHRCcmVhayArIGJyZWFrU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWFkTm9kZShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmNtSWdub3JlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChub2RlKTtcbiAgICAgICAgbGV0IGZyb21WaWV3ID0gdmlldyAmJiB2aWV3Lm92ZXJyaWRlRE9NVGV4dDtcbiAgICAgICAgaWYgKGZyb21WaWV3ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZmluZFBvaW50SW5zaWRlKG5vZGUsIGZyb21WaWV3Lmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZnJvbVZpZXcuaXRlcigpOyAhaS5uZXh0KCkuZG9uZTspIHtcbiAgICAgICAgICAgICAgICBpZiAoaS5saW5lQnJlYWspXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUJyZWFrKCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZChpLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZFRleHROb2RlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJCUlwiKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5uZXh0U2libGluZylcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVCcmVhaygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5yZWFkUmFuZ2Uobm9kZS5maXJzdENoaWxkLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5kUG9pbnRCZWZvcmUobm9kZSwgbmV4dCkge1xuICAgICAgICBmb3IgKGxldCBwb2ludCBvZiB0aGlzLnBvaW50cylcbiAgICAgICAgICAgIGlmIChwb2ludC5ub2RlID09IG5vZGUgJiYgbm9kZS5jaGlsZE5vZGVzW3BvaW50Lm9mZnNldF0gPT0gbmV4dClcbiAgICAgICAgICAgICAgICBwb2ludC5wb3MgPSB0aGlzLnRleHQubGVuZ3RoO1xuICAgIH1cbiAgICBmaW5kUG9pbnRJbnNpZGUobm9kZSwgbGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IHBvaW50IG9mIHRoaXMucG9pbnRzKVxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyA/IHBvaW50Lm5vZGUgPT0gbm9kZSA6IG5vZGUuY29udGFpbnMocG9pbnQubm9kZSkpXG4gICAgICAgICAgICAgICAgcG9pbnQucG9zID0gdGhpcy50ZXh0Lmxlbmd0aCArIChpc0F0RW5kKG5vZGUsIHBvaW50Lm5vZGUsIHBvaW50Lm9mZnNldCkgPyBsZW5ndGggOiAwKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0F0RW5kKHBhcmVudCwgbm9kZSwgb2Zmc2V0KSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoIW5vZGUgfHwgb2Zmc2V0IDwgbWF4T2Zmc2V0KG5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSkgKyAxO1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbn1cbmNsYXNzIERPTVBvaW50IHtcbiAgICBjb25zdHJ1Y3Rvcihub2RlLCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMucG9zID0gLTE7XG4gICAgfVxufVxuXG5jbGFzcyBET01DaGFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIHN0YXJ0LCBlbmQsIHR5cGVPdmVyKSB7XG4gICAgICAgIHRoaXMudHlwZU92ZXIgPSB0eXBlT3ZlcjtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBudWxsO1xuICAgICAgICB0aGlzLnRleHQgPSBcIlwiO1xuICAgICAgICB0aGlzLmRvbUNoYW5nZWQgPSBzdGFydCA+IC0xO1xuICAgICAgICBsZXQgeyBpbXByZWNpc2VIZWFkOiBpSGVhZCwgaW1wcmVjaXNlQW5jaG9yOiBpQW5jaG9yIH0gPSB2aWV3LmRvY1ZpZXc7XG4gICAgICAgIGlmICh2aWV3LnN0YXRlLnJlYWRPbmx5ICYmIHN0YXJ0ID4gLTEpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBjaGFuZ2VzIHdoZW4gdGhlIGVkaXRvciBpcyByZWFkLW9ubHlcbiAgICAgICAgICAgIHRoaXMubmV3U2VsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGFydCA+IC0xICYmICh0aGlzLmJvdW5kcyA9IHZpZXcuZG9jVmlldy5kb21Cb3VuZHNBcm91bmQoc3RhcnQsIGVuZCwgMCkpKSB7XG4gICAgICAgICAgICBsZXQgc2VsUG9pbnRzID0gaUhlYWQgfHwgaUFuY2hvciA/IFtdIDogc2VsZWN0aW9uUG9pbnRzKHZpZXcpO1xuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBET01SZWFkZXIoc2VsUG9pbnRzLCB2aWV3LnN0YXRlKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkUmFuZ2UodGhpcy5ib3VuZHMuc3RhcnRET00sIHRoaXMuYm91bmRzLmVuZERPTSk7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSByZWFkZXIudGV4dDtcbiAgICAgICAgICAgIHRoaXMubmV3U2VsID0gc2VsZWN0aW9uRnJvbVBvaW50cyhzZWxQb2ludHMsIHRoaXMuYm91bmRzLmZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRvbVNlbCA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgICAgICBsZXQgaGVhZCA9IGlIZWFkICYmIGlIZWFkLm5vZGUgPT0gZG9tU2VsLmZvY3VzTm9kZSAmJiBpSGVhZC5vZmZzZXQgPT0gZG9tU2VsLmZvY3VzT2Zmc2V0IHx8XG4gICAgICAgICAgICAgICAgIWNvbnRhaW5zKHZpZXcuY29udGVudERPTSwgZG9tU2VsLmZvY3VzTm9kZSlcbiAgICAgICAgICAgICAgICA/IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZFxuICAgICAgICAgICAgICAgIDogdmlldy5kb2NWaWV3LnBvc0Zyb21ET00oZG9tU2VsLmZvY3VzTm9kZSwgZG9tU2VsLmZvY3VzT2Zmc2V0KTtcbiAgICAgICAgICAgIGxldCBhbmNob3IgPSBpQW5jaG9yICYmIGlBbmNob3Iubm9kZSA9PSBkb21TZWwuYW5jaG9yTm9kZSAmJiBpQW5jaG9yLm9mZnNldCA9PSBkb21TZWwuYW5jaG9yT2Zmc2V0IHx8XG4gICAgICAgICAgICAgICAgIWNvbnRhaW5zKHZpZXcuY29udGVudERPTSwgZG9tU2VsLmFuY2hvck5vZGUpXG4gICAgICAgICAgICAgICAgPyB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmFuY2hvclxuICAgICAgICAgICAgICAgIDogdmlldy5kb2NWaWV3LnBvc0Zyb21ET00oZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpO1xuICAgICAgICAgICAgLy8gaU9TIHdpbGwgcmVmdXNlIHRvIHNlbGVjdCB0aGUgYmxvY2sgZ2FwcyB3aGVuIGRvaW5nXG4gICAgICAgICAgICAvLyBzZWxlY3QtYWxsLlxuICAgICAgICAgICAgLy8gQ2hyb21lIHdpbGwgcHV0IHRoZSBzZWxlY3Rpb24gKmluc2lkZSogdGhlbSwgY29uZnVzaW5nXG4gICAgICAgICAgICAvLyBwb3NGcm9tRE9NXG4gICAgICAgICAgICBsZXQgdnAgPSB2aWV3LnZpZXdwb3J0O1xuICAgICAgICAgICAgaWYgKChicm93c2VyLmlvcyB8fCBicm93c2VyLmNocm9tZSkgJiYgdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5lbXB0eSAmJiBoZWFkICE9IGFuY2hvciAmJlxuICAgICAgICAgICAgICAgICh2cC5mcm9tID4gMCB8fCB2cC50byA8IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWluKGhlYWQsIGFuY2hvciksIHRvID0gTWF0aC5tYXgoaGVhZCwgYW5jaG9yKTtcbiAgICAgICAgICAgICAgICBsZXQgb2ZmRnJvbSA9IHZwLmZyb20gLSBmcm9tLCBvZmZUbyA9IHZwLnRvIC0gdG87XG4gICAgICAgICAgICAgICAgaWYgKChvZmZGcm9tID09IDAgfHwgb2ZmRnJvbSA9PSAxIHx8IGZyb20gPT0gMCkgJiYgKG9mZlRvID09IDAgfHwgb2ZmVG8gPT0gLTEgfHwgdG8gPT0gdmlldy5zdGF0ZS5kb2MubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICBoZWFkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gdmlldy5zdGF0ZS5kb2MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3U2VsID0gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZShhbmNob3IsIGhlYWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwbHlET01DaGFuZ2UodmlldywgZG9tQ2hhbmdlKSB7XG4gICAgbGV0IGNoYW5nZTtcbiAgICBsZXQgeyBuZXdTZWwgfSA9IGRvbUNoYW5nZSwgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICBsZXQgbGFzdEtleSA9IHZpZXcuaW5wdXRTdGF0ZS5sYXN0S2V5VGltZSA+IERhdGUubm93KCkgLSAxMDAgPyB2aWV3LmlucHV0U3RhdGUubGFzdEtleUNvZGUgOiAtMTtcbiAgICBpZiAoZG9tQ2hhbmdlLmJvdW5kcykge1xuICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gZG9tQ2hhbmdlLmJvdW5kcztcbiAgICAgICAgbGV0IHByZWZlcnJlZFBvcyA9IHNlbC5mcm9tLCBwcmVmZXJyZWRTaWRlID0gbnVsbDtcbiAgICAgICAgLy8gUHJlZmVyIGFuY2hvcmluZyB0byBlbmQgd2hlbiBCYWNrc3BhY2UgaXMgcHJlc3NlZCAob3IsIG9uXG4gICAgICAgIC8vIEFuZHJvaWQsIHdoZW4gc29tZXRoaW5nIHdhcyBkZWxldGVkKVxuICAgICAgICBpZiAobGFzdEtleSA9PT0gOCB8fCBicm93c2VyLmFuZHJvaWQgJiYgZG9tQ2hhbmdlLnRleHQubGVuZ3RoIDwgdG8gLSBmcm9tKSB7XG4gICAgICAgICAgICBwcmVmZXJyZWRQb3MgPSBzZWwudG87XG4gICAgICAgICAgICBwcmVmZXJyZWRTaWRlID0gXCJlbmRcIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGlmZiA9IGZpbmREaWZmKHZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvLCBMaW5lQnJlYWtQbGFjZWhvbGRlciksIGRvbUNoYW5nZS50ZXh0LCBwcmVmZXJyZWRQb3MgLSBmcm9tLCBwcmVmZXJyZWRTaWRlKTtcbiAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgIC8vIENocm9tZSBpbnNlcnRzIHR3byBuZXdsaW5lcyB3aGVuIHByZXNzaW5nIHNoaWZ0LWVudGVyIGF0IHRoZVxuICAgICAgICAgICAgLy8gZW5kIG9mIGEgbGluZS4gRG9tQ2hhbmdlIGRyb3BzIG9uZSBvZiB0aG9zZS5cbiAgICAgICAgICAgIGlmIChicm93c2VyLmNocm9tZSAmJiBsYXN0S2V5ID09IDEzICYmXG4gICAgICAgICAgICAgICAgZGlmZi50b0IgPT0gZGlmZi5mcm9tICsgMiAmJiBkb21DaGFuZ2UudGV4dC5zbGljZShkaWZmLmZyb20sIGRpZmYudG9CKSA9PSBMaW5lQnJlYWtQbGFjZWhvbGRlciArIExpbmVCcmVha1BsYWNlaG9sZGVyKVxuICAgICAgICAgICAgICAgIGRpZmYudG9CLS07XG4gICAgICAgICAgICBjaGFuZ2UgPSB7IGZyb206IGZyb20gKyBkaWZmLmZyb20sIHRvOiBmcm9tICsgZGlmZi50b0EsXG4gICAgICAgICAgICAgICAgaW5zZXJ0OiBUZXh0Lm9mKGRvbUNoYW5nZS50ZXh0LnNsaWNlKGRpZmYuZnJvbSwgZGlmZi50b0IpLnNwbGl0KExpbmVCcmVha1BsYWNlaG9sZGVyKSkgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChuZXdTZWwgJiYgKCF2aWV3Lmhhc0ZvY3VzICYmIHZpZXcuc3RhdGUuZmFjZXQoZWRpdGFibGUpIHx8IG5ld1NlbC5tYWluLmVxKHNlbCkpKSB7XG4gICAgICAgIG5ld1NlbCA9IG51bGw7XG4gICAgfVxuICAgIGlmICghY2hhbmdlICYmICFuZXdTZWwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWNoYW5nZSAmJiBkb21DaGFuZ2UudHlwZU92ZXIgJiYgIXNlbC5lbXB0eSAmJiBuZXdTZWwgJiYgbmV3U2VsLm1haW4uZW1wdHkpIHtcbiAgICAgICAgLy8gSGV1cmlzdGljIHRvIG5vdGljZSB0eXBpbmcgb3ZlciBhIHNlbGVjdGVkIGNoYXJhY3RlclxuICAgICAgICBjaGFuZ2UgPSB7IGZyb206IHNlbC5mcm9tLCB0bzogc2VsLnRvLCBpbnNlcnQ6IHZpZXcuc3RhdGUuZG9jLnNsaWNlKHNlbC5mcm9tLCBzZWwudG8pIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKChicm93c2VyLm1hYyB8fCBicm93c2VyLmFuZHJvaWQpICYmIGNoYW5nZSAmJiBjaGFuZ2UuZnJvbSA9PSBjaGFuZ2UudG8gJiYgY2hhbmdlLmZyb20gPT0gc2VsLmhlYWQgLSAxICYmXG4gICAgICAgIC9eXFwuID8kLy50ZXN0KGNoYW5nZS5pbnNlcnQudG9TdHJpbmcoKSkgJiYgdmlldy5jb250ZW50RE9NLmdldEF0dHJpYnV0ZShcImF1dG9jb3JyZWN0XCIpID09IFwib2ZmXCIpIHtcbiAgICAgICAgLy8gRGV0ZWN0IGluc2VydC1wZXJpb2Qtb24tZG91YmxlLXNwYWNlIE1hYyBhbmQgQW5kcm9pZCBiZWhhdmlvcixcbiAgICAgICAgLy8gYW5kIHRyYW5zZm9ybSBpdCBpbnRvIGEgcmVndWxhciBzcGFjZSBpbnNlcnQuXG4gICAgICAgIGlmIChuZXdTZWwgJiYgY2hhbmdlLmluc2VydC5sZW5ndGggPT0gMilcbiAgICAgICAgICAgIG5ld1NlbCA9IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUobmV3U2VsLm1haW4uYW5jaG9yIC0gMSwgbmV3U2VsLm1haW4uaGVhZCAtIDEpO1xuICAgICAgICBjaGFuZ2UgPSB7IGZyb206IGNoYW5nZS5mcm9tLCB0bzogY2hhbmdlLnRvLCBpbnNlcnQ6IFRleHQub2YoW2NoYW5nZS5pbnNlcnQudG9TdHJpbmcoKS5yZXBsYWNlKFwiLlwiLCBcIiBcIildKSB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChjaGFuZ2UgJiYgY2hhbmdlLmZyb20gPj0gc2VsLmZyb20gJiYgY2hhbmdlLnRvIDw9IHNlbC50byAmJlxuICAgICAgICAoY2hhbmdlLmZyb20gIT0gc2VsLmZyb20gfHwgY2hhbmdlLnRvICE9IHNlbC50bykgJiZcbiAgICAgICAgKHNlbC50byAtIHNlbC5mcm9tKSAtIChjaGFuZ2UudG8gLSBjaGFuZ2UuZnJvbSkgPD0gNCkge1xuICAgICAgICAvLyBJZiB0aGUgY2hhbmdlIGlzIGluc2lkZSB0aGUgc2VsZWN0aW9uIGFuZCBjb3ZlcnMgbW9zdCBvZiBpdCxcbiAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGEgc2VsZWN0aW9uIHJlcGxhY2UgKHdpdGggaWRlbnRpY2FsIGNoYXJhY3RlcnMgYXRcbiAgICAgICAgLy8gdGhlIHN0YXJ0L2VuZCBub3QgaW5jbHVkZWQgaW4gdGhlIGRpZmYpXG4gICAgICAgIGNoYW5nZSA9IHtcbiAgICAgICAgICAgIGZyb206IHNlbC5mcm9tLCB0bzogc2VsLnRvLFxuICAgICAgICAgICAgaW5zZXJ0OiB2aWV3LnN0YXRlLmRvYy5zbGljZShzZWwuZnJvbSwgY2hhbmdlLmZyb20pLmFwcGVuZChjaGFuZ2UuaW5zZXJ0KS5hcHBlbmQodmlldy5zdGF0ZS5kb2Muc2xpY2UoY2hhbmdlLnRvLCBzZWwudG8pKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChicm93c2VyLmNocm9tZSAmJiBjaGFuZ2UgJiYgY2hhbmdlLmZyb20gPT0gY2hhbmdlLnRvICYmIGNoYW5nZS5mcm9tID09IHNlbC5oZWFkICYmXG4gICAgICAgIGNoYW5nZS5pbnNlcnQudG9TdHJpbmcoKSA9PSBcIlxcbiBcIiAmJiB2aWV3LmxpbmVXcmFwcGluZykge1xuICAgICAgICAvLyBJbiBDaHJvbWUsIGlmIHlvdSBpbnNlcnQgYSBzcGFjZSBhdCB0aGUgc3RhcnQgb2YgYSB3cmFwcGVkXG4gICAgICAgIC8vIGxpbmUsIGl0IHdpbGwgYWN0dWFsbHkgaW5zZXJ0IGEgbmV3bGluZSBhbmQgYSBzcGFjZSwgY2F1c2luZyBhXG4gICAgICAgIC8vIGJvZ3VzIG5ldyBsaW5lIHRvIGJlIGNyZWF0ZWQgaW4gQ29kZU1pcnJvciAoIzk2OClcbiAgICAgICAgaWYgKG5ld1NlbClcbiAgICAgICAgICAgIG5ld1NlbCA9IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUobmV3U2VsLm1haW4uYW5jaG9yIC0gMSwgbmV3U2VsLm1haW4uaGVhZCAtIDEpO1xuICAgICAgICBjaGFuZ2UgPSB7IGZyb206IHNlbC5mcm9tLCB0bzogc2VsLnRvLCBpbnNlcnQ6IFRleHQub2YoW1wiIFwiXSkgfTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZSkge1xuICAgICAgICByZXR1cm4gYXBwbHlET01DaGFuZ2VJbm5lcih2aWV3LCBjaGFuZ2UsIG5ld1NlbCwgbGFzdEtleSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5ld1NlbCAmJiAhbmV3U2VsLm1haW4uZXEoc2VsKSkge1xuICAgICAgICBsZXQgc2Nyb2xsSW50b1ZpZXcgPSBmYWxzZSwgdXNlckV2ZW50ID0gXCJzZWxlY3RcIjtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2VsZWN0aW9uVGltZSA+IERhdGUubm93KCkgLSA1MCkge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2VsZWN0aW9uT3JpZ2luID09IFwic2VsZWN0XCIpXG4gICAgICAgICAgICAgICAgc2Nyb2xsSW50b1ZpZXcgPSB0cnVlO1xuICAgICAgICAgICAgdXNlckV2ZW50ID0gdmlldy5pbnB1dFN0YXRlLmxhc3RTZWxlY3Rpb25PcmlnaW47XG4gICAgICAgIH1cbiAgICAgICAgdmlldy5kaXNwYXRjaCh7IHNlbGVjdGlvbjogbmV3U2VsLCBzY3JvbGxJbnRvVmlldywgdXNlckV2ZW50IH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBhcHBseURPTUNoYW5nZUlubmVyKHZpZXcsIGNoYW5nZSwgbmV3U2VsLCBsYXN0S2V5ID0gLTEpIHtcbiAgICBpZiAoYnJvd3Nlci5pb3MgJiYgdmlldy5pbnB1dFN0YXRlLmZsdXNoSU9TS2V5KGNoYW5nZSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgIC8vIEFuZHJvaWQgYnJvd3NlcnMgZG9uJ3QgZmlyZSByZWFzb25hYmxlIGtleSBldmVudHMgZm9yIGVudGVyLFxuICAgIC8vIGJhY2tzcGFjZSwgb3IgZGVsZXRlLiBTbyB0aGlzIGRldGVjdHMgY2hhbmdlcyB0aGF0IGxvb2sgbGlrZVxuICAgIC8vIHRoZXkncmUgY2F1c2VkIGJ5IHRob3NlIGtleXMsIGFuZCByZWludGVycHJldHMgdGhlbSBhcyBrZXlcbiAgICAvLyBldmVudHMuIChTb21lIG9mIHRoZXNlIGtleXMgYXJlIGFsc28gaGFuZGxlZCBieSBiZWZvcmVpbnB1dFxuICAgIC8vIGV2ZW50cyBhbmQgdGhlIHBlbmRpbmdBbmRyb2lkS2V5IG1lY2hhbmlzbSwgYnV0IHRoYXQncyBub3RcbiAgICAvLyByZWxpYWJsZSBpbiBhbGwgc2l0dWF0aW9ucy4pXG4gICAgaWYgKGJyb3dzZXIuYW5kcm9pZCAmJlxuICAgICAgICAoKGNoYW5nZS50byA9PSBzZWwudG8gJiZcbiAgICAgICAgICAgIC8vIEdCb2FyZCB3aWxsIHNvbWV0aW1lcyByZW1vdmUgYSBzcGFjZSBpdCBqdXN0IGluc2VydGVkXG4gICAgICAgICAgICAvLyBhZnRlciBhIGNvbXBsZXRpb24gd2hlbiB5b3UgcHJlc3MgZW50ZXJcbiAgICAgICAgICAgIChjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSB8fCBjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAtIDEgJiYgdmlldy5zdGF0ZS5zbGljZURvYyhjaGFuZ2UuZnJvbSwgc2VsLmZyb20pID09IFwiIFwiKSAmJlxuICAgICAgICAgICAgY2hhbmdlLmluc2VydC5sZW5ndGggPT0gMSAmJiBjaGFuZ2UuaW5zZXJ0LmxpbmVzID09IDIgJiZcbiAgICAgICAgICAgIGRpc3BhdGNoS2V5KHZpZXcuY29udGVudERPTSwgXCJFbnRlclwiLCAxMykpIHx8XG4gICAgICAgICAgICAoKGNoYW5nZS5mcm9tID09IHNlbC5mcm9tIC0gMSAmJiBjaGFuZ2UudG8gPT0gc2VsLnRvICYmIGNoYW5nZS5pbnNlcnQubGVuZ3RoID09IDAgfHxcbiAgICAgICAgICAgICAgICBsYXN0S2V5ID09IDggJiYgY2hhbmdlLmluc2VydC5sZW5ndGggPCBjaGFuZ2UudG8gLSBjaGFuZ2UuZnJvbSAmJiBjaGFuZ2UudG8gPiBzZWwuaGVhZCkgJiZcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh2aWV3LmNvbnRlbnRET00sIFwiQmFja3NwYWNlXCIsIDgpKSB8fFxuICAgICAgICAgICAgKGNoYW5nZS5mcm9tID09IHNlbC5mcm9tICYmIGNoYW5nZS50byA9PSBzZWwudG8gKyAxICYmIGNoYW5nZS5pbnNlcnQubGVuZ3RoID09IDAgJiZcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh2aWV3LmNvbnRlbnRET00sIFwiRGVsZXRlXCIsIDQ2KSkpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgdGV4dCA9IGNoYW5nZS5pbnNlcnQudG9TdHJpbmcoKTtcbiAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwKVxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nKys7XG4gICAgbGV0IGRlZmF1bHRUcjtcbiAgICBsZXQgZGVmYXVsdEluc2VydCA9ICgpID0+IGRlZmF1bHRUciB8fCAoZGVmYXVsdFRyID0gYXBwbHlEZWZhdWx0SW5zZXJ0KHZpZXcsIGNoYW5nZSwgbmV3U2VsKSk7XG4gICAgaWYgKCF2aWV3LnN0YXRlLmZhY2V0KGlucHV0SGFuZGxlcikuc29tZShoID0+IGgodmlldywgY2hhbmdlLmZyb20sIGNoYW5nZS50bywgdGV4dCwgZGVmYXVsdEluc2VydCkpKVxuICAgICAgICB2aWV3LmRpc3BhdGNoKGRlZmF1bHRJbnNlcnQoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBhcHBseURlZmF1bHRJbnNlcnQodmlldywgY2hhbmdlLCBuZXdTZWwpIHtcbiAgICBsZXQgdHIsIHN0YXJ0U3RhdGUgPSB2aWV3LnN0YXRlLCBzZWwgPSBzdGFydFN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgIGlmIChjaGFuZ2UuZnJvbSA+PSBzZWwuZnJvbSAmJiBjaGFuZ2UudG8gPD0gc2VsLnRvICYmIGNoYW5nZS50byAtIGNoYW5nZS5mcm9tID49IChzZWwudG8gLSBzZWwuZnJvbSkgLyAzICYmXG4gICAgICAgICghbmV3U2VsIHx8IG5ld1NlbC5tYWluLmVtcHR5ICYmIG5ld1NlbC5tYWluLmZyb20gPT0gY2hhbmdlLmZyb20gKyBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCkgJiZcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA8IDApIHtcbiAgICAgICAgbGV0IGJlZm9yZSA9IHNlbC5mcm9tIDwgY2hhbmdlLmZyb20gPyBzdGFydFN0YXRlLnNsaWNlRG9jKHNlbC5mcm9tLCBjaGFuZ2UuZnJvbSkgOiBcIlwiO1xuICAgICAgICBsZXQgYWZ0ZXIgPSBzZWwudG8gPiBjaGFuZ2UudG8gPyBzdGFydFN0YXRlLnNsaWNlRG9jKGNoYW5nZS50bywgc2VsLnRvKSA6IFwiXCI7XG4gICAgICAgIHRyID0gc3RhcnRTdGF0ZS5yZXBsYWNlU2VsZWN0aW9uKHZpZXcuc3RhdGUudG9UZXh0KGJlZm9yZSArIGNoYW5nZS5pbnNlcnQuc2xpY2VTdHJpbmcoMCwgdW5kZWZpbmVkLCB2aWV3LnN0YXRlLmxpbmVCcmVhaykgKyBhZnRlcikpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNoYW5nZXMgPSBzdGFydFN0YXRlLmNoYW5nZXMoY2hhbmdlKTtcbiAgICAgICAgbGV0IG1haW5TZWwgPSBuZXdTZWwgJiYgbmV3U2VsLm1haW4udG8gPD0gY2hhbmdlcy5uZXdMZW5ndGggPyBuZXdTZWwubWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gVHJ5IHRvIGFwcGx5IGEgY29tcG9zaXRpb24gY2hhbmdlIHRvIGFsbCBjdXJzb3JzXG4gICAgICAgIGlmIChzdGFydFN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoID4gMSAmJiB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDAgJiZcbiAgICAgICAgICAgIGNoYW5nZS50byA8PSBzZWwudG8gJiYgY2hhbmdlLnRvID49IHNlbC50byAtIDEwKSB7XG4gICAgICAgICAgICBsZXQgcmVwbGFjZWQgPSB2aWV3LnN0YXRlLnNsaWNlRG9jKGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pO1xuICAgICAgICAgICAgbGV0IGNvbXBvc2l0aW9uUmFuZ2UsIGNvbXBvc2l0aW9uID0gbmV3U2VsICYmIGZpbmRDb21wb3NpdGlvbk5vZGUodmlldywgbmV3U2VsLm1haW4uaGVhZCk7XG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBsZXQgZExlbiA9IGNoYW5nZS5pbnNlcnQubGVuZ3RoIC0gKGNoYW5nZS50byAtIGNoYW5nZS5mcm9tKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvblJhbmdlID0geyBmcm9tOiBjb21wb3NpdGlvbi5mcm9tLCB0bzogY29tcG9zaXRpb24udG8gLSBkTGVuIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvblJhbmdlID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHNlbC5oZWFkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSBzZWwudG8gLSBjaGFuZ2UudG8sIHNpemUgPSBzZWwudG8gLSBzZWwuZnJvbTtcbiAgICAgICAgICAgIHRyID0gc3RhcnRTdGF0ZS5jaGFuZ2VCeVJhbmdlKHJhbmdlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAmJiByYW5nZS50byA9PSBzZWwudG8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGNoYW5nZXMsIHJhbmdlOiBtYWluU2VsIHx8IHJhbmdlLm1hcChjaGFuZ2VzKSB9O1xuICAgICAgICAgICAgICAgIGxldCB0byA9IHJhbmdlLnRvIC0gb2Zmc2V0LCBmcm9tID0gdG8gLSByZXBsYWNlZC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLnRvIC0gcmFuZ2UuZnJvbSAhPSBzaXplIHx8IHZpZXcuc3RhdGUuc2xpY2VEb2MoZnJvbSwgdG8pICE9IHJlcGxhY2VkIHx8XG4gICAgICAgICAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZXJlJ3Mgbm8gd2F5IHRvIG1ha2UgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBpbiB0aGUgc2FtZSBub2RlIHdvcmsgd2l0aG91dCBhYm9ydGluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBjb21wb3NpdGlvbiwgc28gY3Vyc29ycyBpbiB0aGUgY29tcG9zaXRpb24gcmFuZ2UgYXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQuXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnRvID49IGNvbXBvc2l0aW9uUmFuZ2UuZnJvbSAmJiByYW5nZS5mcm9tIDw9IGNvbXBvc2l0aW9uUmFuZ2UudG8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJhbmdlIH07XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlQ2hhbmdlcyA9IHN0YXJ0U3RhdGUuY2hhbmdlcyh7IGZyb20sIHRvLCBpbnNlcnQ6IGNoYW5nZS5pbnNlcnQgfSksIHNlbE9mZiA9IHJhbmdlLnRvIC0gc2VsLnRvO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXM6IHJhbmdlQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6ICFtYWluU2VsID8gcmFuZ2UubWFwKHJhbmdlQ2hhbmdlcykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yU2VsZWN0aW9uLnJhbmdlKE1hdGgubWF4KDAsIG1haW5TZWwuYW5jaG9yICsgc2VsT2ZmKSwgTWF0aC5tYXgoMCwgbWFpblNlbC5oZWFkICsgc2VsT2ZmKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ciA9IHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogbWFpblNlbCAmJiBzdGFydFN0YXRlLnNlbGVjdGlvbi5yZXBsYWNlUmFuZ2UobWFpblNlbClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHVzZXJFdmVudCA9IFwiaW5wdXQudHlwZVwiO1xuICAgIGlmICh2aWV3LmNvbXBvc2luZyB8fFxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlICYmIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkVuZGVkQXQgPiBEYXRlLm5vdygpIC0gNTApIHtcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSA9IGZhbHNlO1xuICAgICAgICB1c2VyRXZlbnQgKz0gXCIuY29tcG9zZVwiO1xuICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHVzZXJFdmVudCArPSBcIi5zdGFydFwiO1xuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnRTdGF0ZS51cGRhdGUodHIsIHsgdXNlckV2ZW50LCBzY3JvbGxJbnRvVmlldzogdHJ1ZSB9KTtcbn1cbmZ1bmN0aW9uIGZpbmREaWZmKGEsIGIsIHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZSkge1xuICAgIGxldCBtaW5MZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICAgIGxldCBmcm9tID0gMDtcbiAgICB3aGlsZSAoZnJvbSA8IG1pbkxlbiAmJiBhLmNoYXJDb2RlQXQoZnJvbSkgPT0gYi5jaGFyQ29kZUF0KGZyb20pKVxuICAgICAgICBmcm9tKys7XG4gICAgaWYgKGZyb20gPT0gbWluTGVuICYmIGEubGVuZ3RoID09IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgdG9BID0gYS5sZW5ndGgsIHRvQiA9IGIubGVuZ3RoO1xuICAgIHdoaWxlICh0b0EgPiAwICYmIHRvQiA+IDAgJiYgYS5jaGFyQ29kZUF0KHRvQSAtIDEpID09IGIuY2hhckNvZGVBdCh0b0IgLSAxKSkge1xuICAgICAgICB0b0EtLTtcbiAgICAgICAgdG9CLS07XG4gICAgfVxuICAgIGlmIChwcmVmZXJyZWRTaWRlID09IFwiZW5kXCIpIHtcbiAgICAgICAgbGV0IGFkanVzdCA9IE1hdGgubWF4KDAsIGZyb20gLSBNYXRoLm1pbih0b0EsIHRvQikpO1xuICAgICAgICBwcmVmZXJyZWRQb3MgLT0gdG9BICsgYWRqdXN0IC0gZnJvbTtcbiAgICB9XG4gICAgaWYgKHRvQSA8IGZyb20gJiYgYS5sZW5ndGggPCBiLmxlbmd0aCkge1xuICAgICAgICBsZXQgbW92ZSA9IHByZWZlcnJlZFBvcyA8PSBmcm9tICYmIHByZWZlcnJlZFBvcyA+PSB0b0EgPyBmcm9tIC0gcHJlZmVycmVkUG9zIDogMDtcbiAgICAgICAgZnJvbSAtPSBtb3ZlO1xuICAgICAgICB0b0IgPSBmcm9tICsgKHRvQiAtIHRvQSk7XG4gICAgICAgIHRvQSA9IGZyb207XG4gICAgfVxuICAgIGVsc2UgaWYgKHRvQiA8IGZyb20pIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gZnJvbSAmJiBwcmVmZXJyZWRQb3MgPj0gdG9CID8gZnJvbSAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIGZyb20gLT0gbW92ZTtcbiAgICAgICAgdG9BID0gZnJvbSArICh0b0EgLSB0b0IpO1xuICAgICAgICB0b0IgPSBmcm9tO1xuICAgIH1cbiAgICByZXR1cm4geyBmcm9tLCB0b0EsIHRvQiB9O1xufVxuZnVuY3Rpb24gc2VsZWN0aW9uUG9pbnRzKHZpZXcpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgaWYgKHZpZXcucm9vdC5hY3RpdmVFbGVtZW50ICE9IHZpZXcuY29udGVudERPTSlcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICBsZXQgeyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfSA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgaWYgKGFuY2hvck5vZGUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IERPTVBvaW50KGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCkpO1xuICAgICAgICBpZiAoZm9jdXNOb2RlICE9IGFuY2hvck5vZGUgfHwgZm9jdXNPZmZzZXQgIT0gYW5jaG9yT2Zmc2V0KVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IERPTVBvaW50KGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvbkZyb21Qb2ludHMocG9pbnRzLCBiYXNlKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGFuY2hvciA9IHBvaW50c1swXS5wb3MsIGhlYWQgPSBwb2ludHMubGVuZ3RoID09IDIgPyBwb2ludHNbMV0ucG9zIDogYW5jaG9yO1xuICAgIHJldHVybiBhbmNob3IgPiAtMSAmJiBoZWFkID4gLTEgPyBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKGFuY2hvciArIGJhc2UsIGhlYWQgKyBiYXNlKSA6IG51bGw7XG59XG5cbmNsYXNzIElucHV0U3RhdGUge1xuICAgIHNldFNlbGVjdGlvbk9yaWdpbihvcmlnaW4pIHtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uT3JpZ2luID0gb3JpZ2luO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25UaW1lID0gRGF0ZS5ub3coKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmxhc3RLZXlDb2RlID0gMDtcbiAgICAgICAgdGhpcy5sYXN0S2V5VGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdFRvdWNoVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdEZvY3VzVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdFNjcm9sbFRvcCA9IDA7XG4gICAgICAgIHRoaXMubGFzdFNjcm9sbExlZnQgPSAwO1xuICAgICAgICAvLyBPbiBpT1MsIHNvbWUga2V5cyBuZWVkIHRvIGhhdmUgdGhlaXIgZGVmYXVsdCBiZWhhdmlvciBoYXBwZW5cbiAgICAgICAgLy8gKGFmdGVyIHdoaWNoIHdlIHJldHJvYWN0aXZlbHkgaGFuZGxlIHRoZW0gYW5kIHJlc2V0IHRoZSBET00pIHRvXG4gICAgICAgIC8vIGF2b2lkIG1lc3NpbmcgdXAgdGhlIHZpcnR1YWwga2V5Ym9hcmQgc3RhdGUuXG4gICAgICAgIHRoaXMucGVuZGluZ0lPU0tleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgIFdoZW4gZW5hYmxlZCAoPi0xKSwgdGFiIHByZXNzZXMgYXJlIG5vdCBnaXZlbiB0byBrZXkgaGFuZGxlcnMsXG4gICAgICAgIGxlYXZpbmcgdGhlIGJyb3dzZXIncyBkZWZhdWx0IGJlaGF2aW9yLiBJZiA+MCwgdGhlIG1vZGUgZXhwaXJlc1xuICAgICAgICBhdCB0aGF0IHRpbWVzdGFtcCwgYW5kIGFueSBvdGhlciBrZXlwcmVzcyBjbGVhcnMgaXQuXG4gICAgICAgIEVzYyBlbmFibGVzIHRlbXBvcmFyeSB0YWIgZm9jdXMgbW9kZSBmb3IgdHdvIHNlY29uZHMgd2hlbiBub3RcbiAgICAgICAgb3RoZXJ3aXNlIGhhbmRsZWQuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMudGFiRm9jdXNNb2RlID0gLTE7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvbk9yaWdpbiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvblRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RDb250ZXh0TWVudSA9IDA7XG4gICAgICAgIHRoaXMuc2Nyb2xsSGFuZGxlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIC0xIG1lYW5zIG5vdCBpbiBhIGNvbXBvc2l0aW9uLiBPdGhlcndpc2UsIHRoaXMgY291bnRzIHRoZSBudW1iZXJcbiAgICAgICAgLy8gb2YgY2hhbmdlcyBtYWRlIGR1cmluZyB0aGUgY29tcG9zaXRpb24uIFRoZSBjb3VudCBpcyB1c2VkIHRvXG4gICAgICAgIC8vIGF2b2lkIHRyZWF0aW5nIHRoZSBzdGFydCBzdGF0ZSBvZiB0aGUgY29tcG9zaXRpb24sIGJlZm9yZSBhbnlcbiAgICAgICAgLy8gY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSwgYXMgcGFydCBvZiB0aGUgY29tcG9zaXRpb24uXG4gICAgICAgIHRoaXMuY29tcG9zaW5nID0gLTE7XG4gICAgICAgIC8vIFRyYWNrcyB3aGV0aGVyIHRoZSBuZXh0IGNoYW5nZSBzaG91bGQgYmUgbWFya2VkIGFzIHN0YXJ0aW5nIHRoZVxuICAgICAgICAvLyBjb21wb3NpdGlvbiAobnVsbCBtZWFucyBubyBjb21wb3NpdGlvbiwgdHJ1ZSBtZWFucyBuZXh0IGlzIHRoZVxuICAgICAgICAvLyBmaXJzdCwgZmFsc2UgbWVhbnMgZmlyc3QgaGFzIGFscmVhZHkgYmVlbiBtYXJrZWQgZm9yIHRoaXNcbiAgICAgICAgLy8gY29tcG9zaXRpb24pXG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IG51bGw7XG4gICAgICAgIC8vIEVuZCB0aW1lIG9mIHRoZSBwcmV2aW91cyBjb21wb3NpdGlvblxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uRW5kZWRBdCA9IDA7XG4gICAgICAgIC8vIFVzZWQgaW4gYSBrbHVkZ2UgdG8gZGV0ZWN0IHdoZW4gYW4gRW50ZXIga2V5cHJlc3Mgc2hvdWxkIGJlXG4gICAgICAgIC8vIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgY29tcG9zaXRpb24gb24gU2FmYXJpLCB3aGljaCBmaXJlcyBldmVudHNcbiAgICAgICAgLy8gaW4gdGhlIHdyb25nIG9yZGVyXG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25QZW5kaW5nS2V5ID0gZmFsc2U7XG4gICAgICAgIC8vIFVzZWQgdG8gY2F0ZWdvcml6ZSBjaGFuZ2VzIGFzIHBhcnQgb2YgYSBjb21wb3NpdGlvbiwgZXZlbiB3aGVuXG4gICAgICAgIC8vIHRoZSBtdXRhdGlvbiBldmVudHMgZmlyZSBzaG9ydGx5IGFmdGVyIHRoZSBjb21wb3NpdGlvbmVuZCBldmVudFxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vdXNlU2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgLy8gV2hlbiBhIGRyYWcgZnJvbSB0aGUgZWRpdG9yIGlzIGFjdGl2ZSwgdGhpcyBwb2ludHMgYXQgdGhlIHJhbmdlXG4gICAgICAgIC8vIGJlaW5nIGRyYWdnZWQuXG4gICAgICAgIHRoaXMuZHJhZ2dlZENvbnRlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmhhbmRsZUV2ZW50ID0gdGhpcy5oYW5kbGVFdmVudC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm5vdGlmaWVkRm9jdXNlZCA9IHZpZXcuaGFzRm9jdXM7XG4gICAgICAgIC8vIE9uIFNhZmFyaSBhZGRpbmcgYW4gaW5wdXQgZXZlbnQgaGFuZGxlciBzb21laG93IHByZXZlbnRzIGFuXG4gICAgICAgIC8vIGlzc3VlIHdoZXJlIHRoZSBjb21wb3NpdGlvbiB2YW5pc2hlcyB3aGVuIHlvdSBwcmVzcyBlbnRlci5cbiAgICAgICAgaWYgKGJyb3dzZXIuc2FmYXJpKVxuICAgICAgICAgICAgdmlldy5jb250ZW50RE9NLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCAoKSA9PiBudWxsKTtcbiAgICAgICAgaWYgKGJyb3dzZXIuZ2Vja28pXG4gICAgICAgICAgICBmaXJlZm94Q29weUN1dEhhY2sodmlldy5jb250ZW50RE9NLm93bmVyRG9jdW1lbnQpO1xuICAgIH1cbiAgICBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgICBpZiAoIWV2ZW50QmVsb25nc1RvRWRpdG9yKHRoaXMudmlldywgZXZlbnQpIHx8IHRoaXMuaWdub3JlRHVyaW5nQ29tcG9zaXRpb24oZXZlbnQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PSBcImtleWRvd25cIiAmJiB0aGlzLmtleWRvd24oZXZlbnQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy52aWV3LnVwZGF0ZVN0YXRlICE9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLylcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5ydW5IYW5kbGVycyhldmVudC50eXBlLCBldmVudCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnJ1bkhhbmRsZXJzKGV2ZW50LnR5cGUsIGV2ZW50KTtcbiAgICB9XG4gICAgcnVuSGFuZGxlcnModHlwZSwgZXZlbnQpIHtcbiAgICAgICAgbGV0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVyc1t0eXBlXTtcbiAgICAgICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBvYnNlcnZlciBvZiBoYW5kbGVycy5vYnNlcnZlcnMpXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIodGhpcy52aWV3LCBldmVudCk7XG4gICAgICAgICAgICBmb3IgKGxldCBoYW5kbGVyIG9mIGhhbmRsZXJzLmhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKHRoaXMudmlldywgZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbnN1cmVIYW5kbGVycyhwbHVnaW5zKSB7XG4gICAgICAgIGxldCBoYW5kbGVycyA9IGNvbXB1dGVIYW5kbGVycyhwbHVnaW5zKSwgcHJldiA9IHRoaXMuaGFuZGxlcnMsIGRvbSA9IHRoaXMudmlldy5jb250ZW50RE9NO1xuICAgICAgICBmb3IgKGxldCB0eXBlIGluIGhhbmRsZXJzKVxuICAgICAgICAgICAgaWYgKHR5cGUgIT0gXCJzY3JvbGxcIikge1xuICAgICAgICAgICAgICAgIGxldCBwYXNzaXZlID0gIWhhbmRsZXJzW3R5cGVdLmhhbmRsZXJzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBsZXQgZXhpc3RzID0gcHJldlt0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RzICYmIHBhc3NpdmUgIT0gIWV4aXN0cy5oYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgdGhpcy5oYW5kbGVFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0cyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKVxuICAgICAgICAgICAgICAgICAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzLmhhbmRsZUV2ZW50LCB7IHBhc3NpdmUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHR5cGUgaW4gcHJldilcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwic2Nyb2xsXCIgJiYgIWhhbmRsZXJzW3R5cGVdKVxuICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXMuaGFuZGxlRXZlbnQpO1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gaGFuZGxlcnM7XG4gICAgfVxuICAgIGtleWRvd24oZXZlbnQpIHtcbiAgICAgICAgLy8gTXVzdCBhbHdheXMgcnVuLCBldmVuIGlmIGEgY3VzdG9tIGhhbmRsZXIgaGFuZGxlZCB0aGUgZXZlbnRcbiAgICAgICAgdGhpcy5sYXN0S2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7XG4gICAgICAgIHRoaXMubGFzdEtleVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSA5ICYmIHRoaXMudGFiRm9jdXNNb2RlID4gLTEgJiYgKCF0aGlzLnRhYkZvY3VzTW9kZSB8fCBEYXRlLm5vdygpIDw9IHRoaXMudGFiRm9jdXNNb2RlKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy50YWJGb2N1c01vZGUgPiAwICYmIGV2ZW50LmtleUNvZGUgIT0gMjcgJiYgbW9kaWZpZXJDb2Rlcy5pbmRleE9mKGV2ZW50LmtleUNvZGUpIDwgMClcbiAgICAgICAgICAgIHRoaXMudGFiRm9jdXNNb2RlID0gLTE7XG4gICAgICAgIC8vIENocm9tZSBmb3IgQW5kcm9pZCB1c3VhbGx5IGRvZXNuJ3QgZmlyZSBwcm9wZXIga2V5IGV2ZW50cywgYnV0XG4gICAgICAgIC8vIG9jY2FzaW9uYWxseSBkb2VzLCB1c3VhbGx5IHN1cnJvdW5kZWQgYnkgYSBidW5jaCBvZiBjb21wbGljYXRlZFxuICAgICAgICAvLyBjb21wb3NpdGlvbiBjaGFuZ2VzLiBXaGVuIGFuIGVudGVyIG9yIGJhY2tzcGFjZSBrZXkgZXZlbnQgaXNcbiAgICAgICAgLy8gc2VlbiwgaG9sZCBvZmYgb24gaGFuZGxpbmcgRE9NIGV2ZW50cyBmb3IgYSBiaXQsIGFuZCB0aGVuXG4gICAgICAgIC8vIGRpc3BhdGNoIGl0LlxuICAgICAgICBpZiAoYnJvd3Nlci5hbmRyb2lkICYmIGJyb3dzZXIuY2hyb21lICYmICFldmVudC5zeW50aGV0aWMgJiZcbiAgICAgICAgICAgIChldmVudC5rZXlDb2RlID09IDEzIHx8IGV2ZW50LmtleUNvZGUgPT0gOCkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5kZWxheUFuZHJvaWRLZXkoZXZlbnQua2V5LCBldmVudC5rZXlDb2RlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFByZXZlbnRpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgRW50ZXIgb24gaU9TIG1ha2VzIHRoZVxuICAgICAgICAvLyB2aXJ0dWFsIGtleWJvYXJkIGdldCBzdHVjayBpbiB0aGUgd3JvbmcgKGxvd2VyY2FzZSlcbiAgICAgICAgLy8gc3RhdGUuIFNvIHdlIGxldCBpdCBnbyB0aHJvdWdoLCBhbmQgdGhlbiwgaW5cbiAgICAgICAgLy8gYXBwbHlET01DaGFuZ2UsIG5vdGlmeSBrZXkgaGFuZGxlcnMgb2YgaXQgYW5kIHJlc2V0IHRvXG4gICAgICAgIC8vIHRoZSBzdGF0ZSB0aGV5IHByb2R1Y2UuXG4gICAgICAgIGxldCBwZW5kaW5nO1xuICAgICAgICBpZiAoYnJvd3Nlci5pb3MgJiYgIWV2ZW50LnN5bnRoZXRpYyAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5tZXRhS2V5ICYmXG4gICAgICAgICAgICAoKHBlbmRpbmcgPSBQZW5kaW5nS2V5cy5maW5kKGtleSA9PiBrZXkua2V5Q29kZSA9PSBldmVudC5rZXlDb2RlKSkgJiYgIWV2ZW50LmN0cmxLZXkgfHxcbiAgICAgICAgICAgICAgICBFbWFjc3lQZW5kaW5nS2V5cy5pbmRleE9mKGV2ZW50LmtleSkgPiAtMSAmJiBldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSkpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0lPU0tleSA9IHBlbmRpbmcgfHwgZXZlbnQ7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZmx1c2hJT1NLZXkoKSwgMjUwKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlICE9IDIyOSlcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5mb3JjZUZsdXNoKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZmx1c2hJT1NLZXkoY2hhbmdlKSB7XG4gICAgICAgIGxldCBrZXkgPSB0aGlzLnBlbmRpbmdJT1NLZXk7XG4gICAgICAgIGlmICgha2V5KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBUaGlzIGxvb2tzIGxpa2UgYW4gYXV0b2NvcnJlY3Rpb24gYmVmb3JlIEVudGVyXG4gICAgICAgIGlmIChrZXkua2V5ID09IFwiRW50ZXJcIiAmJiBjaGFuZ2UgJiYgY2hhbmdlLmZyb20gPCBjaGFuZ2UudG8gJiYgL15cXFMrJC8udGVzdChjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCkpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnBlbmRpbmdJT1NLZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaEtleSh0aGlzLnZpZXcuY29udGVudERPTSwga2V5LmtleSwga2V5LmtleUNvZGUsIGtleSBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQgPyBrZXkgOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZ25vcmVEdXJpbmdDb21wb3NpdGlvbihldmVudCkge1xuICAgICAgICBpZiAoIS9ea2V5Ly50ZXN0KGV2ZW50LnR5cGUpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5jb21wb3NpbmcgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIFNlZSBodHRwczovL3d3dy5zdHVtLmRlLzIwMTYvMDYvMjQvaGFuZGxpbmctaW1lLWV2ZW50cy1pbi1qYXZhc2NyaXB0Ly5cbiAgICAgICAgLy8gT24gc29tZSBpbnB1dCBtZXRob2QgZWRpdG9ycyAoSU1FcyksIHRoZSBFbnRlciBrZXkgaXMgdXNlZCB0b1xuICAgICAgICAvLyBjb25maXJtIGNoYXJhY3RlciBzZWxlY3Rpb24uIE9uIFNhZmFyaSwgd2hlbiBFbnRlciBpcyBwcmVzc2VkLFxuICAgICAgICAvLyBjb21wb3NpdGlvbmVuZCBhbmQga2V5ZG93biBldmVudHMgYXJlIHNvbWV0aW1lcyBlbWl0dGVkIGluIHRoZVxuICAgICAgICAvLyB3cm9uZyBvcmRlci4gVGhlIGtleSBldmVudCBzaG91bGQgc3RpbGwgYmUgaWdub3JlZCwgZXZlbiB3aGVuXG4gICAgICAgIC8vIGl0IGhhcHBlbnMgYWZ0ZXIgdGhlIGNvbXBvc2l0aW9uZW5kIGV2ZW50LlxuICAgICAgICBpZiAoYnJvd3Nlci5zYWZhcmkgJiYgIWJyb3dzZXIuaW9zICYmIHRoaXMuY29tcG9zaXRpb25QZW5kaW5nS2V5ICYmIERhdGUubm93KCkgLSB0aGlzLmNvbXBvc2l0aW9uRW5kZWRBdCA8IDEwMCkge1xuICAgICAgICAgICAgdGhpcy5jb21wb3NpdGlvblBlbmRpbmdLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc3RhcnRNb3VzZVNlbGVjdGlvbihtb3VzZVNlbGVjdGlvbikge1xuICAgICAgICBpZiAodGhpcy5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm1vdXNlU2VsZWN0aW9uID0gbW91c2VTZWxlY3Rpb247XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICBpZiAodGhpcy5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24udXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLmRyYWdnZWRDb250ZW50ICYmIHVwZGF0ZS5kb2NDaGFuZ2VkKVxuICAgICAgICAgICAgdGhpcy5kcmFnZ2VkQ29udGVudCA9IHRoaXMuZHJhZ2dlZENvbnRlbnQubWFwKHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5sYXN0S2V5Q29kZSA9IHRoaXMubGFzdFNlbGVjdGlvblRpbWUgPSAwO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24uZGVzdHJveSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJpbmRIYW5kbGVyKHBsdWdpbiwgaGFuZGxlcikge1xuICAgIHJldHVybiAodmlldywgZXZlbnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLmNhbGwocGx1Z2luLCBldmVudCwgdmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlSGFuZGxlcnMocGx1Z2lucykge1xuICAgIGxldCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZ1bmN0aW9uIHJlY29yZCh0eXBlKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRbdHlwZV0gfHwgKHJlc3VsdFt0eXBlXSA9IHsgb2JzZXJ2ZXJzOiBbXSwgaGFuZGxlcnM6IFtdIH0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICBsZXQgc3BlYyA9IHBsdWdpbi5zcGVjO1xuICAgICAgICBpZiAoc3BlYyAmJiBzcGVjLmRvbUV2ZW50SGFuZGxlcnMpXG4gICAgICAgICAgICBmb3IgKGxldCB0eXBlIGluIHNwZWMuZG9tRXZlbnRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGxldCBmID0gc3BlYy5kb21FdmVudEhhbmRsZXJzW3R5cGVdO1xuICAgICAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgICAgICByZWNvcmQodHlwZSkuaGFuZGxlcnMucHVzaChiaW5kSGFuZGxlcihwbHVnaW4udmFsdWUsIGYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWMgJiYgc3BlYy5kb21FdmVudE9ic2VydmVycylcbiAgICAgICAgICAgIGZvciAobGV0IHR5cGUgaW4gc3BlYy5kb21FdmVudE9ic2VydmVycykge1xuICAgICAgICAgICAgICAgIGxldCBmID0gc3BlYy5kb21FdmVudE9ic2VydmVyc1t0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAoZilcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkKHR5cGUpLm9ic2VydmVycy5wdXNoKGJpbmRIYW5kbGVyKHBsdWdpbi52YWx1ZSwgZikpO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCB0eXBlIGluIGhhbmRsZXJzKVxuICAgICAgICByZWNvcmQodHlwZSkuaGFuZGxlcnMucHVzaChoYW5kbGVyc1t0eXBlXSk7XG4gICAgZm9yIChsZXQgdHlwZSBpbiBvYnNlcnZlcnMpXG4gICAgICAgIHJlY29yZCh0eXBlKS5vYnNlcnZlcnMucHVzaChvYnNlcnZlcnNbdHlwZV0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBQZW5kaW5nS2V5cyA9IFtcbiAgICB7IGtleTogXCJCYWNrc3BhY2VcIiwga2V5Q29kZTogOCwgaW5wdXRUeXBlOiBcImRlbGV0ZUNvbnRlbnRCYWNrd2FyZFwiIH0sXG4gICAgeyBrZXk6IFwiRW50ZXJcIiwga2V5Q29kZTogMTMsIGlucHV0VHlwZTogXCJpbnNlcnRQYXJhZ3JhcGhcIiB9LFxuICAgIHsga2V5OiBcIkVudGVyXCIsIGtleUNvZGU6IDEzLCBpbnB1dFR5cGU6IFwiaW5zZXJ0TGluZUJyZWFrXCIgfSxcbiAgICB7IGtleTogXCJEZWxldGVcIiwga2V5Q29kZTogNDYsIGlucHV0VHlwZTogXCJkZWxldGVDb250ZW50Rm9yd2FyZFwiIH1cbl07XG5jb25zdCBFbWFjc3lQZW5kaW5nS2V5cyA9IFwiZHRoa29cIjtcbi8vIEtleSBjb2RlcyBmb3IgbW9kaWZpZXIga2V5c1xuY29uc3QgbW9kaWZpZXJDb2RlcyA9IFsxNiwgMTcsIDE4LCAyMCwgOTEsIDkyLCAyMjQsIDIyNV07XG5jb25zdCBkcmFnU2Nyb2xsTWFyZ2luID0gNjtcbmZ1bmN0aW9uIGRyYWdTY3JvbGxTcGVlZChkaXN0KSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIGRpc3QpICogMC43ICsgODtcbn1cbmZ1bmN0aW9uIGRpc3QoYSwgYikge1xuICAgIHJldHVybiBNYXRoLm1heChNYXRoLmFicyhhLmNsaWVudFggLSBiLmNsaWVudFgpLCBNYXRoLmFicyhhLmNsaWVudFkgLSBiLmNsaWVudFkpKTtcbn1cbmNsYXNzIE1vdXNlU2VsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBzdGFydEV2ZW50LCBzdHlsZSwgbXVzdFNlbGVjdCkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnN0YXJ0RXZlbnQgPSBzdGFydEV2ZW50O1xuICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7XG4gICAgICAgIHRoaXMubXVzdFNlbGVjdCA9IG11c3RTZWxlY3Q7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3BlZWQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgdGhpcy5zY3JvbGxpbmcgPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0RXZlbnQgPSBzdGFydEV2ZW50O1xuICAgICAgICB0aGlzLnNjcm9sbFBhcmVudHMgPSBzY3JvbGxhYmxlUGFyZW50cyh2aWV3LmNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLmF0b21zID0gdmlldy5zdGF0ZS5mYWNldChhdG9taWNSYW5nZXMpLm1hcChmID0+IGYodmlldykpO1xuICAgICAgICBsZXQgZG9jID0gdmlldy5jb250ZW50RE9NLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW92ZSA9IHRoaXMubW92ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMudXAgPSB0aGlzLnVwLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmV4dGVuZCA9IHN0YXJ0RXZlbnQuc2hpZnRLZXk7XG4gICAgICAgIHRoaXMubXVsdGlwbGUgPSB2aWV3LnN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLmFsbG93TXVsdGlwbGVTZWxlY3Rpb25zKSAmJiBhZGRzU2VsZWN0aW9uUmFuZ2Uodmlldywgc3RhcnRFdmVudCk7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBpc0luUHJpbWFyeVNlbGVjdGlvbih2aWV3LCBzdGFydEV2ZW50KSAmJiBnZXRDbGlja1R5cGUoc3RhcnRFdmVudCkgPT0gMSA/IG51bGwgOiBmYWxzZTtcbiAgICB9XG4gICAgc3RhcnQoZXZlbnQpIHtcbiAgICAgICAgLy8gV2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBzZWxlY3Rpb24sIGltbWVkaWF0ZWx5IGFwcGx5IHRoZVxuICAgICAgICAvLyBlZmZlY3Qgb2Ygc3RhcnRpbmcgdGhlIHNlbGVjdGlvblxuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyA9PT0gZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdChldmVudCk7XG4gICAgfVxuICAgIG1vdmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbnMgPT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcgfHwgdGhpcy5kcmFnZ2luZyA9PSBudWxsICYmIGRpc3QodGhpcy5zdGFydEV2ZW50LCBldmVudCkgPCAxMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5sYXN0RXZlbnQgPSBldmVudCk7XG4gICAgICAgIGxldCBzeCA9IDAsIHN5ID0gMDtcbiAgICAgICAgbGV0IGxlZnQgPSAwLCB0b3AgPSAwLCByaWdodCA9IHRoaXMudmlldy53aW4uaW5uZXJXaWR0aCwgYm90dG9tID0gdGhpcy52aWV3Lndpbi5pbm5lckhlaWdodDtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsUGFyZW50cy54KVxuICAgICAgICAgICAgKHsgbGVmdCwgcmlnaHQgfSA9IHRoaXMuc2Nyb2xsUGFyZW50cy54LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsUGFyZW50cy55KVxuICAgICAgICAgICAgKHsgdG9wLCBib3R0b20gfSA9IHRoaXMuc2Nyb2xsUGFyZW50cy55LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgbGV0IG1hcmdpbnMgPSBnZXRTY3JvbGxNYXJnaW5zKHRoaXMudmlldyk7XG4gICAgICAgIGlmIChldmVudC5jbGllbnRYIC0gbWFyZ2lucy5sZWZ0IDw9IGxlZnQgKyBkcmFnU2Nyb2xsTWFyZ2luKVxuICAgICAgICAgICAgc3ggPSAtZHJhZ1Njcm9sbFNwZWVkKGxlZnQgLSBldmVudC5jbGllbnRYKTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQuY2xpZW50WCArIG1hcmdpbnMucmlnaHQgPj0gcmlnaHQgLSBkcmFnU2Nyb2xsTWFyZ2luKVxuICAgICAgICAgICAgc3ggPSBkcmFnU2Nyb2xsU3BlZWQoZXZlbnQuY2xpZW50WCAtIHJpZ2h0KTtcbiAgICAgICAgaWYgKGV2ZW50LmNsaWVudFkgLSBtYXJnaW5zLnRvcCA8PSB0b3AgKyBkcmFnU2Nyb2xsTWFyZ2luKVxuICAgICAgICAgICAgc3kgPSAtZHJhZ1Njcm9sbFNwZWVkKHRvcCAtIGV2ZW50LmNsaWVudFkpO1xuICAgICAgICBlbHNlIGlmIChldmVudC5jbGllbnRZICsgbWFyZ2lucy5ib3R0b20gPj0gYm90dG9tIC0gZHJhZ1Njcm9sbE1hcmdpbilcbiAgICAgICAgICAgIHN5ID0gZHJhZ1Njcm9sbFNwZWVkKGV2ZW50LmNsaWVudFkgLSBib3R0b20pO1xuICAgICAgICB0aGlzLnNldFNjcm9sbFNwZWVkKHN4LCBzeSk7XG4gICAgfVxuICAgIHVwKGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdnaW5nID09IG51bGwpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCk7XG4gICAgICAgIGlmICghdGhpcy5kcmFnZ2luZylcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnNldFNjcm9sbFNwZWVkKDAsIDApO1xuICAgICAgICBsZXQgZG9jID0gdGhpcy52aWV3LmNvbnRlbnRET00ub3duZXJEb2N1bWVudDtcbiAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3ZlKTtcbiAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMudXApO1xuICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5tb3VzZVNlbGVjdGlvbiA9IHRoaXMudmlldy5pbnB1dFN0YXRlLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbiAgICB9XG4gICAgc2V0U2Nyb2xsU3BlZWQoc3gsIHN5KSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3BlZWQgPSB7IHg6IHN4LCB5OiBzeSB9O1xuICAgICAgICBpZiAoc3ggfHwgc3kpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbGluZyA8IDApXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxpbmcgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnNjcm9sbCgpLCA1MCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zY3JvbGxpbmcgPiAtMSkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnNjcm9sbGluZyk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbGluZyA9IC0xO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNjcm9sbCgpIHtcbiAgICAgICAgbGV0IHsgeCwgeSB9ID0gdGhpcy5zY3JvbGxTcGVlZDtcbiAgICAgICAgaWYgKHggJiYgdGhpcy5zY3JvbGxQYXJlbnRzLngpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsUGFyZW50cy54LnNjcm9sbExlZnQgKz0geDtcbiAgICAgICAgICAgIHggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5ICYmIHRoaXMuc2Nyb2xsUGFyZW50cy55KSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFBhcmVudHMueS5zY3JvbGxUb3AgKz0geTtcbiAgICAgICAgICAgIHkgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4IHx8IHkpXG4gICAgICAgICAgICB0aGlzLnZpZXcud2luLnNjcm9sbEJ5KHgsIHkpO1xuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyA9PT0gZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCk7XG4gICAgfVxuICAgIHNraXBBdG9tcyhzZWwpIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gc2VsLnJhbmdlc1tpXSwgdXBkYXRlZCA9IG51bGw7XG4gICAgICAgICAgICBpZiAocmFuZ2UuZW1wdHkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcG9zID0gc2tpcEF0b21pY1Jhbmdlcyh0aGlzLmF0b21zLCByYW5nZS5mcm9tLCAwKTtcbiAgICAgICAgICAgICAgICBpZiAocG9zICE9IHJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcywgLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBza2lwQXRvbWljUmFuZ2VzKHRoaXMuYXRvbXMsIHJhbmdlLmZyb20sIC0xKTtcbiAgICAgICAgICAgICAgICBsZXQgdG8gPSBza2lwQXRvbWljUmFuZ2VzKHRoaXMuYXRvbXMsIHJhbmdlLnRvLCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSAhPSByYW5nZS5mcm9tIHx8IHRvICE9IHJhbmdlLnRvKVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHJhbmdlLmZyb20gPT0gcmFuZ2UuYW5jaG9yID8gZnJvbSA6IHRvLCByYW5nZS5mcm9tID09IHJhbmdlLmhlYWQgPyBmcm9tIDogdG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJhbmdlcylcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2VzID0gc2VsLnJhbmdlcy5zbGljZSgpO1xuICAgICAgICAgICAgICAgIHJhbmdlc1tpXSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJhbmdlcyA/IEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzLCBzZWwubWFpbkluZGV4KSA6IHNlbDtcbiAgICB9XG4gICAgc2VsZWN0KGV2ZW50KSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXMsIHNlbGVjdGlvbiA9IHRoaXMuc2tpcEF0b21zKHRoaXMuc3R5bGUuZ2V0KGV2ZW50LCB0aGlzLmV4dGVuZCwgdGhpcy5tdWx0aXBsZSkpO1xuICAgICAgICBpZiAodGhpcy5tdXN0U2VsZWN0IHx8ICFzZWxlY3Rpb24uZXEodmlldy5zdGF0ZS5zZWxlY3Rpb24sIHRoaXMuZHJhZ2dpbmcgPT09IGZhbHNlKSlcbiAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIHVzZXJFdmVudDogXCJzZWxlY3QucG9pbnRlclwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tdXN0U2VsZWN0ID0gZmFsc2U7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5pc1VzZXJFdmVudChcImlucHV0LnR5cGVcIikpKVxuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc3R5bGUudXBkYXRlKHVwZGF0ZSkpXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VsZWN0KHRoaXMubGFzdEV2ZW50KSwgMjApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZHNTZWxlY3Rpb25SYW5nZSh2aWV3LCBldmVudCkge1xuICAgIGxldCBmYWNldCA9IHZpZXcuc3RhdGUuZmFjZXQoY2xpY2tBZGRzU2VsZWN0aW9uUmFuZ2UpO1xuICAgIHJldHVybiBmYWNldC5sZW5ndGggPyBmYWNldFswXShldmVudCkgOiBicm93c2VyLm1hYyA/IGV2ZW50Lm1ldGFLZXkgOiBldmVudC5jdHJsS2V5O1xufVxuZnVuY3Rpb24gZHJhZ01vdmVzU2VsZWN0aW9uKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IGZhY2V0ID0gdmlldy5zdGF0ZS5mYWNldChkcmFnTW92ZXNTZWxlY3Rpb24kMSk7XG4gICAgcmV0dXJuIGZhY2V0Lmxlbmd0aCA/IGZhY2V0WzBdKGV2ZW50KSA6IGJyb3dzZXIubWFjID8gIWV2ZW50LmFsdEtleSA6ICFldmVudC5jdHJsS2V5O1xufVxuZnVuY3Rpb24gaXNJblByaW1hcnlTZWxlY3Rpb24odmlldywgZXZlbnQpIHtcbiAgICBsZXQgeyBtYWluIH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAobWFpbi5lbXB0eSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIE9uIGJvdW5kYXJ5IGNsaWNrcywgY2hlY2sgd2hldGhlciB0aGUgY29vcmRpbmF0ZXMgYXJlIGluc2lkZSB0aGVcbiAgICAvLyBzZWxlY3Rpb24ncyBjbGllbnQgcmVjdGFuZ2xlc1xuICAgIGxldCBzZWwgPSBnZXRTZWxlY3Rpb24odmlldy5yb290KTtcbiAgICBpZiAoIXNlbCB8fCBzZWwucmFuZ2VDb3VudCA9PSAwKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgcmVjdHMgPSBzZWwuZ2V0UmFuZ2VBdCgwKS5nZXRDbGllbnRSZWN0cygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tpXTtcbiAgICAgICAgaWYgKHJlY3QubGVmdCA8PSBldmVudC5jbGllbnRYICYmIHJlY3QucmlnaHQgPj0gZXZlbnQuY2xpZW50WCAmJlxuICAgICAgICAgICAgcmVjdC50b3AgPD0gZXZlbnQuY2xpZW50WSAmJiByZWN0LmJvdHRvbSA+PSBldmVudC5jbGllbnRZKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGV2ZW50QmVsb25nc1RvRWRpdG9yKHZpZXcsIGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5idWJibGVzKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IG5vZGUgPSBldmVudC50YXJnZXQsIGNWaWV3OyBub2RlICE9IHZpZXcuY29udGVudERPTTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgPT0gMTEgfHwgKChjVmlldyA9IENvbnRlbnRWaWV3LmdldChub2RlKSkgJiYgY1ZpZXcuaWdub3JlRXZlbnQoZXZlbnQpKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IGhhbmRsZXJzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5jb25zdCBvYnNlcnZlcnMgPSAvKkBfX1BVUkVfXyovT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8vIFRoaXMgaXMgdmVyeSBjcnVkZSwgYnV0IHVuZm9ydHVuYXRlbHkgYm90aCB0aGVzZSBicm93c2VycyBfcHJldGVuZF9cbi8vIHRoYXQgdGhleSBoYXZlIGEgY2xpcGJvYXJkIEFQSVx1MjAxNGFsbCB0aGUgb2JqZWN0cyBhbmQgbWV0aG9kcyBhcmVcbi8vIHRoZXJlLCB0aGV5IGp1c3QgZG9uJ3Qgd29yaywgYW5kIHRoZXkgYXJlIGhhcmQgdG8gdGVzdC5cbmNvbnN0IGJyb2tlbkNsaXBib2FyZEFQSSA9IChicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8IDE1KSB8fFxuICAgIChicm93c2VyLmlvcyAmJiBicm93c2VyLndlYmtpdF92ZXJzaW9uIDwgNjA0KTtcbmZ1bmN0aW9uIGNhcHR1cmVQYXN0ZSh2aWV3KSB7XG4gICAgbGV0IHBhcmVudCA9IHZpZXcuZG9tLnBhcmVudE5vZGU7XG4gICAgaWYgKCFwYXJlbnQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgdGFyZ2V0ID0gcGFyZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSk7XG4gICAgdGFyZ2V0LnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIHRhcmdldC5mb2N1cygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2aWV3LmZvY3VzKCk7XG4gICAgICAgIHRhcmdldC5yZW1vdmUoKTtcbiAgICAgICAgZG9QYXN0ZSh2aWV3LCB0YXJnZXQudmFsdWUpO1xuICAgIH0sIDUwKTtcbn1cbmZ1bmN0aW9uIHRleHRGaWx0ZXIoc3RhdGUsIGZhY2V0LCB0ZXh0KSB7XG4gICAgZm9yIChsZXQgZmlsdGVyIG9mIHN0YXRlLmZhY2V0KGZhY2V0KSlcbiAgICAgICAgdGV4dCA9IGZpbHRlcih0ZXh0LCBzdGF0ZSk7XG4gICAgcmV0dXJuIHRleHQ7XG59XG5mdW5jdGlvbiBkb1Bhc3RlKHZpZXcsIGlucHV0KSB7XG4gICAgaW5wdXQgPSB0ZXh0RmlsdGVyKHZpZXcuc3RhdGUsIGNsaXBib2FyZElucHV0RmlsdGVyLCBpbnB1dCk7XG4gICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGNoYW5nZXMsIGkgPSAxLCB0ZXh0ID0gc3RhdGUudG9UZXh0KGlucHV0KTtcbiAgICBsZXQgYnlMaW5lID0gdGV4dC5saW5lcyA9PSBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLmxlbmd0aDtcbiAgICBsZXQgbGluZXdpc2UgPSBsYXN0TGluZXdpc2VDb3B5ICE9IG51bGwgJiYgc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5ldmVyeShyID0+IHIuZW1wdHkpICYmIGxhc3RMaW5ld2lzZUNvcHkgPT0gdGV4dC50b1N0cmluZygpO1xuICAgIGlmIChsaW5ld2lzZSkge1xuICAgICAgICBsZXQgbGFzdExpbmUgPSAtMTtcbiAgICAgICAgY2hhbmdlcyA9IHN0YXRlLmNoYW5nZUJ5UmFuZ2UocmFuZ2UgPT4ge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KHJhbmdlLmZyb20pO1xuICAgICAgICAgICAgaWYgKGxpbmUuZnJvbSA9PSBsYXN0TGluZSlcbiAgICAgICAgICAgICAgICByZXR1cm4geyByYW5nZSB9O1xuICAgICAgICAgICAgbGFzdExpbmUgPSBsaW5lLmZyb207XG4gICAgICAgICAgICBsZXQgaW5zZXJ0ID0gc3RhdGUudG9UZXh0KChieUxpbmUgPyB0ZXh0LmxpbmUoaSsrKS50ZXh0IDogaW5wdXQpICsgc3RhdGUubGluZUJyZWFrKTtcbiAgICAgICAgICAgIHJldHVybiB7IGNoYW5nZXM6IHsgZnJvbTogbGluZS5mcm9tLCBpbnNlcnQgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyYW5nZS5mcm9tICsgaW5zZXJ0Lmxlbmd0aCkgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGJ5TGluZSkge1xuICAgICAgICBjaGFuZ2VzID0gc3RhdGUuY2hhbmdlQnlSYW5nZShyYW5nZSA9PiB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHRleHQubGluZShpKyspO1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhbmdlczogeyBmcm9tOiByYW5nZS5mcm9tLCB0bzogcmFuZ2UudG8sIGluc2VydDogbGluZS50ZXh0IH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocmFuZ2UuZnJvbSArIGxpbmUubGVuZ3RoKSB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNoYW5nZXMgPSBzdGF0ZS5yZXBsYWNlU2VsZWN0aW9uKHRleHQpO1xuICAgIH1cbiAgICB2aWV3LmRpc3BhdGNoKGNoYW5nZXMsIHtcbiAgICAgICAgdXNlckV2ZW50OiBcImlucHV0LnBhc3RlXCIsXG4gICAgICAgIHNjcm9sbEludG9WaWV3OiB0cnVlXG4gICAgfSk7XG59XG5vYnNlcnZlcnMuc2Nyb2xsID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxUb3AgPSB2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3A7XG4gICAgdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxMZWZ0ID0gdmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdDtcbn07XG5oYW5kbGVycy5rZXlkb3duID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLnNldFNlbGVjdGlvbk9yaWdpbihcInNlbGVjdFwiKTtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAyNyAmJiB2aWV3LmlucHV0U3RhdGUudGFiRm9jdXNNb2RlICE9IDApXG4gICAgICAgIHZpZXcuaW5wdXRTdGF0ZS50YWJGb2N1c01vZGUgPSBEYXRlLm5vdygpICsgMjAwMDtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xub2JzZXJ2ZXJzLnRvdWNoc3RhcnQgPSAodmlldywgZSkgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0VG91Y2hUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB2aWV3LmlucHV0U3RhdGUuc2V0U2VsZWN0aW9uT3JpZ2luKFwic2VsZWN0LnBvaW50ZXJcIik7XG59O1xub2JzZXJ2ZXJzLnRvdWNobW92ZSA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5zZXRTZWxlY3Rpb25PcmlnaW4oXCJzZWxlY3QucG9pbnRlclwiKTtcbn07XG5oYW5kbGVycy5tb3VzZWRvd24gPSAodmlldywgZXZlbnQpID0+IHtcbiAgICB2aWV3Lm9ic2VydmVyLmZsdXNoKCk7XG4gICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0VG91Y2hUaW1lID4gRGF0ZS5ub3coKSAtIDIwMDApXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gSWdub3JlIHRvdWNoIGludGVyYWN0aW9uXG4gICAgbGV0IHN0eWxlID0gbnVsbDtcbiAgICBmb3IgKGxldCBtYWtlU3R5bGUgb2Ygdmlldy5zdGF0ZS5mYWNldChtb3VzZVNlbGVjdGlvblN0eWxlKSkge1xuICAgICAgICBzdHlsZSA9IG1ha2VTdHlsZSh2aWV3LCBldmVudCk7XG4gICAgICAgIGlmIChzdHlsZSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoIXN0eWxlICYmIGV2ZW50LmJ1dHRvbiA9PSAwKVxuICAgICAgICBzdHlsZSA9IGJhc2ljTW91c2VTZWxlY3Rpb24odmlldywgZXZlbnQpO1xuICAgIGlmIChzdHlsZSkge1xuICAgICAgICBsZXQgbXVzdEZvY3VzID0gIXZpZXcuaGFzRm9jdXM7XG4gICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5zdGFydE1vdXNlU2VsZWN0aW9uKG5ldyBNb3VzZVNlbGVjdGlvbih2aWV3LCBldmVudCwgc3R5bGUsIG11c3RGb2N1cykpO1xuICAgICAgICBpZiAobXVzdEZvY3VzKVxuICAgICAgICAgICAgdmlldy5vYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvY3VzUHJldmVudFNjcm9sbCh2aWV3LmNvbnRlbnRET00pO1xuICAgICAgICAgICAgICAgIGxldCBhY3RpdmUgPSB2aWV3LnJvb3QuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlICYmICFhY3RpdmUuY29udGFpbnModmlldy5jb250ZW50RE9NKSlcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlLmJsdXIoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBsZXQgbW91c2VTZWwgPSB2aWV3LmlucHV0U3RhdGUubW91c2VTZWxlY3Rpb247XG4gICAgICAgIGlmIChtb3VzZVNlbCkge1xuICAgICAgICAgICAgbW91c2VTZWwuc3RhcnQoZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuIG1vdXNlU2VsLmRyYWdnaW5nID09PSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZnVuY3Rpb24gcmFuZ2VGb3JDbGljayh2aWV3LCBwb3MsIGJpYXMsIHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSAxKSB7IC8vIFNpbmdsZSBjbGlja1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MsIGJpYXMpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09IDIpIHsgLy8gRG91YmxlIGNsaWNrXG4gICAgICAgIHJldHVybiBncm91cEF0KHZpZXcuc3RhdGUsIHBvcywgYmlhcyk7XG4gICAgfVxuICAgIGVsc2UgeyAvLyBUcmlwbGUgY2xpY2tcbiAgICAgICAgbGV0IHZpc3VhbCA9IExpbmVWaWV3LmZpbmQodmlldy5kb2NWaWV3LCBwb3MpLCBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHZpc3VhbCA/IHZpc3VhbC5wb3NBdEVuZCA6IHBvcyk7XG4gICAgICAgIGxldCBmcm9tID0gdmlzdWFsID8gdmlzdWFsLnBvc0F0U3RhcnQgOiBsaW5lLmZyb20sIHRvID0gdmlzdWFsID8gdmlzdWFsLnBvc0F0RW5kIDogbGluZS50bztcbiAgICAgICAgaWYgKHRvIDwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoICYmIHRvID09IGxpbmUudG8pXG4gICAgICAgICAgICB0bysrO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20sIHRvKTtcbiAgICB9XG59XG5sZXQgaW5zaWRlID0gKHgsIHksIHJlY3QpID0+IHkgPj0gcmVjdC50b3AgJiYgeSA8PSByZWN0LmJvdHRvbSAmJiB4ID49IHJlY3QubGVmdCAmJiB4IDw9IHJlY3QucmlnaHQ7XG4vLyBUcnkgdG8gZGV0ZXJtaW5lLCBmb3IgdGhlIGdpdmVuIGNvb3JkaW5hdGVzLCBhc3NvY2lhdGVkIHdpdGggdGhlXG4vLyBnaXZlbiBwb3NpdGlvbiwgd2hldGhlciB0aGV5IGFyZSByZWxhdGVkIHRvIHRoZSBlbGVtZW50IGJlZm9yZSBvclxuLy8gdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIHBvc2l0aW9uLlxuZnVuY3Rpb24gZmluZFBvc2l0aW9uU2lkZSh2aWV3LCBwb3MsIHgsIHkpIHtcbiAgICBsZXQgbGluZSA9IExpbmVWaWV3LmZpbmQodmlldy5kb2NWaWV3LCBwb3MpO1xuICAgIGlmICghbGluZSlcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgbGV0IG9mZiA9IHBvcyAtIGxpbmUucG9zQXRTdGFydDtcbiAgICAvLyBMaW5lIGJvdW5kYXJpZXMgcG9pbnQgaW50byB0aGUgbGluZVxuICAgIGlmIChvZmYgPT0gMClcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgaWYgKG9mZiA9PSBsaW5lLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIC8vIFBvc2l0aW9ucyBvbiB0b3Agb2YgYW4gZWxlbWVudCBwb2ludCBhdCB0aGF0IGVsZW1lbnRcbiAgICBsZXQgYmVmb3JlID0gbGluZS5jb29yZHNBdChvZmYsIC0xKTtcbiAgICBpZiAoYmVmb3JlICYmIGluc2lkZSh4LCB5LCBiZWZvcmUpKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgbGV0IGFmdGVyID0gbGluZS5jb29yZHNBdChvZmYsIDEpO1xuICAgIGlmIChhZnRlciAmJiBpbnNpZGUoeCwgeSwgYWZ0ZXIpKVxuICAgICAgICByZXR1cm4gMTtcbiAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGEgbGluZSB3cmFwIHBvaW50LiBQaWNrIGJlZm9yZSBpZiB0aGUgcG9pbnQgaXNcbiAgICAvLyBhYm92ZSBpdHMgYm90dG9tLlxuICAgIHJldHVybiBiZWZvcmUgJiYgYmVmb3JlLmJvdHRvbSA+PSB5ID8gLTEgOiAxO1xufVxuZnVuY3Rpb24gcXVlcnlQb3ModmlldywgZXZlbnQpIHtcbiAgICBsZXQgcG9zID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSwgZmFsc2UpO1xuICAgIHJldHVybiB7IHBvcywgYmlhczogZmluZFBvc2l0aW9uU2lkZSh2aWV3LCBwb3MsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpIH07XG59XG5jb25zdCBCYWRNb3VzZURldGFpbCA9IGJyb3dzZXIuaWUgJiYgYnJvd3Nlci5pZV92ZXJzaW9uIDw9IDExO1xubGV0IGxhc3RNb3VzZURvd24gPSBudWxsLCBsYXN0TW91c2VEb3duQ291bnQgPSAwLCBsYXN0TW91c2VEb3duVGltZSA9IDA7XG5mdW5jdGlvbiBnZXRDbGlja1R5cGUoZXZlbnQpIHtcbiAgICBpZiAoIUJhZE1vdXNlRGV0YWlsKVxuICAgICAgICByZXR1cm4gZXZlbnQuZGV0YWlsO1xuICAgIGxldCBsYXN0ID0gbGFzdE1vdXNlRG93biwgbGFzdFRpbWUgPSBsYXN0TW91c2VEb3duVGltZTtcbiAgICBsYXN0TW91c2VEb3duID0gZXZlbnQ7XG4gICAgbGFzdE1vdXNlRG93blRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBsYXN0TW91c2VEb3duQ291bnQgPSAhbGFzdCB8fCAobGFzdFRpbWUgPiBEYXRlLm5vdygpIC0gNDAwICYmIE1hdGguYWJzKGxhc3QuY2xpZW50WCAtIGV2ZW50LmNsaWVudFgpIDwgMiAmJlxuICAgICAgICBNYXRoLmFicyhsYXN0LmNsaWVudFkgLSBldmVudC5jbGllbnRZKSA8IDIpID8gKGxhc3RNb3VzZURvd25Db3VudCArIDEpICUgMyA6IDE7XG59XG5mdW5jdGlvbiBiYXNpY01vdXNlU2VsZWN0aW9uKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHN0YXJ0ID0gcXVlcnlQb3ModmlldywgZXZlbnQpLCB0eXBlID0gZ2V0Q2xpY2tUeXBlKGV2ZW50KTtcbiAgICBsZXQgc3RhcnRTZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICByZXR1cm4ge1xuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBzdGFydC5wb3MgPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3Moc3RhcnQucG9zKTtcbiAgICAgICAgICAgICAgICBzdGFydFNlbCA9IHN0YXJ0U2VsLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldChldmVudCwgZXh0ZW5kLCBtdWx0aXBsZSkge1xuICAgICAgICAgICAgbGV0IGN1ciA9IHF1ZXJ5UG9zKHZpZXcsIGV2ZW50KSwgcmVtb3ZlZDtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHJhbmdlRm9yQ2xpY2sodmlldywgY3VyLnBvcywgY3VyLmJpYXMsIHR5cGUpO1xuICAgICAgICAgICAgaWYgKHN0YXJ0LnBvcyAhPSBjdXIucG9zICYmICFleHRlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRSYW5nZSA9IHJhbmdlRm9yQ2xpY2sodmlldywgc3RhcnQucG9zLCBzdGFydC5iaWFzLCB0eXBlKTtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWluKHN0YXJ0UmFuZ2UuZnJvbSwgcmFuZ2UuZnJvbSksIHRvID0gTWF0aC5tYXgoc3RhcnRSYW5nZS50bywgcmFuZ2UudG8pO1xuICAgICAgICAgICAgICAgIHJhbmdlID0gZnJvbSA8IHJhbmdlLmZyb20gPyBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pIDogRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHRvLCBmcm9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHRlbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0U2VsLnJlcGxhY2VSYW5nZShzdGFydFNlbC5tYWluLmV4dGVuZChyYW5nZS5mcm9tLCByYW5nZS50bykpO1xuICAgICAgICAgICAgZWxzZSBpZiAobXVsdGlwbGUgJiYgdHlwZSA9PSAxICYmIHN0YXJ0U2VsLnJhbmdlcy5sZW5ndGggPiAxICYmIChyZW1vdmVkID0gcmVtb3ZlUmFuZ2VBcm91bmQoc3RhcnRTZWwsIGN1ci5wb3MpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlZDtcbiAgICAgICAgICAgIGVsc2UgaWYgKG11bHRpcGxlKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUoW3JhbmdlXSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gcmVtb3ZlUmFuZ2VBcm91bmQoc2VsLCBwb3MpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHNlbC5yYW5nZXNbaV07XG4gICAgICAgIGlmIChmcm9tIDw9IHBvcyAmJiB0byA+PSBwb3MpXG4gICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShzZWwucmFuZ2VzLnNsaWNlKDAsIGkpLmNvbmNhdChzZWwucmFuZ2VzLnNsaWNlKGkgKyAxKSksIHNlbC5tYWluSW5kZXggPT0gaSA/IDAgOiBzZWwubWFpbkluZGV4IC0gKHNlbC5tYWluSW5kZXggPiBpID8gMSA6IDApKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5oYW5kbGVycy5kcmFnc3RhcnQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBsZXQgeyBzZWxlY3Rpb246IHsgbWFpbjogcmFuZ2UgfSB9ID0gdmlldy5zdGF0ZTtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmRyYWdnYWJsZSkge1xuICAgICAgICBsZXQgY1ZpZXcgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdChldmVudC50YXJnZXQpO1xuICAgICAgICBpZiAoY1ZpZXcgJiYgY1ZpZXcuaXNXaWRnZXQpIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gY1ZpZXcucG9zQXRTdGFydCwgdG8gPSBmcm9tICsgY1ZpZXcubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGZyb20gPj0gcmFuZ2UudG8gfHwgdG8gPD0gcmFuZ2UuZnJvbSlcbiAgICAgICAgICAgICAgICByYW5nZSA9IEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tLCB0byk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHsgaW5wdXRTdGF0ZSB9ID0gdmlldztcbiAgICBpZiAoaW5wdXRTdGF0ZS5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgaW5wdXRTdGF0ZS5tb3VzZVNlbGVjdGlvbi5kcmFnZ2luZyA9IHRydWU7XG4gICAgaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IHJhbmdlO1xuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJUZXh0XCIsIHRleHRGaWx0ZXIodmlldy5zdGF0ZSwgY2xpcGJvYXJkT3V0cHV0RmlsdGVyLCB2aWV3LnN0YXRlLnNsaWNlRG9jKHJhbmdlLmZyb20sIHJhbmdlLnRvKSkpO1xuICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IFwiY29weU1vdmVcIjtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmhhbmRsZXJzLmRyYWdlbmQgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUuZHJhZ2dlZENvbnRlbnQgPSBudWxsO1xuICAgIHJldHVybiBmYWxzZTtcbn07XG5mdW5jdGlvbiBkcm9wVGV4dCh2aWV3LCBldmVudCwgdGV4dCwgZGlyZWN0KSB7XG4gICAgdGV4dCA9IHRleHRGaWx0ZXIodmlldy5zdGF0ZSwgY2xpcGJvYXJkSW5wdXRGaWx0ZXIsIHRleHQpO1xuICAgIGlmICghdGV4dClcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBkcm9wUG9zID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSwgZmFsc2UpO1xuICAgIGxldCB7IGRyYWdnZWRDb250ZW50IH0gPSB2aWV3LmlucHV0U3RhdGU7XG4gICAgbGV0IGRlbCA9IGRpcmVjdCAmJiBkcmFnZ2VkQ29udGVudCAmJiBkcmFnTW92ZXNTZWxlY3Rpb24odmlldywgZXZlbnQpXG4gICAgICAgID8geyBmcm9tOiBkcmFnZ2VkQ29udGVudC5mcm9tLCB0bzogZHJhZ2dlZENvbnRlbnQudG8gfSA6IG51bGw7XG4gICAgbGV0IGlucyA9IHsgZnJvbTogZHJvcFBvcywgaW5zZXJ0OiB0ZXh0IH07XG4gICAgbGV0IGNoYW5nZXMgPSB2aWV3LnN0YXRlLmNoYW5nZXMoZGVsID8gW2RlbCwgaW5zXSA6IGlucyk7XG4gICAgdmlldy5mb2N1cygpO1xuICAgIHZpZXcuZGlzcGF0Y2goe1xuICAgICAgICBjaGFuZ2VzLFxuICAgICAgICBzZWxlY3Rpb246IHsgYW5jaG9yOiBjaGFuZ2VzLm1hcFBvcyhkcm9wUG9zLCAtMSksIGhlYWQ6IGNoYW5nZXMubWFwUG9zKGRyb3BQb3MsIDEpIH0sXG4gICAgICAgIHVzZXJFdmVudDogZGVsID8gXCJtb3ZlLmRyb3BcIiA6IFwiaW5wdXQuZHJvcFwiXG4gICAgfSk7XG4gICAgdmlldy5pbnB1dFN0YXRlLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbn1cbmhhbmRsZXJzLmRyb3AgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2ZlcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh2aWV3LnN0YXRlLnJlYWRPbmx5KVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkgeyAvLyBGb3IgYSBmaWxlIGRyb3AsIHJlYWQgdGhlIGZpbGUncyB0ZXh0LlxuICAgICAgICBsZXQgdGV4dCA9IEFycmF5KGZpbGVzLmxlbmd0aCksIHJlYWQgPSAwO1xuICAgICAgICBsZXQgZmluaXNoRmlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICgrK3JlYWQgPT0gZmlsZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGRyb3BUZXh0KHZpZXcsIGV2ZW50LCB0ZXh0LmZpbHRlcihzID0+IHMgIT0gbnVsbCkuam9pbih2aWV3LnN0YXRlLmxpbmVCcmVhayksIGZhbHNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyO1xuICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBmaW5pc2hGaWxlO1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIS9bXFx4MDAtXFx4MDhcXHgwZS1cXHgxZl17Mn0vLnRlc3QocmVhZGVyLnJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgIHRleHRbaV0gPSByZWFkZXIucmVzdWx0O1xuICAgICAgICAgICAgICAgIGZpbmlzaEZpbGUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgdGV4dCA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwiVGV4dFwiKTtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgIGRyb3BUZXh0KHZpZXcsIGV2ZW50LCB0ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5oYW5kbGVycy5wYXN0ZSA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIGlmICh2aWV3LnN0YXRlLnJlYWRPbmx5KVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB2aWV3Lm9ic2VydmVyLmZsdXNoKCk7XG4gICAgbGV0IGRhdGEgPSBicm9rZW5DbGlwYm9hcmRBUEkgPyBudWxsIDogZXZlbnQuY2xpcGJvYXJkRGF0YTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBkb1Bhc3RlKHZpZXcsIGRhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIikgfHwgZGF0YS5nZXREYXRhKFwidGV4dC91cmktbGlzdFwiKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2FwdHVyZVBhc3RlKHZpZXcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNhcHR1cmVDb3B5KHZpZXcsIHRleHQpIHtcbiAgICAvLyBUaGUgZXh0cmEgd3JhcHBlciBpcyBzb21laG93IG5lY2Vzc2FyeSBvbiBJRS9FZGdlIHRvIHByZXZlbnQgdGhlXG4gICAgLy8gY29udGVudCBmcm9tIGJlaW5nIG1hbmdsZWQgd2hlbiBpdCBpcyBwdXQgb250byB0aGUgY2xpcGJvYXJkXG4gICAgbGV0IHBhcmVudCA9IHZpZXcuZG9tLnBhcmVudE5vZGU7XG4gICAgaWYgKCFwYXJlbnQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgdGFyZ2V0ID0gcGFyZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSk7XG4gICAgdGFyZ2V0LnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIHRhcmdldC52YWx1ZSA9IHRleHQ7XG4gICAgdGFyZ2V0LmZvY3VzKCk7XG4gICAgdGFyZ2V0LnNlbGVjdGlvbkVuZCA9IHRleHQubGVuZ3RoO1xuICAgIHRhcmdldC5zZWxlY3Rpb25TdGFydCA9IDA7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRhcmdldC5yZW1vdmUoKTtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgIH0sIDUwKTtcbn1cbmZ1bmN0aW9uIGNvcGllZFJhbmdlKHN0YXRlKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBbXSwgcmFuZ2VzID0gW10sIGxpbmV3aXNlID0gZmFsc2U7XG4gICAgZm9yIChsZXQgcmFuZ2Ugb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcylcbiAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSkge1xuICAgICAgICAgICAgY29udGVudC5wdXNoKHN0YXRlLnNsaWNlRG9jKHJhbmdlLmZyb20sIHJhbmdlLnRvKSk7XG4gICAgICAgICAgICByYW5nZXMucHVzaChyYW5nZSk7XG4gICAgICAgIH1cbiAgICBpZiAoIWNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgc2VsZWN0ZWQsIGRvIGEgbGluZS13aXNlIGNvcHlcbiAgICAgICAgbGV0IHVwdG8gPSAtMTtcbiAgICAgICAgZm9yIChsZXQgeyBmcm9tIH0gb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KGZyb20pO1xuICAgICAgICAgICAgaWYgKGxpbmUubnVtYmVyID4gdXB0bykge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChsaW5lLnRleHQpO1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKHsgZnJvbTogbGluZS5mcm9tLCB0bzogTWF0aC5taW4oc3RhdGUuZG9jLmxlbmd0aCwgbGluZS50byArIDEpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXB0byA9IGxpbmUubnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGxpbmV3aXNlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdGV4dDogdGV4dEZpbHRlcihzdGF0ZSwgY2xpcGJvYXJkT3V0cHV0RmlsdGVyLCBjb250ZW50LmpvaW4oc3RhdGUubGluZUJyZWFrKSksIHJhbmdlcywgbGluZXdpc2UgfTtcbn1cbmxldCBsYXN0TGluZXdpc2VDb3B5ID0gbnVsbDtcbmhhbmRsZXJzLmNvcHkgPSBoYW5kbGVycy5jdXQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBsZXQgeyB0ZXh0LCByYW5nZXMsIGxpbmV3aXNlIH0gPSBjb3BpZWRSYW5nZSh2aWV3LnN0YXRlKTtcbiAgICBpZiAoIXRleHQgJiYgIWxpbmV3aXNlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGFzdExpbmV3aXNlQ29weSA9IGxpbmV3aXNlID8gdGV4dCA6IG51bGw7XG4gICAgaWYgKGV2ZW50LnR5cGUgPT0gXCJjdXRcIiAmJiAhdmlldy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICBjaGFuZ2VzOiByYW5nZXMsXG4gICAgICAgICAgICBzY3JvbGxJbnRvVmlldzogdHJ1ZSxcbiAgICAgICAgICAgIHVzZXJFdmVudDogXCJkZWxldGUuY3V0XCJcbiAgICAgICAgfSk7XG4gICAgbGV0IGRhdGEgPSBicm9rZW5DbGlwYm9hcmRBUEkgPyBudWxsIDogZXZlbnQuY2xpcGJvYXJkRGF0YTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmNsZWFyRGF0YSgpO1xuICAgICAgICBkYXRhLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRleHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNhcHR1cmVDb3B5KHZpZXcsIHRleHQpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbmNvbnN0IGlzRm9jdXNDaGFuZ2UgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbmZ1bmN0aW9uIGZvY3VzQ2hhbmdlVHJhbnNhY3Rpb24oc3RhdGUsIGZvY3VzKSB7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBnZXRFZmZlY3Qgb2Ygc3RhdGUuZmFjZXQoZm9jdXNDaGFuZ2VFZmZlY3QpKSB7XG4gICAgICAgIGxldCBlZmZlY3QgPSBnZXRFZmZlY3Qoc3RhdGUsIGZvY3VzKTtcbiAgICAgICAgaWYgKGVmZmVjdClcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaChlZmZlY3QpO1xuICAgIH1cbiAgICByZXR1cm4gZWZmZWN0cy5sZW5ndGggPyBzdGF0ZS51cGRhdGUoeyBlZmZlY3RzLCBhbm5vdGF0aW9uczogaXNGb2N1c0NoYW5nZS5vZih0cnVlKSB9KSA6IG51bGw7XG59XG5mdW5jdGlvbiB1cGRhdGVGb3JGb2N1c0NoYW5nZSh2aWV3KSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGxldCBmb2N1cyA9IHZpZXcuaGFzRm9jdXM7XG4gICAgICAgIGlmIChmb2N1cyAhPSB2aWV3LmlucHV0U3RhdGUubm90aWZpZWRGb2N1c2VkKSB7XG4gICAgICAgICAgICBsZXQgdHIgPSBmb2N1c0NoYW5nZVRyYW5zYWN0aW9uKHZpZXcuc3RhdGUsIGZvY3VzKTtcbiAgICAgICAgICAgIGlmICh0cilcbiAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB2aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgIH1cbiAgICB9LCAxMCk7XG59XG5vYnNlcnZlcnMuZm9jdXMgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdEZvY3VzVGltZSA9IERhdGUubm93KCk7XG4gICAgLy8gV2hlbiBmb2N1c2luZyByZXNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uLCBtb3ZlIGl0IGJhY2sgdG8gd2hlcmUgaXQgd2FzXG4gICAgaWYgKCF2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3AgJiYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsVG9wIHx8IHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsTGVmdCkpIHtcbiAgICAgICAgdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wID0gdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxUb3A7XG4gICAgICAgIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQgPSB2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHVwZGF0ZUZvckZvY3VzQ2hhbmdlKHZpZXcpO1xufTtcbm9ic2VydmVycy5ibHVyID0gdmlldyA9PiB7XG4gICAgdmlldy5vYnNlcnZlci5jbGVhclNlbGVjdGlvblJhbmdlKCk7XG4gICAgdXBkYXRlRm9yRm9jdXNDaGFuZ2Uodmlldyk7XG59O1xub2JzZXJ2ZXJzLmNvbXBvc2l0aW9uc3RhcnQgPSBvYnNlcnZlcnMuY29tcG9zaXRpb251cGRhdGUgPSB2aWV3ID0+IHtcbiAgICBpZiAodmlldy5vYnNlcnZlci5lZGl0Q29udGV4dClcbiAgICAgICAgcmV0dXJuOyAvLyBDb21wb3NpdGlvbiBoYW5kbGVkIGJ5IGVkaXQgY29udGV4dFxuICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9PSBudWxsKVxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IHRydWU7XG4gICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPCAwKSB7XG4gICAgICAgIC8vIEZJWE1FIHBvc3NpYmx5IHNldCBhIHRpbWVvdXQgdG8gY2xlYXIgaXQgYWdhaW4gb24gQW5kcm9pZFxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID0gMDtcbiAgICB9XG59O1xub2JzZXJ2ZXJzLmNvbXBvc2l0aW9uZW5kID0gdmlldyA9PiB7XG4gICAgaWYgKHZpZXcub2JzZXJ2ZXIuZWRpdENvbnRleHQpXG4gICAgICAgIHJldHVybjsgLy8gQ29tcG9zaXRpb24gaGFuZGxlZCBieSBlZGl0IGNvbnRleHRcbiAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID0gLTE7XG4gICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRW5kZWRBdCA9IERhdGUubm93KCk7XG4gICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0tleSA9IHRydWU7XG4gICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSA9IHZpZXcub2JzZXJ2ZXIucGVuZGluZ1JlY29yZHMoKS5sZW5ndGggPiAwO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkZpcnN0Q2hhbmdlID0gbnVsbDtcbiAgICBpZiAoYnJvd3Nlci5jaHJvbWUgJiYgYnJvd3Nlci5hbmRyb2lkKSB7XG4gICAgICAgIC8vIERlbGF5IGZsdXNoaW5nIGZvciBhIGJpdCBvbiBBbmRyb2lkIGJlY2F1c2UgaXQnbGwgb2Z0ZW4gZmlyZSBhXG4gICAgICAgIC8vIGJ1bmNoIG9mIGNvbnRyYWRpY3RvcnkgY2hhbmdlcyBpbiBhIHJvdyBhdCBlbmQgb2YgY29tcG9zaXRvblxuICAgICAgICB2aWV3Lm9ic2VydmVyLmZsdXNoU29vbigpO1xuICAgIH1cbiAgICBlbHNlIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlKSB7XG4gICAgICAgIC8vIElmIHdlIGZvdW5kIHBlbmRpbmcgcmVjb3Jkcywgc2NoZWR1bGUgYSBmbHVzaC5cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB2aWV3Lm9ic2VydmVyLmZsdXNoKCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHN1cmUgdGhhdCwgaWYgbm8gY2hhbmdlcyBjb21lIGluIHNvb24sIHRoZVxuICAgICAgICAvLyBjb21wb3NpdGlvbiB2aWV3IGlzIGNsZWFyZWQuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPCAwICYmIHZpZXcuZG9jVmlldy5oYXNDb21wb3NpdGlvbilcbiAgICAgICAgICAgICAgICB2aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgIH0sIDUwKTtcbiAgICB9XG59O1xub2JzZXJ2ZXJzLmNvbnRleHRtZW51ID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmxhc3RDb250ZXh0TWVudSA9IERhdGUubm93KCk7XG59O1xuaGFuZGxlcnMuYmVmb3JlaW5wdXQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIC8vIEluIEVkaXRDb250ZXh0IG1vZGUsIHdlIG11c3QgaGFuZGxlIGluc2VydFJlcGxhY2VtZW50VGV4dCBldmVudHNcbiAgICAvLyBkaXJlY3RseSwgdG8gbWFrZSBzcGVsbCBjaGVja2luZyBjb3JyZWN0aW9ucyB3b3JrXG4gICAgaWYgKGV2ZW50LmlucHV0VHlwZSA9PSBcImluc2VydFJlcGxhY2VtZW50VGV4dFwiICYmIHZpZXcub2JzZXJ2ZXIuZWRpdENvbnRleHQpIHtcbiAgICAgICAgbGV0IHRleHQgPSAoX2EgPSBldmVudC5kYXRhVHJhbnNmZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXREYXRhKFwidGV4dC9wbGFpblwiKSwgcmFuZ2VzID0gZXZlbnQuZ2V0VGFyZ2V0UmFuZ2VzKCk7XG4gICAgICAgIGlmICh0ZXh0ICYmIHJhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByID0gcmFuZ2VzWzBdO1xuICAgICAgICAgICAgbGV0IGZyb20gPSB2aWV3LnBvc0F0RE9NKHIuc3RhcnRDb250YWluZXIsIHIuc3RhcnRPZmZzZXQpLCB0byA9IHZpZXcucG9zQXRET00oci5lbmRDb250YWluZXIsIHIuZW5kT2Zmc2V0KTtcbiAgICAgICAgICAgIGFwcGx5RE9NQ2hhbmdlSW5uZXIodmlldywgeyBmcm9tLCB0bywgaW5zZXJ0OiB2aWV3LnN0YXRlLnRvVGV4dCh0ZXh0KSB9LCBudWxsKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgQ2hyb21lIEFuZHJvaWQgZG9lc24ndCBmaXJlIHVzZWZ1bCBrZXkgZXZlbnRzLCB1c2VcbiAgICAvLyBiZWZvcmVpbnB1dCB0byBkZXRlY3QgYmFja3NwYWNlIChhbmQgcG9zc2libHkgZW50ZXIgYW5kIGRlbGV0ZSxcbiAgICAvLyBidXQgdGhvc2UgdXN1YWxseSBkb24ndCBldmVuIHNlZW0gdG8gZmlyZSBiZWZvcmVpbnB1dCBldmVudHMgYXRcbiAgICAvLyB0aGUgbW9tZW50KSBhbmQgZmFrZSBhIGtleSBldmVudCBmb3IgaXQuXG4gICAgLy9cbiAgICAvLyAocHJldmVudERlZmF1bHQgb24gYmVmb3JlaW5wdXQsIHRob3VnaCBzdXBwb3J0ZWQgaW4gdGhlIHNwZWMsXG4gICAgLy8gc2VlbXMgdG8gZG8gbm90aGluZyBhdCBhbGwgb24gQ2hyb21lKS5cbiAgICBsZXQgcGVuZGluZztcbiAgICBpZiAoYnJvd3Nlci5jaHJvbWUgJiYgYnJvd3Nlci5hbmRyb2lkICYmIChwZW5kaW5nID0gUGVuZGluZ0tleXMuZmluZChrZXkgPT4ga2V5LmlucHV0VHlwZSA9PSBldmVudC5pbnB1dFR5cGUpKSkge1xuICAgICAgICB2aWV3Lm9ic2VydmVyLmRlbGF5QW5kcm9pZEtleShwZW5kaW5nLmtleSwgcGVuZGluZy5rZXlDb2RlKTtcbiAgICAgICAgaWYgKHBlbmRpbmcua2V5ID09IFwiQmFja3NwYWNlXCIgfHwgcGVuZGluZy5rZXkgPT0gXCJEZWxldGVcIikge1xuICAgICAgICAgICAgbGV0IHN0YXJ0Vmlld0hlaWdodCA9ICgoX2IgPSB3aW5kb3cudmlzdWFsVmlld3BvcnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5oZWlnaHQpIHx8IDA7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgLy8gQmFja3NwYWNpbmcgbmVhciB1bmVkaXRhYmxlIG5vZGVzIG9uIENocm9tZSBBbmRyb2lkIHNvbWV0aW1lc1xuICAgICAgICAgICAgICAgIC8vIGNsb3NlcyB0aGUgdmlydHVhbCBrZXlib2FyZC4gVGhpcyB0cmllcyB0byBjcnVkZWx5IGRldGVjdFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgYW5kIHJlZm9jdXMgdG8gZ2V0IGl0IGJhY2suXG4gICAgICAgICAgICAgICAgaWYgKCgoKF9hID0gd2luZG93LnZpc3VhbFZpZXdwb3J0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGVpZ2h0KSB8fCAwKSA+IHN0YXJ0Vmlld0hlaWdodCArIDEwICYmIHZpZXcuaGFzRm9jdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5jb250ZW50RE9NLmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJyb3dzZXIuaW9zICYmIGV2ZW50LmlucHV0VHlwZSA9PSBcImRlbGV0ZUNvbnRlbnRGb3J3YXJkXCIpIHtcbiAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uLCBET00gY2hhbmdlcyAoYW5kIGJlZm9yZWlucHV0KSBoYXBwZW4gX2JlZm9yZV9cbiAgICAgICAgLy8gdGhlIGtleSBldmVudCBmb3IgY3RybC1kIG9uIGlPUyB3aGVuIHVzaW5nIGFuIGV4dGVybmFsXG4gICAgICAgIC8vIGtleWJvYXJkLlxuICAgICAgICB2aWV3Lm9ic2VydmVyLmZsdXNoU29vbigpO1xuICAgIH1cbiAgICAvLyBTYWZhcmkgd2lsbCBvY2Nhc2lvbmFsbHkgZm9yZ2V0IHRvIGZpcmUgY29tcG9zaXRpb25lbmQgYXQgdGhlIGVuZCBvZiBhIGRlYWQta2V5IGNvbXBvc2l0aW9uXG4gICAgaWYgKGJyb3dzZXIuc2FmYXJpICYmIGV2ZW50LmlucHV0VHlwZSA9PSBcImluc2VydFRleHRcIiAmJiB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDApIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBvYnNlcnZlcnMuY29tcG9zaXRpb25lbmQodmlldywgZXZlbnQpLCAyMCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5jb25zdCBhcHBsaWVkRmlyZWZveEhhY2sgPSAvKkBfX1BVUkVfXyovbmV3IFNldDtcbi8vIEluIEZpcmVmb3gsIHdoZW4gY3V0L2NvcHkgaGFuZGxlcnMgYXJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCwgdGhhdFxuLy8gc29tZWhvdyBhdm9pZHMgYSBidWcgd2hlcmUgdGhvc2UgZXZlbnRzIGFyZW4ndCBmaXJlZCB3aGVuIHRoZVxuLy8gc2VsZWN0aW9uIGlzIGVtcHR5LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvZGV2L2lzc3Vlcy8xMDgyXG4vLyBhbmQgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTk1OTYxXG5mdW5jdGlvbiBmaXJlZm94Q29weUN1dEhhY2soZG9jKSB7XG4gICAgaWYgKCFhcHBsaWVkRmlyZWZveEhhY2suaGFzKGRvYykpIHtcbiAgICAgICAgYXBwbGllZEZpcmVmb3hIYWNrLmFkZChkb2MpO1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcihcImNvcHlcIiwgKCkgPT4geyB9KTtcbiAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoXCJjdXRcIiwgKCkgPT4geyB9KTtcbiAgICB9XG59XG5cbmNvbnN0IHdyYXBwaW5nV2hpdGVTcGFjZSA9IFtcInByZS13cmFwXCIsIFwibm9ybWFsXCIsIFwicHJlLWxpbmVcIiwgXCJicmVhay1zcGFjZXNcIl07XG4vLyBVc2VkIHRvIHRyYWNrLCBkdXJpbmcgdXBkYXRlSGVpZ2h0LCBpZiBhbnkgYWN0dWFsIGhlaWdodHMgY2hhbmdlZFxubGV0IGhlaWdodENoYW5nZUZsYWcgPSBmYWxzZTtcbmZ1bmN0aW9uIGNsZWFySGVpZ2h0Q2hhbmdlRmxhZygpIHsgaGVpZ2h0Q2hhbmdlRmxhZyA9IGZhbHNlOyB9XG5jbGFzcyBIZWlnaHRPcmFjbGUge1xuICAgIGNvbnN0cnVjdG9yKGxpbmVXcmFwcGluZykge1xuICAgICAgICB0aGlzLmxpbmVXcmFwcGluZyA9IGxpbmVXcmFwcGluZztcbiAgICAgICAgdGhpcy5kb2MgPSBUZXh0LmVtcHR5O1xuICAgICAgICB0aGlzLmhlaWdodFNhbXBsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5saW5lSGVpZ2h0ID0gMTQ7IC8vIFRoZSBoZWlnaHQgb2YgYW4gZW50aXJlIGxpbmUgKGxpbmUtaGVpZ2h0KVxuICAgICAgICB0aGlzLmNoYXJXaWR0aCA9IDc7XG4gICAgICAgIHRoaXMudGV4dEhlaWdodCA9IDE0OyAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBhY3R1YWwgZm9udCAoZm9udC1zaXplKVxuICAgICAgICB0aGlzLmxpbmVMZW5ndGggPSAzMDtcbiAgICB9XG4gICAgaGVpZ2h0Rm9yR2FwKGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHRoaXMuZG9jLmxpbmVBdCh0bykubnVtYmVyIC0gdGhpcy5kb2MubGluZUF0KGZyb20pLm51bWJlciArIDE7XG4gICAgICAgIGlmICh0aGlzLmxpbmVXcmFwcGluZylcbiAgICAgICAgICAgIGxpbmVzICs9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoKHRvIC0gZnJvbSkgLSAobGluZXMgKiB0aGlzLmxpbmVMZW5ndGggKiAwLjUpKSAvIHRoaXMubGluZUxlbmd0aCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lSGVpZ2h0ICogbGluZXM7XG4gICAgfVxuICAgIGhlaWdodEZvckxpbmUobGVuZ3RoKSB7XG4gICAgICAgIGlmICghdGhpcy5saW5lV3JhcHBpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saW5lSGVpZ2h0O1xuICAgICAgICBsZXQgbGluZXMgPSAxICsgTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChsZW5ndGggLSB0aGlzLmxpbmVMZW5ndGgpIC8gKHRoaXMubGluZUxlbmd0aCAtIDUpKSk7XG4gICAgICAgIHJldHVybiBsaW5lcyAqIHRoaXMubGluZUhlaWdodDtcbiAgICB9XG4gICAgc2V0RG9jKGRvYykgeyB0aGlzLmRvYyA9IGRvYzsgcmV0dXJuIHRoaXM7IH1cbiAgICBtdXN0UmVmcmVzaEZvcldyYXBwaW5nKHdoaXRlU3BhY2UpIHtcbiAgICAgICAgcmV0dXJuICh3cmFwcGluZ1doaXRlU3BhY2UuaW5kZXhPZih3aGl0ZVNwYWNlKSA+IC0xKSAhPSB0aGlzLmxpbmVXcmFwcGluZztcbiAgICB9XG4gICAgbXVzdFJlZnJlc2hGb3JIZWlnaHRzKGxpbmVIZWlnaHRzKSB7XG4gICAgICAgIGxldCBuZXdIZWlnaHQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lSGVpZ2h0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGggPSBsaW5lSGVpZ2h0c1tpXTtcbiAgICAgICAgICAgIGlmIChoIDwgMCkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmhlaWdodFNhbXBsZXNbTWF0aC5mbG9vcihoICogMTApXSkgeyAvLyBSb3VuZCB0byAuMSBwaXhlbHNcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlc1tNYXRoLmZsb29yKGggKiAxMCldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3SGVpZ2h0O1xuICAgIH1cbiAgICByZWZyZXNoKHdoaXRlU3BhY2UsIGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCwgbGluZUxlbmd0aCwga25vd25IZWlnaHRzKSB7XG4gICAgICAgIGxldCBsaW5lV3JhcHBpbmcgPSB3cmFwcGluZ1doaXRlU3BhY2UuaW5kZXhPZih3aGl0ZVNwYWNlKSA+IC0xO1xuICAgICAgICBsZXQgY2hhbmdlZCA9IE1hdGgucm91bmQobGluZUhlaWdodCkgIT0gTWF0aC5yb3VuZCh0aGlzLmxpbmVIZWlnaHQpIHx8IHRoaXMubGluZVdyYXBwaW5nICE9IGxpbmVXcmFwcGluZztcbiAgICAgICAgdGhpcy5saW5lV3JhcHBpbmcgPSBsaW5lV3JhcHBpbmc7XG4gICAgICAgIHRoaXMubGluZUhlaWdodCA9IGxpbmVIZWlnaHQ7XG4gICAgICAgIHRoaXMuY2hhcldpZHRoID0gY2hhcldpZHRoO1xuICAgICAgICB0aGlzLnRleHRIZWlnaHQgPSB0ZXh0SGVpZ2h0O1xuICAgICAgICB0aGlzLmxpbmVMZW5ndGggPSBsaW5lTGVuZ3RoO1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5oZWlnaHRTYW1wbGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtub3duSGVpZ2h0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBoID0ga25vd25IZWlnaHRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChoIDwgMClcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRTYW1wbGVzW01hdGguZmxvb3IoaCAqIDEwKV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH1cbn1cbi8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgYnkgYHVwZGF0ZUhlaWdodGAgdG8gbWFrZSBET00gbWVhc3VyZW1lbnRzXG4vLyBhcnJpdmUgYXQgdGhlIHJpZ2h0IG5pZGVzLiBUaGUgYGhlaWdodHNgIGFycmF5IGlzIGEgc2VxdWVuY2Ugb2Zcbi8vIGJsb2NrIGhlaWdodHMsIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gYGZyb21gLlxuY2xhc3MgTWVhc3VyZWRIZWlnaHRzIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCBoZWlnaHRzKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMuaGVpZ2h0cyA9IGhlaWdodHM7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIH1cbiAgICBnZXQgbW9yZSgpIHsgcmV0dXJuIHRoaXMuaW5kZXggPCB0aGlzLmhlaWdodHMubGVuZ3RoOyB9XG59XG4vKipcblJlY29yZCB1c2VkIHRvIHJlcHJlc2VudCBpbmZvcm1hdGlvbiBhYm91dCBhIGJsb2NrLWxldmVsIGVsZW1lbnRcbmluIHRoZSBlZGl0b3Igdmlldy5cbiovXG5jbGFzcyBCbG9ja0luZm8ge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHRoZSBlbGVtZW50IGluIHRoZSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGVsZW1lbnQuXG4gICAgKi9cbiAgICBsZW5ndGgsIFxuICAgIC8qKlxuICAgIFRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgKHJlbGF0aXZlIHRvIHRoZSB0b3Agb2YgdGhlXG4gICAgZG9jdW1lbnQpLlxuICAgICovXG4gICAgdG9wLCBcbiAgICAvKipcbiAgICBJdHMgaGVpZ2h0LlxuICAgICovXG4gICAgaGVpZ2h0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWwgV2VpcmQgcGFja2VkIGZpZWxkIHRoYXQgaG9sZHMgYW4gYXJyYXkgb2YgY2hpbGRyZW5cbiAgICBmb3IgY29tcG9zaXRlIGJsb2NrcywgYSBkZWNvcmF0aW9uIGZvciBibG9jayB3aWRnZXRzLCBhbmQgYVxuICAgIG51bWJlciBpbmRpY2F0aW5nIHRoZSBhbW91bnQgb2Ygd2lkZ2V0LWNyZWF0ZSBsaW5lIGJyZWFrcyBmb3JcbiAgICB0ZXh0IGJsb2Nrcy5cbiAgICAqL1xuICAgIF9jb250ZW50KSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBfY29udGVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHR5cGUgb2YgZWxlbWVudCB0aGlzIGlzLiBXaGVuIHF1ZXJ5aW5nIGxpbmVzLCB0aGlzIG1heSBiZVxuICAgIGFuIGFycmF5IG9mIGFsbCB0aGUgYmxvY2tzIHRoYXQgbWFrZSB1cCB0aGUgbGluZS5cbiAgICAqL1xuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuX2NvbnRlbnQgPT0gXCJudW1iZXJcIiA/IEJsb2NrVHlwZS5UZXh0IDpcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5fY29udGVudCkgPyB0aGlzLl9jb250ZW50IDogdGhpcy5fY29udGVudC50eXBlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHRoZSBlbGVtZW50IGFzIGEgZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgdG8oKSB7IHJldHVybiB0aGlzLmZyb20gKyB0aGlzLmxlbmd0aDsgfVxuICAgIC8qKlxuICAgIFRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQuXG4gICAgKi9cbiAgICBnZXQgYm90dG9tKCkgeyByZXR1cm4gdGhpcy50b3AgKyB0aGlzLmhlaWdodDsgfVxuICAgIC8qKlxuICAgIElmIHRoaXMgaXMgYSB3aWRnZXQgYmxvY2ssIHRoaXMgd2lsbCByZXR1cm4gdGhlIHdpZGdldFxuICAgIGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgICAqL1xuICAgIGdldCB3aWRnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50IGluc3RhbmNlb2YgUG9pbnREZWNvcmF0aW9uID8gdGhpcy5fY29udGVudC53aWRnZXQgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIGEgdGV4dGJsb2NrLCB0aGlzIGhvbGRzIHRoZSBudW1iZXIgb2YgbGluZSBicmVha3NcbiAgICB0aGF0IGFwcGVhciBpbiB3aWRnZXRzIGluc2lkZSB0aGUgYmxvY2suXG4gICAgKi9cbiAgICBnZXQgd2lkZ2V0TGluZUJyZWFrcygpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9jb250ZW50ID09IFwibnVtYmVyXCIgPyB0aGlzLl9jb250ZW50IDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBqb2luKG90aGVyKSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gKEFycmF5LmlzQXJyYXkodGhpcy5fY29udGVudCkgPyB0aGlzLl9jb250ZW50IDogW3RoaXNdKVxuICAgICAgICAgICAgLmNvbmNhdChBcnJheS5pc0FycmF5KG90aGVyLl9jb250ZW50KSA/IG90aGVyLl9jb250ZW50IDogW290aGVyXSk7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKHRoaXMuZnJvbSwgdGhpcy5sZW5ndGggKyBvdGhlci5sZW5ndGgsIHRoaXMudG9wLCB0aGlzLmhlaWdodCArIG90aGVyLmhlaWdodCwgY29udGVudCk7XG4gICAgfVxufVxudmFyIFF1ZXJ5VHlwZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFF1ZXJ5VHlwZSkge1xuICAgIFF1ZXJ5VHlwZVtRdWVyeVR5cGVbXCJCeVBvc1wiXSA9IDBdID0gXCJCeVBvc1wiO1xuICAgIFF1ZXJ5VHlwZVtRdWVyeVR5cGVbXCJCeUhlaWdodFwiXSA9IDFdID0gXCJCeUhlaWdodFwiO1xuICAgIFF1ZXJ5VHlwZVtRdWVyeVR5cGVbXCJCeVBvc05vSGVpZ2h0XCJdID0gMl0gPSBcIkJ5UG9zTm9IZWlnaHRcIjtcbnJldHVybiBRdWVyeVR5cGV9KShRdWVyeVR5cGUgfHwgKFF1ZXJ5VHlwZSA9IHt9KSk7XG5jb25zdCBFcHNpbG9uID0gMWUtMztcbmNsYXNzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCAvLyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY292ZXJlZFxuICAgIGhlaWdodCwgLy8gSGVpZ2h0IG9mIHRoaXMgcGFydCBvZiB0aGUgZG9jdW1lbnRcbiAgICBmbGFncyA9IDIgLyogRmxhZy5PdXRkYXRlZCAqLykge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB9XG4gICAgZ2V0IG91dGRhdGVkKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiAyIC8qIEZsYWcuT3V0ZGF0ZWQgKi8pID4gMDsgfVxuICAgIHNldCBvdXRkYXRlZCh2YWx1ZSkgeyB0aGlzLmZsYWdzID0gKHZhbHVlID8gMiAvKiBGbGFnLk91dGRhdGVkICovIDogMCkgfCAodGhpcy5mbGFncyAmIH4yIC8qIEZsYWcuT3V0ZGF0ZWQgKi8pOyB9XG4gICAgc2V0SGVpZ2h0KGhlaWdodCkge1xuICAgICAgICBpZiAodGhpcy5oZWlnaHQgIT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5oZWlnaHQgLSBoZWlnaHQpID4gRXBzaWxvbilcbiAgICAgICAgICAgICAgICBoZWlnaHRDaGFuZ2VGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJhc2UgY2FzZSBpcyB0byByZXBsYWNlIGEgbGVhZiBub2RlLCB3aGljaCBzaW1wbHkgYnVpbGRzIGEgdHJlZVxuICAgIC8vIGZyb20gdGhlIG5ldyBub2RlcyBhbmQgcmV0dXJucyB0aGF0IChIZWlnaHRNYXBCcmFuY2ggYW5kXG4gICAgLy8gSGVpZ2h0TWFwR2FwIG92ZXJyaWRlIHRoaXMgdG8gYWN0dWFsbHkgdXNlIGZyb20vdG8pXG4gICAgcmVwbGFjZShfZnJvbSwgX3RvLCBub2Rlcykge1xuICAgICAgICByZXR1cm4gSGVpZ2h0TWFwLm9mKG5vZGVzKTtcbiAgICB9XG4gICAgLy8gQWdhaW4sIHRoZXNlIGFyZSBiYXNlIGNhc2VzLCBhbmQgYXJlIG92ZXJyaWRkZW4gZm9yIGJyYW5jaCBhbmQgZ2FwIG5vZGVzLlxuICAgIGRlY29tcG9zZUxlZnQoX3RvLCByZXN1bHQpIHsgcmVzdWx0LnB1c2godGhpcyk7IH1cbiAgICBkZWNvbXBvc2VSaWdodChfZnJvbSwgcmVzdWx0KSB7IHJlc3VsdC5wdXNoKHRoaXMpOyB9XG4gICAgYXBwbHlDaGFuZ2VzKGRlY29yYXRpb25zLCBvbGREb2MsIG9yYWNsZSwgY2hhbmdlcykge1xuICAgICAgICBsZXQgbWUgPSB0aGlzLCBkb2MgPSBvcmFjbGUuZG9jO1xuICAgICAgICBmb3IgKGxldCBpID0gY2hhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHsgZnJvbUEsIHRvQSwgZnJvbUIsIHRvQiB9ID0gY2hhbmdlc1tpXTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IG1lLmxpbmVBdChmcm9tQSwgUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQsIG9yYWNsZS5zZXREb2Mob2xkRG9jKSwgMCwgMCk7XG4gICAgICAgICAgICBsZXQgZW5kID0gc3RhcnQudG8gPj0gdG9BID8gc3RhcnQgOiBtZS5saW5lQXQodG9BLCBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCwgb3JhY2xlLCAwLCAwKTtcbiAgICAgICAgICAgIHRvQiArPSBlbmQudG8gLSB0b0E7XG4gICAgICAgICAgICB0b0EgPSBlbmQudG87XG4gICAgICAgICAgICB3aGlsZSAoaSA+IDAgJiYgc3RhcnQuZnJvbSA8PSBjaGFuZ2VzW2kgLSAxXS50b0EpIHtcbiAgICAgICAgICAgICAgICBmcm9tQSA9IGNoYW5nZXNbaSAtIDFdLmZyb21BO1xuICAgICAgICAgICAgICAgIGZyb21CID0gY2hhbmdlc1tpIC0gMV0uZnJvbUI7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tQSA8IHN0YXJ0LmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbWUubGluZUF0KGZyb21BLCBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCwgb3JhY2xlLCAwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21CICs9IHN0YXJ0LmZyb20gLSBmcm9tQTtcbiAgICAgICAgICAgIGZyb21BID0gc3RhcnQuZnJvbTtcbiAgICAgICAgICAgIGxldCBub2RlcyA9IE5vZGVCdWlsZGVyLmJ1aWxkKG9yYWNsZS5zZXREb2MoZG9jKSwgZGVjb3JhdGlvbnMsIGZyb21CLCB0b0IpO1xuICAgICAgICAgICAgbWUgPSByZXBsYWNlKG1lLCBtZS5yZXBsYWNlKGZyb21BLCB0b0EsIG5vZGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lLnVwZGF0ZUhlaWdodChvcmFjbGUsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW1wdHkoKSB7IHJldHVybiBuZXcgSGVpZ2h0TWFwVGV4dCgwLCAwKTsgfVxuICAgIC8vIG5vZGVzIHVzZXMgbnVsbCB2YWx1ZXMgdG8gaW5kaWNhdGUgdGhlIHBvc2l0aW9uIG9mIGxpbmUgYnJlYWtzLlxuICAgIC8vIFRoZXJlIGFyZSBuZXZlciBsaW5lIGJyZWFrcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBhcnJheSwgb3JcbiAgICAvLyB0d28gbGluZSBicmVha3MgbmV4dCB0byBlYWNoIG90aGVyLCBhbmQgdGhlIGFycmF5IGlzbid0IGFsbG93ZWRcbiAgICAvLyB0byBiZSBlbXB0eSAoc2FtZSByZXN0cmljdGlvbnMgYXMgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGJ1aWxkZXIpLlxuICAgIHN0YXRpYyBvZihub2Rlcykge1xuICAgICAgICBpZiAobm9kZXMubGVuZ3RoID09IDEpXG4gICAgICAgICAgICByZXR1cm4gbm9kZXNbMF07XG4gICAgICAgIGxldCBpID0gMCwgaiA9IG5vZGVzLmxlbmd0aCwgYmVmb3JlID0gMCwgYWZ0ZXIgPSAwO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoaSA9PSBqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZSA+IGFmdGVyICogMikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BsaXQgPSBub2Rlc1tpIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdC5icmVhaylcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZSgtLWksIDEsIHNwbGl0LmxlZnQsIG51bGwsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKC0taSwgMSwgc3BsaXQubGVmdCwgc3BsaXQucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBqICs9IDEgKyBzcGxpdC5icmVhaztcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIC09IHNwbGl0LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFmdGVyID4gYmVmb3JlICogMikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BsaXQgPSBub2Rlc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0LmJyZWFrKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGosIDEsIHNwbGl0LmxlZnQsIG51bGwsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGosIDEsIHNwbGl0LmxlZnQsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgaiArPSAyICsgc3BsaXQuYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyIC09IHNwbGl0LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiZWZvcmUgPCBhZnRlcikge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZXNbaSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dClcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlICs9IG5leHQuc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZXNbLS1qXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dClcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgKz0gbmV4dC5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBicmsgPSAwO1xuICAgICAgICBpZiAobm9kZXNbaSAtIDFdID09IG51bGwpIHtcbiAgICAgICAgICAgIGJyayA9IDE7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgYnJrID0gMTtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEhlaWdodE1hcEJyYW5jaChIZWlnaHRNYXAub2Yobm9kZXMuc2xpY2UoMCwgaSkpLCBicmssIEhlaWdodE1hcC5vZihub2Rlcy5zbGljZShqKSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlcGxhY2Uob2xkLCB2YWwpIHtcbiAgICBpZiAob2xkID09IHZhbClcbiAgICAgICAgcmV0dXJuIG9sZDtcbiAgICBpZiAob2xkLmNvbnN0cnVjdG9yICE9IHZhbC5jb25zdHJ1Y3RvcilcbiAgICAgICAgaGVpZ2h0Q2hhbmdlRmxhZyA9IHRydWU7XG4gICAgcmV0dXJuIHZhbDtcbn1cbkhlaWdodE1hcC5wcm90b3R5cGUuc2l6ZSA9IDE7XG5jbGFzcyBIZWlnaHRNYXBCbG9jayBleHRlbmRzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCBoZWlnaHQsIGRlY28pIHtcbiAgICAgICAgc3VwZXIobGVuZ3RoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmRlY28gPSBkZWNvO1xuICAgIH1cbiAgICBibG9ja0F0KF9oZWlnaHQsIF9vcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKG9mZnNldCwgdGhpcy5sZW5ndGgsIHRvcCwgdGhpcy5oZWlnaHQsIHRoaXMuZGVjbyB8fCAwKTtcbiAgICB9XG4gICAgbGluZUF0KF92YWx1ZSwgX3R5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tBdCgwLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpIHtcbiAgICAgICAgaWYgKGZyb20gPD0gb2Zmc2V0ICsgdGhpcy5sZW5ndGggJiYgdG8gPj0gb2Zmc2V0KVxuICAgICAgICAgICAgZih0aGlzLmJsb2NrQXQoMCwgb3JhY2xlLCB0b3AsIG9mZnNldCkpO1xuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBfZm9yY2UgPSBmYWxzZSwgbWVhc3VyZWQpIHtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gb2Zmc2V0ICYmIG1lYXN1cmVkLm1vcmUpXG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodChtZWFzdXJlZC5oZWlnaHRzW21lYXN1cmVkLmluZGV4KytdKTtcbiAgICAgICAgdGhpcy5vdXRkYXRlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgYmxvY2soJHt0aGlzLmxlbmd0aH0pYDsgfVxufVxuY2xhc3MgSGVpZ2h0TWFwVGV4dCBleHRlbmRzIEhlaWdodE1hcEJsb2NrIHtcbiAgICBjb25zdHJ1Y3RvcihsZW5ndGgsIGhlaWdodCkge1xuICAgICAgICBzdXBlcihsZW5ndGgsIGhlaWdodCwgbnVsbCk7XG4gICAgICAgIHRoaXMuY29sbGFwc2VkID0gMDsgLy8gQW1vdW50IG9mIGNvbGxhcHNlZCBjb250ZW50IGluIHRoZSBsaW5lXG4gICAgICAgIHRoaXMud2lkZ2V0SGVpZ2h0ID0gMDsgLy8gTWF4aW11bSBpbmxpbmUgd2lkZ2V0IGhlaWdodFxuICAgICAgICB0aGlzLmJyZWFrcyA9IDA7IC8vIE51bWJlciBvZiB3aWRnZXQtaW50cm9kdWNlZCBsaW5lIGJyZWFrcyBvbiB0aGUgbGluZVxuICAgIH1cbiAgICBibG9ja0F0KF9oZWlnaHQsIF9vcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKG9mZnNldCwgdGhpcy5sZW5ndGgsIHRvcCwgdGhpcy5oZWlnaHQsIHRoaXMuYnJlYWtzKTtcbiAgICB9XG4gICAgcmVwbGFjZShfZnJvbSwgX3RvLCBub2Rlcykge1xuICAgICAgICBsZXQgbm9kZSA9IG5vZGVzWzBdO1xuICAgICAgICBpZiAobm9kZXMubGVuZ3RoID09IDEgJiYgKG5vZGUgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0IHx8IG5vZGUgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXAgJiYgKG5vZGUuZmxhZ3MgJiA0IC8qIEZsYWcuU2luZ2xlTGluZSAqLykpICYmXG4gICAgICAgICAgICBNYXRoLmFicyh0aGlzLmxlbmd0aCAtIG5vZGUubGVuZ3RoKSA8IDEwKSB7XG4gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcClcbiAgICAgICAgICAgICAgICBub2RlID0gbmV3IEhlaWdodE1hcFRleHQobm9kZS5sZW5ndGgsIHRoaXMuaGVpZ2h0KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBub2RlLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICAgICAgaWYgKCF0aGlzLm91dGRhdGVkKVxuICAgICAgICAgICAgICAgIG5vZGUub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZihub2Rlcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlSGVpZ2h0KG9yYWNsZSwgb2Zmc2V0ID0gMCwgZm9yY2UgPSBmYWxzZSwgbWVhc3VyZWQpIHtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gb2Zmc2V0ICYmIG1lYXN1cmVkLm1vcmUpXG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodChtZWFzdXJlZC5oZWlnaHRzW21lYXN1cmVkLmluZGV4KytdKTtcbiAgICAgICAgZWxzZSBpZiAoZm9yY2UgfHwgdGhpcy5vdXRkYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KE1hdGgubWF4KHRoaXMud2lkZ2V0SGVpZ2h0LCBvcmFjbGUuaGVpZ2h0Rm9yTGluZSh0aGlzLmxlbmd0aCAtIHRoaXMuY29sbGFwc2VkKSkgK1xuICAgICAgICAgICAgICAgIHRoaXMuYnJlYWtzICogb3JhY2xlLmxpbmVIZWlnaHQpO1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBsaW5lKCR7dGhpcy5sZW5ndGh9JHt0aGlzLmNvbGxhcHNlZCA/IC10aGlzLmNvbGxhcHNlZCA6IFwiXCJ9JHt0aGlzLndpZGdldEhlaWdodCA/IFwiOlwiICsgdGhpcy53aWRnZXRIZWlnaHQgOiBcIlwifSlgO1xuICAgIH1cbn1cbmNsYXNzIEhlaWdodE1hcEdhcCBleHRlbmRzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoKSB7IHN1cGVyKGxlbmd0aCwgMCk7IH1cbiAgICBoZWlnaHRNZXRyaWNzKG9yYWNsZSwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBmaXJzdExpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdChvZmZzZXQpLm51bWJlciwgbGFzdExpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdChvZmZzZXQgKyB0aGlzLmxlbmd0aCkubnVtYmVyO1xuICAgICAgICBsZXQgbGluZXMgPSBsYXN0TGluZSAtIGZpcnN0TGluZSArIDE7XG4gICAgICAgIGxldCBwZXJMaW5lLCBwZXJDaGFyID0gMDtcbiAgICAgICAgaWYgKG9yYWNsZS5saW5lV3JhcHBpbmcpIHtcbiAgICAgICAgICAgIGxldCB0b3RhbFBlckxpbmUgPSBNYXRoLm1pbih0aGlzLmhlaWdodCwgb3JhY2xlLmxpbmVIZWlnaHQgKiBsaW5lcyk7XG4gICAgICAgICAgICBwZXJMaW5lID0gdG90YWxQZXJMaW5lIC8gbGluZXM7XG4gICAgICAgICAgICBpZiAodGhpcy5sZW5ndGggPiBsaW5lcyArIDEpXG4gICAgICAgICAgICAgICAgcGVyQ2hhciA9ICh0aGlzLmhlaWdodCAtIHRvdGFsUGVyTGluZSkgLyAodGhpcy5sZW5ndGggLSBsaW5lcyAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGVyTGluZSA9IHRoaXMuaGVpZ2h0IC8gbGluZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZmlyc3RMaW5lLCBsYXN0TGluZSwgcGVyTGluZSwgcGVyQ2hhciB9O1xuICAgIH1cbiAgICBibG9ja0F0KGhlaWdodCwgb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICBsZXQgeyBmaXJzdExpbmUsIGxhc3RMaW5lLCBwZXJMaW5lLCBwZXJDaGFyIH0gPSB0aGlzLmhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpO1xuICAgICAgICBpZiAob3JhY2xlLmxpbmVXcmFwcGluZykge1xuICAgICAgICAgICAgbGV0IGd1ZXNzID0gb2Zmc2V0ICsgKGhlaWdodCA8IG9yYWNsZS5saW5lSGVpZ2h0ID8gMFxuICAgICAgICAgICAgICAgIDogTWF0aC5yb3VuZChNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAoaGVpZ2h0IC0gdG9wKSAvIHRoaXMuaGVpZ2h0KSkgKiB0aGlzLmxlbmd0aCkpO1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdChndWVzcyksIGxpbmVIZWlnaHQgPSBwZXJMaW5lICsgbGluZS5sZW5ndGggKiBwZXJDaGFyO1xuICAgICAgICAgICAgbGV0IGxpbmVUb3AgPSBNYXRoLm1heCh0b3AsIGhlaWdodCAtIGxpbmVIZWlnaHQgLyAyKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGxpbmUuZnJvbSwgbGluZS5sZW5ndGgsIGxpbmVUb3AsIGxpbmVIZWlnaHQsIDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihsYXN0TGluZSAtIGZpcnN0TGluZSwgTWF0aC5mbG9vcigoaGVpZ2h0IC0gdG9wKSAvIHBlckxpbmUpKSk7XG4gICAgICAgICAgICBsZXQgeyBmcm9tLCBsZW5ndGggfSA9IG9yYWNsZS5kb2MubGluZShmaXJzdExpbmUgKyBsaW5lKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGZyb20sIGxlbmd0aCwgdG9wICsgcGVyTGluZSAqIGxpbmUsIHBlckxpbmUsIDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxpbmVBdCh2YWx1ZSwgdHlwZSwgb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICBpZiAodHlwZSA9PSBRdWVyeVR5cGUuQnlIZWlnaHQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ibG9ja0F0KHZhbHVlLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KTtcbiAgICAgICAgaWYgKHR5cGUgPT0gUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQpIHtcbiAgICAgICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSBvcmFjbGUuZG9jLmxpbmVBdCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhmcm9tLCB0byAtIGZyb20sIDAsIDAsIDApO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IGZpcnN0TGluZSwgcGVyTGluZSwgcGVyQ2hhciB9ID0gdGhpcy5oZWlnaHRNZXRyaWNzKG9yYWNsZSwgb2Zmc2V0KTtcbiAgICAgICAgbGV0IGxpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdCh2YWx1ZSksIGxpbmVIZWlnaHQgPSBwZXJMaW5lICsgbGluZS5sZW5ndGggKiBwZXJDaGFyO1xuICAgICAgICBsZXQgbGluZXNBYm92ZSA9IGxpbmUubnVtYmVyIC0gZmlyc3RMaW5lO1xuICAgICAgICBsZXQgbGluZVRvcCA9IHRvcCArIHBlckxpbmUgKiBsaW5lc0Fib3ZlICsgcGVyQ2hhciAqIChsaW5lLmZyb20gLSBvZmZzZXQgLSBsaW5lc0Fib3ZlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8obGluZS5mcm9tLCBsaW5lLmxlbmd0aCwgTWF0aC5tYXgodG9wLCBNYXRoLm1pbihsaW5lVG9wLCB0b3AgKyB0aGlzLmhlaWdodCAtIGxpbmVIZWlnaHQpKSwgbGluZUhlaWdodCwgMCk7XG4gICAgfVxuICAgIGZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHRvcCwgb2Zmc2V0LCBmKSB7XG4gICAgICAgIGZyb20gPSBNYXRoLm1heChmcm9tLCBvZmZzZXQpO1xuICAgICAgICB0byA9IE1hdGgubWluKHRvLCBvZmZzZXQgKyB0aGlzLmxlbmd0aCk7XG4gICAgICAgIGxldCB7IGZpcnN0TGluZSwgcGVyTGluZSwgcGVyQ2hhciB9ID0gdGhpcy5oZWlnaHRNZXRyaWNzKG9yYWNsZSwgb2Zmc2V0KTtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gZnJvbSwgbGluZVRvcCA9IHRvcDsgcG9zIDw9IHRvOykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICAgICAgaWYgKHBvcyA9PSBmcm9tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmVzQWJvdmUgPSBsaW5lLm51bWJlciAtIGZpcnN0TGluZTtcbiAgICAgICAgICAgICAgICBsaW5lVG9wICs9IHBlckxpbmUgKiBsaW5lc0Fib3ZlICsgcGVyQ2hhciAqIChmcm9tIC0gb2Zmc2V0IC0gbGluZXNBYm92ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbGluZUhlaWdodCA9IHBlckxpbmUgKyBwZXJDaGFyICogbGluZS5sZW5ndGg7XG4gICAgICAgICAgICBmKG5ldyBCbG9ja0luZm8obGluZS5mcm9tLCBsaW5lLmxlbmd0aCwgbGluZVRvcCwgbGluZUhlaWdodCwgMCkpO1xuICAgICAgICAgICAgbGluZVRvcCArPSBsaW5lSGVpZ2h0O1xuICAgICAgICAgICAgcG9zID0gbGluZS50byArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShmcm9tLCB0bywgbm9kZXMpIHtcbiAgICAgICAgbGV0IGFmdGVyID0gdGhpcy5sZW5ndGggLSB0bztcbiAgICAgICAgaWYgKGFmdGVyID4gMCkge1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGlmIChsYXN0IGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwKVxuICAgICAgICAgICAgICAgIG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdID0gbmV3IEhlaWdodE1hcEdhcChsYXN0Lmxlbmd0aCArIGFmdGVyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG51bGwsIG5ldyBIZWlnaHRNYXBHYXAoYWZ0ZXIgLSAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZyb20gPiAwKSB7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSBub2Rlc1swXTtcbiAgICAgICAgICAgIGlmIChmaXJzdCBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcClcbiAgICAgICAgICAgICAgICBub2Rlc1swXSA9IG5ldyBIZWlnaHRNYXBHYXAoZnJvbSArIGZpcnN0Lmxlbmd0aCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbm9kZXMudW5zaGlmdChuZXcgSGVpZ2h0TWFwR2FwKGZyb20gLSAxKSwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZihub2Rlcyk7XG4gICAgfVxuICAgIGRlY29tcG9zZUxlZnQodG8sIHJlc3VsdCkge1xuICAgICAgICByZXN1bHQucHVzaChuZXcgSGVpZ2h0TWFwR2FwKHRvIC0gMSksIG51bGwpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VSaWdodChmcm9tLCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobnVsbCwgbmV3IEhlaWdodE1hcEdhcCh0aGlzLmxlbmd0aCAtIGZyb20gLSAxKSk7XG4gICAgfVxuICAgIHVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCA9IDAsIGZvcmNlID0gZmFsc2UsIG1lYXN1cmVkKSB7XG4gICAgICAgIGxldCBlbmQgPSBvZmZzZXQgKyB0aGlzLmxlbmd0aDtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gb2Zmc2V0ICsgdGhpcy5sZW5ndGggJiYgbWVhc3VyZWQubW9yZSkge1xuICAgICAgICAgICAgLy8gRmlsbCBpbiBwYXJ0IG9mIHRoaXMgZ2FwIHdpdGggbWVhc3VyZWQgbGluZXMuIFdlIGtub3cgdGhlcmVcbiAgICAgICAgICAgIC8vIGNhbid0IGJlIHdpZGdldHMgb3IgY29sbGFwc2VkIHJhbmdlcyBpbiB0aG9zZSBsaW5lcywgYmVjYXVzZVxuICAgICAgICAgICAgLy8gdGhleSB3b3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgaGVpZ2h0bWFwIChnYXBzXG4gICAgICAgICAgICAvLyBvbmx5IGNvbnRhaW4gcGxhaW4gdGV4dCkuXG4gICAgICAgICAgICBsZXQgbm9kZXMgPSBbXSwgcG9zID0gTWF0aC5tYXgob2Zmc2V0LCBtZWFzdXJlZC5mcm9tKSwgc2luZ2xlSGVpZ2h0ID0gLTE7XG4gICAgICAgICAgICBpZiAobWVhc3VyZWQuZnJvbSA+IG9mZnNldClcbiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBHYXAobWVhc3VyZWQuZnJvbSAtIG9mZnNldCAtIDEpLnVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCkpO1xuICAgICAgICAgICAgd2hpbGUgKHBvcyA8PSBlbmQgJiYgbWVhc3VyZWQubW9yZSkge1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBvcmFjbGUuZG9jLmxpbmVBdChwb3MpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobm9kZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSBtZWFzdXJlZC5oZWlnaHRzW21lYXN1cmVkLmluZGV4KytdO1xuICAgICAgICAgICAgICAgIGlmIChzaW5nbGVIZWlnaHQgPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIHNpbmdsZUhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChNYXRoLmFicyhoZWlnaHQgLSBzaW5nbGVIZWlnaHQpID49IEVwc2lsb24pXG4gICAgICAgICAgICAgICAgICAgIHNpbmdsZUhlaWdodCA9IC0yO1xuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gbmV3IEhlaWdodE1hcFRleHQobGVuLCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgIGxpbmUub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgICAgIHBvcyArPSBsZW4gKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA8PSBlbmQpXG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChudWxsLCBuZXcgSGVpZ2h0TWFwR2FwKGVuZCAtIHBvcykudXBkYXRlSGVpZ2h0KG9yYWNsZSwgcG9zKSk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gSGVpZ2h0TWFwLm9mKG5vZGVzKTtcbiAgICAgICAgICAgIGlmIChzaW5nbGVIZWlnaHQgPCAwIHx8IE1hdGguYWJzKHJlc3VsdC5oZWlnaHQgLSB0aGlzLmhlaWdodCkgPj0gRXBzaWxvbiB8fFxuICAgICAgICAgICAgICAgIE1hdGguYWJzKHNpbmdsZUhlaWdodCAtIHRoaXMuaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCkucGVyTGluZSkgPj0gRXBzaWxvbilcbiAgICAgICAgICAgICAgICBoZWlnaHRDaGFuZ2VGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiByZXBsYWNlKHRoaXMsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZm9yY2UgfHwgdGhpcy5vdXRkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQob3JhY2xlLmhlaWdodEZvckdhcChvZmZzZXQsIG9mZnNldCArIHRoaXMubGVuZ3RoKSk7XG4gICAgICAgICAgICB0aGlzLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYGdhcCgke3RoaXMubGVuZ3RofSlgOyB9XG59XG5jbGFzcyBIZWlnaHRNYXBCcmFuY2ggZXh0ZW5kcyBIZWlnaHRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxlZnQsIGJyaywgcmlnaHQpIHtcbiAgICAgICAgc3VwZXIobGVmdC5sZW5ndGggKyBicmsgKyByaWdodC5sZW5ndGgsIGxlZnQuaGVpZ2h0ICsgcmlnaHQuaGVpZ2h0LCBicmsgfCAobGVmdC5vdXRkYXRlZCB8fCByaWdodC5vdXRkYXRlZCA/IDIgLyogRmxhZy5PdXRkYXRlZCAqLyA6IDApKTtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICAgICAgICB0aGlzLnNpemUgPSBsZWZ0LnNpemUgKyByaWdodC5zaXplO1xuICAgIH1cbiAgICBnZXQgYnJlYWsoKSB7IHJldHVybiB0aGlzLmZsYWdzICYgMSAvKiBGbGFnLkJyZWFrICovOyB9XG4gICAgYmxvY2tBdChoZWlnaHQsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IG1pZCA9IHRvcCArIHRoaXMubGVmdC5oZWlnaHQ7XG4gICAgICAgIHJldHVybiBoZWlnaHQgPCBtaWQgPyB0aGlzLmxlZnQuYmxvY2tBdChoZWlnaHQsIG9yYWNsZSwgdG9wLCBvZmZzZXQpXG4gICAgICAgICAgICA6IHRoaXMucmlnaHQuYmxvY2tBdChoZWlnaHQsIG9yYWNsZSwgbWlkLCBvZmZzZXQgKyB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhayk7XG4gICAgfVxuICAgIGxpbmVBdCh2YWx1ZSwgdHlwZSwgb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICBsZXQgcmlnaHRUb3AgPSB0b3AgKyB0aGlzLmxlZnQuaGVpZ2h0LCByaWdodE9mZnNldCA9IG9mZnNldCArIHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLmJyZWFrO1xuICAgICAgICBsZXQgbGVmdCA9IHR5cGUgPT0gUXVlcnlUeXBlLkJ5SGVpZ2h0ID8gdmFsdWUgPCByaWdodFRvcCA6IHZhbHVlIDwgcmlnaHRPZmZzZXQ7XG4gICAgICAgIGxldCBiYXNlID0gbGVmdCA/IHRoaXMubGVmdC5saW5lQXQodmFsdWUsIHR5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpXG4gICAgICAgICAgICA6IHRoaXMucmlnaHQubGluZUF0KHZhbHVlLCB0eXBlLCBvcmFjbGUsIHJpZ2h0VG9wLCByaWdodE9mZnNldCk7XG4gICAgICAgIGlmICh0aGlzLmJyZWFrIHx8IChsZWZ0ID8gYmFzZS50byA8IHJpZ2h0T2Zmc2V0IDogYmFzZS5mcm9tID4gcmlnaHRPZmZzZXQpKVxuICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgIGxldCBzdWJRdWVyeSA9IHR5cGUgPT0gUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQgPyBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCA6IFF1ZXJ5VHlwZS5CeVBvcztcbiAgICAgICAgaWYgKGxlZnQpXG4gICAgICAgICAgICByZXR1cm4gYmFzZS5qb2luKHRoaXMucmlnaHQubGluZUF0KHJpZ2h0T2Zmc2V0LCBzdWJRdWVyeSwgb3JhY2xlLCByaWdodFRvcCwgcmlnaHRPZmZzZXQpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5saW5lQXQocmlnaHRPZmZzZXQsIHN1YlF1ZXJ5LCBvcmFjbGUsIHRvcCwgb2Zmc2V0KS5qb2luKGJhc2UpO1xuICAgIH1cbiAgICBmb3JFYWNoTGluZShmcm9tLCB0bywgb3JhY2xlLCB0b3AsIG9mZnNldCwgZikge1xuICAgICAgICBsZXQgcmlnaHRUb3AgPSB0b3AgKyB0aGlzLmxlZnQuaGVpZ2h0LCByaWdodE9mZnNldCA9IG9mZnNldCArIHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLmJyZWFrO1xuICAgICAgICBpZiAodGhpcy5icmVhaykge1xuICAgICAgICAgICAgaWYgKGZyb20gPCByaWdodE9mZnNldClcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQuZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpO1xuICAgICAgICAgICAgaWYgKHRvID49IHJpZ2h0T2Zmc2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQuZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgcmlnaHRUb3AsIHJpZ2h0T2Zmc2V0LCBmKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtaWQgPSB0aGlzLmxpbmVBdChyaWdodE9mZnNldCwgUXVlcnlUeXBlLkJ5UG9zLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgbWlkLmZyb20pXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0LmZvckVhY2hMaW5lKGZyb20sIG1pZC5mcm9tIC0gMSwgb3JhY2xlLCB0b3AsIG9mZnNldCwgZik7XG4gICAgICAgICAgICBpZiAobWlkLnRvID49IGZyb20gJiYgbWlkLmZyb20gPD0gdG8pXG4gICAgICAgICAgICAgICAgZihtaWQpO1xuICAgICAgICAgICAgaWYgKHRvID4gbWlkLnRvKVxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHQuZm9yRWFjaExpbmUobWlkLnRvICsgMSwgdG8sIG9yYWNsZSwgcmlnaHRUb3AsIHJpZ2h0T2Zmc2V0LCBmKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKGZyb20sIHRvLCBub2Rlcykge1xuICAgICAgICBsZXQgcmlnaHRTdGFydCA9IHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLmJyZWFrO1xuICAgICAgICBpZiAodG8gPCByaWdodFN0YXJ0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFsYW5jZWQodGhpcy5sZWZ0LnJlcGxhY2UoZnJvbSwgdG8sIG5vZGVzKSwgdGhpcy5yaWdodCk7XG4gICAgICAgIGlmIChmcm9tID4gdGhpcy5sZWZ0Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhbGFuY2VkKHRoaXMubGVmdCwgdGhpcy5yaWdodC5yZXBsYWNlKGZyb20gLSByaWdodFN0YXJ0LCB0byAtIHJpZ2h0U3RhcnQsIG5vZGVzKSk7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKGZyb20gPiAwKVxuICAgICAgICAgICAgdGhpcy5kZWNvbXBvc2VMZWZ0KGZyb20sIHJlc3VsdCk7XG4gICAgICAgIGxldCBsZWZ0ID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgbm9kZSBvZiBub2RlcylcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpO1xuICAgICAgICBpZiAoZnJvbSA+IDApXG4gICAgICAgICAgICBtZXJnZUdhcHMocmVzdWx0LCBsZWZ0IC0gMSk7XG4gICAgICAgIGlmICh0byA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcmlnaHQgPSByZXN1bHQubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5kZWNvbXBvc2VSaWdodCh0bywgcmVzdWx0KTtcbiAgICAgICAgICAgIG1lcmdlR2FwcyhyZXN1bHQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSGVpZ2h0TWFwLm9mKHJlc3VsdCk7XG4gICAgfVxuICAgIGRlY29tcG9zZUxlZnQodG8sIHJlc3VsdCkge1xuICAgICAgICBsZXQgbGVmdCA9IHRoaXMubGVmdC5sZW5ndGg7XG4gICAgICAgIGlmICh0byA8PSBsZWZ0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5kZWNvbXBvc2VMZWZ0KHRvLCByZXN1bHQpO1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLmxlZnQpO1xuICAgICAgICBpZiAodGhpcy5icmVhaykge1xuICAgICAgICAgICAgbGVmdCsrO1xuICAgICAgICAgICAgaWYgKHRvID49IGxlZnQpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvID4gbGVmdClcbiAgICAgICAgICAgIHRoaXMucmlnaHQuZGVjb21wb3NlTGVmdCh0byAtIGxlZnQsIHJlc3VsdCk7XG4gICAgfVxuICAgIGRlY29tcG9zZVJpZ2h0KGZyb20sIHJlc3VsdCkge1xuICAgICAgICBsZXQgbGVmdCA9IHRoaXMubGVmdC5sZW5ndGgsIHJpZ2h0ID0gbGVmdCArIHRoaXMuYnJlYWs7XG4gICAgICAgIGlmIChmcm9tID49IHJpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHQuZGVjb21wb3NlUmlnaHQoZnJvbSAtIHJpZ2h0LCByZXN1bHQpO1xuICAgICAgICBpZiAoZnJvbSA8IGxlZnQpXG4gICAgICAgICAgICB0aGlzLmxlZnQuZGVjb21wb3NlUmlnaHQoZnJvbSwgcmVzdWx0KTtcbiAgICAgICAgaWYgKHRoaXMuYnJlYWsgJiYgZnJvbSA8IHJpZ2h0KVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobnVsbCk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMucmlnaHQpO1xuICAgIH1cbiAgICBiYWxhbmNlZChsZWZ0LCByaWdodCkge1xuICAgICAgICBpZiAobGVmdC5zaXplID4gMiAqIHJpZ2h0LnNpemUgfHwgcmlnaHQuc2l6ZSA+IDIgKiBsZWZ0LnNpemUpXG4gICAgICAgICAgICByZXR1cm4gSGVpZ2h0TWFwLm9mKHRoaXMuYnJlYWsgPyBbbGVmdCwgbnVsbCwgcmlnaHRdIDogW2xlZnQsIHJpZ2h0XSk7XG4gICAgICAgIHRoaXMubGVmdCA9IHJlcGxhY2UodGhpcy5sZWZ0LCBsZWZ0KTtcbiAgICAgICAgdGhpcy5yaWdodCA9IHJlcGxhY2UodGhpcy5yaWdodCwgcmlnaHQpO1xuICAgICAgICB0aGlzLnNldEhlaWdodChsZWZ0LmhlaWdodCArIHJpZ2h0LmhlaWdodCk7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBsZWZ0Lm91dGRhdGVkIHx8IHJpZ2h0Lm91dGRhdGVkO1xuICAgICAgICB0aGlzLnNpemUgPSBsZWZ0LnNpemUgKyByaWdodC5zaXplO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlZnQubGVuZ3RoICsgdGhpcy5icmVhayArIHJpZ2h0Lmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCA9IDAsIGZvcmNlID0gZmFsc2UsIG1lYXN1cmVkKSB7XG4gICAgICAgIGxldCB7IGxlZnQsIHJpZ2h0IH0gPSB0aGlzLCByaWdodFN0YXJ0ID0gb2Zmc2V0ICsgbGVmdC5sZW5ndGggKyB0aGlzLmJyZWFrLCByZWJhbGFuY2UgPSBudWxsO1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSBvZmZzZXQgKyBsZWZ0Lmxlbmd0aCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgcmViYWxhbmNlID0gbGVmdCA9IGxlZnQudXBkYXRlSGVpZ2h0KG9yYWNsZSwgb2Zmc2V0LCBmb3JjZSwgbWVhc3VyZWQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZWZ0LnVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCwgZm9yY2UpO1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSByaWdodFN0YXJ0ICsgcmlnaHQubGVuZ3RoICYmIG1lYXN1cmVkLm1vcmUpXG4gICAgICAgICAgICByZWJhbGFuY2UgPSByaWdodCA9IHJpZ2h0LnVwZGF0ZUhlaWdodChvcmFjbGUsIHJpZ2h0U3RhcnQsIGZvcmNlLCBtZWFzdXJlZCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJpZ2h0LnVwZGF0ZUhlaWdodChvcmFjbGUsIHJpZ2h0U3RhcnQsIGZvcmNlKTtcbiAgICAgICAgaWYgKHJlYmFsYW5jZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhbGFuY2VkKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmxlZnQuaGVpZ2h0ICsgdGhpcy5yaWdodC5oZWlnaHQ7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gdGhpcy5sZWZ0ICsgKHRoaXMuYnJlYWsgPyBcIiBcIiA6IFwiLVwiKSArIHRoaXMucmlnaHQ7IH1cbn1cbmZ1bmN0aW9uIG1lcmdlR2Fwcyhub2RlcywgYXJvdW5kKSB7XG4gICAgbGV0IGJlZm9yZSwgYWZ0ZXI7XG4gICAgaWYgKG5vZGVzW2Fyb3VuZF0gPT0gbnVsbCAmJlxuICAgICAgICAoYmVmb3JlID0gbm9kZXNbYXJvdW5kIC0gMV0pIGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwICYmXG4gICAgICAgIChhZnRlciA9IG5vZGVzW2Fyb3VuZCArIDFdKSBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcClcbiAgICAgICAgbm9kZXMuc3BsaWNlKGFyb3VuZCAtIDEsIDMsIG5ldyBIZWlnaHRNYXBHYXAoYmVmb3JlLmxlbmd0aCArIDEgKyBhZnRlci5sZW5ndGgpKTtcbn1cbmNvbnN0IHJlbGV2YW50V2lkZ2V0SGVpZ2h0ID0gNTtcbmNsYXNzIE5vZGVCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3MsIG9yYWNsZSkge1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5vcmFjbGUgPSBvcmFjbGU7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbXTtcbiAgICAgICAgdGhpcy5saW5lU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5saW5lRW5kID0gLTE7XG4gICAgICAgIHRoaXMuY292ZXJpbmcgPSBudWxsO1xuICAgICAgICB0aGlzLndyaXR0ZW5UbyA9IHBvcztcbiAgICB9XG4gICAgZ2V0IGlzQ292ZXJlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY292ZXJpbmcgJiYgdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdID09IHRoaXMuY292ZXJpbmc7XG4gICAgfVxuICAgIHNwYW4oX2Zyb20sIHRvKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmVTdGFydCA+IC0xKSB7XG4gICAgICAgICAgICBsZXQgZW5kID0gTWF0aC5taW4odG8sIHRoaXMubGluZUVuZCksIGxhc3QgPSB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQpXG4gICAgICAgICAgICAgICAgbGFzdC5sZW5ndGggKz0gZW5kIC0gdGhpcy5wb3M7XG4gICAgICAgICAgICBlbHNlIGlmIChlbmQgPiB0aGlzLnBvcyB8fCAhdGhpcy5pc0NvdmVyZWQpXG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBUZXh0KGVuZCAtIHRoaXMucG9zLCAtMSkpO1xuICAgICAgICAgICAgdGhpcy53cml0dGVuVG8gPSBlbmQ7XG4gICAgICAgICAgICBpZiAodG8gPiBlbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0dGVuVG8rKztcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zID0gdG87XG4gICAgfVxuICAgIHBvaW50KGZyb20sIHRvLCBkZWNvKSB7XG4gICAgICAgIGlmIChmcm9tIDwgdG8gfHwgZGVjby5oZWlnaHRSZWxldmFudCkge1xuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGRlY28ud2lkZ2V0ID8gZGVjby53aWRnZXQuZXN0aW1hdGVkSGVpZ2h0IDogMDtcbiAgICAgICAgICAgIGxldCBicmVha3MgPSBkZWNvLndpZGdldCA/IGRlY28ud2lkZ2V0LmxpbmVCcmVha3MgOiAwO1xuICAgICAgICAgICAgaWYgKGhlaWdodCA8IDApXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5vcmFjbGUubGluZUhlaWdodDtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0byAtIGZyb207XG4gICAgICAgICAgICBpZiAoZGVjby5ibG9jaykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQmxvY2sobmV3IEhlaWdodE1hcEJsb2NrKGxlbiwgaGVpZ2h0LCBkZWNvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsZW4gfHwgYnJlYWtzIHx8IGhlaWdodCA+PSByZWxldmFudFdpZGdldEhlaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkTGluZURlY28oaGVpZ2h0LCBicmVha3MsIGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodG8gPiBmcm9tKSB7XG4gICAgICAgICAgICB0aGlzLnNwYW4oZnJvbSwgdG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpbmVFbmQgPiAtMSAmJiB0aGlzLmxpbmVFbmQgPCB0aGlzLnBvcylcbiAgICAgICAgICAgIHRoaXMubGluZUVuZCA9IHRoaXMub3JhY2xlLmRvYy5saW5lQXQodGhpcy5wb3MpLnRvO1xuICAgIH1cbiAgICBlbnRlckxpbmUoKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmVTdGFydCA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gdGhpcy5vcmFjbGUuZG9jLmxpbmVBdCh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMubGluZVN0YXJ0ID0gZnJvbTtcbiAgICAgICAgdGhpcy5saW5lRW5kID0gdG87XG4gICAgICAgIGlmICh0aGlzLndyaXR0ZW5UbyA8IGZyb20pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLndyaXR0ZW5UbyA8IGZyb20gLSAxIHx8IHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaCh0aGlzLmJsYW5rQ29udGVudCh0aGlzLndyaXR0ZW5UbywgZnJvbSAtIDEpKTtcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wb3MgPiBmcm9tKVxuICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBUZXh0KHRoaXMucG9zIC0gZnJvbSwgLTEpKTtcbiAgICAgICAgdGhpcy53cml0dGVuVG8gPSB0aGlzLnBvcztcbiAgICB9XG4gICAgYmxhbmtDb250ZW50KGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBnYXAgPSBuZXcgSGVpZ2h0TWFwR2FwKHRvIC0gZnJvbSk7XG4gICAgICAgIGlmICh0aGlzLm9yYWNsZS5kb2MubGluZUF0KGZyb20pLnRvID09IHRvKVxuICAgICAgICAgICAgZ2FwLmZsYWdzIHw9IDQgLyogRmxhZy5TaW5nbGVMaW5lICovO1xuICAgICAgICByZXR1cm4gZ2FwO1xuICAgIH1cbiAgICBlbnN1cmVMaW5lKCkge1xuICAgICAgICB0aGlzLmVudGVyTGluZSgpO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMubm9kZXMubGVuZ3RoID8gdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0KVxuICAgICAgICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgICAgIGxldCBsaW5lID0gbmV3IEhlaWdodE1hcFRleHQoMCwgLTEpO1xuICAgICAgICB0aGlzLm5vZGVzLnB1c2gobGluZSk7XG4gICAgICAgIHJldHVybiBsaW5lO1xuICAgIH1cbiAgICBhZGRCbG9jayhibG9jaykge1xuICAgICAgICB0aGlzLmVudGVyTGluZSgpO1xuICAgICAgICBsZXQgZGVjbyA9IGJsb2NrLmRlY287XG4gICAgICAgIGlmIChkZWNvICYmIGRlY28uc3RhcnRTaWRlID4gMCAmJiAhdGhpcy5pc0NvdmVyZWQpXG4gICAgICAgICAgICB0aGlzLmVuc3VyZUxpbmUoKTtcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgdGhpcy53cml0dGVuVG8gPSB0aGlzLnBvcyA9IHRoaXMucG9zICsgYmxvY2subGVuZ3RoO1xuICAgICAgICBpZiAoZGVjbyAmJiBkZWNvLmVuZFNpZGUgPiAwKVxuICAgICAgICAgICAgdGhpcy5jb3ZlcmluZyA9IGJsb2NrO1xuICAgIH1cbiAgICBhZGRMaW5lRGVjbyhoZWlnaHQsIGJyZWFrcywgbGVuZ3RoKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5lbnN1cmVMaW5lKCk7XG4gICAgICAgIGxpbmUubGVuZ3RoICs9IGxlbmd0aDtcbiAgICAgICAgbGluZS5jb2xsYXBzZWQgKz0gbGVuZ3RoO1xuICAgICAgICBsaW5lLndpZGdldEhlaWdodCA9IE1hdGgubWF4KGxpbmUud2lkZ2V0SGVpZ2h0LCBoZWlnaHQpO1xuICAgICAgICBsaW5lLmJyZWFrcyArPSBicmVha3M7XG4gICAgICAgIHRoaXMud3JpdHRlblRvID0gdGhpcy5wb3MgPSB0aGlzLnBvcyArIGxlbmd0aDtcbiAgICB9XG4gICAgZmluaXNoKGZyb20pIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLm5vZGVzLmxlbmd0aCA9PSAwID8gbnVsbCA6IHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKHRoaXMubGluZVN0YXJ0ID4gLTEgJiYgIShsYXN0IGluc3RhbmNlb2YgSGVpZ2h0TWFwVGV4dCkgJiYgIXRoaXMuaXNDb3ZlcmVkKVxuICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBUZXh0KDAsIC0xKSk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMud3JpdHRlblRvIDwgdGhpcy5wb3MgfHwgbGFzdCA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKHRoaXMuYmxhbmtDb250ZW50KHRoaXMud3JpdHRlblRvLCB0aGlzLnBvcykpO1xuICAgICAgICBsZXQgcG9zID0gZnJvbTtcbiAgICAgICAgZm9yIChsZXQgbm9kZSBvZiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQpXG4gICAgICAgICAgICAgICAgbm9kZS51cGRhdGVIZWlnaHQodGhpcy5vcmFjbGUsIHBvcyk7XG4gICAgICAgICAgICBwb3MgKz0gbm9kZSA/IG5vZGUubGVuZ3RoIDogMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ub2RlcztcbiAgICB9XG4gICAgLy8gQWx3YXlzIGNhbGxlZCB3aXRoIGEgcmVnaW9uIHRoYXQgb24gYm90aCBzaWRlcyBlaXRoZXIgc3RyZXRjaGVzXG4gICAgLy8gdG8gYSBsaW5lIGJyZWFrIG9yIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICAgIC8vIFRoZSByZXR1cm5lZCBhcnJheSB1c2VzIG51bGwgdG8gaW5kaWNhdGUgbGluZSBicmVha3MsIGJ1dCBuZXZlclxuICAgIC8vIHN0YXJ0cyBvciBlbmRzIGluIGEgbGluZSBicmVhaywgb3IgaGFzIG11bHRpcGxlIGxpbmUgYnJlYWtzIG5leHRcbiAgICAvLyB0byBlYWNoIG90aGVyLlxuICAgIHN0YXRpYyBidWlsZChvcmFjbGUsIGRlY29yYXRpb25zLCBmcm9tLCB0bykge1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBOb2RlQnVpbGRlcihmcm9tLCBvcmFjbGUpO1xuICAgICAgICBSYW5nZVNldC5zcGFucyhkZWNvcmF0aW9ucywgZnJvbSwgdG8sIGJ1aWxkZXIsIDApO1xuICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goZnJvbSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGVpZ2h0UmVsZXZhbnREZWNvQ2hhbmdlcyhhLCBiLCBkaWZmKSB7XG4gICAgbGV0IGNvbXAgPSBuZXcgRGVjb3JhdGlvbkNvbXBhcmF0b3I7XG4gICAgUmFuZ2VTZXQuY29tcGFyZShhLCBiLCBkaWZmLCBjb21wLCAwKTtcbiAgICByZXR1cm4gY29tcC5jaGFuZ2VzO1xufVxuY2xhc3MgRGVjb3JhdGlvbkNvbXBhcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBbXTtcbiAgICB9XG4gICAgY29tcGFyZVJhbmdlKCkgeyB9XG4gICAgY29tcGFyZVBvaW50KGZyb20sIHRvLCBhLCBiKSB7XG4gICAgICAgIGlmIChmcm9tIDwgdG8gfHwgYSAmJiBhLmhlaWdodFJlbGV2YW50IHx8IGIgJiYgYi5oZWlnaHRSZWxldmFudClcbiAgICAgICAgICAgIGFkZFJhbmdlKGZyb20sIHRvLCB0aGlzLmNoYW5nZXMsIDUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdmlzaWJsZVBpeGVsUmFuZ2UoZG9tLCBwYWRkaW5nVG9wKSB7XG4gICAgbGV0IHJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IGRvYyA9IGRvbS5vd25lckRvY3VtZW50LCB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIGxldCBsZWZ0ID0gTWF0aC5tYXgoMCwgcmVjdC5sZWZ0KSwgcmlnaHQgPSBNYXRoLm1pbih3aW4uaW5uZXJXaWR0aCwgcmVjdC5yaWdodCk7XG4gICAgbGV0IHRvcCA9IE1hdGgubWF4KDAsIHJlY3QudG9wKSwgYm90dG9tID0gTWF0aC5taW4od2luLmlubmVySGVpZ2h0LCByZWN0LmJvdHRvbSk7XG4gICAgZm9yIChsZXQgcGFyZW50ID0gZG9tLnBhcmVudE5vZGU7IHBhcmVudCAmJiBwYXJlbnQgIT0gZG9jLmJvZHk7KSB7XG4gICAgICAgIGlmIChwYXJlbnQubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgbGV0IGVsdCA9IHBhcmVudDtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsdCk7XG4gICAgICAgICAgICBpZiAoKGVsdC5zY3JvbGxIZWlnaHQgPiBlbHQuY2xpZW50SGVpZ2h0IHx8IGVsdC5zY3JvbGxXaWR0aCA+IGVsdC5jbGllbnRXaWR0aCkgJiZcbiAgICAgICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyAhPSBcInZpc2libGVcIikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRSZWN0ID0gZWx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGxlZnQgPSBNYXRoLm1heChsZWZ0LCBwYXJlbnRSZWN0LmxlZnQpO1xuICAgICAgICAgICAgICAgIHJpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIHBhcmVudFJlY3QucmlnaHQpO1xuICAgICAgICAgICAgICAgIHRvcCA9IE1hdGgubWF4KHRvcCwgcGFyZW50UmVjdC50b3ApO1xuICAgICAgICAgICAgICAgIGJvdHRvbSA9IE1hdGgubWluKHBhcmVudCA9PSBkb20ucGFyZW50Tm9kZSA/IHdpbi5pbm5lckhlaWdodCA6IGJvdHRvbSwgcGFyZW50UmVjdC5ib3R0b20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gc3R5bGUucG9zaXRpb24gPT0gXCJhYnNvbHV0ZVwiIHx8IHN0eWxlLnBvc2l0aW9uID09IFwiZml4ZWRcIiA/IGVsdC5vZmZzZXRQYXJlbnQgOiBlbHQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXJlbnQubm9kZVR5cGUgPT0gMTEpIHsgLy8gU2hhZG93IHJvb3RcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbGVmdDogbGVmdCAtIHJlY3QubGVmdCwgcmlnaHQ6IE1hdGgubWF4KGxlZnQsIHJpZ2h0KSAtIHJlY3QubGVmdCxcbiAgICAgICAgdG9wOiB0b3AgLSAocmVjdC50b3AgKyBwYWRkaW5nVG9wKSwgYm90dG9tOiBNYXRoLm1heCh0b3AsIGJvdHRvbSkgLSAocmVjdC50b3AgKyBwYWRkaW5nVG9wKSB9O1xufVxuZnVuY3Rpb24gaW5XaW5kb3coZWx0KSB7XG4gICAgbGV0IHJlY3QgPSBlbHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHdpbiA9IGVsdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICByZXR1cm4gcmVjdC5sZWZ0IDwgd2luLmlubmVyV2lkdGggJiYgcmVjdC5yaWdodCA+IDAgJiZcbiAgICAgICAgcmVjdC50b3AgPCB3aW4uaW5uZXJIZWlnaHQgJiYgcmVjdC5ib3R0b20gPiAwO1xufVxuZnVuY3Rpb24gZnVsbFBpeGVsUmFuZ2UoZG9tLCBwYWRkaW5nVG9wKSB7XG4gICAgbGV0IHJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHsgbGVmdDogMCwgcmlnaHQ6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG4gICAgICAgIHRvcDogcGFkZGluZ1RvcCwgYm90dG9tOiByZWN0LmJvdHRvbSAtIChyZWN0LnRvcCArIHBhZGRpbmdUb3ApIH07XG59XG4vLyBMaW5lIGdhcHMgYXJlIHBsYWNlaG9sZGVyIHdpZGdldHMgdXNlZCB0byBoaWRlIHBpZWNlcyBvZiBvdmVybG9uZ1xuLy8gbGluZXMgd2l0aGluIHRoZSB2aWV3cG9ydCwgYXMgYSBrbHVkZ2UgdG8ga2VlcCB0aGUgZWRpdG9yXG4vLyByZXNwb25zaXZlIHdoZW4gYSByaWRpY3Vsb3VzbHkgbG9uZyBsaW5lIGlzIGxvYWRlZCBpbnRvIGl0LlxuY2xhc3MgTGluZUdhcCB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8sIHNpemUsIGRpc3BsYXlTaXplKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5kaXNwbGF5U2l6ZSA9IGRpc3BsYXlTaXplO1xuICAgIH1cbiAgICBzdGF0aWMgc2FtZShhLCBiKSB7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZ0EgPSBhW2ldLCBnQiA9IGJbaV07XG4gICAgICAgICAgICBpZiAoZ0EuZnJvbSAhPSBnQi5mcm9tIHx8IGdBLnRvICE9IGdCLnRvIHx8IGdBLnNpemUgIT0gZ0Iuc2l6ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRyYXcodmlld1N0YXRlLCB3cmFwcGluZykge1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5yZXBsYWNlKHtcbiAgICAgICAgICAgIHdpZGdldDogbmV3IExpbmVHYXBXaWRnZXQodGhpcy5kaXNwbGF5U2l6ZSAqICh3cmFwcGluZyA/IHZpZXdTdGF0ZS5zY2FsZVkgOiB2aWV3U3RhdGUuc2NhbGVYKSwgd3JhcHBpbmcpXG4gICAgICAgIH0pLnJhbmdlKHRoaXMuZnJvbSwgdGhpcy50byk7XG4gICAgfVxufVxuY2xhc3MgTGluZUdhcFdpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHNpemUsIHZlcnRpY2FsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgICAgIHRoaXMudmVydGljYWwgPSB2ZXJ0aWNhbDtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIG90aGVyLnNpemUgPT0gdGhpcy5zaXplICYmIG90aGVyLnZlcnRpY2FsID09IHRoaXMudmVydGljYWw7IH1cbiAgICB0b0RPTSgpIHtcbiAgICAgICAgbGV0IGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGlmICh0aGlzLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICBlbHQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5zaXplICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZWx0LnN0eWxlLndpZHRoID0gdGhpcy5zaXplICsgXCJweFwiO1xuICAgICAgICAgICAgZWx0LnN0eWxlLmhlaWdodCA9IFwiMnB4XCI7XG4gICAgICAgICAgICBlbHQuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsdDtcbiAgICB9XG4gICAgZ2V0IGVzdGltYXRlZEhlaWdodCgpIHsgcmV0dXJuIHRoaXMudmVydGljYWwgPyB0aGlzLnNpemUgOiAtMTsgfVxufVxuY2xhc3MgVmlld1N0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcihzdGF0ZSkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIC8vIFRoZXNlIGFyZSBjb250ZW50RE9NLWxvY2FsIGNvb3JkaW5hdGVzXG4gICAgICAgIHRoaXMucGl4ZWxWaWV3cG9ydCA9IHsgbGVmdDogMCwgcmlnaHQ6IHdpbmRvdy5pbm5lcldpZHRoLCB0b3A6IDAsIGJvdHRvbTogMCB9O1xuICAgICAgICB0aGlzLmluVmlldyA9IHRydWU7XG4gICAgICAgIHRoaXMucGFkZGluZ1RvcCA9IDA7IC8vIFBhZGRpbmcgYWJvdmUgdGhlIGRvY3VtZW50LCBzY2FsZWRcbiAgICAgICAgdGhpcy5wYWRkaW5nQm90dG9tID0gMDsgLy8gUGFkZGluZyBiZWxvdyB0aGUgZG9jdW1lbnQsIHNjYWxlZFxuICAgICAgICB0aGlzLmNvbnRlbnRET01XaWR0aCA9IDA7IC8vIGNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcbiAgICAgICAgdGhpcy5jb250ZW50RE9NSGVpZ2h0ID0gMDsgLy8gY29udGVudERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgdGhpcy5lZGl0b3JIZWlnaHQgPSAwOyAvLyBzY3JvbGxET00uY2xpZW50SGVpZ2h0LCB1bnNjYWxlZFxuICAgICAgICB0aGlzLmVkaXRvcldpZHRoID0gMDsgLy8gc2Nyb2xsRE9NLmNsaWVudFdpZHRoLCB1bnNjYWxlZFxuICAgICAgICB0aGlzLnNjcm9sbFRvcCA9IDA7IC8vIExhc3Qgc2VlbiBzY3JvbGxET00uc2Nyb2xsVG9wLCBzY2FsZWRcbiAgICAgICAgdGhpcy5zY3JvbGxlZFRvQm90dG9tID0gZmFsc2U7XG4gICAgICAgIC8vIFRoZSBDU1MtdHJhbnNmb3JtYXRpb24gc2NhbGUgb2YgdGhlIGVkaXRvciAodHJhbnNmb3JtZWQgc2l6ZSAvXG4gICAgICAgIC8vIGNvbmNyZXRlIHNpemUpXG4gICAgICAgIHRoaXMuc2NhbGVYID0gMTtcbiAgICAgICAgdGhpcy5zY2FsZVkgPSAxO1xuICAgICAgICAvLyBUaGUgdmVydGljYWwgcG9zaXRpb24gKGRvY3VtZW50LXJlbGF0aXZlKSB0byB3aGljaCB0byBhbmNob3IgdGhlXG4gICAgICAgIC8vIHNjcm9sbCBwb3NpdGlvbi4gLTEgbWVhbnMgYW5jaG9yIHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICAgICAgICB0aGlzLnNjcm9sbEFuY2hvclBvcyA9IDA7XG4gICAgICAgIC8vIFRoZSBoZWlnaHQgYXQgdGhlIGFuY2hvciBwb3NpdGlvbi4gU2V0IGJ5IHRoZSBET00gdXBkYXRlIHBoYXNlLlxuICAgICAgICAvLyAtMSBtZWFucyBubyBoZWlnaHQgYXZhaWxhYmxlLlxuICAgICAgICB0aGlzLnNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAvLyBTZWUgVlAuTWF4RE9NSGVpZ2h0XG4gICAgICAgIHRoaXMuc2NhbGVyID0gSWRTY2FsZXI7XG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgLy8gQnJpZWZseSBzZXQgdG8gdHJ1ZSB3aGVuIHByaW50aW5nLCB0byBkaXNhYmxlIHZpZXdwb3J0IGxpbWl0aW5nXG4gICAgICAgIHRoaXMucHJpbnRpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gRmxhZyBzZXQgd2hlbiBlZGl0b3IgY29udGVudCB3YXMgcmVkcmF3biwgc28gdGhhdCB0aGUgbmV4dFxuICAgICAgICAvLyBtZWFzdXJlIHN0YWdlIGtub3dzIGl0IG11c3QgcmVhZCBET00gbGF5b3V0XG4gICAgICAgIHRoaXMubXVzdE1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VGV4dERpcmVjdGlvbiA9IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIHRoaXMudmlzaWJsZVJhbmdlcyA9IFtdO1xuICAgICAgICAvLyBDdXJzb3IgJ2Fzc29jJyBpcyBvbmx5IHNpZ25pZmljYW50IHdoZW4gdGhlIGN1cnNvciBpcyBvbiBhIGxpbmVcbiAgICAgICAgLy8gd3JhcCBwb2ludCwgd2hlcmUgaXQgbXVzdCBzdGljayB0byB0aGUgY2hhcmFjdGVyIHRoYXQgaXQgaXNcbiAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoLiBTaW5jZSBicm93c2VycyBkb24ndCBwcm92aWRlIGEgcmVhc29uYWJsZVxuICAgICAgICAvLyBpbnRlcmZhY2UgdG8gc2V0IG9yIHF1ZXJ5IHRoaXMsIHdoZW4gYSBzZWxlY3Rpb24gaXMgc2V0IHRoYXRcbiAgICAgICAgLy8gbWlnaHQgY2F1c2UgdGhpcyB0byBiZSBzaWduaWZpY2FudCwgdGhpcyBmbGFnIGlzIHNldC4gVGhlIG5leHRcbiAgICAgICAgLy8gbWVhc3VyZSBwaGFzZSB3aWxsIGNoZWNrIHdoZXRoZXIgdGhlIGN1cnNvciBpcyBvbiBhIGxpbmUtd3JhcHBpbmdcbiAgICAgICAgLy8gYm91bmRhcnkgYW5kLCBpZiBzbywgcmVzZXQgaXQgdG8gbWFrZSBzdXJlIGl0IGlzIHBvc2l0aW9uZWQgaW5cbiAgICAgICAgLy8gdGhlIHJpZ2h0IHBsYWNlLlxuICAgICAgICB0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgPSBmYWxzZTtcbiAgICAgICAgbGV0IGd1ZXNzV3JhcHBpbmcgPSBzdGF0ZS5mYWNldChjb250ZW50QXR0cmlidXRlcykuc29tZSh2ID0+IHR5cGVvZiB2ICE9IFwiZnVuY3Rpb25cIiAmJiB2LmNsYXNzID09IFwiY20tbGluZVdyYXBwaW5nXCIpO1xuICAgICAgICB0aGlzLmhlaWdodE9yYWNsZSA9IG5ldyBIZWlnaHRPcmFjbGUoZ3Vlc3NXcmFwcGluZyk7XG4gICAgICAgIHRoaXMuc3RhdGVEZWNvID0gc3RhdGUuZmFjZXQoZGVjb3JhdGlvbnMpLmZpbHRlcihkID0+IHR5cGVvZiBkICE9IFwiZnVuY3Rpb25cIik7XG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwID0gSGVpZ2h0TWFwLmVtcHR5KCkuYXBwbHlDaGFuZ2VzKHRoaXMuc3RhdGVEZWNvLCBUZXh0LmVtcHR5LCB0aGlzLmhlaWdodE9yYWNsZS5zZXREb2Moc3RhdGUuZG9jKSwgW25ldyBDaGFuZ2VkUmFuZ2UoMCwgMCwgMCwgc3RhdGUuZG9jLmxlbmd0aCldKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnQgPSB0aGlzLmdldFZpZXdwb3J0KDAsIG51bGwpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnVwZGF0ZUZvclZpZXdwb3J0KCkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydExpbmVzKCk7XG4gICAgICAgIHRoaXMubGluZUdhcHMgPSB0aGlzLmVuc3VyZUxpbmVHYXBzKFtdKTtcbiAgICAgICAgdGhpcy5saW5lR2FwRGVjbyA9IERlY29yYXRpb24uc2V0KHRoaXMubGluZUdhcHMubWFwKGdhcCA9PiBnYXAuZHJhdyh0aGlzLCBmYWxzZSkpKTtcbiAgICAgICAgdGhpcy5jb21wdXRlVmlzaWJsZVJhbmdlcygpO1xuICAgIH1cbiAgICB1cGRhdGVGb3JWaWV3cG9ydCgpIHtcbiAgICAgICAgbGV0IHZpZXdwb3J0cyA9IFt0aGlzLnZpZXdwb3J0XSwgeyBtYWluIH0gPSB0aGlzLnN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gaSA/IG1haW4uaGVhZCA6IG1haW4uYW5jaG9yO1xuICAgICAgICAgICAgaWYgKCF2aWV3cG9ydHMuc29tZSgoeyBmcm9tLCB0byB9KSA9PiBwb3MgPj0gZnJvbSAmJiBwb3MgPD0gdG8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHRoaXMubGluZUJsb2NrQXQocG9zKTtcbiAgICAgICAgICAgICAgICB2aWV3cG9ydHMucHVzaChuZXcgVmlld3BvcnQoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpZXdwb3J0cyA9IHZpZXdwb3J0cy5zb3J0KChhLCBiKSA9PiBhLmZyb20gLSBiLmZyb20pO1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVTY2FsZXIoKTtcbiAgICB9XG4gICAgdXBkYXRlU2NhbGVyKCkge1xuICAgICAgICBsZXQgc2NhbGVyID0gdGhpcy5zY2FsZXI7XG4gICAgICAgIHRoaXMuc2NhbGVyID0gdGhpcy5oZWlnaHRNYXAuaGVpZ2h0IDw9IDcwMDAwMDAgLyogVlAuTWF4RE9NSGVpZ2h0ICovID8gSWRTY2FsZXIgOlxuICAgICAgICAgICAgbmV3IEJpZ1NjYWxlcih0aGlzLmhlaWdodE9yYWNsZSwgdGhpcy5oZWlnaHRNYXAsIHRoaXMudmlld3BvcnRzKTtcbiAgICAgICAgcmV0dXJuIHNjYWxlci5lcSh0aGlzLnNjYWxlcikgPyAwIDogMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLztcbiAgICB9XG4gICAgdXBkYXRlVmlld3BvcnRMaW5lcygpIHtcbiAgICAgICAgdGhpcy52aWV3cG9ydExpbmVzID0gW107XG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwLmZvckVhY2hMaW5lKHRoaXMudmlld3BvcnQuZnJvbSwgdGhpcy52aWV3cG9ydC50bywgdGhpcy5oZWlnaHRPcmFjbGUuc2V0RG9jKHRoaXMuc3RhdGUuZG9jKSwgMCwgMCwgYmxvY2sgPT4ge1xuICAgICAgICAgICAgdGhpcy52aWV3cG9ydExpbmVzLnB1c2goc2NhbGVCbG9jayhibG9jaywgdGhpcy5zY2FsZXIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUsIHNjcm9sbFRhcmdldCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHVwZGF0ZS5zdGF0ZTtcbiAgICAgICAgbGV0IHByZXZEZWNvID0gdGhpcy5zdGF0ZURlY287XG4gICAgICAgIHRoaXMuc3RhdGVEZWNvID0gdGhpcy5zdGF0ZS5mYWNldChkZWNvcmF0aW9ucykuZmlsdGVyKGQgPT4gdHlwZW9mIGQgIT0gXCJmdW5jdGlvblwiKTtcbiAgICAgICAgbGV0IGNvbnRlbnRDaGFuZ2VzID0gdXBkYXRlLmNoYW5nZWRSYW5nZXM7XG4gICAgICAgIGxldCBoZWlnaHRDaGFuZ2VzID0gQ2hhbmdlZFJhbmdlLmV4dGVuZFdpdGhSYW5nZXMoY29udGVudENoYW5nZXMsIGhlaWdodFJlbGV2YW50RGVjb0NoYW5nZXMocHJldkRlY28sIHRoaXMuc3RhdGVEZWNvLCB1cGRhdGUgPyB1cGRhdGUuY2hhbmdlcyA6IENoYW5nZVNldC5lbXB0eSh0aGlzLnN0YXRlLmRvYy5sZW5ndGgpKSk7XG4gICAgICAgIGxldCBwcmV2SGVpZ2h0ID0gdGhpcy5oZWlnaHRNYXAuaGVpZ2h0O1xuICAgICAgICBsZXQgc2Nyb2xsQW5jaG9yID0gdGhpcy5zY3JvbGxlZFRvQm90dG9tID8gbnVsbCA6IHRoaXMuc2Nyb2xsQW5jaG9yQXQodGhpcy5zY3JvbGxUb3ApO1xuICAgICAgICBjbGVhckhlaWdodENoYW5nZUZsYWcoKTtcbiAgICAgICAgdGhpcy5oZWlnaHRNYXAgPSB0aGlzLmhlaWdodE1hcC5hcHBseUNoYW5nZXModGhpcy5zdGF0ZURlY28sIHVwZGF0ZS5zdGFydFN0YXRlLmRvYywgdGhpcy5oZWlnaHRPcmFjbGUuc2V0RG9jKHRoaXMuc3RhdGUuZG9jKSwgaGVpZ2h0Q2hhbmdlcyk7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodE1hcC5oZWlnaHQgIT0gcHJldkhlaWdodCB8fCBoZWlnaHRDaGFuZ2VGbGFnKVxuICAgICAgICAgICAgdXBkYXRlLmZsYWdzIHw9IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi87XG4gICAgICAgIGlmIChzY3JvbGxBbmNob3IpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQW5jaG9yUG9zID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHNjcm9sbEFuY2hvci5mcm9tLCAtMSk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvckhlaWdodCA9IHNjcm9sbEFuY2hvci50b3A7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvclBvcyA9IC0xO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JIZWlnaHQgPSBwcmV2SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGxldCB2aWV3cG9ydCA9IGhlaWdodENoYW5nZXMubGVuZ3RoID8gdGhpcy5tYXBWaWV3cG9ydCh0aGlzLnZpZXdwb3J0LCB1cGRhdGUuY2hhbmdlcykgOiB0aGlzLnZpZXdwb3J0O1xuICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0ICYmIChzY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA8IHZpZXdwb3J0LmZyb20gfHwgc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgPiB2aWV3cG9ydC50bykgfHxcbiAgICAgICAgICAgICF0aGlzLnZpZXdwb3J0SXNBcHByb3ByaWF0ZSh2aWV3cG9ydCkpXG4gICAgICAgICAgICB2aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld3BvcnQoMCwgc2Nyb2xsVGFyZ2V0KTtcbiAgICAgICAgbGV0IHZpZXdwb3J0Q2hhbmdlID0gdmlld3BvcnQuZnJvbSAhPSB0aGlzLnZpZXdwb3J0LmZyb20gfHwgdmlld3BvcnQudG8gIT0gdGhpcy52aWV3cG9ydC50bztcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gdGhpcy51cGRhdGVGb3JWaWV3cG9ydCgpO1xuICAgICAgICBpZiAodmlld3BvcnRDaGFuZ2UgfHwgIXVwZGF0ZS5jaGFuZ2VzLmVtcHR5IHx8ICh1cGRhdGUuZmxhZ3MgJiAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnRMaW5lcygpO1xuICAgICAgICBpZiAodGhpcy5saW5lR2Fwcy5sZW5ndGggfHwgdGhpcy52aWV3cG9ydC50byAtIHRoaXMudmlld3BvcnQuZnJvbSA+ICgyMDAwIC8qIExHLk1hcmdpbiAqLyA8PCAxKSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTGluZUdhcHModGhpcy5lbnN1cmVMaW5lR2Fwcyh0aGlzLm1hcExpbmVHYXBzKHRoaXMubGluZUdhcHMsIHVwZGF0ZS5jaGFuZ2VzKSkpO1xuICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gdGhpcy5jb21wdXRlVmlzaWJsZVJhbmdlcyh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgIGlmIChzY3JvbGxUYXJnZXQpXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRhcmdldCA9IHNjcm9sbFRhcmdldDtcbiAgICAgICAgaWYgKCF0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgJiYgdXBkYXRlLnNlbGVjdGlvblNldCAmJiB1cGRhdGUudmlldy5saW5lV3JhcHBpbmcgJiZcbiAgICAgICAgICAgIHVwZGF0ZS5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5lbXB0eSAmJiB1cGRhdGUuc3RhdGUuc2VsZWN0aW9uLm1haW4uYXNzb2MgJiZcbiAgICAgICAgICAgICF1cGRhdGUuc3RhdGUuZmFjZXQobmF0aXZlU2VsZWN0aW9uSGlkZGVuKSlcbiAgICAgICAgICAgIHRoaXMubXVzdEVuZm9yY2VDdXJzb3JBc3NvYyA9IHRydWU7XG4gICAgfVxuICAgIG1lYXN1cmUodmlldykge1xuICAgICAgICBsZXQgZG9tID0gdmlldy5jb250ZW50RE9NLCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvbSk7XG4gICAgICAgIGxldCBvcmFjbGUgPSB0aGlzLmhlaWdodE9yYWNsZTtcbiAgICAgICAgbGV0IHdoaXRlU3BhY2UgPSBzdHlsZS53aGl0ZVNwYWNlO1xuICAgICAgICB0aGlzLmRlZmF1bHRUZXh0RGlyZWN0aW9uID0gc3R5bGUuZGlyZWN0aW9uID09IFwicnRsXCIgPyBEaXJlY3Rpb24uUlRMIDogRGlyZWN0aW9uLkxUUjtcbiAgICAgICAgbGV0IHJlZnJlc2ggPSB0aGlzLmhlaWdodE9yYWNsZS5tdXN0UmVmcmVzaEZvcldyYXBwaW5nKHdoaXRlU3BhY2UpO1xuICAgICAgICBsZXQgZG9tUmVjdCA9IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbGV0IG1lYXN1cmVDb250ZW50ID0gcmVmcmVzaCB8fCB0aGlzLm11c3RNZWFzdXJlQ29udGVudCB8fCB0aGlzLmNvbnRlbnRET01IZWlnaHQgIT0gZG9tUmVjdC5oZWlnaHQ7XG4gICAgICAgIHRoaXMuY29udGVudERPTUhlaWdodCA9IGRvbVJlY3QuaGVpZ2h0O1xuICAgICAgICB0aGlzLm11c3RNZWFzdXJlQ29udGVudCA9IGZhbHNlO1xuICAgICAgICBsZXQgcmVzdWx0ID0gMCwgYmlhcyA9IDA7XG4gICAgICAgIGlmIChkb21SZWN0LndpZHRoICYmIGRvbVJlY3QuaGVpZ2h0KSB7XG4gICAgICAgICAgICBsZXQgeyBzY2FsZVgsIHNjYWxlWSB9ID0gZ2V0U2NhbGUoZG9tLCBkb21SZWN0KTtcbiAgICAgICAgICAgIGlmIChzY2FsZVggPiAuMDA1ICYmIE1hdGguYWJzKHRoaXMuc2NhbGVYIC0gc2NhbGVYKSA+IC4wMDUgfHxcbiAgICAgICAgICAgICAgICBzY2FsZVkgPiAuMDA1ICYmIE1hdGguYWJzKHRoaXMuc2NhbGVZIC0gc2NhbGVZKSA+IC4wMDUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxlWCA9IHNjYWxlWDtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxlWSA9IHNjYWxlWTtcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gMTYgLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLztcbiAgICAgICAgICAgICAgICByZWZyZXNoID0gbWVhc3VyZUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFZlcnRpY2FsIHBhZGRpbmdcbiAgICAgICAgbGV0IHBhZGRpbmdUb3AgPSAocGFyc2VJbnQoc3R5bGUucGFkZGluZ1RvcCkgfHwgMCkgKiB0aGlzLnNjYWxlWTtcbiAgICAgICAgbGV0IHBhZGRpbmdCb3R0b20gPSAocGFyc2VJbnQoc3R5bGUucGFkZGluZ0JvdHRvbSkgfHwgMCkgKiB0aGlzLnNjYWxlWTtcbiAgICAgICAgaWYgKHRoaXMucGFkZGluZ1RvcCAhPSBwYWRkaW5nVG9wIHx8IHRoaXMucGFkZGluZ0JvdHRvbSAhPSBwYWRkaW5nQm90dG9tKSB7XG4gICAgICAgICAgICB0aGlzLnBhZGRpbmdUb3AgPSBwYWRkaW5nVG9wO1xuICAgICAgICAgICAgdGhpcy5wYWRkaW5nQm90dG9tID0gcGFkZGluZ0JvdHRvbTtcbiAgICAgICAgICAgIHJlc3VsdCB8PSAxNiAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovIHwgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lZGl0b3JXaWR0aCAhPSB2aWV3LnNjcm9sbERPTS5jbGllbnRXaWR0aCkge1xuICAgICAgICAgICAgaWYgKG9yYWNsZS5saW5lV3JhcHBpbmcpXG4gICAgICAgICAgICAgICAgbWVhc3VyZUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JXaWR0aCA9IHZpZXcuc2Nyb2xsRE9NLmNsaWVudFdpZHRoO1xuICAgICAgICAgICAgcmVzdWx0IHw9IDE2IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi87XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNjcm9sbFRvcCA9IHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCAqIHRoaXMuc2NhbGVZO1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxUb3AgIT0gc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxlZFRvQm90dG9tID0gaXNTY3JvbGxlZFRvQm90dG9tKHZpZXcuc2Nyb2xsRE9NKTtcbiAgICAgICAgLy8gUGl4ZWwgdmlld3BvcnRcbiAgICAgICAgbGV0IHBpeGVsVmlld3BvcnQgPSAodGhpcy5wcmludGluZyA/IGZ1bGxQaXhlbFJhbmdlIDogdmlzaWJsZVBpeGVsUmFuZ2UpKGRvbSwgdGhpcy5wYWRkaW5nVG9wKTtcbiAgICAgICAgbGV0IGRUb3AgPSBwaXhlbFZpZXdwb3J0LnRvcCAtIHRoaXMucGl4ZWxWaWV3cG9ydC50b3AsIGRCb3R0b20gPSBwaXhlbFZpZXdwb3J0LmJvdHRvbSAtIHRoaXMucGl4ZWxWaWV3cG9ydC5ib3R0b207XG4gICAgICAgIHRoaXMucGl4ZWxWaWV3cG9ydCA9IHBpeGVsVmlld3BvcnQ7XG4gICAgICAgIGxldCBpblZpZXcgPSB0aGlzLnBpeGVsVmlld3BvcnQuYm90dG9tID4gdGhpcy5waXhlbFZpZXdwb3J0LnRvcCAmJiB0aGlzLnBpeGVsVmlld3BvcnQucmlnaHQgPiB0aGlzLnBpeGVsVmlld3BvcnQubGVmdDtcbiAgICAgICAgaWYgKGluVmlldyAhPSB0aGlzLmluVmlldykge1xuICAgICAgICAgICAgdGhpcy5pblZpZXcgPSBpblZpZXc7XG4gICAgICAgICAgICBpZiAoaW5WaWV3KVxuICAgICAgICAgICAgICAgIG1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaW5WaWV3ICYmICF0aGlzLnNjcm9sbFRhcmdldCAmJiAhaW5XaW5kb3codmlldy5kb20pKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBjb250ZW50V2lkdGggPSBkb21SZWN0LndpZHRoO1xuICAgICAgICBpZiAodGhpcy5jb250ZW50RE9NV2lkdGggIT0gY29udGVudFdpZHRoIHx8IHRoaXMuZWRpdG9ySGVpZ2h0ICE9IHZpZXcuc2Nyb2xsRE9NLmNsaWVudEhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50RE9NV2lkdGggPSBkb21SZWN0LndpZHRoO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JIZWlnaHQgPSB2aWV3LnNjcm9sbERPTS5jbGllbnRIZWlnaHQ7XG4gICAgICAgICAgICByZXN1bHQgfD0gMTYgLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVhc3VyZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIGxldCBsaW5lSGVpZ2h0cyA9IHZpZXcuZG9jVmlldy5tZWFzdXJlVmlzaWJsZUxpbmVIZWlnaHRzKHRoaXMudmlld3BvcnQpO1xuICAgICAgICAgICAgaWYgKG9yYWNsZS5tdXN0UmVmcmVzaEZvckhlaWdodHMobGluZUhlaWdodHMpKVxuICAgICAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHJlZnJlc2ggfHwgb3JhY2xlLmxpbmVXcmFwcGluZyAmJiBNYXRoLmFicyhjb250ZW50V2lkdGggLSB0aGlzLmNvbnRlbnRET01XaWR0aCkgPiBvcmFjbGUuY2hhcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0IH0gPSB2aWV3LmRvY1ZpZXcubWVhc3VyZVRleHRTaXplKCk7XG4gICAgICAgICAgICAgICAgcmVmcmVzaCA9IGxpbmVIZWlnaHQgPiAwICYmIG9yYWNsZS5yZWZyZXNoKHdoaXRlU3BhY2UsIGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCwgY29udGVudFdpZHRoIC8gY2hhcldpZHRoLCBsaW5lSGVpZ2h0cyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5kb2NWaWV3Lm1pbldpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IDE2IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRUb3AgPiAwICYmIGRCb3R0b20gPiAwKVxuICAgICAgICAgICAgICAgIGJpYXMgPSBNYXRoLm1heChkVG9wLCBkQm90dG9tKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRUb3AgPCAwICYmIGRCb3R0b20gPCAwKVxuICAgICAgICAgICAgICAgIGJpYXMgPSBNYXRoLm1pbihkVG9wLCBkQm90dG9tKTtcbiAgICAgICAgICAgIGNsZWFySGVpZ2h0Q2hhbmdlRmxhZygpO1xuICAgICAgICAgICAgZm9yIChsZXQgdnAgb2YgdGhpcy52aWV3cG9ydHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0cyA9IHZwLmZyb20gPT0gdGhpcy52aWV3cG9ydC5mcm9tID8gbGluZUhlaWdodHMgOiB2aWV3LmRvY1ZpZXcubWVhc3VyZVZpc2libGVMaW5lSGVpZ2h0cyh2cCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNYXAgPSAocmVmcmVzaCA/IEhlaWdodE1hcC5lbXB0eSgpLmFwcGx5Q2hhbmdlcyh0aGlzLnN0YXRlRGVjbywgVGV4dC5lbXB0eSwgdGhpcy5oZWlnaHRPcmFjbGUsIFtuZXcgQ2hhbmdlZFJhbmdlKDAsIDAsIDAsIHZpZXcuc3RhdGUuZG9jLmxlbmd0aCldKSA6IHRoaXMuaGVpZ2h0TWFwKS51cGRhdGVIZWlnaHQob3JhY2xlLCAwLCByZWZyZXNoLCBuZXcgTWVhc3VyZWRIZWlnaHRzKHZwLmZyb20sIGhlaWdodHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoZWlnaHRDaGFuZ2VGbGFnKVxuICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2aWV3cG9ydENoYW5nZSA9ICF0aGlzLnZpZXdwb3J0SXNBcHByb3ByaWF0ZSh0aGlzLnZpZXdwb3J0LCBiaWFzKSB8fFxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQgJiYgKHRoaXMuc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgPCB0aGlzLnZpZXdwb3J0LmZyb20gfHxcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRhcmdldC5yYW5nZS5oZWFkID4gdGhpcy52aWV3cG9ydC50byk7XG4gICAgICAgIGlmICh2aWV3cG9ydENoYW5nZSkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAmIDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi8pXG4gICAgICAgICAgICAgICAgcmVzdWx0IHw9IHRoaXMudXBkYXRlU2NhbGVyKCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0ID0gdGhpcy5nZXRWaWV3cG9ydChiaWFzLCB0aGlzLnNjcm9sbFRhcmdldCk7XG4gICAgICAgICAgICByZXN1bHQgfD0gdGhpcy51cGRhdGVGb3JWaWV3cG9ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgocmVzdWx0ICYgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLykgfHwgdmlld3BvcnRDaGFuZ2UpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0TGluZXMoKTtcbiAgICAgICAgaWYgKHRoaXMubGluZUdhcHMubGVuZ3RoIHx8IHRoaXMudmlld3BvcnQudG8gLSB0aGlzLnZpZXdwb3J0LmZyb20gPiAoMjAwMCAvKiBMRy5NYXJnaW4gKi8gPDwgMSkpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxpbmVHYXBzKHRoaXMuZW5zdXJlTGluZUdhcHMocmVmcmVzaCA/IFtdIDogdGhpcy5saW5lR2FwcywgdmlldykpO1xuICAgICAgICByZXN1bHQgfD0gdGhpcy5jb21wdXRlVmlzaWJsZVJhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jKSB7XG4gICAgICAgICAgICB0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSBpbiB0aGUgcmVhZCBzdGFnZSwgYmVjYXVzZSBtb3ZpbmcgdGhlIHNlbGVjdGlvblxuICAgICAgICAgICAgLy8gdG8gYSBsaW5lIGVuZCBpcyBnb2luZyB0byB0cmlnZ2VyIGEgbGF5b3V0IGFueXdheSwgc28gaXRcbiAgICAgICAgICAgIC8vIGNhbid0IGJlIGEgcHVyZSB3cml0ZS4gSXQgc2hvdWxkIGJlIHJhcmUgdGhhdCBpdCBkb2VzIGFueVxuICAgICAgICAgICAgLy8gd3JpdGluZy5cbiAgICAgICAgICAgIHZpZXcuZG9jVmlldy5lbmZvcmNlQ3Vyc29yQXNzb2MoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBnZXQgdmlzaWJsZVRvcCgpIHsgcmV0dXJuIHRoaXMuc2NhbGVyLmZyb21ET00odGhpcy5waXhlbFZpZXdwb3J0LnRvcCk7IH1cbiAgICBnZXQgdmlzaWJsZUJvdHRvbSgpIHsgcmV0dXJuIHRoaXMuc2NhbGVyLmZyb21ET00odGhpcy5waXhlbFZpZXdwb3J0LmJvdHRvbSk7IH1cbiAgICBnZXRWaWV3cG9ydChiaWFzLCBzY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIGRpdmlkZSBWUC5NYXJnaW4gYmV0d2VlbiB0aGUgdG9wIGFuZCB0aGVcbiAgICAgICAgLy8gYm90dG9tLCBkZXBlbmRpbmcgb24gdGhlIGJpYXMgKHRoZSBjaGFuZ2UgaW4gdmlld3BvcnQgcG9zaXRpb25cbiAgICAgICAgLy8gc2luY2UgdGhlIGxhc3QgdXBkYXRlKS4gSXQnbGwgaG9sZCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDFcbiAgICAgICAgbGV0IG1hcmdpblRvcCA9IDAuNSAtIE1hdGgubWF4KC0wLjUsIE1hdGgubWluKDAuNSwgYmlhcyAvIDEwMDAgLyogVlAuTWFyZ2luICovIC8gMikpO1xuICAgICAgICBsZXQgbWFwID0gdGhpcy5oZWlnaHRNYXAsIG9yYWNsZSA9IHRoaXMuaGVpZ2h0T3JhY2xlO1xuICAgICAgICBsZXQgeyB2aXNpYmxlVG9wLCB2aXNpYmxlQm90dG9tIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdmlld3BvcnQgPSBuZXcgVmlld3BvcnQobWFwLmxpbmVBdCh2aXNpYmxlVG9wIC0gbWFyZ2luVG9wICogMTAwMCAvKiBWUC5NYXJnaW4gKi8sIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS5mcm9tLCBtYXAubGluZUF0KHZpc2libGVCb3R0b20gKyAoMSAtIG1hcmdpblRvcCkgKiAxMDAwIC8qIFZQLk1hcmdpbiAqLywgUXVlcnlUeXBlLkJ5SGVpZ2h0LCBvcmFjbGUsIDAsIDApLnRvKTtcbiAgICAgICAgLy8gSWYgc2Nyb2xsVGFyZ2V0IGlzIGdpdmVuLCBtYWtlIHN1cmUgdGhlIHZpZXdwb3J0IGluY2x1ZGVzIHRoYXQgcG9zaXRpb25cbiAgICAgICAgaWYgKHNjcm9sbFRhcmdldCkge1xuICAgICAgICAgICAgbGV0IHsgaGVhZCB9ID0gc2Nyb2xsVGFyZ2V0LnJhbmdlO1xuICAgICAgICAgICAgaWYgKGhlYWQgPCB2aWV3cG9ydC5mcm9tIHx8IGhlYWQgPiB2aWV3cG9ydC50bykge1xuICAgICAgICAgICAgICAgIGxldCB2aWV3SGVpZ2h0ID0gTWF0aC5taW4odGhpcy5lZGl0b3JIZWlnaHQsIHRoaXMucGl4ZWxWaWV3cG9ydC5ib3R0b20gLSB0aGlzLnBpeGVsVmlld3BvcnQudG9wKTtcbiAgICAgICAgICAgICAgICBsZXQgYmxvY2sgPSBtYXAubGluZUF0KGhlYWQsIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCAwLCAwKSwgdG9wUG9zO1xuICAgICAgICAgICAgICAgIGlmIChzY3JvbGxUYXJnZXQueSA9PSBcImNlbnRlclwiKVxuICAgICAgICAgICAgICAgICAgICB0b3BQb3MgPSAoYmxvY2sudG9wICsgYmxvY2suYm90dG9tKSAvIDIgLSB2aWV3SGVpZ2h0IC8gMjtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY3JvbGxUYXJnZXQueSA9PSBcInN0YXJ0XCIgfHwgc2Nyb2xsVGFyZ2V0LnkgPT0gXCJuZWFyZXN0XCIgJiYgaGVhZCA8IHZpZXdwb3J0LmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHRvcFBvcyA9IGJsb2NrLnRvcDtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRvcFBvcyA9IGJsb2NrLmJvdHRvbSAtIHZpZXdIZWlnaHQ7XG4gICAgICAgICAgICAgICAgdmlld3BvcnQgPSBuZXcgVmlld3BvcnQobWFwLmxpbmVBdCh0b3BQb3MgLSAxMDAwIC8qIFZQLk1hcmdpbiAqLyAvIDIsIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS5mcm9tLCBtYXAubGluZUF0KHRvcFBvcyArIHZpZXdIZWlnaHQgKyAxMDAwIC8qIFZQLk1hcmdpbiAqLyAvIDIsIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS50byk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpZXdwb3J0O1xuICAgIH1cbiAgICBtYXBWaWV3cG9ydCh2aWV3cG9ydCwgY2hhbmdlcykge1xuICAgICAgICBsZXQgZnJvbSA9IGNoYW5nZXMubWFwUG9zKHZpZXdwb3J0LmZyb20sIC0xKSwgdG8gPSBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC50bywgMSk7XG4gICAgICAgIHJldHVybiBuZXcgVmlld3BvcnQodGhpcy5oZWlnaHRNYXAubGluZUF0KGZyb20sIFF1ZXJ5VHlwZS5CeVBvcywgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApLmZyb20sIHRoaXMuaGVpZ2h0TWFwLmxpbmVBdCh0bywgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCkudG8pO1xuICAgIH1cbiAgICAvLyBDaGVja3MgaWYgYSBnaXZlbiB2aWV3cG9ydCBjb3ZlcnMgdGhlIHZpc2libGUgcGFydCBvZiB0aGVcbiAgICAvLyBkb2N1bWVudCBhbmQgbm90IHRvbyBtdWNoIGJleW9uZCB0aGF0LlxuICAgIHZpZXdwb3J0SXNBcHByb3ByaWF0ZSh7IGZyb20sIHRvIH0sIGJpYXMgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy5pblZpZXcpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IHsgdG9wIH0gPSB0aGlzLmhlaWdodE1hcC5saW5lQXQoZnJvbSwgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCk7XG4gICAgICAgIGxldCB7IGJvdHRvbSB9ID0gdGhpcy5oZWlnaHRNYXAubGluZUF0KHRvLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKTtcbiAgICAgICAgbGV0IHsgdmlzaWJsZVRvcCwgdmlzaWJsZUJvdHRvbSB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIChmcm9tID09IDAgfHwgdG9wIDw9IHZpc2libGVUb3AgLSBNYXRoLm1heCgxMCAvKiBWUC5NaW5Db3Zlck1hcmdpbiAqLywgTWF0aC5taW4oLWJpYXMsIDI1MCAvKiBWUC5NYXhDb3Zlck1hcmdpbiAqLykpKSAmJlxuICAgICAgICAgICAgKHRvID09IHRoaXMuc3RhdGUuZG9jLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIGJvdHRvbSA+PSB2aXNpYmxlQm90dG9tICsgTWF0aC5tYXgoMTAgLyogVlAuTWluQ292ZXJNYXJnaW4gKi8sIE1hdGgubWluKGJpYXMsIDI1MCAvKiBWUC5NYXhDb3Zlck1hcmdpbiAqLykpKSAmJlxuICAgICAgICAgICAgKHRvcCA+IHZpc2libGVUb3AgLSAyICogMTAwMCAvKiBWUC5NYXJnaW4gKi8gJiYgYm90dG9tIDwgdmlzaWJsZUJvdHRvbSArIDIgKiAxMDAwIC8qIFZQLk1hcmdpbiAqLyk7XG4gICAgfVxuICAgIG1hcExpbmVHYXBzKGdhcHMsIGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKCFnYXBzLmxlbmd0aCB8fCBjaGFuZ2VzLmVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIGdhcHM7XG4gICAgICAgIGxldCBtYXBwZWQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZ2FwIG9mIGdhcHMpXG4gICAgICAgICAgICBpZiAoIWNoYW5nZXMudG91Y2hlc1JhbmdlKGdhcC5mcm9tLCBnYXAudG8pKVxuICAgICAgICAgICAgICAgIG1hcHBlZC5wdXNoKG5ldyBMaW5lR2FwKGNoYW5nZXMubWFwUG9zKGdhcC5mcm9tKSwgY2hhbmdlcy5tYXBQb3MoZ2FwLnRvKSwgZ2FwLnNpemUsIGdhcC5kaXNwbGF5U2l6ZSkpO1xuICAgICAgICByZXR1cm4gbWFwcGVkO1xuICAgIH1cbiAgICAvLyBDb21wdXRlcyBwb3NpdGlvbnMgaW4gdGhlIHZpZXdwb3J0IHdoZXJlIHRoZSBzdGFydCBvciBlbmQgb2YgYVxuICAgIC8vIGxpbmUgc2hvdWxkIGJlIGhpZGRlbiwgdHJ5aW5nIHRvIHJldXNlIGV4aXN0aW5nIGxpbmUgZ2FwcyB3aGVuXG4gICAgLy8gYXBwcm9wcmlhdGUgdG8gYXZvaWQgdW5uZWNjZXNhcnkgcmVkcmF3cy5cbiAgICAvLyBVc2VzIGNydWRlIGNoYXJhY3Rlci1jb3VudGluZyBmb3IgdGhlIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcsXG4gICAgLy8gc2luY2UgYWN0dWFsIERPTSBjb29yZGluYXRlcyBhcmVuJ3QgYWx3YXlzIGF2YWlsYWJsZSBhbmRcbiAgICAvLyBwcmVkaWN0YWJsZS4gUmVsaWVzIG9uIGdlbmVyb3VzIG1hcmdpbnMgKHNlZSBMRy5NYXJnaW4pIHRvIGhpZGVcbiAgICAvLyB0aGUgYXJ0aWZhY3RzIHRoaXMgbWlnaHQgcHJvZHVjZSBmcm9tIHRoZSB1c2VyLlxuICAgIGVuc3VyZUxpbmVHYXBzKGN1cnJlbnQsIG1heU1lYXN1cmUpIHtcbiAgICAgICAgbGV0IHdyYXBwaW5nID0gdGhpcy5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nO1xuICAgICAgICBsZXQgbWFyZ2luID0gd3JhcHBpbmcgPyAxMDAwMCAvKiBMRy5NYXJnaW5XcmFwICovIDogMjAwMCAvKiBMRy5NYXJnaW4gKi8sIGhhbGZNYXJnaW4gPSBtYXJnaW4gPj4gMSwgZG91YmxlTWFyZ2luID0gbWFyZ2luIDw8IDE7XG4gICAgICAgIC8vIFRoZSBub24td3JhcHBpbmcgbG9naWMgd29uJ3Qgd29yayBhdCBhbGwgaW4gcHJlZG9taW5hbnRseSByaWdodC10by1sZWZ0IHRleHQuXG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRUZXh0RGlyZWN0aW9uICE9IERpcmVjdGlvbi5MVFIgJiYgIXdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICBsZXQgZ2FwcyA9IFtdO1xuICAgICAgICBsZXQgYWRkR2FwID0gKGZyb20sIHRvLCBsaW5lLCBzdHJ1Y3R1cmUpID0+IHtcbiAgICAgICAgICAgIGlmICh0byAtIGZyb20gPCBoYWxmTWFyZ2luKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBzZWwgPSB0aGlzLnN0YXRlLnNlbGVjdGlvbi5tYWluLCBhdm9pZCA9IFtzZWwuZnJvbV07XG4gICAgICAgICAgICBpZiAoIXNlbC5lbXB0eSlcbiAgICAgICAgICAgICAgICBhdm9pZC5wdXNoKHNlbC50byk7XG4gICAgICAgICAgICBmb3IgKGxldCBwb3Mgb2YgYXZvaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zID4gZnJvbSAmJiBwb3MgPCB0bykge1xuICAgICAgICAgICAgICAgICAgICBhZGRHYXAoZnJvbSwgcG9zIC0gMTAgLyogTEcuU2VsZWN0aW9uTWFyZ2luICovLCBsaW5lLCBzdHJ1Y3R1cmUpO1xuICAgICAgICAgICAgICAgICAgICBhZGRHYXAocG9zICsgMTAgLyogTEcuU2VsZWN0aW9uTWFyZ2luICovLCB0bywgbGluZSwgc3RydWN0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBnYXAgPSBmaW5kKGN1cnJlbnQsIGdhcCA9PiBnYXAuZnJvbSA+PSBsaW5lLmZyb20gJiYgZ2FwLnRvIDw9IGxpbmUudG8gJiZcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhnYXAuZnJvbSAtIGZyb20pIDwgaGFsZk1hcmdpbiAmJiBNYXRoLmFicyhnYXAudG8gLSB0bykgPCBoYWxmTWFyZ2luICYmXG4gICAgICAgICAgICAgICAgIWF2b2lkLnNvbWUocG9zID0+IGdhcC5mcm9tIDwgcG9zICYmIGdhcC50byA+IHBvcykpO1xuICAgICAgICAgICAgaWYgKCFnYXApIHtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHNjcm9sbGluZyBkb3duLCBzbmFwIGdhcCBlbmRzIHRvIGxpbmUgc3RhcnRzIHRvIGF2b2lkIHNoaWZ0cyBpbiB3cmFwcGluZ1xuICAgICAgICAgICAgICAgIGlmICh0byA8IGxpbmUudG8gJiYgbWF5TWVhc3VyZSAmJiB3cmFwcGluZyAmJlxuICAgICAgICAgICAgICAgICAgICBtYXlNZWFzdXJlLnZpc2libGVSYW5nZXMuc29tZShyID0+IHIuZnJvbSA8PSB0byAmJiByLnRvID49IHRvKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGluZVN0YXJ0ID0gbWF5TWVhc3VyZS5tb3ZlVG9MaW5lQm91bmRhcnkoRWRpdG9yU2VsZWN0aW9uLmN1cnNvcih0byksIGZhbHNlLCB0cnVlKS5oZWFkO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGluZVN0YXJ0ID4gZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gbGluZVN0YXJ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHRoaXMuZ2FwU2l6ZShsaW5lLCBmcm9tLCB0bywgc3RydWN0dXJlKTtcbiAgICAgICAgICAgICAgICBsZXQgZGlzcGxheVNpemUgPSB3cmFwcGluZyB8fCBzaXplIDwgMjAwMDAwMCAvKiBWUC5NYXhIb3JpekdhcCAqLyA/IHNpemUgOiAyMDAwMDAwIC8qIFZQLk1heEhvcml6R2FwICovO1xuICAgICAgICAgICAgICAgIGdhcCA9IG5ldyBMaW5lR2FwKGZyb20sIHRvLCBzaXplLCBkaXNwbGF5U2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnYXBzLnB1c2goZ2FwKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGNoZWNrTGluZSA9IChsaW5lKSA9PiB7XG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPCBkb3VibGVNYXJnaW4gfHwgbGluZS50eXBlICE9IEJsb2NrVHlwZS5UZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBzdHJ1Y3R1cmUgPSBsaW5lU3RydWN0dXJlKGxpbmUuZnJvbSwgbGluZS50bywgdGhpcy5zdGF0ZURlY28pO1xuICAgICAgICAgICAgaWYgKHN0cnVjdHVyZS50b3RhbCA8IGRvdWJsZU1hcmdpbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5zY3JvbGxUYXJnZXQgPyB0aGlzLnNjcm9sbFRhcmdldC5yYW5nZS5oZWFkIDogbnVsbDtcbiAgICAgICAgICAgIGxldCB2aWV3RnJvbSwgdmlld1RvO1xuICAgICAgICAgICAgaWYgKHdyYXBwaW5nKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmdpbkhlaWdodCA9IChtYXJnaW4gLyB0aGlzLmhlaWdodE9yYWNsZS5saW5lTGVuZ3RoKSAqIHRoaXMuaGVpZ2h0T3JhY2xlLmxpbmVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgbGV0IHRvcCwgYm90O1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0RnJhYyA9IGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGFjZUZyYWMgPSAoKHRoaXMudmlzaWJsZUJvdHRvbSAtIHRoaXMudmlzaWJsZVRvcCkgLyAyICsgbWFyZ2luSGVpZ2h0KSAvIGxpbmUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSB0YXJnZXRGcmFjIC0gc3BhY2VGcmFjO1xuICAgICAgICAgICAgICAgICAgICBib3QgPSB0YXJnZXRGcmFjICsgc3BhY2VGcmFjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gKHRoaXMudmlzaWJsZVRvcCAtIGxpbmUudG9wIC0gbWFyZ2luSGVpZ2h0KSAvIGxpbmUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBib3QgPSAodGhpcy52aXNpYmxlQm90dG9tIC0gbGluZS50b3AgKyBtYXJnaW5IZWlnaHQpIC8gbGluZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZpZXdGcm9tID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgdG9wKTtcbiAgICAgICAgICAgICAgICB2aWV3VG8gPSBmaW5kUG9zaXRpb24oc3RydWN0dXJlLCBib3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsV2lkdGggPSBzdHJ1Y3R1cmUudG90YWwgKiB0aGlzLmhlaWdodE9yYWNsZS5jaGFyV2lkdGg7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmdpbldpZHRoID0gbWFyZ2luICogdGhpcy5oZWlnaHRPcmFjbGUuY2hhcldpZHRoO1xuICAgICAgICAgICAgICAgIGxldCBob3Jpek9mZnNldCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKHRvdGFsV2lkdGggPiAyMDAwMDAwIC8qIFZQLk1heEhvcml6R2FwICovKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBvbGQgb2YgY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZC5mcm9tID49IGxpbmUuZnJvbSAmJiBvbGQuZnJvbSA8IGxpbmUudG8gJiYgb2xkLnNpemUgIT0gb2xkLmRpc3BsYXlTaXplICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLmZyb20gKiB0aGlzLmhlaWdodE9yYWNsZS5jaGFyV2lkdGggKyBob3Jpek9mZnNldCA8IHRoaXMucGl4ZWxWaWV3cG9ydC5sZWZ0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6T2Zmc2V0ID0gb2xkLnNpemUgLSBvbGQuZGlzcGxheVNpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcHhMZWZ0ID0gdGhpcy5waXhlbFZpZXdwb3J0LmxlZnQgKyBob3Jpek9mZnNldCwgcHhSaWdodCA9IHRoaXMucGl4ZWxWaWV3cG9ydC5yaWdodCArIGhvcml6T2Zmc2V0O1xuICAgICAgICAgICAgICAgIGxldCBsZWZ0LCByaWdodDtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldEZyYWMgPSBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BhY2VGcmFjID0gKChweFJpZ2h0IC0gcHhMZWZ0KSAvIDIgKyBtYXJnaW5XaWR0aCkgLyB0b3RhbFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gdGFyZ2V0RnJhYyAtIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0YXJnZXRGcmFjICsgc3BhY2VGcmFjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IChweExlZnQgLSBtYXJnaW5XaWR0aCkgLyB0b3RhbFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICByaWdodCA9IChweFJpZ2h0ICsgbWFyZ2luV2lkdGgpIC8gdG90YWxXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmlld0Zyb20gPSBmaW5kUG9zaXRpb24oc3RydWN0dXJlLCBsZWZ0KTtcbiAgICAgICAgICAgICAgICB2aWV3VG8gPSBmaW5kUG9zaXRpb24oc3RydWN0dXJlLCByaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmlld0Zyb20gPiBsaW5lLmZyb20pXG4gICAgICAgICAgICAgICAgYWRkR2FwKGxpbmUuZnJvbSwgdmlld0Zyb20sIGxpbmUsIHN0cnVjdHVyZSk7XG4gICAgICAgICAgICBpZiAodmlld1RvIDwgbGluZS50bylcbiAgICAgICAgICAgICAgICBhZGRHYXAodmlld1RvLCBsaW5lLnRvLCBsaW5lLCBzdHJ1Y3R1cmUpO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHRoaXMudmlld3BvcnRMaW5lcykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGluZS50eXBlKSlcbiAgICAgICAgICAgICAgICBsaW5lLnR5cGUuZm9yRWFjaChjaGVja0xpbmUpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNoZWNrTGluZShsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2FwcztcbiAgICB9XG4gICAgZ2FwU2l6ZShsaW5lLCBmcm9tLCB0bywgc3RydWN0dXJlKSB7XG4gICAgICAgIGxldCBmcmFjdGlvbiA9IGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIHRvKSAtIGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIGZyb20pO1xuICAgICAgICBpZiAodGhpcy5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbGluZS5oZWlnaHQgKiBmcmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJ1Y3R1cmUudG90YWwgKiB0aGlzLmhlaWdodE9yYWNsZS5jaGFyV2lkdGggKiBmcmFjdGlvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVMaW5lR2FwcyhnYXBzKSB7XG4gICAgICAgIGlmICghTGluZUdhcC5zYW1lKGdhcHMsIHRoaXMubGluZUdhcHMpKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmVHYXBzID0gZ2FwcztcbiAgICAgICAgICAgIHRoaXMubGluZUdhcERlY28gPSBEZWNvcmF0aW9uLnNldChnYXBzLm1hcChnYXAgPT4gZ2FwLmRyYXcodGhpcywgdGhpcy5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXB1dGVWaXNpYmxlUmFuZ2VzKGNoYW5nZXMpIHtcbiAgICAgICAgbGV0IGRlY28gPSB0aGlzLnN0YXRlRGVjbztcbiAgICAgICAgaWYgKHRoaXMubGluZUdhcHMubGVuZ3RoKVxuICAgICAgICAgICAgZGVjbyA9IGRlY28uY29uY2F0KHRoaXMubGluZUdhcERlY28pO1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgIFJhbmdlU2V0LnNwYW5zKGRlY28sIHRoaXMudmlld3BvcnQuZnJvbSwgdGhpcy52aWV3cG9ydC50bywge1xuICAgICAgICAgICAgc3Bhbihmcm9tLCB0bykgeyByYW5nZXMucHVzaCh7IGZyb20sIHRvIH0pOyB9LFxuICAgICAgICAgICAgcG9pbnQoKSB7IH1cbiAgICAgICAgfSwgMjApO1xuICAgICAgICBsZXQgY2hhbmdlZCA9IDA7XG4gICAgICAgIGlmIChyYW5nZXMubGVuZ3RoICE9IHRoaXMudmlzaWJsZVJhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSA4IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnRNb3ZlZCAqLyB8IDQgLyogVXBkYXRlRmxhZy5WaWV3cG9ydCAqLztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aCAmJiAhKGNoYW5nZWQgJiA4IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnRNb3ZlZCAqLyk7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBvbGQgPSB0aGlzLnZpc2libGVSYW5nZXNbaV0sIG53ID0gcmFuZ2VzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChvbGQuZnJvbSAhPSBudy5mcm9tIHx8IG9sZC50byAhPSBudy50bykge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IDQgLyogVXBkYXRlRmxhZy5WaWV3cG9ydCAqLztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoY2hhbmdlcyAmJiBjaGFuZ2VzLm1hcFBvcyhvbGQuZnJvbSwgLTEpID09IG53LmZyb20gJiYgY2hhbmdlcy5tYXBQb3Mob2xkLnRvLCAxKSA9PSBudy50bykpXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IDggLyogVXBkYXRlRmxhZy5WaWV3cG9ydE1vdmVkICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2libGVSYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH1cbiAgICBsaW5lQmxvY2tBdChwb3MpIHtcbiAgICAgICAgcmV0dXJuIChwb3MgPj0gdGhpcy52aWV3cG9ydC5mcm9tICYmIHBvcyA8PSB0aGlzLnZpZXdwb3J0LnRvICYmXG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0TGluZXMuZmluZChiID0+IGIuZnJvbSA8PSBwb3MgJiYgYi50byA+PSBwb3MpKSB8fFxuICAgICAgICAgICAgc2NhbGVCbG9jayh0aGlzLmhlaWdodE1hcC5saW5lQXQocG9zLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKSwgdGhpcy5zY2FsZXIpO1xuICAgIH1cbiAgICBsaW5lQmxvY2tBdEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIChoZWlnaHQgPj0gdGhpcy52aWV3cG9ydExpbmVzWzBdLnRvcCAmJiBoZWlnaHQgPD0gdGhpcy52aWV3cG9ydExpbmVzW3RoaXMudmlld3BvcnRMaW5lcy5sZW5ndGggLSAxXS5ib3R0b20gJiZcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRMaW5lcy5maW5kKGwgPT4gbC50b3AgPD0gaGVpZ2h0ICYmIGwuYm90dG9tID49IGhlaWdodCkpIHx8XG4gICAgICAgICAgICBzY2FsZUJsb2NrKHRoaXMuaGVpZ2h0TWFwLmxpbmVBdCh0aGlzLnNjYWxlci5mcm9tRE9NKGhlaWdodCksIFF1ZXJ5VHlwZS5CeUhlaWdodCwgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApLCB0aGlzLnNjYWxlcik7XG4gICAgfVxuICAgIHNjcm9sbEFuY2hvckF0KHNjcm9sbFRvcCkge1xuICAgICAgICBsZXQgYmxvY2sgPSB0aGlzLmxpbmVCbG9ja0F0SGVpZ2h0KHNjcm9sbFRvcCArIDgpO1xuICAgICAgICByZXR1cm4gYmxvY2suZnJvbSA+PSB0aGlzLnZpZXdwb3J0LmZyb20gfHwgdGhpcy52aWV3cG9ydExpbmVzWzBdLnRvcCAtIHNjcm9sbFRvcCA+IDIwMCA/IGJsb2NrIDogdGhpcy52aWV3cG9ydExpbmVzWzBdO1xuICAgIH1cbiAgICBlbGVtZW50QXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBzY2FsZUJsb2NrKHRoaXMuaGVpZ2h0TWFwLmJsb2NrQXQodGhpcy5zY2FsZXIuZnJvbURPTShoZWlnaHQpLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCksIHRoaXMuc2NhbGVyKTtcbiAgICB9XG4gICAgZ2V0IGRvY0hlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGVyLnRvRE9NKHRoaXMuaGVpZ2h0TWFwLmhlaWdodCk7XG4gICAgfVxuICAgIGdldCBjb250ZW50SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NIZWlnaHQgKyB0aGlzLnBhZGRpbmdUb3AgKyB0aGlzLnBhZGRpbmdCb3R0b207XG4gICAgfVxufVxuY2xhc3MgVmlld3BvcnQge1xuICAgIGNvbnN0cnVjdG9yKGZyb20sIHRvKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICB9XG59XG5mdW5jdGlvbiBsaW5lU3RydWN0dXJlKGZyb20sIHRvLCBzdGF0ZURlY28pIHtcbiAgICBsZXQgcmFuZ2VzID0gW10sIHBvcyA9IGZyb20sIHRvdGFsID0gMDtcbiAgICBSYW5nZVNldC5zcGFucyhzdGF0ZURlY28sIGZyb20sIHRvLCB7XG4gICAgICAgIHNwYW4oKSB7IH0sXG4gICAgICAgIHBvaW50KGZyb20sIHRvKSB7XG4gICAgICAgICAgICBpZiAoZnJvbSA+IHBvcykge1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKHsgZnJvbTogcG9zLCB0bzogZnJvbSB9KTtcbiAgICAgICAgICAgICAgICB0b3RhbCArPSBmcm9tIC0gcG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gdG87XG4gICAgICAgIH1cbiAgICB9LCAyMCk7IC8vIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBjb2xsYXBzZWQgcmFuZ2VzIG9mIGEgc2lnbmlmaWNhbnQgc2l6ZVxuICAgIGlmIChwb3MgPCB0bykge1xuICAgICAgICByYW5nZXMucHVzaCh7IGZyb206IHBvcywgdG8gfSk7XG4gICAgICAgIHRvdGFsICs9IHRvIC0gcG9zO1xuICAgIH1cbiAgICByZXR1cm4geyB0b3RhbCwgcmFuZ2VzIH07XG59XG5mdW5jdGlvbiBmaW5kUG9zaXRpb24oeyB0b3RhbCwgcmFuZ2VzIH0sIHJhdGlvKSB7XG4gICAgaWYgKHJhdGlvIDw9IDApXG4gICAgICAgIHJldHVybiByYW5nZXNbMF0uZnJvbTtcbiAgICBpZiAocmF0aW8gPj0gMSlcbiAgICAgICAgcmV0dXJuIHJhbmdlc1tyYW5nZXMubGVuZ3RoIC0gMV0udG87XG4gICAgbGV0IGRpc3QgPSBNYXRoLmZsb29yKHRvdGFsICogcmF0aW8pO1xuICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSByYW5nZXNbaV0sIHNpemUgPSB0byAtIGZyb207XG4gICAgICAgIGlmIChkaXN0IDw9IHNpemUpXG4gICAgICAgICAgICByZXR1cm4gZnJvbSArIGRpc3Q7XG4gICAgICAgIGRpc3QgLT0gc2l6ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCBwb3MpIHtcbiAgICBsZXQgY291bnRlZCA9IDA7XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHN0cnVjdHVyZS5yYW5nZXMpIHtcbiAgICAgICAgaWYgKHBvcyA8PSB0bykge1xuICAgICAgICAgICAgY291bnRlZCArPSBwb3MgLSBmcm9tO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY291bnRlZCArPSB0byAtIGZyb207XG4gICAgfVxuICAgIHJldHVybiBjb3VudGVkIC8gc3RydWN0dXJlLnRvdGFsO1xufVxuZnVuY3Rpb24gZmluZChhcnJheSwgZikge1xuICAgIGZvciAobGV0IHZhbCBvZiBhcnJheSlcbiAgICAgICAgaWYgKGYodmFsKSlcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8vIERvbid0IHNjYWxlIHdoZW4gdGhlIGRvY3VtZW50IGhlaWdodCBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHdoYXRcbi8vIHRoZSBET00gY2FuIGhhbmRsZS5cbmNvbnN0IElkU2NhbGVyID0ge1xuICAgIHRvRE9NKG4pIHsgcmV0dXJuIG47IH0sXG4gICAgZnJvbURPTShuKSB7IHJldHVybiBuOyB9LFxuICAgIHNjYWxlOiAxLFxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlciA9PSB0aGlzOyB9XG59O1xuLy8gV2hlbiB0aGUgaGVpZ2h0IGlzIHRvbyBiaWcgKD4gVlAuTWF4RE9NSGVpZ2h0KSwgc2NhbGUgZG93biB0aGVcbi8vIHJlZ2lvbnMgb3V0c2lkZSB0aGUgdmlld3BvcnRzIHNvIHRoYXQgdGhlIHRvdGFsIGhlaWdodCBpc1xuLy8gVlAuTWF4RE9NSGVpZ2h0LlxuY2xhc3MgQmlnU2NhbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcmFjbGUsIGhlaWdodE1hcCwgdmlld3BvcnRzKSB7XG4gICAgICAgIGxldCB2cEhlaWdodCA9IDAsIGJhc2UgPSAwLCBkb21CYXNlID0gMDtcbiAgICAgICAgdGhpcy52aWV3cG9ydHMgPSB2aWV3cG9ydHMubWFwKCh7IGZyb20sIHRvIH0pID0+IHtcbiAgICAgICAgICAgIGxldCB0b3AgPSBoZWlnaHRNYXAubGluZUF0KGZyb20sIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCAwLCAwKS50b3A7XG4gICAgICAgICAgICBsZXQgYm90dG9tID0gaGVpZ2h0TWFwLmxpbmVBdCh0bywgUXVlcnlUeXBlLkJ5UG9zLCBvcmFjbGUsIDAsIDApLmJvdHRvbTtcbiAgICAgICAgICAgIHZwSGVpZ2h0ICs9IGJvdHRvbSAtIHRvcDtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb20sIHRvLCB0b3AsIGJvdHRvbSwgZG9tVG9wOiAwLCBkb21Cb3R0b206IDAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2NhbGUgPSAoNzAwMDAwMCAvKiBWUC5NYXhET01IZWlnaHQgKi8gLSB2cEhlaWdodCkgLyAoaGVpZ2h0TWFwLmhlaWdodCAtIHZwSGVpZ2h0KTtcbiAgICAgICAgZm9yIChsZXQgb2JqIG9mIHRoaXMudmlld3BvcnRzKSB7XG4gICAgICAgICAgICBvYmouZG9tVG9wID0gZG9tQmFzZSArIChvYmoudG9wIC0gYmFzZSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgZG9tQmFzZSA9IG9iai5kb21Cb3R0b20gPSBvYmouZG9tVG9wICsgKG9iai5ib3R0b20gLSBvYmoudG9wKTtcbiAgICAgICAgICAgIGJhc2UgPSBvYmouYm90dG9tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvRE9NKG4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGJhc2UgPSAwLCBkb21CYXNlID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZwID0gaSA8IHRoaXMudmlld3BvcnRzLmxlbmd0aCA/IHRoaXMudmlld3BvcnRzW2ldIDogbnVsbDtcbiAgICAgICAgICAgIGlmICghdnAgfHwgbiA8IHZwLnRvcClcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9tQmFzZSArIChuIC0gYmFzZSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgaWYgKG4gPD0gdnAuYm90dG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiB2cC5kb21Ub3AgKyAobiAtIHZwLnRvcCk7XG4gICAgICAgICAgICBiYXNlID0gdnAuYm90dG9tO1xuICAgICAgICAgICAgZG9tQmFzZSA9IHZwLmRvbUJvdHRvbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmcm9tRE9NKG4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGJhc2UgPSAwLCBkb21CYXNlID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZwID0gaSA8IHRoaXMudmlld3BvcnRzLmxlbmd0aCA/IHRoaXMudmlld3BvcnRzW2ldIDogbnVsbDtcbiAgICAgICAgICAgIGlmICghdnAgfHwgbiA8IHZwLmRvbVRvcClcbiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZSArIChuIC0gZG9tQmFzZSkgLyB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgaWYgKG4gPD0gdnAuZG9tQm90dG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiB2cC50b3AgKyAobiAtIHZwLmRvbVRvcCk7XG4gICAgICAgICAgICBiYXNlID0gdnAuYm90dG9tO1xuICAgICAgICAgICAgZG9tQmFzZSA9IHZwLmRvbUJvdHRvbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEJpZ1NjYWxlcikpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLnNjYWxlID09IG90aGVyLnNjYWxlICYmIHRoaXMudmlld3BvcnRzLmxlbmd0aCA9PSBvdGhlci52aWV3cG9ydHMubGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0cy5ldmVyeSgodnAsIGkpID0+IHZwLmZyb20gPT0gb3RoZXIudmlld3BvcnRzW2ldLmZyb20gJiYgdnAudG8gPT0gb3RoZXIudmlld3BvcnRzW2ldLnRvKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzY2FsZUJsb2NrKGJsb2NrLCBzY2FsZXIpIHtcbiAgICBpZiAoc2NhbGVyLnNjYWxlID09IDEpXG4gICAgICAgIHJldHVybiBibG9jaztcbiAgICBsZXQgYlRvcCA9IHNjYWxlci50b0RPTShibG9jay50b3ApLCBiQm90dG9tID0gc2NhbGVyLnRvRE9NKGJsb2NrLmJvdHRvbSk7XG4gICAgcmV0dXJuIG5ldyBCbG9ja0luZm8oYmxvY2suZnJvbSwgYmxvY2subGVuZ3RoLCBiVG9wLCBiQm90dG9tIC0gYlRvcCwgQXJyYXkuaXNBcnJheShibG9jay5fY29udGVudCkgPyBibG9jay5fY29udGVudC5tYXAoYiA9PiBzY2FsZUJsb2NrKGIsIHNjYWxlcikpIDogYmxvY2suX2NvbnRlbnQpO1xufVxuXG5jb25zdCB0aGVtZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiBzdHJzID0+IHN0cnMuam9pbihcIiBcIikgfSk7XG5jb25zdCBkYXJrVGhlbWUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5pbmRleE9mKHRydWUpID4gLTEgfSk7XG5jb25zdCBiYXNlVGhlbWVJRCA9IC8qQF9fUFVSRV9fKi9TdHlsZU1vZHVsZS5uZXdOYW1lKCksIGJhc2VMaWdodElEID0gLypAX19QVVJFX18qL1N0eWxlTW9kdWxlLm5ld05hbWUoKSwgYmFzZURhcmtJRCA9IC8qQF9fUFVSRV9fKi9TdHlsZU1vZHVsZS5uZXdOYW1lKCk7XG5jb25zdCBsaWdodERhcmtJRHMgPSB7IFwiJmxpZ2h0XCI6IFwiLlwiICsgYmFzZUxpZ2h0SUQsIFwiJmRhcmtcIjogXCIuXCIgKyBiYXNlRGFya0lEIH07XG5mdW5jdGlvbiBidWlsZFRoZW1lKG1haW4sIHNwZWMsIHNjb3Blcykge1xuICAgIHJldHVybiBuZXcgU3R5bGVNb2R1bGUoc3BlYywge1xuICAgICAgICBmaW5pc2goc2VsKSB7XG4gICAgICAgICAgICByZXR1cm4gLyYvLnRlc3Qoc2VsKSA/IHNlbC5yZXBsYWNlKC8mXFx3Ki8sIG0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtID09IFwiJlwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFpbjtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlcyB8fCAhc2NvcGVzW21dKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5zdXBwb3J0ZWQgc2VsZWN0b3I6ICR7bX1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2NvcGVzW21dO1xuICAgICAgICAgICAgfSkgOiBtYWluICsgXCIgXCIgKyBzZWw7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmNvbnN0IGJhc2VUaGVtZSQxID0gLypAX19QVVJFX18qL2J1aWxkVGhlbWUoXCIuXCIgKyBiYXNlVGhlbWVJRCwge1xuICAgIFwiJlwiOiB7XG4gICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlICFpbXBvcnRhbnRcIixcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgICAgXCImLmNtLWZvY3VzZWRcIjoge1xuICAgICAgICAgICAgLy8gUHJvdmlkZSBhIHNpbXBsZSBkZWZhdWx0IG91dGxpbmUgdG8gbWFrZSBzdXJlIGEgZm9jdXNlZFxuICAgICAgICAgICAgLy8gZWRpdG9yIGlzIHZpc3VhbGx5IGRpc3RpbmN0LiBDYW4ndCBsZWF2ZSB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdpbGwgYXBwbHkgdG8gdGhlIGNvbnRlbnQgZWxlbWVudCwgd2hpY2ggaXNcbiAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgc2Nyb2xsYWJsZSBjb250YWluZXIgYW5kIGRvZXNuJ3QgaW5jbHVkZSB0aGVcbiAgICAgICAgICAgIC8vIGd1dHRlcnMuIFdlIGFsc28gY2FuJ3QgdXNlIGFuICdhdXRvJyBvdXRsaW5lLCBzaW5jZSB0aG9zZVxuICAgICAgICAgICAgLy8gYXJlLCBmb3Igc29tZSByZWFzb24sIGRyYXduIGJlaGluZCB0aGUgZWxlbWVudCBjb250ZW50LCB3aGljaFxuICAgICAgICAgICAgLy8gd2lsbCBjYXVzZSB0aGluZ3MgbGlrZSB0aGUgYWN0aXZlIGxpbmUgYmFja2dyb3VuZCB0byBjb3ZlclxuICAgICAgICAgICAgLy8gdGhlIG91dGxpbmUgKCMyOTcpLlxuICAgICAgICAgICAgb3V0bGluZTogXCIxcHggZG90dGVkICMyMTIxMjFcIlxuICAgICAgICB9LFxuICAgICAgICBkaXNwbGF5OiBcImZsZXggIWltcG9ydGFudFwiLFxuICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiXG4gICAgfSxcbiAgICBcIi5jbS1zY3JvbGxlclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiZmxleCAhaW1wb3J0YW50XCIsXG4gICAgICAgIGFsaWduSXRlbXM6IFwiZmxleC1zdGFydCAhaW1wb3J0YW50XCIsXG4gICAgICAgIGZvbnRGYW1pbHk6IFwibW9ub3NwYWNlXCIsXG4gICAgICAgIGxpbmVIZWlnaHQ6IDEuNCxcbiAgICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgb3ZlcmZsb3dYOiBcImF1dG9cIixcbiAgICAgICAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcbiAgICAgICAgekluZGV4OiAwLFxuICAgICAgICBvdmVyZmxvd0FuY2hvcjogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIi5jbS1jb250ZW50XCI6IHtcbiAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICBmbGV4R3JvdzogMixcbiAgICAgICAgZmxleFNocmluazogMCxcbiAgICAgICAgZGlzcGxheTogXCJibG9ja1wiLFxuICAgICAgICB3aGl0ZVNwYWNlOiBcInByZVwiLFxuICAgICAgICB3b3JkV3JhcDogXCJub3JtYWxcIiwgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvZGV2L2lzc3Vlcy80NTZcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgICAgbWluSGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgcGFkZGluZzogXCI0cHggMFwiLFxuICAgICAgICBvdXRsaW5lOiBcIm5vbmVcIixcbiAgICAgICAgXCImW2NvbnRlbnRlZGl0YWJsZT10cnVlXVwiOiB7XG4gICAgICAgICAgICBXZWJraXRVc2VyTW9kaWZ5OiBcInJlYWQtd3JpdGUtcGxhaW50ZXh0LW9ubHlcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCIuY20tbGluZVdyYXBwaW5nXCI6IHtcbiAgICAgICAgd2hpdGVTcGFjZV9mYWxsYmFjazogXCJwcmUtd3JhcFwiLCAvLyBGb3IgSUVcbiAgICAgICAgd2hpdGVTcGFjZTogXCJicmVhay1zcGFjZXNcIixcbiAgICAgICAgd29yZEJyZWFrOiBcImJyZWFrLXdvcmRcIiwgLy8gRm9yIFNhZmFyaSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IG92ZXJmbG93LXdyYXA6IGFueXdoZXJlXG4gICAgICAgIG92ZXJmbG93V3JhcDogXCJhbnl3aGVyZVwiLFxuICAgICAgICBmbGV4U2hyaW5rOiAxXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tY29udGVudFwiOiB7IGNhcmV0Q29sb3I6IFwiYmxhY2tcIiB9LFxuICAgIFwiJmRhcmsgLmNtLWNvbnRlbnRcIjogeyBjYXJldENvbG9yOiBcIndoaXRlXCIgfSxcbiAgICBcIi5jbS1saW5lXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJibG9ja1wiLFxuICAgICAgICBwYWRkaW5nOiBcIjAgMnB4IDAgNnB4XCJcbiAgICB9LFxuICAgIFwiLmNtLWxheWVyXCI6IHtcbiAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBjb250YWluOiBcInNpemUgc3R5bGVcIixcbiAgICAgICAgXCImID4gKlwiOiB7XG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCIjZDlkOWQ5XCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLXNlbGVjdGlvbkJhY2tncm91bmRcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kOiBcIiMyMjJcIlxuICAgIH0sXG4gICAgXCImbGlnaHQuY20tZm9jdXNlZCA+IC5jbS1zY3JvbGxlciA+IC5jbS1zZWxlY3Rpb25MYXllciAuY20tc2VsZWN0aW9uQmFja2dyb3VuZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IFwiI2Q3ZDRmMFwiXG4gICAgfSxcbiAgICBcIiZkYXJrLmNtLWZvY3VzZWQgPiAuY20tc2Nyb2xsZXIgPiAuY20tc2VsZWN0aW9uTGF5ZXIgLmNtLXNlbGVjdGlvbkJhY2tncm91bmRcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kOiBcIiMyMzNcIlxuICAgIH0sXG4gICAgXCIuY20tY3Vyc29yTGF5ZXJcIjoge1xuICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIlxuICAgIH0sXG4gICAgXCImLmNtLWZvY3VzZWQgPiAuY20tc2Nyb2xsZXIgPiAuY20tY3Vyc29yTGF5ZXJcIjoge1xuICAgICAgICBhbmltYXRpb246IFwic3RlcHMoMSkgY20tYmxpbmsgMS4ycyBpbmZpbml0ZVwiXG4gICAgfSxcbiAgICAvLyBUd28gYW5pbWF0aW9ucyBkZWZpbmVkIHNvIHRoYXQgd2UgY2FuIHN3aXRjaCBiZXR3ZWVuIHRoZW0gdG9cbiAgICAvLyByZXN0YXJ0IHRoZSBhbmltYXRpb24gd2l0aG91dCBmb3JjaW5nIGFub3RoZXIgc3R5bGVcbiAgICAvLyByZWNvbXB1dGF0aW9uLlxuICAgIFwiQGtleWZyYW1lcyBjbS1ibGlua1wiOiB7IFwiMCVcIjoge30sIFwiNTAlXCI6IHsgb3BhY2l0eTogMCB9LCBcIjEwMCVcIjoge30gfSxcbiAgICBcIkBrZXlmcmFtZXMgY20tYmxpbmsyXCI6IHsgXCIwJVwiOiB7fSwgXCI1MCVcIjogeyBvcGFjaXR5OiAwIH0sIFwiMTAwJVwiOiB7fSB9LFxuICAgIFwiLmNtLWN1cnNvciwgLmNtLWRyb3BDdXJzb3JcIjoge1xuICAgICAgICBib3JkZXJMZWZ0OiBcIjEuMnB4IHNvbGlkIGJsYWNrXCIsXG4gICAgICAgIG1hcmdpbkxlZnQ6IFwiLTAuNnB4XCIsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiLFxuICAgIH0sXG4gICAgXCIuY20tY3Vyc29yXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJub25lXCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLWN1cnNvclwiOiB7XG4gICAgICAgIGJvcmRlckxlZnRDb2xvcjogXCIjZGRkXCJcbiAgICB9LFxuICAgIFwiLmNtLWRyb3BDdXJzb3JcIjoge1xuICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiXG4gICAgfSxcbiAgICBcIiYuY20tZm9jdXNlZCA+IC5jbS1zY3JvbGxlciA+IC5jbS1jdXJzb3JMYXllciAuY20tY3Vyc29yXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJibG9ja1wiXG4gICAgfSxcbiAgICBcIi5jbS1pc29cIjoge1xuICAgICAgICB1bmljb2RlQmlkaTogXCJpc29sYXRlXCJcbiAgICB9LFxuICAgIFwiLmNtLWFubm91bmNlZFwiOiB7XG4gICAgICAgIHBvc2l0aW9uOiBcImZpeGVkXCIsXG4gICAgICAgIHRvcDogXCItMTAwMDBweFwiXG4gICAgfSxcbiAgICBcIkBtZWRpYSBwcmludFwiOiB7XG4gICAgICAgIFwiLmNtLWFubm91bmNlZFwiOiB7IGRpc3BsYXk6IFwibm9uZVwiIH1cbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1hY3RpdmVMaW5lXCI6IHsgYmFja2dyb3VuZENvbG9yOiBcIiNjY2VlZmY0NFwiIH0sXG4gICAgXCImZGFyayAuY20tYWN0aXZlTGluZVwiOiB7IGJhY2tncm91bmRDb2xvcjogXCIjOTllZWZmMzNcIiB9LFxuICAgIFwiJmxpZ2h0IC5jbS1zcGVjaWFsQ2hhclwiOiB7IGNvbG9yOiBcInJlZFwiIH0sXG4gICAgXCImZGFyayAuY20tc3BlY2lhbENoYXJcIjogeyBjb2xvcjogXCIjZjc4XCIgfSxcbiAgICBcIi5jbS1ndXR0ZXJzXCI6IHtcbiAgICAgICAgZmxleFNocmluazogMCxcbiAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IDAsXG4gICAgICAgIHpJbmRleDogMjAwXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tZ3V0dGVyc1wiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZjVmNWY1XCIsXG4gICAgICAgIGNvbG9yOiBcIiM2YzZjNmNcIixcbiAgICAgICAgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICNkZGRcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tZ3V0dGVyc1wiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMzMzMzM4XCIsXG4gICAgICAgIGNvbG9yOiBcIiNjY2NcIlxuICAgIH0sXG4gICAgXCIuY20tZ3V0dGVyXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJmbGV4ICFpbXBvcnRhbnRcIiwgLy8gTmVjZXNzYXJ5IC0tIHByZXZlbnRzIG1hcmdpbiBjb2xsYXBzaW5nXG4gICAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIG1pbkhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgfSxcbiAgICBcIi5jbS1ndXR0ZXJFbGVtZW50XCI6IHtcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIlxuICAgIH0sXG4gICAgXCIuY20tbGluZU51bWJlcnMgLmNtLWd1dHRlckVsZW1lbnRcIjoge1xuICAgICAgICBwYWRkaW5nOiBcIjAgM3B4IDAgNXB4XCIsXG4gICAgICAgIG1pbldpZHRoOiBcIjIwcHhcIixcbiAgICAgICAgdGV4dEFsaWduOiBcInJpZ2h0XCIsXG4gICAgICAgIHdoaXRlU3BhY2U6IFwibm93cmFwXCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1hY3RpdmVMaW5lR3V0dGVyXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNlMmYyZmZcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tYWN0aXZlTGluZUd1dHRlclwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMjIyMjI3XCJcbiAgICB9LFxuICAgIFwiLmNtLXBhbmVsc1wiOiB7XG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIHBvc2l0aW9uOiBcInN0aWNreVwiLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgekluZGV4OiAzMDBcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1wYW5lbHNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2Y1ZjVmNVwiLFxuICAgICAgICBjb2xvcjogXCJibGFja1wiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tcGFuZWxzLXRvcFwiOiB7XG4gICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgI2RkZFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tcGFuZWxzLWJvdHRvbVwiOiB7XG4gICAgICAgIGJvcmRlclRvcDogXCIxcHggc29saWQgI2RkZFwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1wYW5lbHNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzMzMzMzOFwiLFxuICAgICAgICBjb2xvcjogXCJ3aGl0ZVwiXG4gICAgfSxcbiAgICBcIi5jbS10YWJcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJib3R0b21cIlxuICAgIH0sXG4gICAgXCIuY20td2lkZ2V0QnVmZmVyXCI6IHtcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJ0ZXh0LXRvcFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMWVtXCIsXG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBkaXNwbGF5OiBcImlubGluZVwiXG4gICAgfSxcbiAgICBcIi5jbS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgIGNvbG9yOiBcIiM4ODhcIixcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJ0b3BcIixcbiAgICAgICAgdXNlclNlbGVjdDogXCJub25lXCJcbiAgICB9LFxuICAgIFwiLmNtLWhpZ2hsaWdodFNwYWNlXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcInJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgNTAlIDU1JSwgI2FhYSAyMCUsIHRyYW5zcGFyZW50IDUlKVwiLFxuICAgICAgICBiYWNrZ3JvdW5kUG9zaXRpb246IFwiY2VudGVyXCIsXG4gICAgfSxcbiAgICBcIi5jbS1oaWdobGlnaHRUYWJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IGB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwMFwiIGhlaWdodD1cIjIwXCI+PHBhdGggc3Ryb2tlPVwiJTIzODg4XCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZD1cIk0xIDEwSDE5NkwxOTAgNU0xOTAgMTVMMTk2IDEwTTE5NyA0TDE5NyAxNlwiLz48L3N2Zz4nKWAsXG4gICAgICAgIGJhY2tncm91bmRTaXplOiBcImF1dG8gMTAwJVwiLFxuICAgICAgICBiYWNrZ3JvdW5kUG9zaXRpb246IFwicmlnaHQgOTAlXCIsXG4gICAgICAgIGJhY2tncm91bmRSZXBlYXQ6IFwibm8tcmVwZWF0XCJcbiAgICB9LFxuICAgIFwiLmNtLXRyYWlsaW5nU3BhY2VcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2ZmMzMyMjU1XCJcbiAgICB9LFxuICAgIFwiLmNtLWJ1dHRvblwiOiB7XG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwibWlkZGxlXCIsXG4gICAgICAgIGNvbG9yOiBcImluaGVyaXRcIixcbiAgICAgICAgZm9udFNpemU6IFwiNzAlXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiLjJlbSAxZW1cIixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjFweFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tYnV0dG9uXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudCgjZWZmMWY1LCAjZDlkOWRmKVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICM4ODhcIixcbiAgICAgICAgXCImOmFjdGl2ZVwiOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwibGluZWFyLWdyYWRpZW50KCNiNGI0YjQsICNkMGQzZDYpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCImZGFyayAuY20tYnV0dG9uXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudCgjMzkzOTM5LCAjMTExKVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICM4ODhcIixcbiAgICAgICAgXCImOmFjdGl2ZVwiOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwibGluZWFyLWdyYWRpZW50KCMxMTEsICMzMzMpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCIuY20tdGV4dGZpZWxkXCI6IHtcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJtaWRkbGVcIixcbiAgICAgICAgY29sb3I6IFwiaW5oZXJpdFwiLFxuICAgICAgICBmb250U2l6ZTogXCI3MCVcIixcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCBzaWx2ZXJcIixcbiAgICAgICAgcGFkZGluZzogXCIuMmVtIC41ZW1cIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXRleHRmaWVsZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ3aGl0ZVwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS10ZXh0ZmllbGRcIjoge1xuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICM1NTVcIixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcImluaGVyaXRcIlxuICAgIH1cbn0sIGxpZ2h0RGFya0lEcyk7XG5cbmNvbnN0IG9ic2VydmVPcHRpb25zID0ge1xuICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgIHN1YnRyZWU6IHRydWUsXG4gICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICBjaGFyYWN0ZXJEYXRhT2xkVmFsdWU6IHRydWVcbn07XG4vLyBJRTExIGhhcyB2ZXJ5IGJyb2tlbiBtdXRhdGlvbiBvYnNlcnZlcnMsIHNvIHdlIGFsc28gbGlzdGVuIHRvXG4vLyBET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWQgdGhlcmVcbmNvbnN0IHVzZUNoYXJEYXRhID0gYnJvd3Nlci5pZSAmJiBicm93c2VyLmllX3ZlcnNpb24gPD0gMTE7XG5jbGFzcyBET01PYnNlcnZlciB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVkaXRDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgLy8gVGhlIGtub3duIHNlbGVjdGlvbi4gS2VwdCBpbiBvdXIgb3duIG9iamVjdCwgYXMgb3Bwb3NlZCB0byBqdXN0XG4gICAgICAgIC8vIGRpcmVjdGx5IGFjY2Vzc2luZyB0aGUgc2VsZWN0aW9uIGJlY2F1c2U6XG4gICAgICAgIC8vICAtIFNhZmFyaSBkb2Vzbid0IHJlcG9ydCB0aGUgcmlnaHQgc2VsZWN0aW9uIGluIHNoYWRvdyBET01cbiAgICAgICAgLy8gIC0gUmVhZGluZyBmcm9tIHRoZSBzZWxlY3Rpb24gZm9yY2VzIGEgRE9NIGxheW91dFxuICAgICAgICAvLyAgLSBUaGlzIHdheSwgd2UgY2FuIGlnbm9yZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnRzIGlmIHdlIGhhdmVcbiAgICAgICAgLy8gICAgYWxyZWFkeSBzZWVuIHRoZSAnbmV3JyBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SYW5nZSA9IG5ldyBET01TZWxlY3Rpb25TdGF0ZTtcbiAgICAgICAgLy8gU2V0IHdoZW4gYSBzZWxlY3Rpb24gY2hhbmdlIGlzIGRldGVjdGVkLCBjbGVhcmVkIG9uIGZsdXNoXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlbGF5ZWRGbHVzaCA9IC0xO1xuICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5mbHVzaGluZ0FuZHJvaWRLZXkgPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0Q2hhbmdlID0gMDtcbiAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXRzID0gW107XG4gICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZXNpemVTY3JvbGwgPSBudWxsO1xuICAgICAgICB0aGlzLmludGVyc2VjdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmdhcEludGVyc2VjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuZ2FwcyA9IFtdO1xuICAgICAgICB0aGlzLnByaW50UXVlcnkgPSBudWxsO1xuICAgICAgICAvLyBUaW1lb3V0IGZvciBzY2hlZHVsaW5nIGNoZWNrIG9mIHRoZSBwYXJlbnRzIHRoYXQgbmVlZCBzY3JvbGwgaGFuZGxlcnNcbiAgICAgICAgdGhpcy5wYXJlbnRDaGVjayA9IC0xO1xuICAgICAgICB0aGlzLmRvbSA9IHZpZXcuY29udGVudERPTTtcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBtdXQgb2YgbXV0YXRpb25zKVxuICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaChtdXQpO1xuICAgICAgICAgICAgLy8gSUUxMSB3aWxsIHNvbWV0aW1lcyAob24gdHlwaW5nIG92ZXIgYSBzZWxlY3Rpb24gb3JcbiAgICAgICAgICAgIC8vIGJhY2tzcGFjaW5nIG91dCBhIHNpbmdsZSBjaGFyYWN0ZXIgdGV4dCBub2RlKSBjYWxsIHRoZVxuICAgICAgICAgICAgLy8gb2JzZXJ2ZXIgY2FsbGJhY2sgYmVmb3JlIGFjdHVhbGx5IHVwZGF0aW5nIHRoZSBET00uXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVW5yZWxhdGVkbHksIGlPUyBTYWZhcmkgd2lsbCwgd2hlbiBlbmRpbmcgYSBjb21wb3NpdGlvbixcbiAgICAgICAgICAgIC8vIHNvbWV0aW1lcyBmaXJzdCBjbGVhciBpdCwgZGVsaXZlciB0aGUgbXV0YXRpb25zLCBhbmQgdGhlblxuICAgICAgICAgICAgLy8gcmVpbnNlcnQgdGhlIGZpbmlzaGVkIHRleHQuIENvZGVNaXJyb3IncyBoYW5kbGluZyBvZiB0aGVcbiAgICAgICAgICAgIC8vIGRlbGV0aW9uIHdpbGwgcHJldmVudCB0aGUgcmVpbnNlcnRpb24gZnJvbSBoYXBwZW5pbmcsXG4gICAgICAgICAgICAvLyBicmVha2luZyBjb21wb3NpdGlvbi5cbiAgICAgICAgICAgIGlmICgoYnJvd3Nlci5pZSAmJiBicm93c2VyLmllX3ZlcnNpb24gPD0gMTEgfHwgYnJvd3Nlci5pb3MgJiYgdmlldy5jb21wb3NpbmcpICYmXG4gICAgICAgICAgICAgICAgbXV0YXRpb25zLnNvbWUobSA9PiBtLnR5cGUgPT0gXCJjaGlsZExpc3RcIiAmJiBtLnJlbW92ZWROb2Rlcy5sZW5ndGggfHxcbiAgICAgICAgICAgICAgICAgICAgbS50eXBlID09IFwiY2hhcmFjdGVyRGF0YVwiICYmIG0ub2xkVmFsdWUubGVuZ3RoID4gbS50YXJnZXQubm9kZVZhbHVlLmxlbmd0aCkpXG4gICAgICAgICAgICAgICAgdGhpcy5mbHVzaFNvb24oKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAod2luZG93LkVkaXRDb250ZXh0ICYmIHZpZXcuY29uc3RydWN0b3IuRURJVF9DT05URVhUICE9PSBmYWxzZSAmJlxuICAgICAgICAgICAgLy8gQ2hyb21lIDwxMjYgZG9lc24ndCBzdXBwb3J0IGludmVydGVkIHNlbGVjdGlvbnMgaW4gZWRpdCBjb250ZXh0ICgjMTM5MilcbiAgICAgICAgICAgICEoYnJvd3Nlci5jaHJvbWUgJiYgYnJvd3Nlci5jaHJvbWVfdmVyc2lvbiA8IDEyNikpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQgPSBuZXcgRWRpdENvbnRleHRNYW5hZ2VyKHZpZXcpO1xuICAgICAgICAgICAgaWYgKHZpZXcuc3RhdGUuZmFjZXQoZWRpdGFibGUpKVxuICAgICAgICAgICAgICAgIHZpZXcuY29udGVudERPTS5lZGl0Q29udGV4dCA9IHRoaXMuZWRpdENvbnRleHQuZWRpdENvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZUNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy5vbkNoYXJEYXRhID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKHsgdGFyZ2V0OiBldmVudC50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY2hhcmFjdGVyRGF0YVwiLFxuICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZTogZXZlbnQucHJldlZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uUmVzaXplID0gdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uUHJpbnQgPSB0aGlzLm9uUHJpbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblNjcm9sbCA9IHRoaXMub25TY3JvbGwuYmluZCh0aGlzKTtcbiAgICAgICAgaWYgKHdpbmRvdy5tYXRjaE1lZGlhKVxuICAgICAgICAgICAgdGhpcy5wcmludFF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoXCJwcmludFwiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplU2Nyb2xsID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgaWYgKCgoX2EgPSB0aGlzLnZpZXcuZG9jVmlldykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxhc3RVcGRhdGUpIDwgRGF0ZS5ub3coKSAtIDc1KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUmVzaXplKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVzaXplU2Nyb2xsLm9ic2VydmUodmlldy5zY3JvbGxET00pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkV2luZG93TGlzdGVuZXJzKHRoaXMud2luID0gdmlldy53aW4pO1xuICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICAgIGlmICh0eXBlb2YgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbiA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRDaGVjayA8IDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Q2hlY2sgPSBzZXRUaW1lb3V0KHRoaXMubGlzdGVuRm9yU2Nyb2xsLmJpbmQodGhpcyksIDEwMDApO1xuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDAgJiYgKGVudHJpZXNbZW50cmllcy5sZW5ndGggLSAxXS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApICE9IHRoaXMuaW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJzZWN0aW5nID0gIXRoaXMuaW50ZXJzZWN0aW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnRlcnNlY3RpbmcgIT0gdGhpcy52aWV3LmluVmlldylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2VkKGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHsgdGhyZXNob2xkOiBbMCwgLjAwMV0gfSk7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbi5vYnNlcnZlKHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuZ2FwSW50ZXJzZWN0aW9uID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDAgJiYgZW50cmllc1tlbnRyaWVzLmxlbmd0aCAtIDFdLmludGVyc2VjdGlvblJhdGlvID4gMClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNjcm9sbENoYW5nZWQoZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKSk7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saXN0ZW5Gb3JTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICB9XG4gICAgb25TY3JvbGxDaGFuZ2VkKGUpIHtcbiAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUucnVuSGFuZGxlcnMoXCJzY3JvbGxcIiwgZSk7XG4gICAgICAgIGlmICh0aGlzLmludGVyc2VjdGluZylcbiAgICAgICAgICAgIHRoaXMudmlldy5tZWFzdXJlKCk7XG4gICAgfVxuICAgIG9uU2Nyb2xsKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJzZWN0aW5nKVxuICAgICAgICAgICAgdGhpcy5mbHVzaChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmVkaXRDb250ZXh0KVxuICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMuZWRpdENvbnRleHQubWVhc3VyZVJlcSk7XG4gICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2VkKGUpO1xuICAgIH1cbiAgICBvblJlc2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplVGltZW91dCA8IDApXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgICAgIH0sIDUwKTtcbiAgICB9XG4gICAgb25QcmludChldmVudCkge1xuICAgICAgICBpZiAoKGV2ZW50LnR5cGUgPT0gXCJjaGFuZ2VcIiB8fCAhZXZlbnQudHlwZSkgJiYgIWV2ZW50Lm1hdGNoZXMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMudmlldy52aWV3U3RhdGUucHJpbnRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXcubWVhc3VyZSgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlldy52aWV3U3RhdGUucHJpbnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cbiAgICB1cGRhdGVHYXBzKGdhcHMpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2FwSW50ZXJzZWN0aW9uICYmIChnYXBzLmxlbmd0aCAhPSB0aGlzLmdhcHMubGVuZ3RoIHx8IHRoaXMuZ2Fwcy5zb21lKChnLCBpKSA9PiBnICE9IGdhcHNbaV0pKSkge1xuICAgICAgICAgICAgdGhpcy5nYXBJbnRlcnNlY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgZ2FwIG9mIGdhcHMpXG4gICAgICAgICAgICAgICAgdGhpcy5nYXBJbnRlcnNlY3Rpb24ub2JzZXJ2ZShnYXApO1xuICAgICAgICAgICAgdGhpcy5nYXBzID0gZ2FwcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblNlbGVjdGlvbkNoYW5nZShldmVudCkge1xuICAgICAgICBsZXQgd2FzQ2hhbmdlZCA9IHRoaXMuc2VsZWN0aW9uQ2hhbmdlZDtcbiAgICAgICAgaWYgKCF0aGlzLnJlYWRTZWxlY3Rpb25SYW5nZSgpIHx8IHRoaXMuZGVsYXllZEFuZHJvaWRLZXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXMsIHNlbCA9IHRoaXMuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgIGlmICh2aWV3LnN0YXRlLmZhY2V0KGVkaXRhYmxlKSA/IHZpZXcucm9vdC5hY3RpdmVFbGVtZW50ICE9IHRoaXMuZG9tIDogIWhhc1NlbGVjdGlvbih0aGlzLmRvbSwgc2VsKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGNvbnRleHQgPSBzZWwuYW5jaG9yTm9kZSAmJiB2aWV3LmRvY1ZpZXcubmVhcmVzdChzZWwuYW5jaG9yTm9kZSk7XG4gICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuaWdub3JlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgICBpZiAoIXdhc0NoYW5nZWQpXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVsZXRpb25zIG9uIElFMTEgZmlyZSB0aGVpciBldmVudHMgaW4gdGhlIHdyb25nIG9yZGVyLCBnaXZpbmdcbiAgICAgICAgLy8gdXMgYSBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50IGJlZm9yZSB0aGUgRE9NIGNoYW5nZXMgYXJlXG4gICAgICAgIC8vIHJlcG9ydGVkLlxuICAgICAgICAvLyBDaHJvbWUgQW5kcm9pZCBoYXMgYSBzaW1pbGFyIGlzc3VlIHdoZW4gYmFja3NwYWNpbmcgb3V0IGFcbiAgICAgICAgLy8gc2VsZWN0aW9uICgjNjQ1KS5cbiAgICAgICAgaWYgKChicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8PSAxMSB8fCBicm93c2VyLmFuZHJvaWQgJiYgYnJvd3Nlci5jaHJvbWUpICYmICF2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmVtcHR5ICYmXG4gICAgICAgICAgICAvLyAoU2VsZWN0aW9uLmlzQ29sbGFwc2VkIGlzbid0IHJlbGlhYmxlIG9uIElFKVxuICAgICAgICAgICAgc2VsLmZvY3VzTm9kZSAmJiBpc0VxdWl2YWxlbnRQb3NpdGlvbihzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQsIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KSlcbiAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZmx1c2goZmFsc2UpO1xuICAgIH1cbiAgICByZWFkU2VsZWN0aW9uUmFuZ2UoKSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXM7XG4gICAgICAgIC8vIFRoZSBTZWxlY3Rpb24gb2JqZWN0IGlzIGJyb2tlbiBpbiBzaGFkb3cgcm9vdHMgaW4gU2FmYXJpLiBTZWVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvZGV2L2lzc3Vlcy80MTRcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbih2aWV3LnJvb3QpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHJhbmdlID0gYnJvd3Nlci5zYWZhcmkgJiYgdmlldy5yb290Lm5vZGVUeXBlID09IDExICYmXG4gICAgICAgICAgICB2aWV3LnJvb3QuYWN0aXZlRWxlbWVudCA9PSB0aGlzLmRvbSAmJlxuICAgICAgICAgICAgc2FmYXJpU2VsZWN0aW9uUmFuZ2VIYWNrKHRoaXMudmlldywgc2VsZWN0aW9uKSB8fCBzZWxlY3Rpb247XG4gICAgICAgIGlmICghcmFuZ2UgfHwgdGhpcy5zZWxlY3Rpb25SYW5nZS5lcShyYW5nZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBsb2NhbCA9IGhhc1NlbGVjdGlvbih0aGlzLmRvbSwgcmFuZ2UpO1xuICAgICAgICAvLyBEZXRlY3QgdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGUgYnJvd3NlciBoYXMsIG9uIGZvY3VzLCBtb3ZlZCB0aGVcbiAgICAgICAgLy8gc2VsZWN0aW9uIHRvIHRoZSBzdGFydCBvZiB0aGUgY29udGVudCBlbGVtZW50LiBSZXNldCBpdCB0byB0aGVcbiAgICAgICAgLy8gcG9zaXRpb24gZnJvbSB0aGUgZWRpdG9yIHN0YXRlLlxuICAgICAgICBpZiAobG9jYWwgJiYgIXRoaXMuc2VsZWN0aW9uQ2hhbmdlZCAmJlxuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPiBEYXRlLm5vdygpIC0gMjAwICYmXG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUubGFzdFRvdWNoVGltZSA8IERhdGUubm93KCkgLSAzMDAgJiZcbiAgICAgICAgICAgIGF0RWxlbWVudFN0YXJ0KHRoaXMuZG9tLCByYW5nZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPSAwO1xuICAgICAgICAgICAgdmlldy5kb2NWaWV3LnVwZGF0ZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2Uuc2V0UmFuZ2UocmFuZ2UpO1xuICAgICAgICBpZiAobG9jYWwpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc2V0U2VsZWN0aW9uUmFuZ2UoYW5jaG9yLCBoZWFkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2Uuc2V0KGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0LCBoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuICAgIGNsZWFyU2VsZWN0aW9uUmFuZ2UoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2Uuc2V0KG51bGwsIDAsIG51bGwsIDApO1xuICAgIH1cbiAgICBsaXN0ZW5Gb3JTY3JvbGwoKSB7XG4gICAgICAgIHRoaXMucGFyZW50Q2hlY2sgPSAtMTtcbiAgICAgICAgbGV0IGkgPSAwLCBjaGFuZ2VkID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgZG9tID0gdGhpcy5kb207IGRvbTspIHtcbiAgICAgICAgICAgIGlmIChkb20ubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgICAgIGlmICghY2hhbmdlZCAmJiBpIDwgdGhpcy5zY3JvbGxUYXJnZXRzLmxlbmd0aCAmJiB0aGlzLnNjcm9sbFRhcmdldHNbaV0gPT0gZG9tKVxuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWNoYW5nZWQpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0aGlzLnNjcm9sbFRhcmdldHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQucHVzaChkb20pO1xuICAgICAgICAgICAgICAgIGRvbSA9IGRvbS5hc3NpZ25lZFNsb3QgfHwgZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkb20ubm9kZVR5cGUgPT0gMTEpIHsgLy8gU2hhZG93IHJvb3RcbiAgICAgICAgICAgICAgICBkb20gPSBkb20uaG9zdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgdGhpcy5zY3JvbGxUYXJnZXRzLmxlbmd0aCAmJiAhY2hhbmdlZClcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0aGlzLnNjcm9sbFRhcmdldHMuc2xpY2UoMCwgaSk7XG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkb20gb2YgdGhpcy5zY3JvbGxUYXJnZXRzKVxuICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICAgICAgZm9yIChsZXQgZG9tIG9mIHRoaXMuc2Nyb2xsVGFyZ2V0cyA9IGNoYW5nZWQpXG4gICAgICAgICAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWdub3JlKGYpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcbiAgICAgICAgICAgIHJldHVybiBmKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgIHJldHVybiBmKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZG9tLCBvYnNlcnZlT3B0aW9ucyk7XG4gICAgICAgIGlmICh1c2VDaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIiwgdGhpcy5vbkNoYXJEYXRhKTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgaWYgKHVzZUNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLm9uQ2hhckRhdGEpO1xuICAgIH1cbiAgICAvLyBUaHJvdyBhd2F5IGFueSBwZW5kaW5nIGNoYW5nZXNcbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzUmVjb3JkcygpO1xuICAgICAgICB0aGlzLnF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBDaHJvbWUgQW5kcm9pZCwgZXNwZWNpYWxseSBpbiBjb21iaW5hdGlvbiB3aXRoIEdCb2FyZCwgbm90IG9ubHlcbiAgICAvLyBkb2Vzbid0IHJlbGlhYmx5IGZpcmUgcmVndWxhciBrZXkgZXZlbnRzLCBidXQgYWxzbyBvZnRlblxuICAgIC8vIHN1cnJvdW5kcyB0aGUgZWZmZWN0IG9mIGVudGVyIG9yIGJhY2tzcGFjZSB3aXRoIGEgYnVuY2ggb2ZcbiAgICAvLyBjb21wb3NpdGlvbiBldmVudHMgdGhhdCwgd2hlbiBpbnRlcnJ1cHRlZCwgY2F1c2UgdGV4dCBkdXBsaWNhdGlvblxuICAgIC8vIG9yIG90aGVyIGtpbmRzIG9mIGNvcnJ1cHRpb24uIFRoaXMgaGFjayBtYWtlcyB0aGUgZWRpdG9yIGJhY2sgb2ZmXG4gICAgLy8gZnJvbSBoYW5kbGluZyBET00gY2hhbmdlcyBmb3IgYSBtb21lbnQgd2hlbiBzdWNoIGEga2V5IGlzXG4gICAgLy8gZGV0ZWN0ZWQgKHZpYSBiZWZvcmVpbnB1dCBvciBrZXlkb3duKSwgYW5kIHRoZW4gdHJpZXMgdG8gZmx1c2hcbiAgICAvLyB0aGVtIG9yLCBpZiB0aGF0IGhhcyBubyBlZmZlY3QsIGRpc3BhdGNoZXMgdGhlIGdpdmVuIGtleS5cbiAgICBkZWxheUFuZHJvaWRLZXkoa2V5LCBrZXlDb2RlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5KSB7XG4gICAgICAgICAgICBsZXQgZmx1c2ggPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMuZGVsYXllZEFuZHJvaWRLZXk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyRGVsYXllZEFuZHJvaWRLZXkoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEtleUNvZGUgPSBrZXkua2V5Q29kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEtleVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmx1c2hlZCA9IHRoaXMuZmx1c2goKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmbHVzaGVkICYmIGtleS5mb3JjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoS2V5KHRoaXMuZG9tLCBrZXkua2V5LCBrZXkua2V5Q29kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5ID0gdGhpcy52aWV3Lndpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZmx1c2gpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmNlIGJhY2tzcGFjZSBiZWZvcmVpbnB1dCBpcyBzb21ldGltZXMgc2lnbmFsbGVkIHNwdXJpb3VzbHksXG4gICAgICAgIC8vIEVudGVyIGFsd2F5cyB0YWtlcyBwcmVjZWRlbmNlLlxuICAgICAgICBpZiAoIXRoaXMuZGVsYXllZEFuZHJvaWRLZXkgfHwga2V5ID09IFwiRW50ZXJcIilcbiAgICAgICAgICAgIHRoaXMuZGVsYXllZEFuZHJvaWRLZXkgPSB7XG4gICAgICAgICAgICAgICAga2V5LCBrZXlDb2RlLFxuICAgICAgICAgICAgICAgIC8vIE9ubHkgcnVuIHRoZSBrZXkgaGFuZGxlciB3aGVuIG5vIGNoYW5nZXMgYXJlIGRldGVjdGVkIGlmXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpc24ndCBjb21pbmcgcmlnaHQgYWZ0ZXIgYW5vdGhlciBjaGFuZ2UsIGluIHdoaWNoIGNhc2VcbiAgICAgICAgICAgICAgICAvLyBpdCBpcyBwcm9iYWJseSBwYXJ0IG9mIGEgd2VpcmQgY2hhaW4gb2YgdXBkYXRlcywgYW5kIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIGJlIGlnbm9yZWQgaWYgaXQgcmV0dXJucyB0aGUgRE9NIHRvIGl0cyBwcmV2aW91cyBzdGF0ZS5cbiAgICAgICAgICAgICAgICBmb3JjZTogdGhpcy5sYXN0Q2hhbmdlIDwgRGF0ZS5ub3coKSAtIDUwIHx8ICEhKChfYSA9IHRoaXMuZGVsYXllZEFuZHJvaWRLZXkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb3JjZSlcbiAgICAgICAgICAgIH07XG4gICAgfVxuICAgIGNsZWFyRGVsYXllZEFuZHJvaWRLZXkoKSB7XG4gICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5KTtcbiAgICAgICAgdGhpcy5kZWxheWVkQW5kcm9pZEtleSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5ID0gLTE7XG4gICAgfVxuICAgIGZsdXNoU29vbigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsYXllZEZsdXNoIDwgMClcbiAgICAgICAgICAgIHRoaXMuZGVsYXllZEZsdXNoID0gdGhpcy52aWV3Lndpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4geyB0aGlzLmRlbGF5ZWRGbHVzaCA9IC0xOyB0aGlzLmZsdXNoKCk7IH0pO1xuICAgIH1cbiAgICBmb3JjZUZsdXNoKCkge1xuICAgICAgICBpZiAodGhpcy5kZWxheWVkRmx1c2ggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy52aWV3Lndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmRlbGF5ZWRGbHVzaCk7XG4gICAgICAgICAgICB0aGlzLmRlbGF5ZWRGbHVzaCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICB9XG4gICAgcGVuZGluZ1JlY29yZHMoKSB7XG4gICAgICAgIGZvciAobGV0IG11dCBvZiB0aGlzLm9ic2VydmVyLnRha2VSZWNvcmRzKCkpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobXV0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWU7XG4gICAgfVxuICAgIHByb2Nlc3NSZWNvcmRzKCkge1xuICAgICAgICBsZXQgcmVjb3JkcyA9IHRoaXMucGVuZGluZ1JlY29yZHMoKTtcbiAgICAgICAgaWYgKHJlY29yZHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICBsZXQgZnJvbSA9IC0xLCB0byA9IC0xLCB0eXBlT3ZlciA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gdGhpcy5yZWFkTXV0YXRpb24ocmVjb3JkKTtcbiAgICAgICAgICAgIGlmICghcmFuZ2UpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmFuZ2UudHlwZU92ZXIpXG4gICAgICAgICAgICAgICAgdHlwZU92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGZyb20gPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAoeyBmcm9tLCB0byB9ID0gcmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJvbSA9IE1hdGgubWluKHJhbmdlLmZyb20sIGZyb20pO1xuICAgICAgICAgICAgICAgIHRvID0gTWF0aC5tYXgocmFuZ2UudG8sIHRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmcm9tLCB0bywgdHlwZU92ZXIgfTtcbiAgICB9XG4gICAgcmVhZENoYW5nZSgpIHtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8sIHR5cGVPdmVyIH0gPSB0aGlzLnByb2Nlc3NSZWNvcmRzKCk7XG4gICAgICAgIGxldCBuZXdTZWwgPSB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgJiYgaGFzU2VsZWN0aW9uKHRoaXMuZG9tLCB0aGlzLnNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgaWYgKGZyb20gPCAwICYmICFuZXdTZWwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGZyb20gPiAtMSlcbiAgICAgICAgICAgIHRoaXMubGFzdENoYW5nZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPSAwO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGNoYW5nZSA9IG5ldyBET01DaGFuZ2UodGhpcy52aWV3LCBmcm9tLCB0bywgdHlwZU92ZXIpO1xuICAgICAgICB0aGlzLnZpZXcuZG9jVmlldy5kb21DaGFuZ2VkID0geyBuZXdTZWw6IGNoYW5nZS5uZXdTZWwgPyBjaGFuZ2UubmV3U2VsLm1haW4gOiBudWxsIH07XG4gICAgICAgIHJldHVybiBjaGFuZ2U7XG4gICAgfVxuICAgIC8vIEFwcGx5IHBlbmRpbmcgY2hhbmdlcywgaWYgYW55XG4gICAgZmx1c2gocmVhZFNlbGVjdGlvbiA9IHRydWUpIHtcbiAgICAgICAgLy8gQ29tcGxldGVseSBob2xkIG9mZiBmbHVzaGluZyB3aGVuIHBlbmRpbmcga2V5cyBhcmUgc2V0XHUyMDE0dGhlIGNvZGVcbiAgICAgICAgLy8gbWFuYWdpbmcgdGhvc2Ugd2lsbCBtYWtlIHN1cmUgcHJvY2Vzc1JlY29yZHMgaXMgY2FsbGVkIGFuZCB0aGVcbiAgICAgICAgLy8gdmlldyBpcyByZXN5bmNocm9uaXplZCBhZnRlclxuICAgICAgICBpZiAodGhpcy5kZWxheWVkRmx1c2ggPj0gMCB8fCB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAocmVhZFNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBkb21DaGFuZ2UgPSB0aGlzLnJlYWRDaGFuZ2UoKTtcbiAgICAgICAgaWYgKCFkb21DaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydFN0YXRlID0gdGhpcy52aWV3LnN0YXRlO1xuICAgICAgICBsZXQgaGFuZGxlZCA9IGFwcGx5RE9NQ2hhbmdlKHRoaXMudmlldywgZG9tQ2hhbmdlKTtcbiAgICAgICAgLy8gVGhlIHZpZXcgd2Fzbid0IHVwZGF0ZWQgYnV0IERPTS9zZWxlY3Rpb24gY2hhbmdlcyB3ZXJlIHNlZW4uIFJlc2V0IHRoZSB2aWV3LlxuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlID09IHN0YXJ0U3RhdGUgJiZcbiAgICAgICAgICAgIChkb21DaGFuZ2UuZG9tQ2hhbmdlZCB8fCBkb21DaGFuZ2UubmV3U2VsICYmICFkb21DaGFuZ2UubmV3U2VsLm1haW4uZXEodGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluKSkpXG4gICAgICAgICAgICB0aGlzLnZpZXcudXBkYXRlKFtdKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgfVxuICAgIHJlYWRNdXRhdGlvbihyZWMpIHtcbiAgICAgICAgbGV0IGNWaWV3ID0gdGhpcy52aWV3LmRvY1ZpZXcubmVhcmVzdChyZWMudGFyZ2V0KTtcbiAgICAgICAgaWYgKCFjVmlldyB8fCBjVmlldy5pZ25vcmVNdXRhdGlvbihyZWMpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNWaWV3Lm1hcmtEaXJ0eShyZWMudHlwZSA9PSBcImF0dHJpYnV0ZXNcIik7XG4gICAgICAgIGlmIChyZWMudHlwZSA9PSBcImF0dHJpYnV0ZXNcIilcbiAgICAgICAgICAgIGNWaWV3LmZsYWdzIHw9IDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLztcbiAgICAgICAgaWYgKHJlYy50eXBlID09IFwiY2hpbGRMaXN0XCIpIHtcbiAgICAgICAgICAgIGxldCBjaGlsZEJlZm9yZSA9IGZpbmRDaGlsZChjVmlldywgcmVjLnByZXZpb3VzU2libGluZyB8fCByZWMudGFyZ2V0LnByZXZpb3VzU2libGluZywgLTEpO1xuICAgICAgICAgICAgbGV0IGNoaWxkQWZ0ZXIgPSBmaW5kQ2hpbGQoY1ZpZXcsIHJlYy5uZXh0U2libGluZyB8fCByZWMudGFyZ2V0Lm5leHRTaWJsaW5nLCAxKTtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IGNoaWxkQmVmb3JlID8gY1ZpZXcucG9zQWZ0ZXIoY2hpbGRCZWZvcmUpIDogY1ZpZXcucG9zQXRTdGFydCxcbiAgICAgICAgICAgICAgICB0bzogY2hpbGRBZnRlciA/IGNWaWV3LnBvc0JlZm9yZShjaGlsZEFmdGVyKSA6IGNWaWV3LnBvc0F0RW5kLCB0eXBlT3ZlcjogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWMudHlwZSA9PSBcImNoYXJhY3RlckRhdGFcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogY1ZpZXcucG9zQXRTdGFydCwgdG86IGNWaWV3LnBvc0F0RW5kLCB0eXBlT3ZlcjogcmVjLnRhcmdldC5ub2RlVmFsdWUgPT0gcmVjLm9sZFZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRXaW5kb3cod2luKSB7XG4gICAgICAgIGlmICh3aW4gIT0gdGhpcy53aW4pIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlV2luZG93TGlzdGVuZXJzKHRoaXMud2luKTtcbiAgICAgICAgICAgIHRoaXMud2luID0gd2luO1xuICAgICAgICAgICAgdGhpcy5hZGRXaW5kb3dMaXN0ZW5lcnModGhpcy53aW4pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZFdpbmRvd0xpc3RlbmVycyh3aW4pIHtcbiAgICAgICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5vblJlc2l6ZSk7XG4gICAgICAgIGlmICh0aGlzLnByaW50UXVlcnkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByaW50UXVlcnkuYWRkRXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICAgICAgICB0aGlzLnByaW50UXVlcnkuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCB0aGlzLm9uUHJpbnQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMucHJpbnRRdWVyeS5hZGRMaXN0ZW5lcih0aGlzLm9uUHJpbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlcHJpbnRcIiwgdGhpcy5vblByaW50KTtcbiAgICAgICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgICAgIHdpbi5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UpO1xuICAgIH1cbiAgICByZW1vdmVXaW5kb3dMaXN0ZW5lcnMod2luKSB7XG4gICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm9uUmVzaXplKTtcbiAgICAgICAgaWYgKHRoaXMucHJpbnRRdWVyeSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJpbnRRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKVxuICAgICAgICAgICAgICAgIHRoaXMucHJpbnRRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIHRoaXMub25QcmludCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5wcmludFF1ZXJ5LnJlbW92ZUxpc3RlbmVyKHRoaXMub25QcmludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmVwcmludFwiLCB0aGlzLm9uUHJpbnQpO1xuICAgICAgICB3aW4uZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5lZGl0Q29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dC51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChlZGl0YWJsZSkgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KGVkaXRhYmxlKSlcbiAgICAgICAgICAgICAgICB1cGRhdGUudmlldy5jb250ZW50RE9NLmVkaXRDb250ZXh0ID0gdXBkYXRlLnN0YXRlLmZhY2V0KGVkaXRhYmxlKSA/IHRoaXMuZWRpdENvbnRleHQuZWRpdENvbnRleHQgOiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgKF9hID0gdGhpcy5pbnRlcnNlY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kaXNjb25uZWN0KCk7XG4gICAgICAgIChfYiA9IHRoaXMuZ2FwSW50ZXJzZWN0aW9uKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZGlzY29ubmVjdCgpO1xuICAgICAgICAoX2MgPSB0aGlzLnJlc2l6ZVNjcm9sbCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgZm9yIChsZXQgZG9tIG9mIHRoaXMuc2Nyb2xsVGFyZ2V0cylcbiAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB0aGlzLnJlbW92ZVdpbmRvd0xpc3RlbmVycyh0aGlzLndpbik7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBhcmVudENoZWNrKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7XG4gICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZGVsYXllZEZsdXNoKTtcbiAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5mbHVzaGluZ0FuZHJvaWRLZXkpO1xuICAgICAgICBpZiAodGhpcy5lZGl0Q29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy52aWV3LmNvbnRlbnRET00uZWRpdENvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kQ2hpbGQoY1ZpZXcsIGRvbSwgZGlyKSB7XG4gICAgd2hpbGUgKGRvbSkge1xuICAgICAgICBsZXQgY3VyVmlldyA9IENvbnRlbnRWaWV3LmdldChkb20pO1xuICAgICAgICBpZiAoY3VyVmlldyAmJiBjdXJWaWV3LnBhcmVudCA9PSBjVmlldylcbiAgICAgICAgICAgIHJldHVybiBjdXJWaWV3O1xuICAgICAgICBsZXQgcGFyZW50ID0gZG9tLnBhcmVudE5vZGU7XG4gICAgICAgIGRvbSA9IHBhcmVudCAhPSBjVmlldy5kb20gPyBwYXJlbnQgOiBkaXIgPiAwID8gZG9tLm5leHRTaWJsaW5nIDogZG9tLnByZXZpb3VzU2libGluZztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBidWlsZFNlbGVjdGlvblJhbmdlRnJvbVJhbmdlKHZpZXcsIHJhbmdlKSB7XG4gICAgbGV0IGFuY2hvck5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lciwgYW5jaG9yT2Zmc2V0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgbGV0IGZvY3VzTm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lciwgZm9jdXNPZmZzZXQgPSByYW5nZS5lbmRPZmZzZXQ7XG4gICAgbGV0IGN1ckFuY2hvciA9IHZpZXcuZG9jVmlldy5kb21BdFBvcyh2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmFuY2hvcik7XG4gICAgLy8gU2luY2Ugc3VjaCBhIHJhbmdlIGRvZXNuJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbmNob3IgYW5kIGhlYWQsXG4gICAgLy8gdXNlIGEgaGV1cmlzdGljIHRoYXQgZmxpcHMgaXQgYXJvdW5kIGlmIGl0cyBlbmQgbWF0Y2hlcyB0aGVcbiAgICAvLyBjdXJyZW50IGFuY2hvci5cbiAgICBpZiAoaXNFcXVpdmFsZW50UG9zaXRpb24oY3VyQW5jaG9yLm5vZGUsIGN1ckFuY2hvci5vZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpKVxuICAgICAgICBbYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0XSA9IFtmb2N1c05vZGUsIGZvY3VzT2Zmc2V0LCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXRdO1xuICAgIHJldHVybiB7IGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCB9O1xufVxuLy8gVXNlZCB0byB3b3JrIGFyb3VuZCBhIFNhZmFyaSBTZWxlY3Rpb24vc2hhZG93IERPTSBidWcgKCM0MTQpXG5mdW5jdGlvbiBzYWZhcmlTZWxlY3Rpb25SYW5nZUhhY2sodmlldywgc2VsZWN0aW9uKSB7XG4gICAgaWYgKHNlbGVjdGlvbi5nZXRDb21wb3NlZFJhbmdlcykge1xuICAgICAgICBsZXQgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0Q29tcG9zZWRSYW5nZXModmlldy5yb290KVswXTtcbiAgICAgICAgaWYgKHJhbmdlKVxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkU2VsZWN0aW9uUmFuZ2VGcm9tUmFuZ2UodmlldywgcmFuZ2UpO1xuICAgIH1cbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIC8vIEJlY2F1c2UgU2FmYXJpIChhdCBsZWFzdCBpbiAyMDE4LTIwMjEpIGRvZXNuJ3QgcHJvdmlkZSByZWd1bGFyXG4gICAgLy8gYWNjZXNzIHRvIHRoZSBzZWxlY3Rpb24gaW5zaWRlIGEgc2hhZG93cm9vdCwgd2UgaGF2ZSB0byBwZXJmb3JtIGFcbiAgICAvLyByaWRpY3Vsb3VzIGhhY2sgdG8gZ2V0IGF0IGl0XHUyMDE0dXNpbmcgYGV4ZWNDb21tYW5kYCB0byB0cmlnZ2VyIGFcbiAgICAvLyBgYmVmb3JlSW5wdXRgIGV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHRhcmdldCByYW5nZSBmcm9tIHRoZVxuICAgIC8vIGV2ZW50LlxuICAgIGZ1bmN0aW9uIHJlYWQoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGZvdW5kID0gZXZlbnQuZ2V0VGFyZ2V0UmFuZ2VzKClbMF07XG4gICAgfVxuICAgIHZpZXcuY29udGVudERPTS5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgcmVhZCwgdHJ1ZSk7XG4gICAgdmlldy5kb20ub3duZXJEb2N1bWVudC5leGVjQ29tbWFuZChcImluZGVudFwiKTtcbiAgICB2aWV3LmNvbnRlbnRET00ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJlZm9yZWlucHV0XCIsIHJlYWQsIHRydWUpO1xuICAgIHJldHVybiBmb3VuZCA/IGJ1aWxkU2VsZWN0aW9uUmFuZ2VGcm9tUmFuZ2UodmlldywgZm91bmQpIDogbnVsbDtcbn1cbmNsYXNzIEVkaXRDb250ZXh0TWFuYWdlciB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAvLyBUaGUgZG9jdW1lbnQgd2luZG93IGZvciB3aGljaCB0aGUgdGV4dCBpbiB0aGUgY29udGV4dCBpc1xuICAgICAgICAvLyBtYWludGFpbmVkLiBGb3IgbGFyZ2UgZG9jdW1lbnRzLCB0aGlzIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlXG4gICAgICAgIC8vIGVkaXRvciBkb2N1bWVudC4gVGhpcyB3aW5kb3cgYWx3YXlzIGluY2x1ZGVzIHRoZSBzZWxlY3Rpb24gaGVhZC5cbiAgICAgICAgdGhpcy5mcm9tID0gMDtcbiAgICAgICAgdGhpcy50byA9IDA7XG4gICAgICAgIC8vIFdoZW4gYXBwbHlpbmcgYSB0cmFuc2FjdGlvbiwgdGhpcyBpcyB1c2VkIHRvIGNvbXBhcmUgdGhlIGNoYW5nZVxuICAgICAgICAvLyBtYWRlIHRvIHRoZSBjb250ZXh0IGNvbnRlbnQgdG8gdGhlIGNoYW5nZSBpbiB0aGUgdHJhbnNhY3Rpb24gaW5cbiAgICAgICAgLy8gb3JkZXIgdG8gbWFrZSB0aGUgbWluaW1hbCBjaGFuZ2VzIHRvIHRoZSBjb250ZXh0IChzaW5jZSB0b3VjaGluZ1xuICAgICAgICAvLyB0aGF0IHNvbWV0aW1lcyBicmVha3Mgc2VyaWVzIG9mIG11bHRpcGxlIGVkaXRzIG1hZGUgZm9yIGEgc2luZ2xlXG4gICAgICAgIC8vIHVzZXIgYWN0aW9uIG9uIHNvbWUgQW5kcm9pZCBrZXlib2FyZHMpXG4gICAgICAgIHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgLy8gS2x1ZGdlIHRvIHdvcmsgYXJvdW5kIHRoZSBmYWN0IHRoYXQgRWRpdENvbnRleHQgZG9lcyBub3QgcmVzcG9uZFxuICAgICAgICAvLyB3ZWxsIHRvIGhhdmluZyBpdHMgY29udGVudCB1cGRhdGVkIGR1cmluZyBhIGNvbXBvc2l0aW9uIChzZWUgIzE0NzIpXG4gICAgICAgIHRoaXMuY29tcG9zaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZXNldFJhbmdlKHZpZXcuc3RhdGUpO1xuICAgICAgICBsZXQgY29udGV4dCA9IHRoaXMuZWRpdENvbnRleHQgPSBuZXcgd2luZG93LkVkaXRDb250ZXh0KHtcbiAgICAgICAgICAgIHRleHQ6IHZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRoaXMuZnJvbSwgdGhpcy50byksXG4gICAgICAgICAgICBzZWxlY3Rpb25TdGFydDogdGhpcy50b0NvbnRleHRQb3MoTWF0aC5tYXgodGhpcy5mcm9tLCBNYXRoLm1pbih0aGlzLnRvLCB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmFuY2hvcikpKSxcbiAgICAgICAgICAgIHNlbGVjdGlvbkVuZDogdGhpcy50b0NvbnRleHRQb3Modmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkKVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5oYW5kbGVycy50ZXh0dXBkYXRlID0gZSA9PiB7XG4gICAgICAgICAgICBsZXQgbWFpbiA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4sIHsgYW5jaG9yLCBoZWFkIH0gPSBtYWluO1xuICAgICAgICAgICAgbGV0IGZyb20gPSB0aGlzLnRvRWRpdG9yUG9zKGUudXBkYXRlUmFuZ2VTdGFydCksIHRvID0gdGhpcy50b0VkaXRvclBvcyhlLnVwZGF0ZVJhbmdlRW5kKTtcbiAgICAgICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDAgJiYgIXRoaXMuY29tcG9zaW5nKVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9zaW5nID0geyBjb250ZXh0QmFzZTogZS51cGRhdGVSYW5nZVN0YXJ0LCBlZGl0b3JCYXNlOiBmcm9tLCBkcmlmdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgbGV0IGNoYW5nZSA9IHsgZnJvbSwgdG8sIGluc2VydDogVGV4dC5vZihlLnRleHQuc3BsaXQoXCJcXG5cIikpIH07XG4gICAgICAgICAgICAvLyBJZiB0aGUgd2luZG93IGRvZXNuJ3QgaW5jbHVkZSB0aGUgYW5jaG9yLCBhc3N1bWUgY2hhbmdlc1xuICAgICAgICAgICAgLy8gYWRqYWNlbnQgdG8gYSBzaWRlIGdvIHVwIHRvIHRoZSBhbmNob3IuXG4gICAgICAgICAgICBpZiAoY2hhbmdlLmZyb20gPT0gdGhpcy5mcm9tICYmIGFuY2hvciA8IHRoaXMuZnJvbSlcbiAgICAgICAgICAgICAgICBjaGFuZ2UuZnJvbSA9IGFuY2hvcjtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoYW5nZS50byA9PSB0aGlzLnRvICYmIGFuY2hvciA+IHRoaXMudG8pXG4gICAgICAgICAgICAgICAgY2hhbmdlLnRvID0gYW5jaG9yO1xuICAgICAgICAgICAgLy8gRWRpdCBjb250ZXh0cyBzb21ldGltZXMgZmlyZSBlbXB0eSBjaGFuZ2VzXG4gICAgICAgICAgICBpZiAoY2hhbmdlLmZyb20gPT0gY2hhbmdlLnRvICYmICFjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXdTZWwgPSBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKHRoaXMudG9FZGl0b3JQb3MoZS5zZWxlY3Rpb25TdGFydCksIHRoaXMudG9FZGl0b3JQb3MoZS5zZWxlY3Rpb25FbmQpKTtcbiAgICAgICAgICAgICAgICBpZiAoIW5ld1NlbC5tYWluLmVxKG1haW4pKVxuICAgICAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgc2VsZWN0aW9uOiBuZXdTZWwsIHVzZXJFdmVudDogXCJzZWxlY3RcIiB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGJyb3dzZXIubWFjIHx8IGJyb3dzZXIuYW5kcm9pZCkgJiYgY2hhbmdlLmZyb20gPT0gaGVhZCAtIDEgJiZcbiAgICAgICAgICAgICAgICAvXlxcLiA/JC8udGVzdChlLnRleHQpICYmIHZpZXcuY29udGVudERPTS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29ycmVjdFwiKSA9PSBcIm9mZlwiKVxuICAgICAgICAgICAgICAgIGNoYW5nZSA9IHsgZnJvbSwgdG8sIGluc2VydDogVGV4dC5vZihbZS50ZXh0LnJlcGxhY2UoXCIuXCIsIFwiIFwiKV0pIH07XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlID0gY2hhbmdlO1xuICAgICAgICAgICAgaWYgKCF2aWV3LnN0YXRlLnJlYWRPbmx5KSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld0xlbiA9IHRoaXMudG8gLSB0aGlzLmZyb20gKyAoY2hhbmdlLnRvIC0gY2hhbmdlLmZyb20gKyBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgYXBwbHlET01DaGFuZ2VJbm5lcih2aWV3LCBjaGFuZ2UsIEVkaXRvclNlbGVjdGlvbi5zaW5nbGUodGhpcy50b0VkaXRvclBvcyhlLnNlbGVjdGlvblN0YXJ0LCBuZXdMZW4pLCB0aGlzLnRvRWRpdG9yUG9zKGUuc2VsZWN0aW9uRW5kLCBuZXdMZW4pKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB0aGUgdHJhbnNhY3Rpb24gZGlkbid0IGZsdXNoIG91ciBjaGFuZ2UsIHJldmVydCBpdCBzb1xuICAgICAgICAgICAgLy8gdGhhdCB0aGUgY29udGV4dCBpcyBpbiBzeW5jIHdpdGggdGhlIGVkaXRvciBzdGF0ZSBhZ2Fpbi5cbiAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXZlcnRQZW5kaW5nKHZpZXcuc3RhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKHZpZXcuc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmNoYXJhY3RlcmJvdW5kc3VwZGF0ZSA9IGUgPT4ge1xuICAgICAgICAgICAgbGV0IHJlY3RzID0gW10sIHByZXYgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMudG9FZGl0b3JQb3MoZS5yYW5nZVN0YXJ0KSwgZW5kID0gdGhpcy50b0VkaXRvclBvcyhlLnJhbmdlRW5kKTsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlY3QgPSB2aWV3LmNvb3Jkc0ZvckNoYXIoaSk7XG4gICAgICAgICAgICAgICAgcHJldiA9IChyZWN0ICYmIG5ldyBET01SZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQgLSByZWN0LmxlZnQsIHJlY3QuYm90dG9tIC0gcmVjdC50b3ApKVxuICAgICAgICAgICAgICAgICAgICB8fCBwcmV2IHx8IG5ldyBET01SZWN0O1xuICAgICAgICAgICAgICAgIHJlY3RzLnB1c2gocHJldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZXh0LnVwZGF0ZUNoYXJhY3RlckJvdW5kcyhlLnJhbmdlU3RhcnQsIHJlY3RzKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVycy50ZXh0Zm9ybWF0dXBkYXRlID0gZSA9PiB7XG4gICAgICAgICAgICBsZXQgZGVjbyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgZm9ybWF0IG9mIGUuZ2V0VGV4dEZvcm1hdHMoKSkge1xuICAgICAgICAgICAgICAgIGxldCBsaW5lU3R5bGUgPSBmb3JtYXQudW5kZXJsaW5lU3R5bGUsIHRoaWNrbmVzcyA9IGZvcm1hdC51bmRlcmxpbmVUaGlja25lc3M7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVTdHlsZSAhPSBcIk5vbmVcIiAmJiB0aGlja25lc3MgIT0gXCJOb25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyb20gPSB0aGlzLnRvRWRpdG9yUG9zKGZvcm1hdC5yYW5nZVN0YXJ0KSwgdG8gPSB0aGlzLnRvRWRpdG9yUG9zKGZvcm1hdC5yYW5nZUVuZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tIDwgdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IGB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSAke2xpbmVTdHlsZSA9PSBcIkRhc2hlZFwiID8gXCJkYXNoZWQgXCIgOiBsaW5lU3R5bGUgPT0gXCJTcXVpZ2dsZVwiID8gXCJ3YXZ5IFwiIDogXCJcIn0ke3RoaWNrbmVzcyA9PSBcIlRoaW5cIiA/IDEgOiAyfXB4YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY28ucHVzaChEZWNvcmF0aW9uLm1hcmsoeyBhdHRyaWJ1dGVzOiB7IHN0eWxlIH0gfSkucmFuZ2UoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBzZXRFZGl0Q29udGV4dEZvcm1hdHRpbmcub2YoRGVjb3JhdGlvbi5zZXQoZGVjbykpIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmNvbXBvc2l0aW9uc3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA8IDApIHtcbiAgICAgICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID0gMDtcbiAgICAgICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlcnMuY29tcG9zaXRpb25lbmQgPSAoKSA9PiB7XG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID0gLTE7XG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21wb3NpbmcpIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBkcmlmdGVkIH0gPSB0aGlzLmNvbXBvc2luZztcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvc2luZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGRyaWZ0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXQodmlldy5zdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAobGV0IGV2ZW50IGluIHRoaXMuaGFuZGxlcnMpXG4gICAgICAgICAgICBjb250ZXh0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIHRoaXMuaGFuZGxlcnNbZXZlbnRdKTtcbiAgICAgICAgdGhpcy5tZWFzdXJlUmVxID0geyByZWFkOiB2aWV3ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRDb250ZXh0LnVwZGF0ZUNvbnRyb2xCb3VuZHModmlldy5jb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgICAgICAgICBsZXQgc2VsID0gZ2V0U2VsZWN0aW9uKHZpZXcucm9vdCk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dC51cGRhdGVTZWxlY3Rpb25Cb3VuZHMoc2VsLmdldFJhbmdlQXQoMCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgICAgICAgICAgfSB9O1xuICAgIH1cbiAgICBhcHBseUVkaXRzKHVwZGF0ZSkge1xuICAgICAgICBsZXQgb2ZmID0gMCwgYWJvcnQgPSBmYWxzZSwgcGVuZGluZyA9IHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2U7XG4gICAgICAgIHVwZGF0ZS5jaGFuZ2VzLml0ZXJDaGFuZ2VzKChmcm9tQSwgdG9BLCBfZnJvbUIsIF90b0IsIGluc2VydCkgPT4ge1xuICAgICAgICAgICAgaWYgKGFib3J0KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBkTGVuID0gaW5zZXJ0Lmxlbmd0aCAtICh0b0EgLSBmcm9tQSk7XG4gICAgICAgICAgICBpZiAocGVuZGluZyAmJiB0b0EgPj0gcGVuZGluZy50bykge1xuICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nLmZyb20gPT0gZnJvbUEgJiYgcGVuZGluZy50byA9PSB0b0EgJiYgcGVuZGluZy5pbnNlcnQuZXEoaW5zZXJ0KSkge1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nID0gdGhpcy5wZW5kaW5nQ29udGV4dENoYW5nZSA9IG51bGw7IC8vIE1hdGNoXG4gICAgICAgICAgICAgICAgICAgIG9mZiArPSBkTGVuO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvICs9IGRMZW47XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIE1pc21hdGNoLCByZXZlcnRcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJ0UGVuZGluZyh1cGRhdGUuc3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21BICs9IG9mZjtcbiAgICAgICAgICAgIHRvQSArPSBvZmY7XG4gICAgICAgICAgICBpZiAodG9BIDw9IHRoaXMuZnJvbSkgeyAvLyBCZWZvcmUgdGhlIHdpbmRvd1xuICAgICAgICAgICAgICAgIHRoaXMuZnJvbSArPSBkTGVuO1xuICAgICAgICAgICAgICAgIHRoaXMudG8gKz0gZExlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZyb21BIDwgdGhpcy50bykgeyAvLyBPdmVybGFwcyB3aXRoIHdpbmRvd1xuICAgICAgICAgICAgICAgIGlmIChmcm9tQSA8IHRoaXMuZnJvbSB8fCB0b0EgPiB0aGlzLnRvIHx8ICh0aGlzLnRvIC0gdGhpcy5mcm9tKSArIGluc2VydC5sZW5ndGggPiAzMDAwMCAvKiBDeFZwLk1heFNpemUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvcnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQudXBkYXRlVGV4dCh0aGlzLnRvQ29udGV4dFBvcyhmcm9tQSksIHRoaXMudG9Db250ZXh0UG9zKHRvQSksIGluc2VydC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvICs9IGRMZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmYgKz0gZExlbjtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwZW5kaW5nICYmICFhYm9ydClcbiAgICAgICAgICAgIHRoaXMucmV2ZXJ0UGVuZGluZyh1cGRhdGUuc3RhdGUpO1xuICAgICAgICByZXR1cm4gIWFib3J0O1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCByZXZlcnRlZCA9IHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2UsIHN0YXJ0U2VsID0gdXBkYXRlLnN0YXJ0U3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgIGlmICh0aGlzLmNvbXBvc2luZyAmJlxuICAgICAgICAgICAgKHRoaXMuY29tcG9zaW5nLmRyaWZ0ZWQgfHxcbiAgICAgICAgICAgICAgICAoIXVwZGF0ZS5jaGFuZ2VzLnRvdWNoZXNSYW5nZShzdGFydFNlbC5mcm9tLCBzdGFydFNlbC50bykgJiZcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnRyYW5zYWN0aW9ucy5zb21lKHRyID0+ICF0ci5pc1VzZXJFdmVudChcImlucHV0LnR5cGVcIikgJiYgdHIuY2hhbmdlcy50b3VjaGVzUmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKSkpKSkge1xuICAgICAgICAgICAgdGhpcy5jb21wb3NpbmcuZHJpZnRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbXBvc2luZy5lZGl0b3JCYXNlID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHRoaXMuY29tcG9zaW5nLmVkaXRvckJhc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmFwcGx5RWRpdHModXBkYXRlKSB8fCAhdGhpcy5yYW5nZUlzVmFsaWQodXBkYXRlLnN0YXRlKSkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ29udGV4dENoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KHVwZGF0ZS5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldCB8fCByZXZlcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24odXBkYXRlLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlLmdlb21ldHJ5Q2hhbmdlZCB8fCB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuc2VsZWN0aW9uU2V0KVxuICAgICAgICAgICAgdXBkYXRlLnZpZXcucmVxdWVzdE1lYXN1cmUodGhpcy5tZWFzdXJlUmVxKTtcbiAgICB9XG4gICAgcmVzZXRSYW5nZShzdGF0ZSkge1xuICAgICAgICBsZXQgeyBoZWFkIH0gPSBzdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgdGhpcy5mcm9tID0gTWF0aC5tYXgoMCwgaGVhZCAtIDEwMDAwIC8qIEN4VnAuTWFyZ2luICovKTtcbiAgICAgICAgdGhpcy50byA9IE1hdGgubWluKHN0YXRlLmRvYy5sZW5ndGgsIGhlYWQgKyAxMDAwMCAvKiBDeFZwLk1hcmdpbiAqLyk7XG4gICAgfVxuICAgIHJlc2V0KHN0YXRlKSB7XG4gICAgICAgIHRoaXMucmVzZXRSYW5nZShzdGF0ZSk7XG4gICAgICAgIHRoaXMuZWRpdENvbnRleHQudXBkYXRlVGV4dCgwLCB0aGlzLmVkaXRDb250ZXh0LnRleHQubGVuZ3RoLCBzdGF0ZS5kb2Muc2xpY2VTdHJpbmcodGhpcy5mcm9tLCB0aGlzLnRvKSk7XG4gICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKHN0YXRlKTtcbiAgICB9XG4gICAgcmV2ZXJ0UGVuZGluZyhzdGF0ZSkge1xuICAgICAgICBsZXQgcGVuZGluZyA9IHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2U7XG4gICAgICAgIHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLmVkaXRDb250ZXh0LnVwZGF0ZVRleHQodGhpcy50b0NvbnRleHRQb3MocGVuZGluZy5mcm9tKSwgdGhpcy50b0NvbnRleHRQb3MocGVuZGluZy5mcm9tICsgcGVuZGluZy5pbnNlcnQubGVuZ3RoKSwgc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHBlbmRpbmcuZnJvbSwgcGVuZGluZy50bykpO1xuICAgIH1cbiAgICBzZXRTZWxlY3Rpb24oc3RhdGUpIHtcbiAgICAgICAgbGV0IHsgbWFpbiB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnRvQ29udGV4dFBvcyhNYXRoLm1heCh0aGlzLmZyb20sIE1hdGgubWluKHRoaXMudG8sIG1haW4uYW5jaG9yKSkpO1xuICAgICAgICBsZXQgZW5kID0gdGhpcy50b0NvbnRleHRQb3MobWFpbi5oZWFkKTtcbiAgICAgICAgaWYgKHRoaXMuZWRpdENvbnRleHQuc2VsZWN0aW9uU3RhcnQgIT0gc3RhcnQgfHwgdGhpcy5lZGl0Q29udGV4dC5zZWxlY3Rpb25FbmQgIT0gZW5kKVxuICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dC51cGRhdGVTZWxlY3Rpb24oc3RhcnQsIGVuZCk7XG4gICAgfVxuICAgIHJhbmdlSXNWYWxpZChzdGF0ZSkge1xuICAgICAgICBsZXQgeyBoZWFkIH0gPSBzdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgcmV0dXJuICEodGhpcy5mcm9tID4gMCAmJiBoZWFkIC0gdGhpcy5mcm9tIDwgNTAwIC8qIEN4VnAuTWluTWFyZ2luICovIHx8XG4gICAgICAgICAgICB0aGlzLnRvIDwgc3RhdGUuZG9jLmxlbmd0aCAmJiB0aGlzLnRvIC0gaGVhZCA8IDUwMCAvKiBDeFZwLk1pbk1hcmdpbiAqLyB8fFxuICAgICAgICAgICAgdGhpcy50byAtIHRoaXMuZnJvbSA+IDEwMDAwIC8qIEN4VnAuTWFyZ2luICovICogMyk7XG4gICAgfVxuICAgIHRvRWRpdG9yUG9zKGNvbnRleHRQb3MsIGNsaXBMZW4gPSB0aGlzLnRvIC0gdGhpcy5mcm9tKSB7XG4gICAgICAgIGNvbnRleHRQb3MgPSBNYXRoLm1pbihjb250ZXh0UG9zLCBjbGlwTGVuKTtcbiAgICAgICAgbGV0IGMgPSB0aGlzLmNvbXBvc2luZztcbiAgICAgICAgcmV0dXJuIGMgJiYgYy5kcmlmdGVkID8gYy5lZGl0b3JCYXNlICsgKGNvbnRleHRQb3MgLSBjLmNvbnRleHRCYXNlKSA6IGNvbnRleHRQb3MgKyB0aGlzLmZyb207XG4gICAgfVxuICAgIHRvQ29udGV4dFBvcyhlZGl0b3JQb3MpIHtcbiAgICAgICAgbGV0IGMgPSB0aGlzLmNvbXBvc2luZztcbiAgICAgICAgcmV0dXJuIGMgJiYgYy5kcmlmdGVkID8gYy5jb250ZXh0QmFzZSArIChlZGl0b3JQb3MgLSBjLmVkaXRvckJhc2UpIDogZWRpdG9yUG9zIC0gdGhpcy5mcm9tO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGxldCBldmVudCBpbiB0aGlzLmhhbmRsZXJzKVxuICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCB0aGlzLmhhbmRsZXJzW2V2ZW50XSk7XG4gICAgfVxufVxuXG4vLyBUaGUgZWRpdG9yJ3MgdXBkYXRlIHN0YXRlIG1hY2hpbmUgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczpcbi8vXG4vLyAgICAgSWRsZSBcdTIxOTIgVXBkYXRpbmcgXHUyMUM2IElkbGUgKHVuY2hlY2tlZCkgXHUyMTkyIE1lYXN1cmluZyBcdTIxOTIgSWRsZVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjE5MSAgICAgIFx1MjE5M1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0aW5nIChtZWFzdXJlKVxuLy9cbi8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gJ0lkbGUnIGFuZCAnSWRsZSAodW5jaGVja2VkKScgbGllcyBpblxuLy8gd2hldGhlciBhIGxheW91dCBjaGVjayBoYXMgYmVlbiBzY2hlZHVsZWQuIEEgcmVndWxhciB1cGRhdGUgdGhyb3VnaFxuLy8gdGhlIGB1cGRhdGVgIG1ldGhvZCB1cGRhdGVzIHRoZSBET00gaW4gYSB3cml0ZS1vbmx5IGZhc2hpb24sIGFuZFxuLy8gcmVsaWVzIG9uIGEgY2hlY2sgKHNjaGVkdWxlZCB3aXRoIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgKSB0byBtYWtlXG4vLyBzdXJlIGV2ZXJ5dGhpbmcgaXMgd2hlcmUgaXQgc2hvdWxkIGJlIGFuZCB0aGUgdmlld3BvcnQgY292ZXJzIHRoZVxuLy8gdmlzaWJsZSBjb2RlLiBUaGF0IGNoZWNrIGNvbnRpbnVlcyB0byBtZWFzdXJlIGFuZCB0aGVuIG9wdGlvbmFsbHlcbi8vIHVwZGF0ZSB1bnRpbCBpdCByZWFjaGVzIGEgY29oZXJlbnQgc3RhdGUuXG4vKipcbkFuIGVkaXRvciB2aWV3IHJlcHJlc2VudHMgdGhlIGVkaXRvcidzIHVzZXIgaW50ZXJmYWNlLiBJdCBob2xkc1xudGhlIGVkaXRhYmxlIERPTSBzdXJmYWNlLCBhbmQgcG9zc2libHkgb3RoZXIgZWxlbWVudHMgc3VjaCBhcyB0aGVcbmxpbmUgbnVtYmVyIGd1dHRlci4gSXQgaGFuZGxlcyBldmVudHMgYW5kIGRpc3BhdGNoZXMgc3RhdGVcbnRyYW5zYWN0aW9ucyBmb3IgZWRpdGluZyBhY3Rpb25zLlxuKi9cbmNsYXNzIEVkaXRvclZpZXcge1xuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCBzdGF0ZSgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLnN0YXRlOyB9XG4gICAgLyoqXG4gICAgVG8gYmUgYWJsZSB0byBkaXNwbGF5IGxhcmdlIGRvY3VtZW50cyB3aXRob3V0IGNvbnN1bWluZyB0b28gbXVjaFxuICAgIG1lbW9yeSBvciBvdmVybG9hZGluZyB0aGUgYnJvd3NlciwgQ29kZU1pcnJvciBvbmx5IGRyYXdzIHRoZVxuICAgIGNvZGUgdGhhdCBpcyB2aXNpYmxlIChwbHVzIGEgbWFyZ2luIGFyb3VuZCBpdCkgdG8gdGhlIERPTS4gVGhpc1xuICAgIHByb3BlcnR5IHRlbGxzIHlvdSB0aGUgZXh0ZW50IG9mIHRoZSBjdXJyZW50IGRyYXduIHZpZXdwb3J0LCBpblxuICAgIGRvY3VtZW50IHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIGdldCB2aWV3cG9ydCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLnZpZXdwb3J0OyB9XG4gICAgLyoqXG4gICAgV2hlbiB0aGVyZSBhcmUsIGZvciBleGFtcGxlLCBsYXJnZSBjb2xsYXBzZWQgcmFuZ2VzIGluIHRoZVxuICAgIHZpZXdwb3J0LCBpdHMgc2l6ZSBjYW4gYmUgYSBsb3QgYmlnZ2VyIHRoYW4gdGhlIGFjdHVhbCB2aXNpYmxlXG4gICAgY29udGVudC4gVGh1cywgaWYgeW91IGFyZSBkb2luZyBzb21ldGhpbmcgbGlrZSBzdHlsaW5nIHRoZVxuICAgIGNvbnRlbnQgaW4gdGhlIHZpZXdwb3J0LCBpdCBpcyBwcmVmZXJhYmxlIHRvIG9ubHkgZG8gc28gZm9yXG4gICAgdGhlc2UgcmFuZ2VzLCB3aGljaCBhcmUgdGhlIHN1YnNldCBvZiB0aGUgdmlld3BvcnQgdGhhdCBpc1xuICAgIGFjdHVhbGx5IGRyYXduLlxuICAgICovXG4gICAgZ2V0IHZpc2libGVSYW5nZXMoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS52aXNpYmxlUmFuZ2VzOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBmYWxzZSB3aGVuIHRoZSBlZGl0b3IgaXMgZW50aXJlbHkgc2Nyb2xsZWQgb3V0IG9mIHZpZXdcbiAgICBvciBvdGhlcndpc2UgaGlkZGVuLlxuICAgICovXG4gICAgZ2V0IGluVmlldygpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmluVmlldzsgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBjb21wb3NpbmcgdGV4dCB2aWFcbiAgICBbSU1FXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbnB1dF9tZXRob2QpLCBhbmQgYXQgbGVhc3RcbiAgICBvbmUgY2hhbmdlIGhhcyBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgY29tcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgY29tcG9zaW5nKCkgeyByZXR1cm4gISF0aGlzLmlucHV0U3RhdGUgJiYgdGhpcy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+IDA7IH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBpcyBjdXJyZW50bHkgaW4gY29tcG9zaW5nIHN0YXRlLiBOb3RlXG4gICAgdGhhdCBvbiBzb21lIHBsYXRmb3JtcywgbGlrZSBBbmRyb2lkLCB0aGlzIHdpbGwgYmUgdGhlIGNhc2UgYVxuICAgIGxvdCwgc2luY2UganVzdCBwdXR0aW5nIHRoZSBjdXJzb3Igb24gYSB3b3JkIHN0YXJ0cyBhXG4gICAgY29tcG9zaXRpb24gdGhlcmUuXG4gICAgKi9cbiAgICBnZXQgY29tcG9zaXRpb25TdGFydGVkKCkgeyByZXR1cm4gISF0aGlzLmlucHV0U3RhdGUgJiYgdGhpcy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwOyB9XG4gICAgLyoqXG4gICAgVGhlIGRvY3VtZW50IG9yIHNoYWRvdyByb290IHRoYXQgdGhlIHZpZXcgbGl2ZXMgaW4uXG4gICAgKi9cbiAgICBnZXQgcm9vdCgpIHsgcmV0dXJuIHRoaXMuX3Jvb3Q7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCB3aW4oKSB7IHJldHVybiB0aGlzLmRvbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgfVxuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIG5ldyB2aWV3LiBZb3UnbGwgd2FudCB0byBlaXRoZXIgcHJvdmlkZSBhIGBwYXJlbnRgXG4gICAgb3B0aW9uLCBvciBwdXQgYHZpZXcuZG9tYCBpbnRvIHlvdXIgZG9jdW1lbnQgYWZ0ZXIgY3JlYXRpbmcgYVxuICAgIHZpZXcsIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNlZSB0aGUgZWRpdG9yLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5wbHVnaW5NYXAgPSBuZXcgTWFwO1xuICAgICAgICB0aGlzLmVkaXRvckF0dHJzID0ge307XG4gICAgICAgIHRoaXMuY29udGVudEF0dHJzID0ge307XG4gICAgICAgIHRoaXMuYmlkaUNhY2hlID0gW107XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi87XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tZWFzdXJlU2NoZWR1bGVkID0gLTE7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tZWFzdXJlUmVxdWVzdHMgPSBbXTtcbiAgICAgICAgdGhpcy5jb250ZW50RE9NID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5zY3JvbGxET00gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLnNjcm9sbERPTS50YWJJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLnNjcm9sbERPTS5jbGFzc05hbWUgPSBcImNtLXNjcm9sbGVyXCI7XG4gICAgICAgIHRoaXMuc2Nyb2xsRE9NLmFwcGVuZENoaWxkKHRoaXMuY29udGVudERPTSk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VET00gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmFubm91bmNlRE9NLmNsYXNzTmFtZSA9IFwiY20tYW5ub3VuY2VkXCI7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VET00uc2V0QXR0cmlidXRlKFwiYXJpYS1saXZlXCIsIFwicG9saXRlXCIpO1xuICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKHRoaXMuYW5ub3VuY2VET00pO1xuICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZCh0aGlzLnNjcm9sbERPTSk7XG4gICAgICAgIGlmIChjb25maWcucGFyZW50KVxuICAgICAgICAgICAgY29uZmlnLnBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmRvbSk7XG4gICAgICAgIGxldCB7IGRpc3BhdGNoIH0gPSBjb25maWc7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hUcmFuc2FjdGlvbnMgPSBjb25maWcuZGlzcGF0Y2hUcmFuc2FjdGlvbnMgfHxcbiAgICAgICAgICAgIChkaXNwYXRjaCAmJiAoKHRycykgPT4gdHJzLmZvckVhY2godHIgPT4gZGlzcGF0Y2godHIsIHRoaXMpKSkpIHx8XG4gICAgICAgICAgICAoKHRycykgPT4gdGhpcy51cGRhdGUodHJzKSk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLmRpc3BhdGNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSAoY29uZmlnLnJvb3QgfHwgZ2V0Um9vdChjb25maWcucGFyZW50KSB8fCBkb2N1bWVudCk7XG4gICAgICAgIHRoaXMudmlld1N0YXRlID0gbmV3IFZpZXdTdGF0ZShjb25maWcuc3RhdGUgfHwgRWRpdG9yU3RhdGUuY3JlYXRlKGNvbmZpZykpO1xuICAgICAgICBpZiAoY29uZmlnLnNjcm9sbFRvICYmIGNvbmZpZy5zY3JvbGxUby5pcyhzY3JvbGxJbnRvVmlldykpXG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQgPSBjb25maWcuc2Nyb2xsVG8udmFsdWUuY2xpcCh0aGlzLnZpZXdTdGF0ZS5zdGF0ZSk7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IHRoaXMuc3RhdGUuZmFjZXQodmlld1BsdWdpbikubWFwKHNwZWMgPT4gbmV3IFBsdWdpbkluc3RhbmNlKHNwZWMpKTtcbiAgICAgICAgZm9yIChsZXQgcGx1Z2luIG9mIHRoaXMucGx1Z2lucylcbiAgICAgICAgICAgIHBsdWdpbi51cGRhdGUodGhpcyk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgRE9NT2JzZXJ2ZXIodGhpcyk7XG4gICAgICAgIHRoaXMuaW5wdXRTdGF0ZSA9IG5ldyBJbnB1dFN0YXRlKHRoaXMpO1xuICAgICAgICB0aGlzLmlucHV0U3RhdGUuZW5zdXJlSGFuZGxlcnModGhpcy5wbHVnaW5zKTtcbiAgICAgICAgdGhpcy5kb2NWaWV3ID0gbmV3IERvY1ZpZXcodGhpcyk7XG4gICAgICAgIHRoaXMubW91bnRTdHlsZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVBdHRycygpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovO1xuICAgICAgICB0aGlzLnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgIGlmICgoX2EgPSBkb2N1bWVudC5mb250cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlYWR5KVxuICAgICAgICAgICAgZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbigoKSA9PiB0aGlzLnJlcXVlc3RNZWFzdXJlKCkpO1xuICAgIH1cbiAgICBkaXNwYXRjaCguLi5pbnB1dCkge1xuICAgICAgICBsZXQgdHJzID0gaW5wdXQubGVuZ3RoID09IDEgJiYgaW5wdXRbMF0gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbiA/IGlucHV0XG4gICAgICAgICAgICA6IGlucHV0Lmxlbmd0aCA9PSAxICYmIEFycmF5LmlzQXJyYXkoaW5wdXRbMF0pID8gaW5wdXRbMF1cbiAgICAgICAgICAgICAgICA6IFt0aGlzLnN0YXRlLnVwZGF0ZSguLi5pbnB1dCldO1xuICAgICAgICB0aGlzLmRpc3BhdGNoVHJhbnNhY3Rpb25zKHRycywgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgdmlldyBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIHRyYW5zYWN0aW9ucy4gVGhpcyB3aWxsXG4gICAgdXBkYXRlIHRoZSB2aXNpYmxlIGRvY3VtZW50IGFuZCBzZWxlY3Rpb24gdG8gbWF0Y2ggdGhlIHN0YXRlXG4gICAgcHJvZHVjZWQgYnkgdGhlIHRyYW5zYWN0aW9ucywgYW5kIG5vdGlmeSB2aWV3IHBsdWdpbnMgb2YgdGhlXG4gICAgY2hhbmdlLiBZb3Ugc2hvdWxkIHVzdWFsbHkgY2FsbFxuICAgIFtgZGlzcGF0Y2hgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kaXNwYXRjaCkgaW5zdGVhZCwgd2hpY2ggdXNlcyB0aGlzXG4gICAgYXMgYSBwcmltaXRpdmUuXG4gICAgKi9cbiAgICB1cGRhdGUodHJhbnNhY3Rpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZVN0YXRlICE9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbGxzIHRvIEVkaXRvclZpZXcudXBkYXRlIGFyZSBub3QgYWxsb3dlZCB3aGlsZSBhbiB1cGRhdGUgaXMgaW4gcHJvZ3Jlc3NcIik7XG4gICAgICAgIGxldCByZWRyYXduID0gZmFsc2UsIGF0dHJzQ2hhbmdlZCA9IGZhbHNlLCB1cGRhdGU7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHRyYW5zYWN0aW9ucykge1xuICAgICAgICAgICAgaWYgKHRyLnN0YXJ0U3RhdGUgIT0gc3RhdGUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUcnlpbmcgdG8gdXBkYXRlIHN0YXRlIHdpdGggYSB0cmFuc2FjdGlvbiB0aGF0IGRvZXNuJ3Qgc3RhcnQgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUuXCIpO1xuICAgICAgICAgICAgc3RhdGUgPSB0ci5zdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLnN0YXRlID0gc3RhdGU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvY3VzID0gdGhpcy5oYXNGb2N1cywgZm9jdXNGbGFnID0gMCwgZGlzcGF0Y2hGb2N1cyA9IG51bGw7XG4gICAgICAgIGlmICh0cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5hbm5vdGF0aW9uKGlzRm9jdXNDaGFuZ2UpKSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCA9IGZvY3VzO1xuICAgICAgICAgICAgLy8gSWYgYSBmb2N1cy1jaGFuZ2UgdHJhbnNhY3Rpb24gaXMgYmVpbmcgZGlzcGF0Y2hlZCwgc2V0IHRoaXMgdXBkYXRlIGZsYWcuXG4gICAgICAgICAgICBmb2N1c0ZsYWcgPSAxIC8qIFVwZGF0ZUZsYWcuRm9jdXMgKi87XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZm9jdXMgIT0gdGhpcy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCA9IGZvY3VzO1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBzZXBhcmF0ZSBmb2N1cyB0cmFuc2FjdGlvbiBpZiBuZWNlc3NhcnksIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gYWRkIGEgZmxhZyB0byB0aGlzIHVwZGF0ZVxuICAgICAgICAgICAgZGlzcGF0Y2hGb2N1cyA9IGZvY3VzQ2hhbmdlVHJhbnNhY3Rpb24oc3RhdGUsIGZvY3VzKTtcbiAgICAgICAgICAgIGlmICghZGlzcGF0Y2hGb2N1cylcbiAgICAgICAgICAgICAgICBmb2N1c0ZsYWcgPSAxIC8qIFVwZGF0ZUZsYWcuRm9jdXMgKi87XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgcGVuZGluZyBET00gY2hhbmdlLCBlYWdlcmx5IHJlYWQgaXQgYW5kIHRyeSB0b1xuICAgICAgICAvLyBhcHBseSBpdCBhZnRlciB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb25zLlxuICAgICAgICBsZXQgcGVuZGluZ0tleSA9IHRoaXMub2JzZXJ2ZXIuZGVsYXllZEFuZHJvaWRLZXksIGRvbUNoYW5nZSA9IG51bGw7XG4gICAgICAgIGlmIChwZW5kaW5nS2V5KSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmNsZWFyRGVsYXllZEFuZHJvaWRLZXkoKTtcbiAgICAgICAgICAgIGRvbUNoYW5nZSA9IHRoaXMub2JzZXJ2ZXIucmVhZENoYW5nZSgpO1xuICAgICAgICAgICAgLy8gT25seSB0cnkgdG8gYXBwbHkgRE9NIGNoYW5nZXMgaWYgdGhlIHRyYW5zYWN0aW9ucyBkaWRuJ3RcbiAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgZG9jIG9yIHNlbGVjdGlvbi5cbiAgICAgICAgICAgIGlmIChkb21DaGFuZ2UgJiYgIXRoaXMuc3RhdGUuZG9jLmVxKHN0YXRlLmRvYykgfHwgIXRoaXMuc3RhdGUuc2VsZWN0aW9uLmVxKHN0YXRlLnNlbGVjdGlvbikpXG4gICAgICAgICAgICAgICAgZG9tQ2hhbmdlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBwaHJhc2VzIGNoYW5nZSwgcmVkcmF3IHRoZSBlZGl0b3JcbiAgICAgICAgaWYgKHN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLnBocmFzZXMpICE9IHRoaXMuc3RhdGUuZmFjZXQoRWRpdG9yU3RhdGUucGhyYXNlcykpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgIHVwZGF0ZSA9IFZpZXdVcGRhdGUuY3JlYXRlKHRoaXMsIHN0YXRlLCB0cmFuc2FjdGlvbnMpO1xuICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gZm9jdXNGbGFnO1xuICAgICAgICBsZXQgc2Nyb2xsVGFyZ2V0ID0gdGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi87XG4gICAgICAgICAgICBmb3IgKGxldCB0ciBvZiB0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUYXJnZXQgPSBzY3JvbGxUYXJnZXQubWFwKHRyLmNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIGlmICh0ci5zY3JvbGxJbnRvVmlldykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyBtYWluIH0gPSB0ci5zdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRhcmdldCA9IG5ldyBTY3JvbGxUYXJnZXQobWFpbi5lbXB0eSA/IG1haW4gOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKG1haW4uaGVhZCwgbWFpbi5oZWFkID4gbWFpbi5hbmNob3IgPyAtMSA6IDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZSBvZiB0ci5lZmZlY3RzKVxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5pcyhzY3JvbGxJbnRvVmlldykpXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUYXJnZXQgPSBlLnZhbHVlLmNsaXAodGhpcy5zdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS51cGRhdGUodXBkYXRlLCBzY3JvbGxUYXJnZXQpO1xuICAgICAgICAgICAgdGhpcy5iaWRpQ2FjaGUgPSBDYWNoZWRPcmRlci51cGRhdGUodGhpcy5iaWRpQ2FjaGUsIHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgICAgIGlmICghdXBkYXRlLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5zKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVkcmF3biA9IHRoaXMuZG9jVmlldy51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmZhY2V0KHN0eWxlTW9kdWxlKSAhPSB0aGlzLnN0eWxlTW9kdWxlcylcbiAgICAgICAgICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgICAgICBhdHRyc0NoYW5nZWQgPSB0aGlzLnVwZGF0ZUF0dHJzKCk7XG4gICAgICAgICAgICB0aGlzLnNob3dBbm5vdW5jZW1lbnRzKHRyYW5zYWN0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcudXBkYXRlU2VsZWN0aW9uKHJlZHJhd24sIHRyYW5zYWN0aW9ucy5zb21lKHRyID0+IHRyLmlzVXNlckV2ZW50KFwic2VsZWN0LnBvaW50ZXJcIikpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHRoZW1lKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQodGhlbWUpKVxuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUubXVzdE1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHJlZHJhd24gfHwgYXR0cnNDaGFuZ2VkIHx8IHNjcm9sbFRhcmdldCB8fCB0aGlzLnZpZXdTdGF0ZS5tdXN0RW5mb3JjZUN1cnNvckFzc29jIHx8IHRoaXMudmlld1N0YXRlLm11c3RNZWFzdXJlQ29udGVudClcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgaWYgKHJlZHJhd24pXG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXdVcGRhdGUoKTtcbiAgICAgICAgaWYgKCF1cGRhdGUuZW1wdHkpXG4gICAgICAgICAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiB0aGlzLnN0YXRlLmZhY2V0KHVwZGF0ZUxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih0aGlzLnN0YXRlLCBlLCBcInVwZGF0ZSBsaXN0ZW5lclwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwYXRjaEZvY3VzIHx8IGRvbUNoYW5nZSlcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkaXNwYXRjaEZvY3VzICYmIHRoaXMuc3RhdGUgPT0gZGlzcGF0Y2hGb2N1cy5zdGFydFN0YXRlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoKGRpc3BhdGNoRm9jdXMpO1xuICAgICAgICAgICAgICAgIGlmIChkb21DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcHBseURPTUNoYW5nZSh0aGlzLCBkb21DaGFuZ2UpICYmIHBlbmRpbmdLZXkuZm9yY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh0aGlzLmNvbnRlbnRET00sIHBlbmRpbmdLZXkua2V5LCBwZW5kaW5nS2V5LmtleUNvZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXNldCB0aGUgdmlldyB0byB0aGUgZ2l2ZW4gc3RhdGUuIChUaGlzIHdpbGwgY2F1c2UgdGhlIGVudGlyZVxuICAgIGRvY3VtZW50IHRvIGJlIHJlZHJhd24gYW5kIGFsbCB2aWV3IHBsdWdpbnMgdG8gYmUgcmVpbml0aWFsaXplZCxcbiAgICBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IG9ubHkgdXNlIGl0IHdoZW4gdGhlIG5ldyBzdGF0ZSBpc24ndFxuICAgIGRlcml2ZWQgZnJvbSB0aGUgb2xkIHN0YXRlLiBPdGhlcndpc2UsIHVzZVxuICAgIFtgZGlzcGF0Y2hgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kaXNwYXRjaCkgaW5zdGVhZC4pXG4gICAgKi9cbiAgICBzZXRTdGF0ZShuZXdTdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdGF0ZSAhPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxscyB0byBFZGl0b3JWaWV3LnNldFN0YXRlIGFyZSBub3QgYWxsb3dlZCB3aGlsZSBhbiB1cGRhdGUgaXMgaW4gcHJvZ3Jlc3NcIik7XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMiAvKiBVcGRhdGVTdGF0ZS5VcGRhdGluZyAqLztcbiAgICAgICAgbGV0IGhhZEZvY3VzID0gdGhpcy5oYXNGb2N1cztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICAgICAgcGx1Z2luLmRlc3Ryb3kodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZSA9IG5ldyBWaWV3U3RhdGUobmV3U3RhdGUpO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zID0gbmV3U3RhdGUuZmFjZXQodmlld1BsdWdpbikubWFwKHNwZWMgPT4gbmV3IFBsdWdpbkluc3RhbmNlKHNwZWMpKTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwLmNsZWFyKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIHBsdWdpbi51cGRhdGUodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3ID0gbmV3IERvY1ZpZXcodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUuZW5zdXJlSGFuZGxlcnModGhpcy5wbHVnaW5zKTtcbiAgICAgICAgICAgIHRoaXMubW91bnRTdHlsZXMoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQXR0cnMoKTtcbiAgICAgICAgICAgIHRoaXMuYmlkaUNhY2hlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYWRGb2N1cylcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgIH1cbiAgICB1cGRhdGVQbHVnaW5zKHVwZGF0ZSkge1xuICAgICAgICBsZXQgcHJldlNwZWNzID0gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQodmlld1BsdWdpbiksIHNwZWNzID0gdXBkYXRlLnN0YXRlLmZhY2V0KHZpZXdQbHVnaW4pO1xuICAgICAgICBpZiAocHJldlNwZWNzICE9IHNwZWNzKSB7XG4gICAgICAgICAgICBsZXQgbmV3UGx1Z2lucyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgc3BlYyBvZiBzcGVjcykge1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IHByZXZTcGVjcy5pbmRleE9mKHNwZWMpO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UGx1Z2lucy5wdXNoKG5ldyBQbHVnaW5JbnN0YW5jZShzcGVjKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGx1Z2luID0gdGhpcy5wbHVnaW5zW2ZvdW5kXTtcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLm11c3RVcGRhdGUgPSB1cGRhdGU7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BsdWdpbnMucHVzaChwbHVnaW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5tdXN0VXBkYXRlICE9IHVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmRlc3Ryb3kodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMgPSBuZXdQbHVnaW5zO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXAuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIHAubXVzdFVwZGF0ZSA9IHVwZGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGx1Z2lucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMucGx1Z2luc1tpXS51cGRhdGUodGhpcyk7XG4gICAgICAgIGlmIChwcmV2U3BlY3MgIT0gc3BlY3MpXG4gICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUuZW5zdXJlSGFuZGxlcnModGhpcy5wbHVnaW5zKTtcbiAgICB9XG4gICAgZG9jVmlld1VwZGF0ZSgpIHtcbiAgICAgICAgZm9yIChsZXQgcGx1Z2luIG9mIHRoaXMucGx1Z2lucykge1xuICAgICAgICAgICAgbGV0IHZhbCA9IHBsdWdpbi52YWx1ZTtcbiAgICAgICAgICAgIGlmICh2YWwgJiYgdmFsLmRvY1ZpZXdVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YWwuZG9jVmlld1VwZGF0ZSh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHRoaXMuc3RhdGUsIGUsIFwiZG9jIHZpZXcgdXBkYXRlIGxpc3RlbmVyXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1lYXN1cmUoZmx1c2ggPSB0cnVlKSB7XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVNjaGVkdWxlZCA+IC0xKVxuICAgICAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5tZWFzdXJlU2NoZWR1bGVkKTtcbiAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIuZGVsYXllZEFuZHJvaWRLZXkpIHtcbiAgICAgICAgICAgIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA9IDA7IC8vIFByZXZlbnQgcmVxdWVzdE1lYXN1cmUgY2FsbHMgZnJvbSBzY2hlZHVsaW5nIGFub3RoZXIgYW5pbWF0aW9uIGZyYW1lXG4gICAgICAgIGlmIChmbHVzaClcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IG51bGw7XG4gICAgICAgIGxldCBzRE9NID0gdGhpcy5zY3JvbGxET00sIHNjcm9sbFRvcCA9IHNET00uc2Nyb2xsVG9wICogdGhpcy5zY2FsZVk7XG4gICAgICAgIGxldCB7IHNjcm9sbEFuY2hvclBvcywgc2Nyb2xsQW5jaG9ySGVpZ2h0IH0gPSB0aGlzLnZpZXdTdGF0ZTtcbiAgICAgICAgaWYgKE1hdGguYWJzKHNjcm9sbFRvcCAtIHRoaXMudmlld1N0YXRlLnNjcm9sbFRvcCkgPiAxKVxuICAgICAgICAgICAgc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gLTE7XG4gICAgICAgIHRoaXMudmlld1N0YXRlLnNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsQW5jaG9ySGVpZ2h0IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTY3JvbGxlZFRvQm90dG9tKHNET00pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JQb3MgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IHRoaXMudmlld1N0YXRlLmhlaWdodE1hcC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmxvY2sgPSB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxBbmNob3JBdChzY3JvbGxUb3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9yUG9zID0gYmxvY2suZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IGJsb2NrLnRvcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMSAvKiBVcGRhdGVTdGF0ZS5NZWFzdXJpbmcgKi87XG4gICAgICAgICAgICAgICAgbGV0IGNoYW5nZWQgPSB0aGlzLnZpZXdTdGF0ZS5tZWFzdXJlKHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmICghY2hhbmdlZCAmJiAhdGhpcy5tZWFzdXJlUmVxdWVzdHMubGVuZ3RoICYmIHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldCA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaSA+IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKHRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcIk1lYXN1cmUgbG9vcCByZXN0YXJ0ZWQgbW9yZSB0aGFuIDUgdGltZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcIlZpZXdwb3J0IGZhaWxlZCB0byBzdGFiaWxpemVcIik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbWVhc3VyaW5nID0gW107XG4gICAgICAgICAgICAgICAgLy8gT25seSBydW4gbWVhc3VyZSByZXF1ZXN0cyBpbiB0aGlzIGN5Y2xlIHdoZW4gdGhlIHZpZXdwb3J0IGRpZG4ndCBjaGFuZ2VcbiAgICAgICAgICAgICAgICBpZiAoIShjaGFuZ2VkICYgNCAvKiBVcGRhdGVGbGFnLlZpZXdwb3J0ICovKSlcbiAgICAgICAgICAgICAgICAgICAgW3RoaXMubWVhc3VyZVJlcXVlc3RzLCBtZWFzdXJpbmddID0gW21lYXN1cmluZywgdGhpcy5tZWFzdXJlUmVxdWVzdHNdO1xuICAgICAgICAgICAgICAgIGxldCBtZWFzdXJlZCA9IG1lYXN1cmluZy5tYXAobSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5yZWFkKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odGhpcy5zdGF0ZSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmFkTWVhc3VyZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCB1cGRhdGUgPSBWaWV3VXBkYXRlLmNyZWF0ZSh0aGlzLCB0aGlzLnN0YXRlLCBbXSksIHJlZHJhd24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gY2hhbmdlZDtcbiAgICAgICAgICAgICAgICBpZiAoIXVwZGF0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSB1cGRhdGU7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkLmZsYWdzIHw9IGNoYW5nZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi87XG4gICAgICAgICAgICAgICAgaWYgKCF1cGRhdGUuZW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5zKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBdHRycygpO1xuICAgICAgICAgICAgICAgICAgICByZWRyYXduID0gdGhpcy5kb2NWaWV3LnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVkcmF3bilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jVmlld1VwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lYXN1cmluZy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVkW2ldICE9IEJhZE1lYXN1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBtZWFzdXJpbmdbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0ud3JpdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ud3JpdGUobWVhc3VyZWRbaV0sIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odGhpcy5zdGF0ZSwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVkcmF3bilcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2NWaWV3LnVwZGF0ZVNlbGVjdGlvbih0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXVwZGF0ZS52aWV3cG9ydENoYW5nZWQgJiYgdGhpcy5tZWFzdXJlUmVxdWVzdHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmlld1N0YXRlLmVkaXRvckhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jVmlldy5zY3JvbGxJbnRvVmlldyh0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3QW5jaG9ySGVpZ2h0ID0gc2Nyb2xsQW5jaG9yUG9zIDwgMCA/IHRoaXMudmlld1N0YXRlLmhlaWdodE1hcC5oZWlnaHQgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS5saW5lQmxvY2tBdChzY3JvbGxBbmNob3JQb3MpLnRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlmZiA9IG5ld0FuY2hvckhlaWdodCAtIHNjcm9sbEFuY2hvckhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDEgfHwgZGlmZiA8IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcCA9IHNjcm9sbFRvcCArIGRpZmY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNET00uc2Nyb2xsVG9wID0gc2Nyb2xsVG9wIC8gdGhpcy5zY2FsZVk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLztcbiAgICAgICAgICAgIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkICYmICF1cGRhdGVkLmVtcHR5KVxuICAgICAgICAgICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgdGhpcy5zdGF0ZS5mYWNldCh1cGRhdGVMaXN0ZW5lcikpXG4gICAgICAgICAgICAgICAgbGlzdGVuZXIodXBkYXRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgQ1NTIGNsYXNzZXMgZm9yIHRoZSBjdXJyZW50bHkgYWN0aXZlIGVkaXRvciB0aGVtZXMuXG4gICAgKi9cbiAgICBnZXQgdGhlbWVDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gYmFzZVRoZW1lSUQgKyBcIiBcIiArXG4gICAgICAgICAgICAodGhpcy5zdGF0ZS5mYWNldChkYXJrVGhlbWUpID8gYmFzZURhcmtJRCA6IGJhc2VMaWdodElEKSArIFwiIFwiICtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZmFjZXQodGhlbWUpO1xuICAgIH1cbiAgICB1cGRhdGVBdHRycygpIHtcbiAgICAgICAgbGV0IGVkaXRvckF0dHJzID0gYXR0cnNGcm9tRmFjZXQodGhpcywgZWRpdG9yQXR0cmlidXRlcywge1xuICAgICAgICAgICAgY2xhc3M6IFwiY20tZWRpdG9yXCIgKyAodGhpcy5oYXNGb2N1cyA/IFwiIGNtLWZvY3VzZWQgXCIgOiBcIiBcIikgKyB0aGlzLnRoZW1lQ2xhc3Nlc1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGNvbnRlbnRBdHRycyA9IHtcbiAgICAgICAgICAgIHNwZWxsY2hlY2s6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIGF1dG9jb3JyZWN0OiBcIm9mZlwiLFxuICAgICAgICAgICAgYXV0b2NhcGl0YWxpemU6IFwib2ZmXCIsXG4gICAgICAgICAgICB3cml0aW5nc3VnZ2VzdGlvbnM6IFwiZmFsc2VcIixcbiAgICAgICAgICAgIHRyYW5zbGF0ZTogXCJub1wiLFxuICAgICAgICAgICAgY29udGVudGVkaXRhYmxlOiAhdGhpcy5zdGF0ZS5mYWNldChlZGl0YWJsZSkgPyBcImZhbHNlXCIgOiBcInRydWVcIixcbiAgICAgICAgICAgIGNsYXNzOiBcImNtLWNvbnRlbnRcIixcbiAgICAgICAgICAgIHN0eWxlOiBgJHticm93c2VyLnRhYlNpemV9OiAke3RoaXMuc3RhdGUudGFiU2l6ZX1gLFxuICAgICAgICAgICAgcm9sZTogXCJ0ZXh0Ym94XCIsXG4gICAgICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IFwidHJ1ZVwiXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnJlYWRPbmx5KVxuICAgICAgICAgICAgY29udGVudEF0dHJzW1wiYXJpYS1yZWFkb25seVwiXSA9IFwidHJ1ZVwiO1xuICAgICAgICBhdHRyc0Zyb21GYWNldCh0aGlzLCBjb250ZW50QXR0cmlidXRlcywgY29udGVudEF0dHJzKTtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSB0aGlzLm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZENvbnRlbnQgPSB1cGRhdGVBdHRycyh0aGlzLmNvbnRlbnRET00sIHRoaXMuY29udGVudEF0dHJzLCBjb250ZW50QXR0cnMpO1xuICAgICAgICAgICAgbGV0IGNoYW5nZWRFZGl0b3IgPSB1cGRhdGVBdHRycyh0aGlzLmRvbSwgdGhpcy5lZGl0b3JBdHRycywgZWRpdG9yQXR0cnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNoYW5nZWRDb250ZW50IHx8IGNoYW5nZWRFZGl0b3I7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVkaXRvckF0dHJzID0gZWRpdG9yQXR0cnM7XG4gICAgICAgIHRoaXMuY29udGVudEF0dHJzID0gY29udGVudEF0dHJzO1xuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG4gICAgc2hvd0Fubm91bmNlbWVudHModHJzKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHRycylcbiAgICAgICAgICAgIGZvciAobGV0IGVmZmVjdCBvZiB0ci5lZmZlY3RzKVxuICAgICAgICAgICAgICAgIGlmIChlZmZlY3QuaXMoRWRpdG9yVmlldy5hbm5vdW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdW5jZURPTS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXYgPSB0aGlzLmFubm91bmNlRE9NLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICAgICAgICAgICAgICBkaXYudGV4dENvbnRlbnQgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgIH1cbiAgICBtb3VudFN0eWxlcygpIHtcbiAgICAgICAgdGhpcy5zdHlsZU1vZHVsZXMgPSB0aGlzLnN0YXRlLmZhY2V0KHN0eWxlTW9kdWxlKTtcbiAgICAgICAgbGV0IG5vbmNlID0gdGhpcy5zdGF0ZS5mYWNldChFZGl0b3JWaWV3LmNzcE5vbmNlKTtcbiAgICAgICAgU3R5bGVNb2R1bGUubW91bnQodGhpcy5yb290LCB0aGlzLnN0eWxlTW9kdWxlcy5jb25jYXQoYmFzZVRoZW1lJDEpLnJldmVyc2UoKSwgbm9uY2UgPyB7IG5vbmNlIH0gOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZWFkTWVhc3VyZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZVN0YXRlID09IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFkaW5nIHRoZSBlZGl0b3IgbGF5b3V0IGlzbid0IGFsbG93ZWQgZHVyaW5nIGFuIHVwZGF0ZVwiKTtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlU3RhdGUgPT0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovICYmIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA+IC0xKVxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlKGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2NoZWR1bGUgYSBsYXlvdXQgbWVhc3VyZW1lbnQsIG9wdGlvbmFsbHkgcHJvdmlkaW5nIGNhbGxiYWNrcyB0b1xuICAgIGRvIGN1c3RvbSBET00gbWVhc3VyaW5nIGZvbGxvd2VkIGJ5IGEgRE9NIHdyaXRlIHBoYXNlLiBVc2luZ1xuICAgIHRoaXMgaXMgcHJlZmVyYWJsZSByZWFkaW5nIERPTSBsYXlvdXQgZGlyZWN0bHkgZnJvbSwgZm9yXG4gICAgZXhhbXBsZSwgYW4gZXZlbnQgaGFuZGxlciwgYmVjYXVzZSBpdCdsbCBtYWtlIHN1cmUgbWVhc3VyaW5nIGFuZFxuICAgIGRyYXdpbmcgZG9uZSBieSBvdGhlciBjb21wb25lbnRzIGlzIHN5bmNocm9uaXplZCwgYXZvaWRpbmdcbiAgICB1bm5lY2Vzc2FyeSBET00gbGF5b3V0IGNvbXB1dGF0aW9ucy5cbiAgICAqL1xuICAgIHJlcXVlc3RNZWFzdXJlKHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVNjaGVkdWxlZCA8IDApXG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSB0aGlzLndpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5tZWFzdXJlKCkpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWVhc3VyZVJlcXVlc3RzLmluZGV4T2YocmVxdWVzdCkgPiAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5rZXkgIT0gbnVsbClcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lYXN1cmVSZXF1ZXN0c1tpXS5rZXkgPT09IHJlcXVlc3Qua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVSZXF1ZXN0c1tpXSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVSZXF1ZXN0cy5wdXNoKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBwbHVnaW4sIGlmIHByZXNlbnQuIE5vdGUgdGhhdFxuICAgIHBsdWdpbnMgdGhhdCBjcmFzaCBjYW4gYmUgZHJvcHBlZCBmcm9tIGEgdmlldywgc28gZXZlbiB3aGVuIHlvdVxuICAgIGtub3cgeW91IHJlZ2lzdGVyZWQgYSBnaXZlbiBwbHVnaW4sIGl0IGlzIHJlY29tbWVuZGVkIHRvIGNoZWNrXG4gICAgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZC5cbiAgICAqL1xuICAgIHBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgbGV0IGtub3duID0gdGhpcy5wbHVnaW5NYXAuZ2V0KHBsdWdpbik7XG4gICAgICAgIGlmIChrbm93biA9PT0gdW5kZWZpbmVkIHx8IGtub3duICYmIGtub3duLnNwZWMgIT0gcGx1Z2luKVxuICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXAuc2V0KHBsdWdpbiwga25vd24gPSB0aGlzLnBsdWdpbnMuZmluZChwID0+IHAuc3BlYyA9PSBwbHVnaW4pIHx8IG51bGwpO1xuICAgICAgICByZXR1cm4ga25vd24gJiYga25vd24udXBkYXRlKHRoaXMpLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBkb2N1bWVudCwgaW4gc2NyZWVuIGNvb3JkaW5hdGVzLiBUaGlzXG4gICAgbWF5IGJlIG5lZ2F0aXZlIHdoZW4gdGhlIGVkaXRvciBpcyBzY3JvbGxlZCBkb3duLiBQb2ludHNcbiAgICBkaXJlY3RseSB0byB0aGUgdG9wIG9mIHRoZSBmaXJzdCBsaW5lLCBub3QgYWJvdmUgdGhlIHBhZGRpbmcuXG4gICAgKi9cbiAgICBnZXQgZG9jdW1lbnRUb3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy52aWV3U3RhdGUucGFkZGluZ1RvcDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwb3J0cyB0aGUgcGFkZGluZyBhYm92ZSBhbmQgYmVsb3cgdGhlIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IGRvY3VtZW50UGFkZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHsgdG9wOiB0aGlzLnZpZXdTdGF0ZS5wYWRkaW5nVG9wLCBib3R0b206IHRoaXMudmlld1N0YXRlLnBhZGRpbmdCb3R0b20gfTtcbiAgICB9XG4gICAgLyoqXG4gICAgSWYgdGhlIGVkaXRvciBpcyB0cmFuc2Zvcm1lZCB3aXRoIENTUywgdGhpcyBwcm92aWRlcyB0aGUgc2NhbGVcbiAgICBhbG9uZyB0aGUgWCBheGlzLiBPdGhlcndpc2UsIGl0IHdpbGwganVzdCBiZSAxLiBOb3RlIHRoYXRcbiAgICB0cmFuc2Zvcm1zIG90aGVyIHRoYW4gdHJhbnNsYXRpb24gYW5kIHNjYWxpbmcgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgKi9cbiAgICBnZXQgc2NhbGVYKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuc2NhbGVYOyB9XG4gICAgLyoqXG4gICAgUHJvdmlkZSB0aGUgQ1NTIHRyYW5zZm9ybWVkIHNjYWxlIGFsb25nIHRoZSBZIGF4aXMuXG4gICAgKi9cbiAgICBnZXQgc2NhbGVZKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuc2NhbGVZOyB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgdGV4dCBsaW5lIG9yIGJsb2NrIHdpZGdldCBhdCB0aGUgZ2l2ZW4gdmVydGljYWxcbiAgICBwb3NpdGlvbiAod2hpY2ggaXMgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIFt0b3Agb2YgdGhlXG4gICAgZG9jdW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRvY3VtZW50VG9wKSkuXG4gICAgKi9cbiAgICBlbGVtZW50QXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMucmVhZE1lYXN1cmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdTdGF0ZS5lbGVtZW50QXRIZWlnaHQoaGVpZ2h0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgbGluZSBibG9jayAoc2VlXG4gICAgW2BsaW5lQmxvY2tBdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmxpbmVCbG9ja0F0KSBhdCB0aGUgZ2l2ZW5cbiAgICBoZWlnaHQsIGFnYWluIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBbdG9wIG9mIHRoZVxuICAgIGRvY3VtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kb2N1bWVudFRvcCkuXG4gICAgKi9cbiAgICBsaW5lQmxvY2tBdEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmxpbmVCbG9ja0F0SGVpZ2h0KGhlaWdodCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgZXh0ZW50IGFuZCB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiBhbGwgW2xpbmVcbiAgICBibG9ja3NdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmxpbmVCbG9ja0F0KSBpbiB0aGUgdmlld3BvcnQuIFBvc2l0aW9uc1xuICAgIGFyZSByZWxhdGl2ZSB0byB0aGUgW3RvcCBvZiB0aGVcbiAgICBkb2N1bWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZG9jdW1lbnRUb3ApO1xuICAgICovXG4gICAgZ2V0IHZpZXdwb3J0TGluZUJsb2NrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLnZpZXdwb3J0TGluZXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGxpbmUgYmxvY2sgYXJvdW5kIHRoZSBnaXZlbiBkb2N1bWVudCBwb3NpdGlvbi4gQSBsaW5lXG4gICAgYmxvY2sgaXMgYSByYW5nZSBkZWxpbWl0ZWQgb24gYm90aCBzaWRlcyBieSBlaXRoZXIgYVxuICAgIG5vbi1baGlkZGVuXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvbl5yZXBsYWNlKSBsaW5lIGJyZWFrLCBvciB0aGVcbiAgICBzdGFydC9lbmQgb2YgdGhlIGRvY3VtZW50LiBJdCB3aWxsIHVzdWFsbHkganVzdCBob2xkIGEgbGluZSBvZlxuICAgIHRleHQsIGJ1dCBtYXkgYmUgYnJva2VuIGludG8gbXVsdGlwbGUgdGV4dGJsb2NrcyBieSBibG9ja1xuICAgIHdpZGdldHMuXG4gICAgKi9cbiAgICBsaW5lQmxvY2tBdChwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmxpbmVCbG9ja0F0KHBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBlZGl0b3IncyB0b3RhbCBjb250ZW50IGhlaWdodC5cbiAgICAqL1xuICAgIGdldCBjb250ZW50SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3U3RhdGUuY29udGVudEhlaWdodDtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSBhIGN1cnNvciBwb3NpdGlvbiBieSBbZ3JhcGhlbWVcbiAgICBjbHVzdGVyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLmZpbmRDbHVzdGVyQnJlYWspLiBgZm9yd2FyZGAgZGV0ZXJtaW5lcyB3aGV0aGVyXG4gICAgdGhlIG1vdGlvbiBpcyBhd2F5IGZyb20gdGhlIGxpbmUgc3RhcnQsIG9yIHRvd2FyZHMgaXQuIEluXG4gICAgYmlkaXJlY3Rpb25hbCB0ZXh0LCB0aGUgbGluZSBpcyB0cmF2ZXJzZWQgaW4gdmlzdWFsIG9yZGVyLCB1c2luZ1xuICAgIHRoZSBlZGl0b3IncyBbdGV4dCBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pLlxuICAgIFdoZW4gdGhlIHN0YXJ0IHBvc2l0aW9uIHdhcyB0aGUgbGFzdCBvbmUgb24gdGhlIGxpbmUsIHRoZVxuICAgIHJldHVybmVkIHBvc2l0aW9uIHdpbGwgYmUgYWNyb3NzIHRoZSBsaW5lIGJyZWFrLiBJZiB0aGVyZSBpcyBub1xuICAgIGZ1cnRoZXIgbGluZSwgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIGlzIHJldHVybmVkLlxuICAgIFxuICAgIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIG1vdmVzIG92ZXIgYSBzaW5nbGUgY2x1c3Rlci4gVGhlXG4gICAgb3B0aW9uYWwgYGJ5YCBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBtb3ZlIGFjcm9zcyBtb3JlLiBJdCB3aWxsXG4gICAgYmUgY2FsbGVkIHdpdGggdGhlIGZpcnN0IGNsdXN0ZXIgYXMgYXJndW1lbnQsIGFuZCBzaG91bGQgcmV0dXJuXG4gICAgYSBwcmVkaWNhdGUgdGhhdCBkZXRlcm1pbmVzLCBmb3IgZWFjaCBzdWJzZXF1ZW50IGNsdXN0ZXIsXG4gICAgd2hldGhlciBpdCBzaG91bGQgYWxzbyBiZSBtb3ZlZCBvdmVyLlxuICAgICovXG4gICAgbW92ZUJ5Q2hhcihzdGFydCwgZm9yd2FyZCwgYnkpIHtcbiAgICAgICAgcmV0dXJuIHNraXBBdG9tcyh0aGlzLCBzdGFydCwgbW92ZUJ5Q2hhcih0aGlzLCBzdGFydCwgZm9yd2FyZCwgYnkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSBhIGN1cnNvciBwb3NpdGlvbiBhY3Jvc3MgdGhlIG5leHQgZ3JvdXAgb2YgZWl0aGVyXG4gICAgW2xldHRlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuY2hhckNhdGVnb3JpemVyKSBvciBub24tbGV0dGVyXG4gICAgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycy5cbiAgICAqL1xuICAgIG1vdmVCeUdyb3VwKHN0YXJ0LCBmb3J3YXJkKSB7XG4gICAgICAgIHJldHVybiBza2lwQXRvbXModGhpcywgc3RhcnQsIG1vdmVCeUNoYXIodGhpcywgc3RhcnQsIGZvcndhcmQsIGluaXRpYWwgPT4gYnlHcm91cCh0aGlzLCBzdGFydC5oZWFkLCBpbml0aWFsKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGN1cnNvciBwb3NpdGlvbiB2aXN1YWxseSBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgbGluZS5cbiAgICBOb3RlIHRoYXQgdGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIF9sb2dpY2FsXyBwb3NpdGlvbiBhdCBpdHNcbiAgICBzdGFydCBvciBlbmQgKHdoaWNoIGlzIHNpbXBseSBhdCBgbGluZS5mcm9tYC9gbGluZS50b2ApIGlmIHRleHRcbiAgICBhdCB0aGUgc3RhcnQgb3IgZW5kIGdvZXMgYWdhaW5zdCB0aGUgbGluZSdzIGJhc2UgdGV4dCBkaXJlY3Rpb24uXG4gICAgKi9cbiAgICB2aXN1YWxMaW5lU2lkZShsaW5lLCBlbmQpIHtcbiAgICAgICAgbGV0IG9yZGVyID0gdGhpcy5iaWRpU3BhbnMobGluZSksIGRpciA9IHRoaXMudGV4dERpcmVjdGlvbkF0KGxpbmUuZnJvbSk7XG4gICAgICAgIGxldCBzcGFuID0gb3JkZXJbZW5kID8gb3JkZXIubGVuZ3RoIC0gMSA6IDBdO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihzcGFuLnNpZGUoZW5kLCBkaXIpICsgbGluZS5mcm9tLCBzcGFuLmZvcndhcmQoIWVuZCwgZGlyKSA/IDEgOiAtMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5leHQgbGluZSBib3VuZGFyeSBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLiBJZlxuICAgIGBpbmNsdWRlV3JhcGAgaXMgdHJ1ZSwgbGluZSB3cmFwcGluZyBpcyBvbiwgYW5kIHRoZXJlIGlzIGFcbiAgICBmdXJ0aGVyIHdyYXAgcG9pbnQgb24gdGhlIGN1cnJlbnQgbGluZSwgdGhlIHdyYXAgcG9pbnQgd2lsbCBiZVxuICAgIHJldHVybmVkLiBPdGhlcndpc2UgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgc3RhcnQgb3IgZW5kXG4gICAgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBtb3ZlVG9MaW5lQm91bmRhcnkoc3RhcnQsIGZvcndhcmQsIGluY2x1ZGVXcmFwID0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gbW92ZVRvTGluZUJvdW5kYXJ5KHRoaXMsIHN0YXJ0LCBmb3J3YXJkLCBpbmNsdWRlV3JhcCk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYSBjdXJzb3IgcG9zaXRpb24gdmVydGljYWxseS4gV2hlbiBgZGlzdGFuY2VgIGlzbid0IGdpdmVuLFxuICAgIGl0IGRlZmF1bHRzIHRvIG1vdmluZyB0byB0aGUgbmV4dCBsaW5lIChpbmNsdWRpbmcgd3JhcHBlZFxuICAgIGxpbmVzKS4gT3RoZXJ3aXNlLCBgZGlzdGFuY2VgIHNob3VsZCBwcm92aWRlIGEgcG9zaXRpdmUgZGlzdGFuY2VcbiAgICBpbiBwaXhlbHMuXG4gICAgXG4gICAgV2hlbiBgc3RhcnRgIGhhcyBhXG4gICAgW2Bnb2FsQ29sdW1uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25SYW5nZS5nb2FsQ29sdW1uKSwgdGhlIHZlcnRpY2FsXG4gICAgbW90aW9uIHdpbGwgdXNlIHRoYXQgYXMgYSB0YXJnZXQgaG9yaXpvbnRhbCBwb3NpdGlvbi4gT3RoZXJ3aXNlLFxuICAgIHRoZSBjdXJzb3IncyBvd24gaG9yaXpvbnRhbCBwb3NpdGlvbiBpcyB1c2VkLiBUaGUgcmV0dXJuZWRcbiAgICBjdXJzb3Igd2lsbCBoYXZlIGl0cyBnb2FsIGNvbHVtbiBzZXQgdG8gd2hpY2hldmVyIGNvbHVtbiB3YXNcbiAgICB1c2VkLlxuICAgICovXG4gICAgbW92ZVZlcnRpY2FsbHkoc3RhcnQsIGZvcndhcmQsIGRpc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBza2lwQXRvbXModGhpcywgc3RhcnQsIG1vdmVWZXJ0aWNhbGx5KHRoaXMsIHN0YXJ0LCBmb3J3YXJkLCBkaXN0YW5jZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBET00gcGFyZW50IG5vZGUgYW5kIG9mZnNldCAoY2hpbGQgb2Zmc2V0IGlmIGBub2RlYCBpc1xuICAgIGFuIGVsZW1lbnQsIGNoYXJhY3RlciBvZmZzZXQgd2hlbiBpdCBpcyBhIHRleHQgbm9kZSkgYXQgdGhlXG4gICAgZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgXG4gICAgTm90ZSB0aGF0IGZvciBwb3NpdGlvbnMgdGhhdCBhcmVuJ3QgY3VycmVudGx5IGluXG4gICAgYHZpc2libGVSYW5nZXNgLCB0aGUgcmVzdWx0aW5nIERPTSBwb3NpdGlvbiBpc24ndCBuZWNlc3NhcmlseVxuICAgIG1lYW5pbmdmdWwgKGl0IG1heSBqdXN0IHBvaW50IGJlZm9yZSBvciBhZnRlciBhIHBsYWNlaG9sZGVyXG4gICAgZWxlbWVudCkuXG4gICAgKi9cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5kb21BdFBvcyhwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBkb2N1bWVudCBwb3NpdGlvbiBhdCB0aGUgZ2l2ZW4gRE9NIG5vZGUuIENhbiBiZSB1c2VmdWxcbiAgICBmb3IgYXNzb2NpYXRpbmcgcG9zaXRpb25zIHdpdGggRE9NIGV2ZW50cy4gV2lsbCByYWlzZSBhbiBlcnJvclxuICAgIHdoZW4gYG5vZGVgIGlzbid0IHBhcnQgb2YgdGhlIGVkaXRvciBjb250ZW50LlxuICAgICovXG4gICAgcG9zQXRET00obm9kZSwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgcG9zQXRDb29yZHMoY29vcmRzLCBwcmVjaXNlID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICByZXR1cm4gcG9zQXRDb29yZHModGhpcywgY29vcmRzLCBwcmVjaXNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBzY3JlZW4gY29vcmRpbmF0ZXMgYXQgdGhlIGdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLlxuICAgIGBzaWRlYCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvb3JkaW5hdGVzIGFyZSBiYXNlZCBvbiB0aGVcbiAgICBlbGVtZW50IGJlZm9yZSAoLTEpIG9yIGFmdGVyICgxKSB0aGUgcG9zaXRpb24gKGlmIG5vIGVsZW1lbnQgaXNcbiAgICBhdmFpbGFibGUgb24gdGhlIGdpdmVuIHNpZGUsIHRoZSBtZXRob2Qgd2lsbCB0cmFuc3BhcmVudGx5IHVzZVxuICAgIGFub3RoZXIgc3RyYXRlZ3kgdG8gZ2V0IHJlYXNvbmFibGUgY29vcmRpbmF0ZXMpLlxuICAgICovXG4gICAgY29vcmRzQXRQb3MocG9zLCBzaWRlID0gMSkge1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICBsZXQgcmVjdCA9IHRoaXMuZG9jVmlldy5jb29yZHNBdChwb3MsIHNpZGUpO1xuICAgICAgICBpZiAoIXJlY3QgfHwgcmVjdC5sZWZ0ID09IHJlY3QucmlnaHQpXG4gICAgICAgICAgICByZXR1cm4gcmVjdDtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQocG9zKSwgb3JkZXIgPSB0aGlzLmJpZGlTcGFucyhsaW5lKTtcbiAgICAgICAgbGV0IHNwYW4gPSBvcmRlcltCaWRpU3Bhbi5maW5kKG9yZGVyLCBwb3MgLSBsaW5lLmZyb20sIC0xLCBzaWRlKV07XG4gICAgICAgIHJldHVybiBmbGF0dGVuUmVjdChyZWN0LCAoc3Bhbi5kaXIgPT0gRGlyZWN0aW9uLkxUUikgPT0gKHNpZGUgPiAwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgcmVjdGFuZ2xlIGFyb3VuZCBhIGdpdmVuIGNoYXJhY3Rlci4gSWYgYHBvc2AgZG9lcyBub3RcbiAgICBwb2ludCBpbiBmcm9udCBvZiBhIGNoYXJhY3RlciB0aGF0IGlzIGluIHRoZSB2aWV3cG9ydCBhbmRcbiAgICByZW5kZXJlZCAoaS5lLiBub3QgcmVwbGFjZWQsIG5vdCBhIGxpbmUgYnJlYWspLCB0aGlzIHdpbGwgcmV0dXJuXG4gICAgbnVsbC4gRm9yIHNwYWNlIGNoYXJhY3RlcnMgdGhhdCBhcmUgYSBsaW5lIHdyYXAgcG9pbnQsIHRoaXMgd2lsbFxuICAgIHJldHVybiB0aGUgcG9zaXRpb24gYmVmb3JlIHRoZSBsaW5lIGJyZWFrLlxuICAgICovXG4gICAgY29vcmRzRm9yQ2hhcihwb3MpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5jb29yZHNGb3JDaGFyKHBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBkZWZhdWx0IHdpZHRoIG9mIGEgY2hhcmFjdGVyIGluIHRoZSBlZGl0b3IuIE1heSBub3RcbiAgICBhY2N1cmF0ZWx5IHJlZmxlY3QgdGhlIHdpZHRoIG9mIGFsbCBjaGFyYWN0ZXJzIChnaXZlbiB2YXJpYWJsZVxuICAgIHdpZHRoIGZvbnRzIG9yIHN0eWxpbmcgb2YgaW52aWRpZHVhbCByYW5nZXMpLlxuICAgICovXG4gICAgZ2V0IGRlZmF1bHRDaGFyYWN0ZXJXaWR0aCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmhlaWdodE9yYWNsZS5jaGFyV2lkdGg7IH1cbiAgICAvKipcbiAgICBUaGUgZGVmYXVsdCBoZWlnaHQgb2YgYSBsaW5lIGluIHRoZSBlZGl0b3IuIE1heSBub3QgYmUgYWNjdXJhdGVcbiAgICBmb3IgYWxsIGxpbmVzLlxuICAgICovXG4gICAgZ2V0IGRlZmF1bHRMaW5lSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuaGVpZ2h0T3JhY2xlLmxpbmVIZWlnaHQ7IH1cbiAgICAvKipcbiAgICBUaGUgdGV4dCBkaXJlY3Rpb25cbiAgICAoW2BkaXJlY3Rpb25gXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZGlyZWN0aW9uKVxuICAgIENTUyBwcm9wZXJ0eSkgb2YgdGhlIGVkaXRvcidzIGNvbnRlbnQgZWxlbWVudC5cbiAgICAqL1xuICAgIGdldCB0ZXh0RGlyZWN0aW9uKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuZGVmYXVsdFRleHREaXJlY3Rpb247IH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSB0ZXh0IGRpcmVjdGlvbiBvZiB0aGUgYmxvY2sgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCBhc1xuICAgIGFzc2lnbmVkIGJ5IENTUy4gSWZcbiAgICBbYHBlckxpbmVUZXh0RGlyZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdecGVyTGluZVRleHREaXJlY3Rpb24pXG4gICAgaXNuJ3QgZW5hYmxlZCwgb3IgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIG91dHNpZGUgb2YgdGhlIHZpZXdwb3J0LFxuICAgIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGFzXG4gICAgW2B0ZXh0RGlyZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudGV4dERpcmVjdGlvbikuIE5vdGUgdGhhdFxuICAgIHRoaXMgbWF5IHRyaWdnZXIgYSBET00gbGF5b3V0LlxuICAgICovXG4gICAgdGV4dERpcmVjdGlvbkF0KHBvcykge1xuICAgICAgICBsZXQgcGVyTGluZSA9IHRoaXMuc3RhdGUuZmFjZXQocGVyTGluZVRleHREaXJlY3Rpb24pO1xuICAgICAgICBpZiAoIXBlckxpbmUgfHwgcG9zIDwgdGhpcy52aWV3cG9ydC5mcm9tIHx8IHBvcyA+IHRoaXMudmlld3BvcnQudG8pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0RGlyZWN0aW9uO1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NWaWV3LnRleHREaXJlY3Rpb25BdChwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBXaGV0aGVyIHRoaXMgZWRpdG9yIFt3cmFwcyBsaW5lc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubGluZVdyYXBwaW5nKVxuICAgIChhcyBkZXRlcm1pbmVkIGJ5IHRoZVxuICAgIFtgd2hpdGUtc3BhY2VgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1Mvd2hpdGUtc3BhY2UpXG4gICAgQ1NTIHByb3BlcnR5IG9mIGl0cyBjb250ZW50IGVsZW1lbnQpLlxuICAgICovXG4gICAgZ2V0IGxpbmVXcmFwcGluZygpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmhlaWdodE9yYWNsZS5saW5lV3JhcHBpbmc7IH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBiaWRpcmVjdGlvbmFsIHRleHQgc3RydWN0dXJlIG9mIHRoZSBnaXZlbiBsaW5lXG4gICAgKHdoaWNoIHNob3VsZCBiZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudCkgYXMgYW4gYXJyYXkgb2Ygc3BhblxuICAgIG9iamVjdHMuIFRoZSBvcmRlciBvZiB0aGVzZSBzcGFucyBtYXRjaGVzIHRoZSBbdGV4dFxuICAgIGRpcmVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudGV4dERpcmVjdGlvbilcdTIwMTRpZiB0aGF0IGlzXG4gICAgbGVmdC10by1yaWdodCwgdGhlIGxlZnRtb3N0IHNwYW5zIGNvbWUgZmlyc3QsIG90aGVyd2lzZSB0aGVcbiAgICByaWdodG1vc3Qgc3BhbnMgY29tZSBmaXJzdC5cbiAgICAqL1xuICAgIGJpZGlTcGFucyhsaW5lKSB7XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA+IE1heEJpZGlMaW5lKVxuICAgICAgICAgICAgcmV0dXJuIHRyaXZpYWxPcmRlcihsaW5lLmxlbmd0aCk7XG4gICAgICAgIGxldCBkaXIgPSB0aGlzLnRleHREaXJlY3Rpb25BdChsaW5lLmZyb20pLCBpc29sYXRlcztcbiAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgdGhpcy5iaWRpQ2FjaGUpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5mcm9tID09IGxpbmUuZnJvbSAmJiBlbnRyeS5kaXIgPT0gZGlyICYmXG4gICAgICAgICAgICAgICAgKGVudHJ5LmZyZXNoIHx8IGlzb2xhdGVzRXEoZW50cnkuaXNvbGF0ZXMsIGlzb2xhdGVzID0gZ2V0SXNvbGF0ZWRSYW5nZXModGhpcywgbGluZSkpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkub3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc29sYXRlcylcbiAgICAgICAgICAgIGlzb2xhdGVzID0gZ2V0SXNvbGF0ZWRSYW5nZXModGhpcywgbGluZSk7XG4gICAgICAgIGxldCBvcmRlciA9IGNvbXB1dGVPcmRlcihsaW5lLnRleHQsIGRpciwgaXNvbGF0ZXMpO1xuICAgICAgICB0aGlzLmJpZGlDYWNoZS5wdXNoKG5ldyBDYWNoZWRPcmRlcihsaW5lLmZyb20sIGxpbmUudG8sIGRpciwgaXNvbGF0ZXMsIHRydWUsIG9yZGVyKSk7XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgd2hldGhlciB0aGUgZWRpdG9yIGhhcyBmb2N1cy5cbiAgICAqL1xuICAgIGdldCBoYXNGb2N1cygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBTYWZhcmkgcmV0dXJuIGZhbHNlIGZvciBoYXNGb2N1cyB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgb3BlblxuICAgICAgICAvLyBvciBjbG9zaW5nLCB3aGljaCBsZWFkcyB1cyB0byBpZ25vcmUgc2VsZWN0aW9uIGNoYW5nZXMgZnJvbSB0aGVcbiAgICAgICAgLy8gY29udGV4dCBtZW51IGJlY2F1c2UgaXQgbG9va3MgbGlrZSB0aGUgZWRpdG9yIGlzbid0IGZvY3VzZWQuXG4gICAgICAgIC8vIFRoaXMga2x1ZGdlcyBhcm91bmQgdGhhdC5cbiAgICAgICAgcmV0dXJuICh0aGlzLmRvbS5vd25lckRvY3VtZW50Lmhhc0ZvY3VzKCkgfHwgYnJvd3Nlci5zYWZhcmkgJiYgKChfYSA9IHRoaXMuaW5wdXRTdGF0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxhc3RDb250ZXh0TWVudSkgPiBEYXRlLm5vdygpIC0gM2U0KSAmJlxuICAgICAgICAgICAgdGhpcy5yb290LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5jb250ZW50RE9NO1xuICAgIH1cbiAgICAvKipcbiAgICBQdXQgZm9jdXMgb24gdGhlIGVkaXRvci5cbiAgICAqL1xuICAgIGZvY3VzKCkge1xuICAgICAgICB0aGlzLm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICBmb2N1c1ByZXZlbnRTY3JvbGwodGhpcy5jb250ZW50RE9NKTtcbiAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGVTZWxlY3Rpb24oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgW3Jvb3RdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jI3ZpZXcuRWRpdG9yVmlld0NvbmZpZy5yb290KSBpbiB3aGljaCB0aGUgZWRpdG9yIGxpdmVzLiBUaGlzIGlzIG9ubHlcbiAgICBuZWNlc3Nhcnkgd2hlbiBtb3ZpbmcgdGhlIGVkaXRvcidzIGV4aXN0aW5nIERPTSB0byBhIG5ldyB3aW5kb3cgb3Igc2hhZG93IHJvb3QuXG4gICAgKi9cbiAgICBzZXRSb290KHJvb3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Jvb3QgIT0gcm9vdCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLnNldFdpbmRvdygocm9vdC5ub2RlVHlwZSA9PSA5ID8gcm9vdCA6IHJvb3Qub3duZXJEb2N1bWVudCkuZGVmYXVsdFZpZXcgfHwgd2luZG93KTtcbiAgICAgICAgICAgIHRoaXMubW91bnRTdHlsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDbGVhbiB1cCB0aGlzIGVkaXRvciB2aWV3LCByZW1vdmluZyBpdHMgZWxlbWVudCBmcm9tIHRoZVxuICAgIGRvY3VtZW50LCB1bnJlZ2lzdGVyaW5nIGV2ZW50IGhhbmRsZXJzLCBhbmQgbm90aWZ5aW5nXG4gICAgcGx1Z2lucy4gVGhlIHZpZXcgaW5zdGFuY2UgY2FuIG5vIGxvbmdlciBiZSB1c2VkIGFmdGVyXG4gICAgY2FsbGluZyB0aGlzLlxuICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdC5hY3RpdmVFbGVtZW50ID09IHRoaXMuY29udGVudERPTSlcbiAgICAgICAgICAgIHRoaXMuY29udGVudERPTS5ibHVyKCk7XG4gICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICBwbHVnaW4uZGVzdHJveSh0aGlzKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gW107XG4gICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZG9jVmlldy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLm9ic2VydmVyLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVNjaGVkdWxlZCA+IC0xKVxuICAgICAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5tZWFzdXJlU2NoZWR1bGVkKTtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGFuIGVmZmVjdCB0aGF0IGNhbiBiZVxuICAgIFthZGRlZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZWZmZWN0cykgdG8gYSB0cmFuc2FjdGlvbiB0b1xuICAgIGNhdXNlIGl0IHRvIHNjcm9sbCB0aGUgZ2l2ZW4gcG9zaXRpb24gb3IgcmFuZ2UgaW50byB2aWV3LlxuICAgICovXG4gICAgc3RhdGljIHNjcm9sbEludG9WaWV3KHBvcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBzY3JvbGxJbnRvVmlldy5vZihuZXcgU2Nyb2xsVGFyZ2V0KHR5cGVvZiBwb3MgPT0gXCJudW1iZXJcIiA/IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zKSA6IHBvcywgb3B0aW9ucy55LCBvcHRpb25zLngsIG9wdGlvbnMueU1hcmdpbiwgb3B0aW9ucy54TWFyZ2luKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhbiBlZmZlY3QgdGhhdCByZXNldHMgdGhlIGVkaXRvciB0byBpdHMgY3VycmVudCAoYXQgdGhlXG4gICAgdGltZSB0aGlzIG1ldGhvZCB3YXMgY2FsbGVkKSBzY3JvbGwgcG9zaXRpb24uIE5vdGUgdGhhdCB0aGlzXG4gICAgb25seSBhZmZlY3RzIHRoZSBlZGl0b3IncyBvd24gc2Nyb2xsYWJsZSBlbGVtZW50LCBub3QgcGFyZW50cy5cbiAgICBTZWUgYWxzb1xuICAgIFtgRWRpdG9yVmlld0NvbmZpZy5zY3JvbGxUb2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Q29uZmlnLnNjcm9sbFRvKS5cbiAgICBcbiAgICBUaGUgZWZmZWN0IHNob3VsZCBiZSB1c2VkIHdpdGggYSBkb2N1bWVudCBpZGVudGljYWwgdG8gdGhlIG9uZVxuICAgIGl0IHdhcyBjcmVhdGVkIGZvci4gRmFpbGluZyB0byBkbyBzbyBpcyBub3QgYW4gZXJyb3IsIGJ1dCBtYXlcbiAgICBub3Qgc2Nyb2xsIHRvIHRoZSBleHBlY3RlZCBwb3NpdGlvbi4gWW91IGNhblxuICAgIFttYXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3QubWFwKSB0aGUgZWZmZWN0IHRvIGFjY291bnQgZm9yIGNoYW5nZXMuXG4gICAgKi9cbiAgICBzY3JvbGxTbmFwc2hvdCgpIHtcbiAgICAgICAgbGV0IHsgc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0IH0gPSB0aGlzLnNjcm9sbERPTTtcbiAgICAgICAgbGV0IHJlZiA9IHRoaXMudmlld1N0YXRlLnNjcm9sbEFuY2hvckF0KHNjcm9sbFRvcCk7XG4gICAgICAgIHJldHVybiBzY3JvbGxJbnRvVmlldy5vZihuZXcgU2Nyb2xsVGFyZ2V0KEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocmVmLmZyb20pLCBcInN0YXJ0XCIsIFwic3RhcnRcIiwgcmVmLnRvcCAtIHNjcm9sbFRvcCwgc2Nyb2xsTGVmdCwgdHJ1ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBFbmFibGUgb3IgZGlzYWJsZSB0YWItZm9jdXMgbW9kZSwgd2hpY2ggZGlzYWJsZXMga2V5IGJpbmRpbmdzXG4gICAgZm9yIFRhYiBhbmQgU2hpZnQtVGFiLCBsZXR0aW5nIHRoZSBicm93c2VyJ3MgZGVmYXVsdFxuICAgIGZvY3VzLWNoYW5naW5nIGJlaGF2aW9yIGdvIHRocm91Z2ggaW5zdGVhZC4gVGhpcyBpcyB1c2VmdWwgdG9cbiAgICBwcmV2ZW50IHRyYXBwaW5nIGtleWJvYXJkIHVzZXJzIGluIHlvdXIgZWRpdG9yLlxuICAgIFxuICAgIFdpdGhvdXQgYXJndW1lbnQsIHRoaXMgdG9nZ2xlcyB0aGUgbW9kZS4gV2l0aCBhIGJvb2xlYW4sIGl0XG4gICAgZW5hYmxlcyAodHJ1ZSkgb3IgZGlzYWJsZXMgaXQgKGZhbHNlKS4gR2l2ZW4gYSBudW1iZXIsIGl0XG4gICAgdGVtcG9yYXJpbHkgZW5hYmxlcyB0aGUgbW9kZSB1bnRpbCB0aGF0IG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAgICBoYXZlIHBhc3NlZCBvciBhbm90aGVyIG5vbi1UYWIga2V5IGlzIHByZXNzZWQuXG4gICAgKi9cbiAgICBzZXRUYWJGb2N1c01vZGUodG8pIHtcbiAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUudGFiRm9jdXNNb2RlID0gdGhpcy5pbnB1dFN0YXRlLnRhYkZvY3VzTW9kZSA8IDAgPyAwIDogLTE7XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0byA9PSBcImJvb2xlYW5cIilcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS50YWJGb2N1c01vZGUgPSB0byA/IDAgOiAtMTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pbnB1dFN0YXRlLnRhYkZvY3VzTW9kZSAhPSAwKVxuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLnRhYkZvY3VzTW9kZSA9IERhdGUubm93KCkgKyB0bztcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBhZGQgRE9NIGV2ZW50IGhhbmRsZXJzLlxuICAgIFRoZSB2YWx1ZSBzaG91bGQgYmUgYW4gb2JqZWN0IG1hcHBpbmcgZXZlbnQgbmFtZXMgdG8gaGFuZGxlclxuICAgIGZ1bmN0aW9ucy4gRm9yIGFueSBnaXZlbiBldmVudCwgc3VjaCBmdW5jdGlvbnMgYXJlIG9yZGVyZWQgYnlcbiAgICBleHRlbnNpb24gcHJlY2VkZW5jZSwgYW5kIHRoZSBmaXJzdCBoYW5kbGVyIHRvIHJldHVybiB0cnVlIHdpbGxcbiAgICBiZSBhc3N1bWVkIHRvIGhhdmUgaGFuZGxlZCB0aGF0IGV2ZW50LCBhbmQgbm8gb3RoZXIgaGFuZGxlcnMgb3JcbiAgICBidWlsdC1pbiBiZWhhdmlvciB3aWxsIGJlIGFjdGl2YXRlZCBmb3IgaXQuIFRoZXNlIGFyZSByZWdpc3RlcmVkXG4gICAgb24gdGhlIFtjb250ZW50IGVsZW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmNvbnRlbnRET00pLCBleGNlcHRcbiAgICBmb3IgYHNjcm9sbGAgaGFuZGxlcnMsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGFueSB0aW1lIHRoZVxuICAgIGVkaXRvcidzIFtzY3JvbGwgZWxlbWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuc2Nyb2xsRE9NKSBvciBvbmUgb2ZcbiAgICBpdHMgcGFyZW50IG5vZGVzIGlzIHNjcm9sbGVkLlxuICAgICovXG4gICAgc3RhdGljIGRvbUV2ZW50SGFuZGxlcnMoaGFuZGxlcnMpIHtcbiAgICAgICAgcmV0dXJuIFZpZXdQbHVnaW4uZGVmaW5lKCgpID0+ICh7fSksIHsgZXZlbnRIYW5kbGVyczogaGFuZGxlcnMgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCByZWdpc3RlcnMgRE9NIGV2ZW50IG9ic2VydmVycy4gQ29udHJhcnlcbiAgICB0byBldmVudCBbaGFuZGxlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmRvbUV2ZW50SGFuZGxlcnMpLFxuICAgIG9ic2VydmVycyBjYW4ndCBiZSBwcmV2ZW50ZWQgZnJvbSBydW5uaW5nIGJ5IGEgaGlnaGVyLXByZWNlZGVuY2VcbiAgICBoYW5kbGVyIHJldHVybmluZyB0cnVlLiBUaGV5IGFsc28gZG9uJ3QgcHJldmVudCBvdGhlciBoYW5kbGVyc1xuICAgIGFuZCBvYnNlcnZlcnMgZnJvbSBydW5uaW5nIHdoZW4gdGhleSByZXR1cm4gdHJ1ZSwgYW5kIHNob3VsZCBub3RcbiAgICBjYWxsIGBwcmV2ZW50RGVmYXVsdGAuXG4gICAgKi9cbiAgICBzdGF0aWMgZG9tRXZlbnRPYnNlcnZlcnMob2JzZXJ2ZXJzKSB7XG4gICAgICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSgoKSA9PiAoe30pLCB7IGV2ZW50T2JzZXJ2ZXJzOiBvYnNlcnZlcnMgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHRoZW1lIGV4dGVuc2lvbi4gVGhlIGZpcnN0IGFyZ3VtZW50IGNhbiBiZSBhXG4gICAgW2BzdHlsZS1tb2RgXShodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9zdHlsZS1tb2QjZG9jdW1lbnRhdGlvbilcbiAgICBzdHlsZSBzcGVjIHByb3ZpZGluZyB0aGUgc3R5bGVzIGZvciB0aGUgdGhlbWUuIFRoZXNlIHdpbGwgYmVcbiAgICBwcmVmaXhlZCB3aXRoIGEgZ2VuZXJhdGVkIGNsYXNzIGZvciB0aGUgc3R5bGUuXG4gICAgXG4gICAgQmVjYXVzZSB0aGUgc2VsZWN0b3JzIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCBhIHNjb3BlIGNsYXNzLCBydWxlXG4gICAgdGhhdCBkaXJlY3RseSBtYXRjaCB0aGUgZWRpdG9yJ3MgW3dyYXBwZXJcbiAgICBlbGVtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kb20pXHUyMDE0dG8gd2hpY2ggdGhlIHNjb3BlIGNsYXNzIHdpbGwgYmVcbiAgICBhZGRlZFx1MjAxNG5lZWQgdG8gYmUgZXhwbGljaXRseSBkaWZmZXJlbnRpYXRlZCBieSBhZGRpbmcgYW4gYCZgIHRvXG4gICAgdGhlIHNlbGVjdG9yIGZvciB0aGF0IGVsZW1lbnRcdTIwMTRmb3IgZXhhbXBsZVxuICAgIGAmLmNtLWZvY3VzZWRgLlxuICAgIFxuICAgIFdoZW4gYGRhcmtgIGlzIHNldCB0byB0cnVlLCB0aGUgdGhlbWUgd2lsbCBiZSBtYXJrZWQgYXMgZGFyayxcbiAgICB3aGljaCB3aWxsIGNhdXNlIHRoZSBgJmRhcmtgIHJ1bGVzIGZyb20gW2Jhc2VcbiAgICB0aGVtZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmJhc2VUaGVtZSkgdG8gYmUgdXNlZCAoYXMgb3Bwb3NlZCB0b1xuICAgIGAmbGlnaHRgIHdoZW4gYSBsaWdodCB0aGVtZSBpcyBhY3RpdmUpLlxuICAgICovXG4gICAgc3RhdGljIHRoZW1lKHNwZWMsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHByZWZpeCA9IFN0eWxlTW9kdWxlLm5ld05hbWUoKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFt0aGVtZS5vZihwcmVmaXgpLCBzdHlsZU1vZHVsZS5vZihidWlsZFRoZW1lKGAuJHtwcmVmaXh9YCwgc3BlYykpXTtcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kYXJrKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZGFya1RoZW1lLm9mKHRydWUpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IGFkZHMgc3R5bGVzIHRvIHRoZSBiYXNlIHRoZW1lLiBMaWtlXG4gICAgd2l0aCBbYHRoZW1lYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdedGhlbWUpLCB1c2UgYCZgIHRvIGluZGljYXRlIHRoZVxuICAgIHBsYWNlIG9mIHRoZSBlZGl0b3Igd3JhcHBlciBlbGVtZW50IHdoZW4gZGlyZWN0bHkgdGFyZ2V0aW5nXG4gICAgdGhhdC4gWW91IGNhbiBhbHNvIHVzZSBgJmRhcmtgIG9yIGAmbGlnaHRgIGluc3RlYWQgdG8gb25seVxuICAgIHRhcmdldCBlZGl0b3JzIHdpdGggYSBkYXJrIG9yIGxpZ2h0IHRoZW1lLlxuICAgICovXG4gICAgc3RhdGljIGJhc2VUaGVtZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBQcmVjLmxvd2VzdChzdHlsZU1vZHVsZS5vZihidWlsZFRoZW1lKFwiLlwiICsgYmFzZVRoZW1lSUQsIHNwZWMsIGxpZ2h0RGFya0lEcykpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmUgYW4gZWRpdG9yIHZpZXcgaW5zdGFuY2UgZnJvbSB0aGUgdmlldydzIERPTVxuICAgIHJlcHJlc2VudGF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGZpbmRGcm9tRE9NKGRvbSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBjb250ZW50ID0gZG9tLnF1ZXJ5U2VsZWN0b3IoXCIuY20tY29udGVudFwiKTtcbiAgICAgICAgbGV0IGNWaWV3ID0gY29udGVudCAmJiBDb250ZW50Vmlldy5nZXQoY29udGVudCkgfHwgQ29udGVudFZpZXcuZ2V0KGRvbSk7XG4gICAgICAgIHJldHVybiAoKF9hID0gY1ZpZXcgPT09IG51bGwgfHwgY1ZpZXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNWaWV3LnJvb3RWaWV3KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmlldykgfHwgbnVsbDtcbiAgICB9XG59XG4vKipcbkZhY2V0IHRvIGFkZCBhIFtzdHlsZVxubW9kdWxlXShodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9zdHlsZS1tb2QjZG9jdW1lbnRhdGlvbikgdG9cbmFuIGVkaXRvciB2aWV3LiBUaGUgdmlldyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBtb2R1bGUgaXNcbm1vdW50ZWQgaW4gaXRzIFtkb2N1bWVudFxucm9vdF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuY29uc3RydWN0b3JeY29uZmlnLnJvb3QpLlxuKi9cbkVkaXRvclZpZXcuc3R5bGVNb2R1bGUgPSBzdHlsZU1vZHVsZTtcbi8qKlxuQW4gaW5wdXQgaGFuZGxlciBjYW4gb3ZlcnJpZGUgdGhlIHdheSBjaGFuZ2VzIHRvIHRoZSBlZGl0YWJsZVxuRE9NIGNvbnRlbnQgYXJlIGhhbmRsZWQuIEhhbmRsZXJzIGFyZSBwYXNzZWQgdGhlIGRvY3VtZW50XG5wb3NpdGlvbnMgYmV0d2VlbiB3aGljaCB0aGUgY2hhbmdlIHdhcyBmb3VuZCwgYW5kIHRoZSBuZXdcbmNvbnRlbnQuIFdoZW4gb25lIHJldHVybnMgdHJ1ZSwgbm8gZnVydGhlciBpbnB1dCBoYW5kbGVycyBhcmVcbmNhbGxlZCBhbmQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgcHJldmVudGVkLlxuXG5UaGUgYGluc2VydGAgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBkZWZhdWx0IHRyYW5zYWN0aW9uXG50aGF0IHdvdWxkIGJlIGFwcGxpZWQgZm9yIHRoaXMgaW5wdXQuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuXG5kaXNwYXRjaGluZyB0aGUgY3VzdG9tIGJlaGF2aW9yIGFzIGEgc2VwYXJhdGUgdHJhbnNhY3Rpb24uXG4qL1xuRWRpdG9yVmlldy5pbnB1dEhhbmRsZXIgPSBpbnB1dEhhbmRsZXI7XG4vKipcbkZ1bmN0aW9ucyBwcm92aWRlZCBpbiB0aGlzIGZhY2V0IHdpbGwgYmUgdXNlZCB0byB0cmFuc2Zvcm0gdGV4dFxucGFzdGVkIG9yIGRyb3BwZWQgaW50byB0aGUgZWRpdG9yLlxuKi9cbkVkaXRvclZpZXcuY2xpcGJvYXJkSW5wdXRGaWx0ZXIgPSBjbGlwYm9hcmRJbnB1dEZpbHRlcjtcbi8qKlxuVHJhbnNmb3JtIHRleHQgY29waWVkIG9yIGRyYWdnZWQgZnJvbSB0aGUgZWRpdG9yLlxuKi9cbkVkaXRvclZpZXcuY2xpcGJvYXJkT3V0cHV0RmlsdGVyID0gY2xpcGJvYXJkT3V0cHV0RmlsdGVyO1xuLyoqXG5TY3JvbGwgaGFuZGxlcnMgY2FuIG92ZXJyaWRlIGhvdyB0aGluZ3MgYXJlIHNjcm9sbGVkIGludG8gdmlldy5cbklmIHRoZXkgcmV0dXJuIGB0cnVlYCwgbm8gZnVydGhlciBoYW5kbGluZyBoYXBwZW5zIGZvciB0aGVcbnNjcm9sbGluZy4gSWYgdGhleSByZXR1cm4gZmFsc2UsIHRoZSBkZWZhdWx0IHNjcm9sbCBiZWhhdmlvciBpc1xuYXBwbGllZC4gU2Nyb2xsIGhhbmRsZXJzIHNob3VsZCBuZXZlciBpbml0aWF0ZSBlZGl0b3IgdXBkYXRlcy5cbiovXG5FZGl0b3JWaWV3LnNjcm9sbEhhbmRsZXIgPSBzY3JvbGxIYW5kbGVyO1xuLyoqXG5UaGlzIGZhY2V0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgZnVuY3Rpb25zIHRoYXQgY3JlYXRlIGVmZmVjdHNcbnRvIGJlIGRpc3BhdGNoZWQgd2hlbiB0aGUgZWRpdG9yJ3MgZm9jdXMgc3RhdGUgY2hhbmdlcy5cbiovXG5FZGl0b3JWaWV3LmZvY3VzQ2hhbmdlRWZmZWN0ID0gZm9jdXNDaGFuZ2VFZmZlY3Q7XG4vKipcbkJ5IGRlZmF1bHQsIHRoZSBlZGl0b3IgYXNzdW1lcyBhbGwgaXRzIGNvbnRlbnQgaGFzIHRoZSBzYW1lXG5bdGV4dCBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EaXJlY3Rpb24pLiBDb25maWd1cmUgdGhpcyB3aXRoIGEgYHRydWVgXG52YWx1ZSB0byBtYWtlIGl0IHJlYWQgdGhlIHRleHQgZGlyZWN0aW9uIG9mIGV2ZXJ5IChyZW5kZXJlZClcbmxpbmUgc2VwYXJhdGVseS5cbiovXG5FZGl0b3JWaWV3LnBlckxpbmVUZXh0RGlyZWN0aW9uID0gcGVyTGluZVRleHREaXJlY3Rpb247XG4vKipcbkFsbG93cyB5b3UgdG8gcHJvdmlkZSBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZVxubGlicmFyeSBjYXRjaGVzIGFuIGV4Y2VwdGlvbiBmcm9tIGFuIGV4dGVuc2lvbiAobW9zdGx5IGZyb20gdmlld1xucGx1Z2lucywgYnV0IG1heSBiZSB1c2VkIGJ5IG90aGVyIGV4dGVuc2lvbnMgdG8gcm91dGUgZXhjZXB0aW9uc1xuZnJvbSB1c2VyLWNvZGUtcHJvdmlkZWQgY2FsbGJhY2tzKS4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvclxuZGVidWdnaW5nIGFuZCBsb2dnaW5nLiBTZWUgW2Bsb2dFeGNlcHRpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcubG9nRXhjZXB0aW9uKS5cbiovXG5FZGl0b3JWaWV3LmV4Y2VwdGlvblNpbmsgPSBleGNlcHRpb25TaW5rO1xuLyoqXG5BIGZhY2V0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcbmV2ZXJ5IHRpbWUgdGhlIHZpZXcgdXBkYXRlcy5cbiovXG5FZGl0b3JWaWV3LnVwZGF0ZUxpc3RlbmVyID0gdXBkYXRlTGlzdGVuZXI7XG4vKipcbkZhY2V0IHRoYXQgY29udHJvbHMgd2hldGhlciB0aGUgZWRpdG9yIGNvbnRlbnQgRE9NIGlzIGVkaXRhYmxlLlxuV2hlbiBpdHMgaGlnaGVzdC1wcmVjZWRlbmNlIHZhbHVlIGlzIGBmYWxzZWAsIHRoZSBlbGVtZW50IHdpbGxcbm5vdCBoYXZlIGl0cyBgY29udGVudGVkaXRhYmxlYCBhdHRyaWJ1dGUgc2V0LiAoTm90ZSB0aGF0IHRoaXNcbmRvZXNuJ3QgYWZmZWN0IEFQSSBjYWxscyB0aGF0IGNoYW5nZSB0aGUgZWRpdG9yIGNvbnRlbnQsIGV2ZW5cbndoZW4gdGhvc2UgYXJlIGJvdW5kIHRvIGtleXMgb3IgYnV0dG9ucy4gU2VlIHRoZVxuW2ByZWFkT25seWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUucmVhZE9ubHkpIGZhY2V0IGZvciB0aGF0LilcbiovXG5FZGl0b3JWaWV3LmVkaXRhYmxlID0gZWRpdGFibGU7XG4vKipcbkFsbG93cyB5b3UgdG8gaW5mbHVlbmNlIHRoZSB3YXkgbW91c2Ugc2VsZWN0aW9uIGhhcHBlbnMuIFRoZVxuZnVuY3Rpb25zIGluIHRoaXMgZmFjZXQgd2lsbCBiZSBjYWxsZWQgZm9yIGEgYG1vdXNlZG93bmAgZXZlbnRcbm9uIHRoZSBlZGl0b3IsIGFuZCBjYW4gcmV0dXJuIGFuIG9iamVjdCB0aGF0IG92ZXJyaWRlcyB0aGUgd2F5IGFcbnNlbGVjdGlvbiBpcyBjb21wdXRlZCBmcm9tIHRoYXQgbW91c2UgY2xpY2sgb3IgZHJhZy5cbiovXG5FZGl0b3JWaWV3Lm1vdXNlU2VsZWN0aW9uU3R5bGUgPSBtb3VzZVNlbGVjdGlvblN0eWxlO1xuLyoqXG5GYWNldCB1c2VkIHRvIGNvbmZpZ3VyZSB3aGV0aGVyIGEgZ2l2ZW4gc2VsZWN0aW9uIGRyYWcgZXZlbnRcbnNob3VsZCBtb3ZlIG9yIGNvcHkgdGhlIHNlbGVjdGlvbi4gVGhlIGdpdmVuIHByZWRpY2F0ZSB3aWxsIGJlXG5jYWxsZWQgd2l0aCB0aGUgYG1vdXNlZG93bmAgZXZlbnQsIGFuZCBjYW4gcmV0dXJuIGB0cnVlYCB3aGVuXG50aGUgZHJhZyBzaG91bGQgbW92ZSB0aGUgY29udGVudC5cbiovXG5FZGl0b3JWaWV3LmRyYWdNb3Zlc1NlbGVjdGlvbiA9IGRyYWdNb3Zlc1NlbGVjdGlvbiQxO1xuLyoqXG5GYWNldCB1c2VkIHRvIGNvbmZpZ3VyZSB3aGV0aGVyIGEgZ2l2ZW4gc2VsZWN0aW5nIGNsaWNrIGFkZHMgYVxubmV3IHJhbmdlIHRvIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gb3IgcmVwbGFjZXMgaXQgZW50aXJlbHkuIFRoZVxuZGVmYXVsdCBiZWhhdmlvciBpcyB0byBjaGVjayBgZXZlbnQubWV0YUtleWAgb24gbWFjT1MsIGFuZFxuYGV2ZW50LmN0cmxLZXlgIGVsc2V3aGVyZS5cbiovXG5FZGl0b3JWaWV3LmNsaWNrQWRkc1NlbGVjdGlvblJhbmdlID0gY2xpY2tBZGRzU2VsZWN0aW9uUmFuZ2U7XG4vKipcbkEgZmFjZXQgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIFtkZWNvcmF0aW9uc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb24pXG5hcmUgc2hvd24gaW4gdGhlIHZpZXcuIERlY29yYXRpb25zIGNhbiBiZSBwcm92aWRlZCBpbiB0d29cbndheXNcdTIwMTRkaXJlY3RseSwgb3IgdmlhIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBlZGl0b3Igdmlldy5cblxuT25seSBkZWNvcmF0aW9uIHNldHMgcHJvdmlkZWQgZGlyZWN0bHkgYXJlIGFsbG93ZWQgdG8gaW5mbHVlbmNlXG50aGUgZWRpdG9yJ3MgdmVydGljYWwgbGF5b3V0IHN0cnVjdHVyZS4gVGhlIG9uZXMgcHJvdmlkZWQgYXNcbmZ1bmN0aW9ucyBhcmUgY2FsbGVkIF9hZnRlcl8gdGhlIG5ldyB2aWV3cG9ydCBoYXMgYmVlbiBjb21wdXRlZCxcbmFuZCB0aHVzICoqbXVzdCBub3QqKiBpbnRyb2R1Y2UgYmxvY2sgd2lkZ2V0cyBvciByZXBsYWNpbmdcbmRlY29yYXRpb25zIHRoYXQgY292ZXIgbGluZSBicmVha3MuXG5cbklmIHlvdSB3YW50IGRlY29yYXRlZCByYW5nZXMgdG8gYmVoYXZlIGxpa2UgYXRvbWljIHVuaXRzIGZvclxuY3Vyc29yIG1vdGlvbiBhbmQgZGVsZXRpb24gcHVycG9zZXMsIGFsc28gcHJvdmlkZSB0aGUgcmFuZ2Ugc2V0XG5jb250YWluaW5nIHRoZSBkZWNvcmF0aW9ucyB0b1xuW2BFZGl0b3JWaWV3LmF0b21pY1Jhbmdlc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmF0b21pY1JhbmdlcykuXG4qL1xuRWRpdG9yVmlldy5kZWNvcmF0aW9ucyA9IGRlY29yYXRpb25zO1xuLyoqXG5GYWNldCB0aGF0IHdvcmtzIG11Y2ggbGlrZVxuW2BkZWNvcmF0aW9uc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmRlY29yYXRpb25zKSwgYnV0IHB1dHMgaXRzXG5pbnB1dHMgYXQgdGhlIHZlcnkgYm90dG9tIG9mIHRoZSBwcmVjZWRlbmNlIHN0YWNrLCBtZWFuaW5nIG1hcmtcbmRlY29yYXRpb25zIHByb3ZpZGVkIGhlcmUgd2lsbCBvbmx5IGJlIHNwbGl0IGJ5IG90aGVyLCBwYXJ0aWFsbHlcbm92ZXJsYXBwaW5nIFxcYG91dGVyRGVjb3JhdGlvbnNcXGAgcmFuZ2VzLCBhbmQgd3JhcCBhcm91bmQgYWxsXG5yZWd1bGFyIGRlY29yYXRpb25zLiBVc2UgdGhpcyBmb3IgbWFyayBlbGVtZW50cyB0aGF0IHNob3VsZCwgYXNcbm11Y2ggYXMgcG9zc2libGUsIHJlbWFpbiBpbiBvbmUgcGllY2UuXG4qL1xuRWRpdG9yVmlldy5vdXRlckRlY29yYXRpb25zID0gb3V0ZXJEZWNvcmF0aW9ucztcbi8qKlxuVXNlZCB0byBwcm92aWRlIHJhbmdlcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGF0b21zIGFzIGZhciBhc1xuY3Vyc29yIG1vdGlvbiBpcyBjb25jZXJuZWQuIFRoaXMgY2F1c2VzIG1ldGhvZHMgbGlrZVxuW2Btb3ZlQnlDaGFyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubW92ZUJ5Q2hhcikgYW5kXG5bYG1vdmVWZXJ0aWNhbGx5YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubW92ZVZlcnRpY2FsbHkpIChhbmQgdGhlXG5jb21tYW5kcyBidWlsdCBvbiB0b3Agb2YgdGhlbSkgdG8gc2tpcCBhY3Jvc3Mgc3VjaCByZWdpb25zIHdoZW5cbmEgc2VsZWN0aW9uIGVuZHBvaW50IHdvdWxkIGVudGVyIHRoZW0uIFRoaXMgZG9lcyBfbm90XyBwcmV2ZW50XG5kaXJlY3QgcHJvZ3JhbW1hdGljIFtzZWxlY3Rpb25cbnVwZGF0ZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLnNlbGVjdGlvbikgZnJvbSBtb3ZpbmcgaW50byBzdWNoXG5yZWdpb25zLlxuKi9cbkVkaXRvclZpZXcuYXRvbWljUmFuZ2VzID0gYXRvbWljUmFuZ2VzO1xuLyoqXG5XaGVuIHJhbmdlIGRlY29yYXRpb25zIGFkZCBhIGB1bmljb2RlLWJpZGk6IGlzb2xhdGVgIHN0eWxlLCB0aGV5XG5zaG91bGQgYWxzbyBpbmNsdWRlIGFcbltgYmlkaUlzb2xhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuTWFya0RlY29yYXRpb25TcGVjLmJpZGlJc29sYXRlKSBwcm9wZXJ0eVxuaW4gdGhlaXIgZGVjb3JhdGlvbiBzcGVjLCBhbmQgYmUgZXhwb3NlZCB0aHJvdWdoIHRoaXMgZmFjZXQsIHNvXG50aGF0IHRoZSBlZGl0b3IgY2FuIGNvbXB1dGUgdGhlIHByb3BlciB0ZXh0IG9yZGVyLiAoT3RoZXIgdmFsdWVzXG5mb3IgYHVuaWNvZGUtYmlkaWAsIGV4Y2VwdCBvZiBjb3Vyc2UgYG5vcm1hbGAsIGFyZSBub3RcbnN1cHBvcnRlZC4pXG4qL1xuRWRpdG9yVmlldy5iaWRpSXNvbGF0ZWRSYW5nZXMgPSBiaWRpSXNvbGF0ZWRSYW5nZXM7XG4vKipcbkZhY2V0IHRoYXQgYWxsb3dzIGV4dGVuc2lvbnMgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHNjcm9sbFxubWFyZ2lucyAoc3BhY2UgYXJvdW5kIHRoZSBzaWRlcyBvZiB0aGUgc2Nyb2xsaW5nIGVsZW1lbnQgdGhhdFxuc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW52aXNpYmxlKS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdGhlXG5wbHVnaW4gaW50cm9kdWNlcyBlbGVtZW50cyB0aGF0IGNvdmVyIHBhcnQgb2YgdGhhdCBlbGVtZW50IChmb3JcbmV4YW1wbGUgYSBob3Jpem9udGFsbHkgZml4ZWQgZ3V0dGVyKS5cbiovXG5FZGl0b3JWaWV3LnNjcm9sbE1hcmdpbnMgPSBzY3JvbGxNYXJnaW5zO1xuLyoqXG5UaGlzIGZhY2V0IHJlY29yZHMgd2hldGhlciBhIGRhcmsgdGhlbWUgaXMgYWN0aXZlLiBUaGUgZXh0ZW5zaW9uXG5yZXR1cm5lZCBieSBbYHRoZW1lYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdedGhlbWUpIGF1dG9tYXRpY2FsbHlcbmluY2x1ZGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgd2hlbiB0aGUgYGRhcmtgIG9wdGlvbiBpcyBzZXQgdG9cbnRydWUuXG4qL1xuRWRpdG9yVmlldy5kYXJrVGhlbWUgPSBkYXJrVGhlbWU7XG4vKipcblByb3ZpZGVzIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgbm9uY2UgdG8gdXNlIHdoZW4gY3JlYXRpbmdcbnRoZSBzdHlsZSBzaGVldHMgZm9yIHRoZSBlZGl0b3IuIEhvbGRzIHRoZSBlbXB0eSBzdHJpbmcgd2hlbiBub1xubm9uY2UgaGFzIGJlZW4gcHJvdmlkZWQuXG4qL1xuRWRpdG9yVmlldy5jc3BOb25jZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IFwiXCIgfSk7XG4vKipcbkZhY2V0IHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBET00gYXR0cmlidXRlcyBmb3IgdGhlIGVkaXRvcidzXG5lZGl0YWJsZSBET00gZWxlbWVudC5cbiovXG5FZGl0b3JWaWV3LmNvbnRlbnRBdHRyaWJ1dGVzID0gY29udGVudEF0dHJpYnV0ZXM7XG4vKipcbkZhY2V0IHRoYXQgcHJvdmlkZXMgRE9NIGF0dHJpYnV0ZXMgZm9yIHRoZSBlZGl0b3IncyBvdXRlclxuZWxlbWVudC5cbiovXG5FZGl0b3JWaWV3LmVkaXRvckF0dHJpYnV0ZXMgPSBlZGl0b3JBdHRyaWJ1dGVzO1xuLyoqXG5BbiBleHRlbnNpb24gdGhhdCBlbmFibGVzIGxpbmUgd3JhcHBpbmcgaW4gdGhlIGVkaXRvciAoYnlcbnNldHRpbmcgQ1NTIGB3aGl0ZS1zcGFjZWAgdG8gYHByZS13cmFwYCBpbiB0aGUgY29udGVudCkuXG4qL1xuRWRpdG9yVmlldy5saW5lV3JhcHBpbmcgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5vZih7IFwiY2xhc3NcIjogXCJjbS1saW5lV3JhcHBpbmdcIiB9KTtcbi8qKlxuU3RhdGUgZWZmZWN0IHVzZWQgdG8gaW5jbHVkZSBzY3JlZW4gcmVhZGVyIGFubm91bmNlbWVudHMgaW4gYVxudHJhbnNhY3Rpb24uIFRoZXNlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIERPTSBpbiBhIHZpc3VhbGx5IGhpZGRlblxuZWxlbWVudCB3aXRoIGBhcmlhLWxpdmU9XCJwb2xpdGVcImAgc2V0LCBhbmQgc2hvdWxkIGJlIHVzZWQgdG9cbmRlc2NyaWJlIGVmZmVjdHMgdGhhdCBhcmUgdmlzdWFsbHkgb2J2aW91cyBidXQgbWF5IG5vdCBiZVxubm90aWNlZCBieSBzY3JlZW4gcmVhZGVyIHVzZXJzIChzdWNoIGFzIG1vdmluZyB0byB0aGUgbmV4dFxuc2VhcmNoIG1hdGNoKS5cbiovXG5FZGl0b3JWaWV3LmFubm91bmNlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLy8gTWF4aW11bSBsaW5lIGxlbmd0aCBmb3Igd2hpY2ggd2UgY29tcHV0ZSBhY2N1cmF0ZSBiaWRpIGluZm9cbmNvbnN0IE1heEJpZGlMaW5lID0gNDA5NjtcbmNvbnN0IEJhZE1lYXN1cmUgPSB7fTtcbmNsYXNzIENhY2hlZE9yZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bywgZGlyLCBpc29sYXRlcywgZnJlc2gsIG9yZGVyKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5kaXIgPSBkaXI7XG4gICAgICAgIHRoaXMuaXNvbGF0ZXMgPSBpc29sYXRlcztcbiAgICAgICAgdGhpcy5mcmVzaCA9IGZyZXNoO1xuICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXI7XG4gICAgfVxuICAgIHN0YXRpYyB1cGRhdGUoY2FjaGUsIGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuZW1wdHkgJiYgIWNhY2hlLnNvbWUoYyA9PiBjLmZyZXNoKSlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdLCBsYXN0RGlyID0gY2FjaGUubGVuZ3RoID8gY2FjaGVbY2FjaGUubGVuZ3RoIC0gMV0uZGlyIDogRGlyZWN0aW9uLkxUUjtcbiAgICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWF4KDAsIGNhY2hlLmxlbmd0aCAtIDEwKTsgaSA8IGNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSBjYWNoZVtpXTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5kaXIgPT0gbGFzdERpciAmJiAhY2hhbmdlcy50b3VjaGVzUmFuZ2UoZW50cnkuZnJvbSwgZW50cnkudG8pKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBDYWNoZWRPcmRlcihjaGFuZ2VzLm1hcFBvcyhlbnRyeS5mcm9tLCAxKSwgY2hhbmdlcy5tYXBQb3MoZW50cnkudG8sIC0xKSwgZW50cnkuZGlyLCBlbnRyeS5pc29sYXRlcywgZmFsc2UsIGVudHJ5Lm9yZGVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBhdHRyc0Zyb21GYWNldCh2aWV3LCBmYWNldCwgYmFzZSkge1xuICAgIGZvciAobGV0IHNvdXJjZXMgPSB2aWV3LnN0YXRlLmZhY2V0KGZhY2V0KSwgaSA9IHNvdXJjZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZXNbaV0sIHZhbHVlID0gdHlwZW9mIHNvdXJjZSA9PSBcImZ1bmN0aW9uXCIgPyBzb3VyY2UodmlldykgOiBzb3VyY2U7XG4gICAgICAgIGlmICh2YWx1ZSlcbiAgICAgICAgICAgIGNvbWJpbmVBdHRycyh2YWx1ZSwgYmFzZSk7XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xufVxuXG5jb25zdCBjdXJyZW50UGxhdGZvcm0gPSBicm93c2VyLm1hYyA/IFwibWFjXCIgOiBicm93c2VyLndpbmRvd3MgPyBcIndpblwiIDogYnJvd3Nlci5saW51eCA/IFwibGludXhcIiA6IFwia2V5XCI7XG5mdW5jdGlvbiBub3JtYWxpemVLZXlOYW1lKG5hbWUsIHBsYXRmb3JtKSB7XG4gICAgY29uc3QgcGFydHMgPSBuYW1lLnNwbGl0KC8tKD8hJCkvKTtcbiAgICBsZXQgcmVzdWx0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKHJlc3VsdCA9PSBcIlNwYWNlXCIpXG4gICAgICAgIHJlc3VsdCA9IFwiIFwiO1xuICAgIGxldCBhbHQsIGN0cmwsIHNoaWZ0LCBtZXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIGNvbnN0IG1vZCA9IHBhcnRzW2ldO1xuICAgICAgICBpZiAoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgbWV0YSA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eYShsdCk/JC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIGFsdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eKGN8Y3RybHxjb250cm9sKSQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBjdHJsID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL15zKGhpZnQpPyQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBzaGlmdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9ebW9kJC9pLnRlc3QobW9kKSkge1xuICAgICAgICAgICAgaWYgKHBsYXRmb3JtID09IFwibWFjXCIpXG4gICAgICAgICAgICAgICAgbWV0YSA9IHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY3RybCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIG1vZGlmaWVyIG5hbWU6IFwiICsgbW9kKTtcbiAgICB9XG4gICAgaWYgKGFsdClcbiAgICAgICAgcmVzdWx0ID0gXCJBbHQtXCIgKyByZXN1bHQ7XG4gICAgaWYgKGN0cmwpXG4gICAgICAgIHJlc3VsdCA9IFwiQ3RybC1cIiArIHJlc3VsdDtcbiAgICBpZiAobWV0YSlcbiAgICAgICAgcmVzdWx0ID0gXCJNZXRhLVwiICsgcmVzdWx0O1xuICAgIGlmIChzaGlmdClcbiAgICAgICAgcmVzdWx0ID0gXCJTaGlmdC1cIiArIHJlc3VsdDtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCBzaGlmdCkge1xuICAgIGlmIChldmVudC5hbHRLZXkpXG4gICAgICAgIG5hbWUgPSBcIkFsdC1cIiArIG5hbWU7XG4gICAgaWYgKGV2ZW50LmN0cmxLZXkpXG4gICAgICAgIG5hbWUgPSBcIkN0cmwtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5tZXRhS2V5KVxuICAgICAgICBuYW1lID0gXCJNZXRhLVwiICsgbmFtZTtcbiAgICBpZiAoc2hpZnQgIT09IGZhbHNlICYmIGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgICBuYW1lID0gXCJTaGlmdC1cIiArIG5hbWU7XG4gICAgcmV0dXJuIG5hbWU7XG59XG5jb25zdCBoYW5kbGVLZXlFdmVudHMgPSAvKkBfX1BVUkVfXyovUHJlYy5kZWZhdWx0KC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LmRvbUV2ZW50SGFuZGxlcnMoe1xuICAgIGtleWRvd24oZXZlbnQsIHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHJ1bkhhbmRsZXJzKGdldEtleW1hcCh2aWV3LnN0YXRlKSwgZXZlbnQsIHZpZXcsIFwiZWRpdG9yXCIpO1xuICAgIH1cbn0pKTtcbi8qKlxuRmFjZXQgdXNlZCBmb3IgcmVnaXN0ZXJpbmcga2V5bWFwcy5cblxuWW91IGNhbiBhZGQgbXVsdGlwbGUga2V5bWFwcyB0byBhbiBlZGl0b3IuIFRoZWlyIHByaW9yaXRpZXNcbmRldGVybWluZSB0aGVpciBwcmVjZWRlbmNlICh0aGUgb25lcyBzcGVjaWZpZWQgZWFybHkgb3Igd2l0aCBoaWdoXG5wcmlvcml0eSBnZXQgY2hlY2tlZCBmaXJzdCkuIFdoZW4gYSBoYW5kbGVyIGhhcyByZXR1cm5lZCBgdHJ1ZWBcbmZvciBhIGdpdmVuIGtleSwgbm8gZnVydGhlciBoYW5kbGVycyBhcmUgY2FsbGVkLlxuKi9cbmNvbnN0IGtleW1hcCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBlbmFibGVzOiBoYW5kbGVLZXlFdmVudHMgfSk7XG5jb25zdCBLZXltYXBzID0gLypAX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4vLyBUaGlzIGlzIGhpZGRlbiBiZWhpbmQgYW4gaW5kaXJlY3Rpb24sIHJhdGhlciB0aGFuIGRpcmVjdGx5IGNvbXB1dGVkXG4vLyBieSB0aGUgZmFjZXQsIHRvIGtlZXAgaW50ZXJuYWwgdHlwZXMgb3V0IG9mIHRoZSBmYWNldCdzIHR5cGUuXG5mdW5jdGlvbiBnZXRLZXltYXAoc3RhdGUpIHtcbiAgICBsZXQgYmluZGluZ3MgPSBzdGF0ZS5mYWNldChrZXltYXApO1xuICAgIGxldCBtYXAgPSBLZXltYXBzLmdldChiaW5kaW5ncyk7XG4gICAgaWYgKCFtYXApXG4gICAgICAgIEtleW1hcHMuc2V0KGJpbmRpbmdzLCBtYXAgPSBidWlsZEtleW1hcChiaW5kaW5ncy5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSkpKTtcbiAgICByZXR1cm4gbWFwO1xufVxuLyoqXG5SdW4gdGhlIGtleSBoYW5kbGVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIHNjb3BlLiBUaGUgZXZlbnRcbm9iamVjdCBzaG91bGQgYmUgYSBgXCJrZXlkb3duXCJgIGV2ZW50LiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZVxuaGFuZGxlcnMgaGFuZGxlZCBpdC5cbiovXG5mdW5jdGlvbiBydW5TY29wZUhhbmRsZXJzKHZpZXcsIGV2ZW50LCBzY29wZSkge1xuICAgIHJldHVybiBydW5IYW5kbGVycyhnZXRLZXltYXAodmlldy5zdGF0ZSksIGV2ZW50LCB2aWV3LCBzY29wZSk7XG59XG5sZXQgc3RvcmVkUHJlZml4ID0gbnVsbDtcbmNvbnN0IFByZWZpeFRpbWVvdXQgPSA0MDAwO1xuZnVuY3Rpb24gYnVpbGRLZXltYXAoYmluZGluZ3MsIHBsYXRmb3JtID0gY3VycmVudFBsYXRmb3JtKSB7XG4gICAgbGV0IGJvdW5kID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgaXNQcmVmaXggPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjaGVja1ByZWZpeCA9IChuYW1lLCBpcykgPT4ge1xuICAgICAgICBsZXQgY3VycmVudCA9IGlzUHJlZml4W25hbWVdO1xuICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKVxuICAgICAgICAgICAgaXNQcmVmaXhbbmFtZV0gPSBpcztcbiAgICAgICAgZWxzZSBpZiAoY3VycmVudCAhPSBpcylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIktleSBiaW5kaW5nIFwiICsgbmFtZSArIFwiIGlzIHVzZWQgYm90aCBhcyBhIHJlZ3VsYXIgYmluZGluZyBhbmQgYXMgYSBtdWx0aS1zdHJva2UgcHJlZml4XCIpO1xuICAgIH07XG4gICAgbGV0IGFkZCA9IChzY29wZSwga2V5LCBjb21tYW5kLCBwcmV2ZW50RGVmYXVsdCwgc3RvcFByb3BhZ2F0aW9uKSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGxldCBzY29wZU9iaiA9IGJvdW5kW3Njb3BlXSB8fCAoYm91bmRbc2NvcGVdID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgIGxldCBwYXJ0cyA9IGtleS5zcGxpdCgvICg/ISQpLykubWFwKGsgPT4gbm9ybWFsaXplS2V5TmFtZShrLCBwbGF0Zm9ybSkpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcHJlZml4ID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbihcIiBcIik7XG4gICAgICAgICAgICBjaGVja1ByZWZpeChwcmVmaXgsIHRydWUpO1xuICAgICAgICAgICAgaWYgKCFzY29wZU9ialtwcmVmaXhdKVxuICAgICAgICAgICAgICAgIHNjb3BlT2JqW3ByZWZpeF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzdG9wUHJvcGFnYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBydW46IFsodmlldykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvdXJPYmogPSBzdG9yZWRQcmVmaXggPSB7IHZpZXcsIHByZWZpeCwgc2NvcGUgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgaWYgKHN0b3JlZFByZWZpeCA9PSBvdXJPYmopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZFByZWZpeCA9IG51bGw7IH0sIFByZWZpeFRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBmdWxsID0gcGFydHMuam9pbihcIiBcIik7XG4gICAgICAgIGNoZWNrUHJlZml4KGZ1bGwsIGZhbHNlKTtcbiAgICAgICAgbGV0IGJpbmRpbmcgPSBzY29wZU9ialtmdWxsXSB8fCAoc2NvcGVPYmpbZnVsbF0gPSB7XG4gICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgICBzdG9wUHJvcGFnYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgcnVuOiAoKF9iID0gKF9hID0gc2NvcGVPYmouX2FueSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJ1bikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnNsaWNlKCkpIHx8IFtdXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY29tbWFuZClcbiAgICAgICAgICAgIGJpbmRpbmcucnVuLnB1c2goY29tbWFuZCk7XG4gICAgICAgIGlmIChwcmV2ZW50RGVmYXVsdClcbiAgICAgICAgICAgIGJpbmRpbmcucHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgICAgICBpZiAoc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgYmluZGluZy5zdG9wUHJvcGFnYXRpb24gPSB0cnVlO1xuICAgIH07XG4gICAgZm9yIChsZXQgYiBvZiBiaW5kaW5ncykge1xuICAgICAgICBsZXQgc2NvcGVzID0gYi5zY29wZSA/IGIuc2NvcGUuc3BsaXQoXCIgXCIpIDogW1wiZWRpdG9yXCJdO1xuICAgICAgICBpZiAoYi5hbnkpXG4gICAgICAgICAgICBmb3IgKGxldCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2NvcGVPYmogPSBib3VuZFtzY29wZV0gfHwgKGJvdW5kW3Njb3BlXSA9IE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGVPYmouX2FueSlcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVPYmouX2FueSA9IHsgcHJldmVudERlZmF1bHQ6IGZhbHNlLCBzdG9wUHJvcGFnYXRpb246IGZhbHNlLCBydW46IFtdIH07XG4gICAgICAgICAgICAgICAgbGV0IHsgYW55IH0gPSBiO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBzY29wZU9iailcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVPYmpba2V5XS5ydW4ucHVzaCh2aWV3ID0+IGFueSh2aWV3LCBjdXJyZW50S2V5RXZlbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgbGV0IG5hbWUgPSBiW3BsYXRmb3JtXSB8fCBiLmtleTtcbiAgICAgICAgaWYgKCFuYW1lKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGZvciAobGV0IHNjb3BlIG9mIHNjb3Blcykge1xuICAgICAgICAgICAgYWRkKHNjb3BlLCBuYW1lLCBiLnJ1biwgYi5wcmV2ZW50RGVmYXVsdCwgYi5zdG9wUHJvcGFnYXRpb24pO1xuICAgICAgICAgICAgaWYgKGIuc2hpZnQpXG4gICAgICAgICAgICAgICAgYWRkKHNjb3BlLCBcIlNoaWZ0LVwiICsgbmFtZSwgYi5zaGlmdCwgYi5wcmV2ZW50RGVmYXVsdCwgYi5zdG9wUHJvcGFnYXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBib3VuZDtcbn1cbmxldCBjdXJyZW50S2V5RXZlbnQgPSBudWxsO1xuZnVuY3Rpb24gcnVuSGFuZGxlcnMobWFwLCBldmVudCwgdmlldywgc2NvcGUpIHtcbiAgICBjdXJyZW50S2V5RXZlbnQgPSBldmVudDtcbiAgICBsZXQgbmFtZSA9IGtleU5hbWUoZXZlbnQpO1xuICAgIGxldCBjaGFyQ29kZSA9IGNvZGVQb2ludEF0KG5hbWUsIDApLCBpc0NoYXIgPSBjb2RlUG9pbnRTaXplKGNoYXJDb2RlKSA9PSBuYW1lLmxlbmd0aCAmJiBuYW1lICE9IFwiIFwiO1xuICAgIGxldCBwcmVmaXggPSBcIlwiLCBoYW5kbGVkID0gZmFsc2UsIHByZXZlbnRlZCA9IGZhbHNlLCBzdG9wUHJvcGFnYXRpb24gPSBmYWxzZTtcbiAgICBpZiAoc3RvcmVkUHJlZml4ICYmIHN0b3JlZFByZWZpeC52aWV3ID09IHZpZXcgJiYgc3RvcmVkUHJlZml4LnNjb3BlID09IHNjb3BlKSB7XG4gICAgICAgIHByZWZpeCA9IHN0b3JlZFByZWZpeC5wcmVmaXggKyBcIiBcIjtcbiAgICAgICAgaWYgKG1vZGlmaWVyQ29kZXMuaW5kZXhPZihldmVudC5rZXlDb2RlKSA8IDApIHtcbiAgICAgICAgICAgIHByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgICBzdG9yZWRQcmVmaXggPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCByYW4gPSBuZXcgU2V0O1xuICAgIGxldCBydW5Gb3IgPSAoYmluZGluZykgPT4ge1xuICAgICAgICBpZiAoYmluZGluZykge1xuICAgICAgICAgICAgZm9yIChsZXQgY21kIG9mIGJpbmRpbmcucnVuKVxuICAgICAgICAgICAgICAgIGlmICghcmFuLmhhcyhjbWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbi5hZGQoY21kKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNtZCh2aWV3KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcuc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiaW5kaW5nLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcuc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgICAgICAgICBzdG9wUHJvcGFnYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgbGV0IHNjb3BlT2JqID0gbWFwW3Njb3BlXSwgYmFzZU5hbWUsIHNoaWZ0TmFtZTtcbiAgICBpZiAoc2NvcGVPYmopIHtcbiAgICAgICAgaWYgKHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMobmFtZSwgZXZlbnQsICFpc0NoYXIpXSkpIHtcbiAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQ2hhciAmJiAoZXZlbnQuYWx0S2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkgJiZcbiAgICAgICAgICAgIC8vIEN0cmwtQWx0IG1heSBiZSB1c2VkIGZvciBBbHRHciBvbiBXaW5kb3dzXG4gICAgICAgICAgICAhKGJyb3dzZXIud2luZG93cyAmJiBldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSkgJiZcbiAgICAgICAgICAgIChiYXNlTmFtZSA9IGJhc2VbZXZlbnQua2V5Q29kZV0pICYmIGJhc2VOYW1lICE9IG5hbWUpIHtcbiAgICAgICAgICAgIGlmIChydW5Gb3Ioc2NvcGVPYmpbcHJlZml4ICsgbW9kaWZpZXJzKGJhc2VOYW1lLCBldmVudCwgdHJ1ZSldKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgKHNoaWZ0TmFtZSA9IHNoaWZ0W2V2ZW50LmtleUNvZGVdKSAhPSBuYW1lICYmIHNoaWZ0TmFtZSAhPSBiYXNlTmFtZSAmJlxuICAgICAgICAgICAgICAgIHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMoc2hpZnROYW1lLCBldmVudCwgZmFsc2UpXSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0NoYXIgJiYgZXZlbnQuc2hpZnRLZXkgJiZcbiAgICAgICAgICAgIHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMobmFtZSwgZXZlbnQsIHRydWUpXSkpIHtcbiAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGFuZGxlZCAmJiBydW5Gb3Ioc2NvcGVPYmouX2FueSkpXG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByZXZlbnRlZClcbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgaWYgKGhhbmRsZWQgJiYgc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjdXJyZW50S2V5RXZlbnQgPSBudWxsO1xuICAgIHJldHVybiBoYW5kbGVkO1xufVxuXG4vKipcbkltcGxlbWVudGF0aW9uIG9mIFtgTGF5ZXJNYXJrZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuTGF5ZXJNYXJrZXIpIHRoYXQgY3JlYXRlc1xuYSByZWN0YW5nbGUgYXQgYSBnaXZlbiBzZXQgb2YgY29vcmRpbmF0ZXMuXG4qL1xuY2xhc3MgUmVjdGFuZ2xlTWFya2VyIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrZXIgd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgYW5kIGRpbWVuc2lvbnMuIElmIGB3aWR0aGBcbiAgICBpcyBudWxsLCB0aGUgRE9NIGVsZW1lbnQgd2lsbCBnZXQgbm8gd2lkdGggc3R5bGUuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGFzc05hbWUsIFxuICAgIC8qKlxuICAgIFRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBtYXJrZXIgKGluIHBpeGVscywgZG9jdW1lbnQtcmVsYXRpdmUpLlxuICAgICovXG4gICAgbGVmdCwgXG4gICAgLyoqXG4gICAgVGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgbWFya2VyLlxuICAgICovXG4gICAgdG9wLCBcbiAgICAvKipcbiAgICBUaGUgd2lkdGggb2YgdGhlIG1hcmtlciwgb3IgbnVsbCBpZiBpdCBzaG91bGRuJ3QgZ2V0IGEgd2lkdGggYXNzaWduZWQuXG4gICAgKi9cbiAgICB3aWR0aCwgXG4gICAgLyoqXG4gICAgVGhlIGhlaWdodCBvZiB0aGUgbWFya2VyLlxuICAgICovXG4gICAgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB9XG4gICAgZHJhdygpIHtcbiAgICAgICAgbGV0IGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGVsdC5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5hZGp1c3QoZWx0KTtcbiAgICAgICAgcmV0dXJuIGVsdDtcbiAgICB9XG4gICAgdXBkYXRlKGVsdCwgcHJldikge1xuICAgICAgICBpZiAocHJldi5jbGFzc05hbWUgIT0gdGhpcy5jbGFzc05hbWUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuYWRqdXN0KGVsdCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhZGp1c3QoZWx0KSB7XG4gICAgICAgIGVsdC5zdHlsZS5sZWZ0ID0gdGhpcy5sZWZ0ICsgXCJweFwiO1xuICAgICAgICBlbHQuc3R5bGUudG9wID0gdGhpcy50b3AgKyBcInB4XCI7XG4gICAgICAgIGlmICh0aGlzLndpZHRoICE9IG51bGwpXG4gICAgICAgICAgICBlbHQuc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgXCJweFwiO1xuICAgICAgICBlbHQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBcInB4XCI7XG4gICAgfVxuICAgIGVxKHApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVmdCA9PSBwLmxlZnQgJiYgdGhpcy50b3AgPT0gcC50b3AgJiYgdGhpcy53aWR0aCA9PSBwLndpZHRoICYmIHRoaXMuaGVpZ2h0ID09IHAuaGVpZ2h0ICYmXG4gICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9PSBwLmNsYXNzTmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IG9mIHJlY3RhbmdsZXMgZm9yIHRoZSBnaXZlbiBzZWxlY3Rpb24gcmFuZ2UsXG4gICAgYXNzaWduaW5nIHRoZW0gdGhlY2xhc3NgY2xhc3NOYW1lYC4gV2lsbCBjcmVhdGUgYSBzaW5nbGVcbiAgICByZWN0YW5nbGUgZm9yIGVtcHR5IHJhbmdlcywgYW5kIGEgc2V0IG9mIHNlbGVjdGlvbi1zdHlsZVxuICAgIHJlY3RhbmdsZXMgY292ZXJpbmcgdGhlIHJhbmdlJ3MgY29udGVudCAoaW4gYSBiaWRpLWF3YXJlXG4gICAgd2F5KSBmb3Igbm9uLWVtcHR5IG9uZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgZm9yUmFuZ2UodmlldywgY2xhc3NOYW1lLCByYW5nZSkge1xuICAgICAgICBpZiAocmFuZ2UuZW1wdHkpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSB2aWV3LmNvb3Jkc0F0UG9zKHJhbmdlLmhlYWQsIHJhbmdlLmFzc29jIHx8IDEpO1xuICAgICAgICAgICAgaWYgKCFwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgbGV0IGJhc2UgPSBnZXRCYXNlKHZpZXcpO1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgUmVjdGFuZ2xlTWFya2VyKGNsYXNzTmFtZSwgcG9zLmxlZnQgLSBiYXNlLmxlZnQsIHBvcy50b3AgLSBiYXNlLnRvcCwgbnVsbCwgcG9zLmJvdHRvbSAtIHBvcy50b3ApXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZWN0YW5nbGVzRm9yUmFuZ2UodmlldywgY2xhc3NOYW1lLCByYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRCYXNlKHZpZXcpIHtcbiAgICBsZXQgcmVjdCA9IHZpZXcuc2Nyb2xsRE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBsZWZ0ID0gdmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFIgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0IC0gdmlldy5zY3JvbGxET00uY2xpZW50V2lkdGggKiB2aWV3LnNjYWxlWDtcbiAgICByZXR1cm4geyBsZWZ0OiBsZWZ0IC0gdmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdCAqIHZpZXcuc2NhbGVYLCB0b3A6IHJlY3QudG9wIC0gdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wICogdmlldy5zY2FsZVkgfTtcbn1cbmZ1bmN0aW9uIHdyYXBwZWRMaW5lKHZpZXcsIHBvcywgc2lkZSwgaW5zaWRlKSB7XG4gICAgbGV0IGNvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3MocG9zLCBzaWRlICogMik7XG4gICAgaWYgKCFjb29yZHMpXG4gICAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgbGV0IGVkaXRvclJlY3QgPSB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgeSA9IChjb29yZHMudG9wICsgY29vcmRzLmJvdHRvbSkgLyAyO1xuICAgIGxldCBsZWZ0ID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGVkaXRvclJlY3QubGVmdCArIDEsIHkgfSk7XG4gICAgbGV0IHJpZ2h0ID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGVkaXRvclJlY3QucmlnaHQgLSAxLCB5IH0pO1xuICAgIGlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGluc2lkZTtcbiAgICByZXR1cm4geyBmcm9tOiBNYXRoLm1heChpbnNpZGUuZnJvbSwgTWF0aC5taW4obGVmdCwgcmlnaHQpKSwgdG86IE1hdGgubWluKGluc2lkZS50bywgTWF0aC5tYXgobGVmdCwgcmlnaHQpKSB9O1xufVxuZnVuY3Rpb24gcmVjdGFuZ2xlc0ZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgcmFuZ2UpIHtcbiAgICBpZiAocmFuZ2UudG8gPD0gdmlldy52aWV3cG9ydC5mcm9tIHx8IHJhbmdlLmZyb20gPj0gdmlldy52aWV3cG9ydC50bylcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIGxldCBmcm9tID0gTWF0aC5tYXgocmFuZ2UuZnJvbSwgdmlldy52aWV3cG9ydC5mcm9tKSwgdG8gPSBNYXRoLm1pbihyYW5nZS50bywgdmlldy52aWV3cG9ydC50byk7XG4gICAgbGV0IGx0ciA9IHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSO1xuICAgIGxldCBjb250ZW50ID0gdmlldy5jb250ZW50RE9NLCBjb250ZW50UmVjdCA9IGNvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGJhc2UgPSBnZXRCYXNlKHZpZXcpO1xuICAgIGxldCBsaW5lRWx0ID0gY29udGVudC5xdWVyeVNlbGVjdG9yKFwiLmNtLWxpbmVcIiksIGxpbmVTdHlsZSA9IGxpbmVFbHQgJiYgd2luZG93LmdldENvbXB1dGVkU3R5bGUobGluZUVsdCk7XG4gICAgbGV0IGxlZnRTaWRlID0gY29udGVudFJlY3QubGVmdCArXG4gICAgICAgIChsaW5lU3R5bGUgPyBwYXJzZUludChsaW5lU3R5bGUucGFkZGluZ0xlZnQpICsgTWF0aC5taW4oMCwgcGFyc2VJbnQobGluZVN0eWxlLnRleHRJbmRlbnQpKSA6IDApO1xuICAgIGxldCByaWdodFNpZGUgPSBjb250ZW50UmVjdC5yaWdodCAtIChsaW5lU3R5bGUgPyBwYXJzZUludChsaW5lU3R5bGUucGFkZGluZ1JpZ2h0KSA6IDApO1xuICAgIGxldCBzdGFydEJsb2NrID0gYmxvY2tBdCh2aWV3LCBmcm9tLCAxKSwgZW5kQmxvY2sgPSBibG9ja0F0KHZpZXcsIHRvLCAtMSk7XG4gICAgbGV0IHZpc3VhbFN0YXJ0ID0gc3RhcnRCbG9jay50eXBlID09IEJsb2NrVHlwZS5UZXh0ID8gc3RhcnRCbG9jayA6IG51bGw7XG4gICAgbGV0IHZpc3VhbEVuZCA9IGVuZEJsb2NrLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQgPyBlbmRCbG9jayA6IG51bGw7XG4gICAgaWYgKHZpc3VhbFN0YXJ0ICYmICh2aWV3LmxpbmVXcmFwcGluZyB8fCBzdGFydEJsb2NrLndpZGdldExpbmVCcmVha3MpKVxuICAgICAgICB2aXN1YWxTdGFydCA9IHdyYXBwZWRMaW5lKHZpZXcsIGZyb20sIDEsIHZpc3VhbFN0YXJ0KTtcbiAgICBpZiAodmlzdWFsRW5kICYmICh2aWV3LmxpbmVXcmFwcGluZyB8fCBlbmRCbG9jay53aWRnZXRMaW5lQnJlYWtzKSlcbiAgICAgICAgdmlzdWFsRW5kID0gd3JhcHBlZExpbmUodmlldywgdG8sIC0xLCB2aXN1YWxFbmQpO1xuICAgIGlmICh2aXN1YWxTdGFydCAmJiB2aXN1YWxFbmQgJiYgdmlzdWFsU3RhcnQuZnJvbSA9PSB2aXN1YWxFbmQuZnJvbSAmJiB2aXN1YWxTdGFydC50byA9PSB2aXN1YWxFbmQudG8pIHtcbiAgICAgICAgcmV0dXJuIHBpZWNlcyhkcmF3Rm9yTGluZShyYW5nZS5mcm9tLCByYW5nZS50bywgdmlzdWFsU3RhcnQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCB0b3AgPSB2aXN1YWxTdGFydCA/IGRyYXdGb3JMaW5lKHJhbmdlLmZyb20sIG51bGwsIHZpc3VhbFN0YXJ0KSA6IGRyYXdGb3JXaWRnZXQoc3RhcnRCbG9jaywgZmFsc2UpO1xuICAgICAgICBsZXQgYm90dG9tID0gdmlzdWFsRW5kID8gZHJhd0ZvckxpbmUobnVsbCwgcmFuZ2UudG8sIHZpc3VhbEVuZCkgOiBkcmF3Rm9yV2lkZ2V0KGVuZEJsb2NrLCB0cnVlKTtcbiAgICAgICAgbGV0IGJldHdlZW4gPSBbXTtcbiAgICAgICAgaWYgKCh2aXN1YWxTdGFydCB8fCBzdGFydEJsb2NrKS50byA8ICh2aXN1YWxFbmQgfHwgZW5kQmxvY2spLmZyb20gLSAodmlzdWFsU3RhcnQgJiYgdmlzdWFsRW5kID8gMSA6IDApIHx8XG4gICAgICAgICAgICBzdGFydEJsb2NrLndpZGdldExpbmVCcmVha3MgPiAxICYmIHRvcC5ib3R0b20gKyB2aWV3LmRlZmF1bHRMaW5lSGVpZ2h0IC8gMiA8IGJvdHRvbS50b3ApXG4gICAgICAgICAgICBiZXR3ZWVuLnB1c2gocGllY2UobGVmdFNpZGUsIHRvcC5ib3R0b20sIHJpZ2h0U2lkZSwgYm90dG9tLnRvcCkpO1xuICAgICAgICBlbHNlIGlmICh0b3AuYm90dG9tIDwgYm90dG9tLnRvcCAmJiB2aWV3LmVsZW1lbnRBdEhlaWdodCgodG9wLmJvdHRvbSArIGJvdHRvbS50b3ApIC8gMikudHlwZSA9PSBCbG9ja1R5cGUuVGV4dClcbiAgICAgICAgICAgIHRvcC5ib3R0b20gPSBib3R0b20udG9wID0gKHRvcC5ib3R0b20gKyBib3R0b20udG9wKSAvIDI7XG4gICAgICAgIHJldHVybiBwaWVjZXModG9wKS5jb25jYXQoYmV0d2VlbikuY29uY2F0KHBpZWNlcyhib3R0b20pKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGllY2UobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlTWFya2VyKGNsYXNzTmFtZSwgbGVmdCAtIGJhc2UubGVmdCwgdG9wIC0gYmFzZS50b3AsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGllY2VzKHsgdG9wLCBib3R0b20sIGhvcml6b250YWwgfSkge1xuICAgICAgICBsZXQgcGllY2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaG9yaXpvbnRhbC5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgICAgIHBpZWNlcy5wdXNoKHBpZWNlKGhvcml6b250YWxbaV0sIHRvcCwgaG9yaXpvbnRhbFtpICsgMV0sIGJvdHRvbSkpO1xuICAgICAgICByZXR1cm4gcGllY2VzO1xuICAgIH1cbiAgICAvLyBHZXRzIHBhc3NlZCBmcm9tL3RvIGluIGxpbmUtbG9jYWwgcG9zaXRpb25zXG4gICAgZnVuY3Rpb24gZHJhd0ZvckxpbmUoZnJvbSwgdG8sIGxpbmUpIHtcbiAgICAgICAgbGV0IHRvcCA9IDFlOSwgYm90dG9tID0gLTFlOSwgaG9yaXpvbnRhbCA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGRTcGFuKGZyb20sIGZyb21PcGVuLCB0bywgdG9PcGVuLCBkaXIpIHtcbiAgICAgICAgICAgIC8vIFBhc3NpbmcgMi8tMiBpcyBhIGtsdWRnZSB0byBmb3JjZSB0aGUgdmlldyB0byByZXR1cm5cbiAgICAgICAgICAgIC8vIGNvb3JkaW5hdGVzIG9uIHRoZSBwcm9wZXIgc2lkZSBvZiBibG9jayB3aWRnZXRzLCBzaW5jZVxuICAgICAgICAgICAgLy8gbm9ybWFsaXppbmcgdGhlIHNpZGUgdGhlcmUsIHRob3VnaCBhcHByb3ByaWF0ZSBmb3IgbW9zdFxuICAgICAgICAgICAgLy8gY29vcmRzQXRQb3MgcXVlcmllcywgd291bGQgYnJlYWsgc2VsZWN0aW9uIGRyYXdpbmcuXG4gICAgICAgICAgICBsZXQgZnJvbUNvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3MoZnJvbSwgKGZyb20gPT0gbGluZS50byA/IC0yIDogMikpO1xuICAgICAgICAgICAgbGV0IHRvQ29vcmRzID0gdmlldy5jb29yZHNBdFBvcyh0bywgKHRvID09IGxpbmUuZnJvbSA/IDIgOiAtMikpO1xuICAgICAgICAgICAgaWYgKCFmcm9tQ29vcmRzIHx8ICF0b0Nvb3JkcylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0b3AgPSBNYXRoLm1pbihmcm9tQ29vcmRzLnRvcCwgdG9Db29yZHMudG9wLCB0b3ApO1xuICAgICAgICAgICAgYm90dG9tID0gTWF0aC5tYXgoZnJvbUNvb3Jkcy5ib3R0b20sIHRvQ29vcmRzLmJvdHRvbSwgYm90dG9tKTtcbiAgICAgICAgICAgIGlmIChkaXIgPT0gRGlyZWN0aW9uLkxUUilcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsLnB1c2gobHRyICYmIGZyb21PcGVuID8gbGVmdFNpZGUgOiBmcm9tQ29vcmRzLmxlZnQsIGx0ciAmJiB0b09wZW4gPyByaWdodFNpZGUgOiB0b0Nvb3Jkcy5yaWdodCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5wdXNoKCFsdHIgJiYgdG9PcGVuID8gbGVmdFNpZGUgOiB0b0Nvb3Jkcy5sZWZ0LCAhbHRyICYmIGZyb21PcGVuID8gcmlnaHRTaWRlIDogZnJvbUNvb3Jkcy5yaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0ID0gZnJvbSAhPT0gbnVsbCAmJiBmcm9tICE9PSB2b2lkIDAgPyBmcm9tIDogbGluZS5mcm9tLCBlbmQgPSB0byAhPT0gbnVsbCAmJiB0byAhPT0gdm9pZCAwID8gdG8gOiBsaW5lLnRvO1xuICAgICAgICAvLyBTcGxpdCB0aGUgcmFuZ2UgYnkgdmlzaWJsZSByYW5nZSBhbmQgZG9jdW1lbnQgbGluZVxuICAgICAgICBmb3IgKGxldCByIG9mIHZpZXcudmlzaWJsZVJhbmdlcylcbiAgICAgICAgICAgIGlmIChyLnRvID4gc3RhcnQgJiYgci5mcm9tIDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcG9zID0gTWF0aC5tYXgoci5mcm9tLCBzdGFydCksIGVuZFBvcyA9IE1hdGgubWluKHIudG8sIGVuZCk7Oykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG9jTGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzcGFuIG9mIHZpZXcuYmlkaVNwYW5zKGRvY0xpbmUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BhbkZyb20gPSBzcGFuLmZyb20gKyBkb2NMaW5lLmZyb20sIHNwYW5UbyA9IHNwYW4udG8gKyBkb2NMaW5lLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkZyb20gPj0gZW5kUG9zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5UbyA+IHBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTcGFuKE1hdGgubWF4KHNwYW5Gcm9tLCBwb3MpLCBmcm9tID09IG51bGwgJiYgc3BhbkZyb20gPD0gc3RhcnQsIE1hdGgubWluKHNwYW5UbywgZW5kUG9zKSwgdG8gPT0gbnVsbCAmJiBzcGFuVG8gPj0gZW5kLCBzcGFuLmRpcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcG9zID0gZG9jTGluZS50byArIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gZW5kUG9zKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBpZiAoaG9yaXpvbnRhbC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIGFkZFNwYW4oc3RhcnQsIGZyb20gPT0gbnVsbCwgZW5kLCB0byA9PSBudWxsLCB2aWV3LnRleHREaXJlY3Rpb24pO1xuICAgICAgICByZXR1cm4geyB0b3AsIGJvdHRvbSwgaG9yaXpvbnRhbCB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBkcmF3Rm9yV2lkZ2V0KGJsb2NrLCB0b3ApIHtcbiAgICAgICAgbGV0IHkgPSBjb250ZW50UmVjdC50b3AgKyAodG9wID8gYmxvY2sudG9wIDogYmxvY2suYm90dG9tKTtcbiAgICAgICAgcmV0dXJuIHsgdG9wOiB5LCBib3R0b206IHksIGhvcml6b250YWw6IFtdIH07XG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZU1hcmtlcihhLCBiKSB7XG4gICAgcmV0dXJuIGEuY29uc3RydWN0b3IgPT0gYi5jb25zdHJ1Y3RvciAmJiBhLmVxKGIpO1xufVxuY2xhc3MgTGF5ZXJWaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBsYXllcikge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmxheWVyID0gbGF5ZXI7XG4gICAgICAgIHRoaXMuZHJhd24gPSBbXTtcbiAgICAgICAgdGhpcy5zY2FsZVggPSAxO1xuICAgICAgICB0aGlzLnNjYWxlWSA9IDE7XG4gICAgICAgIHRoaXMubWVhc3VyZVJlcSA9IHsgcmVhZDogdGhpcy5tZWFzdXJlLmJpbmQodGhpcyksIHdyaXRlOiB0aGlzLmRyYXcuYmluZCh0aGlzKSB9O1xuICAgICAgICB0aGlzLmRvbSA9IHZpZXcuc2Nyb2xsRE9NLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tbGF5ZXJcIik7XG4gICAgICAgIGlmIChsYXllci5hYm92ZSlcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1sYXllci1hYm92ZVwiKTtcbiAgICAgICAgaWYgKGxheWVyLmNsYXNzKVxuICAgICAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChsYXllci5jbGFzcyk7XG4gICAgICAgIHRoaXMuc2NhbGUoKTtcbiAgICAgICAgdGhpcy5kb20uc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgICB0aGlzLnNldE9yZGVyKHZpZXcuc3RhdGUpO1xuICAgICAgICB2aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgIGlmIChsYXllci5tb3VudClcbiAgICAgICAgICAgIGxheWVyLm1vdW50KHRoaXMuZG9tLCB2aWV3KTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQobGF5ZXJPcmRlcikgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KGxheWVyT3JkZXIpKVxuICAgICAgICAgICAgdGhpcy5zZXRPcmRlcih1cGRhdGUuc3RhdGUpO1xuICAgICAgICBpZiAodGhpcy5sYXllci51cGRhdGUodXBkYXRlLCB0aGlzLmRvbSkgfHwgdXBkYXRlLmdlb21ldHJ5Q2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5zY2FsZSgpO1xuICAgICAgICAgICAgdXBkYXRlLnZpZXcucmVxdWVzdE1lYXN1cmUodGhpcy5tZWFzdXJlUmVxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkb2NWaWV3VXBkYXRlKHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMubGF5ZXIudXBkYXRlT25Eb2NWaWV3VXBkYXRlICE9PSBmYWxzZSlcbiAgICAgICAgICAgIHZpZXcucmVxdWVzdE1lYXN1cmUodGhpcy5tZWFzdXJlUmVxKTtcbiAgICB9XG4gICAgc2V0T3JkZXIoc3RhdGUpIHtcbiAgICAgICAgbGV0IHBvcyA9IDAsIG9yZGVyID0gc3RhdGUuZmFjZXQobGF5ZXJPcmRlcik7XG4gICAgICAgIHdoaWxlIChwb3MgPCBvcmRlci5sZW5ndGggJiYgb3JkZXJbcG9zXSAhPSB0aGlzLmxheWVyKVxuICAgICAgICAgICAgcG9zKys7XG4gICAgICAgIHRoaXMuZG9tLnN0eWxlLnpJbmRleCA9IFN0cmluZygodGhpcy5sYXllci5hYm92ZSA/IDE1MCA6IC0xKSAtIHBvcyk7XG4gICAgfVxuICAgIG1lYXN1cmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheWVyLm1hcmtlcnModGhpcy52aWV3KTtcbiAgICB9XG4gICAgc2NhbGUoKSB7XG4gICAgICAgIGxldCB7IHNjYWxlWCwgc2NhbGVZIH0gPSB0aGlzLnZpZXc7XG4gICAgICAgIGlmIChzY2FsZVggIT0gdGhpcy5zY2FsZVggfHwgc2NhbGVZICE9IHRoaXMuc2NhbGVZKSB7XG4gICAgICAgICAgICB0aGlzLnNjYWxlWCA9IHNjYWxlWDtcbiAgICAgICAgICAgIHRoaXMuc2NhbGVZID0gc2NhbGVZO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MSAvIHNjYWxlWH0sICR7MSAvIHNjYWxlWX0pYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkcmF3KG1hcmtlcnMpIHtcbiAgICAgICAgaWYgKG1hcmtlcnMubGVuZ3RoICE9IHRoaXMuZHJhd24ubGVuZ3RoIHx8IG1hcmtlcnMuc29tZSgocCwgaSkgPT4gIXNhbWVNYXJrZXIocCwgdGhpcy5kcmF3bltpXSkpKSB7XG4gICAgICAgICAgICBsZXQgb2xkID0gdGhpcy5kb20uZmlyc3RDaGlsZCwgb2xkSSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBtYXJrZXIgb2YgbWFya2Vycykge1xuICAgICAgICAgICAgICAgIGlmIChtYXJrZXIudXBkYXRlICYmIG9sZCAmJiBtYXJrZXIuY29uc3RydWN0b3IgJiYgdGhpcy5kcmF3bltvbGRJXS5jb25zdHJ1Y3RvciAmJlxuICAgICAgICAgICAgICAgICAgICBtYXJrZXIudXBkYXRlKG9sZCwgdGhpcy5kcmF3bltvbGRJXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb2xkID0gb2xkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBvbGRJKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5pbnNlcnRCZWZvcmUobWFya2VyLmRyYXcoKSwgb2xkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAob2xkKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBvbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgb2xkLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIG9sZCA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRyYXduID0gbWFya2VycztcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5sYXllci5kZXN0cm95KVxuICAgICAgICAgICAgdGhpcy5sYXllci5kZXN0cm95KHRoaXMuZG9tLCB0aGlzLnZpZXcpO1xuICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICB9XG59XG5jb25zdCBsYXllck9yZGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5EZWZpbmUgYSBsYXllci5cbiovXG5mdW5jdGlvbiBsYXllcihjb25maWcpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBWaWV3UGx1Z2luLmRlZmluZSh2ID0+IG5ldyBMYXllclZpZXcodiwgY29uZmlnKSksXG4gICAgICAgIGxheWVyT3JkZXIub2YoY29uZmlnKVxuICAgIF07XG59XG5cbmNvbnN0IHNlbGVjdGlvbkNvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICByZXR1cm4gY29tYmluZUNvbmZpZyhjb25maWdzLCB7XG4gICAgICAgICAgICBjdXJzb3JCbGlua1JhdGU6IDEyMDAsXG4gICAgICAgICAgICBkcmF3UmFuZ2VDdXJzb3I6IHRydWVcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgY3Vyc29yQmxpbmtSYXRlOiAoYSwgYikgPT4gTWF0aC5taW4oYSwgYiksXG4gICAgICAgICAgICBkcmF3UmFuZ2VDdXJzb3I6IChhLCBiKSA9PiBhIHx8IGJcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgaGlkZXMgdGhlIGJyb3dzZXIncyBuYXRpdmUgc2VsZWN0aW9uIGFuZFxuY3Vyc29yLCByZXBsYWNpbmcgdGhlIHNlbGVjdGlvbiB3aXRoIGEgYmFja2dyb3VuZCBiZWhpbmQgdGhlIHRleHRcbih3aXRoIHRoZSBgY20tc2VsZWN0aW9uQmFja2dyb3VuZGAgY2xhc3MpLCBhbmQgdGhlXG5jdXJzb3JzIHdpdGggZWxlbWVudHMgb3ZlcmxhaWQgb3ZlciB0aGUgY29kZSAodXNpbmdcbmBjbS1jdXJzb3ItcHJpbWFyeWAgYW5kIGBjbS1jdXJzb3Itc2Vjb25kYXJ5YCkuXG5cblRoaXMgYWxsb3dzIHRoZSBlZGl0b3IgdG8gZGlzcGxheSBzZWNvbmRhcnkgc2VsZWN0aW9uIHJhbmdlcywgYW5kXG50ZW5kcyB0byBwcm9kdWNlIGEgdHlwZSBvZiBzZWxlY3Rpb24gbW9yZSBpbiBsaW5lIHdpdGggdGhhdCB1c2Vyc1xuZXhwZWN0IGluIGEgdGV4dCBlZGl0b3IgKHRoZSBuYXRpdmUgc2VsZWN0aW9uIHN0eWxpbmcgd2lsbCBvZnRlblxubGVhdmUgZ2FwcyBiZXR3ZWVuIGxpbmVzIGFuZCB3b24ndCBmaWxsIHRoZSBob3Jpem9udGFsIHNwYWNlIGFmdGVyXG5hIGxpbmUgd2hlbiB0aGUgc2VsZWN0aW9uIGNvbnRpbnVlcyBwYXN0IGl0KS5cblxuSXQgZG9lcyBoYXZlIGEgcGVyZm9ybWFuY2UgY29zdCwgaW4gdGhhdCBpdCByZXF1aXJlcyBhbiBleHRyYSBET01cbmxheW91dCBjeWNsZSBmb3IgbWFueSB1cGRhdGVzICh0aGUgc2VsZWN0aW9uIGlzIGRyYXduIGJhc2VkIG9uIERPTVxubGF5b3V0IGluZm9ybWF0aW9uIHRoYXQncyBvbmx5IGF2YWlsYWJsZSBhZnRlciBsYXlpbmcgb3V0IHRoZVxuY29udGVudCkuXG4qL1xuZnVuY3Rpb24gZHJhd1NlbGVjdGlvbihjb25maWcgPSB7fSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIHNlbGVjdGlvbkNvbmZpZy5vZihjb25maWcpLFxuICAgICAgICBjdXJzb3JMYXllcixcbiAgICAgICAgc2VsZWN0aW9uTGF5ZXIsXG4gICAgICAgIGhpZGVOYXRpdmVTZWxlY3Rpb24sXG4gICAgICAgIG5hdGl2ZVNlbGVjdGlvbkhpZGRlbi5vZih0cnVlKVxuICAgIF07XG59XG4vKipcblJldHJpZXZlIHRoZSBbYGRyYXdTZWxlY3Rpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuZHJhd1NlbGVjdGlvbikgY29uZmlndXJhdGlvblxuZm9yIHRoaXMgc3RhdGUuIChOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiBhIHNldCBvZiBkZWZhdWx0cyBldmVuXG5pZiBgZHJhd1NlbGVjdGlvbmAgaXNuJ3QgZW5hYmxlZC4pXG4qL1xuZnVuY3Rpb24gZ2V0RHJhd1NlbGVjdGlvbkNvbmZpZyhzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5mYWNldChzZWxlY3Rpb25Db25maWcpO1xufVxuZnVuY3Rpb24gY29uZmlnQ2hhbmdlZCh1cGRhdGUpIHtcbiAgICByZXR1cm4gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKTtcbn1cbmNvbnN0IGN1cnNvckxheWVyID0gLypAX19QVVJFX18qL2xheWVyKHtcbiAgICBhYm92ZTogdHJ1ZSxcbiAgICBtYXJrZXJzKHZpZXcpIHtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGNvbmYgPSBzdGF0ZS5mYWNldChzZWxlY3Rpb25Db25maWcpO1xuICAgICAgICBsZXQgY3Vyc29ycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByIG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBwcmltID0gciA9PSBzdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgICAgIGlmIChyLmVtcHR5IHx8IGNvbmYuZHJhd1JhbmdlQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHByaW0gPyBcImNtLWN1cnNvciBjbS1jdXJzb3ItcHJpbWFyeVwiIDogXCJjbS1jdXJzb3IgY20tY3Vyc29yLXNlY29uZGFyeVwiO1xuICAgICAgICAgICAgICAgIGxldCBjdXJzb3IgPSByLmVtcHR5ID8gciA6IEVkaXRvclNlbGVjdGlvbi5jdXJzb3Ioci5oZWFkLCByLmhlYWQgPiByLmFuY2hvciA/IC0xIDogMSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcGllY2Ugb2YgUmVjdGFuZ2xlTWFya2VyLmZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgY3Vyc29yKSlcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29ycy5wdXNoKHBpZWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3Vyc29ycztcbiAgICB9LFxuICAgIHVwZGF0ZSh1cGRhdGUsIGRvbSkge1xuICAgICAgICBpZiAodXBkYXRlLnRyYW5zYWN0aW9ucy5zb21lKHRyID0+IHRyLnNlbGVjdGlvbikpXG4gICAgICAgICAgICBkb20uc3R5bGUuYW5pbWF0aW9uTmFtZSA9IGRvbS5zdHlsZS5hbmltYXRpb25OYW1lID09IFwiY20tYmxpbmtcIiA/IFwiY20tYmxpbmsyXCIgOiBcImNtLWJsaW5rXCI7XG4gICAgICAgIGxldCBjb25mQ2hhbmdlID0gY29uZmlnQ2hhbmdlZCh1cGRhdGUpO1xuICAgICAgICBpZiAoY29uZkNoYW5nZSlcbiAgICAgICAgICAgIHNldEJsaW5rUmF0ZSh1cGRhdGUuc3RhdGUsIGRvbSk7XG4gICAgICAgIHJldHVybiB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuc2VsZWN0aW9uU2V0IHx8IGNvbmZDaGFuZ2U7XG4gICAgfSxcbiAgICBtb3VudChkb20sIHZpZXcpIHtcbiAgICAgICAgc2V0QmxpbmtSYXRlKHZpZXcuc3RhdGUsIGRvbSk7XG4gICAgfSxcbiAgICBjbGFzczogXCJjbS1jdXJzb3JMYXllclwiXG59KTtcbmZ1bmN0aW9uIHNldEJsaW5rUmF0ZShzdGF0ZSwgZG9tKSB7XG4gICAgZG9tLnN0eWxlLmFuaW1hdGlvbkR1cmF0aW9uID0gc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKS5jdXJzb3JCbGlua1JhdGUgKyBcIm1zXCI7XG59XG5jb25zdCBzZWxlY3Rpb25MYXllciA9IC8qQF9fUFVSRV9fKi9sYXllcih7XG4gICAgYWJvdmU6IGZhbHNlLFxuICAgIG1hcmtlcnModmlldykge1xuICAgICAgICByZXR1cm4gdmlldy5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLm1hcChyID0+IHIuZW1wdHkgPyBbXSA6IFJlY3RhbmdsZU1hcmtlci5mb3JSYW5nZSh2aWV3LCBcImNtLXNlbGVjdGlvbkJhY2tncm91bmRcIiwgcikpXG4gICAgICAgICAgICAucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSk7XG4gICAgfSxcbiAgICB1cGRhdGUodXBkYXRlLCBkb20pIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5zZWxlY3Rpb25TZXQgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fCBjb25maWdDaGFuZ2VkKHVwZGF0ZSk7XG4gICAgfSxcbiAgICBjbGFzczogXCJjbS1zZWxlY3Rpb25MYXllclwiXG59KTtcbmNvbnN0IGhpZGVOYXRpdmVTZWxlY3Rpb24gPSAvKkBfX1BVUkVfXyovUHJlYy5oaWdoZXN0KC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LnRoZW1lKHtcbiAgICBcIi5jbS1saW5lXCI6IHtcbiAgICAgICAgXCImIDo6c2VsZWN0aW9uLCAmOjpzZWxlY3Rpb25cIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwidHJhbnNwYXJlbnQgIWltcG9ydGFudFwiIH0sXG4gICAgICAgIGNhcmV0Q29sb3I6IFwidHJhbnNwYXJlbnQgIWltcG9ydGFudFwiXG4gICAgfSxcbiAgICBcIi5jbS1jb250ZW50XCI6IHtcbiAgICAgICAgY2FyZXRDb2xvcjogXCJ0cmFuc3BhcmVudCAhaW1wb3J0YW50XCIsXG4gICAgICAgIFwiJiA6Zm9jdXNcIjoge1xuICAgICAgICAgICAgY2FyZXRDb2xvcjogXCJpbml0aWFsICFpbXBvcnRhbnRcIixcbiAgICAgICAgICAgIFwiJjo6c2VsZWN0aW9uLCAmIDo6c2VsZWN0aW9uXCI6IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiSGlnaGxpZ2h0ICFpbXBvcnRhbnRcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSkpO1xuXG5jb25zdCBzZXREcm9wQ3Vyc29yUG9zID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSh7XG4gICAgbWFwKHBvcywgbWFwcGluZykgeyByZXR1cm4gcG9zID09IG51bGwgPyBudWxsIDogbWFwcGluZy5tYXBQb3MocG9zKTsgfVxufSk7XG5jb25zdCBkcm9wQ3Vyc29yUG9zID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGUoKSB7IHJldHVybiBudWxsOyB9LFxuICAgIHVwZGF0ZShwb3MsIHRyKSB7XG4gICAgICAgIGlmIChwb3MgIT0gbnVsbClcbiAgICAgICAgICAgIHBvcyA9IHRyLmNoYW5nZXMubWFwUG9zKHBvcyk7XG4gICAgICAgIHJldHVybiB0ci5lZmZlY3RzLnJlZHVjZSgocG9zLCBlKSA9PiBlLmlzKHNldERyb3BDdXJzb3JQb3MpID8gZS52YWx1ZSA6IHBvcywgcG9zKTtcbiAgICB9XG59KTtcbmNvbnN0IGRyYXdEcm9wQ3Vyc29yID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZWFzdXJlUmVxID0geyByZWFkOiB0aGlzLnJlYWRQb3MuYmluZCh0aGlzKSwgd3JpdGU6IHRoaXMuZHJhd0N1cnNvci5iaW5kKHRoaXMpIH07XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY3Vyc29yUG9zID0gdXBkYXRlLnN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpO1xuICAgICAgICBpZiAoY3Vyc29yUG9zID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnNvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgKF9hID0gdGhpcy5jdXJzb3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IgPSB0aGlzLnZpZXcuc2Nyb2xsRE9NLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLmNsYXNzTmFtZSA9IFwiY20tZHJvcEN1cnNvclwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpICE9IGN1cnNvclBvcyB8fCB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuZ2VvbWV0cnlDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSh0aGlzLm1lYXN1cmVSZXEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlYWRQb3MoKSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXM7XG4gICAgICAgIGxldCBwb3MgPSB2aWV3LnN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpO1xuICAgICAgICBsZXQgcmVjdCA9IHBvcyAhPSBudWxsICYmIHZpZXcuY29vcmRzQXRQb3MocG9zKTtcbiAgICAgICAgaWYgKCFyZWN0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBvdXRlciA9IHZpZXcuc2Nyb2xsRE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0IC0gb3V0ZXIubGVmdCArIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQgKiB2aWV3LnNjYWxlWCxcbiAgICAgICAgICAgIHRvcDogcmVjdC50b3AgLSBvdXRlci50b3AgKyB2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3AgKiB2aWV3LnNjYWxlWSxcbiAgICAgICAgICAgIGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuICAgICAgICB9O1xuICAgIH1cbiAgICBkcmF3Q3Vyc29yKHBvcykge1xuICAgICAgICBpZiAodGhpcy5jdXJzb3IpIHtcbiAgICAgICAgICAgIGxldCB7IHNjYWxlWCwgc2NhbGVZIH0gPSB0aGlzLnZpZXc7XG4gICAgICAgICAgICBpZiAocG9zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUubGVmdCA9IHBvcy5sZWZ0IC8gc2NhbGVYICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLnRvcCA9IHBvcy50b3AgLyBzY2FsZVkgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUuaGVpZ2h0ID0gcG9zLmhlaWdodCAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLmxlZnQgPSBcIi0xMDAwMDBweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnNvcilcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yLnJlbW92ZSgpO1xuICAgIH1cbiAgICBzZXREcm9wUG9zKHBvcykge1xuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpICE9IHBvcylcbiAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHNldERyb3BDdXJzb3JQb3Mub2YocG9zKSB9KTtcbiAgICB9XG59LCB7XG4gICAgZXZlbnRPYnNlcnZlcnM6IHtcbiAgICAgICAgZHJhZ292ZXIoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RHJvcFBvcyh0aGlzLnZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2xlYXZlKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09IHRoaXMudmlldy5jb250ZW50RE9NIHx8ICF0aGlzLnZpZXcuY29udGVudERPTS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldERyb3BQb3MobnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRyYWdlbmQoKSB7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BQb3MobnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRyb3AoKSB7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BQb3MobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbi8qKlxuRHJhd3MgYSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgZHJvcCBwb3NpdGlvbiB3aGVuIHNvbWV0aGluZyBpc1xuZHJhZ2dlZCBvdmVyIHRoZSBlZGl0b3IuXG4qL1xuZnVuY3Rpb24gZHJvcEN1cnNvcigpIHtcbiAgICByZXR1cm4gW2Ryb3BDdXJzb3JQb3MsIGRyYXdEcm9wQ3Vyc29yXTtcbn1cblxuZnVuY3Rpb24gaXRlck1hdGNoZXMoZG9jLCByZSwgZnJvbSwgdG8sIGYpIHtcbiAgICByZS5sYXN0SW5kZXggPSAwO1xuICAgIGZvciAobGV0IGN1cnNvciA9IGRvYy5pdGVyUmFuZ2UoZnJvbSwgdG8pLCBwb3MgPSBmcm9tLCBtOyAhY3Vyc29yLm5leHQoKS5kb25lOyBwb3MgKz0gY3Vyc29yLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICBpZiAoIWN1cnNvci5saW5lQnJlYWspXG4gICAgICAgICAgICB3aGlsZSAobSA9IHJlLmV4ZWMoY3Vyc29yLnZhbHVlKSlcbiAgICAgICAgICAgICAgICBmKHBvcyArIG0uaW5kZXgsIG0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1hdGNoUmFuZ2VzKHZpZXcsIG1heExlbmd0aCkge1xuICAgIGxldCB2aXNpYmxlID0gdmlldy52aXNpYmxlUmFuZ2VzO1xuICAgIGlmICh2aXNpYmxlLmxlbmd0aCA9PSAxICYmIHZpc2libGVbMF0uZnJvbSA9PSB2aWV3LnZpZXdwb3J0LmZyb20gJiZcbiAgICAgICAgdmlzaWJsZVswXS50byA9PSB2aWV3LnZpZXdwb3J0LnRvKVxuICAgICAgICByZXR1cm4gdmlzaWJsZTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHZpc2libGUpIHtcbiAgICAgICAgZnJvbSA9IE1hdGgubWF4KHZpZXcuc3RhdGUuZG9jLmxpbmVBdChmcm9tKS5mcm9tLCBmcm9tIC0gbWF4TGVuZ3RoKTtcbiAgICAgICAgdG8gPSBNYXRoLm1pbih2aWV3LnN0YXRlLmRvYy5saW5lQXQodG8pLnRvLCB0byArIG1heExlbmd0aCk7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICYmIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0udG8gPj0gZnJvbSlcbiAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0udG8gPSB0bztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuSGVscGVyIGNsYXNzIHVzZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gbWFpbnRhaW4gZGVjb3JhdGlvbnMgb25cbnZpc2libGUgY29kZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uIFRvIGJlIHVzZWRcbmluIGEgW3ZpZXcgcGx1Z2luXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuVmlld1BsdWdpbikuIEluc3RhbmNlcyBvZiB0aGlzIG9iamVjdFxucmVwcmVzZW50IGEgbWF0Y2hpbmcgY29uZmlndXJhdGlvbi5cbiovXG5jbGFzcyBNYXRjaERlY29yYXRvciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgZGVjb3JhdG9yLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHsgcmVnZXhwLCBkZWNvcmF0aW9uLCBkZWNvcmF0ZSwgYm91bmRhcnksIG1heExlbmd0aCA9IDEwMDAgfSA9IGNvbmZpZztcbiAgICAgICAgaWYgKCFyZWdleHAuZ2xvYmFsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgcmVndWxhciBleHByZXNzaW9uIGdpdmVuIHRvIE1hdGNoRGVjb3JhdG9yIHNob3VsZCBoYXZlIGl0cyAnZycgZmxhZyBzZXRcIik7XG4gICAgICAgIHRoaXMucmVnZXhwID0gcmVnZXhwO1xuICAgICAgICBpZiAoZGVjb3JhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2ggPSAobWF0Y2gsIHZpZXcsIGZyb20sIGFkZCkgPT4gZGVjb3JhdGUoYWRkLCBmcm9tLCBmcm9tICsgbWF0Y2hbMF0ubGVuZ3RoLCBtYXRjaCwgdmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlY29yYXRpb24gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE1hdGNoID0gKG1hdGNoLCB2aWV3LCBmcm9tLCBhZGQpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZGVjbyA9IGRlY29yYXRpb24obWF0Y2gsIHZpZXcsIGZyb20pO1xuICAgICAgICAgICAgICAgIGlmIChkZWNvKVxuICAgICAgICAgICAgICAgICAgICBhZGQoZnJvbSwgZnJvbSArIG1hdGNoWzBdLmxlbmd0aCwgZGVjbyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlY29yYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2ggPSAobWF0Y2gsIF92aWV3LCBmcm9tLCBhZGQpID0+IGFkZChmcm9tLCBmcm9tICsgbWF0Y2hbMF0ubGVuZ3RoLCBkZWNvcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRWl0aGVyICdkZWNvcmF0ZScgb3IgJ2RlY29yYXRpb24nIHNob3VsZCBiZSBwcm92aWRlZCB0byBNYXRjaERlY29yYXRvclwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJvdW5kYXJ5ID0gYm91bmRhcnk7XG4gICAgICAgIHRoaXMubWF4TGVuZ3RoID0gbWF4TGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wdXRlIHRoZSBmdWxsIHNldCBvZiBkZWNvcmF0aW9ucyBmb3IgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW5cbiAgICB2aWV3J3Mgdmlld3BvcnQuIFlvdSdsbCB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIGluaXRpYWxpemluZyB5b3VyXG4gICAgcGx1Z2luLlxuICAgICovXG4gICAgY3JlYXRlRGVjbyh2aWV3KSB7XG4gICAgICAgIGxldCBidWlsZCA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKSwgYWRkID0gYnVpbGQuYWRkLmJpbmQoYnVpbGQpO1xuICAgICAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2YgbWF0Y2hSYW5nZXModmlldywgdGhpcy5tYXhMZW5ndGgpKVxuICAgICAgICAgICAgaXRlck1hdGNoZXModmlldy5zdGF0ZS5kb2MsIHRoaXMucmVnZXhwLCBmcm9tLCB0bywgKGZyb20sIG0pID0+IHRoaXMuYWRkTWF0Y2gobSwgdmlldywgZnJvbSwgYWRkKSk7XG4gICAgICAgIHJldHVybiBidWlsZC5maW5pc2goKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIGEgc2V0IG9mIGRlY29yYXRpb25zIGZvciBhIHZpZXcgdXBkYXRlLiBgZGVjb2AgX211c3RfIGJlXG4gICAgdGhlIHNldCBvZiBkZWNvcmF0aW9ucyBwcm9kdWNlZCBieSBfdGhpc18gYE1hdGNoRGVjb3JhdG9yYCBmb3JcbiAgICB0aGUgdmlldyBzdGF0ZSBiZWZvcmUgdGhlIHVwZGF0ZS5cbiAgICAqL1xuICAgIHVwZGF0ZURlY28odXBkYXRlLCBkZWNvKSB7XG4gICAgICAgIGxldCBjaGFuZ2VGcm9tID0gMWU5LCBjaGFuZ2VUbyA9IC0xO1xuICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQpXG4gICAgICAgICAgICB1cGRhdGUuY2hhbmdlcy5pdGVyQ2hhbmdlcygoX2YsIF90LCBmcm9tLCB0bykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0byA+PSB1cGRhdGUudmlldy52aWV3cG9ydC5mcm9tICYmIGZyb20gPD0gdXBkYXRlLnZpZXcudmlld3BvcnQudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRnJvbSA9IE1hdGgubWluKGZyb20sIGNoYW5nZUZyb20pO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VUbyA9IE1hdGgubWF4KHRvLCBjaGFuZ2VUbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmICh1cGRhdGUudmlld3BvcnRNb3ZlZCB8fCBjaGFuZ2VUbyAtIGNoYW5nZUZyb20gPiAxMDAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRGVjbyh1cGRhdGUudmlldyk7XG4gICAgICAgIGlmIChjaGFuZ2VUbyA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUmFuZ2UodXBkYXRlLnZpZXcsIGRlY28ubWFwKHVwZGF0ZS5jaGFuZ2VzKSwgY2hhbmdlRnJvbSwgY2hhbmdlVG8pO1xuICAgICAgICByZXR1cm4gZGVjbztcbiAgICB9XG4gICAgdXBkYXRlUmFuZ2UodmlldywgZGVjbywgdXBkYXRlRnJvbSwgdXBkYXRlVG8pIHtcbiAgICAgICAgZm9yIChsZXQgciBvZiB2aWV3LnZpc2libGVSYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gTWF0aC5tYXgoci5mcm9tLCB1cGRhdGVGcm9tKSwgdG8gPSBNYXRoLm1pbihyLnRvLCB1cGRhdGVUbyk7XG4gICAgICAgICAgICBpZiAodG8gPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb21MaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KGZyb20pLCB0b0xpbmUgPSBmcm9tTGluZS50byA8IHRvID8gdmlldy5zdGF0ZS5kb2MubGluZUF0KHRvKSA6IGZyb21MaW5lO1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IE1hdGgubWF4KHIuZnJvbSwgZnJvbUxpbmUuZnJvbSksIGVuZCA9IE1hdGgubWluKHIudG8sIHRvTGluZS50byk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYm91bmRhcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICg7IGZyb20gPiBmcm9tTGluZS5mcm9tOyBmcm9tLS0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ib3VuZGFyeS50ZXN0KGZyb21MaW5lLnRleHRbZnJvbSAtIDEgLSBmcm9tTGluZS5mcm9tXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyB0byA8IHRvTGluZS50bzsgdG8rKylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJvdW5kYXJ5LnRlc3QodG9MaW5lLnRleHRbdG8gLSB0b0xpbmUuZnJvbV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gdG87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByYW5nZXMgPSBbXSwgbTtcbiAgICAgICAgICAgICAgICBsZXQgYWRkID0gKGZyb20sIHRvLCBkZWNvKSA9PiByYW5nZXMucHVzaChkZWNvLnJhbmdlKGZyb20sIHRvKSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb21MaW5lID09IHRvTGluZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2V4cC5sYXN0SW5kZXggPSBzdGFydCAtIGZyb21MaW5lLmZyb207XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgobSA9IHRoaXMucmVnZXhwLmV4ZWMoZnJvbUxpbmUudGV4dCkpICYmIG0uaW5kZXggPCBlbmQgLSBmcm9tTGluZS5mcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNYXRjaChtLCB2aWV3LCBtLmluZGV4ICsgZnJvbUxpbmUuZnJvbSwgYWRkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZXJNYXRjaGVzKHZpZXcuc3RhdGUuZG9jLCB0aGlzLnJlZ2V4cCwgc3RhcnQsIGVuZCwgKGZyb20sIG0pID0+IHRoaXMuYWRkTWF0Y2gobSwgdmlldywgZnJvbSwgYWRkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlY28gPSBkZWNvLnVwZGF0ZSh7IGZpbHRlckZyb206IHN0YXJ0LCBmaWx0ZXJUbzogZW5kLCBmaWx0ZXI6IChmcm9tLCB0bykgPT4gZnJvbSA8IHN0YXJ0IHx8IHRvID4gZW5kLCBhZGQ6IHJhbmdlcyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVjbztcbiAgICB9XG59XG5cbmNvbnN0IFVuaWNvZGVSZWdleHBTdXBwb3J0ID0gL3gvLnVuaWNvZGUgIT0gbnVsbCA/IFwiZ3VcIiA6IFwiZ1wiO1xuY29uc3QgU3BlY2lhbHMgPSAvKkBfX1BVUkVfXyovbmV3IFJlZ0V4cChcIltcXHUwMDAwLVxcdTAwMDhcXHUwMDBhLVxcdTAwMWZcXHUwMDdmLVxcdTAwOWZcXHUwMGFkXFx1MDYxY1xcdTIwMGJcXHUyMDBlXFx1MjAwZlxcdTIwMjhcXHUyMDI5XFx1MjAyZFxcdTIwMmVcXHUyMDY2XFx1MjA2N1xcdTIwNjlcXHVmZWZmXFx1ZmZmOS1cXHVmZmZjXVwiLCBVbmljb2RlUmVnZXhwU3VwcG9ydCk7XG5jb25zdCBOYW1lcyA9IHtcbiAgICAwOiBcIm51bGxcIixcbiAgICA3OiBcImJlbGxcIixcbiAgICA4OiBcImJhY2tzcGFjZVwiLFxuICAgIDEwOiBcIm5ld2xpbmVcIixcbiAgICAxMTogXCJ2ZXJ0aWNhbCB0YWJcIixcbiAgICAxMzogXCJjYXJyaWFnZSByZXR1cm5cIixcbiAgICAyNzogXCJlc2NhcGVcIixcbiAgICA4MjAzOiBcInplcm8gd2lkdGggc3BhY2VcIixcbiAgICA4MjA0OiBcInplcm8gd2lkdGggbm9uLWpvaW5lclwiLFxuICAgIDgyMDU6IFwiemVybyB3aWR0aCBqb2luZXJcIixcbiAgICA4MjA2OiBcImxlZnQtdG8tcmlnaHQgbWFya1wiLFxuICAgIDgyMDc6IFwicmlnaHQtdG8tbGVmdCBtYXJrXCIsXG4gICAgODIzMjogXCJsaW5lIHNlcGFyYXRvclwiLFxuICAgIDgyMzc6IFwibGVmdC10by1yaWdodCBvdmVycmlkZVwiLFxuICAgIDgyMzg6IFwicmlnaHQtdG8tbGVmdCBvdmVycmlkZVwiLFxuICAgIDgyOTQ6IFwibGVmdC10by1yaWdodCBpc29sYXRlXCIsXG4gICAgODI5NTogXCJyaWdodC10by1sZWZ0IGlzb2xhdGVcIixcbiAgICA4Mjk3OiBcInBvcCBkaXJlY3Rpb25hbCBpc29sYXRlXCIsXG4gICAgODIzMzogXCJwYXJhZ3JhcGggc2VwYXJhdG9yXCIsXG4gICAgNjUyNzk6IFwiemVybyB3aWR0aCBuby1icmVhayBzcGFjZVwiLFxuICAgIDY1NTMyOiBcIm9iamVjdCByZXBsYWNlbWVudFwiXG59O1xubGV0IF9zdXBwb3J0c1RhYlNpemUgPSBudWxsO1xuZnVuY3Rpb24gc3VwcG9ydHNUYWJTaXplKCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoX3N1cHBvcnRzVGFiU2l6ZSA9PSBudWxsICYmIHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgbGV0IHN0eWxlcyA9IGRvY3VtZW50LmJvZHkuc3R5bGU7XG4gICAgICAgIF9zdXBwb3J0c1RhYlNpemUgPSAoKF9hID0gc3R5bGVzLnRhYlNpemUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHN0eWxlcy5Nb3pUYWJTaXplKSAhPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gX3N1cHBvcnRzVGFiU2l6ZSB8fCBmYWxzZTtcbn1cbmNvbnN0IHNwZWNpYWxDaGFyQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZShjb25maWdzKSB7XG4gICAgICAgIGxldCBjb25maWcgPSBjb21iaW5lQ29uZmlnKGNvbmZpZ3MsIHtcbiAgICAgICAgICAgIHJlbmRlcjogbnVsbCxcbiAgICAgICAgICAgIHNwZWNpYWxDaGFyczogU3BlY2lhbHMsXG4gICAgICAgICAgICBhZGRTcGVjaWFsQ2hhcnM6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb25maWcucmVwbGFjZVRhYnMgPSAhc3VwcG9ydHNUYWJTaXplKCkpXG4gICAgICAgICAgICBjb25maWcuc3BlY2lhbENoYXJzID0gbmV3IFJlZ0V4cChcIlxcdHxcIiArIGNvbmZpZy5zcGVjaWFsQ2hhcnMuc291cmNlLCBVbmljb2RlUmVnZXhwU3VwcG9ydCk7XG4gICAgICAgIGlmIChjb25maWcuYWRkU3BlY2lhbENoYXJzKVxuICAgICAgICAgICAgY29uZmlnLnNwZWNpYWxDaGFycyA9IG5ldyBSZWdFeHAoY29uZmlnLnNwZWNpYWxDaGFycy5zb3VyY2UgKyBcInxcIiArIGNvbmZpZy5hZGRTcGVjaWFsQ2hhcnMuc291cmNlLCBVbmljb2RlUmVnZXhwU3VwcG9ydCk7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgaW5zdGFsbHMgaGlnaGxpZ2h0aW5nIG9mIHNwZWNpYWxcbmNoYXJhY3RlcnMuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0U3BlY2lhbENoYXJzKFxuLyoqXG5Db25maWd1cmF0aW9uIG9wdGlvbnMuXG4qL1xuY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW3NwZWNpYWxDaGFyQ29uZmlnLm9mKGNvbmZpZyksIHNwZWNpYWxDaGFyUGx1Z2luKCldO1xufVxubGV0IF9wbHVnaW4gPSBudWxsO1xuZnVuY3Rpb24gc3BlY2lhbENoYXJQbHVnaW4oKSB7XG4gICAgcmV0dXJuIF9wbHVnaW4gfHwgKF9wbHVnaW4gPSBWaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9uQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0b3IgPSB0aGlzLm1ha2VEZWNvcmF0b3Iodmlldy5zdGF0ZS5mYWNldChzcGVjaWFsQ2hhckNvbmZpZykpO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZGVjb3JhdG9yLmNyZWF0ZURlY28odmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgbWFrZURlY29yYXRvcihjb25mKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1hdGNoRGVjb3JhdG9yKHtcbiAgICAgICAgICAgICAgICByZWdleHA6IGNvbmYuc3BlY2lhbENoYXJzLFxuICAgICAgICAgICAgICAgIGRlY29yYXRpb246IChtLCB2aWV3LCBwb3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgZG9jIH0gPSB2aWV3LnN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29kZSA9IGNvZGVQb2ludEF0KG1bMF0sIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSA5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZSA9IGRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gdmlldy5zdGF0ZS50YWJTaXplLCBjb2wgPSBjb3VudENvbHVtbihsaW5lLnRleHQsIHNpemUsIHBvcyAtIGxpbmUuZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5yZXBsYWNlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQ6IG5ldyBUYWJXaWRnZXQoKHNpemUgLSAoY29sICUgc2l6ZSkpICogdGhpcy52aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCAvIHRoaXMudmlldy5zY2FsZVgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNvcmF0aW9uQ2FjaGVbY29kZV0gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmRlY29yYXRpb25DYWNoZVtjb2RlXSA9IERlY29yYXRpb24ucmVwbGFjZSh7IHdpZGdldDogbmV3IFNwZWNpYWxDaGFyV2lkZ2V0KGNvbmYsIGNvZGUpIH0pKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvdW5kYXJ5OiBjb25mLnJlcGxhY2VUYWJzID8gdW5kZWZpbmVkIDogL1teXS9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgICAgIGxldCBjb25mID0gdXBkYXRlLnN0YXRlLmZhY2V0KHNwZWNpYWxDaGFyQ29uZmlnKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChzcGVjaWFsQ2hhckNvbmZpZykgIT0gY29uZikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdG9yID0gdGhpcy5tYWtlRGVjb3JhdG9yKGNvbmYpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRvci5jcmVhdGVEZWNvKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRvci51cGRhdGVEZWNvKHVwZGF0ZSwgdGhpcy5kZWNvcmF0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnNcbiAgICB9KSk7XG59XG5jb25zdCBEZWZhdWx0UGxhY2Vob2xkZXIgPSBcIlxcdTIwMjJcIjtcbi8vIEFzc2lnbnMgcGxhY2Vob2xkZXIgY2hhcmFjdGVycyBmcm9tIHRoZSBDb250cm9sIFBpY3R1cmVzIGJsb2NrIHRvXG4vLyBBU0NJSSBjb250cm9sIGNoYXJhY3RlcnNcbmZ1bmN0aW9uIHBsYWNlaG9sZGVyJDEoY29kZSkge1xuICAgIGlmIChjb2RlID49IDMyKVxuICAgICAgICByZXR1cm4gRGVmYXVsdFBsYWNlaG9sZGVyO1xuICAgIGlmIChjb2RlID09IDEwKVxuICAgICAgICByZXR1cm4gXCJcXHUyNDI0XCI7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoOTIxNiArIGNvZGUpO1xufVxuY2xhc3MgU3BlY2lhbENoYXJXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb2RlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci5jb2RlID09IHRoaXMuY29kZTsgfVxuICAgIHRvRE9NKHZpZXcpIHtcbiAgICAgICAgbGV0IHBoID0gcGxhY2Vob2xkZXIkMSh0aGlzLmNvZGUpO1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuc3RhdGUucGhyYXNlKFwiQ29udHJvbCBjaGFyYWN0ZXJcIikgKyBcIiBcIiArIChOYW1lc1t0aGlzLmNvZGVdIHx8IFwiMHhcIiArIHRoaXMuY29kZS50b1N0cmluZygxNikpO1xuICAgICAgICBsZXQgY3VzdG9tID0gdGhpcy5vcHRpb25zLnJlbmRlciAmJiB0aGlzLm9wdGlvbnMucmVuZGVyKHRoaXMuY29kZSwgZGVzYywgcGgpO1xuICAgICAgICBpZiAoY3VzdG9tKVxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbTtcbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHBoO1xuICAgICAgICBzcGFuLnRpdGxlID0gZGVzYztcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIGRlc2MpO1xuICAgICAgICBzcGFuLmNsYXNzTmFtZSA9IFwiY20tc3BlY2lhbENoYXJcIjtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfVxuICAgIGlnbm9yZUV2ZW50KCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbmNsYXNzIFRhYldpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHdpZHRoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIG90aGVyLndpZHRoID09IHRoaXMud2lkdGg7IH1cbiAgICB0b0RPTSgpIHtcbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IFwiXFx0XCI7XG4gICAgICAgIHNwYW4uY2xhc3NOYW1lID0gXCJjbS10YWJcIjtcbiAgICAgICAgc3Bhbi5zdHlsZS53aWR0aCA9IHRoaXMud2lkdGggKyBcInB4XCI7XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH1cbiAgICBpZ25vcmVFdmVudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5cbmNvbnN0IHBsdWdpbiA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMTAwMDtcbiAgICAgICAgdGhpcy5hdHRycyA9IHsgc3R5bGU6IFwicGFkZGluZy1ib3R0b206IDEwMDBweFwiIH07XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdXBkYXRlO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gdmlldy52aWV3U3RhdGUuZWRpdG9ySGVpZ2h0IC1cbiAgICAgICAgICAgIHZpZXcuZGVmYXVsdExpbmVIZWlnaHQgLSB2aWV3LmRvY3VtZW50UGFkZGluZy50b3AgLSAwLjU7XG4gICAgICAgIGlmIChoZWlnaHQgPj0gMCAmJiBoZWlnaHQgIT0gdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5hdHRycyA9IHsgc3R5bGU6IGBwYWRkaW5nLWJvdHRvbTogJHtoZWlnaHR9cHhgIH07XG4gICAgICAgIH1cbiAgICB9XG59KTtcbi8qKlxuUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBtYWtlcyBzdXJlIHRoZSBjb250ZW50IGhhcyBhIGJvdHRvbVxubWFyZ2luIGVxdWl2YWxlbnQgdG8gdGhlIGhlaWdodCBvZiB0aGUgZWRpdG9yLCBtaW51cyBvbmUgbGluZVxuaGVpZ2h0LCBzbyB0aGF0IGV2ZXJ5IGxpbmUgaW4gdGhlIGRvY3VtZW50IGNhbiBiZSBzY3JvbGxlZCB0byB0aGVcbnRvcCBvZiB0aGUgZWRpdG9yLlxuXG5UaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIHRoZSBlZGl0b3IgaXMgc2Nyb2xsYWJsZSwgYW5kIHNob3VsZFxubm90IGJlIGVuYWJsZWQgaW4gZWRpdG9ycyB0aGF0IHRha2UgdGhlIHNpemUgb2YgdGhlaXIgY29udGVudC5cbiovXG5mdW5jdGlvbiBzY3JvbGxQYXN0RW5kKCkge1xuICAgIHJldHVybiBbcGx1Z2luLCBjb250ZW50QXR0cmlidXRlcy5vZih2aWV3ID0+IHsgdmFyIF9hOyByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKHBsdWdpbikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hdHRycykgfHwgbnVsbDsgfSldO1xufVxuXG4vKipcbk1hcmsgbGluZXMgdGhhdCBoYXZlIGEgY3Vyc29yIG9uIHRoZW0gd2l0aCB0aGUgYFwiY20tYWN0aXZlTGluZVwiYFxuRE9NIGNsYXNzLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodEFjdGl2ZUxpbmUoKSB7XG4gICAgcmV0dXJuIGFjdGl2ZUxpbmVIaWdobGlnaHRlcjtcbn1cbmNvbnN0IGxpbmVEZWNvID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ubGluZSh7IGNsYXNzOiBcImNtLWFjdGl2ZUxpbmVcIiB9KTtcbmNvbnN0IGFjdGl2ZUxpbmVIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5nZXREZWNvKHZpZXcpO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuc2VsZWN0aW9uU2V0KVxuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZ2V0RGVjbyh1cGRhdGUudmlldyk7XG4gICAgfVxuICAgIGdldERlY28odmlldykge1xuICAgICAgICBsZXQgbGFzdExpbmVTdGFydCA9IC0xLCBkZWNvID0gW107XG4gICAgICAgIGZvciAobGV0IHIgb2Ygdmlldy5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXQoci5oZWFkKTtcbiAgICAgICAgICAgIGlmIChsaW5lLmZyb20gPiBsYXN0TGluZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgZGVjby5wdXNoKGxpbmVEZWNvLnJhbmdlKGxpbmUuZnJvbSkpO1xuICAgICAgICAgICAgICAgIGxhc3RMaW5lU3RhcnQgPSBsaW5lLmZyb207XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERlY29yYXRpb24uc2V0KGRlY28pO1xuICAgIH1cbn0sIHtcbiAgICBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zXG59KTtcblxuY2xhc3MgUGxhY2Vob2xkZXIgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgfVxuICAgIHRvRE9NKHZpZXcpIHtcbiAgICAgICAgbGV0IHdyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgd3JhcC5jbGFzc05hbWUgPSBcImNtLXBsYWNlaG9sZGVyXCI7XG4gICAgICAgIHdyYXAuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xuICAgICAgICB3cmFwLmFwcGVuZENoaWxkKHR5cGVvZiB0aGlzLmNvbnRlbnQgPT0gXCJzdHJpbmdcIiA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuY29udGVudCkgOlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuY29udGVudCA9PSBcImZ1bmN0aW9uXCIgPyB0aGlzLmNvbnRlbnQodmlldykgOlxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgICAgICB3cmFwLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHdyYXA7XG4gICAgfVxuICAgIGNvb3Jkc0F0KGRvbSkge1xuICAgICAgICBsZXQgcmVjdHMgPSBkb20uZmlyc3RDaGlsZCA/IGNsaWVudFJlY3RzRm9yKGRvbS5maXJzdENoaWxkKSA6IFtdO1xuICAgICAgICBpZiAoIXJlY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb20ucGFyZW50Tm9kZSk7XG4gICAgICAgIGxldCByZWN0ID0gZmxhdHRlblJlY3QocmVjdHNbMF0sIHN0eWxlLmRpcmVjdGlvbiAhPSBcInJ0bFwiKTtcbiAgICAgICAgbGV0IGxpbmVIZWlnaHQgPSBwYXJzZUludChzdHlsZS5saW5lSGVpZ2h0KTtcbiAgICAgICAgaWYgKHJlY3QuYm90dG9tIC0gcmVjdC50b3AgPiBsaW5lSGVpZ2h0ICogMS41KVxuICAgICAgICAgICAgcmV0dXJuIHsgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5yaWdodCwgdG9wOiByZWN0LnRvcCwgYm90dG9tOiByZWN0LnRvcCArIGxpbmVIZWlnaHQgfTtcbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgfVxuICAgIGlnbm9yZUV2ZW50KCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbi8qKlxuRXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyBhIHBsYWNlaG9sZGVyXHUyMDE0YSBwaWVjZSBvZiBleGFtcGxlIGNvbnRlbnRcbnRvIHNob3cgd2hlbiB0aGUgZWRpdG9yIGlzIGVtcHR5LlxuKi9cbmZ1bmN0aW9uIHBsYWNlaG9sZGVyKGNvbnRlbnQpIHtcbiAgICBsZXQgcGx1Z2luID0gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IGNvbnRlbnRcbiAgICAgICAgICAgICAgICA/IERlY29yYXRpb24uc2V0KFtEZWNvcmF0aW9uLndpZGdldCh7IHdpZGdldDogbmV3IFBsYWNlaG9sZGVyKGNvbnRlbnQpLCBzaWRlOiAxIH0pLnJhbmdlKDApXSlcbiAgICAgICAgICAgICAgICA6IERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgZGVjb3JhdGlvbnMoKSB7IHJldHVybiB0aGlzLnZpZXcuc3RhdGUuZG9jLmxlbmd0aCA/IERlY29yYXRpb24ubm9uZSA6IHRoaXMucGxhY2Vob2xkZXI7IH1cbiAgICB9LCB7IGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnMgfSk7XG4gICAgcmV0dXJuIHR5cGVvZiBjb250ZW50ID09IFwic3RyaW5nXCIgPyBbXG4gICAgICAgIHBsdWdpbiwgRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5vZih7IFwiYXJpYS1wbGFjZWhvbGRlclwiOiBjb250ZW50IH0pXG4gICAgXSA6IHBsdWdpbjtcbn1cblxuLy8gRG9uJ3QgY29tcHV0ZSBwcmVjaXNlIGNvbHVtbiBwb3NpdGlvbnMgZm9yIGxpbmUgb2Zmc2V0cyBhYm92ZSB0aGlzXG4vLyAoc2luY2UgaXQgY291bGQgZ2V0IGV4cGVuc2l2ZSkuIEFzc3VtZSBvZmZzZXQ9PWNvbHVtbiBmb3IgdGhlbS5cbmNvbnN0IE1heE9mZiA9IDIwMDA7XG5mdW5jdGlvbiByZWN0YW5nbGVGb3Ioc3RhdGUsIGEsIGIpIHtcbiAgICBsZXQgc3RhcnRMaW5lID0gTWF0aC5taW4oYS5saW5lLCBiLmxpbmUpLCBlbmRMaW5lID0gTWF0aC5tYXgoYS5saW5lLCBiLmxpbmUpO1xuICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICBpZiAoYS5vZmYgPiBNYXhPZmYgfHwgYi5vZmYgPiBNYXhPZmYgfHwgYS5jb2wgPCAwIHx8IGIuY29sIDwgMCkge1xuICAgICAgICBsZXQgc3RhcnRPZmYgPSBNYXRoLm1pbihhLm9mZiwgYi5vZmYpLCBlbmRPZmYgPSBNYXRoLm1heChhLm9mZiwgYi5vZmYpO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRMaW5lOyBpIDw9IGVuZExpbmU7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZShpKTtcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA8PSBlbmRPZmYpXG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGxpbmUuZnJvbSArIHN0YXJ0T2ZmLCBsaW5lLnRvICsgZW5kT2ZmKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBzdGFydENvbCA9IE1hdGgubWluKGEuY29sLCBiLmNvbCksIGVuZENvbCA9IE1hdGgubWF4KGEuY29sLCBiLmNvbCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydExpbmU7IGkgPD0gZW5kTGluZTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lKGkpO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gZmluZENvbHVtbihsaW5lLnRleHQsIHN0YXJ0Q29sLCBzdGF0ZS50YWJTaXplLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaChFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKGxpbmUudG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBmaW5kQ29sdW1uKGxpbmUudGV4dCwgZW5kQ29sLCBzdGF0ZS50YWJTaXplKTtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaChFZGl0b3JTZWxlY3Rpb24ucmFuZ2UobGluZS5mcm9tICsgc3RhcnQsIGxpbmUuZnJvbSArIGVuZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByYW5nZXM7XG59XG5mdW5jdGlvbiBhYnNvbHV0ZUNvbHVtbih2aWV3LCB4KSB7XG4gICAgbGV0IHJlZiA9IHZpZXcuY29vcmRzQXRQb3Modmlldy52aWV3cG9ydC5mcm9tKTtcbiAgICByZXR1cm4gcmVmID8gTWF0aC5yb3VuZChNYXRoLmFicygocmVmLmxlZnQgLSB4KSAvIHZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoKSkgOiAtMTtcbn1cbmZ1bmN0aW9uIGdldFBvcyh2aWV3LCBldmVudCkge1xuICAgIGxldCBvZmZzZXQgPSB2aWV3LnBvc0F0Q29vcmRzKHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9LCBmYWxzZSk7XG4gICAgbGV0IGxpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQob2Zmc2V0KSwgb2ZmID0gb2Zmc2V0IC0gbGluZS5mcm9tO1xuICAgIGxldCBjb2wgPSBvZmYgPiBNYXhPZmYgPyAtMVxuICAgICAgICA6IG9mZiA9PSBsaW5lLmxlbmd0aCA/IGFic29sdXRlQ29sdW1uKHZpZXcsIGV2ZW50LmNsaWVudFgpXG4gICAgICAgICAgICA6IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgdmlldy5zdGF0ZS50YWJTaXplLCBvZmZzZXQgLSBsaW5lLmZyb20pO1xuICAgIHJldHVybiB7IGxpbmU6IGxpbmUubnVtYmVyLCBjb2wsIG9mZiB9O1xufVxuZnVuY3Rpb24gcmVjdGFuZ2xlU2VsZWN0aW9uU3R5bGUodmlldywgZXZlbnQpIHtcbiAgICBsZXQgc3RhcnQgPSBnZXRQb3ModmlldywgZXZlbnQpLCBzdGFydFNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghc3RhcnQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgICAgIGlmICh1cGRhdGUuZG9jQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXdTdGFydCA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh1cGRhdGUuc3RhcnRTdGF0ZS5kb2MubGluZShzdGFydC5saW5lKS5mcm9tKTtcbiAgICAgICAgICAgICAgICBsZXQgbmV3TGluZSA9IHVwZGF0ZS5zdGF0ZS5kb2MubGluZUF0KG5ld1N0YXJ0KTtcbiAgICAgICAgICAgICAgICBzdGFydCA9IHsgbGluZTogbmV3TGluZS5udW1iZXIsIGNvbDogc3RhcnQuY29sLCBvZmY6IE1hdGgubWluKHN0YXJ0Lm9mZiwgbmV3TGluZS5sZW5ndGgpIH07XG4gICAgICAgICAgICAgICAgc3RhcnRTZWwgPSBzdGFydFNlbC5tYXAodXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXQoZXZlbnQsIF9leHRlbmQsIG11bHRpcGxlKSB7XG4gICAgICAgICAgICBsZXQgY3VyID0gZ2V0UG9zKHZpZXcsIGV2ZW50KTtcbiAgICAgICAgICAgIGlmICghY3VyKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbDtcbiAgICAgICAgICAgIGxldCByYW5nZXMgPSByZWN0YW5nbGVGb3Iodmlldy5zdGF0ZSwgc3RhcnQsIGN1cik7XG4gICAgICAgICAgICBpZiAoIXJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0U2VsO1xuICAgICAgICAgICAgaWYgKG11bHRpcGxlKVxuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcy5jb25jYXQoc3RhcnRTZWwucmFuZ2VzKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbkNyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBlbmFibGVzIHJlY3Rhbmd1bGFyIHNlbGVjdGlvbnMuIEJ5XG5kZWZhdWx0LCBpdCB3aWxsIHJlYWN0IHRvIGxlZnQgbW91c2UgZHJhZyB3aXRoIHRoZSBBbHQga2V5IGhlbGRcbmRvd24uIFdoZW4gc3VjaCBhIHNlbGVjdGlvbiBvY2N1cnMsIHRoZSB0ZXh0IHdpdGhpbiB0aGUgcmVjdGFuZ2xlXG50aGF0IHdhcyBkcmFnZ2VkIG92ZXIgd2lsbCBiZSBzZWxlY3RlZCwgYXMgb25lIHNlbGVjdGlvblxuW3JhbmdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvblJhbmdlKSBwZXIgbGluZS5cbiovXG5mdW5jdGlvbiByZWN0YW5ndWxhclNlbGVjdGlvbihvcHRpb25zKSB7XG4gICAgbGV0IGZpbHRlciA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZXZlbnRGaWx0ZXIpIHx8IChlID0+IGUuYWx0S2V5ICYmIGUuYnV0dG9uID09IDApO1xuICAgIHJldHVybiBFZGl0b3JWaWV3Lm1vdXNlU2VsZWN0aW9uU3R5bGUub2YoKHZpZXcsIGV2ZW50KSA9PiBmaWx0ZXIoZXZlbnQpID8gcmVjdGFuZ2xlU2VsZWN0aW9uU3R5bGUodmlldywgZXZlbnQpIDogbnVsbCk7XG59XG5jb25zdCBrZXlzID0ge1xuICAgIEFsdDogWzE4LCBlID0+ICEhZS5hbHRLZXldLFxuICAgIENvbnRyb2w6IFsxNywgZSA9PiAhIWUuY3RybEtleV0sXG4gICAgU2hpZnQ6IFsxNiwgZSA9PiAhIWUuc2hpZnRLZXldLFxuICAgIE1ldGE6IFs5MSwgZSA9PiAhIWUubWV0YUtleV1cbn07XG5jb25zdCBzaG93Q3Jvc3NoYWlyID0geyBzdHlsZTogXCJjdXJzb3I6IGNyb3NzaGFpclwiIH07XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgdHVybnMgdGhlIHBvaW50ZXIgY3Vyc29yIGludG8gYVxuY3Jvc3NoYWlyIHdoZW4gYSBnaXZlbiBtb2RpZmllciBrZXksIGRlZmF1bHRpbmcgdG8gQWx0LCBpcyBoZWxkXG5kb3duLiBDYW4gc2VydmUgYXMgYSB2aXN1YWwgaGludCB0aGF0IHJlY3Rhbmd1bGFyIHNlbGVjdGlvbiBpc1xuZ29pbmcgdG8gaGFwcGVuIHdoZW4gcGFpcmVkIHdpdGhcbltgcmVjdGFuZ3VsYXJTZWxlY3Rpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcucmVjdGFuZ3VsYXJTZWxlY3Rpb24pLlxuKi9cbmZ1bmN0aW9uIGNyb3NzaGFpckN1cnNvcihvcHRpb25zID0ge30pIHtcbiAgICBsZXQgW2NvZGUsIGdldHRlcl0gPSBrZXlzW29wdGlvbnMua2V5IHx8IFwiQWx0XCJdO1xuICAgIGxldCBwbHVnaW4gPSBWaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgICAgICB0aGlzLmlzRG93biA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHNldChpc0Rvd24pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRG93biAhPSBpc0Rvd24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRG93biA9IGlzRG93bjtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcudXBkYXRlKFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAgZXZlbnRPYnNlcnZlcnM6IHtcbiAgICAgICAgICAgIGtleWRvd24oZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGUua2V5Q29kZSA9PSBjb2RlIHx8IGdldHRlcihlKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAga2V5dXAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gY29kZSB8fCAhZ2V0dGVyKGUpKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91c2Vtb3ZlKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChnZXR0ZXIoZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcGx1Z2luLFxuICAgICAgICBFZGl0b3JWaWV3LmNvbnRlbnRBdHRyaWJ1dGVzLm9mKHZpZXcgPT4geyB2YXIgX2E7IHJldHVybiAoKF9hID0gdmlldy5wbHVnaW4ocGx1Z2luKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzRG93bikgPyBzaG93Q3Jvc3NoYWlyIDogbnVsbDsgfSlcbiAgICBdO1xufVxuXG5jb25zdCBPdXRzaWRlID0gXCItMTAwMDBweFwiO1xuY2xhc3MgVG9vbHRpcFZpZXdNYW5hZ2VyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBmYWNldCwgY3JlYXRlVG9vbHRpcFZpZXcsIHJlbW92ZVRvb2x0aXBWaWV3KSB7XG4gICAgICAgIHRoaXMuZmFjZXQgPSBmYWNldDtcbiAgICAgICAgdGhpcy5jcmVhdGVUb29sdGlwVmlldyA9IGNyZWF0ZVRvb2x0aXBWaWV3O1xuICAgICAgICB0aGlzLnJlbW92ZVRvb2x0aXBWaWV3ID0gcmVtb3ZlVG9vbHRpcFZpZXc7XG4gICAgICAgIHRoaXMuaW5wdXQgPSB2aWV3LnN0YXRlLmZhY2V0KGZhY2V0KTtcbiAgICAgICAgdGhpcy50b29sdGlwcyA9IHRoaXMuaW5wdXQuZmlsdGVyKHQgPT4gdCk7XG4gICAgICAgIGxldCBwcmV2ID0gbnVsbDtcbiAgICAgICAgdGhpcy50b29sdGlwVmlld3MgPSB0aGlzLnRvb2x0aXBzLm1hcCh0ID0+IHByZXYgPSBjcmVhdGVUb29sdGlwVmlldyh0LCBwcmV2KSk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUsIGFib3ZlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGlucHV0ID0gdXBkYXRlLnN0YXRlLmZhY2V0KHRoaXMuZmFjZXQpO1xuICAgICAgICBsZXQgdG9vbHRpcHMgPSBpbnB1dC5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgaWYgKGlucHV0ID09PSB0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIGlmICh0LnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdC51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG9vbHRpcFZpZXdzID0gW10sIG5ld0Fib3ZlID0gYWJvdmUgPyBbXSA6IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9vbHRpcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0aXAgPSB0b29sdGlwc1tpXSwga25vd24gPSAtMTtcbiAgICAgICAgICAgIGlmICghdGlwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRvb2x0aXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gdGhpcy50b29sdGlwc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAob3RoZXIgJiYgb3RoZXIuY3JlYXRlID09IHRpcC5jcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgIGtub3duID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrbm93biA8IDApIHtcbiAgICAgICAgICAgICAgICB0b29sdGlwVmlld3NbaV0gPSB0aGlzLmNyZWF0ZVRvb2x0aXBWaWV3KHRpcCwgaSA/IHRvb2x0aXBWaWV3c1tpIC0gMV0gOiBudWxsKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3QWJvdmUpXG4gICAgICAgICAgICAgICAgICAgIG5ld0Fib3ZlW2ldID0gISF0aXAuYWJvdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdG9vbHRpcFZpZXcgPSB0b29sdGlwVmlld3NbaV0gPSB0aGlzLnRvb2x0aXBWaWV3c1trbm93bl07XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Fib3ZlKVxuICAgICAgICAgICAgICAgICAgICBuZXdBYm92ZVtpXSA9IGFib3ZlW2tub3duXTtcbiAgICAgICAgICAgICAgICBpZiAodG9vbHRpcFZpZXcudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwVmlldy51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgaWYgKHRvb2x0aXBWaWV3cy5pbmRleE9mKHQpIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlVG9vbHRpcFZpZXcodCk7XG4gICAgICAgICAgICAgICAgKF9hID0gdC5kZXN0cm95KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGFib3ZlKSB7XG4gICAgICAgICAgICBuZXdBYm92ZS5mb3JFYWNoKCh2YWwsIGkpID0+IGFib3ZlW2ldID0gdmFsKTtcbiAgICAgICAgICAgIGFib3ZlLmxlbmd0aCA9IG5ld0Fib3ZlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMudG9vbHRpcHMgPSB0b29sdGlwcztcbiAgICAgICAgdGhpcy50b29sdGlwVmlld3MgPSB0b29sdGlwVmlld3M7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbi8qKlxuQ3JlYXRlcyBhbiBleHRlbnNpb24gdGhhdCBjb25maWd1cmVzIHRvb2x0aXAgYmVoYXZpb3IuXG4qL1xuZnVuY3Rpb24gdG9vbHRpcHMoY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gdG9vbHRpcENvbmZpZy5vZihjb25maWcpO1xufVxuZnVuY3Rpb24gd2luZG93U3BhY2Uodmlldykge1xuICAgIGxldCBkb2NFbHQgPSB2aWV3LmRvbS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICByZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAsIGJvdHRvbTogZG9jRWx0LmNsaWVudEhlaWdodCwgcmlnaHQ6IGRvY0VsdC5jbGllbnRXaWR0aCB9O1xufVxuY29uc3QgdG9vbHRpcENvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICByZXR1cm4gKHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBicm93c2VyLmlvcyA/IFwiYWJzb2x1dGVcIiA6ICgoX2EgPSB2YWx1ZXMuZmluZChjb25mID0+IGNvbmYucG9zaXRpb24pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucG9zaXRpb24pIHx8IFwiZml4ZWRcIixcbiAgICAgICAgICAgIHBhcmVudDogKChfYiA9IHZhbHVlcy5maW5kKGNvbmYgPT4gY29uZi5wYXJlbnQpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGFyZW50KSB8fCBudWxsLFxuICAgICAgICAgICAgdG9vbHRpcFNwYWNlOiAoKF9jID0gdmFsdWVzLmZpbmQoY29uZiA9PiBjb25mLnRvb2x0aXBTcGFjZSkpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy50b29sdGlwU3BhY2UpIHx8IHdpbmRvd1NwYWNlLFxuICAgICAgICB9KTtcbiAgICB9XG59KTtcbmNvbnN0IGtub3duSGVpZ2h0ID0gLypAX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG5jb25zdCB0b29sdGlwUGx1Z2luID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuYWJvdmUgPSBbXTtcbiAgICAgICAgdGhpcy5pblZpZXcgPSB0cnVlO1xuICAgICAgICB0aGlzLm1hZGVBYnNvbHV0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxhc3RUcmFuc2FjdGlvbiA9IDA7XG4gICAgICAgIHRoaXMubWVhc3VyZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgbGV0IGNvbmZpZyA9IHZpZXcuc3RhdGUuZmFjZXQodG9vbHRpcENvbmZpZyk7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBjb25maWcucG9zaXRpb247XG4gICAgICAgIHRoaXMucGFyZW50ID0gY29uZmlnLnBhcmVudDtcbiAgICAgICAgdGhpcy5jbGFzc2VzID0gdmlldy50aGVtZUNsYXNzZXM7XG4gICAgICAgIHRoaXMuY3JlYXRlQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMubWVhc3VyZVJlcSA9IHsgcmVhZDogdGhpcy5yZWFkTWVhc3VyZS5iaW5kKHRoaXMpLCB3cml0ZTogdGhpcy53cml0ZU1lYXN1cmUuYmluZCh0aGlzKSwga2V5OiB0aGlzIH07XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT0gXCJmdW5jdGlvblwiID8gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMubWVhc3VyZVNvb24oKSkgOiBudWxsO1xuICAgICAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVG9vbHRpcFZpZXdNYW5hZ2VyKHZpZXcsIHNob3dUb29sdGlwLCAodCwgcCkgPT4gdGhpcy5jcmVhdGVUb29sdGlwKHQsIHApLCB0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyKVxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKHQuZG9tKTtcbiAgICAgICAgICAgIHQuZG9tLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hYm92ZSA9IHRoaXMubWFuYWdlci50b29sdGlwcy5tYXAodCA9PiAhIXQuYWJvdmUpO1xuICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyID0gdHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyID09IFwiZnVuY3Rpb25cIiA/IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID4gdGhpcy5sYXN0VHJhbnNhY3Rpb24gLSA1MCAmJlxuICAgICAgICAgICAgICAgIGVudHJpZXMubGVuZ3RoID4gMCAmJiBlbnRyaWVzW2VudHJpZXMubGVuZ3RoIC0gMV0uaW50ZXJzZWN0aW9uUmF0aW8gPCAxKVxuICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZVNvb24oKTtcbiAgICAgICAgfSwgeyB0aHJlc2hvbGQ6IFsxXSB9KSA6IG51bGw7XG4gICAgICAgIHRoaXMub2JzZXJ2ZUludGVyc2VjdGlvbigpO1xuICAgICAgICB2aWV3Lndpbi5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMubWVhc3VyZVNvb24gPSB0aGlzLm1lYXN1cmVTb29uLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLm1heWJlTWVhc3VyZSgpO1xuICAgIH1cbiAgICBjcmVhdGVDb250YWluZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSB0aGlzLnZpZXcudGhlbWVDbGFzc2VzO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnZpZXcuZG9tO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9ic2VydmVJbnRlcnNlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSB7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHRvb2x0aXAgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLm9ic2VydmUodG9vbHRpcC5kb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1lYXN1cmVTb29uKCkge1xuICAgICAgICBpZiAodGhpcy5tZWFzdXJlVGltZW91dCA8IDApXG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZWFzdXJlVGltZW91dCA9IC0xO1xuICAgICAgICAgICAgICAgIHRoaXMubWF5YmVNZWFzdXJlKCk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5sYXN0VHJhbnNhY3Rpb24gPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IHRoaXMubWFuYWdlci51cGRhdGUodXBkYXRlLCB0aGlzLmFib3ZlKTtcbiAgICAgICAgaWYgKHVwZGF0ZWQpXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVJbnRlcnNlY3Rpb24oKTtcbiAgICAgICAgbGV0IHNob3VsZE1lYXN1cmUgPSB1cGRhdGVkIHx8IHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQ7XG4gICAgICAgIGxldCBuZXdDb25maWcgPSB1cGRhdGUuc3RhdGUuZmFjZXQodG9vbHRpcENvbmZpZyk7XG4gICAgICAgIGlmIChuZXdDb25maWcucG9zaXRpb24gIT0gdGhpcy5wb3NpdGlvbiAmJiAhdGhpcy5tYWRlQWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXdDb25maWcucG9zaXRpb247XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdC5kb20uc3R5bGUucG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgICAgICAgc2hvdWxkTWVhc3VyZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0NvbmZpZy5wYXJlbnQgIT0gdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudClcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50ID0gbmV3Q29uZmlnLnBhcmVudDtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29udGFpbmVyKCk7XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodC5kb20pO1xuICAgICAgICAgICAgc2hvdWxkTWVhc3VyZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy52aWV3LnRoZW1lQ2xhc3NlcyAhPSB0aGlzLmNsYXNzZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NlcyA9IHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IHRoaXMudmlldy50aGVtZUNsYXNzZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZE1lYXN1cmUpXG4gICAgICAgICAgICB0aGlzLm1heWJlTWVhc3VyZSgpO1xuICAgIH1cbiAgICBjcmVhdGVUb29sdGlwKHRvb2x0aXAsIHByZXYpIHtcbiAgICAgICAgbGV0IHRvb2x0aXBWaWV3ID0gdG9vbHRpcC5jcmVhdGUodGhpcy52aWV3KTtcbiAgICAgICAgbGV0IGJlZm9yZSA9IHByZXYgPyBwcmV2LmRvbSA6IG51bGw7XG4gICAgICAgIHRvb2x0aXBWaWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tdG9vbHRpcFwiKTtcbiAgICAgICAgaWYgKHRvb2x0aXAuYXJyb3cgJiYgIXRvb2x0aXBWaWV3LmRvbS5xdWVyeVNlbGVjdG9yKFwiLmNtLXRvb2x0aXAgPiAuY20tdG9vbHRpcC1hcnJvd1wiKSkge1xuICAgICAgICAgICAgbGV0IGFycm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGFycm93LmNsYXNzTmFtZSA9IFwiY20tdG9vbHRpcC1hcnJvd1wiO1xuICAgICAgICAgICAgdG9vbHRpcFZpZXcuZG9tLmFwcGVuZENoaWxkKGFycm93KTtcbiAgICAgICAgfVxuICAgICAgICB0b29sdGlwVmlldy5kb20uc3R5bGUucG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgICB0b29sdGlwVmlldy5kb20uc3R5bGUudG9wID0gT3V0c2lkZTtcbiAgICAgICAgdG9vbHRpcFZpZXcuZG9tLnN0eWxlLmxlZnQgPSBcIjBweFwiO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUodG9vbHRpcFZpZXcuZG9tLCBiZWZvcmUpO1xuICAgICAgICBpZiAodG9vbHRpcFZpZXcubW91bnQpXG4gICAgICAgICAgICB0b29sdGlwVmlldy5tb3VudCh0aGlzLnZpZXcpO1xuICAgICAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcilcbiAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0b29sdGlwVmlldy5kb20pO1xuICAgICAgICByZXR1cm4gdG9vbHRpcFZpZXc7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB0aGlzLnZpZXcud2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5tZWFzdXJlU29vbik7XG4gICAgICAgIGZvciAobGV0IHRvb2x0aXBWaWV3IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpIHtcbiAgICAgICAgICAgIHRvb2x0aXBWaWV3LmRvbS5yZW1vdmUoKTtcbiAgICAgICAgICAgIChfYSA9IHRvb2x0aXBWaWV3LmRlc3Ryb3kpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHRvb2x0aXBWaWV3KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgKF9iID0gdGhpcy5yZXNpemVPYnNlcnZlcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgKF9jID0gdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubWVhc3VyZVRpbWVvdXQpO1xuICAgIH1cbiAgICByZWFkTWVhc3VyZSgpIHtcbiAgICAgICAgbGV0IHNjYWxlWCA9IDEsIHNjYWxlWSA9IDEsIG1ha2VBYnNvbHV0ZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PSBcImZpeGVkXCIgJiYgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCB7IGRvbSB9ID0gdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3c1swXTtcbiAgICAgICAgICAgIGlmIChicm93c2VyLmdlY2tvKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZWZveCBzZXRzIHRoZSBlbGVtZW50J3MgYG9mZnNldFBhcmVudGAgdG8gdGhlXG4gICAgICAgICAgICAgICAgLy8gdHJhbnNmb3JtZWQgZWxlbWVudCB3aGVuIGEgdHJhbnNmb3JtIGludGVyZmVyZXMgd2l0aCBmaXhlZFxuICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uaW5nLlxuICAgICAgICAgICAgICAgIG1ha2VBYnNvbHV0ZSA9IGRvbS5vZmZzZXRQYXJlbnQgIT0gdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tLnN0eWxlLnRvcCA9PSBPdXRzaWRlICYmIGRvbS5zdHlsZS5sZWZ0ID09IFwiMHB4XCIpIHtcbiAgICAgICAgICAgICAgICAvLyBPbiBvdGhlciBicm93c2Vycywgd2UgaGF2ZSB0byBhd2t3YXJkbHkgdHJ5IGFuZCB1c2Ugb3RoZXJcbiAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiB0byBkZXRlY3QgYSB0cmFuc2Zvcm0uXG4gICAgICAgICAgICAgICAgbGV0IHJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgbWFrZUFic29sdXRlID0gTWF0aC5hYnMocmVjdC50b3AgKyAxMDAwMCkgPiAxIHx8IE1hdGguYWJzKHJlY3QubGVmdCkgPiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYWtlQWJzb2x1dGUgfHwgdGhpcy5wb3NpdGlvbiA9PSBcImFic29sdXRlXCIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGxldCByZWN0ID0gdGhpcy5wYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlY3Qud2lkdGggJiYgcmVjdC5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NhbGVYID0gcmVjdC53aWR0aCAvIHRoaXMucGFyZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICBzY2FsZVkgPSByZWN0LmhlaWdodCAvIHRoaXMucGFyZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAoeyBzY2FsZVgsIHNjYWxlWSB9ID0gdGhpcy52aWV3LnZpZXdTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZpc2libGUgPSB0aGlzLnZpZXcuc2Nyb2xsRE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBtYXJnaW5zID0gZ2V0U2Nyb2xsTWFyZ2lucyh0aGlzLnZpZXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmlzaWJsZToge1xuICAgICAgICAgICAgICAgIGxlZnQ6IHZpc2libGUubGVmdCArIG1hcmdpbnMubGVmdCwgdG9wOiB2aXNpYmxlLnRvcCArIG1hcmdpbnMudG9wLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiB2aXNpYmxlLnJpZ2h0IC0gbWFyZ2lucy5yaWdodCwgYm90dG9tOiB2aXNpYmxlLmJvdHRvbSAtIG1hcmdpbnMuYm90dG9tXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCA/IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogdGhpcy52aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgIHBvczogdGhpcy5tYW5hZ2VyLnRvb2x0aXBzLm1hcCgodCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0diA9IHRoaXMubWFuYWdlci50b29sdGlwVmlld3NbaV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR2LmdldENvb3JkcyA/IHR2LmdldENvb3Jkcyh0LnBvcykgOiB0aGlzLnZpZXcuY29vcmRzQXRQb3ModC5wb3MpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzaXplOiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzLm1hcCgoeyBkb20gfSkgPT4gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxcbiAgICAgICAgICAgIHNwYWNlOiB0aGlzLnZpZXcuc3RhdGUuZmFjZXQodG9vbHRpcENvbmZpZykudG9vbHRpcFNwYWNlKHRoaXMudmlldyksXG4gICAgICAgICAgICBzY2FsZVgsIHNjYWxlWSwgbWFrZUFic29sdXRlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHdyaXRlTWVhc3VyZShtZWFzdXJlZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChtZWFzdXJlZC5tYWtlQWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRoaXMubWFkZUFic29sdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdC5kb20uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgdmlzaWJsZSwgc3BhY2UsIHNjYWxlWCwgc2NhbGVZIH0gPSBtZWFzdXJlZDtcbiAgICAgICAgbGV0IG90aGVycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFuYWdlci50b29sdGlwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHRvb2x0aXAgPSB0aGlzLm1hbmFnZXIudG9vbHRpcHNbaV0sIHRWaWV3ID0gdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3c1tpXSwgeyBkb20gfSA9IHRWaWV3O1xuICAgICAgICAgICAgbGV0IHBvcyA9IG1lYXN1cmVkLnBvc1tpXSwgc2l6ZSA9IG1lYXN1cmVkLnNpemVbaV07XG4gICAgICAgICAgICAvLyBIaWRlIHRvb2x0aXBzIHRoYXQgYXJlIG91dHNpZGUgb2YgdGhlIGVkaXRvci5cbiAgICAgICAgICAgIGlmICghcG9zIHx8IHRvb2x0aXAuY2xpcCAhPT0gZmFsc2UgJiYgKHBvcy5ib3R0b20gPD0gTWF0aC5tYXgodmlzaWJsZS50b3AsIHNwYWNlLnRvcCkgfHxcbiAgICAgICAgICAgICAgICBwb3MudG9wID49IE1hdGgubWluKHZpc2libGUuYm90dG9tLCBzcGFjZS5ib3R0b20pIHx8XG4gICAgICAgICAgICAgICAgcG9zLnJpZ2h0IDwgTWF0aC5tYXgodmlzaWJsZS5sZWZ0LCBzcGFjZS5sZWZ0KSAtIC4xIHx8XG4gICAgICAgICAgICAgICAgcG9zLmxlZnQgPiBNYXRoLm1pbih2aXNpYmxlLnJpZ2h0LCBzcGFjZS5yaWdodCkgKyAuMSkpIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUudG9wID0gT3V0c2lkZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhcnJvdyA9IHRvb2x0aXAuYXJyb3cgPyB0Vmlldy5kb20ucXVlcnlTZWxlY3RvcihcIi5jbS10b29sdGlwLWFycm93XCIpIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBhcnJvd0hlaWdodCA9IGFycm93ID8gNyAvKiBBcnJvdy5TaXplICovIDogMDtcbiAgICAgICAgICAgIGxldCB3aWR0aCA9IHNpemUucmlnaHQgLSBzaXplLmxlZnQsIGhlaWdodCA9IChfYSA9IGtub3duSGVpZ2h0LmdldCh0VmlldykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHNpemUuYm90dG9tIC0gc2l6ZS50b3A7XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gdFZpZXcub2Zmc2V0IHx8IG5vT2Zmc2V0LCBsdHIgPSB0aGlzLnZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSO1xuICAgICAgICAgICAgbGV0IGxlZnQgPSBzaXplLndpZHRoID4gc3BhY2UucmlnaHQgLSBzcGFjZS5sZWZ0XG4gICAgICAgICAgICAgICAgPyAobHRyID8gc3BhY2UubGVmdCA6IHNwYWNlLnJpZ2h0IC0gc2l6ZS53aWR0aClcbiAgICAgICAgICAgICAgICA6IGx0ciA/IE1hdGgubWF4KHNwYWNlLmxlZnQsIE1hdGgubWluKHBvcy5sZWZ0IC0gKGFycm93ID8gMTQgLyogQXJyb3cuT2Zmc2V0ICovIDogMCkgKyBvZmZzZXQueCwgc3BhY2UucmlnaHQgLSB3aWR0aCkpXG4gICAgICAgICAgICAgICAgICAgIDogTWF0aC5taW4oTWF0aC5tYXgoc3BhY2UubGVmdCwgcG9zLmxlZnQgLSB3aWR0aCArIChhcnJvdyA/IDE0IC8qIEFycm93Lk9mZnNldCAqLyA6IDApIC0gb2Zmc2V0LngpLCBzcGFjZS5yaWdodCAtIHdpZHRoKTtcbiAgICAgICAgICAgIGxldCBhYm92ZSA9IHRoaXMuYWJvdmVbaV07XG4gICAgICAgICAgICBpZiAoIXRvb2x0aXAuc3RyaWN0U2lkZSAmJiAoYWJvdmVcbiAgICAgICAgICAgICAgICA/IHBvcy50b3AgLSBoZWlnaHQgLSBhcnJvd0hlaWdodCAtIG9mZnNldC55IDwgc3BhY2UudG9wXG4gICAgICAgICAgICAgICAgOiBwb3MuYm90dG9tICsgaGVpZ2h0ICsgYXJyb3dIZWlnaHQgKyBvZmZzZXQueSA+IHNwYWNlLmJvdHRvbSkgJiZcbiAgICAgICAgICAgICAgICBhYm92ZSA9PSAoc3BhY2UuYm90dG9tIC0gcG9zLmJvdHRvbSA+IHBvcy50b3AgLSBzcGFjZS50b3ApKVxuICAgICAgICAgICAgICAgIGFib3ZlID0gdGhpcy5hYm92ZVtpXSA9ICFhYm92ZTtcbiAgICAgICAgICAgIGxldCBzcGFjZVZlcnQgPSAoYWJvdmUgPyBwb3MudG9wIC0gc3BhY2UudG9wIDogc3BhY2UuYm90dG9tIC0gcG9zLmJvdHRvbSkgLSBhcnJvd0hlaWdodDtcbiAgICAgICAgICAgIGlmIChzcGFjZVZlcnQgPCBoZWlnaHQgJiYgdFZpZXcucmVzaXplICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFjZVZlcnQgPCB0aGlzLnZpZXcuZGVmYXVsdExpbmVIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tLnN0eWxlLnRvcCA9IE91dHNpZGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBrbm93bkhlaWdodC5zZXQodFZpZXcsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLmhlaWdodCA9IChoZWlnaHQgPSBzcGFjZVZlcnQpIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tLnN0eWxlLmhlaWdodCkge1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5oZWlnaHQgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRvcCA9IGFib3ZlID8gcG9zLnRvcCAtIGhlaWdodCAtIGFycm93SGVpZ2h0IC0gb2Zmc2V0LnkgOiBwb3MuYm90dG9tICsgYXJyb3dIZWlnaHQgKyBvZmZzZXQueTtcbiAgICAgICAgICAgIGxldCByaWdodCA9IGxlZnQgKyB3aWR0aDtcbiAgICAgICAgICAgIGlmICh0Vmlldy5vdmVybGFwICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2Ygb3RoZXJzKVxuICAgICAgICAgICAgICAgICAgICBpZiAoci5sZWZ0IDwgcmlnaHQgJiYgci5yaWdodCA+IGxlZnQgJiYgci50b3AgPCB0b3AgKyBoZWlnaHQgJiYgci5ib3R0b20gPiB0b3ApXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBhYm92ZSA/IHIudG9wIC0gaGVpZ2h0IC0gMiAtIGFycm93SGVpZ2h0IDogci5ib3R0b20gKyBhcnJvd0hlaWdodCArIDI7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PSBcImFic29sdXRlXCIpIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUudG9wID0gKHRvcCAtIG1lYXN1cmVkLnBhcmVudC50b3ApIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIHNldExlZnRTdHlsZShkb20sIChsZWZ0IC0gbWVhc3VyZWQucGFyZW50LmxlZnQpIC8gc2NhbGVYKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS50b3AgPSB0b3AgLyBzY2FsZVkgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgc2V0TGVmdFN0eWxlKGRvbSwgbGVmdCAvIHNjYWxlWCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJyb3cpIHtcbiAgICAgICAgICAgICAgICBsZXQgYXJyb3dMZWZ0ID0gcG9zLmxlZnQgKyAobHRyID8gb2Zmc2V0LnggOiAtb2Zmc2V0LngpIC0gKGxlZnQgKyAxNCAvKiBBcnJvdy5PZmZzZXQgKi8gLSA3IC8qIEFycm93LlNpemUgKi8pO1xuICAgICAgICAgICAgICAgIGFycm93LnN0eWxlLmxlZnQgPSBhcnJvd0xlZnQgLyBzY2FsZVggKyBcInB4XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodFZpZXcub3ZlcmxhcCAhPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICBvdGhlcnMucHVzaCh7IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTogdG9wICsgaGVpZ2h0IH0pO1xuICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC50b2dnbGUoXCJjbS10b29sdGlwLWFib3ZlXCIsIGFib3ZlKTtcbiAgICAgICAgICAgIGRvbS5jbGFzc0xpc3QudG9nZ2xlKFwiY20tdG9vbHRpcC1iZWxvd1wiLCAhYWJvdmUpO1xuICAgICAgICAgICAgaWYgKHRWaWV3LnBvc2l0aW9uZWQpXG4gICAgICAgICAgICAgICAgdFZpZXcucG9zaXRpb25lZChtZWFzdXJlZC5zcGFjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWF5YmVNZWFzdXJlKCkge1xuICAgICAgICBpZiAodGhpcy5tYW5hZ2VyLnRvb2x0aXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlldy5pblZpZXcpXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pblZpZXcgIT0gdGhpcy52aWV3LmluVmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5WaWV3ID0gdGhpcy52aWV3LmluVmlldztcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5WaWV3KVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0diBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdHYuZG9tLnN0eWxlLnRvcCA9IE91dHNpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59LCB7XG4gICAgZXZlbnRPYnNlcnZlcnM6IHtcbiAgICAgICAgc2Nyb2xsKCkgeyB0aGlzLm1heWJlTWVhc3VyZSgpOyB9XG4gICAgfVxufSk7XG5mdW5jdGlvbiBzZXRMZWZ0U3R5bGUoZWx0LCB2YWx1ZSkge1xuICAgIGxldCBjdXJyZW50ID0gcGFyc2VJbnQoZWx0LnN0eWxlLmxlZnQsIDEwKTtcbiAgICBpZiAoaXNOYU4oY3VycmVudCkgfHwgTWF0aC5hYnModmFsdWUgLSBjdXJyZW50KSA+IDEpXG4gICAgICAgIGVsdC5zdHlsZS5sZWZ0ID0gdmFsdWUgKyBcInB4XCI7XG59XG5jb25zdCBiYXNlVGhlbWUgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5iYXNlVGhlbWUoe1xuICAgIFwiLmNtLXRvb2x0aXBcIjoge1xuICAgICAgICB6SW5kZXg6IDUwMCxcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXRvb2x0aXBcIjoge1xuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNiYmJcIixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmNWY1ZjVcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXRvb2x0aXAtc2VjdGlvbjpub3QoOmZpcnN0LWNoaWxkKVwiOiB7XG4gICAgICAgIGJvcmRlclRvcDogXCIxcHggc29saWQgI2JiYlwiLFxuICAgIH0sXG4gICAgXCImZGFyayAuY20tdG9vbHRpcFwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMzMzMzM4XCIsXG4gICAgICAgIGNvbG9yOiBcIndoaXRlXCJcbiAgICB9LFxuICAgIFwiLmNtLXRvb2x0aXAtYXJyb3dcIjoge1xuICAgICAgICBoZWlnaHQ6IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weGAsXG4gICAgICAgIHdpZHRoOiBgJHs3IC8qIEFycm93LlNpemUgKi8gKiAyfXB4YCxcbiAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgekluZGV4OiAtMSxcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgIFwiJjpiZWZvcmUsICY6YWZ0ZXJcIjoge1xuICAgICAgICAgICAgY29udGVudDogXCInJ1wiLFxuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgYm9yZGVyTGVmdDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkIHRyYW5zcGFyZW50YCxcbiAgICAgICAgICAgIGJvcmRlclJpZ2h0OiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgdHJhbnNwYXJlbnRgLFxuICAgICAgICB9LFxuICAgICAgICBcIi5jbS10b29sdGlwLWFib3ZlICZcIjoge1xuICAgICAgICAgICAgYm90dG9tOiBgLSR7NyAvKiBBcnJvdy5TaXplICovfXB4YCxcbiAgICAgICAgICAgIFwiJjpiZWZvcmVcIjoge1xuICAgICAgICAgICAgICAgIGJvcmRlclRvcDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkICNiYmJgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiJjphZnRlclwiOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyVG9wOiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgI2Y1ZjVmNWAsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBcIjFweFwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiLmNtLXRvb2x0aXAtYmVsb3cgJlwiOiB7XG4gICAgICAgICAgICB0b3A6IGAtJHs3IC8qIEFycm93LlNpemUgKi99cHhgLFxuICAgICAgICAgICAgXCImOmJlZm9yZVwiOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgI2JiYmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCImOmFmdGVyXCI6IHtcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCAjZjVmNWY1YCxcbiAgICAgICAgICAgICAgICB0b3A6IFwiMXB4XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLXRvb2x0aXAgLmNtLXRvb2x0aXAtYXJyb3dcIjoge1xuICAgICAgICBcIiY6YmVmb3JlXCI6IHtcbiAgICAgICAgICAgIGJvcmRlclRvcENvbG9yOiBcIiMzMzMzMzhcIixcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbUNvbG9yOiBcIiMzMzMzMzhcIlxuICAgICAgICB9LFxuICAgICAgICBcIiY6YWZ0ZXJcIjoge1xuICAgICAgICAgICAgYm9yZGVyVG9wQ29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbUNvbG9yOiBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuY29uc3Qgbm9PZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbi8qKlxuRmFjZXQgdG8gd2hpY2ggYW4gZXh0ZW5zaW9uIGNhbiBhZGQgYSB2YWx1ZSB0byBzaG93IGEgdG9vbHRpcC5cbiovXG5jb25zdCBzaG93VG9vbHRpcCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGVuYWJsZXM6IFt0b29sdGlwUGx1Z2luLCBiYXNlVGhlbWVdXG59KTtcbmNvbnN0IHNob3dIb3ZlclRvb2x0aXAgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiBpbnB1dHMgPT4gaW5wdXRzLnJlZHVjZSgoYSwgaSkgPT4gYS5jb25jYXQoaSksIFtdKVxufSk7XG5jbGFzcyBIb3ZlclRvb2x0aXBIb3N0IHtcbiAgICAvLyBOZWVkcyB0byBiZSBzdGF0aWMgc28gdGhhdCBob3N0IHRvb2x0aXAgaW5zdGFuY2VzIGFsd2F5cyBtYXRjaFxuICAgIHN0YXRpYyBjcmVhdGUodmlldykge1xuICAgICAgICByZXR1cm4gbmV3IEhvdmVyVG9vbHRpcEhvc3Qodmlldyk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChcImNtLXRvb2x0aXAtaG92ZXJcIik7XG4gICAgICAgIHRoaXMubWFuYWdlciA9IG5ldyBUb29sdGlwVmlld01hbmFnZXIodmlldywgc2hvd0hvdmVyVG9vbHRpcCwgKHQsIHApID0+IHRoaXMuY3JlYXRlSG9zdGVkVmlldyh0LCBwKSwgdCA9PiB0LmRvbS5yZW1vdmUoKSk7XG4gICAgfVxuICAgIGNyZWF0ZUhvc3RlZFZpZXcodG9vbHRpcCwgcHJldikge1xuICAgICAgICBsZXQgaG9zdGVkVmlldyA9IHRvb2x0aXAuY3JlYXRlKHRoaXMudmlldyk7XG4gICAgICAgIGhvc3RlZFZpZXcuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS10b29sdGlwLXNlY3Rpb25cIik7XG4gICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShob3N0ZWRWaWV3LmRvbSwgcHJldiA/IHByZXYuZG9tLm5leHRTaWJsaW5nIDogdGhpcy5kb20uZmlyc3RDaGlsZCk7XG4gICAgICAgIGlmICh0aGlzLm1vdW50ZWQgJiYgaG9zdGVkVmlldy5tb3VudClcbiAgICAgICAgICAgIGhvc3RlZFZpZXcubW91bnQodGhpcy52aWV3KTtcbiAgICAgICAgcmV0dXJuIGhvc3RlZFZpZXc7XG4gICAgfVxuICAgIG1vdW50KHZpZXcpIHtcbiAgICAgICAgZm9yIChsZXQgaG9zdGVkVmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICBpZiAoaG9zdGVkVmlldy5tb3VudClcbiAgICAgICAgICAgICAgICBob3N0ZWRWaWV3Lm1vdW50KHZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHBvc2l0aW9uZWQoc3BhY2UpIHtcbiAgICAgICAgZm9yIChsZXQgaG9zdGVkVmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICBpZiAoaG9zdGVkVmlldy5wb3NpdGlvbmVkKVxuICAgICAgICAgICAgICAgIGhvc3RlZFZpZXcucG9zaXRpb25lZChzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICB0aGlzLm1hbmFnZXIudXBkYXRlKHVwZGF0ZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgKF9hID0gdC5kZXN0cm95KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0KTtcbiAgICB9XG4gICAgcGFzc1Byb3AobmFtZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAobGV0IHZpZXcgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cykge1xuICAgICAgICAgICAgbGV0IGdpdmVuID0gdmlld1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChnaXZlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2l2ZW47XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgIT09IGdpdmVuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IG9mZnNldCgpIHsgcmV0dXJuIHRoaXMucGFzc1Byb3AoXCJvZmZzZXRcIik7IH1cbiAgICBnZXQgZ2V0Q29vcmRzKCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcImdldENvb3Jkc1wiKTsgfVxuICAgIGdldCBvdmVybGFwKCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcIm92ZXJsYXBcIik7IH1cbiAgICBnZXQgcmVzaXplKCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcInJlc2l6ZVwiKTsgfVxufVxuY29uc3Qgc2hvd0hvdmVyVG9vbHRpcEhvc3QgPSAvKkBfX1BVUkVfXyovc2hvd1Rvb2x0aXAuY29tcHV0ZShbc2hvd0hvdmVyVG9vbHRpcF0sIHN0YXRlID0+IHtcbiAgICBsZXQgdG9vbHRpcHMgPSBzdGF0ZS5mYWNldChzaG93SG92ZXJUb29sdGlwKTtcbiAgICBpZiAodG9vbHRpcHMubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBwb3M6IE1hdGgubWluKC4uLnRvb2x0aXBzLm1hcCh0ID0+IHQucG9zKSksXG4gICAgICAgIGVuZDogTWF0aC5tYXgoLi4udG9vbHRpcHMubWFwKHQgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSB0LmVuZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdC5wb3M7IH0pKSxcbiAgICAgICAgY3JlYXRlOiBIb3ZlclRvb2x0aXBIb3N0LmNyZWF0ZSxcbiAgICAgICAgYWJvdmU6IHRvb2x0aXBzWzBdLmFib3ZlLFxuICAgICAgICBhcnJvdzogdG9vbHRpcHMuc29tZSh0ID0+IHQuYXJyb3cpLFxuICAgIH07XG59KTtcbmNsYXNzIEhvdmVyUGx1Z2luIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBzb3VyY2UsIGZpZWxkLCBzZXRIb3ZlciwgaG92ZXJUaW1lKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XG4gICAgICAgIHRoaXMuc2V0SG92ZXIgPSBzZXRIb3ZlcjtcbiAgICAgICAgdGhpcy5ob3ZlclRpbWUgPSBob3ZlclRpbWU7XG4gICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMucmVzdGFydFRpbWVvdXQgPSAtMTtcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0TW92ZSA9IHsgeDogMCwgeTogMCwgdGFyZ2V0OiB2aWV3LmRvbSwgdGltZTogMCB9O1xuICAgICAgICB0aGlzLmNoZWNrSG92ZXIgPSB0aGlzLmNoZWNrSG92ZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgdGhpcy5tb3VzZWxlYXZlID0gdGhpcy5tb3VzZWxlYXZlLmJpbmQodGhpcykpO1xuICAgICAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW91c2Vtb3ZlID0gdGhpcy5tb3VzZW1vdmUuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZykge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc3RhcnRUaW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMucmVzdGFydFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3RhcnRIb3ZlcigpLCAyMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5zdGF0ZS5maWVsZCh0aGlzLmZpZWxkKTtcbiAgICB9XG4gICAgY2hlY2tIb3ZlcigpIHtcbiAgICAgICAgdGhpcy5ob3ZlclRpbWVvdXQgPSAtMTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGhvdmVyZWQgPSBEYXRlLm5vdygpIC0gdGhpcy5sYXN0TW92ZS50aW1lO1xuICAgICAgICBpZiAoaG92ZXJlZCA8IHRoaXMuaG92ZXJUaW1lKVxuICAgICAgICAgICAgdGhpcy5ob3ZlclRpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMuY2hlY2tIb3ZlciwgdGhpcy5ob3ZlclRpbWUgLSBob3ZlcmVkKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5zdGFydEhvdmVyKCk7XG4gICAgfVxuICAgIHN0YXJ0SG92ZXIoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc3RhcnRUaW1lb3V0KTtcbiAgICAgICAgbGV0IHsgdmlldywgbGFzdE1vdmUgfSA9IHRoaXM7XG4gICAgICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3Lm5lYXJlc3QobGFzdE1vdmUudGFyZ2V0KTtcbiAgICAgICAgaWYgKCFkZXNjKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgcG9zLCBzaWRlID0gMTtcbiAgICAgICAgaWYgKGRlc2MgaW5zdGFuY2VvZiBXaWRnZXRWaWV3KSB7XG4gICAgICAgICAgICBwb3MgPSBkZXNjLnBvc0F0U3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwb3MgPSB2aWV3LnBvc0F0Q29vcmRzKGxhc3RNb3ZlKTtcbiAgICAgICAgICAgIGlmIChwb3MgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgcG9zQ29vcmRzID0gdmlldy5jb29yZHNBdFBvcyhwb3MpO1xuICAgICAgICAgICAgaWYgKCFwb3NDb29yZHMgfHxcbiAgICAgICAgICAgICAgICBsYXN0TW92ZS55IDwgcG9zQ29vcmRzLnRvcCB8fCBsYXN0TW92ZS55ID4gcG9zQ29vcmRzLmJvdHRvbSB8fFxuICAgICAgICAgICAgICAgIGxhc3RNb3ZlLnggPCBwb3NDb29yZHMubGVmdCAtIHZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoIHx8XG4gICAgICAgICAgICAgICAgbGFzdE1vdmUueCA+IHBvc0Nvb3Jkcy5yaWdodCArIHZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBiaWRpID0gdmlldy5iaWRpU3BhbnModmlldy5zdGF0ZS5kb2MubGluZUF0KHBvcykpLmZpbmQocyA9PiBzLmZyb20gPD0gcG9zICYmIHMudG8gPj0gcG9zKTtcbiAgICAgICAgICAgIGxldCBydGwgPSBiaWRpICYmIGJpZGkuZGlyID09IERpcmVjdGlvbi5SVEwgPyAtMSA6IDE7XG4gICAgICAgICAgICBzaWRlID0gKGxhc3RNb3ZlLnggPCBwb3NDb29yZHMubGVmdCA/IC1ydGwgOiBydGwpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVuID0gdGhpcy5zb3VyY2UodmlldywgcG9zLCBzaWRlKTtcbiAgICAgICAgaWYgKG9wZW4gPT09IG51bGwgfHwgb3BlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3Blbi50aGVuKSB7XG4gICAgICAgICAgICBsZXQgcGVuZGluZyA9IHRoaXMucGVuZGluZyA9IHsgcG9zIH07XG4gICAgICAgICAgICBvcGVuLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nID09IHBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiAhKEFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiAhcmVzdWx0Lmxlbmd0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdGhpcy5zZXRIb3Zlci5vZihBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XSkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZSA9PiBsb2dFeGNlcHRpb24odmlldy5zdGF0ZSwgZSwgXCJob3ZlciB0b29sdGlwXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcGVuICYmICEoQXJyYXkuaXNBcnJheShvcGVuKSAmJiAhb3Blbi5sZW5ndGgpKSB7XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdGhpcy5zZXRIb3Zlci5vZihBcnJheS5pc0FycmF5KG9wZW4pID8gb3BlbiA6IFtvcGVuXSkgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRvb2x0aXAoKSB7XG4gICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLnZpZXcucGx1Z2luKHRvb2x0aXBQbHVnaW4pO1xuICAgICAgICBsZXQgaW5kZXggPSBwbHVnaW4gPyBwbHVnaW4ubWFuYWdlci50b29sdGlwcy5maW5kSW5kZXgodCA9PiB0LmNyZWF0ZSA9PSBIb3ZlclRvb2x0aXBIb3N0LmNyZWF0ZSkgOiAtMTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID4gLTEgPyBwbHVnaW4ubWFuYWdlci50b29sdGlwVmlld3NbaW5kZXhdIDogbnVsbDtcbiAgICB9XG4gICAgbW91c2Vtb3ZlKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHRoaXMubGFzdE1vdmUgPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFksIHRhcmdldDogZXZlbnQudGFyZ2V0LCB0aW1lOiBEYXRlLm5vdygpIH07XG4gICAgICAgIGlmICh0aGlzLmhvdmVyVGltZW91dCA8IDApXG4gICAgICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5jaGVja0hvdmVyLCB0aGlzLmhvdmVyVGltZSk7XG4gICAgICAgIGxldCB7IGFjdGl2ZSwgdG9vbHRpcCB9ID0gdGhpcztcbiAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGggJiYgdG9vbHRpcCAmJiAhaXNJblRvb2x0aXAodG9vbHRpcC5kb20sIGV2ZW50KSB8fCB0aGlzLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIGxldCB7IHBvcyB9ID0gYWN0aXZlWzBdIHx8IHRoaXMucGVuZGluZywgZW5kID0gKF9iID0gKF9hID0gYWN0aXZlWzBdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBwb3M7XG4gICAgICAgICAgICBpZiAoKHBvcyA9PSBlbmQgPyB0aGlzLnZpZXcucG9zQXRDb29yZHModGhpcy5sYXN0TW92ZSkgIT0gcG9zXG4gICAgICAgICAgICAgICAgOiAhaXNPdmVyUmFuZ2UodGhpcy52aWV3LCBwb3MsIGVuZCwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdGhpcy5zZXRIb3Zlci5vZihbXSkgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBtb3VzZWxlYXZlKGV2ZW50KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmhvdmVyVGltZW91dCk7XG4gICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gLTE7XG4gICAgICAgIGxldCB7IGFjdGl2ZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCB7IHRvb2x0aXAgfSA9IHRoaXM7XG4gICAgICAgICAgICBsZXQgaW5Ub29sdGlwID0gdG9vbHRpcCAmJiB0b29sdGlwLmRvbS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgICAgIGlmICghaW5Ub29sdGlwKVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YoW10pIH0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMud2F0Y2hUb29sdGlwTGVhdmUodG9vbHRpcC5kb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdhdGNoVG9vbHRpcExlYXZlKHRvb2x0aXApIHtcbiAgICAgICAgbGV0IHdhdGNoID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0b29sdGlwLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHdhdGNoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZS5sZW5ndGggJiYgIXRoaXMudmlldy5kb20uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdGhpcy5zZXRIb3Zlci5vZihbXSkgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRvb2x0aXAuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgd2F0Y2gpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ob3ZlclRpbWVvdXQpO1xuICAgICAgICB0aGlzLnZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHRoaXMubW91c2VsZWF2ZSk7XG4gICAgICAgIHRoaXMudmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdXNlbW92ZSk7XG4gICAgfVxufVxuY29uc3QgdG9vbHRpcE1hcmdpbiA9IDQ7XG5mdW5jdGlvbiBpc0luVG9vbHRpcCh0b29sdGlwLCBldmVudCkge1xuICAgIGxldCB7IGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSB9ID0gdG9vbHRpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgYXJyb3c7XG4gICAgaWYgKGFycm93ID0gdG9vbHRpcC5xdWVyeVNlbGVjdG9yKFwiLmNtLXRvb2x0aXAtYXJyb3dcIikpIHtcbiAgICAgICAgbGV0IGFycm93UmVjdCA9IGFycm93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0b3AgPSBNYXRoLm1pbihhcnJvd1JlY3QudG9wLCB0b3ApO1xuICAgICAgICBib3R0b20gPSBNYXRoLm1heChhcnJvd1JlY3QuYm90dG9tLCBib3R0b20pO1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnQuY2xpZW50WCA+PSBsZWZ0IC0gdG9vbHRpcE1hcmdpbiAmJiBldmVudC5jbGllbnRYIDw9IHJpZ2h0ICsgdG9vbHRpcE1hcmdpbiAmJlxuICAgICAgICBldmVudC5jbGllbnRZID49IHRvcCAtIHRvb2x0aXBNYXJnaW4gJiYgZXZlbnQuY2xpZW50WSA8PSBib3R0b20gKyB0b29sdGlwTWFyZ2luO1xufVxuZnVuY3Rpb24gaXNPdmVyUmFuZ2UodmlldywgZnJvbSwgdG8sIHgsIHksIG1hcmdpbikge1xuICAgIGxldCByZWN0ID0gdmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IGRvY0JvdHRvbSA9IHZpZXcuZG9jdW1lbnRUb3AgKyB2aWV3LmRvY3VtZW50UGFkZGluZy50b3AgKyB2aWV3LmNvbnRlbnRIZWlnaHQ7XG4gICAgaWYgKHJlY3QubGVmdCA+IHggfHwgcmVjdC5yaWdodCA8IHggfHwgcmVjdC50b3AgPiB5IHx8IE1hdGgubWluKHJlY3QuYm90dG9tLCBkb2NCb3R0b20pIDwgeSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBwb3MgPSB2aWV3LnBvc0F0Q29vcmRzKHsgeCwgeSB9LCBmYWxzZSk7XG4gICAgcmV0dXJuIHBvcyA+PSBmcm9tICYmIHBvcyA8PSB0bztcbn1cbi8qKlxuU2V0IHVwIGEgaG92ZXIgdG9vbHRpcCwgd2hpY2ggc2hvd3MgdXAgd2hlbiB0aGUgcG9pbnRlciBob3ZlcnNcbm92ZXIgcmFuZ2VzIG9mIHRleHQuIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgbW91c2UgaG92ZXJzXG5vdmVyIHRoZSBkb2N1bWVudCB0ZXh0LiBJdCBzaG91bGQsIGlmIHRoZXJlIGlzIGEgdG9vbHRpcFxuYXNzb2NpYXRlZCB3aXRoIHBvc2l0aW9uIGBwb3NgLCByZXR1cm4gdGhlIHRvb2x0aXAgZGVzY3JpcHRpb25cbihlaXRoZXIgZGlyZWN0bHkgb3IgaW4gYSBwcm9taXNlKS4gVGhlIGBzaWRlYCBhcmd1bWVudCBpbmRpY2F0ZXNcbm9uIHdoaWNoIHNpZGUgb2YgdGhlIHBvc2l0aW9uIHRoZSBwb2ludGVyIGlzXHUyMDE0aXQgd2lsbCBiZSAtMSBpZiB0aGVcbnBvaW50ZXIgaXMgYmVmb3JlIHRoZSBwb3NpdGlvbiwgMSBpZiBhZnRlciB0aGUgcG9zaXRpb24uXG5cbk5vdGUgdGhhdCBhbGwgaG92ZXIgdG9vbHRpcHMgYXJlIGhvc3RlZCB3aXRoaW4gYSBzaW5nbGUgdG9vbHRpcFxuY29udGFpbmVyIGVsZW1lbnQuIFRoaXMgYWxsb3dzIG11bHRpcGxlIHRvb2x0aXBzIG92ZXIgdGhlIHNhbWVcbnJhbmdlIHRvIGJlIFwibWVyZ2VkXCIgdG9nZXRoZXIgd2l0aG91dCBvdmVybGFwcGluZy5cblxuVGhlIHJldHVybiB2YWx1ZSBpcyBhIHZhbGlkIFtlZGl0b3IgZXh0ZW5zaW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkV4dGVuc2lvbilcbmJ1dCBhbHNvIHByb3ZpZGVzIGFuIGBhY3RpdmVgIHByb3BlcnR5IGhvbGRpbmcgYSBzdGF0ZSBmaWVsZCB0aGF0XG5jYW4gYmUgdXNlZCB0byByZWFkIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRvb2x0aXBzIHByb2R1Y2VkIGJ5IHRoaXNcbmV4dGVuc2lvbi5cbiovXG5mdW5jdGlvbiBob3ZlclRvb2x0aXAoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgc2V0SG92ZXIgPSBTdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbiAgICBsZXQgaG92ZXJTdGF0ZSA9IFN0YXRlRmllbGQuZGVmaW5lKHtcbiAgICAgICAgY3JlYXRlKCkgeyByZXR1cm4gW107IH0sXG4gICAgICAgIHVwZGF0ZSh2YWx1ZSwgdHIpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5oaWRlT25DaGFuZ2UgJiYgKHRyLmRvY0NoYW5nZWQgfHwgdHIuc2VsZWN0aW9uKSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmhpZGVPbilcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5maWx0ZXIodiA9PiAhb3B0aW9ucy5oaWRlT24odHIsIHYpKTtcbiAgICAgICAgICAgICAgICBpZiAodHIuZG9jQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFwcGVkID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHRvb2x0aXAgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdQb3MgPSB0ci5jaGFuZ2VzLm1hcFBvcyh0b29sdGlwLnBvcywgLTEsIE1hcE1vZGUuVHJhY2tEZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BvcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvcHkgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHRvb2x0aXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkucG9zID0gbmV3UG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3B5LmVuZCAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5LmVuZCA9IHRyLmNoYW5nZXMubWFwUG9zKGNvcHkuZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWQucHVzaChjb3B5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hcHBlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgdHIuZWZmZWN0cykge1xuICAgICAgICAgICAgICAgIGlmIChlZmZlY3QuaXMoc2V0SG92ZXIpKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVmZmVjdC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LmlzKGNsb3NlSG92ZXJUb29sdGlwRWZmZWN0KSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJvdmlkZTogZiA9PiBzaG93SG92ZXJUb29sdGlwLmZyb20oZilcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhY3RpdmU6IGhvdmVyU3RhdGUsXG4gICAgICAgIGV4dGVuc2lvbjogW1xuICAgICAgICAgICAgaG92ZXJTdGF0ZSxcbiAgICAgICAgICAgIFZpZXdQbHVnaW4uZGVmaW5lKHZpZXcgPT4gbmV3IEhvdmVyUGx1Z2luKHZpZXcsIHNvdXJjZSwgaG92ZXJTdGF0ZSwgc2V0SG92ZXIsIG9wdGlvbnMuaG92ZXJUaW1lIHx8IDMwMCAvKiBIb3Zlci5UaW1lICovKSksXG4gICAgICAgICAgICBzaG93SG92ZXJUb29sdGlwSG9zdFxuICAgICAgICBdXG4gICAgfTtcbn1cbi8qKlxuR2V0IHRoZSBhY3RpdmUgdG9vbHRpcCB2aWV3IGZvciBhIGdpdmVuIHRvb2x0aXAsIGlmIGF2YWlsYWJsZS5cbiovXG5mdW5jdGlvbiBnZXRUb29sdGlwKHZpZXcsIHRvb2x0aXApIHtcbiAgICBsZXQgcGx1Z2luID0gdmlldy5wbHVnaW4odG9vbHRpcFBsdWdpbik7XG4gICAgaWYgKCFwbHVnaW4pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBmb3VuZCA9IHBsdWdpbi5tYW5hZ2VyLnRvb2x0aXBzLmluZGV4T2YodG9vbHRpcCk7XG4gICAgcmV0dXJuIGZvdW5kIDwgMCA/IG51bGwgOiBwbHVnaW4ubWFuYWdlci50b29sdGlwVmlld3NbZm91bmRdO1xufVxuLyoqXG5SZXR1cm5zIHRydWUgaWYgYW55IGhvdmVyIHRvb2x0aXBzIGFyZSBjdXJyZW50bHkgYWN0aXZlLlxuKi9cbmZ1bmN0aW9uIGhhc0hvdmVyVG9vbHRpcHMoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuZmFjZXQoc2hvd0hvdmVyVG9vbHRpcCkuc29tZSh4ID0+IHgpO1xufVxuY29uc3QgY2xvc2VIb3ZlclRvb2x0aXBFZmZlY3QgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4vKipcblRyYW5zYWN0aW9uIGVmZmVjdCB0aGF0IGNsb3NlcyBhbGwgaG92ZXIgdG9vbHRpcHMuXG4qL1xuY29uc3QgY2xvc2VIb3ZlclRvb2x0aXBzID0gLypAX19QVVJFX18qL2Nsb3NlSG92ZXJUb29sdGlwRWZmZWN0Lm9mKG51bGwpO1xuLyoqXG5UZWxsIHRoZSB0b29sdGlwIGV4dGVuc2lvbiB0byByZWNvbXB1dGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBhY3RpdmVcbnRvb2x0aXBzLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBzb21ldGhpbmcgaGFwcGVucyAoc3VjaCBhcyBhXG5yZS1wb3NpdGlvbmluZyBvciBDU1MgY2hhbmdlIGFmZmVjdGluZyB0aGUgZWRpdG9yKSB0aGF0IGNvdWxkXG5pbnZhbGlkYXRlIHRoZSBleGlzdGluZyB0b29sdGlwIHBvc2l0aW9ucy5cbiovXG5mdW5jdGlvbiByZXBvc2l0aW9uVG9vbHRpcHModmlldykge1xuICAgIGxldCBwbHVnaW4gPSB2aWV3LnBsdWdpbih0b29sdGlwUGx1Z2luKTtcbiAgICBpZiAocGx1Z2luKVxuICAgICAgICBwbHVnaW4ubWF5YmVNZWFzdXJlKCk7XG59XG5cbmNvbnN0IHBhbmVsQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZShjb25maWdzKSB7XG4gICAgICAgIGxldCB0b3BDb250YWluZXIsIGJvdHRvbUNvbnRhaW5lcjtcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjb25maWdzKSB7XG4gICAgICAgICAgICB0b3BDb250YWluZXIgPSB0b3BDb250YWluZXIgfHwgYy50b3BDb250YWluZXI7XG4gICAgICAgICAgICBib3R0b21Db250YWluZXIgPSBib3R0b21Db250YWluZXIgfHwgYy5ib3R0b21Db250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdG9wQ29udGFpbmVyLCBib3R0b21Db250YWluZXIgfTtcbiAgICB9XG59KTtcbi8qKlxuQ29uZmlndXJlcyB0aGUgcGFuZWwtbWFuYWdpbmcgZXh0ZW5zaW9uLlxuKi9cbmZ1bmN0aW9uIHBhbmVscyhjb25maWcpIHtcbiAgICByZXR1cm4gY29uZmlnID8gW3BhbmVsQ29uZmlnLm9mKGNvbmZpZyldIDogW107XG59XG4vKipcbkdldCB0aGUgYWN0aXZlIHBhbmVsIGNyZWF0ZWQgYnkgdGhlIGdpdmVuIGNvbnN0cnVjdG9yLCBpZiBhbnkuXG5UaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB5b3UgbmVlZCBhY2Nlc3MgdG8geW91ciBwYW5lbHMnIERPTVxuc3RydWN0dXJlLlxuKi9cbmZ1bmN0aW9uIGdldFBhbmVsKHZpZXcsIHBhbmVsKSB7XG4gICAgbGV0IHBsdWdpbiA9IHZpZXcucGx1Z2luKHBhbmVsUGx1Z2luKTtcbiAgICBsZXQgaW5kZXggPSBwbHVnaW4gPyBwbHVnaW4uc3BlY3MuaW5kZXhPZihwYW5lbCkgOiAtMTtcbiAgICByZXR1cm4gaW5kZXggPiAtMSA/IHBsdWdpbi5wYW5lbHNbaW5kZXhdIDogbnVsbDtcbn1cbmNvbnN0IHBhbmVsUGx1Z2luID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSB2aWV3LnN0YXRlLmZhY2V0KHNob3dQYW5lbCk7XG4gICAgICAgIHRoaXMuc3BlY3MgPSB0aGlzLmlucHV0LmZpbHRlcihzID0+IHMpO1xuICAgICAgICB0aGlzLnBhbmVscyA9IHRoaXMuc3BlY3MubWFwKHNwZWMgPT4gc3BlYyh2aWV3KSk7XG4gICAgICAgIGxldCBjb25mID0gdmlldy5zdGF0ZS5mYWNldChwYW5lbENvbmZpZyk7XG4gICAgICAgIHRoaXMudG9wID0gbmV3IFBhbmVsR3JvdXAodmlldywgdHJ1ZSwgY29uZi50b3BDb250YWluZXIpO1xuICAgICAgICB0aGlzLmJvdHRvbSA9IG5ldyBQYW5lbEdyb3VwKHZpZXcsIGZhbHNlLCBjb25mLmJvdHRvbUNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMudG9wLnN5bmModGhpcy5wYW5lbHMuZmlsdGVyKHAgPT4gcC50b3ApKTtcbiAgICAgICAgdGhpcy5ib3R0b20uc3luYyh0aGlzLnBhbmVscy5maWx0ZXIocCA9PiAhcC50b3ApKTtcbiAgICAgICAgZm9yIChsZXQgcCBvZiB0aGlzLnBhbmVscykge1xuICAgICAgICAgICAgcC5kb20uY2xhc3NMaXN0LmFkZChcImNtLXBhbmVsXCIpO1xuICAgICAgICAgICAgaWYgKHAubW91bnQpXG4gICAgICAgICAgICAgICAgcC5tb3VudCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IGNvbmYgPSB1cGRhdGUuc3RhdGUuZmFjZXQocGFuZWxDb25maWcpO1xuICAgICAgICBpZiAodGhpcy50b3AuY29udGFpbmVyICE9IGNvbmYudG9wQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnRvcC5zeW5jKFtdKTtcbiAgICAgICAgICAgIHRoaXMudG9wID0gbmV3IFBhbmVsR3JvdXAodXBkYXRlLnZpZXcsIHRydWUsIGNvbmYudG9wQ29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ib3R0b20uY29udGFpbmVyICE9IGNvbmYuYm90dG9tQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbS5zeW5jKFtdKTtcbiAgICAgICAgICAgIHRoaXMuYm90dG9tID0gbmV3IFBhbmVsR3JvdXAodXBkYXRlLnZpZXcsIGZhbHNlLCBjb25mLmJvdHRvbUNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b3Auc3luY0NsYXNzZXMoKTtcbiAgICAgICAgdGhpcy5ib3R0b20uc3luY0NsYXNzZXMoKTtcbiAgICAgICAgbGV0IGlucHV0ID0gdXBkYXRlLnN0YXRlLmZhY2V0KHNob3dQYW5lbCk7XG4gICAgICAgIGlmIChpbnB1dCAhPSB0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICBsZXQgc3BlY3MgPSBpbnB1dC5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgICAgIGxldCBwYW5lbHMgPSBbXSwgdG9wID0gW10sIGJvdHRvbSA9IFtdLCBtb3VudCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgc3BlYyBvZiBzcGVjcykge1xuICAgICAgICAgICAgICAgIGxldCBrbm93biA9IHRoaXMuc3BlY3MuaW5kZXhPZihzcGVjKSwgcGFuZWw7XG4gICAgICAgICAgICAgICAgaWYgKGtub3duIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbCA9IHNwZWModXBkYXRlLnZpZXcpO1xuICAgICAgICAgICAgICAgICAgICBtb3VudC5wdXNoKHBhbmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsID0gdGhpcy5wYW5lbHNba25vd25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFuZWwudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhbmVscy5wdXNoKHBhbmVsKTtcbiAgICAgICAgICAgICAgICAocGFuZWwudG9wID8gdG9wIDogYm90dG9tKS5wdXNoKHBhbmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3BlY3MgPSBzcGVjcztcbiAgICAgICAgICAgIHRoaXMucGFuZWxzID0gcGFuZWxzO1xuICAgICAgICAgICAgdGhpcy50b3Auc3luYyh0b3ApO1xuICAgICAgICAgICAgdGhpcy5ib3R0b20uc3luYyhib3R0b20pO1xuICAgICAgICAgICAgZm9yIChsZXQgcCBvZiBtb3VudCkge1xuICAgICAgICAgICAgICAgIHAuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1wYW5lbFwiKTtcbiAgICAgICAgICAgICAgICBpZiAocC5tb3VudClcbiAgICAgICAgICAgICAgICAgICAgcC5tb3VudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgcCBvZiB0aGlzLnBhbmVscylcbiAgICAgICAgICAgICAgICBpZiAocC51cGRhdGUpXG4gICAgICAgICAgICAgICAgICAgIHAudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy50b3Auc3luYyhbXSk7XG4gICAgICAgIHRoaXMuYm90dG9tLnN5bmMoW10pO1xuICAgIH1cbn0sIHtcbiAgICBwcm92aWRlOiBwbHVnaW4gPT4gRWRpdG9yVmlldy5zY3JvbGxNYXJnaW5zLm9mKHZpZXcgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSB2aWV3LnBsdWdpbihwbHVnaW4pO1xuICAgICAgICByZXR1cm4gdmFsdWUgJiYgeyB0b3A6IHZhbHVlLnRvcC5zY3JvbGxNYXJnaW4oKSwgYm90dG9tOiB2YWx1ZS5ib3R0b20uc2Nyb2xsTWFyZ2luKCkgfTtcbiAgICB9KVxufSk7XG5jbGFzcyBQYW5lbEdyb3VwIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCB0b3AsIGNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICAgIHRoaXMuZG9tID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNsYXNzZXMgPSBcIlwiO1xuICAgICAgICB0aGlzLnBhbmVscyA9IFtdO1xuICAgICAgICB0aGlzLnN5bmNDbGFzc2VzKCk7XG4gICAgfVxuICAgIHN5bmMocGFuZWxzKSB7XG4gICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wYW5lbHMpXG4gICAgICAgICAgICBpZiAocC5kZXN0cm95ICYmIHBhbmVscy5pbmRleE9mKHApIDwgMClcbiAgICAgICAgICAgICAgICBwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSBwYW5lbHM7XG4gICAgICAgIHRoaXMuc3luY0RPTSgpO1xuICAgIH1cbiAgICBzeW5jRE9NKCkge1xuICAgICAgICBpZiAodGhpcy5wYW5lbHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IHRoaXMudG9wID8gXCJjbS1wYW5lbHMgY20tcGFuZWxzLXRvcFwiIDogXCJjbS1wYW5lbHMgY20tcGFuZWxzLWJvdHRvbVwiO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGVbdGhpcy50b3AgPyBcInRvcFwiIDogXCJib3R0b21cIl0gPSBcIjBcIjtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmNvbnRhaW5lciB8fCB0aGlzLnZpZXcuZG9tO1xuICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLmRvbSwgdGhpcy50b3AgPyBwYXJlbnQuZmlyc3RDaGlsZCA6IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdXJET00gPSB0aGlzLmRvbS5maXJzdENoaWxkO1xuICAgICAgICBmb3IgKGxldCBwYW5lbCBvZiB0aGlzLnBhbmVscykge1xuICAgICAgICAgICAgaWYgKHBhbmVsLmRvbS5wYXJlbnROb2RlID09IHRoaXMuZG9tKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1ckRPTSAhPSBwYW5lbC5kb20pXG4gICAgICAgICAgICAgICAgICAgIGN1ckRPTSA9IHJtKGN1ckRPTSk7XG4gICAgICAgICAgICAgICAgY3VyRE9NID0gY3VyRE9NLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb20uaW5zZXJ0QmVmb3JlKHBhbmVsLmRvbSwgY3VyRE9NKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoY3VyRE9NKVxuICAgICAgICAgICAgY3VyRE9NID0gcm0oY3VyRE9NKTtcbiAgICB9XG4gICAgc2Nyb2xsTWFyZ2luKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZG9tIHx8IHRoaXMuY29udGFpbmVyID8gMFxuICAgICAgICAgICAgOiBNYXRoLm1heCgwLCB0aGlzLnRvcCA/XG4gICAgICAgICAgICAgICAgdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIC0gTWF0aC5tYXgoMCwgdGhpcy52aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApIDpcbiAgICAgICAgICAgICAgICBNYXRoLm1pbihpbm5lckhlaWdodCwgdGhpcy52aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20pIC0gdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wKTtcbiAgICB9XG4gICAgc3luY0NsYXNzZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb250YWluZXIgfHwgdGhpcy5jbGFzc2VzID09IHRoaXMudmlldy50aGVtZUNsYXNzZXMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZvciAobGV0IGNscyBvZiB0aGlzLmNsYXNzZXMuc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKGNscyk7XG4gICAgICAgIGZvciAobGV0IGNscyBvZiAodGhpcy5jbGFzc2VzID0gdGhpcy52aWV3LnRoZW1lQ2xhc3Nlcykuc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGNscyk7XG4gICAgfVxufVxuZnVuY3Rpb24gcm0obm9kZSkge1xuICAgIGxldCBuZXh0ID0gbm9kZS5uZXh0U2libGluZztcbiAgICBub2RlLnJlbW92ZSgpO1xuICAgIHJldHVybiBuZXh0O1xufVxuLyoqXG5PcGVuaW5nIGEgcGFuZWwgaXMgZG9uZSBieSBwcm92aWRpbmcgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3JcbnRoZSBwYW5lbCB0aHJvdWdoIHRoaXMgZmFjZXQuIChUaGUgcGFuZWwgaXMgY2xvc2VkIGFnYWluIHdoZW4gaXRzXG5jb25zdHJ1Y3RvciBpcyBubyBsb25nZXIgcHJvdmlkZWQuKSBWYWx1ZXMgb2YgYG51bGxgIGFyZSBpZ25vcmVkLlxuKi9cbmNvbnN0IHNob3dQYW5lbCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGVuYWJsZXM6IHBhbmVsUGx1Z2luXG59KTtcblxuLyoqXG5BIGd1dHRlciBtYXJrZXIgcmVwcmVzZW50cyBhIGJpdCBvZiBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byBhIGxpbmVcbmluIGEgc3BlY2lmaWMgZ3V0dGVyLiBZb3VyIG93biBjdXN0b20gbWFya2VycyBoYXZlIHRvIGV4dGVuZCB0aGlzXG5jbGFzcy5cbiovXG5jbGFzcyBHdXR0ZXJNYXJrZXIgZXh0ZW5kcyBSYW5nZVZhbHVlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhcmUob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHwgdGhpcy5jb25zdHJ1Y3RvciA9PSBvdGhlci5jb25zdHJ1Y3RvciAmJiB0aGlzLmVxKG90aGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIG1hcmtlciB0byBhbm90aGVyIG1hcmtlciBvZiB0aGUgc2FtZSB0eXBlLlxuICAgICovXG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgQ2FsbGVkIGlmIHRoZSBtYXJrZXIgaGFzIGEgYHRvRE9NYCBtZXRob2QgYW5kIGl0cyByZXByZXNlbnRhdGlvblxuICAgIHdhcyByZW1vdmVkIGZyb20gYSBndXR0ZXIuXG4gICAgKi9cbiAgICBkZXN0cm95KGRvbSkgeyB9XG59XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLmVsZW1lbnRDbGFzcyA9IFwiXCI7XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLnRvRE9NID0gdW5kZWZpbmVkO1xuR3V0dGVyTWFya2VyLnByb3RvdHlwZS5tYXBNb2RlID0gTWFwTW9kZS5UcmFja0JlZm9yZTtcbkd1dHRlck1hcmtlci5wcm90b3R5cGUuc3RhcnRTaWRlID0gR3V0dGVyTWFya2VyLnByb3RvdHlwZS5lbmRTaWRlID0gLTE7XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLnBvaW50ID0gdHJ1ZTtcbi8qKlxuRmFjZXQgdXNlZCB0byBhZGQgYSBjbGFzcyB0byBhbGwgZ3V0dGVyIGVsZW1lbnRzIGZvciBhIGdpdmVuIGxpbmUuXG5NYXJrZXJzIGdpdmVuIHRvIHRoaXMgZmFjZXQgc2hvdWxkIF9vbmx5XyBkZWZpbmUgYW5cbltgZWxlbWVudGNsYXNzYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3Lkd1dHRlck1hcmtlci5lbGVtZW50Q2xhc3MpLCBub3QgYVxuW2B0b0RPTWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5HdXR0ZXJNYXJrZXIudG9ET00pIChvciB0aGUgbWFya2VyIHdpbGwgYXBwZWFyXG5pbiBhbGwgZ3V0dGVycyBmb3IgdGhlIGxpbmUpLlxuKi9cbmNvbnN0IGd1dHRlckxpbmVDbGFzcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuRmFjZXQgdXNlZCB0byBhZGQgYSBjbGFzcyB0byBhbGwgZ3V0dGVyIGVsZW1lbnRzIG5leHQgdG8gYSB3aWRnZXQuXG5TaG91bGQgbm90IHByb3ZpZGUgd2lkZ2V0cyB3aXRoIGEgYHRvRE9NYCBtZXRob2QuXG4qL1xuY29uc3QgZ3V0dGVyV2lkZ2V0Q2xhc3MgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgICBjbGFzczogXCJcIixcbiAgICByZW5kZXJFbXB0eUVsZW1lbnRzOiBmYWxzZSxcbiAgICBlbGVtZW50U3R5bGU6IFwiXCIsXG4gICAgbWFya2VyczogKCkgPT4gUmFuZ2VTZXQuZW1wdHksXG4gICAgbGluZU1hcmtlcjogKCkgPT4gbnVsbCxcbiAgICB3aWRnZXRNYXJrZXI6ICgpID0+IG51bGwsXG4gICAgbGluZU1hcmtlckNoYW5nZTogbnVsbCxcbiAgICBpbml0aWFsU3BhY2VyOiBudWxsLFxuICAgIHVwZGF0ZVNwYWNlcjogbnVsbCxcbiAgICBkb21FdmVudEhhbmRsZXJzOiB7fVxufTtcbmNvbnN0IGFjdGl2ZUd1dHRlcnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcbkRlZmluZSBhbiBlZGl0b3IgZ3V0dGVyLiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGd1dHRlcnMgYXBwZWFyIGlzXG5kZXRlcm1pbmVkIGJ5IHRoZWlyIGV4dGVuc2lvbiBwcmlvcml0eS5cbiovXG5mdW5jdGlvbiBndXR0ZXIoY29uZmlnKSB7XG4gICAgcmV0dXJuIFtndXR0ZXJzKCksIGFjdGl2ZUd1dHRlcnMub2YoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cyksIGNvbmZpZykpXTtcbn1cbmNvbnN0IHVuZml4R3V0dGVycyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuc29tZSh4ID0+IHgpXG59KTtcbi8qKlxuVGhlIGd1dHRlci1kcmF3aW5nIHBsdWdpbiBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgd2hlbiB5b3UgYWRkIGFcbmd1dHRlciwgYnV0IHlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gZXhwbGljaXRseSBjb25maWd1cmUgaXQuXG5cblVubGVzcyBgZml4ZWRgIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGBmYWxzZWAsIHRoZSBndXR0ZXJzIGFyZVxuZml4ZWQsIG1lYW5pbmcgdGhleSBkb24ndCBzY3JvbGwgYWxvbmcgd2l0aCB0aGUgY29udGVudFxuaG9yaXpvbnRhbGx5IChleGNlcHQgb24gSW50ZXJuZXQgRXhwbG9yZXIsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydFxuQ1NTIFtgcG9zaXRpb246XG5zdGlja3lgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcG9zaXRpb24jc3RpY2t5KSkuXG4qL1xuZnVuY3Rpb24gZ3V0dGVycyhjb25maWcpIHtcbiAgICBsZXQgcmVzdWx0ID0gW1xuICAgICAgICBndXR0ZXJWaWV3LFxuICAgIF07XG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWcuZml4ZWQgPT09IGZhbHNlKVxuICAgICAgICByZXN1bHQucHVzaCh1bmZpeEd1dHRlcnMub2YodHJ1ZSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBndXR0ZXJWaWV3ID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMucHJldlZpZXdwb3J0ID0gdmlldy52aWV3cG9ydDtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWd1dHRlcnNcIjtcbiAgICAgICAgdGhpcy5kb20uc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS5taW5IZWlnaHQgPSAodGhpcy52aWV3LmNvbnRlbnRIZWlnaHQgLyB0aGlzLnZpZXcuc2NhbGVZKSArIFwicHhcIjtcbiAgICAgICAgdGhpcy5ndXR0ZXJzID0gdmlldy5zdGF0ZS5mYWNldChhY3RpdmVHdXR0ZXJzKS5tYXAoY29uZiA9PiBuZXcgU2luZ2xlR3V0dGVyVmlldyh2aWV3LCBjb25mKSk7XG4gICAgICAgIGZvciAobGV0IGd1dHRlciBvZiB0aGlzLmd1dHRlcnMpXG4gICAgICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZChndXR0ZXIuZG9tKTtcbiAgICAgICAgdGhpcy5maXhlZCA9ICF2aWV3LnN0YXRlLmZhY2V0KHVuZml4R3V0dGVycyk7XG4gICAgICAgIGlmICh0aGlzLmZpeGVkKSB7XG4gICAgICAgICAgICAvLyBGSVhNRSBJRTExIGZhbGxiYWNrLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgcG9zaXRpb246IHN0aWNreSxcbiAgICAgICAgICAgIC8vIGJ5IHVzaW5nIHBvc2l0aW9uOiByZWxhdGl2ZSArIGV2ZW50IGhhbmRsZXJzIHRoYXQgcmVhbGlnbiB0aGVcbiAgICAgICAgICAgIC8vIGd1dHRlciAob3IganVzdCBmb3JjZSBmaXhlZD1mYWxzZSBvbiBJRTExPylcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnBvc2l0aW9uID0gXCJzdGlja3lcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bmNHdXR0ZXJzKGZhbHNlKTtcbiAgICAgICAgdmlldy5zY3JvbGxET00uaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLCB2aWV3LmNvbnRlbnRET00pO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUd1dHRlcnModXBkYXRlKSkge1xuICAgICAgICAgICAgLy8gRGV0YWNoIGR1cmluZyBzeW5jIHdoZW4gdGhlIHZpZXdwb3J0IGNoYW5nZWQgc2lnbmlmaWNhbnRseVxuICAgICAgICAgICAgLy8gKHN1Y2ggYXMgZHVyaW5nIHNjcm9sbGluZyksIHNpbmNlIGZvciBsYXJnZSB1cGRhdGVzIHRoYXQgaXNcbiAgICAgICAgICAgIC8vIGZhc3Rlci5cbiAgICAgICAgICAgIGxldCB2cEEgPSB0aGlzLnByZXZWaWV3cG9ydCwgdnBCID0gdXBkYXRlLnZpZXcudmlld3BvcnQ7XG4gICAgICAgICAgICBsZXQgdnBPdmVybGFwID0gTWF0aC5taW4odnBBLnRvLCB2cEIudG8pIC0gTWF0aC5tYXgodnBBLmZyb20sIHZwQi5mcm9tKTtcbiAgICAgICAgICAgIHRoaXMuc3luY0d1dHRlcnModnBPdmVybGFwIDwgKHZwQi50byAtIHZwQi5mcm9tKSAqIDAuOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLm1pbkhlaWdodCA9ICh0aGlzLnZpZXcuY29udGVudEhlaWdodCAvIHRoaXMudmlldy5zY2FsZVkpICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnZpZXcuc3RhdGUuZmFjZXQodW5maXhHdXR0ZXJzKSAhPSAhdGhpcy5maXhlZCkge1xuICAgICAgICAgICAgdGhpcy5maXhlZCA9ICF0aGlzLmZpeGVkO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUucG9zaXRpb24gPSB0aGlzLmZpeGVkID8gXCJzdGlja3lcIiA6IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2Vmlld3BvcnQgPSB1cGRhdGUudmlldy52aWV3cG9ydDtcbiAgICB9XG4gICAgc3luY0d1dHRlcnMoZGV0YWNoKSB7XG4gICAgICAgIGxldCBhZnRlciA9IHRoaXMuZG9tLm5leHRTaWJsaW5nO1xuICAgICAgICBpZiAoZGV0YWNoKVxuICAgICAgICAgICAgdGhpcy5kb20ucmVtb3ZlKCk7XG4gICAgICAgIGxldCBsaW5lQ2xhc3NlcyA9IFJhbmdlU2V0Lml0ZXIodGhpcy52aWV3LnN0YXRlLmZhY2V0KGd1dHRlckxpbmVDbGFzcyksIHRoaXMudmlldy52aWV3cG9ydC5mcm9tKTtcbiAgICAgICAgbGV0IGNsYXNzU2V0ID0gW107XG4gICAgICAgIGxldCBjb250ZXh0cyA9IHRoaXMuZ3V0dGVycy5tYXAoZ3V0dGVyID0+IG5ldyBVcGRhdGVDb250ZXh0KGd1dHRlciwgdGhpcy52aWV3LnZpZXdwb3J0LCAtdGhpcy52aWV3LmRvY3VtZW50UGFkZGluZy50b3ApKTtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiB0aGlzLnZpZXcudmlld3BvcnRMaW5lQmxvY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2xhc3NTZXQubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGNsYXNzU2V0ID0gW107XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsaW5lLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiIG9mIGxpbmUudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYi50eXBlID09IEJsb2NrVHlwZS5UZXh0ICYmIGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlQ3Vyc29yKGxpbmVDbGFzc2VzLCBjbGFzc1NldCwgYi5mcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGN4IG9mIGNvbnRleHRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4LmxpbmUodGhpcy52aWV3LCBiLCBjbGFzc1NldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGIud2lkZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeC53aWRnZXQodGhpcy52aWV3LCBiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGxpbmUudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCkge1xuICAgICAgICAgICAgICAgIGFkdmFuY2VDdXJzb3IobGluZUNsYXNzZXMsIGNsYXNzU2V0LCBsaW5lLmZyb20pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGN4IG9mIGNvbnRleHRzKVxuICAgICAgICAgICAgICAgICAgICBjeC5saW5lKHRoaXMudmlldywgbGluZSwgY2xhc3NTZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGluZS53aWRnZXQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgICAgICAgICAgY3gud2lkZ2V0KHRoaXMudmlldywgbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICBjeC5maW5pc2goKTtcbiAgICAgICAgaWYgKGRldGFjaClcbiAgICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxET00uaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLCBhZnRlcik7XG4gICAgfVxuICAgIHVwZGF0ZUd1dHRlcnModXBkYXRlKSB7XG4gICAgICAgIGxldCBwcmV2ID0gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoYWN0aXZlR3V0dGVycyksIGN1ciA9IHVwZGF0ZS5zdGF0ZS5mYWNldChhY3RpdmVHdXR0ZXJzKTtcbiAgICAgICAgbGV0IGNoYW5nZSA9IHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5oZWlnaHRDaGFuZ2VkIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQgfHxcbiAgICAgICAgICAgICFSYW5nZVNldC5lcSh1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChndXR0ZXJMaW5lQ2xhc3MpLCB1cGRhdGUuc3RhdGUuZmFjZXQoZ3V0dGVyTGluZUNsYXNzKSwgdXBkYXRlLnZpZXcudmlld3BvcnQuZnJvbSwgdXBkYXRlLnZpZXcudmlld3BvcnQudG8pO1xuICAgICAgICBpZiAocHJldiA9PSBjdXIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGd1dHRlciBvZiB0aGlzLmd1dHRlcnMpXG4gICAgICAgICAgICAgICAgaWYgKGd1dHRlci51cGRhdGUodXBkYXRlKSlcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICBsZXQgZ3V0dGVycyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgY29uZiBvZiBjdXIpIHtcbiAgICAgICAgICAgICAgICBsZXQga25vd24gPSBwcmV2LmluZGV4T2YoY29uZik7XG4gICAgICAgICAgICAgICAgaWYgKGtub3duIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBndXR0ZXJzLnB1c2gobmV3IFNpbmdsZUd1dHRlclZpZXcodGhpcy52aWV3LCBjb25mKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmd1dHRlcnNba25vd25dLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBndXR0ZXJzLnB1c2godGhpcy5ndXR0ZXJzW2tub3duXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgZyBvZiB0aGlzLmd1dHRlcnMpIHtcbiAgICAgICAgICAgICAgICBnLmRvbS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3V0dGVycy5pbmRleE9mKGcpIDwgMClcbiAgICAgICAgICAgICAgICAgICAgZy5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBnIG9mIGd1dHRlcnMpXG4gICAgICAgICAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQoZy5kb20pO1xuICAgICAgICAgICAgdGhpcy5ndXR0ZXJzID0gZ3V0dGVycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hhbmdlO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGxldCB2aWV3IG9mIHRoaXMuZ3V0dGVycylcbiAgICAgICAgICAgIHZpZXcuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICB9XG59LCB7XG4gICAgcHJvdmlkZTogcGx1Z2luID0+IEVkaXRvclZpZXcuc2Nyb2xsTWFyZ2lucy5vZih2aWV3ID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gdmlldy5wbHVnaW4ocGx1Z2luKTtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS5ndXR0ZXJzLmxlbmd0aCA9PSAwIHx8ICF2YWx1ZS5maXhlZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFJcbiAgICAgICAgICAgID8geyBsZWZ0OiB2YWx1ZS5kb20ub2Zmc2V0V2lkdGggKiB2aWV3LnNjYWxlWCB9XG4gICAgICAgICAgICA6IHsgcmlnaHQ6IHZhbHVlLmRvbS5vZmZzZXRXaWR0aCAqIHZpZXcuc2NhbGVYIH07XG4gICAgfSlcbn0pO1xuZnVuY3Rpb24gYXNBcnJheSh2YWwpIHsgcmV0dXJuIChBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwgOiBbdmFsXSk7IH1cbmZ1bmN0aW9uIGFkdmFuY2VDdXJzb3IoY3Vyc29yLCBjb2xsZWN0LCBwb3MpIHtcbiAgICB3aGlsZSAoY3Vyc29yLnZhbHVlICYmIGN1cnNvci5mcm9tIDw9IHBvcykge1xuICAgICAgICBpZiAoY3Vyc29yLmZyb20gPT0gcG9zKVxuICAgICAgICAgICAgY29sbGVjdC5wdXNoKGN1cnNvci52YWx1ZSk7XG4gICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgfVxufVxuY2xhc3MgVXBkYXRlQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IoZ3V0dGVyLCB2aWV3cG9ydCwgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuZ3V0dGVyID0gZ3V0dGVyO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy5pID0gMDtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBSYW5nZVNldC5pdGVyKGd1dHRlci5tYXJrZXJzLCB2aWV3cG9ydC5mcm9tKTtcbiAgICB9XG4gICAgYWRkRWxlbWVudCh2aWV3LCBibG9jaywgbWFya2Vycykge1xuICAgICAgICBsZXQgeyBndXR0ZXIgfSA9IHRoaXMsIGFib3ZlID0gKGJsb2NrLnRvcCAtIHRoaXMuaGVpZ2h0KSAvIHZpZXcuc2NhbGVZLCBoZWlnaHQgPSBibG9jay5oZWlnaHQgLyB2aWV3LnNjYWxlWTtcbiAgICAgICAgaWYgKHRoaXMuaSA9PSBndXR0ZXIuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgbmV3RWx0ID0gbmV3IEd1dHRlckVsZW1lbnQodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG4gICAgICAgICAgICBndXR0ZXIuZWxlbWVudHMucHVzaChuZXdFbHQpO1xuICAgICAgICAgICAgZ3V0dGVyLmRvbS5hcHBlbmRDaGlsZChuZXdFbHQuZG9tKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGd1dHRlci5lbGVtZW50c1t0aGlzLmldLnVwZGF0ZSh2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhlaWdodCA9IGJsb2NrLmJvdHRvbTtcbiAgICAgICAgdGhpcy5pKys7XG4gICAgfVxuICAgIGxpbmUodmlldywgbGluZSwgZXh0cmFNYXJrZXJzKSB7XG4gICAgICAgIGxldCBsb2NhbE1hcmtlcnMgPSBbXTtcbiAgICAgICAgYWR2YW5jZUN1cnNvcih0aGlzLmN1cnNvciwgbG9jYWxNYXJrZXJzLCBsaW5lLmZyb20pO1xuICAgICAgICBpZiAoZXh0cmFNYXJrZXJzLmxlbmd0aClcbiAgICAgICAgICAgIGxvY2FsTWFya2VycyA9IGxvY2FsTWFya2Vycy5jb25jYXQoZXh0cmFNYXJrZXJzKTtcbiAgICAgICAgbGV0IGZvckxpbmUgPSB0aGlzLmd1dHRlci5jb25maWcubGluZU1hcmtlcih2aWV3LCBsaW5lLCBsb2NhbE1hcmtlcnMpO1xuICAgICAgICBpZiAoZm9yTGluZSlcbiAgICAgICAgICAgIGxvY2FsTWFya2Vycy51bnNoaWZ0KGZvckxpbmUpO1xuICAgICAgICBsZXQgZ3V0dGVyID0gdGhpcy5ndXR0ZXI7XG4gICAgICAgIGlmIChsb2NhbE1hcmtlcnMubGVuZ3RoID09IDAgJiYgIWd1dHRlci5jb25maWcucmVuZGVyRW1wdHlFbGVtZW50cylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5hZGRFbGVtZW50KHZpZXcsIGxpbmUsIGxvY2FsTWFya2Vycyk7XG4gICAgfVxuICAgIHdpZGdldCh2aWV3LCBibG9jaykge1xuICAgICAgICBsZXQgbWFya2VyID0gdGhpcy5ndXR0ZXIuY29uZmlnLndpZGdldE1hcmtlcih2aWV3LCBibG9jay53aWRnZXQsIGJsb2NrKSwgbWFya2VycyA9IG1hcmtlciA/IFttYXJrZXJdIDogbnVsbDtcbiAgICAgICAgZm9yIChsZXQgY2xzIG9mIHZpZXcuc3RhdGUuZmFjZXQoZ3V0dGVyV2lkZ2V0Q2xhc3MpKSB7XG4gICAgICAgICAgICBsZXQgbWFya2VyID0gY2xzKHZpZXcsIGJsb2NrLndpZGdldCwgYmxvY2spO1xuICAgICAgICAgICAgaWYgKG1hcmtlcilcbiAgICAgICAgICAgICAgICAobWFya2VycyB8fCAobWFya2VycyA9IFtdKSkucHVzaChtYXJrZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJrZXJzKVxuICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50KHZpZXcsIGJsb2NrLCBtYXJrZXJzKTtcbiAgICB9XG4gICAgZmluaXNoKCkge1xuICAgICAgICBsZXQgZ3V0dGVyID0gdGhpcy5ndXR0ZXI7XG4gICAgICAgIHdoaWxlIChndXR0ZXIuZWxlbWVudHMubGVuZ3RoID4gdGhpcy5pKSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IGd1dHRlci5lbGVtZW50cy5wb3AoKTtcbiAgICAgICAgICAgIGd1dHRlci5kb20ucmVtb3ZlQ2hpbGQobGFzdC5kb20pO1xuICAgICAgICAgICAgbGFzdC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBTaW5nbGVHdXR0ZXJWaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBjb25maWcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuZWxlbWVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5zcGFjZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tZ3V0dGVyXCIgKyAodGhpcy5jb25maWcuY2xhc3MgPyBcIiBcIiArIHRoaXMuY29uZmlnLmNsYXNzIDogXCJcIik7XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gY29uZmlnLmRvbUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFkZEV2ZW50TGlzdGVuZXIocHJvcCwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGV2ZW50LnRhcmdldCwgeTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IHRoaXMuZG9tICYmIHRoaXMuZG9tLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRhcmdldC5wYXJlbnROb2RlICE9IHRoaXMuZG9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB5ID0gKHJlY3QudG9wICsgcmVjdC5ib3R0b20pIC8gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBldmVudC5jbGllbnRZO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXRIZWlnaHQoeSAtIHZpZXcuZG9jdW1lbnRUb3ApO1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcuZG9tRXZlbnRIYW5kbGVyc1twcm9wXSh2aWV3LCBsaW5lLCBldmVudCkpXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtlcnMgPSBhc0FycmF5KGNvbmZpZy5tYXJrZXJzKHZpZXcpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5pbml0aWFsU3BhY2VyKSB7XG4gICAgICAgICAgICB0aGlzLnNwYWNlciA9IG5ldyBHdXR0ZXJFbGVtZW50KHZpZXcsIDAsIDAsIFtjb25maWcuaW5pdGlhbFNwYWNlcih2aWV3KV0pO1xuICAgICAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQodGhpcy5zcGFjZXIuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuc3BhY2VyLmRvbS5zdHlsZS5jc3NUZXh0ICs9IFwidmlzaWJpbGl0eTogaGlkZGVuOyBwb2ludGVyLWV2ZW50czogbm9uZVwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHByZXZNYXJrZXJzID0gdGhpcy5tYXJrZXJzO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBhc0FycmF5KHRoaXMuY29uZmlnLm1hcmtlcnModXBkYXRlLnZpZXcpKTtcbiAgICAgICAgaWYgKHRoaXMuc3BhY2VyICYmIHRoaXMuY29uZmlnLnVwZGF0ZVNwYWNlcikge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSB0aGlzLmNvbmZpZy51cGRhdGVTcGFjZXIodGhpcy5zcGFjZXIubWFya2Vyc1swXSwgdXBkYXRlKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGVkICE9IHRoaXMuc3BhY2VyLm1hcmtlcnNbMF0pXG4gICAgICAgICAgICAgICAgdGhpcy5zcGFjZXIudXBkYXRlKHVwZGF0ZS52aWV3LCAwLCAwLCBbdXBkYXRlZF0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2cCA9IHVwZGF0ZS52aWV3LnZpZXdwb3J0O1xuICAgICAgICByZXR1cm4gIVJhbmdlU2V0LmVxKHRoaXMubWFya2VycywgcHJldk1hcmtlcnMsIHZwLmZyb20sIHZwLnRvKSB8fFxuICAgICAgICAgICAgKHRoaXMuY29uZmlnLmxpbmVNYXJrZXJDaGFuZ2UgPyB0aGlzLmNvbmZpZy5saW5lTWFya2VyQ2hhbmdlKHVwZGF0ZSkgOiBmYWxzZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAobGV0IGVsdCBvZiB0aGlzLmVsZW1lbnRzKVxuICAgICAgICAgICAgZWx0LmRlc3Ryb3koKTtcbiAgICB9XG59XG5jbGFzcyBHdXR0ZXJFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gLTE7XG4gICAgICAgIHRoaXMuYWJvdmUgPSAwO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWd1dHRlckVsZW1lbnRcIjtcbiAgICAgICAgdGhpcy51cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG4gICAgfVxuICAgIHVwZGF0ZSh2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodCAhPSBoZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFib3ZlICE9IGFib3ZlKVxuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUubWFyZ2luVG9wID0gKHRoaXMuYWJvdmUgPSBhYm92ZSkgPyBhYm92ZSArIFwicHhcIiA6IFwiXCI7XG4gICAgICAgIGlmICghc2FtZU1hcmtlcnModGhpcy5tYXJrZXJzLCBtYXJrZXJzKSlcbiAgICAgICAgICAgIHRoaXMuc2V0TWFya2Vycyh2aWV3LCBtYXJrZXJzKTtcbiAgICB9XG4gICAgc2V0TWFya2Vycyh2aWV3LCBtYXJrZXJzKSB7XG4gICAgICAgIGxldCBjbHMgPSBcImNtLWd1dHRlckVsZW1lbnRcIiwgZG9tUG9zID0gdGhpcy5kb20uZmlyc3RDaGlsZDtcbiAgICAgICAgZm9yIChsZXQgaU5ldyA9IDAsIGlPbGQgPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBza2lwVG8gPSBpT2xkLCBtYXJrZXIgPSBpTmV3IDwgbWFya2Vycy5sZW5ndGggPyBtYXJrZXJzW2lOZXcrK10gOiBudWxsLCBtYXRjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAobWFya2VyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGMgPSBtYXJrZXIuZWxlbWVudENsYXNzO1xuICAgICAgICAgICAgICAgIGlmIChjKVxuICAgICAgICAgICAgICAgICAgICBjbHMgKz0gXCIgXCIgKyBjO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBpT2xkOyBpIDwgdGhpcy5tYXJrZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXJrZXJzW2ldLmNvbXBhcmUobWFya2VyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFRvID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNraXBUbyA9IHRoaXMubWFya2Vycy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoaU9sZCA8IHNraXBUbykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5tYXJrZXJzW2lPbGQrK107XG4gICAgICAgICAgICAgICAgaWYgKG5leHQudG9ET00pIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5kZXN0cm95KGRvbVBvcyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhZnRlciA9IGRvbVBvcy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgZG9tUG9zLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICBkb21Qb3MgPSBhZnRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1hcmtlcilcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChtYXJrZXIudG9ET00pIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZClcbiAgICAgICAgICAgICAgICAgICAgZG9tUG9zID0gZG9tUG9zLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uaW5zZXJ0QmVmb3JlKG1hcmtlci50b0RPTSh2aWV3KSwgZG9tUG9zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaGVkKVxuICAgICAgICAgICAgICAgIGlPbGQrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBjbHM7XG4gICAgICAgIHRoaXMubWFya2VycyA9IG1hcmtlcnM7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc2V0TWFya2VycyhudWxsLCBbXSk7IC8vIEZpcnN0IGFyZ3VtZW50IG5vdCB1c2VkIHVubGVzcyBjcmVhdGluZyBtYXJrZXJzXG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZU1hcmtlcnMoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCFhW2ldLmNvbXBhcmUoYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbkZhY2V0IHVzZWQgdG8gcHJvdmlkZSBtYXJrZXJzIHRvIHRoZSBsaW5lIG51bWJlciBndXR0ZXIuXG4qL1xuY29uc3QgbGluZU51bWJlck1hcmtlcnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcbkZhY2V0IHVzZWQgdG8gY3JlYXRlIG1hcmtlcnMgaW4gdGhlIGxpbmUgbnVtYmVyIGd1dHRlciBuZXh0IHRvIHdpZGdldHMuXG4qL1xuY29uc3QgbGluZU51bWJlcldpZGdldE1hcmtlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGxpbmVOdW1iZXJDb25maWcgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gY29tYmluZUNvbmZpZyh2YWx1ZXMsIHsgZm9ybWF0TnVtYmVyOiBTdHJpbmcsIGRvbUV2ZW50SGFuZGxlcnM6IHt9IH0sIHtcbiAgICAgICAgICAgIGRvbUV2ZW50SGFuZGxlcnMoYSwgYikge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBhKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBldmVudCBpbiBiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleGlzdHMgPSByZXN1bHRbZXZlbnRdLCBhZGQgPSBiW2V2ZW50XTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2V2ZW50XSA9IGV4aXN0cyA/ICh2aWV3LCBsaW5lLCBldmVudCkgPT4gZXhpc3RzKHZpZXcsIGxpbmUsIGV2ZW50KSB8fCBhZGQodmlldywgbGluZSwgZXZlbnQpIDogYWRkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59KTtcbmNsYXNzIE51bWJlck1hcmtlciBleHRlbmRzIEd1dHRlck1hcmtlciB7XG4gICAgY29uc3RydWN0b3IobnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyO1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gdGhpcy5udW1iZXIgPT0gb3RoZXIubnVtYmVyOyB9XG4gICAgdG9ET00oKSB7IHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLm51bWJlcik7IH1cbn1cbmZ1bmN0aW9uIGZvcm1hdE51bWJlcih2aWV3LCBudW1iZXIpIHtcbiAgICByZXR1cm4gdmlldy5zdGF0ZS5mYWNldChsaW5lTnVtYmVyQ29uZmlnKS5mb3JtYXROdW1iZXIobnVtYmVyLCB2aWV3LnN0YXRlKTtcbn1cbmNvbnN0IGxpbmVOdW1iZXJHdXR0ZXIgPSAvKkBfX1BVUkVfXyovYWN0aXZlR3V0dGVycy5jb21wdXRlKFtsaW5lTnVtYmVyQ29uZmlnXSwgc3RhdGUgPT4gKHtcbiAgICBjbGFzczogXCJjbS1saW5lTnVtYmVyc1wiLFxuICAgIHJlbmRlckVtcHR5RWxlbWVudHM6IGZhbHNlLFxuICAgIG1hcmtlcnModmlldykgeyByZXR1cm4gdmlldy5zdGF0ZS5mYWNldChsaW5lTnVtYmVyTWFya2Vycyk7IH0sXG4gICAgbGluZU1hcmtlcih2aWV3LCBsaW5lLCBvdGhlcnMpIHtcbiAgICAgICAgaWYgKG90aGVycy5zb21lKG0gPT4gbS50b0RPTSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJNYXJrZXIoZm9ybWF0TnVtYmVyKHZpZXcsIHZpZXcuc3RhdGUuZG9jLmxpbmVBdChsaW5lLmZyb20pLm51bWJlcikpO1xuICAgIH0sXG4gICAgd2lkZ2V0TWFya2VyOiAodmlldywgd2lkZ2V0LCBibG9jaykgPT4ge1xuICAgICAgICBmb3IgKGxldCBtIG9mIHZpZXcuc3RhdGUuZmFjZXQobGluZU51bWJlcldpZGdldE1hcmtlcikpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBtKHZpZXcsIHdpZGdldCwgYmxvY2spO1xuICAgICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgbGluZU1hcmtlckNoYW5nZTogdXBkYXRlID0+IHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGxpbmVOdW1iZXJDb25maWcpICE9IHVwZGF0ZS5zdGF0ZS5mYWNldChsaW5lTnVtYmVyQ29uZmlnKSxcbiAgICBpbml0aWFsU3BhY2VyKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJNYXJrZXIoZm9ybWF0TnVtYmVyKHZpZXcsIG1heExpbmVOdW1iZXIodmlldy5zdGF0ZS5kb2MubGluZXMpKSk7XG4gICAgfSxcbiAgICB1cGRhdGVTcGFjZXIoc3BhY2VyLCB1cGRhdGUpIHtcbiAgICAgICAgbGV0IG1heCA9IGZvcm1hdE51bWJlcih1cGRhdGUudmlldywgbWF4TGluZU51bWJlcih1cGRhdGUudmlldy5zdGF0ZS5kb2MubGluZXMpKTtcbiAgICAgICAgcmV0dXJuIG1heCA9PSBzcGFjZXIubnVtYmVyID8gc3BhY2VyIDogbmV3IE51bWJlck1hcmtlcihtYXgpO1xuICAgIH0sXG4gICAgZG9tRXZlbnRIYW5kbGVyczogc3RhdGUuZmFjZXQobGluZU51bWJlckNvbmZpZykuZG9tRXZlbnRIYW5kbGVyc1xufSkpO1xuLyoqXG5DcmVhdGUgYSBsaW5lIG51bWJlciBndXR0ZXIgZXh0ZW5zaW9uLlxuKi9cbmZ1bmN0aW9uIGxpbmVOdW1iZXJzKGNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgbGluZU51bWJlckNvbmZpZy5vZihjb25maWcpLFxuICAgICAgICBndXR0ZXJzKCksXG4gICAgICAgIGxpbmVOdW1iZXJHdXR0ZXJcbiAgICBdO1xufVxuZnVuY3Rpb24gbWF4TGluZU51bWJlcihsaW5lcykge1xuICAgIGxldCBsYXN0ID0gOTtcbiAgICB3aGlsZSAobGFzdCA8IGxpbmVzKVxuICAgICAgICBsYXN0ID0gbGFzdCAqIDEwICsgOTtcbiAgICByZXR1cm4gbGFzdDtcbn1cbmNvbnN0IGFjdGl2ZUxpbmVHdXR0ZXJNYXJrZXIgPSAvKkBfX1BVUkVfXyovbmV3IGNsYXNzIGV4dGVuZHMgR3V0dGVyTWFya2VyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5lbGVtZW50Q2xhc3MgPSBcImNtLWFjdGl2ZUxpbmVHdXR0ZXJcIjtcbiAgICB9XG59O1xuY29uc3QgYWN0aXZlTGluZUd1dHRlckhpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL2d1dHRlckxpbmVDbGFzcy5jb21wdXRlKFtcInNlbGVjdGlvblwiXSwgc3RhdGUgPT4ge1xuICAgIGxldCBtYXJrcyA9IFtdLCBsYXN0ID0gLTE7XG4gICAgZm9yIChsZXQgcmFuZ2Ugb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICBsZXQgbGluZVBvcyA9IHN0YXRlLmRvYy5saW5lQXQocmFuZ2UuaGVhZCkuZnJvbTtcbiAgICAgICAgaWYgKGxpbmVQb3MgPiBsYXN0KSB7XG4gICAgICAgICAgICBsYXN0ID0gbGluZVBvcztcbiAgICAgICAgICAgIG1hcmtzLnB1c2goYWN0aXZlTGluZUd1dHRlck1hcmtlci5yYW5nZShsaW5lUG9zKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFJhbmdlU2V0Lm9mKG1hcmtzKTtcbn0pO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGFkZHMgYSBgY20tYWN0aXZlTGluZUd1dHRlcmAgY2xhc3MgdG9cbmFsbCBndXR0ZXIgZWxlbWVudHMgb24gdGhlIFthY3RpdmVcbmxpbmVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5oaWdobGlnaHRBY3RpdmVMaW5lKS5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRBY3RpdmVMaW5lR3V0dGVyKCkge1xuICAgIHJldHVybiBhY3RpdmVMaW5lR3V0dGVySGlnaGxpZ2h0ZXI7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXIoZGVjb3JhdG9yKSB7XG4gICAgcmV0dXJuIFZpZXdQbHVnaW4uZGVmaW5lKHZpZXcgPT4gKHtcbiAgICAgICAgZGVjb3JhdGlvbnM6IGRlY29yYXRvci5jcmVhdGVEZWNvKHZpZXcpLFxuICAgICAgICB1cGRhdGUodSkge1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IGRlY29yYXRvci51cGRhdGVEZWNvKHUsIHRoaXMuZGVjb3JhdGlvbnMpO1xuICAgICAgICB9LFxuICAgIH0pLCB7XG4gICAgICAgIGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnNcbiAgICB9KTtcbn1cbmNvbnN0IHRhYkRlY28gPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20taGlnaGxpZ2h0VGFiXCIgfSk7XG5jb25zdCBzcGFjZURlY28gPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20taGlnaGxpZ2h0U3BhY2VcIiB9KTtcbmNvbnN0IHdoaXRlc3BhY2VIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9tYXRjaGVyKC8qQF9fUFVSRV9fKi9uZXcgTWF0Y2hEZWNvcmF0b3Ioe1xuICAgIHJlZ2V4cDogL1xcdHwgL2csXG4gICAgZGVjb3JhdGlvbjogbWF0Y2ggPT4gbWF0Y2hbMF0gPT0gXCJcXHRcIiA/IHRhYkRlY28gOiBzcGFjZURlY28sXG4gICAgYm91bmRhcnk6IC9cXFMvLFxufSkpO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGhpZ2hsaWdodHMgd2hpdGVzcGFjZSwgYWRkaW5nIGFcbmBjbS1oaWdobGlnaHRTcGFjZWAgY2xhc3MgdG8gc3RyZXRjaGVzIG9mIHNwYWNlcywgYW5kIGFcbmBjbS1oaWdobGlnaHRUYWJgIGNsYXNzIHRvIGluZGl2aWR1YWwgdGFiIGNoYXJhY3RlcnMuIEJ5IGRlZmF1bHQsXG50aGUgZm9ybWVyIGFyZSBzaG93biBhcyBmYWludCBkb3RzLCBhbmQgdGhlIGxhdHRlciBhcyBhcnJvd3MuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0V2hpdGVzcGFjZSgpIHtcbiAgICByZXR1cm4gd2hpdGVzcGFjZUhpZ2hsaWdodGVyO1xufVxuY29uc3QgdHJhaWxpbmdIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9tYXRjaGVyKC8qQF9fUFVSRV9fKi9uZXcgTWF0Y2hEZWNvcmF0b3Ioe1xuICAgIHJlZ2V4cDogL1xccyskL2csXG4gICAgZGVjb3JhdGlvbjogLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLXRyYWlsaW5nU3BhY2VcIiB9KSxcbiAgICBib3VuZGFyeTogL1xcUy8sXG59KSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgYWRkcyBhIGBjbS10cmFpbGluZ1NwYWNlYCBjbGFzcyB0byBhbGxcbnRyYWlsaW5nIHdoaXRlc3BhY2UuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0VHJhaWxpbmdXaGl0ZXNwYWNlKCkge1xuICAgIHJldHVybiB0cmFpbGluZ0hpZ2hsaWdodGVyO1xufVxuXG4vKipcbkBpbnRlcm5hbFxuKi9cbmNvbnN0IF9fdGVzdCA9IHsgSGVpZ2h0TWFwLCBIZWlnaHRPcmFjbGUsIE1lYXN1cmVkSGVpZ2h0cywgUXVlcnlUeXBlLCBDaGFuZ2VkUmFuZ2UsIGNvbXB1dGVPcmRlcixcbiAgICBtb3ZlVmlzdWFsbHksIGNsZWFySGVpZ2h0Q2hhbmdlRmxhZywgZ2V0SGVpZ2h0Q2hhbmdlRmxhZzogKCkgPT4gaGVpZ2h0Q2hhbmdlRmxhZyB9O1xuXG5leHBvcnQgeyBCaWRpU3BhbiwgQmxvY2tJbmZvLCBCbG9ja1R5cGUsIERlY29yYXRpb24sIERpcmVjdGlvbiwgRWRpdG9yVmlldywgR3V0dGVyTWFya2VyLCBNYXRjaERlY29yYXRvciwgUmVjdGFuZ2xlTWFya2VyLCBWaWV3UGx1Z2luLCBWaWV3VXBkYXRlLCBXaWRnZXRUeXBlLCBfX3Rlc3QsIGNsb3NlSG92ZXJUb29sdGlwcywgY3Jvc3NoYWlyQ3Vyc29yLCBkcmF3U2VsZWN0aW9uLCBkcm9wQ3Vyc29yLCBnZXREcmF3U2VsZWN0aW9uQ29uZmlnLCBnZXRQYW5lbCwgZ2V0VG9vbHRpcCwgZ3V0dGVyLCBndXR0ZXJMaW5lQ2xhc3MsIGd1dHRlcldpZGdldENsYXNzLCBndXR0ZXJzLCBoYXNIb3ZlclRvb2x0aXBzLCBoaWdobGlnaHRBY3RpdmVMaW5lLCBoaWdobGlnaHRBY3RpdmVMaW5lR3V0dGVyLCBoaWdobGlnaHRTcGVjaWFsQ2hhcnMsIGhpZ2hsaWdodFRyYWlsaW5nV2hpdGVzcGFjZSwgaGlnaGxpZ2h0V2hpdGVzcGFjZSwgaG92ZXJUb29sdGlwLCBrZXltYXAsIGxheWVyLCBsaW5lTnVtYmVyTWFya2VycywgbGluZU51bWJlcldpZGdldE1hcmtlciwgbGluZU51bWJlcnMsIGxvZ0V4Y2VwdGlvbiwgcGFuZWxzLCBwbGFjZWhvbGRlciwgcmVjdGFuZ3VsYXJTZWxlY3Rpb24sIHJlcG9zaXRpb25Ub29sdGlwcywgcnVuU2NvcGVIYW5kbGVycywgc2Nyb2xsUGFzdEVuZCwgc2hvd1BhbmVsLCBzaG93VG9vbHRpcCwgdG9vbHRpcHMgfTtcbiIsICIvKipcblRoZSBkZWZhdWx0IG1heGltdW0gbGVuZ3RoIG9mIGEgYFRyZWVCdWZmZXJgIG5vZGUuXG4qL1xuY29uc3QgRGVmYXVsdEJ1ZmZlckxlbmd0aCA9IDEwMjQ7XG5sZXQgbmV4dFByb3BJRCA9IDA7XG5jbGFzcyBSYW5nZSB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8pIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgIH1cbn1cbi8qKlxuRWFjaCBbbm9kZSB0eXBlXSgjY29tbW9uLk5vZGVUeXBlKSBvciBbaW5kaXZpZHVhbCB0cmVlXSgjY29tbW9uLlRyZWUpXG5jYW4gaGF2ZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQgaW4gcHJvcHMuIEluc3RhbmNlcyBvZiB0aGlzXG5jbGFzcyByZXByZXNlbnQgcHJvcCBuYW1lcy5cbiovXG5jbGFzcyBOb2RlUHJvcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IG5vZGUgcHJvcCB0eXBlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICAgICAgdGhpcy5pZCA9IG5leHRQcm9wSUQrKztcbiAgICAgICAgdGhpcy5wZXJOb2RlID0gISFjb25maWcucGVyTm9kZTtcbiAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZSA9IGNvbmZpZy5kZXNlcmlhbGl6ZSB8fCAoKCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBub2RlIHR5cGUgZG9lc24ndCBkZWZpbmUgYSBkZXNlcmlhbGl6ZSBmdW5jdGlvblwiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCB3aXRoXG4gICAgW2BOb2RlU2V0LmV4dGVuZGBdKCNjb21tb24uTm9kZVNldC5leHRlbmQpIG9yXG4gICAgW2BMUlBhcnNlci5jb25maWd1cmVgXSgjbHIuUGFyc2VyQ29uZmlnLnByb3BzKSB0byBjb21wdXRlXG4gICAgcHJvcCB2YWx1ZXMgZm9yIGVhY2ggbm9kZSB0eXBlIGluIHRoZSBzZXQuIFRha2VzIGEgW21hdGNoXG4gICAgb2JqZWN0XSgjY29tbW9uLk5vZGVUeXBlXm1hdGNoKSBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdW5kZWZpbmVkXG4gICAgaWYgdGhlIG5vZGUgdHlwZSBkb2Vzbid0IGdldCB0aGlzIHByb3AsIGFuZCB0aGUgcHJvcCdzIHZhbHVlIGlmXG4gICAgaXQgZG9lcy5cbiAgICAqL1xuICAgIGFkZChtYXRjaCkge1xuICAgICAgICBpZiAodGhpcy5wZXJOb2RlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4ndCBhZGQgcGVyLW5vZGUgcHJvcHMgdG8gbm9kZSB0eXBlc1wiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaCAhPSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICBtYXRjaCA9IE5vZGVUeXBlLm1hdGNoKG1hdGNoKTtcbiAgICAgICAgcmV0dXJuICh0eXBlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbWF0Y2godHlwZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBudWxsIDogW3RoaXMsIHJlc3VsdF07XG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG5Qcm9wIHRoYXQgaXMgdXNlZCB0byBkZXNjcmliZSBtYXRjaGluZyBkZWxpbWl0ZXJzLiBGb3Igb3BlbmluZ1xuZGVsaW1pdGVycywgdGhpcyBob2xkcyBhbiBhcnJheSBvZiBub2RlIG5hbWVzICh3cml0dGVuIGFzIGFcbnNwYWNlLXNlcGFyYXRlZCBzdHJpbmcgd2hlbiBkZWNsYXJpbmcgdGhpcyBwcm9wIGluIGEgZ3JhbW1hcilcbmZvciB0aGUgbm9kZSB0eXBlcyBvZiBjbG9zaW5nIGRlbGltaXRlcnMgdGhhdCBtYXRjaCBpdC5cbiovXG5Ob2RlUHJvcC5jbG9zZWRCeSA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiBzdHIgPT4gc3RyLnNwbGl0KFwiIFwiKSB9KTtcbi8qKlxuVGhlIGludmVyc2Ugb2YgW2BjbG9zZWRCeWBdKCNjb21tb24uTm9kZVByb3BeY2xvc2VkQnkpLiBUaGlzIGlzXG5hdHRhY2hlZCB0byBjbG9zaW5nIGRlbGltaXRlcnMsIGhvbGRpbmcgYW4gYXJyYXkgb2Ygbm9kZSBuYW1lc1xub2YgdHlwZXMgb2YgbWF0Y2hpbmcgb3BlbmluZyBkZWxpbWl0ZXJzLlxuKi9cbk5vZGVQcm9wLm9wZW5lZEJ5ID0gbmV3IE5vZGVQcm9wKHsgZGVzZXJpYWxpemU6IHN0ciA9PiBzdHIuc3BsaXQoXCIgXCIpIH0pO1xuLyoqXG5Vc2VkIHRvIGFzc2lnbiBub2RlIHR5cGVzIHRvIGdyb3VwcyAoZm9yIGV4YW1wbGUsIGFsbCBub2RlXG50eXBlcyB0aGF0IHJlcHJlc2VudCBhbiBleHByZXNzaW9uIGNvdWxkIGJlIHRhZ2dlZCB3aXRoIGFuXG5gXCJFeHByZXNzaW9uXCJgIGdyb3VwKS5cbiovXG5Ob2RlUHJvcC5ncm91cCA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiBzdHIgPT4gc3RyLnNwbGl0KFwiIFwiKSB9KTtcbi8qKlxuQXR0YWNoZWQgdG8gbm9kZXMgdG8gaW5kaWNhdGUgdGhlc2Ugc2hvdWxkIGJlXG5bZGlzcGxheWVkXShodHRwczovL2NvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNsYW5ndWFnZS5zeW50YXhUcmVlKVxuaW4gYSBiaWRpcmVjdGlvbmFsIHRleHQgaXNvbGF0ZSwgc28gdGhhdCBkaXJlY3Rpb24tbmV1dHJhbFxuY2hhcmFjdGVycyBvbiB0aGVpciBzaWRlcyBkb24ndCBpbmNvcnJlY3RseSBnZXQgYXNzb2NpYXRlZCB3aXRoXG5zdXJyb3VuZGluZyB0ZXh0LiBZb3UnbGwgZ2VuZXJhbGx5IHdhbnQgdG8gc2V0IHRoaXMgZm9yIG5vZGVzXG50aGF0IGNvbnRhaW4gYXJiaXRyYXJ5IHRleHQsIGxpa2Ugc3RyaW5ncyBhbmQgY29tbWVudHMsIGFuZCBmb3Jcbm5vZGVzIHRoYXQgYXBwZWFyIF9pbnNpZGVfIGFyYml0cmFyeSB0ZXh0LCBsaWtlIEhUTUwgdGFncy4gV2hlblxubm90IGdpdmVuIGEgdmFsdWUsIGluIGEgZ3JhbW1hciBkZWNsYXJhdGlvbiwgZGVmYXVsdHMgdG9cbmBcImF1dG9cImAuXG4qL1xuTm9kZVByb3AuaXNvbGF0ZSA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiB2YWx1ZSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPSBcInJ0bFwiICYmIHZhbHVlICE9IFwibHRyXCIgJiYgdmFsdWUgIT0gXCJhdXRvXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdmFsdWUgZm9yIGlzb2xhdGU6IFwiICsgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWUgfHwgXCJhdXRvXCI7XG4gICAgfSB9KTtcbi8qKlxuVGhlIGhhc2ggb2YgdGhlIFtjb250ZXh0XSgjbHIuQ29udGV4dFRyYWNrZXIuY29uc3RydWN0b3IpXG50aGF0IHRoZSBub2RlIHdhcyBwYXJzZWQgaW4sIGlmIGFueS4gVXNlZCB0byBsaW1pdCByZXVzZSBvZlxuY29udGV4dHVhbCBub2Rlcy5cbiovXG5Ob2RlUHJvcC5jb250ZXh0SGFzaCA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG4vKipcblRoZSBkaXN0YW5jZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbm9kZSB0aGF0IHRoZSB0b2tlbml6ZXJcbmxvb2tlZCBhaGVhZCBmb3IgYW55IG9mIHRoZSB0b2tlbnMgaW5zaWRlIHRoZSBub2RlLiAoVGhlIExSXG5wYXJzZXIgb25seSBzdG9yZXMgdGhpcyB3aGVuIGl0IGlzIGxhcmdlciB0aGFuIDI1LCBmb3JcbmVmZmljaWVuY3kgcmVhc29ucy4pXG4qL1xuTm9kZVByb3AubG9va0FoZWFkID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbi8qKlxuVGhpcyBwZXItbm9kZSBwcm9wIGlzIHVzZWQgdG8gcmVwbGFjZSBhIGdpdmVuIG5vZGUsIG9yIHBhcnQgb2YgYVxubm9kZSwgd2l0aCBhbm90aGVyIHRyZWUuIFRoaXMgaXMgdXNlZnVsIHRvIGluY2x1ZGUgdHJlZXMgZnJvbVxuZGlmZmVyZW50IGxhbmd1YWdlcyBpbiBtaXhlZC1sYW5ndWFnZSBwYXJzZXJzLlxuKi9cbk5vZGVQcm9wLm1vdW50ZWQgPSBuZXcgTm9kZVByb3AoeyBwZXJOb2RlOiB0cnVlIH0pO1xuLyoqXG5BIG1vdW50ZWQgdHJlZSwgd2hpY2ggY2FuIGJlIFtzdG9yZWRdKCNjb21tb24uTm9kZVByb3BebW91bnRlZCkgb25cbmEgdHJlZSBub2RlIHRvIGluZGljYXRlIHRoYXQgcGFydHMgb2YgaXRzIGNvbnRlbnQgYXJlXG5yZXByZXNlbnRlZCBieSBhbm90aGVyIHRyZWUuXG4qL1xuY2xhc3MgTW91bnRlZFRyZWUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBpbm5lciB0cmVlLlxuICAgICovXG4gICAgdHJlZSwgXG4gICAgLyoqXG4gICAgSWYgdGhpcyBpcyBudWxsLCB0aGlzIHRyZWUgcmVwbGFjZXMgdGhlIGVudGlyZSBub2RlIChpdCB3aWxsXG4gICAgYmUgaW5jbHVkZWQgaW4gdGhlIHJlZ3VsYXIgaXRlcmF0aW9uIGluc3RlYWQgb2YgaXRzIGhvc3RcbiAgICBub2RlKS4gSWYgbm90LCBvbmx5IHRoZSBnaXZlbiByYW5nZXMgYXJlIGNvbnNpZGVyZWQgdG8gYmVcbiAgICBjb3ZlcmVkIGJ5IHRoaXMgdHJlZS4gVGhpcyBpcyB1c2VkIGZvciB0cmVlcyB0aGF0IGFyZSBtaXhlZCBpblxuICAgIGEgd2F5IHRoYXQgaXNuJ3Qgc3RyaWN0bHkgaGllcmFyY2hpY2FsLiBTdWNoIG1vdW50ZWQgdHJlZXMgYXJlXG4gICAgb25seSBlbnRlcmVkIGJ5IFtgcmVzb2x2ZUlubmVyYF0oI2NvbW1vbi5UcmVlLnJlc29sdmVJbm5lcilcbiAgICBhbmQgW2BlbnRlcmBdKCNjb21tb24uU3ludGF4Tm9kZS5lbnRlcikuXG4gICAgKi9cbiAgICBvdmVybGF5LCBcbiAgICAvKipcbiAgICBUaGUgcGFyc2VyIHVzZWQgdG8gY3JlYXRlIHRoaXMgc3VidHJlZS5cbiAgICAqL1xuICAgIHBhcnNlcikge1xuICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0KHRyZWUpIHtcbiAgICAgICAgcmV0dXJuIHRyZWUgJiYgdHJlZS5wcm9wcyAmJiB0cmVlLnByb3BzW05vZGVQcm9wLm1vdW50ZWQuaWRdO1xuICAgIH1cbn1cbmNvbnN0IG5vUHJvcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqXG5FYWNoIG5vZGUgaW4gYSBzeW50YXggdHJlZSBoYXMgYSBub2RlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0LlxuKi9cbmNsYXNzIE5vZGVUeXBlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBuYW1lIG9mIHRoZSBub2RlIHR5cGUuIE5vdCBuZWNlc3NhcmlseSB1bmlxdWUsIGJ1dCBpZiB0aGVcbiAgICBncmFtbWFyIHdhcyB3cml0dGVuIHByb3Blcmx5LCBkaWZmZXJlbnQgbm9kZSB0eXBlcyB3aXRoIHRoZVxuICAgIHNhbWUgbmFtZSB3aXRoaW4gYSBub2RlIHNldCBzaG91bGQgcGxheSB0aGUgc2FtZSBzZW1hbnRpY1xuICAgIHJvbGUuXG4gICAgKi9cbiAgICBuYW1lLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHByb3BzLCBcbiAgICAvKipcbiAgICBUaGUgaWQgb2YgdGhpcyBub2RlIGluIGl0cyBzZXQuIENvcnJlc3BvbmRzIHRvIHRoZSB0ZXJtIGlkc1xuICAgIHVzZWQgaW4gdGhlIHBhcnNlci5cbiAgICAqL1xuICAgIGlkLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZsYWdzID0gMCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBub2RlIHR5cGUuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHNwZWMpIHtcbiAgICAgICAgbGV0IHByb3BzID0gc3BlYy5wcm9wcyAmJiBzcGVjLnByb3BzLmxlbmd0aCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBub1Byb3BzO1xuICAgICAgICBsZXQgZmxhZ3MgPSAoc3BlYy50b3AgPyAxIC8qIE5vZGVGbGFnLlRvcCAqLyA6IDApIHwgKHNwZWMuc2tpcHBlZCA/IDIgLyogTm9kZUZsYWcuU2tpcHBlZCAqLyA6IDApIHxcbiAgICAgICAgICAgIChzcGVjLmVycm9yID8gNCAvKiBOb2RlRmxhZy5FcnJvciAqLyA6IDApIHwgKHNwZWMubmFtZSA9PSBudWxsID8gOCAvKiBOb2RlRmxhZy5Bbm9ueW1vdXMgKi8gOiAwKTtcbiAgICAgICAgbGV0IHR5cGUgPSBuZXcgTm9kZVR5cGUoc3BlYy5uYW1lIHx8IFwiXCIsIHByb3BzLCBzcGVjLmlkLCBmbGFncyk7XG4gICAgICAgIGlmIChzcGVjLnByb3BzKVxuICAgICAgICAgICAgZm9yIChsZXQgc3JjIG9mIHNwZWMucHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3JjKSlcbiAgICAgICAgICAgICAgICAgICAgc3JjID0gc3JjKHR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNyY1swXS5wZXJOb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4ndCBzdG9yZSBhIHBlci1ub2RlIHByb3Agb24gYSBub2RlIHR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzW3NyY1swXS5pZF0gPSBzcmNbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmVzIGEgbm9kZSBwcm9wIGZvciB0aGlzIHR5cGUuIFdpbGwgcmV0dXJuIGB1bmRlZmluZWRgIGlmXG4gICAgdGhlIHByb3AgaXNuJ3QgcHJlc2VudCBvbiB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBwcm9wKHByb3ApIHsgcmV0dXJuIHRoaXMucHJvcHNbcHJvcC5pZF07IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyB0aGUgdG9wIG5vZGUgb2YgYSBncmFtbWFyLlxuICAgICovXG4gICAgZ2V0IGlzVG9wKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiAxIC8qIE5vZGVGbGFnLlRvcCAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgbm9kZSBpcyBwcm9kdWNlZCBieSBhIHNraXAgcnVsZS5cbiAgICAqL1xuICAgIGdldCBpc1NraXBwZWQoKSB7IHJldHVybiAodGhpcy5mbGFncyAmIDIgLyogTm9kZUZsYWcuU2tpcHBlZCAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBlcnJvciBub2RlLlxuICAgICovXG4gICAgZ2V0IGlzRXJyb3IoKSB7IHJldHVybiAodGhpcy5mbGFncyAmIDQgLyogTm9kZUZsYWcuRXJyb3IgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIFdoZW4gdHJ1ZSwgdGhpcyBub2RlIHR5cGUgZG9lc24ndCBjb3JyZXNwb25kIHRvIGEgdXNlci1kZWNsYXJlZFxuICAgIG5hbWVkIG5vZGUsIGZvciBleGFtcGxlIGJlY2F1c2UgaXQgaXMgdXNlZCB0byBjYWNoZSByZXBldGl0aW9uLlxuICAgICovXG4gICAgZ2V0IGlzQW5vbnltb3VzKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiA4IC8qIE5vZGVGbGFnLkFub255bW91cyAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIHdoZW4gdGhpcyBub2RlJ3MgbmFtZSBvciBvbmUgb2YgaXRzXG4gICAgW2dyb3Vwc10oI2NvbW1vbi5Ob2RlUHJvcF5ncm91cCkgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgICovXG4gICAgaXMobmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gbmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBncm91cCA9IHRoaXMucHJvcChOb2RlUHJvcC5ncm91cCk7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAgPyBncm91cC5pbmRleE9mKG5hbWUpID4gLTEgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pZCA9PSBuYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBmdW5jdGlvbiBmcm9tIG5vZGUgdHlwZXMgdG8gYXJiaXRyYXJ5IHZhbHVlcyBieVxuICAgIHNwZWNpZnlpbmcgYW4gb2JqZWN0IHdob3NlIHByb3BlcnR5IG5hbWVzIGFyZSBub2RlIG9yXG4gICAgW2dyb3VwXSgjY29tbW9uLk5vZGVQcm9wXmdyb3VwKSBuYW1lcy4gT2Z0ZW4gdXNlZnVsIHdpdGhcbiAgICBbYE5vZGVQcm9wLmFkZGBdKCNjb21tb24uTm9kZVByb3AuYWRkKS4gWW91IGNhbiBwdXQgbXVsdGlwbGVcbiAgICBuYW1lcywgc2VwYXJhdGVkIGJ5IHNwYWNlcywgaW4gYSBzaW5nbGUgcHJvcGVydHkgbmFtZSB0byBtYXBcbiAgICBtdWx0aXBsZSBub2RlIG5hbWVzIHRvIGEgc2luZ2xlIHZhbHVlLlxuICAgICovXG4gICAgc3RhdGljIG1hdGNoKG1hcCkge1xuICAgICAgICBsZXQgZGlyZWN0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBtYXApXG4gICAgICAgICAgICBmb3IgKGxldCBuYW1lIG9mIHByb3Auc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgICAgIGRpcmVjdFtuYW1lXSA9IG1hcFtwcm9wXTtcbiAgICAgICAgcmV0dXJuIChub2RlKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBncm91cHMgPSBub2RlLnByb3AoTm9kZVByb3AuZ3JvdXApLCBpID0gLTE7IGkgPCAoZ3JvdXBzID8gZ3JvdXBzLmxlbmd0aCA6IDApOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBkaXJlY3RbaSA8IDAgPyBub2RlLm5hbWUgOiBncm91cHNbaV1dO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuQW4gZW1wdHkgZHVtbXkgbm9kZSB0eXBlIHRvIHVzZSB3aGVuIG5vIGFjdHVhbCB0eXBlIGlzIGF2YWlsYWJsZS5cbiovXG5Ob2RlVHlwZS5ub25lID0gbmV3IE5vZGVUeXBlKFwiXCIsIE9iamVjdC5jcmVhdGUobnVsbCksIDAsIDggLyogTm9kZUZsYWcuQW5vbnltb3VzICovKTtcbi8qKlxuQSBub2RlIHNldCBob2xkcyBhIGNvbGxlY3Rpb24gb2Ygbm9kZSB0eXBlcy4gSXQgaXMgdXNlZCB0b1xuY29tcGFjdGx5IHJlcHJlc2VudCB0cmVlcyBieSBzdG9yaW5nIHRoZWlyIHR5cGUgaWRzLCByYXRoZXIgdGhhbiBhXG5mdWxsIHBvaW50ZXIgdG8gdGhlIHR5cGUgb2JqZWN0LCBpbiBhIG51bWVyaWMgYXJyYXkuIEVhY2ggcGFyc2VyXG5baGFzXSgjbHIuTFJQYXJzZXIubm9kZVNldCkgYSBub2RlIHNldCwgYW5kIFt0cmVlXG5idWZmZXJzXSgjY29tbW9uLlRyZWVCdWZmZXIpIGNhbiBvbmx5IHN0b3JlIGNvbGxlY3Rpb25zIG9mIG5vZGVzXG5mcm9tIHRoZSBzYW1lIHNldC4gQSBzZXQgY2FuIGhhdmUgYSBtYXhpbXVtIG9mIDIqKjE2ICg2NTUzNikgbm9kZVxudHlwZXMgaW4gaXQsIHNvIHRoYXQgdGhlIGlkcyBmaXQgaW50byAxNi1iaXQgdHlwZWQgYXJyYXkgc2xvdHMuXG4qL1xuY2xhc3MgTm9kZVNldCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IHdpdGggdGhlIGdpdmVuIHR5cGVzLiBUaGUgYGlkYCBwcm9wZXJ0eSBvZiBlYWNoXG4gICAgdHlwZSBzaG91bGQgY29ycmVzcG9uZCB0byBpdHMgcG9zaXRpb24gd2l0aGluIHRoZSBhcnJheS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBub2RlIHR5cGVzIGluIHRoaXMgc2V0LCBieSBpZC5cbiAgICAqL1xuICAgIHR5cGVzKSB7XG4gICAgICAgIHRoaXMudHlwZXMgPSB0eXBlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICh0eXBlc1tpXS5pZCAhPSBpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm9kZSB0eXBlIGlkcyBzaG91bGQgY29ycmVzcG9uZCB0byBhcnJheSBwb3NpdGlvbnMgd2hlbiBjcmVhdGluZyBhIG5vZGUgc2V0XCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgc2V0IHdpdGggc29tZSBub2RlIHByb3BlcnRpZXMgYWRkZWQuIFRoZVxuICAgIGFyZ3VtZW50cyB0byB0aGlzIG1ldGhvZCBjYW4gYmUgY3JlYXRlZCB3aXRoXG4gICAgW2BOb2RlUHJvcC5hZGRgXSgjY29tbW9uLk5vZGVQcm9wLmFkZCkuXG4gICAgKi9cbiAgICBleHRlbmQoLi4ucHJvcHMpIHtcbiAgICAgICAgbGV0IG5ld1R5cGVzID0gW107XG4gICAgICAgIGZvciAobGV0IHR5cGUgb2YgdGhpcy50eXBlcykge1xuICAgICAgICAgICAgbGV0IG5ld1Byb3BzID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBwcm9wcykge1xuICAgICAgICAgICAgICAgIGxldCBhZGQgPSBzb3VyY2UodHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFkZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld1Byb3BzKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCB0eXBlLnByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3UHJvcHNbYWRkWzBdLmlkXSA9IGFkZFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdUeXBlcy5wdXNoKG5ld1Byb3BzID8gbmV3IE5vZGVUeXBlKHR5cGUubmFtZSwgbmV3UHJvcHMsIHR5cGUuaWQsIHR5cGUuZmxhZ3MpIDogdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2V0KG5ld1R5cGVzKTtcbiAgICB9XG59XG5jb25zdCBDYWNoZWROb2RlID0gbmV3IFdlYWtNYXAoKSwgQ2FjaGVkSW5uZXJOb2RlID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuT3B0aW9ucyB0aGF0IGNvbnRyb2wgaXRlcmF0aW9uLiBDYW4gYmUgY29tYmluZWQgd2l0aCB0aGUgYHxgXG5vcGVyYXRvciB0byBlbmFibGUgbXVsdGlwbGUgb25lcy5cbiovXG52YXIgSXRlck1vZGU7XG4oZnVuY3Rpb24gKEl0ZXJNb2RlKSB7XG4gICAgLyoqXG4gICAgV2hlbiBlbmFibGVkLCBpdGVyYXRpb24gd2lsbCBvbmx5IHZpc2l0IFtgVHJlZWBdKCNjb21tb24uVHJlZSlcbiAgICBvYmplY3RzLCBub3Qgbm9kZXMgcGFja2VkIGludG9cbiAgICBbYFRyZWVCdWZmZXJgXSgjY29tbW9uLlRyZWVCdWZmZXIpcy5cbiAgICAqL1xuICAgIEl0ZXJNb2RlW0l0ZXJNb2RlW1wiRXhjbHVkZUJ1ZmZlcnNcIl0gPSAxXSA9IFwiRXhjbHVkZUJ1ZmZlcnNcIjtcbiAgICAvKipcbiAgICBFbmFibGUgdGhpcyB0byBtYWtlIGl0ZXJhdGlvbiBpbmNsdWRlIGFub255bW91cyBub2RlcyAoc3VjaCBhc1xuICAgIHRoZSBub2RlcyB0aGF0IHdyYXAgcmVwZWF0ZWQgZ3JhbW1hciBjb25zdHJ1Y3RzIGludG8gYSBiYWxhbmNlZFxuICAgIHRyZWUpLlxuICAgICovXG4gICAgSXRlck1vZGVbSXRlck1vZGVbXCJJbmNsdWRlQW5vbnltb3VzXCJdID0gMl0gPSBcIkluY2x1ZGVBbm9ueW1vdXNcIjtcbiAgICAvKipcbiAgICBCeSBkZWZhdWx0LCByZWd1bGFyIFttb3VudGVkXSgjY29tbW9uLk5vZGVQcm9wXm1vdW50ZWQpIG5vZGVzXG4gICAgcmVwbGFjZSB0aGVpciBiYXNlIG5vZGUgaW4gaXRlcmF0aW9uLiBFbmFibGUgdGhpcyB0byBpZ25vcmUgdGhlbVxuICAgIGluc3RlYWQuXG4gICAgKi9cbiAgICBJdGVyTW9kZVtJdGVyTW9kZVtcIklnbm9yZU1vdW50c1wiXSA9IDRdID0gXCJJZ25vcmVNb3VudHNcIjtcbiAgICAvKipcbiAgICBUaGlzIG9wdGlvbiBvbmx5IGFwcGxpZXMgaW5cbiAgICBbYGVudGVyYF0oI2NvbW1vbi5TeW50YXhOb2RlLmVudGVyKS1zdHlsZSBtZXRob2RzLiBJdCB0ZWxscyB0aGVcbiAgICBsaWJyYXJ5IHRvIG5vdCBlbnRlciBtb3VudGVkIG92ZXJsYXlzIGlmIG9uZSBjb3ZlcnMgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24uXG4gICAgKi9cbiAgICBJdGVyTW9kZVtJdGVyTW9kZVtcIklnbm9yZU92ZXJsYXlzXCJdID0gOF0gPSBcIklnbm9yZU92ZXJsYXlzXCI7XG59KShJdGVyTW9kZSB8fCAoSXRlck1vZGUgPSB7fSkpO1xuLyoqXG5BIHBpZWNlIG9mIHN5bnRheCB0cmVlLiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gYXBwcm9hY2ggdGhlc2VcbnRyZWVzOiB0aGUgd2F5IHRoZXkgYXJlIGFjdHVhbGx5IHN0b3JlZCBpbiBtZW1vcnksIGFuZCB0aGVcbmNvbnZlbmllbnQgd2F5LlxuXG5TeW50YXggdHJlZXMgYXJlIHN0b3JlZCBhcyBhIHRyZWUgb2YgYFRyZWVgIGFuZCBgVHJlZUJ1ZmZlcmBcbm9iamVjdHMuIEJ5IHBhY2tpbmcgZGV0YWlsIGluZm9ybWF0aW9uIGludG8gYFRyZWVCdWZmZXJgIGxlYWZcbm5vZGVzLCB0aGUgcmVwcmVzZW50YXRpb24gaXMgbWFkZSBhIGxvdCBtb3JlIG1lbW9yeS1lZmZpY2llbnQuXG5cbkhvd2V2ZXIsIHdoZW4geW91IHdhbnQgdG8gYWN0dWFsbHkgd29yayB3aXRoIHRyZWUgbm9kZXMsIHRoaXNcbnJlcHJlc2VudGF0aW9uIGlzIHZlcnkgYXdrd2FyZCwgc28gbW9zdCBjbGllbnQgY29kZSB3aWxsIHdhbnQgdG9cbnVzZSB0aGUgW2BUcmVlQ3Vyc29yYF0oI2NvbW1vbi5UcmVlQ3Vyc29yKSBvclxuW2BTeW50YXhOb2RlYF0oI2NvbW1vbi5TeW50YXhOb2RlKSBpbnRlcmZhY2UgaW5zdGVhZCwgd2hpY2ggcHJvdmlkZXNcbmEgdmlldyBvbiBzb21lIHBhcnQgb2YgdGhpcyBkYXRhIHN0cnVjdHVyZSwgYW5kIGNhbiBiZSB1c2VkIHRvXG5tb3ZlIGFyb3VuZCB0byBhZGphY2VudCBub2Rlcy5cbiovXG5jbGFzcyBUcmVlIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBuZXcgdHJlZS4gU2VlIGFsc28gW2BUcmVlLmJ1aWxkYF0oI2NvbW1vbi5UcmVlXmJ1aWxkKS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0eXBlIG9mIHRoZSB0b3Agbm9kZS5cbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoaXMgbm9kZSdzIGNoaWxkIG5vZGVzLlxuICAgICovXG4gICAgY2hpbGRyZW4sIFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbnMgKG9mZnNldHMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgdHJlZSkgb2ZcbiAgICB0aGUgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBwb3NpdGlvbnMsIFxuICAgIC8qKlxuICAgIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhpcyB0cmVlXG4gICAgKi9cbiAgICBsZW5ndGgsIFxuICAgIC8qKlxuICAgIFBlci1ub2RlIFtub2RlIHByb3BzXSgjY29tbW9uLk5vZGVQcm9wKSB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBwcm9wcykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gcG9zaXRpb25zO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnByb3BzID0gbnVsbDtcbiAgICAgICAgaWYgKHByb3BzICYmIHByb3BzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICBmb3IgKGxldCBbcHJvcCwgdmFsdWVdIG9mIHByb3BzKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHNbdHlwZW9mIHByb3AgPT0gXCJudW1iZXJcIiA/IHByb3AgOiBwcm9wLmlkXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBtb3VudGVkID0gTW91bnRlZFRyZWUuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAobW91bnRlZCAmJiAhbW91bnRlZC5vdmVybGF5KVxuICAgICAgICAgICAgcmV0dXJuIG1vdW50ZWQudHJlZS50b1N0cmluZygpO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBjaCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBsZXQgc3RyID0gY2gudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmIChzdHIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuICs9IFwiLFwiO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuICs9IHN0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXRoaXMudHlwZS5uYW1lID8gY2hpbGRyZW4gOlxuICAgICAgICAgICAgKC9cXFcvLnRlc3QodGhpcy50eXBlLm5hbWUpICYmICF0aGlzLnR5cGUuaXNFcnJvciA/IEpTT04uc3RyaW5naWZ5KHRoaXMudHlwZS5uYW1lKSA6IHRoaXMudHlwZS5uYW1lKSArXG4gICAgICAgICAgICAgICAgKGNoaWxkcmVuLmxlbmd0aCA/IFwiKFwiICsgY2hpbGRyZW4gKyBcIilcIiA6IFwiXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbdHJlZSBjdXJzb3JdKCNjb21tb24uVHJlZUN1cnNvcikgcG9zaXRpb25lZCBhdCB0aGUgdG9wIG9mXG4gICAgdGhlIHRyZWUuIE1vZGUgY2FuIGJlIHVzZWQgdG8gW2NvbnRyb2xdKCNjb21tb24uSXRlck1vZGUpIHdoaWNoXG4gICAgbm9kZXMgdGhlIGN1cnNvciB2aXNpdHMuXG4gICAgKi9cbiAgICBjdXJzb3IobW9kZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlQ3Vyc29yKHRoaXMudG9wTm9kZSwgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIFt0cmVlIGN1cnNvcl0oI2NvbW1vbi5UcmVlQ3Vyc29yKSBwb2ludGluZyBpbnRvIHRoaXMgdHJlZVxuICAgIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgc2lkZSAoc2VlXG4gICAgW2Btb3ZlVG9gXSgjY29tbW9uLlRyZWVDdXJzb3IubW92ZVRvKS5cbiAgICAqL1xuICAgIGN1cnNvckF0KHBvcywgc2lkZSA9IDAsIG1vZGUgPSAwKSB7XG4gICAgICAgIGxldCBzY29wZSA9IENhY2hlZE5vZGUuZ2V0KHRoaXMpIHx8IHRoaXMudG9wTm9kZTtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBUcmVlQ3Vyc29yKHNjb3BlKTtcbiAgICAgICAgY3Vyc29yLm1vdmVUbyhwb3MsIHNpZGUpO1xuICAgICAgICBDYWNoZWROb2RlLnNldCh0aGlzLCBjdXJzb3IuX3RyZWUpO1xuICAgICAgICByZXR1cm4gY3Vyc29yO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbc3ludGF4IG5vZGVdKCNjb21tb24uU3ludGF4Tm9kZSkgb2JqZWN0IGZvciB0aGUgdG9wIG9mIHRoZVxuICAgIHRyZWUuXG4gICAgKi9cbiAgICBnZXQgdG9wTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlTm9kZSh0aGlzLCAwLCAwLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBbc3ludGF4IG5vZGVdKCNjb21tb24uU3ludGF4Tm9kZSkgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgIElmIGBzaWRlYCBpcyAtMSwgdGhpcyB3aWxsIG1vdmUgaW50byBub2RlcyB0aGF0IGVuZCBhdCB0aGVcbiAgICBwb3NpdGlvbi4gSWYgMSwgaXQnbGwgbW92ZSBpbnRvIG5vZGVzIHRoYXQgc3RhcnQgYXQgdGhlXG4gICAgcG9zaXRpb24uIFdpdGggMCwgaXQnbGwgb25seSBlbnRlciBub2RlcyB0aGF0IGNvdmVyIHRoZSBwb3NpdGlvblxuICAgIGZyb20gYm90aCBzaWRlcy5cbiAgICBcbiAgICBOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdCBlbnRlclxuICAgIFtvdmVybGF5c10oI2NvbW1vbi5Nb3VudGVkVHJlZS5vdmVybGF5KSwgYW5kIHlvdSBvZnRlbiB3YW50XG4gICAgW2ByZXNvbHZlSW5uZXJgXSgjY29tbW9uLlRyZWUucmVzb2x2ZUlubmVyKSBpbnN0ZWFkLlxuICAgICovXG4gICAgcmVzb2x2ZShwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIGxldCBub2RlID0gcmVzb2x2ZU5vZGUoQ2FjaGVkTm9kZS5nZXQodGhpcykgfHwgdGhpcy50b3BOb2RlLCBwb3MsIHNpZGUsIGZhbHNlKTtcbiAgICAgICAgQ2FjaGVkTm9kZS5zZXQodGhpcywgbm9kZSk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICBMaWtlIFtgcmVzb2x2ZWBdKCNjb21tb24uVHJlZS5yZXNvbHZlKSwgYnV0IHdpbGwgZW50ZXJcbiAgICBbb3ZlcmxhaWRdKCNjb21tb24uTW91bnRlZFRyZWUub3ZlcmxheSkgbm9kZXMsIHByb2R1Y2luZyBhIHN5bnRheCBub2RlXG4gICAgcG9pbnRpbmcgaW50byB0aGUgaW5uZXJtb3N0IG92ZXJsYWlkIHRyZWUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uXG4gICAgKHdpdGggcGFyZW50IGxpbmtzIGdvaW5nIHRocm91Z2ggYWxsIHBhcmVudCBzdHJ1Y3R1cmUsIGluY2x1ZGluZ1xuICAgIHRoZSBob3N0IHRyZWVzKS5cbiAgICAqL1xuICAgIHJlc29sdmVJbm5lcihwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIGxldCBub2RlID0gcmVzb2x2ZU5vZGUoQ2FjaGVkSW5uZXJOb2RlLmdldCh0aGlzKSB8fCB0aGlzLnRvcE5vZGUsIHBvcywgc2lkZSwgdHJ1ZSk7XG4gICAgICAgIENhY2hlZElubmVyTm9kZS5zZXQodGhpcywgbm9kZSk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICBJbiBzb21lIHNpdHVhdGlvbnMsIGl0IGNhbiBiZSB1c2VmdWwgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbFxuICAgIG5vZGVzIGFyb3VuZCBhIHBvc2l0aW9uLCBpbmNsdWRpbmcgdGhvc2UgaW4gb3ZlcmxheXMgdGhhdCBkb24ndFxuICAgIGRpcmVjdGx5IGNvdmVyIHRoZSBwb3NpdGlvbi4gVGhpcyBtZXRob2QgZ2l2ZXMgeW91IGFuIGl0ZXJhdG9yXG4gICAgdGhhdCB3aWxsIHByb2R1Y2UgYWxsIG5vZGVzLCBmcm9tIHNtYWxsIHRvIGJpZywgYXJvdW5kIHRoZSBnaXZlblxuICAgIHBvc2l0aW9uLlxuICAgICovXG4gICAgcmVzb2x2ZVN0YWNrKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrSXRlcmF0b3IodGhpcywgcG9zLCBzaWRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGFuZCBpdHMgY2hpbGRyZW4sIGNhbGxpbmcgYGVudGVyYCBmb3IgYW55XG4gICAgbm9kZSB0aGF0IHRvdWNoZXMgdGhlIGBmcm9tYC9gdG9gIHJlZ2lvbiAoaWYgZ2l2ZW4pIGJlZm9yZVxuICAgIHJ1bm5pbmcgb3ZlciBzdWNoIGEgbm9kZSdzIGNoaWxkcmVuLCBhbmQgYGxlYXZlYCAoaWYgZ2l2ZW4pIHdoZW5cbiAgICBsZWF2aW5nIHRoZSBub2RlLiBXaGVuIGBlbnRlcmAgcmV0dXJucyBgZmFsc2VgLCB0aGF0IG5vZGUgd2lsbFxuICAgIG5vdCBoYXZlIGl0cyBjaGlsZHJlbiBpdGVyYXRlZCBvdmVyIChvciBgbGVhdmVgIGNhbGxlZCkuXG4gICAgKi9cbiAgICBpdGVyYXRlKHNwZWMpIHtcbiAgICAgICAgbGV0IHsgZW50ZXIsIGxlYXZlLCBmcm9tID0gMCwgdG8gPSB0aGlzLmxlbmd0aCB9ID0gc3BlYztcbiAgICAgICAgbGV0IG1vZGUgPSBzcGVjLm1vZGUgfHwgMCwgYW5vbiA9IChtb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgPiAwO1xuICAgICAgICBmb3IgKGxldCBjID0gdGhpcy5jdXJzb3IobW9kZSB8IEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpOzspIHtcbiAgICAgICAgICAgIGxldCBlbnRlcmVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoYy5mcm9tIDw9IHRvICYmIGMudG8gPj0gZnJvbSAmJiAoIWFub24gJiYgYy50eXBlLmlzQW5vbnltb3VzIHx8IGVudGVyKGMpICE9PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYy5maXJzdENoaWxkKCkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGVudGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGlmIChlbnRlcmVkICYmIGxlYXZlICYmIChhbm9uIHx8ICFjLnR5cGUuaXNBbm9ueW1vdXMpKVxuICAgICAgICAgICAgICAgICAgICBsZWF2ZShjKTtcbiAgICAgICAgICAgICAgICBpZiAoYy5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoIWMucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBlbnRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBbbm9kZSBwcm9wXSgjY29tbW9uLk5vZGVQcm9wKSBmb3IgdGhpc1xuICAgIG5vZGUuIFdvcmtzIHdpdGggYm90aCBwZXItbm9kZSBhbmQgcGVyLXR5cGUgcHJvcHMuXG4gICAgKi9cbiAgICBwcm9wKHByb3ApIHtcbiAgICAgICAgcmV0dXJuICFwcm9wLnBlck5vZGUgPyB0aGlzLnR5cGUucHJvcChwcm9wKSA6IHRoaXMucHJvcHMgPyB0aGlzLnByb3BzW3Byb3AuaWRdIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBub2RlJ3MgW3Blci1ub2RlIHByb3BzXSgjY29tbW9uLk5vZGVQcm9wLnBlck5vZGUpIGluIGFcbiAgICBmb3JtYXQgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBbYFRyZWVgXSgjY29tbW9uLlRyZWUpXG4gICAgY29uc3RydWN0b3IuXG4gICAgKi9cbiAgICBnZXQgcHJvcFZhbHVlcygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAodGhpcy5wcm9wcylcbiAgICAgICAgICAgIGZvciAobGV0IGlkIGluIHRoaXMucHJvcHMpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goWytpZCwgdGhpcy5wcm9wc1tpZF1dKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQmFsYW5jZSB0aGUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoaXMgdHJlZSwgcHJvZHVjaW5nIGEgY29weSBvZlxuICAgIHdoaWNoIG1heSBoYXZlIGNoaWxkcmVuIGdyb3VwZWQgaW50byBzdWJ0cmVlcyB3aXRoIHR5cGVcbiAgICBbYE5vZGVUeXBlLm5vbmVgXSgjY29tbW9uLk5vZGVUeXBlXm5vbmUpLlxuICAgICovXG4gICAgYmFsYW5jZShjb25maWcgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGggPD0gOCAvKiBCYWxhbmNlLkJyYW5jaEZhY3RvciAqLyA/IHRoaXMgOlxuICAgICAgICAgICAgYmFsYW5jZVJhbmdlKE5vZGVUeXBlLm5vbmUsIHRoaXMuY2hpbGRyZW4sIHRoaXMucG9zaXRpb25zLCAwLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgMCwgdGhpcy5sZW5ndGgsIChjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpID0+IG5ldyBUcmVlKHRoaXMudHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoLCB0aGlzLnByb3BWYWx1ZXMpLCBjb25maWcubWFrZVRyZWUgfHwgKChjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpID0+IG5ldyBUcmVlKE5vZGVUeXBlLm5vbmUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQnVpbGQgYSB0cmVlIGZyb20gYSBwb3N0Zml4LW9yZGVyZWQgYnVmZmVyIG9mIG5vZGUgaW5mb3JtYXRpb24sXG4gICAgb3IgYSBjdXJzb3Igb3ZlciBzdWNoIGEgYnVmZmVyLlxuICAgICovXG4gICAgc3RhdGljIGJ1aWxkKGRhdGEpIHsgcmV0dXJuIGJ1aWxkVHJlZShkYXRhKTsgfVxufVxuLyoqXG5UaGUgZW1wdHkgdHJlZVxuKi9cblRyZWUuZW1wdHkgPSBuZXcgVHJlZShOb2RlVHlwZS5ub25lLCBbXSwgW10sIDApO1xuY2xhc3MgRmxhdEJ1ZmZlckN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoYnVmZmVyLCBpbmRleCkge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICBnZXQgaWQoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gNF07IH1cbiAgICBnZXQgc3RhcnQoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gM107IH1cbiAgICBnZXQgZW5kKCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDJdOyB9XG4gICAgZ2V0IHNpemUoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gMV07IH1cbiAgICBnZXQgcG9zKCkgeyByZXR1cm4gdGhpcy5pbmRleDsgfVxuICAgIG5leHQoKSB7IHRoaXMuaW5kZXggLT0gNDsgfVxuICAgIGZvcmsoKSB7IHJldHVybiBuZXcgRmxhdEJ1ZmZlckN1cnNvcih0aGlzLmJ1ZmZlciwgdGhpcy5pbmRleCk7IH1cbn1cbi8qKlxuVHJlZSBidWZmZXJzIGNvbnRhaW4gKHR5cGUsIHN0YXJ0LCBlbmQsIGVuZEluZGV4KSBxdWFkcyBmb3IgZWFjaFxubm9kZS4gSW4gc3VjaCBhIGJ1ZmZlciwgbm9kZXMgYXJlIHN0b3JlZCBpbiBwcmVmaXggb3JkZXIgKHBhcmVudHNcbmJlZm9yZSBjaGlsZHJlbiwgd2l0aCB0aGUgZW5kSW5kZXggb2YgdGhlIHBhcmVudCBpbmRpY2F0aW5nIHdoaWNoXG5jaGlsZHJlbiBiZWxvbmcgdG8gaXQpLlxuKi9cbmNsYXNzIFRyZWVCdWZmZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHRyZWUgYnVmZmVyLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGJ1ZmZlcidzIGNvbnRlbnQuXG4gICAgKi9cbiAgICBidWZmZXIsIFxuICAgIC8qKlxuICAgIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGdyb3VwIG9mIG5vZGVzIGluIHRoZSBidWZmZXIuXG4gICAgKi9cbiAgICBsZW5ndGgsIFxuICAgIC8qKlxuICAgIFRoZSBub2RlIHNldCB1c2VkIGluIHRoaXMgYnVmZmVyLlxuICAgICovXG4gICAgc2V0KSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5zZXQgPSBzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IHR5cGUoKSB7IHJldHVybiBOb2RlVHlwZS5ub25lOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5idWZmZXIubGVuZ3RoOykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jaGlsZFN0cmluZyhpbmRleCkpO1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmJ1ZmZlcltpbmRleCArIDNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuam9pbihcIixcIik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2hpbGRTdHJpbmcoaW5kZXgpIHtcbiAgICAgICAgbGV0IGlkID0gdGhpcy5idWZmZXJbaW5kZXhdLCBlbmRJbmRleCA9IHRoaXMuYnVmZmVyW2luZGV4ICsgM107XG4gICAgICAgIGxldCB0eXBlID0gdGhpcy5zZXQudHlwZXNbaWRdLCByZXN1bHQgPSB0eXBlLm5hbWU7XG4gICAgICAgIGlmICgvXFxXLy50ZXN0KHJlc3VsdCkgJiYgIXR5cGUuaXNFcnJvcilcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdCk7XG4gICAgICAgIGluZGV4ICs9IDQ7XG4gICAgICAgIGlmIChlbmRJbmRleCA9PSBpbmRleClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IFtdO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmRJbmRleCkge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkU3RyaW5nKGluZGV4KSk7XG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuYnVmZmVyW2luZGV4ICsgM107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIFwiKFwiICsgY2hpbGRyZW4uam9pbihcIixcIikgKyBcIilcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmaW5kQ2hpbGQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIGRpciwgcG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcywgcGljayA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSAhPSBlbmRJbmRleDsgaSA9IGJ1ZmZlcltpICsgM10pIHtcbiAgICAgICAgICAgIGlmIChjaGVja1NpZGUoc2lkZSwgcG9zLCBidWZmZXJbaSArIDFdLCBidWZmZXJbaSArIDJdKSkge1xuICAgICAgICAgICAgICAgIHBpY2sgPSBpO1xuICAgICAgICAgICAgICAgIGlmIChkaXIgPiAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGljaztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzbGljZShzdGFydEksIGVuZEksIGZyb20pIHtcbiAgICAgICAgbGV0IGIgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgbGV0IGNvcHkgPSBuZXcgVWludDE2QXJyYXkoZW5kSSAtIHN0YXJ0SSksIGxlbiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEksIGogPSAwOyBpIDwgZW5kSTspIHtcbiAgICAgICAgICAgIGNvcHlbaisrXSA9IGJbaSsrXTtcbiAgICAgICAgICAgIGNvcHlbaisrXSA9IGJbaSsrXSAtIGZyb207XG4gICAgICAgICAgICBsZXQgdG8gPSBjb3B5W2orK10gPSBiW2krK10gLSBmcm9tO1xuICAgICAgICAgICAgY29weVtqKytdID0gYltpKytdIC0gc3RhcnRJO1xuICAgICAgICAgICAgbGVuID0gTWF0aC5tYXgobGVuLCB0byk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlQnVmZmVyKGNvcHksIGxlbiwgdGhpcy5zZXQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrU2lkZShzaWRlLCBwb3MsIGZyb20sIHRvKSB7XG4gICAgc3dpdGNoIChzaWRlKSB7XG4gICAgICAgIGNhc2UgLTIgLyogU2lkZS5CZWZvcmUgKi86IHJldHVybiBmcm9tIDwgcG9zO1xuICAgICAgICBjYXNlIC0xIC8qIFNpZGUuQXRPckJlZm9yZSAqLzogcmV0dXJuIHRvID49IHBvcyAmJiBmcm9tIDwgcG9zO1xuICAgICAgICBjYXNlIDAgLyogU2lkZS5Bcm91bmQgKi86IHJldHVybiBmcm9tIDwgcG9zICYmIHRvID4gcG9zO1xuICAgICAgICBjYXNlIDEgLyogU2lkZS5BdE9yQWZ0ZXIgKi86IHJldHVybiBmcm9tIDw9IHBvcyAmJiB0byA+IHBvcztcbiAgICAgICAgY2FzZSAyIC8qIFNpZGUuQWZ0ZXIgKi86IHJldHVybiB0byA+IHBvcztcbiAgICAgICAgY2FzZSA0IC8qIFNpZGUuRG9udENhcmUgKi86IHJldHVybiB0cnVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVOb2RlKG5vZGUsIHBvcywgc2lkZSwgb3ZlcmxheXMpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gTW92ZSB1cCB0byBhIG5vZGUgdGhhdCBhY3R1YWxseSBob2xkcyB0aGUgcG9zaXRpb24sIGlmIHBvc3NpYmxlXG4gICAgd2hpbGUgKG5vZGUuZnJvbSA9PSBub2RlLnRvIHx8XG4gICAgICAgIChzaWRlIDwgMSA/IG5vZGUuZnJvbSA+PSBwb3MgOiBub2RlLmZyb20gPiBwb3MpIHx8XG4gICAgICAgIChzaWRlID4gLTEgPyBub2RlLnRvIDw9IHBvcyA6IG5vZGUudG8gPCBwb3MpKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSAhb3ZlcmxheXMgJiYgbm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlICYmIG5vZGUuaW5kZXggPCAwID8gbnVsbCA6IG5vZGUucGFyZW50O1xuICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICBub2RlID0gcGFyZW50O1xuICAgIH1cbiAgICBsZXQgbW9kZSA9IG92ZXJsYXlzID8gMCA6IEl0ZXJNb2RlLklnbm9yZU92ZXJsYXlzO1xuICAgIC8vIE11c3QgZ28gdXAgb3V0IG9mIG92ZXJsYXlzIHdoZW4gdGhvc2UgZG8gbm90IG92ZXJsYXAgd2l0aCBwb3NcbiAgICBpZiAob3ZlcmxheXMpXG4gICAgICAgIGZvciAobGV0IHNjYW4gPSBub2RlLCBwYXJlbnQgPSBzY2FuLnBhcmVudDsgcGFyZW50OyBzY2FuID0gcGFyZW50LCBwYXJlbnQgPSBzY2FuLnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHNjYW4gaW5zdGFuY2VvZiBUcmVlTm9kZSAmJiBzY2FuLmluZGV4IDwgMCAmJiAoKF9hID0gcGFyZW50LmVudGVyKHBvcywgc2lkZSwgbW9kZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mcm9tKSAhPSBzY2FuLmZyb20pXG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgIGZvciAoOzspIHtcbiAgICAgICAgbGV0IGlubmVyID0gbm9kZS5lbnRlcihwb3MsIHNpZGUsIG1vZGUpO1xuICAgICAgICBpZiAoIWlubmVyKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBpbm5lcjtcbiAgICB9XG59XG5jbGFzcyBCYXNlTm9kZSB7XG4gICAgY3Vyc29yKG1vZGUgPSAwKSB7IHJldHVybiBuZXcgVHJlZUN1cnNvcih0aGlzLCBtb2RlKTsgfVxuICAgIGdldENoaWxkKHR5cGUsIGJlZm9yZSA9IG51bGwsIGFmdGVyID0gbnVsbCkge1xuICAgICAgICBsZXQgciA9IGdldENoaWxkcmVuKHRoaXMsIHR5cGUsIGJlZm9yZSwgYWZ0ZXIpO1xuICAgICAgICByZXR1cm4gci5sZW5ndGggPyByWzBdIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0Q2hpbGRyZW4odHlwZSwgYmVmb3JlID0gbnVsbCwgYWZ0ZXIgPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBnZXRDaGlsZHJlbih0aGlzLCB0eXBlLCBiZWZvcmUsIGFmdGVyKTtcbiAgICB9XG4gICAgcmVzb2x2ZShwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlTm9kZSh0aGlzLCBwb3MsIHNpZGUsIGZhbHNlKTtcbiAgICB9XG4gICAgcmVzb2x2ZUlubmVyKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVOb2RlKHRoaXMsIHBvcywgc2lkZSwgdHJ1ZSk7XG4gICAgfVxuICAgIG1hdGNoQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBtYXRjaE5vZGVDb250ZXh0KHRoaXMucGFyZW50LCBjb250ZXh0KTtcbiAgICB9XG4gICAgZW50ZXJVbmZpbmlzaGVkTm9kZXNCZWZvcmUocG9zKSB7XG4gICAgICAgIGxldCBzY2FuID0gdGhpcy5jaGlsZEJlZm9yZShwb3MpLCBub2RlID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHNjYW4pIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gc2Nhbi5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoIWxhc3QgfHwgbGFzdC50byAhPSBzY2FuLnRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKGxhc3QudHlwZS5pc0Vycm9yICYmIGxhc3QuZnJvbSA9PSBsYXN0LnRvKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHNjYW47XG4gICAgICAgICAgICAgICAgc2NhbiA9IGxhc3QucHJldlNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY2FuID0gbGFzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZ2V0IG5vZGUoKSB7IHJldHVybiB0aGlzOyB9XG4gICAgZ2V0IG5leHQoKSB7IHJldHVybiB0aGlzLnBhcmVudDsgfVxufVxuY2xhc3MgVHJlZU5vZGUgZXh0ZW5kcyBCYXNlTm9kZSB7XG4gICAgY29uc3RydWN0b3IoX3RyZWUsIGZyb20sIFxuICAgIC8vIEluZGV4IGluIHBhcmVudCBub2RlLCBzZXQgdG8gLTEgaWYgdGhlIG5vZGUgaXMgbm90IGEgZGlyZWN0IGNoaWxkIG9mIF9wYXJlbnQubm9kZSAob3ZlcmxheSlcbiAgICBpbmRleCwgX3BhcmVudCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl90cmVlID0gX3RyZWU7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gX3BhcmVudDtcbiAgICB9XG4gICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90cmVlLnR5cGU7IH1cbiAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX3RyZWUudHlwZS5uYW1lOyB9XG4gICAgZ2V0IHRvKCkgeyByZXR1cm4gdGhpcy5mcm9tICsgdGhpcy5fdHJlZS5sZW5ndGg7IH1cbiAgICBuZXh0Q2hpbGQoaSwgZGlyLCBwb3MsIHNpZGUsIG1vZGUgPSAwKSB7XG4gICAgICAgIGZvciAobGV0IHBhcmVudCA9IHRoaXM7Oykge1xuICAgICAgICAgICAgZm9yIChsZXQgeyBjaGlsZHJlbiwgcG9zaXRpb25zIH0gPSBwYXJlbnQuX3RyZWUsIGUgPSBkaXIgPiAwID8gY2hpbGRyZW4ubGVuZ3RoIDogLTE7IGkgIT0gZTsgaSArPSBkaXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGNoaWxkcmVuW2ldLCBzdGFydCA9IHBvc2l0aW9uc1tpXSArIHBhcmVudC5mcm9tO1xuICAgICAgICAgICAgICAgIGlmICghY2hlY2tTaWRlKHNpZGUsIHBvcywgc3RhcnQsIHN0YXJ0ICsgbmV4dC5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIFRyZWVCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgJiBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBuZXh0LmZpbmRDaGlsZCgwLCBuZXh0LmJ1ZmZlci5sZW5ndGgsIGRpciwgcG9zIC0gc3RhcnQsIHNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyTm9kZShuZXcgQnVmZmVyQ29udGV4dChwYXJlbnQsIG5leHQsIGksIHN0YXJ0KSwgbnVsbCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgobW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpIHx8ICghbmV4dC50eXBlLmlzQW5vbnltb3VzIHx8IGhhc0NoaWxkKG5leHQpKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbW91bnRlZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEobW9kZSAmIEl0ZXJNb2RlLklnbm9yZU1vdW50cykgJiYgKG1vdW50ZWQgPSBNb3VudGVkVHJlZS5nZXQobmV4dCkpICYmICFtb3VudGVkLm92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRyZWVOb2RlKG1vdW50ZWQudHJlZSwgc3RhcnQsIGksIHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbm5lciA9IG5ldyBUcmVlTm9kZShuZXh0LCBzdGFydCwgaSwgcGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgfHwgIWlubmVyLnR5cGUuaXNBbm9ueW1vdXMgPyBpbm5lclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpbm5lci5uZXh0Q2hpbGQoZGlyIDwgMCA/IG5leHQuY2hpbGRyZW4ubGVuZ3RoIC0gMSA6IDAsIGRpciwgcG9zLCBzaWRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSB8fCAhcGFyZW50LnR5cGUuaXNBbm9ueW1vdXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAocGFyZW50LmluZGV4ID49IDApXG4gICAgICAgICAgICAgICAgaSA9IHBhcmVudC5pbmRleCArIGRpcjtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBpID0gZGlyIDwgMCA/IC0xIDogcGFyZW50Ll9wYXJlbnQuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9wYXJlbnQ7XG4gICAgICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMubmV4dENoaWxkKDAsIDEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5uZXh0Q2hpbGQodGhpcy5fdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxLCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIGNoaWxkQWZ0ZXIocG9zKSB7IHJldHVybiB0aGlzLm5leHRDaGlsZCgwLCAxLCBwb3MsIDIgLyogU2lkZS5BZnRlciAqLyk7IH1cbiAgICBjaGlsZEJlZm9yZShwb3MpIHsgcmV0dXJuIHRoaXMubmV4dENoaWxkKHRoaXMuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMSwgLTEsIHBvcywgLTIgLyogU2lkZS5CZWZvcmUgKi8pOyB9XG4gICAgZW50ZXIocG9zLCBzaWRlLCBtb2RlID0gMCkge1xuICAgICAgICBsZXQgbW91bnRlZDtcbiAgICAgICAgaWYgKCEobW9kZSAmIEl0ZXJNb2RlLklnbm9yZU92ZXJsYXlzKSAmJiAobW91bnRlZCA9IE1vdW50ZWRUcmVlLmdldCh0aGlzLl90cmVlKSkgJiYgbW91bnRlZC5vdmVybGF5KSB7XG4gICAgICAgICAgICBsZXQgclBvcyA9IHBvcyAtIHRoaXMuZnJvbTtcbiAgICAgICAgICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiBtb3VudGVkLm92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHNpZGUgPiAwID8gZnJvbSA8PSByUG9zIDogZnJvbSA8IHJQb3MpICYmXG4gICAgICAgICAgICAgICAgICAgIChzaWRlIDwgMCA/IHRvID49IHJQb3MgOiB0byA+IHJQb3MpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRyZWVOb2RlKG1vdW50ZWQudHJlZSwgbW91bnRlZC5vdmVybGF5WzBdLmZyb20gKyB0aGlzLmZyb20sIC0xLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0Q2hpbGQoMCwgMSwgcG9zLCBzaWRlLCBtb2RlKTtcbiAgICB9XG4gICAgbmV4dFNpZ25pZmljYW50UGFyZW50KCkge1xuICAgICAgICBsZXQgdmFsID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHZhbC50eXBlLmlzQW5vbnltb3VzICYmIHZhbC5fcGFyZW50KVxuICAgICAgICAgICAgdmFsID0gdmFsLl9wYXJlbnQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIGdldCBwYXJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgPyB0aGlzLl9wYXJlbnQubmV4dFNpZ25pZmljYW50UGFyZW50KCkgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgbmV4dFNpYmxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgJiYgdGhpcy5pbmRleCA+PSAwID8gdGhpcy5fcGFyZW50Lm5leHRDaGlsZCh0aGlzLmluZGV4ICsgMSwgMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBwcmV2U2libGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCAmJiB0aGlzLmluZGV4ID49IDAgPyB0aGlzLl9wYXJlbnQubmV4dENoaWxkKHRoaXMuaW5kZXggLSAxLCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCB0cmVlKCkgeyByZXR1cm4gdGhpcy5fdHJlZTsgfVxuICAgIHRvVHJlZSgpIHsgcmV0dXJuIHRoaXMuX3RyZWU7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gdGhpcy5fdHJlZS50b1N0cmluZygpOyB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZHJlbihub2RlLCB0eXBlLCBiZWZvcmUsIGFmdGVyKSB7XG4gICAgbGV0IGN1ciA9IG5vZGUuY3Vyc29yKCksIHJlc3VsdCA9IFtdO1xuICAgIGlmICghY3VyLmZpcnN0Q2hpbGQoKSlcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICBpZiAoYmVmb3JlICE9IG51bGwpXG4gICAgICAgIGZvciAobGV0IGZvdW5kID0gZmFsc2U7ICFmb3VuZDspIHtcbiAgICAgICAgICAgIGZvdW5kID0gY3VyLnR5cGUuaXMoYmVmb3JlKTtcbiAgICAgICAgICAgIGlmICghY3VyLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKGFmdGVyICE9IG51bGwgJiYgY3VyLnR5cGUuaXMoYWZ0ZXIpKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgaWYgKGN1ci50eXBlLmlzKHR5cGUpKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY3VyLm5vZGUpO1xuICAgICAgICBpZiAoIWN1ci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgcmV0dXJuIGFmdGVyID09IG51bGwgPyByZXN1bHQgOiBbXTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYXRjaE5vZGVDb250ZXh0KG5vZGUsIGNvbnRleHQsIGkgPSBjb250ZXh0Lmxlbmd0aCAtIDEpIHtcbiAgICBmb3IgKGxldCBwID0gbm9kZTsgaSA+PSAwOyBwID0gcC5wYXJlbnQpIHtcbiAgICAgICAgaWYgKCFwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXAudHlwZS5pc0Fub255bW91cykge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRbaV0gJiYgY29udGV4dFtpXSAhPSBwLm5hbWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaS0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuY2xhc3MgQnVmZmVyQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCBidWZmZXIsIGluZGV4LCBzdGFydCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgIH1cbn1cbmNsYXNzIEJ1ZmZlck5vZGUgZXh0ZW5kcyBCYXNlTm9kZSB7XG4gICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLnR5cGUubmFtZTsgfVxuICAgIGdldCBmcm9tKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LnN0YXJ0ICsgdGhpcy5jb250ZXh0LmJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDFdOyB9XG4gICAgZ2V0IHRvKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LnN0YXJ0ICsgdGhpcy5jb250ZXh0LmJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDJdOyB9XG4gICAgY29uc3RydWN0b3IoY29udGV4dCwgX3BhcmVudCwgaW5kZXgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gX3BhcmVudDtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLnR5cGUgPSBjb250ZXh0LmJ1ZmZlci5zZXQudHlwZXNbY29udGV4dC5idWZmZXIuYnVmZmVyW2luZGV4XV07XG4gICAgfVxuICAgIGNoaWxkKGRpciwgcG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgaW5kZXggPSBidWZmZXIuZmluZENoaWxkKHRoaXMuaW5kZXggKyA0LCBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXSwgZGlyLCBwb3MgLSB0aGlzLmNvbnRleHQuc3RhcnQsIHNpZGUpO1xuICAgICAgICByZXR1cm4gaW5kZXggPCAwID8gbnVsbCA6IG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcywgaW5kZXgpO1xuICAgIH1cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY2hpbGQoMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIGdldCBsYXN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmNoaWxkKC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgY2hpbGRBZnRlcihwb3MpIHsgcmV0dXJuIHRoaXMuY2hpbGQoMSwgcG9zLCAyIC8qIFNpZGUuQWZ0ZXIgKi8pOyB9XG4gICAgY2hpbGRCZWZvcmUocG9zKSB7IHJldHVybiB0aGlzLmNoaWxkKC0xLCBwb3MsIC0yIC8qIFNpZGUuQmVmb3JlICovKTsgfVxuICAgIGVudGVyKHBvcywgc2lkZSwgbW9kZSA9IDApIHtcbiAgICAgICAgaWYgKG1vZGUgJiBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IGluZGV4ID0gYnVmZmVyLmZpbmRDaGlsZCh0aGlzLmluZGV4ICsgNCwgYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM10sIHNpZGUgPiAwID8gMSA6IC0xLCBwb3MgLSB0aGlzLmNvbnRleHQuc3RhcnQsIHNpZGUpO1xuICAgICAgICByZXR1cm4gaW5kZXggPCAwID8gbnVsbCA6IG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcywgaW5kZXgpO1xuICAgIH1cbiAgICBnZXQgcGFyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50IHx8IHRoaXMuY29udGV4dC5wYXJlbnQubmV4dFNpZ25pZmljYW50UGFyZW50KCk7XG4gICAgfVxuICAgIGV4dGVybmFsU2libGluZyhkaXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCA/IG51bGwgOiB0aGlzLmNvbnRleHQucGFyZW50Lm5leHRDaGlsZCh0aGlzLmNvbnRleHQuaW5kZXggKyBkaXIsIGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTtcbiAgICB9XG4gICAgZ2V0IG5leHRTaWJsaW5nKCkge1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IGFmdGVyID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM107XG4gICAgICAgIGlmIChhZnRlciA8ICh0aGlzLl9wYXJlbnQgPyBidWZmZXIuYnVmZmVyW3RoaXMuX3BhcmVudC5pbmRleCArIDNdIDogYnVmZmVyLmJ1ZmZlci5sZW5ndGgpKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcy5fcGFyZW50LCBhZnRlcik7XG4gICAgICAgIHJldHVybiB0aGlzLmV4dGVybmFsU2libGluZygxKTtcbiAgICB9XG4gICAgZ2V0IHByZXZTaWJsaW5nKCkge1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHBhcmVudFN0YXJ0ID0gdGhpcy5fcGFyZW50ID8gdGhpcy5fcGFyZW50LmluZGV4ICsgNCA6IDA7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09IHBhcmVudFN0YXJ0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZXJuYWxTaWJsaW5nKC0xKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcy5fcGFyZW50LCBidWZmZXIuZmluZENoaWxkKHBhcmVudFN0YXJ0LCB0aGlzLmluZGV4LCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSk7XG4gICAgfVxuICAgIGdldCB0cmVlKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIHRvVHJlZSgpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gW10sIHBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHN0YXJ0SSA9IHRoaXMuaW5kZXggKyA0LCBlbmRJID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM107XG4gICAgICAgIGlmIChlbmRJID4gc3RhcnRJKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDFdO1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChidWZmZXIuc2xpY2Uoc3RhcnRJLCBlbmRJLCBmcm9tKSk7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRyZWUodGhpcy50eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCB0aGlzLnRvIC0gdGhpcy5mcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5idWZmZXIuY2hpbGRTdHJpbmcodGhpcy5pbmRleCk7IH1cbn1cbmZ1bmN0aW9uIGl0ZXJTdGFjayhoZWFkcykge1xuICAgIGlmICghaGVhZHMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgcGljayA9IDAsIHBpY2tlZCA9IGhlYWRzWzBdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaGVhZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG5vZGUgPSBoZWFkc1tpXTtcbiAgICAgICAgaWYgKG5vZGUuZnJvbSA+IHBpY2tlZC5mcm9tIHx8IG5vZGUudG8gPCBwaWNrZWQudG8pIHtcbiAgICAgICAgICAgIHBpY2tlZCA9IG5vZGU7XG4gICAgICAgICAgICBwaWNrID0gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgbmV4dCA9IHBpY2tlZCBpbnN0YW5jZW9mIFRyZWVOb2RlICYmIHBpY2tlZC5pbmRleCA8IDAgPyBudWxsIDogcGlja2VkLnBhcmVudDtcbiAgICBsZXQgbmV3SGVhZHMgPSBoZWFkcy5zbGljZSgpO1xuICAgIGlmIChuZXh0KVxuICAgICAgICBuZXdIZWFkc1twaWNrXSA9IG5leHQ7XG4gICAgZWxzZVxuICAgICAgICBuZXdIZWFkcy5zcGxpY2UocGljaywgMSk7XG4gICAgcmV0dXJuIG5ldyBTdGFja0l0ZXJhdG9yKG5ld0hlYWRzLCBwaWNrZWQpO1xufVxuY2xhc3MgU3RhY2tJdGVyYXRvciB7XG4gICAgY29uc3RydWN0b3IoaGVhZHMsIG5vZGUpIHtcbiAgICAgICAgdGhpcy5oZWFkcyA9IGhlYWRzO1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIH1cbiAgICBnZXQgbmV4dCgpIHsgcmV0dXJuIGl0ZXJTdGFjayh0aGlzLmhlYWRzKTsgfVxufVxuZnVuY3Rpb24gc3RhY2tJdGVyYXRvcih0cmVlLCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgaW5uZXIgPSB0cmVlLnJlc29sdmVJbm5lcihwb3MsIHNpZGUpLCBsYXllcnMgPSBudWxsO1xuICAgIGZvciAobGV0IHNjYW4gPSBpbm5lciBpbnN0YW5jZW9mIFRyZWVOb2RlID8gaW5uZXIgOiBpbm5lci5jb250ZXh0LnBhcmVudDsgc2Nhbjsgc2NhbiA9IHNjYW4ucGFyZW50KSB7XG4gICAgICAgIGlmIChzY2FuLmluZGV4IDwgMCkgeyAvLyBUaGlzIGlzIGFuIG92ZXJsYXkgcm9vdFxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHNjYW4ucGFyZW50O1xuICAgICAgICAgICAgKGxheWVycyB8fCAobGF5ZXJzID0gW2lubmVyXSkpLnB1c2gocGFyZW50LnJlc29sdmUocG9zLCBzaWRlKSk7XG4gICAgICAgICAgICBzY2FuID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1vdW50ID0gTW91bnRlZFRyZWUuZ2V0KHNjYW4udHJlZSk7XG4gICAgICAgICAgICAvLyBSZWxldmFudCBvdmVybGF5IGJyYW5jaGluZyBvZmZcbiAgICAgICAgICAgIGlmIChtb3VudCAmJiBtb3VudC5vdmVybGF5ICYmIG1vdW50Lm92ZXJsYXlbMF0uZnJvbSA8PSBwb3MgJiYgbW91bnQub3ZlcmxheVttb3VudC5vdmVybGF5Lmxlbmd0aCAtIDFdLnRvID49IHBvcykge1xuICAgICAgICAgICAgICAgIGxldCByb290ID0gbmV3IFRyZWVOb2RlKG1vdW50LnRyZWUsIG1vdW50Lm92ZXJsYXlbMF0uZnJvbSArIHNjYW4uZnJvbSwgLTEsIHNjYW4pO1xuICAgICAgICAgICAgICAgIChsYXllcnMgfHwgKGxheWVycyA9IFtpbm5lcl0pKS5wdXNoKHJlc29sdmVOb2RlKHJvb3QsIHBvcywgc2lkZSwgZmFsc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGF5ZXJzID8gaXRlclN0YWNrKGxheWVycykgOiBpbm5lcjtcbn1cbi8qKlxuQSB0cmVlIGN1cnNvciBvYmplY3QgZm9jdXNlcyBvbiBhIGdpdmVuIG5vZGUgaW4gYSBzeW50YXggdHJlZSwgYW5kXG5hbGxvd3MgeW91IHRvIG1vdmUgdG8gYWRqYWNlbnQgbm9kZXMuXG4qL1xuY2xhc3MgVHJlZUN1cnNvciB7XG4gICAgLyoqXG4gICAgU2hvcnRoYW5kIGZvciBgLnR5cGUubmFtZWAuXG4gICAgKi9cbiAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMudHlwZS5uYW1lOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihub2RlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1vZGUgPSAwKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgIHRoaXMuYnVmZmVyTm9kZSA9IG51bGw7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMueWllbGROb2RlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdHJlZSA9IG5vZGUuY29udGV4dC5wYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5vZGUuY29udGV4dDtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSBub2RlLl9wYXJlbnQ7IG47IG4gPSBuLl9wYXJlbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5zdGFjay51bnNoaWZ0KG4uaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXJOb2RlID0gbm9kZTtcbiAgICAgICAgICAgIHRoaXMueWllbGRCdWYobm9kZS5pbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgeWllbGROb2RlKG5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLl90cmVlID0gbm9kZTtcbiAgICAgICAgdGhpcy50eXBlID0gbm9kZS50eXBlO1xuICAgICAgICB0aGlzLmZyb20gPSBub2RlLmZyb207XG4gICAgICAgIHRoaXMudG8gPSBub2RlLnRvO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgeWllbGRCdWYoaW5kZXgsIHR5cGUpIHtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICBsZXQgeyBzdGFydCwgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCBidWZmZXIuc2V0LnR5cGVzW2J1ZmZlci5idWZmZXJbaW5kZXhdXTtcbiAgICAgICAgdGhpcy5mcm9tID0gc3RhcnQgKyBidWZmZXIuYnVmZmVyW2luZGV4ICsgMV07XG4gICAgICAgIHRoaXMudG8gPSBzdGFydCArIGJ1ZmZlci5idWZmZXJbaW5kZXggKyAyXTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgeWllbGQobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkTm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1ZmZlciA9IG5vZGUuY29udGV4dDtcbiAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYobm9kZS5pbmRleCwgbm9kZS50eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIuYnVmZmVyLmNoaWxkU3RyaW5nKHRoaXMuaW5kZXgpIDogdGhpcy5fdHJlZS50b1N0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGVudGVyQ2hpbGQoZGlyLCBwb3MsIHNpZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkKHRoaXMuX3RyZWUubmV4dENoaWxkKGRpciA8IDAgPyB0aGlzLl90cmVlLl90cmVlLmNoaWxkcmVuLmxlbmd0aCAtIDEgOiAwLCBkaXIsIHBvcywgc2lkZSwgdGhpcy5tb2RlKSk7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5idWZmZXI7XG4gICAgICAgIGxldCBpbmRleCA9IGJ1ZmZlci5maW5kQ2hpbGQodGhpcy5pbmRleCArIDQsIGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdLCBkaXIsIHBvcyAtIHRoaXMuYnVmZmVyLnN0YXJ0LCBzaWRlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKHRoaXMuaW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1ZihpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGlzIG5vZGUncyBmaXJzdCBjaGlsZC4gV2hlbiB0aGlzIHJldHVybnNcbiAgICBmYWxzZSwgdGhlIG5vZGUgaGFzIG5vIGNoaWxkLCBhbmQgdGhlIGN1cnNvciBoYXMgbm90IGJlZW4gbW92ZWQuXG4gICAgKi9cbiAgICBmaXJzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5lbnRlckNoaWxkKDEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhpcyBub2RlJ3MgbGFzdCBjaGlsZC5cbiAgICAqL1xuICAgIGxhc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuZW50ZXJDaGlsZCgtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgZmlyc3QgY2hpbGQgdGhhdCBlbmRzIGFmdGVyIGBwb3NgLlxuICAgICovXG4gICAgY2hpbGRBZnRlcihwb3MpIHsgcmV0dXJuIHRoaXMuZW50ZXJDaGlsZCgxLCBwb3MsIDIgLyogU2lkZS5BZnRlciAqLyk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBsYXN0IGNoaWxkIHRoYXQgc3RhcnRzIGJlZm9yZSBgcG9zYC5cbiAgICAqL1xuICAgIGNoaWxkQmVmb3JlKHBvcykgeyByZXR1cm4gdGhpcy5lbnRlckNoaWxkKC0xLCBwb3MsIC0yIC8qIFNpZGUuQmVmb3JlICovKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgY2hpbGQgYXJvdW5kIGBwb3NgLiBJZiBzaWRlIGlzIC0xIHRoZVxuICAgIGNoaWxkIG1heSBlbmQgYXQgdGhhdCBwb3NpdGlvbiwgd2hlbiAxIGl0IG1heSBzdGFydCB0aGVyZS4gVGhpc1xuICAgIHdpbGwgYWxzbyBlbnRlciBbb3ZlcmxhaWRdKCNjb21tb24uTW91bnRlZFRyZWUub3ZlcmxheSlcbiAgICBbbW91bnRlZF0oI2NvbW1vbi5Ob2RlUHJvcF5tb3VudGVkKSB0cmVlcyB1bmxlc3MgYG92ZXJsYXlzYCBpc1xuICAgIHNldCB0byBmYWxzZS5cbiAgICAqL1xuICAgIGVudGVyKHBvcywgc2lkZSwgbW9kZSA9IHRoaXMubW9kZSkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGQodGhpcy5fdHJlZS5lbnRlcihwb3MsIHNpZGUsIG1vZGUpKTtcbiAgICAgICAgcmV0dXJuIG1vZGUgJiBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycyA/IGZhbHNlIDogdGhpcy5lbnRlckNoaWxkKDEsIHBvcywgc2lkZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5vZGUncyBwYXJlbnQgbm9kZSwgaWYgdGhpcyBpc24ndCB0aGUgdG9wIG5vZGUuXG4gICAgKi9cbiAgICBwYXJlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZE5vZGUoKHRoaXMubW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpID8gdGhpcy5fdHJlZS5fcGFyZW50IDogdGhpcy5fdHJlZS5wYXJlbnQpO1xuICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1Zih0aGlzLnN0YWNrLnBvcCgpKTtcbiAgICAgICAgbGV0IHBhcmVudCA9ICh0aGlzLm1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSA/IHRoaXMuYnVmZmVyLnBhcmVudCA6IHRoaXMuYnVmZmVyLnBhcmVudC5uZXh0U2lnbmlmaWNhbnRQYXJlbnQoKTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy55aWVsZE5vZGUocGFyZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzaWJsaW5nKGRpcikge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuICF0aGlzLl90cmVlLl9wYXJlbnQgPyBmYWxzZVxuICAgICAgICAgICAgICAgIDogdGhpcy55aWVsZCh0aGlzLl90cmVlLmluZGV4IDwgMCA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl90cmVlLl9wYXJlbnQubmV4dENoaWxkKHRoaXMuX3RyZWUuaW5kZXggKyBkaXIsIGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovLCB0aGlzLm1vZGUpKTtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlciwgZCA9IHRoaXMuc3RhY2subGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGRpciA8IDApIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRTdGFydCA9IGQgPCAwID8gMCA6IHRoaXMuc3RhY2tbZF0gKyA0O1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggIT0gcGFyZW50U3RhcnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYoYnVmZmVyLmZpbmRDaGlsZChwYXJlbnRTdGFydCwgdGhpcy5pbmRleCwgLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM107XG4gICAgICAgICAgICBpZiAoYWZ0ZXIgPCAoZCA8IDAgPyBidWZmZXIuYnVmZmVyLmxlbmd0aCA6IGJ1ZmZlci5idWZmZXJbdGhpcy5zdGFja1tkXSArIDNdKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1ZihhZnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGQgPCAwID8gdGhpcy55aWVsZCh0aGlzLmJ1ZmZlci5wYXJlbnQubmV4dENoaWxkKHRoaXMuYnVmZmVyLmluZGV4ICsgZGlyLCBkaXIsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLywgdGhpcy5tb2RlKSkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGlzIG5vZGUncyBuZXh0IHNpYmxpbmcsIGlmIGFueS5cbiAgICAqL1xuICAgIG5leHRTaWJsaW5nKCkgeyByZXR1cm4gdGhpcy5zaWJsaW5nKDEpOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGlzIG5vZGUncyBwcmV2aW91cyBzaWJsaW5nLCBpZiBhbnkuXG4gICAgKi9cbiAgICBwcmV2U2libGluZygpIHsgcmV0dXJuIHRoaXMuc2libGluZygtMSk7IH1cbiAgICBhdExhc3ROb2RlKGRpcikge1xuICAgICAgICBsZXQgaW5kZXgsIHBhcmVudCwgeyBidWZmZXIgfSA9IHRoaXM7XG4gICAgICAgIGlmIChidWZmZXIpIHtcbiAgICAgICAgICAgIGlmIChkaXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPCBidWZmZXIuYnVmZmVyLmJ1ZmZlci5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmRleDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmJ1ZmZlci5idWZmZXJbaSArIDNdIDwgdGhpcy5pbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICh7IGluZGV4LCBwYXJlbnQgfSA9IGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAoeyBpbmRleCwgX3BhcmVudDogcGFyZW50IH0gPSB0aGlzLl90cmVlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDsgcGFyZW50OyB7IGluZGV4LCBfcGFyZW50OiBwYXJlbnQgfSA9IHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4ICsgZGlyLCBlID0gZGlyIDwgMCA/IC0xIDogcGFyZW50Ll90cmVlLmNoaWxkcmVuLmxlbmd0aDsgaSAhPSBlOyBpICs9IGRpcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSBwYXJlbnQuX3RyZWUuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5tb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkIGluc3RhbmNlb2YgVHJlZUJ1ZmZlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIWNoaWxkLnR5cGUuaXNBbm9ueW1vdXMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG1vdmUoZGlyLCBlbnRlcikge1xuICAgICAgICBpZiAoZW50ZXIgJiYgdGhpcy5lbnRlckNoaWxkKGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaWJsaW5nKGRpcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5hdExhc3ROb2RlKGRpcikgfHwgIXRoaXMucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5leHQgbm9kZSBpbiBhXG4gICAgW3ByZS1vcmRlcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVHJlZV90cmF2ZXJzYWwjUHJlLW9yZGVyLF9OTFIpXG4gICAgdHJhdmVyc2FsLCBnb2luZyBmcm9tIGEgbm9kZSB0byBpdHMgZmlyc3QgY2hpbGQgb3IsIGlmIHRoZVxuICAgIGN1cnJlbnQgbm9kZSBpcyBlbXB0eSBvciBgZW50ZXJgIGlzIGZhbHNlLCBpdHMgbmV4dCBzaWJsaW5nIG9yXG4gICAgdGhlIG5leHQgc2libGluZyBvZiB0aGUgZmlyc3QgcGFyZW50IG5vZGUgdGhhdCBoYXMgb25lLlxuICAgICovXG4gICAgbmV4dChlbnRlciA9IHRydWUpIHsgcmV0dXJuIHRoaXMubW92ZSgxLCBlbnRlcik7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBuZXh0IG5vZGUgaW4gYSBsYXN0LXRvLWZpcnN0IHByZS1vcmRlciB0cmF2ZXJzYWwuIEFcbiAgICBub2RlIGlzIGZvbGxvd2VkIGJ5IGl0cyBsYXN0IGNoaWxkIG9yLCBpZiBpdCBoYXMgbm9uZSwgaXRzXG4gICAgcHJldmlvdXMgc2libGluZyBvciB0aGUgcHJldmlvdXMgc2libGluZyBvZiB0aGUgZmlyc3QgcGFyZW50XG4gICAgbm9kZSB0aGF0IGhhcyBvbmUuXG4gICAgKi9cbiAgICBwcmV2KGVudGVyID0gdHJ1ZSkgeyByZXR1cm4gdGhpcy5tb3ZlKC0xLCBlbnRlcik7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGlubmVybW9zdCBub2RlIHRoYXQgY292ZXJzIGBwb3NgLiBJZlxuICAgIGBzaWRlYCBpcyAtMSwgaXQgd2lsbCBlbnRlciBub2RlcyB0aGF0IGVuZCBhdCBgcG9zYC4gSWYgaXQgaXMgMSxcbiAgICBpdCB3aWxsIGVudGVyIG5vZGVzIHRoYXQgc3RhcnQgYXQgYHBvc2AuXG4gICAgKi9cbiAgICBtb3ZlVG8ocG9zLCBzaWRlID0gMCkge1xuICAgICAgICAvLyBNb3ZlIHVwIHRvIGEgbm9kZSB0aGF0IGFjdHVhbGx5IGhvbGRzIHRoZSBwb3NpdGlvbiwgaWYgcG9zc2libGVcbiAgICAgICAgd2hpbGUgKHRoaXMuZnJvbSA9PSB0aGlzLnRvIHx8XG4gICAgICAgICAgICAoc2lkZSA8IDEgPyB0aGlzLmZyb20gPj0gcG9zIDogdGhpcy5mcm9tID4gcG9zKSB8fFxuICAgICAgICAgICAgKHNpZGUgPiAtMSA/IHRoaXMudG8gPD0gcG9zIDogdGhpcy50byA8IHBvcykpXG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFRoZW4gc2NhbiBkb3duIGludG8gY2hpbGQgbm9kZXMgYXMgZmFyIGFzIHBvc3NpYmxlXG4gICAgICAgIHdoaWxlICh0aGlzLmVudGVyQ2hpbGQoMSwgcG9zLCBzaWRlKSkgeyB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbc3ludGF4IG5vZGVdKCNjb21tb24uU3ludGF4Tm9kZSkgYXQgdGhlIGN1cnNvcidzIGN1cnJlbnRcbiAgICBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGdldCBub2RlKCkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyZWU7XG4gICAgICAgIGxldCBjYWNoZSA9IHRoaXMuYnVmZmVyTm9kZSwgcmVzdWx0ID0gbnVsbCwgZGVwdGggPSAwO1xuICAgICAgICBpZiAoY2FjaGUgJiYgY2FjaGUuY29udGV4dCA9PSB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgc2NhbjogZm9yIChsZXQgaW5kZXggPSB0aGlzLmluZGV4LCBkID0gdGhpcy5zdGFjay5sZW5ndGg7IGQgPj0gMDspIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gY2FjaGU7IGM7IGMgPSBjLl9wYXJlbnQpXG4gICAgICAgICAgICAgICAgICAgIGlmIChjLmluZGV4ID09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gdGhpcy5pbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGM7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCA9IGQgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5zdGFja1stLWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSBkZXB0aDsgaSA8IHRoaXMuc3RhY2subGVuZ3RoOyBpKyspXG4gICAgICAgICAgICByZXN1bHQgPSBuZXcgQnVmZmVyTm9kZSh0aGlzLmJ1ZmZlciwgcmVzdWx0LCB0aGlzLnN0YWNrW2ldKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyTm9kZSA9IG5ldyBCdWZmZXJOb2RlKHRoaXMuYnVmZmVyLCByZXN1bHQsIHRoaXMuaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIFt0cmVlXSgjY29tbW9uLlRyZWUpIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBub2RlLCBpZlxuICAgIGFueS4gV2lsbCByZXR1cm4gbnVsbCB3aGVuIHRoZSBub2RlIGlzIGluIGEgW3RyZWVcbiAgICBidWZmZXJdKCNjb21tb24uVHJlZUJ1ZmZlcikuXG4gICAgKi9cbiAgICBnZXQgdHJlZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyID8gbnVsbCA6IHRoaXMuX3RyZWUuX3RyZWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgY3VycmVudCBub2RlIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzLCBjYWxsaW5nXG4gICAgYGVudGVyYCB3aGVuIGVudGVyaW5nIGEgbm9kZSBhbmQgYGxlYXZlYCwgaWYgZ2l2ZW4sIHdoZW4gbGVhdmluZ1xuICAgIG9uZS4gV2hlbiBgZW50ZXJgIHJldHVybnMgYGZhbHNlYCwgYW55IGNoaWxkcmVuIG9mIHRoYXQgbm9kZSBhcmVcbiAgICBza2lwcGVkLCBhbmQgYGxlYXZlYCBpc24ndCBjYWxsZWQgZm9yIGl0LlxuICAgICovXG4gICAgaXRlcmF0ZShlbnRlciwgbGVhdmUpIHtcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBtdXN0TGVhdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUuaXNBbm9ueW1vdXMgfHwgZW50ZXIodGhpcykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3RDaGlsZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudHlwZS5pc0Fub255bW91cylcbiAgICAgICAgICAgICAgICAgICAgbXVzdExlYXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBpZiAobXVzdExlYXZlICYmIGxlYXZlKVxuICAgICAgICAgICAgICAgICAgICBsZWF2ZSh0aGlzKTtcbiAgICAgICAgICAgICAgICBtdXN0TGVhdmUgPSB0aGlzLnR5cGUuaXNBbm9ueW1vdXM7XG4gICAgICAgICAgICAgICAgaWYgKCFkZXB0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50KCk7XG4gICAgICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICAgICAgICBtdXN0TGVhdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGUgY3VycmVudCBub2RlIG1hdGNoZXMgYSBnaXZlbiBjb250ZXh0XHUyMDE0YSBzZXF1ZW5jZVxuICAgIG9mIGRpcmVjdCBwYXJlbnQgbm9kZSBuYW1lcy4gRW1wdHkgc3RyaW5ncyBpbiB0aGUgY29udGV4dCBhcnJheVxuICAgIGFyZSB0cmVhdGVkIGFzIHdpbGRjYXJkcy5cbiAgICAqL1xuICAgIG1hdGNoQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hOb2RlQ29udGV4dCh0aGlzLm5vZGUucGFyZW50LCBjb250ZXh0KTtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlciwgeyB0eXBlcyB9ID0gYnVmZmVyLnNldDtcbiAgICAgICAgZm9yIChsZXQgaSA9IGNvbnRleHQubGVuZ3RoIC0gMSwgZCA9IHRoaXMuc3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgIGlmIChkIDwgMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hOb2RlQ29udGV4dCh0aGlzLl90cmVlLCBjb250ZXh0LCBpKTtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZXNbYnVmZmVyLmJ1ZmZlclt0aGlzLnN0YWNrW2RdXV07XG4gICAgICAgICAgICBpZiAoIXR5cGUuaXNBbm9ueW1vdXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dFtpXSAmJiBjb250ZXh0W2ldICE9IHR5cGUubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYXNDaGlsZCh0cmVlKSB7XG4gICAgcmV0dXJuIHRyZWUuY2hpbGRyZW4uc29tZShjaCA9PiBjaCBpbnN0YW5jZW9mIFRyZWVCdWZmZXIgfHwgIWNoLnR5cGUuaXNBbm9ueW1vdXMgfHwgaGFzQ2hpbGQoY2gpKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkVHJlZShkYXRhKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCB7IGJ1ZmZlciwgbm9kZVNldCwgbWF4QnVmZmVyTGVuZ3RoID0gRGVmYXVsdEJ1ZmZlckxlbmd0aCwgcmV1c2VkID0gW10sIG1pblJlcGVhdFR5cGUgPSBub2RlU2V0LnR5cGVzLmxlbmd0aCB9ID0gZGF0YTtcbiAgICBsZXQgY3Vyc29yID0gQXJyYXkuaXNBcnJheShidWZmZXIpID8gbmV3IEZsYXRCdWZmZXJDdXJzb3IoYnVmZmVyLCBidWZmZXIubGVuZ3RoKSA6IGJ1ZmZlcjtcbiAgICBsZXQgdHlwZXMgPSBub2RlU2V0LnR5cGVzO1xuICAgIGxldCBjb250ZXh0SGFzaCA9IDAsIGxvb2tBaGVhZCA9IDA7XG4gICAgZnVuY3Rpb24gdGFrZU5vZGUocGFyZW50U3RhcnQsIG1pblBvcywgY2hpbGRyZW4sIHBvc2l0aW9ucywgaW5SZXBlYXQsIGRlcHRoKSB7XG4gICAgICAgIGxldCB7IGlkLCBzdGFydCwgZW5kLCBzaXplIH0gPSBjdXJzb3I7XG4gICAgICAgIGxldCBsb29rQWhlYWRBdFN0YXJ0ID0gbG9va0FoZWFkLCBjb250ZXh0QXRTdGFydCA9IGNvbnRleHRIYXNoO1xuICAgICAgICB3aGlsZSAoc2l6ZSA8IDApIHtcbiAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICBpZiAoc2l6ZSA9PSAtMSAvKiBTcGVjaWFsUmVjb3JkLlJldXNlICovKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSByZXVzZWRbaWRdO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25zLnB1c2goc3RhcnQgLSBwYXJlbnRTdGFydCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAtMyAvKiBTcGVjaWFsUmVjb3JkLkNvbnRleHRDaGFuZ2UgKi8pIHsgLy8gQ29udGV4dCBjaGFuZ2VcbiAgICAgICAgICAgICAgICBjb250ZXh0SGFzaCA9IGlkO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gLTQgLyogU3BlY2lhbFJlY29yZC5Mb29rQWhlYWQgKi8pIHtcbiAgICAgICAgICAgICAgICBsb29rQWhlYWQgPSBpZDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5yZWNvZ25pemVkIHJlY29yZCBzaXplOiAke3NpemV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHR5cGUgPSB0eXBlc1tpZF0sIG5vZGUsIGJ1ZmZlcjtcbiAgICAgICAgbGV0IHN0YXJ0UG9zID0gc3RhcnQgLSBwYXJlbnRTdGFydDtcbiAgICAgICAgaWYgKGVuZCAtIHN0YXJ0IDw9IG1heEJ1ZmZlckxlbmd0aCAmJiAoYnVmZmVyID0gZmluZEJ1ZmZlclNpemUoY3Vyc29yLnBvcyAtIG1pblBvcywgaW5SZXBlYXQpKSkge1xuICAgICAgICAgICAgLy8gU21hbGwgZW5vdWdoIGZvciBhIGJ1ZmZlciwgYW5kIG5vIHJldXNlZCBub2RlcyBpbnNpZGVcbiAgICAgICAgICAgIGxldCBkYXRhID0gbmV3IFVpbnQxNkFycmF5KGJ1ZmZlci5zaXplIC0gYnVmZmVyLnNraXApO1xuICAgICAgICAgICAgbGV0IGVuZFBvcyA9IGN1cnNvci5wb3MgLSBidWZmZXIuc2l6ZSwgaW5kZXggPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJzb3IucG9zID4gZW5kUG9zKVxuICAgICAgICAgICAgICAgIGluZGV4ID0gY29weVRvQnVmZmVyKGJ1ZmZlci5zdGFydCwgZGF0YSwgaW5kZXgpO1xuICAgICAgICAgICAgbm9kZSA9IG5ldyBUcmVlQnVmZmVyKGRhdGEsIGVuZCAtIGJ1ZmZlci5zdGFydCwgbm9kZVNldCk7XG4gICAgICAgICAgICBzdGFydFBvcyA9IGJ1ZmZlci5zdGFydCAtIHBhcmVudFN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBNYWtlIGl0IGEgbm9kZVxuICAgICAgICAgICAgbGV0IGVuZFBvcyA9IGN1cnNvci5wb3MgLSBzaXplO1xuICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgIGxldCBsb2NhbENoaWxkcmVuID0gW10sIGxvY2FsUG9zaXRpb25zID0gW107XG4gICAgICAgICAgICBsZXQgbG9jYWxJblJlcGVhdCA9IGlkID49IG1pblJlcGVhdFR5cGUgPyBpZCA6IC0xO1xuICAgICAgICAgICAgbGV0IGxhc3RHcm91cCA9IDAsIGxhc3RFbmQgPSBlbmQ7XG4gICAgICAgICAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IGVuZFBvcykge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbEluUmVwZWF0ID49IDAgJiYgY3Vyc29yLmlkID09IGxvY2FsSW5SZXBlYXQgJiYgY3Vyc29yLnNpemUgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmVuZCA8PSBsYXN0RW5kIC0gbWF4QnVmZmVyTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWtlUmVwZWF0TGVhZihsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgc3RhcnQsIGxhc3RHcm91cCwgY3Vyc29yLmVuZCwgbGFzdEVuZCwgbG9jYWxJblJlcGVhdCwgbG9va0FoZWFkQXRTdGFydCwgY29udGV4dEF0U3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEdyb3VwID0gbG9jYWxDaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0RW5kID0gY3Vyc29yLmVuZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXB0aCA+IDI1MDAgLyogQ3V0T2ZmLkRlcHRoICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHRha2VGbGF0Tm9kZShzdGFydCwgZW5kUG9zLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YWtlTm9kZShzdGFydCwgZW5kUG9zLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgbG9jYWxJblJlcGVhdCwgZGVwdGggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobG9jYWxJblJlcGVhdCA+PSAwICYmIGxhc3RHcm91cCA+IDAgJiYgbGFzdEdyb3VwIDwgbG9jYWxDaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgbWFrZVJlcGVhdExlYWYobG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIHN0YXJ0LCBsYXN0R3JvdXAsIHN0YXJ0LCBsYXN0RW5kLCBsb2NhbEluUmVwZWF0LCBsb29rQWhlYWRBdFN0YXJ0LCBjb250ZXh0QXRTdGFydCk7XG4gICAgICAgICAgICBsb2NhbENoaWxkcmVuLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGxvY2FsUG9zaXRpb25zLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGlmIChsb2NhbEluUmVwZWF0ID4gLTEgJiYgbGFzdEdyb3VwID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBtYWtlID0gbWFrZUJhbGFuY2VkKHR5cGUsIGNvbnRleHRBdFN0YXJ0KTtcbiAgICAgICAgICAgICAgICBub2RlID0gYmFsYW5jZVJhbmdlKHR5cGUsIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCAwLCBsb2NhbENoaWxkcmVuLmxlbmd0aCwgMCwgZW5kIC0gc3RhcnQsIG1ha2UsIG1ha2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG1ha2VUcmVlKHR5cGUsIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCBlbmQgLSBzdGFydCwgbG9va0FoZWFkQXRTdGFydCAtIGVuZCwgY29udGV4dEF0U3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKHN0YXJ0UG9zKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdGFrZUZsYXROb2RlKHBhcmVudFN0YXJ0LCBtaW5Qb3MsIGNoaWxkcmVuLCBwb3NpdGlvbnMpIHtcbiAgICAgICAgbGV0IG5vZGVzID0gW107IC8vIFRlbXBvcmFyeSwgaW52ZXJ0ZWQgYXJyYXkgb2YgbGVhZiBub2RlcyBmb3VuZCwgd2l0aCBhYnNvbHV0ZSBwb3NpdGlvbnNcbiAgICAgICAgbGV0IG5vZGVDb3VudCA9IDAsIHN0b3BBdCA9IC0xO1xuICAgICAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IG1pblBvcykge1xuICAgICAgICAgICAgbGV0IHsgaWQsIHN0YXJ0LCBlbmQsIHNpemUgfSA9IGN1cnNvcjtcbiAgICAgICAgICAgIGlmIChzaXplID4gNCkgeyAvLyBOb3QgYSBsZWFmXG4gICAgICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0b3BBdCA+IC0xICYmIHN0YXJ0IDwgc3RvcEF0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RvcEF0IDwgMClcbiAgICAgICAgICAgICAgICAgICAgc3RvcEF0ID0gZW5kIC0gbWF4QnVmZmVyTGVuZ3RoO1xuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2goaWQsIHN0YXJ0LCBlbmQpO1xuICAgICAgICAgICAgICAgIG5vZGVDb3VudCsrO1xuICAgICAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGVDb3VudCkge1xuICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50MTZBcnJheShub2RlQ291bnQgKiA0KTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG5vZGVzLmxlbmd0aCAtIDMsIGogPSAwOyBpID49IDA7IGkgLT0gMykge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gbm9kZXNbaV07XG4gICAgICAgICAgICAgICAgYnVmZmVyW2orK10gPSBub2Rlc1tpICsgMV0gLSBzdGFydDtcbiAgICAgICAgICAgICAgICBidWZmZXJbaisrXSA9IG5vZGVzW2kgKyAyXSAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2gobmV3IFRyZWVCdWZmZXIoYnVmZmVyLCBub2Rlc1syXSAtIHN0YXJ0LCBub2RlU2V0KSk7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaChzdGFydCAtIHBhcmVudFN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBtYWtlQmFsYW5jZWQodHlwZSwgY29udGV4dEhhc2gpIHtcbiAgICAgICAgcmV0dXJuIChjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpID0+IHtcbiAgICAgICAgICAgIGxldCBsb29rQWhlYWQgPSAwLCBsYXN0SSA9IGNoaWxkcmVuLmxlbmd0aCAtIDEsIGxhc3QsIGxvb2tBaGVhZFByb3A7XG4gICAgICAgICAgICBpZiAobGFzdEkgPj0gMCAmJiAobGFzdCA9IGNoaWxkcmVuW2xhc3RJXSkgaW5zdGFuY2VvZiBUcmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsYXN0SSAmJiBsYXN0LnR5cGUgPT0gdHlwZSAmJiBsYXN0Lmxlbmd0aCA9PSBsZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0O1xuICAgICAgICAgICAgICAgIGlmIChsb29rQWhlYWRQcm9wID0gbGFzdC5wcm9wKE5vZGVQcm9wLmxvb2tBaGVhZCkpXG4gICAgICAgICAgICAgICAgICAgIGxvb2tBaGVhZCA9IHBvc2l0aW9uc1tsYXN0SV0gKyBsYXN0Lmxlbmd0aCArIGxvb2tBaGVhZFByb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFrZVRyZWUodHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoLCBsb29rQWhlYWQsIGNvbnRleHRIYXNoKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFrZVJlcGVhdExlYWYoY2hpbGRyZW4sIHBvc2l0aW9ucywgYmFzZSwgaSwgZnJvbSwgdG8sIHR5cGUsIGxvb2tBaGVhZCwgY29udGV4dEhhc2gpIHtcbiAgICAgICAgbGV0IGxvY2FsQ2hpbGRyZW4gPSBbXSwgbG9jYWxQb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgd2hpbGUgKGNoaWxkcmVuLmxlbmd0aCA+IGkpIHtcbiAgICAgICAgICAgIGxvY2FsQ2hpbGRyZW4ucHVzaChjaGlsZHJlbi5wb3AoKSk7XG4gICAgICAgICAgICBsb2NhbFBvc2l0aW9ucy5wdXNoKHBvc2l0aW9ucy5wb3AoKSArIGJhc2UgLSBmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5wdXNoKG1ha2VUcmVlKG5vZGVTZXQudHlwZXNbdHlwZV0sIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCB0byAtIGZyb20sIGxvb2tBaGVhZCAtIHRvLCBjb250ZXh0SGFzaCkpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChmcm9tIC0gYmFzZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1ha2VUcmVlKHR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCwgbG9va0FoZWFkLCBjb250ZXh0SGFzaCwgcHJvcHMpIHtcbiAgICAgICAgaWYgKGNvbnRleHRIYXNoKSB7XG4gICAgICAgICAgICBsZXQgcGFpciA9IFtOb2RlUHJvcC5jb250ZXh0SGFzaCwgY29udGV4dEhhc2hdO1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyA/IFtwYWlyXS5jb25jYXQocHJvcHMpIDogW3BhaXJdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb29rQWhlYWQgPiAyNSkge1xuICAgICAgICAgICAgbGV0IHBhaXIgPSBbTm9kZVByb3AubG9va0FoZWFkLCBsb29rQWhlYWRdO1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyA/IFtwYWlyXS5jb25jYXQocHJvcHMpIDogW3BhaXJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVHJlZSh0eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgsIHByb3BzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluZEJ1ZmZlclNpemUobWF4U2l6ZSwgaW5SZXBlYXQpIHtcbiAgICAgICAgLy8gU2NhbiB0aHJvdWdoIHRoZSBidWZmZXIgdG8gZmluZCBwcmV2aW91cyBzaWJsaW5ncyB0aGF0IGZpdFxuICAgICAgICAvLyB0b2dldGhlciBpbiBhIFRyZWVCdWZmZXIsIGFuZCBkb24ndCBjb250YWluIGFueSByZXVzZWQgbm9kZXNcbiAgICAgICAgLy8gKHdoaWNoIGNhbid0IGJlIHN0b3JlZCBpbiBhIGJ1ZmZlcikuXG4gICAgICAgIC8vIElmIGBpblJlcGVhdGAgaXMgPiAtMSwgaWdub3JlIG5vZGUgYm91bmRhcmllcyBvZiB0aGF0IHR5cGUgZm9yXG4gICAgICAgIC8vIG5lc3RpbmcsIGJ1dCBtYWtlIHN1cmUgdGhlIGVuZCBmYWxscyBlaXRoZXIgYXQgdGhlIHN0YXJ0XG4gICAgICAgIC8vIChgbWF4U2l6ZWApIG9yIGJlZm9yZSBzdWNoIGEgbm9kZS5cbiAgICAgICAgbGV0IGZvcmsgPSBjdXJzb3IuZm9yaygpO1xuICAgICAgICBsZXQgc2l6ZSA9IDAsIHN0YXJ0ID0gMCwgc2tpcCA9IDAsIG1pblN0YXJ0ID0gZm9yay5lbmQgLSBtYXhCdWZmZXJMZW5ndGg7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHNpemU6IDAsIHN0YXJ0OiAwLCBza2lwOiAwIH07XG4gICAgICAgIHNjYW46IGZvciAobGV0IG1pblBvcyA9IGZvcmsucG9zIC0gbWF4U2l6ZTsgZm9yay5wb3MgPiBtaW5Qb3M7KSB7XG4gICAgICAgICAgICBsZXQgbm9kZVNpemUgPSBmb3JrLnNpemU7XG4gICAgICAgICAgICAvLyBQcmV0ZW5kIG5lc3RlZCByZXBlYXQgbm9kZXMgb2YgdGhlIHNhbWUgdHlwZSBkb24ndCBleGlzdFxuICAgICAgICAgICAgaWYgKGZvcmsuaWQgPT0gaW5SZXBlYXQgJiYgbm9kZVNpemUgPj0gMCkge1xuICAgICAgICAgICAgICAgIC8vIEV4Y2VwdCB0aGF0IHdlIHN0b3JlIHRoZSBjdXJyZW50IHN0YXRlIGFzIGEgdmFsaWQgcmV0dXJuXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUuXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNpemUgPSBzaXplO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGFydCA9IHN0YXJ0O1xuICAgICAgICAgICAgICAgIHJlc3VsdC5za2lwID0gc2tpcDtcbiAgICAgICAgICAgICAgICBza2lwICs9IDQ7XG4gICAgICAgICAgICAgICAgc2l6ZSArPSA0O1xuICAgICAgICAgICAgICAgIGZvcmsubmV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHN0YXJ0UG9zID0gZm9yay5wb3MgLSBub2RlU2l6ZTtcbiAgICAgICAgICAgIGlmIChub2RlU2l6ZSA8IDAgfHwgc3RhcnRQb3MgPCBtaW5Qb3MgfHwgZm9yay5zdGFydCA8IG1pblN0YXJ0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IGxvY2FsU2tpcHBlZCA9IGZvcmsuaWQgPj0gbWluUmVwZWF0VHlwZSA/IDQgOiAwO1xuICAgICAgICAgICAgbGV0IG5vZGVTdGFydCA9IGZvcmsuc3RhcnQ7XG4gICAgICAgICAgICBmb3JrLm5leHQoKTtcbiAgICAgICAgICAgIHdoaWxlIChmb3JrLnBvcyA+IHN0YXJ0UG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcmsuc2l6ZSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmsuc2l6ZSA9PSAtMyAvKiBTcGVjaWFsUmVjb3JkLkNvbnRleHRDaGFuZ2UgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFNraXBwZWQgKz0gNDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9yay5pZCA+PSBtaW5SZXBlYXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU2tpcHBlZCArPSA0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JrLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXJ0ID0gbm9kZVN0YXJ0O1xuICAgICAgICAgICAgc2l6ZSArPSBub2RlU2l6ZTtcbiAgICAgICAgICAgIHNraXAgKz0gbG9jYWxTa2lwcGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpblJlcGVhdCA8IDAgfHwgc2l6ZSA9PSBtYXhTaXplKSB7XG4gICAgICAgICAgICByZXN1bHQuc2l6ZSA9IHNpemU7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgICAgIHJlc3VsdC5za2lwID0gc2tpcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnNpemUgPiA0ID8gcmVzdWx0IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb3B5VG9CdWZmZXIoYnVmZmVyU3RhcnQsIGJ1ZmZlciwgaW5kZXgpIHtcbiAgICAgICAgbGV0IHsgaWQsIHN0YXJ0LCBlbmQsIHNpemUgfSA9IGN1cnNvcjtcbiAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgaWYgKHNpemUgPj0gMCAmJiBpZCA8IG1pblJlcGVhdFR5cGUpIHtcbiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICBpZiAoc2l6ZSA+IDQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kUG9zID0gY3Vyc29yLnBvcyAtIChzaXplIC0gNCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5wb3MgPiBlbmRQb3MpXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gY29weVRvQnVmZmVyKGJ1ZmZlclN0YXJ0LCBidWZmZXIsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlclstLWluZGV4XSA9IHN0YXJ0SW5kZXg7XG4gICAgICAgICAgICBidWZmZXJbLS1pbmRleF0gPSBlbmQgLSBidWZmZXJTdGFydDtcbiAgICAgICAgICAgIGJ1ZmZlclstLWluZGV4XSA9IHN0YXJ0IC0gYnVmZmVyU3RhcnQ7XG4gICAgICAgICAgICBidWZmZXJbLS1pbmRleF0gPSBpZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzaXplID09IC0zIC8qIFNwZWNpYWxSZWNvcmQuQ29udGV4dENoYW5nZSAqLykge1xuICAgICAgICAgICAgY29udGV4dEhhc2ggPSBpZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzaXplID09IC00IC8qIFNwZWNpYWxSZWNvcmQuTG9va0FoZWFkICovKSB7XG4gICAgICAgICAgICBsb29rQWhlYWQgPSBpZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIGxldCBjaGlsZHJlbiA9IFtdLCBwb3NpdGlvbnMgPSBbXTtcbiAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IDApXG4gICAgICAgIHRha2VOb2RlKGRhdGEuc3RhcnQgfHwgMCwgZGF0YS5idWZmZXJTdGFydCB8fCAwLCBjaGlsZHJlbiwgcG9zaXRpb25zLCAtMSwgMCk7XG4gICAgbGV0IGxlbmd0aCA9IChfYSA9IGRhdGEubGVuZ3RoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAoY2hpbGRyZW4ubGVuZ3RoID8gcG9zaXRpb25zWzBdICsgY2hpbGRyZW5bMF0ubGVuZ3RoIDogMCk7XG4gICAgcmV0dXJuIG5ldyBUcmVlKHR5cGVzW2RhdGEudG9wSURdLCBjaGlsZHJlbi5yZXZlcnNlKCksIHBvc2l0aW9ucy5yZXZlcnNlKCksIGxlbmd0aCk7XG59XG5jb25zdCBub2RlU2l6ZUNhY2hlID0gbmV3IFdlYWtNYXA7XG5mdW5jdGlvbiBub2RlU2l6ZShiYWxhbmNlVHlwZSwgbm9kZSkge1xuICAgIGlmICghYmFsYW5jZVR5cGUuaXNBbm9ueW1vdXMgfHwgbm9kZSBpbnN0YW5jZW9mIFRyZWVCdWZmZXIgfHwgbm9kZS50eXBlICE9IGJhbGFuY2VUeXBlKVxuICAgICAgICByZXR1cm4gMTtcbiAgICBsZXQgc2l6ZSA9IG5vZGVTaXplQ2FjaGUuZ2V0KG5vZGUpO1xuICAgIGlmIChzaXplID09IG51bGwpIHtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZC50eXBlICE9IGJhbGFuY2VUeXBlIHx8ICEoY2hpbGQgaW5zdGFuY2VvZiBUcmVlKSkge1xuICAgICAgICAgICAgICAgIHNpemUgPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2l6ZSArPSBub2RlU2l6ZShiYWxhbmNlVHlwZSwgY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVTaXplQ2FjaGUuc2V0KG5vZGUsIHNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cbmZ1bmN0aW9uIGJhbGFuY2VSYW5nZShcbi8vIFRoZSB0eXBlIHRoZSBiYWxhbmNlZCB0cmVlJ3MgaW5uZXIgbm9kZXMuXG5iYWxhbmNlVHlwZSwgXG4vLyBUaGUgZGlyZWN0IGNoaWxkcmVuIGFuZCB0aGVpciBwb3NpdGlvbnNcbmNoaWxkcmVuLCBwb3NpdGlvbnMsIFxuLy8gVGhlIGluZGV4IHJhbmdlIGluIGNoaWxkcmVuL3Bvc2l0aW9ucyB0byB1c2VcbmZyb20sIHRvLCBcbi8vIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbm9kZXMsIHJlbGF0aXZlIHRvIHRoZWlyIHBhcmVudC5cbnN0YXJ0LCBcbi8vIExlbmd0aCBvZiB0aGUgb3V0ZXIgbm9kZVxubGVuZ3RoLCBcbi8vIEZ1bmN0aW9uIHRvIGJ1aWxkIHRoZSB0b3Agbm9kZSBvZiB0aGUgYmFsYW5jZWQgdHJlZVxubWtUb3AsIFxuLy8gRnVuY3Rpb24gdG8gYnVpbGQgaW50ZXJuYWwgbm9kZXMgZm9yIHRoZSBiYWxhbmNlZCB0cmVlXG5ta1RyZWUpIHtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87IGkrKylcbiAgICAgICAgdG90YWwgKz0gbm9kZVNpemUoYmFsYW5jZVR5cGUsIGNoaWxkcmVuW2ldKTtcbiAgICBsZXQgbWF4Q2hpbGQgPSBNYXRoLmNlaWwoKHRvdGFsICogMS41KSAvIDggLyogQmFsYW5jZS5CcmFuY2hGYWN0b3IgKi8pO1xuICAgIGxldCBsb2NhbENoaWxkcmVuID0gW10sIGxvY2FsUG9zaXRpb25zID0gW107XG4gICAgZnVuY3Rpb24gZGl2aWRlKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGZyb20sIHRvLCBvZmZzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzspIHtcbiAgICAgICAgICAgIGxldCBncm91cEZyb20gPSBpLCBncm91cFN0YXJ0ID0gcG9zaXRpb25zW2ldLCBncm91cFNpemUgPSBub2RlU2l6ZShiYWxhbmNlVHlwZSwgY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgZm9yICg7IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRTaXplID0gbm9kZVNpemUoYmFsYW5jZVR5cGUsIGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBTaXplICsgbmV4dFNpemUgPj0gbWF4Q2hpbGQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGdyb3VwU2l6ZSArPSBuZXh0U2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID09IGdyb3VwRnJvbSArIDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBTaXplID4gbWF4Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9ubHkgPSBjaGlsZHJlbltncm91cEZyb21dOyAvLyBPbmx5IHRyZWVzIGNhbiBoYXZlIGEgc2l6ZSA+IDFcbiAgICAgICAgICAgICAgICAgICAgZGl2aWRlKG9ubHkuY2hpbGRyZW4sIG9ubHkucG9zaXRpb25zLCAwLCBvbmx5LmNoaWxkcmVuLmxlbmd0aCwgcG9zaXRpb25zW2dyb3VwRnJvbV0gKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9jYWxDaGlsZHJlbi5wdXNoKGNoaWxkcmVuW2dyb3VwRnJvbV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9uc1tpIC0gMV0gKyBjaGlsZHJlbltpIC0gMV0ubGVuZ3RoIC0gZ3JvdXBTdGFydDtcbiAgICAgICAgICAgICAgICBsb2NhbENoaWxkcmVuLnB1c2goYmFsYW5jZVJhbmdlKGJhbGFuY2VUeXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBncm91cEZyb20sIGksIGdyb3VwU3RhcnQsIGxlbmd0aCwgbnVsbCwgbWtUcmVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhbFBvc2l0aW9ucy5wdXNoKGdyb3VwU3RhcnQgKyBvZmZzZXQgLSBzdGFydCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGl2aWRlKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGZyb20sIHRvLCAwKTtcbiAgICByZXR1cm4gKG1rVG9wIHx8IG1rVHJlZSkobG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIGxlbmd0aCk7XG59XG4vKipcblByb3ZpZGVzIGEgd2F5IHRvIGFzc29jaWF0ZSB2YWx1ZXMgd2l0aCBwaWVjZXMgb2YgdHJlZXMuIEFzIGxvbmdcbmFzIHRoYXQgcGFydCBvZiB0aGUgdHJlZSBpcyByZXVzZWQsIHRoZSBhc3NvY2lhdGVkIHZhbHVlcyBjYW4gYmVcbnJldHJpZXZlZCBmcm9tIGFuIHVwZGF0ZWQgdHJlZS5cbiovXG5jbGFzcyBOb2RlV2Vha01hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICB9XG4gICAgc2V0QnVmZmVyKGJ1ZmZlciwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMubWFwLmdldChidWZmZXIpO1xuICAgICAgICBpZiAoIWlubmVyKVxuICAgICAgICAgICAgdGhpcy5tYXAuc2V0KGJ1ZmZlciwgaW5uZXIgPSBuZXcgTWFwKTtcbiAgICAgICAgaW5uZXIuc2V0KGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICAgIGdldEJ1ZmZlcihidWZmZXIsIGluZGV4KSB7XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMubWFwLmdldChidWZmZXIpO1xuICAgICAgICByZXR1cm4gaW5uZXIgJiYgaW5uZXIuZ2V0KGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2V0IHRoZSB2YWx1ZSBmb3IgdGhpcyBzeW50YXggbm9kZS5cbiAgICAqL1xuICAgIHNldChub2RlLCB2YWx1ZSkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEJ1ZmZlck5vZGUpXG4gICAgICAgICAgICB0aGlzLnNldEJ1ZmZlcihub2RlLmNvbnRleHQuYnVmZmVyLCBub2RlLmluZGV4LCB2YWx1ZSk7XG4gICAgICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUcmVlTm9kZSlcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChub2RlLnRyZWUsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmUgdmFsdWUgZm9yIHRoaXMgc3ludGF4IG5vZGUsIGlmIGl0IGV4aXN0cyBpbiB0aGUgbWFwLlxuICAgICovXG4gICAgZ2V0KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBCdWZmZXJOb2RlID8gdGhpcy5nZXRCdWZmZXIobm9kZS5jb250ZXh0LmJ1ZmZlciwgbm9kZS5pbmRleClcbiAgICAgICAgICAgIDogbm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlID8gdGhpcy5tYXAuZ2V0KG5vZGUudHJlZSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFNldCB0aGUgdmFsdWUgZm9yIHRoZSBub2RlIHRoYXQgYSBjdXJzb3IgY3VycmVudGx5IHBvaW50cyB0by5cbiAgICAqL1xuICAgIGN1cnNvclNldChjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIGlmIChjdXJzb3IuYnVmZmVyKVxuICAgICAgICAgICAgdGhpcy5zZXRCdWZmZXIoY3Vyc29yLmJ1ZmZlci5idWZmZXIsIGN1cnNvci5pbmRleCwgdmFsdWUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoY3Vyc29yLnRyZWUsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmUgdGhlIHZhbHVlIGZvciB0aGUgbm9kZSB0aGF0IGEgY3Vyc29yIGN1cnJlbnRseSBwb2ludHNcbiAgICB0by5cbiAgICAqL1xuICAgIGN1cnNvckdldChjdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIGN1cnNvci5idWZmZXIgPyB0aGlzLmdldEJ1ZmZlcihjdXJzb3IuYnVmZmVyLmJ1ZmZlciwgY3Vyc29yLmluZGV4KSA6IHRoaXMubWFwLmdldChjdXJzb3IudHJlZSk7XG4gICAgfVxufVxuXG4vKipcblRyZWUgZnJhZ21lbnRzIGFyZSB1c2VkIGR1cmluZyBbaW5jcmVtZW50YWxcbnBhcnNpbmddKCNjb21tb24uUGFyc2VyLnN0YXJ0UGFyc2UpIHRvIHRyYWNrIHBhcnRzIG9mIG9sZCB0cmVlc1xudGhhdCBjYW4gYmUgcmV1c2VkIGluIGEgbmV3IHBhcnNlLiBBbiBhcnJheSBvZiBmcmFnbWVudHMgaXMgdXNlZFxudG8gdHJhY2sgcmVnaW9ucyBvZiBhbiBvbGQgdHJlZSB3aG9zZSBub2RlcyBtaWdodCBiZSByZXVzZWQgaW4gbmV3XG5wYXJzZXMuIFVzZSB0aGUgc3RhdGljXG5bYGFwcGx5Q2hhbmdlc2BdKCNjb21tb24uVHJlZUZyYWdtZW50XmFwcGx5Q2hhbmdlcykgbWV0aG9kIHRvXG51cGRhdGUgZnJhZ21lbnRzIGZvciBkb2N1bWVudCBjaGFuZ2VzLlxuKi9cbmNsYXNzIFRyZWVGcmFnbWVudCB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgdHJlZSBmcmFnbWVudC4gWW91J2xsIHVzdWFsbHkgd2FudCB0byB1c2VcbiAgICBbYGFkZFRyZWVgXSgjY29tbW9uLlRyZWVGcmFnbWVudF5hZGRUcmVlKSBhbmRcbiAgICBbYGFwcGx5Q2hhbmdlc2BdKCNjb21tb24uVHJlZUZyYWdtZW50XmFwcGx5Q2hhbmdlcykgaW5zdGVhZCBvZlxuICAgIGNhbGxpbmcgdGhpcyBkaXJlY3RseS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgdW5jaGFuZ2VkIHJhbmdlIHBvaW50ZWQgdG8gYnkgdGhpcyBmcmFnbWVudC5cbiAgICBUaGlzIHJlZmVycyB0byBhbiBvZmZzZXQgaW4gdGhlIF91cGRhdGVkXyBkb2N1bWVudCAoYXMgb3Bwb3NlZFxuICAgIHRvIHRoZSBvcmlnaW5hbCB0cmVlKS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgb2YgdGhlIHVuY2hhbmdlZCByYW5nZS5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgdHJlZSB0aGF0IHRoaXMgZnJhZ21lbnQgaXMgYmFzZWQgb24uXG4gICAgKi9cbiAgICB0cmVlLCBcbiAgICAvKipcbiAgICBUaGUgb2Zmc2V0IGJldHdlZW4gdGhlIGZyYWdtZW50J3MgdHJlZSBhbmQgdGhlIGRvY3VtZW50IHRoYXRcbiAgICB0aGlzIGZyYWdtZW50IGNhbiBiZSB1c2VkIGFnYWluc3QuIEFkZCB0aGlzIHdoZW4gZ29pbmcgZnJvbVxuICAgIGRvY3VtZW50IHRvIHRyZWUgcG9zaXRpb25zLCBzdWJ0cmFjdCBpdCB0byBnbyBmcm9tIHRyZWUgdG9cbiAgICBkb2N1bWVudCBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBvZmZzZXQsIG9wZW5TdGFydCA9IGZhbHNlLCBvcGVuRW5kID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5vcGVuID0gKG9wZW5TdGFydCA/IDEgLyogT3Blbi5TdGFydCAqLyA6IDApIHwgKG9wZW5FbmQgPyAyIC8qIE9wZW4uRW5kICovIDogMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHN0YXJ0IG9mIHRoZSBmcmFnbWVudCByZXByZXNlbnRzIHRoZSBzdGFydCBvZiBhXG4gICAgcGFyc2UsIG9yIHRoZSBlbmQgb2YgYSBjaGFuZ2UuIChJbiB0aGUgc2Vjb25kIGNhc2UsIGl0IG1heSBub3RcbiAgICBiZSBzYWZlIHRvIHJldXNlIHNvbWUgbm9kZXMgYXQgdGhlIHN0YXJ0LCBkZXBlbmRpbmcgb24gdGhlXG4gICAgcGFyc2luZyBhbGdvcml0aG0uKVxuICAgICovXG4gICAgZ2V0IG9wZW5TdGFydCgpIHsgcmV0dXJuICh0aGlzLm9wZW4gJiAxIC8qIE9wZW4uU3RhcnQgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIGVuZCBvZiB0aGUgZnJhZ21lbnQgcmVwcmVzZW50cyB0aGUgZW5kIG9mIGFcbiAgICBmdWxsLWRvY3VtZW50IHBhcnNlLCBvciB0aGUgc3RhcnQgb2YgYSBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgb3BlbkVuZCgpIHsgcmV0dXJuICh0aGlzLm9wZW4gJiAyIC8qIE9wZW4uRW5kICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgb2YgZnJhZ21lbnRzIGZyb20gYSBmcmVzaGx5IHBhcnNlZCB0cmVlLCBvciB1cGRhdGVcbiAgICBhbiBleGlzdGluZyBzZXQgb2YgZnJhZ21lbnRzIGJ5IHJlcGxhY2luZyB0aGUgb25lcyB0aGF0IG92ZXJsYXBcbiAgICB3aXRoIGEgdHJlZSB3aXRoIGNvbnRlbnQgZnJvbSB0aGUgbmV3IHRyZWUuIFdoZW4gYHBhcnRpYWxgIGlzXG4gICAgdHJ1ZSwgdGhlIHBhcnNlIGlzIHRyZWF0ZWQgYXMgaW5jb21wbGV0ZSwgYW5kIHRoZSByZXN1bHRpbmdcbiAgICBmcmFnbWVudCBoYXMgW2BvcGVuRW5kYF0oI2NvbW1vbi5UcmVlRnJhZ21lbnQub3BlbkVuZCkgc2V0IHRvXG4gICAgdHJ1ZS5cbiAgICAqL1xuICAgIHN0YXRpYyBhZGRUcmVlKHRyZWUsIGZyYWdtZW50cyA9IFtdLCBwYXJ0aWFsID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtuZXcgVHJlZUZyYWdtZW50KDAsIHRyZWUubGVuZ3RoLCB0cmVlLCAwLCBmYWxzZSwgcGFydGlhbCldO1xuICAgICAgICBmb3IgKGxldCBmIG9mIGZyYWdtZW50cylcbiAgICAgICAgICAgIGlmIChmLnRvID4gdHJlZS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGx5IGEgc2V0IG9mIGVkaXRzIHRvIGFuIGFycmF5IG9mIGZyYWdtZW50cywgcmVtb3Zpbmcgb3JcbiAgICBzcGxpdHRpbmcgZnJhZ21lbnRzIGFzIG5lY2Vzc2FyeSB0byByZW1vdmUgZWRpdGVkIHJhbmdlcywgYW5kXG4gICAgYWRqdXN0aW5nIG9mZnNldHMgZm9yIGZyYWdtZW50cyB0aGF0IG1vdmVkLlxuICAgICovXG4gICAgc3RhdGljIGFwcGx5Q2hhbmdlcyhmcmFnbWVudHMsIGNoYW5nZXMsIG1pbkdhcCA9IDEyOCkge1xuICAgICAgICBpZiAoIWNoYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50cztcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgZkkgPSAxLCBuZXh0RiA9IGZyYWdtZW50cy5sZW5ndGggPyBmcmFnbWVudHNbMF0gOiBudWxsO1xuICAgICAgICBmb3IgKGxldCBjSSA9IDAsIHBvcyA9IDAsIG9mZiA9IDA7OyBjSSsrKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEMgPSBjSSA8IGNoYW5nZXMubGVuZ3RoID8gY2hhbmdlc1tjSV0gOiBudWxsO1xuICAgICAgICAgICAgbGV0IG5leHRQb3MgPSBuZXh0QyA/IG5leHRDLmZyb21BIDogMWU5O1xuICAgICAgICAgICAgaWYgKG5leHRQb3MgLSBwb3MgPj0gbWluR2FwKVxuICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0RiAmJiBuZXh0Ri5mcm9tIDwgbmV4dFBvcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3V0ID0gbmV4dEY7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gY3V0LmZyb20gfHwgbmV4dFBvcyA8PSBjdXQudG8gfHwgb2ZmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkZyb20gPSBNYXRoLm1heChjdXQuZnJvbSwgcG9zKSAtIG9mZiwgZlRvID0gTWF0aC5taW4oY3V0LnRvLCBuZXh0UG9zKSAtIG9mZjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1dCA9IGZGcm9tID49IGZUbyA/IG51bGwgOiBuZXcgVHJlZUZyYWdtZW50KGZGcm9tLCBmVG8sIGN1dC50cmVlLCBjdXQub2Zmc2V0ICsgb2ZmLCBjSSA+IDAsICEhbmV4dEMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjdXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEYudG8gPiBuZXh0UG9zKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIG5leHRGID0gZkkgPCBmcmFnbWVudHMubGVuZ3RoID8gZnJhZ21lbnRzW2ZJKytdIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHRDKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcG9zID0gbmV4dEMudG9BO1xuICAgICAgICAgICAgb2ZmID0gbmV4dEMudG9BIC0gbmV4dEMudG9CO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG5BIHN1cGVyY2xhc3MgdGhhdCBwYXJzZXJzIHNob3VsZCBleHRlbmQuXG4qL1xuY2xhc3MgUGFyc2VyIHtcbiAgICAvKipcbiAgICBTdGFydCBhIHBhcnNlLCByZXR1cm5pbmcgYSBbcGFydGlhbCBwYXJzZV0oI2NvbW1vbi5QYXJ0aWFsUGFyc2UpXG4gICAgb2JqZWN0LiBbYGZyYWdtZW50c2BdKCNjb21tb24uVHJlZUZyYWdtZW50KSBjYW4gYmUgcGFzc2VkIGluIHRvXG4gICAgbWFrZSB0aGUgcGFyc2UgaW5jcmVtZW50YWwuXG4gICAgXG4gICAgQnkgZGVmYXVsdCwgdGhlIGVudGlyZSBpbnB1dCBpcyBwYXJzZWQuIFlvdSBjYW4gcGFzcyBgcmFuZ2VzYCxcbiAgICB3aGljaCBzaG91bGQgYmUgYSBzb3J0ZWQgYXJyYXkgb2Ygbm9uLWVtcHR5LCBub24tb3ZlcmxhcHBpbmdcbiAgICByYW5nZXMsIHRvIHBhcnNlIG9ubHkgdGhvc2UgcmFuZ2VzLiBUaGUgdHJlZSByZXR1cm5lZCBpbiB0aGF0XG4gICAgY2FzZSB3aWxsIHN0YXJ0IGF0IGByYW5nZXNbMF0uZnJvbWAuXG4gICAgKi9cbiAgICBzdGFydFBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICBpbnB1dCA9IG5ldyBTdHJpbmdJbnB1dChpbnB1dCk7XG4gICAgICAgIHJhbmdlcyA9ICFyYW5nZXMgPyBbbmV3IFJhbmdlKDAsIGlucHV0Lmxlbmd0aCldIDogcmFuZ2VzLmxlbmd0aCA/IHJhbmdlcy5tYXAociA9PiBuZXcgUmFuZ2Uoci5mcm9tLCByLnRvKSkgOiBbbmV3IFJhbmdlKDAsIDApXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cyB8fCBbXSwgcmFuZ2VzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUnVuIGEgZnVsbCBwYXJzZSwgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICAqL1xuICAgIHBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICBsZXQgcGFyc2UgPSB0aGlzLnN0YXJ0UGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGRvbmUgPSBwYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgICAgICBpZiAoZG9uZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9uZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFN0cmluZ0lucHV0IHtcbiAgICBjb25zdHJ1Y3RvcihzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnN0cmluZy5sZW5ndGg7IH1cbiAgICBjaHVuayhmcm9tKSB7IHJldHVybiB0aGlzLnN0cmluZy5zbGljZShmcm9tKTsgfVxuICAgIGdldCBsaW5lQ2h1bmtzKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICByZWFkKGZyb20sIHRvKSB7IHJldHVybiB0aGlzLnN0cmluZy5zbGljZShmcm9tLCB0byk7IH1cbn1cblxuLyoqXG5DcmVhdGUgYSBwYXJzZSB3cmFwcGVyIHRoYXQsIGFmdGVyIHRoZSBpbm5lciBwYXJzZSBjb21wbGV0ZXMsXG5zY2FucyBpdHMgdHJlZSBmb3IgbWl4ZWQgbGFuZ3VhZ2UgcmVnaW9ucyB3aXRoIHRoZSBgbmVzdGBcbmZ1bmN0aW9uLCBydW5zIHRoZSByZXN1bHRpbmcgW2lubmVyIHBhcnNlc10oI2NvbW1vbi5OZXN0ZWRQYXJzZSksXG5hbmQgdGhlbiBbbW91bnRzXSgjY29tbW9uLk5vZGVQcm9wXm1vdW50ZWQpIHRoZWlyIHJlc3VsdHMgb250byB0aGVcbnRyZWUuXG4qL1xuZnVuY3Rpb24gcGFyc2VNaXhlZChuZXN0KSB7XG4gICAgcmV0dXJuIChwYXJzZSwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSA9PiBuZXcgTWl4ZWRQYXJzZShwYXJzZSwgbmVzdCwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKTtcbn1cbmNsYXNzIElubmVyUGFyc2Uge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlciwgcGFyc2UsIG92ZXJsYXksIHRhcmdldCwgZnJvbSkge1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5wYXJzZSA9IHBhcnNlO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja1JhbmdlcyhyYW5nZXMpIHtcbiAgICBpZiAoIXJhbmdlcy5sZW5ndGggfHwgcmFuZ2VzLnNvbWUociA9PiByLmZyb20gPj0gci50bykpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbm5lciBwYXJzZSByYW5nZXMgZ2l2ZW46IFwiICsgSlNPTi5zdHJpbmdpZnkocmFuZ2VzKSk7XG59XG5jbGFzcyBBY3RpdmVPdmVybGF5IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIsIHByZWRpY2F0ZSwgbW91bnRzLCBpbmRleCwgc3RhcnQsIHRhcmdldCwgcHJldikge1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgICAgIHRoaXMubW91bnRzID0gbW91bnRzO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMucHJldiA9IHByZXY7XG4gICAgICAgIHRoaXMuZGVwdGggPSAwO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IFtdO1xuICAgIH1cbn1cbmNvbnN0IHN0b3BwZWRJbm5lciA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG5jbGFzcyBNaXhlZFBhcnNlIHtcbiAgICBjb25zdHJ1Y3RvcihiYXNlLCBuZXN0LCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy5uZXN0ID0gbmVzdDtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cztcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBbXTtcbiAgICAgICAgdGhpcy5pbm5lckRvbmUgPSAwO1xuICAgICAgICB0aGlzLmJhc2VUcmVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBudWxsO1xuICAgICAgICB0aGlzLmJhc2VQYXJzZSA9IGJhc2U7XG4gICAgfVxuICAgIGFkdmFuY2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VQYXJzZSkge1xuICAgICAgICAgICAgbGV0IGRvbmUgPSB0aGlzLmJhc2VQYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgICAgICBpZiAoIWRvbmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXJzZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmJhc2VUcmVlID0gZG9uZTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRJbm5lcigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5uZXIgb2YgdGhpcy5pbm5lcilcbiAgICAgICAgICAgICAgICAgICAgaW5uZXIucGFyc2Uuc3RvcEF0KHRoaXMuc3RvcHBlZEF0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbm5lckRvbmUgPT0gdGhpcy5pbm5lci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmJhc2VUcmVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRyZWUocmVzdWx0LnR5cGUsIHJlc3VsdC5jaGlsZHJlbiwgcmVzdWx0LnBvc2l0aW9ucywgcmVzdWx0Lmxlbmd0aCwgcmVzdWx0LnByb3BWYWx1ZXMuY29uY2F0KFtbc3RvcHBlZElubmVyLCB0aGlzLnN0b3BwZWRBdF1dKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMuaW5uZXJbdGhpcy5pbm5lckRvbmVdLCBkb25lID0gaW5uZXIucGFyc2UuYWR2YW5jZSgpO1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgdGhpcy5pbm5lckRvbmUrKztcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzb21ld2hhdCBkb2RneSBidXQgc3VwZXIgaGVscGZ1bCBoYWNrIHdoZXJlIHdlXG4gICAgICAgICAgICAvLyBwYXRjaCB1cCBub2RlcyBjcmVhdGVkIGJ5IHRoZSBpbm5lciBwYXJzZSAoYW5kIHRodXNcbiAgICAgICAgICAgIC8vIHByZXN1bWFibHkgbm90IGFsaWFzZWQgYW55d2hlcmUgZWxzZSkgdG8gaG9sZCB0aGUgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIC8vIGFib3V0IHRoZSBpbm5lciBwYXJzZS5cbiAgICAgICAgICAgIGxldCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgaW5uZXIudGFyZ2V0LnByb3BzKTtcbiAgICAgICAgICAgIHByb3BzW05vZGVQcm9wLm1vdW50ZWQuaWRdID0gbmV3IE1vdW50ZWRUcmVlKGRvbmUsIGlubmVyLm92ZXJsYXksIGlubmVyLnBhcnNlcik7XG4gICAgICAgICAgICBpbm5lci50YXJnZXQucHJvcHMgPSBwcm9wcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZ2V0IHBhcnNlZFBvcygpIHtcbiAgICAgICAgaWYgKHRoaXMuYmFzZVBhcnNlKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBwb3MgPSB0aGlzLmlucHV0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5uZXJEb25lOyBpIDwgdGhpcy5pbm5lci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5uZXJbaV0uZnJvbSA8IHBvcylcbiAgICAgICAgICAgICAgICBwb3MgPSBNYXRoLm1pbihwb3MsIHRoaXMuaW5uZXJbaV0ucGFyc2UucGFyc2VkUG9zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICBzdG9wQXQocG9zKSB7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gcG9zO1xuICAgICAgICBpZiAodGhpcy5iYXNlUGFyc2UpXG4gICAgICAgICAgICB0aGlzLmJhc2VQYXJzZS5zdG9wQXQocG9zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5uZXJEb25lOyBpIDwgdGhpcy5pbm5lci5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB0aGlzLmlubmVyW2ldLnBhcnNlLnN0b3BBdChwb3MpO1xuICAgIH1cbiAgICBzdGFydElubmVyKCkge1xuICAgICAgICBsZXQgZnJhZ21lbnRDdXJzb3IgPSBuZXcgRnJhZ21lbnRDdXJzb3IodGhpcy5mcmFnbWVudHMpO1xuICAgICAgICBsZXQgb3ZlcmxheSA9IG51bGw7XG4gICAgICAgIGxldCBjb3ZlcmVkID0gbnVsbDtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBUcmVlQ3Vyc29yKG5ldyBUcmVlTm9kZSh0aGlzLmJhc2VUcmVlLCB0aGlzLnJhbmdlc1swXS5mcm9tLCAwLCBudWxsKSwgSXRlck1vZGUuSW5jbHVkZUFub255bW91cyB8IEl0ZXJNb2RlLklnbm9yZU1vdW50cyk7XG4gICAgICAgIHNjYW46IGZvciAobGV0IG5lc3QsIGlzQ292ZXJlZDs7KSB7XG4gICAgICAgICAgICBsZXQgZW50ZXIgPSB0cnVlLCByYW5nZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3BwZWRBdCAhPSBudWxsICYmIGN1cnNvci5mcm9tID49IHRoaXMuc3RvcHBlZEF0KSB7XG4gICAgICAgICAgICAgICAgZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZyYWdtZW50Q3Vyc29yLmhhc05vZGUoY3Vyc29yKSkge1xuICAgICAgICAgICAgICAgIGlmIChvdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IG92ZXJsYXkubW91bnRzLmZpbmQobSA9PiBtLmZyYWcuZnJvbSA8PSBjdXJzb3IuZnJvbSAmJiBtLmZyYWcudG8gPj0gY3Vyc29yLnRvICYmIG0ubW91bnQub3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgbWF0Y2gubW91bnQub3ZlcmxheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcm9tID0gci5mcm9tICsgbWF0Y2gucG9zLCB0byA9IHIudG8gKyBtYXRjaC5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20gPj0gY3Vyc29yLmZyb20gJiYgdG8gPD0gY3Vyc29yLnRvICYmICFvdmVybGF5LnJhbmdlcy5zb21lKHIgPT4gci5mcm9tIDwgdG8gJiYgci50byA+IGZyb20pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LnJhbmdlcy5wdXNoKHsgZnJvbSwgdG8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVudGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb3ZlcmVkICYmIChpc0NvdmVyZWQgPSBjaGVja0NvdmVyKGNvdmVyZWQucmFuZ2VzLCBjdXJzb3IuZnJvbSwgY3Vyc29yLnRvKSkpIHtcbiAgICAgICAgICAgICAgICBlbnRlciA9IGlzQ292ZXJlZCAhPSAyIC8qIENvdmVyLkZ1bGwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghY3Vyc29yLnR5cGUuaXNBbm9ueW1vdXMgJiYgKG5lc3QgPSB0aGlzLm5lc3QoY3Vyc29yLCB0aGlzLmlucHV0KSkgJiZcbiAgICAgICAgICAgICAgICAoY3Vyc29yLmZyb20gPCBjdXJzb3IudG8gfHwgIW5lc3Qub3ZlcmxheSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci50cmVlKVxuICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbGl6ZShjdXJzb3IpO1xuICAgICAgICAgICAgICAgIGxldCBvbGRNb3VudHMgPSBmcmFnbWVudEN1cnNvci5maW5kTW91bnRzKGN1cnNvci5mcm9tLCBuZXN0LnBhcnNlcik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXN0Lm92ZXJsYXkgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXkgPSBuZXcgQWN0aXZlT3ZlcmxheShuZXN0LnBhcnNlciwgbmVzdC5vdmVybGF5LCBvbGRNb3VudHMsIHRoaXMuaW5uZXIubGVuZ3RoLCBjdXJzb3IuZnJvbSwgY3Vyc29yLnRyZWUsIG92ZXJsYXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHB1bmNoUmFuZ2VzKHRoaXMucmFuZ2VzLCBuZXN0Lm92ZXJsYXkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChjdXJzb3IuZnJvbSA8IGN1cnNvci50byA/IFtuZXcgUmFuZ2UoY3Vyc29yLmZyb20sIGN1cnNvci50byldIDogW10pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1JhbmdlcyhyYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCB8fCAhbmVzdC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbm5lci5wdXNoKG5ldyBJbm5lclBhcnNlKG5lc3QucGFyc2VyLCByYW5nZXMubGVuZ3RoID8gbmVzdC5wYXJzZXIuc3RhcnRQYXJzZSh0aGlzLmlucHV0LCBlbnRlckZyYWdtZW50cyhvbGRNb3VudHMsIHJhbmdlcyksIHJhbmdlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5lc3QucGFyc2VyLnN0YXJ0UGFyc2UoXCJcIiksIG5lc3Qub3ZlcmxheSA/IG5lc3Qub3ZlcmxheS5tYXAociA9PiBuZXcgUmFuZ2Uoci5mcm9tIC0gY3Vyc29yLmZyb20sIHIudG8gLSBjdXJzb3IuZnJvbSkpIDogbnVsbCwgY3Vyc29yLnRyZWUsIHJhbmdlcy5sZW5ndGggPyByYW5nZXNbMF0uZnJvbSA6IGN1cnNvci5mcm9tKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmVzdC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyZWQgPSB7IHJhbmdlcywgZGVwdGg6IDAsIHByZXY6IGNvdmVyZWQgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvdmVybGF5ICYmIChyYW5nZSA9IG92ZXJsYXkucHJlZGljYXRlKGN1cnNvcikpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlID09PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZShjdXJzb3IuZnJvbSwgY3Vyc29yLnRvKTtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZnJvbSA8IHJhbmdlLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gb3ZlcmxheS5yYW5nZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgPj0gMCAmJiBvdmVybGF5LnJhbmdlc1tsYXN0XS50byA9PSByYW5nZS5mcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS5yYW5nZXNbbGFzdF0gPSB7IGZyb206IG92ZXJsYXkucmFuZ2VzW2xhc3RdLmZyb20sIHRvOiByYW5nZS50byB9O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LnJhbmdlcy5wdXNoKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW50ZXIgJiYgY3Vyc29yLmZpcnN0Q2hpbGQoKSkge1xuICAgICAgICAgICAgICAgIGlmIChvdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5LmRlcHRoKys7XG4gICAgICAgICAgICAgICAgaWYgKGNvdmVyZWQpXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyZWQuZGVwdGgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLnBhcmVudCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJsYXkgJiYgIS0tb3ZlcmxheS5kZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHB1bmNoUmFuZ2VzKHRoaXMucmFuZ2VzLCBvdmVybGF5LnJhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUmFuZ2VzKHJhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbm5lci5zcGxpY2Uob3ZlcmxheS5pbmRleCwgMCwgbmV3IElubmVyUGFyc2Uob3ZlcmxheS5wYXJzZXIsIG92ZXJsYXkucGFyc2VyLnN0YXJ0UGFyc2UodGhpcy5pbnB1dCwgZW50ZXJGcmFnbWVudHMob3ZlcmxheS5tb3VudHMsIHJhbmdlcyksIHJhbmdlcyksIG92ZXJsYXkucmFuZ2VzLm1hcChyID0+IG5ldyBSYW5nZShyLmZyb20gLSBvdmVybGF5LnN0YXJ0LCByLnRvIC0gb3ZlcmxheS5zdGFydCkpLCBvdmVybGF5LnRhcmdldCwgcmFuZ2VzWzBdLmZyb20pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXkgPSBvdmVybGF5LnByZXY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdmVyZWQgJiYgIS0tY292ZXJlZC5kZXB0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyZWQgPSBjb3ZlcmVkLnByZXY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tDb3Zlcihjb3ZlcmVkLCBmcm9tLCB0bykge1xuICAgIGZvciAobGV0IHJhbmdlIG9mIGNvdmVyZWQpIHtcbiAgICAgICAgaWYgKHJhbmdlLmZyb20gPj0gdG8pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHJhbmdlLnRvID4gZnJvbSlcbiAgICAgICAgICAgIHJldHVybiByYW5nZS5mcm9tIDw9IGZyb20gJiYgcmFuZ2UudG8gPj0gdG8gPyAyIC8qIENvdmVyLkZ1bGwgKi8gOiAxIC8qIENvdmVyLlBhcnRpYWwgKi87XG4gICAgfVxuICAgIHJldHVybiAwIC8qIENvdmVyLk5vbmUgKi87XG59XG4vLyBUYWtlIGEgcGllY2Ugb2YgYnVmZmVyIGFuZCBjb252ZXJ0IGl0IGludG8gYSBzdGFuZC1hbG9uZVxuLy8gVHJlZUJ1ZmZlci5cbmZ1bmN0aW9uIHNsaWNlQnVmKGJ1Ziwgc3RhcnRJLCBlbmRJLCBub2RlcywgcG9zaXRpb25zLCBvZmYpIHtcbiAgICBpZiAoc3RhcnRJIDwgZW5kSSkge1xuICAgICAgICBsZXQgZnJvbSA9IGJ1Zi5idWZmZXJbc3RhcnRJICsgMV07XG4gICAgICAgIG5vZGVzLnB1c2goYnVmLnNsaWNlKHN0YXJ0SSwgZW5kSSwgZnJvbSkpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChmcm9tIC0gb2ZmKTtcbiAgICB9XG59XG4vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgbm9kZSB0aGF0J3MgaW4gYSBidWZmZXIsIGFuZCBjb252ZXJ0cyBpdCwgYW5kXG4vLyBpdHMgcGFyZW50IGJ1ZmZlciBub2RlcywgaW50byBhIFRyZWUuIFRoaXMgaXMgYWdhaW4gYWN0aW5nIG9uIHRoZVxuLy8gYXNzdW1wdGlvbiB0aGF0IHRoZSB0cmVlcyBhbmQgYnVmZmVycyBoYXZlIGJlZW4gY29uc3RydWN0ZWQgYnkgdGhlXG4vLyBwYXJzZSB0aGF0IHdhcyByYW4gdmlhIHRoZSBtaXggcGFyc2VyLCBhbmQgdGh1cyBhcmVuJ3Qgc2hhcmVkIHdpdGhcbi8vIGFueSBvdGhlciBjb2RlLCBtYWtpbmcgdmlvbGF0aW9ucyBvZiB0aGUgaW1tdXRhYmlsaXR5IHNhZmUuXG5mdW5jdGlvbiBtYXRlcmlhbGl6ZShjdXJzb3IpIHtcbiAgICBsZXQgeyBub2RlIH0gPSBjdXJzb3IsIHN0YWNrID0gW107XG4gICAgbGV0IGJ1ZmZlciA9IG5vZGUuY29udGV4dC5idWZmZXI7XG4gICAgLy8gU2NhbiB1cCB0byB0aGUgbmVhcmVzdCB0cmVlXG4gICAgZG8ge1xuICAgICAgICBzdGFjay5wdXNoKGN1cnNvci5pbmRleCk7XG4gICAgICAgIGN1cnNvci5wYXJlbnQoKTtcbiAgICB9IHdoaWxlICghY3Vyc29yLnRyZWUpO1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBidWZmZXIgaW4gdGhhdCB0cmVlXG4gICAgbGV0IGJhc2UgPSBjdXJzb3IudHJlZSwgaSA9IGJhc2UuY2hpbGRyZW4uaW5kZXhPZihidWZmZXIpO1xuICAgIGxldCBidWYgPSBiYXNlLmNoaWxkcmVuW2ldLCBiID0gYnVmLmJ1ZmZlciwgbmV3U3RhY2sgPSBbaV07XG4gICAgLy8gU3BsaXQgYSBsZXZlbCBpbiB0aGUgYnVmZmVyLCBwdXR0aW5nIHRoZSBub2RlcyBiZWZvcmUgYW5kIGFmdGVyXG4gICAgLy8gdGhlIGNoaWxkIHRoYXQgY29udGFpbnMgYG5vZGVgIGludG8gbmV3IGJ1ZmZlcnMuXG4gICAgZnVuY3Rpb24gc3BsaXQoc3RhcnRJLCBlbmRJLCB0eXBlLCBpbm5lck9mZnNldCwgbGVuZ3RoLCBzdGFja1Bvcykge1xuICAgICAgICBsZXQgdGFyZ2V0SSA9IHN0YWNrW3N0YWNrUG9zXTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gW10sIHBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBzbGljZUJ1ZihidWYsIHN0YXJ0SSwgdGFyZ2V0SSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgaW5uZXJPZmZzZXQpO1xuICAgICAgICBsZXQgZnJvbSA9IGJbdGFyZ2V0SSArIDFdLCB0byA9IGJbdGFyZ2V0SSArIDJdO1xuICAgICAgICBuZXdTdGFjay5wdXNoKGNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIGxldCBjaGlsZCA9IHN0YWNrUG9zXG4gICAgICAgICAgICA/IHNwbGl0KHRhcmdldEkgKyA0LCBiW3RhcmdldEkgKyAzXSwgYnVmLnNldC50eXBlc1tiW3RhcmdldEldXSwgZnJvbSwgdG8gLSBmcm9tLCBzdGFja1BvcyAtIDEpXG4gICAgICAgICAgICA6IG5vZGUudG9UcmVlKCk7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChmcm9tIC0gaW5uZXJPZmZzZXQpO1xuICAgICAgICBzbGljZUJ1ZihidWYsIGJbdGFyZ2V0SSArIDNdLCBlbmRJLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBpbm5lck9mZnNldCk7XG4gICAgICAgIHJldHVybiBuZXcgVHJlZSh0eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpO1xuICAgIH1cbiAgICBiYXNlLmNoaWxkcmVuW2ldID0gc3BsaXQoMCwgYi5sZW5ndGgsIE5vZGVUeXBlLm5vbmUsIDAsIGJ1Zi5sZW5ndGgsIHN0YWNrLmxlbmd0aCAtIDEpO1xuICAgIC8vIE1vdmUgdGhlIGN1cnNvciBiYWNrIHRvIHRoZSB0YXJnZXQgbm9kZVxuICAgIGZvciAobGV0IGluZGV4IG9mIG5ld1N0YWNrKSB7XG4gICAgICAgIGxldCB0cmVlID0gY3Vyc29yLnRyZWUuY2hpbGRyZW5baW5kZXhdLCBwb3MgPSBjdXJzb3IudHJlZS5wb3NpdGlvbnNbaW5kZXhdO1xuICAgICAgICBjdXJzb3IueWllbGQobmV3IFRyZWVOb2RlKHRyZWUsIHBvcyArIGN1cnNvci5mcm9tLCBpbmRleCwgY3Vyc29yLl90cmVlKSk7XG4gICAgfVxufVxuY2xhc3MgU3RydWN0dXJlQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3Rvcihyb290LCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnNvciA9IHJvb3QuY3Vyc29yKEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMgfCBJdGVyTW9kZS5JZ25vcmVNb3VudHMpO1xuICAgIH1cbiAgICAvLyBNb3ZlIHRvIHRoZSBmaXJzdCBub2RlIChpbiBwcmUtb3JkZXIpIHRoYXQgc3RhcnRzIGF0IG9yIGFmdGVyIGBwb3NgLlxuICAgIG1vdmVUbyhwb3MpIHtcbiAgICAgICAgbGV0IHsgY3Vyc29yIH0gPSB0aGlzLCBwID0gcG9zIC0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIHdoaWxlICghdGhpcy5kb25lICYmIGN1cnNvci5mcm9tIDwgcCkge1xuICAgICAgICAgICAgaWYgKGN1cnNvci50byA+PSBwb3MgJiYgY3Vyc29yLmVudGVyKHAsIDEsIEl0ZXJNb2RlLklnbm9yZU92ZXJsYXlzIHwgSXRlck1vZGUuRXhjbHVkZUJ1ZmZlcnMpKSA7XG4gICAgICAgICAgICBlbHNlIGlmICghY3Vyc29yLm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFzTm9kZShjdXJzb3IpIHtcbiAgICAgICAgdGhpcy5tb3ZlVG8oY3Vyc29yLmZyb20pO1xuICAgICAgICBpZiAoIXRoaXMuZG9uZSAmJiB0aGlzLmN1cnNvci5mcm9tICsgdGhpcy5vZmZzZXQgPT0gY3Vyc29yLmZyb20gJiYgdGhpcy5jdXJzb3IudHJlZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgdHJlZSA9IHRoaXMuY3Vyc29yLnRyZWU7Oykge1xuICAgICAgICAgICAgICAgIGlmICh0cmVlID09IGN1cnNvci50cmVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHJlZS5jaGlsZHJlbi5sZW5ndGggJiYgdHJlZS5wb3NpdGlvbnNbMF0gPT0gMCAmJiB0cmVlLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgVHJlZSlcbiAgICAgICAgICAgICAgICAgICAgdHJlZSA9IHRyZWUuY2hpbGRyZW5bMF07XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuY2xhc3MgRnJhZ21lbnRDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGZyYWdtZW50cykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLmN1clRvID0gMDtcbiAgICAgICAgdGhpcy5mcmFnSSA9IDA7XG4gICAgICAgIGlmIChmcmFnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0aGlzLmN1ckZyYWcgPSBmcmFnbWVudHNbMF07XG4gICAgICAgICAgICB0aGlzLmN1clRvID0gKF9hID0gZmlyc3QudHJlZS5wcm9wKHN0b3BwZWRJbm5lcikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZpcnN0LnRvO1xuICAgICAgICAgICAgdGhpcy5pbm5lciA9IG5ldyBTdHJ1Y3R1cmVDdXJzb3IoZmlyc3QudHJlZSwgLWZpcnN0Lm9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1ckZyYWcgPSB0aGlzLmlubmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNOb2RlKG5vZGUpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VyRnJhZyAmJiBub2RlLmZyb20gPj0gdGhpcy5jdXJUbylcbiAgICAgICAgICAgIHRoaXMubmV4dEZyYWcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyRnJhZyAmJiB0aGlzLmN1ckZyYWcuZnJvbSA8PSBub2RlLmZyb20gJiYgdGhpcy5jdXJUbyA+PSBub2RlLnRvICYmIHRoaXMuaW5uZXIuaGFzTm9kZShub2RlKTtcbiAgICB9XG4gICAgbmV4dEZyYWcoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5mcmFnSSsrO1xuICAgICAgICBpZiAodGhpcy5mcmFnSSA9PSB0aGlzLmZyYWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyRnJhZyA9IHRoaXMuaW5uZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZyYWcgPSB0aGlzLmN1ckZyYWcgPSB0aGlzLmZyYWdtZW50c1t0aGlzLmZyYWdJXTtcbiAgICAgICAgICAgIHRoaXMuY3VyVG8gPSAoX2EgPSBmcmFnLnRyZWUucHJvcChzdG9wcGVkSW5uZXIpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmcmFnLnRvO1xuICAgICAgICAgICAgdGhpcy5pbm5lciA9IG5ldyBTdHJ1Y3R1cmVDdXJzb3IoZnJhZy50cmVlLCAtZnJhZy5vZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmRNb3VudHMocG9zLCBwYXJzZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICh0aGlzLmlubmVyKSB7XG4gICAgICAgICAgICB0aGlzLmlubmVyLmN1cnNvci5tb3ZlVG8ocG9zLCAxKTtcbiAgICAgICAgICAgIGZvciAobGV0IHBvcyA9IHRoaXMuaW5uZXIuY3Vyc29yLm5vZGU7IHBvczsgcG9zID0gcG9zLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGxldCBtb3VudCA9IChfYSA9IHBvcy50cmVlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucHJvcChOb2RlUHJvcC5tb3VudGVkKTtcbiAgICAgICAgICAgICAgICBpZiAobW91bnQgJiYgbW91bnQucGFyc2VyID09IHBhcnNlcikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5mcmFnSTsgaSA8IHRoaXMuZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZnJhZyA9IHRoaXMuZnJhZ21lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYWcuZnJvbSA+PSBwb3MudG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhZy50cmVlID09IHRoaXMuY3VyRnJhZy50cmVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiBwb3MuZnJvbSAtIGZyYWcub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gcHVuY2hSYW5nZXMob3V0ZXIsIHJhbmdlcykge1xuICAgIGxldCBjb3B5ID0gbnVsbCwgY3VycmVudCA9IHJhbmdlcztcbiAgICBmb3IgKGxldCBpID0gMSwgaiA9IDA7IGkgPCBvdXRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZ2FwRnJvbSA9IG91dGVyW2kgLSAxXS50bywgZ2FwVG8gPSBvdXRlcltpXS5mcm9tO1xuICAgICAgICBmb3IgKDsgaiA8IGN1cnJlbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGxldCByID0gY3VycmVudFtqXTtcbiAgICAgICAgICAgIGlmIChyLmZyb20gPj0gZ2FwVG8pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoci50byA8PSBnYXBGcm9tKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFjb3B5KVxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjb3B5ID0gcmFuZ2VzLnNsaWNlKCk7XG4gICAgICAgICAgICBpZiAoci5mcm9tIDwgZ2FwRnJvbSkge1xuICAgICAgICAgICAgICAgIGNvcHlbal0gPSBuZXcgUmFuZ2Uoci5mcm9tLCBnYXBGcm9tKTtcbiAgICAgICAgICAgICAgICBpZiAoci50byA+IGdhcFRvKVxuICAgICAgICAgICAgICAgICAgICBjb3B5LnNwbGljZShqICsgMSwgMCwgbmV3IFJhbmdlKGdhcFRvLCByLnRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyLnRvID4gZ2FwVG8pIHtcbiAgICAgICAgICAgICAgICBjb3B5W2otLV0gPSBuZXcgUmFuZ2UoZ2FwVG8sIHIudG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29weS5zcGxpY2Uoai0tLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbn1cbmZ1bmN0aW9uIGZpbmRDb3ZlckNoYW5nZXMoYSwgYiwgZnJvbSwgdG8pIHtcbiAgICBsZXQgaUEgPSAwLCBpQiA9IDAsIGluQSA9IGZhbHNlLCBpbkIgPSBmYWxzZSwgcG9zID0gLTFlOTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yICg7Oykge1xuICAgICAgICBsZXQgbmV4dEEgPSBpQSA9PSBhLmxlbmd0aCA/IDFlOSA6IGluQSA/IGFbaUFdLnRvIDogYVtpQV0uZnJvbTtcbiAgICAgICAgbGV0IG5leHRCID0gaUIgPT0gYi5sZW5ndGggPyAxZTkgOiBpbkIgPyBiW2lCXS50byA6IGJbaUJdLmZyb207XG4gICAgICAgIGlmIChpbkEgIT0gaW5CKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBNYXRoLm1heChwb3MsIGZyb20pLCBlbmQgPSBNYXRoLm1pbihuZXh0QSwgbmV4dEIsIHRvKTtcbiAgICAgICAgICAgIGlmIChzdGFydCA8IGVuZClcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgUmFuZ2Uoc3RhcnQsIGVuZCkpO1xuICAgICAgICB9XG4gICAgICAgIHBvcyA9IE1hdGgubWluKG5leHRBLCBuZXh0Qik7XG4gICAgICAgIGlmIChwb3MgPT0gMWU5KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmIChuZXh0QSA9PSBwb3MpIHtcbiAgICAgICAgICAgIGlmICghaW5BKVxuICAgICAgICAgICAgICAgIGluQSA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbkEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpQSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0QiA9PSBwb3MpIHtcbiAgICAgICAgICAgIGlmICghaW5CKVxuICAgICAgICAgICAgICAgIGluQiA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbkIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpQisrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyBHaXZlbiBhIG51bWJlciBvZiBmcmFnbWVudHMgZm9yIHRoZSBvdXRlciB0cmVlLCBhbmQgYSBzZXQgb2YgcmFuZ2VzXG4vLyB0byBwYXJzZSwgZmluZCBmcmFnbWVudHMgZm9yIGlubmVyIHRyZWVzIG1vdW50ZWQgYXJvdW5kIHRob3NlXG4vLyByYW5nZXMsIGlmIGFueS5cbmZ1bmN0aW9uIGVudGVyRnJhZ21lbnRzKG1vdW50cywgcmFuZ2VzKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IHsgcG9zLCBtb3VudCwgZnJhZyB9IG9mIG1vdW50cykge1xuICAgICAgICBsZXQgc3RhcnRQb3MgPSBwb3MgKyAobW91bnQub3ZlcmxheSA/IG1vdW50Lm92ZXJsYXlbMF0uZnJvbSA6IDApLCBlbmRQb3MgPSBzdGFydFBvcyArIG1vdW50LnRyZWUubGVuZ3RoO1xuICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWF4KGZyYWcuZnJvbSwgc3RhcnRQb3MpLCB0byA9IE1hdGgubWluKGZyYWcudG8sIGVuZFBvcyk7XG4gICAgICAgIGlmIChtb3VudC5vdmVybGF5KSB7XG4gICAgICAgICAgICBsZXQgb3ZlcmxheSA9IG1vdW50Lm92ZXJsYXkubWFwKHIgPT4gbmV3IFJhbmdlKHIuZnJvbSArIHBvcywgci50byArIHBvcykpO1xuICAgICAgICAgICAgbGV0IGNoYW5nZXMgPSBmaW5kQ292ZXJDaGFuZ2VzKHJhbmdlcywgb3ZlcmxheSwgZnJvbSwgdG8pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IGZyb207OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGkgPT0gY2hhbmdlcy5sZW5ndGgsIGVuZCA9IGxhc3QgPyB0byA6IGNoYW5nZXNbaV0uZnJvbTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgVHJlZUZyYWdtZW50KHBvcywgZW5kLCBtb3VudC50cmVlLCAtc3RhcnRQb3MsIGZyYWcuZnJvbSA+PSBwb3MgfHwgZnJhZy5vcGVuU3RhcnQsIGZyYWcudG8gPD0gZW5kIHx8IGZyYWcub3BlbkVuZCkpO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBwb3MgPSBjaGFuZ2VzW2ldLnRvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFRyZWVGcmFnbWVudChmcm9tLCB0bywgbW91bnQudHJlZSwgLXN0YXJ0UG9zLCBmcmFnLmZyb20gPj0gc3RhcnRQb3MgfHwgZnJhZy5vcGVuU3RhcnQsIGZyYWcudG8gPD0gZW5kUG9zIHx8IGZyYWcub3BlbkVuZCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCB7IERlZmF1bHRCdWZmZXJMZW5ndGgsIEl0ZXJNb2RlLCBNb3VudGVkVHJlZSwgTm9kZVByb3AsIE5vZGVTZXQsIE5vZGVUeXBlLCBOb2RlV2Vha01hcCwgUGFyc2VyLCBUcmVlLCBUcmVlQnVmZmVyLCBUcmVlQ3Vyc29yLCBUcmVlRnJhZ21lbnQsIHBhcnNlTWl4ZWQgfTtcbiIsICJpbXBvcnQgeyBOb2RlUHJvcCB9IGZyb20gJ0BsZXplci9jb21tb24nO1xuXG5sZXQgbmV4dFRhZ0lEID0gMDtcbi8qKlxuSGlnaGxpZ2h0aW5nIHRhZ3MgYXJlIG1hcmtlcnMgdGhhdCBkZW5vdGUgYSBoaWdobGlnaHRpbmcgY2F0ZWdvcnkuXG5UaGV5IGFyZSBbYXNzb2NpYXRlZF0oI2hpZ2hsaWdodC5zdHlsZVRhZ3MpIHdpdGggcGFydHMgb2YgYSBzeW50YXhcbnRyZWUgYnkgYSBsYW5ndWFnZSBtb2RlLCBhbmQgdGhlbiBtYXBwZWQgdG8gYW4gYWN0dWFsIENTUyBzdHlsZSBieVxuYSBbaGlnaGxpZ2h0ZXJdKCNoaWdobGlnaHQuSGlnaGxpZ2h0ZXIpLlxuXG5CZWNhdXNlIHN5bnRheCB0cmVlIG5vZGUgdHlwZXMgYW5kIGhpZ2hsaWdodCBzdHlsZXMgaGF2ZSB0byBiZVxuYWJsZSB0byB0YWxrIHRoZSBzYW1lIGxhbmd1YWdlLCBDb2RlTWlycm9yIHVzZXMgYSBtb3N0bHkgX2Nsb3NlZF9cblt2b2NhYnVsYXJ5XSgjaGlnaGxpZ2h0LnRhZ3MpIG9mIHN5bnRheCB0YWdzIChhcyBvcHBvc2VkIHRvXG50cmFkaXRpb25hbCBvcGVuIHN0cmluZy1iYXNlZCBzeXN0ZW1zLCB3aGljaCBtYWtlIGl0IGhhcmQgZm9yXG5oaWdobGlnaHRpbmcgdGhlbWVzIHRvIGNvdmVyIGFsbCB0aGUgdG9rZW5zIHByb2R1Y2VkIGJ5IHRoZVxudmFyaW91cyBsYW5ndWFnZXMpLlxuXG5JdCBfaXNfIHBvc3NpYmxlIHRvIFtkZWZpbmVdKCNoaWdobGlnaHQuVGFnXmRlZmluZSkgeW91ciBvd25cbmhpZ2hsaWdodGluZyB0YWdzIGZvciBzeXN0ZW0taW50ZXJuYWwgdXNlICh3aGVyZSB5b3UgY29udHJvbCBib3RoXG50aGUgbGFuZ3VhZ2UgcGFja2FnZSBhbmQgdGhlIGhpZ2hsaWdodGVyKSwgYnV0IHN1Y2ggdGFncyB3aWxsIG5vdFxuYmUgcGlja2VkIHVwIGJ5IHJlZ3VsYXIgaGlnaGxpZ2h0ZXJzICh0aG91Z2ggeW91IGNhbiBkZXJpdmUgdGhlbVxuZnJvbSBzdGFuZGFyZCB0YWdzIHRvIGFsbG93IGhpZ2hsaWdodGVycyB0byBmYWxsIGJhY2sgdG8gdGhvc2UpLlxuKi9cbmNsYXNzIFRhZyB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgb3B0aW9uYWwgbmFtZSBvZiB0aGUgYmFzZSB0YWcgQGludGVybmFsXG4gICAgKi9cbiAgICBuYW1lLCBcbiAgICAvKipcbiAgICBUaGUgc2V0IG9mIHRoaXMgdGFnIGFuZCBhbGwgaXRzIHBhcmVudCB0YWdzLCBzdGFydGluZyB3aXRoXG4gICAgdGhpcyBvbmUgaXRzZWxmIGFuZCBzb3J0ZWQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZyBzcGVjaWZpY2l0eS5cbiAgICAqL1xuICAgIHNldCwgXG4gICAgLyoqXG4gICAgVGhlIGJhc2UgdW5tb2RpZmllZCB0YWcgdGhhdCB0aGlzIG9uZSBpcyBiYXNlZCBvbiwgaWYgaXQnc1xuICAgIG1vZGlmaWVkIEBpbnRlcm5hbFxuICAgICovXG4gICAgYmFzZSwgXG4gICAgLyoqXG4gICAgVGhlIG1vZGlmaWVycyBhcHBsaWVkIHRvIHRoaXMuYmFzZSBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1vZGlmaWVkKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuc2V0ID0gc2V0O1xuICAgICAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgICAgICB0aGlzLm1vZGlmaWVkID0gbW9kaWZpZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pZCA9IG5leHRUYWdJRCsrO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHsgbmFtZSB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgbW9kIG9mIHRoaXMubW9kaWZpZWQpXG4gICAgICAgICAgICBpZiAobW9kLm5hbWUpXG4gICAgICAgICAgICAgICAgbmFtZSA9IGAke21vZC5uYW1lfSgke25hbWV9KWA7XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbiAgICBzdGF0aWMgZGVmaW5lKG5hbWVPclBhcmVudCwgcGFyZW50KSB7XG4gICAgICAgIGxldCBuYW1lID0gdHlwZW9mIG5hbWVPclBhcmVudCA9PSBcInN0cmluZ1wiID8gbmFtZU9yUGFyZW50IDogXCI/XCI7XG4gICAgICAgIGlmIChuYW1lT3JQYXJlbnQgaW5zdGFuY2VvZiBUYWcpXG4gICAgICAgICAgICBwYXJlbnQgPSBuYW1lT3JQYXJlbnQ7XG4gICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwgfHwgcGFyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJlbnQuYmFzZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbiBub3QgZGVyaXZlIGZyb20gYSBtb2RpZmllZCB0YWdcIik7XG4gICAgICAgIGxldCB0YWcgPSBuZXcgVGFnKG5hbWUsIFtdLCBudWxsLCBbXSk7XG4gICAgICAgIHRhZy5zZXQucHVzaCh0YWcpO1xuICAgICAgICBpZiAocGFyZW50KVxuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiBwYXJlbnQuc2V0KVxuICAgICAgICAgICAgICAgIHRhZy5zZXQucHVzaCh0KTtcbiAgICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgdGFnIF9tb2RpZmllcl8sIHdoaWNoIGlzIGEgZnVuY3Rpb24gdGhhdCwgZ2l2ZW4gYSB0YWcsXG4gICAgd2lsbCByZXR1cm4gYSB0YWcgdGhhdCBpcyBhIHN1YnRhZyBvZiB0aGUgb3JpZ2luYWwuIEFwcGx5aW5nIHRoZVxuICAgIHNhbWUgbW9kaWZpZXIgdG8gYSB0d2ljZSB0YWcgd2lsbCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgKGBtMSh0MSlcbiAgICA9PSBtMSh0MSlgKSBhbmQgYXBwbHlpbmcgbXVsdGlwbGUgbW9kaWZpZXJzIHdpbGwsIHJlZ2FyZGxlc3Mgb3JcbiAgICBvcmRlciwgcHJvZHVjZSB0aGUgc2FtZSB0YWcgKGBtMShtMih0MSkpID09IG0yKG0xKHQxKSlgKS5cbiAgICBcbiAgICBXaGVuIG11bHRpcGxlIG1vZGlmaWVycyBhcmUgYXBwbGllZCB0byBhIGdpdmVuIGJhc2UgdGFnLCBlYWNoXG4gICAgc21hbGxlciBzZXQgb2YgbW9kaWZpZXJzIGlzIHJlZ2lzdGVyZWQgYXMgYSBwYXJlbnQsIHNvIHRoYXQgZm9yXG4gICAgZXhhbXBsZSBgbTEobTIobTModDEpKSlgIGlzIGEgc3VidHlwZSBvZiBgbTEobTIodDEpKWAsXG4gICAgYG0xKG0zKHQxKWAsIGFuZCBzbyBvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmVNb2RpZmllcihuYW1lKSB7XG4gICAgICAgIGxldCBtb2QgPSBuZXcgTW9kaWZpZXIobmFtZSk7XG4gICAgICAgIHJldHVybiAodGFnKSA9PiB7XG4gICAgICAgICAgICBpZiAodGFnLm1vZGlmaWVkLmluZGV4T2YobW9kKSA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgICAgICAgICByZXR1cm4gTW9kaWZpZXIuZ2V0KHRhZy5iYXNlIHx8IHRhZywgdGFnLm1vZGlmaWVkLmNvbmNhdChtb2QpLnNvcnQoKGEsIGIpID0+IGEuaWQgLSBiLmlkKSk7XG4gICAgICAgIH07XG4gICAgfVxufVxubGV0IG5leHRNb2RpZmllcklEID0gMDtcbmNsYXNzIE1vZGlmaWVyIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VzID0gW107XG4gICAgICAgIHRoaXMuaWQgPSBuZXh0TW9kaWZpZXJJRCsrO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0KGJhc2UsIG1vZHMpIHtcbiAgICAgICAgaWYgKCFtb2RzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICBsZXQgZXhpc3RzID0gbW9kc1swXS5pbnN0YW5jZXMuZmluZCh0ID0+IHQuYmFzZSA9PSBiYXNlICYmIHNhbWVBcnJheShtb2RzLCB0Lm1vZGlmaWVkKSk7XG4gICAgICAgIGlmIChleGlzdHMpXG4gICAgICAgICAgICByZXR1cm4gZXhpc3RzO1xuICAgICAgICBsZXQgc2V0ID0gW10sIHRhZyA9IG5ldyBUYWcoYmFzZS5uYW1lLCBzZXQsIGJhc2UsIG1vZHMpO1xuICAgICAgICBmb3IgKGxldCBtIG9mIG1vZHMpXG4gICAgICAgICAgICBtLmluc3RhbmNlcy5wdXNoKHRhZyk7XG4gICAgICAgIGxldCBjb25maWdzID0gcG93ZXJTZXQobW9kcyk7XG4gICAgICAgIGZvciAobGV0IHBhcmVudCBvZiBiYXNlLnNldClcbiAgICAgICAgICAgIGlmICghcGFyZW50Lm1vZGlmaWVkLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb25maWcgb2YgY29uZmlncylcbiAgICAgICAgICAgICAgICAgICAgc2V0LnB1c2goTW9kaWZpZXIuZ2V0KHBhcmVudCwgY29uZmlnKSk7XG4gICAgICAgIHJldHVybiB0YWc7XG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZUFycmF5KGEsIGIpIHtcbiAgICByZXR1cm4gYS5sZW5ndGggPT0gYi5sZW5ndGggJiYgYS5ldmVyeSgoeCwgaSkgPT4geCA9PSBiW2ldKTtcbn1cbmZ1bmN0aW9uIHBvd2VyU2V0KGFycmF5KSB7XG4gICAgbGV0IHNldHMgPSBbW11dO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGUgPSBzZXRzLmxlbmd0aDsgaiA8IGU7IGorKykge1xuICAgICAgICAgICAgc2V0cy5wdXNoKHNldHNbal0uY29uY2F0KGFycmF5W2ldKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNldHMuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aCk7XG59XG4vKipcblRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgYSBzZXQgb2YgdGFncyB0byBhIGxhbmd1YWdlIHN5bnRheFxudmlhIFtgTm9kZVNldC5leHRlbmRgXSgjY29tbW9uLk5vZGVTZXQuZXh0ZW5kKSBvclxuW2BMUlBhcnNlci5jb25maWd1cmVgXSgjbHIuTFJQYXJzZXIuY29uZmlndXJlKS5cblxuVGhlIGFyZ3VtZW50IG9iamVjdCBtYXBzIG5vZGUgc2VsZWN0b3JzIHRvIFtoaWdobGlnaHRpbmdcbnRhZ3NdKCNoaWdobGlnaHQuVGFnKSBvciBhcnJheXMgb2YgdGFncy5cblxuTm9kZSBzZWxlY3RvcnMgbWF5IGhvbGQgb25lIG9yIG1vcmUgKHNwYWNlLXNlcGFyYXRlZCkgbm9kZSBwYXRocy5cblN1Y2ggYSBwYXRoIGNhbiBiZSBhIFtub2RlIG5hbWVdKCNjb21tb24uTm9kZVR5cGUubmFtZSksIG9yXG5tdWx0aXBsZSBub2RlIG5hbWVzIChvciBgKmAgd2lsZGNhcmRzKSBzZXBhcmF0ZWQgYnkgc2xhc2hcbmNoYXJhY3RlcnMsIGFzIGluIGBcIkJsb2NrL0RlY2xhcmF0aW9uL1ZhcmlhYmxlTmFtZVwiYC4gU3VjaCBhIHBhdGhcbm1hdGNoZXMgdGhlIGZpbmFsIG5vZGUgYnV0IG9ubHkgaWYgaXRzIGRpcmVjdCBwYXJlbnQgbm9kZXMgYXJlIHRoZVxub3RoZXIgbm9kZXMgbWVudGlvbmVkLiBBIGAqYCBpbiBzdWNoIGEgcGF0aCBtYXRjaGVzIGFueSBwYXJlbnQsXG5idXQgb25seSBhIHNpbmdsZSBsZXZlbFx1MjAxNHdpbGRjYXJkcyB0aGF0IG1hdGNoIG11bHRpcGxlIHBhcmVudHNcbmFyZW4ndCBzdXBwb3J0ZWQsIGJvdGggZm9yIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBMZXplclxudHJlZXMgbWFrZSBpdCByYXRoZXIgaGFyZCB0byByZWFzb24gYWJvdXQgd2hhdCB0aGV5IHdvdWxkIG1hdGNoLilcblxuQSBwYXRoIGNhbiBiZSBlbmRlZCB3aXRoIGAvLi4uYCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0YWcgYXNzaWduZWRcbnRvIHRoZSBub2RlIHNob3VsZCBhbHNvIGFwcGx5IHRvIGFsbCBjaGlsZCBub2RlcywgZXZlbiBpZiB0aGV5XG5tYXRjaCB0aGVpciBvd24gc3R5bGUgKGJ5IGRlZmF1bHQsIG9ubHkgdGhlIGlubmVybW9zdCBzdHlsZSBpc1xudXNlZCkuXG5cbldoZW4gYSBwYXRoIGVuZHMgaW4gYCFgLCBhcyBpbiBgQXR0cmlidXRlIWAsIG5vIGZ1cnRoZXIgbWF0Y2hpbmdcbmhhcHBlbnMgZm9yIHRoZSBub2RlJ3MgY2hpbGQgbm9kZXMsIGFuZCB0aGUgZW50aXJlIG5vZGUgZ2V0cyB0aGVcbmdpdmVuIHN0eWxlLlxuXG5JbiB0aGlzIG5vdGF0aW9uLCBub2RlIG5hbWVzIHRoYXQgY29udGFpbiBgL2AsIGAhYCwgYCpgLCBvciBgLi4uYFxubXVzdCBiZSBxdW90ZWQgYXMgSlNPTiBzdHJpbmdzLlxuXG5Gb3IgZXhhbXBsZTpcblxuYGBgamF2YXNjcmlwdFxucGFyc2VyLndpdGhQcm9wcyhcbiAgc3R5bGVUYWdzKHtcbiAgICAvLyBTdHlsZSBOdW1iZXIgYW5kIEJpZ051bWJlciBub2Rlc1xuICAgIFwiTnVtYmVyIEJpZ051bWJlclwiOiB0YWdzLm51bWJlcixcbiAgICAvLyBTdHlsZSBFc2NhcGUgbm9kZXMgd2hvc2UgcGFyZW50IGlzIFN0cmluZ1xuICAgIFwiU3RyaW5nL0VzY2FwZVwiOiB0YWdzLmVzY2FwZSxcbiAgICAvLyBTdHlsZSBhbnl0aGluZyBpbnNpZGUgQXR0cmlidXRlcyBub2Rlc1xuICAgIFwiQXR0cmlidXRlcyFcIjogdGFncy5tZXRhLFxuICAgIC8vIEFkZCBhIHN0eWxlIHRvIGFsbCBjb250ZW50IGluc2lkZSBJdGFsaWMgbm9kZXNcbiAgICBcIkl0YWxpYy8uLi5cIjogdGFncy5lbXBoYXNpcyxcbiAgICAvLyBTdHlsZSBJbnZhbGlkU3RyaW5nIG5vZGVzIGFzIGJvdGggYHN0cmluZ2AgYW5kIGBpbnZhbGlkYFxuICAgIFwiSW52YWxpZFN0cmluZ1wiOiBbdGFncy5zdHJpbmcsIHRhZ3MuaW52YWxpZF0sXG4gICAgLy8gU3R5bGUgdGhlIG5vZGUgbmFtZWQgXCIvXCIgYXMgcHVuY3R1YXRpb25cbiAgICAnXCIvXCInOiB0YWdzLnB1bmN0dWF0aW9uXG4gIH0pXG4pXG5gYGBcbiovXG5mdW5jdGlvbiBzdHlsZVRhZ3Moc3BlYykge1xuICAgIGxldCBieU5hbWUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IHByb3AgaW4gc3BlYykge1xuICAgICAgICBsZXQgdGFncyA9IHNwZWNbcHJvcF07XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0YWdzKSlcbiAgICAgICAgICAgIHRhZ3MgPSBbdGFnc107XG4gICAgICAgIGZvciAobGV0IHBhcnQgb2YgcHJvcC5zcGxpdChcIiBcIikpXG4gICAgICAgICAgICBpZiAocGFydCkge1xuICAgICAgICAgICAgICAgIGxldCBwaWVjZXMgPSBbXSwgbW9kZSA9IDIgLyogTW9kZS5Ob3JtYWwgKi8sIHJlc3QgPSBwYXJ0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBvcyA9IDA7Oykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdCA9PSBcIi4uLlwiICYmIHBvcyA+IDAgJiYgcG9zICsgMyA9PSBwYXJ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IDEgLyogTW9kZS5Jbmhlcml0ICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSAvXlwiKD86W15cIlxcXFxdfFxcXFwuKSo/XCJ8W15cXC8hXSsvLmV4ZWMocmVzdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBwYXRoOiBcIiArIHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICBwaWVjZXMucHVzaChtWzBdID09IFwiKlwiID8gXCJcIiA6IG1bMF1bMF0gPT0gJ1wiJyA/IEpTT04ucGFyc2UobVswXSkgOiBtWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zICs9IG1bMF0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zID09IHBhcnQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gcGFydFtwb3MrK107XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gcGFydC5sZW5ndGggJiYgbmV4dCA9PSBcIiFcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IDAgLyogTW9kZS5PcGFxdWUgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBcIi9cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBwYXRoOiBcIiArIHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICByZXN0ID0gcGFydC5zbGljZShwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IHBpZWNlcy5sZW5ndGggLSAxLCBpbm5lciA9IHBpZWNlc1tsYXN0XTtcbiAgICAgICAgICAgICAgICBpZiAoIWlubmVyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgcGF0aDogXCIgKyBwYXJ0KTtcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IG5ldyBSdWxlKHRhZ3MsIG1vZGUsIGxhc3QgPiAwID8gcGllY2VzLnNsaWNlKDAsIGxhc3QpIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgYnlOYW1lW2lubmVyXSA9IHJ1bGUuc29ydChieU5hbWVbaW5uZXJdKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ1bGVOb2RlUHJvcC5hZGQoYnlOYW1lKTtcbn1cbmNvbnN0IHJ1bGVOb2RlUHJvcCA9IG5ldyBOb2RlUHJvcCgpO1xuY2xhc3MgUnVsZSB7XG4gICAgY29uc3RydWN0b3IodGFncywgbW9kZSwgY29udGV4dCwgbmV4dCkge1xuICAgICAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLm5leHQgPSBuZXh0O1xuICAgIH1cbiAgICBnZXQgb3BhcXVlKCkgeyByZXR1cm4gdGhpcy5tb2RlID09IDAgLyogTW9kZS5PcGFxdWUgKi87IH1cbiAgICBnZXQgaW5oZXJpdCgpIHsgcmV0dXJuIHRoaXMubW9kZSA9PSAxIC8qIE1vZGUuSW5oZXJpdCAqLzsgfVxuICAgIHNvcnQob3RoZXIpIHtcbiAgICAgICAgaWYgKCFvdGhlciB8fCBvdGhlci5kZXB0aCA8IHRoaXMuZGVwdGgpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dCA9IG90aGVyO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgb3RoZXIubmV4dCA9IHRoaXMuc29ydChvdGhlci5uZXh0KTtcbiAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgIH1cbiAgICBnZXQgZGVwdGgoKSB7IHJldHVybiB0aGlzLmNvbnRleHQgPyB0aGlzLmNvbnRleHQubGVuZ3RoIDogMDsgfVxufVxuUnVsZS5lbXB0eSA9IG5ldyBSdWxlKFtdLCAyIC8qIE1vZGUuTm9ybWFsICovLCBudWxsKTtcbi8qKlxuRGVmaW5lIGEgW2hpZ2hsaWdodGVyXSgjaGlnaGxpZ2h0LkhpZ2hsaWdodGVyKSBmcm9tIGFuIGFycmF5IG9mXG50YWcvY2xhc3MgcGFpcnMuIENsYXNzZXMgYXNzb2NpYXRlZCB3aXRoIG1vcmUgc3BlY2lmaWMgdGFncyB3aWxsXG50YWtlIHByZWNlZGVuY2UuXG4qL1xuZnVuY3Rpb24gdGFnSGlnaGxpZ2h0ZXIodGFncywgb3B0aW9ucykge1xuICAgIGxldCBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IHN0eWxlIG9mIHRhZ3MpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN0eWxlLnRhZykpXG4gICAgICAgICAgICBtYXBbc3R5bGUudGFnLmlkXSA9IHN0eWxlLmNsYXNzO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBmb3IgKGxldCB0YWcgb2Ygc3R5bGUudGFnKVxuICAgICAgICAgICAgICAgIG1hcFt0YWcuaWRdID0gc3R5bGUuY2xhc3M7XG4gICAgfVxuICAgIGxldCB7IHNjb3BlLCBhbGwgPSBudWxsIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiAodGFncykgPT4ge1xuICAgICAgICAgICAgbGV0IGNscyA9IGFsbDtcbiAgICAgICAgICAgIGZvciAobGV0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3ViIG9mIHRhZy5zZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ0NsYXNzID0gbWFwW3N1Yi5pZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gY2xzID8gY2xzICsgXCIgXCIgKyB0YWdDbGFzcyA6IHRhZ0NsYXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xzO1xuICAgICAgICB9LFxuICAgICAgICBzY29wZVxuICAgIH07XG59XG5mdW5jdGlvbiBoaWdobGlnaHRUYWdzKGhpZ2hsaWdodGVycywgdGFncykge1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGZvciAobGV0IGhpZ2hsaWdodGVyIG9mIGhpZ2hsaWdodGVycykge1xuICAgICAgICBsZXQgdmFsdWUgPSBoaWdobGlnaHRlci5zdHlsZSh0YWdzKTtcbiAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID8gcmVzdWx0ICsgXCIgXCIgKyB2YWx1ZSA6IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5IaWdobGlnaHQgdGhlIGdpdmVuIFt0cmVlXSgjY29tbW9uLlRyZWUpIHdpdGggdGhlIGdpdmVuXG5baGlnaGxpZ2h0ZXJdKCNoaWdobGlnaHQuSGlnaGxpZ2h0ZXIpLiBPZnRlbiwgdGhlIGhpZ2hlci1sZXZlbFxuW2BoaWdobGlnaHRDb2RlYF0oI2hpZ2hsaWdodC5oaWdobGlnaHRDb2RlKSBmdW5jdGlvbiBpcyBlYXNpZXIgdG9cbnVzZS5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRUcmVlKHRyZWUsIGhpZ2hsaWdodGVyLCBcbi8qKlxuQXNzaWduIHN0eWxpbmcgdG8gYSByZWdpb24gb2YgdGhlIHRleHQuIFdpbGwgYmUgY2FsbGVkLCBpbiBvcmRlclxub2YgcG9zaXRpb24sIGZvciBhbnkgcmFuZ2VzIHdoZXJlIG1vcmUgdGhhbiB6ZXJvIGNsYXNzZXMgYXBwbHkuXG5gY2xhc3Nlc2AgaXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIENTUyBjbGFzc2VzLlxuKi9cbnB1dFN0eWxlLCBcbi8qKlxuVGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBoaWdobGlnaHQuXG4qL1xuZnJvbSA9IDAsIFxuLyoqXG5UaGUgZW5kIG9mIHRoZSByYW5nZS5cbiovXG50byA9IHRyZWUubGVuZ3RoKSB7XG4gICAgbGV0IGJ1aWxkZXIgPSBuZXcgSGlnaGxpZ2h0QnVpbGRlcihmcm9tLCBBcnJheS5pc0FycmF5KGhpZ2hsaWdodGVyKSA/IGhpZ2hsaWdodGVyIDogW2hpZ2hsaWdodGVyXSwgcHV0U3R5bGUpO1xuICAgIGJ1aWxkZXIuaGlnaGxpZ2h0UmFuZ2UodHJlZS5jdXJzb3IoKSwgZnJvbSwgdG8sIFwiXCIsIGJ1aWxkZXIuaGlnaGxpZ2h0ZXJzKTtcbiAgICBidWlsZGVyLmZsdXNoKHRvKTtcbn1cbi8qKlxuSGlnaGxpZ2h0IHRoZSBnaXZlbiB0cmVlIHdpdGggdGhlIGdpdmVuIGhpZ2hsaWdodGVyLCBjYWxsaW5nXG5gcHV0VGV4dGAgZm9yIGV2ZXJ5IHBpZWNlIG9mIHRleHQsIGVpdGhlciB3aXRoIGEgc2V0IG9mIGNsYXNzZXMgb3JcbndpdGggdGhlIGVtcHR5IHN0cmluZyB3aGVuIHVuc3R5bGVkLCBhbmQgYHB1dEJyZWFrYCBmb3IgZXZlcnkgbGluZVxuYnJlYWsuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0Q29kZShjb2RlLCB0cmVlLCBoaWdobGlnaHRlciwgcHV0VGV4dCwgcHV0QnJlYWssIGZyb20gPSAwLCB0byA9IGNvZGUubGVuZ3RoKSB7XG4gICAgbGV0IHBvcyA9IGZyb207XG4gICAgZnVuY3Rpb24gd3JpdGVUbyhwLCBjbGFzc2VzKSB7XG4gICAgICAgIGlmIChwIDw9IHBvcylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZm9yIChsZXQgdGV4dCA9IGNvZGUuc2xpY2UocG9zLCBwKSwgaSA9IDA7Oykge1xuICAgICAgICAgICAgbGV0IG5leHRCcmVhayA9IHRleHQuaW5kZXhPZihcIlxcblwiLCBpKTtcbiAgICAgICAgICAgIGxldCB1cHRvID0gbmV4dEJyZWFrIDwgMCA/IHRleHQubGVuZ3RoIDogbmV4dEJyZWFrO1xuICAgICAgICAgICAgaWYgKHVwdG8gPiBpKVxuICAgICAgICAgICAgICAgIHB1dFRleHQodGV4dC5zbGljZShpLCB1cHRvKSwgY2xhc3Nlcyk7XG4gICAgICAgICAgICBpZiAobmV4dEJyZWFrIDwgMClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHB1dEJyZWFrKCk7XG4gICAgICAgICAgICBpID0gbmV4dEJyZWFrICsgMTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBwO1xuICAgIH1cbiAgICBoaWdobGlnaHRUcmVlKHRyZWUsIGhpZ2hsaWdodGVyLCAoZnJvbSwgdG8sIGNsYXNzZXMpID0+IHtcbiAgICAgICAgd3JpdGVUbyhmcm9tLCBcIlwiKTtcbiAgICAgICAgd3JpdGVUbyh0bywgY2xhc3Nlcyk7XG4gICAgfSwgZnJvbSwgdG8pO1xuICAgIHdyaXRlVG8odG8sIFwiXCIpO1xufVxuY2xhc3MgSGlnaGxpZ2h0QnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoYXQsIGhpZ2hsaWdodGVycywgc3Bhbikge1xuICAgICAgICB0aGlzLmF0ID0gYXQ7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZXJzID0gaGlnaGxpZ2h0ZXJzO1xuICAgICAgICB0aGlzLnNwYW4gPSBzcGFuO1xuICAgICAgICB0aGlzLmNsYXNzID0gXCJcIjtcbiAgICB9XG4gICAgc3RhcnRTcGFuKGF0LCBjbHMpIHtcbiAgICAgICAgaWYgKGNscyAhPSB0aGlzLmNsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoKGF0KTtcbiAgICAgICAgICAgIGlmIChhdCA+IHRoaXMuYXQpXG4gICAgICAgICAgICAgICAgdGhpcy5hdCA9IGF0O1xuICAgICAgICAgICAgdGhpcy5jbGFzcyA9IGNscztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmbHVzaCh0bykge1xuICAgICAgICBpZiAodG8gPiB0aGlzLmF0ICYmIHRoaXMuY2xhc3MpXG4gICAgICAgICAgICB0aGlzLnNwYW4odGhpcy5hdCwgdG8sIHRoaXMuY2xhc3MpO1xuICAgIH1cbiAgICBoaWdobGlnaHRSYW5nZShjdXJzb3IsIGZyb20sIHRvLCBpbmhlcml0ZWRDbGFzcywgaGlnaGxpZ2h0ZXJzKSB7XG4gICAgICAgIGxldCB7IHR5cGUsIGZyb206IHN0YXJ0LCB0bzogZW5kIH0gPSBjdXJzb3I7XG4gICAgICAgIGlmIChzdGFydCA+PSB0byB8fCBlbmQgPD0gZnJvbSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHR5cGUuaXNUb3ApXG4gICAgICAgICAgICBoaWdobGlnaHRlcnMgPSB0aGlzLmhpZ2hsaWdodGVycy5maWx0ZXIoaCA9PiAhaC5zY29wZSB8fCBoLnNjb3BlKHR5cGUpKTtcbiAgICAgICAgbGV0IGNscyA9IGluaGVyaXRlZENsYXNzO1xuICAgICAgICBsZXQgcnVsZSA9IGdldFN0eWxlVGFncyhjdXJzb3IpIHx8IFJ1bGUuZW1wdHk7XG4gICAgICAgIGxldCB0YWdDbHMgPSBoaWdobGlnaHRUYWdzKGhpZ2hsaWdodGVycywgcnVsZS50YWdzKTtcbiAgICAgICAgaWYgKHRhZ0Nscykge1xuICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICBjbHMgKz0gXCIgXCI7XG4gICAgICAgICAgICBjbHMgKz0gdGFnQ2xzO1xuICAgICAgICAgICAgaWYgKHJ1bGUubW9kZSA9PSAxIC8qIE1vZGUuSW5oZXJpdCAqLylcbiAgICAgICAgICAgICAgICBpbmhlcml0ZWRDbGFzcyArPSAoaW5oZXJpdGVkQ2xhc3MgPyBcIiBcIiA6IFwiXCIpICsgdGFnQ2xzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhcnRTcGFuKE1hdGgubWF4KGZyb20sIHN0YXJ0KSwgY2xzKTtcbiAgICAgICAgaWYgKHJ1bGUub3BhcXVlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbW91bnRlZCA9IGN1cnNvci50cmVlICYmIGN1cnNvci50cmVlLnByb3AoTm9kZVByb3AubW91bnRlZCk7XG4gICAgICAgIGlmIChtb3VudGVkICYmIG1vdW50ZWQub3ZlcmxheSkge1xuICAgICAgICAgICAgbGV0IGlubmVyID0gY3Vyc29yLm5vZGUuZW50ZXIobW91bnRlZC5vdmVybGF5WzBdLmZyb20gKyBzdGFydCwgMSk7XG4gICAgICAgICAgICBsZXQgaW5uZXJIaWdobGlnaHRlcnMgPSB0aGlzLmhpZ2hsaWdodGVycy5maWx0ZXIoaCA9PiAhaC5zY29wZSB8fCBoLnNjb3BlKG1vdW50ZWQudHJlZS50eXBlKSk7XG4gICAgICAgICAgICBsZXQgaGFzQ2hpbGQgPSBjdXJzb3IuZmlyc3RDaGlsZCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IHN0YXJ0OzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBpIDwgbW91bnRlZC5vdmVybGF5Lmxlbmd0aCA/IG1vdW50ZWQub3ZlcmxheVtpXSA6IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRQb3MgPSBuZXh0ID8gbmV4dC5mcm9tICsgc3RhcnQgOiBlbmQ7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlRnJvbSA9IE1hdGgubWF4KGZyb20sIHBvcyksIHJhbmdlVG8gPSBNYXRoLm1pbih0bywgbmV4dFBvcyk7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlRnJvbSA8IHJhbmdlVG8gJiYgaGFzQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5mcm9tIDwgcmFuZ2VUbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRSYW5nZShjdXJzb3IsIHJhbmdlRnJvbSwgcmFuZ2VUbywgaW5oZXJpdGVkQ2xhc3MsIGhpZ2hsaWdodGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1pbihyYW5nZVRvLCBjdXJzb3IudG8pLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci50byA+PSBuZXh0UG9zIHx8ICFjdXJzb3IubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW5leHQgfHwgbmV4dFBvcyA+IHRvKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBwb3MgPSBuZXh0LnRvICsgc3RhcnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRSYW5nZShpbm5lci5jdXJzb3IoKSwgTWF0aC5tYXgoZnJvbSwgbmV4dC5mcm9tICsgc3RhcnQpLCBNYXRoLm1pbih0bywgcG9zKSwgXCJcIiwgaW5uZXJIaWdobGlnaHRlcnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1pbih0bywgcG9zKSwgY2xzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzQ2hpbGQpXG4gICAgICAgICAgICAgICAgY3Vyc29yLnBhcmVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1cnNvci5maXJzdENoaWxkKCkpIHtcbiAgICAgICAgICAgIGlmIChtb3VudGVkKVxuICAgICAgICAgICAgICAgIGluaGVyaXRlZENsYXNzID0gXCJcIjtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLnRvIDw9IGZyb20pXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZnJvbSA+PSB0bylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRSYW5nZShjdXJzb3IsIGZyb20sIHRvLCBpbmhlcml0ZWRDbGFzcywgaGlnaGxpZ2h0ZXJzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1pbih0bywgY3Vyc29yLnRvKSwgY2xzKTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGN1cnNvci5uZXh0U2libGluZygpKTtcbiAgICAgICAgICAgIGN1cnNvci5wYXJlbnQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuTWF0Y2ggYSBzeW50YXggbm9kZSdzIFtoaWdobGlnaHQgcnVsZXNdKCNoaWdobGlnaHQuc3R5bGVUYWdzKS4gSWZcbnRoZXJlJ3MgYSBtYXRjaCwgcmV0dXJuIGl0cyBzZXQgb2YgdGFncywgYW5kIHdoZXRoZXIgaXQgaXNcbm9wYXF1ZSAodXNlcyBhIGAhYCkgb3IgYXBwbGllcyB0byBhbGwgY2hpbGQgbm9kZXMgKGAvLi4uYCkuXG4qL1xuZnVuY3Rpb24gZ2V0U3R5bGVUYWdzKG5vZGUpIHtcbiAgICBsZXQgcnVsZSA9IG5vZGUudHlwZS5wcm9wKHJ1bGVOb2RlUHJvcCk7XG4gICAgd2hpbGUgKHJ1bGUgJiYgcnVsZS5jb250ZXh0ICYmICFub2RlLm1hdGNoQ29udGV4dChydWxlLmNvbnRleHQpKVxuICAgICAgICBydWxlID0gcnVsZS5uZXh0O1xuICAgIHJldHVybiBydWxlIHx8IG51bGw7XG59XG5jb25zdCB0ID0gVGFnLmRlZmluZTtcbmNvbnN0IGNvbW1lbnQgPSB0KCksIG5hbWUgPSB0KCksIHR5cGVOYW1lID0gdChuYW1lKSwgcHJvcGVydHlOYW1lID0gdChuYW1lKSwgbGl0ZXJhbCA9IHQoKSwgc3RyaW5nID0gdChsaXRlcmFsKSwgbnVtYmVyID0gdChsaXRlcmFsKSwgY29udGVudCA9IHQoKSwgaGVhZGluZyA9IHQoY29udGVudCksIGtleXdvcmQgPSB0KCksIG9wZXJhdG9yID0gdCgpLCBwdW5jdHVhdGlvbiA9IHQoKSwgYnJhY2tldCA9IHQocHVuY3R1YXRpb24pLCBtZXRhID0gdCgpO1xuLyoqXG5UaGUgZGVmYXVsdCBzZXQgb2YgaGlnaGxpZ2h0aW5nIFt0YWdzXSgjaGlnaGxpZ2h0LlRhZykuXG5cblRoaXMgY29sbGVjdGlvbiBpcyBoZWF2aWx5IGJpYXNlZCB0b3dhcmRzIHByb2dyYW1taW5nIGxhbmd1YWdlcyxcbmFuZCBuZWNlc3NhcmlseSBpbmNvbXBsZXRlLiBBIGZ1bGwgb250b2xvZ3kgb2Ygc3ludGFjdGljXG5jb25zdHJ1Y3RzIHdvdWxkIGZpbGwgYSBzdGFjayBvZiBib29rcywgYW5kIGJlIGltcHJhY3RpY2FsIHRvXG53cml0ZSB0aGVtZXMgZm9yLiBTbyB0cnkgdG8gbWFrZSBkbyB3aXRoIHRoaXMgc2V0LiBJZiBhbGwgZWxzZVxuZmFpbHMsIFtvcGVuIGFuXG5pc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvci5uZXh0KSB0byBwcm9wb3NlIGFcbm5ldyB0YWcsIG9yIFtkZWZpbmVdKCNoaWdobGlnaHQuVGFnXmRlZmluZSkgYSBsb2NhbCBjdXN0b20gdGFnIGZvclxueW91ciB1c2UgY2FzZS5cblxuTm90ZSB0aGF0IGl0IGlzIG5vdCBvYmxpZ2F0b3J5IHRvIGFsd2F5cyBhdHRhY2ggdGhlIG1vc3Qgc3BlY2lmaWNcbnRhZyBwb3NzaWJsZSB0byBhbiBlbGVtZW50XHUyMDE0aWYgeW91ciBncmFtbWFyIGNhbid0IGVhc2lseVxuZGlzdGluZ3Vpc2ggYSBjZXJ0YWluIHR5cGUgb2YgZWxlbWVudCAoc3VjaCBhcyBhIGxvY2FsIHZhcmlhYmxlKSxcbml0IGlzIG9rYXkgdG8gc3R5bGUgaXQgYXMgaXRzIG1vcmUgZ2VuZXJhbCB2YXJpYW50IChhIHZhcmlhYmxlKS5cblxuRm9yIHRhZ3MgdGhhdCBleHRlbmQgc29tZSBwYXJlbnQgdGFnLCB0aGUgZG9jdW1lbnRhdGlvbiBsaW5rcyB0b1xudGhlIHBhcmVudC5cbiovXG5jb25zdCB0YWdzID0ge1xuICAgIC8qKlxuICAgIEEgY29tbWVudC5cbiAgICAqL1xuICAgIGNvbW1lbnQsXG4gICAgLyoqXG4gICAgQSBsaW5lIFtjb21tZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudCkuXG4gICAgKi9cbiAgICBsaW5lQ29tbWVudDogdChjb21tZW50KSxcbiAgICAvKipcbiAgICBBIGJsb2NrIFtjb21tZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudCkuXG4gICAgKi9cbiAgICBibG9ja0NvbW1lbnQ6IHQoY29tbWVudCksXG4gICAgLyoqXG4gICAgQSBkb2N1bWVudGF0aW9uIFtjb21tZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudCkuXG4gICAgKi9cbiAgICBkb2NDb21tZW50OiB0KGNvbW1lbnQpLFxuICAgIC8qKlxuICAgIEFueSBraW5kIG9mIGlkZW50aWZpZXIuXG4gICAgKi9cbiAgICBuYW1lLFxuICAgIC8qKlxuICAgIFRoZSBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpIG9mIGEgdmFyaWFibGUuXG4gICAgKi9cbiAgICB2YXJpYWJsZU5hbWU6IHQobmFtZSksXG4gICAgLyoqXG4gICAgQSB0eXBlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkuXG4gICAgKi9cbiAgICB0eXBlTmFtZTogdHlwZU5hbWUsXG4gICAgLyoqXG4gICAgQSB0YWcgbmFtZSAoc3VidGFnIG9mIFtgdHlwZU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MudHlwZU5hbWUpKS5cbiAgICAqL1xuICAgIHRhZ05hbWU6IHQodHlwZU5hbWUpLFxuICAgIC8qKlxuICAgIEEgcHJvcGVydHkgb3IgZmllbGQgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKS5cbiAgICAqL1xuICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgIC8qKlxuICAgIEFuIGF0dHJpYnV0ZSBuYW1lIChzdWJ0YWcgb2YgW2Bwcm9wZXJ0eU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MucHJvcGVydHlOYW1lKSkuXG4gICAgKi9cbiAgICBhdHRyaWJ1dGVOYW1lOiB0KHByb3BlcnR5TmFtZSksXG4gICAgLyoqXG4gICAgVGhlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkgb2YgYSBjbGFzcy5cbiAgICAqL1xuICAgIGNsYXNzTmFtZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBBIGxhYmVsIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkuXG4gICAgKi9cbiAgICBsYWJlbE5hbWU6IHQobmFtZSksXG4gICAgLyoqXG4gICAgQSBuYW1lc3BhY2UgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKS5cbiAgICAqL1xuICAgIG5hbWVzcGFjZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBUaGUgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKSBvZiBhIG1hY3JvLlxuICAgICovXG4gICAgbWFjcm9OYW1lOiB0KG5hbWUpLFxuICAgIC8qKlxuICAgIEEgbGl0ZXJhbCB2YWx1ZS5cbiAgICAqL1xuICAgIGxpdGVyYWwsXG4gICAgLyoqXG4gICAgQSBzdHJpbmcgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIHN0cmluZyxcbiAgICAvKipcbiAgICBBIGRvY3VtZW50YXRpb24gW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykuXG4gICAgKi9cbiAgICBkb2NTdHJpbmc6IHQoc3RyaW5nKSxcbiAgICAvKipcbiAgICBBIGNoYXJhY3RlciBsaXRlcmFsIChzdWJ0YWcgb2YgW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykpLlxuICAgICovXG4gICAgY2hhcmFjdGVyOiB0KHN0cmluZyksXG4gICAgLyoqXG4gICAgQW4gYXR0cmlidXRlIHZhbHVlIChzdWJ0YWcgb2YgW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykpLlxuICAgICovXG4gICAgYXR0cmlidXRlVmFsdWU6IHQoc3RyaW5nKSxcbiAgICAvKipcbiAgICBBIG51bWJlciBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgbnVtYmVyLFxuICAgIC8qKlxuICAgIEFuIGludGVnZXIgW251bWJlcl0oI2hpZ2hsaWdodC50YWdzLm51bWJlcikgbGl0ZXJhbC5cbiAgICAqL1xuICAgIGludGVnZXI6IHQobnVtYmVyKSxcbiAgICAvKipcbiAgICBBIGZsb2F0aW5nLXBvaW50IFtudW1iZXJdKCNoaWdobGlnaHQudGFncy5udW1iZXIpIGxpdGVyYWwuXG4gICAgKi9cbiAgICBmbG9hdDogdChudW1iZXIpLFxuICAgIC8qKlxuICAgIEEgYm9vbGVhbiBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgYm9vbDogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBSZWd1bGFyIGV4cHJlc3Npb24gW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIHJlZ2V4cDogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBBbiBlc2NhcGUgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKSwgZm9yIGV4YW1wbGUgYVxuICAgIGJhY2tzbGFzaCBlc2NhcGUgaW4gYSBzdHJpbmcuXG4gICAgKi9cbiAgICBlc2NhcGU6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgQSBjb2xvciBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgY29sb3I6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgQSBVUkwgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIHVybDogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBBIGxhbmd1YWdlIGtleXdvcmQuXG4gICAgKi9cbiAgICBrZXl3b3JkLFxuICAgIC8qKlxuICAgIFRoZSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIGZvciB0aGUgc2VsZiBvciB0aGlzXG4gICAgb2JqZWN0LlxuICAgICovXG4gICAgc2VsZjogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBUaGUgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSBmb3IgbnVsbC5cbiAgICAqL1xuICAgIG51bGw6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIGRlbm90aW5nIHNvbWUgYXRvbWljIHZhbHVlLlxuICAgICovXG4gICAgYXRvbTogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgdGhhdCByZXByZXNlbnRzIGEgdW5pdC5cbiAgICAqL1xuICAgIHVuaXQ6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBtb2RpZmllciBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpLlxuICAgICovXG4gICAgbW9kaWZpZXI6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIHRoYXQgYWN0cyBhcyBhbiBvcGVyYXRvci5cbiAgICAqL1xuICAgIG9wZXJhdG9yS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIGNvbnRyb2wtZmxvdyByZWxhdGVkIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkuXG4gICAgKi9cbiAgICBjb250cm9sS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgdGhhdCBkZWZpbmVzIHNvbWV0aGluZy5cbiAgICAqL1xuICAgIGRlZmluaXRpb25LZXl3b3JkOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSByZWxhdGVkIHRvIGRlZmluaW5nIG9yXG4gICAgaW50ZXJmYWNpbmcgd2l0aCBtb2R1bGVzLlxuICAgICovXG4gICAgbW9kdWxlS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBbiBvcGVyYXRvci5cbiAgICAqL1xuICAgIG9wZXJhdG9yLFxuICAgIC8qKlxuICAgIEFuIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKSB0aGF0IGRlcmVmZXJlbmNlcyBzb21ldGhpbmcuXG4gICAgKi9cbiAgICBkZXJlZk9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBBcml0aG1ldGljLXJlbGF0ZWQgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgYXJpdGhtZXRpY09wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBMb2dpY2FsIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIGxvZ2ljT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIEJpdCBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICBiaXR3aXNlT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIENvbXBhcmlzb24gW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgY29tcGFyZU9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBbT3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikgdGhhdCB1cGRhdGVzIGl0cyBvcGVyYW5kLlxuICAgICovXG4gICAgdXBkYXRlT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIFtPcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKSB0aGF0IGRlZmluZXMgc29tZXRoaW5nLlxuICAgICovXG4gICAgZGVmaW5pdGlvbk9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBUeXBlLXJlbGF0ZWQgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgdHlwZU9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBDb250cm9sLWZsb3cgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgY29udHJvbE9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBQcm9ncmFtIG9yIG1hcmt1cCBwdW5jdHVhdGlvbi5cbiAgICAqL1xuICAgIHB1bmN0dWF0aW9uLFxuICAgIC8qKlxuICAgIFtQdW5jdHVhdGlvbl0oI2hpZ2hsaWdodC50YWdzLnB1bmN0dWF0aW9uKSB0aGF0IHNlcGFyYXRlc1xuICAgIHRoaW5ncy5cbiAgICAqL1xuICAgIHNlcGFyYXRvcjogdChwdW5jdHVhdGlvbiksXG4gICAgLyoqXG4gICAgQnJhY2tldC1zdHlsZSBbcHVuY3R1YXRpb25dKCNoaWdobGlnaHQudGFncy5wdW5jdHVhdGlvbikuXG4gICAgKi9cbiAgICBicmFja2V0LFxuICAgIC8qKlxuICAgIEFuZ2xlIFticmFja2V0c10oI2hpZ2hsaWdodC50YWdzLmJyYWNrZXQpICh1c3VhbGx5IGA8YCBhbmQgYD5gXG4gICAgdG9rZW5zKS5cbiAgICAqL1xuICAgIGFuZ2xlQnJhY2tldDogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBTcXVhcmUgW2JyYWNrZXRzXSgjaGlnaGxpZ2h0LnRhZ3MuYnJhY2tldCkgKHVzdWFsbHkgYFtgIGFuZCBgXWBcbiAgICB0b2tlbnMpLlxuICAgICovXG4gICAgc3F1YXJlQnJhY2tldDogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBQYXJlbnRoZXNlcyAodXN1YWxseSBgKGAgYW5kIGApYCB0b2tlbnMpLiBTdWJ0YWcgb2ZcbiAgICBbYnJhY2tldF0oI2hpZ2hsaWdodC50YWdzLmJyYWNrZXQpLlxuICAgICovXG4gICAgcGFyZW46IHQoYnJhY2tldCksXG4gICAgLyoqXG4gICAgQnJhY2VzICh1c3VhbGx5IGB7YCBhbmQgYH1gIHRva2VucykuIFN1YnRhZyBvZlxuICAgIFticmFja2V0XSgjaGlnaGxpZ2h0LnRhZ3MuYnJhY2tldCkuXG4gICAgKi9cbiAgICBicmFjZTogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBDb250ZW50LCBmb3IgZXhhbXBsZSBwbGFpbiB0ZXh0IGluIFhNTCBvciBtYXJrdXAgZG9jdW1lbnRzLlxuICAgICovXG4gICAgY29udGVudCxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgcmVwcmVzZW50cyBhIGhlYWRpbmcuXG4gICAgKi9cbiAgICBoZWFkaW5nLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgMSBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzE6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCAyIFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nMjogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDMgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmczOiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgNCBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzQ6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCA1IFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nNTogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDYgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmc2OiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgcHJvc2UgW2NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSBzZXBhcmF0b3IgKHN1Y2ggYXMgYSBob3Jpem9udGFsIHJ1bGUpLlxuICAgICovXG4gICAgY29udGVudFNlcGFyYXRvcjogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgcmVwcmVzZW50cyBhIGxpc3QuXG4gICAgKi9cbiAgICBsaXN0OiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCByZXByZXNlbnRzIGEgcXVvdGUuXG4gICAgKi9cbiAgICBxdW90ZTogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaXMgZW1waGFzaXplZC5cbiAgICAqL1xuICAgIGVtcGhhc2lzOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBpcyBzdHlsZWQgc3Ryb25nLlxuICAgICovXG4gICAgc3Ryb25nOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBpcyBwYXJ0IG9mIGEgbGluay5cbiAgICAqL1xuICAgIGxpbms6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IGlzIHN0eWxlZCBhcyBjb2RlIG9yXG4gICAgbW9ub3NwYWNlLlxuICAgICovXG4gICAgbW9ub3NwYWNlOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBoYXMgYSBzdHJpa2UtdGhyb3VnaFxuICAgIHN0eWxlLlxuICAgICovXG4gICAgc3RyaWtldGhyb3VnaDogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBJbnNlcnRlZCB0ZXh0IGluIGEgY2hhbmdlLXRyYWNraW5nIGZvcm1hdC5cbiAgICAqL1xuICAgIGluc2VydGVkOiB0KCksXG4gICAgLyoqXG4gICAgRGVsZXRlZCB0ZXh0LlxuICAgICovXG4gICAgZGVsZXRlZDogdCgpLFxuICAgIC8qKlxuICAgIENoYW5nZWQgdGV4dC5cbiAgICAqL1xuICAgIGNoYW5nZWQ6IHQoKSxcbiAgICAvKipcbiAgICBBbiBpbnZhbGlkIG9yIHVuc3ludGFjdGljIGVsZW1lbnQuXG4gICAgKi9cbiAgICBpbnZhbGlkOiB0KCksXG4gICAgLyoqXG4gICAgTWV0YWRhdGEgb3IgbWV0YS1pbnN0cnVjdGlvbi5cbiAgICAqL1xuICAgIG1ldGEsXG4gICAgLyoqXG4gICAgW01ldGFkYXRhXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSkgdGhhdCBhcHBsaWVzIHRvIHRoZSBlbnRpcmVcbiAgICBkb2N1bWVudC5cbiAgICAqL1xuICAgIGRvY3VtZW50TWV0YTogdChtZXRhKSxcbiAgICAvKipcbiAgICBbTWV0YWRhdGFdKCNoaWdobGlnaHQudGFncy5tZXRhKSB0aGF0IGFubm90YXRlcyBvciBhZGRzXG4gICAgYXR0cmlidXRlcyB0byBhIGdpdmVuIHN5bnRhY3RpYyBlbGVtZW50LlxuICAgICovXG4gICAgYW5ub3RhdGlvbjogdChtZXRhKSxcbiAgICAvKipcbiAgICBQcm9jZXNzaW5nIGluc3RydWN0aW9uIG9yIHByZXByb2Nlc3NvciBkaXJlY3RpdmUuIFN1YnRhZyBvZlxuICAgIFttZXRhXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSkuXG4gICAgKi9cbiAgICBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb246IHQobWV0YSksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhXG4gICAgZ2l2ZW4gZWxlbWVudCBpcyBiZWluZyBkZWZpbmVkLiBFeHBlY3RlZCB0byBiZSB1c2VkIHdpdGggdGhlXG4gICAgdmFyaW91cyBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpIHRhZ3MuXG4gICAgKi9cbiAgICBkZWZpbml0aW9uOiBUYWcuZGVmaW5lTW9kaWZpZXIoXCJkZWZpbml0aW9uXCIpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXQgaW5kaWNhdGVzIHRoYXRcbiAgICBzb21ldGhpbmcgaXMgY29uc3RhbnQuIE1vc3RseSBleHBlY3RlZCB0byBiZSB1c2VkIHdpdGhcbiAgICBbdmFyaWFibGUgbmFtZXNdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpLlxuICAgICovXG4gICAgY29uc3RhbnQ6IFRhZy5kZWZpbmVNb2RpZmllcihcImNvbnN0YW50XCIpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHVzZWQgdG8gaW5kaWNhdGUgdGhhdFxuICAgIGEgW3ZhcmlhYmxlXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKSBvciBbcHJvcGVydHlcbiAgICBuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MucHJvcGVydHlOYW1lKSBpcyBiZWluZyBjYWxsZWQgb3IgZGVmaW5lZFxuICAgIGFzIGEgZnVuY3Rpb24uXG4gICAgKi9cbiAgICBmdW5jdGlvbjogVGFnLmRlZmluZU1vZGlmaWVyKFwiZnVuY3Rpb25cIiksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdCBjYW4gYmUgYXBwbGllZCB0b1xuICAgIFtuYW1lc10oI2hpZ2hsaWdodC50YWdzLm5hbWUpIHRvIGluZGljYXRlIHRoYXQgdGhleSBiZWxvbmcgdG9cbiAgICB0aGUgbGFuZ3VhZ2UncyBzdGFuZGFyZCBlbnZpcm9ubWVudC5cbiAgICAqL1xuICAgIHN0YW5kYXJkOiBUYWcuZGVmaW5lTW9kaWZpZXIoXCJzdGFuZGFyZFwiKSxcbiAgICAvKipcbiAgICBbTW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB0aGF0IGluZGljYXRlcyBhIGdpdmVuXG4gICAgW25hbWVzXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkgaXMgbG9jYWwgdG8gc29tZSBzY29wZS5cbiAgICAqL1xuICAgIGxvY2FsOiBUYWcuZGVmaW5lTW9kaWZpZXIoXCJsb2NhbFwiKSxcbiAgICAvKipcbiAgICBBIGdlbmVyaWMgdmFyaWFudCBbbW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB0aGF0XG4gICAgY2FuIGJlIHVzZWQgdG8gdGFnIGxhbmd1YWdlLXNwZWNpZmljIGFsdGVybmF0aXZlIHZhcmlhbnRzIG9mXG4gICAgc29tZSBjb21tb24gdGFnLiBJdCBpcyByZWNvbW1lbmRlZCBmb3IgdGhlbWVzIHRvIGRlZmluZSBzcGVjaWFsXG4gICAgZm9ybXMgb2YgYXQgbGVhc3QgdGhlIFtzdHJpbmddKCNoaWdobGlnaHQudGFncy5zdHJpbmcpIGFuZFxuICAgIFt2YXJpYWJsZSBuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKSB0YWdzLCBzaW5jZSB0aG9zZVxuICAgIGNvbWUgdXAgYSBsb3QuXG4gICAgKi9cbiAgICBzcGVjaWFsOiBUYWcuZGVmaW5lTW9kaWZpZXIoXCJzcGVjaWFsXCIpXG59O1xuZm9yIChsZXQgbmFtZSBpbiB0YWdzKSB7XG4gICAgbGV0IHZhbCA9IHRhZ3NbbmFtZV07XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIFRhZylcbiAgICAgICAgdmFsLm5hbWUgPSBuYW1lO1xufVxuLyoqXG5UaGlzIGlzIGEgaGlnaGxpZ2h0ZXIgdGhhdCBhZGRzIHN0YWJsZSwgcHJlZGljdGFibGUgY2xhc3NlcyB0b1xudG9rZW5zLCBmb3Igc3R5bGluZyB3aXRoIGV4dGVybmFsIENTUy5cblxuVGhlIGZvbGxvd2luZyB0YWdzIGFyZSBtYXBwZWQgdG8gdGhlaXIgbmFtZSBwcmVmaXhlZCB3aXRoIGBcInRvay1cImBcbihmb3IgZXhhbXBsZSBgXCJ0b2stY29tbWVudFwiYCk6XG5cbiogW2BsaW5rYF0oI2hpZ2hsaWdodC50YWdzLmxpbmspXG4qIFtgaGVhZGluZ2BdKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKVxuKiBbYGVtcGhhc2lzYF0oI2hpZ2hsaWdodC50YWdzLmVtcGhhc2lzKVxuKiBbYHN0cm9uZ2BdKCNoaWdobGlnaHQudGFncy5zdHJvbmcpXG4qIFtga2V5d29yZGBdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKVxuKiBbYGF0b21gXSgjaGlnaGxpZ2h0LnRhZ3MuYXRvbSlcbiogW2Bib29sYF0oI2hpZ2hsaWdodC50YWdzLmJvb2wpXG4qIFtgdXJsYF0oI2hpZ2hsaWdodC50YWdzLnVybClcbiogW2BsYWJlbE5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MubGFiZWxOYW1lKVxuKiBbYGluc2VydGVkYF0oI2hpZ2hsaWdodC50YWdzLmluc2VydGVkKVxuKiBbYGRlbGV0ZWRgXSgjaGlnaGxpZ2h0LnRhZ3MuZGVsZXRlZClcbiogW2BsaXRlcmFsYF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpXG4qIFtgc3RyaW5nYF0oI2hpZ2hsaWdodC50YWdzLnN0cmluZylcbiogW2BudW1iZXJgXSgjaGlnaGxpZ2h0LnRhZ3MubnVtYmVyKVxuKiBbYHZhcmlhYmxlTmFtZWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4qIFtgdHlwZU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MudHlwZU5hbWUpXG4qIFtgbmFtZXNwYWNlYF0oI2hpZ2hsaWdodC50YWdzLm5hbWVzcGFjZSlcbiogW2BjbGFzc05hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MuY2xhc3NOYW1lKVxuKiBbYG1hY3JvTmFtZWBdKCNoaWdobGlnaHQudGFncy5tYWNyb05hbWUpXG4qIFtgcHJvcGVydHlOYW1lYF0oI2hpZ2hsaWdodC50YWdzLnByb3BlcnR5TmFtZSlcbiogW2BvcGVyYXRvcmBdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcilcbiogW2Bjb21tZW50YF0oI2hpZ2hsaWdodC50YWdzLmNvbW1lbnQpXG4qIFtgbWV0YWBdKCNoaWdobGlnaHQudGFncy5tZXRhKVxuKiBbYHB1bmN0dWF0aW9uYF0oI2hpZ2hsaWdodC50YWdzLnB1bmN0dWF0aW9uKVxuKiBbYGludmFsaWRgXSgjaGlnaGxpZ2h0LnRhZ3MuaW52YWxpZClcblxuSW4gYWRkaXRpb24sIHRoZXNlIG1hcHBpbmdzIGFyZSBwcm92aWRlZDpcblxuKiBbYHJlZ2V4cGBdKCNoaWdobGlnaHQudGFncy5yZWdleHApLFxuICBbYGVzY2FwZWBdKCNoaWdobGlnaHQudGFncy5lc2NhcGUpLCBhbmRcbiAgW2BzcGVjaWFsYF0oI2hpZ2hsaWdodC50YWdzLnNwZWNpYWwpW2Aoc3RyaW5nKWBdKCNoaWdobGlnaHQudGFncy5zdHJpbmcpXG4gIGFyZSBtYXBwZWQgdG8gYFwidG9rLXN0cmluZzJcImBcbiogW2BzcGVjaWFsYF0oI2hpZ2hsaWdodC50YWdzLnNwZWNpYWwpW2AodmFyaWFibGVOYW1lKWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4gIHRvIGBcInRvay12YXJpYWJsZU5hbWUyXCJgXG4qIFtgbG9jYWxgXSgjaGlnaGxpZ2h0LnRhZ3MubG9jYWwpW2AodmFyaWFibGVOYW1lKWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4gIHRvIGBcInRvay12YXJpYWJsZU5hbWUgdG9rLWxvY2FsXCJgXG4qIFtgZGVmaW5pdGlvbmBdKCNoaWdobGlnaHQudGFncy5kZWZpbml0aW9uKVtgKHZhcmlhYmxlTmFtZSlgXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKVxuICB0byBgXCJ0b2stdmFyaWFibGVOYW1lIHRvay1kZWZpbml0aW9uXCJgXG4qIFtgZGVmaW5pdGlvbmBdKCNoaWdobGlnaHQudGFncy5kZWZpbml0aW9uKVtgKHByb3BlcnR5TmFtZSlgXSgjaGlnaGxpZ2h0LnRhZ3MucHJvcGVydHlOYW1lKVxuICB0byBgXCJ0b2stcHJvcGVydHlOYW1lIHRvay1kZWZpbml0aW9uXCJgXG4qL1xuY29uc3QgY2xhc3NIaWdobGlnaHRlciA9IHRhZ0hpZ2hsaWdodGVyKFtcbiAgICB7IHRhZzogdGFncy5saW5rLCBjbGFzczogXCJ0b2stbGlua1wiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaGVhZGluZywgY2xhc3M6IFwidG9rLWhlYWRpbmdcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmVtcGhhc2lzLCBjbGFzczogXCJ0b2stZW1waGFzaXNcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnN0cm9uZywgY2xhc3M6IFwidG9rLXN0cm9uZ1wiIH0sXG4gICAgeyB0YWc6IHRhZ3Mua2V5d29yZCwgY2xhc3M6IFwidG9rLWtleXdvcmRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmF0b20sIGNsYXNzOiBcInRvay1hdG9tXCIgfSxcbiAgICB7IHRhZzogdGFncy5ib29sLCBjbGFzczogXCJ0b2stYm9vbFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MudXJsLCBjbGFzczogXCJ0b2stdXJsXCIgfSxcbiAgICB7IHRhZzogdGFncy5sYWJlbE5hbWUsIGNsYXNzOiBcInRvay1sYWJlbE5hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmluc2VydGVkLCBjbGFzczogXCJ0b2staW5zZXJ0ZWRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmRlbGV0ZWQsIGNsYXNzOiBcInRvay1kZWxldGVkXCIgfSxcbiAgICB7IHRhZzogdGFncy5saXRlcmFsLCBjbGFzczogXCJ0b2stbGl0ZXJhbFwiIH0sXG4gICAgeyB0YWc6IHRhZ3Muc3RyaW5nLCBjbGFzczogXCJ0b2stc3RyaW5nXCIgfSxcbiAgICB7IHRhZzogdGFncy5udW1iZXIsIGNsYXNzOiBcInRvay1udW1iZXJcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5yZWdleHAsIHRhZ3MuZXNjYXBlLCB0YWdzLnNwZWNpYWwodGFncy5zdHJpbmcpXSwgY2xhc3M6IFwidG9rLXN0cmluZzJcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnZhcmlhYmxlTmFtZSwgY2xhc3M6IFwidG9rLXZhcmlhYmxlTmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubG9jYWwodGFncy52YXJpYWJsZU5hbWUpLCBjbGFzczogXCJ0b2stdmFyaWFibGVOYW1lIHRvay1sb2NhbFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZGVmaW5pdGlvbih0YWdzLnZhcmlhYmxlTmFtZSksIGNsYXNzOiBcInRvay12YXJpYWJsZU5hbWUgdG9rLWRlZmluaXRpb25cIiB9LFxuICAgIHsgdGFnOiB0YWdzLnNwZWNpYWwodGFncy52YXJpYWJsZU5hbWUpLCBjbGFzczogXCJ0b2stdmFyaWFibGVOYW1lMlwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZGVmaW5pdGlvbih0YWdzLnByb3BlcnR5TmFtZSksIGNsYXNzOiBcInRvay1wcm9wZXJ0eU5hbWUgdG9rLWRlZmluaXRpb25cIiB9LFxuICAgIHsgdGFnOiB0YWdzLnR5cGVOYW1lLCBjbGFzczogXCJ0b2stdHlwZU5hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm5hbWVzcGFjZSwgY2xhc3M6IFwidG9rLW5hbWVzcGFjZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuY2xhc3NOYW1lLCBjbGFzczogXCJ0b2stY2xhc3NOYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5tYWNyb05hbWUsIGNsYXNzOiBcInRvay1tYWNyb05hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnByb3BlcnR5TmFtZSwgY2xhc3M6IFwidG9rLXByb3BlcnR5TmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3Mub3BlcmF0b3IsIGNsYXNzOiBcInRvay1vcGVyYXRvclwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuY29tbWVudCwgY2xhc3M6IFwidG9rLWNvbW1lbnRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm1ldGEsIGNsYXNzOiBcInRvay1tZXRhXCIgfSxcbiAgICB7IHRhZzogdGFncy5pbnZhbGlkLCBjbGFzczogXCJ0b2staW52YWxpZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MucHVuY3R1YXRpb24sIGNsYXNzOiBcInRvay1wdW5jdHVhdGlvblwiIH1cbl0pO1xuXG5leHBvcnQgeyBUYWcsIGNsYXNzSGlnaGxpZ2h0ZXIsIGdldFN0eWxlVGFncywgaGlnaGxpZ2h0Q29kZSwgaGlnaGxpZ2h0VHJlZSwgc3R5bGVUYWdzLCB0YWdIaWdobGlnaHRlciwgdGFncyB9O1xuIiwgImltcG9ydCB7IE5vZGVQcm9wLCBJdGVyTW9kZSwgVHJlZSwgVHJlZUZyYWdtZW50LCBQYXJzZXIsIE5vZGVUeXBlLCBOb2RlU2V0IH0gZnJvbSAnQGxlemVyL2NvbW1vbic7XG5pbXBvcnQgeyBTdGF0ZUVmZmVjdCwgU3RhdGVGaWVsZCwgRmFjZXQsIEVkaXRvclN0YXRlLCBjb3VudENvbHVtbiwgY29tYmluZUNvbmZpZywgUmFuZ2VTZXQsIFJhbmdlU2V0QnVpbGRlciwgUHJlYyB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IFZpZXdQbHVnaW4sIGxvZ0V4Y2VwdGlvbiwgRWRpdG9yVmlldywgRGVjb3JhdGlvbiwgV2lkZ2V0VHlwZSwgZ3V0dGVyLCBHdXR0ZXJNYXJrZXIsIERpcmVjdGlvbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xuaW1wb3J0IHsgdGFncywgdGFnSGlnaGxpZ2h0ZXIsIGhpZ2hsaWdodFRyZWUgfSBmcm9tICdAbGV6ZXIvaGlnaGxpZ2h0JztcbmltcG9ydCB7IFN0eWxlTW9kdWxlIH0gZnJvbSAnc3R5bGUtbW9kJztcblxudmFyIF9hO1xuLyoqXG5Ob2RlIHByb3Agc3RvcmVkIGluIGEgcGFyc2VyJ3MgdG9wIHN5bnRheCBub2RlIHRvIHByb3ZpZGUgdGhlXG5mYWNldCB0aGF0IHN0b3JlcyBsYW5ndWFnZS1zcGVjaWZpYyBkYXRhIGZvciB0aGF0IGxhbmd1YWdlLlxuKi9cbmNvbnN0IGxhbmd1YWdlRGF0YVByb3AgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG4vKipcbkhlbHBlciBmdW5jdGlvbiB0byBkZWZpbmUgYSBmYWNldCAodG8gYmUgYWRkZWQgdG8gdGhlIHRvcCBzeW50YXhcbm5vZGUocykgZm9yIGEgbGFuZ3VhZ2UgdmlhXG5bYGxhbmd1YWdlRGF0YVByb3BgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmxhbmd1YWdlRGF0YVByb3ApKSwgdGhhdCB3aWxsIGJlXG51c2VkIHRvIGFzc29jaWF0ZSBsYW5ndWFnZSBkYXRhIHdpdGggdGhlIGxhbmd1YWdlLiBZb3VcbnByb2JhYmx5IG9ubHkgbmVlZCB0aGlzIHdoZW4gc3ViY2xhc3NpbmdcbltgTGFuZ3VhZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKS5cbiovXG5mdW5jdGlvbiBkZWZpbmVMYW5ndWFnZUZhY2V0KGJhc2VEYXRhKSB7XG4gICAgcmV0dXJuIEZhY2V0LmRlZmluZSh7XG4gICAgICAgIGNvbWJpbmU6IGJhc2VEYXRhID8gdmFsdWVzID0+IHZhbHVlcy5jb25jYXQoYmFzZURhdGEpIDogdW5kZWZpbmVkXG4gICAgfSk7XG59XG4vKipcblN5bnRheCBub2RlIHByb3AgdXNlZCB0byByZWdpc3RlciBzdWJsYW5ndWFnZXMuIFNob3VsZCBiZSBhZGRlZCB0b1xudGhlIHRvcCBsZXZlbCBub2RlIHR5cGUgZm9yIHRoZSBsYW5ndWFnZS5cbiovXG5jb25zdCBzdWJsYW5ndWFnZVByb3AgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG4vKipcbkEgbGFuZ3VhZ2Ugb2JqZWN0IG1hbmFnZXMgcGFyc2luZyBhbmQgcGVyLWxhbmd1YWdlXG5bbWV0YWRhdGFdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhQXQpLiBQYXJzZSBkYXRhIGlzXG5tYW5hZ2VkIGFzIGEgW0xlemVyXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0KSB0cmVlLiBUaGUgY2xhc3NcbmNhbiBiZSB1c2VkIGRpcmVjdGx5LCB2aWEgdGhlIFtgTFJMYW5ndWFnZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTFJMYW5ndWFnZSlcbnN1YmNsYXNzIGZvciBbTGV6ZXJdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvKSBMUiBwYXJzZXJzLCBvclxudmlhIHRoZSBbYFN0cmVhbUxhbmd1YWdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5TdHJlYW1MYW5ndWFnZSkgc3ViY2xhc3NcbmZvciBzdHJlYW0gcGFyc2Vycy5cbiovXG5jbGFzcyBMYW5ndWFnZSB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgbGFuZ3VhZ2Ugb2JqZWN0LiBJZiB5b3UgbmVlZCB0byBpbnZva2UgdGhpc1xuICAgIGRpcmVjdGx5LCBmaXJzdCBkZWZpbmUgYSBkYXRhIGZhY2V0IHdpdGhcbiAgICBbYGRlZmluZUxhbmd1YWdlRmFjZXRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmRlZmluZUxhbmd1YWdlRmFjZXQpLCBhbmQgdGhlblxuICAgIGNvbmZpZ3VyZSB5b3VyIHBhcnNlciB0byBbYXR0YWNoXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmxhbmd1YWdlRGF0YVByb3ApIGl0XG4gICAgdG8gdGhlIGxhbmd1YWdlJ3Mgb3V0ZXIgc3ludGF4IG5vZGUuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgW2xhbmd1YWdlIGRhdGFdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhQXQpIGZhY2V0XG4gICAgdXNlZCBmb3IgdGhpcyBsYW5ndWFnZS5cbiAgICAqL1xuICAgIGRhdGEsIHBhcnNlciwgZXh0cmFFeHRlbnNpb25zID0gW10sIFxuICAgIC8qKlxuICAgIEEgbGFuZ3VhZ2UgbmFtZS5cbiAgICAqL1xuICAgIG5hbWUgPSBcIlwiKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIC8vIEtsdWRnZSB0byBkZWZpbmUgRWRpdG9yU3RhdGUudHJlZSBhcyBhIGRlYnVnZ2luZyBoZWxwZXIsXG4gICAgICAgIC8vIHdpdGhvdXQgdGhlIEVkaXRvclN0YXRlIHBhY2thZ2UgYWN0dWFsbHkga25vd2luZyBhYm91dFxuICAgICAgICAvLyBsYW5ndWFnZXMgYW5kIGxlemVyIHRyZWVzLlxuICAgICAgICBpZiAoIUVkaXRvclN0YXRlLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShcInRyZWVcIikpXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRWRpdG9yU3RhdGUucHJvdG90eXBlLCBcInRyZWVcIiwgeyBnZXQoKSB7IHJldHVybiBzeW50YXhUcmVlKHRoaXMpOyB9IH0pO1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5leHRlbnNpb24gPSBbXG4gICAgICAgICAgICBsYW5ndWFnZS5vZih0aGlzKSxcbiAgICAgICAgICAgIEVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YS5vZigoc3RhdGUsIHBvcywgc2lkZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0b3AgPSB0b3BOb2RlQXQoc3RhdGUsIHBvcywgc2lkZSksIGRhdGEgPSB0b3AudHlwZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgIGxldCBiYXNlID0gc3RhdGUuZmFjZXQoZGF0YSksIHN1YiA9IHRvcC50eXBlLnByb3Aoc3VibGFuZ3VhZ2VQcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAoc3ViKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbm5lck5vZGUgPSB0b3AucmVzb2x2ZShwb3MgLSB0b3AuZnJvbSwgc2lkZSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN1Ymxhbmcgb2Ygc3ViKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmxhbmcudGVzdChpbm5lck5vZGUsIHN0YXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gc3RhdGUuZmFjZXQoc3VibGFuZy5mYWNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YmxhbmcudHlwZSA9PSBcInJlcGxhY2VcIiA/IGRhdGEgOiBkYXRhLmNvbmNhdChiYXNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgICAgICB9KVxuICAgICAgICBdLmNvbmNhdChleHRyYUV4dGVuc2lvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBRdWVyeSB3aGV0aGVyIHRoaXMgbGFuZ3VhZ2UgaXMgYWN0aXZlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGlzQWN0aXZlQXQoc3RhdGUsIHBvcywgc2lkZSA9IC0xKSB7XG4gICAgICAgIHJldHVybiB0b3BOb2RlQXQoc3RhdGUsIHBvcywgc2lkZSkudHlwZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHRoaXMuZGF0YTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZG9jdW1lbnQgcmVnaW9ucyB0aGF0IHdlcmUgcGFyc2VkIHVzaW5nIHRoaXMgbGFuZ3VhZ2UuXG4gICAgVGhlIHJldHVybmVkIHJlZ2lvbnMgd2lsbCBfaW5jbHVkZV8gYW55IG5lc3RlZCBsYW5ndWFnZXMgcm9vdGVkXG4gICAgaW4gdGhpcyBsYW5ndWFnZSwgd2hlbiB0aG9zZSBleGlzdC5cbiAgICAqL1xuICAgIGZpbmRSZWdpb25zKHN0YXRlKSB7XG4gICAgICAgIGxldCBsYW5nID0gc3RhdGUuZmFjZXQobGFuZ3VhZ2UpO1xuICAgICAgICBpZiAoKGxhbmcgPT09IG51bGwgfHwgbGFuZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGFuZy5kYXRhKSA9PSB0aGlzLmRhdGEpXG4gICAgICAgICAgICByZXR1cm4gW3sgZnJvbTogMCwgdG86IHN0YXRlLmRvYy5sZW5ndGggfV07XG4gICAgICAgIGlmICghbGFuZyB8fCAhbGFuZy5hbGxvd3NOZXN0aW5nKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGxldCBleHBsb3JlID0gKHRyZWUsIGZyb20pID0+IHtcbiAgICAgICAgICAgIGlmICh0cmVlLnByb3AobGFuZ3VhZ2VEYXRhUHJvcCkgPT0gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBmcm9tLCB0bzogZnJvbSArIHRyZWUubGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBtb3VudCA9IHRyZWUucHJvcChOb2RlUHJvcC5tb3VudGVkKTtcbiAgICAgICAgICAgIGlmIChtb3VudCkge1xuICAgICAgICAgICAgICAgIGlmIChtb3VudC50cmVlLnByb3AobGFuZ3VhZ2VEYXRhUHJvcCkgPT0gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3VudC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciBvZiBtb3VudC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgZnJvbTogci5mcm9tICsgZnJvbSwgdG86IHIudG8gKyBmcm9tIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGZyb206IGZyb20sIHRvOiBmcm9tICsgdHJlZS5sZW5ndGggfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobW91bnQub3ZlcmxheSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHJlc3VsdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGV4cGxvcmUobW91bnQudHJlZSwgbW91bnQub3ZlcmxheVswXS5mcm9tICsgZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gc2l6ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyZWUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2ggPSB0cmVlLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaCBpbnN0YW5jZW9mIFRyZWUpXG4gICAgICAgICAgICAgICAgICAgIGV4cGxvcmUoY2gsIHRyZWUucG9zaXRpb25zW2ldICsgZnJvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGV4cGxvcmUoc3ludGF4VHJlZShzdGF0ZSksIDApO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGxhbmd1YWdlIGFsbG93cyBuZXN0ZWQgbGFuZ3VhZ2VzLiBUaGVcbiAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZS5cbiAgICAqL1xuICAgIGdldCBhbGxvd3NOZXN0aW5nKCkgeyByZXR1cm4gdHJ1ZTsgfVxufVxuLyoqXG5AaW50ZXJuYWxcbiovXG5MYW5ndWFnZS5zZXRTdGF0ZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbmZ1bmN0aW9uIHRvcE5vZGVBdChzdGF0ZSwgcG9zLCBzaWRlKSB7XG4gICAgbGV0IHRvcExhbmcgPSBzdGF0ZS5mYWNldChsYW5ndWFnZSksIHRyZWUgPSBzeW50YXhUcmVlKHN0YXRlKS50b3BOb2RlO1xuICAgIGlmICghdG9wTGFuZyB8fCB0b3BMYW5nLmFsbG93c05lc3RpbmcpIHtcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IHRyZWU7IG5vZGU7IG5vZGUgPSBub2RlLmVudGVyKHBvcywgc2lkZSwgSXRlck1vZGUuRXhjbHVkZUJ1ZmZlcnMpKVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5pc1RvcClcbiAgICAgICAgICAgICAgICB0cmVlID0gbm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHRyZWU7XG59XG4vKipcbkEgc3ViY2xhc3Mgb2YgW2BMYW5ndWFnZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2UpIGZvciB1c2Ugd2l0aCBMZXplclxuW0xSIHBhcnNlcnNdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYjbHIuTFJQYXJzZXIpXG5wYXJzZXJzLlxuKi9cbmNsYXNzIExSTGFuZ3VhZ2UgZXh0ZW5kcyBMYW5ndWFnZSB7XG4gICAgY29uc3RydWN0b3IoZGF0YSwgcGFyc2VyLCBuYW1lKSB7XG4gICAgICAgIHN1cGVyKGRhdGEsIHBhcnNlciwgW10sIG5hbWUpO1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbGFuZ3VhZ2UgZnJvbSBhIHBhcnNlci5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlYykge1xuICAgICAgICBsZXQgZGF0YSA9IGRlZmluZUxhbmd1YWdlRmFjZXQoc3BlYy5sYW5ndWFnZURhdGEpO1xuICAgICAgICByZXR1cm4gbmV3IExSTGFuZ3VhZ2UoZGF0YSwgc3BlYy5wYXJzZXIuY29uZmlndXJlKHtcbiAgICAgICAgICAgIHByb3BzOiBbbGFuZ3VhZ2VEYXRhUHJvcC5hZGQodHlwZSA9PiB0eXBlLmlzVG9wID8gZGF0YSA6IHVuZGVmaW5lZCldXG4gICAgICAgIH0pLCBzcGVjLm5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBsYW5ndWFnZSB3aXRoIGEgcmVjb25maWd1cmVkXG4gICAgdmVyc2lvbiBvZiBpdHMgcGFyc2VyIGFuZCBvcHRpb25hbGx5IGEgbmV3IG5hbWUuXG4gICAgKi9cbiAgICBjb25maWd1cmUob3B0aW9ucywgbmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IExSTGFuZ3VhZ2UodGhpcy5kYXRhLCB0aGlzLnBhcnNlci5jb25maWd1cmUob3B0aW9ucyksIG5hbWUgfHwgdGhpcy5uYW1lKTtcbiAgICB9XG4gICAgZ2V0IGFsbG93c05lc3RpbmcoKSB7IHJldHVybiB0aGlzLnBhcnNlci5oYXNXcmFwcGVycygpOyB9XG59XG4vKipcbkdldCB0aGUgc3ludGF4IHRyZWUgZm9yIGEgc3RhdGUsIHdoaWNoIGlzIHRoZSBjdXJyZW50IChwb3NzaWJseVxuaW5jb21wbGV0ZSkgcGFyc2UgdHJlZSBvZiB0aGUgYWN0aXZlXG5bbGFuZ3VhZ2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2UpLCBvciB0aGUgZW1wdHkgdHJlZSBpZiB0aGVyZSBpcyBub1xubGFuZ3VhZ2UgYXZhaWxhYmxlLlxuKi9cbmZ1bmN0aW9uIHN5bnRheFRyZWUoc3RhdGUpIHtcbiAgICBsZXQgZmllbGQgPSBzdGF0ZS5maWVsZChMYW5ndWFnZS5zdGF0ZSwgZmFsc2UpO1xuICAgIHJldHVybiBmaWVsZCA/IGZpZWxkLnRyZWUgOiBUcmVlLmVtcHR5O1xufVxuLyoqXG5UcnkgdG8gZ2V0IGEgcGFyc2UgdHJlZSB0aGF0IHNwYW5zIGF0IGxlYXN0IHVwIHRvIGB1cHRvYC4gVGhlXG5tZXRob2Qgd2lsbCBkbyBhdCBtb3N0IGB0aW1lb3V0YCBtaWxsaXNlY29uZHMgb2Ygd29yayB0byBwYXJzZVxudXAgdG8gdGhhdCBwb2ludCBpZiB0aGUgdHJlZSBpc24ndCBhbHJlYWR5IGF2YWlsYWJsZS5cbiovXG5mdW5jdGlvbiBlbnN1cmVTeW50YXhUcmVlKHN0YXRlLCB1cHRvLCB0aW1lb3V0ID0gNTApIHtcbiAgICB2YXIgX2E7XG4gICAgbGV0IHBhcnNlID0gKF9hID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUsIGZhbHNlKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbnRleHQ7XG4gICAgaWYgKCFwYXJzZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IG9sZFZpZXBvcnQgPSBwYXJzZS52aWV3cG9ydDtcbiAgICBwYXJzZS51cGRhdGVWaWV3cG9ydCh7IGZyb206IDAsIHRvOiB1cHRvIH0pO1xuICAgIGxldCByZXN1bHQgPSBwYXJzZS5pc0RvbmUodXB0bykgfHwgcGFyc2Uud29yayh0aW1lb3V0LCB1cHRvKSA/IHBhcnNlLnRyZWUgOiBudWxsO1xuICAgIHBhcnNlLnVwZGF0ZVZpZXdwb3J0KG9sZFZpZXBvcnQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcblF1ZXJpZXMgd2hldGhlciB0aGVyZSBpcyBhIGZ1bGwgc3ludGF4IHRyZWUgYXZhaWxhYmxlIHVwIHRvIHRoZVxuZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uIElmIHRoZXJlIGlzbid0LCB0aGUgYmFja2dyb3VuZCBwYXJzZVxucHJvY2VzcyBfbWlnaHRfIHN0aWxsIGJlIHdvcmtpbmcgYW5kIHVwZGF0ZSB0aGUgdHJlZSBmdXJ0aGVyLCBidXRcbnRoZXJlIGlzIG5vIGd1YXJhbnRlZSBvZiB0aGF0XHUyMDE0dGhlIHBhcnNlciB3aWxsIFtzdG9wXG53b3JraW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLnN5bnRheFBhcnNlclJ1bm5pbmcpIHdoZW4gaXQgaGFzIHNwZW50IGFcbmNlcnRhaW4gYW1vdW50IG9mIHRpbWUgb3IgaGFzIG1vdmVkIGJleW9uZCB0aGUgdmlzaWJsZSB2aWV3cG9ydC5cbkFsd2F5cyByZXR1cm5zIGZhbHNlIGlmIG5vIGxhbmd1YWdlIGhhcyBiZWVuIGVuYWJsZWQuXG4qL1xuZnVuY3Rpb24gc3ludGF4VHJlZUF2YWlsYWJsZShzdGF0ZSwgdXB0byA9IHN0YXRlLmRvYy5sZW5ndGgpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuICgoX2EgPSBzdGF0ZS5maWVsZChMYW5ndWFnZS5zdGF0ZSwgZmFsc2UpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29udGV4dC5pc0RvbmUodXB0bykpIHx8IGZhbHNlO1xufVxuLyoqXG5Nb3ZlIHBhcnNpbmcgZm9yd2FyZCwgYW5kIHVwZGF0ZSB0aGUgZWRpdG9yIHN0YXRlIGFmdGVyd2FyZHMgdG9cbnJlZmxlY3QgdGhlIG5ldyB0cmVlLiBXaWxsIHdvcmsgZm9yIGF0IG1vc3QgYHRpbWVvdXRgXG5taWxsaXNlY29uZHMuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFyc2VyIG1hbmFnZWQgZ2V0IHRvIHRoZSBnaXZlblxucG9zaXRpb24gaW4gdGhhdCB0aW1lLlxuKi9cbmZ1bmN0aW9uIGZvcmNlUGFyc2luZyh2aWV3LCB1cHRvID0gdmlldy52aWV3cG9ydC50bywgdGltZW91dCA9IDEwMCkge1xuICAgIGxldCBzdWNjZXNzID0gZW5zdXJlU3ludGF4VHJlZSh2aWV3LnN0YXRlLCB1cHRvLCB0aW1lb3V0KTtcbiAgICBpZiAoc3VjY2VzcyAhPSBzeW50YXhUcmVlKHZpZXcuc3RhdGUpKVxuICAgICAgICB2aWV3LmRpc3BhdGNoKHt9KTtcbiAgICByZXR1cm4gISFzdWNjZXNzO1xufVxuLyoqXG5UZWxscyB5b3Ugd2hldGhlciB0aGUgbGFuZ3VhZ2UgcGFyc2VyIGlzIHBsYW5uaW5nIHRvIGRvIG1vcmVcbnBhcnNpbmcgd29yayAoaW4gYSBgcmVxdWVzdElkbGVDYWxsYmFja2AgcHNldWRvLXRocmVhZCkgb3IgaGFzXG5zdG9wcGVkIHJ1bm5pbmcsIGVpdGhlciBiZWNhdXNlIGl0IHBhcnNlZCB0aGUgZW50aXJlIGRvY3VtZW50LFxuYmVjYXVzZSBpdCBzcGVudCB0b28gbXVjaCB0aW1lIGFuZCB3YXMgY3V0IG9mZiwgb3IgYmVjYXVzZSB0aGVyZVxuaXMgbm8gbGFuZ3VhZ2UgcGFyc2VyIGVuYWJsZWQuXG4qL1xuZnVuY3Rpb24gc3ludGF4UGFyc2VyUnVubmluZyh2aWV3KSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoKF9hID0gdmlldy5wbHVnaW4ocGFyc2VXb3JrZXIpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNXb3JraW5nKCkpIHx8IGZhbHNlO1xufVxuLyoqXG5MZXplci1zdHlsZVxuW2BJbnB1dGBdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYjY29tbW9uLklucHV0KVxub2JqZWN0IGZvciBhIFtgVGV4dGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVGV4dCkgb2JqZWN0LlxuKi9cbmNsYXNzIERvY0lucHV0IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW5wdXQgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZG9jdW1lbnQuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihkb2MpIHtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMuY3Vyc29yUG9zID0gMDtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSBcIlwiO1xuICAgICAgICB0aGlzLmN1cnNvciA9IGRvYy5pdGVyKCk7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLmRvYy5sZW5ndGg7IH1cbiAgICBzeW5jVG8ocG9zKSB7XG4gICAgICAgIHRoaXMuc3RyaW5nID0gdGhpcy5jdXJzb3IubmV4dChwb3MgLSB0aGlzLmN1cnNvclBvcykudmFsdWU7XG4gICAgICAgIHRoaXMuY3Vyc29yUG9zID0gcG9zICsgdGhpcy5zdHJpbmcubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJzb3JQb3MgLSB0aGlzLnN0cmluZy5sZW5ndGg7XG4gICAgfVxuICAgIGNodW5rKHBvcykge1xuICAgICAgICB0aGlzLnN5bmNUbyhwb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmc7XG4gICAgfVxuICAgIGdldCBsaW5lQ2h1bmtzKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIHJlYWQoZnJvbSwgdG8pIHtcbiAgICAgICAgbGV0IHN0cmluZ1N0YXJ0ID0gdGhpcy5jdXJzb3JQb3MgLSB0aGlzLnN0cmluZy5sZW5ndGg7XG4gICAgICAgIGlmIChmcm9tIDwgc3RyaW5nU3RhcnQgfHwgdG8gPj0gdGhpcy5jdXJzb3JQb3MpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kb2Muc2xpY2VTdHJpbmcoZnJvbSwgdG8pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcuc2xpY2UoZnJvbSAtIHN0cmluZ1N0YXJ0LCB0byAtIHN0cmluZ1N0YXJ0KTtcbiAgICB9XG59XG5sZXQgY3VycmVudENvbnRleHQgPSBudWxsO1xuLyoqXG5BIHBhcnNlIGNvbnRleHQgcHJvdmlkZWQgdG8gcGFyc2VycyB3b3JraW5nIG9uIHRoZSBlZGl0b3IgY29udGVudC5cbiovXG5jbGFzcyBQYXJzZUNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlciwgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgc3RhdGUsIFxuICAgIC8qKlxuICAgIFRyZWUgZnJhZ21lbnRzIHRoYXQgY2FuIGJlIHJldXNlZCBieSBpbmNyZW1lbnRhbCByZS1wYXJzZXMuXG4gICAgKi9cbiAgICBmcmFnbWVudHMgPSBbXSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0cmVlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRyZWVMZW4sIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IGVkaXRvciB2aWV3cG9ydCAob3Igc29tZSBvdmVyYXBwcm94aW1hdGlvblxuICAgIHRoZXJlb2YpLiBJbnRlbmRlZCB0byBiZSB1c2VkIGZvciBvcHBvcnR1bmlzdGljYWxseSBhdm9pZGluZ1xuICAgIHdvcmsgKGluIHdoaWNoIGNhc2VcbiAgICBbYHNraXBVbnRpbEluVmlld2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuUGFyc2VDb250ZXh0LnNraXBVbnRpbEluVmlldylcbiAgICBzaG91bGQgYmUgY2FsbGVkIHRvIG1ha2Ugc3VyZSB0aGUgcGFyc2VyIGlzIHJlc3RhcnRlZCB3aGVuIHRoZVxuICAgIHNraXBwZWQgcmVnaW9uIGJlY29tZXMgdmlzaWJsZSkuXG4gICAgKi9cbiAgICB2aWV3cG9ydCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBza2lwcGVkLCBcbiAgICAvKipcbiAgICBUaGlzIGlzIHdoZXJlIHNraXBwaW5nIHBhcnNlcnMgY2FuIHJlZ2lzdGVyIGEgcHJvbWlzZSB0aGF0LFxuICAgIHdoZW4gcmVzb2x2ZWQsIHdpbGwgc2NoZWR1bGUgYSBuZXcgcGFyc2UuIEl0IGlzIGNsZWFyZWQgd2hlblxuICAgIHRoZSBwYXJzZSB3b3JrZXIgcGlja3MgdXAgdGhlIHByb21pc2UuIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2NoZWR1bGVPbikge1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cztcbiAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgdGhpcy50cmVlTGVuID0gdHJlZUxlbjtcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICAgICB0aGlzLnNraXBwZWQgPSBza2lwcGVkO1xuICAgICAgICB0aGlzLnNjaGVkdWxlT24gPSBzY2hlZHVsZU9uO1xuICAgICAgICB0aGlzLnBhcnNlID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnRlbXBTa2lwcGVkID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShwYXJzZXIsIHN0YXRlLCB2aWV3cG9ydCkge1xuICAgICAgICByZXR1cm4gbmV3IFBhcnNlQ29udGV4dChwYXJzZXIsIHN0YXRlLCBbXSwgVHJlZS5lbXB0eSwgMCwgdmlld3BvcnQsIFtdLCBudWxsKTtcbiAgICB9XG4gICAgc3RhcnRQYXJzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VyLnN0YXJ0UGFyc2UobmV3IERvY0lucHV0KHRoaXMuc3RhdGUuZG9jKSwgdGhpcy5mcmFnbWVudHMpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHdvcmsodW50aWwsIHVwdG8pIHtcbiAgICAgICAgaWYgKHVwdG8gIT0gbnVsbCAmJiB1cHRvID49IHRoaXMuc3RhdGUuZG9jLmxlbmd0aClcbiAgICAgICAgICAgIHVwdG8gPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLnRyZWUgIT0gVHJlZS5lbXB0eSAmJiB0aGlzLmlzRG9uZSh1cHRvICE9PSBudWxsICYmIHVwdG8gIT09IHZvaWQgMCA/IHVwdG8gOiB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpKSB7XG4gICAgICAgICAgICB0aGlzLnRha2VUcmVlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy53aXRoQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHVudGlsID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kVGltZSA9IERhdGUubm93KCkgKyB1bnRpbDtcbiAgICAgICAgICAgICAgICB1bnRpbCA9ICgpID0+IERhdGUubm93KCkgPiBlbmRUaW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcnNlKVxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2UgPSB0aGlzLnN0YXJ0UGFyc2UoKTtcbiAgICAgICAgICAgIGlmICh1cHRvICE9IG51bGwgJiYgKHRoaXMucGFyc2Uuc3RvcHBlZEF0ID09IG51bGwgfHwgdGhpcy5wYXJzZS5zdG9wcGVkQXQgPiB1cHRvKSAmJlxuICAgICAgICAgICAgICAgIHVwdG8gPCB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZS5zdG9wQXQodXB0byk7XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgbGV0IGRvbmUgPSB0aGlzLnBhcnNlLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYWdtZW50cyA9IHRoaXMud2l0aG91dFRlbXBTa2lwcGVkKFRyZWVGcmFnbWVudC5hZGRUcmVlKGRvbmUsIHRoaXMuZnJhZ21lbnRzLCB0aGlzLnBhcnNlLnN0b3BwZWRBdCAhPSBudWxsKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZUxlbiA9IChfYSA9IHRoaXMucGFyc2Uuc3RvcHBlZEF0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLnN0YXRlLmRvYy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZSA9IGRvbmU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2UgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmVlTGVuIDwgKHVwdG8gIT09IG51bGwgJiYgdXB0byAhPT0gdm9pZCAwID8gdXB0byA6IHRoaXMuc3RhdGUuZG9jLmxlbmd0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5zdGFydFBhcnNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodW50aWwoKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0YWtlVHJlZSgpIHtcbiAgICAgICAgbGV0IHBvcywgdHJlZTtcbiAgICAgICAgaWYgKHRoaXMucGFyc2UgJiYgKHBvcyA9IHRoaXMucGFyc2UucGFyc2VkUG9zKSA+PSB0aGlzLnRyZWVMZW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlLnN0b3BwZWRBdCA9PSBudWxsIHx8IHRoaXMucGFyc2Uuc3RvcHBlZEF0ID4gcG9zKVxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2Uuc3RvcEF0KHBvcyk7XG4gICAgICAgICAgICB0aGlzLndpdGhDb250ZXh0KCgpID0+IHsgd2hpbGUgKCEodHJlZSA9IHRoaXMucGFyc2UuYWR2YW5jZSgpKSkgeyB9IH0pO1xuICAgICAgICAgICAgdGhpcy50cmVlTGVuID0gcG9zO1xuICAgICAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgICAgIHRoaXMuZnJhZ21lbnRzID0gdGhpcy53aXRob3V0VGVtcFNraXBwZWQoVHJlZUZyYWdtZW50LmFkZFRyZWUodGhpcy50cmVlLCB0aGlzLmZyYWdtZW50cywgdHJ1ZSkpO1xuICAgICAgICAgICAgdGhpcy5wYXJzZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2l0aENvbnRleHQoZikge1xuICAgICAgICBsZXQgcHJldiA9IGN1cnJlbnRDb250ZXh0O1xuICAgICAgICBjdXJyZW50Q29udGV4dCA9IHRoaXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZigpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgY3VycmVudENvbnRleHQgPSBwcmV2O1xuICAgICAgICB9XG4gICAgfVxuICAgIHdpdGhvdXRUZW1wU2tpcHBlZChmcmFnbWVudHMpIHtcbiAgICAgICAgZm9yIChsZXQgcjsgciA9IHRoaXMudGVtcFNraXBwZWQucG9wKCk7KVxuICAgICAgICAgICAgZnJhZ21lbnRzID0gY3V0RnJhZ21lbnRzKGZyYWdtZW50cywgci5mcm9tLCByLnRvKTtcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50cztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaGFuZ2VzKGNoYW5nZXMsIG5ld1N0YXRlKSB7XG4gICAgICAgIGxldCB7IGZyYWdtZW50cywgdHJlZSwgdHJlZUxlbiwgdmlld3BvcnQsIHNraXBwZWQgfSA9IHRoaXM7XG4gICAgICAgIHRoaXMudGFrZVRyZWUoKTtcbiAgICAgICAgaWYgKCFjaGFuZ2VzLmVtcHR5KSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgICAgICBjaGFuZ2VzLml0ZXJDaGFuZ2VkUmFuZ2VzKChmcm9tQSwgdG9BLCBmcm9tQiwgdG9CKSA9PiByYW5nZXMucHVzaCh7IGZyb21BLCB0b0EsIGZyb21CLCB0b0IgfSkpO1xuICAgICAgICAgICAgZnJhZ21lbnRzID0gVHJlZUZyYWdtZW50LmFwcGx5Q2hhbmdlcyhmcmFnbWVudHMsIHJhbmdlcyk7XG4gICAgICAgICAgICB0cmVlID0gVHJlZS5lbXB0eTtcbiAgICAgICAgICAgIHRyZWVMZW4gPSAwO1xuICAgICAgICAgICAgdmlld3BvcnQgPSB7IGZyb206IGNoYW5nZXMubWFwUG9zKHZpZXdwb3J0LmZyb20sIC0xKSwgdG86IGNoYW5nZXMubWFwUG9zKHZpZXdwb3J0LnRvLCAxKSB9O1xuICAgICAgICAgICAgaWYgKHRoaXMuc2tpcHBlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBza2lwcGVkID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgciBvZiB0aGlzLnNraXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyb20gPSBjaGFuZ2VzLm1hcFBvcyhyLmZyb20sIDEpLCB0byA9IGNoYW5nZXMubWFwUG9zKHIudG8sIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20gPCB0bylcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWQucHVzaCh7IGZyb20sIHRvIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFBhcnNlQ29udGV4dCh0aGlzLnBhcnNlciwgbmV3U3RhdGUsIGZyYWdtZW50cywgdHJlZSwgdHJlZUxlbiwgdmlld3BvcnQsIHNraXBwZWQsIHRoaXMuc2NoZWR1bGVPbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdXBkYXRlVmlld3BvcnQodmlld3BvcnQpIHtcbiAgICAgICAgaWYgKHRoaXMudmlld3BvcnQuZnJvbSA9PSB2aWV3cG9ydC5mcm9tICYmIHRoaXMudmlld3BvcnQudG8gPT0gdmlld3BvcnQudG8pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICAgICAgbGV0IHN0YXJ0TGVuID0gdGhpcy5za2lwcGVkLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNraXBwZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSB0aGlzLnNraXBwZWRbaV07XG4gICAgICAgICAgICBpZiAoZnJvbSA8IHZpZXdwb3J0LnRvICYmIHRvID4gdmlld3BvcnQuZnJvbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJhZ21lbnRzID0gY3V0RnJhZ21lbnRzKHRoaXMuZnJhZ21lbnRzLCBmcm9tLCB0byk7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lwcGVkLnNwbGljZShpLS0sIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNraXBwZWQubGVuZ3RoID49IHN0YXJ0TGVuKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlc2V0KCkge1xuICAgICAgICBpZiAodGhpcy5wYXJzZSkge1xuICAgICAgICAgICAgdGhpcy50YWtlVHJlZSgpO1xuICAgICAgICAgICAgdGhpcy5wYXJzZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgTm90aWZ5IHRoZSBwYXJzZSBzY2hlZHVsZXIgdGhhdCB0aGUgZ2l2ZW4gcmVnaW9uIHdhcyBza2lwcGVkXG4gICAgYmVjYXVzZSBpdCB3YXNuJ3QgaW4gdmlldywgYW5kIHRoZSBwYXJzZSBzaG91bGQgYmUgcmVzdGFydGVkXG4gICAgd2hlbiBpdCBjb21lcyBpbnRvIHZpZXcuXG4gICAgKi9cbiAgICBza2lwVW50aWxJblZpZXcoZnJvbSwgdG8pIHtcbiAgICAgICAgdGhpcy5za2lwcGVkLnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhIHBhcnNlciBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIHBsYWNlaG9sZGVyIHdoZW5cbiAgICBhc3luY2hyb25vdXNseSBsb2FkaW5nIGEgbmVzdGVkIHBhcnNlci4gSXQnbGwgc2tpcCBpdHMgaW5wdXQgYW5kXG4gICAgbWFyayBpdCBhcyBub3QtcmVhbGx5LXBhcnNlZCwgc28gdGhhdCB0aGUgbmV4dCB1cGRhdGUgd2lsbCBwYXJzZVxuICAgIGl0IGFnYWluLlxuICAgIFxuICAgIFdoZW4gYHVudGlsYCBpcyBnaXZlbiwgYSByZXBhcnNlIHdpbGwgYmUgc2NoZWR1bGVkIHdoZW4gdGhhdFxuICAgIHByb21pc2UgcmVzb2x2ZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0U2tpcHBpbmdQYXJzZXIodW50aWwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjbGFzcyBleHRlbmRzIFBhcnNlciB7XG4gICAgICAgICAgICBjcmVhdGVQYXJzZShpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IHJhbmdlc1swXS5mcm9tLCB0byA9IHJhbmdlc1tyYW5nZXMubGVuZ3RoIC0gMV0udG87XG4gICAgICAgICAgICAgICAgbGV0IHBhcnNlciA9IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkUG9zOiBmcm9tLFxuICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN4ID0gY3VycmVudENvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByIG9mIHJhbmdlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3gudGVtcFNraXBwZWQucHVzaChyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW50aWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4LnNjaGVkdWxlT24gPSBjeC5zY2hlZHVsZU9uID8gUHJvbWlzZS5hbGwoW2N4LnNjaGVkdWxlT24sIHVudGlsXSkgOiB1bnRpbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkUG9zID0gdG87XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRyZWUoTm9kZVR5cGUubm9uZSwgW10sIFtdLCB0byAtIGZyb20pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzdG9wcGVkQXQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHN0b3BBdCgpIHsgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpc0RvbmUodXB0bykge1xuICAgICAgICB1cHRvID0gTWF0aC5taW4odXB0bywgdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKTtcbiAgICAgICAgbGV0IGZyYWdzID0gdGhpcy5mcmFnbWVudHM7XG4gICAgICAgIHJldHVybiB0aGlzLnRyZWVMZW4gPj0gdXB0byAmJiBmcmFncy5sZW5ndGggJiYgZnJhZ3NbMF0uZnJvbSA9PSAwICYmIGZyYWdzWzBdLnRvID49IHVwdG87XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY29udGV4dCBmb3IgdGhlIGN1cnJlbnQgcGFyc2UsIG9yIGBudWxsYCBpZiBubyBlZGl0b3JcbiAgICBwYXJzZSBpcyBpbiBwcm9ncmVzcy5cbiAgICAqL1xuICAgIHN0YXRpYyBnZXQoKSB7IHJldHVybiBjdXJyZW50Q29udGV4dDsgfVxufVxuZnVuY3Rpb24gY3V0RnJhZ21lbnRzKGZyYWdtZW50cywgZnJvbSwgdG8pIHtcbiAgICByZXR1cm4gVHJlZUZyYWdtZW50LmFwcGx5Q2hhbmdlcyhmcmFnbWVudHMsIFt7IGZyb21BOiBmcm9tLCB0b0E6IHRvLCBmcm9tQjogZnJvbSwgdG9COiB0byB9XSk7XG59XG5jbGFzcyBMYW5ndWFnZVN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvLyBBIG11dGFibGUgcGFyc2Ugc3RhdGUgdGhhdCBpcyB1c2VkIHRvIHByZXNlcnZlIHdvcmsgZG9uZSBkdXJpbmdcbiAgICAvLyB0aGUgbGlmZXRpbWUgb2YgYSBzdGF0ZSB3aGVuIG1vdmluZyB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMudHJlZSA9IGNvbnRleHQudHJlZTtcbiAgICB9XG4gICAgYXBwbHkodHIpIHtcbiAgICAgICAgaWYgKCF0ci5kb2NDaGFuZ2VkICYmIHRoaXMudHJlZSA9PSB0aGlzLmNvbnRleHQudHJlZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgbmV3Q3ggPSB0aGlzLmNvbnRleHQuY2hhbmdlcyh0ci5jaGFuZ2VzLCB0ci5zdGF0ZSk7XG4gICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBwYXJzZSB3YXNuJ3QgZG9uZSwgZ28gZm9yd2FyZCBvbmx5IHVwIHRvIGl0c1xuICAgICAgICAvLyBlbmQgcG9zaXRpb24gb3IgdGhlIGVuZCBvZiB0aGUgdmlld3BvcnQsIHRvIGF2b2lkIHNsb3dpbmcgZG93blxuICAgICAgICAvLyBzdGF0ZSB1cGRhdGVzIHdpdGggcGFyc2Ugd29yayBiZXlvbmQgdGhlIHZpZXdwb3J0LlxuICAgICAgICBsZXQgdXB0byA9IHRoaXMuY29udGV4dC50cmVlTGVuID09IHRyLnN0YXJ0U3RhdGUuZG9jLmxlbmd0aCA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBNYXRoLm1heCh0ci5jaGFuZ2VzLm1hcFBvcyh0aGlzLmNvbnRleHQudHJlZUxlbiksIG5ld0N4LnZpZXdwb3J0LnRvKTtcbiAgICAgICAgaWYgKCFuZXdDeC53b3JrKDIwIC8qIFdvcmsuQXBwbHkgKi8sIHVwdG8pKVxuICAgICAgICAgICAgbmV3Q3gudGFrZVRyZWUoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMYW5ndWFnZVN0YXRlKG5ld0N4KTtcbiAgICB9XG4gICAgc3RhdGljIGluaXQoc3RhdGUpIHtcbiAgICAgICAgbGV0IHZwVG8gPSBNYXRoLm1pbigzMDAwIC8qIFdvcmsuSW5pdFZpZXdwb3J0ICovLCBzdGF0ZS5kb2MubGVuZ3RoKTtcbiAgICAgICAgbGV0IHBhcnNlU3RhdGUgPSBQYXJzZUNvbnRleHQuY3JlYXRlKHN0YXRlLmZhY2V0KGxhbmd1YWdlKS5wYXJzZXIsIHN0YXRlLCB7IGZyb206IDAsIHRvOiB2cFRvIH0pO1xuICAgICAgICBpZiAoIXBhcnNlU3RhdGUud29yaygyMCAvKiBXb3JrLkFwcGx5ICovLCB2cFRvKSlcbiAgICAgICAgICAgIHBhcnNlU3RhdGUudGFrZVRyZWUoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMYW5ndWFnZVN0YXRlKHBhcnNlU3RhdGUpO1xuICAgIH1cbn1cbkxhbmd1YWdlLnN0YXRlID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGU6IExhbmd1YWdlU3RhdGUuaW5pdCxcbiAgICB1cGRhdGUodmFsdWUsIHRyKSB7XG4gICAgICAgIGZvciAobGV0IGUgb2YgdHIuZWZmZWN0cylcbiAgICAgICAgICAgIGlmIChlLmlzKExhbmd1YWdlLnNldFN0YXRlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZTtcbiAgICAgICAgaWYgKHRyLnN0YXJ0U3RhdGUuZmFjZXQobGFuZ3VhZ2UpICE9IHRyLnN0YXRlLmZhY2V0KGxhbmd1YWdlKSlcbiAgICAgICAgICAgIHJldHVybiBMYW5ndWFnZVN0YXRlLmluaXQodHIuc3RhdGUpO1xuICAgICAgICByZXR1cm4gdmFsdWUuYXBwbHkodHIpO1xuICAgIH1cbn0pO1xubGV0IHJlcXVlc3RJZGxlID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgbGV0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKCksIDUwMCAvKiBXb3JrLk1heFBhdXNlICovKTtcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufTtcbmlmICh0eXBlb2YgcmVxdWVzdElkbGVDYWxsYmFjayAhPSBcInVuZGVmaW5lZFwiKVxuICAgIHJlcXVlc3RJZGxlID0gKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGxldCBpZGxlID0gLTEsIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlkbGUgPSByZXF1ZXN0SWRsZUNhbGxiYWNrKGNhbGxiYWNrLCB7IHRpbWVvdXQ6IDUwMCAvKiBXb3JrLk1heFBhdXNlICovIC0gMTAwIC8qIFdvcmsuTWluUGF1c2UgKi8gfSk7XG4gICAgICAgIH0sIDEwMCAvKiBXb3JrLk1pblBhdXNlICovKTtcbiAgICAgICAgcmV0dXJuICgpID0+IGlkbGUgPCAwID8gY2xlYXJUaW1lb3V0KHRpbWVvdXQpIDogY2FuY2VsSWRsZUNhbGxiYWNrKGlkbGUpO1xuICAgIH07XG5jb25zdCBpc0lucHV0UGVuZGluZyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiAmJiAoKF9hID0gbmF2aWdhdG9yLnNjaGVkdWxpbmcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pc0lucHV0UGVuZGluZylcbiAgICA/ICgpID0+IG5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nKCkgOiBudWxsO1xuY29uc3QgcGFyc2VXb3JrZXIgPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3MgUGFyc2VXb3JrZXIge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy53b3JraW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy53b3JrU2NoZWR1bGVkID0gMDtcbiAgICAgICAgLy8gRW5kIG9mIHRoZSBjdXJyZW50IHRpbWUgY2h1bmtcbiAgICAgICAgdGhpcy5jaHVua0VuZCA9IC0xO1xuICAgICAgICAvLyBNaWxsaXNlY29uZHMgb2YgYnVkZ2V0IGxlZnQgZm9yIHRoaXMgY2h1bmtcbiAgICAgICAgdGhpcy5jaHVua0J1ZGdldCA9IC0xO1xuICAgICAgICB0aGlzLndvcmsgPSB0aGlzLndvcmsuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVdvcmsoKTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBsZXQgY3ggPSB0aGlzLnZpZXcuc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUpLmNvbnRleHQ7XG4gICAgICAgIGlmIChjeC51cGRhdGVWaWV3cG9ydCh1cGRhdGUudmlldy52aWV3cG9ydCkgfHwgdGhpcy52aWV3LnZpZXdwb3J0LnRvID4gY3gudHJlZUxlbilcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVXb3JrKCk7XG4gICAgICAgIGlmICh1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuc2VsZWN0aW9uU2V0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3Lmhhc0ZvY3VzKVxuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtCdWRnZXQgKz0gNTAgLyogV29yay5DaGFuZ2VCb251cyAqLztcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVXb3JrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGVja0FzeW5jU2NoZWR1bGUoY3gpO1xuICAgIH1cbiAgICBzY2hlZHVsZVdvcmsoKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtpbmcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB7IHN0YXRlIH0gPSB0aGlzLnZpZXcsIGZpZWxkID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUpO1xuICAgICAgICBpZiAoZmllbGQudHJlZSAhPSBmaWVsZC5jb250ZXh0LnRyZWUgfHwgIWZpZWxkLmNvbnRleHQuaXNEb25lKHN0YXRlLmRvYy5sZW5ndGgpKVxuICAgICAgICAgICAgdGhpcy53b3JraW5nID0gcmVxdWVzdElkbGUodGhpcy53b3JrKTtcbiAgICB9XG4gICAgd29yayhkZWFkbGluZSkge1xuICAgICAgICB0aGlzLndvcmtpbmcgPSBudWxsO1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtFbmQgPCBub3cgJiYgKHRoaXMuY2h1bmtFbmQgPCAwIHx8IHRoaXMudmlldy5oYXNGb2N1cykpIHsgLy8gU3RhcnQgYSBuZXcgY2h1bmtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtFbmQgPSBub3cgKyAzMDAwMCAvKiBXb3JrLkNodW5rVGltZSAqLztcbiAgICAgICAgICAgIHRoaXMuY2h1bmtCdWRnZXQgPSAzMDAwIC8qIFdvcmsuQ2h1bmtCdWRnZXQgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2h1bmtCdWRnZXQgPD0gMClcbiAgICAgICAgICAgIHJldHVybjsgLy8gTm8gbW9yZSBidWRnZXRcbiAgICAgICAgbGV0IHsgc3RhdGUsIHZpZXdwb3J0OiB7IHRvOiB2cFRvIH0gfSA9IHRoaXMudmlldywgZmllbGQgPSBzdGF0ZS5maWVsZChMYW5ndWFnZS5zdGF0ZSk7XG4gICAgICAgIGlmIChmaWVsZC50cmVlID09IGZpZWxkLmNvbnRleHQudHJlZSAmJiBmaWVsZC5jb250ZXh0LmlzRG9uZSh2cFRvICsgMTAwMDAwIC8qIFdvcmsuTWF4UGFyc2VBaGVhZCAqLykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBlbmRUaW1lID0gRGF0ZS5ub3coKSArIE1hdGgubWluKHRoaXMuY2h1bmtCdWRnZXQsIDEwMCAvKiBXb3JrLlNsaWNlICovLCBkZWFkbGluZSAmJiAhaXNJbnB1dFBlbmRpbmcgPyBNYXRoLm1heCgyNSAvKiBXb3JrLk1pblNsaWNlICovLCBkZWFkbGluZS50aW1lUmVtYWluaW5nKCkgLSA1KSA6IDFlOSk7XG4gICAgICAgIGxldCB2aWV3cG9ydEZpcnN0ID0gZmllbGQuY29udGV4dC50cmVlTGVuIDwgdnBUbyAmJiBzdGF0ZS5kb2MubGVuZ3RoID4gdnBUbyArIDEwMDA7XG4gICAgICAgIGxldCBkb25lID0gZmllbGQuY29udGV4dC53b3JrKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpc0lucHV0UGVuZGluZyAmJiBpc0lucHV0UGVuZGluZygpIHx8IERhdGUubm93KCkgPiBlbmRUaW1lO1xuICAgICAgICB9LCB2cFRvICsgKHZpZXdwb3J0Rmlyc3QgPyAwIDogMTAwMDAwIC8qIFdvcmsuTWF4UGFyc2VBaGVhZCAqLykpO1xuICAgICAgICB0aGlzLmNodW5rQnVkZ2V0IC09IERhdGUubm93KCkgLSBub3c7XG4gICAgICAgIGlmIChkb25lIHx8IHRoaXMuY2h1bmtCdWRnZXQgPD0gMCkge1xuICAgICAgICAgICAgZmllbGQuY29udGV4dC50YWtlVHJlZSgpO1xuICAgICAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogTGFuZ3VhZ2Uuc2V0U3RhdGUub2YobmV3IExhbmd1YWdlU3RhdGUoZmllbGQuY29udGV4dCkpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNodW5rQnVkZ2V0ID4gMCAmJiAhKGRvbmUgJiYgIXZpZXdwb3J0Rmlyc3QpKVxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVdvcmsoKTtcbiAgICAgICAgdGhpcy5jaGVja0FzeW5jU2NoZWR1bGUoZmllbGQuY29udGV4dCk7XG4gICAgfVxuICAgIGNoZWNrQXN5bmNTY2hlZHVsZShjeCkge1xuICAgICAgICBpZiAoY3guc2NoZWR1bGVPbikge1xuICAgICAgICAgICAgdGhpcy53b3JrU2NoZWR1bGVkKys7XG4gICAgICAgICAgICBjeC5zY2hlZHVsZU9uXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5zY2hlZHVsZVdvcmsoKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IGxvZ0V4Y2VwdGlvbih0aGlzLnZpZXcuc3RhdGUsIGVycikpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy53b3JrU2NoZWR1bGVkLS0pO1xuICAgICAgICAgICAgY3guc2NoZWR1bGVPbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMud29ya2luZylcbiAgICAgICAgICAgIHRoaXMud29ya2luZygpO1xuICAgIH1cbiAgICBpc1dvcmtpbmcoKSB7XG4gICAgICAgIHJldHVybiAhISh0aGlzLndvcmtpbmcgfHwgdGhpcy53b3JrU2NoZWR1bGVkID4gMCk7XG4gICAgfVxufSwge1xuICAgIGV2ZW50SGFuZGxlcnM6IHsgZm9jdXMoKSB7IHRoaXMuc2NoZWR1bGVXb3JrKCk7IH0gfVxufSk7XG4vKipcblRoZSBmYWNldCB1c2VkIHRvIGFzc29jaWF0ZSBhIGxhbmd1YWdlIHdpdGggYW4gZWRpdG9yIHN0YXRlLiBVc2VkXG5ieSBgTGFuZ3VhZ2VgIG9iamVjdCdzIGBleHRlbnNpb25gIHByb3BlcnR5IChzbyB5b3UgZG9uJ3QgbmVlZCB0b1xubWFudWFsbHkgd3JhcCB5b3VyIGxhbmd1YWdlcyBpbiB0aGlzKS4gQ2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZVxuY3VycmVudCBsYW5ndWFnZSBvbiBhIHN0YXRlLlxuKi9cbmNvbnN0IGxhbmd1YWdlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZShsYW5ndWFnZXMpIHsgcmV0dXJuIGxhbmd1YWdlcy5sZW5ndGggPyBsYW5ndWFnZXNbMF0gOiBudWxsOyB9LFxuICAgIGVuYWJsZXM6IGxhbmd1YWdlID0+IFtcbiAgICAgICAgTGFuZ3VhZ2Uuc3RhdGUsXG4gICAgICAgIHBhcnNlV29ya2VyLFxuICAgICAgICBFZGl0b3JWaWV3LmNvbnRlbnRBdHRyaWJ1dGVzLmNvbXB1dGUoW2xhbmd1YWdlXSwgc3RhdGUgPT4ge1xuICAgICAgICAgICAgbGV0IGxhbmcgPSBzdGF0ZS5mYWNldChsYW5ndWFnZSk7XG4gICAgICAgICAgICByZXR1cm4gbGFuZyAmJiBsYW5nLm5hbWUgPyB7IFwiZGF0YS1sYW5ndWFnZVwiOiBsYW5nLm5hbWUgfSA6IHt9O1xuICAgICAgICB9KVxuICAgIF1cbn0pO1xuLyoqXG5UaGlzIGNsYXNzIGJ1bmRsZXMgYSBbbGFuZ3VhZ2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2UpIHdpdGggYW5cbm9wdGlvbmFsIHNldCBvZiBzdXBwb3J0aW5nIGV4dGVuc2lvbnMuIExhbmd1YWdlIHBhY2thZ2VzIGFyZVxuZW5jb3VyYWdlZCB0byBleHBvcnQgYSBmdW5jdGlvbiB0aGF0IG9wdGlvbmFsbHkgdGFrZXMgYVxuY29uZmlndXJhdGlvbiBvYmplY3QgYW5kIHJldHVybnMgYSBgTGFuZ3VhZ2VTdXBwb3J0YCBpbnN0YW5jZSwgYXNcbnRoZSBtYWluIHdheSBmb3IgY2xpZW50IGNvZGUgdG8gdXNlIHRoZSBwYWNrYWdlLlxuKi9cbmNsYXNzIExhbmd1YWdlU3VwcG9ydCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbGFuZ3VhZ2Ugc3VwcG9ydCBvYmplY3QuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbGFuZ3VhZ2Ugb2JqZWN0LlxuICAgICovXG4gICAgbGFuZ3VhZ2UsIFxuICAgIC8qKlxuICAgIEFuIG9wdGlvbmFsIHNldCBvZiBzdXBwb3J0aW5nIGV4dGVuc2lvbnMuIFdoZW4gbmVzdGluZyBhXG4gICAgbGFuZ3VhZ2UgaW4gYW5vdGhlciBsYW5ndWFnZSwgdGhlIG91dGVyIGxhbmd1YWdlIGlzIGVuY291cmFnZWRcbiAgICB0byBpbmNsdWRlIHRoZSBzdXBwb3J0aW5nIGV4dGVuc2lvbnMgZm9yIGl0cyBpbm5lciBsYW5ndWFnZXNcbiAgICBpbiBpdHMgb3duIHNldCBvZiBzdXBwb3J0IGV4dGVuc2lvbnMuXG4gICAgKi9cbiAgICBzdXBwb3J0ID0gW10pIHtcbiAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlO1xuICAgICAgICB0aGlzLnN1cHBvcnQgPSBzdXBwb3J0O1xuICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IFtsYW5ndWFnZSwgc3VwcG9ydF07XG4gICAgfVxufVxuLyoqXG5MYW5ndWFnZSBkZXNjcmlwdGlvbnMgYXJlIHVzZWQgdG8gc3RvcmUgbWV0YWRhdGEgYWJvdXQgbGFuZ3VhZ2VzXG5hbmQgdG8gZHluYW1pY2FsbHkgbG9hZCB0aGVtLiBUaGVpciBtYWluIHJvbGUgaXMgZmluZGluZyB0aGVcbmFwcHJvcHJpYXRlIGxhbmd1YWdlIGZvciBhIGZpbGVuYW1lIG9yIGR5bmFtaWNhbGx5IGxvYWRpbmcgbmVzdGVkXG5wYXJzZXJzLlxuKi9cbmNsYXNzIExhbmd1YWdlRGVzY3JpcHRpb24ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBuYW1lIG9mIHRoaXMgbGFuZ3VhZ2UuXG4gICAgKi9cbiAgICBuYW1lLCBcbiAgICAvKipcbiAgICBBbHRlcm5hdGl2ZSBuYW1lcyBmb3IgdGhlIG1vZGUgKGxvd2VyY2FzZWQsIGluY2x1ZGVzIGB0aGlzLm5hbWVgKS5cbiAgICAqL1xuICAgIGFsaWFzLCBcbiAgICAvKipcbiAgICBGaWxlIGV4dGVuc2lvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGFuZ3VhZ2UuXG4gICAgKi9cbiAgICBleHRlbnNpb25zLCBcbiAgICAvKipcbiAgICBPcHRpb25hbCBmaWxlbmFtZSBwYXR0ZXJuIHRoYXQgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzXG4gICAgbGFuZ3VhZ2UuXG4gICAgKi9cbiAgICBmaWxlbmFtZSwgbG9hZEZ1bmMsIFxuICAgIC8qKlxuICAgIElmIHRoZSBsYW5ndWFnZSBoYXMgYmVlbiBsb2FkZWQsIHRoaXMgd2lsbCBob2xkIGl0cyB2YWx1ZS5cbiAgICAqL1xuICAgIHN1cHBvcnQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zO1xuICAgICAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7XG4gICAgICAgIHRoaXMubG9hZEZ1bmMgPSBsb2FkRnVuYztcbiAgICAgICAgdGhpcy5zdXBwb3J0ID0gc3VwcG9ydDtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgU3RhcnQgbG9hZGluZyB0aGUgdGhlIGxhbmd1YWdlLiBXaWxsIHJldHVybiBhIHByb21pc2UgdGhhdFxuICAgIHJlc29sdmVzIHRvIGEgW2BMYW5ndWFnZVN1cHBvcnRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlU3VwcG9ydClcbiAgICBvYmplY3Qgd2hlbiB0aGUgbGFuZ3VhZ2Ugc3VjY2Vzc2Z1bGx5IGxvYWRzLlxuICAgICovXG4gICAgbG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZyB8fCAodGhpcy5sb2FkaW5nID0gdGhpcy5sb2FkRnVuYygpLnRoZW4oc3VwcG9ydCA9PiB0aGlzLnN1cHBvcnQgPSBzdXBwb3J0LCBlcnIgPT4geyB0aGlzLmxvYWRpbmcgPSBudWxsOyB0aHJvdyBlcnI7IH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbGFuZ3VhZ2UgZGVzY3JpcHRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgb2Yoc3BlYykge1xuICAgICAgICBsZXQgeyBsb2FkLCBzdXBwb3J0IH0gPSBzcGVjO1xuICAgICAgICBpZiAoIWxvYWQpIHtcbiAgICAgICAgICAgIGlmICghc3VwcG9ydClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk11c3QgcGFzcyBlaXRoZXIgJ2xvYWQnIG9yICdzdXBwb3J0JyB0byBMYW5ndWFnZURlc2NyaXB0aW9uLm9mXCIpO1xuICAgICAgICAgICAgbG9hZCA9ICgpID0+IFByb21pc2UucmVzb2x2ZShzdXBwb3J0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IExhbmd1YWdlRGVzY3JpcHRpb24oc3BlYy5uYW1lLCAoc3BlYy5hbGlhcyB8fCBbXSkuY29uY2F0KHNwZWMubmFtZSkubWFwKHMgPT4gcy50b0xvd2VyQ2FzZSgpKSwgc3BlYy5leHRlbnNpb25zIHx8IFtdLCBzcGVjLmZpbGVuYW1lLCBsb2FkLCBzdXBwb3J0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgTG9vayBmb3IgYSBsYW5ndWFnZSBpbiB0aGUgZ2l2ZW4gYXJyYXkgb2YgZGVzY3JpcHRpb25zIHRoYXRcbiAgICBtYXRjaGVzIHRoZSBmaWxlbmFtZS4gV2lsbCBmaXJzdCBtYXRjaFxuICAgIFtgZmlsZW5hbWVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlRGVzY3JpcHRpb24uZmlsZW5hbWUpIHBhdHRlcm5zLFxuICAgIGFuZCB0aGVuIFtleHRlbnNpb25zXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlRGVzY3JpcHRpb24uZXh0ZW5zaW9ucyksXG4gICAgYW5kIHJldHVybiB0aGUgZmlyc3QgbGFuZ3VhZ2UgdGhhdCBtYXRjaGVzLlxuICAgICovXG4gICAgc3RhdGljIG1hdGNoRmlsZW5hbWUoZGVzY3MsIGZpbGVuYW1lKSB7XG4gICAgICAgIGZvciAobGV0IGQgb2YgZGVzY3MpXG4gICAgICAgICAgICBpZiAoZC5maWxlbmFtZSAmJiBkLmZpbGVuYW1lLnRlc3QoZmlsZW5hbWUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICBsZXQgZXh0ID0gL1xcLihbXi5dKykkLy5leGVjKGZpbGVuYW1lKTtcbiAgICAgICAgaWYgKGV4dClcbiAgICAgICAgICAgIGZvciAobGV0IGQgb2YgZGVzY3MpXG4gICAgICAgICAgICAgICAgaWYgKGQuZXh0ZW5zaW9ucy5pbmRleE9mKGV4dFsxXSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBMb29rIGZvciBhIGxhbmd1YWdlIHdob3NlIG5hbWUgb3IgYWxpYXMgbWF0Y2hlcyB0aGUgdGhlIGdpdmVuXG4gICAgbmFtZSAoY2FzZS1pbnNlbnNpdGl2ZWx5KS4gSWYgYGZ1enp5YCBpcyB0cnVlLCBhbmQgbm8gZGlyZWN0XG4gICAgbWF0Y2hzIGlzIGZvdW5kLCB0aGlzJ2xsIGFsc28gc2VhcmNoIGZvciBhIGxhbmd1YWdlIHdob3NlIG5hbWVcbiAgICBvciBhbGlhcyBvY2N1cnMgaW4gdGhlIHN0cmluZyAoZm9yIG5hbWVzIHNob3J0ZXIgdGhhbiB0aHJlZVxuICAgIGNoYXJhY3RlcnMsIG9ubHkgd2hlbiBzdXJyb3VuZGVkIGJ5IG5vbi13b3JkIGNoYXJhY3RlcnMpLlxuICAgICovXG4gICAgc3RhdGljIG1hdGNoTGFuZ3VhZ2VOYW1lKGRlc2NzLCBuYW1lLCBmdXp6eSA9IHRydWUpIHtcbiAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgZm9yIChsZXQgZCBvZiBkZXNjcylcbiAgICAgICAgICAgIGlmIChkLmFsaWFzLnNvbWUoYSA9PiBhID09IG5hbWUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICBpZiAoZnV6enkpXG4gICAgICAgICAgICBmb3IgKGxldCBkIG9mIGRlc2NzKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGEgb2YgZC5hbGlhcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBuYW1lLmluZGV4T2YoYSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCA+IC0xICYmIChhLmxlbmd0aCA+IDIgfHwgIS9cXHcvLnRlc3QobmFtZVtmb3VuZCAtIDFdKSAmJiAhL1xcdy8udGVzdChuYW1lW2ZvdW5kICsgYS5sZW5ndGhdKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuLyoqXG5GYWNldCB0aGF0IGRlZmluZXMgYSB3YXkgdG8gcHJvdmlkZSBhIGZ1bmN0aW9uIHRoYXQgY29tcHV0ZXMgdGhlXG5hcHByb3ByaWF0ZSBpbmRlbnRhdGlvbiBkZXB0aCwgYXMgYSBjb2x1bW4gbnVtYmVyIChzZWVcbltgaW5kZW50U3RyaW5nYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRTdHJpbmcpKSwgYXQgdGhlIHN0YXJ0IG9mIGEgZ2l2ZW5cbmxpbmUuIEEgcmV0dXJuIHZhbHVlIG9mIGBudWxsYCBpbmRpY2F0ZXMgbm8gaW5kZW50YXRpb24gY2FuIGJlXG5kZXRlcm1pbmVkLCBhbmQgdGhlIGxpbmUgc2hvdWxkIGluaGVyaXQgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBvbmVcbmFib3ZlIGl0LiBBIHJldHVybiB2YWx1ZSBvZiBgdW5kZWZpbmVkYCBkZWZlcnMgdG8gdGhlIG5leHQgaW5kZW50XG5zZXJ2aWNlLlxuKi9cbmNvbnN0IGluZGVudFNlcnZpY2UgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcbkZhY2V0IGZvciBvdmVycmlkaW5nIHRoZSB1bml0IGJ5IHdoaWNoIGluZGVudGF0aW9uIGhhcHBlbnMuIFNob3VsZFxuYmUgYSBzdHJpbmcgY29uc2lzdGluZyBlaXRoZXIgZW50aXJlbHkgb2YgdGhlIHNhbWUgd2hpdGVzcGFjZVxuY2hhcmFjdGVyLiBXaGVuIG5vdCBzZXQsIHRoaXMgZGVmYXVsdHMgdG8gMiBzcGFjZXMuXG4qL1xuY29uc3QgaW5kZW50VW5pdCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB7XG4gICAgICAgIGlmICghdmFsdWVzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBcIiAgXCI7XG4gICAgICAgIGxldCB1bml0ID0gdmFsdWVzWzBdO1xuICAgICAgICBpZiAoIXVuaXQgfHwgL1xcUy8udGVzdCh1bml0KSB8fCBBcnJheS5mcm9tKHVuaXQpLnNvbWUoZSA9PiBlICE9IHVuaXRbMF0pKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbmRlbnQgdW5pdDogXCIgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZXNbMF0pKTtcbiAgICAgICAgcmV0dXJuIHVuaXQ7XG4gICAgfVxufSk7XG4vKipcblJldHVybiB0aGUgX2NvbHVtbiB3aWR0aF8gb2YgYW4gaW5kZW50IHVuaXQgaW4gdGhlIHN0YXRlLlxuRGV0ZXJtaW5lZCBieSB0aGUgW2BpbmRlbnRVbml0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRVbml0KVxuZmFjZXQsIGFuZCBbYHRhYlNpemVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRhYlNpemUpIHdoZW4gdGhhdFxuY29udGFpbnMgdGFicy5cbiovXG5mdW5jdGlvbiBnZXRJbmRlbnRVbml0KHN0YXRlKSB7XG4gICAgbGV0IHVuaXQgPSBzdGF0ZS5mYWNldChpbmRlbnRVbml0KTtcbiAgICByZXR1cm4gdW5pdC5jaGFyQ29kZUF0KDApID09IDkgPyBzdGF0ZS50YWJTaXplICogdW5pdC5sZW5ndGggOiB1bml0Lmxlbmd0aDtcbn1cbi8qKlxuQ3JlYXRlIGFuIGluZGVudGF0aW9uIHN0cmluZyB0aGF0IGNvdmVycyBjb2x1bW5zIDAgdG8gYGNvbHNgLlxuV2lsbCB1c2UgdGFicyBmb3IgYXMgbXVjaCBvZiB0aGUgY29sdW1ucyBhcyBwb3NzaWJsZSB3aGVuIHRoZVxuW2BpbmRlbnRVbml0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRVbml0KSBmYWNldCBjb250YWluc1xudGFicy5cbiovXG5mdW5jdGlvbiBpbmRlbnRTdHJpbmcoc3RhdGUsIGNvbHMpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIiwgdHMgPSBzdGF0ZS50YWJTaXplLCBjaCA9IHN0YXRlLmZhY2V0KGluZGVudFVuaXQpWzBdO1xuICAgIGlmIChjaCA9PSBcIlxcdFwiKSB7XG4gICAgICAgIHdoaWxlIChjb2xzID49IHRzKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gXCJcXHRcIjtcbiAgICAgICAgICAgIGNvbHMgLT0gdHM7XG4gICAgICAgIH1cbiAgICAgICAgY2ggPSBcIiBcIjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xzOyBpKyspXG4gICAgICAgIHJlc3VsdCArPSBjaDtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5HZXQgdGhlIGluZGVudGF0aW9uLCBhcyBhIGNvbHVtbiBudW1iZXIsIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi5cbldpbGwgZmlyc3QgY29uc3VsdCBhbnkgW2luZGVudCBzZXJ2aWNlc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRTZXJ2aWNlKVxudGhhdCBhcmUgcmVnaXN0ZXJlZCwgYW5kIGlmIG5vbmUgb2YgdGhvc2UgcmV0dXJuIGFuIGluZGVudGF0aW9uLFxudGhpcyB3aWxsIGNoZWNrIHRoZSBzeW50YXggdHJlZSBmb3IgdGhlIFtpbmRlbnQgbm9kZVxucHJvcF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnROb2RlUHJvcCkgYW5kIHVzZSB0aGF0IGlmIGZvdW5kLiBSZXR1cm5zIGFcbm51bWJlciB3aGVuIGFuIGluZGVudGF0aW9uIGNvdWxkIGJlIGRldGVybWluZWQsIGFuZCBudWxsXG5vdGhlcndpc2UuXG4qL1xuZnVuY3Rpb24gZ2V0SW5kZW50YXRpb24oY29udGV4dCwgcG9zKSB7XG4gICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBFZGl0b3JTdGF0ZSlcbiAgICAgICAgY29udGV4dCA9IG5ldyBJbmRlbnRDb250ZXh0KGNvbnRleHQpO1xuICAgIGZvciAobGV0IHNlcnZpY2Ugb2YgY29udGV4dC5zdGF0ZS5mYWNldChpbmRlbnRTZXJ2aWNlKSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gc2VydmljZShjb250ZXh0LCBwb3MpO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBsZXQgdHJlZSA9IHN5bnRheFRyZWUoY29udGV4dC5zdGF0ZSk7XG4gICAgcmV0dXJuIHRyZWUubGVuZ3RoID49IHBvcyA/IHN5bnRheEluZGVudGF0aW9uKGNvbnRleHQsIHRyZWUsIHBvcykgOiBudWxsO1xufVxuLyoqXG5DcmVhdGUgYSBjaGFuZ2Ugc2V0IHRoYXQgYXV0by1pbmRlbnRzIGFsbCBsaW5lcyB0b3VjaGVkIGJ5IHRoZVxuZ2l2ZW4gZG9jdW1lbnQgcmFuZ2UuXG4qL1xuZnVuY3Rpb24gaW5kZW50UmFuZ2Uoc3RhdGUsIGZyb20sIHRvKSB7XG4gICAgbGV0IHVwZGF0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjb250ZXh0ID0gbmV3IEluZGVudENvbnRleHQoc3RhdGUsIHsgb3ZlcnJpZGVJbmRlbnRhdGlvbjogc3RhcnQgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSB1cGRhdGVkW3N0YXJ0XSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogLTE7IH0gfSk7XG4gICAgbGV0IGNoYW5nZXMgPSBbXTtcbiAgICBmb3IgKGxldCBwb3MgPSBmcm9tOyBwb3MgPD0gdG87KSB7XG4gICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICBwb3MgPSBsaW5lLnRvICsgMTtcbiAgICAgICAgbGV0IGluZGVudCA9IGdldEluZGVudGF0aW9uKGNvbnRleHQsIGxpbmUuZnJvbSk7XG4gICAgICAgIGlmIChpbmRlbnQgPT0gbnVsbClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIS9cXFMvLnRlc3QobGluZS50ZXh0KSlcbiAgICAgICAgICAgIGluZGVudCA9IDA7XG4gICAgICAgIGxldCBjdXIgPSAvXlxccyovLmV4ZWMobGluZS50ZXh0KVswXTtcbiAgICAgICAgbGV0IG5vcm0gPSBpbmRlbnRTdHJpbmcoc3RhdGUsIGluZGVudCk7XG4gICAgICAgIGlmIChjdXIgIT0gbm9ybSkge1xuICAgICAgICAgICAgdXBkYXRlZFtsaW5lLmZyb21dID0gaW5kZW50O1xuICAgICAgICAgICAgY2hhbmdlcy5wdXNoKHsgZnJvbTogbGluZS5mcm9tLCB0bzogbGluZS5mcm9tICsgY3VyLmxlbmd0aCwgaW5zZXJ0OiBub3JtIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZS5jaGFuZ2VzKGNoYW5nZXMpO1xufVxuLyoqXG5JbmRlbnRhdGlvbiBjb250ZXh0cyBhcmUgdXNlZCB3aGVuIGNhbGxpbmcgW2luZGVudGF0aW9uXG5zZXJ2aWNlc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRTZXJ2aWNlKS4gVGhleSBwcm92aWRlIGhlbHBlciB1dGlsaXRpZXNcbnVzZWZ1bCBpbiBpbmRlbnRhdGlvbiBsb2dpYywgYW5kIGNhbiBzZWxlY3RpdmVseSBvdmVycmlkZSB0aGVcbmluZGVudGF0aW9uIHJlcG9ydGVkIGZvciBzb21lIGxpbmVzLlxuKi9cbmNsYXNzIEluZGVudENvbnRleHQge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBpbmRlbnQgY29udGV4dC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBzdGF0ZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLnVuaXQgPSBnZXRJbmRlbnRVbml0KHN0YXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgZGVzY3JpcHRpb24gb2YgdGhlIGxpbmUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCB0YWtpbmdcbiAgICBbc2ltdWxhdGVkIGxpbmVcbiAgICBicmVha3NdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuSW5kZW50Q29udGV4dC5jb25zdHJ1Y3Rvcl5vcHRpb25zLnNpbXVsYXRlQnJlYWspXG4gICAgaW50byBhY2NvdW50LiBJZiB0aGVyZSBpcyBzdWNoIGEgYnJlYWsgYXQgYHBvc2AsIHRoZSBgYmlhc2BcbiAgICBhcmd1bWVudCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhcnQgb2YgdGhlIGxpbmUgbGluZSBiZWZvcmUgb3JcbiAgICBhZnRlciB0aGUgYnJlYWsgaXMgdXNlZC5cbiAgICAqL1xuICAgIGxpbmVBdChwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5zdGF0ZS5kb2MubGluZUF0KHBvcyk7XG4gICAgICAgIGxldCB7IHNpbXVsYXRlQnJlYWssIHNpbXVsYXRlRG91YmxlQnJlYWsgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgaWYgKHNpbXVsYXRlQnJlYWsgIT0gbnVsbCAmJiBzaW11bGF0ZUJyZWFrID49IGxpbmUuZnJvbSAmJiBzaW11bGF0ZUJyZWFrIDw9IGxpbmUudG8pIHtcbiAgICAgICAgICAgIGlmIChzaW11bGF0ZURvdWJsZUJyZWFrICYmIHNpbXVsYXRlQnJlYWsgPT0gcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHRleHQ6IFwiXCIsIGZyb206IHBvcyB9O1xuICAgICAgICAgICAgZWxzZSBpZiAoYmlhcyA8IDAgPyBzaW11bGF0ZUJyZWFrIDwgcG9zIDogc2ltdWxhdGVCcmVhayA8PSBwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dDogbGluZS50ZXh0LnNsaWNlKHNpbXVsYXRlQnJlYWsgLSBsaW5lLmZyb20pLCBmcm9tOiBzaW11bGF0ZUJyZWFrIH07XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dDogbGluZS50ZXh0LnNsaWNlKDAsIHNpbXVsYXRlQnJlYWsgLSBsaW5lLmZyb20pLCBmcm9tOiBsaW5lLmZyb20gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSB0ZXh0IGRpcmVjdGx5IGFmdGVyIGBwb3NgLCBlaXRoZXIgdGhlIGVudGlyZSBsaW5lXG4gICAgb3IgdGhlIG5leHQgMTAwIGNoYXJhY3RlcnMsIHdoaWNoZXZlciBpcyBzaG9ydGVyLlxuICAgICovXG4gICAgdGV4dEFmdGVyUG9zKHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaW11bGF0ZURvdWJsZUJyZWFrICYmIHBvcyA9PSB0aGlzLm9wdGlvbnMuc2ltdWxhdGVCcmVhaylcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgeyB0ZXh0LCBmcm9tIH0gPSB0aGlzLmxpbmVBdChwb3MsIGJpYXMpO1xuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShwb3MgLSBmcm9tLCBNYXRoLm1pbih0ZXh0Lmxlbmd0aCwgcG9zICsgMTAwIC0gZnJvbSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBjb2x1bW4gZm9yIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGNvbHVtbihwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIGxldCB7IHRleHQsIGZyb20gfSA9IHRoaXMubGluZUF0KHBvcywgYmlhcyk7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmNvdW50Q29sdW1uKHRleHQsIHBvcyAtIGZyb20pO1xuICAgICAgICBsZXQgb3ZlcnJpZGUgPSB0aGlzLm9wdGlvbnMub3ZlcnJpZGVJbmRlbnRhdGlvbiA/IHRoaXMub3B0aW9ucy5vdmVycmlkZUluZGVudGF0aW9uKGZyb20pIDogLTE7XG4gICAgICAgIGlmIChvdmVycmlkZSA+IC0xKVxuICAgICAgICAgICAgcmVzdWx0ICs9IG92ZXJyaWRlIC0gdGhpcy5jb3VudENvbHVtbih0ZXh0LCB0ZXh0LnNlYXJjaCgvXFxTfCQvKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGNvbHVtbiBwb3NpdGlvbiAodGFraW5nIHRhYnMgaW50byBhY2NvdW50KSBvZiB0aGUgZ2l2ZW5cbiAgICBwb3NpdGlvbiBpbiB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgICovXG4gICAgY291bnRDb2x1bW4obGluZSwgcG9zID0gbGluZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGNvdW50Q29sdW1uKGxpbmUsIHRoaXMuc3RhdGUudGFiU2l6ZSwgcG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgaW5kZW50YXRpb24gY29sdW1uIG9mIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiBwb2ludC5cbiAgICAqL1xuICAgIGxpbmVJbmRlbnQocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBsZXQgeyB0ZXh0LCBmcm9tIH0gPSB0aGlzLmxpbmVBdChwb3MsIGJpYXMpO1xuICAgICAgICBsZXQgb3ZlcnJpZGUgPSB0aGlzLm9wdGlvbnMub3ZlcnJpZGVJbmRlbnRhdGlvbjtcbiAgICAgICAgaWYgKG92ZXJyaWRlKSB7XG4gICAgICAgICAgICBsZXQgb3ZlcnJpZGVuID0gb3ZlcnJpZGUoZnJvbSk7XG4gICAgICAgICAgICBpZiAob3ZlcnJpZGVuID4gLTEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb3VudENvbHVtbih0ZXh0LCB0ZXh0LnNlYXJjaCgvXFxTfCQvKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdGhlIFtzaW11bGF0ZWQgbGluZVxuICAgIGJyZWFrXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkluZGVudENvbnRleHQuY29uc3RydWN0b3Jeb3B0aW9ucy5zaW11bGF0ZUJyZWFrKVxuICAgIGZvciB0aGlzIGNvbnRleHQsIGlmIGFueS5cbiAgICAqL1xuICAgIGdldCBzaW11bGF0ZWRCcmVhaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zaW11bGF0ZUJyZWFrIHx8IG51bGw7XG4gICAgfVxufVxuLyoqXG5BIHN5bnRheCB0cmVlIG5vZGUgcHJvcCB1c2VkIHRvIGFzc29jaWF0ZSBpbmRlbnRhdGlvbiBzdHJhdGVnaWVzXG53aXRoIG5vZGUgdHlwZXMuIFN1Y2ggYSBzdHJhdGVneSBpcyBhIGZ1bmN0aW9uIGZyb20gYW4gaW5kZW50YXRpb25cbmNvbnRleHQgdG8gYSBjb2x1bW4gbnVtYmVyIChzZWUgYWxzb1xuW2BpbmRlbnRTdHJpbmdgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudFN0cmluZykpIG9yIG51bGwsIHdoZXJlIG51bGxcbmluZGljYXRlcyB0aGF0IG5vIGRlZmluaXRpdmUgaW5kZW50YXRpb24gY2FuIGJlIGRldGVybWluZWQuXG4qL1xuY29uc3QgaW5kZW50Tm9kZVByb3AgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG4vLyBDb21wdXRlIHRoZSBpbmRlbnRhdGlvbiBmb3IgYSBnaXZlbiBwb3NpdGlvbiBmcm9tIHRoZSBzeW50YXggdHJlZS5cbmZ1bmN0aW9uIHN5bnRheEluZGVudGF0aW9uKGN4LCBhc3QsIHBvcykge1xuICAgIGxldCBzdGFjayA9IGFzdC5yZXNvbHZlU3RhY2socG9zKTtcbiAgICBsZXQgaW5uZXIgPSBhc3QucmVzb2x2ZUlubmVyKHBvcywgLTEpLnJlc29sdmUocG9zLCAwKS5lbnRlclVuZmluaXNoZWROb2Rlc0JlZm9yZShwb3MpO1xuICAgIGlmIChpbm5lciAhPSBzdGFjay5ub2RlKSB7XG4gICAgICAgIGxldCBhZGQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gaW5uZXI7IGN1ciAmJiAhKGN1ci5mcm9tID09IHN0YWNrLm5vZGUuZnJvbSAmJiBjdXIudHlwZSA9PSBzdGFjay5ub2RlLnR5cGUpOyBjdXIgPSBjdXIucGFyZW50KVxuICAgICAgICAgICAgYWRkLnB1c2goY3VyKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFkZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgIHN0YWNrID0geyBub2RlOiBhZGRbaV0sIG5leHQ6IHN0YWNrIH07XG4gICAgfVxuICAgIHJldHVybiBpbmRlbnRGb3Ioc3RhY2ssIGN4LCBwb3MpO1xufVxuZnVuY3Rpb24gaW5kZW50Rm9yKHN0YWNrLCBjeCwgcG9zKSB7XG4gICAgZm9yIChsZXQgY3VyID0gc3RhY2s7IGN1cjsgY3VyID0gY3VyLm5leHQpIHtcbiAgICAgICAgbGV0IHN0cmF0ZWd5ID0gaW5kZW50U3RyYXRlZ3koY3VyLm5vZGUpO1xuICAgICAgICBpZiAoc3RyYXRlZ3kpXG4gICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3koVHJlZUluZGVudENvbnRleHQuY3JlYXRlKGN4LCBwb3MsIGN1cikpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGlnbm9yZUNsb3NlZChjeCkge1xuICAgIHJldHVybiBjeC5wb3MgPT0gY3gub3B0aW9ucy5zaW11bGF0ZUJyZWFrICYmIGN4Lm9wdGlvbnMuc2ltdWxhdGVEb3VibGVCcmVhaztcbn1cbmZ1bmN0aW9uIGluZGVudFN0cmF0ZWd5KHRyZWUpIHtcbiAgICBsZXQgc3RyYXRlZ3kgPSB0cmVlLnR5cGUucHJvcChpbmRlbnROb2RlUHJvcCk7XG4gICAgaWYgKHN0cmF0ZWd5KVxuICAgICAgICByZXR1cm4gc3RyYXRlZ3k7XG4gICAgbGV0IGZpcnN0ID0gdHJlZS5maXJzdENoaWxkLCBjbG9zZTtcbiAgICBpZiAoZmlyc3QgJiYgKGNsb3NlID0gZmlyc3QudHlwZS5wcm9wKE5vZGVQcm9wLmNsb3NlZEJ5KSkpIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0cmVlLmxhc3RDaGlsZCwgY2xvc2VkID0gbGFzdCAmJiBjbG9zZS5pbmRleE9mKGxhc3QubmFtZSkgPiAtMTtcbiAgICAgICAgcmV0dXJuIGN4ID0+IGRlbGltaXRlZFN0cmF0ZWd5KGN4LCB0cnVlLCAxLCB1bmRlZmluZWQsIGNsb3NlZCAmJiAhaWdub3JlQ2xvc2VkKGN4KSA/IGxhc3QuZnJvbSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0cmVlLnBhcmVudCA9PSBudWxsID8gdG9wSW5kZW50IDogbnVsbDtcbn1cbmZ1bmN0aW9uIHRvcEluZGVudCgpIHsgcmV0dXJuIDA7IH1cbi8qKlxuT2JqZWN0cyBvZiB0aGlzIHR5cGUgcHJvdmlkZSBjb250ZXh0IGluZm9ybWF0aW9uIGFuZCBoZWxwZXJcbm1ldGhvZHMgdG8gaW5kZW50YXRpb24gZnVuY3Rpb25zIHJlZ2lzdGVyZWQgb24gc3ludGF4IG5vZGVzLlxuKi9cbmNsYXNzIFRyZWVJbmRlbnRDb250ZXh0IGV4dGVuZHMgSW5kZW50Q29udGV4dCB7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHdoaWNoIGluZGVudGF0aW9uIGlzIGJlaW5nIGNvbXB1dGVkLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoYmFzZS5zdGF0ZSwgYmFzZS5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzeW50YXggdHJlZSBub2RlIHRvIHdoaWNoIHRoZSBpbmRlbnRhdGlvbiBzdHJhdGVneVxuICAgIGFwcGxpZXMuXG4gICAgKi9cbiAgICBnZXQgbm9kZSgpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5ub2RlOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGJhc2UsIHBvcywgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyZWVJbmRlbnRDb250ZXh0KGJhc2UsIHBvcywgY29udGV4dCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdGV4dCBkaXJlY3RseSBhZnRlciBgdGhpcy5wb3NgLCBlaXRoZXIgdGhlIGVudGlyZSBsaW5lXG4gICAgb3IgdGhlIG5leHQgMTAwIGNoYXJhY3RlcnMsIHdoaWNoZXZlciBpcyBzaG9ydGVyLlxuICAgICovXG4gICAgZ2V0IHRleHRBZnRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dEFmdGVyUG9zKHRoaXMucG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBpbmRlbnRhdGlvbiBhdCB0aGUgcmVmZXJlbmNlIGxpbmUgZm9yIGB0aGlzLm5vZGVgLCB3aGljaFxuICAgIGlzIHRoZSBsaW5lIG9uIHdoaWNoIGl0IHN0YXJ0cywgdW5sZXNzIHRoZXJlIGlzIGEgbm9kZSB0aGF0IGlzXG4gICAgX25vdF8gYSBwYXJlbnQgb2YgdGhpcyBub2RlIGNvdmVyaW5nIHRoZSBzdGFydCBvZiB0aGF0IGxpbmUuIElmXG4gICAgc28sIHRoZSBsaW5lIGF0IHRoZSBzdGFydCBvZiB0aGF0IG5vZGUgaXMgdHJpZWQsIGFnYWluIHNraXBwaW5nXG4gICAgb24gaWYgaXQgaXMgY292ZXJlZCBieSBhbm90aGVyIHN1Y2ggbm9kZS5cbiAgICAqL1xuICAgIGdldCBiYXNlSW5kZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlSW5kZW50Rm9yKHRoaXMubm9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgaW5kZW50YXRpb24gZm9yIHRoZSByZWZlcmVuY2UgbGluZSBvZiB0aGUgZ2l2ZW4gbm9kZVxuICAgIChzZWUgW2BiYXNlSW5kZW50YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5UcmVlSW5kZW50Q29udGV4dC5iYXNlSW5kZW50KSkuXG4gICAgKi9cbiAgICBiYXNlSW5kZW50Rm9yKG5vZGUpIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQobm9kZS5mcm9tKTtcbiAgICAgICAgLy8gU2tpcCBsaW5lIHN0YXJ0cyB0aGF0IGFyZSBjb3ZlcmVkIGJ5IGEgc2libGluZyAob3IgY291c2luLCBldGMpXG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBhdEJyZWFrID0gbm9kZS5yZXNvbHZlKGxpbmUuZnJvbSk7XG4gICAgICAgICAgICB3aGlsZSAoYXRCcmVhay5wYXJlbnQgJiYgYXRCcmVhay5wYXJlbnQuZnJvbSA9PSBhdEJyZWFrLmZyb20pXG4gICAgICAgICAgICAgICAgYXRCcmVhayA9IGF0QnJlYWsucGFyZW50O1xuICAgICAgICAgICAgaWYgKGlzUGFyZW50KGF0QnJlYWssIG5vZGUpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGluZSA9IHRoaXMuc3RhdGUuZG9jLmxpbmVBdChhdEJyZWFrLmZyb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVJbmRlbnQobGluZS5mcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udGludWUgbG9va2luZyBmb3IgaW5kZW50YXRpb25zIGluIHRoZSBub2RlJ3MgcGFyZW50IG5vZGVzLFxuICAgIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGF0LlxuICAgICovXG4gICAgY29udGludWUoKSB7XG4gICAgICAgIHJldHVybiBpbmRlbnRGb3IodGhpcy5jb250ZXh0Lm5leHQsIHRoaXMuYmFzZSwgdGhpcy5wb3MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzUGFyZW50KHBhcmVudCwgb2YpIHtcbiAgICBmb3IgKGxldCBjdXIgPSBvZjsgY3VyOyBjdXIgPSBjdXIucGFyZW50KVxuICAgICAgICBpZiAocGFyZW50ID09IGN1cilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIENoZWNrIHdoZXRoZXIgYSBkZWxpbWl0ZWQgbm9kZSBpcyBhbGlnbmVkIChtZWFuaW5nIHRoZXJlIGFyZVxuLy8gbm9uLXNraXBwZWQgbm9kZXMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgb3BlbmluZyBkZWxpbWl0ZXIpLiBBbmRcbi8vIGlmIHNvLCByZXR1cm4gdGhlIG9wZW5pbmcgdG9rZW4uXG5mdW5jdGlvbiBicmFja2V0ZWRBbGlnbmVkKGNvbnRleHQpIHtcbiAgICBsZXQgdHJlZSA9IGNvbnRleHQubm9kZTtcbiAgICBsZXQgb3BlblRva2VuID0gdHJlZS5jaGlsZEFmdGVyKHRyZWUuZnJvbSksIGxhc3QgPSB0cmVlLmxhc3RDaGlsZDtcbiAgICBpZiAoIW9wZW5Ub2tlbilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHNpbSA9IGNvbnRleHQub3B0aW9ucy5zaW11bGF0ZUJyZWFrO1xuICAgIGxldCBvcGVuTGluZSA9IGNvbnRleHQuc3RhdGUuZG9jLmxpbmVBdChvcGVuVG9rZW4uZnJvbSk7XG4gICAgbGV0IGxpbmVFbmQgPSBzaW0gPT0gbnVsbCB8fCBzaW0gPD0gb3BlbkxpbmUuZnJvbSA/IG9wZW5MaW5lLnRvIDogTWF0aC5taW4ob3BlbkxpbmUudG8sIHNpbSk7XG4gICAgZm9yIChsZXQgcG9zID0gb3BlblRva2VuLnRvOzspIHtcbiAgICAgICAgbGV0IG5leHQgPSB0cmVlLmNoaWxkQWZ0ZXIocG9zKTtcbiAgICAgICAgaWYgKCFuZXh0IHx8IG5leHQgPT0gbGFzdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIW5leHQudHlwZS5pc1NraXBwZWQpIHtcbiAgICAgICAgICAgIGlmIChuZXh0LmZyb20gPj0gbGluZUVuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGxldCBzcGFjZSA9IC9eICovLmV4ZWMob3BlbkxpbmUudGV4dC5zbGljZShvcGVuVG9rZW4udG8gLSBvcGVuTGluZS5mcm9tKSlbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogb3BlblRva2VuLmZyb20sIHRvOiBvcGVuVG9rZW4udG8gKyBzcGFjZSB9O1xuICAgICAgICB9XG4gICAgICAgIHBvcyA9IG5leHQudG87XG4gICAgfVxufVxuLyoqXG5BbiBpbmRlbnRhdGlvbiBzdHJhdGVneSBmb3IgZGVsaW1pdGVkICh1c3VhbGx5IGJyYWNrZXRlZCkgbm9kZXMuXG5XaWxsLCBieSBkZWZhdWx0LCBpbmRlbnQgb25lIHVuaXQgbW9yZSB0aGFuIHRoZSBwYXJlbnQncyBiYXNlXG5pbmRlbnQgdW5sZXNzIHRoZSBsaW5lIHN0YXJ0cyB3aXRoIGEgY2xvc2luZyB0b2tlbi4gV2hlbiBgYWxpZ25gXG5pcyB0cnVlIGFuZCB0aGVyZSBhcmUgbm9uLXNraXBwZWQgbm9kZXMgb24gdGhlIG5vZGUncyBvcGVuaW5nXG5saW5lLCB0aGUgY29udGVudCBvZiB0aGUgbm9kZSB3aWxsIGJlIGFsaWduZWQgd2l0aCB0aGUgZW5kIG9mIHRoZVxub3BlbmluZyBub2RlLCBsaWtlIHRoaXM6XG5cbiAgICBmb28oYmFyLFxuICAgICAgICBiYXopXG4qL1xuZnVuY3Rpb24gZGVsaW1pdGVkSW5kZW50KHsgY2xvc2luZywgYWxpZ24gPSB0cnVlLCB1bml0cyA9IDEgfSkge1xuICAgIHJldHVybiAoY29udGV4dCkgPT4gZGVsaW1pdGVkU3RyYXRlZ3koY29udGV4dCwgYWxpZ24sIHVuaXRzLCBjbG9zaW5nKTtcbn1cbmZ1bmN0aW9uIGRlbGltaXRlZFN0cmF0ZWd5KGNvbnRleHQsIGFsaWduLCB1bml0cywgY2xvc2luZywgY2xvc2VkQXQpIHtcbiAgICBsZXQgYWZ0ZXIgPSBjb250ZXh0LnRleHRBZnRlciwgc3BhY2UgPSBhZnRlci5tYXRjaCgvXlxccyovKVswXS5sZW5ndGg7XG4gICAgbGV0IGNsb3NlZCA9IGNsb3NpbmcgJiYgYWZ0ZXIuc2xpY2Uoc3BhY2UsIHNwYWNlICsgY2xvc2luZy5sZW5ndGgpID09IGNsb3NpbmcgfHwgY2xvc2VkQXQgPT0gY29udGV4dC5wb3MgKyBzcGFjZTtcbiAgICBsZXQgYWxpZ25lZCA9IGFsaWduID8gYnJhY2tldGVkQWxpZ25lZChjb250ZXh0KSA6IG51bGw7XG4gICAgaWYgKGFsaWduZWQpXG4gICAgICAgIHJldHVybiBjbG9zZWQgPyBjb250ZXh0LmNvbHVtbihhbGlnbmVkLmZyb20pIDogY29udGV4dC5jb2x1bW4oYWxpZ25lZC50byk7XG4gICAgcmV0dXJuIGNvbnRleHQuYmFzZUluZGVudCArIChjbG9zZWQgPyAwIDogY29udGV4dC51bml0ICogdW5pdHMpO1xufVxuLyoqXG5BbiBpbmRlbnRhdGlvbiBzdHJhdGVneSB0aGF0IGFsaWducyBhIG5vZGUncyBjb250ZW50IHRvIGl0cyBiYXNlXG5pbmRlbnRhdGlvbi5cbiovXG5jb25zdCBmbGF0SW5kZW50ID0gKGNvbnRleHQpID0+IGNvbnRleHQuYmFzZUluZGVudDtcbi8qKlxuQ3JlYXRlcyBhbiBpbmRlbnRhdGlvbiBzdHJhdGVneSB0aGF0LCBieSBkZWZhdWx0LCBpbmRlbnRzXG5jb250aW51ZWQgbGluZXMgb25lIHVuaXQgbW9yZSB0aGFuIHRoZSBub2RlJ3MgYmFzZSBpbmRlbnRhdGlvbi5cbllvdSBjYW4gcHJvdmlkZSBgZXhjZXB0YCB0byBwcmV2ZW50IGluZGVudGF0aW9uIG9mIGxpbmVzIHRoYXRcbm1hdGNoIGEgcGF0dGVybiAoZm9yIGV4YW1wbGUgYC9eZWxzZVxcYi9gIGluIGBpZmAvYGVsc2VgXG5jb25zdHJ1Y3RzKSwgYW5kIHlvdSBjYW4gY2hhbmdlIHRoZSBhbW91bnQgb2YgdW5pdHMgdXNlZCB3aXRoIHRoZVxuYHVuaXRzYCBvcHRpb24uXG4qL1xuZnVuY3Rpb24gY29udGludWVkSW5kZW50KHsgZXhjZXB0LCB1bml0cyA9IDEgfSA9IHt9KSB7XG4gICAgcmV0dXJuIChjb250ZXh0KSA9PiB7XG4gICAgICAgIGxldCBtYXRjaEV4Y2VwdCA9IGV4Y2VwdCAmJiBleGNlcHQudGVzdChjb250ZXh0LnRleHRBZnRlcik7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmJhc2VJbmRlbnQgKyAobWF0Y2hFeGNlcHQgPyAwIDogdW5pdHMgKiBjb250ZXh0LnVuaXQpO1xuICAgIH07XG59XG5jb25zdCBEb250SW5kZW50QmV5b25kID0gMjAwO1xuLyoqXG5FbmFibGVzIHJlaW5kZW50YXRpb24gb24gaW5wdXQuIFdoZW4gYSBsYW5ndWFnZSBkZWZpbmVzIGFuXG5gaW5kZW50T25JbnB1dGAgZmllbGQgaW4gaXRzIFtsYW5ndWFnZVxuZGF0YV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGFBdCksIHdoaWNoIG11c3QgaG9sZCBhIHJlZ3VsYXJcbmV4cHJlc3Npb24sIHRoZSBsaW5lIGF0IHRoZSBjdXJzb3Igd2lsbCBiZSByZWluZGVudGVkIHdoZW5ldmVyIG5ld1xudGV4dCBpcyB0eXBlZCBhbmQgdGhlIGlucHV0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHVwIHRvIHRoZVxuY3Vyc29yIG1hdGNoZXMgdGhhdCByZWdleHAuXG5cblRvIGF2b2lkIHVubmVjY2VzYXJ5IHJlaW5kZW50cywgaXQgaXMgcmVjb21tZW5kZWQgdG8gc3RhcnQgdGhlXG5yZWdleHAgd2l0aCBgXmAgKHVzdWFsbHkgZm9sbG93ZWQgYnkgYFxccypgKSwgYW5kIGVuZCBpdCB3aXRoIGAkYC5cbkZvciBleGFtcGxlLCBgL15cXHMqXFx9JC9gIHdpbGwgcmVpbmRlbnQgd2hlbiBhIGNsb3NpbmcgYnJhY2UgaXNcbmFkZGVkIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuXG4qL1xuZnVuY3Rpb24gaW5kZW50T25JbnB1dCgpIHtcbiAgICByZXR1cm4gRWRpdG9yU3RhdGUudHJhbnNhY3Rpb25GaWx0ZXIub2YodHIgPT4ge1xuICAgICAgICBpZiAoIXRyLmRvY0NoYW5nZWQgfHwgIXRyLmlzVXNlckV2ZW50KFwiaW5wdXQudHlwZVwiKSAmJiAhdHIuaXNVc2VyRXZlbnQoXCJpbnB1dC5jb21wbGV0ZVwiKSlcbiAgICAgICAgICAgIHJldHVybiB0cjtcbiAgICAgICAgbGV0IHJ1bGVzID0gdHIuc3RhcnRTdGF0ZS5sYW5ndWFnZURhdGFBdChcImluZGVudE9uSW5wdXRcIiwgdHIuc3RhcnRTdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkKTtcbiAgICAgICAgaWYgKCFydWxlcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIGxldCBkb2MgPSB0ci5uZXdEb2MsIHsgaGVhZCB9ID0gdHIubmV3U2VsZWN0aW9uLm1haW4sIGxpbmUgPSBkb2MubGluZUF0KGhlYWQpO1xuICAgICAgICBpZiAoaGVhZCA+IGxpbmUuZnJvbSArIERvbnRJbmRlbnRCZXlvbmQpXG4gICAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIGxldCBsaW5lU3RhcnQgPSBkb2Muc2xpY2VTdHJpbmcobGluZS5mcm9tLCBoZWFkKTtcbiAgICAgICAgaWYgKCFydWxlcy5zb21lKHIgPT4gci50ZXN0KGxpbmVTdGFydCkpKVxuICAgICAgICAgICAgcmV0dXJuIHRyO1xuICAgICAgICBsZXQgeyBzdGF0ZSB9ID0gdHIsIGxhc3QgPSAtMSwgY2hhbmdlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB7IGhlYWQgfSBvZiBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQoaGVhZCk7XG4gICAgICAgICAgICBpZiAobGluZS5mcm9tID09IGxhc3QpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBsYXN0ID0gbGluZS5mcm9tO1xuICAgICAgICAgICAgbGV0IGluZGVudCA9IGdldEluZGVudGF0aW9uKHN0YXRlLCBsaW5lLmZyb20pO1xuICAgICAgICAgICAgaWYgKGluZGVudCA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGN1ciA9IC9eXFxzKi8uZXhlYyhsaW5lLnRleHQpWzBdO1xuICAgICAgICAgICAgbGV0IG5vcm0gPSBpbmRlbnRTdHJpbmcoc3RhdGUsIGluZGVudCk7XG4gICAgICAgICAgICBpZiAoY3VyICE9IG5vcm0pXG4gICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKHsgZnJvbTogbGluZS5mcm9tLCB0bzogbGluZS5mcm9tICsgY3VyLmxlbmd0aCwgaW5zZXJ0OiBub3JtIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VzLmxlbmd0aCA/IFt0ciwgeyBjaGFuZ2VzLCBzZXF1ZW50aWFsOiB0cnVlIH1dIDogdHI7XG4gICAgfSk7XG59XG5cbi8qKlxuQSBmYWNldCB0aGF0IHJlZ2lzdGVycyBhIGNvZGUgZm9sZGluZyBzZXJ2aWNlLiBXaGVuIGNhbGxlZCB3aXRoXG50aGUgZXh0ZW50IG9mIGEgbGluZSwgc3VjaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBmb2xkYWJsZVxucmFuZ2UgdGhhdCBzdGFydHMgb24gdGhhdCBsaW5lIChidXQgY29udGludWVzIGJleW9uZCBpdCksIGlmIG9uZVxuY2FuIGJlIGZvdW5kLlxuKi9cbmNvbnN0IGZvbGRTZXJ2aWNlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5UaGlzIG5vZGUgcHJvcCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBmb2xkaW5nIGluZm9ybWF0aW9uIHdpdGhcbnN5bnRheCBub2RlIHR5cGVzLiBHaXZlbiBhIHN5bnRheCBub2RlLCBpdCBzaG91bGQgY2hlY2sgd2hldGhlclxudGhhdCB0cmVlIGlzIGZvbGRhYmxlIGFuZCByZXR1cm4gdGhlIHJhbmdlIHRoYXQgY2FuIGJlIGNvbGxhcHNlZFxud2hlbiBpdCBpcy5cbiovXG5jb25zdCBmb2xkTm9kZVByb3AgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG4vKipcbltGb2xkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGROb2RlUHJvcCkgZnVuY3Rpb24gdGhhdCBmb2xkcyBldmVyeXRoaW5nIGJ1dFxudGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBjaGlsZCBvZiBhIHN5bnRheCBub2RlLiBVc2VmdWwgZm9yIG5vZGVzXG50aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCBkZWxpbWl0ZXJzLlxuKi9cbmZ1bmN0aW9uIGZvbGRJbnNpZGUobm9kZSkge1xuICAgIGxldCBmaXJzdCA9IG5vZGUuZmlyc3RDaGlsZCwgbGFzdCA9IG5vZGUubGFzdENoaWxkO1xuICAgIHJldHVybiBmaXJzdCAmJiBmaXJzdC50byA8IGxhc3QuZnJvbSA/IHsgZnJvbTogZmlyc3QudG8sIHRvOiBsYXN0LnR5cGUuaXNFcnJvciA/IG5vZGUudG8gOiBsYXN0LmZyb20gfSA6IG51bGw7XG59XG5mdW5jdGlvbiBzeW50YXhGb2xkaW5nKHN0YXRlLCBzdGFydCwgZW5kKSB7XG4gICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKHN0YXRlKTtcbiAgICBpZiAodHJlZS5sZW5ndGggPCBlbmQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBzdGFjayA9IHRyZWUucmVzb2x2ZVN0YWNrKGVuZCwgMSk7XG4gICAgbGV0IGZvdW5kID0gbnVsbDtcbiAgICBmb3IgKGxldCBpdGVyID0gc3RhY2s7IGl0ZXI7IGl0ZXIgPSBpdGVyLm5leHQpIHtcbiAgICAgICAgbGV0IGN1ciA9IGl0ZXIubm9kZTtcbiAgICAgICAgaWYgKGN1ci50byA8PSBlbmQgfHwgY3VyLmZyb20gPiBlbmQpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKGZvdW5kICYmIGN1ci5mcm9tIDwgc3RhcnQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IHByb3AgPSBjdXIudHlwZS5wcm9wKGZvbGROb2RlUHJvcCk7XG4gICAgICAgIGlmIChwcm9wICYmIChjdXIudG8gPCB0cmVlLmxlbmd0aCAtIDUwIHx8IHRyZWUubGVuZ3RoID09IHN0YXRlLmRvYy5sZW5ndGggfHwgIWlzVW5maW5pc2hlZChjdXIpKSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gcHJvcChjdXIsIHN0YXRlKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5mcm9tIDw9IGVuZCAmJiB2YWx1ZS5mcm9tID49IHN0YXJ0ICYmIHZhbHVlLnRvID4gZW5kKVxuICAgICAgICAgICAgICAgIGZvdW5kID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuZnVuY3Rpb24gaXNVbmZpbmlzaGVkKG5vZGUpIHtcbiAgICBsZXQgY2ggPSBub2RlLmxhc3RDaGlsZDtcbiAgICByZXR1cm4gY2ggJiYgY2gudG8gPT0gbm9kZS50byAmJiBjaC50eXBlLmlzRXJyb3I7XG59XG4vKipcbkNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGxpbmUgaXMgZm9sZGFibGUuIEZpcnN0IGFza3MgYW55IGZvbGRcbnNlcnZpY2VzIHJlZ2lzdGVyZWQgdGhyb3VnaFxuW2Bmb2xkU2VydmljZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZFNlcnZpY2UpLCBhbmQgaWYgbm9uZSBvZiB0aGVtIHJldHVyblxuYSByZXN1bHQsIHRyaWVzIHRvIHF1ZXJ5IHRoZSBbZm9sZCBub2RlXG5wcm9wXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGROb2RlUHJvcCkgb2Ygc3ludGF4IG5vZGVzIHRoYXQgY292ZXIgdGhlIGVuZFxub2YgdGhlIGxpbmUuXG4qL1xuZnVuY3Rpb24gZm9sZGFibGUoc3RhdGUsIGxpbmVTdGFydCwgbGluZUVuZCkge1xuICAgIGZvciAobGV0IHNlcnZpY2Ugb2Ygc3RhdGUuZmFjZXQoZm9sZFNlcnZpY2UpKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBzZXJ2aWNlKHN0YXRlLCBsaW5lU3RhcnQsIGxpbmVFbmQpO1xuICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHN5bnRheEZvbGRpbmcoc3RhdGUsIGxpbmVTdGFydCwgbGluZUVuZCk7XG59XG5mdW5jdGlvbiBtYXBSYW5nZShyYW5nZSwgbWFwcGluZykge1xuICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBQb3MocmFuZ2UuZnJvbSwgMSksIHRvID0gbWFwcGluZy5tYXBQb3MocmFuZ2UudG8sIC0xKTtcbiAgICByZXR1cm4gZnJvbSA+PSB0byA/IHVuZGVmaW5lZCA6IHsgZnJvbSwgdG8gfTtcbn1cbi8qKlxuU3RhdGUgZWZmZWN0IHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEgdHJhbnNhY3Rpb24gdG8gZm9sZCB0aGVcbmdpdmVuIHJhbmdlLiAoWW91IHByb2JhYmx5IG9ubHkgbmVlZCB0aGlzIGluIGV4Y2VwdGlvbmFsXG5jaXJjdW1zdGFuY2VzXHUyMDE0dXN1YWxseSB5b3UnbGwganVzdCB3YW50IHRvIGxldFxuW2Bmb2xkQ29kZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZENvZGUpIGFuZCB0aGUgW2ZvbGRcbmd1dHRlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkR3V0dGVyKSBjcmVhdGUgdGhlIHRyYW5zYWN0aW9ucy4pXG4qL1xuY29uc3QgZm9sZEVmZmVjdCA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoeyBtYXA6IG1hcFJhbmdlIH0pO1xuLyoqXG5TdGF0ZSBlZmZlY3QgdGhhdCB1bmZvbGRzIHRoZSBnaXZlbiByYW5nZSAoaWYgaXQgd2FzIGZvbGRlZCkuXG4qL1xuY29uc3QgdW5mb2xkRWZmZWN0ID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSh7IG1hcDogbWFwUmFuZ2UgfSk7XG5mdW5jdGlvbiBzZWxlY3RlZExpbmVzKHZpZXcpIHtcbiAgICBsZXQgbGluZXMgPSBbXTtcbiAgICBmb3IgKGxldCB7IGhlYWQgfSBvZiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgaWYgKGxpbmVzLnNvbWUobCA9PiBsLmZyb20gPD0gaGVhZCAmJiBsLnRvID49IGhlYWQpKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGxpbmVzLnB1c2godmlldy5saW5lQmxvY2tBdChoZWFkKSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbn1cbi8qKlxuVGhlIHN0YXRlIGZpZWxkIHRoYXQgc3RvcmVzIHRoZSBmb2xkZWQgcmFuZ2VzIChhcyBhIFtkZWNvcmF0aW9uXG5zZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uU2V0KSkuIENhbiBiZSBwYXNzZWQgdG9cbltgRWRpdG9yU3RhdGUudG9KU09OYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS50b0pTT04pIGFuZFxuW2Bmcm9tSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVeZnJvbUpTT04pIHRvIHNlcmlhbGl6ZSB0aGUgZm9sZFxuc3RhdGUuXG4qL1xuY29uc3QgZm9sZFN0YXRlID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgfSxcbiAgICB1cGRhdGUoZm9sZGVkLCB0cikge1xuICAgICAgICBmb2xkZWQgPSBmb2xkZWQubWFwKHRyLmNoYW5nZXMpO1xuICAgICAgICBmb3IgKGxldCBlIG9mIHRyLmVmZmVjdHMpIHtcbiAgICAgICAgICAgIGlmIChlLmlzKGZvbGRFZmZlY3QpICYmICFmb2xkRXhpc3RzKGZvbGRlZCwgZS52YWx1ZS5mcm9tLCBlLnZhbHVlLnRvKSkge1xuICAgICAgICAgICAgICAgIGxldCB7IHByZXBhcmVQbGFjZWhvbGRlciB9ID0gdHIuc3RhdGUuZmFjZXQoZm9sZENvbmZpZyk7XG4gICAgICAgICAgICAgICAgbGV0IHdpZGdldCA9ICFwcmVwYXJlUGxhY2Vob2xkZXIgPyBmb2xkV2lkZ2V0IDpcbiAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGlvbi5yZXBsYWNlKHsgd2lkZ2V0OiBuZXcgUHJlcGFyZWRGb2xkV2lkZ2V0KHByZXBhcmVQbGFjZWhvbGRlcih0ci5zdGF0ZSwgZS52YWx1ZSkpIH0pO1xuICAgICAgICAgICAgICAgIGZvbGRlZCA9IGZvbGRlZC51cGRhdGUoeyBhZGQ6IFt3aWRnZXQucmFuZ2UoZS52YWx1ZS5mcm9tLCBlLnZhbHVlLnRvKV0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlLmlzKHVuZm9sZEVmZmVjdCkpIHtcbiAgICAgICAgICAgICAgICBmb2xkZWQgPSBmb2xkZWQudXBkYXRlKHsgZmlsdGVyOiAoZnJvbSwgdG8pID0+IGUudmFsdWUuZnJvbSAhPSBmcm9tIHx8IGUudmFsdWUudG8gIT0gdG8sXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckZyb206IGUudmFsdWUuZnJvbSwgZmlsdGVyVG86IGUudmFsdWUudG8gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXIgZm9sZGVkIHJhbmdlcyB0aGF0IGNvdmVyIHRoZSBzZWxlY3Rpb24gaGVhZFxuICAgICAgICBpZiAodHIuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgb25TZWxlY3Rpb24gPSBmYWxzZSwgeyBoZWFkIH0gPSB0ci5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgICAgIGZvbGRlZC5iZXR3ZWVuKGhlYWQsIGhlYWQsIChhLCBiKSA9PiB7IGlmIChhIDwgaGVhZCAmJiBiID4gaGVhZClcbiAgICAgICAgICAgICAgICBvblNlbGVjdGlvbiA9IHRydWU7IH0pO1xuICAgICAgICAgICAgaWYgKG9uU2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgIGZvbGRlZCA9IGZvbGRlZC51cGRhdGUoe1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGcm9tOiBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJUbzogaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiAoYSwgYikgPT4gYiA8PSBoZWFkIHx8IGEgPj0gaGVhZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb2xkZWQ7XG4gICAgfSxcbiAgICBwcm92aWRlOiBmID0+IEVkaXRvclZpZXcuZGVjb3JhdGlvbnMuZnJvbShmKSxcbiAgICB0b0pTT04oZm9sZGVkLCBzdGF0ZSkge1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgIGZvbGRlZC5iZXR3ZWVuKDAsIHN0YXRlLmRvYy5sZW5ndGgsIChmcm9tLCB0bykgPT4geyByYW5nZXMucHVzaChmcm9tLCB0byk7IH0pO1xuICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgIH0sXG4gICAgZnJvbUpTT04odmFsdWUpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggJSAyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gZm9yIGZvbGQgc3RhdGVcIik7XG4gICAgICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IHZhbHVlW2krK10sIHRvID0gdmFsdWVbaSsrXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiB0byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIGZvciBmb2xkIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmFuZ2VzLnB1c2goZm9sZFdpZGdldC5yYW5nZShmcm9tLCB0bykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChyYW5nZXMsIHRydWUpO1xuICAgIH1cbn0pO1xuLyoqXG5HZXQgYSBbcmFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0KSBjb250YWluaW5nIHRoZSBmb2xkZWQgcmFuZ2VzXG5pbiB0aGUgZ2l2ZW4gc3RhdGUuXG4qL1xuZnVuY3Rpb24gZm9sZGVkUmFuZ2VzKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpIHx8IFJhbmdlU2V0LmVtcHR5O1xufVxuZnVuY3Rpb24gZmluZEZvbGQoc3RhdGUsIGZyb20sIHRvKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgKF9hID0gc3RhdGUuZmllbGQoZm9sZFN0YXRlLCBmYWxzZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5iZXR3ZWVuKGZyb20sIHRvLCAoZnJvbSwgdG8pID0+IHtcbiAgICAgICAgaWYgKCFmb3VuZCB8fCBmb3VuZC5mcm9tID4gZnJvbSlcbiAgICAgICAgICAgIGZvdW5kID0geyBmcm9tLCB0byB9O1xuICAgIH0pO1xuICAgIHJldHVybiBmb3VuZDtcbn1cbmZ1bmN0aW9uIGZvbGRFeGlzdHMoZm9sZGVkLCBmcm9tLCB0bykge1xuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGZvbGRlZC5iZXR3ZWVuKGZyb20sIGZyb20sIChhLCBiKSA9PiB7IGlmIChhID09IGZyb20gJiYgYiA9PSB0bylcbiAgICAgICAgZm91bmQgPSB0cnVlOyB9KTtcbiAgICByZXR1cm4gZm91bmQ7XG59XG5mdW5jdGlvbiBtYXliZUVuYWJsZShzdGF0ZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gc3RhdGUuZmllbGQoZm9sZFN0YXRlLCBmYWxzZSkgPyBvdGhlciA6IG90aGVyLmNvbmNhdChTdGF0ZUVmZmVjdC5hcHBlbmRDb25maWcub2YoY29kZUZvbGRpbmcoKSkpO1xufVxuLyoqXG5Gb2xkIHRoZSBsaW5lcyB0aGF0IGFyZSBzZWxlY3RlZCwgaWYgcG9zc2libGUuXG4qL1xuY29uc3QgZm9sZENvZGUgPSB2aWV3ID0+IHtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHNlbGVjdGVkTGluZXModmlldykpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZm9sZGFibGUodmlldy5zdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKTtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogbWF5YmVFbmFibGUodmlldy5zdGF0ZSwgW2ZvbGRFZmZlY3Qub2YocmFuZ2UpLCBhbm5vdW5jZUZvbGQodmlldywgcmFuZ2UpXSkgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG5VbmZvbGQgZm9sZGVkIHJhbmdlcyBvbiBzZWxlY3RlZCBsaW5lcy5cbiovXG5jb25zdCB1bmZvbGRDb2RlID0gdmlldyA9PiB7XG4gICAgaWYgKCF2aWV3LnN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHNlbGVjdGVkTGluZXModmlldykpIHtcbiAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkZWQpXG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCksIGFubm91bmNlRm9sZCh2aWV3LCBmb2xkZWQsIGZhbHNlKSk7XG4gICAgfVxuICAgIGlmIChlZmZlY3RzLmxlbmd0aClcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHMgfSk7XG4gICAgcmV0dXJuIGVmZmVjdHMubGVuZ3RoID4gMDtcbn07XG5mdW5jdGlvbiBhbm5vdW5jZUZvbGQodmlldywgcmFuZ2UsIGZvbGQgPSB0cnVlKSB7XG4gICAgbGV0IGxpbmVGcm9tID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHJhbmdlLmZyb20pLm51bWJlciwgbGluZVRvID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHJhbmdlLnRvKS5udW1iZXI7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcuYW5ub3VuY2Uub2YoYCR7dmlldy5zdGF0ZS5waHJhc2UoZm9sZCA/IFwiRm9sZGVkIGxpbmVzXCIgOiBcIlVuZm9sZGVkIGxpbmVzXCIpfSAke2xpbmVGcm9tfSAke3ZpZXcuc3RhdGUucGhyYXNlKFwidG9cIil9ICR7bGluZVRvfS5gKTtcbn1cbi8qKlxuRm9sZCBhbGwgdG9wLWxldmVsIGZvbGRhYmxlIHJhbmdlcy4gTm90ZSB0aGF0LCBpbiBtb3N0IGNhc2VzLFxuZm9sZGluZyBpbmZvcm1hdGlvbiB3aWxsIGRlcGVuZCBvbiB0aGUgW3N5bnRheFxudHJlZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5zeW50YXhUcmVlKSwgYW5kIGZvbGRpbmcgZXZlcnl0aGluZyBtYXkgbm90IHdvcmtcbnJlbGlhYmx5IHdoZW4gdGhlIGRvY3VtZW50IGhhc24ndCBiZWVuIGZ1bGx5IHBhcnNlZCAoZWl0aGVyXG5iZWNhdXNlIHRoZSBlZGl0b3Igc3RhdGUgd2FzIG9ubHkganVzdCBpbml0aWFsaXplZCwgb3IgYmVjYXVzZSB0aGVcbmRvY3VtZW50IGlzIHNvIGJpZyB0aGF0IHRoZSBwYXJzZXIgZGVjaWRlZCBub3QgdG8gcGFyc2UgaXRcbmVudGlyZWx5KS5cbiovXG5jb25zdCBmb2xkQWxsID0gdmlldyA9PiB7XG4gICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBwb3MgPSAwOyBwb3MgPCBzdGF0ZS5kb2MubGVuZ3RoOykge1xuICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXQocG9zKSwgcmFuZ2UgPSBmb2xkYWJsZShzdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKTtcbiAgICAgICAgaWYgKHJhbmdlKVxuICAgICAgICAgICAgZWZmZWN0cy5wdXNoKGZvbGRFZmZlY3Qub2YocmFuZ2UpKTtcbiAgICAgICAgcG9zID0gKHJhbmdlID8gdmlldy5saW5lQmxvY2tBdChyYW5nZS50bykgOiBsaW5lKS50byArIDE7XG4gICAgfVxuICAgIGlmIChlZmZlY3RzLmxlbmd0aClcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IG1heWJlRW5hYmxlKHZpZXcuc3RhdGUsIGVmZmVjdHMpIH0pO1xuICAgIHJldHVybiAhIWVmZmVjdHMubGVuZ3RoO1xufTtcbi8qKlxuVW5mb2xkIGFsbCBmb2xkZWQgY29kZS5cbiovXG5jb25zdCB1bmZvbGRBbGwgPSB2aWV3ID0+IHtcbiAgICBsZXQgZmllbGQgPSB2aWV3LnN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpO1xuICAgIGlmICghZmllbGQgfHwgIWZpZWxkLnNpemUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZWZmZWN0cyA9IFtdO1xuICAgIGZpZWxkLmJldHdlZW4oMCwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoLCAoZnJvbSwgdG8pID0+IHsgZWZmZWN0cy5wdXNoKHVuZm9sZEVmZmVjdC5vZih7IGZyb20sIHRvIH0pKTsgfSk7XG4gICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHMgfSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLy8gRmluZCB0aGUgZm9sZGFibGUgcmVnaW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGxpbmUsIGlmIG9uZSBleGlzdHNcbmZ1bmN0aW9uIGZvbGRhYmxlQ29udGFpbmVyKHZpZXcsIGxpbmVCbG9jaykge1xuICAgIC8vIExvb2sgYmFja3dhcmRzIHRocm91Z2ggbGluZSBibG9ja3MgdW50aWwgd2UgZmluZCBhIGZvbGRhYmxlIHJlZ2lvbiB0aGF0XG4gICAgLy8gaW50ZXJzZWN0cyB3aXRoIHRoZSBsaW5lXG4gICAgZm9yIChsZXQgbGluZSA9IGxpbmVCbG9jazs7KSB7XG4gICAgICAgIGxldCBmb2xkYWJsZVJlZ2lvbiA9IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkYWJsZVJlZ2lvbiAmJiBmb2xkYWJsZVJlZ2lvbi50byA+IGxpbmVCbG9jay5mcm9tKVxuICAgICAgICAgICAgcmV0dXJuIGZvbGRhYmxlUmVnaW9uO1xuICAgICAgICBpZiAoIWxpbmUuZnJvbSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsaW5lID0gdmlldy5saW5lQmxvY2tBdChsaW5lLmZyb20gLSAxKTtcbiAgICB9XG59XG4vKipcblRvZ2dsZSBmb2xkaW5nIGF0IGN1cnNvcnMuIFVuZm9sZHMgaWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgZm9sZFxuc3RhcnRpbmcgaW4gdGhhdCBsaW5lLCB0cmllcyB0byBmaW5kIGEgZm9sZGFibGUgcmFuZ2UgYXJvdW5kIGl0XG5vdGhlcndpc2UuXG4qL1xuY29uc3QgdG9nZ2xlRm9sZCA9ICh2aWV3KSA9PiB7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHNlbGVjdGVkTGluZXModmlldykpIHtcbiAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkZWQpIHtcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaCh1bmZvbGRFZmZlY3Qub2YoZm9sZGVkKSwgYW5ub3VuY2VGb2xkKHZpZXcsIGZvbGRlZCwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmb2xkUmFuZ2UgPSBmb2xkYWJsZUNvbnRhaW5lcih2aWV3LCBsaW5lKTtcbiAgICAgICAgICAgIGlmIChmb2xkUmFuZ2UpXG4gICAgICAgICAgICAgICAgZWZmZWN0cy5wdXNoKGZvbGRFZmZlY3Qub2YoZm9sZFJhbmdlKSwgYW5ub3VuY2VGb2xkKHZpZXcsIGZvbGRSYW5nZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlZmZlY3RzLmxlbmd0aCA+IDApXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBtYXliZUVuYWJsZSh2aWV3LnN0YXRlLCBlZmZlY3RzKSB9KTtcbiAgICByZXR1cm4gISFlZmZlY3RzLmxlbmd0aDtcbn07XG4vKipcbkRlZmF1bHQgZm9sZC1yZWxhdGVkIGtleSBiaW5kaW5ncy5cblxuIC0gQ3RybC1TaGlmdC1bIChDbWQtQWx0LVsgb24gbWFjT1MpOiBbYGZvbGRDb2RlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkQ29kZSkuXG4gLSBDdHJsLVNoaWZ0LV0gKENtZC1BbHQtXSBvbiBtYWNPUyk6IFtgdW5mb2xkQ29kZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UudW5mb2xkQ29kZSkuXG4gLSBDdHJsLUFsdC1bOiBbYGZvbGRBbGxgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGRBbGwpLlxuIC0gQ3RybC1BbHQtXTogW2B1bmZvbGRBbGxgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLnVuZm9sZEFsbCkuXG4qL1xuY29uc3QgZm9sZEtleW1hcCA9IFtcbiAgICB7IGtleTogXCJDdHJsLVNoaWZ0LVtcIiwgbWFjOiBcIkNtZC1BbHQtW1wiLCBydW46IGZvbGRDb2RlIH0sXG4gICAgeyBrZXk6IFwiQ3RybC1TaGlmdC1dXCIsIG1hYzogXCJDbWQtQWx0LV1cIiwgcnVuOiB1bmZvbGRDb2RlIH0sXG4gICAgeyBrZXk6IFwiQ3RybC1BbHQtW1wiLCBydW46IGZvbGRBbGwgfSxcbiAgICB7IGtleTogXCJDdHJsLUFsdC1dXCIsIHJ1bjogdW5mb2xkQWxsIH1cbl07XG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICAgIHBsYWNlaG9sZGVyRE9NOiBudWxsLFxuICAgIHByZXBhcmVQbGFjZWhvbGRlcjogbnVsbCxcbiAgICBwbGFjZWhvbGRlclRleHQ6IFwiXHUyMDI2XCJcbn07XG5jb25zdCBmb2xkQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZSh2YWx1ZXMpIHsgcmV0dXJuIGNvbWJpbmVDb25maWcodmFsdWVzLCBkZWZhdWx0Q29uZmlnKTsgfVxufSk7XG4vKipcbkNyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBjb25maWd1cmVzIGNvZGUgZm9sZGluZy5cbiovXG5mdW5jdGlvbiBjb2RlRm9sZGluZyhjb25maWcpIHtcbiAgICBsZXQgcmVzdWx0ID0gW2ZvbGRTdGF0ZSwgYmFzZVRoZW1lJDFdO1xuICAgIGlmIChjb25maWcpXG4gICAgICAgIHJlc3VsdC5wdXNoKGZvbGRDb25maWcub2YoY29uZmlnKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHdpZGdldFRvRE9NKHZpZXcsIHByZXBhcmVkKSB7XG4gICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGNvbmYgPSBzdGF0ZS5mYWNldChmb2xkQ29uZmlnKTtcbiAgICBsZXQgb25jbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXQodmlldy5wb3NBdERPTShldmVudC50YXJnZXQpKTtcbiAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkZWQpXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCkgfSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcbiAgICBpZiAoY29uZi5wbGFjZWhvbGRlckRPTSlcbiAgICAgICAgcmV0dXJuIGNvbmYucGxhY2Vob2xkZXJET00odmlldywgb25jbGljaywgcHJlcGFyZWQpO1xuICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IGNvbmYucGxhY2Vob2xkZXJUZXh0O1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBzdGF0ZS5waHJhc2UoXCJmb2xkZWQgY29kZVwiKSk7XG4gICAgZWxlbWVudC50aXRsZSA9IHN0YXRlLnBocmFzZShcInVuZm9sZFwiKTtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwiY20tZm9sZFBsYWNlaG9sZGVyXCI7XG4gICAgZWxlbWVudC5vbmNsaWNrID0gb25jbGljaztcbiAgICByZXR1cm4gZWxlbWVudDtcbn1cbmNvbnN0IGZvbGRXaWRnZXQgPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5yZXBsYWNlKHsgd2lkZ2V0OiAvKkBfX1BVUkVfXyovbmV3IGNsYXNzIGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgICAgIHRvRE9NKHZpZXcpIHsgcmV0dXJuIHdpZGdldFRvRE9NKHZpZXcsIG51bGwpOyB9XG4gICAgfSB9KTtcbmNsYXNzIFByZXBhcmVkRm9sZFdpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMudmFsdWUgPT0gb3RoZXIudmFsdWU7IH1cbiAgICB0b0RPTSh2aWV3KSB7IHJldHVybiB3aWRnZXRUb0RPTSh2aWV3LCB0aGlzLnZhbHVlKTsgfVxufVxuY29uc3QgZm9sZEd1dHRlckRlZmF1bHRzID0ge1xuICAgIG9wZW5UZXh0OiBcIlx1MjMwNFwiLFxuICAgIGNsb3NlZFRleHQ6IFwiXHUyMDNBXCIsXG4gICAgbWFya2VyRE9NOiBudWxsLFxuICAgIGRvbUV2ZW50SGFuZGxlcnM6IHt9LFxuICAgIGZvbGRpbmdDaGFuZ2VkOiAoKSA9PiBmYWxzZVxufTtcbmNsYXNzIEZvbGRNYXJrZXIgZXh0ZW5kcyBHdXR0ZXJNYXJrZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZywgb3Blbikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMuY29uZmlnID09IG90aGVyLmNvbmZpZyAmJiB0aGlzLm9wZW4gPT0gb3RoZXIub3BlbjsgfVxuICAgIHRvRE9NKHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm1hcmtlckRPTSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5tYXJrZXJET00odGhpcy5vcGVuKTtcbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHRoaXMub3BlbiA/IHRoaXMuY29uZmlnLm9wZW5UZXh0IDogdGhpcy5jb25maWcuY2xvc2VkVGV4dDtcbiAgICAgICAgc3Bhbi50aXRsZSA9IHZpZXcuc3RhdGUucGhyYXNlKHRoaXMub3BlbiA/IFwiRm9sZCBsaW5lXCIgOiBcIlVuZm9sZCBsaW5lXCIpO1xuICAgICAgICByZXR1cm4gc3BhbjtcbiAgICB9XG59XG4vKipcbkNyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCByZWdpc3RlcnMgYSBmb2xkIGd1dHRlciwgd2hpY2ggc2hvd3MgYVxuZm9sZCBzdGF0dXMgaW5kaWNhdG9yIGJlZm9yZSBmb2xkYWJsZSBsaW5lcyAod2hpY2ggY2FuIGJlIGNsaWNrZWRcbnRvIGZvbGQgb3IgdW5mb2xkIHRoZSBsaW5lKS5cbiovXG5mdW5jdGlvbiBmb2xkR3V0dGVyKGNvbmZpZyA9IHt9KSB7XG4gICAgbGV0IGZ1bGxDb25maWcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZvbGRHdXR0ZXJEZWZhdWx0cyksIGNvbmZpZyk7XG4gICAgbGV0IGNhbkZvbGQgPSBuZXcgRm9sZE1hcmtlcihmdWxsQ29uZmlnLCB0cnVlKSwgY2FuVW5mb2xkID0gbmV3IEZvbGRNYXJrZXIoZnVsbENvbmZpZywgZmFsc2UpO1xuICAgIGxldCBtYXJrZXJzID0gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLmZyb20gPSB2aWV3LnZpZXdwb3J0LmZyb207XG4gICAgICAgICAgICB0aGlzLm1hcmtlcnMgPSB0aGlzLmJ1aWxkTWFya2Vycyh2aWV3KTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fFxuICAgICAgICAgICAgICAgIHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGxhbmd1YWdlKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQobGFuZ3VhZ2UpIHx8XG4gICAgICAgICAgICAgICAgdXBkYXRlLnN0YXJ0U3RhdGUuZmllbGQoZm9sZFN0YXRlLCBmYWxzZSkgIT0gdXBkYXRlLnN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpIHx8XG4gICAgICAgICAgICAgICAgc3ludGF4VHJlZSh1cGRhdGUuc3RhcnRTdGF0ZSkgIT0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpIHx8XG4gICAgICAgICAgICAgICAgZnVsbENvbmZpZy5mb2xkaW5nQ2hhbmdlZCh1cGRhdGUpKVxuICAgICAgICAgICAgICAgIHRoaXMubWFya2VycyA9IHRoaXMuYnVpbGRNYXJrZXJzKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgfVxuICAgICAgICBidWlsZE1hcmtlcnModmlldykge1xuICAgICAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHZpZXcudmlld3BvcnRMaW5lQmxvY2tzKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmsgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pID8gY2FuVW5mb2xkXG4gICAgICAgICAgICAgICAgICAgIDogZm9sZGFibGUodmlldy5zdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKSA/IGNhbkZvbGQgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChtYXJrKVxuICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChsaW5lLmZyb20sIGxpbmUuZnJvbSwgbWFyayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGxldCB7IGRvbUV2ZW50SGFuZGxlcnMgfSA9IGZ1bGxDb25maWc7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgbWFya2VycyxcbiAgICAgICAgZ3V0dGVyKHtcbiAgICAgICAgICAgIGNsYXNzOiBcImNtLWZvbGRHdXR0ZXJcIixcbiAgICAgICAgICAgIG1hcmtlcnModmlldykgeyB2YXIgX2E7IHJldHVybiAoKF9hID0gdmlldy5wbHVnaW4obWFya2VycykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXJrZXJzKSB8fCBSYW5nZVNldC5lbXB0eTsgfSxcbiAgICAgICAgICAgIGluaXRpYWxTcGFjZXIoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb2xkTWFya2VyKGZ1bGxDb25maWcsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkb21FdmVudEhhbmRsZXJzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRvbUV2ZW50SGFuZGxlcnMpLCB7IGNsaWNrOiAodmlldywgbGluZSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbUV2ZW50SGFuZGxlcnMuY2xpY2sgJiYgZG9tRXZlbnRIYW5kbGVycy5jbGljayh2aWV3LCBsaW5lLCBldmVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2xkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB1bmZvbGRFZmZlY3Qub2YoZm9sZGVkKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IGZvbGRFZmZlY3Qub2YocmFuZ2UpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gfSlcbiAgICAgICAgfSksXG4gICAgICAgIGNvZGVGb2xkaW5nKClcbiAgICBdO1xufVxuY29uc3QgYmFzZVRoZW1lJDEgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5iYXNlVGhlbWUoe1xuICAgIFwiLmNtLWZvbGRQbGFjZWhvbGRlclwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZWVlXCIsXG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgI2RkZFwiLFxuICAgICAgICBjb2xvcjogXCIjODg4XCIsXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIuMmVtXCIsXG4gICAgICAgIG1hcmdpbjogXCIwIDFweFwiLFxuICAgICAgICBwYWRkaW5nOiBcIjAgMXB4XCIsXG4gICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgICB9LFxuICAgIFwiLmNtLWZvbGRHdXR0ZXIgc3BhblwiOiB7XG4gICAgICAgIHBhZGRpbmc6IFwiMCAxcHhcIixcbiAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxuICAgIH1cbn0pO1xuXG4vKipcbkEgaGlnaGxpZ2h0IHN0eWxlIGFzc29jaWF0ZXMgQ1NTIHN0eWxlcyB3aXRoIGhpZ2xpZ2h0aW5nXG5bdGFnc10oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZiNoaWdobGlnaHQuVGFnKS5cbiovXG5jbGFzcyBIaWdobGlnaHRTdHlsZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHRhZyBzdHlsZXMgdXNlZCB0byBjcmVhdGUgdGhpcyBoaWdobGlnaHQgc3R5bGUuXG4gICAgKi9cbiAgICBzcGVjcywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnNwZWNzID0gc3BlY3M7XG4gICAgICAgIGxldCBtb2RTcGVjO1xuICAgICAgICBmdW5jdGlvbiBkZWYoc3BlYykge1xuICAgICAgICAgICAgbGV0IGNscyA9IFN0eWxlTW9kdWxlLm5ld05hbWUoKTtcbiAgICAgICAgICAgIChtb2RTcGVjIHx8IChtb2RTcGVjID0gT2JqZWN0LmNyZWF0ZShudWxsKSkpW1wiLlwiICsgY2xzXSA9IHNwZWM7XG4gICAgICAgICAgICByZXR1cm4gY2xzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFsbCA9IHR5cGVvZiBvcHRpb25zLmFsbCA9PSBcInN0cmluZ1wiID8gb3B0aW9ucy5hbGwgOiBvcHRpb25zLmFsbCA/IGRlZihvcHRpb25zLmFsbCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHNjb3BlT3B0ID0gb3B0aW9ucy5zY29wZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlT3B0IGluc3RhbmNlb2YgTGFuZ3VhZ2UgPyAodHlwZSkgPT4gdHlwZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHNjb3BlT3B0LmRhdGFcbiAgICAgICAgICAgIDogc2NvcGVPcHQgPyAodHlwZSkgPT4gdHlwZSA9PSBzY29wZU9wdCA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zdHlsZSA9IHRhZ0hpZ2hsaWdodGVyKHNwZWNzLm1hcChzdHlsZSA9PiAoe1xuICAgICAgICAgICAgdGFnOiBzdHlsZS50YWcsXG4gICAgICAgICAgICBjbGFzczogc3R5bGUuY2xhc3MgfHwgZGVmKE9iamVjdC5hc3NpZ24oe30sIHN0eWxlLCB7IHRhZzogbnVsbCB9KSlcbiAgICAgICAgfSkpLCB7XG4gICAgICAgICAgICBhbGwsXG4gICAgICAgIH0pLnN0eWxlO1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZFNwZWMgPyBuZXcgU3R5bGVNb2R1bGUobW9kU3BlYykgOiBudWxsO1xuICAgICAgICB0aGlzLnRoZW1lVHlwZSA9IG9wdGlvbnMudGhlbWVUeXBlO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBoaWdobGlnaHRlciBzdHlsZSB0aGF0IGFzc29jaWF0ZXMgdGhlIGdpdmVuIHN0eWxlcyB0b1xuICAgIHRoZSBnaXZlbiB0YWdzLiBUaGUgc3BlY3MgbXVzdCBiZSBvYmplY3RzIHRoYXQgaG9sZCBhIHN0eWxlIHRhZ1xuICAgIG9yIGFycmF5IG9mIHRhZ3MgaW4gdGhlaXIgYHRhZ2AgcHJvcGVydHksIGFuZCBlaXRoZXIgYSBzaW5nbGVcbiAgICBgY2xhc3NgIHByb3BlcnR5IHByb3ZpZGluZyBhIHN0YXRpYyBDU1MgY2xhc3MgKGZvciBoaWdobGlnaHRlclxuICAgIHRoYXQgcmVseSBvbiBleHRlcm5hbCBzdHlsaW5nKSwgb3IgYVxuICAgIFtgc3R5bGUtbW9kYF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvc3R5bGUtbW9kI2RvY3VtZW50YXRpb24pLXN0eWxlXG4gICAgc2V0IG9mIENTUyBwcm9wZXJ0aWVzICh3aGljaCBkZWZpbmUgdGhlIHN0eWxpbmcgZm9yIHRob3NlIHRhZ3MpLlxuICAgIFxuICAgIFRoZSBDU1MgcnVsZXMgY3JlYXRlZCBmb3IgYSBoaWdobGlnaHRlciB3aWxsIGJlIGVtaXR0ZWQgaW4gdGhlXG4gICAgb3JkZXIgb2YgdGhlIHNwZWMncyBwcm9wZXJ0aWVzLiBUaGF0IG1lYW5zIHRoYXQgZm9yIGVsZW1lbnRzIHRoYXRcbiAgICBoYXZlIG11bHRpcGxlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZW0sIHN0eWxlcyBkZWZpbmVkIGZ1cnRoZXJcbiAgICBkb3duIGluIHRoZSBsaXN0IHdpbGwgaGF2ZSBhIGhpZ2hlciBDU1MgcHJlY2VkZW5jZSB0aGFuIHN0eWxlc1xuICAgIGRlZmluZWQgZWFybGllci5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlY3MsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIaWdobGlnaHRTdHlsZShzcGVjcywgb3B0aW9ucyB8fCB7fSk7XG4gICAgfVxufVxuY29uc3QgaGlnaGxpZ2h0ZXJGYWNldCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGZhbGxiYWNrSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKHZhbHVlcykgeyByZXR1cm4gdmFsdWVzLmxlbmd0aCA/IFt2YWx1ZXNbMF1dIDogbnVsbDsgfVxufSk7XG5mdW5jdGlvbiBnZXRIaWdobGlnaHRlcnMoc3RhdGUpIHtcbiAgICBsZXQgbWFpbiA9IHN0YXRlLmZhY2V0KGhpZ2hsaWdodGVyRmFjZXQpO1xuICAgIHJldHVybiBtYWluLmxlbmd0aCA/IG1haW4gOiBzdGF0ZS5mYWNldChmYWxsYmFja0hpZ2hsaWdodGVyKTtcbn1cbi8qKlxuV3JhcCBhIGhpZ2hsaWdodGVyIGluIGFuIGVkaXRvciBleHRlbnNpb24gdGhhdCB1c2VzIGl0IHRvIGFwcGx5XG5zeW50YXggaGlnaGxpZ2h0aW5nIHRvIHRoZSBlZGl0b3IgY29udGVudC5cblxuV2hlbiBtdWx0aXBsZSAobm9uLWZhbGxiYWNrKSBzdHlsZXMgYXJlIHByb3ZpZGVkLCB0aGUgc3R5bGluZ1xuYXBwbGllZCBpcyB0aGUgdW5pb24gb2YgdGhlIGNsYXNzZXMgdGhleSBlbWl0LlxuKi9cbmZ1bmN0aW9uIHN5bnRheEhpZ2hsaWdodGluZyhoaWdobGlnaHRlciwgb3B0aW9ucykge1xuICAgIGxldCBleHQgPSBbdHJlZUhpZ2hsaWdodGVyXSwgdGhlbWVUeXBlO1xuICAgIGlmIChoaWdobGlnaHRlciBpbnN0YW5jZW9mIEhpZ2hsaWdodFN0eWxlKSB7XG4gICAgICAgIGlmIChoaWdobGlnaHRlci5tb2R1bGUpXG4gICAgICAgICAgICBleHQucHVzaChFZGl0b3JWaWV3LnN0eWxlTW9kdWxlLm9mKGhpZ2hsaWdodGVyLm1vZHVsZSkpO1xuICAgICAgICB0aGVtZVR5cGUgPSBoaWdobGlnaHRlci50aGVtZVR5cGU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmFsbGJhY2spXG4gICAgICAgIGV4dC5wdXNoKGZhbGxiYWNrSGlnaGxpZ2h0ZXIub2YoaGlnaGxpZ2h0ZXIpKTtcbiAgICBlbHNlIGlmICh0aGVtZVR5cGUpXG4gICAgICAgIGV4dC5wdXNoKGhpZ2hsaWdodGVyRmFjZXQuY29tcHV0ZU4oW0VkaXRvclZpZXcuZGFya1RoZW1lXSwgc3RhdGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmZhY2V0KEVkaXRvclZpZXcuZGFya1RoZW1lKSA9PSAodGhlbWVUeXBlID09IFwiZGFya1wiKSA/IFtoaWdobGlnaHRlcl0gOiBbXTtcbiAgICAgICAgfSkpO1xuICAgIGVsc2VcbiAgICAgICAgZXh0LnB1c2goaGlnaGxpZ2h0ZXJGYWNldC5vZihoaWdobGlnaHRlcikpO1xuICAgIHJldHVybiBleHQ7XG59XG4vKipcblJldHVybnMgdGhlIENTUyBjbGFzc2VzIChpZiBhbnkpIHRoYXQgdGhlIGhpZ2hsaWdodGVycyBhY3RpdmUgaW5cbnRoZSBzdGF0ZSB3b3VsZCBhc3NpZ24gdG8gdGhlIGdpdmVuIHN0eWxlXG5bdGFnc10oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZiNoaWdobGlnaHQuVGFnKSBhbmRcbihvcHRpb25hbCkgbGFuZ3VhZ2VcbltzY29wZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5IaWdobGlnaHRTdHlsZV5kZWZpbmVeb3B0aW9ucy5zY29wZSkuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0aW5nRm9yKHN0YXRlLCB0YWdzLCBzY29wZSkge1xuICAgIGxldCBoaWdobGlnaHRlcnMgPSBnZXRIaWdobGlnaHRlcnMoc3RhdGUpO1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGlmIChoaWdobGlnaHRlcnMpXG4gICAgICAgIGZvciAobGV0IGhpZ2hsaWdodGVyIG9mIGhpZ2hsaWdodGVycykge1xuICAgICAgICAgICAgaWYgKCFoaWdobGlnaHRlci5zY29wZSB8fCBzY29wZSAmJiBoaWdobGlnaHRlci5zY29wZShzY29wZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2xzID0gaGlnaGxpZ2h0ZXIuc3R5bGUodGFncyk7XG4gICAgICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID8gcmVzdWx0ICsgXCIgXCIgKyBjbHMgOiBjbHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY2xhc3MgVHJlZUhpZ2hsaWdodGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMubWFya0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy50cmVlID0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvKHZpZXcsIGdldEhpZ2hsaWdodGVycyh2aWV3LnN0YXRlKSk7XG4gICAgICAgIHRoaXMuZGVjb3JhdGVkVG8gPSB2aWV3LnZpZXdwb3J0LnRvO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCB0cmVlID0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpLCBoaWdobGlnaHRlcnMgPSBnZXRIaWdobGlnaHRlcnModXBkYXRlLnN0YXRlKTtcbiAgICAgICAgbGV0IHN0eWxlQ2hhbmdlID0gaGlnaGxpZ2h0ZXJzICE9IGdldEhpZ2hsaWdodGVycyh1cGRhdGUuc3RhcnRTdGF0ZSk7XG4gICAgICAgIGxldCB7IHZpZXdwb3J0IH0gPSB1cGRhdGUudmlldywgZGVjb3JhdGVkVG9NYXBwZWQgPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModGhpcy5kZWNvcmF0ZWRUbywgMSk7XG4gICAgICAgIGlmICh0cmVlLmxlbmd0aCA8IHZpZXdwb3J0LnRvICYmICFzdHlsZUNoYW5nZSAmJiB0cmVlLnR5cGUgPT0gdGhpcy50cmVlLnR5cGUgJiYgZGVjb3JhdGVkVG9NYXBwZWQgPj0gdmlld3BvcnQudG8pIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRpb25zLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRlZFRvID0gZGVjb3JhdGVkVG9NYXBwZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJlZSAhPSB0aGlzLnRyZWUgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fCBzdHlsZUNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmJ1aWxkRGVjbyh1cGRhdGUudmlldywgaGlnaGxpZ2h0ZXJzKTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGVkVG8gPSB2aWV3cG9ydC50bztcbiAgICAgICAgfVxuICAgIH1cbiAgICBidWlsZERlY28odmlldywgaGlnaGxpZ2h0ZXJzKSB7XG4gICAgICAgIGlmICghaGlnaGxpZ2h0ZXJzIHx8ICF0aGlzLnRyZWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiB2aWV3LnZpc2libGVSYW5nZXMpIHtcbiAgICAgICAgICAgIGhpZ2hsaWdodFRyZWUodGhpcy50cmVlLCBoaWdobGlnaHRlcnMsIChmcm9tLCB0bywgc3R5bGUpID0+IHtcbiAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChmcm9tLCB0bywgdGhpcy5tYXJrQ2FjaGVbc3R5bGVdIHx8ICh0aGlzLm1hcmtDYWNoZVtzdHlsZV0gPSBEZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogc3R5bGUgfSkpKTtcbiAgICAgICAgICAgIH0sIGZyb20sIHRvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcbiAgICB9XG59XG5jb25zdCB0cmVlSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovUHJlYy5oaWdoKC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhUcmVlSGlnaGxpZ2h0ZXIsIHtcbiAgICBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zXG59KSk7XG4vKipcbkEgZGVmYXVsdCBoaWdobGlnaHQgc3R5bGUgKHdvcmtzIHdlbGwgd2l0aCBsaWdodCB0aGVtZXMpLlxuKi9cbmNvbnN0IGRlZmF1bHRIaWdobGlnaHRTdHlsZSA9IC8qQF9fUFVSRV9fKi9IaWdobGlnaHRTdHlsZS5kZWZpbmUoW1xuICAgIHsgdGFnOiB0YWdzLm1ldGEsXG4gICAgICAgIGNvbG9yOiBcIiM0MDQ3NDBcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmxpbmssXG4gICAgICAgIHRleHREZWNvcmF0aW9uOiBcInVuZGVybGluZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaGVhZGluZyxcbiAgICAgICAgdGV4dERlY29yYXRpb246IFwidW5kZXJsaW5lXCIsXG4gICAgICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZW1waGFzaXMsXG4gICAgICAgIGZvbnRTdHlsZTogXCJpdGFsaWNcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnN0cm9uZyxcbiAgICAgICAgZm9udFdlaWdodDogXCJib2xkXCIgfSxcbiAgICB7IHRhZzogdGFncy5zdHJpa2V0aHJvdWdoLFxuICAgICAgICB0ZXh0RGVjb3JhdGlvbjogXCJsaW5lLXRocm91Z2hcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmtleXdvcmQsXG4gICAgICAgIGNvbG9yOiBcIiM3MDhcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5hdG9tLCB0YWdzLmJvb2wsIHRhZ3MudXJsLCB0YWdzLmNvbnRlbnRTZXBhcmF0b3IsIHRhZ3MubGFiZWxOYW1lXSxcbiAgICAgICAgY29sb3I6IFwiIzIxOVwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLmxpdGVyYWwsIHRhZ3MuaW5zZXJ0ZWRdLFxuICAgICAgICBjb2xvcjogXCIjMTY0XCIgfSxcbiAgICB7IHRhZzogW3RhZ3Muc3RyaW5nLCB0YWdzLmRlbGV0ZWRdLFxuICAgICAgICBjb2xvcjogXCIjYTExXCIgfSxcbiAgICB7IHRhZzogW3RhZ3MucmVnZXhwLCB0YWdzLmVzY2FwZSwgLypAX19QVVJFX18qL3RhZ3Muc3BlY2lhbCh0YWdzLnN0cmluZyldLFxuICAgICAgICBjb2xvcjogXCIjZTQwXCIgfSxcbiAgICB7IHRhZzogLypAX19QVVJFX18qL3RhZ3MuZGVmaW5pdGlvbih0YWdzLnZhcmlhYmxlTmFtZSksXG4gICAgICAgIGNvbG9yOiBcIiMwMGZcIiB9LFxuICAgIHsgdGFnOiAvKkBfX1BVUkVfXyovdGFncy5sb2NhbCh0YWdzLnZhcmlhYmxlTmFtZSksXG4gICAgICAgIGNvbG9yOiBcIiMzMGFcIiB9LFxuICAgIHsgdGFnOiBbdGFncy50eXBlTmFtZSwgdGFncy5uYW1lc3BhY2VdLFxuICAgICAgICBjb2xvcjogXCIjMDg1XCIgfSxcbiAgICB7IHRhZzogdGFncy5jbGFzc05hbWUsXG4gICAgICAgIGNvbG9yOiBcIiMxNjdcIiB9LFxuICAgIHsgdGFnOiBbLypAX19QVVJFX18qL3RhZ3Muc3BlY2lhbCh0YWdzLnZhcmlhYmxlTmFtZSksIHRhZ3MubWFjcm9OYW1lXSxcbiAgICAgICAgY29sb3I6IFwiIzI1NlwiIH0sXG4gICAgeyB0YWc6IC8qQF9fUFVSRV9fKi90YWdzLmRlZmluaXRpb24odGFncy5wcm9wZXJ0eU5hbWUpLFxuICAgICAgICBjb2xvcjogXCIjMDBjXCIgfSxcbiAgICB7IHRhZzogdGFncy5jb21tZW50LFxuICAgICAgICBjb2xvcjogXCIjOTQwXCIgfSxcbiAgICB7IHRhZzogdGFncy5pbnZhbGlkLFxuICAgICAgICBjb2xvcjogXCIjZjAwXCIgfVxuXSk7XG5cbmNvbnN0IGJhc2VUaGVtZSA9IC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LmJhc2VUaGVtZSh7XG4gICAgXCImLmNtLWZvY3VzZWQgLmNtLW1hdGNoaW5nQnJhY2tldFwiOiB7IGJhY2tncm91bmRDb2xvcjogXCIjMzI4YzgyNTJcIiB9LFxuICAgIFwiJi5jbS1mb2N1c2VkIC5jbS1ub25tYXRjaGluZ0JyYWNrZXRcIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwiI2JiNTU1NTQ0XCIgfVxufSk7XG5jb25zdCBEZWZhdWx0U2NhbkRpc3QgPSAxMDAwMCwgRGVmYXVsdEJyYWNrZXRzID0gXCIoKVtde31cIjtcbmNvbnN0IGJyYWNrZXRNYXRjaGluZ0NvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICByZXR1cm4gY29tYmluZUNvbmZpZyhjb25maWdzLCB7XG4gICAgICAgICAgICBhZnRlckN1cnNvcjogdHJ1ZSxcbiAgICAgICAgICAgIGJyYWNrZXRzOiBEZWZhdWx0QnJhY2tldHMsXG4gICAgICAgICAgICBtYXhTY2FuRGlzdGFuY2U6IERlZmF1bHRTY2FuRGlzdCxcbiAgICAgICAgICAgIHJlbmRlck1hdGNoOiBkZWZhdWx0UmVuZGVyTWF0Y2hcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5jb25zdCBtYXRjaGluZ01hcmsgPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20tbWF0Y2hpbmdCcmFja2V0XCIgfSksIG5vbm1hdGNoaW5nTWFyayA9IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1ub25tYXRjaGluZ0JyYWNrZXRcIiB9KTtcbmZ1bmN0aW9uIGRlZmF1bHRSZW5kZXJNYXRjaChtYXRjaCkge1xuICAgIGxldCBkZWNvcmF0aW9ucyA9IFtdO1xuICAgIGxldCBtYXJrID0gbWF0Y2gubWF0Y2hlZCA/IG1hdGNoaW5nTWFyayA6IG5vbm1hdGNoaW5nTWFyaztcbiAgICBkZWNvcmF0aW9ucy5wdXNoKG1hcmsucmFuZ2UobWF0Y2guc3RhcnQuZnJvbSwgbWF0Y2guc3RhcnQudG8pKTtcbiAgICBpZiAobWF0Y2guZW5kKVxuICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKG1hcmsucmFuZ2UobWF0Y2guZW5kLmZyb20sIG1hdGNoLmVuZC50bykpO1xuICAgIHJldHVybiBkZWNvcmF0aW9ucztcbn1cbmNvbnN0IGJyYWNrZXRNYXRjaGluZ1N0YXRlID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGUoKSB7IHJldHVybiBEZWNvcmF0aW9uLm5vbmU7IH0sXG4gICAgdXBkYXRlKGRlY28sIHRyKSB7XG4gICAgICAgIGlmICghdHIuZG9jQ2hhbmdlZCAmJiAhdHIuc2VsZWN0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIGRlY287XG4gICAgICAgIGxldCBkZWNvcmF0aW9ucyA9IFtdO1xuICAgICAgICBsZXQgY29uZmlnID0gdHIuc3RhdGUuZmFjZXQoYnJhY2tldE1hdGNoaW5nQ29uZmlnKTtcbiAgICAgICAgZm9yIChsZXQgcmFuZ2Ugb2YgdHIuc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQsIC0xLCBjb25maWcpXG4gICAgICAgICAgICAgICAgfHwgKHJhbmdlLmhlYWQgPiAwICYmIG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQgLSAxLCAxLCBjb25maWcpKVxuICAgICAgICAgICAgICAgIHx8IChjb25maWcuYWZ0ZXJDdXJzb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgKG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQsIDEsIGNvbmZpZykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyYW5nZS5oZWFkIDwgdHIuc3RhdGUuZG9jLmxlbmd0aCAmJiBtYXRjaEJyYWNrZXRzKHRyLnN0YXRlLCByYW5nZS5oZWFkICsgMSwgLTEsIGNvbmZpZykpKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2gpXG4gICAgICAgICAgICAgICAgZGVjb3JhdGlvbnMgPSBkZWNvcmF0aW9ucy5jb25jYXQoY29uZmlnLnJlbmRlck1hdGNoKG1hdGNoLCB0ci5zdGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChkZWNvcmF0aW9ucywgdHJ1ZSk7XG4gICAgfSxcbiAgICBwcm92aWRlOiBmID0+IEVkaXRvclZpZXcuZGVjb3JhdGlvbnMuZnJvbShmKVxufSk7XG5jb25zdCBicmFja2V0TWF0Y2hpbmdVbmlxdWUgPSBbXG4gICAgYnJhY2tldE1hdGNoaW5nU3RhdGUsXG4gICAgYmFzZVRoZW1lXG5dO1xuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyBicmFja2V0IG1hdGNoaW5nLiBXaGVuZXZlciB0aGVcbmN1cnNvciBpcyBuZXh0IHRvIGEgYnJhY2tldCwgdGhhdCBicmFja2V0IGFuZCB0aGUgb25lIGl0IG1hdGNoZXNcbmFyZSBoaWdobGlnaHRlZC4gT3IsIHdoZW4gbm8gbWF0Y2hpbmcgYnJhY2tldCBpcyBmb3VuZCwgYW5vdGhlclxuaGlnaGxpZ2h0aW5nIHN0eWxlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhpcy5cbiovXG5mdW5jdGlvbiBicmFja2V0TWF0Y2hpbmcoY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW2JyYWNrZXRNYXRjaGluZ0NvbmZpZy5vZihjb25maWcpLCBicmFja2V0TWF0Y2hpbmdVbmlxdWVdO1xufVxuLyoqXG5XaGVuIGxhcmdlciBzeW50YXggbm9kZXMsIHN1Y2ggYXMgSFRNTCB0YWdzLCBhcmUgbWFya2VkIGFzXG5vcGVuaW5nL2Nsb3NpbmcsIGl0IGNhbiBiZSBhIGJpdCBtZXNzeSB0byB0cmVhdCB0aGUgd2hvbGUgbm9kZSBhc1xuYSBtYXRjaGFibGUgYnJhY2tldC4gVGhpcyBub2RlIHByb3AgYWxsb3dzIHlvdSB0byBkZWZpbmUsIGZvciBzdWNoXG5hIG5vZGUsIGEgXHUyMDE4aGFuZGxlXHUyMDE5XHUyMDE0dGhlIHBhcnQgb2YgdGhlIG5vZGUgdGhhdCBpcyBoaWdobGlnaHRlZCwgYW5kXG50aGF0IHRoZSBjdXJzb3IgbXVzdCBiZSBvbiB0byBhY3RpdmF0ZSBoaWdobGlnaHRpbmcgaW4gdGhlIGZpcnN0XG5wbGFjZS5cbiovXG5jb25zdCBicmFja2V0TWF0Y2hpbmdIYW5kbGUgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG5mdW5jdGlvbiBtYXRjaGluZ05vZGVzKG5vZGUsIGRpciwgYnJhY2tldHMpIHtcbiAgICBsZXQgYnlQcm9wID0gbm9kZS5wcm9wKGRpciA8IDAgPyBOb2RlUHJvcC5vcGVuZWRCeSA6IE5vZGVQcm9wLmNsb3NlZEJ5KTtcbiAgICBpZiAoYnlQcm9wKVxuICAgICAgICByZXR1cm4gYnlQcm9wO1xuICAgIGlmIChub2RlLm5hbWUubGVuZ3RoID09IDEpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gYnJhY2tldHMuaW5kZXhPZihub2RlLm5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSAmJiBpbmRleCAlIDIgPT0gKGRpciA8IDAgPyAxIDogMCkpXG4gICAgICAgICAgICByZXR1cm4gW2JyYWNrZXRzW2luZGV4ICsgZGlyXV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZmluZEhhbmRsZShub2RlKSB7XG4gICAgbGV0IGhhc0hhbmRsZSA9IG5vZGUudHlwZS5wcm9wKGJyYWNrZXRNYXRjaGluZ0hhbmRsZSk7XG4gICAgcmV0dXJuIGhhc0hhbmRsZSA/IGhhc0hhbmRsZShub2RlLm5vZGUpIDogbm9kZTtcbn1cbi8qKlxuRmluZCB0aGUgbWF0Y2hpbmcgYnJhY2tldCBmb3IgdGhlIHRva2VuIGF0IGBwb3NgLCBzY2FubmluZ1xuZGlyZWN0aW9uIGBkaXJgLiBPbmx5IHRoZSBgYnJhY2tldHNgIGFuZCBgbWF4U2NhbkRpc3RhbmNlYFxucHJvcGVydGllcyBhcmUgdXNlZCBmcm9tIGBjb25maWdgLCBpZiBnaXZlbi4gUmV0dXJucyBudWxsIGlmIG5vXG5icmFja2V0IHdhcyBmb3VuZCBhdCBgcG9zYCwgb3IgYSBtYXRjaCByZXN1bHQgb3RoZXJ3aXNlLlxuKi9cbmZ1bmN0aW9uIG1hdGNoQnJhY2tldHMoc3RhdGUsIHBvcywgZGlyLCBjb25maWcgPSB7fSkge1xuICAgIGxldCBtYXhTY2FuRGlzdGFuY2UgPSBjb25maWcubWF4U2NhbkRpc3RhbmNlIHx8IERlZmF1bHRTY2FuRGlzdCwgYnJhY2tldHMgPSBjb25maWcuYnJhY2tldHMgfHwgRGVmYXVsdEJyYWNrZXRzO1xuICAgIGxldCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSksIG5vZGUgPSB0cmVlLnJlc29sdmVJbm5lcihwb3MsIGRpcik7XG4gICAgZm9yIChsZXQgY3VyID0gbm9kZTsgY3VyOyBjdXIgPSBjdXIucGFyZW50KSB7XG4gICAgICAgIGxldCBtYXRjaGVzID0gbWF0Y2hpbmdOb2RlcyhjdXIudHlwZSwgZGlyLCBicmFja2V0cyk7XG4gICAgICAgIGlmIChtYXRjaGVzICYmIGN1ci5mcm9tIDwgY3VyLnRvKSB7XG4gICAgICAgICAgICBsZXQgaGFuZGxlID0gZmluZEhhbmRsZShjdXIpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZSAmJiAoZGlyID4gMCA/IHBvcyA+PSBoYW5kbGUuZnJvbSAmJiBwb3MgPCBoYW5kbGUudG8gOiBwb3MgPiBoYW5kbGUuZnJvbSAmJiBwb3MgPD0gaGFuZGxlLnRvKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hNYXJrZWRCcmFja2V0cyhzdGF0ZSwgcG9zLCBkaXIsIGN1ciwgaGFuZGxlLCBtYXRjaGVzLCBicmFja2V0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoUGxhaW5CcmFja2V0cyhzdGF0ZSwgcG9zLCBkaXIsIHRyZWUsIG5vZGUudHlwZSwgbWF4U2NhbkRpc3RhbmNlLCBicmFja2V0cyk7XG59XG5mdW5jdGlvbiBtYXRjaE1hcmtlZEJyYWNrZXRzKF9zdGF0ZSwgX3BvcywgZGlyLCB0b2tlbiwgaGFuZGxlLCBtYXRjaGluZywgYnJhY2tldHMpIHtcbiAgICBsZXQgcGFyZW50ID0gdG9rZW4ucGFyZW50LCBmaXJzdFRva2VuID0geyBmcm9tOiBoYW5kbGUuZnJvbSwgdG86IGhhbmRsZS50byB9O1xuICAgIGxldCBkZXB0aCA9IDAsIGN1cnNvciA9IHBhcmVudCA9PT0gbnVsbCB8fCBwYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmVudC5jdXJzb3IoKTtcbiAgICBpZiAoY3Vyc29yICYmIChkaXIgPCAwID8gY3Vyc29yLmNoaWxkQmVmb3JlKHRva2VuLmZyb20pIDogY3Vyc29yLmNoaWxkQWZ0ZXIodG9rZW4udG8pKSlcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGRpciA8IDAgPyBjdXJzb3IudG8gPD0gdG9rZW4uZnJvbSA6IGN1cnNvci5mcm9tID49IHRva2VuLnRvKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDAgJiYgbWF0Y2hpbmcuaW5kZXhPZihjdXJzb3IudHlwZS5uYW1lKSA+IC0xICYmIGN1cnNvci5mcm9tIDwgY3Vyc29yLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbmRIYW5kbGUgPSBmaW5kSGFuZGxlKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBmaXJzdFRva2VuLCBlbmQ6IGVuZEhhbmRsZSA/IHsgZnJvbTogZW5kSGFuZGxlLmZyb20sIHRvOiBlbmRIYW5kbGUudG8gfSA6IHVuZGVmaW5lZCwgbWF0Y2hlZDogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaGluZ05vZGVzKGN1cnNvci50eXBlLCBkaXIsIGJyYWNrZXRzKSkge1xuICAgICAgICAgICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaGluZ05vZGVzKGN1cnNvci50eXBlLCAtZGlyLCBicmFja2V0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmRIYW5kbGUgPSBmaW5kSGFuZGxlKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBmaXJzdFRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogZW5kSGFuZGxlICYmIGVuZEhhbmRsZS5mcm9tIDwgZW5kSGFuZGxlLnRvID8geyBmcm9tOiBlbmRIYW5kbGUuZnJvbSwgdG86IGVuZEhhbmRsZS50byB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChkaXIgPCAwID8gY3Vyc29yLnByZXZTaWJsaW5nKCkgOiBjdXJzb3IubmV4dFNpYmxpbmcoKSk7XG4gICAgcmV0dXJuIHsgc3RhcnQ6IGZpcnN0VG9rZW4sIG1hdGNoZWQ6IGZhbHNlIH07XG59XG5mdW5jdGlvbiBtYXRjaFBsYWluQnJhY2tldHMoc3RhdGUsIHBvcywgZGlyLCB0cmVlLCB0b2tlblR5cGUsIG1heFNjYW5EaXN0YW5jZSwgYnJhY2tldHMpIHtcbiAgICBsZXQgc3RhcnRDaCA9IGRpciA8IDAgPyBzdGF0ZS5zbGljZURvYyhwb3MgLSAxLCBwb3MpIDogc3RhdGUuc2xpY2VEb2MocG9zLCBwb3MgKyAxKTtcbiAgICBsZXQgYnJhY2tldCA9IGJyYWNrZXRzLmluZGV4T2Yoc3RhcnRDaCk7XG4gICAgaWYgKGJyYWNrZXQgPCAwIHx8IChicmFja2V0ICUgMiA9PSAwKSAhPSAoZGlyID4gMCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBzdGFydFRva2VuID0geyBmcm9tOiBkaXIgPCAwID8gcG9zIC0gMSA6IHBvcywgdG86IGRpciA+IDAgPyBwb3MgKyAxIDogcG9zIH07XG4gICAgbGV0IGl0ZXIgPSBzdGF0ZS5kb2MuaXRlclJhbmdlKHBvcywgZGlyID4gMCA/IHN0YXRlLmRvYy5sZW5ndGggOiAwKSwgZGVwdGggPSAwO1xuICAgIGZvciAobGV0IGRpc3RhbmNlID0gMDsgIShpdGVyLm5leHQoKSkuZG9uZSAmJiBkaXN0YW5jZSA8PSBtYXhTY2FuRGlzdGFuY2U7KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gaXRlci52YWx1ZTtcbiAgICAgICAgaWYgKGRpciA8IDApXG4gICAgICAgICAgICBkaXN0YW5jZSArPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgbGV0IGJhc2VQb3MgPSBwb3MgKyBkaXN0YW5jZSAqIGRpcjtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gZGlyID4gMCA/IDAgOiB0ZXh0Lmxlbmd0aCAtIDEsIGVuZCA9IGRpciA+IDAgPyB0ZXh0Lmxlbmd0aCA6IC0xOyBwb3MgIT0gZW5kOyBwb3MgKz0gZGlyKSB7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBicmFja2V0cy5pbmRleE9mKHRleHRbcG9zXSk7XG4gICAgICAgICAgICBpZiAoZm91bmQgPCAwIHx8IHRyZWUucmVzb2x2ZUlubmVyKGJhc2VQb3MgKyBwb3MsIDEpLnR5cGUgIT0gdG9rZW5UeXBlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKChmb3VuZCAlIDIgPT0gMCkgPT0gKGRpciA+IDApKSB7XG4gICAgICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRlcHRoID09IDEpIHsgLy8gQ2xvc2luZ1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydFRva2VuLCBlbmQ6IHsgZnJvbTogYmFzZVBvcyArIHBvcywgdG86IGJhc2VQb3MgKyBwb3MgKyAxIH0sIG1hdGNoZWQ6IChmb3VuZCA+PiAxKSA9PSAoYnJhY2tldCA+PiAxKSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlyID4gMClcbiAgICAgICAgICAgIGRpc3RhbmNlICs9IHRleHQubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gaXRlci5kb25lID8geyBzdGFydDogc3RhcnRUb2tlbiwgbWF0Y2hlZDogZmFsc2UgfSA6IG51bGw7XG59XG5cbi8vIENvdW50cyB0aGUgY29sdW1uIG9mZnNldCBpbiBhIHN0cmluZywgdGFraW5nIHRhYnMgaW50byBhY2NvdW50LlxuLy8gVXNlZCBtb3N0bHkgdG8gZmluZCBpbmRlbnRhdGlvbi5cbmZ1bmN0aW9uIGNvdW50Q29sKHN0cmluZywgZW5kLCB0YWJTaXplLCBzdGFydEluZGV4ID0gMCwgc3RhcnRWYWx1ZSA9IDApIHtcbiAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgICAgZW5kID0gc3RyaW5nLnNlYXJjaCgvW15cXHNcXHUwMGEwXS8pO1xuICAgICAgICBpZiAoZW5kID09IC0xKVxuICAgICAgICAgICAgZW5kID0gc3RyaW5nLmxlbmd0aDtcbiAgICB9XG4gICAgbGV0IG4gPSBzdGFydFZhbHVlO1xuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KGkpID09IDkpXG4gICAgICAgICAgICBuICs9IHRhYlNpemUgLSAobiAlIHRhYlNpemUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuKys7XG4gICAgfVxuICAgIHJldHVybiBuO1xufVxuLyoqXG5FbmNhcHN1bGF0ZXMgYSBzaW5nbGUgbGluZSBvZiBpbnB1dC4gR2l2ZW4gdG8gc3RyZWFtIHN5bnRheCBjb2RlLFxud2hpY2ggdXNlcyBpdCB0byB0b2tlbml6ZSB0aGUgY29udGVudC5cbiovXG5jbGFzcyBTdHJpbmdTdHJlYW0ge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHN0cmVhbS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBsaW5lLlxuICAgICovXG4gICAgc3RyaW5nLCB0YWJTaXplLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBpbmRlbnQgdW5pdCBzaXplLlxuICAgICovXG4gICAgaW5kZW50VW5pdCwgbG9va0FoZWFkLCBvdmVycmlkZUluZGVudCkge1xuICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZztcbiAgICAgICAgdGhpcy50YWJTaXplID0gdGFiU2l6ZTtcbiAgICAgICAgdGhpcy5pbmRlbnRVbml0ID0gaW5kZW50VW5pdDtcbiAgICAgICAgdGhpcy5sb29rQWhlYWQgPSBsb29rQWhlYWQ7XG4gICAgICAgIHRoaXMub3ZlcnJpZGVJbmRlbnQgPSBvdmVycmlkZUluZGVudDtcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBsaW5lLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4uXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhcnQgPSAwO1xuICAgICAgICB0aGlzLmxhc3RDb2x1bW5Qb3MgPSAwO1xuICAgICAgICB0aGlzLmxhc3RDb2x1bW5WYWx1ZSA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFRydWUgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBlb2woKSB7IHJldHVybiB0aGlzLnBvcyA+PSB0aGlzLnN0cmluZy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBUcnVlIGlmIHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBzb2woKSB7IHJldHVybiB0aGlzLnBvcyA9PSAwOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBuZXh0IGNvZGUgdW5pdCBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbiwgb3IgdW5kZWZpbmVkXG4gICAgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIHBlZWsoKSB7IHJldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpIHx8IHVuZGVmaW5lZDsgfVxuICAgIC8qKlxuICAgIFJlYWQgdGhlIG5leHQgY29kZSB1bml0IGFuZCBhZHZhbmNlIGB0aGlzLnBvc2AuXG4gICAgKi9cbiAgICBuZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5wb3MgPCB0aGlzLnN0cmluZy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKyspO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXRjaCB0aGUgbmV4dCBjaGFyYWN0ZXIgYWdhaW5zdCB0aGUgZ2l2ZW4gc3RyaW5nLCByZWd1bGFyXG4gICAgZXhwcmVzc2lvbiwgb3IgcHJlZGljYXRlLiBDb25zdW1lIGFuZCByZXR1cm4gaXQgaWYgaXQgbWF0Y2hlcy5cbiAgICAqL1xuICAgIGVhdChtYXRjaCkge1xuICAgICAgICBsZXQgY2ggPSB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpO1xuICAgICAgICBsZXQgb2s7XG4gICAgICAgIGlmICh0eXBlb2YgbWF0Y2ggPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIG9rID0gY2ggPT0gbWF0Y2g7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG9rID0gY2ggJiYgKG1hdGNoIGluc3RhbmNlb2YgUmVnRXhwID8gbWF0Y2gudGVzdChjaCkgOiBtYXRjaChjaCkpO1xuICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgICAgICByZXR1cm4gY2g7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ29udGludWUgbWF0Y2hpbmcgY2hhcmFjdGVycyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBzdHJpbmcsXG4gICAgcmVndWxhciBleHByZXNzaW9uLCBvciBwcmVkaWNhdGUgZnVuY3Rpb24uIFJldHVybiB0cnVlIGlmIGFueVxuICAgIGNoYXJhY3RlcnMgd2VyZSBjb25zdW1lZC5cbiAgICAqL1xuICAgIGVhdFdoaWxlKG1hdGNoKSB7XG4gICAgICAgIGxldCBzdGFydCA9IHRoaXMucG9zO1xuICAgICAgICB3aGlsZSAodGhpcy5lYXQobWF0Y2gpKSB7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnN1bWUgd2hpdGVzcGFjZSBhaGVhZCBvZiBgdGhpcy5wb3NgLiBSZXR1cm4gdHJ1ZSBpZiBhbnkgd2FzXG4gICAgZm91bmQuXG4gICAgKi9cbiAgICBlYXRTcGFjZSgpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICgvW1xcc1xcdTAwYTBdLy50ZXN0KHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykpKVxuICAgICAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIHNraXBUb0VuZCgpIHsgdGhpcy5wb3MgPSB0aGlzLnN0cmluZy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIGRpcmVjdGx5IGJlZm9yZSB0aGUgZ2l2ZW4gY2hhcmFjdGVyLCBpZiBmb3VuZCBvbiB0aGVcbiAgICBjdXJyZW50IGxpbmUuXG4gICAgKi9cbiAgICBza2lwVG8oY2gpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gdGhpcy5zdHJpbmcuaW5kZXhPZihjaCwgdGhpcy5wb3MpO1xuICAgICAgICBpZiAoZm91bmQgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBmb3VuZDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYmFjayBgbmAgY2hhcmFjdGVycy5cbiAgICAqL1xuICAgIGJhY2tVcChuKSB7IHRoaXMucG9zIC09IG47IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNvbHVtbiBwb3NpdGlvbiBhdCBgdGhpcy5wb3NgLlxuICAgICovXG4gICAgY29sdW1uKCkge1xuICAgICAgICBpZiAodGhpcy5sYXN0Q29sdW1uUG9zIDwgdGhpcy5zdGFydCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0Q29sdW1uVmFsdWUgPSBjb3VudENvbCh0aGlzLnN0cmluZywgdGhpcy5zdGFydCwgdGhpcy50YWJTaXplLCB0aGlzLmxhc3RDb2x1bW5Qb3MsIHRoaXMubGFzdENvbHVtblZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMubGFzdENvbHVtblBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdENvbHVtblZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGluZGVudGF0aW9uIGNvbHVtbiBvZiB0aGUgY3VycmVudCBsaW5lLlxuICAgICovXG4gICAgaW5kZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMub3ZlcnJpZGVJbmRlbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvdW50Q29sKHRoaXMuc3RyaW5nLCBudWxsLCB0aGlzLnRhYlNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXRjaCB0aGUgaW5wdXQgYWdhaW5zdCB0aGUgZ2l2ZW4gc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgICh3aGljaCBzaG91bGQgc3RhcnQgd2l0aCBhIGBeYCkuIFJldHVybiB0cnVlIG9yIHRoZSByZWdleHAgbWF0Y2hcbiAgICBpZiBpdCBtYXRjaGVzLlxuICAgIFxuICAgIFVubGVzcyBgY29uc3VtZWAgaXMgc2V0IHRvIGBmYWxzZWAsIHRoaXMgd2lsbCBtb3ZlIGB0aGlzLnBvc2BcbiAgICBwYXN0IHRoZSBtYXRjaGVkIHRleHQuXG4gICAgXG4gICAgV2hlbiBtYXRjaGluZyBhIHN0cmluZyBgY2FzZUluc2Vuc2l0aXZlYCBjYW4gYmUgc2V0IHRvIHRydWUgdG9cbiAgICBtYWtlIHRoZSBtYXRjaCBjYXNlLWluc2Vuc2l0aXZlLlxuICAgICovXG4gICAgbWF0Y2gocGF0dGVybiwgY29uc3VtZSwgY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsZXQgY2FzZWQgPSAoc3RyKSA9PiBjYXNlSW5zZW5zaXRpdmUgPyBzdHIudG9Mb3dlckNhc2UoKSA6IHN0cjtcbiAgICAgICAgICAgIGxldCBzdWJzdHIgPSB0aGlzLnN0cmluZy5zdWJzdHIodGhpcy5wb3MsIHBhdHRlcm4ubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChjYXNlZChzdWJzdHIpID09IGNhc2VkKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnN1bWUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcyArPSBwYXR0ZXJuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMucG9zKS5tYXRjaChwYXR0ZXJuKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5pbmRleCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAobWF0Y2ggJiYgY29uc3VtZSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgdGhpcy5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY3VycmVudCB0b2tlbi5cbiAgICAqL1xuICAgIGN1cnJlbnQoKSB7IHJldHVybiB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLnBvcyk7IH1cbn1cblxuZnVuY3Rpb24gZnVsbFBhcnNlcihzcGVjKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogc3BlYy5uYW1lIHx8IFwiXCIsXG4gICAgICAgIHRva2VuOiBzcGVjLnRva2VuLFxuICAgICAgICBibGFua0xpbmU6IHNwZWMuYmxhbmtMaW5lIHx8ICgoKSA9PiBudWxsKSxcbiAgICAgICAgc3RhcnRTdGF0ZTogc3BlYy5zdGFydFN0YXRlIHx8ICgoKSA9PiB0cnVlKSxcbiAgICAgICAgY29weVN0YXRlOiBzcGVjLmNvcHlTdGF0ZSB8fCBkZWZhdWx0Q29weVN0YXRlLFxuICAgICAgICBpbmRlbnQ6IHNwZWMuaW5kZW50IHx8ICgoKSA9PiBudWxsKSxcbiAgICAgICAgbGFuZ3VhZ2VEYXRhOiBzcGVjLmxhbmd1YWdlRGF0YSB8fCB7fSxcbiAgICB9O1xufVxuZnVuY3Rpb24gZGVmYXVsdENvcHlTdGF0ZShzdGF0ZSkge1xuICAgIGlmICh0eXBlb2Ygc3RhdGUgIT0gXCJvYmplY3RcIilcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIGxldCBuZXdTdGF0ZSA9IHt9O1xuICAgIGZvciAobGV0IHByb3AgaW4gc3RhdGUpIHtcbiAgICAgICAgbGV0IHZhbCA9IHN0YXRlW3Byb3BdO1xuICAgICAgICBuZXdTdGF0ZVtwcm9wXSA9ICh2YWwgaW5zdGFuY2VvZiBBcnJheSA/IHZhbC5zbGljZSgpIDogdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1N0YXRlO1xufVxuY29uc3QgSW5kZW50ZWRGcm9tID0gLypAX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4vKipcbkEgW2xhbmd1YWdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSBjbGFzcyBiYXNlZCBvbiBhIENvZGVNaXJyb3JcbjUtc3R5bGUgW3N0cmVhbWluZyBwYXJzZXJdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuU3RyZWFtUGFyc2VyKS5cbiovXG5jbGFzcyBTdHJlYW1MYW5ndWFnZSBleHRlbmRzIExhbmd1YWdlIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBkZWZpbmVMYW5ndWFnZUZhY2V0KHBhcnNlci5sYW5ndWFnZURhdGEpO1xuICAgICAgICBsZXQgcCA9IGZ1bGxQYXJzZXIocGFyc2VyKSwgc2VsZjtcbiAgICAgICAgbGV0IGltcGwgPSBuZXcgY2xhc3MgZXh0ZW5kcyBQYXJzZXIge1xuICAgICAgICAgICAgY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJzZShzZWxmLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzdXBlcihkYXRhLCBpbXBsLCBbXSwgcGFyc2VyLm5hbWUpO1xuICAgICAgICB0aGlzLnRvcE5vZGUgPSBkb2NJRChkYXRhLCB0aGlzKTtcbiAgICAgICAgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3RyZWFtUGFyc2VyID0gcDtcbiAgICAgICAgdGhpcy5zdGF0ZUFmdGVyID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgc3RyZWFtIGxhbmd1YWdlLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShzcGVjKSB7IHJldHVybiBuZXcgU3RyZWFtTGFuZ3VhZ2Uoc3BlYyk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldEluZGVudChjeCkge1xuICAgICAgICBsZXQgZnJvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHsgb3ZlcnJpZGVJbmRlbnRhdGlvbiB9ID0gY3gub3B0aW9ucztcbiAgICAgICAgaWYgKG92ZXJyaWRlSW5kZW50YXRpb24pIHtcbiAgICAgICAgICAgIGZyb20gPSBJbmRlbnRlZEZyb20uZ2V0KGN4LnN0YXRlKTtcbiAgICAgICAgICAgIGlmIChmcm9tICE9IG51bGwgJiYgZnJvbSA8IGN4LnBvcyAtIDFlNClcbiAgICAgICAgICAgICAgICBmcm9tID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydCA9IGZpbmRTdGF0ZSh0aGlzLCBjeC5ub2RlLnRyZWUsIGN4Lm5vZGUuZnJvbSwgY3gubm9kZS5mcm9tLCBmcm9tICE9PSBudWxsICYmIGZyb20gIT09IHZvaWQgMCA/IGZyb20gOiBjeC5wb3MpLCBzdGF0ZVBvcywgc3RhdGU7XG4gICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBzdGFydC5zdGF0ZTtcbiAgICAgICAgICAgIHN0YXRlUG9zID0gc3RhcnQucG9zICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gdGhpcy5zdHJlYW1QYXJzZXIuc3RhcnRTdGF0ZShjeC51bml0KTtcbiAgICAgICAgICAgIHN0YXRlUG9zID0gY3gubm9kZS5mcm9tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjeC5wb3MgLSBzdGF0ZVBvcyA+IDEwMDAwIC8qIEMuTWF4SW5kZW50U2NhbkRpc3QgKi8pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKHN0YXRlUG9zIDwgY3gucG9zKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IGN4LnN0YXRlLmRvYy5saW5lQXQoc3RhdGVQb3MpLCBlbmQgPSBNYXRoLm1pbihjeC5wb3MsIGxpbmUudG8pO1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluZGVudGF0aW9uID0gb3ZlcnJpZGVJbmRlbnRhdGlvbiA/IG92ZXJyaWRlSW5kZW50YXRpb24obGluZS5mcm9tKSA6IC0xO1xuICAgICAgICAgICAgICAgIGxldCBsb29rYWhlYWQgPSAobikgPT4gbiArIGxpbmUubnVtYmVyID4gY3guc3RhdGUuZG9jLmxpbmVzID8gJycgOiBjeC5zdGF0ZS5kb2MubGluZShuICsgbGluZS5udW1iZXIpLnRleHQ7XG4gICAgICAgICAgICAgICAgbGV0IHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0obGluZS50ZXh0LCBjeC5zdGF0ZS50YWJTaXplLCBjeC51bml0LCBsb29rYWhlYWQsIGluZGVudGF0aW9uIDwgMCA/IHVuZGVmaW5lZCA6IGluZGVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoc3RyZWFtLnBvcyA8IGVuZCAtIGxpbmUuZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgcmVhZFRva2VuKHRoaXMuc3RyZWFtUGFyc2VyLnRva2VuLCBzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtUGFyc2VyLmJsYW5rTGluZShzdGF0ZSwgY3gudW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kID09IGN4LnBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHN0YXRlUG9zID0gbGluZS50byArIDE7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpbmUgPSBjeC5saW5lQXQoY3gucG9zKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlSW5kZW50YXRpb24gJiYgZnJvbSA9PSBudWxsKVxuICAgICAgICAgICAgSW5kZW50ZWRGcm9tLnNldChjeC5zdGF0ZSwgbGluZS5mcm9tKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuc3RyZWFtUGFyc2VyLmluZGVudChzdGF0ZSwgL15cXHMqKC4qKS8uZXhlYyhsaW5lLnRleHQpWzFdLCBjeCk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LnRvU3RyaW5nKCkgPT09ICdDb2RlTWlycm9yLlBhc3MnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBnZXQgYWxsb3dzTmVzdGluZygpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5mdW5jdGlvbiBmaW5kU3RhdGUobGFuZywgdHJlZSwgb2ZmLCBzdGFydFBvcywgYmVmb3JlKSB7XG4gICAgbGV0IHN0YXRlID0gb2ZmID49IHN0YXJ0UG9zICYmIG9mZiArIHRyZWUubGVuZ3RoIDw9IGJlZm9yZSAmJiB0cmVlLnByb3AobGFuZy5zdGF0ZUFmdGVyKTtcbiAgICBpZiAoc3RhdGUpXG4gICAgICAgIHJldHVybiB7IHN0YXRlOiBsYW5nLnN0cmVhbVBhcnNlci5jb3B5U3RhdGUoc3RhdGUpLCBwb3M6IG9mZiArIHRyZWUubGVuZ3RoIH07XG4gICAgZm9yIChsZXQgaSA9IHRyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IGNoaWxkID0gdHJlZS5jaGlsZHJlbltpXSwgcG9zID0gb2ZmICsgdHJlZS5wb3NpdGlvbnNbaV07XG4gICAgICAgIGxldCBmb3VuZCA9IGNoaWxkIGluc3RhbmNlb2YgVHJlZSAmJiBwb3MgPCBiZWZvcmUgJiYgZmluZFN0YXRlKGxhbmcsIGNoaWxkLCBwb3MsIHN0YXJ0UG9zLCBiZWZvcmUpO1xuICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY3V0VHJlZShsYW5nLCB0cmVlLCBmcm9tLCB0bywgaW5zaWRlKSB7XG4gICAgaWYgKGluc2lkZSAmJiBmcm9tIDw9IDAgJiYgdG8gPj0gdHJlZS5sZW5ndGgpXG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgIGlmICghaW5zaWRlICYmIGZyb20gPT0gMCAmJiB0cmVlLnR5cGUgPT0gbGFuZy50b3BOb2RlKVxuICAgICAgICBpbnNpZGUgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSB0cmVlLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGxldCBwb3MgPSB0cmVlLnBvc2l0aW9uc1tpXSwgY2hpbGQgPSB0cmVlLmNoaWxkcmVuW2ldLCBpbm5lcjtcbiAgICAgICAgaWYgKHBvcyA8IHRvICYmIGNoaWxkIGluc3RhbmNlb2YgVHJlZSkge1xuICAgICAgICAgICAgaWYgKCEoaW5uZXIgPSBjdXRUcmVlKGxhbmcsIGNoaWxkLCBmcm9tIC0gcG9zLCB0byAtIHBvcywgaW5zaWRlKSkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICByZXR1cm4gIWluc2lkZSA/IGlubmVyXG4gICAgICAgICAgICAgICAgOiBuZXcgVHJlZSh0cmVlLnR5cGUsIHRyZWUuY2hpbGRyZW4uc2xpY2UoMCwgaSkuY29uY2F0KGlubmVyKSwgdHJlZS5wb3NpdGlvbnMuc2xpY2UoMCwgaSArIDEpLCBwb3MgKyBpbm5lci5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZmluZFN0YXJ0SW5GcmFnbWVudHMobGFuZywgZnJhZ21lbnRzLCBzdGFydFBvcywgZW5kUG9zLCBlZGl0b3JTdGF0ZSkge1xuICAgIGZvciAobGV0IGYgb2YgZnJhZ21lbnRzKSB7XG4gICAgICAgIGxldCBmcm9tID0gZi5mcm9tICsgKGYub3BlblN0YXJ0ID8gMjUgOiAwKSwgdG8gPSBmLnRvIC0gKGYub3BlbkVuZCA/IDI1IDogMCk7XG4gICAgICAgIGxldCBmb3VuZCA9IGZyb20gPD0gc3RhcnRQb3MgJiYgdG8gPiBzdGFydFBvcyAmJiBmaW5kU3RhdGUobGFuZywgZi50cmVlLCAwIC0gZi5vZmZzZXQsIHN0YXJ0UG9zLCB0byksIHRyZWU7XG4gICAgICAgIGlmIChmb3VuZCAmJiBmb3VuZC5wb3MgPD0gZW5kUG9zICYmICh0cmVlID0gY3V0VHJlZShsYW5nLCBmLnRyZWUsIHN0YXJ0UG9zICsgZi5vZmZzZXQsIGZvdW5kLnBvcyArIGYub2Zmc2V0LCBmYWxzZSkpKVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdGU6IGZvdW5kLnN0YXRlLCB0cmVlIH07XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXRlOiBsYW5nLnN0cmVhbVBhcnNlci5zdGFydFN0YXRlKGVkaXRvclN0YXRlID8gZ2V0SW5kZW50VW5pdChlZGl0b3JTdGF0ZSkgOiA0KSwgdHJlZTogVHJlZS5lbXB0eSB9O1xufVxuY2xhc3MgUGFyc2Uge1xuICAgIGNvbnN0cnVjdG9yKGxhbmcsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICB0aGlzLmxhbmcgPSBsYW5nO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcztcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBudWxsO1xuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rUG9zID0gW107XG4gICAgICAgIHRoaXMuY2h1bmsgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1JldXNlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy50b2tlbkNhY2hlID0ge307XG4gICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IDA7XG4gICAgICAgIHRoaXMudG8gPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLnRvO1xuICAgICAgICBsZXQgY29udGV4dCA9IFBhcnNlQ29udGV4dC5nZXQoKSwgZnJvbSA9IHJhbmdlc1swXS5mcm9tO1xuICAgICAgICBsZXQgeyBzdGF0ZSwgdHJlZSB9ID0gZmluZFN0YXJ0SW5GcmFnbWVudHMobGFuZywgZnJhZ21lbnRzLCBmcm9tLCB0aGlzLnRvLCBjb250ZXh0ID09PSBudWxsIHx8IGNvbnRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbnRleHQuc3RhdGUpO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMucGFyc2VkUG9zID0gdGhpcy5jaHVua1N0YXJ0ID0gZnJvbSArIHRyZWUubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyZWUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtzLnB1c2godHJlZS5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB0aGlzLmNodW5rUG9zLnB1c2godHJlZS5wb3NpdGlvbnNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250ZXh0ICYmIHRoaXMucGFyc2VkUG9zIDwgY29udGV4dC52aWV3cG9ydC5mcm9tIC0gMTAwMDAwIC8qIEMuTWF4RGlzdGFuY2VCZWZvcmVWaWV3cG9ydCAqLyAmJlxuICAgICAgICAgICAgcmFuZ2VzLnNvbWUociA9PiByLmZyb20gPD0gY29udGV4dC52aWV3cG9ydC5mcm9tICYmIHIudG8gPj0gY29udGV4dC52aWV3cG9ydC5mcm9tKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMubGFuZy5zdHJlYW1QYXJzZXIuc3RhcnRTdGF0ZShnZXRJbmRlbnRVbml0KGNvbnRleHQuc3RhdGUpKTtcbiAgICAgICAgICAgIGNvbnRleHQuc2tpcFVudGlsSW5WaWV3KHRoaXMucGFyc2VkUG9zLCBjb250ZXh0LnZpZXdwb3J0LmZyb20pO1xuICAgICAgICAgICAgdGhpcy5wYXJzZWRQb3MgPSBjb250ZXh0LnZpZXdwb3J0LmZyb207XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb3ZlUmFuZ2VJbmRleCgpO1xuICAgIH1cbiAgICBhZHZhbmNlKCkge1xuICAgICAgICBsZXQgY29udGV4dCA9IFBhcnNlQ29udGV4dC5nZXQoKTtcbiAgICAgICAgbGV0IHBhcnNlRW5kID0gdGhpcy5zdG9wcGVkQXQgPT0gbnVsbCA/IHRoaXMudG8gOiBNYXRoLm1pbih0aGlzLnRvLCB0aGlzLnN0b3BwZWRBdCk7XG4gICAgICAgIGxldCBlbmQgPSBNYXRoLm1pbihwYXJzZUVuZCwgdGhpcy5jaHVua1N0YXJ0ICsgMjA0OCAvKiBDLkNodW5rU2l6ZSAqLyk7XG4gICAgICAgIC8vIFBhcnNlIGp1c3QgYSBsaXR0bGUgYml0IG1vcmUgdGhhbiB0aGUgdmlld3BvcnQuXG4gICAgICAgIGxldCBvdmVyYnVmZmVyID0gNTAwMDtcbiAgICAgICAgbGV0IHZpZXdwb3J0RW5kID0gY29udGV4dC52aWV3cG9ydC50byArIG92ZXJidWZmZXI7XG4gICAgICAgIGlmIChjb250ZXh0KVxuICAgICAgICAgICAgZW5kID0gTWF0aC5taW4oZW5kLCB2aWV3cG9ydEVuZCk7XG4gICAgICAgIHdoaWxlICh0aGlzLnBhcnNlZFBvcyA8IGVuZClcbiAgICAgICAgICAgIHRoaXMucGFyc2VMaW5lKGNvbnRleHQpO1xuICAgICAgICBpZiAodGhpcy5jaHVua1N0YXJ0IDwgdGhpcy5wYXJzZWRQb3MpXG4gICAgICAgICAgICB0aGlzLmZpbmlzaENodW5rKCk7XG4gICAgICAgIGlmICh0aGlzLnBhcnNlZFBvcyA+PSBwYXJzZUVuZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaCgpO1xuICAgICAgICBpZiAoY29udGV4dCAmJiB0aGlzLnBhcnNlZFBvcyA+PSB2aWV3cG9ydEVuZCkge1xuICAgICAgICAgICAgY29udGV4dC5za2lwVW50aWxJblZpZXcodGhpcy5wYXJzZWRQb3MgLSBvdmVyYnVmZmVyLCBwYXJzZUVuZCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2goKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc3RvcEF0KHBvcykge1xuICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IHBvcztcbiAgICB9XG4gICAgbGluZUFmdGVyKHBvcykge1xuICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLmlucHV0LmNodW5rKHBvcyk7XG4gICAgICAgIGlmICghdGhpcy5pbnB1dC5saW5lQ2h1bmtzKSB7XG4gICAgICAgICAgICBsZXQgZW9sID0gY2h1bmsuaW5kZXhPZihcIlxcblwiKTtcbiAgICAgICAgICAgIGlmIChlb2wgPiAtMSlcbiAgICAgICAgICAgICAgICBjaHVuayA9IGNodW5rLnNsaWNlKDAsIGVvbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2h1bmsgPT0gXCJcXG5cIikge1xuICAgICAgICAgICAgY2h1bmsgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3MgKyBjaHVuay5sZW5ndGggPD0gdGhpcy50byA/IGNodW5rIDogY2h1bmsuc2xpY2UoMCwgdGhpcy50byAtIHBvcyk7XG4gICAgfVxuICAgIG5leHRMaW5lKCkge1xuICAgICAgICBsZXQgZnJvbSA9IHRoaXMucGFyc2VkUG9zLCBsaW5lID0gdGhpcy5saW5lQWZ0ZXIoZnJvbSksIGVuZCA9IGZyb20gKyBsaW5lLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSB0aGlzLnJhbmdlSW5kZXg7Oykge1xuICAgICAgICAgICAgbGV0IHJhbmdlRW5kID0gdGhpcy5yYW5nZXNbaW5kZXhdLnRvO1xuICAgICAgICAgICAgaWYgKHJhbmdlRW5kID49IGVuZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNsaWNlKDAsIHJhbmdlRW5kIC0gKGVuZCAtIGxpbmUubGVuZ3RoKSk7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IHRoaXMucmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCByYW5nZVN0YXJ0ID0gdGhpcy5yYW5nZXNbaW5kZXhdLmZyb207XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSB0aGlzLmxpbmVBZnRlcihyYW5nZVN0YXJ0KTtcbiAgICAgICAgICAgIGxpbmUgKz0gYWZ0ZXI7XG4gICAgICAgICAgICBlbmQgPSByYW5nZVN0YXJ0ICsgYWZ0ZXIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGxpbmUsIGVuZCB9O1xuICAgIH1cbiAgICBza2lwR2Fwc1RvKHBvcywgb2Zmc2V0LCBzaWRlKSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBlbmQgPSB0aGlzLnJhbmdlc1t0aGlzLnJhbmdlSW5kZXhdLnRvLCBvZmZQb3MgPSBwb3MgKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoc2lkZSA+IDAgPyBlbmQgPiBvZmZQb3MgOiBlbmQgPj0gb2ZmUG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5yYW5nZXNbKyt0aGlzLnJhbmdlSW5kZXhdLmZyb207XG4gICAgICAgICAgICBvZmZzZXQgKz0gc3RhcnQgLSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgbW92ZVJhbmdlSW5kZXgoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnJhbmdlc1t0aGlzLnJhbmdlSW5kZXhdLnRvIDwgdGhpcy5wYXJzZWRQb3MpXG4gICAgICAgICAgICB0aGlzLnJhbmdlSW5kZXgrKztcbiAgICB9XG4gICAgZW1pdFRva2VuKGlkLCBmcm9tLCB0bywgc2l6ZSwgb2Zmc2V0KSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnNraXBHYXBzVG8oZnJvbSwgb2Zmc2V0LCAxKTtcbiAgICAgICAgICAgIGZyb20gKz0gb2Zmc2V0O1xuICAgICAgICAgICAgbGV0IGxlbjAgPSB0aGlzLmNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuc2tpcEdhcHNUbyh0bywgb2Zmc2V0LCAtMSk7XG4gICAgICAgICAgICB0byArPSBvZmZzZXQ7XG4gICAgICAgICAgICBzaXplICs9IHRoaXMuY2h1bmsubGVuZ3RoIC0gbGVuMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuY2h1bmsubGVuZ3RoIC0gNDtcbiAgICAgICAgaWYgKHNpemUgPT0gNCAmJiBsYXN0ID49IDAgJiYgdGhpcy5jaHVua1tsYXN0XSA9PSBpZCAmJiB0aGlzLmNodW5rW2xhc3QgKyAyXSA9PSBmcm9tKVxuICAgICAgICAgICAgdGhpcy5jaHVua1tsYXN0ICsgMl0gPSB0bztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5jaHVuay5wdXNoKGlkLCBmcm9tLCB0bywgc2l6ZSk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIHBhcnNlTGluZShjb250ZXh0KSB7XG4gICAgICAgIGxldCB7IGxpbmUsIGVuZCB9ID0gdGhpcy5uZXh0TGluZSgpLCBvZmZzZXQgPSAwLCB7IHN0cmVhbVBhcnNlciB9ID0gdGhpcy5sYW5nLCB7IHRva2VuQ2FjaGUgfSA9IHRoaXM7XG4gICAgICAgIGxldCBsb29rYWhlYWQgPSAobikgPT4ge1xuICAgICAgICAgICAgbGV0IHBvcyA9IHRoaXMucGFyc2VkUG9zO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwb3MgKz0gdGhpcy5saW5lQWZ0ZXIocG9zKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA8IHRoaXMuaW5wdXQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBwb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpbmVBZnRlcihwb3MpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgc3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbShsaW5lLCBjb250ZXh0ID8gY29udGV4dC5zdGF0ZS50YWJTaXplIDogNCwgY29udGV4dCA/IGdldEluZGVudFVuaXQoY29udGV4dC5zdGF0ZSkgOiAyLCBsb29rYWhlYWQpO1xuICAgICAgICBsZXQgY2h1bmtzID0gW107XG4gICAgICAgIGxldCBsaW5lQ2xhc3NlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgaWYgKHN0cmVhbS5lb2woKSkge1xuICAgICAgICAgICAgbGV0IHRva2VuID0gc3RyZWFtUGFyc2VyLmJsYW5rTGluZSh0aGlzLnN0YXRlLCBzdHJlYW0uaW5kZW50VW5pdCk7XG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0b2tlbi5zcGxpdCgnICcpLmZvckVhY2godCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVDbGFzcyA9IHQubWF0Y2goL15saW5lLShiYWNrZ3JvdW5kLSk/KC4qKSQvKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZUNsYXNzZXMuYWRkKGxpbmVDbGFzc1syXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gbnVsbDtcbiAgICAgICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRva2VuID0gcmVhZFRva2VuKHN0cmVhbVBhcnNlci50b2tlbiwgc3RyZWFtLCB0aGlzLnN0YXRlKTtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhY2hlZCA9IHRva2VuQ2FjaGVbdG9rZW5dO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGluZWNscyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2xzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHMgPSBjYWNoZWRbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lY2xzID0gY2FjaGVkWzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRva2VucyA9IHRva2VuLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbnMuZmlsdGVyKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lQ2xhc3MgPSB0Lm1hdGNoKC9ebGluZS0oYmFja2dyb3VuZC0pPyguKikkLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lY2xzLnB1c2gobGluZUNsYXNzWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gdG9rZW5zLnNvcnQoKS5qb2luKCcgJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbkNhY2hlW3Rva2VuXSA9IFtjbHMsIGxpbmVjbHNdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lY2xzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNscyBvZiBsaW5lY2xzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUNsYXNzZXMuYWRkKGNscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyb20gPSB0aGlzLnBhcnNlZFBvcyArIHN0cmVhbS5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvID0gdGhpcy5wYXJzZWRQb3MgKyBzdHJlYW0ucG9zO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCAmJiBsYXN0LmNscyA9PT0gY2xzICYmIGxhc3QudG8gPT09IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QudG8gPSB0bztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSB7IGNscywgZnJvbSwgdG8gfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGxhc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5lbWl0VG9rZW4odG9rZW5JRChjaHVuay5jbHMpLCBjaHVuay5mcm9tLCBjaHVuay50bywgNCwgb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGluZUNsYXNzZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuZW1pdFRva2VuKHRva2VuSUQoQXJyYXkuZnJvbShsaW5lQ2xhc3Nlcykuc29ydCgpLmpvaW4oJyAnKSwgdHJ1ZSksIHRoaXMucGFyc2VkUG9zLCB0aGlzLnBhcnNlZFBvcyArIGxpbmUubGVuZ3RoLCAoY2h1bmtzLmxlbmd0aCArIDEpICogNCwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnNlZFBvcyA9IGVuZDtcbiAgICAgICAgdGhpcy5tb3ZlUmFuZ2VJbmRleCgpO1xuICAgICAgICBpZiAodGhpcy5wYXJzZWRQb3MgPCB0aGlzLnRvKVxuICAgICAgICAgICAgdGhpcy5wYXJzZWRQb3MrKztcbiAgICB9XG4gICAgZmluaXNoQ2h1bmsoKSB7XG4gICAgICAgIGxldCB0cmVlID0gVHJlZS5idWlsZCh7XG4gICAgICAgICAgICBidWZmZXI6IHRoaXMuY2h1bmssXG4gICAgICAgICAgICBzdGFydDogdGhpcy5jaHVua1N0YXJ0LFxuICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLnBhcnNlZFBvcyAtIHRoaXMuY2h1bmtTdGFydCxcbiAgICAgICAgICAgIG5vZGVTZXQsXG4gICAgICAgICAgICB0b3BJRDogMCxcbiAgICAgICAgICAgIG1heEJ1ZmZlckxlbmd0aDogMjA0OCAvKiBDLkNodW5rU2l6ZSAqLyxcbiAgICAgICAgICAgIHJldXNlZDogdGhpcy5jaHVua1JldXNlZFxuICAgICAgICB9KTtcbiAgICAgICAgdHJlZSA9IG5ldyBUcmVlKHRyZWUudHlwZSwgdHJlZS5jaGlsZHJlbiwgdHJlZS5wb3NpdGlvbnMsIHRyZWUubGVuZ3RoLCBbW3RoaXMubGFuZy5zdGF0ZUFmdGVyLCB0aGlzLmxhbmcuc3RyZWFtUGFyc2VyLmNvcHlTdGF0ZSh0aGlzLnN0YXRlKV1dKTtcbiAgICAgICAgdGhpcy5jaHVua3MucHVzaCh0cmVlKTtcbiAgICAgICAgdGhpcy5jaHVua1Bvcy5wdXNoKHRoaXMuY2h1bmtTdGFydCAtIHRoaXMucmFuZ2VzWzBdLmZyb20pO1xuICAgICAgICB0aGlzLmNodW5rID0gW107XG4gICAgICAgIHRoaXMuY2h1bmtSZXVzZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2h1bmtTdGFydCA9IHRoaXMucGFyc2VkUG9zO1xuICAgIH1cbiAgICBmaW5pc2goKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJlZSh0aGlzLmxhbmcudG9wTm9kZSwgdGhpcy5jaHVua3MsIHRoaXMuY2h1bmtQb3MsIHRoaXMucGFyc2VkUG9zIC0gdGhpcy5yYW5nZXNbMF0uZnJvbSkuYmFsYW5jZSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlYWRUb2tlbih0b2tlbiwgc3RyZWFtLCBzdGF0ZSkge1xuICAgIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3M7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0b2tlbihzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgaWYgKHN0cmVhbS5wb3MgPiBzdHJlYW0uc3RhcnQpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdHJlYW0gcGFyc2VyIGZhaWxlZCB0byBhZHZhbmNlIHN0cmVhbS5cIik7XG59XG5jb25zdCB0b2tlblRhYmxlID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5jb25zdCB0eXBlQXJyYXkgPSBbTm9kZVR5cGUubm9uZV07XG5jb25zdCBub2RlU2V0ID0gLypAX19QVVJFX18qL25ldyBOb2RlU2V0KHR5cGVBcnJheSk7XG4vLyBDYWNoZSBvZiBub2RlIHR5cGVzIGJ5IG5hbWUgYW5kIHRhZ3NcbmNvbnN0IGJ5VGFnID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5mdW5jdGlvbiB0b2tlbklEKHRhZywgbGluZU1vZGUpIHtcbiAgICByZXR1cm4gIXRhZyA/IDAgOiB0b2tlblRhYmxlW3RhZ10gfHwgKHRva2VuVGFibGVbdGFnXSA9IGNyZWF0ZVRva2VuVHlwZSh0YWcsIGxpbmVNb2RlKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVUb2tlblR5cGUodGFnU3RyLCBsaW5lTW9kZSkge1xuICAgIGxldCBuYW1lID0gdGFnU3RyLnJlcGxhY2UoLyAvZywgXCJfXCIpLCBrZXkgPSBuYW1lO1xuICAgIGxldCBrbm93biA9IGJ5VGFnW2tleV07XG4gICAgaWYgKGtub3duKVxuICAgICAgICByZXR1cm4ga25vd24uaWQ7XG4gICAgbGV0IHR5cGUgPSBieVRhZ1trZXldID0gTm9kZVR5cGUuZGVmaW5lKHtcbiAgICAgICAgaWQ6IHR5cGVBcnJheS5sZW5ndGgsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHByb3BzOiBbbGluZU1vZGUgPyBsaW5lQ2xhc3NOb2RlUHJvcC5hZGQoeyBbbmFtZV06IHRhZ1N0ciB9KSA6IHRva2VuQ2xhc3NOb2RlUHJvcC5hZGQoeyBbbmFtZV06IHRhZ1N0ciB9KV1cbiAgICB9KTtcbiAgICB0eXBlQXJyYXkucHVzaCh0eXBlKTtcbiAgICByZXR1cm4gdHlwZS5pZDtcbn1cbmZ1bmN0aW9uIGRvY0lEKGRhdGEsIGxhbmcpIHtcbiAgICBsZXQgdHlwZSA9IE5vZGVUeXBlLmRlZmluZSh7IGlkOiB0eXBlQXJyYXkubGVuZ3RoLCBuYW1lOiBcIkRvY3VtZW50XCIsIHByb3BzOiBbXG4gICAgICAgICAgICBsYW5ndWFnZURhdGFQcm9wLmFkZCgoKSA9PiBkYXRhKSxcbiAgICAgICAgICAgIGluZGVudE5vZGVQcm9wLmFkZCgoKSA9PiBjeCA9PiBsYW5nLmdldEluZGVudChjeCkpXG4gICAgICAgIF0sIHRvcDogdHJ1ZSB9KTtcbiAgICB0eXBlQXJyYXkucHVzaCh0eXBlKTtcbiAgICByZXR1cm4gdHlwZTtcbn1cbi8vIFRoZSBOb2RlUHJvcCB0aGF0IGhvbGRzIHRoZSBjc3MgY2xhc3Mgd2Ugd2FudCB0byBhcHBseVxuY29uc3QgdG9rZW5DbGFzc05vZGVQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuY29uc3QgbGluZUNsYXNzTm9kZVByb3AgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG5jbGFzcyBMaW5lSGlnaGxpZ2h0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy5saW5lQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLnRva2VuQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLnRyZWUgPSBzeW50YXhUcmVlKHZpZXcuc3RhdGUpO1xuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5idWlsZERlY28odmlldyk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKHVwZGF0ZS5zdGF0ZSk7XG4gICAgICAgIGlmICh0cmVlLmxlbmd0aCA8IHVwZGF0ZS52aWV3LnZpZXdwb3J0LnRvIHx8IHVwZGF0ZS52aWV3LmNvbXBvc2l0aW9uU3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZGVjb3JhdGlvbnMubWFwKHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0cmVlICE9IHRoaXMudHJlZSB8fCB1cGRhdGUudmlld3BvcnRDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBidWlsZERlY28odmlldykge1xuICAgICAgICBpZiAoIXRoaXMudHJlZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICBsZXQgc3BlbGxjaGVja0lnbm9yZVRva2VucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzdHIgb2Ygdmlldy5zdGF0ZS5mYWNldChpZ25vcmVTcGVsbGNoZWNrVG9rZW4pKSB7XG4gICAgICAgICAgICBzcGVsbGNoZWNrSWdub3JlVG9rZW5zLnB1c2goLi4uc3RyLnNwbGl0KCcgJykpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzcGVsbENoZWNrSWdub3JlU2V0ID0gbmV3IFNldChzcGVsbGNoZWNrSWdub3JlVG9rZW5zKTtcbiAgICAgICAgbGV0IGhhc1NwZWxsY2hlY2tJZ25vcmVUb2tlbnMgPSBzcGVsbENoZWNrSWdub3JlU2V0LnNpemUgPiAwO1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICAgICAgbGV0IGxhc3RQb3MgPSAwO1xuICAgICAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2Ygdmlldy52aXNpYmxlUmFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWUuaXRlcmF0ZSh7XG4gICAgICAgICAgICAgICAgZnJvbSwgdG8sXG4gICAgICAgICAgICAgICAgZW50ZXI6ICh7IHR5cGUsIGZyb20sIHRvIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVTdHlsZSA9IHR5cGUucHJvcChsaW5lQ2xhc3NOb2RlUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lU3R5bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lRGVjbyA9IHRoaXMubGluZUNhY2hlW2xpbmVTdHlsZV0gfHwgKHRoaXMubGluZUNhY2hlW2xpbmVTdHlsZV0gPSBEZWNvcmF0aW9uLmxpbmUoeyBhdHRyaWJ1dGVzOiB7IGNsYXNzOiBsaW5lU3R5bGUgfSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RnJvbSA9IHZpZXcubGluZUJsb2NrQXQoZnJvbSkuZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBsaW5lIG1vZGVzIHRoYXQgc3RhcnQgZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSBsaW5lIHRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UG9zID4gbmV3RnJvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKG5ld0Zyb20sIG5ld0Zyb20sIGxpbmVEZWNvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBuZXdGcm9tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b2tlblN0eWxlID0gdHlwZS5wcm9wKHRva2VuQ2xhc3NOb2RlUHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFBvcyA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZURlY28gPSB0aGlzLnRva2VuQ2FjaGVbdG9rZW5TdHlsZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmVEZWNvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRva2VucyA9IHRva2VuU3R5bGUuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BlYyA9IHsgY2xhc3M6IHRva2Vucy5tYXAoYyA9PiAnY20tJyArIGMpLmpvaW4oJyAnKSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNTcGVsbGNoZWNrSWdub3JlVG9rZW5zICYmIHRva2Vucy5zb21lKHRva2VuID0+IHNwZWxsQ2hlY2tJZ25vcmVTZXQuaGFzKHRva2VuKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYy5hdHRyaWJ1dGVzID0geyBzcGVsbGNoZWNrOiAnZmFsc2UnIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVEZWNvID0gdGhpcy50b2tlbkNhY2hlW3Rva2VuU3R5bGVdID0gRGVjb3JhdGlvbi5tYXJrKHNwZWMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGQoZnJvbSwgdG8sIGxpbmVEZWNvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQb3MgPSB0bztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmZpbmlzaCgpO1xuICAgIH1cbn1cbi8vIFRoaXMgZXh0ZW5zaW9uIGluc3RhbGxzIGEgaGlnaGxpZ2h0ZXIgdGhhdCBoaWdobGlnaHRzIGxpbmVzIGJhc2VkIG9uIHRoZSBub2RlIHByb3AgYWJvdmVcbmNvbnN0IGxpbmVIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9QcmVjLmxvd2VzdCgvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5kZWZpbmUodmlldyA9PiBuZXcgTGluZUhpZ2hsaWdodGVyKHZpZXcpLCB7XG4gICAgZGVjb3JhdGlvbnM6IHYgPT4gdi5kZWNvcmF0aW9uc1xufSkpO1xuY29uc3QgaWdub3JlU3BlbGxjaGVja1Rva2VuID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7fSk7XG5cbmZ1bmN0aW9uIGJ1aWxkRm9yTGluZShsaW5lKSB7XG4gICAgcmV0dXJuIGxpbmUubGVuZ3RoIDw9IDQwOTYgJiYgL1tcXHUwNTkwLVxcdTA1ZjRcXHUwNjAwLVxcdTA2ZmZcXHUwNzAwLVxcdTA4YWNcXHVmYjUwLVxcdWZkZmZdLy50ZXN0KGxpbmUpO1xufVxuZnVuY3Rpb24gdGV4dEhhc1JUTCh0ZXh0KSB7XG4gICAgZm9yIChsZXQgaSA9IHRleHQuaXRlcigpOyAhaS5uZXh0KCkuZG9uZTspXG4gICAgICAgIGlmIChidWlsZEZvckxpbmUoaS52YWx1ZSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBjaGFuZ2VBZGRzUlRMKGNoYW5nZSkge1xuICAgIGxldCBhZGRlZCA9IGZhbHNlO1xuICAgIGNoYW5nZS5pdGVyQ2hhbmdlcygoZkEsIHRBLCBmQiwgdEIsIGlucykgPT4ge1xuICAgICAgICBpZiAoIWFkZGVkICYmIHRleHRIYXNSVEwoaW5zKSlcbiAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWRkZWQ7XG59XG5jb25zdCBhbHdheXNJc29sYXRlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuc29tZSh4ID0+IHgpIH0pO1xuLyoqXG5NYWtlIHN1cmUgbm9kZXNcblttYXJrZWRdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1vbi5Ob2RlUHJvcF5pc29sYXRlKVxuYXMgaXNvbGF0aW5nIGZvciBiaWRpcmVjdGlvbmFsIHRleHQgYXJlIHJlbmRlcmVkIGluIGEgd2F5IHRoYXRcbmlzb2xhdGVzIHRoZW0gZnJvbSB0aGUgc3Vycm91bmRpbmcgdGV4dC5cbiovXG5mdW5jdGlvbiBiaWRpSXNvbGF0ZXMob3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGV4dGVuc2lvbnMgPSBbaXNvbGF0ZU1hcmtzXTtcbiAgICBpZiAob3B0aW9ucy5hbHdheXNJc29sYXRlKVxuICAgICAgICBleHRlbnNpb25zLnB1c2goYWx3YXlzSXNvbGF0ZS5vZih0cnVlKSk7XG4gICAgcmV0dXJuIGV4dGVuc2lvbnM7XG59XG5jb25zdCBpc29sYXRlTWFya3MgPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy5hbHdheXMgPSB2aWV3LnN0YXRlLmZhY2V0KGFsd2F5c0lzb2xhdGUpIHx8XG4gICAgICAgICAgICB2aWV3LnRleHREaXJlY3Rpb24gIT0gRGlyZWN0aW9uLkxUUiB8fFxuICAgICAgICAgICAgdmlldy5zdGF0ZS5mYWNldChFZGl0b3JWaWV3LnBlckxpbmVUZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgdGhpcy5oYXNSVEwgPSAhdGhpcy5hbHdheXMgJiYgdGV4dEhhc1JUTCh2aWV3LnN0YXRlLmRvYyk7XG4gICAgICAgIHRoaXMudHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG4gICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmFsd2F5cyB8fCB0aGlzLmhhc1JUTCA/IGJ1aWxkRGVjbyh2aWV3LCB0aGlzLnRyZWUsIHRoaXMuYWx3YXlzKSA6IERlY29yYXRpb24ubm9uZTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBsZXQgYWx3YXlzID0gdXBkYXRlLnN0YXRlLmZhY2V0KGFsd2F5c0lzb2xhdGUpIHx8XG4gICAgICAgICAgICB1cGRhdGUudmlldy50ZXh0RGlyZWN0aW9uICE9IERpcmVjdGlvbi5MVFIgfHxcbiAgICAgICAgICAgIHVwZGF0ZS5zdGF0ZS5mYWNldChFZGl0b3JWaWV3LnBlckxpbmVUZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKCFhbHdheXMgJiYgIXRoaXMuaGFzUlRMICYmIGNoYW5nZUFkZHNSVEwodXBkYXRlLmNoYW5nZXMpKVxuICAgICAgICAgICAgdGhpcy5oYXNSVEwgPSB0cnVlO1xuICAgICAgICBpZiAoIWFsd2F5cyAmJiAhdGhpcy5oYXNSVEwpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB0cmVlID0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpO1xuICAgICAgICBpZiAoYWx3YXlzICE9IHRoaXMuYWx3YXlzIHx8IHRyZWUgIT0gdGhpcy50cmVlIHx8IHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgICAgICB0aGlzLmFsd2F5cyA9IGFsd2F5cztcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSBidWlsZERlY28odXBkYXRlLnZpZXcsIHRyZWUsIGFsd2F5cyk7XG4gICAgICAgIH1cbiAgICB9XG59LCB7XG4gICAgcHJvdmlkZTogcGx1Z2luID0+IHtcbiAgICAgICAgZnVuY3Rpb24gYWNjZXNzKHZpZXcpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdmlldy5wbHVnaW4ocGx1Z2luKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY29yYXRpb25zKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtFZGl0b3JWaWV3Lm91dGVyRGVjb3JhdGlvbnMub2YoYWNjZXNzKSxcbiAgICAgICAgICAgIFByZWMubG93ZXN0KEVkaXRvclZpZXcuYmlkaUlzb2xhdGVkUmFuZ2VzLm9mKGFjY2VzcykpXTtcbiAgICB9XG59KTtcbmZ1bmN0aW9uIGJ1aWxkRGVjbyh2aWV3LCB0cmVlLCBhbHdheXMpIHtcbiAgICBsZXQgZGVjbyA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICBsZXQgcmFuZ2VzID0gdmlldy52aXNpYmxlUmFuZ2VzO1xuICAgIGlmICghYWx3YXlzKVxuICAgICAgICByYW5nZXMgPSBjbGlwUlRMTGluZXMocmFuZ2VzLCB2aWV3LnN0YXRlLmRvYyk7XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHJhbmdlcykge1xuICAgICAgICB0cmVlLml0ZXJhdGUoe1xuICAgICAgICAgICAgZW50ZXI6IG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc28gPSBub2RlLnR5cGUucHJvcChOb2RlUHJvcC5pc29sYXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNvKVxuICAgICAgICAgICAgICAgICAgICBkZWNvLmFkZChub2RlLmZyb20sIG5vZGUudG8sIG1hcmtzW2lzb10pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZyb20sIHRvXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGVjby5maW5pc2goKTtcbn1cbmZ1bmN0aW9uIGNsaXBSVExMaW5lcyhyYW5nZXMsIGRvYykge1xuICAgIGxldCBjdXIgPSBkb2MuaXRlcigpLCBwb3MgPSAwLCByZXN1bHQgPSBbXSwgbGFzdCA9IG51bGw7XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHJhbmdlcykge1xuICAgICAgICBpZiAobGFzdCAmJiBsYXN0LnRvID4gZnJvbSkge1xuICAgICAgICAgICAgZnJvbSA9IGxhc3QudG87XG4gICAgICAgICAgICBpZiAoZnJvbSA+PSB0bylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zICsgY3VyLnZhbHVlLmxlbmd0aCA8IGZyb20pIHtcbiAgICAgICAgICAgIGN1ci5uZXh0KGZyb20gLSAocG9zICsgY3VyLnZhbHVlLmxlbmd0aCkpO1xuICAgICAgICAgICAgcG9zID0gZnJvbTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBwb3MsIGVuZCA9IHBvcyArIGN1ci52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoIWN1ci5saW5lQnJlYWsgJiYgYnVpbGRGb3JMaW5lKGN1ci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdCAmJiBsYXN0LnRvID4gc3RhcnQgLSAxMClcbiAgICAgICAgICAgICAgICAgICAgbGFzdC50byA9IE1hdGgubWluKHRvLCBlbmQpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobGFzdCA9IHsgZnJvbTogc3RhcnQsIHRvOiBNYXRoLm1pbih0bywgZW5kKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbmQgPj0gdG8pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgICAgICBjdXIubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBtYXJrcyA9IHtcbiAgICBydGw6IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1pc29cIiwgaW5jbHVzaXZlOiB0cnVlLCBhdHRyaWJ1dGVzOiB7IGRpcjogXCJydGxcIiB9LCBiaWRpSXNvbGF0ZTogRGlyZWN0aW9uLlJUTCB9KSxcbiAgICBsdHI6IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1pc29cIiwgaW5jbHVzaXZlOiB0cnVlLCBhdHRyaWJ1dGVzOiB7IGRpcjogXCJsdHJcIiB9LCBiaWRpSXNvbGF0ZTogRGlyZWN0aW9uLkxUUiB9KSxcbiAgICBhdXRvOiAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20taXNvXCIsIGluY2x1c2l2ZTogdHJ1ZSwgYXR0cmlidXRlczogeyBkaXI6IFwiYXV0b1wiIH0sIGJpZGlJc29sYXRlOiBudWxsIH0pXG59O1xuXG5leHBvcnQgeyBEb2NJbnB1dCwgSGlnaGxpZ2h0U3R5bGUsIEluZGVudENvbnRleHQsIExSTGFuZ3VhZ2UsIExhbmd1YWdlLCBMYW5ndWFnZURlc2NyaXB0aW9uLCBMYW5ndWFnZVN1cHBvcnQsIFBhcnNlQ29udGV4dCwgU3RyZWFtTGFuZ3VhZ2UsIFN0cmluZ1N0cmVhbSwgVHJlZUluZGVudENvbnRleHQsIGJpZGlJc29sYXRlcywgYnJhY2tldE1hdGNoaW5nLCBicmFja2V0TWF0Y2hpbmdIYW5kbGUsIGNvZGVGb2xkaW5nLCBjb250aW51ZWRJbmRlbnQsIGRlZmF1bHRIaWdobGlnaHRTdHlsZSwgZGVmaW5lTGFuZ3VhZ2VGYWNldCwgZGVsaW1pdGVkSW5kZW50LCBlbnN1cmVTeW50YXhUcmVlLCBmbGF0SW5kZW50LCBmb2xkQWxsLCBmb2xkQ29kZSwgZm9sZEVmZmVjdCwgZm9sZEd1dHRlciwgZm9sZEluc2lkZSwgZm9sZEtleW1hcCwgZm9sZE5vZGVQcm9wLCBmb2xkU2VydmljZSwgZm9sZFN0YXRlLCBmb2xkYWJsZSwgZm9sZGVkUmFuZ2VzLCBmb3JjZVBhcnNpbmcsIGdldEluZGVudFVuaXQsIGdldEluZGVudGF0aW9uLCBoaWdobGlnaHRpbmdGb3IsIGlnbm9yZVNwZWxsY2hlY2tUb2tlbiwgaW5kZW50Tm9kZVByb3AsIGluZGVudE9uSW5wdXQsIGluZGVudFJhbmdlLCBpbmRlbnRTZXJ2aWNlLCBpbmRlbnRTdHJpbmcsIGluZGVudFVuaXQsIGxhbmd1YWdlLCBsYW5ndWFnZURhdGFQcm9wLCBsaW5lQ2xhc3NOb2RlUHJvcCwgbGluZUhpZ2hsaWdodGVyLCBtYXRjaEJyYWNrZXRzLCBzdWJsYW5ndWFnZVByb3AsIHN5bnRheEhpZ2hsaWdodGluZywgc3ludGF4UGFyc2VyUnVubmluZywgc3ludGF4VHJlZSwgc3ludGF4VHJlZUF2YWlsYWJsZSwgdG9nZ2xlRm9sZCwgdG9rZW5DbGFzc05vZGVQcm9wLCB1bmZvbGRBbGwsIHVuZm9sZENvZGUsIHVuZm9sZEVmZmVjdCB9O1xuIiwgImltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgeyB0eXBlIFBsdWdpblNldHRpbmdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbmV4cG9ydCBuYW1lc3BhY2UgQ09NTUVOVEFUT1JfR0xPQkFMIHtcblx0LyoqXG5cdCAqIFRyYWRpbmcgb25lIGdsb2JhbCBmb3IgYW4gYWRtaXR0ZWRseSB3b3JzZSBnbG9iYWxcblx0ICogUGFzc2luZyB0aGUgQXBwIGluc3RhbmNlIHRvIENNIHBsdWdpbnMgaXMganVzdCBhIG1ham9yIFBpdEFcblx0ICovXG5cdGV4cG9ydCBsZXQgYXBwOiBBcHA7XG5cdGV4cG9ydCBsZXQgUExVR0lOX1NFVFRJTkdTOiBQbHVnaW5TZXR0aW5ncztcbn1cbiIsICJpbXBvcnQgeyBDb21wYXJ0bWVudCwgRmFjZXQsIFN0YXRlRWZmZWN0LCBTdGF0ZUVmZmVjdFR5cGUsIFN0YXRlRmllbGQgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7IEVkaXRNb2RlLCBQcmV2aWV3TW9kZSB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG4vKipcbiAqIFByb3ZpZGUgYSBTdGF0ZUZpZWxkIGV4dGVuc2lvbiBmb3IgYW4gYXJiaXRyYXJ5IHZhbHVlIHRoYXQgY2FuIGJlIHVwZGF0ZWQgdmlhIGVmZmVjdHNcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBmaWVsZFxuICogQHBhcmFtIGVmZmVjdCAtIEVmZmVjdCB0byB1cGRhdGUgdGhlIHZhbHVlIG9uXG4gKiBAcmVtYXJrIFVzaW5nIGltcGxlbWVudGF0aW9uIGZyb20gT2JzaWRpYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFZhbHVlPFQ+KHZhbHVlOiBULCBlZmZlY3Q6IFN0YXRlRWZmZWN0VHlwZTxUPikge1xuXHRjb25zdCBmaWVsZDogU3RhdGVGaWVsZDxUPiA9IFN0YXRlRmllbGQuZGVmaW5lKHtcblx0XHRjcmVhdGUoKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSxcblxuXHRcdHVwZGF0ZShlLCBuKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGN1cnJfZWZmZWN0IG9mIG4uZWZmZWN0cykge1xuXHRcdFx0XHRpZiAoY3Vycl9lZmZlY3QuaXMoZWZmZWN0KSlcblx0XHRcdFx0XHRyZXR1cm4gY3Vycl9lZmZlY3QudmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSxcblx0fSk7XG5cblx0cmV0dXJuIGZpZWxkO1xufVxuXG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXNTdGF0ZSA9IEZhY2V0LmRlZmluZTxudW1iZXIsIG51bWJlcj4oeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzWzBdIH0pO1xuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJJbmNsdWRlZFR5cGVzID0gbmV3IENvbXBhcnRtZW50KCk7XG5cbmV4cG9ydCBjb25zdCBoaWRlRW1wdHlEaWZmR3V0dGVyU3RhdGUgPSBGYWNldC5kZWZpbmU8Ym9vbGVhbiwgYm9vbGVhbj4oeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzWzBdIH0pO1xuZXhwb3J0IGNvbnN0IGhpZGVFbXB0eURpZmZHdXR0ZXIgPSBuZXcgQ29tcGFydG1lbnQoKTtcblxuZXhwb3J0IGNvbnN0IHByZXZpZXdNb2RlU3RhdGUgPSBGYWNldC5kZWZpbmU8UHJldmlld01vZGUsIFByZXZpZXdNb2RlPih7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXNbMF0gfSk7XG5leHBvcnQgY29uc3QgcHJldmlld01vZGUgPSBuZXcgQ29tcGFydG1lbnQoKTtcblxuZXhwb3J0IGNvbnN0IGVkaXRNb2RlVmFsdWVTdGF0ZSA9IEZhY2V0LmRlZmluZTxFZGl0TW9kZSwgRWRpdE1vZGU+KHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlc1swXSB9KTtcbmV4cG9ydCBjb25zdCBlZGl0TW9kZVZhbHVlID0gbmV3IENvbXBhcnRtZW50KCk7XG5leHBvcnQgY29uc3QgZWRpdE1vZGUgPSBuZXcgQ29tcGFydG1lbnQoKTtcblxuZXhwb3J0IGNvbnN0IGZ1bGxSZWxvYWRFZmZlY3QgPSBTdGF0ZUVmZmVjdC5kZWZpbmU8Ym9vbGVhbj4oKTtcbiIsICIvKipcblRoZSBkZWZhdWx0IG1heGltdW0gbGVuZ3RoIG9mIGEgYFRyZWVCdWZmZXJgIG5vZGUuXG4qL1xuY29uc3QgRGVmYXVsdEJ1ZmZlckxlbmd0aCA9IDEwMjQ7XG5sZXQgbmV4dFByb3BJRCA9IDA7XG5jbGFzcyBSYW5nZSB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8pIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgIH1cbn1cbi8qKlxuRWFjaCBbbm9kZSB0eXBlXSgjY29tbW9uLk5vZGVUeXBlKSBvciBbaW5kaXZpZHVhbCB0cmVlXSgjY29tbW9uLlRyZWUpXG5jYW4gaGF2ZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQgaW4gcHJvcHMuIEluc3RhbmNlcyBvZiB0aGlzXG5jbGFzcyByZXByZXNlbnQgcHJvcCBuYW1lcy5cbiovXG5jbGFzcyBOb2RlUHJvcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IG5vZGUgcHJvcCB0eXBlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICAgICAgdGhpcy5pZCA9IG5leHRQcm9wSUQrKztcbiAgICAgICAgdGhpcy5wZXJOb2RlID0gISFjb25maWcucGVyTm9kZTtcbiAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZSA9IGNvbmZpZy5kZXNlcmlhbGl6ZSB8fCAoKCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBub2RlIHR5cGUgZG9lc24ndCBkZWZpbmUgYSBkZXNlcmlhbGl6ZSBmdW5jdGlvblwiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCB3aXRoXG4gICAgW2BOb2RlU2V0LmV4dGVuZGBdKCNjb21tb24uTm9kZVNldC5leHRlbmQpIG9yXG4gICAgW2BMUlBhcnNlci5jb25maWd1cmVgXSgjbHIuUGFyc2VyQ29uZmlnLnByb3BzKSB0byBjb21wdXRlXG4gICAgcHJvcCB2YWx1ZXMgZm9yIGVhY2ggbm9kZSB0eXBlIGluIHRoZSBzZXQuIFRha2VzIGEgW21hdGNoXG4gICAgb2JqZWN0XSgjY29tbW9uLk5vZGVUeXBlXm1hdGNoKSBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdW5kZWZpbmVkXG4gICAgaWYgdGhlIG5vZGUgdHlwZSBkb2Vzbid0IGdldCB0aGlzIHByb3AsIGFuZCB0aGUgcHJvcCdzIHZhbHVlIGlmXG4gICAgaXQgZG9lcy5cbiAgICAqL1xuICAgIGFkZChtYXRjaCkge1xuICAgICAgICBpZiAodGhpcy5wZXJOb2RlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4ndCBhZGQgcGVyLW5vZGUgcHJvcHMgdG8gbm9kZSB0eXBlc1wiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaCAhPSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICBtYXRjaCA9IE5vZGVUeXBlLm1hdGNoKG1hdGNoKTtcbiAgICAgICAgcmV0dXJuICh0eXBlKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbWF0Y2godHlwZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBudWxsIDogW3RoaXMsIHJlc3VsdF07XG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG5Qcm9wIHRoYXQgaXMgdXNlZCB0byBkZXNjcmliZSBtYXRjaGluZyBkZWxpbWl0ZXJzLiBGb3Igb3BlbmluZ1xuZGVsaW1pdGVycywgdGhpcyBob2xkcyBhbiBhcnJheSBvZiBub2RlIG5hbWVzICh3cml0dGVuIGFzIGFcbnNwYWNlLXNlcGFyYXRlZCBzdHJpbmcgd2hlbiBkZWNsYXJpbmcgdGhpcyBwcm9wIGluIGEgZ3JhbW1hcilcbmZvciB0aGUgbm9kZSB0eXBlcyBvZiBjbG9zaW5nIGRlbGltaXRlcnMgdGhhdCBtYXRjaCBpdC5cbiovXG5Ob2RlUHJvcC5jbG9zZWRCeSA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiBzdHIgPT4gc3RyLnNwbGl0KFwiIFwiKSB9KTtcbi8qKlxuVGhlIGludmVyc2Ugb2YgW2BjbG9zZWRCeWBdKCNjb21tb24uTm9kZVByb3BeY2xvc2VkQnkpLiBUaGlzIGlzXG5hdHRhY2hlZCB0byBjbG9zaW5nIGRlbGltaXRlcnMsIGhvbGRpbmcgYW4gYXJyYXkgb2Ygbm9kZSBuYW1lc1xub2YgdHlwZXMgb2YgbWF0Y2hpbmcgb3BlbmluZyBkZWxpbWl0ZXJzLlxuKi9cbk5vZGVQcm9wLm9wZW5lZEJ5ID0gbmV3IE5vZGVQcm9wKHsgZGVzZXJpYWxpemU6IHN0ciA9PiBzdHIuc3BsaXQoXCIgXCIpIH0pO1xuLyoqXG5Vc2VkIHRvIGFzc2lnbiBub2RlIHR5cGVzIHRvIGdyb3VwcyAoZm9yIGV4YW1wbGUsIGFsbCBub2RlXG50eXBlcyB0aGF0IHJlcHJlc2VudCBhbiBleHByZXNzaW9uIGNvdWxkIGJlIHRhZ2dlZCB3aXRoIGFuXG5gXCJFeHByZXNzaW9uXCJgIGdyb3VwKS5cbiovXG5Ob2RlUHJvcC5ncm91cCA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiBzdHIgPT4gc3RyLnNwbGl0KFwiIFwiKSB9KTtcbi8qKlxuQXR0YWNoZWQgdG8gbm9kZXMgdG8gaW5kaWNhdGUgdGhlc2Ugc2hvdWxkIGJlXG5bZGlzcGxheWVkXShodHRwczovL2NvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNsYW5ndWFnZS5zeW50YXhUcmVlKVxuaW4gYSBiaWRpcmVjdGlvbmFsIHRleHQgaXNvbGF0ZSwgc28gdGhhdCBkaXJlY3Rpb24tbmV1dHJhbFxuY2hhcmFjdGVycyBvbiB0aGVpciBzaWRlcyBkb24ndCBpbmNvcnJlY3RseSBnZXQgYXNzb2NpYXRlZCB3aXRoXG5zdXJyb3VuZGluZyB0ZXh0LiBZb3UnbGwgZ2VuZXJhbGx5IHdhbnQgdG8gc2V0IHRoaXMgZm9yIG5vZGVzXG50aGF0IGNvbnRhaW4gYXJiaXRyYXJ5IHRleHQsIGxpa2Ugc3RyaW5ncyBhbmQgY29tbWVudHMsIGFuZCBmb3Jcbm5vZGVzIHRoYXQgYXBwZWFyIF9pbnNpZGVfIGFyYml0cmFyeSB0ZXh0LCBsaWtlIEhUTUwgdGFncy4gV2hlblxubm90IGdpdmVuIGEgdmFsdWUsIGluIGEgZ3JhbW1hciBkZWNsYXJhdGlvbiwgZGVmYXVsdHMgdG9cbmBcImF1dG9cImAuXG4qL1xuTm9kZVByb3AuaXNvbGF0ZSA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiB2YWx1ZSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPSBcInJ0bFwiICYmIHZhbHVlICE9IFwibHRyXCIgJiYgdmFsdWUgIT0gXCJhdXRvXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdmFsdWUgZm9yIGlzb2xhdGU6IFwiICsgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWUgfHwgXCJhdXRvXCI7XG4gICAgfSB9KTtcbi8qKlxuVGhlIGhhc2ggb2YgdGhlIFtjb250ZXh0XSgjbHIuQ29udGV4dFRyYWNrZXIuY29uc3RydWN0b3IpXG50aGF0IHRoZSBub2RlIHdhcyBwYXJzZWQgaW4sIGlmIGFueS4gVXNlZCB0byBsaW1pdCByZXVzZSBvZlxuY29udGV4dHVhbCBub2Rlcy5cbiovXG5Ob2RlUHJvcC5jb250ZXh0SGFzaCA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG4vKipcblRoZSBkaXN0YW5jZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbm9kZSB0aGF0IHRoZSB0b2tlbml6ZXJcbmxvb2tlZCBhaGVhZCBmb3IgYW55IG9mIHRoZSB0b2tlbnMgaW5zaWRlIHRoZSBub2RlLiAoVGhlIExSXG5wYXJzZXIgb25seSBzdG9yZXMgdGhpcyB3aGVuIGl0IGlzIGxhcmdlciB0aGFuIDI1LCBmb3JcbmVmZmljaWVuY3kgcmVhc29ucy4pXG4qL1xuTm9kZVByb3AubG9va0FoZWFkID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbi8qKlxuVGhpcyBwZXItbm9kZSBwcm9wIGlzIHVzZWQgdG8gcmVwbGFjZSBhIGdpdmVuIG5vZGUsIG9yIHBhcnQgb2YgYVxubm9kZSwgd2l0aCBhbm90aGVyIHRyZWUuIFRoaXMgaXMgdXNlZnVsIHRvIGluY2x1ZGUgdHJlZXMgZnJvbVxuZGlmZmVyZW50IGxhbmd1YWdlcyBpbiBtaXhlZC1sYW5ndWFnZSBwYXJzZXJzLlxuKi9cbk5vZGVQcm9wLm1vdW50ZWQgPSBuZXcgTm9kZVByb3AoeyBwZXJOb2RlOiB0cnVlIH0pO1xuLyoqXG5BIG1vdW50ZWQgdHJlZSwgd2hpY2ggY2FuIGJlIFtzdG9yZWRdKCNjb21tb24uTm9kZVByb3BebW91bnRlZCkgb25cbmEgdHJlZSBub2RlIHRvIGluZGljYXRlIHRoYXQgcGFydHMgb2YgaXRzIGNvbnRlbnQgYXJlXG5yZXByZXNlbnRlZCBieSBhbm90aGVyIHRyZWUuXG4qL1xuY2xhc3MgTW91bnRlZFRyZWUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBpbm5lciB0cmVlLlxuICAgICovXG4gICAgdHJlZSwgXG4gICAgLyoqXG4gICAgSWYgdGhpcyBpcyBudWxsLCB0aGlzIHRyZWUgcmVwbGFjZXMgdGhlIGVudGlyZSBub2RlIChpdCB3aWxsXG4gICAgYmUgaW5jbHVkZWQgaW4gdGhlIHJlZ3VsYXIgaXRlcmF0aW9uIGluc3RlYWQgb2YgaXRzIGhvc3RcbiAgICBub2RlKS4gSWYgbm90LCBvbmx5IHRoZSBnaXZlbiByYW5nZXMgYXJlIGNvbnNpZGVyZWQgdG8gYmVcbiAgICBjb3ZlcmVkIGJ5IHRoaXMgdHJlZS4gVGhpcyBpcyB1c2VkIGZvciB0cmVlcyB0aGF0IGFyZSBtaXhlZCBpblxuICAgIGEgd2F5IHRoYXQgaXNuJ3Qgc3RyaWN0bHkgaGllcmFyY2hpY2FsLiBTdWNoIG1vdW50ZWQgdHJlZXMgYXJlXG4gICAgb25seSBlbnRlcmVkIGJ5IFtgcmVzb2x2ZUlubmVyYF0oI2NvbW1vbi5UcmVlLnJlc29sdmVJbm5lcilcbiAgICBhbmQgW2BlbnRlcmBdKCNjb21tb24uU3ludGF4Tm9kZS5lbnRlcikuXG4gICAgKi9cbiAgICBvdmVybGF5LCBcbiAgICAvKipcbiAgICBUaGUgcGFyc2VyIHVzZWQgdG8gY3JlYXRlIHRoaXMgc3VidHJlZS5cbiAgICAqL1xuICAgIHBhcnNlcikge1xuICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0KHRyZWUpIHtcbiAgICAgICAgcmV0dXJuIHRyZWUgJiYgdHJlZS5wcm9wcyAmJiB0cmVlLnByb3BzW05vZGVQcm9wLm1vdW50ZWQuaWRdO1xuICAgIH1cbn1cbmNvbnN0IG5vUHJvcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqXG5FYWNoIG5vZGUgaW4gYSBzeW50YXggdHJlZSBoYXMgYSBub2RlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0LlxuKi9cbmNsYXNzIE5vZGVUeXBlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBuYW1lIG9mIHRoZSBub2RlIHR5cGUuIE5vdCBuZWNlc3NhcmlseSB1bmlxdWUsIGJ1dCBpZiB0aGVcbiAgICBncmFtbWFyIHdhcyB3cml0dGVuIHByb3Blcmx5LCBkaWZmZXJlbnQgbm9kZSB0eXBlcyB3aXRoIHRoZVxuICAgIHNhbWUgbmFtZSB3aXRoaW4gYSBub2RlIHNldCBzaG91bGQgcGxheSB0aGUgc2FtZSBzZW1hbnRpY1xuICAgIHJvbGUuXG4gICAgKi9cbiAgICBuYW1lLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHByb3BzLCBcbiAgICAvKipcbiAgICBUaGUgaWQgb2YgdGhpcyBub2RlIGluIGl0cyBzZXQuIENvcnJlc3BvbmRzIHRvIHRoZSB0ZXJtIGlkc1xuICAgIHVzZWQgaW4gdGhlIHBhcnNlci5cbiAgICAqL1xuICAgIGlkLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZsYWdzID0gMCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBub2RlIHR5cGUuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHNwZWMpIHtcbiAgICAgICAgbGV0IHByb3BzID0gc3BlYy5wcm9wcyAmJiBzcGVjLnByb3BzLmxlbmd0aCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBub1Byb3BzO1xuICAgICAgICBsZXQgZmxhZ3MgPSAoc3BlYy50b3AgPyAxIC8qIE5vZGVGbGFnLlRvcCAqLyA6IDApIHwgKHNwZWMuc2tpcHBlZCA/IDIgLyogTm9kZUZsYWcuU2tpcHBlZCAqLyA6IDApIHxcbiAgICAgICAgICAgIChzcGVjLmVycm9yID8gNCAvKiBOb2RlRmxhZy5FcnJvciAqLyA6IDApIHwgKHNwZWMubmFtZSA9PSBudWxsID8gOCAvKiBOb2RlRmxhZy5Bbm9ueW1vdXMgKi8gOiAwKTtcbiAgICAgICAgbGV0IHR5cGUgPSBuZXcgTm9kZVR5cGUoc3BlYy5uYW1lIHx8IFwiXCIsIHByb3BzLCBzcGVjLmlkLCBmbGFncyk7XG4gICAgICAgIGlmIChzcGVjLnByb3BzKVxuICAgICAgICAgICAgZm9yIChsZXQgc3JjIG9mIHNwZWMucHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3JjKSlcbiAgICAgICAgICAgICAgICAgICAgc3JjID0gc3JjKHR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNyY1swXS5wZXJOb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4ndCBzdG9yZSBhIHBlci1ub2RlIHByb3Agb24gYSBub2RlIHR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzW3NyY1swXS5pZF0gPSBzcmNbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmVzIGEgbm9kZSBwcm9wIGZvciB0aGlzIHR5cGUuIFdpbGwgcmV0dXJuIGB1bmRlZmluZWRgIGlmXG4gICAgdGhlIHByb3AgaXNuJ3QgcHJlc2VudCBvbiB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBwcm9wKHByb3ApIHsgcmV0dXJuIHRoaXMucHJvcHNbcHJvcC5pZF07IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyB0aGUgdG9wIG5vZGUgb2YgYSBncmFtbWFyLlxuICAgICovXG4gICAgZ2V0IGlzVG9wKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiAxIC8qIE5vZGVGbGFnLlRvcCAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgbm9kZSBpcyBwcm9kdWNlZCBieSBhIHNraXAgcnVsZS5cbiAgICAqL1xuICAgIGdldCBpc1NraXBwZWQoKSB7IHJldHVybiAodGhpcy5mbGFncyAmIDIgLyogTm9kZUZsYWcuU2tpcHBlZCAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBlcnJvciBub2RlLlxuICAgICovXG4gICAgZ2V0IGlzRXJyb3IoKSB7IHJldHVybiAodGhpcy5mbGFncyAmIDQgLyogTm9kZUZsYWcuRXJyb3IgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIFdoZW4gdHJ1ZSwgdGhpcyBub2RlIHR5cGUgZG9lc24ndCBjb3JyZXNwb25kIHRvIGEgdXNlci1kZWNsYXJlZFxuICAgIG5hbWVkIG5vZGUsIGZvciBleGFtcGxlIGJlY2F1c2UgaXQgaXMgdXNlZCB0byBjYWNoZSByZXBldGl0aW9uLlxuICAgICovXG4gICAgZ2V0IGlzQW5vbnltb3VzKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiA4IC8qIE5vZGVGbGFnLkFub255bW91cyAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIHdoZW4gdGhpcyBub2RlJ3MgbmFtZSBvciBvbmUgb2YgaXRzXG4gICAgW2dyb3Vwc10oI2NvbW1vbi5Ob2RlUHJvcF5ncm91cCkgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgICovXG4gICAgaXMobmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gbmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBncm91cCA9IHRoaXMucHJvcChOb2RlUHJvcC5ncm91cCk7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAgPyBncm91cC5pbmRleE9mKG5hbWUpID4gLTEgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pZCA9PSBuYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBmdW5jdGlvbiBmcm9tIG5vZGUgdHlwZXMgdG8gYXJiaXRyYXJ5IHZhbHVlcyBieVxuICAgIHNwZWNpZnlpbmcgYW4gb2JqZWN0IHdob3NlIHByb3BlcnR5IG5hbWVzIGFyZSBub2RlIG9yXG4gICAgW2dyb3VwXSgjY29tbW9uLk5vZGVQcm9wXmdyb3VwKSBuYW1lcy4gT2Z0ZW4gdXNlZnVsIHdpdGhcbiAgICBbYE5vZGVQcm9wLmFkZGBdKCNjb21tb24uTm9kZVByb3AuYWRkKS4gWW91IGNhbiBwdXQgbXVsdGlwbGVcbiAgICBuYW1lcywgc2VwYXJhdGVkIGJ5IHNwYWNlcywgaW4gYSBzaW5nbGUgcHJvcGVydHkgbmFtZSB0byBtYXBcbiAgICBtdWx0aXBsZSBub2RlIG5hbWVzIHRvIGEgc2luZ2xlIHZhbHVlLlxuICAgICovXG4gICAgc3RhdGljIG1hdGNoKG1hcCkge1xuICAgICAgICBsZXQgZGlyZWN0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBtYXApXG4gICAgICAgICAgICBmb3IgKGxldCBuYW1lIG9mIHByb3Auc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgICAgIGRpcmVjdFtuYW1lXSA9IG1hcFtwcm9wXTtcbiAgICAgICAgcmV0dXJuIChub2RlKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBncm91cHMgPSBub2RlLnByb3AoTm9kZVByb3AuZ3JvdXApLCBpID0gLTE7IGkgPCAoZ3JvdXBzID8gZ3JvdXBzLmxlbmd0aCA6IDApOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBkaXJlY3RbaSA8IDAgPyBub2RlLm5hbWUgOiBncm91cHNbaV1dO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuQW4gZW1wdHkgZHVtbXkgbm9kZSB0eXBlIHRvIHVzZSB3aGVuIG5vIGFjdHVhbCB0eXBlIGlzIGF2YWlsYWJsZS5cbiovXG5Ob2RlVHlwZS5ub25lID0gbmV3IE5vZGVUeXBlKFwiXCIsIE9iamVjdC5jcmVhdGUobnVsbCksIDAsIDggLyogTm9kZUZsYWcuQW5vbnltb3VzICovKTtcbi8qKlxuQSBub2RlIHNldCBob2xkcyBhIGNvbGxlY3Rpb24gb2Ygbm9kZSB0eXBlcy4gSXQgaXMgdXNlZCB0b1xuY29tcGFjdGx5IHJlcHJlc2VudCB0cmVlcyBieSBzdG9yaW5nIHRoZWlyIHR5cGUgaWRzLCByYXRoZXIgdGhhbiBhXG5mdWxsIHBvaW50ZXIgdG8gdGhlIHR5cGUgb2JqZWN0LCBpbiBhIG51bWVyaWMgYXJyYXkuIEVhY2ggcGFyc2VyXG5baGFzXSgjbHIuTFJQYXJzZXIubm9kZVNldCkgYSBub2RlIHNldCwgYW5kIFt0cmVlXG5idWZmZXJzXSgjY29tbW9uLlRyZWVCdWZmZXIpIGNhbiBvbmx5IHN0b3JlIGNvbGxlY3Rpb25zIG9mIG5vZGVzXG5mcm9tIHRoZSBzYW1lIHNldC4gQSBzZXQgY2FuIGhhdmUgYSBtYXhpbXVtIG9mIDIqKjE2ICg2NTUzNikgbm9kZVxudHlwZXMgaW4gaXQsIHNvIHRoYXQgdGhlIGlkcyBmaXQgaW50byAxNi1iaXQgdHlwZWQgYXJyYXkgc2xvdHMuXG4qL1xuY2xhc3MgTm9kZVNldCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IHdpdGggdGhlIGdpdmVuIHR5cGVzLiBUaGUgYGlkYCBwcm9wZXJ0eSBvZiBlYWNoXG4gICAgdHlwZSBzaG91bGQgY29ycmVzcG9uZCB0byBpdHMgcG9zaXRpb24gd2l0aGluIHRoZSBhcnJheS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBub2RlIHR5cGVzIGluIHRoaXMgc2V0LCBieSBpZC5cbiAgICAqL1xuICAgIHR5cGVzKSB7XG4gICAgICAgIHRoaXMudHlwZXMgPSB0eXBlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICh0eXBlc1tpXS5pZCAhPSBpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm9kZSB0eXBlIGlkcyBzaG91bGQgY29ycmVzcG9uZCB0byBhcnJheSBwb3NpdGlvbnMgd2hlbiBjcmVhdGluZyBhIG5vZGUgc2V0XCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgc2V0IHdpdGggc29tZSBub2RlIHByb3BlcnRpZXMgYWRkZWQuIFRoZVxuICAgIGFyZ3VtZW50cyB0byB0aGlzIG1ldGhvZCBjYW4gYmUgY3JlYXRlZCB3aXRoXG4gICAgW2BOb2RlUHJvcC5hZGRgXSgjY29tbW9uLk5vZGVQcm9wLmFkZCkuXG4gICAgKi9cbiAgICBleHRlbmQoLi4ucHJvcHMpIHtcbiAgICAgICAgbGV0IG5ld1R5cGVzID0gW107XG4gICAgICAgIGZvciAobGV0IHR5cGUgb2YgdGhpcy50eXBlcykge1xuICAgICAgICAgICAgbGV0IG5ld1Byb3BzID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiBwcm9wcykge1xuICAgICAgICAgICAgICAgIGxldCBhZGQgPSBzb3VyY2UodHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFkZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld1Byb3BzKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCB0eXBlLnByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3UHJvcHNbYWRkWzBdLmlkXSA9IGFkZFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdUeXBlcy5wdXNoKG5ld1Byb3BzID8gbmV3IE5vZGVUeXBlKHR5cGUubmFtZSwgbmV3UHJvcHMsIHR5cGUuaWQsIHR5cGUuZmxhZ3MpIDogdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2V0KG5ld1R5cGVzKTtcbiAgICB9XG59XG5jb25zdCBDYWNoZWROb2RlID0gbmV3IFdlYWtNYXAoKSwgQ2FjaGVkSW5uZXJOb2RlID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuT3B0aW9ucyB0aGF0IGNvbnRyb2wgaXRlcmF0aW9uLiBDYW4gYmUgY29tYmluZWQgd2l0aCB0aGUgYHxgXG5vcGVyYXRvciB0byBlbmFibGUgbXVsdGlwbGUgb25lcy5cbiovXG52YXIgSXRlck1vZGU7XG4oZnVuY3Rpb24gKEl0ZXJNb2RlKSB7XG4gICAgLyoqXG4gICAgV2hlbiBlbmFibGVkLCBpdGVyYXRpb24gd2lsbCBvbmx5IHZpc2l0IFtgVHJlZWBdKCNjb21tb24uVHJlZSlcbiAgICBvYmplY3RzLCBub3Qgbm9kZXMgcGFja2VkIGludG9cbiAgICBbYFRyZWVCdWZmZXJgXSgjY29tbW9uLlRyZWVCdWZmZXIpcy5cbiAgICAqL1xuICAgIEl0ZXJNb2RlW0l0ZXJNb2RlW1wiRXhjbHVkZUJ1ZmZlcnNcIl0gPSAxXSA9IFwiRXhjbHVkZUJ1ZmZlcnNcIjtcbiAgICAvKipcbiAgICBFbmFibGUgdGhpcyB0byBtYWtlIGl0ZXJhdGlvbiBpbmNsdWRlIGFub255bW91cyBub2RlcyAoc3VjaCBhc1xuICAgIHRoZSBub2RlcyB0aGF0IHdyYXAgcmVwZWF0ZWQgZ3JhbW1hciBjb25zdHJ1Y3RzIGludG8gYSBiYWxhbmNlZFxuICAgIHRyZWUpLlxuICAgICovXG4gICAgSXRlck1vZGVbSXRlck1vZGVbXCJJbmNsdWRlQW5vbnltb3VzXCJdID0gMl0gPSBcIkluY2x1ZGVBbm9ueW1vdXNcIjtcbiAgICAvKipcbiAgICBCeSBkZWZhdWx0LCByZWd1bGFyIFttb3VudGVkXSgjY29tbW9uLk5vZGVQcm9wXm1vdW50ZWQpIG5vZGVzXG4gICAgcmVwbGFjZSB0aGVpciBiYXNlIG5vZGUgaW4gaXRlcmF0aW9uLiBFbmFibGUgdGhpcyB0byBpZ25vcmUgdGhlbVxuICAgIGluc3RlYWQuXG4gICAgKi9cbiAgICBJdGVyTW9kZVtJdGVyTW9kZVtcIklnbm9yZU1vdW50c1wiXSA9IDRdID0gXCJJZ25vcmVNb3VudHNcIjtcbiAgICAvKipcbiAgICBUaGlzIG9wdGlvbiBvbmx5IGFwcGxpZXMgaW5cbiAgICBbYGVudGVyYF0oI2NvbW1vbi5TeW50YXhOb2RlLmVudGVyKS1zdHlsZSBtZXRob2RzLiBJdCB0ZWxscyB0aGVcbiAgICBsaWJyYXJ5IHRvIG5vdCBlbnRlciBtb3VudGVkIG92ZXJsYXlzIGlmIG9uZSBjb3ZlcnMgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24uXG4gICAgKi9cbiAgICBJdGVyTW9kZVtJdGVyTW9kZVtcIklnbm9yZU92ZXJsYXlzXCJdID0gOF0gPSBcIklnbm9yZU92ZXJsYXlzXCI7XG59KShJdGVyTW9kZSB8fCAoSXRlck1vZGUgPSB7fSkpO1xuLyoqXG5BIHBpZWNlIG9mIHN5bnRheCB0cmVlLiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gYXBwcm9hY2ggdGhlc2VcbnRyZWVzOiB0aGUgd2F5IHRoZXkgYXJlIGFjdHVhbGx5IHN0b3JlZCBpbiBtZW1vcnksIGFuZCB0aGVcbmNvbnZlbmllbnQgd2F5LlxuXG5TeW50YXggdHJlZXMgYXJlIHN0b3JlZCBhcyBhIHRyZWUgb2YgYFRyZWVgIGFuZCBgVHJlZUJ1ZmZlcmBcbm9iamVjdHMuIEJ5IHBhY2tpbmcgZGV0YWlsIGluZm9ybWF0aW9uIGludG8gYFRyZWVCdWZmZXJgIGxlYWZcbm5vZGVzLCB0aGUgcmVwcmVzZW50YXRpb24gaXMgbWFkZSBhIGxvdCBtb3JlIG1lbW9yeS1lZmZpY2llbnQuXG5cbkhvd2V2ZXIsIHdoZW4geW91IHdhbnQgdG8gYWN0dWFsbHkgd29yayB3aXRoIHRyZWUgbm9kZXMsIHRoaXNcbnJlcHJlc2VudGF0aW9uIGlzIHZlcnkgYXdrd2FyZCwgc28gbW9zdCBjbGllbnQgY29kZSB3aWxsIHdhbnQgdG9cbnVzZSB0aGUgW2BUcmVlQ3Vyc29yYF0oI2NvbW1vbi5UcmVlQ3Vyc29yKSBvclxuW2BTeW50YXhOb2RlYF0oI2NvbW1vbi5TeW50YXhOb2RlKSBpbnRlcmZhY2UgaW5zdGVhZCwgd2hpY2ggcHJvdmlkZXNcbmEgdmlldyBvbiBzb21lIHBhcnQgb2YgdGhpcyBkYXRhIHN0cnVjdHVyZSwgYW5kIGNhbiBiZSB1c2VkIHRvXG5tb3ZlIGFyb3VuZCB0byBhZGphY2VudCBub2Rlcy5cbiovXG5jbGFzcyBUcmVlIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBuZXcgdHJlZS4gU2VlIGFsc28gW2BUcmVlLmJ1aWxkYF0oI2NvbW1vbi5UcmVlXmJ1aWxkKS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0eXBlIG9mIHRoZSB0b3Agbm9kZS5cbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoaXMgbm9kZSdzIGNoaWxkIG5vZGVzLlxuICAgICovXG4gICAgY2hpbGRyZW4sIFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbnMgKG9mZnNldHMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgdHJlZSkgb2ZcbiAgICB0aGUgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBwb3NpdGlvbnMsIFxuICAgIC8qKlxuICAgIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhpcyB0cmVlXG4gICAgKi9cbiAgICBsZW5ndGgsIFxuICAgIC8qKlxuICAgIFBlci1ub2RlIFtub2RlIHByb3BzXSgjY29tbW9uLk5vZGVQcm9wKSB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBwcm9wcykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gcG9zaXRpb25zO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnByb3BzID0gbnVsbDtcbiAgICAgICAgaWYgKHByb3BzICYmIHByb3BzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICBmb3IgKGxldCBbcHJvcCwgdmFsdWVdIG9mIHByb3BzKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHNbdHlwZW9mIHByb3AgPT0gXCJudW1iZXJcIiA/IHByb3AgOiBwcm9wLmlkXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBtb3VudGVkID0gTW91bnRlZFRyZWUuZ2V0KHRoaXMpO1xuICAgICAgICBpZiAobW91bnRlZCAmJiAhbW91bnRlZC5vdmVybGF5KVxuICAgICAgICAgICAgcmV0dXJuIG1vdW50ZWQudHJlZS50b1N0cmluZygpO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBjaCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBsZXQgc3RyID0gY2gudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmIChzdHIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuICs9IFwiLFwiO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuICs9IHN0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXRoaXMudHlwZS5uYW1lID8gY2hpbGRyZW4gOlxuICAgICAgICAgICAgKC9cXFcvLnRlc3QodGhpcy50eXBlLm5hbWUpICYmICF0aGlzLnR5cGUuaXNFcnJvciA/IEpTT04uc3RyaW5naWZ5KHRoaXMudHlwZS5uYW1lKSA6IHRoaXMudHlwZS5uYW1lKSArXG4gICAgICAgICAgICAgICAgKGNoaWxkcmVuLmxlbmd0aCA/IFwiKFwiICsgY2hpbGRyZW4gKyBcIilcIiA6IFwiXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbdHJlZSBjdXJzb3JdKCNjb21tb24uVHJlZUN1cnNvcikgcG9zaXRpb25lZCBhdCB0aGUgdG9wIG9mXG4gICAgdGhlIHRyZWUuIE1vZGUgY2FuIGJlIHVzZWQgdG8gW2NvbnRyb2xdKCNjb21tb24uSXRlck1vZGUpIHdoaWNoXG4gICAgbm9kZXMgdGhlIGN1cnNvciB2aXNpdHMuXG4gICAgKi9cbiAgICBjdXJzb3IobW9kZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlQ3Vyc29yKHRoaXMudG9wTm9kZSwgbW9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIFt0cmVlIGN1cnNvcl0oI2NvbW1vbi5UcmVlQ3Vyc29yKSBwb2ludGluZyBpbnRvIHRoaXMgdHJlZVxuICAgIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgc2lkZSAoc2VlXG4gICAgW2Btb3ZlVG9gXSgjY29tbW9uLlRyZWVDdXJzb3IubW92ZVRvKS5cbiAgICAqL1xuICAgIGN1cnNvckF0KHBvcywgc2lkZSA9IDAsIG1vZGUgPSAwKSB7XG4gICAgICAgIGxldCBzY29wZSA9IENhY2hlZE5vZGUuZ2V0KHRoaXMpIHx8IHRoaXMudG9wTm9kZTtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBUcmVlQ3Vyc29yKHNjb3BlKTtcbiAgICAgICAgY3Vyc29yLm1vdmVUbyhwb3MsIHNpZGUpO1xuICAgICAgICBDYWNoZWROb2RlLnNldCh0aGlzLCBjdXJzb3IuX3RyZWUpO1xuICAgICAgICByZXR1cm4gY3Vyc29yO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbc3ludGF4IG5vZGVdKCNjb21tb24uU3ludGF4Tm9kZSkgb2JqZWN0IGZvciB0aGUgdG9wIG9mIHRoZVxuICAgIHRyZWUuXG4gICAgKi9cbiAgICBnZXQgdG9wTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlTm9kZSh0aGlzLCAwLCAwLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBbc3ludGF4IG5vZGVdKCNjb21tb24uU3ludGF4Tm9kZSkgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgIElmIGBzaWRlYCBpcyAtMSwgdGhpcyB3aWxsIG1vdmUgaW50byBub2RlcyB0aGF0IGVuZCBhdCB0aGVcbiAgICBwb3NpdGlvbi4gSWYgMSwgaXQnbGwgbW92ZSBpbnRvIG5vZGVzIHRoYXQgc3RhcnQgYXQgdGhlXG4gICAgcG9zaXRpb24uIFdpdGggMCwgaXQnbGwgb25seSBlbnRlciBub2RlcyB0aGF0IGNvdmVyIHRoZSBwb3NpdGlvblxuICAgIGZyb20gYm90aCBzaWRlcy5cbiAgICBcbiAgICBOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdCBlbnRlclxuICAgIFtvdmVybGF5c10oI2NvbW1vbi5Nb3VudGVkVHJlZS5vdmVybGF5KSwgYW5kIHlvdSBvZnRlbiB3YW50XG4gICAgW2ByZXNvbHZlSW5uZXJgXSgjY29tbW9uLlRyZWUucmVzb2x2ZUlubmVyKSBpbnN0ZWFkLlxuICAgICovXG4gICAgcmVzb2x2ZShwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIGxldCBub2RlID0gcmVzb2x2ZU5vZGUoQ2FjaGVkTm9kZS5nZXQodGhpcykgfHwgdGhpcy50b3BOb2RlLCBwb3MsIHNpZGUsIGZhbHNlKTtcbiAgICAgICAgQ2FjaGVkTm9kZS5zZXQodGhpcywgbm9kZSk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICBMaWtlIFtgcmVzb2x2ZWBdKCNjb21tb24uVHJlZS5yZXNvbHZlKSwgYnV0IHdpbGwgZW50ZXJcbiAgICBbb3ZlcmxhaWRdKCNjb21tb24uTW91bnRlZFRyZWUub3ZlcmxheSkgbm9kZXMsIHByb2R1Y2luZyBhIHN5bnRheCBub2RlXG4gICAgcG9pbnRpbmcgaW50byB0aGUgaW5uZXJtb3N0IG92ZXJsYWlkIHRyZWUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uXG4gICAgKHdpdGggcGFyZW50IGxpbmtzIGdvaW5nIHRocm91Z2ggYWxsIHBhcmVudCBzdHJ1Y3R1cmUsIGluY2x1ZGluZ1xuICAgIHRoZSBob3N0IHRyZWVzKS5cbiAgICAqL1xuICAgIHJlc29sdmVJbm5lcihwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIGxldCBub2RlID0gcmVzb2x2ZU5vZGUoQ2FjaGVkSW5uZXJOb2RlLmdldCh0aGlzKSB8fCB0aGlzLnRvcE5vZGUsIHBvcywgc2lkZSwgdHJ1ZSk7XG4gICAgICAgIENhY2hlZElubmVyTm9kZS5zZXQodGhpcywgbm9kZSk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICBJbiBzb21lIHNpdHVhdGlvbnMsIGl0IGNhbiBiZSB1c2VmdWwgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbFxuICAgIG5vZGVzIGFyb3VuZCBhIHBvc2l0aW9uLCBpbmNsdWRpbmcgdGhvc2UgaW4gb3ZlcmxheXMgdGhhdCBkb24ndFxuICAgIGRpcmVjdGx5IGNvdmVyIHRoZSBwb3NpdGlvbi4gVGhpcyBtZXRob2QgZ2l2ZXMgeW91IGFuIGl0ZXJhdG9yXG4gICAgdGhhdCB3aWxsIHByb2R1Y2UgYWxsIG5vZGVzLCBmcm9tIHNtYWxsIHRvIGJpZywgYXJvdW5kIHRoZSBnaXZlblxuICAgIHBvc2l0aW9uLlxuICAgICovXG4gICAgcmVzb2x2ZVN0YWNrKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrSXRlcmF0b3IodGhpcywgcG9zLCBzaWRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGFuZCBpdHMgY2hpbGRyZW4sIGNhbGxpbmcgYGVudGVyYCBmb3IgYW55XG4gICAgbm9kZSB0aGF0IHRvdWNoZXMgdGhlIGBmcm9tYC9gdG9gIHJlZ2lvbiAoaWYgZ2l2ZW4pIGJlZm9yZVxuICAgIHJ1bm5pbmcgb3ZlciBzdWNoIGEgbm9kZSdzIGNoaWxkcmVuLCBhbmQgYGxlYXZlYCAoaWYgZ2l2ZW4pIHdoZW5cbiAgICBsZWF2aW5nIHRoZSBub2RlLiBXaGVuIGBlbnRlcmAgcmV0dXJucyBgZmFsc2VgLCB0aGF0IG5vZGUgd2lsbFxuICAgIG5vdCBoYXZlIGl0cyBjaGlsZHJlbiBpdGVyYXRlZCBvdmVyIChvciBgbGVhdmVgIGNhbGxlZCkuXG4gICAgKi9cbiAgICBpdGVyYXRlKHNwZWMpIHtcbiAgICAgICAgbGV0IHsgZW50ZXIsIGxlYXZlLCBmcm9tID0gMCwgdG8gPSB0aGlzLmxlbmd0aCB9ID0gc3BlYztcbiAgICAgICAgbGV0IG1vZGUgPSBzcGVjLm1vZGUgfHwgMCwgYW5vbiA9IChtb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgPiAwO1xuICAgICAgICBmb3IgKGxldCBjID0gdGhpcy5jdXJzb3IobW9kZSB8IEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpOzspIHtcbiAgICAgICAgICAgIGxldCBlbnRlcmVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoYy5mcm9tIDw9IHRvICYmIGMudG8gPj0gZnJvbSAmJiAoIWFub24gJiYgYy50eXBlLmlzQW5vbnltb3VzIHx8IGVudGVyKGMpICE9PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYy5maXJzdENoaWxkKCkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGVudGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGlmIChlbnRlcmVkICYmIGxlYXZlICYmIChhbm9uIHx8ICFjLnR5cGUuaXNBbm9ueW1vdXMpKVxuICAgICAgICAgICAgICAgICAgICBsZWF2ZShjKTtcbiAgICAgICAgICAgICAgICBpZiAoYy5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoIWMucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBlbnRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBbbm9kZSBwcm9wXSgjY29tbW9uLk5vZGVQcm9wKSBmb3IgdGhpc1xuICAgIG5vZGUuIFdvcmtzIHdpdGggYm90aCBwZXItbm9kZSBhbmQgcGVyLXR5cGUgcHJvcHMuXG4gICAgKi9cbiAgICBwcm9wKHByb3ApIHtcbiAgICAgICAgcmV0dXJuICFwcm9wLnBlck5vZGUgPyB0aGlzLnR5cGUucHJvcChwcm9wKSA6IHRoaXMucHJvcHMgPyB0aGlzLnByb3BzW3Byb3AuaWRdIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBub2RlJ3MgW3Blci1ub2RlIHByb3BzXSgjY29tbW9uLk5vZGVQcm9wLnBlck5vZGUpIGluIGFcbiAgICBmb3JtYXQgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBbYFRyZWVgXSgjY29tbW9uLlRyZWUpXG4gICAgY29uc3RydWN0b3IuXG4gICAgKi9cbiAgICBnZXQgcHJvcFZhbHVlcygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAodGhpcy5wcm9wcylcbiAgICAgICAgICAgIGZvciAobGV0IGlkIGluIHRoaXMucHJvcHMpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goWytpZCwgdGhpcy5wcm9wc1tpZF1dKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQmFsYW5jZSB0aGUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoaXMgdHJlZSwgcHJvZHVjaW5nIGEgY29weSBvZlxuICAgIHdoaWNoIG1heSBoYXZlIGNoaWxkcmVuIGdyb3VwZWQgaW50byBzdWJ0cmVlcyB3aXRoIHR5cGVcbiAgICBbYE5vZGVUeXBlLm5vbmVgXSgjY29tbW9uLk5vZGVUeXBlXm5vbmUpLlxuICAgICovXG4gICAgYmFsYW5jZShjb25maWcgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGggPD0gOCAvKiBCYWxhbmNlLkJyYW5jaEZhY3RvciAqLyA/IHRoaXMgOlxuICAgICAgICAgICAgYmFsYW5jZVJhbmdlKE5vZGVUeXBlLm5vbmUsIHRoaXMuY2hpbGRyZW4sIHRoaXMucG9zaXRpb25zLCAwLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgMCwgdGhpcy5sZW5ndGgsIChjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpID0+IG5ldyBUcmVlKHRoaXMudHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoLCB0aGlzLnByb3BWYWx1ZXMpLCBjb25maWcubWFrZVRyZWUgfHwgKChjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpID0+IG5ldyBUcmVlKE5vZGVUeXBlLm5vbmUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQnVpbGQgYSB0cmVlIGZyb20gYSBwb3N0Zml4LW9yZGVyZWQgYnVmZmVyIG9mIG5vZGUgaW5mb3JtYXRpb24sXG4gICAgb3IgYSBjdXJzb3Igb3ZlciBzdWNoIGEgYnVmZmVyLlxuICAgICovXG4gICAgc3RhdGljIGJ1aWxkKGRhdGEpIHsgcmV0dXJuIGJ1aWxkVHJlZShkYXRhKTsgfVxufVxuLyoqXG5UaGUgZW1wdHkgdHJlZVxuKi9cblRyZWUuZW1wdHkgPSBuZXcgVHJlZShOb2RlVHlwZS5ub25lLCBbXSwgW10sIDApO1xuY2xhc3MgRmxhdEJ1ZmZlckN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoYnVmZmVyLCBpbmRleCkge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICBnZXQgaWQoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gNF07IH1cbiAgICBnZXQgc3RhcnQoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gM107IH1cbiAgICBnZXQgZW5kKCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDJdOyB9XG4gICAgZ2V0IHNpemUoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gMV07IH1cbiAgICBnZXQgcG9zKCkgeyByZXR1cm4gdGhpcy5pbmRleDsgfVxuICAgIG5leHQoKSB7IHRoaXMuaW5kZXggLT0gNDsgfVxuICAgIGZvcmsoKSB7IHJldHVybiBuZXcgRmxhdEJ1ZmZlckN1cnNvcih0aGlzLmJ1ZmZlciwgdGhpcy5pbmRleCk7IH1cbn1cbi8qKlxuVHJlZSBidWZmZXJzIGNvbnRhaW4gKHR5cGUsIHN0YXJ0LCBlbmQsIGVuZEluZGV4KSBxdWFkcyBmb3IgZWFjaFxubm9kZS4gSW4gc3VjaCBhIGJ1ZmZlciwgbm9kZXMgYXJlIHN0b3JlZCBpbiBwcmVmaXggb3JkZXIgKHBhcmVudHNcbmJlZm9yZSBjaGlsZHJlbiwgd2l0aCB0aGUgZW5kSW5kZXggb2YgdGhlIHBhcmVudCBpbmRpY2F0aW5nIHdoaWNoXG5jaGlsZHJlbiBiZWxvbmcgdG8gaXQpLlxuKi9cbmNsYXNzIFRyZWVCdWZmZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHRyZWUgYnVmZmVyLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGJ1ZmZlcidzIGNvbnRlbnQuXG4gICAgKi9cbiAgICBidWZmZXIsIFxuICAgIC8qKlxuICAgIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGdyb3VwIG9mIG5vZGVzIGluIHRoZSBidWZmZXIuXG4gICAgKi9cbiAgICBsZW5ndGgsIFxuICAgIC8qKlxuICAgIFRoZSBub2RlIHNldCB1c2VkIGluIHRoaXMgYnVmZmVyLlxuICAgICovXG4gICAgc2V0KSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5zZXQgPSBzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IHR5cGUoKSB7IHJldHVybiBOb2RlVHlwZS5ub25lOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5idWZmZXIubGVuZ3RoOykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jaGlsZFN0cmluZyhpbmRleCkpO1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmJ1ZmZlcltpbmRleCArIDNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuam9pbihcIixcIik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2hpbGRTdHJpbmcoaW5kZXgpIHtcbiAgICAgICAgbGV0IGlkID0gdGhpcy5idWZmZXJbaW5kZXhdLCBlbmRJbmRleCA9IHRoaXMuYnVmZmVyW2luZGV4ICsgM107XG4gICAgICAgIGxldCB0eXBlID0gdGhpcy5zZXQudHlwZXNbaWRdLCByZXN1bHQgPSB0eXBlLm5hbWU7XG4gICAgICAgIGlmICgvXFxXLy50ZXN0KHJlc3VsdCkgJiYgIXR5cGUuaXNFcnJvcilcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdCk7XG4gICAgICAgIGluZGV4ICs9IDQ7XG4gICAgICAgIGlmIChlbmRJbmRleCA9PSBpbmRleClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IFtdO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmRJbmRleCkge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkU3RyaW5nKGluZGV4KSk7XG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuYnVmZmVyW2luZGV4ICsgM107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIFwiKFwiICsgY2hpbGRyZW4uam9pbihcIixcIikgKyBcIilcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmaW5kQ2hpbGQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIGRpciwgcG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcywgcGljayA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSAhPSBlbmRJbmRleDsgaSA9IGJ1ZmZlcltpICsgM10pIHtcbiAgICAgICAgICAgIGlmIChjaGVja1NpZGUoc2lkZSwgcG9zLCBidWZmZXJbaSArIDFdLCBidWZmZXJbaSArIDJdKSkge1xuICAgICAgICAgICAgICAgIHBpY2sgPSBpO1xuICAgICAgICAgICAgICAgIGlmIChkaXIgPiAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGljaztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzbGljZShzdGFydEksIGVuZEksIGZyb20pIHtcbiAgICAgICAgbGV0IGIgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgbGV0IGNvcHkgPSBuZXcgVWludDE2QXJyYXkoZW5kSSAtIHN0YXJ0SSksIGxlbiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEksIGogPSAwOyBpIDwgZW5kSTspIHtcbiAgICAgICAgICAgIGNvcHlbaisrXSA9IGJbaSsrXTtcbiAgICAgICAgICAgIGNvcHlbaisrXSA9IGJbaSsrXSAtIGZyb207XG4gICAgICAgICAgICBsZXQgdG8gPSBjb3B5W2orK10gPSBiW2krK10gLSBmcm9tO1xuICAgICAgICAgICAgY29weVtqKytdID0gYltpKytdIC0gc3RhcnRJO1xuICAgICAgICAgICAgbGVuID0gTWF0aC5tYXgobGVuLCB0byk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlQnVmZmVyKGNvcHksIGxlbiwgdGhpcy5zZXQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrU2lkZShzaWRlLCBwb3MsIGZyb20sIHRvKSB7XG4gICAgc3dpdGNoIChzaWRlKSB7XG4gICAgICAgIGNhc2UgLTIgLyogU2lkZS5CZWZvcmUgKi86IHJldHVybiBmcm9tIDwgcG9zO1xuICAgICAgICBjYXNlIC0xIC8qIFNpZGUuQXRPckJlZm9yZSAqLzogcmV0dXJuIHRvID49IHBvcyAmJiBmcm9tIDwgcG9zO1xuICAgICAgICBjYXNlIDAgLyogU2lkZS5Bcm91bmQgKi86IHJldHVybiBmcm9tIDwgcG9zICYmIHRvID4gcG9zO1xuICAgICAgICBjYXNlIDEgLyogU2lkZS5BdE9yQWZ0ZXIgKi86IHJldHVybiBmcm9tIDw9IHBvcyAmJiB0byA+IHBvcztcbiAgICAgICAgY2FzZSAyIC8qIFNpZGUuQWZ0ZXIgKi86IHJldHVybiB0byA+IHBvcztcbiAgICAgICAgY2FzZSA0IC8qIFNpZGUuRG9udENhcmUgKi86IHJldHVybiB0cnVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVOb2RlKG5vZGUsIHBvcywgc2lkZSwgb3ZlcmxheXMpIHtcbiAgICB2YXIgX2E7XG4gICAgLy8gTW92ZSB1cCB0byBhIG5vZGUgdGhhdCBhY3R1YWxseSBob2xkcyB0aGUgcG9zaXRpb24sIGlmIHBvc3NpYmxlXG4gICAgd2hpbGUgKG5vZGUuZnJvbSA9PSBub2RlLnRvIHx8XG4gICAgICAgIChzaWRlIDwgMSA/IG5vZGUuZnJvbSA+PSBwb3MgOiBub2RlLmZyb20gPiBwb3MpIHx8XG4gICAgICAgIChzaWRlID4gLTEgPyBub2RlLnRvIDw9IHBvcyA6IG5vZGUudG8gPCBwb3MpKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSAhb3ZlcmxheXMgJiYgbm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlICYmIG5vZGUuaW5kZXggPCAwID8gbnVsbCA6IG5vZGUucGFyZW50O1xuICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICBub2RlID0gcGFyZW50O1xuICAgIH1cbiAgICBsZXQgbW9kZSA9IG92ZXJsYXlzID8gMCA6IEl0ZXJNb2RlLklnbm9yZU92ZXJsYXlzO1xuICAgIC8vIE11c3QgZ28gdXAgb3V0IG9mIG92ZXJsYXlzIHdoZW4gdGhvc2UgZG8gbm90IG92ZXJsYXAgd2l0aCBwb3NcbiAgICBpZiAob3ZlcmxheXMpXG4gICAgICAgIGZvciAobGV0IHNjYW4gPSBub2RlLCBwYXJlbnQgPSBzY2FuLnBhcmVudDsgcGFyZW50OyBzY2FuID0gcGFyZW50LCBwYXJlbnQgPSBzY2FuLnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHNjYW4gaW5zdGFuY2VvZiBUcmVlTm9kZSAmJiBzY2FuLmluZGV4IDwgMCAmJiAoKF9hID0gcGFyZW50LmVudGVyKHBvcywgc2lkZSwgbW9kZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mcm9tKSAhPSBzY2FuLmZyb20pXG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgIGZvciAoOzspIHtcbiAgICAgICAgbGV0IGlubmVyID0gbm9kZS5lbnRlcihwb3MsIHNpZGUsIG1vZGUpO1xuICAgICAgICBpZiAoIWlubmVyKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBpbm5lcjtcbiAgICB9XG59XG5jbGFzcyBCYXNlTm9kZSB7XG4gICAgY3Vyc29yKG1vZGUgPSAwKSB7IHJldHVybiBuZXcgVHJlZUN1cnNvcih0aGlzLCBtb2RlKTsgfVxuICAgIGdldENoaWxkKHR5cGUsIGJlZm9yZSA9IG51bGwsIGFmdGVyID0gbnVsbCkge1xuICAgICAgICBsZXQgciA9IGdldENoaWxkcmVuKHRoaXMsIHR5cGUsIGJlZm9yZSwgYWZ0ZXIpO1xuICAgICAgICByZXR1cm4gci5sZW5ndGggPyByWzBdIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0Q2hpbGRyZW4odHlwZSwgYmVmb3JlID0gbnVsbCwgYWZ0ZXIgPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBnZXRDaGlsZHJlbih0aGlzLCB0eXBlLCBiZWZvcmUsIGFmdGVyKTtcbiAgICB9XG4gICAgcmVzb2x2ZShwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlTm9kZSh0aGlzLCBwb3MsIHNpZGUsIGZhbHNlKTtcbiAgICB9XG4gICAgcmVzb2x2ZUlubmVyKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVOb2RlKHRoaXMsIHBvcywgc2lkZSwgdHJ1ZSk7XG4gICAgfVxuICAgIG1hdGNoQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBtYXRjaE5vZGVDb250ZXh0KHRoaXMucGFyZW50LCBjb250ZXh0KTtcbiAgICB9XG4gICAgZW50ZXJVbmZpbmlzaGVkTm9kZXNCZWZvcmUocG9zKSB7XG4gICAgICAgIGxldCBzY2FuID0gdGhpcy5jaGlsZEJlZm9yZShwb3MpLCBub2RlID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHNjYW4pIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gc2Nhbi5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoIWxhc3QgfHwgbGFzdC50byAhPSBzY2FuLnRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKGxhc3QudHlwZS5pc0Vycm9yICYmIGxhc3QuZnJvbSA9PSBsYXN0LnRvKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHNjYW47XG4gICAgICAgICAgICAgICAgc2NhbiA9IGxhc3QucHJldlNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY2FuID0gbGFzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZ2V0IG5vZGUoKSB7IHJldHVybiB0aGlzOyB9XG4gICAgZ2V0IG5leHQoKSB7IHJldHVybiB0aGlzLnBhcmVudDsgfVxufVxuY2xhc3MgVHJlZU5vZGUgZXh0ZW5kcyBCYXNlTm9kZSB7XG4gICAgY29uc3RydWN0b3IoX3RyZWUsIGZyb20sIFxuICAgIC8vIEluZGV4IGluIHBhcmVudCBub2RlLCBzZXQgdG8gLTEgaWYgdGhlIG5vZGUgaXMgbm90IGEgZGlyZWN0IGNoaWxkIG9mIF9wYXJlbnQubm9kZSAob3ZlcmxheSlcbiAgICBpbmRleCwgX3BhcmVudCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl90cmVlID0gX3RyZWU7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gX3BhcmVudDtcbiAgICB9XG4gICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90cmVlLnR5cGU7IH1cbiAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX3RyZWUudHlwZS5uYW1lOyB9XG4gICAgZ2V0IHRvKCkgeyByZXR1cm4gdGhpcy5mcm9tICsgdGhpcy5fdHJlZS5sZW5ndGg7IH1cbiAgICBuZXh0Q2hpbGQoaSwgZGlyLCBwb3MsIHNpZGUsIG1vZGUgPSAwKSB7XG4gICAgICAgIGZvciAobGV0IHBhcmVudCA9IHRoaXM7Oykge1xuICAgICAgICAgICAgZm9yIChsZXQgeyBjaGlsZHJlbiwgcG9zaXRpb25zIH0gPSBwYXJlbnQuX3RyZWUsIGUgPSBkaXIgPiAwID8gY2hpbGRyZW4ubGVuZ3RoIDogLTE7IGkgIT0gZTsgaSArPSBkaXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGNoaWxkcmVuW2ldLCBzdGFydCA9IHBvc2l0aW9uc1tpXSArIHBhcmVudC5mcm9tO1xuICAgICAgICAgICAgICAgIGlmICghY2hlY2tTaWRlKHNpZGUsIHBvcywgc3RhcnQsIHN0YXJ0ICsgbmV4dC5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIFRyZWVCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgJiBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBuZXh0LmZpbmRDaGlsZCgwLCBuZXh0LmJ1ZmZlci5sZW5ndGgsIGRpciwgcG9zIC0gc3RhcnQsIHNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyTm9kZShuZXcgQnVmZmVyQ29udGV4dChwYXJlbnQsIG5leHQsIGksIHN0YXJ0KSwgbnVsbCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgobW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpIHx8ICghbmV4dC50eXBlLmlzQW5vbnltb3VzIHx8IGhhc0NoaWxkKG5leHQpKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbW91bnRlZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEobW9kZSAmIEl0ZXJNb2RlLklnbm9yZU1vdW50cykgJiYgKG1vdW50ZWQgPSBNb3VudGVkVHJlZS5nZXQobmV4dCkpICYmICFtb3VudGVkLm92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRyZWVOb2RlKG1vdW50ZWQudHJlZSwgc3RhcnQsIGksIHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbm5lciA9IG5ldyBUcmVlTm9kZShuZXh0LCBzdGFydCwgaSwgcGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgfHwgIWlubmVyLnR5cGUuaXNBbm9ueW1vdXMgPyBpbm5lclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpbm5lci5uZXh0Q2hpbGQoZGlyIDwgMCA/IG5leHQuY2hpbGRyZW4ubGVuZ3RoIC0gMSA6IDAsIGRpciwgcG9zLCBzaWRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSB8fCAhcGFyZW50LnR5cGUuaXNBbm9ueW1vdXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAocGFyZW50LmluZGV4ID49IDApXG4gICAgICAgICAgICAgICAgaSA9IHBhcmVudC5pbmRleCArIGRpcjtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBpID0gZGlyIDwgMCA/IC0xIDogcGFyZW50Ll9wYXJlbnQuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9wYXJlbnQ7XG4gICAgICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMubmV4dENoaWxkKDAsIDEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5uZXh0Q2hpbGQodGhpcy5fdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxLCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIGNoaWxkQWZ0ZXIocG9zKSB7IHJldHVybiB0aGlzLm5leHRDaGlsZCgwLCAxLCBwb3MsIDIgLyogU2lkZS5BZnRlciAqLyk7IH1cbiAgICBjaGlsZEJlZm9yZShwb3MpIHsgcmV0dXJuIHRoaXMubmV4dENoaWxkKHRoaXMuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMSwgLTEsIHBvcywgLTIgLyogU2lkZS5CZWZvcmUgKi8pOyB9XG4gICAgZW50ZXIocG9zLCBzaWRlLCBtb2RlID0gMCkge1xuICAgICAgICBsZXQgbW91bnRlZDtcbiAgICAgICAgaWYgKCEobW9kZSAmIEl0ZXJNb2RlLklnbm9yZU92ZXJsYXlzKSAmJiAobW91bnRlZCA9IE1vdW50ZWRUcmVlLmdldCh0aGlzLl90cmVlKSkgJiYgbW91bnRlZC5vdmVybGF5KSB7XG4gICAgICAgICAgICBsZXQgclBvcyA9IHBvcyAtIHRoaXMuZnJvbTtcbiAgICAgICAgICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiBtb3VudGVkLm92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHNpZGUgPiAwID8gZnJvbSA8PSByUG9zIDogZnJvbSA8IHJQb3MpICYmXG4gICAgICAgICAgICAgICAgICAgIChzaWRlIDwgMCA/IHRvID49IHJQb3MgOiB0byA+IHJQb3MpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRyZWVOb2RlKG1vdW50ZWQudHJlZSwgbW91bnRlZC5vdmVybGF5WzBdLmZyb20gKyB0aGlzLmZyb20sIC0xLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0Q2hpbGQoMCwgMSwgcG9zLCBzaWRlLCBtb2RlKTtcbiAgICB9XG4gICAgbmV4dFNpZ25pZmljYW50UGFyZW50KCkge1xuICAgICAgICBsZXQgdmFsID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHZhbC50eXBlLmlzQW5vbnltb3VzICYmIHZhbC5fcGFyZW50KVxuICAgICAgICAgICAgdmFsID0gdmFsLl9wYXJlbnQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIGdldCBwYXJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgPyB0aGlzLl9wYXJlbnQubmV4dFNpZ25pZmljYW50UGFyZW50KCkgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgbmV4dFNpYmxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgJiYgdGhpcy5pbmRleCA+PSAwID8gdGhpcy5fcGFyZW50Lm5leHRDaGlsZCh0aGlzLmluZGV4ICsgMSwgMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBwcmV2U2libGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCAmJiB0aGlzLmluZGV4ID49IDAgPyB0aGlzLl9wYXJlbnQubmV4dENoaWxkKHRoaXMuaW5kZXggLSAxLCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCB0cmVlKCkgeyByZXR1cm4gdGhpcy5fdHJlZTsgfVxuICAgIHRvVHJlZSgpIHsgcmV0dXJuIHRoaXMuX3RyZWU7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gdGhpcy5fdHJlZS50b1N0cmluZygpOyB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZHJlbihub2RlLCB0eXBlLCBiZWZvcmUsIGFmdGVyKSB7XG4gICAgbGV0IGN1ciA9IG5vZGUuY3Vyc29yKCksIHJlc3VsdCA9IFtdO1xuICAgIGlmICghY3VyLmZpcnN0Q2hpbGQoKSlcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICBpZiAoYmVmb3JlICE9IG51bGwpXG4gICAgICAgIGZvciAobGV0IGZvdW5kID0gZmFsc2U7ICFmb3VuZDspIHtcbiAgICAgICAgICAgIGZvdW5kID0gY3VyLnR5cGUuaXMoYmVmb3JlKTtcbiAgICAgICAgICAgIGlmICghY3VyLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKGFmdGVyICE9IG51bGwgJiYgY3VyLnR5cGUuaXMoYWZ0ZXIpKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgaWYgKGN1ci50eXBlLmlzKHR5cGUpKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY3VyLm5vZGUpO1xuICAgICAgICBpZiAoIWN1ci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgcmV0dXJuIGFmdGVyID09IG51bGwgPyByZXN1bHQgOiBbXTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYXRjaE5vZGVDb250ZXh0KG5vZGUsIGNvbnRleHQsIGkgPSBjb250ZXh0Lmxlbmd0aCAtIDEpIHtcbiAgICBmb3IgKGxldCBwID0gbm9kZTsgaSA+PSAwOyBwID0gcC5wYXJlbnQpIHtcbiAgICAgICAgaWYgKCFwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXAudHlwZS5pc0Fub255bW91cykge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRbaV0gJiYgY29udGV4dFtpXSAhPSBwLm5hbWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaS0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuY2xhc3MgQnVmZmVyQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCBidWZmZXIsIGluZGV4LCBzdGFydCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgIH1cbn1cbmNsYXNzIEJ1ZmZlck5vZGUgZXh0ZW5kcyBCYXNlTm9kZSB7XG4gICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLnR5cGUubmFtZTsgfVxuICAgIGdldCBmcm9tKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LnN0YXJ0ICsgdGhpcy5jb250ZXh0LmJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDFdOyB9XG4gICAgZ2V0IHRvKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LnN0YXJ0ICsgdGhpcy5jb250ZXh0LmJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDJdOyB9XG4gICAgY29uc3RydWN0b3IoY29udGV4dCwgX3BhcmVudCwgaW5kZXgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gX3BhcmVudDtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLnR5cGUgPSBjb250ZXh0LmJ1ZmZlci5zZXQudHlwZXNbY29udGV4dC5idWZmZXIuYnVmZmVyW2luZGV4XV07XG4gICAgfVxuICAgIGNoaWxkKGRpciwgcG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgaW5kZXggPSBidWZmZXIuZmluZENoaWxkKHRoaXMuaW5kZXggKyA0LCBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXSwgZGlyLCBwb3MgLSB0aGlzLmNvbnRleHQuc3RhcnQsIHNpZGUpO1xuICAgICAgICByZXR1cm4gaW5kZXggPCAwID8gbnVsbCA6IG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcywgaW5kZXgpO1xuICAgIH1cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY2hpbGQoMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIGdldCBsYXN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmNoaWxkKC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgY2hpbGRBZnRlcihwb3MpIHsgcmV0dXJuIHRoaXMuY2hpbGQoMSwgcG9zLCAyIC8qIFNpZGUuQWZ0ZXIgKi8pOyB9XG4gICAgY2hpbGRCZWZvcmUocG9zKSB7IHJldHVybiB0aGlzLmNoaWxkKC0xLCBwb3MsIC0yIC8qIFNpZGUuQmVmb3JlICovKTsgfVxuICAgIGVudGVyKHBvcywgc2lkZSwgbW9kZSA9IDApIHtcbiAgICAgICAgaWYgKG1vZGUgJiBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IGluZGV4ID0gYnVmZmVyLmZpbmRDaGlsZCh0aGlzLmluZGV4ICsgNCwgYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM10sIHNpZGUgPiAwID8gMSA6IC0xLCBwb3MgLSB0aGlzLmNvbnRleHQuc3RhcnQsIHNpZGUpO1xuICAgICAgICByZXR1cm4gaW5kZXggPCAwID8gbnVsbCA6IG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcywgaW5kZXgpO1xuICAgIH1cbiAgICBnZXQgcGFyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50IHx8IHRoaXMuY29udGV4dC5wYXJlbnQubmV4dFNpZ25pZmljYW50UGFyZW50KCk7XG4gICAgfVxuICAgIGV4dGVybmFsU2libGluZyhkaXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCA/IG51bGwgOiB0aGlzLmNvbnRleHQucGFyZW50Lm5leHRDaGlsZCh0aGlzLmNvbnRleHQuaW5kZXggKyBkaXIsIGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTtcbiAgICB9XG4gICAgZ2V0IG5leHRTaWJsaW5nKCkge1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IGFmdGVyID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM107XG4gICAgICAgIGlmIChhZnRlciA8ICh0aGlzLl9wYXJlbnQgPyBidWZmZXIuYnVmZmVyW3RoaXMuX3BhcmVudC5pbmRleCArIDNdIDogYnVmZmVyLmJ1ZmZlci5sZW5ndGgpKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcy5fcGFyZW50LCBhZnRlcik7XG4gICAgICAgIHJldHVybiB0aGlzLmV4dGVybmFsU2libGluZygxKTtcbiAgICB9XG4gICAgZ2V0IHByZXZTaWJsaW5nKCkge1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHBhcmVudFN0YXJ0ID0gdGhpcy5fcGFyZW50ID8gdGhpcy5fcGFyZW50LmluZGV4ICsgNCA6IDA7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09IHBhcmVudFN0YXJ0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZXJuYWxTaWJsaW5nKC0xKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJOb2RlKHRoaXMuY29udGV4dCwgdGhpcy5fcGFyZW50LCBidWZmZXIuZmluZENoaWxkKHBhcmVudFN0YXJ0LCB0aGlzLmluZGV4LCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSk7XG4gICAgfVxuICAgIGdldCB0cmVlKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIHRvVHJlZSgpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gW10sIHBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHN0YXJ0SSA9IHRoaXMuaW5kZXggKyA0LCBlbmRJID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM107XG4gICAgICAgIGlmIChlbmRJID4gc3RhcnRJKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDFdO1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChidWZmZXIuc2xpY2Uoc3RhcnRJLCBlbmRJLCBmcm9tKSk7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRyZWUodGhpcy50eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCB0aGlzLnRvIC0gdGhpcy5mcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5idWZmZXIuY2hpbGRTdHJpbmcodGhpcy5pbmRleCk7IH1cbn1cbmZ1bmN0aW9uIGl0ZXJTdGFjayhoZWFkcykge1xuICAgIGlmICghaGVhZHMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgcGljayA9IDAsIHBpY2tlZCA9IGhlYWRzWzBdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaGVhZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG5vZGUgPSBoZWFkc1tpXTtcbiAgICAgICAgaWYgKG5vZGUuZnJvbSA+IHBpY2tlZC5mcm9tIHx8IG5vZGUudG8gPCBwaWNrZWQudG8pIHtcbiAgICAgICAgICAgIHBpY2tlZCA9IG5vZGU7XG4gICAgICAgICAgICBwaWNrID0gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgbmV4dCA9IHBpY2tlZCBpbnN0YW5jZW9mIFRyZWVOb2RlICYmIHBpY2tlZC5pbmRleCA8IDAgPyBudWxsIDogcGlja2VkLnBhcmVudDtcbiAgICBsZXQgbmV3SGVhZHMgPSBoZWFkcy5zbGljZSgpO1xuICAgIGlmIChuZXh0KVxuICAgICAgICBuZXdIZWFkc1twaWNrXSA9IG5leHQ7XG4gICAgZWxzZVxuICAgICAgICBuZXdIZWFkcy5zcGxpY2UocGljaywgMSk7XG4gICAgcmV0dXJuIG5ldyBTdGFja0l0ZXJhdG9yKG5ld0hlYWRzLCBwaWNrZWQpO1xufVxuY2xhc3MgU3RhY2tJdGVyYXRvciB7XG4gICAgY29uc3RydWN0b3IoaGVhZHMsIG5vZGUpIHtcbiAgICAgICAgdGhpcy5oZWFkcyA9IGhlYWRzO1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIH1cbiAgICBnZXQgbmV4dCgpIHsgcmV0dXJuIGl0ZXJTdGFjayh0aGlzLmhlYWRzKTsgfVxufVxuZnVuY3Rpb24gc3RhY2tJdGVyYXRvcih0cmVlLCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgaW5uZXIgPSB0cmVlLnJlc29sdmVJbm5lcihwb3MsIHNpZGUpLCBsYXllcnMgPSBudWxsO1xuICAgIGZvciAobGV0IHNjYW4gPSBpbm5lciBpbnN0YW5jZW9mIFRyZWVOb2RlID8gaW5uZXIgOiBpbm5lci5jb250ZXh0LnBhcmVudDsgc2Nhbjsgc2NhbiA9IHNjYW4ucGFyZW50KSB7XG4gICAgICAgIGlmIChzY2FuLmluZGV4IDwgMCkgeyAvLyBUaGlzIGlzIGFuIG92ZXJsYXkgcm9vdFxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHNjYW4ucGFyZW50O1xuICAgICAgICAgICAgKGxheWVycyB8fCAobGF5ZXJzID0gW2lubmVyXSkpLnB1c2gocGFyZW50LnJlc29sdmUocG9zLCBzaWRlKSk7XG4gICAgICAgICAgICBzY2FuID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1vdW50ID0gTW91bnRlZFRyZWUuZ2V0KHNjYW4udHJlZSk7XG4gICAgICAgICAgICAvLyBSZWxldmFudCBvdmVybGF5IGJyYW5jaGluZyBvZmZcbiAgICAgICAgICAgIGlmIChtb3VudCAmJiBtb3VudC5vdmVybGF5ICYmIG1vdW50Lm92ZXJsYXlbMF0uZnJvbSA8PSBwb3MgJiYgbW91bnQub3ZlcmxheVttb3VudC5vdmVybGF5Lmxlbmd0aCAtIDFdLnRvID49IHBvcykge1xuICAgICAgICAgICAgICAgIGxldCByb290ID0gbmV3IFRyZWVOb2RlKG1vdW50LnRyZWUsIG1vdW50Lm92ZXJsYXlbMF0uZnJvbSArIHNjYW4uZnJvbSwgLTEsIHNjYW4pO1xuICAgICAgICAgICAgICAgIChsYXllcnMgfHwgKGxheWVycyA9IFtpbm5lcl0pKS5wdXNoKHJlc29sdmVOb2RlKHJvb3QsIHBvcywgc2lkZSwgZmFsc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGF5ZXJzID8gaXRlclN0YWNrKGxheWVycykgOiBpbm5lcjtcbn1cbi8qKlxuQSB0cmVlIGN1cnNvciBvYmplY3QgZm9jdXNlcyBvbiBhIGdpdmVuIG5vZGUgaW4gYSBzeW50YXggdHJlZSwgYW5kXG5hbGxvd3MgeW91IHRvIG1vdmUgdG8gYWRqYWNlbnQgbm9kZXMuXG4qL1xuY2xhc3MgVHJlZUN1cnNvciB7XG4gICAgLyoqXG4gICAgU2hvcnRoYW5kIGZvciBgLnR5cGUubmFtZWAuXG4gICAgKi9cbiAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMudHlwZS5uYW1lOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihub2RlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1vZGUgPSAwKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgIHRoaXMuYnVmZmVyTm9kZSA9IG51bGw7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMueWllbGROb2RlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdHJlZSA9IG5vZGUuY29udGV4dC5wYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5vZGUuY29udGV4dDtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSBub2RlLl9wYXJlbnQ7IG47IG4gPSBuLl9wYXJlbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5zdGFjay51bnNoaWZ0KG4uaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXJOb2RlID0gbm9kZTtcbiAgICAgICAgICAgIHRoaXMueWllbGRCdWYobm9kZS5pbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgeWllbGROb2RlKG5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLl90cmVlID0gbm9kZTtcbiAgICAgICAgdGhpcy50eXBlID0gbm9kZS50eXBlO1xuICAgICAgICB0aGlzLmZyb20gPSBub2RlLmZyb207XG4gICAgICAgIHRoaXMudG8gPSBub2RlLnRvO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgeWllbGRCdWYoaW5kZXgsIHR5cGUpIHtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICBsZXQgeyBzdGFydCwgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCBidWZmZXIuc2V0LnR5cGVzW2J1ZmZlci5idWZmZXJbaW5kZXhdXTtcbiAgICAgICAgdGhpcy5mcm9tID0gc3RhcnQgKyBidWZmZXIuYnVmZmVyW2luZGV4ICsgMV07XG4gICAgICAgIHRoaXMudG8gPSBzdGFydCArIGJ1ZmZlci5idWZmZXJbaW5kZXggKyAyXTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgeWllbGQobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkTm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1ZmZlciA9IG5vZGUuY29udGV4dDtcbiAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYobm9kZS5pbmRleCwgbm9kZS50eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIuYnVmZmVyLmNoaWxkU3RyaW5nKHRoaXMuaW5kZXgpIDogdGhpcy5fdHJlZS50b1N0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGVudGVyQ2hpbGQoZGlyLCBwb3MsIHNpZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkKHRoaXMuX3RyZWUubmV4dENoaWxkKGRpciA8IDAgPyB0aGlzLl90cmVlLl90cmVlLmNoaWxkcmVuLmxlbmd0aCAtIDEgOiAwLCBkaXIsIHBvcywgc2lkZSwgdGhpcy5tb2RlKSk7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5idWZmZXI7XG4gICAgICAgIGxldCBpbmRleCA9IGJ1ZmZlci5maW5kQ2hpbGQodGhpcy5pbmRleCArIDQsIGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdLCBkaXIsIHBvcyAtIHRoaXMuYnVmZmVyLnN0YXJ0LCBzaWRlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKHRoaXMuaW5kZXgpO1xuICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1ZihpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGlzIG5vZGUncyBmaXJzdCBjaGlsZC4gV2hlbiB0aGlzIHJldHVybnNcbiAgICBmYWxzZSwgdGhlIG5vZGUgaGFzIG5vIGNoaWxkLCBhbmQgdGhlIGN1cnNvciBoYXMgbm90IGJlZW4gbW92ZWQuXG4gICAgKi9cbiAgICBmaXJzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5lbnRlckNoaWxkKDEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhpcyBub2RlJ3MgbGFzdCBjaGlsZC5cbiAgICAqL1xuICAgIGxhc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuZW50ZXJDaGlsZCgtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgZmlyc3QgY2hpbGQgdGhhdCBlbmRzIGFmdGVyIGBwb3NgLlxuICAgICovXG4gICAgY2hpbGRBZnRlcihwb3MpIHsgcmV0dXJuIHRoaXMuZW50ZXJDaGlsZCgxLCBwb3MsIDIgLyogU2lkZS5BZnRlciAqLyk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBsYXN0IGNoaWxkIHRoYXQgc3RhcnRzIGJlZm9yZSBgcG9zYC5cbiAgICAqL1xuICAgIGNoaWxkQmVmb3JlKHBvcykgeyByZXR1cm4gdGhpcy5lbnRlckNoaWxkKC0xLCBwb3MsIC0yIC8qIFNpZGUuQmVmb3JlICovKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgY2hpbGQgYXJvdW5kIGBwb3NgLiBJZiBzaWRlIGlzIC0xIHRoZVxuICAgIGNoaWxkIG1heSBlbmQgYXQgdGhhdCBwb3NpdGlvbiwgd2hlbiAxIGl0IG1heSBzdGFydCB0aGVyZS4gVGhpc1xuICAgIHdpbGwgYWxzbyBlbnRlciBbb3ZlcmxhaWRdKCNjb21tb24uTW91bnRlZFRyZWUub3ZlcmxheSlcbiAgICBbbW91bnRlZF0oI2NvbW1vbi5Ob2RlUHJvcF5tb3VudGVkKSB0cmVlcyB1bmxlc3MgYG92ZXJsYXlzYCBpc1xuICAgIHNldCB0byBmYWxzZS5cbiAgICAqL1xuICAgIGVudGVyKHBvcywgc2lkZSwgbW9kZSA9IHRoaXMubW9kZSkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGQodGhpcy5fdHJlZS5lbnRlcihwb3MsIHNpZGUsIG1vZGUpKTtcbiAgICAgICAgcmV0dXJuIG1vZGUgJiBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycyA/IGZhbHNlIDogdGhpcy5lbnRlckNoaWxkKDEsIHBvcywgc2lkZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5vZGUncyBwYXJlbnQgbm9kZSwgaWYgdGhpcyBpc24ndCB0aGUgdG9wIG5vZGUuXG4gICAgKi9cbiAgICBwYXJlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZE5vZGUoKHRoaXMubW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpID8gdGhpcy5fdHJlZS5fcGFyZW50IDogdGhpcy5fdHJlZS5wYXJlbnQpO1xuICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1Zih0aGlzLnN0YWNrLnBvcCgpKTtcbiAgICAgICAgbGV0IHBhcmVudCA9ICh0aGlzLm1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSA/IHRoaXMuYnVmZmVyLnBhcmVudCA6IHRoaXMuYnVmZmVyLnBhcmVudC5uZXh0U2lnbmlmaWNhbnRQYXJlbnQoKTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy55aWVsZE5vZGUocGFyZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzaWJsaW5nKGRpcikge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuICF0aGlzLl90cmVlLl9wYXJlbnQgPyBmYWxzZVxuICAgICAgICAgICAgICAgIDogdGhpcy55aWVsZCh0aGlzLl90cmVlLmluZGV4IDwgMCA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl90cmVlLl9wYXJlbnQubmV4dENoaWxkKHRoaXMuX3RyZWUuaW5kZXggKyBkaXIsIGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovLCB0aGlzLm1vZGUpKTtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlciwgZCA9IHRoaXMuc3RhY2subGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGRpciA8IDApIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRTdGFydCA9IGQgPCAwID8gMCA6IHRoaXMuc3RhY2tbZF0gKyA0O1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggIT0gcGFyZW50U3RhcnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYoYnVmZmVyLmZpbmRDaGlsZChwYXJlbnRTdGFydCwgdGhpcy5pbmRleCwgLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM107XG4gICAgICAgICAgICBpZiAoYWZ0ZXIgPCAoZCA8IDAgPyBidWZmZXIuYnVmZmVyLmxlbmd0aCA6IGJ1ZmZlci5idWZmZXJbdGhpcy5zdGFja1tkXSArIDNdKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1ZihhZnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGQgPCAwID8gdGhpcy55aWVsZCh0aGlzLmJ1ZmZlci5wYXJlbnQubmV4dENoaWxkKHRoaXMuYnVmZmVyLmluZGV4ICsgZGlyLCBkaXIsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLywgdGhpcy5tb2RlKSkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGlzIG5vZGUncyBuZXh0IHNpYmxpbmcsIGlmIGFueS5cbiAgICAqL1xuICAgIG5leHRTaWJsaW5nKCkgeyByZXR1cm4gdGhpcy5zaWJsaW5nKDEpOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGlzIG5vZGUncyBwcmV2aW91cyBzaWJsaW5nLCBpZiBhbnkuXG4gICAgKi9cbiAgICBwcmV2U2libGluZygpIHsgcmV0dXJuIHRoaXMuc2libGluZygtMSk7IH1cbiAgICBhdExhc3ROb2RlKGRpcikge1xuICAgICAgICBsZXQgaW5kZXgsIHBhcmVudCwgeyBidWZmZXIgfSA9IHRoaXM7XG4gICAgICAgIGlmIChidWZmZXIpIHtcbiAgICAgICAgICAgIGlmIChkaXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPCBidWZmZXIuYnVmZmVyLmJ1ZmZlci5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmRleDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmJ1ZmZlci5idWZmZXJbaSArIDNdIDwgdGhpcy5pbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICh7IGluZGV4LCBwYXJlbnQgfSA9IGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAoeyBpbmRleCwgX3BhcmVudDogcGFyZW50IH0gPSB0aGlzLl90cmVlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDsgcGFyZW50OyB7IGluZGV4LCBfcGFyZW50OiBwYXJlbnQgfSA9IHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4ICsgZGlyLCBlID0gZGlyIDwgMCA/IC0xIDogcGFyZW50Ll90cmVlLmNoaWxkcmVuLmxlbmd0aDsgaSAhPSBlOyBpICs9IGRpcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSBwYXJlbnQuX3RyZWUuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5tb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkIGluc3RhbmNlb2YgVHJlZUJ1ZmZlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIWNoaWxkLnR5cGUuaXNBbm9ueW1vdXMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG1vdmUoZGlyLCBlbnRlcikge1xuICAgICAgICBpZiAoZW50ZXIgJiYgdGhpcy5lbnRlckNoaWxkKGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaWJsaW5nKGRpcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5hdExhc3ROb2RlKGRpcikgfHwgIXRoaXMucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5leHQgbm9kZSBpbiBhXG4gICAgW3ByZS1vcmRlcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVHJlZV90cmF2ZXJzYWwjUHJlLW9yZGVyLF9OTFIpXG4gICAgdHJhdmVyc2FsLCBnb2luZyBmcm9tIGEgbm9kZSB0byBpdHMgZmlyc3QgY2hpbGQgb3IsIGlmIHRoZVxuICAgIGN1cnJlbnQgbm9kZSBpcyBlbXB0eSBvciBgZW50ZXJgIGlzIGZhbHNlLCBpdHMgbmV4dCBzaWJsaW5nIG9yXG4gICAgdGhlIG5leHQgc2libGluZyBvZiB0aGUgZmlyc3QgcGFyZW50IG5vZGUgdGhhdCBoYXMgb25lLlxuICAgICovXG4gICAgbmV4dChlbnRlciA9IHRydWUpIHsgcmV0dXJuIHRoaXMubW92ZSgxLCBlbnRlcik7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBuZXh0IG5vZGUgaW4gYSBsYXN0LXRvLWZpcnN0IHByZS1vcmRlciB0cmF2ZXJzYWwuIEFcbiAgICBub2RlIGlzIGZvbGxvd2VkIGJ5IGl0cyBsYXN0IGNoaWxkIG9yLCBpZiBpdCBoYXMgbm9uZSwgaXRzXG4gICAgcHJldmlvdXMgc2libGluZyBvciB0aGUgcHJldmlvdXMgc2libGluZyBvZiB0aGUgZmlyc3QgcGFyZW50XG4gICAgbm9kZSB0aGF0IGhhcyBvbmUuXG4gICAgKi9cbiAgICBwcmV2KGVudGVyID0gdHJ1ZSkgeyByZXR1cm4gdGhpcy5tb3ZlKC0xLCBlbnRlcik7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGlubmVybW9zdCBub2RlIHRoYXQgY292ZXJzIGBwb3NgLiBJZlxuICAgIGBzaWRlYCBpcyAtMSwgaXQgd2lsbCBlbnRlciBub2RlcyB0aGF0IGVuZCBhdCBgcG9zYC4gSWYgaXQgaXMgMSxcbiAgICBpdCB3aWxsIGVudGVyIG5vZGVzIHRoYXQgc3RhcnQgYXQgYHBvc2AuXG4gICAgKi9cbiAgICBtb3ZlVG8ocG9zLCBzaWRlID0gMCkge1xuICAgICAgICAvLyBNb3ZlIHVwIHRvIGEgbm9kZSB0aGF0IGFjdHVhbGx5IGhvbGRzIHRoZSBwb3NpdGlvbiwgaWYgcG9zc2libGVcbiAgICAgICAgd2hpbGUgKHRoaXMuZnJvbSA9PSB0aGlzLnRvIHx8XG4gICAgICAgICAgICAoc2lkZSA8IDEgPyB0aGlzLmZyb20gPj0gcG9zIDogdGhpcy5mcm9tID4gcG9zKSB8fFxuICAgICAgICAgICAgKHNpZGUgPiAtMSA/IHRoaXMudG8gPD0gcG9zIDogdGhpcy50byA8IHBvcykpXG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFRoZW4gc2NhbiBkb3duIGludG8gY2hpbGQgbm9kZXMgYXMgZmFyIGFzIHBvc3NpYmxlXG4gICAgICAgIHdoaWxlICh0aGlzLmVudGVyQ2hpbGQoMSwgcG9zLCBzaWRlKSkgeyB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbc3ludGF4IG5vZGVdKCNjb21tb24uU3ludGF4Tm9kZSkgYXQgdGhlIGN1cnNvcidzIGN1cnJlbnRcbiAgICBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGdldCBub2RlKCkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyZWU7XG4gICAgICAgIGxldCBjYWNoZSA9IHRoaXMuYnVmZmVyTm9kZSwgcmVzdWx0ID0gbnVsbCwgZGVwdGggPSAwO1xuICAgICAgICBpZiAoY2FjaGUgJiYgY2FjaGUuY29udGV4dCA9PSB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgc2NhbjogZm9yIChsZXQgaW5kZXggPSB0aGlzLmluZGV4LCBkID0gdGhpcy5zdGFjay5sZW5ndGg7IGQgPj0gMDspIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gY2FjaGU7IGM7IGMgPSBjLl9wYXJlbnQpXG4gICAgICAgICAgICAgICAgICAgIGlmIChjLmluZGV4ID09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gdGhpcy5pbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGM7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCA9IGQgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5zdGFja1stLWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSBkZXB0aDsgaSA8IHRoaXMuc3RhY2subGVuZ3RoOyBpKyspXG4gICAgICAgICAgICByZXN1bHQgPSBuZXcgQnVmZmVyTm9kZSh0aGlzLmJ1ZmZlciwgcmVzdWx0LCB0aGlzLnN0YWNrW2ldKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyTm9kZSA9IG5ldyBCdWZmZXJOb2RlKHRoaXMuYnVmZmVyLCByZXN1bHQsIHRoaXMuaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIFt0cmVlXSgjY29tbW9uLlRyZWUpIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBub2RlLCBpZlxuICAgIGFueS4gV2lsbCByZXR1cm4gbnVsbCB3aGVuIHRoZSBub2RlIGlzIGluIGEgW3RyZWVcbiAgICBidWZmZXJdKCNjb21tb24uVHJlZUJ1ZmZlcikuXG4gICAgKi9cbiAgICBnZXQgdHJlZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyID8gbnVsbCA6IHRoaXMuX3RyZWUuX3RyZWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgY3VycmVudCBub2RlIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzLCBjYWxsaW5nXG4gICAgYGVudGVyYCB3aGVuIGVudGVyaW5nIGEgbm9kZSBhbmQgYGxlYXZlYCwgaWYgZ2l2ZW4sIHdoZW4gbGVhdmluZ1xuICAgIG9uZS4gV2hlbiBgZW50ZXJgIHJldHVybnMgYGZhbHNlYCwgYW55IGNoaWxkcmVuIG9mIHRoYXQgbm9kZSBhcmVcbiAgICBza2lwcGVkLCBhbmQgYGxlYXZlYCBpc24ndCBjYWxsZWQgZm9yIGl0LlxuICAgICovXG4gICAgaXRlcmF0ZShlbnRlciwgbGVhdmUpIHtcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBtdXN0TGVhdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUuaXNBbm9ueW1vdXMgfHwgZW50ZXIodGhpcykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3RDaGlsZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudHlwZS5pc0Fub255bW91cylcbiAgICAgICAgICAgICAgICAgICAgbXVzdExlYXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBpZiAobXVzdExlYXZlICYmIGxlYXZlKVxuICAgICAgICAgICAgICAgICAgICBsZWF2ZSh0aGlzKTtcbiAgICAgICAgICAgICAgICBtdXN0TGVhdmUgPSB0aGlzLnR5cGUuaXNBbm9ueW1vdXM7XG4gICAgICAgICAgICAgICAgaWYgKCFkZXB0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50KCk7XG4gICAgICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICAgICAgICBtdXN0TGVhdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGUgY3VycmVudCBub2RlIG1hdGNoZXMgYSBnaXZlbiBjb250ZXh0XHUyMDE0YSBzZXF1ZW5jZVxuICAgIG9mIGRpcmVjdCBwYXJlbnQgbm9kZSBuYW1lcy4gRW1wdHkgc3RyaW5ncyBpbiB0aGUgY29udGV4dCBhcnJheVxuICAgIGFyZSB0cmVhdGVkIGFzIHdpbGRjYXJkcy5cbiAgICAqL1xuICAgIG1hdGNoQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hOb2RlQ29udGV4dCh0aGlzLm5vZGUucGFyZW50LCBjb250ZXh0KTtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlciwgeyB0eXBlcyB9ID0gYnVmZmVyLnNldDtcbiAgICAgICAgZm9yIChsZXQgaSA9IGNvbnRleHQubGVuZ3RoIC0gMSwgZCA9IHRoaXMuc3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgIGlmIChkIDwgMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hOb2RlQ29udGV4dCh0aGlzLl90cmVlLCBjb250ZXh0LCBpKTtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZXNbYnVmZmVyLmJ1ZmZlclt0aGlzLnN0YWNrW2RdXV07XG4gICAgICAgICAgICBpZiAoIXR5cGUuaXNBbm9ueW1vdXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dFtpXSAmJiBjb250ZXh0W2ldICE9IHR5cGUubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYXNDaGlsZCh0cmVlKSB7XG4gICAgcmV0dXJuIHRyZWUuY2hpbGRyZW4uc29tZShjaCA9PiBjaCBpbnN0YW5jZW9mIFRyZWVCdWZmZXIgfHwgIWNoLnR5cGUuaXNBbm9ueW1vdXMgfHwgaGFzQ2hpbGQoY2gpKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkVHJlZShkYXRhKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCB7IGJ1ZmZlciwgbm9kZVNldCwgbWF4QnVmZmVyTGVuZ3RoID0gRGVmYXVsdEJ1ZmZlckxlbmd0aCwgcmV1c2VkID0gW10sIG1pblJlcGVhdFR5cGUgPSBub2RlU2V0LnR5cGVzLmxlbmd0aCB9ID0gZGF0YTtcbiAgICBsZXQgY3Vyc29yID0gQXJyYXkuaXNBcnJheShidWZmZXIpID8gbmV3IEZsYXRCdWZmZXJDdXJzb3IoYnVmZmVyLCBidWZmZXIubGVuZ3RoKSA6IGJ1ZmZlcjtcbiAgICBsZXQgdHlwZXMgPSBub2RlU2V0LnR5cGVzO1xuICAgIGxldCBjb250ZXh0SGFzaCA9IDAsIGxvb2tBaGVhZCA9IDA7XG4gICAgZnVuY3Rpb24gdGFrZU5vZGUocGFyZW50U3RhcnQsIG1pblBvcywgY2hpbGRyZW4sIHBvc2l0aW9ucywgaW5SZXBlYXQsIGRlcHRoKSB7XG4gICAgICAgIGxldCB7IGlkLCBzdGFydCwgZW5kLCBzaXplIH0gPSBjdXJzb3I7XG4gICAgICAgIGxldCBsb29rQWhlYWRBdFN0YXJ0ID0gbG9va0FoZWFkLCBjb250ZXh0QXRTdGFydCA9IGNvbnRleHRIYXNoO1xuICAgICAgICB3aGlsZSAoc2l6ZSA8IDApIHtcbiAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICBpZiAoc2l6ZSA9PSAtMSAvKiBTcGVjaWFsUmVjb3JkLlJldXNlICovKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSByZXVzZWRbaWRdO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25zLnB1c2goc3RhcnQgLSBwYXJlbnRTdGFydCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAtMyAvKiBTcGVjaWFsUmVjb3JkLkNvbnRleHRDaGFuZ2UgKi8pIHsgLy8gQ29udGV4dCBjaGFuZ2VcbiAgICAgICAgICAgICAgICBjb250ZXh0SGFzaCA9IGlkO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gLTQgLyogU3BlY2lhbFJlY29yZC5Mb29rQWhlYWQgKi8pIHtcbiAgICAgICAgICAgICAgICBsb29rQWhlYWQgPSBpZDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5yZWNvZ25pemVkIHJlY29yZCBzaXplOiAke3NpemV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHR5cGUgPSB0eXBlc1tpZF0sIG5vZGUsIGJ1ZmZlcjtcbiAgICAgICAgbGV0IHN0YXJ0UG9zID0gc3RhcnQgLSBwYXJlbnRTdGFydDtcbiAgICAgICAgaWYgKGVuZCAtIHN0YXJ0IDw9IG1heEJ1ZmZlckxlbmd0aCAmJiAoYnVmZmVyID0gZmluZEJ1ZmZlclNpemUoY3Vyc29yLnBvcyAtIG1pblBvcywgaW5SZXBlYXQpKSkge1xuICAgICAgICAgICAgLy8gU21hbGwgZW5vdWdoIGZvciBhIGJ1ZmZlciwgYW5kIG5vIHJldXNlZCBub2RlcyBpbnNpZGVcbiAgICAgICAgICAgIGxldCBkYXRhID0gbmV3IFVpbnQxNkFycmF5KGJ1ZmZlci5zaXplIC0gYnVmZmVyLnNraXApO1xuICAgICAgICAgICAgbGV0IGVuZFBvcyA9IGN1cnNvci5wb3MgLSBidWZmZXIuc2l6ZSwgaW5kZXggPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJzb3IucG9zID4gZW5kUG9zKVxuICAgICAgICAgICAgICAgIGluZGV4ID0gY29weVRvQnVmZmVyKGJ1ZmZlci5zdGFydCwgZGF0YSwgaW5kZXgpO1xuICAgICAgICAgICAgbm9kZSA9IG5ldyBUcmVlQnVmZmVyKGRhdGEsIGVuZCAtIGJ1ZmZlci5zdGFydCwgbm9kZVNldCk7XG4gICAgICAgICAgICBzdGFydFBvcyA9IGJ1ZmZlci5zdGFydCAtIHBhcmVudFN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBNYWtlIGl0IGEgbm9kZVxuICAgICAgICAgICAgbGV0IGVuZFBvcyA9IGN1cnNvci5wb3MgLSBzaXplO1xuICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgIGxldCBsb2NhbENoaWxkcmVuID0gW10sIGxvY2FsUG9zaXRpb25zID0gW107XG4gICAgICAgICAgICBsZXQgbG9jYWxJblJlcGVhdCA9IGlkID49IG1pblJlcGVhdFR5cGUgPyBpZCA6IC0xO1xuICAgICAgICAgICAgbGV0IGxhc3RHcm91cCA9IDAsIGxhc3RFbmQgPSBlbmQ7XG4gICAgICAgICAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IGVuZFBvcykge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbEluUmVwZWF0ID49IDAgJiYgY3Vyc29yLmlkID09IGxvY2FsSW5SZXBlYXQgJiYgY3Vyc29yLnNpemUgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmVuZCA8PSBsYXN0RW5kIC0gbWF4QnVmZmVyTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWtlUmVwZWF0TGVhZihsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgc3RhcnQsIGxhc3RHcm91cCwgY3Vyc29yLmVuZCwgbGFzdEVuZCwgbG9jYWxJblJlcGVhdCwgbG9va0FoZWFkQXRTdGFydCwgY29udGV4dEF0U3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEdyb3VwID0gbG9jYWxDaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0RW5kID0gY3Vyc29yLmVuZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXB0aCA+IDI1MDAgLyogQ3V0T2ZmLkRlcHRoICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHRha2VGbGF0Tm9kZShzdGFydCwgZW5kUG9zLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YWtlTm9kZShzdGFydCwgZW5kUG9zLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgbG9jYWxJblJlcGVhdCwgZGVwdGggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobG9jYWxJblJlcGVhdCA+PSAwICYmIGxhc3RHcm91cCA+IDAgJiYgbGFzdEdyb3VwIDwgbG9jYWxDaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgbWFrZVJlcGVhdExlYWYobG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIHN0YXJ0LCBsYXN0R3JvdXAsIHN0YXJ0LCBsYXN0RW5kLCBsb2NhbEluUmVwZWF0LCBsb29rQWhlYWRBdFN0YXJ0LCBjb250ZXh0QXRTdGFydCk7XG4gICAgICAgICAgICBsb2NhbENoaWxkcmVuLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGxvY2FsUG9zaXRpb25zLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGlmIChsb2NhbEluUmVwZWF0ID4gLTEgJiYgbGFzdEdyb3VwID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBtYWtlID0gbWFrZUJhbGFuY2VkKHR5cGUsIGNvbnRleHRBdFN0YXJ0KTtcbiAgICAgICAgICAgICAgICBub2RlID0gYmFsYW5jZVJhbmdlKHR5cGUsIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCAwLCBsb2NhbENoaWxkcmVuLmxlbmd0aCwgMCwgZW5kIC0gc3RhcnQsIG1ha2UsIG1ha2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG1ha2VUcmVlKHR5cGUsIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCBlbmQgLSBzdGFydCwgbG9va0FoZWFkQXRTdGFydCAtIGVuZCwgY29udGV4dEF0U3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKHN0YXJ0UG9zKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdGFrZUZsYXROb2RlKHBhcmVudFN0YXJ0LCBtaW5Qb3MsIGNoaWxkcmVuLCBwb3NpdGlvbnMpIHtcbiAgICAgICAgbGV0IG5vZGVzID0gW107IC8vIFRlbXBvcmFyeSwgaW52ZXJ0ZWQgYXJyYXkgb2YgbGVhZiBub2RlcyBmb3VuZCwgd2l0aCBhYnNvbHV0ZSBwb3NpdGlvbnNcbiAgICAgICAgbGV0IG5vZGVDb3VudCA9IDAsIHN0b3BBdCA9IC0xO1xuICAgICAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IG1pblBvcykge1xuICAgICAgICAgICAgbGV0IHsgaWQsIHN0YXJ0LCBlbmQsIHNpemUgfSA9IGN1cnNvcjtcbiAgICAgICAgICAgIGlmIChzaXplID4gNCkgeyAvLyBOb3QgYSBsZWFmXG4gICAgICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0b3BBdCA+IC0xICYmIHN0YXJ0IDwgc3RvcEF0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RvcEF0IDwgMClcbiAgICAgICAgICAgICAgICAgICAgc3RvcEF0ID0gZW5kIC0gbWF4QnVmZmVyTGVuZ3RoO1xuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2goaWQsIHN0YXJ0LCBlbmQpO1xuICAgICAgICAgICAgICAgIG5vZGVDb3VudCsrO1xuICAgICAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGVDb3VudCkge1xuICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50MTZBcnJheShub2RlQ291bnQgKiA0KTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG5vZGVzLmxlbmd0aCAtIDMsIGogPSAwOyBpID49IDA7IGkgLT0gMykge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gbm9kZXNbaV07XG4gICAgICAgICAgICAgICAgYnVmZmVyW2orK10gPSBub2Rlc1tpICsgMV0gLSBzdGFydDtcbiAgICAgICAgICAgICAgICBidWZmZXJbaisrXSA9IG5vZGVzW2kgKyAyXSAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2gobmV3IFRyZWVCdWZmZXIoYnVmZmVyLCBub2Rlc1syXSAtIHN0YXJ0LCBub2RlU2V0KSk7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaChzdGFydCAtIHBhcmVudFN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBtYWtlQmFsYW5jZWQodHlwZSwgY29udGV4dEhhc2gpIHtcbiAgICAgICAgcmV0dXJuIChjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpID0+IHtcbiAgICAgICAgICAgIGxldCBsb29rQWhlYWQgPSAwLCBsYXN0SSA9IGNoaWxkcmVuLmxlbmd0aCAtIDEsIGxhc3QsIGxvb2tBaGVhZFByb3A7XG4gICAgICAgICAgICBpZiAobGFzdEkgPj0gMCAmJiAobGFzdCA9IGNoaWxkcmVuW2xhc3RJXSkgaW5zdGFuY2VvZiBUcmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsYXN0SSAmJiBsYXN0LnR5cGUgPT0gdHlwZSAmJiBsYXN0Lmxlbmd0aCA9PSBsZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0O1xuICAgICAgICAgICAgICAgIGlmIChsb29rQWhlYWRQcm9wID0gbGFzdC5wcm9wKE5vZGVQcm9wLmxvb2tBaGVhZCkpXG4gICAgICAgICAgICAgICAgICAgIGxvb2tBaGVhZCA9IHBvc2l0aW9uc1tsYXN0SV0gKyBsYXN0Lmxlbmd0aCArIGxvb2tBaGVhZFByb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFrZVRyZWUodHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoLCBsb29rQWhlYWQsIGNvbnRleHRIYXNoKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFrZVJlcGVhdExlYWYoY2hpbGRyZW4sIHBvc2l0aW9ucywgYmFzZSwgaSwgZnJvbSwgdG8sIHR5cGUsIGxvb2tBaGVhZCwgY29udGV4dEhhc2gpIHtcbiAgICAgICAgbGV0IGxvY2FsQ2hpbGRyZW4gPSBbXSwgbG9jYWxQb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgd2hpbGUgKGNoaWxkcmVuLmxlbmd0aCA+IGkpIHtcbiAgICAgICAgICAgIGxvY2FsQ2hpbGRyZW4ucHVzaChjaGlsZHJlbi5wb3AoKSk7XG4gICAgICAgICAgICBsb2NhbFBvc2l0aW9ucy5wdXNoKHBvc2l0aW9ucy5wb3AoKSArIGJhc2UgLSBmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5wdXNoKG1ha2VUcmVlKG5vZGVTZXQudHlwZXNbdHlwZV0sIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCB0byAtIGZyb20sIGxvb2tBaGVhZCAtIHRvLCBjb250ZXh0SGFzaCkpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChmcm9tIC0gYmFzZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1ha2VUcmVlKHR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCwgbG9va0FoZWFkLCBjb250ZXh0SGFzaCwgcHJvcHMpIHtcbiAgICAgICAgaWYgKGNvbnRleHRIYXNoKSB7XG4gICAgICAgICAgICBsZXQgcGFpciA9IFtOb2RlUHJvcC5jb250ZXh0SGFzaCwgY29udGV4dEhhc2hdO1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyA/IFtwYWlyXS5jb25jYXQocHJvcHMpIDogW3BhaXJdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb29rQWhlYWQgPiAyNSkge1xuICAgICAgICAgICAgbGV0IHBhaXIgPSBbTm9kZVByb3AubG9va0FoZWFkLCBsb29rQWhlYWRdO1xuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyA/IFtwYWlyXS5jb25jYXQocHJvcHMpIDogW3BhaXJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVHJlZSh0eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgsIHByb3BzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluZEJ1ZmZlclNpemUobWF4U2l6ZSwgaW5SZXBlYXQpIHtcbiAgICAgICAgLy8gU2NhbiB0aHJvdWdoIHRoZSBidWZmZXIgdG8gZmluZCBwcmV2aW91cyBzaWJsaW5ncyB0aGF0IGZpdFxuICAgICAgICAvLyB0b2dldGhlciBpbiBhIFRyZWVCdWZmZXIsIGFuZCBkb24ndCBjb250YWluIGFueSByZXVzZWQgbm9kZXNcbiAgICAgICAgLy8gKHdoaWNoIGNhbid0IGJlIHN0b3JlZCBpbiBhIGJ1ZmZlcikuXG4gICAgICAgIC8vIElmIGBpblJlcGVhdGAgaXMgPiAtMSwgaWdub3JlIG5vZGUgYm91bmRhcmllcyBvZiB0aGF0IHR5cGUgZm9yXG4gICAgICAgIC8vIG5lc3RpbmcsIGJ1dCBtYWtlIHN1cmUgdGhlIGVuZCBmYWxscyBlaXRoZXIgYXQgdGhlIHN0YXJ0XG4gICAgICAgIC8vIChgbWF4U2l6ZWApIG9yIGJlZm9yZSBzdWNoIGEgbm9kZS5cbiAgICAgICAgbGV0IGZvcmsgPSBjdXJzb3IuZm9yaygpO1xuICAgICAgICBsZXQgc2l6ZSA9IDAsIHN0YXJ0ID0gMCwgc2tpcCA9IDAsIG1pblN0YXJ0ID0gZm9yay5lbmQgLSBtYXhCdWZmZXJMZW5ndGg7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHNpemU6IDAsIHN0YXJ0OiAwLCBza2lwOiAwIH07XG4gICAgICAgIHNjYW46IGZvciAobGV0IG1pblBvcyA9IGZvcmsucG9zIC0gbWF4U2l6ZTsgZm9yay5wb3MgPiBtaW5Qb3M7KSB7XG4gICAgICAgICAgICBsZXQgbm9kZVNpemUgPSBmb3JrLnNpemU7XG4gICAgICAgICAgICAvLyBQcmV0ZW5kIG5lc3RlZCByZXBlYXQgbm9kZXMgb2YgdGhlIHNhbWUgdHlwZSBkb24ndCBleGlzdFxuICAgICAgICAgICAgaWYgKGZvcmsuaWQgPT0gaW5SZXBlYXQgJiYgbm9kZVNpemUgPj0gMCkge1xuICAgICAgICAgICAgICAgIC8vIEV4Y2VwdCB0aGF0IHdlIHN0b3JlIHRoZSBjdXJyZW50IHN0YXRlIGFzIGEgdmFsaWQgcmV0dXJuXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUuXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNpemUgPSBzaXplO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGFydCA9IHN0YXJ0O1xuICAgICAgICAgICAgICAgIHJlc3VsdC5za2lwID0gc2tpcDtcbiAgICAgICAgICAgICAgICBza2lwICs9IDQ7XG4gICAgICAgICAgICAgICAgc2l6ZSArPSA0O1xuICAgICAgICAgICAgICAgIGZvcmsubmV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHN0YXJ0UG9zID0gZm9yay5wb3MgLSBub2RlU2l6ZTtcbiAgICAgICAgICAgIGlmIChub2RlU2l6ZSA8IDAgfHwgc3RhcnRQb3MgPCBtaW5Qb3MgfHwgZm9yay5zdGFydCA8IG1pblN0YXJ0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IGxvY2FsU2tpcHBlZCA9IGZvcmsuaWQgPj0gbWluUmVwZWF0VHlwZSA/IDQgOiAwO1xuICAgICAgICAgICAgbGV0IG5vZGVTdGFydCA9IGZvcmsuc3RhcnQ7XG4gICAgICAgICAgICBmb3JrLm5leHQoKTtcbiAgICAgICAgICAgIHdoaWxlIChmb3JrLnBvcyA+IHN0YXJ0UG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcmsuc2l6ZSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmsuc2l6ZSA9PSAtMyAvKiBTcGVjaWFsUmVjb3JkLkNvbnRleHRDaGFuZ2UgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFNraXBwZWQgKz0gNDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9yay5pZCA+PSBtaW5SZXBlYXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU2tpcHBlZCArPSA0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JrLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXJ0ID0gbm9kZVN0YXJ0O1xuICAgICAgICAgICAgc2l6ZSArPSBub2RlU2l6ZTtcbiAgICAgICAgICAgIHNraXAgKz0gbG9jYWxTa2lwcGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpblJlcGVhdCA8IDAgfHwgc2l6ZSA9PSBtYXhTaXplKSB7XG4gICAgICAgICAgICByZXN1bHQuc2l6ZSA9IHNpemU7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgICAgIHJlc3VsdC5za2lwID0gc2tpcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnNpemUgPiA0ID8gcmVzdWx0IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb3B5VG9CdWZmZXIoYnVmZmVyU3RhcnQsIGJ1ZmZlciwgaW5kZXgpIHtcbiAgICAgICAgbGV0IHsgaWQsIHN0YXJ0LCBlbmQsIHNpemUgfSA9IGN1cnNvcjtcbiAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgaWYgKHNpemUgPj0gMCAmJiBpZCA8IG1pblJlcGVhdFR5cGUpIHtcbiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICBpZiAoc2l6ZSA+IDQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kUG9zID0gY3Vyc29yLnBvcyAtIChzaXplIC0gNCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5wb3MgPiBlbmRQb3MpXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gY29weVRvQnVmZmVyKGJ1ZmZlclN0YXJ0LCBidWZmZXIsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlclstLWluZGV4XSA9IHN0YXJ0SW5kZXg7XG4gICAgICAgICAgICBidWZmZXJbLS1pbmRleF0gPSBlbmQgLSBidWZmZXJTdGFydDtcbiAgICAgICAgICAgIGJ1ZmZlclstLWluZGV4XSA9IHN0YXJ0IC0gYnVmZmVyU3RhcnQ7XG4gICAgICAgICAgICBidWZmZXJbLS1pbmRleF0gPSBpZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzaXplID09IC0zIC8qIFNwZWNpYWxSZWNvcmQuQ29udGV4dENoYW5nZSAqLykge1xuICAgICAgICAgICAgY29udGV4dEhhc2ggPSBpZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzaXplID09IC00IC8qIFNwZWNpYWxSZWNvcmQuTG9va0FoZWFkICovKSB7XG4gICAgICAgICAgICBsb29rQWhlYWQgPSBpZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIGxldCBjaGlsZHJlbiA9IFtdLCBwb3NpdGlvbnMgPSBbXTtcbiAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IDApXG4gICAgICAgIHRha2VOb2RlKGRhdGEuc3RhcnQgfHwgMCwgZGF0YS5idWZmZXJTdGFydCB8fCAwLCBjaGlsZHJlbiwgcG9zaXRpb25zLCAtMSwgMCk7XG4gICAgbGV0IGxlbmd0aCA9IChfYSA9IGRhdGEubGVuZ3RoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAoY2hpbGRyZW4ubGVuZ3RoID8gcG9zaXRpb25zWzBdICsgY2hpbGRyZW5bMF0ubGVuZ3RoIDogMCk7XG4gICAgcmV0dXJuIG5ldyBUcmVlKHR5cGVzW2RhdGEudG9wSURdLCBjaGlsZHJlbi5yZXZlcnNlKCksIHBvc2l0aW9ucy5yZXZlcnNlKCksIGxlbmd0aCk7XG59XG5jb25zdCBub2RlU2l6ZUNhY2hlID0gbmV3IFdlYWtNYXA7XG5mdW5jdGlvbiBub2RlU2l6ZShiYWxhbmNlVHlwZSwgbm9kZSkge1xuICAgIGlmICghYmFsYW5jZVR5cGUuaXNBbm9ueW1vdXMgfHwgbm9kZSBpbnN0YW5jZW9mIFRyZWVCdWZmZXIgfHwgbm9kZS50eXBlICE9IGJhbGFuY2VUeXBlKVxuICAgICAgICByZXR1cm4gMTtcbiAgICBsZXQgc2l6ZSA9IG5vZGVTaXplQ2FjaGUuZ2V0KG5vZGUpO1xuICAgIGlmIChzaXplID09IG51bGwpIHtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZC50eXBlICE9IGJhbGFuY2VUeXBlIHx8ICEoY2hpbGQgaW5zdGFuY2VvZiBUcmVlKSkge1xuICAgICAgICAgICAgICAgIHNpemUgPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2l6ZSArPSBub2RlU2l6ZShiYWxhbmNlVHlwZSwgY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVTaXplQ2FjaGUuc2V0KG5vZGUsIHNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cbmZ1bmN0aW9uIGJhbGFuY2VSYW5nZShcbi8vIFRoZSB0eXBlIHRoZSBiYWxhbmNlZCB0cmVlJ3MgaW5uZXIgbm9kZXMuXG5iYWxhbmNlVHlwZSwgXG4vLyBUaGUgZGlyZWN0IGNoaWxkcmVuIGFuZCB0aGVpciBwb3NpdGlvbnNcbmNoaWxkcmVuLCBwb3NpdGlvbnMsIFxuLy8gVGhlIGluZGV4IHJhbmdlIGluIGNoaWxkcmVuL3Bvc2l0aW9ucyB0byB1c2VcbmZyb20sIHRvLCBcbi8vIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbm9kZXMsIHJlbGF0aXZlIHRvIHRoZWlyIHBhcmVudC5cbnN0YXJ0LCBcbi8vIExlbmd0aCBvZiB0aGUgb3V0ZXIgbm9kZVxubGVuZ3RoLCBcbi8vIEZ1bmN0aW9uIHRvIGJ1aWxkIHRoZSB0b3Agbm9kZSBvZiB0aGUgYmFsYW5jZWQgdHJlZVxubWtUb3AsIFxuLy8gRnVuY3Rpb24gdG8gYnVpbGQgaW50ZXJuYWwgbm9kZXMgZm9yIHRoZSBiYWxhbmNlZCB0cmVlXG5ta1RyZWUpIHtcbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87IGkrKylcbiAgICAgICAgdG90YWwgKz0gbm9kZVNpemUoYmFsYW5jZVR5cGUsIGNoaWxkcmVuW2ldKTtcbiAgICBsZXQgbWF4Q2hpbGQgPSBNYXRoLmNlaWwoKHRvdGFsICogMS41KSAvIDggLyogQmFsYW5jZS5CcmFuY2hGYWN0b3IgKi8pO1xuICAgIGxldCBsb2NhbENoaWxkcmVuID0gW10sIGxvY2FsUG9zaXRpb25zID0gW107XG4gICAgZnVuY3Rpb24gZGl2aWRlKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGZyb20sIHRvLCBvZmZzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzspIHtcbiAgICAgICAgICAgIGxldCBncm91cEZyb20gPSBpLCBncm91cFN0YXJ0ID0gcG9zaXRpb25zW2ldLCBncm91cFNpemUgPSBub2RlU2l6ZShiYWxhbmNlVHlwZSwgY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgZm9yICg7IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRTaXplID0gbm9kZVNpemUoYmFsYW5jZVR5cGUsIGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBTaXplICsgbmV4dFNpemUgPj0gbWF4Q2hpbGQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGdyb3VwU2l6ZSArPSBuZXh0U2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID09IGdyb3VwRnJvbSArIDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBTaXplID4gbWF4Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9ubHkgPSBjaGlsZHJlbltncm91cEZyb21dOyAvLyBPbmx5IHRyZWVzIGNhbiBoYXZlIGEgc2l6ZSA+IDFcbiAgICAgICAgICAgICAgICAgICAgZGl2aWRlKG9ubHkuY2hpbGRyZW4sIG9ubHkucG9zaXRpb25zLCAwLCBvbmx5LmNoaWxkcmVuLmxlbmd0aCwgcG9zaXRpb25zW2dyb3VwRnJvbV0gKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9jYWxDaGlsZHJlbi5wdXNoKGNoaWxkcmVuW2dyb3VwRnJvbV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9uc1tpIC0gMV0gKyBjaGlsZHJlbltpIC0gMV0ubGVuZ3RoIC0gZ3JvdXBTdGFydDtcbiAgICAgICAgICAgICAgICBsb2NhbENoaWxkcmVuLnB1c2goYmFsYW5jZVJhbmdlKGJhbGFuY2VUeXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBncm91cEZyb20sIGksIGdyb3VwU3RhcnQsIGxlbmd0aCwgbnVsbCwgbWtUcmVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhbFBvc2l0aW9ucy5wdXNoKGdyb3VwU3RhcnQgKyBvZmZzZXQgLSBzdGFydCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGl2aWRlKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGZyb20sIHRvLCAwKTtcbiAgICByZXR1cm4gKG1rVG9wIHx8IG1rVHJlZSkobG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIGxlbmd0aCk7XG59XG4vKipcblByb3ZpZGVzIGEgd2F5IHRvIGFzc29jaWF0ZSB2YWx1ZXMgd2l0aCBwaWVjZXMgb2YgdHJlZXMuIEFzIGxvbmdcbmFzIHRoYXQgcGFydCBvZiB0aGUgdHJlZSBpcyByZXVzZWQsIHRoZSBhc3NvY2lhdGVkIHZhbHVlcyBjYW4gYmVcbnJldHJpZXZlZCBmcm9tIGFuIHVwZGF0ZWQgdHJlZS5cbiovXG5jbGFzcyBOb2RlV2Vha01hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICB9XG4gICAgc2V0QnVmZmVyKGJ1ZmZlciwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMubWFwLmdldChidWZmZXIpO1xuICAgICAgICBpZiAoIWlubmVyKVxuICAgICAgICAgICAgdGhpcy5tYXAuc2V0KGJ1ZmZlciwgaW5uZXIgPSBuZXcgTWFwKTtcbiAgICAgICAgaW5uZXIuc2V0KGluZGV4LCB2YWx1ZSk7XG4gICAgfVxuICAgIGdldEJ1ZmZlcihidWZmZXIsIGluZGV4KSB7XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMubWFwLmdldChidWZmZXIpO1xuICAgICAgICByZXR1cm4gaW5uZXIgJiYgaW5uZXIuZ2V0KGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2V0IHRoZSB2YWx1ZSBmb3IgdGhpcyBzeW50YXggbm9kZS5cbiAgICAqL1xuICAgIHNldChub2RlLCB2YWx1ZSkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEJ1ZmZlck5vZGUpXG4gICAgICAgICAgICB0aGlzLnNldEJ1ZmZlcihub2RlLmNvbnRleHQuYnVmZmVyLCBub2RlLmluZGV4LCB2YWx1ZSk7XG4gICAgICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUcmVlTm9kZSlcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChub2RlLnRyZWUsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmUgdmFsdWUgZm9yIHRoaXMgc3ludGF4IG5vZGUsIGlmIGl0IGV4aXN0cyBpbiB0aGUgbWFwLlxuICAgICovXG4gICAgZ2V0KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBCdWZmZXJOb2RlID8gdGhpcy5nZXRCdWZmZXIobm9kZS5jb250ZXh0LmJ1ZmZlciwgbm9kZS5pbmRleClcbiAgICAgICAgICAgIDogbm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlID8gdGhpcy5tYXAuZ2V0KG5vZGUudHJlZSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFNldCB0aGUgdmFsdWUgZm9yIHRoZSBub2RlIHRoYXQgYSBjdXJzb3IgY3VycmVudGx5IHBvaW50cyB0by5cbiAgICAqL1xuICAgIGN1cnNvclNldChjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIGlmIChjdXJzb3IuYnVmZmVyKVxuICAgICAgICAgICAgdGhpcy5zZXRCdWZmZXIoY3Vyc29yLmJ1ZmZlci5idWZmZXIsIGN1cnNvci5pbmRleCwgdmFsdWUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoY3Vyc29yLnRyZWUsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmUgdGhlIHZhbHVlIGZvciB0aGUgbm9kZSB0aGF0IGEgY3Vyc29yIGN1cnJlbnRseSBwb2ludHNcbiAgICB0by5cbiAgICAqL1xuICAgIGN1cnNvckdldChjdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIGN1cnNvci5idWZmZXIgPyB0aGlzLmdldEJ1ZmZlcihjdXJzb3IuYnVmZmVyLmJ1ZmZlciwgY3Vyc29yLmluZGV4KSA6IHRoaXMubWFwLmdldChjdXJzb3IudHJlZSk7XG4gICAgfVxufVxuXG4vKipcblRyZWUgZnJhZ21lbnRzIGFyZSB1c2VkIGR1cmluZyBbaW5jcmVtZW50YWxcbnBhcnNpbmddKCNjb21tb24uUGFyc2VyLnN0YXJ0UGFyc2UpIHRvIHRyYWNrIHBhcnRzIG9mIG9sZCB0cmVlc1xudGhhdCBjYW4gYmUgcmV1c2VkIGluIGEgbmV3IHBhcnNlLiBBbiBhcnJheSBvZiBmcmFnbWVudHMgaXMgdXNlZFxudG8gdHJhY2sgcmVnaW9ucyBvZiBhbiBvbGQgdHJlZSB3aG9zZSBub2RlcyBtaWdodCBiZSByZXVzZWQgaW4gbmV3XG5wYXJzZXMuIFVzZSB0aGUgc3RhdGljXG5bYGFwcGx5Q2hhbmdlc2BdKCNjb21tb24uVHJlZUZyYWdtZW50XmFwcGx5Q2hhbmdlcykgbWV0aG9kIHRvXG51cGRhdGUgZnJhZ21lbnRzIGZvciBkb2N1bWVudCBjaGFuZ2VzLlxuKi9cbmNsYXNzIFRyZWVGcmFnbWVudCB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgdHJlZSBmcmFnbWVudC4gWW91J2xsIHVzdWFsbHkgd2FudCB0byB1c2VcbiAgICBbYGFkZFRyZWVgXSgjY29tbW9uLlRyZWVGcmFnbWVudF5hZGRUcmVlKSBhbmRcbiAgICBbYGFwcGx5Q2hhbmdlc2BdKCNjb21tb24uVHJlZUZyYWdtZW50XmFwcGx5Q2hhbmdlcykgaW5zdGVhZCBvZlxuICAgIGNhbGxpbmcgdGhpcyBkaXJlY3RseS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgdW5jaGFuZ2VkIHJhbmdlIHBvaW50ZWQgdG8gYnkgdGhpcyBmcmFnbWVudC5cbiAgICBUaGlzIHJlZmVycyB0byBhbiBvZmZzZXQgaW4gdGhlIF91cGRhdGVkXyBkb2N1bWVudCAoYXMgb3Bwb3NlZFxuICAgIHRvIHRoZSBvcmlnaW5hbCB0cmVlKS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgb2YgdGhlIHVuY2hhbmdlZCByYW5nZS5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgdHJlZSB0aGF0IHRoaXMgZnJhZ21lbnQgaXMgYmFzZWQgb24uXG4gICAgKi9cbiAgICB0cmVlLCBcbiAgICAvKipcbiAgICBUaGUgb2Zmc2V0IGJldHdlZW4gdGhlIGZyYWdtZW50J3MgdHJlZSBhbmQgdGhlIGRvY3VtZW50IHRoYXRcbiAgICB0aGlzIGZyYWdtZW50IGNhbiBiZSB1c2VkIGFnYWluc3QuIEFkZCB0aGlzIHdoZW4gZ29pbmcgZnJvbVxuICAgIGRvY3VtZW50IHRvIHRyZWUgcG9zaXRpb25zLCBzdWJ0cmFjdCBpdCB0byBnbyBmcm9tIHRyZWUgdG9cbiAgICBkb2N1bWVudCBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBvZmZzZXQsIG9wZW5TdGFydCA9IGZhbHNlLCBvcGVuRW5kID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5vcGVuID0gKG9wZW5TdGFydCA/IDEgLyogT3Blbi5TdGFydCAqLyA6IDApIHwgKG9wZW5FbmQgPyAyIC8qIE9wZW4uRW5kICovIDogMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHN0YXJ0IG9mIHRoZSBmcmFnbWVudCByZXByZXNlbnRzIHRoZSBzdGFydCBvZiBhXG4gICAgcGFyc2UsIG9yIHRoZSBlbmQgb2YgYSBjaGFuZ2UuIChJbiB0aGUgc2Vjb25kIGNhc2UsIGl0IG1heSBub3RcbiAgICBiZSBzYWZlIHRvIHJldXNlIHNvbWUgbm9kZXMgYXQgdGhlIHN0YXJ0LCBkZXBlbmRpbmcgb24gdGhlXG4gICAgcGFyc2luZyBhbGdvcml0aG0uKVxuICAgICovXG4gICAgZ2V0IG9wZW5TdGFydCgpIHsgcmV0dXJuICh0aGlzLm9wZW4gJiAxIC8qIE9wZW4uU3RhcnQgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIGVuZCBvZiB0aGUgZnJhZ21lbnQgcmVwcmVzZW50cyB0aGUgZW5kIG9mIGFcbiAgICBmdWxsLWRvY3VtZW50IHBhcnNlLCBvciB0aGUgc3RhcnQgb2YgYSBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgb3BlbkVuZCgpIHsgcmV0dXJuICh0aGlzLm9wZW4gJiAyIC8qIE9wZW4uRW5kICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgb2YgZnJhZ21lbnRzIGZyb20gYSBmcmVzaGx5IHBhcnNlZCB0cmVlLCBvciB1cGRhdGVcbiAgICBhbiBleGlzdGluZyBzZXQgb2YgZnJhZ21lbnRzIGJ5IHJlcGxhY2luZyB0aGUgb25lcyB0aGF0IG92ZXJsYXBcbiAgICB3aXRoIGEgdHJlZSB3aXRoIGNvbnRlbnQgZnJvbSB0aGUgbmV3IHRyZWUuIFdoZW4gYHBhcnRpYWxgIGlzXG4gICAgdHJ1ZSwgdGhlIHBhcnNlIGlzIHRyZWF0ZWQgYXMgaW5jb21wbGV0ZSwgYW5kIHRoZSByZXN1bHRpbmdcbiAgICBmcmFnbWVudCBoYXMgW2BvcGVuRW5kYF0oI2NvbW1vbi5UcmVlRnJhZ21lbnQub3BlbkVuZCkgc2V0IHRvXG4gICAgdHJ1ZS5cbiAgICAqL1xuICAgIHN0YXRpYyBhZGRUcmVlKHRyZWUsIGZyYWdtZW50cyA9IFtdLCBwYXJ0aWFsID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtuZXcgVHJlZUZyYWdtZW50KDAsIHRyZWUubGVuZ3RoLCB0cmVlLCAwLCBmYWxzZSwgcGFydGlhbCldO1xuICAgICAgICBmb3IgKGxldCBmIG9mIGZyYWdtZW50cylcbiAgICAgICAgICAgIGlmIChmLnRvID4gdHJlZS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGx5IGEgc2V0IG9mIGVkaXRzIHRvIGFuIGFycmF5IG9mIGZyYWdtZW50cywgcmVtb3Zpbmcgb3JcbiAgICBzcGxpdHRpbmcgZnJhZ21lbnRzIGFzIG5lY2Vzc2FyeSB0byByZW1vdmUgZWRpdGVkIHJhbmdlcywgYW5kXG4gICAgYWRqdXN0aW5nIG9mZnNldHMgZm9yIGZyYWdtZW50cyB0aGF0IG1vdmVkLlxuICAgICovXG4gICAgc3RhdGljIGFwcGx5Q2hhbmdlcyhmcmFnbWVudHMsIGNoYW5nZXMsIG1pbkdhcCA9IDEyOCkge1xuICAgICAgICBpZiAoIWNoYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50cztcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgZkkgPSAxLCBuZXh0RiA9IGZyYWdtZW50cy5sZW5ndGggPyBmcmFnbWVudHNbMF0gOiBudWxsO1xuICAgICAgICBmb3IgKGxldCBjSSA9IDAsIHBvcyA9IDAsIG9mZiA9IDA7OyBjSSsrKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEMgPSBjSSA8IGNoYW5nZXMubGVuZ3RoID8gY2hhbmdlc1tjSV0gOiBudWxsO1xuICAgICAgICAgICAgbGV0IG5leHRQb3MgPSBuZXh0QyA/IG5leHRDLmZyb21BIDogMWU5O1xuICAgICAgICAgICAgaWYgKG5leHRQb3MgLSBwb3MgPj0gbWluR2FwKVxuICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0RiAmJiBuZXh0Ri5mcm9tIDwgbmV4dFBvcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3V0ID0gbmV4dEY7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gY3V0LmZyb20gfHwgbmV4dFBvcyA8PSBjdXQudG8gfHwgb2ZmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZkZyb20gPSBNYXRoLm1heChjdXQuZnJvbSwgcG9zKSAtIG9mZiwgZlRvID0gTWF0aC5taW4oY3V0LnRvLCBuZXh0UG9zKSAtIG9mZjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1dCA9IGZGcm9tID49IGZUbyA/IG51bGwgOiBuZXcgVHJlZUZyYWdtZW50KGZGcm9tLCBmVG8sIGN1dC50cmVlLCBjdXQub2Zmc2V0ICsgb2ZmLCBjSSA+IDAsICEhbmV4dEMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjdXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEYudG8gPiBuZXh0UG9zKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIG5leHRGID0gZkkgPCBmcmFnbWVudHMubGVuZ3RoID8gZnJhZ21lbnRzW2ZJKytdIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHRDKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcG9zID0gbmV4dEMudG9BO1xuICAgICAgICAgICAgb2ZmID0gbmV4dEMudG9BIC0gbmV4dEMudG9CO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG5BIHN1cGVyY2xhc3MgdGhhdCBwYXJzZXJzIHNob3VsZCBleHRlbmQuXG4qL1xuY2xhc3MgUGFyc2VyIHtcbiAgICAvKipcbiAgICBTdGFydCBhIHBhcnNlLCByZXR1cm5pbmcgYSBbcGFydGlhbCBwYXJzZV0oI2NvbW1vbi5QYXJ0aWFsUGFyc2UpXG4gICAgb2JqZWN0LiBbYGZyYWdtZW50c2BdKCNjb21tb24uVHJlZUZyYWdtZW50KSBjYW4gYmUgcGFzc2VkIGluIHRvXG4gICAgbWFrZSB0aGUgcGFyc2UgaW5jcmVtZW50YWwuXG4gICAgXG4gICAgQnkgZGVmYXVsdCwgdGhlIGVudGlyZSBpbnB1dCBpcyBwYXJzZWQuIFlvdSBjYW4gcGFzcyBgcmFuZ2VzYCxcbiAgICB3aGljaCBzaG91bGQgYmUgYSBzb3J0ZWQgYXJyYXkgb2Ygbm9uLWVtcHR5LCBub24tb3ZlcmxhcHBpbmdcbiAgICByYW5nZXMsIHRvIHBhcnNlIG9ubHkgdGhvc2UgcmFuZ2VzLiBUaGUgdHJlZSByZXR1cm5lZCBpbiB0aGF0XG4gICAgY2FzZSB3aWxsIHN0YXJ0IGF0IGByYW5nZXNbMF0uZnJvbWAuXG4gICAgKi9cbiAgICBzdGFydFBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICBpbnB1dCA9IG5ldyBTdHJpbmdJbnB1dChpbnB1dCk7XG4gICAgICAgIHJhbmdlcyA9ICFyYW5nZXMgPyBbbmV3IFJhbmdlKDAsIGlucHV0Lmxlbmd0aCldIDogcmFuZ2VzLmxlbmd0aCA/IHJhbmdlcy5tYXAociA9PiBuZXcgUmFuZ2Uoci5mcm9tLCByLnRvKSkgOiBbbmV3IFJhbmdlKDAsIDApXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cyB8fCBbXSwgcmFuZ2VzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUnVuIGEgZnVsbCBwYXJzZSwgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICAqL1xuICAgIHBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICBsZXQgcGFyc2UgPSB0aGlzLnN0YXJ0UGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGRvbmUgPSBwYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgICAgICBpZiAoZG9uZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9uZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFN0cmluZ0lucHV0IHtcbiAgICBjb25zdHJ1Y3RvcihzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnN0cmluZy5sZW5ndGg7IH1cbiAgICBjaHVuayhmcm9tKSB7IHJldHVybiB0aGlzLnN0cmluZy5zbGljZShmcm9tKTsgfVxuICAgIGdldCBsaW5lQ2h1bmtzKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICByZWFkKGZyb20sIHRvKSB7IHJldHVybiB0aGlzLnN0cmluZy5zbGljZShmcm9tLCB0byk7IH1cbn1cblxuLyoqXG5DcmVhdGUgYSBwYXJzZSB3cmFwcGVyIHRoYXQsIGFmdGVyIHRoZSBpbm5lciBwYXJzZSBjb21wbGV0ZXMsXG5zY2FucyBpdHMgdHJlZSBmb3IgbWl4ZWQgbGFuZ3VhZ2UgcmVnaW9ucyB3aXRoIHRoZSBgbmVzdGBcbmZ1bmN0aW9uLCBydW5zIHRoZSByZXN1bHRpbmcgW2lubmVyIHBhcnNlc10oI2NvbW1vbi5OZXN0ZWRQYXJzZSksXG5hbmQgdGhlbiBbbW91bnRzXSgjY29tbW9uLk5vZGVQcm9wXm1vdW50ZWQpIHRoZWlyIHJlc3VsdHMgb250byB0aGVcbnRyZWUuXG4qL1xuZnVuY3Rpb24gcGFyc2VNaXhlZChuZXN0KSB7XG4gICAgcmV0dXJuIChwYXJzZSwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSA9PiBuZXcgTWl4ZWRQYXJzZShwYXJzZSwgbmVzdCwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKTtcbn1cbmNsYXNzIElubmVyUGFyc2Uge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlciwgcGFyc2UsIG92ZXJsYXksIHRhcmdldCwgZnJvbSkge1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5wYXJzZSA9IHBhcnNlO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja1JhbmdlcyhyYW5nZXMpIHtcbiAgICBpZiAoIXJhbmdlcy5sZW5ndGggfHwgcmFuZ2VzLnNvbWUociA9PiByLmZyb20gPj0gci50bykpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbm5lciBwYXJzZSByYW5nZXMgZ2l2ZW46IFwiICsgSlNPTi5zdHJpbmdpZnkocmFuZ2VzKSk7XG59XG5jbGFzcyBBY3RpdmVPdmVybGF5IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIsIHByZWRpY2F0ZSwgbW91bnRzLCBpbmRleCwgc3RhcnQsIHRhcmdldCwgcHJldikge1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgICAgIHRoaXMubW91bnRzID0gbW91bnRzO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMucHJldiA9IHByZXY7XG4gICAgICAgIHRoaXMuZGVwdGggPSAwO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IFtdO1xuICAgIH1cbn1cbmNvbnN0IHN0b3BwZWRJbm5lciA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG5jbGFzcyBNaXhlZFBhcnNlIHtcbiAgICBjb25zdHJ1Y3RvcihiYXNlLCBuZXN0LCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy5uZXN0ID0gbmVzdDtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cztcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBbXTtcbiAgICAgICAgdGhpcy5pbm5lckRvbmUgPSAwO1xuICAgICAgICB0aGlzLmJhc2VUcmVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBudWxsO1xuICAgICAgICB0aGlzLmJhc2VQYXJzZSA9IGJhc2U7XG4gICAgfVxuICAgIGFkdmFuY2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VQYXJzZSkge1xuICAgICAgICAgICAgbGV0IGRvbmUgPSB0aGlzLmJhc2VQYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgICAgICBpZiAoIWRvbmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXJzZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmJhc2VUcmVlID0gZG9uZTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRJbm5lcigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5uZXIgb2YgdGhpcy5pbm5lcilcbiAgICAgICAgICAgICAgICAgICAgaW5uZXIucGFyc2Uuc3RvcEF0KHRoaXMuc3RvcHBlZEF0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbm5lckRvbmUgPT0gdGhpcy5pbm5lci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmJhc2VUcmVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRyZWUocmVzdWx0LnR5cGUsIHJlc3VsdC5jaGlsZHJlbiwgcmVzdWx0LnBvc2l0aW9ucywgcmVzdWx0Lmxlbmd0aCwgcmVzdWx0LnByb3BWYWx1ZXMuY29uY2F0KFtbc3RvcHBlZElubmVyLCB0aGlzLnN0b3BwZWRBdF1dKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbm5lciA9IHRoaXMuaW5uZXJbdGhpcy5pbm5lckRvbmVdLCBkb25lID0gaW5uZXIucGFyc2UuYWR2YW5jZSgpO1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgdGhpcy5pbm5lckRvbmUrKztcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzb21ld2hhdCBkb2RneSBidXQgc3VwZXIgaGVscGZ1bCBoYWNrIHdoZXJlIHdlXG4gICAgICAgICAgICAvLyBwYXRjaCB1cCBub2RlcyBjcmVhdGVkIGJ5IHRoZSBpbm5lciBwYXJzZSAoYW5kIHRodXNcbiAgICAgICAgICAgIC8vIHByZXN1bWFibHkgbm90IGFsaWFzZWQgYW55d2hlcmUgZWxzZSkgdG8gaG9sZCB0aGUgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIC8vIGFib3V0IHRoZSBpbm5lciBwYXJzZS5cbiAgICAgICAgICAgIGxldCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgaW5uZXIudGFyZ2V0LnByb3BzKTtcbiAgICAgICAgICAgIHByb3BzW05vZGVQcm9wLm1vdW50ZWQuaWRdID0gbmV3IE1vdW50ZWRUcmVlKGRvbmUsIGlubmVyLm92ZXJsYXksIGlubmVyLnBhcnNlcik7XG4gICAgICAgICAgICBpbm5lci50YXJnZXQucHJvcHMgPSBwcm9wcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZ2V0IHBhcnNlZFBvcygpIHtcbiAgICAgICAgaWYgKHRoaXMuYmFzZVBhcnNlKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBwb3MgPSB0aGlzLmlucHV0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5uZXJEb25lOyBpIDwgdGhpcy5pbm5lci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5uZXJbaV0uZnJvbSA8IHBvcylcbiAgICAgICAgICAgICAgICBwb3MgPSBNYXRoLm1pbihwb3MsIHRoaXMuaW5uZXJbaV0ucGFyc2UucGFyc2VkUG9zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICBzdG9wQXQocG9zKSB7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gcG9zO1xuICAgICAgICBpZiAodGhpcy5iYXNlUGFyc2UpXG4gICAgICAgICAgICB0aGlzLmJhc2VQYXJzZS5zdG9wQXQocG9zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5uZXJEb25lOyBpIDwgdGhpcy5pbm5lci5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB0aGlzLmlubmVyW2ldLnBhcnNlLnN0b3BBdChwb3MpO1xuICAgIH1cbiAgICBzdGFydElubmVyKCkge1xuICAgICAgICBsZXQgZnJhZ21lbnRDdXJzb3IgPSBuZXcgRnJhZ21lbnRDdXJzb3IodGhpcy5mcmFnbWVudHMpO1xuICAgICAgICBsZXQgb3ZlcmxheSA9IG51bGw7XG4gICAgICAgIGxldCBjb3ZlcmVkID0gbnVsbDtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBUcmVlQ3Vyc29yKG5ldyBUcmVlTm9kZSh0aGlzLmJhc2VUcmVlLCB0aGlzLnJhbmdlc1swXS5mcm9tLCAwLCBudWxsKSwgSXRlck1vZGUuSW5jbHVkZUFub255bW91cyB8IEl0ZXJNb2RlLklnbm9yZU1vdW50cyk7XG4gICAgICAgIHNjYW46IGZvciAobGV0IG5lc3QsIGlzQ292ZXJlZDs7KSB7XG4gICAgICAgICAgICBsZXQgZW50ZXIgPSB0cnVlLCByYW5nZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3BwZWRBdCAhPSBudWxsICYmIGN1cnNvci5mcm9tID49IHRoaXMuc3RvcHBlZEF0KSB7XG4gICAgICAgICAgICAgICAgZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZyYWdtZW50Q3Vyc29yLmhhc05vZGUoY3Vyc29yKSkge1xuICAgICAgICAgICAgICAgIGlmIChvdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IG92ZXJsYXkubW91bnRzLmZpbmQobSA9PiBtLmZyYWcuZnJvbSA8PSBjdXJzb3IuZnJvbSAmJiBtLmZyYWcudG8gPj0gY3Vyc29yLnRvICYmIG0ubW91bnQub3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgbWF0Y2gubW91bnQub3ZlcmxheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcm9tID0gci5mcm9tICsgbWF0Y2gucG9zLCB0byA9IHIudG8gKyBtYXRjaC5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20gPj0gY3Vyc29yLmZyb20gJiYgdG8gPD0gY3Vyc29yLnRvICYmICFvdmVybGF5LnJhbmdlcy5zb21lKHIgPT4gci5mcm9tIDwgdG8gJiYgci50byA+IGZyb20pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LnJhbmdlcy5wdXNoKHsgZnJvbSwgdG8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVudGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb3ZlcmVkICYmIChpc0NvdmVyZWQgPSBjaGVja0NvdmVyKGNvdmVyZWQucmFuZ2VzLCBjdXJzb3IuZnJvbSwgY3Vyc29yLnRvKSkpIHtcbiAgICAgICAgICAgICAgICBlbnRlciA9IGlzQ292ZXJlZCAhPSAyIC8qIENvdmVyLkZ1bGwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghY3Vyc29yLnR5cGUuaXNBbm9ueW1vdXMgJiYgKG5lc3QgPSB0aGlzLm5lc3QoY3Vyc29yLCB0aGlzLmlucHV0KSkgJiZcbiAgICAgICAgICAgICAgICAoY3Vyc29yLmZyb20gPCBjdXJzb3IudG8gfHwgIW5lc3Qub3ZlcmxheSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci50cmVlKVxuICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbGl6ZShjdXJzb3IpO1xuICAgICAgICAgICAgICAgIGxldCBvbGRNb3VudHMgPSBmcmFnbWVudEN1cnNvci5maW5kTW91bnRzKGN1cnNvci5mcm9tLCBuZXN0LnBhcnNlcik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXN0Lm92ZXJsYXkgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXkgPSBuZXcgQWN0aXZlT3ZlcmxheShuZXN0LnBhcnNlciwgbmVzdC5vdmVybGF5LCBvbGRNb3VudHMsIHRoaXMuaW5uZXIubGVuZ3RoLCBjdXJzb3IuZnJvbSwgY3Vyc29yLnRyZWUsIG92ZXJsYXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHB1bmNoUmFuZ2VzKHRoaXMucmFuZ2VzLCBuZXN0Lm92ZXJsYXkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChjdXJzb3IuZnJvbSA8IGN1cnNvci50byA/IFtuZXcgUmFuZ2UoY3Vyc29yLmZyb20sIGN1cnNvci50byldIDogW10pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1JhbmdlcyhyYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCB8fCAhbmVzdC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbm5lci5wdXNoKG5ldyBJbm5lclBhcnNlKG5lc3QucGFyc2VyLCByYW5nZXMubGVuZ3RoID8gbmVzdC5wYXJzZXIuc3RhcnRQYXJzZSh0aGlzLmlucHV0LCBlbnRlckZyYWdtZW50cyhvbGRNb3VudHMsIHJhbmdlcyksIHJhbmdlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5lc3QucGFyc2VyLnN0YXJ0UGFyc2UoXCJcIiksIG5lc3Qub3ZlcmxheSA/IG5lc3Qub3ZlcmxheS5tYXAociA9PiBuZXcgUmFuZ2Uoci5mcm9tIC0gY3Vyc29yLmZyb20sIHIudG8gLSBjdXJzb3IuZnJvbSkpIDogbnVsbCwgY3Vyc29yLnRyZWUsIHJhbmdlcy5sZW5ndGggPyByYW5nZXNbMF0uZnJvbSA6IGN1cnNvci5mcm9tKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmVzdC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyZWQgPSB7IHJhbmdlcywgZGVwdGg6IDAsIHByZXY6IGNvdmVyZWQgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvdmVybGF5ICYmIChyYW5nZSA9IG92ZXJsYXkucHJlZGljYXRlKGN1cnNvcikpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlID09PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IG5ldyBSYW5nZShjdXJzb3IuZnJvbSwgY3Vyc29yLnRvKTtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZnJvbSA8IHJhbmdlLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gb3ZlcmxheS5yYW5nZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgPj0gMCAmJiBvdmVybGF5LnJhbmdlc1tsYXN0XS50byA9PSByYW5nZS5mcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS5yYW5nZXNbbGFzdF0gPSB7IGZyb206IG92ZXJsYXkucmFuZ2VzW2xhc3RdLmZyb20sIHRvOiByYW5nZS50byB9O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LnJhbmdlcy5wdXNoKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW50ZXIgJiYgY3Vyc29yLmZpcnN0Q2hpbGQoKSkge1xuICAgICAgICAgICAgICAgIGlmIChvdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5LmRlcHRoKys7XG4gICAgICAgICAgICAgICAgaWYgKGNvdmVyZWQpXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyZWQuZGVwdGgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLnBhcmVudCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2NhbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJsYXkgJiYgIS0tb3ZlcmxheS5kZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHB1bmNoUmFuZ2VzKHRoaXMucmFuZ2VzLCBvdmVybGF5LnJhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUmFuZ2VzKHJhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbm5lci5zcGxpY2Uob3ZlcmxheS5pbmRleCwgMCwgbmV3IElubmVyUGFyc2Uob3ZlcmxheS5wYXJzZXIsIG92ZXJsYXkucGFyc2VyLnN0YXJ0UGFyc2UodGhpcy5pbnB1dCwgZW50ZXJGcmFnbWVudHMob3ZlcmxheS5tb3VudHMsIHJhbmdlcyksIHJhbmdlcyksIG92ZXJsYXkucmFuZ2VzLm1hcChyID0+IG5ldyBSYW5nZShyLmZyb20gLSBvdmVybGF5LnN0YXJ0LCByLnRvIC0gb3ZlcmxheS5zdGFydCkpLCBvdmVybGF5LnRhcmdldCwgcmFuZ2VzWzBdLmZyb20pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXkgPSBvdmVybGF5LnByZXY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdmVyZWQgJiYgIS0tY292ZXJlZC5kZXB0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyZWQgPSBjb3ZlcmVkLnByZXY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tDb3Zlcihjb3ZlcmVkLCBmcm9tLCB0bykge1xuICAgIGZvciAobGV0IHJhbmdlIG9mIGNvdmVyZWQpIHtcbiAgICAgICAgaWYgKHJhbmdlLmZyb20gPj0gdG8pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHJhbmdlLnRvID4gZnJvbSlcbiAgICAgICAgICAgIHJldHVybiByYW5nZS5mcm9tIDw9IGZyb20gJiYgcmFuZ2UudG8gPj0gdG8gPyAyIC8qIENvdmVyLkZ1bGwgKi8gOiAxIC8qIENvdmVyLlBhcnRpYWwgKi87XG4gICAgfVxuICAgIHJldHVybiAwIC8qIENvdmVyLk5vbmUgKi87XG59XG4vLyBUYWtlIGEgcGllY2Ugb2YgYnVmZmVyIGFuZCBjb252ZXJ0IGl0IGludG8gYSBzdGFuZC1hbG9uZVxuLy8gVHJlZUJ1ZmZlci5cbmZ1bmN0aW9uIHNsaWNlQnVmKGJ1Ziwgc3RhcnRJLCBlbmRJLCBub2RlcywgcG9zaXRpb25zLCBvZmYpIHtcbiAgICBpZiAoc3RhcnRJIDwgZW5kSSkge1xuICAgICAgICBsZXQgZnJvbSA9IGJ1Zi5idWZmZXJbc3RhcnRJICsgMV07XG4gICAgICAgIG5vZGVzLnB1c2goYnVmLnNsaWNlKHN0YXJ0SSwgZW5kSSwgZnJvbSkpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChmcm9tIC0gb2ZmKTtcbiAgICB9XG59XG4vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgbm9kZSB0aGF0J3MgaW4gYSBidWZmZXIsIGFuZCBjb252ZXJ0cyBpdCwgYW5kXG4vLyBpdHMgcGFyZW50IGJ1ZmZlciBub2RlcywgaW50byBhIFRyZWUuIFRoaXMgaXMgYWdhaW4gYWN0aW5nIG9uIHRoZVxuLy8gYXNzdW1wdGlvbiB0aGF0IHRoZSB0cmVlcyBhbmQgYnVmZmVycyBoYXZlIGJlZW4gY29uc3RydWN0ZWQgYnkgdGhlXG4vLyBwYXJzZSB0aGF0IHdhcyByYW4gdmlhIHRoZSBtaXggcGFyc2VyLCBhbmQgdGh1cyBhcmVuJ3Qgc2hhcmVkIHdpdGhcbi8vIGFueSBvdGhlciBjb2RlLCBtYWtpbmcgdmlvbGF0aW9ucyBvZiB0aGUgaW1tdXRhYmlsaXR5IHNhZmUuXG5mdW5jdGlvbiBtYXRlcmlhbGl6ZShjdXJzb3IpIHtcbiAgICBsZXQgeyBub2RlIH0gPSBjdXJzb3IsIHN0YWNrID0gW107XG4gICAgbGV0IGJ1ZmZlciA9IG5vZGUuY29udGV4dC5idWZmZXI7XG4gICAgLy8gU2NhbiB1cCB0byB0aGUgbmVhcmVzdCB0cmVlXG4gICAgZG8ge1xuICAgICAgICBzdGFjay5wdXNoKGN1cnNvci5pbmRleCk7XG4gICAgICAgIGN1cnNvci5wYXJlbnQoKTtcbiAgICB9IHdoaWxlICghY3Vyc29yLnRyZWUpO1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBidWZmZXIgaW4gdGhhdCB0cmVlXG4gICAgbGV0IGJhc2UgPSBjdXJzb3IudHJlZSwgaSA9IGJhc2UuY2hpbGRyZW4uaW5kZXhPZihidWZmZXIpO1xuICAgIGxldCBidWYgPSBiYXNlLmNoaWxkcmVuW2ldLCBiID0gYnVmLmJ1ZmZlciwgbmV3U3RhY2sgPSBbaV07XG4gICAgLy8gU3BsaXQgYSBsZXZlbCBpbiB0aGUgYnVmZmVyLCBwdXR0aW5nIHRoZSBub2RlcyBiZWZvcmUgYW5kIGFmdGVyXG4gICAgLy8gdGhlIGNoaWxkIHRoYXQgY29udGFpbnMgYG5vZGVgIGludG8gbmV3IGJ1ZmZlcnMuXG4gICAgZnVuY3Rpb24gc3BsaXQoc3RhcnRJLCBlbmRJLCB0eXBlLCBpbm5lck9mZnNldCwgbGVuZ3RoLCBzdGFja1Bvcykge1xuICAgICAgICBsZXQgdGFyZ2V0SSA9IHN0YWNrW3N0YWNrUG9zXTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gW10sIHBvc2l0aW9ucyA9IFtdO1xuICAgICAgICBzbGljZUJ1ZihidWYsIHN0YXJ0SSwgdGFyZ2V0SSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgaW5uZXJPZmZzZXQpO1xuICAgICAgICBsZXQgZnJvbSA9IGJbdGFyZ2V0SSArIDFdLCB0byA9IGJbdGFyZ2V0SSArIDJdO1xuICAgICAgICBuZXdTdGFjay5wdXNoKGNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIGxldCBjaGlsZCA9IHN0YWNrUG9zXG4gICAgICAgICAgICA/IHNwbGl0KHRhcmdldEkgKyA0LCBiW3RhcmdldEkgKyAzXSwgYnVmLnNldC50eXBlc1tiW3RhcmdldEldXSwgZnJvbSwgdG8gLSBmcm9tLCBzdGFja1BvcyAtIDEpXG4gICAgICAgICAgICA6IG5vZGUudG9UcmVlKCk7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChmcm9tIC0gaW5uZXJPZmZzZXQpO1xuICAgICAgICBzbGljZUJ1ZihidWYsIGJbdGFyZ2V0SSArIDNdLCBlbmRJLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBpbm5lck9mZnNldCk7XG4gICAgICAgIHJldHVybiBuZXcgVHJlZSh0eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpO1xuICAgIH1cbiAgICBiYXNlLmNoaWxkcmVuW2ldID0gc3BsaXQoMCwgYi5sZW5ndGgsIE5vZGVUeXBlLm5vbmUsIDAsIGJ1Zi5sZW5ndGgsIHN0YWNrLmxlbmd0aCAtIDEpO1xuICAgIC8vIE1vdmUgdGhlIGN1cnNvciBiYWNrIHRvIHRoZSB0YXJnZXQgbm9kZVxuICAgIGZvciAobGV0IGluZGV4IG9mIG5ld1N0YWNrKSB7XG4gICAgICAgIGxldCB0cmVlID0gY3Vyc29yLnRyZWUuY2hpbGRyZW5baW5kZXhdLCBwb3MgPSBjdXJzb3IudHJlZS5wb3NpdGlvbnNbaW5kZXhdO1xuICAgICAgICBjdXJzb3IueWllbGQobmV3IFRyZWVOb2RlKHRyZWUsIHBvcyArIGN1cnNvci5mcm9tLCBpbmRleCwgY3Vyc29yLl90cmVlKSk7XG4gICAgfVxufVxuY2xhc3MgU3RydWN0dXJlQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3Rvcihyb290LCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnNvciA9IHJvb3QuY3Vyc29yKEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMgfCBJdGVyTW9kZS5JZ25vcmVNb3VudHMpO1xuICAgIH1cbiAgICAvLyBNb3ZlIHRvIHRoZSBmaXJzdCBub2RlIChpbiBwcmUtb3JkZXIpIHRoYXQgc3RhcnRzIGF0IG9yIGFmdGVyIGBwb3NgLlxuICAgIG1vdmVUbyhwb3MpIHtcbiAgICAgICAgbGV0IHsgY3Vyc29yIH0gPSB0aGlzLCBwID0gcG9zIC0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIHdoaWxlICghdGhpcy5kb25lICYmIGN1cnNvci5mcm9tIDwgcCkge1xuICAgICAgICAgICAgaWYgKGN1cnNvci50byA+PSBwb3MgJiYgY3Vyc29yLmVudGVyKHAsIDEsIEl0ZXJNb2RlLklnbm9yZU92ZXJsYXlzIHwgSXRlck1vZGUuRXhjbHVkZUJ1ZmZlcnMpKSA7XG4gICAgICAgICAgICBlbHNlIGlmICghY3Vyc29yLm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFzTm9kZShjdXJzb3IpIHtcbiAgICAgICAgdGhpcy5tb3ZlVG8oY3Vyc29yLmZyb20pO1xuICAgICAgICBpZiAoIXRoaXMuZG9uZSAmJiB0aGlzLmN1cnNvci5mcm9tICsgdGhpcy5vZmZzZXQgPT0gY3Vyc29yLmZyb20gJiYgdGhpcy5jdXJzb3IudHJlZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgdHJlZSA9IHRoaXMuY3Vyc29yLnRyZWU7Oykge1xuICAgICAgICAgICAgICAgIGlmICh0cmVlID09IGN1cnNvci50cmVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHJlZS5jaGlsZHJlbi5sZW5ndGggJiYgdHJlZS5wb3NpdGlvbnNbMF0gPT0gMCAmJiB0cmVlLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgVHJlZSlcbiAgICAgICAgICAgICAgICAgICAgdHJlZSA9IHRyZWUuY2hpbGRyZW5bMF07XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuY2xhc3MgRnJhZ21lbnRDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGZyYWdtZW50cykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLmN1clRvID0gMDtcbiAgICAgICAgdGhpcy5mcmFnSSA9IDA7XG4gICAgICAgIGlmIChmcmFnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0aGlzLmN1ckZyYWcgPSBmcmFnbWVudHNbMF07XG4gICAgICAgICAgICB0aGlzLmN1clRvID0gKF9hID0gZmlyc3QudHJlZS5wcm9wKHN0b3BwZWRJbm5lcikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZpcnN0LnRvO1xuICAgICAgICAgICAgdGhpcy5pbm5lciA9IG5ldyBTdHJ1Y3R1cmVDdXJzb3IoZmlyc3QudHJlZSwgLWZpcnN0Lm9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1ckZyYWcgPSB0aGlzLmlubmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNOb2RlKG5vZGUpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VyRnJhZyAmJiBub2RlLmZyb20gPj0gdGhpcy5jdXJUbylcbiAgICAgICAgICAgIHRoaXMubmV4dEZyYWcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyRnJhZyAmJiB0aGlzLmN1ckZyYWcuZnJvbSA8PSBub2RlLmZyb20gJiYgdGhpcy5jdXJUbyA+PSBub2RlLnRvICYmIHRoaXMuaW5uZXIuaGFzTm9kZShub2RlKTtcbiAgICB9XG4gICAgbmV4dEZyYWcoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5mcmFnSSsrO1xuICAgICAgICBpZiAodGhpcy5mcmFnSSA9PSB0aGlzLmZyYWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyRnJhZyA9IHRoaXMuaW5uZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZyYWcgPSB0aGlzLmN1ckZyYWcgPSB0aGlzLmZyYWdtZW50c1t0aGlzLmZyYWdJXTtcbiAgICAgICAgICAgIHRoaXMuY3VyVG8gPSAoX2EgPSBmcmFnLnRyZWUucHJvcChzdG9wcGVkSW5uZXIpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmcmFnLnRvO1xuICAgICAgICAgICAgdGhpcy5pbm5lciA9IG5ldyBTdHJ1Y3R1cmVDdXJzb3IoZnJhZy50cmVlLCAtZnJhZy5vZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmRNb3VudHMocG9zLCBwYXJzZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICh0aGlzLmlubmVyKSB7XG4gICAgICAgICAgICB0aGlzLmlubmVyLmN1cnNvci5tb3ZlVG8ocG9zLCAxKTtcbiAgICAgICAgICAgIGZvciAobGV0IHBvcyA9IHRoaXMuaW5uZXIuY3Vyc29yLm5vZGU7IHBvczsgcG9zID0gcG9zLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGxldCBtb3VudCA9IChfYSA9IHBvcy50cmVlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucHJvcChOb2RlUHJvcC5tb3VudGVkKTtcbiAgICAgICAgICAgICAgICBpZiAobW91bnQgJiYgbW91bnQucGFyc2VyID09IHBhcnNlcikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5mcmFnSTsgaSA8IHRoaXMuZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZnJhZyA9IHRoaXMuZnJhZ21lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYWcuZnJvbSA+PSBwb3MudG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhZy50cmVlID09IHRoaXMuY3VyRnJhZy50cmVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiBwb3MuZnJvbSAtIGZyYWcub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gcHVuY2hSYW5nZXMob3V0ZXIsIHJhbmdlcykge1xuICAgIGxldCBjb3B5ID0gbnVsbCwgY3VycmVudCA9IHJhbmdlcztcbiAgICBmb3IgKGxldCBpID0gMSwgaiA9IDA7IGkgPCBvdXRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZ2FwRnJvbSA9IG91dGVyW2kgLSAxXS50bywgZ2FwVG8gPSBvdXRlcltpXS5mcm9tO1xuICAgICAgICBmb3IgKDsgaiA8IGN1cnJlbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGxldCByID0gY3VycmVudFtqXTtcbiAgICAgICAgICAgIGlmIChyLmZyb20gPj0gZ2FwVG8pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoci50byA8PSBnYXBGcm9tKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFjb3B5KVxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjb3B5ID0gcmFuZ2VzLnNsaWNlKCk7XG4gICAgICAgICAgICBpZiAoci5mcm9tIDwgZ2FwRnJvbSkge1xuICAgICAgICAgICAgICAgIGNvcHlbal0gPSBuZXcgUmFuZ2Uoci5mcm9tLCBnYXBGcm9tKTtcbiAgICAgICAgICAgICAgICBpZiAoci50byA+IGdhcFRvKVxuICAgICAgICAgICAgICAgICAgICBjb3B5LnNwbGljZShqICsgMSwgMCwgbmV3IFJhbmdlKGdhcFRvLCByLnRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyLnRvID4gZ2FwVG8pIHtcbiAgICAgICAgICAgICAgICBjb3B5W2otLV0gPSBuZXcgUmFuZ2UoZ2FwVG8sIHIudG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29weS5zcGxpY2Uoai0tLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbn1cbmZ1bmN0aW9uIGZpbmRDb3ZlckNoYW5nZXMoYSwgYiwgZnJvbSwgdG8pIHtcbiAgICBsZXQgaUEgPSAwLCBpQiA9IDAsIGluQSA9IGZhbHNlLCBpbkIgPSBmYWxzZSwgcG9zID0gLTFlOTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yICg7Oykge1xuICAgICAgICBsZXQgbmV4dEEgPSBpQSA9PSBhLmxlbmd0aCA/IDFlOSA6IGluQSA/IGFbaUFdLnRvIDogYVtpQV0uZnJvbTtcbiAgICAgICAgbGV0IG5leHRCID0gaUIgPT0gYi5sZW5ndGggPyAxZTkgOiBpbkIgPyBiW2lCXS50byA6IGJbaUJdLmZyb207XG4gICAgICAgIGlmIChpbkEgIT0gaW5CKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBNYXRoLm1heChwb3MsIGZyb20pLCBlbmQgPSBNYXRoLm1pbihuZXh0QSwgbmV4dEIsIHRvKTtcbiAgICAgICAgICAgIGlmIChzdGFydCA8IGVuZClcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgUmFuZ2Uoc3RhcnQsIGVuZCkpO1xuICAgICAgICB9XG4gICAgICAgIHBvcyA9IE1hdGgubWluKG5leHRBLCBuZXh0Qik7XG4gICAgICAgIGlmIChwb3MgPT0gMWU5KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmIChuZXh0QSA9PSBwb3MpIHtcbiAgICAgICAgICAgIGlmICghaW5BKVxuICAgICAgICAgICAgICAgIGluQSA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbkEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpQSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0QiA9PSBwb3MpIHtcbiAgICAgICAgICAgIGlmICghaW5CKVxuICAgICAgICAgICAgICAgIGluQiA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbkIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpQisrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyBHaXZlbiBhIG51bWJlciBvZiBmcmFnbWVudHMgZm9yIHRoZSBvdXRlciB0cmVlLCBhbmQgYSBzZXQgb2YgcmFuZ2VzXG4vLyB0byBwYXJzZSwgZmluZCBmcmFnbWVudHMgZm9yIGlubmVyIHRyZWVzIG1vdW50ZWQgYXJvdW5kIHRob3NlXG4vLyByYW5nZXMsIGlmIGFueS5cbmZ1bmN0aW9uIGVudGVyRnJhZ21lbnRzKG1vdW50cywgcmFuZ2VzKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IHsgcG9zLCBtb3VudCwgZnJhZyB9IG9mIG1vdW50cykge1xuICAgICAgICBsZXQgc3RhcnRQb3MgPSBwb3MgKyAobW91bnQub3ZlcmxheSA/IG1vdW50Lm92ZXJsYXlbMF0uZnJvbSA6IDApLCBlbmRQb3MgPSBzdGFydFBvcyArIG1vdW50LnRyZWUubGVuZ3RoO1xuICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWF4KGZyYWcuZnJvbSwgc3RhcnRQb3MpLCB0byA9IE1hdGgubWluKGZyYWcudG8sIGVuZFBvcyk7XG4gICAgICAgIGlmIChtb3VudC5vdmVybGF5KSB7XG4gICAgICAgICAgICBsZXQgb3ZlcmxheSA9IG1vdW50Lm92ZXJsYXkubWFwKHIgPT4gbmV3IFJhbmdlKHIuZnJvbSArIHBvcywgci50byArIHBvcykpO1xuICAgICAgICAgICAgbGV0IGNoYW5nZXMgPSBmaW5kQ292ZXJDaGFuZ2VzKHJhbmdlcywgb3ZlcmxheSwgZnJvbSwgdG8pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IGZyb207OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGkgPT0gY2hhbmdlcy5sZW5ndGgsIGVuZCA9IGxhc3QgPyB0byA6IGNoYW5nZXNbaV0uZnJvbTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgVHJlZUZyYWdtZW50KHBvcywgZW5kLCBtb3VudC50cmVlLCAtc3RhcnRQb3MsIGZyYWcuZnJvbSA+PSBwb3MgfHwgZnJhZy5vcGVuU3RhcnQsIGZyYWcudG8gPD0gZW5kIHx8IGZyYWcub3BlbkVuZCkpO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBwb3MgPSBjaGFuZ2VzW2ldLnRvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFRyZWVGcmFnbWVudChmcm9tLCB0bywgbW91bnQudHJlZSwgLXN0YXJ0UG9zLCBmcmFnLmZyb20gPj0gc3RhcnRQb3MgfHwgZnJhZy5vcGVuU3RhcnQsIGZyYWcudG8gPD0gZW5kUG9zIHx8IGZyYWcub3BlbkVuZCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCB7IERlZmF1bHRCdWZmZXJMZW5ndGgsIEl0ZXJNb2RlLCBNb3VudGVkVHJlZSwgTm9kZVByb3AsIE5vZGVTZXQsIE5vZGVUeXBlLCBOb2RlV2Vha01hcCwgUGFyc2VyLCBUcmVlLCBUcmVlQnVmZmVyLCBUcmVlQ3Vyc29yLCBUcmVlRnJhZ21lbnQsIHBhcnNlTWl4ZWQgfTtcbiIsICIvKipcblRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgZG9jdW1lbnRzLiBAbm9uYWJzdHJhY3RcbiovXG5jbGFzcyBUZXh0IHtcbiAgICAvKipcbiAgICBHZXQgdGhlIGxpbmUgZGVzY3JpcHRpb24gYXJvdW5kIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGxpbmVBdChwb3MpIHtcbiAgICAgICAgaWYgKHBvcyA8IDAgfHwgcG9zID4gdGhpcy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBwb3NpdGlvbiAke3Bvc30gaW4gZG9jdW1lbnQgb2YgbGVuZ3RoICR7dGhpcy5sZW5ndGh9YCk7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVJbm5lcihwb3MsIGZhbHNlLCAxLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGdpdmVuICgxLWJhc2VkKSBsaW5lIG51bWJlci5cbiAgICAqL1xuICAgIGxpbmUobikge1xuICAgICAgICBpZiAobiA8IDEgfHwgbiA+IHRoaXMubGluZXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBsaW5lIG51bWJlciAke259IGluICR7dGhpcy5saW5lc30tbGluZSBkb2N1bWVudGApO1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lSW5uZXIobiwgdHJ1ZSwgMSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgYSByYW5nZSBvZiB0aGUgdGV4dCB3aXRoIHRoZSBnaXZlbiBjb250ZW50LlxuICAgICovXG4gICAgcmVwbGFjZShmcm9tLCB0bywgdGV4dCkge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgICAgICB0aGlzLmRlY29tcG9zZSgwLCBmcm9tLCBwYXJ0cywgMiAvKiBPcGVuLlRvICovKTtcbiAgICAgICAgaWYgKHRleHQubGVuZ3RoKVxuICAgICAgICAgICAgdGV4dC5kZWNvbXBvc2UoMCwgdGV4dC5sZW5ndGgsIHBhcnRzLCAxIC8qIE9wZW4uRnJvbSAqLyB8IDIgLyogT3Blbi5UbyAqLyk7XG4gICAgICAgIHRoaXMuZGVjb21wb3NlKHRvLCB0aGlzLmxlbmd0aCwgcGFydHMsIDEgLyogT3Blbi5Gcm9tICovKTtcbiAgICAgICAgcmV0dXJuIFRleHROb2RlLmZyb20ocGFydHMsIHRoaXMubGVuZ3RoIC0gKHRvIC0gZnJvbSkgKyB0ZXh0Lmxlbmd0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGVuZCBhbm90aGVyIGRvY3VtZW50IHRvIHRoaXMgb25lLlxuICAgICovXG4gICAgYXBwZW5kKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UodGhpcy5sZW5ndGgsIHRoaXMubGVuZ3RoLCBvdGhlcik7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlIHRoZSB0ZXh0IGJldHdlZW4gdGhlIGdpdmVuIHBvaW50cy5cbiAgICAqL1xuICAgIHNsaWNlKGZyb20sIHRvID0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBsZXQgcGFydHMgPSBbXTtcbiAgICAgICAgdGhpcy5kZWNvbXBvc2UoZnJvbSwgdG8sIHBhcnRzLCAwKTtcbiAgICAgICAgcmV0dXJuIFRleHROb2RlLmZyb20ocGFydHMsIHRvIC0gZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGlzIHRleHQgaXMgZXF1YWwgdG8gYW5vdGhlciBpbnN0YW5jZS5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciA9PSB0aGlzKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvdGhlci5sZW5ndGggIT0gdGhpcy5sZW5ndGggfHwgb3RoZXIubGluZXMgIT0gdGhpcy5saW5lcylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zY2FuSWRlbnRpY2FsKG90aGVyLCAxKSwgZW5kID0gdGhpcy5sZW5ndGggLSB0aGlzLnNjYW5JZGVudGljYWwob3RoZXIsIC0xKTtcbiAgICAgICAgbGV0IGEgPSBuZXcgUmF3VGV4dEN1cnNvcih0aGlzKSwgYiA9IG5ldyBSYXdUZXh0Q3Vyc29yKG90aGVyKTtcbiAgICAgICAgZm9yIChsZXQgc2tpcCA9IHN0YXJ0LCBwb3MgPSBzdGFydDs7KSB7XG4gICAgICAgICAgICBhLm5leHQoc2tpcCk7XG4gICAgICAgICAgICBiLm5leHQoc2tpcCk7XG4gICAgICAgICAgICBza2lwID0gMDtcbiAgICAgICAgICAgIGlmIChhLmxpbmVCcmVhayAhPSBiLmxpbmVCcmVhayB8fCBhLmRvbmUgIT0gYi5kb25lIHx8IGEudmFsdWUgIT0gYi52YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBwb3MgKz0gYS52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoYS5kb25lIHx8IHBvcyA+PSBlbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSB0ZXh0LiBXaGVuIGBkaXJgIGlzIGAtMWAsIGl0ZXJhdGlvbiBoYXBwZW5zXG4gICAgZnJvbSBlbmQgdG8gc3RhcnQuIFRoaXMgd2lsbCByZXR1cm4gbGluZXMgYW5kIHRoZSBicmVha3MgYmV0d2VlblxuICAgIHRoZW0gYXMgc2VwYXJhdGUgc3RyaW5ncy5cbiAgICAqL1xuICAgIGl0ZXIoZGlyID0gMSkgeyByZXR1cm4gbmV3IFJhd1RleHRDdXJzb3IodGhpcywgZGlyKTsgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciBhIHJhbmdlIG9mIHRoZSB0ZXh0LiBXaGVuIGBmcm9tYCA+IGB0b2AsIHRoZVxuICAgIGl0ZXJhdG9yIHdpbGwgcnVuIGluIHJldmVyc2UuXG4gICAgKi9cbiAgICBpdGVyUmFuZ2UoZnJvbSwgdG8gPSB0aGlzLmxlbmd0aCkgeyByZXR1cm4gbmV3IFBhcnRpYWxUZXh0Q3Vyc29yKHRoaXMsIGZyb20sIHRvKTsgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIGN1cnNvciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIGdpdmVuIHJhbmdlIG9mIGxpbmVzLFxuICAgIF93aXRob3V0XyByZXR1cm5pbmcgdGhlIGxpbmUgYnJlYWtzIGJldHdlZW4sIGFuZCB5aWVsZGluZyBlbXB0eVxuICAgIHN0cmluZ3MgZm9yIGVtcHR5IGxpbmVzLlxuICAgIFxuICAgIFdoZW4gYGZyb21gIGFuZCBgdG9gIGFyZSBnaXZlbiwgdGhleSBzaG91bGQgYmUgMS1iYXNlZCBsaW5lIG51bWJlcnMuXG4gICAgKi9cbiAgICBpdGVyTGluZXMoZnJvbSwgdG8pIHtcbiAgICAgICAgbGV0IGlubmVyO1xuICAgICAgICBpZiAoZnJvbSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpbm5lciA9IHRoaXMuaXRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICAgICAgdG8gPSB0aGlzLmxpbmVzICsgMTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMubGluZShmcm9tKS5mcm9tO1xuICAgICAgICAgICAgaW5uZXIgPSB0aGlzLml0ZXJSYW5nZShzdGFydCwgTWF0aC5tYXgoc3RhcnQsIHRvID09IHRoaXMubGluZXMgKyAxID8gdGhpcy5sZW5ndGggOiB0byA8PSAxID8gMCA6IHRoaXMubGluZSh0byAtIDEpLnRvKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lQ3Vyc29yKGlubmVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBkb2N1bWVudCBhcyBhIHN0cmluZywgdXNpbmcgbmV3bGluZSBjaGFyYWN0ZXJzIHRvXG4gICAgc2VwYXJhdGUgbGluZXMuXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMuc2xpY2VTdHJpbmcoMCk7IH1cbiAgICAvKipcbiAgICBDb252ZXJ0IHRoZSBkb2N1bWVudCB0byBhbiBhcnJheSBvZiBsaW5lcyAod2hpY2ggY2FuIGJlXG4gICAgZGVzZXJpYWxpemVkIGFnYWluIHZpYSBbYFRleHQub2ZgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHReb2YpKS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IGxpbmVzID0gW107XG4gICAgICAgIHRoaXMuZmxhdHRlbihsaW5lcyk7XG4gICAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGBUZXh0YCBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIGxpbmVzLlxuICAgICovXG4gICAgc3RhdGljIG9mKHRleHQpIHtcbiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkEgZG9jdW1lbnQgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBsaW5lXCIpO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMSAmJiAhdGV4dFswXSlcbiAgICAgICAgICAgIHJldHVybiBUZXh0LmVtcHR5O1xuICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8gPyBuZXcgVGV4dExlYWYodGV4dCkgOiBUZXh0Tm9kZS5mcm9tKFRleHRMZWFmLnNwbGl0KHRleHQsIFtdKSk7XG4gICAgfVxufVxuLy8gTGVhdmVzIHN0b3JlIGFuIGFycmF5IG9mIGxpbmUgc3RyaW5ncy4gVGhlcmUgYXJlIGFsd2F5cyBsaW5lIGJyZWFrc1xuLy8gYmV0d2VlbiB0aGVzZSBzdHJpbmdzLiBMZWF2ZXMgYXJlIGxpbWl0ZWQgaW4gc2l6ZSBhbmQgaGF2ZSB0byBiZVxuLy8gY29udGFpbmVkIGluIFRleHROb2RlIGluc3RhbmNlcyBmb3IgYmlnZ2VyIGRvY3VtZW50cy5cbmNsYXNzIFRleHRMZWFmIGV4dGVuZHMgVGV4dCB7XG4gICAgY29uc3RydWN0b3IodGV4dCwgbGVuZ3RoID0gdGV4dExlbmd0aCh0ZXh0KSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICB9XG4gICAgZ2V0IGxpbmVzKCkgeyByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDsgfVxuICAgIGdldCBjaGlsZHJlbigpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBsaW5lSW5uZXIodGFyZ2V0LCBpc0xpbmUsIGxpbmUsIG9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0cmluZyA9IHRoaXMudGV4dFtpXSwgZW5kID0gb2Zmc2V0ICsgc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICgoaXNMaW5lID8gbGluZSA6IGVuZCkgPj0gdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGluZShvZmZzZXQsIGVuZCwgbGluZSwgc3RyaW5nKTtcbiAgICAgICAgICAgIG9mZnNldCA9IGVuZCArIDE7XG4gICAgICAgICAgICBsaW5lKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVjb21wb3NlKGZyb20sIHRvLCB0YXJnZXQsIG9wZW4pIHtcbiAgICAgICAgbGV0IHRleHQgPSBmcm9tIDw9IDAgJiYgdG8gPj0gdGhpcy5sZW5ndGggPyB0aGlzXG4gICAgICAgICAgICA6IG5ldyBUZXh0TGVhZihzbGljZVRleHQodGhpcy50ZXh0LCBmcm9tLCB0byksIE1hdGgubWluKHRvLCB0aGlzLmxlbmd0aCkgLSBNYXRoLm1heCgwLCBmcm9tKSk7XG4gICAgICAgIGlmIChvcGVuICYgMSAvKiBPcGVuLkZyb20gKi8pIHtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gdGFyZ2V0LnBvcCgpO1xuICAgICAgICAgICAgbGV0IGpvaW5lZCA9IGFwcGVuZFRleHQodGV4dC50ZXh0LCBwcmV2LnRleHQuc2xpY2UoKSwgMCwgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKGpvaW5lZC5sZW5ndGggPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8pIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChuZXcgVGV4dExlYWYoam9pbmVkLCBwcmV2Lmxlbmd0aCArIHRleHQubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbWlkID0gam9pbmVkLmxlbmd0aCA+PiAxO1xuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKG5ldyBUZXh0TGVhZihqb2luZWQuc2xpY2UoMCwgbWlkKSksIG5ldyBUZXh0TGVhZihqb2luZWQuc2xpY2UobWlkKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShmcm9tLCB0bywgdGV4dCkge1xuICAgICAgICBpZiAoISh0ZXh0IGluc3RhbmNlb2YgVGV4dExlYWYpKVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2UoZnJvbSwgdG8sIHRleHQpO1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCBsaW5lcyA9IGFwcGVuZFRleHQodGhpcy50ZXh0LCBhcHBlbmRUZXh0KHRleHQudGV4dCwgc2xpY2VUZXh0KHRoaXMudGV4dCwgMCwgZnJvbSkpLCB0byk7XG4gICAgICAgIGxldCBuZXdMZW4gPSB0aGlzLmxlbmd0aCArIHRleHQubGVuZ3RoIC0gKHRvIC0gZnJvbSk7XG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8pXG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRMZWFmKGxpbmVzLCBuZXdMZW4pO1xuICAgICAgICByZXR1cm4gVGV4dE5vZGUuZnJvbShUZXh0TGVhZi5zcGxpdChsaW5lcywgW10pLCBuZXdMZW4pO1xuICAgIH1cbiAgICBzbGljZVN0cmluZyhmcm9tLCB0byA9IHRoaXMubGVuZ3RoLCBsaW5lU2VwID0gXCJcXG5cIikge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDsgcG9zIDw9IHRvICYmIGkgPCB0aGlzLnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gdGhpcy50ZXh0W2ldLCBlbmQgPSBwb3MgKyBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tICYmIGkpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmVTZXA7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IGVuZCAmJiB0byA+IHBvcylcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gbGluZS5zbGljZShNYXRoLm1heCgwLCBmcm9tIC0gcG9zKSwgdG8gLSBwb3MpO1xuICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmbGF0dGVuKHRhcmdldCkge1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHRoaXMudGV4dClcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKGxpbmUpO1xuICAgIH1cbiAgICBzY2FuSWRlbnRpY2FsKCkgeyByZXR1cm4gMDsgfVxuICAgIHN0YXRpYyBzcGxpdCh0ZXh0LCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IHBhcnQgPSBbXSwgbGVuID0gLTE7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2YgdGV4dCkge1xuICAgICAgICAgICAgcGFydC5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgbGVuICs9IGxpbmUubGVuZ3RoICsgMTtcbiAgICAgICAgICAgIGlmIChwYXJ0Lmxlbmd0aCA9PSAzMiAvKiBUcmVlLkJyYW5jaCAqLykge1xuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKG5ldyBUZXh0TGVhZihwYXJ0LCBsZW4pKTtcbiAgICAgICAgICAgICAgICBwYXJ0ID0gW107XG4gICAgICAgICAgICAgICAgbGVuID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlbiA+IC0xKVxuICAgICAgICAgICAgdGFyZ2V0LnB1c2gobmV3IFRleHRMZWFmKHBhcnQsIGxlbikpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbn1cbi8vIE5vZGVzIHByb3ZpZGUgdGhlIHRyZWUgc3RydWN0dXJlIG9mIHRoZSBgVGV4dGAgdHlwZS4gVGhleSBzdG9yZSBhXG4vLyBudW1iZXIgb2Ygb3RoZXIgbm9kZXMgb3IgbGVhdmVzLCB0YWtpbmcgY2FyZSB0byBiYWxhbmNlIHRoZW1zZWx2ZXNcbi8vIG9uIGNoYW5nZXMuIFRoZXJlIGFyZSBpbXBsaWVkIGxpbmUgYnJlYWtzIF9iZXR3ZWVuXyB0aGUgY2hpbGRyZW4gb2Zcbi8vIGEgbm9kZSAoYnV0IG5vdCBiZWZvcmUgdGhlIGZpcnN0IG9yIGFmdGVyIHRoZSBsYXN0IGNoaWxkKS5cbmNsYXNzIFRleHROb2RlIGV4dGVuZHMgVGV4dCB7XG4gICAgY29uc3RydWN0b3IoY2hpbGRyZW4sIGxlbmd0aCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLmxpbmVzID0gMDtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICB0aGlzLmxpbmVzICs9IGNoaWxkLmxpbmVzO1xuICAgIH1cbiAgICBsaW5lSW5uZXIodGFyZ2V0LCBpc0xpbmUsIGxpbmUsIG9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2Zmc2V0ICsgY2hpbGQubGVuZ3RoLCBlbmRMaW5lID0gbGluZSArIGNoaWxkLmxpbmVzIC0gMTtcbiAgICAgICAgICAgIGlmICgoaXNMaW5lID8gZW5kTGluZSA6IGVuZCkgPj0gdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5saW5lSW5uZXIodGFyZ2V0LCBpc0xpbmUsIGxpbmUsIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQgKyAxO1xuICAgICAgICAgICAgbGluZSA9IGVuZExpbmUgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlY29tcG9zZShmcm9tLCB0bywgdGFyZ2V0LCBvcGVuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBwb3MgPD0gdG8gJiYgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChmcm9tIDw9IGVuZCAmJiB0byA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRPcGVuID0gb3BlbiAmICgocG9zIDw9IGZyb20gPyAxIC8qIE9wZW4uRnJvbSAqLyA6IDApIHwgKGVuZCA+PSB0byA/IDIgLyogT3Blbi5UbyAqLyA6IDApKTtcbiAgICAgICAgICAgICAgICBpZiAocG9zID49IGZyb20gJiYgZW5kIDw9IHRvICYmICFjaGlsZE9wZW4pXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmRlY29tcG9zZShmcm9tIC0gcG9zLCB0byAtIHBvcywgdGFyZ2V0LCBjaGlsZE9wZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKGZyb20sIHRvLCB0ZXh0KSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgaWYgKHRleHQubGluZXMgPCB0aGlzLmxpbmVzKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogaWYgdGhlIGNoYW5nZSBvbmx5IGFmZmVjdHMgb25lIGNoaWxkIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAvLyBjaGlsZCdzIHNpemUgcmVtYWlucyBpbiB0aGUgYWNjZXB0YWJsZSByYW5nZSwgb25seSB1cGRhdGVcbiAgICAgICAgICAgICAgICAvLyB0aGF0IGNoaWxkXG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPj0gcG9zICYmIHRvIDw9IGVuZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZCA9IGNoaWxkLnJlcGxhY2UoZnJvbSAtIHBvcywgdG8gLSBwb3MsIHRleHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWxMaW5lcyA9IHRoaXMubGluZXMgLSBjaGlsZC5saW5lcyArIHVwZGF0ZWQubGluZXM7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkLmxpbmVzIDwgKHRvdGFsTGluZXMgPj4gKDUgLyogVHJlZS5CcmFuY2hTaGlmdCAqLyAtIDEpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC5saW5lcyA+ICh0b3RhbExpbmVzID4+ICg1IC8qIFRyZWUuQnJhbmNoU2hpZnQgKi8gKyAxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3B5ID0gdGhpcy5jaGlsZHJlbi5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29weVtpXSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRleHROb2RlKGNvcHksIHRoaXMubGVuZ3RoIC0gKHRvIC0gZnJvbSkgKyB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2UocG9zLCBlbmQsIHVwZGF0ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgPSBlbmQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShmcm9tLCB0bywgdGV4dCk7XG4gICAgfVxuICAgIHNsaWNlU3RyaW5nKGZyb20sIHRvID0gdGhpcy5sZW5ndGgsIGxpbmVTZXAgPSBcIlxcblwiKSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGggJiYgcG9zIDw9IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tICYmIGkpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmVTZXA7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IGVuZCAmJiB0byA+IHBvcylcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2hpbGQuc2xpY2VTdHJpbmcoZnJvbSAtIHBvcywgdG8gLSBwb3MsIGxpbmVTZXApO1xuICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmbGF0dGVuKHRhcmdldCkge1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgICAgICAgY2hpbGQuZmxhdHRlbih0YXJnZXQpO1xuICAgIH1cbiAgICBzY2FuSWRlbnRpY2FsKG90aGVyLCBkaXIpIHtcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBUZXh0Tm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgICAgIGxldCBbaUEsIGlCLCBlQSwgZUJdID0gZGlyID4gMCA/IFswLCAwLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgb3RoZXIuY2hpbGRyZW4ubGVuZ3RoXVxuICAgICAgICAgICAgOiBbdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxLCBvdGhlci5jaGlsZHJlbi5sZW5ndGggLSAxLCAtMSwgLTFdO1xuICAgICAgICBmb3IgKDs7IGlBICs9IGRpciwgaUIgKz0gZGlyKSB7XG4gICAgICAgICAgICBpZiAoaUEgPT0gZUEgfHwgaUIgPT0gZUIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgICAgICAgIGxldCBjaEEgPSB0aGlzLmNoaWxkcmVuW2lBXSwgY2hCID0gb3RoZXIuY2hpbGRyZW5baUJdO1xuICAgICAgICAgICAgaWYgKGNoQSAhPSBjaEIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aCArIGNoQS5zY2FuSWRlbnRpY2FsKGNoQiwgZGlyKTtcbiAgICAgICAgICAgIGxlbmd0aCArPSBjaEEubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZnJvbShjaGlsZHJlbiwgbGVuZ3RoID0gY2hpbGRyZW4ucmVkdWNlKChsLCBjaCkgPT4gbCArIGNoLmxlbmd0aCArIDEsIC0xKSkge1xuICAgICAgICBsZXQgbGluZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCBjaCBvZiBjaGlsZHJlbilcbiAgICAgICAgICAgIGxpbmVzICs9IGNoLmxpbmVzO1xuICAgICAgICBpZiAobGluZXMgPCAzMiAvKiBUcmVlLkJyYW5jaCAqLykge1xuICAgICAgICAgICAgbGV0IGZsYXQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNoIG9mIGNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGNoLmZsYXR0ZW4oZmxhdCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRMZWFmKGZsYXQsIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNodW5rID0gTWF0aC5tYXgoMzIgLyogVHJlZS5CcmFuY2ggKi8sIGxpbmVzID4+IDUgLyogVHJlZS5CcmFuY2hTaGlmdCAqLyksIG1heENodW5rID0gY2h1bmsgPDwgMSwgbWluQ2h1bmsgPSBjaHVuayA+PiAxO1xuICAgICAgICBsZXQgY2h1bmtlZCA9IFtdLCBjdXJyZW50TGluZXMgPSAwLCBjdXJyZW50TGVuID0gLTEsIGN1cnJlbnRDaHVuayA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGQoY2hpbGQpIHtcbiAgICAgICAgICAgIGxldCBsYXN0O1xuICAgICAgICAgICAgaWYgKGNoaWxkLmxpbmVzID4gbWF4Q2h1bmsgJiYgY2hpbGQgaW5zdGFuY2VvZiBUZXh0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG5vZGUgb2YgY2hpbGQuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgIGFkZChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLmxpbmVzID4gbWluQ2h1bmsgJiYgKGN1cnJlbnRMaW5lcyA+IG1pbkNodW5rIHx8ICFjdXJyZW50TGluZXMpKSB7XG4gICAgICAgICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgICAgICAgICBjaHVua2VkLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUZXh0TGVhZiAmJiBjdXJyZW50TGluZXMgJiZcbiAgICAgICAgICAgICAgICAobGFzdCA9IGN1cnJlbnRDaHVua1tjdXJyZW50Q2h1bmsubGVuZ3RoIC0gMV0pIGluc3RhbmNlb2YgVGV4dExlYWYgJiZcbiAgICAgICAgICAgICAgICBjaGlsZC5saW5lcyArIGxhc3QubGluZXMgPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8pIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZXMgKz0gY2hpbGQubGluZXM7XG4gICAgICAgICAgICAgICAgY3VycmVudExlbiArPSBjaGlsZC5sZW5ndGggKyAxO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDaHVua1tjdXJyZW50Q2h1bmsubGVuZ3RoIC0gMV0gPSBuZXcgVGV4dExlYWYobGFzdC50ZXh0LmNvbmNhdChjaGlsZC50ZXh0KSwgbGFzdC5sZW5ndGggKyAxICsgY2hpbGQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGluZXMgKyBjaGlsZC5saW5lcyA+IGNodW5rKVxuICAgICAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lcyArPSBjaGlsZC5saW5lcztcbiAgICAgICAgICAgICAgICBjdXJyZW50TGVuICs9IGNoaWxkLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgY3VycmVudENodW5rLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lcyA9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNodW5rZWQucHVzaChjdXJyZW50Q2h1bmsubGVuZ3RoID09IDEgPyBjdXJyZW50Q2h1bmtbMF0gOiBUZXh0Tm9kZS5mcm9tKGN1cnJlbnRDaHVuaywgY3VycmVudExlbikpO1xuICAgICAgICAgICAgY3VycmVudExlbiA9IC0xO1xuICAgICAgICAgICAgY3VycmVudExpbmVzID0gY3VycmVudENodW5rLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICBhZGQoY2hpbGQpO1xuICAgICAgICBmbHVzaCgpO1xuICAgICAgICByZXR1cm4gY2h1bmtlZC5sZW5ndGggPT0gMSA/IGNodW5rZWRbMF0gOiBuZXcgVGV4dE5vZGUoY2h1bmtlZCwgbGVuZ3RoKTtcbiAgICB9XG59XG5UZXh0LmVtcHR5ID0gLypAX19QVVJFX18qL25ldyBUZXh0TGVhZihbXCJcIl0sIDApO1xuZnVuY3Rpb24gdGV4dExlbmd0aCh0ZXh0KSB7XG4gICAgbGV0IGxlbmd0aCA9IC0xO1xuICAgIGZvciAobGV0IGxpbmUgb2YgdGV4dClcbiAgICAgICAgbGVuZ3RoICs9IGxpbmUubGVuZ3RoICsgMTtcbiAgICByZXR1cm4gbGVuZ3RoO1xufVxuZnVuY3Rpb24gYXBwZW5kVGV4dCh0ZXh0LCB0YXJnZXQsIGZyb20gPSAwLCB0byA9IDFlOSkge1xuICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwLCBmaXJzdCA9IHRydWU7IGkgPCB0ZXh0Lmxlbmd0aCAmJiBwb3MgPD0gdG87IGkrKykge1xuICAgICAgICBsZXQgbGluZSA9IHRleHRbaV0sIGVuZCA9IHBvcyArIGxpbmUubGVuZ3RoO1xuICAgICAgICBpZiAoZW5kID49IGZyb20pIHtcbiAgICAgICAgICAgIGlmIChlbmQgPiB0bylcbiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zbGljZSgwLCB0byAtIHBvcyk7XG4gICAgICAgICAgICBpZiAocG9zIDwgZnJvbSlcbiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zbGljZShmcm9tIC0gcG9zKTtcbiAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgIHRhcmdldFt0YXJnZXQubGVuZ3RoIC0gMV0gKz0gbGluZTtcbiAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIHBvcyA9IGVuZCArIDE7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiBzbGljZVRleHQodGV4dCwgZnJvbSwgdG8pIHtcbiAgICByZXR1cm4gYXBwZW5kVGV4dCh0ZXh0LCBbXCJcIl0sIGZyb20sIHRvKTtcbn1cbmNsYXNzIFJhd1RleHRDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKHRleHQsIGRpciA9IDEpIHtcbiAgICAgICAgdGhpcy5kaXIgPSBkaXI7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxpbmVCcmVhayA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgdGhpcy5ub2RlcyA9IFt0ZXh0XTtcbiAgICAgICAgdGhpcy5vZmZzZXRzID0gW2RpciA+IDAgPyAxIDogKHRleHQgaW5zdGFuY2VvZiBUZXh0TGVhZiA/IHRleHQudGV4dC5sZW5ndGggOiB0ZXh0LmNoaWxkcmVuLmxlbmd0aCkgPDwgMV07XG4gICAgfVxuICAgIG5leHRJbm5lcihza2lwLCBkaXIpIHtcbiAgICAgICAgdGhpcy5kb25lID0gdGhpcy5saW5lQnJlYWsgPSBmYWxzZTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGxhc3QgPSB0aGlzLm5vZGVzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBsZXQgdG9wID0gdGhpcy5ub2Rlc1tsYXN0XSwgb2Zmc2V0VmFsdWUgPSB0aGlzLm9mZnNldHNbbGFzdF0sIG9mZnNldCA9IG9mZnNldFZhbHVlID4+IDE7XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHRvcCBpbnN0YW5jZW9mIFRleHRMZWFmID8gdG9wLnRleHQubGVuZ3RoIDogdG9wLmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gKGRpciA+IDAgPyBzaXplIDogMCkpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRpciA+IDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0IC0gMV0rKztcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0cy5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChvZmZzZXRWYWx1ZSAmIDEpID09IChkaXIgPiAwID8gMCA6IDEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdICs9IGRpcjtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUJyZWFrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXFxuXCI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBza2lwLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0b3AgaW5zdGFuY2VvZiBUZXh0TGVhZikge1xuICAgICAgICAgICAgICAgIC8vIE1vdmUgdG8gdGhlIG5leHQgc3RyaW5nXG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0b3AudGV4dFtvZmZzZXQgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0XSArPSBkaXI7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQubGVuZ3RoID4gTWF0aC5tYXgoMCwgc2tpcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHNraXAgPT0gMCA/IG5leHQgOiBkaXIgPiAwID8gbmV4dC5zbGljZShza2lwKSA6IG5leHQuc2xpY2UoMCwgbmV4dC5sZW5ndGggLSBza2lwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNraXAgLT0gbmV4dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRvcC5jaGlsZHJlbltvZmZzZXQgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgICAgIGlmIChza2lwID4gbmV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2tpcCAtPSBuZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdICs9IGRpcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdLS07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzLnB1c2goZGlyID4gMCA/IDEgOiAobmV4dCBpbnN0YW5jZW9mIFRleHRMZWFmID8gbmV4dC50ZXh0Lmxlbmd0aCA6IG5leHQuY2hpbGRyZW4ubGVuZ3RoKSA8PCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dChza2lwID0gMCkge1xuICAgICAgICBpZiAoc2tpcCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMubmV4dElubmVyKC1za2lwLCAoLXRoaXMuZGlyKSk7XG4gICAgICAgICAgICBza2lwID0gdGhpcy52YWx1ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dElubmVyKHNraXAsIHRoaXMuZGlyKTtcbiAgICB9XG59XG5jbGFzcyBQYXJ0aWFsVGV4dEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IodGV4dCwgc3RhcnQsIGVuZCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gbmV3IFJhd1RleHRDdXJzb3IodGV4dCwgc3RhcnQgPiBlbmQgPyAtMSA6IDEpO1xuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0ID4gZW5kID8gdGV4dC5sZW5ndGggOiAwO1xuICAgICAgICB0aGlzLmZyb20gPSBNYXRoLm1pbihzdGFydCwgZW5kKTtcbiAgICAgICAgdGhpcy50byA9IE1hdGgubWF4KHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgICBuZXh0SW5uZXIoc2tpcCwgZGlyKSB7XG4gICAgICAgIGlmIChkaXIgPCAwID8gdGhpcy5wb3MgPD0gdGhpcy5mcm9tIDogdGhpcy5wb3MgPj0gdGhpcy50bykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgc2tpcCArPSBNYXRoLm1heCgwLCBkaXIgPCAwID8gdGhpcy5wb3MgLSB0aGlzLnRvIDogdGhpcy5mcm9tIC0gdGhpcy5wb3MpO1xuICAgICAgICBsZXQgbGltaXQgPSBkaXIgPCAwID8gdGhpcy5wb3MgLSB0aGlzLmZyb20gOiB0aGlzLnRvIC0gdGhpcy5wb3M7XG4gICAgICAgIGlmIChza2lwID4gbGltaXQpXG4gICAgICAgICAgICBza2lwID0gbGltaXQ7XG4gICAgICAgIGxpbWl0IC09IHNraXA7XG4gICAgICAgIGxldCB7IHZhbHVlIH0gPSB0aGlzLmN1cnNvci5uZXh0KHNraXApO1xuICAgICAgICB0aGlzLnBvcyArPSAodmFsdWUubGVuZ3RoICsgc2tpcCkgKiBkaXI7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZS5sZW5ndGggPD0gbGltaXQgPyB2YWx1ZSA6IGRpciA8IDAgPyB2YWx1ZS5zbGljZSh2YWx1ZS5sZW5ndGggLSBsaW1pdCkgOiB2YWx1ZS5zbGljZSgwLCBsaW1pdCk7XG4gICAgICAgIHRoaXMuZG9uZSA9ICF0aGlzLnZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgbmV4dChza2lwID0gMCkge1xuICAgICAgICBpZiAoc2tpcCA8IDApXG4gICAgICAgICAgICBza2lwID0gTWF0aC5tYXgoc2tpcCwgdGhpcy5mcm9tIC0gdGhpcy5wb3MpO1xuICAgICAgICBlbHNlIGlmIChza2lwID4gMClcbiAgICAgICAgICAgIHNraXAgPSBNYXRoLm1pbihza2lwLCB0aGlzLnRvIC0gdGhpcy5wb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0SW5uZXIoc2tpcCwgdGhpcy5jdXJzb3IuZGlyKTtcbiAgICB9XG4gICAgZ2V0IGxpbmVCcmVhaygpIHsgcmV0dXJuIHRoaXMuY3Vyc29yLmxpbmVCcmVhayAmJiB0aGlzLnZhbHVlICE9IFwiXCI7IH1cbn1cbmNsYXNzIExpbmVDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGlubmVyKSB7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBpbm5lcjtcbiAgICAgICAgdGhpcy5hZnRlckJyZWFrID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgIH1cbiAgICBuZXh0KHNraXAgPSAwKSB7XG4gICAgICAgIGxldCB7IGRvbmUsIGxpbmVCcmVhaywgdmFsdWUgfSA9IHRoaXMuaW5uZXIubmV4dChza2lwKTtcbiAgICAgICAgaWYgKGRvbmUgJiYgdGhpcy5hZnRlckJyZWFrKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJCcmVhayA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsaW5lQnJlYWspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFmdGVyQnJlYWspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJCcmVhayA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmFmdGVyQnJlYWsgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZ2V0IGxpbmVCcmVhaygpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5pZiAodHlwZW9mIFN5bWJvbCAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgVGV4dC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuaXRlcigpOyB9O1xuICAgIFJhd1RleHRDdXJzb3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBQYXJ0aWFsVGV4dEN1cnNvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9XG4gICAgICAgIExpbmVDdXJzb3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xufVxuLyoqXG5UaGlzIHR5cGUgZGVzY3JpYmVzIGEgbGluZSBpbiB0aGUgZG9jdW1lbnQuIEl0IGlzIGNyZWF0ZWRcbm9uLWRlbWFuZCB3aGVuIGxpbmVzIGFyZSBbcXVlcmllZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UZXh0LmxpbmVBdCkuXG4qL1xuY2xhc3MgTGluZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgKF9iZWZvcmVfIHRoZSBsaW5lIGJyZWFrLFxuICAgIG9yIGF0IHRoZSBlbmQgb2YgZG9jdW1lbnQgZm9yIHRoZSBsYXN0IGxpbmUpLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoaXMgbGluZSdzIGxpbmUgbnVtYmVyICgxLWJhc2VkKS5cbiAgICAqL1xuICAgIG51bWJlciwgXG4gICAgLyoqXG4gICAgVGhlIGxpbmUncyBjb250ZW50LlxuICAgICovXG4gICAgdGV4dCkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBsaW5lIChub3QgaW5jbHVkaW5nIGFueSBsaW5lIGJyZWFrIGFmdGVyIGl0KS5cbiAgICAqL1xuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnRvIC0gdGhpcy5mcm9tOyB9XG59XG5mdW5jdGlvbiBjbGlwKHRleHQsIGZyb20sIHRvKSB7XG4gICAgZnJvbSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRleHQubGVuZ3RoLCBmcm9tKSk7XG4gICAgcmV0dXJuIFtmcm9tLCBNYXRoLm1heChmcm9tLCBNYXRoLm1pbih0ZXh0Lmxlbmd0aCwgdG8pKV07XG59XG5cbi8vIENvbXByZXNzZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIEdyYXBoZW1lX0NsdXN0ZXJfQnJlYWs9RXh0ZW5kXG4vLyBpbmZvcm1hdGlvbiBmcm9tXG4vLyBodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy8xMy4wLjAvdWNkL2F1eGlsaWFyeS9HcmFwaGVtZUJyZWFrUHJvcGVydHkudHh0LlxuLy8gRWFjaCBwYWlyIG9mIGVsZW1lbnRzIHJlcHJlc2VudHMgYSByYW5nZSwgYXMgYW4gb2ZmZXQgZnJvbSB0aGVcbi8vIHByZXZpb3VzIHJhbmdlIGFuZCBhIGxlbmd0aC4gTnVtYmVycyBhcmUgaW4gYmFzZS0zNiwgd2l0aCB0aGUgZW1wdHlcbi8vIHN0cmluZyBiZWluZyBhIHNob3J0aGFuZCBmb3IgMS5cbmxldCBleHRlbmQgPSAvKkBfX1BVUkVfXyovXCJsYywzNCw3biw3LDdiLDE5LCwsLDIsLDIsLCwyMCxiLDFjLGwsZywsMnQsNywyLDYsMiwyLCw0LHosLHUsciwyaixiLDFtLDksOSwsbyw0LCw5LCwzLCw1LDE3LDMsM2IsZiwsdywxaiwsLCw0LDgsNCwsMyw3LGEsMix0LCwxbSwsLCwyLDQsOCwsOSwsYSwyLHEsLDIsMiwxbCwsNCwyLDQsMiwyLDMsMywsdSwyLDMsLGIsMiwxbCwsNCw1LCwyLDQsLGssMixtLDYsLCwxbSwsLDIsLDQsOCwsNywzLGEsMix1LCwxbiwsLCxjLCw5LCwxNCwsMywsMWwsMyw1LDMsLDQsNywyLGIsMix0LCwxbSwsMiwsMiwsMywsNSwyLDcsMixiLDIscywyLDFsLDIsLCwyLDQsOCwsOSwsYSwyLHQsLDIwLCw0LCwyLDMsLCw4LCwyOSwsMiw3LGMsOCwycSwsMiw5LGIsNiwyMiwyLHIsLCwsLCwxaixlLCw1LCwyLDUsYiwsMTAsOSwsMnUsNCwsNiwsMiwyLDIscCwyLDQsMyxnLDQsZCwsMiwyLDYsLGYsLGpqLDMscWEsMyx0LDMsdCwyLHUsMiwxcywyLCw3LDgsLDIsYiw5LCwxOSwzLDNiLDIseSwsM2EsMyw0LDIsOSwsNiwzLDYzLDIsMiwsMW0sLCw3LCwsLCwyLDgsNixhLDIsLDFjLGgsMXIsNCwxYyw3LCwsNSwsMTQsOSxjLDIsdyw0LDIsMiwsMywxaywsLDIsMywsLDMsMW0sOCwyLDIsNDgsMywsZCwsNyw0LCw2LCwzLDIsNWksMW0sLDUsZWssLDVmLHgsMmRhLDMsM3gsLDJvLHcsZmUsNiwyeCwyLG45dyw0LCxhLHcsMiwyOCwyLDdrLCwzLCw0LCxwLDIsNSwsNDcsMixxLGksZCwsMTIsOCxwLGIsMWEsMywxYywsMiw0LDIsMiwxMywsMXYsNiwyLDIsMiwyLGMsLDgsLDFiLCwxZiwsLDMsMiwyLDUsMiwsLDE2LDIsOCwsNm0sLDIsLDQsLGZuNCwsa2gsZyxnLGcsYTYsMixndCwsNmEsLDQ1LDUsMWFlLDMsLDIsNSw0LDE0LDMsNCwsNGwsMixmeCw0LGFyLDIsNDksYiw0dywsMWksZiwxaywzLDFkLDQsMiwyLDF4LDMsMTAsNSwsOCwxcSwsYywyLDFnLDksYSw0LDIsLDJuLDMsMiwsLDIsNiwsNGcsLDMsOCxsLDIsMWwsMiwsLCwsbSwsZSw3LDMsNSw1Ziw4LDIsMywsLG4sLDI5LCwyLDYsLCwyLCwsMiwsMiw2aiwsMiw0LDYsMiwsMixyLDIsMmQsOCwyLCwsMiwyeSwsLCwyLDYsLCwydCwzLDIsNCwsNSw3Nyw5LCwyLDZ0LCxhLDIsLCw0LCw0MCw0LDIsMiw0LCx3LGEsMTQsNiwyLDQsOCwsOSw2LDIsMywxYSxkLCwyLGJhLDcsLDYsLCwyYSxtLDIsNywsMiwsMiwzZSw2LDMsLCwyLCw3LCwsMjAsMiwzLCwsLDluLDIsZjBiLDUsMW4sNyx0NCwsMXIsNCwyOSwsZjVrLDIsNDNxLCwsMyw0LDUsOCw4LDIsNyx1LDQsNDQsMywxaXosMWosNCwxZSw4LCxlLCxtLDUsLGYsMTFzLDcsLGgsMiw3LCwyLCw1LDc5LDcsYzUsNCwxNXMsNywzMSw3LDI0MCw1LGd4N2ssMm8sM2ssNm9cIi5zcGxpdChcIixcIikubWFwKHMgPT4gcyA/IHBhcnNlSW50KHMsIDM2KSA6IDEpO1xuLy8gQ29udmVydCBvZmZzZXRzIGludG8gYWJzb2x1dGUgdmFsdWVzXG5mb3IgKGxldCBpID0gMTsgaSA8IGV4dGVuZC5sZW5ndGg7IGkrKylcbiAgICBleHRlbmRbaV0gKz0gZXh0ZW5kW2kgLSAxXTtcbmZ1bmN0aW9uIGlzRXh0ZW5kaW5nQ2hhcihjb2RlKSB7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBleHRlbmQubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgIGlmIChleHRlbmRbaV0gPiBjb2RlKVxuICAgICAgICAgICAgcmV0dXJuIGV4dGVuZFtpIC0gMV0gPD0gY29kZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc1JlZ2lvbmFsSW5kaWNhdG9yKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA+PSAweDFGMUU2ICYmIGNvZGUgPD0gMHgxRjFGRjtcbn1cbmNvbnN0IFpXSiA9IDB4MjAwZDtcbi8qKlxuUmV0dXJucyBhIG5leHQgZ3JhcGhlbWUgY2x1c3RlciBicmVhayBfYWZ0ZXJfIChub3QgZXF1YWwgdG8pXG5gcG9zYCwgaWYgYGZvcndhcmRgIGlzIHRydWUsIG9yIGJlZm9yZSBvdGhlcndpc2UuIFJldHVybnMgYHBvc2Bcbml0c2VsZiBpZiBubyBmdXJ0aGVyIGNsdXN0ZXIgYnJlYWsgaXMgYXZhaWxhYmxlIGluIHRoZSBzdHJpbmcuXG5Nb3ZlcyBhY3Jvc3Mgc3Vycm9nYXRlIHBhaXJzLCBleHRlbmRpbmcgY2hhcmFjdGVycyAod2hlblxuYGluY2x1ZGVFeHRlbmRpbmdgIGlzIHRydWUpLCBjaGFyYWN0ZXJzIGpvaW5lZCB3aXRoIHplcm8td2lkdGhcbmpvaW5lcnMsIGFuZCBmbGFnIGVtb2ppLlxuKi9cbmZ1bmN0aW9uIGZpbmRDbHVzdGVyQnJlYWsoc3RyLCBwb3MsIGZvcndhcmQgPSB0cnVlLCBpbmNsdWRlRXh0ZW5kaW5nID0gdHJ1ZSkge1xuICAgIHJldHVybiAoZm9yd2FyZCA/IG5leHRDbHVzdGVyQnJlYWsgOiBwcmV2Q2x1c3RlckJyZWFrKShzdHIsIHBvcywgaW5jbHVkZUV4dGVuZGluZyk7XG59XG5mdW5jdGlvbiBuZXh0Q2x1c3RlckJyZWFrKHN0ciwgcG9zLCBpbmNsdWRlRXh0ZW5kaW5nKSB7XG4gICAgaWYgKHBvcyA9PSBzdHIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIC8vIElmIHBvcyBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgc3Vycm9nYXRlIHBhaXIsIG1vdmUgdG8gaXRzIHN0YXJ0XG4gICAgaWYgKHBvcyAmJiBzdXJyb2dhdGVMb3coc3RyLmNoYXJDb2RlQXQocG9zKSkgJiYgc3Vycm9nYXRlSGlnaChzdHIuY2hhckNvZGVBdChwb3MgLSAxKSkpXG4gICAgICAgIHBvcy0tO1xuICAgIGxldCBwcmV2ID0gY29kZVBvaW50QXQoc3RyLCBwb3MpO1xuICAgIHBvcyArPSBjb2RlUG9pbnRTaXplKHByZXYpO1xuICAgIHdoaWxlIChwb3MgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgIGxldCBuZXh0ID0gY29kZVBvaW50QXQoc3RyLCBwb3MpO1xuICAgICAgICBpZiAocHJldiA9PSBaV0ogfHwgbmV4dCA9PSBaV0ogfHwgaW5jbHVkZUV4dGVuZGluZyAmJiBpc0V4dGVuZGluZ0NoYXIobmV4dCkpIHtcbiAgICAgICAgICAgIHBvcyArPSBjb2RlUG9pbnRTaXplKG5leHQpO1xuICAgICAgICAgICAgcHJldiA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNSZWdpb25hbEluZGljYXRvcihuZXh0KSkge1xuICAgICAgICAgICAgbGV0IGNvdW50QmVmb3JlID0gMCwgaSA9IHBvcyAtIDI7XG4gICAgICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGlzUmVnaW9uYWxJbmRpY2F0b3IoY29kZVBvaW50QXQoc3RyLCBpKSkpIHtcbiAgICAgICAgICAgICAgICBjb3VudEJlZm9yZSsrO1xuICAgICAgICAgICAgICAgIGkgLT0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb3VudEJlZm9yZSAlIDIgPT0gMClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwb3M7XG59XG5mdW5jdGlvbiBwcmV2Q2x1c3RlckJyZWFrKHN0ciwgcG9zLCBpbmNsdWRlRXh0ZW5kaW5nKSB7XG4gICAgd2hpbGUgKHBvcyA+IDApIHtcbiAgICAgICAgbGV0IGZvdW5kID0gbmV4dENsdXN0ZXJCcmVhayhzdHIsIHBvcyAtIDIsIGluY2x1ZGVFeHRlbmRpbmcpO1xuICAgICAgICBpZiAoZm91bmQgPCBwb3MpXG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIHBvcy0tO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIHN1cnJvZ2F0ZUxvdyhjaCkgeyByZXR1cm4gY2ggPj0gMHhEQzAwICYmIGNoIDwgMHhFMDAwOyB9XG5mdW5jdGlvbiBzdXJyb2dhdGVIaWdoKGNoKSB7IHJldHVybiBjaCA+PSAweEQ4MDAgJiYgY2ggPCAweERDMDA7IH1cbi8qKlxuRmluZCB0aGUgY29kZSBwb2ludCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gYSBzdHJpbmcgKGxpa2UgdGhlXG5bYGNvZGVQb2ludEF0YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2NvZGVQb2ludEF0KVxuc3RyaW5nIG1ldGhvZCkuXG4qL1xuZnVuY3Rpb24gY29kZVBvaW50QXQoc3RyLCBwb3MpIHtcbiAgICBsZXQgY29kZTAgPSBzdHIuY2hhckNvZGVBdChwb3MpO1xuICAgIGlmICghc3Vycm9nYXRlSGlnaChjb2RlMCkgfHwgcG9zICsgMSA9PSBzdHIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gY29kZTA7XG4gICAgbGV0IGNvZGUxID0gc3RyLmNoYXJDb2RlQXQocG9zICsgMSk7XG4gICAgaWYgKCFzdXJyb2dhdGVMb3coY29kZTEpKVxuICAgICAgICByZXR1cm4gY29kZTA7XG4gICAgcmV0dXJuICgoY29kZTAgLSAweGQ4MDApIDw8IDEwKSArIChjb2RlMSAtIDB4ZGMwMCkgKyAweDEwMDAwO1xufVxuLyoqXG5HaXZlbiBhIFVuaWNvZGUgY29kZXBvaW50LCByZXR1cm4gdGhlIEphdmFTY3JpcHQgc3RyaW5nIHRoYXRcbnJlc3ByZXNlbnRzIGl0IChsaWtlXG5bYFN0cmluZy5mcm9tQ29kZVBvaW50YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2Zyb21Db2RlUG9pbnQpKS5cbiovXG5mdW5jdGlvbiBmcm9tQ29kZVBvaW50KGNvZGUpIHtcbiAgICBpZiAoY29kZSA8PSAweGZmZmYpXG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgIGNvZGUgLT0gMHgxMDAwMDtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZSA+PiAxMCkgKyAweGQ4MDAsIChjb2RlICYgMTAyMykgKyAweGRjMDApO1xufVxuLyoqXG5UaGUgYW1vdW50IG9mIHBvc2l0aW9ucyBhIGNoYXJhY3RlciB0YWtlcyB1cCBhIEphdmFTY3JpcHQgc3RyaW5nLlxuKi9cbmZ1bmN0aW9uIGNvZGVQb2ludFNpemUoY29kZSkgeyByZXR1cm4gY29kZSA8IDB4MTAwMDAgPyAxIDogMjsgfVxuXG5jb25zdCBEZWZhdWx0U3BsaXQgPSAvXFxyXFxuP3xcXG4vO1xuLyoqXG5EaXN0aW5ndWlzaGVzIGRpZmZlcmVudCB3YXlzIGluIHdoaWNoIHBvc2l0aW9ucyBjYW4gYmUgbWFwcGVkLlxuKi9cbnZhciBNYXBNb2RlID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoTWFwTW9kZSkge1xuICAgIC8qKlxuICAgIE1hcCBhIHBvc2l0aW9uIHRvIGEgdmFsaWQgbmV3IHBvc2l0aW9uLCBldmVuIHdoZW4gaXRzIGNvbnRleHRcbiAgICB3YXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlNpbXBsZVwiXSA9IDBdID0gXCJTaW1wbGVcIjtcbiAgICAvKipcbiAgICBSZXR1cm4gbnVsbCBpZiBkZWxldGlvbiBoYXBwZW5zIGFjcm9zcyB0aGUgcG9zaXRpb24uXG4gICAgKi9cbiAgICBNYXBNb2RlW01hcE1vZGVbXCJUcmFja0RlbFwiXSA9IDFdID0gXCJUcmFja0RlbFwiO1xuICAgIC8qKlxuICAgIFJldHVybiBudWxsIGlmIHRoZSBjaGFyYWN0ZXIgX2JlZm9yZV8gdGhlIHBvc2l0aW9uIGlzIGRlbGV0ZWQuXG4gICAgKi9cbiAgICBNYXBNb2RlW01hcE1vZGVbXCJUcmFja0JlZm9yZVwiXSA9IDJdID0gXCJUcmFja0JlZm9yZVwiO1xuICAgIC8qKlxuICAgIFJldHVybiBudWxsIGlmIHRoZSBjaGFyYWN0ZXIgX2FmdGVyXyB0aGUgcG9zaXRpb24gaXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlRyYWNrQWZ0ZXJcIl0gPSAzXSA9IFwiVHJhY2tBZnRlclwiO1xucmV0dXJuIE1hcE1vZGV9KShNYXBNb2RlIHx8IChNYXBNb2RlID0ge30pKTtcbi8qKlxuQSBjaGFuZ2UgZGVzY3JpcHRpb24gaXMgYSB2YXJpYW50IG9mIFtjaGFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZVNldClcbnRoYXQgZG9lc24ndCBzdG9yZSB0aGUgaW5zZXJ0ZWQgdGV4dC4gQXMgc3VjaCwgaXQgY2FuJ3QgYmVcbmFwcGxpZWQsIGJ1dCBpcyBjaGVhcGVyIHRvIHN0b3JlIGFuZCBtYW5pcHVsYXRlLlxuKi9cbmNsYXNzIENoYW5nZURlc2Mge1xuICAgIC8vIFNlY3Rpb25zIGFyZSBlbmNvZGVkIGFzIHBhaXJzIG9mIGludGVnZXJzLiBUaGUgZmlyc3QgaXMgdGhlXG4gICAgLy8gbGVuZ3RoIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LCBhbmQgdGhlIHNlY29uZCBpcyAtMSBmb3JcbiAgICAvLyB1bmFmZmVjdGVkIHNlY3Rpb25zLCBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgcmVwbGFjZW1lbnQgY29udGVudFxuICAgIC8vIG90aGVyd2lzZS4gU28gYW4gaW5zZXJ0aW9uIHdvdWxkIGJlICgwLCBuPjApLCBhIGRlbGV0aW9uIChuPjAsXG4gICAgLy8gMCksIGFuZCBhIHJlcGxhY2VtZW50IHR3byBwb3NpdGl2ZSBudW1iZXJzLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzZWN0aW9ucykge1xuICAgICAgICB0aGlzLnNlY3Rpb25zID0gc2VjdGlvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IGJlZm9yZSB0aGUgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnNlY3Rpb25zW2ldO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCBhZnRlciB0aGUgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IG5ld0xlbmd0aCgpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGlucyA9IHRoaXMuc2VjdGlvbnNbaSArIDFdO1xuICAgICAgICAgICAgcmVzdWx0ICs9IGlucyA8IDAgPyB0aGlzLnNlY3Rpb25zW2ldIDogaW5zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEZhbHNlIHdoZW4gdGhlcmUgYXJlIGFjdHVhbCBjaGFuZ2VzIGluIHRoaXMgc2V0LlxuICAgICovXG4gICAgZ2V0IGVtcHR5KCkgeyByZXR1cm4gdGhpcy5zZWN0aW9ucy5sZW5ndGggPT0gMCB8fCB0aGlzLnNlY3Rpb25zLmxlbmd0aCA9PSAyICYmIHRoaXMuc2VjdGlvbnNbMV0gPCAwOyB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSB1bmNoYW5nZWQgcGFydHMgbGVmdCBieSB0aGVzZSBjaGFuZ2VzLiBgcG9zQWBcbiAgICBwcm92aWRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHJhbmdlIGluIHRoZSBvbGQgZG9jdW1lbnQsIGBwb3NCYFxuICAgIHRoZSBuZXcgcG9zaXRpb24gaW4gdGhlIGNoYW5nZWQgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBpdGVyR2FwcyhmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3NBID0gMCwgcG9zQiA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDspIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnNlY3Rpb25zW2krK10sIGlucyA9IHRoaXMuc2VjdGlvbnNbaSsrXTtcbiAgICAgICAgICAgIGlmIChpbnMgPCAwKSB7XG4gICAgICAgICAgICAgICAgZihwb3NBLCBwb3NCLCBsZW4pO1xuICAgICAgICAgICAgICAgIHBvc0IgKz0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBpbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3NBICs9IGxlbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyBjaGFuZ2VkIGJ5IHRoZXNlIGNoYW5nZXMuIChTZWVcbiAgICBbYENoYW5nZVNldC5pdGVyQ2hhbmdlc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0Lml0ZXJDaGFuZ2VzKSBmb3IgYVxuICAgIHZhcmlhbnQgdGhhdCBhbHNvIHByb3ZpZGVzIHlvdSB3aXRoIHRoZSBpbnNlcnRlZCB0ZXh0LilcbiAgICBgZnJvbUFgL2B0b0FgIHByb3ZpZGVzIHRoZSBleHRlbnQgb2YgdGhlIGNoYW5nZSBpbiB0aGUgc3RhcnRpbmdcbiAgICBkb2N1bWVudCwgYGZyb21CYC9gdG9CYCB0aGUgZXh0ZW50IG9mIHRoZSByZXBsYWNlbWVudCBpbiB0aGVcbiAgICBjaGFuZ2VkIGRvY3VtZW50LlxuICAgIFxuICAgIFdoZW4gYGluZGl2aWR1YWxgIGlzIHRydWUsIGFkamFjZW50IGNoYW5nZXMgKHdoaWNoIGFyZSBrZXB0XG4gICAgc2VwYXJhdGUgZm9yIFtwb3NpdGlvbiBtYXBwaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZURlc2MubWFwUG9zKSkgYXJlXG4gICAgcmVwb3J0ZWQgc2VwYXJhdGVseS5cbiAgICAqL1xuICAgIGl0ZXJDaGFuZ2VkUmFuZ2VzKGYsIGluZGl2aWR1YWwgPSBmYWxzZSkge1xuICAgICAgICBpdGVyQ2hhbmdlcyh0aGlzLCBmLCBpbmRpdmlkdWFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgZGVzY3JpcHRpb24gb2YgdGhlIGludmVydGVkIGZvcm0gb2YgdGhlc2UgY2hhbmdlcy5cbiAgICAqL1xuICAgIGdldCBpbnZlcnRlZERlc2MoKSB7XG4gICAgICAgIGxldCBzZWN0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApXG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChsZW4sIGlucyk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChpbnMsIGxlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VEZXNjKHNlY3Rpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcHV0ZSB0aGUgY29tYmluZWQgZWZmZWN0IG9mIGFwcGx5aW5nIGFub3RoZXIgc2V0IG9mIGNoYW5nZXNcbiAgICBhZnRlciB0aGlzIG9uZS4gVGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgdGhpcyBzZXQgc2hvdWxkXG4gICAgbWF0Y2ggdGhlIGxlbmd0aCBiZWZvcmUgYG90aGVyYC5cbiAgICAqL1xuICAgIGNvbXBvc2VEZXNjKG90aGVyKSB7IHJldHVybiB0aGlzLmVtcHR5ID8gb3RoZXIgOiBvdGhlci5lbXB0eSA/IHRoaXMgOiBjb21wb3NlU2V0cyh0aGlzLCBvdGhlcik7IH1cbiAgICAvKipcbiAgICBNYXAgdGhpcyBkZXNjcmlwdGlvbiwgd2hpY2ggc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHNhbWUgZG9jdW1lbnRcbiAgICBhcyBgb3RoZXJgLCBvdmVyIGFub3RoZXIgc2V0IG9mIGNoYW5nZXMsIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgYXBwbGllZCBhZnRlciBpdC4gV2hlbiBgYmVmb3JlYCBpcyB0cnVlLCBtYXAgYXMgaWYgdGhlIGNoYW5nZXNcbiAgICBpbiBgb3RoZXJgIGhhcHBlbmVkIGJlZm9yZSB0aGUgb25lcyBpbiBgdGhpc2AuXG4gICAgKi9cbiAgICBtYXBEZXNjKG90aGVyLCBiZWZvcmUgPSBmYWxzZSkgeyByZXR1cm4gb3RoZXIuZW1wdHkgPyB0aGlzIDogbWFwU2V0KHRoaXMsIG90aGVyLCBiZWZvcmUpOyB9XG4gICAgbWFwUG9zKHBvcywgYXNzb2MgPSAtMSwgbW9kZSA9IE1hcE1vZGUuU2ltcGxlKSB7XG4gICAgICAgIGxldCBwb3NBID0gMCwgcG9zQiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK10sIGVuZEEgPSBwb3NBICsgbGVuO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoZW5kQSA+IHBvcylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc0IgKyAocG9zIC0gcG9zQSk7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSAhPSBNYXBNb2RlLlNpbXBsZSAmJiBlbmRBID49IHBvcyAmJlxuICAgICAgICAgICAgICAgICAgICAobW9kZSA9PSBNYXBNb2RlLlRyYWNrRGVsICYmIHBvc0EgPCBwb3MgJiYgZW5kQSA+IHBvcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PSBNYXBNb2RlLlRyYWNrQmVmb3JlICYmIHBvc0EgPCBwb3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPT0gTWFwTW9kZS5UcmFja0FmdGVyICYmIGVuZEEgPiBwb3MpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoZW5kQSA+IHBvcyB8fCBlbmRBID09IHBvcyAmJiBhc3NvYyA8IDAgJiYgIWxlbilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvcyA9PSBwb3NBIHx8IGFzc29jIDwgMCA/IHBvc0IgOiBwb3NCICsgaW5zO1xuICAgICAgICAgICAgICAgIHBvc0IgKz0gaW5zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zQSA9IGVuZEE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA+IHBvc0EpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUG9zaXRpb24gJHtwb3N9IGlzIG91dCBvZiByYW5nZSBmb3IgY2hhbmdlc2V0IG9mIGxlbmd0aCAke3Bvc0F9YCk7XG4gICAgICAgIHJldHVybiBwb3NCO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoZXNlIGNoYW5nZXMgdG91Y2ggYSBnaXZlbiByYW5nZS4gV2hlbiBvbmUgb2YgdGhlXG4gICAgY2hhbmdlcyBlbnRpcmVseSBjb3ZlcnMgdGhlIHJhbmdlLCB0aGUgc3RyaW5nIGBcImNvdmVyXCJgIGlzXG4gICAgcmV0dXJuZWQuXG4gICAgKi9cbiAgICB0b3VjaGVzUmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGggJiYgcG9zIDw9IHRvOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdLCBlbmQgPSBwb3MgKyBsZW47XG4gICAgICAgICAgICBpZiAoaW5zID49IDAgJiYgcG9zIDw9IHRvICYmIGVuZCA+PSBmcm9tKVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3MgPCBmcm9tICYmIGVuZCA+IHRvID8gXCJjb3ZlclwiIDogdHJ1ZTtcbiAgICAgICAgICAgIHBvcyA9IGVuZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgcmVzdWx0ICs9IChyZXN1bHQgPyBcIiBcIiA6IFwiXCIpICsgbGVuICsgKGlucyA+PSAwID8gXCI6XCIgKyBpbnMgOiBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBTZXJpYWxpemUgdGhpcyBjaGFuZ2UgZGVzYyB0byBhIEpTT04tcmVwcmVzZW50YWJsZSB2YWx1ZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHsgcmV0dXJuIHRoaXMuc2VjdGlvbnM7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjaGFuZ2UgZGVzYyBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uIChhcyBwcm9kdWNlZFxuICAgIGJ5IFtgdG9KU09OYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VEZXNjLnRvSlNPTikuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbikgfHwganNvbi5sZW5ndGggJSAyIHx8IGpzb24uc29tZShhID0+IHR5cGVvZiBhICE9IFwibnVtYmVyXCIpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gb2YgQ2hhbmdlRGVzY1wiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VEZXNjKGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoc2VjdGlvbnMpIHsgcmV0dXJuIG5ldyBDaGFuZ2VEZXNjKHNlY3Rpb25zKTsgfVxufVxuLyoqXG5BIGNoYW5nZSBzZXQgcmVwcmVzZW50cyBhIGdyb3VwIG9mIG1vZGlmaWNhdGlvbnMgdG8gYSBkb2N1bWVudC4gSXRcbnN0b3JlcyB0aGUgZG9jdW1lbnQgbGVuZ3RoLCBhbmQgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBkb2N1bWVudHNcbndpdGggZXhhY3RseSB0aGF0IGxlbmd0aC5cbiovXG5jbGFzcyBDaGFuZ2VTZXQgZXh0ZW5kcyBDaGFuZ2VEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihzZWN0aW9ucywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpbnNlcnRlZCkge1xuICAgICAgICBzdXBlcihzZWN0aW9ucyk7XG4gICAgICAgIHRoaXMuaW5zZXJ0ZWQgPSBpbnNlcnRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQXBwbHkgdGhlIGNoYW5nZXMgdG8gYSBkb2N1bWVudCwgcmV0dXJuaW5nIHRoZSBtb2RpZmllZFxuICAgIGRvY3VtZW50LlxuICAgICovXG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCAhPSBkb2MubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBcHBseWluZyBjaGFuZ2Ugc2V0IHRvIGEgZG9jdW1lbnQgd2l0aCB0aGUgd3JvbmcgbGVuZ3RoXCIpO1xuICAgICAgICBpdGVyQ2hhbmdlcyh0aGlzLCAoZnJvbUEsIHRvQSwgZnJvbUIsIF90b0IsIHRleHQpID0+IGRvYyA9IGRvYy5yZXBsYWNlKGZyb21CLCBmcm9tQiArICh0b0EgLSBmcm9tQSksIHRleHQpLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBkb2M7XG4gICAgfVxuICAgIG1hcERlc2Mob3RoZXIsIGJlZm9yZSA9IGZhbHNlKSB7IHJldHVybiBtYXBTZXQodGhpcywgb3RoZXIsIGJlZm9yZSwgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBHaXZlbiB0aGUgZG9jdW1lbnQgYXMgaXQgZXhpc3RlZCBfYmVmb3JlXyB0aGUgY2hhbmdlcywgcmV0dXJuIGFcbiAgICBjaGFuZ2Ugc2V0IHRoYXQgcmVwcmVzZW50cyB0aGUgaW52ZXJzZSBvZiB0aGlzIHNldCwgd2hpY2ggY291bGRcbiAgICBiZSB1c2VkIHRvIGdvIGZyb20gdGhlIGRvY3VtZW50IGNyZWF0ZWQgYnkgdGhlIGNoYW5nZXMgYmFjayB0b1xuICAgIHRoZSBkb2N1bWVudCBhcyBpdCBleGlzdGVkIGJlZm9yZSB0aGUgY2hhbmdlcy5cbiAgICAqL1xuICAgIGludmVydChkb2MpIHtcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gdGhpcy5zZWN0aW9ucy5zbGljZSgpLCBpbnNlcnRlZCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IHNlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gc2VjdGlvbnNbaV0sIGlucyA9IHNlY3Rpb25zW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChpbnMgPj0gMCkge1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zW2ldID0gaW5zO1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zW2kgKyAxXSA9IGxlbjtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBpID4+IDE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGluc2VydGVkLmxlbmd0aCA8IGluZGV4KVxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZC5wdXNoKFRleHQuZW1wdHkpO1xuICAgICAgICAgICAgICAgIGluc2VydGVkLnB1c2gobGVuID8gZG9jLnNsaWNlKHBvcywgcG9zICsgbGVuKSA6IFRleHQuZW1wdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zICs9IGxlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENoYW5nZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21iaW5lIHR3byBzdWJzZXF1ZW50IGNoYW5nZSBzZXRzIGludG8gYSBzaW5nbGUgc2V0LiBgb3RoZXJgXG4gICAgbXVzdCBzdGFydCBpbiB0aGUgZG9jdW1lbnQgcHJvZHVjZWQgYnkgYHRoaXNgLiBJZiBgdGhpc2AgZ29lc1xuICAgIGBkb2NBYCBcdTIxOTIgYGRvY0JgIGFuZCBgb3RoZXJgIHJlcHJlc2VudHMgYGRvY0JgIFx1MjE5MiBgZG9jQ2AsIHRoZVxuICAgIHJldHVybmVkIHZhbHVlIHdpbGwgcmVwcmVzZW50IHRoZSBjaGFuZ2UgYGRvY0FgIFx1MjE5MiBgZG9jQ2AuXG4gICAgKi9cbiAgICBjb21wb3NlKG90aGVyKSB7IHJldHVybiB0aGlzLmVtcHR5ID8gb3RoZXIgOiBvdGhlci5lbXB0eSA/IHRoaXMgOiBjb21wb3NlU2V0cyh0aGlzLCBvdGhlciwgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBHaXZlbiBhbm90aGVyIGNoYW5nZSBzZXQgc3RhcnRpbmcgaW4gdGhlIHNhbWUgZG9jdW1lbnQsIG1hcHMgdGhpc1xuICAgIGNoYW5nZSBzZXQgb3ZlciB0aGUgb3RoZXIsIHByb2R1Y2luZyBhIG5ldyBjaGFuZ2Ugc2V0IHRoYXQgY2FuIGJlXG4gICAgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQgcHJvZHVjZWQgYnkgYXBwbHlpbmcgYG90aGVyYC4gV2hlblxuICAgIGBiZWZvcmVgIGlzIGB0cnVlYCwgb3JkZXIgY2hhbmdlcyBhcyBpZiBgdGhpc2AgY29tZXMgYmVmb3JlXG4gICAgYG90aGVyYCwgb3RoZXJ3aXNlICh0aGUgZGVmYXVsdCkgdHJlYXQgYG90aGVyYCBhcyBjb21pbmcgZmlyc3QuXG4gICAgXG4gICAgR2l2ZW4gdHdvIGNoYW5nZXMgYEFgIGFuZCBgQmAsIGBBLmNvbXBvc2UoQi5tYXAoQSkpYCBhbmRcbiAgICBgQi5jb21wb3NlKEEubWFwKEIsIHRydWUpKWAgd2lsbCBwcm9kdWNlIHRoZSBzYW1lIGRvY3VtZW50LiBUaGlzXG4gICAgcHJvdmlkZXMgYSBiYXNpYyBmb3JtIG9mIFtvcGVyYXRpb25hbFxuICAgIHRyYW5zZm9ybWF0aW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PcGVyYXRpb25hbF90cmFuc2Zvcm1hdGlvbiksXG4gICAgYW5kIGNhbiBiZSB1c2VkIGZvciBjb2xsYWJvcmF0aXZlIGVkaXRpbmcuXG4gICAgKi9cbiAgICBtYXAob3RoZXIsIGJlZm9yZSA9IGZhbHNlKSB7IHJldHVybiBvdGhlci5lbXB0eSA/IHRoaXMgOiBtYXBTZXQodGhpcywgb3RoZXIsIGJlZm9yZSwgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIGNoYW5nZWQgcmFuZ2VzIGluIHRoZSBkb2N1bWVudCwgY2FsbGluZyBgZmAgZm9yXG4gICAgZWFjaCwgd2l0aCB0aGUgcmFuZ2UgaW4gdGhlIG9yaWdpbmFsIGRvY3VtZW50IChgZnJvbUFgLWB0b0FgKVxuICAgIGFuZCB0aGUgcmFuZ2UgdGhhdCByZXBsYWNlcyBpdCBpbiB0aGUgbmV3IGRvY3VtZW50XG4gICAgKGBmcm9tQmAtYHRvQmApLlxuICAgIFxuICAgIFdoZW4gYGluZGl2aWR1YWxgIGlzIHRydWUsIGFkamFjZW50IGNoYW5nZXMgYXJlIHJlcG9ydGVkXG4gICAgc2VwYXJhdGVseS5cbiAgICAqL1xuICAgIGl0ZXJDaGFuZ2VzKGYsIGluZGl2aWR1YWwgPSBmYWxzZSkge1xuICAgICAgICBpdGVyQ2hhbmdlcyh0aGlzLCBmLCBpbmRpdmlkdWFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgW2NoYW5nZSBkZXNjcmlwdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VEZXNjKSBmb3IgdGhpcyBjaGFuZ2VcbiAgICBzZXQuXG4gICAgKi9cbiAgICBnZXQgZGVzYygpIHsgcmV0dXJuIENoYW5nZURlc2MuY3JlYXRlKHRoaXMuc2VjdGlvbnMpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmaWx0ZXIocmFuZ2VzKSB7XG4gICAgICAgIGxldCByZXN1bHRTZWN0aW9ucyA9IFtdLCByZXN1bHRJbnNlcnRlZCA9IFtdLCBmaWx0ZXJlZFNlY3Rpb25zID0gW107XG4gICAgICAgIGxldCBpdGVyID0gbmV3IFNlY3Rpb25JdGVyKHRoaXMpO1xuICAgICAgICBkb25lOiBmb3IgKGxldCBpID0gMCwgcG9zID0gMDs7KSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGkgPT0gcmFuZ2VzLmxlbmd0aCA/IDFlOSA6IHJhbmdlc1tpKytdO1xuICAgICAgICAgICAgd2hpbGUgKHBvcyA8IG5leHQgfHwgcG9zID09IG5leHQgJiYgaXRlci5sZW4gPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyLmRvbmUpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIGRvbmU7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGl0ZXIubGVuLCBuZXh0IC0gcG9zKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKGZpbHRlcmVkU2VjdGlvbnMsIGxlbiwgLTEpO1xuICAgICAgICAgICAgICAgIGxldCBpbnMgPSBpdGVyLmlucyA9PSAtMSA/IC0xIDogaXRlci5vZmYgPT0gMCA/IGl0ZXIuaW5zIDogMDtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHJlc3VsdFNlY3Rpb25zLCBsZW4sIGlucyk7XG4gICAgICAgICAgICAgICAgaWYgKGlucyA+IDApXG4gICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChyZXN1bHRJbnNlcnRlZCwgcmVzdWx0U2VjdGlvbnMsIGl0ZXIudGV4dCk7XG4gICAgICAgICAgICAgICAgaXRlci5mb3J3YXJkKGxlbik7XG4gICAgICAgICAgICAgICAgcG9zICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBlbmQgPSByYW5nZXNbaSsrXTtcbiAgICAgICAgICAgIHdoaWxlIChwb3MgPCBlbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlci5kb25lKVxuICAgICAgICAgICAgICAgICAgICBicmVhayBkb25lO1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBNYXRoLm1pbihpdGVyLmxlbiwgZW5kIC0gcG9zKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHJlc3VsdFNlY3Rpb25zLCBsZW4sIC0xKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKGZpbHRlcmVkU2VjdGlvbnMsIGxlbiwgaXRlci5pbnMgPT0gLTEgPyAtMSA6IGl0ZXIub2ZmID09IDAgPyBpdGVyLmlucyA6IDApO1xuICAgICAgICAgICAgICAgIGl0ZXIuZm9yd2FyZChsZW4pO1xuICAgICAgICAgICAgICAgIHBvcyArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY2hhbmdlczogbmV3IENoYW5nZVNldChyZXN1bHRTZWN0aW9ucywgcmVzdWx0SW5zZXJ0ZWQpLFxuICAgICAgICAgICAgZmlsdGVyZWQ6IENoYW5nZURlc2MuY3JlYXRlKGZpbHRlcmVkU2VjdGlvbnMpIH07XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGlzIGNoYW5nZSBzZXQgdG8gYSBKU09OLXJlcHJlc2VudGFibGUgdmFsdWUuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnNlY3Rpb25zW2ldLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChpbnMgPCAwKVxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gobGVuKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlucyA9PSAwKVxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goW2xlbl0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goW2xlbl0uY29uY2F0KHRoaXMuaW5zZXJ0ZWRbaSA+PiAxXS50b0pTT04oKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0cztcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgY2hhbmdlIHNldCBmb3IgdGhlIGdpdmVuIGNoYW5nZXMsIGZvciBhIGRvY3VtZW50IG9mIHRoZVxuICAgIGdpdmVuIGxlbmd0aCwgdXNpbmcgYGxpbmVTZXBgIGFzIGxpbmUgc2VwYXJhdG9yLlxuICAgICovXG4gICAgc3RhdGljIG9mKGNoYW5nZXMsIGxlbmd0aCwgbGluZVNlcCkge1xuICAgICAgICBsZXQgc2VjdGlvbnMgPSBbXSwgaW5zZXJ0ZWQgPSBbXSwgcG9zID0gMDtcbiAgICAgICAgbGV0IHRvdGFsID0gbnVsbDtcbiAgICAgICAgZnVuY3Rpb24gZmx1c2goZm9yY2UgPSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiAhc2VjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmIChwb3MgPCBsZW5ndGgpXG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuZ3RoIC0gcG9zLCAtMSk7XG4gICAgICAgICAgICBsZXQgc2V0ID0gbmV3IENoYW5nZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpO1xuICAgICAgICAgICAgdG90YWwgPSB0b3RhbCA/IHRvdGFsLmNvbXBvc2Uoc2V0Lm1hcCh0b3RhbCkpIDogc2V0O1xuICAgICAgICAgICAgc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGluc2VydGVkID0gW107XG4gICAgICAgICAgICBwb3MgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3Moc3BlYykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3BlYykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzdWIgb2Ygc3BlYylcbiAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyhzdWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3BlYyBpbnN0YW5jZW9mIENoYW5nZVNldCkge1xuICAgICAgICAgICAgICAgIGlmIChzcGVjLmxlbmd0aCAhPSBsZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBNaXNtYXRjaGVkIGNoYW5nZSBzZXQgbGVuZ3RoIChnb3QgJHtzcGVjLmxlbmd0aH0sIGV4cGVjdGVkICR7bGVuZ3RofSlgKTtcbiAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIHRvdGFsID0gdG90YWwgPyB0b3RhbC5jb21wb3NlKHNwZWMubWFwKHRvdGFsKSkgOiBzcGVjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gPSBmcm9tLCBpbnNlcnQgfSA9IHNwZWM7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPiB0byB8fCBmcm9tIDwgMCB8fCB0byA+IGxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgY2hhbmdlIHJhbmdlICR7ZnJvbX0gdG8gJHt0b30gKGluIGRvYyBvZiBsZW5ndGggJHtsZW5ndGh9KWApO1xuICAgICAgICAgICAgICAgIGxldCBpbnNUZXh0ID0gIWluc2VydCA/IFRleHQuZW1wdHkgOiB0eXBlb2YgaW5zZXJ0ID09IFwic3RyaW5nXCIgPyBUZXh0Lm9mKGluc2VydC5zcGxpdChsaW5lU2VwIHx8IERlZmF1bHRTcGxpdCkpIDogaW5zZXJ0O1xuICAgICAgICAgICAgICAgIGxldCBpbnNMZW4gPSBpbnNUZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA9PSB0byAmJiBpbnNMZW4gPT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tIDwgcG9zKVxuICAgICAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBmcm9tIC0gcG9zLCAtMSk7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgdG8gLSBmcm9tLCBpbnNMZW4pO1xuICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnRlZCwgc2VjdGlvbnMsIGluc1RleHQpO1xuICAgICAgICAgICAgICAgIHBvcyA9IHRvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MoY2hhbmdlcyk7XG4gICAgICAgIGZsdXNoKCF0b3RhbCk7XG4gICAgICAgIHJldHVybiB0b3RhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGVtcHR5IGNoYW5nZXNldCBvZiB0aGUgZ2l2ZW4gbGVuZ3RoLlxuICAgICovXG4gICAgc3RhdGljIGVtcHR5KGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IENoYW5nZVNldChsZW5ndGggPyBbbGVuZ3RoLCAtMV0gOiBbXSwgW10pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjaGFuZ2VzZXQgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbiAoYXMgcHJvZHVjZWQgYnlcbiAgICBbYHRvSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0LnRvSlNPTikuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBDaGFuZ2VTZXRcIik7XG4gICAgICAgIGxldCBzZWN0aW9ucyA9IFtdLCBpbnNlcnRlZCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwYXJ0ID0ganNvbltpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFydCA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChwYXJ0LCAtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghQXJyYXkuaXNBcnJheShwYXJ0KSB8fCB0eXBlb2YgcGFydFswXSAhPSBcIm51bWJlclwiIHx8IHBhcnQuc29tZSgoZSwgaSkgPT4gaSAmJiB0eXBlb2YgZSAhPSBcInN0cmluZ1wiKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIG9mIENoYW5nZVNldFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcnQubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHBhcnRbMF0sIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGluc2VydGVkLmxlbmd0aCA8IGkpXG4gICAgICAgICAgICAgICAgICAgIGluc2VydGVkLnB1c2goVGV4dC5lbXB0eSk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0ZWRbaV0gPSBUZXh0Lm9mKHBhcnQuc2xpY2UoMSkpO1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zLnB1c2gocGFydFswXSwgaW5zZXJ0ZWRbaV0ubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENoYW5nZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVTZXQoc2VjdGlvbnMsIGluc2VydGVkKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuLCBpbnMsIGZvcmNlSm9pbiA9IGZhbHNlKSB7XG4gICAgaWYgKGxlbiA9PSAwICYmIGlucyA8PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IGxhc3QgPSBzZWN0aW9ucy5sZW5ndGggLSAyO1xuICAgIGlmIChsYXN0ID49IDAgJiYgaW5zIDw9IDAgJiYgaW5zID09IHNlY3Rpb25zW2xhc3QgKyAxXSlcbiAgICAgICAgc2VjdGlvbnNbbGFzdF0gKz0gbGVuO1xuICAgIGVsc2UgaWYgKGxlbiA9PSAwICYmIHNlY3Rpb25zW2xhc3RdID09IDApXG4gICAgICAgIHNlY3Rpb25zW2xhc3QgKyAxXSArPSBpbnM7XG4gICAgZWxzZSBpZiAoZm9yY2VKb2luKSB7XG4gICAgICAgIHNlY3Rpb25zW2xhc3RdICs9IGxlbjtcbiAgICAgICAgc2VjdGlvbnNbbGFzdCArIDFdICs9IGlucztcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICBzZWN0aW9ucy5wdXNoKGxlbiwgaW5zKTtcbn1cbmZ1bmN0aW9uIGFkZEluc2VydCh2YWx1ZXMsIHNlY3Rpb25zLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBpbmRleCA9IChzZWN0aW9ucy5sZW5ndGggLSAyKSA+PiAxO1xuICAgIGlmIChpbmRleCA8IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXSA9IHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0uYXBwZW5kKHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdoaWxlICh2YWx1ZXMubGVuZ3RoIDwgaW5kZXgpXG4gICAgICAgICAgICB2YWx1ZXMucHVzaChUZXh0LmVtcHR5KTtcbiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGl0ZXJDaGFuZ2VzKGRlc2MsIGYsIGluZGl2aWR1YWwpIHtcbiAgICBsZXQgaW5zZXJ0ZWQgPSBkZXNjLmluc2VydGVkO1xuICAgIGZvciAobGV0IHBvc0EgPSAwLCBwb3NCID0gMCwgaSA9IDA7IGkgPCBkZXNjLnNlY3Rpb25zLmxlbmd0aDspIHtcbiAgICAgICAgbGV0IGxlbiA9IGRlc2Muc2VjdGlvbnNbaSsrXSwgaW5zID0gZGVzYy5zZWN0aW9uc1tpKytdO1xuICAgICAgICBpZiAoaW5zIDwgMCkge1xuICAgICAgICAgICAgcG9zQSArPSBsZW47XG4gICAgICAgICAgICBwb3NCICs9IGxlbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlbmRBID0gcG9zQSwgZW5kQiA9IHBvc0IsIHRleHQgPSBUZXh0LmVtcHR5O1xuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGVuZEEgKz0gbGVuO1xuICAgICAgICAgICAgICAgIGVuZEIgKz0gaW5zO1xuICAgICAgICAgICAgICAgIGlmIChpbnMgJiYgaW5zZXJ0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LmFwcGVuZChpbnNlcnRlZFsoaSAtIDIpID4+IDFdKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kaXZpZHVhbCB8fCBpID09IGRlc2Muc2VjdGlvbnMubGVuZ3RoIHx8IGRlc2Muc2VjdGlvbnNbaSArIDFdIDwgMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbGVuID0gZGVzYy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgICAgIGlucyA9IGRlc2Muc2VjdGlvbnNbaSsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGYocG9zQSwgZW5kQSwgcG9zQiwgZW5kQiwgdGV4dCk7XG4gICAgICAgICAgICBwb3NBID0gZW5kQTtcbiAgICAgICAgICAgIHBvc0IgPSBlbmRCO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gbWFwU2V0KHNldEEsIHNldEIsIGJlZm9yZSwgbWtTZXQgPSBmYWxzZSkge1xuICAgIC8vIFByb2R1Y2UgYSBjb3B5IG9mIHNldEEgdGhhdCBhcHBsaWVzIHRvIHRoZSBkb2N1bWVudCBhZnRlciBzZXRCXG4gICAgLy8gaGFzIGJlZW4gYXBwbGllZCAoYXNzdW1pbmcgYm90aCBzdGFydCBhdCB0aGUgc2FtZSBkb2N1bWVudCkuXG4gICAgbGV0IHNlY3Rpb25zID0gW10sIGluc2VydCA9IG1rU2V0ID8gW10gOiBudWxsO1xuICAgIGxldCBhID0gbmV3IFNlY3Rpb25JdGVyKHNldEEpLCBiID0gbmV3IFNlY3Rpb25JdGVyKHNldEIpO1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBib3RoIHNldHMgaW4gcGFyYWxsZWwuIGluc2VydGVkIHRyYWNrcywgZm9yIGNoYW5nZXNcbiAgICAvLyBpbiBBIHRoYXQgaGF2ZSB0byBiZSBwcm9jZXNzZWQgcGllY2UtYnktcGllY2UsIHdoZXRoZXIgdGhlaXJcbiAgICAvLyBjb250ZW50IGhhcyBiZWVuIGluc2VydGVkIGFscmVhZHksIGFuZCByZWZlcnMgdG8gdGhlIHNlY3Rpb25cbiAgICAvLyBpbmRleC5cbiAgICBmb3IgKGxldCBpbnNlcnRlZCA9IC0xOzspIHtcbiAgICAgICAgaWYgKGEuaW5zID09IC0xICYmIGIuaW5zID09IC0xKSB7XG4gICAgICAgICAgICAvLyBNb3ZlIGFjcm9zcyByYW5nZXMgc2tpcHBlZCBieSBib3RoIHNldHMuXG4gICAgICAgICAgICBsZXQgbGVuID0gTWF0aC5taW4oYS5sZW4sIGIubGVuKTtcbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGxlbiwgLTEpO1xuICAgICAgICAgICAgYS5mb3J3YXJkKGxlbik7XG4gICAgICAgICAgICBiLmZvcndhcmQobGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiLmlucyA+PSAwICYmIChhLmlucyA8IDAgfHwgaW5zZXJ0ZWQgPT0gYS5pIHx8IGEub2ZmID09IDAgJiYgKGIubGVuIDwgYS5sZW4gfHwgYi5sZW4gPT0gYS5sZW4gJiYgIWJlZm9yZSkpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGEgY2hhbmdlIGluIEIgdGhhdCBjb21lcyBiZWZvcmUgdGhlIG5leHQgY2hhbmdlIGluXG4gICAgICAgICAgICAvLyBBIChvcmRlcmVkIGJ5IHN0YXJ0IHBvcywgdGhlbiBsZW4sIHRoZW4gYmVmb3JlIGZsYWcpLCBza2lwXG4gICAgICAgICAgICAvLyB0aGF0IChhbmQgcHJvY2VzcyBhbnkgY2hhbmdlcyBpbiBBIGl0IGNvdmVycykuXG4gICAgICAgICAgICBsZXQgbGVuID0gYi5sZW47XG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBiLmlucywgLTEpO1xuICAgICAgICAgICAgd2hpbGUgKGxlbikge1xuICAgICAgICAgICAgICAgIGxldCBwaWVjZSA9IE1hdGgubWluKGEubGVuLCBsZW4pO1xuICAgICAgICAgICAgICAgIGlmIChhLmlucyA+PSAwICYmIGluc2VydGVkIDwgYS5pICYmIGEubGVuIDw9IHBpZWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIDAsIGEuaW5zKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBhLnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZCA9IGEuaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYS5mb3J3YXJkKHBpZWNlKTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gcGllY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmlucyA+PSAwKSB7XG4gICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBwYXJ0IG9mIGEgY2hhbmdlIGluIEEgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0XG4gICAgICAgICAgICAvLyBub24tZGVsZXRpb24gY2hhbmdlIGluIEIgKGlmIG92ZXJsYXBwaW5nKS5cbiAgICAgICAgICAgIGxldCBsZW4gPSAwLCBsZWZ0ID0gYS5sZW47XG4gICAgICAgICAgICB3aGlsZSAobGVmdCkge1xuICAgICAgICAgICAgICAgIGlmIChiLmlucyA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGllY2UgPSBNYXRoLm1pbihsZWZ0LCBiLmxlbik7XG4gICAgICAgICAgICAgICAgICAgIGxlbiArPSBwaWVjZTtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCAtPSBwaWVjZTtcbiAgICAgICAgICAgICAgICAgICAgYi5mb3J3YXJkKHBpZWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYi5pbnMgPT0gMCAmJiBiLmxlbiA8IGxlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCAtPSBiLmxlbjtcbiAgICAgICAgICAgICAgICAgICAgYi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW4sIGluc2VydGVkIDwgYS5pID8gYS5pbnMgOiAwKTtcbiAgICAgICAgICAgIGlmIChpbnNlcnQgJiYgaW5zZXJ0ZWQgPCBhLmkpXG4gICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGEudGV4dCk7XG4gICAgICAgICAgICBpbnNlcnRlZCA9IGEuaTtcbiAgICAgICAgICAgIGEuZm9yd2FyZChhLmxlbiAtIGxlZnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuZG9uZSAmJiBiLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnNlcnQgPyBDaGFuZ2VTZXQuY3JlYXRlU2V0KHNlY3Rpb25zLCBpbnNlcnQpIDogQ2hhbmdlRGVzYy5jcmVhdGUoc2VjdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzbWF0Y2hlZCBjaGFuZ2Ugc2V0IGxlbmd0aHNcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjb21wb3NlU2V0cyhzZXRBLCBzZXRCLCBta1NldCA9IGZhbHNlKSB7XG4gICAgbGV0IHNlY3Rpb25zID0gW107XG4gICAgbGV0IGluc2VydCA9IG1rU2V0ID8gW10gOiBudWxsO1xuICAgIGxldCBhID0gbmV3IFNlY3Rpb25JdGVyKHNldEEpLCBiID0gbmV3IFNlY3Rpb25JdGVyKHNldEIpO1xuICAgIGZvciAobGV0IG9wZW4gPSBmYWxzZTs7KSB7XG4gICAgICAgIGlmIChhLmRvbmUgJiYgYi5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zZXJ0ID8gQ2hhbmdlU2V0LmNyZWF0ZVNldChzZWN0aW9ucywgaW5zZXJ0KSA6IENoYW5nZURlc2MuY3JlYXRlKHNlY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmlucyA9PSAwKSB7IC8vIERlbGV0aW9uIGluIEFcbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGEubGVuLCAwLCBvcGVuKTtcbiAgICAgICAgICAgIGEubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIubGVuID09IDAgJiYgIWIuZG9uZSkgeyAvLyBJbnNlcnRpb24gaW4gQlxuICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgMCwgYi5pbnMsIG9wZW4pO1xuICAgICAgICAgICAgaWYgKGluc2VydClcbiAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYi50ZXh0KTtcbiAgICAgICAgICAgIGIubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuZG9uZSB8fCBiLmRvbmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc21hdGNoZWQgY2hhbmdlIHNldCBsZW5ndGhzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGEubGVuMiwgYi5sZW4pLCBzZWN0aW9uTGVuID0gc2VjdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGEuaW5zID09IC0xKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluc0IgPSBiLmlucyA9PSAtMSA/IC0xIDogYi5vZmYgPyAwIDogYi5pbnM7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuLCBpbnNCLCBvcGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0ICYmIGluc0IpXG4gICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBiLnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYi5pbnMgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBhLm9mZiA/IDAgOiBhLmxlbiwgbGVuLCBvcGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYS50ZXh0Qml0KGxlbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgYS5vZmYgPyAwIDogYS5sZW4sIGIub2ZmID8gMCA6IGIuaW5zLCBvcGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0ICYmICFiLm9mZilcbiAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGIudGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcGVuID0gKGEuaW5zID4gbGVuIHx8IGIuaW5zID49IDAgJiYgYi5sZW4gPiBsZW4pICYmIChvcGVuIHx8IHNlY3Rpb25zLmxlbmd0aCA+IHNlY3Rpb25MZW4pO1xuICAgICAgICAgICAgYS5mb3J3YXJkMihsZW4pO1xuICAgICAgICAgICAgYi5mb3J3YXJkKGxlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBTZWN0aW9uSXRlciB7XG4gICAgY29uc3RydWN0b3Ioc2V0KSB7XG4gICAgICAgIHRoaXMuc2V0ID0gc2V0O1xuICAgICAgICB0aGlzLmkgPSAwO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgbGV0IHsgc2VjdGlvbnMgfSA9IHRoaXMuc2V0O1xuICAgICAgICBpZiAodGhpcy5pIDwgc2VjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxlbiA9IHNlY3Rpb25zW3RoaXMuaSsrXTtcbiAgICAgICAgICAgIHRoaXMuaW5zID0gc2VjdGlvbnNbdGhpcy5pKytdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sZW4gPSAwO1xuICAgICAgICAgICAgdGhpcy5pbnMgPSAtMjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9mZiA9IDA7XG4gICAgfVxuICAgIGdldCBkb25lKCkgeyByZXR1cm4gdGhpcy5pbnMgPT0gLTI7IH1cbiAgICBnZXQgbGVuMigpIHsgcmV0dXJuIHRoaXMuaW5zIDwgMCA/IHRoaXMubGVuIDogdGhpcy5pbnM7IH1cbiAgICBnZXQgdGV4dCgpIHtcbiAgICAgICAgbGV0IHsgaW5zZXJ0ZWQgfSA9IHRoaXMuc2V0LCBpbmRleCA9ICh0aGlzLmkgLSAyKSA+PiAxO1xuICAgICAgICByZXR1cm4gaW5kZXggPj0gaW5zZXJ0ZWQubGVuZ3RoID8gVGV4dC5lbXB0eSA6IGluc2VydGVkW2luZGV4XTtcbiAgICB9XG4gICAgdGV4dEJpdChsZW4pIHtcbiAgICAgICAgbGV0IHsgaW5zZXJ0ZWQgfSA9IHRoaXMuc2V0LCBpbmRleCA9ICh0aGlzLmkgLSAyKSA+PiAxO1xuICAgICAgICByZXR1cm4gaW5kZXggPj0gaW5zZXJ0ZWQubGVuZ3RoICYmICFsZW4gPyBUZXh0LmVtcHR5XG4gICAgICAgICAgICA6IGluc2VydGVkW2luZGV4XS5zbGljZSh0aGlzLm9mZiwgbGVuID09IG51bGwgPyB1bmRlZmluZWQgOiB0aGlzLm9mZiArIGxlbik7XG4gICAgfVxuICAgIGZvcndhcmQobGVuKSB7XG4gICAgICAgIGlmIChsZW4gPT0gdGhpcy5sZW4pXG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxlbiAtPSBsZW47XG4gICAgICAgICAgICB0aGlzLm9mZiArPSBsZW47XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yd2FyZDIobGVuKSB7XG4gICAgICAgIGlmICh0aGlzLmlucyA9PSAtMSlcbiAgICAgICAgICAgIHRoaXMuZm9yd2FyZChsZW4pO1xuICAgICAgICBlbHNlIGlmIChsZW4gPT0gdGhpcy5pbnMpXG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlucyAtPSBsZW47XG4gICAgICAgICAgICB0aGlzLm9mZiArPSBsZW47XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuQSBzaW5nbGUgc2VsZWN0aW9uIHJhbmdlLiBXaGVuXG5bYGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5hbGxvd011bHRpcGxlU2VsZWN0aW9ucylcbmlzIGVuYWJsZWQsIGEgW3NlbGVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTZWxlY3Rpb24pIG1heSBob2xkXG5tdWx0aXBsZSByYW5nZXMuIEJ5IGRlZmF1bHQsIHNlbGVjdGlvbnMgaG9sZCBleGFjdGx5IG9uZSByYW5nZS5cbiovXG5jbGFzcyBTZWxlY3Rpb25SYW5nZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgZmxhZ3MpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBhbmNob3Igb2YgdGhlIHJhbmdlXHUyMDE0dGhlIHNpZGUgdGhhdCBkb2Vzbid0IG1vdmUgd2hlbiB5b3VcbiAgICBleHRlbmQgaXQuXG4gICAgKi9cbiAgICBnZXQgYW5jaG9yKCkgeyByZXR1cm4gdGhpcy5mbGFncyAmIDMyIC8qIFJhbmdlRmxhZy5JbnZlcnRlZCAqLyA/IHRoaXMudG8gOiB0aGlzLmZyb207IH1cbiAgICAvKipcbiAgICBUaGUgaGVhZCBvZiB0aGUgcmFuZ2UsIHdoaWNoIGlzIG1vdmVkIHdoZW4gdGhlIHJhbmdlIGlzXG4gICAgW2V4dGVuZGVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvblJhbmdlLmV4dGVuZCkuXG4gICAgKi9cbiAgICBnZXQgaGVhZCgpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgJiAzMiAvKiBSYW5nZUZsYWcuSW52ZXJ0ZWQgKi8gPyB0aGlzLmZyb20gOiB0aGlzLnRvOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIGBhbmNob3JgIGFuZCBgaGVhZGAgYXJlIGF0IHRoZSBzYW1lIHBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IGVtcHR5KCkgeyByZXR1cm4gdGhpcy5mcm9tID09IHRoaXMudG87IH1cbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIGEgY3Vyc29yIHRoYXQgaXMgZXhwbGljaXRseSBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAgY2hhcmFjdGVyIG9uIG9uZSBvZiBpdHMgc2lkZXMsIHRoaXMgcmV0dXJucyB0aGUgc2lkZS4gLTEgbWVhbnNcbiAgICB0aGUgY2hhcmFjdGVyIGJlZm9yZSBpdHMgcG9zaXRpb24sIDEgdGhlIGNoYXJhY3RlciBhZnRlciwgYW5kIDBcbiAgICBtZWFucyBubyBhc3NvY2lhdGlvbi5cbiAgICAqL1xuICAgIGdldCBhc3NvYygpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgJiA4IC8qIFJhbmdlRmxhZy5Bc3NvY0JlZm9yZSAqLyA/IC0xIDogdGhpcy5mbGFncyAmIDE2IC8qIFJhbmdlRmxhZy5Bc3NvY0FmdGVyICovID8gMSA6IDA7IH1cbiAgICAvKipcbiAgICBUaGUgYmlkaXJlY3Rpb25hbCB0ZXh0IGxldmVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGN1cnNvciwgaWZcbiAgICBhbnkuXG4gICAgKi9cbiAgICBnZXQgYmlkaUxldmVsKCkge1xuICAgICAgICBsZXQgbGV2ZWwgPSB0aGlzLmZsYWdzICYgNyAvKiBSYW5nZUZsYWcuQmlkaUxldmVsTWFzayAqLztcbiAgICAgICAgcmV0dXJuIGxldmVsID09IDcgPyBudWxsIDogbGV2ZWw7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBnb2FsIGNvbHVtbiAoc3RvcmVkIHZlcnRpY2FsIG9mZnNldCkgYXNzb2NpYXRlZCB3aXRoIGFcbiAgICBjdXJzb3IuIFRoaXMgaXMgdXNlZCB0byBwcmVzZXJ2ZSB0aGUgdmVydGljYWwgcG9zaXRpb24gd2hlblxuICAgIFttb3ZpbmddKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Lm1vdmVWZXJ0aWNhbGx5KSBhY3Jvc3NcbiAgICBsaW5lcyBvZiBkaWZmZXJlbnQgbGVuZ3RoLlxuICAgICovXG4gICAgZ2V0IGdvYWxDb2x1bW4oKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuZmxhZ3MgPj4gNiAvKiBSYW5nZUZsYWcuR29hbENvbHVtbk9mZnNldCAqLztcbiAgICAgICAgcmV0dXJuIHZhbHVlID09IDE2Nzc3MjE1IC8qIFJhbmdlRmxhZy5Ob0dvYWxDb2x1bW4gKi8gPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIHRoaXMgcmFuZ2UgdGhyb3VnaCBhIGNoYW5nZSwgcHJvZHVjaW5nIGEgdmFsaWQgcmFuZ2UgaW4gdGhlXG4gICAgdXBkYXRlZCBkb2N1bWVudC5cbiAgICAqL1xuICAgIG1hcChjaGFuZ2UsIGFzc29jID0gLTEpIHtcbiAgICAgICAgbGV0IGZyb20sIHRvO1xuICAgICAgICBpZiAodGhpcy5lbXB0eSkge1xuICAgICAgICAgICAgZnJvbSA9IHRvID0gY2hhbmdlLm1hcFBvcyh0aGlzLmZyb20sIGFzc29jKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZyb20gPSBjaGFuZ2UubWFwUG9zKHRoaXMuZnJvbSwgMSk7XG4gICAgICAgICAgICB0byA9IGNoYW5nZS5tYXBQb3ModGhpcy50bywgLTEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcm9tID09IHRoaXMuZnJvbSAmJiB0byA9PSB0aGlzLnRvID8gdGhpcyA6IG5ldyBTZWxlY3Rpb25SYW5nZShmcm9tLCB0bywgdGhpcy5mbGFncyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEV4dGVuZCB0aGlzIHJhbmdlIHRvIGNvdmVyIGF0IGxlYXN0IGBmcm9tYCB0byBgdG9gLlxuICAgICovXG4gICAgZXh0ZW5kKGZyb20sIHRvID0gZnJvbSkge1xuICAgICAgICBpZiAoZnJvbSA8PSB0aGlzLmFuY2hvciAmJiB0byA+PSB0aGlzLmFuY2hvcilcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pO1xuICAgICAgICBsZXQgaGVhZCA9IE1hdGguYWJzKGZyb20gLSB0aGlzLmFuY2hvcikgPiBNYXRoLmFicyh0byAtIHRoaXMuYW5jaG9yKSA/IGZyb20gOiB0bztcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZSh0aGlzLmFuY2hvciwgaGVhZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyByYW5nZSB0byBhbm90aGVyIHJhbmdlLlxuICAgICovXG4gICAgZXEob3RoZXIsIGluY2x1ZGVBc3NvYyA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuY2hvciA9PSBvdGhlci5hbmNob3IgJiYgdGhpcy5oZWFkID09IG90aGVyLmhlYWQgJiZcbiAgICAgICAgICAgICghaW5jbHVkZUFzc29jIHx8ICF0aGlzLmVtcHR5IHx8IHRoaXMuYXNzb2MgPT0gb3RoZXIuYXNzb2MpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBKU09OLXNlcmlhbGl6YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByYW5nZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHsgcmV0dXJuIHsgYW5jaG9yOiB0aGlzLmFuY2hvciwgaGVhZDogdGhpcy5oZWFkIH07IH1cbiAgICAvKipcbiAgICBDb252ZXJ0IGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhIHJhbmdlIHRvIGEgYFNlbGVjdGlvblJhbmdlYFxuICAgIGluc3RhbmNlLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uIHx8IHR5cGVvZiBqc29uLmFuY2hvciAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLmhlYWQgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBTZWxlY3Rpb25SYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZShqc29uLmFuY2hvciwganNvbi5oZWFkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGZyb20sIHRvLCBmbGFncykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvblJhbmdlKGZyb20sIHRvLCBmbGFncyk7XG4gICAgfVxufVxuLyoqXG5BbiBlZGl0b3Igc2VsZWN0aW9uIGhvbGRzIG9uZSBvciBtb3JlIHNlbGVjdGlvbiByYW5nZXMuXG4qL1xuY2xhc3MgRWRpdG9yU2VsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcmFuZ2VzIGluIHRoZSBzZWxlY3Rpb24sIHNvcnRlZCBieSBwb3NpdGlvbi4gUmFuZ2VzIGNhbm5vdFxuICAgIG92ZXJsYXAgKGJ1dCB0aGV5IG1heSB0b3VjaCwgaWYgdGhleSBhcmVuJ3QgZW1wdHkpLlxuICAgICovXG4gICAgcmFuZ2VzLCBcbiAgICAvKipcbiAgICBUaGUgaW5kZXggb2YgdGhlIF9tYWluXyByYW5nZSBpbiB0aGUgc2VsZWN0aW9uICh3aGljaCBpc1xuICAgIHVzdWFsbHkgdGhlIHJhbmdlIHRoYXQgd2FzIGFkZGVkIGxhc3QpLlxuICAgICovXG4gICAgbWFpbkluZGV4KSB7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICB0aGlzLm1haW5JbmRleCA9IG1haW5JbmRleDtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIGEgc2VsZWN0aW9uIHRocm91Z2ggYSBjaGFuZ2UuIFVzZWQgdG8gYWRqdXN0IHRoZSBzZWxlY3Rpb25cbiAgICBwb3NpdGlvbiBmb3IgY2hhbmdlcy5cbiAgICAqL1xuICAgIG1hcChjaGFuZ2UsIGFzc29jID0gLTEpIHtcbiAgICAgICAgaWYgKGNoYW5nZS5lbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZSh0aGlzLnJhbmdlcy5tYXAociA9PiByLm1hcChjaGFuZ2UsIGFzc29jKSksIHRoaXMubWFpbkluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIHNlbGVjdGlvbiB0byBhbm90aGVyIHNlbGVjdGlvbi4gQnkgZGVmYXVsdCwgcmFuZ2VzXG4gICAgYXJlIGNvbXBhcmVkIG9ubHkgYnkgcG9zaXRpb24uIFdoZW4gYGluY2x1ZGVBc3NvY2AgaXMgdHJ1ZSxcbiAgICBjdXJzb3IgcmFuZ2VzIG11c3QgYWxzbyBoYXZlIHRoZSBzYW1lXG4gICAgW2Bhc3NvY2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uUmFuZ2UuYXNzb2MpIHZhbHVlLlxuICAgICovXG4gICAgZXEob3RoZXIsIGluY2x1ZGVBc3NvYyA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlcy5sZW5ndGggIT0gb3RoZXIucmFuZ2VzLmxlbmd0aCB8fFxuICAgICAgICAgICAgdGhpcy5tYWluSW5kZXggIT0gb3RoZXIubWFpbkluZGV4KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnJhbmdlc1tpXS5lcShvdGhlci5yYW5nZXNbaV0sIGluY2x1ZGVBc3NvYykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBwcmltYXJ5IHNlbGVjdGlvbiByYW5nZS4gVXN1YWxseSwgeW91IHNob3VsZCBtYWtlIHN1cmVcbiAgICB5b3VyIGNvZGUgYXBwbGllcyB0byBfYWxsXyByYW5nZXMsIGJ5IHVzaW5nIG1ldGhvZHMgbGlrZVxuICAgIFtgY2hhbmdlQnlSYW5nZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuY2hhbmdlQnlSYW5nZSkuXG4gICAgKi9cbiAgICBnZXQgbWFpbigpIHsgcmV0dXJuIHRoaXMucmFuZ2VzW3RoaXMubWFpbkluZGV4XTsgfVxuICAgIC8qKlxuICAgIE1ha2Ugc3VyZSB0aGUgc2VsZWN0aW9uIG9ubHkgaGFzIG9uZSByYW5nZS4gUmV0dXJucyBhIHNlbGVjdGlvblxuICAgIGhvbGRpbmcgb25seSB0aGUgbWFpbiByYW5nZSBmcm9tIHRoaXMgc2VsZWN0aW9uLlxuICAgICovXG4gICAgYXNTaW5nbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlcy5sZW5ndGggPT0gMSA/IHRoaXMgOiBuZXcgRWRpdG9yU2VsZWN0aW9uKFt0aGlzLm1haW5dLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRXh0ZW5kIHRoaXMgc2VsZWN0aW9uIHdpdGggYW4gZXh0cmEgcmFuZ2UuXG4gICAgKi9cbiAgICBhZGRSYW5nZShyYW5nZSwgbWFpbiA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUoW3JhbmdlXS5jb25jYXQodGhpcy5yYW5nZXMpLCBtYWluID8gMCA6IHRoaXMubWFpbkluZGV4ICsgMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgYSBnaXZlbiByYW5nZSB3aXRoIGFub3RoZXIgcmFuZ2UsIGFuZCB0aGVuIG5vcm1hbGl6ZSB0aGVcbiAgICBzZWxlY3Rpb24gdG8gbWVyZ2UgYW5kIHNvcnQgcmFuZ2VzIGlmIG5lY2Vzc2FyeS5cbiAgICAqL1xuICAgIHJlcGxhY2VSYW5nZShyYW5nZSwgd2hpY2ggPSB0aGlzLm1haW5JbmRleCkge1xuICAgICAgICBsZXQgcmFuZ2VzID0gdGhpcy5yYW5nZXMuc2xpY2UoKTtcbiAgICAgICAgcmFuZ2VzW3doaWNoXSA9IHJhbmdlO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShyYW5nZXMsIHRoaXMubWFpbkluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGlzIHNlbGVjdGlvbiB0byBhbiBvYmplY3QgdGhhdCBjYW4gYmUgc2VyaWFsaXplZCB0b1xuICAgIEpTT04uXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlczogdGhpcy5yYW5nZXMubWFwKHIgPT4gci50b0pTT04oKSksIG1haW46IHRoaXMubWFpbkluZGV4IH07XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNlbGVjdGlvbiBmcm9tIGEgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghanNvbiB8fCAhQXJyYXkuaXNBcnJheShqc29uLnJhbmdlcykgfHwgdHlwZW9mIGpzb24ubWFpbiAhPSBcIm51bWJlclwiIHx8IGpzb24ubWFpbiA+PSBqc29uLnJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRWRpdG9yU2VsZWN0aW9uXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihqc29uLnJhbmdlcy5tYXAoKHIpID0+IFNlbGVjdGlvblJhbmdlLmZyb21KU09OKHIpKSwganNvbi5tYWluKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2VsZWN0aW9uIGhvbGRpbmcgYSBzaW5nbGUgcmFuZ2UuXG4gICAgKi9cbiAgICBzdGF0aWMgc2luZ2xlKGFuY2hvciwgaGVhZCA9IGFuY2hvcikge1xuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihbRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGFuY2hvciwgaGVhZCldLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgU29ydCBhbmQgbWVyZ2UgdGhlIGdpdmVuIHNldCBvZiByYW5nZXMsIGNyZWF0aW5nIGEgdmFsaWRcbiAgICBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHJhbmdlcywgbWFpbkluZGV4ID0gMCkge1xuICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBIHNlbGVjdGlvbiBuZWVkcyBhdCBsZWFzdCBvbmUgcmFuZ2VcIik7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZXNbaV07XG4gICAgICAgICAgICBpZiAocmFuZ2UuZW1wdHkgPyByYW5nZS5mcm9tIDw9IHBvcyA6IHJhbmdlLmZyb20gPCBwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5ub3JtYWxpemVkKHJhbmdlcy5zbGljZSgpLCBtYWluSW5kZXgpO1xuICAgICAgICAgICAgcG9zID0gcmFuZ2UudG87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFZGl0b3JTZWxlY3Rpb24ocmFuZ2VzLCBtYWluSW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjdXJzb3Igc2VsZWN0aW9uIHJhbmdlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4gWW91IGNhblxuICAgIHNhZmVseSBpZ25vcmUgdGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBpbiBtb3N0IHNpdHVhdGlvbnMuXG4gICAgKi9cbiAgICBzdGF0aWMgY3Vyc29yKHBvcywgYXNzb2MgPSAwLCBiaWRpTGV2ZWwsIGdvYWxDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIFNlbGVjdGlvblJhbmdlLmNyZWF0ZShwb3MsIHBvcywgKGFzc29jID09IDAgPyAwIDogYXNzb2MgPCAwID8gOCAvKiBSYW5nZUZsYWcuQXNzb2NCZWZvcmUgKi8gOiAxNiAvKiBSYW5nZUZsYWcuQXNzb2NBZnRlciAqLykgfFxuICAgICAgICAgICAgKGJpZGlMZXZlbCA9PSBudWxsID8gNyA6IE1hdGgubWluKDYsIGJpZGlMZXZlbCkpIHxcbiAgICAgICAgICAgICgoZ29hbENvbHVtbiAhPT0gbnVsbCAmJiBnb2FsQ29sdW1uICE9PSB2b2lkIDAgPyBnb2FsQ29sdW1uIDogMTY3NzcyMTUgLyogUmFuZ2VGbGFnLk5vR29hbENvbHVtbiAqLykgPDwgNiAvKiBSYW5nZUZsYWcuR29hbENvbHVtbk9mZnNldCAqLykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZWxlY3Rpb24gcmFuZ2UuXG4gICAgKi9cbiAgICBzdGF0aWMgcmFuZ2UoYW5jaG9yLCBoZWFkLCBnb2FsQ29sdW1uLCBiaWRpTGV2ZWwpIHtcbiAgICAgICAgbGV0IGZsYWdzID0gKChnb2FsQ29sdW1uICE9PSBudWxsICYmIGdvYWxDb2x1bW4gIT09IHZvaWQgMCA/IGdvYWxDb2x1bW4gOiAxNjc3NzIxNSAvKiBSYW5nZUZsYWcuTm9Hb2FsQ29sdW1uICovKSA8PCA2IC8qIFJhbmdlRmxhZy5Hb2FsQ29sdW1uT2Zmc2V0ICovKSB8XG4gICAgICAgICAgICAoYmlkaUxldmVsID09IG51bGwgPyA3IDogTWF0aC5taW4oNiwgYmlkaUxldmVsKSk7XG4gICAgICAgIHJldHVybiBoZWFkIDwgYW5jaG9yID8gU2VsZWN0aW9uUmFuZ2UuY3JlYXRlKGhlYWQsIGFuY2hvciwgMzIgLyogUmFuZ2VGbGFnLkludmVydGVkICovIHwgMTYgLyogUmFuZ2VGbGFnLkFzc29jQWZ0ZXIgKi8gfCBmbGFncylcbiAgICAgICAgICAgIDogU2VsZWN0aW9uUmFuZ2UuY3JlYXRlKGFuY2hvciwgaGVhZCwgKGhlYWQgPiBhbmNob3IgPyA4IC8qIFJhbmdlRmxhZy5Bc3NvY0JlZm9yZSAqLyA6IDApIHwgZmxhZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBub3JtYWxpemVkKHJhbmdlcywgbWFpbkluZGV4ID0gMCkge1xuICAgICAgICBsZXQgbWFpbiA9IHJhbmdlc1ttYWluSW5kZXhdO1xuICAgICAgICByYW5nZXMuc29ydCgoYSwgYikgPT4gYS5mcm9tIC0gYi5mcm9tKTtcbiAgICAgICAgbWFpbkluZGV4ID0gcmFuZ2VzLmluZGV4T2YobWFpbik7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZXNbaV0sIHByZXYgPSByYW5nZXNbaSAtIDFdO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVtcHR5ID8gcmFuZ2UuZnJvbSA8PSBwcmV2LnRvIDogcmFuZ2UuZnJvbSA8IHByZXYudG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IHByZXYuZnJvbSwgdG8gPSBNYXRoLm1heChyYW5nZS50bywgcHJldi50byk7XG4gICAgICAgICAgICAgICAgaWYgKGkgPD0gbWFpbkluZGV4KVxuICAgICAgICAgICAgICAgICAgICBtYWluSW5kZXgtLTtcbiAgICAgICAgICAgICAgICByYW5nZXMuc3BsaWNlKC0taSwgMiwgcmFuZ2UuYW5jaG9yID4gcmFuZ2UuaGVhZCA/IEVkaXRvclNlbGVjdGlvbi5yYW5nZSh0bywgZnJvbSkgOiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihyYW5nZXMsIG1haW5JbmRleCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uLCBkb2NMZW5ndGgpIHtcbiAgICBmb3IgKGxldCByYW5nZSBvZiBzZWxlY3Rpb24ucmFuZ2VzKVxuICAgICAgICBpZiAocmFuZ2UudG8gPiBkb2NMZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlNlbGVjdGlvbiBwb2ludHMgb3V0c2lkZSBvZiBkb2N1bWVudFwiKTtcbn1cblxubGV0IG5leHRJRCA9IDA7XG4vKipcbkEgZmFjZXQgaXMgYSBsYWJlbGVkIHZhbHVlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVkaXRvclxuc3RhdGUuIEl0IHRha2VzIGlucHV0cyBmcm9tIGFueSBudW1iZXIgb2YgZXh0ZW5zaW9ucywgYW5kIGNvbWJpbmVzXG50aG9zZSBpbnRvIGEgc2luZ2xlIG91dHB1dCB2YWx1ZS5cblxuRXhhbXBsZXMgb2YgdXNlcyBvZiBmYWNldHMgYXJlIHRoZSBbdGFiXG5zaXplXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRhYlNpemUpLCBbZWRpdG9yXG5hdHRyaWJ1dGVzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15lZGl0b3JBdHRyaWJ1dGVzKSwgYW5kIFt1cGRhdGVcbmxpc3RlbmVyc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdedXBkYXRlTGlzdGVuZXIpLlxuXG5Ob3RlIHRoYXQgYEZhY2V0YCBpbnN0YW5jZXMgY2FuIGJlIHVzZWQgYW55d2hlcmUgd2hlcmVcbltgRmFjZXRSZWFkZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkZhY2V0UmVhZGVyKSBpcyBleHBlY3RlZC5cbiovXG5jbGFzcyBGYWNldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21iaW5lLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhcmVJbnB1dCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXJlLCBpc1N0YXRpYywgZW5hYmxlcykge1xuICAgICAgICB0aGlzLmNvbWJpbmUgPSBjb21iaW5lO1xuICAgICAgICB0aGlzLmNvbXBhcmVJbnB1dCA9IGNvbXBhcmVJbnB1dDtcbiAgICAgICAgdGhpcy5jb21wYXJlID0gY29tcGFyZTtcbiAgICAgICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuaWQgPSBuZXh0SUQrKztcbiAgICAgICAgdGhpcy5kZWZhdWx0ID0gY29tYmluZShbXSk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHR5cGVvZiBlbmFibGVzID09IFwiZnVuY3Rpb25cIiA/IGVuYWJsZXModGhpcykgOiBlbmFibGVzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGEgZmFjZXQgcmVhZGVyIGZvciB0aGlzIGZhY2V0LCB3aGljaCBjYW4gYmUgdXNlZCB0b1xuICAgIFtyZWFkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmZhY2V0KSBpdCBidXQgbm90IHRvIGRlZmluZSB2YWx1ZXMgZm9yIGl0LlxuICAgICovXG4gICAgZ2V0IHJlYWRlcigpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBuZXcgZmFjZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgRmFjZXQoY29uZmlnLmNvbWJpbmUgfHwgKChhKSA9PiBhKSwgY29uZmlnLmNvbXBhcmVJbnB1dCB8fCAoKGEsIGIpID0+IGEgPT09IGIpLCBjb25maWcuY29tcGFyZSB8fCAoIWNvbmZpZy5jb21iaW5lID8gc2FtZUFycmF5IDogKGEsIGIpID0+IGEgPT09IGIpLCAhIWNvbmZpZy5zdGF0aWMsIGNvbmZpZy5lbmFibGVzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBhZGRzIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGlzIGZhY2V0LlxuICAgICovXG4gICAgb2YodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWNldFByb3ZpZGVyKFtdLCB0aGlzLCAwIC8qIFByb3ZpZGVyLlN0YXRpYyAqLywgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgY29tcHV0ZXMgYSB2YWx1ZSBmb3IgdGhlIGZhY2V0IGZyb20gYVxuICAgIHN0YXRlLiBZb3UgbXVzdCB0YWtlIGNhcmUgdG8gZGVjbGFyZSB0aGUgcGFydHMgb2YgdGhlIHN0YXRlIHRoYXRcbiAgICB0aGlzIHZhbHVlIGRlcGVuZHMgb24sIHNpbmNlIHlvdXIgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgYWdhaW5cbiAgICBmb3IgYSBuZXcgc3RhdGUgd2hlbiBvbmUgb2YgdGhvc2UgcGFydHMgY2hhbmdlZC5cbiAgICBcbiAgICBJbiBjYXNlcyB3aGVyZSB5b3VyIHZhbHVlIGRlcGVuZHMgb25seSBvbiBhIHNpbmdsZSBmaWVsZCwgeW91J2xsXG4gICAgd2FudCB0byB1c2UgdGhlIFtgZnJvbWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRmFjZXQuZnJvbSkgbWV0aG9kIGluc3RlYWQuXG4gICAgKi9cbiAgICBjb21wdXRlKGRlcHMsIGdldCkge1xuICAgICAgICBpZiAodGhpcy5pc1N0YXRpYylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNvbXB1dGUgYSBzdGF0aWMgZmFjZXRcIik7XG4gICAgICAgIHJldHVybiBuZXcgRmFjZXRQcm92aWRlcihkZXBzLCB0aGlzLCAxIC8qIFByb3ZpZGVyLlNpbmdsZSAqLywgZ2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IGNvbXB1dGVzIHplcm8gb3IgbW9yZSB2YWx1ZXMgZm9yIHRoaXNcbiAgICBmYWNldCBmcm9tIGEgc3RhdGUuXG4gICAgKi9cbiAgICBjb21wdXRlTihkZXBzLCBnZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTdGF0aWMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjb21wdXRlIGEgc3RhdGljIGZhY2V0XCIpO1xuICAgICAgICByZXR1cm4gbmV3IEZhY2V0UHJvdmlkZXIoZGVwcywgdGhpcywgMiAvKiBQcm92aWRlci5NdWx0aSAqLywgZ2V0KTtcbiAgICB9XG4gICAgZnJvbShmaWVsZCwgZ2V0KSB7XG4gICAgICAgIGlmICghZ2V0KVxuICAgICAgICAgICAgZ2V0ID0geCA9PiB4O1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlKFtmaWVsZF0sIHN0YXRlID0+IGdldChzdGF0ZS5maWVsZChmaWVsZCkpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzYW1lQXJyYXkoYSwgYikge1xuICAgIHJldHVybiBhID09IGIgfHwgYS5sZW5ndGggPT0gYi5sZW5ndGggJiYgYS5ldmVyeSgoZSwgaSkgPT4gZSA9PT0gYltpXSk7XG59XG5jbGFzcyBGYWNldFByb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihkZXBlbmRlbmNpZXMsIGZhY2V0LCB0eXBlLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgICAgICAgdGhpcy5mYWNldCA9IGZhY2V0O1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaWQgPSBuZXh0SUQrKztcbiAgICB9XG4gICAgZHluYW1pY1Nsb3QoYWRkcmVzc2VzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGdldHRlciA9IHRoaXMudmFsdWU7XG4gICAgICAgIGxldCBjb21wYXJlID0gdGhpcy5mYWNldC5jb21wYXJlSW5wdXQ7XG4gICAgICAgIGxldCBpZCA9IHRoaXMuaWQsIGlkeCA9IGFkZHJlc3Nlc1tpZF0gPj4gMSwgbXVsdGkgPSB0aGlzLnR5cGUgPT0gMiAvKiBQcm92aWRlci5NdWx0aSAqLztcbiAgICAgICAgbGV0IGRlcERvYyA9IGZhbHNlLCBkZXBTZWwgPSBmYWxzZSwgZGVwQWRkcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZGVwIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICBpZiAoZGVwID09IFwiZG9jXCIpXG4gICAgICAgICAgICAgICAgZGVwRG9jID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRlcCA9PSBcInNlbGVjdGlvblwiKVxuICAgICAgICAgICAgICAgIGRlcFNlbCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmICgoKChfYSA9IGFkZHJlc3Nlc1tkZXAuaWRdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAxKSAmIDEpID09IDApXG4gICAgICAgICAgICAgICAgZGVwQWRkcnMucHVzaChhZGRyZXNzZXNbZGVwLmlkXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNyZWF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gZ2V0dGVyKHN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlKHN0YXRlLCB0cikge1xuICAgICAgICAgICAgICAgIGlmICgoZGVwRG9jICYmIHRyLmRvY0NoYW5nZWQpIHx8IChkZXBTZWwgJiYgKHRyLmRvY0NoYW5nZWQgfHwgdHIuc2VsZWN0aW9uKSkgfHwgZW5zdXJlQWxsKHN0YXRlLCBkZXBBZGRycykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1ZhbCA9IGdldHRlcihzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aSA/ICFjb21wYXJlQXJyYXkobmV3VmFsLCBzdGF0ZS52YWx1ZXNbaWR4XSwgY29tcGFyZSkgOiAhY29tcGFyZShuZXdWYWwsIHN0YXRlLnZhbHVlc1tpZHhdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVjb25maWd1cmU6IChzdGF0ZSwgb2xkU3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3VmFsLCBvbGRBZGRyID0gb2xkU3RhdGUuY29uZmlnLmFkZHJlc3NbaWRdO1xuICAgICAgICAgICAgICAgIGlmIChvbGRBZGRyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9sZFZhbCA9IGdldEFkZHIob2xkU3RhdGUsIG9sZEFkZHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXMuZXZlcnkoZGVwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXAgaW5zdGFuY2VvZiBGYWNldCA/IG9sZFN0YXRlLmZhY2V0KGRlcCkgPT09IHN0YXRlLmZhY2V0KGRlcCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcCBpbnN0YW5jZW9mIFN0YXRlRmllbGQgPyBvbGRTdGF0ZS5maWVsZChkZXAsIGZhbHNlKSA9PSBzdGF0ZS5maWVsZChkZXAsIGZhbHNlKSA6IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0pIHx8IChtdWx0aSA/IGNvbXBhcmVBcnJheShuZXdWYWwgPSBnZXR0ZXIoc3RhdGUpLCBvbGRWYWwsIGNvbXBhcmUpIDogY29tcGFyZShuZXdWYWwgPSBnZXR0ZXIoc3RhdGUpLCBvbGRWYWwpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRWYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsID0gZ2V0dGVyKHN0YXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXBhcmVBcnJheShhLCBiLCBjb21wYXJlKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIWNvbXBhcmUoYVtpXSwgYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBlbnN1cmVBbGwoc3RhdGUsIGFkZHJzKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBhZGRyIG9mIGFkZHJzKVxuICAgICAgICBpZiAoZW5zdXJlQWRkcihzdGF0ZSwgYWRkcikgJiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLylcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIHJldHVybiBjaGFuZ2VkO1xufVxuZnVuY3Rpb24gZHluYW1pY0ZhY2V0U2xvdChhZGRyZXNzZXMsIGZhY2V0LCBwcm92aWRlcnMpIHtcbiAgICBsZXQgcHJvdmlkZXJBZGRycyA9IHByb3ZpZGVycy5tYXAocCA9PiBhZGRyZXNzZXNbcC5pZF0pO1xuICAgIGxldCBwcm92aWRlclR5cGVzID0gcHJvdmlkZXJzLm1hcChwID0+IHAudHlwZSk7XG4gICAgbGV0IGR5bmFtaWMgPSBwcm92aWRlckFkZHJzLmZpbHRlcihwID0+ICEocCAmIDEpKTtcbiAgICBsZXQgaWR4ID0gYWRkcmVzc2VzW2ZhY2V0LmlkXSA+PiAxO1xuICAgIGZ1bmN0aW9uIGdldChzdGF0ZSkge1xuICAgICAgICBsZXQgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvdmlkZXJBZGRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0QWRkcihzdGF0ZSwgcHJvdmlkZXJBZGRyc1tpXSk7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXJUeXBlc1tpXSA9PSAyIC8qIFByb3ZpZGVyLk11bHRpICovKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHZhbCBvZiB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhY2V0LmNvbWJpbmUodmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBhZGRyIG9mIHByb3ZpZGVyQWRkcnMpXG4gICAgICAgICAgICAgICAgZW5zdXJlQWRkcihzdGF0ZSwgYWRkcik7XG4gICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IGdldChzdGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZShzdGF0ZSwgdHIpIHtcbiAgICAgICAgICAgIGlmICghZW5zdXJlQWxsKHN0YXRlLCBkeW5hbWljKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldChzdGF0ZSk7XG4gICAgICAgICAgICBpZiAoZmFjZXQuY29tcGFyZSh2YWx1ZSwgc3RhdGUudmFsdWVzW2lkeF0pKVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgfSxcbiAgICAgICAgcmVjb25maWd1cmUoc3RhdGUsIG9sZFN0YXRlKSB7XG4gICAgICAgICAgICBsZXQgZGVwQ2hhbmdlZCA9IGVuc3VyZUFsbChzdGF0ZSwgcHJvdmlkZXJBZGRycyk7XG4gICAgICAgICAgICBsZXQgb2xkUHJvdmlkZXJzID0gb2xkU3RhdGUuY29uZmlnLmZhY2V0c1tmYWNldC5pZF0sIG9sZFZhbHVlID0gb2xkU3RhdGUuZmFjZXQoZmFjZXQpO1xuICAgICAgICAgICAgaWYgKG9sZFByb3ZpZGVycyAmJiAhZGVwQ2hhbmdlZCAmJiBzYW1lQXJyYXkocHJvdmlkZXJzLCBvbGRQcm92aWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldChzdGF0ZSk7XG4gICAgICAgICAgICBpZiAoZmFjZXQuY29tcGFyZSh2YWx1ZSwgb2xkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgIH1cbiAgICB9O1xufVxuY29uc3QgaW5pdEZpZWxkID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IHN0YXRpYzogdHJ1ZSB9KTtcbi8qKlxuRmllbGRzIGNhbiBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIGFuIGVkaXRvciBzdGF0ZSwgYW5kXG5rZWVwIGl0IGluIHN5bmMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3RhdGUuXG4qL1xuY2xhc3MgU3RhdGVGaWVsZCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpZCwgY3JlYXRlRiwgdXBkYXRlRiwgY29tcGFyZUYsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3BlYykge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuY3JlYXRlRiA9IGNyZWF0ZUY7XG4gICAgICAgIHRoaXMudXBkYXRlRiA9IHVwZGF0ZUY7XG4gICAgICAgIHRoaXMuY29tcGFyZUYgPSBjb21wYXJlRjtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnByb3ZpZGVzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBzdGF0ZSBmaWVsZC5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoY29uZmlnKSB7XG4gICAgICAgIGxldCBmaWVsZCA9IG5ldyBTdGF0ZUZpZWxkKG5leHRJRCsrLCBjb25maWcuY3JlYXRlLCBjb25maWcudXBkYXRlLCBjb25maWcuY29tcGFyZSB8fCAoKGEsIGIpID0+IGEgPT09IGIpLCBjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLnByb3ZpZGUpXG4gICAgICAgICAgICBmaWVsZC5wcm92aWRlcyA9IGNvbmZpZy5wcm92aWRlKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbiAgICBjcmVhdGUoc3RhdGUpIHtcbiAgICAgICAgbGV0IGluaXQgPSBzdGF0ZS5mYWNldChpbml0RmllbGQpLmZpbmQoaSA9PiBpLmZpZWxkID09IHRoaXMpO1xuICAgICAgICByZXR1cm4gKChpbml0ID09PSBudWxsIHx8IGluaXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGluaXQuY3JlYXRlKSB8fCB0aGlzLmNyZWF0ZUYpKHN0YXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzbG90KGFkZHJlc3Nlcykge1xuICAgICAgICBsZXQgaWR4ID0gYWRkcmVzc2VzW3RoaXMuaWRdID4+IDE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjcmVhdGU6IChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdGhpcy5jcmVhdGUoc3RhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGU6IChzdGF0ZSwgdHIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgb2xkVmFsID0gc3RhdGUudmFsdWVzW2lkeF07XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy51cGRhdGVGKG9sZFZhbCwgdHIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhcmVGKG9sZFZhbCwgdmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWNvbmZpZ3VyZTogKHN0YXRlLCBvbGRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvbGRTdGF0ZS5jb25maWcuYWRkcmVzc1t0aGlzLmlkXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gb2xkU3RhdGUuZmllbGQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHRoaXMuY3JlYXRlKHN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyB0aGlzIGZpZWxkIGFuZCBvdmVycmlkZXMgdGhlXG4gICAgd2F5IGl0IGlzIGluaXRpYWxpemVkLiBDYW4gYmUgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gcHJvdmlkZSBhXG4gICAgbm9uLWRlZmF1bHQgc3RhcnRpbmcgdmFsdWUgZm9yIHRoZSBmaWVsZC5cbiAgICAqL1xuICAgIGluaXQoY3JlYXRlKSB7XG4gICAgICAgIHJldHVybiBbdGhpcywgaW5pdEZpZWxkLm9mKHsgZmllbGQ6IHRoaXMsIGNyZWF0ZSB9KV07XG4gICAgfVxuICAgIC8qKlxuICAgIFN0YXRlIGZpZWxkIGluc3RhbmNlcyBjYW4gYmUgdXNlZCBhc1xuICAgIFtgRXh0ZW5zaW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FeHRlbnNpb24pIHZhbHVlcyB0byBlbmFibGUgdGhlIGZpZWxkIGluIGFcbiAgICBnaXZlbiBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCBleHRlbnNpb24oKSB7IHJldHVybiB0aGlzOyB9XG59XG5jb25zdCBQcmVjXyA9IHsgbG93ZXN0OiA0LCBsb3c6IDMsIGRlZmF1bHQ6IDIsIGhpZ2g6IDEsIGhpZ2hlc3Q6IDAgfTtcbmZ1bmN0aW9uIHByZWModmFsdWUpIHtcbiAgICByZXR1cm4gKGV4dCkgPT4gbmV3IFByZWNFeHRlbnNpb24oZXh0LCB2YWx1ZSk7XG59XG4vKipcbkJ5IGRlZmF1bHQgZXh0ZW5zaW9ucyBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZm91bmRcbmluIHRoZSBmbGF0dGVuZWQgZm9ybSBvZiBuZXN0ZWQgYXJyYXkgdGhhdCB3YXMgcHJvdmlkZWQuXG5JbmRpdmlkdWFsIGV4dGVuc2lvbiB2YWx1ZXMgY2FuIGJlIGFzc2lnbmVkIGEgcHJlY2VkZW5jZSB0b1xub3ZlcnJpZGUgdGhpcy4gRXh0ZW5zaW9ucyB0aGF0IGRvIG5vdCBoYXZlIGEgcHJlY2VkZW5jZSBzZXQgZ2V0XG50aGUgcHJlY2VkZW5jZSBvZiB0aGUgbmVhcmVzdCBwYXJlbnQgd2l0aCBhIHByZWNlZGVuY2UsIG9yXG5bYGRlZmF1bHRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlByZWMuZGVmYXVsdCkgaWYgdGhlcmUgaXMgbm8gc3VjaCBwYXJlbnQuIFRoZVxuZmluYWwgb3JkZXJpbmcgb2YgZXh0ZW5zaW9ucyBpcyBkZXRlcm1pbmVkIGJ5IGZpcnN0IHNvcnRpbmcgYnlcbnByZWNlZGVuY2UgYW5kIHRoZW4gYnkgb3JkZXIgd2l0aGluIGVhY2ggcHJlY2VkZW5jZS5cbiovXG5jb25zdCBQcmVjID0ge1xuICAgIC8qKlxuICAgIFRoZSBoaWdoZXN0IHByZWNlZGVuY2UgbGV2ZWwsIGZvciBleHRlbnNpb25zIHRoYXQgc2hvdWxkIGVuZCB1cFxuICAgIG5lYXIgdGhlIHN0YXJ0IG9mIHRoZSBwcmVjZWRlbmNlIG9yZGVyaW5nLlxuICAgICovXG4gICAgaGlnaGVzdDogLypAX19QVVJFX18qL3ByZWMoUHJlY18uaGlnaGVzdCksXG4gICAgLyoqXG4gICAgQSBoaWdoZXItdGhhbi1kZWZhdWx0IHByZWNlZGVuY2UsIGZvciBleHRlbnNpb25zIHRoYXQgc2hvdWxkXG4gICAgY29tZSBiZWZvcmUgdGhvc2Ugd2l0aCBkZWZhdWx0IHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBoaWdoOiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5oaWdoKSxcbiAgICAvKipcbiAgICBUaGUgZGVmYXVsdCBwcmVjZWRlbmNlLCB3aGljaCBpcyBhbHNvIHVzZWQgZm9yIGV4dGVuc2lvbnNcbiAgICB3aXRob3V0IGFuIGV4cGxpY2l0IHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBkZWZhdWx0OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5kZWZhdWx0KSxcbiAgICAvKipcbiAgICBBIGxvd2VyLXRoYW4tZGVmYXVsdCBwcmVjZWRlbmNlLlxuICAgICovXG4gICAgbG93OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5sb3cpLFxuICAgIC8qKlxuICAgIFRoZSBsb3dlc3QgcHJlY2VkZW5jZSBsZXZlbC4gTWVhbnQgZm9yIHRoaW5ncyB0aGF0IHNob3VsZCBlbmQgdXBcbiAgICBuZWFyIHRoZSBlbmQgb2YgdGhlIGV4dGVuc2lvbiBvcmRlci5cbiAgICAqL1xuICAgIGxvd2VzdDogLypAX19QVVJFX18qL3ByZWMoUHJlY18ubG93ZXN0KVxufTtcbmNsYXNzIFByZWNFeHRlbnNpb24ge1xuICAgIGNvbnN0cnVjdG9yKGlubmVyLCBwcmVjKSB7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBpbm5lcjtcbiAgICAgICAgdGhpcy5wcmVjID0gcHJlYztcbiAgICB9XG59XG4vKipcbkV4dGVuc2lvbiBjb21wYXJ0bWVudHMgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIGNvbmZpZ3VyYXRpb25cbmR5bmFtaWMuIEJ5IFt3cmFwcGluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5Db21wYXJ0bWVudC5vZikgcGFydCBvZiB5b3VyXG5jb25maWd1cmF0aW9uIGluIGEgY29tcGFydG1lbnQsIHlvdSBjYW4gbGF0ZXJcbltyZXBsYWNlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNvbXBhcnRtZW50LnJlY29uZmlndXJlKSB0aGF0IHBhcnQgdGhyb3VnaCBhXG50cmFuc2FjdGlvbi5cbiovXG5jbGFzcyBDb21wYXJ0bWVudCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY29tcGFydG1lbnQgdG8gYWRkIHRvIHlvdXIgW3N0YXRlXG4gICAgY29uZmlndXJhdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZUNvbmZpZy5leHRlbnNpb25zKS5cbiAgICAqL1xuICAgIG9mKGV4dCkgeyByZXR1cm4gbmV3IENvbXBhcnRtZW50SW5zdGFuY2UodGhpcywgZXh0KTsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBbZWZmZWN0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5lZmZlY3RzKSB0aGF0XG4gICAgcmVjb25maWd1cmVzIHRoaXMgY29tcGFydG1lbnQuXG4gICAgKi9cbiAgICByZWNvbmZpZ3VyZShjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZS5vZih7IGNvbXBhcnRtZW50OiB0aGlzLCBleHRlbnNpb246IGNvbnRlbnQgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBjb21wYXJ0bWVudCBpbiB0aGUgc3RhdGUsIG9yXG4gICAgYHVuZGVmaW5lZGAgaWYgaXQgaXNuJ3QgcHJlc2VudC5cbiAgICAqL1xuICAgIGdldChzdGF0ZSkge1xuICAgICAgICByZXR1cm4gc3RhdGUuY29uZmlnLmNvbXBhcnRtZW50cy5nZXQodGhpcyk7XG4gICAgfVxufVxuY2xhc3MgQ29tcGFydG1lbnRJbnN0YW5jZSB7XG4gICAgY29uc3RydWN0b3IoY29tcGFydG1lbnQsIGlubmVyKSB7XG4gICAgICAgIHRoaXMuY29tcGFydG1lbnQgPSBjb21wYXJ0bWVudDtcbiAgICAgICAgdGhpcy5pbm5lciA9IGlubmVyO1xuICAgIH1cbn1cbmNsYXNzIENvbmZpZ3VyYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIGNvbXBhcnRtZW50cywgZHluYW1pY1Nsb3RzLCBhZGRyZXNzLCBzdGF0aWNWYWx1ZXMsIGZhY2V0cykge1xuICAgICAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgICAgICB0aGlzLmNvbXBhcnRtZW50cyA9IGNvbXBhcnRtZW50cztcbiAgICAgICAgdGhpcy5keW5hbWljU2xvdHMgPSBkeW5hbWljU2xvdHM7XG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgICAgIHRoaXMuc3RhdGljVmFsdWVzID0gc3RhdGljVmFsdWVzO1xuICAgICAgICB0aGlzLmZhY2V0cyA9IGZhY2V0cztcbiAgICAgICAgdGhpcy5zdGF0dXNUZW1wbGF0ZSA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5zdGF0dXNUZW1wbGF0ZS5sZW5ndGggPCBkeW5hbWljU2xvdHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5zdGF0dXNUZW1wbGF0ZS5wdXNoKDAgLyogU2xvdFN0YXR1cy5VbnJlc29sdmVkICovKTtcbiAgICB9XG4gICAgc3RhdGljRmFjZXQoZmFjZXQpIHtcbiAgICAgICAgbGV0IGFkZHIgPSB0aGlzLmFkZHJlc3NbZmFjZXQuaWRdO1xuICAgICAgICByZXR1cm4gYWRkciA9PSBudWxsID8gZmFjZXQuZGVmYXVsdCA6IHRoaXMuc3RhdGljVmFsdWVzW2FkZHIgPj4gMV07XG4gICAgfVxuICAgIHN0YXRpYyByZXNvbHZlKGJhc2UsIGNvbXBhcnRtZW50cywgb2xkU3RhdGUpIHtcbiAgICAgICAgbGV0IGZpZWxkcyA9IFtdO1xuICAgICAgICBsZXQgZmFjZXRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IG5ld0NvbXBhcnRtZW50cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChsZXQgZXh0IG9mIGZsYXR0ZW4oYmFzZSwgY29tcGFydG1lbnRzLCBuZXdDb21wYXJ0bWVudHMpKSB7XG4gICAgICAgICAgICBpZiAoZXh0IGluc3RhbmNlb2YgU3RhdGVGaWVsZClcbiAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChleHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIChmYWNldHNbZXh0LmZhY2V0LmlkXSB8fCAoZmFjZXRzW2V4dC5mYWNldC5pZF0gPSBbXSkpLnB1c2goZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWRkcmVzcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGxldCBzdGF0aWNWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IGR5bmFtaWNTbG90cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGFkZHJlc3NbZmllbGQuaWRdID0gZHluYW1pY1Nsb3RzLmxlbmd0aCA8PCAxO1xuICAgICAgICAgICAgZHluYW1pY1Nsb3RzLnB1c2goYSA9PiBmaWVsZC5zbG90KGEpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb2xkRmFjZXRzID0gb2xkU3RhdGUgPT09IG51bGwgfHwgb2xkU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9sZFN0YXRlLmNvbmZpZy5mYWNldHM7XG4gICAgICAgIGZvciAobGV0IGlkIGluIGZhY2V0cykge1xuICAgICAgICAgICAgbGV0IHByb3ZpZGVycyA9IGZhY2V0c1tpZF0sIGZhY2V0ID0gcHJvdmlkZXJzWzBdLmZhY2V0O1xuICAgICAgICAgICAgbGV0IG9sZFByb3ZpZGVycyA9IG9sZEZhY2V0cyAmJiBvbGRGYWNldHNbaWRdIHx8IFtdO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVycy5ldmVyeShwID0+IHAudHlwZSA9PSAwIC8qIFByb3ZpZGVyLlN0YXRpYyAqLykpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzW2ZhY2V0LmlkXSA9IChzdGF0aWNWYWx1ZXMubGVuZ3RoIDw8IDEpIHwgMTtcbiAgICAgICAgICAgICAgICBpZiAoc2FtZUFycmF5KG9sZFByb3ZpZGVycywgcHJvdmlkZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWNWYWx1ZXMucHVzaChvbGRTdGF0ZS5mYWNldChmYWNldCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZmFjZXQuY29tYmluZShwcm92aWRlcnMubWFwKHAgPT4gcC52YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0aWNWYWx1ZXMucHVzaChvbGRTdGF0ZSAmJiBmYWNldC5jb21wYXJlKHZhbHVlLCBvbGRTdGF0ZS5mYWNldChmYWNldCkpID8gb2xkU3RhdGUuZmFjZXQoZmFjZXQpIDogdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgb2YgcHJvdmlkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwLnR5cGUgPT0gMCAvKiBQcm92aWRlci5TdGF0aWMgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NbcC5pZF0gPSAoc3RhdGljVmFsdWVzLmxlbmd0aCA8PCAxKSB8IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNWYWx1ZXMucHVzaChwLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NbcC5pZF0gPSBkeW5hbWljU2xvdHMubGVuZ3RoIDw8IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljU2xvdHMucHVzaChhID0+IHAuZHluYW1pY1Nsb3QoYSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZHJlc3NbZmFjZXQuaWRdID0gZHluYW1pY1Nsb3RzLmxlbmd0aCA8PCAxO1xuICAgICAgICAgICAgICAgIGR5bmFtaWNTbG90cy5wdXNoKGEgPT4gZHluYW1pY0ZhY2V0U2xvdChhLCBmYWNldCwgcHJvdmlkZXJzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGR5bmFtaWMgPSBkeW5hbWljU2xvdHMubWFwKGYgPT4gZihhZGRyZXNzKSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29uZmlndXJhdGlvbihiYXNlLCBuZXdDb21wYXJ0bWVudHMsIGR5bmFtaWMsIGFkZHJlc3MsIHN0YXRpY1ZhbHVlcywgZmFjZXRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBmbGF0dGVuKGV4dGVuc2lvbiwgY29tcGFydG1lbnRzLCBuZXdDb21wYXJ0bWVudHMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW1tdLCBbXSwgW10sIFtdLCBbXV07XG4gICAgbGV0IHNlZW4gPSBuZXcgTWFwKCk7XG4gICAgZnVuY3Rpb24gaW5uZXIoZXh0LCBwcmVjKSB7XG4gICAgICAgIGxldCBrbm93biA9IHNlZW4uZ2V0KGV4dCk7XG4gICAgICAgIGlmIChrbm93biAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoa25vd24gPD0gcHJlYylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgZm91bmQgPSByZXN1bHRba25vd25dLmluZGV4T2YoZXh0KTtcbiAgICAgICAgICAgIGlmIChmb3VuZCA+IC0xKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtrbm93bl0uc3BsaWNlKGZvdW5kLCAxKTtcbiAgICAgICAgICAgIGlmIChleHQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEluc3RhbmNlKVxuICAgICAgICAgICAgICAgIG5ld0NvbXBhcnRtZW50cy5kZWxldGUoZXh0LmNvbXBhcnRtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBzZWVuLnNldChleHQsIHByZWMpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleHQpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBlIG9mIGV4dClcbiAgICAgICAgICAgICAgICBpbm5lcihlLCBwcmVjKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEluc3RhbmNlKSB7XG4gICAgICAgICAgICBpZiAobmV3Q29tcGFydG1lbnRzLmhhcyhleHQuY29tcGFydG1lbnQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBEdXBsaWNhdGUgdXNlIG9mIGNvbXBhcnRtZW50IGluIGV4dGVuc2lvbnNgKTtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gY29tcGFydG1lbnRzLmdldChleHQuY29tcGFydG1lbnQpIHx8IGV4dC5pbm5lcjtcbiAgICAgICAgICAgIG5ld0NvbXBhcnRtZW50cy5zZXQoZXh0LmNvbXBhcnRtZW50LCBjb250ZW50KTtcbiAgICAgICAgICAgIGlubmVyKGNvbnRlbnQsIHByZWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4dCBpbnN0YW5jZW9mIFByZWNFeHRlbnNpb24pIHtcbiAgICAgICAgICAgIGlubmVyKGV4dC5pbm5lciwgZXh0LnByZWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4dCBpbnN0YW5jZW9mIFN0YXRlRmllbGQpIHtcbiAgICAgICAgICAgIHJlc3VsdFtwcmVjXS5wdXNoKGV4dCk7XG4gICAgICAgICAgICBpZiAoZXh0LnByb3ZpZGVzKVxuICAgICAgICAgICAgICAgIGlubmVyKGV4dC5wcm92aWRlcywgcHJlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0IGluc3RhbmNlb2YgRmFjZXRQcm92aWRlcikge1xuICAgICAgICAgICAgcmVzdWx0W3ByZWNdLnB1c2goZXh0KTtcbiAgICAgICAgICAgIGlmIChleHQuZmFjZXQuZXh0ZW5zaW9ucylcbiAgICAgICAgICAgICAgICBpbm5lcihleHQuZmFjZXQuZXh0ZW5zaW9ucywgUHJlY18uZGVmYXVsdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29udGVudCA9IGV4dC5leHRlbnNpb247XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgZXh0ZW5zaW9uIHZhbHVlIGluIGV4dGVuc2lvbiBzZXQgKCR7ZXh0fSkuIFRoaXMgc29tZXRpbWVzIGhhcHBlbnMgYmVjYXVzZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgQGNvZGVtaXJyb3Ivc3RhdGUgYXJlIGxvYWRlZCwgYnJlYWtpbmcgaW5zdGFuY2VvZiBjaGVja3MuYCk7XG4gICAgICAgICAgICBpbm5lcihjb250ZW50LCBwcmVjKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbm5lcihleHRlbnNpb24sIFByZWNfLmRlZmF1bHQpO1xuICAgIHJldHVybiByZXN1bHQucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSk7XG59XG5mdW5jdGlvbiBlbnN1cmVBZGRyKHN0YXRlLCBhZGRyKSB7XG4gICAgaWYgKGFkZHIgJiAxKVxuICAgICAgICByZXR1cm4gMiAvKiBTbG90U3RhdHVzLkNvbXB1dGVkICovO1xuICAgIGxldCBpZHggPSBhZGRyID4+IDE7XG4gICAgbGV0IHN0YXR1cyA9IHN0YXRlLnN0YXR1c1tpZHhdO1xuICAgIGlmIChzdGF0dXMgPT0gNCAvKiBTbG90U3RhdHVzLkNvbXB1dGluZyAqLylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ3ljbGljIGRlcGVuZGVuY3kgYmV0d2VlbiBmaWVsZHMgYW5kL29yIGZhY2V0c1wiKTtcbiAgICBpZiAoc3RhdHVzICYgMiAvKiBTbG90U3RhdHVzLkNvbXB1dGVkICovKVxuICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgIHN0YXRlLnN0YXR1c1tpZHhdID0gNCAvKiBTbG90U3RhdHVzLkNvbXB1dGluZyAqLztcbiAgICBsZXQgY2hhbmdlZCA9IHN0YXRlLmNvbXB1dGVTbG90KHN0YXRlLCBzdGF0ZS5jb25maWcuZHluYW1pY1Nsb3RzW2lkeF0pO1xuICAgIHJldHVybiBzdGF0ZS5zdGF0dXNbaWR4XSA9IDIgLyogU2xvdFN0YXR1cy5Db21wdXRlZCAqLyB8IGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBnZXRBZGRyKHN0YXRlLCBhZGRyKSB7XG4gICAgcmV0dXJuIGFkZHIgJiAxID8gc3RhdGUuY29uZmlnLnN0YXRpY1ZhbHVlc1thZGRyID4+IDFdIDogc3RhdGUudmFsdWVzW2FkZHIgPj4gMV07XG59XG5cbmNvbnN0IGxhbmd1YWdlRGF0YSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5zb21lKHYgPT4gdiksXG4gICAgc3RhdGljOiB0cnVlXG59KTtcbmNvbnN0IGxpbmVTZXBhcmF0b3IgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IHVuZGVmaW5lZCxcbiAgICBzdGF0aWM6IHRydWVcbn0pO1xuY29uc3QgY2hhbmdlRmlsdGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgdHJhbnNhY3Rpb25GaWx0ZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCB0cmFuc2FjdGlvbkV4dGVuZGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgcmVhZE9ubHkgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IGZhbHNlXG59KTtcblxuLyoqXG5Bbm5vdGF0aW9ucyBhcmUgdGFnZ2VkIHZhbHVlcyB0aGF0IGFyZSB1c2VkIHRvIGFkZCBtZXRhZGF0YSB0b1xudHJhbnNhY3Rpb25zIGluIGFuIGV4dGVuc2libGUgd2F5LiBUaGV5IHNob3VsZCBiZSB1c2VkIHRvIG1vZGVsXG50aGluZ3MgdGhhdCBlZmZlY3QgdGhlIGVudGlyZSB0cmFuc2FjdGlvbiAoc3VjaCBhcyBpdHMgW3RpbWVcbnN0YW1wXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uXnRpbWUpIG9yIGluZm9ybWF0aW9uIGFib3V0IGl0c1xuW29yaWdpbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbl51c2VyRXZlbnQpKS4gRm9yIGVmZmVjdHMgdGhhdCBoYXBwZW5cbl9hbG9uZ3NpZGVfIHRoZSBvdGhlciBjaGFuZ2VzIG1hZGUgYnkgdGhlIHRyYW5zYWN0aW9uLCBbc3RhdGVcbmVmZmVjdHNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3QpIGFyZSBtb3JlIGFwcHJvcHJpYXRlLlxuKi9cbmNsYXNzIEFubm90YXRpb24ge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGFubm90YXRpb24gdHlwZS5cbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBvZiB0aGlzIGFubm90YXRpb24uXG4gICAgKi9cbiAgICB2YWx1ZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIG5ldyB0eXBlIG9mIGFubm90YXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKCkgeyByZXR1cm4gbmV3IEFubm90YXRpb25UeXBlKCk7IH1cbn1cbi8qKlxuTWFya2VyIHRoYXQgaWRlbnRpZmllcyBhIHR5cGUgb2YgW2Fubm90YXRpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQW5ub3RhdGlvbikuXG4qL1xuY2xhc3MgQW5ub3RhdGlvblR5cGUge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGFubm90YXRpb24uXG4gICAgKi9cbiAgICBvZih2YWx1ZSkgeyByZXR1cm4gbmV3IEFubm90YXRpb24odGhpcywgdmFsdWUpOyB9XG59XG4vKipcblJlcHJlc2VudGF0aW9uIG9mIGEgdHlwZSBvZiBzdGF0ZSBlZmZlY3QuIERlZmluZWQgd2l0aFxuW2BTdGF0ZUVmZmVjdC5kZWZpbmVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0XmRlZmluZSkuXG4qL1xuY2xhc3MgU3RhdGVFZmZlY3RUeXBlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRoZSBgYW55YCB0eXBlcyBpbiB0aGVzZSBmdW5jdGlvbiB0eXBlcyBhcmUgdGhlcmUgdG8gd29ya1xuICAgIC8vIGFyb3VuZCBUeXBlU2NyaXB0IGlzc3VlICMzNzYzMSwgd2hlcmUgdGhlIHR5cGUgZ3VhcmQgb25cbiAgICAvLyBgU3RhdGVFZmZlY3QuaXNgIG15c3RlcmlvdXNseSBzdG9wcyB3b3JraW5nIHdoZW4gdGhlc2UgcHJvcGVybHlcbiAgICAvLyBoYXZlIHR5cGUgYFZhbHVlYC5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgW3N0YXRlIGVmZmVjdF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdCkgaW5zdGFuY2Ugb2YgdGhpc1xuICAgIHR5cGUuXG4gICAgKi9cbiAgICBvZih2YWx1ZSkgeyByZXR1cm4gbmV3IFN0YXRlRWZmZWN0KHRoaXMsIHZhbHVlKTsgfVxufVxuLyoqXG5TdGF0ZSBlZmZlY3RzIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhZGRpdGlvbmFsIGVmZmVjdHNcbmFzc29jaWF0ZWQgd2l0aCBhIFt0cmFuc2FjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5lZmZlY3RzKS4gVGhleVxuYXJlIG9mdGVuIHVzZWZ1bCB0byBtb2RlbCBjaGFuZ2VzIHRvIGN1c3RvbSBbc3RhdGVcbmZpZWxkc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUZpZWxkKSwgd2hlbiB0aG9zZSBjaGFuZ2VzIGFyZW4ndCBpbXBsaWNpdCBpblxuZG9jdW1lbnQgb3Igc2VsZWN0aW9uIGNoYW5nZXMuXG4qL1xuY2xhc3MgU3RhdGVFZmZlY3Qge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBUaGUgdmFsdWUgb2YgdGhpcyBlZmZlY3QuXG4gICAgKi9cbiAgICB2YWx1ZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIGVmZmVjdCB0aHJvdWdoIGEgcG9zaXRpb24gbWFwcGluZy4gV2lsbCByZXR1cm5cbiAgICBgdW5kZWZpbmVkYCB3aGVuIHRoYXQgZW5kcyB1cCBkZWxldGluZyB0aGUgZWZmZWN0LlxuICAgICovXG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IG1hcHBlZCA9IHRoaXMudHlwZS5tYXAodGhpcy52YWx1ZSwgbWFwcGluZyk7XG4gICAgICAgIHJldHVybiBtYXBwZWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG1hcHBlZCA9PSB0aGlzLnZhbHVlID8gdGhpcyA6IG5ldyBTdGF0ZUVmZmVjdCh0aGlzLnR5cGUsIG1hcHBlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlbGxzIHlvdSB3aGV0aGVyIHRoaXMgZWZmZWN0IG9iamVjdCBpcyBvZiBhIGdpdmVuXG4gICAgW3R5cGVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3RUeXBlKS5cbiAgICAqL1xuICAgIGlzKHR5cGUpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSB0eXBlOyB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbmV3IGVmZmVjdCB0eXBlLiBUaGUgdHlwZSBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSB0eXBlXG4gICAgb2YgdmFsdWVzIHRoYXQgaGlzIGVmZmVjdCBob2xkcy4gSXQgc2hvdWxkIGJlIGEgdHlwZSB0aGF0XG4gICAgZG9lc24ndCBpbmNsdWRlIGB1bmRlZmluZWRgLCBzaW5jZSB0aGF0IGlzIHVzZWQgaW5cbiAgICBbbWFwcGluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdC5tYXApIHRvIGluZGljYXRlIHRoYXQgYW4gZWZmZWN0IGlzXG4gICAgcmVtb3ZlZC5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlYyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RhdGVFZmZlY3RUeXBlKHNwZWMubWFwIHx8ICh2ID0+IHYpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIGFuIGFycmF5IG9mIGVmZmVjdHMgdGhyb3VnaCBhIGNoYW5nZSBzZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgbWFwRWZmZWN0cyhlZmZlY3RzLCBtYXBwaW5nKSB7XG4gICAgICAgIGlmICghZWZmZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZWZmZWN0cztcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgZWZmZWN0cykge1xuICAgICAgICAgICAgbGV0IG1hcHBlZCA9IGVmZmVjdC5tYXAobWFwcGluZyk7XG4gICAgICAgICAgICBpZiAobWFwcGVkKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG1hcHBlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcblRoaXMgZWZmZWN0IGNhbiBiZSB1c2VkIHRvIHJlY29uZmlndXJlIHRoZSByb290IGV4dGVuc2lvbnMgb2ZcbnRoZSBlZGl0b3IuIERvaW5nIHRoaXMgd2lsbCBkaXNjYXJkIGFueSBleHRlbnNpb25zXG5bYXBwZW5kZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3ReYXBwZW5kQ29uZmlnKSwgYnV0IGRvZXMgbm90IHJlc2V0XG50aGUgY29udGVudCBvZiBbcmVjb25maWd1cmVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNvbXBhcnRtZW50LnJlY29uZmlndXJlKVxuY29tcGFydG1lbnRzLlxuKi9cblN0YXRlRWZmZWN0LnJlY29uZmlndXJlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLyoqXG5BcHBlbmQgZXh0ZW5zaW9ucyB0byB0aGUgdG9wLWxldmVsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGVkaXRvci5cbiovXG5TdGF0ZUVmZmVjdC5hcHBlbmRDb25maWcgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4vKipcbkNoYW5nZXMgdG8gdGhlIGVkaXRvciBzdGF0ZSBhcmUgZ3JvdXBlZCBpbnRvIHRyYW5zYWN0aW9ucy5cblR5cGljYWxseSwgYSB1c2VyIGFjdGlvbiBjcmVhdGVzIGEgc2luZ2xlIHRyYW5zYWN0aW9uLCB3aGljaCBtYXlcbmNvbnRhaW4gYW55IG51bWJlciBvZiBkb2N1bWVudCBjaGFuZ2VzLCBtYXkgY2hhbmdlIHRoZSBzZWxlY3Rpb24sXG5vciBoYXZlIG90aGVyIGVmZmVjdHMuIENyZWF0ZSBhIHRyYW5zYWN0aW9uIGJ5IGNhbGxpbmdcbltgRWRpdG9yU3RhdGUudXBkYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpLCBvciBpbW1lZGlhdGVseVxuZGlzcGF0Y2ggb25lIGJ5IGNhbGxpbmdcbltgRWRpdG9yVmlldy5kaXNwYXRjaGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRpc3BhdGNoKS5cbiovXG5jbGFzcyBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXRlIGZyb20gd2hpY2ggdGhlIHRyYW5zYWN0aW9uIHN0YXJ0cy5cbiAgICAqL1xuICAgIHN0YXJ0U3RhdGUsIFxuICAgIC8qKlxuICAgIFRoZSBkb2N1bWVudCBjaGFuZ2VzIG1hZGUgYnkgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIGNoYW5nZXMsIFxuICAgIC8qKlxuICAgIFRoZSBzZWxlY3Rpb24gc2V0IGJ5IHRoaXMgdHJhbnNhY3Rpb24sIG9yIHVuZGVmaW5lZCBpZiBpdFxuICAgIGRvZXNuJ3QgZXhwbGljaXRseSBzZXQgYSBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBzZWxlY3Rpb24sIFxuICAgIC8qKlxuICAgIFRoZSBlZmZlY3RzIGFkZGVkIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIGVmZmVjdHMsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYW5ub3RhdGlvbnMsIFxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3IGFmdGVyIHRoaXNcbiAgICB0cmFuc2FjdGlvbiBpcyBkaXNwYXRjaGVkLlxuICAgICovXG4gICAgc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgdGhpcy5zdGFydFN0YXRlID0gc3RhcnRTdGF0ZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gY2hhbmdlcztcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMuZWZmZWN0cyA9IGVmZmVjdHM7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5zY3JvbGxJbnRvVmlldyA9IHNjcm9sbEludG9WaWV3O1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuX2RvYyA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fc3RhdGUgPSBudWxsO1xuICAgICAgICBpZiAoc2VsZWN0aW9uKVxuICAgICAgICAgICAgY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uLCBjaGFuZ2VzLm5ld0xlbmd0aCk7XG4gICAgICAgIGlmICghYW5ub3RhdGlvbnMuc29tZSgoYSkgPT4gYS50eXBlID09IFRyYW5zYWN0aW9uLnRpbWUpKVxuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zLmNvbmNhdChUcmFuc2FjdGlvbi50aW1lLm9mKERhdGUubm93KCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHN0YXJ0U3RhdGUsIGNoYW5nZXMsIHNlbGVjdGlvbiwgZWZmZWN0cywgYW5ub3RhdGlvbnMsIHNjcm9sbEludG9WaWV3KSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oc3RhcnRTdGF0ZSwgY2hhbmdlcywgc2VsZWN0aW9uLCBlZmZlY3RzLCBhbm5vdGF0aW9ucywgc2Nyb2xsSW50b1ZpZXcpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbmV3IGRvY3VtZW50IHByb2R1Y2VkIGJ5IHRoZSB0cmFuc2FjdGlvbi4gQ29udHJhcnkgdG9cbiAgICBbYC5zdGF0ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uc3RhdGUpYC5kb2NgLCBhY2Nlc3NpbmcgdGhpcyB3b24ndFxuICAgIGZvcmNlIHRoZSBlbnRpcmUgbmV3IHN0YXRlIHRvIGJlIGNvbXB1dGVkIHJpZ2h0IGF3YXksIHNvIGl0IGlzXG4gICAgcmVjb21tZW5kZWQgdGhhdCBbdHJhbnNhY3Rpb25cbiAgICBmaWx0ZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRyYW5zYWN0aW9uRmlsdGVyKSB1c2UgdGhpcyBnZXR0ZXJcbiAgICB3aGVuIHRoZXkgbmVlZCB0byBsb29rIGF0IHRoZSBuZXcgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXQgbmV3RG9jKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jIHx8ICh0aGlzLl9kb2MgPSB0aGlzLmNoYW5nZXMuYXBwbHkodGhpcy5zdGFydFN0YXRlLmRvYykpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbmV3IHNlbGVjdGlvbiBwcm9kdWNlZCBieSB0aGUgdHJhbnNhY3Rpb24uIElmXG4gICAgW2B0aGlzLnNlbGVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uc2VsZWN0aW9uKSBpcyB1bmRlZmluZWQsXG4gICAgdGhpcyB3aWxsIFttYXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU2VsZWN0aW9uLm1hcCkgdGhlIHN0YXJ0IHN0YXRlJ3NcbiAgICBjdXJyZW50IHNlbGVjdGlvbiB0aHJvdWdoIHRoZSBjaGFuZ2VzIG1hZGUgYnkgdGhlIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZ2V0IG5ld1NlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uIHx8IHRoaXMuc3RhcnRTdGF0ZS5zZWxlY3Rpb24ubWFwKHRoaXMuY2hhbmdlcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBuZXcgc3RhdGUgY3JlYXRlZCBieSB0aGUgdHJhbnNhY3Rpb24uIENvbXB1dGVkIG9uIGRlbWFuZFxuICAgIChidXQgcmV0YWluZWQgZm9yIHN1YnNlcXVlbnQgYWNjZXNzKSwgc28gaXQgaXMgcmVjb21tZW5kZWQgbm90IHRvXG4gICAgYWNjZXNzIGl0IGluIFt0cmFuc2FjdGlvblxuICAgIGZpbHRlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedHJhbnNhY3Rpb25GaWx0ZXIpIHdoZW4gcG9zc2libGUuXG4gICAgKi9cbiAgICBnZXQgc3RhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3RhdGUpXG4gICAgICAgICAgICB0aGlzLnN0YXJ0U3RhdGUuYXBwbHlUcmFuc2FjdGlvbih0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBhbm5vdGF0aW9uIHR5cGUsIGlmIGFueS5cbiAgICAqL1xuICAgIGFubm90YXRpb24odHlwZSkge1xuICAgICAgICBmb3IgKGxldCBhbm4gb2YgdGhpcy5hbm5vdGF0aW9ucylcbiAgICAgICAgICAgIGlmIChhbm4udHlwZSA9PSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBhbm4udmFsdWU7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiBjaGFuZ2VkIHRoZSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBkb2NDaGFuZ2VkKCkgeyByZXR1cm4gIXRoaXMuY2hhbmdlcy5lbXB0eTsgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJhbnNhY3Rpb24gcmVjb25maWd1cmVzIHRoZSBzdGF0ZVxuICAgICh0aHJvdWdoIGEgW2NvbmZpZ3VyYXRpb24gY29tcGFydG1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ29tcGFydG1lbnQpIG9yXG4gICAgd2l0aCBhIHRvcC1sZXZlbCBjb25maWd1cmF0aW9uXG4gICAgW2VmZmVjdF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdF5yZWNvbmZpZ3VyZSkuXG4gICAgKi9cbiAgICBnZXQgcmVjb25maWd1cmVkKCkgeyByZXR1cm4gdGhpcy5zdGFydFN0YXRlLmNvbmZpZyAhPSB0aGlzLnN0YXRlLmNvbmZpZzsgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNhY3Rpb24gaGFzIGEgW3VzZXJcbiAgICBldmVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbl51c2VyRXZlbnQpIGFubm90YXRpb24gdGhhdCBpcyBlcXVhbCB0b1xuICAgIG9yIG1vcmUgc3BlY2lmaWMgdGhhbiBgZXZlbnRgLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHRyYW5zYWN0aW9uXG4gICAgaGFzIGBcInNlbGVjdC5wb2ludGVyXCJgIGFzIHVzZXIgZXZlbnQsIGBcInNlbGVjdFwiYCBhbmRcbiAgICBgXCJzZWxlY3QucG9pbnRlclwiYCB3aWxsIG1hdGNoIGl0LlxuICAgICovXG4gICAgaXNVc2VyRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgbGV0IGUgPSB0aGlzLmFubm90YXRpb24oVHJhbnNhY3Rpb24udXNlckV2ZW50KTtcbiAgICAgICAgcmV0dXJuICEhKGUgJiYgKGUgPT0gZXZlbnQgfHwgZS5sZW5ndGggPiBldmVudC5sZW5ndGggJiYgZS5zbGljZSgwLCBldmVudC5sZW5ndGgpID09IGV2ZW50ICYmIGVbZXZlbnQubGVuZ3RoXSA9PSBcIi5cIikpO1xuICAgIH1cbn1cbi8qKlxuQW5ub3RhdGlvbiB1c2VkIHRvIHN0b3JlIHRyYW5zYWN0aW9uIHRpbWVzdGFtcHMuIEF1dG9tYXRpY2FsbHlcbmFkZGVkIHRvIGV2ZXJ5IHRyYW5zYWN0aW9uLCBob2xkaW5nIGBEYXRlLm5vdygpYC5cbiovXG5UcmFuc2FjdGlvbi50aW1lID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG4vKipcbkFubm90YXRpb24gdXNlZCB0byBhc3NvY2lhdGUgYSB0cmFuc2FjdGlvbiB3aXRoIGEgdXNlciBpbnRlcmZhY2VcbmV2ZW50LiBIb2xkcyBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgZXZlbnQsIHVzaW5nIGFcbmRvdC1zZXBhcmF0ZWQgZm9ybWF0IHRvIHN1cHBvcnQgYXR0YWNoaW5nIG1vcmUgc3BlY2lmaWNcbmluZm9ybWF0aW9uLiBUaGUgZXZlbnRzIHVzZWQgYnkgdGhlIGNvcmUgbGlicmFyaWVzIGFyZTpcblxuIC0gYFwiaW5wdXRcImAgd2hlbiBjb250ZW50IGlzIGVudGVyZWRcbiAgIC0gYFwiaW5wdXQudHlwZVwiYCBmb3IgdHlwZWQgaW5wdXRcbiAgICAgLSBgXCJpbnB1dC50eXBlLmNvbXBvc2VcImAgZm9yIGNvbXBvc2l0aW9uXG4gICAtIGBcImlucHV0LnBhc3RlXCJgIGZvciBwYXN0ZWQgaW5wdXRcbiAgIC0gYFwiaW5wdXQuZHJvcFwiYCB3aGVuIGFkZGluZyBjb250ZW50IHdpdGggZHJhZy1hbmQtZHJvcFxuICAgLSBgXCJpbnB1dC5jb21wbGV0ZVwiYCB3aGVuIGF1dG9jb21wbGV0aW5nXG4gLSBgXCJkZWxldGVcImAgd2hlbiB0aGUgdXNlciBkZWxldGVzIGNvbnRlbnRcbiAgIC0gYFwiZGVsZXRlLnNlbGVjdGlvblwiYCB3aGVuIGRlbGV0aW5nIHRoZSBzZWxlY3Rpb25cbiAgIC0gYFwiZGVsZXRlLmZvcndhcmRcImAgd2hlbiBkZWxldGluZyBmb3J3YXJkIGZyb20gdGhlIHNlbGVjdGlvblxuICAgLSBgXCJkZWxldGUuYmFja3dhcmRcImAgd2hlbiBkZWxldGluZyBiYWNrd2FyZCBmcm9tIHRoZSBzZWxlY3Rpb25cbiAgIC0gYFwiZGVsZXRlLmN1dFwiYCB3aGVuIGN1dHRpbmcgdG8gdGhlIGNsaXBib2FyZFxuIC0gYFwibW92ZVwiYCB3aGVuIGNvbnRlbnQgaXMgbW92ZWRcbiAgIC0gYFwibW92ZS5kcm9wXCJgIHdoZW4gY29udGVudCBpcyBtb3ZlZCB3aXRoaW4gdGhlIGVkaXRvciB0aHJvdWdoIGRyYWctYW5kLWRyb3BcbiAtIGBcInNlbGVjdFwiYCB3aGVuIGV4cGxpY2l0bHkgY2hhbmdpbmcgdGhlIHNlbGVjdGlvblxuICAgLSBgXCJzZWxlY3QucG9pbnRlclwiYCB3aGVuIHNlbGVjdGluZyB3aXRoIGEgbW91c2Ugb3Igb3RoZXIgcG9pbnRpbmcgZGV2aWNlXG4gLSBgXCJ1bmRvXCJgIGFuZCBgXCJyZWRvXCJgIGZvciBoaXN0b3J5IGFjdGlvbnNcblxuVXNlIFtgaXNVc2VyRXZlbnRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLmlzVXNlckV2ZW50KSB0byBjaGVja1xud2hldGhlciB0aGUgYW5ub3RhdGlvbiBtYXRjaGVzIGEgZ2l2ZW4gZXZlbnQuXG4qL1xuVHJhbnNhY3Rpb24udXNlckV2ZW50ID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG4vKipcbkFubm90YXRpb24gaW5kaWNhdGluZyB3aGV0aGVyIGEgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFkZGVkIHRvXG50aGUgdW5kbyBoaXN0b3J5IG9yIG5vdC5cbiovXG5UcmFuc2FjdGlvbi5hZGRUb0hpc3RvcnkgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbi8qKlxuQW5ub3RhdGlvbiBpbmRpY2F0aW5nICh3aGVuIHByZXNlbnQgYW5kIHRydWUpIHRoYXQgYSB0cmFuc2FjdGlvblxucmVwcmVzZW50cyBhIGNoYW5nZSBtYWRlIGJ5IHNvbWUgb3RoZXIgYWN0b3IsIG5vdCB0aGUgdXNlci4gVGhpc1xuaXMgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHRhZyBvdGhlciBwZW9wbGUncyBjaGFuZ2VzIGluXG5jb2xsYWJvcmF0aXZlIGVkaXRpbmcuXG4qL1xuVHJhbnNhY3Rpb24ucmVtb3RlID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG5mdW5jdGlvbiBqb2luUmFuZ2VzKGEsIGIpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaUEgPSAwLCBpQiA9IDA7Oykge1xuICAgICAgICBsZXQgZnJvbSwgdG87XG4gICAgICAgIGlmIChpQSA8IGEubGVuZ3RoICYmIChpQiA9PSBiLmxlbmd0aCB8fCBiW2lCXSA+PSBhW2lBXSkpIHtcbiAgICAgICAgICAgIGZyb20gPSBhW2lBKytdO1xuICAgICAgICAgICAgdG8gPSBhW2lBKytdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlCIDwgYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZyb20gPSBiW2lCKytdO1xuICAgICAgICAgICAgdG8gPSBiW2lCKytdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCB8fCByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdIDwgZnJvbSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyb20sIHRvKTtcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA8IHRvKVxuICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IHRvO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1lcmdlVHJhbnNhY3Rpb24oYSwgYiwgc2VxdWVudGlhbCkge1xuICAgIHZhciBfYTtcbiAgICBsZXQgbWFwRm9yQSwgbWFwRm9yQiwgY2hhbmdlcztcbiAgICBpZiAoc2VxdWVudGlhbCkge1xuICAgICAgICBtYXBGb3JBID0gYi5jaGFuZ2VzO1xuICAgICAgICBtYXBGb3JCID0gQ2hhbmdlU2V0LmVtcHR5KGIuY2hhbmdlcy5sZW5ndGgpO1xuICAgICAgICBjaGFuZ2VzID0gYS5jaGFuZ2VzLmNvbXBvc2UoYi5jaGFuZ2VzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG1hcEZvckEgPSBiLmNoYW5nZXMubWFwKGEuY2hhbmdlcyk7XG4gICAgICAgIG1hcEZvckIgPSBhLmNoYW5nZXMubWFwRGVzYyhiLmNoYW5nZXMsIHRydWUpO1xuICAgICAgICBjaGFuZ2VzID0gYS5jaGFuZ2VzLmNvbXBvc2UobWFwRm9yQSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZXMsXG4gICAgICAgIHNlbGVjdGlvbjogYi5zZWxlY3Rpb24gPyBiLnNlbGVjdGlvbi5tYXAobWFwRm9yQikgOiAoX2EgPSBhLnNlbGVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcChtYXBGb3JBKSxcbiAgICAgICAgZWZmZWN0czogU3RhdGVFZmZlY3QubWFwRWZmZWN0cyhhLmVmZmVjdHMsIG1hcEZvckEpLmNvbmNhdChTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGIuZWZmZWN0cywgbWFwRm9yQikpLFxuICAgICAgICBhbm5vdGF0aW9uczogYS5hbm5vdGF0aW9ucy5sZW5ndGggPyBhLmFubm90YXRpb25zLmNvbmNhdChiLmFubm90YXRpb25zKSA6IGIuYW5ub3RhdGlvbnMsXG4gICAgICAgIHNjcm9sbEludG9WaWV3OiBhLnNjcm9sbEludG9WaWV3IHx8IGIuc2Nyb2xsSW50b1ZpZXdcbiAgICB9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zYWN0aW9uSW5uZXIoc3RhdGUsIHNwZWMsIGRvY1NpemUpIHtcbiAgICBsZXQgc2VsID0gc3BlYy5zZWxlY3Rpb24sIGFubm90YXRpb25zID0gYXNBcnJheShzcGVjLmFubm90YXRpb25zKTtcbiAgICBpZiAoc3BlYy51c2VyRXZlbnQpXG4gICAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuY29uY2F0KFRyYW5zYWN0aW9uLnVzZXJFdmVudC5vZihzcGVjLnVzZXJFdmVudCkpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZXM6IHNwZWMuY2hhbmdlcyBpbnN0YW5jZW9mIENoYW5nZVNldCA/IHNwZWMuY2hhbmdlc1xuICAgICAgICAgICAgOiBDaGFuZ2VTZXQub2Yoc3BlYy5jaGFuZ2VzIHx8IFtdLCBkb2NTaXplLCBzdGF0ZS5mYWNldChsaW5lU2VwYXJhdG9yKSksXG4gICAgICAgIHNlbGVjdGlvbjogc2VsICYmIChzZWwgaW5zdGFuY2VvZiBFZGl0b3JTZWxlY3Rpb24gPyBzZWwgOiBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKHNlbC5hbmNob3IsIHNlbC5oZWFkKSksXG4gICAgICAgIGVmZmVjdHM6IGFzQXJyYXkoc3BlYy5lZmZlY3RzKSxcbiAgICAgICAgYW5ub3RhdGlvbnMsXG4gICAgICAgIHNjcm9sbEludG9WaWV3OiAhIXNwZWMuc2Nyb2xsSW50b1ZpZXdcbiAgICB9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zYWN0aW9uKHN0YXRlLCBzcGVjcywgZmlsdGVyKSB7XG4gICAgbGV0IHMgPSByZXNvbHZlVHJhbnNhY3Rpb25Jbm5lcihzdGF0ZSwgc3BlY3MubGVuZ3RoID8gc3BlY3NbMF0gOiB7fSwgc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgaWYgKHNwZWNzLmxlbmd0aCAmJiBzcGVjc1swXS5maWx0ZXIgPT09IGZhbHNlKVxuICAgICAgICBmaWx0ZXIgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNwZWNzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzcGVjc1tpXS5maWx0ZXIgPT09IGZhbHNlKVxuICAgICAgICAgICAgZmlsdGVyID0gZmFsc2U7XG4gICAgICAgIGxldCBzZXEgPSAhIXNwZWNzW2ldLnNlcXVlbnRpYWw7XG4gICAgICAgIHMgPSBtZXJnZVRyYW5zYWN0aW9uKHMsIHJlc29sdmVUcmFuc2FjdGlvbklubmVyKHN0YXRlLCBzcGVjc1tpXSwgc2VxID8gcy5jaGFuZ2VzLm5ld0xlbmd0aCA6IHN0YXRlLmRvYy5sZW5ndGgpLCBzZXEpO1xuICAgIH1cbiAgICBsZXQgdHIgPSBUcmFuc2FjdGlvbi5jcmVhdGUoc3RhdGUsIHMuY2hhbmdlcywgcy5zZWxlY3Rpb24sIHMuZWZmZWN0cywgcy5hbm5vdGF0aW9ucywgcy5zY3JvbGxJbnRvVmlldyk7XG4gICAgcmV0dXJuIGV4dGVuZFRyYW5zYWN0aW9uKGZpbHRlciA/IGZpbHRlclRyYW5zYWN0aW9uKHRyKSA6IHRyKTtcbn1cbi8vIEZpbmlzaCBhIHRyYW5zYWN0aW9uIGJ5IGFwcGx5aW5nIGZpbHRlcnMgaWYgbmVjZXNzYXJ5LlxuZnVuY3Rpb24gZmlsdGVyVHJhbnNhY3Rpb24odHIpIHtcbiAgICBsZXQgc3RhdGUgPSB0ci5zdGFydFN0YXRlO1xuICAgIC8vIENoYW5nZSBmaWx0ZXJzXG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZm9yIChsZXQgZmlsdGVyIG9mIHN0YXRlLmZhY2V0KGNoYW5nZUZpbHRlcikpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZmlsdGVyKHRyKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgPT09IHRydWUgPyB2YWx1ZSA6IGpvaW5SYW5nZXMocmVzdWx0LCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgbGV0IGNoYW5nZXMsIGJhY2s7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBiYWNrID0gdHIuY2hhbmdlcy5pbnZlcnRlZERlc2M7XG4gICAgICAgICAgICBjaGFuZ2VzID0gQ2hhbmdlU2V0LmVtcHR5KHN0YXRlLmRvYy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZpbHRlcmVkID0gdHIuY2hhbmdlcy5maWx0ZXIocmVzdWx0KTtcbiAgICAgICAgICAgIGNoYW5nZXMgPSBmaWx0ZXJlZC5jaGFuZ2VzO1xuICAgICAgICAgICAgYmFjayA9IGZpbHRlcmVkLmZpbHRlcmVkLm1hcERlc2MoZmlsdGVyZWQuY2hhbmdlcykuaW52ZXJ0ZWREZXNjO1xuICAgICAgICB9XG4gICAgICAgIHRyID0gVHJhbnNhY3Rpb24uY3JlYXRlKHN0YXRlLCBjaGFuZ2VzLCB0ci5zZWxlY3Rpb24gJiYgdHIuc2VsZWN0aW9uLm1hcChiYWNrKSwgU3RhdGVFZmZlY3QubWFwRWZmZWN0cyh0ci5lZmZlY3RzLCBiYWNrKSwgdHIuYW5ub3RhdGlvbnMsIHRyLnNjcm9sbEludG9WaWV3KTtcbiAgICB9XG4gICAgLy8gVHJhbnNhY3Rpb24gZmlsdGVyc1xuICAgIGxldCBmaWx0ZXJzID0gc3RhdGUuZmFjZXQodHJhbnNhY3Rpb25GaWx0ZXIpO1xuICAgIGZvciAobGV0IGkgPSBmaWx0ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGxldCBmaWx0ZXJlZCA9IGZpbHRlcnNbaV0odHIpO1xuICAgICAgICBpZiAoZmlsdGVyZWQgaW5zdGFuY2VvZiBUcmFuc2FjdGlvbilcbiAgICAgICAgICAgIHRyID0gZmlsdGVyZWQ7XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyZWQpICYmIGZpbHRlcmVkLmxlbmd0aCA9PSAxICYmIGZpbHRlcmVkWzBdIGluc3RhbmNlb2YgVHJhbnNhY3Rpb24pXG4gICAgICAgICAgICB0ciA9IGZpbHRlcmVkWzBdO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ciA9IHJlc29sdmVUcmFuc2FjdGlvbihzdGF0ZSwgYXNBcnJheShmaWx0ZXJlZCksIGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyO1xufVxuZnVuY3Rpb24gZXh0ZW5kVHJhbnNhY3Rpb24odHIpIHtcbiAgICBsZXQgc3RhdGUgPSB0ci5zdGFydFN0YXRlLCBleHRlbmRlcnMgPSBzdGF0ZS5mYWNldCh0cmFuc2FjdGlvbkV4dGVuZGVyKSwgc3BlYyA9IHRyO1xuICAgIGZvciAobGV0IGkgPSBleHRlbmRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IGV4dGVuc2lvbiA9IGV4dGVuZGVyc1tpXSh0cik7XG4gICAgICAgIGlmIChleHRlbnNpb24gJiYgT2JqZWN0LmtleXMoZXh0ZW5zaW9uKS5sZW5ndGgpXG4gICAgICAgICAgICBzcGVjID0gbWVyZ2VUcmFuc2FjdGlvbihzcGVjLCByZXNvbHZlVHJhbnNhY3Rpb25Jbm5lcihzdGF0ZSwgZXh0ZW5zaW9uLCB0ci5jaGFuZ2VzLm5ld0xlbmd0aCksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gc3BlYyA9PSB0ciA/IHRyIDogVHJhbnNhY3Rpb24uY3JlYXRlKHN0YXRlLCB0ci5jaGFuZ2VzLCB0ci5zZWxlY3Rpb24sIHNwZWMuZWZmZWN0cywgc3BlYy5hbm5vdGF0aW9ucywgc3BlYy5zY3JvbGxJbnRvVmlldyk7XG59XG5jb25zdCBub25lID0gW107XG5mdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBub25lIDogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbi8qKlxuVGhlIGNhdGVnb3JpZXMgcHJvZHVjZWQgYnkgYSBbY2hhcmFjdGVyXG5jYXRlZ29yaXplcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIpLiBUaGVzZSBhcmUgdXNlZFxuZG8gdGhpbmdzIGxpa2Ugc2VsZWN0aW5nIGJ5IHdvcmQuXG4qL1xudmFyIENoYXJDYXRlZ29yeSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKENoYXJDYXRlZ29yeSkge1xuICAgIC8qKlxuICAgIFdvcmQgY2hhcmFjdGVycy5cbiAgICAqL1xuICAgIENoYXJDYXRlZ29yeVtDaGFyQ2F0ZWdvcnlbXCJXb3JkXCJdID0gMF0gPSBcIldvcmRcIjtcbiAgICAvKipcbiAgICBXaGl0ZXNwYWNlLlxuICAgICovXG4gICAgQ2hhckNhdGVnb3J5W0NoYXJDYXRlZ29yeVtcIlNwYWNlXCJdID0gMV0gPSBcIlNwYWNlXCI7XG4gICAgLyoqXG4gICAgQW55dGhpbmcgZWxzZS5cbiAgICAqL1xuICAgIENoYXJDYXRlZ29yeVtDaGFyQ2F0ZWdvcnlbXCJPdGhlclwiXSA9IDJdID0gXCJPdGhlclwiO1xucmV0dXJuIENoYXJDYXRlZ29yeX0pKENoYXJDYXRlZ29yeSB8fCAoQ2hhckNhdGVnb3J5ID0ge30pKTtcbmNvbnN0IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyID0gL1tcXHUwMGRmXFx1MDU4N1xcdTA1OTAtXFx1MDVmNFxcdTA2MDAtXFx1MDZmZlxcdTMwNDAtXFx1MzA5ZlxcdTMwYTAtXFx1MzBmZlxcdTM0MDAtXFx1NGRiNVxcdTRlMDAtXFx1OWZjY1xcdWFjMDAtXFx1ZDdhZl0vO1xubGV0IHdvcmRDaGFyO1xudHJ5IHtcbiAgICB3b3JkQ2hhciA9IC8qQF9fUFVSRV9fKi9uZXcgUmVnRXhwKFwiW1xcXFxwe0FscGhhYmV0aWN9XFxcXHB7TnVtYmVyfV9dXCIsIFwidVwiKTtcbn1cbmNhdGNoIChfKSB7IH1cbmZ1bmN0aW9uIGhhc1dvcmRDaGFyKHN0cikge1xuICAgIGlmICh3b3JkQ2hhcilcbiAgICAgICAgcmV0dXJuIHdvcmRDaGFyLnRlc3Qoc3RyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2ggPSBzdHJbaV07XG4gICAgICAgIGlmICgvXFx3Ly50ZXN0KGNoKSB8fCBjaCA+IFwiXFx4ODBcIiAmJiAoY2gudG9VcHBlckNhc2UoKSAhPSBjaC50b0xvd2VyQ2FzZSgpIHx8IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyLnRlc3QoY2gpKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBtYWtlQ2F0ZWdvcml6ZXIod29yZENoYXJzKSB7XG4gICAgcmV0dXJuIChjaGFyKSA9PiB7XG4gICAgICAgIGlmICghL1xcUy8udGVzdChjaGFyKSlcbiAgICAgICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuU3BhY2U7XG4gICAgICAgIGlmIChoYXNXb3JkQ2hhcihjaGFyKSlcbiAgICAgICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuV29yZDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3JkQ2hhcnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoY2hhci5pbmRleE9mKHdvcmRDaGFyc1tpXSkgPiAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2hhckNhdGVnb3J5LldvcmQ7XG4gICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuT3RoZXI7XG4gICAgfTtcbn1cblxuLyoqXG5UaGUgZWRpdG9yIHN0YXRlIGNsYXNzIGlzIGEgcGVyc2lzdGVudCAoaW1tdXRhYmxlKSBkYXRhIHN0cnVjdHVyZS5cblRvIHVwZGF0ZSBhIHN0YXRlLCB5b3UgW2NyZWF0ZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpIGFcblt0cmFuc2FjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbiksIHdoaWNoIHByb2R1Y2VzIGEgX25ld18gc3RhdGVcbmluc3RhbmNlLCB3aXRob3V0IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuXG5BcyBzdWNoLCBfbmV2ZXJfIG11dGF0ZSBwcm9wZXJ0aWVzIG9mIGEgc3RhdGUgZGlyZWN0bHkuIFRoYXQnbGxcbmp1c3QgYnJlYWsgdGhpbmdzLlxuKi9cbmNsYXNzIEVkaXRvclN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbmZpZywgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBkb2MsIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIHNlbGVjdGlvbiwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB2YWx1ZXMsIGNvbXB1dGVTbG90LCB0cikge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBjb25maWcuc3RhdHVzVGVtcGxhdGUuc2xpY2UoKTtcbiAgICAgICAgdGhpcy5jb21wdXRlU2xvdCA9IGNvbXB1dGVTbG90O1xuICAgICAgICAvLyBGaWxsIGluIHRoZSBjb21wdXRlZCBzdGF0ZSBpbW1lZGlhdGVseSwgc28gdGhhdCBmdXJ0aGVyIHF1ZXJpZXNcbiAgICAgICAgLy8gZm9yIGl0IG1hZGUgZHVyaW5nIHRoZSB1cGRhdGUgcmV0dXJuIHRoaXMgc3RhdGVcbiAgICAgICAgaWYgKHRyKVxuICAgICAgICAgICAgdHIuX3N0YXRlID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmZpZy5keW5hbWljU2xvdHMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBlbnN1cmVBZGRyKHRoaXMsIGkgPDwgMSk7XG4gICAgICAgIHRoaXMuY29tcHV0ZVNsb3QgPSBudWxsO1xuICAgIH1cbiAgICBmaWVsZChmaWVsZCwgcmVxdWlyZSA9IHRydWUpIHtcbiAgICAgICAgbGV0IGFkZHIgPSB0aGlzLmNvbmZpZy5hZGRyZXNzW2ZpZWxkLmlkXTtcbiAgICAgICAgaWYgKGFkZHIgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJGaWVsZCBpcyBub3QgcHJlc2VudCBpbiB0aGlzIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbnN1cmVBZGRyKHRoaXMsIGFkZHIpO1xuICAgICAgICByZXR1cm4gZ2V0QWRkcih0aGlzLCBhZGRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgW3RyYW5zYWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uKSB0aGF0IHVwZGF0ZXMgdGhpc1xuICAgIHN0YXRlLiBBbnkgbnVtYmVyIG9mIFt0cmFuc2FjdGlvbiBzcGVjc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMpXG4gICAgY2FuIGJlIHBhc3NlZC4gVW5sZXNzXG4gICAgW2BzZXF1ZW50aWFsYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuc2VxdWVudGlhbCkgaXMgc2V0LCB0aGVcbiAgICBbY2hhbmdlc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuY2hhbmdlcykgKGlmIGFueSkgb2YgZWFjaCBzcGVjXG4gICAgYXJlIGFzc3VtZWQgdG8gc3RhcnQgaW4gdGhlIF9jdXJyZW50XyBkb2N1bWVudCAobm90IHRoZSBkb2N1bWVudFxuICAgIHByb2R1Y2VkIGJ5IHByZXZpb3VzIHNwZWNzKSwgYW5kIGl0c1xuICAgIFtzZWxlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLnNlbGVjdGlvbikgYW5kXG4gICAgW2VmZmVjdHNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpIGFyZSBhc3N1bWVkIHRvIHJlZmVyXG4gICAgdG8gdGhlIGRvY3VtZW50IGNyZWF0ZWQgYnkgaXRzIF9vd25fIGNoYW5nZXMuIFRoZSByZXN1bHRpbmdcbiAgICB0cmFuc2FjdGlvbiBjb250YWlucyB0aGUgY29tYmluZWQgZWZmZWN0IG9mIGFsbCB0aGUgZGlmZmVyZW50XG4gICAgc3BlY3MuIEZvciBbc2VsZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5zZWxlY3Rpb24pLCBsYXRlclxuICAgIHNwZWNzIHRha2UgcHJlY2VkZW5jZSBvdmVyIGVhcmxpZXIgb25lcy5cbiAgICAqL1xuICAgIHVwZGF0ZSguLi5zcGVjcykge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZVRyYW5zYWN0aW9uKHRoaXMsIHNwZWNzLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhcHBseVRyYW5zYWN0aW9uKHRyKSB7XG4gICAgICAgIGxldCBjb25mID0gdGhpcy5jb25maWcsIHsgYmFzZSwgY29tcGFydG1lbnRzIH0gPSBjb25mO1xuICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgdHIuZWZmZWN0cykge1xuICAgICAgICAgICAgaWYgKGVmZmVjdC5pcyhDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZikge1xuICAgICAgICAgICAgICAgICAgICBjb21wYXJ0bWVudHMgPSBuZXcgTWFwO1xuICAgICAgICAgICAgICAgICAgICBjb25mLmNvbXBhcnRtZW50cy5mb3JFYWNoKCh2YWwsIGtleSkgPT4gY29tcGFydG1lbnRzLnNldChrZXksIHZhbCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25mID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcGFydG1lbnRzLnNldChlZmZlY3QudmFsdWUuY29tcGFydG1lbnQsIGVmZmVjdC52YWx1ZS5leHRlbnNpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZWZmZWN0LmlzKFN0YXRlRWZmZWN0LnJlY29uZmlndXJlKSkge1xuICAgICAgICAgICAgICAgIGNvbmYgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJhc2UgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlZmZlY3QuaXMoU3RhdGVFZmZlY3QuYXBwZW5kQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbmYgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJhc2UgPSBhc0FycmF5KGJhc2UpLmNvbmNhdChlZmZlY3QudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydFZhbHVlcztcbiAgICAgICAgaWYgKCFjb25mKSB7XG4gICAgICAgICAgICBjb25mID0gQ29uZmlndXJhdGlvbi5yZXNvbHZlKGJhc2UsIGNvbXBhcnRtZW50cywgdGhpcyk7XG4gICAgICAgICAgICBsZXQgaW50ZXJtZWRpYXRlU3RhdGUgPSBuZXcgRWRpdG9yU3RhdGUoY29uZiwgdGhpcy5kb2MsIHRoaXMuc2VsZWN0aW9uLCBjb25mLmR5bmFtaWNTbG90cy5tYXAoKCkgPT4gbnVsbCksIChzdGF0ZSwgc2xvdCkgPT4gc2xvdC5yZWNvbmZpZ3VyZShzdGF0ZSwgdGhpcyksIG51bGwpO1xuICAgICAgICAgICAgc3RhcnRWYWx1ZXMgPSBpbnRlcm1lZGlhdGVTdGF0ZS52YWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydFZhbHVlcyA9IHRyLnN0YXJ0U3RhdGUudmFsdWVzLnNsaWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IHRyLnN0YXJ0U3RhdGUuZmFjZXQoYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMpID8gdHIubmV3U2VsZWN0aW9uIDogdHIubmV3U2VsZWN0aW9uLmFzU2luZ2xlKCk7XG4gICAgICAgIG5ldyBFZGl0b3JTdGF0ZShjb25mLCB0ci5uZXdEb2MsIHNlbGVjdGlvbiwgc3RhcnRWYWx1ZXMsIChzdGF0ZSwgc2xvdCkgPT4gc2xvdC51cGRhdGUoc3RhdGUsIHRyKSwgdHIpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbdHJhbnNhY3Rpb24gc3BlY10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMpIHRoYXRcbiAgICByZXBsYWNlcyBldmVyeSBzZWxlY3Rpb24gcmFuZ2Ugd2l0aCB0aGUgZ2l2ZW4gY29udGVudC5cbiAgICAqL1xuICAgIHJlcGxhY2VTZWxlY3Rpb24odGV4dCkge1xuICAgICAgICBpZiAodHlwZW9mIHRleHQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHRleHQgPSB0aGlzLnRvVGV4dCh0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlQnlSYW5nZShyYW5nZSA9PiAoeyBjaGFuZ2VzOiB7IGZyb206IHJhbmdlLmZyb20sIHRvOiByYW5nZS50bywgaW5zZXJ0OiB0ZXh0IH0sXG4gICAgICAgICAgICByYW5nZTogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyYW5nZS5mcm9tICsgdGV4dC5sZW5ndGgpIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IG9mIGNoYW5nZXMgYW5kIGEgbmV3IHNlbGVjdGlvbiBieSBydW5uaW5nIHRoZSBnaXZlblxuICAgIGZ1bmN0aW9uIGZvciBlYWNoIHJhbmdlIGluIHRoZSBhY3RpdmUgc2VsZWN0aW9uLiBUaGUgZnVuY3Rpb25cbiAgICBjYW4gcmV0dXJuIGFuIG9wdGlvbmFsIHNldCBvZiBjaGFuZ2VzIChpbiB0aGUgY29vcmRpbmF0ZSBzcGFjZVxuICAgIG9mIHRoZSBzdGFydCBkb2N1bWVudCksIHBsdXMgYW4gdXBkYXRlZCByYW5nZSAoaW4gdGhlIGNvb3JkaW5hdGVcbiAgICBzcGFjZSBvZiB0aGUgZG9jdW1lbnQgcHJvZHVjZWQgYnkgdGhlIGNhbGwncyBvd24gY2hhbmdlcykuIFRoaXNcbiAgICBtZXRob2Qgd2lsbCBtZXJnZSBhbGwgdGhlIGNoYW5nZXMgYW5kIHJhbmdlcyBpbnRvIGEgc2luZ2xlXG4gICAgY2hhbmdlc2V0IGFuZCBzZWxlY3Rpb24sIGFuZCByZXR1cm4gaXQgYXMgYSBbdHJhbnNhY3Rpb25cbiAgICBzcGVjXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYyksIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG9cbiAgICBbYHVwZGF0ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUudXBkYXRlKS5cbiAgICAqL1xuICAgIGNoYW5nZUJ5UmFuZ2UoZikge1xuICAgICAgICBsZXQgc2VsID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICAgIGxldCByZXN1bHQxID0gZihzZWwucmFuZ2VzWzBdKTtcbiAgICAgICAgbGV0IGNoYW5nZXMgPSB0aGlzLmNoYW5nZXMocmVzdWx0MS5jaGFuZ2VzKSwgcmFuZ2VzID0gW3Jlc3VsdDEucmFuZ2VdO1xuICAgICAgICBsZXQgZWZmZWN0cyA9IGFzQXJyYXkocmVzdWx0MS5lZmZlY3RzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZihzZWwucmFuZ2VzW2ldKTtcbiAgICAgICAgICAgIGxldCBuZXdDaGFuZ2VzID0gdGhpcy5jaGFuZ2VzKHJlc3VsdC5jaGFuZ2VzKSwgbmV3TWFwcGVkID0gbmV3Q2hhbmdlcy5tYXAoY2hhbmdlcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGk7IGorKylcbiAgICAgICAgICAgICAgICByYW5nZXNbal0gPSByYW5nZXNbal0ubWFwKG5ld01hcHBlZCk7XG4gICAgICAgICAgICBsZXQgbWFwQnkgPSBjaGFuZ2VzLm1hcERlc2MobmV3Q2hhbmdlcywgdHJ1ZSk7XG4gICAgICAgICAgICByYW5nZXMucHVzaChyZXN1bHQucmFuZ2UubWFwKG1hcEJ5KSk7XG4gICAgICAgICAgICBjaGFuZ2VzID0gY2hhbmdlcy5jb21wb3NlKG5ld01hcHBlZCk7XG4gICAgICAgICAgICBlZmZlY3RzID0gU3RhdGVFZmZlY3QubWFwRWZmZWN0cyhlZmZlY3RzLCBuZXdNYXBwZWQpLmNvbmNhdChTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGFzQXJyYXkocmVzdWx0LmVmZmVjdHMpLCBtYXBCeSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGFuZ2VzLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcywgc2VsLm1haW5JbmRleCksXG4gICAgICAgICAgICBlZmZlY3RzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIFtjaGFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZVNldCkgZnJvbSB0aGUgZ2l2ZW4gY2hhbmdlXG4gICAgZGVzY3JpcHRpb24sIHRha2luZyB0aGUgc3RhdGUncyBkb2N1bWVudCBsZW5ndGggYW5kIGxpbmVcbiAgICBzZXBhcmF0b3IgaW50byBhY2NvdW50LlxuICAgICovXG4gICAgY2hhbmdlcyhzcGVjID0gW10pIHtcbiAgICAgICAgaWYgKHNwZWMgaW5zdGFuY2VvZiBDaGFuZ2VTZXQpXG4gICAgICAgICAgICByZXR1cm4gc3BlYztcbiAgICAgICAgcmV0dXJuIENoYW5nZVNldC5vZihzcGVjLCB0aGlzLmRvYy5sZW5ndGgsIHRoaXMuZmFjZXQoRWRpdG9yU3RhdGUubGluZVNlcGFyYXRvcikpO1xuICAgIH1cbiAgICAvKipcbiAgICBVc2luZyB0aGUgc3RhdGUncyBbbGluZVxuICAgIHNlcGFyYXRvcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5saW5lU2VwYXJhdG9yKSwgY3JlYXRlIGFcbiAgICBbYFRleHRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHQpIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIHN0cmluZy5cbiAgICAqL1xuICAgIHRvVGV4dChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIFRleHQub2Yoc3RyaW5nLnNwbGl0KHRoaXMuZmFjZXQoRWRpdG9yU3RhdGUubGluZVNlcGFyYXRvcikgfHwgRGVmYXVsdFNwbGl0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGRvY3VtZW50IGFzIGEgc3RyaW5nLlxuICAgICovXG4gICAgc2xpY2VEb2MoZnJvbSA9IDAsIHRvID0gdGhpcy5kb2MubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5zbGljZVN0cmluZyhmcm9tLCB0bywgdGhpcy5saW5lQnJlYWspO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIGEgc3RhdGUgW2ZhY2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkZhY2V0KS5cbiAgICAqL1xuICAgIGZhY2V0KGZhY2V0KSB7XG4gICAgICAgIGxldCBhZGRyID0gdGhpcy5jb25maWcuYWRkcmVzc1tmYWNldC5pZF07XG4gICAgICAgIGlmIChhZGRyID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gZmFjZXQuZGVmYXVsdDtcbiAgICAgICAgZW5zdXJlQWRkcih0aGlzLCBhZGRyKTtcbiAgICAgICAgcmV0dXJuIGdldEFkZHIodGhpcywgYWRkcik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnZlcnQgdGhpcyBzdGF0ZSB0byBhIEpTT04tc2VyaWFsaXphYmxlIG9iamVjdC4gV2hlbiBjdXN0b21cbiAgICBmaWVsZHMgc2hvdWxkIGJlIHNlcmlhbGl6ZWQsIHlvdSBjYW4gcGFzcyB0aGVtIGluIGFzIGFuIG9iamVjdFxuICAgIG1hcHBpbmcgcHJvcGVydHkgbmFtZXMgKGluIHRoZSByZXN1bHRpbmcgb2JqZWN0LCB3aGljaCBzaG91bGRcbiAgICBub3QgdXNlIGBkb2NgIG9yIGBzZWxlY3Rpb25gKSB0byBmaWVsZHMuXG4gICAgKi9cbiAgICB0b0pTT04oZmllbGRzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBkb2M6IHRoaXMuc2xpY2VEb2MoKSxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb24udG9KU09OKClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZpZWxkcylcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZmllbGRzW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0YXRlRmllbGQgJiYgdGhpcy5jb25maWcuYWRkcmVzc1t2YWx1ZS5pZF0gIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BdID0gdmFsdWUuc3BlYy50b0pTT04odGhpcy5maWVsZChmaWVsZHNbcHJvcF0pLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBzdGF0ZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBXaGVuIGN1c3RvbVxuICAgIGZpZWxkcyBzaG91bGQgYmUgZGVzZXJpYWxpemVkLCBwYXNzIHRoZSBzYW1lIG9iamVjdCB5b3UgcGFzc2VkXG4gICAgdG8gW2B0b0pTT05gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnRvSlNPTikgd2hlbiBzZXJpYWxpemluZyBhc1xuICAgIHRoaXJkIGFyZ3VtZW50LlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbmZpZyA9IHt9LCBmaWVsZHMpIHtcbiAgICAgICAgaWYgKCFqc29uIHx8IHR5cGVvZiBqc29uLmRvYyAhPSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEVkaXRvclN0YXRlXCIpO1xuICAgICAgICBsZXQgZmllbGRJbml0ID0gW107XG4gICAgICAgIGlmIChmaWVsZHMpXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIGZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoanNvbiwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzW3Byb3BdLCB2YWx1ZSA9IGpzb25bcHJvcF07XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkSW5pdC5wdXNoKGZpZWxkLmluaXQoc3RhdGUgPT4gZmllbGQuc3BlYy5mcm9tSlNPTih2YWx1ZSwgc3RhdGUpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gRWRpdG9yU3RhdGUuY3JlYXRlKHtcbiAgICAgICAgICAgIGRvYzoganNvbi5kb2MsXG4gICAgICAgICAgICBzZWxlY3Rpb246IEVkaXRvclNlbGVjdGlvbi5mcm9tSlNPTihqc29uLnNlbGVjdGlvbiksXG4gICAgICAgICAgICBleHRlbnNpb25zOiBjb25maWcuZXh0ZW5zaW9ucyA/IGZpZWxkSW5pdC5jb25jYXQoW2NvbmZpZy5leHRlbnNpb25zXSkgOiBmaWVsZEluaXRcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBzdGF0ZS4gWW91J2xsIHVzdWFsbHkgb25seSBuZWVkIHRoaXMgd2hlblxuICAgIGluaXRpYWxpemluZyBhbiBlZGl0b3JcdTIwMTR1cGRhdGVkIHN0YXRlcyBhcmUgY3JlYXRlZCBieSBhcHBseWluZ1xuICAgIHRyYW5zYWN0aW9ucy5cbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoY29uZmlnID0ge30pIHtcbiAgICAgICAgbGV0IGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uLnJlc29sdmUoY29uZmlnLmV4dGVuc2lvbnMgfHwgW10sIG5ldyBNYXApO1xuICAgICAgICBsZXQgZG9jID0gY29uZmlnLmRvYyBpbnN0YW5jZW9mIFRleHQgPyBjb25maWcuZG9jXG4gICAgICAgICAgICA6IFRleHQub2YoKGNvbmZpZy5kb2MgfHwgXCJcIikuc3BsaXQoY29uZmlndXJhdGlvbi5zdGF0aWNGYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSB8fCBEZWZhdWx0U3BsaXQpKTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9ICFjb25maWcuc2VsZWN0aW9uID8gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZSgwKVxuICAgICAgICAgICAgOiBjb25maWcuc2VsZWN0aW9uIGluc3RhbmNlb2YgRWRpdG9yU2VsZWN0aW9uID8gY29uZmlnLnNlbGVjdGlvblxuICAgICAgICAgICAgICAgIDogRWRpdG9yU2VsZWN0aW9uLnNpbmdsZShjb25maWcuc2VsZWN0aW9uLmFuY2hvciwgY29uZmlnLnNlbGVjdGlvbi5oZWFkKTtcbiAgICAgICAgY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uLCBkb2MubGVuZ3RoKTtcbiAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uLnN0YXRpY0ZhY2V0KGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zKSlcbiAgICAgICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5hc1NpbmdsZSgpO1xuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclN0YXRlKGNvbmZpZ3VyYXRpb24sIGRvYywgc2VsZWN0aW9uLCBjb25maWd1cmF0aW9uLmR5bmFtaWNTbG90cy5tYXAoKCkgPT4gbnVsbCksIChzdGF0ZSwgc2xvdCkgPT4gc2xvdC5jcmVhdGUoc3RhdGUpLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHNpemUgKGluIGNvbHVtbnMpIG9mIGEgdGFiIGluIHRoZSBkb2N1bWVudCwgZGV0ZXJtaW5lZCBieVxuICAgIHRoZSBbYHRhYlNpemVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRhYlNpemUpIGZhY2V0LlxuICAgICovXG4gICAgZ2V0IHRhYlNpemUoKSB7IHJldHVybiB0aGlzLmZhY2V0KEVkaXRvclN0YXRlLnRhYlNpemUpOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBwcm9wZXIgW2xpbmUtYnJlYWtdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVebGluZVNlcGFyYXRvcilcbiAgICBzdHJpbmcgZm9yIHRoaXMgc3RhdGUuXG4gICAgKi9cbiAgICBnZXQgbGluZUJyZWFrKCkgeyByZXR1cm4gdGhpcy5mYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSB8fCBcIlxcblwiOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIHdoZW4gdGhlIGVkaXRvciBpc1xuICAgIFtjb25maWd1cmVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnJlYWRPbmx5KSB0byBiZSByZWFkLW9ubHkuXG4gICAgKi9cbiAgICBnZXQgcmVhZE9ubHkoKSB7IHJldHVybiB0aGlzLmZhY2V0KHJlYWRPbmx5KTsgfVxuICAgIC8qKlxuICAgIExvb2sgdXAgYSB0cmFuc2xhdGlvbiBmb3IgdGhlIGdpdmVuIHBocmFzZSAodmlhIHRoZVxuICAgIFtgcGhyYXNlc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVecGhyYXNlcykgZmFjZXQpLCBvciByZXR1cm4gdGhlXG4gICAgb3JpZ2luYWwgc3RyaW5nIGlmIG5vIHRyYW5zbGF0aW9uIGlzIGZvdW5kLlxuICAgIFxuICAgIElmIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwYXNzZWQsIHRoZXkgd2lsbCBiZSBpbnNlcnRlZCBpblxuICAgIHBsYWNlIG9mIG1hcmtlcnMgbGlrZSBgJDFgIChmb3IgdGhlIGZpcnN0IHZhbHVlKSBhbmQgYCQyYCwgZXRjLlxuICAgIEEgc2luZ2xlIGAkYCBpcyBlcXVpdmFsZW50IHRvIGAkMWAsIGFuZCBgJCRgIHdpbGwgcHJvZHVjZSBhXG4gICAgbGl0ZXJhbCBkb2xsYXIgc2lnbi5cbiAgICAqL1xuICAgIHBocmFzZShwaHJhc2UsIC4uLmluc2VydCkge1xuICAgICAgICBmb3IgKGxldCBtYXAgb2YgdGhpcy5mYWNldChFZGl0b3JTdGF0ZS5waHJhc2VzKSlcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobWFwLCBwaHJhc2UpKSB7XG4gICAgICAgICAgICAgICAgcGhyYXNlID0gbWFwW3BocmFzZV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChpbnNlcnQubGVuZ3RoKVxuICAgICAgICAgICAgcGhyYXNlID0gcGhyYXNlLnJlcGxhY2UoL1xcJChcXCR8XFxkKikvZywgKG0sIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBcIiRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiJFwiO1xuICAgICAgICAgICAgICAgIGxldCBuID0gKyhpIHx8IDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiAhbiB8fCBuID4gaW5zZXJ0Lmxlbmd0aCA/IG0gOiBpbnNlcnRbbiAtIDFdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwaHJhc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIHZhbHVlcyBmb3IgYSBnaXZlbiBsYW5ndWFnZSBkYXRhIGZpZWxkLCBwcm92aWRlZCBieSB0aGVcbiAgICB0aGUgW2BsYW5ndWFnZURhdGFgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmxhbmd1YWdlRGF0YSkgZmFjZXQuXG4gICAgXG4gICAgRXhhbXBsZXMgb2YgbGFuZ3VhZ2UgZGF0YSBmaWVsZHMgYXJlLi4uXG4gICAgXG4gICAgLSBbYFwiY29tbWVudFRva2Vuc1wiYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNjb21tYW5kcy5Db21tZW50VG9rZW5zKSBmb3Igc3BlY2lmeWluZ1xuICAgICAgY29tbWVudCBzeW50YXguXG4gICAgLSBbYFwiYXV0b2NvbXBsZXRlXCJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2F1dG9jb21wbGV0ZS5hdXRvY29tcGxldGlvbl5jb25maWcub3ZlcnJpZGUpXG4gICAgICBmb3IgcHJvdmlkaW5nIGxhbmd1YWdlLXNwZWNpZmljIGNvbXBsZXRpb24gc291cmNlcy5cbiAgICAtIFtgXCJ3b3JkQ2hhcnNcImBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuY2hhckNhdGVnb3JpemVyKSBmb3IgYWRkaW5nXG4gICAgICBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcGFydCBvZiB3b3JkcyBpbiB0aGlzXG4gICAgICBsYW5ndWFnZS5cbiAgICAtIFtgXCJjbG9zZUJyYWNrZXRzXCJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2F1dG9jb21wbGV0ZS5DbG9zZUJyYWNrZXRDb25maWcpIGNvbnRyb2xzXG4gICAgICBicmFja2V0IGNsb3NpbmcgYmVoYXZpb3IuXG4gICAgKi9cbiAgICBsYW5ndWFnZURhdGFBdChuYW1lLCBwb3MsIHNpZGUgPSAtMSkge1xuICAgICAgICBsZXQgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IHByb3ZpZGVyIG9mIHRoaXMuZmFjZXQobGFuZ3VhZ2VEYXRhKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgcmVzdWx0IG9mIHByb3ZpZGVyKHRoaXMsIHBvcywgc2lkZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgbmFtZSkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHJlc3VsdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gY2F0ZWdvcml6ZSBzdHJpbmdzIChleHBlY3RlZCB0b1xuICAgIHJlcHJlc2VudCBhIHNpbmdsZSBbZ3JhcGhlbWUgY2x1c3Rlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5maW5kQ2x1c3RlckJyZWFrKSlcbiAgICBpbnRvIG9uZSBvZjpcbiAgICBcbiAgICAgLSBXb3JkIChjb250YWlucyBhbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVyIG9yIGEgY2hhcmFjdGVyXG4gICAgICAgZXhwbGljaXRseSBsaXN0ZWQgaW4gdGhlIGxvY2FsIGxhbmd1YWdlJ3MgYFwid29yZENoYXJzXCJgXG4gICAgICAgbGFuZ3VhZ2UgZGF0YSwgd2hpY2ggc2hvdWxkIGJlIGEgc3RyaW5nKVxuICAgICAtIFNwYWNlIChjb250YWlucyBvbmx5IHdoaXRlc3BhY2UpXG4gICAgIC0gT3RoZXIgKGFueXRoaW5nIGVsc2UpXG4gICAgKi9cbiAgICBjaGFyQ2F0ZWdvcml6ZXIoYXQpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VDYXRlZ29yaXplcih0aGlzLmxhbmd1YWdlRGF0YUF0KFwid29yZENoYXJzXCIsIGF0KS5qb2luKFwiXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgd29yZCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24sIG1lYW5pbmcgdGhlIHJhbmdlXG4gICAgY29udGFpbmluZyBhbGwgW3dvcmRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhckNhdGVnb3J5LldvcmQpIGNoYXJhY3RlcnNcbiAgICBhcm91bmQgaXQuIElmIG5vIHdvcmQgY2hhcmFjdGVycyBhcmUgYWRqYWNlbnQgdG8gdGhlIHBvc2l0aW9uLFxuICAgIHRoaXMgcmV0dXJucyBudWxsLlxuICAgICovXG4gICAgd29yZEF0KHBvcykge1xuICAgICAgICBsZXQgeyB0ZXh0LCBmcm9tLCBsZW5ndGggfSA9IHRoaXMuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICBsZXQgY2F0ID0gdGhpcy5jaGFyQ2F0ZWdvcml6ZXIocG9zKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gcG9zIC0gZnJvbSwgZW5kID0gcG9zIC0gZnJvbTtcbiAgICAgICAgd2hpbGUgKHN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgbGV0IHByZXYgPSBmaW5kQ2x1c3RlckJyZWFrKHRleHQsIHN0YXJ0LCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoY2F0KHRleHQuc2xpY2UocHJldiwgc3RhcnQpKSAhPSBDaGFyQ2F0ZWdvcnkuV29yZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHN0YXJ0ID0gcHJldjtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoZW5kIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGZpbmRDbHVzdGVyQnJlYWsodGV4dCwgZW5kKTtcbiAgICAgICAgICAgIGlmIChjYXQodGV4dC5zbGljZShlbmQsIG5leHQpKSAhPSBDaGFyQ2F0ZWdvcnkuV29yZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGVuZCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXJ0ID09IGVuZCA/IG51bGwgOiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2Uoc3RhcnQgKyBmcm9tLCBlbmQgKyBmcm9tKTtcbiAgICB9XG59XG4vKipcbkEgZmFjZXQgdGhhdCwgd2hlbiBlbmFibGVkLCBjYXVzZXMgdGhlIGVkaXRvciB0byBhbGxvdyBtdWx0aXBsZVxucmFuZ2VzIHRvIGJlIHNlbGVjdGVkLiBCZSBjYXJlZnVsIHRob3VnaCwgYmVjYXVzZSBieSBkZWZhdWx0IHRoZVxuZWRpdG9yIHJlbGllcyBvbiB0aGUgbmF0aXZlIERPTSBzZWxlY3Rpb24sIHdoaWNoIGNhbm5vdCBoYW5kbGVcbm11bHRpcGxlIHNlbGVjdGlvbnMuIEFuIGV4dGVuc2lvbiBsaWtlXG5bYGRyYXdTZWxlY3Rpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuZHJhd1NlbGVjdGlvbikgY2FuIGJlIHVzZWQgdG8gbWFrZVxuc2Vjb25kYXJ5IHNlbGVjdGlvbnMgdmlzaWJsZSB0byB0aGUgdXNlci5cbiovXG5FZGl0b3JTdGF0ZS5hbGxvd011bHRpcGxlU2VsZWN0aW9ucyA9IGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zO1xuLyoqXG5Db25maWd1cmVzIHRoZSB0YWIgc2l6ZSB0byB1c2UgaW4gdGhpcyBzdGF0ZS4gVGhlIGZpcnN0XG4oaGlnaGVzdC1wcmVjZWRlbmNlKSB2YWx1ZSBvZiB0aGUgZmFjZXQgaXMgdXNlZC4gSWYgbm8gdmFsdWUgaXNcbmdpdmVuLCB0aGlzIGRlZmF1bHRzIHRvIDQuXG4qL1xuRWRpdG9yU3RhdGUudGFiU2l6ZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogNFxufSk7XG4vKipcblRoZSBsaW5lIHNlcGFyYXRvciB0byB1c2UuIEJ5IGRlZmF1bHQsIGFueSBvZiBgXCJcXG5cImAsIGBcIlxcclxcblwiYFxuYW5kIGBcIlxcclwiYCBpcyB0cmVhdGVkIGFzIGEgc2VwYXJhdG9yIHdoZW4gc3BsaXR0aW5nIGxpbmVzLCBhbmRcbmxpbmVzIGFyZSBqb2luZWQgd2l0aCBgXCJcXG5cImAuXG5cbldoZW4geW91IGNvbmZpZ3VyZSBhIHZhbHVlIGhlcmUsIG9ubHkgdGhhdCBwcmVjaXNlIHNlcGFyYXRvclxud2lsbCBiZSB1c2VkLCBhbGxvd2luZyB5b3UgdG8gcm91bmQtdHJpcCBkb2N1bWVudHMgdGhyb3VnaCB0aGVcbmVkaXRvciB3aXRob3V0IG5vcm1hbGl6aW5nIGxpbmUgc2VwYXJhdG9ycy5cbiovXG5FZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yID0gbGluZVNlcGFyYXRvcjtcbi8qKlxuVGhpcyBmYWNldCBjb250cm9scyB0aGUgdmFsdWUgb2YgdGhlXG5bYHJlYWRPbmx5YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5yZWFkT25seSkgZ2V0dGVyLCB3aGljaCBpc1xuY29uc3VsdGVkIGJ5IGNvbW1hbmRzIGFuZCBleHRlbnNpb25zIHRoYXQgaW1wbGVtZW50IGVkaXRpbmdcbmZ1bmN0aW9uYWxpdHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhleSBzaG91bGQgYXBwbHkuIEl0XG5kZWZhdWx0cyB0byBmYWxzZSwgYnV0IHdoZW4gaXRzIGhpZ2hlc3QtcHJlY2VkZW5jZSB2YWx1ZSBpc1xuYHRydWVgLCBzdWNoIGZ1bmN0aW9uYWxpdHkgZGlzYWJsZXMgaXRzZWxmLlxuXG5Ob3QgdG8gYmUgY29uZnVzZWQgd2l0aFxuW2BFZGl0b3JWaWV3LmVkaXRhYmxlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeZWRpdGFibGUpLCB3aGljaFxuY29udHJvbHMgd2hldGhlciB0aGUgZWRpdG9yJ3MgRE9NIGlzIHNldCB0byBiZSBlZGl0YWJsZSAoYW5kXG50aHVzIGZvY3VzYWJsZSkuXG4qL1xuRWRpdG9yU3RhdGUucmVhZE9ubHkgPSByZWFkT25seTtcbi8qKlxuUmVnaXN0ZXJzIHRyYW5zbGF0aW9uIHBocmFzZXMuIFRoZVxuW2BwaHJhc2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnBocmFzZSkgbWV0aG9kIHdpbGwgbG9vayB0aHJvdWdoXG5hbGwgb2JqZWN0cyByZWdpc3RlcmVkIHdpdGggdGhpcyBmYWNldCB0byBmaW5kIHRyYW5zbGF0aW9ucyBmb3Jcbml0cyBhcmd1bWVudC5cbiovXG5FZGl0b3JTdGF0ZS5waHJhc2VzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tcGFyZShhLCBiKSB7XG4gICAgICAgIGxldCBrQSA9IE9iamVjdC5rZXlzKGEpLCBrQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICByZXR1cm4ga0EubGVuZ3RoID09IGtCLmxlbmd0aCAmJiBrQS5ldmVyeShrID0+IGFba10gPT0gYltrXSk7XG4gICAgfVxufSk7XG4vKipcbkEgZmFjZXQgdXNlZCB0byByZWdpc3RlciBbbGFuZ3VhZ2VcbmRhdGFdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhQXQpIHByb3ZpZGVycy5cbiovXG5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGEgPSBsYW5ndWFnZURhdGE7XG4vKipcbkZhY2V0IHVzZWQgdG8gcmVnaXN0ZXIgY2hhbmdlIGZpbHRlcnMsIHdoaWNoIGFyZSBjYWxsZWQgZm9yIGVhY2hcbnRyYW5zYWN0aW9uICh1bmxlc3MgZXhwbGljaXRseVxuW2Rpc2FibGVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5maWx0ZXIpKSwgYW5kIGNhbiBzdXBwcmVzc1xucGFydCBvZiB0aGUgdHJhbnNhY3Rpb24ncyBjaGFuZ2VzLlxuXG5TdWNoIGEgZnVuY3Rpb24gY2FuIHJldHVybiBgdHJ1ZWAgdG8gaW5kaWNhdGUgdGhhdCBpdCBkb2Vzbid0XG53YW50IHRvIGRvIGFueXRoaW5nLCBgZmFsc2VgIHRvIGNvbXBsZXRlbHkgc3RvcCB0aGUgY2hhbmdlcyBpblxudGhlIHRyYW5zYWN0aW9uLCBvciBhIHNldCBvZiByYW5nZXMgaW4gd2hpY2ggY2hhbmdlcyBzaG91bGQgYmVcbnN1cHByZXNzZWQuIFN1Y2ggcmFuZ2VzIGFyZSByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiBudW1iZXJzLFxud2l0aCBlYWNoIHBhaXIgb2YgdHdvIG51bWJlcnMgaW5kaWNhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhXG5yYW5nZS4gU28gZm9yIGV4YW1wbGUgYFsxMCwgMjAsIDEwMCwgMTEwXWAgc3VwcHJlc3NlcyBjaGFuZ2VzXG5iZXR3ZWVuIDEwIGFuZCAyMCwgYW5kIGJldHdlZW4gMTAwIGFuZCAxMTAuXG4qL1xuRWRpdG9yU3RhdGUuY2hhbmdlRmlsdGVyID0gY2hhbmdlRmlsdGVyO1xuLyoqXG5GYWNldCB1c2VkIHRvIHJlZ2lzdGVyIGEgaG9vayB0aGF0IGdldHMgYSBjaGFuY2UgdG8gdXBkYXRlIG9yXG5yZXBsYWNlIHRyYW5zYWN0aW9uIHNwZWNzIGJlZm9yZSB0aGV5IGFyZSBhcHBsaWVkLiBUaGlzIHdpbGxcbm9ubHkgYmUgYXBwbGllZCBmb3IgdHJhbnNhY3Rpb25zIHRoYXQgZG9uJ3QgaGF2ZVxuW2BmaWx0ZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5maWx0ZXIpIHNldCB0byBgZmFsc2VgLiBZb3VcbmNhbiBlaXRoZXIgcmV0dXJuIGEgc2luZ2xlIHRyYW5zYWN0aW9uIHNwZWMgKHBvc3NpYmx5IHRoZSBpbnB1dFxudHJhbnNhY3Rpb24pLCBvciBhbiBhcnJheSBvZiBzcGVjcyAod2hpY2ggd2lsbCBiZSBjb21iaW5lZCBpblxudGhlIHNhbWUgd2F5IGFzIHRoZSBhcmd1bWVudHMgdG9cbltgRWRpdG9yU3RhdGUudXBkYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpKS5cblxuV2hlbiBwb3NzaWJsZSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gYXZvaWQgYWNjZXNzaW5nXG5bYFRyYW5zYWN0aW9uLnN0YXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zdGF0ZSkgaW4gYSBmaWx0ZXIsXG5zaW5jZSBpdCB3aWxsIGZvcmNlIGNyZWF0aW9uIG9mIGEgc3RhdGUgdGhhdCB3aWxsIHRoZW4gYmVcbmRpc2NhcmRlZCBhZ2FpbiwgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIGFjdHVhbGx5IGZpbHRlcmVkLlxuXG4oVGhpcyBmdW5jdGlvbmFsaXR5IHNob3VsZCBiZSB1c2VkIHdpdGggY2FyZS4gSW5kaXNjcmltaW5hdGVseVxubW9kaWZ5aW5nIHRyYW5zYWN0aW9uIGlzIGxpa2VseSB0byBicmVhayBzb21ldGhpbmcgb3IgZGVncmFkZVxudGhlIHVzZXIgZXhwZXJpZW5jZS4pXG4qL1xuRWRpdG9yU3RhdGUudHJhbnNhY3Rpb25GaWx0ZXIgPSB0cmFuc2FjdGlvbkZpbHRlcjtcbi8qKlxuVGhpcyBpcyBhIG1vcmUgbGltaXRlZCBmb3JtIG9mXG5bYHRyYW5zYWN0aW9uRmlsdGVyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50cmFuc2FjdGlvbkZpbHRlciksXG53aGljaCBjYW4gb25seSBhZGRcblthbm5vdGF0aW9uc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuYW5ub3RhdGlvbnMpIGFuZFxuW2VmZmVjdHNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpLiBfQnV0XywgdGhpcyB0eXBlXG5vZiBmaWx0ZXIgcnVucyBldmVuIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgZGlzYWJsZWQgcmVndWxhclxuW2ZpbHRlcmluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZmlsdGVyKSwgbWFraW5nIGl0IHN1aXRhYmxlXG5mb3IgZWZmZWN0cyB0aGF0IGRvbid0IG5lZWQgdG8gdG91Y2ggdGhlIGNoYW5nZXMgb3Igc2VsZWN0aW9uLFxuYnV0IGRvIHdhbnQgdG8gcHJvY2VzcyBldmVyeSB0cmFuc2FjdGlvbi5cblxuRXh0ZW5kZXJzIHJ1biBfYWZ0ZXJfIGZpbHRlcnMsIHdoZW4gYm90aCBhcmUgcHJlc2VudC5cbiovXG5FZGl0b3JTdGF0ZS50cmFuc2FjdGlvbkV4dGVuZGVyID0gdHJhbnNhY3Rpb25FeHRlbmRlcjtcbkNvbXBhcnRtZW50LnJlY29uZmlndXJlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuXG4vKipcblV0aWxpdHkgZnVuY3Rpb24gZm9yIGNvbWJpbmluZyBiZWhhdmlvcnMgdG8gZmlsbCBpbiBhIGNvbmZpZ1xub2JqZWN0IGZyb20gYW4gYXJyYXkgb2YgcHJvdmlkZWQgY29uZmlncy4gYGRlZmF1bHRzYCBzaG91bGQgaG9sZFxuZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMgaW4gYENvbmZpZ2AuXG5cblRoZSBmdW5jdGlvbiB3aWxsLCBieSBkZWZhdWx0LCBlcnJvclxud2hlbiBhIGZpZWxkIGdldHMgdHdvIHZhbHVlcyB0aGF0IGFyZW4ndCBgPT09YC1lcXVhbCwgYnV0IHlvdSBjYW5cbnByb3ZpZGUgY29tYmluZSBmdW5jdGlvbnMgcGVyIGZpZWxkIHRvIGRvIHNvbWV0aGluZyBlbHNlLlxuKi9cbmZ1bmN0aW9uIGNvbWJpbmVDb25maWcoY29uZmlncywgZGVmYXVsdHMsIC8vIFNob3VsZCBob2xkIG9ubHkgdGhlIG9wdGlvbmFsIHByb3BlcnRpZXMgb2YgQ29uZmlnLCBidXQgSSBoYXZlbid0IG1hbmFnZWQgdG8gZXhwcmVzcyB0aGF0XG5jb21iaW5lID0ge30pIHtcbiAgICBsZXQgcmVzdWx0ID0ge307XG4gICAgZm9yIChsZXQgY29uZmlnIG9mIGNvbmZpZ3MpXG4gICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBjb25maWdba2V5XSwgY3VycmVudCA9IHJlc3VsdFtrZXldO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudCA9PT0gdmFsdWUgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgOyAvLyBObyBjb25mbGljdFxuICAgICAgICAgICAgZWxzZSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoY29tYmluZSwga2V5KSlcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IGNvbWJpbmVba2V5XShjdXJyZW50LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29uZmlnIG1lcmdlIGNvbmZsaWN0IGZvciBmaWVsZCBcIiArIGtleSk7XG4gICAgICAgIH1cbiAgICBmb3IgKGxldCBrZXkgaW4gZGVmYXVsdHMpXG4gICAgICAgIGlmIChyZXN1bHRba2V5XSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBkZWZhdWx0c1trZXldO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuRWFjaCByYW5nZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB2YWx1ZSwgd2hpY2ggbXVzdCBpbmhlcml0IGZyb21cbnRoaXMgY2xhc3MuXG4qL1xuY2xhc3MgUmFuZ2VWYWx1ZSB7XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIHZhbHVlIHdpdGggYW5vdGhlciB2YWx1ZS4gVXNlZCB3aGVuIGNvbXBhcmluZ1xuICAgIHJhbmdlc2V0cy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY29tcGFyZXMgYnkgaWRlbnRpdHkuXG4gICAgVW5sZXNzIHlvdSBhcmUgb25seSBjcmVhdGluZyBhIGZpeGVkIG51bWJlciBvZiB1bmlxdWUgaW5zdGFuY2VzXG4gICAgb2YgeW91ciB2YWx1ZSB0eXBlLCBpdCBpcyBhIGdvb2QgaWRlYSB0byBpbXBsZW1lbnQgdGhpc1xuICAgIHByb3Blcmx5LlxuICAgICovXG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMgPT0gb3RoZXI7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbcmFuZ2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpIHdpdGggdGhpcyB2YWx1ZS5cbiAgICAqL1xuICAgIHJhbmdlKGZyb20sIHRvID0gZnJvbSkgeyByZXR1cm4gUmFuZ2UuY3JlYXRlKGZyb20sIHRvLCB0aGlzKTsgfVxufVxuUmFuZ2VWYWx1ZS5wcm90b3R5cGUuc3RhcnRTaWRlID0gUmFuZ2VWYWx1ZS5wcm90b3R5cGUuZW5kU2lkZSA9IDA7XG5SYW5nZVZhbHVlLnByb3RvdHlwZS5wb2ludCA9IGZhbHNlO1xuUmFuZ2VWYWx1ZS5wcm90b3R5cGUubWFwTW9kZSA9IE1hcE1vZGUuVHJhY2tEZWw7XG4vKipcbkEgcmFuZ2UgYXNzb2NpYXRlcyBhIHZhbHVlIHdpdGggYSByYW5nZSBvZiBwb3NpdGlvbnMuXG4qL1xuY2xhc3MgUmFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSByYW5nZSdzIHN0YXJ0IHBvc2l0aW9uLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgSXRzIGVuZCBwb3NpdGlvbi5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmFuZ2UuXG4gICAgKi9cbiAgICB2YWx1ZSkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGZyb20sIHRvLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKGZyb20sIHRvLCB2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY21wUmFuZ2UoYSwgYikge1xuICAgIHJldHVybiBhLmZyb20gLSBiLmZyb20gfHwgYS52YWx1ZS5zdGFydFNpZGUgLSBiLnZhbHVlLnN0YXJ0U2lkZTtcbn1cbmNsYXNzIENodW5rIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bywgdmFsdWUsIFxuICAgIC8vIENodW5rcyBhcmUgbWFya2VkIHdpdGggdGhlIGxhcmdlc3QgcG9pbnQgdGhhdCBvY2N1cnNcbiAgICAvLyBpbiB0aGVtIChvciAtMSBmb3Igbm8gcG9pbnRzKSwgc28gdGhhdCBzY2FucyB0aGF0IGFyZVxuICAgIC8vIG9ubHkgaW50ZXJlc3RlZCBpbiBwb2ludHMgKHN1Y2ggYXMgdGhlXG4gICAgLy8gaGVpZ2h0bWFwLXJlbGF0ZWQgbG9naWMpIGNhbiBza2lwIHJhbmdlLW9ubHkgY2h1bmtzLlxuICAgIG1heFBvaW50KSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm1heFBvaW50ID0gbWF4UG9pbnQ7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnRvW3RoaXMudG8ubGVuZ3RoIC0gMV07IH1cbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHNpZGUuIFVzZSB0aGUgcmFuZ2VzJ1xuICAgIC8vIGBmcm9tYCBwb3Mgd2hlbiBgZW5kID09IGZhbHNlYCwgYHRvYCB3aGVuIGBlbmQgPT0gdHJ1ZWAuXG4gICAgZmluZEluZGV4KHBvcywgc2lkZSwgZW5kLCBzdGFydEF0ID0gMCkge1xuICAgICAgICBsZXQgYXJyID0gZW5kID8gdGhpcy50byA6IHRoaXMuZnJvbTtcbiAgICAgICAgZm9yIChsZXQgbG8gPSBzdGFydEF0LCBoaSA9IGFyci5sZW5ndGg7Oykge1xuICAgICAgICAgICAgaWYgKGxvID09IGhpKVxuICAgICAgICAgICAgICAgIHJldHVybiBsbztcbiAgICAgICAgICAgIGxldCBtaWQgPSAobG8gKyBoaSkgPj4gMTtcbiAgICAgICAgICAgIGxldCBkaWZmID0gYXJyW21pZF0gLSBwb3MgfHwgKGVuZCA/IHRoaXMudmFsdWVbbWlkXS5lbmRTaWRlIDogdGhpcy52YWx1ZVttaWRdLnN0YXJ0U2lkZSkgLSBzaWRlO1xuICAgICAgICAgICAgaWYgKG1pZCA9PSBsbylcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlmZiA+PSAwID8gbG8gOiBoaTtcbiAgICAgICAgICAgIGlmIChkaWZmID49IDApXG4gICAgICAgICAgICAgICAgaGkgPSBtaWQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbG8gPSBtaWQgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJldHdlZW4ob2Zmc2V0LCBmcm9tLCB0bywgZikge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5maW5kSW5kZXgoZnJvbSwgLTEwMDAwMDAwMDAgLyogQy5GYXIgKi8sIHRydWUpLCBlID0gdGhpcy5maW5kSW5kZXgodG8sIDEwMDAwMDAwMDAgLyogQy5GYXIgKi8sIGZhbHNlLCBpKTsgaSA8IGU7IGkrKylcbiAgICAgICAgICAgIGlmIChmKHRoaXMuZnJvbVtpXSArIG9mZnNldCwgdGhpcy50b1tpXSArIG9mZnNldCwgdGhpcy52YWx1ZVtpXSkgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbWFwKG9mZnNldCwgY2hhbmdlcykge1xuICAgICAgICBsZXQgdmFsdWUgPSBbXSwgZnJvbSA9IFtdLCB0byA9IFtdLCBuZXdQb3MgPSAtMSwgbWF4UG9pbnQgPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdmFsID0gdGhpcy52YWx1ZVtpXSwgY3VyRnJvbSA9IHRoaXMuZnJvbVtpXSArIG9mZnNldCwgY3VyVG8gPSB0aGlzLnRvW2ldICsgb2Zmc2V0LCBuZXdGcm9tLCBuZXdUbztcbiAgICAgICAgICAgIGlmIChjdXJGcm9tID09IGN1clRvKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcHBlZCA9IGNoYW5nZXMubWFwUG9zKGN1ckZyb20sIHZhbC5zdGFydFNpZGUsIHZhbC5tYXBNb2RlKTtcbiAgICAgICAgICAgICAgICBpZiAobWFwcGVkID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG5ld0Zyb20gPSBuZXdUbyA9IG1hcHBlZDtcbiAgICAgICAgICAgICAgICBpZiAodmFsLnN0YXJ0U2lkZSAhPSB2YWwuZW5kU2lkZSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdUbyA9IGNoYW5nZXMubWFwUG9zKGN1ckZyb20sIHZhbC5lbmRTaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1RvIDwgbmV3RnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld0Zyb20gPSBjaGFuZ2VzLm1hcFBvcyhjdXJGcm9tLCB2YWwuc3RhcnRTaWRlKTtcbiAgICAgICAgICAgICAgICBuZXdUbyA9IGNoYW5nZXMubWFwUG9zKGN1clRvLCB2YWwuZW5kU2lkZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Zyb20gPiBuZXdUbyB8fCBuZXdGcm9tID09IG5ld1RvICYmIHZhbC5zdGFydFNpZGUgPiAwICYmIHZhbC5lbmRTaWRlIDw9IDApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChuZXdUbyAtIG5ld0Zyb20gfHwgdmFsLmVuZFNpZGUgLSB2YWwuc3RhcnRTaWRlKSA8IDApXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAobmV3UG9zIDwgMClcbiAgICAgICAgICAgICAgICBuZXdQb3MgPSBuZXdGcm9tO1xuICAgICAgICAgICAgaWYgKHZhbC5wb2ludClcbiAgICAgICAgICAgICAgICBtYXhQb2ludCA9IE1hdGgubWF4KG1heFBvaW50LCBuZXdUbyAtIG5ld0Zyb20pO1xuICAgICAgICAgICAgdmFsdWUucHVzaCh2YWwpO1xuICAgICAgICAgICAgZnJvbS5wdXNoKG5ld0Zyb20gLSBuZXdQb3MpO1xuICAgICAgICAgICAgdG8ucHVzaChuZXdUbyAtIG5ld1Bvcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWFwcGVkOiB2YWx1ZS5sZW5ndGggPyBuZXcgQ2h1bmsoZnJvbSwgdG8sIHZhbHVlLCBtYXhQb2ludCkgOiBudWxsLCBwb3M6IG5ld1BvcyB9O1xuICAgIH1cbn1cbi8qKlxuQSByYW5nZSBzZXQgc3RvcmVzIGEgY29sbGVjdGlvbiBvZiBbcmFuZ2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlKSBpbiBhXG53YXkgdGhhdCBtYWtlcyB0aGVtIGVmZmljaWVudCB0byBbbWFwXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0Lm1hcCkgYW5kXG5bdXBkYXRlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0LnVwZGF0ZSkuIFRoaXMgaXMgYW4gaW1tdXRhYmxlIGRhdGFcbnN0cnVjdHVyZS5cbiovXG5jbGFzcyBSYW5nZVNldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaHVua1BvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaHVuaywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBuZXh0TGF5ZXIsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWF4UG9pbnQpIHtcbiAgICAgICAgdGhpcy5jaHVua1BvcyA9IGNodW5rUG9zO1xuICAgICAgICB0aGlzLmNodW5rID0gY2h1bms7XG4gICAgICAgIHRoaXMubmV4dExheWVyID0gbmV4dExheWVyO1xuICAgICAgICB0aGlzLm1heFBvaW50ID0gbWF4UG9pbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShjaHVua1BvcywgY2h1bmssIG5leHRMYXllciwgbWF4UG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZVNldChjaHVua1BvcywgY2h1bmssIG5leHRMYXllciwgbWF4UG9pbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5jaHVuay5sZW5ndGggLSAxO1xuICAgICAgICByZXR1cm4gbGFzdCA8IDAgPyAwIDogTWF0aC5tYXgodGhpcy5jaHVua0VuZChsYXN0KSwgdGhpcy5uZXh0TGF5ZXIubGVuZ3RoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIG51bWJlciBvZiByYW5nZXMgaW4gdGhlIHNldC5cbiAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBzaXplID0gdGhpcy5uZXh0TGF5ZXIuc2l6ZTtcbiAgICAgICAgZm9yIChsZXQgY2h1bmsgb2YgdGhpcy5jaHVuaylcbiAgICAgICAgICAgIHNpemUgKz0gY2h1bmsudmFsdWUubGVuZ3RoO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaHVua0VuZChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaHVua1Bvc1tpbmRleF0gKyB0aGlzLmNodW5rW2luZGV4XS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgcmFuZ2Ugc2V0LCBvcHRpb25hbGx5IGFkZGluZyBuZXcgcmFuZ2VzIG9yIGZpbHRlcmluZ1xuICAgIG91dCBleGlzdGluZyBvbmVzLlxuICAgIFxuICAgIChOb3RlOiBUaGUgdHlwZSBwYXJhbWV0ZXIgaXMganVzdCB0aGVyZSBhcyBhIGtsdWRnZSB0byB3b3JrXG4gICAgYXJvdW5kIFR5cGVTY3JpcHQgdmFyaWFuY2UgaXNzdWVzIHRoYXQgcHJldmVudGVkIGBSYW5nZVNldDxYPmBcbiAgICBmcm9tIGJlaW5nIGEgc3VidHlwZSBvZiBgUmFuZ2VTZXQ8WT5gIHdoZW4gYFhgIGlzIGEgc3VidHlwZSBvZlxuICAgIGBZYC4pXG4gICAgKi9cbiAgICB1cGRhdGUodXBkYXRlU3BlYykge1xuICAgICAgICBsZXQgeyBhZGQgPSBbXSwgc29ydCA9IGZhbHNlLCBmaWx0ZXJGcm9tID0gMCwgZmlsdGVyVG8gPSB0aGlzLmxlbmd0aCB9ID0gdXBkYXRlU3BlYztcbiAgICAgICAgbGV0IGZpbHRlciA9IHVwZGF0ZVNwZWMuZmlsdGVyO1xuICAgICAgICBpZiAoYWRkLmxlbmd0aCA9PSAwICYmICFmaWx0ZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHNvcnQpXG4gICAgICAgICAgICBhZGQgPSBhZGQuc2xpY2UoKS5zb3J0KGNtcFJhbmdlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBhZGQubGVuZ3RoID8gUmFuZ2VTZXQub2YoYWRkKSA6IHRoaXM7XG4gICAgICAgIGxldCBjdXIgPSBuZXcgTGF5ZXJDdXJzb3IodGhpcywgbnVsbCwgLTEpLmdvdG8oMCksIGkgPSAwLCBzcGlsbCA9IFtdO1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICAgICAgd2hpbGUgKGN1ci52YWx1ZSB8fCBpIDwgYWRkLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGkgPCBhZGQubGVuZ3RoICYmIChjdXIuZnJvbSAtIGFkZFtpXS5mcm9tIHx8IGN1ci5zdGFydFNpZGUgLSBhZGRbaV0udmFsdWUuc3RhcnRTaWRlKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gYWRkW2krK107XG4gICAgICAgICAgICAgICAgaWYgKCFidWlsZGVyLmFkZElubmVyKHJhbmdlLmZyb20sIHJhbmdlLnRvLCByYW5nZS52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIHNwaWxsLnB1c2gocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3VyLnJhbmdlSW5kZXggPT0gMSAmJiBjdXIuY2h1bmtJbmRleCA8IHRoaXMuY2h1bmsubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgKGkgPT0gYWRkLmxlbmd0aCB8fCB0aGlzLmNodW5rRW5kKGN1ci5jaHVua0luZGV4KSA8IGFkZFtpXS5mcm9tKSAmJlxuICAgICAgICAgICAgICAgICghZmlsdGVyIHx8IGZpbHRlckZyb20gPiB0aGlzLmNodW5rRW5kKGN1ci5jaHVua0luZGV4KSB8fCBmaWx0ZXJUbyA8IHRoaXMuY2h1bmtQb3NbY3VyLmNodW5rSW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ2h1bmsodGhpcy5jaHVua1Bvc1tjdXIuY2h1bmtJbmRleF0sIHRoaXMuY2h1bmtbY3VyLmNodW5rSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGN1ci5uZXh0Q2h1bmsoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlckZyb20gPiBjdXIudG8gfHwgZmlsdGVyVG8gPCBjdXIuZnJvbSB8fCBmaWx0ZXIoY3VyLmZyb20sIGN1ci50bywgY3VyLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1aWxkZXIuYWRkSW5uZXIoY3VyLmZyb20sIGN1ci50bywgY3VyLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwaWxsLnB1c2goUmFuZ2UuY3JlYXRlKGN1ci5mcm9tLCBjdXIudG8sIGN1ci52YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXIubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmZpbmlzaElubmVyKHRoaXMubmV4dExheWVyLmlzRW1wdHkgJiYgIXNwaWxsLmxlbmd0aCA/IFJhbmdlU2V0LmVtcHR5XG4gICAgICAgICAgICA6IHRoaXMubmV4dExheWVyLnVwZGF0ZSh7IGFkZDogc3BpbGwsIGZpbHRlciwgZmlsdGVyRnJvbSwgZmlsdGVyVG8gfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgdGhpcyByYW5nZSBzZXQgdGhyb3VnaCBhIHNldCBvZiBjaGFuZ2VzLCByZXR1cm4gdGhlIG5ldyBzZXQuXG4gICAgKi9cbiAgICBtYXAoY2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5lbXB0eSB8fCB0aGlzLmlzRW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IGNodW5rcyA9IFtdLCBjaHVua1BvcyA9IFtdLCBtYXhQb2ludCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2h1bmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuY2h1bmtQb3NbaV0sIGNodW5rID0gdGhpcy5jaHVua1tpXTtcbiAgICAgICAgICAgIGxldCB0b3VjaCA9IGNoYW5nZXMudG91Y2hlc1JhbmdlKHN0YXJ0LCBzdGFydCArIGNodW5rLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAodG91Y2ggPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgbWF4UG9pbnQgPSBNYXRoLm1heChtYXhQb2ludCwgY2h1bmsubWF4UG9pbnQpO1xuICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgICAgICBjaHVua1Bvcy5wdXNoKGNoYW5nZXMubWFwUG9zKHN0YXJ0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0b3VjaCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCB7IG1hcHBlZCwgcG9zIH0gPSBjaHVuay5tYXAoc3RhcnQsIGNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIGlmIChtYXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4UG9pbnQgPSBNYXRoLm1heChtYXhQb2ludCwgbWFwcGVkLm1heFBvaW50KTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2gobWFwcGVkKTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtQb3MucHVzaChwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dCA9IHRoaXMubmV4dExheWVyLm1hcChjaGFuZ2VzKTtcbiAgICAgICAgcmV0dXJuIGNodW5rcy5sZW5ndGggPT0gMCA/IG5leHQgOiBuZXcgUmFuZ2VTZXQoY2h1bmtQb3MsIGNodW5rcywgbmV4dCB8fCBSYW5nZVNldC5lbXB0eSwgbWF4UG9pbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyB0aGF0IHRvdWNoIHRoZSByZWdpb24gYGZyb21gIHRvIGB0b2AsXG4gICAgY2FsbGluZyBgZmAgZm9yIGVhY2guIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSByYW5nZXMgd2lsbFxuICAgIGJlIHJlcG9ydGVkIGluIGFueSBzcGVjaWZpYyBvcmRlci4gV2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJuc1xuICAgIGBmYWxzZWAsIGl0ZXJhdGlvbiBzdG9wcy5cbiAgICAqL1xuICAgIGJldHdlZW4oZnJvbSwgdG8sIGYpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNodW5rLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmNodW5rUG9zW2ldLCBjaHVuayA9IHRoaXMuY2h1bmtbaV07XG4gICAgICAgICAgICBpZiAodG8gPj0gc3RhcnQgJiYgZnJvbSA8PSBzdGFydCArIGNodW5rLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIGNodW5rLmJldHdlZW4oc3RhcnQsIGZyb20gLSBzdGFydCwgdG8gLSBzdGFydCwgZikgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5leHRMYXllci5iZXR3ZWVuKGZyb20sIHRvLCBmKTtcbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSByYW5nZXMgaW4gdGhpcyBzZXQsIGluIG9yZGVyLCBpbmNsdWRpbmcgYWxsXG4gICAgcmFuZ2VzIHRoYXQgZW5kIGF0IG9yIGFmdGVyIGBmcm9tYC5cbiAgICAqL1xuICAgIGl0ZXIoZnJvbSA9IDApIHtcbiAgICAgICAgcmV0dXJuIEhlYXBDdXJzb3IuZnJvbShbdGhpc10pLmdvdG8oZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGlzRW1wdHkoKSB7IHJldHVybiB0aGlzLm5leHRMYXllciA9PSB0aGlzOyB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSByYW5nZXMgaW4gYSBjb2xsZWN0aW9uIG9mIHNldHMsIGluIG9yZGVyLFxuICAgIHN0YXJ0aW5nIGZyb20gYGZyb21gLlxuICAgICovXG4gICAgc3RhdGljIGl0ZXIoc2V0cywgZnJvbSA9IDApIHtcbiAgICAgICAgcmV0dXJuIEhlYXBDdXJzb3IuZnJvbShzZXRzKS5nb3RvKGZyb20pO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdHdvIGdyb3VwcyBvZiBzZXRzLCBjYWxsaW5nIG1ldGhvZHMgb24gYGNvbXBhcmF0b3JgXG4gICAgdG8gbm90aWZ5IGl0IG9mIHBvc3NpYmxlIGRpZmZlcmVuY2VzLlxuICAgICovXG4gICAgc3RhdGljIGNvbXBhcmUob2xkU2V0cywgbmV3U2V0cywgXG4gICAgLyoqXG4gICAgVGhpcyBpbmRpY2F0ZXMgaG93IHRoZSB1bmRlcmx5aW5nIGRhdGEgY2hhbmdlZCBiZXR3ZWVuIHRoZXNlXG4gICAgcmFuZ2VzLCBhbmQgaXMgbmVlZGVkIHRvIHN5bmNocm9uaXplIHRoZSBpdGVyYXRpb24uXG4gICAgKi9cbiAgICB0ZXh0RGlmZiwgY29tcGFyYXRvciwgXG4gICAgLyoqXG4gICAgQ2FuIGJlIHVzZWQgdG8gaWdub3JlIGFsbCBub24tcG9pbnQgcmFuZ2VzLCBhbmQgcG9pbnRzIGJlbG93XG4gICAgdGhlIGdpdmVuIHNpemUuIFdoZW4gLTEsIGFsbCByYW5nZXMgYXJlIGNvbXBhcmVkLlxuICAgICovXG4gICAgbWluUG9pbnRTaXplID0gLTEpIHtcbiAgICAgICAgbGV0IGEgPSBvbGRTZXRzLmZpbHRlcihzZXQgPT4gc2V0Lm1heFBvaW50ID4gMCB8fCAhc2V0LmlzRW1wdHkgJiYgc2V0Lm1heFBvaW50ID49IG1pblBvaW50U2l6ZSk7XG4gICAgICAgIGxldCBiID0gbmV3U2V0cy5maWx0ZXIoc2V0ID0+IHNldC5tYXhQb2ludCA+IDAgfHwgIXNldC5pc0VtcHR5ICYmIHNldC5tYXhQb2ludCA+PSBtaW5Qb2ludFNpemUpO1xuICAgICAgICBsZXQgc2hhcmVkQ2h1bmtzID0gZmluZFNoYXJlZENodW5rcyhhLCBiLCB0ZXh0RGlmZik7XG4gICAgICAgIGxldCBzaWRlQSA9IG5ldyBTcGFuQ3Vyc29yKGEsIHNoYXJlZENodW5rcywgbWluUG9pbnRTaXplKTtcbiAgICAgICAgbGV0IHNpZGVCID0gbmV3IFNwYW5DdXJzb3IoYiwgc2hhcmVkQ2h1bmtzLCBtaW5Qb2ludFNpemUpO1xuICAgICAgICB0ZXh0RGlmZi5pdGVyR2FwcygoZnJvbUEsIGZyb21CLCBsZW5ndGgpID0+IGNvbXBhcmUoc2lkZUEsIGZyb21BLCBzaWRlQiwgZnJvbUIsIGxlbmd0aCwgY29tcGFyYXRvcikpO1xuICAgICAgICBpZiAodGV4dERpZmYuZW1wdHkgJiYgdGV4dERpZmYubGVuZ3RoID09IDApXG4gICAgICAgICAgICBjb21wYXJlKHNpZGVBLCAwLCBzaWRlQiwgMCwgMCwgY29tcGFyYXRvcik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhlIGNvbnRlbnRzIG9mIHR3byBncm91cHMgb2YgcmFuZ2Ugc2V0cywgcmV0dXJuaW5nIHRydWVcbiAgICBpZiB0aGV5IGFyZSBlcXVpdmFsZW50IGluIHRoZSBnaXZlbiByYW5nZS5cbiAgICAqL1xuICAgIHN0YXRpYyBlcShvbGRTZXRzLCBuZXdTZXRzLCBmcm9tID0gMCwgdG8pIHtcbiAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICB0byA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi8gLSAxO1xuICAgICAgICBsZXQgYSA9IG9sZFNldHMuZmlsdGVyKHNldCA9PiAhc2V0LmlzRW1wdHkgJiYgbmV3U2V0cy5pbmRleE9mKHNldCkgPCAwKTtcbiAgICAgICAgbGV0IGIgPSBuZXdTZXRzLmZpbHRlcihzZXQgPT4gIXNldC5pc0VtcHR5ICYmIG9sZFNldHMuaW5kZXhPZihzZXQpIDwgMCk7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFhLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgc2hhcmVkQ2h1bmtzID0gZmluZFNoYXJlZENodW5rcyhhLCBiKTtcbiAgICAgICAgbGV0IHNpZGVBID0gbmV3IFNwYW5DdXJzb3IoYSwgc2hhcmVkQ2h1bmtzLCAwKS5nb3RvKGZyb20pLCBzaWRlQiA9IG5ldyBTcGFuQ3Vyc29yKGIsIHNoYXJlZENodW5rcywgMCkuZ290byhmcm9tKTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKHNpZGVBLnRvICE9IHNpZGVCLnRvIHx8XG4gICAgICAgICAgICAgICAgIXNhbWVWYWx1ZXMoc2lkZUEuYWN0aXZlLCBzaWRlQi5hY3RpdmUpIHx8XG4gICAgICAgICAgICAgICAgc2lkZUEucG9pbnQgJiYgKCFzaWRlQi5wb2ludCB8fCAhc2lkZUEucG9pbnQuZXEoc2lkZUIucG9pbnQpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoc2lkZUEudG8gPiB0bylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHNpZGVBLm5leHQoKTtcbiAgICAgICAgICAgIHNpZGVCLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgYSBncm91cCBvZiByYW5nZSBzZXRzIGF0IHRoZSBzYW1lIHRpbWUsIG5vdGlmeWluZ1xuICAgIHRoZSBpdGVyYXRvciBhYm91dCB0aGUgcmFuZ2VzIGNvdmVyaW5nIGV2ZXJ5IGdpdmVuIHBpZWNlIG9mXG4gICAgY29udGVudC4gUmV0dXJucyB0aGUgb3BlbiBjb3VudCAoc2VlXG4gICAgW2BTcGFuSXRlcmF0b3Iuc3BhbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3Bhbkl0ZXJhdG9yLnNwYW4pKSBhdCB0aGUgZW5kXG4gICAgb2YgdGhlIGl0ZXJhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBzcGFucyhzZXRzLCBmcm9tLCB0bywgaXRlcmF0b3IsIFxuICAgIC8qKlxuICAgIFdoZW4gZ2l2ZW4gYW5kIGdyZWF0ZXIgdGhhbiAtMSwgb25seSBwb2ludHMgb2YgYXQgbGVhc3QgdGhpc1xuICAgIHNpemUgYXJlIHRha2VuIGludG8gYWNjb3VudC5cbiAgICAqL1xuICAgIG1pblBvaW50U2l6ZSA9IC0xKSB7XG4gICAgICAgIGxldCBjdXJzb3IgPSBuZXcgU3BhbkN1cnNvcihzZXRzLCBudWxsLCBtaW5Qb2ludFNpemUpLmdvdG8oZnJvbSksIHBvcyA9IGZyb207XG4gICAgICAgIGxldCBvcGVuUmFuZ2VzID0gY3Vyc29yLm9wZW5TdGFydDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGN1clRvID0gTWF0aC5taW4oY3Vyc29yLnRvLCB0byk7XG4gICAgICAgICAgICBpZiAoY3Vyc29yLnBvaW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IGFjdGl2ZSA9IGN1cnNvci5hY3RpdmVGb3JQb2ludChjdXJzb3IudG8pO1xuICAgICAgICAgICAgICAgIGxldCBvcGVuQ291bnQgPSBjdXJzb3IucG9pbnRGcm9tIDwgZnJvbSA/IGFjdGl2ZS5sZW5ndGggKyAxIDogTWF0aC5taW4oYWN0aXZlLmxlbmd0aCwgb3BlblJhbmdlcyk7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3IucG9pbnQocG9zLCBjdXJUbywgY3Vyc29yLnBvaW50LCBhY3RpdmUsIG9wZW5Db3VudCwgY3Vyc29yLnBvaW50UmFuayk7XG4gICAgICAgICAgICAgICAgb3BlblJhbmdlcyA9IE1hdGgubWluKGN1cnNvci5vcGVuRW5kKGN1clRvKSwgYWN0aXZlLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJUbyA+IHBvcykge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNwYW4ocG9zLCBjdXJUbywgY3Vyc29yLmFjdGl2ZSwgb3BlblJhbmdlcyk7XG4gICAgICAgICAgICAgICAgb3BlblJhbmdlcyA9IGN1cnNvci5vcGVuRW5kKGN1clRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJzb3IudG8gPiB0bylcbiAgICAgICAgICAgICAgICByZXR1cm4gb3BlblJhbmdlcyArIChjdXJzb3IucG9pbnQgJiYgY3Vyc29yLnRvID4gdG8gPyAxIDogMCk7XG4gICAgICAgICAgICBwb3MgPSBjdXJzb3IudG87XG4gICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJhbmdlIHNldCBmb3IgdGhlIGdpdmVuIHJhbmdlIG9yIGFycmF5IG9mIHJhbmdlcy4gQnlcbiAgICBkZWZhdWx0LCB0aGlzIGV4cGVjdHMgdGhlIHJhbmdlcyB0byBiZSBfc29ydGVkXyAoYnkgc3RhcnRcbiAgICBwb3NpdGlvbiBhbmQsIGlmIHR3byBzdGFydCBhdCB0aGUgc2FtZSBwb3NpdGlvbixcbiAgICBgdmFsdWUuc3RhcnRTaWRlYCkuIFlvdSBjYW4gcGFzcyBgdHJ1ZWAgYXMgc2Vjb25kIGFyZ3VtZW50IHRvXG4gICAgY2F1c2UgdGhlIG1ldGhvZCB0byBzb3J0IHRoZW0uXG4gICAgKi9cbiAgICBzdGF0aWMgb2YocmFuZ2VzLCBzb3J0ID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IGJ1aWxkID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICBmb3IgKGxldCByYW5nZSBvZiByYW5nZXMgaW5zdGFuY2VvZiBSYW5nZSA/IFtyYW5nZXNdIDogc29ydCA/IGxhenlTb3J0KHJhbmdlcykgOiByYW5nZXMpXG4gICAgICAgICAgICBidWlsZC5hZGQocmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHJhbmdlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkLmZpbmlzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICBKb2luIGFuIGFycmF5IG9mIHJhbmdlIHNldHMgaW50byBhIHNpbmdsZSBzZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgam9pbihzZXRzKSB7XG4gICAgICAgIGlmICghc2V0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gUmFuZ2VTZXQuZW1wdHk7XG4gICAgICAgIGxldCByZXN1bHQgPSBzZXRzW3NldHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGZvciAobGV0IGkgPSBzZXRzLmxlbmd0aCAtIDI7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBsYXllciA9IHNldHNbaV07IGxheWVyICE9IFJhbmdlU2V0LmVtcHR5OyBsYXllciA9IGxheWVyLm5leHRMYXllcilcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUmFuZ2VTZXQobGF5ZXIuY2h1bmtQb3MsIGxheWVyLmNodW5rLCByZXN1bHQsIE1hdGgubWF4KGxheWVyLm1heFBvaW50LCByZXN1bHQubWF4UG9pbnQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNldCBvZiByYW5nZXMuXG4qL1xuUmFuZ2VTZXQuZW1wdHkgPSAvKkBfX1BVUkVfXyovbmV3IFJhbmdlU2V0KFtdLCBbXSwgbnVsbCwgLTEpO1xuZnVuY3Rpb24gbGF6eVNvcnQocmFuZ2VzKSB7XG4gICAgaWYgKHJhbmdlcy5sZW5ndGggPiAxKVxuICAgICAgICBmb3IgKGxldCBwcmV2ID0gcmFuZ2VzWzBdLCBpID0gMTsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGN1ciA9IHJhbmdlc1tpXTtcbiAgICAgICAgICAgIGlmIChjbXBSYW5nZShwcmV2LCBjdXIpID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2VzLnNsaWNlKCkuc29ydChjbXBSYW5nZSk7XG4gICAgICAgICAgICBwcmV2ID0gY3VyO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblJhbmdlU2V0LmVtcHR5Lm5leHRMYXllciA9IFJhbmdlU2V0LmVtcHR5O1xuLyoqXG5BIHJhbmdlIHNldCBidWlsZGVyIGlzIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBoZWxwcyBidWlsZCB1cCBhXG5bcmFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0KSBkaXJlY3RseSwgd2l0aG91dCBmaXJzdCBhbGxvY2F0aW5nXG5hbiBhcnJheSBvZiBbYFJhbmdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZSkgb2JqZWN0cy5cbiovXG5jbGFzcyBSYW5nZVNldEJ1aWxkZXIge1xuICAgIGZpbmlzaENodW5rKG5ld0FycmF5cykge1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKG5ldyBDaHVuayh0aGlzLmZyb20sIHRoaXMudG8sIHRoaXMudmFsdWUsIHRoaXMubWF4UG9pbnQpKTtcbiAgICAgICAgdGhpcy5jaHVua1Bvcy5wdXNoKHRoaXMuY2h1bmtTdGFydCk7XG4gICAgICAgIHRoaXMuY2h1bmtTdGFydCA9IC0xO1xuICAgICAgICB0aGlzLnNldE1heFBvaW50ID0gTWF0aC5tYXgodGhpcy5zZXRNYXhQb2ludCwgdGhpcy5tYXhQb2ludCk7XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSAtMTtcbiAgICAgICAgaWYgKG5ld0FycmF5cykge1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gW107XG4gICAgICAgICAgICB0aGlzLnRvID0gW107XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGVtcHR5IGJ1aWxkZXIuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1BvcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0RnJvbSA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICB0aGlzLmxhc3RUbyA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICB0aGlzLmZyb20gPSBbXTtcbiAgICAgICAgdGhpcy50byA9IFtdO1xuICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSAtMTtcbiAgICAgICAgdGhpcy5zZXRNYXhQb2ludCA9IC0xO1xuICAgICAgICB0aGlzLm5leHRMYXllciA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCBhIHJhbmdlLiBSYW5nZXMgc2hvdWxkIGJlIGFkZGVkIGluIHNvcnRlZCAoYnkgYGZyb21gIGFuZFxuICAgIGB2YWx1ZS5zdGFydFNpZGVgKSBvcmRlci5cbiAgICAqL1xuICAgIGFkZChmcm9tLCB0bywgdmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFkZElubmVyKGZyb20sIHRvLCB2YWx1ZSkpXG4gICAgICAgICAgICAodGhpcy5uZXh0TGF5ZXIgfHwgKHRoaXMubmV4dExheWVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcikpLmFkZChmcm9tLCB0bywgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFkZElubmVyKGZyb20sIHRvLCB2YWx1ZSkge1xuICAgICAgICBsZXQgZGlmZiA9IGZyb20gLSB0aGlzLmxhc3RUbyB8fCB2YWx1ZS5zdGFydFNpZGUgLSB0aGlzLmxhc3QuZW5kU2lkZTtcbiAgICAgICAgaWYgKGRpZmYgPD0gMCAmJiAoZnJvbSAtIHRoaXMubGFzdEZyb20gfHwgdmFsdWUuc3RhcnRTaWRlIC0gdGhpcy5sYXN0LnN0YXJ0U2lkZSkgPCAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmFuZ2VzIG11c3QgYmUgYWRkZWQgc29ydGVkIGJ5IGBmcm9tYCBwb3NpdGlvbiBhbmQgYHN0YXJ0U2lkZWBcIik7XG4gICAgICAgIGlmIChkaWZmIDwgMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZnJvbS5sZW5ndGggPT0gMjUwIC8qIEMuQ2h1bmtTaXplICovKVxuICAgICAgICAgICAgdGhpcy5maW5pc2hDaHVuayh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtTdGFydCA8IDApXG4gICAgICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSBmcm9tO1xuICAgICAgICB0aGlzLmZyb20ucHVzaChmcm9tIC0gdGhpcy5jaHVua1N0YXJ0KTtcbiAgICAgICAgdGhpcy50by5wdXNoKHRvIC0gdGhpcy5jaHVua1N0YXJ0KTtcbiAgICAgICAgdGhpcy5sYXN0ID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGFzdEZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmxhc3RUbyA9IHRvO1xuICAgICAgICB0aGlzLnZhbHVlLnB1c2godmFsdWUpO1xuICAgICAgICBpZiAodmFsdWUucG9pbnQpXG4gICAgICAgICAgICB0aGlzLm1heFBvaW50ID0gTWF0aC5tYXgodGhpcy5tYXhQb2ludCwgdG8gLSBmcm9tKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYWRkQ2h1bmsoZnJvbSwgY2h1bmspIHtcbiAgICAgICAgaWYgKChmcm9tIC0gdGhpcy5sYXN0VG8gfHwgY2h1bmsudmFsdWVbMF0uc3RhcnRTaWRlIC0gdGhpcy5sYXN0LmVuZFNpZGUpIDwgMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZnJvbS5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmZpbmlzaENodW5rKHRydWUpO1xuICAgICAgICB0aGlzLnNldE1heFBvaW50ID0gTWF0aC5tYXgodGhpcy5zZXRNYXhQb2ludCwgY2h1bmsubWF4UG9pbnQpO1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgdGhpcy5jaHVua1Bvcy5wdXNoKGZyb20pO1xuICAgICAgICBsZXQgbGFzdCA9IGNodW5rLnZhbHVlLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMubGFzdCA9IGNodW5rLnZhbHVlW2xhc3RdO1xuICAgICAgICB0aGlzLmxhc3RGcm9tID0gY2h1bmsuZnJvbVtsYXN0XSArIGZyb207XG4gICAgICAgIHRoaXMubGFzdFRvID0gY2h1bmsudG9bbGFzdF0gKyBmcm9tO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluaXNoIHRoZSByYW5nZSBzZXQuIFJldHVybnMgdGhlIG5ldyBzZXQuIFRoZSBidWlsZGVyIGNhbid0IGJlXG4gICAgdXNlZCBhbnltb3JlIGFmdGVyIHRoaXMgaGFzIGJlZW4gY2FsbGVkLlxuICAgICovXG4gICAgZmluaXNoKCkgeyByZXR1cm4gdGhpcy5maW5pc2hJbm5lcihSYW5nZVNldC5lbXB0eSk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbmlzaElubmVyKG5leHQpIHtcbiAgICAgICAgaWYgKHRoaXMuZnJvbS5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmZpbmlzaENodW5rKGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIGxldCByZXN1bHQgPSBSYW5nZVNldC5jcmVhdGUodGhpcy5jaHVua1BvcywgdGhpcy5jaHVua3MsIHRoaXMubmV4dExheWVyID8gdGhpcy5uZXh0TGF5ZXIuZmluaXNoSW5uZXIobmV4dCkgOiBuZXh0LCB0aGlzLnNldE1heFBvaW50KTtcbiAgICAgICAgdGhpcy5mcm9tID0gbnVsbDsgLy8gTWFrZSBzdXJlIGZ1cnRoZXIgYGFkZGAgY2FsbHMgcHJvZHVjZSBlcnJvcnNcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kU2hhcmVkQ2h1bmtzKGEsIGIsIHRleHREaWZmKSB7XG4gICAgbGV0IGluQSA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGxldCBzZXQgb2YgYSlcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQuY2h1bmsubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoc2V0LmNodW5rW2ldLm1heFBvaW50IDw9IDApXG4gICAgICAgICAgICAgICAgaW5BLnNldChzZXQuY2h1bmtbaV0sIHNldC5jaHVua1Bvc1tpXSk7XG4gICAgbGV0IHNoYXJlZCA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBzZXQgb2YgYilcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQuY2h1bmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBrbm93biA9IGluQS5nZXQoc2V0LmNodW5rW2ldKTtcbiAgICAgICAgICAgIGlmIChrbm93biAhPSBudWxsICYmICh0ZXh0RGlmZiA/IHRleHREaWZmLm1hcFBvcyhrbm93bikgOiBrbm93bikgPT0gc2V0LmNodW5rUG9zW2ldICYmXG4gICAgICAgICAgICAgICAgISh0ZXh0RGlmZiA9PT0gbnVsbCB8fCB0ZXh0RGlmZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dERpZmYudG91Y2hlc1JhbmdlKGtub3duLCBrbm93biArIHNldC5jaHVua1tpXS5sZW5ndGgpKSlcbiAgICAgICAgICAgICAgICBzaGFyZWQuYWRkKHNldC5jaHVua1tpXSk7XG4gICAgICAgIH1cbiAgICByZXR1cm4gc2hhcmVkO1xufVxuY2xhc3MgTGF5ZXJDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGxheWVyLCBza2lwLCBtaW5Qb2ludCwgcmFuayA9IDApIHtcbiAgICAgICAgdGhpcy5sYXllciA9IGxheWVyO1xuICAgICAgICB0aGlzLnNraXAgPSBza2lwO1xuICAgICAgICB0aGlzLm1pblBvaW50ID0gbWluUG9pbnQ7XG4gICAgICAgIHRoaXMucmFuayA9IHJhbms7XG4gICAgfVxuICAgIGdldCBzdGFydFNpZGUoKSB7IHJldHVybiB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5zdGFydFNpZGUgOiAwOyB9XG4gICAgZ2V0IGVuZFNpZGUoKSB7IHJldHVybiB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5lbmRTaWRlIDogMDsgfVxuICAgIGdvdG8ocG9zLCBzaWRlID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi8pIHtcbiAgICAgICAgdGhpcy5jaHVua0luZGV4ID0gdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5nb3RvSW5uZXIocG9zLCBzaWRlLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBnb3RvSW5uZXIocG9zLCBzaWRlLCBmb3J3YXJkKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLmNodW5rSW5kZXggPCB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF07XG4gICAgICAgICAgICBpZiAoISh0aGlzLnNraXAgJiYgdGhpcy5za2lwLmhhcyhuZXh0KSB8fFxuICAgICAgICAgICAgICAgIHRoaXMubGF5ZXIuY2h1bmtFbmQodGhpcy5jaHVua0luZGV4KSA8IHBvcyB8fFxuICAgICAgICAgICAgICAgIG5leHQubWF4UG9pbnQgPCB0aGlzLm1pblBvaW50KSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgZm9yd2FyZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNodW5rSW5kZXggPCB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJhbmdlSW5kZXggPSB0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF0uZmluZEluZGV4KHBvcyAtIHRoaXMubGF5ZXIuY2h1bmtQb3NbdGhpcy5jaHVua0luZGV4XSwgc2lkZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIWZvcndhcmQgfHwgdGhpcy5yYW5nZUluZGV4IDwgcmFuZ2VJbmRleClcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlSW5kZXgocmFuZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICAgIGZvcndhcmQocG9zLCBzaWRlKSB7XG4gICAgICAgIGlmICgodGhpcy50byAtIHBvcyB8fCB0aGlzLmVuZFNpZGUgLSBzaWRlKSA8IDApXG4gICAgICAgICAgICB0aGlzLmdvdG9Jbm5lcihwb3MsIHNpZGUsIHRydWUpO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaHVua0luZGV4ID09IHRoaXMubGF5ZXIuY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcm9tID0gdGhpcy50byA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgY2h1bmtQb3MgPSB0aGlzLmxheWVyLmNodW5rUG9zW3RoaXMuY2h1bmtJbmRleF0sIGNodW5rID0gdGhpcy5sYXllci5jaHVua1t0aGlzLmNodW5rSW5kZXhdO1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gY2h1bmtQb3MgKyBjaHVuay5mcm9tW3RoaXMucmFuZ2VJbmRleF07XG4gICAgICAgICAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvID0gY2h1bmtQb3MgKyBjaHVuay50b1t0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBjaHVuay52YWx1ZVt0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2VJbmRleCh0aGlzLnJhbmdlSW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5taW5Qb2ludCA8IDAgfHwgdGhpcy52YWx1ZS5wb2ludCAmJiB0aGlzLnRvIC0gdGhpcy5mcm9tID49IHRoaXMubWluUG9pbnQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNldFJhbmdlSW5kZXgoaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID09IHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2tpcCkge1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLmNodW5rSW5kZXggPCB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCAmJiB0aGlzLnNraXAuaGFzKHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XSkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIG5leHRDaHVuaygpIHtcbiAgICAgICAgdGhpcy5jaHVua0luZGV4Kys7XG4gICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IDA7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICBjb21wYXJlKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb20gLSBvdGhlci5mcm9tIHx8IHRoaXMuc3RhcnRTaWRlIC0gb3RoZXIuc3RhcnRTaWRlIHx8IHRoaXMucmFuayAtIG90aGVyLnJhbmsgfHxcbiAgICAgICAgICAgIHRoaXMudG8gLSBvdGhlci50byB8fCB0aGlzLmVuZFNpZGUgLSBvdGhlci5lbmRTaWRlO1xuICAgIH1cbn1cbmNsYXNzIEhlYXBDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGhlYXApIHtcbiAgICAgICAgdGhpcy5oZWFwID0gaGVhcDtcbiAgICB9XG4gICAgc3RhdGljIGZyb20oc2V0cywgc2tpcCA9IG51bGwsIG1pblBvaW50ID0gLTEpIHtcbiAgICAgICAgbGV0IGhlYXAgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjdXIgPSBzZXRzW2ldOyAhY3VyLmlzRW1wdHk7IGN1ciA9IGN1ci5uZXh0TGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VyLm1heFBvaW50ID49IG1pblBvaW50KVxuICAgICAgICAgICAgICAgICAgICBoZWFwLnB1c2gobmV3IExheWVyQ3Vyc29yKGN1ciwgc2tpcCwgbWluUG9pbnQsIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVhcC5sZW5ndGggPT0gMSA/IGhlYXBbMF0gOiBuZXcgSGVhcEN1cnNvcihoZWFwKTtcbiAgICB9XG4gICAgZ2V0IHN0YXJ0U2lkZSgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLnN0YXJ0U2lkZSA6IDA7IH1cbiAgICBnb3RvKHBvcywgc2lkZSA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovKSB7XG4gICAgICAgIGZvciAobGV0IGN1ciBvZiB0aGlzLmhlYXApXG4gICAgICAgICAgICBjdXIuZ290byhwb3MsIHNpZGUpO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5oZWFwLmxlbmd0aCA+PiAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgIGhlYXBCdWJibGUodGhpcy5oZWFwLCBpKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBmb3J3YXJkKHBvcywgc2lkZSkge1xuICAgICAgICBmb3IgKGxldCBjdXIgb2YgdGhpcy5oZWFwKVxuICAgICAgICAgICAgY3VyLmZvcndhcmQocG9zLCBzaWRlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaGVhcC5sZW5ndGggPj4gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBoZWFwQnViYmxlKHRoaXMuaGVhcCwgaSk7XG4gICAgICAgIGlmICgodGhpcy50byAtIHBvcyB8fCB0aGlzLnZhbHVlLmVuZFNpZGUgLSBzaWRlKSA8IDApXG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGVhcC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gdGhpcy50byA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMucmFuayA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMuaGVhcFswXTtcbiAgICAgICAgICAgIHRoaXMuZnJvbSA9IHRvcC5mcm9tO1xuICAgICAgICAgICAgdGhpcy50byA9IHRvcC50bztcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0b3AudmFsdWU7XG4gICAgICAgICAgICB0aGlzLnJhbmsgPSB0b3AucmFuaztcbiAgICAgICAgICAgIGlmICh0b3AudmFsdWUpXG4gICAgICAgICAgICAgICAgdG9wLm5leHQoKTtcbiAgICAgICAgICAgIGhlYXBCdWJibGUodGhpcy5oZWFwLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGhlYXBCdWJibGUoaGVhcCwgaW5kZXgpIHtcbiAgICBmb3IgKGxldCBjdXIgPSBoZWFwW2luZGV4XTs7KSB7XG4gICAgICAgIGxldCBjaGlsZEluZGV4ID0gKGluZGV4IDw8IDEpICsgMTtcbiAgICAgICAgaWYgKGNoaWxkSW5kZXggPj0gaGVhcC5sZW5ndGgpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IGNoaWxkID0gaGVhcFtjaGlsZEluZGV4XTtcbiAgICAgICAgaWYgKGNoaWxkSW5kZXggKyAxIDwgaGVhcC5sZW5ndGggJiYgY2hpbGQuY29tcGFyZShoZWFwW2NoaWxkSW5kZXggKyAxXSkgPj0gMCkge1xuICAgICAgICAgICAgY2hpbGQgPSBoZWFwW2NoaWxkSW5kZXggKyAxXTtcbiAgICAgICAgICAgIGNoaWxkSW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VyLmNvbXBhcmUoY2hpbGQpIDwgMClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBoZWFwW2NoaWxkSW5kZXhdID0gY3VyO1xuICAgICAgICBoZWFwW2luZGV4XSA9IGNoaWxkO1xuICAgICAgICBpbmRleCA9IGNoaWxkSW5kZXg7XG4gICAgfVxufVxuY2xhc3MgU3BhbkN1cnNvciB7XG4gICAgY29uc3RydWN0b3Ioc2V0cywgc2tpcCwgbWluUG9pbnQpIHtcbiAgICAgICAgdGhpcy5taW5Qb2ludCA9IG1pblBvaW50O1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IFtdO1xuICAgICAgICB0aGlzLmFjdGl2ZVRvID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlUmFuayA9IFtdO1xuICAgICAgICB0aGlzLm1pbkFjdGl2ZSA9IC0xO1xuICAgICAgICAvLyBBIGN1cnJlbnRseSBhY3RpdmUgcG9pbnQgcmFuZ2UsIGlmIGFueVxuICAgICAgICB0aGlzLnBvaW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb2ludEZyb20gPSAwO1xuICAgICAgICB0aGlzLnBvaW50UmFuayA9IDA7XG4gICAgICAgIHRoaXMudG8gPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgdGhpcy5lbmRTaWRlID0gMDtcbiAgICAgICAgLy8gVGhlIGFtb3VudCBvZiBvcGVuIGFjdGl2ZSByYW5nZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgLy8gTm90IGluY2x1ZGluZyBwb2ludHMuXG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gSGVhcEN1cnNvci5mcm9tKHNldHMsIHNraXAsIG1pblBvaW50KTtcbiAgICB9XG4gICAgZ290byhwb3MsIHNpZGUgPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLykge1xuICAgICAgICB0aGlzLmN1cnNvci5nb3RvKHBvcywgc2lkZSk7XG4gICAgICAgIHRoaXMuYWN0aXZlLmxlbmd0aCA9IHRoaXMuYWN0aXZlVG8ubGVuZ3RoID0gdGhpcy5hY3RpdmVSYW5rLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMubWluQWN0aXZlID0gLTE7XG4gICAgICAgIHRoaXMudG8gPSBwb3M7XG4gICAgICAgIHRoaXMuZW5kU2lkZSA9IHNpZGU7XG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZm9yd2FyZChwb3MsIHNpZGUpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMubWluQWN0aXZlID4gLTEgJiYgKHRoaXMuYWN0aXZlVG9bdGhpcy5taW5BY3RpdmVdIC0gcG9zIHx8IHRoaXMuYWN0aXZlW3RoaXMubWluQWN0aXZlXS5lbmRTaWRlIC0gc2lkZSkgPCAwKVxuICAgICAgICAgICAgdGhpcy5yZW1vdmVBY3RpdmUodGhpcy5taW5BY3RpdmUpO1xuICAgICAgICB0aGlzLmN1cnNvci5mb3J3YXJkKHBvcywgc2lkZSk7XG4gICAgfVxuICAgIHJlbW92ZUFjdGl2ZShpbmRleCkge1xuICAgICAgICByZW1vdmUodGhpcy5hY3RpdmUsIGluZGV4KTtcbiAgICAgICAgcmVtb3ZlKHRoaXMuYWN0aXZlVG8sIGluZGV4KTtcbiAgICAgICAgcmVtb3ZlKHRoaXMuYWN0aXZlUmFuaywgaW5kZXgpO1xuICAgICAgICB0aGlzLm1pbkFjdGl2ZSA9IGZpbmRNaW5JbmRleCh0aGlzLmFjdGl2ZSwgdGhpcy5hY3RpdmVUbyk7XG4gICAgfVxuICAgIGFkZEFjdGl2ZSh0cmFja09wZW4pIHtcbiAgICAgICAgbGV0IGkgPSAwLCB7IHZhbHVlLCB0bywgcmFuayB9ID0gdGhpcy5jdXJzb3I7XG4gICAgICAgIC8vIE9yZ2FuaXplIGFjdGl2ZSBtYXJrcyBieSByYW5rIGZpcnN0LCB0aGVuIGJ5IHNpemVcbiAgICAgICAgd2hpbGUgKGkgPCB0aGlzLmFjdGl2ZVJhbmsubGVuZ3RoICYmIChyYW5rIC0gdGhpcy5hY3RpdmVSYW5rW2ldIHx8IHRvIC0gdGhpcy5hY3RpdmVUb1tpXSkgPiAwKVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICBpbnNlcnQodGhpcy5hY3RpdmUsIGksIHZhbHVlKTtcbiAgICAgICAgaW5zZXJ0KHRoaXMuYWN0aXZlVG8sIGksIHRvKTtcbiAgICAgICAgaW5zZXJ0KHRoaXMuYWN0aXZlUmFuaywgaSwgcmFuayk7XG4gICAgICAgIGlmICh0cmFja09wZW4pXG4gICAgICAgICAgICBpbnNlcnQodHJhY2tPcGVuLCBpLCB0aGlzLmN1cnNvci5mcm9tKTtcbiAgICAgICAgdGhpcy5taW5BY3RpdmUgPSBmaW5kTWluSW5kZXgodGhpcy5hY3RpdmUsIHRoaXMuYWN0aXZlVG8pO1xuICAgIH1cbiAgICAvLyBBZnRlciBjYWxsaW5nIHRoaXMsIGlmIGB0aGlzLnBvaW50YCAhPSBudWxsLCB0aGUgbmV4dCByYW5nZSBpcyBhXG4gICAgLy8gcG9pbnQuIE90aGVyd2lzZSwgaXQncyBhIHJlZ3VsYXIgcmFuZ2UsIGNvdmVyZWQgYnkgYHRoaXMuYWN0aXZlYC5cbiAgICBuZXh0KCkge1xuICAgICAgICBsZXQgZnJvbSA9IHRoaXMudG8sIHdhc1BvaW50ID0gdGhpcy5wb2ludDtcbiAgICAgICAgdGhpcy5wb2ludCA9IG51bGw7XG4gICAgICAgIGxldCB0cmFja09wZW4gPSB0aGlzLm9wZW5TdGFydCA8IDAgPyBbXSA6IG51bGw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBhID0gdGhpcy5taW5BY3RpdmU7XG4gICAgICAgICAgICBpZiAoYSA+IC0xICYmICh0aGlzLmFjdGl2ZVRvW2FdIC0gdGhpcy5jdXJzb3IuZnJvbSB8fCB0aGlzLmFjdGl2ZVthXS5lbmRTaWRlIC0gdGhpcy5jdXJzb3Iuc3RhcnRTaWRlKSA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVUb1thXSA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50byA9IHRoaXMuYWN0aXZlVG9bYV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kU2lkZSA9IHRoaXMuYWN0aXZlW2FdLmVuZFNpZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUFjdGl2ZShhKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tPcGVuKVxuICAgICAgICAgICAgICAgICAgICByZW1vdmUodHJhY2tPcGVuLCBhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmN1cnNvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG8gPSB0aGlzLmVuZFNpZGUgPSAxMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jdXJzb3IuZnJvbSA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvID0gdGhpcy5jdXJzb3IuZnJvbTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFNpZGUgPSB0aGlzLmN1cnNvci5zdGFydFNpZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFZhbCA9IHRoaXMuY3Vyc29yLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghbmV4dFZhbC5wb2ludCkgeyAvLyBPcGVuaW5nIGEgcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRBY3RpdmUodHJhY2tPcGVuKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh3YXNQb2ludCAmJiB0aGlzLmN1cnNvci50byA9PSB0aGlzLnRvICYmIHRoaXMuY3Vyc29yLmZyb20gPCB0aGlzLmN1cnNvci50bykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYW55IG5vbi1lbXB0eSBwb2ludHMgdGhhdCBlbmQgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgdGhlIHByZXYgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgLy8gTmV3IHBvaW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnQgPSBuZXh0VmFsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50RnJvbSA9IHRoaXMuY3Vyc29yLmZyb207XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRSYW5rID0gdGhpcy5jdXJzb3IucmFuaztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50byA9IHRoaXMuY3Vyc29yLnRvO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZFNpZGUgPSBuZXh0VmFsLmVuZFNpZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3J3YXJkKHRoaXMudG8sIHRoaXMuZW5kU2lkZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2tPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5TdGFydCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdHJhY2tPcGVuLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiB0cmFja09wZW5baV0gPCBmcm9tOyBpLS0pXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuU3RhcnQrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhY3RpdmVGb3JQb2ludCh0bykge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgICAgICAgbGV0IGFjdGl2ZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVJhbmtbaV0gPCB0aGlzLnBvaW50UmFuaylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVRvW2ldID4gdG8gfHwgdGhpcy5hY3RpdmVUb1tpXSA9PSB0byAmJiB0aGlzLmFjdGl2ZVtpXS5lbmRTaWRlID49IHRoaXMucG9pbnQuZW5kU2lkZSlcbiAgICAgICAgICAgICAgICBhY3RpdmUucHVzaCh0aGlzLmFjdGl2ZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjdGl2ZS5yZXZlcnNlKCk7XG4gICAgfVxuICAgIG9wZW5FbmQodG8pIHtcbiAgICAgICAgbGV0IG9wZW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVUby5sZW5ndGggLSAxOyBpID49IDAgJiYgdGhpcy5hY3RpdmVUb1tpXSA+IHRvOyBpLS0pXG4gICAgICAgICAgICBvcGVuKys7XG4gICAgICAgIHJldHVybiBvcGVuO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgc3RhcnRBLCBiLCBzdGFydEIsIGxlbmd0aCwgY29tcGFyYXRvcikge1xuICAgIGEuZ290byhzdGFydEEpO1xuICAgIGIuZ290byhzdGFydEIpO1xuICAgIGxldCBlbmRCID0gc3RhcnRCICsgbGVuZ3RoO1xuICAgIGxldCBwb3MgPSBzdGFydEIsIGRQb3MgPSBzdGFydEIgLSBzdGFydEE7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBsZXQgZGlmZiA9IChhLnRvICsgZFBvcykgLSBiLnRvIHx8IGEuZW5kU2lkZSAtIGIuZW5kU2lkZTtcbiAgICAgICAgbGV0IGVuZCA9IGRpZmYgPCAwID8gYS50byArIGRQb3MgOiBiLnRvLCBjbGlwRW5kID0gTWF0aC5taW4oZW5kLCBlbmRCKTtcbiAgICAgICAgaWYgKGEucG9pbnQgfHwgYi5wb2ludCkge1xuICAgICAgICAgICAgaWYgKCEoYS5wb2ludCAmJiBiLnBvaW50ICYmIChhLnBvaW50ID09IGIucG9pbnQgfHwgYS5wb2ludC5lcShiLnBvaW50KSkgJiZcbiAgICAgICAgICAgICAgICBzYW1lVmFsdWVzKGEuYWN0aXZlRm9yUG9pbnQoYS50byksIGIuYWN0aXZlRm9yUG9pbnQoYi50bykpKSlcbiAgICAgICAgICAgICAgICBjb21wYXJhdG9yLmNvbXBhcmVQb2ludChwb3MsIGNsaXBFbmQsIGEucG9pbnQsIGIucG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNsaXBFbmQgPiBwb3MgJiYgIXNhbWVWYWx1ZXMoYS5hY3RpdmUsIGIuYWN0aXZlKSlcbiAgICAgICAgICAgICAgICBjb21wYXJhdG9yLmNvbXBhcmVSYW5nZShwb3MsIGNsaXBFbmQsIGEuYWN0aXZlLCBiLmFjdGl2ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCA+IGVuZEIpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICBpZiAoZGlmZiA8PSAwKVxuICAgICAgICAgICAgYS5uZXh0KCk7XG4gICAgICAgIGlmIChkaWZmID49IDApXG4gICAgICAgICAgICBiLm5leHQoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzYW1lVmFsdWVzKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChhW2ldICE9IGJbaV0gJiYgIWFbaV0uZXEoYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZW1vdmUoYXJyYXksIGluZGV4KSB7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4LCBlID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA8IGU7IGkrKylcbiAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtpICsgMV07XG4gICAgYXJyYXkucG9wKCk7XG59XG5mdW5jdGlvbiBpbnNlcnQoYXJyYXksIGluZGV4LCB2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IGluZGV4OyBpLS0pXG4gICAgICAgIGFycmF5W2kgKyAxXSA9IGFycmF5W2ldO1xuICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gZmluZE1pbkluZGV4KHZhbHVlLCBhcnJheSkge1xuICAgIGxldCBmb3VuZCA9IC0xLCBmb3VuZFBvcyA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKChhcnJheVtpXSAtIGZvdW5kUG9zIHx8IHZhbHVlW2ldLmVuZFNpZGUgLSB2YWx1ZVtmb3VuZF0uZW5kU2lkZSkgPCAwKSB7XG4gICAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgICBmb3VuZFBvcyA9IGFycmF5W2ldO1xuICAgICAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuXG4vKipcbkNvdW50IHRoZSBjb2x1bW4gcG9zaXRpb24gYXQgdGhlIGdpdmVuIG9mZnNldCBpbnRvIHRoZSBzdHJpbmcsXG50YWtpbmcgZXh0ZW5kaW5nIGNoYXJhY3RlcnMgYW5kIHRhYiBzaXplIGludG8gYWNjb3VudC5cbiovXG5mdW5jdGlvbiBjb3VudENvbHVtbihzdHJpbmcsIHRhYlNpemUsIHRvID0gc3RyaW5nLmxlbmd0aCkge1xuICAgIGxldCBuID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvOykge1xuICAgICAgICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoaSkgPT0gOSkge1xuICAgICAgICAgICAgbiArPSB0YWJTaXplIC0gKG4gJSB0YWJTaXplKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG4rKztcbiAgICAgICAgICAgIGkgPSBmaW5kQ2x1c3RlckJyZWFrKHN0cmluZywgaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG4vKipcbkZpbmQgdGhlIG9mZnNldCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBjb2x1bW4gcG9zaXRpb24gaW4gYVxuc3RyaW5nLCB0YWtpbmcgZXh0ZW5kaW5nIGNoYXJhY3RlcnMgYW5kIHRhYiBzaXplIGludG8gYWNjb3VudC4gQnlcbmRlZmF1bHQsIHRoZSBzdHJpbmcgbGVuZ3RoIGlzIHJldHVybmVkIHdoZW4gaXQgaXMgdG9vIHNob3J0IHRvXG5yZWFjaCB0aGUgY29sdW1uLiBQYXNzIGBzdHJpY3RgIHRydWUgdG8gbWFrZSBpdCByZXR1cm4gLTEgaW4gdGhhdFxuc2l0dWF0aW9uLlxuKi9cbmZ1bmN0aW9uIGZpbmRDb2x1bW4oc3RyaW5nLCBjb2wsIHRhYlNpemUsIHN0cmljdCkge1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gMDs7KSB7XG4gICAgICAgIGlmIChuID49IGNvbClcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICBpZiAoaSA9PSBzdHJpbmcubGVuZ3RoKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIG4gKz0gc3RyaW5nLmNoYXJDb2RlQXQoaSkgPT0gOSA/IHRhYlNpemUgLSAobiAlIHRhYlNpemUpIDogMTtcbiAgICAgICAgaSA9IGZpbmRDbHVzdGVyQnJlYWsoc3RyaW5nLCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cmljdCA9PT0gdHJ1ZSA/IC0xIDogc3RyaW5nLmxlbmd0aDtcbn1cblxuZXhwb3J0IHsgQW5ub3RhdGlvbiwgQW5ub3RhdGlvblR5cGUsIENoYW5nZURlc2MsIENoYW5nZVNldCwgQ2hhckNhdGVnb3J5LCBDb21wYXJ0bWVudCwgRWRpdG9yU2VsZWN0aW9uLCBFZGl0b3JTdGF0ZSwgRmFjZXQsIExpbmUsIE1hcE1vZGUsIFByZWMsIFJhbmdlLCBSYW5nZVNldCwgUmFuZ2VTZXRCdWlsZGVyLCBSYW5nZVZhbHVlLCBTZWxlY3Rpb25SYW5nZSwgU3RhdGVFZmZlY3QsIFN0YXRlRWZmZWN0VHlwZSwgU3RhdGVGaWVsZCwgVGV4dCwgVHJhbnNhY3Rpb24sIGNvZGVQb2ludEF0LCBjb2RlUG9pbnRTaXplLCBjb21iaW5lQ29uZmlnLCBjb3VudENvbHVtbiwgZmluZENsdXN0ZXJCcmVhaywgZmluZENvbHVtbiwgZnJvbUNvZGVQb2ludCB9O1xuIiwgImNvbnN0IEMgPSBcIlxcdTAzN2NcIlxuY29uc3QgQ09VTlQgPSB0eXBlb2YgU3ltYm9sID09IFwidW5kZWZpbmVkXCIgPyBcIl9fXCIgKyBDIDogU3ltYm9sLmZvcihDKVxuY29uc3QgU0VUID0gdHlwZW9mIFN5bWJvbCA9PSBcInVuZGVmaW5lZFwiID8gXCJfX3N0eWxlU2V0XCIgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTgpIDogU3ltYm9sKFwic3R5bGVTZXRcIilcbmNvbnN0IHRvcCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9IFwidW5kZWZpbmVkXCIgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge31cblxuLy8gOjogLSBTdHlsZSBtb2R1bGVzIGVuY2Fwc3VsYXRlIGEgc2V0IG9mIENTUyBydWxlcyBkZWZpbmVkIGZyb21cbi8vIEphdmFTY3JpcHQuIFRoZWlyIGRlZmluaXRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBhIGdpdmVuIERPTVxuLy8gcm9vdCBhZnRlciBpdCBoYXMgYmVlbiBfbW91bnRlZF8gdGhlcmUgd2l0aCBgU3R5bGVNb2R1bGUubW91bnRgLlxuLy9cbi8vIFN0eWxlIG1vZHVsZXMgc2hvdWxkIGJlIGNyZWF0ZWQgb25jZSBhbmQgc3RvcmVkIHNvbWV3aGVyZSwgYXNcbi8vIG9wcG9zZWQgdG8gcmUtY3JlYXRpbmcgdGhlbSBldmVyeSB0aW1lIHlvdSBuZWVkIHRoZW0uIFRoZSBhbW91bnQgb2Zcbi8vIENTUyBydWxlcyBnZW5lcmF0ZWQgZm9yIGEgZ2l2ZW4gRE9NIHJvb3QgaXMgYm91bmRlZCBieSB0aGUgYW1vdW50XG4vLyBvZiBzdHlsZSBtb2R1bGVzIHRoYXQgd2VyZSB1c2VkLiBTbyB0byBhdm9pZCBsZWFraW5nIHJ1bGVzLCBkb24ndFxuLy8gY3JlYXRlIHRoZXNlIGR5bmFtaWNhbGx5LCBidXQgdHJlYXQgdGhlbSBhcyBvbmUtdGltZSBhbGxvY2F0aW9ucy5cbmV4cG9ydCBjbGFzcyBTdHlsZU1vZHVsZSB7XG4gIC8vIDo6IChPYmplY3Q8U3R5bGU+LCA/e2ZpbmlzaDogPyhzdHJpbmcpIFx1MjE5MiBzdHJpbmd9KVxuICAvLyBDcmVhdGUgYSBzdHlsZSBtb2R1bGUgZnJvbSB0aGUgZ2l2ZW4gc3BlYy5cbiAgLy9cbiAgLy8gV2hlbiBgZmluaXNoYCBpcyBnaXZlbiwgaXQgaXMgY2FsbGVkIG9uIHJlZ3VsYXIgKG5vbi1gQGApXG4gIC8vIHNlbGVjdG9ycyAoYWZ0ZXIgYCZgIGV4cGFuc2lvbikgdG8gY29tcHV0ZSB0aGUgZmluYWwgc2VsZWN0b3IuXG4gIGNvbnN0cnVjdG9yKHNwZWMsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnJ1bGVzID0gW11cbiAgICBsZXQge2ZpbmlzaH0gPSBvcHRpb25zIHx8IHt9XG5cbiAgICBmdW5jdGlvbiBzcGxpdFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gL15ALy50ZXN0KHNlbGVjdG9yKSA/IFtzZWxlY3Rvcl0gOiBzZWxlY3Rvci5zcGxpdCgvLFxccyovKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbmRlcihzZWxlY3RvcnMsIHNwZWMsIHRhcmdldCwgaXNLZXlmcmFtZXMpIHtcbiAgICAgIGxldCBsb2NhbCA9IFtdLCBpc0F0ID0gL15AKFxcdyspXFxiLy5leGVjKHNlbGVjdG9yc1swXSksIGtleWZyYW1lcyA9IGlzQXQgJiYgaXNBdFsxXSA9PSBcImtleWZyYW1lc1wiXG4gICAgICBpZiAoaXNBdCAmJiBzcGVjID09IG51bGwpIHJldHVybiB0YXJnZXQucHVzaChzZWxlY3RvcnNbMF0gKyBcIjtcIilcbiAgICAgIGZvciAobGV0IHByb3AgaW4gc3BlYykge1xuICAgICAgICBsZXQgdmFsdWUgPSBzcGVjW3Byb3BdXG4gICAgICAgIGlmICgvJi8udGVzdChwcm9wKSkge1xuICAgICAgICAgIHJlbmRlcihwcm9wLnNwbGl0KC8sXFxzKi8pLm1hcChwYXJ0ID0+IHNlbGVjdG9ycy5tYXAoc2VsID0+IHBhcnQucmVwbGFjZSgvJi8sIHNlbCkpKS5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpKSxcbiAgICAgICAgICAgICAgICAgdmFsdWUsIHRhcmdldClcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmICghaXNBdCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSAoXCIgKyBwcm9wICsgXCIpIHNob3VsZCBiZSBhIHByaW1pdGl2ZSB2YWx1ZS5cIilcbiAgICAgICAgICByZW5kZXIoc3BsaXRTZWxlY3Rvcihwcm9wKSwgdmFsdWUsIGxvY2FsLCBrZXlmcmFtZXMpXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsLnB1c2gocHJvcC5yZXBsYWNlKC9fLiovLCBcIlwiKS5yZXBsYWNlKC9bQS1aXS9nLCBsID0+IFwiLVwiICsgbC50b0xvd2VyQ2FzZSgpKSArIFwiOiBcIiArIHZhbHVlICsgXCI7XCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChsb2NhbC5sZW5ndGggfHwga2V5ZnJhbWVzKSB7XG4gICAgICAgIHRhcmdldC5wdXNoKChmaW5pc2ggJiYgIWlzQXQgJiYgIWlzS2V5ZnJhbWVzID8gc2VsZWN0b3JzLm1hcChmaW5pc2gpIDogc2VsZWN0b3JzKS5qb2luKFwiLCBcIikgK1xuICAgICAgICAgICAgICAgICAgICBcIiB7XCIgKyBsb2NhbC5qb2luKFwiIFwiKSArIFwifVwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IHByb3AgaW4gc3BlYykgcmVuZGVyKHNwbGl0U2VsZWN0b3IocHJvcCksIHNwZWNbcHJvcF0sIHRoaXMucnVsZXMpXG4gIH1cblxuICAvLyA6OiAoKSBcdTIxOTIgc3RyaW5nXG4gIC8vIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbW9kdWxlJ3MgQ1NTIHJ1bGVzLlxuICBnZXRSdWxlcygpIHsgcmV0dXJuIHRoaXMucnVsZXMuam9pbihcIlxcblwiKSB9XG5cbiAgLy8gOjogKCkgXHUyMTkyIHN0cmluZ1xuICAvLyBHZW5lcmF0ZSBhIG5ldyB1bmlxdWUgQ1NTIGNsYXNzIG5hbWUuXG4gIHN0YXRpYyBuZXdOYW1lKCkge1xuICAgIGxldCBpZCA9IHRvcFtDT1VOVF0gfHwgMVxuICAgIHRvcFtDT1VOVF0gPSBpZCArIDFcbiAgICByZXR1cm4gQyArIGlkLnRvU3RyaW5nKDM2KVxuICB9XG5cbiAgLy8gOjogKHVuaW9uPERvY3VtZW50LCBTaGFkb3dSb290PiwgdW5pb248W1N0eWxlTW9kdWxlXSwgU3R5bGVNb2R1bGU+LCA/e25vbmNlOiA/c3RyaW5nfSlcbiAgLy9cbiAgLy8gTW91bnQgdGhlIGdpdmVuIHNldCBvZiBtb2R1bGVzIGluIHRoZSBnaXZlbiBET00gcm9vdCwgd2hpY2ggZW5zdXJlc1xuICAvLyB0aGF0IHRoZSBDU1MgcnVsZXMgZGVmaW5lZCBieSB0aGUgbW9kdWxlIGFyZSBhdmFpbGFibGUgaW4gdGhhdFxuICAvLyBjb250ZXh0LlxuICAvL1xuICAvLyBSdWxlcyBhcmUgb25seSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgb25jZSBwZXIgcm9vdC5cbiAgLy9cbiAgLy8gUnVsZSBvcmRlciB3aWxsIGZvbGxvdyB0aGUgb3JkZXIgb2YgdGhlIG1vZHVsZXMsIHNvIHRoYXQgcnVsZXMgZnJvbVxuICAvLyBtb2R1bGVzIGxhdGVyIGluIHRoZSBhcnJheSB0YWtlIHByZWNlZGVuY2Ugb2YgdGhvc2UgZnJvbSBlYXJsaWVyXG4gIC8vIG1vZHVsZXMuIElmIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIHJvb3RcbiAgLy8gaW4gYSB3YXkgdGhhdCBjaGFuZ2VzIHRoZSBvcmRlciBvZiBhbHJlYWR5IG1vdW50ZWQgbW9kdWxlcywgdGhlIG9sZFxuICAvLyBvcmRlciB3aWxsIGJlIGNoYW5nZWQuXG4gIC8vXG4gIC8vIElmIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgbm9uY2UgaXMgcHJvdmlkZWQsIGl0IGlzIGFkZGVkIHRvXG4gIC8vIHRoZSBgPHN0eWxlPmAgdGFnIGdlbmVyYXRlZCBieSB0aGUgbGlicmFyeS5cbiAgc3RhdGljIG1vdW50KHJvb3QsIG1vZHVsZXMsIG9wdGlvbnMpIHtcbiAgICBsZXQgc2V0ID0gcm9vdFtTRVRdLCBub25jZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5ub25jZVxuICAgIGlmICghc2V0KSBzZXQgPSBuZXcgU3R5bGVTZXQocm9vdCwgbm9uY2UpXG4gICAgZWxzZSBpZiAobm9uY2UpIHNldC5zZXROb25jZShub25jZSlcbiAgICBzZXQubW91bnQoQXJyYXkuaXNBcnJheShtb2R1bGVzKSA/IG1vZHVsZXMgOiBbbW9kdWxlc10pXG4gIH1cbn1cblxubGV0IGFkb3B0ZWRTZXQgPSBuZXcgTWFwIC8vPERvY3VtZW50LCBTdHlsZVNldD5cblxuY2xhc3MgU3R5bGVTZXQge1xuICBjb25zdHJ1Y3Rvcihyb290LCBub25jZSkge1xuICAgIGxldCBkb2MgPSByb290Lm93bmVyRG9jdW1lbnQgfHwgcm9vdCwgd2luID0gZG9jLmRlZmF1bHRWaWV3XG4gICAgaWYgKCFyb290LmhlYWQgJiYgcm9vdC5hZG9wdGVkU3R5bGVTaGVldHMgJiYgd2luLkNTU1N0eWxlU2hlZXQpIHtcbiAgICAgIGxldCBhZG9wdGVkID0gYWRvcHRlZFNldC5nZXQoZG9jKVxuICAgICAgaWYgKGFkb3B0ZWQpIHtcbiAgICAgICAgcm9vdC5hZG9wdGVkU3R5bGVTaGVldHMgPSBbYWRvcHRlZC5zaGVldCwgLi4ucm9vdC5hZG9wdGVkU3R5bGVTaGVldHNdXG4gICAgICAgIHJldHVybiByb290W1NFVF0gPSBhZG9wdGVkXG4gICAgICB9XG4gICAgICB0aGlzLnNoZWV0ID0gbmV3IHdpbi5DU1NTdHlsZVNoZWV0XG4gICAgICByb290LmFkb3B0ZWRTdHlsZVNoZWV0cyA9IFt0aGlzLnNoZWV0LCAuLi5yb290LmFkb3B0ZWRTdHlsZVNoZWV0c11cbiAgICAgIGFkb3B0ZWRTZXQuc2V0KGRvYywgdGhpcylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdHlsZVRhZyA9IGRvYy5jcmVhdGVFbGVtZW50KFwic3R5bGVcIilcbiAgICAgIGlmIChub25jZSkgdGhpcy5zdHlsZVRhZy5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSlcbiAgICAgIGxldCB0YXJnZXQgPSByb290LmhlYWQgfHwgcm9vdFxuICAgICAgdGFyZ2V0Lmluc2VydEJlZm9yZSh0aGlzLnN0eWxlVGFnLCB0YXJnZXQuZmlyc3RDaGlsZClcbiAgICB9XG4gICAgdGhpcy5tb2R1bGVzID0gW11cbiAgICByb290W1NFVF0gPSB0aGlzXG4gIH1cblxuICBtb3VudChtb2R1bGVzKSB7XG4gICAgbGV0IHNoZWV0ID0gdGhpcy5zaGVldFxuICAgIGxldCBwb3MgPSAwIC8qIEN1cnJlbnQgcnVsZSBvZmZzZXQgKi8sIGogPSAwIC8qIEluZGV4IGludG8gdGhpcy5tb2R1bGVzICovXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbW9kID0gbW9kdWxlc1tpXSwgaW5kZXggPSB0aGlzLm1vZHVsZXMuaW5kZXhPZihtb2QpXG4gICAgICBpZiAoaW5kZXggPCBqICYmIGluZGV4ID4gLTEpIHsgLy8gT3JkZXJpbmcgY29uZmxpY3RcbiAgICAgICAgdGhpcy5tb2R1bGVzLnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgai0tXG4gICAgICAgIGluZGV4ID0gLTFcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCA9PSAtMSkge1xuICAgICAgICB0aGlzLm1vZHVsZXMuc3BsaWNlKGorKywgMCwgbW9kKVxuICAgICAgICBpZiAoc2hlZXQpIGZvciAobGV0IGsgPSAwOyBrIDwgbW9kLnJ1bGVzLmxlbmd0aDsgaysrKVxuICAgICAgICAgIHNoZWV0Lmluc2VydFJ1bGUobW9kLnJ1bGVzW2tdLCBwb3MrKylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdoaWxlIChqIDwgaW5kZXgpIHBvcyArPSB0aGlzLm1vZHVsZXNbaisrXS5ydWxlcy5sZW5ndGhcbiAgICAgICAgcG9zICs9IG1vZC5ydWxlcy5sZW5ndGhcbiAgICAgICAgaisrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFzaGVldCkge1xuICAgICAgbGV0IHRleHQgPSBcIlwiXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubW9kdWxlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgdGV4dCArPSB0aGlzLm1vZHVsZXNbaV0uZ2V0UnVsZXMoKSArIFwiXFxuXCJcbiAgICAgIHRoaXMuc3R5bGVUYWcudGV4dENvbnRlbnQgPSB0ZXh0XG4gICAgfVxuICB9XG5cbiAgc2V0Tm9uY2Uobm9uY2UpIHtcbiAgICBpZiAodGhpcy5zdHlsZVRhZyAmJiB0aGlzLnN0eWxlVGFnLmdldEF0dHJpYnV0ZShcIm5vbmNlXCIpICE9IG5vbmNlKVxuICAgICAgdGhpcy5zdHlsZVRhZy5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSlcbiAgfVxufVxuXG4vLyBTdHlsZTo6T2JqZWN0PHVuaW9uPFN0eWxlLHN0cmluZz4+XG4vL1xuLy8gQSBzdHlsZSBpcyBhbiBvYmplY3QgdGhhdCwgaW4gdGhlIHNpbXBsZSBjYXNlLCBtYXBzIENTUyBwcm9wZXJ0eVxuLy8gbmFtZXMgdG8gc3RyaW5ncyBob2xkaW5nIHRoZWlyIHZhbHVlcywgYXMgaW4gYHtjb2xvcjogXCJyZWRcIixcbi8vIGZvbnRXZWlnaHQ6IFwiYm9sZFwifWAuIFRoZSBwcm9wZXJ0eSBuYW1lcyBjYW4gYmUgZ2l2ZW4gaW5cbi8vIGNhbWVsLWNhc2VcdTIwMTR0aGUgbGlicmFyeSB3aWxsIGluc2VydCBhIGRhc2ggYmVmb3JlIGNhcGl0YWwgbGV0dGVyc1xuLy8gd2hlbiBjb252ZXJ0aW5nIHRoZW0gdG8gQ1NTLlxuLy9cbi8vIElmIHlvdSBpbmNsdWRlIGFuIHVuZGVyc2NvcmUgaW4gYSBwcm9wZXJ0eSBuYW1lLCBpdCBhbmQgZXZlcnl0aGluZ1xuLy8gYWZ0ZXIgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG91dHB1dCwgd2hpY2ggY2FuIGJlIHVzZWZ1bCB3aGVuXG4vLyBwcm92aWRpbmcgYSBwcm9wZXJ0eSBtdWx0aXBsZSB0aW1lcywgZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuLy8gcmVhc29ucy5cbi8vXG4vLyBBIHByb3BlcnR5IGluIGEgc3R5bGUgb2JqZWN0IGNhbiBhbHNvIGJlIGEgc3ViLXNlbGVjdG9yLCB3aGljaFxuLy8gZXh0ZW5kcyB0aGUgY3VycmVudCBjb250ZXh0IHRvIGFkZCBhIHBzZXVkby1zZWxlY3RvciBvciBhIGNoaWxkXG4vLyBzZWxlY3Rvci4gU3VjaCBhIHByb3BlcnR5IHNob3VsZCBjb250YWluIGEgYCZgIGNoYXJhY3Rlciwgd2hpY2hcbi8vIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQgc2VsZWN0b3IuIEZvciBleGFtcGxlIGB7XCImOmJlZm9yZVwiOlxuLy8ge2NvbnRlbnQ6ICdcImhpXCInfX1gLiBTdWItc2VsZWN0b3JzIGFuZCByZWd1bGFyIHByb3BlcnRpZXMgY2FuXG4vLyBmcmVlbHkgYmUgbWl4ZWQgaW4gYSBnaXZlbiBvYmplY3QuIEFueSBwcm9wZXJ0eSBjb250YWluaW5nIGEgYCZgIGlzXG4vLyBhc3N1bWVkIHRvIGJlIGEgc3ViLXNlbGVjdG9yLlxuLy9cbi8vIEZpbmFsbHksIGEgcHJvcGVydHkgY2FuIHNwZWNpZnkgYW4gQC1ibG9jayB0byBiZSB3cmFwcGVkIGFyb3VuZCB0aGVcbi8vIHN0eWxlcyBkZWZpbmVkIGluc2lkZSB0aGUgb2JqZWN0IHRoYXQncyB0aGUgcHJvcGVydHkncyB2YWx1ZS4gRm9yXG4vLyBleGFtcGxlIHRvIGNyZWF0ZSBhIG1lZGlhIHF1ZXJ5IHlvdSBjYW4gZG8gYHtcIkBtZWRpYSBzY3JlZW4gYW5kXG4vLyAobWluLXdpZHRoOiA0MDBweClcIjogey4uLn19YC5cbiIsICJleHBvcnQgdmFyIGJhc2UgPSB7XG4gIDg6IFwiQmFja3NwYWNlXCIsXG4gIDk6IFwiVGFiXCIsXG4gIDEwOiBcIkVudGVyXCIsXG4gIDEyOiBcIk51bUxvY2tcIixcbiAgMTM6IFwiRW50ZXJcIixcbiAgMTY6IFwiU2hpZnRcIixcbiAgMTc6IFwiQ29udHJvbFwiLFxuICAxODogXCJBbHRcIixcbiAgMjA6IFwiQ2Fwc0xvY2tcIixcbiAgMjc6IFwiRXNjYXBlXCIsXG4gIDMyOiBcIiBcIixcbiAgMzM6IFwiUGFnZVVwXCIsXG4gIDM0OiBcIlBhZ2VEb3duXCIsXG4gIDM1OiBcIkVuZFwiLFxuICAzNjogXCJIb21lXCIsXG4gIDM3OiBcIkFycm93TGVmdFwiLFxuICAzODogXCJBcnJvd1VwXCIsXG4gIDM5OiBcIkFycm93UmlnaHRcIixcbiAgNDA6IFwiQXJyb3dEb3duXCIsXG4gIDQ0OiBcIlByaW50U2NyZWVuXCIsXG4gIDQ1OiBcIkluc2VydFwiLFxuICA0NjogXCJEZWxldGVcIixcbiAgNTk6IFwiO1wiLFxuICA2MTogXCI9XCIsXG4gIDkxOiBcIk1ldGFcIixcbiAgOTI6IFwiTWV0YVwiLFxuICAxMDY6IFwiKlwiLFxuICAxMDc6IFwiK1wiLFxuICAxMDg6IFwiLFwiLFxuICAxMDk6IFwiLVwiLFxuICAxMTA6IFwiLlwiLFxuICAxMTE6IFwiL1wiLFxuICAxNDQ6IFwiTnVtTG9ja1wiLFxuICAxNDU6IFwiU2Nyb2xsTG9ja1wiLFxuICAxNjA6IFwiU2hpZnRcIixcbiAgMTYxOiBcIlNoaWZ0XCIsXG4gIDE2MjogXCJDb250cm9sXCIsXG4gIDE2MzogXCJDb250cm9sXCIsXG4gIDE2NDogXCJBbHRcIixcbiAgMTY1OiBcIkFsdFwiLFxuICAxNzM6IFwiLVwiLFxuICAxODY6IFwiO1wiLFxuICAxODc6IFwiPVwiLFxuICAxODg6IFwiLFwiLFxuICAxODk6IFwiLVwiLFxuICAxOTA6IFwiLlwiLFxuICAxOTE6IFwiL1wiLFxuICAxOTI6IFwiYFwiLFxuICAyMTk6IFwiW1wiLFxuICAyMjA6IFwiXFxcXFwiLFxuICAyMjE6IFwiXVwiLFxuICAyMjI6IFwiJ1wiXG59XG5cbmV4cG9ydCB2YXIgc2hpZnQgPSB7XG4gIDQ4OiBcIilcIixcbiAgNDk6IFwiIVwiLFxuICA1MDogXCJAXCIsXG4gIDUxOiBcIiNcIixcbiAgNTI6IFwiJFwiLFxuICA1MzogXCIlXCIsXG4gIDU0OiBcIl5cIixcbiAgNTU6IFwiJlwiLFxuICA1NjogXCIqXCIsXG4gIDU3OiBcIihcIixcbiAgNTk6IFwiOlwiLFxuICA2MTogXCIrXCIsXG4gIDE3MzogXCJfXCIsXG4gIDE4NjogXCI6XCIsXG4gIDE4NzogXCIrXCIsXG4gIDE4ODogXCI8XCIsXG4gIDE4OTogXCJfXCIsXG4gIDE5MDogXCI+XCIsXG4gIDE5MTogXCI/XCIsXG4gIDE5MjogXCJ+XCIsXG4gIDIxOTogXCJ7XCIsXG4gIDIyMDogXCJ8XCIsXG4gIDIyMTogXCJ9XCIsXG4gIDIyMjogXCJcXFwiXCJcbn1cblxudmFyIG1hYyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiAmJiAvTWFjLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSlcbnZhciBpZSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiAmJiAvTVNJRSBcXGR8VHJpZGVudFxcLyg/Ols3LTldfFxcZHsyLH0pXFwuLipydjooXFxkKykvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudClcblxuLy8gRmlsbCBpbiB0aGUgZGlnaXQga2V5c1xuZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSBiYXNlWzQ4ICsgaV0gPSBiYXNlWzk2ICsgaV0gPSBTdHJpbmcoaSlcblxuLy8gVGhlIGZ1bmN0aW9uIGtleXNcbmZvciAodmFyIGkgPSAxOyBpIDw9IDI0OyBpKyspIGJhc2VbaSArIDExMV0gPSBcIkZcIiArIGlcblxuLy8gQW5kIHRoZSBhbHBoYWJldGljIGtleXNcbmZvciAodmFyIGkgPSA2NTsgaSA8PSA5MDsgaSsrKSB7XG4gIGJhc2VbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgKyAzMilcbiAgc2hpZnRbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXG59XG5cbi8vIEZvciBlYWNoIGNvZGUgdGhhdCBkb2Vzbid0IGhhdmUgYSBzaGlmdC1lcXVpdmFsZW50LCBjb3B5IHRoZSBiYXNlIG5hbWVcbmZvciAodmFyIGNvZGUgaW4gYmFzZSkgaWYgKCFzaGlmdC5oYXNPd25Qcm9wZXJ0eShjb2RlKSkgc2hpZnRbY29kZV0gPSBiYXNlW2NvZGVdXG5cbmV4cG9ydCBmdW5jdGlvbiBrZXlOYW1lKGV2ZW50KSB7XG4gIC8vIE9uIG1hY09TLCBrZXlzIGhlbGQgd2l0aCBTaGlmdCBhbmQgQ21kIGRvbid0IHJlZmxlY3QgdGhlIGVmZmVjdCBvZiBTaGlmdCBpbiBgLmtleWAuXG4gIC8vIE9uIElFLCBzaGlmdCBlZmZlY3QgaXMgbmV2ZXIgaW5jbHVkZWQgaW4gYC5rZXlgLlxuICB2YXIgaWdub3JlS2V5ID0gbWFjICYmIGV2ZW50Lm1ldGFLZXkgJiYgZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSB8fFxuICAgICAgaWUgJiYgZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5ICYmIGV2ZW50LmtleS5sZW5ndGggPT0gMSB8fFxuICAgICAgZXZlbnQua2V5ID09IFwiVW5pZGVudGlmaWVkXCJcbiAgdmFyIG5hbWUgPSAoIWlnbm9yZUtleSAmJiBldmVudC5rZXkpIHx8XG4gICAgKGV2ZW50LnNoaWZ0S2V5ID8gc2hpZnQgOiBiYXNlKVtldmVudC5rZXlDb2RlXSB8fFxuICAgIGV2ZW50LmtleSB8fCBcIlVuaWRlbnRpZmllZFwiXG4gIC8vIEVkZ2Ugc29tZXRpbWVzIHByb2R1Y2VzIHdyb25nIG5hbWVzIChJc3N1ZSAjMylcbiAgaWYgKG5hbWUgPT0gXCJFc2NcIikgbmFtZSA9IFwiRXNjYXBlXCJcbiAgaWYgKG5hbWUgPT0gXCJEZWxcIikgbmFtZSA9IFwiRGVsZXRlXCJcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvODg2MDU3MS9cbiAgaWYgKG5hbWUgPT0gXCJMZWZ0XCIpIG5hbWUgPSBcIkFycm93TGVmdFwiXG4gIGlmIChuYW1lID09IFwiVXBcIikgbmFtZSA9IFwiQXJyb3dVcFwiXG4gIGlmIChuYW1lID09IFwiUmlnaHRcIikgbmFtZSA9IFwiQXJyb3dSaWdodFwiXG4gIGlmIChuYW1lID09IFwiRG93blwiKSBuYW1lID0gXCJBcnJvd0Rvd25cIlxuICByZXR1cm4gbmFtZVxufVxuIiwgImltcG9ydCB7IFRleHQsIFJhbmdlU2V0LCBNYXBNb2RlLCBSYW5nZVZhbHVlLCBmaW5kQ2x1c3RlckJyZWFrLCBFZGl0b3JTZWxlY3Rpb24sIEZhY2V0LCBTdGF0ZUVmZmVjdCwgQ2hhbmdlU2V0LCBmaW5kQ29sdW1uLCBDaGFyQ2F0ZWdvcnksIEFubm90YXRpb24sIEVkaXRvclN0YXRlLCBUcmFuc2FjdGlvbiwgUHJlYywgY29kZVBvaW50QXQsIGNvZGVQb2ludFNpemUsIGNvbWJpbmVDb25maWcsIFN0YXRlRmllbGQsIFJhbmdlU2V0QnVpbGRlciwgY291bnRDb2x1bW4gfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBTdHlsZU1vZHVsZSB9IGZyb20gJ3N0eWxlLW1vZCc7XG5pbXBvcnQgeyBrZXlOYW1lLCBiYXNlLCBzaGlmdCB9IGZyb20gJ3czYy1rZXluYW1lJztcblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uKHJvb3QpIHtcbiAgICBsZXQgdGFyZ2V0O1xuICAgIC8vIEJyb3dzZXJzIGRpZmZlciBvbiB3aGV0aGVyIHNoYWRvdyByb290cyBoYXZlIGEgZ2V0U2VsZWN0aW9uXG4gICAgLy8gbWV0aG9kLiBJZiBpdCBleGlzdHMsIHVzZSB0aGF0LCBvdGhlcndpc2UsIGNhbGwgaXQgb24gdGhlXG4gICAgLy8gZG9jdW1lbnQuXG4gICAgaWYgKHJvb3Qubm9kZVR5cGUgPT0gMTEpIHsgLy8gU2hhZG93IHJvb3RcbiAgICAgICAgdGFyZ2V0ID0gcm9vdC5nZXRTZWxlY3Rpb24gPyByb290IDogcm9vdC5vd25lckRvY3VtZW50O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGFyZ2V0ID0gcm9vdDtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldC5nZXRTZWxlY3Rpb24oKTtcbn1cbmZ1bmN0aW9uIGNvbnRhaW5zKGRvbSwgbm9kZSkge1xuICAgIHJldHVybiBub2RlID8gZG9tID09IG5vZGUgfHwgZG9tLmNvbnRhaW5zKG5vZGUubm9kZVR5cGUgIT0gMSA/IG5vZGUucGFyZW50Tm9kZSA6IG5vZGUpIDogZmFsc2U7XG59XG5mdW5jdGlvbiBkZWVwQWN0aXZlRWxlbWVudChkb2MpIHtcbiAgICBsZXQgZWx0ID0gZG9jLmFjdGl2ZUVsZW1lbnQ7XG4gICAgd2hpbGUgKGVsdCAmJiBlbHQuc2hhZG93Um9vdClcbiAgICAgICAgZWx0ID0gZWx0LnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudDtcbiAgICByZXR1cm4gZWx0O1xufVxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uKGRvbSwgc2VsZWN0aW9uKSB7XG4gICAgaWYgKCFzZWxlY3Rpb24uYW5jaG9yTm9kZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEZpcmVmb3ggd2lsbCByYWlzZSAncGVybWlzc2lvbiBkZW5pZWQnIGVycm9ycyB3aGVuIGFjY2Vzc2luZ1xuICAgICAgICAvLyBwcm9wZXJ0aWVzIG9mIGBzZWwuYW5jaG9yTm9kZWAgd2hlbiBpdCdzIGluIGEgZ2VuZXJhdGVkIENTU1xuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICByZXR1cm4gY29udGFpbnMoZG9tLCBzZWxlY3Rpb24uYW5jaG9yTm9kZSk7XG4gICAgfVxuICAgIGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbGllbnRSZWN0c0Zvcihkb20pIHtcbiAgICBpZiAoZG9tLm5vZGVUeXBlID09IDMpXG4gICAgICAgIHJldHVybiB0ZXh0UmFuZ2UoZG9tLCAwLCBkb20ubm9kZVZhbHVlLmxlbmd0aCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBlbHNlIGlmIChkb20ubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgcmV0dXJuIGRvbS5nZXRDbGllbnRSZWN0cygpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIFtdO1xufVxuLy8gU2NhbnMgZm9yd2FyZCBhbmQgYmFja3dhcmQgdGhyb3VnaCBET00gcG9zaXRpb25zIGVxdWl2YWxlbnQgdG8gdGhlXG4vLyBnaXZlbiBvbmUgdG8gc2VlIGlmIHRoZSB0d28gYXJlIGluIHRoZSBzYW1lIHBsYWNlIChpLmUuIGFmdGVyIGFcbi8vIHRleHQgbm9kZSB2cyBhdCB0aGUgZW5kIG9mIHRoYXQgdGV4dCBub2RlKVxuZnVuY3Rpb24gaXNFcXVpdmFsZW50UG9zaXRpb24obm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYpIHtcbiAgICByZXR1cm4gdGFyZ2V0Tm9kZSA/IChzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCAtMSkgfHxcbiAgICAgICAgc2NhbkZvcihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZiwgMSkpIDogZmFsc2U7XG59XG5mdW5jdGlvbiBkb21JbmRleChub2RlKSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOzsgaW5kZXgrKykge1xuICAgICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG59XG5mdW5jdGlvbiBzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCBkaXIpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChub2RlID09IHRhcmdldE5vZGUgJiYgb2ZmID09IHRhcmdldE9mZilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAob2ZmID09IChkaXIgPCAwID8gMCA6IG1heE9mZnNldChub2RlKSkpIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IFwiRElWXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5ub2RlVHlwZSAhPSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIG9mZiA9IGRvbUluZGV4KG5vZGUpICsgKGRpciA8IDAgPyAwIDogMSk7XG4gICAgICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmYgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBub2RlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgb2ZmID0gZGlyIDwgMCA/IG1heE9mZnNldChub2RlKSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBtYXhPZmZzZXQobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09IDMgPyBub2RlLm5vZGVWYWx1ZS5sZW5ndGggOiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xufVxuZnVuY3Rpb24gZmxhdHRlblJlY3QocmVjdCwgbGVmdCkge1xuICAgIGxldCB4ID0gbGVmdCA/IHJlY3QubGVmdCA6IHJlY3QucmlnaHQ7XG4gICAgcmV0dXJuIHsgbGVmdDogeCwgcmlnaHQ6IHgsIHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC5ib3R0b20gfTtcbn1cbmZ1bmN0aW9uIHdpbmRvd1JlY3Qod2luKSB7XG4gICAgcmV0dXJuIHsgbGVmdDogMCwgcmlnaHQ6IHdpbi5pbm5lcldpZHRoLFxuICAgICAgICB0b3A6IDAsIGJvdHRvbTogd2luLmlubmVySGVpZ2h0IH07XG59XG5mdW5jdGlvbiBnZXRTY2FsZShlbHQsIHJlY3QpIHtcbiAgICBsZXQgc2NhbGVYID0gcmVjdC53aWR0aCAvIGVsdC5vZmZzZXRXaWR0aDtcbiAgICBsZXQgc2NhbGVZID0gcmVjdC5oZWlnaHQgLyBlbHQub2Zmc2V0SGVpZ2h0O1xuICAgIGlmIChzY2FsZVggPiAwLjk5NSAmJiBzY2FsZVggPCAxLjAwNSB8fCAhaXNGaW5pdGUoc2NhbGVYKSB8fCBNYXRoLmFicyhyZWN0LndpZHRoIC0gZWx0Lm9mZnNldFdpZHRoKSA8IDEpXG4gICAgICAgIHNjYWxlWCA9IDE7XG4gICAgaWYgKHNjYWxlWSA+IDAuOTk1ICYmIHNjYWxlWSA8IDEuMDA1IHx8ICFpc0Zpbml0ZShzY2FsZVkpIHx8IE1hdGguYWJzKHJlY3QuaGVpZ2h0IC0gZWx0Lm9mZnNldEhlaWdodCkgPCAxKVxuICAgICAgICBzY2FsZVkgPSAxO1xuICAgIHJldHVybiB7IHNjYWxlWCwgc2NhbGVZIH07XG59XG5mdW5jdGlvbiBzY3JvbGxSZWN0SW50b1ZpZXcoZG9tLCByZWN0LCBzaWRlLCB4LCB5LCB4TWFyZ2luLCB5TWFyZ2luLCBsdHIpIHtcbiAgICBsZXQgZG9jID0gZG9tLm93bmVyRG9jdW1lbnQsIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgZm9yIChsZXQgY3VyID0gZG9tLCBzdG9wID0gZmFsc2U7IGN1ciAmJiAhc3RvcDspIHtcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSA9PSAxKSB7IC8vIEVsZW1lbnRcbiAgICAgICAgICAgIGxldCBib3VuZGluZywgdG9wID0gY3VyID09IGRvYy5ib2R5O1xuICAgICAgICAgICAgbGV0IHNjYWxlWCA9IDEsIHNjYWxlWSA9IDE7XG4gICAgICAgICAgICBpZiAodG9wKSB7XG4gICAgICAgICAgICAgICAgYm91bmRpbmcgPSB3aW5kb3dSZWN0KHdpbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoL14oZml4ZWR8c3RpY2t5KSQvLnRlc3QoZ2V0Q29tcHV0ZWRTdHlsZShjdXIpLnBvc2l0aW9uKSlcbiAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGN1ci5zY3JvbGxIZWlnaHQgPD0gY3VyLmNsaWVudEhlaWdodCAmJiBjdXIuc2Nyb2xsV2lkdGggPD0gY3VyLmNsaWVudFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ciA9IGN1ci5hc3NpZ25lZFNsb3QgfHwgY3VyLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IGN1ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAoeyBzY2FsZVgsIHNjYWxlWSB9ID0gZ2V0U2NhbGUoY3VyLCByZWN0KSk7XG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHNjcm9sbGJhciB3aWR0aCBpc24ndCBpbmNsdWRlZCBpbiB0aGUgcmVjdGFuZ2xlXG4gICAgICAgICAgICAgICAgYm91bmRpbmcgPSB7IGxlZnQ6IHJlY3QubGVmdCwgcmlnaHQ6IHJlY3QubGVmdCArIGN1ci5jbGllbnRXaWR0aCAqIHNjYWxlWCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiByZWN0LnRvcCwgYm90dG9tOiByZWN0LnRvcCArIGN1ci5jbGllbnRIZWlnaHQgKiBzY2FsZVkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBtb3ZlWCA9IDAsIG1vdmVZID0gMDtcbiAgICAgICAgICAgIGlmICh5ID09IFwibmVhcmVzdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlY3QudG9wIDwgYm91bmRpbmcudG9wKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVZID0gLShib3VuZGluZy50b3AgLSByZWN0LnRvcCArIHlNYXJnaW4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZSA+IDAgJiYgcmVjdC5ib3R0b20gPiBib3VuZGluZy5ib3R0b20gKyBtb3ZlWSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVZID0gcmVjdC5ib3R0b20gLSBib3VuZGluZy5ib3R0b20gKyBtb3ZlWSArIHlNYXJnaW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlY3QuYm90dG9tID4gYm91bmRpbmcuYm90dG9tKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVZID0gcmVjdC5ib3R0b20gLSBib3VuZGluZy5ib3R0b20gKyB5TWFyZ2luO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZSA8IDAgJiYgKHJlY3QudG9wIC0gbW92ZVkpIDwgYm91bmRpbmcudG9wKVxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZVkgPSAtKGJvdW5kaW5nLnRvcCArIG1vdmVZIC0gcmVjdC50b3AgKyB5TWFyZ2luKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVjdEhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3AsIGJvdW5kaW5nSGVpZ2h0ID0gYm91bmRpbmcuYm90dG9tIC0gYm91bmRpbmcudG9wO1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXRUb3AgPSB5ID09IFwiY2VudGVyXCIgJiYgcmVjdEhlaWdodCA8PSBib3VuZGluZ0hlaWdodCA/IHJlY3QudG9wICsgcmVjdEhlaWdodCAvIDIgLSBib3VuZGluZ0hlaWdodCAvIDIgOlxuICAgICAgICAgICAgICAgICAgICB5ID09IFwic3RhcnRcIiB8fCB5ID09IFwiY2VudGVyXCIgJiYgc2lkZSA8IDAgPyByZWN0LnRvcCAtIHlNYXJnaW4gOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gLSBib3VuZGluZ0hlaWdodCArIHlNYXJnaW47XG4gICAgICAgICAgICAgICAgbW92ZVkgPSB0YXJnZXRUb3AgLSBib3VuZGluZy50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeCA9PSBcIm5lYXJlc3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChyZWN0LmxlZnQgPCBib3VuZGluZy5sZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVYID0gLShib3VuZGluZy5sZWZ0IC0gcmVjdC5sZWZ0ICsgeE1hcmdpbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlID4gMCAmJiByZWN0LnJpZ2h0ID4gYm91bmRpbmcucmlnaHQgKyBtb3ZlWClcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVYID0gcmVjdC5yaWdodCAtIGJvdW5kaW5nLnJpZ2h0ICsgbW92ZVggKyB4TWFyZ2luO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWN0LnJpZ2h0ID4gYm91bmRpbmcucmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVggPSByZWN0LnJpZ2h0IC0gYm91bmRpbmcucmlnaHQgKyB4TWFyZ2luO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZSA8IDAgJiYgcmVjdC5sZWZ0IDwgYm91bmRpbmcubGVmdCArIG1vdmVYKVxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZVggPSAtKGJvdW5kaW5nLmxlZnQgKyBtb3ZlWCAtIHJlY3QubGVmdCArIHhNYXJnaW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXRMZWZ0ID0geCA9PSBcImNlbnRlclwiID8gcmVjdC5sZWZ0ICsgKHJlY3QucmlnaHQgLSByZWN0LmxlZnQpIC8gMiAtIChib3VuZGluZy5yaWdodCAtIGJvdW5kaW5nLmxlZnQpIC8gMiA6XG4gICAgICAgICAgICAgICAgICAgICh4ID09IFwic3RhcnRcIikgPT0gbHRyID8gcmVjdC5sZWZ0IC0geE1hcmdpbiA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWN0LnJpZ2h0IC0gKGJvdW5kaW5nLnJpZ2h0IC0gYm91bmRpbmcubGVmdCkgKyB4TWFyZ2luO1xuICAgICAgICAgICAgICAgIG1vdmVYID0gdGFyZ2V0TGVmdCAtIGJvdW5kaW5nLmxlZnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW92ZVggfHwgbW92ZVkpIHtcbiAgICAgICAgICAgICAgICBpZiAodG9wKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbi5zY3JvbGxCeShtb3ZlWCwgbW92ZVkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vdmVkWCA9IDAsIG1vdmVkWSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gY3VyLnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ci5zY3JvbGxUb3AgKz0gbW92ZVkgLyBzY2FsZVk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlZFkgPSAoY3VyLnNjcm9sbFRvcCAtIHN0YXJ0KSAqIHNjYWxlWTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobW92ZVgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IGN1ci5zY3JvbGxMZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyLnNjcm9sbExlZnQgKz0gbW92ZVggLyBzY2FsZVg7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlZFggPSAoY3VyLnNjcm9sbExlZnQgLSBzdGFydCkgKiBzY2FsZVg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVjdCA9IHsgbGVmdDogcmVjdC5sZWZ0IC0gbW92ZWRYLCB0b3A6IHJlY3QudG9wIC0gbW92ZWRZLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHJlY3QucmlnaHQgLSBtb3ZlZFgsIGJvdHRvbTogcmVjdC5ib3R0b20gLSBtb3ZlZFkgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVkWCAmJiBNYXRoLmFicyhtb3ZlZFggLSBtb3ZlWCkgPCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFwibmVhcmVzdFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW92ZWRZICYmIE1hdGguYWJzKG1vdmVkWSAtIG1vdmVZKSA8IDEpXG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gXCJuZWFyZXN0XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRvcClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGN1ciA9IGN1ci5hc3NpZ25lZFNsb3QgfHwgY3VyLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VyLm5vZGVUeXBlID09IDExKSB7IC8vIEEgc2hhZG93IHJvb3RcbiAgICAgICAgICAgIGN1ciA9IGN1ci5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzY3JvbGxhYmxlUGFyZW50KGRvbSkge1xuICAgIGxldCBkb2MgPSBkb20ub3duZXJEb2N1bWVudDtcbiAgICBmb3IgKGxldCBjdXIgPSBkb20ucGFyZW50Tm9kZTsgY3VyOykge1xuICAgICAgICBpZiAoY3VyID09IGRvYy5ib2R5KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXIubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgaWYgKGN1ci5zY3JvbGxIZWlnaHQgPiBjdXIuY2xpZW50SGVpZ2h0IHx8IGN1ci5zY3JvbGxXaWR0aCA+IGN1ci5jbGllbnRXaWR0aClcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VyO1xuICAgICAgICAgICAgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXIubm9kZVR5cGUgPT0gMTEpIHtcbiAgICAgICAgICAgIGN1ciA9IGN1ci5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5jbGFzcyBET01TZWxlY3Rpb25TdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuYW5jaG9yT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5mb2N1c05vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmZvY3VzT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgZXEoZG9tU2VsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuY2hvck5vZGUgPT0gZG9tU2VsLmFuY2hvck5vZGUgJiYgdGhpcy5hbmNob3JPZmZzZXQgPT0gZG9tU2VsLmFuY2hvck9mZnNldCAmJlxuICAgICAgICAgICAgdGhpcy5mb2N1c05vZGUgPT0gZG9tU2VsLmZvY3VzTm9kZSAmJiB0aGlzLmZvY3VzT2Zmc2V0ID09IGRvbVNlbC5mb2N1c09mZnNldDtcbiAgICB9XG4gICAgc2V0UmFuZ2UocmFuZ2UpIHtcbiAgICAgICAgbGV0IHsgYW5jaG9yTm9kZSwgZm9jdXNOb2RlIH0gPSByYW5nZTtcbiAgICAgICAgLy8gQ2xpcCBvZmZzZXRzIHRvIG5vZGUgc2l6ZSB0byBhdm9pZCBjcmFzaGVzIHdoZW4gU2FmYXJpIHJlcG9ydHMgYm9ndXMgb2Zmc2V0cyAoIzExNTIpXG4gICAgICAgIHRoaXMuc2V0KGFuY2hvck5vZGUsIE1hdGgubWluKHJhbmdlLmFuY2hvck9mZnNldCwgYW5jaG9yTm9kZSA/IG1heE9mZnNldChhbmNob3JOb2RlKSA6IDApLCBmb2N1c05vZGUsIE1hdGgubWluKHJhbmdlLmZvY3VzT2Zmc2V0LCBmb2N1c05vZGUgPyBtYXhPZmZzZXQoZm9jdXNOb2RlKSA6IDApKTtcbiAgICB9XG4gICAgc2V0KGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkge1xuICAgICAgICB0aGlzLmFuY2hvck5vZGUgPSBhbmNob3JOb2RlO1xuICAgICAgICB0aGlzLmFuY2hvck9mZnNldCA9IGFuY2hvck9mZnNldDtcbiAgICAgICAgdGhpcy5mb2N1c05vZGUgPSBmb2N1c05vZGU7XG4gICAgICAgIHRoaXMuZm9jdXNPZmZzZXQgPSBmb2N1c09mZnNldDtcbiAgICB9XG59XG5sZXQgcHJldmVudFNjcm9sbFN1cHBvcnRlZCA9IG51bGw7XG4vLyBGZWF0dXJlLWRldGVjdHMgc3VwcG9ydCBmb3IgLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiB0cnVlfSksIGFuZCB1c2VzXG4vLyBhIGZhbGxiYWNrIGtsdWRnZSB3aGVuIG5vdCBzdXBwb3J0ZWQuXG5mdW5jdGlvbiBmb2N1c1ByZXZlbnRTY3JvbGwoZG9tKSB7XG4gICAgaWYgKGRvbS5zZXRBY3RpdmUpXG4gICAgICAgIHJldHVybiBkb20uc2V0QWN0aXZlKCk7IC8vIGluIElFXG4gICAgaWYgKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQpXG4gICAgICAgIHJldHVybiBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCk7XG4gICAgbGV0IHN0YWNrID0gW107XG4gICAgZm9yIChsZXQgY3VyID0gZG9tOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlKSB7XG4gICAgICAgIHN0YWNrLnB1c2goY3VyLCBjdXIuc2Nyb2xsVG9wLCBjdXIuc2Nyb2xsTGVmdCk7XG4gICAgICAgIGlmIChjdXIgPT0gY3VyLm93bmVyRG9jdW1lbnQpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZG9tLmZvY3VzKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPT0gbnVsbCA/IHtcbiAgICAgICAgZ2V0IHByZXZlbnRTY3JvbGwoKSB7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0geyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0gOiB1bmRlZmluZWQpO1xuICAgIGlmICghcHJldmVudFNjcm9sbFN1cHBvcnRlZCkge1xuICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGVsdCA9IHN0YWNrW2krK10sIHRvcCA9IHN0YWNrW2krK10sIGxlZnQgPSBzdGFja1tpKytdO1xuICAgICAgICAgICAgaWYgKGVsdC5zY3JvbGxUb3AgIT0gdG9wKVxuICAgICAgICAgICAgICAgIGVsdC5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICAgICAgICBpZiAoZWx0LnNjcm9sbExlZnQgIT0gbGVmdClcbiAgICAgICAgICAgICAgICBlbHQuc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5sZXQgc2NyYXRjaFJhbmdlO1xuZnVuY3Rpb24gdGV4dFJhbmdlKG5vZGUsIGZyb20sIHRvID0gZnJvbSkge1xuICAgIGxldCByYW5nZSA9IHNjcmF0Y2hSYW5nZSB8fCAoc2NyYXRjaFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSk7XG4gICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIHRvKTtcbiAgICByYW5nZS5zZXRTdGFydChub2RlLCBmcm9tKTtcbiAgICByZXR1cm4gcmFuZ2U7XG59XG5mdW5jdGlvbiBkaXNwYXRjaEtleShlbHQsIG5hbWUsIGNvZGUpIHtcbiAgICBsZXQgb3B0aW9ucyA9IHsga2V5OiBuYW1lLCBjb2RlOiBuYW1lLCBrZXlDb2RlOiBjb2RlLCB3aGljaDogY29kZSwgY2FuY2VsYWJsZTogdHJ1ZSB9O1xuICAgIGxldCBkb3duID0gbmV3IEtleWJvYXJkRXZlbnQoXCJrZXlkb3duXCIsIG9wdGlvbnMpO1xuICAgIGRvd24uc3ludGhldGljID0gdHJ1ZTtcbiAgICBlbHQuZGlzcGF0Y2hFdmVudChkb3duKTtcbiAgICBsZXQgdXAgPSBuZXcgS2V5Ym9hcmRFdmVudChcImtleXVwXCIsIG9wdGlvbnMpO1xuICAgIHVwLnN5bnRoZXRpYyA9IHRydWU7XG4gICAgZWx0LmRpc3BhdGNoRXZlbnQodXApO1xuICAgIHJldHVybiBkb3duLmRlZmF1bHRQcmV2ZW50ZWQgfHwgdXAuZGVmYXVsdFByZXZlbnRlZDtcbn1cbmZ1bmN0aW9uIGdldFJvb3Qobm9kZSkge1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlICYmIChub2RlLm5vZGVUeXBlID09IDkgfHwgbm9kZS5ub2RlVHlwZSA9PSAxMSAmJiBub2RlLmhvc3QpKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmFzc2lnbmVkU2xvdCB8fCBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY2xlYXJBdHRyaWJ1dGVzKG5vZGUpIHtcbiAgICB3aGlsZSAobm9kZS5hdHRyaWJ1dGVzLmxlbmd0aClcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGVOb2RlKG5vZGUuYXR0cmlidXRlc1swXSk7XG59XG5mdW5jdGlvbiBhdEVsZW1lbnRTdGFydChkb2MsIHNlbGVjdGlvbikge1xuICAgIGxldCBub2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSwgb2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0O1xuICAgIGlmICghbm9kZSB8fCBzZWxlY3Rpb24uYW5jaG9yTm9kZSAhPSBub2RlIHx8IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgIT0gb2Zmc2V0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gU2FmYXJpIGNhbiByZXBvcnQgYm9ndXMgb2Zmc2V0cyAoIzExNTIpXG4gICAgb2Zmc2V0ID0gTWF0aC5taW4ob2Zmc2V0LCBtYXhPZmZzZXQobm9kZSkpO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG9mZnNldCkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcHJldiA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgIGlmIChwcmV2LmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gcHJldjtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBtYXhPZmZzZXQobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZSA9PSBkb2MpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaXNTY3JvbGxlZFRvQm90dG9tKGVsdCkge1xuICAgIHJldHVybiBlbHQuc2Nyb2xsVG9wID4gTWF0aC5tYXgoMSwgZWx0LnNjcm9sbEhlaWdodCAtIGVsdC5jbGllbnRIZWlnaHQgLSA0KTtcbn1cblxuY2xhc3MgRE9NUG9zIHtcbiAgICBjb25zdHJ1Y3Rvcihub2RlLCBvZmZzZXQsIHByZWNpc2UgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLnByZWNpc2UgPSBwcmVjaXNlO1xuICAgIH1cbiAgICBzdGF0aWMgYmVmb3JlKGRvbSwgcHJlY2lzZSkgeyByZXR1cm4gbmV3IERPTVBvcyhkb20ucGFyZW50Tm9kZSwgZG9tSW5kZXgoZG9tKSwgcHJlY2lzZSk7IH1cbiAgICBzdGF0aWMgYWZ0ZXIoZG9tLCBwcmVjaXNlKSB7IHJldHVybiBuZXcgRE9NUG9zKGRvbS5wYXJlbnROb2RlLCBkb21JbmRleChkb20pICsgMSwgcHJlY2lzZSk7IH1cbn1cbmNvbnN0IG5vQ2hpbGRyZW4gPSBbXTtcbmNsYXNzIENvbnRlbnRWaWV3IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmRvbSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICB9XG4gICAgZ2V0IG92ZXJyaWRlRE9NVGV4dCgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBnZXQgcG9zQXRTdGFydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQucG9zQmVmb3JlKHRoaXMpIDogMDtcbiAgICB9XG4gICAgZ2V0IHBvc0F0RW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgdGhpcy5sZW5ndGg7XG4gICAgfVxuICAgIHBvc0JlZm9yZSh2aWV3KSB7XG4gICAgICAgIGxldCBwb3MgPSB0aGlzLnBvc0F0U3RhcnQ7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZCA9PSB2aWV3KVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgICBwb3MgKz0gY2hpbGQubGVuZ3RoICsgY2hpbGQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgY2hpbGQgaW4gcG9zQmVmb3JlXCIpO1xuICAgIH1cbiAgICBwb3NBZnRlcih2aWV3KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc0JlZm9yZSh2aWV3KSArIHZpZXcubGVuZ3RoO1xuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmZsYWdzICYgMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi8pIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmRvbTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gbnVsbCwgbmV4dDtcbiAgICAgICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZmxhZ3MgJiA3IC8qIFZpZXdGbGFnLkRpcnR5ICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGQuZG9tICYmIChuZXh0ID0gcHJldiA/IHByZXYubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50VmlldyA9IENvbnRlbnRWaWV3LmdldChuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudFZpZXcgfHwgIWNvbnRlbnRWaWV3LnBhcmVudCAmJiBjb250ZW50Vmlldy5jYW5SZXVzZURPTShjaGlsZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucmV1c2VET00obmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmZsYWdzICY9IH43IC8qIFZpZXdGbGFnLkRpcnR5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXh0ID0gcHJldiA/IHByZXYubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2sgJiYgIXRyYWNrLndyaXR0ZW4gJiYgdHJhY2subm9kZSA9PSBwYXJlbnQgJiYgbmV4dCAhPSBjaGlsZC5kb20pXG4gICAgICAgICAgICAgICAgICAgIHRyYWNrLndyaXR0ZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5kb20ucGFyZW50Tm9kZSA9PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5leHQgJiYgbmV4dCAhPSBjaGlsZC5kb20pXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gcm0kMShuZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQuZG9tLCBuZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJldiA9IGNoaWxkLmRvbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHQgPSBwcmV2ID8gcHJldi5uZXh0U2libGluZyA6IHBhcmVudC5maXJzdENoaWxkO1xuICAgICAgICAgICAgaWYgKG5leHQgJiYgdHJhY2sgJiYgdHJhY2subm9kZSA9PSBwYXJlbnQpXG4gICAgICAgICAgICAgICAgdHJhY2sud3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICB3aGlsZSAobmV4dClcbiAgICAgICAgICAgICAgICBuZXh0ID0gcm0kMShuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZsYWdzICYgMSAvKiBWaWV3RmxhZy5DaGlsZERpcnR5ICovKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmZsYWdzICY9IH43IC8qIFZpZXdGbGFnLkRpcnR5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXVzZURPTShfZG9tKSB7IH1cbiAgICBsb2NhbFBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBhZnRlcjtcbiAgICAgICAgaWYgKG5vZGUgPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgIGFmdGVyID0gdGhpcy5kb20uY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGJpYXMgPSBtYXhPZmZzZXQobm9kZSkgPT0gMCA/IDAgOiBvZmZzZXQgPT0gMCA/IC0xIDogMTtcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gdGhpcy5kb20pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChiaWFzID09IDAgJiYgcGFyZW50LmZpcnN0Q2hpbGQgIT0gcGFyZW50Lmxhc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYmlhcyA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmlhcyA8IDApXG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBub2RlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGFmdGVyID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWZ0ZXIgPT0gdGhpcy5kb20uZmlyc3RDaGlsZClcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB3aGlsZSAoYWZ0ZXIgJiYgIUNvbnRlbnRWaWV3LmdldChhZnRlcikpXG4gICAgICAgICAgICBhZnRlciA9IGFmdGVyLm5leHRTaWJsaW5nO1xuICAgICAgICBpZiAoIWFmdGVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjaGlsZC5kb20gPT0gYWZ0ZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgICAgIHBvcyArPSBjaGlsZC5sZW5ndGggKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZChmcm9tLCB0bywgb2Zmc2V0ID0gMCkge1xuICAgICAgICBsZXQgZnJvbUkgPSAtMSwgZnJvbVN0YXJ0ID0gLTEsIHRvSSA9IC0xLCB0b0VuZCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gb2Zmc2V0LCBwcmV2RW5kID0gb2Zmc2V0OyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHBvcyA8IGZyb20gJiYgZW5kID4gdG8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmRvbUJvdW5kc0Fyb3VuZChmcm9tLCB0bywgcG9zKTtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gZnJvbSAmJiBmcm9tSSA9PSAtMSkge1xuICAgICAgICAgICAgICAgIGZyb21JID0gaTtcbiAgICAgICAgICAgICAgICBmcm9tU3RhcnQgPSBwb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zID4gdG8gJiYgY2hpbGQuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICB0b0kgPSBpO1xuICAgICAgICAgICAgICAgIHRvRW5kID0gcHJldkVuZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZFbmQgPSBlbmQ7XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZyb206IGZyb21TdGFydCwgdG86IHRvRW5kIDwgMCA/IG9mZnNldCArIHRoaXMubGVuZ3RoIDogdG9FbmQsXG4gICAgICAgICAgICBzdGFydERPTTogKGZyb21JID8gdGhpcy5jaGlsZHJlbltmcm9tSSAtIDFdLmRvbS5uZXh0U2libGluZyA6IG51bGwpIHx8IHRoaXMuZG9tLmZpcnN0Q2hpbGQsXG4gICAgICAgICAgICBlbmRET006IHRvSSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoICYmIHRvSSA+PSAwID8gdGhpcy5jaGlsZHJlblt0b0ldLmRvbSA6IG51bGwgfTtcbiAgICB9XG4gICAgbWFya0RpcnR5KGFuZFBhcmVudCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZmxhZ3MgfD0gMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi87XG4gICAgICAgIHRoaXMubWFya1BhcmVudHNEaXJ0eShhbmRQYXJlbnQpO1xuICAgIH1cbiAgICBtYXJrUGFyZW50c0RpcnR5KGNoaWxkTGlzdCkge1xuICAgICAgICBmb3IgKGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudDsgcGFyZW50OyBwYXJlbnQgPSBwYXJlbnQucGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoY2hpbGRMaXN0KVxuICAgICAgICAgICAgICAgIHBhcmVudC5mbGFncyB8PSAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgICAgIGlmIChwYXJlbnQuZmxhZ3MgJiAxIC8qIFZpZXdGbGFnLkNoaWxkRGlydHkgKi8pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgcGFyZW50LmZsYWdzIHw9IDEgLyogVmlld0ZsYWcuQ2hpbGREaXJ0eSAqLztcbiAgICAgICAgICAgIGNoaWxkTGlzdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFBhcmVudChwYXJlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50ICE9IHBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICBpZiAodGhpcy5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrUGFyZW50c0RpcnR5KHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldERPTShkb20pIHtcbiAgICAgICAgaWYgKHRoaXMuZG9tID09IGRvbSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy5kb20uY21WaWV3ID0gbnVsbDtcbiAgICAgICAgdGhpcy5kb20gPSBkb207XG4gICAgICAgIGRvbS5jbVZpZXcgPSB0aGlzO1xuICAgIH1cbiAgICBnZXQgcm9vdFZpZXcoKSB7XG4gICAgICAgIGZvciAobGV0IHYgPSB0aGlzOzspIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB2LnBhcmVudDtcbiAgICAgICAgICAgIGlmICghcGFyZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgdiA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlQ2hpbGRyZW4oZnJvbSwgdG8sIGNoaWxkcmVuID0gbm9DaGlsZHJlbikge1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAoY2hpbGQucGFyZW50ID09IHRoaXMgJiYgY2hpbGRyZW4uaW5kZXhPZihjaGlsZCkgPCAwKVxuICAgICAgICAgICAgICAgIGNoaWxkLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShmcm9tLCB0byAtIGZyb20sIC4uLmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGNoaWxkcmVuW2ldLnNldFBhcmVudCh0aGlzKTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24oX3JlYykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZ25vcmVFdmVudChfZXZlbnQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY2hpbGRDdXJzb3IocG9zID0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGlsZEN1cnNvcih0aGlzLmNoaWxkcmVuLCBwb3MsIHRoaXMuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICB9XG4gICAgY2hpbGRQb3MocG9zLCBiaWFzID0gMSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZEN1cnNvcigpLmZpbmRQb3MocG9zLCBiaWFzKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBuYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLnJlcGxhY2UoXCJWaWV3XCIsIFwiXCIpO1xuICAgICAgICByZXR1cm4gbmFtZSArICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA/IFwiKFwiICsgdGhpcy5jaGlsZHJlbi5qb2luKCkgKyBcIilcIiA6XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA/IFwiW1wiICsgKG5hbWUgPT0gXCJUZXh0XCIgPyB0aGlzLnRleHQgOiB0aGlzLmxlbmd0aCkgKyBcIl1cIiA6IFwiXCIpICtcbiAgICAgICAgICAgICh0aGlzLmJyZWFrQWZ0ZXIgPyBcIiNcIiA6IFwiXCIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0KG5vZGUpIHsgcmV0dXJuIG5vZGUuY21WaWV3OyB9XG4gICAgZ2V0IGlzRWRpdGFibGUoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IGlzV2lkZ2V0KCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIGhhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBiZWNvbWUob3RoZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY2FuUmV1c2VET00ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyLmNvbnN0cnVjdG9yID09IHRoaXMuY29uc3RydWN0b3IgJiYgISgodGhpcy5mbGFncyB8IG90aGVyLmZsYWdzKSAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pO1xuICAgIH1cbiAgICAvLyBXaGVuIHRoaXMgaXMgYSB6ZXJvLWxlbmd0aCB2aWV3IHdpdGggYSBzaWRlLCB0aGlzIHNob3VsZCByZXR1cm4gYVxuICAgIC8vIG51bWJlciA8PSAwIHRvIGluZGljYXRlIGl0IGlzIGJlZm9yZSBpdHMgcG9zaXRpb24sIG9yIGFcbiAgICAvLyBudW1iZXIgPiAwIHdoZW4gYWZ0ZXIgaXRzIHBvc2l0aW9uLlxuICAgIGdldFNpZGUoKSB7IHJldHVybiAwOyB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgIGlmIChjaGlsZC5wYXJlbnQgPT0gdGhpcylcbiAgICAgICAgICAgICAgICBjaGlsZC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICB9XG59XG5Db250ZW50Vmlldy5wcm90b3R5cGUuYnJlYWtBZnRlciA9IDA7XG4vLyBSZW1vdmUgYSBET00gbm9kZSBhbmQgcmV0dXJuIGl0cyBuZXh0IHNpYmxpbmcuXG5mdW5jdGlvbiBybSQxKGRvbSkge1xuICAgIGxldCBuZXh0ID0gZG9tLm5leHRTaWJsaW5nO1xuICAgIGRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbSk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG5jbGFzcyBDaGlsZEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoY2hpbGRyZW4sIHBvcywgaSkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmkgPSBpO1xuICAgICAgICB0aGlzLm9mZiA9IDA7XG4gICAgfVxuICAgIGZpbmRQb3MocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAocG9zID4gdGhpcy5wb3MgfHwgcG9zID09IHRoaXMucG9zICYmXG4gICAgICAgICAgICAgICAgKGJpYXMgPiAwIHx8IHRoaXMuaSA9PSAwIHx8IHRoaXMuY2hpbGRyZW5bdGhpcy5pIC0gMV0uYnJlYWtBZnRlcikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZiA9IHBvcyAtIHRoaXMucG9zO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmNoaWxkcmVuWy0tdGhpcy5pXTtcbiAgICAgICAgICAgIHRoaXMucG9zIC09IG5leHQubGVuZ3RoICsgbmV4dC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcmVwbGFjZVJhbmdlKHBhcmVudCwgZnJvbUksIGZyb21PZmYsIHRvSSwgdG9PZmYsIGluc2VydCwgYnJlYWtBdFN0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICBsZXQgeyBjaGlsZHJlbiB9ID0gcGFyZW50O1xuICAgIGxldCBiZWZvcmUgPSBjaGlsZHJlbi5sZW5ndGggPyBjaGlsZHJlbltmcm9tSV0gOiBudWxsO1xuICAgIGxldCBsYXN0ID0gaW5zZXJ0Lmxlbmd0aCA/IGluc2VydFtpbnNlcnQubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgIGxldCBicmVha0F0RW5kID0gbGFzdCA/IGxhc3QuYnJlYWtBZnRlciA6IGJyZWFrQXRTdGFydDtcbiAgICAvLyBDaGFuZ2Ugd2l0aGluIGEgc2luZ2xlIGNoaWxkXG4gICAgaWYgKGZyb21JID09IHRvSSAmJiBiZWZvcmUgJiYgIWJyZWFrQXRTdGFydCAmJiAhYnJlYWtBdEVuZCAmJiBpbnNlcnQubGVuZ3RoIDwgMiAmJlxuICAgICAgICBiZWZvcmUubWVyZ2UoZnJvbU9mZiwgdG9PZmYsIGluc2VydC5sZW5ndGggPyBsYXN0IDogbnVsbCwgZnJvbU9mZiA9PSAwLCBvcGVuU3RhcnQsIG9wZW5FbmQpKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKHRvSSA8IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBsZXQgYWZ0ZXIgPSBjaGlsZHJlblt0b0ldO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGVuZCBvZiB0aGUgY2hpbGQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyBwcmVzZXJ2ZWQgaW4gYGFmdGVyYFxuICAgICAgICBpZiAoYWZ0ZXIgJiYgKHRvT2ZmIDwgYWZ0ZXIubGVuZ3RoIHx8IGFmdGVyLmJyZWFrQWZ0ZXIgJiYgKGxhc3QgPT09IG51bGwgfHwgbGFzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGFzdC5icmVha0FmdGVyKSkpIHtcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIHNwbGl0dGluZyBhIGNoaWxkLCBzZXBhcmF0ZSBwYXJ0IG9mIGl0IHRvIGF2b2lkIHRoYXRcbiAgICAgICAgICAgIC8vIGJlaW5nIG1hbmdsZWQgd2hlbiB1cGRhdGluZyB0aGUgY2hpbGQgYmVmb3JlIHRoZSB1cGRhdGUuXG4gICAgICAgICAgICBpZiAoZnJvbUkgPT0gdG9JKSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci5zcGxpdCh0b09mZik7XG4gICAgICAgICAgICAgICAgdG9PZmYgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIHJlcGxhY2VtZW50IHNob3VsZCBiZSBtZXJnZWQgd2l0aFxuICAgICAgICAgICAgLy8gdGhlIGxhc3QgcmVwbGFjaW5nIGVsZW1lbnQsIHVwZGF0ZSBgY29udGVudGBcbiAgICAgICAgICAgIGlmICghYnJlYWtBdEVuZCAmJiBsYXN0ICYmIGFmdGVyLm1lcmdlKDAsIHRvT2ZmLCBsYXN0LCB0cnVlLCAwLCBvcGVuRW5kKSkge1xuICAgICAgICAgICAgICAgIGluc2VydFtpbnNlcnQubGVuZ3RoIC0gMV0gPSBhZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3RhcnQgb2YgdGhlIGFmdGVyIGVsZW1lbnQsIGlmIG5lY2Vzc2FyeSwgYW5kXG4gICAgICAgICAgICAgICAgLy8gYWRkIGl0IHRvIGBjb250ZW50YC5cbiAgICAgICAgICAgICAgICBpZiAodG9PZmYgfHwgYWZ0ZXIuY2hpbGRyZW4ubGVuZ3RoICYmICFhZnRlci5jaGlsZHJlblswXS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyLm1lcmdlKDAsIHRvT2ZmLCBudWxsLCBmYWxzZSwgMCwgb3BlbkVuZCk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0LnB1c2goYWZ0ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFmdGVyID09PSBudWxsIHx8IGFmdGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZnRlci5icmVha0FmdGVyKSB7XG4gICAgICAgICAgICAvLyBUaGUgZWxlbWVudCBhdCBgdG9JYCBpcyBlbnRpcmVseSBjb3ZlcmVkIGJ5IHRoaXMgcmFuZ2UuXG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSBpdHMgbGluZSBicmVhaywgaWYgYW55LlxuICAgICAgICAgICAgaWYgKGxhc3QpXG4gICAgICAgICAgICAgICAgbGFzdC5icmVha0FmdGVyID0gMTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBicmVha0F0U3RhcnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmNlIHdlJ3ZlIGhhbmRsZWQgdGhlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBjdXJyZW50IGVsZW1lbnRzXG4gICAgICAgIC8vIG5vdywgbWFrZSBzdXJlIGB0b0lgIHBvaW50cyBhZnRlciB0aGF0LlxuICAgICAgICB0b0krKztcbiAgICB9XG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgICBiZWZvcmUuYnJlYWtBZnRlciA9IGJyZWFrQXRTdGFydDtcbiAgICAgICAgaWYgKGZyb21PZmYgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWJyZWFrQXRTdGFydCAmJiBpbnNlcnQubGVuZ3RoICYmIGJlZm9yZS5tZXJnZShmcm9tT2ZmLCBiZWZvcmUubGVuZ3RoLCBpbnNlcnRbMF0sIGZhbHNlLCBvcGVuU3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlLmJyZWFrQWZ0ZXIgPSBpbnNlcnQuc2hpZnQoKS5icmVha0FmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZnJvbU9mZiA8IGJlZm9yZS5sZW5ndGggfHwgYmVmb3JlLmNoaWxkcmVuLmxlbmd0aCAmJiBiZWZvcmUuY2hpbGRyZW5bYmVmb3JlLmNoaWxkcmVuLmxlbmd0aCAtIDFdLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlLm1lcmdlKGZyb21PZmYsIGJlZm9yZS5sZW5ndGgsIG51bGwsIGZhbHNlLCBvcGVuU3RhcnQsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnJvbUkrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gbWVyZ2Ugd2lkZ2V0cyBvbiB0aGUgYm91bmRhcmllcyBvZiB0aGUgcmVwbGFjZW1lbnRcbiAgICB3aGlsZSAoZnJvbUkgPCB0b0kgJiYgaW5zZXJ0Lmxlbmd0aCkge1xuICAgICAgICBpZiAoY2hpbGRyZW5bdG9JIC0gMV0uYmVjb21lKGluc2VydFtpbnNlcnQubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgICAgICB0b0ktLTtcbiAgICAgICAgICAgIGluc2VydC5wb3AoKTtcbiAgICAgICAgICAgIG9wZW5FbmQgPSBpbnNlcnQubGVuZ3RoID8gMCA6IG9wZW5TdGFydDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaGlsZHJlbltmcm9tSV0uYmVjb21lKGluc2VydFswXSkpIHtcbiAgICAgICAgICAgIGZyb21JKys7XG4gICAgICAgICAgICBpbnNlcnQuc2hpZnQoKTtcbiAgICAgICAgICAgIG9wZW5TdGFydCA9IGluc2VydC5sZW5ndGggPyAwIDogb3BlbkVuZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghaW5zZXJ0Lmxlbmd0aCAmJiBmcm9tSSAmJiB0b0kgPCBjaGlsZHJlbi5sZW5ndGggJiYgIWNoaWxkcmVuW2Zyb21JIC0gMV0uYnJlYWtBZnRlciAmJlxuICAgICAgICBjaGlsZHJlblt0b0ldLm1lcmdlKDAsIDAsIGNoaWxkcmVuW2Zyb21JIC0gMV0sIGZhbHNlLCBvcGVuU3RhcnQsIG9wZW5FbmQpKVxuICAgICAgICBmcm9tSS0tO1xuICAgIGlmIChmcm9tSSA8IHRvSSB8fCBpbnNlcnQubGVuZ3RoKVxuICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkcmVuKGZyb21JLCB0b0ksIGluc2VydCk7XG59XG5mdW5jdGlvbiBtZXJnZUNoaWxkcmVuSW50byhwYXJlbnQsIGZyb20sIHRvLCBpbnNlcnQsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgIGxldCBjdXIgPSBwYXJlbnQuY2hpbGRDdXJzb3IoKTtcbiAgICBsZXQgeyBpOiB0b0ksIG9mZjogdG9PZmYgfSA9IGN1ci5maW5kUG9zKHRvLCAxKTtcbiAgICBsZXQgeyBpOiBmcm9tSSwgb2ZmOiBmcm9tT2ZmIH0gPSBjdXIuZmluZFBvcyhmcm9tLCAtMSk7XG4gICAgbGV0IGRMZW4gPSBmcm9tIC0gdG87XG4gICAgZm9yIChsZXQgdmlldyBvZiBpbnNlcnQpXG4gICAgICAgIGRMZW4gKz0gdmlldy5sZW5ndGg7XG4gICAgcGFyZW50Lmxlbmd0aCArPSBkTGVuO1xuICAgIHJlcGxhY2VSYW5nZShwYXJlbnQsIGZyb21JLCBmcm9tT2ZmLCB0b0ksIHRvT2ZmLCBpbnNlcnQsIDAsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG59XG5cbmxldCBuYXYgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IgOiB7IHVzZXJBZ2VudDogXCJcIiwgdmVuZG9yOiBcIlwiLCBwbGF0Zm9ybTogXCJcIiB9O1xubGV0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiID8gZG9jdW1lbnQgOiB7IGRvY3VtZW50RWxlbWVudDogeyBzdHlsZToge30gfSB9O1xuY29uc3QgaWVfZWRnZSA9IC8qQF9fUFVSRV9fKi8vRWRnZVxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KTtcbmNvbnN0IGllX3VwdG8xMCA9IC8qQF9fUFVSRV9fKi8vTVNJRSBcXGQvLnRlc3QobmF2LnVzZXJBZ2VudCk7XG5jb25zdCBpZV8xMXVwID0gLypAX19QVVJFX18qLy9UcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KTtcbmNvbnN0IGllID0gISEoaWVfdXB0bzEwIHx8IGllXzExdXAgfHwgaWVfZWRnZSk7XG5jb25zdCBnZWNrbyA9ICFpZSAmJiAvKkBfX1BVUkVfXyovL2dlY2tvXFwvKFxcZCspL2kudGVzdChuYXYudXNlckFnZW50KTtcbmNvbnN0IGNocm9tZSA9ICFpZSAmJiAvKkBfX1BVUkVfXyovL0Nocm9tZVxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KTtcbmNvbnN0IHdlYmtpdCA9IFwid2Via2l0Rm9udFNtb290aGluZ1wiIGluIGRvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG5jb25zdCBzYWZhcmkgPSAhaWUgJiYgLypAX19QVVJFX18qLy9BcHBsZSBDb21wdXRlci8udGVzdChuYXYudmVuZG9yKTtcbmNvbnN0IGlvcyA9IHNhZmFyaSAmJiAoLypAX19QVVJFX18qLy9Nb2JpbGVcXC9cXHcrLy50ZXN0KG5hdi51c2VyQWdlbnQpIHx8IG5hdi5tYXhUb3VjaFBvaW50cyA+IDIpO1xudmFyIGJyb3dzZXIgPSB7XG4gICAgbWFjOiBpb3MgfHwgLypAX19QVVJFX18qLy9NYWMvLnRlc3QobmF2LnBsYXRmb3JtKSxcbiAgICB3aW5kb3dzOiAvKkBfX1BVUkVfXyovL1dpbi8udGVzdChuYXYucGxhdGZvcm0pLFxuICAgIGxpbnV4OiAvKkBfX1BVUkVfXyovL0xpbnV4fFgxMS8udGVzdChuYXYucGxhdGZvcm0pLFxuICAgIGllLFxuICAgIGllX3ZlcnNpb246IGllX3VwdG8xMCA/IGRvYy5kb2N1bWVudE1vZGUgfHwgNiA6IGllXzExdXAgPyAraWVfMTF1cFsxXSA6IGllX2VkZ2UgPyAraWVfZWRnZVsxXSA6IDAsXG4gICAgZ2Vja28sXG4gICAgZ2Vja29fdmVyc2lvbjogZ2Vja28gPyArKC8qQF9fUFVSRV9fKi8vRmlyZWZveFxcLyhcXGQrKS8uZXhlYyhuYXYudXNlckFnZW50KSB8fCBbMCwgMF0pWzFdIDogMCxcbiAgICBjaHJvbWU6ICEhY2hyb21lLFxuICAgIGNocm9tZV92ZXJzaW9uOiBjaHJvbWUgPyArY2hyb21lWzFdIDogMCxcbiAgICBpb3MsXG4gICAgYW5kcm9pZDogLypAX19QVVJFX18qLy9BbmRyb2lkXFxiLy50ZXN0KG5hdi51c2VyQWdlbnQpLFxuICAgIHdlYmtpdCxcbiAgICBzYWZhcmksXG4gICAgd2Via2l0X3ZlcnNpb246IHdlYmtpdCA/ICsoLypAX19QVVJFX18qLy9cXGJBcHBsZVdlYktpdFxcLyhcXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KSB8fCBbMCwgMF0pWzFdIDogMCxcbiAgICB0YWJTaXplOiBkb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnRhYlNpemUgIT0gbnVsbCA/IFwidGFiLXNpemVcIiA6IFwiLW1vei10YWItc2l6ZVwiXG59O1xuXG5jb25zdCBNYXhKb2luTGVuID0gMjU2O1xuY2xhc3MgVGV4dFZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3IodGV4dCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDsgfVxuICAgIGNyZWF0ZURPTSh0ZXh0RE9NKSB7XG4gICAgICAgIHRoaXMuc2V0RE9NKHRleHRET00gfHwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy50ZXh0KSk7XG4gICAgfVxuICAgIHN5bmModmlldywgdHJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSlcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRE9NKCk7XG4gICAgICAgIGlmICh0aGlzLmRvbS5ub2RlVmFsdWUgIT0gdGhpcy50ZXh0KSB7XG4gICAgICAgICAgICBpZiAodHJhY2sgJiYgdHJhY2subm9kZSA9PSB0aGlzLmRvbSlcbiAgICAgICAgICAgICAgICB0cmFjay53cml0dGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZG9tLm5vZGVWYWx1ZSA9IHRoaXMudGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXVzZURPTShkb20pIHtcbiAgICAgICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgdGhpcy5jcmVhdGVET00oZG9tKTtcbiAgICB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSkge1xuICAgICAgICBpZiAoKHRoaXMuZmxhZ3MgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKSB8fFxuICAgICAgICAgICAgc291cmNlICYmICghKHNvdXJjZSBpbnN0YW5jZW9mIFRleHRWaWV3KSB8fFxuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoIC0gKHRvIC0gZnJvbSkgKyBzb3VyY2UubGVuZ3RoID4gTWF4Sm9pbkxlbiB8fFxuICAgICAgICAgICAgICAgIChzb3VyY2UuZmxhZ3MgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5zbGljZSgwLCBmcm9tKSArIChzb3VyY2UgPyBzb3VyY2UudGV4dCA6IFwiXCIpICsgdGhpcy50ZXh0LnNsaWNlKHRvKTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNwbGl0KGZyb20pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUZXh0Vmlldyh0aGlzLnRleHQuc2xpY2UoZnJvbSkpO1xuICAgICAgICB0aGlzLnRleHQgPSB0aGlzLnRleHQuc2xpY2UoMCwgZnJvbSk7XG4gICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIHJlc3VsdC5mbGFncyB8PSB0aGlzLmZsYWdzICYgOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLztcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbm9kZSA9PSB0aGlzLmRvbSA/IG9mZnNldCA6IG9mZnNldCA/IHRoaXMudGV4dC5sZW5ndGggOiAwO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHsgcmV0dXJuIG5ldyBET01Qb3ModGhpcy5kb20sIHBvcyk7IH1cbiAgICBkb21Cb3VuZHNBcm91bmQoX2Zyb20sIF90bywgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB7IGZyb206IG9mZnNldCwgdG86IG9mZnNldCArIHRoaXMubGVuZ3RoLCBzdGFydERPTTogdGhpcy5kb20sIGVuZERPTTogdGhpcy5kb20ubmV4dFNpYmxpbmcgfTtcbiAgICB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIHJldHVybiB0ZXh0Q29vcmRzKHRoaXMuZG9tLCBwb3MsIHNpZGUpO1xuICAgIH1cbn1cbmNsYXNzIE1hcmtWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKG1hcmssIGNoaWxkcmVuID0gW10sIGxlbmd0aCA9IDApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5tYXJrID0gbWFyaztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgY2ggb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICBjaC5zZXRQYXJlbnQodGhpcyk7XG4gICAgfVxuICAgIHNldEF0dHJzKGRvbSkge1xuICAgICAgICBjbGVhckF0dHJpYnV0ZXMoZG9tKTtcbiAgICAgICAgaWYgKHRoaXMubWFyay5jbGFzcylcbiAgICAgICAgICAgIGRvbS5jbGFzc05hbWUgPSB0aGlzLm1hcmsuY2xhc3M7XG4gICAgICAgIGlmICh0aGlzLm1hcmsuYXR0cnMpXG4gICAgICAgICAgICBmb3IgKGxldCBuYW1lIGluIHRoaXMubWFyay5hdHRycylcbiAgICAgICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKG5hbWUsIHRoaXMubWFyay5hdHRyc1tuYW1lXSk7XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIGNhblJldXNlRE9NKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5jYW5SZXVzZURPTShvdGhlcikgJiYgISgodGhpcy5mbGFncyB8IG90aGVyLmZsYWdzKSAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pO1xuICAgIH1cbiAgICByZXVzZURPTShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IHRoaXMubWFyay50YWdOYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5mbGFncyB8PSA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi8gfCAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLnNldERPTSh0aGlzLnNldEF0dHJzKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5tYXJrLnRhZ05hbWUpKSk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZmxhZ3MgJiA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi8pXG4gICAgICAgICAgICB0aGlzLnNldEF0dHJzKHRoaXMuZG9tKTtcbiAgICAgICAgc3VwZXIuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIF9oYXNTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgICAgIGlmIChzb3VyY2UgJiYgKCEoc291cmNlIGluc3RhbmNlb2YgTWFya1ZpZXcgJiYgc291cmNlLm1hcmsuZXEodGhpcy5tYXJrKSkgfHxcbiAgICAgICAgICAgIChmcm9tICYmIG9wZW5TdGFydCA8PSAwKSB8fCAodG8gPCB0aGlzLmxlbmd0aCAmJiBvcGVuRW5kIDw9IDApKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbWVyZ2VDaGlsZHJlbkludG8odGhpcywgZnJvbSwgdG8sIHNvdXJjZSA/IHNvdXJjZS5jaGlsZHJlbi5zbGljZSgpIDogW10sIG9wZW5TdGFydCAtIDEsIG9wZW5FbmQgLSAxKTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNwbGl0KGZyb20pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdLCBvZmYgPSAwLCBkZXRhY2hGcm9tID0gLTEsIGkgPSAwO1xuICAgICAgICBmb3IgKGxldCBlbHQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgbGV0IGVuZCA9IG9mZiArIGVsdC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID4gZnJvbSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvZmYgPCBmcm9tID8gZWx0LnNwbGl0KGZyb20gLSBvZmYpIDogZWx0KTtcbiAgICAgICAgICAgIGlmIChkZXRhY2hGcm9tIDwgMCAmJiBvZmYgPj0gZnJvbSlcbiAgICAgICAgICAgICAgICBkZXRhY2hGcm9tID0gaTtcbiAgICAgICAgICAgIG9mZiA9IGVuZDtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGVuZ3RoID0gdGhpcy5sZW5ndGggLSBmcm9tO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGZyb207XG4gICAgICAgIGlmIChkZXRhY2hGcm9tID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gZGV0YWNoRnJvbTtcbiAgICAgICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrVmlldyh0aGlzLm1hcmssIHJlc3VsdCwgbGVuZ3RoKTtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiBpbmxpbmVET01BdFBvcyh0aGlzLCBwb3MpO1xuICAgIH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgcmV0dXJuIGNvb3Jkc0luQ2hpbGRyZW4odGhpcywgcG9zLCBzaWRlKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0ZXh0Q29vcmRzKHRleHQsIHBvcywgc2lkZSkge1xuICAgIGxldCBsZW5ndGggPSB0ZXh0Lm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgaWYgKHBvcyA+IGxlbmd0aClcbiAgICAgICAgcG9zID0gbGVuZ3RoO1xuICAgIGxldCBmcm9tID0gcG9zLCB0byA9IHBvcywgZmxhdHRlbiA9IDA7XG4gICAgaWYgKHBvcyA9PSAwICYmIHNpZGUgPCAwIHx8IHBvcyA9PSBsZW5ndGggJiYgc2lkZSA+PSAwKSB7XG4gICAgICAgIGlmICghKGJyb3dzZXIuY2hyb21lIHx8IGJyb3dzZXIuZ2Vja28pKSB7IC8vIFRoZXNlIGJyb3dzZXJzIHJlbGlhYmx5IHJldHVybiB2YWxpZCByZWN0YW5nbGVzIGZvciBlbXB0eSByYW5nZXNcbiAgICAgICAgICAgIGlmIChwb3MpIHtcbiAgICAgICAgICAgICAgICBmcm9tLS07XG4gICAgICAgICAgICAgICAgZmxhdHRlbiA9IDE7XG4gICAgICAgICAgICB9IC8vIEZJWE1FIHRoaXMgaXMgd3JvbmcgaW4gUlRMIHRleHRcbiAgICAgICAgICAgIGVsc2UgaWYgKHRvIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdG8rKztcbiAgICAgICAgICAgICAgICBmbGF0dGVuID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChzaWRlIDwgMClcbiAgICAgICAgICAgIGZyb20tLTtcbiAgICAgICAgZWxzZSBpZiAodG8gPCBsZW5ndGgpXG4gICAgICAgICAgICB0bysrO1xuICAgIH1cbiAgICBsZXQgcmVjdHMgPSB0ZXh0UmFuZ2UodGV4dCwgZnJvbSwgdG8pLmdldENsaWVudFJlY3RzKCk7XG4gICAgaWYgKCFyZWN0cy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCByZWN0ID0gcmVjdHNbKGZsYXR0ZW4gPyBmbGF0dGVuIDwgMCA6IHNpZGUgPj0gMCkgPyAwIDogcmVjdHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKGJyb3dzZXIuc2FmYXJpICYmICFmbGF0dGVuICYmIHJlY3Qud2lkdGggPT0gMClcbiAgICAgICAgcmVjdCA9IEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwocmVjdHMsIHIgPT4gci53aWR0aCkgfHwgcmVjdDtcbiAgICByZXR1cm4gZmxhdHRlbiA/IGZsYXR0ZW5SZWN0KHJlY3QsIGZsYXR0ZW4gPCAwKSA6IHJlY3QgfHwgbnVsbDtcbn1cbi8vIEFsc28gdXNlZCBmb3IgY29sbGFwc2VkIHJhbmdlcyB0aGF0IGRvbid0IGhhdmUgYSBwbGFjZWhvbGRlciB3aWRnZXQhXG5jbGFzcyBXaWRnZXRWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIHN0YXRpYyBjcmVhdGUod2lkZ2V0LCBsZW5ndGgsIHNpZGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaWRnZXRWaWV3KHdpZGdldCwgbGVuZ3RoLCBzaWRlKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Iod2lkZ2V0LCBsZW5ndGgsIHNpZGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLnNpZGUgPSBzaWRlO1xuICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSBudWxsO1xuICAgIH1cbiAgICBzcGxpdChmcm9tKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBXaWRnZXRWaWV3LmNyZWF0ZSh0aGlzLndpZGdldCwgdGhpcy5sZW5ndGggLSBmcm9tLCB0aGlzLnNpZGUpO1xuICAgICAgICB0aGlzLmxlbmd0aCAtPSBmcm9tO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzeW5jKHZpZXcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSB8fCAhdGhpcy53aWRnZXQudXBkYXRlRE9NKHRoaXMuZG9tLCB2aWV3KSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZG9tICYmIHRoaXMucHJldldpZGdldClcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQuZGVzdHJveSh0aGlzLmRvbSk7XG4gICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zZXRET00odGhpcy53aWRnZXQudG9ET00odmlldykpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLndpZGdldC5lZGl0YWJsZSlcbiAgICAgICAgICAgICAgICB0aGlzLmRvbS5jb250ZW50RWRpdGFibGUgPSBcImZhbHNlXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0U2lkZSgpIHsgcmV0dXJuIHRoaXMuc2lkZTsgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIGhhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiAoIShzb3VyY2UgaW5zdGFuY2VvZiBXaWRnZXRWaWV3KSB8fCAhdGhpcy53aWRnZXQuY29tcGFyZShzb3VyY2Uud2lkZ2V0KSB8fFxuICAgICAgICAgICAgZnJvbSA+IDAgJiYgb3BlblN0YXJ0IDw9IDAgfHwgdG8gPCB0aGlzLmxlbmd0aCAmJiBvcGVuRW5kIDw9IDApKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGZyb20gKyAoc291cmNlID8gc291cmNlLmxlbmd0aCA6IDApICsgKHRoaXMubGVuZ3RoIC0gdG8pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFdpZGdldFZpZXcgJiYgb3RoZXIuc2lkZSA9PSB0aGlzLnNpZGUgJiZcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmNvbnN0cnVjdG9yID09IG90aGVyLndpZGdldC5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLndpZGdldC5jb21wYXJlKG90aGVyLndpZGdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgIXRoaXMucHJldldpZGdldClcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSB0aGlzLndpZGdldDtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0ID0gb3RoZXIud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBvdGhlci5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGlnbm9yZUV2ZW50KGV2ZW50KSB7IHJldHVybiB0aGlzLndpZGdldC5pZ25vcmVFdmVudChldmVudCk7IH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBUZXh0LmVtcHR5O1xuICAgICAgICBsZXQgdG9wID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHRvcC5wYXJlbnQpXG4gICAgICAgICAgICB0b3AgPSB0b3AucGFyZW50O1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0b3AsIHRleHQgPSB2aWV3ICYmIHZpZXcuc3RhdGUuZG9jLCBzdGFydCA9IHRoaXMucG9zQXRTdGFydDtcbiAgICAgICAgcmV0dXJuIHRleHQgPyB0ZXh0LnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMubGVuZ3RoKSA6IFRleHQuZW1wdHk7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICByZXR1cm4gKHRoaXMubGVuZ3RoID8gcG9zID09IDAgOiB0aGlzLnNpZGUgPiAwKVxuICAgICAgICAgICAgPyBET01Qb3MuYmVmb3JlKHRoaXMuZG9tKVxuICAgICAgICAgICAgOiBET01Qb3MuYWZ0ZXIodGhpcy5kb20sIHBvcyA9PSB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZCgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IGN1c3RvbSA9IHRoaXMud2lkZ2V0LmNvb3Jkc0F0KHRoaXMuZG9tLCBwb3MsIHNpZGUpO1xuICAgICAgICBpZiAoY3VzdG9tKVxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbTtcbiAgICAgICAgbGV0IHJlY3RzID0gdGhpcy5kb20uZ2V0Q2xpZW50UmVjdHMoKSwgcmVjdCA9IG51bGw7XG4gICAgICAgIGlmICghcmVjdHMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBmcm9tQmFjayA9IHRoaXMuc2lkZSA/IHRoaXMuc2lkZSA8IDAgOiBwb3MgPiAwO1xuICAgICAgICBmb3IgKGxldCBpID0gZnJvbUJhY2sgPyByZWN0cy5sZW5ndGggLSAxIDogMDs7IGkgKz0gKGZyb21CYWNrID8gLTEgOiAxKSkge1xuICAgICAgICAgICAgcmVjdCA9IHJlY3RzW2ldO1xuICAgICAgICAgICAgaWYgKHBvcyA+IDAgPyBpID09IDAgOiBpID09IHJlY3RzLmxlbmd0aCAtIDEgfHwgcmVjdC50b3AgPCByZWN0LmJvdHRvbSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHRlblJlY3QocmVjdCwgIWZyb21CYWNrKTtcbiAgICB9XG4gICAgZ2V0IGlzRWRpdGFibGUoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGdldCBpc1dpZGdldCgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiB0aGlzLndpZGdldC5pc0hpZGRlbjsgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy53aWRnZXQuZGVzdHJveSh0aGlzLmRvbSk7XG4gICAgfVxufVxuLy8gVGhlc2UgYXJlIGRyYXduIGFyb3VuZCB1bmVkaXRhYmxlIHdpZGdldHMgdG8gYXZvaWQgYSBudW1iZXIgb2Zcbi8vIGJyb3dzZXIgYnVncyB0aGF0IHNob3cgdXAgd2hlbiB0aGUgY3Vyc29yIGlzIGRpcmVjdGx5IG5leHQgdG9cbi8vIHVuZWRpdGFibGUgaW5saW5lIGNvbnRlbnQuXG5jbGFzcyBXaWRnZXRCdWZmZXJWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKHNpZGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zaWRlID0gc2lkZTtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIDA7IH1cbiAgICBtZXJnZSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFdpZGdldEJ1ZmZlclZpZXcgJiYgb3RoZXIuc2lkZSA9PSB0aGlzLnNpZGU7XG4gICAgfVxuICAgIHNwbGl0KCkgeyByZXR1cm4gbmV3IFdpZGdldEJ1ZmZlclZpZXcodGhpcy5zaWRlKTsgfVxuICAgIHN5bmMoKSB7XG4gICAgICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgICAgICAgIGxldCBkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAgICAgZG9tLmNsYXNzTmFtZSA9IFwiY20td2lkZ2V0QnVmZmVyXCI7XG4gICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgdGhpcy5zZXRET00oZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRTaWRlKCkgeyByZXR1cm4gdGhpcy5zaWRlOyB9XG4gICAgZG9tQXRQb3MocG9zKSB7IHJldHVybiB0aGlzLnNpZGUgPiAwID8gRE9NUG9zLmJlZm9yZSh0aGlzLmRvbSkgOiBET01Qb3MuYWZ0ZXIodGhpcy5kb20pOyB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKCkgeyByZXR1cm4gMDsgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZCgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBjb29yZHNBdChwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkge1xuICAgICAgICByZXR1cm4gVGV4dC5lbXB0eTtcbiAgICB9XG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gdHJ1ZTsgfVxufVxuVGV4dFZpZXcucHJvdG90eXBlLmNoaWxkcmVuID0gV2lkZ2V0Vmlldy5wcm90b3R5cGUuY2hpbGRyZW4gPSBXaWRnZXRCdWZmZXJWaWV3LnByb3RvdHlwZS5jaGlsZHJlbiA9IG5vQ2hpbGRyZW47XG5mdW5jdGlvbiBpbmxpbmVET01BdFBvcyhwYXJlbnQsIHBvcykge1xuICAgIGxldCBkb20gPSBwYXJlbnQuZG9tLCB7IGNoaWxkcmVuIH0gPSBwYXJlbnQsIGkgPSAwO1xuICAgIGZvciAobGV0IG9mZiA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBjaGlsZHJlbltpXSwgZW5kID0gb2ZmICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICBpZiAoZW5kID09IG9mZiAmJiBjaGlsZC5nZXRTaWRlKCkgPD0gMClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAocG9zID4gb2ZmICYmIHBvcyA8IGVuZCAmJiBjaGlsZC5kb20ucGFyZW50Tm9kZSA9PSBkb20pXG4gICAgICAgICAgICByZXR1cm4gY2hpbGQuZG9tQXRQb3MocG9zIC0gb2ZmKTtcbiAgICAgICAgaWYgKHBvcyA8PSBvZmYpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgb2ZmID0gZW5kO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gaTsgaiA+IDA7IGotLSkge1xuICAgICAgICBsZXQgcHJldiA9IGNoaWxkcmVuW2ogLSAxXTtcbiAgICAgICAgaWYgKHByZXYuZG9tLnBhcmVudE5vZGUgPT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuIHByZXYuZG9tQXRQb3MocHJldi5sZW5ndGgpO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGxldCBuZXh0ID0gY2hpbGRyZW5bal07XG4gICAgICAgIGlmIChuZXh0LmRvbS5wYXJlbnROb2RlID09IGRvbSlcbiAgICAgICAgICAgIHJldHVybiBuZXh0LmRvbUF0UG9zKDApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERPTVBvcyhkb20sIDApO1xufVxuLy8gQXNzdW1lcyBgdmlld2AsIGlmIGEgbWFyayB2aWV3LCBoYXMgcHJlY2lzZWx5IDEgY2hpbGQuXG5mdW5jdGlvbiBqb2luSW5saW5lSW50byhwYXJlbnQsIHZpZXcsIG9wZW4pIHtcbiAgICBsZXQgbGFzdCwgeyBjaGlsZHJlbiB9ID0gcGFyZW50O1xuICAgIGlmIChvcGVuID4gMCAmJiB2aWV3IGluc3RhbmNlb2YgTWFya1ZpZXcgJiYgY2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgIChsYXN0ID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0pIGluc3RhbmNlb2YgTWFya1ZpZXcgJiYgbGFzdC5tYXJrLmVxKHZpZXcubWFyaykpIHtcbiAgICAgICAgam9pbklubGluZUludG8obGFzdCwgdmlldy5jaGlsZHJlblswXSwgb3BlbiAtIDEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaCh2aWV3KTtcbiAgICAgICAgdmlldy5zZXRQYXJlbnQocGFyZW50KTtcbiAgICB9XG4gICAgcGFyZW50Lmxlbmd0aCArPSB2aWV3Lmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGNvb3Jkc0luQ2hpbGRyZW4odmlldywgcG9zLCBzaWRlKSB7XG4gICAgbGV0IGJlZm9yZSA9IG51bGwsIGJlZm9yZVBvcyA9IC0xLCBhZnRlciA9IG51bGwsIGFmdGVyUG9zID0gLTE7XG4gICAgZnVuY3Rpb24gc2Nhbih2aWV3LCBwb3MpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG9mZiA9IDA7IGkgPCB2aWV3LmNoaWxkcmVuLmxlbmd0aCAmJiBvZmYgPD0gcG9zOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHZpZXcuY2hpbGRyZW5baV0sIGVuZCA9IG9mZiArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBzY2FuKGNoaWxkLCBwb3MgLSBvZmYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgoIWFmdGVyIHx8IGFmdGVyLmlzSGlkZGVuICYmIHNpZGUgPiAwKSAmJlxuICAgICAgICAgICAgICAgICAgICAoZW5kID4gcG9zIHx8IG9mZiA9PSBlbmQgJiYgY2hpbGQuZ2V0U2lkZSgpID4gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQb3MgPSBwb3MgLSBvZmY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9mZiA8IHBvcyB8fCAob2ZmID09IGVuZCAmJiBjaGlsZC5nZXRTaWRlKCkgPCAwKSAmJiAhY2hpbGQuaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZVBvcyA9IHBvcyAtIG9mZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmYgPSBlbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2Nhbih2aWV3LCBwb3MpO1xuICAgIGxldCB0YXJnZXQgPSAoc2lkZSA8IDAgPyBiZWZvcmUgOiBhZnRlcikgfHwgYmVmb3JlIHx8IGFmdGVyO1xuICAgIGlmICh0YXJnZXQpXG4gICAgICAgIHJldHVybiB0YXJnZXQuY29vcmRzQXQoTWF0aC5tYXgoMCwgdGFyZ2V0ID09IGJlZm9yZSA/IGJlZm9yZVBvcyA6IGFmdGVyUG9zKSwgc2lkZSk7XG4gICAgcmV0dXJuIGZhbGxiYWNrUmVjdCh2aWV3KTtcbn1cbmZ1bmN0aW9uIGZhbGxiYWNrUmVjdCh2aWV3KSB7XG4gICAgbGV0IGxhc3QgPSB2aWV3LmRvbS5sYXN0Q2hpbGQ7XG4gICAgaWYgKCFsYXN0KVxuICAgICAgICByZXR1cm4gdmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHJlY3RzID0gY2xpZW50UmVjdHNGb3IobGFzdCk7XG4gICAgcmV0dXJuIHJlY3RzW3JlY3RzLmxlbmd0aCAtIDFdIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVBdHRycyhzb3VyY2UsIHRhcmdldCkge1xuICAgIGZvciAobGV0IG5hbWUgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChuYW1lID09IFwiY2xhc3NcIiAmJiB0YXJnZXQuY2xhc3MpXG4gICAgICAgICAgICB0YXJnZXQuY2xhc3MgKz0gXCIgXCIgKyBzb3VyY2UuY2xhc3M7XG4gICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gXCJzdHlsZVwiICYmIHRhcmdldC5zdHlsZSlcbiAgICAgICAgICAgIHRhcmdldC5zdHlsZSArPSBcIjtcIiArIHNvdXJjZS5zdHlsZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGFyZ2V0W25hbWVdID0gc291cmNlW25hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuY29uc3Qgbm9BdHRycyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuZnVuY3Rpb24gYXR0cnNFcShhLCBiLCBpZ25vcmUpIHtcbiAgICBpZiAoYSA9PSBiKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWEpXG4gICAgICAgIGEgPSBub0F0dHJzO1xuICAgIGlmICghYilcbiAgICAgICAgYiA9IG5vQXR0cnM7XG4gICAgbGV0IGtleXNBID0gT2JqZWN0LmtleXMoYSksIGtleXNCID0gT2JqZWN0LmtleXMoYik7XG4gICAgaWYgKGtleXNBLmxlbmd0aCAtIChpZ25vcmUgJiYga2V5c0EuaW5kZXhPZihpZ25vcmUpID4gLTEgPyAxIDogMCkgIT1cbiAgICAgICAga2V5c0IubGVuZ3RoIC0gKGlnbm9yZSAmJiBrZXlzQi5pbmRleE9mKGlnbm9yZSkgPiAtMSA/IDEgOiAwKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGtleSBvZiBrZXlzQSkge1xuICAgICAgICBpZiAoa2V5ICE9IGlnbm9yZSAmJiAoa2V5c0IuaW5kZXhPZihrZXkpID09IC0xIHx8IGFba2V5XSAhPT0gYltrZXldKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB1cGRhdGVBdHRycyhkb20sIHByZXYsIGF0dHJzKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBpZiAocHJldilcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBwcmV2KVxuICAgICAgICAgICAgaWYgKCEoYXR0cnMgJiYgbmFtZSBpbiBhdHRycykpIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBcInN0eWxlXCIpXG4gICAgICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5jc3NUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgaWYgKGF0dHJzKVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKVxuICAgICAgICAgICAgaWYgKCEocHJldiAmJiBwcmV2W25hbWVdID09IGF0dHJzW25hbWVdKSkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IFwic3R5bGVcIilcbiAgICAgICAgICAgICAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgPSBhdHRyc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUobmFtZSwgYXR0cnNbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgIHJldHVybiBjaGFuZ2VkO1xufVxuZnVuY3Rpb24gZ2V0QXR0cnMoZG9tKSB7XG4gICAgbGV0IGF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBhdHRyID0gZG9tLmF0dHJpYnV0ZXNbaV07XG4gICAgICAgIGF0dHJzW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gYXR0cnM7XG59XG5cbmNsYXNzIExpbmVWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBudWxsO1xuICAgICAgICB0aGlzLmJyZWFrQWZ0ZXIgPSAwO1xuICAgIH1cbiAgICAvLyBDb25zdW1lcyBzb3VyY2VcbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBoYXNTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmICghKHNvdXJjZSBpbnN0YW5jZW9mIExpbmVWaWV3KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZG9tKVxuICAgICAgICAgICAgICAgIHNvdXJjZS50cmFuc2ZlckRPTSh0aGlzKTsgLy8gUmV1c2Ugc291cmNlLmRvbSB3aGVuIGFwcHJvcHJpYXRlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1N0YXJ0KVxuICAgICAgICAgICAgdGhpcy5zZXREZWNvKHNvdXJjZSA/IHNvdXJjZS5hdHRycyA6IG51bGwpO1xuICAgICAgICBtZXJnZUNoaWxkcmVuSW50byh0aGlzLCBmcm9tLCB0bywgc291cmNlID8gc291cmNlLmNoaWxkcmVuLnNsaWNlKCkgOiBbXSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNwbGl0KGF0KSB7XG4gICAgICAgIGxldCBlbmQgPSBuZXcgTGluZVZpZXc7XG4gICAgICAgIGVuZC5icmVha0FmdGVyID0gdGhpcy5icmVha0FmdGVyO1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBlbmQ7XG4gICAgICAgIGxldCB7IGksIG9mZiB9ID0gdGhpcy5jaGlsZFBvcyhhdCk7XG4gICAgICAgIGlmIChvZmYpIHtcbiAgICAgICAgICAgIGVuZC5hcHBlbmQodGhpcy5jaGlsZHJlbltpXS5zcGxpdChvZmYpLCAwKTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ubWVyZ2Uob2ZmLCB0aGlzLmNoaWxkcmVuW2ldLmxlbmd0aCwgbnVsbCwgZmFsc2UsIDAsIDApO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGorKylcbiAgICAgICAgICAgIGVuZC5hcHBlbmQodGhpcy5jaGlsZHJlbltqXSwgMCk7XG4gICAgICAgIHdoaWxlIChpID4gMCAmJiB0aGlzLmNoaWxkcmVuW2kgLSAxXS5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5bLS1pXS5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gaTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBhdDtcbiAgICAgICAgcmV0dXJuIGVuZDtcbiAgICB9XG4gICAgdHJhbnNmZXJET00ob3RoZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgb3RoZXIuc2V0RE9NKHRoaXMuZG9tKTtcbiAgICAgICAgb3RoZXIucHJldkF0dHJzID0gdGhpcy5wcmV2QXR0cnMgPT09IHVuZGVmaW5lZCA/IHRoaXMuYXR0cnMgOiB0aGlzLnByZXZBdHRycztcbiAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZG9tID0gbnVsbDtcbiAgICB9XG4gICAgc2V0RGVjbyhhdHRycykge1xuICAgICAgICBpZiAoIWF0dHJzRXEodGhpcy5hdHRycywgYXR0cnMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZBdHRycyA9IHRoaXMuYXR0cnM7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBlbmQoY2hpbGQsIG9wZW5TdGFydCkge1xuICAgICAgICBqb2luSW5saW5lSW50byh0aGlzLCBjaGlsZCwgb3BlblN0YXJ0KTtcbiAgICB9XG4gICAgLy8gT25seSBjYWxsZWQgd2hlbiBidWlsZGluZyBhIGxpbmUgdmlldyBpbiBDb250ZW50QnVpbGRlclxuICAgIGFkZExpbmVEZWNvKGRlY28pIHtcbiAgICAgICAgbGV0IGF0dHJzID0gZGVjby5zcGVjLmF0dHJpYnV0ZXMsIGNscyA9IGRlY28uc3BlYy5jbGFzcztcbiAgICAgICAgaWYgKGF0dHJzKVxuICAgICAgICAgICAgdGhpcy5hdHRycyA9IGNvbWJpbmVBdHRycyhhdHRycywgdGhpcy5hdHRycyB8fCB7fSk7XG4gICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICB0aGlzLmF0dHJzID0gY29tYmluZUF0dHJzKHsgY2xhc3M6IGNscyB9LCB0aGlzLmF0dHJzIHx8IHt9KTtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiBpbmxpbmVET01BdFBvcyh0aGlzLCBwb3MpO1xuICAgIH1cbiAgICByZXVzZURPTShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IFwiRElWXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5mbGFncyB8PSA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi8gfCAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSkge1xuICAgICAgICAgICAgdGhpcy5zZXRET00oZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWxpbmVcIjtcbiAgICAgICAgICAgIHRoaXMucHJldkF0dHJzID0gdGhpcy5hdHRycyA/IG51bGwgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5mbGFncyAmIDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLykge1xuICAgICAgICAgICAgY2xlYXJBdHRyaWJ1dGVzKHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tbGluZVwiO1xuICAgICAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB0aGlzLmF0dHJzID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcmV2QXR0cnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdXBkYXRlQXR0cnModGhpcy5kb20sIHRoaXMucHJldkF0dHJzLCB0aGlzLmF0dHJzKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1saW5lXCIpO1xuICAgICAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5kb20ubGFzdENoaWxkO1xuICAgICAgICB3aGlsZSAobGFzdCAmJiBDb250ZW50Vmlldy5nZXQobGFzdCkgaW5zdGFuY2VvZiBNYXJrVmlldylcbiAgICAgICAgICAgIGxhc3QgPSBsYXN0Lmxhc3RDaGlsZDtcbiAgICAgICAgaWYgKCFsYXN0IHx8ICF0aGlzLmxlbmd0aCB8fFxuICAgICAgICAgICAgbGFzdC5ub2RlTmFtZSAhPSBcIkJSXCIgJiYgKChfYSA9IENvbnRlbnRWaWV3LmdldChsYXN0KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzRWRpdGFibGUpID09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgKCFicm93c2VyLmlvcyB8fCAhdGhpcy5jaGlsZHJlbi5zb21lKGNoID0+IGNoIGluc3RhbmNlb2YgVGV4dFZpZXcpKSkge1xuICAgICAgICAgICAgbGV0IGhhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiQlJcIik7XG4gICAgICAgICAgICBoYWNrLmNtSWdub3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGhhY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1lYXN1cmVUZXh0U2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09IDAgfHwgdGhpcy5sZW5ndGggPiAyMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IDAsIHRleHRIZWlnaHQ7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgVGV4dFZpZXcpIHx8IC9bXiAtfl0vLnRlc3QoY2hpbGQudGV4dCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBsZXQgcmVjdHMgPSBjbGllbnRSZWN0c0ZvcihjaGlsZC5kb20pO1xuICAgICAgICAgICAgaWYgKHJlY3RzLmxlbmd0aCAhPSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgdG90YWxXaWR0aCArPSByZWN0c1swXS53aWR0aDtcbiAgICAgICAgICAgIHRleHRIZWlnaHQgPSByZWN0c1swXS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF0b3RhbFdpZHRoID8gbnVsbCA6IHtcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCxcbiAgICAgICAgICAgIGNoYXJXaWR0aDogdG90YWxXaWR0aCAvIHRoaXMubGVuZ3RoLFxuICAgICAgICAgICAgdGV4dEhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IHJlY3QgPSBjb29yZHNJbkNoaWxkcmVuKHRoaXMsIHBvcywgc2lkZSk7XG4gICAgICAgIC8vIENvcnJlY3QgcmVjdGFuZ2xlIGhlaWdodCBmb3IgZW1wdHkgbGluZXMgd2hlbiB0aGUgcmV0dXJuZWRcbiAgICAgICAgLy8gaGVpZ2h0IGlzIGxhcmdlciB0aGFuIHRoZSB0ZXh0IGhlaWdodC5cbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuLmxlbmd0aCAmJiByZWN0ICYmIHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBsZXQgeyBoZWlnaHRPcmFjbGUgfSA9IHRoaXMucGFyZW50LnZpZXcudmlld1N0YXRlLCBoZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wO1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGhlaWdodCAtIGhlaWdodE9yYWNsZS5saW5lSGVpZ2h0KSA8IDIgJiYgaGVpZ2h0T3JhY2xlLnRleHRIZWlnaHQgPCBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzdCA9IChoZWlnaHQgLSBoZWlnaHRPcmFjbGUudGV4dEhlaWdodCkgLyAyO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHRvcDogcmVjdC50b3AgKyBkaXN0LCBib3R0b206IHJlY3QuYm90dG9tIC0gZGlzdCwgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5sZWZ0IH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgfVxuICAgIGJlY29tZShfb3RoZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgY292ZXJzKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIHN0YXRpYyBmaW5kKGRvY1ZpZXcsIHBvcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgb2ZmID0gMDsgaSA8IGRvY1ZpZXcuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBibG9jayA9IGRvY1ZpZXcuY2hpbGRyZW5baV0sIGVuZCA9IG9mZiArIGJsb2NrLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrIGluc3RhbmNlb2YgTGluZVZpZXcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9jaztcbiAgICAgICAgICAgICAgICBpZiAoZW5kID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IGVuZCArIGJsb2NrLmJyZWFrQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuY2xhc3MgQmxvY2tXaWRnZXRWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKHdpZGdldCwgbGVuZ3RoLCBkZWNvKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5kZWNvID0gZGVjbztcbiAgICAgICAgdGhpcy5icmVha0FmdGVyID0gMDtcbiAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gbnVsbDtcbiAgICB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSwgX3Rha2VEZWNvLCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiAoIShzb3VyY2UgaW5zdGFuY2VvZiBCbG9ja1dpZGdldFZpZXcpIHx8ICF0aGlzLndpZGdldC5jb21wYXJlKHNvdXJjZS53aWRnZXQpIHx8XG4gICAgICAgICAgICBmcm9tID4gMCAmJiBvcGVuU3RhcnQgPD0gMCB8fCB0byA8IHRoaXMubGVuZ3RoICYmIG9wZW5FbmQgPD0gMCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gZnJvbSArIChzb3VyY2UgPyBzb3VyY2UubGVuZ3RoIDogMCkgKyAodGhpcy5sZW5ndGggLSB0byk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIHBvcyA9PSAwID8gRE9NUG9zLmJlZm9yZSh0aGlzLmRvbSkgOiBET01Qb3MuYWZ0ZXIodGhpcy5kb20sIHBvcyA9PSB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICAgIHNwbGl0KGF0KSB7XG4gICAgICAgIGxldCBsZW4gPSB0aGlzLmxlbmd0aCAtIGF0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGF0O1xuICAgICAgICBsZXQgZW5kID0gbmV3IEJsb2NrV2lkZ2V0Vmlldyh0aGlzLndpZGdldCwgbGVuLCB0aGlzLmRlY28pO1xuICAgICAgICBlbmQuYnJlYWtBZnRlciA9IHRoaXMuYnJlYWtBZnRlcjtcbiAgICAgICAgcmV0dXJuIGVuZDtcbiAgICB9XG4gICAgZ2V0IGNoaWxkcmVuKCkgeyByZXR1cm4gbm9DaGlsZHJlbjsgfVxuICAgIHN5bmModmlldykge1xuICAgICAgICBpZiAoIXRoaXMuZG9tIHx8ICF0aGlzLndpZGdldC51cGRhdGVET00odGhpcy5kb20sIHZpZXcpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgdGhpcy5wcmV2V2lkZ2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucHJldldpZGdldC5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMucHJldldpZGdldCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNldERPTSh0aGlzLndpZGdldC50b0RPTSh2aWV3KSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMud2lkZ2V0LmVkaXRhYmxlKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC52aWV3LnN0YXRlLmRvYy5zbGljZSh0aGlzLnBvc0F0U3RhcnQsIHRoaXMucG9zQXRFbmQpIDogVGV4dC5lbXB0eTtcbiAgICB9XG4gICAgZG9tQm91bmRzQXJvdW5kKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGJlY29tZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBCbG9ja1dpZGdldFZpZXcgJiZcbiAgICAgICAgICAgIG90aGVyLndpZGdldC5jb25zdHJ1Y3RvciA9PSB0aGlzLndpZGdldC5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgaWYgKCFvdGhlci53aWRnZXQuY29tcGFyZSh0aGlzLndpZGdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgIXRoaXMucHJldldpZGdldClcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSB0aGlzLndpZGdldDtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0ID0gb3RoZXIud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBvdGhlci5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmRlY28gPSBvdGhlci5kZWNvO1xuICAgICAgICAgICAgdGhpcy5icmVha0FmdGVyID0gb3RoZXIuYnJlYWtBZnRlcjtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24oKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWdub3JlRXZlbnQoZXZlbnQpIHsgcmV0dXJuIHRoaXMud2lkZ2V0Lmlnbm9yZUV2ZW50KGV2ZW50KTsgfVxuICAgIGdldCBpc0VkaXRhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBnZXQgaXNXaWRnZXQoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndpZGdldC5jb29yZHNBdCh0aGlzLmRvbSwgcG9zLCBzaWRlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLndpZGdldC5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICB9XG4gICAgY292ZXJzKHNpZGUpIHtcbiAgICAgICAgbGV0IHsgc3RhcnRTaWRlLCBlbmRTaWRlIH0gPSB0aGlzLmRlY287XG4gICAgICAgIHJldHVybiBzdGFydFNpZGUgPT0gZW5kU2lkZSA/IGZhbHNlIDogc2lkZSA8IDAgPyBzdGFydFNpZGUgPCAwIDogZW5kU2lkZSA+IDA7XG4gICAgfVxufVxuXG4vKipcbldpZGdldHMgYWRkZWQgdG8gdGhlIGNvbnRlbnQgYXJlIGRlc2NyaWJlZCBieSBzdWJjbGFzc2VzIG9mIHRoaXNcbmNsYXNzLiBVc2luZyBhIGRlc2NyaXB0aW9uIG9iamVjdCBsaWtlIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG9cbmRlbGF5IGNyZWF0aW5nIG9mIHRoZSBET00gc3RydWN0dXJlIGZvciBhIHdpZGdldCB1bnRpbCBpdCBpc1xubmVlZGVkLCBhbmQgdG8gYXZvaWQgcmVkcmF3aW5nIHdpZGdldHMgZXZlbiBpZiB0aGUgZGVjb3JhdGlvbnNcbnRoYXQgZGVmaW5lIHRoZW0gYXJlIHJlY3JlYXRlZC5cbiovXG5jbGFzcyBXaWRnZXRUeXBlIHtcbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgaW5zdGFuY2UgdG8gYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgc2FtZSB0eXBlLlxuICAgIChUeXBlU2NyaXB0IGNhbid0IGV4cHJlc3MgdGhpcywgYnV0IG9ubHkgaW5zdGFuY2VzIG9mIHRoZSBzYW1lXG4gICAgc3BlY2lmaWMgY2xhc3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhpcyBtZXRob2QuKSBUaGlzIGlzIHVzZWQgdG9cbiAgICBhdm9pZCByZWRyYXdpbmcgd2lkZ2V0cyB3aGVuIHRoZXkgYXJlIHJlcGxhY2VkIGJ5IGEgbmV3XG4gICAgZGVjb3JhdGlvbiBvZiB0aGUgc2FtZSB0eXBlLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0XG4gICAgcmV0dXJucyBgZmFsc2VgLCB3aGljaCB3aWxsIGNhdXNlIG5ldyBpbnN0YW5jZXMgb2YgdGhlIHdpZGdldCB0b1xuICAgIGFsd2F5cyBiZSByZWRyYXduLlxuICAgICovXG4gICAgZXEod2lkZ2V0KSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSBhIERPTSBlbGVtZW50IGNyZWF0ZWQgYnkgYSB3aWRnZXQgb2YgdGhlIHNhbWUgdHlwZSAoYnV0XG4gICAgZGlmZmVyZW50LCBub24tYGVxYCBjb250ZW50KSB0byByZWZsZWN0IHRoaXMgd2lkZ2V0LiBNYXkgcmV0dXJuXG4gICAgdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IGl0IGNvdWxkIHVwZGF0ZSwgZmFsc2UgdG8gaW5kaWNhdGUgaXRcbiAgICBjb3VsZG4ndCAoaW4gd2hpY2ggY2FzZSB0aGUgd2lkZ2V0IHdpbGwgYmUgcmVkcmF3bikuIFRoZSBkZWZhdWx0XG4gICAgaW1wbGVtZW50YXRpb24ganVzdCByZXR1cm5zIGZhbHNlLlxuICAgICovXG4gICAgdXBkYXRlRE9NKGRvbSwgdmlldykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhcmUob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHwgdGhpcy5jb25zdHJ1Y3RvciA9PSBvdGhlci5jb25zdHJ1Y3RvciAmJiB0aGlzLmVxKG90aGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGVzdGltYXRlZCBoZWlnaHQgdGhpcyB3aWRnZXQgd2lsbCBoYXZlLCB0byBiZSB1c2VkIHdoZW5cbiAgICBlc3RpbWF0aW5nIHRoZSBoZWlnaHQgb2YgY29udGVudCB0aGF0IGhhc24ndCBiZWVuIGRyYXduLiBNYXlcbiAgICByZXR1cm4gLTEgdG8gaW5kaWNhdGUgeW91IGRvbid0IGtub3cuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uXG4gICAgcmV0dXJucyAtMS5cbiAgICAqL1xuICAgIGdldCBlc3RpbWF0ZWRIZWlnaHQoKSB7IHJldHVybiAtMTsgfVxuICAgIC8qKlxuICAgIEZvciBpbmxpbmUgd2lkZ2V0cyB0aGF0IGFyZSBkaXNwbGF5ZWQgaW5saW5lIChhcyBvcHBvc2VkIHRvXG4gICAgYGlubGluZS1ibG9ja2ApIGFuZCBpbnRyb2R1Y2UgbGluZSBicmVha3MgKHRocm91Z2ggYDxicj5gIHRhZ3NcbiAgICBvciB0ZXh0dWFsIG5ld2xpbmVzKSwgdGhpcyBtdXN0IGluZGljYXRlIHRoZSBhbW91bnQgb2YgbGluZVxuICAgIGJyZWFrcyB0aGV5IGludHJvZHVjZS4gRGVmYXVsdHMgdG8gMC5cbiAgICAqL1xuICAgIGdldCBsaW5lQnJlYWtzKCkgeyByZXR1cm4gMDsgfVxuICAgIC8qKlxuICAgIENhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB3aGljaCBraW5kcyBvZiBldmVudHMgaW5zaWRlIHRoZSB3aWRnZXRcbiAgICBzaG91bGQgYmUgaWdub3JlZCBieSB0aGUgZWRpdG9yLiBUaGUgZGVmYXVsdCBpcyB0byBpZ25vcmUgYWxsXG4gICAgZXZlbnRzLlxuICAgICovXG4gICAgaWdub3JlRXZlbnQoZXZlbnQpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAvKipcbiAgICBPdmVycmlkZSB0aGUgd2F5IHNjcmVlbiBjb29yZGluYXRlcyBmb3IgcG9zaXRpb25zIGF0L2luIHRoZVxuICAgIHdpZGdldCBhcmUgZm91bmQuIGBwb3NgIHdpbGwgYmUgdGhlIG9mZnNldCBpbnRvIHRoZSB3aWRnZXQsIGFuZFxuICAgIGBzaWRlYCB0aGUgc2lkZSBvZiB0aGUgcG9zaXRpb24gdGhhdCBpcyBiZWluZyBxdWVyaWVkXHUyMDE0bGVzcyB0aGFuXG4gICAgemVybyBmb3IgYmVmb3JlLCBncmVhdGVyIHRoYW4gemVybyBmb3IgYWZ0ZXIsIGFuZCB6ZXJvIGZvclxuICAgIGRpcmVjdGx5IGF0IHRoYXQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBjb29yZHNBdChkb20sIHBvcywgc2lkZSkgeyByZXR1cm4gbnVsbDsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBlZGl0YWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHdpZGdldCBpcyByZW1vdmVkXG4gICAgZnJvbSB0aGUgZWRpdG9yIHZpZXcuXG4gICAgKi9cbiAgICBkZXN0cm95KGRvbSkgeyB9XG59XG4vKipcblRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgYmxvY2tzIHRoYXQgY2FuIG9jY3VyIGluIGFuIGVkaXRvciB2aWV3LlxuKi9cbnZhciBCbG9ja1R5cGUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChCbG9ja1R5cGUpIHtcbiAgICAvKipcbiAgICBBIGxpbmUgb2YgdGV4dC5cbiAgICAqL1xuICAgIEJsb2NrVHlwZVtCbG9ja1R5cGVbXCJUZXh0XCJdID0gMF0gPSBcIlRleHRcIjtcbiAgICAvKipcbiAgICBBIGJsb2NrIHdpZGdldCBhc3NvY2lhdGVkIHdpdGggdGhlIHBvc2l0aW9uIGFmdGVyIGl0LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIldpZGdldEJlZm9yZVwiXSA9IDFdID0gXCJXaWRnZXRCZWZvcmVcIjtcbiAgICAvKipcbiAgICBBIGJsb2NrIHdpZGdldCBhc3NvY2lhdGVkIHdpdGggdGhlIHBvc2l0aW9uIGJlZm9yZSBpdC5cbiAgICAqL1xuICAgIEJsb2NrVHlwZVtCbG9ja1R5cGVbXCJXaWRnZXRBZnRlclwiXSA9IDJdID0gXCJXaWRnZXRBZnRlclwiO1xuICAgIC8qKlxuICAgIEEgYmxvY2sgd2lkZ2V0IFtyZXBsYWNpbmddKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uXnJlcGxhY2UpIGEgcmFuZ2Ugb2YgY29udGVudC5cbiAgICAqL1xuICAgIEJsb2NrVHlwZVtCbG9ja1R5cGVbXCJXaWRnZXRSYW5nZVwiXSA9IDNdID0gXCJXaWRnZXRSYW5nZVwiO1xucmV0dXJuIEJsb2NrVHlwZX0pKEJsb2NrVHlwZSB8fCAoQmxvY2tUeXBlID0ge30pKTtcbi8qKlxuQSBkZWNvcmF0aW9uIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGhvdyB0byBkcmF3IG9yIHN0eWxlIGEgcGllY2Vcbm9mIGNvbnRlbnQuIFlvdSdsbCB1c3VhbGx5IHVzZSBpdCB3cmFwcGVkIGluIGFcbltgUmFuZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlKSwgd2hpY2ggYWRkcyBhIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb24uXG5Abm9uYWJzdHJhY3RcbiovXG5jbGFzcyBEZWNvcmF0aW9uIGV4dGVuZHMgUmFuZ2VWYWx1ZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGFydFNpZGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZW5kU2lkZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB3aWRnZXQsIFxuICAgIC8qKlxuICAgIFRoZSBjb25maWcgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoaXMgZGVjb3JhdGlvbi4gWW91IGNhblxuICAgIGluY2x1ZGUgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGluIHRoZXJlIHRvIHN0b3JlIG1ldGFkYXRhIGFib3V0XG4gICAgeW91ciBkZWNvcmF0aW9uLlxuICAgICovXG4gICAgc3BlYykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnN0YXJ0U2lkZSA9IHN0YXJ0U2lkZTtcbiAgICAgICAgdGhpcy5lbmRTaWRlID0gZW5kU2lkZTtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGhlaWdodFJlbGV2YW50KCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrIGRlY29yYXRpb24sIHdoaWNoIGluZmx1ZW5jZXMgdGhlIHN0eWxpbmcgb2YgdGhlXG4gICAgY29udGVudCBpbiBpdHMgcmFuZ2UuIE5lc3RlZCBtYXJrIGRlY29yYXRpb25zIHdpbGwgY2F1c2UgbmVzdGVkXG4gICAgRE9NIGVsZW1lbnRzIHRvIGJlIGNyZWF0ZWQuIE5lc3Rpbmcgb3JkZXIgaXMgZGV0ZXJtaW5lZCBieVxuICAgIHByZWNlZGVuY2Ugb2YgdGhlIFtmYWNldF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeZGVjb3JhdGlvbnMpLCB3aXRoXG4gICAgdGhlIGhpZ2hlci1wcmVjZWRlbmNlIGRlY29yYXRpb25zIGNyZWF0aW5nIHRoZSBpbm5lciBET00gbm9kZXMuXG4gICAgU3VjaCBlbGVtZW50cyBhcmUgc3BsaXQgb24gbGluZSBib3VuZGFyaWVzIGFuZCBvbiB0aGUgYm91bmRhcmllc1xuICAgIG9mIGxvd2VyLXByZWNlZGVuY2UgZGVjb3JhdGlvbnMuXG4gICAgKi9cbiAgICBzdGF0aWMgbWFyayhzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWFya0RlY29yYXRpb24oc3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHdpZGdldCBkZWNvcmF0aW9uLCB3aGljaCBkaXNwbGF5cyBhIERPTSBlbGVtZW50IGF0IHRoZVxuICAgIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgc3RhdGljIHdpZGdldChzcGVjKSB7XG4gICAgICAgIGxldCBzaWRlID0gTWF0aC5tYXgoLTEwMDAwLCBNYXRoLm1pbigxMDAwMCwgc3BlYy5zaWRlIHx8IDApKSwgYmxvY2sgPSAhIXNwZWMuYmxvY2s7XG4gICAgICAgIHNpZGUgKz0gKGJsb2NrICYmICFzcGVjLmlubGluZU9yZGVyKVxuICAgICAgICAgICAgPyAoc2lkZSA+IDAgPyAzMDAwMDAwMDAgLyogU2lkZS5CbG9ja0FmdGVyICovIDogLTQwMDAwMDAwMCAvKiBTaWRlLkJsb2NrQmVmb3JlICovKVxuICAgICAgICAgICAgOiAoc2lkZSA+IDAgPyAxMDAwMDAwMDAgLyogU2lkZS5JbmxpbmVBZnRlciAqLyA6IC0xMDAwMDAwMDAgLyogU2lkZS5JbmxpbmVCZWZvcmUgKi8pO1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50RGVjb3JhdGlvbihzcGVjLCBzaWRlLCBzaWRlLCBibG9jaywgc3BlYy53aWRnZXQgfHwgbnVsbCwgZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSByZXBsYWNlIGRlY29yYXRpb24gd2hpY2ggcmVwbGFjZXMgdGhlIGdpdmVuIHJhbmdlIHdpdGhcbiAgICBhIHdpZGdldCwgb3Igc2ltcGx5IGhpZGVzIGl0LlxuICAgICovXG4gICAgc3RhdGljIHJlcGxhY2Uoc3BlYykge1xuICAgICAgICBsZXQgYmxvY2sgPSAhIXNwZWMuYmxvY2ssIHN0YXJ0U2lkZSwgZW5kU2lkZTtcbiAgICAgICAgaWYgKHNwZWMuaXNCbG9ja0dhcCkge1xuICAgICAgICAgICAgc3RhcnRTaWRlID0gLTUwMDAwMDAwMCAvKiBTaWRlLkdhcFN0YXJ0ICovO1xuICAgICAgICAgICAgZW5kU2lkZSA9IDQwMDAwMDAwMCAvKiBTaWRlLkdhcEVuZCAqLztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCB7IHN0YXJ0LCBlbmQgfSA9IGdldEluY2x1c2l2ZShzcGVjLCBibG9jayk7XG4gICAgICAgICAgICBzdGFydFNpZGUgPSAoc3RhcnQgPyAoYmxvY2sgPyAtMzAwMDAwMDAwIC8qIFNpZGUuQmxvY2tJbmNTdGFydCAqLyA6IC0xIC8qIFNpZGUuSW5saW5lSW5jU3RhcnQgKi8pIDogNTAwMDAwMDAwIC8qIFNpZGUuTm9uSW5jU3RhcnQgKi8pIC0gMTtcbiAgICAgICAgICAgIGVuZFNpZGUgPSAoZW5kID8gKGJsb2NrID8gMjAwMDAwMDAwIC8qIFNpZGUuQmxvY2tJbmNFbmQgKi8gOiAxIC8qIFNpZGUuSW5saW5lSW5jRW5kICovKSA6IC02MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNFbmQgKi8pICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFBvaW50RGVjb3JhdGlvbihzcGVjLCBzdGFydFNpZGUsIGVuZFNpZGUsIGJsb2NrLCBzcGVjLndpZGdldCB8fCBudWxsLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbGluZSBkZWNvcmF0aW9uLCB3aGljaCBjYW4gYWRkIERPTSBhdHRyaWJ1dGVzIHRvIHRoZVxuICAgIGxpbmUgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGxpbmUoc3BlYykge1xuICAgICAgICByZXR1cm4gbmV3IExpbmVEZWNvcmF0aW9uKHNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICBCdWlsZCBhIFtgRGVjb3JhdGlvblNldGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uU2V0KSBmcm9tIHRoZSBnaXZlblxuICAgIGRlY29yYXRlZCByYW5nZSBvciByYW5nZXMuIElmIHRoZSByYW5nZXMgYXJlbid0IGFscmVhZHkgc29ydGVkLFxuICAgIHBhc3MgYHRydWVgIGZvciBgc29ydGAgdG8gbWFrZSB0aGUgbGlicmFyeSBzb3J0IHRoZW0gZm9yIHlvdS5cbiAgICAqL1xuICAgIHN0YXRpYyBzZXQob2YsIHNvcnQgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gUmFuZ2VTZXQub2Yob2YsIHNvcnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGhhc0hlaWdodCgpIHsgcmV0dXJuIHRoaXMud2lkZ2V0ID8gdGhpcy53aWRnZXQuZXN0aW1hdGVkSGVpZ2h0ID4gLTEgOiBmYWxzZTsgfVxufVxuLyoqXG5UaGUgZW1wdHkgc2V0IG9mIGRlY29yYXRpb25zLlxuKi9cbkRlY29yYXRpb24ubm9uZSA9IFJhbmdlU2V0LmVtcHR5O1xuY2xhc3MgTWFya0RlY29yYXRpb24gZXh0ZW5kcyBEZWNvcmF0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIGxldCB7IHN0YXJ0LCBlbmQgfSA9IGdldEluY2x1c2l2ZShzcGVjKTtcbiAgICAgICAgc3VwZXIoc3RhcnQgPyAtMSAvKiBTaWRlLklubGluZUluY1N0YXJ0ICovIDogNTAwMDAwMDAwIC8qIFNpZGUuTm9uSW5jU3RhcnQgKi8sIGVuZCA/IDEgLyogU2lkZS5JbmxpbmVJbmNFbmQgKi8gOiAtNjAwMDAwMDAwIC8qIFNpZGUuTm9uSW5jRW5kICovLCBudWxsLCBzcGVjKTtcbiAgICAgICAgdGhpcy50YWdOYW1lID0gc3BlYy50YWdOYW1lIHx8IFwic3BhblwiO1xuICAgICAgICB0aGlzLmNsYXNzID0gc3BlYy5jbGFzcyB8fCBcIlwiO1xuICAgICAgICB0aGlzLmF0dHJzID0gc3BlYy5hdHRyaWJ1dGVzIHx8IG51bGw7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICBvdGhlciBpbnN0YW5jZW9mIE1hcmtEZWNvcmF0aW9uICYmXG4gICAgICAgICAgICAgICAgdGhpcy50YWdOYW1lID09IG90aGVyLnRhZ05hbWUgJiZcbiAgICAgICAgICAgICAgICAodGhpcy5jbGFzcyB8fCAoKF9hID0gdGhpcy5hdHRycykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsYXNzKSkgPT0gKG90aGVyLmNsYXNzIHx8ICgoX2IgPSBvdGhlci5hdHRycykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNsYXNzKSkgJiZcbiAgICAgICAgICAgICAgICBhdHRyc0VxKHRoaXMuYXR0cnMsIG90aGVyLmF0dHJzLCBcImNsYXNzXCIpO1xuICAgIH1cbiAgICByYW5nZShmcm9tLCB0byA9IGZyb20pIHtcbiAgICAgICAgaWYgKGZyb20gPj0gdG8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk1hcmsgZGVjb3JhdGlvbnMgbWF5IG5vdCBiZSBlbXB0eVwiKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnJhbmdlKGZyb20sIHRvKTtcbiAgICB9XG59XG5NYXJrRGVjb3JhdGlvbi5wcm90b3R5cGUucG9pbnQgPSBmYWxzZTtcbmNsYXNzIExpbmVEZWNvcmF0aW9uIGV4dGVuZHMgRGVjb3JhdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc3BlYykge1xuICAgICAgICBzdXBlcigtMjAwMDAwMDAwIC8qIFNpZGUuTGluZSAqLywgLTIwMDAwMDAwMCAvKiBTaWRlLkxpbmUgKi8sIG51bGwsIHNwZWMpO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBMaW5lRGVjb3JhdGlvbiAmJlxuICAgICAgICAgICAgdGhpcy5zcGVjLmNsYXNzID09IG90aGVyLnNwZWMuY2xhc3MgJiZcbiAgICAgICAgICAgIGF0dHJzRXEodGhpcy5zcGVjLmF0dHJpYnV0ZXMsIG90aGVyLnNwZWMuYXR0cmlidXRlcyk7XG4gICAgfVxuICAgIHJhbmdlKGZyb20sIHRvID0gZnJvbSkge1xuICAgICAgICBpZiAodG8gIT0gZnJvbSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTGluZSBkZWNvcmF0aW9uIHJhbmdlcyBtdXN0IGJlIHplcm8tbGVuZ3RoXCIpO1xuICAgICAgICByZXR1cm4gc3VwZXIucmFuZ2UoZnJvbSwgdG8pO1xuICAgIH1cbn1cbkxpbmVEZWNvcmF0aW9uLnByb3RvdHlwZS5tYXBNb2RlID0gTWFwTW9kZS5UcmFja0JlZm9yZTtcbkxpbmVEZWNvcmF0aW9uLnByb3RvdHlwZS5wb2ludCA9IHRydWU7XG5jbGFzcyBQb2ludERlY29yYXRpb24gZXh0ZW5kcyBEZWNvcmF0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzcGVjLCBzdGFydFNpZGUsIGVuZFNpZGUsIGJsb2NrLCB3aWRnZXQsIGlzUmVwbGFjZSkge1xuICAgICAgICBzdXBlcihzdGFydFNpZGUsIGVuZFNpZGUsIHdpZGdldCwgc3BlYyk7XG4gICAgICAgIHRoaXMuYmxvY2sgPSBibG9jaztcbiAgICAgICAgdGhpcy5pc1JlcGxhY2UgPSBpc1JlcGxhY2U7XG4gICAgICAgIHRoaXMubWFwTW9kZSA9ICFibG9jayA/IE1hcE1vZGUuVHJhY2tEZWwgOiBzdGFydFNpZGUgPD0gMCA/IE1hcE1vZGUuVHJhY2tCZWZvcmUgOiBNYXBNb2RlLlRyYWNrQWZ0ZXI7XG4gICAgfVxuICAgIC8vIE9ubHkgcmVsZXZhbnQgd2hlbiB0aGlzLmJsb2NrID09IHRydWVcbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRTaWRlICE9IHRoaXMuZW5kU2lkZSA/IEJsb2NrVHlwZS5XaWRnZXRSYW5nZVxuICAgICAgICAgICAgOiB0aGlzLnN0YXJ0U2lkZSA8PSAwID8gQmxvY2tUeXBlLldpZGdldEJlZm9yZSA6IEJsb2NrVHlwZS5XaWRnZXRBZnRlcjtcbiAgICB9XG4gICAgZ2V0IGhlaWdodFJlbGV2YW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ibG9jayB8fCAhIXRoaXMud2lkZ2V0ICYmICh0aGlzLndpZGdldC5lc3RpbWF0ZWRIZWlnaHQgPj0gNSB8fCB0aGlzLndpZGdldC5saW5lQnJlYWtzID4gMCk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbiAmJlxuICAgICAgICAgICAgd2lkZ2V0c0VxKHRoaXMud2lkZ2V0LCBvdGhlci53aWRnZXQpICYmXG4gICAgICAgICAgICB0aGlzLmJsb2NrID09IG90aGVyLmJsb2NrICYmXG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2lkZSA9PSBvdGhlci5zdGFydFNpZGUgJiYgdGhpcy5lbmRTaWRlID09IG90aGVyLmVuZFNpZGU7XG4gICAgfVxuICAgIHJhbmdlKGZyb20sIHRvID0gZnJvbSkge1xuICAgICAgICBpZiAodGhpcy5pc1JlcGxhY2UgJiYgKGZyb20gPiB0byB8fCAoZnJvbSA9PSB0byAmJiB0aGlzLnN0YXJ0U2lkZSA+IDAgJiYgdGhpcy5lbmRTaWRlIDw9IDApKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCByYW5nZSBmb3IgcmVwbGFjZW1lbnQgZGVjb3JhdGlvblwiKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzUmVwbGFjZSAmJiB0byAhPSBmcm9tKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJXaWRnZXQgZGVjb3JhdGlvbnMgY2FuIG9ubHkgaGF2ZSB6ZXJvLWxlbmd0aCByYW5nZXNcIik7XG4gICAgICAgIHJldHVybiBzdXBlci5yYW5nZShmcm9tLCB0byk7XG4gICAgfVxufVxuUG9pbnREZWNvcmF0aW9uLnByb3RvdHlwZS5wb2ludCA9IHRydWU7XG5mdW5jdGlvbiBnZXRJbmNsdXNpdmUoc3BlYywgYmxvY2sgPSBmYWxzZSkge1xuICAgIGxldCB7IGluY2x1c2l2ZVN0YXJ0OiBzdGFydCwgaW5jbHVzaXZlRW5kOiBlbmQgfSA9IHNwZWM7XG4gICAgaWYgKHN0YXJ0ID09IG51bGwpXG4gICAgICAgIHN0YXJ0ID0gc3BlYy5pbmNsdXNpdmU7XG4gICAgaWYgKGVuZCA9PSBudWxsKVxuICAgICAgICBlbmQgPSBzcGVjLmluY2x1c2l2ZTtcbiAgICByZXR1cm4geyBzdGFydDogc3RhcnQgIT09IG51bGwgJiYgc3RhcnQgIT09IHZvaWQgMCA/IHN0YXJ0IDogYmxvY2ssIGVuZDogZW5kICE9PSBudWxsICYmIGVuZCAhPT0gdm9pZCAwID8gZW5kIDogYmxvY2sgfTtcbn1cbmZ1bmN0aW9uIHdpZGdldHNFcShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPT0gYiB8fCAhIShhICYmIGIgJiYgYS5jb21wYXJlKGIpKTtcbn1cbmZ1bmN0aW9uIGFkZFJhbmdlKGZyb20sIHRvLCByYW5nZXMsIG1hcmdpbiA9IDApIHtcbiAgICBsZXQgbGFzdCA9IHJhbmdlcy5sZW5ndGggLSAxO1xuICAgIGlmIChsYXN0ID49IDAgJiYgcmFuZ2VzW2xhc3RdICsgbWFyZ2luID49IGZyb20pXG4gICAgICAgIHJhbmdlc1tsYXN0XSA9IE1hdGgubWF4KHJhbmdlc1tsYXN0XSwgdG8pO1xuICAgIGVsc2VcbiAgICAgICAgcmFuZ2VzLnB1c2goZnJvbSwgdG8pO1xufVxuXG5jbGFzcyBDb250ZW50QnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoZG9jLCBwb3MsIGVuZCwgZGlzYWxsb3dCbG9ja0VmZmVjdHNGb3IpIHtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmVuZCA9IGVuZDtcbiAgICAgICAgdGhpcy5kaXNhbGxvd0Jsb2NrRWZmZWN0c0ZvciA9IGRpc2FsbG93QmxvY2tFZmZlY3RzRm9yO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJMaW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy5icmVha0F0U3RhcnQgPSAwO1xuICAgICAgICB0aGlzLnBlbmRpbmdCdWZmZXIgPSAwIC8qIEJ1Zi5ObyAqLztcbiAgICAgICAgdGhpcy5idWZmZXJNYXJrcyA9IFtdO1xuICAgICAgICAvLyBTZXQgdG8gZmFsc2UgZGlyZWN0bHkgYWZ0ZXIgYSB3aWRnZXQgdGhhdCBjb3ZlcnMgdGhlIHBvc2l0aW9uIGFmdGVyIGl0XG4gICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICB0aGlzLm9wZW5TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLm9wZW5FbmQgPSAtMTtcbiAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy50ZXh0T2ZmID0gMDtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBkb2MuaXRlcigpO1xuICAgICAgICB0aGlzLnNraXAgPSBwb3M7XG4gICAgfVxuICAgIHBvc0NvdmVyZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuYnJlYWtBdFN0YXJ0ICYmIHRoaXMuZG9jLmxpbmVBdCh0aGlzLnBvcykuZnJvbSAhPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdO1xuICAgICAgICByZXR1cm4gIShsYXN0LmJyZWFrQWZ0ZXIgfHwgbGFzdCBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldyAmJiBsYXN0LmRlY28uZW5kU2lkZSA8IDApO1xuICAgIH1cbiAgICBnZXRMaW5lKCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VyTGluZSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50LnB1c2godGhpcy5jdXJMaW5lID0gbmV3IExpbmVWaWV3KTtcbiAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmN1ckxpbmU7XG4gICAgfVxuICAgIGZsdXNoQnVmZmVyKGFjdGl2ZSA9IHRoaXMuYnVmZmVyTWFya3MpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5jdXJMaW5lLmFwcGVuZCh3cmFwTWFya3MobmV3IFdpZGdldEJ1ZmZlclZpZXcoLTEpLCBhY3RpdmUpLCBhY3RpdmUubGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZEJsb2NrV2lkZ2V0KHZpZXcpIHtcbiAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmN1ckxpbmUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbnRlbnQucHVzaCh2aWV3KTtcbiAgICB9XG4gICAgZmluaXNoKG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlciAmJiBvcGVuRW5kIDw9IHRoaXMuYnVmZmVyTWFya3MubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcigpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdCdWZmZXIgPSAwIC8qIEJ1Zi5ObyAqLztcbiAgICAgICAgaWYgKCF0aGlzLnBvc0NvdmVyZWQoKSAmJlxuICAgICAgICAgICAgIShvcGVuRW5kICYmIHRoaXMuY29udGVudC5sZW5ndGggJiYgdGhpcy5jb250ZW50W3RoaXMuY29udGVudC5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldykpXG4gICAgICAgICAgICB0aGlzLmdldExpbmUoKTtcbiAgICB9XG4gICAgYnVpbGRUZXh0KGxlbmd0aCwgYWN0aXZlLCBvcGVuU3RhcnQpIHtcbiAgICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRleHRPZmYgPT0gdGhpcy50ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCB7IHZhbHVlLCBsaW5lQnJlYWssIGRvbmUgfSA9IHRoaXMuY3Vyc29yLm5leHQodGhpcy5za2lwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNraXAgPSAwO1xuICAgICAgICAgICAgICAgIGlmIChkb25lKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSYW4gb3V0IG9mIHRleHQgY29udGVudCB3aGVuIGRyYXdpbmcgaW5saW5lIHZpZXdzXCIpO1xuICAgICAgICAgICAgICAgIGlmIChsaW5lQnJlYWspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBvc0NvdmVyZWQoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0uYnJlYWtBZnRlciA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJlYWtBdFN0YXJ0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1ckxpbmUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0Q3Vyc29yUG9zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLS07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dE9mZiA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRha2UgPSBNYXRoLm1pbih0aGlzLnRleHQubGVuZ3RoIC0gdGhpcy50ZXh0T2ZmLCBsZW5ndGgsIDUxMiAvKiBULkNodW5rICovKTtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hCdWZmZXIoYWN0aXZlLnNsaWNlKGFjdGl2ZS5sZW5ndGggLSBvcGVuU3RhcnQpKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpLmFwcGVuZCh3cmFwTWFya3MobmV3IFRleHRWaWV3KHRoaXMudGV4dC5zbGljZSh0aGlzLnRleHRPZmYsIHRoaXMudGV4dE9mZiArIHRha2UpKSwgYWN0aXZlKSwgb3BlblN0YXJ0KTtcbiAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50ZXh0T2ZmICs9IHRha2U7XG4gICAgICAgICAgICBsZW5ndGggLT0gdGFrZTtcbiAgICAgICAgICAgIG9wZW5TdGFydCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3Bhbihmcm9tLCB0bywgYWN0aXZlLCBvcGVuU3RhcnQpIHtcbiAgICAgICAgdGhpcy5idWlsZFRleHQodG8gLSBmcm9tLCBhY3RpdmUsIG9wZW5TdGFydCk7XG4gICAgICAgIHRoaXMucG9zID0gdG87XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdGFydCA8IDApXG4gICAgICAgICAgICB0aGlzLm9wZW5TdGFydCA9IG9wZW5TdGFydDtcbiAgICB9XG4gICAgcG9pbnQoZnJvbSwgdG8sIGRlY28sIGFjdGl2ZSwgb3BlblN0YXJ0LCBpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhbGxvd0Jsb2NrRWZmZWN0c0ZvcltpbmRleF0gJiYgZGVjbyBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbikge1xuICAgICAgICAgICAgaWYgKGRlY28uYmxvY2spXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCbG9jayBkZWNvcmF0aW9ucyBtYXkgbm90IGJlIHNwZWNpZmllZCB2aWEgcGx1Z2luc1wiKTtcbiAgICAgICAgICAgIGlmICh0byA+IHRoaXMuZG9jLmxpbmVBdCh0aGlzLnBvcykudG8pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEZWNvcmF0aW9ucyB0aGF0IHJlcGxhY2UgbGluZSBicmVha3MgbWF5IG5vdCBiZSBzcGVjaWZpZWQgdmlhIHBsdWdpbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxlbiA9IHRvIC0gZnJvbTtcbiAgICAgICAgaWYgKGRlY28gaW5zdGFuY2VvZiBQb2ludERlY29yYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChkZWNvLmJsb2NrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlY28uc3RhcnRTaWRlID4gMCAmJiAhdGhpcy5wb3NDb3ZlcmVkKCkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQmxvY2tXaWRnZXQobmV3IEJsb2NrV2lkZ2V0VmlldyhkZWNvLndpZGdldCB8fCBuZXcgTnVsbFdpZGdldChcImRpdlwiKSwgbGVuLCBkZWNvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdmlldyA9IFdpZGdldFZpZXcuY3JlYXRlKGRlY28ud2lkZ2V0IHx8IG5ldyBOdWxsV2lkZ2V0KFwic3BhblwiKSwgbGVuLCBsZW4gPyAwIDogZGVjby5zdGFydFNpZGUpO1xuICAgICAgICAgICAgICAgIGxldCBjdXJzb3JCZWZvcmUgPSB0aGlzLmF0Q3Vyc29yUG9zICYmICF2aWV3LmlzRWRpdGFibGUgJiYgb3BlblN0YXJ0IDw9IGFjdGl2ZS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgKGZyb20gPCB0byB8fCBkZWNvLnN0YXJ0U2lkZSA+IDApO1xuICAgICAgICAgICAgICAgIGxldCBjdXJzb3JBZnRlciA9ICF2aWV3LmlzRWRpdGFibGUgJiYgKGZyb20gPCB0byB8fCBvcGVuU3RhcnQgPiBhY3RpdmUubGVuZ3RoIHx8IGRlY28uc3RhcnRTaWRlIDw9IDApO1xuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlciA9PSAyIC8qIEJ1Zi5JZkN1cnNvciAqLyAmJiAhY3Vyc29yQmVmb3JlICYmICF2aWV3LmlzRWRpdGFibGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hCdWZmZXIoYWN0aXZlKTtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yQmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKHdyYXBNYXJrcyhuZXcgV2lkZ2V0QnVmZmVyVmlldygxKSwgYWN0aXZlKSwgb3BlblN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgb3BlblN0YXJ0ID0gYWN0aXZlLmxlbmd0aCArIE1hdGgubWF4KDAsIG9wZW5TdGFydCAtIGFjdGl2ZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCh3cmFwTWFya3ModmlldywgYWN0aXZlKSwgb3BlblN0YXJ0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0Q3Vyc29yUG9zID0gY3Vyc29yQWZ0ZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQnVmZmVyID0gIWN1cnNvckFmdGVyID8gMCAvKiBCdWYuTm8gKi8gOiBmcm9tIDwgdG8gfHwgb3BlblN0YXJ0ID4gYWN0aXZlLmxlbmd0aCA/IDEgLyogQnVmLlllcyAqLyA6IDIgLyogQnVmLklmQ3Vyc29yICovO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdCdWZmZXIpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyTWFya3MgPSBhY3RpdmUuc2xpY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmRvYy5saW5lQXQodGhpcy5wb3MpLmZyb20gPT0gdGhpcy5wb3MpIHsgLy8gTGluZSBkZWNvcmF0aW9uXG4gICAgICAgICAgICB0aGlzLmdldExpbmUoKS5hZGRMaW5lRGVjbyhkZWNvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAvLyBBZHZhbmNlIHRoZSBpdGVyYXRvciBwYXN0IHRoZSByZXBsYWNlZCBjb250ZW50XG4gICAgICAgICAgICBpZiAodGhpcy50ZXh0T2ZmICsgbGVuIDw9IHRoaXMudGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPZmYgKz0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lwICs9IGxlbiAtICh0aGlzLnRleHQubGVuZ3RoIC0gdGhpcy50ZXh0T2ZmKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9mZiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvcyA9IHRvO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdGFydCA8IDApXG4gICAgICAgICAgICB0aGlzLm9wZW5TdGFydCA9IG9wZW5TdGFydDtcbiAgICB9XG4gICAgc3RhdGljIGJ1aWxkKHRleHQsIGZyb20sIHRvLCBkZWNvcmF0aW9ucywgZHluYW1pY0RlY29yYXRpb25NYXApIHtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgQ29udGVudEJ1aWxkZXIodGV4dCwgZnJvbSwgdG8sIGR5bmFtaWNEZWNvcmF0aW9uTWFwKTtcbiAgICAgICAgYnVpbGRlci5vcGVuRW5kID0gUmFuZ2VTZXQuc3BhbnMoZGVjb3JhdGlvbnMsIGZyb20sIHRvLCBidWlsZGVyKTtcbiAgICAgICAgaWYgKGJ1aWxkZXIub3BlblN0YXJ0IDwgMClcbiAgICAgICAgICAgIGJ1aWxkZXIub3BlblN0YXJ0ID0gYnVpbGRlci5vcGVuRW5kO1xuICAgICAgICBidWlsZGVyLmZpbmlzaChidWlsZGVyLm9wZW5FbmQpO1xuICAgICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9XG59XG5mdW5jdGlvbiB3cmFwTWFya3ModmlldywgYWN0aXZlKSB7XG4gICAgZm9yIChsZXQgbWFyayBvZiBhY3RpdmUpXG4gICAgICAgIHZpZXcgPSBuZXcgTWFya1ZpZXcobWFyaywgW3ZpZXddLCB2aWV3Lmxlbmd0aCk7XG4gICAgcmV0dXJuIHZpZXc7XG59XG5jbGFzcyBOdWxsV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IodGFnKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIudGFnID09IHRoaXMudGFnOyB9XG4gICAgdG9ET00oKSB7IHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMudGFnKTsgfVxuICAgIHVwZGF0ZURPTShlbHQpIHsgcmV0dXJuIGVsdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IHRoaXMudGFnOyB9XG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gdHJ1ZTsgfVxufVxuXG4vKipcblVzZWQgdG8gaW5kaWNhdGUgW3RleHQgZGlyZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy50ZXh0RGlyZWN0aW9uKS5cbiovXG52YXIgRGlyZWN0aW9uID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoRGlyZWN0aW9uKSB7XG4gICAgLy8gKFRoZXNlIGFyZSBjaG9zZW4gdG8gbWF0Y2ggdGhlIGJhc2UgbGV2ZWxzLCBpbiBiaWRpIGFsZ29yaXRobVxuICAgIC8vIHRlcm1zLCBvZiBzcGFucyBpbiB0aGF0IGRpcmVjdGlvbi4pXG4gICAgLyoqXG4gICAgTGVmdC10by1yaWdodC5cbiAgICAqL1xuICAgIERpcmVjdGlvbltEaXJlY3Rpb25bXCJMVFJcIl0gPSAwXSA9IFwiTFRSXCI7XG4gICAgLyoqXG4gICAgUmlnaHQtdG8tbGVmdC5cbiAgICAqL1xuICAgIERpcmVjdGlvbltEaXJlY3Rpb25bXCJSVExcIl0gPSAxXSA9IFwiUlRMXCI7XG5yZXR1cm4gRGlyZWN0aW9ufSkoRGlyZWN0aW9uIHx8IChEaXJlY3Rpb24gPSB7fSkpO1xuY29uc3QgTFRSID0gRGlyZWN0aW9uLkxUUiwgUlRMID0gRGlyZWN0aW9uLlJUTDtcbi8vIERlY29kZSBhIHN0cmluZyB3aXRoIGVhY2ggdHlwZSBlbmNvZGVkIGFzIGxvZzIodHlwZSlcbmZ1bmN0aW9uIGRlYyhzdHIpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspXG4gICAgICAgIHJlc3VsdC5wdXNoKDEgPDwgK3N0cltpXSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIENoYXJhY3RlciB0eXBlcyBmb3IgY29kZXBvaW50cyAwIHRvIDB4ZjhcbmNvbnN0IExvd1R5cGVzID0gLypAX19QVVJFX18qL2RlYyhcIjg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4NjY2ODg4ODg4Nzg3ODMzMzMzMzMzMzM3ODg4ODg4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4ODg4ODgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg3ODY2NjY4ODg4MDg4ODg4NjYzMzgwODg4MzA4ODg4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4XCIpO1xuLy8gQ2hhcmFjdGVyIHR5cGVzIGZvciBjb2RlcG9pbnRzIDB4NjAwIHRvIDB4NmY5XG5jb25zdCBBcmFiaWNUeXBlcyA9IC8qQF9fUFVSRV9fKi9kZWMoXCI0NDQ0NDQ4ODI2NjI3Mjg4OTk5OTk5OTk5OTkyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI5OTk5OTk5OTk5OTk5OTk5OTk5OTk0NDQ0NDQ0NDQ0NjQ0MjIyODIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyOTk5OTk5OTQ5OTk5OTk5MjI5OTg5OTk5MjIzMzMzMzMzMzMzXCIpO1xuY29uc3QgQnJhY2tldHMgPSAvKkBfX1BVUkVfXyovT2JqZWN0LmNyZWF0ZShudWxsKSwgQnJhY2tldFN0YWNrID0gW107XG4vLyBUaGVyZSdzIGEgbG90IG1vcmUgaW5cbi8vIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9VQ0QvbGF0ZXN0L3VjZC9CaWRpQnJhY2tldHMudHh0LFxuLy8gd2hpY2ggYXJlIGxlZnQgb3V0IHRvIGtlZXAgY29kZSBzaXplIGRvd24uXG5mb3IgKGxldCBwIG9mIFtcIigpXCIsIFwiW11cIiwgXCJ7fVwiXSkge1xuICAgIGxldCBsID0gLypAX19QVVJFX18qL3AuY2hhckNvZGVBdCgwKSwgciA9IC8qQF9fUFVSRV9fKi9wLmNoYXJDb2RlQXQoMSk7XG4gICAgQnJhY2tldHNbbF0gPSByO1xuICAgIEJyYWNrZXRzW3JdID0gLWw7XG59XG5mdW5jdGlvbiBjaGFyVHlwZShjaCkge1xuICAgIHJldHVybiBjaCA8PSAweGY3ID8gTG93VHlwZXNbY2hdIDpcbiAgICAgICAgMHg1OTAgPD0gY2ggJiYgY2ggPD0gMHg1ZjQgPyAyIC8qIFQuUiAqLyA6XG4gICAgICAgICAgICAweDYwMCA8PSBjaCAmJiBjaCA8PSAweDZmOSA/IEFyYWJpY1R5cGVzW2NoIC0gMHg2MDBdIDpcbiAgICAgICAgICAgICAgICAweDZlZSA8PSBjaCAmJiBjaCA8PSAweDhhYyA/IDQgLyogVC5BTCAqLyA6XG4gICAgICAgICAgICAgICAgICAgIDB4MjAwMCA8PSBjaCAmJiBjaCA8PSAweDIwMGMgPyAyNTYgLyogVC5OSSAqLyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAweGZiNTAgPD0gY2ggJiYgY2ggPD0gMHhmZGZmID8gNCAvKiBULkFMICovIDogMSAvKiBULkwgKi87XG59XG5jb25zdCBCaWRpUkUgPSAvW1xcdTA1OTAtXFx1MDVmNFxcdTA2MDAtXFx1MDZmZlxcdTA3MDAtXFx1MDhhY1xcdWZiNTAtXFx1ZmRmZl0vO1xuLyoqXG5SZXByZXNlbnRzIGEgY29udGlndW91cyByYW5nZSBvZiB0ZXh0IHRoYXQgaGFzIGEgc2luZ2xlIGRpcmVjdGlvblxuKGFzIGluIGxlZnQtdG8tcmlnaHQgb3IgcmlnaHQtdG8tbGVmdCkuXG4qL1xuY2xhc3MgQmlkaVNwYW4ge1xuICAgIC8qKlxuICAgIFRoZSBkaXJlY3Rpb24gb2YgdGhpcyBzcGFuLlxuICAgICovXG4gICAgZ2V0IGRpcigpIHsgcmV0dXJuIHRoaXMubGV2ZWwgJSAyID8gUlRMIDogTFRSOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgb2YgdGhlIHNwYW4gKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZSkuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHRoZSBzcGFuLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSBbXCJiaWRpXG4gICAgbGV2ZWxcIl0oaHR0cHM6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyOS8jQmFzaWNfRGlzcGxheV9BbGdvcml0aG0pXG4gICAgb2YgdGhlIHNwYW4gKGluIHRoaXMgY29udGV4dCwgMCBtZWFuc1xuICAgIGxlZnQtdG8tcmlnaHQsIDEgbWVhbnMgcmlnaHQtdG8tbGVmdCwgMiBtZWFucyBsZWZ0LXRvLXJpZ2h0XG4gICAgbnVtYmVyIGluc2lkZSByaWdodC10by1sZWZ0IHRleHQpLlxuICAgICovXG4gICAgbGV2ZWwpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2lkZShlbmQsIGRpcikgeyByZXR1cm4gKHRoaXMuZGlyID09IGRpcikgPT0gZW5kID8gdGhpcy50byA6IHRoaXMuZnJvbTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZm9yd2FyZChmb3J3YXJkLCBkaXIpIHsgcmV0dXJuIGZvcndhcmQgPT0gKHRoaXMuZGlyID09IGRpcik7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmaW5kKG9yZGVyLCBpbmRleCwgbGV2ZWwsIGFzc29jKSB7XG4gICAgICAgIGxldCBtYXliZSA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3BhbiA9IG9yZGVyW2ldO1xuICAgICAgICAgICAgaWYgKHNwYW4uZnJvbSA8PSBpbmRleCAmJiBzcGFuLnRvID49IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwYW4ubGV2ZWwgPT0gbGV2ZWwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gbXVsdGlwbGUgc3BhbnMgbWF0Y2gsIGlmIGFzc29jICE9IDAsIHRha2UgdGhlIG9uZSB0aGF0XG4gICAgICAgICAgICAgICAgLy8gY292ZXJzIHRoYXQgc2lkZSwgb3RoZXJ3aXNlIHRha2UgdGhlIG9uZSB3aXRoIHRoZSBtaW5pbXVtXG4gICAgICAgICAgICAgICAgLy8gbGV2ZWwuXG4gICAgICAgICAgICAgICAgaWYgKG1heWJlIDwgMCB8fCAoYXNzb2MgIT0gMCA/IChhc3NvYyA8IDAgPyBzcGFuLmZyb20gPCBpbmRleCA6IHNwYW4udG8gPiBpbmRleCkgOiBvcmRlclttYXliZV0ubGV2ZWwgPiBzcGFuLmxldmVsKSlcbiAgICAgICAgICAgICAgICAgICAgbWF5YmUgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZSA8IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIG1heWJlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzb2xhdGVzRXEoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgaUEgPSBhW2ldLCBpQiA9IGJbaV07XG4gICAgICAgIGlmIChpQS5mcm9tICE9IGlCLmZyb20gfHwgaUEudG8gIT0gaUIudG8gfHwgaUEuZGlyZWN0aW9uICE9IGlCLmRpcmVjdGlvbiB8fCAhaXNvbGF0ZXNFcShpQS5pbm5lciwgaUIuaW5uZXIpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFJldXNlZCBhcnJheSBvZiBjaGFyYWN0ZXIgdHlwZXNcbmNvbnN0IHR5cGVzID0gW107XG4vLyBGaWxsIGluIHRoZSBjaGFyYWN0ZXIgdHlwZXMgKGluIGB0eXBlc2ApIGZyb20gYGZyb21gIHRvIGB0b2AgYW5kXG4vLyBhcHBseSBXIG5vcm1hbGl6YXRpb24gcnVsZXMuXG5mdW5jdGlvbiBjb21wdXRlQ2hhclR5cGVzKGxpbmUsIHJGcm9tLCByVG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpIHtcbiAgICBmb3IgKGxldCBpSSA9IDA7IGlJIDw9IGlzb2xhdGVzLmxlbmd0aDsgaUkrKykge1xuICAgICAgICBsZXQgZnJvbSA9IGlJID8gaXNvbGF0ZXNbaUkgLSAxXS50byA6IHJGcm9tLCB0byA9IGlJIDwgaXNvbGF0ZXMubGVuZ3RoID8gaXNvbGF0ZXNbaUldLmZyb20gOiByVG87XG4gICAgICAgIGxldCBwcmV2VHlwZSA9IGlJID8gMjU2IC8qIFQuTkkgKi8gOiBvdXRlclR5cGU7XG4gICAgICAgIC8vIFcxLiBFeGFtaW5lIGVhY2ggbm9uLXNwYWNpbmcgbWFyayAoTlNNKSBpbiB0aGUgbGV2ZWwgcnVuLCBhbmRcbiAgICAgICAgLy8gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBOU00gdG8gdGhlIHR5cGUgb2YgdGhlIHByZXZpb3VzXG4gICAgICAgIC8vIGNoYXJhY3Rlci4gSWYgdGhlIE5TTSBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxldmVsIHJ1biwgaXQgd2lsbFxuICAgICAgICAvLyBnZXQgdGhlIHR5cGUgb2Ygc29yLlxuICAgICAgICAvLyBXMi4gU2VhcmNoIGJhY2t3YXJkcyBmcm9tIGVhY2ggaW5zdGFuY2Ugb2YgYSBFdXJvcGVhbiBudW1iZXJcbiAgICAgICAgLy8gdW50aWwgdGhlIGZpcnN0IHN0cm9uZyB0eXBlIChSLCBMLCBBTCwgb3Igc29yKSBpcyBmb3VuZC4gSWYgYW5cbiAgICAgICAgLy8gQUwgaXMgZm91bmQsIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgRXVyb3BlYW4gbnVtYmVyIHRvIEFyYWJpY1xuICAgICAgICAvLyBudW1iZXIuXG4gICAgICAgIC8vIFczLiBDaGFuZ2UgYWxsIEFMcyB0byBSLlxuICAgICAgICAvLyAoTGVmdCBhZnRlciB0aGlzOiBMLCBSLCBFTiwgQU4sIEVULCBDUywgTkkpXG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tLCBwcmV2ID0gcHJldlR5cGUsIHByZXZTdHJvbmcgPSBwcmV2VHlwZTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gY2hhclR5cGUobGluZS5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09IDUxMiAvKiBULk5TTSAqLylcbiAgICAgICAgICAgICAgICB0eXBlID0gcHJldjtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gOCAvKiBULkVOICovICYmIHByZXZTdHJvbmcgPT0gNCAvKiBULkFMICovKVxuICAgICAgICAgICAgICAgIHR5cGUgPSAxNiAvKiBULkFOICovO1xuICAgICAgICAgICAgdHlwZXNbaV0gPSB0eXBlID09IDQgLyogVC5BTCAqLyA/IDIgLyogVC5SICovIDogdHlwZTtcbiAgICAgICAgICAgIGlmICh0eXBlICYgNyAvKiBULlN0cm9uZyAqLylcbiAgICAgICAgICAgICAgICBwcmV2U3Ryb25nID0gdHlwZTtcbiAgICAgICAgICAgIHByZXYgPSB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFc1LiBBIHNlcXVlbmNlIG9mIEV1cm9wZWFuIHRlcm1pbmF0b3JzIGFkamFjZW50IHRvIEV1cm9wZWFuXG4gICAgICAgIC8vIG51bWJlcnMgY2hhbmdlcyB0byBhbGwgRXVyb3BlYW4gbnVtYmVycy5cbiAgICAgICAgLy8gVzYuIE90aGVyd2lzZSwgc2VwYXJhdG9ycyBhbmQgdGVybWluYXRvcnMgY2hhbmdlIHRvIE90aGVyXG4gICAgICAgIC8vIE5ldXRyYWwuXG4gICAgICAgIC8vIFc3LiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlclxuICAgICAgICAvLyB1bnRpbCB0aGUgZmlyc3Qgc3Ryb25nIHR5cGUgKFIsIEwsIG9yIHNvcikgaXMgZm91bmQuIElmIGFuIEwgaXNcbiAgICAgICAgLy8gZm91bmQsIHRoZW4gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gTC5cbiAgICAgICAgLy8gKExlZnQgYWZ0ZXIgdGhpczogTCwgUiwgRU4rQU4sIE5JKVxuICAgICAgICBmb3IgKGxldCBpID0gZnJvbSwgcHJldiA9IHByZXZUeXBlLCBwcmV2U3Ryb25nID0gcHJldlR5cGU7IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHR5cGVzW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gMTI4IC8qIFQuQ1MgKi8pIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IHRvIC0gMSAmJiBwcmV2ID09IHR5cGVzW2kgKyAxXSAmJiAocHJldiAmIDI0IC8qIFQuTnVtICovKSlcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHR5cGVzW2ldID0gcHJldjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHR5cGVzW2ldID0gMjU2IC8qIFQuTkkgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IDY0IC8qIFQuRVQgKi8pIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kID0gaSArIDE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGVuZCA8IHRvICYmIHR5cGVzW2VuZF0gPT0gNjQgLyogVC5FVCAqLylcbiAgICAgICAgICAgICAgICAgICAgZW5kKys7XG4gICAgICAgICAgICAgICAgbGV0IHJlcGxhY2UgPSAoaSAmJiBwcmV2ID09IDggLyogVC5FTiAqLykgfHwgKGVuZCA8IHJUbyAmJiB0eXBlc1tlbmRdID09IDggLyogVC5FTiAqLykgPyAocHJldlN0cm9uZyA9PSAxIC8qIFQuTCAqLyA/IDEgLyogVC5MICovIDogOCAvKiBULkVOICovKSA6IDI1NiAvKiBULk5JICovO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgZW5kOyBqKyspXG4gICAgICAgICAgICAgICAgICAgIHR5cGVzW2pdID0gcmVwbGFjZTtcbiAgICAgICAgICAgICAgICBpID0gZW5kIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gOCAvKiBULkVOICovICYmIHByZXZTdHJvbmcgPT0gMSAvKiBULkwgKi8pIHtcbiAgICAgICAgICAgICAgICB0eXBlc1tpXSA9IDEgLyogVC5MICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldiA9IHR5cGU7XG4gICAgICAgICAgICBpZiAodHlwZSAmIDcgLyogVC5TdHJvbmcgKi8pXG4gICAgICAgICAgICAgICAgcHJldlN0cm9uZyA9IHR5cGU7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBQcm9jZXNzIGJyYWNrZXRzIHRocm91Z2hvdXQgYSBydW4gc2VxdWVuY2UuXG5mdW5jdGlvbiBwcm9jZXNzQnJhY2tldFBhaXJzKGxpbmUsIHJGcm9tLCByVG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpIHtcbiAgICBsZXQgb3Bwb3NpdGVUeXBlID0gb3V0ZXJUeXBlID09IDEgLyogVC5MICovID8gMiAvKiBULlIgKi8gOiAxIC8qIFQuTCAqLztcbiAgICBmb3IgKGxldCBpSSA9IDAsIHNJID0gMCwgY29udGV4dCA9IDA7IGlJIDw9IGlzb2xhdGVzLmxlbmd0aDsgaUkrKykge1xuICAgICAgICBsZXQgZnJvbSA9IGlJID8gaXNvbGF0ZXNbaUkgLSAxXS50byA6IHJGcm9tLCB0byA9IGlJIDwgaXNvbGF0ZXMubGVuZ3RoID8gaXNvbGF0ZXNbaUldLmZyb20gOiByVG87XG4gICAgICAgIC8vIE4wLiBQcm9jZXNzIGJyYWNrZXQgcGFpcnMgaW4gYW4gaXNvbGF0aW5nIHJ1biBzZXF1ZW5jZVxuICAgICAgICAvLyBzZXF1ZW50aWFsbHkgaW4gdGhlIGxvZ2ljYWwgb3JkZXIgb2YgdGhlIHRleHQgcG9zaXRpb25zIG9mIHRoZVxuICAgICAgICAvLyBvcGVuaW5nIHBhaXJlZCBicmFja2V0cyB1c2luZyB0aGUgbG9naWMgZ2l2ZW4gYmVsb3cuIFdpdGhpbiB0aGlzXG4gICAgICAgIC8vIHNjb3BlLCBiaWRpcmVjdGlvbmFsIHR5cGVzIEVOIGFuZCBBTiBhcmUgdHJlYXRlZCBhcyBSLlxuICAgICAgICBmb3IgKGxldCBpID0gZnJvbSwgY2gsIGJyLCB0eXBlOyBpIDwgdG87IGkrKykge1xuICAgICAgICAgICAgLy8gS2VlcHMgW3N0YXJ0SW5kZXgsIHR5cGUsIHN0cm9uZ1NlZW5dIHRyaXBsZXMgZm9yIGVhY2ggb3BlblxuICAgICAgICAgICAgLy8gYnJhY2tldCBvbiBCcmFja2V0U3RhY2suXG4gICAgICAgICAgICBpZiAoYnIgPSBCcmFja2V0c1tjaCA9IGxpbmUuY2hhckNvZGVBdChpKV0pIHtcbiAgICAgICAgICAgICAgICBpZiAoYnIgPCAwKSB7IC8vIENsb3NpbmcgYnJhY2tldFxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzSiA9IHNJIC0gMzsgc0ogPj0gMDsgc0ogLT0gMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJyYWNrZXRTdGFja1tzSiArIDFdID09IC1icikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmbGFncyA9IEJyYWNrZXRTdGFja1tzSiArIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gKGZsYWdzICYgMiAvKiBCcmFja2V0ZWQuRW1iZWRJbnNpZGUgKi8pID8gb3V0ZXJUeXBlIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShmbGFncyAmIDQgLyogQnJhY2tldGVkLk9wcG9zaXRlSW5zaWRlICovKSA/IDAgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgMSAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVCZWZvcmUgKi8pID8gb3Bwb3NpdGVUeXBlIDogb3V0ZXJUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlc1tpXSA9IHR5cGVzW0JyYWNrZXRTdGFja1tzSl1dID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzSSA9IHNKO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEJyYWNrZXRTdGFjay5sZW5ndGggPT0gMTg5IC8qIEJyYWNrZXRlZC5NYXhEZXB0aCAqLykge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSSsrXSA9IGk7XG4gICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSSsrXSA9IGNoO1xuICAgICAgICAgICAgICAgICAgICBCcmFja2V0U3RhY2tbc0krK10gPSBjb250ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCh0eXBlID0gdHlwZXNbaV0pID09IDIgLyogVC5SICovIHx8IHR5cGUgPT0gMSAvKiBULkwgKi8pIHtcbiAgICAgICAgICAgICAgICBsZXQgZW1iZWQgPSB0eXBlID09IG91dGVyVHlwZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0ID0gZW1iZWQgPyAwIDogMSAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVCZWZvcmUgKi87XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc0ogPSBzSSAtIDM7IHNKID49IDA7IHNKIC09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1ciA9IEJyYWNrZXRTdGFja1tzSiArIDJdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VyICYgMiAvKiBCcmFja2V0ZWQuRW1iZWRJbnNpZGUgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVtYmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBCcmFja2V0U3RhY2tbc0ogKyAyXSB8PSAyIC8qIEJyYWNrZXRlZC5FbWJlZEluc2lkZSAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIgJiA0IC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUluc2lkZSAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSiArIDJdIHw9IDQgLyogQnJhY2tldGVkLk9wcG9zaXRlSW5zaWRlICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcHJvY2Vzc05ldXRyYWxzKHJGcm9tLCByVG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpIHtcbiAgICBmb3IgKGxldCBpSSA9IDAsIHByZXYgPSBvdXRlclR5cGU7IGlJIDw9IGlzb2xhdGVzLmxlbmd0aDsgaUkrKykge1xuICAgICAgICBsZXQgZnJvbSA9IGlJID8gaXNvbGF0ZXNbaUkgLSAxXS50byA6IHJGcm9tLCB0byA9IGlJIDwgaXNvbGF0ZXMubGVuZ3RoID8gaXNvbGF0ZXNbaUldLmZyb20gOiByVG87XG4gICAgICAgIC8vIE4xLiBBIHNlcXVlbmNlIG9mIG5ldXRyYWxzIHRha2VzIHRoZSBkaXJlY3Rpb24gb2YgdGhlXG4gICAgICAgIC8vIHN1cnJvdW5kaW5nIHN0cm9uZyB0ZXh0IGlmIHRoZSB0ZXh0IG9uIGJvdGggc2lkZXMgaGFzIHRoZSBzYW1lXG4gICAgICAgIC8vIGRpcmVjdGlvbi4gRXVyb3BlYW4gYW5kIEFyYWJpYyBudW1iZXJzIGFjdCBhcyBpZiB0aGV5IHdlcmUgUiBpblxuICAgICAgICAvLyB0ZXJtcyBvZiB0aGVpciBpbmZsdWVuY2Ugb24gbmV1dHJhbHMuIFN0YXJ0LW9mLWxldmVsLXJ1biAoc29yKVxuICAgICAgICAvLyBhbmQgZW5kLW9mLWxldmVsLXJ1biAoZW9yKSBhcmUgdXNlZCBhdCBsZXZlbCBydW4gYm91bmRhcmllcy5cbiAgICAgICAgLy8gTjIuIEFueSByZW1haW5pbmcgbmV1dHJhbHMgdGFrZSB0aGUgZW1iZWRkaW5nIGRpcmVjdGlvbi5cbiAgICAgICAgLy8gKExlZnQgYWZ0ZXIgdGhpczogTCwgUiwgRU4rQU4pXG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87KSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHR5cGVzW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gMjU2IC8qIFQuTkkgKi8pIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kID0gaSArIDE7XG4gICAgICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW5kID09IHRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaUkgPT0gaXNvbGF0ZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gaXNvbGF0ZXNbaUkrK10udG87XG4gICAgICAgICAgICAgICAgICAgICAgICB0byA9IGlJIDwgaXNvbGF0ZXMubGVuZ3RoID8gaXNvbGF0ZXNbaUldLmZyb20gOiByVG87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZXNbZW5kXSA9PSAyNTYgLyogVC5OSSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgYmVmb3JlTCA9IHByZXYgPT0gMSAvKiBULkwgKi87XG4gICAgICAgICAgICAgICAgbGV0IGFmdGVyTCA9IChlbmQgPCByVG8gPyB0eXBlc1tlbmRdIDogb3V0ZXJUeXBlKSA9PSAxIC8qIFQuTCAqLztcbiAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZSA9IGJlZm9yZUwgPT0gYWZ0ZXJMID8gKGJlZm9yZUwgPyAxIC8qIFQuTCAqLyA6IDIgLyogVC5SICovKSA6IG91dGVyVHlwZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gZW5kLCBqSSA9IGlJLCBmcm9tSiA9IGpJID8gaXNvbGF0ZXNbakkgLSAxXS50byA6IHJGcm9tOyBqID4gaTspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gZnJvbUopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpc29sYXRlc1stLWpJXS5mcm9tO1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUogPSBqSSA/IGlzb2xhdGVzW2pJIC0gMV0udG8gOiByRnJvbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0eXBlc1stLWpdID0gcmVwbGFjZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSA9IGVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXYgPSB0eXBlO1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIEZpbmQgdGhlIGNvbnRpZ3VvdXMgcmFuZ2VzIG9mIGNoYXJhY3RlciB0eXBlcyBpbiBhIGdpdmVuIHJhbmdlLCBhbmRcbi8vIGVtaXQgc3BhbnMgZm9yIHRoZW0uIEZsaXAgdGhlIG9yZGVyIG9mIHRoZSBzcGFucyBhcyBhcHByb3ByaWF0ZVxuLy8gYmFzZWQgb24gdGhlIGxldmVsLCBhbmQgY2FsbCB0aHJvdWdoIHRvIGNvbXB1dGUgdGhlIHNwYW5zIGZvclxuLy8gaXNvbGF0ZXMgYXQgdGhlIHByb3BlciBwb2ludC5cbmZ1bmN0aW9uIGVtaXRTcGFucyhsaW5lLCBmcm9tLCB0bywgbGV2ZWwsIGJhc2VMZXZlbCwgaXNvbGF0ZXMsIG9yZGVyKSB7XG4gICAgbGV0IG91clR5cGUgPSBsZXZlbCAlIDIgPyAyIC8qIFQuUiAqLyA6IDEgLyogVC5MICovO1xuICAgIGlmICgobGV2ZWwgJSAyKSA9PSAoYmFzZUxldmVsICUgMikpIHsgLy8gU2FtZSBkaXIgYXMgYmFzZSBkaXJlY3Rpb24sIGRvbid0IGZsaXBcbiAgICAgICAgZm9yIChsZXQgaUNoID0gZnJvbSwgaUkgPSAwOyBpQ2ggPCB0bzspIHtcbiAgICAgICAgICAgIC8vIFNjYW4gYSBzZWN0aW9uIG9mIGNoYXJhY3RlcnMgaW4gZGlyZWN0aW9uIG91clR5cGUsIHVubGVzc1xuICAgICAgICAgICAgLy8gdGhlcmUncyBhbm90aGVyIHR5cGUgb2YgY2hhciByaWdodCBhZnRlciBpQ2gsIGluIHdoaWNoIGNhc2VcbiAgICAgICAgICAgIC8vIHdlIHNjYW4gYSBzZWN0aW9uIG9mIG90aGVyIGNoYXJhY3RlcnMgKHdoaWNoLCBpZiBvdXJUeXBlID09XG4gICAgICAgICAgICAvLyBULkwsIG1heSBjb250YWluIGJvdGggVC5SIGFuZCBULkFOIGNoYXJzKS5cbiAgICAgICAgICAgIGxldCBzYW1lRGlyID0gdHJ1ZSwgaXNOdW0gPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChpSSA9PSBpc29sYXRlcy5sZW5ndGggfHwgaUNoIDwgaXNvbGF0ZXNbaUldLmZyb20pIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHR5cGVzW2lDaF07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgIT0gb3VyVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBzYW1lRGlyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlzTnVtID0gbmV4dCA9PSAxNiAvKiBULkFOICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhvbGRzIGFuIGFycmF5IG9mIGlzb2xhdGVzIHRvIHBhc3MgdG8gYSByZWN1cnNpdmUgY2FsbCBpZiB3ZVxuICAgICAgICAgICAgLy8gbXVzdCByZWN1cnNlICh0byBkaXN0aW5ndWlzaCBULkFOIGluc2lkZSBhbiBSVEwgc2VjdGlvbiBpblxuICAgICAgICAgICAgLy8gTFRSIHRleHQpLCBudWxsIGlmIHdlIGNhbiBlbWl0IGRpcmVjdGx5XG4gICAgICAgICAgICBsZXQgcmVjdXJzZSA9ICFzYW1lRGlyICYmIG91clR5cGUgPT0gMSAvKiBULkwgKi8gPyBbXSA6IG51bGw7XG4gICAgICAgICAgICBsZXQgbG9jYWxMZXZlbCA9IHNhbWVEaXIgPyBsZXZlbCA6IGxldmVsICsgMTtcbiAgICAgICAgICAgIGxldCBpU2NhbiA9IGlDaDtcbiAgICAgICAgICAgIHJ1bjogZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGlmIChpSSA8IGlzb2xhdGVzLmxlbmd0aCAmJiBpU2NhbiA9PSBpc29sYXRlc1tpSV0uZnJvbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOdW0pXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc28gPSBpc29sYXRlc1tpSV07XG4gICAgICAgICAgICAgICAgICAgIC8vIFNjYW4gYWhlYWQgdG8gdmVyaWZ5IHRoYXQgdGhlcmUgaXMgYW5vdGhlciBjaGFyIGluIHRoaXMgZGlyIGFmdGVyIHRoZSBpc29sYXRlKHMpXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2FtZURpcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHVwdG8gPSBpc28udG8sIGpJID0gaUkgKyAxOzspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXB0byA9PSB0bylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqSSA8IGlzb2xhdGVzLmxlbmd0aCAmJiBpc29sYXRlc1tqSV0uZnJvbSA9PSB1cHRvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHRvID0gaXNvbGF0ZXNbakkrK10udG87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZXNbdXB0b10gPT0gb3VyVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlJKys7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWN1cnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlLnB1c2goaXNvKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc28uZnJvbSA+IGlDaClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbihpQ2gsIGlzby5mcm9tLCBsb2NhbExldmVsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlyU3dhcCA9IChpc28uZGlyZWN0aW9uID09IExUUikgIT0gIShsb2NhbExldmVsICUgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlU2VjdGlvbk9yZGVyKGxpbmUsIGRpclN3YXAgPyBsZXZlbCArIDEgOiBsZXZlbCwgYmFzZUxldmVsLCBpc28uaW5uZXIsIGlzby5mcm9tLCBpc28udG8sIG9yZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlDaCA9IGlzby50bztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpU2NhbiA9IGlzby50bztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaVNjYW4gPT0gdG8gfHwgKHNhbWVEaXIgPyB0eXBlc1tpU2Nhbl0gIT0gb3VyVHlwZSA6IHR5cGVzW2lTY2FuXSA9PSBvdXJUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlTY2FuKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlY3Vyc2UpXG4gICAgICAgICAgICAgICAgZW1pdFNwYW5zKGxpbmUsIGlDaCwgaVNjYW4sIGxldmVsICsgMSwgYmFzZUxldmVsLCByZWN1cnNlLCBvcmRlcik7XG4gICAgICAgICAgICBlbHNlIGlmIChpQ2ggPCBpU2NhbilcbiAgICAgICAgICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbihpQ2gsIGlTY2FuLCBsb2NhbExldmVsKSk7XG4gICAgICAgICAgICBpQ2ggPSBpU2NhbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSXRlcmF0ZSBpbiByZXZlcnNlIHRvIGZsaXAgdGhlIHNwYW4gb3JkZXIuIFNhbWUgY29kZSBhZ2FpbiwgYnV0XG4gICAgICAgIC8vIGdvaW5nIGZyb20gdGhlIGJhY2sgb2YgdGhlIHNlY3Rpb24gdG8gdGhlIGZyb250XG4gICAgICAgIGZvciAobGV0IGlDaCA9IHRvLCBpSSA9IGlzb2xhdGVzLmxlbmd0aDsgaUNoID4gZnJvbTspIHtcbiAgICAgICAgICAgIGxldCBzYW1lRGlyID0gdHJ1ZSwgaXNOdW0gPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghaUkgfHwgaUNoID4gaXNvbGF0ZXNbaUkgLSAxXS50bykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdHlwZXNbaUNoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgIT0gb3VyVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBzYW1lRGlyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlzTnVtID0gbmV4dCA9PSAxNiAvKiBULkFOICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZWN1cnNlID0gIXNhbWVEaXIgJiYgb3VyVHlwZSA9PSAxIC8qIFQuTCAqLyA/IFtdIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBsb2NhbExldmVsID0gc2FtZURpciA/IGxldmVsIDogbGV2ZWwgKyAxO1xuICAgICAgICAgICAgbGV0IGlTY2FuID0gaUNoO1xuICAgICAgICAgICAgcnVuOiBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlJICYmIGlTY2FuID09IGlzb2xhdGVzW2lJIC0gMV0udG8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTnVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcnVuO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXNvID0gaXNvbGF0ZXNbLS1pSV07XG4gICAgICAgICAgICAgICAgICAgIC8vIFNjYW4gYWhlYWQgdG8gdmVyaWZ5IHRoYXQgdGhlcmUgaXMgYW5vdGhlciBjaGFyIGluIHRoaXMgZGlyIGFmdGVyIHRoZSBpc29sYXRlKHMpXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2FtZURpcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHVwdG8gPSBpc28uZnJvbSwgakkgPSBpSTs7KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwdG8gPT0gZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgcnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqSSAmJiBpc29sYXRlc1tqSSAtIDFdLnRvID09IHVwdG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwdG8gPSBpc29sYXRlc1stLWpJXS5mcm9tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVzW3VwdG8gLSAxXSA9PSBvdXJUeXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UucHVzaChpc28pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzby50byA8IGlDaClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3Bhbihpc28udG8sIGlDaCwgbG9jYWxMZXZlbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpclN3YXAgPSAoaXNvLmRpcmVjdGlvbiA9PSBMVFIpICE9ICEobG9jYWxMZXZlbCAlIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVNlY3Rpb25PcmRlcihsaW5lLCBkaXJTd2FwID8gbGV2ZWwgKyAxIDogbGV2ZWwsIGJhc2VMZXZlbCwgaXNvLmlubmVyLCBpc28uZnJvbSwgaXNvLnRvLCBvcmRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpQ2ggPSBpc28uZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpU2NhbiA9IGlzby5mcm9tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpU2NhbiA9PSBmcm9tIHx8IChzYW1lRGlyID8gdHlwZXNbaVNjYW4gLSAxXSAhPSBvdXJUeXBlIDogdHlwZXNbaVNjYW4gLSAxXSA9PSBvdXJUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlTY2FuLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlY3Vyc2UpXG4gICAgICAgICAgICAgICAgZW1pdFNwYW5zKGxpbmUsIGlTY2FuLCBpQ2gsIGxldmVsICsgMSwgYmFzZUxldmVsLCByZWN1cnNlLCBvcmRlcik7XG4gICAgICAgICAgICBlbHNlIGlmIChpU2NhbiA8IGlDaClcbiAgICAgICAgICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbihpU2NhbiwgaUNoLCBsb2NhbExldmVsKSk7XG4gICAgICAgICAgICBpQ2ggPSBpU2NhbjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVTZWN0aW9uT3JkZXIobGluZSwgbGV2ZWwsIGJhc2VMZXZlbCwgaXNvbGF0ZXMsIGZyb20sIHRvLCBvcmRlcikge1xuICAgIGxldCBvdXRlclR5cGUgPSAobGV2ZWwgJSAyID8gMiAvKiBULlIgKi8gOiAxIC8qIFQuTCAqLyk7XG4gICAgY29tcHV0ZUNoYXJUeXBlcyhsaW5lLCBmcm9tLCB0bywgaXNvbGF0ZXMsIG91dGVyVHlwZSk7XG4gICAgcHJvY2Vzc0JyYWNrZXRQYWlycyhsaW5lLCBmcm9tLCB0bywgaXNvbGF0ZXMsIG91dGVyVHlwZSk7XG4gICAgcHJvY2Vzc05ldXRyYWxzKGZyb20sIHRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKTtcbiAgICBlbWl0U3BhbnMobGluZSwgZnJvbSwgdG8sIGxldmVsLCBiYXNlTGV2ZWwsIGlzb2xhdGVzLCBvcmRlcik7XG59XG5mdW5jdGlvbiBjb21wdXRlT3JkZXIobGluZSwgZGlyZWN0aW9uLCBpc29sYXRlcykge1xuICAgIGlmICghbGluZSlcbiAgICAgICAgcmV0dXJuIFtuZXcgQmlkaVNwYW4oMCwgMCwgZGlyZWN0aW9uID09IFJUTCA/IDEgOiAwKV07XG4gICAgaWYgKGRpcmVjdGlvbiA9PSBMVFIgJiYgIWlzb2xhdGVzLmxlbmd0aCAmJiAhQmlkaVJFLnRlc3QobGluZSkpXG4gICAgICAgIHJldHVybiB0cml2aWFsT3JkZXIobGluZS5sZW5ndGgpO1xuICAgIGlmIChpc29sYXRlcy5sZW5ndGgpXG4gICAgICAgIHdoaWxlIChsaW5lLmxlbmd0aCA+IHR5cGVzLmxlbmd0aClcbiAgICAgICAgICAgIHR5cGVzW3R5cGVzLmxlbmd0aF0gPSAyNTYgLyogVC5OSSAqLzsgLy8gTWFrZSBzdXJlIHR5cGVzIGFycmF5IGhhcyBubyBnYXBzXG4gICAgbGV0IG9yZGVyID0gW10sIGxldmVsID0gZGlyZWN0aW9uID09IExUUiA/IDAgOiAxO1xuICAgIGNvbXB1dGVTZWN0aW9uT3JkZXIobGluZSwgbGV2ZWwsIGxldmVsLCBpc29sYXRlcywgMCwgbGluZS5sZW5ndGgsIG9yZGVyKTtcbiAgICByZXR1cm4gb3JkZXI7XG59XG5mdW5jdGlvbiB0cml2aWFsT3JkZXIobGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtuZXcgQmlkaVNwYW4oMCwgbGVuZ3RoLCAwKV07XG59XG5sZXQgbW92ZWRPdmVyID0gXCJcIjtcbi8vIFRoaXMgaW1wbGVtZW50YXRpb24gbW92ZXMgc3RyaWN0bHkgdmlzdWFsbHksIHdpdGhvdXQgY29uY2VybiBmb3IgYVxuLy8gdHJhdmVyc2FsIHZpc2l0aW5nIGV2ZXJ5IGxvZ2ljYWwgcG9zaXRpb24gaW4gdGhlIHN0cmluZy4gSXQgd2lsbFxuLy8gc3RpbGwgZG8gc28gZm9yIHNpbXBsZSBpbnB1dCwgYnV0IHNpdHVhdGlvbnMgbGlrZSBtdWx0aXBsZSBpc29sYXRlc1xuLy8gd2l0aCB0aGUgc2FtZSBsZXZlbCBuZXh0IHRvIGVhY2ggb3RoZXIsIG9yIHRleHQgZ29pbmcgYWdhaW5zdCB0aGVcbi8vIG1haW4gZGlyIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUsIHdpbGwgbWFrZSBzb21lIHBvc2l0aW9uc1xuLy8gdW5yZWFjaGFibGUgd2l0aCB0aGlzIG1vdGlvbi4gRWFjaCB2aXNpYmxlIGN1cnNvciBwb3NpdGlvbiB3aWxsXG4vLyBjb3JyZXNwb25kIHRvIHRoZSBsb3dlci1sZXZlbCBiaWRpIHNwYW4gdGhhdCB0b3VjaGVzIGl0LlxuLy9cbi8vIFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byBzb2x2ZSBhbiBvcmRlciBnbG9iYWxseSBmb3IgYSBnaXZlblxuLy8gbGluZSwgbWFraW5nIHN1cmUgdGhhdCBpdCBpbmNsdWRlcyBldmVyeSBwb3NpdGlvbiwgYnV0IHRoYXQgd291bGRcbi8vIHJlcXVpcmUgYXNzb2NpYXRpbmcgbm9uLWNhbm9uaWNhbCAoaGlnaGVyIGJpZGkgc3BhbiBsZXZlbClcbi8vIHBvc2l0aW9ucyB3aXRoIGEgZ2l2ZW4gdmlzdWFsIHBvc2l0aW9uLCB3aGljaCBpcyBsaWtlbHkgdG8gY29uZnVzZVxuLy8gcGVvcGxlLiAoQW5kIHdvdWxkIGdlbmVyYWxseSBiZSBhIGxvdCBtb3JlIGNvbXBsaWNhdGVkLilcbmZ1bmN0aW9uIG1vdmVWaXN1YWxseShsaW5lLCBvcmRlciwgZGlyLCBzdGFydCwgZm9yd2FyZCkge1xuICAgIHZhciBfYTtcbiAgICBsZXQgc3RhcnRJbmRleCA9IHN0YXJ0LmhlYWQgLSBsaW5lLmZyb207XG4gICAgbGV0IHNwYW5JID0gQmlkaVNwYW4uZmluZChvcmRlciwgc3RhcnRJbmRleCwgKF9hID0gc3RhcnQuYmlkaUxldmVsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAtMSwgc3RhcnQuYXNzb2MpO1xuICAgIGxldCBzcGFuID0gb3JkZXJbc3BhbkldLCBzcGFuRW5kID0gc3Bhbi5zaWRlKGZvcndhcmQsIGRpcik7XG4gICAgLy8gRW5kIG9mIHNwYW5cbiAgICBpZiAoc3RhcnRJbmRleCA9PSBzcGFuRW5kKSB7XG4gICAgICAgIGxldCBuZXh0SSA9IHNwYW5JICs9IGZvcndhcmQgPyAxIDogLTE7XG4gICAgICAgIGlmIChuZXh0SSA8IDAgfHwgbmV4dEkgPj0gb3JkZXIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHNwYW4gPSBvcmRlcltzcGFuSSA9IG5leHRJXTtcbiAgICAgICAgc3RhcnRJbmRleCA9IHNwYW4uc2lkZSghZm9yd2FyZCwgZGlyKTtcbiAgICAgICAgc3BhbkVuZCA9IHNwYW4uc2lkZShmb3J3YXJkLCBkaXIpO1xuICAgIH1cbiAgICBsZXQgbmV4dEluZGV4ID0gZmluZENsdXN0ZXJCcmVhayhsaW5lLnRleHQsIHN0YXJ0SW5kZXgsIHNwYW4uZm9yd2FyZChmb3J3YXJkLCBkaXIpKTtcbiAgICBpZiAobmV4dEluZGV4IDwgc3Bhbi5mcm9tIHx8IG5leHRJbmRleCA+IHNwYW4udG8pXG4gICAgICAgIG5leHRJbmRleCA9IHNwYW5FbmQ7XG4gICAgbW92ZWRPdmVyID0gbGluZS50ZXh0LnNsaWNlKE1hdGgubWluKHN0YXJ0SW5kZXgsIG5leHRJbmRleCksIE1hdGgubWF4KHN0YXJ0SW5kZXgsIG5leHRJbmRleCkpO1xuICAgIGxldCBuZXh0U3BhbiA9IHNwYW5JID09IChmb3J3YXJkID8gb3JkZXIubGVuZ3RoIC0gMSA6IDApID8gbnVsbCA6IG9yZGVyW3NwYW5JICsgKGZvcndhcmQgPyAxIDogLTEpXTtcbiAgICBpZiAobmV4dFNwYW4gJiYgbmV4dEluZGV4ID09IHNwYW5FbmQgJiYgbmV4dFNwYW4ubGV2ZWwgKyAoZm9yd2FyZCA/IDAgOiAxKSA8IHNwYW4ubGV2ZWwpXG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKG5leHRTcGFuLnNpZGUoIWZvcndhcmQsIGRpcikgKyBsaW5lLmZyb20sIG5leHRTcGFuLmZvcndhcmQoZm9yd2FyZCwgZGlyKSA/IDEgOiAtMSwgbmV4dFNwYW4ubGV2ZWwpO1xuICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKG5leHRJbmRleCArIGxpbmUuZnJvbSwgc3Bhbi5mb3J3YXJkKGZvcndhcmQsIGRpcikgPyAtMSA6IDEsIHNwYW4ubGV2ZWwpO1xufVxuZnVuY3Rpb24gYXV0b0RpcmVjdGlvbih0ZXh0LCBmcm9tLCB0bykge1xuICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87IGkrKykge1xuICAgICAgICBsZXQgdHlwZSA9IGNoYXJUeXBlKHRleHQuY2hhckNvZGVBdChpKSk7XG4gICAgICAgIGlmICh0eXBlID09IDEgLyogVC5MICovKVxuICAgICAgICAgICAgcmV0dXJuIExUUjtcbiAgICAgICAgaWYgKHR5cGUgPT0gMiAvKiBULlIgKi8gfHwgdHlwZSA9PSA0IC8qIFQuQUwgKi8pXG4gICAgICAgICAgICByZXR1cm4gUlRMO1xuICAgIH1cbiAgICByZXR1cm4gTFRSO1xufVxuXG5jb25zdCBjbGlja0FkZHNTZWxlY3Rpb25SYW5nZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGRyYWdNb3Zlc1NlbGVjdGlvbiQxID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgbW91c2VTZWxlY3Rpb25TdHlsZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGV4Y2VwdGlvblNpbmsgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCB1cGRhdGVMaXN0ZW5lciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGlucHV0SGFuZGxlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGZvY3VzQ2hhbmdlRWZmZWN0ID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgcGVyTGluZVRleHREaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KVxufSk7XG5jb25zdCBuYXRpdmVTZWxlY3Rpb25IaWRkZW4gPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KVxufSk7XG5jbGFzcyBTY3JvbGxUYXJnZXQge1xuICAgIGNvbnN0cnVjdG9yKHJhbmdlLCB5ID0gXCJuZWFyZXN0XCIsIHggPSBcIm5lYXJlc3RcIiwgeU1hcmdpbiA9IDUsIHhNYXJnaW4gPSA1LCBcbiAgICAvLyBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIGFidXNlZCB0byBhbHNvIHN0b3JlIHByZWNpc2Ugc2Nyb2xsXG4gICAgLy8gc25hcHNob3RzLCBpbnN0ZWFkIG9mIGEgYHNjcm9sbEludG9WaWV3YCByZXF1ZXN0LiBXaGVuIHRoaXNcbiAgICAvLyBmbGFnIGlzIGB0cnVlYCwgYHJhbmdlYCBwb2ludHMgYXQgYSBwb3NpdGlvbiBpbiB0aGUgcmVmZXJlbmNlXG4gICAgLy8gbGluZSwgYHlNYXJnaW5gIGhvbGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHRvcCBvZiB0aGF0XG4gICAgLy8gbGluZSBhbmQgdGhlIHRvcCBvZiB0aGUgZWRpdG9yLCBhbmQgYHhNYXJnaW5gIGhvbGRzIHRoZVxuICAgIC8vIGVkaXRvcidzIGBzY3JvbGxMZWZ0YC5cbiAgICBpc1NuYXBzaG90ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlO1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnlNYXJnaW4gPSB5TWFyZ2luO1xuICAgICAgICB0aGlzLnhNYXJnaW4gPSB4TWFyZ2luO1xuICAgICAgICB0aGlzLmlzU25hcHNob3QgPSBpc1NuYXBzaG90O1xuICAgIH1cbiAgICBtYXAoY2hhbmdlcykge1xuICAgICAgICByZXR1cm4gY2hhbmdlcy5lbXB0eSA/IHRoaXMgOlxuICAgICAgICAgICAgbmV3IFNjcm9sbFRhcmdldCh0aGlzLnJhbmdlLm1hcChjaGFuZ2VzKSwgdGhpcy55LCB0aGlzLngsIHRoaXMueU1hcmdpbiwgdGhpcy54TWFyZ2luLCB0aGlzLmlzU25hcHNob3QpO1xuICAgIH1cbiAgICBjbGlwKHN0YXRlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlLnRvIDw9IHN0YXRlLmRvYy5sZW5ndGggPyB0aGlzIDpcbiAgICAgICAgICAgIG5ldyBTY3JvbGxUYXJnZXQoRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihzdGF0ZS5kb2MubGVuZ3RoKSwgdGhpcy55LCB0aGlzLngsIHRoaXMueU1hcmdpbiwgdGhpcy54TWFyZ2luLCB0aGlzLmlzU25hcHNob3QpO1xuICAgIH1cbn1cbmNvbnN0IHNjcm9sbEludG9WaWV3ID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSh7IG1hcDogKHQsIGNoKSA9PiB0Lm1hcChjaCkgfSk7XG4vKipcbkxvZyBvciByZXBvcnQgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBjbGllbnQgY29kZS4gU2hvdWxkXG5wcm9iYWJseSBvbmx5IGJlIHVzZWQgYnkgZXh0ZW5zaW9uIGNvZGUgdGhhdCBhbGxvd3MgY2xpZW50IGNvZGUgdG9cbnByb3ZpZGUgZnVuY3Rpb25zLCBhbmQgY2FsbHMgdGhvc2UgZnVuY3Rpb25zIGluIGEgY29udGV4dCB3aGVyZSBhblxuZXhjZXB0aW9uIGNhbid0IGJlIHByb3BhZ2F0ZWQgdG8gY2FsbGluZyBjb2RlIGluIGEgcmVhc29uYWJsZSB3YXlcbihmb3IgZXhhbXBsZSB3aGVuIGluIGFuIGV2ZW50IGhhbmRsZXIpLlxuXG5FaXRoZXIgY2FsbHMgYSBoYW5kbGVyIHJlZ2lzdGVyZWQgd2l0aFxuW2BFZGl0b3JWaWV3LmV4Y2VwdGlvblNpbmtgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15leGNlcHRpb25TaW5rKSxcbmB3aW5kb3cub25lcnJvcmAsIGlmIGRlZmluZWQsIG9yIGBjb25zb2xlLmVycm9yYCAoaW4gd2hpY2ggY2FzZVxuaXQnbGwgcGFzcyBgY29udGV4dGAsIHdoZW4gZ2l2ZW4sIGFzIGZpcnN0IGFyZ3VtZW50KS5cbiovXG5mdW5jdGlvbiBsb2dFeGNlcHRpb24oc3RhdGUsIGV4Y2VwdGlvbiwgY29udGV4dCkge1xuICAgIGxldCBoYW5kbGVyID0gc3RhdGUuZmFjZXQoZXhjZXB0aW9uU2luayk7XG4gICAgaWYgKGhhbmRsZXIubGVuZ3RoKVxuICAgICAgICBoYW5kbGVyWzBdKGV4Y2VwdGlvbik7XG4gICAgZWxzZSBpZiAod2luZG93Lm9uZXJyb3IpXG4gICAgICAgIHdpbmRvdy5vbmVycm9yKFN0cmluZyhleGNlcHRpb24pLCBjb250ZXh0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZXhjZXB0aW9uKTtcbiAgICBlbHNlIGlmIChjb250ZXh0KVxuICAgICAgICBjb25zb2xlLmVycm9yKGNvbnRleHQgKyBcIjpcIiwgZXhjZXB0aW9uKTtcbiAgICBlbHNlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXhjZXB0aW9uKTtcbn1cbmNvbnN0IGVkaXRhYmxlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogdHJ1ZSB9KTtcbmxldCBuZXh0UGx1Z2luSUQgPSAwO1xuY29uc3Qgdmlld1BsdWdpbiA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuVmlldyBwbHVnaW5zIGFzc29jaWF0ZSBzdGF0ZWZ1bCB2YWx1ZXMgd2l0aCBhIHZpZXcuIFRoZXkgY2FuXG5pbmZsdWVuY2UgdGhlIHdheSB0aGUgY29udGVudCBpcyBkcmF3biwgYW5kIGFyZSBub3RpZmllZCBvZiB0aGluZ3NcbnRoYXQgaGFwcGVuIGluIHRoZSB2aWV3LlxuKi9cbmNsYXNzIFZpZXdQbHVnaW4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaWQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY3JlYXRlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGRvbUV2ZW50SGFuZGxlcnMsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZG9tRXZlbnRPYnNlcnZlcnMsIGJ1aWxkRXh0ZW5zaW9ucykge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuY3JlYXRlID0gY3JlYXRlO1xuICAgICAgICB0aGlzLmRvbUV2ZW50SGFuZGxlcnMgPSBkb21FdmVudEhhbmRsZXJzO1xuICAgICAgICB0aGlzLmRvbUV2ZW50T2JzZXJ2ZXJzID0gZG9tRXZlbnRPYnNlcnZlcnM7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gYnVpbGRFeHRlbnNpb25zKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBwbHVnaW4gZnJvbSBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyB0aGVcbiAgICBwbHVnaW4ncyB2YWx1ZSwgZ2l2ZW4gYW4gZWRpdG9yIHZpZXcuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKGNyZWF0ZSwgc3BlYykge1xuICAgICAgICBjb25zdCB7IGV2ZW50SGFuZGxlcnMsIGV2ZW50T2JzZXJ2ZXJzLCBwcm92aWRlLCBkZWNvcmF0aW9uczogZGVjbyB9ID0gc3BlYyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIG5ldyBWaWV3UGx1Z2luKG5leHRQbHVnaW5JRCsrLCBjcmVhdGUsIGV2ZW50SGFuZGxlcnMsIGV2ZW50T2JzZXJ2ZXJzLCBwbHVnaW4gPT4ge1xuICAgICAgICAgICAgbGV0IGV4dCA9IFt2aWV3UGx1Z2luLm9mKHBsdWdpbildO1xuICAgICAgICAgICAgaWYgKGRlY28pXG4gICAgICAgICAgICAgICAgZXh0LnB1c2goZGVjb3JhdGlvbnMub2YodmlldyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwbHVnaW5JbnN0ID0gdmlldy5wbHVnaW4ocGx1Z2luKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsdWdpbkluc3QgPyBkZWNvKHBsdWdpbkluc3QpIDogRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGlmIChwcm92aWRlKVxuICAgICAgICAgICAgICAgIGV4dC5wdXNoKHByb3ZpZGUocGx1Z2luKSk7XG4gICAgICAgICAgICByZXR1cm4gZXh0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcGx1Z2luIGZvciBhIGNsYXNzIHdob3NlIGNvbnN0cnVjdG9yIHRha2VzIGEgc2luZ2xlXG4gICAgZWRpdG9yIHZpZXcgYXMgYXJndW1lbnQuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUNsYXNzKGNscywgc3BlYykge1xuICAgICAgICByZXR1cm4gVmlld1BsdWdpbi5kZWZpbmUodmlldyA9PiBuZXcgY2xzKHZpZXcpLCBzcGVjKTtcbiAgICB9XG59XG5jbGFzcyBQbHVnaW5JbnN0YW5jZSB7XG4gICAgY29uc3RydWN0b3Ioc3BlYykge1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgICAgICAvLyBXaGVuIHN0YXJ0aW5nIGFuIHVwZGF0ZSwgYWxsIHBsdWdpbnMgaGF2ZSB0aGlzIGZpZWxkIHNldCB0byB0aGVcbiAgICAgICAgLy8gdXBkYXRlIG9iamVjdCwgaW5kaWNhdGluZyB0aGV5IG5lZWQgdG8gYmUgdXBkYXRlZC4gV2hlbiBmaW5pc2hlZFxuICAgICAgICAvLyB1cGRhdGluZywgaXQgaXMgc2V0IHRvIGBmYWxzZWAuIFJldHJpZXZpbmcgYSBwbHVnaW4gdGhhdCBuZWVkcyB0b1xuICAgICAgICAvLyBiZSB1cGRhdGVkIHdpdGggYHZpZXcucGx1Z2luYCBmb3JjZXMgYW4gZWFnZXIgdXBkYXRlLlxuICAgICAgICB0aGlzLm11c3RVcGRhdGUgPSBudWxsO1xuICAgICAgICAvLyBUaGlzIGlzIG51bGwgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxseSBjcmVhdGVkLCBidXRcbiAgICAgICAgLy8gaW5pdGlhbGl6ZWQgb24gdGhlIGZpcnN0IHVwZGF0ZS5cbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIHVwZGF0ZSh2aWV3KSB7XG4gICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3BlYykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnNwZWMuY3JlYXRlKHZpZXcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odmlldy5zdGF0ZSwgZSwgXCJDb2RlTWlycm9yIHBsdWdpbiBjcmFzaGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5tdXN0VXBkYXRlKSB7XG4gICAgICAgICAgICBsZXQgdXBkYXRlID0gdGhpcy5tdXN0VXBkYXRlO1xuICAgICAgICAgICAgdGhpcy5tdXN0VXBkYXRlID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLnVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih1cGRhdGUuc3RhdGUsIGUsIFwiQ29kZU1pcnJvciBwbHVnaW4gY3Jhc2hlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUuZGVzdHJveSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVzdHJveSh2aWV3KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKChfYSA9IHRoaXMudmFsdWUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZXN0cm95KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odmlldy5zdGF0ZSwgZSwgXCJDb2RlTWlycm9yIHBsdWdpbiBjcmFzaGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGRlYWN0aXZhdGUoKSB7XG4gICAgICAgIHRoaXMuc3BlYyA9IHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH1cbn1cbmNvbnN0IGVkaXRvckF0dHJpYnV0ZXMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBjb250ZW50QXR0cmlidXRlcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8vIFByb3ZpZGUgZGVjb3JhdGlvbnNcbmNvbnN0IGRlY29yYXRpb25zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3Qgb3V0ZXJEZWNvcmF0aW9ucyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGF0b21pY1JhbmdlcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGJpZGlJc29sYXRlZFJhbmdlcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmZ1bmN0aW9uIGdldElzb2xhdGVkUmFuZ2VzKHZpZXcsIGxpbmUpIHtcbiAgICBsZXQgaXNvbGF0ZXMgPSB2aWV3LnN0YXRlLmZhY2V0KGJpZGlJc29sYXRlZFJhbmdlcyk7XG4gICAgaWYgKCFpc29sYXRlcy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBpc29sYXRlcztcbiAgICBsZXQgc2V0cyA9IGlzb2xhdGVzLm1hcChpID0+IGkgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGkodmlldykgOiBpKTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgUmFuZ2VTZXQuc3BhbnMoc2V0cywgbGluZS5mcm9tLCBsaW5lLnRvLCB7XG4gICAgICAgIHBvaW50KCkgeyB9LFxuICAgICAgICBzcGFuKGZyb21Eb2MsIHRvRG9jLCBhY3RpdmUsIG9wZW4pIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gZnJvbURvYyAtIGxpbmUuZnJvbSwgdG8gPSB0b0RvYyAtIGxpbmUuZnJvbTtcbiAgICAgICAgICAgIGxldCBsZXZlbCA9IHJlc3VsdDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBhY3RpdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0sIG9wZW4tLSkge1xuICAgICAgICAgICAgICAgIGxldCBkaXJlY3Rpb24gPSBhY3RpdmVbaV0uc3BlYy5iaWRpSXNvbGF0ZSwgdXBkYXRlO1xuICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gYXV0b0RpcmVjdGlvbihsaW5lLnRleHQsIGZyb20sIHRvKTtcbiAgICAgICAgICAgICAgICBpZiAob3BlbiA+IDAgJiYgbGV2ZWwubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgICh1cGRhdGUgPSBsZXZlbFtsZXZlbC5sZW5ndGggLSAxXSkudG8gPT0gZnJvbSAmJiB1cGRhdGUuZGlyZWN0aW9uID09IGRpcmVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGUudG8gPSB0bztcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSB1cGRhdGUuaW5uZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWRkID0geyBmcm9tLCB0bywgZGlyZWN0aW9uLCBpbm5lcjogW10gfTtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWwucHVzaChhZGQpO1xuICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGFkZC5pbm5lcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3Qgc2Nyb2xsTWFyZ2lucyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmZ1bmN0aW9uIGdldFNjcm9sbE1hcmdpbnModmlldykge1xuICAgIGxldCBsZWZ0ID0gMCwgcmlnaHQgPSAwLCB0b3AgPSAwLCBib3R0b20gPSAwO1xuICAgIGZvciAobGV0IHNvdXJjZSBvZiB2aWV3LnN0YXRlLmZhY2V0KHNjcm9sbE1hcmdpbnMpKSB7XG4gICAgICAgIGxldCBtID0gc291cmNlKHZpZXcpO1xuICAgICAgICBpZiAobSkge1xuICAgICAgICAgICAgaWYgKG0ubGVmdCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGxlZnQgPSBNYXRoLm1heChsZWZ0LCBtLmxlZnQpO1xuICAgICAgICAgICAgaWYgKG0ucmlnaHQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICByaWdodCA9IE1hdGgubWF4KHJpZ2h0LCBtLnJpZ2h0KTtcbiAgICAgICAgICAgIGlmIChtLnRvcCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHRvcCA9IE1hdGgubWF4KHRvcCwgbS50b3ApO1xuICAgICAgICAgICAgaWYgKG0uYm90dG9tICE9IG51bGwpXG4gICAgICAgICAgICAgICAgYm90dG9tID0gTWF0aC5tYXgoYm90dG9tLCBtLmJvdHRvbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tIH07XG59XG5jb25zdCBzdHlsZU1vZHVsZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNsYXNzIENoYW5nZWRSYW5nZSB7XG4gICAgY29uc3RydWN0b3IoZnJvbUEsIHRvQSwgZnJvbUIsIHRvQikge1xuICAgICAgICB0aGlzLmZyb21BID0gZnJvbUE7XG4gICAgICAgIHRoaXMudG9BID0gdG9BO1xuICAgICAgICB0aGlzLmZyb21CID0gZnJvbUI7XG4gICAgICAgIHRoaXMudG9CID0gdG9CO1xuICAgIH1cbiAgICBqb2luKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlZFJhbmdlKE1hdGgubWluKHRoaXMuZnJvbUEsIG90aGVyLmZyb21BKSwgTWF0aC5tYXgodGhpcy50b0EsIG90aGVyLnRvQSksIE1hdGgubWluKHRoaXMuZnJvbUIsIG90aGVyLmZyb21CKSwgTWF0aC5tYXgodGhpcy50b0IsIG90aGVyLnRvQikpO1xuICAgIH1cbiAgICBhZGRUb1NldChzZXQpIHtcbiAgICAgICAgbGV0IGkgPSBzZXQubGVuZ3RoLCBtZSA9IHRoaXM7XG4gICAgICAgIGZvciAoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSBzZXRbaSAtIDFdO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmZyb21BID4gbWUudG9BKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJhbmdlLnRvQSA8IG1lLmZyb21BKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbWUgPSBtZS5qb2luKHJhbmdlKTtcbiAgICAgICAgICAgIHNldC5zcGxpY2UoaSAtIDEsIDEpO1xuICAgICAgICB9XG4gICAgICAgIHNldC5zcGxpY2UoaSwgMCwgbWUpO1xuICAgICAgICByZXR1cm4gc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgZXh0ZW5kV2l0aFJhbmdlcyhkaWZmLCByYW5nZXMpIHtcbiAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBkaWZmO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGRJID0gMCwgckkgPSAwLCBwb3NBID0gMCwgcG9zQiA9IDA7OyBkSSsrKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGRJID09IGRpZmYubGVuZ3RoID8gbnVsbCA6IGRpZmZbZEldLCBvZmYgPSBwb3NBIC0gcG9zQjtcbiAgICAgICAgICAgIGxldCBlbmQgPSBuZXh0ID8gbmV4dC5mcm9tQiA6IDFlOTtcbiAgICAgICAgICAgIHdoaWxlIChySSA8IHJhbmdlcy5sZW5ndGggJiYgcmFuZ2VzW3JJXSA8IGVuZCkge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gcmFuZ2VzW3JJXSwgdG8gPSByYW5nZXNbckkgKyAxXTtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbUIgPSBNYXRoLm1heChwb3NCLCBmcm9tKSwgdG9CID0gTWF0aC5taW4oZW5kLCB0byk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb21CIDw9IHRvQilcbiAgICAgICAgICAgICAgICAgICAgbmV3IENoYW5nZWRSYW5nZShmcm9tQiArIG9mZiwgdG9CICsgb2ZmLCBmcm9tQiwgdG9CKS5hZGRUb1NldChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmICh0byA+IGVuZClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBySSArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFuZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBuZXcgQ2hhbmdlZFJhbmdlKG5leHQuZnJvbUEsIG5leHQudG9BLCBuZXh0LmZyb21CLCBuZXh0LnRvQikuYWRkVG9TZXQocmVzdWx0KTtcbiAgICAgICAgICAgIHBvc0EgPSBuZXh0LnRvQTtcbiAgICAgICAgICAgIHBvc0IgPSBuZXh0LnRvQjtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuVmlldyBbcGx1Z2luc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LlZpZXdQbHVnaW4pIGFyZSBnaXZlbiBpbnN0YW5jZXMgb2YgdGhpc1xuY2xhc3MsIHdoaWNoIGRlc2NyaWJlIHdoYXQgaGFwcGVuZWQsIHdoZW5ldmVyIHRoZSB2aWV3IGlzIHVwZGF0ZWQuXG4qL1xuY2xhc3MgVmlld1VwZGF0ZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGVkaXRvciB2aWV3IHRoYXQgdGhlIHVwZGF0ZSBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAgKi9cbiAgICB2aWV3LCBcbiAgICAvKipcbiAgICBUaGUgbmV3IGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIHN0YXRlLCBcbiAgICAvKipcbiAgICBUaGUgdHJhbnNhY3Rpb25zIGludm9sdmVkIGluIHRoZSB1cGRhdGUuIE1heSBiZSBlbXB0eS5cbiAgICAqL1xuICAgIHRyYW5zYWN0aW9ucykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0gdHJhbnNhY3Rpb25zO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuZmxhZ3MgPSAwO1xuICAgICAgICB0aGlzLnN0YXJ0U3RhdGUgPSB2aWV3LnN0YXRlO1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBDaGFuZ2VTZXQuZW1wdHkodGhpcy5zdGFydFN0YXRlLmRvYy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCB0ciBvZiB0cmFuc2FjdGlvbnMpXG4gICAgICAgICAgICB0aGlzLmNoYW5nZXMgPSB0aGlzLmNoYW5nZXMuY29tcG9zZSh0ci5jaGFuZ2VzKTtcbiAgICAgICAgbGV0IGNoYW5nZWRSYW5nZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzLml0ZXJDaGFuZ2VkUmFuZ2VzKChmcm9tQSwgdG9BLCBmcm9tQiwgdG9CKSA9PiBjaGFuZ2VkUmFuZ2VzLnB1c2gobmV3IENoYW5nZWRSYW5nZShmcm9tQSwgdG9BLCBmcm9tQiwgdG9CKSkpO1xuICAgICAgICB0aGlzLmNoYW5nZWRSYW5nZXMgPSBjaGFuZ2VkUmFuZ2VzO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUodmlldywgc3RhdGUsIHRyYW5zYWN0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IFZpZXdVcGRhdGUodmlldywgc3RhdGUsIHRyYW5zYWN0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlbGxzIHlvdSB3aGV0aGVyIHRoZSBbdmlld3BvcnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnZpZXdwb3J0KSBvclxuICAgIFt2aXNpYmxlIHJhbmdlc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudmlzaWJsZVJhbmdlcykgY2hhbmdlZCBpbiB0aGlzXG4gICAgdXBkYXRlLlxuICAgICovXG4gICAgZ2V0IHZpZXdwb3J0Q2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgNCAvKiBVcGRhdGVGbGFnLlZpZXdwb3J0ICovKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBoZWlnaHQgb2YgYSBibG9jayBlbGVtZW50IGluIHRoZSBlZGl0b3JcbiAgICBjaGFuZ2VkIGluIHRoaXMgdXBkYXRlLlxuICAgICovXG4gICAgZ2V0IGhlaWdodENoYW5nZWQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5mbGFncyAmIDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi8pID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIHdoZW4gdGhlIGRvY3VtZW50IHdhcyBtb2RpZmllZCBvciB0aGUgc2l6ZSBvZiB0aGVcbiAgICBlZGl0b3IsIG9yIGVsZW1lbnRzIHdpdGhpbiB0aGUgZWRpdG9yLCBjaGFuZ2VkLlxuICAgICovXG4gICAgZ2V0IGdlb21ldHJ5Q2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jQ2hhbmdlZCB8fCAodGhpcy5mbGFncyAmICg4IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi8gfCAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKSkgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyB1cGRhdGUgaW5kaWNhdGVzIGEgZm9jdXMgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IGZvY3VzQ2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgMSAvKiBVcGRhdGVGbGFnLkZvY3VzICovKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIGRvY3VtZW50IGNoYW5nZWQgaW4gdGhpcyB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgZG9jQ2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNoYW5nZXMuZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiB3YXMgZXhwbGljaXRseSBzZXQgaW4gdGhpcyB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgc2VsZWN0aW9uU2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5zZWxlY3Rpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBlbXB0eSgpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgPT0gMCAmJiB0aGlzLnRyYW5zYWN0aW9ucy5sZW5ndGggPT0gMDsgfVxufVxuXG5jbGFzcyBEb2NWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnZpZXcuc3RhdGUuZG9jLmxlbmd0aDsgfVxuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwID0gW107XG4gICAgICAgIHRoaXMuZG9tQ2hhbmdlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFzQ29tcG9zaXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLm1hcmtlZEZvckNvbXBvc2l0aW9uID0gbmV3IFNldDtcbiAgICAgICAgLy8gVHJhY2sgYSBtaW5pbXVtIHdpZHRoIGZvciB0aGUgZWRpdG9yLiBXaGVuIG1lYXN1cmluZyBzaXplcyBpblxuICAgICAgICAvLyBtZWFzdXJlVmlzaWJsZUxpbmVIZWlnaHRzLCB0aGlzIGlzIHVwZGF0ZWQgdG8gcG9pbnQgYXQgdGhlIHdpZHRoXG4gICAgICAgIC8vIG9mIGEgZ2l2ZW4gZWxlbWVudCBhbmQgaXRzIGV4dGVudCBpbiB0aGUgZG9jdW1lbnQuIFdoZW4gYSBjaGFuZ2VcbiAgICAgICAgLy8gaGFwcGVucyBpbiB0aGF0IHJhbmdlLCB0aGVzZSBhcmUgcmVzZXQuIFRoYXQgd2F5LCBvbmNlIHdlJ3ZlIHNlZW5cbiAgICAgICAgLy8gYSBsaW5lL2VsZW1lbnQgb2YgYSBnaXZlbiBsZW5ndGgsIHdlIGtlZXAgdGhlIGVkaXRvciB3aWRlIGVub3VnaFxuICAgICAgICAvLyB0byBmaXQgYXQgbGVhc3QgdGhhdCBlbGVtZW50LCB1bnRpbCBpdCBpcyBjaGFuZ2VkLCBhdCB3aGljaCBwb2ludFxuICAgICAgICAvLyB3ZSBmb3JnZXQgaXQgYWdhaW4uXG4gICAgICAgIHRoaXMubWluV2lkdGggPSAwO1xuICAgICAgICB0aGlzLm1pbldpZHRoRnJvbSA9IDA7XG4gICAgICAgIHRoaXMubWluV2lkdGhUbyA9IDA7XG4gICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgdGhlIERPTSBzZWxlY3Rpb24gd2FzIHNldCBpbiBhIGxvc3N5IHdheSwgc28gdGhhdFxuICAgICAgICAvLyB3ZSBkb24ndCBtZXNzIGl0IHVwIHdoZW4gcmVhZGluZyBpdCBiYWNrIGl0XG4gICAgICAgIHRoaXMuaW1wcmVjaXNlQW5jaG9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbXByZWNpc2VIZWFkID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb3JjZVNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICAvLyBVc2VkIGJ5IHRoZSByZXNpemUgb2JzZXJ2ZXIgdG8gaWdub3JlIHJlc2l6ZXMgdGhhdCB3ZSBjYXVzZWRcbiAgICAgICAgLy8gb3Vyc2VsdmVzXG4gICAgICAgIHRoaXMubGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuc2V0RE9NKHZpZXcuY29udGVudERPTSk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbbmV3IExpbmVWaWV3XTtcbiAgICAgICAgdGhpcy5jaGlsZHJlblswXS5zZXRQYXJlbnQodGhpcyk7XG4gICAgICAgIHRoaXMudXBkYXRlRGVjbygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUlubmVyKFtuZXcgQ2hhbmdlZFJhbmdlKDAsIDAsIDAsIHZpZXcuc3RhdGUuZG9jLmxlbmd0aCldLCAwLCBudWxsKTtcbiAgICB9XG4gICAgLy8gVXBkYXRlIHRoZSBkb2N1bWVudCB2aWV3IHRvIGEgZ2l2ZW4gc3RhdGUuXG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBjaGFuZ2VkUmFuZ2VzID0gdXBkYXRlLmNoYW5nZWRSYW5nZXM7XG4gICAgICAgIGlmICh0aGlzLm1pbldpZHRoID4gMCAmJiBjaGFuZ2VkUmFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2VkUmFuZ2VzLmV2ZXJ5KCh7IGZyb21BLCB0b0EgfSkgPT4gdG9BIDwgdGhpcy5taW5XaWR0aEZyb20gfHwgZnJvbUEgPiB0aGlzLm1pbldpZHRoVG8pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aCA9IHRoaXMubWluV2lkdGhGcm9tID0gdGhpcy5taW5XaWR0aFRvID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubWluV2lkdGhGcm9tID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHRoaXMubWluV2lkdGhGcm9tLCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoVG8gPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModGhpcy5taW5XaWR0aFRvLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVhZENvbXBvc2l0aW9uQXQgPSAtMTtcbiAgICAgICAgaWYgKHRoaXMudmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwKSB7XG4gICAgICAgICAgICBpZiAoKF9hID0gdGhpcy5kb21DaGFuZ2VkKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmV3U2VsKVxuICAgICAgICAgICAgICAgIHJlYWRDb21wb3NpdGlvbkF0ID0gdGhpcy5kb21DaGFuZ2VkLm5ld1NlbC5oZWFkO1xuICAgICAgICAgICAgZWxzZSBpZiAoIXRvdWNoZXNDb21wb3NpdGlvbih1cGRhdGUuY2hhbmdlcywgdGhpcy5oYXNDb21wb3NpdGlvbikgJiYgIXVwZGF0ZS5zZWxlY3Rpb25TZXQpXG4gICAgICAgICAgICAgICAgcmVhZENvbXBvc2l0aW9uQXQgPSB1cGRhdGUuc3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29tcG9zaXRpb24gPSByZWFkQ29tcG9zaXRpb25BdCA+IC0xID8gZmluZENvbXBvc2l0aW9uUmFuZ2UodGhpcy52aWV3LCB1cGRhdGUuY2hhbmdlcywgcmVhZENvbXBvc2l0aW9uQXQpIDogbnVsbDtcbiAgICAgICAgdGhpcy5kb21DaGFuZ2VkID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24uY2xlYXIoKTtcbiAgICAgICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSB0aGlzLmhhc0NvbXBvc2l0aW9uO1xuICAgICAgICAgICAgY2hhbmdlZFJhbmdlcyA9IG5ldyBDaGFuZ2VkUmFuZ2UoZnJvbSwgdG8sIHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyhmcm9tLCAtMSksIHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh0bywgMSkpXG4gICAgICAgICAgICAgICAgLmFkZFRvU2V0KGNoYW5nZWRSYW5nZXMuc2xpY2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYXNDb21wb3NpdGlvbiA9IGNvbXBvc2l0aW9uID8geyBmcm9tOiBjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiwgdG86IGNvbXBvc2l0aW9uLnJhbmdlLnRvQiB9IDogbnVsbDtcbiAgICAgICAgLy8gV2hlbiB0aGUgRE9NIG5vZGVzIGFyb3VuZCB0aGUgc2VsZWN0aW9uIGFyZSBtb3ZlZCB0byBhbm90aGVyXG4gICAgICAgIC8vIHBhcmVudCwgQ2hyb21lIHNvbWV0aW1lcyByZXBvcnRzIGEgZGlmZmVyZW50IHNlbGVjdGlvbiB0aHJvdWdoXG4gICAgICAgIC8vIGdldFNlbGVjdGlvbiB0aGFuIHRoZSBvbmUgdGhhdCBpdCBhY3R1YWxseSBzaG93cyB0byB0aGUgdXNlci5cbiAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBzZWxlY3Rpb24gdXBkYXRlIHdoZW4gbGluZXMgYXJlIGpvaW5lZCB0byB3b3JrXG4gICAgICAgIC8vIGFyb3VuZCB0aGF0LiBJc3N1ZSAjNTRcbiAgICAgICAgaWYgKChicm93c2VyLmllIHx8IGJyb3dzZXIuY2hyb21lKSAmJiAhY29tcG9zaXRpb24gJiYgdXBkYXRlICYmXG4gICAgICAgICAgICB1cGRhdGUuc3RhdGUuZG9jLmxpbmVzICE9IHVwZGF0ZS5zdGFydFN0YXRlLmRvYy5saW5lcylcbiAgICAgICAgICAgIHRoaXMuZm9yY2VTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICBsZXQgcHJldkRlY28gPSB0aGlzLmRlY29yYXRpb25zLCBkZWNvID0gdGhpcy51cGRhdGVEZWNvKCk7XG4gICAgICAgIGxldCBkZWNvRGlmZiA9IGZpbmRDaGFuZ2VkRGVjbyhwcmV2RGVjbywgZGVjbywgdXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICBjaGFuZ2VkUmFuZ2VzID0gQ2hhbmdlZFJhbmdlLmV4dGVuZFdpdGhSYW5nZXMoY2hhbmdlZFJhbmdlcywgZGVjb0RpZmYpO1xuICAgICAgICBpZiAoISh0aGlzLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLykgJiYgY2hhbmdlZFJhbmdlcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJbm5lcihjaGFuZ2VkUmFuZ2VzLCB1cGRhdGUuc3RhcnRTdGF0ZS5kb2MubGVuZ3RoLCBjb21wb3NpdGlvbik7XG4gICAgICAgICAgICBpZiAodXBkYXRlLnRyYW5zYWN0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFVzZWQgYnkgdXBkYXRlIGFuZCB0aGUgY29uc3RydWN0b3IgZG8gcGVyZm9ybSB0aGUgYWN0dWFsIERPTVxuICAgIC8vIHVwZGF0ZVxuICAgIHVwZGF0ZUlubmVyKGNoYW5nZXMsIG9sZExlbmd0aCwgY29tcG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy52aWV3LnZpZXdTdGF0ZS5tdXN0TWVhc3VyZUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKGNoYW5nZXMsIG9sZExlbmd0aCwgY29tcG9zaXRpb24pO1xuICAgICAgICBsZXQgeyBvYnNlcnZlciB9ID0gdGhpcy52aWV3O1xuICAgICAgICBvYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gTG9jayB0aGUgaGVpZ2h0IGR1cmluZyByZWRyYXdpbmcsIHNpbmNlIENocm9tZSBzb21ldGltZXNcbiAgICAgICAgICAgIC8vIG1lc3NlcyB3aXRoIHRoZSBzY3JvbGwgcG9zaXRpb24gZHVyaW5nIERPTSBtdXRhdGlvbiAodGhvdWdoXG4gICAgICAgICAgICAvLyBubyByZWxheW91dCBpcyB0cmlnZ2VyZWQgYW5kIEkgY2Fubm90IGltYWdpbmUgaG93IGl0IGNhblxuICAgICAgICAgICAgLy8gcmVjb21wdXRlIHRoZSBzY3JvbGwgcG9zaXRpb24gd2l0aG91dCBhIGxheW91dClcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmhlaWdodCA9IHRoaXMudmlldy52aWV3U3RhdGUuY29udGVudEhlaWdodCAvIHRoaXMudmlldy5zY2FsZVkgKyBcInB4XCI7XG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5mbGV4QmFzaXMgPSB0aGlzLm1pbldpZHRoID8gdGhpcy5taW5XaWR0aCArIFwicHhcIiA6IFwiXCI7XG4gICAgICAgICAgICAvLyBDaHJvbWUgd2lsbCBzb21ldGltZXMsIHdoZW4gRE9NIG11dGF0aW9ucyBvY2N1ciBkaXJlY3RseVxuICAgICAgICAgICAgLy8gYXJvdW5kIHRoZSBzZWxlY3Rpb24sIGdldCBjb25mdXNlZCBhbmQgcmVwb3J0IGEgZGlmZmVyZW50XG4gICAgICAgICAgICAvLyBzZWxlY3Rpb24gZnJvbSB0aGUgb25lIGl0IGRpc3BsYXlzIChpc3N1ZSAjMjE4KS4gVGhpcyB0cmllc1xuICAgICAgICAgICAgLy8gdG8gZGV0ZWN0IHRoYXQgc2l0dWF0aW9uLlxuICAgICAgICAgICAgbGV0IHRyYWNrID0gYnJvd3Nlci5jaHJvbWUgfHwgYnJvd3Nlci5pb3MgPyB7IG5vZGU6IG9ic2VydmVyLnNlbGVjdGlvblJhbmdlLmZvY3VzTm9kZSwgd3JpdHRlbjogZmFsc2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLnZpZXcsIHRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3MgJj0gfjcgLyogVmlld0ZsYWcuRGlydHkgKi87XG4gICAgICAgICAgICBpZiAodHJhY2sgJiYgKHRyYWNrLndyaXR0ZW4gfHwgb2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2UuZm9jdXNOb2RlICE9IHRyYWNrLm5vZGUpKVxuICAgICAgICAgICAgICAgIHRoaXMuZm9yY2VTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gXCJcIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24uZm9yRWFjaChjVmlldyA9PiBjVmlldy5mbGFncyAmPSB+OCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLyk7XG4gICAgICAgIGxldCBnYXBzID0gW107XG4gICAgICAgIGlmICh0aGlzLnZpZXcudmlld3BvcnQuZnJvbSB8fCB0aGlzLnZpZXcudmlld3BvcnQudG8gPCB0aGlzLnZpZXcuc3RhdGUuZG9jLmxlbmd0aClcbiAgICAgICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQmxvY2tXaWRnZXRWaWV3ICYmIGNoaWxkLndpZGdldCBpbnN0YW5jZW9mIEJsb2NrR2FwV2lkZ2V0KVxuICAgICAgICAgICAgICAgICAgICBnYXBzLnB1c2goY2hpbGQuZG9tKTtcbiAgICAgICAgb2JzZXJ2ZXIudXBkYXRlR2FwcyhnYXBzKTtcbiAgICB9XG4gICAgdXBkYXRlQ2hpbGRyZW4oY2hhbmdlcywgb2xkTGVuZ3RoLCBjb21wb3NpdGlvbikge1xuICAgICAgICBsZXQgcmFuZ2VzID0gY29tcG9zaXRpb24gPyBjb21wb3NpdGlvbi5yYW5nZS5hZGRUb1NldChjaGFuZ2VzLnNsaWNlKCkpIDogY2hhbmdlcztcbiAgICAgICAgbGV0IGN1cnNvciA9IHRoaXMuY2hpbGRDdXJzb3Iob2xkTGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHJhbmdlcy5sZW5ndGggLSAxOzsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGkgPj0gMCA/IHJhbmdlc1tpXSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoIW5leHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgeyBmcm9tQSwgdG9BLCBmcm9tQiwgdG9CIH0gPSBuZXh0LCBjb250ZW50LCBicmVha0F0U3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZDtcbiAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbiAmJiBjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiA8IHRvQiAmJiBjb21wb3NpdGlvbi5yYW5nZS50b0IgPiBmcm9tQikge1xuICAgICAgICAgICAgICAgIGxldCBiZWZvcmUgPSBDb250ZW50QnVpbGRlci5idWlsZCh0aGlzLnZpZXcuc3RhdGUuZG9jLCBmcm9tQiwgY29tcG9zaXRpb24ucmFuZ2UuZnJvbUIsIHRoaXMuZGVjb3JhdGlvbnMsIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXApO1xuICAgICAgICAgICAgICAgIGxldCBhZnRlciA9IENvbnRlbnRCdWlsZGVyLmJ1aWxkKHRoaXMudmlldy5zdGF0ZS5kb2MsIGNvbXBvc2l0aW9uLnJhbmdlLnRvQiwgdG9CLCB0aGlzLmRlY29yYXRpb25zLCB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwKTtcbiAgICAgICAgICAgICAgICBicmVha0F0U3RhcnQgPSBiZWZvcmUuYnJlYWtBdFN0YXJ0O1xuICAgICAgICAgICAgICAgIG9wZW5TdGFydCA9IGJlZm9yZS5vcGVuU3RhcnQ7XG4gICAgICAgICAgICAgICAgb3BlbkVuZCA9IGFmdGVyLm9wZW5FbmQ7XG4gICAgICAgICAgICAgICAgbGV0IGNvbXBMaW5lID0gdGhpcy5jb21wb3NpdGlvblZpZXcoY29tcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGlmIChhZnRlci5icmVha0F0U3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcExpbmUuYnJlYWtBZnRlciA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFmdGVyLmNvbnRlbnQubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbXBMaW5lLm1lcmdlKGNvbXBMaW5lLmxlbmd0aCwgY29tcExpbmUubGVuZ3RoLCBhZnRlci5jb250ZW50WzBdLCBmYWxzZSwgYWZ0ZXIub3BlblN0YXJ0LCAwKSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wTGluZS5icmVha0FmdGVyID0gYWZ0ZXIuY29udGVudFswXS5icmVha0FmdGVyO1xuICAgICAgICAgICAgICAgICAgICBhZnRlci5jb250ZW50LnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChiZWZvcmUuY29udGVudC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgY29tcExpbmUubWVyZ2UoMCwgMCwgYmVmb3JlLmNvbnRlbnRbYmVmb3JlLmNvbnRlbnQubGVuZ3RoIC0gMV0sIHRydWUsIDAsIGJlZm9yZS5vcGVuRW5kKSkge1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmUuY29udGVudC5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGJlZm9yZS5jb250ZW50LmNvbmNhdChjb21wTGluZSkuY29uY2F0KGFmdGVyLmNvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgKHsgY29udGVudCwgYnJlYWtBdFN0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9XG4gICAgICAgICAgICAgICAgICAgIENvbnRlbnRCdWlsZGVyLmJ1aWxkKHRoaXMudmlldy5zdGF0ZS5kb2MsIGZyb21CLCB0b0IsIHRoaXMuZGVjb3JhdGlvbnMsIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB7IGk6IHRvSSwgb2ZmOiB0b09mZiB9ID0gY3Vyc29yLmZpbmRQb3ModG9BLCAxKTtcbiAgICAgICAgICAgIGxldCB7IGk6IGZyb21JLCBvZmY6IGZyb21PZmYgfSA9IGN1cnNvci5maW5kUG9zKGZyb21BLCAtMSk7XG4gICAgICAgICAgICByZXBsYWNlUmFuZ2UodGhpcywgZnJvbUksIGZyb21PZmYsIHRvSSwgdG9PZmYsIGNvbnRlbnQsIGJyZWFrQXRTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcG9zaXRpb24pXG4gICAgICAgICAgICB0aGlzLmZpeENvbXBvc2l0aW9uRE9NKGNvbXBvc2l0aW9uKTtcbiAgICB9XG4gICAgY29tcG9zaXRpb25WaWV3KGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBjdXIgPSBuZXcgVGV4dFZpZXcoY29tcG9zaXRpb24udGV4dC5ub2RlVmFsdWUpO1xuICAgICAgICBjdXIuZmxhZ3MgfD0gOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLztcbiAgICAgICAgZm9yIChsZXQgeyBkZWNvIH0gb2YgY29tcG9zaXRpb24ubWFya3MpXG4gICAgICAgICAgICBjdXIgPSBuZXcgTWFya1ZpZXcoZGVjbywgW2N1cl0sIGN1ci5sZW5ndGgpO1xuICAgICAgICBsZXQgbGluZSA9IG5ldyBMaW5lVmlldztcbiAgICAgICAgbGluZS5hcHBlbmQoY3VyLCAwKTtcbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfVxuICAgIGZpeENvbXBvc2l0aW9uRE9NKGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBmaXggPSAoZG9tLCBjVmlldykgPT4ge1xuICAgICAgICAgICAgY1ZpZXcuZmxhZ3MgfD0gOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLyB8IChjVmlldy5jaGlsZHJlbi5zb21lKGMgPT4gYy5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pID8gMSAvKiBWaWV3RmxhZy5DaGlsZERpcnR5ICovIDogMCk7XG4gICAgICAgICAgICB0aGlzLm1hcmtlZEZvckNvbXBvc2l0aW9uLmFkZChjVmlldyk7XG4gICAgICAgICAgICBsZXQgcHJldiA9IENvbnRlbnRWaWV3LmdldChkb20pO1xuICAgICAgICAgICAgaWYgKHByZXYgJiYgcHJldiAhPSBjVmlldylcbiAgICAgICAgICAgICAgICBwcmV2LmRvbSA9IG51bGw7XG4gICAgICAgICAgICBjVmlldy5zZXRET00oZG9tKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuY2hpbGRQb3MoY29tcG9zaXRpb24ucmFuZ2UuZnJvbUIsIDEpO1xuICAgICAgICBsZXQgY1ZpZXcgPSB0aGlzLmNoaWxkcmVuW3Bvcy5pXTtcbiAgICAgICAgZml4KGNvbXBvc2l0aW9uLmxpbmUsIGNWaWV3KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGNvbXBvc2l0aW9uLm1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gLTE7IGktLSkge1xuICAgICAgICAgICAgcG9zID0gY1ZpZXcuY2hpbGRQb3MocG9zLm9mZiwgMSk7XG4gICAgICAgICAgICBjVmlldyA9IGNWaWV3LmNoaWxkcmVuW3Bvcy5pXTtcbiAgICAgICAgICAgIGZpeChpID49IDAgPyBjb21wb3NpdGlvbi5tYXJrc1tpXS5ub2RlIDogY29tcG9zaXRpb24udGV4dCwgY1ZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFN5bmMgdGhlIERPTSBzZWxlY3Rpb24gdG8gdGhpcy5zdGF0ZS5zZWxlY3Rpb25cbiAgICB1cGRhdGVTZWxlY3Rpb24obXVzdFJlYWQgPSBmYWxzZSwgZnJvbVBvaW50ZXIgPSBmYWxzZSkge1xuICAgICAgICBpZiAobXVzdFJlYWQgfHwgIXRoaXMudmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZS5mb2N1c05vZGUpXG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBhY3RpdmVFbHQgPSB0aGlzLnZpZXcucm9vdC5hY3RpdmVFbGVtZW50LCBmb2N1c2VkID0gYWN0aXZlRWx0ID09IHRoaXMuZG9tO1xuICAgICAgICBsZXQgc2VsZWN0aW9uTm90Rm9jdXMgPSAhZm9jdXNlZCAmJlxuICAgICAgICAgICAgaGFzU2VsZWN0aW9uKHRoaXMuZG9tLCB0aGlzLnZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2UpICYmICEoYWN0aXZlRWx0ICYmIHRoaXMuZG9tLmNvbnRhaW5zKGFjdGl2ZUVsdCkpO1xuICAgICAgICBpZiAoIShmb2N1c2VkIHx8IGZyb21Qb2ludGVyIHx8IHNlbGVjdGlvbk5vdEZvY3VzKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGZvcmNlID0gdGhpcy5mb3JjZVNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5mb3JjZVNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICBsZXQgbWFpbiA9IHRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgbGV0IGFuY2hvciA9IHRoaXMubW92ZVRvTGluZSh0aGlzLmRvbUF0UG9zKG1haW4uYW5jaG9yKSk7XG4gICAgICAgIGxldCBoZWFkID0gbWFpbi5lbXB0eSA/IGFuY2hvciA6IHRoaXMubW92ZVRvTGluZSh0aGlzLmRvbUF0UG9zKG1haW4uaGVhZCkpO1xuICAgICAgICAvLyBBbHdheXMgcmVzZXQgb24gRmlyZWZveCB3aGVuIG5leHQgdG8gYW4gdW5lZGl0YWJsZSBub2RlIHRvXG4gICAgICAgIC8vIGF2b2lkIGludmlzaWJsZSBjdXJzb3IgYnVncyAoIzExMSlcbiAgICAgICAgaWYgKGJyb3dzZXIuZ2Vja28gJiYgbWFpbi5lbXB0eSAmJiAhdGhpcy5oYXNDb21wb3NpdGlvbiAmJiBiZXR3ZWVuVW5lZGl0YWJsZShhbmNob3IpKSB7XG4gICAgICAgICAgICBsZXQgZHVtbXkgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5pZ25vcmUoKCkgPT4gYW5jaG9yLm5vZGUuaW5zZXJ0QmVmb3JlKGR1bW15LCBhbmNob3Iubm9kZS5jaGlsZE5vZGVzW2FuY2hvci5vZmZzZXRdIHx8IG51bGwpKTtcbiAgICAgICAgICAgIGFuY2hvciA9IGhlYWQgPSBuZXcgRE9NUG9zKGR1bW15LCAwKTtcbiAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZG9tU2VsID0gdGhpcy52aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGFscmVhZHkgaGVyZSwgb3IgaW4gYW4gZXF1aXZhbGVudCBwb3NpdGlvbiwgZG9uJ3QgdG91Y2ggaXRcbiAgICAgICAgaWYgKGZvcmNlIHx8ICFkb21TZWwuZm9jdXNOb2RlIHx8ICghaXNFcXVpdmFsZW50UG9zaXRpb24oYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQsIGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KSB8fFxuICAgICAgICAgICAgIWlzRXF1aXZhbGVudFBvc2l0aW9uKGhlYWQubm9kZSwgaGVhZC5vZmZzZXQsIGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCkpICYmICF0aGlzLnN1cHByZXNzV2lkZ2V0Q3Vyc29yQ2hhbmdlKGRvbVNlbCwgbWFpbikpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENocm9tZSBBbmRyb2lkIHdpbGwgaGlkZSB0aGUgdmlydHVhbCBrZXlib2FyZCB3aGVuIHRhcHBpbmdcbiAgICAgICAgICAgICAgICAvLyBpbnNpZGUgYW4gdW5lZGl0YWJsZSBub2RlLCBhbmQgbm90IGJyaW5nIGl0IGJhY2sgd2hlbiB3ZVxuICAgICAgICAgICAgICAgIC8vIG1vdmUgdGhlIGN1cnNvciB0byBpdHMgcHJvcGVyIHBvc2l0aW9uLiBUaGlzIHRyaWVzIHRvXG4gICAgICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUga2V5Ym9hcmQgYnkgY3ljbGluZyBmb2N1cy5cbiAgICAgICAgICAgICAgICBpZiAoYnJvd3Nlci5hbmRyb2lkICYmIGJyb3dzZXIuY2hyb21lICYmIHRoaXMuZG9tLmNvbnRhaW5zKGRvbVNlbC5mb2N1c05vZGUpICYmXG4gICAgICAgICAgICAgICAgICAgIGluVW5lZGl0YWJsZShkb21TZWwuZm9jdXNOb2RlLCB0aGlzLmRvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uYmx1cigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByYXdTZWwgPSBnZXRTZWxlY3Rpb24odGhpcy52aWV3LnJvb3QpO1xuICAgICAgICAgICAgICAgIGlmICghcmF3U2VsKSA7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWFpbi5lbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXb3JrIGFyb3VuZCBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjEyMDc2XG4gICAgICAgICAgICAgICAgICAgIGlmIChicm93c2VyLmdlY2tvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFRvID0gbmV4dFRvVW5lZGl0YWJsZShhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFRvICYmIG5leHRUbyAhPSAoMSAvKiBOZXh0VG8uQmVmb3JlICovIHwgMiAvKiBOZXh0VG8uQWZ0ZXIgKi8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQgPSBuZWFyYnlUZXh0Tm9kZShhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCwgbmV4dFRvID09IDEgLyogTmV4dFRvLkJlZm9yZSAqLyA/IDEgOiAtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvciA9IG5ldyBET01Qb3ModGV4dC5ub2RlLCB0ZXh0Lm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmNvbGxhcHNlKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1haW4uYmlkaUxldmVsICE9IG51bGwgJiYgcmF3U2VsLmNhcmV0QmlkaUxldmVsICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdTZWwuY2FyZXRCaWRpTGV2ZWwgPSBtYWluLmJpZGlMZXZlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmF3U2VsLmV4dGVuZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3Rpb24uZXh0ZW5kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiAnaW52ZXJ0ZWQnIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAvLyAob25lIHdoZXJlIHRoZSBmb2N1cyBpcyBiZWZvcmUgdGhlIGFuY2hvciksIGJ1dCBub3QgYWxsXG4gICAgICAgICAgICAgICAgICAgIC8vIGJyb3dzZXJzIHN1cHBvcnQgaXQgeWV0LlxuICAgICAgICAgICAgICAgICAgICByYXdTZWwuY29sbGFwc2UoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTYWZhcmkgd2lsbCBpZ25vcmUgdGhlIGNhbGwgYWJvdmUgd2hlbiB0aGUgZWRpdG9yIGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIGhpZGRlbiwgYW5kIHRoZW4gcmFpc2UgYW4gZXJyb3Igb24gdGhlIGNhbGwgdG8gZXh0ZW5kXG4gICAgICAgICAgICAgICAgICAgIC8vICgjOTQwKS5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd1NlbC5leHRlbmQoaGVhZC5ub2RlLCBoZWFkLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJpbWl0aXZlIChJRSkgd2F5XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYWluLmFuY2hvciA+IG1haW4uaGVhZClcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbmNob3IsIGhlYWRdID0gW2hlYWQsIGFuY2hvcl07XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZChoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICByYXdTZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHJhd1NlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25Ob3RGb2N1cyAmJiB0aGlzLnZpZXcucm9vdC5hY3RpdmVFbGVtZW50ID09IHRoaXMuZG9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUVsdClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUVsdC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLnNldFNlbGVjdGlvblJhbmdlKGFuY2hvciwgaGVhZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbXByZWNpc2VBbmNob3IgPSBhbmNob3IucHJlY2lzZSA/IG51bGwgOiBuZXcgRE9NUG9zKGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KTtcbiAgICAgICAgdGhpcy5pbXByZWNpc2VIZWFkID0gaGVhZC5wcmVjaXNlID8gbnVsbCA6IG5ldyBET01Qb3MoZG9tU2VsLmZvY3VzTm9kZSwgZG9tU2VsLmZvY3VzT2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gSWYgYSB6ZXJvLWxlbmd0aCB3aWRnZXQgaXMgaW5zZXJ0ZWQgbmV4dCB0byB0aGUgY3Vyc29yIGR1cmluZ1xuICAgIC8vIGNvbXBvc2l0aW9uLCBhdm9pZCBtb3ZpbmcgaXQgYWNyb3NzIGl0IGFuZCBkaXNydXB0aW5nIHRoZVxuICAgIC8vIGNvbXBvc2l0aW9uLlxuICAgIHN1cHByZXNzV2lkZ2V0Q3Vyc29yQ2hhbmdlKHNlbCwgY3Vyc29yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0NvbXBvc2l0aW9uICYmIGN1cnNvci5lbXB0eSAmJlxuICAgICAgICAgICAgaXNFcXVpdmFsZW50UG9zaXRpb24oc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0LCBzZWwuYW5jaG9yTm9kZSwgc2VsLmFuY2hvck9mZnNldCkgJiZcbiAgICAgICAgICAgIHRoaXMucG9zRnJvbURPTShzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQpID09IGN1cnNvci5oZWFkO1xuICAgIH1cbiAgICBlbmZvcmNlQ3Vyc29yQXNzb2MoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbXBvc2l0aW9uKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzLCBjdXJzb3IgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgICAgICBsZXQgc2VsID0gZ2V0U2VsZWN0aW9uKHZpZXcucm9vdCk7XG4gICAgICAgIGxldCB7IGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCB9ID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgaWYgKCFzZWwgfHwgIWN1cnNvci5lbXB0eSB8fCAhY3Vyc29yLmFzc29jIHx8ICFzZWwubW9kaWZ5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbGluZSA9IExpbmVWaWV3LmZpbmQodGhpcywgY3Vyc29yLmhlYWQpO1xuICAgICAgICBpZiAoIWxpbmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBsaW5lU3RhcnQgPSBsaW5lLnBvc0F0U3RhcnQ7XG4gICAgICAgIGlmIChjdXJzb3IuaGVhZCA9PSBsaW5lU3RhcnQgfHwgY3Vyc29yLmhlYWQgPT0gbGluZVN0YXJ0ICsgbGluZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBiZWZvcmUgPSB0aGlzLmNvb3Jkc0F0KGN1cnNvci5oZWFkLCAtMSksIGFmdGVyID0gdGhpcy5jb29yZHNBdChjdXJzb3IuaGVhZCwgMSk7XG4gICAgICAgIGlmICghYmVmb3JlIHx8ICFhZnRlciB8fCBiZWZvcmUuYm90dG9tID4gYWZ0ZXIudG9wKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgZG9tID0gdGhpcy5kb21BdFBvcyhjdXJzb3IuaGVhZCArIGN1cnNvci5hc3NvYyk7XG4gICAgICAgIHNlbC5jb2xsYXBzZShkb20ubm9kZSwgZG9tLm9mZnNldCk7XG4gICAgICAgIHNlbC5tb2RpZnkoXCJtb3ZlXCIsIGN1cnNvci5hc3NvYyA8IDAgPyBcImZvcndhcmRcIiA6IFwiYmFja3dhcmRcIiwgXCJsaW5lYm91bmRhcnlcIik7XG4gICAgICAgIC8vIFRoaXMgY2FuIGdvIHdyb25nIGluIGNvcm5lciBjYXNlcyBsaWtlIHNpbmdsZS1jaGFyYWN0ZXIgbGluZXMsXG4gICAgICAgIC8vIHNvIGNoZWNrIGFuZCByZXNldCBpZiBuZWNlc3NhcnkuXG4gICAgICAgIHZpZXcub2JzZXJ2ZXIucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBuZXdSYW5nZSA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgIGlmICh2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShuZXdSYW5nZS5hbmNob3JOb2RlLCBuZXdSYW5nZS5hbmNob3JPZmZzZXQpICE9IGN1cnNvci5mcm9tKVxuICAgICAgICAgICAgc2VsLmNvbGxhcHNlKGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCk7XG4gICAgfVxuICAgIC8vIElmIGEgcG9zaXRpb24gaXMgaW4vbmVhciBhIGJsb2NrIHdpZGdldCwgbW92ZSBpdCB0byBhIG5lYXJieSB0ZXh0XG4gICAgLy8gbGluZSwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0aGUgY3Vyc29yIGluc2lkZSBhIGJsb2NrIHdpZGdldC5cbiAgICBtb3ZlVG9MaW5lKHBvcykge1xuICAgICAgICAvLyBCbG9jayB3aWRnZXRzIHdpbGwgcmV0dXJuIHBvc2l0aW9ucyBiZWZvcmUvYWZ0ZXIgdGhlbSwgd2hpY2hcbiAgICAgICAgLy8gYXJlIHRodXMgZGlyZWN0bHkgaW4gdGhlIGRvY3VtZW50IERPTSBlbGVtZW50LlxuICAgICAgICBsZXQgZG9tID0gdGhpcy5kb20sIG5ld1BvcztcbiAgICAgICAgaWYgKHBvcy5ub2RlICE9IGRvbSlcbiAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgIGZvciAobGV0IGkgPSBwb3Mub2Zmc2V0OyAhbmV3UG9zICYmIGkgPCBkb20uY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZpZXcgPSBDb250ZW50Vmlldy5nZXQoZG9tLmNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBMaW5lVmlldylcbiAgICAgICAgICAgICAgICBuZXdQb3MgPSB2aWV3LmRvbUF0UG9zKDApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSBwb3Mub2Zmc2V0IC0gMTsgIW5ld1BvcyAmJiBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHZpZXcgPSBDb250ZW50Vmlldy5nZXQoZG9tLmNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBMaW5lVmlldylcbiAgICAgICAgICAgICAgICBuZXdQb3MgPSB2aWV3LmRvbUF0UG9zKHZpZXcubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3UG9zID8gbmV3IERPTVBvcyhuZXdQb3Mubm9kZSwgbmV3UG9zLm9mZnNldCwgdHJ1ZSkgOiBwb3M7XG4gICAgfVxuICAgIG5lYXJlc3QoZG9tKSB7XG4gICAgICAgIGZvciAobGV0IGN1ciA9IGRvbTsgY3VyOykge1xuICAgICAgICAgICAgbGV0IGRvbVZpZXcgPSBDb250ZW50Vmlldy5nZXQoY3VyKTtcbiAgICAgICAgICAgIGlmIChkb21WaWV3ICYmIGRvbVZpZXcucm9vdFZpZXcgPT0gdGhpcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9tVmlldztcbiAgICAgICAgICAgIGN1ciA9IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBwb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkge1xuICAgICAgICBsZXQgdmlldyA9IHRoaXMubmVhcmVzdChub2RlKTtcbiAgICAgICAgaWYgKCF2aWV3KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUcnlpbmcgdG8gZmluZCBwb3NpdGlvbiBmb3IgYSBET00gcG9zaXRpb24gb3V0c2lkZSBvZiB0aGUgZG9jdW1lbnRcIik7XG4gICAgICAgIHJldHVybiB2aWV3LmxvY2FsUG9zRnJvbURPTShub2RlLCBvZmZzZXQpICsgdmlldy5wb3NBdFN0YXJ0O1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgbGV0IHsgaSwgb2ZmIH0gPSB0aGlzLmNoaWxkQ3Vyc29yKCkuZmluZFBvcyhwb3MsIC0xKTtcbiAgICAgICAgZm9yICg7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDE7KSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKG9mZiA8IGNoaWxkLmxlbmd0aCB8fCBjaGlsZCBpbnN0YW5jZW9mIExpbmVWaWV3KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgb2ZmID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltpXS5kb21BdFBvcyhvZmYpO1xuICAgIH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IGJlc3QgPSBudWxsLCBiZXN0UG9zID0gMDtcbiAgICAgICAgZm9yIChsZXQgb2ZmID0gdGhpcy5sZW5ndGgsIGkgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBvZmYgLSBjaGlsZC5icmVha0FmdGVyLCBzdGFydCA9IGVuZCAtIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPCBwb3MpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPD0gcG9zICYmIChzdGFydCA8IHBvcyB8fCBjaGlsZC5jb3ZlcnMoLTEpKSAmJiAoZW5kID4gcG9zIHx8IGNoaWxkLmNvdmVycygxKSkgJiZcbiAgICAgICAgICAgICAgICAoIWJlc3QgfHwgY2hpbGQgaW5zdGFuY2VvZiBMaW5lVmlldyAmJiAhKGJlc3QgaW5zdGFuY2VvZiBMaW5lVmlldyAmJiBzaWRlID49IDApKSkge1xuICAgICAgICAgICAgICAgIGJlc3QgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICBiZXN0UG9zID0gc3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmYgPSBzdGFydDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmVzdCA/IGJlc3QuY29vcmRzQXQocG9zIC0gYmVzdFBvcywgc2lkZSkgOiBudWxsO1xuICAgIH1cbiAgICBjb29yZHNGb3JDaGFyKHBvcykge1xuICAgICAgICBsZXQgeyBpLCBvZmYgfSA9IHRoaXMuY2hpbGRQb3MocG9zLCAxKSwgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIExpbmVWaWV3KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB3aGlsZSAoY2hpbGQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgeyBpLCBvZmY6IGNoaWxkT2ZmIH0gPSBjaGlsZC5jaGlsZFBvcyhvZmYsIDEpO1xuICAgICAgICAgICAgZm9yICg7OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBjaGlsZC5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmICgoY2hpbGQgPSBjaGlsZC5jaGlsZHJlbltpXSkubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IGNoaWxkT2ZmO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgVGV4dFZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBlbmQgPSBmaW5kQ2x1c3RlckJyZWFrKGNoaWxkLnRleHQsIG9mZik7XG4gICAgICAgIGlmIChlbmQgPT0gb2ZmKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByZWN0cyA9IHRleHRSYW5nZShjaGlsZC5kb20sIG9mZiwgZW5kKS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2ldO1xuICAgICAgICAgICAgaWYgKGkgPT0gcmVjdHMubGVuZ3RoIC0gMSB8fCByZWN0LnRvcCA8IHJlY3QuYm90dG9tICYmIHJlY3QubGVmdCA8IHJlY3QucmlnaHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIG1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHModmlld3BvcnQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdLCB7IGZyb20sIHRvIH0gPSB2aWV3cG9ydDtcbiAgICAgICAgbGV0IGNvbnRlbnRXaWR0aCA9IHRoaXMudmlldy5jb250ZW50RE9NLmNsaWVudFdpZHRoO1xuICAgICAgICBsZXQgaXNXaWRlciA9IGNvbnRlbnRXaWR0aCA+IE1hdGgubWF4KHRoaXMudmlldy5zY3JvbGxET00uY2xpZW50V2lkdGgsIHRoaXMubWluV2lkdGgpICsgMTtcbiAgICAgICAgbGV0IHdpZGVzdCA9IC0xLCBsdHIgPSB0aGlzLnZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPiB0bylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChwb3MgPj0gZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZFJlY3QgPSBjaGlsZC5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGRSZWN0LmhlaWdodCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzV2lkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBjaGlsZC5kb20ubGFzdENoaWxkO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdHMgPSBsYXN0ID8gY2xpZW50UmVjdHNGb3IobGFzdCkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tyZWN0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IGx0ciA/IHJlY3QucmlnaHQgLSBjaGlsZFJlY3QubGVmdCA6IGNoaWxkUmVjdC5yaWdodCAtIHJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IHdpZGVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGVzdCA9IHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluV2lkdGggPSBjb250ZW50V2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aEZyb20gPSBwb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aFRvID0gZW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gZW5kICsgY2hpbGQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0ZXh0RGlyZWN0aW9uQXQocG9zKSB7XG4gICAgICAgIGxldCB7IGkgfSA9IHRoaXMuY2hpbGRQb3MocG9zLCAxKTtcbiAgICAgICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGlsZHJlbltpXS5kb20pLmRpcmVjdGlvbiA9PSBcInJ0bFwiID8gRGlyZWN0aW9uLlJUTCA6IERpcmVjdGlvbi5MVFI7XG4gICAgfVxuICAgIG1lYXN1cmVUZXh0U2l6ZSgpIHtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVhc3VyZSA9IGNoaWxkLm1lYXN1cmVUZXh0U2l6ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBubyB3b3JrYWJsZSBsaW5lIGV4aXN0cywgZm9yY2UgYSBsYXlvdXQgb2YgYSBtZWFzdXJhYmxlIGVsZW1lbnRcbiAgICAgICAgbGV0IGR1bW15ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSwgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0O1xuICAgICAgICBkdW1teS5jbGFzc05hbWUgPSBcImNtLWxpbmVcIjtcbiAgICAgICAgZHVtbXkuc3R5bGUud2lkdGggPSBcIjk5OTk5cHhcIjtcbiAgICAgICAgZHVtbXkuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIGR1bW15LnRleHRDb250ZW50ID0gXCJhYmMgZGVmIGdoaSBqa2wgbW5vIHBxciBzdHVcIjtcbiAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZChkdW1teSk7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IGNsaWVudFJlY3RzRm9yKGR1bW15LmZpcnN0Q2hpbGQpWzBdO1xuICAgICAgICAgICAgbGluZUhlaWdodCA9IGR1bW15LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgIGNoYXJXaWR0aCA9IHJlY3QgPyByZWN0LndpZHRoIC8gMjcgOiA3O1xuICAgICAgICAgICAgdGV4dEhlaWdodCA9IHJlY3QgPyByZWN0LmhlaWdodCA6IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBkdW1teS5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCB9O1xuICAgIH1cbiAgICBjaGlsZEN1cnNvcihwb3MgPSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAvLyBNb3ZlIGJhY2sgdG8gc3RhcnQgb2YgbGFzdCBlbGVtZW50IHdoZW4gcG9zc2libGUsIHNvIHRoYXRcbiAgICAgICAgLy8gYENoaWxkQ3Vyc29yLmZpbmRQb3NgIGRvZXNuJ3QgaGF2ZSB0byBkZWFsIHdpdGggdGhlIGVkZ2UgY2FzZVxuICAgICAgICAvLyBvZiBiZWluZyBhZnRlciB0aGUgbGFzdCBlbGVtZW50LlxuICAgICAgICBsZXQgaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICBpZiAoaSlcbiAgICAgICAgICAgIHBvcyAtPSB0aGlzLmNoaWxkcmVuWy0taV0ubGVuZ3RoO1xuICAgICAgICByZXR1cm4gbmV3IENoaWxkQ3Vyc29yKHRoaXMuY2hpbGRyZW4sIHBvcywgaSk7XG4gICAgfVxuICAgIGNvbXB1dGVCbG9ja0dhcERlY28oKSB7XG4gICAgICAgIGxldCBkZWNvID0gW10sIHZzID0gdGhpcy52aWV3LnZpZXdTdGF0ZTtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gMCwgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gaSA9PSB2cy52aWV3cG9ydHMubGVuZ3RoID8gbnVsbCA6IHZzLnZpZXdwb3J0c1tpXTtcbiAgICAgICAgICAgIGxldCBlbmQgPSBuZXh0ID8gbmV4dC5mcm9tIC0gMSA6IHRoaXMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHBvcykge1xuICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSAodnMubGluZUJsb2NrQXQoZW5kKS5ib3R0b20gLSB2cy5saW5lQmxvY2tBdChwb3MpLnRvcCkgLyB0aGlzLnZpZXcuc2NhbGVZO1xuICAgICAgICAgICAgICAgIGRlY28ucHVzaChEZWNvcmF0aW9uLnJlcGxhY2Uoe1xuICAgICAgICAgICAgICAgICAgICB3aWRnZXQ6IG5ldyBCbG9ja0dhcFdpZGdldChoZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICBibG9jazogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBpc0Jsb2NrR2FwOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pLnJhbmdlKHBvcywgZW5kKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBwb3MgPSBuZXh0LnRvICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5zZXQoZGVjbyk7XG4gICAgfVxuICAgIHVwZGF0ZURlY28oKSB7XG4gICAgICAgIGxldCBhbGxEZWNvID0gdGhpcy52aWV3LnN0YXRlLmZhY2V0KGRlY29yYXRpb25zKS5tYXAoKGQsIGkpID0+IHtcbiAgICAgICAgICAgIGxldCBkeW5hbWljID0gdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcFtpXSA9IHR5cGVvZiBkID09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgICAgIHJldHVybiBkeW5hbWljID8gZCh0aGlzLnZpZXcpIDogZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBkeW5hbWljT3V0ZXIgPSBmYWxzZSwgb3V0ZXJEZWNvID0gdGhpcy52aWV3LnN0YXRlLmZhY2V0KG91dGVyRGVjb3JhdGlvbnMpLm1hcCgoZCwgaSkgPT4ge1xuICAgICAgICAgICAgbGV0IGR5bmFtaWMgPSB0eXBlb2YgZCA9PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgICAgICBpZiAoZHluYW1pYylcbiAgICAgICAgICAgICAgICBkeW5hbWljT3V0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWMgPyBkKHRoaXMudmlldykgOiBkO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG91dGVyRGVjby5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXBbYWxsRGVjby5sZW5ndGhdID0gZHluYW1pY091dGVyO1xuICAgICAgICAgICAgYWxsRGVjby5wdXNoKFJhbmdlU2V0LmpvaW4ob3V0ZXJEZWNvKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IGFsbERlY28ubGVuZ3RoOyBpIDwgYWxsRGVjby5sZW5ndGggKyAzOyBpKyspXG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwW2ldID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmRlY29yYXRpb25zID0gW1xuICAgICAgICAgICAgLi4uYWxsRGVjbyxcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZUJsb2NrR2FwRGVjbygpLFxuICAgICAgICAgICAgdGhpcy52aWV3LnZpZXdTdGF0ZS5saW5lR2FwRGVjb1xuICAgICAgICBdO1xuICAgIH1cbiAgICBzY3JvbGxJbnRvVmlldyh0YXJnZXQpIHtcbiAgICAgICAgaWYgKHRhcmdldC5pc1NuYXBzaG90KSB7XG4gICAgICAgICAgICBsZXQgcmVmID0gdGhpcy52aWV3LnZpZXdTdGF0ZS5saW5lQmxvY2tBdCh0YXJnZXQucmFuZ2UuaGVhZCk7XG4gICAgICAgICAgICB0aGlzLnZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCA9IHJlZi50b3AgLSB0YXJnZXQueU1hcmdpbjtcbiAgICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdCA9IHRhcmdldC54TWFyZ2luO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHJhbmdlIH0gPSB0YXJnZXQ7XG4gICAgICAgIGxldCByZWN0ID0gdGhpcy5jb29yZHNBdChyYW5nZS5oZWFkLCByYW5nZS5lbXB0eSA/IHJhbmdlLmFzc29jIDogcmFuZ2UuaGVhZCA+IHJhbmdlLmFuY2hvciA/IC0xIDogMSksIG90aGVyO1xuICAgICAgICBpZiAoIXJlY3QpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICghcmFuZ2UuZW1wdHkgJiYgKG90aGVyID0gdGhpcy5jb29yZHNBdChyYW5nZS5hbmNob3IsIHJhbmdlLmFuY2hvciA+IHJhbmdlLmhlYWQgPyAtMSA6IDEpKSlcbiAgICAgICAgICAgIHJlY3QgPSB7IGxlZnQ6IE1hdGgubWluKHJlY3QubGVmdCwgb3RoZXIubGVmdCksIHRvcDogTWF0aC5taW4ocmVjdC50b3AsIG90aGVyLnRvcCksXG4gICAgICAgICAgICAgICAgcmlnaHQ6IE1hdGgubWF4KHJlY3QucmlnaHQsIG90aGVyLnJpZ2h0KSwgYm90dG9tOiBNYXRoLm1heChyZWN0LmJvdHRvbSwgb3RoZXIuYm90dG9tKSB9O1xuICAgICAgICBsZXQgbWFyZ2lucyA9IGdldFNjcm9sbE1hcmdpbnModGhpcy52aWV3KTtcbiAgICAgICAgbGV0IHRhcmdldFJlY3QgPSB7XG4gICAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQgLSBtYXJnaW5zLmxlZnQsIHRvcDogcmVjdC50b3AgLSBtYXJnaW5zLnRvcCxcbiAgICAgICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0ICsgbWFyZ2lucy5yaWdodCwgYm90dG9tOiByZWN0LmJvdHRvbSArIG1hcmdpbnMuYm90dG9tXG4gICAgICAgIH07XG4gICAgICAgIGxldCB7IG9mZnNldFdpZHRoLCBvZmZzZXRIZWlnaHQgfSA9IHRoaXMudmlldy5zY3JvbGxET007XG4gICAgICAgIHNjcm9sbFJlY3RJbnRvVmlldyh0aGlzLnZpZXcuc2Nyb2xsRE9NLCB0YXJnZXRSZWN0LCByYW5nZS5oZWFkIDwgcmFuZ2UuYW5jaG9yID8gLTEgOiAxLCB0YXJnZXQueCwgdGFyZ2V0LnksIE1hdGgubWF4KE1hdGgubWluKHRhcmdldC54TWFyZ2luLCBvZmZzZXRXaWR0aCksIC1vZmZzZXRXaWR0aCksIE1hdGgubWF4KE1hdGgubWluKHRhcmdldC55TWFyZ2luLCBvZmZzZXRIZWlnaHQpLCAtb2Zmc2V0SGVpZ2h0KSwgdGhpcy52aWV3LnRleHREaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUik7XG4gICAgfVxufVxuZnVuY3Rpb24gYmV0d2VlblVuZWRpdGFibGUocG9zKSB7XG4gICAgcmV0dXJuIHBvcy5ub2RlLm5vZGVUeXBlID09IDEgJiYgcG9zLm5vZGUuZmlyc3RDaGlsZCAmJlxuICAgICAgICAocG9zLm9mZnNldCA9PSAwIHx8IHBvcy5ub2RlLmNoaWxkTm9kZXNbcG9zLm9mZnNldCAtIDFdLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpICYmXG4gICAgICAgIChwb3Mub2Zmc2V0ID09IHBvcy5ub2RlLmNoaWxkTm9kZXMubGVuZ3RoIHx8IHBvcy5ub2RlLmNoaWxkTm9kZXNbcG9zLm9mZnNldF0uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIik7XG59XG5jbGFzcyBCbG9ja0dhcFdpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGhlaWdodCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB9XG4gICAgdG9ET00oKSB7XG4gICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBlbHQuY2xhc3NOYW1lID0gXCJjbS1nYXBcIjtcbiAgICAgICAgdGhpcy51cGRhdGVET00oZWx0KTtcbiAgICAgICAgcmV0dXJuIGVsdDtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIG90aGVyLmhlaWdodCA9PSB0aGlzLmhlaWdodDsgfVxuICAgIHVwZGF0ZURPTShlbHQpIHtcbiAgICAgICAgZWx0LnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IGVkaXRhYmxlKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGdldCBlc3RpbWF0ZWRIZWlnaHQoKSB7IHJldHVybiB0aGlzLmhlaWdodDsgfVxufVxuZnVuY3Rpb24gZmluZENvbXBvc2l0aW9uTm9kZSh2aWV3LCBoZWFkUG9zKSB7XG4gICAgbGV0IHNlbCA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgbGV0IHRleHROb2RlID0gc2VsLmZvY3VzTm9kZSAmJiBuZWFyYnlUZXh0Tm9kZShzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQsIDApO1xuICAgIGlmICghdGV4dE5vZGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBmcm9tID0gaGVhZFBvcyAtIHRleHROb2RlLm9mZnNldDtcbiAgICByZXR1cm4geyBmcm9tLCB0bzogZnJvbSArIHRleHROb2RlLm5vZGUubm9kZVZhbHVlLmxlbmd0aCwgbm9kZTogdGV4dE5vZGUubm9kZSB9O1xufVxuZnVuY3Rpb24gZmluZENvbXBvc2l0aW9uUmFuZ2UodmlldywgY2hhbmdlcywgaGVhZFBvcykge1xuICAgIGxldCBmb3VuZCA9IGZpbmRDb21wb3NpdGlvbk5vZGUodmlldywgaGVhZFBvcyk7XG4gICAgaWYgKCFmb3VuZClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHsgbm9kZTogdGV4dE5vZGUsIGZyb20sIHRvIH0gPSBmb3VuZCwgdGV4dCA9IHRleHROb2RlLm5vZGVWYWx1ZTtcbiAgICAvLyBEb24ndCB0cnkgdG8gcHJlc2VydmUgbXVsdGktbGluZSBjb21wb3NpdGlvbnNcbiAgICBpZiAoL1tcXG5cXHJdLy50ZXN0KHRleHQpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAodmlldy5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcoZm91bmQuZnJvbSwgZm91bmQudG8pICE9IHRleHQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBpbnYgPSBjaGFuZ2VzLmludmVydGVkRGVzYztcbiAgICBsZXQgcmFuZ2UgPSBuZXcgQ2hhbmdlZFJhbmdlKGludi5tYXBQb3MoZnJvbSksIGludi5tYXBQb3ModG8pLCBmcm9tLCB0byk7XG4gICAgbGV0IG1hcmtzID0gW107XG4gICAgZm9yIChsZXQgcGFyZW50ID0gdGV4dE5vZGUucGFyZW50Tm9kZTs7IHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGxldCBwYXJlbnRWaWV3ID0gQ29udGVudFZpZXcuZ2V0KHBhcmVudCk7XG4gICAgICAgIGlmIChwYXJlbnRWaWV3IGluc3RhbmNlb2YgTWFya1ZpZXcpXG4gICAgICAgICAgICBtYXJrcy5wdXNoKHsgbm9kZTogcGFyZW50LCBkZWNvOiBwYXJlbnRWaWV3Lm1hcmsgfSk7XG4gICAgICAgIGVsc2UgaWYgKHBhcmVudFZpZXcgaW5zdGFuY2VvZiBMaW5lVmlldyB8fCBwYXJlbnQubm9kZU5hbWUgPT0gXCJESVZcIiAmJiBwYXJlbnQucGFyZW50Tm9kZSA9PSB2aWV3LmNvbnRlbnRET00pXG4gICAgICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dDogdGV4dE5vZGUsIG1hcmtzLCBsaW5lOiBwYXJlbnQgfTtcbiAgICAgICAgZWxzZSBpZiAocGFyZW50ICE9IHZpZXcuY29udGVudERPTSlcbiAgICAgICAgICAgIG1hcmtzLnB1c2goeyBub2RlOiBwYXJlbnQsIGRlY286IG5ldyBNYXJrRGVjb3JhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogZ2V0QXR0cnMocGFyZW50KSxcbiAgICAgICAgICAgICAgICAgICAgdGFnTmFtZTogcGFyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIH0pIH0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5mdW5jdGlvbiBuZWFyYnlUZXh0Tm9kZShzdGFydE5vZGUsIHN0YXJ0T2Zmc2V0LCBzaWRlKSB7XG4gICAgaWYgKHNpZGUgPD0gMClcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IHN0YXJ0Tm9kZSwgb2Zmc2V0ID0gc3RhcnRPZmZzZXQ7Oykge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgICAgICByZXR1cm4geyBub2RlOiBub2RlLCBvZmZzZXQ6IG9mZnNldCB9O1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBtYXhPZmZzZXQobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIGlmIChzaWRlID49IDApXG4gICAgICAgIGZvciAobGV0IG5vZGUgPSBzdGFydE5vZGUsIG9mZnNldCA9IHN0YXJ0T2Zmc2V0OzspIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogbm9kZSwgb2Zmc2V0OiBvZmZzZXQgfTtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgb2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCAmJiBzaWRlID49IDApIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBuZXh0VG9VbmVkaXRhYmxlKG5vZGUsIG9mZnNldCkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDEpXG4gICAgICAgIHJldHVybiAwO1xuICAgIHJldHVybiAob2Zmc2V0ICYmIG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiID8gMSAvKiBOZXh0VG8uQmVmb3JlICovIDogMCkgfFxuICAgICAgICAob2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCAmJiBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiID8gMiAvKiBOZXh0VG8uQWZ0ZXIgKi8gOiAwKTtcbn1cbmxldCBEZWNvcmF0aW9uQ29tcGFyYXRvciQxID0gY2xhc3MgRGVjb3JhdGlvbkNvbXBhcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBbXTtcbiAgICB9XG4gICAgY29tcGFyZVJhbmdlKGZyb20sIHRvKSB7IGFkZFJhbmdlKGZyb20sIHRvLCB0aGlzLmNoYW5nZXMpOyB9XG4gICAgY29tcGFyZVBvaW50KGZyb20sIHRvKSB7IGFkZFJhbmdlKGZyb20sIHRvLCB0aGlzLmNoYW5nZXMpOyB9XG59O1xuZnVuY3Rpb24gZmluZENoYW5nZWREZWNvKGEsIGIsIGRpZmYpIHtcbiAgICBsZXQgY29tcCA9IG5ldyBEZWNvcmF0aW9uQ29tcGFyYXRvciQxO1xuICAgIFJhbmdlU2V0LmNvbXBhcmUoYSwgYiwgZGlmZiwgY29tcCk7XG4gICAgcmV0dXJuIGNvbXAuY2hhbmdlcztcbn1cbmZ1bmN0aW9uIGluVW5lZGl0YWJsZShub2RlLCBpbnNpZGUpIHtcbiAgICBmb3IgKGxldCBjdXIgPSBub2RlOyBjdXIgJiYgY3VyICE9IGluc2lkZTsgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZSkge1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09IDEgJiYgY3VyLmNvbnRlbnRFZGl0YWJsZSA9PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiB0b3VjaGVzQ29tcG9zaXRpb24oY2hhbmdlcywgY29tcG9zaXRpb24pIHtcbiAgICBsZXQgdG91Y2hlZCA9IGZhbHNlO1xuICAgIGlmIChjb21wb3NpdGlvbilcbiAgICAgICAgY2hhbmdlcy5pdGVyQ2hhbmdlZFJhbmdlcygoZnJvbSwgdG8pID0+IHtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgY29tcG9zaXRpb24udG8gJiYgdG8gPiBjb21wb3NpdGlvbi5mcm9tKVxuICAgICAgICAgICAgICAgIHRvdWNoZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICByZXR1cm4gdG91Y2hlZDtcbn1cblxuZnVuY3Rpb24gZ3JvdXBBdChzdGF0ZSwgcG9zLCBiaWFzID0gMSkge1xuICAgIGxldCBjYXRlZ29yaXplID0gc3RhdGUuY2hhckNhdGVnb3JpemVyKHBvcyk7XG4gICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KHBvcyksIGxpbmVQb3MgPSBwb3MgLSBsaW5lLmZyb207XG4gICAgaWYgKGxpbmUubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcyk7XG4gICAgaWYgKGxpbmVQb3MgPT0gMClcbiAgICAgICAgYmlhcyA9IDE7XG4gICAgZWxzZSBpZiAobGluZVBvcyA9PSBsaW5lLmxlbmd0aClcbiAgICAgICAgYmlhcyA9IC0xO1xuICAgIGxldCBmcm9tID0gbGluZVBvcywgdG8gPSBsaW5lUG9zO1xuICAgIGlmIChiaWFzIDwgMClcbiAgICAgICAgZnJvbSA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCBsaW5lUG9zLCBmYWxzZSk7XG4gICAgZWxzZVxuICAgICAgICB0byA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCBsaW5lUG9zKTtcbiAgICBsZXQgY2F0ID0gY2F0ZWdvcml6ZShsaW5lLnRleHQuc2xpY2UoZnJvbSwgdG8pKTtcbiAgICB3aGlsZSAoZnJvbSA+IDApIHtcbiAgICAgICAgbGV0IHByZXYgPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgZnJvbSwgZmFsc2UpO1xuICAgICAgICBpZiAoY2F0ZWdvcml6ZShsaW5lLnRleHQuc2xpY2UocHJldiwgZnJvbSkpICE9IGNhdClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBmcm9tID0gcHJldjtcbiAgICB9XG4gICAgd2hpbGUgKHRvIDwgbGluZS5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG5leHQgPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgdG8pO1xuICAgICAgICBpZiAoY2F0ZWdvcml6ZShsaW5lLnRleHQuc2xpY2UodG8sIG5leHQpKSAhPSBjYXQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgdG8gPSBuZXh0O1xuICAgIH1cbiAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20gKyBsaW5lLmZyb20sIHRvICsgbGluZS5mcm9tKTtcbn1cbi8vIFNlYXJjaCB0aGUgRE9NIGZvciB0aGUge25vZGUsIG9mZnNldH0gcG9zaXRpb24gY2xvc2VzdCB0byB0aGUgZ2l2ZW5cbi8vIGNvb3JkaW5hdGVzLiBWZXJ5IGluZWZmaWNpZW50IGFuZCBjcnVkZSwgYnV0IGNhbiB1c3VhbGx5IGJlIGF2b2lkZWRcbi8vIGJ5IGNhbGxpbmcgY2FyZXQoUG9zaXRpb258UmFuZ2UpRnJvbVBvaW50IGluc3RlYWQuXG5mdW5jdGlvbiBnZXRkeCh4LCByZWN0KSB7XG4gICAgcmV0dXJuIHJlY3QubGVmdCA+IHggPyByZWN0LmxlZnQgLSB4IDogTWF0aC5tYXgoMCwgeCAtIHJlY3QucmlnaHQpO1xufVxuZnVuY3Rpb24gZ2V0ZHkoeSwgcmVjdCkge1xuICAgIHJldHVybiByZWN0LnRvcCA+IHkgPyByZWN0LnRvcCAtIHkgOiBNYXRoLm1heCgwLCB5IC0gcmVjdC5ib3R0b20pO1xufVxuZnVuY3Rpb24geU92ZXJsYXAoYSwgYikge1xuICAgIHJldHVybiBhLnRvcCA8IGIuYm90dG9tIC0gMSAmJiBhLmJvdHRvbSA+IGIudG9wICsgMTtcbn1cbmZ1bmN0aW9uIHVwVG9wKHJlY3QsIHRvcCkge1xuICAgIHJldHVybiB0b3AgPCByZWN0LnRvcCA/IHsgdG9wLCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LnJpZ2h0LCBib3R0b206IHJlY3QuYm90dG9tIH0gOiByZWN0O1xufVxuZnVuY3Rpb24gdXBCb3QocmVjdCwgYm90dG9tKSB7XG4gICAgcmV0dXJuIGJvdHRvbSA+IHJlY3QuYm90dG9tID8geyB0b3A6IHJlY3QudG9wLCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LnJpZ2h0LCBib3R0b20gfSA6IHJlY3Q7XG59XG5mdW5jdGlvbiBkb21Qb3NBdENvb3JkcyhwYXJlbnQsIHgsIHkpIHtcbiAgICBsZXQgY2xvc2VzdCwgY2xvc2VzdFJlY3QsIGNsb3Nlc3RYLCBjbG9zZXN0WSwgY2xvc2VzdE92ZXJsYXAgPSBmYWxzZTtcbiAgICBsZXQgYWJvdmUsIGJlbG93LCBhYm92ZVJlY3QsIGJlbG93UmVjdDtcbiAgICBmb3IgKGxldCBjaGlsZCA9IHBhcmVudC5maXJzdENoaWxkOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBsZXQgcmVjdHMgPSBjbGllbnRSZWN0c0ZvcihjaGlsZCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAoY2xvc2VzdFJlY3QgJiYgeU92ZXJsYXAoY2xvc2VzdFJlY3QsIHJlY3QpKVxuICAgICAgICAgICAgICAgIHJlY3QgPSB1cFRvcCh1cEJvdChyZWN0LCBjbG9zZXN0UmVjdC5ib3R0b20pLCBjbG9zZXN0UmVjdC50b3ApO1xuICAgICAgICAgICAgbGV0IGR4ID0gZ2V0ZHgoeCwgcmVjdCksIGR5ID0gZ2V0ZHkoeSwgcmVjdCk7XG4gICAgICAgICAgICBpZiAoZHggPT0gMCAmJiBkeSA9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5ub2RlVHlwZSA9PSAzID8gZG9tUG9zSW5UZXh0KGNoaWxkLCB4LCB5KSA6IGRvbVBvc0F0Q29vcmRzKGNoaWxkLCB4LCB5KTtcbiAgICAgICAgICAgIGlmICghY2xvc2VzdCB8fCBjbG9zZXN0WSA+IGR5IHx8IGNsb3Nlc3RZID09IGR5ICYmIGNsb3Nlc3RYID4gZHgpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFJlY3QgPSByZWN0O1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RYID0gZHg7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFkgPSBkeTtcbiAgICAgICAgICAgICAgICBsZXQgc2lkZSA9IGR5ID8gKHkgPCByZWN0LnRvcCA/IC0xIDogMSkgOiBkeCA/ICh4IDwgcmVjdC5sZWZ0ID8gLTEgOiAxKSA6IDA7XG4gICAgICAgICAgICAgICAgY2xvc2VzdE92ZXJsYXAgPSAhc2lkZSB8fCAoc2lkZSA+IDAgPyBpIDwgcmVjdHMubGVuZ3RoIC0gMSA6IGkgPiAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkeCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHkgPiByZWN0LmJvdHRvbSAmJiAoIWFib3ZlUmVjdCB8fCBhYm92ZVJlY3QuYm90dG9tIDwgcmVjdC5ib3R0b20pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3ZlID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGFib3ZlUmVjdCA9IHJlY3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHkgPCByZWN0LnRvcCAmJiAoIWJlbG93UmVjdCB8fCBiZWxvd1JlY3QudG9wID4gcmVjdC50b3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGJlbG93UmVjdCA9IHJlY3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWJvdmVSZWN0ICYmIHlPdmVybGFwKGFib3ZlUmVjdCwgcmVjdCkpIHtcbiAgICAgICAgICAgICAgICBhYm92ZVJlY3QgPSB1cEJvdChhYm92ZVJlY3QsIHJlY3QuYm90dG9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJlbG93UmVjdCAmJiB5T3ZlcmxhcChiZWxvd1JlY3QsIHJlY3QpKSB7XG4gICAgICAgICAgICAgICAgYmVsb3dSZWN0ID0gdXBUb3AoYmVsb3dSZWN0LCByZWN0LnRvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFib3ZlUmVjdCAmJiBhYm92ZVJlY3QuYm90dG9tID49IHkpIHtcbiAgICAgICAgY2xvc2VzdCA9IGFib3ZlO1xuICAgICAgICBjbG9zZXN0UmVjdCA9IGFib3ZlUmVjdDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYmVsb3dSZWN0ICYmIGJlbG93UmVjdC50b3AgPD0geSkge1xuICAgICAgICBjbG9zZXN0ID0gYmVsb3c7XG4gICAgICAgIGNsb3Nlc3RSZWN0ID0gYmVsb3dSZWN0O1xuICAgIH1cbiAgICBpZiAoIWNsb3Nlc3QpXG4gICAgICAgIHJldHVybiB7IG5vZGU6IHBhcmVudCwgb2Zmc2V0OiAwIH07XG4gICAgbGV0IGNsaXBYID0gTWF0aC5tYXgoY2xvc2VzdFJlY3QubGVmdCwgTWF0aC5taW4oY2xvc2VzdFJlY3QucmlnaHQsIHgpKTtcbiAgICBpZiAoY2xvc2VzdC5ub2RlVHlwZSA9PSAzKVxuICAgICAgICByZXR1cm4gZG9tUG9zSW5UZXh0KGNsb3Nlc3QsIGNsaXBYLCB5KTtcbiAgICBpZiAoY2xvc2VzdE92ZXJsYXAgJiYgY2xvc2VzdC5jb250ZW50RWRpdGFibGUgIT0gXCJmYWxzZVwiKVxuICAgICAgICByZXR1cm4gZG9tUG9zQXRDb29yZHMoY2xvc2VzdCwgY2xpcFgsIHkpO1xuICAgIGxldCBvZmZzZXQgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHBhcmVudC5jaGlsZE5vZGVzLCBjbG9zZXN0KSArXG4gICAgICAgICh4ID49IChjbG9zZXN0UmVjdC5sZWZ0ICsgY2xvc2VzdFJlY3QucmlnaHQpIC8gMiA/IDEgOiAwKTtcbiAgICByZXR1cm4geyBub2RlOiBwYXJlbnQsIG9mZnNldCB9O1xufVxuZnVuY3Rpb24gZG9tUG9zSW5UZXh0KG5vZGUsIHgsIHkpIHtcbiAgICBsZXQgbGVuID0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoO1xuICAgIGxldCBjbG9zZXN0T2Zmc2V0ID0gLTEsIGNsb3Nlc3REWSA9IDFlOSwgZ2VuZXJhbFNpZGUgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgbGV0IHJlY3RzID0gdGV4dFJhbmdlKG5vZGUsIGksIGkgKyAxKS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlY3RzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgaWYgKHJlY3QudG9wID09IHJlY3QuYm90dG9tKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFnZW5lcmFsU2lkZSlcbiAgICAgICAgICAgICAgICBnZW5lcmFsU2lkZSA9IHggLSByZWN0LmxlZnQ7XG4gICAgICAgICAgICBsZXQgZHkgPSAocmVjdC50b3AgPiB5ID8gcmVjdC50b3AgLSB5IDogeSAtIHJlY3QuYm90dG9tKSAtIDE7XG4gICAgICAgICAgICBpZiAocmVjdC5sZWZ0IC0gMSA8PSB4ICYmIHJlY3QucmlnaHQgKyAxID49IHggJiYgZHkgPCBjbG9zZXN0RFkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmlnaHQgPSB4ID49IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIsIGFmdGVyID0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKGJyb3dzZXIuY2hyb21lIHx8IGJyb3dzZXIuZ2Vja28pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFJUTCBvbiBicm93c2VycyB0aGF0IHN1cHBvcnQgZ2V0dGluZyBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVjdHMgZm9yIGVtcHR5IHJhbmdlcy5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3RCZWZvcmUgPSB0ZXh0UmFuZ2Uobm9kZSwgaSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWN0QmVmb3JlLmxlZnQgPT0gcmVjdC5yaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyID0gIXJpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZHkgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiBpICsgKGFmdGVyID8gMSA6IDApIH07XG4gICAgICAgICAgICAgICAgY2xvc2VzdE9mZnNldCA9IGkgKyAoYWZ0ZXIgPyAxIDogMCk7XG4gICAgICAgICAgICAgICAgY2xvc2VzdERZID0gZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiBjbG9zZXN0T2Zmc2V0ID4gLTEgPyBjbG9zZXN0T2Zmc2V0IDogZ2VuZXJhbFNpZGUgPiAwID8gbm9kZS5ub2RlVmFsdWUubGVuZ3RoIDogMCB9O1xufVxuZnVuY3Rpb24gcG9zQXRDb29yZHModmlldywgY29vcmRzLCBwcmVjaXNlLCBiaWFzID0gLTEpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGxldCBjb250ZW50ID0gdmlldy5jb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBkb2NUb3AgPSBjb250ZW50LnRvcCArIHZpZXcudmlld1N0YXRlLnBhZGRpbmdUb3A7XG4gICAgbGV0IGJsb2NrLCB7IGRvY0hlaWdodCB9ID0gdmlldy52aWV3U3RhdGU7XG4gICAgbGV0IHsgeCwgeSB9ID0gY29vcmRzLCB5T2Zmc2V0ID0geSAtIGRvY1RvcDtcbiAgICBpZiAoeU9mZnNldCA8IDApXG4gICAgICAgIHJldHVybiAwO1xuICAgIGlmICh5T2Zmc2V0ID4gZG9jSGVpZ2h0KVxuICAgICAgICByZXR1cm4gdmlldy5zdGF0ZS5kb2MubGVuZ3RoO1xuICAgIC8vIFNjYW4gZm9yIGEgdGV4dCBibG9jayBuZWFyIHRoZSBxdWVyaWVkIHkgcG9zaXRpb25cbiAgICBmb3IgKGxldCBoYWxmTGluZSA9IHZpZXcudmlld1N0YXRlLmhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0IC8gMiwgYm91bmNlZCA9IGZhbHNlOzspIHtcbiAgICAgICAgYmxvY2sgPSB2aWV3LmVsZW1lbnRBdEhlaWdodCh5T2Zmc2V0KTtcbiAgICAgICAgaWYgKGJsb2NrLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgLy8gTW92ZSB0aGUgeSBwb3NpdGlvbiBvdXQgb2YgdGhpcyBibG9ja1xuICAgICAgICAgICAgeU9mZnNldCA9IGJpYXMgPiAwID8gYmxvY2suYm90dG9tICsgaGFsZkxpbmUgOiBibG9jay50b3AgLSBoYWxmTGluZTtcbiAgICAgICAgICAgIGlmICh5T2Zmc2V0ID49IDAgJiYgeU9mZnNldCA8PSBkb2NIZWlnaHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZG9jdW1lbnQgY29uc2lzdHMgZW50aXJlbHkgb2YgcmVwbGFjZWQgd2lkZ2V0cywgd2VcbiAgICAgICAgICAgIC8vIHdvbid0IGZpbmQgYSB0ZXh0IGJsb2NrLCBzbyByZXR1cm4gMFxuICAgICAgICAgICAgaWYgKGJvdW5jZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWNpc2UgPyBudWxsIDogMDtcbiAgICAgICAgICAgIGJvdW5jZWQgPSB0cnVlO1xuICAgICAgICAgICAgYmlhcyA9IC1iaWFzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHkgPSBkb2NUb3AgKyB5T2Zmc2V0O1xuICAgIGxldCBsaW5lU3RhcnQgPSBibG9jay5mcm9tO1xuICAgIC8vIElmIHRoaXMgaXMgb3V0c2lkZSBvZiB0aGUgcmVuZGVyZWQgdmlld3BvcnQsIHdlIGNhbid0IGRldGVybWluZSBhIHBvc2l0aW9uXG4gICAgaWYgKGxpbmVTdGFydCA8IHZpZXcudmlld3BvcnQuZnJvbSlcbiAgICAgICAgcmV0dXJuIHZpZXcudmlld3BvcnQuZnJvbSA9PSAwID8gMCA6IHByZWNpc2UgPyBudWxsIDogcG9zQXRDb29yZHNJbXByZWNpc2UodmlldywgY29udGVudCwgYmxvY2ssIHgsIHkpO1xuICAgIGlmIChsaW5lU3RhcnQgPiB2aWV3LnZpZXdwb3J0LnRvKVxuICAgICAgICByZXR1cm4gdmlldy52aWV3cG9ydC50byA9PSB2aWV3LnN0YXRlLmRvYy5sZW5ndGggPyB2aWV3LnN0YXRlLmRvYy5sZW5ndGggOlxuICAgICAgICAgICAgcHJlY2lzZSA/IG51bGwgOiBwb3NBdENvb3Jkc0ltcHJlY2lzZSh2aWV3LCBjb250ZW50LCBibG9jaywgeCwgeSk7XG4gICAgLy8gUHJlZmVyIFNoYWRvd1Jvb3RPckRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQgaWYgcHJlc2VudCwgZmFsbCBiYWNrIHRvIGRvY3VtZW50IGlmIG5vdFxuICAgIGxldCBkb2MgPSB2aWV3LmRvbS5vd25lckRvY3VtZW50O1xuICAgIGxldCByb290ID0gdmlldy5yb290LmVsZW1lbnRGcm9tUG9pbnQgPyB2aWV3LnJvb3QgOiBkb2M7XG4gICAgbGV0IGVsZW1lbnQgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgaWYgKGVsZW1lbnQgJiYgIXZpZXcuY29udGVudERPTS5jb250YWlucyhlbGVtZW50KSlcbiAgICAgICAgZWxlbWVudCA9IG51bGw7XG4gICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgdW5leHBlY3RlZCwgY2xpcCB4IGF0IHRoZSBzaWRlcyBvZiB0aGUgY29udGVudCBhcmVhIGFuZCB0cnkgYWdhaW5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgeCA9IE1hdGgubWF4KGNvbnRlbnQubGVmdCArIDEsIE1hdGgubWluKGNvbnRlbnQucmlnaHQgLSAxLCB4KSk7XG4gICAgICAgIGVsZW1lbnQgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgIGlmIChlbGVtZW50ICYmICF2aWV3LmNvbnRlbnRET00uY29udGFpbnMoZWxlbWVudCkpXG4gICAgICAgICAgICBlbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgLy8gVGhlcmUncyB2aXNpYmxlIGVkaXRvciBjb250ZW50IHVuZGVyIHRoZSBwb2ludCwgc28gd2UgY2FuIHRyeVxuICAgIC8vIHVzaW5nIGNhcmV0KFBvc2l0aW9ufFJhbmdlKUZyb21Qb2ludCBhcyBhIHNob3J0Y3V0XG4gICAgbGV0IG5vZGUsIG9mZnNldCA9IC0xO1xuICAgIGlmIChlbGVtZW50ICYmICgoX2EgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdChlbGVtZW50KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzRWRpdGFibGUpICE9IGZhbHNlKSB7XG4gICAgICAgIGlmIChkb2MuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCkge1xuICAgICAgICAgICAgbGV0IHBvcyA9IGRvYy5jYXJldFBvc2l0aW9uRnJvbVBvaW50KHgsIHkpO1xuICAgICAgICAgICAgaWYgKHBvcylcbiAgICAgICAgICAgICAgICAoeyBvZmZzZXROb2RlOiBub2RlLCBvZmZzZXQgfSA9IHBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZG9jLmNhcmV0UmFuZ2VGcm9tUG9pbnQpIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KHgsIHkpO1xuICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgKHsgc3RhcnRDb250YWluZXI6IG5vZGUsIHN0YXJ0T2Zmc2V0OiBvZmZzZXQgfSA9IHJhbmdlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZpZXcuY29udGVudERPTS5jb250YWlucyhub2RlKSB8fFxuICAgICAgICAgICAgICAgICAgICBicm93c2VyLnNhZmFyaSAmJiBpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdChub2RlLCBvZmZzZXQsIHgpIHx8XG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXIuY2hyb21lICYmIGlzU3VzcGljaW91c0Nocm9tZUNhcmV0UmVzdWx0KG5vZGUsIG9mZnNldCwgeCkpXG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTm8gbHVjaywgZG8gb3VyIG93biAocG90ZW50aWFsbHkgZXhwZW5zaXZlKSBzZWFyY2hcbiAgICBpZiAoIW5vZGUgfHwgIXZpZXcuZG9jVmlldy5kb20uY29udGFpbnMobm9kZSkpIHtcbiAgICAgICAgbGV0IGxpbmUgPSBMaW5lVmlldy5maW5kKHZpZXcuZG9jVmlldywgbGluZVN0YXJ0KTtcbiAgICAgICAgaWYgKCFsaW5lKVxuICAgICAgICAgICAgcmV0dXJuIHlPZmZzZXQgPiBibG9jay50b3AgKyBibG9jay5oZWlnaHQgLyAyID8gYmxvY2sudG8gOiBibG9jay5mcm9tO1xuICAgICAgICAoeyBub2RlLCBvZmZzZXQgfSA9IGRvbVBvc0F0Q29vcmRzKGxpbmUuZG9tLCB4LCB5KSk7XG4gICAgfVxuICAgIGxldCBuZWFyZXN0ID0gdmlldy5kb2NWaWV3Lm5lYXJlc3Qobm9kZSk7XG4gICAgaWYgKCFuZWFyZXN0KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAobmVhcmVzdC5pc1dpZGdldCAmJiAoKF9iID0gbmVhcmVzdC5kb20pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5ub2RlVHlwZSkgPT0gMSkge1xuICAgICAgICBsZXQgcmVjdCA9IG5lYXJlc3QuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4gY29vcmRzLnkgPCByZWN0LnRvcCB8fCBjb29yZHMueSA8PSByZWN0LmJvdHRvbSAmJiBjb29yZHMueCA8PSAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyXG4gICAgICAgICAgICA/IG5lYXJlc3QucG9zQXRTdGFydCA6IG5lYXJlc3QucG9zQXRFbmQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbmVhcmVzdC5sb2NhbFBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSArIG5lYXJlc3QucG9zQXRTdGFydDtcbiAgICB9XG59XG5mdW5jdGlvbiBwb3NBdENvb3Jkc0ltcHJlY2lzZSh2aWV3LCBjb250ZW50UmVjdCwgYmxvY2ssIHgsIHkpIHtcbiAgICBsZXQgaW50byA9IE1hdGgucm91bmQoKHggLSBjb250ZW50UmVjdC5sZWZ0KSAqIHZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoKTtcbiAgICBpZiAodmlldy5saW5lV3JhcHBpbmcgJiYgYmxvY2suaGVpZ2h0ID4gdmlldy5kZWZhdWx0TGluZUhlaWdodCAqIDEuNSkge1xuICAgICAgICBsZXQgdGV4dEhlaWdodCA9IHZpZXcudmlld1N0YXRlLmhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0O1xuICAgICAgICBsZXQgbGluZSA9IE1hdGguZmxvb3IoKHkgLSBibG9jay50b3AgLSAodmlldy5kZWZhdWx0TGluZUhlaWdodCAtIHRleHRIZWlnaHQpICogMC41KSAvIHRleHRIZWlnaHQpO1xuICAgICAgICBpbnRvICs9IGxpbmUgKiB2aWV3LnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUubGluZUxlbmd0aDtcbiAgICB9XG4gICAgbGV0IGNvbnRlbnQgPSB2aWV3LnN0YXRlLnNsaWNlRG9jKGJsb2NrLmZyb20sIGJsb2NrLnRvKTtcbiAgICByZXR1cm4gYmxvY2suZnJvbSArIGZpbmRDb2x1bW4oY29udGVudCwgaW50bywgdmlldy5zdGF0ZS50YWJTaXplKTtcbn1cbi8vIEluIGNhc2Ugb2YgYSBoaWdoIGxpbmUgaGVpZ2h0LCBTYWZhcmkncyBjYXJldFJhbmdlRnJvbVBvaW50IHRyZWF0c1xuLy8gdGhlIHNwYWNlIGJldHdlZW4gbGluZXMgYXMgYmVsb25naW5nIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGVcbi8vIGxpbmUgYmVmb3JlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZWN0IHN1Y2ggYSByZXN1bHQgc28gdGhhdCBpdCBjYW4gYmVcbi8vIGlnbm9yZWQgKGlzc3VlICM0MDEpLlxuZnVuY3Rpb24gaXNTdXNwaWNpb3VzU2FmYXJpQ2FyZXRSZXN1bHQobm9kZSwgb2Zmc2V0LCB4KSB7XG4gICAgbGV0IGxlbjtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAzIHx8IG9mZnNldCAhPSAobGVuID0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IG5leHQgPSBub2RlLm5leHRTaWJsaW5nOyBuZXh0OyBuZXh0ID0gbmV4dC5uZXh0U2libGluZylcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgIT0gMSB8fCBuZXh0Lm5vZGVOYW1lICE9IFwiQlJcIilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGV4dFJhbmdlKG5vZGUsIGxlbiAtIDEsIGxlbikuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCA+IHg7XG59XG4vLyBDaHJvbWUgd2lsbCBtb3ZlIHBvc2l0aW9ucyBiZXR3ZWVuIGxpbmVzIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lXG5mdW5jdGlvbiBpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdChub2RlLCBvZmZzZXQsIHgpIHtcbiAgICBpZiAob2Zmc2V0ICE9IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBjdXIgPSBub2RlOzspIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQubm9kZVR5cGUgIT0gMSB8fCBwYXJlbnQuZmlyc3RDaGlsZCAhPSBjdXIpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiY20tbGluZVwiKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjdXIgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGxldCByZWN0ID0gbm9kZS5ub2RlVHlwZSA9PSAxID8gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICA6IHRleHRSYW5nZShub2RlLCAwLCBNYXRoLm1heChub2RlLm5vZGVWYWx1ZS5sZW5ndGgsIDEpKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4geCAtIHJlY3QubGVmdCA+IDU7XG59XG5mdW5jdGlvbiBibG9ja0F0KHZpZXcsIHBvcykge1xuICAgIGxldCBsaW5lID0gdmlldy5saW5lQmxvY2tBdChwb3MpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxpbmUudHlwZSkpXG4gICAgICAgIGZvciAobGV0IGwgb2YgbGluZS50eXBlKSB7XG4gICAgICAgICAgICBpZiAobC50byA+IHBvcyB8fCBsLnRvID09IHBvcyAmJiAobC50byA9PSBsaW5lLnRvIHx8IGwudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGw7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbGluZTtcbn1cbmZ1bmN0aW9uIG1vdmVUb0xpbmVCb3VuZGFyeSh2aWV3LCBzdGFydCwgZm9yd2FyZCwgaW5jbHVkZVdyYXApIHtcbiAgICBsZXQgbGluZSA9IGJsb2NrQXQodmlldywgc3RhcnQuaGVhZCk7XG4gICAgbGV0IGNvb3JkcyA9ICFpbmNsdWRlV3JhcCB8fCBsaW5lLnR5cGUgIT0gQmxvY2tUeXBlLlRleHQgfHwgISh2aWV3LmxpbmVXcmFwcGluZyB8fCBsaW5lLndpZGdldExpbmVCcmVha3MpID8gbnVsbFxuICAgICAgICA6IHZpZXcuY29vcmRzQXRQb3Moc3RhcnQuYXNzb2MgPCAwICYmIHN0YXJ0LmhlYWQgPiBsaW5lLmZyb20gPyBzdGFydC5oZWFkIC0gMSA6IHN0YXJ0LmhlYWQpO1xuICAgIGlmIChjb29yZHMpIHtcbiAgICAgICAgbGV0IGVkaXRvclJlY3QgPSB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbGV0IGRpcmVjdGlvbiA9IHZpZXcudGV4dERpcmVjdGlvbkF0KGxpbmUuZnJvbSk7XG4gICAgICAgIGxldCBwb3MgPSB2aWV3LnBvc0F0Q29vcmRzKHsgeDogZm9yd2FyZCA9PSAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFIpID8gZWRpdG9yUmVjdC5yaWdodCAtIDEgOiBlZGl0b3JSZWN0LmxlZnQgKyAxLFxuICAgICAgICAgICAgeTogKGNvb3Jkcy50b3AgKyBjb29yZHMuYm90dG9tKSAvIDIgfSk7XG4gICAgICAgIGlmIChwb3MgIT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcywgZm9yd2FyZCA/IC0xIDogMSk7XG4gICAgfVxuICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKGZvcndhcmQgPyBsaW5lLnRvIDogbGluZS5mcm9tLCBmb3J3YXJkID8gLTEgOiAxKTtcbn1cbmZ1bmN0aW9uIG1vdmVCeUNoYXIodmlldywgc3RhcnQsIGZvcndhcmQsIGJ5KSB7XG4gICAgbGV0IGxpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQoc3RhcnQuaGVhZCksIHNwYW5zID0gdmlldy5iaWRpU3BhbnMobGluZSk7XG4gICAgbGV0IGRpcmVjdGlvbiA9IHZpZXcudGV4dERpcmVjdGlvbkF0KGxpbmUuZnJvbSk7XG4gICAgZm9yIChsZXQgY3VyID0gc3RhcnQsIGNoZWNrID0gbnVsbDs7KSB7XG4gICAgICAgIGxldCBuZXh0ID0gbW92ZVZpc3VhbGx5KGxpbmUsIHNwYW5zLCBkaXJlY3Rpb24sIGN1ciwgZm9yd2FyZCksIGNoYXIgPSBtb3ZlZE92ZXI7XG4gICAgICAgIGlmICghbmV4dCkge1xuICAgICAgICAgICAgaWYgKGxpbmUubnVtYmVyID09IChmb3J3YXJkID8gdmlldy5zdGF0ZS5kb2MubGluZXMgOiAxKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VyO1xuICAgICAgICAgICAgY2hhciA9IFwiXFxuXCI7XG4gICAgICAgICAgICBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZShsaW5lLm51bWJlciArIChmb3J3YXJkID8gMSA6IC0xKSk7XG4gICAgICAgICAgICBzcGFucyA9IHZpZXcuYmlkaVNwYW5zKGxpbmUpO1xuICAgICAgICAgICAgbmV4dCA9IHZpZXcudmlzdWFsTGluZVNpZGUobGluZSwgIWZvcndhcmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hlY2spIHtcbiAgICAgICAgICAgIGlmICghYnkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICBjaGVjayA9IGJ5KGNoYXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFjaGVjayhjaGFyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cjtcbiAgICAgICAgfVxuICAgICAgICBjdXIgPSBuZXh0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJ5R3JvdXAodmlldywgcG9zLCBzdGFydCkge1xuICAgIGxldCBjYXRlZ29yaXplID0gdmlldy5zdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIocG9zKTtcbiAgICBsZXQgY2F0ID0gY2F0ZWdvcml6ZShzdGFydCk7XG4gICAgcmV0dXJuIChuZXh0KSA9PiB7XG4gICAgICAgIGxldCBuZXh0Q2F0ID0gY2F0ZWdvcml6ZShuZXh0KTtcbiAgICAgICAgaWYgKGNhdCA9PSBDaGFyQ2F0ZWdvcnkuU3BhY2UpXG4gICAgICAgICAgICBjYXQgPSBuZXh0Q2F0O1xuICAgICAgICByZXR1cm4gY2F0ID09IG5leHRDYXQ7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1vdmVWZXJ0aWNhbGx5KHZpZXcsIHN0YXJ0LCBmb3J3YXJkLCBkaXN0YW5jZSkge1xuICAgIGxldCBzdGFydFBvcyA9IHN0YXJ0LmhlYWQsIGRpciA9IGZvcndhcmQgPyAxIDogLTE7XG4gICAgaWYgKHN0YXJ0UG9zID09IChmb3J3YXJkID8gdmlldy5zdGF0ZS5kb2MubGVuZ3RoIDogMCkpXG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHN0YXJ0UG9zLCBzdGFydC5hc3NvYyk7XG4gICAgbGV0IGdvYWwgPSBzdGFydC5nb2FsQ29sdW1uLCBzdGFydFk7XG4gICAgbGV0IHJlY3QgPSB2aWV3LmNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHN0YXJ0Q29vcmRzID0gdmlldy5jb29yZHNBdFBvcyhzdGFydFBvcywgc3RhcnQuYXNzb2MgfHwgLTEpLCBkb2NUb3AgPSB2aWV3LmRvY3VtZW50VG9wO1xuICAgIGlmIChzdGFydENvb3Jkcykge1xuICAgICAgICBpZiAoZ29hbCA9PSBudWxsKVxuICAgICAgICAgICAgZ29hbCA9IHN0YXJ0Q29vcmRzLmxlZnQgLSByZWN0LmxlZnQ7XG4gICAgICAgIHN0YXJ0WSA9IGRpciA8IDAgPyBzdGFydENvb3Jkcy50b3AgOiBzdGFydENvb3Jkcy5ib3R0b207XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgbGluZSA9IHZpZXcudmlld1N0YXRlLmxpbmVCbG9ja0F0KHN0YXJ0UG9zKTtcbiAgICAgICAgaWYgKGdvYWwgPT0gbnVsbClcbiAgICAgICAgICAgIGdvYWwgPSBNYXRoLm1pbihyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LCB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCAqIChzdGFydFBvcyAtIGxpbmUuZnJvbSkpO1xuICAgICAgICBzdGFydFkgPSAoZGlyIDwgMCA/IGxpbmUudG9wIDogbGluZS5ib3R0b20pICsgZG9jVG9wO1xuICAgIH1cbiAgICBsZXQgcmVzb2x2ZWRHb2FsID0gcmVjdC5sZWZ0ICsgZ29hbDtcbiAgICBsZXQgZGlzdCA9IGRpc3RhbmNlICE9PSBudWxsICYmIGRpc3RhbmNlICE9PSB2b2lkIDAgPyBkaXN0YW5jZSA6ICh2aWV3LnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUudGV4dEhlaWdodCA+PiAxKTtcbiAgICBmb3IgKGxldCBleHRyYSA9IDA7OyBleHRyYSArPSAxMCkge1xuICAgICAgICBsZXQgY3VyWSA9IHN0YXJ0WSArIChkaXN0ICsgZXh0cmEpICogZGlyO1xuICAgICAgICBsZXQgcG9zID0gcG9zQXRDb29yZHModmlldywgeyB4OiByZXNvbHZlZEdvYWwsIHk6IGN1clkgfSwgZmFsc2UsIGRpcik7XG4gICAgICAgIGlmIChjdXJZIDwgcmVjdC50b3AgfHwgY3VyWSA+IHJlY3QuYm90dG9tIHx8IChkaXIgPCAwID8gcG9zIDwgc3RhcnRQb3MgOiBwb3MgPiBzdGFydFBvcykpIHtcbiAgICAgICAgICAgIGxldCBjaGFyUmVjdCA9IHZpZXcuZG9jVmlldy5jb29yZHNGb3JDaGFyKHBvcyk7XG4gICAgICAgICAgICBsZXQgYXNzb2MgPSAhY2hhclJlY3QgfHwgY3VyWSA8IGNoYXJSZWN0LnRvcCA/IC0xIDogMTtcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcywgYXNzb2MsIHVuZGVmaW5lZCwgZ29hbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBza2lwQXRvbWljUmFuZ2VzKGF0b21zLCBwb3MsIGJpYXMpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGxldCBtb3ZlZCA9IDA7XG4gICAgICAgIGZvciAobGV0IHNldCBvZiBhdG9tcykge1xuICAgICAgICAgICAgc2V0LmJldHdlZW4ocG9zIC0gMSwgcG9zICsgMSwgKGZyb20sIHRvLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tICYmIHBvcyA8IHRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaWRlID0gbW92ZWQgfHwgYmlhcyB8fCAocG9zIC0gZnJvbSA8IHRvIC0gcG9zID8gLTEgOiAxKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gc2lkZSA8IDAgPyBmcm9tIDogdG87XG4gICAgICAgICAgICAgICAgICAgIG1vdmVkID0gc2lkZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vdmVkKVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG59XG5mdW5jdGlvbiBza2lwQXRvbXModmlldywgb2xkUG9zLCBwb3MpIHtcbiAgICBsZXQgbmV3UG9zID0gc2tpcEF0b21pY1Jhbmdlcyh2aWV3LnN0YXRlLmZhY2V0KGF0b21pY1JhbmdlcykubWFwKGYgPT4gZih2aWV3KSksIHBvcy5mcm9tLCBvbGRQb3MuaGVhZCA+IHBvcy5mcm9tID8gLTEgOiAxKTtcbiAgICByZXR1cm4gbmV3UG9zID09IHBvcy5mcm9tID8gcG9zIDogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihuZXdQb3MsIG5ld1BvcyA8IHBvcy5mcm9tID8gMSA6IC0xKTtcbn1cblxuLy8gVGhpcyB3aWxsIGFsc28gYmUgd2hlcmUgZHJhZ2dpbmcgaW5mbyBhbmQgc3VjaCBnb2VzXG5jbGFzcyBJbnB1dFN0YXRlIHtcbiAgICBzZXRTZWxlY3Rpb25PcmlnaW4ob3JpZ2luKSB7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvbk9yaWdpbiA9IG9yaWdpbjtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uVGltZSA9IERhdGUubm93KCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5sYXN0S2V5Q29kZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdEtleVRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RUb3VjaFRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RGb2N1c1RpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RTY3JvbGxUb3AgPSAwO1xuICAgICAgICB0aGlzLmxhc3RTY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgLy8gT24gaU9TLCBzb21lIGtleXMgbmVlZCB0byBoYXZlIHRoZWlyIGRlZmF1bHQgYmVoYXZpb3IgaGFwcGVuXG4gICAgICAgIC8vIChhZnRlciB3aGljaCB3ZSByZXRyb2FjdGl2ZWx5IGhhbmRsZSB0aGVtIGFuZCByZXNldCB0aGUgRE9NKSB0b1xuICAgICAgICAvLyBhdm9pZCBtZXNzaW5nIHVwIHRoZSB2aXJ0dWFsIGtleWJvYXJkIHN0YXRlLlxuICAgICAgICB0aGlzLnBlbmRpbmdJT1NLZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvbk9yaWdpbiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvblRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RFc2NQcmVzcyA9IDA7XG4gICAgICAgIHRoaXMubGFzdENvbnRleHRNZW51ID0gMDtcbiAgICAgICAgdGhpcy5zY3JvbGxIYW5kbGVycyA9IFtdO1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgLy8gLTEgbWVhbnMgbm90IGluIGEgY29tcG9zaXRpb24uIE90aGVyd2lzZSwgdGhpcyBjb3VudHMgdGhlIG51bWJlclxuICAgICAgICAvLyBvZiBjaGFuZ2VzIG1hZGUgZHVyaW5nIHRoZSBjb21wb3NpdGlvbi4gVGhlIGNvdW50IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gYXZvaWQgdHJlYXRpbmcgdGhlIHN0YXJ0IHN0YXRlIG9mIHRoZSBjb21wb3NpdGlvbiwgYmVmb3JlIGFueVxuICAgICAgICAvLyBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLCBhcyBwYXJ0IG9mIHRoZSBjb21wb3NpdGlvbi5cbiAgICAgICAgdGhpcy5jb21wb3NpbmcgPSAtMTtcbiAgICAgICAgLy8gVHJhY2tzIHdoZXRoZXIgdGhlIG5leHQgY2hhbmdlIHNob3VsZCBiZSBtYXJrZWQgYXMgc3RhcnRpbmcgdGhlXG4gICAgICAgIC8vIGNvbXBvc2l0aW9uIChudWxsIG1lYW5zIG5vIGNvbXBvc2l0aW9uLCB0cnVlIG1lYW5zIG5leHQgaXMgdGhlXG4gICAgICAgIC8vIGZpcnN0LCBmYWxzZSBtZWFucyBmaXJzdCBoYXMgYWxyZWFkeSBiZWVuIG1hcmtlZCBmb3IgdGhpc1xuICAgICAgICAvLyBjb21wb3NpdGlvbilcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbkZpcnN0Q2hhbmdlID0gbnVsbDtcbiAgICAgICAgLy8gRW5kIHRpbWUgb2YgdGhlIHByZXZpb3VzIGNvbXBvc2l0aW9uXG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25FbmRlZEF0ID0gMDtcbiAgICAgICAgLy8gVXNlZCBpbiBhIGtsdWRnZSB0byBkZXRlY3Qgd2hlbiBhbiBFbnRlciBrZXlwcmVzcyBzaG91bGQgYmVcbiAgICAgICAgLy8gY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjb21wb3NpdGlvbiBvbiBTYWZhcmksIHdoaWNoIGZpcmVzIGV2ZW50c1xuICAgICAgICAvLyBpbiB0aGUgd3Jvbmcgb3JkZXJcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvblBlbmRpbmdLZXkgPSBmYWxzZTtcbiAgICAgICAgLy8gVXNlZCB0byBjYXRlZ29yaXplIGNoYW5nZXMgYXMgcGFydCBvZiBhIGNvbXBvc2l0aW9uLCBldmVuIHdoZW5cbiAgICAgICAgLy8gdGhlIG11dGF0aW9uIGV2ZW50cyBmaXJlIHNob3J0bHkgYWZ0ZXIgdGhlIGNvbXBvc2l0aW9uZW5kIGV2ZW50XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlID0gZmFsc2U7XG4gICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICAvLyBXaGVuIGEgZHJhZyBmcm9tIHRoZSBlZGl0b3IgaXMgYWN0aXZlLCB0aGlzIHBvaW50cyBhdCB0aGUgcmFuZ2VcbiAgICAgICAgLy8gYmVpbmcgZHJhZ2dlZC5cbiAgICAgICAgdGhpcy5kcmFnZ2VkQ29udGVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFuZGxlRXZlbnQgPSB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubm90aWZpZWRGb2N1c2VkID0gdmlldy5oYXNGb2N1cztcbiAgICAgICAgLy8gT24gU2FmYXJpIGFkZGluZyBhbiBpbnB1dCBldmVudCBoYW5kbGVyIHNvbWVob3cgcHJldmVudHMgYW5cbiAgICAgICAgLy8gaXNzdWUgd2hlcmUgdGhlIGNvbXBvc2l0aW9uIHZhbmlzaGVzIHdoZW4geW91IHByZXNzIGVudGVyLlxuICAgICAgICBpZiAoYnJvd3Nlci5zYWZhcmkpXG4gICAgICAgICAgICB2aWV3LmNvbnRlbnRET00uYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsICgpID0+IG51bGwpO1xuICAgICAgICBpZiAoYnJvd3Nlci5nZWNrbylcbiAgICAgICAgICAgIGZpcmVmb3hDb3B5Q3V0SGFjayh2aWV3LmNvbnRlbnRET00ub3duZXJEb2N1bWVudCk7XG4gICAgfVxuICAgIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgICAgIGlmICghZXZlbnRCZWxvbmdzVG9FZGl0b3IodGhpcy52aWV3LCBldmVudCkgfHwgdGhpcy5pZ25vcmVEdXJpbmdDb21wb3NpdGlvbihldmVudCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChldmVudC50eXBlID09IFwia2V5ZG93blwiICYmIHRoaXMua2V5ZG93bihldmVudCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMucnVuSGFuZGxlcnMoZXZlbnQudHlwZSwgZXZlbnQpO1xuICAgIH1cbiAgICBydW5IYW5kbGVycyh0eXBlLCBldmVudCkge1xuICAgICAgICBsZXQgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzW3R5cGVdO1xuICAgICAgICBpZiAoaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IG9ic2VydmVyIG9mIGhhbmRsZXJzLm9ic2VydmVycylcbiAgICAgICAgICAgICAgICBvYnNlcnZlcih0aGlzLnZpZXcsIGV2ZW50KTtcbiAgICAgICAgICAgIGZvciAobGV0IGhhbmRsZXIgb2YgaGFuZGxlcnMuaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIodGhpcy52aWV3LCBldmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVuc3VyZUhhbmRsZXJzKHBsdWdpbnMpIHtcbiAgICAgICAgbGV0IGhhbmRsZXJzID0gY29tcHV0ZUhhbmRsZXJzKHBsdWdpbnMpLCBwcmV2ID0gdGhpcy5oYW5kbGVycywgZG9tID0gdGhpcy52aWV3LmNvbnRlbnRET007XG4gICAgICAgIGZvciAobGV0IHR5cGUgaW4gaGFuZGxlcnMpXG4gICAgICAgICAgICBpZiAodHlwZSAhPSBcInNjcm9sbFwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhc3NpdmUgPSAhaGFuZGxlcnNbdHlwZV0uaGFuZGxlcnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxldCBleGlzdHMgPSBwcmV2W3R5cGVdO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdHMgJiYgcGFzc2l2ZSAhPSAhZXhpc3RzLmhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzLmhhbmRsZUV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RzID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpXG4gICAgICAgICAgICAgICAgICAgIGRvbS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHRoaXMuaGFuZGxlRXZlbnQsIHsgcGFzc2l2ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBwcmV2KVxuICAgICAgICAgICAgaWYgKHR5cGUgIT0gXCJzY3JvbGxcIiAmJiAhaGFuZGxlcnNbdHlwZV0pXG4gICAgICAgICAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgdGhpcy5oYW5kbGVFdmVudCk7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVycztcbiAgICB9XG4gICAga2V5ZG93bihldmVudCkge1xuICAgICAgICAvLyBNdXN0IGFsd2F5cyBydW4sIGV2ZW4gaWYgYSBjdXN0b20gaGFuZGxlciBoYW5kbGVkIHRoZSBldmVudFxuICAgICAgICB0aGlzLmxhc3RLZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcbiAgICAgICAgdGhpcy5sYXN0S2V5VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IDkgJiYgRGF0ZS5ub3coKSA8IHRoaXMubGFzdEVzY1ByZXNzICsgMjAwMClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSAhPSAyNyAmJiBtb2RpZmllckNvZGVzLmluZGV4T2YoZXZlbnQua2V5Q29kZSkgPCAwKVxuICAgICAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEVzY1ByZXNzID0gMDtcbiAgICAgICAgLy8gQ2hyb21lIGZvciBBbmRyb2lkIHVzdWFsbHkgZG9lc24ndCBmaXJlIHByb3BlciBrZXkgZXZlbnRzLCBidXRcbiAgICAgICAgLy8gb2NjYXNpb25hbGx5IGRvZXMsIHVzdWFsbHkgc3Vycm91bmRlZCBieSBhIGJ1bmNoIG9mIGNvbXBsaWNhdGVkXG4gICAgICAgIC8vIGNvbXBvc2l0aW9uIGNoYW5nZXMuIFdoZW4gYW4gZW50ZXIgb3IgYmFja3NwYWNlIGtleSBldmVudCBpc1xuICAgICAgICAvLyBzZWVuLCBob2xkIG9mZiBvbiBoYW5kbGluZyBET00gZXZlbnRzIGZvciBhIGJpdCwgYW5kIHRoZW5cbiAgICAgICAgLy8gZGlzcGF0Y2ggaXQuXG4gICAgICAgIGlmIChicm93c2VyLmFuZHJvaWQgJiYgYnJvd3Nlci5jaHJvbWUgJiYgIWV2ZW50LnN5bnRoZXRpYyAmJlxuICAgICAgICAgICAgKGV2ZW50LmtleUNvZGUgPT0gMTMgfHwgZXZlbnQua2V5Q29kZSA9PSA4KSkge1xuICAgICAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLmRlbGF5QW5kcm9pZEtleShldmVudC5rZXksIGV2ZW50LmtleUNvZGUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJldmVudGluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBFbnRlciBvbiBpT1MgbWFrZXMgdGhlXG4gICAgICAgIC8vIHZpcnR1YWwga2V5Ym9hcmQgZ2V0IHN0dWNrIGluIHRoZSB3cm9uZyAobG93ZXJjYXNlKVxuICAgICAgICAvLyBzdGF0ZS4gU28gd2UgbGV0IGl0IGdvIHRocm91Z2gsIGFuZCB0aGVuLCBpblxuICAgICAgICAvLyBhcHBseURPTUNoYW5nZSwgbm90aWZ5IGtleSBoYW5kbGVycyBvZiBpdCBhbmQgcmVzZXQgdG9cbiAgICAgICAgLy8gdGhlIHN0YXRlIHRoZXkgcHJvZHVjZS5cbiAgICAgICAgbGV0IHBlbmRpbmc7XG4gICAgICAgIGlmIChicm93c2VyLmlvcyAmJiAhZXZlbnQuc3ludGhldGljICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkgJiZcbiAgICAgICAgICAgICgocGVuZGluZyA9IFBlbmRpbmdLZXlzLmZpbmQoa2V5ID0+IGtleS5rZXlDb2RlID09IGV2ZW50LmtleUNvZGUpKSAmJiAhZXZlbnQuY3RybEtleSB8fFxuICAgICAgICAgICAgICAgIEVtYWNzeVBlbmRpbmdLZXlzLmluZGV4T2YoZXZlbnQua2V5KSA+IC0xICYmIGV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5KSkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nSU9TS2V5ID0gcGVuZGluZyB8fCBldmVudDtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5mbHVzaElPU0tleSgpLCAyNTApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgIT0gMjI5KVxuICAgICAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLmZvcmNlRmx1c2goKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmbHVzaElPU0tleSgpIHtcbiAgICAgICAgbGV0IGtleSA9IHRoaXMucGVuZGluZ0lPU0tleTtcbiAgICAgICAgaWYgKCFrZXkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucGVuZGluZ0lPU0tleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoS2V5KHRoaXMudmlldy5jb250ZW50RE9NLCBrZXkua2V5LCBrZXkua2V5Q29kZSk7XG4gICAgfVxuICAgIGlnbm9yZUR1cmluZ0NvbXBvc2l0aW9uKGV2ZW50KSB7XG4gICAgICAgIGlmICghL15rZXkvLnRlc3QoZXZlbnQudHlwZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmNvbXBvc2luZyA+IDApXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnN0dW0uZGUvMjAxNi8wNi8yNC9oYW5kbGluZy1pbWUtZXZlbnRzLWluLWphdmFzY3JpcHQvLlxuICAgICAgICAvLyBPbiBzb21lIGlucHV0IG1ldGhvZCBlZGl0b3JzIChJTUVzKSwgdGhlIEVudGVyIGtleSBpcyB1c2VkIHRvXG4gICAgICAgIC8vIGNvbmZpcm0gY2hhcmFjdGVyIHNlbGVjdGlvbi4gT24gU2FmYXJpLCB3aGVuIEVudGVyIGlzIHByZXNzZWQsXG4gICAgICAgIC8vIGNvbXBvc2l0aW9uZW5kIGFuZCBrZXlkb3duIGV2ZW50cyBhcmUgc29tZXRpbWVzIGVtaXR0ZWQgaW4gdGhlXG4gICAgICAgIC8vIHdyb25nIG9yZGVyLiBUaGUga2V5IGV2ZW50IHNob3VsZCBzdGlsbCBiZSBpZ25vcmVkLCBldmVuIHdoZW5cbiAgICAgICAgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgY29tcG9zaXRpb25lbmQgZXZlbnQuXG4gICAgICAgIGlmIChicm93c2VyLnNhZmFyaSAmJiAhYnJvd3Nlci5pb3MgJiYgdGhpcy5jb21wb3NpdGlvblBlbmRpbmdLZXkgJiYgRGF0ZS5ub3coKSAtIHRoaXMuY29tcG9zaXRpb25FbmRlZEF0IDwgMTAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0tleSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzdGFydE1vdXNlU2VsZWN0aW9uKG1vdXNlU2VsZWN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLm1vdXNlU2VsZWN0aW9uKVxuICAgICAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24gPSBtb3VzZVNlbGVjdGlvbjtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24udXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLmRyYWdnZWRDb250ZW50ICYmIHVwZGF0ZS5kb2NDaGFuZ2VkKVxuICAgICAgICAgICAgdGhpcy5kcmFnZ2VkQ29udGVudCA9IHRoaXMuZHJhZ2dlZENvbnRlbnQubWFwKHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5sYXN0S2V5Q29kZSA9IHRoaXMubGFzdFNlbGVjdGlvblRpbWUgPSAwO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMubW91c2VTZWxlY3Rpb24uZGVzdHJveSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJpbmRIYW5kbGVyKHBsdWdpbiwgaGFuZGxlcikge1xuICAgIHJldHVybiAodmlldywgZXZlbnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLmNhbGwocGx1Z2luLCBldmVudCwgdmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlSGFuZGxlcnMocGx1Z2lucykge1xuICAgIGxldCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZ1bmN0aW9uIHJlY29yZCh0eXBlKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRbdHlwZV0gfHwgKHJlc3VsdFt0eXBlXSA9IHsgb2JzZXJ2ZXJzOiBbXSwgaGFuZGxlcnM6IFtdIH0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICBsZXQgc3BlYyA9IHBsdWdpbi5zcGVjO1xuICAgICAgICBpZiAoc3BlYyAmJiBzcGVjLmRvbUV2ZW50SGFuZGxlcnMpXG4gICAgICAgICAgICBmb3IgKGxldCB0eXBlIGluIHNwZWMuZG9tRXZlbnRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGxldCBmID0gc3BlYy5kb21FdmVudEhhbmRsZXJzW3R5cGVdO1xuICAgICAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgICAgICByZWNvcmQodHlwZSkuaGFuZGxlcnMucHVzaChiaW5kSGFuZGxlcihwbHVnaW4udmFsdWUsIGYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWMgJiYgc3BlYy5kb21FdmVudE9ic2VydmVycylcbiAgICAgICAgICAgIGZvciAobGV0IHR5cGUgaW4gc3BlYy5kb21FdmVudE9ic2VydmVycykge1xuICAgICAgICAgICAgICAgIGxldCBmID0gc3BlYy5kb21FdmVudE9ic2VydmVyc1t0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAoZilcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkKHR5cGUpLm9ic2VydmVycy5wdXNoKGJpbmRIYW5kbGVyKHBsdWdpbi52YWx1ZSwgZikpO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCB0eXBlIGluIGhhbmRsZXJzKVxuICAgICAgICByZWNvcmQodHlwZSkuaGFuZGxlcnMucHVzaChoYW5kbGVyc1t0eXBlXSk7XG4gICAgZm9yIChsZXQgdHlwZSBpbiBvYnNlcnZlcnMpXG4gICAgICAgIHJlY29yZCh0eXBlKS5vYnNlcnZlcnMucHVzaChvYnNlcnZlcnNbdHlwZV0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBQZW5kaW5nS2V5cyA9IFtcbiAgICB7IGtleTogXCJCYWNrc3BhY2VcIiwga2V5Q29kZTogOCwgaW5wdXRUeXBlOiBcImRlbGV0ZUNvbnRlbnRCYWNrd2FyZFwiIH0sXG4gICAgeyBrZXk6IFwiRW50ZXJcIiwga2V5Q29kZTogMTMsIGlucHV0VHlwZTogXCJpbnNlcnRQYXJhZ3JhcGhcIiB9LFxuICAgIHsga2V5OiBcIkVudGVyXCIsIGtleUNvZGU6IDEzLCBpbnB1dFR5cGU6IFwiaW5zZXJ0TGluZUJyZWFrXCIgfSxcbiAgICB7IGtleTogXCJEZWxldGVcIiwga2V5Q29kZTogNDYsIGlucHV0VHlwZTogXCJkZWxldGVDb250ZW50Rm9yd2FyZFwiIH1cbl07XG5jb25zdCBFbWFjc3lQZW5kaW5nS2V5cyA9IFwiZHRoa29cIjtcbi8vIEtleSBjb2RlcyBmb3IgbW9kaWZpZXIga2V5c1xuY29uc3QgbW9kaWZpZXJDb2RlcyA9IFsxNiwgMTcsIDE4LCAyMCwgOTEsIDkyLCAyMjQsIDIyNV07XG5jb25zdCBkcmFnU2Nyb2xsTWFyZ2luID0gNjtcbmZ1bmN0aW9uIGRyYWdTY3JvbGxTcGVlZChkaXN0KSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIGRpc3QpICogMC43ICsgODtcbn1cbmZ1bmN0aW9uIGRpc3QoYSwgYikge1xuICAgIHJldHVybiBNYXRoLm1heChNYXRoLmFicyhhLmNsaWVudFggLSBiLmNsaWVudFgpLCBNYXRoLmFicyhhLmNsaWVudFkgLSBiLmNsaWVudFkpKTtcbn1cbmNsYXNzIE1vdXNlU2VsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBzdGFydEV2ZW50LCBzdHlsZSwgbXVzdFNlbGVjdCkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnN0YXJ0RXZlbnQgPSBzdGFydEV2ZW50O1xuICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7XG4gICAgICAgIHRoaXMubXVzdFNlbGVjdCA9IG11c3RTZWxlY3Q7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3BlZWQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgdGhpcy5zY3JvbGxpbmcgPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0RXZlbnQgPSBzdGFydEV2ZW50O1xuICAgICAgICB0aGlzLnNjcm9sbFBhcmVudCA9IHNjcm9sbGFibGVQYXJlbnQodmlldy5jb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5hdG9tcyA9IHZpZXcuc3RhdGUuZmFjZXQoYXRvbWljUmFuZ2VzKS5tYXAoZiA9PiBmKHZpZXcpKTtcbiAgICAgICAgbGV0IGRvYyA9IHZpZXcuY29udGVudERPTS5vd25lckRvY3VtZW50O1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdmUgPSB0aGlzLm1vdmUuYmluZCh0aGlzKSk7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwID0gdGhpcy51cC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5leHRlbmQgPSBzdGFydEV2ZW50LnNoaWZ0S2V5O1xuICAgICAgICB0aGlzLm11bHRpcGxlID0gdmlldy5zdGF0ZS5mYWNldChFZGl0b3JTdGF0ZS5hbGxvd011bHRpcGxlU2VsZWN0aW9ucykgJiYgYWRkc1NlbGVjdGlvblJhbmdlKHZpZXcsIHN0YXJ0RXZlbnQpO1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gaXNJblByaW1hcnlTZWxlY3Rpb24odmlldywgc3RhcnRFdmVudCkgJiYgZ2V0Q2xpY2tUeXBlKHN0YXJ0RXZlbnQpID09IDEgPyBudWxsIDogZmFsc2U7XG4gICAgfVxuICAgIHN0YXJ0KGV2ZW50KSB7XG4gICAgICAgIC8vIFdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgc2VsZWN0aW9uLCBpbW1lZGlhdGVseSBhcHBseSB0aGVcbiAgICAgICAgLy8gZWZmZWN0IG9mIHN0YXJ0aW5nIHRoZSBzZWxlY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3QoZXZlbnQpO1xuICAgIH1cbiAgICBtb3ZlKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbnMgPT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcgfHwgdGhpcy5kcmFnZ2luZyA9PSBudWxsICYmIGRpc3QodGhpcy5zdGFydEV2ZW50LCBldmVudCkgPCAxMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5sYXN0RXZlbnQgPSBldmVudCk7XG4gICAgICAgIGxldCBzeCA9IDAsIHN5ID0gMDtcbiAgICAgICAgbGV0IHJlY3QgPSAoKF9hID0gdGhpcy5zY3JvbGxQYXJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSlcbiAgICAgICAgICAgIHx8IHsgbGVmdDogMCwgdG9wOiAwLCByaWdodDogdGhpcy52aWV3Lndpbi5pbm5lcldpZHRoLCBib3R0b206IHRoaXMudmlldy53aW4uaW5uZXJIZWlnaHQgfTtcbiAgICAgICAgbGV0IG1hcmdpbnMgPSBnZXRTY3JvbGxNYXJnaW5zKHRoaXMudmlldyk7XG4gICAgICAgIGlmIChldmVudC5jbGllbnRYIC0gbWFyZ2lucy5sZWZ0IDw9IHJlY3QubGVmdCArIGRyYWdTY3JvbGxNYXJnaW4pXG4gICAgICAgICAgICBzeCA9IC1kcmFnU2Nyb2xsU3BlZWQocmVjdC5sZWZ0IC0gZXZlbnQuY2xpZW50WCk7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmNsaWVudFggKyBtYXJnaW5zLnJpZ2h0ID49IHJlY3QucmlnaHQgLSBkcmFnU2Nyb2xsTWFyZ2luKVxuICAgICAgICAgICAgc3ggPSBkcmFnU2Nyb2xsU3BlZWQoZXZlbnQuY2xpZW50WCAtIHJlY3QucmlnaHQpO1xuICAgICAgICBpZiAoZXZlbnQuY2xpZW50WSAtIG1hcmdpbnMudG9wIDw9IHJlY3QudG9wICsgZHJhZ1Njcm9sbE1hcmdpbilcbiAgICAgICAgICAgIHN5ID0gLWRyYWdTY3JvbGxTcGVlZChyZWN0LnRvcCAtIGV2ZW50LmNsaWVudFkpO1xuICAgICAgICBlbHNlIGlmIChldmVudC5jbGllbnRZICsgbWFyZ2lucy5ib3R0b20gPj0gcmVjdC5ib3R0b20gLSBkcmFnU2Nyb2xsTWFyZ2luKVxuICAgICAgICAgICAgc3kgPSBkcmFnU2Nyb2xsU3BlZWQoZXZlbnQuY2xpZW50WSAtIHJlY3QuYm90dG9tKTtcbiAgICAgICAgdGhpcy5zZXRTY3JvbGxTcGVlZChzeCwgc3kpO1xuICAgIH1cbiAgICB1cChldmVudCkge1xuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5sYXN0RXZlbnQpO1xuICAgICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zZXRTY3JvbGxTcGVlZCgwLCAwKTtcbiAgICAgICAgbGV0IGRvYyA9IHRoaXMudmlldy5jb250ZW50RE9NLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW92ZSk7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwKTtcbiAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubW91c2VTZWxlY3Rpb24gPSB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IG51bGw7XG4gICAgfVxuICAgIHNldFNjcm9sbFNwZWVkKHN4LCBzeSkge1xuICAgICAgICB0aGlzLnNjcm9sbFNwZWVkID0geyB4OiBzeCwgeTogc3kgfTtcbiAgICAgICAgaWYgKHN4IHx8IHN5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zY3JvbGxpbmcgPCAwKVxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsaW5nID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5zY3JvbGwoKSwgNTApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc2Nyb2xsaW5nID4gLTEpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY3JvbGxpbmcpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxpbmcgPSAtMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY3JvbGwoKSB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCArPSB0aGlzLnNjcm9sbFNwZWVkLng7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AgKz0gdGhpcy5zY3JvbGxTcGVlZC55O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52aWV3Lndpbi5zY3JvbGxCeSh0aGlzLnNjcm9sbFNwZWVkLngsIHRoaXMuc2Nyb2xsU3BlZWQueSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5sYXN0RXZlbnQpO1xuICAgIH1cbiAgICBza2lwQXRvbXMoc2VsKSB7XG4gICAgICAgIGxldCByYW5nZXMgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHNlbC5yYW5nZXNbaV0sIHVwZGF0ZWQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvcyA9IHNraXBBdG9taWNSYW5nZXModGhpcy5hdG9tcywgcmFuZ2UuZnJvbSwgMCk7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyAhPSByYW5nZS5mcm9tKVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gc2tpcEF0b21pY1Jhbmdlcyh0aGlzLmF0b21zLCByYW5nZS5mcm9tLCAtMSk7XG4gICAgICAgICAgICAgICAgbGV0IHRvID0gc2tpcEF0b21pY1Jhbmdlcyh0aGlzLmF0b21zLCByYW5nZS50bywgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gIT0gcmFuZ2UuZnJvbSB8fCB0byAhPSByYW5nZS50bylcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IEVkaXRvclNlbGVjdGlvbi5yYW5nZShyYW5nZS5mcm9tID09IHJhbmdlLmFuY2hvciA/IGZyb20gOiB0bywgcmFuZ2UuZnJvbSA9PSByYW5nZS5oZWFkID8gZnJvbSA6IHRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyYW5nZXMpXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlcyA9IHNlbC5yYW5nZXMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICByYW5nZXNbaV0gPSB1cGRhdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYW5nZXMgPyBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcywgc2VsLm1haW5JbmRleCkgOiBzZWw7XG4gICAgfVxuICAgIHNlbGVjdChldmVudCkge1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzLCBzZWxlY3Rpb24gPSB0aGlzLnNraXBBdG9tcyh0aGlzLnN0eWxlLmdldChldmVudCwgdGhpcy5leHRlbmQsIHRoaXMubXVsdGlwbGUpKTtcbiAgICAgICAgaWYgKHRoaXMubXVzdFNlbGVjdCB8fCAhc2VsZWN0aW9uLmVxKHZpZXcuc3RhdGUuc2VsZWN0aW9uLCB0aGlzLmRyYWdnaW5nID09PSBmYWxzZSkpXG4gICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbixcbiAgICAgICAgICAgICAgICB1c2VyRXZlbnQ6IFwic2VsZWN0LnBvaW50ZXJcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubXVzdFNlbGVjdCA9IGZhbHNlO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlLnVwZGF0ZSh1cGRhdGUpKVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCksIDIwKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRzU2VsZWN0aW9uUmFuZ2UodmlldywgZXZlbnQpIHtcbiAgICBsZXQgZmFjZXQgPSB2aWV3LnN0YXRlLmZhY2V0KGNsaWNrQWRkc1NlbGVjdGlvblJhbmdlKTtcbiAgICByZXR1cm4gZmFjZXQubGVuZ3RoID8gZmFjZXRbMF0oZXZlbnQpIDogYnJvd3Nlci5tYWMgPyBldmVudC5tZXRhS2V5IDogZXZlbnQuY3RybEtleTtcbn1cbmZ1bmN0aW9uIGRyYWdNb3Zlc1NlbGVjdGlvbih2aWV3LCBldmVudCkge1xuICAgIGxldCBmYWNldCA9IHZpZXcuc3RhdGUuZmFjZXQoZHJhZ01vdmVzU2VsZWN0aW9uJDEpO1xuICAgIHJldHVybiBmYWNldC5sZW5ndGggPyBmYWNldFswXShldmVudCkgOiBicm93c2VyLm1hYyA/ICFldmVudC5hbHRLZXkgOiAhZXZlbnQuY3RybEtleTtcbn1cbmZ1bmN0aW9uIGlzSW5QcmltYXJ5U2VsZWN0aW9uKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHsgbWFpbiB9ID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKG1haW4uZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBPbiBib3VuZGFyeSBjbGlja3MsIGNoZWNrIHdoZXRoZXIgdGhlIGNvb3JkaW5hdGVzIGFyZSBpbnNpZGUgdGhlXG4gICAgLy8gc2VsZWN0aW9uJ3MgY2xpZW50IHJlY3RhbmdsZXNcbiAgICBsZXQgc2VsID0gZ2V0U2VsZWN0aW9uKHZpZXcucm9vdCk7XG4gICAgaWYgKCFzZWwgfHwgc2VsLnJhbmdlQ291bnQgPT0gMClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IHJlY3RzID0gc2VsLmdldFJhbmdlQXQoMCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgIGlmIChyZWN0LmxlZnQgPD0gZXZlbnQuY2xpZW50WCAmJiByZWN0LnJpZ2h0ID49IGV2ZW50LmNsaWVudFggJiZcbiAgICAgICAgICAgIHJlY3QudG9wIDw9IGV2ZW50LmNsaWVudFkgJiYgcmVjdC5ib3R0b20gPj0gZXZlbnQuY2xpZW50WSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBldmVudEJlbG9uZ3NUb0VkaXRvcih2aWV3LCBldmVudCkge1xuICAgIGlmICghZXZlbnQuYnViYmxlcylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBub2RlID0gZXZlbnQudGFyZ2V0LCBjVmlldzsgbm9kZSAhPSB2aWV3LmNvbnRlbnRET007IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpXG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlID09IDExIHx8ICgoY1ZpZXcgPSBDb250ZW50Vmlldy5nZXQobm9kZSkpICYmIGNWaWV3Lmlnbm9yZUV2ZW50KGV2ZW50KSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5jb25zdCBoYW5kbGVycyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3Qgb2JzZXJ2ZXJzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG4vLyBUaGlzIGlzIHZlcnkgY3J1ZGUsIGJ1dCB1bmZvcnR1bmF0ZWx5IGJvdGggdGhlc2UgYnJvd3NlcnMgX3ByZXRlbmRfXG4vLyB0aGF0IHRoZXkgaGF2ZSBhIGNsaXBib2FyZCBBUElcdTIwMTRhbGwgdGhlIG9iamVjdHMgYW5kIG1ldGhvZHMgYXJlXG4vLyB0aGVyZSwgdGhleSBqdXN0IGRvbid0IHdvcmssIGFuZCB0aGV5IGFyZSBoYXJkIHRvIHRlc3QuXG5jb25zdCBicm9rZW5DbGlwYm9hcmRBUEkgPSAoYnJvd3Nlci5pZSAmJiBicm93c2VyLmllX3ZlcnNpb24gPCAxNSkgfHxcbiAgICAoYnJvd3Nlci5pb3MgJiYgYnJvd3Nlci53ZWJraXRfdmVyc2lvbiA8IDYwNCk7XG5mdW5jdGlvbiBjYXB0dXJlUGFzdGUodmlldykge1xuICAgIGxldCBwYXJlbnQgPSB2aWV3LmRvbS5wYXJlbnROb2RlO1xuICAgIGlmICghcGFyZW50KVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHRhcmdldCA9IHBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIikpO1xuICAgIHRhcmdldC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwMHB4OyB0b3A6IDEwcHhcIjtcbiAgICB0YXJnZXQuZm9jdXMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlKCk7XG4gICAgICAgIGRvUGFzdGUodmlldywgdGFyZ2V0LnZhbHVlKTtcbiAgICB9LCA1MCk7XG59XG5mdW5jdGlvbiBkb1Bhc3RlKHZpZXcsIGlucHV0KSB7XG4gICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGNoYW5nZXMsIGkgPSAxLCB0ZXh0ID0gc3RhdGUudG9UZXh0KGlucHV0KTtcbiAgICBsZXQgYnlMaW5lID0gdGV4dC5saW5lcyA9PSBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLmxlbmd0aDtcbiAgICBsZXQgbGluZXdpc2UgPSBsYXN0TGluZXdpc2VDb3B5ICE9IG51bGwgJiYgc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5ldmVyeShyID0+IHIuZW1wdHkpICYmIGxhc3RMaW5ld2lzZUNvcHkgPT0gdGV4dC50b1N0cmluZygpO1xuICAgIGlmIChsaW5ld2lzZSkge1xuICAgICAgICBsZXQgbGFzdExpbmUgPSAtMTtcbiAgICAgICAgY2hhbmdlcyA9IHN0YXRlLmNoYW5nZUJ5UmFuZ2UocmFuZ2UgPT4ge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KHJhbmdlLmZyb20pO1xuICAgICAgICAgICAgaWYgKGxpbmUuZnJvbSA9PSBsYXN0TGluZSlcbiAgICAgICAgICAgICAgICByZXR1cm4geyByYW5nZSB9O1xuICAgICAgICAgICAgbGFzdExpbmUgPSBsaW5lLmZyb207XG4gICAgICAgICAgICBsZXQgaW5zZXJ0ID0gc3RhdGUudG9UZXh0KChieUxpbmUgPyB0ZXh0LmxpbmUoaSsrKS50ZXh0IDogaW5wdXQpICsgc3RhdGUubGluZUJyZWFrKTtcbiAgICAgICAgICAgIHJldHVybiB7IGNoYW5nZXM6IHsgZnJvbTogbGluZS5mcm9tLCBpbnNlcnQgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyYW5nZS5mcm9tICsgaW5zZXJ0Lmxlbmd0aCkgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGJ5TGluZSkge1xuICAgICAgICBjaGFuZ2VzID0gc3RhdGUuY2hhbmdlQnlSYW5nZShyYW5nZSA9PiB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHRleHQubGluZShpKyspO1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhbmdlczogeyBmcm9tOiByYW5nZS5mcm9tLCB0bzogcmFuZ2UudG8sIGluc2VydDogbGluZS50ZXh0IH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocmFuZ2UuZnJvbSArIGxpbmUubGVuZ3RoKSB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNoYW5nZXMgPSBzdGF0ZS5yZXBsYWNlU2VsZWN0aW9uKHRleHQpO1xuICAgIH1cbiAgICB2aWV3LmRpc3BhdGNoKGNoYW5nZXMsIHtcbiAgICAgICAgdXNlckV2ZW50OiBcImlucHV0LnBhc3RlXCIsXG4gICAgICAgIHNjcm9sbEludG9WaWV3OiB0cnVlXG4gICAgfSk7XG59XG5vYnNlcnZlcnMuc2Nyb2xsID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxUb3AgPSB2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3A7XG4gICAgdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxMZWZ0ID0gdmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdDtcbn07XG5oYW5kbGVycy5rZXlkb3duID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLnNldFNlbGVjdGlvbk9yaWdpbihcInNlbGVjdFwiKTtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAyNylcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmxhc3RFc2NQcmVzcyA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbm9ic2VydmVycy50b3VjaHN0YXJ0ID0gKHZpZXcsIGUpID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdFRvdWNoVGltZSA9IERhdGUubm93KCk7XG4gICAgdmlldy5pbnB1dFN0YXRlLnNldFNlbGVjdGlvbk9yaWdpbihcInNlbGVjdC5wb2ludGVyXCIpO1xufTtcbm9ic2VydmVycy50b3VjaG1vdmUgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUuc2V0U2VsZWN0aW9uT3JpZ2luKFwic2VsZWN0LnBvaW50ZXJcIik7XG59O1xuaGFuZGxlcnMubW91c2Vkb3duID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgdmlldy5vYnNlcnZlci5mbHVzaCgpO1xuICAgIGlmICh2aWV3LmlucHV0U3RhdGUubGFzdFRvdWNoVGltZSA+IERhdGUubm93KCkgLSAyMDAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIElnbm9yZSB0b3VjaCBpbnRlcmFjdGlvblxuICAgIGxldCBzdHlsZSA9IG51bGw7XG4gICAgZm9yIChsZXQgbWFrZVN0eWxlIG9mIHZpZXcuc3RhdGUuZmFjZXQobW91c2VTZWxlY3Rpb25TdHlsZSkpIHtcbiAgICAgICAgc3R5bGUgPSBtYWtlU3R5bGUodmlldywgZXZlbnQpO1xuICAgICAgICBpZiAoc3R5bGUpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKCFzdHlsZSAmJiBldmVudC5idXR0b24gPT0gMClcbiAgICAgICAgc3R5bGUgPSBiYXNpY01vdXNlU2VsZWN0aW9uKHZpZXcsIGV2ZW50KTtcbiAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgbGV0IG11c3RGb2N1cyA9ICF2aWV3Lmhhc0ZvY3VzO1xuICAgICAgICB2aWV3LmlucHV0U3RhdGUuc3RhcnRNb3VzZVNlbGVjdGlvbihuZXcgTW91c2VTZWxlY3Rpb24odmlldywgZXZlbnQsIHN0eWxlLCBtdXN0Rm9jdXMpKTtcbiAgICAgICAgaWYgKG11c3RGb2N1cylcbiAgICAgICAgICAgIHZpZXcub2JzZXJ2ZXIuaWdub3JlKCgpID0+IGZvY3VzUHJldmVudFNjcm9sbCh2aWV3LmNvbnRlbnRET00pKTtcbiAgICAgICAgbGV0IG1vdXNlU2VsID0gdmlldy5pbnB1dFN0YXRlLm1vdXNlU2VsZWN0aW9uO1xuICAgICAgICBpZiAobW91c2VTZWwpIHtcbiAgICAgICAgICAgIG1vdXNlU2VsLnN0YXJ0KGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybiBtb3VzZVNlbC5kcmFnZ2luZyA9PT0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmZ1bmN0aW9uIHJhbmdlRm9yQ2xpY2sodmlldywgcG9zLCBiaWFzLCB0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gMSkgeyAvLyBTaW5nbGUgY2xpY2tcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zLCBiaWFzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSA9PSAyKSB7IC8vIERvdWJsZSBjbGlja1xuICAgICAgICByZXR1cm4gZ3JvdXBBdCh2aWV3LnN0YXRlLCBwb3MsIGJpYXMpO1xuICAgIH1cbiAgICBlbHNlIHsgLy8gVHJpcGxlIGNsaWNrXG4gICAgICAgIGxldCB2aXN1YWwgPSBMaW5lVmlldy5maW5kKHZpZXcuZG9jVmlldywgcG9zKSwgbGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdCh2aXN1YWwgPyB2aXN1YWwucG9zQXRFbmQgOiBwb3MpO1xuICAgICAgICBsZXQgZnJvbSA9IHZpc3VhbCA/IHZpc3VhbC5wb3NBdFN0YXJ0IDogbGluZS5mcm9tLCB0byA9IHZpc3VhbCA/IHZpc3VhbC5wb3NBdEVuZCA6IGxpbmUudG87XG4gICAgICAgIGlmICh0byA8IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCAmJiB0byA9PSBsaW5lLnRvKVxuICAgICAgICAgICAgdG8rKztcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tLCB0byk7XG4gICAgfVxufVxubGV0IGluc2lkZVkgPSAoeSwgcmVjdCkgPT4geSA+PSByZWN0LnRvcCAmJiB5IDw9IHJlY3QuYm90dG9tO1xubGV0IGluc2lkZSA9ICh4LCB5LCByZWN0KSA9PiBpbnNpZGVZKHksIHJlY3QpICYmIHggPj0gcmVjdC5sZWZ0ICYmIHggPD0gcmVjdC5yaWdodDtcbi8vIFRyeSB0byBkZXRlcm1pbmUsIGZvciB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMsIGFzc29jaWF0ZWQgd2l0aCB0aGVcbi8vIGdpdmVuIHBvc2l0aW9uLCB3aGV0aGVyIHRoZXkgYXJlIHJlbGF0ZWQgdG8gdGhlIGVsZW1lbnQgYmVmb3JlIG9yXG4vLyB0aGUgZWxlbWVudCBhZnRlciB0aGUgcG9zaXRpb24uXG5mdW5jdGlvbiBmaW5kUG9zaXRpb25TaWRlKHZpZXcsIHBvcywgeCwgeSkge1xuICAgIGxldCBsaW5lID0gTGluZVZpZXcuZmluZCh2aWV3LmRvY1ZpZXcsIHBvcyk7XG4gICAgaWYgKCFsaW5lKVxuICAgICAgICByZXR1cm4gMTtcbiAgICBsZXQgb2ZmID0gcG9zIC0gbGluZS5wb3NBdFN0YXJ0O1xuICAgIC8vIExpbmUgYm91bmRhcmllcyBwb2ludCBpbnRvIHRoZSBsaW5lXG4gICAgaWYgKG9mZiA9PSAwKVxuICAgICAgICByZXR1cm4gMTtcbiAgICBpZiAob2ZmID09IGxpbmUubGVuZ3RoKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgLy8gUG9zaXRpb25zIG9uIHRvcCBvZiBhbiBlbGVtZW50IHBvaW50IGF0IHRoYXQgZWxlbWVudFxuICAgIGxldCBiZWZvcmUgPSBsaW5lLmNvb3Jkc0F0KG9mZiwgLTEpO1xuICAgIGlmIChiZWZvcmUgJiYgaW5zaWRlKHgsIHksIGJlZm9yZSkpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICBsZXQgYWZ0ZXIgPSBsaW5lLmNvb3Jkc0F0KG9mZiwgMSk7XG4gICAgaWYgKGFmdGVyICYmIGluc2lkZSh4LCB5LCBhZnRlcikpXG4gICAgICAgIHJldHVybiAxO1xuICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYSBsaW5lIHdyYXAgcG9pbnQuIFBpY2sgYmVmb3JlIGlmIHRoZSBwb2ludCBpc1xuICAgIC8vIGJlc2lkZSBpdC5cbiAgICByZXR1cm4gYmVmb3JlICYmIGluc2lkZVkoeSwgYmVmb3JlKSA/IC0xIDogMTtcbn1cbmZ1bmN0aW9uIHF1ZXJ5UG9zKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHBvcyA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0sIGZhbHNlKTtcbiAgICByZXR1cm4geyBwb3MsIGJpYXM6IGZpbmRQb3NpdGlvblNpZGUodmlldywgcG9zLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSB9O1xufVxuY29uc3QgQmFkTW91c2VEZXRhaWwgPSBicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8PSAxMTtcbmxldCBsYXN0TW91c2VEb3duID0gbnVsbCwgbGFzdE1vdXNlRG93bkNvdW50ID0gMCwgbGFzdE1vdXNlRG93blRpbWUgPSAwO1xuZnVuY3Rpb24gZ2V0Q2xpY2tUeXBlKGV2ZW50KSB7XG4gICAgaWYgKCFCYWRNb3VzZURldGFpbClcbiAgICAgICAgcmV0dXJuIGV2ZW50LmRldGFpbDtcbiAgICBsZXQgbGFzdCA9IGxhc3RNb3VzZURvd24sIGxhc3RUaW1lID0gbGFzdE1vdXNlRG93blRpbWU7XG4gICAgbGFzdE1vdXNlRG93biA9IGV2ZW50O1xuICAgIGxhc3RNb3VzZURvd25UaW1lID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gbGFzdE1vdXNlRG93bkNvdW50ID0gIWxhc3QgfHwgKGxhc3RUaW1lID4gRGF0ZS5ub3coKSAtIDQwMCAmJiBNYXRoLmFicyhsYXN0LmNsaWVudFggLSBldmVudC5jbGllbnRYKSA8IDIgJiZcbiAgICAgICAgTWF0aC5hYnMobGFzdC5jbGllbnRZIC0gZXZlbnQuY2xpZW50WSkgPCAyKSA/IChsYXN0TW91c2VEb3duQ291bnQgKyAxKSAlIDMgOiAxO1xufVxuZnVuY3Rpb24gYmFzaWNNb3VzZVNlbGVjdGlvbih2aWV3LCBldmVudCkge1xuICAgIGxldCBzdGFydCA9IHF1ZXJ5UG9zKHZpZXcsIGV2ZW50KSwgdHlwZSA9IGdldENsaWNrVHlwZShldmVudCk7XG4gICAgbGV0IHN0YXJ0U2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQucG9zID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHN0YXJ0LnBvcyk7XG4gICAgICAgICAgICAgICAgc3RhcnRTZWwgPSBzdGFydFNlbC5tYXAodXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXQoZXZlbnQsIGV4dGVuZCwgbXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSBxdWVyeVBvcyh2aWV3LCBldmVudCksIHJlbW92ZWQ7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZUZvckNsaWNrKHZpZXcsIGN1ci5wb3MsIGN1ci5iaWFzLCB0eXBlKTtcbiAgICAgICAgICAgIGlmIChzdGFydC5wb3MgIT0gY3VyLnBvcyAmJiAhZXh0ZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0UmFuZ2UgPSByYW5nZUZvckNsaWNrKHZpZXcsIHN0YXJ0LnBvcywgc3RhcnQuYmlhcywgdHlwZSk7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBNYXRoLm1pbihzdGFydFJhbmdlLmZyb20sIHJhbmdlLmZyb20pLCB0byA9IE1hdGgubWF4KHN0YXJ0UmFuZ2UudG8sIHJhbmdlLnRvKTtcbiAgICAgICAgICAgICAgICByYW5nZSA9IGZyb20gPCByYW5nZS5mcm9tID8gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20sIHRvKSA6IEVkaXRvclNlbGVjdGlvbi5yYW5nZSh0bywgZnJvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXh0ZW5kKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbC5yZXBsYWNlUmFuZ2Uoc3RhcnRTZWwubWFpbi5leHRlbmQocmFuZ2UuZnJvbSwgcmFuZ2UudG8pKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKG11bHRpcGxlICYmIHR5cGUgPT0gMSAmJiBzdGFydFNlbC5yYW5nZXMubGVuZ3RoID4gMSAmJiAocmVtb3ZlZCA9IHJlbW92ZVJhbmdlQXJvdW5kKHN0YXJ0U2VsLCBjdXIucG9zKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgICAgICAgICBlbHNlIGlmIChtdWx0aXBsZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRTZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKFtyYW5nZV0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVJhbmdlQXJvdW5kKHNlbCwgcG9zKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSBzZWwucmFuZ2VzW2ldO1xuICAgICAgICBpZiAoZnJvbSA8PSBwb3MgJiYgdG8gPj0gcG9zKVxuICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUoc2VsLnJhbmdlcy5zbGljZSgwLCBpKS5jb25jYXQoc2VsLnJhbmdlcy5zbGljZShpICsgMSkpLCBzZWwubWFpbkluZGV4ID09IGkgPyAwIDogc2VsLm1haW5JbmRleCAtIChzZWwubWFpbkluZGV4ID4gaSA/IDEgOiAwKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuaGFuZGxlcnMuZHJhZ3N0YXJ0ID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgbGV0IHsgc2VsZWN0aW9uOiB7IG1haW46IHJhbmdlIH0gfSA9IHZpZXcuc3RhdGU7XG4gICAgaWYgKGV2ZW50LnRhcmdldC5kcmFnZ2FibGUpIHtcbiAgICAgICAgbGV0IGNWaWV3ID0gdmlldy5kb2NWaWV3Lm5lYXJlc3QoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgaWYgKGNWaWV3ICYmIGNWaWV3LmlzV2lkZ2V0KSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGNWaWV3LnBvc0F0U3RhcnQsIHRvID0gZnJvbSArIGNWaWV3Lmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChmcm9tID49IHJhbmdlLnRvIHx8IHRvIDw9IHJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB7IGlucHV0U3RhdGUgfSA9IHZpZXc7XG4gICAgaWYgKGlucHV0U3RhdGUubW91c2VTZWxlY3Rpb24pXG4gICAgICAgIGlucHV0U3RhdGUubW91c2VTZWxlY3Rpb24uZHJhZ2dpbmcgPSB0cnVlO1xuICAgIGlucHV0U3RhdGUuZHJhZ2dlZENvbnRlbnQgPSByYW5nZTtcbiAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKFwiVGV4dFwiLCB2aWV3LnN0YXRlLnNsaWNlRG9jKHJhbmdlLmZyb20sIHJhbmdlLnRvKSk7XG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gXCJjb3B5TW92ZVwiO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuaGFuZGxlcnMuZHJhZ2VuZCA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IG51bGw7XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmZ1bmN0aW9uIGRyb3BUZXh0KHZpZXcsIGV2ZW50LCB0ZXh0LCBkaXJlY3QpIHtcbiAgICBpZiAoIXRleHQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgZHJvcFBvcyA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0sIGZhbHNlKTtcbiAgICBsZXQgeyBkcmFnZ2VkQ29udGVudCB9ID0gdmlldy5pbnB1dFN0YXRlO1xuICAgIGxldCBkZWwgPSBkaXJlY3QgJiYgZHJhZ2dlZENvbnRlbnQgJiYgZHJhZ01vdmVzU2VsZWN0aW9uKHZpZXcsIGV2ZW50KVxuICAgICAgICA/IHsgZnJvbTogZHJhZ2dlZENvbnRlbnQuZnJvbSwgdG86IGRyYWdnZWRDb250ZW50LnRvIH0gOiBudWxsO1xuICAgIGxldCBpbnMgPSB7IGZyb206IGRyb3BQb3MsIGluc2VydDogdGV4dCB9O1xuICAgIGxldCBjaGFuZ2VzID0gdmlldy5zdGF0ZS5jaGFuZ2VzKGRlbCA/IFtkZWwsIGluc10gOiBpbnMpO1xuICAgIHZpZXcuZm9jdXMoKTtcbiAgICB2aWV3LmRpc3BhdGNoKHtcbiAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgc2VsZWN0aW9uOiB7IGFuY2hvcjogY2hhbmdlcy5tYXBQb3MoZHJvcFBvcywgLTEpLCBoZWFkOiBjaGFuZ2VzLm1hcFBvcyhkcm9wUG9zLCAxKSB9LFxuICAgICAgICB1c2VyRXZlbnQ6IGRlbCA/IFwibW92ZS5kcm9wXCIgOiBcImlucHV0LmRyb3BcIlxuICAgIH0pO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IG51bGw7XG59XG5oYW5kbGVycy5kcm9wID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodmlldy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IGZpbGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzO1xuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGgpIHsgLy8gRm9yIGEgZmlsZSBkcm9wLCByZWFkIHRoZSBmaWxlJ3MgdGV4dC5cbiAgICAgICAgbGV0IHRleHQgPSBBcnJheShmaWxlcy5sZW5ndGgpLCByZWFkID0gMDtcbiAgICAgICAgbGV0IGZpbmlzaEZpbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoKytyZWFkID09IGZpbGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBkcm9wVGV4dCh2aWV3LCBldmVudCwgdGV4dC5maWx0ZXIocyA9PiBzICE9IG51bGwpLmpvaW4odmlldy5zdGF0ZS5saW5lQnJlYWspLCBmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcjtcbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZmluaXNoRmlsZTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEvW1xceDAwLVxceDA4XFx4MGUtXFx4MWZdezJ9Ly50ZXN0KHJlYWRlci5yZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0W2ldID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBmaW5pc2hGaWxlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHRleHQgPSBldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcIlRleHRcIik7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICBkcm9wVGV4dCh2aWV3LCBldmVudCwgdGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuaGFuZGxlcnMucGFzdGUgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBpZiAodmlldy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgdmlldy5vYnNlcnZlci5mbHVzaCgpO1xuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZG9QYXN0ZSh2aWV3LCBkYXRhLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpIHx8IGRhdGEuZ2V0RGF0YShcInRleHQvdXJpLXRleHRcIikpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNhcHR1cmVQYXN0ZSh2aWV3KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjYXB0dXJlQ29weSh2aWV3LCB0ZXh0KSB7XG4gICAgLy8gVGhlIGV4dHJhIHdyYXBwZXIgaXMgc29tZWhvdyBuZWNlc3Nhcnkgb24gSUUvRWRnZSB0byBwcmV2ZW50IHRoZVxuICAgIC8vIGNvbnRlbnQgZnJvbSBiZWluZyBtYW5nbGVkIHdoZW4gaXQgaXMgcHV0IG9udG8gdGhlIGNsaXBib2FyZFxuICAgIGxldCBwYXJlbnQgPSB2aWV3LmRvbS5wYXJlbnROb2RlO1xuICAgIGlmICghcGFyZW50KVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHRhcmdldCA9IHBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIikpO1xuICAgIHRhcmdldC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwMHB4OyB0b3A6IDEwcHhcIjtcbiAgICB0YXJnZXQudmFsdWUgPSB0ZXh0O1xuICAgIHRhcmdldC5mb2N1cygpO1xuICAgIHRhcmdldC5zZWxlY3Rpb25FbmQgPSB0ZXh0Lmxlbmd0aDtcbiAgICB0YXJnZXQuc2VsZWN0aW9uU3RhcnQgPSAwO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0YXJnZXQucmVtb3ZlKCk7XG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICB9LCA1MCk7XG59XG5mdW5jdGlvbiBjb3BpZWRSYW5nZShzdGF0ZSkge1xuICAgIGxldCBjb250ZW50ID0gW10sIHJhbmdlcyA9IFtdLCBsaW5ld2lzZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IHJhbmdlIG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpXG4gICAgICAgIGlmICghcmFuZ2UuZW1wdHkpIHtcbiAgICAgICAgICAgIGNvbnRlbnQucHVzaChzdGF0ZS5zbGljZURvYyhyYW5nZS5mcm9tLCByYW5nZS50bykpO1xuICAgICAgICAgICAgcmFuZ2VzLnB1c2gocmFuZ2UpO1xuICAgICAgICB9XG4gICAgaWYgKCFjb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAvLyBOb3RoaW5nIHNlbGVjdGVkLCBkbyBhIGxpbmUtd2lzZSBjb3B5XG4gICAgICAgIGxldCB1cHRvID0gLTE7XG4gICAgICAgIGZvciAobGV0IHsgZnJvbSB9IG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChmcm9tKTtcbiAgICAgICAgICAgIGlmIChsaW5lLm51bWJlciA+IHVwdG8pIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LnB1c2gobGluZS50ZXh0KTtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaCh7IGZyb206IGxpbmUuZnJvbSwgdG86IE1hdGgubWluKHN0YXRlLmRvYy5sZW5ndGgsIGxpbmUudG8gKyAxKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwdG8gPSBsaW5lLm51bWJlcjtcbiAgICAgICAgfVxuICAgICAgICBsaW5ld2lzZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB7IHRleHQ6IGNvbnRlbnQuam9pbihzdGF0ZS5saW5lQnJlYWspLCByYW5nZXMsIGxpbmV3aXNlIH07XG59XG5sZXQgbGFzdExpbmV3aXNlQ29weSA9IG51bGw7XG5oYW5kbGVycy5jb3B5ID0gaGFuZGxlcnMuY3V0ID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgbGV0IHsgdGV4dCwgcmFuZ2VzLCBsaW5ld2lzZSB9ID0gY29waWVkUmFuZ2Uodmlldy5zdGF0ZSk7XG4gICAgaWYgKCF0ZXh0ICYmICFsaW5ld2lzZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxhc3RMaW5ld2lzZUNvcHkgPSBsaW5ld2lzZSA/IHRleHQgOiBudWxsO1xuICAgIGlmIChldmVudC50eXBlID09IFwiY3V0XCIgJiYgIXZpZXcuc3RhdGUucmVhZE9ubHkpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goe1xuICAgICAgICAgICAgY2hhbmdlczogcmFuZ2VzLFxuICAgICAgICAgICAgc2Nyb2xsSW50b1ZpZXc6IHRydWUsXG4gICAgICAgICAgICB1c2VyRXZlbnQ6IFwiZGVsZXRlLmN1dFwiXG4gICAgICAgIH0pO1xuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZGF0YS5jbGVhckRhdGEoKTtcbiAgICAgICAgZGF0YS5zZXREYXRhKFwidGV4dC9wbGFpblwiLCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjYXB0dXJlQ29weSh2aWV3LCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5jb25zdCBpc0ZvY3VzQ2hhbmdlID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG5mdW5jdGlvbiBmb2N1c0NoYW5nZVRyYW5zYWN0aW9uKHN0YXRlLCBmb2N1cykge1xuICAgIGxldCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgZ2V0RWZmZWN0IG9mIHN0YXRlLmZhY2V0KGZvY3VzQ2hhbmdlRWZmZWN0KSkge1xuICAgICAgICBsZXQgZWZmZWN0ID0gZ2V0RWZmZWN0KHN0YXRlLCBmb2N1cyk7XG4gICAgICAgIGlmIChlZmZlY3QpXG4gICAgICAgICAgICBlZmZlY3RzLnB1c2goZWZmZWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIGVmZmVjdHMgPyBzdGF0ZS51cGRhdGUoeyBlZmZlY3RzLCBhbm5vdGF0aW9uczogaXNGb2N1c0NoYW5nZS5vZih0cnVlKSB9KSA6IG51bGw7XG59XG5mdW5jdGlvbiB1cGRhdGVGb3JGb2N1c0NoYW5nZSh2aWV3KSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGxldCBmb2N1cyA9IHZpZXcuaGFzRm9jdXM7XG4gICAgICAgIGlmIChmb2N1cyAhPSB2aWV3LmlucHV0U3RhdGUubm90aWZpZWRGb2N1c2VkKSB7XG4gICAgICAgICAgICBsZXQgdHIgPSBmb2N1c0NoYW5nZVRyYW5zYWN0aW9uKHZpZXcuc3RhdGUsIGZvY3VzKTtcbiAgICAgICAgICAgIGlmICh0cilcbiAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB2aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgIH1cbiAgICB9LCAxMCk7XG59XG5vYnNlcnZlcnMuZm9jdXMgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdEZvY3VzVGltZSA9IERhdGUubm93KCk7XG4gICAgLy8gV2hlbiBmb2N1c2luZyByZXNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uLCBtb3ZlIGl0IGJhY2sgdG8gd2hlcmUgaXQgd2FzXG4gICAgaWYgKCF2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3AgJiYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsVG9wIHx8IHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsTGVmdCkpIHtcbiAgICAgICAgdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wID0gdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxUb3A7XG4gICAgICAgIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQgPSB2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHVwZGF0ZUZvckZvY3VzQ2hhbmdlKHZpZXcpO1xufTtcbm9ic2VydmVycy5ibHVyID0gdmlldyA9PiB7XG4gICAgdmlldy5vYnNlcnZlci5jbGVhclNlbGVjdGlvblJhbmdlKCk7XG4gICAgdXBkYXRlRm9yRm9jdXNDaGFuZ2Uodmlldyk7XG59O1xub2JzZXJ2ZXJzLmNvbXBvc2l0aW9uc3RhcnQgPSBvYnNlcnZlcnMuY29tcG9zaXRpb251cGRhdGUgPSB2aWV3ID0+IHtcbiAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPT0gbnVsbClcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSB0cnVlO1xuICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nIDwgMCkge1xuICAgICAgICAvLyBGSVhNRSBwb3NzaWJseSBzZXQgYSB0aW1lb3V0IHRvIGNsZWFyIGl0IGFnYWluIG9uIEFuZHJvaWRcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA9IDA7XG4gICAgfVxufTtcbm9ic2VydmVycy5jb21wb3NpdGlvbmVuZCA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPSAtMTtcbiAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25FbmRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25QZW5kaW5nS2V5ID0gdHJ1ZTtcbiAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlID0gdmlldy5vYnNlcnZlci5wZW5kaW5nUmVjb3JkcygpLmxlbmd0aCA+IDA7XG4gICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSBudWxsO1xuICAgIGlmIChicm93c2VyLmNocm9tZSAmJiBicm93c2VyLmFuZHJvaWQpIHtcbiAgICAgICAgLy8gRGVsYXkgZmx1c2hpbmcgZm9yIGEgYml0IG9uIEFuZHJvaWQgYmVjYXVzZSBpdCdsbCBvZnRlbiBmaXJlIGFcbiAgICAgICAgLy8gYnVuY2ggb2YgY29udHJhZGljdG9yeSBjaGFuZ2VzIGluIGEgcm93IGF0IGVuZCBvZiBjb21wb3NpdG9uXG4gICAgICAgIHZpZXcub2JzZXJ2ZXIuZmx1c2hTb29uKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UpIHtcbiAgICAgICAgLy8gSWYgd2UgZm91bmQgcGVuZGluZyByZWNvcmRzLCBzY2hlZHVsZSBhIGZsdXNoLlxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHZpZXcub2JzZXJ2ZXIuZmx1c2goKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UsIG1ha2Ugc3VyZSB0aGF0LCBpZiBubyBjaGFuZ2VzIGNvbWUgaW4gc29vbiwgdGhlXG4gICAgICAgIC8vIGNvbXBvc2l0aW9uIHZpZXcgaXMgY2xlYXJlZC5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA8IDAgJiYgdmlldy5kb2NWaWV3Lmhhc0NvbXBvc2l0aW9uKVxuICAgICAgICAgICAgICAgIHZpZXcudXBkYXRlKFtdKTtcbiAgICAgICAgfSwgNTApO1xuICAgIH1cbn07XG5vYnNlcnZlcnMuY29udGV4dG1lbnUgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdENvbnRleHRNZW51ID0gRGF0ZS5ub3coKTtcbn07XG5oYW5kbGVycy5iZWZvcmVpbnB1dCA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICAvLyBCZWNhdXNlIENocm9tZSBBbmRyb2lkIGRvZXNuJ3QgZmlyZSB1c2VmdWwga2V5IGV2ZW50cywgdXNlXG4gICAgLy8gYmVmb3JlaW5wdXQgdG8gZGV0ZWN0IGJhY2tzcGFjZSAoYW5kIHBvc3NpYmx5IGVudGVyIGFuZCBkZWxldGUsXG4gICAgLy8gYnV0IHRob3NlIHVzdWFsbHkgZG9uJ3QgZXZlbiBzZWVtIHRvIGZpcmUgYmVmb3JlaW5wdXQgZXZlbnRzIGF0XG4gICAgLy8gdGhlIG1vbWVudCkgYW5kIGZha2UgYSBrZXkgZXZlbnQgZm9yIGl0LlxuICAgIC8vXG4gICAgLy8gKHByZXZlbnREZWZhdWx0IG9uIGJlZm9yZWlucHV0LCB0aG91Z2ggc3VwcG9ydGVkIGluIHRoZSBzcGVjLFxuICAgIC8vIHNlZW1zIHRvIGRvIG5vdGhpbmcgYXQgYWxsIG9uIENocm9tZSkuXG4gICAgbGV0IHBlbmRpbmc7XG4gICAgaWYgKGJyb3dzZXIuY2hyb21lICYmIGJyb3dzZXIuYW5kcm9pZCAmJiAocGVuZGluZyA9IFBlbmRpbmdLZXlzLmZpbmQoa2V5ID0+IGtleS5pbnB1dFR5cGUgPT0gZXZlbnQuaW5wdXRUeXBlKSkpIHtcbiAgICAgICAgdmlldy5vYnNlcnZlci5kZWxheUFuZHJvaWRLZXkocGVuZGluZy5rZXksIHBlbmRpbmcua2V5Q29kZSk7XG4gICAgICAgIGlmIChwZW5kaW5nLmtleSA9PSBcIkJhY2tzcGFjZVwiIHx8IHBlbmRpbmcua2V5ID09IFwiRGVsZXRlXCIpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFZpZXdIZWlnaHQgPSAoKF9hID0gd2luZG93LnZpc3VhbFZpZXdwb3J0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGVpZ2h0KSB8fCAwO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIC8vIEJhY2tzcGFjaW5nIG5lYXIgdW5lZGl0YWJsZSBub2RlcyBvbiBDaHJvbWUgQW5kcm9pZCBzb21ldGltZXNcbiAgICAgICAgICAgICAgICAvLyBjbG9zZXMgdGhlIHZpcnR1YWwga2V5Ym9hcmQuIFRoaXMgdHJpZXMgdG8gY3J1ZGVseSBkZXRlY3RcbiAgICAgICAgICAgICAgICAvLyB0aGF0IGFuZCByZWZvY3VzIHRvIGdldCBpdCBiYWNrLlxuICAgICAgICAgICAgICAgIGlmICgoKChfYSA9IHdpbmRvdy52aXN1YWxWaWV3cG9ydCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhlaWdodCkgfHwgMCkgPiBzdGFydFZpZXdIZWlnaHQgKyAxMCAmJiB2aWV3Lmhhc0ZvY3VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuY29udGVudERPTS5ibHVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5jb25zdCBhcHBsaWVkRmlyZWZveEhhY2sgPSAvKkBfX1BVUkVfXyovbmV3IFNldDtcbi8vIEluIEZpcmVmb3gsIHdoZW4gY3V0L2NvcHkgaGFuZGxlcnMgYXJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCwgdGhhdFxuLy8gc29tZWhvdyBhdm9pZHMgYSBidWcgd2hlcmUgdGhvc2UgZXZlbnRzIGFyZW4ndCBmaXJlZCB3aGVuIHRoZVxuLy8gc2VsZWN0aW9uIGlzIGVtcHR5LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvZGV2L2lzc3Vlcy8xMDgyXG4vLyBhbmQgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTk1OTYxXG5mdW5jdGlvbiBmaXJlZm94Q29weUN1dEhhY2soZG9jKSB7XG4gICAgaWYgKCFhcHBsaWVkRmlyZWZveEhhY2suaGFzKGRvYykpIHtcbiAgICAgICAgYXBwbGllZEZpcmVmb3hIYWNrLmFkZChkb2MpO1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcihcImNvcHlcIiwgKCkgPT4geyB9KTtcbiAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoXCJjdXRcIiwgKCkgPT4geyB9KTtcbiAgICB9XG59XG5cbmNvbnN0IHdyYXBwaW5nV2hpdGVTcGFjZSA9IFtcInByZS13cmFwXCIsIFwibm9ybWFsXCIsIFwicHJlLWxpbmVcIiwgXCJicmVhay1zcGFjZXNcIl07XG5jbGFzcyBIZWlnaHRPcmFjbGUge1xuICAgIGNvbnN0cnVjdG9yKGxpbmVXcmFwcGluZykge1xuICAgICAgICB0aGlzLmxpbmVXcmFwcGluZyA9IGxpbmVXcmFwcGluZztcbiAgICAgICAgdGhpcy5kb2MgPSBUZXh0LmVtcHR5O1xuICAgICAgICB0aGlzLmhlaWdodFNhbXBsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5saW5lSGVpZ2h0ID0gMTQ7IC8vIFRoZSBoZWlnaHQgb2YgYW4gZW50aXJlIGxpbmUgKGxpbmUtaGVpZ2h0KVxuICAgICAgICB0aGlzLmNoYXJXaWR0aCA9IDc7XG4gICAgICAgIHRoaXMudGV4dEhlaWdodCA9IDE0OyAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBhY3R1YWwgZm9udCAoZm9udC1zaXplKVxuICAgICAgICB0aGlzLmxpbmVMZW5ndGggPSAzMDtcbiAgICAgICAgLy8gVXNlZCB0byB0cmFjaywgZHVyaW5nIHVwZGF0ZUhlaWdodCwgaWYgYW55IGFjdHVhbCBoZWlnaHRzIGNoYW5nZWRcbiAgICAgICAgdGhpcy5oZWlnaHRDaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuICAgIGhlaWdodEZvckdhcChmcm9tLCB0bykge1xuICAgICAgICBsZXQgbGluZXMgPSB0aGlzLmRvYy5saW5lQXQodG8pLm51bWJlciAtIHRoaXMuZG9jLmxpbmVBdChmcm9tKS5udW1iZXIgKyAxO1xuICAgICAgICBpZiAodGhpcy5saW5lV3JhcHBpbmcpXG4gICAgICAgICAgICBsaW5lcyArPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKCh0byAtIGZyb20pIC0gKGxpbmVzICogdGhpcy5saW5lTGVuZ3RoICogMC41KSkgLyB0aGlzLmxpbmVMZW5ndGgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZUhlaWdodCAqIGxpbmVzO1xuICAgIH1cbiAgICBoZWlnaHRGb3JMaW5lKGxlbmd0aCkge1xuICAgICAgICBpZiAoIXRoaXMubGluZVdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGluZUhlaWdodDtcbiAgICAgICAgbGV0IGxpbmVzID0gMSArIE1hdGgubWF4KDAsIE1hdGguY2VpbCgobGVuZ3RoIC0gdGhpcy5saW5lTGVuZ3RoKSAvICh0aGlzLmxpbmVMZW5ndGggLSA1KSkpO1xuICAgICAgICByZXR1cm4gbGluZXMgKiB0aGlzLmxpbmVIZWlnaHQ7XG4gICAgfVxuICAgIHNldERvYyhkb2MpIHsgdGhpcy5kb2MgPSBkb2M7IHJldHVybiB0aGlzOyB9XG4gICAgbXVzdFJlZnJlc2hGb3JXcmFwcGluZyh3aGl0ZVNwYWNlKSB7XG4gICAgICAgIHJldHVybiAod3JhcHBpbmdXaGl0ZVNwYWNlLmluZGV4T2Yod2hpdGVTcGFjZSkgPiAtMSkgIT0gdGhpcy5saW5lV3JhcHBpbmc7XG4gICAgfVxuICAgIG11c3RSZWZyZXNoRm9ySGVpZ2h0cyhsaW5lSGVpZ2h0cykge1xuICAgICAgICBsZXQgbmV3SGVpZ2h0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZUhlaWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBoID0gbGluZUhlaWdodHNbaV07XG4gICAgICAgICAgICBpZiAoaCA8IDApIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5oZWlnaHRTYW1wbGVzW01hdGguZmxvb3IoaCAqIDEwKV0pIHsgLy8gUm91bmQgdG8gLjEgcGl4ZWxzXG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodFNhbXBsZXNbTWF0aC5mbG9vcihoICogMTApXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0hlaWdodDtcbiAgICB9XG4gICAgcmVmcmVzaCh3aGl0ZVNwYWNlLCBsaW5lSGVpZ2h0LCBjaGFyV2lkdGgsIHRleHRIZWlnaHQsIGxpbmVMZW5ndGgsIGtub3duSGVpZ2h0cykge1xuICAgICAgICBsZXQgbGluZVdyYXBwaW5nID0gd3JhcHBpbmdXaGl0ZVNwYWNlLmluZGV4T2Yod2hpdGVTcGFjZSkgPiAtMTtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSBNYXRoLnJvdW5kKGxpbmVIZWlnaHQpICE9IE1hdGgucm91bmQodGhpcy5saW5lSGVpZ2h0KSB8fCB0aGlzLmxpbmVXcmFwcGluZyAhPSBsaW5lV3JhcHBpbmc7XG4gICAgICAgIHRoaXMubGluZVdyYXBwaW5nID0gbGluZVdyYXBwaW5nO1xuICAgICAgICB0aGlzLmxpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0O1xuICAgICAgICB0aGlzLmNoYXJXaWR0aCA9IGNoYXJXaWR0aDtcbiAgICAgICAgdGhpcy50ZXh0SGVpZ2h0ID0gdGV4dEhlaWdodDtcbiAgICAgICAgdGhpcy5saW5lTGVuZ3RoID0gbGluZUxlbmd0aDtcbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrbm93bkhlaWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgaCA9IGtub3duSGVpZ2h0c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaCA8IDApXG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlc1tNYXRoLmZsb29yKGggKiAxMCldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG59XG4vLyBUaGlzIG9iamVjdCBpcyB1c2VkIGJ5IGB1cGRhdGVIZWlnaHRgIHRvIG1ha2UgRE9NIG1lYXN1cmVtZW50c1xuLy8gYXJyaXZlIGF0IHRoZSByaWdodCBuaWRlcy4gVGhlIGBoZWlnaHRzYCBhcnJheSBpcyBhIHNlcXVlbmNlIG9mXG4vLyBibG9jayBoZWlnaHRzLCBzdGFydGluZyBmcm9tIHBvc2l0aW9uIGBmcm9tYC5cbmNsYXNzIE1lYXN1cmVkSGVpZ2h0cyB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgaGVpZ2h0cykge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmhlaWdodHMgPSBoZWlnaHRzO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB9XG4gICAgZ2V0IG1vcmUoKSB7IHJldHVybiB0aGlzLmluZGV4IDwgdGhpcy5oZWlnaHRzLmxlbmd0aDsgfVxufVxuLyoqXG5SZWNvcmQgdXNlZCB0byByZXByZXNlbnQgaW5mb3JtYXRpb24gYWJvdXQgYSBibG9jay1sZXZlbCBlbGVtZW50XG5pbiB0aGUgZWRpdG9yIHZpZXcuXG4qL1xuY2xhc3MgQmxvY2tJbmZvIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBlbGVtZW50LlxuICAgICovXG4gICAgbGVuZ3RoLCBcbiAgICAvKipcbiAgICBUaGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IChyZWxhdGl2ZSB0byB0aGUgdG9wIG9mIHRoZVxuICAgIGRvY3VtZW50KS5cbiAgICAqL1xuICAgIHRvcCwgXG4gICAgLyoqXG4gICAgSXRzIGhlaWdodC5cbiAgICAqL1xuICAgIGhlaWdodCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsIFdlaXJkIHBhY2tlZCBmaWVsZCB0aGF0IGhvbGRzIGFuIGFycmF5IG9mIGNoaWxkcmVuXG4gICAgZm9yIGNvbXBvc2l0ZSBibG9ja3MsIGEgZGVjb3JhdGlvbiBmb3IgYmxvY2sgd2lkZ2V0cywgYW5kIGFcbiAgICBudW1iZXIgaW5kaWNhdGluZyB0aGUgYW1vdW50IG9mIHdpZGdldC1jcmVhdGUgbGluZSBicmVha3MgZm9yXG4gICAgdGV4dCBibG9ja3MuXG4gICAgKi9cbiAgICBfY29udGVudCkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gX2NvbnRlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSB0eXBlIG9mIGVsZW1lbnQgdGhpcyBpcy4gV2hlbiBxdWVyeWluZyBsaW5lcywgdGhpcyBtYXkgYmVcbiAgICBhbiBhcnJheSBvZiBhbGwgdGhlIGJsb2NrcyB0aGF0IG1ha2UgdXAgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9jb250ZW50ID09IFwibnVtYmVyXCIgPyBCbG9ja1R5cGUuVGV4dCA6XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHRoaXMuX2NvbnRlbnQpID8gdGhpcy5fY29udGVudCA6IHRoaXMuX2NvbnRlbnQudHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiB0aGUgZWxlbWVudCBhcyBhIGRvY3VtZW50IHBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IHRvKCkgeyByZXR1cm4gdGhpcy5mcm9tICsgdGhpcy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBUaGUgYm90dG9tIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50LlxuICAgICovXG4gICAgZ2V0IGJvdHRvbSgpIHsgcmV0dXJuIHRoaXMudG9wICsgdGhpcy5oZWlnaHQ7IH1cbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIGEgd2lkZ2V0IGJsb2NrLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSB3aWRnZXRcbiAgICBhc3NvY2lhdGVkIHdpdGggaXQuXG4gICAgKi9cbiAgICBnZXQgd2lkZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudCBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbiA/IHRoaXMuX2NvbnRlbnQud2lkZ2V0IDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgSWYgdGhpcyBpcyBhIHRleHRibG9jaywgdGhpcyBob2xkcyB0aGUgbnVtYmVyIG9mIGxpbmUgYnJlYWtzXG4gICAgdGhhdCBhcHBlYXIgaW4gd2lkZ2V0cyBpbnNpZGUgdGhlIGJsb2NrLlxuICAgICovXG4gICAgZ2V0IHdpZGdldExpbmVCcmVha3MoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5fY29udGVudCA9PSBcIm51bWJlclwiID8gdGhpcy5fY29udGVudCA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgam9pbihvdGhlcikge1xuICAgICAgICBsZXQgY29udGVudCA9IChBcnJheS5pc0FycmF5KHRoaXMuX2NvbnRlbnQpID8gdGhpcy5fY29udGVudCA6IFt0aGlzXSlcbiAgICAgICAgICAgIC5jb25jYXQoQXJyYXkuaXNBcnJheShvdGhlci5fY29udGVudCkgPyBvdGhlci5fY29udGVudCA6IFtvdGhlcl0pO1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyh0aGlzLmZyb20sIHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoLCB0aGlzLnRvcCwgdGhpcy5oZWlnaHQgKyBvdGhlci5oZWlnaHQsIGNvbnRlbnQpO1xuICAgIH1cbn1cbnZhciBRdWVyeVR5cGUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChRdWVyeVR5cGUpIHtcbiAgICBRdWVyeVR5cGVbUXVlcnlUeXBlW1wiQnlQb3NcIl0gPSAwXSA9IFwiQnlQb3NcIjtcbiAgICBRdWVyeVR5cGVbUXVlcnlUeXBlW1wiQnlIZWlnaHRcIl0gPSAxXSA9IFwiQnlIZWlnaHRcIjtcbiAgICBRdWVyeVR5cGVbUXVlcnlUeXBlW1wiQnlQb3NOb0hlaWdodFwiXSA9IDJdID0gXCJCeVBvc05vSGVpZ2h0XCI7XG5yZXR1cm4gUXVlcnlUeXBlfSkoUXVlcnlUeXBlIHx8IChRdWVyeVR5cGUgPSB7fSkpO1xuY29uc3QgRXBzaWxvbiA9IDFlLTM7XG5jbGFzcyBIZWlnaHRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCwgLy8gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvdmVyZWRcbiAgICBoZWlnaHQsIC8vIEhlaWdodCBvZiB0aGlzIHBhcnQgb2YgdGhlIGRvY3VtZW50XG4gICAgZmxhZ3MgPSAyIC8qIEZsYWcuT3V0ZGF0ZWQgKi8pIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgfVxuICAgIGdldCBvdXRkYXRlZCgpIHsgcmV0dXJuICh0aGlzLmZsYWdzICYgMiAvKiBGbGFnLk91dGRhdGVkICovKSA+IDA7IH1cbiAgICBzZXQgb3V0ZGF0ZWQodmFsdWUpIHsgdGhpcy5mbGFncyA9ICh2YWx1ZSA/IDIgLyogRmxhZy5PdXRkYXRlZCAqLyA6IDApIHwgKHRoaXMuZmxhZ3MgJiB+MiAvKiBGbGFnLk91dGRhdGVkICovKTsgfVxuICAgIHNldEhlaWdodChvcmFjbGUsIGhlaWdodCkge1xuICAgICAgICBpZiAodGhpcy5oZWlnaHQgIT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5oZWlnaHQgLSBoZWlnaHQpID4gRXBzaWxvbilcbiAgICAgICAgICAgICAgICBvcmFjbGUuaGVpZ2h0Q2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCYXNlIGNhc2UgaXMgdG8gcmVwbGFjZSBhIGxlYWYgbm9kZSwgd2hpY2ggc2ltcGx5IGJ1aWxkcyBhIHRyZWVcbiAgICAvLyBmcm9tIHRoZSBuZXcgbm9kZXMgYW5kIHJldHVybnMgdGhhdCAoSGVpZ2h0TWFwQnJhbmNoIGFuZFxuICAgIC8vIEhlaWdodE1hcEdhcCBvdmVycmlkZSB0aGlzIHRvIGFjdHVhbGx5IHVzZSBmcm9tL3RvKVxuICAgIHJlcGxhY2UoX2Zyb20sIF90bywgbm9kZXMpIHtcbiAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZihub2Rlcyk7XG4gICAgfVxuICAgIC8vIEFnYWluLCB0aGVzZSBhcmUgYmFzZSBjYXNlcywgYW5kIGFyZSBvdmVycmlkZGVuIGZvciBicmFuY2ggYW5kIGdhcCBub2Rlcy5cbiAgICBkZWNvbXBvc2VMZWZ0KF90bywgcmVzdWx0KSB7IHJlc3VsdC5wdXNoKHRoaXMpOyB9XG4gICAgZGVjb21wb3NlUmlnaHQoX2Zyb20sIHJlc3VsdCkgeyByZXN1bHQucHVzaCh0aGlzKTsgfVxuICAgIGFwcGx5Q2hhbmdlcyhkZWNvcmF0aW9ucywgb2xkRG9jLCBvcmFjbGUsIGNoYW5nZXMpIHtcbiAgICAgICAgbGV0IG1lID0gdGhpcywgZG9jID0gb3JhY2xlLmRvYztcbiAgICAgICAgZm9yIChsZXQgaSA9IGNoYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB7IGZyb21BLCB0b0EsIGZyb21CLCB0b0IgfSA9IGNoYW5nZXNbaV07XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBtZS5saW5lQXQoZnJvbUEsIFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0LCBvcmFjbGUuc2V0RG9jKG9sZERvYyksIDAsIDApO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHN0YXJ0LnRvID49IHRvQSA/IHN0YXJ0IDogbWUubGluZUF0KHRvQSwgUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQsIG9yYWNsZSwgMCwgMCk7XG4gICAgICAgICAgICB0b0IgKz0gZW5kLnRvIC0gdG9BO1xuICAgICAgICAgICAgdG9BID0gZW5kLnRvO1xuICAgICAgICAgICAgd2hpbGUgKGkgPiAwICYmIHN0YXJ0LmZyb20gPD0gY2hhbmdlc1tpIC0gMV0udG9BKSB7XG4gICAgICAgICAgICAgICAgZnJvbUEgPSBjaGFuZ2VzW2kgLSAxXS5mcm9tQTtcbiAgICAgICAgICAgICAgICBmcm9tQiA9IGNoYW5nZXNbaSAtIDFdLmZyb21CO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUEgPCBzdGFydC5mcm9tKVxuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG1lLmxpbmVBdChmcm9tQSwgUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQsIG9yYWNsZSwgMCwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcm9tQiArPSBzdGFydC5mcm9tIC0gZnJvbUE7XG4gICAgICAgICAgICBmcm9tQSA9IHN0YXJ0LmZyb207XG4gICAgICAgICAgICBsZXQgbm9kZXMgPSBOb2RlQnVpbGRlci5idWlsZChvcmFjbGUuc2V0RG9jKGRvYyksIGRlY29yYXRpb25zLCBmcm9tQiwgdG9CKTtcbiAgICAgICAgICAgIG1lID0gbWUucmVwbGFjZShmcm9tQSwgdG9BLCBub2Rlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lLnVwZGF0ZUhlaWdodChvcmFjbGUsIDApO1xuICAgIH1cbiAgICBzdGF0aWMgZW1wdHkoKSB7IHJldHVybiBuZXcgSGVpZ2h0TWFwVGV4dCgwLCAwKTsgfVxuICAgIC8vIG5vZGVzIHVzZXMgbnVsbCB2YWx1ZXMgdG8gaW5kaWNhdGUgdGhlIHBvc2l0aW9uIG9mIGxpbmUgYnJlYWtzLlxuICAgIC8vIFRoZXJlIGFyZSBuZXZlciBsaW5lIGJyZWFrcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBhcnJheSwgb3JcbiAgICAvLyB0d28gbGluZSBicmVha3MgbmV4dCB0byBlYWNoIG90aGVyLCBhbmQgdGhlIGFycmF5IGlzbid0IGFsbG93ZWRcbiAgICAvLyB0byBiZSBlbXB0eSAoc2FtZSByZXN0cmljdGlvbnMgYXMgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGJ1aWxkZXIpLlxuICAgIHN0YXRpYyBvZihub2Rlcykge1xuICAgICAgICBpZiAobm9kZXMubGVuZ3RoID09IDEpXG4gICAgICAgICAgICByZXR1cm4gbm9kZXNbMF07XG4gICAgICAgIGxldCBpID0gMCwgaiA9IG5vZGVzLmxlbmd0aCwgYmVmb3JlID0gMCwgYWZ0ZXIgPSAwO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoaSA9PSBqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZSA+IGFmdGVyICogMikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BsaXQgPSBub2Rlc1tpIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdC5icmVhaylcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZSgtLWksIDEsIHNwbGl0LmxlZnQsIG51bGwsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKC0taSwgMSwgc3BsaXQubGVmdCwgc3BsaXQucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBqICs9IDEgKyBzcGxpdC5icmVhaztcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIC09IHNwbGl0LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFmdGVyID4gYmVmb3JlICogMikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BsaXQgPSBub2Rlc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0LmJyZWFrKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGosIDEsIHNwbGl0LmxlZnQsIG51bGwsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGosIDEsIHNwbGl0LmxlZnQsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgaiArPSAyICsgc3BsaXQuYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyIC09IHNwbGl0LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiZWZvcmUgPCBhZnRlcikge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZXNbaSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dClcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlICs9IG5leHQuc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZXNbLS1qXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dClcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgKz0gbmV4dC5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBicmsgPSAwO1xuICAgICAgICBpZiAobm9kZXNbaSAtIDFdID09IG51bGwpIHtcbiAgICAgICAgICAgIGJyayA9IDE7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgYnJrID0gMTtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEhlaWdodE1hcEJyYW5jaChIZWlnaHRNYXAub2Yobm9kZXMuc2xpY2UoMCwgaSkpLCBicmssIEhlaWdodE1hcC5vZihub2Rlcy5zbGljZShqKSkpO1xuICAgIH1cbn1cbkhlaWdodE1hcC5wcm90b3R5cGUuc2l6ZSA9IDE7XG5jbGFzcyBIZWlnaHRNYXBCbG9jayBleHRlbmRzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCBoZWlnaHQsIGRlY28pIHtcbiAgICAgICAgc3VwZXIobGVuZ3RoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmRlY28gPSBkZWNvO1xuICAgIH1cbiAgICBibG9ja0F0KF9oZWlnaHQsIF9vcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKG9mZnNldCwgdGhpcy5sZW5ndGgsIHRvcCwgdGhpcy5oZWlnaHQsIHRoaXMuZGVjbyB8fCAwKTtcbiAgICB9XG4gICAgbGluZUF0KF92YWx1ZSwgX3R5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tBdCgwLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpIHtcbiAgICAgICAgaWYgKGZyb20gPD0gb2Zmc2V0ICsgdGhpcy5sZW5ndGggJiYgdG8gPj0gb2Zmc2V0KVxuICAgICAgICAgICAgZih0aGlzLmJsb2NrQXQoMCwgb3JhY2xlLCB0b3AsIG9mZnNldCkpO1xuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBfZm9yY2UgPSBmYWxzZSwgbWVhc3VyZWQpIHtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gb2Zmc2V0ICYmIG1lYXN1cmVkLm1vcmUpXG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodChvcmFjbGUsIG1lYXN1cmVkLmhlaWdodHNbbWVhc3VyZWQuaW5kZXgrK10pO1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBibG9jaygke3RoaXMubGVuZ3RofSlgOyB9XG59XG5jbGFzcyBIZWlnaHRNYXBUZXh0IGV4dGVuZHMgSGVpZ2h0TWFwQmxvY2sge1xuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHN1cGVyKGxlbmd0aCwgaGVpZ2h0LCBudWxsKTtcbiAgICAgICAgdGhpcy5jb2xsYXBzZWQgPSAwOyAvLyBBbW91bnQgb2YgY29sbGFwc2VkIGNvbnRlbnQgaW4gdGhlIGxpbmVcbiAgICAgICAgdGhpcy53aWRnZXRIZWlnaHQgPSAwOyAvLyBNYXhpbXVtIGlubGluZSB3aWRnZXQgaGVpZ2h0XG4gICAgICAgIHRoaXMuYnJlYWtzID0gMDsgLy8gTnVtYmVyIG9mIHdpZGdldC1pbnRyb2R1Y2VkIGxpbmUgYnJlYWtzIG9uIHRoZSBsaW5lXG4gICAgfVxuICAgIGJsb2NrQXQoX2hlaWdodCwgX29yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8ob2Zmc2V0LCB0aGlzLmxlbmd0aCwgdG9wLCB0aGlzLmhlaWdodCwgdGhpcy5icmVha3MpO1xuICAgIH1cbiAgICByZXBsYWNlKF9mcm9tLCBfdG8sIG5vZGVzKSB7XG4gICAgICAgIGxldCBub2RlID0gbm9kZXNbMF07XG4gICAgICAgIGlmIChub2Rlcy5sZW5ndGggPT0gMSAmJiAobm9kZSBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQgfHwgbm9kZSBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcCAmJiAobm9kZS5mbGFncyAmIDQgLyogRmxhZy5TaW5nbGVMaW5lICovKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKHRoaXMubGVuZ3RoIC0gbm9kZS5sZW5ndGgpIDwgMTApIHtcbiAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwKVxuICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgSGVpZ2h0TWFwVGV4dChub2RlLmxlbmd0aCwgdGhpcy5oZWlnaHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG5vZGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgICAgICAgICBpZiAoIXRoaXMub3V0ZGF0ZWQpXG4gICAgICAgICAgICAgICAgbm9kZS5vdXRkYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gSGVpZ2h0TWFwLm9mKG5vZGVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBmb3JjZSA9IGZhbHNlLCBtZWFzdXJlZCkge1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSBvZmZzZXQgJiYgbWVhc3VyZWQubW9yZSlcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KG9yYWNsZSwgbWVhc3VyZWQuaGVpZ2h0c1ttZWFzdXJlZC5pbmRleCsrXSk7XG4gICAgICAgIGVsc2UgaWYgKGZvcmNlIHx8IHRoaXMub3V0ZGF0ZWQpXG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodChvcmFjbGUsIE1hdGgubWF4KHRoaXMud2lkZ2V0SGVpZ2h0LCBvcmFjbGUuaGVpZ2h0Rm9yTGluZSh0aGlzLmxlbmd0aCAtIHRoaXMuY29sbGFwc2VkKSkgK1xuICAgICAgICAgICAgICAgIHRoaXMuYnJlYWtzICogb3JhY2xlLmxpbmVIZWlnaHQpO1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBsaW5lKCR7dGhpcy5sZW5ndGh9JHt0aGlzLmNvbGxhcHNlZCA/IC10aGlzLmNvbGxhcHNlZCA6IFwiXCJ9JHt0aGlzLndpZGdldEhlaWdodCA/IFwiOlwiICsgdGhpcy53aWRnZXRIZWlnaHQgOiBcIlwifSlgO1xuICAgIH1cbn1cbmNsYXNzIEhlaWdodE1hcEdhcCBleHRlbmRzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoKSB7IHN1cGVyKGxlbmd0aCwgMCk7IH1cbiAgICBoZWlnaHRNZXRyaWNzKG9yYWNsZSwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBmaXJzdExpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdChvZmZzZXQpLm51bWJlciwgbGFzdExpbmUgPSBvcmFjbGUuZG9jLmxpbmVBdChvZmZzZXQgKyB0aGlzLmxlbmd0aCkubnVtYmVyO1xuICAgICAgICBsZXQgbGluZXMgPSBsYXN0TGluZSAtIGZpcnN0TGluZSArIDE7XG4gICAgICAgIGxldCBwZXJMaW5lLCBwZXJDaGFyID0gMDtcbiAgICAgICAgaWYgKG9yYWNsZS5saW5lV3JhcHBpbmcpIHtcbiAgICAgICAgICAgIGxldCB0b3RhbFBlckxpbmUgPSBNYXRoLm1pbih0aGlzLmhlaWdodCwgb3JhY2xlLmxpbmVIZWlnaHQgKiBsaW5lcyk7XG4gICAgICAgICAgICBwZXJMaW5lID0gdG90YWxQZXJMaW5lIC8gbGluZXM7XG4gICAgICAgICAgICBpZiAodGhpcy5sZW5ndGggPiBsaW5lcyArIDEpXG4gICAgICAgICAgICAgICAgcGVyQ2hhciA9ICh0aGlzLmhlaWdodCAtIHRvdGFsUGVyTGluZSkgLyAodGhpcy5sZW5ndGggLSBsaW5lcyAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGVyTGluZSA9IHRoaXMuaGVpZ2h0IC8gbGluZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZmlyc3RMaW5lLCBsYXN0TGluZSwgcGVyTGluZSwgcGVyQ2hhciB9O1xuICAgIH1cbiAgICBibG9ja0F0KGhlaWdodCwgb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICBsZXQgeyBmaXJzdExpbmUsIGxhc3RMaW5lLCBwZXJMaW5lLCBwZXJDaGFyIH0gPSB0aGlzLmhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpO1xuICAgICAgICBpZiAob3JhY2xlLmxpbmVXcmFwcGluZykge1xuICAgICAgICAgICAgbGV0IGd1ZXNzID0gb2Zmc2V0ICsgTWF0aC5yb3VuZChNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAoaGVpZ2h0IC0gdG9wKSAvIHRoaXMuaGVpZ2h0KSkgKiB0aGlzLmxlbmd0aCk7XG4gICAgICAgICAgICBsZXQgbGluZSA9IG9yYWNsZS5kb2MubGluZUF0KGd1ZXNzKSwgbGluZUhlaWdodCA9IHBlckxpbmUgKyBsaW5lLmxlbmd0aCAqIHBlckNoYXI7XG4gICAgICAgICAgICBsZXQgbGluZVRvcCA9IE1hdGgubWF4KHRvcCwgaGVpZ2h0IC0gbGluZUhlaWdodCAvIDIpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8obGluZS5mcm9tLCBsaW5lLmxlbmd0aCwgbGluZVRvcCwgbGluZUhlaWdodCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGxhc3RMaW5lIC0gZmlyc3RMaW5lLCBNYXRoLmZsb29yKChoZWlnaHQgLSB0b3ApIC8gcGVyTGluZSkpKTtcbiAgICAgICAgICAgIGxldCB7IGZyb20sIGxlbmd0aCB9ID0gb3JhY2xlLmRvYy5saW5lKGZpcnN0TGluZSArIGxpbmUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8oZnJvbSwgbGVuZ3RoLCB0b3AgKyBwZXJMaW5lICogbGluZSwgcGVyTGluZSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGluZUF0KHZhbHVlLCB0eXBlLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIGlmICh0eXBlID09IFF1ZXJ5VHlwZS5CeUhlaWdodClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJsb2NrQXQodmFsdWUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpO1xuICAgICAgICBpZiAodHlwZSA9PSBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCkge1xuICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IG9yYWNsZS5kb2MubGluZUF0KHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGZyb20sIHRvIC0gZnJvbSwgMCwgMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgZmlyc3RMaW5lLCBwZXJMaW5lLCBwZXJDaGFyIH0gPSB0aGlzLmhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpO1xuICAgICAgICBsZXQgbGluZSA9IG9yYWNsZS5kb2MubGluZUF0KHZhbHVlKSwgbGluZUhlaWdodCA9IHBlckxpbmUgKyBsaW5lLmxlbmd0aCAqIHBlckNoYXI7XG4gICAgICAgIGxldCBsaW5lc0Fib3ZlID0gbGluZS5udW1iZXIgLSBmaXJzdExpbmU7XG4gICAgICAgIGxldCBsaW5lVG9wID0gdG9wICsgcGVyTGluZSAqIGxpbmVzQWJvdmUgKyBwZXJDaGFyICogKGxpbmUuZnJvbSAtIG9mZnNldCAtIGxpbmVzQWJvdmUpO1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhsaW5lLmZyb20sIGxpbmUubGVuZ3RoLCBNYXRoLm1heCh0b3AsIE1hdGgubWluKGxpbmVUb3AsIHRvcCArIHRoaXMuaGVpZ2h0IC0gbGluZUhlaWdodCkpLCBsaW5lSGVpZ2h0LCAwKTtcbiAgICB9XG4gICAgZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpIHtcbiAgICAgICAgZnJvbSA9IE1hdGgubWF4KGZyb20sIG9mZnNldCk7XG4gICAgICAgIHRvID0gTWF0aC5taW4odG8sIG9mZnNldCArIHRoaXMubGVuZ3RoKTtcbiAgICAgICAgbGV0IHsgZmlyc3RMaW5lLCBwZXJMaW5lLCBwZXJDaGFyIH0gPSB0aGlzLmhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSBmcm9tLCBsaW5lVG9wID0gdG9wOyBwb3MgPD0gdG87KSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IG9yYWNsZS5kb2MubGluZUF0KHBvcyk7XG4gICAgICAgICAgICBpZiAocG9zID09IGZyb20pIHtcbiAgICAgICAgICAgICAgICBsZXQgbGluZXNBYm92ZSA9IGxpbmUubnVtYmVyIC0gZmlyc3RMaW5lO1xuICAgICAgICAgICAgICAgIGxpbmVUb3AgKz0gcGVyTGluZSAqIGxpbmVzQWJvdmUgKyBwZXJDaGFyICogKGZyb20gLSBvZmZzZXQgLSBsaW5lc0Fib3ZlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBsaW5lSGVpZ2h0ID0gcGVyTGluZSArIHBlckNoYXIgKiBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGYobmV3IEJsb2NrSW5mbyhsaW5lLmZyb20sIGxpbmUubGVuZ3RoLCBsaW5lVG9wLCBsaW5lSGVpZ2h0LCAwKSk7XG4gICAgICAgICAgICBsaW5lVG9wICs9IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBwb3MgPSBsaW5lLnRvICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKGZyb20sIHRvLCBub2Rlcykge1xuICAgICAgICBsZXQgYWZ0ZXIgPSB0aGlzLmxlbmd0aCAtIHRvO1xuICAgICAgICBpZiAoYWZ0ZXIgPiAwKSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgICAgICAgICAgbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV0gPSBuZXcgSGVpZ2h0TWFwR2FwKGxhc3QubGVuZ3RoICsgYWZ0ZXIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobnVsbCwgbmV3IEhlaWdodE1hcEdhcChhZnRlciAtIDEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZnJvbSA+IDApIHtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IG5vZGVzWzBdO1xuICAgICAgICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwKVxuICAgICAgICAgICAgICAgIG5vZGVzWzBdID0gbmV3IEhlaWdodE1hcEdhcChmcm9tICsgZmlyc3QubGVuZ3RoKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBub2Rlcy51bnNoaWZ0KG5ldyBIZWlnaHRNYXBHYXAoZnJvbSAtIDEpLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSGVpZ2h0TWFwLm9mKG5vZGVzKTtcbiAgICB9XG4gICAgZGVjb21wb3NlTGVmdCh0bywgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG5ldyBIZWlnaHRNYXBHYXAodG8gLSAxKSwgbnVsbCk7XG4gICAgfVxuICAgIGRlY29tcG9zZVJpZ2h0KGZyb20sIHJlc3VsdCkge1xuICAgICAgICByZXN1bHQucHVzaChudWxsLCBuZXcgSGVpZ2h0TWFwR2FwKHRoaXMubGVuZ3RoIC0gZnJvbSAtIDEpKTtcbiAgICB9XG4gICAgdXBkYXRlSGVpZ2h0KG9yYWNsZSwgb2Zmc2V0ID0gMCwgZm9yY2UgPSBmYWxzZSwgbWVhc3VyZWQpIHtcbiAgICAgICAgbGV0IGVuZCA9IG9mZnNldCArIHRoaXMubGVuZ3RoO1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSBvZmZzZXQgKyB0aGlzLmxlbmd0aCAmJiBtZWFzdXJlZC5tb3JlKSB7XG4gICAgICAgICAgICAvLyBGaWxsIGluIHBhcnQgb2YgdGhpcyBnYXAgd2l0aCBtZWFzdXJlZCBsaW5lcy4gV2Uga25vdyB0aGVyZVxuICAgICAgICAgICAgLy8gY2FuJ3QgYmUgd2lkZ2V0cyBvciBjb2xsYXBzZWQgcmFuZ2VzIGluIHRob3NlIGxpbmVzLCBiZWNhdXNlXG4gICAgICAgICAgICAvLyB0aGV5IHdvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBoZWlnaHRtYXAgKGdhcHNcbiAgICAgICAgICAgIC8vIG9ubHkgY29udGFpbiBwbGFpbiB0ZXh0KS5cbiAgICAgICAgICAgIGxldCBub2RlcyA9IFtdLCBwb3MgPSBNYXRoLm1heChvZmZzZXQsIG1lYXN1cmVkLmZyb20pLCBzaW5nbGVIZWlnaHQgPSAtMTtcbiAgICAgICAgICAgIGlmIChtZWFzdXJlZC5mcm9tID4gb2Zmc2V0KVxuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobmV3IEhlaWdodE1hcEdhcChtZWFzdXJlZC5mcm9tIC0gb2Zmc2V0IC0gMSkudXBkYXRlSGVpZ2h0KG9yYWNsZSwgb2Zmc2V0KSk7XG4gICAgICAgICAgICB3aGlsZSAocG9zIDw9IGVuZCAmJiBtZWFzdXJlZC5tb3JlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IG9yYWNsZS5kb2MubGluZUF0KHBvcykubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChub2Rlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IG1lYXN1cmVkLmhlaWdodHNbbWVhc3VyZWQuaW5kZXgrK107XG4gICAgICAgICAgICAgICAgaWYgKHNpbmdsZUhlaWdodCA9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgc2luZ2xlSGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKE1hdGguYWJzKGhlaWdodCAtIHNpbmdsZUhlaWdodCkgPj0gRXBzaWxvbilcbiAgICAgICAgICAgICAgICAgICAgc2luZ2xlSGVpZ2h0ID0gLTI7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBuZXcgSGVpZ2h0TWFwVGV4dChsZW4sIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgbGluZS5vdXRkYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgcG9zICs9IGxlbiArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zIDw9IGVuZClcbiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG51bGwsIG5ldyBIZWlnaHRNYXBHYXAoZW5kIC0gcG9zKS51cGRhdGVIZWlnaHQob3JhY2xlLCBwb3MpKTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBIZWlnaHRNYXAub2Yobm9kZXMpO1xuICAgICAgICAgICAgaWYgKHNpbmdsZUhlaWdodCA8IDAgfHwgTWF0aC5hYnMocmVzdWx0LmhlaWdodCAtIHRoaXMuaGVpZ2h0KSA+PSBFcHNpbG9uIHx8XG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoc2luZ2xlSGVpZ2h0IC0gdGhpcy5oZWlnaHRNZXRyaWNzKG9yYWNsZSwgb2Zmc2V0KS5wZXJMaW5lKSA+PSBFcHNpbG9uKVxuICAgICAgICAgICAgICAgIG9yYWNsZS5oZWlnaHRDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZm9yY2UgfHwgdGhpcy5vdXRkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQob3JhY2xlLCBvcmFjbGUuaGVpZ2h0Rm9yR2FwKG9mZnNldCwgb2Zmc2V0ICsgdGhpcy5sZW5ndGgpKTtcbiAgICAgICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBgZ2FwKCR7dGhpcy5sZW5ndGh9KWA7IH1cbn1cbmNsYXNzIEhlaWdodE1hcEJyYW5jaCBleHRlbmRzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVmdCwgYnJrLCByaWdodCkge1xuICAgICAgICBzdXBlcihsZWZ0Lmxlbmd0aCArIGJyayArIHJpZ2h0Lmxlbmd0aCwgbGVmdC5oZWlnaHQgKyByaWdodC5oZWlnaHQsIGJyayB8IChsZWZ0Lm91dGRhdGVkIHx8IHJpZ2h0Lm91dGRhdGVkID8gMiAvKiBGbGFnLk91dGRhdGVkICovIDogMCkpO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG4gICAgICAgIHRoaXMuc2l6ZSA9IGxlZnQuc2l6ZSArIHJpZ2h0LnNpemU7XG4gICAgfVxuICAgIGdldCBicmVhaygpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgJiAxIC8qIEZsYWcuQnJlYWsgKi87IH1cbiAgICBibG9ja0F0KGhlaWdodCwgb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICBsZXQgbWlkID0gdG9wICsgdGhpcy5sZWZ0LmhlaWdodDtcbiAgICAgICAgcmV0dXJuIGhlaWdodCA8IG1pZCA/IHRoaXMubGVmdC5ibG9ja0F0KGhlaWdodCwgb3JhY2xlLCB0b3AsIG9mZnNldClcbiAgICAgICAgICAgIDogdGhpcy5yaWdodC5ibG9ja0F0KGhlaWdodCwgb3JhY2xlLCBtaWQsIG9mZnNldCArIHRoaXMubGVmdC5sZW5ndGggKyB0aGlzLmJyZWFrKTtcbiAgICB9XG4gICAgbGluZUF0KHZhbHVlLCB0eXBlLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCByaWdodFRvcCA9IHRvcCArIHRoaXMubGVmdC5oZWlnaHQsIHJpZ2h0T2Zmc2V0ID0gb2Zmc2V0ICsgdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWs7XG4gICAgICAgIGxldCBsZWZ0ID0gdHlwZSA9PSBRdWVyeVR5cGUuQnlIZWlnaHQgPyB2YWx1ZSA8IHJpZ2h0VG9wIDogdmFsdWUgPCByaWdodE9mZnNldDtcbiAgICAgICAgbGV0IGJhc2UgPSBsZWZ0ID8gdGhpcy5sZWZ0LmxpbmVBdCh2YWx1ZSwgdHlwZSwgb3JhY2xlLCB0b3AsIG9mZnNldClcbiAgICAgICAgICAgIDogdGhpcy5yaWdodC5saW5lQXQodmFsdWUsIHR5cGUsIG9yYWNsZSwgcmlnaHRUb3AsIHJpZ2h0T2Zmc2V0KTtcbiAgICAgICAgaWYgKHRoaXMuYnJlYWsgfHwgKGxlZnQgPyBiYXNlLnRvIDwgcmlnaHRPZmZzZXQgOiBiYXNlLmZyb20gPiByaWdodE9mZnNldCkpXG4gICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgbGV0IHN1YlF1ZXJ5ID0gdHlwZSA9PSBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCA/IFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0IDogUXVlcnlUeXBlLkJ5UG9zO1xuICAgICAgICBpZiAobGVmdClcbiAgICAgICAgICAgIHJldHVybiBiYXNlLmpvaW4odGhpcy5yaWdodC5saW5lQXQocmlnaHRPZmZzZXQsIHN1YlF1ZXJ5LCBvcmFjbGUsIHJpZ2h0VG9wLCByaWdodE9mZnNldCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0LmxpbmVBdChyaWdodE9mZnNldCwgc3ViUXVlcnksIG9yYWNsZSwgdG9wLCBvZmZzZXQpLmpvaW4oYmFzZSk7XG4gICAgfVxuICAgIGZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHRvcCwgb2Zmc2V0LCBmKSB7XG4gICAgICAgIGxldCByaWdodFRvcCA9IHRvcCArIHRoaXMubGVmdC5oZWlnaHQsIHJpZ2h0T2Zmc2V0ID0gb2Zmc2V0ICsgdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWs7XG4gICAgICAgIGlmICh0aGlzLmJyZWFrKSB7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IHJpZ2h0T2Zmc2V0KVxuICAgICAgICAgICAgICAgIHRoaXMubGVmdC5mb3JFYWNoTGluZShmcm9tLCB0bywgb3JhY2xlLCB0b3AsIG9mZnNldCwgZik7XG4gICAgICAgICAgICBpZiAodG8gPj0gcmlnaHRPZmZzZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5mb3JFYWNoTGluZShmcm9tLCB0bywgb3JhY2xlLCByaWdodFRvcCwgcmlnaHRPZmZzZXQsIGYpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1pZCA9IHRoaXMubGluZUF0KHJpZ2h0T2Zmc2V0LCBRdWVyeVR5cGUuQnlQb3MsIG9yYWNsZSwgdG9wLCBvZmZzZXQpO1xuICAgICAgICAgICAgaWYgKGZyb20gPCBtaWQuZnJvbSlcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQuZm9yRWFjaExpbmUoZnJvbSwgbWlkLmZyb20gLSAxLCBvcmFjbGUsIHRvcCwgb2Zmc2V0LCBmKTtcbiAgICAgICAgICAgIGlmIChtaWQudG8gPj0gZnJvbSAmJiBtaWQuZnJvbSA8PSB0bylcbiAgICAgICAgICAgICAgICBmKG1pZCk7XG4gICAgICAgICAgICBpZiAodG8gPiBtaWQudG8pXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5mb3JFYWNoTGluZShtaWQudG8gKyAxLCB0bywgb3JhY2xlLCByaWdodFRvcCwgcmlnaHRPZmZzZXQsIGYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UoZnJvbSwgdG8sIG5vZGVzKSB7XG4gICAgICAgIGxldCByaWdodFN0YXJ0ID0gdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWs7XG4gICAgICAgIGlmICh0byA8IHJpZ2h0U3RhcnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWxhbmNlZCh0aGlzLmxlZnQucmVwbGFjZShmcm9tLCB0bywgbm9kZXMpLCB0aGlzLnJpZ2h0KTtcbiAgICAgICAgaWYgKGZyb20gPiB0aGlzLmxlZnQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFsYW5jZWQodGhpcy5sZWZ0LCB0aGlzLnJpZ2h0LnJlcGxhY2UoZnJvbSAtIHJpZ2h0U3RhcnQsIHRvIC0gcmlnaHRTdGFydCwgbm9kZXMpKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAoZnJvbSA+IDApXG4gICAgICAgICAgICB0aGlzLmRlY29tcG9zZUxlZnQoZnJvbSwgcmVzdWx0KTtcbiAgICAgICAgbGV0IGxlZnQgPSByZXN1bHQubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBub2RlIG9mIG5vZGVzKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgICAgIGlmIChmcm9tID4gMClcbiAgICAgICAgICAgIG1lcmdlR2FwcyhyZXN1bHQsIGxlZnQgLSAxKTtcbiAgICAgICAgaWYgKHRvIDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByaWdodCA9IHJlc3VsdC5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmRlY29tcG9zZVJpZ2h0KHRvLCByZXN1bHQpO1xuICAgICAgICAgICAgbWVyZ2VHYXBzKHJlc3VsdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBIZWlnaHRNYXAub2YocmVzdWx0KTtcbiAgICB9XG4gICAgZGVjb21wb3NlTGVmdCh0bywgcmVzdWx0KSB7XG4gICAgICAgIGxldCBsZWZ0ID0gdGhpcy5sZWZ0Lmxlbmd0aDtcbiAgICAgICAgaWYgKHRvIDw9IGxlZnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0LmRlY29tcG9zZUxlZnQodG8sIHJlc3VsdCk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubGVmdCk7XG4gICAgICAgIGlmICh0aGlzLmJyZWFrKSB7XG4gICAgICAgICAgICBsZWZ0Kys7XG4gICAgICAgICAgICBpZiAodG8gPj0gbGVmdClcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG8gPiBsZWZ0KVxuICAgICAgICAgICAgdGhpcy5yaWdodC5kZWNvbXBvc2VMZWZ0KHRvIC0gbGVmdCwgcmVzdWx0KTtcbiAgICB9XG4gICAgZGVjb21wb3NlUmlnaHQoZnJvbSwgcmVzdWx0KSB7XG4gICAgICAgIGxldCBsZWZ0ID0gdGhpcy5sZWZ0Lmxlbmd0aCwgcmlnaHQgPSBsZWZ0ICsgdGhpcy5icmVhaztcbiAgICAgICAgaWYgKGZyb20gPj0gcmlnaHQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5kZWNvbXBvc2VSaWdodChmcm9tIC0gcmlnaHQsIHJlc3VsdCk7XG4gICAgICAgIGlmIChmcm9tIDwgbGVmdClcbiAgICAgICAgICAgIHRoaXMubGVmdC5kZWNvbXBvc2VSaWdodChmcm9tLCByZXN1bHQpO1xuICAgICAgICBpZiAodGhpcy5icmVhayAmJiBmcm9tIDwgcmlnaHQpXG4gICAgICAgICAgICByZXN1bHQucHVzaChudWxsKTtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5yaWdodCk7XG4gICAgfVxuICAgIGJhbGFuY2VkKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIGlmIChsZWZ0LnNpemUgPiAyICogcmlnaHQuc2l6ZSB8fCByaWdodC5zaXplID4gMiAqIGxlZnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiBIZWlnaHRNYXAub2YodGhpcy5icmVhayA/IFtsZWZ0LCBudWxsLCByaWdodF0gOiBbbGVmdCwgcmlnaHRdKTtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICAgICAgICB0aGlzLmhlaWdodCA9IGxlZnQuaGVpZ2h0ICsgcmlnaHQuaGVpZ2h0O1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gbGVmdC5vdXRkYXRlZCB8fCByaWdodC5vdXRkYXRlZDtcbiAgICAgICAgdGhpcy5zaXplID0gbGVmdC5zaXplICsgcmlnaHQuc2l6ZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWsgKyByaWdodC5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBmb3JjZSA9IGZhbHNlLCBtZWFzdXJlZCkge1xuICAgICAgICBsZXQgeyBsZWZ0LCByaWdodCB9ID0gdGhpcywgcmlnaHRTdGFydCA9IG9mZnNldCArIGxlZnQubGVuZ3RoICsgdGhpcy5icmVhaywgcmViYWxhbmNlID0gbnVsbDtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gb2Zmc2V0ICsgbGVmdC5sZW5ndGggJiYgbWVhc3VyZWQubW9yZSlcbiAgICAgICAgICAgIHJlYmFsYW5jZSA9IGxlZnQgPSBsZWZ0LnVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCwgZm9yY2UsIG1lYXN1cmVkKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGVmdC51cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQsIGZvcmNlKTtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gcmlnaHRTdGFydCArIHJpZ2h0Lmxlbmd0aCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgcmViYWxhbmNlID0gcmlnaHQgPSByaWdodC51cGRhdGVIZWlnaHQob3JhY2xlLCByaWdodFN0YXJ0LCBmb3JjZSwgbWVhc3VyZWQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByaWdodC51cGRhdGVIZWlnaHQob3JhY2xlLCByaWdodFN0YXJ0LCBmb3JjZSk7XG4gICAgICAgIGlmIChyZWJhbGFuY2UpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWxhbmNlZChsZWZ0LCByaWdodCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5sZWZ0LmhlaWdodCArIHRoaXMucmlnaHQuaGVpZ2h0O1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMubGVmdCArICh0aGlzLmJyZWFrID8gXCIgXCIgOiBcIi1cIikgKyB0aGlzLnJpZ2h0OyB9XG59XG5mdW5jdGlvbiBtZXJnZUdhcHMobm9kZXMsIGFyb3VuZCkge1xuICAgIGxldCBiZWZvcmUsIGFmdGVyO1xuICAgIGlmIChub2Rlc1thcm91bmRdID09IG51bGwgJiZcbiAgICAgICAgKGJlZm9yZSA9IG5vZGVzW2Fyb3VuZCAtIDFdKSBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcCAmJlxuICAgICAgICAoYWZ0ZXIgPSBub2Rlc1thcm91bmQgKyAxXSkgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgIG5vZGVzLnNwbGljZShhcm91bmQgLSAxLCAzLCBuZXcgSGVpZ2h0TWFwR2FwKGJlZm9yZS5sZW5ndGggKyAxICsgYWZ0ZXIubGVuZ3RoKSk7XG59XG5jb25zdCByZWxldmFudFdpZGdldEhlaWdodCA9IDU7XG5jbGFzcyBOb2RlQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IocG9zLCBvcmFjbGUpIHtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMub3JhY2xlID0gb3JhY2xlO1xuICAgICAgICB0aGlzLm5vZGVzID0gW107XG4gICAgICAgIHRoaXMubGluZVN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMubGluZUVuZCA9IC0xO1xuICAgICAgICB0aGlzLmNvdmVyaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy53cml0dGVuVG8gPSBwb3M7XG4gICAgfVxuICAgIGdldCBpc0NvdmVyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvdmVyaW5nICYmIHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXSA9PSB0aGlzLmNvdmVyaW5nO1xuICAgIH1cbiAgICBzcGFuKF9mcm9tLCB0bykge1xuICAgICAgICBpZiAodGhpcy5saW5lU3RhcnQgPiAtMSkge1xuICAgICAgICAgICAgbGV0IGVuZCA9IE1hdGgubWluKHRvLCB0aGlzLmxpbmVFbmQpLCBsYXN0ID0gdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0KVxuICAgICAgICAgICAgICAgIGxhc3QubGVuZ3RoICs9IGVuZCAtIHRoaXMucG9zO1xuICAgICAgICAgICAgZWxzZSBpZiAoZW5kID4gdGhpcy5wb3MgfHwgIXRoaXMuaXNDb3ZlcmVkKVxuICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwVGV4dChlbmQgLSB0aGlzLnBvcywgLTEpKTtcbiAgICAgICAgICAgIHRoaXMud3JpdHRlblRvID0gZW5kO1xuICAgICAgICAgICAgaWYgKHRvID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdHRlblRvKys7XG4gICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcyA9IHRvO1xuICAgIH1cbiAgICBwb2ludChmcm9tLCB0bywgZGVjbykge1xuICAgICAgICBpZiAoZnJvbSA8IHRvIHx8IGRlY28uaGVpZ2h0UmVsZXZhbnQpIHtcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBkZWNvLndpZGdldCA/IGRlY28ud2lkZ2V0LmVzdGltYXRlZEhlaWdodCA6IDA7XG4gICAgICAgICAgICBsZXQgYnJlYWtzID0gZGVjby53aWRnZXQgPyBkZWNvLndpZGdldC5saW5lQnJlYWtzIDogMDtcbiAgICAgICAgICAgIGlmIChoZWlnaHQgPCAwKVxuICAgICAgICAgICAgICAgIGhlaWdodCA9IHRoaXMub3JhY2xlLmxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBsZXQgbGVuID0gdG8gLSBmcm9tO1xuICAgICAgICAgICAgaWYgKGRlY28uYmxvY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEJsb2NrKG5ldyBIZWlnaHRNYXBCbG9jayhsZW4sIGhlaWdodCwgZGVjbykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGVuIHx8IGJyZWFrcyB8fCBoZWlnaHQgPj0gcmVsZXZhbnRXaWRnZXRIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZExpbmVEZWNvKGhlaWdodCwgYnJlYWtzLCBsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvID4gZnJvbSkge1xuICAgICAgICAgICAgdGhpcy5zcGFuKGZyb20sIHRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saW5lRW5kID4gLTEgJiYgdGhpcy5saW5lRW5kIDwgdGhpcy5wb3MpXG4gICAgICAgICAgICB0aGlzLmxpbmVFbmQgPSB0aGlzLm9yYWNsZS5kb2MubGluZUF0KHRoaXMucG9zKS50bztcbiAgICB9XG4gICAgZW50ZXJMaW5lKCkge1xuICAgICAgICBpZiAodGhpcy5saW5lU3RhcnQgPiAtMSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHRoaXMub3JhY2xlLmRvYy5saW5lQXQodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLmxpbmVTdGFydCA9IGZyb207XG4gICAgICAgIHRoaXMubGluZUVuZCA9IHRvO1xuICAgICAgICBpZiAodGhpcy53cml0dGVuVG8gPCBmcm9tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy53cml0dGVuVG8gPCBmcm9tIC0gMSB8fCB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoIC0gMV0gPT0gbnVsbClcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2godGhpcy5ibGFua0NvbnRlbnQodGhpcy53cml0dGVuVG8sIGZyb20gLSAxKSk7XG4gICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2gobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9zID4gZnJvbSlcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwVGV4dCh0aGlzLnBvcyAtIGZyb20sIC0xKSk7XG4gICAgICAgIHRoaXMud3JpdHRlblRvID0gdGhpcy5wb3M7XG4gICAgfVxuICAgIGJsYW5rQ29udGVudChmcm9tLCB0bykge1xuICAgICAgICBsZXQgZ2FwID0gbmV3IEhlaWdodE1hcEdhcCh0byAtIGZyb20pO1xuICAgICAgICBpZiAodGhpcy5vcmFjbGUuZG9jLmxpbmVBdChmcm9tKS50byA9PSB0bylcbiAgICAgICAgICAgIGdhcC5mbGFncyB8PSA0IC8qIEZsYWcuU2luZ2xlTGluZSAqLztcbiAgICAgICAgcmV0dXJuIGdhcDtcbiAgICB9XG4gICAgZW5zdXJlTGluZSgpIHtcbiAgICAgICAgdGhpcy5lbnRlckxpbmUoKTtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLm5vZGVzLmxlbmd0aCA/IHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXSA6IG51bGw7XG4gICAgICAgIGlmIChsYXN0IGluc3RhbmNlb2YgSGVpZ2h0TWFwVGV4dClcbiAgICAgICAgICAgIHJldHVybiBsYXN0O1xuICAgICAgICBsZXQgbGluZSA9IG5ldyBIZWlnaHRNYXBUZXh0KDAsIC0xKTtcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKGxpbmUpO1xuICAgICAgICByZXR1cm4gbGluZTtcbiAgICB9XG4gICAgYWRkQmxvY2soYmxvY2spIHtcbiAgICAgICAgdGhpcy5lbnRlckxpbmUoKTtcbiAgICAgICAgbGV0IGRlY28gPSBibG9jay5kZWNvO1xuICAgICAgICBpZiAoZGVjbyAmJiBkZWNvLnN0YXJ0U2lkZSA+IDAgJiYgIXRoaXMuaXNDb3ZlcmVkKVxuICAgICAgICAgICAgdGhpcy5lbnN1cmVMaW5lKCk7XG4gICAgICAgIHRoaXMubm9kZXMucHVzaChibG9jayk7XG4gICAgICAgIHRoaXMud3JpdHRlblRvID0gdGhpcy5wb3MgPSB0aGlzLnBvcyArIGJsb2NrLmxlbmd0aDtcbiAgICAgICAgaWYgKGRlY28gJiYgZGVjby5lbmRTaWRlID4gMClcbiAgICAgICAgICAgIHRoaXMuY292ZXJpbmcgPSBibG9jaztcbiAgICB9XG4gICAgYWRkTGluZURlY28oaGVpZ2h0LCBicmVha3MsIGxlbmd0aCkge1xuICAgICAgICBsZXQgbGluZSA9IHRoaXMuZW5zdXJlTGluZSgpO1xuICAgICAgICBsaW5lLmxlbmd0aCArPSBsZW5ndGg7XG4gICAgICAgIGxpbmUuY29sbGFwc2VkICs9IGxlbmd0aDtcbiAgICAgICAgbGluZS53aWRnZXRIZWlnaHQgPSBNYXRoLm1heChsaW5lLndpZGdldEhlaWdodCwgaGVpZ2h0KTtcbiAgICAgICAgbGluZS5icmVha3MgKz0gYnJlYWtzO1xuICAgICAgICB0aGlzLndyaXR0ZW5UbyA9IHRoaXMucG9zID0gdGhpcy5wb3MgKyBsZW5ndGg7XG4gICAgfVxuICAgIGZpbmlzaChmcm9tKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5ub2Rlcy5sZW5ndGggPT0gMCA/IG51bGwgOiB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICh0aGlzLmxpbmVTdGFydCA+IC0xICYmICEobGFzdCBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQpICYmICF0aGlzLmlzQ292ZXJlZClcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwVGV4dCgwLCAtMSkpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLndyaXR0ZW5UbyA8IHRoaXMucG9zIHx8IGxhc3QgPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaCh0aGlzLmJsYW5rQ29udGVudCh0aGlzLndyaXR0ZW5UbywgdGhpcy5wb3MpKTtcbiAgICAgICAgbGV0IHBvcyA9IGZyb207XG4gICAgICAgIGZvciAobGV0IG5vZGUgb2YgdGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0KVxuICAgICAgICAgICAgICAgIG5vZGUudXBkYXRlSGVpZ2h0KHRoaXMub3JhY2xlLCBwb3MpO1xuICAgICAgICAgICAgcG9zICs9IG5vZGUgPyBub2RlLmxlbmd0aCA6IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXM7XG4gICAgfVxuICAgIC8vIEFsd2F5cyBjYWxsZWQgd2l0aCBhIHJlZ2lvbiB0aGF0IG9uIGJvdGggc2lkZXMgZWl0aGVyIHN0cmV0Y2hlc1xuICAgIC8vIHRvIGEgbGluZSBicmVhayBvciB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICAvLyBUaGUgcmV0dXJuZWQgYXJyYXkgdXNlcyBudWxsIHRvIGluZGljYXRlIGxpbmUgYnJlYWtzLCBidXQgbmV2ZXJcbiAgICAvLyBzdGFydHMgb3IgZW5kcyBpbiBhIGxpbmUgYnJlYWssIG9yIGhhcyBtdWx0aXBsZSBsaW5lIGJyZWFrcyBuZXh0XG4gICAgLy8gdG8gZWFjaCBvdGhlci5cbiAgICBzdGF0aWMgYnVpbGQob3JhY2xlLCBkZWNvcmF0aW9ucywgZnJvbSwgdG8pIHtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgTm9kZUJ1aWxkZXIoZnJvbSwgb3JhY2xlKTtcbiAgICAgICAgUmFuZ2VTZXQuc3BhbnMoZGVjb3JhdGlvbnMsIGZyb20sIHRvLCBidWlsZGVyLCAwKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKGZyb20pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhlaWdodFJlbGV2YW50RGVjb0NoYW5nZXMoYSwgYiwgZGlmZikge1xuICAgIGxldCBjb21wID0gbmV3IERlY29yYXRpb25Db21wYXJhdG9yO1xuICAgIFJhbmdlU2V0LmNvbXBhcmUoYSwgYiwgZGlmZiwgY29tcCwgMCk7XG4gICAgcmV0dXJuIGNvbXAuY2hhbmdlcztcbn1cbmNsYXNzIERlY29yYXRpb25Db21wYXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gW107XG4gICAgfVxuICAgIGNvbXBhcmVSYW5nZSgpIHsgfVxuICAgIGNvbXBhcmVQb2ludChmcm9tLCB0bywgYSwgYikge1xuICAgICAgICBpZiAoZnJvbSA8IHRvIHx8IGEgJiYgYS5oZWlnaHRSZWxldmFudCB8fCBiICYmIGIuaGVpZ2h0UmVsZXZhbnQpXG4gICAgICAgICAgICBhZGRSYW5nZShmcm9tLCB0bywgdGhpcy5jaGFuZ2VzLCA1KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZpc2libGVQaXhlbFJhbmdlKGRvbSwgcGFkZGluZ1RvcCkge1xuICAgIGxldCByZWN0ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBkb2MgPSBkb20ub3duZXJEb2N1bWVudCwgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICBsZXQgbGVmdCA9IE1hdGgubWF4KDAsIHJlY3QubGVmdCksIHJpZ2h0ID0gTWF0aC5taW4od2luLmlubmVyV2lkdGgsIHJlY3QucmlnaHQpO1xuICAgIGxldCB0b3AgPSBNYXRoLm1heCgwLCByZWN0LnRvcCksIGJvdHRvbSA9IE1hdGgubWluKHdpbi5pbm5lckhlaWdodCwgcmVjdC5ib3R0b20pO1xuICAgIGZvciAobGV0IHBhcmVudCA9IGRvbS5wYXJlbnROb2RlOyBwYXJlbnQgJiYgcGFyZW50ICE9IGRvYy5ib2R5Oykge1xuICAgICAgICBpZiAocGFyZW50Lm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIGxldCBlbHQgPSBwYXJlbnQ7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbHQpO1xuICAgICAgICAgICAgaWYgKChlbHQuc2Nyb2xsSGVpZ2h0ID4gZWx0LmNsaWVudEhlaWdodCB8fCBlbHQuc2Nyb2xsV2lkdGggPiBlbHQuY2xpZW50V2lkdGgpICYmXG4gICAgICAgICAgICAgICAgc3R5bGUub3ZlcmZsb3cgIT0gXCJ2aXNpYmxlXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50UmVjdCA9IGVsdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBsZWZ0ID0gTWF0aC5tYXgobGVmdCwgcGFyZW50UmVjdC5sZWZ0KTtcbiAgICAgICAgICAgICAgICByaWdodCA9IE1hdGgubWluKHJpZ2h0LCBwYXJlbnRSZWN0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICB0b3AgPSBNYXRoLm1heCh0b3AsIHBhcmVudFJlY3QudG9wKTtcbiAgICAgICAgICAgICAgICBib3R0b20gPSBwYXJlbnQgPT0gZG9tLnBhcmVudE5vZGUgPyBwYXJlbnRSZWN0LmJvdHRvbSA6IE1hdGgubWluKGJvdHRvbSwgcGFyZW50UmVjdC5ib3R0b20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gc3R5bGUucG9zaXRpb24gPT0gXCJhYnNvbHV0ZVwiIHx8IHN0eWxlLnBvc2l0aW9uID09IFwiZml4ZWRcIiA/IGVsdC5vZmZzZXRQYXJlbnQgOiBlbHQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXJlbnQubm9kZVR5cGUgPT0gMTEpIHsgLy8gU2hhZG93IHJvb3RcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbGVmdDogbGVmdCAtIHJlY3QubGVmdCwgcmlnaHQ6IE1hdGgubWF4KGxlZnQsIHJpZ2h0KSAtIHJlY3QubGVmdCxcbiAgICAgICAgdG9wOiB0b3AgLSAocmVjdC50b3AgKyBwYWRkaW5nVG9wKSwgYm90dG9tOiBNYXRoLm1heCh0b3AsIGJvdHRvbSkgLSAocmVjdC50b3AgKyBwYWRkaW5nVG9wKSB9O1xufVxuZnVuY3Rpb24gZnVsbFBpeGVsUmFuZ2UoZG9tLCBwYWRkaW5nVG9wKSB7XG4gICAgbGV0IHJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHsgbGVmdDogMCwgcmlnaHQ6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG4gICAgICAgIHRvcDogcGFkZGluZ1RvcCwgYm90dG9tOiByZWN0LmJvdHRvbSAtIChyZWN0LnRvcCArIHBhZGRpbmdUb3ApIH07XG59XG4vLyBMaW5lIGdhcHMgYXJlIHBsYWNlaG9sZGVyIHdpZGdldHMgdXNlZCB0byBoaWRlIHBpZWNlcyBvZiBvdmVybG9uZ1xuLy8gbGluZXMgd2l0aGluIHRoZSB2aWV3cG9ydCwgYXMgYSBrbHVkZ2UgdG8ga2VlcCB0aGUgZWRpdG9yXG4vLyByZXNwb25zaXZlIHdoZW4gYSByaWRpY3Vsb3VzbHkgbG9uZyBsaW5lIGlzIGxvYWRlZCBpbnRvIGl0LlxuY2xhc3MgTGluZUdhcCB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8sIHNpemUpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgIH1cbiAgICBzdGF0aWMgc2FtZShhLCBiKSB7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZ0EgPSBhW2ldLCBnQiA9IGJbaV07XG4gICAgICAgICAgICBpZiAoZ0EuZnJvbSAhPSBnQi5mcm9tIHx8IGdBLnRvICE9IGdCLnRvIHx8IGdBLnNpemUgIT0gZ0Iuc2l6ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRyYXcodmlld1N0YXRlLCB3cmFwcGluZykge1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5yZXBsYWNlKHtcbiAgICAgICAgICAgIHdpZGdldDogbmV3IExpbmVHYXBXaWRnZXQodGhpcy5zaXplICogKHdyYXBwaW5nID8gdmlld1N0YXRlLnNjYWxlWSA6IHZpZXdTdGF0ZS5zY2FsZVgpLCB3cmFwcGluZylcbiAgICAgICAgfSkucmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcbiAgICB9XG59XG5jbGFzcyBMaW5lR2FwV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3Ioc2l6ZSwgdmVydGljYWwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbCA9IHZlcnRpY2FsO1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIuc2l6ZSA9PSB0aGlzLnNpemUgJiYgb3RoZXIudmVydGljYWwgPT0gdGhpcy52ZXJ0aWNhbDsgfVxuICAgIHRvRE9NKCkge1xuICAgICAgICBsZXQgZWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgaWYgKHRoaXMudmVydGljYWwpIHtcbiAgICAgICAgICAgIGVsdC5zdHlsZS5oZWlnaHQgPSB0aGlzLnNpemUgKyBcInB4XCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbHQuc3R5bGUud2lkdGggPSB0aGlzLnNpemUgKyBcInB4XCI7XG4gICAgICAgICAgICBlbHQuc3R5bGUuaGVpZ2h0ID0gXCIycHhcIjtcbiAgICAgICAgICAgIGVsdC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWx0O1xuICAgIH1cbiAgICBnZXQgZXN0aW1hdGVkSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy52ZXJ0aWNhbCA/IHRoaXMuc2l6ZSA6IC0xOyB9XG59XG5jbGFzcyBWaWV3U3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKHN0YXRlKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgLy8gVGhlc2UgYXJlIGNvbnRlbnRET00tbG9jYWwgY29vcmRpbmF0ZXNcbiAgICAgICAgdGhpcy5waXhlbFZpZXdwb3J0ID0geyBsZWZ0OiAwLCByaWdodDogd2luZG93LmlubmVyV2lkdGgsIHRvcDogMCwgYm90dG9tOiAwIH07XG4gICAgICAgIHRoaXMuaW5WaWV3ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYWRkaW5nVG9wID0gMDsgLy8gUGFkZGluZyBhYm92ZSB0aGUgZG9jdW1lbnQsIHNjYWxlZFxuICAgICAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSAwOyAvLyBQYWRkaW5nIGJlbG93IHRoZSBkb2N1bWVudCwgc2NhbGVkXG4gICAgICAgIHRoaXMuY29udGVudERPTVdpZHRoID0gMDsgLy8gY29udGVudERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aFxuICAgICAgICB0aGlzLmNvbnRlbnRET01IZWlnaHQgPSAwOyAvLyBjb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuICAgICAgICB0aGlzLmVkaXRvckhlaWdodCA9IDA7IC8vIHNjcm9sbERPTS5jbGllbnRIZWlnaHQsIHVuc2NhbGVkXG4gICAgICAgIHRoaXMuZWRpdG9yV2lkdGggPSAwOyAvLyBzY3JvbGxET00uY2xpZW50V2lkdGgsIHVuc2NhbGVkXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gMDsgLy8gTGFzdCBzZWVuIHNjcm9sbERPTS5zY3JvbGxUb3AsIHNjYWxlZFxuICAgICAgICB0aGlzLnNjcm9sbGVkVG9Cb3R0b20gPSB0cnVlO1xuICAgICAgICAvLyBUaGUgQ1NTLXRyYW5zZm9ybWF0aW9uIHNjYWxlIG9mIHRoZSBlZGl0b3IgKHRyYW5zZm9ybWVkIHNpemUgL1xuICAgICAgICAvLyBjb25jcmV0ZSBzaXplKVxuICAgICAgICB0aGlzLnNjYWxlWCA9IDE7XG4gICAgICAgIHRoaXMuc2NhbGVZID0gMTtcbiAgICAgICAgLy8gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIChkb2N1bWVudC1yZWxhdGl2ZSkgdG8gd2hpY2ggdG8gYW5jaG9yIHRoZVxuICAgICAgICAvLyBzY3JvbGwgcG9zaXRpb24uIC0xIG1lYW5zIGFuY2hvciB0byB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JQb3MgPSAwO1xuICAgICAgICAvLyBUaGUgaGVpZ2h0IGF0IHRoZSBhbmNob3IgcG9zaXRpb24uIFNldCBieSB0aGUgRE9NIHVwZGF0ZSBwaGFzZS5cbiAgICAgICAgLy8gLTEgbWVhbnMgbm8gaGVpZ2h0IGF2YWlsYWJsZS5cbiAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgLy8gU2VlIFZQLk1heERPTUhlaWdodFxuICAgICAgICB0aGlzLnNjYWxlciA9IElkU2NhbGVyO1xuICAgICAgICB0aGlzLnNjcm9sbFRhcmdldCA9IG51bGw7XG4gICAgICAgIC8vIEJyaWVmbHkgc2V0IHRvIHRydWUgd2hlbiBwcmludGluZywgdG8gZGlzYWJsZSB2aWV3cG9ydCBsaW1pdGluZ1xuICAgICAgICB0aGlzLnByaW50aW5nID0gZmFsc2U7XG4gICAgICAgIC8vIEZsYWcgc2V0IHdoZW4gZWRpdG9yIGNvbnRlbnQgd2FzIHJlZHJhd24sIHNvIHRoYXQgdGhlIG5leHRcbiAgICAgICAgLy8gbWVhc3VyZSBzdGFnZSBrbm93cyBpdCBtdXN0IHJlYWQgRE9NIGxheW91dFxuICAgICAgICB0aGlzLm11c3RNZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdFRleHREaXJlY3Rpb24gPSBEaXJlY3Rpb24uTFRSO1xuICAgICAgICB0aGlzLnZpc2libGVSYW5nZXMgPSBbXTtcbiAgICAgICAgLy8gQ3Vyc29yICdhc3NvYycgaXMgb25seSBzaWduaWZpY2FudCB3aGVuIHRoZSBjdXJzb3IgaXMgb24gYSBsaW5lXG4gICAgICAgIC8vIHdyYXAgcG9pbnQsIHdoZXJlIGl0IG11c3Qgc3RpY2sgdG8gdGhlIGNoYXJhY3RlciB0aGF0IGl0IGlzXG4gICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aC4gU2luY2UgYnJvd3NlcnMgZG9uJ3QgcHJvdmlkZSBhIHJlYXNvbmFibGVcbiAgICAgICAgLy8gaW50ZXJmYWNlIHRvIHNldCBvciBxdWVyeSB0aGlzLCB3aGVuIGEgc2VsZWN0aW9uIGlzIHNldCB0aGF0XG4gICAgICAgIC8vIG1pZ2h0IGNhdXNlIHRoaXMgdG8gYmUgc2lnbmlmaWNhbnQsIHRoaXMgZmxhZyBpcyBzZXQuIFRoZSBuZXh0XG4gICAgICAgIC8vIG1lYXN1cmUgcGhhc2Ugd2lsbCBjaGVjayB3aGV0aGVyIHRoZSBjdXJzb3IgaXMgb24gYSBsaW5lLXdyYXBwaW5nXG4gICAgICAgIC8vIGJvdW5kYXJ5IGFuZCwgaWYgc28sIHJlc2V0IGl0IHRvIG1ha2Ugc3VyZSBpdCBpcyBwb3NpdGlvbmVkIGluXG4gICAgICAgIC8vIHRoZSByaWdodCBwbGFjZS5cbiAgICAgICAgdGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jID0gZmFsc2U7XG4gICAgICAgIGxldCBndWVzc1dyYXBwaW5nID0gc3RhdGUuZmFjZXQoY29udGVudEF0dHJpYnV0ZXMpLnNvbWUodiA9PiB0eXBlb2YgdiAhPSBcImZ1bmN0aW9uXCIgJiYgdi5jbGFzcyA9PSBcImNtLWxpbmVXcmFwcGluZ1wiKTtcbiAgICAgICAgdGhpcy5oZWlnaHRPcmFjbGUgPSBuZXcgSGVpZ2h0T3JhY2xlKGd1ZXNzV3JhcHBpbmcpO1xuICAgICAgICB0aGlzLnN0YXRlRGVjbyA9IHN0YXRlLmZhY2V0KGRlY29yYXRpb25zKS5maWx0ZXIoZCA9PiB0eXBlb2YgZCAhPSBcImZ1bmN0aW9uXCIpO1xuICAgICAgICB0aGlzLmhlaWdodE1hcCA9IEhlaWdodE1hcC5lbXB0eSgpLmFwcGx5Q2hhbmdlcyh0aGlzLnN0YXRlRGVjbywgVGV4dC5lbXB0eSwgdGhpcy5oZWlnaHRPcmFjbGUuc2V0RG9jKHN0YXRlLmRvYyksIFtuZXcgQ2hhbmdlZFJhbmdlKDAsIDAsIDAsIHN0YXRlLmRvYy5sZW5ndGgpXSk7XG4gICAgICAgIHRoaXMudmlld3BvcnQgPSB0aGlzLmdldFZpZXdwb3J0KDAsIG51bGwpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0TGluZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JWaWV3cG9ydCgpO1xuICAgICAgICB0aGlzLmxpbmVHYXBzID0gdGhpcy5lbnN1cmVMaW5lR2FwcyhbXSk7XG4gICAgICAgIHRoaXMubGluZUdhcERlY28gPSBEZWNvcmF0aW9uLnNldCh0aGlzLmxpbmVHYXBzLm1hcChnYXAgPT4gZ2FwLmRyYXcodGhpcywgZmFsc2UpKSk7XG4gICAgICAgIHRoaXMuY29tcHV0ZVZpc2libGVSYW5nZXMoKTtcbiAgICB9XG4gICAgdXBkYXRlRm9yVmlld3BvcnQoKSB7XG4gICAgICAgIGxldCB2aWV3cG9ydHMgPSBbdGhpcy52aWV3cG9ydF0sIHsgbWFpbiB9ID0gdGhpcy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDE7IGkrKykge1xuICAgICAgICAgICAgbGV0IHBvcyA9IGkgPyBtYWluLmhlYWQgOiBtYWluLmFuY2hvcjtcbiAgICAgICAgICAgIGlmICghdmlld3BvcnRzLnNvbWUoKHsgZnJvbSwgdG8gfSkgPT4gcG9zID49IGZyb20gJiYgcG9zIDw9IHRvKSkge1xuICAgICAgICAgICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSB0aGlzLmxpbmVCbG9ja0F0KHBvcyk7XG4gICAgICAgICAgICAgICAgdmlld3BvcnRzLnB1c2gobmV3IFZpZXdwb3J0KGZyb20sIHRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWV3cG9ydHMgPSB2aWV3cG9ydHMuc29ydCgoYSwgYikgPT4gYS5mcm9tIC0gYi5mcm9tKTtcbiAgICAgICAgdGhpcy5zY2FsZXIgPSB0aGlzLmhlaWdodE1hcC5oZWlnaHQgPD0gNzAwMDAwMCAvKiBWUC5NYXhET01IZWlnaHQgKi8gPyBJZFNjYWxlciA6XG4gICAgICAgICAgICBuZXcgQmlnU2NhbGVyKHRoaXMuaGVpZ2h0T3JhY2xlLCB0aGlzLmhlaWdodE1hcCwgdGhpcy52aWV3cG9ydHMpO1xuICAgIH1cbiAgICB1cGRhdGVWaWV3cG9ydExpbmVzKCkge1xuICAgICAgICB0aGlzLnZpZXdwb3J0TGluZXMgPSBbXTtcbiAgICAgICAgdGhpcy5oZWlnaHRNYXAuZm9yRWFjaExpbmUodGhpcy52aWV3cG9ydC5mcm9tLCB0aGlzLnZpZXdwb3J0LnRvLCB0aGlzLmhlaWdodE9yYWNsZS5zZXREb2ModGhpcy5zdGF0ZS5kb2MpLCAwLCAwLCBibG9jayA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0TGluZXMucHVzaCh0aGlzLnNjYWxlci5zY2FsZSA9PSAxID8gYmxvY2sgOiBzY2FsZUJsb2NrKGJsb2NrLCB0aGlzLnNjYWxlcikpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSwgc2Nyb2xsVGFyZ2V0ID0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gdXBkYXRlLnN0YXRlO1xuICAgICAgICBsZXQgcHJldkRlY28gPSB0aGlzLnN0YXRlRGVjbztcbiAgICAgICAgdGhpcy5zdGF0ZURlY28gPSB0aGlzLnN0YXRlLmZhY2V0KGRlY29yYXRpb25zKS5maWx0ZXIoZCA9PiB0eXBlb2YgZCAhPSBcImZ1bmN0aW9uXCIpO1xuICAgICAgICBsZXQgY29udGVudENoYW5nZXMgPSB1cGRhdGUuY2hhbmdlZFJhbmdlcztcbiAgICAgICAgbGV0IGhlaWdodENoYW5nZXMgPSBDaGFuZ2VkUmFuZ2UuZXh0ZW5kV2l0aFJhbmdlcyhjb250ZW50Q2hhbmdlcywgaGVpZ2h0UmVsZXZhbnREZWNvQ2hhbmdlcyhwcmV2RGVjbywgdGhpcy5zdGF0ZURlY28sIHVwZGF0ZSA/IHVwZGF0ZS5jaGFuZ2VzIDogQ2hhbmdlU2V0LmVtcHR5KHRoaXMuc3RhdGUuZG9jLmxlbmd0aCkpKTtcbiAgICAgICAgbGV0IHByZXZIZWlnaHQgPSB0aGlzLmhlaWdodE1hcC5oZWlnaHQ7XG4gICAgICAgIGxldCBzY3JvbGxBbmNob3IgPSB0aGlzLnNjcm9sbGVkVG9Cb3R0b20gPyBudWxsIDogdGhpcy5zY3JvbGxBbmNob3JBdCh0aGlzLnNjcm9sbFRvcCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwID0gdGhpcy5oZWlnaHRNYXAuYXBwbHlDaGFuZ2VzKHRoaXMuc3RhdGVEZWNvLCB1cGRhdGUuc3RhcnRTdGF0ZS5kb2MsIHRoaXMuaGVpZ2h0T3JhY2xlLnNldERvYyh0aGlzLnN0YXRlLmRvYyksIGhlaWdodENoYW5nZXMpO1xuICAgICAgICBpZiAodGhpcy5oZWlnaHRNYXAuaGVpZ2h0ICE9IHByZXZIZWlnaHQpXG4gICAgICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLztcbiAgICAgICAgaWYgKHNjcm9sbEFuY2hvcikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JQb3MgPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3Moc2Nyb2xsQW5jaG9yLmZyb20sIC0xKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gc2Nyb2xsQW5jaG9yLnRvcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQW5jaG9yUG9zID0gLTE7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvckhlaWdodCA9IHRoaXMuaGVpZ2h0TWFwLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmlld3BvcnQgPSBoZWlnaHRDaGFuZ2VzLmxlbmd0aCA/IHRoaXMubWFwVmlld3BvcnQodGhpcy52aWV3cG9ydCwgdXBkYXRlLmNoYW5nZXMpIDogdGhpcy52aWV3cG9ydDtcbiAgICAgICAgaWYgKHNjcm9sbFRhcmdldCAmJiAoc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgPCB2aWV3cG9ydC5mcm9tIHx8IHNjcm9sbFRhcmdldC5yYW5nZS5oZWFkID4gdmlld3BvcnQudG8pIHx8XG4gICAgICAgICAgICAhdGhpcy52aWV3cG9ydElzQXBwcm9wcmlhdGUodmlld3BvcnQpKVxuICAgICAgICAgICAgdmlld3BvcnQgPSB0aGlzLmdldFZpZXdwb3J0KDAsIHNjcm9sbFRhcmdldCk7XG4gICAgICAgIGxldCB1cGRhdGVMaW5lcyA9ICF1cGRhdGUuY2hhbmdlcy5lbXB0eSB8fCAodXBkYXRlLmZsYWdzICYgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLykgfHxcbiAgICAgICAgICAgIHZpZXdwb3J0LmZyb20gIT0gdGhpcy52aWV3cG9ydC5mcm9tIHx8IHZpZXdwb3J0LnRvICE9IHRoaXMudmlld3BvcnQudG87XG4gICAgICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JWaWV3cG9ydCgpO1xuICAgICAgICBpZiAodXBkYXRlTGluZXMpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0TGluZXMoKTtcbiAgICAgICAgaWYgKHRoaXMubGluZUdhcHMubGVuZ3RoIHx8IHRoaXMudmlld3BvcnQudG8gLSB0aGlzLnZpZXdwb3J0LmZyb20gPiAoMjAwMCAvKiBMRy5NYXJnaW4gKi8gPDwgMSkpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxpbmVHYXBzKHRoaXMuZW5zdXJlTGluZUdhcHModGhpcy5tYXBMaW5lR2Fwcyh0aGlzLmxpbmVHYXBzLCB1cGRhdGUuY2hhbmdlcykpKTtcbiAgICAgICAgdXBkYXRlLmZsYWdzIHw9IHRoaXMuY29tcHV0ZVZpc2libGVSYW5nZXMoKTtcbiAgICAgICAgaWYgKHNjcm9sbFRhcmdldClcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ID0gc2Nyb2xsVGFyZ2V0O1xuICAgICAgICBpZiAoIXRoaXMubXVzdEVuZm9yY2VDdXJzb3JBc3NvYyAmJiB1cGRhdGUuc2VsZWN0aW9uU2V0ICYmIHVwZGF0ZS52aWV3LmxpbmVXcmFwcGluZyAmJlxuICAgICAgICAgICAgdXBkYXRlLnN0YXRlLnNlbGVjdGlvbi5tYWluLmVtcHR5ICYmIHVwZGF0ZS5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5hc3NvYyAmJlxuICAgICAgICAgICAgIXVwZGF0ZS5zdGF0ZS5mYWNldChuYXRpdmVTZWxlY3Rpb25IaWRkZW4pKVxuICAgICAgICAgICAgdGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jID0gdHJ1ZTtcbiAgICB9XG4gICAgbWVhc3VyZSh2aWV3KSB7XG4gICAgICAgIGxldCBkb20gPSB2aWV3LmNvbnRlbnRET00sIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9tKTtcbiAgICAgICAgbGV0IG9yYWNsZSA9IHRoaXMuaGVpZ2h0T3JhY2xlO1xuICAgICAgICBsZXQgd2hpdGVTcGFjZSA9IHN0eWxlLndoaXRlU3BhY2U7XG4gICAgICAgIHRoaXMuZGVmYXVsdFRleHREaXJlY3Rpb24gPSBzdHlsZS5kaXJlY3Rpb24gPT0gXCJydGxcIiA/IERpcmVjdGlvbi5SVEwgOiBEaXJlY3Rpb24uTFRSO1xuICAgICAgICBsZXQgcmVmcmVzaCA9IHRoaXMuaGVpZ2h0T3JhY2xlLm11c3RSZWZyZXNoRm9yV3JhcHBpbmcod2hpdGVTcGFjZSk7XG4gICAgICAgIGxldCBkb21SZWN0ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBsZXQgbWVhc3VyZUNvbnRlbnQgPSByZWZyZXNoIHx8IHRoaXMubXVzdE1lYXN1cmVDb250ZW50IHx8IHRoaXMuY29udGVudERPTUhlaWdodCAhPSBkb21SZWN0LmhlaWdodDtcbiAgICAgICAgdGhpcy5jb250ZW50RE9NSGVpZ2h0ID0gZG9tUmVjdC5oZWlnaHQ7XG4gICAgICAgIHRoaXMubXVzdE1lYXN1cmVDb250ZW50ID0gZmFsc2U7XG4gICAgICAgIGxldCByZXN1bHQgPSAwLCBiaWFzID0gMDtcbiAgICAgICAgaWYgKGRvbVJlY3Qud2lkdGggJiYgZG9tUmVjdC5oZWlnaHQpIHtcbiAgICAgICAgICAgIGxldCB7IHNjYWxlWCwgc2NhbGVZIH0gPSBnZXRTY2FsZShkb20sIGRvbVJlY3QpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2NhbGVYICE9IHNjYWxlWCB8fCB0aGlzLnNjYWxlWSAhPSBzY2FsZVkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxlWCA9IHNjYWxlWDtcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxlWSA9IHNjYWxlWTtcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gOCAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovO1xuICAgICAgICAgICAgICAgIHJlZnJlc2ggPSBtZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmVydGljYWwgcGFkZGluZ1xuICAgICAgICBsZXQgcGFkZGluZ1RvcCA9IChwYXJzZUludChzdHlsZS5wYWRkaW5nVG9wKSB8fCAwKSAqIHRoaXMuc2NhbGVZO1xuICAgICAgICBsZXQgcGFkZGluZ0JvdHRvbSA9IChwYXJzZUludChzdHlsZS5wYWRkaW5nQm90dG9tKSB8fCAwKSAqIHRoaXMuc2NhbGVZO1xuICAgICAgICBpZiAodGhpcy5wYWRkaW5nVG9wICE9IHBhZGRpbmdUb3AgfHwgdGhpcy5wYWRkaW5nQm90dG9tICE9IHBhZGRpbmdCb3R0b20pIHtcbiAgICAgICAgICAgIHRoaXMucGFkZGluZ1RvcCA9IHBhZGRpbmdUb3A7XG4gICAgICAgICAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSBwYWRkaW5nQm90dG9tO1xuICAgICAgICAgICAgcmVzdWx0IHw9IDggLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLyB8IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZWRpdG9yV2lkdGggIT0gdmlldy5zY3JvbGxET00uY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgIGlmIChvcmFjbGUubGluZVdyYXBwaW5nKVxuICAgICAgICAgICAgICAgIG1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yV2lkdGggPSB2aWV3LnNjcm9sbERPTS5jbGllbnRXaWR0aDtcbiAgICAgICAgICAgIHJlc3VsdCB8PSA4IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi87XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNjcm9sbFRvcCA9IHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCAqIHRoaXMuc2NhbGVZO1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxUb3AgIT0gc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxlZFRvQm90dG9tID0gaXNTY3JvbGxlZFRvQm90dG9tKHZpZXcuc2Nyb2xsRE9NKTtcbiAgICAgICAgLy8gUGl4ZWwgdmlld3BvcnRcbiAgICAgICAgbGV0IHBpeGVsVmlld3BvcnQgPSAodGhpcy5wcmludGluZyA/IGZ1bGxQaXhlbFJhbmdlIDogdmlzaWJsZVBpeGVsUmFuZ2UpKGRvbSwgdGhpcy5wYWRkaW5nVG9wKTtcbiAgICAgICAgbGV0IGRUb3AgPSBwaXhlbFZpZXdwb3J0LnRvcCAtIHRoaXMucGl4ZWxWaWV3cG9ydC50b3AsIGRCb3R0b20gPSBwaXhlbFZpZXdwb3J0LmJvdHRvbSAtIHRoaXMucGl4ZWxWaWV3cG9ydC5ib3R0b207XG4gICAgICAgIHRoaXMucGl4ZWxWaWV3cG9ydCA9IHBpeGVsVmlld3BvcnQ7XG4gICAgICAgIGxldCBpblZpZXcgPSB0aGlzLnBpeGVsVmlld3BvcnQuYm90dG9tID4gdGhpcy5waXhlbFZpZXdwb3J0LnRvcCAmJiB0aGlzLnBpeGVsVmlld3BvcnQucmlnaHQgPiB0aGlzLnBpeGVsVmlld3BvcnQubGVmdDtcbiAgICAgICAgaWYgKGluVmlldyAhPSB0aGlzLmluVmlldykge1xuICAgICAgICAgICAgdGhpcy5pblZpZXcgPSBpblZpZXc7XG4gICAgICAgICAgICBpZiAoaW5WaWV3KVxuICAgICAgICAgICAgICAgIG1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaW5WaWV3ICYmICF0aGlzLnNjcm9sbFRhcmdldClcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBsZXQgY29udGVudFdpZHRoID0gZG9tUmVjdC53aWR0aDtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudERPTVdpZHRoICE9IGNvbnRlbnRXaWR0aCB8fCB0aGlzLmVkaXRvckhlaWdodCAhPSB2aWV3LnNjcm9sbERPTS5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudERPTVdpZHRoID0gZG9tUmVjdC53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9ySGVpZ2h0ID0gdmlldy5zY3JvbGxET00uY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgcmVzdWx0IHw9IDggLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVhc3VyZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIGxldCBsaW5lSGVpZ2h0cyA9IHZpZXcuZG9jVmlldy5tZWFzdXJlVmlzaWJsZUxpbmVIZWlnaHRzKHRoaXMudmlld3BvcnQpO1xuICAgICAgICAgICAgaWYgKG9yYWNsZS5tdXN0UmVmcmVzaEZvckhlaWdodHMobGluZUhlaWdodHMpKVxuICAgICAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHJlZnJlc2ggfHwgb3JhY2xlLmxpbmVXcmFwcGluZyAmJiBNYXRoLmFicyhjb250ZW50V2lkdGggLSB0aGlzLmNvbnRlbnRET01XaWR0aCkgPiBvcmFjbGUuY2hhcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0IH0gPSB2aWV3LmRvY1ZpZXcubWVhc3VyZVRleHRTaXplKCk7XG4gICAgICAgICAgICAgICAgcmVmcmVzaCA9IGxpbmVIZWlnaHQgPiAwICYmIG9yYWNsZS5yZWZyZXNoKHdoaXRlU3BhY2UsIGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCwgY29udGVudFdpZHRoIC8gY2hhcldpZHRoLCBsaW5lSGVpZ2h0cyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZnJlc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5kb2NWaWV3Lm1pbldpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IDggLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZFRvcCA+IDAgJiYgZEJvdHRvbSA+IDApXG4gICAgICAgICAgICAgICAgYmlhcyA9IE1hdGgubWF4KGRUb3AsIGRCb3R0b20pO1xuICAgICAgICAgICAgZWxzZSBpZiAoZFRvcCA8IDAgJiYgZEJvdHRvbSA8IDApXG4gICAgICAgICAgICAgICAgYmlhcyA9IE1hdGgubWluKGRUb3AsIGRCb3R0b20pO1xuICAgICAgICAgICAgb3JhY2xlLmhlaWdodENoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IHZwIG9mIHRoaXMudmlld3BvcnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodHMgPSB2cC5mcm9tID09IHRoaXMudmlld3BvcnQuZnJvbSA/IGxpbmVIZWlnaHRzIDogdmlldy5kb2NWaWV3Lm1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHModnApO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0TWFwID0gKHJlZnJlc2ggPyBIZWlnaHRNYXAuZW1wdHkoKS5hcHBseUNoYW5nZXModGhpcy5zdGF0ZURlY28sIFRleHQuZW1wdHksIHRoaXMuaGVpZ2h0T3JhY2xlLCBbbmV3IENoYW5nZWRSYW5nZSgwLCAwLCAwLCB2aWV3LnN0YXRlLmRvYy5sZW5ndGgpXSkgOiB0aGlzLmhlaWdodE1hcCkudXBkYXRlSGVpZ2h0KG9yYWNsZSwgMCwgcmVmcmVzaCwgbmV3IE1lYXN1cmVkSGVpZ2h0cyh2cC5mcm9tLCBoZWlnaHRzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3JhY2xlLmhlaWdodENoYW5nZWQpXG4gICAgICAgICAgICAgICAgcmVzdWx0IHw9IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi87XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZpZXdwb3J0Q2hhbmdlID0gIXRoaXMudmlld3BvcnRJc0FwcHJvcHJpYXRlKHRoaXMudmlld3BvcnQsIGJpYXMpIHx8XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRhcmdldCAmJiAodGhpcy5zY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA8IHRoaXMudmlld3BvcnQuZnJvbSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgPiB0aGlzLnZpZXdwb3J0LnRvKTtcbiAgICAgICAgaWYgKHZpZXdwb3J0Q2hhbmdlKVxuICAgICAgICAgICAgdGhpcy52aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld3BvcnQoYmlhcywgdGhpcy5zY3JvbGxUYXJnZXQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvclZpZXdwb3J0KCk7XG4gICAgICAgIGlmICgocmVzdWx0ICYgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLykgfHwgdmlld3BvcnRDaGFuZ2UpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0TGluZXMoKTtcbiAgICAgICAgaWYgKHRoaXMubGluZUdhcHMubGVuZ3RoIHx8IHRoaXMudmlld3BvcnQudG8gLSB0aGlzLnZpZXdwb3J0LmZyb20gPiAoMjAwMCAvKiBMRy5NYXJnaW4gKi8gPDwgMSkpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxpbmVHYXBzKHRoaXMuZW5zdXJlTGluZUdhcHMocmVmcmVzaCA/IFtdIDogdGhpcy5saW5lR2FwcywgdmlldykpO1xuICAgICAgICByZXN1bHQgfD0gdGhpcy5jb21wdXRlVmlzaWJsZVJhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jKSB7XG4gICAgICAgICAgICB0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSBpbiB0aGUgcmVhZCBzdGFnZSwgYmVjYXVzZSBtb3ZpbmcgdGhlIHNlbGVjdGlvblxuICAgICAgICAgICAgLy8gdG8gYSBsaW5lIGVuZCBpcyBnb2luZyB0byB0cmlnZ2VyIGEgbGF5b3V0IGFueXdheSwgc28gaXRcbiAgICAgICAgICAgIC8vIGNhbid0IGJlIGEgcHVyZSB3cml0ZS4gSXQgc2hvdWxkIGJlIHJhcmUgdGhhdCBpdCBkb2VzIGFueVxuICAgICAgICAgICAgLy8gd3JpdGluZy5cbiAgICAgICAgICAgIHZpZXcuZG9jVmlldy5lbmZvcmNlQ3Vyc29yQXNzb2MoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBnZXQgdmlzaWJsZVRvcCgpIHsgcmV0dXJuIHRoaXMuc2NhbGVyLmZyb21ET00odGhpcy5waXhlbFZpZXdwb3J0LnRvcCk7IH1cbiAgICBnZXQgdmlzaWJsZUJvdHRvbSgpIHsgcmV0dXJuIHRoaXMuc2NhbGVyLmZyb21ET00odGhpcy5waXhlbFZpZXdwb3J0LmJvdHRvbSk7IH1cbiAgICBnZXRWaWV3cG9ydChiaWFzLCBzY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIGRpdmlkZSBWUC5NYXJnaW4gYmV0d2VlbiB0aGUgdG9wIGFuZCB0aGVcbiAgICAgICAgLy8gYm90dG9tLCBkZXBlbmRpbmcgb24gdGhlIGJpYXMgKHRoZSBjaGFuZ2UgaW4gdmlld3BvcnQgcG9zaXRpb25cbiAgICAgICAgLy8gc2luY2UgdGhlIGxhc3QgdXBkYXRlKS4gSXQnbGwgaG9sZCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDFcbiAgICAgICAgbGV0IG1hcmdpblRvcCA9IDAuNSAtIE1hdGgubWF4KC0wLjUsIE1hdGgubWluKDAuNSwgYmlhcyAvIDEwMDAgLyogVlAuTWFyZ2luICovIC8gMikpO1xuICAgICAgICBsZXQgbWFwID0gdGhpcy5oZWlnaHRNYXAsIG9yYWNsZSA9IHRoaXMuaGVpZ2h0T3JhY2xlO1xuICAgICAgICBsZXQgeyB2aXNpYmxlVG9wLCB2aXNpYmxlQm90dG9tIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdmlld3BvcnQgPSBuZXcgVmlld3BvcnQobWFwLmxpbmVBdCh2aXNpYmxlVG9wIC0gbWFyZ2luVG9wICogMTAwMCAvKiBWUC5NYXJnaW4gKi8sIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS5mcm9tLCBtYXAubGluZUF0KHZpc2libGVCb3R0b20gKyAoMSAtIG1hcmdpblRvcCkgKiAxMDAwIC8qIFZQLk1hcmdpbiAqLywgUXVlcnlUeXBlLkJ5SGVpZ2h0LCBvcmFjbGUsIDAsIDApLnRvKTtcbiAgICAgICAgLy8gSWYgc2Nyb2xsVGFyZ2V0IGlzIGdpdmVuLCBtYWtlIHN1cmUgdGhlIHZpZXdwb3J0IGluY2x1ZGVzIHRoYXQgcG9zaXRpb25cbiAgICAgICAgaWYgKHNjcm9sbFRhcmdldCkge1xuICAgICAgICAgICAgbGV0IHsgaGVhZCB9ID0gc2Nyb2xsVGFyZ2V0LnJhbmdlO1xuICAgICAgICAgICAgaWYgKGhlYWQgPCB2aWV3cG9ydC5mcm9tIHx8IGhlYWQgPiB2aWV3cG9ydC50bykge1xuICAgICAgICAgICAgICAgIGxldCB2aWV3SGVpZ2h0ID0gTWF0aC5taW4odGhpcy5lZGl0b3JIZWlnaHQsIHRoaXMucGl4ZWxWaWV3cG9ydC5ib3R0b20gLSB0aGlzLnBpeGVsVmlld3BvcnQudG9wKTtcbiAgICAgICAgICAgICAgICBsZXQgYmxvY2sgPSBtYXAubGluZUF0KGhlYWQsIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCAwLCAwKSwgdG9wUG9zO1xuICAgICAgICAgICAgICAgIGlmIChzY3JvbGxUYXJnZXQueSA9PSBcImNlbnRlclwiKVxuICAgICAgICAgICAgICAgICAgICB0b3BQb3MgPSAoYmxvY2sudG9wICsgYmxvY2suYm90dG9tKSAvIDIgLSB2aWV3SGVpZ2h0IC8gMjtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY3JvbGxUYXJnZXQueSA9PSBcInN0YXJ0XCIgfHwgc2Nyb2xsVGFyZ2V0LnkgPT0gXCJuZWFyZXN0XCIgJiYgaGVhZCA8IHZpZXdwb3J0LmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHRvcFBvcyA9IGJsb2NrLnRvcDtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRvcFBvcyA9IGJsb2NrLmJvdHRvbSAtIHZpZXdIZWlnaHQ7XG4gICAgICAgICAgICAgICAgdmlld3BvcnQgPSBuZXcgVmlld3BvcnQobWFwLmxpbmVBdCh0b3BQb3MgLSAxMDAwIC8qIFZQLk1hcmdpbiAqLyAvIDIsIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS5mcm9tLCBtYXAubGluZUF0KHRvcFBvcyArIHZpZXdIZWlnaHQgKyAxMDAwIC8qIFZQLk1hcmdpbiAqLyAvIDIsIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS50byk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpZXdwb3J0O1xuICAgIH1cbiAgICBtYXBWaWV3cG9ydCh2aWV3cG9ydCwgY2hhbmdlcykge1xuICAgICAgICBsZXQgZnJvbSA9IGNoYW5nZXMubWFwUG9zKHZpZXdwb3J0LmZyb20sIC0xKSwgdG8gPSBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC50bywgMSk7XG4gICAgICAgIHJldHVybiBuZXcgVmlld3BvcnQodGhpcy5oZWlnaHRNYXAubGluZUF0KGZyb20sIFF1ZXJ5VHlwZS5CeVBvcywgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApLmZyb20sIHRoaXMuaGVpZ2h0TWFwLmxpbmVBdCh0bywgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCkudG8pO1xuICAgIH1cbiAgICAvLyBDaGVja3MgaWYgYSBnaXZlbiB2aWV3cG9ydCBjb3ZlcnMgdGhlIHZpc2libGUgcGFydCBvZiB0aGVcbiAgICAvLyBkb2N1bWVudCBhbmQgbm90IHRvbyBtdWNoIGJleW9uZCB0aGF0LlxuICAgIHZpZXdwb3J0SXNBcHByb3ByaWF0ZSh7IGZyb20sIHRvIH0sIGJpYXMgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy5pblZpZXcpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IHsgdG9wIH0gPSB0aGlzLmhlaWdodE1hcC5saW5lQXQoZnJvbSwgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCk7XG4gICAgICAgIGxldCB7IGJvdHRvbSB9ID0gdGhpcy5oZWlnaHRNYXAubGluZUF0KHRvLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKTtcbiAgICAgICAgbGV0IHsgdmlzaWJsZVRvcCwgdmlzaWJsZUJvdHRvbSB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIChmcm9tID09IDAgfHwgdG9wIDw9IHZpc2libGVUb3AgLSBNYXRoLm1heCgxMCAvKiBWUC5NaW5Db3Zlck1hcmdpbiAqLywgTWF0aC5taW4oLWJpYXMsIDI1MCAvKiBWUC5NYXhDb3Zlck1hcmdpbiAqLykpKSAmJlxuICAgICAgICAgICAgKHRvID09IHRoaXMuc3RhdGUuZG9jLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIGJvdHRvbSA+PSB2aXNpYmxlQm90dG9tICsgTWF0aC5tYXgoMTAgLyogVlAuTWluQ292ZXJNYXJnaW4gKi8sIE1hdGgubWluKGJpYXMsIDI1MCAvKiBWUC5NYXhDb3Zlck1hcmdpbiAqLykpKSAmJlxuICAgICAgICAgICAgKHRvcCA+IHZpc2libGVUb3AgLSAyICogMTAwMCAvKiBWUC5NYXJnaW4gKi8gJiYgYm90dG9tIDwgdmlzaWJsZUJvdHRvbSArIDIgKiAxMDAwIC8qIFZQLk1hcmdpbiAqLyk7XG4gICAgfVxuICAgIG1hcExpbmVHYXBzKGdhcHMsIGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKCFnYXBzLmxlbmd0aCB8fCBjaGFuZ2VzLmVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIGdhcHM7XG4gICAgICAgIGxldCBtYXBwZWQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZ2FwIG9mIGdhcHMpXG4gICAgICAgICAgICBpZiAoIWNoYW5nZXMudG91Y2hlc1JhbmdlKGdhcC5mcm9tLCBnYXAudG8pKVxuICAgICAgICAgICAgICAgIG1hcHBlZC5wdXNoKG5ldyBMaW5lR2FwKGNoYW5nZXMubWFwUG9zKGdhcC5mcm9tKSwgY2hhbmdlcy5tYXBQb3MoZ2FwLnRvKSwgZ2FwLnNpemUpKTtcbiAgICAgICAgcmV0dXJuIG1hcHBlZDtcbiAgICB9XG4gICAgLy8gQ29tcHV0ZXMgcG9zaXRpb25zIGluIHRoZSB2aWV3cG9ydCB3aGVyZSB0aGUgc3RhcnQgb3IgZW5kIG9mIGFcbiAgICAvLyBsaW5lIHNob3VsZCBiZSBoaWRkZW4sIHRyeWluZyB0byByZXVzZSBleGlzdGluZyBsaW5lIGdhcHMgd2hlblxuICAgIC8vIGFwcHJvcHJpYXRlIHRvIGF2b2lkIHVubmVjY2VzYXJ5IHJlZHJhd3MuXG4gICAgLy8gVXNlcyBjcnVkZSBjaGFyYWN0ZXItY291bnRpbmcgZm9yIHRoZSBwb3NpdGlvbmluZyBhbmQgc2l6aW5nLFxuICAgIC8vIHNpbmNlIGFjdHVhbCBET00gY29vcmRpbmF0ZXMgYXJlbid0IGFsd2F5cyBhdmFpbGFibGUgYW5kXG4gICAgLy8gcHJlZGljdGFibGUuIFJlbGllcyBvbiBnZW5lcm91cyBtYXJnaW5zIChzZWUgTEcuTWFyZ2luKSB0byBoaWRlXG4gICAgLy8gdGhlIGFydGlmYWN0cyB0aGlzIG1pZ2h0IHByb2R1Y2UgZnJvbSB0aGUgdXNlci5cbiAgICBlbnN1cmVMaW5lR2FwcyhjdXJyZW50LCBtYXlNZWFzdXJlKSB7XG4gICAgICAgIGxldCB3cmFwcGluZyA9IHRoaXMuaGVpZ2h0T3JhY2xlLmxpbmVXcmFwcGluZztcbiAgICAgICAgbGV0IG1hcmdpbiA9IHdyYXBwaW5nID8gMTAwMDAgLyogTEcuTWFyZ2luV3JhcCAqLyA6IDIwMDAgLyogTEcuTWFyZ2luICovLCBoYWxmTWFyZ2luID0gbWFyZ2luID4+IDEsIGRvdWJsZU1hcmdpbiA9IG1hcmdpbiA8PCAxO1xuICAgICAgICAvLyBUaGUgbm9uLXdyYXBwaW5nIGxvZ2ljIHdvbid0IHdvcmsgYXQgYWxsIGluIHByZWRvbWluYW50bHkgcmlnaHQtdG8tbGVmdCB0ZXh0LlxuICAgICAgICBpZiAodGhpcy5kZWZhdWx0VGV4dERpcmVjdGlvbiAhPSBEaXJlY3Rpb24uTFRSICYmICF3cmFwcGluZylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgbGV0IGdhcHMgPSBbXTtcbiAgICAgICAgbGV0IGFkZEdhcCA9IChmcm9tLCB0bywgbGluZSwgc3RydWN0dXJlKSA9PiB7XG4gICAgICAgICAgICBpZiAodG8gLSBmcm9tIDwgaGFsZk1hcmdpbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgc2VsID0gdGhpcy5zdGF0ZS5zZWxlY3Rpb24ubWFpbiwgYXZvaWQgPSBbc2VsLmZyb21dO1xuICAgICAgICAgICAgaWYgKCFzZWwuZW1wdHkpXG4gICAgICAgICAgICAgICAgYXZvaWQucHVzaChzZWwudG8pO1xuICAgICAgICAgICAgZm9yIChsZXQgcG9zIG9mIGF2b2lkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20gJiYgcG9zIDwgdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkR2FwKGZyb20sIHBvcyAtIDEwIC8qIExHLlNlbGVjdGlvbk1hcmdpbiAqLywgbGluZSwgc3RydWN0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkR2FwKHBvcyArIDEwIC8qIExHLlNlbGVjdGlvbk1hcmdpbiAqLywgdG8sIGxpbmUsIHN0cnVjdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZ2FwID0gZmluZChjdXJyZW50LCBnYXAgPT4gZ2FwLmZyb20gPj0gbGluZS5mcm9tICYmIGdhcC50byA8PSBsaW5lLnRvICYmXG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoZ2FwLmZyb20gLSBmcm9tKSA8IGhhbGZNYXJnaW4gJiYgTWF0aC5hYnMoZ2FwLnRvIC0gdG8pIDwgaGFsZk1hcmdpbiAmJlxuICAgICAgICAgICAgICAgICFhdm9pZC5zb21lKHBvcyA9PiBnYXAuZnJvbSA8IHBvcyAmJiBnYXAudG8gPiBwb3MpKTtcbiAgICAgICAgICAgIGlmICghZ2FwKSB7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBzY3JvbGxpbmcgZG93biwgc25hcCBnYXAgZW5kcyB0byBsaW5lIHN0YXJ0cyB0byBhdm9pZCBzaGlmdHMgaW4gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICBpZiAodG8gPCBsaW5lLnRvICYmIG1heU1lYXN1cmUgJiYgd3JhcHBpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgbWF5TWVhc3VyZS52aXNpYmxlUmFuZ2VzLnNvbWUociA9PiByLmZyb20gPD0gdG8gJiYgci50byA+PSB0bykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVTdGFydCA9IG1heU1lYXN1cmUubW92ZVRvTGluZUJvdW5kYXJ5KEVkaXRvclNlbGVjdGlvbi5jdXJzb3IodG8pLCBmYWxzZSwgdHJ1ZSkuaGVhZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVTdGFydCA+IGZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICB0byA9IGxpbmVTdGFydDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2FwID0gbmV3IExpbmVHYXAoZnJvbSwgdG8sIHRoaXMuZ2FwU2l6ZShsaW5lLCBmcm9tLCB0bywgc3RydWN0dXJlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnYXBzLnB1c2goZ2FwKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiB0aGlzLnZpZXdwb3J0TGluZXMpIHtcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA8IGRvdWJsZU1hcmdpbilcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBzdHJ1Y3R1cmUgPSBsaW5lU3RydWN0dXJlKGxpbmUuZnJvbSwgbGluZS50bywgdGhpcy5zdGF0ZURlY28pO1xuICAgICAgICAgICAgaWYgKHN0cnVjdHVyZS50b3RhbCA8IGRvdWJsZU1hcmdpbilcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLnNjcm9sbFRhcmdldCA/IHRoaXMuc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgOiBudWxsO1xuICAgICAgICAgICAgbGV0IHZpZXdGcm9tLCB2aWV3VG87XG4gICAgICAgICAgICBpZiAod3JhcHBpbmcpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFyZ2luSGVpZ2h0ID0gKG1hcmdpbiAvIHRoaXMuaGVpZ2h0T3JhY2xlLmxpbmVMZW5ndGgpICogdGhpcy5oZWlnaHRPcmFjbGUubGluZUhlaWdodDtcbiAgICAgICAgICAgICAgICBsZXQgdG9wLCBib3Q7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXRGcmFjID0gZmluZEZyYWN0aW9uKHN0cnVjdHVyZSwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwYWNlRnJhYyA9ICgodGhpcy52aXNpYmxlQm90dG9tIC0gdGhpcy52aXNpYmxlVG9wKSAvIDIgKyBtYXJnaW5IZWlnaHQpIC8gbGluZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IHRhcmdldEZyYWMgLSBzcGFjZUZyYWM7XG4gICAgICAgICAgICAgICAgICAgIGJvdCA9IHRhcmdldEZyYWMgKyBzcGFjZUZyYWM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSAodGhpcy52aXNpYmxlVG9wIC0gbGluZS50b3AgLSBtYXJnaW5IZWlnaHQpIC8gbGluZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGJvdCA9ICh0aGlzLnZpc2libGVCb3R0b20gLSBsaW5lLnRvcCArIG1hcmdpbkhlaWdodCkgLyBsaW5lLmhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmlld0Zyb20gPSBmaW5kUG9zaXRpb24oc3RydWN0dXJlLCB0b3ApO1xuICAgICAgICAgICAgICAgIHZpZXdUbyA9IGZpbmRQb3NpdGlvbihzdHJ1Y3R1cmUsIGJvdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdG90YWxXaWR0aCA9IHN0cnVjdHVyZS50b3RhbCAqIHRoaXMuaGVpZ2h0T3JhY2xlLmNoYXJXaWR0aDtcbiAgICAgICAgICAgICAgICBsZXQgbWFyZ2luV2lkdGggPSBtYXJnaW4gKiB0aGlzLmhlaWdodE9yYWNsZS5jaGFyV2lkdGg7XG4gICAgICAgICAgICAgICAgbGV0IGxlZnQsIHJpZ2h0O1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0RnJhYyA9IGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGFjZUZyYWMgPSAoKHRoaXMucGl4ZWxWaWV3cG9ydC5yaWdodCAtIHRoaXMucGl4ZWxWaWV3cG9ydC5sZWZ0KSAvIDIgKyBtYXJnaW5XaWR0aCkgLyB0b3RhbFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gdGFyZ2V0RnJhYyAtIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0YXJnZXRGcmFjICsgc3BhY2VGcmFjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9ICh0aGlzLnBpeGVsVmlld3BvcnQubGVmdCAtIG1hcmdpbldpZHRoKSAvIHRvdGFsV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gKHRoaXMucGl4ZWxWaWV3cG9ydC5yaWdodCArIG1hcmdpbldpZHRoKSAvIHRvdGFsV2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZpZXdGcm9tID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgbGVmdCk7XG4gICAgICAgICAgICAgICAgdmlld1RvID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgcmlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpZXdGcm9tID4gbGluZS5mcm9tKVxuICAgICAgICAgICAgICAgIGFkZEdhcChsaW5lLmZyb20sIHZpZXdGcm9tLCBsaW5lLCBzdHJ1Y3R1cmUpO1xuICAgICAgICAgICAgaWYgKHZpZXdUbyA8IGxpbmUudG8pXG4gICAgICAgICAgICAgICAgYWRkR2FwKHZpZXdUbywgbGluZS50bywgbGluZSwgc3RydWN0dXJlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2FwcztcbiAgICB9XG4gICAgZ2FwU2l6ZShsaW5lLCBmcm9tLCB0bywgc3RydWN0dXJlKSB7XG4gICAgICAgIGxldCBmcmFjdGlvbiA9IGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIHRvKSAtIGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIGZyb20pO1xuICAgICAgICBpZiAodGhpcy5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbGluZS5oZWlnaHQgKiBmcmFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJ1Y3R1cmUudG90YWwgKiB0aGlzLmhlaWdodE9yYWNsZS5jaGFyV2lkdGggKiBmcmFjdGlvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVMaW5lR2FwcyhnYXBzKSB7XG4gICAgICAgIGlmICghTGluZUdhcC5zYW1lKGdhcHMsIHRoaXMubGluZUdhcHMpKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmVHYXBzID0gZ2FwcztcbiAgICAgICAgICAgIHRoaXMubGluZUdhcERlY28gPSBEZWNvcmF0aW9uLnNldChnYXBzLm1hcChnYXAgPT4gZ2FwLmRyYXcodGhpcywgdGhpcy5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXB1dGVWaXNpYmxlUmFuZ2VzKCkge1xuICAgICAgICBsZXQgZGVjbyA9IHRoaXMuc3RhdGVEZWNvO1xuICAgICAgICBpZiAodGhpcy5saW5lR2Fwcy5sZW5ndGgpXG4gICAgICAgICAgICBkZWNvID0gZGVjby5jb25jYXQodGhpcy5saW5lR2FwRGVjbyk7XG4gICAgICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICAgICAgUmFuZ2VTZXQuc3BhbnMoZGVjbywgdGhpcy52aWV3cG9ydC5mcm9tLCB0aGlzLnZpZXdwb3J0LnRvLCB7XG4gICAgICAgICAgICBzcGFuKGZyb20sIHRvKSB7IHJhbmdlcy5wdXNoKHsgZnJvbSwgdG8gfSk7IH0sXG4gICAgICAgICAgICBwb2ludCgpIHsgfVxuICAgICAgICB9LCAyMCk7XG4gICAgICAgIGxldCBjaGFuZ2VkID0gcmFuZ2VzLmxlbmd0aCAhPSB0aGlzLnZpc2libGVSYW5nZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICB0aGlzLnZpc2libGVSYW5nZXMuc29tZSgociwgaSkgPT4gci5mcm9tICE9IHJhbmdlc1tpXS5mcm9tIHx8IHIudG8gIT0gcmFuZ2VzW2ldLnRvKTtcbiAgICAgICAgdGhpcy52aXNpYmxlUmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICByZXR1cm4gY2hhbmdlZCA/IDQgLyogVXBkYXRlRmxhZy5WaWV3cG9ydCAqLyA6IDA7XG4gICAgfVxuICAgIGxpbmVCbG9ja0F0KHBvcykge1xuICAgICAgICByZXR1cm4gKHBvcyA+PSB0aGlzLnZpZXdwb3J0LmZyb20gJiYgcG9zIDw9IHRoaXMudmlld3BvcnQudG8gJiYgdGhpcy52aWV3cG9ydExpbmVzLmZpbmQoYiA9PiBiLmZyb20gPD0gcG9zICYmIGIudG8gPj0gcG9zKSkgfHxcbiAgICAgICAgICAgIHNjYWxlQmxvY2sodGhpcy5oZWlnaHRNYXAubGluZUF0KHBvcywgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCksIHRoaXMuc2NhbGVyKTtcbiAgICB9XG4gICAgbGluZUJsb2NrQXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBzY2FsZUJsb2NrKHRoaXMuaGVpZ2h0TWFwLmxpbmVBdCh0aGlzLnNjYWxlci5mcm9tRE9NKGhlaWdodCksIFF1ZXJ5VHlwZS5CeUhlaWdodCwgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApLCB0aGlzLnNjYWxlcik7XG4gICAgfVxuICAgIHNjcm9sbEFuY2hvckF0KHNjcm9sbFRvcCkge1xuICAgICAgICBsZXQgYmxvY2sgPSB0aGlzLmxpbmVCbG9ja0F0SGVpZ2h0KHNjcm9sbFRvcCArIDgpO1xuICAgICAgICByZXR1cm4gYmxvY2suZnJvbSA+PSB0aGlzLnZpZXdwb3J0LmZyb20gfHwgdGhpcy52aWV3cG9ydExpbmVzWzBdLnRvcCAtIHNjcm9sbFRvcCA+IDIwMCA/IGJsb2NrIDogdGhpcy52aWV3cG9ydExpbmVzWzBdO1xuICAgIH1cbiAgICBlbGVtZW50QXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBzY2FsZUJsb2NrKHRoaXMuaGVpZ2h0TWFwLmJsb2NrQXQodGhpcy5zY2FsZXIuZnJvbURPTShoZWlnaHQpLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCksIHRoaXMuc2NhbGVyKTtcbiAgICB9XG4gICAgZ2V0IGRvY0hlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGVyLnRvRE9NKHRoaXMuaGVpZ2h0TWFwLmhlaWdodCk7XG4gICAgfVxuICAgIGdldCBjb250ZW50SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NIZWlnaHQgKyB0aGlzLnBhZGRpbmdUb3AgKyB0aGlzLnBhZGRpbmdCb3R0b207XG4gICAgfVxufVxuY2xhc3MgVmlld3BvcnQge1xuICAgIGNvbnN0cnVjdG9yKGZyb20sIHRvKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICB9XG59XG5mdW5jdGlvbiBsaW5lU3RydWN0dXJlKGZyb20sIHRvLCBzdGF0ZURlY28pIHtcbiAgICBsZXQgcmFuZ2VzID0gW10sIHBvcyA9IGZyb20sIHRvdGFsID0gMDtcbiAgICBSYW5nZVNldC5zcGFucyhzdGF0ZURlY28sIGZyb20sIHRvLCB7XG4gICAgICAgIHNwYW4oKSB7IH0sXG4gICAgICAgIHBvaW50KGZyb20sIHRvKSB7XG4gICAgICAgICAgICBpZiAoZnJvbSA+IHBvcykge1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKHsgZnJvbTogcG9zLCB0bzogZnJvbSB9KTtcbiAgICAgICAgICAgICAgICB0b3RhbCArPSBmcm9tIC0gcG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gdG87XG4gICAgICAgIH1cbiAgICB9LCAyMCk7IC8vIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBjb2xsYXBzZWQgcmFuZ2VzIG9mIGEgc2lnbmlmaWNhbnQgc2l6ZVxuICAgIGlmIChwb3MgPCB0bykge1xuICAgICAgICByYW5nZXMucHVzaCh7IGZyb206IHBvcywgdG8gfSk7XG4gICAgICAgIHRvdGFsICs9IHRvIC0gcG9zO1xuICAgIH1cbiAgICByZXR1cm4geyB0b3RhbCwgcmFuZ2VzIH07XG59XG5mdW5jdGlvbiBmaW5kUG9zaXRpb24oeyB0b3RhbCwgcmFuZ2VzIH0sIHJhdGlvKSB7XG4gICAgaWYgKHJhdGlvIDw9IDApXG4gICAgICAgIHJldHVybiByYW5nZXNbMF0uZnJvbTtcbiAgICBpZiAocmF0aW8gPj0gMSlcbiAgICAgICAgcmV0dXJuIHJhbmdlc1tyYW5nZXMubGVuZ3RoIC0gMV0udG87XG4gICAgbGV0IGRpc3QgPSBNYXRoLmZsb29yKHRvdGFsICogcmF0aW8pO1xuICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSByYW5nZXNbaV0sIHNpemUgPSB0byAtIGZyb207XG4gICAgICAgIGlmIChkaXN0IDw9IHNpemUpXG4gICAgICAgICAgICByZXR1cm4gZnJvbSArIGRpc3Q7XG4gICAgICAgIGRpc3QgLT0gc2l6ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCBwb3MpIHtcbiAgICBsZXQgY291bnRlZCA9IDA7XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHN0cnVjdHVyZS5yYW5nZXMpIHtcbiAgICAgICAgaWYgKHBvcyA8PSB0bykge1xuICAgICAgICAgICAgY291bnRlZCArPSBwb3MgLSBmcm9tO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY291bnRlZCArPSB0byAtIGZyb207XG4gICAgfVxuICAgIHJldHVybiBjb3VudGVkIC8gc3RydWN0dXJlLnRvdGFsO1xufVxuZnVuY3Rpb24gZmluZChhcnJheSwgZikge1xuICAgIGZvciAobGV0IHZhbCBvZiBhcnJheSlcbiAgICAgICAgaWYgKGYodmFsKSlcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8vIERvbid0IHNjYWxlIHdoZW4gdGhlIGRvY3VtZW50IGhlaWdodCBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHdoYXRcbi8vIHRoZSBET00gY2FuIGhhbmRsZS5cbmNvbnN0IElkU2NhbGVyID0ge1xuICAgIHRvRE9NKG4pIHsgcmV0dXJuIG47IH0sXG4gICAgZnJvbURPTShuKSB7IHJldHVybiBuOyB9LFxuICAgIHNjYWxlOiAxXG59O1xuLy8gV2hlbiB0aGUgaGVpZ2h0IGlzIHRvbyBiaWcgKD4gVlAuTWF4RE9NSGVpZ2h0KSwgc2NhbGUgZG93biB0aGVcbi8vIHJlZ2lvbnMgb3V0c2lkZSB0aGUgdmlld3BvcnRzIHNvIHRoYXQgdGhlIHRvdGFsIGhlaWdodCBpc1xuLy8gVlAuTWF4RE9NSGVpZ2h0LlxuY2xhc3MgQmlnU2NhbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcmFjbGUsIGhlaWdodE1hcCwgdmlld3BvcnRzKSB7XG4gICAgICAgIGxldCB2cEhlaWdodCA9IDAsIGJhc2UgPSAwLCBkb21CYXNlID0gMDtcbiAgICAgICAgdGhpcy52aWV3cG9ydHMgPSB2aWV3cG9ydHMubWFwKCh7IGZyb20sIHRvIH0pID0+IHtcbiAgICAgICAgICAgIGxldCB0b3AgPSBoZWlnaHRNYXAubGluZUF0KGZyb20sIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCAwLCAwKS50b3A7XG4gICAgICAgICAgICBsZXQgYm90dG9tID0gaGVpZ2h0TWFwLmxpbmVBdCh0bywgUXVlcnlUeXBlLkJ5UG9zLCBvcmFjbGUsIDAsIDApLmJvdHRvbTtcbiAgICAgICAgICAgIHZwSGVpZ2h0ICs9IGJvdHRvbSAtIHRvcDtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb20sIHRvLCB0b3AsIGJvdHRvbSwgZG9tVG9wOiAwLCBkb21Cb3R0b206IDAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2NhbGUgPSAoNzAwMDAwMCAvKiBWUC5NYXhET01IZWlnaHQgKi8gLSB2cEhlaWdodCkgLyAoaGVpZ2h0TWFwLmhlaWdodCAtIHZwSGVpZ2h0KTtcbiAgICAgICAgZm9yIChsZXQgb2JqIG9mIHRoaXMudmlld3BvcnRzKSB7XG4gICAgICAgICAgICBvYmouZG9tVG9wID0gZG9tQmFzZSArIChvYmoudG9wIC0gYmFzZSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgZG9tQmFzZSA9IG9iai5kb21Cb3R0b20gPSBvYmouZG9tVG9wICsgKG9iai5ib3R0b20gLSBvYmoudG9wKTtcbiAgICAgICAgICAgIGJhc2UgPSBvYmouYm90dG9tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvRE9NKG4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGJhc2UgPSAwLCBkb21CYXNlID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZwID0gaSA8IHRoaXMudmlld3BvcnRzLmxlbmd0aCA/IHRoaXMudmlld3BvcnRzW2ldIDogbnVsbDtcbiAgICAgICAgICAgIGlmICghdnAgfHwgbiA8IHZwLnRvcClcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9tQmFzZSArIChuIC0gYmFzZSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgaWYgKG4gPD0gdnAuYm90dG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiB2cC5kb21Ub3AgKyAobiAtIHZwLnRvcCk7XG4gICAgICAgICAgICBiYXNlID0gdnAuYm90dG9tO1xuICAgICAgICAgICAgZG9tQmFzZSA9IHZwLmRvbUJvdHRvbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmcm9tRE9NKG4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGJhc2UgPSAwLCBkb21CYXNlID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZwID0gaSA8IHRoaXMudmlld3BvcnRzLmxlbmd0aCA/IHRoaXMudmlld3BvcnRzW2ldIDogbnVsbDtcbiAgICAgICAgICAgIGlmICghdnAgfHwgbiA8IHZwLmRvbVRvcClcbiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZSArIChuIC0gZG9tQmFzZSkgLyB0aGlzLnNjYWxlO1xuICAgICAgICAgICAgaWYgKG4gPD0gdnAuZG9tQm90dG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiB2cC50b3AgKyAobiAtIHZwLmRvbVRvcCk7XG4gICAgICAgICAgICBiYXNlID0gdnAuYm90dG9tO1xuICAgICAgICAgICAgZG9tQmFzZSA9IHZwLmRvbUJvdHRvbTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNjYWxlQmxvY2soYmxvY2ssIHNjYWxlcikge1xuICAgIGlmIChzY2FsZXIuc2NhbGUgPT0gMSlcbiAgICAgICAgcmV0dXJuIGJsb2NrO1xuICAgIGxldCBiVG9wID0gc2NhbGVyLnRvRE9NKGJsb2NrLnRvcCksIGJCb3R0b20gPSBzY2FsZXIudG9ET00oYmxvY2suYm90dG9tKTtcbiAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhibG9jay5mcm9tLCBibG9jay5sZW5ndGgsIGJUb3AsIGJCb3R0b20gLSBiVG9wLCBBcnJheS5pc0FycmF5KGJsb2NrLl9jb250ZW50KSA/IGJsb2NrLl9jb250ZW50Lm1hcChiID0+IHNjYWxlQmxvY2soYiwgc2NhbGVyKSkgOiBibG9jay5fY29udGVudCk7XG59XG5cbmNvbnN0IHRoZW1lID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IGNvbWJpbmU6IHN0cnMgPT4gc3Rycy5qb2luKFwiIFwiKSB9KTtcbmNvbnN0IGRhcmtUaGVtZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmluZGV4T2YodHJ1ZSkgPiAtMSB9KTtcbmNvbnN0IGJhc2VUaGVtZUlEID0gLypAX19QVVJFX18qL1N0eWxlTW9kdWxlLm5ld05hbWUoKSwgYmFzZUxpZ2h0SUQgPSAvKkBfX1BVUkVfXyovU3R5bGVNb2R1bGUubmV3TmFtZSgpLCBiYXNlRGFya0lEID0gLypAX19QVVJFX18qL1N0eWxlTW9kdWxlLm5ld05hbWUoKTtcbmNvbnN0IGxpZ2h0RGFya0lEcyA9IHsgXCImbGlnaHRcIjogXCIuXCIgKyBiYXNlTGlnaHRJRCwgXCImZGFya1wiOiBcIi5cIiArIGJhc2VEYXJrSUQgfTtcbmZ1bmN0aW9uIGJ1aWxkVGhlbWUobWFpbiwgc3BlYywgc2NvcGVzKSB7XG4gICAgcmV0dXJuIG5ldyBTdHlsZU1vZHVsZShzcGVjLCB7XG4gICAgICAgIGZpbmlzaChzZWwpIHtcbiAgICAgICAgICAgIHJldHVybiAvJi8udGVzdChzZWwpID8gc2VsLnJlcGxhY2UoLyZcXHcqLywgbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG0gPT0gXCImXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWluO1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGVzIHx8ICFzY29wZXNbbV0pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbnN1cHBvcnRlZCBzZWxlY3RvcjogJHttfWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBzY29wZXNbbV07XG4gICAgICAgICAgICB9KSA6IG1haW4gKyBcIiBcIiArIHNlbDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuY29uc3QgYmFzZVRoZW1lJDEgPSAvKkBfX1BVUkVfXyovYnVpbGRUaGVtZShcIi5cIiArIGJhc2VUaGVtZUlELCB7XG4gICAgXCImXCI6IHtcbiAgICAgICAgcG9zaXRpb246IFwicmVsYXRpdmUgIWltcG9ydGFudFwiLFxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBcIiYuY20tZm9jdXNlZFwiOiB7XG4gICAgICAgICAgICAvLyBQcm92aWRlIGEgc2ltcGxlIGRlZmF1bHQgb3V0bGluZSB0byBtYWtlIHN1cmUgYSBmb2N1c2VkXG4gICAgICAgICAgICAvLyBlZGl0b3IgaXMgdmlzdWFsbHkgZGlzdGluY3QuIENhbid0IGxlYXZlIHRoZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd2lsbCBhcHBseSB0byB0aGUgY29udGVudCBlbGVtZW50LCB3aGljaCBpc1xuICAgICAgICAgICAgLy8gaW5zaWRlIHRoZSBzY3JvbGxhYmxlIGNvbnRhaW5lciBhbmQgZG9lc24ndCBpbmNsdWRlIHRoZVxuICAgICAgICAgICAgLy8gZ3V0dGVycy4gV2UgYWxzbyBjYW4ndCB1c2UgYW4gJ2F1dG8nIG91dGxpbmUsIHNpbmNlIHRob3NlXG4gICAgICAgICAgICAvLyBhcmUsIGZvciBzb21lIHJlYXNvbiwgZHJhd24gYmVoaW5kIHRoZSBlbGVtZW50IGNvbnRlbnQsIHdoaWNoXG4gICAgICAgICAgICAvLyB3aWxsIGNhdXNlIHRoaW5ncyBsaWtlIHRoZSBhY3RpdmUgbGluZSBiYWNrZ3JvdW5kIHRvIGNvdmVyXG4gICAgICAgICAgICAvLyB0aGUgb3V0bGluZSAoIzI5NykuXG4gICAgICAgICAgICBvdXRsaW5lOiBcIjFweCBkb3R0ZWQgIzIxMjEyMVwiXG4gICAgICAgIH0sXG4gICAgICAgIGRpc3BsYXk6IFwiZmxleCAhaW1wb3J0YW50XCIsXG4gICAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCJcbiAgICB9LFxuICAgIFwiLmNtLXNjcm9sbGVyXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJmbGV4ICFpbXBvcnRhbnRcIixcbiAgICAgICAgYWxpZ25JdGVtczogXCJmbGV4LXN0YXJ0ICFpbXBvcnRhbnRcIixcbiAgICAgICAgZm9udEZhbWlseTogXCJtb25vc3BhY2VcIixcbiAgICAgICAgbGluZUhlaWdodDogMS40LFxuICAgICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICBvdmVyZmxvd1g6IFwiYXV0b1wiLFxuICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICB6SW5kZXg6IDBcbiAgICB9LFxuICAgIFwiLmNtLWNvbnRlbnRcIjoge1xuICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgIGZsZXhHcm93OiAyLFxuICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCIsXG4gICAgICAgIHdoaXRlU3BhY2U6IFwicHJlXCIsXG4gICAgICAgIHdvcmRXcmFwOiBcIm5vcm1hbFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9kZXYvaXNzdWVzLzQ1NlxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBtaW5IZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICBwYWRkaW5nOiBcIjRweCAwXCIsXG4gICAgICAgIG91dGxpbmU6IFwibm9uZVwiLFxuICAgICAgICBcIiZbY29udGVudGVkaXRhYmxlPXRydWVdXCI6IHtcbiAgICAgICAgICAgIFdlYmtpdFVzZXJNb2RpZnk6IFwicmVhZC13cml0ZS1wbGFpbnRleHQtb25seVwiLFxuICAgICAgICB9XG4gICAgfSxcbiAgICBcIi5jbS1saW5lV3JhcHBpbmdcIjoge1xuICAgICAgICB3aGl0ZVNwYWNlX2ZhbGxiYWNrOiBcInByZS13cmFwXCIsIC8vIEZvciBJRVxuICAgICAgICB3aGl0ZVNwYWNlOiBcImJyZWFrLXNwYWNlc1wiLFxuICAgICAgICB3b3JkQnJlYWs6IFwiYnJlYWstd29yZFwiLCAvLyBGb3IgU2FmYXJpLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmVcbiAgICAgICAgb3ZlcmZsb3dXcmFwOiBcImFueXdoZXJlXCIsXG4gICAgICAgIGZsZXhTaHJpbms6IDFcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1jb250ZW50XCI6IHsgY2FyZXRDb2xvcjogXCJibGFja1wiIH0sXG4gICAgXCImZGFyayAuY20tY29udGVudFwiOiB7IGNhcmV0Q29sb3I6IFwid2hpdGVcIiB9LFxuICAgIFwiLmNtLWxpbmVcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiMCAycHggMCA2cHhcIlxuICAgIH0sXG4gICAgXCIuY20tbGF5ZXJcIjoge1xuICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB0b3A6IDAsXG4gICAgICAgIGNvbnRhaW46IFwic2l6ZSBzdHlsZVwiLFxuICAgICAgICBcIiYgPiAqXCI6IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXNlbGVjdGlvbkJhY2tncm91bmRcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kOiBcIiNkOWQ5ZDlcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tc2VsZWN0aW9uQmFja2dyb3VuZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IFwiIzIyMlwiXG4gICAgfSxcbiAgICBcIiZsaWdodC5jbS1mb2N1c2VkID4gLmNtLXNjcm9sbGVyID4gLmNtLXNlbGVjdGlvbkxheWVyIC5jbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCIjZDdkNGYwXCJcbiAgICB9LFxuICAgIFwiJmRhcmsuY20tZm9jdXNlZCA+IC5jbS1zY3JvbGxlciA+IC5jbS1zZWxlY3Rpb25MYXllciAuY20tc2VsZWN0aW9uQmFja2dyb3VuZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IFwiIzIzM1wiXG4gICAgfSxcbiAgICBcIi5jbS1jdXJzb3JMYXllclwiOiB7XG4gICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiXG4gICAgfSxcbiAgICBcIiYuY20tZm9jdXNlZCA+IC5jbS1zY3JvbGxlciA+IC5jbS1jdXJzb3JMYXllclwiOiB7XG4gICAgICAgIGFuaW1hdGlvbjogXCJzdGVwcygxKSBjbS1ibGluayAxLjJzIGluZmluaXRlXCJcbiAgICB9LFxuICAgIC8vIFR3byBhbmltYXRpb25zIGRlZmluZWQgc28gdGhhdCB3ZSBjYW4gc3dpdGNoIGJldHdlZW4gdGhlbSB0b1xuICAgIC8vIHJlc3RhcnQgdGhlIGFuaW1hdGlvbiB3aXRob3V0IGZvcmNpbmcgYW5vdGhlciBzdHlsZVxuICAgIC8vIHJlY29tcHV0YXRpb24uXG4gICAgXCJAa2V5ZnJhbWVzIGNtLWJsaW5rXCI6IHsgXCIwJVwiOiB7fSwgXCI1MCVcIjogeyBvcGFjaXR5OiAwIH0sIFwiMTAwJVwiOiB7fSB9LFxuICAgIFwiQGtleWZyYW1lcyBjbS1ibGluazJcIjogeyBcIjAlXCI6IHt9LCBcIjUwJVwiOiB7IG9wYWNpdHk6IDAgfSwgXCIxMDAlXCI6IHt9IH0sXG4gICAgXCIuY20tY3Vyc29yLCAuY20tZHJvcEN1cnNvclwiOiB7XG4gICAgICAgIGJvcmRlckxlZnQ6IFwiMS4ycHggc29saWQgYmxhY2tcIixcbiAgICAgICAgbWFyZ2luTGVmdDogXCItMC42cHhcIixcbiAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIi5jbS1jdXJzb3JcIjoge1xuICAgICAgICBkaXNwbGF5OiBcIm5vbmVcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tY3Vyc29yXCI6IHtcbiAgICAgICAgYm9yZGVyTGVmdENvbG9yOiBcIiM0NDRcIlxuICAgIH0sXG4gICAgXCIuY20tZHJvcEN1cnNvclwiOiB7XG4gICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCJcbiAgICB9LFxuICAgIFwiJi5jbS1mb2N1c2VkID4gLmNtLXNjcm9sbGVyID4gLmNtLWN1cnNvckxheWVyIC5jbS1jdXJzb3JcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCJcbiAgICB9LFxuICAgIFwiLmNtLWlzb1wiOiB7XG4gICAgICAgIHVuaWNvZGVCaWRpOiBcImlzb2xhdGVcIlxuICAgIH0sXG4gICAgXCIuY20tYW5ub3VuY2VkXCI6IHtcbiAgICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgICAgdG9wOiBcIi0xMDAwMHB4XCJcbiAgICB9LFxuICAgIFwiQG1lZGlhIHByaW50XCI6IHtcbiAgICAgICAgXCIuY20tYW5ub3VuY2VkXCI6IHsgZGlzcGxheTogXCJub25lXCIgfVxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWFjdGl2ZUxpbmVcIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwiI2NjZWVmZjQ0XCIgfSxcbiAgICBcIiZkYXJrIC5jbS1hY3RpdmVMaW5lXCI6IHsgYmFja2dyb3VuZENvbG9yOiBcIiM5OWVlZmYzM1wiIH0sXG4gICAgXCImbGlnaHQgLmNtLXNwZWNpYWxDaGFyXCI6IHsgY29sb3I6IFwicmVkXCIgfSxcbiAgICBcIiZkYXJrIC5jbS1zcGVjaWFsQ2hhclwiOiB7IGNvbG9yOiBcIiNmNzhcIiB9LFxuICAgIFwiLmNtLWd1dHRlcnNcIjoge1xuICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogMCxcbiAgICAgICAgekluZGV4OiAyMDBcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1ndXR0ZXJzXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmNWY1ZjVcIixcbiAgICAgICAgY29sb3I6IFwiIzZjNmM2Y1wiLFxuICAgICAgICBib3JkZXJSaWdodDogXCIxcHggc29saWQgI2RkZFwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1ndXR0ZXJzXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiMzMzMzMzhcIixcbiAgICAgICAgY29sb3I6IFwiI2NjY1wiXG4gICAgfSxcbiAgICBcIi5jbS1ndXR0ZXJcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImZsZXggIWltcG9ydGFudFwiLCAvLyBOZWNlc3NhcnkgLS0gcHJldmVudHMgbWFyZ2luIGNvbGxhcHNpbmdcbiAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgICAgZmxleFNocmluazogMCxcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgICAgbWluSGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcbiAgICB9LFxuICAgIFwiLmNtLWd1dHRlckVsZW1lbnRcIjoge1xuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiXG4gICAgfSxcbiAgICBcIi5jbS1saW5lTnVtYmVycyAuY20tZ3V0dGVyRWxlbWVudFwiOiB7XG4gICAgICAgIHBhZGRpbmc6IFwiMCAzcHggMCA1cHhcIixcbiAgICAgICAgbWluV2lkdGg6IFwiMjBweFwiLFxuICAgICAgICB0ZXh0QWxpZ246IFwicmlnaHRcIixcbiAgICAgICAgd2hpdGVTcGFjZTogXCJub3dyYXBcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWFjdGl2ZUxpbmVHdXR0ZXJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2UyZjJmZlwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1hY3RpdmVMaW5lR3V0dGVyXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiMyMjIyMjdcIlxuICAgIH0sXG4gICAgXCIuY20tcGFuZWxzXCI6IHtcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgICAgcG9zaXRpb246IFwic3RpY2t5XCIsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHJpZ2h0OiAwXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tcGFuZWxzXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmNWY1ZjVcIixcbiAgICAgICAgY29sb3I6IFwiYmxhY2tcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXBhbmVscy10b3BcIjoge1xuICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkICNkZGRcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXBhbmVscy1ib3R0b21cIjoge1xuICAgICAgICBib3JkZXJUb3A6IFwiMXB4IHNvbGlkICNkZGRcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tcGFuZWxzXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiMzMzMzMzhcIixcbiAgICAgICAgY29sb3I6IFwid2hpdGVcIlxuICAgIH0sXG4gICAgXCIuY20tdGFiXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwiYm90dG9tXCJcbiAgICB9LFxuICAgIFwiLmNtLXdpZGdldEJ1ZmZlclwiOiB7XG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwidGV4dC10b3BcIixcbiAgICAgICAgaGVpZ2h0OiBcIjFlbVwiLFxuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIlxuICAgIH0sXG4gICAgXCIuY20tcGxhY2Vob2xkZXJcIjoge1xuICAgICAgICBjb2xvcjogXCIjODg4XCIsXG4gICAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwidG9wXCIsXG4gICAgfSxcbiAgICBcIi5jbS1oaWdobGlnaHRTcGFjZTpiZWZvcmVcIjoge1xuICAgICAgICBjb250ZW50OiBcImF0dHIoZGF0YS1kaXNwbGF5KVwiLFxuICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIixcbiAgICAgICAgY29sb3I6IFwiIzg4OFwiXG4gICAgfSxcbiAgICBcIi5jbS1oaWdobGlnaHRUYWJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IGB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwMFwiIGhlaWdodD1cIjIwXCI+PHBhdGggc3Ryb2tlPVwiJTIzODg4XCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZD1cIk0xIDEwSDE5NkwxOTAgNU0xOTAgMTVMMTk2IDEwTTE5NyA0TDE5NyAxNlwiLz48L3N2Zz4nKWAsXG4gICAgICAgIGJhY2tncm91bmRTaXplOiBcImF1dG8gMTAwJVwiLFxuICAgICAgICBiYWNrZ3JvdW5kUG9zaXRpb246IFwicmlnaHQgOTAlXCIsXG4gICAgICAgIGJhY2tncm91bmRSZXBlYXQ6IFwibm8tcmVwZWF0XCJcbiAgICB9LFxuICAgIFwiLmNtLXRyYWlsaW5nU3BhY2VcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2ZmMzMyMjU1XCJcbiAgICB9LFxuICAgIFwiLmNtLWJ1dHRvblwiOiB7XG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwibWlkZGxlXCIsXG4gICAgICAgIGNvbG9yOiBcImluaGVyaXRcIixcbiAgICAgICAgZm9udFNpemU6IFwiNzAlXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiLjJlbSAxZW1cIixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjFweFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tYnV0dG9uXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudCgjZWZmMWY1LCAjZDlkOWRmKVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICM4ODhcIixcbiAgICAgICAgXCImOmFjdGl2ZVwiOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwibGluZWFyLWdyYWRpZW50KCNiNGI0YjQsICNkMGQzZDYpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCImZGFyayAuY20tYnV0dG9uXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudCgjMzkzOTM5LCAjMTExKVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICM4ODhcIixcbiAgICAgICAgXCImOmFjdGl2ZVwiOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwibGluZWFyLWdyYWRpZW50KCMxMTEsICMzMzMpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXCIuY20tdGV4dGZpZWxkXCI6IHtcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJtaWRkbGVcIixcbiAgICAgICAgY29sb3I6IFwiaW5oZXJpdFwiLFxuICAgICAgICBmb250U2l6ZTogXCI3MCVcIixcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCBzaWx2ZXJcIixcbiAgICAgICAgcGFkZGluZzogXCIuMmVtIC41ZW1cIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXRleHRmaWVsZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ3aGl0ZVwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS10ZXh0ZmllbGRcIjoge1xuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICM1NTVcIixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcImluaGVyaXRcIlxuICAgIH1cbn0sIGxpZ2h0RGFya0lEcyk7XG5cbmNvbnN0IExpbmVCcmVha1BsYWNlaG9sZGVyID0gXCJcXHVmZmZmXCI7XG5jbGFzcyBET01SZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvaW50cywgc3RhdGUpIHtcbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG4gICAgICAgIHRoaXMudGV4dCA9IFwiXCI7XG4gICAgICAgIHRoaXMubGluZVNlcGFyYXRvciA9IHN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IpO1xuICAgIH1cbiAgICBhcHBlbmQodGV4dCkge1xuICAgICAgICB0aGlzLnRleHQgKz0gdGV4dDtcbiAgICB9XG4gICAgbGluZUJyZWFrKCkge1xuICAgICAgICB0aGlzLnRleHQgKz0gTGluZUJyZWFrUGxhY2Vob2xkZXI7XG4gICAgfVxuICAgIHJlYWRSYW5nZShzdGFydCwgZW5kKSB7XG4gICAgICAgIGlmICghc3RhcnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IHBhcmVudCA9IHN0YXJ0LnBhcmVudE5vZGU7XG4gICAgICAgIGZvciAobGV0IGN1ciA9IHN0YXJ0OzspIHtcbiAgICAgICAgICAgIHRoaXMuZmluZFBvaW50QmVmb3JlKHBhcmVudCwgY3VyKTtcbiAgICAgICAgICAgIGxldCBvbGRMZW4gPSB0aGlzLnRleHQubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5yZWFkTm9kZShjdXIpO1xuICAgICAgICAgICAgbGV0IG5leHQgPSBjdXIubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAobmV4dCA9PSBlbmQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChjdXIpLCBuZXh0VmlldyA9IENvbnRlbnRWaWV3LmdldChuZXh0KTtcbiAgICAgICAgICAgIGlmICh2aWV3ICYmIG5leHRWaWV3ID8gdmlldy5icmVha0FmdGVyIDpcbiAgICAgICAgICAgICAgICAodmlldyA/IHZpZXcuYnJlYWtBZnRlciA6IGlzQmxvY2tFbGVtZW50KGN1cikpIHx8XG4gICAgICAgICAgICAgICAgICAgIChpc0Jsb2NrRWxlbWVudChuZXh0KSAmJiAoY3VyLm5vZGVOYW1lICE9IFwiQlJcIiB8fCBjdXIuY21JZ25vcmUpICYmIHRoaXMudGV4dC5sZW5ndGggPiBvbGRMZW4pKVxuICAgICAgICAgICAgICAgIHRoaXMubGluZUJyZWFrKCk7XG4gICAgICAgICAgICBjdXIgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluZFBvaW50QmVmb3JlKHBhcmVudCwgZW5kKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJlYWRUZXh0Tm9kZShub2RlKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gbm9kZS5ub2RlVmFsdWU7XG4gICAgICAgIGZvciAobGV0IHBvaW50IG9mIHRoaXMucG9pbnRzKVxuICAgICAgICAgICAgaWYgKHBvaW50Lm5vZGUgPT0gbm9kZSlcbiAgICAgICAgICAgICAgICBwb2ludC5wb3MgPSB0aGlzLnRleHQubGVuZ3RoICsgTWF0aC5taW4ocG9pbnQub2Zmc2V0LCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IG9mZiA9IDAsIHJlID0gdGhpcy5saW5lU2VwYXJhdG9yID8gbnVsbCA6IC9cXHJcXG4/fFxcbi9nOzspIHtcbiAgICAgICAgICAgIGxldCBuZXh0QnJlYWsgPSAtMSwgYnJlYWtTaXplID0gMSwgbTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBuZXh0QnJlYWsgPSB0ZXh0LmluZGV4T2YodGhpcy5saW5lU2VwYXJhdG9yLCBvZmYpO1xuICAgICAgICAgICAgICAgIGJyZWFrU2l6ZSA9IHRoaXMubGluZVNlcGFyYXRvci5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtID0gcmUuZXhlYyh0ZXh0KSkge1xuICAgICAgICAgICAgICAgIG5leHRCcmVhayA9IG0uaW5kZXg7XG4gICAgICAgICAgICAgICAgYnJlYWtTaXplID0gbVswXS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCh0ZXh0LnNsaWNlKG9mZiwgbmV4dEJyZWFrIDwgMCA/IHRleHQubGVuZ3RoIDogbmV4dEJyZWFrKSk7XG4gICAgICAgICAgICBpZiAobmV4dEJyZWFrIDwgMClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHRoaXMubGluZUJyZWFrKCk7XG4gICAgICAgICAgICBpZiAoYnJlYWtTaXplID4gMSlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwb2ludCBvZiB0aGlzLnBvaW50cylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50Lm5vZGUgPT0gbm9kZSAmJiBwb2ludC5wb3MgPiB0aGlzLnRleHQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQucG9zIC09IGJyZWFrU2l6ZSAtIDE7XG4gICAgICAgICAgICBvZmYgPSBuZXh0QnJlYWsgKyBicmVha1NpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVhZE5vZGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5jbUlnbm9yZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHZpZXcgPSBDb250ZW50Vmlldy5nZXQobm9kZSk7XG4gICAgICAgIGxldCBmcm9tVmlldyA9IHZpZXcgJiYgdmlldy5vdmVycmlkZURPTVRleHQ7XG4gICAgICAgIGlmIChmcm9tVmlldyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRQb2ludEluc2lkZShub2RlLCBmcm9tVmlldy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGZyb21WaWV3Lml0ZXIoKTsgIWkubmV4dCgpLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgaWYgKGkubGluZUJyZWFrKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVCcmVhaygpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoaS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRUZXh0Tm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVOYW1lID09IFwiQlJcIikge1xuICAgICAgICAgICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZFJhbmdlKG5vZGUuZmlyc3RDaGlsZCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluZFBvaW50QmVmb3JlKG5vZGUsIG5leHQpIHtcbiAgICAgICAgZm9yIChsZXQgcG9pbnQgb2YgdGhpcy5wb2ludHMpXG4gICAgICAgICAgICBpZiAocG9pbnQubm9kZSA9PSBub2RlICYmIG5vZGUuY2hpbGROb2Rlc1twb2ludC5vZmZzZXRdID09IG5leHQpXG4gICAgICAgICAgICAgICAgcG9pbnQucG9zID0gdGhpcy50ZXh0Lmxlbmd0aDtcbiAgICB9XG4gICAgZmluZFBvaW50SW5zaWRlKG5vZGUsIGxlbmd0aCkge1xuICAgICAgICBmb3IgKGxldCBwb2ludCBvZiB0aGlzLnBvaW50cylcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgPyBwb2ludC5ub2RlID09IG5vZGUgOiBub2RlLmNvbnRhaW5zKHBvaW50Lm5vZGUpKVxuICAgICAgICAgICAgICAgIHBvaW50LnBvcyA9IHRoaXMudGV4dC5sZW5ndGggKyAoaXNBdEVuZChub2RlLCBwb2ludC5ub2RlLCBwb2ludC5vZmZzZXQpID8gbGVuZ3RoIDogMCk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNBdEVuZChwYXJlbnQsIG5vZGUsIG9mZnNldCkge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKCFub2RlIHx8IG9mZnNldCA8IG1heE9mZnNldChub2RlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKG5vZGUgPT0gcGFyZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIG9mZnNldCA9IGRvbUluZGV4KG5vZGUpICsgMTtcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0Jsb2NrRWxlbWVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gMSAmJiAvXihESVZ8UHxMSXxVTHxPTHxCTE9DS1FVT1RFfEREfERUfEhcXGR8U0VDVElPTnxQUkUpJC8udGVzdChub2RlLm5vZGVOYW1lKTtcbn1cbmNsYXNzIERPTVBvaW50IHtcbiAgICBjb25zdHJ1Y3Rvcihub2RlLCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMucG9zID0gLTE7XG4gICAgfVxufVxuXG5jbGFzcyBET01DaGFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIHN0YXJ0LCBlbmQsIHR5cGVPdmVyKSB7XG4gICAgICAgIHRoaXMudHlwZU92ZXIgPSB0eXBlT3ZlcjtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBudWxsO1xuICAgICAgICB0aGlzLnRleHQgPSBcIlwiO1xuICAgICAgICBsZXQgeyBpbXByZWNpc2VIZWFkOiBpSGVhZCwgaW1wcmVjaXNlQW5jaG9yOiBpQW5jaG9yIH0gPSB2aWV3LmRvY1ZpZXc7XG4gICAgICAgIGlmICh2aWV3LnN0YXRlLnJlYWRPbmx5ICYmIHN0YXJ0ID4gLTEpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBjaGFuZ2VzIHdoZW4gdGhlIGVkaXRvciBpcyByZWFkLW9ubHlcbiAgICAgICAgICAgIHRoaXMubmV3U2VsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGFydCA+IC0xICYmICh0aGlzLmJvdW5kcyA9IHZpZXcuZG9jVmlldy5kb21Cb3VuZHNBcm91bmQoc3RhcnQsIGVuZCwgMCkpKSB7XG4gICAgICAgICAgICBsZXQgc2VsUG9pbnRzID0gaUhlYWQgfHwgaUFuY2hvciA/IFtdIDogc2VsZWN0aW9uUG9pbnRzKHZpZXcpO1xuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBET01SZWFkZXIoc2VsUG9pbnRzLCB2aWV3LnN0YXRlKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkUmFuZ2UodGhpcy5ib3VuZHMuc3RhcnRET00sIHRoaXMuYm91bmRzLmVuZERPTSk7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSByZWFkZXIudGV4dDtcbiAgICAgICAgICAgIHRoaXMubmV3U2VsID0gc2VsZWN0aW9uRnJvbVBvaW50cyhzZWxQb2ludHMsIHRoaXMuYm91bmRzLmZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRvbVNlbCA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgICAgICBsZXQgaGVhZCA9IGlIZWFkICYmIGlIZWFkLm5vZGUgPT0gZG9tU2VsLmZvY3VzTm9kZSAmJiBpSGVhZC5vZmZzZXQgPT0gZG9tU2VsLmZvY3VzT2Zmc2V0IHx8XG4gICAgICAgICAgICAgICAgIWNvbnRhaW5zKHZpZXcuY29udGVudERPTSwgZG9tU2VsLmZvY3VzTm9kZSlcbiAgICAgICAgICAgICAgICA/IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZFxuICAgICAgICAgICAgICAgIDogdmlldy5kb2NWaWV3LnBvc0Zyb21ET00oZG9tU2VsLmZvY3VzTm9kZSwgZG9tU2VsLmZvY3VzT2Zmc2V0KTtcbiAgICAgICAgICAgIGxldCBhbmNob3IgPSBpQW5jaG9yICYmIGlBbmNob3Iubm9kZSA9PSBkb21TZWwuYW5jaG9yTm9kZSAmJiBpQW5jaG9yLm9mZnNldCA9PSBkb21TZWwuYW5jaG9yT2Zmc2V0IHx8XG4gICAgICAgICAgICAgICAgIWNvbnRhaW5zKHZpZXcuY29udGVudERPTSwgZG9tU2VsLmFuY2hvck5vZGUpXG4gICAgICAgICAgICAgICAgPyB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmFuY2hvclxuICAgICAgICAgICAgICAgIDogdmlldy5kb2NWaWV3LnBvc0Zyb21ET00oZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpO1xuICAgICAgICAgICAgLy8gaU9TIHdpbGwgcmVmdXNlIHRvIHNlbGVjdCB0aGUgYmxvY2sgZ2FwcyB3aGVuIGRvaW5nIHNlbGVjdC1hbGxcbiAgICAgICAgICAgIGxldCB2cCA9IHZpZXcudmlld3BvcnQ7XG4gICAgICAgICAgICBpZiAoYnJvd3Nlci5pb3MgJiYgdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5lbXB0eSAmJiBoZWFkICE9IGFuY2hvciAmJlxuICAgICAgICAgICAgICAgICh2cC5mcm9tID4gMCB8fCB2cC50byA8IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgb2ZmRnJvbSA9IHZwLmZyb20gLSBNYXRoLm1pbihoZWFkLCBhbmNob3IpLCBvZmZUbyA9IHZwLnRvIC0gTWF0aC5tYXgoaGVhZCwgYW5jaG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoKG9mZkZyb20gPT0gMCB8fCBvZmZGcm9tID09IDEpICYmIChvZmZUbyA9PSAwIHx8IG9mZlRvID09IC0xKSkge1xuICAgICAgICAgICAgICAgICAgICBoZWFkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gdmlldy5zdGF0ZS5kb2MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3U2VsID0gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZShhbmNob3IsIGhlYWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwbHlET01DaGFuZ2UodmlldywgZG9tQ2hhbmdlKSB7XG4gICAgbGV0IGNoYW5nZTtcbiAgICBsZXQgeyBuZXdTZWwgfSA9IGRvbUNoYW5nZSwgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICBsZXQgbGFzdEtleSA9IHZpZXcuaW5wdXRTdGF0ZS5sYXN0S2V5VGltZSA+IERhdGUubm93KCkgLSAxMDAgPyB2aWV3LmlucHV0U3RhdGUubGFzdEtleUNvZGUgOiAtMTtcbiAgICBpZiAoZG9tQ2hhbmdlLmJvdW5kcykge1xuICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gZG9tQ2hhbmdlLmJvdW5kcztcbiAgICAgICAgbGV0IHByZWZlcnJlZFBvcyA9IHNlbC5mcm9tLCBwcmVmZXJyZWRTaWRlID0gbnVsbDtcbiAgICAgICAgLy8gUHJlZmVyIGFuY2hvcmluZyB0byBlbmQgd2hlbiBCYWNrc3BhY2UgaXMgcHJlc3NlZCAob3IsIG9uXG4gICAgICAgIC8vIEFuZHJvaWQsIHdoZW4gc29tZXRoaW5nIHdhcyBkZWxldGVkKVxuICAgICAgICBpZiAobGFzdEtleSA9PT0gOCB8fCBicm93c2VyLmFuZHJvaWQgJiYgZG9tQ2hhbmdlLnRleHQubGVuZ3RoIDwgdG8gLSBmcm9tKSB7XG4gICAgICAgICAgICBwcmVmZXJyZWRQb3MgPSBzZWwudG87XG4gICAgICAgICAgICBwcmVmZXJyZWRTaWRlID0gXCJlbmRcIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGlmZiA9IGZpbmREaWZmKHZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvLCBMaW5lQnJlYWtQbGFjZWhvbGRlciksIGRvbUNoYW5nZS50ZXh0LCBwcmVmZXJyZWRQb3MgLSBmcm9tLCBwcmVmZXJyZWRTaWRlKTtcbiAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgIC8vIENocm9tZSBpbnNlcnRzIHR3byBuZXdsaW5lcyB3aGVuIHByZXNzaW5nIHNoaWZ0LWVudGVyIGF0IHRoZVxuICAgICAgICAgICAgLy8gZW5kIG9mIGEgbGluZS4gRG9tQ2hhbmdlIGRyb3BzIG9uZSBvZiB0aG9zZS5cbiAgICAgICAgICAgIGlmIChicm93c2VyLmNocm9tZSAmJiBsYXN0S2V5ID09IDEzICYmXG4gICAgICAgICAgICAgICAgZGlmZi50b0IgPT0gZGlmZi5mcm9tICsgMiAmJiBkb21DaGFuZ2UudGV4dC5zbGljZShkaWZmLmZyb20sIGRpZmYudG9CKSA9PSBMaW5lQnJlYWtQbGFjZWhvbGRlciArIExpbmVCcmVha1BsYWNlaG9sZGVyKVxuICAgICAgICAgICAgICAgIGRpZmYudG9CLS07XG4gICAgICAgICAgICBjaGFuZ2UgPSB7IGZyb206IGZyb20gKyBkaWZmLmZyb20sIHRvOiBmcm9tICsgZGlmZi50b0EsXG4gICAgICAgICAgICAgICAgaW5zZXJ0OiBUZXh0Lm9mKGRvbUNoYW5nZS50ZXh0LnNsaWNlKGRpZmYuZnJvbSwgZGlmZi50b0IpLnNwbGl0KExpbmVCcmVha1BsYWNlaG9sZGVyKSkgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChuZXdTZWwgJiYgKCF2aWV3Lmhhc0ZvY3VzICYmIHZpZXcuc3RhdGUuZmFjZXQoZWRpdGFibGUpIHx8IG5ld1NlbC5tYWluLmVxKHNlbCkpKSB7XG4gICAgICAgIG5ld1NlbCA9IG51bGw7XG4gICAgfVxuICAgIGlmICghY2hhbmdlICYmICFuZXdTZWwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWNoYW5nZSAmJiBkb21DaGFuZ2UudHlwZU92ZXIgJiYgIXNlbC5lbXB0eSAmJiBuZXdTZWwgJiYgbmV3U2VsLm1haW4uZW1wdHkpIHtcbiAgICAgICAgLy8gSGV1cmlzdGljIHRvIG5vdGljZSB0eXBpbmcgb3ZlciBhIHNlbGVjdGVkIGNoYXJhY3RlclxuICAgICAgICBjaGFuZ2UgPSB7IGZyb206IHNlbC5mcm9tLCB0bzogc2VsLnRvLCBpbnNlcnQ6IHZpZXcuc3RhdGUuZG9jLnNsaWNlKHNlbC5mcm9tLCBzZWwudG8pIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGNoYW5nZSAmJiBjaGFuZ2UuZnJvbSA+PSBzZWwuZnJvbSAmJiBjaGFuZ2UudG8gPD0gc2VsLnRvICYmXG4gICAgICAgIChjaGFuZ2UuZnJvbSAhPSBzZWwuZnJvbSB8fCBjaGFuZ2UudG8gIT0gc2VsLnRvKSAmJlxuICAgICAgICAoc2VsLnRvIC0gc2VsLmZyb20pIC0gKGNoYW5nZS50byAtIGNoYW5nZS5mcm9tKSA8PSA0KSB7XG4gICAgICAgIC8vIElmIHRoZSBjaGFuZ2UgaXMgaW5zaWRlIHRoZSBzZWxlY3Rpb24gYW5kIGNvdmVycyBtb3N0IG9mIGl0LFxuICAgICAgICAvLyBhc3N1bWUgaXQgaXMgYSBzZWxlY3Rpb24gcmVwbGFjZSAod2l0aCBpZGVudGljYWwgY2hhcmFjdGVycyBhdFxuICAgICAgICAvLyB0aGUgc3RhcnQvZW5kIG5vdCBpbmNsdWRlZCBpbiB0aGUgZGlmZilcbiAgICAgICAgY2hhbmdlID0ge1xuICAgICAgICAgICAgZnJvbTogc2VsLmZyb20sIHRvOiBzZWwudG8sXG4gICAgICAgICAgICBpbnNlcnQ6IHZpZXcuc3RhdGUuZG9jLnNsaWNlKHNlbC5mcm9tLCBjaGFuZ2UuZnJvbSkuYXBwZW5kKGNoYW5nZS5pbnNlcnQpLmFwcGVuZCh2aWV3LnN0YXRlLmRvYy5zbGljZShjaGFuZ2UudG8sIHNlbC50bykpXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKChicm93c2VyLm1hYyB8fCBicm93c2VyLmFuZHJvaWQpICYmIGNoYW5nZSAmJiBjaGFuZ2UuZnJvbSA9PSBjaGFuZ2UudG8gJiYgY2hhbmdlLmZyb20gPT0gc2VsLmhlYWQgLSAxICYmXG4gICAgICAgIC9eXFwuID8kLy50ZXN0KGNoYW5nZS5pbnNlcnQudG9TdHJpbmcoKSkgJiYgdmlldy5jb250ZW50RE9NLmdldEF0dHJpYnV0ZShcImF1dG9jb3JyZWN0XCIpID09IFwib2ZmXCIpIHtcbiAgICAgICAgLy8gRGV0ZWN0IGluc2VydC1wZXJpb2Qtb24tZG91YmxlLXNwYWNlIE1hYyBhbmQgQW5kcm9pZCBiZWhhdmlvcixcbiAgICAgICAgLy8gYW5kIHRyYW5zZm9ybSBpdCBpbnRvIGEgcmVndWxhciBzcGFjZSBpbnNlcnQuXG4gICAgICAgIGlmIChuZXdTZWwgJiYgY2hhbmdlLmluc2VydC5sZW5ndGggPT0gMilcbiAgICAgICAgICAgIG5ld1NlbCA9IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUobmV3U2VsLm1haW4uYW5jaG9yIC0gMSwgbmV3U2VsLm1haW4uaGVhZCAtIDEpO1xuICAgICAgICBjaGFuZ2UgPSB7IGZyb206IHNlbC5mcm9tLCB0bzogc2VsLnRvLCBpbnNlcnQ6IFRleHQub2YoW1wiIFwiXSkgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnJvd3Nlci5jaHJvbWUgJiYgY2hhbmdlICYmIGNoYW5nZS5mcm9tID09IGNoYW5nZS50byAmJiBjaGFuZ2UuZnJvbSA9PSBzZWwuaGVhZCAmJlxuICAgICAgICBjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCkgPT0gXCJcXG4gXCIgJiYgdmlldy5saW5lV3JhcHBpbmcpIHtcbiAgICAgICAgLy8gSW4gQ2hyb21lLCBpZiB5b3UgaW5zZXJ0IGEgc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIGEgd3JhcHBlZFxuICAgICAgICAvLyBsaW5lLCBpdCB3aWxsIGFjdHVhbGx5IGluc2VydCBhIG5ld2xpbmUgYW5kIGEgc3BhY2UsIGNhdXNpbmcgYVxuICAgICAgICAvLyBib2d1cyBuZXcgbGluZSB0byBiZSBjcmVhdGVkIGluIENvZGVNaXJyb3IgKCM5NjgpXG4gICAgICAgIGlmIChuZXdTZWwpXG4gICAgICAgICAgICBuZXdTZWwgPSBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKG5ld1NlbC5tYWluLmFuY2hvciAtIDEsIG5ld1NlbC5tYWluLmhlYWQgLSAxKTtcbiAgICAgICAgY2hhbmdlID0geyBmcm9tOiBzZWwuZnJvbSwgdG86IHNlbC50bywgaW5zZXJ0OiBUZXh0Lm9mKFtcIiBcIl0pIH07XG4gICAgfVxuICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgICAgaWYgKGJyb3dzZXIuaW9zICYmIHZpZXcuaW5wdXRTdGF0ZS5mbHVzaElPU0tleSgpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIEFuZHJvaWQgYnJvd3NlcnMgZG9uJ3QgZmlyZSByZWFzb25hYmxlIGtleSBldmVudHMgZm9yIGVudGVyLFxuICAgICAgICAvLyBiYWNrc3BhY2UsIG9yIGRlbGV0ZS4gU28gdGhpcyBkZXRlY3RzIGNoYW5nZXMgdGhhdCBsb29rIGxpa2VcbiAgICAgICAgLy8gdGhleSdyZSBjYXVzZWQgYnkgdGhvc2Uga2V5cywgYW5kIHJlaW50ZXJwcmV0cyB0aGVtIGFzIGtleVxuICAgICAgICAvLyBldmVudHMuIChTb21lIG9mIHRoZXNlIGtleXMgYXJlIGFsc28gaGFuZGxlZCBieSBiZWZvcmVpbnB1dFxuICAgICAgICAvLyBldmVudHMgYW5kIHRoZSBwZW5kaW5nQW5kcm9pZEtleSBtZWNoYW5pc20sIGJ1dCB0aGF0J3Mgbm90XG4gICAgICAgIC8vIHJlbGlhYmxlIGluIGFsbCBzaXR1YXRpb25zLilcbiAgICAgICAgaWYgKGJyb3dzZXIuYW5kcm9pZCAmJlxuICAgICAgICAgICAgKChjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAmJiBjaGFuZ2UudG8gPT0gc2VsLnRvICYmXG4gICAgICAgICAgICAgICAgY2hhbmdlLmluc2VydC5sZW5ndGggPT0gMSAmJiBjaGFuZ2UuaW5zZXJ0LmxpbmVzID09IDIgJiZcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh2aWV3LmNvbnRlbnRET00sIFwiRW50ZXJcIiwgMTMpKSB8fFxuICAgICAgICAgICAgICAgICgoY2hhbmdlLmZyb20gPT0gc2VsLmZyb20gLSAxICYmIGNoYW5nZS50byA9PSBzZWwudG8gJiYgY2hhbmdlLmluc2VydC5sZW5ndGggPT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICBsYXN0S2V5ID09IDggJiYgY2hhbmdlLmluc2VydC5sZW5ndGggPCBjaGFuZ2UudG8gLSBjaGFuZ2UuZnJvbSAmJiBjaGFuZ2UudG8gPiBzZWwuaGVhZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hLZXkodmlldy5jb250ZW50RE9NLCBcIkJhY2tzcGFjZVwiLCA4KSkgfHxcbiAgICAgICAgICAgICAgICAoY2hhbmdlLmZyb20gPT0gc2VsLmZyb20gJiYgY2hhbmdlLnRvID09IHNlbC50byArIDEgJiYgY2hhbmdlLmluc2VydC5sZW5ndGggPT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh2aWV3LmNvbnRlbnRET00sIFwiRGVsZXRlXCIsIDQ2KSkpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCB0ZXh0ID0gY2hhbmdlLmluc2VydC50b1N0cmluZygpO1xuICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwKVxuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZysrO1xuICAgICAgICBsZXQgZGVmYXVsdFRyO1xuICAgICAgICBsZXQgZGVmYXVsdEluc2VydCA9ICgpID0+IGRlZmF1bHRUciB8fCAoZGVmYXVsdFRyID0gYXBwbHlEZWZhdWx0SW5zZXJ0KHZpZXcsIGNoYW5nZSwgbmV3U2VsKSk7XG4gICAgICAgIGlmICghdmlldy5zdGF0ZS5mYWNldChpbnB1dEhhbmRsZXIpLnNvbWUoaCA9PiBoKHZpZXcsIGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8sIHRleHQsIGRlZmF1bHRJbnNlcnQpKSlcbiAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goZGVmYXVsdEluc2VydCgpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5ld1NlbCAmJiAhbmV3U2VsLm1haW4uZXEoc2VsKSkge1xuICAgICAgICBsZXQgc2Nyb2xsSW50b1ZpZXcgPSBmYWxzZSwgdXNlckV2ZW50ID0gXCJzZWxlY3RcIjtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2VsZWN0aW9uVGltZSA+IERhdGUubm93KCkgLSA1MCkge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2VsZWN0aW9uT3JpZ2luID09IFwic2VsZWN0XCIpXG4gICAgICAgICAgICAgICAgc2Nyb2xsSW50b1ZpZXcgPSB0cnVlO1xuICAgICAgICAgICAgdXNlckV2ZW50ID0gdmlldy5pbnB1dFN0YXRlLmxhc3RTZWxlY3Rpb25PcmlnaW47XG4gICAgICAgIH1cbiAgICAgICAgdmlldy5kaXNwYXRjaCh7IHNlbGVjdGlvbjogbmV3U2VsLCBzY3JvbGxJbnRvVmlldywgdXNlckV2ZW50IH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBhcHBseURlZmF1bHRJbnNlcnQodmlldywgY2hhbmdlLCBuZXdTZWwpIHtcbiAgICBsZXQgdHIsIHN0YXJ0U3RhdGUgPSB2aWV3LnN0YXRlLCBzZWwgPSBzdGFydFN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgIGlmIChjaGFuZ2UuZnJvbSA+PSBzZWwuZnJvbSAmJiBjaGFuZ2UudG8gPD0gc2VsLnRvICYmIGNoYW5nZS50byAtIGNoYW5nZS5mcm9tID49IChzZWwudG8gLSBzZWwuZnJvbSkgLyAzICYmXG4gICAgICAgICghbmV3U2VsIHx8IG5ld1NlbC5tYWluLmVtcHR5ICYmIG5ld1NlbC5tYWluLmZyb20gPT0gY2hhbmdlLmZyb20gKyBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCkgJiZcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA8IDApIHtcbiAgICAgICAgbGV0IGJlZm9yZSA9IHNlbC5mcm9tIDwgY2hhbmdlLmZyb20gPyBzdGFydFN0YXRlLnNsaWNlRG9jKHNlbC5mcm9tLCBjaGFuZ2UuZnJvbSkgOiBcIlwiO1xuICAgICAgICBsZXQgYWZ0ZXIgPSBzZWwudG8gPiBjaGFuZ2UudG8gPyBzdGFydFN0YXRlLnNsaWNlRG9jKGNoYW5nZS50bywgc2VsLnRvKSA6IFwiXCI7XG4gICAgICAgIHRyID0gc3RhcnRTdGF0ZS5yZXBsYWNlU2VsZWN0aW9uKHZpZXcuc3RhdGUudG9UZXh0KGJlZm9yZSArIGNoYW5nZS5pbnNlcnQuc2xpY2VTdHJpbmcoMCwgdW5kZWZpbmVkLCB2aWV3LnN0YXRlLmxpbmVCcmVhaykgKyBhZnRlcikpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNoYW5nZXMgPSBzdGFydFN0YXRlLmNoYW5nZXMoY2hhbmdlKTtcbiAgICAgICAgbGV0IG1haW5TZWwgPSBuZXdTZWwgJiYgbmV3U2VsLm1haW4udG8gPD0gY2hhbmdlcy5uZXdMZW5ndGggPyBuZXdTZWwubWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gVHJ5IHRvIGFwcGx5IGEgY29tcG9zaXRpb24gY2hhbmdlIHRvIGFsbCBjdXJzb3JzXG4gICAgICAgIGlmIChzdGFydFN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoID4gMSAmJiB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDAgJiZcbiAgICAgICAgICAgIGNoYW5nZS50byA8PSBzZWwudG8gJiYgY2hhbmdlLnRvID49IHNlbC50byAtIDEwKSB7XG4gICAgICAgICAgICBsZXQgcmVwbGFjZWQgPSB2aWV3LnN0YXRlLnNsaWNlRG9jKGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pO1xuICAgICAgICAgICAgbGV0IGNvbXBvc2l0aW9uUmFuZ2UsIGNvbXBvc2l0aW9uID0gbmV3U2VsICYmIGZpbmRDb21wb3NpdGlvbk5vZGUodmlldywgbmV3U2VsLm1haW4uaGVhZCk7XG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBsZXQgZExlbiA9IGNoYW5nZS5pbnNlcnQubGVuZ3RoIC0gKGNoYW5nZS50byAtIGNoYW5nZS5mcm9tKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvblJhbmdlID0geyBmcm9tOiBjb21wb3NpdGlvbi5mcm9tLCB0bzogY29tcG9zaXRpb24udG8gLSBkTGVuIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvblJhbmdlID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHNlbC5oZWFkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSBzZWwudG8gLSBjaGFuZ2UudG8sIHNpemUgPSBzZWwudG8gLSBzZWwuZnJvbTtcbiAgICAgICAgICAgIHRyID0gc3RhcnRTdGF0ZS5jaGFuZ2VCeVJhbmdlKHJhbmdlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAmJiByYW5nZS50byA9PSBzZWwudG8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGNoYW5nZXMsIHJhbmdlOiBtYWluU2VsIHx8IHJhbmdlLm1hcChjaGFuZ2VzKSB9O1xuICAgICAgICAgICAgICAgIGxldCB0byA9IHJhbmdlLnRvIC0gb2Zmc2V0LCBmcm9tID0gdG8gLSByZXBsYWNlZC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLnRvIC0gcmFuZ2UuZnJvbSAhPSBzaXplIHx8IHZpZXcuc3RhdGUuc2xpY2VEb2MoZnJvbSwgdG8pICE9IHJlcGxhY2VkIHx8XG4gICAgICAgICAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZXJlJ3Mgbm8gd2F5IHRvIG1ha2UgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBpbiB0aGUgc2FtZSBub2RlIHdvcmsgd2l0aG91dCBhYm9ydGluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBjb21wb3NpdGlvbiwgc28gY3Vyc29ycyBpbiB0aGUgY29tcG9zaXRpb24gcmFuZ2UgYXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQuXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnRvID49IGNvbXBvc2l0aW9uUmFuZ2UuZnJvbSAmJiByYW5nZS5mcm9tIDw9IGNvbXBvc2l0aW9uUmFuZ2UudG8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJhbmdlIH07XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlQ2hhbmdlcyA9IHN0YXJ0U3RhdGUuY2hhbmdlcyh7IGZyb20sIHRvLCBpbnNlcnQ6IGNoYW5nZS5pbnNlcnQgfSksIHNlbE9mZiA9IHJhbmdlLnRvIC0gc2VsLnRvO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXM6IHJhbmdlQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6ICFtYWluU2VsID8gcmFuZ2UubWFwKHJhbmdlQ2hhbmdlcykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yU2VsZWN0aW9uLnJhbmdlKE1hdGgubWF4KDAsIG1haW5TZWwuYW5jaG9yICsgc2VsT2ZmKSwgTWF0aC5tYXgoMCwgbWFpblNlbC5oZWFkICsgc2VsT2ZmKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ciA9IHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogbWFpblNlbCAmJiBzdGFydFN0YXRlLnNlbGVjdGlvbi5yZXBsYWNlUmFuZ2UobWFpblNlbClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHVzZXJFdmVudCA9IFwiaW5wdXQudHlwZVwiO1xuICAgIGlmICh2aWV3LmNvbXBvc2luZyB8fFxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlICYmIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkVuZGVkQXQgPiBEYXRlLm5vdygpIC0gNTApIHtcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSA9IGZhbHNlO1xuICAgICAgICB1c2VyRXZlbnQgKz0gXCIuY29tcG9zZVwiO1xuICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHVzZXJFdmVudCArPSBcIi5zdGFydFwiO1xuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnRTdGF0ZS51cGRhdGUodHIsIHsgdXNlckV2ZW50LCBzY3JvbGxJbnRvVmlldzogdHJ1ZSB9KTtcbn1cbmZ1bmN0aW9uIGZpbmREaWZmKGEsIGIsIHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZSkge1xuICAgIGxldCBtaW5MZW4gPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICAgIGxldCBmcm9tID0gMDtcbiAgICB3aGlsZSAoZnJvbSA8IG1pbkxlbiAmJiBhLmNoYXJDb2RlQXQoZnJvbSkgPT0gYi5jaGFyQ29kZUF0KGZyb20pKVxuICAgICAgICBmcm9tKys7XG4gICAgaWYgKGZyb20gPT0gbWluTGVuICYmIGEubGVuZ3RoID09IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgdG9BID0gYS5sZW5ndGgsIHRvQiA9IGIubGVuZ3RoO1xuICAgIHdoaWxlICh0b0EgPiAwICYmIHRvQiA+IDAgJiYgYS5jaGFyQ29kZUF0KHRvQSAtIDEpID09IGIuY2hhckNvZGVBdCh0b0IgLSAxKSkge1xuICAgICAgICB0b0EtLTtcbiAgICAgICAgdG9CLS07XG4gICAgfVxuICAgIGlmIChwcmVmZXJyZWRTaWRlID09IFwiZW5kXCIpIHtcbiAgICAgICAgbGV0IGFkanVzdCA9IE1hdGgubWF4KDAsIGZyb20gLSBNYXRoLm1pbih0b0EsIHRvQikpO1xuICAgICAgICBwcmVmZXJyZWRQb3MgLT0gdG9BICsgYWRqdXN0IC0gZnJvbTtcbiAgICB9XG4gICAgaWYgKHRvQSA8IGZyb20gJiYgYS5sZW5ndGggPCBiLmxlbmd0aCkge1xuICAgICAgICBsZXQgbW92ZSA9IHByZWZlcnJlZFBvcyA8PSBmcm9tICYmIHByZWZlcnJlZFBvcyA+PSB0b0EgPyBmcm9tIC0gcHJlZmVycmVkUG9zIDogMDtcbiAgICAgICAgZnJvbSAtPSBtb3ZlO1xuICAgICAgICB0b0IgPSBmcm9tICsgKHRvQiAtIHRvQSk7XG4gICAgICAgIHRvQSA9IGZyb207XG4gICAgfVxuICAgIGVsc2UgaWYgKHRvQiA8IGZyb20pIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gZnJvbSAmJiBwcmVmZXJyZWRQb3MgPj0gdG9CID8gZnJvbSAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIGZyb20gLT0gbW92ZTtcbiAgICAgICAgdG9BID0gZnJvbSArICh0b0EgLSB0b0IpO1xuICAgICAgICB0b0IgPSBmcm9tO1xuICAgIH1cbiAgICByZXR1cm4geyBmcm9tLCB0b0EsIHRvQiB9O1xufVxuZnVuY3Rpb24gc2VsZWN0aW9uUG9pbnRzKHZpZXcpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgaWYgKHZpZXcucm9vdC5hY3RpdmVFbGVtZW50ICE9IHZpZXcuY29udGVudERPTSlcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICBsZXQgeyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfSA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgaWYgKGFuY2hvck5vZGUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IERPTVBvaW50KGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCkpO1xuICAgICAgICBpZiAoZm9jdXNOb2RlICE9IGFuY2hvck5vZGUgfHwgZm9jdXNPZmZzZXQgIT0gYW5jaG9yT2Zmc2V0KVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IERPTVBvaW50KGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvbkZyb21Qb2ludHMocG9pbnRzLCBiYXNlKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGFuY2hvciA9IHBvaW50c1swXS5wb3MsIGhlYWQgPSBwb2ludHMubGVuZ3RoID09IDIgPyBwb2ludHNbMV0ucG9zIDogYW5jaG9yO1xuICAgIHJldHVybiBhbmNob3IgPiAtMSAmJiBoZWFkID4gLTEgPyBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKGFuY2hvciArIGJhc2UsIGhlYWQgKyBiYXNlKSA6IG51bGw7XG59XG5cbmNvbnN0IG9ic2VydmVPcHRpb25zID0ge1xuICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgIHN1YnRyZWU6IHRydWUsXG4gICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICBjaGFyYWN0ZXJEYXRhT2xkVmFsdWU6IHRydWVcbn07XG4vLyBJRTExIGhhcyB2ZXJ5IGJyb2tlbiBtdXRhdGlvbiBvYnNlcnZlcnMsIHNvIHdlIGFsc28gbGlzdGVuIHRvXG4vLyBET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWQgdGhlcmVcbmNvbnN0IHVzZUNoYXJEYXRhID0gYnJvd3Nlci5pZSAmJiBicm93c2VyLmllX3ZlcnNpb24gPD0gMTE7XG5jbGFzcyBET01PYnNlcnZlciB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAvLyBUaGUga25vd24gc2VsZWN0aW9uLiBLZXB0IGluIG91ciBvd24gb2JqZWN0LCBhcyBvcHBvc2VkIHRvIGp1c3RcbiAgICAgICAgLy8gZGlyZWN0bHkgYWNjZXNzaW5nIHRoZSBzZWxlY3Rpb24gYmVjYXVzZTpcbiAgICAgICAgLy8gIC0gU2FmYXJpIGRvZXNuJ3QgcmVwb3J0IHRoZSByaWdodCBzZWxlY3Rpb24gaW4gc2hhZG93IERPTVxuICAgICAgICAvLyAgLSBSZWFkaW5nIGZyb20gdGhlIHNlbGVjdGlvbiBmb3JjZXMgYSBET00gbGF5b3V0XG4gICAgICAgIC8vICAtIFRoaXMgd2F5LCB3ZSBjYW4gaWdub3JlIHNlbGVjdGlvbmNoYW5nZSBldmVudHMgaWYgd2UgaGF2ZVxuICAgICAgICAvLyAgICBhbHJlYWR5IHNlZW4gdGhlICduZXcnIHNlbGVjdGlvblxuICAgICAgICB0aGlzLnNlbGVjdGlvblJhbmdlID0gbmV3IERPTVNlbGVjdGlvblN0YXRlO1xuICAgICAgICAvLyBTZXQgd2hlbiBhIHNlbGVjdGlvbiBjaGFuZ2UgaXMgZGV0ZWN0ZWQsIGNsZWFyZWQgb24gZmx1c2hcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVsYXllZEZsdXNoID0gLTE7XG4gICAgICAgIHRoaXMucmVzaXplVGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgICAgIHRoaXMuZGVsYXllZEFuZHJvaWRLZXkgPSBudWxsO1xuICAgICAgICB0aGlzLmZsdXNoaW5nQW5kcm9pZEtleSA9IC0xO1xuICAgICAgICB0aGlzLmxhc3RDaGFuZ2UgPSAwO1xuICAgICAgICB0aGlzLnNjcm9sbFRhcmdldHMgPSBbXTtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLnJlc2l6ZVNjcm9sbCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW50ZXJzZWN0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZ2FwSW50ZXJzZWN0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5nYXBzID0gW107XG4gICAgICAgIC8vIFRpbWVvdXQgZm9yIHNjaGVkdWxpbmcgY2hlY2sgb2YgdGhlIHBhcmVudHMgdGhhdCBuZWVkIHNjcm9sbCBoYW5kbGVyc1xuICAgICAgICB0aGlzLnBhcmVudENoZWNrID0gLTE7XG4gICAgICAgIHRoaXMuZG9tID0gdmlldy5jb250ZW50RE9NO1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IG11dCBvZiBtdXRhdGlvbnMpXG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKG11dCk7XG4gICAgICAgICAgICAvLyBJRTExIHdpbGwgc29tZXRpbWVzIChvbiB0eXBpbmcgb3ZlciBhIHNlbGVjdGlvbiBvclxuICAgICAgICAgICAgLy8gYmFja3NwYWNpbmcgb3V0IGEgc2luZ2xlIGNoYXJhY3RlciB0ZXh0IG5vZGUpIGNhbGwgdGhlXG4gICAgICAgICAgICAvLyBvYnNlcnZlciBjYWxsYmFjayBiZWZvcmUgYWN0dWFsbHkgdXBkYXRpbmcgdGhlIERPTS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBVbnJlbGF0ZWRseSwgaU9TIFNhZmFyaSB3aWxsLCB3aGVuIGVuZGluZyBhIGNvbXBvc2l0aW9uLFxuICAgICAgICAgICAgLy8gc29tZXRpbWVzIGZpcnN0IGNsZWFyIGl0LCBkZWxpdmVyIHRoZSBtdXRhdGlvbnMsIGFuZCB0aGVuXG4gICAgICAgICAgICAvLyByZWluc2VydCB0aGUgZmluaXNoZWQgdGV4dC4gQ29kZU1pcnJvcidzIGhhbmRsaW5nIG9mIHRoZVxuICAgICAgICAgICAgLy8gZGVsZXRpb24gd2lsbCBwcmV2ZW50IHRoZSByZWluc2VydGlvbiBmcm9tIGhhcHBlbmluZyxcbiAgICAgICAgICAgIC8vIGJyZWFraW5nIGNvbXBvc2l0aW9uLlxuICAgICAgICAgICAgaWYgKChicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8PSAxMSB8fCBicm93c2VyLmlvcyAmJiB2aWV3LmNvbXBvc2luZykgJiZcbiAgICAgICAgICAgICAgICBtdXRhdGlvbnMuc29tZShtID0+IG0udHlwZSA9PSBcImNoaWxkTGlzdFwiICYmIG0ucmVtb3ZlZE5vZGVzLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgICAgICBtLnR5cGUgPT0gXCJjaGFyYWN0ZXJEYXRhXCIgJiYgbS5vbGRWYWx1ZS5sZW5ndGggPiBtLnRhcmdldC5ub2RlVmFsdWUubGVuZ3RoKSlcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh1c2VDaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMub25DaGFyRGF0YSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaCh7IHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImNoYXJhY3RlckRhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWU6IGV2ZW50LnByZXZWYWx1ZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblJlc2l6ZSA9IHRoaXMub25SZXNpemUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblByaW50ID0gdGhpcy5vblByaW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25TY3JvbGwgPSB0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcyk7XG4gICAgICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVNjcm9sbCA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICgoKF9hID0gdGhpcy52aWV3LmRvY1ZpZXcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYXN0VXBkYXRlKSA8IERhdGUubm93KCkgLSA3NSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJlc2l6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVNjcm9sbC5vYnNlcnZlKHZpZXcuc2Nyb2xsRE9NKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZFdpbmRvd0xpc3RlbmVycyh0aGlzLndpbiA9IHZpZXcud2luKTtcbiAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICBpZiAodHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb24gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Q2hlY2sgPCAwKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENoZWNrID0gc2V0VGltZW91dCh0aGlzLmxpc3RlbkZvclNjcm9sbC5iaW5kKHRoaXMpLCAxMDAwKTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmIChlbnRyaWVzW2VudHJpZXMubGVuZ3RoIC0gMV0uaW50ZXJzZWN0aW9uUmF0aW8gPiAwKSAhPSB0aGlzLmludGVyc2VjdGluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVyc2VjdGluZyA9ICF0aGlzLmludGVyc2VjdGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJzZWN0aW5nICE9IHRoaXMudmlldy5pblZpZXcpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2Nyb2xsQ2hhbmdlZChkb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7IHRocmVzaG9sZDogWzAsIC4wMDFdIH0pO1xuICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb24ub2JzZXJ2ZSh0aGlzLmRvbSk7XG4gICAgICAgICAgICB0aGlzLmdhcEludGVyc2VjdGlvbiA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmIGVudHJpZXNbZW50cmllcy5sZW5ndGggLSAxXS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2VkKGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIikpO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuRm9yU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgfVxuICAgIG9uU2Nyb2xsQ2hhbmdlZChlKSB7XG4gICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLnJ1bkhhbmRsZXJzKFwic2Nyb2xsXCIsIGUpO1xuICAgICAgICBpZiAodGhpcy5pbnRlcnNlY3RpbmcpXG4gICAgICAgICAgICB0aGlzLnZpZXcubWVhc3VyZSgpO1xuICAgIH1cbiAgICBvblNjcm9sbChlKSB7XG4gICAgICAgIGlmICh0aGlzLmludGVyc2VjdGluZylcbiAgICAgICAgICAgIHRoaXMuZmx1c2goZmFsc2UpO1xuICAgICAgICB0aGlzLm9uU2Nyb2xsQ2hhbmdlZChlKTtcbiAgICB9XG4gICAgb25SZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZVRpbWVvdXQgPCAwKVxuICAgICAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0ID0gLTE7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgfVxuICAgIG9uUHJpbnQoKSB7XG4gICAgICAgIHRoaXMudmlldy52aWV3U3RhdGUucHJpbnRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXcubWVhc3VyZSgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlldy52aWV3U3RhdGUucHJpbnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cbiAgICB1cGRhdGVHYXBzKGdhcHMpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2FwSW50ZXJzZWN0aW9uICYmIChnYXBzLmxlbmd0aCAhPSB0aGlzLmdhcHMubGVuZ3RoIHx8IHRoaXMuZ2Fwcy5zb21lKChnLCBpKSA9PiBnICE9IGdhcHNbaV0pKSkge1xuICAgICAgICAgICAgdGhpcy5nYXBJbnRlcnNlY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgZ2FwIG9mIGdhcHMpXG4gICAgICAgICAgICAgICAgdGhpcy5nYXBJbnRlcnNlY3Rpb24ub2JzZXJ2ZShnYXApO1xuICAgICAgICAgICAgdGhpcy5nYXBzID0gZ2FwcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblNlbGVjdGlvbkNoYW5nZShldmVudCkge1xuICAgICAgICBsZXQgd2FzQ2hhbmdlZCA9IHRoaXMuc2VsZWN0aW9uQ2hhbmdlZDtcbiAgICAgICAgaWYgKCF0aGlzLnJlYWRTZWxlY3Rpb25SYW5nZSgpIHx8IHRoaXMuZGVsYXllZEFuZHJvaWRLZXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXMsIHNlbCA9IHRoaXMuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgIGlmICh2aWV3LnN0YXRlLmZhY2V0KGVkaXRhYmxlKSA/IHZpZXcucm9vdC5hY3RpdmVFbGVtZW50ICE9IHRoaXMuZG9tIDogIWhhc1NlbGVjdGlvbih2aWV3LmRvbSwgc2VsKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGNvbnRleHQgPSBzZWwuYW5jaG9yTm9kZSAmJiB2aWV3LmRvY1ZpZXcubmVhcmVzdChzZWwuYW5jaG9yTm9kZSk7XG4gICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuaWdub3JlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgICBpZiAoIXdhc0NoYW5nZWQpXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVsZXRpb25zIG9uIElFMTEgZmlyZSB0aGVpciBldmVudHMgaW4gdGhlIHdyb25nIG9yZGVyLCBnaXZpbmdcbiAgICAgICAgLy8gdXMgYSBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50IGJlZm9yZSB0aGUgRE9NIGNoYW5nZXMgYXJlXG4gICAgICAgIC8vIHJlcG9ydGVkLlxuICAgICAgICAvLyBDaHJvbWUgQW5kcm9pZCBoYXMgYSBzaW1pbGFyIGlzc3VlIHdoZW4gYmFja3NwYWNpbmcgb3V0IGFcbiAgICAgICAgLy8gc2VsZWN0aW9uICgjNjQ1KS5cbiAgICAgICAgaWYgKChicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8PSAxMSB8fCBicm93c2VyLmFuZHJvaWQgJiYgYnJvd3Nlci5jaHJvbWUpICYmICF2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmVtcHR5ICYmXG4gICAgICAgICAgICAvLyAoU2VsZWN0aW9uLmlzQ29sbGFwc2VkIGlzbid0IHJlbGlhYmxlIG9uIElFKVxuICAgICAgICAgICAgc2VsLmZvY3VzTm9kZSAmJiBpc0VxdWl2YWxlbnRQb3NpdGlvbihzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQsIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KSlcbiAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZmx1c2goZmFsc2UpO1xuICAgIH1cbiAgICByZWFkU2VsZWN0aW9uUmFuZ2UoKSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXM7XG4gICAgICAgIC8vIFRoZSBTZWxlY3Rpb24gb2JqZWN0IGlzIGJyb2tlbiBpbiBzaGFkb3cgcm9vdHMgaW4gU2FmYXJpLiBTZWVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvZGV2L2lzc3Vlcy80MTRcbiAgICAgICAgbGV0IHJhbmdlID0gYnJvd3Nlci5zYWZhcmkgJiYgdmlldy5yb290Lm5vZGVUeXBlID09IDExICYmXG4gICAgICAgICAgICBkZWVwQWN0aXZlRWxlbWVudCh0aGlzLmRvbS5vd25lckRvY3VtZW50KSA9PSB0aGlzLmRvbSAmJlxuICAgICAgICAgICAgc2FmYXJpU2VsZWN0aW9uUmFuZ2VIYWNrKHRoaXMudmlldykgfHwgZ2V0U2VsZWN0aW9uKHZpZXcucm9vdCk7XG4gICAgICAgIGlmICghcmFuZ2UgfHwgdGhpcy5zZWxlY3Rpb25SYW5nZS5lcShyYW5nZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBsb2NhbCA9IGhhc1NlbGVjdGlvbih0aGlzLmRvbSwgcmFuZ2UpO1xuICAgICAgICAvLyBEZXRlY3QgdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGUgYnJvd3NlciBoYXMsIG9uIGZvY3VzLCBtb3ZlZCB0aGVcbiAgICAgICAgLy8gc2VsZWN0aW9uIHRvIHRoZSBzdGFydCBvZiB0aGUgY29udGVudCBlbGVtZW50LiBSZXNldCBpdCB0byB0aGVcbiAgICAgICAgLy8gcG9zaXRpb24gZnJvbSB0aGUgZWRpdG9yIHN0YXRlLlxuICAgICAgICBpZiAobG9jYWwgJiYgIXRoaXMuc2VsZWN0aW9uQ2hhbmdlZCAmJlxuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPiBEYXRlLm5vdygpIC0gMjAwICYmXG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUubGFzdFRvdWNoVGltZSA8IERhdGUubm93KCkgLSAzMDAgJiZcbiAgICAgICAgICAgIGF0RWxlbWVudFN0YXJ0KHRoaXMuZG9tLCByYW5nZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPSAwO1xuICAgICAgICAgICAgdmlldy5kb2NWaWV3LnVwZGF0ZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2Uuc2V0UmFuZ2UocmFuZ2UpO1xuICAgICAgICBpZiAobG9jYWwpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc2V0U2VsZWN0aW9uUmFuZ2UoYW5jaG9yLCBoZWFkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2Uuc2V0KGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0LCBoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuICAgIGNsZWFyU2VsZWN0aW9uUmFuZ2UoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2Uuc2V0KG51bGwsIDAsIG51bGwsIDApO1xuICAgIH1cbiAgICBsaXN0ZW5Gb3JTY3JvbGwoKSB7XG4gICAgICAgIHRoaXMucGFyZW50Q2hlY2sgPSAtMTtcbiAgICAgICAgbGV0IGkgPSAwLCBjaGFuZ2VkID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgZG9tID0gdGhpcy5kb207IGRvbTspIHtcbiAgICAgICAgICAgIGlmIChkb20ubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgICAgIGlmICghY2hhbmdlZCAmJiBpIDwgdGhpcy5zY3JvbGxUYXJnZXRzLmxlbmd0aCAmJiB0aGlzLnNjcm9sbFRhcmdldHNbaV0gPT0gZG9tKVxuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWNoYW5nZWQpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0aGlzLnNjcm9sbFRhcmdldHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQucHVzaChkb20pO1xuICAgICAgICAgICAgICAgIGRvbSA9IGRvbS5hc3NpZ25lZFNsb3QgfHwgZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkb20ubm9kZVR5cGUgPT0gMTEpIHsgLy8gU2hhZG93IHJvb3RcbiAgICAgICAgICAgICAgICBkb20gPSBkb20uaG9zdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpIDwgdGhpcy5zY3JvbGxUYXJnZXRzLmxlbmd0aCAmJiAhY2hhbmdlZClcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0aGlzLnNjcm9sbFRhcmdldHMuc2xpY2UoMCwgaSk7XG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBkb20gb2YgdGhpcy5zY3JvbGxUYXJnZXRzKVxuICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICAgICAgZm9yIChsZXQgZG9tIG9mIHRoaXMuc2Nyb2xsVGFyZ2V0cyA9IGNoYW5nZWQpXG4gICAgICAgICAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWdub3JlKGYpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcbiAgICAgICAgICAgIHJldHVybiBmKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgIHJldHVybiBmKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZG9tLCBvYnNlcnZlT3B0aW9ucyk7XG4gICAgICAgIGlmICh1c2VDaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIiwgdGhpcy5vbkNoYXJEYXRhKTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgaWYgKHVzZUNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLm9uQ2hhckRhdGEpO1xuICAgIH1cbiAgICAvLyBUaHJvdyBhd2F5IGFueSBwZW5kaW5nIGNoYW5nZXNcbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzUmVjb3JkcygpO1xuICAgICAgICB0aGlzLnF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBDaHJvbWUgQW5kcm9pZCwgZXNwZWNpYWxseSBpbiBjb21iaW5hdGlvbiB3aXRoIEdCb2FyZCwgbm90IG9ubHlcbiAgICAvLyBkb2Vzbid0IHJlbGlhYmx5IGZpcmUgcmVndWxhciBrZXkgZXZlbnRzLCBidXQgYWxzbyBvZnRlblxuICAgIC8vIHN1cnJvdW5kcyB0aGUgZWZmZWN0IG9mIGVudGVyIG9yIGJhY2tzcGFjZSB3aXRoIGEgYnVuY2ggb2ZcbiAgICAvLyBjb21wb3NpdGlvbiBldmVudHMgdGhhdCwgd2hlbiBpbnRlcnJ1cHRlZCwgY2F1c2UgdGV4dCBkdXBsaWNhdGlvblxuICAgIC8vIG9yIG90aGVyIGtpbmRzIG9mIGNvcnJ1cHRpb24uIFRoaXMgaGFjayBtYWtlcyB0aGUgZWRpdG9yIGJhY2sgb2ZmXG4gICAgLy8gZnJvbSBoYW5kbGluZyBET00gY2hhbmdlcyBmb3IgYSBtb21lbnQgd2hlbiBzdWNoIGEga2V5IGlzXG4gICAgLy8gZGV0ZWN0ZWQgKHZpYSBiZWZvcmVpbnB1dCBvciBrZXlkb3duKSwgYW5kIHRoZW4gdHJpZXMgdG8gZmx1c2hcbiAgICAvLyB0aGVtIG9yLCBpZiB0aGF0IGhhcyBubyBlZmZlY3QsIGRpc3BhdGNoZXMgdGhlIGdpdmVuIGtleS5cbiAgICBkZWxheUFuZHJvaWRLZXkoa2V5LCBrZXlDb2RlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5KSB7XG4gICAgICAgICAgICBsZXQgZmx1c2ggPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMuZGVsYXllZEFuZHJvaWRLZXk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyRGVsYXllZEFuZHJvaWRLZXkoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEtleUNvZGUgPSBrZXkua2V5Q29kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEtleVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmx1c2hlZCA9IHRoaXMuZmx1c2goKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmbHVzaGVkICYmIGtleS5mb3JjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoS2V5KHRoaXMuZG9tLCBrZXkua2V5LCBrZXkua2V5Q29kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5ID0gdGhpcy52aWV3Lndpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZmx1c2gpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmNlIGJhY2tzcGFjZSBiZWZvcmVpbnB1dCBpcyBzb21ldGltZXMgc2lnbmFsbGVkIHNwdXJpb3VzbHksXG4gICAgICAgIC8vIEVudGVyIGFsd2F5cyB0YWtlcyBwcmVjZWRlbmNlLlxuICAgICAgICBpZiAoIXRoaXMuZGVsYXllZEFuZHJvaWRLZXkgfHwga2V5ID09IFwiRW50ZXJcIilcbiAgICAgICAgICAgIHRoaXMuZGVsYXllZEFuZHJvaWRLZXkgPSB7XG4gICAgICAgICAgICAgICAga2V5LCBrZXlDb2RlLFxuICAgICAgICAgICAgICAgIC8vIE9ubHkgcnVuIHRoZSBrZXkgaGFuZGxlciB3aGVuIG5vIGNoYW5nZXMgYXJlIGRldGVjdGVkIGlmXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpc24ndCBjb21pbmcgcmlnaHQgYWZ0ZXIgYW5vdGhlciBjaGFuZ2UsIGluIHdoaWNoIGNhc2VcbiAgICAgICAgICAgICAgICAvLyBpdCBpcyBwcm9iYWJseSBwYXJ0IG9mIGEgd2VpcmQgY2hhaW4gb2YgdXBkYXRlcywgYW5kIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIGJlIGlnbm9yZWQgaWYgaXQgcmV0dXJucyB0aGUgRE9NIHRvIGl0cyBwcmV2aW91cyBzdGF0ZS5cbiAgICAgICAgICAgICAgICBmb3JjZTogdGhpcy5sYXN0Q2hhbmdlIDwgRGF0ZS5ub3coKSAtIDUwIHx8ICEhKChfYSA9IHRoaXMuZGVsYXllZEFuZHJvaWRLZXkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb3JjZSlcbiAgICAgICAgICAgIH07XG4gICAgfVxuICAgIGNsZWFyRGVsYXllZEFuZHJvaWRLZXkoKSB7XG4gICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5KTtcbiAgICAgICAgdGhpcy5kZWxheWVkQW5kcm9pZEtleSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5ID0gLTE7XG4gICAgfVxuICAgIGZsdXNoU29vbigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsYXllZEZsdXNoIDwgMClcbiAgICAgICAgICAgIHRoaXMuZGVsYXllZEZsdXNoID0gdGhpcy52aWV3Lndpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4geyB0aGlzLmRlbGF5ZWRGbHVzaCA9IC0xOyB0aGlzLmZsdXNoKCk7IH0pO1xuICAgIH1cbiAgICBmb3JjZUZsdXNoKCkge1xuICAgICAgICBpZiAodGhpcy5kZWxheWVkRmx1c2ggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy52aWV3Lndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmRlbGF5ZWRGbHVzaCk7XG4gICAgICAgICAgICB0aGlzLmRlbGF5ZWRGbHVzaCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICB9XG4gICAgcGVuZGluZ1JlY29yZHMoKSB7XG4gICAgICAgIGZvciAobGV0IG11dCBvZiB0aGlzLm9ic2VydmVyLnRha2VSZWNvcmRzKCkpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobXV0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWU7XG4gICAgfVxuICAgIHByb2Nlc3NSZWNvcmRzKCkge1xuICAgICAgICBsZXQgcmVjb3JkcyA9IHRoaXMucGVuZGluZ1JlY29yZHMoKTtcbiAgICAgICAgaWYgKHJlY29yZHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICBsZXQgZnJvbSA9IC0xLCB0byA9IC0xLCB0eXBlT3ZlciA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gdGhpcy5yZWFkTXV0YXRpb24ocmVjb3JkKTtcbiAgICAgICAgICAgIGlmICghcmFuZ2UpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmFuZ2UudHlwZU92ZXIpXG4gICAgICAgICAgICAgICAgdHlwZU92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGZyb20gPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAoeyBmcm9tLCB0byB9ID0gcmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJvbSA9IE1hdGgubWluKHJhbmdlLmZyb20sIGZyb20pO1xuICAgICAgICAgICAgICAgIHRvID0gTWF0aC5tYXgocmFuZ2UudG8sIHRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmcm9tLCB0bywgdHlwZU92ZXIgfTtcbiAgICB9XG4gICAgcmVhZENoYW5nZSgpIHtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8sIHR5cGVPdmVyIH0gPSB0aGlzLnByb2Nlc3NSZWNvcmRzKCk7XG4gICAgICAgIGxldCBuZXdTZWwgPSB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgJiYgaGFzU2VsZWN0aW9uKHRoaXMuZG9tLCB0aGlzLnNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgaWYgKGZyb20gPCAwICYmICFuZXdTZWwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGZyb20gPiAtMSlcbiAgICAgICAgICAgIHRoaXMubGFzdENoYW5nZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPSAwO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGNoYW5nZSA9IG5ldyBET01DaGFuZ2UodGhpcy52aWV3LCBmcm9tLCB0bywgdHlwZU92ZXIpO1xuICAgICAgICB0aGlzLnZpZXcuZG9jVmlldy5kb21DaGFuZ2VkID0geyBuZXdTZWw6IGNoYW5nZS5uZXdTZWwgPyBjaGFuZ2UubmV3U2VsLm1haW4gOiBudWxsIH07XG4gICAgICAgIHJldHVybiBjaGFuZ2U7XG4gICAgfVxuICAgIC8vIEFwcGx5IHBlbmRpbmcgY2hhbmdlcywgaWYgYW55XG4gICAgZmx1c2gocmVhZFNlbGVjdGlvbiA9IHRydWUpIHtcbiAgICAgICAgLy8gQ29tcGxldGVseSBob2xkIG9mZiBmbHVzaGluZyB3aGVuIHBlbmRpbmcga2V5cyBhcmUgc2V0XHUyMDE0dGhlIGNvZGVcbiAgICAgICAgLy8gbWFuYWdpbmcgdGhvc2Ugd2lsbCBtYWtlIHN1cmUgcHJvY2Vzc1JlY29yZHMgaXMgY2FsbGVkIGFuZCB0aGVcbiAgICAgICAgLy8gdmlldyBpcyByZXN5bmNocm9uaXplZCBhZnRlclxuICAgICAgICBpZiAodGhpcy5kZWxheWVkRmx1c2ggPj0gMCB8fCB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAocmVhZFNlbGVjdGlvbilcbiAgICAgICAgICAgIHRoaXMucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBkb21DaGFuZ2UgPSB0aGlzLnJlYWRDaGFuZ2UoKTtcbiAgICAgICAgaWYgKCFkb21DaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydFN0YXRlID0gdGhpcy52aWV3LnN0YXRlO1xuICAgICAgICBsZXQgaGFuZGxlZCA9IGFwcGx5RE9NQ2hhbmdlKHRoaXMudmlldywgZG9tQ2hhbmdlKTtcbiAgICAgICAgLy8gVGhlIHZpZXcgd2Fzbid0IHVwZGF0ZWRcbiAgICAgICAgaWYgKHRoaXMudmlldy5zdGF0ZSA9PSBzdGFydFN0YXRlKVxuICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgIH1cbiAgICByZWFkTXV0YXRpb24ocmVjKSB7XG4gICAgICAgIGxldCBjVmlldyA9IHRoaXMudmlldy5kb2NWaWV3Lm5lYXJlc3QocmVjLnRhcmdldCk7XG4gICAgICAgIGlmICghY1ZpZXcgfHwgY1ZpZXcuaWdub3JlTXV0YXRpb24ocmVjKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjVmlldy5tYXJrRGlydHkocmVjLnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIpO1xuICAgICAgICBpZiAocmVjLnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIpXG4gICAgICAgICAgICBjVmlldy5mbGFncyB8PSA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi87XG4gICAgICAgIGlmIChyZWMudHlwZSA9PSBcImNoaWxkTGlzdFwiKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRCZWZvcmUgPSBmaW5kQ2hpbGQoY1ZpZXcsIHJlYy5wcmV2aW91c1NpYmxpbmcgfHwgcmVjLnRhcmdldC5wcmV2aW91c1NpYmxpbmcsIC0xKTtcbiAgICAgICAgICAgIGxldCBjaGlsZEFmdGVyID0gZmluZENoaWxkKGNWaWV3LCByZWMubmV4dFNpYmxpbmcgfHwgcmVjLnRhcmdldC5uZXh0U2libGluZywgMSk7XG4gICAgICAgICAgICByZXR1cm4geyBmcm9tOiBjaGlsZEJlZm9yZSA/IGNWaWV3LnBvc0FmdGVyKGNoaWxkQmVmb3JlKSA6IGNWaWV3LnBvc0F0U3RhcnQsXG4gICAgICAgICAgICAgICAgdG86IGNoaWxkQWZ0ZXIgPyBjVmlldy5wb3NCZWZvcmUoY2hpbGRBZnRlcikgOiBjVmlldy5wb3NBdEVuZCwgdHlwZU92ZXI6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVjLnR5cGUgPT0gXCJjaGFyYWN0ZXJEYXRhXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IGNWaWV3LnBvc0F0U3RhcnQsIHRvOiBjVmlldy5wb3NBdEVuZCwgdHlwZU92ZXI6IHJlYy50YXJnZXQubm9kZVZhbHVlID09IHJlYy5vbGRWYWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0V2luZG93KHdpbikge1xuICAgICAgICBpZiAod2luICE9IHRoaXMud2luKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVdpbmRvd0xpc3RlbmVycyh0aGlzLndpbik7XG4gICAgICAgICAgICB0aGlzLndpbiA9IHdpbjtcbiAgICAgICAgICAgIHRoaXMuYWRkV2luZG93TGlzdGVuZXJzKHRoaXMud2luKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRXaW5kb3dMaXN0ZW5lcnMod2luKSB7XG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMub25SZXNpemUpO1xuICAgICAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXByaW50XCIsIHRoaXMub25QcmludCk7XG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB3aW4uZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgICB9XG4gICAgcmVtb3ZlV2luZG93TGlzdGVuZXJzKHdpbikge1xuICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5vblJlc2l6ZSk7XG4gICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JlcHJpbnRcIiwgdGhpcy5vblByaW50KTtcbiAgICAgICAgd2luLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgKF9hID0gdGhpcy5pbnRlcnNlY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kaXNjb25uZWN0KCk7XG4gICAgICAgIChfYiA9IHRoaXMuZ2FwSW50ZXJzZWN0aW9uKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZGlzY29ubmVjdCgpO1xuICAgICAgICAoX2MgPSB0aGlzLnJlc2l6ZVNjcm9sbCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgZm9yIChsZXQgZG9tIG9mIHRoaXMuc2Nyb2xsVGFyZ2V0cylcbiAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB0aGlzLnJlbW92ZVdpbmRvd0xpc3RlbmVycyh0aGlzLndpbik7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBhcmVudENoZWNrKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7XG4gICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZGVsYXllZEZsdXNoKTtcbiAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5mbHVzaGluZ0FuZHJvaWRLZXkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmRDaGlsZChjVmlldywgZG9tLCBkaXIpIHtcbiAgICB3aGlsZSAoZG9tKSB7XG4gICAgICAgIGxldCBjdXJWaWV3ID0gQ29udGVudFZpZXcuZ2V0KGRvbSk7XG4gICAgICAgIGlmIChjdXJWaWV3ICYmIGN1clZpZXcucGFyZW50ID09IGNWaWV3KVxuICAgICAgICAgICAgcmV0dXJuIGN1clZpZXc7XG4gICAgICAgIGxldCBwYXJlbnQgPSBkb20ucGFyZW50Tm9kZTtcbiAgICAgICAgZG9tID0gcGFyZW50ICE9IGNWaWV3LmRvbSA/IHBhcmVudCA6IGRpciA+IDAgPyBkb20ubmV4dFNpYmxpbmcgOiBkb20ucHJldmlvdXNTaWJsaW5nO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8vIFVzZWQgdG8gd29yayBhcm91bmQgYSBTYWZhcmkgU2VsZWN0aW9uL3NoYWRvdyBET00gYnVnICgjNDE0KVxuZnVuY3Rpb24gc2FmYXJpU2VsZWN0aW9uUmFuZ2VIYWNrKHZpZXcpIHtcbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIC8vIEJlY2F1c2UgU2FmYXJpIChhdCBsZWFzdCBpbiAyMDE4LTIwMjEpIGRvZXNuJ3QgcHJvdmlkZSByZWd1bGFyXG4gICAgLy8gYWNjZXNzIHRvIHRoZSBzZWxlY3Rpb24gaW5zaWRlIGEgc2hhZG93cm9vdCwgd2UgaGF2ZSB0byBwZXJmb3JtIGFcbiAgICAvLyByaWRpY3Vsb3VzIGhhY2sgdG8gZ2V0IGF0IGl0XHUyMDE0dXNpbmcgYGV4ZWNDb21tYW5kYCB0byB0cmlnZ2VyIGFcbiAgICAvLyBgYmVmb3JlSW5wdXRgIGV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHRhcmdldCByYW5nZSBmcm9tIHRoZVxuICAgIC8vIGV2ZW50LlxuICAgIGZ1bmN0aW9uIHJlYWQoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGZvdW5kID0gZXZlbnQuZ2V0VGFyZ2V0UmFuZ2VzKClbMF07XG4gICAgfVxuICAgIHZpZXcuY29udGVudERPTS5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgcmVhZCwgdHJ1ZSk7XG4gICAgdmlldy5kb20ub3duZXJEb2N1bWVudC5leGVjQ29tbWFuZChcImluZGVudFwiKTtcbiAgICB2aWV3LmNvbnRlbnRET00ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJlZm9yZWlucHV0XCIsIHJlYWQsIHRydWUpO1xuICAgIGlmICghZm91bmQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBhbmNob3JOb2RlID0gZm91bmQuc3RhcnRDb250YWluZXIsIGFuY2hvck9mZnNldCA9IGZvdW5kLnN0YXJ0T2Zmc2V0O1xuICAgIGxldCBmb2N1c05vZGUgPSBmb3VuZC5lbmRDb250YWluZXIsIGZvY3VzT2Zmc2V0ID0gZm91bmQuZW5kT2Zmc2V0O1xuICAgIGxldCBjdXJBbmNob3IgPSB2aWV3LmRvY1ZpZXcuZG9tQXRQb3Modmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5hbmNob3IpO1xuICAgIC8vIFNpbmNlIHN1Y2ggYSByYW5nZSBkb2Vzbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gYW5jaG9yIGFuZCBoZWFkLFxuICAgIC8vIHVzZSBhIGhldXJpc3RpYyB0aGF0IGZsaXBzIGl0IGFyb3VuZCBpZiBpdHMgZW5kIG1hdGNoZXMgdGhlXG4gICAgLy8gY3VycmVudCBhbmNob3IuXG4gICAgaWYgKGlzRXF1aXZhbGVudFBvc2l0aW9uKGN1ckFuY2hvci5ub2RlLCBjdXJBbmNob3Iub2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSlcbiAgICAgICAgW2FuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldF0gPSBbZm9jdXNOb2RlLCBmb2N1c09mZnNldCwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0XTtcbiAgICByZXR1cm4geyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfTtcbn1cblxuLy8gVGhlIGVkaXRvcidzIHVwZGF0ZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6XG4vL1xuLy8gICAgIElkbGUgXHUyMTkyIFVwZGF0aW5nIFx1MjFDNiBJZGxlICh1bmNoZWNrZWQpIFx1MjE5MiBNZWFzdXJpbmcgXHUyMTkyIElkbGVcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTIxOTEgICAgICBcdTIxOTNcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGluZyAobWVhc3VyZSlcbi8vXG4vLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICdJZGxlJyBhbmQgJ0lkbGUgKHVuY2hlY2tlZCknIGxpZXMgaW5cbi8vIHdoZXRoZXIgYSBsYXlvdXQgY2hlY2sgaGFzIGJlZW4gc2NoZWR1bGVkLiBBIHJlZ3VsYXIgdXBkYXRlIHRocm91Z2hcbi8vIHRoZSBgdXBkYXRlYCBtZXRob2QgdXBkYXRlcyB0aGUgRE9NIGluIGEgd3JpdGUtb25seSBmYXNoaW9uLCBhbmRcbi8vIHJlbGllcyBvbiBhIGNoZWNrIChzY2hlZHVsZWQgd2l0aCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCkgdG8gbWFrZVxuLy8gc3VyZSBldmVyeXRoaW5nIGlzIHdoZXJlIGl0IHNob3VsZCBiZSBhbmQgdGhlIHZpZXdwb3J0IGNvdmVycyB0aGVcbi8vIHZpc2libGUgY29kZS4gVGhhdCBjaGVjayBjb250aW51ZXMgdG8gbWVhc3VyZSBhbmQgdGhlbiBvcHRpb25hbGx5XG4vLyB1cGRhdGUgdW50aWwgaXQgcmVhY2hlcyBhIGNvaGVyZW50IHN0YXRlLlxuLyoqXG5BbiBlZGl0b3IgdmlldyByZXByZXNlbnRzIHRoZSBlZGl0b3IncyB1c2VyIGludGVyZmFjZS4gSXQgaG9sZHNcbnRoZSBlZGl0YWJsZSBET00gc3VyZmFjZSwgYW5kIHBvc3NpYmx5IG90aGVyIGVsZW1lbnRzIHN1Y2ggYXMgdGhlXG5saW5lIG51bWJlciBndXR0ZXIuIEl0IGhhbmRsZXMgZXZlbnRzIGFuZCBkaXNwYXRjaGVzIHN0YXRlXG50cmFuc2FjdGlvbnMgZm9yIGVkaXRpbmcgYWN0aW9ucy5cbiovXG5jbGFzcyBFZGl0b3JWaWV3IHtcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBnZXQgc3RhdGUoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5zdGF0ZTsgfVxuICAgIC8qKlxuICAgIFRvIGJlIGFibGUgdG8gZGlzcGxheSBsYXJnZSBkb2N1bWVudHMgd2l0aG91dCBjb25zdW1pbmcgdG9vIG11Y2hcbiAgICBtZW1vcnkgb3Igb3ZlcmxvYWRpbmcgdGhlIGJyb3dzZXIsIENvZGVNaXJyb3Igb25seSBkcmF3cyB0aGVcbiAgICBjb2RlIHRoYXQgaXMgdmlzaWJsZSAocGx1cyBhIG1hcmdpbiBhcm91bmQgaXQpIHRvIHRoZSBET00uIFRoaXNcbiAgICBwcm9wZXJ0eSB0ZWxscyB5b3UgdGhlIGV4dGVudCBvZiB0aGUgY3VycmVudCBkcmF3biB2aWV3cG9ydCwgaW5cbiAgICBkb2N1bWVudCBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBnZXQgdmlld3BvcnQoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS52aWV3cG9ydDsgfVxuICAgIC8qKlxuICAgIFdoZW4gdGhlcmUgYXJlLCBmb3IgZXhhbXBsZSwgbGFyZ2UgY29sbGFwc2VkIHJhbmdlcyBpbiB0aGVcbiAgICB2aWV3cG9ydCwgaXRzIHNpemUgY2FuIGJlIGEgbG90IGJpZ2dlciB0aGFuIHRoZSBhY3R1YWwgdmlzaWJsZVxuICAgIGNvbnRlbnQuIFRodXMsIGlmIHlvdSBhcmUgZG9pbmcgc29tZXRoaW5nIGxpa2Ugc3R5bGluZyB0aGVcbiAgICBjb250ZW50IGluIHRoZSB2aWV3cG9ydCwgaXQgaXMgcHJlZmVyYWJsZSB0byBvbmx5IGRvIHNvIGZvclxuICAgIHRoZXNlIHJhbmdlcywgd2hpY2ggYXJlIHRoZSBzdWJzZXQgb2YgdGhlIHZpZXdwb3J0IHRoYXQgaXNcbiAgICBhY3R1YWxseSBkcmF3bi5cbiAgICAqL1xuICAgIGdldCB2aXNpYmxlUmFuZ2VzKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUudmlzaWJsZVJhbmdlczsgfVxuICAgIC8qKlxuICAgIFJldHVybnMgZmFsc2Ugd2hlbiB0aGUgZWRpdG9yIGlzIGVudGlyZWx5IHNjcm9sbGVkIG91dCBvZiB2aWV3XG4gICAgb3Igb3RoZXJ3aXNlIGhpZGRlbi5cbiAgICAqL1xuICAgIGdldCBpblZpZXcoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5pblZpZXc7IH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBpcyBjdXJyZW50bHkgY29tcG9zaW5nIHRleHQgdmlhXG4gICAgW0lNRV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW5wdXRfbWV0aG9kKSwgYW5kIGF0IGxlYXN0XG4gICAgb25lIGNoYW5nZSBoYXMgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGNvbXBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IGNvbXBvc2luZygpIHsgcmV0dXJuIHRoaXMuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPiAwOyB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVzZXIgaXMgY3VycmVudGx5IGluIGNvbXBvc2luZyBzdGF0ZS4gTm90ZVxuICAgIHRoYXQgb24gc29tZSBwbGF0Zm9ybXMsIGxpa2UgQW5kcm9pZCwgdGhpcyB3aWxsIGJlIHRoZSBjYXNlIGFcbiAgICBsb3QsIHNpbmNlIGp1c3QgcHV0dGluZyB0aGUgY3Vyc29yIG9uIGEgd29yZCBzdGFydHMgYVxuICAgIGNvbXBvc2l0aW9uIHRoZXJlLlxuICAgICovXG4gICAgZ2V0IGNvbXBvc2l0aW9uU3RhcnRlZCgpIHsgcmV0dXJuIHRoaXMuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPj0gMDsgfVxuICAgIC8qKlxuICAgIFRoZSBkb2N1bWVudCBvciBzaGFkb3cgcm9vdCB0aGF0IHRoZSB2aWV3IGxpdmVzIGluLlxuICAgICovXG4gICAgZ2V0IHJvb3QoKSB7IHJldHVybiB0aGlzLl9yb290OyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgd2luKCkgeyByZXR1cm4gdGhpcy5kb20ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7IH1cbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBuZXcgdmlldy4gWW91J2xsIHdhbnQgdG8gZWl0aGVyIHByb3ZpZGUgYSBgcGFyZW50YFxuICAgIG9wdGlvbiwgb3IgcHV0IGB2aWV3LmRvbWAgaW50byB5b3VyIGRvY3VtZW50IGFmdGVyIGNyZWF0aW5nIGFcbiAgICB2aWV3LCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzZWUgdGhlIGVkaXRvci5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IFtdO1xuICAgICAgICB0aGlzLnBsdWdpbk1hcCA9IG5ldyBNYXA7XG4gICAgICAgIHRoaXMuZWRpdG9yQXR0cnMgPSB7fTtcbiAgICAgICAgdGhpcy5jb250ZW50QXR0cnMgPSB7fTtcbiAgICAgICAgdGhpcy5iaWRpQ2FjaGUgPSBbXTtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMiAvKiBVcGRhdGVTdGF0ZS5VcGRhdGluZyAqLztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAtMTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm1lYXN1cmVSZXF1ZXN0cyA9IFtdO1xuICAgICAgICB0aGlzLmNvbnRlbnRET00gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLnNjcm9sbERPTSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuc2Nyb2xsRE9NLnRhYkluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuc2Nyb2xsRE9NLmNsYXNzTmFtZSA9IFwiY20tc2Nyb2xsZXJcIjtcbiAgICAgICAgdGhpcy5zY3JvbGxET00uYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZURPTSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VET00uY2xhc3NOYW1lID0gXCJjbS1hbm5vdW5jZWRcIjtcbiAgICAgICAgdGhpcy5hbm5vdW5jZURPTS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxpdmVcIiwgXCJwb2xpdGVcIik7XG4gICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQodGhpcy5hbm5vdW5jZURPTSk7XG4gICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKHRoaXMuc2Nyb2xsRE9NKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wYXJlbnQpXG4gICAgICAgICAgICBjb25maWcucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuZG9tKTtcbiAgICAgICAgbGV0IHsgZGlzcGF0Y2ggfSA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5kaXNwYXRjaFRyYW5zYWN0aW9ucyA9IGNvbmZpZy5kaXNwYXRjaFRyYW5zYWN0aW9ucyB8fFxuICAgICAgICAgICAgKGRpc3BhdGNoICYmICgodHJzKSA9PiB0cnMuZm9yRWFjaCh0ciA9PiBkaXNwYXRjaCh0ciwgdGhpcykpKSkgfHxcbiAgICAgICAgICAgICgodHJzKSA9PiB0aGlzLnVwZGF0ZSh0cnMpKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuZGlzcGF0Y2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fcm9vdCA9IChjb25maWcucm9vdCB8fCBnZXRSb290KGNvbmZpZy5wYXJlbnQpIHx8IGRvY3VtZW50KTtcbiAgICAgICAgdGhpcy52aWV3U3RhdGUgPSBuZXcgVmlld1N0YXRlKGNvbmZpZy5zdGF0ZSB8fCBFZGl0b3JTdGF0ZS5jcmVhdGUoY29uZmlnKSk7XG4gICAgICAgIGlmIChjb25maWcuc2Nyb2xsVG8gJiYgY29uZmlnLnNjcm9sbFRvLmlzKHNjcm9sbEludG9WaWV3KSlcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldCA9IGNvbmZpZy5zY3JvbGxUby52YWx1ZS5jbGlwKHRoaXMudmlld1N0YXRlLnN0YXRlKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gdGhpcy5zdGF0ZS5mYWNldCh2aWV3UGx1Z2luKS5tYXAoc3BlYyA9PiBuZXcgUGx1Z2luSW5zdGFuY2Uoc3BlYykpO1xuICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgcGx1Z2luLnVwZGF0ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBET01PYnNlcnZlcih0aGlzKTtcbiAgICAgICAgdGhpcy5pbnB1dFN0YXRlID0gbmV3IElucHV0U3RhdGUodGhpcyk7XG4gICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5lbnN1cmVIYW5kbGVycyh0aGlzLnBsdWdpbnMpO1xuICAgICAgICB0aGlzLmRvY1ZpZXcgPSBuZXcgRG9jVmlldyh0aGlzKTtcbiAgICAgICAgdGhpcy5tb3VudFN0eWxlcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUF0dHJzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi87XG4gICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICB9XG4gICAgZGlzcGF0Y2goLi4uaW5wdXQpIHtcbiAgICAgICAgbGV0IHRycyA9IGlucHV0Lmxlbmd0aCA9PSAxICYmIGlucHV0WzBdIGluc3RhbmNlb2YgVHJhbnNhY3Rpb24gPyBpbnB1dFxuICAgICAgICAgICAgOiBpbnB1dC5sZW5ndGggPT0gMSAmJiBBcnJheS5pc0FycmF5KGlucHV0WzBdKSA/IGlucHV0WzBdXG4gICAgICAgICAgICAgICAgOiBbdGhpcy5zdGF0ZS51cGRhdGUoLi4uaW5wdXQpXTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaFRyYW5zYWN0aW9ucyh0cnMsIHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHZpZXcgZm9yIHRoZSBnaXZlbiBhcnJheSBvZiB0cmFuc2FjdGlvbnMuIFRoaXMgd2lsbFxuICAgIHVwZGF0ZSB0aGUgdmlzaWJsZSBkb2N1bWVudCBhbmQgc2VsZWN0aW9uIHRvIG1hdGNoIHRoZSBzdGF0ZVxuICAgIHByb2R1Y2VkIGJ5IHRoZSB0cmFuc2FjdGlvbnMsIGFuZCBub3RpZnkgdmlldyBwbHVnaW5zIG9mIHRoZVxuICAgIGNoYW5nZS4gWW91IHNob3VsZCB1c3VhbGx5IGNhbGxcbiAgICBbYGRpc3BhdGNoYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGlzcGF0Y2gpIGluc3RlYWQsIHdoaWNoIHVzZXMgdGhpc1xuICAgIGFzIGEgcHJpbWl0aXZlLlxuICAgICovXG4gICAgdXBkYXRlKHRyYW5zYWN0aW9ucykge1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdGF0ZSAhPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxscyB0byBFZGl0b3JWaWV3LnVwZGF0ZSBhcmUgbm90IGFsbG93ZWQgd2hpbGUgYW4gdXBkYXRlIGlzIGluIHByb2dyZXNzXCIpO1xuICAgICAgICBsZXQgcmVkcmF3biA9IGZhbHNlLCBhdHRyc0NoYW5nZWQgPSBmYWxzZSwgdXBkYXRlO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgICBmb3IgKGxldCB0ciBvZiB0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0ci5zdGFydFN0YXRlICE9IHN0YXRlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVHJ5aW5nIHRvIHVwZGF0ZSBzdGF0ZSB3aXRoIGEgdHJhbnNhY3Rpb24gdGhhdCBkb2Vzbid0IHN0YXJ0IGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLlwiKTtcbiAgICAgICAgICAgIHN0YXRlID0gdHIuc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmb2N1cyA9IHRoaXMuaGFzRm9jdXMsIGZvY3VzRmxhZyA9IDAsIGRpc3BhdGNoRm9jdXMgPSBudWxsO1xuICAgICAgICBpZiAodHJhbnNhY3Rpb25zLnNvbWUodHIgPT4gdHIuYW5ub3RhdGlvbihpc0ZvY3VzQ2hhbmdlKSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQgPSBmb2N1cztcbiAgICAgICAgICAgIC8vIElmIGEgZm9jdXMtY2hhbmdlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIGRpc3BhdGNoZWQsIHNldCB0aGlzIHVwZGF0ZSBmbGFnLlxuICAgICAgICAgICAgZm9jdXNGbGFnID0gMSAvKiBVcGRhdGVGbGFnLkZvY3VzICovO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZvY3VzICE9IHRoaXMuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQgPSBmb2N1cztcbiAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgc2VwYXJhdGUgZm9jdXMgdHJhbnNhY3Rpb24gaWYgbmVjZXNzYXJ5LCBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIGFkZCBhIGZsYWcgdG8gdGhpcyB1cGRhdGVcbiAgICAgICAgICAgIGRpc3BhdGNoRm9jdXMgPSBmb2N1c0NoYW5nZVRyYW5zYWN0aW9uKHN0YXRlLCBmb2N1cyk7XG4gICAgICAgICAgICBpZiAoIWRpc3BhdGNoRm9jdXMpXG4gICAgICAgICAgICAgICAgZm9jdXNGbGFnID0gMSAvKiBVcGRhdGVGbGFnLkZvY3VzICovO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIHBlbmRpbmcgRE9NIGNoYW5nZSwgZWFnZXJseSByZWFkIGl0IGFuZCB0cnkgdG9cbiAgICAgICAgLy8gYXBwbHkgaXQgYWZ0ZXIgdGhlIGdpdmVuIHRyYW5zYWN0aW9ucy5cbiAgICAgICAgbGV0IHBlbmRpbmdLZXkgPSB0aGlzLm9ic2VydmVyLmRlbGF5ZWRBbmRyb2lkS2V5LCBkb21DaGFuZ2UgPSBudWxsO1xuICAgICAgICBpZiAocGVuZGluZ0tleSkge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5jbGVhckRlbGF5ZWRBbmRyb2lkS2V5KCk7XG4gICAgICAgICAgICBkb21DaGFuZ2UgPSB0aGlzLm9ic2VydmVyLnJlYWRDaGFuZ2UoKTtcbiAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRvIGFwcGx5IERPTSBjaGFuZ2VzIGlmIHRoZSB0cmFuc2FjdGlvbnMgZGlkbid0XG4gICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGRvYyBvciBzZWxlY3Rpb24uXG4gICAgICAgICAgICBpZiAoZG9tQ2hhbmdlICYmICF0aGlzLnN0YXRlLmRvYy5lcShzdGF0ZS5kb2MpIHx8ICF0aGlzLnN0YXRlLnNlbGVjdGlvbi5lcShzdGF0ZS5zZWxlY3Rpb24pKVxuICAgICAgICAgICAgICAgIGRvbUNoYW5nZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiB0aGUgcGhyYXNlcyBjaGFuZ2UsIHJlZHJhdyB0aGUgZWRpdG9yXG4gICAgICAgIGlmIChzdGF0ZS5mYWNldChFZGl0b3JTdGF0ZS5waHJhc2VzKSAhPSB0aGlzLnN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLnBocmFzZXMpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoc3RhdGUpO1xuICAgICAgICB1cGRhdGUgPSBWaWV3VXBkYXRlLmNyZWF0ZSh0aGlzLCBzdGF0ZSwgdHJhbnNhY3Rpb25zKTtcbiAgICAgICAgdXBkYXRlLmZsYWdzIHw9IGZvY3VzRmxhZztcbiAgICAgICAgbGV0IHNjcm9sbFRhcmdldCA9IHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovO1xuICAgICAgICAgICAgZm9yIChsZXQgdHIgb2YgdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbFRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVGFyZ2V0ID0gc2Nyb2xsVGFyZ2V0Lm1hcCh0ci5jaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICBpZiAodHIuc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgbWFpbiB9ID0gdHIuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUYXJnZXQgPSBuZXcgU2Nyb2xsVGFyZ2V0KG1haW4uZW1wdHkgPyBtYWluIDogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihtYWluLmhlYWQsIG1haW4uaGVhZCA+IG1haW4uYW5jaG9yID8gLTEgOiAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGUgb2YgdHIuZWZmZWN0cylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuaXMoc2Nyb2xsSW50b1ZpZXcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVGFyZ2V0ID0gZS52YWx1ZS5jbGlwKHRoaXMuc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUudXBkYXRlKHVwZGF0ZSwgc2Nyb2xsVGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMuYmlkaUNhY2hlID0gQ2FjaGVkT3JkZXIudXBkYXRlKHRoaXMuYmlkaUNhY2hlLCB1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgICAgICBpZiAoIXVwZGF0ZS5lbXB0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGx1Z2lucyh1cGRhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZHJhd24gPSB0aGlzLmRvY1ZpZXcudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5mYWNldChzdHlsZU1vZHVsZSkgIT0gdGhpcy5zdHlsZU1vZHVsZXMpXG4gICAgICAgICAgICAgICAgdGhpcy5tb3VudFN0eWxlcygpO1xuICAgICAgICAgICAgYXR0cnNDaGFuZ2VkID0gdGhpcy51cGRhdGVBdHRycygpO1xuICAgICAgICAgICAgdGhpcy5zaG93QW5ub3VuY2VtZW50cyh0cmFuc2FjdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3LnVwZGF0ZVNlbGVjdGlvbihyZWRyYXduLCB0cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5pc1VzZXJFdmVudChcInNlbGVjdC5wb2ludGVyXCIpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldCh0aGVtZSkgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KHRoZW1lKSlcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLm11c3RNZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgIGlmIChyZWRyYXduIHx8IGF0dHJzQ2hhbmdlZCB8fCBzY3JvbGxUYXJnZXQgfHwgdGhpcy52aWV3U3RhdGUubXVzdEVuZm9yY2VDdXJzb3JBc3NvYyB8fCB0aGlzLnZpZXdTdGF0ZS5tdXN0TWVhc3VyZUNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgIGlmICghdXBkYXRlLmVtcHR5KVxuICAgICAgICAgICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgdGhpcy5zdGF0ZS5mYWNldCh1cGRhdGVMaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcih1cGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odGhpcy5zdGF0ZSwgZSwgXCJ1cGRhdGUgbGlzdGVuZXJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcGF0Y2hGb2N1cyB8fCBkb21DaGFuZ2UpXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGlzcGF0Y2hGb2N1cyAmJiB0aGlzLnN0YXRlID09IGRpc3BhdGNoRm9jdXMuc3RhcnRTdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaChkaXNwYXRjaEZvY3VzKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9tQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXBwbHlET01DaGFuZ2UodGhpcywgZG9tQ2hhbmdlKSAmJiBwZW5kaW5nS2V5LmZvcmNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hLZXkodGhpcy5jb250ZW50RE9NLCBwZW5kaW5nS2V5LmtleSwgcGVuZGluZ0tleS5rZXlDb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVzZXQgdGhlIHZpZXcgdG8gdGhlIGdpdmVuIHN0YXRlLiAoVGhpcyB3aWxsIGNhdXNlIHRoZSBlbnRpcmVcbiAgICBkb2N1bWVudCB0byBiZSByZWRyYXduIGFuZCBhbGwgdmlldyBwbHVnaW5zIHRvIGJlIHJlaW5pdGlhbGl6ZWQsXG4gICAgc28geW91IHNob3VsZCBwcm9iYWJseSBvbmx5IHVzZSBpdCB3aGVuIHRoZSBuZXcgc3RhdGUgaXNuJ3RcbiAgICBkZXJpdmVkIGZyb20gdGhlIG9sZCBzdGF0ZS4gT3RoZXJ3aXNlLCB1c2VcbiAgICBbYGRpc3BhdGNoYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGlzcGF0Y2gpIGluc3RlYWQuKVxuICAgICovXG4gICAgc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlU3RhdGUgIT0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FsbHMgdG8gRWRpdG9yVmlldy5zZXRTdGF0ZSBhcmUgbm90IGFsbG93ZWQgd2hpbGUgYW4gdXBkYXRlIGlzIGluIHByb2dyZXNzXCIpO1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLnN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi87XG4gICAgICAgIGxldCBoYWRGb2N1cyA9IHRoaXMuaGFzRm9jdXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIHBsdWdpbi5kZXN0cm95KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUgPSBuZXcgVmlld1N0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucyA9IG5ld1N0YXRlLmZhY2V0KHZpZXdQbHVnaW4pLm1hcChzcGVjID0+IG5ldyBQbHVnaW5JbnN0YW5jZShzcGVjKSk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbk1hcC5jbGVhcigpO1xuICAgICAgICAgICAgZm9yIChsZXQgcGx1Z2luIG9mIHRoaXMucGx1Z2lucylcbiAgICAgICAgICAgICAgICBwbHVnaW4udXBkYXRlKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuZG9jVmlldyA9IG5ldyBEb2NWaWV3KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmVuc3VyZUhhbmRsZXJzKHRoaXMucGx1Z2lucyk7XG4gICAgICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUF0dHJzKCk7XG4gICAgICAgICAgICB0aGlzLmJpZGlDYWNoZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFkRm9jdXMpXG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICB9XG4gICAgdXBkYXRlUGx1Z2lucyh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHByZXZTcGVjcyA9IHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHZpZXdQbHVnaW4pLCBzcGVjcyA9IHVwZGF0ZS5zdGF0ZS5mYWNldCh2aWV3UGx1Z2luKTtcbiAgICAgICAgaWYgKHByZXZTcGVjcyAhPSBzcGVjcykge1xuICAgICAgICAgICAgbGV0IG5ld1BsdWdpbnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBwcmV2U3BlY3MuaW5kZXhPZihzcGVjKTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BsdWdpbnMucHVzaChuZXcgUGx1Z2luSW5zdGFuY2Uoc3BlYykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHRoaXMucGx1Z2luc1tmb3VuZF07XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5tdXN0VXBkYXRlID0gdXBkYXRlO1xuICAgICAgICAgICAgICAgICAgICBuZXdQbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4ubXVzdFVwZGF0ZSAhPSB1cGRhdGUpXG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5kZXN0cm95KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zID0gbmV3UGx1Z2lucztcbiAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwIG9mIHRoaXMucGx1Z2lucylcbiAgICAgICAgICAgICAgICBwLm11c3RVcGRhdGUgPSB1cGRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBsdWdpbnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnNbaV0udXBkYXRlKHRoaXMpO1xuICAgICAgICBpZiAocHJldlNwZWNzICE9IHNwZWNzKVxuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmVuc3VyZUhhbmRsZXJzKHRoaXMucGx1Z2lucyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWVhc3VyZShmbHVzaCA9IHRydWUpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5tZWFzdXJlU2NoZWR1bGVkID4gLTEpXG4gICAgICAgICAgICB0aGlzLndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLm1lYXN1cmVTY2hlZHVsZWQpO1xuICAgICAgICBpZiAodGhpcy5vYnNlcnZlci5kZWxheWVkQW5kcm9pZEtleSkge1xuICAgICAgICAgICAgdGhpcy5tZWFzdXJlU2NoZWR1bGVkID0gLTE7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZWFzdXJlU2NoZWR1bGVkID0gMDsgLy8gUHJldmVudCByZXF1ZXN0TWVhc3VyZSBjYWxscyBmcm9tIHNjaGVkdWxpbmcgYW5vdGhlciBhbmltYXRpb24gZnJhbWVcbiAgICAgICAgaWYgKGZsdXNoKVxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5mb3JjZUZsdXNoKCk7XG4gICAgICAgIGxldCB1cGRhdGVkID0gbnVsbDtcbiAgICAgICAgbGV0IHNET00gPSB0aGlzLnNjcm9sbERPTSwgc2Nyb2xsVG9wID0gc0RPTS5zY3JvbGxUb3AgKiB0aGlzLnNjYWxlWTtcbiAgICAgICAgbGV0IHsgc2Nyb2xsQW5jaG9yUG9zLCBzY3JvbGxBbmNob3JIZWlnaHQgfSA9IHRoaXMudmlld1N0YXRlO1xuICAgICAgICBpZiAoTWF0aC5hYnMoc2Nyb2xsVG9wIC0gdGhpcy52aWV3U3RhdGUuc2Nyb2xsVG9wKSA+IDEpXG4gICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgdGhpcy52aWV3U3RhdGUuc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gLTE7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChzY3JvbGxBbmNob3JIZWlnaHQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1Njcm9sbGVkVG9Cb3R0b20oc0RPTSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvclBvcyA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gdGhpcy52aWV3U3RhdGUuaGVpZ2h0TWFwLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHRoaXMudmlld1N0YXRlLnNjcm9sbEFuY2hvckF0KHNjcm9sbFRvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JQb3MgPSBibG9jay5mcm9tO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gYmxvY2sudG9wO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAxIC8qIFVwZGF0ZVN0YXRlLk1lYXN1cmluZyAqLztcbiAgICAgICAgICAgICAgICBsZXQgY2hhbmdlZCA9IHRoaXMudmlld1N0YXRlLm1lYXN1cmUodGhpcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2VkICYmICF0aGlzLm1lYXN1cmVSZXF1ZXN0cy5sZW5ndGggJiYgdGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0ID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChpID4gNSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4odGhpcy5tZWFzdXJlUmVxdWVzdHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiTWVhc3VyZSBsb29wIHJlc3RhcnRlZCBtb3JlIHRoYW4gNSB0aW1lc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiVmlld3BvcnQgZmFpbGVkIHRvIHN0YWJpbGl6ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBtZWFzdXJpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHJ1biBtZWFzdXJlIHJlcXVlc3RzIGluIHRoaXMgY3ljbGUgd2hlbiB0aGUgdmlld3BvcnQgZGlkbid0IGNoYW5nZVxuICAgICAgICAgICAgICAgIGlmICghKGNoYW5nZWQgJiA0IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnQgKi8pKVxuICAgICAgICAgICAgICAgICAgICBbdGhpcy5tZWFzdXJlUmVxdWVzdHMsIG1lYXN1cmluZ10gPSBbbWVhc3VyaW5nLCB0aGlzLm1lYXN1cmVSZXF1ZXN0c107XG4gICAgICAgICAgICAgICAgbGV0IG1lYXN1cmVkID0gbWVhc3VyaW5nLm1hcChtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLnJlYWQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih0aGlzLnN0YXRlLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCYWRNZWFzdXJlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IHVwZGF0ZSA9IFZpZXdVcGRhdGUuY3JlYXRlKHRoaXMsIHRoaXMuc3RhdGUsIFtdKSwgcmVkcmF3biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHVwZGF0ZS5mbGFncyB8PSBjaGFuZ2VkO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlZClcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQuZmxhZ3MgfD0gY2hhbmdlZDtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMiAvKiBVcGRhdGVTdGF0ZS5VcGRhdGluZyAqLztcbiAgICAgICAgICAgICAgICBpZiAoIXVwZGF0ZS5lbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBsdWdpbnModXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUF0dHJzKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlZHJhd24gPSB0aGlzLmRvY1ZpZXcudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVhc3VyaW5nLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBpZiAobWVhc3VyZWRbaV0gIT0gQmFkTWVhc3VyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbSA9IG1lYXN1cmluZ1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobS53cml0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS53cml0ZShtZWFzdXJlZFtpXSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih0aGlzLnN0YXRlLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZWRyYXduKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcudXBkYXRlU2VsZWN0aW9uKHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCAmJiB0aGlzLm1lYXN1cmVSZXF1ZXN0cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3U3RhdGUuZWRpdG9ySGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2NWaWV3LnNjcm9sbEludG9WaWV3KHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdBbmNob3JIZWlnaHQgPSBzY3JvbGxBbmNob3JQb3MgPCAwID8gdGhpcy52aWV3U3RhdGUuaGVpZ2h0TWFwLmhlaWdodCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLmxpbmVCbG9ja0F0KHNjcm9sbEFuY2hvclBvcykudG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaWZmID0gbmV3QW5jaG9ySGVpZ2h0IC0gc2Nyb2xsQW5jaG9ySGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmID4gMSB8fCBkaWZmIDwgLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wID0gc2Nyb2xsVG9wICsgZGlmZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0RPTS5zY3JvbGxUb3AgPSBzY3JvbGxUb3AgLyB0aGlzLnNjYWxlWTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovO1xuICAgICAgICAgICAgdGhpcy5tZWFzdXJlU2NoZWR1bGVkID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWQgJiYgIXVwZGF0ZWQuZW1wdHkpXG4gICAgICAgICAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiB0aGlzLnN0YXRlLmZhY2V0KHVwZGF0ZUxpc3RlbmVyKSlcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcih1cGRhdGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBDU1MgY2xhc3NlcyBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgZWRpdG9yIHRoZW1lcy5cbiAgICAqL1xuICAgIGdldCB0aGVtZUNsYXNzZXMoKSB7XG4gICAgICAgIHJldHVybiBiYXNlVGhlbWVJRCArIFwiIFwiICtcbiAgICAgICAgICAgICh0aGlzLnN0YXRlLmZhY2V0KGRhcmtUaGVtZSkgPyBiYXNlRGFya0lEIDogYmFzZUxpZ2h0SUQpICsgXCIgXCIgK1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5mYWNldCh0aGVtZSk7XG4gICAgfVxuICAgIHVwZGF0ZUF0dHJzKCkge1xuICAgICAgICBsZXQgZWRpdG9yQXR0cnMgPSBhdHRyc0Zyb21GYWNldCh0aGlzLCBlZGl0b3JBdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICBjbGFzczogXCJjbS1lZGl0b3JcIiArICh0aGlzLmhhc0ZvY3VzID8gXCIgY20tZm9jdXNlZCBcIiA6IFwiIFwiKSArIHRoaXMudGhlbWVDbGFzc2VzXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgY29udGVudEF0dHJzID0ge1xuICAgICAgICAgICAgc3BlbGxjaGVjazogXCJmYWxzZVwiLFxuICAgICAgICAgICAgYXV0b2NvcnJlY3Q6IFwib2ZmXCIsXG4gICAgICAgICAgICBhdXRvY2FwaXRhbGl6ZTogXCJvZmZcIixcbiAgICAgICAgICAgIHRyYW5zbGF0ZTogXCJub1wiLFxuICAgICAgICAgICAgY29udGVudGVkaXRhYmxlOiAhdGhpcy5zdGF0ZS5mYWNldChlZGl0YWJsZSkgPyBcImZhbHNlXCIgOiBcInRydWVcIixcbiAgICAgICAgICAgIGNsYXNzOiBcImNtLWNvbnRlbnRcIixcbiAgICAgICAgICAgIHN0eWxlOiBgJHticm93c2VyLnRhYlNpemV9OiAke3RoaXMuc3RhdGUudGFiU2l6ZX1gLFxuICAgICAgICAgICAgcm9sZTogXCJ0ZXh0Ym94XCIsXG4gICAgICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IFwidHJ1ZVwiXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnJlYWRPbmx5KVxuICAgICAgICAgICAgY29udGVudEF0dHJzW1wiYXJpYS1yZWFkb25seVwiXSA9IFwidHJ1ZVwiO1xuICAgICAgICBhdHRyc0Zyb21GYWNldCh0aGlzLCBjb250ZW50QXR0cmlidXRlcywgY29udGVudEF0dHJzKTtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSB0aGlzLm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZENvbnRlbnQgPSB1cGRhdGVBdHRycyh0aGlzLmNvbnRlbnRET00sIHRoaXMuY29udGVudEF0dHJzLCBjb250ZW50QXR0cnMpO1xuICAgICAgICAgICAgbGV0IGNoYW5nZWRFZGl0b3IgPSB1cGRhdGVBdHRycyh0aGlzLmRvbSwgdGhpcy5lZGl0b3JBdHRycywgZWRpdG9yQXR0cnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNoYW5nZWRDb250ZW50IHx8IGNoYW5nZWRFZGl0b3I7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVkaXRvckF0dHJzID0gZWRpdG9yQXR0cnM7XG4gICAgICAgIHRoaXMuY29udGVudEF0dHJzID0gY29udGVudEF0dHJzO1xuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG4gICAgc2hvd0Fubm91bmNlbWVudHModHJzKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHRycylcbiAgICAgICAgICAgIGZvciAobGV0IGVmZmVjdCBvZiB0ci5lZmZlY3RzKVxuICAgICAgICAgICAgICAgIGlmIChlZmZlY3QuaXMoRWRpdG9yVmlldy5hbm5vdW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdW5jZURPTS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXYgPSB0aGlzLmFubm91bmNlRE9NLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICAgICAgICAgICAgICBkaXYudGV4dENvbnRlbnQgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgIH1cbiAgICBtb3VudFN0eWxlcygpIHtcbiAgICAgICAgdGhpcy5zdHlsZU1vZHVsZXMgPSB0aGlzLnN0YXRlLmZhY2V0KHN0eWxlTW9kdWxlKTtcbiAgICAgICAgbGV0IG5vbmNlID0gdGhpcy5zdGF0ZS5mYWNldChFZGl0b3JWaWV3LmNzcE5vbmNlKTtcbiAgICAgICAgU3R5bGVNb2R1bGUubW91bnQodGhpcy5yb290LCB0aGlzLnN0eWxlTW9kdWxlcy5jb25jYXQoYmFzZVRoZW1lJDEpLnJldmVyc2UoKSwgbm9uY2UgPyB7IG5vbmNlIH0gOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZWFkTWVhc3VyZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZVN0YXRlID09IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFkaW5nIHRoZSBlZGl0b3IgbGF5b3V0IGlzbid0IGFsbG93ZWQgZHVyaW5nIGFuIHVwZGF0ZVwiKTtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlU3RhdGUgPT0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovICYmIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA+IC0xKVxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlKGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2NoZWR1bGUgYSBsYXlvdXQgbWVhc3VyZW1lbnQsIG9wdGlvbmFsbHkgcHJvdmlkaW5nIGNhbGxiYWNrcyB0b1xuICAgIGRvIGN1c3RvbSBET00gbWVhc3VyaW5nIGZvbGxvd2VkIGJ5IGEgRE9NIHdyaXRlIHBoYXNlLiBVc2luZ1xuICAgIHRoaXMgaXMgcHJlZmVyYWJsZSByZWFkaW5nIERPTSBsYXlvdXQgZGlyZWN0bHkgZnJvbSwgZm9yXG4gICAgZXhhbXBsZSwgYW4gZXZlbnQgaGFuZGxlciwgYmVjYXVzZSBpdCdsbCBtYWtlIHN1cmUgbWVhc3VyaW5nIGFuZFxuICAgIGRyYXdpbmcgZG9uZSBieSBvdGhlciBjb21wb25lbnRzIGlzIHN5bmNocm9uaXplZCwgYXZvaWRpbmdcbiAgICB1bm5lY2Vzc2FyeSBET00gbGF5b3V0IGNvbXB1dGF0aW9ucy5cbiAgICAqL1xuICAgIHJlcXVlc3RNZWFzdXJlKHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVNjaGVkdWxlZCA8IDApXG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSB0aGlzLndpbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5tZWFzdXJlKCkpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWVhc3VyZVJlcXVlc3RzLmluZGV4T2YocmVxdWVzdCkgPiAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5rZXkgIT0gbnVsbClcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lYXN1cmVSZXF1ZXN0c1tpXS5rZXkgPT09IHJlcXVlc3Qua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVSZXF1ZXN0c1tpXSA9IHJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVSZXF1ZXN0cy5wdXNoKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBwbHVnaW4sIGlmIHByZXNlbnQuIE5vdGUgdGhhdFxuICAgIHBsdWdpbnMgdGhhdCBjcmFzaCBjYW4gYmUgZHJvcHBlZCBmcm9tIGEgdmlldywgc28gZXZlbiB3aGVuIHlvdVxuICAgIGtub3cgeW91IHJlZ2lzdGVyZWQgYSBnaXZlbiBwbHVnaW4sIGl0IGlzIHJlY29tbWVuZGVkIHRvIGNoZWNrXG4gICAgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZC5cbiAgICAqL1xuICAgIHBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgbGV0IGtub3duID0gdGhpcy5wbHVnaW5NYXAuZ2V0KHBsdWdpbik7XG4gICAgICAgIGlmIChrbm93biA9PT0gdW5kZWZpbmVkIHx8IGtub3duICYmIGtub3duLnNwZWMgIT0gcGx1Z2luKVxuICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXAuc2V0KHBsdWdpbiwga25vd24gPSB0aGlzLnBsdWdpbnMuZmluZChwID0+IHAuc3BlYyA9PSBwbHVnaW4pIHx8IG51bGwpO1xuICAgICAgICByZXR1cm4ga25vd24gJiYga25vd24udXBkYXRlKHRoaXMpLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBkb2N1bWVudCwgaW4gc2NyZWVuIGNvb3JkaW5hdGVzLiBUaGlzXG4gICAgbWF5IGJlIG5lZ2F0aXZlIHdoZW4gdGhlIGVkaXRvciBpcyBzY3JvbGxlZCBkb3duLiBQb2ludHNcbiAgICBkaXJlY3RseSB0byB0aGUgdG9wIG9mIHRoZSBmaXJzdCBsaW5lLCBub3QgYWJvdmUgdGhlIHBhZGRpbmcuXG4gICAgKi9cbiAgICBnZXQgZG9jdW1lbnRUb3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy52aWV3U3RhdGUucGFkZGluZ1RvcDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwb3J0cyB0aGUgcGFkZGluZyBhYm92ZSBhbmQgYmVsb3cgdGhlIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IGRvY3VtZW50UGFkZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHsgdG9wOiB0aGlzLnZpZXdTdGF0ZS5wYWRkaW5nVG9wLCBib3R0b206IHRoaXMudmlld1N0YXRlLnBhZGRpbmdCb3R0b20gfTtcbiAgICB9XG4gICAgLyoqXG4gICAgSWYgdGhlIGVkaXRvciBpcyB0cmFuc2Zvcm1lZCB3aXRoIENTUywgdGhpcyBwcm92aWRlcyB0aGUgc2NhbGVcbiAgICBhbG9uZyB0aGUgWCBheGlzLiBPdGhlcndpc2UsIGl0IHdpbGwganVzdCBiZSAxLiBOb3RlIHRoYXRcbiAgICB0cmFuc2Zvcm1zIG90aGVyIHRoYW4gdHJhbnNsYXRpb24gYW5kIHNjYWxpbmcgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgKi9cbiAgICBnZXQgc2NhbGVYKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuc2NhbGVYOyB9XG4gICAgLyoqXG4gICAgUHJvdmlkZSB0aGUgQ1NTIHRyYW5zZm9ybWVkIHNjYWxlIGFsb25nIHRoZSBZIGF4aXMuXG4gICAgKi9cbiAgICBnZXQgc2NhbGVZKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuc2NhbGVZOyB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgdGV4dCBsaW5lIG9yIGJsb2NrIHdpZGdldCBhdCB0aGUgZ2l2ZW4gdmVydGljYWxcbiAgICBwb3NpdGlvbiAod2hpY2ggaXMgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIFt0b3Agb2YgdGhlXG4gICAgZG9jdW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRvY3VtZW50VG9wKSkuXG4gICAgKi9cbiAgICBlbGVtZW50QXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMucmVhZE1lYXN1cmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdTdGF0ZS5lbGVtZW50QXRIZWlnaHQoaGVpZ2h0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgbGluZSBibG9jayAoc2VlXG4gICAgW2BsaW5lQmxvY2tBdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmxpbmVCbG9ja0F0KSBhdCB0aGUgZ2l2ZW5cbiAgICBoZWlnaHQsIGFnYWluIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBbdG9wIG9mIHRoZVxuICAgIGRvY3VtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kb2N1bWVudFRvcCkuXG4gICAgKi9cbiAgICBsaW5lQmxvY2tBdEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmxpbmVCbG9ja0F0SGVpZ2h0KGhlaWdodCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgZXh0ZW50IGFuZCB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiBhbGwgW2xpbmVcbiAgICBibG9ja3NdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmxpbmVCbG9ja0F0KSBpbiB0aGUgdmlld3BvcnQuIFBvc2l0aW9uc1xuICAgIGFyZSByZWxhdGl2ZSB0byB0aGUgW3RvcCBvZiB0aGVcbiAgICBkb2N1bWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZG9jdW1lbnRUb3ApO1xuICAgICovXG4gICAgZ2V0IHZpZXdwb3J0TGluZUJsb2NrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLnZpZXdwb3J0TGluZXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGxpbmUgYmxvY2sgYXJvdW5kIHRoZSBnaXZlbiBkb2N1bWVudCBwb3NpdGlvbi4gQSBsaW5lXG4gICAgYmxvY2sgaXMgYSByYW5nZSBkZWxpbWl0ZWQgb24gYm90aCBzaWRlcyBieSBlaXRoZXIgYVxuICAgIG5vbi1baGlkZGVuXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvbl5yZXBsYWNlKSBsaW5lIGJyZWFrcywgb3IgdGhlXG4gICAgc3RhcnQvZW5kIG9mIHRoZSBkb2N1bWVudC4gSXQgd2lsbCB1c3VhbGx5IGp1c3QgaG9sZCBhIGxpbmUgb2ZcbiAgICB0ZXh0LCBidXQgbWF5IGJlIGJyb2tlbiBpbnRvIG11bHRpcGxlIHRleHRibG9ja3MgYnkgYmxvY2tcbiAgICB3aWRnZXRzLlxuICAgICovXG4gICAgbGluZUJsb2NrQXQocG9zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdTdGF0ZS5saW5lQmxvY2tBdChwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZWRpdG9yJ3MgdG90YWwgY29udGVudCBoZWlnaHQuXG4gICAgKi9cbiAgICBnZXQgY29udGVudEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmNvbnRlbnRIZWlnaHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYSBjdXJzb3IgcG9zaXRpb24gYnkgW2dyYXBoZW1lXG4gICAgY2x1c3Rlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5maW5kQ2x1c3RlckJyZWFrKS4gYGZvcndhcmRgIGRldGVybWluZXMgd2hldGhlclxuICAgIHRoZSBtb3Rpb24gaXMgYXdheSBmcm9tIHRoZSBsaW5lIHN0YXJ0LCBvciB0b3dhcmRzIGl0LiBJblxuICAgIGJpZGlyZWN0aW9uYWwgdGV4dCwgdGhlIGxpbmUgaXMgdHJhdmVyc2VkIGluIHZpc3VhbCBvcmRlciwgdXNpbmdcbiAgICB0aGUgZWRpdG9yJ3MgW3RleHQgZGlyZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy50ZXh0RGlyZWN0aW9uKS5cbiAgICBXaGVuIHRoZSBzdGFydCBwb3NpdGlvbiB3YXMgdGhlIGxhc3Qgb25lIG9uIHRoZSBsaW5lLCB0aGVcbiAgICByZXR1cm5lZCBwb3NpdGlvbiB3aWxsIGJlIGFjcm9zcyB0aGUgbGluZSBicmVhay4gSWYgdGhlcmUgaXMgbm9cbiAgICBmdXJ0aGVyIGxpbmUsIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBpcyByZXR1cm5lZC5cbiAgICBcbiAgICBCeSBkZWZhdWx0LCB0aGlzIG1ldGhvZCBtb3ZlcyBvdmVyIGEgc2luZ2xlIGNsdXN0ZXIuIFRoZVxuICAgIG9wdGlvbmFsIGBieWAgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gbW92ZSBhY3Jvc3MgbW9yZS4gSXQgd2lsbFxuICAgIGJlIGNhbGxlZCB3aXRoIHRoZSBmaXJzdCBjbHVzdGVyIGFzIGFyZ3VtZW50LCBhbmQgc2hvdWxkIHJldHVyblxuICAgIGEgcHJlZGljYXRlIHRoYXQgZGV0ZXJtaW5lcywgZm9yIGVhY2ggc3Vic2VxdWVudCBjbHVzdGVyLFxuICAgIHdoZXRoZXIgaXQgc2hvdWxkIGFsc28gYmUgbW92ZWQgb3Zlci5cbiAgICAqL1xuICAgIG1vdmVCeUNoYXIoc3RhcnQsIGZvcndhcmQsIGJ5KSB7XG4gICAgICAgIHJldHVybiBza2lwQXRvbXModGhpcywgc3RhcnQsIG1vdmVCeUNoYXIodGhpcywgc3RhcnQsIGZvcndhcmQsIGJ5KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYSBjdXJzb3IgcG9zaXRpb24gYWNyb3NzIHRoZSBuZXh0IGdyb3VwIG9mIGVpdGhlclxuICAgIFtsZXR0ZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmNoYXJDYXRlZ29yaXplcikgb3Igbm9uLWxldHRlclxuICAgIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMuXG4gICAgKi9cbiAgICBtb3ZlQnlHcm91cChzdGFydCwgZm9yd2FyZCkge1xuICAgICAgICByZXR1cm4gc2tpcEF0b21zKHRoaXMsIHN0YXJ0LCBtb3ZlQnlDaGFyKHRoaXMsIHN0YXJ0LCBmb3J3YXJkLCBpbml0aWFsID0+IGJ5R3JvdXAodGhpcywgc3RhcnQuaGVhZCwgaW5pdGlhbCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdmlzdWFsbHkgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIGxpbmUuXG4gICAgTm90ZSB0aGF0IHRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBfbG9naWNhbF8gcG9zaXRpb24gYXQgaXRzXG4gICAgc3RhcnQgb3IgZW5kICh3aGljaCBpcyBzaW1wbHkgYXQgYGxpbmUuZnJvbWAvYGxpbmUudG9gKSBpZiB0ZXh0XG4gICAgYXQgdGhlIHN0YXJ0IG9yIGVuZCBnb2VzIGFnYWluc3QgdGhlIGxpbmUncyBiYXNlIHRleHQgZGlyZWN0aW9uLlxuICAgICovXG4gICAgdmlzdWFsTGluZVNpZGUobGluZSwgZW5kKSB7XG4gICAgICAgIGxldCBvcmRlciA9IHRoaXMuYmlkaVNwYW5zKGxpbmUpLCBkaXIgPSB0aGlzLnRleHREaXJlY3Rpb25BdChsaW5lLmZyb20pO1xuICAgICAgICBsZXQgc3BhbiA9IG9yZGVyW2VuZCA/IG9yZGVyLmxlbmd0aCAtIDEgOiAwXTtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3Ioc3Bhbi5zaWRlKGVuZCwgZGlyKSArIGxpbmUuZnJvbSwgc3Bhbi5mb3J3YXJkKCFlbmQsIGRpcikgPyAxIDogLTEpO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBuZXh0IGxpbmUgYm91bmRhcnkgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbi4gSWZcbiAgICBgaW5jbHVkZVdyYXBgIGlzIHRydWUsIGxpbmUgd3JhcHBpbmcgaXMgb24sIGFuZCB0aGVyZSBpcyBhXG4gICAgZnVydGhlciB3cmFwIHBvaW50IG9uIHRoZSBjdXJyZW50IGxpbmUsIHRoZSB3cmFwIHBvaW50IHdpbGwgYmVcbiAgICByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHN0YXJ0IG9yIGVuZFxuICAgIG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgbW92ZVRvTGluZUJvdW5kYXJ5KHN0YXJ0LCBmb3J3YXJkLCBpbmNsdWRlV3JhcCA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIG1vdmVUb0xpbmVCb3VuZGFyeSh0aGlzLCBzdGFydCwgZm9yd2FyZCwgaW5jbHVkZVdyYXApO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIGEgY3Vyc29yIHBvc2l0aW9uIHZlcnRpY2FsbHkuIFdoZW4gYGRpc3RhbmNlYCBpc24ndCBnaXZlbixcbiAgICBpdCBkZWZhdWx0cyB0byBtb3ZpbmcgdG8gdGhlIG5leHQgbGluZSAoaW5jbHVkaW5nIHdyYXBwZWRcbiAgICBsaW5lcykuIE90aGVyd2lzZSwgYGRpc3RhbmNlYCBzaG91bGQgcHJvdmlkZSBhIHBvc2l0aXZlIGRpc3RhbmNlXG4gICAgaW4gcGl4ZWxzLlxuICAgIFxuICAgIFdoZW4gYHN0YXJ0YCBoYXMgYVxuICAgIFtgZ29hbENvbHVtbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uUmFuZ2UuZ29hbENvbHVtbiksIHRoZSB2ZXJ0aWNhbFxuICAgIG1vdGlvbiB3aWxsIHVzZSB0aGF0IGFzIGEgdGFyZ2V0IGhvcml6b250YWwgcG9zaXRpb24uIE90aGVyd2lzZSxcbiAgICB0aGUgY3Vyc29yJ3Mgb3duIGhvcml6b250YWwgcG9zaXRpb24gaXMgdXNlZC4gVGhlIHJldHVybmVkXG4gICAgY3Vyc29yIHdpbGwgaGF2ZSBpdHMgZ29hbCBjb2x1bW4gc2V0IHRvIHdoaWNoZXZlciBjb2x1bW4gd2FzXG4gICAgdXNlZC5cbiAgICAqL1xuICAgIG1vdmVWZXJ0aWNhbGx5KHN0YXJ0LCBmb3J3YXJkLCBkaXN0YW5jZSkge1xuICAgICAgICByZXR1cm4gc2tpcEF0b21zKHRoaXMsIHN0YXJ0LCBtb3ZlVmVydGljYWxseSh0aGlzLCBzdGFydCwgZm9yd2FyZCwgZGlzdGFuY2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgRE9NIHBhcmVudCBub2RlIGFuZCBvZmZzZXQgKGNoaWxkIG9mZnNldCBpZiBgbm9kZWAgaXNcbiAgICBhbiBlbGVtZW50LCBjaGFyYWN0ZXIgb2Zmc2V0IHdoZW4gaXQgaXMgYSB0ZXh0IG5vZGUpIGF0IHRoZVxuICAgIGdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLlxuICAgIFxuICAgIE5vdGUgdGhhdCBmb3IgcG9zaXRpb25zIHRoYXQgYXJlbid0IGN1cnJlbnRseSBpblxuICAgIGB2aXNpYmxlUmFuZ2VzYCwgdGhlIHJlc3VsdGluZyBET00gcG9zaXRpb24gaXNuJ3QgbmVjZXNzYXJpbHlcbiAgICBtZWFuaW5nZnVsIChpdCBtYXkganVzdCBwb2ludCBiZWZvcmUgb3IgYWZ0ZXIgYSBwbGFjZWhvbGRlclxuICAgIGVsZW1lbnQpLlxuICAgICovXG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY1ZpZXcuZG9tQXRQb3MocG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZG9jdW1lbnQgcG9zaXRpb24gYXQgdGhlIGdpdmVuIERPTSBub2RlLiBDYW4gYmUgdXNlZnVsXG4gICAgZm9yIGFzc29jaWF0aW5nIHBvc2l0aW9ucyB3aXRoIERPTSBldmVudHMuIFdpbGwgcmFpc2UgYW4gZXJyb3JcbiAgICB3aGVuIGBub2RlYCBpc24ndCBwYXJ0IG9mIHRoZSBlZGl0b3IgY29udGVudC5cbiAgICAqL1xuICAgIHBvc0F0RE9NKG5vZGUsIG9mZnNldCA9IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5wb3NGcm9tRE9NKG5vZGUsIG9mZnNldCk7XG4gICAgfVxuICAgIHBvc0F0Q29vcmRzKGNvb3JkcywgcHJlY2lzZSA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHBvc0F0Q29vcmRzKHRoaXMsIGNvb3JkcywgcHJlY2lzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgc2NyZWVuIGNvb3JkaW5hdGVzIGF0IHRoZSBnaXZlbiBkb2N1bWVudCBwb3NpdGlvbi5cbiAgICBgc2lkZWAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb29yZGluYXRlcyBhcmUgYmFzZWQgb24gdGhlXG4gICAgZWxlbWVudCBiZWZvcmUgKC0xKSBvciBhZnRlciAoMSkgdGhlIHBvc2l0aW9uIChpZiBubyBlbGVtZW50IGlzXG4gICAgYXZhaWxhYmxlIG9uIHRoZSBnaXZlbiBzaWRlLCB0aGUgbWV0aG9kIHdpbGwgdHJhbnNwYXJlbnRseSB1c2VcbiAgICBhbm90aGVyIHN0cmF0ZWd5IHRvIGdldCByZWFzb25hYmxlIGNvb3JkaW5hdGVzKS5cbiAgICAqL1xuICAgIGNvb3Jkc0F0UG9zKHBvcywgc2lkZSA9IDEpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgbGV0IHJlY3QgPSB0aGlzLmRvY1ZpZXcuY29vcmRzQXQocG9zLCBzaWRlKTtcbiAgICAgICAgaWYgKCFyZWN0IHx8IHJlY3QubGVmdCA9PSByZWN0LnJpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5zdGF0ZS5kb2MubGluZUF0KHBvcyksIG9yZGVyID0gdGhpcy5iaWRpU3BhbnMobGluZSk7XG4gICAgICAgIGxldCBzcGFuID0gb3JkZXJbQmlkaVNwYW4uZmluZChvcmRlciwgcG9zIC0gbGluZS5mcm9tLCAtMSwgc2lkZSldO1xuICAgICAgICByZXR1cm4gZmxhdHRlblJlY3QocmVjdCwgKHNwYW4uZGlyID09IERpcmVjdGlvbi5MVFIpID09IChzaWRlID4gMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gdGhlIHJlY3RhbmdsZSBhcm91bmQgYSBnaXZlbiBjaGFyYWN0ZXIuIElmIGBwb3NgIGRvZXMgbm90XG4gICAgcG9pbnQgaW4gZnJvbnQgb2YgYSBjaGFyYWN0ZXIgdGhhdCBpcyBpbiB0aGUgdmlld3BvcnQgYW5kXG4gICAgcmVuZGVyZWQgKGkuZS4gbm90IHJlcGxhY2VkLCBub3QgYSBsaW5lIGJyZWFrKSwgdGhpcyB3aWxsIHJldHVyblxuICAgIG51bGwuIEZvciBzcGFjZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIGEgbGluZSB3cmFwIHBvaW50LCB0aGlzIHdpbGxcbiAgICByZXR1cm4gdGhlIHBvc2l0aW9uIGJlZm9yZSB0aGUgbGluZSBicmVhay5cbiAgICAqL1xuICAgIGNvb3Jkc0ZvckNoYXIocG9zKSB7XG4gICAgICAgIHRoaXMucmVhZE1lYXN1cmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY1ZpZXcuY29vcmRzRm9yQ2hhcihwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZGVmYXVsdCB3aWR0aCBvZiBhIGNoYXJhY3RlciBpbiB0aGUgZWRpdG9yLiBNYXkgbm90XG4gICAgYWNjdXJhdGVseSByZWZsZWN0IHRoZSB3aWR0aCBvZiBhbGwgY2hhcmFjdGVycyAoZ2l2ZW4gdmFyaWFibGVcbiAgICB3aWR0aCBmb250cyBvciBzdHlsaW5nIG9mIGludmlkaWR1YWwgcmFuZ2VzKS5cbiAgICAqL1xuICAgIGdldCBkZWZhdWx0Q2hhcmFjdGVyV2lkdGgoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUuY2hhcldpZHRoOyB9XG4gICAgLyoqXG4gICAgVGhlIGRlZmF1bHQgaGVpZ2h0IG9mIGEgbGluZSBpbiB0aGUgZWRpdG9yLiBNYXkgbm90IGJlIGFjY3VyYXRlXG4gICAgZm9yIGFsbCBsaW5lcy5cbiAgICAqL1xuICAgIGdldCBkZWZhdWx0TGluZUhlaWdodCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmhlaWdodE9yYWNsZS5saW5lSGVpZ2h0OyB9XG4gICAgLyoqXG4gICAgVGhlIHRleHQgZGlyZWN0aW9uXG4gICAgKFtgZGlyZWN0aW9uYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2RpcmVjdGlvbilcbiAgICBDU1MgcHJvcGVydHkpIG9mIHRoZSBlZGl0b3IncyBjb250ZW50IGVsZW1lbnQuXG4gICAgKi9cbiAgICBnZXQgdGV4dERpcmVjdGlvbigpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmRlZmF1bHRUZXh0RGlyZWN0aW9uOyB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgdGV4dCBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgYXNcbiAgICBhc3NpZ25lZCBieSBDU1MuIElmXG4gICAgW2BwZXJMaW5lVGV4dERpcmVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnBlckxpbmVUZXh0RGlyZWN0aW9uKVxuICAgIGlzbid0IGVuYWJsZWQsIG9yIHRoZSBnaXZlbiBwb3NpdGlvbiBpcyBvdXRzaWRlIG9mIHRoZSB2aWV3cG9ydCxcbiAgICB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBhc1xuICAgIFtgdGV4dERpcmVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pLiBOb3RlIHRoYXRcbiAgICB0aGlzIG1heSB0cmlnZ2VyIGEgRE9NIGxheW91dC5cbiAgICAqL1xuICAgIHRleHREaXJlY3Rpb25BdChwb3MpIHtcbiAgICAgICAgbGV0IHBlckxpbmUgPSB0aGlzLnN0YXRlLmZhY2V0KHBlckxpbmVUZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKCFwZXJMaW5lIHx8IHBvcyA8IHRoaXMudmlld3BvcnQuZnJvbSB8fCBwb3MgPiB0aGlzLnZpZXdwb3J0LnRvKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dERpcmVjdGlvbjtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy50ZXh0RGlyZWN0aW9uQXQocG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGlzIGVkaXRvciBbd3JhcHMgbGluZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmxpbmVXcmFwcGluZylcbiAgICAoYXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAgICBbYHdoaXRlLXNwYWNlYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3doaXRlLXNwYWNlKVxuICAgIENTUyBwcm9wZXJ0eSBvZiBpdHMgY29udGVudCBlbGVtZW50KS5cbiAgICAqL1xuICAgIGdldCBsaW5lV3JhcHBpbmcoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGUgYmlkaXJlY3Rpb25hbCB0ZXh0IHN0cnVjdHVyZSBvZiB0aGUgZ2l2ZW4gbGluZVxuICAgICh3aGljaCBzaG91bGQgYmUgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQpIGFzIGFuIGFycmF5IG9mIHNwYW5cbiAgICBvYmplY3RzLiBUaGUgb3JkZXIgb2YgdGhlc2Ugc3BhbnMgbWF0Y2hlcyB0aGUgW3RleHRcbiAgICBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pXHUyMDE0aWYgdGhhdCBpc1xuICAgIGxlZnQtdG8tcmlnaHQsIHRoZSBsZWZ0bW9zdCBzcGFucyBjb21lIGZpcnN0LCBvdGhlcndpc2UgdGhlXG4gICAgcmlnaHRtb3N0IHNwYW5zIGNvbWUgZmlyc3QuXG4gICAgKi9cbiAgICBiaWRpU3BhbnMobGluZSkge1xuICAgICAgICBpZiAobGluZS5sZW5ndGggPiBNYXhCaWRpTGluZSlcbiAgICAgICAgICAgIHJldHVybiB0cml2aWFsT3JkZXIobGluZS5sZW5ndGgpO1xuICAgICAgICBsZXQgZGlyID0gdGhpcy50ZXh0RGlyZWN0aW9uQXQobGluZS5mcm9tKSwgaXNvbGF0ZXM7XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHRoaXMuYmlkaUNhY2hlKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuZnJvbSA9PSBsaW5lLmZyb20gJiYgZW50cnkuZGlyID09IGRpciAmJlxuICAgICAgICAgICAgICAgIChlbnRyeS5mcmVzaCB8fCBpc29sYXRlc0VxKGVudHJ5Lmlzb2xhdGVzLCBpc29sYXRlcyA9IGdldElzb2xhdGVkUmFuZ2VzKHRoaXMsIGxpbmUpKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm9yZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNvbGF0ZXMpXG4gICAgICAgICAgICBpc29sYXRlcyA9IGdldElzb2xhdGVkUmFuZ2VzKHRoaXMsIGxpbmUpO1xuICAgICAgICBsZXQgb3JkZXIgPSBjb21wdXRlT3JkZXIobGluZS50ZXh0LCBkaXIsIGlzb2xhdGVzKTtcbiAgICAgICAgdGhpcy5iaWRpQ2FjaGUucHVzaChuZXcgQ2FjaGVkT3JkZXIobGluZS5mcm9tLCBsaW5lLnRvLCBkaXIsIGlzb2xhdGVzLCB0cnVlLCBvcmRlcikpO1xuICAgICAgICByZXR1cm4gb3JkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIHdoZXRoZXIgdGhlIGVkaXRvciBoYXMgZm9jdXMuXG4gICAgKi9cbiAgICBnZXQgaGFzRm9jdXMoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gU2FmYXJpIHJldHVybiBmYWxzZSBmb3IgaGFzRm9jdXMgd2hlbiB0aGUgY29udGV4dCBtZW51IGlzIG9wZW5cbiAgICAgICAgLy8gb3IgY2xvc2luZywgd2hpY2ggbGVhZHMgdXMgdG8gaWdub3JlIHNlbGVjdGlvbiBjaGFuZ2VzIGZyb20gdGhlXG4gICAgICAgIC8vIGNvbnRleHQgbWVudSBiZWNhdXNlIGl0IGxvb2tzIGxpa2UgdGhlIGVkaXRvciBpc24ndCBmb2N1c2VkLlxuICAgICAgICAvLyBUaGlzIGtsdWRnZXMgYXJvdW5kIHRoYXQuXG4gICAgICAgIHJldHVybiAodGhpcy5kb20ub3duZXJEb2N1bWVudC5oYXNGb2N1cygpIHx8IGJyb3dzZXIuc2FmYXJpICYmICgoX2EgPSB0aGlzLmlucHV0U3RhdGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYXN0Q29udGV4dE1lbnUpID4gRGF0ZS5ub3coKSAtIDNlNCkgJiZcbiAgICAgICAgICAgIHRoaXMucm9vdC5hY3RpdmVFbGVtZW50ID09IHRoaXMuY29udGVudERPTTtcbiAgICB9XG4gICAgLyoqXG4gICAgUHV0IGZvY3VzIG9uIHRoZSBlZGl0b3IuXG4gICAgKi9cbiAgICBmb2N1cygpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgZm9jdXNQcmV2ZW50U2Nyb2xsKHRoaXMuY29udGVudERPTSk7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcudXBkYXRlU2VsZWN0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIFtyb290XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvIyN2aWV3LkVkaXRvclZpZXdDb25maWcucm9vdCkgaW4gd2hpY2ggdGhlIGVkaXRvciBsaXZlcy4gVGhpcyBpcyBvbmx5XG4gICAgbmVjZXNzYXJ5IHdoZW4gbW92aW5nIHRoZSBlZGl0b3IncyBleGlzdGluZyBET00gdG8gYSBuZXcgd2luZG93IG9yIHNoYWRvdyByb290LlxuICAgICovXG4gICAgc2V0Um9vdChyb290KSB7XG4gICAgICAgIGlmICh0aGlzLl9yb290ICE9IHJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSByb290O1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5zZXRXaW5kb3coKHJvb3Qubm9kZVR5cGUgPT0gOSA/IHJvb3QgOiByb290Lm93bmVyRG9jdW1lbnQpLmRlZmF1bHRWaWV3IHx8IHdpbmRvdyk7XG4gICAgICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ2xlYW4gdXAgdGhpcyBlZGl0b3IgdmlldywgcmVtb3ZpbmcgaXRzIGVsZW1lbnQgZnJvbSB0aGVcbiAgICBkb2N1bWVudCwgdW5yZWdpc3RlcmluZyBldmVudCBoYW5kbGVycywgYW5kIG5vdGlmeWluZ1xuICAgIHBsdWdpbnMuIFRoZSB2aWV3IGluc3RhbmNlIGNhbiBubyBsb25nZXIgYmUgdXNlZCBhZnRlclxuICAgIGNhbGxpbmcgdGhpcy5cbiAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICBwbHVnaW4uZGVzdHJveSh0aGlzKTtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gW107XG4gICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZG9jVmlldy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLm9ic2VydmVyLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVNjaGVkdWxlZCA+IC0xKVxuICAgICAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5tZWFzdXJlU2NoZWR1bGVkKTtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGFuIGVmZmVjdCB0aGF0IGNhbiBiZVxuICAgIFthZGRlZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZWZmZWN0cykgdG8gYSB0cmFuc2FjdGlvbiB0b1xuICAgIGNhdXNlIGl0IHRvIHNjcm9sbCB0aGUgZ2l2ZW4gcG9zaXRpb24gb3IgcmFuZ2UgaW50byB2aWV3LlxuICAgICovXG4gICAgc3RhdGljIHNjcm9sbEludG9WaWV3KHBvcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBzY3JvbGxJbnRvVmlldy5vZihuZXcgU2Nyb2xsVGFyZ2V0KHR5cGVvZiBwb3MgPT0gXCJudW1iZXJcIiA/IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zKSA6IHBvcywgb3B0aW9ucy55LCBvcHRpb25zLngsIG9wdGlvbnMueU1hcmdpbiwgb3B0aW9ucy54TWFyZ2luKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhbiBlZmZlY3QgdGhhdCByZXNldHMgdGhlIGVkaXRvciB0byBpdHMgY3VycmVudCAoYXQgdGhlXG4gICAgdGltZSB0aGlzIG1ldGhvZCB3YXMgY2FsbGVkKSBzY3JvbGwgcG9zaXRpb24uIE5vdGUgdGhhdCB0aGlzXG4gICAgb25seSBhZmZlY3RzIHRoZSBlZGl0b3IncyBvd24gc2Nyb2xsYWJsZSBlbGVtZW50LCBub3QgcGFyZW50cy5cbiAgICBTZWUgYWxzb1xuICAgIFtgRWRpdG9yVmlld0NvbmZpZy5zY3JvbGxUb2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Q29uZmlnLnNjcm9sbFRvKS5cbiAgICBcbiAgICBUaGUgZWZmZWN0IHNob3VsZCBiZSB1c2VkIHdpdGggYSBkb2N1bWVudCBpZGVudGljYWwgdG8gdGhlIG9uZVxuICAgIGl0IHdhcyBjcmVhdGVkIGZvci4gRmFpbGluZyB0byBkbyBzbyBpcyBub3QgYW4gZXJyb3IsIGJ1dCBtYXlcbiAgICBub3Qgc2Nyb2xsIHRvIHRoZSBleHBlY3RlZCBwb3NpdGlvbi4gWW91IGNhblxuICAgIFttYXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3QubWFwKSB0aGUgZWZmZWN0IHRvIGFjY291bnQgZm9yIGNoYW5nZXMuXG4gICAgKi9cbiAgICBzY3JvbGxTbmFwc2hvdCgpIHtcbiAgICAgICAgbGV0IHsgc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0IH0gPSB0aGlzLnNjcm9sbERPTTtcbiAgICAgICAgbGV0IHJlZiA9IHRoaXMudmlld1N0YXRlLnNjcm9sbEFuY2hvckF0KHNjcm9sbFRvcCk7XG4gICAgICAgIHJldHVybiBzY3JvbGxJbnRvVmlldy5vZihuZXcgU2Nyb2xsVGFyZ2V0KEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocmVmLmZyb20pLCBcInN0YXJ0XCIsIFwic3RhcnRcIiwgcmVmLnRvcCAtIHNjcm9sbFRvcCwgc2Nyb2xsTGVmdCwgdHJ1ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGFkZCBET00gZXZlbnQgaGFuZGxlcnMuXG4gICAgVGhlIHZhbHVlIHNob3VsZCBiZSBhbiBvYmplY3QgbWFwcGluZyBldmVudCBuYW1lcyB0byBoYW5kbGVyXG4gICAgZnVuY3Rpb25zLiBGb3IgYW55IGdpdmVuIGV2ZW50LCBzdWNoIGZ1bmN0aW9ucyBhcmUgb3JkZXJlZCBieVxuICAgIGV4dGVuc2lvbiBwcmVjZWRlbmNlLCBhbmQgdGhlIGZpcnN0IGhhbmRsZXIgdG8gcmV0dXJuIHRydWUgd2lsbFxuICAgIGJlIGFzc3VtZWQgdG8gaGF2ZSBoYW5kbGVkIHRoYXQgZXZlbnQsIGFuZCBubyBvdGhlciBoYW5kbGVycyBvclxuICAgIGJ1aWx0LWluIGJlaGF2aW9yIHdpbGwgYmUgYWN0aXZhdGVkIGZvciBpdC4gVGhlc2UgYXJlIHJlZ2lzdGVyZWRcbiAgICBvbiB0aGUgW2NvbnRlbnQgZWxlbWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuY29udGVudERPTSksIGV4Y2VwdFxuICAgIGZvciBgc2Nyb2xsYCBoYW5kbGVycywgd2hpY2ggd2lsbCBiZSBjYWxsZWQgYW55IHRpbWUgdGhlXG4gICAgZWRpdG9yJ3MgW3Njcm9sbCBlbGVtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5zY3JvbGxET00pIG9yIG9uZSBvZlxuICAgIGl0cyBwYXJlbnQgbm9kZXMgaXMgc2Nyb2xsZWQuXG4gICAgKi9cbiAgICBzdGF0aWMgZG9tRXZlbnRIYW5kbGVycyhoYW5kbGVycykge1xuICAgICAgICByZXR1cm4gVmlld1BsdWdpbi5kZWZpbmUoKCkgPT4gKHt9KSwgeyBldmVudEhhbmRsZXJzOiBoYW5kbGVycyB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IHJlZ2lzdGVycyBET00gZXZlbnQgb2JzZXJ2ZXJzLiBDb250cmFyeVxuICAgIHRvIGV2ZW50IFtoYW5kbGVyc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeZG9tRXZlbnRIYW5kbGVycyksXG4gICAgb2JzZXJ2ZXJzIGNhbid0IGJlIHByZXZlbnRlZCBmcm9tIHJ1bm5pbmcgYnkgYSBoaWdoZXItcHJlY2VkZW5jZVxuICAgIGhhbmRsZXIgcmV0dXJuaW5nIHRydWUuIFRoZXkgYWxzbyBkb24ndCBwcmV2ZW50IG90aGVyIGhhbmRsZXJzXG4gICAgYW5kIG9ic2VydmVycyBmcm9tIHJ1bm5pbmcgd2hlbiB0aGV5IHJldHVybiB0cnVlLCBhbmQgc2hvdWxkIG5vdFxuICAgIGNhbGwgYHByZXZlbnREZWZhdWx0YC5cbiAgICAqL1xuICAgIHN0YXRpYyBkb21FdmVudE9ic2VydmVycyhvYnNlcnZlcnMpIHtcbiAgICAgICAgcmV0dXJuIFZpZXdQbHVnaW4uZGVmaW5lKCgpID0+ICh7fSksIHsgZXZlbnRPYnNlcnZlcnM6IG9ic2VydmVycyB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdGhlbWUgZXh0ZW5zaW9uLiBUaGUgZmlyc3QgYXJndW1lbnQgY2FuIGJlIGFcbiAgICBbYHN0eWxlLW1vZGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL3N0eWxlLW1vZCNkb2N1bWVudGF0aW9uKVxuICAgIHN0eWxlIHNwZWMgcHJvdmlkaW5nIHRoZSBzdHlsZXMgZm9yIHRoZSB0aGVtZS4gVGhlc2Ugd2lsbCBiZVxuICAgIHByZWZpeGVkIHdpdGggYSBnZW5lcmF0ZWQgY2xhc3MgZm9yIHRoZSBzdHlsZS5cbiAgICBcbiAgICBCZWNhdXNlIHRoZSBzZWxlY3RvcnMgd2lsbCBiZSBwcmVmaXhlZCB3aXRoIGEgc2NvcGUgY2xhc3MsIHJ1bGVcbiAgICB0aGF0IGRpcmVjdGx5IG1hdGNoIHRoZSBlZGl0b3IncyBbd3JhcHBlclxuICAgIGVsZW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRvbSlcdTIwMTR0byB3aGljaCB0aGUgc2NvcGUgY2xhc3Mgd2lsbCBiZVxuICAgIGFkZGVkXHUyMDE0bmVlZCB0byBiZSBleHBsaWNpdGx5IGRpZmZlcmVudGlhdGVkIGJ5IGFkZGluZyBhbiBgJmAgdG9cbiAgICB0aGUgc2VsZWN0b3IgZm9yIHRoYXQgZWxlbWVudFx1MjAxNGZvciBleGFtcGxlXG4gICAgYCYuY20tZm9jdXNlZGAuXG4gICAgXG4gICAgV2hlbiBgZGFya2AgaXMgc2V0IHRvIHRydWUsIHRoZSB0aGVtZSB3aWxsIGJlIG1hcmtlZCBhcyBkYXJrLFxuICAgIHdoaWNoIHdpbGwgY2F1c2UgdGhlIGAmZGFya2AgcnVsZXMgZnJvbSBbYmFzZVxuICAgIHRoZW1lc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdeYmFzZVRoZW1lKSB0byBiZSB1c2VkIChhcyBvcHBvc2VkIHRvXG4gICAgYCZsaWdodGAgd2hlbiBhIGxpZ2h0IHRoZW1lIGlzIGFjdGl2ZSkuXG4gICAgKi9cbiAgICBzdGF0aWMgdGhlbWUoc3BlYywgb3B0aW9ucykge1xuICAgICAgICBsZXQgcHJlZml4ID0gU3R5bGVNb2R1bGUubmV3TmFtZSgpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW3RoZW1lLm9mKHByZWZpeCksIHN0eWxlTW9kdWxlLm9mKGJ1aWxkVGhlbWUoYC4ke3ByZWZpeH1gLCBzcGVjKSldO1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRhcmspXG4gICAgICAgICAgICByZXN1bHQucHVzaChkYXJrVGhlbWUub2YodHJ1ZSkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgYWRkcyBzdHlsZXMgdG8gdGhlIGJhc2UgdGhlbWUuIExpa2VcbiAgICB3aXRoIFtgdGhlbWVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld150aGVtZSksIHVzZSBgJmAgdG8gaW5kaWNhdGUgdGhlXG4gICAgcGxhY2Ugb2YgdGhlIGVkaXRvciB3cmFwcGVyIGVsZW1lbnQgd2hlbiBkaXJlY3RseSB0YXJnZXRpbmdcbiAgICB0aGF0LiBZb3UgY2FuIGFsc28gdXNlIGAmZGFya2Agb3IgYCZsaWdodGAgaW5zdGVhZCB0byBvbmx5XG4gICAgdGFyZ2V0IGVkaXRvcnMgd2l0aCBhIGRhcmsgb3IgbGlnaHQgdGhlbWUuXG4gICAgKi9cbiAgICBzdGF0aWMgYmFzZVRoZW1lKHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIFByZWMubG93ZXN0KHN0eWxlTW9kdWxlLm9mKGJ1aWxkVGhlbWUoXCIuXCIgKyBiYXNlVGhlbWVJRCwgc3BlYywgbGlnaHREYXJrSURzKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZSBhbiBlZGl0b3IgdmlldyBpbnN0YW5jZSBmcm9tIHRoZSB2aWV3J3MgRE9NXG4gICAgcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZmluZEZyb21ET00oZG9tKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSBkb20ucXVlcnlTZWxlY3RvcihcIi5jbS1jb250ZW50XCIpO1xuICAgICAgICBsZXQgY1ZpZXcgPSBjb250ZW50ICYmIENvbnRlbnRWaWV3LmdldChjb250ZW50KSB8fCBDb250ZW50Vmlldy5nZXQoZG9tKTtcbiAgICAgICAgcmV0dXJuICgoX2EgPSBjVmlldyA9PT0gbnVsbCB8fCBjVmlldyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY1ZpZXcucm9vdFZpZXcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52aWV3KSB8fCBudWxsO1xuICAgIH1cbn1cbi8qKlxuRmFjZXQgdG8gYWRkIGEgW3N0eWxlXG5tb2R1bGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL3N0eWxlLW1vZCNkb2N1bWVudGF0aW9uKSB0b1xuYW4gZWRpdG9yIHZpZXcuIFRoZSB2aWV3IHdpbGwgZW5zdXJlIHRoYXQgdGhlIG1vZHVsZSBpc1xubW91bnRlZCBpbiBpdHMgW2RvY3VtZW50XG5yb290XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5jb25zdHJ1Y3Rvcl5jb25maWcucm9vdCkuXG4qL1xuRWRpdG9yVmlldy5zdHlsZU1vZHVsZSA9IHN0eWxlTW9kdWxlO1xuLyoqXG5BbiBpbnB1dCBoYW5kbGVyIGNhbiBvdmVycmlkZSB0aGUgd2F5IGNoYW5nZXMgdG8gdGhlIGVkaXRhYmxlXG5ET00gY29udGVudCBhcmUgaGFuZGxlZC4gSGFuZGxlcnMgYXJlIHBhc3NlZCB0aGUgZG9jdW1lbnRcbnBvc2l0aW9ucyBiZXR3ZWVuIHdoaWNoIHRoZSBjaGFuZ2Ugd2FzIGZvdW5kLCBhbmQgdGhlIG5ld1xuY29udGVudC4gV2hlbiBvbmUgcmV0dXJucyB0cnVlLCBubyBmdXJ0aGVyIGlucHV0IGhhbmRsZXJzIGFyZVxuY2FsbGVkIGFuZCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyBwcmV2ZW50ZWQuXG5cblRoZSBgaW5zZXJ0YCBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGRlZmF1bHQgdHJhbnNhY3Rpb25cbnRoYXQgd291bGQgYmUgYXBwbGllZCBmb3IgdGhpcyBpbnB1dC4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW5cbmRpc3BhdGNoaW5nIHRoZSBjdXN0b20gYmVoYXZpb3IgYXMgYSBzZXBhcmF0ZSB0cmFuc2FjdGlvbi5cbiovXG5FZGl0b3JWaWV3LmlucHV0SGFuZGxlciA9IGlucHV0SGFuZGxlcjtcbi8qKlxuVGhpcyBmYWNldCBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGZ1bmN0aW9ucyB0aGF0IGNyZWF0ZSBlZmZlY3RzXG50byBiZSBkaXNwYXRjaGVkIHdoZW4gdGhlIGVkaXRvcidzIGZvY3VzIHN0YXRlIGNoYW5nZXMuXG4qL1xuRWRpdG9yVmlldy5mb2N1c0NoYW5nZUVmZmVjdCA9IGZvY3VzQ2hhbmdlRWZmZWN0O1xuLyoqXG5CeSBkZWZhdWx0LCB0aGUgZWRpdG9yIGFzc3VtZXMgYWxsIGl0cyBjb250ZW50IGhhcyB0aGUgc2FtZVxuW3RleHQgZGlyZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGlyZWN0aW9uKS4gQ29uZmlndXJlIHRoaXMgd2l0aCBhIGB0cnVlYFxudmFsdWUgdG8gbWFrZSBpdCByZWFkIHRoZSB0ZXh0IGRpcmVjdGlvbiBvZiBldmVyeSAocmVuZGVyZWQpXG5saW5lIHNlcGFyYXRlbHkuXG4qL1xuRWRpdG9yVmlldy5wZXJMaW5lVGV4dERpcmVjdGlvbiA9IHBlckxpbmVUZXh0RGlyZWN0aW9uO1xuLyoqXG5BbGxvd3MgeW91IHRvIHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGVcbmxpYnJhcnkgY2F0Y2hlcyBhbiBleGNlcHRpb24gZnJvbSBhbiBleHRlbnNpb24gKG1vc3RseSBmcm9tIHZpZXdcbnBsdWdpbnMsIGJ1dCBtYXkgYmUgdXNlZCBieSBvdGhlciBleHRlbnNpb25zIHRvIHJvdXRlIGV4Y2VwdGlvbnNcbmZyb20gdXNlci1jb2RlLXByb3ZpZGVkIGNhbGxiYWNrcykuIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3JcbmRlYnVnZ2luZyBhbmQgbG9nZ2luZy4gU2VlIFtgbG9nRXhjZXB0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LmxvZ0V4Y2VwdGlvbikuXG4qL1xuRWRpdG9yVmlldy5leGNlcHRpb25TaW5rID0gZXhjZXB0aW9uU2luaztcbi8qKlxuQSBmYWNldCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXG5ldmVyeSB0aW1lIHRoZSB2aWV3IHVwZGF0ZXMuXG4qL1xuRWRpdG9yVmlldy51cGRhdGVMaXN0ZW5lciA9IHVwZGF0ZUxpc3RlbmVyO1xuLyoqXG5GYWNldCB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgdGhlIGVkaXRvciBjb250ZW50IERPTSBpcyBlZGl0YWJsZS5cbldoZW4gaXRzIGhpZ2hlc3QtcHJlY2VkZW5jZSB2YWx1ZSBpcyBgZmFsc2VgLCB0aGUgZWxlbWVudCB3aWxsXG5ub3QgaGF2ZSBpdHMgYGNvbnRlbnRlZGl0YWJsZWAgYXR0cmlidXRlIHNldC4gKE5vdGUgdGhhdCB0aGlzXG5kb2Vzbid0IGFmZmVjdCBBUEkgY2FsbHMgdGhhdCBjaGFuZ2UgdGhlIGVkaXRvciBjb250ZW50LCBldmVuXG53aGVuIHRob3NlIGFyZSBib3VuZCB0byBrZXlzIG9yIGJ1dHRvbnMuIFNlZSB0aGVcbltgcmVhZE9ubHlgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnJlYWRPbmx5KSBmYWNldCBmb3IgdGhhdC4pXG4qL1xuRWRpdG9yVmlldy5lZGl0YWJsZSA9IGVkaXRhYmxlO1xuLyoqXG5BbGxvd3MgeW91IHRvIGluZmx1ZW5jZSB0aGUgd2F5IG1vdXNlIHNlbGVjdGlvbiBoYXBwZW5zLiBUaGVcbmZ1bmN0aW9ucyBpbiB0aGlzIGZhY2V0IHdpbGwgYmUgY2FsbGVkIGZvciBhIGBtb3VzZWRvd25gIGV2ZW50XG5vbiB0aGUgZWRpdG9yLCBhbmQgY2FuIHJldHVybiBhbiBvYmplY3QgdGhhdCBvdmVycmlkZXMgdGhlIHdheSBhXG5zZWxlY3Rpb24gaXMgY29tcHV0ZWQgZnJvbSB0aGF0IG1vdXNlIGNsaWNrIG9yIGRyYWcuXG4qL1xuRWRpdG9yVmlldy5tb3VzZVNlbGVjdGlvblN0eWxlID0gbW91c2VTZWxlY3Rpb25TdHlsZTtcbi8qKlxuRmFjZXQgdXNlZCB0byBjb25maWd1cmUgd2hldGhlciBhIGdpdmVuIHNlbGVjdGlvbiBkcmFnIGV2ZW50XG5zaG91bGQgbW92ZSBvciBjb3B5IHRoZSBzZWxlY3Rpb24uIFRoZSBnaXZlbiBwcmVkaWNhdGUgd2lsbCBiZVxuY2FsbGVkIHdpdGggdGhlIGBtb3VzZWRvd25gIGV2ZW50LCBhbmQgY2FuIHJldHVybiBgdHJ1ZWAgd2hlblxudGhlIGRyYWcgc2hvdWxkIG1vdmUgdGhlIGNvbnRlbnQuXG4qL1xuRWRpdG9yVmlldy5kcmFnTW92ZXNTZWxlY3Rpb24gPSBkcmFnTW92ZXNTZWxlY3Rpb24kMTtcbi8qKlxuRmFjZXQgdXNlZCB0byBjb25maWd1cmUgd2hldGhlciBhIGdpdmVuIHNlbGVjdGluZyBjbGljayBhZGRzIGFcbm5ldyByYW5nZSB0byB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIG9yIHJlcGxhY2VzIGl0IGVudGlyZWx5LiBUaGVcbmRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2hlY2sgYGV2ZW50Lm1ldGFLZXlgIG9uIG1hY09TLCBhbmRcbmBldmVudC5jdHJsS2V5YCBlbHNld2hlcmUuXG4qL1xuRWRpdG9yVmlldy5jbGlja0FkZHNTZWxlY3Rpb25SYW5nZSA9IGNsaWNrQWRkc1NlbGVjdGlvblJhbmdlO1xuLyoqXG5BIGZhY2V0IHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBbZGVjb3JhdGlvbnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uKVxuYXJlIHNob3duIGluIHRoZSB2aWV3LiBEZWNvcmF0aW9ucyBjYW4gYmUgcHJvdmlkZWQgaW4gdHdvXG53YXlzXHUyMDE0ZGlyZWN0bHksIG9yIHZpYSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gZWRpdG9yIHZpZXcuXG5cbk9ubHkgZGVjb3JhdGlvbiBzZXRzIHByb3ZpZGVkIGRpcmVjdGx5IGFyZSBhbGxvd2VkIHRvIGluZmx1ZW5jZVxudGhlIGVkaXRvcidzIHZlcnRpY2FsIGxheW91dCBzdHJ1Y3R1cmUuIFRoZSBvbmVzIHByb3ZpZGVkIGFzXG5mdW5jdGlvbnMgYXJlIGNhbGxlZCBfYWZ0ZXJfIHRoZSBuZXcgdmlld3BvcnQgaGFzIGJlZW4gY29tcHV0ZWQsXG5hbmQgdGh1cyAqKm11c3Qgbm90KiogaW50cm9kdWNlIGJsb2NrIHdpZGdldHMgb3IgcmVwbGFjaW5nXG5kZWNvcmF0aW9ucyB0aGF0IGNvdmVyIGxpbmUgYnJlYWtzLlxuXG5JZiB5b3Ugd2FudCBkZWNvcmF0ZWQgcmFuZ2VzIHRvIGJlaGF2ZSBsaWtlIGF0b21pYyB1bml0cyBmb3JcbmN1cnNvciBtb3Rpb24gYW5kIGRlbGV0aW9uIHB1cnBvc2VzLCBhbHNvIHByb3ZpZGUgdGhlIHJhbmdlIHNldFxuY29udGFpbmluZyB0aGUgZGVjb3JhdGlvbnMgdG9cbltgRWRpdG9yVmlldy5hdG9taWNSYW5nZXNgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15hdG9taWNSYW5nZXMpLlxuKi9cbkVkaXRvclZpZXcuZGVjb3JhdGlvbnMgPSBkZWNvcmF0aW9ucztcbi8qKlxuRmFjZXQgdGhhdCB3b3JrcyBtdWNoIGxpa2VcbltgZGVjb3JhdGlvbnNgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15kZWNvcmF0aW9ucyksIGJ1dCBwdXRzIGl0c1xuaW5wdXRzIGF0IHRoZSB2ZXJ5IGJvdHRvbSBvZiB0aGUgcHJlY2VkZW5jZSBzdGFjaywgbWVhbmluZyBtYXJrXG5kZWNvcmF0aW9ucyBwcm92aWRlZCBoZXJlIHdpbGwgb25seSBiZSBzcGxpdCBieSBvdGhlciwgcGFydGlhbGx5XG5vdmVybGFwcGluZyBcXGBvdXRlckRlY29yYXRpb25zXFxgIHJhbmdlcywgYW5kIHdyYXAgYXJvdW5kIGFsbFxucmVndWxhciBkZWNvcmF0aW9ucy4gVXNlIHRoaXMgZm9yIG1hcmsgZWxlbWVudHMgdGhhdCBzaG91bGQsIGFzXG5tdWNoIGFzIHBvc3NpYmxlLCByZW1haW4gaW4gb25lIHBpZWNlLlxuKi9cbkVkaXRvclZpZXcub3V0ZXJEZWNvcmF0aW9ucyA9IG91dGVyRGVjb3JhdGlvbnM7XG4vKipcblVzZWQgdG8gcHJvdmlkZSByYW5nZXMgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhdG9tcyBhcyBmYXIgYXNcbmN1cnNvciBtb3Rpb24gaXMgY29uY2VybmVkLiBUaGlzIGNhdXNlcyBtZXRob2RzIGxpa2VcbltgbW92ZUJ5Q2hhcmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Lm1vdmVCeUNoYXIpIGFuZFxuW2Btb3ZlVmVydGljYWxseWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Lm1vdmVWZXJ0aWNhbGx5KSAoYW5kIHRoZVxuY29tbWFuZHMgYnVpbHQgb24gdG9wIG9mIHRoZW0pIHRvIHNraXAgYWNyb3NzIHN1Y2ggcmVnaW9ucyB3aGVuXG5hIHNlbGVjdGlvbiBlbmRwb2ludCB3b3VsZCBlbnRlciB0aGVtLiBUaGlzIGRvZXMgX25vdF8gcHJldmVudFxuZGlyZWN0IHByb2dyYW1tYXRpYyBbc2VsZWN0aW9uXG51cGRhdGVzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5zZWxlY3Rpb24pIGZyb20gbW92aW5nIGludG8gc3VjaFxucmVnaW9ucy5cbiovXG5FZGl0b3JWaWV3LmF0b21pY1JhbmdlcyA9IGF0b21pY1Jhbmdlcztcbi8qKlxuV2hlbiByYW5nZSBkZWNvcmF0aW9ucyBhZGQgYSBgdW5pY29kZS1iaWRpOiBpc29sYXRlYCBzdHlsZSwgdGhleVxuc2hvdWxkIGFsc28gaW5jbHVkZSBhXG5bYGJpZGlJc29sYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3Lk1hcmtEZWNvcmF0aW9uU3BlYy5iaWRpSXNvbGF0ZSkgcHJvcGVydHlcbmluIHRoZWlyIGRlY29yYXRpb24gc3BlYywgYW5kIGJlIGV4cG9zZWQgdGhyb3VnaCB0aGlzIGZhY2V0LCBzb1xudGhhdCB0aGUgZWRpdG9yIGNhbiBjb21wdXRlIHRoZSBwcm9wZXIgdGV4dCBvcmRlci4gKE90aGVyIHZhbHVlc1xuZm9yIGB1bmljb2RlLWJpZGlgLCBleGNlcHQgb2YgY291cnNlIGBub3JtYWxgLCBhcmUgbm90XG5zdXBwb3J0ZWQuKVxuKi9cbkVkaXRvclZpZXcuYmlkaUlzb2xhdGVkUmFuZ2VzID0gYmlkaUlzb2xhdGVkUmFuZ2VzO1xuLyoqXG5GYWNldCB0aGF0IGFsbG93cyBleHRlbnNpb25zIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBzY3JvbGxcbm1hcmdpbnMgKHNwYWNlIGFyb3VuZCB0aGUgc2lkZXMgb2YgdGhlIHNjcm9sbGluZyBlbGVtZW50IHRoYXRcbnNob3VsZCBiZSBjb25zaWRlcmVkIGludmlzaWJsZSkuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHRoZVxucGx1Z2luIGludHJvZHVjZXMgZWxlbWVudHMgdGhhdCBjb3ZlciBwYXJ0IG9mIHRoYXQgZWxlbWVudCAoZm9yXG5leGFtcGxlIGEgaG9yaXpvbnRhbGx5IGZpeGVkIGd1dHRlcikuXG4qL1xuRWRpdG9yVmlldy5zY3JvbGxNYXJnaW5zID0gc2Nyb2xsTWFyZ2lucztcbi8qKlxuVGhpcyBmYWNldCByZWNvcmRzIHdoZXRoZXIgYSBkYXJrIHRoZW1lIGlzIGFjdGl2ZS4gVGhlIGV4dGVuc2lvblxucmV0dXJuZWQgYnkgW2B0aGVtZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnRoZW1lKSBhdXRvbWF0aWNhbGx5XG5pbmNsdWRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIHdoZW4gdGhlIGBkYXJrYCBvcHRpb24gaXMgc2V0IHRvXG50cnVlLlxuKi9cbkVkaXRvclZpZXcuZGFya1RoZW1lID0gZGFya1RoZW1lO1xuLyoqXG5Qcm92aWRlcyBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IG5vbmNlIHRvIHVzZSB3aGVuIGNyZWF0aW5nXG50aGUgc3R5bGUgc2hlZXRzIGZvciB0aGUgZWRpdG9yLiBIb2xkcyB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gbm9cbm5vbmNlIGhhcyBiZWVuIHByb3ZpZGVkLlxuKi9cbkVkaXRvclZpZXcuY3NwTm9uY2UgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5sZW5ndGggPyB2YWx1ZXNbMF0gOiBcIlwiIH0pO1xuLyoqXG5GYWNldCB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgRE9NIGF0dHJpYnV0ZXMgZm9yIHRoZSBlZGl0b3Inc1xuZWRpdGFibGUgRE9NIGVsZW1lbnQuXG4qL1xuRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcyA9IGNvbnRlbnRBdHRyaWJ1dGVzO1xuLyoqXG5GYWNldCB0aGF0IHByb3ZpZGVzIERPTSBhdHRyaWJ1dGVzIGZvciB0aGUgZWRpdG9yJ3Mgb3V0ZXJcbmVsZW1lbnQuXG4qL1xuRWRpdG9yVmlldy5lZGl0b3JBdHRyaWJ1dGVzID0gZWRpdG9yQXR0cmlidXRlcztcbi8qKlxuQW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyBsaW5lIHdyYXBwaW5nIGluIHRoZSBlZGl0b3IgKGJ5XG5zZXR0aW5nIENTUyBgd2hpdGUtc3BhY2VgIHRvIGBwcmUtd3JhcGAgaW4gdGhlIGNvbnRlbnQpLlxuKi9cbkVkaXRvclZpZXcubGluZVdyYXBwaW5nID0gLypAX19QVVJFX18qL0VkaXRvclZpZXcuY29udGVudEF0dHJpYnV0ZXMub2YoeyBcImNsYXNzXCI6IFwiY20tbGluZVdyYXBwaW5nXCIgfSk7XG4vKipcblN0YXRlIGVmZmVjdCB1c2VkIHRvIGluY2x1ZGUgc2NyZWVuIHJlYWRlciBhbm5vdW5jZW1lbnRzIGluIGFcbnRyYW5zYWN0aW9uLiBUaGVzZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBET00gaW4gYSB2aXN1YWxseSBoaWRkZW5cbmVsZW1lbnQgd2l0aCBgYXJpYS1saXZlPVwicG9saXRlXCJgIHNldCwgYW5kIHNob3VsZCBiZSB1c2VkIHRvXG5kZXNjcmliZSBlZmZlY3RzIHRoYXQgYXJlIHZpc3VhbGx5IG9idmlvdXMgYnV0IG1heSBub3QgYmVcbm5vdGljZWQgYnkgc2NyZWVuIHJlYWRlciB1c2VycyAoc3VjaCBhcyBtb3ZpbmcgdG8gdGhlIG5leHRcbnNlYXJjaCBtYXRjaCkuXG4qL1xuRWRpdG9yVmlldy5hbm5vdW5jZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbi8vIE1heGltdW0gbGluZSBsZW5ndGggZm9yIHdoaWNoIHdlIGNvbXB1dGUgYWNjdXJhdGUgYmlkaSBpbmZvXG5jb25zdCBNYXhCaWRpTGluZSA9IDQwOTY7XG5jb25zdCBCYWRNZWFzdXJlID0ge307XG5jbGFzcyBDYWNoZWRPcmRlciB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8sIGRpciwgaXNvbGF0ZXMsIGZyZXNoLCBvcmRlcikge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuZGlyID0gZGlyO1xuICAgICAgICB0aGlzLmlzb2xhdGVzID0gaXNvbGF0ZXM7XG4gICAgICAgIHRoaXMuZnJlc2ggPSBmcmVzaDtcbiAgICAgICAgdGhpcy5vcmRlciA9IG9yZGVyO1xuICAgIH1cbiAgICBzdGF0aWMgdXBkYXRlKGNhY2hlLCBjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmVtcHR5ICYmICFjYWNoZS5zb21lKGMgPT4gYy5mcmVzaCkpXG4gICAgICAgICAgICByZXR1cm4gY2FjaGU7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXSwgbGFzdERpciA9IGNhY2hlLmxlbmd0aCA/IGNhY2hlW2NhY2hlLmxlbmd0aCAtIDFdLmRpciA6IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIGZvciAobGV0IGkgPSBNYXRoLm1heCgwLCBjYWNoZS5sZW5ndGggLSAxMCk7IGkgPCBjYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gY2FjaGVbaV07XG4gICAgICAgICAgICBpZiAoZW50cnkuZGlyID09IGxhc3REaXIgJiYgIWNoYW5nZXMudG91Y2hlc1JhbmdlKGVudHJ5LmZyb20sIGVudHJ5LnRvKSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgQ2FjaGVkT3JkZXIoY2hhbmdlcy5tYXBQb3MoZW50cnkuZnJvbSwgMSksIGNoYW5nZXMubWFwUG9zKGVudHJ5LnRvLCAtMSksIGVudHJ5LmRpciwgZW50cnkuaXNvbGF0ZXMsIGZhbHNlLCBlbnRyeS5vcmRlcikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gYXR0cnNGcm9tRmFjZXQodmlldywgZmFjZXQsIGJhc2UpIHtcbiAgICBmb3IgKGxldCBzb3VyY2VzID0gdmlldy5zdGF0ZS5mYWNldChmYWNldCksIGkgPSBzb3VyY2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VzW2ldLCB2YWx1ZSA9IHR5cGVvZiBzb3VyY2UgPT0gXCJmdW5jdGlvblwiID8gc291cmNlKHZpZXcpIDogc291cmNlO1xuICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICBjb21iaW5lQXR0cnModmFsdWUsIGJhc2UpO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbn1cblxuY29uc3QgY3VycmVudFBsYXRmb3JtID0gYnJvd3Nlci5tYWMgPyBcIm1hY1wiIDogYnJvd3Nlci53aW5kb3dzID8gXCJ3aW5cIiA6IGJyb3dzZXIubGludXggPyBcImxpbnV4XCIgOiBcImtleVwiO1xuZnVuY3Rpb24gbm9ybWFsaXplS2V5TmFtZShuYW1lLCBwbGF0Zm9ybSkge1xuICAgIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISQpLyk7XG4gICAgbGV0IHJlc3VsdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChyZXN1bHQgPT0gXCJTcGFjZVwiKVxuICAgICAgICByZXN1bHQgPSBcIiBcIjtcbiAgICBsZXQgYWx0LCBjdHJsLCBzaGlmdCwgbWV0YTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBjb25zdCBtb2QgPSBwYXJ0c1tpXTtcbiAgICAgICAgaWYgKC9eKGNtZHxtZXRhfG0pJC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIG1ldGEgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXmEobHQpPyQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBhbHQgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXihjfGN0cmx8Y29udHJvbCkkL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgY3RybCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9ecyhoaWZ0KT8kL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgc2hpZnQgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXm1vZCQvaS50ZXN0KG1vZCkpIHtcbiAgICAgICAgICAgIGlmIChwbGF0Zm9ybSA9PSBcIm1hY1wiKVxuICAgICAgICAgICAgICAgIG1ldGEgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGN0cmwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBtb2RpZmllciBuYW1lOiBcIiArIG1vZCk7XG4gICAgfVxuICAgIGlmIChhbHQpXG4gICAgICAgIHJlc3VsdCA9IFwiQWx0LVwiICsgcmVzdWx0O1xuICAgIGlmIChjdHJsKVxuICAgICAgICByZXN1bHQgPSBcIkN0cmwtXCIgKyByZXN1bHQ7XG4gICAgaWYgKG1ldGEpXG4gICAgICAgIHJlc3VsdCA9IFwiTWV0YS1cIiArIHJlc3VsdDtcbiAgICBpZiAoc2hpZnQpXG4gICAgICAgIHJlc3VsdCA9IFwiU2hpZnQtXCIgKyByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZGlmaWVycyhuYW1lLCBldmVudCwgc2hpZnQpIHtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgICBuYW1lID0gXCJBbHQtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5jdHJsS2V5KVxuICAgICAgICBuYW1lID0gXCJDdHJsLVwiICsgbmFtZTtcbiAgICBpZiAoZXZlbnQubWV0YUtleSlcbiAgICAgICAgbmFtZSA9IFwiTWV0YS1cIiArIG5hbWU7XG4gICAgaWYgKHNoaWZ0ICE9PSBmYWxzZSAmJiBldmVudC5zaGlmdEtleSlcbiAgICAgICAgbmFtZSA9IFwiU2hpZnQtXCIgKyBuYW1lO1xuICAgIHJldHVybiBuYW1lO1xufVxuY29uc3QgaGFuZGxlS2V5RXZlbnRzID0gLypAX19QVVJFX18qL1ByZWMuZGVmYXVsdCgvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5kb21FdmVudEhhbmRsZXJzKHtcbiAgICBrZXlkb3duKGV2ZW50LCB2aWV3KSB7XG4gICAgICAgIHJldHVybiBydW5IYW5kbGVycyhnZXRLZXltYXAodmlldy5zdGF0ZSksIGV2ZW50LCB2aWV3LCBcImVkaXRvclwiKTtcbiAgICB9XG59KSk7XG4vKipcbkZhY2V0IHVzZWQgZm9yIHJlZ2lzdGVyaW5nIGtleW1hcHMuXG5cbllvdSBjYW4gYWRkIG11bHRpcGxlIGtleW1hcHMgdG8gYW4gZWRpdG9yLiBUaGVpciBwcmlvcml0aWVzXG5kZXRlcm1pbmUgdGhlaXIgcHJlY2VkZW5jZSAodGhlIG9uZXMgc3BlY2lmaWVkIGVhcmx5IG9yIHdpdGggaGlnaFxucHJpb3JpdHkgZ2V0IGNoZWNrZWQgZmlyc3QpLiBXaGVuIGEgaGFuZGxlciBoYXMgcmV0dXJuZWQgYHRydWVgXG5mb3IgYSBnaXZlbiBrZXksIG5vIGZ1cnRoZXIgaGFuZGxlcnMgYXJlIGNhbGxlZC5cbiovXG5jb25zdCBrZXltYXAgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgZW5hYmxlczogaGFuZGxlS2V5RXZlbnRzIH0pO1xuY29uc3QgS2V5bWFwcyA9IC8qQF9fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuLy8gVGhpcyBpcyBoaWRkZW4gYmVoaW5kIGFuIGluZGlyZWN0aW9uLCByYXRoZXIgdGhhbiBkaXJlY3RseSBjb21wdXRlZFxuLy8gYnkgdGhlIGZhY2V0LCB0byBrZWVwIGludGVybmFsIHR5cGVzIG91dCBvZiB0aGUgZmFjZXQncyB0eXBlLlxuZnVuY3Rpb24gZ2V0S2V5bWFwKHN0YXRlKSB7XG4gICAgbGV0IGJpbmRpbmdzID0gc3RhdGUuZmFjZXQoa2V5bWFwKTtcbiAgICBsZXQgbWFwID0gS2V5bWFwcy5nZXQoYmluZGluZ3MpO1xuICAgIGlmICghbWFwKVxuICAgICAgICBLZXltYXBzLnNldChiaW5kaW5ncywgbWFwID0gYnVpbGRLZXltYXAoYmluZGluZ3MucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pKSk7XG4gICAgcmV0dXJuIG1hcDtcbn1cbi8qKlxuUnVuIHRoZSBrZXkgaGFuZGxlcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBzY29wZS4gVGhlIGV2ZW50XG5vYmplY3Qgc2hvdWxkIGJlIGEgYFwia2V5ZG93blwiYCBldmVudC4gUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGVcbmhhbmRsZXJzIGhhbmRsZWQgaXQuXG4qL1xuZnVuY3Rpb24gcnVuU2NvcGVIYW5kbGVycyh2aWV3LCBldmVudCwgc2NvcGUpIHtcbiAgICByZXR1cm4gcnVuSGFuZGxlcnMoZ2V0S2V5bWFwKHZpZXcuc3RhdGUpLCBldmVudCwgdmlldywgc2NvcGUpO1xufVxubGV0IHN0b3JlZFByZWZpeCA9IG51bGw7XG5jb25zdCBQcmVmaXhUaW1lb3V0ID0gNDAwMDtcbmZ1bmN0aW9uIGJ1aWxkS2V5bWFwKGJpbmRpbmdzLCBwbGF0Zm9ybSA9IGN1cnJlbnRQbGF0Zm9ybSkge1xuICAgIGxldCBib3VuZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGlzUHJlZml4ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgY2hlY2tQcmVmaXggPSAobmFtZSwgaXMpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBpc1ByZWZpeFtuYW1lXTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbClcbiAgICAgICAgICAgIGlzUHJlZml4W25hbWVdID0gaXM7XG4gICAgICAgIGVsc2UgaWYgKGN1cnJlbnQgIT0gaXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJLZXkgYmluZGluZyBcIiArIG5hbWUgKyBcIiBpcyB1c2VkIGJvdGggYXMgYSByZWd1bGFyIGJpbmRpbmcgYW5kIGFzIGEgbXVsdGktc3Ryb2tlIHByZWZpeFwiKTtcbiAgICB9O1xuICAgIGxldCBhZGQgPSAoc2NvcGUsIGtleSwgY29tbWFuZCwgcHJldmVudERlZmF1bHQsIHN0b3BQcm9wYWdhdGlvbikgPT4ge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBsZXQgc2NvcGVPYmogPSBib3VuZFtzY29wZV0gfHwgKGJvdW5kW3Njb3BlXSA9IE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAgICBsZXQgcGFydHMgPSBrZXkuc3BsaXQoLyAoPyEkKS8pLm1hcChrID0+IG5vcm1hbGl6ZUtleU5hbWUoaywgcGxhdGZvcm0pKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHByZWZpeCA9IHBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgY2hlY2tQcmVmaXgocHJlZml4LCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghc2NvcGVPYmpbcHJlZml4XSlcbiAgICAgICAgICAgICAgICBzY29wZU9ialtwcmVmaXhdID0ge1xuICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcnVuOiBbKHZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3VyT2JqID0gc3RvcmVkUHJlZml4ID0geyB2aWV3LCBwcmVmaXgsIHNjb3BlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChzdG9yZWRQcmVmaXggPT0gb3VyT2JqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWRQcmVmaXggPSBudWxsOyB9LCBQcmVmaXhUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZnVsbCA9IHBhcnRzLmpvaW4oXCIgXCIpO1xuICAgICAgICBjaGVja1ByZWZpeChmdWxsLCBmYWxzZSk7XG4gICAgICAgIGxldCBiaW5kaW5nID0gc2NvcGVPYmpbZnVsbF0gfHwgKHNjb3BlT2JqW2Z1bGxdID0ge1xuICAgICAgICAgICAgcHJldmVudERlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIHJ1bjogKChfYiA9IChfYSA9IHNjb3BlT2JqLl9hbnkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ydW4pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zbGljZSgpKSB8fCBbXVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbW1hbmQpXG4gICAgICAgICAgICBiaW5kaW5nLnJ1bi5wdXNoKGNvbW1hbmQpO1xuICAgICAgICBpZiAocHJldmVudERlZmF1bHQpXG4gICAgICAgICAgICBiaW5kaW5nLnByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHN0b3BQcm9wYWdhdGlvbilcbiAgICAgICAgICAgIGJpbmRpbmcuc3RvcFByb3BhZ2F0aW9uID0gdHJ1ZTtcbiAgICB9O1xuICAgIGZvciAobGV0IGIgb2YgYmluZGluZ3MpIHtcbiAgICAgICAgbGV0IHNjb3BlcyA9IGIuc2NvcGUgPyBiLnNjb3BlLnNwbGl0KFwiIFwiKSA6IFtcImVkaXRvclwiXTtcbiAgICAgICAgaWYgKGIuYW55KVxuICAgICAgICAgICAgZm9yIChsZXQgc2NvcGUgb2Ygc2NvcGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNjb3BlT2JqID0gYm91bmRbc2NvcGVdIHx8IChib3VuZFtzY29wZV0gPSBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlT2JqLl9hbnkpXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlT2JqLl9hbnkgPSB7IHByZXZlbnREZWZhdWx0OiBmYWxzZSwgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSwgcnVuOiBbXSB9O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBzY29wZU9iailcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVPYmpba2V5XS5ydW4ucHVzaChiLmFueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGxldCBuYW1lID0gYltwbGF0Zm9ybV0gfHwgYi5rZXk7XG4gICAgICAgIGlmICghbmFtZSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGxldCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICAgICAgICAgIGFkZChzY29wZSwgbmFtZSwgYi5ydW4sIGIucHJldmVudERlZmF1bHQsIGIuc3RvcFByb3BhZ2F0aW9uKTtcbiAgICAgICAgICAgIGlmIChiLnNoaWZ0KVxuICAgICAgICAgICAgICAgIGFkZChzY29wZSwgXCJTaGlmdC1cIiArIG5hbWUsIGIuc2hpZnQsIGIucHJldmVudERlZmF1bHQsIGIuc3RvcFByb3BhZ2F0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYm91bmQ7XG59XG5mdW5jdGlvbiBydW5IYW5kbGVycyhtYXAsIGV2ZW50LCB2aWV3LCBzY29wZSkge1xuICAgIGxldCBuYW1lID0ga2V5TmFtZShldmVudCk7XG4gICAgbGV0IGNoYXJDb2RlID0gY29kZVBvaW50QXQobmFtZSwgMCksIGlzQ2hhciA9IGNvZGVQb2ludFNpemUoY2hhckNvZGUpID09IG5hbWUubGVuZ3RoICYmIG5hbWUgIT0gXCIgXCI7XG4gICAgbGV0IHByZWZpeCA9IFwiXCIsIGhhbmRsZWQgPSBmYWxzZSwgcHJldmVudGVkID0gZmFsc2UsIHN0b3BQcm9wYWdhdGlvbiA9IGZhbHNlO1xuICAgIGlmIChzdG9yZWRQcmVmaXggJiYgc3RvcmVkUHJlZml4LnZpZXcgPT0gdmlldyAmJiBzdG9yZWRQcmVmaXguc2NvcGUgPT0gc2NvcGUpIHtcbiAgICAgICAgcHJlZml4ID0gc3RvcmVkUHJlZml4LnByZWZpeCArIFwiIFwiO1xuICAgICAgICBpZiAobW9kaWZpZXJDb2Rlcy5pbmRleE9mKGV2ZW50LmtleUNvZGUpIDwgMCkge1xuICAgICAgICAgICAgcHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0b3JlZFByZWZpeCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJhbiA9IG5ldyBTZXQ7XG4gICAgbGV0IHJ1bkZvciA9IChiaW5kaW5nKSA9PiB7XG4gICAgICAgIGlmIChiaW5kaW5nKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjbWQgb2YgYmluZGluZy5ydW4pXG4gICAgICAgICAgICAgICAgaWYgKCFyYW4uaGFzKGNtZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuLmFkZChjbWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY21kKHZpZXcsIGV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcuc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiaW5kaW5nLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcuc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgICAgICAgICBzdG9wUHJvcGFnYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgbGV0IHNjb3BlT2JqID0gbWFwW3Njb3BlXSwgYmFzZU5hbWUsIHNoaWZ0TmFtZTtcbiAgICBpZiAoc2NvcGVPYmopIHtcbiAgICAgICAgaWYgKHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMobmFtZSwgZXZlbnQsICFpc0NoYXIpXSkpIHtcbiAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQ2hhciAmJiAoZXZlbnQuYWx0S2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkgJiZcbiAgICAgICAgICAgIC8vIEN0cmwtQWx0IG1heSBiZSB1c2VkIGZvciBBbHRHciBvbiBXaW5kb3dzXG4gICAgICAgICAgICAhKGJyb3dzZXIud2luZG93cyAmJiBldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSkgJiZcbiAgICAgICAgICAgIChiYXNlTmFtZSA9IGJhc2VbZXZlbnQua2V5Q29kZV0pICYmIGJhc2VOYW1lICE9IG5hbWUpIHtcbiAgICAgICAgICAgIGlmIChydW5Gb3Ioc2NvcGVPYmpbcHJlZml4ICsgbW9kaWZpZXJzKGJhc2VOYW1lLCBldmVudCwgdHJ1ZSldKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgKHNoaWZ0TmFtZSA9IHNoaWZ0W2V2ZW50LmtleUNvZGVdKSAhPSBuYW1lICYmIHNoaWZ0TmFtZSAhPSBiYXNlTmFtZSAmJlxuICAgICAgICAgICAgICAgIHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMoc2hpZnROYW1lLCBldmVudCwgZmFsc2UpXSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0NoYXIgJiYgZXZlbnQuc2hpZnRLZXkgJiZcbiAgICAgICAgICAgIHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMobmFtZSwgZXZlbnQsIHRydWUpXSkpIHtcbiAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGFuZGxlZCAmJiBydW5Gb3Ioc2NvcGVPYmouX2FueSkpXG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByZXZlbnRlZClcbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgaWYgKGhhbmRsZWQgJiYgc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICByZXR1cm4gaGFuZGxlZDtcbn1cblxuLyoqXG5JbXBsZW1lbnRhdGlvbiBvZiBbYExheWVyTWFya2VyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkxheWVyTWFya2VyKSB0aGF0IGNyZWF0ZXNcbmEgcmVjdGFuZ2xlIGF0IGEgZ2l2ZW4gc2V0IG9mIGNvb3JkaW5hdGVzLlxuKi9cbmNsYXNzIFJlY3RhbmdsZU1hcmtlciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFya2VyIHdpdGggdGhlIGdpdmVuIGNsYXNzIGFuZCBkaW1lbnNpb25zLiBJZiBgd2lkdGhgXG4gICAgaXMgbnVsbCwgdGhlIERPTSBlbGVtZW50IHdpbGwgZ2V0IG5vIHdpZHRoIHN0eWxlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY2xhc3NOYW1lLCBcbiAgICAvKipcbiAgICBUaGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgbWFya2VyIChpbiBwaXhlbHMsIGRvY3VtZW50LXJlbGF0aXZlKS5cbiAgICAqL1xuICAgIGxlZnQsIFxuICAgIC8qKlxuICAgIFRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIG1hcmtlci5cbiAgICAqL1xuICAgIHRvcCwgXG4gICAgLyoqXG4gICAgVGhlIHdpZHRoIG9mIHRoZSBtYXJrZXIsIG9yIG51bGwgaWYgaXQgc2hvdWxkbid0IGdldCBhIHdpZHRoIGFzc2lnbmVkLlxuICAgICovXG4gICAgd2lkdGgsIFxuICAgIC8qKlxuICAgIFRoZSBoZWlnaHQgb2YgdGhlIG1hcmtlci5cbiAgICAqL1xuICAgIGhlaWdodCkge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgfVxuICAgIGRyYXcoKSB7XG4gICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBlbHQuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWU7XG4gICAgICAgIHRoaXMuYWRqdXN0KGVsdCk7XG4gICAgICAgIHJldHVybiBlbHQ7XG4gICAgfVxuICAgIHVwZGF0ZShlbHQsIHByZXYpIHtcbiAgICAgICAgaWYgKHByZXYuY2xhc3NOYW1lICE9IHRoaXMuY2xhc3NOYW1lKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmFkanVzdChlbHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYWRqdXN0KGVsdCkge1xuICAgICAgICBlbHQuc3R5bGUubGVmdCA9IHRoaXMubGVmdCArIFwicHhcIjtcbiAgICAgICAgZWx0LnN0eWxlLnRvcCA9IHRoaXMudG9wICsgXCJweFwiO1xuICAgICAgICBpZiAodGhpcy53aWR0aCAhPSBudWxsKVxuICAgICAgICAgICAgZWx0LnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArIFwicHhcIjtcbiAgICAgICAgZWx0LnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgXCJweFwiO1xuICAgIH1cbiAgICBlcShwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZnQgPT0gcC5sZWZ0ICYmIHRoaXMudG9wID09IHAudG9wICYmIHRoaXMud2lkdGggPT0gcC53aWR0aCAmJiB0aGlzLmhlaWdodCA9PSBwLmhlaWdodCAmJlxuICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPT0gcC5jbGFzc05hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNldCBvZiByZWN0YW5nbGVzIGZvciB0aGUgZ2l2ZW4gc2VsZWN0aW9uIHJhbmdlLFxuICAgIGFzc2lnbmluZyB0aGVtIHRoZWNsYXNzYGNsYXNzTmFtZWAuIFdpbGwgY3JlYXRlIGEgc2luZ2xlXG4gICAgcmVjdGFuZ2xlIGZvciBlbXB0eSByYW5nZXMsIGFuZCBhIHNldCBvZiBzZWxlY3Rpb24tc3R5bGVcbiAgICByZWN0YW5nbGVzIGNvdmVyaW5nIHRoZSByYW5nZSdzIGNvbnRlbnQgKGluIGEgYmlkaS1hd2FyZVxuICAgIHdheSkgZm9yIG5vbi1lbXB0eSBvbmVzLlxuICAgICovXG4gICAgc3RhdGljIGZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgcmFuZ2UpIHtcbiAgICAgICAgaWYgKHJhbmdlLmVtcHR5KSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gdmlldy5jb29yZHNBdFBvcyhyYW5nZS5oZWFkLCByYW5nZS5hc3NvYyB8fCAxKTtcbiAgICAgICAgICAgIGlmICghcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIGxldCBiYXNlID0gZ2V0QmFzZSh2aWV3KTtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFJlY3RhbmdsZU1hcmtlcihjbGFzc05hbWUsIHBvcy5sZWZ0IC0gYmFzZS5sZWZ0LCBwb3MudG9wIC0gYmFzZS50b3AsIG51bGwsIHBvcy5ib3R0b20gLSBwb3MudG9wKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjdGFuZ2xlc0ZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgcmFuZ2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0QmFzZSh2aWV3KSB7XG4gICAgbGV0IHJlY3QgPSB2aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgbGVmdCA9IHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSID8gcmVjdC5sZWZ0IDogcmVjdC5yaWdodCAtIHZpZXcuc2Nyb2xsRE9NLmNsaWVudFdpZHRoICogdmlldy5zY2FsZVg7XG4gICAgcmV0dXJuIHsgbGVmdDogbGVmdCAtIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQgKiB2aWV3LnNjYWxlWCwgdG9wOiByZWN0LnRvcCAtIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCAqIHZpZXcuc2NhbGVZIH07XG59XG5mdW5jdGlvbiB3cmFwcGVkTGluZSh2aWV3LCBwb3MsIGluc2lkZSkge1xuICAgIGxldCByYW5nZSA9IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zKTtcbiAgICByZXR1cm4geyBmcm9tOiBNYXRoLm1heChpbnNpZGUuZnJvbSwgdmlldy5tb3ZlVG9MaW5lQm91bmRhcnkocmFuZ2UsIGZhbHNlLCB0cnVlKS5mcm9tKSxcbiAgICAgICAgdG86IE1hdGgubWluKGluc2lkZS50bywgdmlldy5tb3ZlVG9MaW5lQm91bmRhcnkocmFuZ2UsIHRydWUsIHRydWUpLmZyb20pLFxuICAgICAgICB0eXBlOiBCbG9ja1R5cGUuVGV4dCB9O1xufVxuZnVuY3Rpb24gcmVjdGFuZ2xlc0ZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgcmFuZ2UpIHtcbiAgICBpZiAocmFuZ2UudG8gPD0gdmlldy52aWV3cG9ydC5mcm9tIHx8IHJhbmdlLmZyb20gPj0gdmlldy52aWV3cG9ydC50bylcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIGxldCBmcm9tID0gTWF0aC5tYXgocmFuZ2UuZnJvbSwgdmlldy52aWV3cG9ydC5mcm9tKSwgdG8gPSBNYXRoLm1pbihyYW5nZS50bywgdmlldy52aWV3cG9ydC50byk7XG4gICAgbGV0IGx0ciA9IHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSO1xuICAgIGxldCBjb250ZW50ID0gdmlldy5jb250ZW50RE9NLCBjb250ZW50UmVjdCA9IGNvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGJhc2UgPSBnZXRCYXNlKHZpZXcpO1xuICAgIGxldCBsaW5lRWx0ID0gY29udGVudC5xdWVyeVNlbGVjdG9yKFwiLmNtLWxpbmVcIiksIGxpbmVTdHlsZSA9IGxpbmVFbHQgJiYgd2luZG93LmdldENvbXB1dGVkU3R5bGUobGluZUVsdCk7XG4gICAgbGV0IGxlZnRTaWRlID0gY29udGVudFJlY3QubGVmdCArXG4gICAgICAgIChsaW5lU3R5bGUgPyBwYXJzZUludChsaW5lU3R5bGUucGFkZGluZ0xlZnQpICsgTWF0aC5taW4oMCwgcGFyc2VJbnQobGluZVN0eWxlLnRleHRJbmRlbnQpKSA6IDApO1xuICAgIGxldCByaWdodFNpZGUgPSBjb250ZW50UmVjdC5yaWdodCAtIChsaW5lU3R5bGUgPyBwYXJzZUludChsaW5lU3R5bGUucGFkZGluZ1JpZ2h0KSA6IDApO1xuICAgIGxldCBzdGFydEJsb2NrID0gYmxvY2tBdCh2aWV3LCBmcm9tKSwgZW5kQmxvY2sgPSBibG9ja0F0KHZpZXcsIHRvKTtcbiAgICBsZXQgdmlzdWFsU3RhcnQgPSBzdGFydEJsb2NrLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQgPyBzdGFydEJsb2NrIDogbnVsbDtcbiAgICBsZXQgdmlzdWFsRW5kID0gZW5kQmxvY2sudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCA/IGVuZEJsb2NrIDogbnVsbDtcbiAgICBpZiAodmlzdWFsU3RhcnQgJiYgKHZpZXcubGluZVdyYXBwaW5nIHx8IHN0YXJ0QmxvY2sud2lkZ2V0TGluZUJyZWFrcykpXG4gICAgICAgIHZpc3VhbFN0YXJ0ID0gd3JhcHBlZExpbmUodmlldywgZnJvbSwgdmlzdWFsU3RhcnQpO1xuICAgIGlmICh2aXN1YWxFbmQgJiYgKHZpZXcubGluZVdyYXBwaW5nIHx8IGVuZEJsb2NrLndpZGdldExpbmVCcmVha3MpKVxuICAgICAgICB2aXN1YWxFbmQgPSB3cmFwcGVkTGluZSh2aWV3LCB0bywgdmlzdWFsRW5kKTtcbiAgICBpZiAodmlzdWFsU3RhcnQgJiYgdmlzdWFsRW5kICYmIHZpc3VhbFN0YXJ0LmZyb20gPT0gdmlzdWFsRW5kLmZyb20pIHtcbiAgICAgICAgcmV0dXJuIHBpZWNlcyhkcmF3Rm9yTGluZShyYW5nZS5mcm9tLCByYW5nZS50bywgdmlzdWFsU3RhcnQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCB0b3AgPSB2aXN1YWxTdGFydCA/IGRyYXdGb3JMaW5lKHJhbmdlLmZyb20sIG51bGwsIHZpc3VhbFN0YXJ0KSA6IGRyYXdGb3JXaWRnZXQoc3RhcnRCbG9jaywgZmFsc2UpO1xuICAgICAgICBsZXQgYm90dG9tID0gdmlzdWFsRW5kID8gZHJhd0ZvckxpbmUobnVsbCwgcmFuZ2UudG8sIHZpc3VhbEVuZCkgOiBkcmF3Rm9yV2lkZ2V0KGVuZEJsb2NrLCB0cnVlKTtcbiAgICAgICAgbGV0IGJldHdlZW4gPSBbXTtcbiAgICAgICAgaWYgKCh2aXN1YWxTdGFydCB8fCBzdGFydEJsb2NrKS50byA8ICh2aXN1YWxFbmQgfHwgZW5kQmxvY2spLmZyb20gLSAodmlzdWFsU3RhcnQgJiYgdmlzdWFsRW5kID8gMSA6IDApIHx8XG4gICAgICAgICAgICBzdGFydEJsb2NrLndpZGdldExpbmVCcmVha3MgPiAxICYmIHRvcC5ib3R0b20gKyB2aWV3LmRlZmF1bHRMaW5lSGVpZ2h0IC8gMiA8IGJvdHRvbS50b3ApXG4gICAgICAgICAgICBiZXR3ZWVuLnB1c2gocGllY2UobGVmdFNpZGUsIHRvcC5ib3R0b20sIHJpZ2h0U2lkZSwgYm90dG9tLnRvcCkpO1xuICAgICAgICBlbHNlIGlmICh0b3AuYm90dG9tIDwgYm90dG9tLnRvcCAmJiB2aWV3LmVsZW1lbnRBdEhlaWdodCgodG9wLmJvdHRvbSArIGJvdHRvbS50b3ApIC8gMikudHlwZSA9PSBCbG9ja1R5cGUuVGV4dClcbiAgICAgICAgICAgIHRvcC5ib3R0b20gPSBib3R0b20udG9wID0gKHRvcC5ib3R0b20gKyBib3R0b20udG9wKSAvIDI7XG4gICAgICAgIHJldHVybiBwaWVjZXModG9wKS5jb25jYXQoYmV0d2VlbikuY29uY2F0KHBpZWNlcyhib3R0b20pKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGllY2UobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlTWFya2VyKGNsYXNzTmFtZSwgbGVmdCAtIGJhc2UubGVmdCwgdG9wIC0gYmFzZS50b3AgLSAwLjAxIC8qIEMuRXBzaWxvbiAqLywgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3AgKyAwLjAxIC8qIEMuRXBzaWxvbiAqLyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBpZWNlcyh7IHRvcCwgYm90dG9tLCBob3Jpem9udGFsIH0pIHtcbiAgICAgICAgbGV0IHBpZWNlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhvcml6b250YWwubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgICAgICBwaWVjZXMucHVzaChwaWVjZShob3Jpem9udGFsW2ldLCB0b3AsIGhvcml6b250YWxbaSArIDFdLCBib3R0b20pKTtcbiAgICAgICAgcmV0dXJuIHBpZWNlcztcbiAgICB9XG4gICAgLy8gR2V0cyBwYXNzZWQgZnJvbS90byBpbiBsaW5lLWxvY2FsIHBvc2l0aW9uc1xuICAgIGZ1bmN0aW9uIGRyYXdGb3JMaW5lKGZyb20sIHRvLCBsaW5lKSB7XG4gICAgICAgIGxldCB0b3AgPSAxZTksIGJvdHRvbSA9IC0xZTksIGhvcml6b250YWwgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gYWRkU3Bhbihmcm9tLCBmcm9tT3BlbiwgdG8sIHRvT3BlbiwgZGlyKSB7XG4gICAgICAgICAgICAvLyBQYXNzaW5nIDIvLTIgaXMgYSBrbHVkZ2UgdG8gZm9yY2UgdGhlIHZpZXcgdG8gcmV0dXJuXG4gICAgICAgICAgICAvLyBjb29yZGluYXRlcyBvbiB0aGUgcHJvcGVyIHNpZGUgb2YgYmxvY2sgd2lkZ2V0cywgc2luY2VcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6aW5nIHRoZSBzaWRlIHRoZXJlLCB0aG91Z2ggYXBwcm9wcmlhdGUgZm9yIG1vc3RcbiAgICAgICAgICAgIC8vIGNvb3Jkc0F0UG9zIHF1ZXJpZXMsIHdvdWxkIGJyZWFrIHNlbGVjdGlvbiBkcmF3aW5nLlxuICAgICAgICAgICAgbGV0IGZyb21Db29yZHMgPSB2aWV3LmNvb3Jkc0F0UG9zKGZyb20sIChmcm9tID09IGxpbmUudG8gPyAtMiA6IDIpKTtcbiAgICAgICAgICAgIGxldCB0b0Nvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3ModG8sICh0byA9PSBsaW5lLmZyb20gPyAyIDogLTIpKTtcbiAgICAgICAgICAgIGlmICghZnJvbUNvb3JkcyB8fCAhdG9Db29yZHMpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdG9wID0gTWF0aC5taW4oZnJvbUNvb3Jkcy50b3AsIHRvQ29vcmRzLnRvcCwgdG9wKTtcbiAgICAgICAgICAgIGJvdHRvbSA9IE1hdGgubWF4KGZyb21Db29yZHMuYm90dG9tLCB0b0Nvb3Jkcy5ib3R0b20sIGJvdHRvbSk7XG4gICAgICAgICAgICBpZiAoZGlyID09IERpcmVjdGlvbi5MVFIpXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5wdXNoKGx0ciAmJiBmcm9tT3BlbiA/IGxlZnRTaWRlIDogZnJvbUNvb3Jkcy5sZWZ0LCBsdHIgJiYgdG9PcGVuID8gcmlnaHRTaWRlIDogdG9Db29yZHMucmlnaHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGhvcml6b250YWwucHVzaCghbHRyICYmIHRvT3BlbiA/IGxlZnRTaWRlIDogdG9Db29yZHMubGVmdCwgIWx0ciAmJiBmcm9tT3BlbiA/IHJpZ2h0U2lkZSA6IGZyb21Db29yZHMucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydCA9IGZyb20gIT09IG51bGwgJiYgZnJvbSAhPT0gdm9pZCAwID8gZnJvbSA6IGxpbmUuZnJvbSwgZW5kID0gdG8gIT09IG51bGwgJiYgdG8gIT09IHZvaWQgMCA/IHRvIDogbGluZS50bztcbiAgICAgICAgLy8gU3BsaXQgdGhlIHJhbmdlIGJ5IHZpc2libGUgcmFuZ2UgYW5kIGRvY3VtZW50IGxpbmVcbiAgICAgICAgZm9yIChsZXQgciBvZiB2aWV3LnZpc2libGVSYW5nZXMpXG4gICAgICAgICAgICBpZiAoci50byA+IHN0YXJ0ICYmIHIuZnJvbSA8IGVuZCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBvcyA9IE1hdGgubWF4KHIuZnJvbSwgc3RhcnQpLCBlbmRQb3MgPSBNYXRoLm1pbihyLnRvLCBlbmQpOzspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvY0xpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3BhbiBvZiB2aWV3LmJpZGlTcGFucyhkb2NMaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwYW5Gcm9tID0gc3Bhbi5mcm9tICsgZG9jTGluZS5mcm9tLCBzcGFuVG8gPSBzcGFuLnRvICsgZG9jTGluZS5mcm9tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5Gcm9tID49IGVuZFBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuVG8gPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3BhbihNYXRoLm1heChzcGFuRnJvbSwgcG9zKSwgZnJvbSA9PSBudWxsICYmIHNwYW5Gcm9tIDw9IHN0YXJ0LCBNYXRoLm1pbihzcGFuVG8sIGVuZFBvcyksIHRvID09IG51bGwgJiYgc3BhblRvID49IGVuZCwgc3Bhbi5kaXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IGRvY0xpbmUudG8gKyAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zID49IGVuZFBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGhvcml6b250YWwubGVuZ3RoID09IDApXG4gICAgICAgICAgICBhZGRTcGFuKHN0YXJ0LCBmcm9tID09IG51bGwsIGVuZCwgdG8gPT0gbnVsbCwgdmlldy50ZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHsgdG9wLCBib3R0b20sIGhvcml6b250YWwgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZHJhd0ZvcldpZGdldChibG9jaywgdG9wKSB7XG4gICAgICAgIGxldCB5ID0gY29udGVudFJlY3QudG9wICsgKHRvcCA/IGJsb2NrLnRvcCA6IGJsb2NrLmJvdHRvbSk7XG4gICAgICAgIHJldHVybiB7IHRvcDogeSwgYm90dG9tOiB5LCBob3Jpem9udGFsOiBbXSB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVNYXJrZXIoYSwgYikge1xuICAgIHJldHVybiBhLmNvbnN0cnVjdG9yID09IGIuY29uc3RydWN0b3IgJiYgYS5lcShiKTtcbn1cbmNsYXNzIExheWVyVmlldyB7XG4gICAgY29uc3RydWN0b3IodmlldywgbGF5ZXIpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5sYXllciA9IGxheWVyO1xuICAgICAgICB0aGlzLmRyYXduID0gW107XG4gICAgICAgIHRoaXMuc2NhbGVYID0gMTtcbiAgICAgICAgdGhpcy5zY2FsZVkgPSAxO1xuICAgICAgICB0aGlzLm1lYXN1cmVSZXEgPSB7IHJlYWQ6IHRoaXMubWVhc3VyZS5iaW5kKHRoaXMpLCB3cml0ZTogdGhpcy5kcmF3LmJpbmQodGhpcykgfTtcbiAgICAgICAgdGhpcy5kb20gPSB2aWV3LnNjcm9sbERPTS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChcImNtLWxheWVyXCIpO1xuICAgICAgICBpZiAobGF5ZXIuYWJvdmUpXG4gICAgICAgICAgICB0aGlzLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tbGF5ZXItYWJvdmVcIik7XG4gICAgICAgIGlmIChsYXllci5jbGFzcylcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQobGF5ZXIuY2xhc3MpO1xuICAgICAgICB0aGlzLnNjYWxlKCk7XG4gICAgICAgIHRoaXMuZG9tLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgdGhpcy5zZXRPcmRlcih2aWV3LnN0YXRlKTtcbiAgICAgICAgdmlldy5yZXF1ZXN0TWVhc3VyZSh0aGlzLm1lYXN1cmVSZXEpO1xuICAgICAgICBpZiAobGF5ZXIubW91bnQpXG4gICAgICAgICAgICBsYXllci5tb3VudCh0aGlzLmRvbSwgdmlldyk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGxheWVyT3JkZXIpICE9IHVwZGF0ZS5zdGF0ZS5mYWNldChsYXllck9yZGVyKSlcbiAgICAgICAgICAgIHRoaXMuc2V0T3JkZXIodXBkYXRlLnN0YXRlKTtcbiAgICAgICAgaWYgKHRoaXMubGF5ZXIudXBkYXRlKHVwZGF0ZSwgdGhpcy5kb20pIHx8IHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2NhbGUoKTtcbiAgICAgICAgICAgIHVwZGF0ZS52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0T3JkZXIoc3RhdGUpIHtcbiAgICAgICAgbGV0IHBvcyA9IDAsIG9yZGVyID0gc3RhdGUuZmFjZXQobGF5ZXJPcmRlcik7XG4gICAgICAgIHdoaWxlIChwb3MgPCBvcmRlci5sZW5ndGggJiYgb3JkZXJbcG9zXSAhPSB0aGlzLmxheWVyKVxuICAgICAgICAgICAgcG9zKys7XG4gICAgICAgIHRoaXMuZG9tLnN0eWxlLnpJbmRleCA9IFN0cmluZygodGhpcy5sYXllci5hYm92ZSA/IDE1MCA6IC0xKSAtIHBvcyk7XG4gICAgfVxuICAgIG1lYXN1cmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheWVyLm1hcmtlcnModGhpcy52aWV3KTtcbiAgICB9XG4gICAgc2NhbGUoKSB7XG4gICAgICAgIGxldCB7IHNjYWxlWCwgc2NhbGVZIH0gPSB0aGlzLnZpZXc7XG4gICAgICAgIGlmIChzY2FsZVggIT0gdGhpcy5zY2FsZVggfHwgc2NhbGVZICE9IHRoaXMuc2NhbGVZKSB7XG4gICAgICAgICAgICB0aGlzLnNjYWxlWCA9IHNjYWxlWDtcbiAgICAgICAgICAgIHRoaXMuc2NhbGVZID0gc2NhbGVZO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MSAvIHNjYWxlWH0sICR7MSAvIHNjYWxlWX0pYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkcmF3KG1hcmtlcnMpIHtcbiAgICAgICAgaWYgKG1hcmtlcnMubGVuZ3RoICE9IHRoaXMuZHJhd24ubGVuZ3RoIHx8IG1hcmtlcnMuc29tZSgocCwgaSkgPT4gIXNhbWVNYXJrZXIocCwgdGhpcy5kcmF3bltpXSkpKSB7XG4gICAgICAgICAgICBsZXQgb2xkID0gdGhpcy5kb20uZmlyc3RDaGlsZCwgb2xkSSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBtYXJrZXIgb2YgbWFya2Vycykge1xuICAgICAgICAgICAgICAgIGlmIChtYXJrZXIudXBkYXRlICYmIG9sZCAmJiBtYXJrZXIuY29uc3RydWN0b3IgJiYgdGhpcy5kcmF3bltvbGRJXS5jb25zdHJ1Y3RvciAmJlxuICAgICAgICAgICAgICAgICAgICBtYXJrZXIudXBkYXRlKG9sZCwgdGhpcy5kcmF3bltvbGRJXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb2xkID0gb2xkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBvbGRJKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5pbnNlcnRCZWZvcmUobWFya2VyLmRyYXcoKSwgb2xkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAob2xkKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBvbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgb2xkLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIG9sZCA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRyYXduID0gbWFya2VycztcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5sYXllci5kZXN0cm95KVxuICAgICAgICAgICAgdGhpcy5sYXllci5kZXN0cm95KHRoaXMuZG9tLCB0aGlzLnZpZXcpO1xuICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICB9XG59XG5jb25zdCBsYXllck9yZGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5EZWZpbmUgYSBsYXllci5cbiovXG5mdW5jdGlvbiBsYXllcihjb25maWcpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBWaWV3UGx1Z2luLmRlZmluZSh2ID0+IG5ldyBMYXllclZpZXcodiwgY29uZmlnKSksXG4gICAgICAgIGxheWVyT3JkZXIub2YoY29uZmlnKVxuICAgIF07XG59XG5cbmNvbnN0IENhbkhpZGVQcmltYXJ5ID0gIWJyb3dzZXIuaW9zOyAvLyBGSVhNRSB0ZXN0IElFXG5jb25zdCBzZWxlY3Rpb25Db25maWcgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKGNvbmZpZ3MpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVDb25maWcoY29uZmlncywge1xuICAgICAgICAgICAgY3Vyc29yQmxpbmtSYXRlOiAxMjAwLFxuICAgICAgICAgICAgZHJhd1JhbmdlQ3Vyc29yOiB0cnVlXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGN1cnNvckJsaW5rUmF0ZTogKGEsIGIpID0+IE1hdGgubWluKGEsIGIpLFxuICAgICAgICAgICAgZHJhd1JhbmdlQ3Vyc29yOiAoYSwgYikgPT4gYSB8fCBiXG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGhpZGVzIHRoZSBicm93c2VyJ3MgbmF0aXZlIHNlbGVjdGlvbiBhbmRcbmN1cnNvciwgcmVwbGFjaW5nIHRoZSBzZWxlY3Rpb24gd2l0aCBhIGJhY2tncm91bmQgYmVoaW5kIHRoZSB0ZXh0XG4od2l0aCB0aGUgYGNtLXNlbGVjdGlvbkJhY2tncm91bmRgIGNsYXNzKSwgYW5kIHRoZVxuY3Vyc29ycyB3aXRoIGVsZW1lbnRzIG92ZXJsYWlkIG92ZXIgdGhlIGNvZGUgKHVzaW5nXG5gY20tY3Vyc29yLXByaW1hcnlgIGFuZCBgY20tY3Vyc29yLXNlY29uZGFyeWApLlxuXG5UaGlzIGFsbG93cyB0aGUgZWRpdG9yIHRvIGRpc3BsYXkgc2Vjb25kYXJ5IHNlbGVjdGlvbiByYW5nZXMsIGFuZFxudGVuZHMgdG8gcHJvZHVjZSBhIHR5cGUgb2Ygc2VsZWN0aW9uIG1vcmUgaW4gbGluZSB3aXRoIHRoYXQgdXNlcnNcbmV4cGVjdCBpbiBhIHRleHQgZWRpdG9yICh0aGUgbmF0aXZlIHNlbGVjdGlvbiBzdHlsaW5nIHdpbGwgb2Z0ZW5cbmxlYXZlIGdhcHMgYmV0d2VlbiBsaW5lcyBhbmQgd29uJ3QgZmlsbCB0aGUgaG9yaXpvbnRhbCBzcGFjZSBhZnRlclxuYSBsaW5lIHdoZW4gdGhlIHNlbGVjdGlvbiBjb250aW51ZXMgcGFzdCBpdCkuXG5cbkl0IGRvZXMgaGF2ZSBhIHBlcmZvcm1hbmNlIGNvc3QsIGluIHRoYXQgaXQgcmVxdWlyZXMgYW4gZXh0cmEgRE9NXG5sYXlvdXQgY3ljbGUgZm9yIG1hbnkgdXBkYXRlcyAodGhlIHNlbGVjdGlvbiBpcyBkcmF3biBiYXNlZCBvbiBET01cbmxheW91dCBpbmZvcm1hdGlvbiB0aGF0J3Mgb25seSBhdmFpbGFibGUgYWZ0ZXIgbGF5aW5nIG91dCB0aGVcbmNvbnRlbnQpLlxuKi9cbmZ1bmN0aW9uIGRyYXdTZWxlY3Rpb24oY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBzZWxlY3Rpb25Db25maWcub2YoY29uZmlnKSxcbiAgICAgICAgY3Vyc29yTGF5ZXIsXG4gICAgICAgIHNlbGVjdGlvbkxheWVyLFxuICAgICAgICBoaWRlTmF0aXZlU2VsZWN0aW9uLFxuICAgICAgICBuYXRpdmVTZWxlY3Rpb25IaWRkZW4ub2YodHJ1ZSlcbiAgICBdO1xufVxuLyoqXG5SZXRyaWV2ZSB0aGUgW2BkcmF3U2VsZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LmRyYXdTZWxlY3Rpb24pIGNvbmZpZ3VyYXRpb25cbmZvciB0aGlzIHN0YXRlLiAoTm90ZSB0aGF0IHRoaXMgd2lsbCByZXR1cm4gYSBzZXQgb2YgZGVmYXVsdHMgZXZlblxuaWYgYGRyYXdTZWxlY3Rpb25gIGlzbid0IGVuYWJsZWQuKVxuKi9cbmZ1bmN0aW9uIGdldERyYXdTZWxlY3Rpb25Db25maWcoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKTtcbn1cbmZ1bmN0aW9uIGNvbmZpZ0NoYW5nZWQodXBkYXRlKSB7XG4gICAgcmV0dXJuIHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHNlbGVjdGlvbkNvbmZpZykgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KHNlbGVjdGlvbkNvbmZpZyk7XG59XG5jb25zdCBjdXJzb3JMYXllciA9IC8qQF9fUFVSRV9fKi9sYXllcih7XG4gICAgYWJvdmU6IHRydWUsXG4gICAgbWFya2Vycyh2aWV3KSB7XG4gICAgICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBjb25mID0gc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKTtcbiAgICAgICAgbGV0IGN1cnNvcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgciBvZiBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgICAgICBsZXQgcHJpbSA9IHIgPT0gc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgICAgICBpZiAoci5lbXB0eSA/ICFwcmltIHx8IENhbkhpZGVQcmltYXJ5IDogY29uZi5kcmF3UmFuZ2VDdXJzb3IpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gcHJpbSA/IFwiY20tY3Vyc29yIGNtLWN1cnNvci1wcmltYXJ5XCIgOiBcImNtLWN1cnNvciBjbS1jdXJzb3Itc2Vjb25kYXJ5XCI7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnNvciA9IHIuZW1wdHkgPyByIDogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyLmhlYWQsIHIuaGVhZCA+IHIuYW5jaG9yID8gLTEgOiAxKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwaWVjZSBvZiBSZWN0YW5nbGVNYXJrZXIuZm9yUmFuZ2UodmlldywgY2xhc3NOYW1lLCBjdXJzb3IpKVxuICAgICAgICAgICAgICAgICAgICBjdXJzb3JzLnB1c2gocGllY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdXJzb3JzO1xuICAgIH0sXG4gICAgdXBkYXRlKHVwZGF0ZSwgZG9tKSB7XG4gICAgICAgIGlmICh1cGRhdGUudHJhbnNhY3Rpb25zLnNvbWUodHIgPT4gdHIuc2VsZWN0aW9uKSlcbiAgICAgICAgICAgIGRvbS5zdHlsZS5hbmltYXRpb25OYW1lID0gZG9tLnN0eWxlLmFuaW1hdGlvbk5hbWUgPT0gXCJjbS1ibGlua1wiID8gXCJjbS1ibGluazJcIiA6IFwiY20tYmxpbmtcIjtcbiAgICAgICAgbGV0IGNvbmZDaGFuZ2UgPSBjb25maWdDaGFuZ2VkKHVwZGF0ZSk7XG4gICAgICAgIGlmIChjb25mQ2hhbmdlKVxuICAgICAgICAgICAgc2V0QmxpbmtSYXRlKHVwZGF0ZS5zdGF0ZSwgZG9tKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5zZWxlY3Rpb25TZXQgfHwgY29uZkNoYW5nZTtcbiAgICB9LFxuICAgIG1vdW50KGRvbSwgdmlldykge1xuICAgICAgICBzZXRCbGlua1JhdGUodmlldy5zdGF0ZSwgZG9tKTtcbiAgICB9LFxuICAgIGNsYXNzOiBcImNtLWN1cnNvckxheWVyXCJcbn0pO1xuZnVuY3Rpb24gc2V0QmxpbmtSYXRlKHN0YXRlLCBkb20pIHtcbiAgICBkb20uc3R5bGUuYW5pbWF0aW9uRHVyYXRpb24gPSBzdGF0ZS5mYWNldChzZWxlY3Rpb25Db25maWcpLmN1cnNvckJsaW5rUmF0ZSArIFwibXNcIjtcbn1cbmNvbnN0IHNlbGVjdGlvbkxheWVyID0gLypAX19QVVJFX18qL2xheWVyKHtcbiAgICBhYm92ZTogZmFsc2UsXG4gICAgbWFya2Vycyh2aWV3KSB7XG4gICAgICAgIHJldHVybiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubWFwKHIgPT4gci5lbXB0eSA/IFtdIDogUmVjdGFuZ2xlTWFya2VyLmZvclJhbmdlKHZpZXcsIFwiY20tc2VsZWN0aW9uQmFja2dyb3VuZFwiLCByKSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpKTtcbiAgICB9LFxuICAgIHVwZGF0ZSh1cGRhdGUsIGRvbSkge1xuICAgICAgICByZXR1cm4gdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldCB8fCB1cGRhdGUudmlld3BvcnRDaGFuZ2VkIHx8IGNvbmZpZ0NoYW5nZWQodXBkYXRlKTtcbiAgICB9LFxuICAgIGNsYXNzOiBcImNtLXNlbGVjdGlvbkxheWVyXCJcbn0pO1xuY29uc3QgdGhlbWVTcGVjID0ge1xuICAgIFwiLmNtLWxpbmVcIjoge1xuICAgICAgICBcIiYgOjpzZWxlY3Rpb25cIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwidHJhbnNwYXJlbnQgIWltcG9ydGFudFwiIH0sXG4gICAgICAgIFwiJjo6c2VsZWN0aW9uXCI6IHsgYmFja2dyb3VuZENvbG9yOiBcInRyYW5zcGFyZW50ICFpbXBvcnRhbnRcIiB9XG4gICAgfVxufTtcbmlmIChDYW5IaWRlUHJpbWFyeSkge1xuICAgIHRoZW1lU3BlY1tcIi5jbS1saW5lXCJdLmNhcmV0Q29sb3IgPSBcInRyYW5zcGFyZW50ICFpbXBvcnRhbnRcIjtcbiAgICB0aGVtZVNwZWNbXCIuY20tY29udGVudFwiXSA9IHsgY2FyZXRDb2xvcjogXCJ0cmFuc3BhcmVudCAhaW1wb3J0YW50XCIgfTtcbn1cbmNvbnN0IGhpZGVOYXRpdmVTZWxlY3Rpb24gPSAvKkBfX1BVUkVfXyovUHJlYy5oaWdoZXN0KC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LnRoZW1lKHRoZW1lU3BlYykpO1xuXG5jb25zdCBzZXREcm9wQ3Vyc29yUG9zID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSh7XG4gICAgbWFwKHBvcywgbWFwcGluZykgeyByZXR1cm4gcG9zID09IG51bGwgPyBudWxsIDogbWFwcGluZy5tYXBQb3MocG9zKTsgfVxufSk7XG5jb25zdCBkcm9wQ3Vyc29yUG9zID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGUoKSB7IHJldHVybiBudWxsOyB9LFxuICAgIHVwZGF0ZShwb3MsIHRyKSB7XG4gICAgICAgIGlmIChwb3MgIT0gbnVsbClcbiAgICAgICAgICAgIHBvcyA9IHRyLmNoYW5nZXMubWFwUG9zKHBvcyk7XG4gICAgICAgIHJldHVybiB0ci5lZmZlY3RzLnJlZHVjZSgocG9zLCBlKSA9PiBlLmlzKHNldERyb3BDdXJzb3JQb3MpID8gZS52YWx1ZSA6IHBvcywgcG9zKTtcbiAgICB9XG59KTtcbmNvbnN0IGRyYXdEcm9wQ3Vyc29yID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZWFzdXJlUmVxID0geyByZWFkOiB0aGlzLnJlYWRQb3MuYmluZCh0aGlzKSwgd3JpdGU6IHRoaXMuZHJhd0N1cnNvci5iaW5kKHRoaXMpIH07XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY3Vyc29yUG9zID0gdXBkYXRlLnN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpO1xuICAgICAgICBpZiAoY3Vyc29yUG9zID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnNvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgKF9hID0gdGhpcy5jdXJzb3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IgPSB0aGlzLnZpZXcuc2Nyb2xsRE9NLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLmNsYXNzTmFtZSA9IFwiY20tZHJvcEN1cnNvclwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpICE9IGN1cnNvclBvcyB8fCB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuZ2VvbWV0cnlDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSh0aGlzLm1lYXN1cmVSZXEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlYWRQb3MoKSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXM7XG4gICAgICAgIGxldCBwb3MgPSB2aWV3LnN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpO1xuICAgICAgICBsZXQgcmVjdCA9IHBvcyAhPSBudWxsICYmIHZpZXcuY29vcmRzQXRQb3MocG9zKTtcbiAgICAgICAgaWYgKCFyZWN0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBvdXRlciA9IHZpZXcuc2Nyb2xsRE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0IC0gb3V0ZXIubGVmdCArIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQgKiB2aWV3LnNjYWxlWCxcbiAgICAgICAgICAgIHRvcDogcmVjdC50b3AgLSBvdXRlci50b3AgKyB2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3AgKiB2aWV3LnNjYWxlWSxcbiAgICAgICAgICAgIGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuICAgICAgICB9O1xuICAgIH1cbiAgICBkcmF3Q3Vyc29yKHBvcykge1xuICAgICAgICBpZiAodGhpcy5jdXJzb3IpIHtcbiAgICAgICAgICAgIGxldCB7IHNjYWxlWCwgc2NhbGVZIH0gPSB0aGlzLnZpZXc7XG4gICAgICAgICAgICBpZiAocG9zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUubGVmdCA9IHBvcy5sZWZ0IC8gc2NhbGVYICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLnRvcCA9IHBvcy50b3AgLyBzY2FsZVkgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUuaGVpZ2h0ID0gcG9zLmhlaWdodCAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLmxlZnQgPSBcIi0xMDAwMDBweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnNvcilcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yLnJlbW92ZSgpO1xuICAgIH1cbiAgICBzZXREcm9wUG9zKHBvcykge1xuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlLmZpZWxkKGRyb3BDdXJzb3JQb3MpICE9IHBvcylcbiAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHNldERyb3BDdXJzb3JQb3Mub2YocG9zKSB9KTtcbiAgICB9XG59LCB7XG4gICAgZXZlbnRPYnNlcnZlcnM6IHtcbiAgICAgICAgZHJhZ292ZXIoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RHJvcFBvcyh0aGlzLnZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2xlYXZlKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09IHRoaXMudmlldy5jb250ZW50RE9NIHx8ICF0aGlzLnZpZXcuY29udGVudERPTS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldERyb3BQb3MobnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRyYWdlbmQoKSB7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BQb3MobnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRyb3AoKSB7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BQb3MobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbi8qKlxuRHJhd3MgYSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgZHJvcCBwb3NpdGlvbiB3aGVuIHNvbWV0aGluZyBpc1xuZHJhZ2dlZCBvdmVyIHRoZSBlZGl0b3IuXG4qL1xuZnVuY3Rpb24gZHJvcEN1cnNvcigpIHtcbiAgICByZXR1cm4gW2Ryb3BDdXJzb3JQb3MsIGRyYXdEcm9wQ3Vyc29yXTtcbn1cblxuZnVuY3Rpb24gaXRlck1hdGNoZXMoZG9jLCByZSwgZnJvbSwgdG8sIGYpIHtcbiAgICByZS5sYXN0SW5kZXggPSAwO1xuICAgIGZvciAobGV0IGN1cnNvciA9IGRvYy5pdGVyUmFuZ2UoZnJvbSwgdG8pLCBwb3MgPSBmcm9tLCBtOyAhY3Vyc29yLm5leHQoKS5kb25lOyBwb3MgKz0gY3Vyc29yLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICBpZiAoIWN1cnNvci5saW5lQnJlYWspXG4gICAgICAgICAgICB3aGlsZSAobSA9IHJlLmV4ZWMoY3Vyc29yLnZhbHVlKSlcbiAgICAgICAgICAgICAgICBmKHBvcyArIG0uaW5kZXgsIG0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1hdGNoUmFuZ2VzKHZpZXcsIG1heExlbmd0aCkge1xuICAgIGxldCB2aXNpYmxlID0gdmlldy52aXNpYmxlUmFuZ2VzO1xuICAgIGlmICh2aXNpYmxlLmxlbmd0aCA9PSAxICYmIHZpc2libGVbMF0uZnJvbSA9PSB2aWV3LnZpZXdwb3J0LmZyb20gJiZcbiAgICAgICAgdmlzaWJsZVswXS50byA9PSB2aWV3LnZpZXdwb3J0LnRvKVxuICAgICAgICByZXR1cm4gdmlzaWJsZTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHZpc2libGUpIHtcbiAgICAgICAgZnJvbSA9IE1hdGgubWF4KHZpZXcuc3RhdGUuZG9jLmxpbmVBdChmcm9tKS5mcm9tLCBmcm9tIC0gbWF4TGVuZ3RoKTtcbiAgICAgICAgdG8gPSBNYXRoLm1pbih2aWV3LnN0YXRlLmRvYy5saW5lQXQodG8pLnRvLCB0byArIG1heExlbmd0aCk7XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICYmIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0udG8gPj0gZnJvbSlcbiAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0udG8gPSB0bztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuSGVscGVyIGNsYXNzIHVzZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gbWFpbnRhaW4gZGVjb3JhdGlvbnMgb25cbnZpc2libGUgY29kZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uIFRvIGJlIHVzZWRcbmluIGEgW3ZpZXcgcGx1Z2luXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuVmlld1BsdWdpbikuIEluc3RhbmNlcyBvZiB0aGlzIG9iamVjdFxucmVwcmVzZW50IGEgbWF0Y2hpbmcgY29uZmlndXJhdGlvbi5cbiovXG5jbGFzcyBNYXRjaERlY29yYXRvciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgZGVjb3JhdG9yLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHsgcmVnZXhwLCBkZWNvcmF0aW9uLCBkZWNvcmF0ZSwgYm91bmRhcnksIG1heExlbmd0aCA9IDEwMDAgfSA9IGNvbmZpZztcbiAgICAgICAgaWYgKCFyZWdleHAuZ2xvYmFsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgcmVndWxhciBleHByZXNzaW9uIGdpdmVuIHRvIE1hdGNoRGVjb3JhdG9yIHNob3VsZCBoYXZlIGl0cyAnZycgZmxhZyBzZXRcIik7XG4gICAgICAgIHRoaXMucmVnZXhwID0gcmVnZXhwO1xuICAgICAgICBpZiAoZGVjb3JhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2ggPSAobWF0Y2gsIHZpZXcsIGZyb20sIGFkZCkgPT4gZGVjb3JhdGUoYWRkLCBmcm9tLCBmcm9tICsgbWF0Y2hbMF0ubGVuZ3RoLCBtYXRjaCwgdmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlY29yYXRpb24gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE1hdGNoID0gKG1hdGNoLCB2aWV3LCBmcm9tLCBhZGQpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZGVjbyA9IGRlY29yYXRpb24obWF0Y2gsIHZpZXcsIGZyb20pO1xuICAgICAgICAgICAgICAgIGlmIChkZWNvKVxuICAgICAgICAgICAgICAgICAgICBhZGQoZnJvbSwgZnJvbSArIG1hdGNoWzBdLmxlbmd0aCwgZGVjbyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlY29yYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2ggPSAobWF0Y2gsIF92aWV3LCBmcm9tLCBhZGQpID0+IGFkZChmcm9tLCBmcm9tICsgbWF0Y2hbMF0ubGVuZ3RoLCBkZWNvcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRWl0aGVyICdkZWNvcmF0ZScgb3IgJ2RlY29yYXRpb24nIHNob3VsZCBiZSBwcm92aWRlZCB0byBNYXRjaERlY29yYXRvclwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJvdW5kYXJ5ID0gYm91bmRhcnk7XG4gICAgICAgIHRoaXMubWF4TGVuZ3RoID0gbWF4TGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wdXRlIHRoZSBmdWxsIHNldCBvZiBkZWNvcmF0aW9ucyBmb3IgbWF0Y2hlcyBpbiB0aGUgZ2l2ZW5cbiAgICB2aWV3J3Mgdmlld3BvcnQuIFlvdSdsbCB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIGluaXRpYWxpemluZyB5b3VyXG4gICAgcGx1Z2luLlxuICAgICovXG4gICAgY3JlYXRlRGVjbyh2aWV3KSB7XG4gICAgICAgIGxldCBidWlsZCA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKSwgYWRkID0gYnVpbGQuYWRkLmJpbmQoYnVpbGQpO1xuICAgICAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2YgbWF0Y2hSYW5nZXModmlldywgdGhpcy5tYXhMZW5ndGgpKVxuICAgICAgICAgICAgaXRlck1hdGNoZXModmlldy5zdGF0ZS5kb2MsIHRoaXMucmVnZXhwLCBmcm9tLCB0bywgKGZyb20sIG0pID0+IHRoaXMuYWRkTWF0Y2gobSwgdmlldywgZnJvbSwgYWRkKSk7XG4gICAgICAgIHJldHVybiBidWlsZC5maW5pc2goKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIGEgc2V0IG9mIGRlY29yYXRpb25zIGZvciBhIHZpZXcgdXBkYXRlLiBgZGVjb2AgX211c3RfIGJlXG4gICAgdGhlIHNldCBvZiBkZWNvcmF0aW9ucyBwcm9kdWNlZCBieSBfdGhpc18gYE1hdGNoRGVjb3JhdG9yYCBmb3JcbiAgICB0aGUgdmlldyBzdGF0ZSBiZWZvcmUgdGhlIHVwZGF0ZS5cbiAgICAqL1xuICAgIHVwZGF0ZURlY28odXBkYXRlLCBkZWNvKSB7XG4gICAgICAgIGxldCBjaGFuZ2VGcm9tID0gMWU5LCBjaGFuZ2VUbyA9IC0xO1xuICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQpXG4gICAgICAgICAgICB1cGRhdGUuY2hhbmdlcy5pdGVyQ2hhbmdlcygoX2YsIF90LCBmcm9tLCB0bykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0byA+IHVwZGF0ZS52aWV3LnZpZXdwb3J0LmZyb20gJiYgZnJvbSA8IHVwZGF0ZS52aWV3LnZpZXdwb3J0LnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZUZyb20gPSBNYXRoLm1pbihmcm9tLCBjaGFuZ2VGcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlVG8gPSBNYXRoLm1heCh0bywgY2hhbmdlVG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAodXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fCBjaGFuZ2VUbyAtIGNoYW5nZUZyb20gPiAxMDAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRGVjbyh1cGRhdGUudmlldyk7XG4gICAgICAgIGlmIChjaGFuZ2VUbyA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUmFuZ2UodXBkYXRlLnZpZXcsIGRlY28ubWFwKHVwZGF0ZS5jaGFuZ2VzKSwgY2hhbmdlRnJvbSwgY2hhbmdlVG8pO1xuICAgICAgICByZXR1cm4gZGVjbztcbiAgICB9XG4gICAgdXBkYXRlUmFuZ2UodmlldywgZGVjbywgdXBkYXRlRnJvbSwgdXBkYXRlVG8pIHtcbiAgICAgICAgZm9yIChsZXQgciBvZiB2aWV3LnZpc2libGVSYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gTWF0aC5tYXgoci5mcm9tLCB1cGRhdGVGcm9tKSwgdG8gPSBNYXRoLm1pbihyLnRvLCB1cGRhdGVUbyk7XG4gICAgICAgICAgICBpZiAodG8gPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb21MaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KGZyb20pLCB0b0xpbmUgPSBmcm9tTGluZS50byA8IHRvID8gdmlldy5zdGF0ZS5kb2MubGluZUF0KHRvKSA6IGZyb21MaW5lO1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IE1hdGgubWF4KHIuZnJvbSwgZnJvbUxpbmUuZnJvbSksIGVuZCA9IE1hdGgubWluKHIudG8sIHRvTGluZS50byk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYm91bmRhcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICg7IGZyb20gPiBmcm9tTGluZS5mcm9tOyBmcm9tLS0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ib3VuZGFyeS50ZXN0KGZyb21MaW5lLnRleHRbZnJvbSAtIDEgLSBmcm9tTGluZS5mcm9tXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyB0byA8IHRvTGluZS50bzsgdG8rKylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJvdW5kYXJ5LnRlc3QodG9MaW5lLnRleHRbdG8gLSB0b0xpbmUuZnJvbV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gdG87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByYW5nZXMgPSBbXSwgbTtcbiAgICAgICAgICAgICAgICBsZXQgYWRkID0gKGZyb20sIHRvLCBkZWNvKSA9PiByYW5nZXMucHVzaChkZWNvLnJhbmdlKGZyb20sIHRvKSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb21MaW5lID09IHRvTGluZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2V4cC5sYXN0SW5kZXggPSBzdGFydCAtIGZyb21MaW5lLmZyb207XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgobSA9IHRoaXMucmVnZXhwLmV4ZWMoZnJvbUxpbmUudGV4dCkpICYmIG0uaW5kZXggPCBlbmQgLSBmcm9tTGluZS5mcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNYXRjaChtLCB2aWV3LCBtLmluZGV4ICsgZnJvbUxpbmUuZnJvbSwgYWRkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZXJNYXRjaGVzKHZpZXcuc3RhdGUuZG9jLCB0aGlzLnJlZ2V4cCwgc3RhcnQsIGVuZCwgKGZyb20sIG0pID0+IHRoaXMuYWRkTWF0Y2gobSwgdmlldywgZnJvbSwgYWRkKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlY28gPSBkZWNvLnVwZGF0ZSh7IGZpbHRlckZyb206IHN0YXJ0LCBmaWx0ZXJUbzogZW5kLCBmaWx0ZXI6IChmcm9tLCB0bykgPT4gZnJvbSA8IHN0YXJ0IHx8IHRvID4gZW5kLCBhZGQ6IHJhbmdlcyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVjbztcbiAgICB9XG59XG5cbmNvbnN0IFVuaWNvZGVSZWdleHBTdXBwb3J0ID0gL3gvLnVuaWNvZGUgIT0gbnVsbCA/IFwiZ3VcIiA6IFwiZ1wiO1xuY29uc3QgU3BlY2lhbHMgPSAvKkBfX1BVUkVfXyovbmV3IFJlZ0V4cChcIltcXHUwMDAwLVxcdTAwMDhcXHUwMDBhLVxcdTAwMWZcXHUwMDdmLVxcdTAwOWZcXHUwMGFkXFx1MDYxY1xcdTIwMGJcXHUyMDBlXFx1MjAwZlxcdTIwMjhcXHUyMDI5XFx1MjAyZFxcdTIwMmVcXHUyMDY2XFx1MjA2N1xcdTIwNjlcXHVmZWZmXFx1ZmZmOS1cXHVmZmZjXVwiLCBVbmljb2RlUmVnZXhwU3VwcG9ydCk7XG5jb25zdCBOYW1lcyA9IHtcbiAgICAwOiBcIm51bGxcIixcbiAgICA3OiBcImJlbGxcIixcbiAgICA4OiBcImJhY2tzcGFjZVwiLFxuICAgIDEwOiBcIm5ld2xpbmVcIixcbiAgICAxMTogXCJ2ZXJ0aWNhbCB0YWJcIixcbiAgICAxMzogXCJjYXJyaWFnZSByZXR1cm5cIixcbiAgICAyNzogXCJlc2NhcGVcIixcbiAgICA4MjAzOiBcInplcm8gd2lkdGggc3BhY2VcIixcbiAgICA4MjA0OiBcInplcm8gd2lkdGggbm9uLWpvaW5lclwiLFxuICAgIDgyMDU6IFwiemVybyB3aWR0aCBqb2luZXJcIixcbiAgICA4MjA2OiBcImxlZnQtdG8tcmlnaHQgbWFya1wiLFxuICAgIDgyMDc6IFwicmlnaHQtdG8tbGVmdCBtYXJrXCIsXG4gICAgODIzMjogXCJsaW5lIHNlcGFyYXRvclwiLFxuICAgIDgyMzc6IFwibGVmdC10by1yaWdodCBvdmVycmlkZVwiLFxuICAgIDgyMzg6IFwicmlnaHQtdG8tbGVmdCBvdmVycmlkZVwiLFxuICAgIDgyOTQ6IFwibGVmdC10by1yaWdodCBpc29sYXRlXCIsXG4gICAgODI5NTogXCJyaWdodC10by1sZWZ0IGlzb2xhdGVcIixcbiAgICA4Mjk3OiBcInBvcCBkaXJlY3Rpb25hbCBpc29sYXRlXCIsXG4gICAgODIzMzogXCJwYXJhZ3JhcGggc2VwYXJhdG9yXCIsXG4gICAgNjUyNzk6IFwiemVybyB3aWR0aCBuby1icmVhayBzcGFjZVwiLFxuICAgIDY1NTMyOiBcIm9iamVjdCByZXBsYWNlbWVudFwiXG59O1xubGV0IF9zdXBwb3J0c1RhYlNpemUgPSBudWxsO1xuZnVuY3Rpb24gc3VwcG9ydHNUYWJTaXplKCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoX3N1cHBvcnRzVGFiU2l6ZSA9PSBudWxsICYmIHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgbGV0IHN0eWxlcyA9IGRvY3VtZW50LmJvZHkuc3R5bGU7XG4gICAgICAgIF9zdXBwb3J0c1RhYlNpemUgPSAoKF9hID0gc3R5bGVzLnRhYlNpemUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHN0eWxlcy5Nb3pUYWJTaXplKSAhPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gX3N1cHBvcnRzVGFiU2l6ZSB8fCBmYWxzZTtcbn1cbmNvbnN0IHNwZWNpYWxDaGFyQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZShjb25maWdzKSB7XG4gICAgICAgIGxldCBjb25maWcgPSBjb21iaW5lQ29uZmlnKGNvbmZpZ3MsIHtcbiAgICAgICAgICAgIHJlbmRlcjogbnVsbCxcbiAgICAgICAgICAgIHNwZWNpYWxDaGFyczogU3BlY2lhbHMsXG4gICAgICAgICAgICBhZGRTcGVjaWFsQ2hhcnM6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb25maWcucmVwbGFjZVRhYnMgPSAhc3VwcG9ydHNUYWJTaXplKCkpXG4gICAgICAgICAgICBjb25maWcuc3BlY2lhbENoYXJzID0gbmV3IFJlZ0V4cChcIlxcdHxcIiArIGNvbmZpZy5zcGVjaWFsQ2hhcnMuc291cmNlLCBVbmljb2RlUmVnZXhwU3VwcG9ydCk7XG4gICAgICAgIGlmIChjb25maWcuYWRkU3BlY2lhbENoYXJzKVxuICAgICAgICAgICAgY29uZmlnLnNwZWNpYWxDaGFycyA9IG5ldyBSZWdFeHAoY29uZmlnLnNwZWNpYWxDaGFycy5zb3VyY2UgKyBcInxcIiArIGNvbmZpZy5hZGRTcGVjaWFsQ2hhcnMuc291cmNlLCBVbmljb2RlUmVnZXhwU3VwcG9ydCk7XG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgaW5zdGFsbHMgaGlnaGxpZ2h0aW5nIG9mIHNwZWNpYWxcbmNoYXJhY3RlcnMuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0U3BlY2lhbENoYXJzKFxuLyoqXG5Db25maWd1cmF0aW9uIG9wdGlvbnMuXG4qL1xuY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW3NwZWNpYWxDaGFyQ29uZmlnLm9mKGNvbmZpZyksIHNwZWNpYWxDaGFyUGx1Z2luKCldO1xufVxubGV0IF9wbHVnaW4gPSBudWxsO1xuZnVuY3Rpb24gc3BlY2lhbENoYXJQbHVnaW4oKSB7XG4gICAgcmV0dXJuIF9wbHVnaW4gfHwgKF9wbHVnaW4gPSBWaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9uQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0b3IgPSB0aGlzLm1ha2VEZWNvcmF0b3Iodmlldy5zdGF0ZS5mYWNldChzcGVjaWFsQ2hhckNvbmZpZykpO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZGVjb3JhdG9yLmNyZWF0ZURlY28odmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgbWFrZURlY29yYXRvcihjb25mKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1hdGNoRGVjb3JhdG9yKHtcbiAgICAgICAgICAgICAgICByZWdleHA6IGNvbmYuc3BlY2lhbENoYXJzLFxuICAgICAgICAgICAgICAgIGRlY29yYXRpb246IChtLCB2aWV3LCBwb3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgZG9jIH0gPSB2aWV3LnN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29kZSA9IGNvZGVQb2ludEF0KG1bMF0sIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSA5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZSA9IGRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gdmlldy5zdGF0ZS50YWJTaXplLCBjb2wgPSBjb3VudENvbHVtbihsaW5lLnRleHQsIHNpemUsIHBvcyAtIGxpbmUuZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5yZXBsYWNlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQ6IG5ldyBUYWJXaWRnZXQoKHNpemUgLSAoY29sICUgc2l6ZSkpICogdGhpcy52aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCAvIHRoaXMudmlldy5zY2FsZVgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNvcmF0aW9uQ2FjaGVbY29kZV0gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmRlY29yYXRpb25DYWNoZVtjb2RlXSA9IERlY29yYXRpb24ucmVwbGFjZSh7IHdpZGdldDogbmV3IFNwZWNpYWxDaGFyV2lkZ2V0KGNvbmYsIGNvZGUpIH0pKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvdW5kYXJ5OiBjb25mLnJlcGxhY2VUYWJzID8gdW5kZWZpbmVkIDogL1teXS9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgICAgIGxldCBjb25mID0gdXBkYXRlLnN0YXRlLmZhY2V0KHNwZWNpYWxDaGFyQ29uZmlnKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChzcGVjaWFsQ2hhckNvbmZpZykgIT0gY29uZikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdG9yID0gdGhpcy5tYWtlRGVjb3JhdG9yKGNvbmYpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRvci5jcmVhdGVEZWNvKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRvci51cGRhdGVEZWNvKHVwZGF0ZSwgdGhpcy5kZWNvcmF0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnNcbiAgICB9KSk7XG59XG5jb25zdCBEZWZhdWx0UGxhY2Vob2xkZXIgPSBcIlxcdTIwMjJcIjtcbi8vIEFzc2lnbnMgcGxhY2Vob2xkZXIgY2hhcmFjdGVycyBmcm9tIHRoZSBDb250cm9sIFBpY3R1cmVzIGJsb2NrIHRvXG4vLyBBU0NJSSBjb250cm9sIGNoYXJhY3RlcnNcbmZ1bmN0aW9uIHBsYWNlaG9sZGVyJDEoY29kZSkge1xuICAgIGlmIChjb2RlID49IDMyKVxuICAgICAgICByZXR1cm4gRGVmYXVsdFBsYWNlaG9sZGVyO1xuICAgIGlmIChjb2RlID09IDEwKVxuICAgICAgICByZXR1cm4gXCJcXHUyNDI0XCI7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoOTIxNiArIGNvZGUpO1xufVxuY2xhc3MgU3BlY2lhbENoYXJXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb2RlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci5jb2RlID09IHRoaXMuY29kZTsgfVxuICAgIHRvRE9NKHZpZXcpIHtcbiAgICAgICAgbGV0IHBoID0gcGxhY2Vob2xkZXIkMSh0aGlzLmNvZGUpO1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuc3RhdGUucGhyYXNlKFwiQ29udHJvbCBjaGFyYWN0ZXJcIikgKyBcIiBcIiArIChOYW1lc1t0aGlzLmNvZGVdIHx8IFwiMHhcIiArIHRoaXMuY29kZS50b1N0cmluZygxNikpO1xuICAgICAgICBsZXQgY3VzdG9tID0gdGhpcy5vcHRpb25zLnJlbmRlciAmJiB0aGlzLm9wdGlvbnMucmVuZGVyKHRoaXMuY29kZSwgZGVzYywgcGgpO1xuICAgICAgICBpZiAoY3VzdG9tKVxuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbTtcbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHBoO1xuICAgICAgICBzcGFuLnRpdGxlID0gZGVzYztcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIGRlc2MpO1xuICAgICAgICBzcGFuLmNsYXNzTmFtZSA9IFwiY20tc3BlY2lhbENoYXJcIjtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfVxuICAgIGlnbm9yZUV2ZW50KCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbmNsYXNzIFRhYldpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHdpZHRoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIG90aGVyLndpZHRoID09IHRoaXMud2lkdGg7IH1cbiAgICB0b0RPTSgpIHtcbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IFwiXFx0XCI7XG4gICAgICAgIHNwYW4uY2xhc3NOYW1lID0gXCJjbS10YWJcIjtcbiAgICAgICAgc3Bhbi5zdHlsZS53aWR0aCA9IHRoaXMud2lkdGggKyBcInB4XCI7XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH1cbiAgICBpZ25vcmVFdmVudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5cbmNvbnN0IHBsdWdpbiA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMTAwMDtcbiAgICAgICAgdGhpcy5hdHRycyA9IHsgc3R5bGU6IFwicGFkZGluZy1ib3R0b206IDEwMDBweFwiIH07XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdXBkYXRlO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gdmlldy52aWV3U3RhdGUuZWRpdG9ySGVpZ2h0ICogdmlldy5zY2FsZVkgLVxuICAgICAgICAgICAgdmlldy5kZWZhdWx0TGluZUhlaWdodCAtIHZpZXcuZG9jdW1lbnRQYWRkaW5nLnRvcCAtIDAuNTtcbiAgICAgICAgaWYgKGhlaWdodCA+PSAwICYmIGhlaWdodCAhPSB0aGlzLmhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLmF0dHJzID0geyBzdHlsZTogYHBhZGRpbmctYm90dG9tOiAke2hlaWdodH1weGAgfTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IG1ha2VzIHN1cmUgdGhlIGNvbnRlbnQgaGFzIGEgYm90dG9tXG5tYXJnaW4gZXF1aXZhbGVudCB0byB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IsIG1pbnVzIG9uZSBsaW5lXG5oZWlnaHQsIHNvIHRoYXQgZXZlcnkgbGluZSBpbiB0aGUgZG9jdW1lbnQgY2FuIGJlIHNjcm9sbGVkIHRvIHRoZVxudG9wIG9mIHRoZSBlZGl0b3IuXG5cblRoaXMgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gdGhlIGVkaXRvciBpcyBzY3JvbGxhYmxlLCBhbmQgc2hvdWxkXG5ub3QgYmUgZW5hYmxlZCBpbiBlZGl0b3JzIHRoYXQgdGFrZSB0aGUgc2l6ZSBvZiB0aGVpciBjb250ZW50LlxuKi9cbmZ1bmN0aW9uIHNjcm9sbFBhc3RFbmQoKSB7XG4gICAgcmV0dXJuIFtwbHVnaW4sIGNvbnRlbnRBdHRyaWJ1dGVzLm9mKHZpZXcgPT4geyB2YXIgX2E7IHJldHVybiAoKF9hID0gdmlldy5wbHVnaW4ocGx1Z2luKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmF0dHJzKSB8fCBudWxsOyB9KV07XG59XG5cbi8qKlxuTWFyayBsaW5lcyB0aGF0IGhhdmUgYSBjdXJzb3Igb24gdGhlbSB3aXRoIHRoZSBgXCJjbS1hY3RpdmVMaW5lXCJgXG5ET00gY2xhc3MuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0QWN0aXZlTGluZSgpIHtcbiAgICByZXR1cm4gYWN0aXZlTGluZUhpZ2hsaWdodGVyO1xufVxuY29uc3QgbGluZURlY28gPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5saW5lKHsgY2xhc3M6IFwiY20tYWN0aXZlTGluZVwiIH0pO1xuY29uc3QgYWN0aXZlTGluZUhpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmdldERlY28odmlldyk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5zZWxlY3Rpb25TZXQpXG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5nZXREZWNvKHVwZGF0ZS52aWV3KTtcbiAgICB9XG4gICAgZ2V0RGVjbyh2aWV3KSB7XG4gICAgICAgIGxldCBsYXN0TGluZVN0YXJ0ID0gLTEsIGRlY28gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgciBvZiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gdmlldy5saW5lQmxvY2tBdChyLmhlYWQpO1xuICAgICAgICAgICAgaWYgKGxpbmUuZnJvbSA+IGxhc3RMaW5lU3RhcnQpIHtcbiAgICAgICAgICAgICAgICBkZWNvLnB1c2gobGluZURlY28ucmFuZ2UobGluZS5mcm9tKSk7XG4gICAgICAgICAgICAgICAgbGFzdExpbmVTdGFydCA9IGxpbmUuZnJvbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5zZXQoZGVjbyk7XG4gICAgfVxufSwge1xuICAgIGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnNcbn0pO1xuXG5jbGFzcyBQbGFjZWhvbGRlciBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRlbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgICB9XG4gICAgdG9ET00oKSB7XG4gICAgICAgIGxldCB3cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHdyYXAuY2xhc3NOYW1lID0gXCJjbS1wbGFjZWhvbGRlclwiO1xuICAgICAgICB3cmFwLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcbiAgICAgICAgd3JhcC5hcHBlbmRDaGlsZCh0eXBlb2YgdGhpcy5jb250ZW50ID09IFwic3RyaW5nXCIgPyBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmNvbnRlbnQpIDogdGhpcy5jb250ZW50KTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbnRlbnQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHdyYXAuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcInBsYWNlaG9sZGVyIFwiICsgdGhpcy5jb250ZW50KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgd3JhcC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIHJldHVybiB3cmFwO1xuICAgIH1cbiAgICBjb29yZHNBdChkb20pIHtcbiAgICAgICAgbGV0IHJlY3RzID0gZG9tLmZpcnN0Q2hpbGQgPyBjbGllbnRSZWN0c0Zvcihkb20uZmlyc3RDaGlsZCkgOiBbXTtcbiAgICAgICAgaWYgKCFyZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9tLnBhcmVudE5vZGUpO1xuICAgICAgICBsZXQgcmVjdCA9IGZsYXR0ZW5SZWN0KHJlY3RzWzBdLCBzdHlsZS5kaXJlY3Rpb24gIT0gXCJydGxcIik7XG4gICAgICAgIGxldCBsaW5lSGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUubGluZUhlaWdodCk7XG4gICAgICAgIGlmIChyZWN0LmJvdHRvbSAtIHJlY3QudG9wID4gbGluZUhlaWdodCAqIDEuNSlcbiAgICAgICAgICAgIHJldHVybiB7IGxlZnQ6IHJlY3QubGVmdCwgcmlnaHQ6IHJlY3QucmlnaHQsIHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC50b3AgKyBsaW5lSGVpZ2h0IH07XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cbiAgICBpZ25vcmVFdmVudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG4vKipcbkV4dGVuc2lvbiB0aGF0IGVuYWJsZXMgYSBwbGFjZWhvbGRlclx1MjAxNGEgcGllY2Ugb2YgZXhhbXBsZSBjb250ZW50XG50byBzaG93IHdoZW4gdGhlIGVkaXRvciBpcyBlbXB0eS5cbiovXG5mdW5jdGlvbiBwbGFjZWhvbGRlcihjb250ZW50KSB7XG4gICAgcmV0dXJuIFZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICAgICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSBjb250ZW50XG4gICAgICAgICAgICAgICAgPyBEZWNvcmF0aW9uLnNldChbRGVjb3JhdGlvbi53aWRnZXQoeyB3aWRnZXQ6IG5ldyBQbGFjZWhvbGRlcihjb250ZW50KSwgc2lkZTogMSB9KS5yYW5nZSgwKV0pXG4gICAgICAgICAgICAgICAgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGRlY29yYXRpb25zKCkgeyByZXR1cm4gdGhpcy52aWV3LnN0YXRlLmRvYy5sZW5ndGggPyBEZWNvcmF0aW9uLm5vbmUgOiB0aGlzLnBsYWNlaG9sZGVyOyB9XG4gICAgfSwgeyBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zIH0pO1xufVxuXG4vLyBEb24ndCBjb21wdXRlIHByZWNpc2UgY29sdW1uIHBvc2l0aW9ucyBmb3IgbGluZSBvZmZzZXRzIGFib3ZlIHRoaXNcbi8vIChzaW5jZSBpdCBjb3VsZCBnZXQgZXhwZW5zaXZlKS4gQXNzdW1lIG9mZnNldD09Y29sdW1uIGZvciB0aGVtLlxuY29uc3QgTWF4T2ZmID0gMjAwMDtcbmZ1bmN0aW9uIHJlY3RhbmdsZUZvcihzdGF0ZSwgYSwgYikge1xuICAgIGxldCBzdGFydExpbmUgPSBNYXRoLm1pbihhLmxpbmUsIGIubGluZSksIGVuZExpbmUgPSBNYXRoLm1heChhLmxpbmUsIGIubGluZSk7XG4gICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgIGlmIChhLm9mZiA+IE1heE9mZiB8fCBiLm9mZiA+IE1heE9mZiB8fCBhLmNvbCA8IDAgfHwgYi5jb2wgPCAwKSB7XG4gICAgICAgIGxldCBzdGFydE9mZiA9IE1hdGgubWluKGEub2ZmLCBiLm9mZiksIGVuZE9mZiA9IE1hdGgubWF4KGEub2ZmLCBiLm9mZik7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydExpbmU7IGkgPD0gZW5kTGluZTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lKGkpO1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoIDw9IGVuZE9mZilcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaChFZGl0b3JTZWxlY3Rpb24ucmFuZ2UobGluZS5mcm9tICsgc3RhcnRPZmYsIGxpbmUudG8gKyBlbmRPZmYpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHN0YXJ0Q29sID0gTWF0aC5taW4oYS5jb2wsIGIuY29sKSwgZW5kQ29sID0gTWF0aC5tYXgoYS5jb2wsIGIuY29sKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0TGluZTsgaSA8PSBlbmRMaW5lOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmUoaSk7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBmaW5kQ29sdW1uKGxpbmUudGV4dCwgc3RhcnRDb2wsIHN0YXRlLnRhYlNpemUsIHRydWUpO1xuICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKEVkaXRvclNlbGVjdGlvbi5jdXJzb3IobGluZS50bykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IGZpbmRDb2x1bW4obGluZS50ZXh0LCBlbmRDb2wsIHN0YXRlLnRhYlNpemUpO1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKEVkaXRvclNlbGVjdGlvbi5yYW5nZShsaW5lLmZyb20gKyBzdGFydCwgbGluZS5mcm9tICsgZW5kKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cbmZ1bmN0aW9uIGFic29sdXRlQ29sdW1uKHZpZXcsIHgpIHtcbiAgICBsZXQgcmVmID0gdmlldy5jb29yZHNBdFBvcyh2aWV3LnZpZXdwb3J0LmZyb20pO1xuICAgIHJldHVybiByZWYgPyBNYXRoLnJvdW5kKE1hdGguYWJzKChyZWYubGVmdCAtIHgpIC8gdmlldy5kZWZhdWx0Q2hhcmFjdGVyV2lkdGgpKSA6IC0xO1xufVxuZnVuY3Rpb24gZ2V0UG9zKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IG9mZnNldCA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0sIGZhbHNlKTtcbiAgICBsZXQgbGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChvZmZzZXQpLCBvZmYgPSBvZmZzZXQgLSBsaW5lLmZyb207XG4gICAgbGV0IGNvbCA9IG9mZiA+IE1heE9mZiA/IC0xXG4gICAgICAgIDogb2ZmID09IGxpbmUubGVuZ3RoID8gYWJzb2x1dGVDb2x1bW4odmlldywgZXZlbnQuY2xpZW50WClcbiAgICAgICAgICAgIDogY291bnRDb2x1bW4obGluZS50ZXh0LCB2aWV3LnN0YXRlLnRhYlNpemUsIG9mZnNldCAtIGxpbmUuZnJvbSk7XG4gICAgcmV0dXJuIHsgbGluZTogbGluZS5udW1iZXIsIGNvbCwgb2ZmIH07XG59XG5mdW5jdGlvbiByZWN0YW5nbGVTZWxlY3Rpb25TdHlsZSh2aWV3LCBldmVudCkge1xuICAgIGxldCBzdGFydCA9IGdldFBvcyh2aWV3LCBldmVudCksIHN0YXJ0U2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCFzdGFydClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1N0YXJ0ID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHVwZGF0ZS5zdGFydFN0YXRlLmRvYy5saW5lKHN0YXJ0LmxpbmUpLmZyb20pO1xuICAgICAgICAgICAgICAgIGxldCBuZXdMaW5lID0gdXBkYXRlLnN0YXRlLmRvYy5saW5lQXQobmV3U3RhcnQpO1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0geyBsaW5lOiBuZXdMaW5lLm51bWJlciwgY29sOiBzdGFydC5jb2wsIG9mZjogTWF0aC5taW4oc3RhcnQub2ZmLCBuZXdMaW5lLmxlbmd0aCkgfTtcbiAgICAgICAgICAgICAgICBzdGFydFNlbCA9IHN0YXJ0U2VsLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldChldmVudCwgX2V4dGVuZCwgbXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSBnZXRQb3ModmlldywgZXZlbnQpO1xuICAgICAgICAgICAgaWYgKCFjdXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0U2VsO1xuICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHJlY3RhbmdsZUZvcih2aWV3LnN0YXRlLCBzdGFydCwgY3VyKTtcbiAgICAgICAgICAgIGlmICghcmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRTZWw7XG4gICAgICAgICAgICBpZiAobXVsdGlwbGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzLmNvbmNhdChzdGFydFNlbC5yYW5nZXMpKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShyYW5nZXMpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IGVuYWJsZXMgcmVjdGFuZ3VsYXIgc2VsZWN0aW9ucy4gQnlcbmRlZmF1bHQsIGl0IHdpbGwgcmVhY3QgdG8gbGVmdCBtb3VzZSBkcmFnIHdpdGggdGhlIEFsdCBrZXkgaGVsZFxuZG93bi4gV2hlbiBzdWNoIGEgc2VsZWN0aW9uIG9jY3VycywgdGhlIHRleHQgd2l0aGluIHRoZSByZWN0YW5nbGVcbnRoYXQgd2FzIGRyYWdnZWQgb3ZlciB3aWxsIGJlIHNlbGVjdGVkLCBhcyBvbmUgc2VsZWN0aW9uXG5bcmFuZ2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uUmFuZ2UpIHBlciBsaW5lLlxuKi9cbmZ1bmN0aW9uIHJlY3Rhbmd1bGFyU2VsZWN0aW9uKG9wdGlvbnMpIHtcbiAgICBsZXQgZmlsdGVyID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ldmVudEZpbHRlcikgfHwgKGUgPT4gZS5hbHRLZXkgJiYgZS5idXR0b24gPT0gMCk7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcubW91c2VTZWxlY3Rpb25TdHlsZS5vZigodmlldywgZXZlbnQpID0+IGZpbHRlcihldmVudCkgPyByZWN0YW5nbGVTZWxlY3Rpb25TdHlsZSh2aWV3LCBldmVudCkgOiBudWxsKTtcbn1cbmNvbnN0IGtleXMgPSB7XG4gICAgQWx0OiBbMTgsIGUgPT4gISFlLmFsdEtleV0sXG4gICAgQ29udHJvbDogWzE3LCBlID0+ICEhZS5jdHJsS2V5XSxcbiAgICBTaGlmdDogWzE2LCBlID0+ICEhZS5zaGlmdEtleV0sXG4gICAgTWV0YTogWzkxLCBlID0+ICEhZS5tZXRhS2V5XVxufTtcbmNvbnN0IHNob3dDcm9zc2hhaXIgPSB7IHN0eWxlOiBcImN1cnNvcjogY3Jvc3NoYWlyXCIgfTtcbi8qKlxuUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCB0dXJucyB0aGUgcG9pbnRlciBjdXJzb3IgaW50byBhXG5jcm9zc2hhaXIgd2hlbiBhIGdpdmVuIG1vZGlmaWVyIGtleSwgZGVmYXVsdGluZyB0byBBbHQsIGlzIGhlbGRcbmRvd24uIENhbiBzZXJ2ZSBhcyBhIHZpc3VhbCBoaW50IHRoYXQgcmVjdGFuZ3VsYXIgc2VsZWN0aW9uIGlzXG5nb2luZyB0byBoYXBwZW4gd2hlbiBwYWlyZWQgd2l0aFxuW2ByZWN0YW5ndWxhclNlbGVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5yZWN0YW5ndWxhclNlbGVjdGlvbikuXG4qL1xuZnVuY3Rpb24gY3Jvc3NoYWlyQ3Vyc29yKG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBbY29kZSwgZ2V0dGVyXSA9IGtleXNbb3B0aW9ucy5rZXkgfHwgXCJBbHRcIl07XG4gICAgbGV0IHBsdWdpbiA9IFZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICAgICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgICAgIHRoaXMuaXNEb3duID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgc2V0KGlzRG93bikge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNEb3duICE9IGlzRG93bikge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEb3duID0gaXNEb3duO1xuICAgICAgICAgICAgICAgIHRoaXMudmlldy51cGRhdGUoW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBldmVudE9ic2VydmVyczoge1xuICAgICAgICAgICAga2V5ZG93bihlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoZS5rZXlDb2RlID09IGNvZGUgfHwgZ2V0dGVyKGUpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBrZXl1cChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSBjb2RlIHx8ICFnZXR0ZXIoZSkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VzZW1vdmUoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGdldHRlcihlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gW1xuICAgICAgICBwbHVnaW4sXG4gICAgICAgIEVkaXRvclZpZXcuY29udGVudEF0dHJpYnV0ZXMub2YodmlldyA9PiB7IHZhciBfYTsgcmV0dXJuICgoX2EgPSB2aWV3LnBsdWdpbihwbHVnaW4pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNEb3duKSA/IHNob3dDcm9zc2hhaXIgOiBudWxsOyB9KVxuICAgIF07XG59XG5cbmNvbnN0IE91dHNpZGUgPSBcIi0xMDAwMHB4XCI7XG5jbGFzcyBUb29sdGlwVmlld01hbmFnZXIge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIGZhY2V0LCBjcmVhdGVUb29sdGlwVmlldykge1xuICAgICAgICB0aGlzLmZhY2V0ID0gZmFjZXQ7XG4gICAgICAgIHRoaXMuY3JlYXRlVG9vbHRpcFZpZXcgPSBjcmVhdGVUb29sdGlwVmlldztcbiAgICAgICAgdGhpcy5pbnB1dCA9IHZpZXcuc3RhdGUuZmFjZXQoZmFjZXQpO1xuICAgICAgICB0aGlzLnRvb2x0aXBzID0gdGhpcy5pbnB1dC5maWx0ZXIodCA9PiB0KTtcbiAgICAgICAgdGhpcy50b29sdGlwVmlld3MgPSB0aGlzLnRvb2x0aXBzLm1hcChjcmVhdGVUb29sdGlwVmlldyk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUsIGFib3ZlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGlucHV0ID0gdXBkYXRlLnN0YXRlLmZhY2V0KHRoaXMuZmFjZXQpO1xuICAgICAgICBsZXQgdG9vbHRpcHMgPSBpbnB1dC5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgaWYgKGlucHV0ID09PSB0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIGlmICh0LnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdC51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdG9vbHRpcFZpZXdzID0gW10sIG5ld0Fib3ZlID0gYWJvdmUgPyBbXSA6IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9vbHRpcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0aXAgPSB0b29sdGlwc1tpXSwga25vd24gPSAtMTtcbiAgICAgICAgICAgIGlmICghdGlwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRvb2x0aXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gdGhpcy50b29sdGlwc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAob3RoZXIgJiYgb3RoZXIuY3JlYXRlID09IHRpcC5jcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgIGtub3duID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrbm93biA8IDApIHtcbiAgICAgICAgICAgICAgICB0b29sdGlwVmlld3NbaV0gPSB0aGlzLmNyZWF0ZVRvb2x0aXBWaWV3KHRpcCk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Fib3ZlKVxuICAgICAgICAgICAgICAgICAgICBuZXdBYm92ZVtpXSA9ICEhdGlwLmFib3ZlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvb2x0aXBWaWV3ID0gdG9vbHRpcFZpZXdzW2ldID0gdGhpcy50b29sdGlwVmlld3Nba25vd25dO1xuICAgICAgICAgICAgICAgIGlmIChuZXdBYm92ZSlcbiAgICAgICAgICAgICAgICAgICAgbmV3QWJvdmVbaV0gPSBhYm92ZVtrbm93bl07XG4gICAgICAgICAgICAgICAgaWYgKHRvb2x0aXBWaWV3LnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFZpZXcudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgIGlmICh0b29sdGlwVmlld3MuaW5kZXhPZih0KSA8IDApIHtcbiAgICAgICAgICAgICAgICB0LmRvbS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAoX2EgPSB0LmRlc3Ryb3kpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICBpZiAoYWJvdmUpIHtcbiAgICAgICAgICAgIG5ld0Fib3ZlLmZvckVhY2goKHZhbCwgaSkgPT4gYWJvdmVbaV0gPSB2YWwpO1xuICAgICAgICAgICAgYWJvdmUubGVuZ3RoID0gbmV3QWJvdmUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy50b29sdGlwcyA9IHRvb2x0aXBzO1xuICAgICAgICB0aGlzLnRvb2x0aXBWaWV3cyA9IHRvb2x0aXBWaWV3cztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuLyoqXG5DcmVhdGVzIGFuIGV4dGVuc2lvbiB0aGF0IGNvbmZpZ3VyZXMgdG9vbHRpcCBiZWhhdmlvci5cbiovXG5mdW5jdGlvbiB0b29sdGlwcyhjb25maWcgPSB7fSkge1xuICAgIHJldHVybiB0b29sdGlwQ29uZmlnLm9mKGNvbmZpZyk7XG59XG5mdW5jdGlvbiB3aW5kb3dTcGFjZSh2aWV3KSB7XG4gICAgbGV0IHsgd2luIH0gPSB2aWV3O1xuICAgIHJldHVybiB7IHRvcDogMCwgbGVmdDogMCwgYm90dG9tOiB3aW4uaW5uZXJIZWlnaHQsIHJpZ2h0OiB3aW4uaW5uZXJXaWR0aCB9O1xufVxuY29uc3QgdG9vbHRpcENvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICByZXR1cm4gKHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBicm93c2VyLmlvcyA/IFwiYWJzb2x1dGVcIiA6ICgoX2EgPSB2YWx1ZXMuZmluZChjb25mID0+IGNvbmYucG9zaXRpb24pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucG9zaXRpb24pIHx8IFwiZml4ZWRcIixcbiAgICAgICAgICAgIHBhcmVudDogKChfYiA9IHZhbHVlcy5maW5kKGNvbmYgPT4gY29uZi5wYXJlbnQpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGFyZW50KSB8fCBudWxsLFxuICAgICAgICAgICAgdG9vbHRpcFNwYWNlOiAoKF9jID0gdmFsdWVzLmZpbmQoY29uZiA9PiBjb25mLnRvb2x0aXBTcGFjZSkpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy50b29sdGlwU3BhY2UpIHx8IHdpbmRvd1NwYWNlLFxuICAgICAgICB9KTtcbiAgICB9XG59KTtcbmNvbnN0IGtub3duSGVpZ2h0ID0gLypAX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG5jb25zdCB0b29sdGlwUGx1Z2luID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuYWJvdmUgPSBbXTtcbiAgICAgICAgdGhpcy5pblZpZXcgPSB0cnVlO1xuICAgICAgICB0aGlzLm1hZGVBYnNvbHV0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxhc3RUcmFuc2FjdGlvbiA9IDA7XG4gICAgICAgIHRoaXMubWVhc3VyZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgbGV0IGNvbmZpZyA9IHZpZXcuc3RhdGUuZmFjZXQodG9vbHRpcENvbmZpZyk7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBjb25maWcucG9zaXRpb247XG4gICAgICAgIHRoaXMucGFyZW50ID0gY29uZmlnLnBhcmVudDtcbiAgICAgICAgdGhpcy5jbGFzc2VzID0gdmlldy50aGVtZUNsYXNzZXM7XG4gICAgICAgIHRoaXMuY3JlYXRlQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMubWVhc3VyZVJlcSA9IHsgcmVhZDogdGhpcy5yZWFkTWVhc3VyZS5iaW5kKHRoaXMpLCB3cml0ZTogdGhpcy53cml0ZU1lYXN1cmUuYmluZCh0aGlzKSwga2V5OiB0aGlzIH07XG4gICAgICAgIHRoaXMubWFuYWdlciA9IG5ldyBUb29sdGlwVmlld01hbmFnZXIodmlldywgc2hvd1Rvb2x0aXAsIHQgPT4gdGhpcy5jcmVhdGVUb29sdGlwKHQpKTtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlciA9IHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciA9PSBcImZ1bmN0aW9uXCIgPyBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IHRoaXMubGFzdFRyYW5zYWN0aW9uIC0gNTAgJiZcbiAgICAgICAgICAgICAgICBlbnRyaWVzLmxlbmd0aCA+IDAgJiYgZW50cmllc1tlbnRyaWVzLmxlbmd0aCAtIDFdLmludGVyc2VjdGlvblJhdGlvIDwgMSlcbiAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVTb29uKCk7XG4gICAgICAgIH0sIHsgdGhyZXNob2xkOiBbMV0gfSkgOiBudWxsO1xuICAgICAgICB0aGlzLm9ic2VydmVJbnRlcnNlY3Rpb24oKTtcbiAgICAgICAgdmlldy53aW4uYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm1lYXN1cmVTb29uID0gdGhpcy5tZWFzdXJlU29vbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5tYXliZU1lYXN1cmUoKTtcbiAgICB9XG4gICAgY3JlYXRlQ29udGFpbmVyKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gdGhpcy52aWV3LnRoZW1lQ2xhc3NlcztcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy52aWV3LmRvbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvYnNlcnZlSW50ZXJzZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBmb3IgKGxldCB0b29sdGlwIG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5vYnNlcnZlKHRvb2x0aXAuZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtZWFzdXJlU29vbigpIHtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVRpbWVvdXQgPCAwKVxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgICAgICAgICB0aGlzLm1heWJlTWVhc3VyZSgpO1xuICAgICAgICAgICAgfSwgNTApO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh1cGRhdGUudHJhbnNhY3Rpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMubGFzdFRyYW5zYWN0aW9uID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSB0aGlzLm1hbmFnZXIudXBkYXRlKHVwZGF0ZSwgdGhpcy5hYm92ZSk7XG4gICAgICAgIGlmICh1cGRhdGVkKVxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlSW50ZXJzZWN0aW9uKCk7XG4gICAgICAgIGxldCBzaG91bGRNZWFzdXJlID0gdXBkYXRlZCB8fCB1cGRhdGUuZ2VvbWV0cnlDaGFuZ2VkO1xuICAgICAgICBsZXQgbmV3Q29uZmlnID0gdXBkYXRlLnN0YXRlLmZhY2V0KHRvb2x0aXBDb25maWcpO1xuICAgICAgICBpZiAobmV3Q29uZmlnLnBvc2l0aW9uICE9IHRoaXMucG9zaXRpb24gJiYgIXRoaXMubWFkZUFic29sdXRlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gbmV3Q29uZmlnLnBvc2l0aW9uO1xuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIHQuZG9tLnN0eWxlLnBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbjtcbiAgICAgICAgICAgIHNob3VsZE1lYXN1cmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdDb25maWcucGFyZW50ICE9IHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLnBhcmVudCA9IG5ld0NvbmZpZy5wYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbnRhaW5lcigpO1xuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHQuZG9tKTtcbiAgICAgICAgICAgIHNob3VsZE1lYXN1cmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMudmlldy50aGVtZUNsYXNzZXMgIT0gdGhpcy5jbGFzc2VzKSB7XG4gICAgICAgICAgICB0aGlzLmNsYXNzZXMgPSB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSB0aGlzLnZpZXcudGhlbWVDbGFzc2VzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRNZWFzdXJlKVxuICAgICAgICAgICAgdGhpcy5tYXliZU1lYXN1cmUoKTtcbiAgICB9XG4gICAgY3JlYXRlVG9vbHRpcCh0b29sdGlwKSB7XG4gICAgICAgIGxldCB0b29sdGlwVmlldyA9IHRvb2x0aXAuY3JlYXRlKHRoaXMudmlldyk7XG4gICAgICAgIHRvb2x0aXBWaWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tdG9vbHRpcFwiKTtcbiAgICAgICAgaWYgKHRvb2x0aXAuYXJyb3cgJiYgIXRvb2x0aXBWaWV3LmRvbS5xdWVyeVNlbGVjdG9yKFwiLmNtLXRvb2x0aXAgPiAuY20tdG9vbHRpcC1hcnJvd1wiKSkge1xuICAgICAgICAgICAgbGV0IGFycm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGFycm93LmNsYXNzTmFtZSA9IFwiY20tdG9vbHRpcC1hcnJvd1wiO1xuICAgICAgICAgICAgdG9vbHRpcFZpZXcuZG9tLmFwcGVuZENoaWxkKGFycm93KTtcbiAgICAgICAgfVxuICAgICAgICB0b29sdGlwVmlldy5kb20uc3R5bGUucG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgICB0b29sdGlwVmlldy5kb20uc3R5bGUudG9wID0gT3V0c2lkZTtcbiAgICAgICAgdG9vbHRpcFZpZXcuZG9tLnN0eWxlLmxlZnQgPSBcIjBweFwiO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b29sdGlwVmlldy5kb20pO1xuICAgICAgICBpZiAodG9vbHRpcFZpZXcubW91bnQpXG4gICAgICAgICAgICB0b29sdGlwVmlldy5tb3VudCh0aGlzLnZpZXcpO1xuICAgICAgICByZXR1cm4gdG9vbHRpcFZpZXc7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHRoaXMudmlldy53aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm1lYXN1cmVTb29uKTtcbiAgICAgICAgZm9yIChsZXQgdG9vbHRpcFZpZXcgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cykge1xuICAgICAgICAgICAgdG9vbHRpcFZpZXcuZG9tLnJlbW92ZSgpO1xuICAgICAgICAgICAgKF9hID0gdG9vbHRpcFZpZXcuZGVzdHJveSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodG9vbHRpcFZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhcmVudClcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgICAoX2IgPSB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZGlzY29ubmVjdCgpO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tZWFzdXJlVGltZW91dCk7XG4gICAgfVxuICAgIHJlYWRNZWFzdXJlKCkge1xuICAgICAgICBsZXQgZWRpdG9yID0gdGhpcy52aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbGV0IHNjYWxlWCA9IDEsIHNjYWxlWSA9IDEsIG1ha2VBYnNvbHV0ZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PSBcImZpeGVkXCIgJiYgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCB7IGRvbSB9ID0gdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3c1swXTtcbiAgICAgICAgICAgIGlmIChicm93c2VyLmdlY2tvKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZWZveCBzZXRzIHRoZSBlbGVtZW50J3MgYG9mZnNldFBhcmVudGAgdG8gdGhlXG4gICAgICAgICAgICAgICAgLy8gdHJhbnNmb3JtZWQgZWxlbWVudCB3aGVuIGEgdHJhbnNmb3JtIGludGVyZmVyZXMgd2l0aCBmaXhlZFxuICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uaW5nLlxuICAgICAgICAgICAgICAgIG1ha2VBYnNvbHV0ZSA9IGRvbS5vZmZzZXRQYXJlbnQgIT0gdGhpcy5jb250YWluZXIub3duZXJEb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tLnN0eWxlLnRvcCA9PSBPdXRzaWRlICYmIGRvbS5zdHlsZS5sZWZ0ID09IFwiMHB4XCIpIHtcbiAgICAgICAgICAgICAgICAvLyBPbiBvdGhlciBicm93c2Vycywgd2UgaGF2ZSB0byBhd2t3YXJkbHkgdHJ5IGFuZCB1c2Ugb3RoZXJcbiAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbiB0byBkZXRlY3QgYSB0cmFuc2Zvcm0uXG4gICAgICAgICAgICAgICAgbGV0IHJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgbWFrZUFic29sdXRlID0gTWF0aC5hYnMocmVjdC50b3AgKyAxMDAwMCkgPiAxIHx8IE1hdGguYWJzKHJlY3QubGVmdCkgPiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYWtlQWJzb2x1dGUgfHwgdGhpcy5wb3NpdGlvbiA9PSBcImFic29sdXRlXCIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGxldCByZWN0ID0gdGhpcy5wYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlY3Qud2lkdGggJiYgcmVjdC5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NhbGVYID0gcmVjdC53aWR0aCAvIHRoaXMucGFyZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICBzY2FsZVkgPSByZWN0LmhlaWdodCAvIHRoaXMucGFyZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAoeyBzY2FsZVgsIHNjYWxlWSB9ID0gdGhpcy52aWV3LnZpZXdTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVkaXRvcixcbiAgICAgICAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQgPyB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IGVkaXRvcixcbiAgICAgICAgICAgIHBvczogdGhpcy5tYW5hZ2VyLnRvb2x0aXBzLm1hcCgodCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0diA9IHRoaXMubWFuYWdlci50b29sdGlwVmlld3NbaV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR2LmdldENvb3JkcyA/IHR2LmdldENvb3Jkcyh0LnBvcykgOiB0aGlzLnZpZXcuY29vcmRzQXRQb3ModC5wb3MpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzaXplOiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzLm1hcCgoeyBkb20gfSkgPT4gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxcbiAgICAgICAgICAgIHNwYWNlOiB0aGlzLnZpZXcuc3RhdGUuZmFjZXQodG9vbHRpcENvbmZpZykudG9vbHRpcFNwYWNlKHRoaXMudmlldyksXG4gICAgICAgICAgICBzY2FsZVgsIHNjYWxlWSwgbWFrZUFic29sdXRlXG4gICAgICAgIH07XG4gICAgfVxuICAgIHdyaXRlTWVhc3VyZShtZWFzdXJlZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChtZWFzdXJlZC5tYWtlQWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRoaXMubWFkZUFic29sdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdC5kb20uc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgZWRpdG9yLCBzcGFjZSwgc2NhbGVYLCBzY2FsZVkgfSA9IG1lYXN1cmVkO1xuICAgICAgICBsZXQgb3RoZXJzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYW5hZ2VyLnRvb2x0aXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdG9vbHRpcCA9IHRoaXMubWFuYWdlci50b29sdGlwc1tpXSwgdFZpZXcgPSB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzW2ldLCB7IGRvbSB9ID0gdFZpZXc7XG4gICAgICAgICAgICBsZXQgcG9zID0gbWVhc3VyZWQucG9zW2ldLCBzaXplID0gbWVhc3VyZWQuc2l6ZVtpXTtcbiAgICAgICAgICAgIC8vIEhpZGUgdG9vbHRpcHMgdGhhdCBhcmUgb3V0c2lkZSBvZiB0aGUgZWRpdG9yLlxuICAgICAgICAgICAgaWYgKCFwb3MgfHwgcG9zLmJvdHRvbSA8PSBNYXRoLm1heChlZGl0b3IudG9wLCBzcGFjZS50b3ApIHx8XG4gICAgICAgICAgICAgICAgcG9zLnRvcCA+PSBNYXRoLm1pbihlZGl0b3IuYm90dG9tLCBzcGFjZS5ib3R0b20pIHx8XG4gICAgICAgICAgICAgICAgcG9zLnJpZ2h0IDwgTWF0aC5tYXgoZWRpdG9yLmxlZnQsIHNwYWNlLmxlZnQpIC0gLjEgfHxcbiAgICAgICAgICAgICAgICBwb3MubGVmdCA+IE1hdGgubWluKGVkaXRvci5yaWdodCwgc3BhY2UucmlnaHQpICsgLjEpIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUudG9wID0gT3V0c2lkZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhcnJvdyA9IHRvb2x0aXAuYXJyb3cgPyB0Vmlldy5kb20ucXVlcnlTZWxlY3RvcihcIi5jbS10b29sdGlwLWFycm93XCIpIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBhcnJvd0hlaWdodCA9IGFycm93ID8gNyAvKiBBcnJvdy5TaXplICovIDogMDtcbiAgICAgICAgICAgIGxldCB3aWR0aCA9IHNpemUucmlnaHQgLSBzaXplLmxlZnQsIGhlaWdodCA9IChfYSA9IGtub3duSGVpZ2h0LmdldCh0VmlldykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHNpemUuYm90dG9tIC0gc2l6ZS50b3A7XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gdFZpZXcub2Zmc2V0IHx8IG5vT2Zmc2V0LCBsdHIgPSB0aGlzLnZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSO1xuICAgICAgICAgICAgbGV0IGxlZnQgPSBzaXplLndpZHRoID4gc3BhY2UucmlnaHQgLSBzcGFjZS5sZWZ0ID8gKGx0ciA/IHNwYWNlLmxlZnQgOiBzcGFjZS5yaWdodCAtIHNpemUud2lkdGgpXG4gICAgICAgICAgICAgICAgOiBsdHIgPyBNYXRoLm1pbihwb3MubGVmdCAtIChhcnJvdyA/IDE0IC8qIEFycm93Lk9mZnNldCAqLyA6IDApICsgb2Zmc2V0LngsIHNwYWNlLnJpZ2h0IC0gd2lkdGgpXG4gICAgICAgICAgICAgICAgICAgIDogTWF0aC5tYXgoc3BhY2UubGVmdCwgcG9zLmxlZnQgLSB3aWR0aCArIChhcnJvdyA/IDE0IC8qIEFycm93Lk9mZnNldCAqLyA6IDApIC0gb2Zmc2V0LngpO1xuICAgICAgICAgICAgbGV0IGFib3ZlID0gdGhpcy5hYm92ZVtpXTtcbiAgICAgICAgICAgIGlmICghdG9vbHRpcC5zdHJpY3RTaWRlICYmIChhYm92ZVxuICAgICAgICAgICAgICAgID8gcG9zLnRvcCAtIChzaXplLmJvdHRvbSAtIHNpemUudG9wKSAtIG9mZnNldC55IDwgc3BhY2UudG9wXG4gICAgICAgICAgICAgICAgOiBwb3MuYm90dG9tICsgKHNpemUuYm90dG9tIC0gc2l6ZS50b3ApICsgb2Zmc2V0LnkgPiBzcGFjZS5ib3R0b20pICYmXG4gICAgICAgICAgICAgICAgYWJvdmUgPT0gKHNwYWNlLmJvdHRvbSAtIHBvcy5ib3R0b20gPiBwb3MudG9wIC0gc3BhY2UudG9wKSlcbiAgICAgICAgICAgICAgICBhYm92ZSA9IHRoaXMuYWJvdmVbaV0gPSAhYWJvdmU7XG4gICAgICAgICAgICBsZXQgc3BhY2VWZXJ0ID0gKGFib3ZlID8gcG9zLnRvcCAtIHNwYWNlLnRvcCA6IHNwYWNlLmJvdHRvbSAtIHBvcy5ib3R0b20pIC0gYXJyb3dIZWlnaHQ7XG4gICAgICAgICAgICBpZiAoc3BhY2VWZXJ0IDwgaGVpZ2h0ICYmIHRWaWV3LnJlc2l6ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3BhY2VWZXJ0IDwgdGhpcy52aWV3LmRlZmF1bHRMaW5lSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbS5zdHlsZS50b3AgPSBPdXRzaWRlO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga25vd25IZWlnaHQuc2V0KHRWaWV3LCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5oZWlnaHQgPSAoaGVpZ2h0ID0gc3BhY2VWZXJ0KSAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRvbS5zdHlsZS5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUuaGVpZ2h0ID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0b3AgPSBhYm92ZSA/IHBvcy50b3AgLSBoZWlnaHQgLSBhcnJvd0hlaWdodCAtIG9mZnNldC55IDogcG9zLmJvdHRvbSArIGFycm93SGVpZ2h0ICsgb2Zmc2V0Lnk7XG4gICAgICAgICAgICBsZXQgcmlnaHQgPSBsZWZ0ICsgd2lkdGg7XG4gICAgICAgICAgICBpZiAodFZpZXcub3ZlcmxhcCAhPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByIG9mIG90aGVycylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIubGVmdCA8IHJpZ2h0ICYmIHIucmlnaHQgPiBsZWZ0ICYmIHIudG9wIDwgdG9wICsgaGVpZ2h0ICYmIHIuYm90dG9tID4gdG9wKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gYWJvdmUgPyByLnRvcCAtIGhlaWdodCAtIDIgLSBhcnJvd0hlaWdodCA6IHIuYm90dG9tICsgYXJyb3dIZWlnaHQgKyAyO1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT0gXCJhYnNvbHV0ZVwiKSB7XG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLnRvcCA9ICh0b3AgLSBtZWFzdXJlZC5wYXJlbnQudG9wKSAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUubGVmdCA9IChsZWZ0IC0gbWVhc3VyZWQucGFyZW50LmxlZnQpIC8gc2NhbGVYICsgXCJweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLnRvcCA9IHRvcCAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUubGVmdCA9IGxlZnQgLyBzY2FsZVggKyBcInB4XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJyb3cpIHtcbiAgICAgICAgICAgICAgICBsZXQgYXJyb3dMZWZ0ID0gcG9zLmxlZnQgKyAobHRyID8gb2Zmc2V0LnggOiAtb2Zmc2V0LngpIC0gKGxlZnQgKyAxNCAvKiBBcnJvdy5PZmZzZXQgKi8gLSA3IC8qIEFycm93LlNpemUgKi8pO1xuICAgICAgICAgICAgICAgIGFycm93LnN0eWxlLmxlZnQgPSBhcnJvd0xlZnQgLyBzY2FsZVggKyBcInB4XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodFZpZXcub3ZlcmxhcCAhPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICBvdGhlcnMucHVzaCh7IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTogdG9wICsgaGVpZ2h0IH0pO1xuICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC50b2dnbGUoXCJjbS10b29sdGlwLWFib3ZlXCIsIGFib3ZlKTtcbiAgICAgICAgICAgIGRvbS5jbGFzc0xpc3QudG9nZ2xlKFwiY20tdG9vbHRpcC1iZWxvd1wiLCAhYWJvdmUpO1xuICAgICAgICAgICAgaWYgKHRWaWV3LnBvc2l0aW9uZWQpXG4gICAgICAgICAgICAgICAgdFZpZXcucG9zaXRpb25lZChtZWFzdXJlZC5zcGFjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWF5YmVNZWFzdXJlKCkge1xuICAgICAgICBpZiAodGhpcy5tYW5hZ2VyLnRvb2x0aXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlldy5pblZpZXcpXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pblZpZXcgIT0gdGhpcy52aWV3LmluVmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5WaWV3ID0gdGhpcy52aWV3LmluVmlldztcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5WaWV3KVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0diBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdHYuZG9tLnN0eWxlLnRvcCA9IE91dHNpZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59LCB7XG4gICAgZXZlbnRPYnNlcnZlcnM6IHtcbiAgICAgICAgc2Nyb2xsKCkgeyB0aGlzLm1heWJlTWVhc3VyZSgpOyB9XG4gICAgfVxufSk7XG5jb25zdCBiYXNlVGhlbWUgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5iYXNlVGhlbWUoe1xuICAgIFwiLmNtLXRvb2x0aXBcIjoge1xuICAgICAgICB6SW5kZXg6IDEwMCxcbiAgICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXRvb2x0aXBcIjoge1xuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNiYmJcIixcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmNWY1ZjVcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXRvb2x0aXAtc2VjdGlvbjpub3QoOmZpcnN0LWNoaWxkKVwiOiB7XG4gICAgICAgIGJvcmRlclRvcDogXCIxcHggc29saWQgI2JiYlwiLFxuICAgIH0sXG4gICAgXCImZGFyayAuY20tdG9vbHRpcFwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMzMzMzM4XCIsXG4gICAgICAgIGNvbG9yOiBcIndoaXRlXCJcbiAgICB9LFxuICAgIFwiLmNtLXRvb2x0aXAtYXJyb3dcIjoge1xuICAgICAgICBoZWlnaHQ6IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weGAsXG4gICAgICAgIHdpZHRoOiBgJHs3IC8qIEFycm93LlNpemUgKi8gKiAyfXB4YCxcbiAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgekluZGV4OiAtMSxcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgIFwiJjpiZWZvcmUsICY6YWZ0ZXJcIjoge1xuICAgICAgICAgICAgY29udGVudDogXCInJ1wiLFxuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgYm9yZGVyTGVmdDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkIHRyYW5zcGFyZW50YCxcbiAgICAgICAgICAgIGJvcmRlclJpZ2h0OiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgdHJhbnNwYXJlbnRgLFxuICAgICAgICB9LFxuICAgICAgICBcIi5jbS10b29sdGlwLWFib3ZlICZcIjoge1xuICAgICAgICAgICAgYm90dG9tOiBgLSR7NyAvKiBBcnJvdy5TaXplICovfXB4YCxcbiAgICAgICAgICAgIFwiJjpiZWZvcmVcIjoge1xuICAgICAgICAgICAgICAgIGJvcmRlclRvcDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkICNiYmJgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiJjphZnRlclwiOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyVG9wOiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgI2Y1ZjVmNWAsXG4gICAgICAgICAgICAgICAgYm90dG9tOiBcIjFweFwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiLmNtLXRvb2x0aXAtYmVsb3cgJlwiOiB7XG4gICAgICAgICAgICB0b3A6IGAtJHs3IC8qIEFycm93LlNpemUgKi99cHhgLFxuICAgICAgICAgICAgXCImOmJlZm9yZVwiOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgI2JiYmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCImOmFmdGVyXCI6IHtcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCAjZjVmNWY1YCxcbiAgICAgICAgICAgICAgICB0b3A6IFwiMXB4XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLXRvb2x0aXAgLmNtLXRvb2x0aXAtYXJyb3dcIjoge1xuICAgICAgICBcIiY6YmVmb3JlXCI6IHtcbiAgICAgICAgICAgIGJvcmRlclRvcENvbG9yOiBcIiMzMzMzMzhcIixcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbUNvbG9yOiBcIiMzMzMzMzhcIlxuICAgICAgICB9LFxuICAgICAgICBcIiY6YWZ0ZXJcIjoge1xuICAgICAgICAgICAgYm9yZGVyVG9wQ29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbUNvbG9yOiBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuY29uc3Qgbm9PZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbi8qKlxuRmFjZXQgdG8gd2hpY2ggYW4gZXh0ZW5zaW9uIGNhbiBhZGQgYSB2YWx1ZSB0byBzaG93IGEgdG9vbHRpcC5cbiovXG5jb25zdCBzaG93VG9vbHRpcCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGVuYWJsZXM6IFt0b29sdGlwUGx1Z2luLCBiYXNlVGhlbWVdXG59KTtcbmNvbnN0IHNob3dIb3ZlclRvb2x0aXAgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jbGFzcyBIb3ZlclRvb2x0aXBIb3N0IHtcbiAgICAvLyBOZWVkcyB0byBiZSBzdGF0aWMgc28gdGhhdCBob3N0IHRvb2x0aXAgaW5zdGFuY2VzIGFsd2F5cyBtYXRjaFxuICAgIHN0YXRpYyBjcmVhdGUodmlldykge1xuICAgICAgICByZXR1cm4gbmV3IEhvdmVyVG9vbHRpcEhvc3Qodmlldyk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChcImNtLXRvb2x0aXAtaG92ZXJcIik7XG4gICAgICAgIHRoaXMubWFuYWdlciA9IG5ldyBUb29sdGlwVmlld01hbmFnZXIodmlldywgc2hvd0hvdmVyVG9vbHRpcCwgdCA9PiB0aGlzLmNyZWF0ZUhvc3RlZFZpZXcodCkpO1xuICAgIH1cbiAgICBjcmVhdGVIb3N0ZWRWaWV3KHRvb2x0aXApIHtcbiAgICAgICAgbGV0IGhvc3RlZFZpZXcgPSB0b29sdGlwLmNyZWF0ZSh0aGlzLnZpZXcpO1xuICAgICAgICBob3N0ZWRWaWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tdG9vbHRpcC1zZWN0aW9uXCIpO1xuICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZChob3N0ZWRWaWV3LmRvbSk7XG4gICAgICAgIGlmICh0aGlzLm1vdW50ZWQgJiYgaG9zdGVkVmlldy5tb3VudClcbiAgICAgICAgICAgIGhvc3RlZFZpZXcubW91bnQodGhpcy52aWV3KTtcbiAgICAgICAgcmV0dXJuIGhvc3RlZFZpZXc7XG4gICAgfVxuICAgIG1vdW50KHZpZXcpIHtcbiAgICAgICAgZm9yIChsZXQgaG9zdGVkVmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICBpZiAoaG9zdGVkVmlldy5tb3VudClcbiAgICAgICAgICAgICAgICBob3N0ZWRWaWV3Lm1vdW50KHZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHBvc2l0aW9uZWQoc3BhY2UpIHtcbiAgICAgICAgZm9yIChsZXQgaG9zdGVkVmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICBpZiAoaG9zdGVkVmlldy5wb3NpdGlvbmVkKVxuICAgICAgICAgICAgICAgIGhvc3RlZFZpZXcucG9zaXRpb25lZChzcGFjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICB0aGlzLm1hbmFnZXIudXBkYXRlKHVwZGF0ZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgKF9hID0gdC5kZXN0cm95KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0KTtcbiAgICB9XG4gICAgcGFzc1Byb3AobmFtZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAobGV0IHZpZXcgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cykge1xuICAgICAgICAgICAgbGV0IGdpdmVuID0gdmlld1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChnaXZlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2l2ZW47XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgIT09IGdpdmVuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IG9mZnNldCgpIHsgcmV0dXJuIHRoaXMucGFzc1Byb3AoXCJvZmZzZXRcIik7IH1cbiAgICBnZXQgZ2V0Q29vcmRzKCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcImdldENvb3Jkc1wiKTsgfVxuICAgIGdldCBvdmVybGFwKCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcIm92ZXJsYXBcIik7IH1cbiAgICBnZXQgcmVzaXplKCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcInJlc2l6ZVwiKTsgfVxufVxuY29uc3Qgc2hvd0hvdmVyVG9vbHRpcEhvc3QgPSAvKkBfX1BVUkVfXyovc2hvd1Rvb2x0aXAuY29tcHV0ZShbc2hvd0hvdmVyVG9vbHRpcF0sIHN0YXRlID0+IHtcbiAgICBsZXQgdG9vbHRpcHMgPSBzdGF0ZS5mYWNldChzaG93SG92ZXJUb29sdGlwKS5maWx0ZXIodCA9PiB0KTtcbiAgICBpZiAodG9vbHRpcHMubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBwb3M6IE1hdGgubWluKC4uLnRvb2x0aXBzLm1hcCh0ID0+IHQucG9zKSksXG4gICAgICAgIGVuZDogTWF0aC5tYXgoLi4udG9vbHRpcHMubWFwKHQgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSB0LmVuZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdC5wb3M7IH0pKSxcbiAgICAgICAgY3JlYXRlOiBIb3ZlclRvb2x0aXBIb3N0LmNyZWF0ZSxcbiAgICAgICAgYWJvdmU6IHRvb2x0aXBzWzBdLmFib3ZlLFxuICAgICAgICBhcnJvdzogdG9vbHRpcHMuc29tZSh0ID0+IHQuYXJyb3cpLFxuICAgIH07XG59KTtcbmNsYXNzIEhvdmVyUGx1Z2luIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBzb3VyY2UsIGZpZWxkLCBzZXRIb3ZlciwgaG92ZXJUaW1lKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XG4gICAgICAgIHRoaXMuc2V0SG92ZXIgPSBzZXRIb3ZlcjtcbiAgICAgICAgdGhpcy5ob3ZlclRpbWUgPSBob3ZlclRpbWU7XG4gICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMucmVzdGFydFRpbWVvdXQgPSAtMTtcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0TW92ZSA9IHsgeDogMCwgeTogMCwgdGFyZ2V0OiB2aWV3LmRvbSwgdGltZTogMCB9O1xuICAgICAgICB0aGlzLmNoZWNrSG92ZXIgPSB0aGlzLmNoZWNrSG92ZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgdGhpcy5tb3VzZWxlYXZlID0gdGhpcy5tb3VzZWxlYXZlLmJpbmQodGhpcykpO1xuICAgICAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW91c2Vtb3ZlID0gdGhpcy5tb3VzZW1vdmUuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZykge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc3RhcnRUaW1lb3V0KTtcbiAgICAgICAgICAgIHRoaXMucmVzdGFydFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3RhcnRIb3ZlcigpLCAyMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5zdGF0ZS5maWVsZCh0aGlzLmZpZWxkKTtcbiAgICB9XG4gICAgY2hlY2tIb3ZlcigpIHtcbiAgICAgICAgdGhpcy5ob3ZlclRpbWVvdXQgPSAtMTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgaG92ZXJlZCA9IERhdGUubm93KCkgLSB0aGlzLmxhc3RNb3ZlLnRpbWU7XG4gICAgICAgIGlmIChob3ZlcmVkIDwgdGhpcy5ob3ZlclRpbWUpXG4gICAgICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5jaGVja0hvdmVyLCB0aGlzLmhvdmVyVGltZSAtIGhvdmVyZWQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnN0YXJ0SG92ZXIoKTtcbiAgICB9XG4gICAgc3RhcnRIb3ZlcigpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzdGFydFRpbWVvdXQpO1xuICAgICAgICBsZXQgeyB2aWV3LCBsYXN0TW92ZSB9ID0gdGhpcztcbiAgICAgICAgbGV0IGRlc2MgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdChsYXN0TW92ZS50YXJnZXQpO1xuICAgICAgICBpZiAoIWRlc2MpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBwb3MsIHNpZGUgPSAxO1xuICAgICAgICBpZiAoZGVzYyBpbnN0YW5jZW9mIFdpZGdldFZpZXcpIHtcbiAgICAgICAgICAgIHBvcyA9IGRlc2MucG9zQXRTdGFydDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBvcyA9IHZpZXcucG9zQXRDb29yZHMobGFzdE1vdmUpO1xuICAgICAgICAgICAgaWYgKHBvcyA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBwb3NDb29yZHMgPSB2aWV3LmNvb3Jkc0F0UG9zKHBvcyk7XG4gICAgICAgICAgICBpZiAoIXBvc0Nvb3JkcyB8fFxuICAgICAgICAgICAgICAgIGxhc3RNb3ZlLnkgPCBwb3NDb29yZHMudG9wIHx8IGxhc3RNb3ZlLnkgPiBwb3NDb29yZHMuYm90dG9tIHx8XG4gICAgICAgICAgICAgICAgbGFzdE1vdmUueCA8IHBvc0Nvb3Jkcy5sZWZ0IC0gdmlldy5kZWZhdWx0Q2hhcmFjdGVyV2lkdGggfHxcbiAgICAgICAgICAgICAgICBsYXN0TW92ZS54ID4gcG9zQ29vcmRzLnJpZ2h0ICsgdmlldy5kZWZhdWx0Q2hhcmFjdGVyV2lkdGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbGV0IGJpZGkgPSB2aWV3LmJpZGlTcGFucyh2aWV3LnN0YXRlLmRvYy5saW5lQXQocG9zKSkuZmluZChzID0+IHMuZnJvbSA8PSBwb3MgJiYgcy50byA+PSBwb3MpO1xuICAgICAgICAgICAgbGV0IHJ0bCA9IGJpZGkgJiYgYmlkaS5kaXIgPT0gRGlyZWN0aW9uLlJUTCA/IC0xIDogMTtcbiAgICAgICAgICAgIHNpZGUgPSAobGFzdE1vdmUueCA8IHBvc0Nvb3Jkcy5sZWZ0ID8gLXJ0bCA6IHJ0bCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZW4gPSB0aGlzLnNvdXJjZSh2aWV3LCBwb3MsIHNpZGUpO1xuICAgICAgICBpZiAob3BlbiA9PT0gbnVsbCB8fCBvcGVuID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcGVuLnRoZW4pIHtcbiAgICAgICAgICAgIGxldCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nID0geyBwb3MgfTtcbiAgICAgICAgICAgIG9wZW4udGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmcgPT0gcGVuZGluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YocmVzdWx0KSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBlID0+IGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlLCBcImhvdmVyIHRvb2x0aXBcIikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wZW4pIHtcbiAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB0aGlzLnNldEhvdmVyLm9mKG9wZW4pIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCB0b29sdGlwKCkge1xuICAgICAgICBsZXQgcGx1Z2luID0gdGhpcy52aWV3LnBsdWdpbih0b29sdGlwUGx1Z2luKTtcbiAgICAgICAgbGV0IGluZGV4ID0gcGx1Z2luID8gcGx1Z2luLm1hbmFnZXIudG9vbHRpcHMuZmluZEluZGV4KHQgPT4gdC5jcmVhdGUgPT0gSG92ZXJUb29sdGlwSG9zdC5jcmVhdGUpIDogLTE7XG4gICAgICAgIHJldHVybiBpbmRleCA+IC0xID8gcGx1Z2luLm1hbmFnZXIudG9vbHRpcFZpZXdzW2luZGV4XSA6IG51bGw7XG4gICAgfVxuICAgIG1vdXNlbW92ZShldmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMubGFzdE1vdmUgPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFksIHRhcmdldDogZXZlbnQudGFyZ2V0LCB0aW1lOiBEYXRlLm5vdygpIH07XG4gICAgICAgIGlmICh0aGlzLmhvdmVyVGltZW91dCA8IDApXG4gICAgICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5jaGVja0hvdmVyLCB0aGlzLmhvdmVyVGltZSk7XG4gICAgICAgIGxldCB7IGFjdGl2ZSwgdG9vbHRpcCB9ID0gdGhpcztcbiAgICAgICAgaWYgKGFjdGl2ZSAmJiB0b29sdGlwICYmICFpc0luVG9vbHRpcCh0b29sdGlwLmRvbSwgZXZlbnQpIHx8IHRoaXMucGVuZGluZykge1xuICAgICAgICAgICAgbGV0IHsgcG9zIH0gPSBhY3RpdmUgfHwgdGhpcy5wZW5kaW5nLCBlbmQgPSAoX2EgPSBhY3RpdmUgPT09IG51bGwgfHwgYWN0aXZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhY3RpdmUuZW5kKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBwb3M7XG4gICAgICAgICAgICBpZiAoKHBvcyA9PSBlbmQgPyB0aGlzLnZpZXcucG9zQXRDb29yZHModGhpcy5sYXN0TW92ZSkgIT0gcG9zXG4gICAgICAgICAgICAgICAgOiAhaXNPdmVyUmFuZ2UodGhpcy52aWV3LCBwb3MsIGVuZCwgZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdGhpcy5zZXRIb3Zlci5vZihudWxsKSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG1vdXNlbGVhdmUoZXZlbnQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaG92ZXJUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5ob3ZlclRpbWVvdXQgPSAtMTtcbiAgICAgICAgbGV0IHsgYWN0aXZlIH0gPSB0aGlzO1xuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgICBsZXQgeyB0b29sdGlwIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IGluVG9vbHRpcCA9IHRvb2x0aXAgJiYgdG9vbHRpcC5kb20uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCk7XG4gICAgICAgICAgICBpZiAoIWluVG9vbHRpcClcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB0aGlzLnNldEhvdmVyLm9mKG51bGwpIH0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMud2F0Y2hUb29sdGlwTGVhdmUodG9vbHRpcC5kb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdhdGNoVG9vbHRpcExlYXZlKHRvb2x0aXApIHtcbiAgICAgICAgbGV0IHdhdGNoID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0b29sdGlwLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHdhdGNoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZSAmJiAhdGhpcy52aWV3LmRvbS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB0aGlzLnNldEhvdmVyLm9mKG51bGwpIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0b29sdGlwLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHdhdGNoKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaG92ZXJUaW1lb3V0KTtcbiAgICAgICAgdGhpcy52aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCB0aGlzLm1vdXNlbGVhdmUpO1xuICAgICAgICB0aGlzLnZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3VzZW1vdmUpO1xuICAgIH1cbn1cbmNvbnN0IHRvb2x0aXBNYXJnaW4gPSA0O1xuZnVuY3Rpb24gaXNJblRvb2x0aXAodG9vbHRpcCwgZXZlbnQpIHtcbiAgICBsZXQgcmVjdCA9IHRvb2x0aXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIGV2ZW50LmNsaWVudFggPj0gcmVjdC5sZWZ0IC0gdG9vbHRpcE1hcmdpbiAmJiBldmVudC5jbGllbnRYIDw9IHJlY3QucmlnaHQgKyB0b29sdGlwTWFyZ2luICYmXG4gICAgICAgIGV2ZW50LmNsaWVudFkgPj0gcmVjdC50b3AgLSB0b29sdGlwTWFyZ2luICYmIGV2ZW50LmNsaWVudFkgPD0gcmVjdC5ib3R0b20gKyB0b29sdGlwTWFyZ2luO1xufVxuZnVuY3Rpb24gaXNPdmVyUmFuZ2UodmlldywgZnJvbSwgdG8sIHgsIHksIG1hcmdpbikge1xuICAgIGxldCByZWN0ID0gdmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IGRvY0JvdHRvbSA9IHZpZXcuZG9jdW1lbnRUb3AgKyB2aWV3LmRvY3VtZW50UGFkZGluZy50b3AgKyB2aWV3LmNvbnRlbnRIZWlnaHQ7XG4gICAgaWYgKHJlY3QubGVmdCA+IHggfHwgcmVjdC5yaWdodCA8IHggfHwgcmVjdC50b3AgPiB5IHx8IE1hdGgubWluKHJlY3QuYm90dG9tLCBkb2NCb3R0b20pIDwgeSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBwb3MgPSB2aWV3LnBvc0F0Q29vcmRzKHsgeCwgeSB9LCBmYWxzZSk7XG4gICAgcmV0dXJuIHBvcyA+PSBmcm9tICYmIHBvcyA8PSB0bztcbn1cbi8qKlxuU2V0IHVwIGEgaG92ZXIgdG9vbHRpcCwgd2hpY2ggc2hvd3MgdXAgd2hlbiB0aGUgcG9pbnRlciBob3ZlcnNcbm92ZXIgcmFuZ2VzIG9mIHRleHQuIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgbW91c2UgaG92ZXJzXG5vdmVyIHRoZSBkb2N1bWVudCB0ZXh0LiBJdCBzaG91bGQsIGlmIHRoZXJlIGlzIGEgdG9vbHRpcFxuYXNzb2NpYXRlZCB3aXRoIHBvc2l0aW9uIGBwb3NgLCByZXR1cm4gdGhlIHRvb2x0aXAgZGVzY3JpcHRpb25cbihlaXRoZXIgZGlyZWN0bHkgb3IgaW4gYSBwcm9taXNlKS4gVGhlIGBzaWRlYCBhcmd1bWVudCBpbmRpY2F0ZXNcbm9uIHdoaWNoIHNpZGUgb2YgdGhlIHBvc2l0aW9uIHRoZSBwb2ludGVyIGlzXHUyMDE0aXQgd2lsbCBiZSAtMSBpZiB0aGVcbnBvaW50ZXIgaXMgYmVmb3JlIHRoZSBwb3NpdGlvbiwgMSBpZiBhZnRlciB0aGUgcG9zaXRpb24uXG5cbk5vdGUgdGhhdCBhbGwgaG92ZXIgdG9vbHRpcHMgYXJlIGhvc3RlZCB3aXRoaW4gYSBzaW5nbGUgdG9vbHRpcFxuY29udGFpbmVyIGVsZW1lbnQuIFRoaXMgYWxsb3dzIG11bHRpcGxlIHRvb2x0aXBzIG92ZXIgdGhlIHNhbWVcbnJhbmdlIHRvIGJlIFwibWVyZ2VkXCIgdG9nZXRoZXIgd2l0aG91dCBvdmVybGFwcGluZy5cbiovXG5mdW5jdGlvbiBob3ZlclRvb2x0aXAoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgc2V0SG92ZXIgPSBTdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbiAgICBsZXQgaG92ZXJTdGF0ZSA9IFN0YXRlRmllbGQuZGVmaW5lKHtcbiAgICAgICAgY3JlYXRlKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgdXBkYXRlKHZhbHVlLCB0cikge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIChvcHRpb25zLmhpZGVPbkNoYW5nZSAmJiAodHIuZG9jQ2hhbmdlZCB8fCB0ci5zZWxlY3Rpb24pIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5oaWRlT24gJiYgb3B0aW9ucy5oaWRlT24odHIsIHZhbHVlKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHIuZG9jQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXdQb3MgPSB0ci5jaGFuZ2VzLm1hcFBvcyh2YWx1ZS5wb3MsIC0xLCBNYXBNb2RlLlRyYWNrRGVsKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3UG9zID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBjb3B5ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29weS5wb3MgPSBuZXdQb3M7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmVuZCAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBjb3B5LmVuZCA9IHRyLmNoYW5nZXMubWFwUG9zKHZhbHVlLmVuZCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBjb3B5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgZWZmZWN0IG9mIHRyLmVmZmVjdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LmlzKHNldEhvdmVyKSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdC5pcyhjbG9zZUhvdmVyVG9vbHRpcEVmZmVjdCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJvdmlkZTogZiA9PiBzaG93SG92ZXJUb29sdGlwLmZyb20oZilcbiAgICB9KTtcbiAgICByZXR1cm4gW1xuICAgICAgICBob3ZlclN0YXRlLFxuICAgICAgICBWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+IG5ldyBIb3ZlclBsdWdpbih2aWV3LCBzb3VyY2UsIGhvdmVyU3RhdGUsIHNldEhvdmVyLCBvcHRpb25zLmhvdmVyVGltZSB8fCAzMDAgLyogSG92ZXIuVGltZSAqLykpLFxuICAgICAgICBzaG93SG92ZXJUb29sdGlwSG9zdFxuICAgIF07XG59XG4vKipcbkdldCB0aGUgYWN0aXZlIHRvb2x0aXAgdmlldyBmb3IgYSBnaXZlbiB0b29sdGlwLCBpZiBhdmFpbGFibGUuXG4qL1xuZnVuY3Rpb24gZ2V0VG9vbHRpcCh2aWV3LCB0b29sdGlwKSB7XG4gICAgbGV0IHBsdWdpbiA9IHZpZXcucGx1Z2luKHRvb2x0aXBQbHVnaW4pO1xuICAgIGlmICghcGx1Z2luKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgZm91bmQgPSBwbHVnaW4ubWFuYWdlci50b29sdGlwcy5pbmRleE9mKHRvb2x0aXApO1xuICAgIHJldHVybiBmb3VuZCA8IDAgPyBudWxsIDogcGx1Z2luLm1hbmFnZXIudG9vbHRpcFZpZXdzW2ZvdW5kXTtcbn1cbi8qKlxuUmV0dXJucyB0cnVlIGlmIGFueSBob3ZlciB0b29sdGlwcyBhcmUgY3VycmVudGx5IGFjdGl2ZS5cbiovXG5mdW5jdGlvbiBoYXNIb3ZlclRvb2x0aXBzKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmZhY2V0KHNob3dIb3ZlclRvb2x0aXApLnNvbWUoeCA9PiB4KTtcbn1cbmNvbnN0IGNsb3NlSG92ZXJUb29sdGlwRWZmZWN0ID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLyoqXG5UcmFuc2FjdGlvbiBlZmZlY3QgdGhhdCBjbG9zZXMgYWxsIGhvdmVyIHRvb2x0aXBzLlxuKi9cbmNvbnN0IGNsb3NlSG92ZXJUb29sdGlwcyA9IC8qQF9fUFVSRV9fKi9jbG9zZUhvdmVyVG9vbHRpcEVmZmVjdC5vZihudWxsKTtcbi8qKlxuVGVsbCB0aGUgdG9vbHRpcCBleHRlbnNpb24gdG8gcmVjb21wdXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWN0aXZlXG50b29sdGlwcy4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gc29tZXRoaW5nIGhhcHBlbnMgKHN1Y2ggYXMgYVxucmUtcG9zaXRpb25pbmcgb3IgQ1NTIGNoYW5nZSBhZmZlY3RpbmcgdGhlIGVkaXRvcikgdGhhdCBjb3VsZFxuaW52YWxpZGF0ZSB0aGUgZXhpc3RpbmcgdG9vbHRpcCBwb3NpdGlvbnMuXG4qL1xuZnVuY3Rpb24gcmVwb3NpdGlvblRvb2x0aXBzKHZpZXcpIHtcbiAgICBsZXQgcGx1Z2luID0gdmlldy5wbHVnaW4odG9vbHRpcFBsdWdpbik7XG4gICAgaWYgKHBsdWdpbilcbiAgICAgICAgcGx1Z2luLm1heWJlTWVhc3VyZSgpO1xufVxuXG5jb25zdCBwYW5lbENvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICBsZXQgdG9wQ29udGFpbmVyLCBib3R0b21Db250YWluZXI7XG4gICAgICAgIGZvciAobGV0IGMgb2YgY29uZmlncykge1xuICAgICAgICAgICAgdG9wQ29udGFpbmVyID0gdG9wQ29udGFpbmVyIHx8IGMudG9wQ29udGFpbmVyO1xuICAgICAgICAgICAgYm90dG9tQ29udGFpbmVyID0gYm90dG9tQ29udGFpbmVyIHx8IGMuYm90dG9tQ29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHRvcENvbnRhaW5lciwgYm90dG9tQ29udGFpbmVyIH07XG4gICAgfVxufSk7XG4vKipcbkNvbmZpZ3VyZXMgdGhlIHBhbmVsLW1hbmFnaW5nIGV4dGVuc2lvbi5cbiovXG5mdW5jdGlvbiBwYW5lbHMoY29uZmlnKSB7XG4gICAgcmV0dXJuIGNvbmZpZyA/IFtwYW5lbENvbmZpZy5vZihjb25maWcpXSA6IFtdO1xufVxuLyoqXG5HZXQgdGhlIGFjdGl2ZSBwYW5lbCBjcmVhdGVkIGJ5IHRoZSBnaXZlbiBjb25zdHJ1Y3RvciwgaWYgYW55LlxuVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91IG5lZWQgYWNjZXNzIHRvIHlvdXIgcGFuZWxzJyBET01cbnN0cnVjdHVyZS5cbiovXG5mdW5jdGlvbiBnZXRQYW5lbCh2aWV3LCBwYW5lbCkge1xuICAgIGxldCBwbHVnaW4gPSB2aWV3LnBsdWdpbihwYW5lbFBsdWdpbik7XG4gICAgbGV0IGluZGV4ID0gcGx1Z2luID8gcGx1Z2luLnNwZWNzLmluZGV4T2YocGFuZWwpIDogLTE7XG4gICAgcmV0dXJuIGluZGV4ID4gLTEgPyBwbHVnaW4ucGFuZWxzW2luZGV4XSA6IG51bGw7XG59XG5jb25zdCBwYW5lbFBsdWdpbiA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLmlucHV0ID0gdmlldy5zdGF0ZS5mYWNldChzaG93UGFuZWwpO1xuICAgICAgICB0aGlzLnNwZWNzID0gdGhpcy5pbnB1dC5maWx0ZXIocyA9PiBzKTtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSB0aGlzLnNwZWNzLm1hcChzcGVjID0+IHNwZWModmlldykpO1xuICAgICAgICBsZXQgY29uZiA9IHZpZXcuc3RhdGUuZmFjZXQocGFuZWxDb25maWcpO1xuICAgICAgICB0aGlzLnRvcCA9IG5ldyBQYW5lbEdyb3VwKHZpZXcsIHRydWUsIGNvbmYudG9wQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5ib3R0b20gPSBuZXcgUGFuZWxHcm91cCh2aWV3LCBmYWxzZSwgY29uZi5ib3R0b21Db250YWluZXIpO1xuICAgICAgICB0aGlzLnRvcC5zeW5jKHRoaXMucGFuZWxzLmZpbHRlcihwID0+IHAudG9wKSk7XG4gICAgICAgIHRoaXMuYm90dG9tLnN5bmModGhpcy5wYW5lbHMuZmlsdGVyKHAgPT4gIXAudG9wKSk7XG4gICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wYW5lbHMpIHtcbiAgICAgICAgICAgIHAuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1wYW5lbFwiKTtcbiAgICAgICAgICAgIGlmIChwLm1vdW50KVxuICAgICAgICAgICAgICAgIHAubW91bnQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCBjb25mID0gdXBkYXRlLnN0YXRlLmZhY2V0KHBhbmVsQ29uZmlnKTtcbiAgICAgICAgaWYgKHRoaXMudG9wLmNvbnRhaW5lciAhPSBjb25mLnRvcENvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy50b3Auc3luYyhbXSk7XG4gICAgICAgICAgICB0aGlzLnRvcCA9IG5ldyBQYW5lbEdyb3VwKHVwZGF0ZS52aWV3LCB0cnVlLCBjb25mLnRvcENvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYm90dG9tLmNvbnRhaW5lciAhPSBjb25mLmJvdHRvbUNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5ib3R0b20uc3luYyhbXSk7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbSA9IG5ldyBQYW5lbEdyb3VwKHVwZGF0ZS52aWV3LCBmYWxzZSwgY29uZi5ib3R0b21Db250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9wLnN5bmNDbGFzc2VzKCk7XG4gICAgICAgIHRoaXMuYm90dG9tLnN5bmNDbGFzc2VzKCk7XG4gICAgICAgIGxldCBpbnB1dCA9IHVwZGF0ZS5zdGF0ZS5mYWNldChzaG93UGFuZWwpO1xuICAgICAgICBpZiAoaW5wdXQgIT0gdGhpcy5pbnB1dCkge1xuICAgICAgICAgICAgbGV0IHNwZWNzID0gaW5wdXQuZmlsdGVyKHggPT4geCk7XG4gICAgICAgICAgICBsZXQgcGFuZWxzID0gW10sIHRvcCA9IFtdLCBib3R0b20gPSBbXSwgbW91bnQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgICAgICAgICAgICBsZXQga25vd24gPSB0aGlzLnNwZWNzLmluZGV4T2Yoc3BlYyksIHBhbmVsO1xuICAgICAgICAgICAgICAgIGlmIChrbm93biA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFuZWwgPSBzcGVjKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgbW91bnQucHVzaChwYW5lbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbCA9IHRoaXMucGFuZWxzW2tub3duXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhbmVsLnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYW5lbHMucHVzaChwYW5lbCk7XG4gICAgICAgICAgICAgICAgKHBhbmVsLnRvcCA/IHRvcCA6IGJvdHRvbSkucHVzaChwYW5lbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNwZWNzID0gc3BlY3M7XG4gICAgICAgICAgICB0aGlzLnBhbmVscyA9IHBhbmVscztcbiAgICAgICAgICAgIHRoaXMudG9wLnN5bmModG9wKTtcbiAgICAgICAgICAgIHRoaXMuYm90dG9tLnN5bmMoYm90dG9tKTtcbiAgICAgICAgICAgIGZvciAobGV0IHAgb2YgbW91bnQpIHtcbiAgICAgICAgICAgICAgICBwLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tcGFuZWxcIik7XG4gICAgICAgICAgICAgICAgaWYgKHAubW91bnQpXG4gICAgICAgICAgICAgICAgICAgIHAubW91bnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wYW5lbHMpXG4gICAgICAgICAgICAgICAgaWYgKHAudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICBwLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudG9wLnN5bmMoW10pO1xuICAgICAgICB0aGlzLmJvdHRvbS5zeW5jKFtdKTtcbiAgICB9XG59LCB7XG4gICAgcHJvdmlkZTogcGx1Z2luID0+IEVkaXRvclZpZXcuc2Nyb2xsTWFyZ2lucy5vZih2aWV3ID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gdmlldy5wbHVnaW4ocGx1Z2luKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIHsgdG9wOiB2YWx1ZS50b3Auc2Nyb2xsTWFyZ2luKCksIGJvdHRvbTogdmFsdWUuYm90dG9tLnNjcm9sbE1hcmdpbigpIH07XG4gICAgfSlcbn0pO1xuY2xhc3MgUGFuZWxHcm91cCB7XG4gICAgY29uc3RydWN0b3IodmlldywgdG9wLCBjb250YWluZXIpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgICAgICB0aGlzLmRvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jbGFzc2VzID0gXCJcIjtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSBbXTtcbiAgICAgICAgdGhpcy5zeW5jQ2xhc3NlcygpO1xuICAgIH1cbiAgICBzeW5jKHBhbmVscykge1xuICAgICAgICBmb3IgKGxldCBwIG9mIHRoaXMucGFuZWxzKVxuICAgICAgICAgICAgaWYgKHAuZGVzdHJveSAmJiBwYW5lbHMuaW5kZXhPZihwKSA8IDApXG4gICAgICAgICAgICAgICAgcC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucGFuZWxzID0gcGFuZWxzO1xuICAgICAgICB0aGlzLnN5bmNET00oKTtcbiAgICB9XG4gICAgc3luY0RPTSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFuZWxzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZG9tKSB7XG4gICAgICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSB0aGlzLnRvcCA/IFwiY20tcGFuZWxzIGNtLXBhbmVscy10b3BcIiA6IFwiY20tcGFuZWxzIGNtLXBhbmVscy1ib3R0b21cIjtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlW3RoaXMudG9wID8gXCJ0b3BcIiA6IFwiYm90dG9tXCJdID0gXCIwXCI7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5jb250YWluZXIgfHwgdGhpcy52aWV3LmRvbTtcbiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcy5kb20sIHRoaXMudG9wID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3VyRE9NID0gdGhpcy5kb20uZmlyc3RDaGlsZDtcbiAgICAgICAgZm9yIChsZXQgcGFuZWwgb2YgdGhpcy5wYW5lbHMpIHtcbiAgICAgICAgICAgIGlmIChwYW5lbC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJET00gIT0gcGFuZWwuZG9tKVxuICAgICAgICAgICAgICAgICAgICBjdXJET00gPSBybShjdXJET00pO1xuICAgICAgICAgICAgICAgIGN1ckRPTSA9IGN1ckRPTS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShwYW5lbC5kb20sIGN1ckRPTSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGN1ckRPTSlcbiAgICAgICAgICAgIGN1ckRPTSA9IHJtKGN1ckRPTSk7XG4gICAgfVxuICAgIHNjcm9sbE1hcmdpbigpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRvbSB8fCB0aGlzLmNvbnRhaW5lciA/IDBcbiAgICAgICAgICAgIDogTWF0aC5tYXgoMCwgdGhpcy50b3AgP1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSAtIE1hdGgubWF4KDAsIHRoaXMudmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wKSA6XG4gICAgICAgICAgICAgICAgTWF0aC5taW4oaW5uZXJIZWlnaHQsIHRoaXMudmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tKSAtIHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCk7XG4gICAgfVxuICAgIHN5bmNDbGFzc2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8IHRoaXMuY2xhc3NlcyA9PSB0aGlzLnZpZXcudGhlbWVDbGFzc2VzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCBjbHMgb2YgdGhpcy5jbGFzc2VzLnNwbGl0KFwiIFwiKSlcbiAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShjbHMpO1xuICAgICAgICBmb3IgKGxldCBjbHMgb2YgKHRoaXMuY2xhc3NlcyA9IHRoaXMudmlldy50aGVtZUNsYXNzZXMpLnNwbGl0KFwiIFwiKSlcbiAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChjbHMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJtKG5vZGUpIHtcbiAgICBsZXQgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgbm9kZS5yZW1vdmUoKTtcbiAgICByZXR1cm4gbmV4dDtcbn1cbi8qKlxuT3BlbmluZyBhIHBhbmVsIGlzIGRvbmUgYnkgcHJvdmlkaW5nIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yXG50aGUgcGFuZWwgdGhyb3VnaCB0aGlzIGZhY2V0LiAoVGhlIHBhbmVsIGlzIGNsb3NlZCBhZ2FpbiB3aGVuIGl0c1xuY29uc3RydWN0b3IgaXMgbm8gbG9uZ2VyIHByb3ZpZGVkLikgVmFsdWVzIG9mIGBudWxsYCBhcmUgaWdub3JlZC5cbiovXG5jb25zdCBzaG93UGFuZWwgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBlbmFibGVzOiBwYW5lbFBsdWdpblxufSk7XG5cbi8qKlxuQSBndXR0ZXIgbWFya2VyIHJlcHJlc2VudHMgYSBiaXQgb2YgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gYSBsaW5lXG5pbiBhIHNwZWNpZmljIGd1dHRlci4gWW91ciBvd24gY3VzdG9tIG1hcmtlcnMgaGF2ZSB0byBleHRlbmQgdGhpc1xuY2xhc3MuXG4qL1xuY2xhc3MgR3V0dGVyTWFya2VyIGV4dGVuZHMgUmFuZ2VWYWx1ZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXJlKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8IHRoaXMuY29uc3RydWN0b3IgPT0gb3RoZXIuY29uc3RydWN0b3IgJiYgdGhpcy5lcShvdGhlcik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyBtYXJrZXIgdG8gYW5vdGhlciBtYXJrZXIgb2YgdGhlIHNhbWUgdHlwZS5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIENhbGxlZCBpZiB0aGUgbWFya2VyIGhhcyBhIGB0b0RPTWAgbWV0aG9kIGFuZCBpdHMgcmVwcmVzZW50YXRpb25cbiAgICB3YXMgcmVtb3ZlZCBmcm9tIGEgZ3V0dGVyLlxuICAgICovXG4gICAgZGVzdHJveShkb20pIHsgfVxufVxuR3V0dGVyTWFya2VyLnByb3RvdHlwZS5lbGVtZW50Q2xhc3MgPSBcIlwiO1xuR3V0dGVyTWFya2VyLnByb3RvdHlwZS50b0RPTSA9IHVuZGVmaW5lZDtcbkd1dHRlck1hcmtlci5wcm90b3R5cGUubWFwTW9kZSA9IE1hcE1vZGUuVHJhY2tCZWZvcmU7XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLnN0YXJ0U2lkZSA9IEd1dHRlck1hcmtlci5wcm90b3R5cGUuZW5kU2lkZSA9IC0xO1xuR3V0dGVyTWFya2VyLnByb3RvdHlwZS5wb2ludCA9IHRydWU7XG4vKipcbkZhY2V0IHVzZWQgdG8gYWRkIGEgY2xhc3MgdG8gYWxsIGd1dHRlciBlbGVtZW50cyBmb3IgYSBnaXZlbiBsaW5lLlxuTWFya2VycyBnaXZlbiB0byB0aGlzIGZhY2V0IHNob3VsZCBfb25seV8gZGVmaW5lIGFuXG5bYGVsZW1lbnRjbGFzc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5HdXR0ZXJNYXJrZXIuZWxlbWVudENsYXNzKSwgbm90IGFcbltgdG9ET01gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuR3V0dGVyTWFya2VyLnRvRE9NKSAob3IgdGhlIG1hcmtlciB3aWxsIGFwcGVhclxuaW4gYWxsIGd1dHRlcnMgZm9yIHRoZSBsaW5lKS5cbiovXG5jb25zdCBndXR0ZXJMaW5lQ2xhc3MgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgICBjbGFzczogXCJcIixcbiAgICByZW5kZXJFbXB0eUVsZW1lbnRzOiBmYWxzZSxcbiAgICBlbGVtZW50U3R5bGU6IFwiXCIsXG4gICAgbWFya2VyczogKCkgPT4gUmFuZ2VTZXQuZW1wdHksXG4gICAgbGluZU1hcmtlcjogKCkgPT4gbnVsbCxcbiAgICB3aWRnZXRNYXJrZXI6ICgpID0+IG51bGwsXG4gICAgbGluZU1hcmtlckNoYW5nZTogbnVsbCxcbiAgICBpbml0aWFsU3BhY2VyOiBudWxsLFxuICAgIHVwZGF0ZVNwYWNlcjogbnVsbCxcbiAgICBkb21FdmVudEhhbmRsZXJzOiB7fVxufTtcbmNvbnN0IGFjdGl2ZUd1dHRlcnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcbkRlZmluZSBhbiBlZGl0b3IgZ3V0dGVyLiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGd1dHRlcnMgYXBwZWFyIGlzXG5kZXRlcm1pbmVkIGJ5IHRoZWlyIGV4dGVuc2lvbiBwcmlvcml0eS5cbiovXG5mdW5jdGlvbiBndXR0ZXIoY29uZmlnKSB7XG4gICAgcmV0dXJuIFtndXR0ZXJzKCksIGFjdGl2ZUd1dHRlcnMub2YoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cyksIGNvbmZpZykpXTtcbn1cbmNvbnN0IHVuZml4R3V0dGVycyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuc29tZSh4ID0+IHgpXG59KTtcbi8qKlxuVGhlIGd1dHRlci1kcmF3aW5nIHBsdWdpbiBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgd2hlbiB5b3UgYWRkIGFcbmd1dHRlciwgYnV0IHlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gZXhwbGljaXRseSBjb25maWd1cmUgaXQuXG5cblVubGVzcyBgZml4ZWRgIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGBmYWxzZWAsIHRoZSBndXR0ZXJzIGFyZVxuZml4ZWQsIG1lYW5pbmcgdGhleSBkb24ndCBzY3JvbGwgYWxvbmcgd2l0aCB0aGUgY29udGVudFxuaG9yaXpvbnRhbGx5IChleGNlcHQgb24gSW50ZXJuZXQgRXhwbG9yZXIsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydFxuQ1NTIFtgcG9zaXRpb246XG5zdGlja3lgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcG9zaXRpb24jc3RpY2t5KSkuXG4qL1xuZnVuY3Rpb24gZ3V0dGVycyhjb25maWcpIHtcbiAgICBsZXQgcmVzdWx0ID0gW1xuICAgICAgICBndXR0ZXJWaWV3LFxuICAgIF07XG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWcuZml4ZWQgPT09IGZhbHNlKVxuICAgICAgICByZXN1bHQucHVzaCh1bmZpeEd1dHRlcnMub2YodHJ1ZSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBndXR0ZXJWaWV3ID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMucHJldlZpZXdwb3J0ID0gdmlldy52aWV3cG9ydDtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWd1dHRlcnNcIjtcbiAgICAgICAgdGhpcy5kb20uc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS5taW5IZWlnaHQgPSAodGhpcy52aWV3LmNvbnRlbnRIZWlnaHQgLyB0aGlzLnZpZXcuc2NhbGVZKSArIFwicHhcIjtcbiAgICAgICAgdGhpcy5ndXR0ZXJzID0gdmlldy5zdGF0ZS5mYWNldChhY3RpdmVHdXR0ZXJzKS5tYXAoY29uZiA9PiBuZXcgU2luZ2xlR3V0dGVyVmlldyh2aWV3LCBjb25mKSk7XG4gICAgICAgIGZvciAobGV0IGd1dHRlciBvZiB0aGlzLmd1dHRlcnMpXG4gICAgICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZChndXR0ZXIuZG9tKTtcbiAgICAgICAgdGhpcy5maXhlZCA9ICF2aWV3LnN0YXRlLmZhY2V0KHVuZml4R3V0dGVycyk7XG4gICAgICAgIGlmICh0aGlzLmZpeGVkKSB7XG4gICAgICAgICAgICAvLyBGSVhNRSBJRTExIGZhbGxiYWNrLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgcG9zaXRpb246IHN0aWNreSxcbiAgICAgICAgICAgIC8vIGJ5IHVzaW5nIHBvc2l0aW9uOiByZWxhdGl2ZSArIGV2ZW50IGhhbmRsZXJzIHRoYXQgcmVhbGlnbiB0aGVcbiAgICAgICAgICAgIC8vIGd1dHRlciAob3IganVzdCBmb3JjZSBmaXhlZD1mYWxzZSBvbiBJRTExPylcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnBvc2l0aW9uID0gXCJzdGlja3lcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bmNHdXR0ZXJzKGZhbHNlKTtcbiAgICAgICAgdmlldy5zY3JvbGxET00uaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLCB2aWV3LmNvbnRlbnRET00pO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUd1dHRlcnModXBkYXRlKSkge1xuICAgICAgICAgICAgLy8gRGV0YWNoIGR1cmluZyBzeW5jIHdoZW4gdGhlIHZpZXdwb3J0IGNoYW5nZWQgc2lnbmlmaWNhbnRseVxuICAgICAgICAgICAgLy8gKHN1Y2ggYXMgZHVyaW5nIHNjcm9sbGluZyksIHNpbmNlIGZvciBsYXJnZSB1cGRhdGVzIHRoYXQgaXNcbiAgICAgICAgICAgIC8vIGZhc3Rlci5cbiAgICAgICAgICAgIGxldCB2cEEgPSB0aGlzLnByZXZWaWV3cG9ydCwgdnBCID0gdXBkYXRlLnZpZXcudmlld3BvcnQ7XG4gICAgICAgICAgICBsZXQgdnBPdmVybGFwID0gTWF0aC5taW4odnBBLnRvLCB2cEIudG8pIC0gTWF0aC5tYXgodnBBLmZyb20sIHZwQi5mcm9tKTtcbiAgICAgICAgICAgIHRoaXMuc3luY0d1dHRlcnModnBPdmVybGFwIDwgKHZwQi50byAtIHZwQi5mcm9tKSAqIDAuOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQpXG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLnZpZXcuY29udGVudEhlaWdodCArIFwicHhcIjtcbiAgICAgICAgaWYgKHRoaXMudmlldy5zdGF0ZS5mYWNldCh1bmZpeEd1dHRlcnMpICE9ICF0aGlzLmZpeGVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpeGVkID0gIXRoaXMuZml4ZWQ7XG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5wb3NpdGlvbiA9IHRoaXMuZml4ZWQgPyBcInN0aWNreVwiIDogXCJcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXZWaWV3cG9ydCA9IHVwZGF0ZS52aWV3LnZpZXdwb3J0O1xuICAgIH1cbiAgICBzeW5jR3V0dGVycyhkZXRhY2gpIHtcbiAgICAgICAgbGV0IGFmdGVyID0gdGhpcy5kb20ubmV4dFNpYmxpbmc7XG4gICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICAgICAgbGV0IGxpbmVDbGFzc2VzID0gUmFuZ2VTZXQuaXRlcih0aGlzLnZpZXcuc3RhdGUuZmFjZXQoZ3V0dGVyTGluZUNsYXNzKSwgdGhpcy52aWV3LnZpZXdwb3J0LmZyb20pO1xuICAgICAgICBsZXQgY2xhc3NTZXQgPSBbXTtcbiAgICAgICAgbGV0IGNvbnRleHRzID0gdGhpcy5ndXR0ZXJzLm1hcChndXR0ZXIgPT4gbmV3IFVwZGF0ZUNvbnRleHQoZ3V0dGVyLCB0aGlzLnZpZXcudmlld3BvcnQsIC10aGlzLnZpZXcuZG9jdW1lbnRQYWRkaW5nLnRvcCkpO1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHRoaXMudmlldy52aWV3cG9ydExpbmVCbG9ja3MpIHtcbiAgICAgICAgICAgIGlmIChjbGFzc1NldC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgY2xhc3NTZXQgPSBbXTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpbmUudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGIgb2YgbGluZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQgJiYgZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VDdXJzb3IobGluZUNsYXNzZXMsIGNsYXNzU2V0LCBiLmZyb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3gubGluZSh0aGlzLnZpZXcsIGIsIGNsYXNzU2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYi53aWRnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGN4IG9mIGNvbnRleHRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4LndpZGdldCh0aGlzLnZpZXcsIGIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGluZS50eXBlID09IEJsb2NrVHlwZS5UZXh0KSB7XG4gICAgICAgICAgICAgICAgYWR2YW5jZUN1cnNvcihsaW5lQ2xhc3NlcywgY2xhc3NTZXQsIGxpbmUuZnJvbSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICAgICAgICAgIGN4LmxpbmUodGhpcy52aWV3LCBsaW5lLCBjbGFzc1NldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsaW5lLndpZGdldCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGN4IG9mIGNvbnRleHRzKVxuICAgICAgICAgICAgICAgICAgICBjeC53aWRnZXQodGhpcy52aWV3LCBsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgIGN4LmZpbmlzaCgpO1xuICAgICAgICBpZiAoZGV0YWNoKVxuICAgICAgICAgICAgdGhpcy52aWV3LnNjcm9sbERPTS5pbnNlcnRCZWZvcmUodGhpcy5kb20sIGFmdGVyKTtcbiAgICB9XG4gICAgdXBkYXRlR3V0dGVycyh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHByZXYgPSB1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChhY3RpdmVHdXR0ZXJzKSwgY3VyID0gdXBkYXRlLnN0YXRlLmZhY2V0KGFjdGl2ZUd1dHRlcnMpO1xuICAgICAgICBsZXQgY2hhbmdlID0gdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLmhlaWdodENoYW5nZWQgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fFxuICAgICAgICAgICAgIVJhbmdlU2V0LmVxKHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGd1dHRlckxpbmVDbGFzcyksIHVwZGF0ZS5zdGF0ZS5mYWNldChndXR0ZXJMaW5lQ2xhc3MpLCB1cGRhdGUudmlldy52aWV3cG9ydC5mcm9tLCB1cGRhdGUudmlldy52aWV3cG9ydC50byk7XG4gICAgICAgIGlmIChwcmV2ID09IGN1cikge1xuICAgICAgICAgICAgZm9yIChsZXQgZ3V0dGVyIG9mIHRoaXMuZ3V0dGVycylcbiAgICAgICAgICAgICAgICBpZiAoZ3V0dGVyLnVwZGF0ZSh1cGRhdGUpKVxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBndXR0ZXJzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBjb25mIG9mIGN1cikge1xuICAgICAgICAgICAgICAgIGxldCBrbm93biA9IHByZXYuaW5kZXhPZihjb25mKTtcbiAgICAgICAgICAgICAgICBpZiAoa25vd24gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGd1dHRlcnMucHVzaChuZXcgU2luZ2xlR3V0dGVyVmlldyh0aGlzLnZpZXcsIGNvbmYpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3V0dGVyc1trbm93bl0udXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGd1dHRlcnMucHVzaCh0aGlzLmd1dHRlcnNba25vd25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBnIG9mIHRoaXMuZ3V0dGVycykge1xuICAgICAgICAgICAgICAgIGcuZG9tLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChndXR0ZXJzLmluZGV4T2YoZykgPCAwKVxuICAgICAgICAgICAgICAgICAgICBnLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGcgb2YgZ3V0dGVycylcbiAgICAgICAgICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZChnLmRvbSk7XG4gICAgICAgICAgICB0aGlzLmd1dHRlcnMgPSBndXR0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2U7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAobGV0IHZpZXcgb2YgdGhpcy5ndXR0ZXJzKVxuICAgICAgICAgICAgdmlldy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgIH1cbn0sIHtcbiAgICBwcm92aWRlOiBwbHVnaW4gPT4gRWRpdG9yVmlldy5zY3JvbGxNYXJnaW5zLm9mKHZpZXcgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSB2aWV3LnBsdWdpbihwbHVnaW4pO1xuICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLmd1dHRlcnMubGVuZ3RoID09IDAgfHwgIXZhbHVlLmZpeGVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB2aWV3LnRleHREaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUlxuICAgICAgICAgICAgPyB7IGxlZnQ6IHZhbHVlLmRvbS5vZmZzZXRXaWR0aCAqIHZpZXcuc2NhbGVYIH1cbiAgICAgICAgICAgIDogeyByaWdodDogdmFsdWUuZG9tLm9mZnNldFdpZHRoICogdmlldy5zY2FsZVggfTtcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBhc0FycmF5KHZhbCkgeyByZXR1cm4gKEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWxdKTsgfVxuZnVuY3Rpb24gYWR2YW5jZUN1cnNvcihjdXJzb3IsIGNvbGxlY3QsIHBvcykge1xuICAgIHdoaWxlIChjdXJzb3IudmFsdWUgJiYgY3Vyc29yLmZyb20gPD0gcG9zKSB7XG4gICAgICAgIGlmIChjdXJzb3IuZnJvbSA9PSBwb3MpXG4gICAgICAgICAgICBjb2xsZWN0LnB1c2goY3Vyc29yLnZhbHVlKTtcbiAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICB9XG59XG5jbGFzcyBVcGRhdGVDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihndXR0ZXIsIHZpZXdwb3J0LCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5ndXR0ZXIgPSBndXR0ZXI7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmkgPSAwO1xuICAgICAgICB0aGlzLmN1cnNvciA9IFJhbmdlU2V0Lml0ZXIoZ3V0dGVyLm1hcmtlcnMsIHZpZXdwb3J0LmZyb20pO1xuICAgIH1cbiAgICBhZGRFbGVtZW50KHZpZXcsIGJsb2NrLCBtYXJrZXJzKSB7XG4gICAgICAgIGxldCB7IGd1dHRlciB9ID0gdGhpcywgYWJvdmUgPSAoYmxvY2sudG9wIC0gdGhpcy5oZWlnaHQpIC8gdmlldy5zY2FsZVksIGhlaWdodCA9IGJsb2NrLmhlaWdodCAvIHZpZXcuc2NhbGVZO1xuICAgICAgICBpZiAodGhpcy5pID09IGd1dHRlci5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBuZXdFbHQgPSBuZXcgR3V0dGVyRWxlbWVudCh2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKTtcbiAgICAgICAgICAgIGd1dHRlci5lbGVtZW50cy5wdXNoKG5ld0VsdCk7XG4gICAgICAgICAgICBndXR0ZXIuZG9tLmFwcGVuZENoaWxkKG5ld0VsdC5kb20pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ3V0dGVyLmVsZW1lbnRzW3RoaXMuaV0udXBkYXRlKHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gYmxvY2suYm90dG9tO1xuICAgICAgICB0aGlzLmkrKztcbiAgICB9XG4gICAgbGluZSh2aWV3LCBsaW5lLCBleHRyYU1hcmtlcnMpIHtcbiAgICAgICAgbGV0IGxvY2FsTWFya2VycyA9IFtdO1xuICAgICAgICBhZHZhbmNlQ3Vyc29yKHRoaXMuY3Vyc29yLCBsb2NhbE1hcmtlcnMsIGxpbmUuZnJvbSk7XG4gICAgICAgIGlmIChleHRyYU1hcmtlcnMubGVuZ3RoKVxuICAgICAgICAgICAgbG9jYWxNYXJrZXJzID0gbG9jYWxNYXJrZXJzLmNvbmNhdChleHRyYU1hcmtlcnMpO1xuICAgICAgICBsZXQgZm9yTGluZSA9IHRoaXMuZ3V0dGVyLmNvbmZpZy5saW5lTWFya2VyKHZpZXcsIGxpbmUsIGxvY2FsTWFya2Vycyk7XG4gICAgICAgIGlmIChmb3JMaW5lKVxuICAgICAgICAgICAgbG9jYWxNYXJrZXJzLnVuc2hpZnQoZm9yTGluZSk7XG4gICAgICAgIGxldCBndXR0ZXIgPSB0aGlzLmd1dHRlcjtcbiAgICAgICAgaWYgKGxvY2FsTWFya2Vycy5sZW5ndGggPT0gMCAmJiAhZ3V0dGVyLmNvbmZpZy5yZW5kZXJFbXB0eUVsZW1lbnRzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmFkZEVsZW1lbnQodmlldywgbGluZSwgbG9jYWxNYXJrZXJzKTtcbiAgICB9XG4gICAgd2lkZ2V0KHZpZXcsIGJsb2NrKSB7XG4gICAgICAgIGxldCBtYXJrZXIgPSB0aGlzLmd1dHRlci5jb25maWcud2lkZ2V0TWFya2VyKHZpZXcsIGJsb2NrLndpZGdldCwgYmxvY2spO1xuICAgICAgICBpZiAobWFya2VyKVxuICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50KHZpZXcsIGJsb2NrLCBbbWFya2VyXSk7XG4gICAgfVxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgbGV0IGd1dHRlciA9IHRoaXMuZ3V0dGVyO1xuICAgICAgICB3aGlsZSAoZ3V0dGVyLmVsZW1lbnRzLmxlbmd0aCA+IHRoaXMuaSkge1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBndXR0ZXIuZWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICBndXR0ZXIuZG9tLnJlbW92ZUNoaWxkKGxhc3QuZG9tKTtcbiAgICAgICAgICAgIGxhc3QuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgU2luZ2xlR3V0dGVyVmlldyB7XG4gICAgY29uc3RydWN0b3IodmlldywgY29uZmlnKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0gW107XG4gICAgICAgIHRoaXMuc3BhY2VyID0gbnVsbDtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWd1dHRlclwiICsgKHRoaXMuY29uZmlnLmNsYXNzID8gXCIgXCIgKyB0aGlzLmNvbmZpZy5jbGFzcyA6IFwiXCIpO1xuICAgICAgICBmb3IgKGxldCBwcm9wIGluIGNvbmZpZy5kb21FdmVudEhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmRvbS5hZGRFdmVudExpc3RlbmVyKHByb3AsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQsIHk7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSB0aGlzLmRvbSAmJiB0aGlzLmRvbS5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0YXJnZXQucGFyZW50Tm9kZSAhPSB0aGlzLmRvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IChyZWN0LnRvcCArIHJlY3QuYm90dG9tKSAvIDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB5ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0SGVpZ2h0KHkgLSB2aWV3LmRvY3VtZW50VG9wKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmRvbUV2ZW50SGFuZGxlcnNbcHJvcF0odmlldywgbGluZSwgZXZlbnQpKVxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrZXJzID0gYXNBcnJheShjb25maWcubWFya2Vycyh2aWV3KSk7XG4gICAgICAgIGlmIChjb25maWcuaW5pdGlhbFNwYWNlcikge1xuICAgICAgICAgICAgdGhpcy5zcGFjZXIgPSBuZXcgR3V0dGVyRWxlbWVudCh2aWV3LCAwLCAwLCBbY29uZmlnLmluaXRpYWxTcGFjZXIodmlldyldKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKHRoaXMuc3BhY2VyLmRvbSk7XG4gICAgICAgICAgICB0aGlzLnNwYWNlci5kb20uc3R5bGUuY3NzVGV4dCArPSBcInZpc2liaWxpdHk6IGhpZGRlbjsgcG9pbnRlci1ldmVudHM6IG5vbmVcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCBwcmV2TWFya2VycyA9IHRoaXMubWFya2VycztcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gYXNBcnJheSh0aGlzLmNvbmZpZy5tYXJrZXJzKHVwZGF0ZS52aWV3KSk7XG4gICAgICAgIGlmICh0aGlzLnNwYWNlciAmJiB0aGlzLmNvbmZpZy51cGRhdGVTcGFjZXIpIHtcbiAgICAgICAgICAgIGxldCB1cGRhdGVkID0gdGhpcy5jb25maWcudXBkYXRlU3BhY2VyKHRoaXMuc3BhY2VyLm1hcmtlcnNbMF0sIHVwZGF0ZSk7XG4gICAgICAgICAgICBpZiAodXBkYXRlZCAhPSB0aGlzLnNwYWNlci5tYXJrZXJzWzBdKVxuICAgICAgICAgICAgICAgIHRoaXMuc3BhY2VyLnVwZGF0ZSh1cGRhdGUudmlldywgMCwgMCwgW3VwZGF0ZWRdKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdnAgPSB1cGRhdGUudmlldy52aWV3cG9ydDtcbiAgICAgICAgcmV0dXJuICFSYW5nZVNldC5lcSh0aGlzLm1hcmtlcnMsIHByZXZNYXJrZXJzLCB2cC5mcm9tLCB2cC50bykgfHxcbiAgICAgICAgICAgICh0aGlzLmNvbmZpZy5saW5lTWFya2VyQ2hhbmdlID8gdGhpcy5jb25maWcubGluZU1hcmtlckNoYW5nZSh1cGRhdGUpIDogZmFsc2UpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGxldCBlbHQgb2YgdGhpcy5lbGVtZW50cylcbiAgICAgICAgICAgIGVsdC5kZXN0cm95KCk7XG4gICAgfVxufVxuY2xhc3MgR3V0dGVyRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycykge1xuICAgICAgICB0aGlzLmhlaWdodCA9IC0xO1xuICAgICAgICB0aGlzLmFib3ZlID0gMDtcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1ndXR0ZXJFbGVtZW50XCI7XG4gICAgICAgIHRoaXMudXBkYXRlKHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMpO1xuICAgIH1cbiAgICB1cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycykge1xuICAgICAgICBpZiAodGhpcy5oZWlnaHQgIT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmhlaWdodCA9IGhlaWdodCArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hYm92ZSAhPSBhYm92ZSlcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLm1hcmdpblRvcCA9ICh0aGlzLmFib3ZlID0gYWJvdmUpID8gYWJvdmUgKyBcInB4XCIgOiBcIlwiO1xuICAgICAgICBpZiAoIXNhbWVNYXJrZXJzKHRoaXMubWFya2VycywgbWFya2VycykpXG4gICAgICAgICAgICB0aGlzLnNldE1hcmtlcnModmlldywgbWFya2Vycyk7XG4gICAgfVxuICAgIHNldE1hcmtlcnModmlldywgbWFya2Vycykge1xuICAgICAgICBsZXQgY2xzID0gXCJjbS1ndXR0ZXJFbGVtZW50XCIsIGRvbVBvcyA9IHRoaXMuZG9tLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGZvciAobGV0IGlOZXcgPSAwLCBpT2xkID0gMDs7KSB7XG4gICAgICAgICAgICBsZXQgc2tpcFRvID0gaU9sZCwgbWFya2VyID0gaU5ldyA8IG1hcmtlcnMubGVuZ3RoID8gbWFya2Vyc1tpTmV3KytdIDogbnVsbCwgbWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKG1hcmtlcikge1xuICAgICAgICAgICAgICAgIGxldCBjID0gbWFya2VyLmVsZW1lbnRDbGFzcztcbiAgICAgICAgICAgICAgICBpZiAoYylcbiAgICAgICAgICAgICAgICAgICAgY2xzICs9IFwiIFwiICsgYztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gaU9sZDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFya2Vyc1tpXS5jb21wYXJlKG1hcmtlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBUbyA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBza2lwVG8gPSB0aGlzLm1hcmtlcnMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGlPbGQgPCBza2lwVG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMubWFya2Vyc1tpT2xkKytdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0LnRvRE9NKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQuZGVzdHJveShkb21Qb3MpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXIgPSBkb21Qb3MubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGRvbVBvcy5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZG9tUG9zID0gYWZ0ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtYXJrZXIpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAobWFya2VyLnRvRE9NKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWQpXG4gICAgICAgICAgICAgICAgICAgIGRvbVBvcyA9IGRvbVBvcy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShtYXJrZXIudG9ET00odmlldyksIGRvbVBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hlZClcbiAgICAgICAgICAgICAgICBpT2xkKys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gY2xzO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBtYXJrZXJzO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnNldE1hcmtlcnMobnVsbCwgW10pOyAvLyBGaXJzdCBhcmd1bWVudCBub3QgdXNlZCB1bmxlc3MgY3JlYXRpbmcgbWFya2Vyc1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVNYXJrZXJzKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghYVtpXS5jb21wYXJlKGJbaV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG5GYWNldCB1c2VkIHRvIHByb3ZpZGUgbWFya2VycyB0byB0aGUgbGluZSBudW1iZXIgZ3V0dGVyLlxuKi9cbmNvbnN0IGxpbmVOdW1iZXJNYXJrZXJzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgbGluZU51bWJlckNvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBjb21iaW5lQ29uZmlnKHZhbHVlcywgeyBmb3JtYXROdW1iZXI6IFN0cmluZywgZG9tRXZlbnRIYW5kbGVyczoge30gfSwge1xuICAgICAgICAgICAgZG9tRXZlbnRIYW5kbGVycyhhLCBiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIGEpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGV2ZW50IGluIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IHJlc3VsdFtldmVudF0sIGFkZCA9IGJbZXZlbnRdO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbZXZlbnRdID0gZXhpc3RzID8gKHZpZXcsIGxpbmUsIGV2ZW50KSA9PiBleGlzdHModmlldywgbGluZSwgZXZlbnQpIHx8IGFkZCh2aWV3LCBsaW5lLCBldmVudCkgOiBhZGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuY2xhc3MgTnVtYmVyTWFya2VyIGV4dGVuZHMgR3V0dGVyTWFya2VyIHtcbiAgICBjb25zdHJ1Y3RvcihudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiB0aGlzLm51bWJlciA9PSBvdGhlci5udW1iZXI7IH1cbiAgICB0b0RPTSgpIHsgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMubnVtYmVyKTsgfVxufVxuZnVuY3Rpb24gZm9ybWF0TnVtYmVyKHZpZXcsIG51bWJlcikge1xuICAgIHJldHVybiB2aWV3LnN0YXRlLmZhY2V0KGxpbmVOdW1iZXJDb25maWcpLmZvcm1hdE51bWJlcihudW1iZXIsIHZpZXcuc3RhdGUpO1xufVxuY29uc3QgbGluZU51bWJlckd1dHRlciA9IC8qQF9fUFVSRV9fKi9hY3RpdmVHdXR0ZXJzLmNvbXB1dGUoW2xpbmVOdW1iZXJDb25maWddLCBzdGF0ZSA9PiAoe1xuICAgIGNsYXNzOiBcImNtLWxpbmVOdW1iZXJzXCIsXG4gICAgcmVuZGVyRW1wdHlFbGVtZW50czogZmFsc2UsXG4gICAgbWFya2Vycyh2aWV3KSB7IHJldHVybiB2aWV3LnN0YXRlLmZhY2V0KGxpbmVOdW1iZXJNYXJrZXJzKTsgfSxcbiAgICBsaW5lTWFya2VyKHZpZXcsIGxpbmUsIG90aGVycykge1xuICAgICAgICBpZiAob3RoZXJzLnNvbWUobSA9PiBtLnRvRE9NKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IE51bWJlck1hcmtlcihmb3JtYXROdW1iZXIodmlldywgdmlldy5zdGF0ZS5kb2MubGluZUF0KGxpbmUuZnJvbSkubnVtYmVyKSk7XG4gICAgfSxcbiAgICB3aWRnZXRNYXJrZXI6ICgpID0+IG51bGwsXG4gICAgbGluZU1hcmtlckNoYW5nZTogdXBkYXRlID0+IHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGxpbmVOdW1iZXJDb25maWcpICE9IHVwZGF0ZS5zdGF0ZS5mYWNldChsaW5lTnVtYmVyQ29uZmlnKSxcbiAgICBpbml0aWFsU3BhY2VyKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJNYXJrZXIoZm9ybWF0TnVtYmVyKHZpZXcsIG1heExpbmVOdW1iZXIodmlldy5zdGF0ZS5kb2MubGluZXMpKSk7XG4gICAgfSxcbiAgICB1cGRhdGVTcGFjZXIoc3BhY2VyLCB1cGRhdGUpIHtcbiAgICAgICAgbGV0IG1heCA9IGZvcm1hdE51bWJlcih1cGRhdGUudmlldywgbWF4TGluZU51bWJlcih1cGRhdGUudmlldy5zdGF0ZS5kb2MubGluZXMpKTtcbiAgICAgICAgcmV0dXJuIG1heCA9PSBzcGFjZXIubnVtYmVyID8gc3BhY2VyIDogbmV3IE51bWJlck1hcmtlcihtYXgpO1xuICAgIH0sXG4gICAgZG9tRXZlbnRIYW5kbGVyczogc3RhdGUuZmFjZXQobGluZU51bWJlckNvbmZpZykuZG9tRXZlbnRIYW5kbGVyc1xufSkpO1xuLyoqXG5DcmVhdGUgYSBsaW5lIG51bWJlciBndXR0ZXIgZXh0ZW5zaW9uLlxuKi9cbmZ1bmN0aW9uIGxpbmVOdW1iZXJzKGNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgbGluZU51bWJlckNvbmZpZy5vZihjb25maWcpLFxuICAgICAgICBndXR0ZXJzKCksXG4gICAgICAgIGxpbmVOdW1iZXJHdXR0ZXJcbiAgICBdO1xufVxuZnVuY3Rpb24gbWF4TGluZU51bWJlcihsaW5lcykge1xuICAgIGxldCBsYXN0ID0gOTtcbiAgICB3aGlsZSAobGFzdCA8IGxpbmVzKVxuICAgICAgICBsYXN0ID0gbGFzdCAqIDEwICsgOTtcbiAgICByZXR1cm4gbGFzdDtcbn1cbmNvbnN0IGFjdGl2ZUxpbmVHdXR0ZXJNYXJrZXIgPSAvKkBfX1BVUkVfXyovbmV3IGNsYXNzIGV4dGVuZHMgR3V0dGVyTWFya2VyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5lbGVtZW50Q2xhc3MgPSBcImNtLWFjdGl2ZUxpbmVHdXR0ZXJcIjtcbiAgICB9XG59O1xuY29uc3QgYWN0aXZlTGluZUd1dHRlckhpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL2d1dHRlckxpbmVDbGFzcy5jb21wdXRlKFtcInNlbGVjdGlvblwiXSwgc3RhdGUgPT4ge1xuICAgIGxldCBtYXJrcyA9IFtdLCBsYXN0ID0gLTE7XG4gICAgZm9yIChsZXQgcmFuZ2Ugb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICBsZXQgbGluZVBvcyA9IHN0YXRlLmRvYy5saW5lQXQocmFuZ2UuaGVhZCkuZnJvbTtcbiAgICAgICAgaWYgKGxpbmVQb3MgPiBsYXN0KSB7XG4gICAgICAgICAgICBsYXN0ID0gbGluZVBvcztcbiAgICAgICAgICAgIG1hcmtzLnB1c2goYWN0aXZlTGluZUd1dHRlck1hcmtlci5yYW5nZShsaW5lUG9zKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFJhbmdlU2V0Lm9mKG1hcmtzKTtcbn0pO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGFkZHMgYSBgY20tYWN0aXZlTGluZUd1dHRlcmAgY2xhc3MgdG9cbmFsbCBndXR0ZXIgZWxlbWVudHMgb24gdGhlIFthY3RpdmVcbmxpbmVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5oaWdobGlnaHRBY3RpdmVMaW5lKS5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRBY3RpdmVMaW5lR3V0dGVyKCkge1xuICAgIHJldHVybiBhY3RpdmVMaW5lR3V0dGVySGlnaGxpZ2h0ZXI7XG59XG5cbmNvbnN0IFdoaXRlc3BhY2VEZWNvID0gLypAX19QVVJFX18qL25ldyBNYXAoKTtcbmZ1bmN0aW9uIGdldFdoaXRlc3BhY2VEZWNvKHNwYWNlKSB7XG4gICAgbGV0IGRlY28gPSBXaGl0ZXNwYWNlRGVjby5nZXQoc3BhY2UpO1xuICAgIGlmICghZGVjbylcbiAgICAgICAgV2hpdGVzcGFjZURlY28uc2V0KHNwYWNlLCBkZWNvID0gRGVjb3JhdGlvbi5tYXJrKHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYWNlID09PSBcIlxcdFwiID8ge1xuICAgICAgICAgICAgICAgIGNsYXNzOiBcImNtLWhpZ2hsaWdodFRhYlwiLFxuICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICBjbGFzczogXCJjbS1oaWdobGlnaHRTcGFjZVwiLFxuICAgICAgICAgICAgICAgIFwiZGF0YS1kaXNwbGF5XCI6IHNwYWNlLnJlcGxhY2UoLyAvZywgXCJcdTAwQjdcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIHJldHVybiBkZWNvO1xufVxuZnVuY3Rpb24gbWF0Y2hlcihkZWNvcmF0b3IpIHtcbiAgICByZXR1cm4gVmlld1BsdWdpbi5kZWZpbmUodmlldyA9PiAoe1xuICAgICAgICBkZWNvcmF0aW9uczogZGVjb3JhdG9yLmNyZWF0ZURlY28odmlldyksXG4gICAgICAgIHVwZGF0ZSh1KSB7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gZGVjb3JhdG9yLnVwZGF0ZURlY28odSwgdGhpcy5kZWNvcmF0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgfSksIHtcbiAgICAgICAgZGVjb3JhdGlvbnM6IHYgPT4gdi5kZWNvcmF0aW9uc1xuICAgIH0pO1xufVxuY29uc3Qgd2hpdGVzcGFjZUhpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL21hdGNoZXIoLypAX19QVVJFX18qL25ldyBNYXRjaERlY29yYXRvcih7XG4gICAgcmVnZXhwOiAvXFx0fCArL2csXG4gICAgZGVjb3JhdGlvbjogbWF0Y2ggPT4gZ2V0V2hpdGVzcGFjZURlY28obWF0Y2hbMF0pLFxuICAgIGJvdW5kYXJ5OiAvXFxTLyxcbn0pKTtcbi8qKlxuUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBoaWdobGlnaHRzIHdoaXRlc3BhY2UsIGFkZGluZyBhXG5gY20taGlnaGxpZ2h0U3BhY2VgIGNsYXNzIHRvIHN0cmV0Y2hlcyBvZiBzcGFjZXMsIGFuZCBhXG5gY20taGlnaGxpZ2h0VGFiYCBjbGFzcyB0byBpbmRpdmlkdWFsIHRhYiBjaGFyYWN0ZXJzLiBCeSBkZWZhdWx0LFxudGhlIGZvcm1lciBhcmUgc2hvd24gYXMgZmFpbnQgZG90cywgYW5kIHRoZSBsYXR0ZXIgYXMgYXJyb3dzLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodFdoaXRlc3BhY2UoKSB7XG4gICAgcmV0dXJuIHdoaXRlc3BhY2VIaWdobGlnaHRlcjtcbn1cbmNvbnN0IHRyYWlsaW5nSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovbWF0Y2hlcigvKkBfX1BVUkVfXyovbmV3IE1hdGNoRGVjb3JhdG9yKHtcbiAgICByZWdleHA6IC9cXHMrJC9nLFxuICAgIGRlY29yYXRpb246IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS10cmFpbGluZ1NwYWNlXCIgfSksXG4gICAgYm91bmRhcnk6IC9cXFMvLFxufSkpO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGFkZHMgYSBgY20tdHJhaWxpbmdTcGFjZWAgY2xhc3MgdG8gYWxsXG50cmFpbGluZyB3aGl0ZXNwYWNlLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodFRyYWlsaW5nV2hpdGVzcGFjZSgpIHtcbiAgICByZXR1cm4gdHJhaWxpbmdIaWdobGlnaHRlcjtcbn1cblxuLyoqXG5AaW50ZXJuYWxcbiovXG5jb25zdCBfX3Rlc3QgPSB7IEhlaWdodE1hcCwgSGVpZ2h0T3JhY2xlLCBNZWFzdXJlZEhlaWdodHMsIFF1ZXJ5VHlwZSwgQ2hhbmdlZFJhbmdlLCBjb21wdXRlT3JkZXIsIG1vdmVWaXN1YWxseSB9O1xuXG5leHBvcnQgeyBCaWRpU3BhbiwgQmxvY2tJbmZvLCBCbG9ja1R5cGUsIERlY29yYXRpb24sIERpcmVjdGlvbiwgRWRpdG9yVmlldywgR3V0dGVyTWFya2VyLCBNYXRjaERlY29yYXRvciwgUmVjdGFuZ2xlTWFya2VyLCBWaWV3UGx1Z2luLCBWaWV3VXBkYXRlLCBXaWRnZXRUeXBlLCBfX3Rlc3QsIGNsb3NlSG92ZXJUb29sdGlwcywgY3Jvc3NoYWlyQ3Vyc29yLCBkcmF3U2VsZWN0aW9uLCBkcm9wQ3Vyc29yLCBnZXREcmF3U2VsZWN0aW9uQ29uZmlnLCBnZXRQYW5lbCwgZ2V0VG9vbHRpcCwgZ3V0dGVyLCBndXR0ZXJMaW5lQ2xhc3MsIGd1dHRlcnMsIGhhc0hvdmVyVG9vbHRpcHMsIGhpZ2hsaWdodEFjdGl2ZUxpbmUsIGhpZ2hsaWdodEFjdGl2ZUxpbmVHdXR0ZXIsIGhpZ2hsaWdodFNwZWNpYWxDaGFycywgaGlnaGxpZ2h0VHJhaWxpbmdXaGl0ZXNwYWNlLCBoaWdobGlnaHRXaGl0ZXNwYWNlLCBob3ZlclRvb2x0aXAsIGtleW1hcCwgbGF5ZXIsIGxpbmVOdW1iZXJNYXJrZXJzLCBsaW5lTnVtYmVycywgbG9nRXhjZXB0aW9uLCBwYW5lbHMsIHBsYWNlaG9sZGVyLCByZWN0YW5ndWxhclNlbGVjdGlvbiwgcmVwb3NpdGlvblRvb2x0aXBzLCBydW5TY29wZUhhbmRsZXJzLCBzY3JvbGxQYXN0RW5kLCBzaG93UGFuZWwsIHNob3dUb29sdGlwLCB0b29sdGlwcyB9O1xuIiwgImltcG9ydCB7IE5vZGVQcm9wIH0gZnJvbSAnQGxlemVyL2NvbW1vbic7XG5cbmxldCBuZXh0VGFnSUQgPSAwO1xuLyoqXG5IaWdobGlnaHRpbmcgdGFncyBhcmUgbWFya2VycyB0aGF0IGRlbm90ZSBhIGhpZ2hsaWdodGluZyBjYXRlZ29yeS5cblRoZXkgYXJlIFthc3NvY2lhdGVkXSgjaGlnaGxpZ2h0LnN0eWxlVGFncykgd2l0aCBwYXJ0cyBvZiBhIHN5bnRheFxudHJlZSBieSBhIGxhbmd1YWdlIG1vZGUsIGFuZCB0aGVuIG1hcHBlZCB0byBhbiBhY3R1YWwgQ1NTIHN0eWxlIGJ5XG5hIFtoaWdobGlnaHRlcl0oI2hpZ2hsaWdodC5IaWdobGlnaHRlcikuXG5cbkJlY2F1c2Ugc3ludGF4IHRyZWUgbm9kZSB0eXBlcyBhbmQgaGlnaGxpZ2h0IHN0eWxlcyBoYXZlIHRvIGJlXG5hYmxlIHRvIHRhbGsgdGhlIHNhbWUgbGFuZ3VhZ2UsIENvZGVNaXJyb3IgdXNlcyBhIG1vc3RseSBfY2xvc2VkX1xuW3ZvY2FidWxhcnldKCNoaWdobGlnaHQudGFncykgb2Ygc3ludGF4IHRhZ3MgKGFzIG9wcG9zZWQgdG9cbnRyYWRpdGlvbmFsIG9wZW4gc3RyaW5nLWJhc2VkIHN5c3RlbXMsIHdoaWNoIG1ha2UgaXQgaGFyZCBmb3JcbmhpZ2hsaWdodGluZyB0aGVtZXMgdG8gY292ZXIgYWxsIHRoZSB0b2tlbnMgcHJvZHVjZWQgYnkgdGhlXG52YXJpb3VzIGxhbmd1YWdlcykuXG5cbkl0IF9pc18gcG9zc2libGUgdG8gW2RlZmluZV0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lKSB5b3VyIG93blxuaGlnaGxpZ2h0aW5nIHRhZ3MgZm9yIHN5c3RlbS1pbnRlcm5hbCB1c2UgKHdoZXJlIHlvdSBjb250cm9sIGJvdGhcbnRoZSBsYW5ndWFnZSBwYWNrYWdlIGFuZCB0aGUgaGlnaGxpZ2h0ZXIpLCBidXQgc3VjaCB0YWdzIHdpbGwgbm90XG5iZSBwaWNrZWQgdXAgYnkgcmVndWxhciBoaWdobGlnaHRlcnMgKHRob3VnaCB5b3UgY2FuIGRlcml2ZSB0aGVtXG5mcm9tIHN0YW5kYXJkIHRhZ3MgdG8gYWxsb3cgaGlnaGxpZ2h0ZXJzIHRvIGZhbGwgYmFjayB0byB0aG9zZSkuXG4qL1xuY2xhc3MgVGFnIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzZXQgb2YgdGhpcyB0YWcgYW5kIGFsbCBpdHMgcGFyZW50IHRhZ3MsIHN0YXJ0aW5nIHdpdGhcbiAgICB0aGlzIG9uZSBpdHNlbGYgYW5kIHNvcnRlZCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nIHNwZWNpZmljaXR5LlxuICAgICovXG4gICAgc2V0LCBcbiAgICAvKipcbiAgICBUaGUgYmFzZSB1bm1vZGlmaWVkIHRhZyB0aGF0IHRoaXMgb25lIGlzIGJhc2VkIG9uLCBpZiBpdCdzXG4gICAgbW9kaWZpZWQgQGludGVybmFsXG4gICAgKi9cbiAgICBiYXNlLCBcbiAgICAvKipcbiAgICBUaGUgbW9kaWZpZXJzIGFwcGxpZWQgdG8gdGhpcy5iYXNlIEBpbnRlcm5hbFxuICAgICovXG4gICAgbW9kaWZpZWQpIHtcbiAgICAgICAgdGhpcy5zZXQgPSBzZXQ7XG4gICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgICAgIHRoaXMubW9kaWZpZWQgPSBtb2RpZmllZDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gbmV4dFRhZ0lEKys7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIG5ldyB0YWcuIElmIGBwYXJlbnRgIGlzIGdpdmVuLCB0aGUgdGFnIGlzIHRyZWF0ZWQgYXMgYVxuICAgIHN1Yi10YWcgb2YgdGhhdCBwYXJlbnQsIGFuZFxuICAgIFtoaWdobGlnaHRlcnNdKCNoaWdobGlnaHQudGFnSGlnaGxpZ2h0ZXIpIHRoYXQgZG9uJ3QgbWVudGlvblxuICAgIHRoaXMgdGFnIHdpbGwgdHJ5IHRvIGZhbGwgYmFjayB0byB0aGUgcGFyZW50IHRhZyAob3IgZ3JhbmRwYXJlbnRcbiAgICB0YWcsIGV0YykuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHBhcmVudCkge1xuICAgICAgICBpZiAocGFyZW50ID09PSBudWxsIHx8IHBhcmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyZW50LmJhc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4gbm90IGRlcml2ZSBmcm9tIGEgbW9kaWZpZWQgdGFnXCIpO1xuICAgICAgICBsZXQgdGFnID0gbmV3IFRhZyhbXSwgbnVsbCwgW10pO1xuICAgICAgICB0YWcuc2V0LnB1c2godGFnKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgcGFyZW50LnNldClcbiAgICAgICAgICAgICAgICB0YWcuc2V0LnB1c2godCk7XG4gICAgICAgIHJldHVybiB0YWc7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHRhZyBfbW9kaWZpZXJfLCB3aGljaCBpcyBhIGZ1bmN0aW9uIHRoYXQsIGdpdmVuIGEgdGFnLFxuICAgIHdpbGwgcmV0dXJuIGEgdGFnIHRoYXQgaXMgYSBzdWJ0YWcgb2YgdGhlIG9yaWdpbmFsLiBBcHBseWluZyB0aGVcbiAgICBzYW1lIG1vZGlmaWVyIHRvIGEgdHdpY2UgdGFnIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIChgbTEodDEpXG4gICAgPT0gbTEodDEpYCkgYW5kIGFwcGx5aW5nIG11bHRpcGxlIG1vZGlmaWVycyB3aWxsLCByZWdhcmRsZXNzIG9yXG4gICAgb3JkZXIsIHByb2R1Y2UgdGhlIHNhbWUgdGFnIChgbTEobTIodDEpKSA9PSBtMihtMSh0MSkpYCkuXG4gICAgXG4gICAgV2hlbiBtdWx0aXBsZSBtb2RpZmllcnMgYXJlIGFwcGxpZWQgdG8gYSBnaXZlbiBiYXNlIHRhZywgZWFjaFxuICAgIHNtYWxsZXIgc2V0IG9mIG1vZGlmaWVycyBpcyByZWdpc3RlcmVkIGFzIGEgcGFyZW50LCBzbyB0aGF0IGZvclxuICAgIGV4YW1wbGUgYG0xKG0yKG0zKHQxKSkpYCBpcyBhIHN1YnR5cGUgb2YgYG0xKG0yKHQxKSlgLFxuICAgIGBtMShtMyh0MSlgLCBhbmQgc28gb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lTW9kaWZpZXIoKSB7XG4gICAgICAgIGxldCBtb2QgPSBuZXcgTW9kaWZpZXI7XG4gICAgICAgIHJldHVybiAodGFnKSA9PiB7XG4gICAgICAgICAgICBpZiAodGFnLm1vZGlmaWVkLmluZGV4T2YobW9kKSA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgICAgICAgICByZXR1cm4gTW9kaWZpZXIuZ2V0KHRhZy5iYXNlIHx8IHRhZywgdGFnLm1vZGlmaWVkLmNvbmNhdChtb2QpLnNvcnQoKGEsIGIpID0+IGEuaWQgLSBiLmlkKSk7XG4gICAgICAgIH07XG4gICAgfVxufVxubGV0IG5leHRNb2RpZmllcklEID0gMDtcbmNsYXNzIE1vZGlmaWVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZXMgPSBbXTtcbiAgICAgICAgdGhpcy5pZCA9IG5leHRNb2RpZmllcklEKys7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQoYmFzZSwgbW9kcykge1xuICAgICAgICBpZiAoIW1vZHMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgIGxldCBleGlzdHMgPSBtb2RzWzBdLmluc3RhbmNlcy5maW5kKHQgPT4gdC5iYXNlID09IGJhc2UgJiYgc2FtZUFycmF5KG1vZHMsIHQubW9kaWZpZWQpKTtcbiAgICAgICAgaWYgKGV4aXN0cylcbiAgICAgICAgICAgIHJldHVybiBleGlzdHM7XG4gICAgICAgIGxldCBzZXQgPSBbXSwgdGFnID0gbmV3IFRhZyhzZXQsIGJhc2UsIG1vZHMpO1xuICAgICAgICBmb3IgKGxldCBtIG9mIG1vZHMpXG4gICAgICAgICAgICBtLmluc3RhbmNlcy5wdXNoKHRhZyk7XG4gICAgICAgIGxldCBjb25maWdzID0gcG93ZXJTZXQobW9kcyk7XG4gICAgICAgIGZvciAobGV0IHBhcmVudCBvZiBiYXNlLnNldClcbiAgICAgICAgICAgIGlmICghcGFyZW50Lm1vZGlmaWVkLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb25maWcgb2YgY29uZmlncylcbiAgICAgICAgICAgICAgICAgICAgc2V0LnB1c2goTW9kaWZpZXIuZ2V0KHBhcmVudCwgY29uZmlnKSk7XG4gICAgICAgIHJldHVybiB0YWc7XG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZUFycmF5KGEsIGIpIHtcbiAgICByZXR1cm4gYS5sZW5ndGggPT0gYi5sZW5ndGggJiYgYS5ldmVyeSgoeCwgaSkgPT4geCA9PSBiW2ldKTtcbn1cbmZ1bmN0aW9uIHBvd2VyU2V0KGFycmF5KSB7XG4gICAgbGV0IHNldHMgPSBbW11dO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGUgPSBzZXRzLmxlbmd0aDsgaiA8IGU7IGorKykge1xuICAgICAgICAgICAgc2V0cy5wdXNoKHNldHNbal0uY29uY2F0KGFycmF5W2ldKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNldHMuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aCk7XG59XG4vKipcblRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgYSBzZXQgb2YgdGFncyB0byBhIGxhbmd1YWdlIHN5bnRheFxudmlhIFtgTm9kZVNldC5leHRlbmRgXSgjY29tbW9uLk5vZGVTZXQuZXh0ZW5kKSBvclxuW2BMUlBhcnNlci5jb25maWd1cmVgXSgjbHIuTFJQYXJzZXIuY29uZmlndXJlKS5cblxuVGhlIGFyZ3VtZW50IG9iamVjdCBtYXBzIG5vZGUgc2VsZWN0b3JzIHRvIFtoaWdobGlnaHRpbmdcbnRhZ3NdKCNoaWdobGlnaHQuVGFnKSBvciBhcnJheXMgb2YgdGFncy5cblxuTm9kZSBzZWxlY3RvcnMgbWF5IGhvbGQgb25lIG9yIG1vcmUgKHNwYWNlLXNlcGFyYXRlZCkgbm9kZSBwYXRocy5cblN1Y2ggYSBwYXRoIGNhbiBiZSBhIFtub2RlIG5hbWVdKCNjb21tb24uTm9kZVR5cGUubmFtZSksIG9yXG5tdWx0aXBsZSBub2RlIG5hbWVzIChvciBgKmAgd2lsZGNhcmRzKSBzZXBhcmF0ZWQgYnkgc2xhc2hcbmNoYXJhY3RlcnMsIGFzIGluIGBcIkJsb2NrL0RlY2xhcmF0aW9uL1ZhcmlhYmxlTmFtZVwiYC4gU3VjaCBhIHBhdGhcbm1hdGNoZXMgdGhlIGZpbmFsIG5vZGUgYnV0IG9ubHkgaWYgaXRzIGRpcmVjdCBwYXJlbnQgbm9kZXMgYXJlIHRoZVxub3RoZXIgbm9kZXMgbWVudGlvbmVkLiBBIGAqYCBpbiBzdWNoIGEgcGF0aCBtYXRjaGVzIGFueSBwYXJlbnQsXG5idXQgb25seSBhIHNpbmdsZSBsZXZlbFx1MjAxNHdpbGRjYXJkcyB0aGF0IG1hdGNoIG11bHRpcGxlIHBhcmVudHNcbmFyZW4ndCBzdXBwb3J0ZWQsIGJvdGggZm9yIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBMZXplclxudHJlZXMgbWFrZSBpdCByYXRoZXIgaGFyZCB0byByZWFzb24gYWJvdXQgd2hhdCB0aGV5IHdvdWxkIG1hdGNoLilcblxuQSBwYXRoIGNhbiBiZSBlbmRlZCB3aXRoIGAvLi4uYCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0YWcgYXNzaWduZWRcbnRvIHRoZSBub2RlIHNob3VsZCBhbHNvIGFwcGx5IHRvIGFsbCBjaGlsZCBub2RlcywgZXZlbiBpZiB0aGV5XG5tYXRjaCB0aGVpciBvd24gc3R5bGUgKGJ5IGRlZmF1bHQsIG9ubHkgdGhlIGlubmVybW9zdCBzdHlsZSBpc1xudXNlZCkuXG5cbldoZW4gYSBwYXRoIGVuZHMgaW4gYCFgLCBhcyBpbiBgQXR0cmlidXRlIWAsIG5vIGZ1cnRoZXIgbWF0Y2hpbmdcbmhhcHBlbnMgZm9yIHRoZSBub2RlJ3MgY2hpbGQgbm9kZXMsIGFuZCB0aGUgZW50aXJlIG5vZGUgZ2V0cyB0aGVcbmdpdmVuIHN0eWxlLlxuXG5JbiB0aGlzIG5vdGF0aW9uLCBub2RlIG5hbWVzIHRoYXQgY29udGFpbiBgL2AsIGAhYCwgYCpgLCBvciBgLi4uYFxubXVzdCBiZSBxdW90ZWQgYXMgSlNPTiBzdHJpbmdzLlxuXG5Gb3IgZXhhbXBsZTpcblxuYGBgamF2YXNjcmlwdFxucGFyc2VyLndpdGhQcm9wcyhcbiAgc3R5bGVUYWdzKHtcbiAgICAvLyBTdHlsZSBOdW1iZXIgYW5kIEJpZ051bWJlciBub2Rlc1xuICAgIFwiTnVtYmVyIEJpZ051bWJlclwiOiB0YWdzLm51bWJlcixcbiAgICAvLyBTdHlsZSBFc2NhcGUgbm9kZXMgd2hvc2UgcGFyZW50IGlzIFN0cmluZ1xuICAgIFwiU3RyaW5nL0VzY2FwZVwiOiB0YWdzLmVzY2FwZSxcbiAgICAvLyBTdHlsZSBhbnl0aGluZyBpbnNpZGUgQXR0cmlidXRlcyBub2Rlc1xuICAgIFwiQXR0cmlidXRlcyFcIjogdGFncy5tZXRhLFxuICAgIC8vIEFkZCBhIHN0eWxlIHRvIGFsbCBjb250ZW50IGluc2lkZSBJdGFsaWMgbm9kZXNcbiAgICBcIkl0YWxpYy8uLi5cIjogdGFncy5lbXBoYXNpcyxcbiAgICAvLyBTdHlsZSBJbnZhbGlkU3RyaW5nIG5vZGVzIGFzIGJvdGggYHN0cmluZ2AgYW5kIGBpbnZhbGlkYFxuICAgIFwiSW52YWxpZFN0cmluZ1wiOiBbdGFncy5zdHJpbmcsIHRhZ3MuaW52YWxpZF0sXG4gICAgLy8gU3R5bGUgdGhlIG5vZGUgbmFtZWQgXCIvXCIgYXMgcHVuY3R1YXRpb25cbiAgICAnXCIvXCInOiB0YWdzLnB1bmN0dWF0aW9uXG4gIH0pXG4pXG5gYGBcbiovXG5mdW5jdGlvbiBzdHlsZVRhZ3Moc3BlYykge1xuICAgIGxldCBieU5hbWUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IHByb3AgaW4gc3BlYykge1xuICAgICAgICBsZXQgdGFncyA9IHNwZWNbcHJvcF07XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0YWdzKSlcbiAgICAgICAgICAgIHRhZ3MgPSBbdGFnc107XG4gICAgICAgIGZvciAobGV0IHBhcnQgb2YgcHJvcC5zcGxpdChcIiBcIikpXG4gICAgICAgICAgICBpZiAocGFydCkge1xuICAgICAgICAgICAgICAgIGxldCBwaWVjZXMgPSBbXSwgbW9kZSA9IDIgLyogTW9kZS5Ob3JtYWwgKi8sIHJlc3QgPSBwYXJ0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBvcyA9IDA7Oykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdCA9PSBcIi4uLlwiICYmIHBvcyA+IDAgJiYgcG9zICsgMyA9PSBwYXJ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IDEgLyogTW9kZS5Jbmhlcml0ICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSAvXlwiKD86W15cIlxcXFxdfFxcXFwuKSo/XCJ8W15cXC8hXSsvLmV4ZWMocmVzdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBwYXRoOiBcIiArIHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICBwaWVjZXMucHVzaChtWzBdID09IFwiKlwiID8gXCJcIiA6IG1bMF1bMF0gPT0gJ1wiJyA/IEpTT04ucGFyc2UobVswXSkgOiBtWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zICs9IG1bMF0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zID09IHBhcnQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gcGFydFtwb3MrK107XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gcGFydC5sZW5ndGggJiYgbmV4dCA9PSBcIiFcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IDAgLyogTW9kZS5PcGFxdWUgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBcIi9cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBwYXRoOiBcIiArIHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICByZXN0ID0gcGFydC5zbGljZShwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IHBpZWNlcy5sZW5ndGggLSAxLCBpbm5lciA9IHBpZWNlc1tsYXN0XTtcbiAgICAgICAgICAgICAgICBpZiAoIWlubmVyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgcGF0aDogXCIgKyBwYXJ0KTtcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IG5ldyBSdWxlKHRhZ3MsIG1vZGUsIGxhc3QgPiAwID8gcGllY2VzLnNsaWNlKDAsIGxhc3QpIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgYnlOYW1lW2lubmVyXSA9IHJ1bGUuc29ydChieU5hbWVbaW5uZXJdKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ1bGVOb2RlUHJvcC5hZGQoYnlOYW1lKTtcbn1cbmNvbnN0IHJ1bGVOb2RlUHJvcCA9IG5ldyBOb2RlUHJvcCgpO1xuY2xhc3MgUnVsZSB7XG4gICAgY29uc3RydWN0b3IodGFncywgbW9kZSwgY29udGV4dCwgbmV4dCkge1xuICAgICAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLm5leHQgPSBuZXh0O1xuICAgIH1cbiAgICBnZXQgb3BhcXVlKCkgeyByZXR1cm4gdGhpcy5tb2RlID09IDAgLyogTW9kZS5PcGFxdWUgKi87IH1cbiAgICBnZXQgaW5oZXJpdCgpIHsgcmV0dXJuIHRoaXMubW9kZSA9PSAxIC8qIE1vZGUuSW5oZXJpdCAqLzsgfVxuICAgIHNvcnQob3RoZXIpIHtcbiAgICAgICAgaWYgKCFvdGhlciB8fCBvdGhlci5kZXB0aCA8IHRoaXMuZGVwdGgpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dCA9IG90aGVyO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgb3RoZXIubmV4dCA9IHRoaXMuc29ydChvdGhlci5uZXh0KTtcbiAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgIH1cbiAgICBnZXQgZGVwdGgoKSB7IHJldHVybiB0aGlzLmNvbnRleHQgPyB0aGlzLmNvbnRleHQubGVuZ3RoIDogMDsgfVxufVxuUnVsZS5lbXB0eSA9IG5ldyBSdWxlKFtdLCAyIC8qIE1vZGUuTm9ybWFsICovLCBudWxsKTtcbi8qKlxuRGVmaW5lIGEgW2hpZ2hsaWdodGVyXSgjaGlnaGxpZ2h0LkhpZ2hsaWdodGVyKSBmcm9tIGFuIGFycmF5IG9mXG50YWcvY2xhc3MgcGFpcnMuIENsYXNzZXMgYXNzb2NpYXRlZCB3aXRoIG1vcmUgc3BlY2lmaWMgdGFncyB3aWxsXG50YWtlIHByZWNlZGVuY2UuXG4qL1xuZnVuY3Rpb24gdGFnSGlnaGxpZ2h0ZXIodGFncywgb3B0aW9ucykge1xuICAgIGxldCBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IHN0eWxlIG9mIHRhZ3MpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN0eWxlLnRhZykpXG4gICAgICAgICAgICBtYXBbc3R5bGUudGFnLmlkXSA9IHN0eWxlLmNsYXNzO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBmb3IgKGxldCB0YWcgb2Ygc3R5bGUudGFnKVxuICAgICAgICAgICAgICAgIG1hcFt0YWcuaWRdID0gc3R5bGUuY2xhc3M7XG4gICAgfVxuICAgIGxldCB7IHNjb3BlLCBhbGwgPSBudWxsIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0eWxlOiAodGFncykgPT4ge1xuICAgICAgICAgICAgbGV0IGNscyA9IGFsbDtcbiAgICAgICAgICAgIGZvciAobGV0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3ViIG9mIHRhZy5zZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ0NsYXNzID0gbWFwW3N1Yi5pZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gY2xzID8gY2xzICsgXCIgXCIgKyB0YWdDbGFzcyA6IHRhZ0NsYXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xzO1xuICAgICAgICB9LFxuICAgICAgICBzY29wZVxuICAgIH07XG59XG5mdW5jdGlvbiBoaWdobGlnaHRUYWdzKGhpZ2hsaWdodGVycywgdGFncykge1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGZvciAobGV0IGhpZ2hsaWdodGVyIG9mIGhpZ2hsaWdodGVycykge1xuICAgICAgICBsZXQgdmFsdWUgPSBoaWdobGlnaHRlci5zdHlsZSh0YWdzKTtcbiAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID8gcmVzdWx0ICsgXCIgXCIgKyB2YWx1ZSA6IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5IaWdobGlnaHQgdGhlIGdpdmVuIFt0cmVlXSgjY29tbW9uLlRyZWUpIHdpdGggdGhlIGdpdmVuXG5baGlnaGxpZ2h0ZXJdKCNoaWdobGlnaHQuSGlnaGxpZ2h0ZXIpLiBPZnRlbiwgdGhlIGhpZ2hlci1sZXZlbFxuW2BoaWdobGlnaHRDb2RlYF0oI2hpZ2hsaWdodC5oaWdobGlnaHRDb2RlKSBmdW5jdGlvbiBpcyBlYXNpZXIgdG9cbnVzZS5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRUcmVlKHRyZWUsIGhpZ2hsaWdodGVyLCBcbi8qKlxuQXNzaWduIHN0eWxpbmcgdG8gYSByZWdpb24gb2YgdGhlIHRleHQuIFdpbGwgYmUgY2FsbGVkLCBpbiBvcmRlclxub2YgcG9zaXRpb24sIGZvciBhbnkgcmFuZ2VzIHdoZXJlIG1vcmUgdGhhbiB6ZXJvIGNsYXNzZXMgYXBwbHkuXG5gY2xhc3Nlc2AgaXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIENTUyBjbGFzc2VzLlxuKi9cbnB1dFN0eWxlLCBcbi8qKlxuVGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBoaWdobGlnaHQuXG4qL1xuZnJvbSA9IDAsIFxuLyoqXG5UaGUgZW5kIG9mIHRoZSByYW5nZS5cbiovXG50byA9IHRyZWUubGVuZ3RoKSB7XG4gICAgbGV0IGJ1aWxkZXIgPSBuZXcgSGlnaGxpZ2h0QnVpbGRlcihmcm9tLCBBcnJheS5pc0FycmF5KGhpZ2hsaWdodGVyKSA/IGhpZ2hsaWdodGVyIDogW2hpZ2hsaWdodGVyXSwgcHV0U3R5bGUpO1xuICAgIGJ1aWxkZXIuaGlnaGxpZ2h0UmFuZ2UodHJlZS5jdXJzb3IoKSwgZnJvbSwgdG8sIFwiXCIsIGJ1aWxkZXIuaGlnaGxpZ2h0ZXJzKTtcbiAgICBidWlsZGVyLmZsdXNoKHRvKTtcbn1cbi8qKlxuSGlnaGxpZ2h0IHRoZSBnaXZlbiB0cmVlIHdpdGggdGhlIGdpdmVuIGhpZ2hsaWdodGVyLCBjYWxsaW5nXG5gcHV0VGV4dGAgZm9yIGV2ZXJ5IHBpZWNlIG9mIHRleHQsIGVpdGhlciB3aXRoIGEgc2V0IG9mIGNsYXNzZXMgb3JcbndpdGggdGhlIGVtcHR5IHN0cmluZyB3aGVuIHVuc3R5bGVkLCBhbmQgYHB1dEJyZWFrYCBmb3IgZXZlcnkgbGluZVxuYnJlYWsuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0Q29kZShjb2RlLCB0cmVlLCBoaWdobGlnaHRlciwgcHV0VGV4dCwgcHV0QnJlYWssIGZyb20gPSAwLCB0byA9IGNvZGUubGVuZ3RoKSB7XG4gICAgbGV0IHBvcyA9IGZyb207XG4gICAgZnVuY3Rpb24gd3JpdGVUbyhwLCBjbGFzc2VzKSB7XG4gICAgICAgIGlmIChwIDw9IHBvcylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZm9yIChsZXQgdGV4dCA9IGNvZGUuc2xpY2UocG9zLCBwKSwgaSA9IDA7Oykge1xuICAgICAgICAgICAgbGV0IG5leHRCcmVhayA9IHRleHQuaW5kZXhPZihcIlxcblwiLCBpKTtcbiAgICAgICAgICAgIGxldCB1cHRvID0gbmV4dEJyZWFrIDwgMCA/IHRleHQubGVuZ3RoIDogbmV4dEJyZWFrO1xuICAgICAgICAgICAgaWYgKHVwdG8gPiBpKVxuICAgICAgICAgICAgICAgIHB1dFRleHQodGV4dC5zbGljZShpLCB1cHRvKSwgY2xhc3Nlcyk7XG4gICAgICAgICAgICBpZiAobmV4dEJyZWFrIDwgMClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHB1dEJyZWFrKCk7XG4gICAgICAgICAgICBpID0gbmV4dEJyZWFrICsgMTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBwO1xuICAgIH1cbiAgICBoaWdobGlnaHRUcmVlKHRyZWUsIGhpZ2hsaWdodGVyLCAoZnJvbSwgdG8sIGNsYXNzZXMpID0+IHtcbiAgICAgICAgd3JpdGVUbyhmcm9tLCBcIlwiKTtcbiAgICAgICAgd3JpdGVUbyh0bywgY2xhc3Nlcyk7XG4gICAgfSwgZnJvbSwgdG8pO1xuICAgIHdyaXRlVG8odG8sIFwiXCIpO1xufVxuY2xhc3MgSGlnaGxpZ2h0QnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoYXQsIGhpZ2hsaWdodGVycywgc3Bhbikge1xuICAgICAgICB0aGlzLmF0ID0gYXQ7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZXJzID0gaGlnaGxpZ2h0ZXJzO1xuICAgICAgICB0aGlzLnNwYW4gPSBzcGFuO1xuICAgICAgICB0aGlzLmNsYXNzID0gXCJcIjtcbiAgICB9XG4gICAgc3RhcnRTcGFuKGF0LCBjbHMpIHtcbiAgICAgICAgaWYgKGNscyAhPSB0aGlzLmNsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoKGF0KTtcbiAgICAgICAgICAgIGlmIChhdCA+IHRoaXMuYXQpXG4gICAgICAgICAgICAgICAgdGhpcy5hdCA9IGF0O1xuICAgICAgICAgICAgdGhpcy5jbGFzcyA9IGNscztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmbHVzaCh0bykge1xuICAgICAgICBpZiAodG8gPiB0aGlzLmF0ICYmIHRoaXMuY2xhc3MpXG4gICAgICAgICAgICB0aGlzLnNwYW4odGhpcy5hdCwgdG8sIHRoaXMuY2xhc3MpO1xuICAgIH1cbiAgICBoaWdobGlnaHRSYW5nZShjdXJzb3IsIGZyb20sIHRvLCBpbmhlcml0ZWRDbGFzcywgaGlnaGxpZ2h0ZXJzKSB7XG4gICAgICAgIGxldCB7IHR5cGUsIGZyb206IHN0YXJ0LCB0bzogZW5kIH0gPSBjdXJzb3I7XG4gICAgICAgIGlmIChzdGFydCA+PSB0byB8fCBlbmQgPD0gZnJvbSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHR5cGUuaXNUb3ApXG4gICAgICAgICAgICBoaWdobGlnaHRlcnMgPSB0aGlzLmhpZ2hsaWdodGVycy5maWx0ZXIoaCA9PiAhaC5zY29wZSB8fCBoLnNjb3BlKHR5cGUpKTtcbiAgICAgICAgbGV0IGNscyA9IGluaGVyaXRlZENsYXNzO1xuICAgICAgICBsZXQgcnVsZSA9IGdldFN0eWxlVGFncyhjdXJzb3IpIHx8IFJ1bGUuZW1wdHk7XG4gICAgICAgIGxldCB0YWdDbHMgPSBoaWdobGlnaHRUYWdzKGhpZ2hsaWdodGVycywgcnVsZS50YWdzKTtcbiAgICAgICAgaWYgKHRhZ0Nscykge1xuICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICBjbHMgKz0gXCIgXCI7XG4gICAgICAgICAgICBjbHMgKz0gdGFnQ2xzO1xuICAgICAgICAgICAgaWYgKHJ1bGUubW9kZSA9PSAxIC8qIE1vZGUuSW5oZXJpdCAqLylcbiAgICAgICAgICAgICAgICBpbmhlcml0ZWRDbGFzcyArPSAoaW5oZXJpdGVkQ2xhc3MgPyBcIiBcIiA6IFwiXCIpICsgdGFnQ2xzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhcnRTcGFuKE1hdGgubWF4KGZyb20sIHN0YXJ0KSwgY2xzKTtcbiAgICAgICAgaWYgKHJ1bGUub3BhcXVlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbW91bnRlZCA9IGN1cnNvci50cmVlICYmIGN1cnNvci50cmVlLnByb3AoTm9kZVByb3AubW91bnRlZCk7XG4gICAgICAgIGlmIChtb3VudGVkICYmIG1vdW50ZWQub3ZlcmxheSkge1xuICAgICAgICAgICAgbGV0IGlubmVyID0gY3Vyc29yLm5vZGUuZW50ZXIobW91bnRlZC5vdmVybGF5WzBdLmZyb20gKyBzdGFydCwgMSk7XG4gICAgICAgICAgICBsZXQgaW5uZXJIaWdobGlnaHRlcnMgPSB0aGlzLmhpZ2hsaWdodGVycy5maWx0ZXIoaCA9PiAhaC5zY29wZSB8fCBoLnNjb3BlKG1vdW50ZWQudHJlZS50eXBlKSk7XG4gICAgICAgICAgICBsZXQgaGFzQ2hpbGQgPSBjdXJzb3IuZmlyc3RDaGlsZCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IHN0YXJ0OzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBpIDwgbW91bnRlZC5vdmVybGF5Lmxlbmd0aCA/IG1vdW50ZWQub3ZlcmxheVtpXSA6IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRQb3MgPSBuZXh0ID8gbmV4dC5mcm9tICsgc3RhcnQgOiBlbmQ7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlRnJvbSA9IE1hdGgubWF4KGZyb20sIHBvcyksIHJhbmdlVG8gPSBNYXRoLm1pbih0bywgbmV4dFBvcyk7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlRnJvbSA8IHJhbmdlVG8gJiYgaGFzQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5mcm9tIDwgcmFuZ2VUbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRSYW5nZShjdXJzb3IsIHJhbmdlRnJvbSwgcmFuZ2VUbywgaW5oZXJpdGVkQ2xhc3MsIGhpZ2hsaWdodGVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1pbihyYW5nZVRvLCBjdXJzb3IudG8pLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci50byA+PSBuZXh0UG9zIHx8ICFjdXJzb3IubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW5leHQgfHwgbmV4dFBvcyA+IHRvKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBwb3MgPSBuZXh0LnRvICsgc3RhcnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRSYW5nZShpbm5lci5jdXJzb3IoKSwgTWF0aC5tYXgoZnJvbSwgbmV4dC5mcm9tICsgc3RhcnQpLCBNYXRoLm1pbih0bywgcG9zKSwgXCJcIiwgaW5uZXJIaWdobGlnaHRlcnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1pbih0bywgcG9zKSwgY2xzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzQ2hpbGQpXG4gICAgICAgICAgICAgICAgY3Vyc29yLnBhcmVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1cnNvci5maXJzdENoaWxkKCkpIHtcbiAgICAgICAgICAgIGlmIChtb3VudGVkKVxuICAgICAgICAgICAgICAgIGluaGVyaXRlZENsYXNzID0gXCJcIjtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLnRvIDw9IGZyb20pXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZnJvbSA+PSB0bylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRSYW5nZShjdXJzb3IsIGZyb20sIHRvLCBpbmhlcml0ZWRDbGFzcywgaGlnaGxpZ2h0ZXJzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1pbih0bywgY3Vyc29yLnRvKSwgY2xzKTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGN1cnNvci5uZXh0U2libGluZygpKTtcbiAgICAgICAgICAgIGN1cnNvci5wYXJlbnQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuTWF0Y2ggYSBzeW50YXggbm9kZSdzIFtoaWdobGlnaHQgcnVsZXNdKCNoaWdobGlnaHQuc3R5bGVUYWdzKS4gSWZcbnRoZXJlJ3MgYSBtYXRjaCwgcmV0dXJuIGl0cyBzZXQgb2YgdGFncywgYW5kIHdoZXRoZXIgaXQgaXNcbm9wYXF1ZSAodXNlcyBhIGAhYCkgb3IgYXBwbGllcyB0byBhbGwgY2hpbGQgbm9kZXMgKGAvLi4uYCkuXG4qL1xuZnVuY3Rpb24gZ2V0U3R5bGVUYWdzKG5vZGUpIHtcbiAgICBsZXQgcnVsZSA9IG5vZGUudHlwZS5wcm9wKHJ1bGVOb2RlUHJvcCk7XG4gICAgd2hpbGUgKHJ1bGUgJiYgcnVsZS5jb250ZXh0ICYmICFub2RlLm1hdGNoQ29udGV4dChydWxlLmNvbnRleHQpKVxuICAgICAgICBydWxlID0gcnVsZS5uZXh0O1xuICAgIHJldHVybiBydWxlIHx8IG51bGw7XG59XG5jb25zdCB0ID0gVGFnLmRlZmluZTtcbmNvbnN0IGNvbW1lbnQgPSB0KCksIG5hbWUgPSB0KCksIHR5cGVOYW1lID0gdChuYW1lKSwgcHJvcGVydHlOYW1lID0gdChuYW1lKSwgbGl0ZXJhbCA9IHQoKSwgc3RyaW5nID0gdChsaXRlcmFsKSwgbnVtYmVyID0gdChsaXRlcmFsKSwgY29udGVudCA9IHQoKSwgaGVhZGluZyA9IHQoY29udGVudCksIGtleXdvcmQgPSB0KCksIG9wZXJhdG9yID0gdCgpLCBwdW5jdHVhdGlvbiA9IHQoKSwgYnJhY2tldCA9IHQocHVuY3R1YXRpb24pLCBtZXRhID0gdCgpO1xuLyoqXG5UaGUgZGVmYXVsdCBzZXQgb2YgaGlnaGxpZ2h0aW5nIFt0YWdzXSgjaGlnaGxpZ2h0LlRhZykuXG5cblRoaXMgY29sbGVjdGlvbiBpcyBoZWF2aWx5IGJpYXNlZCB0b3dhcmRzIHByb2dyYW1taW5nIGxhbmd1YWdlcyxcbmFuZCBuZWNlc3NhcmlseSBpbmNvbXBsZXRlLiBBIGZ1bGwgb250b2xvZ3kgb2Ygc3ludGFjdGljXG5jb25zdHJ1Y3RzIHdvdWxkIGZpbGwgYSBzdGFjayBvZiBib29rcywgYW5kIGJlIGltcHJhY3RpY2FsIHRvXG53cml0ZSB0aGVtZXMgZm9yLiBTbyB0cnkgdG8gbWFrZSBkbyB3aXRoIHRoaXMgc2V0LiBJZiBhbGwgZWxzZVxuZmFpbHMsIFtvcGVuIGFuXG5pc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvci5uZXh0KSB0byBwcm9wb3NlIGFcbm5ldyB0YWcsIG9yIFtkZWZpbmVdKCNoaWdobGlnaHQuVGFnXmRlZmluZSkgYSBsb2NhbCBjdXN0b20gdGFnIGZvclxueW91ciB1c2UgY2FzZS5cblxuTm90ZSB0aGF0IGl0IGlzIG5vdCBvYmxpZ2F0b3J5IHRvIGFsd2F5cyBhdHRhY2ggdGhlIG1vc3Qgc3BlY2lmaWNcbnRhZyBwb3NzaWJsZSB0byBhbiBlbGVtZW50XHUyMDE0aWYgeW91ciBncmFtbWFyIGNhbid0IGVhc2lseVxuZGlzdGluZ3Vpc2ggYSBjZXJ0YWluIHR5cGUgb2YgZWxlbWVudCAoc3VjaCBhcyBhIGxvY2FsIHZhcmlhYmxlKSxcbml0IGlzIG9rYXkgdG8gc3R5bGUgaXQgYXMgaXRzIG1vcmUgZ2VuZXJhbCB2YXJpYW50IChhIHZhcmlhYmxlKS5cblxuRm9yIHRhZ3MgdGhhdCBleHRlbmQgc29tZSBwYXJlbnQgdGFnLCB0aGUgZG9jdW1lbnRhdGlvbiBsaW5rcyB0b1xudGhlIHBhcmVudC5cbiovXG5jb25zdCB0YWdzID0ge1xuICAgIC8qKlxuICAgIEEgY29tbWVudC5cbiAgICAqL1xuICAgIGNvbW1lbnQsXG4gICAgLyoqXG4gICAgQSBsaW5lIFtjb21tZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudCkuXG4gICAgKi9cbiAgICBsaW5lQ29tbWVudDogdChjb21tZW50KSxcbiAgICAvKipcbiAgICBBIGJsb2NrIFtjb21tZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudCkuXG4gICAgKi9cbiAgICBibG9ja0NvbW1lbnQ6IHQoY29tbWVudCksXG4gICAgLyoqXG4gICAgQSBkb2N1bWVudGF0aW9uIFtjb21tZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudCkuXG4gICAgKi9cbiAgICBkb2NDb21tZW50OiB0KGNvbW1lbnQpLFxuICAgIC8qKlxuICAgIEFueSBraW5kIG9mIGlkZW50aWZpZXIuXG4gICAgKi9cbiAgICBuYW1lLFxuICAgIC8qKlxuICAgIFRoZSBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpIG9mIGEgdmFyaWFibGUuXG4gICAgKi9cbiAgICB2YXJpYWJsZU5hbWU6IHQobmFtZSksXG4gICAgLyoqXG4gICAgQSB0eXBlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkuXG4gICAgKi9cbiAgICB0eXBlTmFtZTogdHlwZU5hbWUsXG4gICAgLyoqXG4gICAgQSB0YWcgbmFtZSAoc3VidGFnIG9mIFtgdHlwZU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MudHlwZU5hbWUpKS5cbiAgICAqL1xuICAgIHRhZ05hbWU6IHQodHlwZU5hbWUpLFxuICAgIC8qKlxuICAgIEEgcHJvcGVydHkgb3IgZmllbGQgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKS5cbiAgICAqL1xuICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgIC8qKlxuICAgIEFuIGF0dHJpYnV0ZSBuYW1lIChzdWJ0YWcgb2YgW2Bwcm9wZXJ0eU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MucHJvcGVydHlOYW1lKSkuXG4gICAgKi9cbiAgICBhdHRyaWJ1dGVOYW1lOiB0KHByb3BlcnR5TmFtZSksXG4gICAgLyoqXG4gICAgVGhlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkgb2YgYSBjbGFzcy5cbiAgICAqL1xuICAgIGNsYXNzTmFtZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBBIGxhYmVsIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkuXG4gICAgKi9cbiAgICBsYWJlbE5hbWU6IHQobmFtZSksXG4gICAgLyoqXG4gICAgQSBuYW1lc3BhY2UgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKS5cbiAgICAqL1xuICAgIG5hbWVzcGFjZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBUaGUgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKSBvZiBhIG1hY3JvLlxuICAgICovXG4gICAgbWFjcm9OYW1lOiB0KG5hbWUpLFxuICAgIC8qKlxuICAgIEEgbGl0ZXJhbCB2YWx1ZS5cbiAgICAqL1xuICAgIGxpdGVyYWwsXG4gICAgLyoqXG4gICAgQSBzdHJpbmcgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIHN0cmluZyxcbiAgICAvKipcbiAgICBBIGRvY3VtZW50YXRpb24gW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykuXG4gICAgKi9cbiAgICBkb2NTdHJpbmc6IHQoc3RyaW5nKSxcbiAgICAvKipcbiAgICBBIGNoYXJhY3RlciBsaXRlcmFsIChzdWJ0YWcgb2YgW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykpLlxuICAgICovXG4gICAgY2hhcmFjdGVyOiB0KHN0cmluZyksXG4gICAgLyoqXG4gICAgQW4gYXR0cmlidXRlIHZhbHVlIChzdWJ0YWcgb2YgW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykpLlxuICAgICovXG4gICAgYXR0cmlidXRlVmFsdWU6IHQoc3RyaW5nKSxcbiAgICAvKipcbiAgICBBIG51bWJlciBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgbnVtYmVyLFxuICAgIC8qKlxuICAgIEFuIGludGVnZXIgW251bWJlcl0oI2hpZ2hsaWdodC50YWdzLm51bWJlcikgbGl0ZXJhbC5cbiAgICAqL1xuICAgIGludGVnZXI6IHQobnVtYmVyKSxcbiAgICAvKipcbiAgICBBIGZsb2F0aW5nLXBvaW50IFtudW1iZXJdKCNoaWdobGlnaHQudGFncy5udW1iZXIpIGxpdGVyYWwuXG4gICAgKi9cbiAgICBmbG9hdDogdChudW1iZXIpLFxuICAgIC8qKlxuICAgIEEgYm9vbGVhbiBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgYm9vbDogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBSZWd1bGFyIGV4cHJlc3Npb24gW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIHJlZ2V4cDogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBBbiBlc2NhcGUgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKSwgZm9yIGV4YW1wbGUgYVxuICAgIGJhY2tzbGFzaCBlc2NhcGUgaW4gYSBzdHJpbmcuXG4gICAgKi9cbiAgICBlc2NhcGU6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgQSBjb2xvciBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgY29sb3I6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgQSBVUkwgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIHVybDogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBBIGxhbmd1YWdlIGtleXdvcmQuXG4gICAgKi9cbiAgICBrZXl3b3JkLFxuICAgIC8qKlxuICAgIFRoZSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIGZvciB0aGUgc2VsZiBvciB0aGlzXG4gICAgb2JqZWN0LlxuICAgICovXG4gICAgc2VsZjogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBUaGUgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSBmb3IgbnVsbC5cbiAgICAqL1xuICAgIG51bGw6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIGRlbm90aW5nIHNvbWUgYXRvbWljIHZhbHVlLlxuICAgICovXG4gICAgYXRvbTogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgdGhhdCByZXByZXNlbnRzIGEgdW5pdC5cbiAgICAqL1xuICAgIHVuaXQ6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBtb2RpZmllciBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpLlxuICAgICovXG4gICAgbW9kaWZpZXI6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIHRoYXQgYWN0cyBhcyBhbiBvcGVyYXRvci5cbiAgICAqL1xuICAgIG9wZXJhdG9yS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIGNvbnRyb2wtZmxvdyByZWxhdGVkIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkuXG4gICAgKi9cbiAgICBjb250cm9sS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgdGhhdCBkZWZpbmVzIHNvbWV0aGluZy5cbiAgICAqL1xuICAgIGRlZmluaXRpb25LZXl3b3JkOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSByZWxhdGVkIHRvIGRlZmluaW5nIG9yXG4gICAgaW50ZXJmYWNpbmcgd2l0aCBtb2R1bGVzLlxuICAgICovXG4gICAgbW9kdWxlS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBbiBvcGVyYXRvci5cbiAgICAqL1xuICAgIG9wZXJhdG9yLFxuICAgIC8qKlxuICAgIEFuIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKSB0aGF0IGRlcmVmZXJlbmNlcyBzb21ldGhpbmcuXG4gICAgKi9cbiAgICBkZXJlZk9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBBcml0aG1ldGljLXJlbGF0ZWQgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgYXJpdGhtZXRpY09wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBMb2dpY2FsIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIGxvZ2ljT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIEJpdCBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICBiaXR3aXNlT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIENvbXBhcmlzb24gW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgY29tcGFyZU9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBbT3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikgdGhhdCB1cGRhdGVzIGl0cyBvcGVyYW5kLlxuICAgICovXG4gICAgdXBkYXRlT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIFtPcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKSB0aGF0IGRlZmluZXMgc29tZXRoaW5nLlxuICAgICovXG4gICAgZGVmaW5pdGlvbk9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBUeXBlLXJlbGF0ZWQgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgdHlwZU9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBDb250cm9sLWZsb3cgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgY29udHJvbE9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBQcm9ncmFtIG9yIG1hcmt1cCBwdW5jdHVhdGlvbi5cbiAgICAqL1xuICAgIHB1bmN0dWF0aW9uLFxuICAgIC8qKlxuICAgIFtQdW5jdHVhdGlvbl0oI2hpZ2hsaWdodC50YWdzLnB1bmN0dWF0aW9uKSB0aGF0IHNlcGFyYXRlc1xuICAgIHRoaW5ncy5cbiAgICAqL1xuICAgIHNlcGFyYXRvcjogdChwdW5jdHVhdGlvbiksXG4gICAgLyoqXG4gICAgQnJhY2tldC1zdHlsZSBbcHVuY3R1YXRpb25dKCNoaWdobGlnaHQudGFncy5wdW5jdHVhdGlvbikuXG4gICAgKi9cbiAgICBicmFja2V0LFxuICAgIC8qKlxuICAgIEFuZ2xlIFticmFja2V0c10oI2hpZ2hsaWdodC50YWdzLmJyYWNrZXQpICh1c3VhbGx5IGA8YCBhbmQgYD5gXG4gICAgdG9rZW5zKS5cbiAgICAqL1xuICAgIGFuZ2xlQnJhY2tldDogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBTcXVhcmUgW2JyYWNrZXRzXSgjaGlnaGxpZ2h0LnRhZ3MuYnJhY2tldCkgKHVzdWFsbHkgYFtgIGFuZCBgXWBcbiAgICB0b2tlbnMpLlxuICAgICovXG4gICAgc3F1YXJlQnJhY2tldDogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBQYXJlbnRoZXNlcyAodXN1YWxseSBgKGAgYW5kIGApYCB0b2tlbnMpLiBTdWJ0YWcgb2ZcbiAgICBbYnJhY2tldF0oI2hpZ2hsaWdodC50YWdzLmJyYWNrZXQpLlxuICAgICovXG4gICAgcGFyZW46IHQoYnJhY2tldCksXG4gICAgLyoqXG4gICAgQnJhY2VzICh1c3VhbGx5IGB7YCBhbmQgYH1gIHRva2VucykuIFN1YnRhZyBvZlxuICAgIFticmFja2V0XSgjaGlnaGxpZ2h0LnRhZ3MuYnJhY2tldCkuXG4gICAgKi9cbiAgICBicmFjZTogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBDb250ZW50LCBmb3IgZXhhbXBsZSBwbGFpbiB0ZXh0IGluIFhNTCBvciBtYXJrdXAgZG9jdW1lbnRzLlxuICAgICovXG4gICAgY29udGVudCxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgcmVwcmVzZW50cyBhIGhlYWRpbmcuXG4gICAgKi9cbiAgICBoZWFkaW5nLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgMSBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzE6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCAyIFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nMjogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDMgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmczOiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgNCBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzQ6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCA1IFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nNTogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDYgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmc2OiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgcHJvc2Ugc2VwYXJhdG9yIChzdWNoIGFzIGEgaG9yaXpvbnRhbCBydWxlKS5cbiAgICAqL1xuICAgIGNvbnRlbnRTZXBhcmF0b3I6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IHJlcHJlc2VudHMgYSBsaXN0LlxuICAgICovXG4gICAgbGlzdDogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgcmVwcmVzZW50cyBhIHF1b3RlLlxuICAgICovXG4gICAgcXVvdGU6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IGlzIGVtcGhhc2l6ZWQuXG4gICAgKi9cbiAgICBlbXBoYXNpczogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaXMgc3R5bGVkIHN0cm9uZy5cbiAgICAqL1xuICAgIHN0cm9uZzogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaXMgcGFydCBvZiBhIGxpbmsuXG4gICAgKi9cbiAgICBsaW5rOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBpcyBzdHlsZWQgYXMgY29kZSBvclxuICAgIG1vbm9zcGFjZS5cbiAgICAqL1xuICAgIG1vbm9zcGFjZTogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaGFzIGEgc3RyaWtlLXRocm91Z2hcbiAgICBzdHlsZS5cbiAgICAqL1xuICAgIHN0cmlrZXRocm91Z2g6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgSW5zZXJ0ZWQgdGV4dCBpbiBhIGNoYW5nZS10cmFja2luZyBmb3JtYXQuXG4gICAgKi9cbiAgICBpbnNlcnRlZDogdCgpLFxuICAgIC8qKlxuICAgIERlbGV0ZWQgdGV4dC5cbiAgICAqL1xuICAgIGRlbGV0ZWQ6IHQoKSxcbiAgICAvKipcbiAgICBDaGFuZ2VkIHRleHQuXG4gICAgKi9cbiAgICBjaGFuZ2VkOiB0KCksXG4gICAgLyoqXG4gICAgQW4gaW52YWxpZCBvciB1bnN5bnRhY3RpYyBlbGVtZW50LlxuICAgICovXG4gICAgaW52YWxpZDogdCgpLFxuICAgIC8qKlxuICAgIE1ldGFkYXRhIG9yIG1ldGEtaW5zdHJ1Y3Rpb24uXG4gICAgKi9cbiAgICBtZXRhLFxuICAgIC8qKlxuICAgIFtNZXRhZGF0YV0oI2hpZ2hsaWdodC50YWdzLm1ldGEpIHRoYXQgYXBwbGllcyB0byB0aGUgZW50aXJlXG4gICAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBkb2N1bWVudE1ldGE6IHQobWV0YSksXG4gICAgLyoqXG4gICAgW01ldGFkYXRhXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSkgdGhhdCBhbm5vdGF0ZXMgb3IgYWRkc1xuICAgIGF0dHJpYnV0ZXMgdG8gYSBnaXZlbiBzeW50YWN0aWMgZWxlbWVudC5cbiAgICAqL1xuICAgIGFubm90YXRpb246IHQobWV0YSksXG4gICAgLyoqXG4gICAgUHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBvciBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlLiBTdWJ0YWcgb2ZcbiAgICBbbWV0YV0oI2hpZ2hsaWdodC50YWdzLm1ldGEpLlxuICAgICovXG4gICAgcHJvY2Vzc2luZ0luc3RydWN0aW9uOiB0KG1ldGEpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXQgaW5kaWNhdGVzIHRoYXQgYVxuICAgIGdpdmVuIGVsZW1lbnQgaXMgYmVpbmcgZGVmaW5lZC4gRXhwZWN0ZWQgdG8gYmUgdXNlZCB3aXRoIHRoZVxuICAgIHZhcmlvdXMgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKSB0YWdzLlxuICAgICovXG4gICAgZGVmaW5pdGlvbjogVGFnLmRlZmluZU1vZGlmaWVyKCksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdCBpbmRpY2F0ZXMgdGhhdFxuICAgIHNvbWV0aGluZyBpcyBjb25zdGFudC4gTW9zdGx5IGV4cGVjdGVkIHRvIGJlIHVzZWQgd2l0aFxuICAgIFt2YXJpYWJsZSBuYW1lc10oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSkuXG4gICAgKi9cbiAgICBjb25zdGFudDogVGFnLmRlZmluZU1vZGlmaWVyKCksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdXNlZCB0byBpbmRpY2F0ZSB0aGF0XG4gICAgYSBbdmFyaWFibGVdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpIG9yIFtwcm9wZXJ0eVxuICAgIG5hbWVdKCNoaWdobGlnaHQudGFncy5wcm9wZXJ0eU5hbWUpIGlzIGJlaW5nIGNhbGxlZCBvciBkZWZpbmVkXG4gICAgYXMgYSBmdW5jdGlvbi5cbiAgICAqL1xuICAgIGZ1bmN0aW9uOiBUYWcuZGVmaW5lTW9kaWZpZXIoKSxcbiAgICAvKipcbiAgICBbTW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvXG4gICAgW25hbWVzXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkgdG8gaW5kaWNhdGUgdGhhdCB0aGV5IGJlbG9uZyB0b1xuICAgIHRoZSBsYW5ndWFnZSdzIHN0YW5kYXJkIGVudmlyb25tZW50LlxuICAgICovXG4gICAgc3RhbmRhcmQ6IFRhZy5kZWZpbmVNb2RpZmllcigpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXQgaW5kaWNhdGVzIGEgZ2l2ZW5cbiAgICBbbmFtZXNdKCNoaWdobGlnaHQudGFncy5uYW1lKSBpcyBsb2NhbCB0byBzb21lIHNjb3BlLlxuICAgICovXG4gICAgbG9jYWw6IFRhZy5kZWZpbmVNb2RpZmllcigpLFxuICAgIC8qKlxuICAgIEEgZ2VuZXJpYyB2YXJpYW50IFttb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXRcbiAgICBjYW4gYmUgdXNlZCB0byB0YWcgbGFuZ3VhZ2Utc3BlY2lmaWMgYWx0ZXJuYXRpdmUgdmFyaWFudHMgb2ZcbiAgICBzb21lIGNvbW1vbiB0YWcuIEl0IGlzIHJlY29tbWVuZGVkIGZvciB0aGVtZXMgdG8gZGVmaW5lIHNwZWNpYWxcbiAgICBmb3JtcyBvZiBhdCBsZWFzdCB0aGUgW3N0cmluZ10oI2hpZ2hsaWdodC50YWdzLnN0cmluZykgYW5kXG4gICAgW3ZhcmlhYmxlIG5hbWVdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpIHRhZ3MsIHNpbmNlIHRob3NlXG4gICAgY29tZSB1cCBhIGxvdC5cbiAgICAqL1xuICAgIHNwZWNpYWw6IFRhZy5kZWZpbmVNb2RpZmllcigpXG59O1xuLyoqXG5UaGlzIGlzIGEgaGlnaGxpZ2h0ZXIgdGhhdCBhZGRzIHN0YWJsZSwgcHJlZGljdGFibGUgY2xhc3NlcyB0b1xudG9rZW5zLCBmb3Igc3R5bGluZyB3aXRoIGV4dGVybmFsIENTUy5cblxuVGhlIGZvbGxvd2luZyB0YWdzIGFyZSBtYXBwZWQgdG8gdGhlaXIgbmFtZSBwcmVmaXhlZCB3aXRoIGBcInRvay1cImBcbihmb3IgZXhhbXBsZSBgXCJ0b2stY29tbWVudFwiYCk6XG5cbiogW2BsaW5rYF0oI2hpZ2hsaWdodC50YWdzLmxpbmspXG4qIFtgaGVhZGluZ2BdKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKVxuKiBbYGVtcGhhc2lzYF0oI2hpZ2hsaWdodC50YWdzLmVtcGhhc2lzKVxuKiBbYHN0cm9uZ2BdKCNoaWdobGlnaHQudGFncy5zdHJvbmcpXG4qIFtga2V5d29yZGBdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKVxuKiBbYGF0b21gXSgjaGlnaGxpZ2h0LnRhZ3MuYXRvbSlcbiogW2Bib29sYF0oI2hpZ2hsaWdodC50YWdzLmJvb2wpXG4qIFtgdXJsYF0oI2hpZ2hsaWdodC50YWdzLnVybClcbiogW2BsYWJlbE5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MubGFiZWxOYW1lKVxuKiBbYGluc2VydGVkYF0oI2hpZ2hsaWdodC50YWdzLmluc2VydGVkKVxuKiBbYGRlbGV0ZWRgXSgjaGlnaGxpZ2h0LnRhZ3MuZGVsZXRlZClcbiogW2BsaXRlcmFsYF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpXG4qIFtgc3RyaW5nYF0oI2hpZ2hsaWdodC50YWdzLnN0cmluZylcbiogW2BudW1iZXJgXSgjaGlnaGxpZ2h0LnRhZ3MubnVtYmVyKVxuKiBbYHZhcmlhYmxlTmFtZWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4qIFtgdHlwZU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MudHlwZU5hbWUpXG4qIFtgbmFtZXNwYWNlYF0oI2hpZ2hsaWdodC50YWdzLm5hbWVzcGFjZSlcbiogW2BjbGFzc05hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MuY2xhc3NOYW1lKVxuKiBbYG1hY3JvTmFtZWBdKCNoaWdobGlnaHQudGFncy5tYWNyb05hbWUpXG4qIFtgcHJvcGVydHlOYW1lYF0oI2hpZ2hsaWdodC50YWdzLnByb3BlcnR5TmFtZSlcbiogW2BvcGVyYXRvcmBdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcilcbiogW2Bjb21tZW50YF0oI2hpZ2hsaWdodC50YWdzLmNvbW1lbnQpXG4qIFtgbWV0YWBdKCNoaWdobGlnaHQudGFncy5tZXRhKVxuKiBbYHB1bmN0dWF0aW9uYF0oI2hpZ2hsaWdodC50YWdzLnB1bmN0dWF0aW9uKVxuKiBbYGludmFsaWRgXSgjaGlnaGxpZ2h0LnRhZ3MuaW52YWxpZClcblxuSW4gYWRkaXRpb24sIHRoZXNlIG1hcHBpbmdzIGFyZSBwcm92aWRlZDpcblxuKiBbYHJlZ2V4cGBdKCNoaWdobGlnaHQudGFncy5yZWdleHApLFxuICBbYGVzY2FwZWBdKCNoaWdobGlnaHQudGFncy5lc2NhcGUpLCBhbmRcbiAgW2BzcGVjaWFsYF0oI2hpZ2hsaWdodC50YWdzLnNwZWNpYWwpW2Aoc3RyaW5nKWBdKCNoaWdobGlnaHQudGFncy5zdHJpbmcpXG4gIGFyZSBtYXBwZWQgdG8gYFwidG9rLXN0cmluZzJcImBcbiogW2BzcGVjaWFsYF0oI2hpZ2hsaWdodC50YWdzLnNwZWNpYWwpW2AodmFyaWFibGVOYW1lKWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4gIHRvIGBcInRvay12YXJpYWJsZU5hbWUyXCJgXG4qIFtgbG9jYWxgXSgjaGlnaGxpZ2h0LnRhZ3MubG9jYWwpW2AodmFyaWFibGVOYW1lKWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4gIHRvIGBcInRvay12YXJpYWJsZU5hbWUgdG9rLWxvY2FsXCJgXG4qIFtgZGVmaW5pdGlvbmBdKCNoaWdobGlnaHQudGFncy5kZWZpbml0aW9uKVtgKHZhcmlhYmxlTmFtZSlgXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKVxuICB0byBgXCJ0b2stdmFyaWFibGVOYW1lIHRvay1kZWZpbml0aW9uXCJgXG4qIFtgZGVmaW5pdGlvbmBdKCNoaWdobGlnaHQudGFncy5kZWZpbml0aW9uKVtgKHByb3BlcnR5TmFtZSlgXSgjaGlnaGxpZ2h0LnRhZ3MucHJvcGVydHlOYW1lKVxuICB0byBgXCJ0b2stcHJvcGVydHlOYW1lIHRvay1kZWZpbml0aW9uXCJgXG4qL1xuY29uc3QgY2xhc3NIaWdobGlnaHRlciA9IHRhZ0hpZ2hsaWdodGVyKFtcbiAgICB7IHRhZzogdGFncy5saW5rLCBjbGFzczogXCJ0b2stbGlua1wiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaGVhZGluZywgY2xhc3M6IFwidG9rLWhlYWRpbmdcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmVtcGhhc2lzLCBjbGFzczogXCJ0b2stZW1waGFzaXNcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnN0cm9uZywgY2xhc3M6IFwidG9rLXN0cm9uZ1wiIH0sXG4gICAgeyB0YWc6IHRhZ3Mua2V5d29yZCwgY2xhc3M6IFwidG9rLWtleXdvcmRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmF0b20sIGNsYXNzOiBcInRvay1hdG9tXCIgfSxcbiAgICB7IHRhZzogdGFncy5ib29sLCBjbGFzczogXCJ0b2stYm9vbFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MudXJsLCBjbGFzczogXCJ0b2stdXJsXCIgfSxcbiAgICB7IHRhZzogdGFncy5sYWJlbE5hbWUsIGNsYXNzOiBcInRvay1sYWJlbE5hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmluc2VydGVkLCBjbGFzczogXCJ0b2staW5zZXJ0ZWRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmRlbGV0ZWQsIGNsYXNzOiBcInRvay1kZWxldGVkXCIgfSxcbiAgICB7IHRhZzogdGFncy5saXRlcmFsLCBjbGFzczogXCJ0b2stbGl0ZXJhbFwiIH0sXG4gICAgeyB0YWc6IHRhZ3Muc3RyaW5nLCBjbGFzczogXCJ0b2stc3RyaW5nXCIgfSxcbiAgICB7IHRhZzogdGFncy5udW1iZXIsIGNsYXNzOiBcInRvay1udW1iZXJcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5yZWdleHAsIHRhZ3MuZXNjYXBlLCB0YWdzLnNwZWNpYWwodGFncy5zdHJpbmcpXSwgY2xhc3M6IFwidG9rLXN0cmluZzJcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnZhcmlhYmxlTmFtZSwgY2xhc3M6IFwidG9rLXZhcmlhYmxlTmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubG9jYWwodGFncy52YXJpYWJsZU5hbWUpLCBjbGFzczogXCJ0b2stdmFyaWFibGVOYW1lIHRvay1sb2NhbFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZGVmaW5pdGlvbih0YWdzLnZhcmlhYmxlTmFtZSksIGNsYXNzOiBcInRvay12YXJpYWJsZU5hbWUgdG9rLWRlZmluaXRpb25cIiB9LFxuICAgIHsgdGFnOiB0YWdzLnNwZWNpYWwodGFncy52YXJpYWJsZU5hbWUpLCBjbGFzczogXCJ0b2stdmFyaWFibGVOYW1lMlwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZGVmaW5pdGlvbih0YWdzLnByb3BlcnR5TmFtZSksIGNsYXNzOiBcInRvay1wcm9wZXJ0eU5hbWUgdG9rLWRlZmluaXRpb25cIiB9LFxuICAgIHsgdGFnOiB0YWdzLnR5cGVOYW1lLCBjbGFzczogXCJ0b2stdHlwZU5hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm5hbWVzcGFjZSwgY2xhc3M6IFwidG9rLW5hbWVzcGFjZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuY2xhc3NOYW1lLCBjbGFzczogXCJ0b2stY2xhc3NOYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5tYWNyb05hbWUsIGNsYXNzOiBcInRvay1tYWNyb05hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnByb3BlcnR5TmFtZSwgY2xhc3M6IFwidG9rLXByb3BlcnR5TmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3Mub3BlcmF0b3IsIGNsYXNzOiBcInRvay1vcGVyYXRvclwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuY29tbWVudCwgY2xhc3M6IFwidG9rLWNvbW1lbnRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm1ldGEsIGNsYXNzOiBcInRvay1tZXRhXCIgfSxcbiAgICB7IHRhZzogdGFncy5pbnZhbGlkLCBjbGFzczogXCJ0b2staW52YWxpZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MucHVuY3R1YXRpb24sIGNsYXNzOiBcInRvay1wdW5jdHVhdGlvblwiIH1cbl0pO1xuXG5leHBvcnQgeyBUYWcsIGNsYXNzSGlnaGxpZ2h0ZXIsIGdldFN0eWxlVGFncywgaGlnaGxpZ2h0Q29kZSwgaGlnaGxpZ2h0VHJlZSwgc3R5bGVUYWdzLCB0YWdIaWdobGlnaHRlciwgdGFncyB9O1xuIiwgImltcG9ydCB7IE5vZGVQcm9wLCBJdGVyTW9kZSwgVHJlZSwgVHJlZUZyYWdtZW50LCBQYXJzZXIsIE5vZGVUeXBlLCBOb2RlU2V0IH0gZnJvbSAnQGxlemVyL2NvbW1vbic7XG5pbXBvcnQgeyBTdGF0ZUVmZmVjdCwgU3RhdGVGaWVsZCwgRmFjZXQsIEVkaXRvclN0YXRlLCBjb3VudENvbHVtbiwgY29tYmluZUNvbmZpZywgUmFuZ2VTZXQsIFJhbmdlU2V0QnVpbGRlciwgUHJlYyB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IFZpZXdQbHVnaW4sIGxvZ0V4Y2VwdGlvbiwgRWRpdG9yVmlldywgRGVjb3JhdGlvbiwgV2lkZ2V0VHlwZSwgZ3V0dGVyLCBHdXR0ZXJNYXJrZXIsIERpcmVjdGlvbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xuaW1wb3J0IHsgdGFncywgdGFnSGlnaGxpZ2h0ZXIsIGhpZ2hsaWdodFRyZWUsIHN0eWxlVGFncyB9IGZyb20gJ0BsZXplci9oaWdobGlnaHQnO1xuaW1wb3J0IHsgU3R5bGVNb2R1bGUgfSBmcm9tICdzdHlsZS1tb2QnO1xuXG52YXIgX2E7XG4vKipcbk5vZGUgcHJvcCBzdG9yZWQgaW4gYSBwYXJzZXIncyB0b3Agc3ludGF4IG5vZGUgdG8gcHJvdmlkZSB0aGVcbmZhY2V0IHRoYXQgc3RvcmVzIGxhbmd1YWdlLXNwZWNpZmljIGRhdGEgZm9yIHRoYXQgbGFuZ3VhZ2UuXG4qL1xuY29uc3QgbGFuZ3VhZ2VEYXRhUHJvcCA9IC8qQF9fUFVSRV9fKi9uZXcgTm9kZVByb3AoKTtcbi8qKlxuSGVscGVyIGZ1bmN0aW9uIHRvIGRlZmluZSBhIGZhY2V0ICh0byBiZSBhZGRlZCB0byB0aGUgdG9wIHN5bnRheFxubm9kZShzKSBmb3IgYSBsYW5ndWFnZSB2aWFcbltgbGFuZ3VhZ2VEYXRhUHJvcGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UubGFuZ3VhZ2VEYXRhUHJvcCkpLCB0aGF0IHdpbGwgYmVcbnVzZWQgdG8gYXNzb2NpYXRlIGxhbmd1YWdlIGRhdGEgd2l0aCB0aGUgbGFuZ3VhZ2UuIFlvdVxucHJvYmFibHkgb25seSBuZWVkIHRoaXMgd2hlbiBzdWJjbGFzc2luZ1xuW2BMYW5ndWFnZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2UpLlxuKi9cbmZ1bmN0aW9uIGRlZmluZUxhbmd1YWdlRmFjZXQoYmFzZURhdGEpIHtcbiAgICByZXR1cm4gRmFjZXQuZGVmaW5lKHtcbiAgICAgICAgY29tYmluZTogYmFzZURhdGEgPyB2YWx1ZXMgPT4gdmFsdWVzLmNvbmNhdChiYXNlRGF0YSkgOiB1bmRlZmluZWRcbiAgICB9KTtcbn1cbi8qKlxuU3ludGF4IG5vZGUgcHJvcCB1c2VkIHRvIHJlZ2lzdGVyIHN1Ymxhbmd1YWdlcy4gU2hvdWxkIGJlIGFkZGVkIHRvXG50aGUgdG9wIGxldmVsIG5vZGUgdHlwZSBmb3IgdGhlIGxhbmd1YWdlLlxuKi9cbmNvbnN0IHN1Ymxhbmd1YWdlUHJvcCA9IC8qQF9fUFVSRV9fKi9uZXcgTm9kZVByb3AoKTtcbi8qKlxuQSBsYW5ndWFnZSBvYmplY3QgbWFuYWdlcyBwYXJzaW5nIGFuZCBwZXItbGFuZ3VhZ2VcblttZXRhZGF0YV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGFBdCkuIFBhcnNlIGRhdGEgaXNcbm1hbmFnZWQgYXMgYSBbTGV6ZXJdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQpIHRyZWUuIFRoZSBjbGFzc1xuY2FuIGJlIHVzZWQgZGlyZWN0bHksIHZpYSB0aGUgW2BMUkxhbmd1YWdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MUkxhbmd1YWdlKVxuc3ViY2xhc3MgZm9yIFtMZXplcl0oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC8pIExSIHBhcnNlcnMsIG9yXG52aWEgdGhlIFtgU3RyZWFtTGFuZ3VhZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLlN0cmVhbUxhbmd1YWdlKSBzdWJjbGFzc1xuZm9yIHN0cmVhbSBwYXJzZXJzLlxuKi9cbmNsYXNzIExhbmd1YWdlIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBsYW5ndWFnZSBvYmplY3QuIElmIHlvdSBuZWVkIHRvIGludm9rZSB0aGlzXG4gICAgZGlyZWN0bHksIGZpcnN0IGRlZmluZSBhIGRhdGEgZmFjZXQgd2l0aFxuICAgIFtgZGVmaW5lTGFuZ3VhZ2VGYWNldGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZGVmaW5lTGFuZ3VhZ2VGYWNldCksIGFuZCB0aGVuXG4gICAgY29uZmlndXJlIHlvdXIgcGFyc2VyIHRvIFthdHRhY2hdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UubGFuZ3VhZ2VEYXRhUHJvcCkgaXRcbiAgICB0byB0aGUgbGFuZ3VhZ2UncyBvdXRlciBzeW50YXggbm9kZS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBbbGFuZ3VhZ2UgZGF0YV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGFBdCkgZmFjZXRcbiAgICB1c2VkIGZvciB0aGlzIGxhbmd1YWdlLlxuICAgICovXG4gICAgZGF0YSwgcGFyc2VyLCBleHRyYUV4dGVuc2lvbnMgPSBbXSwgXG4gICAgLyoqXG4gICAgQSBsYW5ndWFnZSBuYW1lLlxuICAgICovXG4gICAgbmFtZSA9IFwiXCIpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgLy8gS2x1ZGdlIHRvIGRlZmluZSBFZGl0b3JTdGF0ZS50cmVlIGFzIGEgZGVidWdnaW5nIGhlbHBlcixcbiAgICAgICAgLy8gd2l0aG91dCB0aGUgRWRpdG9yU3RhdGUgcGFja2FnZSBhY3R1YWxseSBrbm93aW5nIGFib3V0XG4gICAgICAgIC8vIGxhbmd1YWdlcyBhbmQgbGV6ZXIgdHJlZXMuXG4gICAgICAgIGlmICghRWRpdG9yU3RhdGUucHJvdG90eXBlLmhhc093blByb3BlcnR5KFwidHJlZVwiKSlcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFZGl0b3JTdGF0ZS5wcm90b3R5cGUsIFwidHJlZVwiLCB7IGdldCgpIHsgcmV0dXJuIHN5bnRheFRyZWUodGhpcyk7IH0gfSk7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IFtcbiAgICAgICAgICAgIGxhbmd1YWdlLm9mKHRoaXMpLFxuICAgICAgICAgICAgRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhLm9mKChzdGF0ZSwgcG9zLCBzaWRlKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRvcCA9IHRvcE5vZGVBdChzdGF0ZSwgcG9zLCBzaWRlKSwgZGF0YSA9IHRvcC50eXBlLnByb3AobGFuZ3VhZ2VEYXRhUHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgbGV0IGJhc2UgPSBzdGF0ZS5mYWNldChkYXRhKSwgc3ViID0gdG9wLnR5cGUucHJvcChzdWJsYW5ndWFnZVByb3ApO1xuICAgICAgICAgICAgICAgIGlmIChzdWIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlubmVyTm9kZSA9IHRvcC5yZXNvbHZlKHBvcyAtIHRvcC5mcm9tLCBzaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3VibGFuZyBvZiBzdWIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VibGFuZy50ZXN0KGlubmVyTm9kZSwgc3RhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBzdGF0ZS5mYWNldChzdWJsYW5nLmZhY2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VibGFuZy50eXBlID09IFwicmVwbGFjZVwiID8gZGF0YSA6IGRhdGEuY29uY2F0KGJhc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0uY29uY2F0KGV4dHJhRXh0ZW5zaW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFF1ZXJ5IHdoZXRoZXIgdGhpcyBsYW5ndWFnZSBpcyBhY3RpdmUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgaXNBY3RpdmVBdChzdGF0ZSwgcG9zLCBzaWRlID0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRvcE5vZGVBdChzdGF0ZSwgcG9zLCBzaWRlKS50eXBlLnByb3AobGFuZ3VhZ2VEYXRhUHJvcCkgPT0gdGhpcy5kYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBkb2N1bWVudCByZWdpb25zIHRoYXQgd2VyZSBwYXJzZWQgdXNpbmcgdGhpcyBsYW5ndWFnZS5cbiAgICBUaGUgcmV0dXJuZWQgcmVnaW9ucyB3aWxsIF9pbmNsdWRlXyBhbnkgbmVzdGVkIGxhbmd1YWdlcyByb290ZWRcbiAgICBpbiB0aGlzIGxhbmd1YWdlLCB3aGVuIHRob3NlIGV4aXN0LlxuICAgICovXG4gICAgZmluZFJlZ2lvbnMoc3RhdGUpIHtcbiAgICAgICAgbGV0IGxhbmcgPSBzdGF0ZS5mYWNldChsYW5ndWFnZSk7XG4gICAgICAgIGlmICgobGFuZyA9PT0gbnVsbCB8fCBsYW5nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsYW5nLmRhdGEpID09IHRoaXMuZGF0YSlcbiAgICAgICAgICAgIHJldHVybiBbeyBmcm9tOiAwLCB0bzogc3RhdGUuZG9jLmxlbmd0aCB9XTtcbiAgICAgICAgaWYgKCFsYW5nIHx8ICFsYW5nLmFsbG93c05lc3RpbmcpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgbGV0IGV4cGxvcmUgPSAodHJlZSwgZnJvbSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRyZWUucHJvcChsYW5ndWFnZURhdGFQcm9wKSA9PSB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGZyb20sIHRvOiBmcm9tICsgdHJlZS5sZW5ndGggfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG1vdW50ID0gdHJlZS5wcm9wKE5vZGVQcm9wLm1vdW50ZWQpO1xuICAgICAgICAgICAgaWYgKG1vdW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1vdW50LnRyZWUucHJvcChsYW5ndWFnZURhdGFQcm9wKSA9PSB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdW50Lm92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByIG9mIG1vdW50Lm92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBmcm9tOiByLmZyb20gKyBmcm9tLCB0bzogci50byArIGZyb20gfSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgZnJvbTogZnJvbSwgdG86IGZyb20gKyB0cmVlLmxlbmd0aCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtb3VudC5vdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgZXhwbG9yZShtb3VudC50cmVlLCBtb3VudC5vdmVybGF5WzBdLmZyb20gKyBmcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiBzaXplKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJlZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRyZWUuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgaWYgKGNoIGluc3RhbmNlb2YgVHJlZSlcbiAgICAgICAgICAgICAgICAgICAgZXhwbG9yZShjaCwgdHJlZS5wb3NpdGlvbnNbaV0gKyBmcm9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZXhwbG9yZShzeW50YXhUcmVlKHN0YXRlKSwgMCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgbGFuZ3VhZ2UgYWxsb3dzIG5lc3RlZCBsYW5ndWFnZXMuIFRoZVxuICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlLlxuICAgICovXG4gICAgZ2V0IGFsbG93c05lc3RpbmcoKSB7IHJldHVybiB0cnVlOyB9XG59XG4vKipcbkBpbnRlcm5hbFxuKi9cbkxhbmd1YWdlLnNldFN0YXRlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuZnVuY3Rpb24gdG9wTm9kZUF0KHN0YXRlLCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgdG9wTGFuZyA9IHN0YXRlLmZhY2V0KGxhbmd1YWdlKSwgdHJlZSA9IHN5bnRheFRyZWUoc3RhdGUpLnRvcE5vZGU7XG4gICAgaWYgKCF0b3BMYW5nIHx8IHRvcExhbmcuYWxsb3dzTmVzdGluZykge1xuICAgICAgICBmb3IgKGxldCBub2RlID0gdHJlZTsgbm9kZTsgbm9kZSA9IG5vZGUuZW50ZXIocG9zLCBzaWRlLCBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycykpXG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLmlzVG9wKVxuICAgICAgICAgICAgICAgIHRyZWUgPSBub2RlO1xuICAgIH1cbiAgICByZXR1cm4gdHJlZTtcbn1cbi8qKlxuQSBzdWJjbGFzcyBvZiBbYExhbmd1YWdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZSkgZm9yIHVzZSB3aXRoIExlemVyXG5bTFIgcGFyc2Vyc10oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZiNsci5MUlBhcnNlcilcbnBhcnNlcnMuXG4qL1xuY2xhc3MgTFJMYW5ndWFnZSBleHRlbmRzIExhbmd1YWdlIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCBwYXJzZXIsIG5hbWUpIHtcbiAgICAgICAgc3VwZXIoZGF0YSwgcGFyc2VyLCBbXSwgbmFtZSk7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBsYW5ndWFnZSBmcm9tIGEgcGFyc2VyLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShzcGVjKSB7XG4gICAgICAgIGxldCBkYXRhID0gZGVmaW5lTGFuZ3VhZ2VGYWNldChzcGVjLmxhbmd1YWdlRGF0YSk7XG4gICAgICAgIHJldHVybiBuZXcgTFJMYW5ndWFnZShkYXRhLCBzcGVjLnBhcnNlci5jb25maWd1cmUoe1xuICAgICAgICAgICAgcHJvcHM6IFtsYW5ndWFnZURhdGFQcm9wLmFkZCh0eXBlID0+IHR5cGUuaXNUb3AgPyBkYXRhIDogdW5kZWZpbmVkKV1cbiAgICAgICAgfSksIHNwZWMubmFtZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGxhbmd1YWdlIHdpdGggYSByZWNvbmZpZ3VyZWRcbiAgICB2ZXJzaW9uIG9mIGl0cyBwYXJzZXIgYW5kIG9wdGlvbmFsbHkgYSBuZXcgbmFtZS5cbiAgICAqL1xuICAgIGNvbmZpZ3VyZShvcHRpb25zLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgTFJMYW5ndWFnZSh0aGlzLmRhdGEsIHRoaXMucGFyc2VyLmNvbmZpZ3VyZShvcHRpb25zKSwgbmFtZSB8fCB0aGlzLm5hbWUpO1xuICAgIH1cbiAgICBnZXQgYWxsb3dzTmVzdGluZygpIHsgcmV0dXJuIHRoaXMucGFyc2VyLmhhc1dyYXBwZXJzKCk7IH1cbn1cbi8qKlxuR2V0IHRoZSBzeW50YXggdHJlZSBmb3IgYSBzdGF0ZSwgd2hpY2ggaXMgdGhlIGN1cnJlbnQgKHBvc3NpYmx5XG5pbmNvbXBsZXRlKSBwYXJzZSB0cmVlIG9mIHRoZSBhY3RpdmVcbltsYW5ndWFnZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZSksIG9yIHRoZSBlbXB0eSB0cmVlIGlmIHRoZXJlIGlzIG5vXG5sYW5ndWFnZSBhdmFpbGFibGUuXG4qL1xuZnVuY3Rpb24gc3ludGF4VHJlZShzdGF0ZSkge1xuICAgIGxldCBmaWVsZCA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlLCBmYWxzZSk7XG4gICAgcmV0dXJuIGZpZWxkID8gZmllbGQudHJlZSA6IFRyZWUuZW1wdHk7XG59XG4vKipcblRyeSB0byBnZXQgYSBwYXJzZSB0cmVlIHRoYXQgc3BhbnMgYXQgbGVhc3QgdXAgdG8gYHVwdG9gLiBUaGVcbm1ldGhvZCB3aWxsIGRvIGF0IG1vc3QgYHRpbWVvdXRgIG1pbGxpc2Vjb25kcyBvZiB3b3JrIHRvIHBhcnNlXG51cCB0byB0aGF0IHBvaW50IGlmIHRoZSB0cmVlIGlzbid0IGFscmVhZHkgYXZhaWxhYmxlLlxuKi9cbmZ1bmN0aW9uIGVuc3VyZVN5bnRheFRyZWUoc3RhdGUsIHVwdG8sIHRpbWVvdXQgPSA1MCkge1xuICAgIHZhciBfYTtcbiAgICBsZXQgcGFyc2UgPSAoX2EgPSBzdGF0ZS5maWVsZChMYW5ndWFnZS5zdGF0ZSwgZmFsc2UpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29udGV4dDtcbiAgICBpZiAoIXBhcnNlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgb2xkVmllcG9ydCA9IHBhcnNlLnZpZXdwb3J0O1xuICAgIHBhcnNlLnVwZGF0ZVZpZXdwb3J0KHsgZnJvbTogMCwgdG86IHVwdG8gfSk7XG4gICAgbGV0IHJlc3VsdCA9IHBhcnNlLmlzRG9uZSh1cHRvKSB8fCBwYXJzZS53b3JrKHRpbWVvdXQsIHVwdG8pID8gcGFyc2UudHJlZSA6IG51bGw7XG4gICAgcGFyc2UudXBkYXRlVmlld3BvcnQob2xkVmllcG9ydCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuUXVlcmllcyB3aGV0aGVyIHRoZXJlIGlzIGEgZnVsbCBzeW50YXggdHJlZSBhdmFpbGFibGUgdXAgdG8gdGhlXG5naXZlbiBkb2N1bWVudCBwb3NpdGlvbi4gSWYgdGhlcmUgaXNuJ3QsIHRoZSBiYWNrZ3JvdW5kIHBhcnNlXG5wcm9jZXNzIF9taWdodF8gc3RpbGwgYmUgd29ya2luZyBhbmQgdXBkYXRlIHRoZSB0cmVlIGZ1cnRoZXIsIGJ1dFxudGhlcmUgaXMgbm8gZ3VhcmFudGVlIG9mIHRoYXRcdTIwMTR0aGUgcGFyc2VyIHdpbGwgW3N0b3BcbndvcmtpbmddKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2Uuc3ludGF4UGFyc2VyUnVubmluZykgd2hlbiBpdCBoYXMgc3BlbnQgYVxuY2VydGFpbiBhbW91bnQgb2YgdGltZSBvciBoYXMgbW92ZWQgYmV5b25kIHRoZSB2aXNpYmxlIHZpZXdwb3J0LlxuQWx3YXlzIHJldHVybnMgZmFsc2UgaWYgbm8gbGFuZ3VhZ2UgaGFzIGJlZW4gZW5hYmxlZC5cbiovXG5mdW5jdGlvbiBzeW50YXhUcmVlQXZhaWxhYmxlKHN0YXRlLCB1cHRvID0gc3RhdGUuZG9jLmxlbmd0aCkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKChfYSA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlLCBmYWxzZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb250ZXh0LmlzRG9uZSh1cHRvKSkgfHwgZmFsc2U7XG59XG4vKipcbk1vdmUgcGFyc2luZyBmb3J3YXJkLCBhbmQgdXBkYXRlIHRoZSBlZGl0b3Igc3RhdGUgYWZ0ZXJ3YXJkcyB0b1xucmVmbGVjdCB0aGUgbmV3IHRyZWUuIFdpbGwgd29yayBmb3IgYXQgbW9zdCBgdGltZW91dGBcbm1pbGxpc2Vjb25kcy4gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXJzZXIgbWFuYWdlZCBnZXQgdG8gdGhlIGdpdmVuXG5wb3NpdGlvbiBpbiB0aGF0IHRpbWUuXG4qL1xuZnVuY3Rpb24gZm9yY2VQYXJzaW5nKHZpZXcsIHVwdG8gPSB2aWV3LnZpZXdwb3J0LnRvLCB0aW1lb3V0ID0gMTAwKSB7XG4gICAgbGV0IHN1Y2Nlc3MgPSBlbnN1cmVTeW50YXhUcmVlKHZpZXcuc3RhdGUsIHVwdG8sIHRpbWVvdXQpO1xuICAgIGlmIChzdWNjZXNzICE9IHN5bnRheFRyZWUodmlldy5zdGF0ZSkpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goe30pO1xuICAgIHJldHVybiAhIXN1Y2Nlc3M7XG59XG4vKipcblRlbGxzIHlvdSB3aGV0aGVyIHRoZSBsYW5ndWFnZSBwYXJzZXIgaXMgcGxhbm5pbmcgdG8gZG8gbW9yZVxucGFyc2luZyB3b3JrIChpbiBhIGByZXF1ZXN0SWRsZUNhbGxiYWNrYCBwc2V1ZG8tdGhyZWFkKSBvciBoYXNcbnN0b3BwZWQgcnVubmluZywgZWl0aGVyIGJlY2F1c2UgaXQgcGFyc2VkIHRoZSBlbnRpcmUgZG9jdW1lbnQsXG5iZWNhdXNlIGl0IHNwZW50IHRvbyBtdWNoIHRpbWUgYW5kIHdhcyBjdXQgb2ZmLCBvciBiZWNhdXNlIHRoZXJlXG5pcyBubyBsYW5ndWFnZSBwYXJzZXIgZW5hYmxlZC5cbiovXG5mdW5jdGlvbiBzeW50YXhQYXJzZXJSdW5uaW5nKHZpZXcpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuICgoX2EgPSB2aWV3LnBsdWdpbihwYXJzZVdvcmtlcikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pc1dvcmtpbmcoKSkgfHwgZmFsc2U7XG59XG4vKipcbkxlemVyLXN0eWxlXG5bYElucHV0YF0oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZiNjb21tb24uSW5wdXQpXG5vYmplY3QgZm9yIGEgW2BUZXh0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UZXh0KSBvYmplY3QuXG4qL1xuY2xhc3MgRG9jSW5wdXQge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBpbnB1dCBvYmplY3QgZm9yIHRoZSBnaXZlbiBkb2N1bWVudC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRvYykge1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5jdXJzb3JQb3MgPSAwO1xuICAgICAgICB0aGlzLnN0cmluZyA9IFwiXCI7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gZG9jLml0ZXIoKTtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuZG9jLmxlbmd0aDsgfVxuICAgIHN5bmNUbyhwb3MpIHtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSB0aGlzLmN1cnNvci5uZXh0KHBvcyAtIHRoaXMuY3Vyc29yUG9zKS52YWx1ZTtcbiAgICAgICAgdGhpcy5jdXJzb3JQb3MgPSBwb3MgKyB0aGlzLnN0cmluZy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnNvclBvcyAtIHRoaXMuc3RyaW5nLmxlbmd0aDtcbiAgICB9XG4gICAgY2h1bmsocG9zKSB7XG4gICAgICAgIHRoaXMuc3luY1RvKHBvcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZztcbiAgICB9XG4gICAgZ2V0IGxpbmVDaHVua3MoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgcmVhZChmcm9tLCB0bykge1xuICAgICAgICBsZXQgc3RyaW5nU3RhcnQgPSB0aGlzLmN1cnNvclBvcyAtIHRoaXMuc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgaWYgKGZyb20gPCBzdHJpbmdTdGFydCB8fCB0byA+PSB0aGlzLmN1cnNvclBvcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRvYy5zbGljZVN0cmluZyhmcm9tLCB0byk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmluZy5zbGljZShmcm9tIC0gc3RyaW5nU3RhcnQsIHRvIC0gc3RyaW5nU3RhcnQpO1xuICAgIH1cbn1cbmxldCBjdXJyZW50Q29udGV4dCA9IG51bGw7XG4vKipcbkEgcGFyc2UgY29udGV4dCBwcm92aWRlZCB0byBwYXJzZXJzIHdvcmtpbmcgb24gdGhlIGVkaXRvciBjb250ZW50LlxuKi9cbmNsYXNzIFBhcnNlQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IocGFyc2VyLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBzdGF0ZSwgXG4gICAgLyoqXG4gICAgVHJlZSBmcmFnbWVudHMgdGhhdCBjYW4gYmUgcmV1c2VkIGJ5IGluY3JlbWVudGFsIHJlLXBhcnNlcy5cbiAgICAqL1xuICAgIGZyYWdtZW50cyA9IFtdLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRyZWUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdHJlZUxlbiwgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgZWRpdG9yIHZpZXdwb3J0IChvciBzb21lIG92ZXJhcHByb3hpbWF0aW9uXG4gICAgdGhlcmVvZikuIEludGVuZGVkIHRvIGJlIHVzZWQgZm9yIG9wcG9ydHVuaXN0aWNhbGx5IGF2b2lkaW5nXG4gICAgd29yayAoaW4gd2hpY2ggY2FzZVxuICAgIFtgc2tpcFVudGlsSW5WaWV3YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5QYXJzZUNvbnRleHQuc2tpcFVudGlsSW5WaWV3KVxuICAgIHNob3VsZCBiZSBjYWxsZWQgdG8gbWFrZSBzdXJlIHRoZSBwYXJzZXIgaXMgcmVzdGFydGVkIHdoZW4gdGhlXG4gICAgc2tpcHBlZCByZWdpb24gYmVjb21lcyB2aXNpYmxlKS5cbiAgICAqL1xuICAgIHZpZXdwb3J0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNraXBwZWQsIFxuICAgIC8qKlxuICAgIFRoaXMgaXMgd2hlcmUgc2tpcHBpbmcgcGFyc2VycyBjYW4gcmVnaXN0ZXIgYSBwcm9taXNlIHRoYXQsXG4gICAgd2hlbiByZXNvbHZlZCwgd2lsbCBzY2hlZHVsZSBhIG5ldyBwYXJzZS4gSXQgaXMgY2xlYXJlZCB3aGVuXG4gICAgdGhlIHBhcnNlIHdvcmtlciBwaWNrcyB1cCB0aGUgcHJvbWlzZS4gQGludGVybmFsXG4gICAgKi9cbiAgICBzY2hlZHVsZU9uKSB7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICB0aGlzLnRyZWVMZW4gPSB0cmVlTGVuO1xuICAgICAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgICAgIHRoaXMuc2tpcHBlZCA9IHNraXBwZWQ7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVPbiA9IHNjaGVkdWxlT247XG4gICAgICAgIHRoaXMucGFyc2UgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMudGVtcFNraXBwZWQgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHBhcnNlciwgc3RhdGUsIHZpZXdwb3J0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUGFyc2VDb250ZXh0KHBhcnNlciwgc3RhdGUsIFtdLCBUcmVlLmVtcHR5LCAwLCB2aWV3cG9ydCwgW10sIG51bGwpO1xuICAgIH1cbiAgICBzdGFydFBhcnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZXIuc3RhcnRQYXJzZShuZXcgRG9jSW5wdXQodGhpcy5zdGF0ZS5kb2MpLCB0aGlzLmZyYWdtZW50cyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgd29yayh1bnRpbCwgdXB0bykge1xuICAgICAgICBpZiAodXB0byAhPSBudWxsICYmIHVwdG8gPj0gdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKVxuICAgICAgICAgICAgdXB0byA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMudHJlZSAhPSBUcmVlLmVtcHR5ICYmIHRoaXMuaXNEb25lKHVwdG8gIT09IG51bGwgJiYgdXB0byAhPT0gdm9pZCAwID8gdXB0byA6IHRoaXMuc3RhdGUuZG9jLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIHRoaXMudGFrZVRyZWUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhDb250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdW50aWwgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIGxldCBlbmRUaW1lID0gRGF0ZS5ub3coKSArIHVudGlsO1xuICAgICAgICAgICAgICAgIHVudGlsID0gKCkgPT4gRGF0ZS5ub3coKSA+IGVuZFRpbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyc2UpXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZSA9IHRoaXMuc3RhcnRQYXJzZSgpO1xuICAgICAgICAgICAgaWYgKHVwdG8gIT0gbnVsbCAmJiAodGhpcy5wYXJzZS5zdG9wcGVkQXQgPT0gbnVsbCB8fCB0aGlzLnBhcnNlLnN0b3BwZWRBdCA+IHVwdG8pICYmXG4gICAgICAgICAgICAgICAgdXB0byA8IHRoaXMuc3RhdGUuZG9jLmxlbmd0aClcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlLnN0b3BBdCh1cHRvKTtcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IHRoaXMucGFyc2UuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhZ21lbnRzID0gdGhpcy53aXRob3V0VGVtcFNraXBwZWQoVHJlZUZyYWdtZW50LmFkZFRyZWUoZG9uZSwgdGhpcy5mcmFnbWVudHMsIHRoaXMucGFyc2Uuc3RvcHBlZEF0ICE9IG51bGwpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlTGVuID0gKF9hID0gdGhpcy5wYXJzZS5zdG9wcGVkQXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuc3RhdGUuZG9jLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlID0gZG9uZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyZWVMZW4gPCAodXB0byAhPT0gbnVsbCAmJiB1cHRvICE9PSB2b2lkIDAgPyB1cHRvIDogdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2UgPSB0aGlzLnN0YXJ0UGFyc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh1bnRpbCgpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRha2VUcmVlKCkge1xuICAgICAgICBsZXQgcG9zLCB0cmVlO1xuICAgICAgICBpZiAodGhpcy5wYXJzZSAmJiAocG9zID0gdGhpcy5wYXJzZS5wYXJzZWRQb3MpID49IHRoaXMudHJlZUxlbikge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyc2Uuc3RvcHBlZEF0ID09IG51bGwgfHwgdGhpcy5wYXJzZS5zdG9wcGVkQXQgPiBwb3MpXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZS5zdG9wQXQocG9zKTtcbiAgICAgICAgICAgIHRoaXMud2l0aENvbnRleHQoKCkgPT4geyB3aGlsZSAoISh0cmVlID0gdGhpcy5wYXJzZS5hZHZhbmNlKCkpKSB7IH0gfSk7XG4gICAgICAgICAgICB0aGlzLnRyZWVMZW4gPSBwb3M7XG4gICAgICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICAgICAgdGhpcy5mcmFnbWVudHMgPSB0aGlzLndpdGhvdXRUZW1wU2tpcHBlZChUcmVlRnJhZ21lbnQuYWRkVHJlZSh0aGlzLnRyZWUsIHRoaXMuZnJhZ21lbnRzLCB0cnVlKSk7XG4gICAgICAgICAgICB0aGlzLnBhcnNlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aXRoQ29udGV4dChmKSB7XG4gICAgICAgIGxldCBwcmV2ID0gY3VycmVudENvbnRleHQ7XG4gICAgICAgIGN1cnJlbnRDb250ZXh0ID0gdGhpcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBmKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBjdXJyZW50Q29udGV4dCA9IHByZXY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2l0aG91dFRlbXBTa2lwcGVkKGZyYWdtZW50cykge1xuICAgICAgICBmb3IgKGxldCByOyByID0gdGhpcy50ZW1wU2tpcHBlZC5wb3AoKTspXG4gICAgICAgICAgICBmcmFnbWVudHMgPSBjdXRGcmFnbWVudHMoZnJhZ21lbnRzLCByLmZyb20sIHIudG8pO1xuICAgICAgICByZXR1cm4gZnJhZ21lbnRzO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNoYW5nZXMoY2hhbmdlcywgbmV3U3RhdGUpIHtcbiAgICAgICAgbGV0IHsgZnJhZ21lbnRzLCB0cmVlLCB0cmVlTGVuLCB2aWV3cG9ydCwgc2tpcHBlZCB9ID0gdGhpcztcbiAgICAgICAgdGhpcy50YWtlVHJlZSgpO1xuICAgICAgICBpZiAoIWNoYW5nZXMuZW1wdHkpIHtcbiAgICAgICAgICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIGNoYW5nZXMuaXRlckNoYW5nZWRSYW5nZXMoKGZyb21BLCB0b0EsIGZyb21CLCB0b0IpID0+IHJhbmdlcy5wdXNoKHsgZnJvbUEsIHRvQSwgZnJvbUIsIHRvQiB9KSk7XG4gICAgICAgICAgICBmcmFnbWVudHMgPSBUcmVlRnJhZ21lbnQuYXBwbHlDaGFuZ2VzKGZyYWdtZW50cywgcmFuZ2VzKTtcbiAgICAgICAgICAgIHRyZWUgPSBUcmVlLmVtcHR5O1xuICAgICAgICAgICAgdHJlZUxlbiA9IDA7XG4gICAgICAgICAgICB2aWV3cG9ydCA9IHsgZnJvbTogY2hhbmdlcy5tYXBQb3Modmlld3BvcnQuZnJvbSwgLTEpLCB0bzogY2hhbmdlcy5tYXBQb3Modmlld3BvcnQudG8sIDEpIH07XG4gICAgICAgICAgICBpZiAodGhpcy5za2lwcGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNraXBwZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByIG9mIHRoaXMuc2tpcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IGNoYW5nZXMubWFwUG9zKHIuZnJvbSwgMSksIHRvID0gY2hhbmdlcy5tYXBQb3Moci50bywgLTEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbSA8IHRvKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZC5wdXNoKHsgZnJvbSwgdG8gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUGFyc2VDb250ZXh0KHRoaXMucGFyc2VyLCBuZXdTdGF0ZSwgZnJhZ21lbnRzLCB0cmVlLCB0cmVlTGVuLCB2aWV3cG9ydCwgc2tpcHBlZCwgdGhpcy5zY2hlZHVsZU9uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB1cGRhdGVWaWV3cG9ydCh2aWV3cG9ydCkge1xuICAgICAgICBpZiAodGhpcy52aWV3cG9ydC5mcm9tID09IHZpZXdwb3J0LmZyb20gJiYgdGhpcy52aWV3cG9ydC50byA9PSB2aWV3cG9ydC50bylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICAgICBsZXQgc3RhcnRMZW4gPSB0aGlzLnNraXBwZWQubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2tpcHBlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHRoaXMuc2tpcHBlZFtpXTtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgdmlld3BvcnQudG8gJiYgdG8gPiB2aWV3cG9ydC5mcm9tKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBjdXRGcmFnbWVudHModGhpcy5mcmFnbWVudHMsIGZyb20sIHRvKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNraXBwZWQuc3BsaWNlKGktLSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2tpcHBlZC5sZW5ndGggPj0gc3RhcnRMZW4pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLnRha2VUcmVlKCk7XG4gICAgICAgICAgICB0aGlzLnBhcnNlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBOb3RpZnkgdGhlIHBhcnNlIHNjaGVkdWxlciB0aGF0IHRoZSBnaXZlbiByZWdpb24gd2FzIHNraXBwZWRcbiAgICBiZWNhdXNlIGl0IHdhc24ndCBpbiB2aWV3LCBhbmQgdGhlIHBhcnNlIHNob3VsZCBiZSByZXN0YXJ0ZWRcbiAgICB3aGVuIGl0IGNvbWVzIGludG8gdmlldy5cbiAgICAqL1xuICAgIHNraXBVbnRpbEluVmlldyhmcm9tLCB0bykge1xuICAgICAgICB0aGlzLnNraXBwZWQucHVzaCh7IGZyb20sIHRvIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGEgcGFyc2VyIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgcGxhY2Vob2xkZXIgd2hlblxuICAgIGFzeW5jaHJvbm91c2x5IGxvYWRpbmcgYSBuZXN0ZWQgcGFyc2VyLiBJdCdsbCBza2lwIGl0cyBpbnB1dCBhbmRcbiAgICBtYXJrIGl0IGFzIG5vdC1yZWFsbHktcGFyc2VkLCBzbyB0aGF0IHRoZSBuZXh0IHVwZGF0ZSB3aWxsIHBhcnNlXG4gICAgaXQgYWdhaW4uXG4gICAgXG4gICAgV2hlbiBgdW50aWxgIGlzIGdpdmVuLCBhIHJlcGFyc2Ugd2lsbCBiZSBzY2hlZHVsZWQgd2hlbiB0aGF0XG4gICAgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBnZXRTa2lwcGluZ1BhcnNlcih1bnRpbCkge1xuICAgICAgICByZXR1cm4gbmV3IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHtcbiAgICAgICAgICAgIGNyZWF0ZVBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gcmFuZ2VzWzBdLmZyb20sIHRvID0gcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXS50bztcbiAgICAgICAgICAgICAgICBsZXQgcGFyc2VyID0ge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWRQb3M6IGZyb20sXG4gICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3ggPSBjdXJyZW50Q29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgcmFuZ2VzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeC50ZW1wU2tpcHBlZC5wdXNoKHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bnRpbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3guc2NoZWR1bGVPbiA9IGN4LnNjaGVkdWxlT24gPyBQcm9taXNlLmFsbChbY3guc2NoZWR1bGVPbiwgdW50aWxdKSA6IHVudGlsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZWRQb3MgPSB0bztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJlZShOb2RlVHlwZS5ub25lLCBbXSwgW10sIHRvIC0gZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHN0b3BwZWRBdDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc3RvcEF0KCkgeyB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGlzRG9uZSh1cHRvKSB7XG4gICAgICAgIHVwdG8gPSBNYXRoLm1pbih1cHRvLCB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpO1xuICAgICAgICBsZXQgZnJhZ3MgPSB0aGlzLmZyYWdtZW50cztcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZUxlbiA+PSB1cHRvICYmIGZyYWdzLmxlbmd0aCAmJiBmcmFnc1swXS5mcm9tID09IDAgJiYgZnJhZ3NbMF0udG8gPj0gdXB0bztcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjb250ZXh0IGZvciB0aGUgY3VycmVudCBwYXJzZSwgb3IgYG51bGxgIGlmIG5vIGVkaXRvclxuICAgIHBhcnNlIGlzIGluIHByb2dyZXNzLlxuICAgICovXG4gICAgc3RhdGljIGdldCgpIHsgcmV0dXJuIGN1cnJlbnRDb250ZXh0OyB9XG59XG5mdW5jdGlvbiBjdXRGcmFnbWVudHMoZnJhZ21lbnRzLCBmcm9tLCB0bykge1xuICAgIHJldHVybiBUcmVlRnJhZ21lbnQuYXBwbHlDaGFuZ2VzKGZyYWdtZW50cywgW3sgZnJvbUE6IGZyb20sIHRvQTogdG8sIGZyb21COiBmcm9tLCB0b0I6IHRvIH1dKTtcbn1cbmNsYXNzIExhbmd1YWdlU3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIEEgbXV0YWJsZSBwYXJzZSBzdGF0ZSB0aGF0IGlzIHVzZWQgdG8gcHJlc2VydmUgd29yayBkb25lIGR1cmluZ1xuICAgIC8vIHRoZSBsaWZldGltZSBvZiBhIHN0YXRlIHdoZW4gbW92aW5nIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy50cmVlID0gY29udGV4dC50cmVlO1xuICAgIH1cbiAgICBhcHBseSh0cikge1xuICAgICAgICBpZiAoIXRyLmRvY0NoYW5nZWQgJiYgdGhpcy50cmVlID09IHRoaXMuY29udGV4dC50cmVlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGxldCBuZXdDeCA9IHRoaXMuY29udGV4dC5jaGFuZ2VzKHRyLmNoYW5nZXMsIHRyLnN0YXRlKTtcbiAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIHBhcnNlIHdhc24ndCBkb25lLCBnbyBmb3J3YXJkIG9ubHkgdXAgdG8gaXRzXG4gICAgICAgIC8vIGVuZCBwb3NpdGlvbiBvciB0aGUgZW5kIG9mIHRoZSB2aWV3cG9ydCwgdG8gYXZvaWQgc2xvd2luZyBkb3duXG4gICAgICAgIC8vIHN0YXRlIHVwZGF0ZXMgd2l0aCBwYXJzZSB3b3JrIGJleW9uZCB0aGUgdmlld3BvcnQuXG4gICAgICAgIGxldCB1cHRvID0gdGhpcy5jb250ZXh0LnRyZWVMZW4gPT0gdHIuc3RhcnRTdGF0ZS5kb2MubGVuZ3RoID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IE1hdGgubWF4KHRyLmNoYW5nZXMubWFwUG9zKHRoaXMuY29udGV4dC50cmVlTGVuKSwgbmV3Q3gudmlld3BvcnQudG8pO1xuICAgICAgICBpZiAoIW5ld0N4LndvcmsoMjAgLyogV29yay5BcHBseSAqLywgdXB0bykpXG4gICAgICAgICAgICBuZXdDeC50YWtlVHJlZSgpO1xuICAgICAgICByZXR1cm4gbmV3IExhbmd1YWdlU3RhdGUobmV3Q3gpO1xuICAgIH1cbiAgICBzdGF0aWMgaW5pdChzdGF0ZSkge1xuICAgICAgICBsZXQgdnBUbyA9IE1hdGgubWluKDMwMDAgLyogV29yay5Jbml0Vmlld3BvcnQgKi8sIHN0YXRlLmRvYy5sZW5ndGgpO1xuICAgICAgICBsZXQgcGFyc2VTdGF0ZSA9IFBhcnNlQ29udGV4dC5jcmVhdGUoc3RhdGUuZmFjZXQobGFuZ3VhZ2UpLnBhcnNlciwgc3RhdGUsIHsgZnJvbTogMCwgdG86IHZwVG8gfSk7XG4gICAgICAgIGlmICghcGFyc2VTdGF0ZS53b3JrKDIwIC8qIFdvcmsuQXBwbHkgKi8sIHZwVG8pKVxuICAgICAgICAgICAgcGFyc2VTdGF0ZS50YWtlVHJlZSgpO1xuICAgICAgICByZXR1cm4gbmV3IExhbmd1YWdlU3RhdGUocGFyc2VTdGF0ZSk7XG4gICAgfVxufVxuTGFuZ3VhZ2Uuc3RhdGUgPSAvKkBfX1BVUkVfXyovU3RhdGVGaWVsZC5kZWZpbmUoe1xuICAgIGNyZWF0ZTogTGFuZ3VhZ2VTdGF0ZS5pbml0LFxuICAgIHVwZGF0ZSh2YWx1ZSwgdHIpIHtcbiAgICAgICAgZm9yIChsZXQgZSBvZiB0ci5lZmZlY3RzKVxuICAgICAgICAgICAgaWYgKGUuaXMoTGFuZ3VhZ2Uuc2V0U3RhdGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlO1xuICAgICAgICBpZiAodHIuc3RhcnRTdGF0ZS5mYWNldChsYW5ndWFnZSkgIT0gdHIuc3RhdGUuZmFjZXQobGFuZ3VhZ2UpKVxuICAgICAgICAgICAgcmV0dXJuIExhbmd1YWdlU3RhdGUuaW5pdCh0ci5zdGF0ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZS5hcHBseSh0cik7XG4gICAgfVxufSk7XG5sZXQgcmVxdWVzdElkbGUgPSAoY2FsbGJhY2spID0+IHtcbiAgICBsZXQgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY2FsbGJhY2soKSwgNTAwIC8qIFdvcmsuTWF4UGF1c2UgKi8pO1xuICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZW91dCk7XG59O1xuaWYgKHR5cGVvZiByZXF1ZXN0SWRsZUNhbGxiYWNrICE9IFwidW5kZWZpbmVkXCIpXG4gICAgcmVxdWVzdElkbGUgPSAoY2FsbGJhY2spID0+IHtcbiAgICAgICAgbGV0IGlkbGUgPSAtMSwgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWRsZSA9IHJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2ssIHsgdGltZW91dDogNTAwIC8qIFdvcmsuTWF4UGF1c2UgKi8gLSAxMDAgLyogV29yay5NaW5QYXVzZSAqLyB9KTtcbiAgICAgICAgfSwgMTAwIC8qIFdvcmsuTWluUGF1c2UgKi8pO1xuICAgICAgICByZXR1cm4gKCkgPT4gaWRsZSA8IDAgPyBjbGVhclRpbWVvdXQodGltZW91dCkgOiBjYW5jZWxJZGxlQ2FsbGJhY2soaWRsZSk7XG4gICAgfTtcbmNvbnN0IGlzSW5wdXRQZW5kaW5nID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmICgoX2EgPSBuYXZpZ2F0b3Iuc2NoZWR1bGluZykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzSW5wdXRQZW5kaW5nKVxuICAgID8gKCkgPT4gbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcoKSA6IG51bGw7XG5jb25zdCBwYXJzZVdvcmtlciA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyBQYXJzZVdvcmtlciB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLndvcmtpbmcgPSBudWxsO1xuICAgICAgICB0aGlzLndvcmtTY2hlZHVsZWQgPSAwO1xuICAgICAgICAvLyBFbmQgb2YgdGhlIGN1cnJlbnQgdGltZSBjaHVua1xuICAgICAgICB0aGlzLmNodW5rRW5kID0gLTE7XG4gICAgICAgIC8vIE1pbGxpc2Vjb25kcyBvZiBidWRnZXQgbGVmdCBmb3IgdGhpcyBjaHVua1xuICAgICAgICB0aGlzLmNodW5rQnVkZ2V0ID0gLTE7XG4gICAgICAgIHRoaXMud29yayA9IHRoaXMud29yay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNjaGVkdWxlV29yaygpO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCBjeCA9IHRoaXMudmlldy5zdGF0ZS5maWVsZChMYW5ndWFnZS5zdGF0ZSkuY29udGV4dDtcbiAgICAgICAgaWYgKGN4LnVwZGF0ZVZpZXdwb3J0KHVwZGF0ZS52aWV3LnZpZXdwb3J0KSB8fCB0aGlzLnZpZXcudmlld3BvcnQudG8gPiBjeC50cmVlTGVuKVxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVdvcmsoKTtcbiAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5zZWxlY3Rpb25TZXQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcuaGFzRm9jdXMpXG4gICAgICAgICAgICAgICAgdGhpcy5jaHVua0J1ZGdldCArPSA1MCAvKiBXb3JrLkNoYW5nZUJvbnVzICovO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVdvcmsoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrQXN5bmNTY2hlZHVsZShjeCk7XG4gICAgfVxuICAgIHNjaGVkdWxlV29yaygpIHtcbiAgICAgICAgaWYgKHRoaXMud29ya2luZylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHRoaXMudmlldywgZmllbGQgPSBzdGF0ZS5maWVsZChMYW5ndWFnZS5zdGF0ZSk7XG4gICAgICAgIGlmIChmaWVsZC50cmVlICE9IGZpZWxkLmNvbnRleHQudHJlZSB8fCAhZmllbGQuY29udGV4dC5pc0RvbmUoc3RhdGUuZG9jLmxlbmd0aCkpXG4gICAgICAgICAgICB0aGlzLndvcmtpbmcgPSByZXF1ZXN0SWRsZSh0aGlzLndvcmspO1xuICAgIH1cbiAgICB3b3JrKGRlYWRsaW5lKSB7XG4gICAgICAgIHRoaXMud29ya2luZyA9IG51bGw7XG4gICAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAodGhpcy5jaHVua0VuZCA8IG5vdyAmJiAodGhpcy5jaHVua0VuZCA8IDAgfHwgdGhpcy52aWV3Lmhhc0ZvY3VzKSkgeyAvLyBTdGFydCBhIG5ldyBjaHVua1xuICAgICAgICAgICAgdGhpcy5jaHVua0VuZCA9IG5vdyArIDMwMDAwIC8qIFdvcmsuQ2h1bmtUaW1lICovO1xuICAgICAgICAgICAgdGhpcy5jaHVua0J1ZGdldCA9IDMwMDAgLyogV29yay5DaHVua0J1ZGdldCAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaHVua0J1ZGdldCA8PSAwKVxuICAgICAgICAgICAgcmV0dXJuOyAvLyBObyBtb3JlIGJ1ZGdldFxuICAgICAgICBsZXQgeyBzdGF0ZSwgdmlld3BvcnQ6IHsgdG86IHZwVG8gfSB9ID0gdGhpcy52aWV3LCBmaWVsZCA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlKTtcbiAgICAgICAgaWYgKGZpZWxkLnRyZWUgPT0gZmllbGQuY29udGV4dC50cmVlICYmIGZpZWxkLmNvbnRleHQuaXNEb25lKHZwVG8gKyAxMDAwMDAgLyogV29yay5NYXhQYXJzZUFoZWFkICovKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGVuZFRpbWUgPSBEYXRlLm5vdygpICsgTWF0aC5taW4odGhpcy5jaHVua0J1ZGdldCwgMTAwIC8qIFdvcmsuU2xpY2UgKi8sIGRlYWRsaW5lICYmICFpc0lucHV0UGVuZGluZyA/IE1hdGgubWF4KDI1IC8qIFdvcmsuTWluU2xpY2UgKi8sIGRlYWRsaW5lLnRpbWVSZW1haW5pbmcoKSAtIDUpIDogMWU5KTtcbiAgICAgICAgbGV0IHZpZXdwb3J0Rmlyc3QgPSBmaWVsZC5jb250ZXh0LnRyZWVMZW4gPCB2cFRvICYmIHN0YXRlLmRvYy5sZW5ndGggPiB2cFRvICsgMTAwMDtcbiAgICAgICAgbGV0IGRvbmUgPSBmaWVsZC5jb250ZXh0LndvcmsoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGlzSW5wdXRQZW5kaW5nICYmIGlzSW5wdXRQZW5kaW5nKCkgfHwgRGF0ZS5ub3coKSA+IGVuZFRpbWU7XG4gICAgICAgIH0sIHZwVG8gKyAodmlld3BvcnRGaXJzdCA/IDAgOiAxMDAwMDAgLyogV29yay5NYXhQYXJzZUFoZWFkICovKSk7XG4gICAgICAgIHRoaXMuY2h1bmtCdWRnZXQgLT0gRGF0ZS5ub3coKSAtIG5vdztcbiAgICAgICAgaWYgKGRvbmUgfHwgdGhpcy5jaHVua0J1ZGdldCA8PSAwKSB7XG4gICAgICAgICAgICBmaWVsZC5jb250ZXh0LnRha2VUcmVlKCk7XG4gICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBMYW5ndWFnZS5zZXRTdGF0ZS5vZihuZXcgTGFuZ3VhZ2VTdGF0ZShmaWVsZC5jb250ZXh0KSkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2h1bmtCdWRnZXQgPiAwICYmICEoZG9uZSAmJiAhdmlld3BvcnRGaXJzdCkpXG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlV29yaygpO1xuICAgICAgICB0aGlzLmNoZWNrQXN5bmNTY2hlZHVsZShmaWVsZC5jb250ZXh0KTtcbiAgICB9XG4gICAgY2hlY2tBc3luY1NjaGVkdWxlKGN4KSB7XG4gICAgICAgIGlmIChjeC5zY2hlZHVsZU9uKSB7XG4gICAgICAgICAgICB0aGlzLndvcmtTY2hlZHVsZWQrKztcbiAgICAgICAgICAgIGN4LnNjaGVkdWxlT25cbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnNjaGVkdWxlV29yaygpKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gbG9nRXhjZXB0aW9uKHRoaXMudmlldy5zdGF0ZSwgZXJyKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLndvcmtTY2hlZHVsZWQtLSk7XG4gICAgICAgICAgICBjeC5zY2hlZHVsZU9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy53b3JraW5nKVxuICAgICAgICAgICAgdGhpcy53b3JraW5nKCk7XG4gICAgfVxuICAgIGlzV29ya2luZygpIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMud29ya2luZyB8fCB0aGlzLndvcmtTY2hlZHVsZWQgPiAwKTtcbiAgICB9XG59LCB7XG4gICAgZXZlbnRIYW5kbGVyczogeyBmb2N1cygpIHsgdGhpcy5zY2hlZHVsZVdvcmsoKTsgfSB9XG59KTtcbi8qKlxuVGhlIGZhY2V0IHVzZWQgdG8gYXNzb2NpYXRlIGEgbGFuZ3VhZ2Ugd2l0aCBhbiBlZGl0b3Igc3RhdGUuIFVzZWRcbmJ5IGBMYW5ndWFnZWAgb2JqZWN0J3MgYGV4dGVuc2lvbmAgcHJvcGVydHkgKHNvIHlvdSBkb24ndCBuZWVkIHRvXG5tYW51YWxseSB3cmFwIHlvdXIgbGFuZ3VhZ2VzIGluIHRoaXMpLiBDYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlXG5jdXJyZW50IGxhbmd1YWdlIG9uIGEgc3RhdGUuXG4qL1xuY29uc3QgbGFuZ3VhZ2UgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKGxhbmd1YWdlcykgeyByZXR1cm4gbGFuZ3VhZ2VzLmxlbmd0aCA/IGxhbmd1YWdlc1swXSA6IG51bGw7IH0sXG4gICAgZW5hYmxlczogbGFuZ3VhZ2UgPT4gW1xuICAgICAgICBMYW5ndWFnZS5zdGF0ZSxcbiAgICAgICAgcGFyc2VXb3JrZXIsXG4gICAgICAgIEVkaXRvclZpZXcuY29udGVudEF0dHJpYnV0ZXMuY29tcHV0ZShbbGFuZ3VhZ2VdLCBzdGF0ZSA9PiB7XG4gICAgICAgICAgICBsZXQgbGFuZyA9IHN0YXRlLmZhY2V0KGxhbmd1YWdlKTtcbiAgICAgICAgICAgIHJldHVybiBsYW5nICYmIGxhbmcubmFtZSA/IHsgXCJkYXRhLWxhbmd1YWdlXCI6IGxhbmcubmFtZSB9IDoge307XG4gICAgICAgIH0pXG4gICAgXVxufSk7XG4vKipcblRoaXMgY2xhc3MgYnVuZGxlcyBhIFtsYW5ndWFnZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZSkgd2l0aCBhblxub3B0aW9uYWwgc2V0IG9mIHN1cHBvcnRpbmcgZXh0ZW5zaW9ucy4gTGFuZ3VhZ2UgcGFja2FnZXMgYXJlXG5lbmNvdXJhZ2VkIHRvIGV4cG9ydCBhIGZ1bmN0aW9uIHRoYXQgb3B0aW9uYWxseSB0YWtlcyBhXG5jb25maWd1cmF0aW9uIG9iamVjdCBhbmQgcmV0dXJucyBhIGBMYW5ndWFnZVN1cHBvcnRgIGluc3RhbmNlLCBhc1xudGhlIG1haW4gd2F5IGZvciBjbGllbnQgY29kZSB0byB1c2UgdGhlIHBhY2thZ2UuXG4qL1xuY2xhc3MgTGFuZ3VhZ2VTdXBwb3J0IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBsYW5ndWFnZSBzdXBwb3J0IG9iamVjdC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBsYW5ndWFnZSBvYmplY3QuXG4gICAgKi9cbiAgICBsYW5ndWFnZSwgXG4gICAgLyoqXG4gICAgQW4gb3B0aW9uYWwgc2V0IG9mIHN1cHBvcnRpbmcgZXh0ZW5zaW9ucy4gV2hlbiBuZXN0aW5nIGFcbiAgICBsYW5ndWFnZSBpbiBhbm90aGVyIGxhbmd1YWdlLCB0aGUgb3V0ZXIgbGFuZ3VhZ2UgaXMgZW5jb3VyYWdlZFxuICAgIHRvIGluY2x1ZGUgdGhlIHN1cHBvcnRpbmcgZXh0ZW5zaW9ucyBmb3IgaXRzIGlubmVyIGxhbmd1YWdlc1xuICAgIGluIGl0cyBvd24gc2V0IG9mIHN1cHBvcnQgZXh0ZW5zaW9ucy5cbiAgICAqL1xuICAgIHN1cHBvcnQgPSBbXSkge1xuICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgICAgIHRoaXMuc3VwcG9ydCA9IHN1cHBvcnQ7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gW2xhbmd1YWdlLCBzdXBwb3J0XTtcbiAgICB9XG59XG4vKipcbkxhbmd1YWdlIGRlc2NyaXB0aW9ucyBhcmUgdXNlZCB0byBzdG9yZSBtZXRhZGF0YSBhYm91dCBsYW5ndWFnZXNcbmFuZCB0byBkeW5hbWljYWxseSBsb2FkIHRoZW0uIFRoZWlyIG1haW4gcm9sZSBpcyBmaW5kaW5nIHRoZVxuYXBwcm9wcmlhdGUgbGFuZ3VhZ2UgZm9yIGEgZmlsZW5hbWUgb3IgZHluYW1pY2FsbHkgbG9hZGluZyBuZXN0ZWRcbnBhcnNlcnMuXG4qL1xuY2xhc3MgTGFuZ3VhZ2VEZXNjcmlwdGlvbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5hbWUgb2YgdGhpcyBsYW5ndWFnZS5cbiAgICAqL1xuICAgIG5hbWUsIFxuICAgIC8qKlxuICAgIEFsdGVybmF0aXZlIG5hbWVzIGZvciB0aGUgbW9kZSAobG93ZXJjYXNlZCwgaW5jbHVkZXMgYHRoaXMubmFtZWApLlxuICAgICovXG4gICAgYWxpYXMsIFxuICAgIC8qKlxuICAgIEZpbGUgZXh0ZW5zaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYW5ndWFnZS5cbiAgICAqL1xuICAgIGV4dGVuc2lvbnMsIFxuICAgIC8qKlxuICAgIE9wdGlvbmFsIGZpbGVuYW1lIHBhdHRlcm4gdGhhdCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXNcbiAgICBsYW5ndWFnZS5cbiAgICAqL1xuICAgIGZpbGVuYW1lLCBsb2FkRnVuYywgXG4gICAgLyoqXG4gICAgSWYgdGhlIGxhbmd1YWdlIGhhcyBiZWVuIGxvYWRlZCwgdGhpcyB3aWxsIGhvbGQgaXRzIHZhbHVlLlxuICAgICovXG4gICAgc3VwcG9ydCA9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG4gICAgICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICAgICAgdGhpcy5sb2FkRnVuYyA9IGxvYWRGdW5jO1xuICAgICAgICB0aGlzLnN1cHBvcnQgPSBzdXBwb3J0O1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBTdGFydCBsb2FkaW5nIHRoZSB0aGUgbGFuZ3VhZ2UuIFdpbGwgcmV0dXJuIGEgcHJvbWlzZSB0aGF0XG4gICAgcmVzb2x2ZXMgdG8gYSBbYExhbmd1YWdlU3VwcG9ydGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2VTdXBwb3J0KVxuICAgIG9iamVjdCB3aGVuIHRoZSBsYW5ndWFnZSBzdWNjZXNzZnVsbHkgbG9hZHMuXG4gICAgKi9cbiAgICBsb2FkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nIHx8ICh0aGlzLmxvYWRpbmcgPSB0aGlzLmxvYWRGdW5jKCkudGhlbihzdXBwb3J0ID0+IHRoaXMuc3VwcG9ydCA9IHN1cHBvcnQsIGVyciA9PiB7IHRoaXMubG9hZGluZyA9IG51bGw7IHRocm93IGVycjsgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBsYW5ndWFnZSBkZXNjcmlwdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBvZihzcGVjKSB7XG4gICAgICAgIGxldCB7IGxvYWQsIHN1cHBvcnQgfSA9IHNwZWM7XG4gICAgICAgIGlmICghbG9hZCkge1xuICAgICAgICAgICAgaWYgKCFzdXBwb3J0KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTXVzdCBwYXNzIGVpdGhlciAnbG9hZCcgb3IgJ3N1cHBvcnQnIHRvIExhbmd1YWdlRGVzY3JpcHRpb24ub2ZcIik7XG4gICAgICAgICAgICBsb2FkID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHN1cHBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VEZXNjcmlwdGlvbihzcGVjLm5hbWUsIChzcGVjLmFsaWFzIHx8IFtdKS5jb25jYXQoc3BlYy5uYW1lKS5tYXAocyA9PiBzLnRvTG93ZXJDYXNlKCkpLCBzcGVjLmV4dGVuc2lvbnMgfHwgW10sIHNwZWMuZmlsZW5hbWUsIGxvYWQsIHN1cHBvcnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBMb29rIGZvciBhIGxhbmd1YWdlIGluIHRoZSBnaXZlbiBhcnJheSBvZiBkZXNjcmlwdGlvbnMgdGhhdFxuICAgIG1hdGNoZXMgdGhlIGZpbGVuYW1lLiBXaWxsIGZpcnN0IG1hdGNoXG4gICAgW2BmaWxlbmFtZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2VEZXNjcmlwdGlvbi5maWxlbmFtZSkgcGF0dGVybnMsXG4gICAgYW5kIHRoZW4gW2V4dGVuc2lvbnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2VEZXNjcmlwdGlvbi5leHRlbnNpb25zKSxcbiAgICBhbmQgcmV0dXJuIHRoZSBmaXJzdCBsYW5ndWFnZSB0aGF0IG1hdGNoZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgbWF0Y2hGaWxlbmFtZShkZXNjcywgZmlsZW5hbWUpIHtcbiAgICAgICAgZm9yIChsZXQgZCBvZiBkZXNjcylcbiAgICAgICAgICAgIGlmIChkLmZpbGVuYW1lICYmIGQuZmlsZW5hbWUudGVzdChmaWxlbmFtZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgIGxldCBleHQgPSAvXFwuKFteLl0rKSQvLmV4ZWMoZmlsZW5hbWUpO1xuICAgICAgICBpZiAoZXh0KVxuICAgICAgICAgICAgZm9yIChsZXQgZCBvZiBkZXNjcylcbiAgICAgICAgICAgICAgICBpZiAoZC5leHRlbnNpb25zLmluZGV4T2YoZXh0WzFdKSA+IC0xKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIExvb2sgZm9yIGEgbGFuZ3VhZ2Ugd2hvc2UgbmFtZSBvciBhbGlhcyBtYXRjaGVzIHRoZSB0aGUgZ2l2ZW5cbiAgICBuYW1lIChjYXNlLWluc2Vuc2l0aXZlbHkpLiBJZiBgZnV6enlgIGlzIHRydWUsIGFuZCBubyBkaXJlY3RcbiAgICBtYXRjaHMgaXMgZm91bmQsIHRoaXMnbGwgYWxzbyBzZWFyY2ggZm9yIGEgbGFuZ3VhZ2Ugd2hvc2UgbmFtZVxuICAgIG9yIGFsaWFzIG9jY3VycyBpbiB0aGUgc3RyaW5nIChmb3IgbmFtZXMgc2hvcnRlciB0aGFuIHRocmVlXG4gICAgY2hhcmFjdGVycywgb25seSB3aGVuIHN1cnJvdW5kZWQgYnkgbm9uLXdvcmQgY2hhcmFjdGVycykuXG4gICAgKi9cbiAgICBzdGF0aWMgbWF0Y2hMYW5ndWFnZU5hbWUoZGVzY3MsIG5hbWUsIGZ1enp5ID0gdHJ1ZSkge1xuICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBmb3IgKGxldCBkIG9mIGRlc2NzKVxuICAgICAgICAgICAgaWYgKGQuYWxpYXMuc29tZShhID0+IGEgPT0gbmFtZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgIGlmIChmdXp6eSlcbiAgICAgICAgICAgIGZvciAobGV0IGQgb2YgZGVzY3MpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYSBvZiBkLmFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IG5hbWUuaW5kZXhPZihhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kID4gLTEgJiYgKGEubGVuZ3RoID4gMiB8fCAhL1xcdy8udGVzdChuYW1lW2ZvdW5kIC0gMV0pICYmICEvXFx3Ly50ZXN0KG5hbWVbZm91bmQgKyBhLmxlbmd0aF0pKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4vKipcbkZhY2V0IHRoYXQgZGVmaW5lcyBhIHdheSB0byBwcm92aWRlIGEgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyB0aGVcbmFwcHJvcHJpYXRlIGluZGVudGF0aW9uIGRlcHRoLCBhcyBhIGNvbHVtbiBudW1iZXIgKHNlZVxuW2BpbmRlbnRTdHJpbmdgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudFN0cmluZykpLCBhdCB0aGUgc3RhcnQgb2YgYSBnaXZlblxubGluZS4gQSByZXR1cm4gdmFsdWUgb2YgYG51bGxgIGluZGljYXRlcyBubyBpbmRlbnRhdGlvbiBjYW4gYmVcbmRldGVybWluZWQsIGFuZCB0aGUgbGluZSBzaG91bGQgaW5oZXJpdCB0aGUgaW5kZW50YXRpb24gb2YgdGhlIG9uZVxuYWJvdmUgaXQuIEEgcmV0dXJuIHZhbHVlIG9mIGB1bmRlZmluZWRgIGRlZmVycyB0byB0aGUgbmV4dCBpbmRlbnRcbnNlcnZpY2UuXG4qL1xuY29uc3QgaW5kZW50U2VydmljZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuRmFjZXQgZm9yIG92ZXJyaWRpbmcgdGhlIHVuaXQgYnkgd2hpY2ggaW5kZW50YXRpb24gaGFwcGVucy4gU2hvdWxkXG5iZSBhIHN0cmluZyBjb25zaXN0aW5nIGVpdGhlciBlbnRpcmVseSBvZiB0aGUgc2FtZSB3aGl0ZXNwYWNlXG5jaGFyYWN0ZXIuIFdoZW4gbm90IHNldCwgdGhpcyBkZWZhdWx0cyB0byAyIHNwYWNlcy5cbiovXG5jb25zdCBpbmRlbnRVbml0ID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHtcbiAgICAgICAgaWYgKCF2YWx1ZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIFwiICBcIjtcbiAgICAgICAgbGV0IHVuaXQgPSB2YWx1ZXNbMF07XG4gICAgICAgIGlmICghdW5pdCB8fCAvXFxTLy50ZXN0KHVuaXQpIHx8IEFycmF5LmZyb20odW5pdCkuc29tZShlID0+IGUgIT0gdW5pdFswXSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGluZGVudCB1bml0OiBcIiArIEpTT04uc3RyaW5naWZ5KHZhbHVlc1swXSkpO1xuICAgICAgICByZXR1cm4gdW5pdDtcbiAgICB9XG59KTtcbi8qKlxuUmV0dXJuIHRoZSBfY29sdW1uIHdpZHRoXyBvZiBhbiBpbmRlbnQgdW5pdCBpbiB0aGUgc3RhdGUuXG5EZXRlcm1pbmVkIGJ5IHRoZSBbYGluZGVudFVuaXRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudFVuaXQpXG5mYWNldCwgYW5kIFtgdGFiU2l6ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedGFiU2l6ZSkgd2hlbiB0aGF0XG5jb250YWlucyB0YWJzLlxuKi9cbmZ1bmN0aW9uIGdldEluZGVudFVuaXQoc3RhdGUpIHtcbiAgICBsZXQgdW5pdCA9IHN0YXRlLmZhY2V0KGluZGVudFVuaXQpO1xuICAgIHJldHVybiB1bml0LmNoYXJDb2RlQXQoMCkgPT0gOSA/IHN0YXRlLnRhYlNpemUgKiB1bml0Lmxlbmd0aCA6IHVuaXQubGVuZ3RoO1xufVxuLyoqXG5DcmVhdGUgYW4gaW5kZW50YXRpb24gc3RyaW5nIHRoYXQgY292ZXJzIGNvbHVtbnMgMCB0byBgY29sc2AuXG5XaWxsIHVzZSB0YWJzIGZvciBhcyBtdWNoIG9mIHRoZSBjb2x1bW5zIGFzIHBvc3NpYmxlIHdoZW4gdGhlXG5bYGluZGVudFVuaXRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudFVuaXQpIGZhY2V0IGNvbnRhaW5zXG50YWJzLlxuKi9cbmZ1bmN0aW9uIGluZGVudFN0cmluZyhzdGF0ZSwgY29scykge1xuICAgIGxldCByZXN1bHQgPSBcIlwiLCB0cyA9IHN0YXRlLnRhYlNpemUsIGNoID0gc3RhdGUuZmFjZXQoaW5kZW50VW5pdClbMF07XG4gICAgaWYgKGNoID09IFwiXFx0XCIpIHtcbiAgICAgICAgd2hpbGUgKGNvbHMgPj0gdHMpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBcIlxcdFwiO1xuICAgICAgICAgICAgY29scyAtPSB0cztcbiAgICAgICAgfVxuICAgICAgICBjaCA9IFwiIFwiO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHM7IGkrKylcbiAgICAgICAgcmVzdWx0ICs9IGNoO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbkdldCB0aGUgaW5kZW50YXRpb24sIGFzIGEgY29sdW1uIG51bWJlciwgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuV2lsbCBmaXJzdCBjb25zdWx0IGFueSBbaW5kZW50IHNlcnZpY2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudFNlcnZpY2UpXG50aGF0IGFyZSByZWdpc3RlcmVkLCBhbmQgaWYgbm9uZSBvZiB0aG9zZSByZXR1cm4gYW4gaW5kZW50YXRpb24sXG50aGlzIHdpbGwgY2hlY2sgdGhlIHN5bnRheCB0cmVlIGZvciB0aGUgW2luZGVudCBub2RlXG5wcm9wXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudE5vZGVQcm9wKSBhbmQgdXNlIHRoYXQgaWYgZm91bmQuIFJldHVybnMgYVxubnVtYmVyIHdoZW4gYW4gaW5kZW50YXRpb24gY291bGQgYmUgZGV0ZXJtaW5lZCwgYW5kIG51bGxcbm90aGVyd2lzZS5cbiovXG5mdW5jdGlvbiBnZXRJbmRlbnRhdGlvbihjb250ZXh0LCBwb3MpIHtcbiAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVkaXRvclN0YXRlKVxuICAgICAgICBjb250ZXh0ID0gbmV3IEluZGVudENvbnRleHQoY29udGV4dCk7XG4gICAgZm9yIChsZXQgc2VydmljZSBvZiBjb250ZXh0LnN0YXRlLmZhY2V0KGluZGVudFNlcnZpY2UpKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBzZXJ2aWNlKGNvbnRleHQsIHBvcyk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGxldCB0cmVlID0gc3ludGF4VHJlZShjb250ZXh0LnN0YXRlKTtcbiAgICByZXR1cm4gdHJlZS5sZW5ndGggPj0gcG9zID8gc3ludGF4SW5kZW50YXRpb24oY29udGV4dCwgdHJlZSwgcG9zKSA6IG51bGw7XG59XG4vKipcbkNyZWF0ZSBhIGNoYW5nZSBzZXQgdGhhdCBhdXRvLWluZGVudHMgYWxsIGxpbmVzIHRvdWNoZWQgYnkgdGhlXG5naXZlbiBkb2N1bWVudCByYW5nZS5cbiovXG5mdW5jdGlvbiBpbmRlbnRSYW5nZShzdGF0ZSwgZnJvbSwgdG8pIHtcbiAgICBsZXQgdXBkYXRlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGNvbnRleHQgPSBuZXcgSW5kZW50Q29udGV4dChzdGF0ZSwgeyBvdmVycmlkZUluZGVudGF0aW9uOiBzdGFydCA9PiB7IHZhciBfYTsgcmV0dXJuIChfYSA9IHVwZGF0ZWRbc3RhcnRdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAtMTsgfSB9KTtcbiAgICBsZXQgY2hhbmdlcyA9IFtdO1xuICAgIGZvciAobGV0IHBvcyA9IGZyb207IHBvcyA8PSB0bzspIHtcbiAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KHBvcyk7XG4gICAgICAgIHBvcyA9IGxpbmUudG8gKyAxO1xuICAgICAgICBsZXQgaW5kZW50ID0gZ2V0SW5kZW50YXRpb24oY29udGV4dCwgbGluZS5mcm9tKTtcbiAgICAgICAgaWYgKGluZGVudCA9PSBudWxsKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmICghL1xcUy8udGVzdChsaW5lLnRleHQpKVxuICAgICAgICAgICAgaW5kZW50ID0gMDtcbiAgICAgICAgbGV0IGN1ciA9IC9eXFxzKi8uZXhlYyhsaW5lLnRleHQpWzBdO1xuICAgICAgICBsZXQgbm9ybSA9IGluZGVudFN0cmluZyhzdGF0ZSwgaW5kZW50KTtcbiAgICAgICAgaWYgKGN1ciAhPSBub3JtKSB7XG4gICAgICAgICAgICB1cGRhdGVkW2xpbmUuZnJvbV0gPSBpbmRlbnQ7XG4gICAgICAgICAgICBjaGFuZ2VzLnB1c2goeyBmcm9tOiBsaW5lLmZyb20sIHRvOiBsaW5lLmZyb20gKyBjdXIubGVuZ3RoLCBpbnNlcnQ6IG5vcm0gfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmNoYW5nZXMoY2hhbmdlcyk7XG59XG4vKipcbkluZGVudGF0aW9uIGNvbnRleHRzIGFyZSB1c2VkIHdoZW4gY2FsbGluZyBbaW5kZW50YXRpb25cbnNlcnZpY2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmluZGVudFNlcnZpY2UpLiBUaGV5IHByb3ZpZGUgaGVscGVyIHV0aWxpdGllc1xudXNlZnVsIGluIGluZGVudGF0aW9uIGxvZ2ljLCBhbmQgY2FuIHNlbGVjdGl2ZWx5IG92ZXJyaWRlIHRoZVxuaW5kZW50YXRpb24gcmVwb3J0ZWQgZm9yIHNvbWUgbGluZXMuXG4qL1xuY2xhc3MgSW5kZW50Q29udGV4dCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGluZGVudCBjb250ZXh0LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIHN0YXRlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMudW5pdCA9IGdldEluZGVudFVuaXQoc3RhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbGluZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24sIHRha2luZ1xuICAgIFtzaW11bGF0ZWQgbGluZVxuICAgIGJyZWFrc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5JbmRlbnRDb250ZXh0LmNvbnN0cnVjdG9yXm9wdGlvbnMuc2ltdWxhdGVCcmVhaylcbiAgICBpbnRvIGFjY291bnQuIElmIHRoZXJlIGlzIHN1Y2ggYSBicmVhayBhdCBgcG9zYCwgdGhlIGBiaWFzYFxuICAgIGFyZ3VtZW50IGRldGVybWluZXMgd2hldGhlciB0aGUgcGFydCBvZiB0aGUgbGluZSBsaW5lIGJlZm9yZSBvclxuICAgIGFmdGVyIHRoZSBicmVhayBpcyB1c2VkLlxuICAgICovXG4gICAgbGluZUF0KHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgbGV0IHsgc2ltdWxhdGVCcmVhaywgc2ltdWxhdGVEb3VibGVCcmVhayB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBpZiAoc2ltdWxhdGVCcmVhayAhPSBudWxsICYmIHNpbXVsYXRlQnJlYWsgPj0gbGluZS5mcm9tICYmIHNpbXVsYXRlQnJlYWsgPD0gbGluZS50bykge1xuICAgICAgICAgICAgaWYgKHNpbXVsYXRlRG91YmxlQnJlYWsgJiYgc2ltdWxhdGVCcmVhayA9PSBwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dDogXCJcIiwgZnJvbTogcG9zIH07XG4gICAgICAgICAgICBlbHNlIGlmIChiaWFzIDwgMCA/IHNpbXVsYXRlQnJlYWsgPCBwb3MgOiBzaW11bGF0ZUJyZWFrIDw9IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0OiBsaW5lLnRleHQuc2xpY2Uoc2ltdWxhdGVCcmVhayAtIGxpbmUuZnJvbSksIGZyb206IHNpbXVsYXRlQnJlYWsgfTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0OiBsaW5lLnRleHQuc2xpY2UoMCwgc2ltdWxhdGVCcmVhayAtIGxpbmUuZnJvbSksIGZyb206IGxpbmUuZnJvbSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaW5lO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHRleHQgZGlyZWN0bHkgYWZ0ZXIgYHBvc2AsIGVpdGhlciB0aGUgZW50aXJlIGxpbmVcbiAgICBvciB0aGUgbmV4dCAxMDAgY2hhcmFjdGVycywgd2hpY2hldmVyIGlzIHNob3J0ZXIuXG4gICAgKi9cbiAgICB0ZXh0QWZ0ZXJQb3MocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbXVsYXRlRG91YmxlQnJlYWsgJiYgcG9zID09IHRoaXMub3B0aW9ucy5zaW11bGF0ZUJyZWFrKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCB7IHRleHQsIGZyb20gfSA9IHRoaXMubGluZUF0KHBvcywgYmlhcyk7XG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKHBvcyAtIGZyb20sIE1hdGgubWluKHRleHQubGVuZ3RoLCBwb3MgKyAxMDAgLSBmcm9tKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGNvbHVtbiBmb3IgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgY29sdW1uKHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgbGV0IHsgdGV4dCwgZnJvbSB9ID0gdGhpcy5saW5lQXQocG9zLCBiaWFzKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuY291bnRDb2x1bW4odGV4dCwgcG9zIC0gZnJvbSk7XG4gICAgICAgIGxldCBvdmVycmlkZSA9IHRoaXMub3B0aW9ucy5vdmVycmlkZUluZGVudGF0aW9uID8gdGhpcy5vcHRpb25zLm92ZXJyaWRlSW5kZW50YXRpb24oZnJvbSkgOiAtMTtcbiAgICAgICAgaWYgKG92ZXJyaWRlID4gLTEpXG4gICAgICAgICAgICByZXN1bHQgKz0gb3ZlcnJpZGUgLSB0aGlzLmNvdW50Q29sdW1uKHRleHQsIHRleHQuc2VhcmNoKC9cXFN8JC8pKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgY29sdW1uIHBvc2l0aW9uICh0YWtpbmcgdGFicyBpbnRvIGFjY291bnQpIG9mIHRoZSBnaXZlblxuICAgIHBvc2l0aW9uIGluIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAgKi9cbiAgICBjb3VudENvbHVtbihsaW5lLCBwb3MgPSBsaW5lLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gY291bnRDb2x1bW4obGluZSwgdGhpcy5zdGF0ZS50YWJTaXplLCBwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBpbmRlbnRhdGlvbiBjb2x1bW4gb2YgdGhlIGxpbmUgYXQgdGhlIGdpdmVuIHBvaW50LlxuICAgICovXG4gICAgbGluZUluZGVudChwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIGxldCB7IHRleHQsIGZyb20gfSA9IHRoaXMubGluZUF0KHBvcywgYmlhcyk7XG4gICAgICAgIGxldCBvdmVycmlkZSA9IHRoaXMub3B0aW9ucy5vdmVycmlkZUluZGVudGF0aW9uO1xuICAgICAgICBpZiAob3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGxldCBvdmVycmlkZW4gPSBvdmVycmlkZShmcm9tKTtcbiAgICAgICAgICAgIGlmIChvdmVycmlkZW4gPiAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvdW50Q29sdW1uKHRleHQsIHRleHQuc2VhcmNoKC9cXFN8JC8pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGUgW3NpbXVsYXRlZCBsaW5lXG4gICAgYnJlYWtdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuSW5kZW50Q29udGV4dC5jb25zdHJ1Y3Rvcl5vcHRpb25zLnNpbXVsYXRlQnJlYWspXG4gICAgZm9yIHRoaXMgY29udGV4dCwgaWYgYW55LlxuICAgICovXG4gICAgZ2V0IHNpbXVsYXRlZEJyZWFrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNpbXVsYXRlQnJlYWsgfHwgbnVsbDtcbiAgICB9XG59XG4vKipcbkEgc3ludGF4IHRyZWUgbm9kZSBwcm9wIHVzZWQgdG8gYXNzb2NpYXRlIGluZGVudGF0aW9uIHN0cmF0ZWdpZXNcbndpdGggbm9kZSB0eXBlcy4gU3VjaCBhIHN0cmF0ZWd5IGlzIGEgZnVuY3Rpb24gZnJvbSBhbiBpbmRlbnRhdGlvblxuY29udGV4dCB0byBhIGNvbHVtbiBudW1iZXIgKHNlZSBhbHNvXG5bYGluZGVudFN0cmluZ2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U3RyaW5nKSkgb3IgbnVsbCwgd2hlcmUgbnVsbFxuaW5kaWNhdGVzIHRoYXQgbm8gZGVmaW5pdGl2ZSBpbmRlbnRhdGlvbiBjYW4gYmUgZGV0ZXJtaW5lZC5cbiovXG5jb25zdCBpbmRlbnROb2RlUHJvcCA9IC8qQF9fUFVSRV9fKi9uZXcgTm9kZVByb3AoKTtcbi8vIENvbXB1dGUgdGhlIGluZGVudGF0aW9uIGZvciBhIGdpdmVuIHBvc2l0aW9uIGZyb20gdGhlIHN5bnRheCB0cmVlLlxuZnVuY3Rpb24gc3ludGF4SW5kZW50YXRpb24oY3gsIGFzdCwgcG9zKSB7XG4gICAgbGV0IHN0YWNrID0gYXN0LnJlc29sdmVTdGFjayhwb3MpO1xuICAgIGxldCBpbm5lciA9IHN0YWNrLm5vZGUuZW50ZXJVbmZpbmlzaGVkTm9kZXNCZWZvcmUocG9zKTtcbiAgICBpZiAoaW5uZXIgIT0gc3RhY2subm9kZSkge1xuICAgICAgICBsZXQgYWRkID0gW107XG4gICAgICAgIGZvciAobGV0IGN1ciA9IGlubmVyOyBjdXIgIT0gc3RhY2subm9kZTsgY3VyID0gY3VyLnBhcmVudClcbiAgICAgICAgICAgIGFkZC5wdXNoKGN1cik7XG4gICAgICAgIGZvciAobGV0IGkgPSBhZGQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBzdGFjayA9IHsgbm9kZTogYWRkW2ldLCBuZXh0OiBzdGFjayB9O1xuICAgIH1cbiAgICByZXR1cm4gaW5kZW50Rm9yKHN0YWNrLCBjeCwgcG9zKTtcbn1cbmZ1bmN0aW9uIGluZGVudEZvcihzdGFjaywgY3gsIHBvcykge1xuICAgIGZvciAobGV0IGN1ciA9IHN0YWNrOyBjdXI7IGN1ciA9IGN1ci5uZXh0KSB7XG4gICAgICAgIGxldCBzdHJhdGVneSA9IGluZGVudFN0cmF0ZWd5KGN1ci5ub2RlKTtcbiAgICAgICAgaWYgKHN0cmF0ZWd5KVxuICAgICAgICAgICAgcmV0dXJuIHN0cmF0ZWd5KFRyZWVJbmRlbnRDb250ZXh0LmNyZWF0ZShjeCwgcG9zLCBjdXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5mdW5jdGlvbiBpZ25vcmVDbG9zZWQoY3gpIHtcbiAgICByZXR1cm4gY3gucG9zID09IGN4Lm9wdGlvbnMuc2ltdWxhdGVCcmVhayAmJiBjeC5vcHRpb25zLnNpbXVsYXRlRG91YmxlQnJlYWs7XG59XG5mdW5jdGlvbiBpbmRlbnRTdHJhdGVneSh0cmVlKSB7XG4gICAgbGV0IHN0cmF0ZWd5ID0gdHJlZS50eXBlLnByb3AoaW5kZW50Tm9kZVByb3ApO1xuICAgIGlmIChzdHJhdGVneSlcbiAgICAgICAgcmV0dXJuIHN0cmF0ZWd5O1xuICAgIGxldCBmaXJzdCA9IHRyZWUuZmlyc3RDaGlsZCwgY2xvc2U7XG4gICAgaWYgKGZpcnN0ICYmIChjbG9zZSA9IGZpcnN0LnR5cGUucHJvcChOb2RlUHJvcC5jbG9zZWRCeSkpKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdHJlZS5sYXN0Q2hpbGQsIGNsb3NlZCA9IGxhc3QgJiYgY2xvc2UuaW5kZXhPZihsYXN0Lm5hbWUpID4gLTE7XG4gICAgICAgIHJldHVybiBjeCA9PiBkZWxpbWl0ZWRTdHJhdGVneShjeCwgdHJ1ZSwgMSwgdW5kZWZpbmVkLCBjbG9zZWQgJiYgIWlnbm9yZUNsb3NlZChjeCkgPyBsYXN0LmZyb20gOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJlZS5wYXJlbnQgPT0gbnVsbCA/IHRvcEluZGVudCA6IG51bGw7XG59XG5mdW5jdGlvbiB0b3BJbmRlbnQoKSB7IHJldHVybiAwOyB9XG4vKipcbk9iamVjdHMgb2YgdGhpcyB0eXBlIHByb3ZpZGUgY29udGV4dCBpbmZvcm1hdGlvbiBhbmQgaGVscGVyXG5tZXRob2RzIHRvIGluZGVudGF0aW9uIGZ1bmN0aW9ucyByZWdpc3RlcmVkIG9uIHN5bnRheCBub2Rlcy5cbiovXG5jbGFzcyBUcmVlSW5kZW50Q29udGV4dCBleHRlbmRzIEluZGVudENvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBhdCB3aGljaCBpbmRlbnRhdGlvbiBpcyBiZWluZyBjb21wdXRlZC5cbiAgICAqL1xuICAgIHBvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKGJhc2Uuc3RhdGUsIGJhc2Uub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc3ludGF4IHRyZWUgbm9kZSB0byB3aGljaCB0aGUgaW5kZW50YXRpb24gc3RyYXRlZ3lcbiAgICBhcHBsaWVzLlxuICAgICovXG4gICAgZ2V0IG5vZGUoKSB7IHJldHVybiB0aGlzLmNvbnRleHQubm9kZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShiYXNlLCBwb3MsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlSW5kZW50Q29udGV4dChiYXNlLCBwb3MsIGNvbnRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHRleHQgZGlyZWN0bHkgYWZ0ZXIgYHRoaXMucG9zYCwgZWl0aGVyIHRoZSBlbnRpcmUgbGluZVxuICAgIG9yIHRoZSBuZXh0IDEwMCBjaGFyYWN0ZXJzLCB3aGljaGV2ZXIgaXMgc2hvcnRlci5cbiAgICAqL1xuICAgIGdldCB0ZXh0QWZ0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRBZnRlclBvcyh0aGlzLnBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgaW5kZW50YXRpb24gYXQgdGhlIHJlZmVyZW5jZSBsaW5lIGZvciBgdGhpcy5ub2RlYCwgd2hpY2hcbiAgICBpcyB0aGUgbGluZSBvbiB3aGljaCBpdCBzdGFydHMsIHVubGVzcyB0aGVyZSBpcyBhIG5vZGUgdGhhdCBpc1xuICAgIF9ub3RfIGEgcGFyZW50IG9mIHRoaXMgbm9kZSBjb3ZlcmluZyB0aGUgc3RhcnQgb2YgdGhhdCBsaW5lLiBJZlxuICAgIHNvLCB0aGUgbGluZSBhdCB0aGUgc3RhcnQgb2YgdGhhdCBub2RlIGlzIHRyaWVkLCBhZ2FpbiBza2lwcGluZ1xuICAgIG9uIGlmIGl0IGlzIGNvdmVyZWQgYnkgYW5vdGhlciBzdWNoIG5vZGUuXG4gICAgKi9cbiAgICBnZXQgYmFzZUluZGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUluZGVudEZvcih0aGlzLm5vZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGluZGVudGF0aW9uIGZvciB0aGUgcmVmZXJlbmNlIGxpbmUgb2YgdGhlIGdpdmVuIG5vZGVcbiAgICAoc2VlIFtgYmFzZUluZGVudGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuVHJlZUluZGVudENvbnRleHQuYmFzZUluZGVudCkpLlxuICAgICovXG4gICAgYmFzZUluZGVudEZvcihub2RlKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5zdGF0ZS5kb2MubGluZUF0KG5vZGUuZnJvbSk7XG4gICAgICAgIC8vIFNraXAgbGluZSBzdGFydHMgdGhhdCBhcmUgY292ZXJlZCBieSBhIHNpYmxpbmcgKG9yIGNvdXNpbiwgZXRjKVxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgYXRCcmVhayA9IG5vZGUucmVzb2x2ZShsaW5lLmZyb20pO1xuICAgICAgICAgICAgd2hpbGUgKGF0QnJlYWsucGFyZW50ICYmIGF0QnJlYWsucGFyZW50LmZyb20gPT0gYXRCcmVhay5mcm9tKVxuICAgICAgICAgICAgICAgIGF0QnJlYWsgPSBhdEJyZWFrLnBhcmVudDtcbiAgICAgICAgICAgIGlmIChpc1BhcmVudChhdEJyZWFrLCBub2RlKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQoYXRCcmVhay5mcm9tKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5saW5lSW5kZW50KGxpbmUuZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnRpbnVlIGxvb2tpbmcgZm9yIGluZGVudGF0aW9ucyBpbiB0aGUgbm9kZSdzIHBhcmVudCBub2RlcyxcbiAgICBhbmQgcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhhdC5cbiAgICAqL1xuICAgIGNvbnRpbnVlKCkge1xuICAgICAgICByZXR1cm4gaW5kZW50Rm9yKHRoaXMuY29udGV4dC5uZXh0LCB0aGlzLmJhc2UsIHRoaXMucG9zKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1BhcmVudChwYXJlbnQsIG9mKSB7XG4gICAgZm9yIChsZXQgY3VyID0gb2Y7IGN1cjsgY3VyID0gY3VyLnBhcmVudClcbiAgICAgICAgaWYgKHBhcmVudCA9PSBjdXIpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBDaGVjayB3aGV0aGVyIGEgZGVsaW1pdGVkIG5vZGUgaXMgYWxpZ25lZCAobWVhbmluZyB0aGVyZSBhcmVcbi8vIG5vbi1za2lwcGVkIG5vZGVzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIG9wZW5pbmcgZGVsaW1pdGVyKS4gQW5kXG4vLyBpZiBzbywgcmV0dXJuIHRoZSBvcGVuaW5nIHRva2VuLlxuZnVuY3Rpb24gYnJhY2tldGVkQWxpZ25lZChjb250ZXh0KSB7XG4gICAgbGV0IHRyZWUgPSBjb250ZXh0Lm5vZGU7XG4gICAgbGV0IG9wZW5Ub2tlbiA9IHRyZWUuY2hpbGRBZnRlcih0cmVlLmZyb20pLCBsYXN0ID0gdHJlZS5sYXN0Q2hpbGQ7XG4gICAgaWYgKCFvcGVuVG9rZW4pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBzaW0gPSBjb250ZXh0Lm9wdGlvbnMuc2ltdWxhdGVCcmVhaztcbiAgICBsZXQgb3BlbkxpbmUgPSBjb250ZXh0LnN0YXRlLmRvYy5saW5lQXQob3BlblRva2VuLmZyb20pO1xuICAgIGxldCBsaW5lRW5kID0gc2ltID09IG51bGwgfHwgc2ltIDw9IG9wZW5MaW5lLmZyb20gPyBvcGVuTGluZS50byA6IE1hdGgubWluKG9wZW5MaW5lLnRvLCBzaW0pO1xuICAgIGZvciAobGV0IHBvcyA9IG9wZW5Ub2tlbi50bzs7KSB7XG4gICAgICAgIGxldCBuZXh0ID0gdHJlZS5jaGlsZEFmdGVyKHBvcyk7XG4gICAgICAgIGlmICghbmV4dCB8fCBuZXh0ID09IGxhc3QpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFuZXh0LnR5cGUuaXNTa2lwcGVkKVxuICAgICAgICAgICAgcmV0dXJuIG5leHQuZnJvbSA8IGxpbmVFbmQgPyBvcGVuVG9rZW4gOiBudWxsO1xuICAgICAgICBwb3MgPSBuZXh0LnRvO1xuICAgIH1cbn1cbi8qKlxuQW4gaW5kZW50YXRpb24gc3RyYXRlZ3kgZm9yIGRlbGltaXRlZCAodXN1YWxseSBicmFja2V0ZWQpIG5vZGVzLlxuV2lsbCwgYnkgZGVmYXVsdCwgaW5kZW50IG9uZSB1bml0IG1vcmUgdGhhbiB0aGUgcGFyZW50J3MgYmFzZVxuaW5kZW50IHVubGVzcyB0aGUgbGluZSBzdGFydHMgd2l0aCBhIGNsb3NpbmcgdG9rZW4uIFdoZW4gYGFsaWduYFxuaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG5vbi1za2lwcGVkIG5vZGVzIG9uIHRoZSBub2RlJ3Mgb3BlbmluZ1xubGluZSwgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUgd2lsbCBiZSBhbGlnbmVkIHdpdGggdGhlIGVuZCBvZiB0aGVcbm9wZW5pbmcgbm9kZSwgbGlrZSB0aGlzOlxuXG4gICAgZm9vKGJhcixcbiAgICAgICAgYmF6KVxuKi9cbmZ1bmN0aW9uIGRlbGltaXRlZEluZGVudCh7IGNsb3NpbmcsIGFsaWduID0gdHJ1ZSwgdW5pdHMgPSAxIH0pIHtcbiAgICByZXR1cm4gKGNvbnRleHQpID0+IGRlbGltaXRlZFN0cmF0ZWd5KGNvbnRleHQsIGFsaWduLCB1bml0cywgY2xvc2luZyk7XG59XG5mdW5jdGlvbiBkZWxpbWl0ZWRTdHJhdGVneShjb250ZXh0LCBhbGlnbiwgdW5pdHMsIGNsb3NpbmcsIGNsb3NlZEF0KSB7XG4gICAgbGV0IGFmdGVyID0gY29udGV4dC50ZXh0QWZ0ZXIsIHNwYWNlID0gYWZ0ZXIubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoO1xuICAgIGxldCBjbG9zZWQgPSBjbG9zaW5nICYmIGFmdGVyLnNsaWNlKHNwYWNlLCBzcGFjZSArIGNsb3NpbmcubGVuZ3RoKSA9PSBjbG9zaW5nIHx8IGNsb3NlZEF0ID09IGNvbnRleHQucG9zICsgc3BhY2U7XG4gICAgbGV0IGFsaWduZWQgPSBhbGlnbiA/IGJyYWNrZXRlZEFsaWduZWQoY29udGV4dCkgOiBudWxsO1xuICAgIGlmIChhbGlnbmVkKVxuICAgICAgICByZXR1cm4gY2xvc2VkID8gY29udGV4dC5jb2x1bW4oYWxpZ25lZC5mcm9tKSA6IGNvbnRleHQuY29sdW1uKGFsaWduZWQudG8pO1xuICAgIHJldHVybiBjb250ZXh0LmJhc2VJbmRlbnQgKyAoY2xvc2VkID8gMCA6IGNvbnRleHQudW5pdCAqIHVuaXRzKTtcbn1cbi8qKlxuQW4gaW5kZW50YXRpb24gc3RyYXRlZ3kgdGhhdCBhbGlnbnMgYSBub2RlJ3MgY29udGVudCB0byBpdHMgYmFzZVxuaW5kZW50YXRpb24uXG4qL1xuY29uc3QgZmxhdEluZGVudCA9IChjb250ZXh0KSA9PiBjb250ZXh0LmJhc2VJbmRlbnQ7XG4vKipcbkNyZWF0ZXMgYW4gaW5kZW50YXRpb24gc3RyYXRlZ3kgdGhhdCwgYnkgZGVmYXVsdCwgaW5kZW50c1xuY29udGludWVkIGxpbmVzIG9uZSB1bml0IG1vcmUgdGhhbiB0aGUgbm9kZSdzIGJhc2UgaW5kZW50YXRpb24uXG5Zb3UgY2FuIHByb3ZpZGUgYGV4Y2VwdGAgdG8gcHJldmVudCBpbmRlbnRhdGlvbiBvZiBsaW5lcyB0aGF0XG5tYXRjaCBhIHBhdHRlcm4gKGZvciBleGFtcGxlIGAvXmVsc2VcXGIvYCBpbiBgaWZgL2BlbHNlYFxuY29uc3RydWN0cyksIGFuZCB5b3UgY2FuIGNoYW5nZSB0aGUgYW1vdW50IG9mIHVuaXRzIHVzZWQgd2l0aCB0aGVcbmB1bml0c2Agb3B0aW9uLlxuKi9cbmZ1bmN0aW9uIGNvbnRpbnVlZEluZGVudCh7IGV4Y2VwdCwgdW5pdHMgPSAxIH0gPSB7fSkge1xuICAgIHJldHVybiAoY29udGV4dCkgPT4ge1xuICAgICAgICBsZXQgbWF0Y2hFeGNlcHQgPSBleGNlcHQgJiYgZXhjZXB0LnRlc3QoY29udGV4dC50ZXh0QWZ0ZXIpO1xuICAgICAgICByZXR1cm4gY29udGV4dC5iYXNlSW5kZW50ICsgKG1hdGNoRXhjZXB0ID8gMCA6IHVuaXRzICogY29udGV4dC51bml0KTtcbiAgICB9O1xufVxuY29uc3QgRG9udEluZGVudEJleW9uZCA9IDIwMDtcbi8qKlxuRW5hYmxlcyByZWluZGVudGF0aW9uIG9uIGlucHV0LiBXaGVuIGEgbGFuZ3VhZ2UgZGVmaW5lcyBhblxuYGluZGVudE9uSW5wdXRgIGZpZWxkIGluIGl0cyBbbGFuZ3VhZ2VcbmRhdGFdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhQXQpLCB3aGljaCBtdXN0IGhvbGQgYSByZWd1bGFyXG5leHByZXNzaW9uLCB0aGUgbGluZSBhdCB0aGUgY3Vyc29yIHdpbGwgYmUgcmVpbmRlbnRlZCB3aGVuZXZlciBuZXdcbnRleHQgaXMgdHlwZWQgYW5kIHRoZSBpbnB1dCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbGluZSB1cCB0byB0aGVcbmN1cnNvciBtYXRjaGVzIHRoYXQgcmVnZXhwLlxuXG5UbyBhdm9pZCB1bm5lY2Nlc2FyeSByZWluZGVudHMsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHN0YXJ0IHRoZVxucmVnZXhwIHdpdGggYF5gICh1c3VhbGx5IGZvbGxvd2VkIGJ5IGBcXHMqYCksIGFuZCBlbmQgaXQgd2l0aCBgJGAuXG5Gb3IgZXhhbXBsZSwgYC9eXFxzKlxcfSQvYCB3aWxsIHJlaW5kZW50IHdoZW4gYSBjbG9zaW5nIGJyYWNlIGlzXG5hZGRlZCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLlxuKi9cbmZ1bmN0aW9uIGluZGVudE9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIEVkaXRvclN0YXRlLnRyYW5zYWN0aW9uRmlsdGVyLm9mKHRyID0+IHtcbiAgICAgICAgaWYgKCF0ci5kb2NDaGFuZ2VkIHx8ICF0ci5pc1VzZXJFdmVudChcImlucHV0LnR5cGVcIikgJiYgIXRyLmlzVXNlckV2ZW50KFwiaW5wdXQuY29tcGxldGVcIikpXG4gICAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIGxldCBydWxlcyA9IHRyLnN0YXJ0U3RhdGUubGFuZ3VhZ2VEYXRhQXQoXCJpbmRlbnRPbklucHV0XCIsIHRyLnN0YXJ0U3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZCk7XG4gICAgICAgIGlmICghcnVsZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRyO1xuICAgICAgICBsZXQgZG9jID0gdHIubmV3RG9jLCB7IGhlYWQgfSA9IHRyLm5ld1NlbGVjdGlvbi5tYWluLCBsaW5lID0gZG9jLmxpbmVBdChoZWFkKTtcbiAgICAgICAgaWYgKGhlYWQgPiBsaW5lLmZyb20gKyBEb250SW5kZW50QmV5b25kKVxuICAgICAgICAgICAgcmV0dXJuIHRyO1xuICAgICAgICBsZXQgbGluZVN0YXJ0ID0gZG9jLnNsaWNlU3RyaW5nKGxpbmUuZnJvbSwgaGVhZCk7XG4gICAgICAgIGlmICghcnVsZXMuc29tZShyID0+IHIudGVzdChsaW5lU3RhcnQpKSlcbiAgICAgICAgICAgIHJldHVybiB0cjtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHRyLCBsYXN0ID0gLTEsIGNoYW5nZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgeyBoZWFkIH0gb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KGhlYWQpO1xuICAgICAgICAgICAgaWYgKGxpbmUuZnJvbSA9PSBsYXN0KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGFzdCA9IGxpbmUuZnJvbTtcbiAgICAgICAgICAgIGxldCBpbmRlbnQgPSBnZXRJbmRlbnRhdGlvbihzdGF0ZSwgbGluZS5mcm9tKTtcbiAgICAgICAgICAgIGlmIChpbmRlbnQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBjdXIgPSAvXlxccyovLmV4ZWMobGluZS50ZXh0KVswXTtcbiAgICAgICAgICAgIGxldCBub3JtID0gaW5kZW50U3RyaW5nKHN0YXRlLCBpbmRlbnQpO1xuICAgICAgICAgICAgaWYgKGN1ciAhPSBub3JtKVxuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7IGZyb206IGxpbmUuZnJvbSwgdG86IGxpbmUuZnJvbSArIGN1ci5sZW5ndGgsIGluc2VydDogbm9ybSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hhbmdlcy5sZW5ndGggPyBbdHIsIHsgY2hhbmdlcywgc2VxdWVudGlhbDogdHJ1ZSB9XSA6IHRyO1xuICAgIH0pO1xufVxuXG4vKipcbkEgZmFjZXQgdGhhdCByZWdpc3RlcnMgYSBjb2RlIGZvbGRpbmcgc2VydmljZS4gV2hlbiBjYWxsZWQgd2l0aFxudGhlIGV4dGVudCBvZiBhIGxpbmUsIHN1Y2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgZm9sZGFibGVcbnJhbmdlIHRoYXQgc3RhcnRzIG9uIHRoYXQgbGluZSAoYnV0IGNvbnRpbnVlcyBiZXlvbmQgaXQpLCBpZiBvbmVcbmNhbiBiZSBmb3VuZC5cbiovXG5jb25zdCBmb2xkU2VydmljZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuVGhpcyBub2RlIHByb3AgaXMgdXNlZCB0byBhc3NvY2lhdGUgZm9sZGluZyBpbmZvcm1hdGlvbiB3aXRoXG5zeW50YXggbm9kZSB0eXBlcy4gR2l2ZW4gYSBzeW50YXggbm9kZSwgaXQgc2hvdWxkIGNoZWNrIHdoZXRoZXJcbnRoYXQgdHJlZSBpcyBmb2xkYWJsZSBhbmQgcmV0dXJuIHRoZSByYW5nZSB0aGF0IGNhbiBiZSBjb2xsYXBzZWRcbndoZW4gaXQgaXMuXG4qL1xuY29uc3QgZm9sZE5vZGVQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLyoqXG5bRm9sZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkTm9kZVByb3ApIGZ1bmN0aW9uIHRoYXQgZm9sZHMgZXZlcnl0aGluZyBidXRcbnRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgY2hpbGQgb2YgYSBzeW50YXggbm9kZS4gVXNlZnVsIGZvciBub2Rlc1xudGhhdCBzdGFydCBhbmQgZW5kIHdpdGggZGVsaW1pdGVycy5cbiovXG5mdW5jdGlvbiBmb2xkSW5zaWRlKG5vZGUpIHtcbiAgICBsZXQgZmlyc3QgPSBub2RlLmZpcnN0Q2hpbGQsIGxhc3QgPSBub2RlLmxhc3RDaGlsZDtcbiAgICByZXR1cm4gZmlyc3QgJiYgZmlyc3QudG8gPCBsYXN0LmZyb20gPyB7IGZyb206IGZpcnN0LnRvLCB0bzogbGFzdC50eXBlLmlzRXJyb3IgPyBub2RlLnRvIDogbGFzdC5mcm9tIH0gOiBudWxsO1xufVxuZnVuY3Rpb24gc3ludGF4Rm9sZGluZyhzdGF0ZSwgc3RhcnQsIGVuZCkge1xuICAgIGxldCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSk7XG4gICAgaWYgKHRyZWUubGVuZ3RoIDwgZW5kKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgc3RhY2sgPSB0cmVlLnJlc29sdmVTdGFjayhlbmQsIDEpO1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgZm9yIChsZXQgaXRlciA9IHN0YWNrOyBpdGVyOyBpdGVyID0gaXRlci5uZXh0KSB7XG4gICAgICAgIGxldCBjdXIgPSBpdGVyLm5vZGU7XG4gICAgICAgIGlmIChjdXIudG8gPD0gZW5kIHx8IGN1ci5mcm9tID4gZW5kKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChmb3VuZCAmJiBjdXIuZnJvbSA8IHN0YXJ0KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGxldCBwcm9wID0gY3VyLnR5cGUucHJvcChmb2xkTm9kZVByb3ApO1xuICAgICAgICBpZiAocHJvcCAmJiAoY3VyLnRvIDwgdHJlZS5sZW5ndGggLSA1MCB8fCB0cmVlLmxlbmd0aCA9PSBzdGF0ZS5kb2MubGVuZ3RoIHx8ICFpc1VuZmluaXNoZWQoY3VyKSkpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHByb3AoY3VyLCBzdGF0ZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUuZnJvbSA8PSBlbmQgJiYgdmFsdWUuZnJvbSA+PSBzdGFydCAmJiB2YWx1ZS50byA+IGVuZClcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbn1cbmZ1bmN0aW9uIGlzVW5maW5pc2hlZChub2RlKSB7XG4gICAgbGV0IGNoID0gbm9kZS5sYXN0Q2hpbGQ7XG4gICAgcmV0dXJuIGNoICYmIGNoLnRvID09IG5vZGUudG8gJiYgY2gudHlwZS5pc0Vycm9yO1xufVxuLyoqXG5DaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBsaW5lIGlzIGZvbGRhYmxlLiBGaXJzdCBhc2tzIGFueSBmb2xkXG5zZXJ2aWNlcyByZWdpc3RlcmVkIHRocm91Z2hcbltgZm9sZFNlcnZpY2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGRTZXJ2aWNlKSwgYW5kIGlmIG5vbmUgb2YgdGhlbSByZXR1cm5cbmEgcmVzdWx0LCB0cmllcyB0byBxdWVyeSB0aGUgW2ZvbGQgbm9kZVxucHJvcF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkTm9kZVByb3ApIG9mIHN5bnRheCBub2RlcyB0aGF0IGNvdmVyIHRoZSBlbmRcbm9mIHRoZSBsaW5lLlxuKi9cbmZ1bmN0aW9uIGZvbGRhYmxlKHN0YXRlLCBsaW5lU3RhcnQsIGxpbmVFbmQpIHtcbiAgICBmb3IgKGxldCBzZXJ2aWNlIG9mIHN0YXRlLmZhY2V0KGZvbGRTZXJ2aWNlKSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gc2VydmljZShzdGF0ZSwgbGluZVN0YXJ0LCBsaW5lRW5kKTtcbiAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBzeW50YXhGb2xkaW5nKHN0YXRlLCBsaW5lU3RhcnQsIGxpbmVFbmQpO1xufVxuZnVuY3Rpb24gbWFwUmFuZ2UocmFuZ2UsIG1hcHBpbmcpIHtcbiAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwUG9zKHJhbmdlLmZyb20sIDEpLCB0byA9IG1hcHBpbmcubWFwUG9zKHJhbmdlLnRvLCAtMSk7XG4gICAgcmV0dXJuIGZyb20gPj0gdG8gPyB1bmRlZmluZWQgOiB7IGZyb20sIHRvIH07XG59XG4vKipcblN0YXRlIGVmZmVjdCB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIHRyYW5zYWN0aW9uIHRvIGZvbGQgdGhlXG5naXZlbiByYW5nZS4gKFlvdSBwcm9iYWJseSBvbmx5IG5lZWQgdGhpcyBpbiBleGNlcHRpb25hbFxuY2lyY3Vtc3RhbmNlc1x1MjAxNHVzdWFsbHkgeW91J2xsIGp1c3Qgd2FudCB0byBsZXRcbltgZm9sZENvZGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGRDb2RlKSBhbmQgdGhlIFtmb2xkXG5ndXR0ZXJdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZEd1dHRlcikgY3JlYXRlIHRoZSB0cmFuc2FjdGlvbnMuKVxuKi9cbmNvbnN0IGZvbGRFZmZlY3QgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKHsgbWFwOiBtYXBSYW5nZSB9KTtcbi8qKlxuU3RhdGUgZWZmZWN0IHRoYXQgdW5mb2xkcyB0aGUgZ2l2ZW4gcmFuZ2UgKGlmIGl0IHdhcyBmb2xkZWQpLlxuKi9cbmNvbnN0IHVuZm9sZEVmZmVjdCA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoeyBtYXA6IG1hcFJhbmdlIH0pO1xuZnVuY3Rpb24gc2VsZWN0ZWRMaW5lcyh2aWV3KSB7XG4gICAgbGV0IGxpbmVzID0gW107XG4gICAgZm9yIChsZXQgeyBoZWFkIH0gb2Ygdmlldy5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgIGlmIChsaW5lcy5zb21lKGwgPT4gbC5mcm9tIDw9IGhlYWQgJiYgbC50byA+PSBoZWFkKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsaW5lcy5wdXNoKHZpZXcubGluZUJsb2NrQXQoaGVhZCkpO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXM7XG59XG4vKipcblRoZSBzdGF0ZSBmaWVsZCB0aGF0IHN0b3JlcyB0aGUgZm9sZGVkIHJhbmdlcyAoYXMgYSBbZGVjb3JhdGlvblxuc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvblNldCkpLiBDYW4gYmUgcGFzc2VkIHRvXG5bYEVkaXRvclN0YXRlLnRvSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUudG9KU09OKSBhbmRcbltgZnJvbUpTT05gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmZyb21KU09OKSB0byBzZXJpYWxpemUgdGhlIGZvbGRcbnN0YXRlLlxuKi9cbmNvbnN0IGZvbGRTdGF0ZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5ub25lO1xuICAgIH0sXG4gICAgdXBkYXRlKGZvbGRlZCwgdHIpIHtcbiAgICAgICAgZm9sZGVkID0gZm9sZGVkLm1hcCh0ci5jaGFuZ2VzKTtcbiAgICAgICAgZm9yIChsZXQgZSBvZiB0ci5lZmZlY3RzKSB7XG4gICAgICAgICAgICBpZiAoZS5pcyhmb2xkRWZmZWN0KSAmJiAhZm9sZEV4aXN0cyhmb2xkZWQsIGUudmFsdWUuZnJvbSwgZS52YWx1ZS50bykpIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBwcmVwYXJlUGxhY2Vob2xkZXIgfSA9IHRyLnN0YXRlLmZhY2V0KGZvbGRDb25maWcpO1xuICAgICAgICAgICAgICAgIGxldCB3aWRnZXQgPSAhcHJlcGFyZVBsYWNlaG9sZGVyID8gZm9sZFdpZGdldCA6XG4gICAgICAgICAgICAgICAgICAgIERlY29yYXRpb24ucmVwbGFjZSh7IHdpZGdldDogbmV3IFByZXBhcmVkRm9sZFdpZGdldChwcmVwYXJlUGxhY2Vob2xkZXIodHIuc3RhdGUsIGUudmFsdWUpKSB9KTtcbiAgICAgICAgICAgICAgICBmb2xkZWQgPSBmb2xkZWQudXBkYXRlKHsgYWRkOiBbd2lkZ2V0LnJhbmdlKGUudmFsdWUuZnJvbSwgZS52YWx1ZS50byldIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZS5pcyh1bmZvbGRFZmZlY3QpKSB7XG4gICAgICAgICAgICAgICAgZm9sZGVkID0gZm9sZGVkLnVwZGF0ZSh7IGZpbHRlcjogKGZyb20sIHRvKSA9PiBlLnZhbHVlLmZyb20gIT0gZnJvbSB8fCBlLnZhbHVlLnRvICE9IHRvLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGcm9tOiBlLnZhbHVlLmZyb20sIGZpbHRlclRvOiBlLnZhbHVlLnRvIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENsZWFyIGZvbGRlZCByYW5nZXMgdGhhdCBjb3ZlciB0aGUgc2VsZWN0aW9uIGhlYWRcbiAgICAgICAgaWYgKHRyLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgbGV0IG9uU2VsZWN0aW9uID0gZmFsc2UsIHsgaGVhZCB9ID0gdHIuc2VsZWN0aW9uLm1haW47XG4gICAgICAgICAgICBmb2xkZWQuYmV0d2VlbihoZWFkLCBoZWFkLCAoYSwgYikgPT4geyBpZiAoYSA8IGhlYWQgJiYgYiA+IGhlYWQpXG4gICAgICAgICAgICAgICAgb25TZWxlY3Rpb24gPSB0cnVlOyB9KTtcbiAgICAgICAgICAgIGlmIChvblNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICBmb2xkZWQgPSBmb2xkZWQudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyRnJvbTogaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVG86IGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcjogKGEsIGIpID0+IGIgPD0gaGVhZCB8fCBhID49IGhlYWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9sZGVkO1xuICAgIH0sXG4gICAgcHJvdmlkZTogZiA9PiBFZGl0b3JWaWV3LmRlY29yYXRpb25zLmZyb20oZiksXG4gICAgdG9KU09OKGZvbGRlZCwgc3RhdGUpIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgICAgICBmb2xkZWQuYmV0d2VlbigwLCBzdGF0ZS5kb2MubGVuZ3RoLCAoZnJvbSwgdG8pID0+IHsgcmFuZ2VzLnB1c2goZnJvbSwgdG8pOyB9KTtcbiAgICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICB9LFxuICAgIGZyb21KU09OKHZhbHVlKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUubGVuZ3RoICUgMilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIGZvciBmb2xkIHN0YXRlXCIpO1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGZyb20gPSB2YWx1ZVtpKytdLCB0byA9IHZhbHVlW2krK107XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdG8gIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiBmb3IgZm9sZCBzdGF0ZVwiKTtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKGZvbGRXaWRnZXQucmFuZ2UoZnJvbSwgdG8pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5zZXQocmFuZ2VzLCB0cnVlKTtcbiAgICB9XG59KTtcbi8qKlxuR2V0IGEgW3JhbmdlIHNldF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZVNldCkgY29udGFpbmluZyB0aGUgZm9sZGVkIHJhbmdlc1xuaW4gdGhlIGdpdmVuIHN0YXRlLlxuKi9cbmZ1bmN0aW9uIGZvbGRlZFJhbmdlcyhzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKSB8fCBSYW5nZVNldC5lbXB0eTtcbn1cbmZ1bmN0aW9uIGZpbmRGb2xkKHN0YXRlLCBmcm9tLCB0bykge1xuICAgIHZhciBfYTtcbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIChfYSA9IHN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYmV0d2Vlbihmcm9tLCB0bywgKGZyb20sIHRvKSA9PiB7XG4gICAgICAgIGlmICghZm91bmQgfHwgZm91bmQuZnJvbSA+IGZyb20pXG4gICAgICAgICAgICBmb3VuZCA9IHsgZnJvbSwgdG8gfTtcbiAgICB9KTtcbiAgICByZXR1cm4gZm91bmQ7XG59XG5mdW5jdGlvbiBmb2xkRXhpc3RzKGZvbGRlZCwgZnJvbSwgdG8pIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBmb2xkZWQuYmV0d2Vlbihmcm9tLCBmcm9tLCAoYSwgYikgPT4geyBpZiAoYSA9PSBmcm9tICYmIGIgPT0gdG8pXG4gICAgICAgIGZvdW5kID0gdHJ1ZTsgfSk7XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuZnVuY3Rpb24gbWF5YmVFbmFibGUoc3RhdGUsIG90aGVyKSB7XG4gICAgcmV0dXJuIHN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpID8gb3RoZXIgOiBvdGhlci5jb25jYXQoU3RhdGVFZmZlY3QuYXBwZW5kQ29uZmlnLm9mKGNvZGVGb2xkaW5nKCkpKTtcbn1cbi8qKlxuRm9sZCB0aGUgbGluZXMgdGhhdCBhcmUgc2VsZWN0ZWQsIGlmIHBvc3NpYmxlLlxuKi9cbmNvbnN0IGZvbGRDb2RlID0gdmlldyA9PiB7XG4gICAgZm9yIChsZXQgbGluZSBvZiBzZWxlY3RlZExpbmVzKHZpZXcpKSB7XG4gICAgICAgIGxldCByYW5nZSA9IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IG1heWJlRW5hYmxlKHZpZXcuc3RhdGUsIFtmb2xkRWZmZWN0Lm9mKHJhbmdlKSwgYW5ub3VuY2VGb2xkKHZpZXcsIHJhbmdlKV0pIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbi8qKlxuVW5mb2xkIGZvbGRlZCByYW5nZXMgb24gc2VsZWN0ZWQgbGluZXMuXG4qL1xuY29uc3QgdW5mb2xkQ29kZSA9IHZpZXcgPT4ge1xuICAgIGlmICghdmlldy5zdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgbGluZSBvZiBzZWxlY3RlZExpbmVzKHZpZXcpKSB7XG4gICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGVkKVxuICAgICAgICAgICAgZWZmZWN0cy5wdXNoKHVuZm9sZEVmZmVjdC5vZihmb2xkZWQpLCBhbm5vdW5jZUZvbGQodmlldywgZm9sZGVkLCBmYWxzZSkpO1xuICAgIH1cbiAgICBpZiAoZWZmZWN0cy5sZW5ndGgpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzIH0pO1xuICAgIHJldHVybiBlZmZlY3RzLmxlbmd0aCA+IDA7XG59O1xuZnVuY3Rpb24gYW5ub3VuY2VGb2xkKHZpZXcsIHJhbmdlLCBmb2xkID0gdHJ1ZSkge1xuICAgIGxldCBsaW5lRnJvbSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChyYW5nZS5mcm9tKS5udW1iZXIsIGxpbmVUbyA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChyYW5nZS50bykubnVtYmVyO1xuICAgIHJldHVybiBFZGl0b3JWaWV3LmFubm91bmNlLm9mKGAke3ZpZXcuc3RhdGUucGhyYXNlKGZvbGQgPyBcIkZvbGRlZCBsaW5lc1wiIDogXCJVbmZvbGRlZCBsaW5lc1wiKX0gJHtsaW5lRnJvbX0gJHt2aWV3LnN0YXRlLnBocmFzZShcInRvXCIpfSAke2xpbmVUb30uYCk7XG59XG4vKipcbkZvbGQgYWxsIHRvcC1sZXZlbCBmb2xkYWJsZSByYW5nZXMuIE5vdGUgdGhhdCwgaW4gbW9zdCBjYXNlcyxcbmZvbGRpbmcgaW5mb3JtYXRpb24gd2lsbCBkZXBlbmQgb24gdGhlIFtzeW50YXhcbnRyZWVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2Uuc3ludGF4VHJlZSksIGFuZCBmb2xkaW5nIGV2ZXJ5dGhpbmcgbWF5IG5vdCB3b3JrXG5yZWxpYWJseSB3aGVuIHRoZSBkb2N1bWVudCBoYXNuJ3QgYmVlbiBmdWxseSBwYXJzZWQgKGVpdGhlclxuYmVjYXVzZSB0aGUgZWRpdG9yIHN0YXRlIHdhcyBvbmx5IGp1c3QgaW5pdGlhbGl6ZWQsIG9yIGJlY2F1c2UgdGhlXG5kb2N1bWVudCBpcyBzbyBiaWcgdGhhdCB0aGUgcGFyc2VyIGRlY2lkZWQgbm90IHRvIHBhcnNlIGl0XG5lbnRpcmVseSkuXG4qL1xuY29uc3QgZm9sZEFsbCA9IHZpZXcgPT4ge1xuICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgcG9zID0gMDsgcG9zIDwgc3RhdGUuZG9jLmxlbmd0aDspIHtcbiAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHBvcyksIHJhbmdlID0gZm9sZGFibGUoc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChyYW5nZSlcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaChmb2xkRWZmZWN0Lm9mKHJhbmdlKSk7XG4gICAgICAgIHBvcyA9IChyYW5nZSA/IHZpZXcubGluZUJsb2NrQXQocmFuZ2UudG8pIDogbGluZSkudG8gKyAxO1xuICAgIH1cbiAgICBpZiAoZWZmZWN0cy5sZW5ndGgpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBtYXliZUVuYWJsZSh2aWV3LnN0YXRlLCBlZmZlY3RzKSB9KTtcbiAgICByZXR1cm4gISFlZmZlY3RzLmxlbmd0aDtcbn07XG4vKipcblVuZm9sZCBhbGwgZm9sZGVkIGNvZGUuXG4qL1xuY29uc3QgdW5mb2xkQWxsID0gdmlldyA9PiB7XG4gICAgbGV0IGZpZWxkID0gdmlldy5zdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKTtcbiAgICBpZiAoIWZpZWxkIHx8ICFmaWVsZC5zaXplKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmaWVsZC5iZXR3ZWVuKDAsIHZpZXcuc3RhdGUuZG9jLmxlbmd0aCwgKGZyb20sIHRvKSA9PiB7IGVmZmVjdHMucHVzaCh1bmZvbGRFZmZlY3Qub2YoeyBmcm9tLCB0byB9KSk7IH0pO1xuICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzIH0pO1xuICAgIHJldHVybiB0cnVlO1xufTtcbi8vIEZpbmQgdGhlIGZvbGRhYmxlIHJlZ2lvbiBjb250YWluaW5nIHRoZSBnaXZlbiBsaW5lLCBpZiBvbmUgZXhpc3RzXG5mdW5jdGlvbiBmb2xkYWJsZUNvbnRhaW5lcih2aWV3LCBsaW5lQmxvY2spIHtcbiAgICAvLyBMb29rIGJhY2t3YXJkcyB0aHJvdWdoIGxpbmUgYmxvY2tzIHVudGlsIHdlIGZpbmQgYSBmb2xkYWJsZSByZWdpb24gdGhhdFxuICAgIC8vIGludGVyc2VjdHMgd2l0aCB0aGUgbGluZVxuICAgIGZvciAobGV0IGxpbmUgPSBsaW5lQmxvY2s7Oykge1xuICAgICAgICBsZXQgZm9sZGFibGVSZWdpb24gPSBmb2xkYWJsZSh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGFibGVSZWdpb24gJiYgZm9sZGFibGVSZWdpb24udG8gPiBsaW5lQmxvY2suZnJvbSlcbiAgICAgICAgICAgIHJldHVybiBmb2xkYWJsZVJlZ2lvbjtcbiAgICAgICAgaWYgKCFsaW5lLmZyb20pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGluZSA9IHZpZXcubGluZUJsb2NrQXQobGluZS5mcm9tIC0gMSk7XG4gICAgfVxufVxuLyoqXG5Ub2dnbGUgZm9sZGluZyBhdCBjdXJzb3JzLiBVbmZvbGRzIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGZvbGRcbnN0YXJ0aW5nIGluIHRoYXQgbGluZSwgdHJpZXMgdG8gZmluZCBhIGZvbGRhYmxlIHJhbmdlIGFyb3VuZCBpdFxub3RoZXJ3aXNlLlxuKi9cbmNvbnN0IHRvZ2dsZUZvbGQgPSAodmlldykgPT4ge1xuICAgIGxldCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgbGluZSBvZiBzZWxlY3RlZExpbmVzKHZpZXcpKSB7XG4gICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGVkKSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCksIGFubm91bmNlRm9sZCh2aWV3LCBmb2xkZWQsIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZm9sZFJhbmdlID0gZm9sZGFibGVDb250YWluZXIodmlldywgbGluZSk7XG4gICAgICAgICAgICBpZiAoZm9sZFJhbmdlKVxuICAgICAgICAgICAgICAgIGVmZmVjdHMucHVzaChmb2xkRWZmZWN0Lm9mKGZvbGRSYW5nZSksIGFubm91bmNlRm9sZCh2aWV3LCBmb2xkUmFuZ2UpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWZmZWN0cy5sZW5ndGggPiAwKVxuICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogbWF5YmVFbmFibGUodmlldy5zdGF0ZSwgZWZmZWN0cykgfSk7XG4gICAgcmV0dXJuICEhZWZmZWN0cy5sZW5ndGg7XG59O1xuLyoqXG5EZWZhdWx0IGZvbGQtcmVsYXRlZCBrZXkgYmluZGluZ3MuXG5cbiAtIEN0cmwtU2hpZnQtWyAoQ21kLUFsdC1bIG9uIG1hY09TKTogW2Bmb2xkQ29kZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZENvZGUpLlxuIC0gQ3RybC1TaGlmdC1dIChDbWQtQWx0LV0gb24gbWFjT1MpOiBbYHVuZm9sZENvZGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLnVuZm9sZENvZGUpLlxuIC0gQ3RybC1BbHQtWzogW2Bmb2xkQWxsYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkQWxsKS5cbiAtIEN0cmwtQWx0LV06IFtgdW5mb2xkQWxsYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS51bmZvbGRBbGwpLlxuKi9cbmNvbnN0IGZvbGRLZXltYXAgPSBbXG4gICAgeyBrZXk6IFwiQ3RybC1TaGlmdC1bXCIsIG1hYzogXCJDbWQtQWx0LVtcIiwgcnVuOiBmb2xkQ29kZSB9LFxuICAgIHsga2V5OiBcIkN0cmwtU2hpZnQtXVwiLCBtYWM6IFwiQ21kLUFsdC1dXCIsIHJ1bjogdW5mb2xkQ29kZSB9LFxuICAgIHsga2V5OiBcIkN0cmwtQWx0LVtcIiwgcnVuOiBmb2xkQWxsIH0sXG4gICAgeyBrZXk6IFwiQ3RybC1BbHQtXVwiLCBydW46IHVuZm9sZEFsbCB9XG5dO1xuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgICBwbGFjZWhvbGRlckRPTTogbnVsbCxcbiAgICBwcmVwYXJlUGxhY2Vob2xkZXI6IG51bGwsXG4gICAgcGxhY2Vob2xkZXJUZXh0OiBcIlx1MjAyNlwiXG59O1xuY29uc3QgZm9sZENvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUodmFsdWVzKSB7IHJldHVybiBjb21iaW5lQ29uZmlnKHZhbHVlcywgZGVmYXVsdENvbmZpZyk7IH1cbn0pO1xuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgY29uZmlndXJlcyBjb2RlIGZvbGRpbmcuXG4qL1xuZnVuY3Rpb24gY29kZUZvbGRpbmcoY29uZmlnKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtmb2xkU3RhdGUsIGJhc2VUaGVtZSQxXTtcbiAgICBpZiAoY29uZmlnKVxuICAgICAgICByZXN1bHQucHVzaChmb2xkQ29uZmlnLm9mKGNvbmZpZykpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiB3aWRnZXRUb0RPTSh2aWV3LCBwcmVwYXJlZCkge1xuICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBjb25mID0gc3RhdGUuZmFjZXQoZm9sZENvbmZpZyk7XG4gICAgbGV0IG9uY2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHZpZXcucG9zQXRET00oZXZlbnQudGFyZ2V0KSk7XG4gICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGVkKVxuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHVuZm9sZEVmZmVjdC5vZihmb2xkZWQpIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG4gICAgaWYgKGNvbmYucGxhY2Vob2xkZXJET00pXG4gICAgICAgIHJldHVybiBjb25mLnBsYWNlaG9sZGVyRE9NKHZpZXcsIG9uY2xpY2ssIHByZXBhcmVkKTtcbiAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSBjb25mLnBsYWNlaG9sZGVyVGV4dDtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgc3RhdGUucGhyYXNlKFwiZm9sZGVkIGNvZGVcIikpO1xuICAgIGVsZW1lbnQudGl0bGUgPSBzdGF0ZS5waHJhc2UoXCJ1bmZvbGRcIik7XG4gICAgZWxlbWVudC5jbGFzc05hbWUgPSBcImNtLWZvbGRQbGFjZWhvbGRlclwiO1xuICAgIGVsZW1lbnQub25jbGljayA9IG9uY2xpY2s7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG5jb25zdCBmb2xkV2lkZ2V0ID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ucmVwbGFjZSh7IHdpZGdldDogLypAX19QVVJFX18qL25ldyBjbGFzcyBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgICAgICB0b0RPTSh2aWV3KSB7IHJldHVybiB3aWRnZXRUb0RPTSh2aWV3LCBudWxsKTsgfVxuICAgIH0gfSk7XG5jbGFzcyBQcmVwYXJlZEZvbGRXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiB0aGlzLnZhbHVlID09IG90aGVyLnZhbHVlOyB9XG4gICAgdG9ET00odmlldykgeyByZXR1cm4gd2lkZ2V0VG9ET00odmlldywgdGhpcy52YWx1ZSk7IH1cbn1cbmNvbnN0IGZvbGRHdXR0ZXJEZWZhdWx0cyA9IHtcbiAgICBvcGVuVGV4dDogXCJcdTIzMDRcIixcbiAgICBjbG9zZWRUZXh0OiBcIlx1MjAzQVwiLFxuICAgIG1hcmtlckRPTTogbnVsbCxcbiAgICBkb21FdmVudEhhbmRsZXJzOiB7fSxcbiAgICBmb2xkaW5nQ2hhbmdlZDogKCkgPT4gZmFsc2Vcbn07XG5jbGFzcyBGb2xkTWFya2VyIGV4dGVuZHMgR3V0dGVyTWFya2VyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcsIG9wZW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMub3BlbiA9IG9wZW47XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiB0aGlzLmNvbmZpZyA9PSBvdGhlci5jb25maWcgJiYgdGhpcy5vcGVuID09IG90aGVyLm9wZW47IH1cbiAgICB0b0RPTSh2aWV3KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5tYXJrZXJET00pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcubWFya2VyRE9NKHRoaXMub3Blbik7XG4gICAgICAgIGxldCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLm9wZW4gPyB0aGlzLmNvbmZpZy5vcGVuVGV4dCA6IHRoaXMuY29uZmlnLmNsb3NlZFRleHQ7XG4gICAgICAgIHNwYW4udGl0bGUgPSB2aWV3LnN0YXRlLnBocmFzZSh0aGlzLm9wZW4gPyBcIkZvbGQgbGluZVwiIDogXCJVbmZvbGQgbGluZVwiKTtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfVxufVxuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgcmVnaXN0ZXJzIGEgZm9sZCBndXR0ZXIsIHdoaWNoIHNob3dzIGFcbmZvbGQgc3RhdHVzIGluZGljYXRvciBiZWZvcmUgZm9sZGFibGUgbGluZXMgKHdoaWNoIGNhbiBiZSBjbGlja2VkXG50byBmb2xkIG9yIHVuZm9sZCB0aGUgbGluZSkuXG4qL1xuZnVuY3Rpb24gZm9sZEd1dHRlcihjb25maWcgPSB7fSkge1xuICAgIGxldCBmdWxsQ29uZmlnID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmb2xkR3V0dGVyRGVmYXVsdHMpLCBjb25maWcpO1xuICAgIGxldCBjYW5Gb2xkID0gbmV3IEZvbGRNYXJrZXIoZnVsbENvbmZpZywgdHJ1ZSksIGNhblVuZm9sZCA9IG5ldyBGb2xkTWFya2VyKGZ1bGxDb25maWcsIGZhbHNlKTtcbiAgICBsZXQgbWFya2VycyA9IFZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICAgICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gdmlldy52aWV3cG9ydC5mcm9tO1xuICAgICAgICAgICAgdGhpcy5tYXJrZXJzID0gdGhpcy5idWlsZE1hcmtlcnModmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQgfHxcbiAgICAgICAgICAgICAgICB1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChsYW5ndWFnZSkgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KGxhbmd1YWdlKSB8fFxuICAgICAgICAgICAgICAgIHVwZGF0ZS5zdGFydFN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpICE9IHVwZGF0ZS5zdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKSB8fFxuICAgICAgICAgICAgICAgIHN5bnRheFRyZWUodXBkYXRlLnN0YXJ0U3RhdGUpICE9IHN5bnRheFRyZWUodXBkYXRlLnN0YXRlKSB8fFxuICAgICAgICAgICAgICAgIGZ1bGxDb25maWcuZm9sZGluZ0NoYW5nZWQodXBkYXRlKSlcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlcnMgPSB0aGlzLmJ1aWxkTWFya2Vycyh1cGRhdGUudmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRNYXJrZXJzKHZpZXcpIHtcbiAgICAgICAgICAgIGxldCBidWlsZGVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICAgICAgZm9yIChsZXQgbGluZSBvZiB2aWV3LnZpZXdwb3J0TGluZUJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBtYXJrID0gZmluZEZvbGQodmlldy5zdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKSA/IGNhblVuZm9sZFxuICAgICAgICAgICAgICAgICAgICA6IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50bykgPyBjYW5Gb2xkIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAobWFyaylcbiAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGQobGluZS5mcm9tLCBsaW5lLmZyb20sIG1hcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgeyBkb21FdmVudEhhbmRsZXJzIH0gPSBmdWxsQ29uZmlnO1xuICAgIHJldHVybiBbXG4gICAgICAgIG1hcmtlcnMsXG4gICAgICAgIGd1dHRlcih7XG4gICAgICAgICAgICBjbGFzczogXCJjbS1mb2xkR3V0dGVyXCIsXG4gICAgICAgICAgICBtYXJrZXJzKHZpZXcpIHsgdmFyIF9hOyByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKG1hcmtlcnMpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFya2VycykgfHwgUmFuZ2VTZXQuZW1wdHk7IH0sXG4gICAgICAgICAgICBpbml0aWFsU3BhY2VyKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRm9sZE1hcmtlcihmdWxsQ29uZmlnLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZG9tRXZlbnRIYW5kbGVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkb21FdmVudEhhbmRsZXJzKSwgeyBjbGljazogKHZpZXcsIGxpbmUsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21FdmVudEhhbmRsZXJzLmNsaWNrICYmIGRvbUV2ZW50SGFuZGxlcnMuY2xpY2sodmlldywgbGluZSwgZXZlbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBmb2xkYWJsZSh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBmb2xkRWZmZWN0Lm9mKHJhbmdlKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IH0pXG4gICAgICAgIH0pLFxuICAgICAgICBjb2RlRm9sZGluZygpXG4gICAgXTtcbn1cbmNvbnN0IGJhc2VUaGVtZSQxID0gLypAX19QVVJFX18qL0VkaXRvclZpZXcuYmFzZVRoZW1lKHtcbiAgICBcIi5jbS1mb2xkUGxhY2Vob2xkZXJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2VlZVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNkZGRcIixcbiAgICAgICAgY29sb3I6IFwiIzg4OFwiLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiLjJlbVwiLFxuICAgICAgICBtYXJnaW46IFwiMCAxcHhcIixcbiAgICAgICAgcGFkZGluZzogXCIwIDFweFwiLFxuICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiXG4gICAgfSxcbiAgICBcIi5jbS1mb2xkR3V0dGVyIHNwYW5cIjoge1xuICAgICAgICBwYWRkaW5nOiBcIjAgMXB4XCIsXG4gICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgICB9XG59KTtcblxuLyoqXG5BIGhpZ2hsaWdodCBzdHlsZSBhc3NvY2lhdGVzIENTUyBzdHlsZXMgd2l0aCBoaWdsaWdodGluZ1xuW3RhZ3NdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYjaGlnaGxpZ2h0LlRhZykuXG4qL1xuY2xhc3MgSGlnaGxpZ2h0U3R5bGUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0YWcgc3R5bGVzIHVzZWQgdG8gY3JlYXRlIHRoaXMgaGlnaGxpZ2h0IHN0eWxlLlxuICAgICovXG4gICAgc3BlY3MsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zcGVjcyA9IHNwZWNzO1xuICAgICAgICBsZXQgbW9kU3BlYztcbiAgICAgICAgZnVuY3Rpb24gZGVmKHNwZWMpIHtcbiAgICAgICAgICAgIGxldCBjbHMgPSBTdHlsZU1vZHVsZS5uZXdOYW1lKCk7XG4gICAgICAgICAgICAobW9kU3BlYyB8fCAobW9kU3BlYyA9IE9iamVjdC5jcmVhdGUobnVsbCkpKVtcIi5cIiArIGNsc10gPSBzcGVjO1xuICAgICAgICAgICAgcmV0dXJuIGNscztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGwgPSB0eXBlb2Ygb3B0aW9ucy5hbGwgPT0gXCJzdHJpbmdcIiA/IG9wdGlvbnMuYWxsIDogb3B0aW9ucy5hbGwgPyBkZWYob3B0aW9ucy5hbGwpIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzY29wZU9wdCA9IG9wdGlvbnMuc2NvcGU7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZU9wdCBpbnN0YW5jZW9mIExhbmd1YWdlID8gKHR5cGUpID0+IHR5cGUucHJvcChsYW5ndWFnZURhdGFQcm9wKSA9PSBzY29wZU9wdC5kYXRhXG4gICAgICAgICAgICA6IHNjb3BlT3B0ID8gKHR5cGUpID0+IHR5cGUgPT0gc2NvcGVPcHQgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc3R5bGUgPSB0YWdIaWdobGlnaHRlcihzcGVjcy5tYXAoc3R5bGUgPT4gKHtcbiAgICAgICAgICAgIHRhZzogc3R5bGUudGFnLFxuICAgICAgICAgICAgY2xhc3M6IHN0eWxlLmNsYXNzIHx8IGRlZihPYmplY3QuYXNzaWduKHt9LCBzdHlsZSwgeyB0YWc6IG51bGwgfSkpXG4gICAgICAgIH0pKSwge1xuICAgICAgICAgICAgYWxsLFxuICAgICAgICB9KS5zdHlsZTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2RTcGVjID8gbmV3IFN0eWxlTW9kdWxlKG1vZFNwZWMpIDogbnVsbDtcbiAgICAgICAgdGhpcy50aGVtZVR5cGUgPSBvcHRpb25zLnRoZW1lVHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgaGlnaGxpZ2h0ZXIgc3R5bGUgdGhhdCBhc3NvY2lhdGVzIHRoZSBnaXZlbiBzdHlsZXMgdG9cbiAgICB0aGUgZ2l2ZW4gdGFncy4gVGhlIHNwZWNzIG11c3QgYmUgb2JqZWN0cyB0aGF0IGhvbGQgYSBzdHlsZSB0YWdcbiAgICBvciBhcnJheSBvZiB0YWdzIGluIHRoZWlyIGB0YWdgIHByb3BlcnR5LCBhbmQgZWl0aGVyIGEgc2luZ2xlXG4gICAgYGNsYXNzYCBwcm9wZXJ0eSBwcm92aWRpbmcgYSBzdGF0aWMgQ1NTIGNsYXNzIChmb3IgaGlnaGxpZ2h0ZXJcbiAgICB0aGF0IHJlbHkgb24gZXh0ZXJuYWwgc3R5bGluZyksIG9yIGFcbiAgICBbYHN0eWxlLW1vZGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL3N0eWxlLW1vZCNkb2N1bWVudGF0aW9uKS1zdHlsZVxuICAgIHNldCBvZiBDU1MgcHJvcGVydGllcyAod2hpY2ggZGVmaW5lIHRoZSBzdHlsaW5nIGZvciB0aG9zZSB0YWdzKS5cbiAgICBcbiAgICBUaGUgQ1NTIHJ1bGVzIGNyZWF0ZWQgZm9yIGEgaGlnaGxpZ2h0ZXIgd2lsbCBiZSBlbWl0dGVkIGluIHRoZVxuICAgIG9yZGVyIG9mIHRoZSBzcGVjJ3MgcHJvcGVydGllcy4gVGhhdCBtZWFucyB0aGF0IGZvciBlbGVtZW50cyB0aGF0XG4gICAgaGF2ZSBtdWx0aXBsZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLCBzdHlsZXMgZGVmaW5lZCBmdXJ0aGVyXG4gICAgZG93biBpbiB0aGUgbGlzdCB3aWxsIGhhdmUgYSBoaWdoZXIgQ1NTIHByZWNlZGVuY2UgdGhhbiBzdHlsZXNcbiAgICBkZWZpbmVkIGVhcmxpZXIuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHNwZWNzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgSGlnaGxpZ2h0U3R5bGUoc3BlY3MsIG9wdGlvbnMgfHwge30pO1xuICAgIH1cbn1cbmNvbnN0IGhpZ2hsaWdodGVyRmFjZXQgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBmYWxsYmFja0hpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZSh2YWx1ZXMpIHsgcmV0dXJuIHZhbHVlcy5sZW5ndGggPyBbdmFsdWVzWzBdXSA6IG51bGw7IH1cbn0pO1xuZnVuY3Rpb24gZ2V0SGlnaGxpZ2h0ZXJzKHN0YXRlKSB7XG4gICAgbGV0IG1haW4gPSBzdGF0ZS5mYWNldChoaWdobGlnaHRlckZhY2V0KTtcbiAgICByZXR1cm4gbWFpbi5sZW5ndGggPyBtYWluIDogc3RhdGUuZmFjZXQoZmFsbGJhY2tIaWdobGlnaHRlcik7XG59XG4vKipcbldyYXAgYSBoaWdobGlnaHRlciBpbiBhbiBlZGl0b3IgZXh0ZW5zaW9uIHRoYXQgdXNlcyBpdCB0byBhcHBseVxuc3ludGF4IGhpZ2hsaWdodGluZyB0byB0aGUgZWRpdG9yIGNvbnRlbnQuXG5cbldoZW4gbXVsdGlwbGUgKG5vbi1mYWxsYmFjaykgc3R5bGVzIGFyZSBwcm92aWRlZCwgdGhlIHN0eWxpbmdcbmFwcGxpZWQgaXMgdGhlIHVuaW9uIG9mIHRoZSBjbGFzc2VzIHRoZXkgZW1pdC5cbiovXG5mdW5jdGlvbiBzeW50YXhIaWdobGlnaHRpbmcoaGlnaGxpZ2h0ZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgZXh0ID0gW3RyZWVIaWdobGlnaHRlcl0sIHRoZW1lVHlwZTtcbiAgICBpZiAoaGlnaGxpZ2h0ZXIgaW5zdGFuY2VvZiBIaWdobGlnaHRTdHlsZSkge1xuICAgICAgICBpZiAoaGlnaGxpZ2h0ZXIubW9kdWxlKVxuICAgICAgICAgICAgZXh0LnB1c2goRWRpdG9yVmlldy5zdHlsZU1vZHVsZS5vZihoaWdobGlnaHRlci5tb2R1bGUpKTtcbiAgICAgICAgdGhlbWVUeXBlID0gaGlnaGxpZ2h0ZXIudGhlbWVUeXBlO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZhbGxiYWNrKVxuICAgICAgICBleHQucHVzaChmYWxsYmFja0hpZ2hsaWdodGVyLm9mKGhpZ2hsaWdodGVyKSk7XG4gICAgZWxzZSBpZiAodGhlbWVUeXBlKVxuICAgICAgICBleHQucHVzaChoaWdobGlnaHRlckZhY2V0LmNvbXB1dGVOKFtFZGl0b3JWaWV3LmRhcmtUaGVtZV0sIHN0YXRlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5mYWNldChFZGl0b3JWaWV3LmRhcmtUaGVtZSkgPT0gKHRoZW1lVHlwZSA9PSBcImRhcmtcIikgPyBbaGlnaGxpZ2h0ZXJdIDogW107XG4gICAgICAgIH0pKTtcbiAgICBlbHNlXG4gICAgICAgIGV4dC5wdXNoKGhpZ2hsaWdodGVyRmFjZXQub2YoaGlnaGxpZ2h0ZXIpKTtcbiAgICByZXR1cm4gZXh0O1xufVxuLyoqXG5SZXR1cm5zIHRoZSBDU1MgY2xhc3NlcyAoaWYgYW55KSB0aGF0IHRoZSBoaWdobGlnaHRlcnMgYWN0aXZlIGluXG50aGUgc3RhdGUgd291bGQgYXNzaWduIHRvIHRoZSBnaXZlbiBzdHlsZVxuW3RhZ3NdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYjaGlnaGxpZ2h0LlRhZykgYW5kXG4ob3B0aW9uYWwpIGxhbmd1YWdlXG5bc2NvcGVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuSGlnaGxpZ2h0U3R5bGVeZGVmaW5lXm9wdGlvbnMuc2NvcGUpLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodGluZ0ZvcihzdGF0ZSwgdGFncywgc2NvcGUpIHtcbiAgICBsZXQgaGlnaGxpZ2h0ZXJzID0gZ2V0SGlnaGxpZ2h0ZXJzKHN0YXRlKTtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoaGlnaGxpZ2h0ZXJzKVxuICAgICAgICBmb3IgKGxldCBoaWdobGlnaHRlciBvZiBoaWdobGlnaHRlcnMpIHtcbiAgICAgICAgICAgIGlmICghaGlnaGxpZ2h0ZXIuc2NvcGUgfHwgc2NvcGUgJiYgaGlnaGxpZ2h0ZXIuc2NvcGUoc2NvcGUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNscyA9IGhpZ2hsaWdodGVyLnN0eWxlKHRhZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCA/IHJlc3VsdCArIFwiIFwiICsgY2xzIDogY2xzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNsYXNzIFRyZWVIaWdobGlnaHRlciB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLm1hcmtDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMudHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG4gICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmJ1aWxkRGVjbyh2aWV3LCBnZXRIaWdobGlnaHRlcnModmlldy5zdGF0ZSkpO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCB0cmVlID0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpLCBoaWdobGlnaHRlcnMgPSBnZXRIaWdobGlnaHRlcnModXBkYXRlLnN0YXRlKTtcbiAgICAgICAgbGV0IHN0eWxlQ2hhbmdlID0gaGlnaGxpZ2h0ZXJzICE9IGdldEhpZ2hsaWdodGVycyh1cGRhdGUuc3RhcnRTdGF0ZSk7XG4gICAgICAgIGlmICh0cmVlLmxlbmd0aCA8IHVwZGF0ZS52aWV3LnZpZXdwb3J0LnRvICYmICFzdHlsZUNoYW5nZSAmJiB0cmVlLnR5cGUgPT0gdGhpcy50cmVlLnR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRpb25zLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJlZSAhPSB0aGlzLnRyZWUgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fCBzdHlsZUNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmJ1aWxkRGVjbyh1cGRhdGUudmlldywgaGlnaGxpZ2h0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBidWlsZERlY28odmlldywgaGlnaGxpZ2h0ZXJzKSB7XG4gICAgICAgIGlmICghaGlnaGxpZ2h0ZXJzIHx8ICF0aGlzLnRyZWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiB2aWV3LnZpc2libGVSYW5nZXMpIHtcbiAgICAgICAgICAgIGhpZ2hsaWdodFRyZWUodGhpcy50cmVlLCBoaWdobGlnaHRlcnMsIChmcm9tLCB0bywgc3R5bGUpID0+IHtcbiAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChmcm9tLCB0bywgdGhpcy5tYXJrQ2FjaGVbc3R5bGVdIHx8ICh0aGlzLm1hcmtDYWNoZVtzdHlsZV0gPSBEZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogc3R5bGUgfSkpKTtcbiAgICAgICAgICAgIH0sIGZyb20sIHRvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcbiAgICB9XG59XG5jb25zdCB0cmVlSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovUHJlYy5oaWdoKC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhUcmVlSGlnaGxpZ2h0ZXIsIHtcbiAgICBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zXG59KSk7XG4vKipcbkEgZGVmYXVsdCBoaWdobGlnaHQgc3R5bGUgKHdvcmtzIHdlbGwgd2l0aCBsaWdodCB0aGVtZXMpLlxuKi9cbmNvbnN0IGRlZmF1bHRIaWdobGlnaHRTdHlsZSA9IC8qQF9fUFVSRV9fKi9IaWdobGlnaHRTdHlsZS5kZWZpbmUoW1xuICAgIHsgdGFnOiB0YWdzLm1ldGEsXG4gICAgICAgIGNvbG9yOiBcIiM0MDQ3NDBcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmxpbmssXG4gICAgICAgIHRleHREZWNvcmF0aW9uOiBcInVuZGVybGluZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaGVhZGluZyxcbiAgICAgICAgdGV4dERlY29yYXRpb246IFwidW5kZXJsaW5lXCIsXG4gICAgICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZW1waGFzaXMsXG4gICAgICAgIGZvbnRTdHlsZTogXCJpdGFsaWNcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnN0cm9uZyxcbiAgICAgICAgZm9udFdlaWdodDogXCJib2xkXCIgfSxcbiAgICB7IHRhZzogdGFncy5zdHJpa2V0aHJvdWdoLFxuICAgICAgICB0ZXh0RGVjb3JhdGlvbjogXCJsaW5lLXRocm91Z2hcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmtleXdvcmQsXG4gICAgICAgIGNvbG9yOiBcIiM3MDhcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5hdG9tLCB0YWdzLmJvb2wsIHRhZ3MudXJsLCB0YWdzLmNvbnRlbnRTZXBhcmF0b3IsIHRhZ3MubGFiZWxOYW1lXSxcbiAgICAgICAgY29sb3I6IFwiIzIxOVwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLmxpdGVyYWwsIHRhZ3MuaW5zZXJ0ZWRdLFxuICAgICAgICBjb2xvcjogXCIjMTY0XCIgfSxcbiAgICB7IHRhZzogW3RhZ3Muc3RyaW5nLCB0YWdzLmRlbGV0ZWRdLFxuICAgICAgICBjb2xvcjogXCIjYTExXCIgfSxcbiAgICB7IHRhZzogW3RhZ3MucmVnZXhwLCB0YWdzLmVzY2FwZSwgLypAX19QVVJFX18qL3RhZ3Muc3BlY2lhbCh0YWdzLnN0cmluZyldLFxuICAgICAgICBjb2xvcjogXCIjZTQwXCIgfSxcbiAgICB7IHRhZzogLypAX19QVVJFX18qL3RhZ3MuZGVmaW5pdGlvbih0YWdzLnZhcmlhYmxlTmFtZSksXG4gICAgICAgIGNvbG9yOiBcIiMwMGZcIiB9LFxuICAgIHsgdGFnOiAvKkBfX1BVUkVfXyovdGFncy5sb2NhbCh0YWdzLnZhcmlhYmxlTmFtZSksXG4gICAgICAgIGNvbG9yOiBcIiMzMGFcIiB9LFxuICAgIHsgdGFnOiBbdGFncy50eXBlTmFtZSwgdGFncy5uYW1lc3BhY2VdLFxuICAgICAgICBjb2xvcjogXCIjMDg1XCIgfSxcbiAgICB7IHRhZzogdGFncy5jbGFzc05hbWUsXG4gICAgICAgIGNvbG9yOiBcIiMxNjdcIiB9LFxuICAgIHsgdGFnOiBbLypAX19QVVJFX18qL3RhZ3Muc3BlY2lhbCh0YWdzLnZhcmlhYmxlTmFtZSksIHRhZ3MubWFjcm9OYW1lXSxcbiAgICAgICAgY29sb3I6IFwiIzI1NlwiIH0sXG4gICAgeyB0YWc6IC8qQF9fUFVSRV9fKi90YWdzLmRlZmluaXRpb24odGFncy5wcm9wZXJ0eU5hbWUpLFxuICAgICAgICBjb2xvcjogXCIjMDBjXCIgfSxcbiAgICB7IHRhZzogdGFncy5jb21tZW50LFxuICAgICAgICBjb2xvcjogXCIjOTQwXCIgfSxcbiAgICB7IHRhZzogdGFncy5pbnZhbGlkLFxuICAgICAgICBjb2xvcjogXCIjZjAwXCIgfVxuXSk7XG5cbmNvbnN0IGJhc2VUaGVtZSA9IC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LmJhc2VUaGVtZSh7XG4gICAgXCImLmNtLWZvY3VzZWQgLmNtLW1hdGNoaW5nQnJhY2tldFwiOiB7IGJhY2tncm91bmRDb2xvcjogXCIjMzI4YzgyNTJcIiB9LFxuICAgIFwiJi5jbS1mb2N1c2VkIC5jbS1ub25tYXRjaGluZ0JyYWNrZXRcIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwiI2JiNTU1NTQ0XCIgfVxufSk7XG5jb25zdCBEZWZhdWx0U2NhbkRpc3QgPSAxMDAwMCwgRGVmYXVsdEJyYWNrZXRzID0gXCIoKVtde31cIjtcbmNvbnN0IGJyYWNrZXRNYXRjaGluZ0NvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICByZXR1cm4gY29tYmluZUNvbmZpZyhjb25maWdzLCB7XG4gICAgICAgICAgICBhZnRlckN1cnNvcjogdHJ1ZSxcbiAgICAgICAgICAgIGJyYWNrZXRzOiBEZWZhdWx0QnJhY2tldHMsXG4gICAgICAgICAgICBtYXhTY2FuRGlzdGFuY2U6IERlZmF1bHRTY2FuRGlzdCxcbiAgICAgICAgICAgIHJlbmRlck1hdGNoOiBkZWZhdWx0UmVuZGVyTWF0Y2hcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5jb25zdCBtYXRjaGluZ01hcmsgPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20tbWF0Y2hpbmdCcmFja2V0XCIgfSksIG5vbm1hdGNoaW5nTWFyayA9IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1ub25tYXRjaGluZ0JyYWNrZXRcIiB9KTtcbmZ1bmN0aW9uIGRlZmF1bHRSZW5kZXJNYXRjaChtYXRjaCkge1xuICAgIGxldCBkZWNvcmF0aW9ucyA9IFtdO1xuICAgIGxldCBtYXJrID0gbWF0Y2gubWF0Y2hlZCA/IG1hdGNoaW5nTWFyayA6IG5vbm1hdGNoaW5nTWFyaztcbiAgICBkZWNvcmF0aW9ucy5wdXNoKG1hcmsucmFuZ2UobWF0Y2guc3RhcnQuZnJvbSwgbWF0Y2guc3RhcnQudG8pKTtcbiAgICBpZiAobWF0Y2guZW5kKVxuICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKG1hcmsucmFuZ2UobWF0Y2guZW5kLmZyb20sIG1hdGNoLmVuZC50bykpO1xuICAgIHJldHVybiBkZWNvcmF0aW9ucztcbn1cbmNvbnN0IGJyYWNrZXRNYXRjaGluZ1N0YXRlID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGUoKSB7IHJldHVybiBEZWNvcmF0aW9uLm5vbmU7IH0sXG4gICAgdXBkYXRlKGRlY28sIHRyKSB7XG4gICAgICAgIGlmICghdHIuZG9jQ2hhbmdlZCAmJiAhdHIuc2VsZWN0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIGRlY287XG4gICAgICAgIGxldCBkZWNvcmF0aW9ucyA9IFtdO1xuICAgICAgICBsZXQgY29uZmlnID0gdHIuc3RhdGUuZmFjZXQoYnJhY2tldE1hdGNoaW5nQ29uZmlnKTtcbiAgICAgICAgZm9yIChsZXQgcmFuZ2Ugb2YgdHIuc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQsIC0xLCBjb25maWcpXG4gICAgICAgICAgICAgICAgfHwgKHJhbmdlLmhlYWQgPiAwICYmIG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQgLSAxLCAxLCBjb25maWcpKVxuICAgICAgICAgICAgICAgIHx8IChjb25maWcuYWZ0ZXJDdXJzb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgKG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQsIDEsIGNvbmZpZykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyYW5nZS5oZWFkIDwgdHIuc3RhdGUuZG9jLmxlbmd0aCAmJiBtYXRjaEJyYWNrZXRzKHRyLnN0YXRlLCByYW5nZS5oZWFkICsgMSwgLTEsIGNvbmZpZykpKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2gpXG4gICAgICAgICAgICAgICAgZGVjb3JhdGlvbnMgPSBkZWNvcmF0aW9ucy5jb25jYXQoY29uZmlnLnJlbmRlck1hdGNoKG1hdGNoLCB0ci5zdGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChkZWNvcmF0aW9ucywgdHJ1ZSk7XG4gICAgfSxcbiAgICBwcm92aWRlOiBmID0+IEVkaXRvclZpZXcuZGVjb3JhdGlvbnMuZnJvbShmKVxufSk7XG5jb25zdCBicmFja2V0TWF0Y2hpbmdVbmlxdWUgPSBbXG4gICAgYnJhY2tldE1hdGNoaW5nU3RhdGUsXG4gICAgYmFzZVRoZW1lXG5dO1xuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyBicmFja2V0IG1hdGNoaW5nLiBXaGVuZXZlciB0aGVcbmN1cnNvciBpcyBuZXh0IHRvIGEgYnJhY2tldCwgdGhhdCBicmFja2V0IGFuZCB0aGUgb25lIGl0IG1hdGNoZXNcbmFyZSBoaWdobGlnaHRlZC4gT3IsIHdoZW4gbm8gbWF0Y2hpbmcgYnJhY2tldCBpcyBmb3VuZCwgYW5vdGhlclxuaGlnaGxpZ2h0aW5nIHN0eWxlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhpcy5cbiovXG5mdW5jdGlvbiBicmFja2V0TWF0Y2hpbmcoY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW2JyYWNrZXRNYXRjaGluZ0NvbmZpZy5vZihjb25maWcpLCBicmFja2V0TWF0Y2hpbmdVbmlxdWVdO1xufVxuLyoqXG5XaGVuIGxhcmdlciBzeW50YXggbm9kZXMsIHN1Y2ggYXMgSFRNTCB0YWdzLCBhcmUgbWFya2VkIGFzXG5vcGVuaW5nL2Nsb3NpbmcsIGl0IGNhbiBiZSBhIGJpdCBtZXNzeSB0byB0cmVhdCB0aGUgd2hvbGUgbm9kZSBhc1xuYSBtYXRjaGFibGUgYnJhY2tldC4gVGhpcyBub2RlIHByb3AgYWxsb3dzIHlvdSB0byBkZWZpbmUsIGZvciBzdWNoXG5hIG5vZGUsIGEgXHUyMDE4aGFuZGxlXHUyMDE5XHUyMDE0dGhlIHBhcnQgb2YgdGhlIG5vZGUgdGhhdCBpcyBoaWdobGlnaHRlZCwgYW5kXG50aGF0IHRoZSBjdXJzb3IgbXVzdCBiZSBvbiB0byBhY3RpdmF0ZSBoaWdobGlnaHRpbmcgaW4gdGhlIGZpcnN0XG5wbGFjZS5cbiovXG5jb25zdCBicmFja2V0TWF0Y2hpbmdIYW5kbGUgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG5mdW5jdGlvbiBtYXRjaGluZ05vZGVzKG5vZGUsIGRpciwgYnJhY2tldHMpIHtcbiAgICBsZXQgYnlQcm9wID0gbm9kZS5wcm9wKGRpciA8IDAgPyBOb2RlUHJvcC5vcGVuZWRCeSA6IE5vZGVQcm9wLmNsb3NlZEJ5KTtcbiAgICBpZiAoYnlQcm9wKVxuICAgICAgICByZXR1cm4gYnlQcm9wO1xuICAgIGlmIChub2RlLm5hbWUubGVuZ3RoID09IDEpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gYnJhY2tldHMuaW5kZXhPZihub2RlLm5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSAmJiBpbmRleCAlIDIgPT0gKGRpciA8IDAgPyAxIDogMCkpXG4gICAgICAgICAgICByZXR1cm4gW2JyYWNrZXRzW2luZGV4ICsgZGlyXV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZmluZEhhbmRsZShub2RlKSB7XG4gICAgbGV0IGhhc0hhbmRsZSA9IG5vZGUudHlwZS5wcm9wKGJyYWNrZXRNYXRjaGluZ0hhbmRsZSk7XG4gICAgcmV0dXJuIGhhc0hhbmRsZSA/IGhhc0hhbmRsZShub2RlLm5vZGUpIDogbm9kZTtcbn1cbi8qKlxuRmluZCB0aGUgbWF0Y2hpbmcgYnJhY2tldCBmb3IgdGhlIHRva2VuIGF0IGBwb3NgLCBzY2FubmluZ1xuZGlyZWN0aW9uIGBkaXJgLiBPbmx5IHRoZSBgYnJhY2tldHNgIGFuZCBgbWF4U2NhbkRpc3RhbmNlYFxucHJvcGVydGllcyBhcmUgdXNlZCBmcm9tIGBjb25maWdgLCBpZiBnaXZlbi4gUmV0dXJucyBudWxsIGlmIG5vXG5icmFja2V0IHdhcyBmb3VuZCBhdCBgcG9zYCwgb3IgYSBtYXRjaCByZXN1bHQgb3RoZXJ3aXNlLlxuKi9cbmZ1bmN0aW9uIG1hdGNoQnJhY2tldHMoc3RhdGUsIHBvcywgZGlyLCBjb25maWcgPSB7fSkge1xuICAgIGxldCBtYXhTY2FuRGlzdGFuY2UgPSBjb25maWcubWF4U2NhbkRpc3RhbmNlIHx8IERlZmF1bHRTY2FuRGlzdCwgYnJhY2tldHMgPSBjb25maWcuYnJhY2tldHMgfHwgRGVmYXVsdEJyYWNrZXRzO1xuICAgIGxldCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSksIG5vZGUgPSB0cmVlLnJlc29sdmVJbm5lcihwb3MsIGRpcik7XG4gICAgZm9yIChsZXQgY3VyID0gbm9kZTsgY3VyOyBjdXIgPSBjdXIucGFyZW50KSB7XG4gICAgICAgIGxldCBtYXRjaGVzID0gbWF0Y2hpbmdOb2RlcyhjdXIudHlwZSwgZGlyLCBicmFja2V0cyk7XG4gICAgICAgIGlmIChtYXRjaGVzICYmIGN1ci5mcm9tIDwgY3VyLnRvKSB7XG4gICAgICAgICAgICBsZXQgaGFuZGxlID0gZmluZEhhbmRsZShjdXIpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZSAmJiAoZGlyID4gMCA/IHBvcyA+PSBoYW5kbGUuZnJvbSAmJiBwb3MgPCBoYW5kbGUudG8gOiBwb3MgPiBoYW5kbGUuZnJvbSAmJiBwb3MgPD0gaGFuZGxlLnRvKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hNYXJrZWRCcmFja2V0cyhzdGF0ZSwgcG9zLCBkaXIsIGN1ciwgaGFuZGxlLCBtYXRjaGVzLCBicmFja2V0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoUGxhaW5CcmFja2V0cyhzdGF0ZSwgcG9zLCBkaXIsIHRyZWUsIG5vZGUudHlwZSwgbWF4U2NhbkRpc3RhbmNlLCBicmFja2V0cyk7XG59XG5mdW5jdGlvbiBtYXRjaE1hcmtlZEJyYWNrZXRzKF9zdGF0ZSwgX3BvcywgZGlyLCB0b2tlbiwgaGFuZGxlLCBtYXRjaGluZywgYnJhY2tldHMpIHtcbiAgICBsZXQgcGFyZW50ID0gdG9rZW4ucGFyZW50LCBmaXJzdFRva2VuID0geyBmcm9tOiBoYW5kbGUuZnJvbSwgdG86IGhhbmRsZS50byB9O1xuICAgIGxldCBkZXB0aCA9IDAsIGN1cnNvciA9IHBhcmVudCA9PT0gbnVsbCB8fCBwYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmVudC5jdXJzb3IoKTtcbiAgICBpZiAoY3Vyc29yICYmIChkaXIgPCAwID8gY3Vyc29yLmNoaWxkQmVmb3JlKHRva2VuLmZyb20pIDogY3Vyc29yLmNoaWxkQWZ0ZXIodG9rZW4udG8pKSlcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGRpciA8IDAgPyBjdXJzb3IudG8gPD0gdG9rZW4uZnJvbSA6IGN1cnNvci5mcm9tID49IHRva2VuLnRvKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDAgJiYgbWF0Y2hpbmcuaW5kZXhPZihjdXJzb3IudHlwZS5uYW1lKSA+IC0xICYmIGN1cnNvci5mcm9tIDwgY3Vyc29yLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbmRIYW5kbGUgPSBmaW5kSGFuZGxlKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBmaXJzdFRva2VuLCBlbmQ6IGVuZEhhbmRsZSA/IHsgZnJvbTogZW5kSGFuZGxlLmZyb20sIHRvOiBlbmRIYW5kbGUudG8gfSA6IHVuZGVmaW5lZCwgbWF0Y2hlZDogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaGluZ05vZGVzKGN1cnNvci50eXBlLCBkaXIsIGJyYWNrZXRzKSkge1xuICAgICAgICAgICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaGluZ05vZGVzKGN1cnNvci50eXBlLCAtZGlyLCBicmFja2V0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbmRIYW5kbGUgPSBmaW5kSGFuZGxlKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBmaXJzdFRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogZW5kSGFuZGxlICYmIGVuZEhhbmRsZS5mcm9tIDwgZW5kSGFuZGxlLnRvID8geyBmcm9tOiBlbmRIYW5kbGUuZnJvbSwgdG86IGVuZEhhbmRsZS50byB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChkaXIgPCAwID8gY3Vyc29yLnByZXZTaWJsaW5nKCkgOiBjdXJzb3IubmV4dFNpYmxpbmcoKSk7XG4gICAgcmV0dXJuIHsgc3RhcnQ6IGZpcnN0VG9rZW4sIG1hdGNoZWQ6IGZhbHNlIH07XG59XG5mdW5jdGlvbiBtYXRjaFBsYWluQnJhY2tldHMoc3RhdGUsIHBvcywgZGlyLCB0cmVlLCB0b2tlblR5cGUsIG1heFNjYW5EaXN0YW5jZSwgYnJhY2tldHMpIHtcbiAgICBsZXQgc3RhcnRDaCA9IGRpciA8IDAgPyBzdGF0ZS5zbGljZURvYyhwb3MgLSAxLCBwb3MpIDogc3RhdGUuc2xpY2VEb2MocG9zLCBwb3MgKyAxKTtcbiAgICBsZXQgYnJhY2tldCA9IGJyYWNrZXRzLmluZGV4T2Yoc3RhcnRDaCk7XG4gICAgaWYgKGJyYWNrZXQgPCAwIHx8IChicmFja2V0ICUgMiA9PSAwKSAhPSAoZGlyID4gMCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBzdGFydFRva2VuID0geyBmcm9tOiBkaXIgPCAwID8gcG9zIC0gMSA6IHBvcywgdG86IGRpciA+IDAgPyBwb3MgKyAxIDogcG9zIH07XG4gICAgbGV0IGl0ZXIgPSBzdGF0ZS5kb2MuaXRlclJhbmdlKHBvcywgZGlyID4gMCA/IHN0YXRlLmRvYy5sZW5ndGggOiAwKSwgZGVwdGggPSAwO1xuICAgIGZvciAobGV0IGRpc3RhbmNlID0gMDsgIShpdGVyLm5leHQoKSkuZG9uZSAmJiBkaXN0YW5jZSA8PSBtYXhTY2FuRGlzdGFuY2U7KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gaXRlci52YWx1ZTtcbiAgICAgICAgaWYgKGRpciA8IDApXG4gICAgICAgICAgICBkaXN0YW5jZSArPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgbGV0IGJhc2VQb3MgPSBwb3MgKyBkaXN0YW5jZSAqIGRpcjtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gZGlyID4gMCA/IDAgOiB0ZXh0Lmxlbmd0aCAtIDEsIGVuZCA9IGRpciA+IDAgPyB0ZXh0Lmxlbmd0aCA6IC0xOyBwb3MgIT0gZW5kOyBwb3MgKz0gZGlyKSB7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBicmFja2V0cy5pbmRleE9mKHRleHRbcG9zXSk7XG4gICAgICAgICAgICBpZiAoZm91bmQgPCAwIHx8IHRyZWUucmVzb2x2ZUlubmVyKGJhc2VQb3MgKyBwb3MsIDEpLnR5cGUgIT0gdG9rZW5UeXBlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKChmb3VuZCAlIDIgPT0gMCkgPT0gKGRpciA+IDApKSB7XG4gICAgICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRlcHRoID09IDEpIHsgLy8gQ2xvc2luZ1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydFRva2VuLCBlbmQ6IHsgZnJvbTogYmFzZVBvcyArIHBvcywgdG86IGJhc2VQb3MgKyBwb3MgKyAxIH0sIG1hdGNoZWQ6IChmb3VuZCA+PiAxKSA9PSAoYnJhY2tldCA+PiAxKSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlyID4gMClcbiAgICAgICAgICAgIGRpc3RhbmNlICs9IHRleHQubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gaXRlci5kb25lID8geyBzdGFydDogc3RhcnRUb2tlbiwgbWF0Y2hlZDogZmFsc2UgfSA6IG51bGw7XG59XG5cbi8vIENvdW50cyB0aGUgY29sdW1uIG9mZnNldCBpbiBhIHN0cmluZywgdGFraW5nIHRhYnMgaW50byBhY2NvdW50LlxuLy8gVXNlZCBtb3N0bHkgdG8gZmluZCBpbmRlbnRhdGlvbi5cbmZ1bmN0aW9uIGNvdW50Q29sKHN0cmluZywgZW5kLCB0YWJTaXplLCBzdGFydEluZGV4ID0gMCwgc3RhcnRWYWx1ZSA9IDApIHtcbiAgICBpZiAoZW5kID09IG51bGwpIHtcbiAgICAgICAgZW5kID0gc3RyaW5nLnNlYXJjaCgvW15cXHNcXHUwMGEwXS8pO1xuICAgICAgICBpZiAoZW5kID09IC0xKVxuICAgICAgICAgICAgZW5kID0gc3RyaW5nLmxlbmd0aDtcbiAgICB9XG4gICAgbGV0IG4gPSBzdGFydFZhbHVlO1xuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KGkpID09IDkpXG4gICAgICAgICAgICBuICs9IHRhYlNpemUgLSAobiAlIHRhYlNpemUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuKys7XG4gICAgfVxuICAgIHJldHVybiBuO1xufVxuLyoqXG5FbmNhcHN1bGF0ZXMgYSBzaW5nbGUgbGluZSBvZiBpbnB1dC4gR2l2ZW4gdG8gc3RyZWFtIHN5bnRheCBjb2RlLFxud2hpY2ggdXNlcyBpdCB0byB0b2tlbml6ZSB0aGUgY29udGVudC5cbiovXG5jbGFzcyBTdHJpbmdTdHJlYW0ge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHN0cmVhbS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBsaW5lLlxuICAgICovXG4gICAgc3RyaW5nLCB0YWJTaXplLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBpbmRlbnQgdW5pdCBzaXplLlxuICAgICovXG4gICAgaW5kZW50VW5pdCwgb3ZlcnJpZGVJbmRlbnQpIHtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgICAgIHRoaXMudGFiU2l6ZSA9IHRhYlNpemU7XG4gICAgICAgIHRoaXMuaW5kZW50VW5pdCA9IGluZGVudFVuaXQ7XG4gICAgICAgIHRoaXMub3ZlcnJpZGVJbmRlbnQgPSBvdmVycmlkZUluZGVudDtcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBsaW5lLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4uXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhcnQgPSAwO1xuICAgICAgICB0aGlzLmxhc3RDb2x1bW5Qb3MgPSAwO1xuICAgICAgICB0aGlzLmxhc3RDb2x1bW5WYWx1ZSA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFRydWUgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBlb2woKSB7IHJldHVybiB0aGlzLnBvcyA+PSB0aGlzLnN0cmluZy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBUcnVlIGlmIHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBzb2woKSB7IHJldHVybiB0aGlzLnBvcyA9PSAwOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBuZXh0IGNvZGUgdW5pdCBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbiwgb3IgdW5kZWZpbmVkXG4gICAgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIHBlZWsoKSB7IHJldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpIHx8IHVuZGVmaW5lZDsgfVxuICAgIC8qKlxuICAgIFJlYWQgdGhlIG5leHQgY29kZSB1bml0IGFuZCBhZHZhbmNlIGB0aGlzLnBvc2AuXG4gICAgKi9cbiAgICBuZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5wb3MgPCB0aGlzLnN0cmluZy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKyspO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXRjaCB0aGUgbmV4dCBjaGFyYWN0ZXIgYWdhaW5zdCB0aGUgZ2l2ZW4gc3RyaW5nLCByZWd1bGFyXG4gICAgZXhwcmVzc2lvbiwgb3IgcHJlZGljYXRlLiBDb25zdW1lIGFuZCByZXR1cm4gaXQgaWYgaXQgbWF0Y2hlcy5cbiAgICAqL1xuICAgIGVhdChtYXRjaCkge1xuICAgICAgICBsZXQgY2ggPSB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpO1xuICAgICAgICBsZXQgb2s7XG4gICAgICAgIGlmICh0eXBlb2YgbWF0Y2ggPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIG9rID0gY2ggPT0gbWF0Y2g7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG9rID0gY2ggJiYgKG1hdGNoIGluc3RhbmNlb2YgUmVnRXhwID8gbWF0Y2gudGVzdChjaCkgOiBtYXRjaChjaCkpO1xuICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgICAgICByZXR1cm4gY2g7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ29udGludWUgbWF0Y2hpbmcgY2hhcmFjdGVycyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBzdHJpbmcsXG4gICAgcmVndWxhciBleHByZXNzaW9uLCBvciBwcmVkaWNhdGUgZnVuY3Rpb24uIFJldHVybiB0cnVlIGlmIGFueVxuICAgIGNoYXJhY3RlcnMgd2VyZSBjb25zdW1lZC5cbiAgICAqL1xuICAgIGVhdFdoaWxlKG1hdGNoKSB7XG4gICAgICAgIGxldCBzdGFydCA9IHRoaXMucG9zO1xuICAgICAgICB3aGlsZSAodGhpcy5lYXQobWF0Y2gpKSB7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnN1bWUgd2hpdGVzcGFjZSBhaGVhZCBvZiBgdGhpcy5wb3NgLiBSZXR1cm4gdHJ1ZSBpZiBhbnkgd2FzXG4gICAgZm91bmQuXG4gICAgKi9cbiAgICBlYXRTcGFjZSgpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICgvW1xcc1xcdTAwYTBdLy50ZXN0KHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykpKVxuICAgICAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIHNraXBUb0VuZCgpIHsgdGhpcy5wb3MgPSB0aGlzLnN0cmluZy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIGRpcmVjdGx5IGJlZm9yZSB0aGUgZ2l2ZW4gY2hhcmFjdGVyLCBpZiBmb3VuZCBvbiB0aGVcbiAgICBjdXJyZW50IGxpbmUuXG4gICAgKi9cbiAgICBza2lwVG8oY2gpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gdGhpcy5zdHJpbmcuaW5kZXhPZihjaCwgdGhpcy5wb3MpO1xuICAgICAgICBpZiAoZm91bmQgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBmb3VuZDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYmFjayBgbmAgY2hhcmFjdGVycy5cbiAgICAqL1xuICAgIGJhY2tVcChuKSB7IHRoaXMucG9zIC09IG47IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNvbHVtbiBwb3NpdGlvbiBhdCBgdGhpcy5wb3NgLlxuICAgICovXG4gICAgY29sdW1uKCkge1xuICAgICAgICBpZiAodGhpcy5sYXN0Q29sdW1uUG9zIDwgdGhpcy5zdGFydCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0Q29sdW1uVmFsdWUgPSBjb3VudENvbCh0aGlzLnN0cmluZywgdGhpcy5zdGFydCwgdGhpcy50YWJTaXplLCB0aGlzLmxhc3RDb2x1bW5Qb3MsIHRoaXMubGFzdENvbHVtblZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMubGFzdENvbHVtblBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdENvbHVtblZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGluZGVudGF0aW9uIGNvbHVtbiBvZiB0aGUgY3VycmVudCBsaW5lLlxuICAgICovXG4gICAgaW5kZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMub3ZlcnJpZGVJbmRlbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvdW50Q29sKHRoaXMuc3RyaW5nLCBudWxsLCB0aGlzLnRhYlNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXRjaCB0aGUgaW5wdXQgYWdhaW5zdCB0aGUgZ2l2ZW4gc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgICh3aGljaCBzaG91bGQgc3RhcnQgd2l0aCBhIGBeYCkuIFJldHVybiB0cnVlIG9yIHRoZSByZWdleHAgbWF0Y2hcbiAgICBpZiBpdCBtYXRjaGVzLlxuICAgIFxuICAgIFVubGVzcyBgY29uc3VtZWAgaXMgc2V0IHRvIGBmYWxzZWAsIHRoaXMgd2lsbCBtb3ZlIGB0aGlzLnBvc2BcbiAgICBwYXN0IHRoZSBtYXRjaGVkIHRleHQuXG4gICAgXG4gICAgV2hlbiBtYXRjaGluZyBhIHN0cmluZyBgY2FzZUluc2Vuc2l0aXZlYCBjYW4gYmUgc2V0IHRvIHRydWUgdG9cbiAgICBtYWtlIHRoZSBtYXRjaCBjYXNlLWluc2Vuc2l0aXZlLlxuICAgICovXG4gICAgbWF0Y2gocGF0dGVybiwgY29uc3VtZSwgY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsZXQgY2FzZWQgPSAoc3RyKSA9PiBjYXNlSW5zZW5zaXRpdmUgPyBzdHIudG9Mb3dlckNhc2UoKSA6IHN0cjtcbiAgICAgICAgICAgIGxldCBzdWJzdHIgPSB0aGlzLnN0cmluZy5zdWJzdHIodGhpcy5wb3MsIHBhdHRlcm4ubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChjYXNlZChzdWJzdHIpID09IGNhc2VkKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnN1bWUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcyArPSBwYXR0ZXJuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMucG9zKS5tYXRjaChwYXR0ZXJuKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5pbmRleCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAobWF0Y2ggJiYgY29uc3VtZSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgdGhpcy5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY3VycmVudCB0b2tlbi5cbiAgICAqL1xuICAgIGN1cnJlbnQoKSB7IHJldHVybiB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLnBvcyk7IH1cbn1cblxuZnVuY3Rpb24gZnVsbFBhcnNlcihzcGVjKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogc3BlYy5uYW1lIHx8IFwiXCIsXG4gICAgICAgIHRva2VuOiBzcGVjLnRva2VuLFxuICAgICAgICBibGFua0xpbmU6IHNwZWMuYmxhbmtMaW5lIHx8ICgoKSA9PiB7IH0pLFxuICAgICAgICBzdGFydFN0YXRlOiBzcGVjLnN0YXJ0U3RhdGUgfHwgKCgpID0+IHRydWUpLFxuICAgICAgICBjb3B5U3RhdGU6IHNwZWMuY29weVN0YXRlIHx8IGRlZmF1bHRDb3B5U3RhdGUsXG4gICAgICAgIGluZGVudDogc3BlYy5pbmRlbnQgfHwgKCgpID0+IG51bGwpLFxuICAgICAgICBsYW5ndWFnZURhdGE6IHNwZWMubGFuZ3VhZ2VEYXRhIHx8IHt9LFxuICAgICAgICB0b2tlblRhYmxlOiBzcGVjLnRva2VuVGFibGUgfHwgbm9Ub2tlbnNcbiAgICB9O1xufVxuZnVuY3Rpb24gZGVmYXVsdENvcHlTdGF0ZShzdGF0ZSkge1xuICAgIGlmICh0eXBlb2Ygc3RhdGUgIT0gXCJvYmplY3RcIilcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIGxldCBuZXdTdGF0ZSA9IHt9O1xuICAgIGZvciAobGV0IHByb3AgaW4gc3RhdGUpIHtcbiAgICAgICAgbGV0IHZhbCA9IHN0YXRlW3Byb3BdO1xuICAgICAgICBuZXdTdGF0ZVtwcm9wXSA9ICh2YWwgaW5zdGFuY2VvZiBBcnJheSA/IHZhbC5zbGljZSgpIDogdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1N0YXRlO1xufVxuY29uc3QgSW5kZW50ZWRGcm9tID0gLypAX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4vKipcbkEgW2xhbmd1YWdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSBjbGFzcyBiYXNlZCBvbiBhIENvZGVNaXJyb3JcbjUtc3R5bGUgW3N0cmVhbWluZyBwYXJzZXJdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuU3RyZWFtUGFyc2VyKS5cbiovXG5jbGFzcyBTdHJlYW1MYW5ndWFnZSBleHRlbmRzIExhbmd1YWdlIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBkZWZpbmVMYW5ndWFnZUZhY2V0KHBhcnNlci5sYW5ndWFnZURhdGEpO1xuICAgICAgICBsZXQgcCA9IGZ1bGxQYXJzZXIocGFyc2VyKSwgc2VsZjtcbiAgICAgICAgbGV0IGltcGwgPSBuZXcgY2xhc3MgZXh0ZW5kcyBQYXJzZXIge1xuICAgICAgICAgICAgY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJzZShzZWxmLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzdXBlcihkYXRhLCBpbXBsLCBbaW5kZW50U2VydmljZS5vZigoY3gsIHBvcykgPT4gdGhpcy5nZXRJbmRlbnQoY3gsIHBvcykpXSwgcGFyc2VyLm5hbWUpO1xuICAgICAgICB0aGlzLnRvcE5vZGUgPSBkb2NJRChkYXRhKTtcbiAgICAgICAgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuc3RyZWFtUGFyc2VyID0gcDtcbiAgICAgICAgdGhpcy5zdGF0ZUFmdGVyID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy50b2tlblRhYmxlID0gcGFyc2VyLnRva2VuVGFibGUgPyBuZXcgVG9rZW5UYWJsZShwLnRva2VuVGFibGUpIDogZGVmYXVsdFRva2VuVGFibGU7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHN0cmVhbSBsYW5ndWFnZS5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlYykgeyByZXR1cm4gbmV3IFN0cmVhbUxhbmd1YWdlKHNwZWMpOyB9XG4gICAgZ2V0SW5kZW50KGN4LCBwb3MpIHtcbiAgICAgICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKGN4LnN0YXRlKSwgYXQgPSB0cmVlLnJlc29sdmUocG9zKTtcbiAgICAgICAgd2hpbGUgKGF0ICYmIGF0LnR5cGUgIT0gdGhpcy50b3BOb2RlKVxuICAgICAgICAgICAgYXQgPSBhdC5wYXJlbnQ7XG4gICAgICAgIGlmICghYXQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGZyb20gPSB1bmRlZmluZWQ7XG4gICAgICAgIGxldCB7IG92ZXJyaWRlSW5kZW50YXRpb24gfSA9IGN4Lm9wdGlvbnM7XG4gICAgICAgIGlmIChvdmVycmlkZUluZGVudGF0aW9uKSB7XG4gICAgICAgICAgICBmcm9tID0gSW5kZW50ZWRGcm9tLmdldChjeC5zdGF0ZSk7XG4gICAgICAgICAgICBpZiAoZnJvbSAhPSBudWxsICYmIGZyb20gPCBwb3MgLSAxZTQpXG4gICAgICAgICAgICAgICAgZnJvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnQgPSBmaW5kU3RhdGUodGhpcywgdHJlZSwgMCwgYXQuZnJvbSwgZnJvbSAhPT0gbnVsbCAmJiBmcm9tICE9PSB2b2lkIDAgPyBmcm9tIDogcG9zKSwgc3RhdGVQb3MsIHN0YXRlO1xuICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gc3RhcnQuc3RhdGU7XG4gICAgICAgICAgICBzdGF0ZVBvcyA9IHN0YXJ0LnBvcyArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHRoaXMuc3RyZWFtUGFyc2VyLnN0YXJ0U3RhdGUoY3gudW5pdCk7XG4gICAgICAgICAgICBzdGF0ZVBvcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyAtIHN0YXRlUG9zID4gMTAwMDAgLyogQy5NYXhJbmRlbnRTY2FuRGlzdCAqLylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB3aGlsZSAoc3RhdGVQb3MgPCBwb3MpIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gY3guc3RhdGUuZG9jLmxpbmVBdChzdGF0ZVBvcyksIGVuZCA9IE1hdGgubWluKHBvcywgbGluZS50byk7XG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZW50YXRpb24gPSBvdmVycmlkZUluZGVudGF0aW9uID8gb3ZlcnJpZGVJbmRlbnRhdGlvbihsaW5lLmZyb20pIDogLTE7XG4gICAgICAgICAgICAgICAgbGV0IHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0obGluZS50ZXh0LCBjeC5zdGF0ZS50YWJTaXplLCBjeC51bml0LCBpbmRlbnRhdGlvbiA8IDAgPyB1bmRlZmluZWQgOiBpbmRlbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHN0cmVhbS5wb3MgPCBlbmQgLSBsaW5lLmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHJlYWRUb2tlbih0aGlzLnN0cmVhbVBhcnNlci50b2tlbiwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbVBhcnNlci5ibGFua0xpbmUoc3RhdGUsIGN4LnVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVuZCA9PSBwb3MpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBzdGF0ZVBvcyA9IGxpbmUudG8gKyAxO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lID0gY3gubGluZUF0KHBvcyk7XG4gICAgICAgIGlmIChvdmVycmlkZUluZGVudGF0aW9uICYmIGZyb20gPT0gbnVsbClcbiAgICAgICAgICAgIEluZGVudGVkRnJvbS5zZXQoY3guc3RhdGUsIGxpbmUuZnJvbSk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbVBhcnNlci5pbmRlbnQoc3RhdGUsIC9eXFxzKiguKikvLmV4ZWMobGluZS50ZXh0KVsxXSwgY3gpO1xuICAgIH1cbiAgICBnZXQgYWxsb3dzTmVzdGluZygpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5mdW5jdGlvbiBmaW5kU3RhdGUobGFuZywgdHJlZSwgb2ZmLCBzdGFydFBvcywgYmVmb3JlKSB7XG4gICAgbGV0IHN0YXRlID0gb2ZmID49IHN0YXJ0UG9zICYmIG9mZiArIHRyZWUubGVuZ3RoIDw9IGJlZm9yZSAmJiB0cmVlLnByb3AobGFuZy5zdGF0ZUFmdGVyKTtcbiAgICBpZiAoc3RhdGUpXG4gICAgICAgIHJldHVybiB7IHN0YXRlOiBsYW5nLnN0cmVhbVBhcnNlci5jb3B5U3RhdGUoc3RhdGUpLCBwb3M6IG9mZiArIHRyZWUubGVuZ3RoIH07XG4gICAgZm9yIChsZXQgaSA9IHRyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IGNoaWxkID0gdHJlZS5jaGlsZHJlbltpXSwgcG9zID0gb2ZmICsgdHJlZS5wb3NpdGlvbnNbaV07XG4gICAgICAgIGxldCBmb3VuZCA9IGNoaWxkIGluc3RhbmNlb2YgVHJlZSAmJiBwb3MgPCBiZWZvcmUgJiYgZmluZFN0YXRlKGxhbmcsIGNoaWxkLCBwb3MsIHN0YXJ0UG9zLCBiZWZvcmUpO1xuICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY3V0VHJlZShsYW5nLCB0cmVlLCBmcm9tLCB0bywgaW5zaWRlKSB7XG4gICAgaWYgKGluc2lkZSAmJiBmcm9tIDw9IDAgJiYgdG8gPj0gdHJlZS5sZW5ndGgpXG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgIGlmICghaW5zaWRlICYmIHRyZWUudHlwZSA9PSBsYW5nLnRvcE5vZGUpXG4gICAgICAgIGluc2lkZSA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IHRyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IHBvcyA9IHRyZWUucG9zaXRpb25zW2ldLCBjaGlsZCA9IHRyZWUuY2hpbGRyZW5baV0sIGlubmVyO1xuICAgICAgICBpZiAocG9zIDwgdG8gJiYgY2hpbGQgaW5zdGFuY2VvZiBUcmVlKSB7XG4gICAgICAgICAgICBpZiAoIShpbm5lciA9IGN1dFRyZWUobGFuZywgY2hpbGQsIGZyb20gLSBwb3MsIHRvIC0gcG9zLCBpbnNpZGUpKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHJldHVybiAhaW5zaWRlID8gaW5uZXJcbiAgICAgICAgICAgICAgICA6IG5ldyBUcmVlKHRyZWUudHlwZSwgdHJlZS5jaGlsZHJlbi5zbGljZSgwLCBpKS5jb25jYXQoaW5uZXIpLCB0cmVlLnBvc2l0aW9ucy5zbGljZSgwLCBpICsgMSksIHBvcyArIGlubmVyLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBmaW5kU3RhcnRJbkZyYWdtZW50cyhsYW5nLCBmcmFnbWVudHMsIHN0YXJ0UG9zLCBlZGl0b3JTdGF0ZSkge1xuICAgIGZvciAobGV0IGYgb2YgZnJhZ21lbnRzKSB7XG4gICAgICAgIGxldCBmcm9tID0gZi5mcm9tICsgKGYub3BlblN0YXJ0ID8gMjUgOiAwKSwgdG8gPSBmLnRvIC0gKGYub3BlbkVuZCA/IDI1IDogMCk7XG4gICAgICAgIGxldCBmb3VuZCA9IGZyb20gPD0gc3RhcnRQb3MgJiYgdG8gPiBzdGFydFBvcyAmJiBmaW5kU3RhdGUobGFuZywgZi50cmVlLCAwIC0gZi5vZmZzZXQsIHN0YXJ0UG9zLCB0byksIHRyZWU7XG4gICAgICAgIGlmIChmb3VuZCAmJiAodHJlZSA9IGN1dFRyZWUobGFuZywgZi50cmVlLCBzdGFydFBvcyArIGYub2Zmc2V0LCBmb3VuZC5wb3MgKyBmLm9mZnNldCwgZmFsc2UpKSlcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXRlOiBmb3VuZC5zdGF0ZSwgdHJlZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzdGF0ZTogbGFuZy5zdHJlYW1QYXJzZXIuc3RhcnRTdGF0ZShlZGl0b3JTdGF0ZSA/IGdldEluZGVudFVuaXQoZWRpdG9yU3RhdGUpIDogNCksIHRyZWU6IFRyZWUuZW1wdHkgfTtcbn1cbmNsYXNzIFBhcnNlIHtcbiAgICBjb25zdHJ1Y3RvcihsYW5nLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy5sYW5nID0gbGFuZztcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cztcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1BvcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rID0gW107XG4gICAgICAgIHRoaXMuY2h1bmtSZXVzZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IDA7XG4gICAgICAgIHRoaXMudG8gPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLnRvO1xuICAgICAgICBsZXQgY29udGV4dCA9IFBhcnNlQ29udGV4dC5nZXQoKSwgZnJvbSA9IHJhbmdlc1swXS5mcm9tO1xuICAgICAgICBsZXQgeyBzdGF0ZSwgdHJlZSB9ID0gZmluZFN0YXJ0SW5GcmFnbWVudHMobGFuZywgZnJhZ21lbnRzLCBmcm9tLCBjb250ZXh0ID09PSBudWxsIHx8IGNvbnRleHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbnRleHQuc3RhdGUpO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMucGFyc2VkUG9zID0gdGhpcy5jaHVua1N0YXJ0ID0gZnJvbSArIHRyZWUubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyZWUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtzLnB1c2godHJlZS5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB0aGlzLmNodW5rUG9zLnB1c2godHJlZS5wb3NpdGlvbnNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250ZXh0ICYmIHRoaXMucGFyc2VkUG9zIDwgY29udGV4dC52aWV3cG9ydC5mcm9tIC0gMTAwMDAwIC8qIEMuTWF4RGlzdGFuY2VCZWZvcmVWaWV3cG9ydCAqLykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMubGFuZy5zdHJlYW1QYXJzZXIuc3RhcnRTdGF0ZShnZXRJbmRlbnRVbml0KGNvbnRleHQuc3RhdGUpKTtcbiAgICAgICAgICAgIGNvbnRleHQuc2tpcFVudGlsSW5WaWV3KHRoaXMucGFyc2VkUG9zLCBjb250ZXh0LnZpZXdwb3J0LmZyb20pO1xuICAgICAgICAgICAgdGhpcy5wYXJzZWRQb3MgPSBjb250ZXh0LnZpZXdwb3J0LmZyb207XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb3ZlUmFuZ2VJbmRleCgpO1xuICAgIH1cbiAgICBhZHZhbmNlKCkge1xuICAgICAgICBsZXQgY29udGV4dCA9IFBhcnNlQ29udGV4dC5nZXQoKTtcbiAgICAgICAgbGV0IHBhcnNlRW5kID0gdGhpcy5zdG9wcGVkQXQgPT0gbnVsbCA/IHRoaXMudG8gOiBNYXRoLm1pbih0aGlzLnRvLCB0aGlzLnN0b3BwZWRBdCk7XG4gICAgICAgIGxldCBlbmQgPSBNYXRoLm1pbihwYXJzZUVuZCwgdGhpcy5jaHVua1N0YXJ0ICsgMjA0OCAvKiBDLkNodW5rU2l6ZSAqLyk7XG4gICAgICAgIGlmIChjb250ZXh0KVxuICAgICAgICAgICAgZW5kID0gTWF0aC5taW4oZW5kLCBjb250ZXh0LnZpZXdwb3J0LnRvKTtcbiAgICAgICAgd2hpbGUgKHRoaXMucGFyc2VkUG9zIDwgZW5kKVxuICAgICAgICAgICAgdGhpcy5wYXJzZUxpbmUoY29udGV4dCk7XG4gICAgICAgIGlmICh0aGlzLmNodW5rU3RhcnQgPCB0aGlzLnBhcnNlZFBvcylcbiAgICAgICAgICAgIHRoaXMuZmluaXNoQ2h1bmsoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyc2VkUG9zID49IHBhcnNlRW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoKCk7XG4gICAgICAgIGlmIChjb250ZXh0ICYmIHRoaXMucGFyc2VkUG9zID49IGNvbnRleHQudmlld3BvcnQudG8pIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2tpcFVudGlsSW5WaWV3KHRoaXMucGFyc2VkUG9zLCBwYXJzZUVuZCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2goKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc3RvcEF0KHBvcykge1xuICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IHBvcztcbiAgICB9XG4gICAgbGluZUFmdGVyKHBvcykge1xuICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLmlucHV0LmNodW5rKHBvcyk7XG4gICAgICAgIGlmICghdGhpcy5pbnB1dC5saW5lQ2h1bmtzKSB7XG4gICAgICAgICAgICBsZXQgZW9sID0gY2h1bmsuaW5kZXhPZihcIlxcblwiKTtcbiAgICAgICAgICAgIGlmIChlb2wgPiAtMSlcbiAgICAgICAgICAgICAgICBjaHVuayA9IGNodW5rLnNsaWNlKDAsIGVvbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2h1bmsgPT0gXCJcXG5cIikge1xuICAgICAgICAgICAgY2h1bmsgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3MgKyBjaHVuay5sZW5ndGggPD0gdGhpcy50byA/IGNodW5rIDogY2h1bmsuc2xpY2UoMCwgdGhpcy50byAtIHBvcyk7XG4gICAgfVxuICAgIG5leHRMaW5lKCkge1xuICAgICAgICBsZXQgZnJvbSA9IHRoaXMucGFyc2VkUG9zLCBsaW5lID0gdGhpcy5saW5lQWZ0ZXIoZnJvbSksIGVuZCA9IGZyb20gKyBsaW5lLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSB0aGlzLnJhbmdlSW5kZXg7Oykge1xuICAgICAgICAgICAgbGV0IHJhbmdlRW5kID0gdGhpcy5yYW5nZXNbaW5kZXhdLnRvO1xuICAgICAgICAgICAgaWYgKHJhbmdlRW5kID49IGVuZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNsaWNlKDAsIHJhbmdlRW5kIC0gKGVuZCAtIGxpbmUubGVuZ3RoKSk7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IHRoaXMucmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCByYW5nZVN0YXJ0ID0gdGhpcy5yYW5nZXNbaW5kZXhdLmZyb207XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSB0aGlzLmxpbmVBZnRlcihyYW5nZVN0YXJ0KTtcbiAgICAgICAgICAgIGxpbmUgKz0gYWZ0ZXI7XG4gICAgICAgICAgICBlbmQgPSByYW5nZVN0YXJ0ICsgYWZ0ZXIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGxpbmUsIGVuZCB9O1xuICAgIH1cbiAgICBza2lwR2Fwc1RvKHBvcywgb2Zmc2V0LCBzaWRlKSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBlbmQgPSB0aGlzLnJhbmdlc1t0aGlzLnJhbmdlSW5kZXhdLnRvLCBvZmZQb3MgPSBwb3MgKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoc2lkZSA+IDAgPyBlbmQgPiBvZmZQb3MgOiBlbmQgPj0gb2ZmUG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5yYW5nZXNbKyt0aGlzLnJhbmdlSW5kZXhdLmZyb207XG4gICAgICAgICAgICBvZmZzZXQgKz0gc3RhcnQgLSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgbW92ZVJhbmdlSW5kZXgoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnJhbmdlc1t0aGlzLnJhbmdlSW5kZXhdLnRvIDwgdGhpcy5wYXJzZWRQb3MpXG4gICAgICAgICAgICB0aGlzLnJhbmdlSW5kZXgrKztcbiAgICB9XG4gICAgZW1pdFRva2VuKGlkLCBmcm9tLCB0bywgc2l6ZSwgb2Zmc2V0KSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnNraXBHYXBzVG8oZnJvbSwgb2Zmc2V0LCAxKTtcbiAgICAgICAgICAgIGZyb20gKz0gb2Zmc2V0O1xuICAgICAgICAgICAgbGV0IGxlbjAgPSB0aGlzLmNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuc2tpcEdhcHNUbyh0bywgb2Zmc2V0LCAtMSk7XG4gICAgICAgICAgICB0byArPSBvZmZzZXQ7XG4gICAgICAgICAgICBzaXplICs9IHRoaXMuY2h1bmsubGVuZ3RoIC0gbGVuMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNodW5rLnB1c2goaWQsIGZyb20sIHRvLCBzaXplKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgcGFyc2VMaW5lKGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHsgbGluZSwgZW5kIH0gPSB0aGlzLm5leHRMaW5lKCksIG9mZnNldCA9IDAsIHsgc3RyZWFtUGFyc2VyIH0gPSB0aGlzLmxhbmc7XG4gICAgICAgIGxldCBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKGxpbmUsIGNvbnRleHQgPyBjb250ZXh0LnN0YXRlLnRhYlNpemUgOiA0LCBjb250ZXh0ID8gZ2V0SW5kZW50VW5pdChjb250ZXh0LnN0YXRlKSA6IDIpO1xuICAgICAgICBpZiAoc3RyZWFtLmVvbCgpKSB7XG4gICAgICAgICAgICBzdHJlYW1QYXJzZXIuYmxhbmtMaW5lKHRoaXMuc3RhdGUsIHN0cmVhbS5pbmRlbnRVbml0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRva2VuID0gcmVhZFRva2VuKHN0cmVhbVBhcnNlci50b2tlbiwgc3RyZWFtLCB0aGlzLnN0YXRlKTtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4pXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuZW1pdFRva2VuKHRoaXMubGFuZy50b2tlblRhYmxlLnJlc29sdmUodG9rZW4pLCB0aGlzLnBhcnNlZFBvcyArIHN0cmVhbS5zdGFydCwgdGhpcy5wYXJzZWRQb3MgKyBzdHJlYW0ucG9zLCA0LCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uc3RhcnQgPiAxMDAwMCAvKiBDLk1heExpbmVMZW5ndGggKi8pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFyc2VkUG9zID0gZW5kO1xuICAgICAgICB0aGlzLm1vdmVSYW5nZUluZGV4KCk7XG4gICAgICAgIGlmICh0aGlzLnBhcnNlZFBvcyA8IHRoaXMudG8pXG4gICAgICAgICAgICB0aGlzLnBhcnNlZFBvcysrO1xuICAgIH1cbiAgICBmaW5pc2hDaHVuaygpIHtcbiAgICAgICAgbGV0IHRyZWUgPSBUcmVlLmJ1aWxkKHtcbiAgICAgICAgICAgIGJ1ZmZlcjogdGhpcy5jaHVuayxcbiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmNodW5rU3RhcnQsXG4gICAgICAgICAgICBsZW5ndGg6IHRoaXMucGFyc2VkUG9zIC0gdGhpcy5jaHVua1N0YXJ0LFxuICAgICAgICAgICAgbm9kZVNldCxcbiAgICAgICAgICAgIHRvcElEOiAwLFxuICAgICAgICAgICAgbWF4QnVmZmVyTGVuZ3RoOiAyMDQ4IC8qIEMuQ2h1bmtTaXplICovLFxuICAgICAgICAgICAgcmV1c2VkOiB0aGlzLmNodW5rUmV1c2VkXG4gICAgICAgIH0pO1xuICAgICAgICB0cmVlID0gbmV3IFRyZWUodHJlZS50eXBlLCB0cmVlLmNoaWxkcmVuLCB0cmVlLnBvc2l0aW9ucywgdHJlZS5sZW5ndGgsIFtbdGhpcy5sYW5nLnN0YXRlQWZ0ZXIsIHRoaXMubGFuZy5zdHJlYW1QYXJzZXIuY29weVN0YXRlKHRoaXMuc3RhdGUpXV0pO1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKHRyZWUpO1xuICAgICAgICB0aGlzLmNodW5rUG9zLnB1c2godGhpcy5jaHVua1N0YXJ0IC0gdGhpcy5yYW5nZXNbMF0uZnJvbSk7XG4gICAgICAgIHRoaXMuY2h1bmsgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1JldXNlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jaHVua1N0YXJ0ID0gdGhpcy5wYXJzZWRQb3M7XG4gICAgfVxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlKHRoaXMubGFuZy50b3BOb2RlLCB0aGlzLmNodW5rcywgdGhpcy5jaHVua1BvcywgdGhpcy5wYXJzZWRQb3MgLSB0aGlzLnJhbmdlc1swXS5mcm9tKS5iYWxhbmNlKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVhZFRva2VuKHRva2VuLCBzdHJlYW0sIHN0YXRlKSB7XG4gICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRva2VuKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgICBpZiAoc3RyZWFtLnBvcyA+IHN0cmVhbS5zdGFydClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlN0cmVhbSBwYXJzZXIgZmFpbGVkIHRvIGFkdmFuY2Ugc3RyZWFtLlwiKTtcbn1cbmNvbnN0IG5vVG9rZW5zID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5jb25zdCB0eXBlQXJyYXkgPSBbTm9kZVR5cGUubm9uZV07XG5jb25zdCBub2RlU2V0ID0gLypAX19QVVJFX18qL25ldyBOb2RlU2V0KHR5cGVBcnJheSk7XG5jb25zdCB3YXJuZWQgPSBbXTtcbi8vIENhY2hlIG9mIG5vZGUgdHlwZXMgYnkgbmFtZSBhbmQgdGFnc1xuY29uc3QgYnlUYWcgPSAvKkBfX1BVUkVfXyovT2JqZWN0LmNyZWF0ZShudWxsKTtcbmNvbnN0IGRlZmF1bHRUYWJsZSA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuZm9yIChsZXQgW2xlZ2FjeU5hbWUsIG5hbWVdIG9mIFtcbiAgICBbXCJ2YXJpYWJsZVwiLCBcInZhcmlhYmxlTmFtZVwiXSxcbiAgICBbXCJ2YXJpYWJsZS0yXCIsIFwidmFyaWFibGVOYW1lLnNwZWNpYWxcIl0sXG4gICAgW1wic3RyaW5nLTJcIiwgXCJzdHJpbmcuc3BlY2lhbFwiXSxcbiAgICBbXCJkZWZcIiwgXCJ2YXJpYWJsZU5hbWUuZGVmaW5pdGlvblwiXSxcbiAgICBbXCJ0YWdcIiwgXCJ0YWdOYW1lXCJdLFxuICAgIFtcImF0dHJpYnV0ZVwiLCBcImF0dHJpYnV0ZU5hbWVcIl0sXG4gICAgW1widHlwZVwiLCBcInR5cGVOYW1lXCJdLFxuICAgIFtcImJ1aWx0aW5cIiwgXCJ2YXJpYWJsZU5hbWUuc3RhbmRhcmRcIl0sXG4gICAgW1wicXVhbGlmaWVyXCIsIFwibW9kaWZpZXJcIl0sXG4gICAgW1wiZXJyb3JcIiwgXCJpbnZhbGlkXCJdLFxuICAgIFtcImhlYWRlclwiLCBcImhlYWRpbmdcIl0sXG4gICAgW1wicHJvcGVydHlcIiwgXCJwcm9wZXJ0eU5hbWVcIl1cbl0pXG4gICAgZGVmYXVsdFRhYmxlW2xlZ2FjeU5hbWVdID0gLypAX19QVVJFX18qL2NyZWF0ZVRva2VuVHlwZShub1Rva2VucywgbmFtZSk7XG5jbGFzcyBUb2tlblRhYmxlIHtcbiAgICBjb25zdHJ1Y3RvcihleHRyYSkge1xuICAgICAgICB0aGlzLmV4dHJhID0gZXh0cmE7XG4gICAgICAgIHRoaXMudGFibGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIGRlZmF1bHRUYWJsZSk7XG4gICAgfVxuICAgIHJlc29sdmUodGFnKSB7XG4gICAgICAgIHJldHVybiAhdGFnID8gMCA6IHRoaXMudGFibGVbdGFnXSB8fCAodGhpcy50YWJsZVt0YWddID0gY3JlYXRlVG9rZW5UeXBlKHRoaXMuZXh0cmEsIHRhZykpO1xuICAgIH1cbn1cbmNvbnN0IGRlZmF1bHRUb2tlblRhYmxlID0gLypAX19QVVJFX18qL25ldyBUb2tlblRhYmxlKG5vVG9rZW5zKTtcbmZ1bmN0aW9uIHdhcm5Gb3JQYXJ0KHBhcnQsIG1zZykge1xuICAgIGlmICh3YXJuZWQuaW5kZXhPZihwYXJ0KSA+IC0xKVxuICAgICAgICByZXR1cm47XG4gICAgd2FybmVkLnB1c2gocGFydCk7XG4gICAgY29uc29sZS53YXJuKG1zZyk7XG59XG5mdW5jdGlvbiBjcmVhdGVUb2tlblR5cGUoZXh0cmEsIHRhZ1N0cikge1xuICAgIGxldCB0YWdzJDEgPSBbXTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIHRhZ1N0ci5zcGxpdChcIiBcIikpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gW107XG4gICAgICAgIGZvciAobGV0IHBhcnQgb2YgbmFtZS5zcGxpdChcIi5cIikpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IChleHRyYVtwYXJ0XSB8fCB0YWdzW3BhcnRdKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB3YXJuRm9yUGFydChwYXJ0LCBgVW5rbm93biBoaWdobGlnaHRpbmcgdGFnICR7cGFydH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgd2FybkZvclBhcnQocGFydCwgYE1vZGlmaWVyICR7cGFydH0gdXNlZCBhdCBzdGFydCBvZiB0YWdgKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZm91bmQubWFwKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHdhcm5Gb3JQYXJ0KHBhcnQsIGBUYWcgJHtwYXJ0fSB1c2VkIGFzIG1vZGlmaWVyYCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHRhZyBvZiBmb3VuZClcbiAgICAgICAgICAgIHRhZ3MkMS5wdXNoKHRhZyk7XG4gICAgfVxuICAgIGlmICghdGFncyQxLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgbGV0IG5hbWUgPSB0YWdTdHIucmVwbGFjZSgvIC9nLCBcIl9cIiksIGtleSA9IG5hbWUgKyBcIiBcIiArIHRhZ3MkMS5tYXAodCA9PiB0LmlkKTtcbiAgICBsZXQga25vd24gPSBieVRhZ1trZXldO1xuICAgIGlmIChrbm93bilcbiAgICAgICAgcmV0dXJuIGtub3duLmlkO1xuICAgIGxldCB0eXBlID0gYnlUYWdba2V5XSA9IE5vZGVUeXBlLmRlZmluZSh7XG4gICAgICAgIGlkOiB0eXBlQXJyYXkubGVuZ3RoLFxuICAgICAgICBuYW1lLFxuICAgICAgICBwcm9wczogW3N0eWxlVGFncyh7IFtuYW1lXTogdGFncyQxIH0pXVxuICAgIH0pO1xuICAgIHR5cGVBcnJheS5wdXNoKHR5cGUpO1xuICAgIHJldHVybiB0eXBlLmlkO1xufVxuZnVuY3Rpb24gZG9jSUQoZGF0YSkge1xuICAgIGxldCB0eXBlID0gTm9kZVR5cGUuZGVmaW5lKHsgaWQ6IHR5cGVBcnJheS5sZW5ndGgsIG5hbWU6IFwiRG9jdW1lbnRcIiwgcHJvcHM6IFtsYW5ndWFnZURhdGFQcm9wLmFkZCgoKSA9PiBkYXRhKV0sIHRvcDogdHJ1ZSB9KTtcbiAgICB0eXBlQXJyYXkucHVzaCh0eXBlKTtcbiAgICByZXR1cm4gdHlwZTtcbn1cblxuZnVuY3Rpb24gYnVpbGRGb3JMaW5lKGxpbmUpIHtcbiAgICByZXR1cm4gbGluZS5sZW5ndGggPD0gNDA5NiAmJiAvW1xcdTA1OTAtXFx1MDVmNFxcdTA2MDAtXFx1MDZmZlxcdTA3MDAtXFx1MDhhY1xcdWZiNTAtXFx1ZmRmZl0vLnRlc3QobGluZSk7XG59XG5mdW5jdGlvbiB0ZXh0SGFzUlRMKHRleHQpIHtcbiAgICBmb3IgKGxldCBpID0gdGV4dC5pdGVyKCk7ICFpLm5leHQoKS5kb25lOylcbiAgICAgICAgaWYgKGJ1aWxkRm9yTGluZShpLnZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNoYW5nZUFkZHNSVEwoY2hhbmdlKSB7XG4gICAgbGV0IGFkZGVkID0gZmFsc2U7XG4gICAgY2hhbmdlLml0ZXJDaGFuZ2VzKChmQSwgdEEsIGZCLCB0QiwgaW5zKSA9PiB7XG4gICAgICAgIGlmICghYWRkZWQgJiYgdGV4dEhhc1JUTChpbnMpKVxuICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiBhZGRlZDtcbn1cbmNvbnN0IGFsd2F5c0lzb2xhdGUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5zb21lKHggPT4geCkgfSk7XG4vKipcbk1ha2Ugc3VyZSBub2Rlc1xuW21hcmtlZF0oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbW9uLk5vZGVQcm9wXmlzb2xhdGUpXG5hcyBpc29sYXRpbmcgZm9yIGJpZGlyZWN0aW9uYWwgdGV4dCBhcmUgcmVuZGVyZWQgaW4gYSB3YXkgdGhhdFxuaXNvbGF0ZXMgdGhlbSBmcm9tIHRoZSBzdXJyb3VuZGluZyB0ZXh0LlxuKi9cbmZ1bmN0aW9uIGJpZGlJc29sYXRlcyhvcHRpb25zID0ge30pIHtcbiAgICBsZXQgZXh0ZW5zaW9ucyA9IFtpc29sYXRlTWFya3NdO1xuICAgIGlmIChvcHRpb25zLmFsd2F5c0lzb2xhdGUpXG4gICAgICAgIGV4dGVuc2lvbnMucHVzaChhbHdheXNJc29sYXRlLm9mKHRydWUpKTtcbiAgICByZXR1cm4gZXh0ZW5zaW9ucztcbn1cbmNvbnN0IGlzb2xhdGVNYXJrcyA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLmFsd2F5cyA9IHZpZXcuc3RhdGUuZmFjZXQoYWx3YXlzSXNvbGF0ZSkgfHxcbiAgICAgICAgICAgIHZpZXcudGV4dERpcmVjdGlvbiAhPSBEaXJlY3Rpb24uTFRSIHx8XG4gICAgICAgICAgICB2aWV3LnN0YXRlLmZhY2V0KEVkaXRvclZpZXcucGVyTGluZVRleHREaXJlY3Rpb24pO1xuICAgICAgICB0aGlzLmhhc1JUTCA9ICF0aGlzLmFsd2F5cyAmJiB0ZXh0SGFzUlRMKHZpZXcuc3RhdGUuZG9jKTtcbiAgICAgICAgdGhpcy50cmVlID0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IGJ1aWxkRGVjbyh2aWV3LCB0aGlzLnRyZWUsIHRoaXMuYWx3YXlzKTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBsZXQgYWx3YXlzID0gdXBkYXRlLnN0YXRlLmZhY2V0KGFsd2F5c0lzb2xhdGUpIHx8XG4gICAgICAgICAgICB1cGRhdGUudmlldy50ZXh0RGlyZWN0aW9uICE9IERpcmVjdGlvbi5MVFIgfHxcbiAgICAgICAgICAgIHVwZGF0ZS5zdGF0ZS5mYWNldChFZGl0b3JWaWV3LnBlckxpbmVUZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKCFhbHdheXMgJiYgIXRoaXMuaGFzUlRMICYmIGNoYW5nZUFkZHNSVEwodXBkYXRlLmNoYW5nZXMpKVxuICAgICAgICAgICAgdGhpcy5oYXNSVEwgPSB0cnVlO1xuICAgICAgICBpZiAoIWFsd2F5cyAmJiAhdGhpcy5oYXNSVEwpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB0cmVlID0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpO1xuICAgICAgICBpZiAoYWx3YXlzICE9IHRoaXMuYWx3YXlzIHx8IHRyZWUgIT0gdGhpcy50cmVlIHx8IHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgICAgICB0aGlzLmFsd2F5cyA9IGFsd2F5cztcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSBidWlsZERlY28odXBkYXRlLnZpZXcsIHRyZWUsIGFsd2F5cyk7XG4gICAgICAgIH1cbiAgICB9XG59LCB7XG4gICAgcHJvdmlkZTogcGx1Z2luID0+IHtcbiAgICAgICAgZnVuY3Rpb24gYWNjZXNzKHZpZXcpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdmlldy5wbHVnaW4ocGx1Z2luKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY29yYXRpb25zKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtFZGl0b3JWaWV3Lm91dGVyRGVjb3JhdGlvbnMub2YoYWNjZXNzKSxcbiAgICAgICAgICAgIFByZWMubG93ZXN0KEVkaXRvclZpZXcuYmlkaUlzb2xhdGVkUmFuZ2VzLm9mKGFjY2VzcykpXTtcbiAgICB9XG59KTtcbmZ1bmN0aW9uIGJ1aWxkRGVjbyh2aWV3LCB0cmVlLCBhbHdheXMpIHtcbiAgICBsZXQgZGVjbyA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICBsZXQgcmFuZ2VzID0gdmlldy52aXNpYmxlUmFuZ2VzO1xuICAgIGlmICghYWx3YXlzKVxuICAgICAgICByYW5nZXMgPSBjbGlwUlRMTGluZXMocmFuZ2VzLCB2aWV3LnN0YXRlLmRvYyk7XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHJhbmdlcykge1xuICAgICAgICB0cmVlLml0ZXJhdGUoe1xuICAgICAgICAgICAgZW50ZXI6IG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc28gPSBub2RlLnR5cGUucHJvcChOb2RlUHJvcC5pc29sYXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNvKVxuICAgICAgICAgICAgICAgICAgICBkZWNvLmFkZChub2RlLmZyb20sIG5vZGUudG8sIG1hcmtzW2lzb10pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZyb20sIHRvXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGVjby5maW5pc2goKTtcbn1cbmZ1bmN0aW9uIGNsaXBSVExMaW5lcyhyYW5nZXMsIGRvYykge1xuICAgIGxldCBjdXIgPSBkb2MuaXRlcigpLCBwb3MgPSAwLCByZXN1bHQgPSBbXSwgbGFzdCA9IG51bGw7XG4gICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHJhbmdlcykge1xuICAgICAgICBpZiAoZnJvbSAhPSBwb3MpIHtcbiAgICAgICAgICAgIGlmIChwb3MgPCBmcm9tKVxuICAgICAgICAgICAgICAgIGN1ci5uZXh0KGZyb20gLSBwb3MpO1xuICAgICAgICAgICAgcG9zID0gZnJvbTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBwb3MsIGVuZCA9IHBvcyArIGN1ci52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoIWN1ci5saW5lQnJlYWsgJiYgYnVpbGRGb3JMaW5lKGN1ci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdCAmJiBsYXN0LnRvID4gc3RhcnQgLSAxMClcbiAgICAgICAgICAgICAgICAgICAgbGFzdC50byA9IE1hdGgubWluKHRvLCBlbmQpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobGFzdCA9IHsgZnJvbTogc3RhcnQsIHRvOiBNYXRoLm1pbih0bywgZW5kKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgPj0gdG8pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgICAgICBjdXIubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBtYXJrcyA9IHtcbiAgICBydGw6IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1pc29cIiwgaW5jbHVzaXZlOiB0cnVlLCBhdHRyaWJ1dGVzOiB7IGRpcjogXCJydGxcIiB9LCBiaWRpSXNvbGF0ZTogRGlyZWN0aW9uLlJUTCB9KSxcbiAgICBsdHI6IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1pc29cIiwgaW5jbHVzaXZlOiB0cnVlLCBhdHRyaWJ1dGVzOiB7IGRpcjogXCJsdHJcIiB9LCBiaWRpSXNvbGF0ZTogRGlyZWN0aW9uLkxUUiB9KSxcbiAgICBhdXRvOiAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20taXNvXCIsIGluY2x1c2l2ZTogdHJ1ZSwgYXR0cmlidXRlczogeyBkaXI6IFwiYXV0b1wiIH0sIGJpZGlJc29sYXRlOiBudWxsIH0pXG59O1xuXG5leHBvcnQgeyBEb2NJbnB1dCwgSGlnaGxpZ2h0U3R5bGUsIEluZGVudENvbnRleHQsIExSTGFuZ3VhZ2UsIExhbmd1YWdlLCBMYW5ndWFnZURlc2NyaXB0aW9uLCBMYW5ndWFnZVN1cHBvcnQsIFBhcnNlQ29udGV4dCwgU3RyZWFtTGFuZ3VhZ2UsIFN0cmluZ1N0cmVhbSwgVHJlZUluZGVudENvbnRleHQsIGJpZGlJc29sYXRlcywgYnJhY2tldE1hdGNoaW5nLCBicmFja2V0TWF0Y2hpbmdIYW5kbGUsIGNvZGVGb2xkaW5nLCBjb250aW51ZWRJbmRlbnQsIGRlZmF1bHRIaWdobGlnaHRTdHlsZSwgZGVmaW5lTGFuZ3VhZ2VGYWNldCwgZGVsaW1pdGVkSW5kZW50LCBlbnN1cmVTeW50YXhUcmVlLCBmbGF0SW5kZW50LCBmb2xkQWxsLCBmb2xkQ29kZSwgZm9sZEVmZmVjdCwgZm9sZEd1dHRlciwgZm9sZEluc2lkZSwgZm9sZEtleW1hcCwgZm9sZE5vZGVQcm9wLCBmb2xkU2VydmljZSwgZm9sZFN0YXRlLCBmb2xkYWJsZSwgZm9sZGVkUmFuZ2VzLCBmb3JjZVBhcnNpbmcsIGdldEluZGVudFVuaXQsIGdldEluZGVudGF0aW9uLCBoaWdobGlnaHRpbmdGb3IsIGluZGVudE5vZGVQcm9wLCBpbmRlbnRPbklucHV0LCBpbmRlbnRSYW5nZSwgaW5kZW50U2VydmljZSwgaW5kZW50U3RyaW5nLCBpbmRlbnRVbml0LCBsYW5ndWFnZSwgbGFuZ3VhZ2VEYXRhUHJvcCwgbWF0Y2hCcmFja2V0cywgc3VibGFuZ3VhZ2VQcm9wLCBzeW50YXhIaWdobGlnaHRpbmcsIHN5bnRheFBhcnNlclJ1bm5pbmcsIHN5bnRheFRyZWUsIHN5bnRheFRyZWVBdmFpbGFibGUsIHRvZ2dsZUZvbGQsIHVuZm9sZEFsbCwgdW5mb2xkQ29kZSwgdW5mb2xkRWZmZWN0IH07XG4iLCAiaW1wb3J0IHsgUGFyc2VyLCBOb2RlUHJvcCwgTm9kZVNldCwgTm9kZVR5cGUsIERlZmF1bHRCdWZmZXJMZW5ndGgsIFRyZWUsIEl0ZXJNb2RlIH0gZnJvbSAnQGxlemVyL2NvbW1vbic7XG5cbi8qKlxuQSBwYXJzZSBzdGFjay4gVGhlc2UgYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgcGFyc2VyIHRvIHRyYWNrXG5wYXJzaW5nIHByb2dyZXNzLiBUaGV5IGFsc28gcHJvdmlkZSBzb21lIHByb3BlcnRpZXMgYW5kIG1ldGhvZHNcbnRoYXQgZXh0ZXJuYWwgY29kZSBzdWNoIGFzIGEgdG9rZW5pemVyIGNhbiB1c2UgdG8gZ2V0IGluZm9ybWF0aW9uXG5hYm91dCB0aGUgcGFyc2Ugc3RhdGUuXG4qL1xuY2xhc3MgU3RhY2sge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHBhcnNlIHRoYXQgdGhpcyBzdGFjayBpcyBwYXJ0IG9mIEBpbnRlcm5hbFxuICAgICovXG4gICAgcCwgXG4gICAgLyoqXG4gICAgSG9sZHMgc3RhdGUsIGlucHV0IHBvcywgYnVmZmVyIGluZGV4IHRyaXBsZXRzIGZvciBhbGwgYnV0IHRoZVxuICAgIHRvcCBzdGF0ZSBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YWNrLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBwYXJzZSBzdGF0ZSBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRlLCBcbiAgICAvLyBUaGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlIG5leHQgcmVkdWNlIHNob3VsZCB0YWtlIHBsYWNlLiBUaGlzXG4gICAgLy8gY2FuIGJlIGxlc3MgdGhhbiBgdGhpcy5wb3NgIHdoZW4gc2tpcHBlZCBleHByZXNzaW9ucyBoYXZlIGJlZW5cbiAgICAvLyBhZGRlZCB0byB0aGUgc3RhY2sgKHdoaWNoIHNob3VsZCBiZSBtb3ZlZCBvdXRzaWRlIG9mIHRoZSBuZXh0XG4gICAgLy8gcmVkdWN0aW9uKVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVkdWNlUG9zLCBcbiAgICAvKipcbiAgICBUaGUgaW5wdXQgcG9zaXRpb24gdXAgdG8gd2hpY2ggdGhpcyBzdGFjayBoYXMgcGFyc2VkLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBUaGUgZHluYW1pYyBzY29yZSBvZiB0aGUgc3RhY2ssIGluY2x1ZGluZyBkeW5hbWljIHByZWNlZGVuY2VcbiAgICBhbmQgZXJyb3ItcmVjb3ZlcnkgcGVuYWx0aWVzXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzY29yZSwgXG4gICAgLy8gVGhlIG91dHB1dCBidWZmZXIuIEhvbGRzICh0eXBlLCBzdGFydCwgZW5kLCBzaXplKSBxdWFkc1xuICAgIC8vIHJlcHJlc2VudGluZyBub2RlcyBjcmVhdGVkIGJ5IHRoZSBwYXJzZXIsIHdoZXJlIGBzaXplYCBpc1xuICAgIC8vIGFtb3VudCBvZiBidWZmZXIgYXJyYXkgZW50cmllcyBjb3ZlcmVkIGJ5IHRoaXMgbm9kZS5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGJ1ZmZlciwgXG4gICAgLy8gVGhlIGJhc2Ugb2Zmc2V0IG9mIHRoZSBidWZmZXIuIFdoZW4gc3RhY2tzIGFyZSBzcGxpdCwgdGhlIHNwbGl0XG4gICAgLy8gaW5zdGFuY2Ugc2hhcmVkIHRoZSBidWZmZXIgaGlzdG9yeSB3aXRoIGl0cyBwYXJlbnQgdXAgdG9cbiAgICAvLyBgYnVmZmVyQmFzZWAsIHdoaWNoIGlzIHRoZSBhYnNvbHV0ZSBvZmZzZXQgKGluY2x1ZGluZyB0aGVcbiAgICAvLyBvZmZzZXQgb2YgcHJldmlvdXMgc3BsaXRzKSBpbnRvIHRoZSBidWZmZXIgYXQgd2hpY2ggdGhpcyBzdGFja1xuICAgIC8vIHN0YXJ0cyB3cml0aW5nLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYnVmZmVyQmFzZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjdXJDb250ZXh0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGxvb2tBaGVhZCA9IDAsIFxuICAgIC8vIEEgcGFyZW50IHN0YWNrIGZyb20gd2hpY2ggdGhpcyB3YXMgc3BsaXQgb2ZmLCBpZiBhbnkuIFRoaXMgaXNcbiAgICAvLyBzZXQgdXAgc28gdGhhdCBpdCBhbHdheXMgcG9pbnRzIHRvIGEgc3RhY2sgdGhhdCBoYXMgc29tZVxuICAgIC8vIGFkZGl0aW9uYWwgYnVmZmVyIGNvbnRlbnQsIG5ldmVyIHRvIGEgc3RhY2sgd2l0aCBhbiBlcXVhbFxuICAgIC8vIGBidWZmZXJCYXNlYC5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHBhcmVudCkge1xuICAgICAgICB0aGlzLnAgPSBwO1xuICAgICAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5yZWR1Y2VQb3MgPSByZWR1Y2VQb3M7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLnNjb3JlID0gc2NvcmU7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICB0aGlzLmJ1ZmZlckJhc2UgPSBidWZmZXJCYXNlO1xuICAgICAgICB0aGlzLmN1ckNvbnRleHQgPSBjdXJDb250ZXh0O1xuICAgICAgICB0aGlzLmxvb2tBaGVhZCA9IGxvb2tBaGVhZDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgWyR7dGhpcy5zdGFjay5maWx0ZXIoKF8sIGkpID0+IGkgJSAzID09IDApLmNvbmNhdCh0aGlzLnN0YXRlKX1dQCR7dGhpcy5wb3N9JHt0aGlzLnNjb3JlID8gXCIhXCIgKyB0aGlzLnNjb3JlIDogXCJcIn1gO1xuICAgIH1cbiAgICAvLyBTdGFydCBhbiBlbXB0eSBzdGFja1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIHN0YXJ0KHAsIHN0YXRlLCBwb3MgPSAwKSB7XG4gICAgICAgIGxldCBjeCA9IHAucGFyc2VyLmNvbnRleHQ7XG4gICAgICAgIHJldHVybiBuZXcgU3RhY2socCwgW10sIHN0YXRlLCBwb3MsIHBvcywgMCwgW10sIDAsIGN4ID8gbmV3IFN0YWNrQ29udGV4dChjeCwgY3guc3RhcnQpIDogbnVsbCwgMCwgbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzdGFjaydzIGN1cnJlbnQgW2NvbnRleHRdKCNsci5Db250ZXh0VHJhY2tlcikgdmFsdWUsIGlmXG4gICAgYW55LiBJdHMgdHlwZSB3aWxsIGRlcGVuZCBvbiB0aGUgY29udGV4dCB0cmFja2VyJ3MgdHlwZVxuICAgIHBhcmFtZXRlciwgb3IgaXQgd2lsbCBiZSBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gY29udGV4dFxuICAgIHRyYWNrZXIuXG4gICAgKi9cbiAgICBnZXQgY29udGV4dCgpIHsgcmV0dXJuIHRoaXMuY3VyQ29udGV4dCA/IHRoaXMuY3VyQ29udGV4dC5jb250ZXh0IDogbnVsbDsgfVxuICAgIC8vIFB1c2ggYSBzdGF0ZSBvbnRvIHRoZSBzdGFjaywgdHJhY2tpbmcgaXRzIHN0YXJ0IHBvc2l0aW9uIGFzIHdlbGxcbiAgICAvLyBhcyB0aGUgYnVmZmVyIGJhc2UgYXQgdGhhdCBwb2ludC5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1c2hTdGF0ZShzdGF0ZSwgc3RhcnQpIHtcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKHRoaXMuc3RhdGUsIHN0YXJ0LCB0aGlzLmJ1ZmZlckJhc2UgKyB0aGlzLmJ1ZmZlci5sZW5ndGgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgfVxuICAgIC8vIEFwcGx5IGEgcmVkdWNlIGFjdGlvblxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVkdWNlKGFjdGlvbikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBkZXB0aCA9IGFjdGlvbiA+PiAxOSAvKiBBY3Rpb24uUmVkdWNlRGVwdGhTaGlmdCAqLywgdHlwZSA9IGFjdGlvbiAmIDY1NTM1IC8qIEFjdGlvbi5WYWx1ZU1hc2sgKi87XG4gICAgICAgIGxldCB7IHBhcnNlciB9ID0gdGhpcy5wO1xuICAgICAgICBsZXQgZFByZWMgPSBwYXJzZXIuZHluYW1pY1ByZWNlZGVuY2UodHlwZSk7XG4gICAgICAgIGlmIChkUHJlYylcbiAgICAgICAgICAgIHRoaXMuc2NvcmUgKz0gZFByZWM7XG4gICAgICAgIGlmIChkZXB0aCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2hTdGF0ZShwYXJzZXIuZ2V0R290byh0aGlzLnN0YXRlLCB0eXBlLCB0cnVlKSwgdGhpcy5yZWR1Y2VQb3MpO1xuICAgICAgICAgICAgLy8gWmVyby1kZXB0aCByZWR1Y3Rpb25zIGFyZSBhIHNwZWNpYWwgY2FzZVx1MjAxNHRoZXkgYWRkIHN0dWZmIHRvXG4gICAgICAgICAgICAvLyB0aGUgc3RhY2sgd2l0aG91dCBwb3BwaW5nIGFueXRoaW5nIG9mZi5cbiAgICAgICAgICAgIGlmICh0eXBlIDwgcGFyc2VyLm1pblJlcGVhdFRlcm0pXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZU5vZGUodHlwZSwgdGhpcy5yZWR1Y2VQb3MsIHRoaXMucmVkdWNlUG9zLCA0LCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMucmVkdWNlQ29udGV4dCh0eXBlLCB0aGlzLnJlZHVjZVBvcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmluZCB0aGUgYmFzZSBpbmRleCBpbnRvIGB0aGlzLnN0YWNrYCwgY29udGVudCBhZnRlciB3aGljaCB3aWxsXG4gICAgICAgIC8vIGJlIGRyb3BwZWQuIE5vdGUgdGhhdCB3aXRoIGBTdGF5RmxhZ2AgcmVkdWN0aW9ucyB3ZSBuZWVkIHRvXG4gICAgICAgIC8vIGNvbnN1bWUgdHdvIGV4dHJhIGZyYW1lcyAodGhlIGR1bW15IHBhcmVudCBub2RlIGZvciB0aGUgc2tpcHBlZFxuICAgICAgICAvLyBleHByZXNzaW9uIGFuZCB0aGUgc3RhdGUgdGhhdCB3ZSdsbCBiZSBzdGF5aW5nIGluLCB3aGljaCBzaG91bGRcbiAgICAgICAgLy8gYmUgbW92ZWQgdG8gYHRoaXMuc3RhdGVgKS5cbiAgICAgICAgbGV0IGJhc2UgPSB0aGlzLnN0YWNrLmxlbmd0aCAtICgoZGVwdGggLSAxKSAqIDMpIC0gKGFjdGlvbiAmIDI2MjE0NCAvKiBBY3Rpb24uU3RheUZsYWcgKi8gPyA2IDogMCk7XG4gICAgICAgIGxldCBzdGFydCA9IGJhc2UgPyB0aGlzLnN0YWNrW2Jhc2UgLSAyXSA6IHRoaXMucC5yYW5nZXNbMF0uZnJvbSwgc2l6ZSA9IHRoaXMucmVkdWNlUG9zIC0gc3RhcnQ7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBrbHVkZ2UgdG8gdHJ5IGFuZCBkZXRlY3Qgb3Zlcmx5IGRlZXAgbGVmdC1hc3NvY2lhdGl2ZVxuICAgICAgICAvLyB0cmVlcywgd2hpY2ggd2lsbCBub3QgaW5jcmVhc2UgdGhlIHBhcnNlIHN0YWNrIGRlcHRoIGFuZCB0aHVzXG4gICAgICAgIC8vIHdvbid0IGJlIGNhdWdodCBieSB0aGUgcmVndWxhciBzdGFjay1kZXB0aCBsaW1pdCBjaGVjay5cbiAgICAgICAgaWYgKHNpemUgPj0gMjAwMCAvKiBSZWNvdmVyLk1pbkJpZ1JlZHVjdGlvbiAqLyAmJiAhKChfYSA9IHRoaXMucC5wYXJzZXIubm9kZVNldC50eXBlc1t0eXBlXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzQW5vbnltb3VzKSkge1xuICAgICAgICAgICAgaWYgKHN0YXJ0ID09IHRoaXMucC5sYXN0QmlnUmVkdWN0aW9uU3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnAuYmlnUmVkdWN0aW9uQ291bnQrKztcbiAgICAgICAgICAgICAgICB0aGlzLnAubGFzdEJpZ1JlZHVjdGlvblNpemUgPSBzaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wLmxhc3RCaWdSZWR1Y3Rpb25TaXplIDwgc2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucC5iaWdSZWR1Y3Rpb25Db3VudCA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5wLmxhc3RCaWdSZWR1Y3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgICAgICAgICAgICAgIHRoaXMucC5sYXN0QmlnUmVkdWN0aW9uU2l6ZSA9IHNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJ1ZmZlckJhc2UgPSBiYXNlID8gdGhpcy5zdGFja1tiYXNlIC0gMV0gOiAwLCBjb3VudCA9IHRoaXMuYnVmZmVyQmFzZSArIHRoaXMuYnVmZmVyLmxlbmd0aCAtIGJ1ZmZlckJhc2U7XG4gICAgICAgIC8vIFN0b3JlIG5vcm1hbCB0ZXJtcyBvciBgUiAtPiBSIFJgIHJlcGVhdCByZWR1Y3Rpb25zXG4gICAgICAgIGlmICh0eXBlIDwgcGFyc2VyLm1pblJlcGVhdFRlcm0gfHwgKGFjdGlvbiAmIDEzMTA3MiAvKiBBY3Rpb24uUmVwZWF0RmxhZyAqLykpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBwYXJzZXIuc3RhdGVGbGFnKHRoaXMuc3RhdGUsIDEgLyogU3RhdGVGbGFnLlNraXBwZWQgKi8pID8gdGhpcy5wb3MgOiB0aGlzLnJlZHVjZVBvcztcbiAgICAgICAgICAgIHRoaXMuc3RvcmVOb2RlKHR5cGUsIHN0YXJ0LCBwb3MsIGNvdW50ICsgNCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbiAmIDI2MjE0NCAvKiBBY3Rpb24uU3RheUZsYWcgKi8pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YWNrW2Jhc2VdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGJhc2VTdGF0ZUlEID0gdGhpcy5zdGFja1tiYXNlIC0gM107XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gcGFyc2VyLmdldEdvdG8oYmFzZVN0YXRlSUQsIHR5cGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0aGlzLnN0YWNrLmxlbmd0aCA+IGJhc2UpXG4gICAgICAgICAgICB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICB0aGlzLnJlZHVjZUNvbnRleHQodHlwZSwgc3RhcnQpO1xuICAgIH1cbiAgICAvLyBTaGlmdCBhIHZhbHVlIGludG8gdGhlIGJ1ZmZlclxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RvcmVOb2RlKHRlcm0sIHN0YXJ0LCBlbmQsIHNpemUgPSA0LCBpc1JlZHVjZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0ZXJtID09IDAgLyogVGVybS5FcnIgKi8gJiZcbiAgICAgICAgICAgICghdGhpcy5zdGFjay5sZW5ndGggfHwgdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdIDwgdGhpcy5idWZmZXIubGVuZ3RoICsgdGhpcy5idWZmZXJCYXNlKSkge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIG9taXQvbWVyZ2UgYWRqYWNlbnQgZXJyb3Igbm9kZXNcbiAgICAgICAgICAgIGxldCBjdXIgPSB0aGlzLCB0b3AgPSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICBpZiAodG9wID09IDAgJiYgY3VyLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIHRvcCA9IGN1ci5idWZmZXJCYXNlIC0gY3VyLnBhcmVudC5idWZmZXJCYXNlO1xuICAgICAgICAgICAgICAgIGN1ciA9IGN1ci5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9wID4gMCAmJiBjdXIuYnVmZmVyW3RvcCAtIDRdID09IDAgLyogVGVybS5FcnIgKi8gJiYgY3VyLmJ1ZmZlclt0b3AgLSAxXSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChjdXIuYnVmZmVyW3RvcCAtIDJdID49IHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ci5idWZmZXJbdG9wIC0gMl0gPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1JlZHVjZSB8fCB0aGlzLnBvcyA9PSBlbmQpIHsgLy8gU2ltcGxlIGNhc2UsIGp1c3QgYXBwZW5kXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHRlcm0sIHN0YXJ0LCBlbmQsIHNpemUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBUaGVyZSBtYXkgYmUgc2tpcHBlZCBub2RlcyB0aGF0IGhhdmUgdG8gYmUgbW92ZWQgZm9yd2FyZFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gMCAmJiB0aGlzLmJ1ZmZlcltpbmRleCAtIDRdICE9IDAgLyogVGVybS5FcnIgKi8pXG4gICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4ID4gMCAmJiB0aGlzLmJ1ZmZlcltpbmRleCAtIDJdID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdGhpcyByZWNvcmQgZm9yd2FyZFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlcltpbmRleF0gPSB0aGlzLmJ1ZmZlcltpbmRleCAtIDRdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlcltpbmRleCArIDFdID0gdGhpcy5idWZmZXJbaW5kZXggLSAzXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJbaW5kZXggKyAyXSA9IHRoaXMuYnVmZmVyW2luZGV4IC0gMl07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyW2luZGV4ICsgM10gPSB0aGlzLmJ1ZmZlcltpbmRleCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpbmRleCAtPSA0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IDQpXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplIC09IDQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5idWZmZXJbaW5kZXhdID0gdGVybTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyW2luZGV4ICsgMV0gPSBzdGFydDtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyW2luZGV4ICsgMl0gPSBlbmQ7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlcltpbmRleCArIDNdID0gc2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBcHBseSBhIHNoaWZ0IGFjdGlvblxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2hpZnQoYWN0aW9uLCB0eXBlLCBzdGFydCwgZW5kKSB7XG4gICAgICAgIGlmIChhY3Rpb24gJiAxMzEwNzIgLyogQWN0aW9uLkdvdG9GbGFnICovKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2hTdGF0ZShhY3Rpb24gJiA2NTUzNSAvKiBBY3Rpb24uVmFsdWVNYXNrICovLCB0aGlzLnBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKGFjdGlvbiAmIDI2MjE0NCAvKiBBY3Rpb24uU3RheUZsYWcgKi8pID09IDApIHsgLy8gUmVndWxhciBzaGlmdFxuICAgICAgICAgICAgbGV0IG5leHRTdGF0ZSA9IGFjdGlvbiwgeyBwYXJzZXIgfSA9IHRoaXMucDtcbiAgICAgICAgICAgIGlmIChlbmQgPiB0aGlzLnBvcyB8fCB0eXBlIDw9IHBhcnNlci5tYXhOb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZXIuc3RhdGVGbGFnKG5leHRTdGF0ZSwgMSAvKiBTdGF0ZUZsYWcuU2tpcHBlZCAqLykpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkdWNlUG9zID0gZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wdXNoU3RhdGUobmV4dFN0YXRlLCBzdGFydCk7XG4gICAgICAgICAgICB0aGlzLnNoaWZ0Q29udGV4dCh0eXBlLCBzdGFydCk7XG4gICAgICAgICAgICBpZiAodHlwZSA8PSBwYXJzZXIubWF4Tm9kZSlcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHR5cGUsIHN0YXJ0LCBlbmQsIDQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBTaGlmdC1hbmQtc3RheSwgd2hpY2ggbWVhbnMgdGhpcyBpcyBhIHNraXBwZWQgdG9rZW5cbiAgICAgICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICAgICAgdGhpcy5zaGlmdENvbnRleHQodHlwZSwgc3RhcnQpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPD0gdGhpcy5wLnBhcnNlci5tYXhOb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2godHlwZSwgc3RhcnQsIGVuZCwgNCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXBwbHkgYW4gYWN0aW9uXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhcHBseShhY3Rpb24sIG5leHQsIG5leHRTdGFydCwgbmV4dEVuZCkge1xuICAgICAgICBpZiAoYWN0aW9uICYgNjU1MzYgLyogQWN0aW9uLlJlZHVjZUZsYWcgKi8pXG4gICAgICAgICAgICB0aGlzLnJlZHVjZShhY3Rpb24pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnNoaWZ0KGFjdGlvbiwgbmV4dCwgbmV4dFN0YXJ0LCBuZXh0RW5kKTtcbiAgICB9XG4gICAgLy8gQWRkIGEgcHJlYnVpbHQgKHJldXNlZCkgbm9kZSBpbnRvIHRoZSBidWZmZXIuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB1c2VOb2RlKHZhbHVlLCBuZXh0KSB7XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMucC5yZXVzZWQubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCB0aGlzLnAucmV1c2VkW2luZGV4XSAhPSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wLnJldXNlZC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucmVkdWNlUG9zID0gdGhpcy5wb3MgPSBzdGFydCArIHZhbHVlLmxlbmd0aDtcbiAgICAgICAgdGhpcy5wdXNoU3RhdGUobmV4dCwgc3RhcnQpO1xuICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKGluZGV4LCBzdGFydCwgdGhpcy5yZWR1Y2VQb3MsIC0xIC8qIHNpemUgPT0gLTEgbWVhbnMgdGhpcyBpcyBhIHJldXNlZCB2YWx1ZSAqLyk7XG4gICAgICAgIGlmICh0aGlzLmN1ckNvbnRleHQpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRleHQodGhpcy5jdXJDb250ZXh0LnRyYWNrZXIucmV1c2UodGhpcy5jdXJDb250ZXh0LmNvbnRleHQsIHZhbHVlLCB0aGlzLCB0aGlzLnAuc3RyZWFtLnJlc2V0KHRoaXMucG9zIC0gdmFsdWUubGVuZ3RoKSkpO1xuICAgIH1cbiAgICAvLyBTcGxpdCB0aGUgc3RhY2suIER1ZSB0byB0aGUgYnVmZmVyIHNoYXJpbmcgYW5kIHRoZSBmYWN0XG4gICAgLy8gdGhhdCBgdGhpcy5zdGFja2AgdGVuZHMgdG8gc3RheSBxdWl0ZSBzaGFsbG93LCB0aGlzIGlzbid0IHZlcnlcbiAgICAvLyBleHBlbnNpdmUuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzcGxpdCgpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXM7XG4gICAgICAgIGxldCBvZmYgPSBwYXJlbnQuYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgLy8gQmVjYXVzZSB0aGUgdG9wIG9mIHRoZSBidWZmZXIgKGFmdGVyIHRoaXMucG9zKSBtYXkgYmUgbXV0YXRlZFxuICAgICAgICAvLyB0byByZW9yZGVyIHJlZHVjdGlvbnMgYW5kIHNraXBwZWQgdG9rZW5zLCBhbmQgc2hhcmVkIGJ1ZmZlcnNcbiAgICAgICAgLy8gc2hvdWxkIGJlIGltbXV0YWJsZSwgdGhpcyBjb3BpZXMgYW55IG91dHN0YW5kaW5nIHNraXBwZWQgdG9rZW5zXG4gICAgICAgIC8vIHRvIHRoZSBuZXcgYnVmZmVyLCBhbmQgcHV0cyB0aGUgYmFzZSBwb2ludGVyIGJlZm9yZSB0aGVtLlxuICAgICAgICB3aGlsZSAob2ZmID4gMCAmJiBwYXJlbnQuYnVmZmVyW29mZiAtIDJdID4gcGFyZW50LnJlZHVjZVBvcylcbiAgICAgICAgICAgIG9mZiAtPSA0O1xuICAgICAgICBsZXQgYnVmZmVyID0gcGFyZW50LmJ1ZmZlci5zbGljZShvZmYpLCBiYXNlID0gcGFyZW50LmJ1ZmZlckJhc2UgKyBvZmY7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSBwYXJlbnQgcG9pbnRzIHRvIGFuIGFjdHVhbCBwYXJlbnQgd2l0aCBjb250ZW50LCBpZiB0aGVyZSBpcyBzdWNoIGEgcGFyZW50LlxuICAgICAgICB3aGlsZSAocGFyZW50ICYmIGJhc2UgPT0gcGFyZW50LmJ1ZmZlckJhc2UpXG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgICByZXR1cm4gbmV3IFN0YWNrKHRoaXMucCwgdGhpcy5zdGFjay5zbGljZSgpLCB0aGlzLnN0YXRlLCB0aGlzLnJlZHVjZVBvcywgdGhpcy5wb3MsIHRoaXMuc2NvcmUsIGJ1ZmZlciwgYmFzZSwgdGhpcy5jdXJDb250ZXh0LCB0aGlzLmxvb2tBaGVhZCwgcGFyZW50KTtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIHJlY292ZXIgZnJvbSBhbiBlcnJvciBieSAnZGVsZXRpbmcnIChpZ25vcmluZykgb25lIHRva2VuLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVjb3ZlckJ5RGVsZXRlKG5leHQsIG5leHRFbmQpIHtcbiAgICAgICAgbGV0IGlzTm9kZSA9IG5leHQgPD0gdGhpcy5wLnBhcnNlci5tYXhOb2RlO1xuICAgICAgICBpZiAoaXNOb2RlKVxuICAgICAgICAgICAgdGhpcy5zdG9yZU5vZGUobmV4dCwgdGhpcy5wb3MsIG5leHRFbmQsIDQpO1xuICAgICAgICB0aGlzLnN0b3JlTm9kZSgwIC8qIFRlcm0uRXJyICovLCB0aGlzLnBvcywgbmV4dEVuZCwgaXNOb2RlID8gOCA6IDQpO1xuICAgICAgICB0aGlzLnBvcyA9IHRoaXMucmVkdWNlUG9zID0gbmV4dEVuZDtcbiAgICAgICAgdGhpcy5zY29yZSAtPSAxOTAgLyogUmVjb3Zlci5EZWxldGUgKi87XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIGlmIHRoZSBnaXZlbiB0ZXJtIHdvdWxkIGJlIGFibGUgdG8gYmUgc2hpZnRlZCAob3B0aW9uYWxseVxuICAgIGFmdGVyIHNvbWUgcmVkdWN0aW9ucykgb24gdGhpcyBzdGFjay4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvclxuICAgIGV4dGVybmFsIHRva2VuaXplcnMgdGhhdCB3YW50IHRvIG1ha2Ugc3VyZSB0aGV5IG9ubHkgcHJvdmlkZSBhXG4gICAgZ2l2ZW4gdG9rZW4gd2hlbiBpdCBhcHBsaWVzLlxuICAgICovXG4gICAgY2FuU2hpZnQodGVybSkge1xuICAgICAgICBmb3IgKGxldCBzaW0gPSBuZXcgU2ltdWxhdGVkU3RhY2sodGhpcyk7Oykge1xuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IHRoaXMucC5wYXJzZXIuc3RhdGVTbG90KHNpbS5zdGF0ZSwgNCAvKiBQYXJzZVN0YXRlLkRlZmF1bHRSZWR1Y2UgKi8pIHx8IHRoaXMucC5wYXJzZXIuaGFzQWN0aW9uKHNpbS5zdGF0ZSwgdGVybSk7XG4gICAgICAgICAgICBpZiAoYWN0aW9uID09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKChhY3Rpb24gJiA2NTUzNiAvKiBBY3Rpb24uUmVkdWNlRmxhZyAqLykgPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHNpbS5yZWR1Y2UoYWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBcHBseSB1cCB0byBSZWNvdmVyLk1heE5leHQgcmVjb3ZlcnkgYWN0aW9ucyB0aGF0IGNvbmNlcHR1YWxseVxuICAgIC8vIGluc2VydHMgc29tZSBtaXNzaW5nIHRva2VuIG9yIHJ1bGUuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZWNvdmVyQnlJbnNlcnQobmV4dCkge1xuICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPj0gMzAwIC8qIFJlY292ZXIuTWF4SW5zZXJ0U3RhY2tEZXB0aCAqLylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgbGV0IG5leHRTdGF0ZXMgPSB0aGlzLnAucGFyc2VyLm5leHRTdGF0ZXModGhpcy5zdGF0ZSk7XG4gICAgICAgIGlmIChuZXh0U3RhdGVzLmxlbmd0aCA+IDQgLyogUmVjb3Zlci5NYXhOZXh0ICovIDw8IDEgfHwgdGhpcy5zdGFjay5sZW5ndGggPj0gMTIwIC8qIFJlY292ZXIuRGFtcGVuSW5zZXJ0U3RhY2tEZXB0aCAqLykge1xuICAgICAgICAgICAgbGV0IGJlc3QgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBzOyBpIDwgbmV4dFN0YXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgICAgIGlmICgocyA9IG5leHRTdGF0ZXNbaSArIDFdKSAhPSB0aGlzLnN0YXRlICYmIHRoaXMucC5wYXJzZXIuaGFzQWN0aW9uKHMsIG5leHQpKVxuICAgICAgICAgICAgICAgICAgICBiZXN0LnB1c2gobmV4dFN0YXRlc1tpXSwgcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCAxMjAgLyogUmVjb3Zlci5EYW1wZW5JbnNlcnRTdGFja0RlcHRoICovKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBiZXN0Lmxlbmd0aCA8IDQgLyogUmVjb3Zlci5NYXhOZXh0ICovIDw8IDEgJiYgaSA8IG5leHRTdGF0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHMgPSBuZXh0U3RhdGVzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiZXN0LnNvbWUoKHYsIGkpID0+IChpICYgMSkgJiYgdiA9PSBzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QucHVzaChuZXh0U3RhdGVzW2ldLCBzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0U3RhdGVzID0gYmVzdDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV4dFN0YXRlcy5sZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8IDQgLyogUmVjb3Zlci5NYXhOZXh0ICovOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGxldCBzID0gbmV4dFN0YXRlc1tpICsgMV07XG4gICAgICAgICAgICBpZiAocyA9PSB0aGlzLnN0YXRlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHN0YWNrID0gdGhpcy5zcGxpdCgpO1xuICAgICAgICAgICAgc3RhY2sucHVzaFN0YXRlKHMsIHRoaXMucG9zKTtcbiAgICAgICAgICAgIHN0YWNrLnN0b3JlTm9kZSgwIC8qIFRlcm0uRXJyICovLCBzdGFjay5wb3MsIHN0YWNrLnBvcywgNCwgdHJ1ZSk7XG4gICAgICAgICAgICBzdGFjay5zaGlmdENvbnRleHQobmV4dFN0YXRlc1tpXSwgdGhpcy5wb3MpO1xuICAgICAgICAgICAgc3RhY2sucmVkdWNlUG9zID0gdGhpcy5wb3M7XG4gICAgICAgICAgICBzdGFjay5zY29yZSAtPSAyMDAgLyogUmVjb3Zlci5JbnNlcnQgKi87XG4gICAgICAgICAgICByZXN1bHQucHVzaChzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gRm9yY2UgYSByZWR1Y2UsIGlmIHBvc3NpYmxlLiBSZXR1cm4gZmFsc2UgaWYgdGhhdCBjYW4ndFxuICAgIC8vIGJlIGRvbmUuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmb3JjZVJlZHVjZSgpIHtcbiAgICAgICAgbGV0IHsgcGFyc2VyIH0gPSB0aGlzLnA7XG4gICAgICAgIGxldCByZWR1Y2UgPSBwYXJzZXIuc3RhdGVTbG90KHRoaXMuc3RhdGUsIDUgLyogUGFyc2VTdGF0ZS5Gb3JjZWRSZWR1Y2UgKi8pO1xuICAgICAgICBpZiAoKHJlZHVjZSAmIDY1NTM2IC8qIEFjdGlvbi5SZWR1Y2VGbGFnICovKSA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXBhcnNlci52YWxpZEFjdGlvbih0aGlzLnN0YXRlLCByZWR1Y2UpKSB7XG4gICAgICAgICAgICBsZXQgZGVwdGggPSByZWR1Y2UgPj4gMTkgLyogQWN0aW9uLlJlZHVjZURlcHRoU2hpZnQgKi8sIHRlcm0gPSByZWR1Y2UgJiA2NTUzNSAvKiBBY3Rpb24uVmFsdWVNYXNrICovO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuc3RhY2subGVuZ3RoIC0gZGVwdGggKiAzO1xuICAgICAgICAgICAgaWYgKHRhcmdldCA8IDAgfHwgcGFyc2VyLmdldEdvdG8odGhpcy5zdGFja1t0YXJnZXRdLCB0ZXJtLCBmYWxzZSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJhY2t1cCA9IHRoaXMuZmluZEZvcmNlZFJlZHVjdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChiYWNrdXAgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlZHVjZSA9IGJhY2t1cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RvcmVOb2RlKDAgLyogVGVybS5FcnIgKi8sIHRoaXMucG9zLCB0aGlzLnBvcywgNCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnNjb3JlIC09IDEwMCAvKiBSZWNvdmVyLlJlZHVjZSAqLztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZHVjZVBvcyA9IHRoaXMucG9zO1xuICAgICAgICB0aGlzLnJlZHVjZShyZWR1Y2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIHNjYW4gdGhyb3VnaCB0aGUgYXV0b21hdG9uIHRvIGZpbmQgc29tZSBraW5kIG9mIHJlZHVjdGlvblxuICAgIHRoYXQgY2FuIGJlIGFwcGxpZWQuIFVzZWQgd2hlbiB0aGUgcmVndWxhciBGb3JjZWRSZWR1Y2UgZmllbGRcbiAgICBpc24ndCBhIHZhbGlkIGFjdGlvbi4gQGludGVybmFsXG4gICAgKi9cbiAgICBmaW5kRm9yY2VkUmVkdWN0aW9uKCkge1xuICAgICAgICBsZXQgeyBwYXJzZXIgfSA9IHRoaXMucCwgc2VlbiA9IFtdO1xuICAgICAgICBsZXQgZXhwbG9yZSA9IChzdGF0ZSwgZGVwdGgpID0+IHtcbiAgICAgICAgICAgIGlmIChzZWVuLmluY2x1ZGVzKHN0YXRlKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBzZWVuLnB1c2goc3RhdGUpO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlci5hbGxBY3Rpb25zKHN0YXRlLCAoYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiAmICgyNjIxNDQgLyogQWN0aW9uLlN0YXlGbGFnICovIHwgMTMxMDcyIC8qIEFjdGlvbi5Hb3RvRmxhZyAqLykpIDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gJiA2NTUzNiAvKiBBY3Rpb24uUmVkdWNlRmxhZyAqLykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgckRlcHRoID0gKGFjdGlvbiA+PiAxOSAvKiBBY3Rpb24uUmVkdWNlRGVwdGhTaGlmdCAqLykgLSBkZXB0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJEZXB0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXJtID0gYWN0aW9uICYgNjU1MzUgLyogQWN0aW9uLlZhbHVlTWFzayAqLywgdGFyZ2V0ID0gdGhpcy5zdGFjay5sZW5ndGggLSByRGVwdGggKiAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA+PSAwICYmIHBhcnNlci5nZXRHb3RvKHRoaXMuc3RhY2tbdGFyZ2V0XSwgdGVybSwgZmFsc2UpID49IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyRGVwdGggPDwgMTkgLyogQWN0aW9uLlJlZHVjZURlcHRoU2hpZnQgKi8pIHwgNjU1MzYgLyogQWN0aW9uLlJlZHVjZUZsYWcgKi8gfCB0ZXJtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBleHBsb3JlKGFjdGlvbiwgZGVwdGggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBleHBsb3JlKHRoaXMuc3RhdGUsIDApO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZvcmNlQWxsKCkge1xuICAgICAgICB3aGlsZSAoIXRoaXMucC5wYXJzZXIuc3RhdGVGbGFnKHRoaXMuc3RhdGUsIDIgLyogU3RhdGVGbGFnLkFjY2VwdGluZyAqLykpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5mb3JjZVJlZHVjZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZU5vZGUoMCAvKiBUZXJtLkVyciAqLywgdGhpcy5wb3MsIHRoaXMucG9zLCA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgd2hldGhlciB0aGlzIHN0YXRlIGhhcyBubyBmdXJ0aGVyIGFjdGlvbnMgKGFzc3VtZWQgdG8gYmUgYSBkaXJlY3QgZGVzY2VuZGFudCBvZiB0aGVcbiAgICB0b3Agc3RhdGUsIHNpbmNlIGFueSBvdGhlciBzdGF0ZXMgbXVzdCBiZSBhYmxlIHRvIGNvbnRpbnVlXG4gICAgc29tZWhvdykuIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGRlYWRFbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCAhPSAzKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgeyBwYXJzZXIgfSA9IHRoaXMucDtcbiAgICAgICAgcmV0dXJuIHBhcnNlci5kYXRhW3BhcnNlci5zdGF0ZVNsb3QodGhpcy5zdGF0ZSwgMSAvKiBQYXJzZVN0YXRlLkFjdGlvbnMgKi8pXSA9PSA2NTUzNSAvKiBTZXEuRW5kICovICYmXG4gICAgICAgICAgICAhcGFyc2VyLnN0YXRlU2xvdCh0aGlzLnN0YXRlLCA0IC8qIFBhcnNlU3RhdGUuRGVmYXVsdFJlZHVjZSAqLyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlc3RhcnQgdGhlIHN0YWNrIChwdXQgaXQgYmFjayBpbiBpdHMgc3RhcnQgc3RhdGUpLiBPbmx5IHNhZmVcbiAgICB3aGVuIHRoaXMuc3RhY2subGVuZ3RoID09IDMgKHN0YXRlIGlzIGRpcmVjdGx5IGJlbG93IHRoZSB0b3BcbiAgICBzdGF0ZSkuIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzdGFydCgpIHtcbiAgICAgICAgdGhpcy5zdG9yZU5vZGUoMCAvKiBUZXJtLkVyciAqLywgdGhpcy5wb3MsIHRoaXMucG9zLCA0LCB0cnVlKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhY2tbMF07XG4gICAgICAgIHRoaXMuc3RhY2subGVuZ3RoID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzYW1lU3RhdGUob3RoZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT0gb3RoZXIuc3RhdGUgfHwgdGhpcy5zdGFjay5sZW5ndGggIT0gb3RoZXIuc3RhY2subGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RhY2subGVuZ3RoOyBpICs9IDMpXG4gICAgICAgICAgICBpZiAodGhpcy5zdGFja1tpXSAhPSBvdGhlci5zdGFja1tpXSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHBhcnNlciB1c2VkIGJ5IHRoaXMgc3RhY2suXG4gICAgKi9cbiAgICBnZXQgcGFyc2VyKCkgeyByZXR1cm4gdGhpcy5wLnBhcnNlcjsgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciBhIGdpdmVuIGRpYWxlY3QgKGJ5IG51bWVyaWMgSUQsIGFzIGV4cG9ydGVkIGZyb21cbiAgICB0aGUgdGVybXMgZmlsZSkgaXMgZW5hYmxlZC5cbiAgICAqL1xuICAgIGRpYWxlY3RFbmFibGVkKGRpYWxlY3RJRCkgeyByZXR1cm4gdGhpcy5wLnBhcnNlci5kaWFsZWN0LmZsYWdzW2RpYWxlY3RJRF07IH1cbiAgICBzaGlmdENvbnRleHQodGVybSwgc3RhcnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VyQ29udGV4dClcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGV4dCh0aGlzLmN1ckNvbnRleHQudHJhY2tlci5zaGlmdCh0aGlzLmN1ckNvbnRleHQuY29udGV4dCwgdGVybSwgdGhpcywgdGhpcy5wLnN0cmVhbS5yZXNldChzdGFydCkpKTtcbiAgICB9XG4gICAgcmVkdWNlQ29udGV4dCh0ZXJtLCBzdGFydCkge1xuICAgICAgICBpZiAodGhpcy5jdXJDb250ZXh0KVxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb250ZXh0KHRoaXMuY3VyQ29udGV4dC50cmFja2VyLnJlZHVjZSh0aGlzLmN1ckNvbnRleHQuY29udGV4dCwgdGVybSwgdGhpcywgdGhpcy5wLnN0cmVhbS5yZXNldChzdGFydCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlbWl0Q29udGV4dCgpIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmJ1ZmZlci5sZW5ndGggLSAxO1xuICAgICAgICBpZiAobGFzdCA8IDAgfHwgdGhpcy5idWZmZXJbbGFzdF0gIT0gLTMpXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHRoaXMuY3VyQ29udGV4dC5oYXNoLCB0aGlzLnBvcywgdGhpcy5wb3MsIC0zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlbWl0TG9va0FoZWFkKCkge1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuYnVmZmVyLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChsYXN0IDwgMCB8fCB0aGlzLmJ1ZmZlcltsYXN0XSAhPSAtNClcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2godGhpcy5sb29rQWhlYWQsIHRoaXMucG9zLCB0aGlzLnBvcywgLTQpO1xuICAgIH1cbiAgICB1cGRhdGVDb250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQgIT0gdGhpcy5jdXJDb250ZXh0LmNvbnRleHQpIHtcbiAgICAgICAgICAgIGxldCBuZXdDeCA9IG5ldyBTdGFja0NvbnRleHQodGhpcy5jdXJDb250ZXh0LnRyYWNrZXIsIGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKG5ld0N4Lmhhc2ggIT0gdGhpcy5jdXJDb250ZXh0Lmhhc2gpXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q29udGV4dCgpO1xuICAgICAgICAgICAgdGhpcy5jdXJDb250ZXh0ID0gbmV3Q3g7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzZXRMb29rQWhlYWQobG9va0FoZWFkKSB7XG4gICAgICAgIGlmIChsb29rQWhlYWQgPiB0aGlzLmxvb2tBaGVhZCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0TG9va0FoZWFkKCk7XG4gICAgICAgICAgICB0aGlzLmxvb2tBaGVhZCA9IGxvb2tBaGVhZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5jdXJDb250ZXh0ICYmIHRoaXMuY3VyQ29udGV4dC50cmFja2VyLnN0cmljdClcbiAgICAgICAgICAgIHRoaXMuZW1pdENvbnRleHQoKTtcbiAgICAgICAgaWYgKHRoaXMubG9va0FoZWFkID4gMClcbiAgICAgICAgICAgIHRoaXMuZW1pdExvb2tBaGVhZCgpO1xuICAgIH1cbn1cbmNsYXNzIFN0YWNrQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IodHJhY2tlciwgY29udGV4dCkge1xuICAgICAgICB0aGlzLnRyYWNrZXIgPSB0cmFja2VyO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmhhc2ggPSB0cmFja2VyLnN0cmljdCA/IHRyYWNrZXIuaGFzaChjb250ZXh0KSA6IDA7XG4gICAgfVxufVxuLy8gVXNlZCB0byBjaGVhcGx5IHJ1biBzb21lIHJlZHVjdGlvbnMgdG8gc2NhbiBhaGVhZCB3aXRob3V0IG11dGF0aW5nXG4vLyBhbiBlbnRpcmUgc3RhY2tcbmNsYXNzIFNpbXVsYXRlZFN0YWNrIHtcbiAgICBjb25zdHJ1Y3RvcihzdGFydCkge1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGFydC5zdGF0ZTtcbiAgICAgICAgdGhpcy5zdGFjayA9IHN0YXJ0LnN0YWNrO1xuICAgICAgICB0aGlzLmJhc2UgPSB0aGlzLnN0YWNrLmxlbmd0aDtcbiAgICB9XG4gICAgcmVkdWNlKGFjdGlvbikge1xuICAgICAgICBsZXQgdGVybSA9IGFjdGlvbiAmIDY1NTM1IC8qIEFjdGlvbi5WYWx1ZU1hc2sgKi8sIGRlcHRoID0gYWN0aW9uID4+IDE5IC8qIEFjdGlvbi5SZWR1Y2VEZXB0aFNoaWZ0ICovO1xuICAgICAgICBpZiAoZGVwdGggPT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2sgPT0gdGhpcy5zdGFydC5zdGFjaylcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gdGhpcy5zdGFjay5zbGljZSgpO1xuICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHRoaXMuc3RhdGUsIDAsIDApO1xuICAgICAgICAgICAgdGhpcy5iYXNlICs9IDM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJhc2UgLT0gKGRlcHRoIC0gMSkgKiAzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBnb3RvID0gdGhpcy5zdGFydC5wLnBhcnNlci5nZXRHb3RvKHRoaXMuc3RhY2tbdGhpcy5iYXNlIC0gM10sIHRlcm0sIHRydWUpO1xuICAgICAgICB0aGlzLnN0YXRlID0gZ290bztcbiAgICB9XG59XG4vLyBUaGlzIGlzIGdpdmVuIHRvIGBUcmVlLmJ1aWxkYCB0byBidWlsZCBhIGJ1ZmZlciwgYW5kIGVuY2Fwc3VsYXRlc1xuLy8gdGhlIHBhcmVudC1zdGFjay13YWxraW5nIG5lY2Vzc2FyeSB0byByZWFkIHRoZSBub2Rlcy5cbmNsYXNzIFN0YWNrQnVmZmVyQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihzdGFjaywgcG9zLCBpbmRleCkge1xuICAgICAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gc3RhY2suYnVmZmVyO1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PSAwKVxuICAgICAgICAgICAgdGhpcy5tYXliZU5leHQoKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShzdGFjaywgcG9zID0gc3RhY2suYnVmZmVyQmFzZSArIHN0YWNrLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFja0J1ZmZlckN1cnNvcihzdGFjaywgcG9zLCBwb3MgLSBzdGFjay5idWZmZXJCYXNlKTtcbiAgICB9XG4gICAgbWF5YmVOZXh0KCkge1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMuc3RhY2sucGFyZW50O1xuICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy5zdGFjay5idWZmZXJCYXNlIC0gbmV4dC5idWZmZXJCYXNlO1xuICAgICAgICAgICAgdGhpcy5zdGFjayA9IG5leHQ7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5leHQuYnVmZmVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBpZCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSA0XTsgfVxuICAgIGdldCBzdGFydCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSAzXTsgfVxuICAgIGdldCBlbmQoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gMl07IH1cbiAgICBnZXQgc2l6ZSgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSAxXTsgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIHRoaXMuaW5kZXggLT0gNDtcbiAgICAgICAgdGhpcy5wb3MgLT0gNDtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT0gMClcbiAgICAgICAgICAgIHRoaXMubWF5YmVOZXh0KCk7XG4gICAgfVxuICAgIGZvcmsoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RhY2tCdWZmZXJDdXJzb3IodGhpcy5zdGFjaywgdGhpcy5wb3MsIHRoaXMuaW5kZXgpO1xuICAgIH1cbn1cblxuLy8gU2VlIGxlemVyLWdlbmVyYXRvci9zcmMvZW5jb2RlLnRzIGZvciBjb21tZW50cyBhYm91dCB0aGUgZW5jb2Rpbmdcbi8vIHVzZWQgaGVyZVxuZnVuY3Rpb24gZGVjb2RlQXJyYXkoaW5wdXQsIFR5cGUgPSBVaW50MTZBcnJheSkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIGxldCBhcnJheSA9IG51bGw7XG4gICAgZm9yIChsZXQgcG9zID0gMCwgb3V0ID0gMDsgcG9zIDwgaW5wdXQubGVuZ3RoOykge1xuICAgICAgICBsZXQgdmFsdWUgPSAwO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGlucHV0LmNoYXJDb2RlQXQocG9zKyspLCBzdG9wID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAobmV4dCA9PSAxMjYgLyogRW5jb2RlLkJpZ1ZhbENvZGUgKi8pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IDY1NTM1IC8qIEVuY29kZS5CaWdWYWwgKi87XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV4dCA+PSA5MiAvKiBFbmNvZGUuR2FwMiAqLylcbiAgICAgICAgICAgICAgICBuZXh0LS07XG4gICAgICAgICAgICBpZiAobmV4dCA+PSAzNCAvKiBFbmNvZGUuR2FwMSAqLylcbiAgICAgICAgICAgICAgICBuZXh0LS07XG4gICAgICAgICAgICBsZXQgZGlnaXQgPSBuZXh0IC0gMzIgLyogRW5jb2RlLlN0YXJ0ICovO1xuICAgICAgICAgICAgaWYgKGRpZ2l0ID49IDQ2IC8qIEVuY29kZS5CYXNlICovKSB7XG4gICAgICAgICAgICAgICAgZGlnaXQgLT0gNDYgLyogRW5jb2RlLkJhc2UgKi87XG4gICAgICAgICAgICAgICAgc3RvcCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSArPSBkaWdpdDtcbiAgICAgICAgICAgIGlmIChzdG9wKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdmFsdWUgKj0gNDYgLyogRW5jb2RlLkJhc2UgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFycmF5KVxuICAgICAgICAgICAgYXJyYXlbb3V0KytdID0gdmFsdWU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGFycmF5ID0gbmV3IFR5cGUodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5cbmNsYXNzIENhY2hlZFRva2VuIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zdGFydCA9IC0xO1xuICAgICAgICB0aGlzLnZhbHVlID0gLTE7XG4gICAgICAgIHRoaXMuZW5kID0gLTE7XG4gICAgICAgIHRoaXMuZXh0ZW5kZWQgPSAtMTtcbiAgICAgICAgdGhpcy5sb29rQWhlYWQgPSAwO1xuICAgICAgICB0aGlzLm1hc2sgPSAwO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSAwO1xuICAgIH1cbn1cbmNvbnN0IG51bGxUb2tlbiA9IG5ldyBDYWNoZWRUb2tlbjtcbi8qKlxuW1Rva2VuaXplcnNdKCNsci5FeHRlcm5hbFRva2VuaXplcikgaW50ZXJhY3Qgd2l0aCB0aGUgaW5wdXRcbnRocm91Z2ggdGhpcyBpbnRlcmZhY2UuIEl0IHByZXNlbnRzIHRoZSBpbnB1dCBhcyBhIHN0cmVhbSBvZlxuY2hhcmFjdGVycywgdHJhY2tpbmcgbG9va2FoZWFkIGFuZCBoaWRpbmcgdGhlIGNvbXBsZXhpdHkgb2ZcbltyYW5nZXNdKCNjb21tb24uUGFyc2VyLnBhcnNlXnJhbmdlcykgZnJvbSB0b2tlbml6ZXIgY29kZS5cbiovXG5jbGFzcyBJbnB1dFN0cmVhbSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGlucHV0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJhbmdlcykge1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuY2h1bmsgPSBcIlwiO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuY2h1bmtPZmYgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgQmFja3VwIGNodW5rXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuY2h1bmsyID0gXCJcIjtcbiAgICAgICAgdGhpcy5jaHVuazJQb3MgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIGNoYXJhY3RlciBjb2RlIG9mIHRoZSBuZXh0IGNvZGUgdW5pdCBpbiB0aGUgaW5wdXQsIG9yIC0xXG4gICAgICAgIHdoZW4gdGhlIHN0cmVhbSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uZXh0ID0gLTE7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy50b2tlbiA9IG51bGxUb2tlbjtcbiAgICAgICAgdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5wb3MgPSB0aGlzLmNodW5rUG9zID0gcmFuZ2VzWzBdLmZyb207XG4gICAgICAgIHRoaXMucmFuZ2UgPSByYW5nZXNbMF07XG4gICAgICAgIHRoaXMuZW5kID0gcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXS50bztcbiAgICAgICAgdGhpcy5yZWFkTmV4dCgpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlc29sdmVPZmZzZXQob2Zmc2V0LCBhc3NvYykge1xuICAgICAgICBsZXQgcmFuZ2UgPSB0aGlzLnJhbmdlLCBpbmRleCA9IHRoaXMucmFuZ2VJbmRleDtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMucG9zICsgb2Zmc2V0O1xuICAgICAgICB3aGlsZSAocG9zIDwgcmFuZ2UuZnJvbSkge1xuICAgICAgICAgICAgaWYgKCFpbmRleClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5yYW5nZXNbLS1pbmRleF07XG4gICAgICAgICAgICBwb3MgLT0gcmFuZ2UuZnJvbSAtIG5leHQudG87XG4gICAgICAgICAgICByYW5nZSA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGFzc29jIDwgMCA/IHBvcyA+IHJhbmdlLnRvIDogcG9zID49IHJhbmdlLnRvKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gdGhpcy5yYW5nZXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5yYW5nZXNbKytpbmRleF07XG4gICAgICAgICAgICBwb3MgKz0gbmV4dC5mcm9tIC0gcmFuZ2UudG87XG4gICAgICAgICAgICByYW5nZSA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjbGlwUG9zKHBvcykge1xuICAgICAgICBpZiAocG9zID49IHRoaXMucmFuZ2UuZnJvbSAmJiBwb3MgPCB0aGlzLnJhbmdlLnRvKVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgZm9yIChsZXQgcmFuZ2Ugb2YgdGhpcy5yYW5nZXMpXG4gICAgICAgICAgICBpZiAocmFuZ2UudG8gPiBwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHBvcywgcmFuZ2UuZnJvbSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgTG9vayBhdCBhIGNvZGUgdW5pdCBuZWFyIHRoZSBzdHJlYW0gcG9zaXRpb24uIGAucGVlaygwKWAgZXF1YWxzXG4gICAgYC5uZXh0YCwgYC5wZWVrKC0xKWAgZ2l2ZXMgeW91IHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIsIGFuZCBzb1xuICAgIG9uLlxuICAgIFxuICAgIE5vdGUgdGhhdCBsb29raW5nIGFyb3VuZCBkdXJpbmcgdG9rZW5pemluZyBjcmVhdGVzIGRlcGVuZGVuY2llc1xuICAgIG9uIHBvdGVudGlhbGx5IGZhci1hd2F5IGNvbnRlbnQsIHdoaWNoIG1heSByZWR1Y2UgdGhlXG4gICAgZWZmZWN0aXZlbmVzcyBpbmNyZW1lbnRhbCBwYXJzaW5nXHUyMDE0d2hlbiBsb29raW5nIGZvcndhcmRcdTIwMTRvciBldmVuXG4gICAgY2F1c2UgaW52YWxpZCByZXBhcnNlcyB3aGVuIGxvb2tpbmcgYmFja3dhcmQgbW9yZSB0aGFuIDI1IGNvZGVcbiAgICB1bml0cywgc2luY2UgdGhlIGxpYnJhcnkgZG9lcyBub3QgdHJhY2sgbG9va2JlaGluZC5cbiAgICAqL1xuICAgIHBlZWsob2Zmc2V0KSB7XG4gICAgICAgIGxldCBpZHggPSB0aGlzLmNodW5rT2ZmICsgb2Zmc2V0LCBwb3MsIHJlc3VsdDtcbiAgICAgICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IHRoaXMuY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICBwb3MgPSB0aGlzLnBvcyArIG9mZnNldDtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuY2h1bmsuY2hhckNvZGVBdChpZHgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlT2Zmc2V0KG9mZnNldCwgMSk7XG4gICAgICAgICAgICBpZiAocmVzb2x2ZWQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICBwb3MgPSByZXNvbHZlZDtcbiAgICAgICAgICAgIGlmIChwb3MgPj0gdGhpcy5jaHVuazJQb3MgJiYgcG9zIDwgdGhpcy5jaHVuazJQb3MgKyB0aGlzLmNodW5rMi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmNodW5rMi5jaGFyQ29kZUF0KHBvcyAtIHRoaXMuY2h1bmsyUG9zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBpID0gdGhpcy5yYW5nZUluZGV4LCByYW5nZSA9IHRoaXMucmFuZ2U7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHJhbmdlLnRvIDw9IHBvcylcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLnJhbmdlc1srK2ldO1xuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmsyID0gdGhpcy5pbnB1dC5jaHVuayh0aGlzLmNodW5rMlBvcyA9IHBvcyk7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyArIHRoaXMuY2h1bmsyLmxlbmd0aCA+IHJhbmdlLnRvKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNodW5rMiA9IHRoaXMuY2h1bmsyLnNsaWNlKDAsIHJhbmdlLnRvIC0gcG9zKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmNodW5rMi5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwb3MgPj0gdGhpcy50b2tlbi5sb29rQWhlYWQpXG4gICAgICAgICAgICB0aGlzLnRva2VuLmxvb2tBaGVhZCA9IHBvcyArIDE7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEFjY2VwdCBhIHRva2VuLiBCeSBkZWZhdWx0LCB0aGUgZW5kIG9mIHRoZSB0b2tlbiBpcyBzZXQgdG8gdGhlXG4gICAgY3VycmVudCBzdHJlYW0gcG9zaXRpb24sIGJ1dCB5b3UgY2FuIHBhc3MgYW4gb2Zmc2V0IChyZWxhdGl2ZSB0b1xuICAgIHRoZSBzdHJlYW0gcG9zaXRpb24pIHRvIGNoYW5nZSB0aGF0LlxuICAgICovXG4gICAgYWNjZXB0VG9rZW4odG9rZW4sIGVuZE9mZnNldCA9IDApIHtcbiAgICAgICAgbGV0IGVuZCA9IGVuZE9mZnNldCA/IHRoaXMucmVzb2x2ZU9mZnNldChlbmRPZmZzZXQsIC0xKSA6IHRoaXMucG9zO1xuICAgICAgICBpZiAoZW5kID09IG51bGwgfHwgZW5kIDwgdGhpcy50b2tlbi5zdGFydClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVG9rZW4gZW5kIG91dCBvZiBib3VuZHNcIik7XG4gICAgICAgIHRoaXMudG9rZW4udmFsdWUgPSB0b2tlbjtcbiAgICAgICAgdGhpcy50b2tlbi5lbmQgPSBlbmQ7XG4gICAgfVxuICAgIGdldENodW5rKCkge1xuICAgICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5jaHVuazJQb3MgJiYgdGhpcy5wb3MgPCB0aGlzLmNodW5rMlBvcyArIHRoaXMuY2h1bmsyLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHsgY2h1bmssIGNodW5rUG9zIH0gPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5jaHVuayA9IHRoaXMuY2h1bmsyO1xuICAgICAgICAgICAgdGhpcy5jaHVua1BvcyA9IHRoaXMuY2h1bmsyUG9zO1xuICAgICAgICAgICAgdGhpcy5jaHVuazIgPSBjaHVuaztcbiAgICAgICAgICAgIHRoaXMuY2h1bmsyUG9zID0gY2h1bmtQb3M7XG4gICAgICAgICAgICB0aGlzLmNodW5rT2ZmID0gdGhpcy5wb3MgLSB0aGlzLmNodW5rUG9zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaHVuazIgPSB0aGlzLmNodW5rO1xuICAgICAgICAgICAgdGhpcy5jaHVuazJQb3MgPSB0aGlzLmNodW5rUG9zO1xuICAgICAgICAgICAgbGV0IG5leHRDaHVuayA9IHRoaXMuaW5wdXQuY2h1bmsodGhpcy5wb3MpO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHRoaXMucG9zICsgbmV4dENodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuY2h1bmsgPSBlbmQgPiB0aGlzLnJhbmdlLnRvID8gbmV4dENodW5rLnNsaWNlKDAsIHRoaXMucmFuZ2UudG8gLSB0aGlzLnBvcykgOiBuZXh0Q2h1bms7XG4gICAgICAgICAgICB0aGlzLmNodW5rUG9zID0gdGhpcy5wb3M7XG4gICAgICAgICAgICB0aGlzLmNodW5rT2ZmID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWFkTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtPZmYgPj0gdGhpcy5jaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2h1bmsoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNodW5rT2ZmID09IHRoaXMuY2h1bmsubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0ID0gdGhpcy5jaHVuay5jaGFyQ29kZUF0KHRoaXMuY2h1bmtPZmYpO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBzdHJlYW0gZm9yd2FyZCBOIChkZWZhdWx0cyB0byAxKSBjb2RlIHVuaXRzLiBSZXR1cm5zXG4gICAgdGhlIG5ldyB2YWx1ZSBvZiBbYG5leHRgXSgjbHIuSW5wdXRTdHJlYW0ubmV4dCkuXG4gICAgKi9cbiAgICBhZHZhbmNlKG4gPSAxKSB7XG4gICAgICAgIHRoaXMuY2h1bmtPZmYgKz0gbjtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zICsgbiA+PSB0aGlzLnJhbmdlLnRvKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yYW5nZUluZGV4ID09IHRoaXMucmFuZ2VzLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0RG9uZSgpO1xuICAgICAgICAgICAgbiAtPSB0aGlzLnJhbmdlLnRvIC0gdGhpcy5wb3M7XG4gICAgICAgICAgICB0aGlzLnJhbmdlID0gdGhpcy5yYW5nZXNbKyt0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5wb3MgPSB0aGlzLnJhbmdlLmZyb207XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3MgKz0gbjtcbiAgICAgICAgaWYgKHRoaXMucG9zID49IHRoaXMudG9rZW4ubG9va0FoZWFkKVxuICAgICAgICAgICAgdGhpcy50b2tlbi5sb29rQWhlYWQgPSB0aGlzLnBvcyArIDE7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWROZXh0KCk7XG4gICAgfVxuICAgIHNldERvbmUoKSB7XG4gICAgICAgIHRoaXMucG9zID0gdGhpcy5jaHVua1BvcyA9IHRoaXMuZW5kO1xuICAgICAgICB0aGlzLnJhbmdlID0gdGhpcy5yYW5nZXNbdGhpcy5yYW5nZUluZGV4ID0gdGhpcy5yYW5nZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHRoaXMuY2h1bmsgPSBcIlwiO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0ID0gLTE7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzZXQocG9zLCB0b2tlbikge1xuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgIHRva2VuLnN0YXJ0ID0gcG9zO1xuICAgICAgICAgICAgdG9rZW4ubG9va0FoZWFkID0gcG9zICsgMTtcbiAgICAgICAgICAgIHRva2VuLnZhbHVlID0gdG9rZW4uZXh0ZW5kZWQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSBudWxsVG9rZW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9zICE9IHBvcykge1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgICAgICBpZiAocG9zID09IHRoaXMuZW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREb25lKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAocG9zIDwgdGhpcy5yYW5nZS5mcm9tKVxuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2UgPSB0aGlzLnJhbmdlc1stLXRoaXMucmFuZ2VJbmRleF07XG4gICAgICAgICAgICB3aGlsZSAocG9zID49IHRoaXMucmFuZ2UudG8pXG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZSA9IHRoaXMucmFuZ2VzWysrdGhpcy5yYW5nZUluZGV4XTtcbiAgICAgICAgICAgIGlmIChwb3MgPj0gdGhpcy5jaHVua1BvcyAmJiBwb3MgPCB0aGlzLmNodW5rUG9zICsgdGhpcy5jaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNodW5rT2ZmID0gcG9zIC0gdGhpcy5jaHVua1BvcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmsgPSBcIlwiO1xuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtPZmYgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkTmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlYWQoZnJvbSwgdG8pIHtcbiAgICAgICAgaWYgKGZyb20gPj0gdGhpcy5jaHVua1BvcyAmJiB0byA8PSB0aGlzLmNodW5rUG9zICsgdGhpcy5jaHVuay5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaHVuay5zbGljZShmcm9tIC0gdGhpcy5jaHVua1BvcywgdG8gLSB0aGlzLmNodW5rUG9zKTtcbiAgICAgICAgaWYgKGZyb20gPj0gdGhpcy5jaHVuazJQb3MgJiYgdG8gPD0gdGhpcy5jaHVuazJQb3MgKyB0aGlzLmNodW5rMi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaHVuazIuc2xpY2UoZnJvbSAtIHRoaXMuY2h1bmsyUG9zLCB0byAtIHRoaXMuY2h1bmsyUG9zKTtcbiAgICAgICAgaWYgKGZyb20gPj0gdGhpcy5yYW5nZS5mcm9tICYmIHRvIDw9IHRoaXMucmFuZ2UudG8pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dC5yZWFkKGZyb20sIHRvKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IHIgb2YgdGhpcy5yYW5nZXMpIHtcbiAgICAgICAgICAgIGlmIChyLmZyb20gPj0gdG8pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAoci50byA+IGZyb20pXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuaW5wdXQucmVhZChNYXRoLm1heChyLmZyb20sIGZyb20pLCBNYXRoLm1pbihyLnRvLCB0bykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG5AaW50ZXJuYWxcbiovXG5jbGFzcyBUb2tlbkdyb3VwIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCBpZCkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgfVxuICAgIHRva2VuKGlucHV0LCBzdGFjaykge1xuICAgICAgICBsZXQgeyBwYXJzZXIgfSA9IHN0YWNrLnA7XG4gICAgICAgIHJlYWRUb2tlbih0aGlzLmRhdGEsIGlucHV0LCBzdGFjaywgdGhpcy5pZCwgcGFyc2VyLmRhdGEsIHBhcnNlci50b2tlblByZWNUYWJsZSk7XG4gICAgfVxufVxuVG9rZW5Hcm91cC5wcm90b3R5cGUuY29udGV4dHVhbCA9IFRva2VuR3JvdXAucHJvdG90eXBlLmZhbGxiYWNrID0gVG9rZW5Hcm91cC5wcm90b3R5cGUuZXh0ZW5kID0gZmFsc2U7XG4vKipcbkBoaWRlXG4qL1xuY2xhc3MgTG9jYWxUb2tlbkdyb3VwIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCBwcmVjVGFibGUsIGVsc2VUb2tlbikge1xuICAgICAgICB0aGlzLnByZWNUYWJsZSA9IHByZWNUYWJsZTtcbiAgICAgICAgdGhpcy5lbHNlVG9rZW4gPSBlbHNlVG9rZW47XG4gICAgICAgIHRoaXMuZGF0YSA9IHR5cGVvZiBkYXRhID09IFwic3RyaW5nXCIgPyBkZWNvZGVBcnJheShkYXRhKSA6IGRhdGE7XG4gICAgfVxuICAgIHRva2VuKGlucHV0LCBzdGFjaykge1xuICAgICAgICBsZXQgc3RhcnQgPSBpbnB1dC5wb3MsIHNraXBwZWQgPSAwO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgYXRFb2YgPSBpbnB1dC5uZXh0IDwgMCwgbmV4dFBvcyA9IGlucHV0LnJlc29sdmVPZmZzZXQoMSwgMSk7XG4gICAgICAgICAgICByZWFkVG9rZW4odGhpcy5kYXRhLCBpbnB1dCwgc3RhY2ssIDAsIHRoaXMuZGF0YSwgdGhpcy5wcmVjVGFibGUpO1xuICAgICAgICAgICAgaWYgKGlucHV0LnRva2VuLnZhbHVlID4gLTEpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAodGhpcy5lbHNlVG9rZW4gPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAoIWF0RW9mKVxuICAgICAgICAgICAgICAgIHNraXBwZWQrKztcbiAgICAgICAgICAgIGlmIChuZXh0UG9zID09IG51bGwpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpbnB1dC5yZXNldChuZXh0UG9zLCBpbnB1dC50b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNraXBwZWQpIHtcbiAgICAgICAgICAgIGlucHV0LnJlc2V0KHN0YXJ0LCBpbnB1dC50b2tlbik7XG4gICAgICAgICAgICBpbnB1dC5hY2NlcHRUb2tlbih0aGlzLmVsc2VUb2tlbiwgc2tpcHBlZCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5Mb2NhbFRva2VuR3JvdXAucHJvdG90eXBlLmNvbnRleHR1YWwgPSBUb2tlbkdyb3VwLnByb3RvdHlwZS5mYWxsYmFjayA9IFRva2VuR3JvdXAucHJvdG90eXBlLmV4dGVuZCA9IGZhbHNlO1xuLyoqXG5gQGV4dGVybmFsIHRva2Vuc2AgZGVjbGFyYXRpb25zIGluIHRoZSBncmFtbWFyIHNob3VsZCByZXNvbHZlIHRvXG5hbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLlxuKi9cbmNsYXNzIEV4dGVybmFsVG9rZW5pemVyIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSB0b2tlbml6ZXIuIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgZnVuY3Rpb24gdGhhdCxcbiAgICBnaXZlbiBhbiBpbnB1dCBzdHJlYW0sIHNjYW5zIGZvciB0aGUgdHlwZXMgb2YgdG9rZW5zIGl0XG4gICAgcmVjb2duaXplcyBhdCB0aGUgc3RyZWFtJ3MgcG9zaXRpb24sIGFuZCBjYWxsc1xuICAgIFtgYWNjZXB0VG9rZW5gXSgjbHIuSW5wdXRTdHJlYW0uYWNjZXB0VG9rZW4pIHdoZW4gaXQgZmluZHNcbiAgICBvbmUuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRva2VuLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICB0aGlzLmNvbnRleHR1YWwgPSAhIW9wdGlvbnMuY29udGV4dHVhbDtcbiAgICAgICAgdGhpcy5mYWxsYmFjayA9ICEhb3B0aW9ucy5mYWxsYmFjaztcbiAgICAgICAgdGhpcy5leHRlbmQgPSAhIW9wdGlvbnMuZXh0ZW5kO1xuICAgIH1cbn1cbi8vIFRva2VuaXplciBkYXRhIGlzIHN0b3JlZCBhIGJpZyB1aW50MTYgYXJyYXkgY29udGFpbmluZywgZm9yIGVhY2hcbi8vIHN0YXRlOlxuLy9cbi8vICAtIEEgZ3JvdXAgYml0bWFzaywgaW5kaWNhdGluZyB3aGF0IHRva2VuIGdyb3VwcyBhcmUgcmVhY2hhYmxlIGZyb21cbi8vICAgIHRoaXMgc3RhdGUsIHNvIHRoYXQgcGF0aHMgdGhhdCBjYW4gb25seSBsZWFkIHRvIHRva2VucyBub3QgaW5cbi8vICAgIGFueSBvZiB0aGUgY3VycmVudCBncm91cHMgY2FuIGJlIGN1dCBvZmYgZWFybHkuXG4vL1xuLy8gIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIHN0YXRlJ3Mgc2VxdWVuY2Ugb2YgYWNjZXB0aW5nXG4vLyAgICB0b2tlbnNcbi8vXG4vLyAgLSBUaGUgbnVtYmVyIG9mIG91dGdvaW5nIGVkZ2VzIGZvciB0aGUgc3RhdGVcbi8vXG4vLyAgLSBUaGUgYWNjZXB0aW5nIHRva2VucywgYXMgKHRva2VuIGlkLCBncm91cCBtYXNrKSBwYWlyc1xuLy9cbi8vICAtIFRoZSBvdXRnb2luZyBlZGdlcywgYXMgKHN0YXJ0IGNoYXJhY3RlciwgZW5kIGNoYXJhY3Rlciwgc3RhdGVcbi8vICAgIGluZGV4KSB0cmlwbGVzLCB3aXRoIGVuZCBjaGFyYWN0ZXIgYmVpbmcgZXhjbHVzaXZlXG4vL1xuLy8gVGhpcyBmdW5jdGlvbiBpbnRlcnByZXRzIHRoYXQgZGF0YSwgcnVubmluZyB0aHJvdWdoIGEgc3RyZWFtIGFzXG4vLyBsb25nIGFzIG5ldyBzdGF0ZXMgd2l0aCB0aGUgYSBtYXRjaGluZyBncm91cCBtYXNrIGNhbiBiZSByZWFjaGVkLFxuLy8gYW5kIHVwZGF0aW5nIGBpbnB1dC50b2tlbmAgd2hlbiBpdCBtYXRjaGVzIGEgdG9rZW4uXG5mdW5jdGlvbiByZWFkVG9rZW4oZGF0YSwgaW5wdXQsIHN0YWNrLCBncm91cCwgcHJlY1RhYmxlLCBwcmVjT2Zmc2V0KSB7XG4gICAgbGV0IHN0YXRlID0gMCwgZ3JvdXBNYXNrID0gMSA8PCBncm91cCwgeyBkaWFsZWN0IH0gPSBzdGFjay5wLnBhcnNlcjtcbiAgICBzY2FuOiBmb3IgKDs7KSB7XG4gICAgICAgIGlmICgoZ3JvdXBNYXNrICYgZGF0YVtzdGF0ZV0pID09IDApXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IGFjY0VuZCA9IGRhdGFbc3RhdGUgKyAxXTtcbiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGlzIHN0YXRlIGNhbiBsZWFkIHRvIGEgdG9rZW4gaW4gdGhlIGN1cnJlbnQgZ3JvdXBcbiAgICAgICAgLy8gQWNjZXB0IHRva2VucyBpbiB0aGlzIHN0YXRlLCBwb3NzaWJseSBvdmVyd3JpdGluZ1xuICAgICAgICAvLyBsb3dlci1wcmVjZWRlbmNlIC8gc2hvcnRlciB0b2tlbnNcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXRlICsgMzsgaSA8IGFjY0VuZDsgaSArPSAyKVxuICAgICAgICAgICAgaWYgKChkYXRhW2kgKyAxXSAmIGdyb3VwTWFzaykgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRlcm0gPSBkYXRhW2ldO1xuICAgICAgICAgICAgICAgIGlmIChkaWFsZWN0LmFsbG93cyh0ZXJtKSAmJlxuICAgICAgICAgICAgICAgICAgICAoaW5wdXQudG9rZW4udmFsdWUgPT0gLTEgfHwgaW5wdXQudG9rZW4udmFsdWUgPT0gdGVybSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVzKHRlcm0sIGlucHV0LnRva2VuLnZhbHVlLCBwcmVjVGFibGUsIHByZWNPZmZzZXQpKSkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dC5hY2NlcHRUb2tlbih0ZXJtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dCA9IGlucHV0Lm5leHQsIGxvdyA9IDAsIGhpZ2ggPSBkYXRhW3N0YXRlICsgMl07XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgRU9GXG4gICAgICAgIGlmIChpbnB1dC5uZXh0IDwgMCAmJiBoaWdoID4gbG93ICYmIGRhdGFbYWNjRW5kICsgaGlnaCAqIDMgLSAzXSA9PSA2NTUzNSAvKiBTZXEuRW5kICovKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGRhdGFbYWNjRW5kICsgaGlnaCAqIDMgLSAxXTtcbiAgICAgICAgICAgIGNvbnRpbnVlIHNjYW47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG8gYSBiaW5hcnkgc2VhcmNoIG9uIHRoZSBzdGF0ZSdzIGVkZ2VzXG4gICAgICAgIGZvciAoOyBsb3cgPCBoaWdoOykge1xuICAgICAgICAgICAgbGV0IG1pZCA9IChsb3cgKyBoaWdoKSA+PiAxO1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gYWNjRW5kICsgbWlkICsgKG1pZCA8PCAxKTtcbiAgICAgICAgICAgIGxldCBmcm9tID0gZGF0YVtpbmRleF0sIHRvID0gZGF0YVtpbmRleCArIDFdIHx8IDB4MTAwMDA7XG4gICAgICAgICAgICBpZiAobmV4dCA8IGZyb20pXG4gICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgPj0gdG8pXG4gICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXRlID0gZGF0YVtpbmRleCArIDJdO1xuICAgICAgICAgICAgICAgIGlucHV0LmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZSBzY2FuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmRPZmZzZXQoZGF0YSwgc3RhcnQsIHRlcm0pIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQsIG5leHQ7IChuZXh0ID0gZGF0YVtpXSkgIT0gNjU1MzUgLyogU2VxLkVuZCAqLzsgaSsrKVxuICAgICAgICBpZiAobmV4dCA9PSB0ZXJtKVxuICAgICAgICAgICAgcmV0dXJuIGkgLSBzdGFydDtcbiAgICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiBvdmVycmlkZXModG9rZW4sIHByZXYsIHRhYmxlRGF0YSwgdGFibGVPZmZzZXQpIHtcbiAgICBsZXQgaVByZXYgPSBmaW5kT2Zmc2V0KHRhYmxlRGF0YSwgdGFibGVPZmZzZXQsIHByZXYpO1xuICAgIHJldHVybiBpUHJldiA8IDAgfHwgZmluZE9mZnNldCh0YWJsZURhdGEsIHRhYmxlT2Zmc2V0LCB0b2tlbikgPCBpUHJldjtcbn1cblxuLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgdXNlZCB0byBjb250cm9sIGNvbnNvbGUgb3V0cHV0XG5jb25zdCB2ZXJib3NlID0gdHlwZW9mIHByb2Nlc3MgIT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudiAmJiAvXFxicGFyc2VcXGIvLnRlc3QocHJvY2Vzcy5lbnYuTE9HKTtcbmxldCBzdGFja0lEcyA9IG51bGw7XG5mdW5jdGlvbiBjdXRBdCh0cmVlLCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgY3Vyc29yID0gdHJlZS5jdXJzb3IoSXRlck1vZGUuSW5jbHVkZUFub255bW91cyk7XG4gICAgY3Vyc29yLm1vdmVUbyhwb3MpO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKCEoc2lkZSA8IDAgPyBjdXJzb3IuY2hpbGRCZWZvcmUocG9zKSA6IGN1cnNvci5jaGlsZEFmdGVyKHBvcykpKVxuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGlmICgoc2lkZSA8IDAgPyBjdXJzb3IudG8gPCBwb3MgOiBjdXJzb3IuZnJvbSA+IHBvcykgJiYgIWN1cnNvci50eXBlLmlzRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWRlIDwgMCA/IE1hdGgubWF4KDAsIE1hdGgubWluKGN1cnNvci50byAtIDEsIHBvcyAtIDI1IC8qIFNhZmV0eS5NYXJnaW4gKi8pKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBNYXRoLm1pbih0cmVlLmxlbmd0aCwgTWF0aC5tYXgoY3Vyc29yLmZyb20gKyAxLCBwb3MgKyAyNSAvKiBTYWZldHkuTWFyZ2luICovKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNpZGUgPCAwID8gY3Vyc29yLnByZXZTaWJsaW5nKCkgOiBjdXJzb3IubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWRlIDwgMCA/IDAgOiB0cmVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBGcmFnbWVudEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoZnJhZ21lbnRzLCBub2RlU2V0KSB7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLm5vZGVTZXQgPSBub2RlU2V0O1xuICAgICAgICB0aGlzLmkgPSAwO1xuICAgICAgICB0aGlzLmZyYWdtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zYWZlRnJvbSA9IC0xO1xuICAgICAgICB0aGlzLnNhZmVUbyA9IC0xO1xuICAgICAgICB0aGlzLnRyZWVzID0gW107XG4gICAgICAgIHRoaXMuc3RhcnQgPSBbXTtcbiAgICAgICAgdGhpcy5pbmRleCA9IFtdO1xuICAgICAgICB0aGlzLm5leHRGcmFnbWVudCgpO1xuICAgIH1cbiAgICBuZXh0RnJhZ21lbnQoKSB7XG4gICAgICAgIGxldCBmciA9IHRoaXMuZnJhZ21lbnQgPSB0aGlzLmkgPT0gdGhpcy5mcmFnbWVudHMubGVuZ3RoID8gbnVsbCA6IHRoaXMuZnJhZ21lbnRzW3RoaXMuaSsrXTtcbiAgICAgICAgaWYgKGZyKSB7XG4gICAgICAgICAgICB0aGlzLnNhZmVGcm9tID0gZnIub3BlblN0YXJ0ID8gY3V0QXQoZnIudHJlZSwgZnIuZnJvbSArIGZyLm9mZnNldCwgMSkgLSBmci5vZmZzZXQgOiBmci5mcm9tO1xuICAgICAgICAgICAgdGhpcy5zYWZlVG8gPSBmci5vcGVuRW5kID8gY3V0QXQoZnIudHJlZSwgZnIudG8gKyBmci5vZmZzZXQsIC0xKSAtIGZyLm9mZnNldCA6IGZyLnRvO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMudHJlZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0LnBvcCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXgucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRyZWVzLnB1c2goZnIudHJlZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0LnB1c2goLWZyLm9mZnNldCk7XG4gICAgICAgICAgICB0aGlzLmluZGV4LnB1c2goMCk7XG4gICAgICAgICAgICB0aGlzLm5leHRTdGFydCA9IHRoaXMuc2FmZUZyb207XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5leHRTdGFydCA9IDFlOTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBgcG9zYCBtdXN0IGJlID49IGFueSBwcmV2aW91c2x5IGdpdmVuIGBwb3NgIGZvciB0aGlzIGN1cnNvclxuICAgIG5vZGVBdChwb3MpIHtcbiAgICAgICAgaWYgKHBvcyA8IHRoaXMubmV4dFN0YXJ0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHdoaWxlICh0aGlzLmZyYWdtZW50ICYmIHRoaXMuc2FmZVRvIDw9IHBvcylcbiAgICAgICAgICAgIHRoaXMubmV4dEZyYWdtZW50KCk7XG4gICAgICAgIGlmICghdGhpcy5mcmFnbWVudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMudHJlZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGlmIChsYXN0IDwgMCkgeyAvLyBFbmQgb2YgdHJlZVxuICAgICAgICAgICAgICAgIHRoaXMubmV4dEZyYWdtZW50KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdG9wID0gdGhpcy50cmVlc1tsYXN0XSwgaW5kZXggPSB0aGlzLmluZGV4W2xhc3RdO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IHRvcC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQucG9wKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleC5wb3AoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBuZXh0ID0gdG9wLmNoaWxkcmVuW2luZGV4XTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuc3RhcnRbbGFzdF0gKyB0b3AucG9zaXRpb25zW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChzdGFydCA+IHBvcykge1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIFRyZWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gcG9zKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IHRoaXMuc2FmZUZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVuZCA9IHN0YXJ0ICsgbmV4dC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmQgPD0gdGhpcy5zYWZlVG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsb29rQWhlYWQgPSBuZXh0LnByb3AoTm9kZVByb3AubG9va0FoZWFkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9va0FoZWFkIHx8IGVuZCArIGxvb2tBaGVhZCA8IHRoaXMuZnJhZ21lbnQudG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleFtsYXN0XSsrO1xuICAgICAgICAgICAgICAgIGlmIChzdGFydCArIG5leHQubGVuZ3RoID49IE1hdGgubWF4KHRoaXMuc2FmZUZyb20sIHBvcykpIHsgLy8gRW50ZXIgdGhpcyBub2RlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZXMucHVzaChuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydC5wdXNoKHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleC5wdXNoKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhbbGFzdF0rKztcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGFydCA9IHN0YXJ0ICsgbmV4dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBUb2tlbkNhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIsIHN0cmVhbSkge1xuICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgdGhpcy50b2tlbnMgPSBbXTtcbiAgICAgICAgdGhpcy5tYWluVG9rZW4gPSBudWxsO1xuICAgICAgICB0aGlzLmFjdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy50b2tlbnMgPSBwYXJzZXIudG9rZW5pemVycy5tYXAoXyA9PiBuZXcgQ2FjaGVkVG9rZW4pO1xuICAgIH1cbiAgICBnZXRBY3Rpb25zKHN0YWNrKSB7XG4gICAgICAgIGxldCBhY3Rpb25JbmRleCA9IDA7XG4gICAgICAgIGxldCBtYWluID0gbnVsbDtcbiAgICAgICAgbGV0IHsgcGFyc2VyIH0gPSBzdGFjay5wLCB7IHRva2VuaXplcnMgfSA9IHBhcnNlcjtcbiAgICAgICAgbGV0IG1hc2sgPSBwYXJzZXIuc3RhdGVTbG90KHN0YWNrLnN0YXRlLCAzIC8qIFBhcnNlU3RhdGUuVG9rZW5pemVyTWFzayAqLyk7XG4gICAgICAgIGxldCBjb250ZXh0ID0gc3RhY2suY3VyQ29udGV4dCA/IHN0YWNrLmN1ckNvbnRleHQuaGFzaCA6IDA7XG4gICAgICAgIGxldCBsb29rQWhlYWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2VuaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICgoKDEgPDwgaSkgJiBtYXNrKSA9PSAwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHRva2VuaXplciA9IHRva2VuaXplcnNbaV0sIHRva2VuID0gdGhpcy50b2tlbnNbaV07XG4gICAgICAgICAgICBpZiAobWFpbiAmJiAhdG9rZW5pemVyLmZhbGxiYWNrKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRva2VuaXplci5jb250ZXh0dWFsIHx8IHRva2VuLnN0YXJ0ICE9IHN0YWNrLnBvcyB8fCB0b2tlbi5tYXNrICE9IG1hc2sgfHwgdG9rZW4uY29udGV4dCAhPSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYWNoZWRUb2tlbih0b2tlbiwgdG9rZW5pemVyLCBzdGFjayk7XG4gICAgICAgICAgICAgICAgdG9rZW4ubWFzayA9IG1hc2s7XG4gICAgICAgICAgICAgICAgdG9rZW4uY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9rZW4ubG9va0FoZWFkID4gdG9rZW4uZW5kICsgMjUgLyogU2FmZXR5Lk1hcmdpbiAqLylcbiAgICAgICAgICAgICAgICBsb29rQWhlYWQgPSBNYXRoLm1heCh0b2tlbi5sb29rQWhlYWQsIGxvb2tBaGVhZCk7XG4gICAgICAgICAgICBpZiAodG9rZW4udmFsdWUgIT0gMCAvKiBUZXJtLkVyciAqLykge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gYWN0aW9uSW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuLmV4dGVuZGVkID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbkluZGV4ID0gdGhpcy5hZGRBY3Rpb25zKHN0YWNrLCB0b2tlbi5leHRlbmRlZCwgdG9rZW4uZW5kLCBhY3Rpb25JbmRleCk7XG4gICAgICAgICAgICAgICAgYWN0aW9uSW5kZXggPSB0aGlzLmFkZEFjdGlvbnMoc3RhY2ssIHRva2VuLnZhbHVlLCB0b2tlbi5lbmQsIGFjdGlvbkluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRva2VuaXplci5leHRlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uSW5kZXggPiBzdGFydEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0aGlzLmFjdGlvbnMubGVuZ3RoID4gYWN0aW9uSW5kZXgpXG4gICAgICAgICAgICB0aGlzLmFjdGlvbnMucG9wKCk7XG4gICAgICAgIGlmIChsb29rQWhlYWQpXG4gICAgICAgICAgICBzdGFjay5zZXRMb29rQWhlYWQobG9va0FoZWFkKTtcbiAgICAgICAgaWYgKCFtYWluICYmIHN0YWNrLnBvcyA9PSB0aGlzLnN0cmVhbS5lbmQpIHtcbiAgICAgICAgICAgIG1haW4gPSBuZXcgQ2FjaGVkVG9rZW47XG4gICAgICAgICAgICBtYWluLnZhbHVlID0gc3RhY2sucC5wYXJzZXIuZW9mVGVybTtcbiAgICAgICAgICAgIG1haW4uc3RhcnQgPSBtYWluLmVuZCA9IHN0YWNrLnBvcztcbiAgICAgICAgICAgIGFjdGlvbkluZGV4ID0gdGhpcy5hZGRBY3Rpb25zKHN0YWNrLCBtYWluLnZhbHVlLCBtYWluLmVuZCwgYWN0aW9uSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFpblRva2VuID0gbWFpbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucztcbiAgICB9XG4gICAgZ2V0TWFpblRva2VuKHN0YWNrKSB7XG4gICAgICAgIGlmICh0aGlzLm1haW5Ub2tlbilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5Ub2tlbjtcbiAgICAgICAgbGV0IG1haW4gPSBuZXcgQ2FjaGVkVG9rZW4sIHsgcG9zLCBwIH0gPSBzdGFjaztcbiAgICAgICAgbWFpbi5zdGFydCA9IHBvcztcbiAgICAgICAgbWFpbi5lbmQgPSBNYXRoLm1pbihwb3MgKyAxLCBwLnN0cmVhbS5lbmQpO1xuICAgICAgICBtYWluLnZhbHVlID0gcG9zID09IHAuc3RyZWFtLmVuZCA/IHAucGFyc2VyLmVvZlRlcm0gOiAwIC8qIFRlcm0uRXJyICovO1xuICAgICAgICByZXR1cm4gbWFpbjtcbiAgICB9XG4gICAgdXBkYXRlQ2FjaGVkVG9rZW4odG9rZW4sIHRva2VuaXplciwgc3RhY2spIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zdHJlYW0uY2xpcFBvcyhzdGFjay5wb3MpO1xuICAgICAgICB0b2tlbml6ZXIudG9rZW4odGhpcy5zdHJlYW0ucmVzZXQoc3RhcnQsIHRva2VuKSwgc3RhY2spO1xuICAgICAgICBpZiAodG9rZW4udmFsdWUgPiAtMSkge1xuICAgICAgICAgICAgbGV0IHsgcGFyc2VyIH0gPSBzdGFjay5wO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJzZXIuc3BlY2lhbGl6ZWQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlci5zcGVjaWFsaXplZFtpXSA9PSB0b2tlbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcGFyc2VyLnNwZWNpYWxpemVyc1tpXSh0aGlzLnN0cmVhbS5yZWFkKHRva2VuLnN0YXJ0LCB0b2tlbi5lbmQpLCBzdGFjayk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPj0gMCAmJiBzdGFjay5wLnBhcnNlci5kaWFsZWN0LmFsbG93cyhyZXN1bHQgPj4gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmVzdWx0ICYgMSkgPT0gMCAvKiBTcGVjaWFsaXplLlNwZWNpYWxpemUgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4udmFsdWUgPSByZXN1bHQgPj4gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5leHRlbmRlZCA9IHJlc3VsdCA+PiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0b2tlbi52YWx1ZSA9IDAgLyogVGVybS5FcnIgKi87XG4gICAgICAgICAgICB0b2tlbi5lbmQgPSB0aGlzLnN0cmVhbS5jbGlwUG9zKHN0YXJ0ICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHV0QWN0aW9uKGFjdGlvbiwgdG9rZW4sIGVuZCwgaW5kZXgpIHtcbiAgICAgICAgLy8gRG9uJ3QgYWRkIGR1cGxpY2F0ZSBhY3Rpb25zXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkgKz0gMylcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGlvbnNbaV0gPT0gYWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgdGhpcy5hY3Rpb25zW2luZGV4KytdID0gYWN0aW9uO1xuICAgICAgICB0aGlzLmFjdGlvbnNbaW5kZXgrK10gPSB0b2tlbjtcbiAgICAgICAgdGhpcy5hY3Rpb25zW2luZGV4KytdID0gZW5kO1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIGFkZEFjdGlvbnMoc3RhY2ssIHRva2VuLCBlbmQsIGluZGV4KSB7XG4gICAgICAgIGxldCB7IHN0YXRlIH0gPSBzdGFjaywgeyBwYXJzZXIgfSA9IHN0YWNrLnAsIHsgZGF0YSB9ID0gcGFyc2VyO1xuICAgICAgICBmb3IgKGxldCBzZXQgPSAwOyBzZXQgPCAyOyBzZXQrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBhcnNlci5zdGF0ZVNsb3Qoc3RhdGUsIHNldCA/IDIgLyogUGFyc2VTdGF0ZS5Ta2lwICovIDogMSAvKiBQYXJzZVN0YXRlLkFjdGlvbnMgKi8pOzsgaSArPSAzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFbaV0gPT0gNjU1MzUgLyogU2VxLkVuZCAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVtpICsgMV0gPT0gMSAvKiBTZXEuTmV4dCAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHBhaXIoZGF0YSwgaSArIDIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDAgJiYgZGF0YVtpICsgMV0gPT0gMiAvKiBTZXEuT3RoZXIgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB0aGlzLnB1dEFjdGlvbihwYWlyKGRhdGEsIGkgKyAyKSwgdG9rZW4sIGVuZCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFbaV0gPT0gdG9rZW4pXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5wdXRBY3Rpb24ocGFpcihkYXRhLCBpICsgMSksIHRva2VuLCBlbmQsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxufVxuY2xhc3MgUGFyc2Uge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlciwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICB0aGlzLnJlY292ZXJpbmcgPSAwO1xuICAgICAgICB0aGlzLm5leHRTdGFja0lEID0gMHgyNjU0OyAvLyBcdTI2NTQsIFx1MjY1NSwgXHUyNjU2LCBcdTI2NTcsIFx1MjY1OCwgXHUyNjU5LCBcdTI2NjAsIFx1MjY2MSwgXHUyNjYyLCBcdTI2NjMsIFx1MjY2NCwgXHUyNjY1LCBcdTI2NjYsIFx1MjY2N1xuICAgICAgICB0aGlzLm1pblN0YWNrUG9zID0gMDtcbiAgICAgICAgdGhpcy5yZXVzZWQgPSBbXTtcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RCaWdSZWR1Y3Rpb25TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLmxhc3RCaWdSZWR1Y3Rpb25TaXplID0gMDtcbiAgICAgICAgdGhpcy5iaWdSZWR1Y3Rpb25Db3VudCA9IDA7XG4gICAgICAgIHRoaXMuc3RyZWFtID0gbmV3IElucHV0U3RyZWFtKGlucHV0LCByYW5nZXMpO1xuICAgICAgICB0aGlzLnRva2VucyA9IG5ldyBUb2tlbkNhY2hlKHBhcnNlciwgdGhpcy5zdHJlYW0pO1xuICAgICAgICB0aGlzLnRvcFRlcm0gPSBwYXJzZXIudG9wWzFdO1xuICAgICAgICBsZXQgeyBmcm9tIH0gPSByYW5nZXNbMF07XG4gICAgICAgIHRoaXMuc3RhY2tzID0gW1N0YWNrLnN0YXJ0KHRoaXMsIHBhcnNlci50b3BbMF0sIGZyb20pXTtcbiAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBmcmFnbWVudHMubGVuZ3RoICYmIHRoaXMuc3RyZWFtLmVuZCAtIGZyb20gPiBwYXJzZXIuYnVmZmVyTGVuZ3RoICogNFxuICAgICAgICAgICAgPyBuZXcgRnJhZ21lbnRDdXJzb3IoZnJhZ21lbnRzLCBwYXJzZXIubm9kZVNldCkgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgcGFyc2VkUG9zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW5TdGFja1BvcztcbiAgICB9XG4gICAgLy8gTW92ZSB0aGUgcGFyc2VyIGZvcndhcmQuIFRoaXMgd2lsbCBwcm9jZXNzIGFsbCBwYXJzZSBzdGFja3MgYXRcbiAgICAvLyBgdGhpcy5wb3NgIGFuZCB0cnkgdG8gYWR2YW5jZSB0aGVtIHRvIGEgZnVydGhlciBwb3NpdGlvbi4gSWYgbm9cbiAgICAvLyBzdGFjayBmb3Igc3VjaCBhIHBvc2l0aW9uIGlzIGZvdW5kLCBpdCdsbCBzdGFydCBlcnJvci1yZWNvdmVyeS5cbiAgICAvL1xuICAgIC8vIFdoZW4gdGhlIHBhcnNlIGlzIGZpbmlzaGVkLCB0aGlzIHdpbGwgcmV0dXJuIGEgc3ludGF4IHRyZWUuIFdoZW5cbiAgICAvLyBub3QsIGl0IHJldHVybnMgYG51bGxgLlxuICAgIGFkdmFuY2UoKSB7XG4gICAgICAgIGxldCBzdGFja3MgPSB0aGlzLnN0YWNrcywgcG9zID0gdGhpcy5taW5TdGFja1BvcztcbiAgICAgICAgLy8gVGhpcyB3aWxsIGhvbGQgc3RhY2tzIGJleW9uZCBgcG9zYC5cbiAgICAgICAgbGV0IG5ld1N0YWNrcyA9IHRoaXMuc3RhY2tzID0gW107XG4gICAgICAgIGxldCBzdG9wcGVkLCBzdG9wcGVkVG9rZW5zO1xuICAgICAgICAvLyBJZiBhIGxhcmdlIGFtb3VudCBvZiByZWR1Y3Rpb25zIGhhcHBlbmVkIHdpdGggdGhlIHNhbWUgc3RhcnRcbiAgICAgICAgLy8gcG9zaXRpb24sIGZvcmNlIHRoZSBzdGFjayBvdXQgb2YgdGhhdCBwcm9kdWN0aW9uIGluIG9yZGVyIHRvXG4gICAgICAgIC8vIGF2b2lkIGNyZWF0aW5nIGEgdHJlZSB0b28gZGVlcCB0byByZWN1cnNlIHRocm91Z2guXG4gICAgICAgIC8vIChUaGlzIGlzIGFuIHVnbHkga2x1ZGdlLCBiZWNhdXNlIHVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm9cbiAgICAgICAgLy8gc3RyYWlnaHRmb3J3YXJkLCBjaGVhcCB3YXkgdG8gY2hlY2sgZm9yIHRoaXMgaGFwcGVuaW5nLCBkdWUgdG9cbiAgICAgICAgLy8gdGhlIGhpc3Rvcnkgb2YgcmVkdWN0aW9ucyBvbmx5IGJlaW5nIGF2YWlsYWJsZSBpbiBhblxuICAgICAgICAvLyBleHBlbnNpdmUtdG8tYWNjZXNzIGZvcm1hdCBpbiB0aGUgc3RhY2sgYnVmZmVycy4pXG4gICAgICAgIGlmICh0aGlzLmJpZ1JlZHVjdGlvbkNvdW50ID4gMzAwIC8qIFJlYy5NYXhMZWZ0QXNzb2NpYXRpdmVSZWR1Y3Rpb25Db3VudCAqLyAmJiBzdGFja3MubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgIGxldCBbc10gPSBzdGFja3M7XG4gICAgICAgICAgICB3aGlsZSAocy5mb3JjZVJlZHVjZSgpICYmIHMuc3RhY2subGVuZ3RoICYmIHMuc3RhY2tbcy5zdGFjay5sZW5ndGggLSAyXSA+PSB0aGlzLmxhc3RCaWdSZWR1Y3Rpb25TdGFydCkgeyB9XG4gICAgICAgICAgICB0aGlzLmJpZ1JlZHVjdGlvbkNvdW50ID0gdGhpcy5sYXN0QmlnUmVkdWN0aW9uU2l6ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gS2VlcCBhZHZhbmNpbmcgYW55IHN0YWNrcyBhdCBgcG9zYCB1bnRpbCB0aGV5IGVpdGhlciBtb3ZlXG4gICAgICAgIC8vIGZvcndhcmQgb3IgY2FuJ3QgYmUgYWR2YW5jZWQuIEdhdGhlciBzdGFja3MgdGhhdCBjYW4ndCBiZVxuICAgICAgICAvLyBhZHZhbmNlZCBmdXJ0aGVyIGluIGBzdG9wcGVkYC5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFjayA9IHN0YWNrc1tpXTtcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5tYWluVG9rZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChzdGFjay5wb3MgPiBwb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3U3RhY2tzLnB1c2goc3RhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmFkdmFuY2VTdGFjayhzdGFjaywgbmV3U3RhY2tzLCBzdGFja3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9wcGVkID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9wcGVkVG9rZW5zID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RvcHBlZC5wdXNoKHN0YWNrKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvayA9IHRoaXMudG9rZW5zLmdldE1haW5Ub2tlbihzdGFjayk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3BwZWRUb2tlbnMucHVzaCh0b2sudmFsdWUsIHRvay5lbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5ld1N0YWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBmaW5pc2hlZCA9IHN0b3BwZWQgJiYgZmluZEZpbmlzaGVkKHN0b3BwZWQpO1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmluaXNoIHdpdGggXCIgKyB0aGlzLnN0YWNrSUQoZmluaXNoZWQpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFja1RvVHJlZShmaW5pc2hlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJzZXIuc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UgJiYgc3RvcHBlZClcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJTdHVjayB3aXRoIHRva2VuIFwiICsgKHRoaXMudG9rZW5zLm1haW5Ub2tlbiA/IHRoaXMucGFyc2VyLmdldE5hbWUodGhpcy50b2tlbnMubWFpblRva2VuLnZhbHVlKSA6IFwibm9uZVwiKSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiTm8gcGFyc2UgYXQgXCIgKyBwb3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnJlY292ZXJpbmcpXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvdmVyaW5nID0gNSAvKiBSZWMuRGlzdGFuY2UgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVjb3ZlcmluZyAmJiBzdG9wcGVkKSB7XG4gICAgICAgICAgICBsZXQgZmluaXNoZWQgPSB0aGlzLnN0b3BwZWRBdCAhPSBudWxsICYmIHN0b3BwZWRbMF0ucG9zID4gdGhpcy5zdG9wcGVkQXQgPyBzdG9wcGVkWzBdXG4gICAgICAgICAgICAgICAgOiB0aGlzLnJ1blJlY292ZXJ5KHN0b3BwZWQsIHN0b3BwZWRUb2tlbnMsIG5ld1N0YWNrcyk7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJGb3JjZS1maW5pc2ggXCIgKyB0aGlzLnN0YWNrSUQoZmluaXNoZWQpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFja1RvVHJlZShmaW5pc2hlZC5mb3JjZUFsbCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWNvdmVyaW5nKSB7XG4gICAgICAgICAgICBsZXQgbWF4UmVtYWluaW5nID0gdGhpcy5yZWNvdmVyaW5nID09IDEgPyAxIDogdGhpcy5yZWNvdmVyaW5nICogMyAvKiBSZWMuTWF4UmVtYWluaW5nUGVyU3RlcCAqLztcbiAgICAgICAgICAgIGlmIChuZXdTdGFja3MubGVuZ3RoID4gbWF4UmVtYWluaW5nKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhY2tzLnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV3U3RhY2tzLmxlbmd0aCA+IG1heFJlbWFpbmluZylcbiAgICAgICAgICAgICAgICAgICAgbmV3U3RhY2tzLnBvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5ld1N0YWNrcy5zb21lKHMgPT4gcy5yZWR1Y2VQb3MgPiBwb3MpKVxuICAgICAgICAgICAgICAgIHRoaXMucmVjb3ZlcmluZy0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5ld1N0YWNrcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBQcnVuZSBzdGFja3MgdGhhdCBhcmUgaW4gdGhlIHNhbWUgc3RhdGUsIG9yIHRoYXQgaGF2ZSBiZWVuXG4gICAgICAgICAgICAvLyBydW5uaW5nIHdpdGhvdXQgc3BsaXR0aW5nIGZvciBhIHdoaWxlLCB0byBhdm9pZCBnZXR0aW5nIHN0dWNrXG4gICAgICAgICAgICAvLyB3aXRoIG11bHRpcGxlIHN1Y2Nlc3NmdWwgc3RhY2tzIHJ1bm5pbmcgZW5kbGVzc2x5IG9uLlxuICAgICAgICAgICAgb3V0ZXI6IGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U3RhY2tzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBzdGFjayA9IG5ld1N0YWNrc1tpXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuZXdTdGFja3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG90aGVyID0gbmV3U3RhY2tzW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2suc2FtZVN0YXRlKG90aGVyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suYnVmZmVyLmxlbmd0aCA+IDUwMCAvKiBSZWMuTWluQnVmZmVyTGVuZ3RoUHJ1bmUgKi8gJiYgb3RoZXIuYnVmZmVyLmxlbmd0aCA+IDUwMCAvKiBSZWMuTWluQnVmZmVyTGVuZ3RoUHJ1bmUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKHN0YWNrLnNjb3JlIC0gb3RoZXIuc2NvcmUpIHx8IChzdGFjay5idWZmZXIubGVuZ3RoIC0gb3RoZXIuYnVmZmVyLmxlbmd0aCkpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YWNrcy5zcGxpY2Uoai0tLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YWNrcy5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXdTdGFja3MubGVuZ3RoID4gMTIgLyogUmVjLk1heFN0YWNrQ291bnQgKi8pXG4gICAgICAgICAgICAgICAgbmV3U3RhY2tzLnNwbGljZSgxMiAvKiBSZWMuTWF4U3RhY2tDb3VudCAqLywgbmV3U3RhY2tzLmxlbmd0aCAtIDEyIC8qIFJlYy5NYXhTdGFja0NvdW50ICovKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1pblN0YWNrUG9zID0gbmV3U3RhY2tzWzBdLnBvcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuZXdTdGFja3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAobmV3U3RhY2tzW2ldLnBvcyA8IHRoaXMubWluU3RhY2tQb3MpXG4gICAgICAgICAgICAgICAgdGhpcy5taW5TdGFja1BvcyA9IG5ld1N0YWNrc1tpXS5wb3M7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzdG9wQXQocG9zKSB7XG4gICAgICAgIGlmICh0aGlzLnN0b3BwZWRBdCAhPSBudWxsICYmIHRoaXMuc3RvcHBlZEF0IDwgcG9zKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4ndCBtb3ZlIHN0b3BwZWRBdCBmb3J3YXJkXCIpO1xuICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IHBvcztcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhbiB1cGRhdGVkIHZlcnNpb24gb2YgdGhlIGdpdmVuIHN0YWNrLCBvciBudWxsIGlmIHRoZVxuICAgIC8vIHN0YWNrIGNhbid0IGFkdmFuY2Ugbm9ybWFsbHkuIFdoZW4gYHNwbGl0YCBhbmQgYHN0YWNrc2AgYXJlXG4gICAgLy8gZ2l2ZW4sIHN0YWNrcyBzcGxpdCBvZmYgYnkgYW1iaWd1b3VzIG9wZXJhdGlvbnMgd2lsbCBiZSBwdXNoZWQgdG9cbiAgICAvLyBgc3BsaXRgLCBvciBhZGRlZCB0byBgc3RhY2tzYCBpZiB0aGV5IG1vdmUgYHBvc2AgZm9yd2FyZC5cbiAgICBhZHZhbmNlU3RhY2soc3RhY2ssIHN0YWNrcywgc3BsaXQpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gc3RhY2sucG9zLCB7IHBhcnNlciB9ID0gdGhpcztcbiAgICAgICAgbGV0IGJhc2UgPSB2ZXJib3NlID8gdGhpcy5zdGFja0lEKHN0YWNrKSArIFwiIC0+IFwiIDogXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwgJiYgc3RhcnQgPiB0aGlzLnN0b3BwZWRBdClcbiAgICAgICAgICAgIHJldHVybiBzdGFjay5mb3JjZVJlZHVjZSgpID8gc3RhY2sgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5mcmFnbWVudHMpIHtcbiAgICAgICAgICAgIGxldCBzdHJpY3RDeCA9IHN0YWNrLmN1ckNvbnRleHQgJiYgc3RhY2suY3VyQ29udGV4dC50cmFja2VyLnN0cmljdCwgY3hIYXNoID0gc3RyaWN0Q3ggPyBzdGFjay5jdXJDb250ZXh0Lmhhc2ggOiAwO1xuICAgICAgICAgICAgZm9yIChsZXQgY2FjaGVkID0gdGhpcy5mcmFnbWVudHMubm9kZUF0KHN0YXJ0KTsgY2FjaGVkOykge1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMucGFyc2VyLm5vZGVTZXQudHlwZXNbY2FjaGVkLnR5cGUuaWRdID09IGNhY2hlZC50eXBlID8gcGFyc2VyLmdldEdvdG8oc3RhY2suc3RhdGUsIGNhY2hlZC50eXBlLmlkKSA6IC0xO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaCA+IC0xICYmIGNhY2hlZC5sZW5ndGggJiYgKCFzdHJpY3RDeCB8fCAoY2FjaGVkLnByb3AoTm9kZVByb3AuY29udGV4dEhhc2gpIHx8IDApID09IGN4SGFzaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2sudXNlTm9kZShjYWNoZWQsIG1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhiYXNlICsgdGhpcy5zdGFja0lEKHN0YWNrKSArIGAgKHZpYSByZXVzZSBvZiAke3BhcnNlci5nZXROYW1lKGNhY2hlZC50eXBlLmlkKX0pYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIShjYWNoZWQgaW5zdGFuY2VvZiBUcmVlKSB8fCBjYWNoZWQuY2hpbGRyZW4ubGVuZ3RoID09IDAgfHwgY2FjaGVkLnBvc2l0aW9uc1swXSA+IDApXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGxldCBpbm5lciA9IGNhY2hlZC5jaGlsZHJlblswXTtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIgaW5zdGFuY2VvZiBUcmVlICYmIGNhY2hlZC5wb3NpdGlvbnNbMF0gPT0gMClcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVkID0gaW5uZXI7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZGVmYXVsdFJlZHVjZSA9IHBhcnNlci5zdGF0ZVNsb3Qoc3RhY2suc3RhdGUsIDQgLyogUGFyc2VTdGF0ZS5EZWZhdWx0UmVkdWNlICovKTtcbiAgICAgICAgaWYgKGRlZmF1bHRSZWR1Y2UgPiAwKSB7XG4gICAgICAgICAgICBzdGFjay5yZWR1Y2UoZGVmYXVsdFJlZHVjZSk7XG4gICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhiYXNlICsgdGhpcy5zdGFja0lEKHN0YWNrKSArIGAgKHZpYSBhbHdheXMtcmVkdWNlICR7cGFyc2VyLmdldE5hbWUoZGVmYXVsdFJlZHVjZSAmIDY1NTM1IC8qIEFjdGlvbi5WYWx1ZU1hc2sgKi8pfSlgKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFjay5zdGFjay5sZW5ndGggPj0gODQwMCAvKiBSZWMuQ3V0RGVwdGggKi8pIHtcbiAgICAgICAgICAgIHdoaWxlIChzdGFjay5zdGFjay5sZW5ndGggPiA2MDAwIC8qIFJlYy5DdXRUbyAqLyAmJiBzdGFjay5mb3JjZVJlZHVjZSgpKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgYWN0aW9ucyA9IHRoaXMudG9rZW5zLmdldEFjdGlvbnMoc3RhY2spO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGFjdGlvbiA9IGFjdGlvbnNbaSsrXSwgdGVybSA9IGFjdGlvbnNbaSsrXSwgZW5kID0gYWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBpID09IGFjdGlvbnMubGVuZ3RoIHx8ICFzcGxpdDtcbiAgICAgICAgICAgIGxldCBsb2NhbFN0YWNrID0gbGFzdCA/IHN0YWNrIDogc3RhY2suc3BsaXQoKTtcbiAgICAgICAgICAgIGxldCBtYWluID0gdGhpcy50b2tlbnMubWFpblRva2VuO1xuICAgICAgICAgICAgbG9jYWxTdGFjay5hcHBseShhY3Rpb24sIHRlcm0sIG1haW4gPyBtYWluLnN0YXJ0IDogbG9jYWxTdGFjay5wb3MsIGVuZCk7XG4gICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhiYXNlICsgdGhpcy5zdGFja0lEKGxvY2FsU3RhY2spICsgYCAodmlhICR7KGFjdGlvbiAmIDY1NTM2IC8qIEFjdGlvbi5SZWR1Y2VGbGFnICovKSA9PSAwID8gXCJzaGlmdFwiXG4gICAgICAgICAgICAgICAgICAgIDogYHJlZHVjZSBvZiAke3BhcnNlci5nZXROYW1lKGFjdGlvbiAmIDY1NTM1IC8qIEFjdGlvbi5WYWx1ZU1hc2sgKi8pfWB9IGZvciAke3BhcnNlci5nZXROYW1lKHRlcm0pfSBAICR7c3RhcnR9JHtsb2NhbFN0YWNrID09IHN0YWNrID8gXCJcIiA6IFwiLCBzcGxpdFwifSlgKTtcbiAgICAgICAgICAgIGlmIChsYXN0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZSBpZiAobG9jYWxTdGFjay5wb3MgPiBzdGFydClcbiAgICAgICAgICAgICAgICBzdGFja3MucHVzaChsb2NhbFN0YWNrKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzcGxpdC5wdXNoKGxvY2FsU3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gQWR2YW5jZSBhIGdpdmVuIHN0YWNrIGZvcndhcmQgYXMgZmFyIGFzIGl0IHdpbGwgZ28uIFJldHVybnMgdGhlXG4gICAgLy8gKHBvc3NpYmx5IHVwZGF0ZWQpIHN0YWNrIGlmIGl0IGdvdCBzdHVjaywgb3IgbnVsbCBpZiBpdCBtb3ZlZFxuICAgIC8vIGZvcndhcmQgYW5kIHdhcyBnaXZlbiB0byBgcHVzaFN0YWNrRGVkdXBgLlxuICAgIGFkdmFuY2VGdWxseShzdGFjaywgbmV3U3RhY2tzKSB7XG4gICAgICAgIGxldCBwb3MgPSBzdGFjay5wb3M7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hZHZhbmNlU3RhY2soc3RhY2ssIG51bGwsIG51bGwpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzdGFjay5wb3MgPiBwb3MpIHtcbiAgICAgICAgICAgICAgICBwdXNoU3RhY2tEZWR1cChzdGFjaywgbmV3U3RhY2tzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBydW5SZWNvdmVyeShzdGFja3MsIHRva2VucywgbmV3U3RhY2tzKSB7XG4gICAgICAgIGxldCBmaW5pc2hlZCA9IG51bGwsIHJlc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0YWNrID0gc3RhY2tzW2ldLCB0b2tlbiA9IHRva2Vuc1tpIDw8IDFdLCB0b2tlbkVuZCA9IHRva2Vuc1soaSA8PCAxKSArIDFdO1xuICAgICAgICAgICAgbGV0IGJhc2UgPSB2ZXJib3NlID8gdGhpcy5zdGFja0lEKHN0YWNrKSArIFwiIC0+IFwiIDogXCJcIjtcbiAgICAgICAgICAgIGlmIChzdGFjay5kZWFkRW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3RhcnRlZClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgcmVzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdGFjay5yZXN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGJhc2UgKyB0aGlzLnN0YWNrSUQoc3RhY2spICsgXCIgKHJlc3RhcnRlZClcIik7XG4gICAgICAgICAgICAgICAgbGV0IGRvbmUgPSB0aGlzLmFkdmFuY2VGdWxseShzdGFjaywgbmV3U3RhY2tzKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9uZSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZm9yY2UgPSBzdGFjay5zcGxpdCgpLCBmb3JjZUJhc2UgPSBiYXNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGZvcmNlLmZvcmNlUmVkdWNlKCkgJiYgaiA8IDEwIC8qIFJlYy5Gb3JjZVJlZHVjZUxpbWl0ICovOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZm9yY2VCYXNlICsgdGhpcy5zdGFja0lEKGZvcmNlKSArIFwiICh2aWEgZm9yY2UtcmVkdWNlKVwiKTtcbiAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IHRoaXMuYWR2YW5jZUZ1bGx5KGZvcmNlLCBuZXdTdGFja3MpO1xuICAgICAgICAgICAgICAgIGlmIChkb25lKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgZm9yY2VCYXNlID0gdGhpcy5zdGFja0lEKGZvcmNlKSArIFwiIC0+IFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaW5zZXJ0IG9mIHN0YWNrLnJlY292ZXJCeUluc2VydCh0b2tlbikpIHtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYmFzZSArIHRoaXMuc3RhY2tJRChpbnNlcnQpICsgXCIgKHZpYSByZWNvdmVyLWluc2VydClcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlRnVsbHkoaW5zZXJ0LCBuZXdTdGFja3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc3RyZWFtLmVuZCA+IHN0YWNrLnBvcykge1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbkVuZCA9PSBzdGFjay5wb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5FbmQrKztcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSAwIC8qIFRlcm0uRXJyICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGFjay5yZWNvdmVyQnlEZWxldGUodG9rZW4sIHRva2VuRW5kKTtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYmFzZSArIHRoaXMuc3RhY2tJRChzdGFjaykgKyBgICh2aWEgcmVjb3Zlci1kZWxldGUgJHt0aGlzLnBhcnNlci5nZXROYW1lKHRva2VuKX0pYCk7XG4gICAgICAgICAgICAgICAgcHVzaFN0YWNrRGVkdXAoc3RhY2ssIG5ld1N0YWNrcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghZmluaXNoZWQgfHwgZmluaXNoZWQuc2NvcmUgPCBzdGFjay5zY29yZSkge1xuICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gc3RhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuICAgIH1cbiAgICAvLyBDb252ZXJ0IHRoZSBzdGFjaydzIGJ1ZmZlciB0byBhIHN5bnRheCB0cmVlLlxuICAgIHN0YWNrVG9UcmVlKHN0YWNrKSB7XG4gICAgICAgIHN0YWNrLmNsb3NlKCk7XG4gICAgICAgIHJldHVybiBUcmVlLmJ1aWxkKHsgYnVmZmVyOiBTdGFja0J1ZmZlckN1cnNvci5jcmVhdGUoc3RhY2spLFxuICAgICAgICAgICAgbm9kZVNldDogdGhpcy5wYXJzZXIubm9kZVNldCxcbiAgICAgICAgICAgIHRvcElEOiB0aGlzLnRvcFRlcm0sXG4gICAgICAgICAgICBtYXhCdWZmZXJMZW5ndGg6IHRoaXMucGFyc2VyLmJ1ZmZlckxlbmd0aCxcbiAgICAgICAgICAgIHJldXNlZDogdGhpcy5yZXVzZWQsXG4gICAgICAgICAgICBzdGFydDogdGhpcy5yYW5nZXNbMF0uZnJvbSxcbiAgICAgICAgICAgIGxlbmd0aDogc3RhY2sucG9zIC0gdGhpcy5yYW5nZXNbMF0uZnJvbSxcbiAgICAgICAgICAgIG1pblJlcGVhdFR5cGU6IHRoaXMucGFyc2VyLm1pblJlcGVhdFRlcm0gfSk7XG4gICAgfVxuICAgIHN0YWNrSUQoc3RhY2spIHtcbiAgICAgICAgbGV0IGlkID0gKHN0YWNrSURzIHx8IChzdGFja0lEcyA9IG5ldyBXZWFrTWFwKSkuZ2V0KHN0YWNrKTtcbiAgICAgICAgaWYgKCFpZClcbiAgICAgICAgICAgIHN0YWNrSURzLnNldChzdGFjaywgaWQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludCh0aGlzLm5leHRTdGFja0lEKyspKTtcbiAgICAgICAgcmV0dXJuIGlkICsgc3RhY2s7XG4gICAgfVxufVxuZnVuY3Rpb24gcHVzaFN0YWNrRGVkdXAoc3RhY2ssIG5ld1N0YWNrcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3U3RhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBvdGhlciA9IG5ld1N0YWNrc1tpXTtcbiAgICAgICAgaWYgKG90aGVyLnBvcyA9PSBzdGFjay5wb3MgJiYgb3RoZXIuc2FtZVN0YXRlKHN0YWNrKSkge1xuICAgICAgICAgICAgaWYgKG5ld1N0YWNrc1tpXS5zY29yZSA8IHN0YWNrLnNjb3JlKVxuICAgICAgICAgICAgICAgIG5ld1N0YWNrc1tpXSA9IHN0YWNrO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5ld1N0YWNrcy5wdXNoKHN0YWNrKTtcbn1cbmNsYXNzIERpYWxlY3Qge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgZmxhZ3MsIGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB9XG4gICAgYWxsb3dzKHRlcm0pIHsgcmV0dXJuICF0aGlzLmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZWRbdGVybV0gPT0gMDsgfVxufVxuY29uc3QgaWQgPSB4ID0+IHg7XG4vKipcbkNvbnRleHQgdHJhY2tlcnMgYXJlIHVzZWQgdG8gdHJhY2sgc3RhdGVmdWwgY29udGV4dCAoc3VjaCBhc1xuaW5kZW50YXRpb24gaW4gdGhlIFB5dGhvbiBncmFtbWFyLCBvciBwYXJlbnQgZWxlbWVudHMgaW4gdGhlIFhNTFxuZ3JhbW1hcikgbmVlZGVkIGJ5IGV4dGVybmFsIHRva2VuaXplcnMuIFlvdSBkZWNsYXJlIHRoZW0gaW4gYVxuZ3JhbW1hciBmaWxlIGFzIGBAY29udGV4dCBleHBvcnROYW1lIGZyb20gXCJtb2R1bGVcImAuXG5cbkNvbnRleHQgdmFsdWVzIHNob3VsZCBiZSBpbW11dGFibGUsIGFuZCBjYW4gYmUgdXBkYXRlZCAocmVwbGFjZWQpXG5vbiBzaGlmdCBvciByZWR1Y2UgYWN0aW9ucy5cblxuVGhlIGV4cG9ydCB1c2VkIGluIGEgYEBjb250ZXh0YCBkZWNsYXJhdGlvbiBzaG91bGQgYmUgb2YgdGhpc1xudHlwZS5cbiovXG5jbGFzcyBDb250ZXh0VHJhY2tlciB7XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgY29udGV4dCB0cmFja2VyLlxuICAgICovXG4gICAgY29uc3RydWN0b3Ioc3BlYykge1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3BlYy5zdGFydDtcbiAgICAgICAgdGhpcy5zaGlmdCA9IHNwZWMuc2hpZnQgfHwgaWQ7XG4gICAgICAgIHRoaXMucmVkdWNlID0gc3BlYy5yZWR1Y2UgfHwgaWQ7XG4gICAgICAgIHRoaXMucmV1c2UgPSBzcGVjLnJldXNlIHx8IGlkO1xuICAgICAgICB0aGlzLmhhc2ggPSBzcGVjLmhhc2ggfHwgKCgpID0+IDApO1xuICAgICAgICB0aGlzLnN0cmljdCA9IHNwZWMuc3RyaWN0ICE9PSBmYWxzZTtcbiAgICB9XG59XG4vKipcbkhvbGRzIHRoZSBwYXJzZSB0YWJsZXMgZm9yIGEgZ2l2ZW4gZ3JhbW1hciwgYXMgZ2VuZXJhdGVkIGJ5XG5gbGV6ZXItZ2VuZXJhdG9yYCwgYW5kIHByb3ZpZGVzIFttZXRob2RzXSgjY29tbW9uLlBhcnNlcikgdG8gcGFyc2VcbmNvbnRlbnQgd2l0aC5cbiovXG5jbGFzcyBMUlBhcnNlciBleHRlbmRzIFBhcnNlciB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy53cmFwcGVycyA9IFtdO1xuICAgICAgICBpZiAoc3BlYy52ZXJzaW9uICE9IDE0IC8qIEZpbGUuVmVyc2lvbiAqLylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBQYXJzZXIgdmVyc2lvbiAoJHtzcGVjLnZlcnNpb259KSBkb2Vzbid0IG1hdGNoIHJ1bnRpbWUgdmVyc2lvbiAoJHsxNCAvKiBGaWxlLlZlcnNpb24gKi99KWApO1xuICAgICAgICBsZXQgbm9kZU5hbWVzID0gc3BlYy5ub2RlTmFtZXMuc3BsaXQoXCIgXCIpO1xuICAgICAgICB0aGlzLm1pblJlcGVhdFRlcm0gPSBub2RlTmFtZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwZWMucmVwZWF0Tm9kZUNvdW50OyBpKyspXG4gICAgICAgICAgICBub2RlTmFtZXMucHVzaChcIlwiKTtcbiAgICAgICAgbGV0IHRvcFRlcm1zID0gT2JqZWN0LmtleXMoc3BlYy50b3BSdWxlcykubWFwKHIgPT4gc3BlYy50b3BSdWxlc1tyXVsxXSk7XG4gICAgICAgIGxldCBub2RlUHJvcHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlTmFtZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBub2RlUHJvcHMucHVzaChbXSk7XG4gICAgICAgIGZ1bmN0aW9uIHNldFByb3Aobm9kZUlELCBwcm9wLCB2YWx1ZSkge1xuICAgICAgICAgICAgbm9kZVByb3BzW25vZGVJRF0ucHVzaChbcHJvcCwgcHJvcC5kZXNlcmlhbGl6ZShTdHJpbmcodmFsdWUpKV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjLm5vZGVQcm9wcylcbiAgICAgICAgICAgIGZvciAobGV0IHByb3BTcGVjIG9mIHNwZWMubm9kZVByb3BzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb3AgPSBwcm9wU3BlY1swXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3AgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICAgICAgcHJvcCA9IE5vZGVQcm9wW3Byb3BdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcHJvcFNwZWMubGVuZ3RoOykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHByb3BTcGVjW2krK107XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb3AobmV4dCwgcHJvcCwgcHJvcFNwZWNbaSsrXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBwcm9wU3BlY1tpICsgLW5leHRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IC1uZXh0OyBqID4gMDsgai0tKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb3AocHJvcFNwZWNbaSsrXSwgcHJvcCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGVTZXQgPSBuZXcgTm9kZVNldChub2RlTmFtZXMubWFwKChuYW1lLCBpKSA9PiBOb2RlVHlwZS5kZWZpbmUoe1xuICAgICAgICAgICAgbmFtZTogaSA+PSB0aGlzLm1pblJlcGVhdFRlcm0gPyB1bmRlZmluZWQgOiBuYW1lLFxuICAgICAgICAgICAgaWQ6IGksXG4gICAgICAgICAgICBwcm9wczogbm9kZVByb3BzW2ldLFxuICAgICAgICAgICAgdG9wOiB0b3BUZXJtcy5pbmRleE9mKGkpID4gLTEsXG4gICAgICAgICAgICBlcnJvcjogaSA9PSAwLFxuICAgICAgICAgICAgc2tpcHBlZDogc3BlYy5za2lwcGVkTm9kZXMgJiYgc3BlYy5za2lwcGVkTm9kZXMuaW5kZXhPZihpKSA+IC0xXG4gICAgICAgIH0pKSk7XG4gICAgICAgIGlmIChzcGVjLnByb3BTb3VyY2VzKVxuICAgICAgICAgICAgdGhpcy5ub2RlU2V0ID0gdGhpcy5ub2RlU2V0LmV4dGVuZCguLi5zcGVjLnByb3BTb3VyY2VzKTtcbiAgICAgICAgdGhpcy5zdHJpY3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBEZWZhdWx0QnVmZmVyTGVuZ3RoO1xuICAgICAgICBsZXQgdG9rZW5BcnJheSA9IGRlY29kZUFycmF5KHNwZWMudG9rZW5EYXRhKTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gc3BlYy5jb250ZXh0O1xuICAgICAgICB0aGlzLnNwZWNpYWxpemVyU3BlY3MgPSBzcGVjLnNwZWNpYWxpemVkIHx8IFtdO1xuICAgICAgICB0aGlzLnNwZWNpYWxpemVkID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuc3BlY2lhbGl6ZXJTcGVjcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3BlY2lhbGl6ZXJTcGVjcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMuc3BlY2lhbGl6ZWRbaV0gPSB0aGlzLnNwZWNpYWxpemVyU3BlY3NbaV0udGVybTtcbiAgICAgICAgdGhpcy5zcGVjaWFsaXplcnMgPSB0aGlzLnNwZWNpYWxpemVyU3BlY3MubWFwKGdldFNwZWNpYWxpemVyKTtcbiAgICAgICAgdGhpcy5zdGF0ZXMgPSBkZWNvZGVBcnJheShzcGVjLnN0YXRlcywgVWludDMyQXJyYXkpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkZWNvZGVBcnJheShzcGVjLnN0YXRlRGF0YSk7XG4gICAgICAgIHRoaXMuZ290byA9IGRlY29kZUFycmF5KHNwZWMuZ290byk7XG4gICAgICAgIHRoaXMubWF4VGVybSA9IHNwZWMubWF4VGVybTtcbiAgICAgICAgdGhpcy50b2tlbml6ZXJzID0gc3BlYy50b2tlbml6ZXJzLm1hcCh2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIiA/IG5ldyBUb2tlbkdyb3VwKHRva2VuQXJyYXksIHZhbHVlKSA6IHZhbHVlKTtcbiAgICAgICAgdGhpcy50b3BSdWxlcyA9IHNwZWMudG9wUnVsZXM7XG4gICAgICAgIHRoaXMuZGlhbGVjdHMgPSBzcGVjLmRpYWxlY3RzIHx8IHt9O1xuICAgICAgICB0aGlzLmR5bmFtaWNQcmVjZWRlbmNlcyA9IHNwZWMuZHluYW1pY1ByZWNlZGVuY2VzIHx8IG51bGw7XG4gICAgICAgIHRoaXMudG9rZW5QcmVjVGFibGUgPSBzcGVjLnRva2VuUHJlYztcbiAgICAgICAgdGhpcy50ZXJtTmFtZXMgPSBzcGVjLnRlcm1OYW1lcyB8fCBudWxsO1xuICAgICAgICB0aGlzLm1heE5vZGUgPSB0aGlzLm5vZGVTZXQudHlwZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5kaWFsZWN0ID0gdGhpcy5wYXJzZURpYWxlY3QoKTtcbiAgICAgICAgdGhpcy50b3AgPSB0aGlzLnRvcFJ1bGVzW09iamVjdC5rZXlzKHRoaXMudG9wUnVsZXMpWzBdXTtcbiAgICB9XG4gICAgY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgIGxldCBwYXJzZSA9IG5ldyBQYXJzZSh0aGlzLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpO1xuICAgICAgICBmb3IgKGxldCB3IG9mIHRoaXMud3JhcHBlcnMpXG4gICAgICAgICAgICBwYXJzZSA9IHcocGFyc2UsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcyk7XG4gICAgICAgIHJldHVybiBwYXJzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgZ290byB0YWJsZSBlbnRyeSBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldEdvdG8oc3RhdGUsIHRlcm0sIGxvb3NlID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHRhYmxlID0gdGhpcy5nb3RvO1xuICAgICAgICBpZiAodGVybSA+PSB0YWJsZVswXSlcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gdGFibGVbdGVybSArIDFdOzspIHtcbiAgICAgICAgICAgIGxldCBncm91cFRhZyA9IHRhYmxlW3BvcysrXSwgbGFzdCA9IGdyb3VwVGFnICYgMTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0YWJsZVtwb3MrK107XG4gICAgICAgICAgICBpZiAobGFzdCAmJiBsb29zZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgZm9yIChsZXQgZW5kID0gcG9zICsgKGdyb3VwVGFnID4+IDEpOyBwb3MgPCBlbmQ7IHBvcysrKVxuICAgICAgICAgICAgICAgIGlmICh0YWJsZVtwb3NdID09IHN0YXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgaWYgKGxhc3QpXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIGlmIHRoaXMgc3RhdGUgaGFzIGFuIGFjdGlvbiBmb3IgYSBnaXZlbiB0ZXJtaW5hbCBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGhhc0FjdGlvbihzdGF0ZSwgdGVybWluYWwpIHtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIGZvciAobGV0IHNldCA9IDA7IHNldCA8IDI7IHNldCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdGF0ZVNsb3Qoc3RhdGUsIHNldCA/IDIgLyogUGFyc2VTdGF0ZS5Ta2lwICovIDogMSAvKiBQYXJzZVN0YXRlLkFjdGlvbnMgKi8pLCBuZXh0OzsgaSArPSAzKSB7XG4gICAgICAgICAgICAgICAgaWYgKChuZXh0ID0gZGF0YVtpXSkgPT0gNjU1MzUgLyogU2VxLkVuZCAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVtpICsgMV0gPT0gMSAvKiBTZXEuTmV4dCAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBkYXRhW2kgPSBwYWlyKGRhdGEsIGkgKyAyKV07XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGFbaSArIDFdID09IDIgLyogU2VxLk90aGVyICovKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXIoZGF0YSwgaSArIDIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gdGVybWluYWwgfHwgbmV4dCA9PSAwIC8qIFRlcm0uRXJyICovKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFpcihkYXRhLCBpICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGVTbG90KHN0YXRlLCBzbG90KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlc1soc3RhdGUgKiA2IC8qIFBhcnNlU3RhdGUuU2l6ZSAqLykgKyBzbG90XTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0ZUZsYWcoc3RhdGUsIGZsYWcpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnN0YXRlU2xvdChzdGF0ZSwgMCAvKiBQYXJzZVN0YXRlLkZsYWdzICovKSAmIGZsYWcpID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB2YWxpZEFjdGlvbihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuYWxsQWN0aW9ucyhzdGF0ZSwgYSA9PiBhID09IGFjdGlvbiA/IHRydWUgOiBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhbGxBY3Rpb25zKHN0YXRlLCBhY3Rpb24pIHtcbiAgICAgICAgbGV0IGRlZmx0ID0gdGhpcy5zdGF0ZVNsb3Qoc3RhdGUsIDQgLyogUGFyc2VTdGF0ZS5EZWZhdWx0UmVkdWNlICovKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGRlZmx0ID8gYWN0aW9uKGRlZmx0KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc3RhdGVTbG90KHN0YXRlLCAxIC8qIFBhcnNlU3RhdGUuQWN0aW9ucyAqLyk7IHJlc3VsdCA9PSBudWxsOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPT0gNjU1MzUgLyogU2VxLkVuZCAqLykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbaSArIDFdID09IDEgLyogU2VxLk5leHQgKi8pXG4gICAgICAgICAgICAgICAgICAgIGkgPSBwYWlyKHRoaXMuZGF0YSwgaSArIDIpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgPSBhY3Rpb24ocGFpcih0aGlzLmRhdGEsIGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBzdGF0ZXMgdGhhdCBjYW4gZm9sbG93IHRoaXMgb25lIHRocm91Z2ggc2hpZnQgYWN0aW9ucyBvclxuICAgIGdvdG8ganVtcHMuIEBpbnRlcm5hbFxuICAgICovXG4gICAgbmV4dFN0YXRlcyhzdGF0ZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnN0YXRlU2xvdChzdGF0ZSwgMSAvKiBQYXJzZVN0YXRlLkFjdGlvbnMgKi8pOzsgaSArPSAzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhW2ldID09IDY1NTM1IC8qIFNlcS5FbmQgKi8pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhW2kgKyAxXSA9PSAxIC8qIFNlcS5OZXh0ICovKVxuICAgICAgICAgICAgICAgICAgICBpID0gcGFpcih0aGlzLmRhdGEsIGkgKyAyKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0aGlzLmRhdGFbaSArIDJdICYgKDY1NTM2IC8qIEFjdGlvbi5SZWR1Y2VGbGFnICovID4+IDE2KSkgPT0gMCkge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuZGF0YVtpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuc29tZSgodiwgaSkgPT4gKGkgJiAxKSAmJiB2ID09IHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5kYXRhW2ldLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29uZmlndXJlIHRoZSBwYXJzZXIuIFJldHVybnMgYSBuZXcgcGFyc2VyIGluc3RhbmNlIHRoYXQgaGFzIHRoZVxuICAgIGdpdmVuIHNldHRpbmdzIG1vZGlmaWVkLiBTZXR0aW5ncyBub3QgcHJvdmlkZWQgaW4gYGNvbmZpZ2AgYXJlXG4gICAga2VwdCBmcm9tIHRoZSBvcmlnaW5hbCBwYXJzZXIuXG4gICAgKi9cbiAgICBjb25maWd1cmUoY29uZmlnKSB7XG4gICAgICAgIC8vIEhpZGVvdXMgcmVmbGVjdGlvbi1iYXNlZCBrbHVkZ2UgdG8gbWFrZSBpdCBlYXN5IHRvIGNyZWF0ZSBhXG4gICAgICAgIC8vIHNsaWdodGx5IG1vZGlmaWVkIGNvcHkgb2YgYSBwYXJzZXIuXG4gICAgICAgIGxldCBjb3B5ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKExSUGFyc2VyLnByb3RvdHlwZSksIHRoaXMpO1xuICAgICAgICBpZiAoY29uZmlnLnByb3BzKVxuICAgICAgICAgICAgY29weS5ub2RlU2V0ID0gdGhpcy5ub2RlU2V0LmV4dGVuZCguLi5jb25maWcucHJvcHMpO1xuICAgICAgICBpZiAoY29uZmlnLnRvcCkge1xuICAgICAgICAgICAgbGV0IGluZm8gPSB0aGlzLnRvcFJ1bGVzW2NvbmZpZy50b3BdO1xuICAgICAgICAgICAgaWYgKCFpbmZvKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIHRvcCBydWxlIG5hbWUgJHtjb25maWcudG9wfWApO1xuICAgICAgICAgICAgY29weS50b3AgPSBpbmZvO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcudG9rZW5pemVycylcbiAgICAgICAgICAgIGNvcHkudG9rZW5pemVycyA9IHRoaXMudG9rZW5pemVycy5tYXAodCA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gY29uZmlnLnRva2VuaXplcnMuZmluZChyID0+IHIuZnJvbSA9PSB0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQgPyBmb3VuZC50byA6IHQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbmZpZy5zcGVjaWFsaXplcnMpIHtcbiAgICAgICAgICAgIGNvcHkuc3BlY2lhbGl6ZXJzID0gdGhpcy5zcGVjaWFsaXplcnMuc2xpY2UoKTtcbiAgICAgICAgICAgIGNvcHkuc3BlY2lhbGl6ZXJTcGVjcyA9IHRoaXMuc3BlY2lhbGl6ZXJTcGVjcy5tYXAoKHMsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBjb25maWcuc3BlY2lhbGl6ZXJzLmZpbmQociA9PiByLmZyb20gPT0gcy5leHRlcm5hbCk7XG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICAgICAgbGV0IHNwZWMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHMpLCB7IGV4dGVybmFsOiBmb3VuZC50byB9KTtcbiAgICAgICAgICAgICAgICBjb3B5LnNwZWNpYWxpemVyc1tpXSA9IGdldFNwZWNpYWxpemVyKHNwZWMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzcGVjO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5jb250ZXh0VHJhY2tlcilcbiAgICAgICAgICAgIGNvcHkuY29udGV4dCA9IGNvbmZpZy5jb250ZXh0VHJhY2tlcjtcbiAgICAgICAgaWYgKGNvbmZpZy5kaWFsZWN0KVxuICAgICAgICAgICAgY29weS5kaWFsZWN0ID0gdGhpcy5wYXJzZURpYWxlY3QoY29uZmlnLmRpYWxlY3QpO1xuICAgICAgICBpZiAoY29uZmlnLnN0cmljdCAhPSBudWxsKVxuICAgICAgICAgICAgY29weS5zdHJpY3QgPSBjb25maWcuc3RyaWN0O1xuICAgICAgICBpZiAoY29uZmlnLndyYXApXG4gICAgICAgICAgICBjb3B5LndyYXBwZXJzID0gY29weS53cmFwcGVycy5jb25jYXQoY29uZmlnLndyYXApO1xuICAgICAgICBpZiAoY29uZmlnLmJ1ZmZlckxlbmd0aCAhPSBudWxsKVxuICAgICAgICAgICAgY29weS5idWZmZXJMZW5ndGggPSBjb25maWcuYnVmZmVyTGVuZ3RoO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgYW55IFtwYXJzZSB3cmFwcGVyc10oI2xyLlBhcnNlckNvbmZpZy53cmFwKVxuICAgIGFyZSByZWdpc3RlcmVkIGZvciB0aGlzIHBhcnNlci5cbiAgICAqL1xuICAgIGhhc1dyYXBwZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVycy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHRlcm0uIFRoaXMgd2lsbCBvbmx5XG4gICAgd29yayBmb3IgYWxsIHRlcm1zIHdoZW4gdGhlIHBhcnNlciB3YXMgZ2VuZXJhdGVkIHdpdGggdGhlXG4gICAgYC0tbmFtZXNgIG9wdGlvbi4gQnkgZGVmYXVsdCwgb25seSB0aGUgbmFtZXMgb2YgdGFnZ2VkIHRlcm1zIGFyZVxuICAgIHN0b3JlZC5cbiAgICAqL1xuICAgIGdldE5hbWUodGVybSkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXJtTmFtZXMgPyB0aGlzLnRlcm1OYW1lc1t0ZXJtXSA6IFN0cmluZyh0ZXJtIDw9IHRoaXMubWF4Tm9kZSAmJiB0aGlzLm5vZGVTZXQudHlwZXNbdGVybV0ubmFtZSB8fCB0ZXJtKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGVvZiB0ZXJtIGlkIGlzIGFsd2F5cyBhbGxvY2F0ZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIG5vZGVcbiAgICB0eXBlcy4gQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgZW9mVGVybSgpIHsgcmV0dXJuIHRoaXMubWF4Tm9kZSArIDE7IH1cbiAgICAvKipcbiAgICBUaGUgdHlwZSBvZiB0b3Agbm9kZSBwcm9kdWNlZCBieSB0aGUgcGFyc2VyLlxuICAgICovXG4gICAgZ2V0IHRvcE5vZGUoKSB7IHJldHVybiB0aGlzLm5vZGVTZXQudHlwZXNbdGhpcy50b3BbMV1dOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkeW5hbWljUHJlY2VkZW5jZSh0ZXJtKSB7XG4gICAgICAgIGxldCBwcmVjID0gdGhpcy5keW5hbWljUHJlY2VkZW5jZXM7XG4gICAgICAgIHJldHVybiBwcmVjID09IG51bGwgPyAwIDogcHJlY1t0ZXJtXSB8fCAwO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHBhcnNlRGlhbGVjdChkaWFsZWN0KSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBPYmplY3Qua2V5cyh0aGlzLmRpYWxlY3RzKSwgZmxhZ3MgPSB2YWx1ZXMubWFwKCgpID0+IGZhbHNlKTtcbiAgICAgICAgaWYgKGRpYWxlY3QpXG4gICAgICAgICAgICBmb3IgKGxldCBwYXJ0IG9mIGRpYWxlY3Quc3BsaXQoXCIgXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlkID0gdmFsdWVzLmluZGV4T2YocGFydCk7XG4gICAgICAgICAgICAgICAgaWYgKGlkID49IDApXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzW2lkXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIGxldCBkaXNhYmxlZCA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCFmbGFnc1tpXSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSB0aGlzLmRpYWxlY3RzW3ZhbHVlc1tpXV0sIGlkOyAoaWQgPSB0aGlzLmRhdGFbaisrXSkgIT0gNjU1MzUgLyogU2VxLkVuZCAqLzspXG4gICAgICAgICAgICAgICAgICAgIChkaXNhYmxlZCB8fCAoZGlzYWJsZWQgPSBuZXcgVWludDhBcnJheSh0aGlzLm1heFRlcm0gKyAxKSkpW2lkXSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRGlhbGVjdChkaWFsZWN0LCBmbGFncywgZGlzYWJsZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBVc2VkIGJ5IHRoZSBvdXRwdXQgb2YgdGhlIHBhcnNlciBnZW5lcmF0b3IuIE5vdCBhdmFpbGFibGUgdG9cbiAgICB1c2VyIGNvZGUuIEBoaWRlXG4gICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemUoc3BlYykge1xuICAgICAgICByZXR1cm4gbmV3IExSUGFyc2VyKHNwZWMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhaXIoZGF0YSwgb2ZmKSB7IHJldHVybiBkYXRhW29mZl0gfCAoZGF0YVtvZmYgKyAxXSA8PCAxNik7IH1cbmZ1bmN0aW9uIGZpbmRGaW5pc2hlZChzdGFja3MpIHtcbiAgICBsZXQgYmVzdCA9IG51bGw7XG4gICAgZm9yIChsZXQgc3RhY2sgb2Ygc3RhY2tzKSB7XG4gICAgICAgIGxldCBzdG9wcGVkID0gc3RhY2sucC5zdG9wcGVkQXQ7XG4gICAgICAgIGlmICgoc3RhY2sucG9zID09IHN0YWNrLnAuc3RyZWFtLmVuZCB8fCBzdG9wcGVkICE9IG51bGwgJiYgc3RhY2sucG9zID4gc3RvcHBlZCkgJiZcbiAgICAgICAgICAgIHN0YWNrLnAucGFyc2VyLnN0YXRlRmxhZyhzdGFjay5zdGF0ZSwgMiAvKiBTdGF0ZUZsYWcuQWNjZXB0aW5nICovKSAmJlxuICAgICAgICAgICAgKCFiZXN0IHx8IGJlc3Quc2NvcmUgPCBzdGFjay5zY29yZSkpXG4gICAgICAgICAgICBiZXN0ID0gc3RhY2s7XG4gICAgfVxuICAgIHJldHVybiBiZXN0O1xufVxuZnVuY3Rpb24gZ2V0U3BlY2lhbGl6ZXIoc3BlYykge1xuICAgIGlmIChzcGVjLmV4dGVybmFsKSB7XG4gICAgICAgIGxldCBtYXNrID0gc3BlYy5leHRlbmQgPyAxIC8qIFNwZWNpYWxpemUuRXh0ZW5kICovIDogMCAvKiBTcGVjaWFsaXplLlNwZWNpYWxpemUgKi87XG4gICAgICAgIHJldHVybiAodmFsdWUsIHN0YWNrKSA9PiAoc3BlYy5leHRlcm5hbCh2YWx1ZSwgc3RhY2spIDw8IDEpIHwgbWFzaztcbiAgICB9XG4gICAgcmV0dXJuIHNwZWMuZ2V0O1xufVxuXG5leHBvcnQgeyBDb250ZXh0VHJhY2tlciwgRXh0ZXJuYWxUb2tlbml6ZXIsIElucHV0U3RyZWFtLCBMUlBhcnNlciwgTG9jYWxUb2tlbkdyb3VwLCBTdGFjayB9O1xuIiwgImltcG9ydCB7IExSTGFuZ3VhZ2UsIExhbmd1YWdlU3VwcG9ydCB9IGZyb20gJ0Bjb2RlbWlycm9yL2xhbmd1YWdlJztcbmltcG9ydCB7IExSUGFyc2VyLCBMb2NhbFRva2VuR3JvdXAgfSBmcm9tICdAbGV6ZXIvbHInO1xuXG4vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBsZXplci1nZW5lcmF0b3IuIFlvdSBwcm9iYWJseSBzaG91bGRuJ3QgZWRpdCBpdC5cbmNvbnN0IHBhcnNlciA9IC8qQF9fUFVSRV9fKi9MUlBhcnNlci5kZXNlcmlhbGl6ZSh7XG4gIHZlcnNpb246IDE0LFxuICBzdGF0ZXM6IFwiKWBRUU9QT09PZk9RTycjQ15PcU9TTycjQ2BPfE9XTycjQ2JPIVhPYE8nI0NlTyFkT3BPJyNDZ09PT08nI0NrJyNDa09PT08nI0NpJyNDaVFRT1BPT09PT08sNTh4LDU4eE8hb09RTyw1OHhPIXdPUU8sNTh4T09PTyw1OHosNTh6TyNQT1NPLDU4ek8jWE9TTyw1OHpPI2FPV08sNTh8TyNpT1dPLDU4fE8jcU9XTyw1OHxPT09PLDU5UCw1OVBPI3lPYE8sNTlQTyRST2BPLDU5UE9PT08sNTlSLDU5Uk8kWk9wTyw1OVJPJGNPcE8sNTlST09PTy1FNmctRTZnT09PTzFHLmQxRy5kTyRrT1FPMUcuZE8kbk9RTzFHLmRPT09PMUcuZjFHLmZPJHNPU08xRy5mTyR2T1NPMUcuZk9PT08xRy5oMUcuaE8ke09XTzFHLmhPJVFPV08xRy5oTyVZT1dPMUcuaE8lYk9XTzFHLmhPT09PMUcuazFHLmtPJWdPYE8xRy5rTyVqT2BPMUcua09PT08xRy5tMUcubU8lb09wTzFHLm1PJXJPcE8xRy5tT09PTzcrJE83KyRPTyV3T1FPNyskT09PT083KyRRNyskUU8lfE9TTzcrJFFPT09PNyskUzcrJFNPJlJPV083KyRTTyZXT1dPNyskU08mYE9XTzcrJFNPT09PNyskVjcrJFZPJmVPYE83KyRWT09PTzcrJFg3KyRYTyZqT3BPNyskWE9PT088PEdqPDxHak9PT088PEdsPDxHbE9PT088PEduPDxHbk8mb09XTzw8R25PJnRPV088PEduT09PTzw8R3E8PEdxT09PTzw8R3M8PEdzT09PT0FOPVlBTj1ZTyZ8T1dPQU49WU9PT09HMjJ0RzIydFwiLFxuICBzdGF0ZURhdGE6IFwiJ1J+T2BQT2NRT2ZST2lTT2xUT29WT35PUlpPYVlPYlhPfk9UXk9kXU9lW09+T1ZhT1dfT2dgT35PWWRPamNPa2JPfk9bZ09tZk9uZU9+T1JqT2JpT35PYWtPYmlPfk9UbU9lbE9+T2RuT2VsT35PZ3BPaG9Pfk9Wck9XcU9+T1dxT2dzT35PWXVPa3RPfk9qdk9rdE9+T1t4T253T35PbXlPbndPfk9he09iek9+T2R9T2V8T35PaCFPT35PZyFQT2ghT09+T1chUU9nIVJPfk9XIVFPfk9qIVRPayFTT35PbSFWT24hVU9+T2IhV09+T2UhWE9+T2ghWU9+T2chWk9oIVlPfk9XIVtPfk9rIV1Pfk9uIV5Pfk9oIV9Pfk9nIWBPaCFfT35PaCFhT35PXCIsXG4gIGdvdG86IFwib2BQUGFQYVBhUFBhUGFQZVBrVFVPV1FXT1JoV1RWT1dcIixcbiAgbm9kZU5hbWVzOiBcIlx1MjZBMCBDcml0aWNNYXJrdXAgQWRkaXRpb24gTURTZXBBZGQgRGVsZXRpb24gTURTZXBEZWwgU3Vic3RpdHV0aW9uIE1EU2VwU3ViIE1TdWIgQ29tbWVudCBNRFNlcENvbSBIaWdobGlnaHQgTURTZXBIaWdcIixcbiAgbWF4VGVybTogMzEsXG4gIHNraXBwZWROb2RlczogWzBdLFxuICByZXBlYXROb2RlQ291bnQ6IDEsXG4gIHRva2VuRGF0YTogXCInb35SXVhZellael1eenBxenFyenJzenMjT3ojTyNQIVAjUCNveiNvI3AjcyNwOydTejsnUzs9YCdpPCVsT3p+IVBPb35+IVVYb35yc3ohUCFReiNPI1B6I1UjVnojWSNaeiNiI2N6I2YjZ3ojaCNpeiNpI2ohcX4hdFIhUSFbIX0hYyFpIX0jVCNaIX1+I1FSIVEhWyNaIWMhaSNaI1QjWiNafiNeUiFRIVsjZyFjIWkjZyNUI1ojZ34jalIhUSFbeiFjIWl6I1QjWnp+I3hWb352dyRfe3wlYH0hTyVrIV4hXyV2IV8hYCdWIWAhYSddI3IjcydjfiRiUCNaI1skZX4kaFAjaCNpJGt+JG5QIV0hXiRxfiR0UHZ3JHd+JHpQI1ojWyR9fiVRUCNoI2klVH4lV1AhXSFeJVp+JWBPaX5+JWNQe3wlZn4la09gfn4lblB9IU8lcX4ldk9jfn4leVEjVyNYJlAjYSNiJmh+JlNQI1gjWSZWfiZZUCNgI2EmXX4mYFAhYCFhJmN+JmhPZn5+JmtQI1QjVSZufiZxUCNmI2cmdH4md1AjXyNgJnp+Jn1QIWAhYSdRfidWT2x+fidZUCFfIWAnUX4nYFAhYCFhJVp+J2ZQI3IjcyZjfidsUDs9YDwlbHpcIixcbiAgdG9rZW5pemVyczogWzUsIC8qQF9fUFVSRV9fKi9uZXcgTG9jYWxUb2tlbkdyb3VwKFwidn5SUXt8WCFiIWNqfltQe3xffmJQI3EjcmV+ak9ifn5tUCFiIWNwfnVPUn5+XCIsIDM3LCAxNyksIC8qQF9fUFVSRV9fKi9uZXcgTG9jYWxUb2tlbkdyb3VwKFwidn5SUX0hT1ghYiFjan5bUH0hT19+YlAjcSNyZX5qT2V+fm1QIWIhY3B+dU9Ufn5cIiwgMzcsIDIwKSwgLypAX19QVVJFX18qL25ldyBMb2NhbFRva2VuR3JvdXAoXCIjV35SUiFeIV9bIWIhYyFWI3IjcyFifl9QIVAhUWJ+ZVAjVyNYaH5rUCNYI1lufnFQI2AjYXR+d1AhYCFhen59UCNxI3IhUX4hVk9ofn4hWVAhYiFjIV1+IWJPVn5+IWVSdnchbiFgIWEjUSNyI3N6fiFxUCNaI1shdH4hd1AjaCNpIXp+IX1QIV0hXiNRfiNWT1d+flwiLCA5OSwgMjMpLCAvKkBfX1BVUkVfXyovbmV3IExvY2FsVG9rZW5Hcm91cChcIiF1flJSdndbIV4hXyFjIWIhYyFpfl9QI2AjYWJ+ZVAjaCNpaH5rUCFdIV5ufnFQdnd0fndQI2AjYXp+fVAjaCNpIVF+IVRQIV0hXiFXfiFaUCNxI3IhXn4hY09rfn4hZlAhXiFfIVd+IWxQIWIhYyFvfiF0T1l+flwiLCA4MiwgMjYpLCAvKkBfX1BVUkVfXyovbmV3IExvY2FsVG9rZW5Hcm91cChcIiFvflJSIV4hX1shXyFgIV0hYiFjIWN+X1AhUCFRYn5lUCNhI2JofmtQI1QjVW5+cVAjZiNndH53UCNfI2B6fn1QIWAhYSFRfiFUUCNxI3IhV34hXU9ufn4hYFAhXyFgIVF+IWZQIWIhYyFpfiFuT1t+flwiLCA3NiwgMjkpXSxcbiAgdG9wUnVsZXM6IHtcIkNyaXRpY01hcmt1cFwiOlswLDFdfSxcbiAgdG9rZW5QcmVjOiAwXG59KTtcblxuY29uc3QgY3JpdGljbWFya3VwTGFuZ3VhZ2UgPSAvKkBfX1BVUkVfXyovTFJMYW5ndWFnZS5kZWZpbmUoe1xuICAgIG5hbWU6IFwiY3JpdGljbWFya3VwXCIsXG4gICAgcGFyc2VyOiAvKkBfX1BVUkVfXyovcGFyc2VyLmNvbmZpZ3VyZSh7fSksXG59KTtcbmZ1bmN0aW9uIGNyaXRpY21hcmt1cCgpIHtcbiAgICByZXR1cm4gbmV3IExhbmd1YWdlU3VwcG9ydChjcml0aWNtYXJrdXBMYW5ndWFnZSk7XG59XG5cbmV4cG9ydCB7IGNyaXRpY21hcmt1cCwgY3JpdGljbWFya3VwTGFuZ3VhZ2UgfTtcbiIsICJpbXBvcnQgeyBFZGl0b3JTdGF0ZSwgU3RhdGVGaWVsZCB9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHsgSW50ZXJ2YWwsIE5vZGUgfSBmcm9tIFwiQGZsYXR0ZW4tanMvaW50ZXJ2YWwtdHJlZVwiO1xuaW1wb3J0IHsgdHlwZSBDaGFuZ2VkUmFuZ2UsIHR5cGUgU3ludGF4Tm9kZSwgdHlwZSBUcmVlLCBUcmVlRnJhZ21lbnQgfSBmcm9tIFwiQGxlemVyL2NvbW1vblwiO1xuXG5pbXBvcnQge1xuXHRBZGRpdGlvblJhbmdlLFxuXHRDb21tZW50UmFuZ2UsXG5cdENyaXRpY01hcmt1cFJhbmdlLFxuXHRDcml0aWNNYXJrdXBSYW5nZXMsXG5cdERlbGV0aW9uUmFuZ2UsXG5cdEhpZ2hsaWdodFJhbmdlLFxuXHRTdWJzdGl0dXRpb25SYW5nZSxcblx0U3VnZ2VzdGlvblR5cGUsXG59IGZyb20gXCIuLi9yYW5nZXNcIjtcblxuaW1wb3J0IHsgRG9jSW5wdXQgfSBmcm9tIFwiQGNvZGVtaXJyb3IvbGFuZ3VhZ2VcIjtcbmltcG9ydCB7IENPTU1FTlRBVE9SX0dMT0JBTCB9IGZyb20gXCIuLi8uLi8uLi9nbG9iYWxcIjtcbmltcG9ydCB7IGZ1bGxSZWxvYWRFZmZlY3QgfSBmcm9tIFwiLi4vLi4vc2V0dGluZ3NcIjtcbmltcG9ydCB7IGNyaXRpY21hcmt1cExhbmd1YWdlIH0gZnJvbSBcIi4uL3BhcnNlclwiO1xuXG5pbnRlcmZhY2UgUGFyc2VyRGF0YSB7XG5cdHRyZWU6IFRyZWU7XG5cdGZyYWdtZW50czogcmVhZG9ubHkgVHJlZUZyYWdtZW50W107XG5cdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VzO1xuXHRpbnNlcnRlZF9yYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlW107XG5cdGRlbGV0ZWRfcmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZVtdO1xufVxuXG5leHBvcnQgY29uc3QgcmFuZ2VQYXJzZXI6IFN0YXRlRmllbGQ8UGFyc2VyRGF0YT4gPSBTdGF0ZUZpZWxkLmRlZmluZSh7XG5cdGNyZWF0ZShzdGF0ZSkge1xuXHRcdGNvbnN0IHRleHQgPSBzdGF0ZS5kb2MudG9TdHJpbmcoKTtcblx0XHRjb25zdCB0cmVlID0gY3JpdGljbWFya3VwTGFuZ3VhZ2UucGFyc2VyLnBhcnNlKHRleHQpO1xuXHRcdGNvbnN0IHJhbmdlcyA9IG5ldyBDcml0aWNNYXJrdXBSYW5nZXMoY3Vyc29yR2VuZXJhdGVSYW5nZXModHJlZSwgdGV4dCkpO1xuXHRcdHJldHVybiB7XG5cdFx0XHR0cmVlLFxuXHRcdFx0ZnJhZ21lbnRzOiBUcmVlRnJhZ21lbnQuYWRkVHJlZSh0cmVlKSxcblx0XHRcdHJhbmdlczogcmFuZ2VzLFxuXHRcdFx0aW5zZXJ0ZWRfcmFuZ2VzOiByYW5nZXMucmFuZ2VzLFxuXHRcdFx0ZGVsZXRlZF9yYW5nZXM6IFtdLFxuXHRcdH07XG5cdH0sXG5cblx0dXBkYXRlKHZhbHVlOiBQYXJzZXJEYXRhLCB0cikge1xuXHRcdGlmICh0ci5lZmZlY3RzLnNvbWUoZWZmZWN0ID0+IGVmZmVjdC5pcyhmdWxsUmVsb2FkRWZmZWN0KSkpXG5cdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGUodHIuc3RhdGUpIGFzIFBhcnNlckRhdGE7XG5cblx0XHRpZiAoIXRyLmRvY0NoYW5nZWQpIHtcblx0XHRcdHZhbHVlLmluc2VydGVkX3JhbmdlcyA9IFtdO1xuXHRcdFx0dmFsdWUuZGVsZXRlZF9yYW5nZXMgPSBbXTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cblx0XHQvLyBUaGUgYmVsb3cgdGltZXMgYXJlIGJhc2VkIG9uIHN0cmVzcy10ZXN0ICgyNTAuMDAwIHdvcmRzLCA1Ni4xNjcgcmFuZ2VzKVxuXHRcdC8vIGdldC1jaGFuZ2VzOiAwLjAxIC0gMC4wNSBtc1xuXHRcdGNvbnN0IGNoYW5nZWRfcmFuZ2VzOiBDaGFuZ2VkUmFuZ2VbXSA9IFtdO1xuXHRcdHRyLmNoYW5nZXMuaXRlckNoYW5nZWRSYW5nZXMoKGZyb20sIHRvLCBmcm9tQiwgdG9CKSA9PlxuXHRcdFx0Y2hhbmdlZF9yYW5nZXMucHVzaCh7IGZyb21BOiBmcm9tLCB0b0E6IHRvLCBmcm9tQjogZnJvbUIsIHRvQjogdG9CIH0pXG5cdFx0KTtcblxuXHRcdC8vIGZyYWdtZW50LXVwZGF0ZTogMC4wMSAtIDAuMDggbXNcblx0XHRsZXQgZnJhZ21lbnRzID0gVHJlZUZyYWdtZW50LmFwcGx5Q2hhbmdlcyh2YWx1ZS5mcmFnbWVudHMsIGNoYW5nZWRfcmFuZ2VzKTtcblx0XHQvLyBzdHJpbmdpZnktZG9jOiAwLjk4IC0gOC45OSBtc1xuXHRcdGNvbnN0IHRleHQgPSB0ci5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcblx0XHQvLyBwYXJzZS1kb2M6IDAuNjggLSAxLjI0IG1zXG5cdFx0Y29uc3QgdHJlZSA9IGNyaXRpY21hcmt1cExhbmd1YWdlLnBhcnNlci5wYXJzZShuZXcgRG9jSW5wdXQodHIuc3RhdGUuZG9jKSwgZnJhZ21lbnRzKTtcblx0XHQvLyBhcHBseS1mcmFnbWVudHM6IDwwLjAxIG1zXG5cdFx0ZnJhZ21lbnRzID0gVHJlZUZyYWdtZW50LmFkZFRyZWUodHJlZSwgZnJhZ21lbnRzKTtcblxuXHRcdC8vIHJlZ2VuZXJhdGUtcmFuZ2VzOiAwLjIwIC0gMC41NSBtc1xuXHRcdGNvbnN0IGluc2VydGVkX3NldCA9IG5ldyBNYXA8bnVtYmVyLCBDcml0aWNNYXJrdXBSYW5nZT4oKTtcblx0XHRjb25zdCBvZmZzZXRzOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbXTtcblx0XHRjb25zdCBkYW5nbGluZ19jb21tZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBDb21tZW50UmFuZ2U+KCk7XG5cdFx0Y29uc3QgZGVsZXRlZF9yYW5nZXM6IFNldDxDcml0aWNNYXJrdXBSYW5nZT4gPSBuZXcgU2V0KCk7XG5cdFx0Zm9yIChjb25zdCBjaGFuZ2VkX3JhbmdlIG9mIGNoYW5nZWRfcmFuZ2VzKSB7XG5cdFx0XHR2YWx1ZS5yYW5nZXMudHJlZVxuXHRcdFx0XHQuc2VhcmNoKFtjaGFuZ2VkX3JhbmdlLmZyb21BLCBjaGFuZ2VkX3JhbmdlLnRvQV0sIChyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UsIGtleTogSW50ZXJ2YWwpID0+IHtcblx0XHRcdFx0XHR2YWx1ZS5yYW5nZXMudHJlZS5yZW1vdmUoa2V5LCByYW5nZSk7XG5cdFx0XHRcdFx0ZGVsZXRlZF9yYW5nZXMuYWRkKHJhbmdlKTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHJlcGx5IG9mIHJhbmdlLmJhc2VfcmFuZ2UudGhyZWFkKVxuXHRcdFx0XHRcdFx0ZGFuZ2xpbmdfY29tbWVudHMuc2V0KHJlcGx5LmZyb20sIHJlcGx5KTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdGZvciAoY29uc3QgcmFuZ2Ugb2YgY3Vyc29yR2VuZXJhdGVSYW5nZXModHJlZSwgdGV4dCwgY2hhbmdlZF9yYW5nZS5mcm9tQiwgY2hhbmdlZF9yYW5nZS50b0IpKVxuXHRcdFx0XHRpbnNlcnRlZF9zZXQuc2V0KHJhbmdlLmZyb20sIHJhbmdlKTtcblx0XHRcdG9mZnNldHMucHVzaChbXG5cdFx0XHRcdGNoYW5nZWRfcmFuZ2UudG9BLFxuXHRcdFx0XHRjaGFuZ2VkX3JhbmdlLnRvQiAtIGNoYW5nZWRfcmFuZ2UuZnJvbUIgLSAoY2hhbmdlZF9yYW5nZS50b0EgLSBjaGFuZ2VkX3JhbmdlLmZyb21BKSxcblx0XHRcdF0pO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGRlbGV0ZWRfcmFuZ2Ugb2YgZGVsZXRlZF9yYW5nZXMpIHtcblx0XHRcdGlmIChkZWxldGVkX3JhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLkNPTU1FTlQpXG5cdFx0XHRcdGRhbmdsaW5nX2NvbW1lbnRzLmRlbGV0ZShkZWxldGVkX3JhbmdlLmZyb20pO1xuXHRcdH1cblxuXHRcdGxldCBjdW11bGF0aXZlX29mZnNldCA9IDA7XG5cblx0XHQvLyBhcHBseS1vZmZzZXRzOiAyLjcyLTMuNzAgbXNcblx0XHRjb25zdCBuaWxfbm9kZSA9IHZhbHVlLnJhbmdlcy50cmVlLm5pbF9ub2RlO1xuXHRcdGZ1bmN0aW9uIHZpc2l0Tm9kZShub2RlOiBOb2RlPENyaXRpY01hcmt1cFJhbmdlPikge1xuXHRcdFx0aWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlICE9IG5pbF9ub2RlKSB7XG5cdFx0XHRcdHZpc2l0Tm9kZShub2RlLmxlZnQpO1xuXHRcdFx0XHR3aGlsZSAob2Zmc2V0cy5sZW5ndGggJiYgbm9kZS5pdGVtLmtleS5sb3cgPj0gb2Zmc2V0c1swXVswXSlcblx0XHRcdFx0XHRjdW11bGF0aXZlX29mZnNldCArPSBvZmZzZXRzLnNoaWZ0KCkhWzFdO1xuXHRcdFx0XHRub2RlLml0ZW0udmFsdWUuYXBwbHlfb2Zmc2V0KGN1bXVsYXRpdmVfb2Zmc2V0KTtcblx0XHRcdFx0bm9kZS5pdGVtLmtleS5sb3cgPSBub2RlLml0ZW0udmFsdWUuZnJvbTtcblx0XHRcdFx0bm9kZS5pdGVtLmtleS5oaWdoID0gbm9kZS5pdGVtLnZhbHVlLnRvO1xuXHRcdFx0XHR2aXNpdE5vZGUobm9kZS5yaWdodCk7XG5cdFx0XHRcdGlmIChub2RlLmxlZnQgIT0gbmlsX25vZGUpXG5cdFx0XHRcdFx0bm9kZS5tYXgubG93ID0gbm9kZS5sZWZ0Lm1heC5sb3c7XG5cdFx0XHRcdGlmIChub2RlLnJpZ2h0ICE9IG5pbF9ub2RlKVxuXHRcdFx0XHRcdG5vZGUubWF4LmhpZ2ggPSBub2RlLnJpZ2h0Lm1heC5oaWdoO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2aXNpdE5vZGUodmFsdWUucmFuZ2VzLnRyZWUucm9vdCEpO1xuXHRcdGNvbnN0IGluc2VydGVkX3JhbmdlcyA9IEFycmF5LmZyb20oaW5zZXJ0ZWRfc2V0LnZhbHVlcygpKTtcblxuXHRcdC8vIGluc2VydC1uZXctcmFuZ2VzOiA8MC4wMSAtIDAuMDUgbXNcblx0XHRmb3IgKGNvbnN0IHJhbmdlIG9mIGluc2VydGVkX3Jhbmdlcylcblx0XHRcdHZhbHVlLnJhbmdlcy50cmVlLmluc2VydChbcmFuZ2UuZnJvbSwgcmFuZ2UudG9dLCByYW5nZSk7XG5cblx0XHQvLyBjb21tZW50cy10aHJlYWQtcmVjb25zdHJ1Y3Rpb246IDwwLjAxIC0gMC4wNSBtc1xuXHRcdGZvciAoY29uc3QgcmFuZ2Ugb2YgaW5zZXJ0ZWRfcmFuZ2VzKSB7XG5cdFx0XHRpZiAocmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVClcblx0XHRcdFx0ZGFuZ2xpbmdfY29tbWVudHMuc2V0KHJhbmdlLmZyb20sIHJhbmdlIGFzIENvbW1lbnRSYW5nZSk7XG5cdFx0fVxuXG5cdFx0Ly8gRklYTUU6IFJhcmUgY2FzZXMgb2YgY29tbWVudCByYW5nZXMgaW4gdGhyZWFkcyBiZWluZyBkdXBsaWNhdGVkIGR1ZSB0byBlZGl0b3IgY2hhbmdlc1xuXHRcdGlmIChkYW5nbGluZ19jb21tZW50cy5zaXplKSB7XG5cdFx0XHRjb25zdCBjb21tZW50X3RocmVhZHM6IENvbW1lbnRSYW5nZVtdW10gPSBbXTtcblx0XHRcdGxldCBsYXN0X3JhbmdlOiBDb21tZW50UmFuZ2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cdFx0XHRsZXQgY3VycmVudF90aHJlYWQ6IENvbW1lbnRSYW5nZVtdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IHJhbmdlIG9mIEFycmF5LmZyb20oZGFuZ2xpbmdfY29tbWVudHMudmFsdWVzKCkpLnNvcnQoKGEsIGIpID0+IGEuZnJvbSAtIGIuZnJvbSkpIHtcblx0XHRcdFx0cmFuZ2UuY2xlYXJfcmVmZXJlbmNlcygpO1xuXHRcdFx0XHRyYW5nZS5yZXBsaWVzLmxlbmd0aCA9IDA7XG5cblx0XHRcdFx0aWYgKCFsYXN0X3JhbmdlIHx8IGxhc3RfcmFuZ2U/LnJpZ2h0X2FkamFjZW50KHJhbmdlKSlcblx0XHRcdFx0XHRjdXJyZW50X3RocmVhZC5wdXNoKHJhbmdlKTtcblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0Y29tbWVudF90aHJlYWRzLnB1c2goY3VycmVudF90aHJlYWQpO1xuXHRcdFx0XHRcdGN1cnJlbnRfdGhyZWFkID0gW3JhbmdlXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsYXN0X3JhbmdlID0gcmFuZ2U7XG5cdFx0XHR9XG5cdFx0XHRjb21tZW50X3RocmVhZHMucHVzaChjdXJyZW50X3RocmVhZCk7XG5cblx0XHRcdGZvciAoY29uc3QgdGhyZWFkIG9mIGNvbW1lbnRfdGhyZWFkcykge1xuXHRcdFx0XHRjb25zdCBoZWFkID0gdGhyZWFkWzBdO1xuXHRcdFx0XHRjb25zdCBhZGphY2VudF9yYW5nZSA9IHZhbHVlLnJhbmdlcy50cmVlLnNlYXJjaChbaGVhZC5mcm9tLCBoZWFkLmZyb21dKVswXSBhcyBDcml0aWNNYXJrdXBSYW5nZTtcblx0XHRcdFx0YWRqYWNlbnRfcmFuZ2UhLnJlcGxpZXMubGVuZ3RoID0gMDtcblx0XHRcdFx0Zm9yIChjb25zdCBjb21tZW50IG9mIHRocmVhZC5zbGljZShhZGphY2VudF9yYW5nZSA9PT0gaGVhZCA/IDEgOiAwKSlcblx0XHRcdFx0XHRjb21tZW50LmFkZF9yZXBseShhZGphY2VudF9yYW5nZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gZmluYWxpemU6IDEuODAgLSAxLjg1IG1zXG5cdFx0dmFsdWUucmFuZ2VzLnJhbmdlcyA9IHZhbHVlLnJhbmdlcy50cmVlLnZhbHVlcztcblxuXHRcdHJldHVybiB7IHRyZWUsIHJhbmdlczogdmFsdWUucmFuZ2VzLCBmcmFnbWVudHMsIGluc2VydGVkX3JhbmdlcywgZGVsZXRlZF9yYW5nZXM6IFsuLi5kZWxldGVkX3Jhbmdlc10gfTtcblx0fSxcbn0pO1xuXG5mdW5jdGlvbiBjb25zdHJ1Y3RSYW5nZUZyb21TeW50YXhOb2RlKHJhbmdlOiBTeW50YXhOb2RlLCB0ZXh0OiBzdHJpbmcpIHtcblx0Y29uc3QgbWV0YWRhdGEgPVxuXHRcdChDT01NRU5UQVRPUl9HTE9CQUwuUExVR0lOX1NFVFRJTkdTLmVuYWJsZV9tZXRhZGF0YSAmJiByYW5nZS5maXJzdENoaWxkPy50eXBlLm5hbWUuc3RhcnRzV2l0aChcIk1EU2VwXCIpKSA/XG5cdFx0XHRyYW5nZS5maXJzdENoaWxkIS5mcm9tIDpcblx0XHRcdHVuZGVmaW5lZDtcblx0bGV0IG1pZGRsZSA9IHVuZGVmaW5lZDtcblx0aWYgKHJhbmdlLnR5cGUubmFtZSA9PT0gXCJTdWJzdGl0dXRpb25cIikge1xuXHRcdGNvbnN0IGNoaWxkID0gbWV0YWRhdGEgPyByYW5nZS5maXJzdENoaWxkPy5uZXh0U2libGluZyA6IHJhbmdlLmZpcnN0Q2hpbGQ7XG5cdFx0aWYgKCFjaGlsZCB8fCBjaGlsZC50eXBlLm5hbWUgIT09IFwiTVN1YlwiKSByZXR1cm47XG5cdFx0bWlkZGxlID0gY2hpbGQuZnJvbTtcblx0fVxuXG5cdHJldHVybiBjb25zdHJ1Y3RSYW5nZShyYW5nZS5mcm9tLCByYW5nZS50bywgcmFuZ2UudHlwZS5uYW1lLCB0ZXh0LnNsaWNlKHJhbmdlLmZyb20sIHJhbmdlLnRvKSwgbWlkZGxlLCBtZXRhZGF0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdXJzb3JHZW5lcmF0ZVJhbmdlcyh0cmVlOiBUcmVlLCB0ZXh0OiBzdHJpbmcsIHN0YXJ0ID0gMCwgdG8gPSB0ZXh0Lmxlbmd0aCkge1xuXHRjb25zdCByYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlW10gPSBbXTtcblxuXHRsZXQgcHJldmlvdXNfcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5cdGNvbnN0IGN1cnNvciA9IHRyZWUuY3Vyc29yKCk7XG5cdC8vIE1vdmUgaW50byB0aGUgZmlyc3QgcmFuZ2UgaWYgaXQgZXhpc3RzIChvdGhlcndpc2Ugc3RheXMgaW4gQ3JpdGljTWFya3VwIG5vZGUpLCBuZWdhdGl2ZSBvZmZzZXQgdG8gYmUgbGVmdC1pbmNsdXNpdmVcblx0Y3Vyc29yLmNoaWxkQWZ0ZXIoc3RhcnQgLSAxKTtcblx0aWYgKGN1cnNvci5ub2RlLnR5cGUubmFtZSA9PT0gXCJDcml0aWNNYXJrdXBcIilcblx0XHRyZXR1cm4gcmFuZ2VzO1xuXHRpZiAoY3Vyc29yLm5vZGUuZnJvbSA+IHRvKVxuXHRcdHJldHVybiByYW5nZXM7XG5cblx0aWYgKGN1cnNvcikge1xuXHRcdGRvIHtcblx0XHRcdGNvbnN0IHJhbmdlID0gY3Vyc29yLm5vZGU7XG5cdFx0XHRpZiAocmFuZ2UudHlwZS5uYW1lID09PSBcIlx1MjZBMFwiKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IG5ld19yYW5nZSA9IGNvbnN0cnVjdFJhbmdlRnJvbVN5bnRheE5vZGUocmFuZ2UsIHRleHQpO1xuXHRcdFx0aWYgKG5ld19yYW5nZSkge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0bmV3X3JhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLkNPTU1FTlQgJiYgcHJldmlvdXNfcmFuZ2UgJiZcblx0XHRcdFx0XHRwcmV2aW91c19yYW5nZS5yaWdodF9hZGphY2VudChuZXdfcmFuZ2UpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdChuZXdfcmFuZ2UgYXMgQ29tbWVudFJhbmdlKS5hZGRfcmVwbHkocHJldmlvdXNfcmFuZ2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJhbmdlcy5wdXNoKG5ld19yYW5nZSk7XG5cdFx0XHRcdHByZXZpb3VzX3JhbmdlID0gbmV3X3JhbmdlO1xuXHRcdFx0fVxuXHRcdH0gd2hpbGUgKGN1cnNvci5uZXh0U2libGluZygpICYmIGN1cnNvci5ub2RlLmZyb20gPD0gdG8pO1xuXHR9XG5cblx0cmV0dXJuIHJhbmdlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdGlvbkNvbnRhaW5zUmFuZ2VzKHN0YXRlOiBFZGl0b3JTdGF0ZSkge1xuXHRjb25zdCByYW5nZXMgPSBzdGF0ZS5maWVsZChyYW5nZVBhcnNlcikucmFuZ2VzO1xuXHRyZXR1cm4gcmFuZ2VzLnJhbmdlcy5sZW5ndGggP1xuXHRcdHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMuc29tZShyYW5nZSA9PiByYW5nZXMuY29udGFpbnNfcmFuZ2UocmFuZ2UuZnJvbSwgcmFuZ2UudG8pKSA6XG5cdFx0ZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5nZXNJblRleHQodGV4dDogc3RyaW5nKSB7XG5cdGNvbnN0IHRyZWUgPSBjcml0aWNtYXJrdXBMYW5ndWFnZS5wYXJzZXIucGFyc2UodGV4dCk7XG5cdHJldHVybiBjdXJzb3JHZW5lcmF0ZVJhbmdlcyh0cmVlLCB0ZXh0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdFJhbmdlKFxuXHRmcm9tOiBudW1iZXIsXG5cdHRvOiBudW1iZXIsXG5cdHR5cGU6IHN0cmluZyxcblx0dGV4dDogc3RyaW5nLFxuXHRtaWRkbGU/OiBudW1iZXIsXG5cdG1ldGFkYXRhPzogbnVtYmVyLFxuKSB7XG5cdHN3aXRjaCAodHlwZSkge1xuXHRcdGNhc2UgXCJBZGRpdGlvblwiOlxuXHRcdFx0cmV0dXJuIG5ldyBBZGRpdGlvblJhbmdlKGZyb20sIHRvLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdFx0Y2FzZSBcIkRlbGV0aW9uXCI6XG5cdFx0XHRyZXR1cm4gbmV3IERlbGV0aW9uUmFuZ2UoZnJvbSwgdG8sIHRleHQsIG1ldGFkYXRhKTtcblx0XHRjYXNlIFwiU3Vic3RpdHV0aW9uXCI6XG5cdFx0XHRyZXR1cm4gbmV3IFN1YnN0aXR1dGlvblJhbmdlKGZyb20sIG1pZGRsZSEsIHRvLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdFx0Y2FzZSBcIkhpZ2hsaWdodFwiOlxuXHRcdFx0cmV0dXJuIG5ldyBIaWdobGlnaHRSYW5nZShmcm9tLCB0bywgdGV4dCwgbWV0YWRhdGEpO1xuXHRcdGNhc2UgXCJDb21tZW50XCI6XG5cdFx0XHRyZXR1cm4gbmV3IENvbW1lbnRSYW5nZShmcm9tLCB0bywgdGV4dCwgbWV0YWRhdGEpO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHQvLyBXaWxsIG5ldmVyIGdldCBjYWxsZWRcblx0XHRcdHJldHVybiBuZXcgQWRkaXRpb25SYW5nZShmcm9tLCB0bywgdGV4dCwgbWV0YWRhdGEpO1xuXHR9XG59XG5cbmV4cG9ydCBjb25zdCBSQU5HRV9QUk9UT1RZUEVfTUFQUEVSID0ge1xuXHRbU3VnZ2VzdGlvblR5cGUuQURESVRJT05dOiBBZGRpdGlvblJhbmdlLFxuXHRbU3VnZ2VzdGlvblR5cGUuREVMRVRJT05dOiBEZWxldGlvblJhbmdlLFxuXHRbU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUXTogSGlnaGxpZ2h0UmFuZ2UsXG5cdFtTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT05dOiBTdWJzdGl0dXRpb25SYW5nZSxcblx0W1N1Z2dlc3Rpb25UeXBlLkNPTU1FTlRdOiBDb21tZW50UmFuZ2UsXG59O1xuIiwgImltcG9ydCB7IENPTU1FTlRBVE9SX0dMT0JBTCB9IGZyb20gXCIuLi8uLi8uLi9nbG9iYWxcIjtcbmltcG9ydCB7IENyaXRpY01hcmt1cFJhbmdlLCB0eXBlIE1FVEFEQVRBX1RZUEUsIHR5cGUgTWV0YWRhdGFGaWVsZHMgfSBmcm9tIFwiLi4vcmFuZ2VzXCI7XG5cbmV4cG9ydCB0eXBlIE1ldGFkYXRhQ29tcGF0aWJpbGl0eSA9IHtcblx0W2tleSBpbiBNRVRBREFUQV9UWVBFXT86IE1ldGFkYXRhTWVyZ2VBY3Rpb247XG59O1xuXG5leHBvcnQgZW51bSBNZXRhZGF0YU1lcmdlQWN0aW9uIHtcblx0Ly8gVE9ETzogQ2hlY2sgbmVjZXNzaXR5IG9mIFNLSVAgYWN0aW9uIChnaXZpbmcgd2FybmluZyBmb3IgaW5zZXJ0IGluIGRpZmYtYXV0aG9yIHJhbmdlIGNvdWxkIGFsc28gYmUgaGFuZGxlZCBvbiBTUExJVCBsZXZlbClcblx0Ly8gRGlzYWJsZSBhY3Rpb25cblx0Ly8gU0tJUCA9IFwic2tpcFwiLFxuXG5cdC8vIFNwbGl0IHJhbmdlIGludG8gdHdvIHJhbmdlcyAoYWxsb3cgb3ZlcndyaXRpbmcsIGRvZXMgbm90IGFsbG93IG1lcmdpbmcpXG5cdFNQTElUID0gXCJzcGxpdFwiLFxuXHQvLyBNb3ZlIG91dHNpZGUgb2YgcmFuZ2UgKGRvZXMgbm90IGFsbG93IG92ZXJ3cml0aW5nLCBkb2VzIG5vdCBhbGxvdyBtZXJnaW5nKVxuXHRNT1ZFX09VVFNJREUgPSBcIm1vdmVfb3V0c2lkZVwiLFxuXG5cdC8vIENob29zZSB2YWx1ZSBvZiBvbGQgcmFuZ2Vcblx0T0xEID0gXCJvbGRcIixcblx0Ly8gQ2hvb3NlIHZhbHVlIG9mIG5ldyByYW5nZVxuXHRORVcgPSBcIm5ld1wiLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVfbWV0YWRhdGEoKTogTWV0YWRhdGFGaWVsZHMgfCB1bmRlZmluZWQge1xuXHRsZXQgbWV0YWRhdGE6IE1ldGFkYXRhRmllbGRzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXHRpZiAoQ09NTUVOVEFUT1JfR0xPQkFMLlBMVUdJTl9TRVRUSU5HUy5hZGRfbWV0YWRhdGEpIHtcblx0XHRtZXRhZGF0YSA9IHt9O1xuXHRcdGlmIChDT01NRU5UQVRPUl9HTE9CQUwuUExVR0lOX1NFVFRJTkdTLmFkZF9hdXRob3JfbWV0YWRhdGEpXG5cdFx0XHRtZXRhZGF0YS5hdXRob3IgPSBDT01NRU5UQVRPUl9HTE9CQUwuUExVR0lOX1NFVFRJTkdTLmF1dGhvciB8fCB1bmRlZmluZWQ7XG5cdFx0aWYgKENPTU1FTlRBVE9SX0dMT0JBTC5QTFVHSU5fU0VUVElOR1MuYWRkX3RpbWVzdGFtcF9tZXRhZGF0YSlcblx0XHRcdG1ldGFkYXRhLnRpbWUgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcblx0XHRpZiAoT2JqZWN0LmtleXMobWV0YWRhdGEpLmxlbmd0aCA9PT0gMClcblx0XHRcdG1ldGFkYXRhID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0cmV0dXJuIG1ldGFkYXRhO1xufVxuXG5jb25zdCBNRVRBREFUQV9JTkNPTVBBVElCSUxJVFk6IE1ldGFkYXRhQ29tcGF0aWJpbGl0eSA9IHtcblx0XCJhdXRob3JcIjogTWV0YWRhdGFNZXJnZUFjdGlvbi5TUExJVCxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByYW5nZV9tZXRhZGF0YV9jb21wYXRpYmxlKFxuXHRyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UsXG5cdG1ldGFkYXRhX2ZpZWxkcz86IE1ldGFkYXRhRmllbGRzLFxuXHRtZXRhZGF0YV9jb21wYXRpYmlsaXR5OiBNZXRhZGF0YUNvbXBhdGliaWxpdHkgPSBNRVRBREFUQV9JTkNPTVBBVElCSUxJVFksXG4pIHtcblx0Ly8gSWYgbm8gbWV0YWRhdGEgd2FzIHByb3ZpZGVkLCBhbGxvdyBtZXJnaW5nIG9mIHJhbmdlXG5cdGlmICghbWV0YWRhdGFfZmllbGRzKVxuXHRcdHJldHVybiB7IGNvbXBhdGlibGU6IHRydWUsIG1lcmdlZF9tZXRhZGF0YTogcmFuZ2UuZmllbGRzIH07XG5cblx0Ly8gSWYgbWV0YWRhdGEgd2FzIHByb3ZpZGVkIGJ1dCByYW5nZSBoYXMgbm8gbWV0YWRhdGEsIGRvIG5vdCBhbGxvdyBtZXJnaW5nXG5cdGlmICghcmFuZ2UuZmllbGRzKVxuXHRcdHJldHVybiB7IGNvbXBhdGlibGU6IGZhbHNlLCBtZXJnZWRfbWV0YWRhdGE6IHVuZGVmaW5lZCB9O1xuXG5cdGNvbnN0IG1lcmdlZF9tZXRhZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHJhbmdlLmZpZWxkcywgbWV0YWRhdGFfZmllbGRzKTtcblx0Zm9yIChjb25zdCB0eXBlIG9mIFsuLi5uZXcgU2V0KE9iamVjdC5rZXlzKG1ldGFkYXRhX2ZpZWxkcykuY29uY2F0KE9iamVjdC5rZXlzKHJhbmdlLmZpZWxkcykpKV0pIHtcblx0XHRpZiAobWV0YWRhdGFfZmllbGRzW3R5cGVdICE9PSByYW5nZS5maWVsZHNbdHlwZV0pIHtcblx0XHRcdGNvbnN0IGFjdGlvbiA9IG1ldGFkYXRhX2NvbXBhdGliaWxpdHlbdHlwZSBhcyBNRVRBREFUQV9UWVBFXTtcblx0XHRcdGlmIChNZXRhZGF0YU1lcmdlQWN0aW9uLlNQTElUID09PSBhY3Rpb24gfHwgTWV0YWRhdGFNZXJnZUFjdGlvbi5NT1ZFX09VVFNJREUgPT09IGFjdGlvbilcblx0XHRcdFx0cmV0dXJuIHsgY29tcGF0aWJsZTogZmFsc2UsIG1lcmdlZF9tZXRhZGF0YTogdW5kZWZpbmVkIH07XG5cdFx0XHRlbHNlIGlmIChNZXRhZGF0YU1lcmdlQWN0aW9uLk9MRCA9PT0gYWN0aW9uKVxuXHRcdFx0XHRtZXJnZWRfbWV0YWRhdGFbdHlwZSBhcyBNRVRBREFUQV9UWVBFXSA9IHJhbmdlLmZpZWxkc1t0eXBlXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHsgY29tcGF0aWJsZTogdHJ1ZSwgbWVyZ2VkX21ldGFkYXRhIH07XG59XG4iLCAiaW1wb3J0IHsgQ2hhckNhdGVnb3J5LCBFZGl0b3JTZWxlY3Rpb24sIHR5cGUgRWRpdG9yU3RhdGUgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7XG5cdHR5cGUgQnJhY2tldE9wdGlvbnNNYXAsXG5cdHR5cGUgQ3Vyc29yT3B0aW9uc01hcCxcblx0UkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04sXG5cdFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04sXG59IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgZmluZEJsb2NraW5nQ2hhciwgZ2V0Q2hhckNhdGVnb3J5IH0gZnJvbSBcIi4uL2VkaXQtdXRpbFwiO1xuaW1wb3J0IHsgQ3JpdGljTWFya3VwUmFuZ2UsIENyaXRpY01hcmt1cFJhbmdlcywgU3VnZ2VzdGlvblR5cGUgfSBmcm9tIFwiLi4vcmFuZ2VzXCI7XG5pbXBvcnQgdHlwZSB7IEVkaXRvclJhbmdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZnVuY3Rpb24gY2F0X2lnbm9yZV93cyhjYXQ6IENoYXJDYXRlZ29yeSB8IG51bGwpIHtcblx0cmV0dXJuIGNhdCA9PT0gQ2hhckNhdGVnb3J5LlNwYWNlIHx8IGNhdCA9PT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY2F0X2RpZmZlcmVudChvbGRfY2F0OiBDaGFyQ2F0ZWdvcnkgfCBudWxsLCBuZXdfY2F0OiBDaGFyQ2F0ZWdvcnkgfCBudWxsKSB7XG5cdHJldHVybiBvbGRfY2F0ICE9PSBudWxsICYmIG9sZF9jYXQgIT09IENoYXJDYXRlZ29yeS5TcGFjZSAmJiBvbGRfY2F0ICE9PSBuZXdfY2F0O1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gZWZmaWNpZW50bHkgZmluZCB0aGUgbmV3IHN1Z2dlc3Rpb24gcmFuZ2UgYWZ0ZXIgYSBjdXJzb3IgbW92ZW1lbnRcbiAqIEBwYXJhbSBjdXJzb3JfaGVhZCAtIEN1cnJlbnQgY3Vyc29yIGhlYWRcbiAqIEBwYXJhbSByYW5nZXMgLSBBbGwgc3VnZ2VzdGlvbiByYW5nZXMgaW4gdGhlIGRvY3VtZW50XG4gKiBAcGFyYW0gcmFuZ2UgLSBDdXJyZW50IHN1Z2dlc3Rpb24gcmFuZ2VcbiAqIEByZW1hcmsgVGhpcyBmdW5jdGlvbiBleGlzdHMgdG8gcHJldmVudCBoYXZpbmcgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBzdWdnZXN0aW9uIHJhbmdlcyB3aGVuIHRyeWluZyB0byBmaW5kIHRoZSBuZXcgcmFuZ2UgYWZ0ZXIgYSBjdXJzb3IgbW92ZW1lbnRcbiAqL1xuZnVuY3Rpb24gZmluZF9yYW5nZV9jdXJzb3IoY3Vyc29yX2hlYWQ6IG51bWJlciwgcmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZXMsIHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSkge1xuXHRpZiAocmFuZ2UuY3Vyc29yX2luc2lkZShjdXJzb3JfaGVhZCkpXG5cdFx0cmV0dXJuIHJhbmdlO1xuXHRlbHNlIHtcblx0XHRjb25zdCBjaGVja19kaXJlY3Rpb24gPSByYW5nZS5jdXJzb3JfYmVmb3JlX3JhbmdlKGN1cnNvcl9oZWFkKTtcblx0XHRsZXQgcmFuZ2VfaWR4ID0gcmFuZ2VzLnJhbmdlcy5pbmRleE9mKHJhbmdlKSArIChjaGVja19kaXJlY3Rpb24gPyAtMSA6IDEpO1xuXG5cdFx0d2hpbGUgKHJhbmdlX2lkeCA+PSAwICYmIHJhbmdlX2lkeCA8IHJhbmdlcy5yYW5nZXMubGVuZ3RoKSB7XG5cdFx0XHRyYW5nZSA9IHJhbmdlcy5yYW5nZXNbcmFuZ2VfaWR4XTtcblx0XHRcdGlmIChjaGVja19kaXJlY3Rpb24gPyByYW5nZS5jdXJzb3JfYmVmb3JlX3JhbmdlKGN1cnNvcl9oZWFkKSA6IHJhbmdlLmN1cnNvcl9hZnRlcl9yYW5nZShjdXJzb3JfaGVhZCkpXG5cdFx0XHRcdHJhbmdlX2lkeCArPSBjaGVja19kaXJlY3Rpb24gPyAtMSA6IDE7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiByYW5nZS5jdXJzb3JfaW5zaWRlKGN1cnNvcl9oZWFkKSA/IHJhbmdlIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQWR2YW5jZSB0aGUgY3Vyc29yIHRocm91Z2ggQ3JpdGljTWFya3VwIHN5bnRheCwgYmFzZWQgb24gdGhlIG1vdmVtZW50IG9wdGlvbnMgZm9yIHRoZSByYW5nZSB0eXBlXG4gKiBAcGFyYW0gY3Vyc29yX2hlYWQgLSBDdXJyZW50IGN1cnNvciBoZWFkXG4gKiBAcGFyYW0gbW92ZV9mb3J3YXJkcyAtIFdoZXRoZXIgdGhlIGN1cnNvciBtb3ZlbWVudCBpcyBmb3J3YXJkcyBvciBiYWNrd2FyZHNcbiAqIEBwYXJhbSByYW5nZXMgLSBBbGwgc3VnZ2VzdGlvbiByYW5nZXMgaW4gdGhlIGRvY3VtZW50XG4gKiBAcGFyYW0gcmFuZ2UgLSBDdXJyZW50IHN1Z2dlc3Rpb24gcmFuZ2VcbiAqIEBwYXJhbSBtb3ZlbWVudF9vcHRpb25zIC0gT3B0aW9ucyBmb3IgY3Vyc29yIG1vdmVtZW50IHRocm91Z2ggc3VnZ2VzdGlvbiByYW5nZXNcbiAqIEBwYXJhbSBicmFja2V0X29wdGlvbnMgLSBPcHRpb25zIGZvciBjdXJzb3IgbW92ZW1lbnQgYmV0d2VlbiBkaWZmZXJlbnQgc3VnZ2VzdGlvbiByYW5nZXNcbiAqL1xuZnVuY3Rpb24gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdGN1cnNvcl9oZWFkOiBudW1iZXIsXG5cdG1vdmVfZm9yd2FyZHM6IGJvb2xlYW4sXG5cdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VzLFxuXHRyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UgfCB1bmRlZmluZWQsXG5cdG1vdmVtZW50X29wdGlvbnM6IEN1cnNvck9wdGlvbnNNYXAsXG5cdGJyYWNrZXRfb3B0aW9uczogQnJhY2tldE9wdGlvbnNNYXAgfCBudWxsLFxuKTogW251bWJlciwgQ3JpdGljTWFya3VwUmFuZ2UgfCB1bmRlZmluZWRdIHtcblx0aWYgKCFyYW5nZSlcblx0XHRyYW5nZSA9IHJhbmdlcy5yYW5nZV9hZGphY2VudF90b19jdXJzb3IoY3Vyc29yX2hlYWQsICFtb3ZlX2ZvcndhcmRzLCB0cnVlLCB0cnVlKTtcblx0ZWxzZVxuXHRcdHJhbmdlID0gZmluZF9yYW5nZV9jdXJzb3IoY3Vyc29yX2hlYWQsIHJhbmdlcywgcmFuZ2UpO1xuXG5cdGxldCBjdXJzb3JfY2hhbmdlZCA9IHRydWU7XG5cdHdoaWxlIChjdXJzb3JfY2hhbmdlZCAmJiByYW5nZSkge1xuXHRcdGNvbnN0IG9sZF9jdXJzb3JfaGVhZCA9IGN1cnNvcl9oZWFkO1xuXHRcdGN1cnNvcl9oZWFkID0gcmFuZ2UhLmN1cnNvcl9tb3ZlX3Rocm91Z2goY3Vyc29yX2hlYWQsIG1vdmVfZm9yd2FyZHMsIG1vdmVtZW50X29wdGlvbnNbcmFuZ2UhLnR5cGVdKTtcblx0XHRjdXJzb3JfY2hhbmdlZCA9IGN1cnNvcl9oZWFkICE9PSBvbGRfY3Vyc29yX2hlYWQ7XG5cdFx0aWYgKGN1cnNvcl9jaGFuZ2VkICYmIGN1cnNvcl9oZWFkID09PSAobW92ZV9mb3J3YXJkcyA/IHJhbmdlLnRvIDogcmFuZ2UuZnJvbSkpIHtcblx0XHRcdHJhbmdlID0gcmFuZ2VzLmFkamFjZW50X3JhbmdlKHJhbmdlISwgIW1vdmVfZm9yd2FyZHMsIHRydWUpO1xuXHRcdFx0aWYgKHJhbmdlICYmIGJyYWNrZXRfb3B0aW9ucyAmJiBicmFja2V0X29wdGlvbnNbcmFuZ2UudHlwZV0gPT09IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfT1VUU0lERSlcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFtjdXJzb3JfaGVhZCwgcmFuZ2VdO1xufVxuXG4vKipcbiAqIEBwYXJhbSBvbGRfaGVhZCAtIE9yaWdpbmFsIGN1cnNvciBoZWFkXG4gKiBAcGFyYW0gbmV3X2hlYWQgLSBDdXJzb3IgaGVhZCBhZnRlciAqcmVndWxhciogY3Vyc29yIG1vdmVtZW50XG4gKiBAcGFyYW0gcmFuZ2VzIC0gQWxsIHN1Z2dlc3Rpb24gcmFuZ2VzIGluIHRoZSBkb2N1bWVudFxuICogQHBhcmFtIG1vdmVfZm9yd2FyZHMgLSBXaGV0aGVyIHRoZSBjdXJzb3IgbW92ZW1lbnQgaXMgZm9yd2FyZHMgb3IgYmFja3dhcmRzXG4gKiBAcGFyYW0gYnlfd29yZF9ncm91cCAtIFdoZXRoZXIgdG8gbW92ZSBieSB3b3JkIGdyb3VwIChjdHJsL2FsdCArIGFycm93IGtleXMpXG4gKiBAcGFyYW0gaXNfc2VsZWN0aW9uIC0gV2hldGhlciB0byBleHRlbmQgdGhlIHNlbGVjdGlvbiBvZiB0aGUgb3JpZ2luYWwgcmFuZ2VcbiAqIEBwYXJhbSBpc19ibG9ja19jdXJzb3IgLSBXaGV0aGVyIGN1cnNvciBpcyBjb25zaWRlcmVkIGFzIGEgYmxvY2sgY3Vyc29yICh2aW0gbW9kZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIEVkaXRvciBzdGF0ZVxuICogQHBhcmFtIG1vdmVtZW50X29wdGlvbnMgLSBPcHRpb25zIGZvciBjdXJzb3IgbW92ZW1lbnQgdGhyb3VnaCBzdWdnZXN0aW9uIHJhbmdlc1xuICogQHBhcmFtIGJyYWNrZXRfb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGN1cnNvciBtb3ZlbWVudCB0aHJvdWdoIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZHZhbmNlX2N1cnNvcl9oZWFkKFxuXHRvbGRfaGVhZDogbnVtYmVyLFxuXHRuZXdfaGVhZDogbnVtYmVyLFxuXHRyYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlcyxcblx0bW92ZV9mb3J3YXJkczogYm9vbGVhbixcblx0Ynlfd29yZF9ncm91cDogYm9vbGVhbixcblx0aXNfYmxvY2tfY3Vyc29yID0gZmFsc2UsXG5cdHN0YXRlOiBFZGl0b3JTdGF0ZSxcblx0bW92ZW1lbnRfb3B0aW9uczogQ3Vyc29yT3B0aW9uc01hcCxcblx0YnJhY2tldF9vcHRpb25zOiBCcmFja2V0T3B0aW9uc01hcCxcbik6IG51bWJlciB7XG5cdC8vIE5PVEU6IFRoZSByZWFzb24gd2h5IGJvdGggb2xkIGFuZCBuZXcgY3Vyc29yIGhlYWQgYXJlIHVzZWQsIGlzIGJlY2F1c2UgaXQgaXMgbm90IHNpbXBsZSB0byBib3RoOlxuXHQvLyAgLSBSZWNyZWF0ZSB0aGUgZW50aXJlIG1vdmVtZW50IGFjdGlvbiBwYWxldHRlIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIGFuZCBhcHBseSBvbiBvcmlnaW5hbCByYW5nZSAoZS5nLiBtb3ZlIHRvIGJlZ2lubmluZyBvZiBub3RlLCAuLi4pXG5cdC8vICAgICAgICAgIC0+IFVzZSBuZXcgY3Vyc29yIGhlYWQgdG8gaGF2ZSBhIHN0YXJ0aW5nIHBvaW50XG5cdC8vICAtIFZlcmlmeSB0aGF0IG5vbmUgb2YgdGhlIHJhbmdlcyB0aGUgY3Vyc29yIHBhc3NlcyB0aHJvdWdoIHdpdGggdGhlIG9yaWdpbmFsIG1vdmVtZW50IGFyZSBibG9ja2luZyB1c2luZyBvbmx5IHRoZSBuZXcgY3Vyc29yIHJhbmdlXG5cdC8vICAgICAgICAgIC0+IE1vdmUgZnJvbSBvbGQgaGVhZCB0byB2ZXJpZnkgdGhhdCBub25lIG9mIHRoZSByYW5nZXMgYXJlIGJsb2NraW5nXG5cblx0bGV0IHN1Z2dlc3Rpb25fcmFuZ2UgPSByYW5nZXMucmFuZ2VfYWRqYWNlbnRfdG9fY3Vyc29yKG9sZF9oZWFkLCAhbW92ZV9mb3J3YXJkcywgdHJ1ZSwgIWJ5X3dvcmRfZ3JvdXApO1xuXG5cdC8vIElmIG5vIHJhbmdlIGV4aXN0cyBpbiBtb3ZlbWVudCBkaXJlY3Rpb24gT1IgY3Vyc29yIGhhcyBub3QgcGFzc2VkIGEgcmFuZ2UgT1IgbW92ZW1lbnQgdGhyb3VnaCByYW5nZSBpcyBzZXQgdG8gYmUgdGhlIHNhbWUsXG5cdC8vIHRoZW4ganVzdCByZXR1cm4gdGhlIG5ldyByYW5nZSBhcy1pcyB3aXRob3V0IGFkZGl0aW9uYWwgcHJvY2Vzc2luZ1xuXHRpZiAoXG5cdFx0IXN1Z2dlc3Rpb25fcmFuZ2UgfHxcblx0XHQobW92ZV9mb3J3YXJkcyA/XG5cdFx0XHRzdWdnZXN0aW9uX3JhbmdlLmN1cnNvcl9iZWZvcmVfcmFuZ2UobmV3X2hlYWQpIDpcblx0XHRcdHN1Z2dlc3Rpb25fcmFuZ2UuY3Vyc29yX2FmdGVyX3JhbmdlKG5ld19oZWFkKSkgfHxcblx0XHRtb3ZlbWVudF9vcHRpb25zW3N1Z2dlc3Rpb25fcmFuZ2UudHlwZV0gPT09IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04uVU5DSEFOR0VEXG5cdCkge1xuXHRcdHJldHVybiBuZXdfaGVhZDtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGRpZmZlcmVuY2UgaW4gbW92ZW1lbnQgaXMgb25seSBvbmUgY2hhcmFjdGVyIChzaW5nbGUgY2hhcmFjdGVyIG1vdmVtZW50KVxuXHRpZiAoIWJ5X3dvcmRfZ3JvdXAgJiYgTWF0aC5hYnMob2xkX2hlYWQgLSBuZXdfaGVhZCkgPT09IDEpIHtcblx0XHRbbmV3X2hlYWQsIHN1Z2dlc3Rpb25fcmFuZ2VdID0gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdFx0XHRvbGRfaGVhZCxcblx0XHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0XHRyYW5nZXMsXG5cdFx0XHRzdWdnZXN0aW9uX3JhbmdlLFxuXHRcdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRcdGJyYWNrZXRfb3B0aW9ucyxcblx0XHQpO1xuXHRcdG5ld19oZWFkID0gbmV3X2hlYWQgKyAobW92ZV9mb3J3YXJkcyA/IDEgOiAtMSk7XG5cdH0gZWxzZSBpZiAoIWJ5X3dvcmRfZ3JvdXApIHtcblx0XHRbbmV3X2hlYWQsIHN1Z2dlc3Rpb25fcmFuZ2VdID0gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdFx0XHRuZXdfaGVhZCxcblx0XHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0XHRyYW5nZXMsXG5cdFx0XHRzdWdnZXN0aW9uX3JhbmdlLFxuXHRcdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRcdGJyYWNrZXRfb3B0aW9ucyxcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGxldCBwcmV2aW91c19yZWdfY2hhciA9IGN1cnNvcl9hZHZhbmNlX3Rocm91Z2hfc3ludGF4KFxuXHRcdFx0bmV3X2hlYWQsXG5cdFx0XHQhbW92ZV9mb3J3YXJkcyxcblx0XHRcdHJhbmdlcyxcblx0XHRcdHN1Z2dlc3Rpb25fcmFuZ2UsXG5cdFx0XHRtb3ZlbWVudF9vcHRpb25zLFxuXHRcdFx0bnVsbCxcblx0XHQpWzBdO1xuXHRcdGxldCBwcmV2aW91c19jYXQgPSBudWxsLFxuXHRcdFx0Y3VycmVudF9jYXQgPSAocHJldmlvdXNfcmVnX2NoYXIgPT09IG9sZF9oZWFkKSA/XG5cdFx0XHRcdG51bGwgOlxuXHRcdFx0XHRnZXRDaGFyQ2F0ZWdvcnkocHJldmlvdXNfcmVnX2NoYXIsIHN0YXRlLCBtb3ZlX2ZvcndhcmRzKTtcblx0XHRsZXQgbmV4dF9jdXJzb3JfaGVhZCA9IG5ld19oZWFkO1xuXG5cdFx0d2hpbGUgKCFjYXRfZGlmZmVyZW50KHByZXZpb3VzX2NhdCwgY3VycmVudF9jYXQpKSB7XG5cdFx0XHRuZXdfaGVhZCA9IG5leHRfY3Vyc29yX2hlYWQ7XG5cdFx0XHRwcmV2aW91c19jYXQgPSBjdXJyZW50X2NhdDtcblx0XHRcdFtuZXdfaGVhZCwgc3VnZ2VzdGlvbl9yYW5nZV0gPSBjdXJzb3JfYWR2YW5jZV90aHJvdWdoX3N5bnRheChcblx0XHRcdFx0bmV3X2hlYWQsXG5cdFx0XHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0XHRcdHJhbmdlcyxcblx0XHRcdFx0c3VnZ2VzdGlvbl9yYW5nZSxcblx0XHRcdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRcdFx0YnJhY2tldF9vcHRpb25zLFxuXHRcdFx0KTtcblx0XHRcdG5leHRfY3Vyc29yX2hlYWQgPVxuXHRcdFx0XHRmaW5kQmxvY2tpbmdDaGFyKG5ld19oZWFkLCBtb3ZlX2ZvcndhcmRzLCBzdGF0ZSwgY2F0X2lnbm9yZV93cyhwcmV2aW91c19jYXQpLCBwcmV2aW91c19jYXQpWzBdO1xuXHRcdFx0aWYgKG5leHRfY3Vyc29yX2hlYWQgPT09IG5ld19oZWFkKVxuXHRcdFx0XHRicmVhaztcblx0XHRcdHByZXZpb3VzX3JlZ19jaGFyID0gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdFx0XHRcdG5leHRfY3Vyc29yX2hlYWQsXG5cdFx0XHRcdCFtb3ZlX2ZvcndhcmRzLFxuXHRcdFx0XHRyYW5nZXMsXG5cdFx0XHRcdHN1Z2dlc3Rpb25fcmFuZ2UsXG5cdFx0XHRcdG1vdmVtZW50X29wdGlvbnMsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHQpWzBdO1xuXHRcdFx0Y3VycmVudF9jYXQgPSBnZXRDaGFyQ2F0ZWdvcnkocHJldmlvdXNfcmVnX2NoYXIsIHN0YXRlLCBtb3ZlX2ZvcndhcmRzKTtcblx0XHR9XG5cdH1cblxuXHQvLyBQb3N0LXByb2Nlc3Npbmcgc3RlcDogbW92ZSBjdXJzb3IgYmFjayB0byBpbnNpZGUgcmFuZ2UgaWYgbmVjZXNzYXJ5XG5cdGlmIChzdWdnZXN0aW9uX3JhbmdlICYmICEobmV3X2hlYWQgPT09IDAgfHwgbmV3X2hlYWQgPT09IHN0YXRlLmRvYy5sZW5ndGgpKSB7XG5cdFx0Y29uc3QgcmFuZ2VfYmFjayA9IG1vdmVfZm9yd2FyZHMgPyBzdWdnZXN0aW9uX3JhbmdlLnRvIDogc3VnZ2VzdGlvbl9yYW5nZS5mcm9tO1xuXHRcdGNvbnN0IG9mZnNldCA9IG1vdmVfZm9yd2FyZHMgPyAxIDogLTE7XG5cdFx0aWYgKG5ld19oZWFkID09PSByYW5nZV9iYWNrKSB7XG5cdFx0XHRpZiAoYnJhY2tldF9vcHRpb25zW3N1Z2dlc3Rpb25fcmFuZ2UudHlwZV0gPT09IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfSU5TSURFKVxuXHRcdFx0XHRuZXdfaGVhZCA9IHJhbmdlX2JhY2sgLSAzICogb2Zmc2V0O1xuXHRcdH0gZWxzZSBpZiAoc3VnZ2VzdGlvbl9yYW5nZS50b3VjaGVzX2JyYWNrZXQobmV3X2hlYWQsIG1vdmVfZm9yd2FyZHMsIGZhbHNlLCB0cnVlKSkge1xuXHRcdFx0bmV3X2hlYWQgPSBtb3ZlX2ZvcndhcmRzID8gc3VnZ2VzdGlvbl9yYW5nZS5mcm9tIDogc3VnZ2VzdGlvbl9yYW5nZS50bztcblx0XHR9XG5cdH1cblxuXHQvLyBTYW5pdHkgY2hlY2s6IGNsYW1wIGN1cnNvciB0byBkb2N1bWVudCBsZW5ndGhcblx0cmV0dXJuIE1hdGguY2xhbXAobmV3X2hlYWQsIDAsIHN0YXRlLmRvYy5sZW5ndGgpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBvbGRfY3Vyc29yX3JhbmdlIC0gT3JpZ2luYWwgY3Vyc29yIHJhbmdlXG4gKiBAcGFyYW0gbmV3X2N1cnNvcl9yYW5nZSAtIEN1cnNvciByYW5nZSBhZnRlciAqcmVndWxhciogY3Vyc29yIG1vdmVtZW50XG4gKiBAcGFyYW0gcmFuZ2VzIC0gQWxsIHN1Z2dlc3Rpb24gcmFuZ2VzIGluIHRoZSBkb2N1bWVudFxuICogQHBhcmFtIG1vdmVfZm9yd2FyZHMgLSBXaGV0aGVyIHRoZSBjdXJzb3IgbW92ZW1lbnQgaXMgZm9yd2FyZHMgb3IgYmFja3dhcmRzXG4gKiBAcGFyYW0gYnlfd29yZF9ncm91cCAtIFdoZXRoZXIgdG8gbW92ZSBieSB3b3JkIGdyb3VwIChjdHJsL2FsdCArIGFycm93IGtleXMpXG4gKiBAcGFyYW0gaXNfc2VsZWN0aW9uIC0gV2hldGhlciB0byBleHRlbmQgdGhlIHNlbGVjdGlvbiBvZiB0aGUgb3JpZ2luYWwgcmFuZ2VcbiAqIEBwYXJhbSBpc19ibG9ja19jdXJzb3IgLSBXaGV0aGVyIGN1cnNvciBpcyBjb25zaWRlcmVkIGFzIGEgYmxvY2sgY3Vyc29yICh2aW0gbW9kZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIEVkaXRvciBzdGF0ZVxuICogQHBhcmFtIG1vdmVtZW50X29wdGlvbnMgLSBPcHRpb25zIGZvciBjdXJzb3IgbW92ZW1lbnQgdGhyb3VnaCBzdWdnZXN0aW9uIHJhbmdlc1xuICogQHBhcmFtIGJyYWNrZXRfb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGN1cnNvciBtb3ZlbWVudCB0aHJvdWdoIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXJzb3JfbW92ZShcblx0b2xkX2N1cnNvcl9yYW5nZTogRWRpdG9yUmFuZ2UsXG5cdG5ld19jdXJzb3JfcmFuZ2U6IEVkaXRvclJhbmdlLFxuXHRyYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlcyxcblx0bW92ZV9mb3J3YXJkczogYm9vbGVhbixcblx0Ynlfd29yZF9ncm91cDogYm9vbGVhbixcblx0aXNfc2VsZWN0aW9uOiBib29sZWFuLFxuXHRpc19ibG9ja19jdXJzb3IgPSBmYWxzZSxcblx0c3RhdGU6IEVkaXRvclN0YXRlLFxuXHRtb3ZlbWVudF9vcHRpb25zOiBDdXJzb3JPcHRpb25zTWFwLFxuXHRicmFja2V0X29wdGlvbnM6IEJyYWNrZXRPcHRpb25zTWFwLFxuKSB7XG5cdGNvbnN0IGN1cnNvcl9oZWFkID0gYWR2YW5jZV9jdXJzb3JfaGVhZChcblx0XHRvbGRfY3Vyc29yX3JhbmdlLmhlYWQhLFxuXHRcdG5ld19jdXJzb3JfcmFuZ2UuaGVhZCEsXG5cdFx0cmFuZ2VzLFxuXHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0Ynlfd29yZF9ncm91cCxcblx0XHRpc19ibG9ja19jdXJzb3IsXG5cdFx0c3RhdGUsXG5cdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRicmFja2V0X29wdGlvbnMsXG5cdCk7XG5cdGxldCBjdXJzb3JfYW5jaG9yID0gb2xkX2N1cnNvcl9yYW5nZS5hbmNob3IhO1xuXG5cdGlmICghaXNfc2VsZWN0aW9uKVxuXHRcdGN1cnNvcl9hbmNob3IgPSBjdXJzb3JfaGVhZDtcblxuXHRyZXR1cm4geyBzZWxlY3Rpb246IEVkaXRvclNlbGVjdGlvbi5yYW5nZShjdXJzb3JfYW5jaG9yLCBjdXJzb3JfaGVhZCkgfTtcbn1cblxuY29uc3QgZGVmYXVsdF9tb3ZlbWVudF9vcHRpb25zOiBDdXJzb3JPcHRpb25zTWFwID0ge1xuXHRbU3VnZ2VzdGlvblR5cGUuQURESVRJT05dOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0W1N1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OXTogUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5JR05PUkVfTUVUQURBVEEsXG5cdFtTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT05dOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0W1N1Z2dlc3Rpb25UeXBlLkNPTU1FTlRdOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0W1N1Z2dlc3Rpb25UeXBlLkhJR0hMSUdIVF06IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04uSUdOT1JFX01FVEFEQVRBLFxufTtcblxuY29uc3QgYnJhY2tldF9tb3ZlbWVudF9vcHRpb25zOiBCcmFja2V0T3B0aW9uc01hcCA9IHtcblx0W1N1Z2dlc3Rpb25UeXBlLkFERElUSU9OXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFtTdWdnZXN0aW9uVHlwZS5ERUxFVElPTl06IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfSU5TSURFLFxuXHRbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFtTdWdnZXN0aW9uVHlwZS5DT01NRU5UXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBSQU5HRV9CUkFDS0VUX01PVkVNRU5UX09QVElPTi5TVEFZX0lOU0lERSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjdXJzb3JfbW92ZV9yYW5nZTxUIGV4dGVuZHMgRWRpdG9yUmFuZ2U+KFxuXHRjdXJzb3JfcmFuZ2U6IFQsXG5cdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VzLFxuXHRiYWNrd2FyZHNfZGVsZXRlOiBib29sZWFuLFxuXHRncm91cF9kZWxldGU6IGJvb2xlYW4sXG5cdHN0YXRlOiBFZGl0b3JTdGF0ZSxcblx0bW92ZW1lbnRfb3B0aW9uczogQ3Vyc29yT3B0aW9uc01hcCA9IGRlZmF1bHRfbW92ZW1lbnRfb3B0aW9ucyxcblx0YnJhY2tldF9vcHRpb25zOiBCcmFja2V0T3B0aW9uc01hcCA9IGJyYWNrZXRfbW92ZW1lbnRfb3B0aW9ucyxcbik6IFQge1xuXHRpZiAoIWN1cnNvcl9yYW5nZS5zZWxlY3Rpb24pIHtcblx0XHRjb25zdCBjdXJzb3JfYW5jaG9yID0gY3Vyc29yX3JhbmdlLmFuY2hvciE7XG5cdFx0bGV0IGN1cnNvcl9oZWFkID0gYmFja3dhcmRzX2RlbGV0ZSA/IGN1cnNvcl9yYW5nZS5mcm9tIDogY3Vyc29yX3JhbmdlLnRvO1xuXHRcdGN1cnNvcl9oZWFkID0gYWR2YW5jZV9jdXJzb3JfaGVhZChcblx0XHRcdGN1cnNvcl9hbmNob3IsXG5cdFx0XHRjdXJzb3JfaGVhZCxcblx0XHRcdHJhbmdlcyxcblx0XHRcdCFiYWNrd2FyZHNfZGVsZXRlLFxuXHRcdFx0Z3JvdXBfZGVsZXRlLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRzdGF0ZSxcblx0XHRcdG1vdmVtZW50X29wdGlvbnMsXG5cdFx0XHRicmFja2V0X29wdGlvbnMsXG5cdFx0KTtcblx0XHRpZiAoYmFja3dhcmRzX2RlbGV0ZSlcblx0XHRcdGN1cnNvcl9yYW5nZS5mcm9tID0gY3Vyc29yX2hlYWQ7XG5cdFx0ZWxzZVxuXHRcdFx0Y3Vyc29yX3JhbmdlLnRvID0gY3Vyc29yX2hlYWQ7XG5cdH1cblx0cmV0dXJuIGN1cnNvcl9yYW5nZTtcbn1cbiIsICJpbXBvcnQgeyBDTV9BbGxfQnJhY2tldHMsIHR5cGUgTWV0YWRhdGFGaWVsZHMsIFN1Z2dlc3Rpb25UeXBlIH0gZnJvbSBcIi4uL3Jhbmdlc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGVfbWV0YWRhdGEgfSBmcm9tIFwiLi9tZXRhZGF0YVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0X3N1Z2dlc3Rpb24oXG5cdGluc2VydGVkOiBzdHJpbmcsXG5cdGRlbGV0ZWQ6IHN0cmluZyxcblx0bWV0YWRhdGFfZmllbGRzPzogTWV0YWRhdGFGaWVsZHMsXG5cdHN0YXJ0X29mZnNldCA9IDAsXG5cdGVuZF9vZmZzZXQgPSAwLFxuKSB7XG5cdHJldHVybiBjb25zdHJ1Y3RfcmFuZ2UoXG5cdFx0aW5zZXJ0ZWQsXG5cdFx0ZGVsZXRlZCxcblx0XHRpbnNlcnRlZCAmJiBkZWxldGVkID9cblx0XHRcdFN1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTiA6XG5cdFx0XHQoaW5zZXJ0ZWQgPyBTdWdnZXN0aW9uVHlwZS5BRERJVElPTiA6IFN1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OKSxcblx0XHRtZXRhZGF0YV9maWVsZHMsXG5cdFx0c3RhcnRfb2Zmc2V0LFxuXHRcdGVuZF9vZmZzZXQsXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3RfcmFuZ2UoXG5cdGluc2VydGVkOiBzdHJpbmcsXG5cdGRlbGV0ZWQ6IHN0cmluZyxcblx0dHlwZTogU3VnZ2VzdGlvblR5cGUsXG5cdG1ldGFkYXRhX2ZpZWxkcz86IE1ldGFkYXRhRmllbGRzLFxuXHRzdGFydF9vZmZzZXQgPSAwLFxuXHRlbmRfb2Zmc2V0ID0gMCxcbikge1xuXHRpZiAoIXR5cGUpXG5cdFx0cmV0dXJuIHsgaW5zZXJ0OiBkZWxldGVkICsgaW5zZXJ0ZWQsIHN0YXJ0X29mZnNldCwgZW5kX29mZnNldCB9O1xuXG5cdGNvbnN0IGJyYWNrZXRzID0gQ01fQWxsX0JyYWNrZXRzW3R5cGVdO1xuXHRjb25zdCBtZXRhZGF0YSA9IG1ldGFkYXRhX2ZpZWxkcyAmJiBPYmplY3Qua2V5cyhtZXRhZGF0YV9maWVsZHMpLmxlbmd0aCA/XG5cdFx0SlNPTi5zdHJpbmdpZnkobWV0YWRhdGFfZmllbGRzKSArIFwiQEBcIiA6XG5cdFx0XCJcIjtcblx0Y29uc3Qgb3V0cHV0ID0gYnJhY2tldHNbMF0gKyBtZXRhZGF0YSArXG5cdFx0KHR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTiA/XG5cdFx0XHRkZWxldGVkICsgYnJhY2tldHNbMV0gKyBpbnNlcnRlZCArIGJyYWNrZXRzWzJdIDpcblx0XHRcdGRlbGV0ZWQgKyBpbnNlcnRlZCArIGJyYWNrZXRzWzFdKTtcblx0Y29uc3QgaW5pdGlhbF9vZmZzZXQgPSBicmFja2V0c1swXS5sZW5ndGggKyBtZXRhZGF0YS5sZW5ndGg7XG5cdHN0YXJ0X29mZnNldCArPSBpbml0aWFsX29mZnNldDtcblx0Ly8gRklYTUU6IGVuZCBtYXkgbm90IGJlIG9mZnNldCBpZiB0aGUgYnJhY2tldCBhcHBlYXJzIGFmdGVyIHRoZSBlbmRcblx0ZW5kX29mZnNldCArPSB0eXBlID09PSBTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT04gPyBicmFja2V0c1sxXS5sZW5ndGggOiAwO1xuXG5cdHJldHVybiB7IGluc2VydDogb3V0cHV0LCBzdGFydF9vZmZzZXQsIGVuZF9vZmZzZXQgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZV9zdWdnZXN0aW9uKGluc2VydGVkOiBzdHJpbmcsIGRlbGV0ZWQ6IHN0cmluZyA9IFwiXCIpIHtcblx0cmV0dXJuIGNvbnN0cnVjdF9zdWdnZXN0aW9uKGluc2VydGVkLCBkZWxldGVkLCBnZW5lcmF0ZV9tZXRhZGF0YSgpKS5pbnNlcnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVfcmFuZ2UodHlwZTogU3VnZ2VzdGlvblR5cGUsIGluc2VydGVkOiBzdHJpbmcsIGRlbGV0ZWQ6IHN0cmluZyA9IFwiXCIpIHtcblx0cmV0dXJuIGNvbnN0cnVjdF9yYW5nZShpbnNlcnRlZCwgZGVsZXRlZCwgdHlwZSwgZ2VuZXJhdGVfbWV0YWRhdGEoKSkuaW5zZXJ0O1xufVxuIiwgIi8qKlxuICogVGhpcyBndXR0ZXIgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBvbmUgZGVmaW5lZCBpbiBAY29kZW1pcnJvci92aWV3L2d1dHRlclxuICogVGhlIG1haW4gY2hhbmdlcyBhcmU6XG4gKiAgMS4gR3V0dGVyIGlzIGluc2VydGVkIG5leHQgdG8gdGhlIGNvbnRlbnRET00gKGluc3RlYWQgb2YgYmVmb3JlKVxuICogIDIuIEhlaWdodCBvZiBndXR0ZXJFbGVtZW50IGlzIG5vdCBzcGVjaWZpZWRcbiAqICAzLiBHdXR0ZXJFbGVtZW50IGNhbiBiZSBvZiBhcmJpdHJhcnkgaGVpZ2h0XG4gKiAgNC4gQWRkZWQgYW5ub3RhdGlvbiBsaXN0ZW5lcnMgZm9yIGZvY3VzaW5nIEd1dHRlck1hcmtlcnNcbiAqICA1LiBHdXR0ZXIgKmNhbiogYmUgemVyby13aWR0aCBpZiB0aGVyZSBhcmUgbm8gbWFya2VycyBpbiB0aGUgZG9jdW1lbnRcbiAqL1xuaW1wb3J0IHtBbm5vdGF0aW9uLCB0eXBlIEV4dGVuc2lvbiwgRmFjZXR9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHsgQmxvY2tJbmZvLCBFZGl0b3JWaWV3LCBHdXR0ZXJNYXJrZXIsIFZpZXdVcGRhdGUgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuXG5pbXBvcnQgeyBkZWJvdW5jZSwgZWRpdG9ySW5mb0ZpZWxkLCBzZXRJY29uIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQge1xuXHRjcmVhdGVHdXR0ZXIsXG5cdGNyZWF0ZUd1dHRlclZpZXdQbHVnaW4sXG5cdHR5cGUgR3V0dGVyQ29uZmlnLFxuXHRHdXR0ZXJFbGVtZW50LFxuXHRHdXR0ZXJWaWV3LFxuXHRzYW1lTWFya2Vycyxcblx0U2luZ2xlR3V0dGVyVmlldyxcblx0VXBkYXRlQ29udGV4dCxcbn0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IGFubm90YXRpb25HdXR0ZXJNYXJrZXJzLCBBbm5vdGF0aW9uTWFya2VyIH0gZnJvbSBcIi4vbWFya2VyXCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uR3V0dGVyQ29tcGFydG1lbnQgfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgbWFya3VwRm9jdXNFZmZlY3QgfSBmcm9tIFwiLi4vLi4vbGl2ZS1wcmV2aWV3XCI7XG5cbmNvbnN0IEZPTERfQlVUVE9OX09GRlNFVCA9IDYwO1xuXG5jb25zdCB1bmZpeEd1dHRlcnMgPSBGYWNldC5kZWZpbmU8Ym9vbGVhbiwgYm9vbGVhbj4oe1xuXHRjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KSxcbn0pO1xuXG5jb25zdCBhY3RpdmVHdXR0ZXJzID0gRmFjZXQuZGVmaW5lPFJlcXVpcmVkPEFubm90YXRpb25HdXR0ZXJDb25maWc+PigpO1xuXG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckZvY3VzQW5ub3RhdGlvbiA9IEFubm90YXRpb24uZGVmaW5lPHsgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCBpbmRleD86IG51bWJlciwgc2Nyb2xsPzogYm9vbGVhbiB9PigpO1xuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJGb2xkQW5ub3RhdGlvbiA9IEFubm90YXRpb24uZGVmaW5lPGJvb2xlYW4gfCBudWxsPigpO1xuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJGb2N1c1RocmVhZEFubm90YXRpb24gPSBBbm5vdGF0aW9uLmRlZmluZTx7IG1hcmtlcjogQW5ub3RhdGlvbk1hcmtlciwgaW5kZXg6IG51bWJlciwgc2Nyb2xsPzogYm9vbGVhbiwgZm9jdXNfbWFya3VwPzogYm9vbGVhbiB9PigpO1xuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJXaWR0aEFubm90YXRpb24gPSBBbm5vdGF0aW9uLmRlZmluZTxudW1iZXI+KCk7XG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckhpZGVFbXB0eUFubm90YXRpb24gPSBBbm5vdGF0aW9uLmRlZmluZTxib29sZWFuPigpO1xuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJGb2xkQnV0dG9uQW5ub3RhdGlvbiA9IEFubm90YXRpb24uZGVmaW5lPGJvb2xlYW4+KCk7XG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlclJlc2l6ZUhhbmRsZUFubm90YXRpb24gPSBBbm5vdGF0aW9uLmRlZmluZTxib29sZWFuPigpO1xuXG5leHBvcnQgY2xhc3MgQW5ub3RhdGlvbkd1dHRlclZpZXcgZXh0ZW5kcyBHdXR0ZXJWaWV3IHtcblx0ZGVjbGFyZSBndXR0ZXJzOiBBbm5vdGF0aW9uU2luZ2xlR3V0dGVyVmlld1tdO1xuXG5cdHByZXZpb3VzbHlfZm9jdXNlZDogQW5ub3RhdGlvbk1hcmtlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuXHRjb25zdHJ1Y3Rvcih2aWV3OiBFZGl0b3JWaWV3KSB7XG5cdFx0c3VwZXIodmlldywgdW5maXhHdXR0ZXJzLCBhY3RpdmVHdXR0ZXJzKTtcblx0XHQvLyBGSVhNRTogdGhpcyBzdGlsbCBjYXVzZXMgYSBsYXlvdXQgc2hpZnRcblx0XHRpZiAoIXZpZXcuZG9tLnBhcmVudEVsZW1lbnQhLmNsYXNzTGlzdC5jb250YWlucyhcIm1hcmtkb3duLXNvdXJjZS12aWV3XCIpKSB7XG5cdFx0XHQvLyBQcmV2ZW50IGd1dHRlciBmcm9tIGFwcGVhcmluZyBmb3IgYSBicmllZiBzZWNvbmQgKHVudGlsIHNldEltbWVkaWF0ZSBraWNrcyBpbilcblx0XHRcdHRoaXMuZG9tLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHQvLyBDb2RlbWlycm9yIGRvZXNuJ3QgYWxsb3cgc3RhdGUgY2hhbmdlcyBkdXJpbmcgdXBkYXRlcywgc28gcmVjb25maWd1cmF0aW9uIG5lZWRzIHRvIGJlIGRlbGF5ZWRcblx0XHRcdHNldEltbWVkaWF0ZSgoKSA9PiB7XG5cdFx0XHRcdHZpZXcuZGlzcGF0Y2godmlldy5zdGF0ZS51cGRhdGUoe1xuXHRcdFx0XHRcdGVmZmVjdHM6IFtcblx0XHRcdFx0XHRcdGFubm90YXRpb25HdXR0ZXJDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShbXSlcblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0pKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8vIEVYUEw6IFdoZW4gbW92aW5nIGEgc2VsZWN0aW9uIGluc2lkZSB0aGUgZWRpdG9yLCBtdWx0aXBsZSBtb3ZlR3V0dGVyIGNhbGxzIGFyZSB0cmlnZ2VyZWQsXG5cdC8vICAgICAgIGNhdXNpbmcgd29ua3luZXNzIGFuZCBldmVyIGdyZWF0ZXIgdXAvZG93bndhcmRzIG1vdmVtZW50XG5cdGRlYm91bmNlZE1vdmVHdXR0ZXIgPSBkZWJvdW5jZSh0aGlzLm1vdmVHdXR0ZXIuYmluZCh0aGlzKSwgMjAwKTtcblxuXHRjcmVhdGVHdXR0ZXJzKHZpZXc6IEVkaXRvclZpZXcpIHtcblx0XHRyZXR1cm4gdmlldy5zdGF0ZS5mYWNldChhY3RpdmVHdXR0ZXJzKS5tYXAoY29uZiA9PiBuZXcgQW5ub3RhdGlvblNpbmdsZUd1dHRlclZpZXcodmlldywgY29uZiwgdGhpcy5kb20pKTtcblx0fVxuXG5cdGluc2VydEd1dHRlcnModmlldzogRWRpdG9yVmlldykge1xuXHRcdHZpZXcuY29udGVudERPTS5wYXJlbnROb2RlIS5pbnNlcnRCZWZvcmUodGhpcy5kb20sIHZpZXcuY29udGVudERPTS5uZXh0U2libGluZyk7XG5cdH1cblxuXHRpbnNlcnREZXRhY2hlZEd1dHRlcnMoYWZ0ZXI6IEhUTUxFbGVtZW50KSB7XG5cdFx0dGhpcy52aWV3LmNvbnRlbnRET00ucGFyZW50Tm9kZSEuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLCB0aGlzLnZpZXcuY29udGVudERPTS5uZXh0U2libGluZyk7XG5cdH1cblxuXHRnZXRVcGRhdGVDb250ZXh0cygpOiBVcGRhdGVDb250ZXh0W10ge1xuXHRcdHJldHVybiAodGhpcy5ndXR0ZXJzIGFzIEFubm90YXRpb25TaW5nbGVHdXR0ZXJWaWV3W10pLm1hcChndXR0ZXIgPT5cblx0XHRcdG5ldyBBbm5vdGF0aW9uVXBkYXRlQ29udGV4dChndXR0ZXIsIHRoaXMudmlldy52aWV3cG9ydCwgLXRoaXMudmlldy5kb2N1bWVudFBhZGRpbmcudG9wKVxuXHRcdCk7XG5cdH1cblxuXHR1cGRhdGUodXBkYXRlOiBWaWV3VXBkYXRlKSB7XG5cdFx0Zm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiB1cGRhdGUudHJhbnNhY3Rpb25zKSB7XG5cdFx0XHRjb25zdCB0aHJlYWRfZm9jdXMgPSB0cmFuc2FjdGlvbi5hbm5vdGF0aW9uKGFubm90YXRpb25HdXR0ZXJGb2N1c1RocmVhZEFubm90YXRpb24pO1xuXHRcdFx0aWYgKHRocmVhZF9mb2N1cykge1xuXHRcdFx0XHRjb25zdCB7IG1hcmtlciwgaW5kZXgsIHNjcm9sbCA9IGZhbHNlLCBmb2N1c19tYXJrdXAgPSBmYWxzZSB9ID0gdGhyZWFkX2ZvY3VzO1xuXHRcdFx0XHR0aGlzLnVuZm9jdXNBbm5vdGF0aW9uKCk7XG5cdFx0XHRcdHRoaXMuZm9jdXNBbm5vdGF0aW9uKG1hcmtlciwgaW5kZXgsIHNjcm9sbCwgZm9jdXNfbWFya3VwKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0c3VwZXIudXBkYXRlKHVwZGF0ZSk7XG5cdH1cblxuXHR1bmZvY3VzQW5ub3RhdGlvbigpIHtcblx0XHR0aGlzLnByZXZpb3VzbHlfZm9jdXNlZD8udW5mb2N1c19hbm5vdGF0aW9uKCk7XG5cdFx0dGhpcy5wcmV2aW91c2x5X2ZvY3VzZWQgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRmb2N1c0Fubm90YXRpb24obWFya2VyOiBBbm5vdGF0aW9uTWFya2VyLCBpbmRleDogbnVtYmVyLCBzY3JvbGw6IGJvb2xlYW4gPSBmYWxzZSwgZm9jdXNfbWFya3VwID0gZmFsc2UpIHtcblx0XHR0aGlzLnByZXZpb3VzbHlfZm9jdXNlZCA9IG1hcmtlcjtcblx0XHR0aGlzLmRlYm91bmNlZE1vdmVHdXR0ZXIobWFya2VyKTtcblx0XHRtYXJrZXIuZm9jdXNfYW5ub3RhdGlvbihpbmRleCwgc2Nyb2xsKTtcblxuXHRcdGlmIChmb2N1c19tYXJrdXApIHtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnZpZXcuZGlzcGF0Y2goXG5cdFx0XHRcdFx0dGhpcy52aWV3LnN0YXRlLnVwZGF0ZSh7XG5cdFx0XHRcdFx0XHRlZmZlY3RzOiBbXG5cdFx0XHRcdFx0XHRcdG1hcmt1cEZvY3VzRWZmZWN0Lm9mKHtcblx0XHRcdFx0XHRcdFx0XHRmcm9tOiBtYXJrZXIuYW5ub3RhdGlvbi5mcm9tLFxuXHRcdFx0XHRcdFx0XHRcdHRvOiBtYXJrZXIuYW5ub3RhdGlvbi5mdWxsX3JhbmdlX2JhY2tcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0dXBkYXRlR3V0dGVycyh1cGRhdGU6IFZpZXdVcGRhdGUpOiBib29sZWFuIHtcblx0XHQvLyBFWFBMOiBDaGVjayBhbGwgdHJhbnNhY3Rpb25zLCBmaWd1cmUgb3V0IGlmIHRoZXkgaGF2ZSBiZWVuIGFubm90YXRlZCB3aXRoIGEgZm9jdXMgc2hpZnQgYW5ub3RhdGlvblxuXHRcdC8vIFRPRE86IElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBjaGVjayB0aGUgYW5ub3RhdGlvbnMgb2YgYSBWaWV3VXBkYXRlP1xuXHRcdGNvbnN0IGFubm90YXRpb24gPSB1cGRhdGUudHJhbnNhY3Rpb25zLmZsYXRNYXAodHIgPT4gdHIuYW5ub3RhdGlvbihhbm5vdGF0aW9uR3V0dGVyRm9jdXNBbm5vdGF0aW9uKSkuZmluZChlID0+IGUpO1xuXHRcdGlmIChhbm5vdGF0aW9uIHx8IHVwZGF0ZS5zdGFydFN0YXRlLnNlbGVjdGlvbiAhPT0gdXBkYXRlLnN0YXRlLnNlbGVjdGlvbikge1xuXHRcdFx0dGhpcy51bmZvY3VzQW5ub3RhdGlvbigpO1xuXHRcdH1cblxuXHRcdGlmIChhbm5vdGF0aW9uKSB7XG5cdFx0XHRjb25zdCB7IGZyb20sIHRvLCBpbmRleCA9IC0xLCBzY3JvbGwgPSBmYWxzZSB9ID0gYW5ub3RhdGlvbjtcblxuXHRcdFx0Ly8gRVhQTDogRmluZCBhIEd1dHRlckVsZW1lbnQgYW5kIHRoZW4gR3V0dGVyTWFya2VyIHRoYXQgY29udGFpbnMgdGhlIGN1cnNvclxuXHRcdFx0Ly8gTk9URTogSW4gYSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgY29kZSwgQW5ub3RhdGlvbkd1dHRlckVsZW1lbnQncyBgYmxvY2sudG9gIHdhcyB1c2VkXG5cdFx0XHQvLyAgICAgICBpbiBvcmRlciB0byBmaW5kIHRoZSBHdXR0ZXJNYXJrZXIgdGhhdCBjb250YWlucyB0aGUgY3Vyc29yLCBob3dldmVyLFxuXHRcdFx0Ly8gICAgICAgdGhlIGJsb2NrIG9ubHkgcmVwcmVzZW50cyB0aGUgc3RhcnRpbmcgbGluZSBvZiB0aGUgR3V0dGVyRWxlbWVudCwgYW5kIGRvZXMgbm90IHdvcmtcblx0XHRcdC8vICAgICAgIGZvciBtYXJrZXJzIHRoYXQgc3BhbiBtdWx0aXBsZSBsaW5lc1xuXHRcdFx0Ly8gVE9ETzogSW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhpcyBjb2RlLCBJIGFtIG5vdCBhIGJpZyBmYW4gb2YgbGluZWFybHkgc2VhcmNoaW5nIGxpa2UgdGhpc1xuXHRcdFx0Ly8gTk9URTogRGlkIHlvdSBrbm93IHlvdSBjYW4gbGFiZWwgbG9vcHM/IEkgZGlkbid0LiBOZWF0IGh1aD9cblx0XHRcdG91dGVyX2xvb3A6XG5cdFx0XHRmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5ndXR0ZXJzWzBdLmVsZW1lbnRzIGFzIEFubm90YXRpb25HdXR0ZXJFbGVtZW50W10pIHtcblx0XHRcdFx0aWYgKGZyb20gPj0gZWxlbWVudC5ibG9jayEuZnJvbSkge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgbWFya2VyIG9mIGVsZW1lbnQubWFya2VycyBhcyBBbm5vdGF0aW9uTWFya2VyW10pIHtcblx0XHRcdFx0XHRcdGlmIChmcm9tID49IG1hcmtlci5hbm5vdGF0aW9uLmZyb20gJiYgdG8gPD0gbWFya2VyLmFubm90YXRpb24uZnVsbF9yYW5nZV9iYWNrKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZm9jdXNBbm5vdGF0aW9uKG1hcmtlciwgaW5kZXgsIHNjcm9sbCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrIG91dGVyX2xvb3A7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGZyb20gPCBlbGVtZW50LmJsb2NrIS5mcm9tKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gc3VwZXIudXBkYXRlR3V0dGVycyh1cGRhdGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1vdmVzIHRoZSBpbml0aWFsIEd1dHRlckVsZW1lbnQgb2YgdGhlIGd1dHRlciB1cCBvciBkb3duIHRvIGFsaWduIHByb3ZpZGVkIG1hcmtlciB3aXRoIGl0cyBibG9ja1xuXHQgKiBAcGFyYW0gbWFya2VyIC0gTWFya2VyIHRvIGFsaWduIHRoZSBndXR0ZXIgYnlcblx0ICovXG5cdHB1YmxpYyBtb3ZlR3V0dGVyKG1hcmtlcjogR3V0dGVyTWFya2VyKSB7XG5cdFx0Ly8gV2Ugb25seSBuZWVkIHRvIGNvbnNpZGVyIG9uZSBndXR0ZXIgZm9yIHRoZSBhbm5vdGF0aW9ucyBndXR0ZXJcblx0XHRjb25zdCBhY3RpdmVHdXR0ZXIgPSB0aGlzLmd1dHRlcnNbMF07XG5cblx0XHQvLyBHaXZlbiB0aGUgbWFya2VyLCBmZXRjaCB0aGUgZ3V0dGVyRWxlbWVudCBpdCBiZWxvbmdzIHRvXG5cdFx0Y29uc3QgZWxlbWVudCA9IGFjdGl2ZUd1dHRlci5lbGVtZW50cy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5tYXJrZXJzLmluY2x1ZGVzKG1hcmtlcikpIGFzIEFubm90YXRpb25HdXR0ZXJFbGVtZW50IHwgdW5kZWZpbmVkO1xuXHRcdGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgbWFya2VySW5kZXggPSBlbGVtZW50Lm1hcmtlcnMuaW5kZXhPZihtYXJrZXIpO1xuXG5cdFx0IC8vIFdoZXJlIHRoZSBndXR0ZXIgZWxlbWVudCBzaG91bGQgYmUgbG9jYXRlZCAoaS5lLiBmbHVzaCB3aXRoIHRoZSB0b3Agb2YgdGhlIGJsb2NrKVxuXHRcdGNvbnN0IGRlc2lyZWRMb2NhdGlvbiA9IGVsZW1lbnQuYmxvY2shLnRvcDtcblx0XHQgLy8gV2hlcmUgdGhlIGd1dHRlciBlbGVtZW50IGlzIGN1cnJlbnRseSBsb2NhdGVkIChwb3NzaWJseSBwdXNoZWQgZG93biBieSBvdGhlciBndXR0ZXIgZWxlbWVudHMpXG5cdFx0Ly8gRklYTUU6IG9mZnNldFRvcCBub3QgZGVmaW5lZCBlcnJvciAocmVwcjogd2hlbiBpbnRlcmFjdGluZyBpbiBwaGFudG9tIGNvbW1lbnQgbm90ZSlcblx0XHRjb25zdCBjdXJyZW50TG9jYXRpb24gPSAoZWxlbWVudC5kb20uY2hpbGRyZW5bbWFya2VySW5kZXhdIGFzIEhUTUxFbGVtZW50KS5vZmZzZXRUb3A7XG5cblx0XHQvLyBEZXRlcm1pbmUgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBjdXJyZW50IGxvY2F0aW9uIGFuZCB0aGUgZGVzaXJlZCBsb2NhdGlvblxuXHRcdGxldCBvZmZzZXQgPSBkZXNpcmVkTG9jYXRpb24gLSBjdXJyZW50TG9jYXRpb247XG5cblx0XHQvLyBFWFBMOiBJdCBpcyBwcmVmZXJyZWQgbm90IHRvIG1ha2UgbWljcm8tYWRqdXN0bWVudHNcblx0XHRpZiAoTWF0aC5hYnMob2Zmc2V0KSA+PSAxMCAmJiBvZmZzZXQpIHtcblx0XHRcdGNvbnN0IGVsZW1lbnQgPSBhY3RpdmVHdXR0ZXIuZWxlbWVudHNbMF07XG5cdFx0XHRlbGVtZW50LmRvbS5zdHlsZS5tYXJnaW5Ub3AgPSBwYXJzZUludChlbGVtZW50LmRvbS5zdHlsZS5tYXJnaW5Ub3AgfHwgXCIwXCIpICsgb2Zmc2V0ICsgXCJweFwiO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmb2xkR3V0dGVyKCkge1xuXHRcdCh0aGlzLmd1dHRlcnNbMF0gYXMgQW5ub3RhdGlvblNpbmdsZUd1dHRlclZpZXcpLmZvbGRHdXR0ZXIoKTtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlclZpZXcgPSBjcmVhdGVHdXR0ZXJWaWV3UGx1Z2luKEFubm90YXRpb25HdXR0ZXJWaWV3KTtcblxuZXhwb3J0IGludGVyZmFjZSBBbm5vdGF0aW9uR3V0dGVyQ29uZmlnIGV4dGVuZHMgR3V0dGVyQ29uZmlnIHtcblx0LyoqXG5cdCAqIFdoZXRoZXIgdGhlIGd1dHRlciBzaG91bGQgYmUgZm9sZGVkIGJ5IGRlZmF1bHRcblx0ICovXG5cdGZvbGRTdGF0ZTogYm9vbGVhbjtcblxuXHQvKipcblx0ICogVGhlIHdpZHRoIG9mIHRoZSBndXR0ZXIgaW4gcGl4ZWxzXG5cdCAqL1xuXHR3aWR0aDogbnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBXaGV0aGVyIHRoZSBndXR0ZXIgc2hvdWxkIGJlIGhpZGRlbiB3aGVuIGVtcHR5XG5cdCAqL1xuXHRoaWRlT25FbXB0eTogYm9vbGVhbjtcblxuXHQvKipcblx0ICogV2hldGhlciB0aGUgZ3V0dGVyIHNob3VsZCBpbmNsdWRlIGEgZm9sZCBidXR0b25cblx0ICovXG5cdGluY2x1ZGVGb2xkQnV0dG9uOiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBXaGV0aGVyIHRoZSBndXR0ZXIgc2hvdWxkIGluY2x1ZGUgYSByZXNpemUgaGFuZGxlXG5cdCAqL1xuXHRpbmNsdWRlUmVzaXplSGFuZGxlOiBib29sZWFuO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdGF0aW9uX2d1dHRlcihjb25maWc6IEFubm90YXRpb25HdXR0ZXJDb25maWcpOiBFeHRlbnNpb24ge1xuXHRyZXR1cm4gY3JlYXRlR3V0dGVyKGFubm90YXRpb25HdXR0ZXJWaWV3LCBjb25maWcsIGFjdGl2ZUd1dHRlcnMsIHVuZml4R3V0dGVycyk7XG59XG5cbmNsYXNzIEFubm90YXRpb25VcGRhdGVDb250ZXh0IGV4dGVuZHMgVXBkYXRlQ29udGV4dCB7XG5cdC8qKlxuXHQgKiBEZXNjcmliZXMgdGhlIHktcG9zaXRpb24gb2YgdGhlIGJvdHRvbSBvZiB0aGUgcHJldmlvdXMgZ3V0dGVyIGVsZW1lbnRcblx0ICovXG5cdHByZXZpb3VzX2VsZW1lbnRfZW5kOiBudW1iZXIgPSAwO1xuXHRuZXdfZ3V0dGVyX2VsZW1lbnRzOiBBbm5vdGF0aW9uR3V0dGVyRWxlbWVudFtdID0gW107XG5cdGFkZGVkX2VsZW1lbnRzOiBBbm5vdGF0aW9uR3V0dGVyRWxlbWVudFtdID0gW107XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cmVhZG9ubHkgZ3V0dGVyOiBBbm5vdGF0aW9uU2luZ2xlR3V0dGVyVmlldyxcblx0XHR2aWV3cG9ydDogeyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfSxcblx0XHRwdWJsaWMgaGVpZ2h0OiBudW1iZXIsXG5cdCkge1xuXHRcdHN1cGVyKGd1dHRlciwgdmlld3BvcnQsIGhlaWdodCk7XG5cdFx0dGhpcy5wcmV2aW91c19lbGVtZW50X2VuZCA9IGhlaWdodDtcblx0fVxuXG5cdGFzeW5jIGFkZEVsZW1lbnQodmlldzogRWRpdG9yVmlldywgYmxvY2s6IEJsb2NrSW5mbywgbWFya2VyczogcmVhZG9ubHkgR3V0dGVyTWFya2VyW10pIHtcblx0XHQvKipcblx0XHQgKiBEZXNjcmliZXMgdGhlIGFtb3VudCBvZiBzcGFjZSBiZXR3ZWVuIHRoZSBwcmV2aW91cyBndXR0ZXIgZWxlbWVudCBhbmQgdGhlIHktcG9zdGlvbiBmb3IgdGhlIG9uZSB0aGF0IHdpbGwgYmUgY29uc3RydWN0ZWQgZm9yIHRoZSBjdXJyZW50IGJsb2NrXG5cdFx0ICogQHJlbWFyayBUaGlzIHByZXZlbnRzIHRoZSBvdmVybGFwIG9mIHRoZSBndXR0ZXIgZWxlbWVudHNcblx0XHQgKi9cblx0XHRjb25zdCBhYm92ZSA9IE1hdGgubWF4KGJsb2NrLnRvcCAtIHRoaXMucHJldmlvdXNfZWxlbWVudF9lbmQsIDApO1xuXHRcdC8qKlxuXHRcdCAqIElmZiB0aGVyZSBpcyBvdmVybGFwIHdpdGggdGhlIHByZXZpb3VzIGJsb2NrIChpLmUuIHRoZSB0b3Agb2YgdGhlIGJsb2NrIGlzIGxvd2VyIHRoYW4gdGhlIGJvdHRvbSBvZiB0aGUgcHJldmlvdXMgZ3V0dGVyIGVsZW1lbnQpLFxuXHRcdCAqIHRoZW4gcGxhY2UgdGhlIGd1dHRlciBlbGVtZW50IGF0IHRoZSBib3R0b20gb2YgdGhlIHByZXZpb3VzIGd1dHRlciBlbGVtZW50IChhYm92ZSA9IDApXG5cdFx0ICovXG5cdFx0Y29uc3QgYmxvY2tfc3RhcnQgPSBhYm92ZSA8PSAwID8gdGhpcy5wcmV2aW91c19lbGVtZW50X2VuZCA6IGJsb2NrLnRvcDtcblxuXHRcdC8qKlxuXHRcdCAqIFNPTFVUSU9OOiBlbnN1cmVzIG9yZGVyaW5nIG9mIG1hcmtlcnMgb2Ygc2FtZSBibG9jayAoYml0IGluZWZmaWNpZW50IGJ1dCB2ZXJ5IGVhc3kgc29sdXRpb24pXG5cdFx0ICogV29ya3MgYnkgc29ydGluZyB0aGUgbWFya2VycyBpbi1wbGFjZVxuXHRcdCAqIEB0b2RvIEludmVzdGlnYXRlIHdoZXRoZXIgdGhlIG1hcmtlcnMgY2FuIGJlIHNvcnRlZCBlYXJsaWVyIGluIHRoZSBwaXBlbGluZVxuXHRcdCAqL1xuXHRcdC8vIEZJWE1FOiBNYXJrZXIgd2l0aG91dCBjb21tZW50X3JhbmdlIGlzc3VlXG5cdFx0Ly8gTk9URTogVGhpcyBtYXkgYmUgYWRkcmVzc2VzIGJ5IHVzaW5nIHRoZSBzdGFydFNpZGUgYmlhcyBpbiBndXR0ZXJNYXJrZXIgKHdhcm5pbmc6IHVwZGF0ZSBjb25jZXJuKVxuXHRcdChtYXJrZXJzIGFzIHVua25vd24gYXMgQW5ub3RhdGlvbk1hcmtlcltdKVxuXHRcdFx0LnNvcnQoKGEsIGIpID0+IGEuYW5ub3RhdGlvbi5mcm9tIC0gYi5hbm5vdGF0aW9uLmZyb20pO1xuXG5cdFx0Y29uc3QgVU5LTk9XTl9IRUlHSFQgPSAzNjtcblxuXHRcdC8qKlxuXHRcdCAqIENvbXBsZXRlIGhlaWdodCBvZiB0aGUgR3V0dGVyRWxlbWVudCwgaW5jbHVkaW5nIEJPVFRPTSBtYXJnaW4gKGkuZS4gc3BhY2luZyBiZXR3ZWVuIGd1dHRlciBlbGVtZW50cylcblx0XHQgKiBAcmVtYXJrIFRoZSByZWFzb24gKndoeSogdGhpcyBpcyBhbiBhYnNvbHV0ZWx5IGVzc2VudGlhbCB2YWx1ZSwgaXMgdGhhdCBpdCBlbnN1cmVzIHRoYXQgbm8gZWxlbWVudHMgY2FuIG92ZXJsYXAsXG5cdFx0ICogICAgIGlmIGVzdGltYXRlZCBoZWlnaHQgaXMgbG93ZXIgdGhhbiBhY3R1YWwgaGVpZ2h0LCB0aGVuIEd1dHRlckVsZW1lbnRzIG9mIHR3byBibG9ja3MgcmlzayBvdmVybGFwcGluZ1xuXHRcdCAqICAgICBpZiBlc3RpbWF0ZWQgaGVpZ2h0IGlzIGhpZ2hlciB0aGFuIGFjdHVhbCBoZWlnaHQsIHRoZW4gR3V0dGVyRWxlbWVudHMgd2lsbCBoYXZlIGFuIHVubmVjZXNzYXJpbHkgbGFyZ2UgZ2FwIGJldHdlZW4gdGhlbVxuXHRcdCAqICAgaG93ZXZlciwgd2UgY2Fubm90IGRpcmVjdGx5IGdyYWIgdGhlIGhlaWdodCBvZiB0aGUgZWxlbWVudCwgYXMgaXQgaXMgbm90IHlldCByZW5kZXJlZCwgc28gd2UgbmVlZCB0byBlaXRoZXI6XG5cdFx0ICogICBcdDEuIEVzdGltYXRlIHRoZSBoZWlnaHQgb2YgdGhlIGVsZW1lbnQgKGNsdW5reSwgYW5kIGVycm9yLXByb25lIHdpdGggZGlmZmVyZW50IHN0eWxlcylcblx0XHQgKiAgIFx0Mi4gV2FpdCB0aWxsIGVsZW1lbnQgaXMgcmVuZGVyZWQsIGdyYWIgaGVpZ2h0IGZyb20gcmVuZGVyZWQgZWxlbWVudFxuXHRcdCAqIEByZW1hcmsgQ3VycmVudCBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBDb2RlTWlycm9yIGRvZXMgYSBzZWNvbmQgcGFzcyB0aHJvdWdoIGFsbCBvZiB0aGUgZWxlbWVudHMsXG5cdFx0ICogICAgIGF0IHdoaWNoIHBvaW50IHRoZSBoZWlnaHQgb2YgdGhlIGd1dHRlciBlbGVtZW50IGlzIGtub3duIGR1ZSB0byB0aGUgRE9NIGJlaW5nIHJlbmRlcmVkXG5cdFx0ICogICAgIHdoZW4gU3luY0d1dHRlciBpcyBjYWxsZWQsIHRoZSBoZWlnaHQgaXMgYWdhaW4gcmVzZXQgdG8gMCwgd2hpY2ggY2F1c2VzIGRlc3luYyBpc3N1ZXMgYW5kIGFkZGl0aW9uYWwgZ3V0dGVyIG1vdmVtZW50XG5cdFx0ICogQHdhcm5pbmcgVGhpcyBpcyBUSEUgb25seSBwYXJ0IG9mIHRoZSBhbGdvcml0aG0gdGhhdCBuZWVkcyBhbiBpbXBsZW1lbnRhdGlvbiAoYS5rLmEuIHRoZSB1bnNldHRsZWQgaGVpZ2h0IHByb2JsZW0pLFxuXHRcdCAqIFx0ICAgaW4gc2hvcnQsIGEgYmV0dGVyIGFwcHJveGltYXRpb24gZm9yIFVOS05PV05fSEVJR0hUIHdoZW4gdGhlIGVsZW1lbnQgaXMgbm90IHJlbmRlcmVkIHlldCB3b3VsZCBiZSBmYW50YXN0aWNcblx0XHQgKiBcdCAgIHBsZWFzZSAtIGFuZCBJIG1lYW4gdGhpcyB3aXRoIGFsbCBzaW5jZXJpdHkgaW4gdGhlIHdvcmxkIC0gcGxlYXNlIGxldCBtZSBrbm93IGlmIHlvdSBhcmUgYWJsZSB0byBjb21lIHVwIHdpdGggYSBtb3JlIGVsZWdhbnQgc29sdXRpb25cblx0XHQgKi9cblx0XHRjb25zdCBoZWlnaHQgPSB0aGlzLmd1dHRlci5lbGVtZW50c1t0aGlzLmldPy5kb20uY2xpZW50SGVpZ2h0IHx8IFVOS05PV05fSEVJR0hUO1xuXG5cblx0XHQvLyBFWFBMOiBTZWFyY2ggZm9yIGFuIGV4aXN0aW5nIEd1dHRlckVsZW1lbnQgd2l0aCB0aGUgc2FtZSBtYXJrZXJzXG5cdFx0Y29uc3QgZWxlbWVudF9pZHggPSB0aGlzLmd1dHRlci5lbGVtZW50c1xuXHRcdFx0LmZpbmRJbmRleChlID0+IHNhbWVNYXJrZXJzKGUubWFya2VycywgbWFya2VycykpO1xuXG5cdFx0Ly8gRVhQTDogSWYgYSBHdXR0ZXJFbGVtZW50IGFscmVhZHkgZXhpc3RzLCBhbmQgaXQgaGFzIHRoZSBleGFjdCBzYW1lIG1hcmtlcnMsXG5cdFx0Ly8gICAgICByZW1vdmUgYWxsIHRoZSBHdXR0ZXJFbGVtZW50cyBiZWZvcmUgdGhpcyBlbGVtZW50XG5cdFx0Ly8gICAgXHRhbmQgcmUtaW5zZXJ0IGFsbCB0aGUgbmV3bHkgYWRkZWQgZWxlbWVudHMgYmVmb3JlIHRoaXMgZWxlbWVudFxuXHRcdGlmIChlbGVtZW50X2lkeCAhPT0gLTEpIHtcblx0XHRcdGNvbnN0IGVsZW1lbnQgPSB0aGlzLmd1dHRlci5lbGVtZW50c1tlbGVtZW50X2lkeF07XG5cdFx0XHRmb3IgKGxldCBpID0gdGhpcy5pOyBpIDwgZWxlbWVudF9pZHg7IGkrKykge1xuXHRcdFx0XHR0aGlzLmd1dHRlci5kb20ucmVtb3ZlQ2hpbGQodGhpcy5ndXR0ZXIuZWxlbWVudHNbaV0uZG9tKTtcblx0XHRcdFx0dGhpcy5ndXR0ZXIuZWxlbWVudHNbaV0uZGVzdHJveSgpO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCBhZGRlZF9lbGVtZW50IG9mIHRoaXMuYWRkZWRfZWxlbWVudHMpXG5cdFx0XHRcdHRoaXMuZ3V0dGVyLmRvbS5pbnNlcnRCZWZvcmUoYWRkZWRfZWxlbWVudC5kb20sIGVsZW1lbnQuZG9tKTtcblx0XHRcdHRoaXMubmV3X2d1dHRlcl9lbGVtZW50cy5wdXNoKC4uLnRoaXMuYWRkZWRfZWxlbWVudHMpO1xuXHRcdFx0dGhpcy5hZGRlZF9lbGVtZW50cyA9IFtdO1xuXG5cdFx0XHR0aGlzLmkgPSBlbGVtZW50X2lkeCArIDE7XG5cdFx0XHR0aGlzLm5ld19ndXR0ZXJfZWxlbWVudHMucHVzaChlbGVtZW50KTtcblx0XHRcdGVsZW1lbnQudXBkYXRlKHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMsIGJsb2NrKTtcblx0XHR9XG5cblx0XHQvLyBFWFBMOiBPdGhlcndpc2UsIGlmIHRoZSBHdXR0ZXJFbGVtZW50IGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgYSBuZXcgb25lIGFuZCBpdCB0byB0aGUgZ3V0dGVyIGxhdGVyXG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLmFkZGVkX2VsZW1lbnRzLnB1c2gobmV3IEFubm90YXRpb25HdXR0ZXJFbGVtZW50KHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMsIGJsb2NrKSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5wcmV2aW91c19lbGVtZW50X2VuZCA9IGJsb2NrX3N0YXJ0ICsgaGVpZ2h0O1xuXHR9XG5cblx0ZmluaXNoKCkge1xuXHRcdC8vIEVYUEw6IEZpbmFsbHksIGF0IHRoZSBlbmQgb2YgdGhlIHVwZGF0ZSwgcmVtb3ZlIGFsbCByZW1haW5pbmcgR3V0dGVyRWxlbWVudHNcblx0XHRmb3IgKGxldCBpID0gdGhpcy5pOyBpIDwgdGhpcy5ndXR0ZXIuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHRoaXMuZ3V0dGVyLmRvbS5yZW1vdmVDaGlsZCh0aGlzLmd1dHRlci5lbGVtZW50c1tpXS5kb20pO1xuXHRcdFx0dGhpcy5ndXR0ZXIuZWxlbWVudHNbaV0uZGVzdHJveSgpO1xuXHRcdH1cblxuXHRcdC8vIEVYUEw6IEFkZCBhbGwgdGhlIHJlbWFpbmluZyBhZGRlZCBHdXR0ZXJFbGVtZW50cyB0byB0aGUgZ3V0dGVyXG5cdFx0Zm9yIChjb25zdCBhZGRlZF9lbGVtZW50IG9mIHRoaXMuYWRkZWRfZWxlbWVudHMpIHtcblx0XHRcdHRoaXMuZ3V0dGVyLmRvbS5hcHBlbmRDaGlsZChhZGRlZF9lbGVtZW50LmRvbSk7XG5cdFx0fVxuXHRcdHRoaXMuZ3V0dGVyLmVsZW1lbnRzID0gWy4uLnRoaXMubmV3X2d1dHRlcl9lbGVtZW50cywgLi4udGhpcy5hZGRlZF9lbGVtZW50c107XG5cdFx0dGhpcy5uZXdfZ3V0dGVyX2VsZW1lbnRzID0gW107XG5cdFx0dGhpcy5hZGRlZF9lbGVtZW50cyA9IFtdO1xuXHR9XG59XG5cbmNsYXNzIEFubm90YXRpb25TaW5nbGVHdXR0ZXJWaWV3IGV4dGVuZHMgU2luZ2xlR3V0dGVyVmlldyB7XG5cdGZvbGRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXHRoaWRlX29uX2VtcHR5OiBib29sZWFuID0gZmFsc2U7XG5cdHdpZHRoOiBudW1iZXIgPSAwO1xuXHRhZGRfZm9sZF9idXR0b246IGJvb2xlYW4gPSBmYWxzZTtcblx0YWRkX3Jlc2l6ZV9oYW5kbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRmb2xkX2J1dHRvbl9lbDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cdHJlc2l6ZV9oYW5kbGVfZWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXHRkZWNsYXJlIGVsZW1lbnRzOiBBbm5vdGF0aW9uR3V0dGVyRWxlbWVudFtdO1xuXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyB2aWV3OiBFZGl0b3JWaWV3LCBwdWJsaWMgY29uZmlnOiBSZXF1aXJlZDxBbm5vdGF0aW9uR3V0dGVyQ29uZmlnPiwgcHJpdmF0ZSBndXR0ZXJEb206IEhUTUxFbGVtZW50KSB7XG5cdFx0c3VwZXIodmlldywgY29uZmlnKTtcblxuXHRcdHRoaXMuZm9sZGVkID0gY29uZmlnLmZvbGRTdGF0ZTtcblx0XHR0aGlzLndpZHRoID0gY29uZmlnLndpZHRoO1xuXHRcdHRoaXMuaGlkZV9vbl9lbXB0eSA9IGNvbmZpZy5oaWRlT25FbXB0eTtcblx0XHR0aGlzLmFkZF9mb2xkX2J1dHRvbiA9IGNvbmZpZy5pbmNsdWRlRm9sZEJ1dHRvbjtcblx0XHR0aGlzLmFkZF9yZXNpemVfaGFuZGxlID0gY29uZmlnLmluY2x1ZGVSZXNpemVIYW5kbGU7XG5cblx0XHRpZiAoKHRoaXMuaGlkZV9vbl9lbXB0eSAmJiB2aWV3LnN0YXRlLmZpZWxkKGFubm90YXRpb25HdXR0ZXJNYXJrZXJzKS5zaXplID09PSAwKSB8fCB0aGlzLmZvbGRlZCkge1xuXHRcdFx0dGhpcy5kb20uc3R5bGUud2lkdGggPSBcIjBcIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5kb20uc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgXCJweFwiO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmFkZF9mb2xkX2J1dHRvbikge1xuXHRcdFx0dGhpcy5jcmVhdGVGb2xkQnV0dG9uKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuYWRkX3Jlc2l6ZV9oYW5kbGUpIHtcblx0XHRcdHRoaXMuY3JlYXRlUmVzaXplSGFuZGxlKCk7XG5cdFx0fVxuXHR9XG5cblx0Y3JlYXRlRm9sZEJ1dHRvbigpIHtcblx0XHR0aGlzLmZvbGRfYnV0dG9uX2VsID0gY3JlYXRlRWwoXCJhXCIsIHsgY2xzOiBbXCJjbXRyLWFubm8tZ3V0dGVyLWJ1dHRvblwiLCBcInZpZXctYWN0aW9uXCJdIH0pO1xuXHRcdHNldEljb24odGhpcy5mb2xkX2J1dHRvbl9lbCwgXCJhcnJvdy1yaWdodC1mcm9tLWxpbmVcIik7XG5cdFx0dGhpcy5mb2xkX2J1dHRvbl9lbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXRvb2x0aXAtcG9zaXRpb25cIiwgXCJsZWZ0XCIpO1xuXHRcdHRoaXMuZm9sZF9idXR0b25fZWwuc3R5bGUuZGlzcGxheSA9IHRoaXMudmlldy5zdGF0ZS5maWVsZChhbm5vdGF0aW9uR3V0dGVyTWFya2Vycykuc2l6ZSA/IFwiXCIgOiBcIm5vbmVcIjtcblx0XHR0aGlzLmZvbGRfYnV0dG9uX2VsLm9uY2xpY2sgPSAoKSA9PiB7XG5cdFx0XHR0aGlzLmZvbGRlZCA9ICF0aGlzLmZvbGRlZDtcblx0XHRcdHRoaXMudmlldy5zdGF0ZS5maWVsZChlZGl0b3JJbmZvRmllbGQpLmFwcC53b3Jrc3BhY2UucmVxdWVzdFNhdmVMYXlvdXQoKTtcblx0XHRcdHRoaXMuZm9sZEd1dHRlcigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc2V0Rm9sZEJ1dHRvblN0YXRlKCk7XG5cdFx0dGhpcy52aWV3LmRvbS5wcmVwZW5kKHRoaXMuZm9sZF9idXR0b25fZWwpO1xuXHR9XG5cblx0Y3JlYXRlUmVzaXplSGFuZGxlKCkge1xuXHRcdHRoaXMucmVzaXplX2hhbmRsZV9lbCA9IGNyZWF0ZUVsKFwiaHJcIiwgeyBjbHM6IFtcImNtdHItYW5uby1ndXR0ZXItcmVzaXplLWhhbmRsZVwiXSB9KTtcblx0XHR0aGlzLnJlc2l6ZV9oYW5kbGVfZWwuc3R5bGUuZGlzcGxheSA9ICh0aGlzLnZpZXcuc3RhdGUuZmllbGQoYW5ub3RhdGlvbkd1dHRlck1hcmtlcnMpLnNpemUgJiYgIXRoaXMuZm9sZGVkKSA/IFwiXCIgOiBcIm5vbmVcIjtcblx0XHR0aGlzLnJlc2l6ZV9oYW5kbGVfZWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoZSkgPT4ge1xuXHRcdFx0bGV0IGluaXRpYWxQb3NpdGlvbiA9IGUuY2xpZW50WDtcblxuXHRcdFx0Ly8gRVhQTDogRGVib3VuY2UgdG8gcHJldmVudCBleGNlc3NpdmUgc3RhdGUgdXBkYXRlcyBhbmQgRE9NIHJlZHJhd3Mgd2hpbGUgZHJhZ2dpbmcgdGhlIGhhbmRsZVxuXHRcdFx0Y29uc3Qgc2V0V2lkdGggPSBkZWJvdW5jZSgod2lkdGg6IG51bWJlcikgPT4ge1xuXHRcdFx0XHR0aGlzLndpZHRoID0gd2lkdGg7XG5cdFx0XHRcdHRoaXMudmlldy5zdGF0ZS5maWVsZChlZGl0b3JJbmZvRmllbGQpLmFwcC53b3Jrc3BhY2UucmVxdWVzdFNhdmVMYXlvdXQoKTtcblx0XHRcdFx0dGhpcy5kb20uc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgXCJweFwiO1xuXHRcdFx0XHRpZiAodGhpcy5mb2xkX2J1dHRvbl9lbCkge1xuXHRcdFx0XHRcdHRoaXMuZm9sZF9idXR0b25fZWwuc3R5bGUucmlnaHQgPSB0aGlzLndpZHRoICsgRk9MRF9CVVRUT05fT0ZGU0VUICsgXCJweFwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCAyNSk7XG5cblx0XHRcdHRoaXMucmVzaXplX2hhbmRsZV9lbCEuY2xhc3NMaXN0LnRvZ2dsZShcImNtdHItYW5uby1ndXR0ZXItcmVzaXplLWhhbmRsZS1ob3ZlclwiLCB0cnVlKTtcblx0XHRcdHRoaXMuZm9sZF9idXR0b25fZWw/LmNsYXNzTGlzdC50b2dnbGUoXCJjbXRyLWFubm8tZ3V0dGVyLW1vdmluZ1wiLCB0cnVlKTtcblx0XHRcdHRoaXMuZ3V0dGVyRG9tLmNsYXNzTGlzdC50b2dnbGUoXCJjbXRyLWFubm8tZ3V0dGVyLW1vdmluZ1wiLCB0cnVlKTtcblxuXHRcdFx0bGV0IGN1cnJlbnRXaWR0aCA9IHBhcnNlSW50KHRoaXMuZG9tLnN0eWxlLndpZHRoLnNsaWNlKDAsIC0yKSk7XG5cdFx0XHRjb25zdCBvbk1vdXNlTW92ZSA9IChldnQ6IE1vdXNlRXZlbnQpID0+IHtcblx0XHRcdFx0Y29uc3QgZGVsdGFYID0gZXZ0LmNsaWVudFggLSBpbml0aWFsUG9zaXRpb247XG5cdFx0XHRcdGluaXRpYWxQb3NpdGlvbiA9IGV2dC5jbGllbnRYXG5cdFx0XHRcdGN1cnJlbnRXaWR0aCAtPSBkZWx0YVg7XG5cdFx0XHRcdHNldFdpZHRoKGN1cnJlbnRXaWR0aCk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvbk1vdXNlU3RvcCA9ICgpID0+IHtcblx0XHRcdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBvbk1vdXNlTW92ZSk7XG5cdFx0XHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIG9uTW91c2VTdG9wKTtcblx0XHRcdFx0dGhpcy5yZXNpemVfaGFuZGxlX2VsIS5jbGFzc0xpc3QudG9nZ2xlKFwiY210ci1hbm5vLWd1dHRlci1yZXNpemUtaGFuZGxlLWhvdmVyXCIsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5mb2xkX2J1dHRvbl9lbD8uY2xhc3NMaXN0LnRvZ2dsZShcImNtdHItYW5uby1ndXR0ZXItbW92aW5nXCIsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5ndXR0ZXJEb20uY2xhc3NMaXN0LnRvZ2dsZShcImNtdHItYW5uby1ndXR0ZXItbW92aW5nXCIsIGZhbHNlKTtcblx0XHRcdH1cblxuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBvbk1vdXNlTW92ZSk7XG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBvbk1vdXNlU3RvcCk7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5ndXR0ZXJEb20uYXBwZW5kQ2hpbGQodGhpcy5yZXNpemVfaGFuZGxlX2VsKTtcblx0fVxuXG5cdHNldEZvbGRCdXR0b25TdGF0ZSgpIHtcblx0XHRpZiAodGhpcy5mb2xkX2J1dHRvbl9lbCkge1xuXHRcdFx0aWYgKHRoaXMuZm9sZGVkKSB7XG5cdFx0XHRcdHRoaXMuZm9sZF9idXR0b25fZWwuc3R5bGUucmlnaHQgPSBcIjIwcHhcIjtcblx0XHRcdFx0dGhpcy5mb2xkX2J1dHRvbl9lbC5zdHlsZS5yb3RhdGUgPSBcIi0xODBkZWdcIjtcblx0XHRcdFx0dGhpcy5mb2xkX2J1dHRvbl9lbC5hcmlhTGFiZWwgPSBcIlVuZm9sZCBndXR0ZXJcIjtcblx0XHRcdFx0aWYgKHRoaXMucmVzaXplX2hhbmRsZV9lbCkge1xuXHRcdFx0XHRcdHRoaXMucmVzaXplX2hhbmRsZV9lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmZvbGRfYnV0dG9uX2VsLnN0eWxlLnJpZ2h0ID0gdGhpcy53aWR0aCArIEZPTERfQlVUVE9OX09GRlNFVCArIFwicHhcIjtcblx0XHRcdFx0dGhpcy5mb2xkX2J1dHRvbl9lbC5zdHlsZS5yb3RhdGUgPSBcIjBkZWdcIjtcblx0XHRcdFx0dGhpcy5mb2xkX2J1dHRvbl9lbC5hcmlhTGFiZWwgPSBcIkZvbGQgZ3V0dGVyXCI7XG5cdFx0XHRcdGlmICh0aGlzLnJlc2l6ZV9oYW5kbGVfZWwpIHtcblx0XHRcdFx0XHR0aGlzLnJlc2l6ZV9oYW5kbGVfZWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Zm9sZEd1dHRlcigpIHtcblx0XHR0aGlzLnNldEZvbGRCdXR0b25TdGF0ZSgpO1xuXG5cdFx0Ly8gRVhQTDogU2V0IHRoZSBoZWlnaHQgZm9yIGV2ZXJ5IG1hcmtlciB0byBmaXhlZCBzbyB0aGF0IHRoZXkgd29uJ3QgcmVzaXplIHdoaWxlIHRoZSBndXR0ZXIgaXMgY2hhbmdpbmcgd2lkdGhcblx0XHRpZiAodGhpcy5mb2xkZWQpIHtcblx0XHRcdHRoaXMuZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcblx0XHRcdFx0QXJyYXkuZnJvbShlbGVtZW50LmRvbS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uXCIpKS5mb3JFYWNoKGNvbW1lbnQgPT4ge1xuXHRcdFx0XHRcdGNvbW1lbnQuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgYG1heC1oZWlnaHQ6ICR7Y29tbWVudC5jbGllbnRIZWlnaHR9cHg7IG92ZXJmbG93OiBoaWRkZW47YCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsICgpID0+IHtcblx0XHRcdFx0dGhpcy5lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuXHRcdFx0XHRcdEFycmF5LmZyb20oZWxlbWVudC5kb20uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImNtdHItYW5uby1ndXR0ZXItYW5ub3RhdGlvblwiKSkuZm9yRWFjaChjb21tZW50ID0+IHtcblx0XHRcdFx0XHRcdGNvbW1lbnQuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgYGApO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sIHsgb25jZTogdHJ1ZSB9KTtcblx0XHR9XG5cdFx0dGhpcy5kb20uc3R5bGUud2lkdGggPSB0aGlzLmZvbGRlZCA/IFwiMFwiIDogdGhpcy53aWR0aCArIFwicHhcIjtcblx0fVxuXG5cdHVwZGF0ZSh1cGRhdGU6IFZpZXdVcGRhdGUpIHtcblx0XHRjb25zdCByZXN1bHQgPSBzdXBlci51cGRhdGUodXBkYXRlKTtcblx0XHRjb25zdCB3aWRnZXRzID0gdXBkYXRlLnN0YXRlLmZpZWxkKGFubm90YXRpb25HdXR0ZXJNYXJrZXJzKTtcblxuXHRcdGZvciAoY29uc3QgdHJhbnNhY3Rpb24gb2YgdXBkYXRlLnRyYW5zYWN0aW9ucykge1xuXHRcdFx0Y29uc3QgZm9sZF9zdGF0dXMgPSB0cmFuc2FjdGlvbi5hbm5vdGF0aW9uKGFubm90YXRpb25HdXR0ZXJGb2xkQW5ub3RhdGlvbik7XG5cdFx0XHRjb25zdCB3aWR0aCA9IHRyYW5zYWN0aW9uLmFubm90YXRpb24oYW5ub3RhdGlvbkd1dHRlcldpZHRoQW5ub3RhdGlvbik7XG5cdFx0XHRjb25zdCBoaWRlX2VtcHR5ID0gdHJhbnNhY3Rpb24uYW5ub3RhdGlvbihhbm5vdGF0aW9uR3V0dGVySGlkZUVtcHR5QW5ub3RhdGlvbik7XG5cdFx0XHRjb25zdCBmb2xkX2J1dHRvbiA9IHRyYW5zYWN0aW9uLmFubm90YXRpb24oYW5ub3RhdGlvbkd1dHRlckZvbGRCdXR0b25Bbm5vdGF0aW9uKTtcblx0XHRcdGNvbnN0IHJlc2l6ZV9oYW5kbGUgPSB0cmFuc2FjdGlvbi5hbm5vdGF0aW9uKGFubm90YXRpb25HdXR0ZXJSZXNpemVIYW5kbGVBbm5vdGF0aW9uKTtcblx0XHRcdGlmICh3aWR0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMud2lkdGggPSB3aWR0aDtcblx0XHRcdFx0aWYgKCF0aGlzLmhpZGVfb25fZW1wdHkgJiYgIXRoaXMuZm9sZGVkKSB7XG5cdFx0XHRcdFx0dGhpcy5kb20uc3R5bGUud2lkdGggPSB3aWR0aCArIFwicHhcIjtcblx0XHRcdFx0XHR0aGlzLnNldEZvbGRCdXR0b25TdGF0ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoZm9sZF9zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAoZm9sZF9zdGF0dXMgPT09IG51bGwpIHtcblx0XHRcdFx0XHR0aGlzLmZvbGRlZCA9ICF0aGlzLmZvbGRlZDtcblx0XHRcdFx0XHR0aGlzLnZpZXcuc3RhdGUuZmllbGQoZWRpdG9ySW5mb0ZpZWxkKS5hcHAud29ya3NwYWNlLnJlcXVlc3RTYXZlTGF5b3V0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5mb2xkZWQgPSBmb2xkX3N0YXR1cztcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmZvbGRHdXR0ZXIoKTtcblx0XHRcdH1cblx0XHRcdGlmIChoaWRlX2VtcHR5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5oaWRlX29uX2VtcHR5ID0gaGlkZV9lbXB0eTtcblx0XHRcdFx0aWYgKHRoaXMuaGlkZV9vbl9lbXB0eSAmJiB3aWRnZXRzLnNpemUgPT09IDApIHtcblx0XHRcdFx0XHR0aGlzLmRvbS5zdHlsZS53aWR0aCA9IFwiMFwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZG9tLnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArIFwicHhcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGZvbGRfYnV0dG9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5hZGRfZm9sZF9idXR0b24gPSBmb2xkX2J1dHRvbjtcblx0XHRcdFx0aWYgKHRoaXMuYWRkX2ZvbGRfYnV0dG9uICYmICF0aGlzLmZvbGRfYnV0dG9uX2VsKSB7XG5cdFx0XHRcdFx0dGhpcy5jcmVhdGVGb2xkQnV0dG9uKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIXRoaXMuYWRkX2ZvbGRfYnV0dG9uICYmIHRoaXMuZm9sZF9idXR0b25fZWwpIHtcblx0XHRcdFx0XHR0aGlzLmZvbGRfYnV0dG9uX2VsLnJlbW92ZSgpO1xuXHRcdFx0XHRcdHRoaXMuZm9sZF9idXR0b25fZWwgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5zZXRGb2xkQnV0dG9uU3RhdGUoKTtcblx0XHRcdH1cblx0XHRcdGlmIChyZXNpemVfaGFuZGxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5hZGRfcmVzaXplX2hhbmRsZSA9IHJlc2l6ZV9oYW5kbGU7XG5cdFx0XHRcdGlmICh0aGlzLmFkZF9yZXNpemVfaGFuZGxlICYmICF0aGlzLnJlc2l6ZV9oYW5kbGVfZWwpIHtcblx0XHRcdFx0XHR0aGlzLmNyZWF0ZVJlc2l6ZUhhbmRsZSgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCF0aGlzLmFkZF9yZXNpemVfaGFuZGxlICYmIHRoaXMucmVzaXplX2hhbmRsZV9lbCkge1xuXHRcdFx0XHRcdHRoaXMucmVzaXplX2hhbmRsZV9lbC5yZW1vdmUoKTtcblx0XHRcdFx0XHR0aGlzLnJlc2l6ZV9oYW5kbGVfZWwgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAod2lkZ2V0cy5zaXplICE9PSB1cGRhdGUuc3RhcnRTdGF0ZS5maWVsZChhbm5vdGF0aW9uR3V0dGVyTWFya2Vycykuc2l6ZSkge1xuXHRcdFx0aWYgKHdpZGdldHMuc2l6ZSA9PT0gMCkge1xuXHRcdFx0XHRpZiAodGhpcy5mb2xkX2J1dHRvbl9lbCkge1xuXHRcdFx0XHRcdHRoaXMuZm9sZF9idXR0b25fZWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLnJlc2l6ZV9oYW5kbGVfZWwpIHtcblx0XHRcdFx0XHR0aGlzLnJlc2l6ZV9oYW5kbGVfZWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLmhpZGVfb25fZW1wdHkpIHtcblx0XHRcdFx0XHR0aGlzLmRvbS5zdHlsZS53aWR0aCA9IFwiMFwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodGhpcy5mb2xkX2J1dHRvbl9lbCkge1xuXHRcdFx0XHRcdHRoaXMuZm9sZF9idXR0b25fZWwuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMucmVzaXplX2hhbmRsZV9lbCkge1xuXHRcdFx0XHRcdHRoaXMucmVzaXplX2hhbmRsZV9lbC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXRoaXMuZm9sZGVkKSB7XG5cdFx0XHRcdFx0dGhpcy5kb20uc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgXCJweFwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTk9URTogQm9vbGVhbiByZXR1cm5zIHRydWUgb25seSBpZiBtYXJrZXJzIGhhdmUgY2hhbmdlZCB3aXRoaW4gdGhlIHZpZXdwb3J0IChzbyBvdXRzaWRlIG1hcmtlcnMgZG9uJ3QgY291bnQpXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGRlc3Ryb3koKSB7XG5cdFx0dGhpcy5mb2xkX2J1dHRvbl9lbD8ucmVtb3ZlKCk7XG5cdFx0dGhpcy5yZXNpemVfaGFuZGxlX2VsPy5yZW1vdmUoKTtcblxuXHRcdHN1cGVyLmRlc3Ryb3koKTtcblx0fVxufVxuXG5jbGFzcyBBbm5vdGF0aW9uR3V0dGVyRWxlbWVudCBleHRlbmRzIEd1dHRlckVsZW1lbnQge1xuXHRjb25zdHJ1Y3Rvcihcblx0XHR2aWV3OiBFZGl0b3JWaWV3LFxuXHRcdGhlaWdodDogbnVtYmVyLFxuXHRcdGFib3ZlOiBudW1iZXIsXG5cdFx0bWFya2VyczogcmVhZG9ubHkgR3V0dGVyTWFya2VyW10sXG5cdFx0Ly8gSU1QT1JUQU5UOiBUaGUgYGJsb2NrYCB2YXJpYWJsZSByZXByZXNlbnRzIHRoZSBfc3RhcnRpbmdfIGxpbmUgdGhpcyBHdXR0ZXJFbGVtZW50IG1heSBiZWxvbmcgdG9cblx0XHQvL1x0XHR0aGUgYW5ub3RhdGlvbnMgX21heV8gY292ZXIgbXVsdGlwbGUgbGluZXMsIGJ1dCB0aGUgYmxvY2sgd2lsbCBPTkxZIGFjY291bnQgZm9yIHRoZSBmaXJzdCBsaW5lXG5cdFx0Ly9cdFx0SW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgdGhhdCBibG9jay50byBJUyBOT1QgdGhlIGVuZCBvZiB0aGUgbWFya2VyXG5cdFx0cHVibGljIGJsb2NrOiBCbG9ja0luZm8gfCBudWxsID0gbnVsbCxcblx0KSB7XG5cdFx0c3VwZXIodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG5cdH1cblxuXHQvKipcblx0ICogQ29tbWVudCB1cGRhdGUgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCBmb3JjaWJseSBzZXQgdGhlIGhlaWdodCBvZiB0aGUgZ3V0dGVyIGVsZW1lbnRcblx0ICovXG5cdHVwZGF0ZShcblx0XHR2aWV3OiBFZGl0b3JWaWV3LFxuXHRcdGhlaWdodDogbnVtYmVyLFxuXHRcdGFib3ZlOiBudW1iZXIsXG5cdFx0bWFya2VyczogcmVhZG9ubHkgR3V0dGVyTWFya2VyW10sXG5cdFx0YmxvY2s6IEJsb2NrSW5mbyB8IG51bGwgPSBudWxsLFxuXHQpIHtcblx0XHR0aGlzLmJsb2NrID0gYmxvY2s7XG5cdFx0aWYgKHRoaXMuYWJvdmUgIT0gYWJvdmUpXG5cdFx0XHR0aGlzLmRvbS5zdHlsZS5tYXJnaW5Ub3AgPSAodGhpcy5hYm92ZSA9IGFib3ZlKSA/IGFib3ZlICsgXCJweFwiIDogXCJcIjtcblx0XHRpZiAoIXNhbWVNYXJrZXJzKHRoaXMubWFya2VycywgbWFya2VycykpXG5cdFx0XHR0aGlzLnNldE1hcmtlcnModmlldywgbWFya2Vycyk7XG5cdH1cbn1cbiIsICIvKipcbiAqIFRoaXMgZmlsZSBpcyBsYXJnZWx5IGlkZW50aWNhbCB0byB0aGUgZ3V0dGVyIGRlZmluZWQgaW4gQGNvZGVtaXJyb3Ivdmlldy9ndXR0ZXJcbiAqIFRoZSBvbmx5IGNoYW5nZXMgYXJlOlxuICogICAxLiBFeHRyYWN0ZWQgY3JlYXRlR3V0dGVycy9pbnNlcnRHdXR0ZXJzL2dldFVwZGF0ZUNvbnRleHRzIG1ldGhvZHMgc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlblxuICogICAyLiBBZGRlZCBjb25zdHMgd2VyZSBuZWNlc3NhcnkgYW5kIGZvcm1hdHRlZCBjb2RlXG4gKiAgIDMuIENoYW5nZWQgZGVmYXVsdCBpbnNlcnQgbG9jYXRpb24gb2YgdGhlIERPTSAodG8gYmUgc2ltaWxhciB0byBPYnNpZGlhbidzIGd1dHRlcilcbiAqICAgNC4gRXh0cmFjdGVkIGFjdGl2ZUd1dHRlcnMgYW5kIHVuZml4R3V0dGVycyBGYWNldHMgc28gbXVsdGlwbGUgaW5kZXBlbmRlbnQgZ3V0dGVycyBjYW4gYmUgZGVmaW5lZFxuICovXG5cbmltcG9ydCB7IHR5cGUgRXh0ZW5zaW9uLCBGYWNldCwgdHlwZSBSYW5nZUN1cnNvciwgUmFuZ2VTZXQgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7XG5cdEJsb2NrSW5mbyxcblx0QmxvY2tUeXBlLFxuXHREaXJlY3Rpb24sXG5cdEVkaXRvclZpZXcsXG5cdGd1dHRlckxpbmVDbGFzcyxcblx0R3V0dGVyTWFya2VyLFxuXHRWaWV3UGx1Z2luLFxuXHRWaWV3VXBkYXRlLFxuXHRXaWRnZXRUeXBlLFxufSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuXG4vLyBTZXQgRWRpdG9yVmlldyBjbGFzcyB0byBoYXZlIHNjYWxlWCBhbmQgc2NhbGVZIHByb3BlcnRpZXNcbi8vIFRPRE86IFJFTUlOREVSLCB1bmNvbW1lbnQgc2NhbGVYL3NjYWxlWSBmYWN0b3JzIHdoZW4gT2JzaWRpYW4gdXBkYXRlcyB0byB1cHN0cmVhbSBDb2RlTWlycm9yXG5kZWNsYXJlIG1vZHVsZSBcIkBjb2RlbWlycm9yL3ZpZXdcIiB7XG5cdGludGVyZmFjZSBFZGl0b3JWaWV3IHtcblx0XHRzY2FsZVg6IG51bWJlcjtcblx0XHRzY2FsZVk6IG51bWJlcjtcblx0fVxufVxuXG4vLyBEZWNsYXJlIHRoYXQgQmxvY2tJbmZvIGhhcyBXaWRnZXRUeXBlXG4vLyBUT0RPOiBVbmNvbW1lbnQgd2lkZ2V0IGNvZGUgd2hlbiBPYnNpZGlhbiB1cGRhdGVzIHRvIHVwc3RyZWFtIENvZGVNaXJyb3JcbmRlY2xhcmUgbW9kdWxlIFwiQGNvZGVtaXJyb3Ivdmlld1wiIHtcblx0aW50ZXJmYWNlIFdpZGdldFR5cGUge1xuXHRcdGxhbmc/OiBzdHJpbmc7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVNYXJrZXJzKGE6IHJlYWRvbmx5IEd1dHRlck1hcmtlcltdLCBiOiByZWFkb25seSBHdXR0ZXJNYXJrZXJbXSk6IGJvb2xlYW4ge1xuXHRpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblx0Ly8gQHRzLWlnbm9yZSAoY29tcGFyZSBkb2VzIGV4aXN0IG9uIG1hcmtlcilcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSBpZiAoIWFbaV0uY29tcGFyZShiW2ldKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IHR5cGUgSGFuZGxlcnMgPSB7IFtldmVudDogc3RyaW5nXTogKHZpZXc6IEVkaXRvclZpZXcsIGxpbmU6IEJsb2NrSW5mbywgZXZlbnQ6IEV2ZW50KSA9PiBib29sZWFuIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3V0dGVyQ29uZmlnIHtcblx0LyoqIEFuIGV4dHJhIENTUyBjbGFzcyB0byBiZSBhZGRlZCB0byB0aGUgd3JhcHBlciAoYGNtLWd1dHRlcmApIGVsZW1lbnQuICovXG5cdGNsYXNzPzogc3RyaW5nO1xuXHQvKiogQ29udHJvbHMgd2hldGhlciBlbXB0eSBndXR0ZXIgZWxlbWVudHMgc2hvdWxkIGJlIHJlbmRlcmVkLlxuXHQgRGVmYXVsdHMgdG8gZmFsc2UuICovXG5cdHJlbmRlckVtcHR5RWxlbWVudHM/OiBib29sZWFuO1xuXHQvKiogUmV0cmlldmUgYSBzZXQgb2YgbWFya2VycyB0byB1c2UgaW4gdGhpcyBndXR0ZXIuICovXG5cdG1hcmtlcnM/OiAodmlldzogRWRpdG9yVmlldykgPT4gUmFuZ2VTZXQ8R3V0dGVyTWFya2VyPiB8IHJlYWRvbmx5IFJhbmdlU2V0PEd1dHRlck1hcmtlcj5bXTtcblx0LyoqIENhbiBiZSB1c2VkIHRvIG9wdGlvbmFsbHkgYWRkIGEgc2luZ2xlIG1hcmtlciB0byBldmVyeSBsaW5lLiAqL1xuXHRsaW5lTWFya2VyPzogKHZpZXc6IEVkaXRvclZpZXcsIGxpbmU6IEJsb2NrSW5mbywgb3RoZXJNYXJrZXJzOiByZWFkb25seSBHdXR0ZXJNYXJrZXJbXSkgPT4gR3V0dGVyTWFya2VyIHwgbnVsbDtcblx0LyoqIEFzc29jaWF0ZSBtYXJrZXJzIHdpdGggYmxvY2sgd2lkZ2V0cyBpbiB0aGUgZG9jdW1lbnQuICovXG5cdHdpZGdldE1hcmtlcj86ICh2aWV3OiBFZGl0b3JWaWV3LCB3aWRnZXQ6IFdpZGdldFR5cGUsIGJsb2NrOiBCbG9ja0luZm8pID0+IEd1dHRlck1hcmtlciB8IG51bGw7XG5cdC8qKiBJZiBsaW5lIG9yIHdpZGdldCBtYXJrZXJzIGRlcGVuZCBvbiBhZGRpdGlvbmFsIHN0YXRlLCBhbmQgc2hvdWxkXG5cdCAqIGJlIHVwZGF0ZWQgd2hlbiB0aGF0IGNoYW5nZXMsIHBhc3MgYSBwcmVkaWNhdGUgaGVyZSB0aGF0IGNoZWNrc1xuXHQgKiB3aGV0aGVyIGEgZ2l2ZW4gdmlldyB1cGRhdGUgbWlnaHQgY2hhbmdlIHRoZSBsaW5lIG1hcmtlcnMuICovXG5cdGxpbmVNYXJrZXJDaGFuZ2U/OiBudWxsIHwgKCh1cGRhdGU6IFZpZXdVcGRhdGUpID0+IGJvb2xlYW4pO1xuXHQvKiogQWRkIGEgaGlkZGVuIHNwYWNlciBlbGVtZW50IHRoYXQgZ2l2ZXMgdGhlIGd1dHRlciBpdHMgYmFzZSB3aWR0aC4gKi9cblx0aW5pdGlhbFNwYWNlcj86IG51bGwgfCAoKHZpZXc6IEVkaXRvclZpZXcpID0+IEd1dHRlck1hcmtlcik7XG5cdC8qKiBVcGRhdGUgdGhlIHNwYWNlciBlbGVtZW50IHdoZW4gdGhlIHZpZXcgaXMgdXBkYXRlZC4gKi9cblx0dXBkYXRlU3BhY2VyPzogbnVsbCB8ICgoc3BhY2VyOiBHdXR0ZXJNYXJrZXIsIHVwZGF0ZTogVmlld1VwZGF0ZSkgPT4gR3V0dGVyTWFya2VyKTtcblx0LyoqIFN1cHBseSBldmVudCBoYW5kbGVycyBmb3IgRE9NIGV2ZW50cyBvbiB0aGlzIGd1dHRlci4gKi9cblx0ZG9tRXZlbnRIYW5kbGVycz86IEhhbmRsZXJzO1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdHMgPSB7XG5cdGNsYXNzOiBcIlwiLFxuXHRyZW5kZXJFbXB0eUVsZW1lbnRzOiBmYWxzZSxcblx0Ly8gZWxlbWVudFN0eWxlOiBcIlwiLFxuXHRtYXJrZXJzOiAoKSA9PiBSYW5nZVNldC5lbXB0eSxcblx0bGluZU1hcmtlcjogKCkgPT4gbnVsbCxcblx0d2lkZ2V0TWFya2VyOiAoKSA9PiBudWxsLFxuXHRsaW5lTWFya2VyQ2hhbmdlOiBudWxsLFxuXHRpbml0aWFsU3BhY2VyOiBudWxsLFxuXHR1cGRhdGVTcGFjZXI6IG51bGwsXG5cdGRvbUV2ZW50SGFuZGxlcnM6IHt9LFxufSBzYXRpc2ZpZXMgUmVxdWlyZWQ8R3V0dGVyQ29uZmlnPjtcblxuLy8gZXhwb3J0IGZ1bmN0aW9uIGd1dHRlcihjb25maWc6IEd1dHRlckNvbmZpZyk6IEV4dGVuc2lvbiB7XG4vLyBcdHJldHVybiBbZ3V0dGVycygpLCBhY3RpdmVHdXR0ZXJzLm9mKHsgLi4uZGVmYXVsdHMsIC4uLmNvbmZpZyB9KV07XG4vLyB9XG4vL1xuLy8gZXhwb3J0IGZ1bmN0aW9uIGd1dHRlcnMoKTogRXh0ZW5zaW9uIHtcbi8vIFx0cmV0dXJuIFtcbi8vIFx0XHRWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+IG5ldyBHdXR0ZXJWaWV3KHZpZXcpKSxcbi8vIFx0XHRndXR0ZXJMaW5lQ2xhc3Mub2YoUmFuZ2VTZXQuZW1wdHkpLFxuLy8gXHRdO1xuLy8gfVxuXG4vKipcbiAqIEFkdmFuY2UgY3Vyc29yIHRvIHBvc2l0aW9uXG4gKiBAcGFyYW0gY3Vyc29yIC0gQ3Vyc29yIHRvIGFkdmFuY2VcbiAqIEBwYXJhbSBjb2xsZWN0IC0gQXJyYXkgdG8gY29sbGVjdCBlbmNvdW50ZXJlZCBtYXJrZXJzIGluXG4gKiBAcGFyYW0gcG9zIC0gUG9zaXRpb24gdG8gYWR2YW5jZSB0b1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWR2YW5jZUN1cnNvcihjdXJzb3I6IFJhbmdlQ3Vyc29yPEd1dHRlck1hcmtlcj4sIGNvbGxlY3Q6IEd1dHRlck1hcmtlcltdLCBwb3M6IG51bWJlcikge1xuXHR3aGlsZSAoY3Vyc29yLnZhbHVlICYmIGN1cnNvci5mcm9tIDw9IHBvcykge1xuXHRcdC8vIE5PVEU6IEV4cGVjdHMgcmFuZ2UgdG8gc3RhcnQgKnByZWNpc2VseSogYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUsIHNpbmNlIGFkdmFuY2VkQ3Vyc29yIGlzIGludm9rZWQgdXNpbmcgbGluZS5mcm9tXG5cdFx0Ly8gaWYgKGN1cnNvci5mcm9tID09IHBvcykgY29sbGVjdC5wdXNoKGN1cnNvci52YWx1ZSk7XG5cblx0XHQvLyBNT0RJRklDQVRJT046IEluc3RlYWQsIGFsbCBtYXJrZXJzIHVwIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFyZSBjb2xsZWN0ZWQgKHNvIG5vdCBsaW5lLWJvdW5kKVxuXHRcdGlmIChjdXJzb3IuZnJvbSA8PSBwb3MpIGNvbGxlY3QucHVzaChjdXJzb3IudmFsdWUpO1xuXHRcdGN1cnNvci5uZXh0KCk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzQXJyYXk8VD4odmFsOiBUIHwgcmVhZG9ubHkgVFtdKSB7XG5cdHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF0pIGFzIHJlYWRvbmx5IFRbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEd1dHRlckVsZW1lbnQge1xuXHRkb206IEhUTUxFbGVtZW50O1xuXHRoZWlnaHQ6IG51bWJlciA9IC0xO1xuXHRhYm92ZTogbnVtYmVyID0gMDtcblx0bWFya2VyczogcmVhZG9ubHkgR3V0dGVyTWFya2VyW10gPSBbXTtcblxuXHRjb25zdHJ1Y3Rvcih2aWV3OiBFZGl0b3JWaWV3LCBoZWlnaHQ6IG51bWJlciwgYWJvdmU6IG51bWJlciwgbWFya2VyczogcmVhZG9ubHkgR3V0dGVyTWFya2VyW10pIHtcblx0XHR0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1ndXR0ZXJFbGVtZW50XCI7XG5cdFx0dGhpcy51cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG5cdH1cblxuXHR1cGRhdGUodmlldzogRWRpdG9yVmlldywgaGVpZ2h0OiBudW1iZXIsIGFib3ZlOiBudW1iZXIsIG1hcmtlcnM6IHJlYWRvbmx5IEd1dHRlck1hcmtlcltdKSB7XG5cdFx0aWYgKHRoaXMuaGVpZ2h0ICE9IGhlaWdodCkge1xuXHRcdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cdFx0XHR0aGlzLmRvbS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyBcInB4XCI7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmFib3ZlICE9IGFib3ZlKVxuXHRcdFx0dGhpcy5kb20uc3R5bGUubWFyZ2luVG9wID0gKHRoaXMuYWJvdmUgPSBhYm92ZSkgPyBhYm92ZSArIFwicHhcIiA6IFwiXCI7XG5cdFx0aWYgKCFzYW1lTWFya2Vycyh0aGlzLm1hcmtlcnMsIG1hcmtlcnMpKSB0aGlzLnNldE1hcmtlcnModmlldywgbWFya2Vycyk7XG5cdH1cblxuXHRzZXRNYXJrZXJzKHZpZXc6IEVkaXRvclZpZXcgfCBudWxsLCBtYXJrZXJzOiByZWFkb25seSBHdXR0ZXJNYXJrZXJbXSkge1xuXHRcdGxldCBjbHMgPSBcImNtLWd1dHRlckVsZW1lbnRcIiwgZG9tUG9zID0gdGhpcy5kb20uZmlyc3RDaGlsZDtcblx0XHRmb3IgKGxldCBpTmV3ID0gMCwgaU9sZCA9IDA7Oykge1xuXHRcdFx0bGV0IHNraXBUbyA9IGlPbGQ7XG5cdFx0XHRjb25zdCBtYXJrZXIgPSBpTmV3IDwgbWFya2Vycy5sZW5ndGggPyBtYXJrZXJzW2lOZXcrK10gOiBudWxsO1xuXHRcdFx0bGV0IG1hdGNoZWQgPSBmYWxzZTtcblx0XHRcdGlmIChtYXJrZXIpIHtcblx0XHRcdFx0Y29uc3QgYyA9IG1hcmtlci5lbGVtZW50Q2xhc3M7XG5cdFx0XHRcdGlmIChjKSBjbHMgKz0gXCIgXCIgKyBjO1xuXHRcdFx0XHRmb3IgKGxldCBpID0gaU9sZDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgKGNvbXBhcmUgZG9lcyBleGlzdCBvbiBtYXJrZXIpXG5cdFx0XHRcdFx0aWYgKHRoaXMubWFya2Vyc1tpXS5jb21wYXJlKG1hcmtlcikpIHtcblx0XHRcdFx0XHRcdHNraXBUbyA9IGk7XG5cdFx0XHRcdFx0XHRtYXRjaGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2tpcFRvID0gdGhpcy5tYXJrZXJzLmxlbmd0aDtcblx0XHRcdH1cblx0XHRcdHdoaWxlIChpT2xkIDwgc2tpcFRvKSB7XG5cdFx0XHRcdGNvbnN0IG5leHQgPSB0aGlzLm1hcmtlcnNbaU9sZCsrXTtcblx0XHRcdFx0aWYgKG5leHQudG9ET00pIHtcblx0XHRcdFx0XHRpZiAoZG9tUG9zKSB7XG5cdFx0XHRcdFx0XHQvLyBNT0RGOiBQcmV2ZW50cyB1bmxvYWRpbmcgb2YgYSBtYXJrZXIgaWYgaXQgdXNlZCBpbiBib3RoIG9sZCBhbmQgbmV3IEd1dHRlckVsZW1lbnRcblx0XHRcdFx0XHRcdC8vIEZJWE1FOiBUaGlzIGlmLWNoZWNrIHByZXZlbnRzIGEgcmUtdXNlZCBNYXJrZXIgKHNwZWNpZmljYWxseSwgYSBtYXJrZXIgdGhhdCBpcyB1c2VkXG5cdFx0XHRcdFx0XHQvLyAgXHQgXHRpbiBib3RoIGEgb2xkIF9hbmRfIGEgbmV3IEd1dHRlckVsZW1lbnQpIGZyb20gYmVpbmcgY29tcGxldGVseSByZW1vdmVkIGZyb20gdGhlIERPTVxuXHRcdFx0XHRcdFx0Ly9cdFx0ICAgIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSwgYXMgYEFubm90YXRpb25NYXJrZXJgcyBhcmUgcmV1c2VkIGFjcm9zcyBtdWx0aXBsZSBzdGF0ZSB1cGRhdGVzXG5cdFx0XHRcdFx0XHQvLyBcdFx0XHR2aWEgdGhlIGBhbm5vdGF0aW9uR3V0dGVyTWFya2Vyc2AgU3RhdGVGaWVsZC4gSWYgdGhlIHVzZXIgY2hhbmdlcyBhIGFubm90YXRpb24gaW5cblx0XHRcdFx0XHRcdC8vXHRcdFx0YSBzaW5nbGUgbGluZSAod2hpY2ggZW5jb21wYXNzZXMgYSBHdXR0ZXJFbGVtZW50KSwgYWxsIEFubm90YXRpb25NYXJrZXJzIGluIHRoaXNcblx0XHRcdFx0XHRcdC8vXHRcdFx0ZWxlbWVudCBnZXQgcmVtb3ZlZCwgYW5kIHRoZW4gcmUtYWRkZWQgdG8gdGhlIG5ldyBHdXR0ZXJFbGVtZW50LlxuXHRcdFx0XHRcdFx0Ly9cdFx0QSBtb3JlIHNhbmUgc29sdXRpb24gd291bGQgYmUgdG8gY2hhbmdlIHRoZSBTdGF0ZUZpZWxkIHRvIGNvbnN0cnVjdCBuZXcgTWFya2Vyc1xuXHRcdFx0XHRcdFx0Ly9cdFx0Zm9yIF9hbGxfIG1hcmtlcnMgaW4gYSBzaW5nbGUgbGluZSwgYnV0IHRoaXMgcmVxdWlyZXMgbXVjaCBtb3JlIGVmZm9ydC5cblx0XHRcdFx0XHRcdGlmICghKG5leHQgYXMgYW55KS5wcmV2ZW50VW5sb2FkKSB7XG5cdFx0XHRcdFx0XHRcdG5leHQuZGVzdHJveShkb21Qb3MhKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdChuZXh0IGFzIGFueSkucHJldmVudFVubG9hZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0Ly8gT1JJR0lOQUw6IG5leHQuZGVzdHJveShkb21Qb3MhKVxuXHRcdFx0XHRcdFx0Y29uc3QgYWZ0ZXIgPSBkb21Qb3MubmV4dFNpYmxpbmc7XG5cdFx0XHRcdFx0XHRkb21Qb3MucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRkb21Qb3MgPSBhZnRlcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICghbWFya2VyKSBicmVhaztcblx0XHRcdGlmIChtYXJrZXIudG9ET00gJiYgdmlldykge1xuXHRcdFx0XHRpZiAobWF0Y2hlZCkgZG9tUG9zID0gZG9tUG9zIS5uZXh0U2libGluZztcblx0XHRcdFx0ZWxzZSB0aGlzLmRvbS5pbnNlcnRCZWZvcmUobWFya2VyLnRvRE9NKHZpZXcpLCBkb21Qb3MpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1hdGNoZWQpIGlPbGQrKztcblx0XHR9XG5cdFx0dGhpcy5kb20uY2xhc3NOYW1lID0gY2xzO1xuXHRcdHRoaXMubWFya2VycyA9IG1hcmtlcnM7XG5cdH1cblxuXHRkZXN0cm95KCkge1xuXHRcdHRoaXMuc2V0TWFya2VycyhudWxsLCBbXSk7IC8vIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBub3QgdXNlZCBleGNlcHQgZm9yIGNyZWF0aW5nIG1hcmtlcnNcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgVXBkYXRlQ29udGV4dCB7XG5cdGN1cnNvcjogUmFuZ2VDdXJzb3I8R3V0dGVyTWFya2VyPjtcblx0aSA9IDA7XG5cblx0Y29uc3RydWN0b3IocmVhZG9ubHkgZ3V0dGVyOiBTaW5nbGVHdXR0ZXJWaWV3LCB2aWV3cG9ydDogeyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfSwgcHVibGljIGhlaWdodDogbnVtYmVyKSB7XG5cdFx0dGhpcy5jdXJzb3IgPSBSYW5nZVNldC5pdGVyKGd1dHRlci5tYXJrZXJzLCB2aWV3cG9ydC5mcm9tKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgbWFya2VycyB0byBibG9ja1xuXHQgKiBAcGFyYW0gdmlldyAtIEN1cnJlbnQgRWRpdG9yVmlld1xuXHQgKiBAcGFyYW0gYmxvY2sgLSBJbmZvIG9mIGJsb2NrIHRvIHdoaWNoIG1hcmtlcnMgc2hvdWxkIGJlIGFkZGVkXG5cdCAqIEBwYXJhbSBtYXJrZXJzIC0gTWFya2VycyB0byBhZGRcblx0ICovXG5cdGFkZEVsZW1lbnQodmlldzogRWRpdG9yVmlldywgYmxvY2s6IEJsb2NrSW5mbywgbWFya2VyczogcmVhZG9ubHkgR3V0dGVyTWFya2VyW10pIHtcblx0XHRjb25zdCB7IGd1dHRlciB9ID0gdGhpcztcblx0XHRjb25zdCBhYm92ZSA9IGJsb2NrLnRvcCAtIHRoaXMuaGVpZ2h0IC8qKiAvIHZpZXcuc2NhbGVZICovO1xuXHRcdGNvbnN0IGhlaWdodCA9IGJsb2NrLmhlaWdodCAvKiogLyB2aWV3LnNjYWxlWSAqLztcblx0XHRpZiAodGhpcy5pID09IGd1dHRlci5lbGVtZW50cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IG5ld0VsdCA9IG5ldyBHdXR0ZXJFbGVtZW50KHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMpO1xuXHRcdFx0Z3V0dGVyLmVsZW1lbnRzLnB1c2gobmV3RWx0KTtcblx0XHRcdGd1dHRlci5kb20uYXBwZW5kQ2hpbGQobmV3RWx0LmRvbSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGd1dHRlci5lbGVtZW50c1t0aGlzLmldLnVwZGF0ZSh2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKTtcblx0XHR9XG5cdFx0dGhpcy5oZWlnaHQgPSBibG9jay5ib3R0b207XG5cdFx0dGhpcy5pKys7XG5cdH1cblxuXHRsaW5lKHZpZXc6IEVkaXRvclZpZXcsIGxpbmU6IEJsb2NrSW5mbywgZXh0cmFNYXJrZXJzOiByZWFkb25seSBHdXR0ZXJNYXJrZXJbXSkge1xuXHRcdGxldCBsb2NhbE1hcmtlcnM6IEd1dHRlck1hcmtlcltdID0gW107XG5cblx0XHQvLyBhZHZhbmNlQ3Vyc29yIHdpbGwgcGxhY2UgYWxsIEd1dHRlck1hcmtlcnMgYmV0d2VlbiB0aGUgbGFzdCB0aGlzLmN1cnNvciBwb3NpdGlvbiBhbmQgbGluZS5mcm9tIGludG8gbG9jYWxNYXJrZXJzXG5cblx0XHQvLyBXaWRnZXRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzYW1lICd2aWV3cG9ydCcgYmxvY2sgYXMgdGhlIGRvY3VtZW50IGxpbmUgYmxvY2sgd2lsbCBiZSBza2lwcGVkXG5cdFx0Ly8gU2VlIGFubm90YXRpb24tZ3V0dGVyLnRzIGZvciBhIG1vcmUgZWxvcXVlbnQsIGFuYWx5dGljYWwgYW5kIGluLWRlcHRoIGV4cGxhbmF0aW9uXG5cdFx0Ly8gTU9ESUZJQ0FUSU9OOiBNYXJrZXJzIGFyZSBjb2xsZWN0ZWQgdXAgdW50aWwgdGhlIGVuZCBvZiB0aGUgYmxvY2tcblx0XHRhZHZhbmNlQ3Vyc29yKHRoaXMuY3Vyc29yLCBsb2NhbE1hcmtlcnMsIGxpbmUudG8pO1xuXG5cdFx0Ly8gTU9ESUZJQ0FUSU9OOiBEaXNhYmxlZCBhZGRpbmcgZXh0cmFNYXJrZXJzLCB0aGlzIHBhcnRpY3VsYXJseSBicmVha3Mgd2hlbiB1c2luZyB0aGUgbGluZS1udW1iZXJzIGd1dHRlclxuXHRcdC8vIFRPRE86IFZlcmlmeSB3aGV0aGVyIGhhdmluZyBjbS1hY3RpdmUgaXMgZGVzaXJhYmxlIChhbmQgdG8gdXNlIGl0IHdpdGhvdXQgY2F1c2luZyBpc3N1ZXMgZm9yIHRoZSBndXR0ZXJzKVxuXHRcdC8vIGlmIChleHRyYU1hcmtlcnMubGVuZ3RoKSBsb2NhbE1hcmtlcnMgPSBsb2NhbE1hcmtlcnMuY29uY2F0KGV4dHJhTWFya2Vycyk7XG5cblx0XHQvLyBPbmx5IGhhcHBlbnMgd2hlbiB3ZSBzZXQgbGluZU1hcmtlciBpbiBjb25maWdcblx0XHRjb25zdCBmb3JMaW5lID0gdGhpcy5ndXR0ZXIuY29uZmlnLmxpbmVNYXJrZXIodmlldywgbGluZSwgbG9jYWxNYXJrZXJzKTtcblx0XHRpZiAoZm9yTGluZSkgbG9jYWxNYXJrZXJzLnVuc2hpZnQoZm9yTGluZSk7XG5cblx0XHRjb25zdCBndXR0ZXIgPSB0aGlzLmd1dHRlcjtcblx0XHRpZiAobG9jYWxNYXJrZXJzLmxlbmd0aCA9PSAwICYmICFndXR0ZXIuY29uZmlnLnJlbmRlckVtcHR5RWxlbWVudHMpIHJldHVybjtcblx0XHR0aGlzLmFkZEVsZW1lbnQodmlldywgbGluZSwgbG9jYWxNYXJrZXJzKTtcblx0fVxuXG5cdHdpZGdldCh2aWV3OiBFZGl0b3JWaWV3LCBibG9jazogQmxvY2tJbmZvKSB7XG5cdFx0Ly8gQHRzLWlnbm9yZSAoQmxvY2sgY29udGFpbnMgd2lkZ2V0KVxuXHRcdGNvbnN0IG1hcmtlciA9IHRoaXMuZ3V0dGVyLmNvbmZpZy53aWRnZXRNYXJrZXIodmlldywgYmxvY2sud2lkZ2V0ISwgYmxvY2spO1xuXHRcdGlmIChtYXJrZXIpIHRoaXMuYWRkRWxlbWVudCh2aWV3LCBibG9jaywgW21hcmtlcl0pO1xuXHR9XG5cblx0ZmluaXNoKCkge1xuXHRcdGNvbnN0IGd1dHRlciA9IHRoaXMuZ3V0dGVyO1xuXHRcdC8vIFJlbW92ZXMgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIG91dHNpZGUgdGhlIHZpZXdwb3J0IChmcm9tIHRoZSBib3R0b20sIG9uIHNjcm9sbC11cClcblx0XHR3aGlsZSAoZ3V0dGVyLmVsZW1lbnRzLmxlbmd0aCA+IHRoaXMuaSkge1xuXHRcdFx0Y29uc3QgbGFzdCA9IGd1dHRlci5lbGVtZW50cy5wb3AoKSE7XG5cdFx0XHRndXR0ZXIuZG9tLnJlbW92ZUNoaWxkKGxhc3QuZG9tKTtcblx0XHRcdGxhc3QuZGVzdHJveSgpO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFx0VGhpcyBjbGFzcyBpcyBqdXN0IGEgY29uc3RydWN0b3IvY29udGFpbmVyIG9mIHRoZSBndXR0ZXJFbGVtZW50cywgYWxsIHRoZSB1cGRhdGVzXG4gKiBcdG9jY3VyIGluIFVwZGF0ZUNvbnRleHQgaW5zdGVhZFxuICpcbiAqIFx0TWFuYWdlczpcbiAqIFx0IC0gTWFya2VyIGNyZWF0aW9uIHVzaW5nIGN1cnJlbnQgdmlld1xuICogXHQgLSBDaGVja2luZyB3aGV0aGVyIHVwZGF0ZSBzaG91bGQgYmUgZXhlY3V0ZWQgb24gdmlld3BvcnQgY2hhbmdlXG4gKi9cbmV4cG9ydCBjbGFzcyBTaW5nbGVHdXR0ZXJWaWV3IHtcblx0ZG9tOiBIVE1MRWxlbWVudDtcblx0ZWxlbWVudHM6IEd1dHRlckVsZW1lbnRbXSA9IFtdO1xuXHRtYXJrZXJzOiByZWFkb25seSBSYW5nZVNldDxHdXR0ZXJNYXJrZXI+W107XG5cdHNwYWNlcjogR3V0dGVyRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyB2aWV3OiBFZGl0b3JWaWV3LCBwdWJsaWMgY29uZmlnOiBSZXF1aXJlZDxHdXR0ZXJDb25maWc+KSB7XG5cdFx0Ly8gSW5pdGlhbGlzZWQgZG9tIGZvciB0aGUgZ3V0dGVyXG5cdFx0dGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tZ3V0dGVyXCIgKyAodGhpcy5jb25maWcuY2xhc3MgPyBcIiBcIiArIHRoaXMuY29uZmlnLmNsYXNzIDogXCJcIik7XG5cdFx0Zm9yIChjb25zdCBwcm9wIGluIGNvbmZpZy5kb21FdmVudEhhbmRsZXJzKSB7XG5cdFx0XHR0aGlzLmRvbS5hZGRFdmVudExpc3RlbmVyKHByb3AsIChldmVudDogRXZlbnQpID0+IHtcblx0XHRcdFx0bGV0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgeTtcblx0XHRcdFx0aWYgKHRhcmdldCAhPSB0aGlzLmRvbSAmJiB0aGlzLmRvbS5jb250YWlucyh0YXJnZXQpKSB7XG5cdFx0XHRcdFx0d2hpbGUgKHRhcmdldC5wYXJlbnROb2RlICE9IHRoaXMuZG9tKSB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcblx0XHRcdFx0XHRjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0XHRcdHkgPSAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHkgPSAoZXZlbnQgYXMgTW91c2VFdmVudCkuY2xpZW50WTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBsaW5lID0gdmlldy5saW5lQmxvY2tBdEhlaWdodCh5IC0gdmlldy5kb2N1bWVudFRvcCk7XG5cdFx0XHRcdGlmIChjb25maWcuZG9tRXZlbnRIYW5kbGVyc1twcm9wXSh2aWV3LCBsaW5lLCBldmVudCkpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyBDb25zdHJ1Y3RzIG1hcmtlcnMgYXMgcmFuZ2VTZXRcblx0XHR0aGlzLm1hcmtlcnMgPSBhc0FycmF5KGNvbmZpZy5tYXJrZXJzKHZpZXcpKTtcblx0XHRpZiAoY29uZmlnLmluaXRpYWxTcGFjZXIpIHtcblx0XHRcdHRoaXMuc3BhY2VyID0gbmV3IEd1dHRlckVsZW1lbnQodmlldywgMCwgMCwgW2NvbmZpZy5pbml0aWFsU3BhY2VyKHZpZXcpXSk7XG5cdFx0XHR0aGlzLmRvbS5hcHBlbmRDaGlsZCh0aGlzLnNwYWNlci5kb20pO1xuXHRcdFx0dGhpcy5zcGFjZXIuZG9tLnN0eWxlLmNzc1RleHQgKz0gXCJ2aXNpYmlsaXR5OiBoaWRkZW47IHBvaW50ZXItZXZlbnRzOiBub25lXCI7XG5cdFx0fVxuXHR9XG5cblx0dXBkYXRlKHVwZGF0ZTogVmlld1VwZGF0ZSkge1xuXHRcdGNvbnN0IHByZXZNYXJrZXJzID0gdGhpcy5tYXJrZXJzO1xuXHRcdHRoaXMubWFya2VycyA9IGFzQXJyYXkodGhpcy5jb25maWcubWFya2Vycyh1cGRhdGUudmlldykpO1xuXHRcdGlmICh0aGlzLnNwYWNlciAmJiB0aGlzLmNvbmZpZy51cGRhdGVTcGFjZXIpIHtcblx0XHRcdGNvbnN0IHVwZGF0ZWQgPSB0aGlzLmNvbmZpZy51cGRhdGVTcGFjZXIodGhpcy5zcGFjZXIubWFya2Vyc1swXSwgdXBkYXRlKTtcblx0XHRcdGlmICh1cGRhdGVkICE9IHRoaXMuc3BhY2VyLm1hcmtlcnNbMF0pIHRoaXMuc3BhY2VyLnVwZGF0ZSh1cGRhdGUudmlldywgMCwgMCwgW3VwZGF0ZWRdKTtcblx0XHR9XG5cdFx0Y29uc3QgdnAgPSB1cGRhdGUudmlldy52aWV3cG9ydDtcblx0XHRyZXR1cm4gIVJhbmdlU2V0LmVxKHRoaXMubWFya2VycywgcHJldk1hcmtlcnMsIHZwLmZyb20sIHZwLnRvKSB8fFxuXHRcdFx0KHRoaXMuY29uZmlnLmxpbmVNYXJrZXJDaGFuZ2UgPyB0aGlzLmNvbmZpZy5saW5lTWFya2VyQ2hhbmdlKHVwZGF0ZSkgOiBmYWxzZSk7XG5cdH1cblxuXHRkZXN0cm95KCkge1xuXHRcdGZvciAoY29uc3QgZWx0IG9mIHRoaXMuZWxlbWVudHMpIGVsdC5kZXN0cm95KCk7XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIEd1dHRlclZpZXcge1xuXHRndXR0ZXJzOiBTaW5nbGVHdXR0ZXJWaWV3W107XG5cdGRvbTogSFRNTEVsZW1lbnQ7XG5cdGZpeGVkOiBib29sZWFuO1xuXHRwcmV2Vmlld3BvcnQ6IHsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH07XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cmVhZG9ubHkgdmlldzogRWRpdG9yVmlldyxcblx0XHRwdWJsaWMgdW5maXhHdXR0ZXJzOiBGYWNldDxib29sZWFuLCBib29sZWFuPixcblx0XHRwdWJsaWMgYWN0aXZlR3V0dGVyczogRmFjZXQ8UmVxdWlyZWQ8R3V0dGVyQ29uZmlnPj4sXG5cdCkge1xuXHRcdHRoaXMucHJldlZpZXdwb3J0ID0gdmlldy52aWV3cG9ydDtcblx0XHR0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1ndXR0ZXJzXCI7XG5cdFx0Ly8gVE9ETzogQ2hlY2sgaWYgdGhlcmUgaXMgYSB3YXkgdG8gcmVzcGVjdCB0aGlzIGF0dHJpYnV0ZVxuXHRcdC8vIE1PRElGSUNBVElPTjogUmVtb3ZlZCBhcmlhLWhpZGRlbiBhdHRyaWJ1dGUsIHNpbmNlIGFubm90YXRpb25zIGNhbiBjbGFpbSBmb2N1cyAob24gdGhlaXIgaW5wdXRzKVxuXHRcdC8vIHRoaXMuZG9tLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcblx0XHR0aGlzLmRvbS5zdHlsZS5taW5IZWlnaHQgPSAodGhpcy52aWV3LmNvbnRlbnRIZWlnaHQgLyoqIC8gdGhpcy52aWV3LnNjYWxlWSovKSArIFwicHhcIjtcblx0XHR0aGlzLmd1dHRlcnMgPSB0aGlzLmNyZWF0ZUd1dHRlcnModmlldyk7XG5cdFx0Zm9yIChjb25zdCBndXR0ZXIgb2YgdGhpcy5ndXR0ZXJzKSB0aGlzLmRvbS5hcHBlbmRDaGlsZChndXR0ZXIuZG9tKTtcblx0XHR0aGlzLmZpeGVkID0gIXZpZXcuc3RhdGUuZmFjZXQodGhpcy51bmZpeEd1dHRlcnMpO1xuXHRcdGlmICh0aGlzLmZpeGVkKSB7XG5cdFx0XHQvLyBGSVhNRSBJRTExIGZhbGxiYWNrLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgcG9zaXRpb246IHN0aWNreSxcblx0XHRcdC8vIFx0YnkgdXNpbmcgcG9zaXRpb246IHJlbGF0aXZlICsgZXZlbnQgaGFuZGxlcnMgdGhhdCByZWFsaWduIHRoZVxuXHRcdFx0Ly8gXHRndXR0ZXIgKG9yIGp1c3QgZm9yY2UgZml4ZWQ9ZmFsc2Ugb24gSUUxMT8pXG5cdFx0XHR0aGlzLmRvbS5zdHlsZS5wb3NpdGlvbiA9IFwic3RpY2t5XCI7XG5cdFx0fVxuXHRcdHRoaXMuc3luY0d1dHRlcnMoZmFsc2UpO1xuXHRcdHRoaXMuaW5zZXJ0R3V0dGVycyh2aWV3KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNT0RJRklDQVRJT046IEV4dHJhY3RlZCBndXR0ZXJzIGNyZWF0aW9uIHNvIGl0IGNhbiBiZSBvdmVycmlkZGVuXG5cdCAqL1xuXHRjcmVhdGVHdXR0ZXJzKHZpZXc6IEVkaXRvclZpZXcpIHtcblx0XHRyZXR1cm4gdmlldy5zdGF0ZS5mYWNldCh0aGlzLmFjdGl2ZUd1dHRlcnMpLm1hcChjb25mID0+IG5ldyBTaW5nbGVHdXR0ZXJWaWV3KHZpZXcsIGNvbmYpKTtcblx0fVxuXG5cdC8vIFx0XHRjb25zdCBhZnRlciA9IHRoaXMuZG9tLm5leHRTaWJsaW5nO1xuXHQvLyBcdFx0XHRhZnRlciEucGFyZW50Tm9kZSEuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLCBhZnRlcik7XG5cblx0LyoqXG5cdCAqIE1PRElGSUNBVElPTjogRXh0cmFjdGVkIGluc2VydCBtZXRob2Qgc28gaXQgY2FuIGJlIG92ZXJyaWRkZW5cblx0ICovXG5cdGluc2VydEd1dHRlcnModmlldzogRWRpdG9yVmlldykge1xuXHRcdHZpZXcuY29udGVudERPTS5wYXJlbnROb2RlIS5pbnNlcnRCZWZvcmUodGhpcy5kb20sIHZpZXcuY29udGVudERPTSk7XG5cdH1cblxuXHRpbnNlcnREZXRhY2hlZEd1dHRlcnMoYWZ0ZXI6IEhUTUxFbGVtZW50KSB7XG5cdFx0YWZ0ZXIhLnBhcmVudE5vZGUhLmluc2VydEJlZm9yZSh0aGlzLmRvbSwgYWZ0ZXIpO1xuXHR9XG5cblx0Z2V0VXBkYXRlQ29udGV4dHMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ3V0dGVycy5tYXAoZ3V0dGVyID0+XG5cdFx0XHRuZXcgVXBkYXRlQ29udGV4dChndXR0ZXIsIHRoaXMudmlldy52aWV3cG9ydCwgLXRoaXMudmlldy5kb2N1bWVudFBhZGRpbmcudG9wKVxuXHRcdCk7XG5cdH1cblxuXHR1cGRhdGUodXBkYXRlOiBWaWV3VXBkYXRlKSB7XG5cdFx0Ly8gdXBkYXRlR3V0dGVycyBleGVjdXRlcyB0aGUgdmlld1VwZGF0ZSBvbiB0aGUgYWN0aXZlIGd1dHRlcnNcblx0XHRpZiAodGhpcy51cGRhdGVHdXR0ZXJzKHVwZGF0ZSkpIHtcblx0XHRcdC8vIElmIChhbmQgb25seSBpZikgdGhlIGd1dHRlcnMgaGF2ZSBjaGFuZ2VkIGluIGEgbWVhbmluZ2Z1bCB3YXkgLS0gaS5lLiBtYXJrZXJzIGdvdCByZW1vdmVkL2FkZGVkIHdpdGhpbiBTaW5nbGVHdXR0ZXJWaWV3XG5cdFx0XHQvLyBUaGVuIG5lZWQgdG8gcmVyZW5kZXIgdGhlc2UgcG9zaXRpb25zXG5cblx0XHRcdC8qKiBEZXRhY2ggZHVyaW5nIHN5bmMgd2hlbiB0aGUgdmlld3BvcnQgY2hhbmdlZCBzaWduaWZpY2FudGx5XG5cdFx0XHQgKiBcdChzdWNoIGFzIGR1cmluZyBzY3JvbGxpbmcpLCBzaW5jZSBmb3IgbGFyZ2UgdXBkYXRlcyB0aGF0IGlzIGZhc3Rlci5cblx0XHRcdCAqL1xuXHRcdFx0Y29uc3QgdnBBID0gdGhpcy5wcmV2Vmlld3BvcnQsIHZwQiA9IHVwZGF0ZS52aWV3LnZpZXdwb3J0O1xuXHRcdFx0Y29uc3QgdnBPdmVybGFwID0gTWF0aC5taW4odnBBLnRvLCB2cEIudG8pIC0gTWF0aC5tYXgodnBBLmZyb20sIHZwQi5mcm9tKTtcblx0XHRcdHRoaXMuc3luY0d1dHRlcnModnBPdmVybGFwIDwgKHZwQi50byAtIHZwQi5mcm9tKSAqIDAuOCk7XG5cdFx0fVxuXHRcdGlmICh1cGRhdGUuZ2VvbWV0cnlDaGFuZ2VkKSB0aGlzLmRvbS5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLnZpZXcuY29udGVudEhlaWdodCArIFwicHhcIjtcblx0XHRpZiAodGhpcy52aWV3LnN0YXRlLmZhY2V0KHRoaXMudW5maXhHdXR0ZXJzKSAhPSAhdGhpcy5maXhlZCkge1xuXHRcdFx0dGhpcy5maXhlZCA9ICF0aGlzLmZpeGVkO1xuXHRcdFx0dGhpcy5kb20uc3R5bGUucG9zaXRpb24gPSB0aGlzLmZpeGVkID8gXCJzdGlja3lcIiA6IFwiXCI7XG5cdFx0fVxuXHRcdHRoaXMucHJldlZpZXdwb3J0ID0gdXBkYXRlLnZpZXcudmlld3BvcnQ7XG5cdH1cblxuXHRzeW5jR3V0dGVycyhkZXRhY2g6IGJvb2xlYW4pIHtcblx0XHQvLyBEZXRhY2ggaXMgYWxtb3N0IGFsd2F5cyB0cnVlIGV4Y2VwdCBmb3IgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgZnVuY3Rpb24gKD8pXG5cblx0XHQvLyBhZnRlciBpcyBhIGhpZGRlbiBlbGVtZW50IEFGVEVSIHRoZSBndXR0ZXIgY29udGFpbmluZyBub3RoaW5nXG5cdFx0Ly8gTm90IHN1cmUgd2hhdCB0aGUgdXNhZ2UgaXNcblx0XHRjb25zdCBhZnRlciA9IHRoaXMuZG9tLm5leHRTaWJsaW5nO1xuXG5cdFx0Ly8gQWx3YXlzIGRldGFjaCAtPiBBbHdheXMgZnVsbHkgcmVyZW5kZXIgYWxsIFNpbmdsZUd1dHRlclZpZXdzIGFuZCAnYmlnJyBndXR0ZXJcblx0XHRpZiAoZGV0YWNoKSB0aGlzLmRvbS5yZW1vdmUoKTtcblxuXHRcdGNvbnN0IGxpbmVDbGFzc2VzID0gUmFuZ2VTZXQuaXRlcih0aGlzLnZpZXcuc3RhdGUuZmFjZXQoZ3V0dGVyTGluZUNsYXNzKSwgdGhpcy52aWV3LnZpZXdwb3J0LmZyb20pO1xuXHRcdGxldCBjbGFzc1NldDogR3V0dGVyTWFya2VyW10gPSBbXTtcblxuXHRcdC8vIFByZXBhcmVzIGNvbnRleHQgZm9yIGVhY2ggZ3V0dGVyICh3aXRoIGluZGl2aWR1YWwgY3Vyc29yLCBoZWlnaHQgYW5kIC4uLilcblx0XHRjb25zdCBjb250ZXh0cyA9IHRoaXMuZ2V0VXBkYXRlQ29udGV4dHMoKTtcblxuXHRcdC8vIExvb3Agb3ZlciBhbGwgYmxvY2tzIChsaW5lcykgaW4gdGhlIHZpZXdwb3J0XG5cdFx0Zm9yIChjb25zdCBsaW5lIG9mIHRoaXMudmlldy52aWV3cG9ydExpbmVCbG9ja3MpIHtcblx0XHRcdGlmIChjbGFzc1NldC5sZW5ndGgpIGNsYXNzU2V0ID0gW107XG5cblx0XHRcdC8vID8/PyBJZiBsaW5lIGNvbnNpc3RzIG9mIG11bHRpcGxlIGJsb2NrcywgZG9lcyBub3QgaGFwcGVuXG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShsaW5lLnR5cGUpKSB7XG5cdFx0XHRcdGxldCBmaXJzdCA9IHRydWU7XG5cdFx0XHRcdGZvciAoY29uc3QgYiBvZiBsaW5lLnR5cGUpIHtcblx0XHRcdFx0XHRpZiAoYi50eXBlID09IEJsb2NrVHlwZS5UZXh0ICYmIGZpcnN0KSB7XG5cdFx0XHRcdFx0XHRhZHZhbmNlQ3Vyc29yKGxpbmVDbGFzc2VzLCBjbGFzc1NldCwgYi5mcm9tKTtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgY3ggb2YgY29udGV4dHMpXG5cdFx0XHRcdFx0XHRcdGN4LmxpbmUodGhpcy52aWV3LCBiLCBjbGFzc1NldCk7XG5cdFx0XHRcdFx0XHRmaXJzdCA9IGZhbHNlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYi53aWRnZXQpIHtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgY3ggb2YgY29udGV4dHMpXG5cdFx0XHRcdFx0XHRcdGN4LndpZGdldCh0aGlzLnZpZXcsIGIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSAvLyBJZiBibG9jayBjb25zaXN0cyBvZiB0ZXh0XG5cdFx0XHRlbHNlIGlmIChsaW5lLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQpIHtcblx0XHRcdFx0YWR2YW5jZUN1cnNvcihsaW5lQ2xhc3NlcywgY2xhc3NTZXQsIGxpbmUuZnJvbSk7XG5cdFx0XHRcdGZvciAoY29uc3QgY3ggb2YgY29udGV4dHMpXG5cdFx0XHRcdFx0Y3gubGluZSh0aGlzLnZpZXcsIGxpbmUsIGNsYXNzU2V0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZWxzZSBpZiAobGluZS53aWRnZXQpIHtcblx0XHRcdC8vIFx0Zm9yIChjb25zdCBjeCBvZiBjb250ZXh0cylcblx0XHRcdC8vIFx0XHRjeC53aWRnZXQodGhpcy52aWV3LCBsaW5lKTtcblx0XHRcdC8vIH1cblx0XHR9XG5cblx0XHQvLyA/Pz9cblx0XHRmb3IgKGNvbnN0IGN4IG9mIGNvbnRleHRzKVxuXHRcdFx0Y3guZmluaXNoKCk7XG5cblx0XHQvLyBSZS1pbnNlcnQgdGhlIERPTSBndXR0ZXJcblx0XHRpZiAoZGV0YWNoKVxuXHRcdFx0dGhpcy5pbnNlcnREZXRhY2hlZEd1dHRlcnMoYWZ0ZXIgYXMgSFRNTEVsZW1lbnQpO1xuXHR9XG5cblx0dXBkYXRlR3V0dGVycyh1cGRhdGU6IFZpZXdVcGRhdGUpIHtcblx0XHRjb25zdCBwcmV2ID0gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQodGhpcy5hY3RpdmVHdXR0ZXJzKTtcblx0XHRjb25zdCBjdXIgPSB1cGRhdGUuc3RhdGUuZmFjZXQodGhpcy5hY3RpdmVHdXR0ZXJzKTtcblx0XHRsZXQgY2hhbmdlID0gdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLmhlaWdodENoYW5nZWQgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fFxuXHRcdFx0IVJhbmdlU2V0LmVxKFxuXHRcdFx0XHR1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChndXR0ZXJMaW5lQ2xhc3MpLFxuXHRcdFx0XHR1cGRhdGUuc3RhdGUuZmFjZXQoZ3V0dGVyTGluZUNsYXNzKSxcblx0XHRcdFx0dXBkYXRlLnZpZXcudmlld3BvcnQuZnJvbSxcblx0XHRcdFx0dXBkYXRlLnZpZXcudmlld3BvcnQudG8sXG5cdFx0XHQpO1xuXHRcdGlmIChwcmV2ID09IGN1cikge1xuXHRcdFx0Ly8gVXBkYXRlcyBhbGwgZ3V0dGVycywgcmVzdWx0cyBpbiBzeW5jR3V0dGVycyBpZiBjaGFuZ2UgPT09IFRydWVcblx0XHRcdGZvciAoY29uc3QgZ3V0dGVyIG9mIHRoaXMuZ3V0dGVycykge1xuXHRcdFx0XHRpZiAoZ3V0dGVyLnVwZGF0ZSh1cGRhdGUpKVxuXHRcdFx0XHRcdGNoYW5nZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRoaXMgY29kZSBvbmx5IGV4ZWN1dGVzIG9uIGd1dHRlciBiZWluZyBhZGRlZCBvciByZW1vdmVkIChzcGVjaWZpY2FsbHk6IHN3aXRjaGluZyBzb3VyY2UvTFAgbW9kZT8pXG5cdFx0XHRjaGFuZ2UgPSB0cnVlO1xuXHRcdFx0Y29uc3QgZ3V0dGVycyA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCBjb25mIG9mIGN1cikge1xuXHRcdFx0XHRjb25zdCBrbm93biA9IHByZXYuaW5kZXhPZihjb25mKTtcblx0XHRcdFx0aWYgKGtub3duIDwgMClcblx0XHRcdFx0XHRndXR0ZXJzLnB1c2gobmV3IFNpbmdsZUd1dHRlclZpZXcodGhpcy52aWV3LCBjb25mKSk7XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZ3V0dGVyc1trbm93bl0udXBkYXRlKHVwZGF0ZSk7XG5cdFx0XHRcdFx0Z3V0dGVycy5wdXNoKHRoaXMuZ3V0dGVyc1trbm93bl0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGNvbnN0IGcgb2YgdGhpcy5ndXR0ZXJzKSB7XG5cdFx0XHRcdGcuZG9tLnJlbW92ZSgpO1xuXHRcdFx0XHRpZiAoZ3V0dGVycy5pbmRleE9mKGcpIDwgMClcblx0XHRcdFx0XHRnLmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHRcdGZvciAoY29uc3QgZyBvZiBndXR0ZXJzKVxuXHRcdFx0XHR0aGlzLmRvbS5hcHBlbmRDaGlsZChnLmRvbSk7XG5cdFx0XHR0aGlzLmd1dHRlcnMgPSBndXR0ZXJzO1xuXHRcdH1cblx0XHRyZXR1cm4gY2hhbmdlO1xuXHR9XG5cblx0ZGVzdHJveSgpIHtcblx0XHRmb3IgKGNvbnN0IHZpZXcgb2YgdGhpcy5ndXR0ZXJzKSB2aWV3LmRlc3Ryb3koKTtcblx0XHR0aGlzLmRvbS5yZW1vdmUoKTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR3V0dGVyVmlld1BsdWdpbjxUIGV4dGVuZHMgR3V0dGVyVmlldz4oY2xzOiB7IG5ldyh2aWV3OiBFZGl0b3JWaWV3KTogVCB9KSB7XG5cdHJldHVybiBWaWV3UGx1Z2luLmZyb21DbGFzcyhjbHMsIHtcblx0XHRwcm92aWRlOiBwbHVnaW4gPT5cblx0XHRcdEVkaXRvclZpZXcuc2Nyb2xsTWFyZ2lucy5vZih2aWV3ID0+IHtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSB2aWV3LnBsdWdpbihwbHVnaW4pO1xuXHRcdFx0XHRpZiAoIXZhbHVlIHx8IHZhbHVlLmd1dHRlcnMubGVuZ3RoID09IDAgfHwgIXZhbHVlLmZpeGVkKSByZXR1cm4gbnVsbDtcblx0XHRcdFx0cmV0dXJuIHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSID9cblx0XHRcdFx0XHR7IGxlZnQ6IHZhbHVlLmRvbS5vZmZzZXRXaWR0aCAvKiogKiB2aWV3LnNjYWxlWCovIH0gOlxuXHRcdFx0XHRcdHsgcmlnaHQ6IHZhbHVlLmRvbS5vZmZzZXRXaWR0aCAvKiogKiB2aWV3LnNjYWxlWCovIH07XG5cdFx0XHR9KSxcblx0fSk7XG59XG5cbi8qKiBUaGUgZ3V0dGVyLWRyYXdpbmcgcGx1Z2luIGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCB3aGVuIHlvdSBhZGQgYVxuIGd1dHRlciwgYnV0IHlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gZXhwbGljaXRseSBjb25maWd1cmUgaXQuXG5cbiBVbmxlc3MgYGZpeGVkYCBpcyBleHBsaWNpdGx5IHNldCB0byBgZmFsc2VgLCB0aGUgZ3V0dGVycyBhcmVcbiBmaXhlZCwgbWVhbmluZyB0aGV5IGRvbid0IHNjcm9sbCBhbG9uZyB3aXRoIHRoZSBjb250ZW50XG4gaG9yaXpvbnRhbGx5IChleGNlcHQgb24gSW50ZXJuZXQgRXhwbG9yZXIsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydFxuIENTUyBbYHBvc2l0aW9uOlxuIHN0aWNreWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9wb3NpdGlvbiNzdGlja3kpKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUd1dHRlckV4dGVuc2lvbihcblx0dmlld3BsdWdpbjogVmlld1BsdWdpbjxHdXR0ZXJWaWV3Pixcblx0Y29uZmlnPzogeyBmaXhlZD86IGJvb2xlYW4gfSxcblx0dW5maXhHdXR0ZXJzPzogRmFjZXQ8Ym9vbGVhbiwgYm9vbGVhbj4sXG4pIHtcblx0Y29uc3QgcmVzdWx0OiBFeHRlbnNpb25bXSA9IFtcblx0XHR2aWV3cGx1Z2luLFxuXHRdO1xuXHRpZiAoY29uZmlnICYmIGNvbmZpZy5maXhlZCA9PT0gZmFsc2UpIHJlc3VsdC5wdXNoKHVuZml4R3V0dGVycyEub2YodHJ1ZSkpO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogRGVmaW5lIGFuIGVkaXRvciBndXR0ZXIuIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgZ3V0dGVycyBhcHBlYXIgaXNcbiBkZXRlcm1pbmVkIGJ5IHRoZWlyIGV4dGVuc2lvbiBwcmlvcml0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUd1dHRlcihcblx0dmlld3BsdWdpbjogVmlld1BsdWdpbjxHdXR0ZXJWaWV3Pixcblx0Y29uZmlnOiBHdXR0ZXJDb25maWcsXG5cdGFjdGl2ZUd1dHRlcnM6IEZhY2V0PFJlcXVpcmVkPEd1dHRlckNvbmZpZz4+LFxuXHR1bmZpeEd1dHRlcnM6IEZhY2V0PGJvb2xlYW4sIGJvb2xlYW4+LFxuKSB7XG5cdHJldHVybiBbY3JlYXRlR3V0dGVyRXh0ZW5zaW9uKHZpZXdwbHVnaW4sIHt9LCB1bmZpeEd1dHRlcnMpLCBhY3RpdmVHdXR0ZXJzLm9mKHsgLi4uZGVmYXVsdHMsIC4uLmNvbmZpZyB9KV07XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBFZGl0b3JTdGF0ZSwgUmFuZ2UsIFJhbmdlU2V0LCBTdGF0ZUZpZWxkIH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgeyBFZGl0b3JWaWV3LCBHdXR0ZXJNYXJrZXIgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIGVkaXRvckVkaXRvckZpZWxkLCBlZGl0b3JJbmZvRmllbGQsIE1hcmtkb3duUmVuZGVyZXIsIE1lbnUsIE5vdGljZSB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgeyBFbWJlZGRhYmxlTWFya2Rvd25FZGl0b3IgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdWkvZW1iZWRkYWJsZS1lZGl0b3JcIjtcblxuaW1wb3J0IHsgYWNjZXB0U3VnZ2VzdGlvbnMsIGFkZENvbW1lbnRUb1ZpZXcsIENyaXRpY01hcmt1cFJhbmdlLCByYW5nZVBhcnNlciwgcmVqZWN0U3VnZ2VzdGlvbnMsIFN1Z2dlc3Rpb25UeXBlIH0gZnJvbSBcIi4uLy4uLy4uL2Jhc2VcIjtcbmltcG9ydCB7IGNyZWF0ZV9yYW5nZSB9IGZyb20gXCIuLi8uLi8uLi9iYXNlL2VkaXQtdXRpbC9yYW5nZS1jcmVhdGVcIjtcblxuaW1wb3J0IHsgQW5ub3RhdGlvbkluY2x1c2lvblR5cGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uR3V0dGVySW5jbHVkZWRUeXBlcywgYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXNTdGF0ZSB9IGZyb20gXCIuLi8uLi8uLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgYW5ub3RhdGlvbkd1dHRlckZvY3VzVGhyZWFkQW5ub3RhdGlvbiwgYW5ub3RhdGlvbkd1dHRlckZvbGRBbm5vdGF0aW9uIH0gZnJvbSBcIi4vYW5ub3RhdGlvbi1ndXR0ZXJcIjtcblxuaW1wb3J0IHsgc3RpY2t5Q29udGV4dE1lbnVQYXRjaCB9IGZyb20gXCIuLi8uLi8uLi8uLi9wYXRjaGVzXCI7XG5cbmNsYXNzIEFubm90YXRpb25Ob2RlIGV4dGVuZHMgQ29tcG9uZW50IHtcblx0dGV4dDogc3RyaW5nO1xuXHRuZXdfdGV4dDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cdGFubm90YXRpb25fY29udGFpbmVyOiBIVE1MRWxlbWVudDtcblx0bWV0YWRhdGFfdmlldzogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblx0YW5ub3RhdGlvbl92aWV3OiBIVE1MRWxlbWVudDtcblxuXHRjdXJyZW50TW9kZTogXCJwcmV2aWV3XCIgfCBcInNvdXJjZVwiIHwgbnVsbCA9IG51bGw7XG5cdGVkaXRNb2RlOiBFbWJlZGRhYmxlTWFya2Rvd25FZGl0b3IgfCBudWxsID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlLCBwdWJsaWMgbWFya2VyOiBBbm5vdGF0aW9uTWFya2VyKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudGV4dCA9IHJhbmdlLnVud3JhcCgpO1xuXG5cdFx0dGhpcy5hbm5vdGF0aW9uX2NvbnRhaW5lciA9IHRoaXMubWFya2VyLmFubm90YXRpb25fdGhyZWFkLmNyZWF0ZURpdih7IGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLWFubm90YXRpb25cIiB9KTtcblx0XHR0aGlzLmFubm90YXRpb25fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMucmVuZGVyUHJldmlldy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmFubm90YXRpb25fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLCB0aGlzLnJlbmRlclNvdXJjZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmFubm90YXRpb25fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLm9uQ29tbWVudENvbnRleHRtZW51LmJpbmQodGhpcykpO1xuXG5cdFx0aWYgKHRoaXMucmFuZ2UubWV0YWRhdGEpXG5cdFx0XHR0aGlzLnJlbmRlck1ldGFkYXRhKCk7XG5cblx0XHR0aGlzLmFubm90YXRpb25fdmlldyA9IHRoaXMuYW5ub3RhdGlvbl9jb250YWluZXIuY3JlYXRlRGl2KHsgY2xzOiBcImNtdHItYW5uby1ndXR0ZXItYW5ub3RhdGlvbi12aWV3XCIgfSk7XG5cdFx0dGhpcy5yZW5kZXJQcmV2aWV3KCk7XG5cdH1cblxuXHRvbmxvYWQoKSB7XG5cdFx0c3VwZXIub25sb2FkKCk7XG5cdH1cblxuXHRvbnVubG9hZCgpIHtcblx0XHRzdXBlci5vbnVubG9hZCgpO1xuXG5cdFx0dGhpcy5hbm5vdGF0aW9uX2NvbnRhaW5lci5yZW1vdmUoKTtcblx0XHR0aGlzLmVkaXRNb2RlID0gbnVsbDtcblx0fVxuXG5cdHJlbmRlck1ldGFkYXRhKCkge1xuXHRcdHRoaXMubWV0YWRhdGFfdmlldyA9IHRoaXMuYW5ub3RhdGlvbl9jb250YWluZXIuY3JlYXRlRGl2KHsgY2xzOiBcImNtdHItYW5uby1ndXR0ZXItYW5ub3RhdGlvbi1tZXRhZGF0YVwiIH0pO1xuXHRcdGlmICh0aGlzLnJhbmdlLmZpZWxkcy5hdXRob3IpIHtcblx0XHRcdGNvbnN0IGF1dGhvckxhYmVsID0gY3JlYXRlU3Bhbih7XG5cdFx0XHRcdGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLWFubm90YXRpb24tYXV0aG9yLWxhYmVsXCIsXG5cdFx0XHRcdHRleHQ6IFwiQXV0aG9yOiBcIixcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5tZXRhZGF0YV92aWV3LmFwcGVuZENoaWxkKGF1dGhvckxhYmVsKTtcblxuXHRcdFx0Y29uc3QgYXV0aG9yID0gY3JlYXRlU3Bhbih7XG5cdFx0XHRcdGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLWFubm90YXRpb24tYXV0aG9yLW5hbWVcIixcblx0XHRcdFx0dGV4dDogdGhpcy5yYW5nZS5maWVsZHMuYXV0aG9yLFxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLm1ldGFkYXRhX3ZpZXcuYXBwZW5kQ2hpbGQoYXV0aG9yKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5yYW5nZS5maWVsZHMudGltZSkge1xuXHRcdFx0aWYgKHRoaXMubWV0YWRhdGFfdmlldy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbnN0IHNlcGFyYXRvciA9IGNyZWF0ZVNwYW4oe1xuXHRcdFx0XHRcdGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLWFubm90YXRpb24tbWV0YWRhdGEtc2VwYXJhdG9yXCIsXG5cdFx0XHRcdFx0dGV4dDogXCIgXHUyMDIyIFwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5tZXRhZGF0YV92aWV3LmFwcGVuZENoaWxkKHNlcGFyYXRvcik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHRpbWVMYWJlbCA9IGNyZWF0ZVNwYW4oe1xuXHRcdFx0XHRjbHM6IFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uLXRpbWUtbGFiZWxcIixcblx0XHRcdFx0dGV4dDogXCJVcGRhdGVkIGF0OiBcIixcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5tZXRhZGF0YV92aWV3LmFwcGVuZENoaWxkKHRpbWVMYWJlbCk7XG5cblx0XHRcdGNvbnN0IHRpbWUgPSBjcmVhdGVTcGFuKHtcblx0XHRcdFx0Y2xzOiBcImNtdHItYW5uby1ndXR0ZXItYW5ub3RhdGlvbi10aW1lXCIsXG5cdFx0XHRcdHRleHQ6IHdpbmRvdy5tb21lbnQudW5peCh0aGlzLnJhbmdlLmZpZWxkcy50aW1lISkuZm9ybWF0KFwiTU1NIEREIFlZWVksIEhIOm1tXCIpLFxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLm1ldGFkYXRhX3ZpZXcuYXBwZW5kQ2hpbGQodGltZSk7XG5cdFx0fVxuXHR9XG5cblx0cmVuZGVyU291cmNlKGU/OiBNb3VzZUV2ZW50KSB7XG5cdFx0aWYgKHRoaXMucmFuZ2UudHlwZSAhPT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCkge1xuXHRcdFx0Ly8gVE9ETzogU2hvdWxkIGVkaXRpbmcgbm9uLWNvbW1lbnRzIHdpdGhpbiB0aGUgYW5ub3RhdGlvbiBndXR0ZXIgYmUgYWxsb3dlZD9cblx0XHRcdG5ldyBOb3RpY2UoXCJbQ29tbWVudGF0b3JdIFlvdSBjYW4gb25seSBlZGl0IGNvbW1lbnRzLlwiKVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRlPy5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdGlmICh0aGlzLmN1cnJlbnRNb2RlID09PSBcInNvdXJjZVwiKSByZXR1cm47XG5cblx0XHRcdGNvbnN0IHsgYXBwIH0gPSB0aGlzLm1hcmtlci52aWV3LnN0YXRlLmZpZWxkKGVkaXRvckluZm9GaWVsZCk7XG5cdFx0XHR0aGlzLmFubm90YXRpb25fY29udGFpbmVyLnRvZ2dsZUNsYXNzKFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uLWVkaXRpbmdcIiwgdHJ1ZSk7XG5cdFx0XHRpZiAodGhpcy5yYW5nZS5maWVsZHMuYXV0aG9yICYmIHRoaXMucmFuZ2UuZmllbGRzLmF1dGhvciAhPT0gYXBwLnBsdWdpbnMucGx1Z2lucy5jb21tZW50YXRvci5zZXR0aW5ncy5hdXRob3IpIHtcblx0XHRcdFx0bmV3IE5vdGljZShcIltDb21tZW50YXRvcl0gWW91IGNhbm5vdCBlZGl0IGNvbW1lbnRzIGZyb20gb3RoZXIgYXV0aG9ycy5cIik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5hbm5vdGF0aW9uX3ZpZXcuZW1wdHkoKTtcblx0XHRcdHRoaXMuZWRpdE1vZGUgPSB0aGlzLmFkZENoaWxkKFxuXHRcdFx0XHRuZXcgRW1iZWRkYWJsZU1hcmtkb3duRWRpdG9yKGFwcCwgdGhpcy5hbm5vdGF0aW9uX3ZpZXcsIHtcblx0XHRcdFx0XHR2YWx1ZTogdGhpcy50ZXh0LFxuXHRcdFx0XHRcdGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLWFubm90YXRpb24tZWRpdG9yXCIsXG5cdFx0XHRcdFx0b25TdWJtaXQ6IChlZGl0b3IpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMubmV3X3RleHQgPSBlZGl0b3IuZ2V0KCk7XG5cdFx0XHRcdFx0XHR0aGlzLnJlbmRlclByZXZpZXcoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdC8vIFRPRE86IEdldCBhIHJlZmVyZW5jZSB0byB0aGUgcGx1Z2luIHNvbWVob3dcblx0XHRcdFx0XHRmaWx0ZXJlZEV4dGVuc2lvbnM6IFthcHAucGx1Z2lucy5wbHVnaW5zW1wiY29tbWVudGF0b3JcIl0uZWRpdG9yRXh0ZW5zaW9uc10sXG5cdFx0XHRcdFx0b25CbHVyOiB0aGlzLnJlbmRlclByZXZpZXcuYmluZCh0aGlzKSxcblx0XHRcdFx0fSksXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5jdXJyZW50TW9kZSA9IFwic291cmNlXCI7XG5cdFx0fVxuXHR9XG5cblx0cmVuZGVyUHJldmlldygpIHtcblx0XHRpZiAodGhpcy5jdXJyZW50TW9kZSA9PT0gXCJwcmV2aWV3XCIpIHJldHVybjtcblxuXHRcdC8vIEZJWE1FOiBPbiBhY2NlcHRpbmcgYSBuZXcgY29tbWVudCAob24gbW9kK2VudGVyKSwgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB0d2ljZVxuXHRcdC8vICAgIE9uY2UgZm9yIHRoZSBpbW1lZGlhdGUgdXNlciBldmVudFxuXHRcdC8vICAgIEFuZCBhZ2FpbiB3aGVuIHRoZSBjb21tZW50cyBnZXQgdXBkYXRlZFxuXHRcdC8vICAgIC0+IFRoaXMgY2F1c2VkIGFuIGlzc3VlIHdoZXJlIHRoZSByYW5nZSBnZXRzIGFkZGVkIHR3aWNlLCB0ZW1wb3JhcmlseSBmaXhlZCBieSBzZXR0aW5nIHRleHQgdG8gbmV3IHRleHRcblx0XHR0aGlzLmFubm90YXRpb25fY29udGFpbmVyLnRvZ2dsZUNsYXNzKFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uLWVkaXRpbmdcIiwgZmFsc2UpO1xuXG5cdFx0Ly8gRVhQTDogUmVndWxhciAocmUtKXJlbmRlcmluZyBvZiB0aGUgYW5ub3RhdGlvblxuXHRcdGlmICh0aGlzLnRleHQgPT09IHRoaXMubmV3X3RleHQgfHwgdGhpcy5uZXdfdGV4dCA9PT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgeyBhcHAgfSA9IHRoaXMubWFya2VyLnZpZXcuc3RhdGUuZmllbGQoZWRpdG9ySW5mb0ZpZWxkKTtcblx0XHRcdHRoaXMubmV3X3RleHQgPSBudWxsO1xuXHRcdFx0aWYgKHRoaXMuZWRpdE1vZGUpIHtcblx0XHRcdFx0dGhpcy5yZW1vdmVDaGlsZCh0aGlzLmVkaXRNb2RlKTtcblx0XHRcdFx0dGhpcy5lZGl0TW9kZSA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmFubm90YXRpb25fdmlldy5lbXB0eSgpO1xuXHRcdFx0aWYgKHRoaXMucmFuZ2UudHlwZSAhPT0gU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OKSB7XG5cdFx0XHRcdE1hcmtkb3duUmVuZGVyZXIucmVuZGVyKGFwcCwgdGhpcy50ZXh0IHx8IFwiJm5ic3A7XCIsIHRoaXMuYW5ub3RhdGlvbl92aWV3LCBcIlwiLCB0aGlzKTtcblx0XHRcdFx0c3dpdGNoICh0aGlzLnJhbmdlLnR5cGUpIHtcblx0XHRcdFx0XHRjYXNlIFN1Z2dlc3Rpb25UeXBlLkFERElUSU9OOlxuXHRcdFx0XHRcdFx0dGhpcy5hbm5vdGF0aW9uX3ZpZXcuY2hpbGRyZW5bMF0ucHJlcGVuZChjcmVhdGVTcGFuKHsgY2xzOiBcImNtdHItYW5uby1ndXR0ZXItYW5ub3RhdGlvbi1kZXNjXCIsIHRleHQ6IFwiQWRkZWQ6IFwiIH0pKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgU3VnZ2VzdGlvblR5cGUuREVMRVRJT046XG5cdFx0XHRcdFx0XHR0aGlzLmFubm90YXRpb25fdmlldy5jaGlsZHJlblswXS5wcmVwZW5kKGNyZWF0ZVNwYW4oeyBjbHM6IFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uLWRlc2NcIiwgdGV4dDogXCJEZWxldGVkOiBcIiB9KSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFN1Z2dlc3Rpb25UeXBlLkhJR0hMSUdIVDpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgU3VnZ2VzdGlvblR5cGUuQ09NTUVOVDpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCB0ZXh0X3NsaWNlcyA9IHRoaXMucmFuZ2UudW53cmFwX3BhcnRzKCk7XG5cdFx0XHRcdE1hcmtkb3duUmVuZGVyZXIucmVuZGVyKGFwcCwgdGV4dF9zbGljZXNbMF0gfHwgXCImbmJzcDtcIiwgdGhpcy5hbm5vdGF0aW9uX3ZpZXcsIFwiXCIsIHRoaXMpO1xuXHRcdFx0XHR0aGlzLmFubm90YXRpb25fdmlldy5jaGlsZHJlblswXS5wcmVwZW5kKGNyZWF0ZVNwYW4oeyBjbHM6IFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uLWRlc2NcIiwgdGV4dDogXCJDaGFuZ2VkOiBcIiB9KSk7XG5cdFx0XHRcdGNvbnN0IGNoaWxkSWR4ID0gdGhpcy5hbm5vdGF0aW9uX3ZpZXcuY2hpbGRyZW4ubGVuZ3RoO1xuXHRcdFx0XHRNYXJrZG93blJlbmRlcmVyLnJlbmRlcihhcHAsIHRleHRfc2xpY2VzWzFdIHx8IFwiJm5ic3A7XCIsIHRoaXMuYW5ub3RhdGlvbl92aWV3LCBcIlwiLCB0aGlzKTtcblx0XHRcdFx0dGhpcy5hbm5vdGF0aW9uX3ZpZXcuY2hpbGRyZW5bY2hpbGRJZHhdLnByZXBlbmQoY3JlYXRlU3Bhbih7IGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLWFubm90YXRpb24tZGVzY1wiLCB0ZXh0OiBcIlRvOiBcIiB9KSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYW5ub3RhdGlvbl92aWV3LmFkZENsYXNzKFwiY210ci1hbm5vLWd1dHRlci1hbm5vdGF0aW9uLVwiICsgdGhpcy5yYW5nZS50eXBlKTtcblx0XHRcdHRoaXMuY3VycmVudE1vZGUgPSBcInByZXZpZXdcIjtcblx0XHR9XG5cblx0XHQvLyBFWFBMOiBUaGUgYW5ub3RhdGlvbiBnZXRzIHVwZGF0ZWQgd2l0aCBuZXcgdGV4dFxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy50ZXh0ID0gdGhpcy5uZXdfdGV4dDtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT5cblx0XHRcdFx0dGhpcy5tYXJrZXIudmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0ZnJvbTogdGhpcy5yYW5nZS5mcm9tLFxuXHRcdFx0XHRcdFx0dG86IHRoaXMucmFuZ2UudG8sXG5cdFx0XHRcdFx0XHRpbnNlcnQ6IGNyZWF0ZV9yYW5nZShTdWdnZXN0aW9uVHlwZS5DT01NRU5ULCB0aGlzLm5ld190ZXh0ISksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0b25Db21tZW50Q29udGV4dG1lbnUoZTogTW91c2VFdmVudCkge1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0c3RpY2t5Q29udGV4dE1lbnVQYXRjaCh0cnVlKTtcblxuXHRcdGNvbnN0IG1lbnUgPSBuZXcgTWVudSgpO1xuXHRcdGlmICh0aGlzLnJhbmdlLnR5cGUgIT09IFN1Z2dlc3Rpb25UeXBlLkNPTU1FTlQgJiYgdGhpcy5yYW5nZS50eXBlICE9PSBTdWdnZXN0aW9uVHlwZS5ISUdITElHSFQpIHtcblx0XHRcdG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuXHRcdFx0XHRpdGVtLnNldFRpdGxlKFwiQWNjZXB0IGNoYW5nZXNcIilcblx0XHRcdFx0XHQuc2V0SWNvbihcImNoZWNrXCIpXG5cdFx0XHRcdFx0LnNldFNlY3Rpb24oXCJjbG9zZS1hbm5vdGF0aW9uXCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5tYXJrZXIudmlldy5kaXNwYXRjaCh7IGNoYW5nZXM6IGFjY2VwdFN1Z2dlc3Rpb25zKHRoaXMubWFya2VyLnZpZXcuc3RhdGUsIHRoaXMucmFuZ2UuZnJvbSwgdGhpcy5yYW5nZS50bykgfSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuXHRcdFx0XHRpdGVtLnNldFRpdGxlKFwiUmVqZWN0IGNoYW5nZXNcIilcblx0XHRcdFx0XHQuc2V0SWNvbihcImNyb3NzXCIpXG5cdFx0XHRcdFx0LnNldFNlY3Rpb24oXCJjbG9zZS1hbm5vdGF0aW9uXCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5tYXJrZXIudmlldy5kaXNwYXRjaCh7IGNoYW5nZXM6IHJlamVjdFN1Z2dlc3Rpb25zKHRoaXMubWFya2VyLnZpZXcuc3RhdGUsIHRoaXMucmFuZ2UuZnJvbSwgdGhpcy5yYW5nZS50bykgfSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5yYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5DT01NRU5UKSB7XG5cdFx0XHRpZiAodGhpcy5yYW5nZS5yZXBsaWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG5cdFx0XHRcdFx0aXRlbS5zZXRUaXRsZShcIkNsb3NlIGNvbW1lbnQgdGhyZWFkXCIpXG5cdFx0XHRcdFx0XHQuc2V0SWNvbihcIm1lc3NhZ2Utc3F1YXJlLW9mZlwiKVxuXHRcdFx0XHRcdFx0LnNldFNlY3Rpb24oXCJjbG9zZS1hbm5vdGF0aW9uXCIpXG5cdFx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMubWFya2VyLnZpZXcuZGlzcGF0Y2goe1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXM6IHtcblx0XHRcdFx0XHRcdFx0XHRcdGZyb206IHRoaXMucmFuZ2UuZnVsbF9yYW5nZV9mcm9udCxcblx0XHRcdFx0XHRcdFx0XHRcdHRvOiB0aGlzLnJhbmdlLmZ1bGxfcmFuZ2VfYmFjayxcblx0XHRcdFx0XHRcdFx0XHRcdGluc2VydDogXCJcIixcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0bWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG5cdFx0XHRcdGl0ZW0uc2V0VGl0bGUoXCJBZGQgcmVwbHlcIilcblx0XHRcdFx0XHQuc2V0U2VjdGlvbihcImNvbW1lbnQtaGFuZGxpbmdcIilcblx0XHRcdFx0XHQuc2V0SWNvbihcInJlcGx5XCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0YWRkQ29tbWVudFRvVmlldyh0aGlzLm1hcmtlci52aWV3LCB0aGlzLnJhbmdlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcblx0XHRcdFx0aXRlbS5zZXRUaXRsZShcIkVkaXQgY29tbWVudFwiKVxuXHRcdFx0XHRcdC5zZXRJY29uKFwicGVuY2lsXCIpXG5cdFx0XHRcdFx0LnNldFNlY3Rpb24oXCJjb21tZW50LWhhbmRsaW5nXCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5yZW5kZXJTb3VyY2UoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBUT0RPOiBXaGVuIHJlbW92aW5nIGNvbW1lbnRzLCB1c2UgYSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGl0IHNob3VsZCBiZSBhcmNoaXZlZCBvciBub3Rcblx0XHRcdG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuXHRcdFx0XHRpdGVtLnNldFRpdGxlKFwiUmVtb3ZlIGNvbW1lbnRcIilcblx0XHRcdFx0XHQuc2V0SWNvbihcImNyb3NzXCIpXG5cdFx0XHRcdFx0LnNldFNlY3Rpb24oXCJjb21tZW50LWhhbmRsaW5nXCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5tYXJrZXIudmlldy5kaXNwYXRjaCh7IGNoYW5nZXM6IHsgZnJvbTogdGhpcy5yYW5nZS5mcm9tLCB0bzogdGhpcy5yYW5nZS50bywgaW5zZXJ0OiBcIlwiIH0gfSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKHRoaXMucmFuZ2UudHlwZSAhPT0gU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUKSB7XG5cdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcblx0XHRcdFx0aXRlbS5zZXRUaXRsZShcIkFkZCByZXBseVwiKVxuXHRcdFx0XHRcdC5zZXRTZWN0aW9uKFwiY29tbWVudC1oYW5kbGluZ1wiKVxuXHRcdFx0XHRcdC5zZXRJY29uKFwicmVwbHlcIilcblx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0XHRhZGRDb21tZW50VG9WaWV3KHRoaXMubWFya2VyLnZpZXcsIHRoaXMucmFuZ2UpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmICh0aGlzLnJhbmdlLnJlcGxpZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcblx0XHRcdFx0XHRpdGVtLnNldFRpdGxlKFwiUmVtb3ZlIGFsbCBjb21tZW50c1wiKVxuXHRcdFx0XHRcdFx0LnNldEljb24oXCJtZXNzYWdlLXNxdWFyZS14XCIpXG5cdFx0XHRcdFx0XHQuc2V0U2VjdGlvbihcImNvbW1lbnQtaGFuZGxpbmdcIilcblx0XHRcdFx0XHRcdC5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5tYXJrZXIudmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZnJvbTogdGhpcy5yYW5nZS5yZXBsaWVzWzBdLmZyb20sXG5cdFx0XHRcdFx0XHRcdFx0XHR0bzogdGhpcy5yYW5nZS5yZXBsaWVzW3RoaXMucmFuZ2UucmVwbGllcy5sZW5ndGggLSAxXS50byxcblx0XHRcdFx0XHRcdFx0XHRcdGluc2VydDogXCJcIixcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG5cdFx0XHRcdGl0ZW0uc2V0VGl0bGUoXCJBZGQgcmVwbHlcIilcblx0XHRcdFx0XHQuc2V0U2VjdGlvbihcImNvbW1lbnQtaGFuZGxpbmdcIilcblx0XHRcdFx0XHQuc2V0SWNvbihcInJlcGx5XCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0YWRkQ29tbWVudFRvVmlldyh0aGlzLm1hcmtlci52aWV3LCB0aGlzLnJhbmdlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXG5cblx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcblx0XHRcdGl0ZW0uc2V0VGl0bGUoXCJGb2xkIGd1dHRlclwiKVxuXHRcdFx0XHQuc2V0U2VjdGlvbihcImd1dHRlci1jb250cm9sc1wiKVxuXHRcdFx0XHQuc2V0SWNvbihcImFycm93LXJpZ2h0LWZyb20tbGluZVwiKVxuXHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5tYXJrZXIudmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uczogWyBhbm5vdGF0aW9uR3V0dGVyRm9sZEFubm90YXRpb24ub2YobnVsbCkgXVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHR9KTtcblx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcblx0XHRcdGNvbnN0IHN1Ym1lbnUgPSBpdGVtLnNldFRpdGxlKFwiSW5jbHVkZWQgYW5ub3RhdGlvbnNcIilcblx0XHRcdFx0LnNldEljb24oXCJleWVcIilcblx0XHRcdFx0LnNldFNlY3Rpb24oXCJndXR0ZXItY29udHJvbHNcIilcblx0XHRcdFx0LnNldFN1Ym1lbnUoKTtcblxuXHRcdFx0bGV0IGN1cnJlbnRfc2V0dGluZ3MgPSB0aGlzLm1hcmtlci52aWV3LnN0YXRlLmZhY2V0KGFubm90YXRpb25HdXR0ZXJJbmNsdWRlZFR5cGVzU3RhdGUpO1xuXG5cdFx0XHRmb3IgKGNvbnN0IHsgdGl0bGUsIGljb24sIHZhbHVlIH0gb2YgW1xuXHRcdFx0XHR7IHRpdGxlOiBcIkFkZGl0aW9uc1wiLCBpY29uOiBcInBsdXMtY2lyY2xlXCIsIHZhbHVlOiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5BRERJVElPTiB9LFxuXHRcdFx0XHR7IHRpdGxlOiBcIkRlbGV0aW9uc1wiLCBpY29uOiBcIm1pbnVzLXNxdWFyZVwiLCB2YWx1ZTogQW5ub3RhdGlvbkluY2x1c2lvblR5cGUuREVMRVRJT04gfSxcblx0XHRcdFx0eyB0aXRsZTogXCJTdWJzdGl0dXRpb25zXCIsIGljb246IFwicmVwbGFjZVwiLCB2YWx1ZTogQW5ub3RhdGlvbkluY2x1c2lvblR5cGUuU1VCU1RJVFVUSU9OIH0sXG5cdFx0XHRcdHsgdGl0bGU6IFwiSGlnaGxpZ2h0c1wiLCBpY29uOiBcImhpZ2hsaWdodGVyXCIsIHZhbHVlOiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5ISUdITElHSFQgfSxcblx0XHRcdFx0eyB0aXRsZTogXCJDb21tZW50c1wiLCBpY29uOiBcIm1lc3NhZ2Utc3F1YXJlXCIsIHZhbHVlOiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5DT01NRU5UIH0sXG5cdFx0XHRdKSB7XG5cdFx0XHRcdHN1Ym1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuXHRcdFx0XHRcdGl0ZW0uc2V0VGl0bGUodGl0bGUpXG5cdFx0XHRcdFx0XHQuc2V0SWNvbihpY29uKVxuXHRcdFx0XHRcdFx0LnNldENoZWNrZWQoKGN1cnJlbnRfc2V0dGluZ3MgJiB2YWx1ZSkgIT09IDApXG5cdFx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRfc2V0dGluZ3MgXj0gdmFsdWU7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGlzX2FjdGl2ZSA9IChjdXJyZW50X3NldHRpbmdzICYgdmFsdWUpICE9PSAwO1xuXHRcdFx0XHRcdFx0XHQvLyBGSVhNRTogQWZ0ZXIgY2FsbGluZyAuc2V0Q2hlY2tlZChmYWxzZSkgb25jZSwgdGhlIGljb24gd2lsbCBub3Qgc2hvdyB1cCBhZ2FpbiB3aGVuIGNhbGxpbmcgLnNldENoZWNrZWQodHJ1ZSlcblx0XHRcdFx0XHRcdFx0Ly8gXHRcdHRoZSBjb2RlIGJlbG93IGJ5cGFzc2VzIHRoaXMgaXNzdWUgYnkganVzdCBoaWRpbmcgaXQgdmlhIGRpc3BsYXkgc3R5bGVcblx0XHRcdFx0XHRcdFx0aWYgKGl0ZW0uY2hlY2tJY29uRWwpXG5cdFx0XHRcdFx0XHRcdFx0aXRlbS5jaGVja0ljb25FbC5zdHlsZS5kaXNwbGF5ID0gaXNfYWN0aXZlID8gXCJmbGV4XCIgOiBcIm5vbmVcIjtcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGl0ZW0uc2V0Q2hlY2tlZChpc19hY3RpdmUpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLm1hcmtlci52aWV3LmRpc3BhdGNoKHRoaXMubWFya2VyLnZpZXcuc3RhdGUudXBkYXRlKHtcblx0XHRcdFx0XHRcdFx0XHRlZmZlY3RzOiBbYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXMucmVjb25maWd1cmUoYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXNTdGF0ZS5vZihjdXJyZW50X3NldHRpbmdzKSldLFxuXHRcdFx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRtZW51LnNob3dBdFBvc2l0aW9uKGUpO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBBbm5vdGF0aW9uTWFya2VyIGV4dGVuZHMgR3V0dGVyTWFya2VyIHtcblx0YW5ub3RhdGlvbl90aHJlYWQhOiBIVE1MRWxlbWVudDtcblx0Y29tcG9uZW50OiBDb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KCk7XG5cdHByZXZlbnRVbmxvYWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgYW5ub3RhdGlvbjogQ3JpdGljTWFya3VwUmFuZ2UsIHB1YmxpYyBhbm5vdGF0aW9uczogQ3JpdGljTWFya3VwUmFuZ2VbXSwgcHVibGljIHZpZXc6IEVkaXRvclZpZXcsIHB1YmxpYyBpdHIgPSAwKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdGVxKG90aGVyOiBBbm5vdGF0aW9uTWFya2VyKSB7XG5cdFx0cmV0dXJuIHRoaXMuaXRyID09PSBvdGhlci5pdHIgJiYgdGhpcy5hbm5vdGF0aW9ucyA9PT0gb3RoZXIuYW5ub3RhdGlvbnMgJiYgdGhpcy5hbm5vdGF0aW9uc1swXS5lcXVhbHMob3RoZXIuYW5ub3RhdGlvbnNbMF0pO1xuXHR9XG5cblx0b25Db21tZW50VGhyZWFkQ2xpY2soKSB7XG5cdFx0Ly8gRVhQTDogV2hlbiB0aGUgYW5ub3RhdGlvbiBnZXRzIGZvY3VzZWQsIGVuc3VyZSB0aGF0IGl0IGlzIGFsaWduZWQgdG8gdGhlIGJsb2NrIGl0IGlzIGF0dGFjaGVkIHRvLFxuXHRcdC8vIFx0XHQgcHVzaGluZyBvdGhlciBhbm5vdGF0aW9ucyB1cC9kb3duXG5cdFx0dGhpcy52aWV3LmRpc3BhdGNoKHtcblx0XHRcdGFubm90YXRpb25zOiBbXG5cdFx0XHRcdGFubm90YXRpb25HdXR0ZXJGb2N1c1RocmVhZEFubm90YXRpb24ub2Yoe1xuXHRcdFx0XHRcdG1hcmtlcjogdGhpcyxcblx0XHRcdFx0XHRpbmRleDogLTEsXG5cdFx0XHRcdFx0c2Nyb2xsOiB0cnVlLFxuXHRcdFx0XHRcdGZvY3VzX21hcmt1cDogdHJ1ZSxcblx0XHRcdFx0fSksXG5cdFx0XHRdLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hbm5vdGF0aW9uX3RocmVhZC5jbGFzc0xpc3QudG9nZ2xlKFwiY210ci1hbm5vLWd1dHRlci10aHJlYWQtaGlnaGxpZ2h0XCIsIHRydWUpO1xuXHR9XG5cblx0dG9ET00oKSB7XG5cdFx0dGhpcy5hbm5vdGF0aW9uX3RocmVhZCA9IGNyZWF0ZURpdih7IGNsczogXCJjbXRyLWFubm8tZ3V0dGVyLXRocmVhZFwiIH0pO1xuXHRcdHRoaXMuYW5ub3RhdGlvbl90aHJlYWQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMub25Db21tZW50VGhyZWFkQ2xpY2suYmluZCh0aGlzKSk7XG5cblx0XHRmb3IgKGNvbnN0IHJhbmdlIG9mIHRoaXMuYW5ub3RhdGlvbnMpXG5cdFx0XHR0aGlzLmNvbXBvbmVudC5hZGRDaGlsZChuZXcgQW5ub3RhdGlvbk5vZGUocmFuZ2UsIHRoaXMpKTtcblx0XHR0aGlzLmNvbXBvbmVudC5sb2FkKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5hbm5vdGF0aW9uX3RocmVhZDtcblx0fVxuXG5cdGZvY3VzKCkge1xuXHRcdHRoaXMuYW5ub3RhdGlvbl90aHJlYWQuZm9jdXMoKTtcblx0fVxuXG5cdGZvY3VzX2Fubm90YXRpb24oaW5kZXg6IG51bWJlciA9IC0xLCBzY3JvbGw6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHRcdGlmIChpbmRleCA9PT0gLTEpIHtcblx0XHRcdHRoaXMuYW5ub3RhdGlvbl90aHJlYWQuY2xhc3NMaXN0LnRvZ2dsZShcImNtdHItYW5uby1ndXR0ZXItdGhyZWFkLWhpZ2hsaWdodFwiLCB0cnVlKTtcblx0XHR9IGVsc2UgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLmFubm90YXRpb25fdGhyZWFkLmNoaWxkcmVuLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5hbm5vdGF0aW9uX3RocmVhZC5jaGlsZHJlbi5pdGVtKGluZGV4KSEuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudChcImRibGNsaWNrXCIpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcIltDb21tZW50YXRvcl0gSW52YWxpZCBpbmRleCBmb3IgZm9jdXNpbmcgYW5ub3RhdGlvbjpcIiwgaW5kZXgpO1xuXHRcdH1cblxuXHRcdGlmIChzY3JvbGwpIHtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0b3AgPSB0aGlzLnZpZXcubGluZUJsb2NrQXQodGhpcy5hbm5vdGF0aW9uc1swXS5mcm9tKS50b3AgLSAxMDA7XG5cdFx0XHRcdHRoaXMudmlldy5zY3JvbGxET00uc2Nyb2xsVG8oe3RvcCwgYmVoYXZpb3I6IFwic21vb3RoXCJ9KTtcblx0XHRcdH0sIDIwMCk7XG5cdFx0fVxuXHR9XG5cblx0dW5mb2N1c19hbm5vdGF0aW9uKGluZGV4OiBudW1iZXIgPSAtMSkge1xuXHRcdGlmIChpbmRleCA9PT0gLTEpIHtcblx0XHRcdHRoaXMuYW5ub3RhdGlvbl90aHJlYWQuY2xhc3NMaXN0LnRvZ2dsZShcImNtdHItYW5uby1ndXR0ZXItdGhyZWFkLWhpZ2hsaWdodFwiLCBmYWxzZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuYW5ub3RhdGlvbl90aHJlYWQuY2hpbGRyZW4uaXRlbShpbmRleCkhLmNsYXNzTGlzdC50b2dnbGUoXCJjbXRyLWFubm8tZ3V0dGVyLXRocmVhZC1oaWdobGlnaHRcIiwgZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdGRlc3Ryb3koZG9tOiBIVE1MRWxlbWVudCkge1xuXHRcdHRoaXMuY29tcG9uZW50LnVubG9hZCgpO1xuXHRcdHRoaXMuYW5ub3RhdGlvbl90aHJlYWQucmVtb3ZlKCk7XG5cdFx0c3VwZXIuZGVzdHJveShkb20pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1hcmtlcnMoc3RhdGU6IEVkaXRvclN0YXRlLCBjaGFuZ2VkX3JhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXSwgdHlwZXM6IG51bWJlcikge1xuXHRjb25zdCB2aWV3ID0gc3RhdGUuZmllbGQoZWRpdG9yRWRpdG9yRmllbGQpO1xuXG5cdGNvbnN0IGluY2x1ZGVBZGRpdGlvbnMgPSAodHlwZXMgJiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5BRERJVElPTikgIT09IDA7XG5cdGNvbnN0IGluY2x1ZGVEZWxldGlvbnMgPSAodHlwZXMgJiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5ERUxFVElPTikgIT09IDA7XG5cdGNvbnN0IGluY2x1ZGVTdWJzdGl0dXRpb25zID0gKHR5cGVzICYgQW5ub3RhdGlvbkluY2x1c2lvblR5cGUuU1VCU1RJVFVUSU9OKSAhPT0gMDtcblx0Y29uc3QgaW5jbHVkZUhpZ2hsaWdodHMgPSAodHlwZXMgJiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5ISUdITElHSFQpICE9PSAwO1xuXHRjb25zdCBpbmNsdWRlQ29tbWVudHMgPSAodHlwZXMgJiBBbm5vdGF0aW9uSW5jbHVzaW9uVHlwZS5DT01NRU5UKSAhPT0gMDtcblxuXHRjb25zdCBjbV9yYW5nZXM6IFJhbmdlPEFubm90YXRpb25NYXJrZXI+W10gPSBbXTtcblx0Zm9yIChjb25zdCByYW5nZSBvZiBjaGFuZ2VkX3Jhbmdlcykge1xuXHRcdGxldCBmdWxsX3RocmVhZCA9IHJhbmdlLmZ1bGxfdGhyZWFkO1xuXG5cdFx0aWYgKCFpbmNsdWRlQ29tbWVudHMpIHtcblx0XHRcdGZ1bGxfdGhyZWFkID0gZnVsbF90aHJlYWQuc2xpY2UoMCwgMSk7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChyYW5nZS50eXBlKSB7XG5cdFx0XHRjYXNlIFN1Z2dlc3Rpb25UeXBlLkFERElUSU9OOlxuXHRcdFx0XHRpZiAoIWluY2x1ZGVBZGRpdGlvbnMpIGZ1bGxfdGhyZWFkLnNoaWZ0KCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBTdWdnZXN0aW9uVHlwZS5ERUxFVElPTjpcblx0XHRcdFx0aWYgKCFpbmNsdWRlRGVsZXRpb25zKSBmdWxsX3RocmVhZC5zaGlmdCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OOlxuXHRcdFx0XHRpZiAoIWluY2x1ZGVTdWJzdGl0dXRpb25zKSBmdWxsX3RocmVhZC5zaGlmdCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUOlxuXHRcdFx0XHRpZiAoIWluY2x1ZGVIaWdobGlnaHRzKSBmdWxsX3RocmVhZC5zaGlmdCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgU3VnZ2VzdGlvblR5cGUuQ09NTUVOVDpcblx0XHRcdFx0aWYgKCFpbmNsdWRlQ29tbWVudHMpIGZ1bGxfdGhyZWFkLnNoaWZ0KCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdGlmIChmdWxsX3RocmVhZC5sZW5ndGgpIHtcblx0XHRcdC8vIE1PRElGSUNBVElPTjogYWR2YW5jZUN1cnNvciBpbiBiYXNlLnRzIHJlcXVpcmVkIG1hcmtlcnMgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgcmFuZ2VzZXQgYXQgZXhhY3RseVxuXHRcdFx0Ly8gICAgICB0aGUgcG9zaXRpb25zIHdoZXJlIGxpbmUgc3RhcnRzLCB0aGlzIGNhdXNlZCBzb21lIGlzc3VlcyB3aXRoIGNvcnJlY3QgYWRqdXN0bWVudCBvZiBwb3NpdGlvbnMgdGhyb3VnaCB1cGRhdGVzLFxuXHRcdFx0Ly8gICAgICBzbyBhZGp1c3RtZW50IGlzIHRoYXQgbWFya2VycyBjYW4gbm93IG9jY3VyIGF0IGFueSBwb3NpdGlvbiBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lXG5cdFx0XHRjb25zdCBtYXJrZXIgPSBuZXcgQW5ub3RhdGlvbk1hcmtlcihyYW5nZSwgZnVsbF90aHJlYWQsIHZpZXcsIGl0cik7XG5cdFx0XHRtYXJrZXIucHJldmVudFVubG9hZCA9IHRydWU7XG5cdFx0XHRjbV9yYW5nZXMucHVzaChtYXJrZXIucmFuZ2UocmFuZ2UuZnJvbSwgcmFuZ2UudG8pKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY21fcmFuZ2VzO1xufVxuXG5sZXQgaXRyID0gMDtcbmV4cG9ydCBjb25zdCBhbm5vdGF0aW9uR3V0dGVyTWFya2VycyA9IFN0YXRlRmllbGQuZGVmaW5lPFJhbmdlU2V0PEFubm90YXRpb25NYXJrZXI+Pih7XG5cdGNyZWF0ZShzdGF0ZSkge1xuXHRcdGNvbnN0IHJhbmdlcyA9IHN0YXRlLmZpZWxkKHJhbmdlUGFyc2VyKS5yYW5nZXMucmFuZ2VzLnJlZHVjZSgoYWNjLCByYW5nZSkgPT4ge1xuXHRcdFx0Y29uc3QgYmFzZSA9IHJhbmdlLmJhc2VfcmFuZ2U7XG5cdFx0XHRpZiAoIWFjYy5pbmNsdWRlcyhiYXNlKSlcblx0XHRcdFx0YWNjLnB1c2goYmFzZSk7XG5cdFx0XHRyZXR1cm4gYWNjO1xuXHRcdH0sIFtdIGFzIENyaXRpY01hcmt1cFJhbmdlW10pO1xuXG5cdFx0cmV0dXJuIFJhbmdlU2V0Lm9mPEFubm90YXRpb25NYXJrZXI+KFxuXHRcdFx0Y3JlYXRlTWFya2Vycyhcblx0XHRcdFx0c3RhdGUsXG5cdFx0XHRcdHJhbmdlcyxcblx0XHRcdFx0c3RhdGUuZmFjZXQoYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXNTdGF0ZSlcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdHVwZGF0ZShvbGRTZXQsIHRyKSB7XG5cdFx0Y29uc3QgaW5jbHVkZWRUeXBlcyA9IHRyLnN0YXRlLmZhY2V0KGFubm90YXRpb25HdXR0ZXJJbmNsdWRlZFR5cGVzU3RhdGUpO1xuXG5cdFx0Ly8gTk9URTogV2hpbGUgaXQgaXMgKnNsaWdodGx5KiBpbmVmZmljaWVudCB0byByZWNyZWF0ZSBhbGwgbWFya2VycyAoc2luY2UgdGhlIGV4aXN0aW5nIG1hcmtlcnMgY291bGQgYmUgcmUtdXNlZCksXG5cdFx0Ly8gICAgICAgdGhlIGluY2x1ZGVkIHR5cGVzIGFyZSBiYXJlbHkgZXZlciBjaGFuZ2VkLCBzbyB0aGUgaW1wYWN0IGlzIG5lZ2xpZ2libGVcblx0XHRpZiAodHIuc3RhcnRTdGF0ZS5mYWNldChhbm5vdGF0aW9uR3V0dGVySW5jbHVkZWRUeXBlc1N0YXRlKSAhPT0gaW5jbHVkZWRUeXBlcykge1xuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlKHRyLnN0YXRlKTtcblx0XHR9XG5cblx0XHRpZiAoIXRyLmRvY0NoYW5nZWQpIHtcblx0XHRcdHJldHVybiBvbGRTZXQ7XG5cdFx0fVxuXG5cdFx0aXRyICs9IDE7XG5cblx0XHRjb25zdCBhZGRlZF9yYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IHJhbmdlIG9mIHRyLnN0YXRlLmZpZWxkKHJhbmdlUGFyc2VyKS5pbnNlcnRlZF9yYW5nZXMpIHtcblx0XHRcdGlmICghYWRkZWRfcmFuZ2VzLmluY2x1ZGVzKHJhbmdlLmJhc2VfcmFuZ2UpKVxuXHRcdFx0XHRhZGRlZF9yYW5nZXMucHVzaChyYW5nZS5iYXNlX3JhbmdlKTtcblx0XHR9XG5cdFx0Y29uc3QgZGVsZXRlZF9yYW5nZXMgPSB0ci5zdGF0ZS5maWVsZChyYW5nZVBhcnNlcikuZGVsZXRlZF9yYW5nZXNcblx0XHRcdC5tYXAocmFuZ2UgPT4gcmFuZ2UuYmFzZV9yYW5nZSk7XG5cblx0XHRyZXR1cm4gb2xkU2V0XG5cdFx0XHQubWFwKHRyLmNoYW5nZXMpXG5cdFx0XHQudXBkYXRlKHtcblx0XHRcdFx0ZmlsdGVyOiAoZnJvbSwgdG8sIHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0Ly8gRVhQTDogVGhpcyBjb2RlIHByZXZlbnRzIEFubm90YXRpb25NYXJrZXJzIGluIGV4aXN0aW5nIEd1dHRlck1hcmtlcnMgZnJvbSBiZWluZyB1bmxvYWRlZFxuXHRcdFx0XHRcdC8vICAgICAgIHdoZW4gdGhlIG1hcmtlciBpcyBtb3ZlZCBmcm9tIG9uZSBHdXR0ZXJFbGVtZW50IHRvIGFub3RoZXJcblx0XHRcdFx0XHRjb25zdCBrZWVwID0gIWRlbGV0ZWRfcmFuZ2VzLmluY2x1ZGVzKHZhbHVlLmFubm90YXRpb24pO1xuXHRcdFx0XHRcdHZhbHVlLnByZXZlbnRVbmxvYWQgPSBrZWVwO1xuXHRcdFx0XHRcdHJldHVybiBrZWVwO1xuXG5cdFx0XHRcdFx0Ly8gcmV0dXJuICFkZWxldGVkX3Jhbmdlcy5pbmNsdWRlcyh2YWx1ZS5hbm5vdGF0aW9uKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWRkOiBjcmVhdGVNYXJrZXJzKHRyLnN0YXRlLCBhZGRlZF9yYW5nZXMubWFwKHJhbmdlID0+IHJhbmdlLmZ1bGxfdGhyZWFkWzBdKSwgaW5jbHVkZWRUeXBlcyksXG5cdFx0XHR9KTtcblx0fSxcbn0pO1xuIiwgIi8qKlxuICogQWxsIGNyZWRpdHMgZ28gdG8gbWdtZXllcnMgZm9yIGZpZ3VyaW5nIG91dCBob3cgdG8gZ3JhYiB0aGUgcHJvcGVyIGVkaXRvciBwcm90b3R5cGVcbiAqIFx0IGFuZCBtYWtpbmcgaXQgZWFzaWx5IGRlcGxveWFibGVcbiAqIENoYW5nZXMgbWFkZSB0byB0aGUgb3JpZ2luYWwgY29kZTpcbiAqIFx0IC0gUmVmYWN0b3JlZCB0byBKUy1vbmx5IHN5bnRheCAob3JpZ2luYWwgY29kZSBtYWRlIHVzZSBvZiBSZWFjdClcbiAqIFx0IC0gQWRkZWQgYmx1ciBjb21wbGV0aW9uXG4gKiBcdCAtIEFkZGVkIHNvbWUgY29tbWVudHMgb24gaG93IHRoZSBjb2RlIGZ1bmN0aW9uc1xuICogXHQgLSBNYWRlIGVkaXRvciBzZXR0aW5ncyBmdWxseSBvcHRpb25hbFxuICogXHQgLSBBbGxvdyBhbGwgZWRpdG9yIGNvbW1hbmRzIHRvIGZ1bmN0aW9uIG9uIHRoaXMgZWRpdG9yXG4gKiBcdCAtIEFkZGVkIHR5cGluZ3MgZm9yIHRoZSBlZGl0b3IocykgKHdpbGwgYmUgYWRkZWQgdG8gb2JzaWRpYW4tdHlwaW5ncylcbiAqIE1ha2Ugc3VyZSB0byBhbHNvIGNoZWNrIG91dCB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL21nbWV5ZXJzL29ic2lkaWFuLWthbmJhbi9ibG9iL21haW4vc3JjL2NvbXBvbmVudHMvRWRpdG9yL01hcmtkb3duRWRpdG9yLnRzeFxuICovXG5cbmltcG9ydCB7XG5cdEFwcCxcblx0dHlwZSBDb25zdHJ1Y3Rvcixcblx0U2NvcGUsXG5cdFRGaWxlLFxuXHRXb3Jrc3BhY2VMZWFmLFxufSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB0eXBlIHsgTWFya2Rvd25TY3JvbGxhYmxlRWRpdFZpZXcsIFdpZGdldEVkaXRvclZpZXcgfSBmcm9tIFwib2JzaWRpYW4tdHlwaW5nc1wiXG5cbmltcG9ydCB7IEVkaXRvclNlbGVjdGlvbiwgdHlwZSBFeHRlbnNpb24sIFByZWMgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7IEVkaXRvclZpZXcsIGtleW1hcCwgcGxhY2Vob2xkZXIsIFZpZXdVcGRhdGUgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuXG5pbXBvcnQgeyBhcm91bmQgfSBmcm9tIFwibW9ua2V5LWFyb3VuZFwiO1xuXG5mdW5jdGlvbiByZXNvbHZlRWRpdG9yUHJvdG90eXBlKGFwcDogQXBwKSB7XG5cdC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBlZGl0b3IgdG8gcmVzb2x2ZSB0aGUgcHJvdG90eXBlIG9mIFNjcm9sbGFibGVNYXJrZG93bkVkaXRvclxuXHRjb25zdCB3aWRnZXRFZGl0b3JWaWV3ID0gYXBwLmVtYmVkUmVnaXN0cnkuZW1iZWRCeUV4dGVuc2lvbi5tZChcblx0XHR7IGFwcCwgY29udGFpbmVyRWw6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikgfSxcblx0XHRudWxsIGFzIHVua25vd24gYXMgVEZpbGUsXG5cdFx0XCJcIixcblx0KSBhcyBXaWRnZXRFZGl0b3JWaWV3O1xuXG5cdC8vIE1hcmsgYXMgZWRpdGFibGUgdG8gaW5zdGFudGlhdGUgdGhlIGVkaXRvclxuXHR3aWRnZXRFZGl0b3JWaWV3LmVkaXRhYmxlID0gdHJ1ZTtcblx0d2lkZ2V0RWRpdG9yVmlldy5zaG93RWRpdG9yKCk7XG5cdGNvbnN0IE1hcmtkb3duRWRpdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZih3aWRnZXRFZGl0b3JWaWV3LmVkaXRNb2RlISkpO1xuXG5cdC8vIFVubG9hZCB0byByZW1vdmUgdGhlIHRlbXBvcmFyeSBlZGl0b3Jcblx0d2lkZ2V0RWRpdG9yVmlldy51bmxvYWQoKTtcblxuXHRyZXR1cm4gTWFya2Rvd25FZGl0b3IuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3I8TWFya2Rvd25TY3JvbGxhYmxlRWRpdFZpZXc+O1xufVxuXG5pbnRlcmZhY2UgTWFya2Rvd25FZGl0b3JQcm9wcyB7XG5cdGN1cnNvckxvY2F0aW9uOiB7IGFuY2hvcjogbnVtYmVyOyBoZWFkOiBudW1iZXIgfTtcblx0dmFsdWU6IHN0cmluZztcblx0Y2xzOiBzdHJpbmc7XG5cdHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cdGZvY3VzOiBib29sZWFuO1xuXG5cdGZpbHRlcmVkRXh0ZW5zaW9uczogRXh0ZW5zaW9uW107XG5cblx0b25FbnRlcjogKGVkaXRvcjogRW1iZWRkYWJsZU1hcmtkb3duRWRpdG9yLCBtb2Q6IGJvb2xlYW4sIHNoaWZ0OiBib29sZWFuKSA9PiBib29sZWFuO1xuXHRvbkVzY2FwZTogKGVkaXRvcjogRW1iZWRkYWJsZU1hcmtkb3duRWRpdG9yKSA9PiB2b2lkO1xuXHRvblN1Ym1pdDogKGVkaXRvcjogRW1iZWRkYWJsZU1hcmtkb3duRWRpdG9yKSA9PiB2b2lkO1xuXHRvbkJsdXI6IChlZGl0b3I6IEVtYmVkZGFibGVNYXJrZG93bkVkaXRvcikgPT4gdm9pZDtcblx0b25QYXN0ZTogKGU6IENsaXBib2FyZEV2ZW50LCBlZGl0b3I6IEVtYmVkZGFibGVNYXJrZG93bkVkaXRvcikgPT4gdm9pZDtcblx0b25DaGFuZ2U6ICh1cGRhdGU6IFZpZXdVcGRhdGUpID0+IHZvaWQ7XG59XG5cbmNvbnN0IGRlZmF1bHRQcm9wZXJ0aWVzOiBNYXJrZG93bkVkaXRvclByb3BzID0ge1xuXHRjdXJzb3JMb2NhdGlvbjogeyBhbmNob3I6IDAsIGhlYWQ6IDAgfSxcblx0dmFsdWU6IFwiXCIsXG5cdGNsczogXCJcIixcblx0cGxhY2Vob2xkZXI6IFwiXCIsXG5cdGZvY3VzOiB0cnVlLFxuXHRmaWx0ZXJlZEV4dGVuc2lvbnM6IFtdLFxuXG5cdG9uRW50ZXI6IChlZGl0b3IsIG1vZCwgc2hpZnQpID0+IHtcblx0XHRpZiAobW9kKSBlZGl0b3Iub3B0aW9ucy5vblN1Ym1pdChlZGl0b3IpO1xuXHRcdHJldHVybiBtb2Q7XG5cdH0sXG5cdG9uRXNjYXBlOiAoZWRpdG9yKSA9PiB7XG5cdFx0ZWRpdG9yLm9wdGlvbnMub25CbHVyKGVkaXRvcik7XG5cdH0sXG5cdG9uU3VibWl0OiAoKSA9PiB7fSxcblx0Ly8gTk9URTogQmx1ciB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgRXNjYXBlICh0aGlzIGNhbiBiZSBjaGFuZ2VkKVxuXHRvbkJsdXI6ICgpID0+IHt9LFxuXHRvblBhc3RlOiAoKSA9PiB7fSxcblx0b25DaGFuZ2U6ICgpID0+IHt9LFxufTtcblxuZXhwb3J0IGNsYXNzIEVtYmVkZGFibGVNYXJrZG93bkVkaXRvciBleHRlbmRzIHJlc29sdmVFZGl0b3JQcm90b3R5cGUoYXBwKSBpbXBsZW1lbnRzIE1hcmtkb3duU2Nyb2xsYWJsZUVkaXRWaWV3IHtcblx0b3B0aW9uczogTWFya2Rvd25FZGl0b3JQcm9wcztcblx0aW5pdGlhbF92YWx1ZTogc3RyaW5nO1xuXHRzY29wZTogU2NvcGU7XG5cblx0LyoqXG5cdCAqIENvbnN0cnVjdCB0aGUgZWRpdG9yXG5cdCAqIEByZW1hcmsgVGFrZXMgNW1zIHRvIGZ1bGx5IGNvbnN0cnVjdCBhbmQgYXR0YWNoXG5cdCAqIEBwYXJhbSBhcHAgLSBSZWZlcmVuY2UgdG8gQXBwIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250YWluZXIgLSBDb250YWluZXIgZWxlbWVudCB0byBhZGQgdGhlIGVkaXRvciB0b1xuXHQgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGNvbnRyb2xpbmcgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGVkaXRvclxuXHQgKi9cblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM6IFBhcnRpYWw8TWFya2Rvd25FZGl0b3JQcm9wcz4pIHtcblx0XHRzdXBlcihhcHAsIGNvbnRhaW5lciwge1xuXHRcdFx0YXBwLFxuXHRcdFx0Ly8gVGhpcyBtb2NrcyB0aGUgTWFya2Rvd25WaWV3IGZ1bmN0aW9ucywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHByb3BlciBmdW5jdGlvbmluZyBvZiBzY3JvbGxpbmdcblx0XHRcdG9uTWFya2Rvd25TY3JvbGw6ICgpID0+IHt9LFxuXHRcdFx0Z2V0TW9kZTogKCkgPT4gXCJzb3VyY2VcIixcblx0XHR9KTtcblx0XHR0aGlzLm9wdGlvbnMgPSB7IC4uLmRlZmF1bHRQcm9wZXJ0aWVzLCAuLi5vcHRpb25zIH07XG5cdFx0dGhpcy5pbml0aWFsX3ZhbHVlID0gdGhpcy5vcHRpb25zLnZhbHVlITtcblx0XHR0aGlzLnNjb3BlID0gbmV3IFNjb3BlKHRoaXMuYXBwLnNjb3BlKTtcblx0XHQvLyBOT1RFOiBDdXN0b20ga2V5cyBjYW4gYmUgYWRkZWQgdG8gdGhlIHNjb3BlIHRvIG92ZXJyaWRlIGRlZmF1bHQgYmVoYXZpb3VyLFxuXHRcdC8vIFx0XHQgcmVtZW1iZXIgdG8gcmV0dXJuIHRydWUgdG8gYWxzbyBwcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmcm9tIGV4ZWN1dGluZ1xuXG5cdFx0Ly8gTk9URTogU2luY2UgTW9kK0VudGVyIGlzIGxpbmtlZCB0byB0aGUgXCJPcGVuIGxpbmsgaW4gbmV3IGxlYWZcIiBjb21tYW5kLCBidXQgaXQgaXMgYWxzbyB0aGUgZGVmYXVsdCB1c2VyIGFjdGlvbiBmb3Igc3VibWl0dGluZyB0aGUgZWRpdG9yLFxuXHRcdC8vICAgICAgdGhlIGhvdGtleSBzaG91bGQgYmUgZGlzYWJsZWQgYnkgZWl0aGVyIG92ZXJ3cml0aW5nIGl0IGluIHRoZSBzY29wZSwgb3IgYXBwbHlpbmcgYSBwcmV2ZW50RGVmYXVsdCBpbiB0aGUga2V5bWFwXG5cdFx0Ly8gICAgICB0aGUgc2NvcGUgaXMgdXNlZCB0byBwcmV2ZW50IHRoZSBob3RrZXkgZnJvbSBleGVjdXRpbmcgKGJ5IHJldHVybmluZyBgdHJ1ZWApXG5cdFx0Ly8gVE9ETzogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhbGxvdyBib3RoIGJlaGF2aW91cnMgdG8gY29leGlzdDpcblx0XHQvLyAgICAgMSkgRmV0Y2ggdGhlIGNvbW1hbmQgdmlhIGhvdGtleU1hbmFnZXJcblx0XHQvLyAgICAgMikgRXhlY3V0ZSB0aGUgY29tbWFuZCBjYWxsYmFja1xuXHRcdC8vICAgICAzKSBSZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY2FsbGJhY2sgKGNhbGxiYWNrIHJldHVybnMgZmFsc2UgaWYgY2FsbGJhY2sgY291bGQgbm90IGV4ZWN1dGUpXG5cdFx0Ly8gICAgIFx0XHQoSW4gdGhpcyBjYXNlLCBpZiBjdXJzb3IgaXMgbm90IG9uIGEgbGluayB0b2tlbiwgdGhlIGNhbGxiYWNrIHdpbGwgcmV0dXJuIGZhbHNlLCBhbmQgb25FbnRlciB3aWxsIGJlIGFwcGxpZWQpXG5cdFx0dGhpcy5zY29wZS5yZWdpc3RlcihbXCJNb2RcIl0sIFwiRW50ZXJcIiwgKGUsIGN0eCkgPT4ge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSk7XG5cblx0XHQvLyBTaW5jZSB0aGUgY29tbWFuZHMgZXhwZWN0IHRoYXQgdGhpcyBpcyBhIE1hcmtkb3duVmlldyAod2l0aCBlZGl0TW9kZSBhcyB0aGUgRWRpdG9yIGl0c2VsZiksXG5cdFx0Ly8gICB3ZSBuZWVkIHRvIG1vY2sgdGhpcyBieSBzZXR0aW5nIGJvdGggdGhlIGVkaXRNb2RlIGFuZCBlZGl0b3IgdG8gdGhpcyBpbnN0YW5jZSBhbmQgaXRzIGNvbnRhaW5pbmcgdmlldyByZXNwZWN0aXZlbHlcblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIChlZGl0TW9kZSBpcyBub3JtYWxseSBhIE1hcmtkb3duU3ViVmlldylcblx0XHR0aGlzLm93bmVyLmVkaXRNb2RlID0gdGhpcztcblx0XHR0aGlzLm93bmVyLmVkaXRvciA9IHRoaXMuZWRpdG9yO1xuXG5cdFx0dGhpcy5zZXQob3B0aW9ucy52YWx1ZSB8fCBcIlwiLCB0cnVlKTtcblx0XHR0aGlzLnJlZ2lzdGVyKFxuXHRcdFx0YXJvdW5kKHRoaXMuYXBwLndvcmtzcGFjZSwge1xuXHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIChJbmNvcnJlY3RseSBtYXRjaGVzIHRoZSBkZXByZWNhdGVkIHNldEFjdGl2ZUxlYWYgbWV0aG9kKVxuXHRcdFx0XHRzZXRBY3RpdmVMZWFmOlxuXHRcdFx0XHRcdChvbGRNZXRob2Q6IChsZWFmOiBXb3Jrc3BhY2VMZWFmLCBwYXJhbXM/OiB7IGZvY3VzPzogYm9vbGVhbiB9KSA9PiB2b2lkKSA9PlxuXHRcdFx0XHRcdChsZWFmOiBXb3Jrc3BhY2VMZWFmLCBwYXJhbXM6IHsgZm9jdXM/OiBib29sZWFuIH0pID0+IHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBlZGl0b3IgaXMgY3VycmVudGx5IGZvY3VzZWQsIHByZXZlbnQgdGhlIHdvcmtzcGFjZSBzZXR0aW5nIHRoZSBmb2N1cyB0byBhIHdvcmtzcGFjZUxlYWYgaW5zdGVhZFxuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLmFjdGl2ZUNNLmhhc0ZvY3VzKVxuXHRcdFx0XHRcdFx0XHRvbGRNZXRob2QuY2FsbCh0aGlzLmFwcC53b3Jrc3BhY2UsIGxlYWYsIHBhcmFtcyk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdH0pLFxuXHRcdCk7XG5cblx0XHQvLyBFeGVjdXRlIG9uQmx1ciB3aGVuIHRoZSBlZGl0b3IgbG9zZXMgZm9jdXNcblx0XHQvLyBOT1RFOiBBcHBhcmVudGx5IENocm9tZSBkb2VzIGEgd2VpcmQgdGhpbmcgd2hlcmUgcmVtb3ZpbmcgYW4gZWxlbWVudCBmcm9tIHRoZSBET00gdHJpZ2dlcnMgYSBibHVyIGV2ZW50XG5cdFx0Ly8gXHRcdCAoSGVuY2Ugd2h5IHRoZSAuX2xvYWRlZCBjaGVjayBpcyBuZWNlc3NhcnkpXG5cdFx0aWYgKHRoaXMub3B0aW9ucy5vbkJsdXIgIT09IGRlZmF1bHRQcm9wZXJ0aWVzLm9uQmx1cikge1xuXHRcdFx0dGhpcy5lZGl0b3I/LmNtLmNvbnRlbnRET00uYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgKCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5fbG9hZGVkKSB0aGlzLm9wdGlvbnMub25CbHVyKHRoaXMpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbmV2ZXIgdGhlIGVkaXRvciBpcyBmb2N1c2VkLCBzZXQgdGhlIGFjdGl2ZUVkaXRvciB0byB0aGUgbW9ja2VkIHZpZXcgKHRoaXMub3duZXIpXG5cdFx0Ly8gVGhpcyBhbGxvd3MgZm9yIHRoZSBlZGl0b3JDb21tYW5kcyB0byBhY3R1YWxseSB3b3JrXG5cdFx0dGhpcy5lZGl0b3I/LmNtLmNvbnRlbnRET00uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5hcHAua2V5bWFwLnB1c2hTY29wZSh0aGlzLnNjb3BlKTtcblx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVFZGl0b3IgPSB0aGlzLm93bmVyO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5lZGl0b3JFbC5jbGFzc0xpc3QucmVtb3ZlKFwibWFya2Rvd24tc291cmNlLXZpZXdcIik7XG5cblx0XHRpZiAob3B0aW9ucy5jbHMpIHRoaXMuZWRpdG9yRWwuY2xhc3NMaXN0LmFkZChvcHRpb25zLmNscyk7XG5cdFx0aWYgKG9wdGlvbnMuY3Vyc29yTG9jYXRpb24pIHtcblx0XHRcdHRoaXMuZWRpdG9yPy5jbS5kaXNwYXRjaCh7XG5cdFx0XHRcdHNlbGVjdGlvbjogRWRpdG9yU2VsZWN0aW9uLnJhbmdlKG9wdGlvbnMuY3Vyc29yTG9jYXRpb24uYW5jaG9yLCBvcHRpb25zLmN1cnNvckxvY2F0aW9uLmhlYWQpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0b25VcGRhdGUodXBkYXRlOiBWaWV3VXBkYXRlLCBjaGFuZ2VkOiBib29sZWFuKSB7XG5cdFx0c3VwZXIub25VcGRhdGUodXBkYXRlLCBjaGFuZ2VkKTtcblx0XHRpZiAoY2hhbmdlZCkgdGhpcy5vcHRpb25zLm9uQ2hhbmdlKHVwZGF0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29uc3RydWN0cyBsb2NhbCAoYWx3YXlzIGFjdGl2ZSkgZXh0ZW5zaW9ucyBmb3IgdGhlIGVkaXRvclxuXHQgKiBAcmVtYXJrIE90aGVyIHBsdWdpbnMgd2lsbCBub3QgYmUgYWJsZSB0byBzZW5kIGRpcmVjdCB1cGRhdGVzIHRvIHRoZXNlIGV4dGVuc2lvbnMgdG8gY2hhbmdlIGNvbmZpZ3VyYXRpb25zXG5cdCAqIEB0dXRvcmlhbCBnZXREeW5hbWljRXh0ZW5zaW9ucyBpcyB1c2VkIHRvIGFkZCBleHRlbnNpb25zIHRoYXQgc2hvdWxkIGJlIGR5bmFtaWNhbGx5IHVwZGF0ZWRcblx0ICovXG5cdGJ1aWxkTG9jYWxFeHRlbnNpb25zKCk6IEV4dGVuc2lvbltdIHtcblx0XHRjb25zdCBleHRlbnNpb25zID0gc3VwZXIuYnVpbGRMb2NhbEV4dGVuc2lvbnMoKTtcblx0XHRpZiAodGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyKSBleHRlbnNpb25zLnB1c2gocGxhY2Vob2xkZXIodGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyKSk7XG5cblx0XHQvKiBFZGl0b3IgZXh0ZW5zaW9uIGZvciBoYW5kbGluZyBzcGVjaWZpYyB1c2VyIGlucHV0cyAqL1xuXHRcdGV4dGVuc2lvbnMucHVzaChFZGl0b3JWaWV3LmRvbUV2ZW50SGFuZGxlcnMoe1xuXHRcdFx0cGFzdGU6IChldmVudCkgPT4ge1xuXHRcdFx0XHR0aGlzLm9wdGlvbnMub25QYXN0ZShldmVudCwgdGhpcyk7XG5cdFx0XHR9LFxuXHRcdH0pKTtcblx0XHRleHRlbnNpb25zLnB1c2goUHJlYy5oaWdoZXN0KGtleW1hcC5vZihbXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJFbnRlclwiLFxuXHRcdFx0XHRydW46IChjbSkgPT4gdGhpcy5vcHRpb25zLm9uRW50ZXIodGhpcywgZmFsc2UsIGZhbHNlKSxcblx0XHRcdFx0c2hpZnQ6IChjbSkgPT4gdGhpcy5vcHRpb25zLm9uRW50ZXIodGhpcywgZmFsc2UsIHRydWUpLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0a2V5OiBcIk1vZC1FbnRlclwiLFxuXHRcdFx0XHRydW46IChjbSkgPT4gdGhpcy5vcHRpb25zLm9uRW50ZXIodGhpcywgdHJ1ZSwgZmFsc2UpLFxuXHRcdFx0XHRzaGlmdDogKGNtKSA9PiB0aGlzLm9wdGlvbnMub25FbnRlcih0aGlzLCB0cnVlLCB0cnVlKSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJFc2NhcGVcIixcblx0XHRcdFx0cnVuOiAoY20pID0+IHtcblx0XHRcdFx0XHR0aGlzLm9wdGlvbnMub25Fc2NhcGUodGhpcyk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHByZXZlbnREZWZhdWx0OiB0cnVlLFxuXHRcdFx0fSxcblx0XHRdKSkpO1xuXG5cdFx0LyogQWRkaXRpb25hbCBFZGl0b3IgZXh0ZW5zaW9ucyAocmVuZGVyZXJzLCAuLi4pICovXG5cblx0XHRyZXR1cm4gZXh0ZW5zaW9ucztcblx0fVxuXG5cdGdldER5bmFtaWNFeHRlbnNpb25zKCk6IEV4dGVuc2lvbltdIHtcblx0XHRyZXR1cm4gc3VwZXIuZ2V0RHluYW1pY0V4dGVuc2lvbnMoKVxuXHRcdFx0LmZpbHRlcihleHQgPT4gIXRoaXMub3B0aW9ucy5maWx0ZXJlZEV4dGVuc2lvbnMuaW5jbHVkZXMoZXh0KSk7XG5cdH1cblxuXHQvKipcblx0ICogRm9yY2Ugbm8gcGFkZGluZyBvbiB0aGUgYm90dG9tIG9mIHRoZSBlZGl0b3Jcblx0ICovXG5cdHVwZGF0ZUJvdHRvbVBhZGRpbmcoaGVpZ2h0OiBudW1iZXIpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbnN1cmUgdGhhdCB0aGUgZWRpdG9yIGlzIHByb3Blcmx5IGRlc3Ryb3llZCB3aGVuIHRoZSB2aWV3IGlzIGNsb3NlZFxuXHQgKi9cblx0ZGVzdHJveSgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5fbG9hZGVkKVxuXHRcdFx0dGhpcy51bmxvYWQoKTtcblx0XHR0aGlzLmFwcC5rZXltYXAucG9wU2NvcGUodGhpcy5zY29wZSk7XG5cdFx0aWYgKHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVFZGl0b3IgPT09IHRoaXMub3duZXIpXG5cdFx0XHR0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlRWRpdG9yID0gbnVsbDtcblx0XHR0aGlzLmNvbnRhaW5lckVsLmVtcHR5KCk7XG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZW4gcmVtb3ZpbmcgYXMgYSBjb21wb25lbnQsIGRlc3Ryb3kgd2lsbCBhbHNvIGdldCBpbnZva2VkXG5cdCAqL1xuXHRvbnVubG9hZCgpIHtcblx0XHRzdXBlci5vbnVubG9hZCgpO1xuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZW4gZmluaXNoZWQgbG9hZGluZywgdGFrZSBmb2N1c1xuXHQgKi9cblx0b25sb2FkKCkge1xuXHRcdHN1cGVyLm9ubG9hZCgpO1xuXHRcdGlmICh0aGlzLm9wdGlvbnMuZm9jdXMpIHRoaXMuZWRpdG9yPy5mb2N1cygpO1xuXHR9XG59XG4iLCAiZnVuY3Rpb24gYXJvdW5kKG9iaiwgZmFjdG9yaWVzKSB7XG4gIGNvbnN0IHJlbW92ZXJzID0gT2JqZWN0LmtleXMoZmFjdG9yaWVzKS5tYXAoKGtleSkgPT4gYXJvdW5kMShvYmosIGtleSwgZmFjdG9yaWVzW2tleV0pKTtcbiAgcmV0dXJuIHJlbW92ZXJzLmxlbmd0aCA9PT0gMSA/IHJlbW92ZXJzWzBdIDogZnVuY3Rpb24oKSB7XG4gICAgcmVtb3ZlcnMuZm9yRWFjaCgocikgPT4gcigpKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGFyb3VuZDEob2JqLCBtZXRob2QsIGNyZWF0ZVdyYXBwZXIpIHtcbiAgY29uc3QgaW5oZXJpdGVkID0gb2JqW21ldGhvZF0sIGhhZE93biA9IG9iai5oYXNPd25Qcm9wZXJ0eShtZXRob2QpLCBvcmlnaW5hbCA9IGhhZE93biA/IGluaGVyaXRlZCA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKVttZXRob2RdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG4gIGxldCBjdXJyZW50ID0gY3JlYXRlV3JhcHBlcihvcmlnaW5hbCk7XG4gIGlmIChpbmhlcml0ZWQpXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGN1cnJlbnQsIGluaGVyaXRlZCk7XG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZih3cmFwcGVyLCBjdXJyZW50KTtcbiAgb2JqW21ldGhvZF0gPSB3cmFwcGVyO1xuICByZXR1cm4gcmVtb3ZlO1xuICBmdW5jdGlvbiB3cmFwcGVyKC4uLmFyZ3MpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gb3JpZ2luYWwgJiYgb2JqW21ldGhvZF0gPT09IHdyYXBwZXIpXG4gICAgICByZW1vdmUoKTtcbiAgICByZXR1cm4gY3VycmVudC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgaWYgKG9ialttZXRob2RdID09PSB3cmFwcGVyKSB7XG4gICAgICBpZiAoaGFkT3duKVxuICAgICAgICBvYmpbbWV0aG9kXSA9IG9yaWdpbmFsO1xuICAgICAgZWxzZVxuICAgICAgICBkZWxldGUgb2JqW21ldGhvZF07XG4gICAgfVxuICAgIGlmIChjdXJyZW50ID09PSBvcmlnaW5hbClcbiAgICAgIHJldHVybjtcbiAgICBjdXJyZW50ID0gb3JpZ2luYWw7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHdyYXBwZXIsIGluaGVyaXRlZCB8fCBGdW5jdGlvbik7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlZHVwZShrZXksIG9sZEZuLCBuZXdGbikge1xuICBjaGVja1trZXldID0ga2V5O1xuICByZXR1cm4gY2hlY2s7XG4gIGZ1bmN0aW9uIGNoZWNrKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gKG9sZEZuW2tleV0gPT09IGtleSA/IG9sZEZuIDogbmV3Rm4pLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG59XG5mdW5jdGlvbiBhZnRlcihwcm9taXNlLCBjYikge1xuICByZXR1cm4gcHJvbWlzZS50aGVuKGNiLCBjYik7XG59XG5mdW5jdGlvbiBzZXJpYWxpemUoYXN5bmNGdW5jdGlvbikge1xuICBsZXQgbGFzdFJ1biA9IFByb21pc2UucmVzb2x2ZSgpO1xuICBmdW5jdGlvbiB3cmFwcGVyKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gbGFzdFJ1biA9IG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgYWZ0ZXIobGFzdFJ1biwgKCkgPT4ge1xuICAgICAgICBhc3luY0Z1bmN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpLnRoZW4ocmVzLCByZWopO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgd3JhcHBlci5hZnRlciA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBsYXN0UnVuID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICBhZnRlcihsYXN0UnVuLCByZXMpO1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuZXhwb3J0IHsgYWZ0ZXIsIGFyb3VuZCwgZGVkdXBlLCBzZXJpYWxpemUgfTtcbiIsICJpbXBvcnQgeyBTdWdnZXN0aW9uVHlwZSB9IGZyb20gXCIuL2VkaXRvci9iYXNlXCI7XG5pbXBvcnQge1xuXHRFZGl0TW9kZSxcblx0dHlwZSBQbHVnaW5TZXR0aW5ncyxcblx0UHJldmlld01vZGUsXG5cdFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLFxuXHRSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgUExVR0lOX1ZFUlNJT04gPSBcIjAuMi4zXCI7XG5leHBvcnQgY29uc3QgREFUQUJBU0VfVkVSU0lPTiA9IDQ7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBQbHVnaW5TZXR0aW5ncyA9IHtcblx0dmVyc2lvbjogUExVR0lOX1ZFUlNJT04sXG5cblx0ZGVmYXVsdF9lZGl0X21vZGU6IEVkaXRNb2RlLkNPUlJFQ1RFRCxcblx0ZGVmYXVsdF9wcmV2aWV3X21vZGU6IFByZXZpZXdNb2RlLkFMTCxcblx0Y29tbWVudF9zdHlsZTogXCJpY29uXCIsXG5cdGVkaXRvcl9zdHlsaW5nOiBmYWxzZSxcblx0bWFya3VwX2ZvY3VzOiB7XG5cdFx0W0VkaXRNb2RlLk9GRl06IHtcblx0XHRcdHNob3dfc3R5bGluZzogdHJ1ZSxcblx0XHRcdHNob3dfc3ludGF4OiB0cnVlLFxuXHRcdFx0c2hvd19tZXRhZGF0YTogdHJ1ZSxcblx0XHRcdGZvY3VzX2Fubm90YXRpb246IHRydWUsXG5cdFx0XHRzaG93X2NvbW1lbnQ6IHRydWUsXG5cdFx0fSxcblx0XHRbRWRpdE1vZGUuQ09SUkVDVEVEXToge1xuXHRcdFx0c2hvd19zdHlsaW5nOiB0cnVlLFxuXHRcdFx0c2hvd19zeW50YXg6IGZhbHNlLFxuXHRcdFx0c2hvd19tZXRhZGF0YTogZmFsc2UsXG5cdFx0XHRmb2N1c19hbm5vdGF0aW9uOiB0cnVlLFxuXHRcdFx0c2hvd19jb21tZW50OiBmYWxzZSxcblx0XHR9LFxuXHRcdFtFZGl0TW9kZS5TVUdHRVNUXToge1xuXHRcdFx0c2hvd19zdHlsaW5nOiB0cnVlLFxuXHRcdFx0c2hvd19zeW50YXg6IGZhbHNlLFxuXHRcdFx0c2hvd19tZXRhZGF0YTogZmFsc2UsXG5cdFx0XHRmb2N1c19hbm5vdGF0aW9uOiB0cnVlLFxuXHRcdFx0c2hvd19jb21tZW50OiBmYWxzZSxcblx0XHR9LFxuXHR9LFxuXG5cdGRpZmZfZ3V0dGVyOiB0cnVlLFxuXHRkaWZmX2d1dHRlcl9oaWRlX2VtcHR5OiB0cnVlLFxuXG5cdGFubm90YXRpb25fZ3V0dGVyOiB0cnVlLFxuXHRhbm5vdGF0aW9uX2d1dHRlcl9pbmNsdWRlZF90eXBlczogMzEsXG5cdGFubm90YXRpb25fZ3V0dGVyX2hpZGVfZW1wdHk6IHRydWUsXG5cdGFubm90YXRpb25fZ3V0dGVyX2RlZmF1bHRfZm9sZF9zdGF0ZTogZmFsc2UsXG5cdGFubm90YXRpb25fZ3V0dGVyX2ZvbGRfYnV0dG9uOiB0cnVlLFxuXHRhbm5vdGF0aW9uX2d1dHRlcl9yZXNpemVfaGFuZGxlOiB0cnVlLFxuXHRhbm5vdGF0aW9uX2d1dHRlcl9mb2N1c19vbl9jbGljazogdHJ1ZSxcblx0YW5ub3RhdGlvbl9ndXR0ZXJfd2lkdGg6IDMwMCxcblxuXHR0YWdfY29tcGxldGlvbjogdHJ1ZSxcblx0dGFnX2NvcnJlY3RlcjogdHJ1ZSxcblx0Y2xpcGJvYXJkX3JlbW92ZV9zeW50YXg6IHRydWUsXG5cdGVkaXRfaW5mbzogdHJ1ZSxcblxuXHR0b29sYmFyX3ByZXZpZXdfYnV0dG9uOiB0cnVlLFxuXHR0b29sYmFyX2VkaXRfYnV0dG9uOiB0cnVlLFxuXHR0b29sYmFyX3Nob3dfYnV0dG9uc19sYWJlbHM6IHRydWUsXG5cblx0c3RhdHVzX2Jhcl9wcmV2aWV3X2J1dHRvbjogdHJ1ZSxcblx0c3RhdHVzX2Jhcl9lZGl0X2J1dHRvbjogdHJ1ZSxcblx0c3RhdHVzX2Jhcl9tZXRhZGF0YV9idXR0b246IHRydWUsXG5cblx0ZGF0YWJhc2Vfd29ya2VyczogMixcblxuXHRwb3N0X3Byb2Nlc3NvcjogdHJ1ZSxcblx0bGl2ZV9wcmV2aWV3OiB0cnVlLFxuXHRhbHRlcm5hdGl2ZV9jdXJzb3JfbW92ZW1lbnQ6IHRydWUsXG5cblx0ZW5hYmxlX21ldGFkYXRhOiBmYWxzZSxcblx0ZW5hYmxlX2F1dGhvcl9tZXRhZGF0YTogZmFsc2UsXG5cdGVuYWJsZV90aW1lc3RhbXBfbWV0YWRhdGE6IGZhbHNlLFxuXHRlbmFibGVfY29tcGxldGVkX21ldGFkYXRhOiBmYWxzZSxcblx0ZW5hYmxlX3N0eWxlX21ldGFkYXRhOiBmYWxzZSxcblx0ZW5hYmxlX2NvbG9yX21ldGFkYXRhOiBmYWxzZSxcblxuXHRhZGRfbWV0YWRhdGE6IGZhbHNlLFxuXHRhZGRfYXV0aG9yX21ldGFkYXRhOiBmYWxzZSxcblx0YWRkX3RpbWVzdGFtcF9tZXRhZGF0YTogZmFsc2UsXG5cdGFkZF9jb21wbGV0ZWRfbWV0YWRhdGE6IGZhbHNlLFxuXHRhZGRfc3R5bGVfbWV0YWRhdGE6IGZhbHNlLFxuXHRhZGRfY29sb3JfbWV0YWRhdGE6IGZhbHNlLFxuXG5cdGF1dGhvcjogXCJcIixcblxuXHRzdWdnZXN0aW9uX21vZGVfb3BlcmF0aW9uczoge1xuXHRcdGN1cnNvcl9tb3ZlbWVudDoge1xuXHRcdFx0W1N1Z2dlc3Rpb25UeXBlLkFERElUSU9OXTogUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5JR05PUkVfTUVUQURBVEEsXG5cdFx0XHRbU3VnZ2VzdGlvblR5cGUuREVMRVRJT05dOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0XHRcdFtTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT05dOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0XHRcdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0XHRcdFtTdWdnZXN0aW9uVHlwZS5DT01NRU5UXTogUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5JR05PUkVfQ09NUExFVEVMWSxcblx0XHR9LFxuXHRcdGJyYWNrZXRfbW92ZW1lbnQ6IHtcblx0XHRcdFtTdWdnZXN0aW9uVHlwZS5BRERJVElPTl06IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfSU5TSURFLFxuXHRcdFx0W1N1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFx0XHRbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFx0XHRbU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFx0XHRbU3VnZ2VzdGlvblR5cGUuQ09NTUVOVF06IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfSU5TSURFLFxuXHRcdH0sXG5cdH0sXG59O1xuXG5leHBvcnQgY29uc3QgUkVRVUlSRVNfRlVMTF9SRUxPQUQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldChbXG5cdFwibGl2ZV9wcmV2aWV3XCIsXG5cdFwiZGlmZl9ndXR0ZXJcIixcblx0XCJhbm5vdGF0aW9uX2d1dHRlclwiLFxuXHRcImFubm90YXRpb25fZ3V0dGVyX2ZvY3VzX29uX2NsaWNrXCIsXG5cdFwiY29tbWVudF9zdHlsZVwiLFxuXHRcInRhZ19jb21wbGV0aW9uXCIsXG5cdFwidGFnX2NvcnJlY3RlclwiLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBSRVFVSVJFU19FRElUT1JfUkVMT0FEOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuXHRcImVuYWJsZV9tZXRhZGF0YVwiLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBSRVFVSVJFU19EQVRBQkFTRV9SRUlOREVYOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuXHRcImVuYWJsZV9tZXRhZGF0YVwiLFxuXSk7XG5cbmV4cG9ydCBlbnVtIEFubm90YXRpb25JbmNsdXNpb25UeXBlIHtcblx0QURESVRJT04gPSAxIDw8IDAsXG5cdERFTEVUSU9OID0gMSA8PCAxLFxuXHRTVUJTVElUVVRJT04gPSAxIDw8IDIsXG5cdEhJR0hMSUdIVCA9IDEgPDwgMyxcblx0Q09NTUVOVCA9IDEgPDwgNCxcbn1cbiIsICJpbXBvcnQge01hcmtkb3duVmlldywgTWVudSwgTWVudUl0ZW0sIHR5cGUgUGx1Z2lufSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7YXJvdW5kfSBmcm9tIFwibW9ua2V5LWFyb3VuZFwiO1xuXG4vKipcbiAqIEtlZXAgdGhlIGNvbnRleHQgbWVudSBvcGVuIGFmdGVyIGNsaWNraW5nIG9uIGEgbWVudSBpdGVtLlxuICogQHBhcmFtIG9uU3VibWVudSAtIE9ubHkga2VlcCB0aGUgbWVudSBvcGVuIGlmIHRoZSBpdGVtIGlzIGEgc3VibWVudS5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0aWNreUNvbnRleHRNZW51UGF0Y2ggPSAob25TdWJtZW51ID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCBwYXRjaCA9IGFyb3VuZChNZW51LnByb3RvdHlwZSwge1xuICAgICAgICBvbkVudGVyOiAob2xkTWV0aG9kKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odGhpczogTWVudSwgZTogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuaXRlbXNbdGhpcy5zZWxlY3RlZF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSAmJiBzZWxlY3RlZEl0ZW0gaW5zdGFuY2VvZiBNZW51SXRlbSAmJiAoc2VsZWN0ZWRJdGVtLmhhbmRsZUV2ZW50KGUpKSB8fCB0cnVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgb25NZW51Q2xpY2s6IChvbGRNZXRob2QpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiBNZW51LCBlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvblN1Ym1lbnUgfHwgdGhpcy5jdXJyZW50U3VibWVudSAmJiB0aGlzLmN1cnJlbnRTdWJtZW51LmRvbS5jb250YWlucyhlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkTWV0aG9kICYmIG9sZE1ldGhvZC5hcHBseSh0aGlzLCBbZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyByZXR1cm4gKCkgPT4ge307XG4gICAgICAgIH0sXG4gICAgICAgIGhpZGU6IChvbGRNZXRob2QpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiBNZW51KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmVudE1lbnUpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2goKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9sZE1ldGhvZCAmJiBvbGRNZXRob2QuYXBwbHkodGhpcyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBwYXRjaDtcbn1cblxuLyoqXG4gKiBUaGlzIHBhdGNoIGV4dGVuZHMgdGhlIE1hcmtkb3duVmlldyB0byBzeW5jaHJvbml6ZSBjb25maWcgdmFsdWVzIGFkZGVkIGJ5IHlvdXIgcGx1Z2luIHRvIHRoZSBwZXJzaXN0ZW50IHN0YXRlLlxuICogSXQgYWxzbyBlbnN1cmVzIHRoYXQgdGhlc2UgdmFsdWVzIGFyZSBjb3JyZWN0bHkgc2V0IHRvIHRoZSBlZGl0b3IgX2JlZm9yZV8gaXQgaXMgKHJlKWluaXRpYWxpemVkLlxuICogQHBhcmFtIHNldFN0YXRlIC0gR2V0IHBlcnNpc3RlZCB2YWx1ZXMgZnJvbSB0aGUgc3RhdGUgYW5kIGxvYWQgdGhlbSBpbnRvIHRoZSB2aWV3XG4gKiBAcGFyYW0gZ2V0U3RhdGUgLSBHZXQgY3VycmVudCB2YWx1ZXMgZnJvbSB0aGUgdmlldyBhbmQgc3RvcmUgaW4gdGhlIHN0YXRlXG4gKiBAcGFyYW0gYmVmb3JlRWRpdG9yUmVsb2FkIC0gU3luY2hyb25pemUgdmFsdWVzIGZyb20gc3RhdGUgYmVmb3JlIHRoZSBjb2RlbWlycm9yIGluc3RhbmNlIGlzIGluaXRpYWxpemVkXG4gKiBAcGFyYW0gYWZ0ZXJFZGl0b3JSZWxvYWQgLSBTeW5jaHJvbml6ZSB2YWx1ZXMgZnJvbSBzdGF0ZSBhZnRlciB0aGUgY29kZW1pcnJvciBpbnN0YW5jZSBpcyBpbml0aWFsaXplZFxuICogQHJlbWFya3MgQW55IHN0YXRlIHZhbHVlcyBzZXQgYnkgdGhpcyBwYXRjaCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBvbmNlIHRoaXMgcGF0Y2ggaXMgdW5pbnN0YWxsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBzeW5jTWFya2Rvd25WaWV3Q3VzdG9tU3RhdGVQYXRjaCA9IChcbiAgICBzZXRTdGF0ZTogKHZpZXc6IE1hcmtkb3duVmlldywgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPixcbiAgICBnZXRTdGF0ZTogKHZpZXc6IE1hcmtkb3duVmlldywgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkLFxuICAgIGJlZm9yZUVkaXRvclJlbG9hZDogKHZpZXc6IE1hcmtkb3duVmlldykgPT4gdm9pZCxcbiAgICBhZnRlckVkaXRvclJlbG9hZDogKHZpZXc6IE1hcmtkb3duVmlldykgPT4gdm9pZCA9ICgpID0+IHt9XG4pID0+IHtcbiAgICByZXR1cm4gYXJvdW5kKE1hcmtkb3duVmlldy5wcm90b3R5cGUsIHtcbiAgICAgICAgc2V0U3RhdGU6IChvbGRNZXRob2QpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAodGhpczogTWFya2Rvd25WaWV3LCAuLi5hcmdzKXtcbiAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZXRTdGF0ZSh0aGlzLCBhcmdzWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9sZE1ldGhvZCAmJiBvbGRNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0U3RhdGU6IChvbGRNZXRob2QpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodGhpczogTWFya2Rvd25WaWV3KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBvbGRNZXRob2QgJiYgb2xkTWV0aG9kLmFwcGx5KHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBnZXRTdGF0ZSh0aGlzLCBzdGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvLyBFWFBMOiBDYWxsZWQgb24gZXZlcnkgZmlsZSBjaGFuZ2UsIHBhcnRpY3VsYXJseSBob3QgcGF0aCBjb2RlXG4gICAgICAgIC8vXHRcdCBJZiBjbGVhciBpcyBlbmFibGVkLCB0aGUgZXh0ZW5zaW9ucyB3aWxsIGJlIHJlbG9hZGVkIChndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzKVxuICAgICAgICBzZXREYXRhOiAob2xkTWV0aG9kKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKHRoaXM6IE1hcmtkb3duVmlldywgLi4uYXJncykge1xuICAgICAgICAgICAgICAgIC8vIE5PVEU6IENoZWNraW5nIHZpYSBhcmdzWzFdIChgY2xlYXJgKSB3aWxsIG9ubHkgZXhlY3V0ZSBzeW5jU3RhdGUgaWYgdGhlIGZpbGUgaXMgY2hhbmdlZFxuICAgICAgICAgICAgICAgIGlmIChhcmdzWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZUVkaXRvclJlbG9hZCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb2xkTWV0aG9kICYmIG9sZE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJnc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICBhZnRlckVkaXRvclJlbG9hZCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gTk9URTogQWx0ZXJuYXRpdmUgdGhhdCBpcyBvbmx5IGNhbGxlZCB3aGVuIGZpbGUgaXMgY2hhbmdlZCwgYnV0IGlzIG5vdCBzeW5jaHJvbm91c1xuICAgICAgICAvLyBsb2FkRmlsZTogKG9sZE1ldGhvZCkgPT4ge1xuICAgICAgICAvLyBcdHJldHVybiBhc3luYyBmdW5jdGlvbiAodGhpczogTWFya2Rvd25WaWV3LCAuLi5hcmdzKSB7XG4gICAgICAgIC8vIFx0XHRpZiAocGx1Z2luLmFubm90YXRpb25fZ3V0dGVyX2NvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFx0XHRcdHBsdWdpbi5hbm5vdGF0aW9uX2d1dHRlcl9jb25maWcud2lkdGggPSB0aGlzLmVkaXRNb2RlLmFubm90YXRpb25HdXR0ZXJXaWR0aDtcbiAgICAgICAgLy8gXHRcdFx0cGx1Z2luLmFubm90YXRpb25fZ3V0dGVyX2NvbmZpZy5mb2xkU3RhdGUgPSB0aGlzLmVkaXRNb2RlLmFubm90YXRpb25HdXR0ZXJGb2xkZWQ7XG4gICAgICAgIC8vIFx0XHR9XG4gICAgICAgIC8vIFx0XHRjb25zdCBvdXRwdXQgPSBvbGRNZXRob2QgJiYgYXdhaXQgb2xkTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAvLyBcdFx0Ly8gRVhQTDogRW5zdXJlcyB0aGF0IGNvcnJlY3QgY29uZmlnIGlzIGFsd2F5cyBjb3JyZWN0bHkgY29tbXVuaWNhdGVkIHRvIHRoZSBndXR0ZXIsXG4gICAgICAgIC8vIFx0XHQvL1x0XHQgZXZlbiBpZiBzaGFyZWQgY29uZmlnIGFib3ZlIGlzIG92ZXJyaWRkZW5cbiAgICAgICAgLy8gXHRcdC8vIE5PVEU6IElmIHZpZXcgaXMgdmlzaWJsZSBhbmQgY29uZmlnIHZhbHVlIGRpZmZlcmVudCwgdGhlIGd1dHRlciBfd2lsbF8gYW5pbWF0ZSB0byBuZXcgc3RhdGVcbiAgICAgICAgLy8gXHRcdC8vICAgICAgIFJlYWxpc3RpY2FsbHksIHRoaXMgaXMgb25seSBhbiBpc3N1ZSB3aGVuIGxvYWRpbmcgYSBzcGVjaWZpYyB3b3Jrc3BhY2Ugd2hlbiBhcHAgaXMgbG9hZGVkXG4gICAgICAgIC8vIFx0XHR0aGlzLmVkaXRNb2RlLmNtLmRpc3BhdGNoKHtcbiAgICAgICAgLy8gXHRcdFx0YW5ub3RhdGlvbnM6IFtcbiAgICAgICAgLy8gXHRcdFx0XHRhbm5vdGF0aW9uR3V0dGVyV2lkdGhBbm5vdGF0aW9uLm9mKHRoaXMuZWRpdE1vZGUuYW5ub3RhdGlvbkd1dHRlcldpZHRoKSxcbiAgICAgICAgLy8gXHRcdFx0XHRhbm5vdGF0aW9uR3V0dGVyRm9sZEFubm90YXRpb24ub2YodGhpcy5lZGl0TW9kZS5hbm5vdGF0aW9uR3V0dGVyRm9sZGVkKSxcbiAgICAgICAgLy8gXHRcdFx0XVxuICAgICAgICAvLyBcdFx0fSk7XG4gICAgICAgIC8vIFx0XHRyZXR1cm4gb3V0cHV0O1xuICAgICAgICAvLyBcdH1cbiAgICAgICAgLy8gfSxcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUaGlzIHBhdGNoIGhvb2tzIGludG8gdGhlIFBsdWdpbnMgY2xhc3MsIGFuZCBleGVjdXRlcyBmdW5jdGlvbmFsaXR5IGJlZm9yZSB0aGUgcGx1Z2luIGlzIHVuaW5zdGFsbGVkIHZpYSB0aGUgVUkuXG4gKiBAcGFyYW0gcGx1Z2luIC0gVGhlIENvbW1lbnRhdG9yIHBsdWdpbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRvIGJlIHVuaW5zdGFsbGVkLlxuICogQHBhcmFtIGNiIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgcGx1Z2luIGlzIHVuaW5zdGFsbGVkLlxuICogQHJlbWFya3MgSWYgdGhlIHBsdWdpbiBnZXRzIHVuaW5zdGFsbGVkIHZpYSBhbnkgb3RoZXIgd2F5IChlLmcuIGZpbGUgc3lzdGVtIGRlbGV0aW9uLCBjdXN0b20gcGx1Z2luIEFQSSwgLi4uKSxcbiAqICAgICAgICAgIG5vIGd1YXJhbnRlZXMgY2FuIGJlIG1hZGUgdGhhdCB0aGUgZnVuY3Rpb25hbGl0eSB3aWxsIGJlIGV4ZWN1dGVkLlxuICovXG5leHBvcnQgY29uc3QgYmVmb3JlUGx1Z2luVW5pbnN0YWxsUGF0Y2ggPSAocGx1Z2luOiBQbHVnaW4sIGlkOiBzdHJpbmcsIGNiOiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgPT4ge1xuICAgIHJldHVybiBhcm91bmQocGx1Z2luLmFwcC5wbHVnaW5zLCB7XG4gICAgICAgIHVuaW5zdGFsbFBsdWdpbjogKG9sZE1ldGhvZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhIHNhZmUgY2hlY2ssIGlmIHNvbWV0aGluZyBjaGFuZ2VzIGluIHRoZSBmdXR1cmUsIHRoaXMgd2lsbCBqdXN0IGJlIGlnbm9yZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjYigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIGJlZm9yZVBsdWdpblVuaW5zdGFsbFBhdGNoIGNhbGxiYWNrOlwiLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2xkTWV0aG9kICYmIGF3YWl0IG9sZE1ldGhvZC5hcHBseShwbHVnaW4uYXBwLnBsdWdpbnMsIGFyZ3MpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuIiwgImltcG9ydCB7IEVkaXRvclZpZXcsIFdpZGdldFR5cGUgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIE1hcmtkb3duUmVuZGVyZXIsIE1lbnUsIHNldEljb24gfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHsgQ09NTUVOVEFUT1JfR0xPQkFMIH0gZnJvbSBcIi4uLy4uLy4uL2dsb2JhbFwiO1xuaW1wb3J0IHsgYWRkQ29tbWVudFRvVmlldywgQ01fQWxsX0JyYWNrZXRzLCBDb21tZW50UmFuZ2UsIENyaXRpY01hcmt1cFJhbmdlIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCB7IGFubm90YXRpb25HdXR0ZXJGb2N1c0Fubm90YXRpb24gfSBmcm9tIFwiLi4vZ3V0dGVycy9hbm5vdGF0aW9ucy1ndXR0ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckNvbW1lbnRXaWRnZXQocmFuZ2U6IENvbW1lbnRSYW5nZSwgdGV4dD86IHN0cmluZywgdW53cmFwID0gZmFsc2UpIHtcblx0bGV0IHN0ciA9IHRleHQgPz8gcmFuZ2UudGV4dDtcblx0aWYgKCF0ZXh0ICYmIHVud3JhcCkge1xuXHRcdGlmIChyYW5nZS50byA+PSBzdHIubGVuZ3RoICYmICFzdHIuZW5kc1dpdGgoQ01fQWxsX0JyYWNrZXRzW3JhbmdlLnR5cGVdLmF0KC0xKSEpKVxuXHRcdFx0c3RyID0gcmFuZ2UudW53cmFwX2JyYWNrZXQodHJ1ZSk7XG5cdFx0ZWxzZVxuXHRcdFx0c3RyID0gcmFuZ2UudW53cmFwKCk7XG5cdH1cblxuXHRjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG5cdGljb24uY2xhc3NMaXN0LmFkZChcImNtdHItY29tbWVudC1pY29uXCIpO1xuXHRzZXRJY29uKGljb24sIFwibWVzc2FnZS1zcXVhcmVcIik7XG5cdGxldCB0b29sdGlwOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXHRjb25zdCBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KCk7XG5cdGljb24ub25tb3VzZWVudGVyID0gKCkgPT4ge1xuXHRcdGlmICh0b29sdGlwKSByZXR1cm47XG5cblx0XHR0b29sdGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR0b29sdGlwLmNsYXNzTGlzdC5hZGQoXCJjbXRyLWNvbW1lbnQtdG9vbHRpcFwiKTtcblx0XHRNYXJrZG93blJlbmRlcmVyLnJlbmRlcihDT01NRU5UQVRPUl9HTE9CQUwuYXBwLCBzdHIsIHRvb2x0aXAsIFwiXCIsIGNvbXBvbmVudCk7XG5cdFx0Y29tcG9uZW50LmxvYWQoKTtcblx0XHRpY29uIS5hcHBlbmRDaGlsZCh0b29sdGlwKTtcblxuXHRcdC8vIFNldCB0b29sdGlwIHBvc2l0aW9uXG5cdFx0Y29uc3QgaWNvbl9yZWN0ID0gaWNvbiEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0Y29uc3QgdG9vbHRpcF9yZWN0ID0gdG9vbHRpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR0b29sdGlwLnN0eWxlLmxlZnQgPSBpY29uX3JlY3QueCAtIHRvb2x0aXBfcmVjdC54ICsgMTIgKyBcInB4XCI7XG5cdH07XG5cblx0aWNvbi5vbm1vdXNlbGVhdmUgPSAoKSA9PiB7XG5cdFx0aWYgKHRvb2x0aXApIHtcblx0XHRcdGNvbXBvbmVudC51bmxvYWQoKTtcblx0XHRcdGljb24hLnJlbW92ZUNoaWxkKHRvb2x0aXAhKTtcblx0XHRcdHRvb2x0aXAgPSBudWxsO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gaWNvbjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbW1lbnRJY29uV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG5cdHRvb2x0aXA6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cdGljb246IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cblx0Y29tcG9uZW50OiBDb21wb25lbnQ7XG5cdGZvY3VzZWQgPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlLCBwdWJsaWMgYW5ub3RhdGlvbl9ndXR0ZXIgPSBmYWxzZSkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5jb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KCk7XG5cdH1cblxuXHRyZW5kZXJUb29sdGlwKCkge1xuXHRcdGlmICghdGhpcy50b29sdGlwKSB7XG5cdFx0XHR0aGlzLnRvb2x0aXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0dGhpcy50b29sdGlwLmNsYXNzTGlzdC5hZGQoXCJjbXRyLWNvbW1lbnQtdG9vbHRpcFwiKTtcblx0XHRcdE1hcmtkb3duUmVuZGVyZXIucmVuZGVyKENPTU1FTlRBVE9SX0dMT0JBTC5hcHAsIHRoaXMucmFuZ2UudGV4dCwgdGhpcy50b29sdGlwLCBcIlwiLCB0aGlzLmNvbXBvbmVudCk7XG5cdFx0XHR0aGlzLmNvbXBvbmVudC5sb2FkKCk7XG5cdFx0XHR0aGlzLmljb24hLmFwcGVuZENoaWxkKHRoaXMudG9vbHRpcCk7XG5cblx0XHRcdC8vIFNldCB0b29sdGlwIHBvc2l0aW9uXG5cdFx0XHRjb25zdCBpY29uX3JlY3QgPSB0aGlzLmljb24hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0Y29uc3QgdG9vbHRpcF9yZWN0ID0gdGhpcy50b29sdGlwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0dGhpcy50b29sdGlwLnN0eWxlLmxlZnQgPSBpY29uX3JlY3QueCAtIHRvb2x0aXBfcmVjdC54IC0gdG9vbHRpcF9yZWN0LndpZHRoIC8gMiArIDEyICsgXCJweFwiO1xuXHRcdH1cblx0fVxuXG5cdGZvY3VzQW5ub3RhdGlvbih2aWV3OiBFZGl0b3JWaWV3LCBlOiBFdmVudCkge1xuXHRcdC8vIFRPRE86IENoZWNrIGlmIHRoaXMgaXMgKG11Y2gpIHdvcnNlIHRoYW4gZGlyZWN0bHkgaW52b2tpbmcgdGhlIGZvY3VzIGFubm90YXRpb24gZnVuY3Rpb24gZnJvbSB0aGUgZ3V0dGVyIHBsdWdpbiBpbnN0YW5jZVxuXHRcdC8vICAgICAgVGhlIG90aGVyIG9wdGlvbnMgY2FuIHBpZ2d5LWJhY2sgb24gYWxyZWFkeSBleGlzdGluZyB0cmFuc2FjdGlvbnMsIGFuZCBqdXN0IGFubm90YXRpbmcgdGhlbVxuXHRcdC8vICAgICAgSG93ZXZlciwgdGhpcyBvbmUgZG9lc24ndCBoYXZlIG9uZSAoZXhjZXB0IGlmIGNsaWNraW5nIG9uIHRoZSB3aWRnZXQgX2lzXyBhIHRyYW5zYWN0aW9uKVxuXHRcdHZpZXcuZGlzcGF0Y2goeyBhbm5vdGF0aW9uczogWyBhbm5vdGF0aW9uR3V0dGVyRm9jdXNBbm5vdGF0aW9uLm9mKHsgZnJvbTogdGhpcy5yYW5nZS5mcm9tLCB0bzogdGhpcy5yYW5nZS50byB9KSBdIH0pO1xuXHR9XG5cblx0dW5yZW5kZXJUb29sdGlwKCkge1xuXHRcdGlmICghdGhpcy5mb2N1c2VkICYmIHRoaXMudG9vbHRpcCkge1xuXHRcdFx0dGhpcy5jb21wb25lbnQudW5sb2FkKCk7XG5cdFx0XHR0aGlzLmljb24hLnJlbW92ZUNoaWxkKHRoaXMudG9vbHRpcCEpO1xuXHRcdFx0dGhpcy50b29sdGlwID0gbnVsbDtcblx0XHR9XG5cdH1cblxuXHR0b0RPTSh2aWV3OiBFZGl0b3JWaWV3KTogSFRNTEVsZW1lbnQge1xuXHRcdHRoaXMuaWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuXHRcdHRoaXMuaWNvbi5jbGFzc0xpc3QuYWRkKFwiY210ci1jb21tZW50LWljb25cIik7XG5cdFx0c2V0SWNvbih0aGlzLmljb24sIFwibWVzc2FnZS1zcXVhcmVcIik7XG5cblx0XHQvLyBERUJVRzogQWRkIGxpbmUgdW5kZXIgaWNvbiB0byBjaGVjayBhbGlnbm1lbnQgb2YgYW5ub3RhdGlvbiBndXR0ZXIgZWxlbWVudCB3aXRoIHdpZGdldFxuXHRcdC8vIGNvbnN0IGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHQvLyBsaW5lLmNsYXNzTGlzdC5hZGQoJ2NtdHItZGVidWctY29tbWVudC1saW5lJyk7XG5cdFx0Ly8gdGhpcy5pY29uLmFwcGVuZENoaWxkKGxpbmUpO1xuXG5cdFx0aWYgKHRoaXMuYW5ub3RhdGlvbl9ndXR0ZXIpIHtcblx0XHRcdHRoaXMuaWNvbi5vbmNsaWNrID0gKGUpID0+IHRoaXMuZm9jdXNBbm5vdGF0aW9uKHZpZXcsIGUpO1xuXG5cdFx0XHR0aGlzLmljb24ub25jb250ZXh0bWVudSA9IChlKSA9PiB7XG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRjb25zdCBtZW51ID0gbmV3IE1lbnUoKTtcblx0XHRcdFx0bWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG5cdFx0XHRcdFx0aXRlbS5zZXRUaXRsZShcIkZvY3VzIGFubm90YXRpb25cIilcblx0XHRcdFx0XHRcdC5zZXRJY29uKFwiZXllXCIpXG5cdFx0XHRcdFx0XHQub25DbGljayh0aGlzLmZvY3VzQW5ub3RhdGlvbi5iaW5kKHRoaXMsIHZpZXcpKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuXHRcdFx0XHRcdGl0ZW0uc2V0VGl0bGUoXCJBZGQgY29tbWVudFwiKVxuXHRcdFx0XHRcdFx0LnNldEljb24oXCJtZXNzYWdlLXNxdWFyZVwiKVxuXHRcdFx0XHRcdFx0Lm9uQ2xpY2soKGUpID0+IHtcblx0XHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRhZGRDb21tZW50VG9WaWV3KHZpZXcsIHRoaXMucmFuZ2UpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdG1lbnUuc2hvd0F0TW91c2VFdmVudChlKTtcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0aGlzLnJhbmdlLmxlbmd0aCkge1xuXHRcdFx0XHR0aGlzLmljb24ub25tb3VzZWVudGVyID0gKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucmVuZGVyVG9vbHRpcCgpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHR0aGlzLmljb24ub25jbGljayA9ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLnJlbmRlclRvb2x0aXAoKTtcblx0XHRcdFx0XHR0aGlzLmZvY3VzZWQgPSB0cnVlO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHRoaXMuaWNvbi5vbm1vdXNlbGVhdmUgPSAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy51bnJlbmRlclRvb2x0aXAoKTtcblx0XHRcdFx0XHQvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byBjaGVjayBpZiB0aGUgdG9vbHRpcCBpcyBzdGlsbCBmb2N1c2VkIChyZXF1aXJlcyBhIGRvY3VtZW50LmNsaWNrIGxpc3RlbmVyIC0+IGV4cGVuc2l2ZT8pOyAub25ibHVyIGRvZXMgbm90IHdvcmtcblx0XHRcdFx0XHR0aGlzLmZvY3VzZWQgPSBmYWxzZTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyB0aGlzLmljb24ub25ibHVyID0gKCkgPT4ge1xuXHRcdC8vIFx0dGhpcy5mb2N1c2VkID0gZmFsc2U7XG5cdFx0Ly8gXHR0aGlzLnVucmVuZGVyVG9vbHRpcCgpO1xuXHRcdC8vIH1cblxuXHRcdHJldHVybiB0aGlzLmljb247XG5cdH1cbn1cbiIsICJpbXBvcnQge3R5cGUgRXh0ZW5zaW9uLCBSYW5nZVNldCwgU3RhdGVFZmZlY3QsIFN0YXRlRmllbGR9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHtEZWNvcmF0aW9uLCB0eXBlIERlY29yYXRpb25TZXQsIEVkaXRvclZpZXd9IGZyb20gXCJAY29kZW1pcnJvci92aWV3XCI7XG5pbXBvcnQge3JhbmdlUGFyc2VyfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuXG50eXBlIE1hcmt1cEZvY3VzID0geyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXI7IHVuZm9jdXM/OiBib29sZWFuIH07XG5leHBvcnQgY29uc3QgbWFya3VwRm9jdXNFZmZlY3QgPSBTdGF0ZUVmZmVjdC5kZWZpbmU8TWFya3VwRm9jdXM+KCk7XG5leHBvcnQgY29uc3QgbWFya3VwRm9jdXNTdGF0ZSA9IFN0YXRlRmllbGQuZGVmaW5lPE1hcmt1cEZvY3VzPih7XG4gICAgY3JlYXRlKHN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7IGZyb206IHN0YXRlLnNlbGVjdGlvbi5tYWluLmZyb20sIHRvOiBzdGF0ZS5zZWxlY3Rpb24ubWFpbi50byB9O1xuICAgIH0sXG5cbiAgICB1cGRhdGUodmFsdWUsIHRyKSB7XG4gICAgICAgIGZvciAobGV0IGUgb2YgdHIuZWZmZWN0cykge1xuICAgICAgICAgICAgaWYgKGUuaXMobWFya3VwRm9jdXNFZmZlY3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZm9jdXNSZW5kZXJlciA9IFN0YXRlRmllbGQuZGVmaW5lPERlY29yYXRpb25TZXQ+KHtcbiAgICBjcmVhdGUoc3RhdGUpOiBEZWNvcmF0aW9uU2V0IHtcbiAgICAgICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTtcbiAgICB9LFxuXG4gICAgdXBkYXRlKG9sZFNldDogRGVjb3JhdGlvblNldCwgdHIpIHtcbiAgICAgICAgY29uc3QgbWFya3VwU3RhcnRGb2N1cyA9IHRyLnN0YXJ0U3RhdGUuZmllbGQobWFya3VwRm9jdXNTdGF0ZSwgZmFsc2UpO1xuICAgICAgICBjb25zdCBtYXJrdXBFbmRGb2N1cyA9IHRyLnN0YXRlLmZpZWxkKG1hcmt1cEZvY3VzU3RhdGUpO1xuXG4gICAgICAgIGlmIChtYXJrdXBTdGFydEZvY3VzICE9PSBtYXJrdXBFbmRGb2N1cykge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2VzPSB0ci5zdGF0ZS5maWVsZChyYW5nZVBhcnNlcikucmFuZ2VzLnJhbmdlc19pbl9pbnRlcnZhbChtYXJrdXBFbmRGb2N1cy5mcm9tLCBtYXJrdXBFbmRGb2N1cy50byk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcmFuZ2VzLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIHJhbmdlc1swXS5iYXNlX3JhbmdlID09PSByYW5nZXMuYXQoLTEpPy5iYXNlX3JhbmdlICYmXG4gICAgICAgICAgICAgICAgbWFya3VwRW5kRm9jdXMuZnJvbSA+PSByYW5nZXNbMF0uZnJvbSAmJiBtYXJrdXBFbmRGb2N1cy50byA8PSByYW5nZXMuYXQoLTEpIS50b1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlU2V0Lm9mPERlY29yYXRpb24+KFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcmsoeyBhdHRyaWJ1dGVzOiB7IFwiY2xhc3NcIjogXCJjbXRyLWZvY3VzZWRcIiB9IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJhbmdlKHJhbmdlc1swXS5mdWxsX3JhbmdlX2Zyb250LCByYW5nZXNbMF0uZnVsbF9yYW5nZV9iYWNrKVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb2xkU2V0O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHByb3ZpZGUoZmllbGQ6IFN0YXRlRmllbGQ8RGVjb3JhdGlvblNldD4pOiBFeHRlbnNpb24ge1xuICAgICAgICByZXR1cm4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGZpZWxkKTtcbiAgICB9LFxufSk7XG4iLCAiaW1wb3J0IHt0eXBlIEVkaXRvclNlbGVjdGlvbiwgdHlwZSBFeHRlbnNpb24sIFJhbmdlLCBSYW5nZVNldCwgU3RhdGVGaWVsZCwgVHJhbnNhY3Rpb259IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHtEZWNvcmF0aW9uLCB0eXBlIERlY29yYXRpb25TZXQsIEVkaXRvclZpZXd9IGZyb20gXCJAY29kZW1pcnJvci92aWV3XCI7XG5pbXBvcnQge2VkaXRvckxpdmVQcmV2aWV3RmllbGR9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQge0NyaXRpY01hcmt1cFJhbmdlLCByYW5nZVBhcnNlciwgU3Vic3RpdHV0aW9uUmFuZ2UsIFN1Z2dlc3Rpb25UeXBlfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IHtlZGl0TW9kZVZhbHVlU3RhdGUsIGZ1bGxSZWxvYWRFZmZlY3QsIHByZXZpZXdNb2RlU3RhdGV9IGZyb20gXCIuLi8uLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHtFZGl0TW9kZSwgdHlwZSBQbHVnaW5TZXR0aW5ncywgUHJldmlld01vZGV9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHtDb21tZW50SWNvbldpZGdldH0gZnJvbSBcIi4vY29tbWVudC13aWRnZXRcIjtcblxuY29uc3QgaGlkZU1hcmt1cERlY29yYXRpb24gPSBEZWNvcmF0aW9uLnJlcGxhY2Uoe30pO1xuY29uc3QgcmFuZ2VNYXJrdXBEZWNvcmF0aW9uID0gKHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSwgY2xzOiBzdHJpbmcgPSBcIlwiLCBzaG93X3N0eWxpbmc6IGJvb2xlYW4gPSBmYWxzZSkgPT4gRGVjb3JhdGlvbi5tYXJrKHtcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIFwiZGF0YS1jb250ZW50c1wiOiBcInN0cmluZ1wiLFxuICAgICAgICBcImRhdGEtdHlwZVwiOiBcImNtdHItXCIgKyByYW5nZS5yZXByLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIFwiY2xhc3NcIjogY2xzLFxuICAgICAgICBcInN0eWxlXCI6IHNob3dfc3R5bGluZyAmJiByYW5nZS5maWVsZHMuY29sb3IgPyBgYmFja2dyb3VuZC1jb2xvcjogIyR7cmFuZ2UuZmllbGRzLmNvbG9yfTtgIDogXCJcIixcbiAgICB9LFxufSk7XG5cblxuZnVuY3Rpb24gaGlkZUJyYWNrZXQoXG4gICAgZGVjb3JhdGlvbnM6IFJhbmdlPERlY29yYXRpb24+W10sXG4gICAgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlLFxuICAgIHNpZGU6IC0xIHwgMCB8IDEsXG4gICAgc2hvd19zeW50YXg6IGJvb2xlYW4gPSBmYWxzZSxcbikge1xuICAgIGlmIChzaG93X3N5bnRheCkgcmV0dXJuO1xuXG4gICAgaWYgKHNpZGUgPT09IC0xKVxuICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKGhpZGVNYXJrdXBEZWNvcmF0aW9uLnJhbmdlKHJhbmdlLmZyb20sIHJhbmdlLmZyb20gKyAzKSk7XG4gICAgZWxzZSBpZiAoc2lkZSA9PT0gMSlcbiAgICAgICAgZGVjb3JhdGlvbnMucHVzaChoaWRlTWFya3VwRGVjb3JhdGlvbi5yYW5nZShyYW5nZS50byAtIDMsIHJhbmdlLnRvKSk7XG4gICAgZWxzZVxuICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKGhpZGVNYXJrdXBEZWNvcmF0aW9uLnJhbmdlKChyYW5nZSBhcyBTdWJzdGl0dXRpb25SYW5nZSkubWlkZGxlLCAocmFuZ2UgYXMgU3Vic3RpdHV0aW9uUmFuZ2UpLm1pZGRsZSArIDIpKTtcbn1cblxuZnVuY3Rpb24gaGlkZU1ldGFkYXRhKFxuICAgIGRlY29yYXRpb25zOiBSYW5nZTxEZWNvcmF0aW9uPltdLFxuICAgIHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSxcbiAgICBzaG93X21ldGFkYXRhOiBib29sZWFuID0gZmFsc2Vcbikge1xuICAgIGlmICghcmFuZ2UubWV0YWRhdGEgfHwgc2hvd19tZXRhZGF0YSkgcmV0dXJuO1xuXG4gICAgZGVjb3JhdGlvbnMucHVzaChoaWRlTWFya3VwRGVjb3JhdGlvbi5yYW5nZShyYW5nZS5mcm9tICsgMywgcmFuZ2UubWV0YWRhdGEgKyAyKSk7XG59XG5cbmZ1bmN0aW9uIGhpZGVSYW5nZShkZWNvcmF0aW9uczogUmFuZ2U8RGVjb3JhdGlvbj5bXSwgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlKSB7XG4gICAgZGVjb3JhdGlvbnMucHVzaChoaWRlTWFya3VwRGVjb3JhdGlvbi5yYW5nZShyYW5nZS5mcm9tLCByYW5nZS50bykpO1xufVxuXG5mdW5jdGlvbiBtYXJrQ29udGVudHMoXG4gICAgZGVjb3JhdGlvbnM6IFJhbmdlPERlY29yYXRpb24+W10sXG4gICAgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlLFxuICAgIGNsczogc3RyaW5nLFxuICAgIGxlZnQ6IG51bWJlciA9IDAsXG4gICAgaW5jbHVzaXZlID0gZmFsc2UsXG4gICAgc2hvd19zdHlsaW5nID0gdHJ1ZSxcbikge1xuICAgIGNvbnN0IG9mZnNldCA9IGluY2x1c2l2ZSA/IDAgOiAzO1xuXG4gICAgaWYgKGxlZnQgPT09IDApIHtcbiAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSgpKSB7XG4gICAgICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKHJhbmdlTWFya3VwRGVjb3JhdGlvbihyYW5nZSwgY2xzLCBzaG93X3N0eWxpbmcpXG4gICAgICAgICAgICAgICAgLnJhbmdlKHJhbmdlLmZyb20gKyBvZmZzZXQsIHJhbmdlLnRvIC0gb2Zmc2V0KSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgICAgICAgIGlmICghcmFuZ2UucGFydF9pc19lbXB0eSh0cnVlKSkge1xuICAgICAgICAgICAgICAgIGRlY29yYXRpb25zLnB1c2gocmFuZ2VNYXJrdXBEZWNvcmF0aW9uKHJhbmdlLCBjbHMsIHNob3dfc3R5bGluZylcbiAgICAgICAgICAgICAgICAgICAgLnJhbmdlKHJhbmdlLmZyb20gKyBvZmZzZXQsIChyYW5nZSBhcyBTdWJzdGl0dXRpb25SYW5nZSkubWlkZGxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobGVmdCA+IDApIHtcbiAgICAgICAgICAgIGlmICghcmFuZ2UucGFydF9pc19lbXB0eShmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKHJhbmdlTWFya3VwRGVjb3JhdGlvbihyYW5nZSwgY2xzLCBzaG93X3N0eWxpbmcpXG4gICAgICAgICAgICAgICAgICAgIC5yYW5nZSgocmFuZ2UgYXMgU3Vic3RpdHV0aW9uUmFuZ2UpLm1pZGRsZSArIDIsIHJhbmdlLnRvIC0gb2Zmc2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGhpZGVTeW50YXgoXG4gICAgZGVjb3JhdGlvbnM6IFJhbmdlPERlY29yYXRpb24+W10sXG4gICAgcmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlLFxuICAgIHN0eWxlOiBzdHJpbmcgPSBcIlwiXG4pIHtcbiAgICBoaWRlQnJhY2tldChkZWNvcmF0aW9ucywgcmFuZ2UsIC0xKTtcbiAgICBoaWRlTWV0YWRhdGEoZGVjb3JhdGlvbnMsIHJhbmdlKTtcbiAgICBtYXJrQ29udGVudHMoZGVjb3JhdGlvbnMsIHJhbmdlLCBzdHlsZSk7XG4gICAgaGlkZUJyYWNrZXQoZGVjb3JhdGlvbnMsIHJhbmdlLCAxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdERlY29yYXRpb25zKFxuICAgIHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXSxcbiAgICBzZWxlY3Rpb25zOiBFZGl0b3JTZWxlY3Rpb24gfCBudWxsLFxuICAgIHByZXZpZXdfbW9kZTogUHJldmlld01vZGUsXG4gICAgZWRpdF9tb2RlOiBFZGl0TW9kZSxcbiAgICBzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MsXG4pIHtcblxuICAgIGNvbnN0IGRlY29yYXRpb25zOiBSYW5nZTxEZWNvcmF0aW9uPltdID0gW107XG4gICAgY29uc3QgeyBzaG93X3N0eWxpbmcsIHNob3dfc3ludGF4LCBzaG93X21ldGFkYXRhLCBzaG93X2NvbW1lbnQgfSA9IHNldHRpbmdzLm1hcmt1cF9mb2N1c1tlZGl0X21vZGVdO1xuXG4gICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHtcbiAgICAgICAgLy8gVE9ETzogQ2hlY2sgaWYgJ2luIGZvY3VzJyBzdGF0dXMgc2hvdWxkIGFsc28gYmUgYXBwbGljYWJsZSB3aGVuIGluIHNvbWUga2luZCBvZiBwcmV2aWV3IG1vZGVcbiAgICAgICAgLy8gICAgICBDdXJyZW50bHksIHRoZSBhc3N1bXB0aW9uIGlzIG1hZGUgdGhhdCAncHJldmlldycgaXMgT05MWSBmb3Igdmlld2luZyB0aGUgZW5kIHJlc3VsdCxcbiAgICAgICAgLy8gICAgICBhbnkgY29tbWVudHMsIHN0eWxpbmdzLCBldGMsIHNob3VsZCBfbm90XyBiZSBzaG93bi5cblxuICAgICAgICBpZiAocHJldmlld19tb2RlID09PSBQcmV2aWV3TW9kZS5BTEwpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgY2hlY2sgbWlnaHQgYmUgYnlwYXNzZWQgaWYgYSBndWFyYW50ZWUgY2FuIGJlIG1hZGUgb24gd2hldGhlciB0aGUgcmFuZ2VzIHBhc3NlZFxuICAgICAgICAgICAgLy8gICAgICAgYXJlIGFsd2F5cyBpbiBhIHNlbGVjdGlvbiBpZiAnc2VsZWN0aW9ucycgaXMgbm90IG51bGxcbiAgICAgICAgICAgIGNvbnN0IGluX3JhbmdlID0gc2VsZWN0aW9ucyA/IHNlbGVjdGlvbnMucmFuZ2VzLnNvbWUoc2VsX3JhbmdlID0+XG4gICAgICAgICAgICAgICAgcmFuZ2UucGFydGlhbGx5X2luX2Z1bGxfcmFuZ2Uoc2VsX3JhbmdlLmZyb20sIHNlbF9yYW5nZS50bylcbiAgICAgICAgICAgICkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGxldCBzdHlsZSA9IGBjbXRyLWlubGluZSBjbXRyLSR7cmFuZ2UucmVwci50b0xvd2VyQ2FzZSgpfSBgICsgKHJhbmdlLmZpZWxkcy5zdHlsZSB8fCBcIlwiKVxuICAgICAgICAgICAgaWYgKHJhbmdlLnJlcGxpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUgKz0gXCIgY210ci1oYXMtcmVwbHlcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBjb3VsZCBiZSBiZXR0ZXIgKGJ1dCBJIGRpZG4ndCBuZWNlc3NhcmlseSB3YW50IHRvIGNyZWF0ZSB0d28gc2VwYXJhdGUgY29kZSBwYXRocylcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlX3Nob3dfc3ludGF4ID0gaW5fcmFuZ2UgPyBzaG93X3N5bnRheCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByYW5nZV9zaG93X21ldGFkYXRhID0gaW5fcmFuZ2UgPyBzaG93X21ldGFkYXRhIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJhbmdlX3Nob3dfc3R5bGluZyA9IGluX3JhbmdlID8gc2hvd19zdHlsaW5nIDogdW5kZWZpbmVkO1xuXG5cbiAgICAgICAgICAgIGlmICghKHNob3dfY29tbWVudCAmJiBpbl9yYW5nZSkgJiYgcmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCAmJiBzZXR0aW5ncy5jb21tZW50X3N0eWxlICE9PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmNvbW1lbnRfc3R5bGUgPT09IFwiaWNvblwiICYmIHJhbmdlLmJhc2VfcmFuZ2UgPT09IHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVYUEw6IENvbW1lbnQgcmFuZ2VzIGFyZSBvbmx5IHNob3duIGFzIGljb25zIGluIGxpdmUgcHJldmlldyBtb2RlXG4gICAgICAgICAgICAgICAgICAgIGRlY29yYXRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0aW9uLnJlcGxhY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldDogbmV3IENvbW1lbnRJY29uV2lkZ2V0KHJhbmdlLCBzZXR0aW5ncy5hbm5vdGF0aW9uX2d1dHRlciksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5yYW5nZShyYW5nZS5mcm9tLCByYW5nZS50byksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRVhQTDogRWl0aGVyIHRoZSBjb21tZW50IGlzIG5vdCB0aGUgdG9wIG9mIGEgcmFuZ2UsIG9yIGl0IGlzIGhpZGRlbiBieSBjb21tZW50X3N0eWxlID0gXCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgZGVjb3JhdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRpb24ucmVwbGFjZSh7fSkucmFuZ2UocmFuZ2UuZnJvbSwgcmFuZ2UudG8pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGlkZUJyYWNrZXQoZGVjb3JhdGlvbnMsIHJhbmdlLCAtMSwgcmFuZ2Vfc2hvd19zeW50YXgpO1xuICAgICAgICAgICAgICAgIGhpZGVNZXRhZGF0YShkZWNvcmF0aW9ucywgcmFuZ2UsIHJhbmdlX3Nob3dfbWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgbWFya0NvbnRlbnRzKGRlY29yYXRpb25zLCByYW5nZSwgc3R5bGUgKyBcIiBjbXRyLWRlbGV0aW9uXCIsIC0xLCBmYWxzZSwgcmFuZ2Vfc2hvd19zdHlsaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZUJyYWNrZXQoZGVjb3JhdGlvbnMsIHJhbmdlLCAwLCByYW5nZV9zaG93X3N5bnRheCk7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtDb250ZW50cyhkZWNvcmF0aW9ucywgcmFuZ2UsIHN0eWxlICsgXCIgY210ci1hZGRpdGlvblwiLCAxLCBmYWxzZSwgcmFuZ2Vfc2hvd19zdHlsaW5nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtYXJrQ29udGVudHMoZGVjb3JhdGlvbnMsIHJhbmdlLCBzdHlsZSwgMCwgZmFsc2UsIHJhbmdlX3Nob3dfc3R5bGluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhpZGVCcmFja2V0KGRlY29yYXRpb25zLCByYW5nZSwgMSwgcmFuZ2Vfc2hvd19zeW50YXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZWxzZSBpZiAocHJldmlld19tb2RlID09PSBQcmV2aWV3TW9kZS5BQ0NFUFQpIHtcbiAgICAgICAgICAgIGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5BRERJVElPTilcbiAgICAgICAgICAgICAgICBoaWRlU3ludGF4KGRlY29yYXRpb25zLCByYW5nZSwgXCJjbXRyLWFjY2VwdGVkXCIpO1xuICAgICAgICAgICAgZWxzZSBpZiAocmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuREVMRVRJT04pXG4gICAgICAgICAgICAgICAgaGlkZVJhbmdlKGRlY29yYXRpb25zLCByYW5nZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT04pIHtcbiAgICAgICAgICAgICAgICBoaWRlQnJhY2tldChkZWNvcmF0aW9ucywgcmFuZ2UsIC0xKTtcbiAgICAgICAgICAgICAgICBoaWRlTWV0YWRhdGEoZGVjb3JhdGlvbnMsIHJhbmdlKTtcbiAgICAgICAgICAgICAgICBoaWRlQnJhY2tldChkZWNvcmF0aW9ucywgcmFuZ2UsIDApO1xuICAgICAgICAgICAgICAgIG1hcmtDb250ZW50cyhkZWNvcmF0aW9ucywgcmFuZ2UsIFwiY210ci1hY2NlcHRlZFwiLCAxKTtcbiAgICAgICAgICAgICAgICBoaWRlQnJhY2tldChkZWNvcmF0aW9ucywgcmFuZ2UsIDEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5DT01NRU5UKSB7XG4gICAgICAgICAgICAgICAgaGlkZVJhbmdlKGRlY29yYXRpb25zLCByYW5nZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhpZGVTeW50YXgoZGVjb3JhdGlvbnMsIHJhbmdlLCBcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVsc2UgaWYgKHByZXZpZXdfbW9kZSA9PT0gUHJldmlld01vZGUuUkVKRUNUKSB7XG4gICAgICAgICAgICBpZiAocmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQURESVRJT04pXG4gICAgICAgICAgICAgICAgaGlkZVJhbmdlKGRlY29yYXRpb25zLCByYW5nZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5ERUxFVElPTikge1xuICAgICAgICAgICAgICAgIGhpZGVCcmFja2V0KGRlY29yYXRpb25zLCByYW5nZSwgLTEpO1xuICAgICAgICAgICAgICAgIGhpZGVNZXRhZGF0YShkZWNvcmF0aW9ucywgcmFuZ2UpO1xuICAgICAgICAgICAgICAgIG1hcmtDb250ZW50cyhkZWNvcmF0aW9ucywgcmFuZ2UsIFwiY210ci1hY2NlcHRlZFwiKTtcbiAgICAgICAgICAgICAgICBoaWRlQnJhY2tldChkZWNvcmF0aW9ucywgcmFuZ2UsIDEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT04pIHtcbiAgICAgICAgICAgICAgICBoaWRlQnJhY2tldChkZWNvcmF0aW9ucywgcmFuZ2UsIC0xKTtcbiAgICAgICAgICAgICAgICBoaWRlTWV0YWRhdGEoZGVjb3JhdGlvbnMsIHJhbmdlKTtcbiAgICAgICAgICAgICAgICBtYXJrQ29udGVudHMoZGVjb3JhdGlvbnMsIHJhbmdlLCBcImNtdHItYWNjZXB0ZWRcIiwgLTEpO1xuICAgICAgICAgICAgICAgIGhpZGVCcmFja2V0KGRlY29yYXRpb25zLCByYW5nZSwgMCk7XG4gICAgICAgICAgICAgICAgaGlkZUJyYWNrZXQoZGVjb3JhdGlvbnMsIHJhbmdlLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCkge1xuICAgICAgICAgICAgICAgIGhpZGVSYW5nZShkZWNvcmF0aW9ucywgcmFuZ2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoaWRlU3ludGF4KGRlY29yYXRpb25zLCByYW5nZSwgXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdGlvbnM7XG5cblxufVxuXG5leHBvcnQgY29uc3QgbGl2ZXByZXZpZXdSZW5kZXJlciA9IChzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpID0+XG4gICAgU3RhdGVGaWVsZC5kZWZpbmU8RGVjb3JhdGlvblNldD4oe1xuICAgICAgICBjcmVhdGUoc3RhdGUpOiBEZWNvcmF0aW9uU2V0IHtcbiAgICAgICAgICAgIGNvbnN0IGxpdmVfcHJldmlldyA9IHN0YXRlLmZpZWxkKGVkaXRvckxpdmVQcmV2aWV3RmllbGQpO1xuXG4gICAgICAgICAgICAvLyBFWFBMOiBObyBsaXZlIHByZXZpZXcsIG5vIGRlY29yYXRpb25zXG4gICAgICAgICAgICBpZiAoIWxpdmVfcHJldmlldykge1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByZXZpZXdfbW9kZSA9IHN0YXRlLmZhY2V0KHByZXZpZXdNb2RlU3RhdGUpO1xuICAgICAgICAgICAgY29uc3QgZWRpdF9tb2RlID0gc3RhdGUuZmFjZXQoZWRpdE1vZGVWYWx1ZVN0YXRlKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkX3JhbmdlcyA9IHN0YXRlLmZpZWxkKHJhbmdlUGFyc2VyKTtcblxuICAgICAgICAgICAgcmV0dXJuIFJhbmdlU2V0Lm9mPERlY29yYXRpb24+KFxuICAgICAgICAgICAgICAgIGNvbnN0cnVjdERlY29yYXRpb25zKFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRfcmFuZ2VzLnJhbmdlcy5yYW5nZXMsXG4gICAgICAgICAgICAgICAgICAgIC8qc3RhdGUuc2VsZWN0aW9uKi8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcHJldmlld19tb2RlLFxuICAgICAgICAgICAgICAgICAgICBlZGl0X21vZGUsXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZShvbGRTZXQ6IERlY29yYXRpb25TZXQsIHRyOiBUcmFuc2FjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgbGl2ZV9wcmV2aWV3ID0gdHIuc3RhdGUuZmllbGQoZWRpdG9yTGl2ZVByZXZpZXdGaWVsZCk7XG5cbiAgICAgICAgICAgIC8vIEVYUEw6IE5PIExJVkUgUFJFVklFVyAoc291cmNlIG1vZGUgcmVuZGVyaW5nKVxuICAgICAgICAgICAgaWYgKCFsaXZlX3ByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwcmV2aWV3X21vZGUgPSB0ci5zdGF0ZS5mYWNldChwcmV2aWV3TW9kZVN0YXRlKTtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRfbW9kZSA9IHRyLnN0YXRlLmZhY2V0KGVkaXRNb2RlVmFsdWVTdGF0ZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZF9jbV9yYW5nZXMgPSB0ci5zdGF0ZS5maWVsZChyYW5nZVBhcnNlcik7XG5cbiAgICAgICAgICAgIC8vIEVYUEw6IFNFVFRJTkcgQ0hBTkdFU1xuICAgICAgICAgICAgLy8gIEFsbCBkZWNvcmF0aW9ucyBuZWVkIHRvIGJlIHJlbG9hZGVkXG4gICAgICAgICAgICAvLyAgICAgLSBTd2l0Y2hpbmcgYmV0d2VlbiBsaXZlIHByZXZpZXcgYW5kIHNvdXJjZSByZW5kZXJpbmdcbiAgICAgICAgICAgIC8vICAgICAtIFN3aXRjaGluZyBhbm5vdGF0aW9uIHByZXZpZXcgbW9kZXNcbiAgICAgICAgICAgIC8vICAgICAtIFNldHRpbmdzIGNoYW5nZSAoaW5kaWNhdGVkIGJ5IGZ1bGxSZWxvYWRFZmZlY3QpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbGl2ZV9wcmV2aWV3ICE9PSB0ci5zdGFydFN0YXRlLmZpZWxkKGVkaXRvckxpdmVQcmV2aWV3RmllbGQpIHx8XG4gICAgICAgICAgICAgICAgcHJldmlld19tb2RlICE9PSB0ci5zdGFydFN0YXRlLmZhY2V0KHByZXZpZXdNb2RlU3RhdGUpIHx8XG4gICAgICAgICAgICAgICAgdHIuZWZmZWN0cy5zb21lKGUgPT4gZS5pcyhmdWxsUmVsb2FkRWZmZWN0KSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZVNldC5vZjxEZWNvcmF0aW9uPihcbiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0RGVjb3JhdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRfY21fcmFuZ2VzLnJhbmdlcy5yYW5nZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5zdGF0ZS5zZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3X21vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0X21vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFWFBMOiBDT05URU5UIENIQU5HRVNcbiAgICAgICAgICAgIC8vICAgICAgICAgIE9ubHkgdXBkYXRlIGRlY29yYXRpb25zIHRoYXQgYXJlIGluIHRoZSBjaGFuZ2VkIHJhbmdlICh0eXBpbmcsIGRlbGV0aW5nLCBldGMuKVxuICAgICAgICAgICAgaWYgKHRyLmRvY0NoYW5nZWQgfHwgKCF0ci5kb2NDaGFuZ2VkICYmIHBhcnNlZF9jbV9yYW5nZXMuaW5zZXJ0ZWRfcmFuZ2VzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2VfZmlsdGVyX2lkeD0gMDtcblxuICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIF9taWdodF8gYmUgYnJva2VuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9sZFNldC51cGRhdGUoe1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IChmcm9tLCB0bywgXykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJhbmdlX2ZpbHRlcl9pZHggPCBwYXJzZWRfY21fcmFuZ2VzLmRlbGV0ZWRfcmFuZ2VzLmxlbmd0aCAmJiBwYXJzZWRfY21fcmFuZ2VzLmRlbGV0ZWRfcmFuZ2VzW3JhbmdlX2ZpbHRlcl9pZHhdLnRvIDw9IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9maWx0ZXJfaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHBhcnNlZF9jbV9yYW5nZXMuZGVsZXRlZF9yYW5nZXNbcmFuZ2VfZmlsdGVyX2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShyYW5nZSAmJiBmcm9tIDwgcmFuZ2UudG8gJiYgcmFuZ2UuZnJvbSA8IHRvKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KS5tYXAodHIuY2hhbmdlcykudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgYWRkOiBjb25zdHJ1Y3REZWNvcmF0aW9ucyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZF9jbV9yYW5nZXMuaW5zZXJ0ZWRfcmFuZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHIuc3RhdGUuc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlld19tb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdF9tb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVYUEw6IFNFTEVDVElPTiBDSEFOR0VTXG4gICAgICAgICAgICAvLyAgICAgICAgICBPbmx5IHVwZGF0ZSBkZWNvcmF0aW9ucyB0aGF0IGFyZSBpbiB0aGUgb2xkIGFuZCBuZXcgc2VsZWN0aW9uXG4gICAgICAgICAgICAvLyBQRVJGOiAyLTZtcyBmb3IgZXZlcnkgc2VsZWN0aW9uY2hhbmdlIG9uIHN0cmVzc3Rlc3QgKHJlZHJhd2luZyBhbGwgZGVjb3JhdGlvbnMgdGFrZXMgMTJtcylcbiAgICAgICAgICAgIC8vXHRcdCAwLjAxLTAuMDVtcyBmb3IgcmVndWxhciBzbWFsbCBub3Rlc1xuICAgICAgICAgICAgLy8gICAgICAgTGFyZ2VzdCBwZXJmb3JtYW5jZSBpbXBhY3QgaXMgZnJvbSB0aGUgYHVwZGF0ZS5maWx0ZXJgIG1ldGhvZCwgd2hpY2ggdGFrZXMgOTAlIG9mIHRoZSB0aW1lXG4gICAgICAgICAgICBpZiAodHIubmV3U2VsZWN0aW9uICE9PSB0ci5zdGFydFN0YXRlLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIEVYUEw6IENvbWJpbmUgYWxsIG9sZCBhbmQgbmV3IHNlbGVjdGlvbnMgaW50byBvbmUgc2luZ2xlIHNlbGVjdGlvbiByYW5nZVxuICAgICAgICAgICAgICAgIGxldCBhbGxfc2VsZWN0aW9uX3JhbmdlcyA9IHRyLm5ld1NlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIHRyLnN0YXJ0U3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgICAgICAgICBhbGxfc2VsZWN0aW9uX3JhbmdlcyA9IGFsbF9zZWxlY3Rpb25fcmFuZ2VzLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjbV9yYW5nZXNfaW5fc2VsZWN0aW9ucyA9IHBhcnNlZF9jbV9yYW5nZXMucmFuZ2VzLnJhbmdlc19pbl9pbnRlcnZhbHMoYWxsX3NlbGVjdGlvbl9yYW5nZXMucmFuZ2VzIGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHRvOiBudW1iZXJcbiAgICAgICAgICAgICAgICB9W10pO1xuXG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlX2ZpbHRlcl9pZHggPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBvbGRTZXQubWFwKHRyLmNoYW5nZXMpLnVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcjogKGZyb20sIHRvLCBfKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmFuZ2VfZmlsdGVyX2lkeCA8IGNtX3Jhbmdlc19pbl9zZWxlY3Rpb25zLmxlbmd0aCAmJiBjbV9yYW5nZXNfaW5fc2VsZWN0aW9uc1tyYW5nZV9maWx0ZXJfaWR4XS50byA8PSBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfZmlsdGVyX2lkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBjbV9yYW5nZXNfaW5fc2VsZWN0aW9uc1tyYW5nZV9maWx0ZXJfaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKHJhbmdlICYmIGZyb20gPCByYW5nZS50byAmJiByYW5nZS5mcm9tIDwgdG8pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBhZGQ6IGNvbnN0cnVjdERlY29yYXRpb25zKFxuICAgICAgICAgICAgICAgICAgICAgICAgY21fcmFuZ2VzX2luX3NlbGVjdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5uZXdTZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3X21vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0X21vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRVhQTDogTk8gQ0hBTkdFU1xuICAgICAgICAgICAgcmV0dXJuIG9sZFNldDtcbiAgICAgICAgfSxcblxuICAgICAgICBwcm92aWRlKGZpZWxkOiBTdGF0ZUZpZWxkPERlY29yYXRpb25TZXQ+KTogRXh0ZW5zaW9uIHtcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JWaWV3LmRlY29yYXRpb25zLmZyb20oZmllbGQpO1xuICAgICAgICB9LFxuICAgIH0pO1xuIiwgImltcG9ydCB7IENvbXBhcnRtZW50IH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uX2d1dHRlciwgQW5ub3RhdGlvbkd1dHRlclZpZXcsIGFubm90YXRpb25HdXR0ZXJWaWV3LFxuXHRhbm5vdGF0aW9uR3V0dGVyRm9jdXNBbm5vdGF0aW9uLCBhbm5vdGF0aW9uR3V0dGVyRm9sZEFubm90YXRpb24sIGFubm90YXRpb25HdXR0ZXJXaWR0aEFubm90YXRpb24sIGFubm90YXRpb25HdXR0ZXJIaWRlRW1wdHlBbm5vdGF0aW9uLFxuXHRhbm5vdGF0aW9uR3V0dGVyUmVzaXplSGFuZGxlQW5ub3RhdGlvbiwgYW5ub3RhdGlvbkd1dHRlckZvbGRCdXR0b25Bbm5vdGF0aW9uLCBhbm5vdGF0aW9uR3V0dGVyRm9jdXNUaHJlYWRBbm5vdGF0aW9uXG4gfSBmcm9tIFwiLi9hbm5vdGF0aW9uLWd1dHRlclwiO1xuaW1wb3J0IHsgYW5ub3RhdGlvbkd1dHRlck1hcmtlcnMsIEFubm90YXRpb25NYXJrZXIgfSBmcm9tIFwiLi9tYXJrZXJcIjtcbmltcG9ydCB0eXBlIENvbW1lbnRhdG9yUGx1Z2luIGZyb20gXCIuLi8uLi8uLi8uLi9tYWluXCI7XG5cbmV4cG9ydCB7XG5cdEFubm90YXRpb25HdXR0ZXJWaWV3LCBhbm5vdGF0aW9uR3V0dGVyTWFya2VycywgQW5ub3RhdGlvbk1hcmtlciwgYW5ub3RhdGlvbkd1dHRlclZpZXcsXG5cdGFubm90YXRpb25HdXR0ZXJGb2N1c0Fubm90YXRpb24sIGFubm90YXRpb25HdXR0ZXJGb2xkQW5ub3RhdGlvbiwgYW5ub3RhdGlvbkd1dHRlcldpZHRoQW5ub3RhdGlvbiwgYW5ub3RhdGlvbkd1dHRlckhpZGVFbXB0eUFubm90YXRpb24sXG5cdGFubm90YXRpb25HdXR0ZXJSZXNpemVIYW5kbGVBbm5vdGF0aW9uLCBhbm5vdGF0aW9uR3V0dGVyRm9sZEJ1dHRvbkFubm90YXRpb24sIGFubm90YXRpb25HdXR0ZXJGb2N1c1RocmVhZEFubm90YXRpb24sXG59O1xuXG4vLyBOT1RFOiBLZWVwIHRoZSBndXR0ZXIgaGVyZSwgYXMgT2JzaWRpYW4gKnJlYWxseSogZG9lcyBub3QgbGlrZSB0aGUgY2lyY3VsYXIgcmVmZXJlbmNlXG4vLyBcdFx0IGJldHdlZW4gTWFya2VycyBhbmQgR3V0dGVycyAod2hpY2ggaXMgcmVxdWlyZWQgZm9yIGNhbGxpbmcgdGhlIG1vdmVHdXR0ZXIgZnVuY3Rpb24pXG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlciA9IChwbHVnaW46IENvbW1lbnRhdG9yUGx1Z2luKSA9PiBbXG5cdGFubm90YXRpb25HdXR0ZXJNYXJrZXJzLFxuXHRhbm5vdGF0aW9uX2d1dHRlcih7XG5cdFx0Y2xhc3M6IFwiY210ci1hbm5vLWd1dHRlciBcIiArIChwbHVnaW4uYXBwLnZhdWx0LmdldENvbmZpZyhcImNzc1RoZW1lXCIpID09PSBcIk1pbmltYWxcIiA/IFwiIGlzLW1pbmltYWxcIiA6IFwiXCIpLFxuXHRcdG1hcmtlcnM6IHYgPT4gdi5zdGF0ZS5maWVsZChhbm5vdGF0aW9uR3V0dGVyTWFya2VycyksXG5cdFx0Zm9sZFN0YXRlOiBwbHVnaW4uc2V0dGluZ3MuYW5ub3RhdGlvbl9ndXR0ZXJfZGVmYXVsdF9mb2xkX3N0YXRlLFxuXHRcdHdpZHRoOiBwbHVnaW4uc2V0dGluZ3MuYW5ub3RhdGlvbl9ndXR0ZXJfd2lkdGgsXG5cdFx0aGlkZU9uRW1wdHk6IHBsdWdpbi5zZXR0aW5ncy5hbm5vdGF0aW9uX2d1dHRlcl9oaWRlX2VtcHR5LFxuXHRcdGluY2x1ZGVGb2xkQnV0dG9uOiBwbHVnaW4uc2V0dGluZ3MuYW5ub3RhdGlvbl9ndXR0ZXJfZm9sZF9idXR0b24sXG5cdFx0aW5jbHVkZVJlc2l6ZUhhbmRsZTogcGx1Z2luLnNldHRpbmdzLmFubm90YXRpb25fZ3V0dGVyX3Jlc2l6ZV9oYW5kbGUsXG5cdH0pLFxuXTtcblxuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5cbiIsICJpbXBvcnQge0VkaXRvclZpZXd9IGZyb20gXCJAY29kZW1pcnJvci92aWV3XCI7XG5pbXBvcnQge0NyaXRpY01hcmt1cFJhbmdlLCBTdWdnZXN0aW9uVHlwZX0gZnJvbSBcIi4uL3Jhbmdlc1wiO1xuaW1wb3J0IHtjcmVhdGVfcmFuZ2V9IGZyb20gXCIuLi9lZGl0LXV0aWwvcmFuZ2UtY3JlYXRlXCI7XG5pbXBvcnQge0VkaXRvclNlbGVjdGlvbn0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQge2Fubm90YXRpb25HdXR0ZXJGb2N1c0Fubm90YXRpb259IGZyb20gXCIuLi8uLi9yZW5kZXJlcnMvZ3V0dGVycy9hbm5vdGF0aW9ucy1ndXR0ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZENvbW1lbnRUb1ZpZXcoZWRpdG9yOiBFZGl0b3JWaWV3LCByYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UgfCB1bmRlZmluZWQsIHNjcm9sbDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgY3Vyc29yID0gcmFuZ2UgPyByYW5nZS5mdWxsX3JhbmdlX2JhY2sgOiBlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZDtcbiAgICBjb25zdCByZXBseV9pZHggPSByYW5nZSA/IHJhbmdlLmZ1bGxfdGhyZWFkLmxlbmd0aCA6IC0xO1xuXG4gICAgZWRpdG9yLmRpc3BhdGNoKGVkaXRvci5zdGF0ZS51cGRhdGUoe1xuICAgICAgICBjaGFuZ2VzOiB7XG4gICAgICAgICAgICBmcm9tOiBjdXJzb3IsXG4gICAgICAgICAgICB0bzogY3Vyc29yLFxuICAgICAgICAgICAgaW5zZXJ0OiBjcmVhdGVfcmFuZ2UoU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCwgXCJcIiksXG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdGlvbjogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihjdXJzb3IpLFxuICAgICAgICBzY3JvbGxJbnRvVmlldzogc2Nyb2xsLFxuICAgIH0pKTtcblxuXG4gICAgLy8gRVhQTDogVGhpcyBjb2RlIGVuc3VyZXMgdGhhdCB0aGUgaW5wdXQgb2YgYSBuZXcgY29tbWVudCBpcyBmb2N1c2VkIG9uIHdoZW4gY3JlYXRlZFxuICAgIC8vIEZJWE1FOiBBIG1vcmUgY2Fub25pY2FsIHdheSBpcyByZXF1aXJlZCB0byB3YWl0IHRpbGwgdGhlIENNIHN0YXRlIHVwZGF0ZSAodGhlIG5ldyBjb21tZW50IGVsZW1lbnQgbmVlZHMgdG8gYmUgcmVuZGVyZWQpXG4gICAgLy8gICBTb21lIGF0dGVtcHRzIHRoYXQgZGlkIG5vdCB3b3JrOlxuICAgIC8vICAgIC0gdXNpbmcgYHNlcXVlbnRpYWxgIGluIHRoZSBgdXBkYXRlYCBtZXRob2RcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgZWRpdG9yLmRpc3BhdGNoKGVkaXRvci5zdGF0ZS51cGRhdGUoe1xuICAgICAgICBhbm5vdGF0aW9uczogW1xuICAgICAgICAgICAgYW5ub3RhdGlvbkd1dHRlckZvY3VzQW5ub3RhdGlvbi5vZih7XG4gICAgICAgICAgICAgICAgZnJvbTogY3Vyc29yLFxuICAgICAgICAgICAgICAgIHRvOiBjdXJzb3IsXG4gICAgICAgICAgICAgICAgaW5kZXg6IHJlcGx5X2lkeCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdXG4gICAgfSkpfSk7XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBDaGFuZ2VTcGVjLCBFZGl0b3JTdGF0ZSB9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuXG5pbXBvcnQgdHlwZSB7IEFwcCwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHsgYXBwbHlUb1RleHQsIHJhbmdlUGFyc2VyIH0gZnJvbSBcIi4uL2VkaXQtdXRpbFwiO1xuaW1wb3J0IHsgQ3JpdGljTWFya3VwUmFuZ2UsIFN1Z2dlc3Rpb25UeXBlIH0gZnJvbSBcIi4uL3Jhbmdlc1wiO1xuXG4vLyBUT0RPOiBNb3JlIHNvcGhpc3RpY2F0ZWQgcmVtb3ZhbCBoYW5kbGluZ1xuZXhwb3J0IGZ1bmN0aW9uIGFjY2VwdFN1Z2dlc3Rpb25zKHN0YXRlOiBFZGl0b3JTdGF0ZSwgZnJvbT86IG51bWJlciwgdG8/OiBudW1iZXIsIHJlbW92ZV9hdHRhY2hlZF9jb21tZW50czogYm9vbGVhbiA9IHRydWUpOiBDaGFuZ2VTcGVjW10ge1xuXHRjb25zdCByYW5nZV9maWVsZCA9IHN0YXRlLmZpZWxkKHJhbmdlUGFyc2VyKS5yYW5nZXM7XG5cdHJldHVybiAoKGZyb20gfHwgdG8pID8gcmFuZ2VfZmllbGQucmFuZ2VzX2luX2ludGVydmFsKGZyb20gPz8gMCwgdG8gPz8gSW5maW5pdHkpIDogcmFuZ2VfZmllbGQucmFuZ2VzKVxuXHRcdC5maWx0ZXIocmFuZ2UgPT5cblx0XHRcdHJhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLkFERElUSU9OIHx8IHJhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OIHx8XG5cdFx0XHRyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT05cblx0XHQpXG5cdFx0Lm1hcChyYW5nZSA9PiAoeyBmcm9tOiByYW5nZS5mcm9tLCB0bzogcmVtb3ZlX2F0dGFjaGVkX2NvbW1lbnRzID8gcmFuZ2UuZnVsbF9yYW5nZV9iYWNrIDogcmFuZ2UudG8sIGluc2VydDogcmFuZ2UuYWNjZXB0KCkgfSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVqZWN0U3VnZ2VzdGlvbnMoc3RhdGU6IEVkaXRvclN0YXRlLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgcmVtb3ZlX2F0dGFjaGVkX2NvbW1lbnRzOiBib29sZWFuID0gdHJ1ZSk6IENoYW5nZVNwZWNbXSB7XG5cdGNvbnN0IHJhbmdlX2ZpZWxkID0gc3RhdGUuZmllbGQocmFuZ2VQYXJzZXIpLnJhbmdlcztcblx0cmV0dXJuICgoZnJvbSB8fCB0bykgPyByYW5nZV9maWVsZC5yYW5nZXNfaW5faW50ZXJ2YWwoZnJvbSA/PyAwLCB0byA/PyBJbmZpbml0eSkgOiByYW5nZV9maWVsZC5yYW5nZXMpXG5cdFx0LmZpbHRlcihyYW5nZSA9PlxuXHRcdFx0cmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQURESVRJT04gfHwgcmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuREVMRVRJT04gfHxcblx0XHRcdHJhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTlxuXHRcdClcblx0XHQubWFwKHJhbmdlID0+ICh7IGZyb206IHJhbmdlLmZyb20sIHRvOiByZW1vdmVfYXR0YWNoZWRfY29tbWVudHMgPyByYW5nZS5mdWxsX3JhbmdlX2JhY2sgOiByYW5nZS50bywgaW5zZXJ0OiByYW5nZS5yZWplY3QoKSB9KSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseVRvRmlsZShcblx0YXBwbHlGbjogKHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSwgdGV4dDogc3RyaW5nKSA9PiBzdHJpbmcsXG5cdGFwcDogQXBwLFxuXHRmaWxlOiBURmlsZSxcblx0cmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZVtdLFxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdHJhbmdlcy5zb3J0KChhLCBiKSA9PiBhLmZyb20gLSBiLmZyb20pO1xuXHRjb25zdCB0ZXh0ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XG5cblx0Y29uc3Qgb3V0cHV0ID0gYXBwbHlUb1RleHQodGV4dCwgYXBwbHlGbiwgcmFuZ2VzKTtcblxuXHRhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIG91dHB1dCk7XG59XG4iLCAiaW1wb3J0IERpZmZNYXRjaFBhdGNoIGZyb20gXCJkaWZmLW1hdGNoLXBhdGNoXCI7XG5pbXBvcnQgeyBjcmVhdGVfc3VnZ2VzdGlvbiB9IGZyb20gXCIuLi9lZGl0LXV0aWwvcmFuZ2UtY3JlYXRlXCI7XG5cbkRpZmZNYXRjaFBhdGNoLkRJRkZfREVMRVRFID0gLTE7XG5EaWZmTWF0Y2hQYXRjaC5ESUZGX0lOU0VSVCA9IDE7XG5EaWZmTWF0Y2hQYXRjaC5ESUZGX0VRVUFMID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVGV4dERpZmYob2xkVGV4dDogc3RyaW5nLCBuZXdUZXh0OiBzdHJpbmcpIHtcblx0Y29uc3QgZG1wID0gbmV3IERpZmZNYXRjaFBhdGNoKCk7XG5cdGNvbnN0IGRpZmYgPSBkbXAuZGlmZl9tYWluKG9sZFRleHQsIG5ld1RleHQpO1xuXHRkbXAuZGlmZl9jbGVhbnVwU2VtYW50aWMoZGlmZik7XG5cblx0bGV0IG9mZnNldCA9IDA7XG5cdGNvbnN0IGNoYW5nZXM6IHsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyOyBpbnNlcnQ6IHN0cmluZyB9W10gPSBbXTtcblx0bGV0IGN1cnJlbnRfY2hhbmdlOiB7IGZyb206IG51bWJlcjsgdG86IG51bWJlcjsgaW5zZXJ0OiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuXG5cdGZvciAoY29uc3QgW3R5cGUsIHRleHRdIG9mIGRpZmYpIHtcblx0XHRpZiAodHlwZSA9PT0gRGlmZk1hdGNoUGF0Y2guRElGRl9FUVVBTCkge1xuXHRcdFx0aWYgKGN1cnJlbnRfY2hhbmdlKSB7XG5cdFx0XHRcdGNoYW5nZXMucHVzaChjdXJyZW50X2NoYW5nZSk7XG5cdFx0XHRcdGN1cnJlbnRfY2hhbmdlID0gbnVsbDtcblx0XHRcdH1cblx0XHRcdG9mZnNldCArPSB0ZXh0Lmxlbmd0aDtcblx0XHR9IGVsc2UgaWYgKHR5cGUgPT09IERpZmZNYXRjaFBhdGNoLkRJRkZfSU5TRVJUKSB7XG5cdFx0XHRpZiAoIWN1cnJlbnRfY2hhbmdlKVxuXHRcdFx0XHRjdXJyZW50X2NoYW5nZSA9IHsgZnJvbTogb2Zmc2V0LCB0bzogb2Zmc2V0LCBpbnNlcnQ6IHRleHQgfTtcblx0XHRcdGVsc2UgaWYgKCFjdXJyZW50X2NoYW5nZS5pbnNlcnQpXG5cdFx0XHRcdGN1cnJlbnRfY2hhbmdlLmluc2VydCArPSB0ZXh0O1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGNoYW5nZXMucHVzaChjdXJyZW50X2NoYW5nZSk7XG5cdFx0XHRcdGN1cnJlbnRfY2hhbmdlID0geyBmcm9tOiBvZmZzZXQsIHRvOiBvZmZzZXQsIGluc2VydDogdGV4dCB9O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gRGlmZk1hdGNoUGF0Y2guRElGRl9ERUxFVEUpIHtcblx0XHRcdGlmICghY3VycmVudF9jaGFuZ2UpXG5cdFx0XHRcdGN1cnJlbnRfY2hhbmdlID0geyBmcm9tOiBvZmZzZXQsIHRvOiBvZmZzZXQgKyB0ZXh0Lmxlbmd0aCwgaW5zZXJ0OiBcIlwiIH07XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y2hhbmdlcy5wdXNoKGN1cnJlbnRfY2hhbmdlKTtcblx0XHRcdFx0Y3VycmVudF9jaGFuZ2UgPSB7IGZyb206IG9mZnNldCwgdG86IG9mZnNldCArIHRleHQubGVuZ3RoLCBpbnNlcnQ6IFwiXCIgfTtcblx0XHRcdH1cblx0XHRcdG9mZnNldCArPSB0ZXh0Lmxlbmd0aDtcblx0XHR9XG5cdH1cblx0aWYgKGN1cnJlbnRfY2hhbmdlKVxuXHRcdGNoYW5nZXMucHVzaChjdXJyZW50X2NoYW5nZSk7XG5cblx0cmV0dXJuIGNoYW5nZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUNyaXRpY01hcmt1cFBhdGNoRnJvbURpZmYob2xkVGV4dDogc3RyaW5nLCBuZXdUZXh0OiBzdHJpbmcpIHtcblx0Y29uc3QgZGlmZiA9IGdlbmVyYXRlVGV4dERpZmYob2xkVGV4dCwgbmV3VGV4dCk7XG5cdGxldCBvdXRwdXQgPSBcIlwiO1xuXHRsZXQgb2Zmc2V0ID0gMDtcblx0Zm9yIChjb25zdCBjaGFuZ2Ugb2YgZGlmZikge1xuXHRcdGlmIChjaGFuZ2UuZnJvbSA+IG9mZnNldClcblx0XHRcdG91dHB1dCArPSBvbGRUZXh0LnNsaWNlKG9mZnNldCwgY2hhbmdlLmZyb20pO1xuXHRcdGlmIChjaGFuZ2UuaW5zZXJ0KVxuXHRcdFx0b3V0cHV0ICs9IGNyZWF0ZV9zdWdnZXN0aW9uKGNoYW5nZS5pbnNlcnQsIG9sZFRleHQuc2xpY2UoY2hhbmdlLmZyb20sIGNoYW5nZS50bykpO1xuXHRcdG9mZnNldCA9IGNoYW5nZS50bztcblx0fVxuXHRpZiAob2Zmc2V0IDwgb2xkVGV4dC5sZW5ndGgpXG5cdFx0b3V0cHV0ICs9IG9sZFRleHQuc2xpY2Uob2Zmc2V0KTtcblxuXHRyZXR1cm4gb3V0cHV0O1xufVxuIiwgImltcG9ydCB7IENyaXRpY01hcmt1cFJhbmdlLCBnZXRSYW5nZXNJblRleHQgfSBmcm9tIFwiLi9lZGl0b3IvYmFzZVwiO1xuaW1wb3J0IHsgQ09NTUVOVEFUT1JfR0xPQkFMIH0gZnJvbSBcIi4vZ2xvYmFsXCI7XG5pbXBvcnQgeyB0eXBlIFBsdWdpblNldHRpbmdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluZGV4V29ya2VyKGZpbGVzOiBzdHJpbmdbXSwgc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKTogUHJvbWlzZTxDcml0aWNNYXJrdXBSYW5nZVtdW10+IHtcblx0Q09NTUVOVEFUT1JfR0xPQkFMLlBMVUdJTl9TRVRUSU5HUyA9IHNldHRpbmdzO1xuXHRyZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXMubWFwKGFzeW5jIChmaWxlOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gZ2V0UmFuZ2VzSW5UZXh0KGZpbGUpO1xuXHR9KSk7XG59XG4iLCAiLy8gRXhwb3J0IGEgaW5kZXhXb3JrZXIgZnVuY3Rpb24gaW4gQHJvb3QvaW5kZXgtd29ya2VyLnRzIGluIG9yZGVyIHRvIGRlZmluZSB0aGUgd29ya2VyXG5pbXBvcnQgeyBpbmRleFdvcmtlciB9IGZyb20gXCJpbmRleC13b3JrZXJcIjtcblxuc2VsZi5vbm1lc3NhZ2UgPSBhc3luYyAoZXZlbnQpID0+IHtcblx0c2VsZi5wb3N0TWVzc2FnZShhd2FpdCBpbmRleFdvcmtlcihldmVudC5kYXRhLmZpbGVzLCBldmVudC5kYXRhLnNldHRpbmdzKSk7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogImszQkFBQSxJQUFBQSxHQUFBQyxHQUFBLENBQUFDLEdBQUFDLEtBQUEsQ0E0QkEsSUFBSUMsRUFBbUIsVUFBVyxDQU1oQyxLQUFLLGFBQWUsRUFFcEIsS0FBSyxjQUFnQixFQUVyQixLQUFLLGdCQUFrQixHQUl2QixLQUFLLGVBQWlCLElBS3RCLEtBQUssc0JBQXdCLEdBRTdCLEtBQUssYUFBZSxFQUdwQixLQUFLLGNBQWdCLEVBQ3ZCLEVBV0lDLEdBQWMsR0FDZEMsR0FBYyxFQUNkQyxFQUFhLEVBV2pCSCxFQUFpQixLQUFPLFNBQVNJLEVBQUlDLEVBQU0sQ0FDekMsTUFB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LFlBQ3pEQSxFQUFNLE9BQVMsY0FDaEIsRUFDQyxJQUFJQSxJQUFVLENBQUUsS0FBTUEsRUFBTSxLQUFNLEdBQUlILEVBQTJCRyxFQUFNLGdCQUFrQkEsRUFBTSxHQUFJLE9BQVFBLEVBQU0sT0FBTyxDQUFFLEVBQUUsQ0FDL0gsQ0MxQkEsSUFBQUUsR0FBMkIsV0FHM0IsR0FBQUMsUUFBZSxZQUFjLEdBQzdCLEdBQUFBLFFBQWUsWUFBYyxFQUM3QixHQUFBQSxRQUFlLFdBQWEsRUNENUIsZUFBc0JDLEdBQVlDLEVBQWlCQyxFQUEwRCxDQUM1RyxPQUFBQyxHQUFtQixnQkFBa0JELEVBQzlCLE1BQU0sUUFBUSxJQUFJRCxFQUFNLElBQUksTUFBT0csR0FDbENDLEdBQWdCRCxDQUFJLENBQzNCLENBQUMsQ0FDSCxDQ05BLEtBQUssVUFBWSxNQUFPRSxHQUFVLENBQ2pDLEtBQUssWUFBWSxNQUFNQyxHQUFZRCxFQUFNLEtBQUssTUFBT0EsRUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUMxRSIsCiAgIm5hbWVzIjogWyJyZXF1aXJlX2RpZmZfbWF0Y2hfcGF0Y2giLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJkaWZmX21hdGNoX3BhdGNoIiwgIkRJRkZfREVMRVRFIiwgIkRJRkZfSU5TRVJUIiwgIkRJRkZfRVFVQUwiLCAib3AiLCAidGV4dCIsICJ0ZXh0MSIsICJ0ZXh0MiIsICJvcHRfY2hlY2tsaW5lcyIsICJvcHRfZGVhZGxpbmUiLCAiZGVhZGxpbmUiLCAiY2hlY2tsaW5lcyIsICJjb21tb25sZW5ndGgiLCAiY29tbW9ucHJlZml4IiwgImNvbW1vbnN1ZmZpeCIsICJkaWZmcyIsICJsb25ndGV4dCIsICJzaG9ydHRleHQiLCAiaSIsICJobSIsICJ0ZXh0MV9hIiwgInRleHQxX2IiLCAidGV4dDJfYSIsICJ0ZXh0Ml9iIiwgIm1pZF9jb21tb24iLCAiZGlmZnNfYSIsICJkaWZmc19iIiwgImEiLCAibGluZWFycmF5IiwgInBvaW50ZXIiLCAiY291bnRfZGVsZXRlIiwgImNvdW50X2luc2VydCIsICJ0ZXh0X2RlbGV0ZSIsICJ0ZXh0X2luc2VydCIsICJzdWJEaWZmIiwgImoiLCAidGV4dDFfbGVuZ3RoIiwgInRleHQyX2xlbmd0aCIsICJtYXhfZCIsICJ2X29mZnNldCIsICJ2X2xlbmd0aCIsICJ2MSIsICJ2MiIsICJ4IiwgImRlbHRhIiwgImZyb250IiwgImsxc3RhcnQiLCAiazFlbmQiLCAiazJzdGFydCIsICJrMmVuZCIsICJkIiwgImsxIiwgImsxX29mZnNldCIsICJ4MSIsICJ5MSIsICJrMl9vZmZzZXQiLCAieDIiLCAiazIiLCAieTIiLCAieSIsICJ0ZXh0MWEiLCAidGV4dDJhIiwgInRleHQxYiIsICJ0ZXh0MmIiLCAiZGlmZnNiIiwgImxpbmVBcnJheSIsICJsaW5lSGFzaCIsICJkaWZmX2xpbmVzVG9DaGFyc011bmdlXyIsICJjaGFycyIsICJsaW5lU3RhcnQiLCAibGluZUVuZCIsICJsaW5lQXJyYXlMZW5ndGgiLCAibGluZSIsICJtYXhMaW5lcyIsICJjaGFyczEiLCAiY2hhcnMyIiwgInBvaW50ZXJtaW4iLCAicG9pbnRlcm1heCIsICJwb2ludGVybWlkIiwgInBvaW50ZXJzdGFydCIsICJwb2ludGVyZW5kIiwgInRleHRfbGVuZ3RoIiwgImJlc3QiLCAibGVuZ3RoIiwgInBhdHRlcm4iLCAiZm91bmQiLCAiZG1wIiwgImRpZmZfaGFsZk1hdGNoSV8iLCAic2VlZCIsICJiZXN0X2NvbW1vbiIsICJiZXN0X2xvbmd0ZXh0X2EiLCAiYmVzdF9sb25ndGV4dF9iIiwgImJlc3Rfc2hvcnR0ZXh0X2EiLCAiYmVzdF9zaG9ydHRleHRfYiIsICJwcmVmaXhMZW5ndGgiLCAic3VmZml4TGVuZ3RoIiwgImhtMSIsICJobTIiLCAiY2hhbmdlcyIsICJlcXVhbGl0aWVzIiwgImVxdWFsaXRpZXNMZW5ndGgiLCAibGFzdEVxdWFsaXR5IiwgImxlbmd0aF9pbnNlcnRpb25zMSIsICJsZW5ndGhfZGVsZXRpb25zMSIsICJsZW5ndGhfaW5zZXJ0aW9uczIiLCAibGVuZ3RoX2RlbGV0aW9uczIiLCAiZGVsZXRpb24iLCAiaW5zZXJ0aW9uIiwgIm92ZXJsYXBfbGVuZ3RoMSIsICJvdmVybGFwX2xlbmd0aDIiLCAiZGlmZl9jbGVhbnVwU2VtYW50aWNTY29yZV8iLCAib25lIiwgInR3byIsICJjaGFyMSIsICJjaGFyMiIsICJub25BbHBoYU51bWVyaWMxIiwgIm5vbkFscGhhTnVtZXJpYzIiLCAid2hpdGVzcGFjZTEiLCAid2hpdGVzcGFjZTIiLCAibGluZUJyZWFrMSIsICJsaW5lQnJlYWsyIiwgImJsYW5rTGluZTEiLCAiYmxhbmtMaW5lMiIsICJlcXVhbGl0eTEiLCAiZWRpdCIsICJlcXVhbGl0eTIiLCAiY29tbW9uT2Zmc2V0IiwgImNvbW1vblN0cmluZyIsICJiZXN0RXF1YWxpdHkxIiwgImJlc3RFZGl0IiwgImJlc3RFcXVhbGl0eTIiLCAiYmVzdFNjb3JlIiwgInNjb3JlIiwgInByZV9pbnMiLCAicHJlX2RlbCIsICJwb3N0X2lucyIsICJwb3N0X2RlbCIsICJsb2MiLCAibGFzdF9jaGFyczEiLCAibGFzdF9jaGFyczIiLCAiaHRtbCIsICJwYXR0ZXJuX2FtcCIsICJwYXR0ZXJuX2x0IiwgInBhdHRlcm5fZ3QiLCAicGF0dGVybl9wYXJhIiwgImRhdGEiLCAibGV2ZW5zaHRlaW4iLCAiaW5zZXJ0aW9ucyIsICJkZWxldGlvbnMiLCAiZGlmZnNMZW5ndGgiLCAidG9rZW5zIiwgInBhcmFtIiwgImV4IiwgIm4iLCAicyIsICJtYXRjaF9iaXRhcFNjb3JlXyIsICJlIiwgImFjY3VyYWN5IiwgInByb3hpbWl0eSIsICJzY29yZV90aHJlc2hvbGQiLCAiYmVzdF9sb2MiLCAibWF0Y2htYXNrIiwgImJpbl9taW4iLCAiYmluX21pZCIsICJiaW5fbWF4IiwgImxhc3RfcmQiLCAic3RhcnQiLCAiZmluaXNoIiwgInJkIiwgImNoYXJNYXRjaCIsICJwYXRjaCIsICJwYWRkaW5nIiwgInByZWZpeCIsICJzdWZmaXgiLCAib3B0X2IiLCAib3B0X2MiLCAicGF0Y2hlcyIsICJwYXRjaERpZmZMZW5ndGgiLCAiY2hhcl9jb3VudDEiLCAiY2hhcl9jb3VudDIiLCAicHJlcGF0Y2hfdGV4dCIsICJwb3N0cGF0Y2hfdGV4dCIsICJkaWZmX3R5cGUiLCAiZGlmZl90ZXh0IiwgInBhdGNoZXNDb3B5IiwgInBhdGNoQ29weSIsICJudWxsUGFkZGluZyIsICJyZXN1bHRzIiwgImV4cGVjdGVkX2xvYyIsICJzdGFydF9sb2MiLCAiZW5kX2xvYyIsICJpbmRleDEiLCAiaW5kZXgyIiwgIm1vZCIsICJwYWRkaW5nTGVuZ3RoIiwgImV4dHJhTGVuZ3RoIiwgInBhdGNoX3NpemUiLCAiYmlncGF0Y2giLCAic3RhcnQxIiwgInN0YXJ0MiIsICJwcmVjb250ZXh0IiwgImVtcHR5IiwgInBvc3Rjb250ZXh0IiwgInRleHRsaW5lIiwgInRleHRQb2ludGVyIiwgInBhdGNoSGVhZGVyIiwgIm0iLCAic2lnbiIsICJjb29yZHMxIiwgImNvb3JkczIiLCAiQ01fQWxsX0JyYWNrZXRzIiwgInNob3J0SGFuZE1hcHBpbmciLCAiQ3JpdGljTWFya3VwUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJ0eXBlIiwgInJlcHIiLCAidGV4dCIsICJtZXRhZGF0YSIsICJfX3B1YmxpY0ZpZWxkIiwgIm1ldGFkYXRhX3NlcGFyYXRvciIsICJtZXRhZGF0YV90ZXh0IiwgImtleSIsICJlIiwgInJlcGx5IiwgInZhbHVlIiwgImZpZWxkcyIsICJyYW5nZSIsICJvdGhlciIsICJsZWZ0IiwgInN0YXJ0IiwgImVuZCIsICJzdHJpY3QiLCAicmVtb3ZlQ29tbWVudHMiLCAiY3Vyc29yIiwgInNraXBfbWV0YWRhdGEiLCAicmlnaHQiLCAibW92ZW1lbnQiLCAib3V0c2lkZV9sb29zZSIsICJpbnNpZGVfbG9vc2UiLCAiaW5jbHVkZV9tZXRhZGF0YSIsICJsZWZ0X2xvb3NlIiwgInJpZ2h0X2xvb3NlIiwgInVud3JhcCIsICJwcmV2aWV3TW9kZSIsICJ0YWciLCAic3RyIiwgIkNNX0FsbF9CcmFja2V0cyIsICJvZmZzZXQiLCAiQWRkaXRpb25SYW5nZSIsICJDcml0aWNNYXJrdXBSYW5nZSIsICJmcm9tIiwgInRvIiwgInRleHQiLCAibWV0YWRhdGEiLCAidW53cmFwIiwgInByZXZpZXdNb2RlIiwgInRhZyIsICJsZWZ0IiwgInN0ciIsICJDTV9BbGxfQnJhY2tldHMiLCAiY2xzIiwgIkNvbW1lbnRSYW5nZSIsICJDcml0aWNNYXJrdXBSYW5nZSIsICJmcm9tIiwgInRvIiwgInRleHQiLCAibWV0YWRhdGEiLCAiX19wdWJsaWNGaWVsZCIsICJyZW1vdmVDb21tZW50cyIsICJyYW5nZSIsICJEZWxldGlvblJhbmdlIiwgIkNyaXRpY01hcmt1cFJhbmdlIiwgImZyb20iLCAidG8iLCAidGV4dCIsICJtZXRhZGF0YSIsICJ1bndyYXAiLCAicHJldmlld01vZGUiLCAidGFnIiwgImxlZnQiLCAic3RyIiwgIkNNX0FsbF9CcmFja2V0cyIsICJjbHMiLCAiSGlnaGxpZ2h0UmFuZ2UiLCAiQ3JpdGljTWFya3VwUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJ0ZXh0IiwgIm1ldGFkYXRhIiwgIlN1YnN0aXR1dGlvblJhbmdlIiwgIkNyaXRpY01hcmt1cFJhbmdlIiwgImZyb20iLCAibWlkZGxlIiwgInRvIiwgInRleHQiLCAibWV0YWRhdGEiLCAibGVmdCIsICJvZmZzZXQiLCAiY3Vyc29yIiwgImxlZnRfbG9vc2UiLCAicmlnaHRfbG9vc2UiLCAic3RyaWN0IiwgInJpZ2h0IiwgInNraXBfbWV0YWRhdGEiLCAic3RhcnQiLCAiZW5kIiwgInVud3JhcCIsICJwcmV2aWV3TW9kZSIsICJ0YWciLCAic3RyIiwgInBhcnRzIiwgIkNNX0FsbF9CcmFja2V0cyIsICJjbHMiLCAicmFuZ2UiLCAicmFuZ2VGcm9tIiwgInJhbmdlVG8iLCAibnVtYmVycyIsICJzIiwgImkiLCAibiIsICJpc0V4dGVuZGluZ0NoYXIiLCAiY29kZSIsICJmcm9tIiwgInRvIiwgIm1pZCIsICJpc1JlZ2lvbmFsSW5kaWNhdG9yIiwgIlpXSiIsICJmaW5kQ2x1c3RlckJyZWFrIiwgInN0ciIsICJwb3MiLCAiZm9yd2FyZCIsICJpbmNsdWRlRXh0ZW5kaW5nIiwgIm5leHRDbHVzdGVyQnJlYWsiLCAicHJldkNsdXN0ZXJCcmVhayIsICJzdXJyb2dhdGVMb3ciLCAic3Vycm9nYXRlSGlnaCIsICJwcmV2IiwgImNvZGVQb2ludEF0IiwgImNvZGVQb2ludFNpemUiLCAibmV4dCIsICJpc0V4dGVuZGluZ0NoYXIiLCAiaXNSZWdpb25hbEluZGljYXRvciIsICJjb3VudEJlZm9yZSIsICJpIiwgImZvdW5kIiwgImNvZGUwIiwgImNvZGUxIiwgImNoIiwgImNvZGUiLCAiVGV4dCIsICJfVGV4dCIsICJwb3MiLCAibiIsICJmcm9tIiwgInRvIiwgInRleHQiLCAiY2xpcCIsICJwYXJ0cyIsICJUZXh0Tm9kZSIsICJvdGhlciIsICJzdGFydCIsICJlbmQiLCAiYSIsICJSYXdUZXh0Q3Vyc29yIiwgImIiLCAic2tpcCIsICJkaXIiLCAiUGFydGlhbFRleHRDdXJzb3IiLCAiaW5uZXIiLCAiTGluZUN1cnNvciIsICJsaW5lcyIsICJUZXh0TGVhZiIsICJfVGV4dExlYWYiLCAibGVuZ3RoIiwgInRleHRMZW5ndGgiLCAidGFyZ2V0IiwgImlzTGluZSIsICJsaW5lIiwgIm9mZnNldCIsICJpIiwgInN0cmluZyIsICJMaW5lIiwgIm9wZW4iLCAic2xpY2VUZXh0IiwgInByZXYiLCAiam9pbmVkIiwgImFwcGVuZFRleHQiLCAibWlkIiwgIm5ld0xlbiIsICJsaW5lU2VwIiwgInJlc3VsdCIsICJwYXJ0IiwgImxlbiIsICJfVGV4dE5vZGUiLCAiY2hpbGRyZW4iLCAiY2hpbGQiLCAiZW5kTGluZSIsICJjaGlsZE9wZW4iLCAidXBkYXRlZCIsICJ0b3RhbExpbmVzIiwgImNvcHkiLCAiaUEiLCAiaUIiLCAiZUEiLCAiZUIiLCAiY2hBIiwgImNoQiIsICJsIiwgImNoIiwgImZsYXQiLCAiY2h1bmsiLCAibWF4Q2h1bmsiLCAibWluQ2h1bmsiLCAiY2h1bmtlZCIsICJjdXJyZW50TGluZXMiLCAiY3VycmVudExlbiIsICJjdXJyZW50Q2h1bmsiLCAiYWRkIiwgImxhc3QiLCAibm9kZSIsICJmbHVzaCIsICJmaXJzdCIsICJ0b3AiLCAib2Zmc2V0VmFsdWUiLCAic2l6ZSIsICJuZXh0IiwgImxpbWl0IiwgInZhbHVlIiwgImRvbmUiLCAibGluZUJyZWFrIiwgIm51bWJlciIsICJmaW5kQ2x1c3RlckJyZWFrIiwgInN0ciIsICJmb3J3YXJkIiwgImluY2x1ZGVFeHRlbmRpbmciLCAic3Vycm9nYXRlTG93IiwgInN1cnJvZ2F0ZUhpZ2giLCAiY29kZVBvaW50QXQiLCAiY29kZTAiLCAiY29kZTEiLCAiY29kZVBvaW50U2l6ZSIsICJjb2RlIiwgIkRlZmF1bHRTcGxpdCIsICJNYXBNb2RlIiwgIkNoYW5nZURlc2MiLCAiX0NoYW5nZURlc2MiLCAic2VjdGlvbnMiLCAicmVzdWx0IiwgImkiLCAiaW5zIiwgImYiLCAicG9zQSIsICJwb3NCIiwgImxlbiIsICJpbmRpdmlkdWFsIiwgIml0ZXJDaGFuZ2VzIiwgIm90aGVyIiwgImNvbXBvc2VTZXRzIiwgImJlZm9yZSIsICJtYXBTZXQiLCAicG9zIiwgImFzc29jIiwgIm1vZGUiLCAiZW5kQSIsICJmcm9tIiwgInRvIiwgImVuZCIsICJqc29uIiwgImEiLCAiQ2hhbmdlU2V0IiwgIl9DaGFuZ2VTZXQiLCAiaW5zZXJ0ZWQiLCAiZG9jIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJfdG9CIiwgInRleHQiLCAiaW5kZXgiLCAiVGV4dCIsICJyYW5nZXMiLCAicmVzdWx0U2VjdGlvbnMiLCAicmVzdWx0SW5zZXJ0ZWQiLCAiZmlsdGVyZWRTZWN0aW9ucyIsICJpdGVyIiwgIlNlY3Rpb25JdGVyIiwgImRvbmUiLCAibmV4dCIsICJhZGRTZWN0aW9uIiwgImFkZEluc2VydCIsICJwYXJ0cyIsICJjaGFuZ2VzIiwgImxlbmd0aCIsICJsaW5lU2VwIiwgInRvdGFsIiwgImZsdXNoIiwgImZvcmNlIiwgInNldCIsICJwcm9jZXNzIiwgInNwZWMiLCAic3ViIiwgImluc2VydCIsICJpbnNUZXh0IiwgImluc0xlbiIsICJwYXJ0IiwgImUiLCAiZm9yY2VKb2luIiwgImxhc3QiLCAidmFsdWVzIiwgInZhbHVlIiwgImRlc2MiLCAiZW5kQiIsICJzZXRBIiwgInNldEIiLCAibWtTZXQiLCAiYiIsICJwaWVjZSIsICJsZWZ0IiwgIm9wZW4iLCAic2VjdGlvbkxlbiIsICJpbnNCIiwgIlNlbGVjdGlvblJhbmdlIiwgIl9TZWxlY3Rpb25SYW5nZSIsICJmbGFncyIsICJsZXZlbCIsICJjaGFuZ2UiLCAiRWRpdG9yU2VsZWN0aW9uIiwgImhlYWQiLCAiaW5jbHVkZUFzc29jIiwgIl9FZGl0b3JTZWxlY3Rpb24iLCAibWFpbkluZGV4IiwgInIiLCAicmFuZ2UiLCAibWFpbiIsICJ3aGljaCIsICJhbmNob3IiLCAiYmlkaUxldmVsIiwgImdvYWxDb2x1bW4iLCAicHJldiIsICJjaGVja1NlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiZG9jTGVuZ3RoIiwgIm5leHRJRCIsICJGYWNldCIsICJfRmFjZXQiLCAiY29tYmluZSIsICJjb21wYXJlSW5wdXQiLCAiY29tcGFyZSIsICJpc1N0YXRpYyIsICJlbmFibGVzIiwgImNvbmZpZyIsICJzYW1lQXJyYXkiLCAiRmFjZXRQcm92aWRlciIsICJkZXBzIiwgImdldCIsICJmaWVsZCIsICJ4IiwgInN0YXRlIiwgImRlcGVuZGVuY2llcyIsICJmYWNldCIsICJ0eXBlIiwgImFkZHJlc3NlcyIsICJfYSIsICJnZXR0ZXIiLCAiaWQiLCAiaWR4IiwgIm11bHRpIiwgImRlcERvYyIsICJkZXBTZWwiLCAiZGVwQWRkcnMiLCAiZGVwIiwgInRyIiwgImVuc3VyZUFsbCIsICJuZXdWYWwiLCAiY29tcGFyZUFycmF5IiwgIm9sZFN0YXRlIiwgIm9sZEFkZHIiLCAib2xkVmFsIiwgImdldEFkZHIiLCAiU3RhdGVGaWVsZCIsICJhZGRycyIsICJjaGFuZ2VkIiwgImFkZHIiLCAiZW5zdXJlQWRkciIsICJkeW5hbWljRmFjZXRTbG90IiwgInByb3ZpZGVycyIsICJwcm92aWRlckFkZHJzIiwgInAiLCAicHJvdmlkZXJUeXBlcyIsICJkeW5hbWljIiwgInZhbCIsICJkZXBDaGFuZ2VkIiwgIm9sZFByb3ZpZGVycyIsICJvbGRWYWx1ZSIsICJpbml0RmllbGQiLCAiX1N0YXRlRmllbGQiLCAiY3JlYXRlRiIsICJ1cGRhdGVGIiwgImNvbXBhcmVGIiwgImluaXQiLCAib2xkSW5pdCIsICJyZUluaXQiLCAiY3JlYXRlIiwgIlByZWNfIiwgInByZWMiLCAiZXh0IiwgIlByZWNFeHRlbnNpb24iLCAiUHJlYyIsICJpbm5lciIsICJDb21wYXJ0bWVudCIsICJfQ29tcGFydG1lbnQiLCAiQ29tcGFydG1lbnRJbnN0YW5jZSIsICJjb250ZW50IiwgImNvbXBhcnRtZW50IiwgIkNvbmZpZ3VyYXRpb24iLCAiX0NvbmZpZ3VyYXRpb24iLCAiYmFzZSIsICJjb21wYXJ0bWVudHMiLCAiZHluYW1pY1Nsb3RzIiwgImFkZHJlc3MiLCAic3RhdGljVmFsdWVzIiwgImZhY2V0cyIsICJmaWVsZHMiLCAibmV3Q29tcGFydG1lbnRzIiwgImZsYXR0ZW4iLCAib2xkRmFjZXRzIiwgImV4dGVuc2lvbiIsICJzZWVuIiwgImtub3duIiwgImZvdW5kIiwgInN0YXR1cyIsICJsYW5ndWFnZURhdGEiLCAiYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMiLCAidiIsICJsaW5lU2VwYXJhdG9yIiwgImNoYW5nZUZpbHRlciIsICJ0cmFuc2FjdGlvbkZpbHRlciIsICJ0cmFuc2FjdGlvbkV4dGVuZGVyIiwgInJlYWRPbmx5IiwgIkFubm90YXRpb24iLCAiQW5ub3RhdGlvblR5cGUiLCAiU3RhdGVFZmZlY3RUeXBlIiwgIm1hcCIsICJTdGF0ZUVmZmVjdCIsICJfU3RhdGVFZmZlY3QiLCAibWFwcGluZyIsICJtYXBwZWQiLCAiZWZmZWN0cyIsICJlZmZlY3QiLCAiVHJhbnNhY3Rpb24iLCAiX1RyYW5zYWN0aW9uIiwgInN0YXJ0U3RhdGUiLCAiYW5ub3RhdGlvbnMiLCAic2Nyb2xsSW50b1ZpZXciLCAiYW5uIiwgImV2ZW50IiwgImpvaW5SYW5nZXMiLCAiaUEiLCAiaUIiLCAibWVyZ2VUcmFuc2FjdGlvbiIsICJzZXF1ZW50aWFsIiwgIm1hcEZvckEiLCAibWFwRm9yQiIsICJyZXNvbHZlVHJhbnNhY3Rpb25Jbm5lciIsICJkb2NTaXplIiwgInNlbCIsICJhc0FycmF5IiwgInJlc29sdmVUcmFuc2FjdGlvbiIsICJzcGVjcyIsICJmaWx0ZXIiLCAicyIsICJzZXEiLCAiZXh0ZW5kVHJhbnNhY3Rpb24iLCAiZmlsdGVyVHJhbnNhY3Rpb24iLCAiYmFjayIsICJmaWx0ZXJlZCIsICJmaWx0ZXJzIiwgImV4dGVuZGVycyIsICJub25lIiwgIkNoYXJDYXRlZ29yeSIsICJub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhciIsICJ3b3JkQ2hhciIsICJfIiwgImhhc1dvcmRDaGFyIiwgInN0ciIsICJjaCIsICJtYWtlQ2F0ZWdvcml6ZXIiLCAid29yZENoYXJzIiwgImNoYXIiLCAiRWRpdG9yU3RhdGUiLCAiX0VkaXRvclN0YXRlIiwgImNvbXB1dGVTbG90IiwgInJlcXVpcmUiLCAiY29uZiIsICJrZXkiLCAic3RhcnRWYWx1ZXMiLCAic2xvdCIsICJyZXN1bHQxIiwgIm5ld0NoYW5nZXMiLCAibmV3TWFwcGVkIiwgImoiLCAibWFwQnkiLCAic3RyaW5nIiwgInByb3AiLCAiZmllbGRJbml0IiwgImNvbmZpZ3VyYXRpb24iLCAicGhyYXNlIiwgIm0iLCAibiIsICJuYW1lIiwgInNpZGUiLCAicHJvdmlkZXIiLCAiYXQiLCAiY2F0IiwgInN0YXJ0IiwgImZpbmRDbHVzdGVyQnJlYWsiLCAia0EiLCAia0IiLCAiayIsICJSYW5nZVZhbHVlIiwgIm90aGVyIiwgImZyb20iLCAidG8iLCAiUmFuZ2UiLCAiTWFwTW9kZSIsICJfUmFuZ2UiLCAidmFsdWUiLCAiY21wUmFuZ2UiLCAiYSIsICJiIiwgIkNodW5rIiwgIl9DaHVuayIsICJtYXhQb2ludCIsICJwb3MiLCAic2lkZSIsICJlbmQiLCAic3RhcnRBdCIsICJhcnIiLCAibG8iLCAiaGkiLCAibWlkIiwgImRpZmYiLCAib2Zmc2V0IiwgImYiLCAiaSIsICJlIiwgImNoYW5nZXMiLCAibmV3UG9zIiwgInZhbCIsICJjdXJGcm9tIiwgImN1clRvIiwgIm5ld0Zyb20iLCAibmV3VG8iLCAibWFwcGVkIiwgIlJhbmdlU2V0IiwgIl9SYW5nZVNldCIsICJjaHVua1BvcyIsICJjaHVuayIsICJuZXh0TGF5ZXIiLCAibGFzdCIsICJzaXplIiwgImluZGV4IiwgInVwZGF0ZVNwZWMiLCAiYWRkIiwgInNvcnQiLCAiZmlsdGVyRnJvbSIsICJmaWx0ZXJUbyIsICJmaWx0ZXIiLCAiY3VyIiwgIkxheWVyQ3Vyc29yIiwgInNwaWxsIiwgImJ1aWxkZXIiLCAiUmFuZ2VTZXRCdWlsZGVyIiwgInJhbmdlIiwgImNodW5rcyIsICJzdGFydCIsICJ0b3VjaCIsICJuZXh0IiwgIkhlYXBDdXJzb3IiLCAic2V0cyIsICJvbGRTZXRzIiwgIm5ld1NldHMiLCAidGV4dERpZmYiLCAiY29tcGFyYXRvciIsICJtaW5Qb2ludFNpemUiLCAic2V0IiwgInNoYXJlZENodW5rcyIsICJmaW5kU2hhcmVkQ2h1bmtzIiwgInNpZGVBIiwgIlNwYW5DdXJzb3IiLCAic2lkZUIiLCAiZnJvbUEiLCAiZnJvbUIiLCAibGVuZ3RoIiwgImNvbXBhcmUiLCAic2FtZVZhbHVlcyIsICJpdGVyYXRvciIsICJjdXJzb3IiLCAib3BlblJhbmdlcyIsICJhY3RpdmUiLCAib3BlbkNvdW50IiwgInJhbmdlcyIsICJidWlsZCIsICJsYXp5U29ydCIsICJyZXN1bHQiLCAibGF5ZXIiLCAicHJldiIsICJfUmFuZ2VTZXRCdWlsZGVyIiwgIm5ld0FycmF5cyIsICJpbkEiLCAic2hhcmVkIiwgImtub3duIiwgInNraXAiLCAibWluUG9pbnQiLCAicmFuayIsICJmb3J3YXJkIiwgInJhbmdlSW5kZXgiLCAiX0hlYXBDdXJzb3IiLCAiaGVhcCIsICJoZWFwQnViYmxlIiwgInRvcCIsICJjaGlsZEluZGV4IiwgImNoaWxkIiwgInJlbW92ZSIsICJmaW5kTWluSW5kZXgiLCAidHJhY2tPcGVuIiwgImluc2VydCIsICJ3YXNQb2ludCIsICJuZXh0VmFsIiwgIm9wZW4iLCAic3RhcnRBIiwgInN0YXJ0QiIsICJlbmRCIiwgImRQb3MiLCAiZEVuZCIsICJjbGlwRW5kIiwgImFycmF5IiwgImZvdW5kIiwgImZvdW5kUG9zIiwgImZpbmRDb2x1bW4iLCAic3RyaW5nIiwgImNvbCIsICJ0YWJTaXplIiwgInN0cmljdCIsICJpIiwgIm4iLCAiZmluZENsdXN0ZXJCcmVhayIsICJJbnRlcnZhbCIsICJsb3ciLCAiaGlnaCIsICJvdGhlcl9pbnRlcnZhbCIsICJpbnRlcnZhbDEiLCAiaW50ZXJ2YWwyIiwgInZhbDEiLCAidmFsMiIsICJSQl9UUkVFX0NPTE9SX1JFRCIsICJSQl9UUkVFX0NPTE9SX0JMQUNLIiwgIk5vZGUiLCAia2V5IiwgInZhbHVlIiwgImxlZnQiLCAicmlnaHQiLCAicGFyZW50IiwgImNvbG9yIiwgIm90aGVyX25vZGUiLCAiY29tcGFyYWJsZV9tYXgiLCAic2VhcmNoX25vZGUiLCAiY29tcGFyYWJsZV9sZXNzX3RoYW4iLCAiSW50ZXJ2YWxUcmVlIiwgIl9JbnRlcnZhbFRyZWUiLCAiY291bnQiLCAicmVzIiwgIm5vZGUiLCAiaW5zZXJ0X25vZGUiLCAiZGVsZXRlX25vZGUiLCAiaW50ZXJ2YWwiLCAib3V0cHV0TWFwcGVyRm4iLCAicmVzcF9ub2RlcyIsICJ2aXNpdG9yIiwgImNhbGxiYWNrIiwgInRyZWUiLCAibm9kZV9jdXJyZW50IiwgImN1cnJlbnRfbm9kZSIsICJwYXJlbnRfbm9kZSIsICJ1bmNsZV9ub2RlIiwgImN1dF9ub2RlIiwgImZpeF9ub2RlIiwgImJyb3RoZXJfbm9kZSIsICJiZXN0IiwgImN1cnIiLCAiZm91bmQiLCAibm9kZV9taW4iLCAibm9kZV9tYXgiLCAibm9kZV9zdWNjZXNzb3IiLCAieCIsICJ5IiwgImFjdGlvbiIsICJoZWlnaHQiLCAiaGVpZ2h0TGVmdCIsICJoZWlnaHRSaWdodCIsICJDcml0aWNNYXJrdXBSYW5nZXMiLCAicmFuZ2VzIiwgIl9fcHVibGljRmllbGQiLCAiSW50ZXJ2YWxUcmVlIiwgInJhbmdlIiwgImluZGV4IiwgImN1cnNvciIsICJyaWdodCIsICJzZWFyY2giLCAiZnJvbSIsICJ0byIsICJsZWZ0IiwgImxvb3NlIiwgImluY2x1ZGVfZWRnZSIsICJkaXJlY3RseV9hZGphY2VudCIsICJyYW5nZV9pZHgiLCAibiIsICJhZGphY2VudCIsICJzdGFydCIsICJlbmQiLCAiaW50ZXJ2YWxzIiwgInVuaXF1ZV9yYW5nZXMiLCAiZm91bmRfcmFuZ2UiLCAicmVwbHkiLCAiYSIsICJiIiwgImRvYyIsICJmcm9udF9yYW5nZSIsICJiYWNrX3JhbmdlIiwgIm91dHB1dCIsICJwcmV2X3JhbmdlIiwgIm5ld19mcm9tIiwgIm5ld190byIsICJDIiwgIkNPVU5UIiwgIlNFVCIsICJ0b3AiLCAiU3R5bGVNb2R1bGUiLCAic3BlYyIsICJvcHRpb25zIiwgImZpbmlzaCIsICJzcGxpdFNlbGVjdG9yIiwgInNlbGVjdG9yIiwgInJlbmRlciIsICJzZWxlY3RvcnMiLCAidGFyZ2V0IiwgImlzS2V5ZnJhbWVzIiwgImxvY2FsIiwgImlzQXQiLCAia2V5ZnJhbWVzIiwgInByb3AiLCAidmFsdWUiLCAicGFydCIsICJzZWwiLCAiYSIsICJiIiwgImwiLCAiaWQiLCAicm9vdCIsICJtb2R1bGVzIiwgInNldCIsICJub25jZSIsICJTdHlsZVNldCIsICJhZG9wdGVkU2V0IiwgImRvYyIsICJ3aW4iLCAiYWRvcHRlZCIsICJzaGVldCIsICJwb3MiLCAiaiIsICJpIiwgIm1vZCIsICJpbmRleCIsICJrIiwgInRleHQiLCAiYmFzZSIsICJzaGlmdCIsICJtYWMiLCAiaWUiLCAiaSIsICJjb2RlIiwgImtleU5hbWUiLCAiZXZlbnQiLCAiaWdub3JlS2V5IiwgIm5hbWUiLCAiZ2V0U2VsZWN0aW9uIiwgInJvb3QiLCAidGFyZ2V0IiwgImNvbnRhaW5zIiwgImRvbSIsICJub2RlIiwgImhhc1NlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiXyIsICJjbGllbnRSZWN0c0ZvciIsICJ0ZXh0UmFuZ2UiLCAiaXNFcXVpdmFsZW50UG9zaXRpb24iLCAib2ZmIiwgInRhcmdldE5vZGUiLCAidGFyZ2V0T2ZmIiwgInNjYW5Gb3IiLCAiZG9tSW5kZXgiLCAiaW5kZXgiLCAiaXNCbG9ja0VsZW1lbnQiLCAiZGlyIiwgIm1heE9mZnNldCIsICJwYXJlbnQiLCAiZmxhdHRlblJlY3QiLCAicmVjdCIsICJsZWZ0IiwgIngiLCAid2luZG93UmVjdCIsICJ3aW4iLCAidnAiLCAiZ2V0U2NhbGUiLCAiZWx0IiwgInNjYWxlWCIsICJzY2FsZVkiLCAic2Nyb2xsUmVjdEludG9WaWV3IiwgInNpZGUiLCAieSIsICJ4TWFyZ2luIiwgInlNYXJnaW4iLCAibHRyIiwgImRvYyIsICJjdXIiLCAic3RvcCIsICJib3VuZGluZyIsICJ0b3AiLCAibW92ZVgiLCAibW92ZVkiLCAicmVjdEhlaWdodCIsICJib3VuZGluZ0hlaWdodCIsICJtb3ZlZFgiLCAibW92ZWRZIiwgInN0YXJ0IiwgInNjcm9sbGFibGVQYXJlbnRzIiwgIkRPTVNlbGVjdGlvblN0YXRlIiwgImRvbVNlbCIsICJyYW5nZSIsICJhbmNob3JOb2RlIiwgImZvY3VzTm9kZSIsICJhbmNob3JPZmZzZXQiLCAiZm9jdXNPZmZzZXQiLCAicHJldmVudFNjcm9sbFN1cHBvcnRlZCIsICJmb2N1c1ByZXZlbnRTY3JvbGwiLCAic3RhY2siLCAiaSIsICJzY3JhdGNoUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJkaXNwYXRjaEtleSIsICJuYW1lIiwgImNvZGUiLCAibW9kcyIsICJvcHRpb25zIiwgImRvd24iLCAidXAiLCAiZ2V0Um9vdCIsICJjbGVhckF0dHJpYnV0ZXMiLCAiYXRFbGVtZW50U3RhcnQiLCAib2Zmc2V0IiwgInByZXYiLCAiaXNTY3JvbGxlZFRvQm90dG9tIiwgInRleHROb2RlQmVmb3JlIiwgInN0YXJ0Tm9kZSIsICJzdGFydE9mZnNldCIsICJ0ZXh0Tm9kZUFmdGVyIiwgIkRPTVBvcyIsICJfRE9NUG9zIiwgInByZWNpc2UiLCAibm9DaGlsZHJlbiIsICJDb250ZW50VmlldyIsICJfQ29udGVudFZpZXciLCAidmlldyIsICJwb3MiLCAiY2hpbGQiLCAidHJhY2siLCAibmV4dCIsICJjb250ZW50VmlldyIsICJybSQxIiwgIl9kb20iLCAiYWZ0ZXIiLCAiYmlhcyIsICJmcm9tSSIsICJmcm9tU3RhcnQiLCAidG9JIiwgInRvRW5kIiwgInByZXZFbmQiLCAiZW5kIiwgImFuZFBhcmVudCIsICJjaGlsZExpc3QiLCAidiIsICJjaGlsZHJlbiIsICJfcmVjIiwgIl9ldmVudCIsICJDaGlsZEN1cnNvciIsICJzb3VyY2UiLCAiaGFzU3RhcnQiLCAib3BlblN0YXJ0IiwgIm9wZW5FbmQiLCAib3RoZXIiLCAicmVwbGFjZVJhbmdlIiwgImZyb21PZmYiLCAidG9PZmYiLCAiaW5zZXJ0IiwgImJyZWFrQXRTdGFydCIsICJiZWZvcmUiLCAibGFzdCIsICJicmVha0F0RW5kIiwgIm1lcmdlQ2hpbGRyZW5JbnRvIiwgImRMZW4iLCAibmF2IiwgImllX2VkZ2UiLCAiaWVfdXB0bzEwIiwgImllXzExdXAiLCAiaWUiLCAiZ2Vja28iLCAiY2hyb21lIiwgIndlYmtpdCIsICJzYWZhcmkiLCAiaW9zIiwgImJyb3dzZXIiLCAiTWF4Sm9pbkxlbiIsICJUZXh0VmlldyIsICJfVGV4dFZpZXciLCAidGV4dCIsICJ0ZXh0RE9NIiwgInJlc3VsdCIsICJfZnJvbSIsICJfdG8iLCAidGV4dENvb3JkcyIsICJNYXJrVmlldyIsICJfTWFya1ZpZXciLCAibWFyayIsICJsZW5ndGgiLCAiY2giLCAiX2hhc1N0YXJ0IiwgImRldGFjaEZyb20iLCAiaW5saW5lRE9NQXRQb3MiLCAiY29vcmRzSW5DaGlsZHJlbiIsICJmbGF0dGVuIiwgInJlY3RzIiwgInIiLCAiV2lkZ2V0VmlldyIsICJfV2lkZ2V0VmlldyIsICJ3aWRnZXQiLCAiZXZlbnQiLCAiVGV4dCIsICJjdXN0b20iLCAiZnJvbUJhY2siLCAiV2lkZ2V0QnVmZmVyVmlldyIsICJfV2lkZ2V0QnVmZmVyVmlldyIsICJqIiwgImpvaW5JbmxpbmVJbnRvIiwgIm9wZW4iLCAiYmVmb3JlUG9zIiwgImFmdGVyUG9zIiwgInNjYW4iLCAib25TYW1lTGluZSIsICJmYWxsYmFja1JlY3QiLCAiYSIsICJiIiwgInBvc0EiLCAicG9zQiIsICJjb21iaW5lQXR0cnMiLCAibm9BdHRycyIsICJhdHRyc0VxIiwgImlnbm9yZSIsICJrZXlzQSIsICJrZXlzQiIsICJrZXkiLCAidXBkYXRlQXR0cnMiLCAiYXR0cnMiLCAiY2hhbmdlZCIsICJnZXRBdHRycyIsICJhdHRyIiwgIldpZGdldFR5cGUiLCAiQmxvY2tUeXBlIiwgIkRlY29yYXRpb24iLCAiUmFuZ2VWYWx1ZSIsICJzdGFydFNpZGUiLCAiZW5kU2lkZSIsICJzcGVjIiwgIk1hcmtEZWNvcmF0aW9uIiwgImJsb2NrIiwgIlBvaW50RGVjb3JhdGlvbiIsICJnZXRJbmNsdXNpdmUiLCAiTGluZURlY29yYXRpb24iLCAib2YiLCAic29ydCIsICJSYW5nZVNldCIsICJfTWFya0RlY29yYXRpb24iLCAiX2EiLCAiX2IiLCAiX0xpbmVEZWNvcmF0aW9uIiwgIk1hcE1vZGUiLCAiX1BvaW50RGVjb3JhdGlvbiIsICJpc1JlcGxhY2UiLCAid2lkZ2V0c0VxIiwgImFkZFJhbmdlIiwgInJhbmdlcyIsICJtYXJnaW4iLCAiTGluZVZpZXciLCAiX0xpbmVWaWV3IiwgImF0IiwgImRlY28iLCAiY2xzIiwgImhhY2siLCAidG90YWxXaWR0aCIsICJ0ZXh0SGVpZ2h0IiwgImhlaWdodE9yYWNsZSIsICJoZWlnaHQiLCAiZGlzdCIsICJkb2NWaWV3IiwgIkJsb2NrV2lkZ2V0VmlldyIsICJfQmxvY2tXaWRnZXRWaWV3IiwgIl90YWtlRGVjbyIsICJsZW4iLCAiQmxvY2tHYXBXaWRnZXQiLCAiQ29udGVudEJ1aWxkZXIiLCAiX0NvbnRlbnRCdWlsZGVyIiwgImRpc2FsbG93QmxvY2tFZmZlY3RzRm9yIiwgImFjdGl2ZSIsICJ3cmFwTWFya3MiLCAidmFsdWUiLCAibGluZUJyZWFrIiwgImRvbmUiLCAidGFrZSIsICJOdWxsV2lkZ2V0IiwgImN1cnNvckJlZm9yZSIsICJjdXJzb3JBZnRlciIsICJsaW5lIiwgImRlY29yYXRpb25zIiwgImR5bmFtaWNEZWNvcmF0aW9uTWFwIiwgImJ1aWxkZXIiLCAidGFnIiwgIkRpcmVjdGlvbiIsICJMVFIiLCAiUlRMIiwgImRlYyIsICJzdHIiLCAiTG93VHlwZXMiLCAiQXJhYmljVHlwZXMiLCAiQnJhY2tldHMiLCAiQnJhY2tldFN0YWNrIiwgInAiLCAibCIsICJjaGFyVHlwZSIsICJCaWRpUkUiLCAiQmlkaVNwYW4iLCAibGV2ZWwiLCAiZm9yd2FyZCIsICJvcmRlciIsICJhc3NvYyIsICJtYXliZSIsICJzcGFuIiwgImlzb2xhdGVzRXEiLCAiaUEiLCAiaUIiLCAidHlwZXMiLCAiY29tcHV0ZUNoYXJUeXBlcyIsICJyRnJvbSIsICJyVG8iLCAiaXNvbGF0ZXMiLCAib3V0ZXJUeXBlIiwgImlJIiwgInByZXZUeXBlIiwgInByZXZTdHJvbmciLCAidHlwZSIsICJyZXBsYWNlIiwgInByb2Nlc3NCcmFja2V0UGFpcnMiLCAib3Bwb3NpdGVUeXBlIiwgInNJIiwgImNvbnRleHQiLCAiYnIiLCAic0oiLCAiZmxhZ3MiLCAiZW1iZWQiLCAicHJvY2Vzc05ldXRyYWxzIiwgImJlZm9yZUwiLCAiYWZ0ZXJMIiwgImpJIiwgImZyb21KIiwgImVtaXRTcGFucyIsICJiYXNlTGV2ZWwiLCAib3VyVHlwZSIsICJpQ2giLCAic2FtZURpciIsICJpc051bSIsICJyZWN1cnNlIiwgImxvY2FsTGV2ZWwiLCAiaVNjYW4iLCAicnVuIiwgImlzbyIsICJ1cHRvIiwgImRpclN3YXAiLCAiY29tcHV0ZVNlY3Rpb25PcmRlciIsICJjb21wdXRlT3JkZXIiLCAiZGlyZWN0aW9uIiwgInRyaXZpYWxPcmRlciIsICJtb3ZlZE92ZXIiLCAibW92ZVZpc3VhbGx5IiwgInN0YXJ0SW5kZXgiLCAic3BhbkkiLCAic3BhbkVuZCIsICJuZXh0SSIsICJuZXh0SW5kZXgiLCAiZmluZENsdXN0ZXJCcmVhayIsICJuZXh0U3BhbiIsICJFZGl0b3JTZWxlY3Rpb24iLCAiYXV0b0RpcmVjdGlvbiIsICJjbGlja0FkZHNTZWxlY3Rpb25SYW5nZSIsICJGYWNldCIsICJkcmFnTW92ZXNTZWxlY3Rpb24kMSIsICJtb3VzZVNlbGVjdGlvblN0eWxlIiwgImV4Y2VwdGlvblNpbmsiLCAidXBkYXRlTGlzdGVuZXIiLCAiaW5wdXRIYW5kbGVyIiwgImZvY3VzQ2hhbmdlRWZmZWN0IiwgImNsaXBib2FyZElucHV0RmlsdGVyIiwgImNsaXBib2FyZE91dHB1dEZpbHRlciIsICJwZXJMaW5lVGV4dERpcmVjdGlvbiIsICJ2YWx1ZXMiLCAibmF0aXZlU2VsZWN0aW9uSGlkZGVuIiwgInNjcm9sbEhhbmRsZXIiLCAiU2Nyb2xsVGFyZ2V0IiwgIl9TY3JvbGxUYXJnZXQiLCAiaXNTbmFwc2hvdCIsICJjaGFuZ2VzIiwgInN0YXRlIiwgInNjcm9sbEludG9WaWV3IiwgIlN0YXRlRWZmZWN0IiwgInQiLCAic2V0RWRpdENvbnRleHRGb3JtYXR0aW5nIiwgImxvZ0V4Y2VwdGlvbiIsICJleGNlcHRpb24iLCAiaGFuZGxlciIsICJlZGl0YWJsZSIsICJuZXh0UGx1Z2luSUQiLCAidmlld1BsdWdpbiIsICJWaWV3UGx1Z2luIiwgIl9WaWV3UGx1Z2luIiwgImlkIiwgImNyZWF0ZSIsICJkb21FdmVudEhhbmRsZXJzIiwgImRvbUV2ZW50T2JzZXJ2ZXJzIiwgImJ1aWxkRXh0ZW5zaW9ucyIsICJldmVudEhhbmRsZXJzIiwgImV2ZW50T2JzZXJ2ZXJzIiwgInByb3ZpZGUiLCAicGx1Z2luIiwgImV4dCIsICJwbHVnaW5JbnN0IiwgIlBsdWdpbkluc3RhbmNlIiwgInVwZGF0ZSIsICJlIiwgImVkaXRvckF0dHJpYnV0ZXMiLCAiY29udGVudEF0dHJpYnV0ZXMiLCAib3V0ZXJEZWNvcmF0aW9ucyIsICJhdG9taWNSYW5nZXMiLCAiYmlkaUlzb2xhdGVkUmFuZ2VzIiwgImdldElzb2xhdGVkUmFuZ2VzIiwgInNldHMiLCAiZnJvbURvYyIsICJ0b0RvYyIsICJhZGQiLCAic2Nyb2xsTWFyZ2lucyIsICJnZXRTY3JvbGxNYXJnaW5zIiwgInJpZ2h0IiwgImJvdHRvbSIsICJtIiwgInN0eWxlTW9kdWxlIiwgIkNoYW5nZWRSYW5nZSIsICJfQ2hhbmdlZFJhbmdlIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJ0b0IiLCAic2V0IiwgIm1lIiwgImRpZmYiLCAiZEkiLCAickkiLCAiVmlld1VwZGF0ZSIsICJfVmlld1VwZGF0ZSIsICJ0cmFuc2FjdGlvbnMiLCAiQ2hhbmdlU2V0IiwgInRyIiwgImNoYW5nZWRSYW5nZXMiLCAiRG9jVmlldyIsICJyZWFkQ29tcG9zaXRpb25BdCIsICJ0b3VjaGVzQ29tcG9zaXRpb24iLCAiY29tcG9zaXRpb24iLCAiZmluZENvbXBvc2l0aW9uUmFuZ2UiLCAicHJldkRlY28iLCAiZGVjb0RpZmYiLCAiZmluZENoYW5nZWREZWNvIiwgIm9sZExlbmd0aCIsICJvYnNlcnZlciIsICJjVmlldyIsICJnYXBzIiwgImN1cnNvciIsICJjb250ZW50IiwgImNvbXBMaW5lIiwgImVmZmVjdCIsICJmaXgiLCAiYyIsICJtdXN0UmVhZCIsICJmcm9tUG9pbnRlciIsICJhY3RpdmVFbHQiLCAiZm9jdXNlZCIsICJzZWxlY3Rpb25Ob3RGb2N1cyIsICJmb3JjZSIsICJtYWluIiwgImFuY2hvciIsICJoZWFkIiwgImJldHdlZW5VbmVkaXRhYmxlIiwgImR1bW15IiwgImluVW5lZGl0YWJsZSIsICJyYXdTZWwiLCAibmV4dFRvIiwgIm5leHRUb1VuZWRpdGFibGUiLCAic2VsIiwgImxpbmVTdGFydCIsICJuZXdSYW5nZSIsICJuZXdQb3MiLCAiZG9tVmlldyIsICJiZXN0IiwgImJlc3RQb3MiLCAiY2hpbGRPZmYiLCAidmlld3BvcnQiLCAiY29udGVudFdpZHRoIiwgImlzV2lkZXIiLCAid2lkZXN0IiwgImNoaWxkUmVjdCIsICJ3aWR0aCIsICJtZWFzdXJlIiwgImxpbmVIZWlnaHQiLCAiY2hhcldpZHRoIiwgInZzIiwgImFsbERlY28iLCAiZCIsICJkeW5hbWljT3V0ZXIiLCAib3V0ZXJEZWNvIiwgImR5bmFtaWMiLCAicmVmIiwgIm1hcmdpbnMiLCAidGFyZ2V0UmVjdCIsICJvZmZzZXRXaWR0aCIsICJvZmZzZXRIZWlnaHQiLCAiZmluZENvbXBvc2l0aW9uTm9kZSIsICJoZWFkUG9zIiwgInRleHRCZWZvcmUiLCAidGV4dEFmdGVyIiwgInRleHROb2RlIiwgImRlc2NBZnRlciIsICJkZXNjQmVmb3JlIiwgImZvdW5kIiwgImludiIsICJtYXJrcyIsICJwYXJlbnRWaWV3IiwgIkRlY29yYXRpb25Db21wYXJhdG9yJDEiLCAiY29tcCIsICJpbnNpZGUiLCAidG91Y2hlZCIsICJncm91cEF0IiwgImNhdGVnb3JpemUiLCAibGluZVBvcyIsICJjYXQiLCAiZ2V0ZHgiLCAiZ2V0ZHkiLCAieU92ZXJsYXAiLCAidXBUb3AiLCAidXBCb3QiLCAiZG9tUG9zQXRDb29yZHMiLCAiY2xvc2VzdCIsICJjbG9zZXN0UmVjdCIsICJjbG9zZXN0WCIsICJjbG9zZXN0WSIsICJjbG9zZXN0T3ZlcmxhcCIsICJhYm92ZSIsICJiZWxvdyIsICJhYm92ZVJlY3QiLCAiYmVsb3dSZWN0IiwgImR4IiwgImR5IiwgImRvbVBvc0luVGV4dCIsICJjbGlwWCIsICJjbG9zZXN0T2Zmc2V0IiwgImNsb3Nlc3REWSIsICJnZW5lcmFsU2lkZSIsICJwb3NBdENvb3JkcyIsICJjb29yZHMiLCAiZG9jVG9wIiwgImRvY0hlaWdodCIsICJ5T2Zmc2V0IiwgImhhbGZMaW5lIiwgImJvdW5jZWQiLCAicG9zQXRDb29yZHNJbXByZWNpc2UiLCAiZWxlbWVudCIsICJpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdCIsICJpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdCIsICJuZWFyZXN0IiwgImNvbnRlbnRSZWN0IiwgImludG8iLCAiZmluZENvbHVtbiIsICJibG9ja0F0IiwgIm1vdmVUb0xpbmVCb3VuZGFyeSIsICJpbmNsdWRlV3JhcCIsICJlZGl0b3JSZWN0IiwgIm1vdmVCeUNoYXIiLCAiYnkiLCAic3BhbnMiLCAiY2hlY2siLCAiY2hhciIsICJieUdyb3VwIiwgIm5leHRDYXQiLCAiQ2hhckNhdGVnb3J5IiwgIm1vdmVWZXJ0aWNhbGx5IiwgImRpc3RhbmNlIiwgInN0YXJ0UG9zIiwgImdvYWwiLCAic3RhcnRZIiwgInN0YXJ0Q29vcmRzIiwgInJlc29sdmVkR29hbCIsICJleHRyYSIsICJjdXJZIiwgImNoYXJSZWN0IiwgInNraXBBdG9taWNSYW5nZXMiLCAiYXRvbXMiLCAibW92ZWQiLCAic2tpcEF0b21zIiwgIm9sZFBvcyIsICJmIiwgIkxpbmVCcmVha1BsYWNlaG9sZGVyIiwgIkRPTVJlYWRlciIsICJwb2ludHMiLCAiRWRpdG9yU3RhdGUiLCAib2xkTGVuIiwgIm5leHRWaWV3IiwgInBvaW50IiwgInJlIiwgIm5leHRCcmVhayIsICJicmVha1NpemUiLCAiZnJvbVZpZXciLCAiaXNBdEVuZCIsICJET01Qb2ludCIsICJET01DaGFuZ2UiLCAidHlwZU92ZXIiLCAiaUhlYWQiLCAiaUFuY2hvciIsICJzZWxQb2ludHMiLCAic2VsZWN0aW9uUG9pbnRzIiwgInJlYWRlciIsICJzZWxlY3Rpb25Gcm9tUG9pbnRzIiwgIm9mZkZyb20iLCAib2ZmVG8iLCAiYXBwbHlET01DaGFuZ2UiLCAiZG9tQ2hhbmdlIiwgImNoYW5nZSIsICJuZXdTZWwiLCAibGFzdEtleSIsICJwcmVmZXJyZWRQb3MiLCAicHJlZmVycmVkU2lkZSIsICJmaW5kRGlmZiIsICJhcHBseURPTUNoYW5nZUlubmVyIiwgInVzZXJFdmVudCIsICJkZWZhdWx0VHIiLCAiZGVmYXVsdEluc2VydCIsICJhcHBseURlZmF1bHRJbnNlcnQiLCAiaCIsICJzdGFydFN0YXRlIiwgIm1haW5TZWwiLCAicmVwbGFjZWQiLCAiY29tcG9zaXRpb25SYW5nZSIsICJzaXplIiwgInJhbmdlQ2hhbmdlcyIsICJzZWxPZmYiLCAibWluTGVuIiwgImFkanVzdCIsICJtb3ZlIiwgImJhc2UiLCAiSW5wdXRTdGF0ZSIsICJvcmlnaW4iLCAiZmlyZWZveENvcHlDdXRIYWNrIiwgImV2ZW50QmVsb25nc1RvRWRpdG9yIiwgImhhbmRsZXJzIiwgInBsdWdpbnMiLCAiY29tcHV0ZUhhbmRsZXJzIiwgInBhc3NpdmUiLCAiZXhpc3RzIiwgIm1vZGlmaWVyQ29kZXMiLCAicGVuZGluZyIsICJQZW5kaW5nS2V5cyIsICJFbWFjc3lQZW5kaW5nS2V5cyIsICJtb3VzZVNlbGVjdGlvbiIsICJiaW5kSGFuZGxlciIsICJyZWNvcmQiLCAib2JzZXJ2ZXJzIiwgImRyYWdTY3JvbGxNYXJnaW4iLCAiZHJhZ1Njcm9sbFNwZWVkIiwgIk1vdXNlU2VsZWN0aW9uIiwgInN0YXJ0RXZlbnQiLCAic3R5bGUiLCAibXVzdFNlbGVjdCIsICJhZGRzU2VsZWN0aW9uUmFuZ2UiLCAiaXNJblByaW1hcnlTZWxlY3Rpb24iLCAiZ2V0Q2xpY2tUeXBlIiwgInN4IiwgInN5IiwgInVwZGF0ZWQiLCAiZmFjZXQiLCAiZHJhZ01vdmVzU2VsZWN0aW9uIiwgImJyb2tlbkNsaXBib2FyZEFQSSIsICJjYXB0dXJlUGFzdGUiLCAiZG9QYXN0ZSIsICJ0ZXh0RmlsdGVyIiwgImZpbHRlciIsICJpbnB1dCIsICJieUxpbmUiLCAibGFzdExpbmV3aXNlQ29weSIsICJsYXN0TGluZSIsICJtYWtlU3R5bGUiLCAiYmFzaWNNb3VzZVNlbGVjdGlvbiIsICJtdXN0Rm9jdXMiLCAibW91c2VTZWwiLCAicmFuZ2VGb3JDbGljayIsICJ2aXN1YWwiLCAiZmluZFBvc2l0aW9uU2lkZSIsICJxdWVyeVBvcyIsICJCYWRNb3VzZURldGFpbCIsICJsYXN0TW91c2VEb3duIiwgImxhc3RNb3VzZURvd25Db3VudCIsICJsYXN0TW91c2VEb3duVGltZSIsICJsYXN0VGltZSIsICJzdGFydFNlbCIsICJleHRlbmQiLCAibXVsdGlwbGUiLCAicmVtb3ZlZCIsICJzdGFydFJhbmdlIiwgInJlbW92ZVJhbmdlQXJvdW5kIiwgImlucHV0U3RhdGUiLCAiZHJvcFRleHQiLCAiZGlyZWN0IiwgImRyb3BQb3MiLCAiZHJhZ2dlZENvbnRlbnQiLCAiZGVsIiwgImlucyIsICJmaWxlcyIsICJyZWFkIiwgImZpbmlzaEZpbGUiLCAicyIsICJkYXRhIiwgImNhcHR1cmVDb3B5IiwgImNvcGllZFJhbmdlIiwgImxpbmV3aXNlIiwgImlzRm9jdXNDaGFuZ2UiLCAiQW5ub3RhdGlvbiIsICJmb2N1c0NoYW5nZVRyYW5zYWN0aW9uIiwgImZvY3VzIiwgImVmZmVjdHMiLCAiZ2V0RWZmZWN0IiwgInVwZGF0ZUZvckZvY3VzQ2hhbmdlIiwgInN0YXJ0Vmlld0hlaWdodCIsICJhcHBsaWVkRmlyZWZveEhhY2siLCAid3JhcHBpbmdXaGl0ZVNwYWNlIiwgImhlaWdodENoYW5nZUZsYWciLCAiY2xlYXJIZWlnaHRDaGFuZ2VGbGFnIiwgIkhlaWdodE9yYWNsZSIsICJsaW5lV3JhcHBpbmciLCAibGluZXMiLCAid2hpdGVTcGFjZSIsICJsaW5lSGVpZ2h0cyIsICJuZXdIZWlnaHQiLCAibGluZUxlbmd0aCIsICJrbm93bkhlaWdodHMiLCAiTWVhc3VyZWRIZWlnaHRzIiwgImhlaWdodHMiLCAiQmxvY2tJbmZvIiwgIl9CbG9ja0luZm8iLCAiX2NvbnRlbnQiLCAiUXVlcnlUeXBlIiwgIkVwc2lsb24iLCAiSGVpZ2h0TWFwIiwgIl9IZWlnaHRNYXAiLCAibm9kZXMiLCAib2xkRG9jIiwgIm9yYWNsZSIsICJOb2RlQnVpbGRlciIsICJIZWlnaHRNYXBUZXh0IiwgInNwbGl0IiwgImJyayIsICJIZWlnaHRNYXBCcmFuY2giLCAib2xkIiwgInZhbCIsICJIZWlnaHRNYXBCbG9jayIsICJfaGVpZ2h0IiwgIl9vcmFjbGUiLCAiX3ZhbHVlIiwgIl90eXBlIiwgIl9mb3JjZSIsICJtZWFzdXJlZCIsICJfSGVpZ2h0TWFwVGV4dCIsICJIZWlnaHRNYXBHYXAiLCAiX0hlaWdodE1hcEdhcCIsICJmaXJzdExpbmUiLCAicGVyTGluZSIsICJwZXJDaGFyIiwgInRvdGFsUGVyTGluZSIsICJndWVzcyIsICJsaW5lVG9wIiwgImxpbmVzQWJvdmUiLCAiZmlyc3QiLCAic2luZ2xlSGVpZ2h0IiwgIm1pZCIsICJyaWdodFRvcCIsICJyaWdodE9mZnNldCIsICJzdWJRdWVyeSIsICJyaWdodFN0YXJ0IiwgIm1lcmdlR2FwcyIsICJyZWJhbGFuY2UiLCAiYXJvdW5kIiwgInJlbGV2YW50V2lkZ2V0SGVpZ2h0IiwgIl9Ob2RlQnVpbGRlciIsICJicmVha3MiLCAiZ2FwIiwgImhlaWdodFJlbGV2YW50RGVjb0NoYW5nZXMiLCAiRGVjb3JhdGlvbkNvbXBhcmF0b3IiLCAidmlzaWJsZVBpeGVsUmFuZ2UiLCAicGFkZGluZ1RvcCIsICJwYXJlbnRSZWN0IiwgImluV2luZG93IiwgImZ1bGxQaXhlbFJhbmdlIiwgIkxpbmVHYXAiLCAiZGlzcGxheVNpemUiLCAiZ0EiLCAiZ0IiLCAidmlld1N0YXRlIiwgIndyYXBwaW5nIiwgIkxpbmVHYXBXaWRnZXQiLCAidmVydGljYWwiLCAiVmlld1N0YXRlIiwgIklkU2NhbGVyIiwgImd1ZXNzV3JhcHBpbmciLCAidmlld3BvcnRzIiwgIlZpZXdwb3J0IiwgInNjYWxlciIsICJCaWdTY2FsZXIiLCAic2NhbGVCbG9jayIsICJzY3JvbGxUYXJnZXQiLCAiY29udGVudENoYW5nZXMiLCAiaGVpZ2h0Q2hhbmdlcyIsICJwcmV2SGVpZ2h0IiwgInNjcm9sbEFuY2hvciIsICJ2aWV3cG9ydENoYW5nZSIsICJyZWZyZXNoIiwgImRvbVJlY3QiLCAibWVhc3VyZUNvbnRlbnQiLCAicGFkZGluZ0JvdHRvbSIsICJzY3JvbGxUb3AiLCAicGl4ZWxWaWV3cG9ydCIsICJkVG9wIiwgImRCb3R0b20iLCAiaW5WaWV3IiwgIm1hcmdpblRvcCIsICJtYXAiLCAidmlzaWJsZVRvcCIsICJ2aXNpYmxlQm90dG9tIiwgInZpZXdIZWlnaHQiLCAidG9wUG9zIiwgIm1hcHBlZCIsICJjdXJyZW50IiwgIm1heU1lYXN1cmUiLCAiaGFsZk1hcmdpbiIsICJkb3VibGVNYXJnaW4iLCAiYWRkR2FwIiwgInN0cnVjdHVyZSIsICJhdm9pZCIsICJmaW5kIiwgImNoZWNrTGluZSIsICJsaW5lU3RydWN0dXJlIiwgInZpZXdGcm9tIiwgInZpZXdUbyIsICJtYXJnaW5IZWlnaHQiLCAiYm90IiwgInRhcmdldEZyYWMiLCAiZmluZEZyYWN0aW9uIiwgInNwYWNlRnJhYyIsICJmaW5kUG9zaXRpb24iLCAibWFyZ2luV2lkdGgiLCAiaG9yaXpPZmZzZXQiLCAicHhMZWZ0IiwgInB4UmlnaHQiLCAiZnJhY3Rpb24iLCAibnciLCAic3RhdGVEZWNvIiwgInRvdGFsIiwgInJhdGlvIiwgImNvdW50ZWQiLCAiYXJyYXkiLCAibiIsICJfQmlnU2NhbGVyIiwgImhlaWdodE1hcCIsICJ2cEhlaWdodCIsICJkb21CYXNlIiwgIm9iaiIsICJiVG9wIiwgImJCb3R0b20iLCAidGhlbWUiLCAic3RycyIsICJkYXJrVGhlbWUiLCAiYmFzZVRoZW1lSUQiLCAiU3R5bGVNb2R1bGUiLCAiYmFzZUxpZ2h0SUQiLCAiYmFzZURhcmtJRCIsICJsaWdodERhcmtJRHMiLCAiYnVpbGRUaGVtZSIsICJzY29wZXMiLCAiYmFzZVRoZW1lJDEiLCAib2JzZXJ2ZU9wdGlvbnMiLCAidXNlQ2hhckRhdGEiLCAiRE9NT2JzZXJ2ZXIiLCAibXV0YXRpb25zIiwgIm11dCIsICJFZGl0Q29udGV4dE1hbmFnZXIiLCAiZW50cmllcyIsICJnIiwgIndhc0NoYW5nZWQiLCAic2FmYXJpU2VsZWN0aW9uUmFuZ2VIYWNrIiwgImxvY2FsIiwgImtleUNvZGUiLCAiZmx1c2giLCAicmVjb3JkcyIsICJyZWFkU2VsZWN0aW9uIiwgImhhbmRsZWQiLCAicmVjIiwgImNoaWxkQmVmb3JlIiwgImZpbmRDaGlsZCIsICJjaGlsZEFmdGVyIiwgIl9jIiwgImN1clZpZXciLCAiYnVpbGRTZWxlY3Rpb25SYW5nZUZyb21SYW5nZSIsICJjdXJBbmNob3IiLCAibmV3TGVuIiwgImZvcm1hdCIsICJsaW5lU3R5bGUiLCAidGhpY2tuZXNzIiwgImRyaWZ0ZWQiLCAiYWJvcnQiLCAiX2Zyb21CIiwgIl90b0IiLCAicmV2ZXJ0ZWQiLCAiY29udGV4dFBvcyIsICJjbGlwTGVuIiwgImVkaXRvclBvcyIsICJFZGl0b3JWaWV3IiwgIl9FZGl0b3JWaWV3IiwgImNvbmZpZyIsICJkaXNwYXRjaCIsICJ0cnMiLCAiVHJhbnNhY3Rpb24iLCAicmVkcmF3biIsICJhdHRyc0NoYW5nZWQiLCAiZm9jdXNGbGFnIiwgImRpc3BhdGNoRm9jdXMiLCAicGVuZGluZ0tleSIsICJDYWNoZWRPcmRlciIsICJsaXN0ZW5lciIsICJuZXdTdGF0ZSIsICJoYWRGb2N1cyIsICJwcmV2U3BlY3MiLCAic3BlY3MiLCAibmV3UGx1Z2lucyIsICJzRE9NIiwgInNjcm9sbEFuY2hvclBvcyIsICJzY3JvbGxBbmNob3JIZWlnaHQiLCAibWVhc3VyaW5nIiwgIkJhZE1lYXN1cmUiLCAiZWRpdG9yQXR0cnMiLCAiYXR0cnNGcm9tRmFjZXQiLCAiY29udGVudEF0dHJzIiwgImNoYW5nZWRDb250ZW50IiwgImNoYW5nZWRFZGl0b3IiLCAiZGl2IiwgIm5vbmNlIiwgInJlcXVlc3QiLCAia25vd24iLCAiaW5pdGlhbCIsICJNYXhCaWRpTGluZSIsICJlbnRyeSIsICJzY3JvbGxMZWZ0IiwgInByZWZpeCIsICJQcmVjIiwgIl9DYWNoZWRPcmRlciIsICJmcmVzaCIsICJjYWNoZSIsICJsYXN0RGlyIiwgInNvdXJjZXMiLCAiY3VycmVudFBsYXRmb3JtIiwgIm5vcm1hbGl6ZUtleU5hbWUiLCAicGxhdGZvcm0iLCAicGFydHMiLCAiYWx0IiwgImN0cmwiLCAic2hpZnQiLCAibWV0YSIsICJtb2QiLCAibW9kaWZpZXJzIiwgImhhbmRsZUtleUV2ZW50cyIsICJydW5IYW5kbGVycyIsICJnZXRLZXltYXAiLCAia2V5bWFwIiwgIktleW1hcHMiLCAiYmluZGluZ3MiLCAiYnVpbGRLZXltYXAiLCAic3RvcmVkUHJlZml4IiwgIlByZWZpeFRpbWVvdXQiLCAiYnVpbGRLZXltYXAiLCAiYmluZGluZ3MiLCAicGxhdGZvcm0iLCAiY3VycmVudFBsYXRmb3JtIiwgImJvdW5kIiwgImlzUHJlZml4IiwgImNoZWNrUHJlZml4IiwgIm5hbWUiLCAiaXMiLCAiY3VycmVudCIsICJhZGQiLCAic2NvcGUiLCAia2V5IiwgImNvbW1hbmQiLCAicHJldmVudERlZmF1bHQiLCAic3RvcFByb3BhZ2F0aW9uIiwgIl9hIiwgIl9iIiwgInNjb3BlT2JqIiwgInBhcnRzIiwgImsiLCAibm9ybWFsaXplS2V5TmFtZSIsICJpIiwgInByZWZpeCIsICJ2aWV3IiwgIm91ck9iaiIsICJmdWxsIiwgImJpbmRpbmciLCAiYiIsICJzY29wZXMiLCAiYW55IiwgImN1cnJlbnRLZXlFdmVudCIsICJydW5IYW5kbGVycyIsICJtYXAiLCAiZXZlbnQiLCAia2V5TmFtZSIsICJjaGFyQ29kZSIsICJjb2RlUG9pbnRBdCIsICJpc0NoYXIiLCAiY29kZVBvaW50U2l6ZSIsICJoYW5kbGVkIiwgInByZXZlbnRlZCIsICJtb2RpZmllckNvZGVzIiwgInJhbiIsICJydW5Gb3IiLCAiY21kIiwgImJhc2VOYW1lIiwgInNoaWZ0TmFtZSIsICJtb2RpZmllcnMiLCAiYnJvd3NlciIsICJiYXNlIiwgInNoaWZ0IiwgIlVuaWNvZGVSZWdleHBTdXBwb3J0IiwgIlBsYWNlaG9sZGVyIiwgIldpZGdldFR5cGUiLCAiY29udGVudCIsICJ2aWV3IiwgIndyYXAiLCAiZG9tIiwgInJlY3RzIiwgImNsaWVudFJlY3RzRm9yIiwgInN0eWxlIiwgInJlY3QiLCAiZmxhdHRlblJlY3QiLCAibGluZUhlaWdodCIsICJwbGFjZWhvbGRlciIsICJwbHVnaW4iLCAiVmlld1BsdWdpbiIsICJEZWNvcmF0aW9uIiwgInYiLCAiRWRpdG9yVmlldyIsICJiYXNlVGhlbWUiLCAiRWRpdG9yVmlldyIsICJHdXR0ZXJNYXJrZXIiLCAiUmFuZ2VWYWx1ZSIsICJvdGhlciIsICJkb20iLCAiTWFwTW9kZSIsICJndXR0ZXJMaW5lQ2xhc3MiLCAiRmFjZXQiLCAibmV4dFByb3BJRCIsICJSYW5nZSIsICJmcm9tIiwgInRvIiwgIk5vZGVQcm9wIiwgImNvbmZpZyIsICJtYXRjaCIsICJOb2RlVHlwZSIsICJ0eXBlIiwgInJlc3VsdCIsICJzdHIiLCAidmFsdWUiLCAiTW91bnRlZFRyZWUiLCAidHJlZSIsICJvdmVybGF5IiwgInBhcnNlciIsICJub1Byb3BzIiwgIl9Ob2RlVHlwZSIsICJuYW1lIiwgInByb3BzIiwgImlkIiwgImZsYWdzIiwgInNwZWMiLCAic3JjIiwgInByb3AiLCAiZ3JvdXAiLCAibWFwIiwgImRpcmVjdCIsICJub2RlIiwgImdyb3VwcyIsICJpIiwgImZvdW5kIiwgIkNhY2hlZE5vZGUiLCAiQ2FjaGVkSW5uZXJOb2RlIiwgIkl0ZXJNb2RlIiwgIlRyZWUiLCAiX1RyZWUiLCAidHlwZSIsICJjaGlsZHJlbiIsICJwb3NpdGlvbnMiLCAibGVuZ3RoIiwgInByb3BzIiwgInByb3AiLCAidmFsdWUiLCAibW91bnRlZCIsICJNb3VudGVkVHJlZSIsICJjaCIsICJzdHIiLCAibW9kZSIsICJUcmVlQ3Vyc29yIiwgInBvcyIsICJzaWRlIiwgInNjb3BlIiwgImN1cnNvciIsICJUcmVlTm9kZSIsICJub2RlIiwgInJlc29sdmVOb2RlIiwgInN0YWNrSXRlcmF0b3IiLCAic3BlYyIsICJlbnRlciIsICJsZWF2ZSIsICJmcm9tIiwgInRvIiwgImFub24iLCAiYyIsICJlbnRlcmVkIiwgInJlc3VsdCIsICJpZCIsICJjb25maWciLCAiYmFsYW5jZVJhbmdlIiwgIk5vZGVUeXBlIiwgImRhdGEiLCAiYnVpbGRUcmVlIiwgIkZsYXRCdWZmZXJDdXJzb3IiLCAiX0ZsYXRCdWZmZXJDdXJzb3IiLCAiYnVmZmVyIiwgImluZGV4IiwgIlRyZWVCdWZmZXIiLCAiX1RyZWVCdWZmZXIiLCAic2V0IiwgImVuZEluZGV4IiwgInN0YXJ0SW5kZXgiLCAiZGlyIiwgInBpY2siLCAiaSIsICJjaGVja1NpZGUiLCAic3RhcnRJIiwgImVuZEkiLCAiYiIsICJjb3B5IiwgImxlbiIsICJqIiwgIm92ZXJsYXlzIiwgIl9hIiwgInBhcmVudCIsICJzY2FuIiwgImlubmVyIiwgIkJhc2VOb2RlIiwgImJlZm9yZSIsICJhZnRlciIsICJyIiwgImdldENoaWxkcmVuIiwgImNvbnRleHQiLCAibWF0Y2hOb2RlQ29udGV4dCIsICJsYXN0IiwgIl9UcmVlTm9kZSIsICJfdHJlZSIsICJfcGFyZW50IiwgImUiLCAibmV4dCIsICJzdGFydCIsICJCdWZmZXJOb2RlIiwgIkJ1ZmZlckNvbnRleHQiLCAiaGFzQ2hpbGQiLCAiclBvcyIsICJ2YWwiLCAiY3VyIiwgImZvdW5kIiwgInAiLCAiX0J1ZmZlck5vZGUiLCAicGFyZW50U3RhcnQiLCAiaXRlclN0YWNrIiwgImhlYWRzIiwgInBpY2tlZCIsICJuZXdIZWFkcyIsICJTdGFja0l0ZXJhdG9yIiwgInRyZWUiLCAibGF5ZXJzIiwgIm1vdW50IiwgInJvb3QiLCAibiIsICJkIiwgImNoaWxkIiwgImNhY2hlIiwgImRlcHRoIiwgIm11c3RMZWF2ZSIsICJ0eXBlcyIsICJub2RlU2V0IiwgIm1heEJ1ZmZlckxlbmd0aCIsICJyZXVzZWQiLCAibWluUmVwZWF0VHlwZSIsICJjb250ZXh0SGFzaCIsICJsb29rQWhlYWQiLCAidGFrZU5vZGUiLCAibWluUG9zIiwgImluUmVwZWF0IiwgImVuZCIsICJzaXplIiwgImxvb2tBaGVhZEF0U3RhcnQiLCAiY29udGV4dEF0U3RhcnQiLCAic3RhcnRQb3MiLCAiZmluZEJ1ZmZlclNpemUiLCAiZW5kUG9zIiwgImNvcHlUb0J1ZmZlciIsICJsb2NhbENoaWxkcmVuIiwgImxvY2FsUG9zaXRpb25zIiwgImxvY2FsSW5SZXBlYXQiLCAibGFzdEdyb3VwIiwgImxhc3RFbmQiLCAibWFrZVJlcGVhdExlYWYiLCAidGFrZUZsYXROb2RlIiwgIm1ha2UiLCAibWFrZUJhbGFuY2VkIiwgIm1ha2VUcmVlIiwgIm5vZGVzIiwgIm5vZGVDb3VudCIsICJzdG9wQXQiLCAibGFzdEkiLCAibG9va0FoZWFkUHJvcCIsICJOb2RlUHJvcCIsICJiYXNlIiwgInBhaXIiLCAibWF4U2l6ZSIsICJmb3JrIiwgInNraXAiLCAibWluU3RhcnQiLCAibm9kZVNpemUiLCAibG9jYWxTa2lwcGVkIiwgIm5vZGVTdGFydCIsICJidWZmZXJTdGFydCIsICJub2RlU2l6ZUNhY2hlIiwgImJhbGFuY2VUeXBlIiwgIm1rVG9wIiwgIm1rVHJlZSIsICJ0b3RhbCIsICJtYXhDaGlsZCIsICJkaXZpZGUiLCAib2Zmc2V0IiwgImdyb3VwRnJvbSIsICJncm91cFN0YXJ0IiwgImdyb3VwU2l6ZSIsICJuZXh0U2l6ZSIsICJvbmx5IiwgIlRyZWVGcmFnbWVudCIsICJfVHJlZUZyYWdtZW50IiwgImZyb20iLCAidG8iLCAidHJlZSIsICJvZmZzZXQiLCAib3BlblN0YXJ0IiwgIm9wZW5FbmQiLCAiZnJhZ21lbnRzIiwgInBhcnRpYWwiLCAicmVzdWx0IiwgImYiLCAiY2hhbmdlcyIsICJtaW5HYXAiLCAiZkkiLCAibmV4dEYiLCAiY0kiLCAicG9zIiwgIm9mZiIsICJuZXh0QyIsICJuZXh0UG9zIiwgImN1dCIsICJmRnJvbSIsICJmVG8iLCAiUGFyc2VyIiwgImlucHV0IiwgInJhbmdlcyIsICJTdHJpbmdJbnB1dCIsICJyIiwgIlJhbmdlIiwgInBhcnNlIiwgImRvbmUiLCAic3RyaW5nIiwgInN0b3BwZWRJbm5lciIsICJOb2RlUHJvcCIsICJuZXh0VGFnSUQiLCAiVGFnIiwgIl9UYWciLCAibmFtZSIsICJzZXQiLCAiYmFzZSIsICJtb2RpZmllZCIsICJtb2QiLCAibmFtZU9yUGFyZW50IiwgInBhcmVudCIsICJ0YWciLCAidCIsICJNb2RpZmllciIsICJhIiwgImIiLCAibmV4dE1vZGlmaWVySUQiLCAiX01vZGlmaWVyIiwgIm1vZHMiLCAiZXhpc3RzIiwgInNhbWVBcnJheSIsICJtIiwgImNvbmZpZ3MiLCAicG93ZXJTZXQiLCAiY29uZmlnIiwgIngiLCAiYXJyYXkiLCAic2V0cyIsICJpIiwgImoiLCAiZSIsICJydWxlTm9kZVByb3AiLCAiTm9kZVByb3AiLCAiUnVsZSIsICJ0YWdzIiwgIm1vZGUiLCAiY29udGV4dCIsICJuZXh0IiwgIm90aGVyIiwgInRhZ0hpZ2hsaWdodGVyIiwgIm9wdGlvbnMiLCAibWFwIiwgInN0eWxlIiwgInRhZyIsICJzY29wZSIsICJhbGwiLCAiY2xzIiwgInN1YiIsICJ0YWdDbGFzcyIsICJ0IiwgIlRhZyIsICJjb21tZW50IiwgIm5hbWUiLCAidHlwZU5hbWUiLCAicHJvcGVydHlOYW1lIiwgImxpdGVyYWwiLCAic3RyaW5nIiwgIm51bWJlciIsICJjb250ZW50IiwgImhlYWRpbmciLCAia2V5d29yZCIsICJvcGVyYXRvciIsICJwdW5jdHVhdGlvbiIsICJicmFja2V0IiwgIm1ldGEiLCAidGFncyIsICJ2YWwiLCAiY2xhc3NIaWdobGlnaHRlciIsICJ0YWdIaWdobGlnaHRlciIsICJfYSIsICJsYW5ndWFnZURhdGFQcm9wIiwgIk5vZGVQcm9wIiwgInN1Ymxhbmd1YWdlUHJvcCIsICJOb2RlUHJvcCIsICJMYW5ndWFnZSIsICJkYXRhIiwgInBhcnNlciIsICJleHRyYUV4dGVuc2lvbnMiLCAibmFtZSIsICJFZGl0b3JTdGF0ZSIsICJzeW50YXhUcmVlIiwgImxhbmd1YWdlIiwgInN0YXRlIiwgInBvcyIsICJzaWRlIiwgInRvcCIsICJ0b3BOb2RlQXQiLCAibGFuZ3VhZ2VEYXRhUHJvcCIsICJiYXNlIiwgInN1YiIsICJpbm5lck5vZGUiLCAic3VibGFuZyIsICJsYW5nIiwgInJlc3VsdCIsICJleHBsb3JlIiwgInRyZWUiLCAiZnJvbSIsICJtb3VudCIsICJyIiwgInNpemUiLCAiaSIsICJjaCIsICJUcmVlIiwgIlN0YXRlRWZmZWN0IiwgInRvcExhbmciLCAibm9kZSIsICJJdGVyTW9kZSIsICJzeW50YXhUcmVlIiwgInN0YXRlIiwgImZpZWxkIiwgIkxhbmd1YWdlIiwgIlRyZWUiLCAiRG9jSW5wdXQiLCAiZG9jIiwgInBvcyIsICJmcm9tIiwgInRvIiwgInN0cmluZ1N0YXJ0IiwgImN1cnJlbnRDb250ZXh0IiwgIlBhcnNlQ29udGV4dCIsICJfUGFyc2VDb250ZXh0IiwgInBhcnNlciIsICJzdGF0ZSIsICJmcmFnbWVudHMiLCAidHJlZSIsICJ0cmVlTGVuIiwgInZpZXdwb3J0IiwgInNraXBwZWQiLCAic2NoZWR1bGVPbiIsICJUcmVlIiwgInVudGlsIiwgInVwdG8iLCAiX2EiLCAiZW5kVGltZSIsICJkb25lIiwgIlRyZWVGcmFnbWVudCIsICJmIiwgInByZXYiLCAiciIsICJjdXRGcmFnbWVudHMiLCAiY2hhbmdlcyIsICJuZXdTdGF0ZSIsICJyYW5nZXMiLCAiZnJvbUEiLCAidG9BIiwgImZyb21CIiwgInRvQiIsICJzdGFydExlbiIsICJQYXJzZXIiLCAiaW5wdXQiLCAiY3giLCAiTm9kZVR5cGUiLCAiZnJhZ3MiLCAiTGFuZ3VhZ2VTdGF0ZSIsICJfTGFuZ3VhZ2VTdGF0ZSIsICJjb250ZXh0IiwgInRyIiwgIm5ld0N4IiwgInZwVG8iLCAicGFyc2VTdGF0ZSIsICJsYW5ndWFnZSIsICJMYW5ndWFnZSIsICJTdGF0ZUZpZWxkIiwgInZhbHVlIiwgInJlcXVlc3RJZGxlIiwgImNhbGxiYWNrIiwgInRpbWVvdXQiLCAiaWRsZSIsICJpc0lucHV0UGVuZGluZyIsICJwYXJzZVdvcmtlciIsICJWaWV3UGx1Z2luIiwgInZpZXciLCAidXBkYXRlIiwgImZpZWxkIiwgImRlYWRsaW5lIiwgIm5vdyIsICJ2aWV3cG9ydEZpcnN0IiwgImVyciIsICJsb2dFeGNlcHRpb24iLCAiRmFjZXQiLCAibGFuZ3VhZ2VzIiwgIkVkaXRvclZpZXciLCAibGFuZyIsICJIaWdobGlnaHRTdHlsZSIsICJfSGlnaGxpZ2h0U3R5bGUiLCAic3BlY3MiLCAib3B0aW9ucyIsICJtb2RTcGVjIiwgImRlZiIsICJzcGVjIiwgImNscyIsICJTdHlsZU1vZHVsZSIsICJhbGwiLCAic2NvcGVPcHQiLCAiTGFuZ3VhZ2UiLCAidHlwZSIsICJsYW5ndWFnZURhdGFQcm9wIiwgInRhZ0hpZ2hsaWdodGVyIiwgInN0eWxlIiwgImRlZmF1bHRIaWdobGlnaHRTdHlsZSIsICJIaWdobGlnaHRTdHlsZSIsICJ0YWdzIiwgInR5cGVBcnJheSIsICJOb2RlVHlwZSIsICJtYXJrcyIsICJEZWNvcmF0aW9uIiwgIkRpcmVjdGlvbiIsICJDT01NRU5UQVRPUl9HTE9CQUwiLCAiYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXNTdGF0ZSIsICJGYWNldCIsICJ2YWx1ZXMiLCAiYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXMiLCAiQ29tcGFydG1lbnQiLCAiaGlkZUVtcHR5RGlmZkd1dHRlclN0YXRlIiwgImhpZGVFbXB0eURpZmZHdXR0ZXIiLCAicHJldmlld01vZGVTdGF0ZSIsICJwcmV2aWV3TW9kZSIsICJlZGl0TW9kZVZhbHVlU3RhdGUiLCAiZWRpdE1vZGVWYWx1ZSIsICJlZGl0TW9kZSIsICJmdWxsUmVsb2FkRWZmZWN0IiwgIlN0YXRlRWZmZWN0IiwgIm5leHRQcm9wSUQiLCAiUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJOb2RlUHJvcCIsICJjb25maWciLCAibWF0Y2giLCAiTm9kZVR5cGUiLCAidHlwZSIsICJyZXN1bHQiLCAic3RyIiwgInZhbHVlIiwgIk1vdW50ZWRUcmVlIiwgInRyZWUiLCAib3ZlcmxheSIsICJwYXJzZXIiLCAibm9Qcm9wcyIsICJfTm9kZVR5cGUiLCAibmFtZSIsICJwcm9wcyIsICJpZCIsICJmbGFncyIsICJzcGVjIiwgInNyYyIsICJwcm9wIiwgImdyb3VwIiwgIm1hcCIsICJkaXJlY3QiLCAibm9kZSIsICJncm91cHMiLCAiaSIsICJmb3VuZCIsICJOb2RlU2V0IiwgIl9Ob2RlU2V0IiwgInR5cGVzIiwgIm5ld1R5cGVzIiwgIm5ld1Byb3BzIiwgInNvdXJjZSIsICJhZGQiLCAiQ2FjaGVkTm9kZSIsICJDYWNoZWRJbm5lck5vZGUiLCAiSXRlck1vZGUiLCAiVHJlZSIsICJfVHJlZSIsICJjaGlsZHJlbiIsICJwb3NpdGlvbnMiLCAibGVuZ3RoIiwgIm1vdW50ZWQiLCAiY2giLCAibW9kZSIsICJUcmVlQ3Vyc29yIiwgInBvcyIsICJzaWRlIiwgInNjb3BlIiwgImN1cnNvciIsICJUcmVlTm9kZSIsICJyZXNvbHZlTm9kZSIsICJzdGFja0l0ZXJhdG9yIiwgImVudGVyIiwgImxlYXZlIiwgImFub24iLCAiYyIsICJlbnRlcmVkIiwgImJhbGFuY2VSYW5nZSIsICJkYXRhIiwgImJ1aWxkVHJlZSIsICJGbGF0QnVmZmVyQ3Vyc29yIiwgIl9GbGF0QnVmZmVyQ3Vyc29yIiwgImJ1ZmZlciIsICJpbmRleCIsICJUcmVlQnVmZmVyIiwgIl9UcmVlQnVmZmVyIiwgInNldCIsICJlbmRJbmRleCIsICJzdGFydEluZGV4IiwgImRpciIsICJwaWNrIiwgImNoZWNrU2lkZSIsICJzdGFydEkiLCAiZW5kSSIsICJiIiwgImNvcHkiLCAibGVuIiwgImoiLCAib3ZlcmxheXMiLCAiX2EiLCAicGFyZW50IiwgInNjYW4iLCAiaW5uZXIiLCAiQmFzZU5vZGUiLCAiYmVmb3JlIiwgImFmdGVyIiwgInIiLCAiZ2V0Q2hpbGRyZW4iLCAiY29udGV4dCIsICJtYXRjaE5vZGVDb250ZXh0IiwgImxhc3QiLCAiX1RyZWVOb2RlIiwgIl90cmVlIiwgIl9wYXJlbnQiLCAiZSIsICJuZXh0IiwgInN0YXJ0IiwgIkJ1ZmZlck5vZGUiLCAiQnVmZmVyQ29udGV4dCIsICJoYXNDaGlsZCIsICJyUG9zIiwgInZhbCIsICJjdXIiLCAicCIsICJfQnVmZmVyTm9kZSIsICJwYXJlbnRTdGFydCIsICJpdGVyU3RhY2siLCAiaGVhZHMiLCAicGlja2VkIiwgIm5ld0hlYWRzIiwgIlN0YWNrSXRlcmF0b3IiLCAibGF5ZXJzIiwgIm1vdW50IiwgInJvb3QiLCAibiIsICJkIiwgImNoaWxkIiwgImNhY2hlIiwgImRlcHRoIiwgIm11c3RMZWF2ZSIsICJub2RlU2V0IiwgIm1heEJ1ZmZlckxlbmd0aCIsICJyZXVzZWQiLCAibWluUmVwZWF0VHlwZSIsICJjb250ZXh0SGFzaCIsICJsb29rQWhlYWQiLCAidGFrZU5vZGUiLCAibWluUG9zIiwgImluUmVwZWF0IiwgImVuZCIsICJzaXplIiwgImxvb2tBaGVhZEF0U3RhcnQiLCAiY29udGV4dEF0U3RhcnQiLCAic3RhcnRQb3MiLCAiZmluZEJ1ZmZlclNpemUiLCAiZW5kUG9zIiwgImNvcHlUb0J1ZmZlciIsICJsb2NhbENoaWxkcmVuIiwgImxvY2FsUG9zaXRpb25zIiwgImxvY2FsSW5SZXBlYXQiLCAibGFzdEdyb3VwIiwgImxhc3RFbmQiLCAibWFrZVJlcGVhdExlYWYiLCAidGFrZUZsYXROb2RlIiwgIm1ha2UiLCAibWFrZUJhbGFuY2VkIiwgIm1ha2VUcmVlIiwgIm5vZGVzIiwgIm5vZGVDb3VudCIsICJzdG9wQXQiLCAibGFzdEkiLCAibG9va0FoZWFkUHJvcCIsICJiYXNlIiwgInBhaXIiLCAibWF4U2l6ZSIsICJmb3JrIiwgInNraXAiLCAibWluU3RhcnQiLCAibm9kZVNpemUiLCAibG9jYWxTa2lwcGVkIiwgIm5vZGVTdGFydCIsICJidWZmZXJTdGFydCIsICJub2RlU2l6ZUNhY2hlIiwgImJhbGFuY2VUeXBlIiwgIm1rVG9wIiwgIm1rVHJlZSIsICJ0b3RhbCIsICJtYXhDaGlsZCIsICJkaXZpZGUiLCAib2Zmc2V0IiwgImdyb3VwRnJvbSIsICJncm91cFN0YXJ0IiwgImdyb3VwU2l6ZSIsICJuZXh0U2l6ZSIsICJvbmx5IiwgIlRyZWVGcmFnbWVudCIsICJfVHJlZUZyYWdtZW50IiwgImZyb20iLCAidG8iLCAidHJlZSIsICJvZmZzZXQiLCAib3BlblN0YXJ0IiwgIm9wZW5FbmQiLCAiZnJhZ21lbnRzIiwgInBhcnRpYWwiLCAicmVzdWx0IiwgImYiLCAiY2hhbmdlcyIsICJtaW5HYXAiLCAiZkkiLCAibmV4dEYiLCAiY0kiLCAicG9zIiwgIm9mZiIsICJuZXh0QyIsICJuZXh0UG9zIiwgImN1dCIsICJmRnJvbSIsICJmVG8iLCAiUGFyc2VyIiwgImlucHV0IiwgInJhbmdlcyIsICJTdHJpbmdJbnB1dCIsICJyIiwgIlJhbmdlIiwgInBhcnNlIiwgImRvbmUiLCAic3RyaW5nIiwgInN0b3BwZWRJbm5lciIsICJOb2RlUHJvcCIsICJUZXh0IiwgIl9UZXh0IiwgInBvcyIsICJuIiwgImZyb20iLCAidG8iLCAidGV4dCIsICJjbGlwIiwgInBhcnRzIiwgIlRleHROb2RlIiwgIm90aGVyIiwgInN0YXJ0IiwgImVuZCIsICJhIiwgIlJhd1RleHRDdXJzb3IiLCAiYiIsICJza2lwIiwgImRpciIsICJQYXJ0aWFsVGV4dEN1cnNvciIsICJpbm5lciIsICJMaW5lQ3Vyc29yIiwgImxpbmVzIiwgIlRleHRMZWFmIiwgIl9UZXh0TGVhZiIsICJsZW5ndGgiLCAidGV4dExlbmd0aCIsICJ0YXJnZXQiLCAiaXNMaW5lIiwgImxpbmUiLCAib2Zmc2V0IiwgImkiLCAic3RyaW5nIiwgIkxpbmUiLCAib3BlbiIsICJzbGljZVRleHQiLCAicHJldiIsICJqb2luZWQiLCAiYXBwZW5kVGV4dCIsICJtaWQiLCAibmV3TGVuIiwgImxpbmVTZXAiLCAicmVzdWx0IiwgInBhcnQiLCAibGVuIiwgIl9UZXh0Tm9kZSIsICJjaGlsZHJlbiIsICJjaGlsZCIsICJlbmRMaW5lIiwgImNoaWxkT3BlbiIsICJ1cGRhdGVkIiwgInRvdGFsTGluZXMiLCAiY29weSIsICJpQSIsICJpQiIsICJlQSIsICJlQiIsICJjaEEiLCAiY2hCIiwgImwiLCAiY2giLCAiZmxhdCIsICJjaHVuayIsICJtYXhDaHVuayIsICJtaW5DaHVuayIsICJjaHVua2VkIiwgImN1cnJlbnRMaW5lcyIsICJjdXJyZW50TGVuIiwgImN1cnJlbnRDaHVuayIsICJhZGQiLCAibGFzdCIsICJub2RlIiwgImZsdXNoIiwgImZpcnN0IiwgInRvcCIsICJvZmZzZXRWYWx1ZSIsICJzaXplIiwgIm5leHQiLCAibGltaXQiLCAidmFsdWUiLCAiZG9uZSIsICJsaW5lQnJlYWsiLCAibnVtYmVyIiwgImV4dGVuZCIsICJpc0V4dGVuZGluZ0NoYXIiLCAiY29kZSIsICJpc1JlZ2lvbmFsSW5kaWNhdG9yIiwgIlpXSiIsICJmaW5kQ2x1c3RlckJyZWFrIiwgInN0ciIsICJmb3J3YXJkIiwgImluY2x1ZGVFeHRlbmRpbmciLCAibmV4dENsdXN0ZXJCcmVhayIsICJwcmV2Q2x1c3RlckJyZWFrIiwgInN1cnJvZ2F0ZUxvdyIsICJzdXJyb2dhdGVIaWdoIiwgImNvZGVQb2ludEF0IiwgImNvZGVQb2ludFNpemUiLCAiY291bnRCZWZvcmUiLCAiZm91bmQiLCAiY29kZTAiLCAiY29kZTEiLCAiY29kZVBvaW50U2l6ZSIsICJjb2RlIiwgIkRlZmF1bHRTcGxpdCIsICJNYXBNb2RlIiwgIkNoYW5nZURlc2MiLCAiX0NoYW5nZURlc2MiLCAic2VjdGlvbnMiLCAicmVzdWx0IiwgImkiLCAiaW5zIiwgImYiLCAicG9zQSIsICJwb3NCIiwgImxlbiIsICJpbmRpdmlkdWFsIiwgIml0ZXJDaGFuZ2VzIiwgIm90aGVyIiwgImNvbXBvc2VTZXRzIiwgImJlZm9yZSIsICJtYXBTZXQiLCAicG9zIiwgImFzc29jIiwgIm1vZGUiLCAiZW5kQSIsICJmcm9tIiwgInRvIiwgImVuZCIsICJqc29uIiwgImEiLCAiQ2hhbmdlU2V0IiwgIl9DaGFuZ2VTZXQiLCAiaW5zZXJ0ZWQiLCAiZG9jIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJfdG9CIiwgInRleHQiLCAiaW5kZXgiLCAiVGV4dCIsICJyYW5nZXMiLCAicmVzdWx0U2VjdGlvbnMiLCAicmVzdWx0SW5zZXJ0ZWQiLCAiZmlsdGVyZWRTZWN0aW9ucyIsICJpdGVyIiwgIlNlY3Rpb25JdGVyIiwgImRvbmUiLCAibmV4dCIsICJhZGRTZWN0aW9uIiwgImFkZEluc2VydCIsICJwYXJ0cyIsICJjaGFuZ2VzIiwgImxlbmd0aCIsICJsaW5lU2VwIiwgInRvdGFsIiwgImZsdXNoIiwgImZvcmNlIiwgInNldCIsICJwcm9jZXNzIiwgInNwZWMiLCAic3ViIiwgImluc2VydCIsICJpbnNUZXh0IiwgImluc0xlbiIsICJwYXJ0IiwgImUiLCAiZm9yY2VKb2luIiwgImxhc3QiLCAidmFsdWVzIiwgInZhbHVlIiwgImRlc2MiLCAiZW5kQiIsICJzZXRBIiwgInNldEIiLCAibWtTZXQiLCAiYiIsICJwaWVjZSIsICJsZWZ0IiwgIm9wZW4iLCAic2VjdGlvbkxlbiIsICJpbnNCIiwgIlNlbGVjdGlvblJhbmdlIiwgIl9TZWxlY3Rpb25SYW5nZSIsICJmbGFncyIsICJsZXZlbCIsICJjaGFuZ2UiLCAiRWRpdG9yU2VsZWN0aW9uIiwgImhlYWQiLCAiaW5jbHVkZUFzc29jIiwgIl9FZGl0b3JTZWxlY3Rpb24iLCAibWFpbkluZGV4IiwgInIiLCAicmFuZ2UiLCAibWFpbiIsICJ3aGljaCIsICJhbmNob3IiLCAiYmlkaUxldmVsIiwgImdvYWxDb2x1bW4iLCAicHJldiIsICJjaGVja1NlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiZG9jTGVuZ3RoIiwgIm5leHRJRCIsICJGYWNldCIsICJfRmFjZXQiLCAiY29tYmluZSIsICJjb21wYXJlSW5wdXQiLCAiY29tcGFyZSIsICJpc1N0YXRpYyIsICJlbmFibGVzIiwgImNvbmZpZyIsICJzYW1lQXJyYXkiLCAiRmFjZXRQcm92aWRlciIsICJkZXBzIiwgImdldCIsICJmaWVsZCIsICJ4IiwgInN0YXRlIiwgImRlcGVuZGVuY2llcyIsICJmYWNldCIsICJ0eXBlIiwgImFkZHJlc3NlcyIsICJfYSIsICJnZXR0ZXIiLCAiaWQiLCAiaWR4IiwgIm11bHRpIiwgImRlcERvYyIsICJkZXBTZWwiLCAiZGVwQWRkcnMiLCAiZGVwIiwgInRyIiwgImVuc3VyZUFsbCIsICJuZXdWYWwiLCAiY29tcGFyZUFycmF5IiwgIm9sZFN0YXRlIiwgIm9sZEFkZHIiLCAib2xkVmFsIiwgImdldEFkZHIiLCAiU3RhdGVGaWVsZCIsICJhZGRycyIsICJjaGFuZ2VkIiwgImFkZHIiLCAiZW5zdXJlQWRkciIsICJkeW5hbWljRmFjZXRTbG90IiwgInByb3ZpZGVycyIsICJwcm92aWRlckFkZHJzIiwgInAiLCAicHJvdmlkZXJUeXBlcyIsICJkeW5hbWljIiwgInZhbCIsICJkZXBDaGFuZ2VkIiwgIm9sZFByb3ZpZGVycyIsICJvbGRWYWx1ZSIsICJpbml0RmllbGQiLCAiX1N0YXRlRmllbGQiLCAiY3JlYXRlRiIsICJ1cGRhdGVGIiwgImNvbXBhcmVGIiwgImluaXQiLCAiY3JlYXRlIiwgIlByZWNfIiwgInByZWMiLCAiZXh0IiwgIlByZWNFeHRlbnNpb24iLCAiUHJlYyIsICJpbm5lciIsICJDb21wYXJ0bWVudCIsICJfQ29tcGFydG1lbnQiLCAiQ29tcGFydG1lbnRJbnN0YW5jZSIsICJjb250ZW50IiwgImNvbXBhcnRtZW50IiwgIkNvbmZpZ3VyYXRpb24iLCAiX0NvbmZpZ3VyYXRpb24iLCAiYmFzZSIsICJjb21wYXJ0bWVudHMiLCAiZHluYW1pY1Nsb3RzIiwgImFkZHJlc3MiLCAic3RhdGljVmFsdWVzIiwgImZhY2V0cyIsICJmaWVsZHMiLCAibmV3Q29tcGFydG1lbnRzIiwgImZsYXR0ZW4iLCAib2xkRmFjZXRzIiwgImV4dGVuc2lvbiIsICJzZWVuIiwgImtub3duIiwgImZvdW5kIiwgInN0YXR1cyIsICJsYW5ndWFnZURhdGEiLCAiYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMiLCAidiIsICJsaW5lU2VwYXJhdG9yIiwgImNoYW5nZUZpbHRlciIsICJ0cmFuc2FjdGlvbkZpbHRlciIsICJ0cmFuc2FjdGlvbkV4dGVuZGVyIiwgInJlYWRPbmx5IiwgIkFubm90YXRpb24iLCAiQW5ub3RhdGlvblR5cGUiLCAiU3RhdGVFZmZlY3RUeXBlIiwgIm1hcCIsICJTdGF0ZUVmZmVjdCIsICJfU3RhdGVFZmZlY3QiLCAibWFwcGluZyIsICJtYXBwZWQiLCAiZWZmZWN0cyIsICJlZmZlY3QiLCAiVHJhbnNhY3Rpb24iLCAiX1RyYW5zYWN0aW9uIiwgInN0YXJ0U3RhdGUiLCAiYW5ub3RhdGlvbnMiLCAic2Nyb2xsSW50b1ZpZXciLCAiYW5uIiwgImV2ZW50IiwgImpvaW5SYW5nZXMiLCAiaUEiLCAiaUIiLCAibWVyZ2VUcmFuc2FjdGlvbiIsICJzZXF1ZW50aWFsIiwgIm1hcEZvckEiLCAibWFwRm9yQiIsICJyZXNvbHZlVHJhbnNhY3Rpb25Jbm5lciIsICJkb2NTaXplIiwgInNlbCIsICJhc0FycmF5IiwgInJlc29sdmVUcmFuc2FjdGlvbiIsICJzcGVjcyIsICJmaWx0ZXIiLCAicyIsICJzZXEiLCAiZXh0ZW5kVHJhbnNhY3Rpb24iLCAiZmlsdGVyVHJhbnNhY3Rpb24iLCAiYmFjayIsICJmaWx0ZXJlZCIsICJmaWx0ZXJzIiwgImV4dGVuZGVycyIsICJub25lIiwgIkNoYXJDYXRlZ29yeSIsICJub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhciIsICJ3b3JkQ2hhciIsICJfIiwgImhhc1dvcmRDaGFyIiwgInN0ciIsICJjaCIsICJtYWtlQ2F0ZWdvcml6ZXIiLCAid29yZENoYXJzIiwgImNoYXIiLCAiRWRpdG9yU3RhdGUiLCAiX0VkaXRvclN0YXRlIiwgImNvbXB1dGVTbG90IiwgInJlcXVpcmUiLCAiY29uZiIsICJrZXkiLCAic3RhcnRWYWx1ZXMiLCAic2xvdCIsICJyZXN1bHQxIiwgIm5ld0NoYW5nZXMiLCAibmV3TWFwcGVkIiwgImoiLCAibWFwQnkiLCAic3RyaW5nIiwgInByb3AiLCAiZmllbGRJbml0IiwgImNvbmZpZ3VyYXRpb24iLCAicGhyYXNlIiwgIm0iLCAibiIsICJuYW1lIiwgInNpZGUiLCAicHJvdmlkZXIiLCAiYXQiLCAiY2F0IiwgInN0YXJ0IiwgImZpbmRDbHVzdGVyQnJlYWsiLCAia0EiLCAia0IiLCAiayIsICJSYW5nZVZhbHVlIiwgIm90aGVyIiwgImZyb20iLCAidG8iLCAiUmFuZ2UiLCAiTWFwTW9kZSIsICJfUmFuZ2UiLCAidmFsdWUiLCAiY21wUmFuZ2UiLCAiYSIsICJiIiwgIkNodW5rIiwgIl9DaHVuayIsICJtYXhQb2ludCIsICJwb3MiLCAic2lkZSIsICJlbmQiLCAic3RhcnRBdCIsICJhcnIiLCAibG8iLCAiaGkiLCAibWlkIiwgImRpZmYiLCAib2Zmc2V0IiwgImYiLCAiaSIsICJlIiwgImNoYW5nZXMiLCAibmV3UG9zIiwgInZhbCIsICJjdXJGcm9tIiwgImN1clRvIiwgIm5ld0Zyb20iLCAibmV3VG8iLCAibWFwcGVkIiwgIlJhbmdlU2V0IiwgIl9SYW5nZVNldCIsICJjaHVua1BvcyIsICJjaHVuayIsICJuZXh0TGF5ZXIiLCAibGFzdCIsICJzaXplIiwgImluZGV4IiwgInVwZGF0ZVNwZWMiLCAiYWRkIiwgInNvcnQiLCAiZmlsdGVyRnJvbSIsICJmaWx0ZXJUbyIsICJmaWx0ZXIiLCAiY3VyIiwgIkxheWVyQ3Vyc29yIiwgInNwaWxsIiwgImJ1aWxkZXIiLCAiUmFuZ2VTZXRCdWlsZGVyIiwgInJhbmdlIiwgImNodW5rcyIsICJzdGFydCIsICJ0b3VjaCIsICJuZXh0IiwgIkhlYXBDdXJzb3IiLCAic2V0cyIsICJvbGRTZXRzIiwgIm5ld1NldHMiLCAidGV4dERpZmYiLCAiY29tcGFyYXRvciIsICJtaW5Qb2ludFNpemUiLCAic2V0IiwgInNoYXJlZENodW5rcyIsICJmaW5kU2hhcmVkQ2h1bmtzIiwgInNpZGVBIiwgIlNwYW5DdXJzb3IiLCAic2lkZUIiLCAiZnJvbUEiLCAiZnJvbUIiLCAibGVuZ3RoIiwgImNvbXBhcmUiLCAic2FtZVZhbHVlcyIsICJpdGVyYXRvciIsICJjdXJzb3IiLCAib3BlblJhbmdlcyIsICJhY3RpdmUiLCAib3BlbkNvdW50IiwgInJhbmdlcyIsICJidWlsZCIsICJsYXp5U29ydCIsICJyZXN1bHQiLCAibGF5ZXIiLCAicHJldiIsICJfUmFuZ2VTZXRCdWlsZGVyIiwgIm5ld0FycmF5cyIsICJpbkEiLCAic2hhcmVkIiwgImtub3duIiwgInNraXAiLCAibWluUG9pbnQiLCAicmFuayIsICJmb3J3YXJkIiwgInJhbmdlSW5kZXgiLCAiX0hlYXBDdXJzb3IiLCAiaGVhcCIsICJoZWFwQnViYmxlIiwgInRvcCIsICJjaGlsZEluZGV4IiwgImNoaWxkIiwgInJlbW92ZSIsICJmaW5kTWluSW5kZXgiLCAidHJhY2tPcGVuIiwgImluc2VydCIsICJ3YXNQb2ludCIsICJuZXh0VmFsIiwgIm9wZW4iLCAic3RhcnRBIiwgInN0YXJ0QiIsICJlbmRCIiwgImRQb3MiLCAiY2xpcEVuZCIsICJhcnJheSIsICJmb3VuZCIsICJmb3VuZFBvcyIsICJmaW5kQ29sdW1uIiwgInN0cmluZyIsICJjb2wiLCAidGFiU2l6ZSIsICJzdHJpY3QiLCAiaSIsICJuIiwgImZpbmRDbHVzdGVyQnJlYWsiLCAiQyIsICJDT1VOVCIsICJTRVQiLCAidG9wIiwgIlN0eWxlTW9kdWxlIiwgInNwZWMiLCAib3B0aW9ucyIsICJmaW5pc2giLCAic3BsaXRTZWxlY3RvciIsICJzZWxlY3RvciIsICJyZW5kZXIiLCAic2VsZWN0b3JzIiwgInRhcmdldCIsICJpc0tleWZyYW1lcyIsICJsb2NhbCIsICJpc0F0IiwgImtleWZyYW1lcyIsICJwcm9wIiwgInZhbHVlIiwgInBhcnQiLCAic2VsIiwgImEiLCAiYiIsICJsIiwgImlkIiwgInJvb3QiLCAibW9kdWxlcyIsICJzZXQiLCAibm9uY2UiLCAiU3R5bGVTZXQiLCAiYWRvcHRlZFNldCIsICJkb2MiLCAid2luIiwgImFkb3B0ZWQiLCAic2hlZXQiLCAicG9zIiwgImoiLCAiaSIsICJtb2QiLCAiaW5kZXgiLCAiayIsICJ0ZXh0IiwgImJhc2UiLCAic2hpZnQiLCAibWFjIiwgImllIiwgImkiLCAiY29kZSIsICJnZXRTZWxlY3Rpb24iLCAicm9vdCIsICJ0YXJnZXQiLCAiY29udGFpbnMiLCAiZG9tIiwgIm5vZGUiLCAiZGVlcEFjdGl2ZUVsZW1lbnQiLCAiZG9jIiwgImVsdCIsICJoYXNTZWxlY3Rpb24iLCAic2VsZWN0aW9uIiwgIl8iLCAiY2xpZW50UmVjdHNGb3IiLCAidGV4dFJhbmdlIiwgImlzRXF1aXZhbGVudFBvc2l0aW9uIiwgIm9mZiIsICJ0YXJnZXROb2RlIiwgInRhcmdldE9mZiIsICJzY2FuRm9yIiwgImRvbUluZGV4IiwgImluZGV4IiwgImRpciIsICJtYXhPZmZzZXQiLCAicGFyZW50IiwgImZsYXR0ZW5SZWN0IiwgInJlY3QiLCAibGVmdCIsICJ4IiwgIndpbmRvd1JlY3QiLCAid2luIiwgImdldFNjYWxlIiwgInNjYWxlWCIsICJzY2FsZVkiLCAic2Nyb2xsUmVjdEludG9WaWV3IiwgInNpZGUiLCAieSIsICJ4TWFyZ2luIiwgInlNYXJnaW4iLCAibHRyIiwgImN1ciIsICJzdG9wIiwgImJvdW5kaW5nIiwgInRvcCIsICJtb3ZlWCIsICJtb3ZlWSIsICJyZWN0SGVpZ2h0IiwgImJvdW5kaW5nSGVpZ2h0IiwgIm1vdmVkWCIsICJtb3ZlZFkiLCAic3RhcnQiLCAic2Nyb2xsYWJsZVBhcmVudCIsICJET01TZWxlY3Rpb25TdGF0ZSIsICJkb21TZWwiLCAicmFuZ2UiLCAiYW5jaG9yTm9kZSIsICJmb2N1c05vZGUiLCAiYW5jaG9yT2Zmc2V0IiwgImZvY3VzT2Zmc2V0IiwgInByZXZlbnRTY3JvbGxTdXBwb3J0ZWQiLCAiZm9jdXNQcmV2ZW50U2Nyb2xsIiwgInN0YWNrIiwgImkiLCAic2NyYXRjaFJhbmdlIiwgImZyb20iLCAidG8iLCAiZGlzcGF0Y2hLZXkiLCAibmFtZSIsICJjb2RlIiwgIm9wdGlvbnMiLCAiZG93biIsICJ1cCIsICJnZXRSb290IiwgImNsZWFyQXR0cmlidXRlcyIsICJhdEVsZW1lbnRTdGFydCIsICJvZmZzZXQiLCAicHJldiIsICJpc1Njcm9sbGVkVG9Cb3R0b20iLCAiRE9NUG9zIiwgIl9ET01Qb3MiLCAicHJlY2lzZSIsICJub0NoaWxkcmVuIiwgIkNvbnRlbnRWaWV3IiwgIl9Db250ZW50VmlldyIsICJ2aWV3IiwgInBvcyIsICJjaGlsZCIsICJ0cmFjayIsICJuZXh0IiwgImNvbnRlbnRWaWV3IiwgInJtJDEiLCAiX2RvbSIsICJhZnRlciIsICJiaWFzIiwgImZyb21JIiwgImZyb21TdGFydCIsICJ0b0kiLCAidG9FbmQiLCAicHJldkVuZCIsICJlbmQiLCAiYW5kUGFyZW50IiwgImNoaWxkTGlzdCIsICJ2IiwgImNoaWxkcmVuIiwgIl9yZWMiLCAiX2V2ZW50IiwgIkNoaWxkQ3Vyc29yIiwgInNvdXJjZSIsICJoYXNTdGFydCIsICJvcGVuU3RhcnQiLCAib3BlbkVuZCIsICJvdGhlciIsICJyZXBsYWNlUmFuZ2UiLCAiZnJvbU9mZiIsICJ0b09mZiIsICJpbnNlcnQiLCAiYnJlYWtBdFN0YXJ0IiwgImJlZm9yZSIsICJsYXN0IiwgImJyZWFrQXRFbmQiLCAibWVyZ2VDaGlsZHJlbkludG8iLCAiZExlbiIsICJuYXYiLCAiaWVfZWRnZSIsICJpZV91cHRvMTAiLCAiaWVfMTF1cCIsICJpZSIsICJnZWNrbyIsICJjaHJvbWUiLCAid2Via2l0IiwgInNhZmFyaSIsICJpb3MiLCAiYnJvd3NlciIsICJNYXhKb2luTGVuIiwgIlRleHRWaWV3IiwgIl9UZXh0VmlldyIsICJ0ZXh0IiwgInRleHRET00iLCAicmVzdWx0IiwgIl9mcm9tIiwgIl90byIsICJ0ZXh0Q29vcmRzIiwgIk1hcmtWaWV3IiwgIl9NYXJrVmlldyIsICJtYXJrIiwgImxlbmd0aCIsICJjaCIsICJfaGFzU3RhcnQiLCAiZGV0YWNoRnJvbSIsICJpbmxpbmVET01BdFBvcyIsICJjb29yZHNJbkNoaWxkcmVuIiwgImZsYXR0ZW4iLCAicmVjdHMiLCAiciIsICJXaWRnZXRWaWV3IiwgIl9XaWRnZXRWaWV3IiwgIndpZGdldCIsICJldmVudCIsICJUZXh0IiwgImN1c3RvbSIsICJmcm9tQmFjayIsICJXaWRnZXRCdWZmZXJWaWV3IiwgIl9XaWRnZXRCdWZmZXJWaWV3IiwgImoiLCAiam9pbklubGluZUludG8iLCAib3BlbiIsICJiZWZvcmVQb3MiLCAiYWZ0ZXJQb3MiLCAic2NhbiIsICJmYWxsYmFja1JlY3QiLCAiY29tYmluZUF0dHJzIiwgIm5vQXR0cnMiLCAiYXR0cnNFcSIsICJhIiwgImIiLCAiaWdub3JlIiwgImtleXNBIiwgImtleXNCIiwgImtleSIsICJ1cGRhdGVBdHRycyIsICJhdHRycyIsICJjaGFuZ2VkIiwgImdldEF0dHJzIiwgImF0dHIiLCAiTGluZVZpZXciLCAiX0xpbmVWaWV3IiwgImF0IiwgImRlY28iLCAiY2xzIiwgIl9hIiwgImhhY2siLCAidG90YWxXaWR0aCIsICJ0ZXh0SGVpZ2h0IiwgImhlaWdodE9yYWNsZSIsICJoZWlnaHQiLCAiZGlzdCIsICJfb3RoZXIiLCAiZG9jVmlldyIsICJibG9jayIsICJCbG9ja1dpZGdldFZpZXciLCAiX0Jsb2NrV2lkZ2V0VmlldyIsICJfdGFrZURlY28iLCAibGVuIiwgInN0YXJ0U2lkZSIsICJlbmRTaWRlIiwgIldpZGdldFR5cGUiLCAiQmxvY2tUeXBlIiwgIkRlY29yYXRpb24iLCAiUmFuZ2VWYWx1ZSIsICJzcGVjIiwgIk1hcmtEZWNvcmF0aW9uIiwgIlBvaW50RGVjb3JhdGlvbiIsICJnZXRJbmNsdXNpdmUiLCAiTGluZURlY29yYXRpb24iLCAib2YiLCAic29ydCIsICJSYW5nZVNldCIsICJfTWFya0RlY29yYXRpb24iLCAiX2IiLCAiX0xpbmVEZWNvcmF0aW9uIiwgIk1hcE1vZGUiLCAiX1BvaW50RGVjb3JhdGlvbiIsICJpc1JlcGxhY2UiLCAid2lkZ2V0c0VxIiwgImFkZFJhbmdlIiwgInJhbmdlcyIsICJtYXJnaW4iLCAiQ29udGVudEJ1aWxkZXIiLCAiX0NvbnRlbnRCdWlsZGVyIiwgImRpc2FsbG93QmxvY2tFZmZlY3RzRm9yIiwgImFjdGl2ZSIsICJ3cmFwTWFya3MiLCAidmFsdWUiLCAibGluZUJyZWFrIiwgImRvbmUiLCAidGFrZSIsICJOdWxsV2lkZ2V0IiwgImN1cnNvckJlZm9yZSIsICJjdXJzb3JBZnRlciIsICJsaW5lIiwgImRlY29yYXRpb25zIiwgImR5bmFtaWNEZWNvcmF0aW9uTWFwIiwgImJ1aWxkZXIiLCAidGFnIiwgIkRpcmVjdGlvbiIsICJMVFIiLCAiUlRMIiwgImRlYyIsICJzdHIiLCAiTG93VHlwZXMiLCAiQXJhYmljVHlwZXMiLCAiQnJhY2tldHMiLCAiQnJhY2tldFN0YWNrIiwgInAiLCAibCIsICJjaGFyVHlwZSIsICJCaWRpUkUiLCAiQmlkaVNwYW4iLCAibGV2ZWwiLCAiZm9yd2FyZCIsICJvcmRlciIsICJhc3NvYyIsICJtYXliZSIsICJzcGFuIiwgImlzb2xhdGVzRXEiLCAiaUEiLCAiaUIiLCAidHlwZXMiLCAiY29tcHV0ZUNoYXJUeXBlcyIsICJyRnJvbSIsICJyVG8iLCAiaXNvbGF0ZXMiLCAib3V0ZXJUeXBlIiwgImlJIiwgInByZXZUeXBlIiwgInByZXZTdHJvbmciLCAidHlwZSIsICJyZXBsYWNlIiwgInByb2Nlc3NCcmFja2V0UGFpcnMiLCAib3Bwb3NpdGVUeXBlIiwgInNJIiwgImNvbnRleHQiLCAiYnIiLCAic0oiLCAiZmxhZ3MiLCAiZW1iZWQiLCAicHJvY2Vzc05ldXRyYWxzIiwgImJlZm9yZUwiLCAiYWZ0ZXJMIiwgImpJIiwgImZyb21KIiwgImVtaXRTcGFucyIsICJiYXNlTGV2ZWwiLCAib3VyVHlwZSIsICJpQ2giLCAic2FtZURpciIsICJpc051bSIsICJyZWN1cnNlIiwgImxvY2FsTGV2ZWwiLCAiaVNjYW4iLCAicnVuIiwgImlzbyIsICJ1cHRvIiwgImRpclN3YXAiLCAiY29tcHV0ZVNlY3Rpb25PcmRlciIsICJjb21wdXRlT3JkZXIiLCAiZGlyZWN0aW9uIiwgInRyaXZpYWxPcmRlciIsICJtb3ZlZE92ZXIiLCAibW92ZVZpc3VhbGx5IiwgInN0YXJ0SW5kZXgiLCAic3BhbkkiLCAic3BhbkVuZCIsICJuZXh0SSIsICJuZXh0SW5kZXgiLCAiZmluZENsdXN0ZXJCcmVhayIsICJuZXh0U3BhbiIsICJFZGl0b3JTZWxlY3Rpb24iLCAiYXV0b0RpcmVjdGlvbiIsICJjbGlja0FkZHNTZWxlY3Rpb25SYW5nZSIsICJGYWNldCIsICJkcmFnTW92ZXNTZWxlY3Rpb24kMSIsICJtb3VzZVNlbGVjdGlvblN0eWxlIiwgImV4Y2VwdGlvblNpbmsiLCAidXBkYXRlTGlzdGVuZXIiLCAiaW5wdXRIYW5kbGVyIiwgImZvY3VzQ2hhbmdlRWZmZWN0IiwgInBlckxpbmVUZXh0RGlyZWN0aW9uIiwgInZhbHVlcyIsICJuYXRpdmVTZWxlY3Rpb25IaWRkZW4iLCAiU2Nyb2xsVGFyZ2V0IiwgIl9TY3JvbGxUYXJnZXQiLCAiaXNTbmFwc2hvdCIsICJjaGFuZ2VzIiwgInN0YXRlIiwgInNjcm9sbEludG9WaWV3IiwgIlN0YXRlRWZmZWN0IiwgInQiLCAibG9nRXhjZXB0aW9uIiwgImV4Y2VwdGlvbiIsICJoYW5kbGVyIiwgImVkaXRhYmxlIiwgIm5leHRQbHVnaW5JRCIsICJ2aWV3UGx1Z2luIiwgIlZpZXdQbHVnaW4iLCAiX1ZpZXdQbHVnaW4iLCAiaWQiLCAiY3JlYXRlIiwgImRvbUV2ZW50SGFuZGxlcnMiLCAiZG9tRXZlbnRPYnNlcnZlcnMiLCAiYnVpbGRFeHRlbnNpb25zIiwgImV2ZW50SGFuZGxlcnMiLCAiZXZlbnRPYnNlcnZlcnMiLCAicHJvdmlkZSIsICJwbHVnaW4iLCAiZXh0IiwgInBsdWdpbkluc3QiLCAiUGx1Z2luSW5zdGFuY2UiLCAidXBkYXRlIiwgImUiLCAiZWRpdG9yQXR0cmlidXRlcyIsICJjb250ZW50QXR0cmlidXRlcyIsICJvdXRlckRlY29yYXRpb25zIiwgImF0b21pY1JhbmdlcyIsICJiaWRpSXNvbGF0ZWRSYW5nZXMiLCAiZ2V0SXNvbGF0ZWRSYW5nZXMiLCAic2V0cyIsICJmcm9tRG9jIiwgInRvRG9jIiwgImFkZCIsICJzY3JvbGxNYXJnaW5zIiwgImdldFNjcm9sbE1hcmdpbnMiLCAicmlnaHQiLCAiYm90dG9tIiwgIm0iLCAic3R5bGVNb2R1bGUiLCAiQ2hhbmdlZFJhbmdlIiwgIl9DaGFuZ2VkUmFuZ2UiLCAiZnJvbUEiLCAidG9BIiwgImZyb21CIiwgInRvQiIsICJzZXQiLCAibWUiLCAiZGlmZiIsICJkSSIsICJySSIsICJwb3NBIiwgInBvc0IiLCAiVmlld1VwZGF0ZSIsICJfVmlld1VwZGF0ZSIsICJ0cmFuc2FjdGlvbnMiLCAiQ2hhbmdlU2V0IiwgInRyIiwgImNoYW5nZWRSYW5nZXMiLCAiRG9jVmlldyIsICJyZWFkQ29tcG9zaXRpb25BdCIsICJ0b3VjaGVzQ29tcG9zaXRpb24iLCAiY29tcG9zaXRpb24iLCAiZmluZENvbXBvc2l0aW9uUmFuZ2UiLCAicHJldkRlY28iLCAiZGVjb0RpZmYiLCAiZmluZENoYW5nZWREZWNvIiwgIm9sZExlbmd0aCIsICJvYnNlcnZlciIsICJjVmlldyIsICJnYXBzIiwgIkJsb2NrR2FwV2lkZ2V0IiwgImN1cnNvciIsICJjb250ZW50IiwgImNvbXBMaW5lIiwgImZpeCIsICJjIiwgIm11c3RSZWFkIiwgImZyb21Qb2ludGVyIiwgImFjdGl2ZUVsdCIsICJmb2N1c2VkIiwgInNlbGVjdGlvbk5vdEZvY3VzIiwgImZvcmNlIiwgIm1haW4iLCAiYW5jaG9yIiwgImhlYWQiLCAiYmV0d2VlblVuZWRpdGFibGUiLCAiZHVtbXkiLCAiaW5VbmVkaXRhYmxlIiwgInJhd1NlbCIsICJuZXh0VG8iLCAibmV4dFRvVW5lZGl0YWJsZSIsICJuZWFyYnlUZXh0Tm9kZSIsICJzZWwiLCAibGluZVN0YXJ0IiwgIm5ld1JhbmdlIiwgIm5ld1BvcyIsICJkb21WaWV3IiwgImJlc3QiLCAiYmVzdFBvcyIsICJjaGlsZE9mZiIsICJ2aWV3cG9ydCIsICJjb250ZW50V2lkdGgiLCAiaXNXaWRlciIsICJ3aWRlc3QiLCAiY2hpbGRSZWN0IiwgIndpZHRoIiwgIm1lYXN1cmUiLCAibGluZUhlaWdodCIsICJjaGFyV2lkdGgiLCAidnMiLCAiYWxsRGVjbyIsICJkIiwgImR5bmFtaWNPdXRlciIsICJvdXRlckRlY28iLCAiZHluYW1pYyIsICJyZWYiLCAibWFyZ2lucyIsICJ0YXJnZXRSZWN0IiwgIm9mZnNldFdpZHRoIiwgIm9mZnNldEhlaWdodCIsICJmaW5kQ29tcG9zaXRpb25Ob2RlIiwgImhlYWRQb3MiLCAidGV4dE5vZGUiLCAiZm91bmQiLCAiaW52IiwgIm1hcmtzIiwgInBhcmVudFZpZXciLCAic3RhcnROb2RlIiwgInN0YXJ0T2Zmc2V0IiwgIkRlY29yYXRpb25Db21wYXJhdG9yJDEiLCAiY29tcCIsICJpbnNpZGUiLCAidG91Y2hlZCIsICJncm91cEF0IiwgImNhdGVnb3JpemUiLCAibGluZVBvcyIsICJjYXQiLCAiZ2V0ZHgiLCAiZ2V0ZHkiLCAieU92ZXJsYXAiLCAidXBUb3AiLCAidXBCb3QiLCAiZG9tUG9zQXRDb29yZHMiLCAiY2xvc2VzdCIsICJjbG9zZXN0UmVjdCIsICJjbG9zZXN0WCIsICJjbG9zZXN0WSIsICJjbG9zZXN0T3ZlcmxhcCIsICJhYm92ZSIsICJiZWxvdyIsICJhYm92ZVJlY3QiLCAiYmVsb3dSZWN0IiwgImR4IiwgImR5IiwgImRvbVBvc0luVGV4dCIsICJjbGlwWCIsICJjbG9zZXN0T2Zmc2V0IiwgImNsb3Nlc3REWSIsICJnZW5lcmFsU2lkZSIsICJwb3NBdENvb3JkcyIsICJjb29yZHMiLCAiZG9jVG9wIiwgImRvY0hlaWdodCIsICJ5T2Zmc2V0IiwgImhhbGZMaW5lIiwgImJvdW5jZWQiLCAicG9zQXRDb29yZHNJbXByZWNpc2UiLCAiZWxlbWVudCIsICJpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdCIsICJpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdCIsICJuZWFyZXN0IiwgImNvbnRlbnRSZWN0IiwgImludG8iLCAiZmluZENvbHVtbiIsICJibG9ja0F0IiwgIm1vdmVUb0xpbmVCb3VuZGFyeSIsICJpbmNsdWRlV3JhcCIsICJlZGl0b3JSZWN0IiwgIm1vdmVCeUNoYXIiLCAiYnkiLCAic3BhbnMiLCAiY2hlY2siLCAiY2hhciIsICJieUdyb3VwIiwgIm5leHRDYXQiLCAiQ2hhckNhdGVnb3J5IiwgIm1vdmVWZXJ0aWNhbGx5IiwgImRpc3RhbmNlIiwgInN0YXJ0UG9zIiwgImdvYWwiLCAic3RhcnRZIiwgInN0YXJ0Q29vcmRzIiwgInJlc29sdmVkR29hbCIsICJleHRyYSIsICJjdXJZIiwgImNoYXJSZWN0IiwgInNraXBBdG9taWNSYW5nZXMiLCAiYXRvbXMiLCAibW92ZWQiLCAic2tpcEF0b21zIiwgIm9sZFBvcyIsICJmIiwgIklucHV0U3RhdGUiLCAib3JpZ2luIiwgImZpcmVmb3hDb3B5Q3V0SGFjayIsICJldmVudEJlbG9uZ3NUb0VkaXRvciIsICJoYW5kbGVycyIsICJwbHVnaW5zIiwgImNvbXB1dGVIYW5kbGVycyIsICJwYXNzaXZlIiwgImV4aXN0cyIsICJtb2RpZmllckNvZGVzIiwgInBlbmRpbmciLCAiUGVuZGluZ0tleXMiLCAiRW1hY3N5UGVuZGluZ0tleXMiLCAibW91c2VTZWxlY3Rpb24iLCAiYmluZEhhbmRsZXIiLCAicmVjb3JkIiwgIm9ic2VydmVycyIsICJkcmFnU2Nyb2xsTWFyZ2luIiwgImRyYWdTY3JvbGxTcGVlZCIsICJNb3VzZVNlbGVjdGlvbiIsICJzdGFydEV2ZW50IiwgInN0eWxlIiwgIm11c3RTZWxlY3QiLCAiRWRpdG9yU3RhdGUiLCAiYWRkc1NlbGVjdGlvblJhbmdlIiwgImlzSW5QcmltYXJ5U2VsZWN0aW9uIiwgImdldENsaWNrVHlwZSIsICJzeCIsICJzeSIsICJ1cGRhdGVkIiwgImZhY2V0IiwgImRyYWdNb3Zlc1NlbGVjdGlvbiIsICJicm9rZW5DbGlwYm9hcmRBUEkiLCAiY2FwdHVyZVBhc3RlIiwgImRvUGFzdGUiLCAiaW5wdXQiLCAiYnlMaW5lIiwgImxhc3RMaW5ld2lzZUNvcHkiLCAibGFzdExpbmUiLCAibWFrZVN0eWxlIiwgImJhc2ljTW91c2VTZWxlY3Rpb24iLCAibXVzdEZvY3VzIiwgIm1vdXNlU2VsIiwgInJhbmdlRm9yQ2xpY2siLCAidmlzdWFsIiwgImluc2lkZVkiLCAiZmluZFBvc2l0aW9uU2lkZSIsICJxdWVyeVBvcyIsICJCYWRNb3VzZURldGFpbCIsICJsYXN0TW91c2VEb3duIiwgImxhc3RNb3VzZURvd25Db3VudCIsICJsYXN0TW91c2VEb3duVGltZSIsICJsYXN0VGltZSIsICJzdGFydFNlbCIsICJleHRlbmQiLCAibXVsdGlwbGUiLCAicmVtb3ZlZCIsICJzdGFydFJhbmdlIiwgInJlbW92ZVJhbmdlQXJvdW5kIiwgImlucHV0U3RhdGUiLCAiZHJvcFRleHQiLCAiZGlyZWN0IiwgImRyb3BQb3MiLCAiZHJhZ2dlZENvbnRlbnQiLCAiZGVsIiwgImlucyIsICJmaWxlcyIsICJyZWFkIiwgImZpbmlzaEZpbGUiLCAicyIsICJyZWFkZXIiLCAiZGF0YSIsICJjYXB0dXJlQ29weSIsICJjb3BpZWRSYW5nZSIsICJsaW5ld2lzZSIsICJpc0ZvY3VzQ2hhbmdlIiwgIkFubm90YXRpb24iLCAiZm9jdXNDaGFuZ2VUcmFuc2FjdGlvbiIsICJmb2N1cyIsICJlZmZlY3RzIiwgImdldEVmZmVjdCIsICJlZmZlY3QiLCAidXBkYXRlRm9yRm9jdXNDaGFuZ2UiLCAic3RhcnRWaWV3SGVpZ2h0IiwgImFwcGxpZWRGaXJlZm94SGFjayIsICJ3cmFwcGluZ1doaXRlU3BhY2UiLCAiSGVpZ2h0T3JhY2xlIiwgImxpbmVXcmFwcGluZyIsICJsaW5lcyIsICJ3aGl0ZVNwYWNlIiwgImxpbmVIZWlnaHRzIiwgIm5ld0hlaWdodCIsICJoIiwgImxpbmVMZW5ndGgiLCAia25vd25IZWlnaHRzIiwgIk1lYXN1cmVkSGVpZ2h0cyIsICJoZWlnaHRzIiwgIkJsb2NrSW5mbyIsICJfQmxvY2tJbmZvIiwgIl9jb250ZW50IiwgIlF1ZXJ5VHlwZSIsICJFcHNpbG9uIiwgIkhlaWdodE1hcCIsICJfSGVpZ2h0TWFwIiwgIm9yYWNsZSIsICJub2RlcyIsICJvbGREb2MiLCAiTm9kZUJ1aWxkZXIiLCAiSGVpZ2h0TWFwVGV4dCIsICJzcGxpdCIsICJicmsiLCAiSGVpZ2h0TWFwQnJhbmNoIiwgIkhlaWdodE1hcEJsb2NrIiwgIl9oZWlnaHQiLCAiX29yYWNsZSIsICJfdmFsdWUiLCAiX3R5cGUiLCAiX2ZvcmNlIiwgIm1lYXN1cmVkIiwgIl9IZWlnaHRNYXBUZXh0IiwgIkhlaWdodE1hcEdhcCIsICJfSGVpZ2h0TWFwR2FwIiwgImZpcnN0TGluZSIsICJwZXJMaW5lIiwgInBlckNoYXIiLCAidG90YWxQZXJMaW5lIiwgImd1ZXNzIiwgImxpbmVUb3AiLCAibGluZXNBYm92ZSIsICJmaXJzdCIsICJzaW5nbGVIZWlnaHQiLCAibWlkIiwgInJpZ2h0VG9wIiwgInJpZ2h0T2Zmc2V0IiwgImJhc2UiLCAic3ViUXVlcnkiLCAicmlnaHRTdGFydCIsICJtZXJnZUdhcHMiLCAicmViYWxhbmNlIiwgImFyb3VuZCIsICJyZWxldmFudFdpZGdldEhlaWdodCIsICJfTm9kZUJ1aWxkZXIiLCAiYnJlYWtzIiwgImdhcCIsICJoZWlnaHRSZWxldmFudERlY29DaGFuZ2VzIiwgIkRlY29yYXRpb25Db21wYXJhdG9yIiwgInZpc2libGVQaXhlbFJhbmdlIiwgInBhZGRpbmdUb3AiLCAicGFyZW50UmVjdCIsICJmdWxsUGl4ZWxSYW5nZSIsICJMaW5lR2FwIiwgInNpemUiLCAiZ0EiLCAiZ0IiLCAidmlld1N0YXRlIiwgIndyYXBwaW5nIiwgIkxpbmVHYXBXaWRnZXQiLCAidmVydGljYWwiLCAiVmlld1N0YXRlIiwgIklkU2NhbGVyIiwgImd1ZXNzV3JhcHBpbmciLCAidmlld3BvcnRzIiwgIlZpZXdwb3J0IiwgIkJpZ1NjYWxlciIsICJzY2FsZUJsb2NrIiwgInNjcm9sbFRhcmdldCIsICJjb250ZW50Q2hhbmdlcyIsICJoZWlnaHRDaGFuZ2VzIiwgInByZXZIZWlnaHQiLCAic2Nyb2xsQW5jaG9yIiwgInVwZGF0ZUxpbmVzIiwgInJlZnJlc2giLCAiZG9tUmVjdCIsICJtZWFzdXJlQ29udGVudCIsICJwYWRkaW5nQm90dG9tIiwgInNjcm9sbFRvcCIsICJwaXhlbFZpZXdwb3J0IiwgImRUb3AiLCAiZEJvdHRvbSIsICJpblZpZXciLCAidnAiLCAidmlld3BvcnRDaGFuZ2UiLCAibWFyZ2luVG9wIiwgIm1hcCIsICJ2aXNpYmxlVG9wIiwgInZpc2libGVCb3R0b20iLCAidmlld0hlaWdodCIsICJ0b3BQb3MiLCAibWFwcGVkIiwgImN1cnJlbnQiLCAibWF5TWVhc3VyZSIsICJoYWxmTWFyZ2luIiwgImRvdWJsZU1hcmdpbiIsICJhZGRHYXAiLCAic3RydWN0dXJlIiwgImF2b2lkIiwgImZpbmQiLCAibGluZVN0cnVjdHVyZSIsICJ2aWV3RnJvbSIsICJ2aWV3VG8iLCAibWFyZ2luSGVpZ2h0IiwgImJvdCIsICJ0YXJnZXRGcmFjIiwgImZpbmRGcmFjdGlvbiIsICJzcGFjZUZyYWMiLCAiZmluZFBvc2l0aW9uIiwgIm1hcmdpbldpZHRoIiwgImZyYWN0aW9uIiwgInN0YXRlRGVjbyIsICJ0b3RhbCIsICJyYXRpbyIsICJjb3VudGVkIiwgImFycmF5IiwgInZhbCIsICJuIiwgImhlaWdodE1hcCIsICJ2cEhlaWdodCIsICJkb21CYXNlIiwgIm9iaiIsICJzY2FsZXIiLCAiYlRvcCIsICJiQm90dG9tIiwgInRoZW1lIiwgInN0cnMiLCAiZGFya1RoZW1lIiwgImJhc2VUaGVtZUlEIiwgIlN0eWxlTW9kdWxlIiwgImJhc2VMaWdodElEIiwgImJhc2VEYXJrSUQiLCAibGlnaHREYXJrSURzIiwgImJ1aWxkVGhlbWUiLCAic2NvcGVzIiwgImJhc2VUaGVtZSQxIiwgIkxpbmVCcmVha1BsYWNlaG9sZGVyIiwgIkRPTVJlYWRlciIsICJwb2ludHMiLCAib2xkTGVuIiwgIm5leHRWaWV3IiwgImlzQmxvY2tFbGVtZW50IiwgInBvaW50IiwgInJlIiwgIm5leHRCcmVhayIsICJicmVha1NpemUiLCAiZnJvbVZpZXciLCAiaXNBdEVuZCIsICJET01Qb2ludCIsICJET01DaGFuZ2UiLCAidHlwZU92ZXIiLCAiaUhlYWQiLCAiaUFuY2hvciIsICJzZWxQb2ludHMiLCAic2VsZWN0aW9uUG9pbnRzIiwgInNlbGVjdGlvbkZyb21Qb2ludHMiLCAib2ZmRnJvbSIsICJvZmZUbyIsICJhcHBseURPTUNoYW5nZSIsICJkb21DaGFuZ2UiLCAiY2hhbmdlIiwgIm5ld1NlbCIsICJsYXN0S2V5IiwgInByZWZlcnJlZFBvcyIsICJwcmVmZXJyZWRTaWRlIiwgImZpbmREaWZmIiwgImRlZmF1bHRUciIsICJkZWZhdWx0SW5zZXJ0IiwgImFwcGx5RGVmYXVsdEluc2VydCIsICJ1c2VyRXZlbnQiLCAic3RhcnRTdGF0ZSIsICJtYWluU2VsIiwgInJlcGxhY2VkIiwgImNvbXBvc2l0aW9uUmFuZ2UiLCAicmFuZ2VDaGFuZ2VzIiwgInNlbE9mZiIsICJtaW5MZW4iLCAiYWRqdXN0IiwgIm1vdmUiLCAib2JzZXJ2ZU9wdGlvbnMiLCAidXNlQ2hhckRhdGEiLCAiRE9NT2JzZXJ2ZXIiLCAibXV0YXRpb25zIiwgIm11dCIsICJlbnRyaWVzIiwgImciLCAid2FzQ2hhbmdlZCIsICJzYWZhcmlTZWxlY3Rpb25SYW5nZUhhY2siLCAibG9jYWwiLCAia2V5Q29kZSIsICJmbHVzaCIsICJyZWNvcmRzIiwgInJlYWRTZWxlY3Rpb24iLCAiaGFuZGxlZCIsICJyZWMiLCAiY2hpbGRCZWZvcmUiLCAiZmluZENoaWxkIiwgImNoaWxkQWZ0ZXIiLCAiX2MiLCAiY3VyVmlldyIsICJjdXJBbmNob3IiLCAiRWRpdG9yVmlldyIsICJfRWRpdG9yVmlldyIsICJjb25maWciLCAiZGlzcGF0Y2giLCAidHJzIiwgIlRyYW5zYWN0aW9uIiwgInJlZHJhd24iLCAiYXR0cnNDaGFuZ2VkIiwgImZvY3VzRmxhZyIsICJkaXNwYXRjaEZvY3VzIiwgInBlbmRpbmdLZXkiLCAiQ2FjaGVkT3JkZXIiLCAibGlzdGVuZXIiLCAibmV3U3RhdGUiLCAiaGFkRm9jdXMiLCAicHJldlNwZWNzIiwgInNwZWNzIiwgIm5ld1BsdWdpbnMiLCAic0RPTSIsICJzY3JvbGxBbmNob3JQb3MiLCAic2Nyb2xsQW5jaG9ySGVpZ2h0IiwgIm1lYXN1cmluZyIsICJCYWRNZWFzdXJlIiwgImVkaXRvckF0dHJzIiwgImF0dHJzRnJvbUZhY2V0IiwgImNvbnRlbnRBdHRycyIsICJjaGFuZ2VkQ29udGVudCIsICJjaGFuZ2VkRWRpdG9yIiwgImRpdiIsICJub25jZSIsICJyZXF1ZXN0IiwgImtub3duIiwgImluaXRpYWwiLCAiTWF4QmlkaUxpbmUiLCAiZW50cnkiLCAic2Nyb2xsTGVmdCIsICJwcmVmaXgiLCAiUHJlYyIsICJfQ2FjaGVkT3JkZXIiLCAiZnJlc2giLCAiY2FjaGUiLCAibGFzdERpciIsICJzb3VyY2VzIiwgImN1cnJlbnRQbGF0Zm9ybSIsICJDYW5IaWRlUHJpbWFyeSIsICJicm93c2VyIiwgInRoZW1lU3BlYyIsICJDYW5IaWRlUHJpbWFyeSIsICJVbmljb2RlUmVnZXhwU3VwcG9ydCIsICJiYXNlVGhlbWUiLCAiRWRpdG9yVmlldyIsICJHdXR0ZXJNYXJrZXIiLCAiUmFuZ2VWYWx1ZSIsICJvdGhlciIsICJkb20iLCAiTWFwTW9kZSIsICJuZXh0VGFnSUQiLCAiVGFnIiwgIl9UYWciLCAic2V0IiwgImJhc2UiLCAibW9kaWZpZWQiLCAicGFyZW50IiwgInRhZyIsICJ0IiwgIm1vZCIsICJNb2RpZmllciIsICJhIiwgImIiLCAibmV4dE1vZGlmaWVySUQiLCAiX01vZGlmaWVyIiwgIm1vZHMiLCAiZXhpc3RzIiwgInNhbWVBcnJheSIsICJtIiwgImNvbmZpZ3MiLCAicG93ZXJTZXQiLCAiY29uZmlnIiwgIngiLCAiYXJyYXkiLCAic2V0cyIsICJpIiwgImoiLCAiZSIsICJzdHlsZVRhZ3MiLCAic3BlYyIsICJieU5hbWUiLCAicHJvcCIsICJ0YWdzIiwgInBhcnQiLCAicGllY2VzIiwgIm1vZGUiLCAicmVzdCIsICJwb3MiLCAibmV4dCIsICJsYXN0IiwgImlubmVyIiwgInJ1bGUiLCAiUnVsZSIsICJydWxlTm9kZVByb3AiLCAiTm9kZVByb3AiLCAiY29udGV4dCIsICJvdGhlciIsICJ0YWdIaWdobGlnaHRlciIsICJvcHRpb25zIiwgIm1hcCIsICJzdHlsZSIsICJzY29wZSIsICJhbGwiLCAiY2xzIiwgInN1YiIsICJ0YWdDbGFzcyIsICJ0IiwgIlRhZyIsICJjb21tZW50IiwgIm5hbWUiLCAidHlwZU5hbWUiLCAicHJvcGVydHlOYW1lIiwgImxpdGVyYWwiLCAic3RyaW5nIiwgIm51bWJlciIsICJjb250ZW50IiwgImhlYWRpbmciLCAia2V5d29yZCIsICJvcGVyYXRvciIsICJwdW5jdHVhdGlvbiIsICJicmFja2V0IiwgIm1ldGEiLCAidGFncyIsICJjbGFzc0hpZ2hsaWdodGVyIiwgInRhZ0hpZ2hsaWdodGVyIiwgIl9hIiwgImxhbmd1YWdlRGF0YVByb3AiLCAiTm9kZVByb3AiLCAiZGVmaW5lTGFuZ3VhZ2VGYWNldCIsICJiYXNlRGF0YSIsICJGYWNldCIsICJ2YWx1ZXMiLCAic3VibGFuZ3VhZ2VQcm9wIiwgIkxhbmd1YWdlIiwgImRhdGEiLCAicGFyc2VyIiwgImV4dHJhRXh0ZW5zaW9ucyIsICJuYW1lIiwgIkVkaXRvclN0YXRlIiwgInN5bnRheFRyZWUiLCAibGFuZ3VhZ2UiLCAic3RhdGUiLCAicG9zIiwgInNpZGUiLCAidG9wIiwgInRvcE5vZGVBdCIsICJiYXNlIiwgInN1YiIsICJpbm5lck5vZGUiLCAic3VibGFuZyIsICJsYW5nIiwgInJlc3VsdCIsICJleHBsb3JlIiwgInRyZWUiLCAiZnJvbSIsICJtb3VudCIsICJyIiwgInNpemUiLCAiaSIsICJjaCIsICJUcmVlIiwgIlN0YXRlRWZmZWN0IiwgInRvcExhbmciLCAibm9kZSIsICJJdGVyTW9kZSIsICJMUkxhbmd1YWdlIiwgIl9MUkxhbmd1YWdlIiwgInNwZWMiLCAidHlwZSIsICJvcHRpb25zIiwgImZpZWxkIiwgIkRvY0lucHV0IiwgImRvYyIsICJwb3MiLCAiZnJvbSIsICJ0byIsICJzdHJpbmdTdGFydCIsICJjdXJyZW50Q29udGV4dCIsICJQYXJzZUNvbnRleHQiLCAiX1BhcnNlQ29udGV4dCIsICJwYXJzZXIiLCAic3RhdGUiLCAiZnJhZ21lbnRzIiwgInRyZWUiLCAidHJlZUxlbiIsICJ2aWV3cG9ydCIsICJza2lwcGVkIiwgInNjaGVkdWxlT24iLCAiVHJlZSIsICJ1bnRpbCIsICJ1cHRvIiwgIl9hIiwgImVuZFRpbWUiLCAiZG9uZSIsICJUcmVlRnJhZ21lbnQiLCAiZiIsICJwcmV2IiwgInIiLCAiY3V0RnJhZ21lbnRzIiwgImNoYW5nZXMiLCAibmV3U3RhdGUiLCAicmFuZ2VzIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJ0b0IiLCAic3RhcnRMZW4iLCAiUGFyc2VyIiwgImlucHV0IiwgImN4IiwgIk5vZGVUeXBlIiwgImZyYWdzIiwgIkxhbmd1YWdlU3RhdGUiLCAiX0xhbmd1YWdlU3RhdGUiLCAiY29udGV4dCIsICJ0ciIsICJuZXdDeCIsICJ2cFRvIiwgInBhcnNlU3RhdGUiLCAibGFuZ3VhZ2UiLCAiTGFuZ3VhZ2UiLCAiU3RhdGVGaWVsZCIsICJ2YWx1ZSIsICJyZXF1ZXN0SWRsZSIsICJjYWxsYmFjayIsICJ0aW1lb3V0IiwgImlkbGUiLCAiaXNJbnB1dFBlbmRpbmciLCAicGFyc2VXb3JrZXIiLCAiVmlld1BsdWdpbiIsICJ2aWV3IiwgInVwZGF0ZSIsICJmaWVsZCIsICJkZWFkbGluZSIsICJub3ciLCAidmlld3BvcnRGaXJzdCIsICJlcnIiLCAibG9nRXhjZXB0aW9uIiwgIkZhY2V0IiwgImxhbmd1YWdlcyIsICJFZGl0b3JWaWV3IiwgImxhbmciLCAiSGlnaGxpZ2h0U3R5bGUiLCAiX0hpZ2hsaWdodFN0eWxlIiwgInNwZWNzIiwgIm9wdGlvbnMiLCAibW9kU3BlYyIsICJkZWYiLCAic3BlYyIsICJjbHMiLCAiU3R5bGVNb2R1bGUiLCAiYWxsIiwgInNjb3BlT3B0IiwgIkxhbmd1YWdlIiwgInR5cGUiLCAibGFuZ3VhZ2VEYXRhUHJvcCIsICJ0YWdIaWdobGlnaHRlciIsICJzdHlsZSIsICJkZWZhdWx0SGlnaGxpZ2h0U3R5bGUiLCAiSGlnaGxpZ2h0U3R5bGUiLCAidGFncyIsICJub1Rva2VucyIsICJ0eXBlQXJyYXkiLCAiTm9kZVR5cGUiLCAid2FybmVkIiwgImJ5VGFnIiwgImRlZmF1bHRUYWJsZSIsICJsZWdhY3lOYW1lIiwgIm5hbWUiLCAiY3JlYXRlVG9rZW5UeXBlIiwgIm5vVG9rZW5zIiwgIndhcm5Gb3JQYXJ0IiwgInBhcnQiLCAibXNnIiwgIndhcm5lZCIsICJjcmVhdGVUb2tlblR5cGUiLCAiZXh0cmEiLCAidGFnU3RyIiwgInRhZ3MkMSIsICJuYW1lIiwgImZvdW5kIiwgInZhbHVlIiwgInRhZ3MiLCAidGFnIiwgImtleSIsICJ0IiwgImtub3duIiwgImJ5VGFnIiwgInR5cGUiLCAiTm9kZVR5cGUiLCAidHlwZUFycmF5IiwgInN0eWxlVGFncyIsICJtYXJrcyIsICJEZWNvcmF0aW9uIiwgIkRpcmVjdGlvbiIsICJTdGFjayIsICJfU3RhY2siLCAicCIsICJzdGFjayIsICJzdGF0ZSIsICJyZWR1Y2VQb3MiLCAicG9zIiwgInNjb3JlIiwgImJ1ZmZlciIsICJidWZmZXJCYXNlIiwgImN1ckNvbnRleHQiLCAibG9va0FoZWFkIiwgInBhcmVudCIsICJfIiwgImkiLCAiY3giLCAiU3RhY2tDb250ZXh0IiwgInN0YXJ0IiwgImFjdGlvbiIsICJfYSIsICJkZXB0aCIsICJ0eXBlIiwgInBhcnNlciIsICJkUHJlYyIsICJiYXNlIiwgInNpemUiLCAiY291bnQiLCAiYmFzZVN0YXRlSUQiLCAidGVybSIsICJlbmQiLCAiaXNSZWR1Y2UiLCAiY3VyIiwgInRvcCIsICJpbmRleCIsICJuZXh0U3RhdGUiLCAibmV4dCIsICJuZXh0U3RhcnQiLCAibmV4dEVuZCIsICJ2YWx1ZSIsICJvZmYiLCAiaXNOb2RlIiwgInNpbSIsICJTaW11bGF0ZWRTdGFjayIsICJuZXh0U3RhdGVzIiwgImJlc3QiLCAicyIsICJ2IiwgInJlc3VsdCIsICJyZWR1Y2UiLCAidGFyZ2V0IiwgImJhY2t1cCIsICJzZWVuIiwgImV4cGxvcmUiLCAickRlcHRoIiwgImZvdW5kIiwgIm90aGVyIiwgImRpYWxlY3RJRCIsICJsYXN0IiwgImNvbnRleHQiLCAibmV3Q3giLCAidHJhY2tlciIsICJnb3RvIiwgIlN0YWNrQnVmZmVyQ3Vyc29yIiwgIl9TdGFja0J1ZmZlckN1cnNvciIsICJkZWNvZGVBcnJheSIsICJpbnB1dCIsICJUeXBlIiwgImFycmF5IiwgIm91dCIsICJzdG9wIiwgImRpZ2l0IiwgIkNhY2hlZFRva2VuIiwgIm51bGxUb2tlbiIsICJJbnB1dFN0cmVhbSIsICJyYW5nZXMiLCAib2Zmc2V0IiwgImFzc29jIiwgInJhbmdlIiwgImlkeCIsICJyZXNvbHZlZCIsICJ0b2tlbiIsICJlbmRPZmZzZXQiLCAiY2h1bmsiLCAiY2h1bmtQb3MiLCAibmV4dENodW5rIiwgIm4iLCAiZnJvbSIsICJ0byIsICJyIiwgIlRva2VuR3JvdXAiLCAiZGF0YSIsICJpZCIsICJyZWFkVG9rZW4iLCAiTG9jYWxUb2tlbkdyb3VwIiwgInByZWNUYWJsZSIsICJlbHNlVG9rZW4iLCAic2tpcHBlZCIsICJhdEVvZiIsICJuZXh0UG9zIiwgInJlYWRUb2tlbiIsICJkYXRhIiwgImlucHV0IiwgInN0YWNrIiwgImdyb3VwIiwgInByZWNUYWJsZSIsICJwcmVjT2Zmc2V0IiwgInN0YXRlIiwgImdyb3VwTWFzayIsICJkaWFsZWN0IiwgInNjYW4iLCAiYWNjRW5kIiwgImkiLCAidGVybSIsICJvdmVycmlkZXMiLCAibmV4dCIsICJsb3ciLCAiaGlnaCIsICJtaWQiLCAiaW5kZXgiLCAiZnJvbSIsICJ0byIsICJmaW5kT2Zmc2V0IiwgInN0YXJ0IiwgInRva2VuIiwgInByZXYiLCAidGFibGVEYXRhIiwgInRhYmxlT2Zmc2V0IiwgImlQcmV2IiwgInZlcmJvc2UiLCAic3RhY2tJRHMiLCAiY3V0QXQiLCAidHJlZSIsICJwb3MiLCAic2lkZSIsICJjdXJzb3IiLCAiSXRlck1vZGUiLCAiRnJhZ21lbnRDdXJzb3IiLCAiZnJhZ21lbnRzIiwgIm5vZGVTZXQiLCAiZnIiLCAibGFzdCIsICJ0b3AiLCAiVHJlZSIsICJlbmQiLCAibG9va0FoZWFkIiwgIk5vZGVQcm9wIiwgIlRva2VuQ2FjaGUiLCAicGFyc2VyIiwgInN0cmVhbSIsICJfIiwgIkNhY2hlZFRva2VuIiwgImFjdGlvbkluZGV4IiwgIm1haW4iLCAidG9rZW5pemVycyIsICJtYXNrIiwgImNvbnRleHQiLCAidG9rZW5pemVyIiwgInN0YXJ0SW5kZXgiLCAicCIsICJyZXN1bHQiLCAiYWN0aW9uIiwgInNldCIsICJwYWlyIiwgIlBhcnNlIiwgInJhbmdlcyIsICJJbnB1dFN0cmVhbSIsICJTdGFjayIsICJzdGFja3MiLCAibmV3U3RhY2tzIiwgInN0b3BwZWQiLCAic3RvcHBlZFRva2VucyIsICJzIiwgInRvayIsICJmaW5pc2hlZCIsICJmaW5kRmluaXNoZWQiLCAibWF4UmVtYWluaW5nIiwgImEiLCAiYiIsICJvdXRlciIsICJqIiwgIm90aGVyIiwgInNwbGl0IiwgImJhc2UiLCAic3RyaWN0Q3giLCAiY3hIYXNoIiwgImNhY2hlZCIsICJtYXRjaCIsICJpbm5lciIsICJkZWZhdWx0UmVkdWNlIiwgImFjdGlvbnMiLCAibG9jYWxTdGFjayIsICJwdXNoU3RhY2tEZWR1cCIsICJ0b2tlbnMiLCAicmVzdGFydGVkIiwgInRva2VuRW5kIiwgImZvcmNlIiwgImZvcmNlQmFzZSIsICJpbnNlcnQiLCAiU3RhY2tCdWZmZXJDdXJzb3IiLCAiaWQiLCAiRGlhbGVjdCIsICJzb3VyY2UiLCAiZmxhZ3MiLCAiZGlzYWJsZWQiLCAiTFJQYXJzZXIiLCAiX0xSUGFyc2VyIiwgIlBhcnNlciIsICJzcGVjIiwgIm5vZGVOYW1lcyIsICJpIiwgInRvcFRlcm1zIiwgInIiLCAibm9kZVByb3BzIiwgInNldFByb3AiLCAibm9kZUlEIiwgInByb3AiLCAidmFsdWUiLCAicHJvcFNwZWMiLCAiTm9kZVByb3AiLCAibmV4dCIsICJqIiwgIk5vZGVTZXQiLCAibmFtZSIsICJOb2RlVHlwZSIsICJ0b2tlbkFycmF5IiwgImRlY29kZUFycmF5IiwgImdldFNwZWNpYWxpemVyIiwgIlRva2VuR3JvdXAiLCAiaW5wdXQiLCAiZnJhZ21lbnRzIiwgInJhbmdlcyIsICJwYXJzZSIsICJQYXJzZSIsICJ3IiwgInN0YXRlIiwgInRlcm0iLCAibG9vc2UiLCAidGFibGUiLCAicG9zIiwgImdyb3VwVGFnIiwgImxhc3QiLCAidGFyZ2V0IiwgImVuZCIsICJ0ZXJtaW5hbCIsICJkYXRhIiwgInNldCIsICJwYWlyIiwgInNsb3QiLCAiZmxhZyIsICJhY3Rpb24iLCAiYSIsICJkZWZsdCIsICJyZXN1bHQiLCAidiIsICJjb25maWciLCAiY29weSIsICJpbmZvIiwgInQiLCAiZm91bmQiLCAicyIsICJwcmVjIiwgImRpYWxlY3QiLCAidmFsdWVzIiwgImZsYWdzIiwgInBhcnQiLCAiaWQiLCAiZGlzYWJsZWQiLCAiRGlhbGVjdCIsICJvZmYiLCAiZmluZEZpbmlzaGVkIiwgInN0YWNrcyIsICJiZXN0IiwgInN0YWNrIiwgInN0b3BwZWQiLCAibWFzayIsICJwYXJzZXIiLCAiTFJQYXJzZXIiLCAiTG9jYWxUb2tlbkdyb3VwIiwgImNyaXRpY21hcmt1cExhbmd1YWdlIiwgIkxSTGFuZ3VhZ2UiLCAicmFuZ2VQYXJzZXIiLCAiU3RhdGVGaWVsZCIsICJzdGF0ZSIsICJ0ZXh0IiwgInRyZWUiLCAiY3JpdGljbWFya3VwTGFuZ3VhZ2UiLCAicmFuZ2VzIiwgIkNyaXRpY01hcmt1cFJhbmdlcyIsICJjdXJzb3JHZW5lcmF0ZVJhbmdlcyIsICJUcmVlRnJhZ21lbnQiLCAidmFsdWUiLCAidHIiLCAiZWZmZWN0IiwgImZ1bGxSZWxvYWRFZmZlY3QiLCAiY2hhbmdlZF9yYW5nZXMiLCAiZnJvbSIsICJ0byIsICJmcm9tQiIsICJ0b0IiLCAiZnJhZ21lbnRzIiwgIkRvY0lucHV0IiwgImluc2VydGVkX3NldCIsICJvZmZzZXRzIiwgImRhbmdsaW5nX2NvbW1lbnRzIiwgImRlbGV0ZWRfcmFuZ2VzIiwgImNoYW5nZWRfcmFuZ2UiLCAicmFuZ2UiLCAia2V5IiwgInJlcGx5IiwgImRlbGV0ZWRfcmFuZ2UiLCAiY3VtdWxhdGl2ZV9vZmZzZXQiLCAibmlsX25vZGUiLCAidmlzaXROb2RlIiwgIm5vZGUiLCAiaW5zZXJ0ZWRfcmFuZ2VzIiwgImNvbW1lbnRfdGhyZWFkcyIsICJsYXN0X3JhbmdlIiwgImN1cnJlbnRfdGhyZWFkIiwgImEiLCAiYiIsICJ0aHJlYWQiLCAiaGVhZCIsICJhZGphY2VudF9yYW5nZSIsICJjb21tZW50IiwgImNvbnN0cnVjdFJhbmdlRnJvbVN5bnRheE5vZGUiLCAiX2EiLCAiX2IiLCAibWV0YWRhdGEiLCAiQ09NTUVOVEFUT1JfR0xPQkFMIiwgIm1pZGRsZSIsICJjaGlsZCIsICJjb25zdHJ1Y3RSYW5nZSIsICJzdGFydCIsICJwcmV2aW91c19yYW5nZSIsICJjdXJzb3IiLCAibmV3X3JhbmdlIiwgImdldFJhbmdlc0luVGV4dCIsICJ0ZXh0IiwgInRyZWUiLCAiY3JpdGljbWFya3VwTGFuZ3VhZ2UiLCAiY3Vyc29yR2VuZXJhdGVSYW5nZXMiLCAiY29uc3RydWN0UmFuZ2UiLCAiZnJvbSIsICJ0byIsICJ0eXBlIiwgIm1pZGRsZSIsICJtZXRhZGF0YSIsICJBZGRpdGlvblJhbmdlIiwgIkRlbGV0aW9uUmFuZ2UiLCAiU3Vic3RpdHV0aW9uUmFuZ2UiLCAiSGlnaGxpZ2h0UmFuZ2UiLCAiQ29tbWVudFJhbmdlIiwgIlJBTkdFX1BST1RPVFlQRV9NQVBQRVIiLCAiZ2VuZXJhdGVfbWV0YWRhdGEiLCAibWV0YWRhdGEiLCAiQ09NTUVOVEFUT1JfR0xPQkFMIiwgImRlZmF1bHRfbW92ZW1lbnRfb3B0aW9ucyIsICJicmFja2V0X21vdmVtZW50X29wdGlvbnMiLCAiY29uc3RydWN0X3JhbmdlIiwgImluc2VydGVkIiwgImRlbGV0ZWQiLCAidHlwZSIsICJtZXRhZGF0YV9maWVsZHMiLCAic3RhcnRfb2Zmc2V0IiwgImVuZF9vZmZzZXQiLCAiYnJhY2tldHMiLCAiQ01fQWxsX0JyYWNrZXRzIiwgIm1ldGFkYXRhIiwgIm91dHB1dCIsICJpbml0aWFsX29mZnNldCIsICJjcmVhdGVfcmFuZ2UiLCAidHlwZSIsICJpbnNlcnRlZCIsICJkZWxldGVkIiwgImNvbnN0cnVjdF9yYW5nZSIsICJnZW5lcmF0ZV9tZXRhZGF0YSIsICJpbXBvcnRfb2JzaWRpYW4iLCAic2FtZU1hcmtlcnMiLCAiYSIsICJiIiwgImkiLCAiYWR2YW5jZUN1cnNvciIsICJjdXJzb3IiLCAiY29sbGVjdCIsICJwb3MiLCAiYXNBcnJheSIsICJ2YWwiLCAiR3V0dGVyRWxlbWVudCIsICJ2aWV3IiwgImhlaWdodCIsICJhYm92ZSIsICJtYXJrZXJzIiwgIl9fcHVibGljRmllbGQiLCAic2FtZU1hcmtlcnMiLCAiY2xzIiwgImRvbVBvcyIsICJpTmV3IiwgImlPbGQiLCAic2tpcFRvIiwgIm1hcmtlciIsICJtYXRjaGVkIiwgImMiLCAiaSIsICJuZXh0IiwgImFmdGVyIiwgIlVwZGF0ZUNvbnRleHQiLCAiZ3V0dGVyIiwgInZpZXdwb3J0IiwgIlJhbmdlU2V0IiwgImJsb2NrIiwgIm5ld0VsdCIsICJsaW5lIiwgImV4dHJhTWFya2VycyIsICJsb2NhbE1hcmtlcnMiLCAiZm9yTGluZSIsICJsYXN0IiwgIlNpbmdsZUd1dHRlclZpZXciLCAiY29uZmlnIiwgInByb3AiLCAiZXZlbnQiLCAidGFyZ2V0IiwgInkiLCAicmVjdCIsICJ1cGRhdGUiLCAicHJldk1hcmtlcnMiLCAidXBkYXRlZCIsICJ2cCIsICJlbHQiLCAiR3V0dGVyVmlldyIsICJ1bmZpeEd1dHRlcnMiLCAiYWN0aXZlR3V0dGVycyIsICJjb25mIiwgInZwQSIsICJ2cEIiLCAidnBPdmVybGFwIiwgImRldGFjaCIsICJsaW5lQ2xhc3NlcyIsICJndXR0ZXJMaW5lQ2xhc3MiLCAiY2xhc3NTZXQiLCAiY29udGV4dHMiLCAiZmlyc3QiLCAiYiIsICJCbG9ja1R5cGUiLCAiY3giLCAicHJldiIsICJjdXIiLCAiY2hhbmdlIiwgImd1dHRlcnMiLCAia25vd24iLCAiZyIsICJjcmVhdGVHdXR0ZXJWaWV3UGx1Z2luIiwgIlZpZXdQbHVnaW4iLCAicGx1Z2luIiwgIkVkaXRvclZpZXciLCAidmFsdWUiLCAiRGlyZWN0aW9uIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiYXJvdW5kIiwgIm9iaiIsICJmYWN0b3JpZXMiLCAicmVtb3ZlcnMiLCAia2V5IiwgImFyb3VuZDEiLCAiciIsICJtZXRob2QiLCAiY3JlYXRlV3JhcHBlciIsICJpbmhlcml0ZWQiLCAiaGFkT3duIiwgIm9yaWdpbmFsIiwgImN1cnJlbnQiLCAid3JhcHBlciIsICJyZW1vdmUiLCAiYXJncyIsICJyZXNvbHZlRWRpdG9yUHJvdG90eXBlIiwgImFwcCIsICJ3aWRnZXRFZGl0b3JWaWV3IiwgIk1hcmtkb3duRWRpdG9yIiwgImRlZmF1bHRQcm9wZXJ0aWVzIiwgImVkaXRvciIsICJtb2QiLCAic2hpZnQiLCAiRW1iZWRkYWJsZU1hcmtkb3duRWRpdG9yIiwgImNvbnRhaW5lciIsICJvcHRpb25zIiwgIl9hIiwgIl9iIiwgIl9jIiwgIl9fcHVibGljRmllbGQiLCAiX19zcHJlYWRWYWx1ZXMiLCAiZSIsICJjdHgiLCAiYXJvdW5kIiwgIm9sZE1ldGhvZCIsICJsZWFmIiwgInBhcmFtcyIsICJFZGl0b3JTZWxlY3Rpb24iLCAidXBkYXRlIiwgImNoYW5nZWQiLCAiZXh0ZW5zaW9ucyIsICJwbGFjZWhvbGRlciIsICJFZGl0b3JWaWV3IiwgImV2ZW50IiwgIlByZWMiLCAia2V5bWFwIiwgImNtIiwgImV4dCIsICJoZWlnaHQiLCAiUExVR0lOX1ZFUlNJT04iLCAiREVGQVVMVF9TRVRUSU5HUyIsICJQTFVHSU5fVkVSU0lPTiIsICJpbXBvcnRfb2JzaWRpYW4iLCAic3RpY2t5Q29udGV4dE1lbnVQYXRjaCIsICJvblN1Ym1lbnUiLCAicGF0Y2giLCAiYXJvdW5kIiwgIm9sZE1ldGhvZCIsICJlIiwgInNlbGVjdGVkSXRlbSIsICJBbm5vdGF0aW9uTm9kZSIsICJyYW5nZSIsICJtYXJrZXIiLCAiX19wdWJsaWNGaWVsZCIsICJhdXRob3JMYWJlbCIsICJhdXRob3IiLCAic2VwYXJhdG9yIiwgInRpbWVMYWJlbCIsICJ0aW1lIiwgImFwcCIsICJFbWJlZGRhYmxlTWFya2Rvd25FZGl0b3IiLCAiZWRpdG9yIiwgInRleHRfc2xpY2VzIiwgImNoaWxkSWR4IiwgImNyZWF0ZV9yYW5nZSIsICJzdGlja3lDb250ZXh0TWVudVBhdGNoIiwgIm1lbnUiLCAiaXRlbSIsICJhY2NlcHRTdWdnZXN0aW9ucyIsICJyZWplY3RTdWdnZXN0aW9ucyIsICJhZGRDb21tZW50VG9WaWV3IiwgImFubm90YXRpb25HdXR0ZXJGb2xkQW5ub3RhdGlvbiIsICJzdWJtZW51IiwgImN1cnJlbnRfc2V0dGluZ3MiLCAiYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXNTdGF0ZSIsICJ0aXRsZSIsICJpY29uIiwgInZhbHVlIiwgImlzX2FjdGl2ZSIsICJhbm5vdGF0aW9uR3V0dGVySW5jbHVkZWRUeXBlcyIsICJBbm5vdGF0aW9uTWFya2VyIiwgIkd1dHRlck1hcmtlciIsICJhbm5vdGF0aW9uIiwgImFubm90YXRpb25zIiwgInZpZXciLCAiaXRyIiwgIm90aGVyIiwgImFubm90YXRpb25HdXR0ZXJGb2N1c1RocmVhZEFubm90YXRpb24iLCAiaW5kZXgiLCAic2Nyb2xsIiwgInRvcCIsICJkb20iLCAiY3JlYXRlTWFya2VycyIsICJzdGF0ZSIsICJjaGFuZ2VkX3JhbmdlcyIsICJ0eXBlcyIsICJpbmNsdWRlQWRkaXRpb25zIiwgImluY2x1ZGVEZWxldGlvbnMiLCAiaW5jbHVkZVN1YnN0aXR1dGlvbnMiLCAiaW5jbHVkZUhpZ2hsaWdodHMiLCAiaW5jbHVkZUNvbW1lbnRzIiwgImNtX3JhbmdlcyIsICJmdWxsX3RocmVhZCIsICJhbm5vdGF0aW9uR3V0dGVyTWFya2VycyIsICJTdGF0ZUZpZWxkIiwgInJhbmdlcyIsICJyYW5nZVBhcnNlciIsICJhY2MiLCAiYmFzZSIsICJSYW5nZVNldCIsICJvbGRTZXQiLCAidHIiLCAiaW5jbHVkZWRUeXBlcyIsICJhZGRlZF9yYW5nZXMiLCAiZGVsZXRlZF9yYW5nZXMiLCAiZnJvbSIsICJ0byIsICJrZWVwIiwgImltcG9ydF9vYnNpZGlhbiIsICJtYXJrdXBGb2N1c0VmZmVjdCIsICJTdGF0ZUVmZmVjdCIsICJtYXJrdXBGb2N1c1N0YXRlIiwgIlN0YXRlRmllbGQiLCAic3RhdGUiLCAidmFsdWUiLCAidHIiLCAiZm9jdXNSZW5kZXJlciIsICJEZWNvcmF0aW9uIiwgIm9sZFNldCIsICJfYSIsICJtYXJrdXBTdGFydEZvY3VzIiwgIm1hcmt1cEVuZEZvY3VzIiwgInJhbmdlcyIsICJyYW5nZVBhcnNlciIsICJSYW5nZVNldCIsICJmaWVsZCIsICJFZGl0b3JWaWV3IiwgImltcG9ydF9vYnNpZGlhbiIsICJoaWRlTWFya3VwRGVjb3JhdGlvbiIsICJEZWNvcmF0aW9uIiwgIkZPTERfQlVUVE9OX09GRlNFVCIsICJ1bmZpeEd1dHRlcnMiLCAiRmFjZXQiLCAidmFsdWVzIiwgIngiLCAiYWN0aXZlR3V0dGVycyIsICJhbm5vdGF0aW9uR3V0dGVyRm9jdXNBbm5vdGF0aW9uIiwgIkFubm90YXRpb24iLCAiYW5ub3RhdGlvbkd1dHRlckZvbGRBbm5vdGF0aW9uIiwgImFubm90YXRpb25HdXR0ZXJGb2N1c1RocmVhZEFubm90YXRpb24iLCAiYW5ub3RhdGlvbkd1dHRlcldpZHRoQW5ub3RhdGlvbiIsICJhbm5vdGF0aW9uR3V0dGVySGlkZUVtcHR5QW5ub3RhdGlvbiIsICJhbm5vdGF0aW9uR3V0dGVyRm9sZEJ1dHRvbkFubm90YXRpb24iLCAiYW5ub3RhdGlvbkd1dHRlclJlc2l6ZUhhbmRsZUFubm90YXRpb24iLCAiQW5ub3RhdGlvbkd1dHRlclZpZXciLCAiR3V0dGVyVmlldyIsICJ2aWV3IiwgIl9fcHVibGljRmllbGQiLCAiYW5ub3RhdGlvbkd1dHRlckNvbXBhcnRtZW50IiwgImNvbmYiLCAiQW5ub3RhdGlvblNpbmdsZUd1dHRlclZpZXciLCAiYWZ0ZXIiLCAiZ3V0dGVyIiwgIkFubm90YXRpb25VcGRhdGVDb250ZXh0IiwgInVwZGF0ZSIsICJ0cmFuc2FjdGlvbiIsICJ0aHJlYWRfZm9jdXMiLCAibWFya2VyIiwgImluZGV4IiwgInNjcm9sbCIsICJmb2N1c19tYXJrdXAiLCAiX2EiLCAibWFya3VwRm9jdXNFZmZlY3QiLCAiYW5ub3RhdGlvbiIsICJ0ciIsICJlIiwgImZyb20iLCAidG8iLCAib3V0ZXJfbG9vcCIsICJlbGVtZW50IiwgImFjdGl2ZUd1dHRlciIsICJtYXJrZXJJbmRleCIsICJkZXNpcmVkTG9jYXRpb24iLCAiY3VycmVudExvY2F0aW9uIiwgIm9mZnNldCIsICJhbm5vdGF0aW9uR3V0dGVyVmlldyIsICJjcmVhdGVHdXR0ZXJWaWV3UGx1Z2luIiwgIkFubm90YXRpb25VcGRhdGVDb250ZXh0IiwgIlVwZGF0ZUNvbnRleHQiLCAiZ3V0dGVyIiwgInZpZXdwb3J0IiwgImhlaWdodCIsICJfX3B1YmxpY0ZpZWxkIiwgInZpZXciLCAiYmxvY2siLCAibWFya2VycyIsICJfYSIsICJhYm92ZSIsICJibG9ja19zdGFydCIsICJhIiwgImIiLCAiZWxlbWVudF9pZHgiLCAiZSIsICJzYW1lTWFya2VycyIsICJlbGVtZW50IiwgImkiLCAiYWRkZWRfZWxlbWVudCIsICJBbm5vdGF0aW9uR3V0dGVyRWxlbWVudCIsICJBbm5vdGF0aW9uU2luZ2xlR3V0dGVyVmlldyIsICJTaW5nbGVHdXR0ZXJWaWV3IiwgImNvbmZpZyIsICJndXR0ZXJEb20iLCAiYW5ub3RhdGlvbkd1dHRlck1hcmtlcnMiLCAiaW5pdGlhbFBvc2l0aW9uIiwgInNldFdpZHRoIiwgIndpZHRoIiwgIkZPTERfQlVUVE9OX09GRlNFVCIsICJjdXJyZW50V2lkdGgiLCAib25Nb3VzZU1vdmUiLCAiZXZ0IiwgImRlbHRhWCIsICJvbk1vdXNlU3RvcCIsICJjb21tZW50IiwgInVwZGF0ZSIsICJyZXN1bHQiLCAid2lkZ2V0cyIsICJ0cmFuc2FjdGlvbiIsICJmb2xkX3N0YXR1cyIsICJhbm5vdGF0aW9uR3V0dGVyRm9sZEFubm90YXRpb24iLCAiYW5ub3RhdGlvbkd1dHRlcldpZHRoQW5ub3RhdGlvbiIsICJoaWRlX2VtcHR5IiwgImFubm90YXRpb25HdXR0ZXJIaWRlRW1wdHlBbm5vdGF0aW9uIiwgImZvbGRfYnV0dG9uIiwgImFubm90YXRpb25HdXR0ZXJGb2xkQnV0dG9uQW5ub3RhdGlvbiIsICJyZXNpemVfaGFuZGxlIiwgImFubm90YXRpb25HdXR0ZXJSZXNpemVIYW5kbGVBbm5vdGF0aW9uIiwgIl9iIiwgIkd1dHRlckVsZW1lbnQiLCAiYW5ub3RhdGlvbkd1dHRlckNvbXBhcnRtZW50IiwgIkNvbXBhcnRtZW50IiwgImFkZENvbW1lbnRUb1ZpZXciLCAiZWRpdG9yIiwgInJhbmdlIiwgInNjcm9sbCIsICJjdXJzb3IiLCAicmVwbHlfaWR4IiwgImNyZWF0ZV9yYW5nZSIsICJFZGl0b3JTZWxlY3Rpb24iLCAiYW5ub3RhdGlvbkd1dHRlckZvY3VzQW5ub3RhdGlvbiIsICJhY2NlcHRTdWdnZXN0aW9ucyIsICJzdGF0ZSIsICJmcm9tIiwgInRvIiwgInJlbW92ZV9hdHRhY2hlZF9jb21tZW50cyIsICJyYW5nZV9maWVsZCIsICJyYW5nZVBhcnNlciIsICJyYW5nZSIsICJyZWplY3RTdWdnZXN0aW9ucyIsICJpbXBvcnRfZGlmZl9tYXRjaF9wYXRjaCIsICJEaWZmTWF0Y2hQYXRjaCIsICJpbmRleFdvcmtlciIsICJmaWxlcyIsICJzZXR0aW5ncyIsICJDT01NRU5UQVRPUl9HTE9CQUwiLCAiZmlsZSIsICJnZXRSYW5nZXNJblRleHQiLCAiZXZlbnQiLCAiaW5kZXhXb3JrZXIiXQp9Cg==\n')}(0,si.extendPrototype)(bF.default);(0,ti.extendPrototype)(bF.default);var Rt=class extends mB.Events{_events=[];onunload(){}unload(){for(;this._events.length>0;)this._events.pop()()}register(I){this._events.push(I)}registerEvent(I){this.register(()=>I.e.offref(I))}},EA=class extends Rt{constructor(g,B,F,Q,A,U,l,s=2,G=d=>d,t=()=>this.plugin.settings,c=!0){super();this.plugin=g;this.name=B;this.title=F;this.version=Q;this.description=A;this.defaultValue=U;this.extractValue=l;this.workers=s;this.loadValue=G;this.getSettings=t;this.old_version=parseInt(this.plugin.app.loadLocalStorage(B+"-version"))||null,this.persist=bF.default.createInstance({name:this.name+`/${this.plugin.app.appId}`,driver:bF.default.INDEXEDDB,description:A,version:Q}),c&&this.startDatabase()}memory=new Map;persist;old_version=null;deleted_keys=new Set;databaseUpdate=(0,mB.debounce)(()=>{this.trigger("database-update",this.allEntries()),this.flushChanges()},100,!0);flushChanges=(0,mB.debounce)(async()=>{await this.persistMemory(),this.trigger("database-update",this.allEntries())},1e3,!0);on(g,B,F){return super.on(g,B,F)}async startDatabase(){this.plugin.app.workspace.onLayoutReady(async()=>{await this.persist.ready(async()=>{this.old_version===null?(await this.rebuildDatabase(),this.trigger("database-create")):this.old_version{if(g instanceof mB.TFile&&g.extension==="md"){let B=this.plugin.app.workspace.activeEditor,F=B&&B.file?.path===g.path&&B.editor?B.editor.cm.state:void 0;this.storeKey(g.path,await this.extractValue(g,F),g.stat.mtime)}})),this.registerEvent(this.plugin.app.vault.on("delete",async g=>{g instanceof mB.TFile&&g.extension==="md"&&this.deleteKey(g.path)})),this.registerEvent(this.plugin.app.vault.on("rename",async(g,B)=>{g instanceof mB.TFile&&g.extension==="md"&&this.renameKey(B,g.path,g.stat.mtime)})),this.registerEvent(this.plugin.app.vault.on("create",async g=>{g instanceof mB.TFile&&g.extension==="md"&&this.storeKey(g.path,this.defaultValue(),g.stat.mtime)}))})})}async loadDatabase(){this.memory=new Map(Object.entries(await this.persist.getItems()).map(([g,B])=>(B.data=this.loadValue(B.data),[g,B])))}async regularParseFiles(g){for(let B=0;Bawait this.plugin.app.vault.cachedRead(Q))),F=Math.ceil(g.length/this.workers);for(let Q=0;Q{for(let G=0;G{g.some(Q=>Q.path===F)||this.deleteKey(F)});let B=g.filter(F=>!this.memory.has(F.path)||this.memory.get(F.path).mtimeawait this.persist.removeItem(B))),this.deleted_keys.clear()}storeKey(g,B,F,Q=!0){this.memory.set(g,{data:B,mtime:F??Date.now(),dirty:Q}),this.databaseUpdate()}deleteKey(g){if(this.getItem(g)==null)throw new Error("Key does not exist");this.memory.delete(g),this.deleted_keys.add(g),this.databaseUpdate()}renameKey(g,B,F){let Q=this.getItem(g);if(Q==null)throw new Error("Key does not exist");this.storeKey(B,Q.data,F),this.deleteKey(g),this.databaseUpdate()}allKeys(){return Array.from(this.memory.keys())}getValue(g){return this.memory.get(g)?.data??null}allValues(){return Array.from(this.memory.values()).map(g=>g.data)}getItem(g){return this.memory.get(g)??null}allItems(){return Array.from(this.memory.values())}allEntries(){return Array.from(this.memory.entries())}async dropDatabase(){this.memory.clear(),await bF.default.dropInstance({name:this.name+`/${this.plugin.app.appId}`}),localStorage.removeItem(this.plugin.app.appId+"-"+this.name+"-version")}async reinitializeDatabase(){await this.dropDatabase(),this.persist=bF.default.createInstance({name:this.name+`/${this.plugin.app.appId}`,driver:bF.default.INDEXEDDB,version:this.version,description:this.description}),await this.rebuildDatabase(),this.trigger("database-update",this.allEntries())}async clearDatabase(){this.memory.clear(),await this.persist.clear()}isEmpty(){return this.memory.size===0}};var xi=require("obsidian");var DF=require("@codemirror/state");var ci=require("@codemirror/view"),gC=null,nt=ci.EditorView.domEventHandlers({keydown:(C,I)=>{gC=C},contextmenu:(C,I)=>{gC=C}});var Gi=require("@codemirror/state");function xl(C,I,g,B,F){if(I.includes("select.pointer")||gC&&F.key==="a"&&(gC.ctrlKey||gC.metaKey))return;let Q=I.includes("select.backward"),A=I.includes("select.group"),U=I.includes("select.extend");!g&&F&&(Q=F.key==="ArrowLeft",F.key==="ArrowLeft"?Q=!0:F.key==="ArrowRight"?Q=!1:Q=!tG(C.startState.selection,C.selection),U=F.shiftKey,A=F.ctrlKey||F.metaKey);let l=C.startState.field(JI).ranges,s=C.selection.ranges.map((G,t)=>EG(C.startState.selection.ranges[t],G,l,!Q,A,U,g,C.startState,B.suggestion_mode_operations.cursor_movement,B.suggestion_mode_operations.bracket_movement).selection);return{selection:Gi.EditorSelection.create(s),filter:!1}}function r0(C,I){return I.some(g=>g.startsWith(C))}var at=C=>DF.EditorState.transactionFilter.of(I=>p0(I,C));function p0(C,I){let g=PU(C),B=sg.app.workspace.activeEditor?.editor?.cm.cm!==void 0;if(!C.docChanged&&B&&bQ(C)&&g.push(C.startState.selection.ranges[0].fromc[0].to?t.to:c[0].touches_right_bracket(t.to,!1,!0)?c[0].to:void 0;if(Z!==void 0&&e!==void 0){A.push({from:Z,to:e,insert:""}),U.push(DF.EditorSelection.cursor(Z+G)),G-=e-Z;continue}}let d=WA(Q,C.startState.doc,t.from,t.to,t.inserted,"regular"),b=d.slice(0,-1).reduce((Z,e)=>Z-(e.to-e.from)+e.insert.length,0);d&&(A.push(d),U.push(DF.EditorSelection.cursor((l?d[0].start:d[d.length-1].end+b)+G)),G+=b-(d[d.length-1].to-d[d.length-1].from)+d[d.length-1].insert.length)}return C.startState.update(A.length?{changes:A,selection:DF.EditorSelection.create(U)}:{})}else if(r0("select",g)&&bQ(C)&&I.alternative_cursor_movement&&gC instanceof KeyboardEvent){let F=xl(C,g,B,I,gC);if(F)return C.startState.update(F)}return C}var NA=require("@codemirror/state");var H0={moveByCharacters:{group:!1}};function Y0(C,I){return I.some(g=>g.startsWith(C))}var mt=C=>NA.EditorState.transactionFilter.of(I=>J0(I,C));function J0(C,I){let g=PU(C),B=sg.app.workspace.activeEditor?.editor?.cm.cm!==void 0;if(!C.docChanged&&C.selection&&B&&(bQ(C)&&g.push(C.startState.selection.ranges[0].fromx-(a.to-a.from)+a.insert.length,0);Z&&(U.push(Z),l.push(NA.EditorSelection.cursor((G?Z[0].start:Z[Z.length-1].end+e)+c)),c+=e-(Z[Z.length-1].to-Z[Z.length-1].from)+Z[Z.length-1].insert.length)}return C.startState.update(U.length?{changes:U,selection:NA.EditorSelection.create(l)}:{})}else if(Y0("select",g)&&bQ(C)&&I.alternative_cursor_movement&&gC instanceof KeyboardEvent){let F=xl(C,g,B,I,gC);if(F)return C.startState.update(F)}return C}var pa=require("@codemirror/state");function ZF(C,I){return C===0?[]:C===1?[at(I)]:C===2?[mt(I)]:[]}var hB=require("obsidian");async function v0(C){let I;if(hB.Platform.isMobileApp){let g=await Capacitor.nativePromise("App","getInfo");g&&(I=g.version+" ("+g.build+")")}else I=navigator.userAgent.match(/obsidian\/([\d.]+\d+)/)?.[1]||"unknown";return{plugin_version:C.plugins.plugins.commentator.manifest.version,platform:hB.Platform.isMobileApp?hB.Platform.isAndroidApp?"Android":hB.Platform.isIosApp?"iOS":"mobile":hB.Platform.isMacOS?"macOS":"Desktop",framework_version:I,obsidian_version:hB.apiVersion}}async function k0(C,I,g={}){let B=I?`[BUG] ${I} \u2013 ADD A TITLE HERE`:"[BUG] ADD A TITLE HERE";try{let Q={...await v0(C),...g},A=Object.entries(Q).map(([U,l])=>`**${U}**: ${JSON.stringify(l)}`).join(` `);return"https://github.com/Fevol/obsidian-criticmarkup/issues/new?"+new URLSearchParams({title:B,body:`# User report **Description:** ADD A SHORT DESCRIPTION HERE @@ -57,17 +23,51 @@ ${s}in ${d}`).join("")} --- # Debugger data (do not alter) -${Q}`,labels:"bug"})}catch(F){return"https://github.com/Fevol/obsidian-criticmarkup/issues/new?"+new URLSearchParams({title:B,body:`# User report +${A}`,labels:"bug"})}catch(F){return"https://github.com/Fevol/obsidian-criticmarkup/issues/new?"+new URLSearchParams({title:B,body:`# User report **Description:** ADD A SHORT DESCRIPTION HERE --- # Debugger data (do not alter) -**Error while generating debugger data:** ${F}`,labels:"bug"})}}async function rd(C,I="",g={}){window.open(await XZ(C,I,g),"_blank")}var WZ=f('
',1);function cU(C,I){oI(I,!0);let g=H(I,"plugin",7),B=iI(wI(g().settings.default_preview_mode)),F={0:"All suggestions will be visible",1:"Preview document as if all suggestions were accepted",2:"Preview document as if all suggestions were rejected"};var A=WZ(),Q=JI(A);tI(Q,{name:"Default Edit Mode",type:"dropdown",notices:[{type:"info",text:"When opening a new note, this will be the default editing mode"}],control:V=>{let u=sI(()=>[{value:0 .toString(),text:"Regular Edit Mode"},{value:1 .toString(),text:"Corrected Edit Mode"},{value:2 .toString(),text:"Suggestion Mode"}]),n=sI(()=>g().settings.default_edit_mode.toString());iB(V,{get options(){return t(u)},get value(){return t(n)},onChange:R=>{let h=parseInt(R);g().settings.default_edit_mode=h,g().saveSettings()}})},$$slots:{control:!0}});var U=k(Q,2);let s=sI(()=>[{type:"info",text:"When opening a new note, this will be the default editing mode"},{type:"info",text:F[t(B)]}]);tI(U,{name:"Default Preview Mode",type:"dropdown",get notices(){return t(s)},control:V=>{let u=sI(()=>[{value:0 .toString(),text:"View all suggestions"},{value:1 .toString(),text:"Preview 'accept all'"},{value:2 .toString(),text:"Preview 'reject all'"}]),n=sI(()=>g().settings.default_preview_mode.toString());iB(V,{get options(){return t(u)},get value(){return t(n)},onChange:R=>{p(B,parseInt(R),!0),g().settings.default_preview_mode=t(B),g().saveSettings()}})},$$slots:{control:!0}});var l=k(U,2);tI(l,{name:"Include Metadata Extension",type:"dropdown",notices:[{type:"info",text:"Allow inclusion of metadata for suggestions, such as authorship, time, etc."},{type:"warning",text:"Suggestion metadata is not part of the official CriticMarkup standard, this metadata will not get processed/rendered correctly in other editors"},{type:"error",text:"Toggling this setting results in a re-indexation of the entire vault"}],control:V=>{vI(V,{get value(){return g().settings.enable_metadata},onChange:u=>{g().settings.enable_metadata=u,g().saveSettings()}})},$$slots:{control:!0}});var d=k(l,2);tI(d,{name:"Database",type:"heading"});var c=k(d,2);tI(c,{name:"Database Workers",description:"Number of workers to use for database indexing",notices:[{type:"info",text:"A higher amount of workers will increase indexing speed"}],type:"slider",control:V=>{$F(V,{min:1,max:navigator.hardwareConcurrency/2,step:1,get value(){return g().settings.database_workers},onChange:u=>{g().settings.database_workers=u,g().saveSettings()}})},$$slots:{control:!0}});var i=k(c,2);tI(i,{name:"Rebuild Database",notices:[{type:"info",text:"Recommended if you're encountering issues with the view after updating"},{type:"warning",text:"In large vaults, reindexing the database may take a while"}],control:V=>{RB(V,{text:"Rebuild",onClick:async()=>{await g().database.reinitializeDatabase()}})},$$slots:{control:!0}});var G=k(i,2),b=O(G);RB(b,{class:"translator-fail",text:"REPORT BUG",icon:"bug",onClick:()=>rd(g().app,void 0,{})}),z(G),w(C,A),yI()}var EZ=f(" ",1);function Il(C,I){oI(I,!0);let g=H(I,"plugin",7);var B=EZ(),F=JI(B);tI(F,{name:"Editor header",type:"heading"});var A=k(F,2);tI(A,{name:"Full button labels",description:"Adds labels to the buttons in the editor header",type:"toggle",control:G=>{vI(G,{get value(){return g().settings.toolbar_show_buttons_labels},onChange:()=>{g().settings.toolbar_show_buttons_labels=!g().settings.toolbar_show_buttons_labels,g().saveSettings()}})},$$slots:{control:!0}});var Q=k(A,2);tI(Q,{name:"Preview mode header button",description:"Adds a button to the editor's header for quickly changing preview mode",type:"toggle",control:G=>{vI(G,{get value(){return g().settings.toolbar_preview_button},onChange:()=>{g().settings.toolbar_preview_button=!g().settings.toolbar_preview_button,g().saveSettings()}})},$$slots:{control:!0}});var U=k(Q,2);tI(U,{name:"Suggestion mode header button",description:"Adds a button to the editor's header for quickly toggling suggestion mode",type:"toggle",control:G=>{vI(G,{get value(){return g().settings.toolbar_edit_button},onChange:()=>{g().settings.toolbar_edit_button=!g().settings.toolbar_edit_button,g().saveSettings()}})},$$slots:{control:!0}});var s=k(U,2);tI(s,{name:"Editor status bar",type:"heading"});var l=k(s,2);tI(l,{name:"Preview mode status bar toggle",description:"Adds a status bar item for quickly selecting suggestion mode",type:"toggle",control:G=>{vI(G,{get value(){return g().settings.status_bar_preview_button},onChange:()=>{g().settings.status_bar_preview_button=!g().settings.status_bar_preview_button,g().saveSettings()}})},$$slots:{control:!0}});var d=k(l,2);tI(d,{name:"Suggestion mode status bar toggle",description:"Adds a status bar item for quickly selecting suggestion mode",type:"toggle",control:G=>{vI(G,{get value(){return g().settings.status_bar_edit_button},onChange:()=>{g().settings.status_bar_edit_button=!g().settings.status_bar_edit_button,g().saveSettings()}})},$$slots:{control:!0}});var c=k(d,2);tI(c,{name:"Metadata status bar toggle",description:"Adds a status bar item for quickly toggling the inclusion of (particular) metadata",type:"toggle",control:G=>{vI(G,{get value(){return g().settings.status_bar_metadata_button},onChange:()=>{g().settings.status_bar_metadata_button=!g().settings.status_bar_metadata_button,g().saveSettings()}})},$$slots:{control:!0}}),w(C,B),yI()}var rZ=f(" ",1),NZ=f(" ",1);function gl(C,I){oI(I,!0);let g=H(I,"plugin",7);var B=NZ(),F=JI(B);tI(F,{name:"Add Metadata",type:"toggle",control:m=>{vI(m,{get value(){return g().settings.enable_metadata},onChange:a=>{g().settings.enable_metadata=a,g().saveSettings()}})},$$slots:{control:!0}});var A=k(F,2);tI(A,{name:"Enable Authorship",description:"Enable rendering and processing of author metadata",type:"toggle",control:m=>{vI(m,{get value(){return g().settings.enable_author_metadata},onChange:a=>{g().settings.enable_author_metadata=a,g().saveSettings()}})},$$slots:{control:!0}});var Q=k(A,2);{var U=h=>{var m=rZ(),a=JI(m);tI(a,{name:"Add Author Metadata",description:"Author metadata will be added into new suggestions and comments",type:"toggle",depth:1,control:E=>{vI(E,{get value(){return g().settings.add_author_metadata},onChange:Y=>{g().settings.add_author_metadata=Y,g().saveSettings()}})},$$slots:{control:!0}});var L=k(a,2);tI(L,{name:"Name",depth:1,control:E=>{qF(E,{type:"text",onChange:Y=>{g().settings.author=Y,g().saveSettings()},get value(){return g().settings.author},set value(Y){g().settings.author=Y}})},$$slots:{control:!0}}),w(h,m)};bI(Q,h=>{g().settings.enable_author_metadata&&h(U)})}var s=k(Q,2);tI(s,{name:"Enable Timestamp",description:"Enable rendering and processing of timestamp metadata",type:"toggle",control:m=>{vI(m,{get value(){return g().settings.enable_timestamp_metadata},onChange:a=>{g().settings.enable_timestamp_metadata=a,g().saveSettings()}})},$$slots:{control:!0}});var l=k(s,2);{var d=h=>{tI(h,{name:"Add Timestamp Metadata",description:"Timestamp metadata will be added into new suggestions and comments",depth:1,control:a=>{vI(a,{get value(){return g().settings.add_timestamp_metadata},onChange:L=>{g().settings.add_timestamp_metadata=L,g().saveSettings()}})},$$slots:{control:!0}})};bI(l,h=>{g().settings.enable_timestamp_metadata&&h(d)})}var c=k(l,2);tI(c,{name:"Enable Completed",description:"Enable rendering and processing of completed metadata",type:"toggle",control:m=>{vI(m,{get value(){return g().settings.enable_completed_metadata},onChange:a=>{g().settings.enable_completed_metadata=a,g().saveSettings()}})},$$slots:{control:!0}});var i=k(c,2);{var G=h=>{tI(h,{name:"Add Completed Metadata",description:"Completed metadata will be added into new suggestions and comments",depth:1,control:a=>{vI(a,{get value(){return g().settings.add_completed_metadata},onChange:L=>{g().settings.add_completed_metadata=L,g().saveSettings()}})},$$slots:{control:!0}})};bI(i,h=>{g().settings.enable_completed_metadata&&h(G)})}var b=k(i,2);tI(b,{name:"Enable Style",description:"Enable rendering and processing of style metadata",type:"toggle",control:m=>{vI(m,{get value(){return g().settings.enable_style_metadata},onChange:a=>{g().settings.enable_style_metadata=a,g().saveSettings()}})},$$slots:{control:!0}});var e=k(b,2);{var V=h=>{tI(h,{name:"Add Style Metadata",description:"Style metadata will be added into new suggestions and comments",depth:1,control:a=>{vI(a,{get value(){return g().settings.add_style_metadata},onChange:L=>{g().settings.add_style_metadata=L,g().saveSettings()}})},$$slots:{control:!0}})};bI(e,h=>{g().settings.enable_style_metadata&&h(V)})}var u=k(e,2);tI(u,{name:"Enable Color",description:"Enable rendering and processing of color metadata",type:"toggle",control:m=>{vI(m,{get value(){return g().settings.enable_color_metadata},onChange:a=>{g().settings.enable_color_metadata=a,g().saveSettings()}})},$$slots:{control:!0}});var n=k(u,2);{var R=h=>{tI(h,{name:"Add Color Metadata",description:"Color metadata will be added into new suggestions and comments",depth:1,control:a=>{vI(a,{get value(){return g().settings.add_color_metadata},onChange:L=>{g().settings.add_color_metadata=L,g().saveSettings()}})},$$slots:{control:!0}})};bI(n,h=>{g().settings.enable_color_metadata&&h(R)})}w(C,B),yI()}var pZ=f(" ",1);function Cl(C,I){oI(I,!0);let g=H(I,"plugin",7);var B=pZ(),F=JI(B);tI(F,{name:"Diff gutter",type:"heading"});var A=k(F,2);tI(A,{name:"Enable diff gutter",description:"Display a gutter in the editor for showing changes from suggestions",notices:[{type:"info",text:"Clicking on the gutter reveals a menu for accepting/rejecting all changes within the block"}],type:"toggle",control:n=>{vI(n,{slot:"control",get value(){return g().settings.diff_gutter},onChange:()=>{g().settings.diff_gutter=!g().settings.diff_gutter,g().saveSettings()}})},$$slots:{control:!0}});var Q=k(A,2);tI(Q,{name:"Hide when empty",description:"When enabled, the gutter will not take up any space when there are no changes in the current note",notices:[{type:"info",text:"When enabled, switching between different notes may cause content to shift"}],type:"toggle",depth:1,control:n=>{vI(n,{slot:"control",get value(){return g().settings.diff_gutter_hide_empty},onChange:()=>{g().settings.diff_gutter_hide_empty=!g().settings.diff_gutter_hide_empty,g().saveSettings()}})},$$slots:{control:!0}});var U=k(Q,2);tI(U,{name:"Annotation gutter",type:"heading"});var s=k(U,2);tI(s,{name:"Enable annotation gutter",description:"Display a gutter in the editor for annotations",type:"toggle",control:n=>{vI(n,{get value(){return g().settings.annotation_gutter},onChange:()=>{g().settings.annotation_gutter=!g().settings.annotation_gutter,g().saveSettings()}})},$$slots:{control:!0}});var l=k(s,2);tI(l,{name:"Included annotations",description:"Determine which annotations should be shown by default",notices:[{type:"info",text:"This setting only applies after reloading the app"}],type:"subheading",depth:1});var d=k(l,2);Ig(d,17,()=>Object.keys(pF).filter(u=>isNaN(Number(u))),sg,(u,n)=>{let R=sI(()=>t(n).toLowerCase().replace(/\b\w/g,h=>h.toUpperCase()));tI(u,{get name(){return t(R)},type:"toggle",depth:2,control:m=>{let a=sI(()=>(g().settings.annotation_gutter_included_types&pF[t(n)])!==0);vI(m,{get value(){return t(a)},onChange:()=>{g().settings.annotation_gutter_included_types^=pF[t(n)],g().saveSettings()}})},$$slots:{control:!0}})});var c=k(d,2);tI(c,{name:"Focus annotation on selection",description:"When selecting an annotation in the editor, the corresponding annotation in the gutter will be focused",type:"toggle",depth:1,control:n=>{vI(n,{get value(){return g().settings.annotation_gutter_focus_on_click},onChange:()=>{g().settings.annotation_gutter_focus_on_click=!g().settings.annotation_gutter_focus_on_click,g().saveSettings()}})},$$slots:{control:!0}});var i=k(c,2);tI(i,{name:"Width",description:"The width of the gutter in pixels",type:"slider",depth:1,control:n=>{$F(n,{min:100,max:500,step:50,get value(){return g().settings.annotation_gutter_width},onChange:R=>{g().settings.annotation_gutter_width=R,g().saveSettings()}})},$$slots:{control:!0}});var G=k(i,2);tI(G,{name:"Show resize handle",description:"Display a handle bar within the editor for quickly resizing the gutter",type:"toggle",depth:1,control:n=>{vI(n,{get value(){return g().settings.annotation_gutter_resize_handle},onChange:()=>{g().settings.annotation_gutter_resize_handle=!g().settings.annotation_gutter_resize_handle,g().saveSettings()}})},$$slots:{control:!0}});var b=k(G,2);tI(b,{name:"Default fold state",description:"Determine whether the gutter is shown by default",notices:[{type:"info",text:"This setting only applies after reloading the app"}],type:"toggle",depth:1,control:n=>{vI(n,{get value(){return g().settings.annotation_gutter_default_fold_state},onChange:()=>{g().settings.annotation_gutter_default_fold_state=!g().settings.annotation_gutter_default_fold_state,g().saveSettings()}})},$$slots:{control:!0}});var e=k(b,2);tI(e,{name:"Show fold button",description:"Display a button within the editor for (un)folding the gutter",type:"toggle",depth:1,control:n=>{vI(n,{get value(){return g().settings.annotation_gutter_fold_button},onChange:()=>{g().settings.annotation_gutter_fold_button=!g().settings.annotation_gutter_fold_button,g().saveSettings()}})},$$slots:{control:!0}});var V=k(e,2);tI(V,{name:"Hide when empty",description:"When enabled, the gutter will not take up any space when there are no annotations in the current note",notices:[{type:"info",text:"When enabled, switching between different notes may cause content to shift"}],type:"toggle",depth:1,control:n=>{vI(n,{get value(){return g().settings.annotation_gutter_hide_empty},onChange:()=>{g().settings.annotation_gutter_hide_empty=!g().settings.annotation_gutter_hide_empty,g().saveSettings()}})},$$slots:{control:!0}}),w(C,B),yI()}var HZ=C=>C;function YZ(C){let I=C-1;return I*I*I+1}function uF(C,{delay:I=0,duration:g=400,easing:B=HZ}={}){let F=+getComputedStyle(C).opacity;return{delay:I,duration:g,easing:B,css:A=>`opacity: ${A*F}`}}var yc=!1;function Sc(C,{delay:I=0,duration:g=400,easing:B=YZ,axis:F="y"}={}){let A=getComputedStyle(C);BI&&!yc&&/(contents|inline|table)/.test(A.display)&&(yc=!0,Promise.resolve().then(()=>yc=!1),A.display,void 0);let Q=+A.opacity,U=F==="y"?"height":"width",s=parseFloat(A[U]),l=F==="y"?["top","bottom"]:["left","right"],d=l.map(u=>`${u[0].toUpperCase()}${u.slice(1)}`),c=parseFloat(A[`padding${d[0]}`]),i=parseFloat(A[`padding${d[1]}`]),G=parseFloat(A[`margin${d[0]}`]),b=parseFloat(A[`margin${d[1]}`]),e=parseFloat(A[`border${d[0]}Width`]),V=parseFloat(A[`border${d[1]}Width`]);return{delay:I,duration:g,easing:B,css:u=>`overflow: hidden;opacity: ${Math.min(u*20,1)*Q};${U}: ${u*s}px;padding-${l[0]}: ${u*c}px;padding-${l[1]}: ${u*i}px;margin-${l[0]}: ${u*G}px;margin-${l[1]}: ${u*b}px;border-${l[0]}-width: ${u*e}px;border-${l[1]}-width: ${u*V}px;min-${U}: 0`}}var JZ=(C,I,g,B)=>{if(C.key==="Tab"){if(C.metaKey||C.ctrlKey)return!0;C.shiftKey?I(((t(g)-1)%B.length+B.length)%B.length):I((t(g)+1)%B.length),C.preventDefault()}},vZ=f('
'),kZ=f("
"),DZ=f('
');function iU(C,I){oI(I,!0);let g=H(I,"plugin",7),B=[{id:"general",name:"General",icon:"settings"},{id:"editor",name:"Editor",icon:"pencil"},{id:"interface",name:"Interface",icon:"layout"},{id:"gutter",name:"Gutters",icon:"sticky-note"},{id:"metadata",name:"Metadata",icon:"tags"},{id:"advanced",name:"Advanced",icon:"shield-alert"}],F=iI(wI(B.findIndex(c=>c.id===g().settings_tab))),A=sI(()=>B[t(F)].id),Q=sI(()=>{switch(t(A)){case"general":return cU;case"editor":return $s;case"gutter":return Cl;case"advanced":return qs;case"interface":return Il;case"metadata":return gl;default:return cU}});async function U(c){p(F,c,!0),p(A,B[c].id,!0),g().settings_tab=t(A)}var s=DZ(),l=O(s);l.__keydown=[JZ,U,F,B],Ig(l,21,()=>B,sg,(c,i,G)=>{let b=()=>t(i).id,e=()=>t(i).name,V=()=>t(i).icon;var u=vZ();let n;u.__click=()=>{U(G)};var R=O(u),h=O(R);uC(h,{get icon(){return V()}}),z(R);var m=k(R,2);let a;var L=O(m,!0);z(m),z(u),lI((y,E)=>{n=WI(u,1,"cmtr-settings-navigation-item",null,n,y),zI(u,"aria-label",`${e()} settings`),a=WI(m,1,"cmtr-settings-navigation-item-text",null,a,E),PI(L,e())},[()=>({"cmtr-settings-navigation-selected-item":t(F)===G}),()=>({"cmtr-settings-navigation-selected-item-text":t(F)!==G})]),w(c,u)}),z(l);var d=k(l,2);OA(d,()=>t(A),c=>{var i=kZ(),G=O(i);dc(G,()=>t(Q),(b,e)=>{e(b,{get plugin(){return g()}})}),z(i),CC(1,i,()=>Sc,()=>({duration:400,delay:400})),CC(2,i,()=>Sc,()=>({duration:400})),w(c,i)}),z(s),w(C,s),yI()}qI(["keydown","click"]);var WC=require("obsidian");var xF=XU(Bl(),1),vd=XU(Hd(),1),kd=XU(Jd(),1),D9=require("@codemirror/state"),mB=require("obsidian");function Wc(C){let I=new Blob([C],{type:"text/javascript"}),g=URL.createObjectURL(I),B=new Worker(g,{});return URL.revokeObjectURL(g),B}function Ec(){return Wc('"use strict";var qd=Object.defineProperty;var jd=(n,t,e)=>t in n?qd(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var Le=(n,t,e)=>jd(n,typeof t!="symbol"?t+"":t,e);var Ut={addition:["{++","++}"],deletion:["{--","--}"],substitution:["{~~","~>","~~}"],highlight:["{==","==}"],comment:["{>>","<<}"]};var Dn={a:"author",t:"time",d:"done",s:"style",c:"color"},Kt=class{constructor(t,e,i,s,r,o){this.from=t;this.to=e;this.type=i;this.repr=s;this.text=r;this.metadata=o;Le(this,"fields",{});Le(this,"replies",[]);if(o!==void 0){let l=o-t,a=r.slice(3,l);this.text=r.slice(0,3)+r.slice(l+2);try{this.fields=JSON.parse(a);for(let h in this.fields)h in Dn&&(this.fields[Dn[h]]=this.fields[h],delete this.fields[h])}catch(h){this.fields={}}}}get base_range(){return this}get full_thread(){return[this,...this.replies]}get thread(){return[...this.replies]}get length(){return this.to-this.from-6}get full_text(){return this.text+this.replies.map(t=>t.text).join("")}get range_start(){return this.metadata?this.metadata+2:this.from+3}get range_front(){return this.metadata?this.metadata-1:this.from}get full_range_front(){return this.base_range.from}get full_range_back(){return this.base_range.replies.length?this.base_range.replies[this.base_range.replies.length-1].to:this.to}range_type(t,e){return this.type}remove_metadata(){return this.metadata?[{from:this.from+3,to:this.metadata+2,insert:""}]:[]}delete_metadata(t){return t in Dn&&(t=Dn[t]),t in this.fields&&(delete this.fields[t],Object.keys(this.fields).length===0?this.remove_metadata():this.set_metadata(this.fields)),[]}add_metadata(t,e){return this.fields[t]=e,this.set_metadata(this.fields)}set_metadata(t){return this.fields=t,this.metadata!==void 0?[{from:this.from+3,to:this.metadata,insert:JSON.stringify(t)}]:[{from:this.from+3,to:this.from+3,insert:JSON.stringify(t)+"@@"}]}has_comment(t){return this.thread.includes(t)}copy(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}equals(t){return this.type===t.type&&this.from===t.from&&this.to===t.to&&this.replies.length===t.replies.length&&this.full_text===t.full_text}left_adjacent(t){return this.from===t.to}right_adjacent(t){return this.to===t.from}part_is_empty(t){return!1}empty(){return this.to-this.from===6}unwrap(){return this.text.slice(3,-3)}unwrap_bracket(t=!1){return t?this.text.slice(3):this.text.slice(0,-3)}unwrap_parts(){return[this.unwrap()]}unwrap_slice(t,e){return t-=this.range_front,e-=this.range_front,e<=0||t===e?"":this.text.slice(Math.max(3,t),Math.min(this.text.length-3,e))}partially_in_range(t,e){return!(t>this.to||ee:this.from<=t&&this.to>=e}part_encloses_range(t,e,i){return this.encloses_range(t,e)}accept(){return this.text}reject(){return this.text}touches(t){return this.from===t||this.to===t}cursor_inside(t){return this.from<=t&&t<=this.to}cursor_before_range(t){return tthis.to}cursor_move_inside(t,e=!1){return Math.min(Math.max(e&&this.metadata?this.metadata+2:this.from+3,t),this.to-3)}cursor_pass_syntax(t,e,i=!1){return e?(this.touches_left_bracket(t,!0,!1,i)&&(t=i&&this.metadata?this.metadata+2:this.from+3),this.touches_right_bracket(t,!1,!0)&&(t=this.to)):(this.touches_right_bracket(t,!0,!1)&&(t=this.to-3),this.touches_left_bracket(t,!1,!0,i)&&(t=this.from)),t}cursor_move_through(t,e,i){return i=="unchanged"||!this.cursor_inside(t)||(i=="ignore_completely"?t=e?this.to:this.from:t=this.cursor_pass_syntax(t,e,i=="ignore_metadata")),t}touches_left_bracket(t,e=!1,i=!1,s=!1){return t+(e?0:1)>=this.from&&t+(i?0:1)<=(s&&this.metadata?this.metadata+2:this.from+3)}touches_separator(t,e=!1,i=!1){return!1}touches_right_bracket(t,e=!1,i=!1){return t-(i?0:1)>=this.to-3&&t-(e?0:1)<=this.to}touches_bracket(t,e,i=!1,s=!1){return e?this.touches_left_bracket(t,i,s):this.touches_right_bracket(t,i,s)}postprocess(t=!0,e=0,i="div",s=null,r){let o=r!=null?r:this.text;return!r&&t&&(this.to>=o.length&&!o.endsWith(Ut[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap()),`<${i} class=\'cmtr-${this.repr.toLowerCase()}\'>${o}`}apply_offset(t){this.from+=t,this.to+=t,this.metadata!==void 0&&(this.metadata+=t)}split_range(t){return[this.text.slice(-3),this.text.slice(0,3)+(this.metadata?JSON.stringify(this.fields)+"@@":"")]}};var gi=class extends Kt{constructor(t,e,i,s){super(t,e,"addition","Addition",i,s)}accept(){return this.unwrap()}reject(){return""}postprocess(t=!0,e=0,i="div",s=null,r){let o=r!=null?r:this.text;!r&&t&&(this.to>=o.length&&!o.endsWith(Ut[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap());let l="cmtr-preview";return e===0?l+=" cmtr-addition":e===2&&(o=""),`<${i} class=\'${l}\'>${o}`}};var Hi=class extends Kt{constructor(e,i,s,r){super(e,i,"comment","Comment",s,r);Le(this,"reply_depth",0);Le(this,"attached_comment",null)}get base_range(){return this.attached_comment||this}get thread(){return this.attached_comment?[...this.attached_comment.thread]:[this,...this.replies]}clear_references(){this.attached_comment=null,this.reply_depth=0}add_reply(e){this.attach_to_range(e.type==="comment"?e.base_range:e)}attach_to_range(e){e.replies.push(this),this.reply_depth=e.replies.length-(e.type==="comment"?0:1),this.attached_comment=e}};var Fi=class extends Kt{constructor(t,e,i,s){super(t,e,"deletion","Deletion",i,s)}accept(){return""}reject(){return this.unwrap()}postprocess(t=!0,e=0,i="div",s=null,r){let o=r!=null?r:this.text;!r&&t&&(this.to>=o.length&&!o.endsWith(Ut[this.type].at(-1))?o=this.unwrap_bracket(!0):o=this.unwrap());let l="cmtr-preview";return e===0?l+=" cmtr-deletion":e===1&&(o=""),`<${i} class=\'${l}\'>${o}`}};var Vi=class extends Kt{constructor(t,e,i,s){super(t,e,"highlight","Highlight",i,s)}};var zi=class extends Kt{constructor(e,i,s,r,o){super(e,s,"substitution","Substitution",r,o);this.middle=i}get length(){return this.to-this.from-8}get char_middle(){return this.middle-this.range_front}range_type(e,i){return i<=this.middle+2?"deletion":e>=this.middle?"addition":"substitution"}unwrap(){return this.text.slice(3,this.char_middle)+this.text.slice(this.char_middle+2,-3)}unwrap_parts(){return[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice_parts_inverted(e,i){return e-=this.range_front,i-=this.range_front,e=Math.max(0,e),i<=0?this.unwrap_parts():i<=this.char_middle?[this.text.slice(3,e)+this.text.slice(i,this.char_middle),this.text.slice(this.char_middle+2,-3)]:e>=this.char_middle+2?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2,e)+this.text.slice(i,-3)]:[this.text.slice(3,e),this.text.slice(i,-3)]}unwrap_parts_bracket(e,i=0){return e?[this.text.slice(3,this.char_middle),this.text.slice(this.char_middle+2)]:[this.text.slice(0,this.char_middle),this.text.slice(this.char_middle+2,-3)]}unwrap_slice(e,i){return e-=this.range_front,i-=this.range_front,i<=0||e===i?"":e>=this.char_middle?this.text.slice(Math.max(this.char_middle+2,e),Math.min(this.text.length-3,i)):i<=this.char_middle?this.text.slice(Math.max(3,e),Math.min(this.char_middle,i)):this.text.slice(Math.max(3,e),this.char_middle)+this.text.slice(this.char_middle+2,Math.min(this.text.length-3,i))}accept(){return this.unwrap_parts()[1]}reject(){return this.unwrap_parts()[0]}touches_separator(e,i=!1,s=!1){return e+(i?1:0)>=this.middle&&e-(s?0:1)<=this.middle+2}contains_separator(e,i){return e<=this.middle+2&&i>=this.middle}contains_part(e,i,s=!0){return s?ithis.middle+2?!1:void 0:i<=this.middle?!0:e>=this.middle+2?!1:void 0}cursor_pass_syntax(e,i,s=!1){return i?(this.touches_left_bracket(e,!0,!1,s)&&(e=s&&this.metadata?this.metadata+2:this.from+3),this.touches_separator(e,!1,!0)&&(e=this.middle+2),this.touches_right_bracket(e,!1,!0)&&(e=this.to)):(this.touches_right_bracket(e,!0,!1)&&(e=this.to-3),this.touches_separator(e,!1,!0)&&(e=this.middle),this.touches_left_bracket(e,!1,!0,s)&&(e=this.from)),e}part_encloses_range(e,i,s){return s?this.from<=e&&i<=this.middle+2:this.middle<=e&&i<=this.to}empty(){return this.from+3===this.middle&&this.middle+2===this.to-3}part_is_empty(e){return e?this.from+3===this.middle:this.middle+2===this.to-3}postprocess(e=!0,i=0,s="div",r=null,o){let l=o!=null?o:this.text,a=[l];!o&&e&&(this.to>=l.length&&!l.endsWith(Ut.substitution[2])?a=this.unwrap_parts_bracket(!0):this.from<=0&&!l.startsWith(Ut.substitution[0])?a=this.unwrap_parts_bracket(!1):a=this.unwrap_parts());let h="cmtr-preview";return a.length===1&&(a[+r]=a[0],a[+!r]=""),l="",i===0?(a[0].length&&(l+=`<${s} class=\'${h} cmtr-deletion\'>${a[0]}`),a[1].length&&(l+=`<${s} class=\'${h} cmtr-addition\'>${a[1]}`)):i===1?a[1].length&&(l+=`<${s} class=\'${h}\'>${a[1]}`):a[0].length&&(l+=`<${s} class=\'${h}\'>${a[0]}`),l}apply_offset(e){this.from+=e,this.middle+=e,this.to+=e,this.metadata!==void 0&&(this.metadata+=e)}split_range(e){let i=super.split_range(e);return e<=this.middle?i[0]=Ut.substitution[1]+i[0]:i[1]=i[1]+Ut.substitution[1],i}cursor_move_inside(e,i=!1){return e=super.cursor_move_inside(e,i),e==this.middle+1&&(e=this.middle+2),e}};var xo=[],Mh=[];(()=>{let n="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(t=>t?parseInt(t,36):1);for(let t=0,e=0;t>1;if(n=Mh[i])t=i+1;else return!0;if(t==e)return!1}}function Sh(n){return n>=127462&&n<=127487}var Ch=8205;function Oh(n,t,e=!0,i=!0){return(e?Th:Ud)(n,t,i)}function Th(n,t,e){if(t==n.length)return t;t&&Dh(n.charCodeAt(t))&&Ph(n.charCodeAt(t-1))&&t--;let i=wo(n,t);for(t+=Ah(i);t=0&&Sh(wo(n,o));)r++,o-=2;if(r%2==0)break;t+=2}else break}return t}function Ud(n,t,e){for(;t>0;){let i=Th(n,t-2,e);if(i=56320&&n<57344}function Ph(n){return n>=55296&&n<56320}function Ah(n){return n<65536?1:2}var q=class n{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,i){[t,e]=$i(this,t,e);let s=[];return this.decompose(0,t,s,2),i.length&&i.decompose(0,i.length,s,3),this.decompose(e,this.length,s,1),qi.from(s,this.length-(e-t)+i.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=$i(this,t,e);let i=[];return this.decompose(t,e,i,0),qi.from(i,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),s=new yi(this),r=new yi(t);for(let o=e,l=e;;){if(s.next(o),r.next(o),o=0,s.lineBreak!=r.lineBreak||s.done!=r.done||s.value!=r.value)return!1;if(l+=s.value.length,s.done||l>=i)return!0}}iter(t=1){return new yi(this,t)}iterRange(t,e=this.length){return new Nn(this,t,e)}iterLines(t,e){let i;if(t==null)i=this.iter();else{e==null&&(e=this.lines+1);let s=this.line(t).from;i=this.iterRange(s,Math.max(s,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new In(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(t){if(t.length==0)throw new RangeError("A document must have at least one line");return t.length==1&&!t[0]?n.empty:t.length<=32?new Ht(t):qi.from(Ht.split(t,[]))}},Ht=class n extends q{constructor(t,e=Kd(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,s){for(let r=0;;r++){let o=this.text[r],l=s+o.length;if((e?i:l)>=t)return new vo(s,l,i,o);s=l+1,i++}}decompose(t,e,i,s){let r=t<=0&&e>=this.length?this:new n(Eh(this.text,t,e),Math.min(e,this.length)-Math.max(0,t));if(s&1){let o=i.pop(),l=Bn(r.text,o.text.slice(),0,r.length);if(l.length<=32)i.push(new n(l,o.length+r.length));else{let a=l.length>>1;i.push(new n(l.slice(0,a)),new n(l.slice(a)))}}else i.push(r)}replace(t,e,i){if(!(i instanceof n))return super.replace(t,e,i);[t,e]=$i(this,t,e);let s=Bn(this.text,Bn(i.text,Eh(this.text,0,t)),e),r=this.length+i.length-(e-t);return s.length<=32?new n(s,r):qi.from(n.split(s,[]),r)}sliceString(t,e=this.length,i=`\n`){[t,e]=$i(this,t,e);let s="";for(let r=0,o=0;r<=e&&ot&&o&&(s+=i),tr&&(s+=l.slice(Math.max(0,t-r),e-r)),r=a+1}return s}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,e){let i=[],s=-1;for(let r of t)i.push(r),s+=r.length+1,i.length==32&&(e.push(new n(i,s)),i=[],s=-1);return s>-1&&e.push(new n(i,s)),e}},qi=class n extends q{constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let i of t)this.lines+=i.lines}lineInner(t,e,i,s){for(let r=0;;r++){let o=this.children[r],l=s+o.length,a=i+o.lines-1;if((e?a:l)>=t)return o.lineInner(t,e,i,s);s=l+1,i=a+1}}decompose(t,e,i,s){for(let r=0,o=0;o<=e&&r=o){let h=s&((o<=t?1:0)|(a>=e?2:0));o>=t&&a<=e&&!h?i.push(l):l.decompose(t-o,e-o,i,h)}o=a+1}}replace(t,e,i){if([t,e]=$i(this,t,e),i.lines=r&&e<=l){let a=o.replace(t-r,e-r,i),h=this.lines-o.lines+a.lines;if(a.lines>4&&a.lines>h>>6){let f=this.children.slice();return f[s]=a,new n(f,this.length-(e-t)+i.length)}return super.replace(r,l,a)}r=l+1}return super.replace(t,e,i)}sliceString(t,e=this.length,i=`\n`){[t,e]=$i(this,t,e);let s="";for(let r=0,o=0;rt&&r&&(s+=i),to&&(s+=l.sliceString(t-o,e-o,i)),o=a+1}return s}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof n))return 0;let i=0,[s,r,o,l]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;s+=e,r+=e){if(s==o||r==l)return i;let a=this.children[s],h=t.children[r];if(a!=h)return i+a.scanIdentical(h,e);i+=a.length+1}}static from(t,e=t.reduce((i,s)=>i+s.length+1,-1)){let i=0;for(let d of t)i+=d.lines;if(i<32){let d=[];for(let p of t)p.flatten(d);return new Ht(d,e)}let s=Math.max(32,i>>5),r=s<<1,o=s>>1,l=[],a=0,h=-1,f=[];function c(d){let p;if(d.lines>r&&d instanceof n)for(let g of d.children)c(g);else d.lines>o&&(a>o||!a)?(u(),l.push(d)):d instanceof Ht&&a&&(p=f[f.length-1])instanceof Ht&&d.lines+p.lines<=32?(a+=d.lines,h+=d.length+1,f[f.length-1]=new Ht(p.text.concat(d.text),p.length+1+d.length)):(a+d.lines>s&&u(),a+=d.lines,h+=d.length+1,f.push(d))}function u(){a!=0&&(l.push(f.length==1?f[0]:n.from(f,h)),h=-1,a=f.length=0)}for(let d of t)c(d);return u(),l.length==1?l[0]:new n(l,e)}};q.empty=new Ht([""],0);function Kd(n){let t=-1;for(let e of n)t+=e.length+1;return t}function Bn(n,t,e=0,i=1e9){for(let s=0,r=0,o=!0;r=e&&(a>i&&(l=l.slice(0,i-s)),s0?1:(t instanceof Ht?t.text.length:t.children.length)<<1]}nextInner(t,e){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,s=this.nodes[i],r=this.offsets[i],o=r>>1,l=s instanceof Ht?s.text.length:s.children.length;if(o==(e>0?l:0)){if(i==0)return this.done=!0,this.value="",this;e>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((r&1)==(e>0?0:1)){if(this.offsets[i]+=e,t==0)return this.lineBreak=!0,this.value=`\n`,this;t--}else if(s instanceof Ht){let a=s.text[o+(e<0?-1:0)];if(this.offsets[i]+=e,a.length>Math.max(0,t))return this.value=t==0?a:e>0?a.slice(t):a.slice(0,a.length-t),this;t-=a.length}else{let a=s.children[o+(e<0?-1:0)];t>a.length?(t-=a.length,this.offsets[i]+=e):(e<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(e>0?1:(a instanceof Ht?a.text.length:a.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}},Nn=class{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new yi(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:s}=this.cursor.next(t);return this.pos+=(s.length+t)*e,this.value=s.length<=i?s:e<0?s.slice(s.length-i):s.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},In=class{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:s}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=s,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol!="undefined"&&(q.prototype[Symbol.iterator]=function(){return this.iter()},yi.prototype[Symbol.iterator]=Nn.prototype[Symbol.iterator]=In.prototype[Symbol.iterator]=function(){return this});var vo=class{constructor(t,e,i,s){this.from=t,this.to=e,this.number=i,this.text=s}get length(){return this.to-this.from}};function $i(n,t,e){return t=Math.max(0,Math.min(n.length,t)),[t,Math.max(t,Math.min(n.length,e))]}function ce(n,t,e=!0,i=!0){return Oh(n,t,e,i)}var So=/\\r\\n?|\\n/,Rt=function(n){return n[n.Simple=0]="Simple",n[n.TrackDel=1]="TrackDel",n[n.TrackBefore=2]="TrackBefore",n[n.TrackAfter=3]="TrackAfter",n}(Rt||(Rt={})),wi=class n{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;et)return r+(t-s);r+=l}else{if(i!=Rt.Simple&&h>=t&&(i==Rt.TrackDel&&st||i==Rt.TrackBefore&&st))return null;if(h>t||h==t&&e<0&&!l)return t==s||e<0?r:r+a;r+=a}s=h}if(t>s)throw new RangeError(`Position ${t} is out of range for changeset of length ${s}`);return r}touchesRange(t,e=t){for(let i=0,s=0;i=0&&s<=e&&l>=t)return se?"cover":!0;s=l}return!1}toString(){let t="";for(let e=0;e=0?":"+s:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new n(t)}static create(t){return new n(t)}},Ft=class n extends wi{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return Co(this,(e,i,s,r,o)=>t=t.replace(s,s+(i-e),o),!1),t}mapDesc(t,e=!1){return Ao(this,t,e,!0)}invert(t){let e=this.sections.slice(),i=[];for(let s=0,r=0;s=0){e[s]=l,e[s+1]=o;let a=s>>1;for(;i.length0&&Qe(i,e,r.text),r.forward(f),l+=f}let h=t[o++];for(;l>1].toJSON()))}return t}static of(t,e,i){let s=[],r=[],o=0,l=null;function a(f=!1){if(!f&&!s.length)return;ou||c<0||u>e)throw new RangeError(`Invalid change range ${c} to ${u} (in doc of length ${e})`);let p=d?typeof d=="string"?q.of(d.split(i||So)):d:q.empty,g=p.length;if(c==u&&g==0)return;co&&vt(s,c-o,-1),vt(s,u-c,g),Qe(r,s,p),o=u}}return h(t),a(!l),l}static empty(t){return new n(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw new RangeError("Invalid JSON representation of ChangeSet");let e=[],i=[];for(let s=0;sl&&typeof o!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(r.length==1)e.push(r[0],0);else{for(;i.length=0&&e<=0&&e==n[s+1]?n[s]+=t:s>=0&&t==0&&n[s]==0?n[s+1]+=e:i?(n[s]+=t,n[s+1]+=e):n.push(t,e)}function Qe(n,t,e){if(e.length==0)return;let i=t.length-2>>1;if(i>1])),!(e||o==n.sections.length||n.sections[o+1]<0);)l=n.sections[o++],a=n.sections[o++];t(s,h,r,f,c),s=h,r=f}}}function Ao(n,t,e,i=!1){let s=[],r=i?[]:null,o=new xi(n),l=new xi(t);for(let a=-1;;){if(o.done&&l.len||l.done&&o.len)throw new Error("Mismatched change set lengths");if(o.ins==-1&&l.ins==-1){let h=Math.min(o.len,l.len);vt(s,h,-1),o.forward(h),l.forward(h)}else if(l.ins>=0&&(o.ins<0||a==o.i||o.off==0&&(l.len=0&&a=0){let h=0,f=o.len;for(;f;)if(l.ins==-1){let c=Math.min(f,l.len);h+=c,f-=c,l.forward(c)}else if(l.ins==0&&l.lena||o.ins>=0&&o.len>a)&&(l||i.length>h),r.forward2(a),o.forward(a)}}}}var xi=class{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i>1;return e>=t.length?q.empty:t[e]}textBit(t){let{inserted:e}=this.set,i=this.i-2>>1;return i>=e.length&&!t?q.empty:e[i].slice(this.off,t==null?void 0:this.off+t)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){this.ins==-1?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}},Wi=class n{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let t=this.flags&7;return t==7?null:t}get goalColumn(){let t=this.flags>>6;return t==16777215?void 0:t}map(t,e=-1){let i,s;return this.empty?i=s=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),s=t.mapPos(this.to,-1)),i==this.from&&s==this.to?this:new n(i,s,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return I.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return I.range(this.anchor,i)}eq(t,e=!1){return this.anchor==t.anchor&&this.head==t.head&&(!e||!this.empty||this.assoc==t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return I.range(t.anchor,t.head)}static create(t,e,i){return new n(t,e,i)}},I=class n{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:n.create(this.ranges.map(i=>i.map(t,e)),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;it.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!="number"||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new n(t.ranges.map(e=>Wi.fromJSON(e)),t.main)}static single(t,e=t){return new n([n.range(t,e)],0)}static create(t,e=0){if(t.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,s=0;st?8:0)|r)}static normalized(t,e=0){let i=t[e];t.sort((s,r)=>s.from-r.from),e=t.indexOf(i);for(let s=1;sr.head?n.range(a,l):n.range(l,a))}}return new n(t,e)}};function _h(n,t){for(let e of n.ranges)if(e.to>t)throw new RangeError("Selection points outside of document")}var Io=0,B=class n{constructor(t,e,i,s,r){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=s,this.id=Io++,this.default=t([]),this.extensions=typeof r=="function"?r(this):r}get reader(){return this}static define(t={}){return new n(t.combine||(e=>e),t.compareInput||((e,i)=>e===i),t.compare||(t.combine?(e,i)=>e===i:Lo),!!t.static,t.enables)}of(t){return new ji([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new ji(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new ji(t,this,2,e)}from(t,e){return e||(e=i=>i),this.compute([t],i=>e(i.field(t)))}};function Lo(n,t){return n==t||n.length==t.length&&n.every((e,i)=>e===t[i])}var ji=class{constructor(t,e,i,s){this.dependencies=t,this.facet=e,this.type=i,this.value=s,this.id=Io++}dynamicSlot(t){var e;let i=this.value,s=this.facet.compareInput,r=this.id,o=t[r]>>1,l=this.type==2,a=!1,h=!1,f=[];for(let c of this.dependencies)c=="doc"?a=!0:c=="selection"?h=!0:(((e=t[c.id])!==null&&e!==void 0?e:1)&1)==0&&f.push(t[c.id]);return{create(c){return c.values[o]=i(c),1},update(c,u){if(a&&u.docChanged||h&&(u.docChanged||u.selection)||Mo(c,f)){let d=i(c);if(l?!Rh(d,c.values[o],s):!s(d,c.values[o]))return c.values[o]=d,1}return 0},reconfigure:(c,u)=>{let d,p=u.config.address[r];if(p!=null){let g=Hn(u,p);if(this.dependencies.every(m=>m instanceof B?u.facet(m)===c.facet(m):m instanceof Yt?u.field(m,!1)==c.field(m,!1):!0)||(l?Rh(d=i(c),g,s):s(d=i(c),g)))return c.values[o]=g,0}else d=i(c);return c.values[o]=d,1}}}};function Rh(n,t,e){if(n.length!=t.length)return!1;for(let i=0;in[a.id]),s=e.map(a=>a.type),r=i.filter(a=>!(a&1)),o=n[t.id]>>1;function l(a){let h=[];for(let f=0;fi===s),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(Pn).find(i=>i.field==this);return((e==null?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:i=>(i.values[e]=this.create(i),1),update:(i,s)=>{let r=i.values[e],o=this.updateF(r,s);return this.compareF(r,o)?0:(i.values[e]=o,1)},reconfigure:(i,s)=>{let r=i.facet(Pn),o=s.facet(Pn),l;return(l=r.find(a=>a.field==this))&&l!=o.find(a=>a.field==this)?(i.values[e]=l.create(i),1):s.config.address[this.id]!=null?(i.values[e]=s.field(this),0):(i.values[e]=this.create(i),1)}}}init(t){return[this,Pn.of({field:this,create:t})]}get extension(){return this}},mi={lowest:4,low:3,default:2,high:1,highest:0};function vs(n){return t=>new Ln(t,n)}var _o={highest:vs(mi.highest),high:vs(mi.high),default:vs(mi.default),low:vs(mi.low),lowest:vs(mi.lowest)},Ln=class{constructor(t,e){this.inner=t,this.prec=e}},Dt=class n{of(t){return new Cs(this,t)}reconfigure(t){return n.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}},Cs=class{constructor(t,e){this.compartment=t,this.inner=e}},_n=class n{constructor(t,e,i,s,r,o){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=s,this.staticValues=r,this.facets=o,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(t,e,i){let s=[],r=Object.create(null),o=new Map;for(let u of Xd(t,e,o))u instanceof Yt?s.push(u):(r[u.facet.id]||(r[u.facet.id]=[])).push(u);let l=Object.create(null),a=[],h=[];for(let u of s)l[u.id]=h.length<<1,h.push(d=>u.slot(d));let f=i==null?void 0:i.config.facets;for(let u in r){let d=r[u],p=d[0].facet,g=f&&f[u]||[];if(d.every(m=>m.type==0))if(l[p.id]=a.length<<1|1,Lo(g,d))a.push(i.facet(p));else{let m=p.combine(d.map(b=>b.value));a.push(i&&p.compare(m,i.facet(p))?i.facet(p):m)}else{for(let m of d)m.type==0?(l[m.id]=a.length<<1|1,a.push(m.value)):(l[m.id]=h.length<<1,h.push(b=>m.dynamicSlot(b)));l[p.id]=h.length<<1,h.push(m=>Yd(m,p,d))}}let c=h.map(u=>u(l));return new n(t,o,c,l,a,r)}};function Xd(n,t,e){let i=[[],[],[],[],[]],s=new Map;function r(o,l){let a=s.get(o);if(a!=null){if(a<=l)return;let h=i[a].indexOf(o);h>-1&&i[a].splice(h,1),o instanceof Cs&&e.delete(o.compartment)}if(s.set(o,l),Array.isArray(o))for(let h of o)r(h,l);else if(o instanceof Cs){if(e.has(o.compartment))throw new RangeError("Duplicate use of compartment in extensions");let h=t.get(o.compartment)||o.inner;e.set(o.compartment,h),r(h,l)}else if(o instanceof Ln)r(o.inner,o.prec);else if(o instanceof Yt)i[l].push(o),o.provides&&r(o.provides,l);else if(o instanceof ji)i[l].push(o),o.facet.extensions&&r(o.facet.extensions,mi.default);else{let h=o.extension;if(!h)throw new Error(`Unrecognized extension value in extension set (${o}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(h,l)}}return r(n,mi.default),i.reduce((o,l)=>o.concat(l))}function Ss(n,t){if(t&1)return 2;let e=t>>1,i=n.status[e];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;n.status[e]=4;let s=n.computeSlot(n,n.config.dynamicSlots[e]);return n.status[e]=2|s}function Hn(n,t){return t&1?n.config.staticValues[t>>1]:n.values[t>>1]}var Hh=B.define(),Oo=B.define({combine:n=>n.some(t=>t),static:!0}),Fh=B.define({combine:n=>n.length?n[0]:void 0,static:!0}),Vh=B.define(),zh=B.define(),Wh=B.define(),qh=B.define({combine:n=>n.length?n[0]:!1}),He=class{constructor(t,e){this.type=t,this.value=e}static define(){return new To}},To=class{of(t){return new He(this,t)}},Do=class{constructor(t){this.map=t}of(t){return new it(this,t)}},it=class n{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return e===void 0?void 0:e==this.value?this:new n(this.type,e)}is(t){return this.type==t}static define(t={}){return new Do(t.map||(e=>e))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let s of t){let r=s.map(e);r&&i.push(r)}return i}};it.reconfigure=it.define();it.appendConfig=it.define();var Bt=class n{constructor(t,e,i,s,r,o){this.startState=t,this.changes=e,this.selection=i,this.effects=s,this.annotations=r,this.scrollIntoView=o,this._doc=null,this._state=null,i&&_h(i,e.newLength),r.some(l=>l.type==n.time)||(this.annotations=r.concat(n.time.of(Date.now())))}static create(t,e,i,s,r,o){return new n(t,e,i,s,r,o)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(n.userEvent);return!!(e&&(e==t||e.length>t.length&&e.slice(0,t.length)==t&&e[t.length]=="."))}};Bt.time=He.define();Bt.userEvent=He.define();Bt.addToHistory=He.define();Bt.remote=He.define();function Jd(n,t){let e=[];for(let i=0,s=0;;){let r,o;if(i=n[i]))r=n[i++],o=n[i++];else if(s=0;s--){let r=i[s](n);r instanceof Bt?n=r:Array.isArray(r)&&r.length==1&&r[0]instanceof Bt?n=r[0]:n=Gh(t,Gi(r),!1)}return n}function Zd(n){let t=n.startState,e=t.facet(Wh),i=n;for(let s=e.length-1;s>=0;s--){let r=e[s](n);r&&Object.keys(r).length&&(i=jh(i,Po(t,r,n.changes.newLength),!0))}return i==n?n:Bt.create(t,n.changes,n.selection,i.effects,i.annotations,i.scrollIntoView)}var tp=[];function Gi(n){return n==null?tp:Array.isArray(n)?n:[n]}var fe=function(n){return n[n.Word=0]="Word",n[n.Space=1]="Space",n[n.Other=2]="Other",n}(fe||(fe={})),ep=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/,Eo;try{Eo=new RegExp("[\\\\p{Alphabetic}\\\\p{Number}_]","u")}catch(n){}function ip(n){if(Eo)return Eo.test(n);for(let t=0;t"\\x80"&&(e.toUpperCase()!=e.toLowerCase()||ep.test(e)))return!0}return!1}function sp(n){return t=>{if(!/\\S/.test(t))return fe.Space;if(ip(t))return fe.Word;for(let e=0;e-1)return fe.Word;return fe.Other}}var nt=class n{constructor(t,e,i,s,r,o){this.config=t,this.doc=e,this.selection=i,this.values=s,this.status=t.statusTemplate.slice(),this.computeSlot=r,o&&(o._state=this);for(let l=0;ls.set(h,a)),e=null),s.set(l.value.compartment,l.value.extension)):l.is(it.reconfigure)?(e=null,i=l.value):l.is(it.appendConfig)&&(e=null,i=Gi(i).concat(l.value));let r;e?r=t.startState.values.slice():(e=_n.resolve(i,s,this),r=new n(e,this.doc,this.selection,e.dynamicSlots.map(()=>null),(a,h)=>h.reconfigure(a,this),null).values);let o=t.startState.facet(Oo)?t.newSelection:t.newSelection.asSingle();new n(e,t.newDoc,o,r,(l,a)=>a.update(l,t),t)}replaceSelection(t){return typeof t=="string"&&(t=this.toText(t)),this.changeByRange(e=>({changes:{from:e.from,to:e.to,insert:t},range:I.cursor(e.from+t.length)}))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),s=this.changes(i.changes),r=[i.range],o=Gi(i.effects);for(let l=1;lo.spec.fromJSON(l,a)))}}return n.create({doc:t.doc,selection:I.fromJSON(t.selection),extensions:e.extensions?s.concat([e.extensions]):s})}static create(t={}){let e=_n.resolve(t.extensions||[],new Map),i=t.doc instanceof q?t.doc:q.of((t.doc||"").split(e.staticFacet(n.lineSeparator)||So)),s=t.selection?t.selection instanceof I?t.selection:I.single(t.selection.anchor,t.selection.head):I.single(0);return _h(s,i.length),e.staticFacet(Oo)||(s=s.asSingle()),new n(e,i,s,e.dynamicSlots.map(()=>null),(r,o)=>o.create(r),null)}get tabSize(){return this.facet(n.tabSize)}get lineBreak(){return this.facet(n.lineSeparator)||`\n`}get readOnly(){return this.facet(qh)}phrase(t,...e){for(let i of this.facet(n.phrases))if(Object.prototype.hasOwnProperty.call(i,t)){t=i[t];break}return e.length&&(t=t.replace(/\\$(\\$|\\d*)/g,(i,s)=>{if(s=="$")return"$";let r=+(s||1);return!r||r>e.length?i:e[r-1]})),t}languageDataAt(t,e,i=-1){let s=[];for(let r of this.facet(Hh))for(let o of r(this,e,i))Object.prototype.hasOwnProperty.call(o,t)&&s.push(o[t]);return s}charCategorizer(t){return sp(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:s}=this.doc.lineAt(t),r=this.charCategorizer(t),o=t-i,l=t-i;for(;o>0;){let a=ce(e,o,!1);if(r(e.slice(a,o))!=fe.Word)break;o=a}for(;ln.length?n[0]:4});nt.lineSeparator=Fh;nt.readOnly=qh;nt.phrases=B.define({compare(n,t){let e=Object.keys(n),i=Object.keys(t);return e.length==i.length&&e.every(s=>n[s]==t[s])}});nt.languageData=Hh;nt.changeFilter=Vh;nt.transactionFilter=zh;nt.transactionExtender=Wh;Dt.reconfigure=it.define();var Fe=class{eq(t){return this==t}range(t,e=t){return As.create(t,e,this)}};Fe.prototype.startSide=Fe.prototype.endSide=0;Fe.prototype.point=!1;Fe.prototype.mapMode=Rt.TrackDel;var As=class n{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(t,e,i){return new n(t,e,i)}};function Ro(n,t){return n.from-t.from||n.value.startSide-t.value.startSide}var Bo=class n{constructor(t,e,i,s){this.from=t,this.to=e,this.value=i,this.maxPoint=s}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,s=0){let r=i?this.to:this.from;for(let o=s,l=r.length;;){if(o==l)return o;let a=o+l>>1,h=r[a]-t||(i?this.value[a].endSide:this.value[a].startSide)-e;if(a==o)return h>=0?o:l;h>=0?l=a:o=a+1}}between(t,e,i,s){for(let r=this.findIndex(e,-1e9,!0),o=this.findIndex(i,1e9,!1,r);rd||u==d&&h.startSide>0&&h.endSide<=0)continue;(d-u||h.endSide-h.startSide)<0||(o<0&&(o=u),h.point&&(l=Math.max(l,d-u)),i.push(h),s.push(u-o),r.push(d-o))}return{mapped:i.length?new n(s,r,i,l):null,pos:o}}},lt=class n{constructor(t,e,i,s){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=s}static create(t,e,i,s){return new n(t,e,i,s)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:s=0,filterTo:r=this.length}=t,o=t.filter;if(e.length==0&&!o)return this;if(i&&(e=e.slice().sort(Ro)),this.isEmpty)return e.length?n.of(e):this;let l=new Fn(this,null,-1).goto(0),a=0,h=[],f=new Ui;for(;l.value||a=0){let c=e[a++];f.addInner(c.from,c.to,c.value)||h.push(c)}else l.rangeIndex==1&&l.chunkIndexthis.chunkEnd(l.chunkIndex)||rl.to||r=r&&t<=r+o.length&&o.between(r,t-r,e-r,i)===!1)return}this.nextLayer.between(t,e,i)}}iter(t=0){return Ms.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return Ms.from(t).goto(e)}static compare(t,e,i,s,r=-1){let o=t.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=r),l=e.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=r),a=Bh(o,l,i),h=new bi(o,a,r),f=new bi(l,a,r);i.iterGaps((c,u,d)=>Nh(h,c,f,u,d,s)),i.empty&&i.length==0&&Nh(h,0,f,0,0,s)}static eq(t,e,i=0,s){s==null&&(s=999999999);let r=t.filter(f=>!f.isEmpty&&e.indexOf(f)<0),o=e.filter(f=>!f.isEmpty&&t.indexOf(f)<0);if(r.length!=o.length)return!1;if(!r.length)return!0;let l=Bh(r,o),a=new bi(r,l,0).goto(i),h=new bi(o,l,0).goto(i);for(;;){if(a.to!=h.to||!No(a.active,h.active)||a.point&&(!h.point||!a.point.eq(h.point)))return!1;if(a.to>s)return!0;a.next(),h.next()}}static spans(t,e,i,s,r=-1){let o=new bi(t,null,r).goto(e),l=e,a=o.openStart;for(;;){let h=Math.min(o.to,i);if(o.point){let f=o.activeForPoint(o.to),c=o.pointFroml&&(s.span(l,h,o.active,a),a=o.openEnd(h));if(o.to>i)return a+(o.point&&o.to>i?1:0);l=o.to,o.next()}}static of(t,e=!1){let i=new Ui;for(let s of t instanceof As?[t]:e?np(t):t)i.add(s.from,s.to,s.value);return i.finish()}static join(t){if(!t.length)return n.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let s=t[i];s!=n.empty;s=s.nextLayer)e=new n(s.chunkPos,s.chunk,e,Math.max(s.maxPoint,e.maxPoint));return e}};lt.empty=new lt([],[],null,-1);function np(n){if(n.length>1)for(let t=n[0],e=1;e0)return n.slice().sort(Ro);t=i}return n}lt.empty.nextLayer=lt.empty;var Ui=class n{finishChunk(t){this.chunks.push(new Bo(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new n)).add(t,e,i)}addInner(t,e,i){let s=t-this.lastTo||i.startSide-this.last.endSide;if(s<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return s<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(lt.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return t;let e=lt.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}};function Bh(n,t,e){let i=new Map;for(let r of n)for(let o=0;o=this.minPoint)break}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&s.push(new Fn(o,e,i,r));return s.length==1?s[0]:new n(s)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let i=this.heap.length>>1;i>=0;i--)ko(this.heap,i);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let i=this.heap.length>>1;i>=0;i--)ko(this.heap,i);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),ko(this.heap,0)}}};function ko(n,t){for(let e=n[t];;){let i=(t<<1)+1;if(i>=n.length)break;let s=n[i];if(i+1=0&&(s=n[i+1],i++),e.compare(s)<0)break;n[i]=e,n[t]=s,t=i}}var bi=class{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Ms.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){En(this.active,t),En(this.activeTo,t),En(this.activeRank,t),this.minActive=Ih(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:s,rank:r}=this.cursor;for(;e0;)e++;Rn(this.active,e,i),Rn(this.activeTo,e,s),Rn(this.activeRank,e,r),t&&Rn(t,e,this.cursor.from),this.minActive=Ih(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let s=this.minActive;if(s>-1&&(this.activeTo[s]-this.cursor.from||this.active[s].endSide-this.cursor.startSide)<0){if(this.activeTo[s]>t){this.to=this.activeTo[s],this.endSide=this.active[s].endSide;break}this.removeActive(s),i&&En(i,s)}else if(this.cursor.value)if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let r=this.cursor.value;if(!r.point)this.addActive(i),this.cursor.next();else if(e&&this.cursor.to==this.to&&this.cursor.from=0&&i[s]=0&&!(this.activeRank[i]t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}};function Nh(n,t,e,i,s,r){n.goto(t),e.goto(i);let o=i+s,l=i,a=i-t;for(;;){let h=n.to+a-e.to,f=h||n.endSide-e.endSide,c=f<0?n.to+a:e.to,u=Math.min(c,o);if(n.point||e.point?n.point&&e.point&&(n.point==e.point||n.point.eq(e.point))&&No(n.activeForPoint(n.to),e.activeForPoint(e.to))||r.comparePoint(l,u,n.point,e.point):u>l&&!No(n.active,e.active)&&r.compareRange(l,u,n.active,e.active),c>o)break;(h||n.openEnd!=e.openEnd)&&r.boundChange&&r.boundChange(c),l=c,f<=0&&n.next(),f>=0&&e.next()}}function No(n,t){if(n.length!=t.length)return!1;for(let e=0;e=t;i--)n[i+1]=n[i];n[t]=e}function Ih(n,t){let e=-1,i=1e9;for(let s=0;s=t)return s;if(s==n.length)break;r+=n.charCodeAt(s)==9?e-r%e:1,s=ce(n,s)}return i===!0?-1:n.length}var rp=class Ho{constructor(t,e){this.low=t,this.high=e}clone(){return new Ho(this.low,this.high)}get max(){return this.clone()}less_than(t){return this.lowt.high?this.high:t.high)}output(){return[this.low,this.high]}static comparable_max(t,e){return t.merge(e)}static comparable_less_than(t,e){return ta&&([l,a]=[a,l]),this.item.key=new rp(l,a)}this.max=this.item.key?this.item.key.max:void 0}isNil(){return this.item.key===void 0&&this.item.value===void 0&&this.left===null&&this.right===null&&this.color===$}_value_less_than(t){return this.item.value&&t.item.value&&this.item.value.less_than?this.item.value.less_than(t.item.value):this.item.valuet++),t}get keys(){let t=[];return this.tree_walk(this.root,e=>t.push(e.item.key.output?e.item.key.output():e.item.key)),t}get values(){let t=[];return this.tree_walk(this.root,e=>t.push(e.item.value)),t}get items(){let t=[];return this.tree_walk(this.root,e=>t.push({key:e.item.key.output?e.item.key.output():e.item.key,value:e.item.value})),t}isEmpty(){return this.root==null||this.root===this.nil_node}clear(){this.root=null}insert(t,e=t){if(t===void 0)return;let i=new Ve(t,e,this.nil_node,this.nil_node,null,wt);return this.tree_insert(i),this.recalc_max(i),i}exist(t,e=t){let i=new Ve(t,e);return!!this.tree_search(this.root,i)}remove(t,e=t){let i=new Ve(t,e),s=this.tree_search(this.root,i);return s&&this.tree_delete(s),s}search(t,e=(i,s)=>i===s?s.output():i){let i=new Ve(t),s=[];return this.tree_search_interval(this.root,i,s),s.map(r=>e(r.item.value,r.item.key))}intersect_any(t){let e=new Ve(t);return this.tree_find_any_interval(this.root,e)}forEach(t){this.tree_walk(this.root,e=>t(e.item.key,e.item.value))}map(t){let e=new n;return this.tree_walk(this.root,i=>e.insert(i.item.key,t(i.item.value,i.item.key))),e}*iterate(t,e=(i,s)=>i===s?s.output():i){let i;for(t?i=this.tree_search_nearest_forward(this.root,new Ve(t)):this.root&&(i=this.local_minimum(this.root));i;)yield e(i.item.value,i.item.key),i=this.tree_successor(i)}recalc_max(t){let e=t;for(;e.parent!=null;)e.parent.update_max(),e=e.parent}tree_insert(t){let e=this.root,i=null;if(this.root==null||this.root===this.nil_node)this.root=t;else{for(;e!==this.nil_node;)i=e,t.less_than(e)?e=e.left:e=e.right;t.parent=i,t.less_than(i)?i.left=t:i.right=t}this.insert_fixup(t)}insert_fixup(t){let e,i;for(e=t;e!==this.root&&e.parent.color===wt;)e.parent===e.parent.parent.left?(i=e.parent.parent.right,i.color===wt?(e.parent.color=$,i.color=$,e.parent.parent.color=wt,e=e.parent.parent):(e===e.parent.right&&(e=e.parent,this.rotate_left(e)),e.parent.color=$,e.parent.parent.color=wt,this.rotate_right(e.parent.parent))):(i=e.parent.parent.left,i.color===wt?(e.parent.color=$,i.color=$,e.parent.parent.color=wt,e=e.parent.parent):(e===e.parent.left&&(e=e.parent,this.rotate_right(e)),e.parent.color=$,e.parent.parent.color=wt,this.rotate_left(e.parent.parent)));this.root.color=$}tree_delete(t){let e,i;t.left===this.nil_node||t.right===this.nil_node?e=t:e=this.tree_successor(t),e.left!==this.nil_node?i=e.left:i=e.right,i.parent=e.parent,e===this.root?this.root=i:(e===e.parent.left?e.parent.left=i:e.parent.right=i,e.parent.update_max()),this.recalc_max(i),e!==t&&(t.copy_data(e),t.update_max(),this.recalc_max(t)),e.color===$&&this.delete_fixup(i)}delete_fixup(t){let e=t,i;for(;e!==this.root&&e.parent!=null&&e.color===$;)e===e.parent.left?(i=e.parent.right,i.color===wt&&(i.color=$,e.parent.color=wt,this.rotate_left(e.parent),i=e.parent.right),i.left.color===$&&i.right.color===$?(i.color=wt,e=e.parent):(i.right.color===$&&(i.color=wt,i.left.color=$,this.rotate_right(i),i=e.parent.right),i.color=e.parent.color,e.parent.color=$,i.right.color=$,this.rotate_left(e.parent),e=this.root)):(i=e.parent.left,i.color===wt&&(i.color=$,e.parent.color=wt,this.rotate_right(e.parent),i=e.parent.left),i.left.color===$&&i.right.color===$?(i.color=wt,e=e.parent):(i.left.color===$&&(i.color=wt,i.right.color=$,this.rotate_left(i),i=e.parent.left),i.color=e.parent.color,e.parent.color=$,i.left.color=$,this.rotate_right(e.parent),e=this.root));e.color=$}tree_search(t,e){if(!(t==null||t===this.nil_node))return e.equal_to(t)?t:e.less_than(t)?this.tree_search(t.left,e):this.tree_search(t.right,e)}tree_search_nearest_forward(t,e){let i,s=t;for(;s&&s!==this.nil_node;)s.less_than(e)?s.intersect(e)?(i=s,s=s.left):s=s.right:((!i||s.less_than(i))&&(i=s),s=s.left);return i||null}tree_search_interval(t,e,i){t!=null&&t!==this.nil_node&&(t.left!==this.nil_node&&!t.not_intersect_left_subtree(e)&&this.tree_search_interval(t.left,e,i),t.intersect(e)&&i.push(t),t.right!==this.nil_node&&!t.not_intersect_right_subtree(e)&&this.tree_search_interval(t.right,e,i))}tree_find_any_interval(t,e){let i=!1;return t!=null&&t!==this.nil_node&&(t.left!==this.nil_node&&!t.not_intersect_left_subtree(e)&&(i=this.tree_find_any_interval(t.left,e)),i||(i=t.intersect(e)),!i&&t.right!==this.nil_node&&!t.not_intersect_right_subtree(e)&&(i=this.tree_find_any_interval(t.right,e))),i}local_minimum(t){let e=t;for(;e.left!=null&&e.left!==this.nil_node;)e=e.left;return e}local_maximum(t){let e=t;for(;e.right!=null&&e.right!==this.nil_node;)e=e.right;return e}tree_successor(t){let e,i,s;if(t.right!==this.nil_node)e=this.local_minimum(t.right);else{for(i=t,s=t.parent;s!=null&&s.right===i;)i=s,s=s.parent;e=s}return e}rotate_left(t){let e=t.right;t.right=e.left,e.left!==this.nil_node&&(e.left.parent=t),e.parent=t.parent,t===this.root?this.root=e:t===t.parent.left?t.parent.left=e:t.parent.right=e,e.left=t,t.parent=e,t!=null&&t!==this.nil_node&&t.update_max(),e=t.parent,e!=null&&e!==this.nil_node&&e.update_max()}rotate_right(t){let e=t.left;t.left=e.right,e.right!==this.nil_node&&(e.right.parent=t),e.parent=t.parent,t===this.root?this.root=e:t===t.parent.left?t.parent.left=e:t.parent.right=e,e.right=t,t.parent=e,t!==null&&t!==this.nil_node&&t.update_max(),e=t.parent,e!=null&&e!==this.nil_node&&e.update_max()}tree_walk(t,e){t!=null&&t!==this.nil_node&&(this.tree_walk(t.left,e),e(t),this.tree_walk(t.right,e))}testRedBlackProperty(){let t=!0;return this.tree_walk(this.root,function(e){e.color===wt&&(e.left.color===$&&e.right.color===$||(t=!1))}),t}testBlackHeightProperty(t){let e=0,i=0,s=0;if(t.color===$&&e++,t.left!==this.nil_node?i=this.testBlackHeightProperty(t.left):i=1,t.right!==this.nil_node?s=this.testBlackHeightProperty(t.right):s=1,i!==s)throw new Error("Red-black height property violated");return e+=i,e}};var zn=class{constructor(t){Le(this,"ranges");Le(this,"tree");this.ranges=t,this.tree=new Vn;for(let e of t)this.tree.insert([e.from,e.to],e)}empty(){return this.ranges.length===0}get(t){return t<0?this.ranges[this.ranges.length+t]:this.ranges[t]}at_cursor(t,e=!1){let i=this.tree.search([t,t]);return i.length?e&&i.length>1?i[1]:i[0]:void 0}contains_range(t,e){return this.tree.intersect_any([t,e])}range_adjacent_to_cursor(t,e,i=!1,s=!1){let r=e?this.ranges.slice().reverse():this.ranges;return s?r.find(o=>e?(i?o.from:o.to)e?(i?o.from:o.to)<=t:t<=(i?o.to:o.from))}adjacent_range(t,e,i=!1){let s=this.ranges.findIndex(o=>o===t);if(s===-1)return;let r=e?this.ranges[s-1]:this.ranges[s+1];if(r)if(i){if(e?r.to===t.from:t.to===r.from)return r}else return r}ranges_in_range(t,e){return this.tree.search([t,e])}unwrap_in_range(t,e=0,i=t.length,s=null){let r,o;if(s||(s=this.ranges_in_range(e,i)),s.length===0)return{output:t.sliceString(e,i),from:e,to:i};let l="";e=s.at(-1).to?l+=t.sliceString(s.at(-1).to,i):o=s.at(-1);let h=r?r.cursor_pass_syntax(e,!1):e,f=o?o.cursor_pass_syntax(i,!0):i;return(h!==e||e===(r==null?void 0:r.from))&&(r=void 0),(f!==i||i===(o==null?void 0:o.to))&&(o=void 0),{output:l,from:h,to:f,front_range:r,back_range:o}}};var Fo="\\u037C",Uh=typeof Symbol=="undefined"?"__"+Fo:Symbol.for(Fo),Vo=typeof Symbol=="undefined"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),Kh=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:{},Xt=class{constructor(t,e){this.rules=[];let{finish:i}=e||{};function s(o){return/^@/.test(o)?[o]:o.split(/,\\s*/)}function r(o,l,a,h){let f=[],c=/^@(\\w+)\\b/.exec(o[0]),u=c&&c[1]=="keyframes";if(c&&l==null)return a.push(o[0]+";");for(let d in l){let p=l[d];if(/&/.test(d))r(d.split(/,\\s*/).map(g=>o.map(m=>g.replace(/&/,m))).reduce((g,m)=>g.concat(m)),p,a);else if(p&&typeof p=="object"){if(!c)throw new RangeError("The value of a property ("+d+") should be a primitive value.");r(s(d),p,f,u)}else p!=null&&f.push(d.replace(/_.*/,"").replace(/[A-Z]/g,g=>"-"+g.toLowerCase())+": "+p+";")}(f.length||u)&&a.push((i&&!c&&!h?o.map(i):o).join(", ")+" {"+f.join(" ")+"}")}for(let o in t)r(s(o),t[o],this.rules)}getRules(){return this.rules.join(`\n`)}static newName(){let t=Kh[Uh]||1;return Kh[Uh]=t+1,Fo+t.toString(36)}static mount(t,e,i){let s=t[Vo],r=i&&i.nonce;s?r&&s.setNonce(r):s=new zo(t,r),s.mount(Array.isArray(e)?e:[e],t)}},Yh=new Map,zo=class{constructor(t,e){let i=t.ownerDocument||t,s=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&s.CSSStyleSheet){let r=Yh.get(i);if(r)return t[Vo]=r;this.sheet=new s.CSSStyleSheet,Yh.set(i,this)}else this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);this.modules=[],t[Vo]=this}mount(t,e){let i=this.sheet,s=0,r=0;for(let o=0;o-1&&(this.modules.splice(a,1),r--,a=-1),a==-1){if(this.modules.splice(r++,0,l),i)for(let h=0;h",191:"?",192:"~",219:"{",220:"|",221:"}",222:\'"\'},Tb=typeof navigator!="undefined"&&/Mac/.test(navigator.platform),Db=typeof navigator!="undefined"&&/MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);for(at=0;at<10;at++)ki[48+at]=ki[96+at]=String(at);var at;for(at=1;at<=24;at++)ki[at+111]="F"+at;var at;for(at=65;at<=90;at++)ki[at]=String.fromCharCode(at+32),qn[at]=String.fromCharCode(at);var at;for(Wn in ki)qn.hasOwnProperty(Wn)||(qn[Wn]=ki[Wn]);var Wn;function Ls(n){let t;return n.nodeType==11?t=n.getSelection?n:n.ownerDocument:t=n,t.getSelection()}function $o(n,t){return t?n==t||n.contains(t.nodeType!=1?t.parentNode:t):!1}function Jn(n,t){if(!t.anchorNode)return!1;try{return $o(n,t.anchorNode)}catch(e){return!1}}function _s(n){return n.nodeType==3?Ci(n,0,n.nodeValue.length).getClientRects():n.nodeType==1?n.getClientRects():[]}function Es(n,t,e,i){return e?Xh(n,t,e,i,-1)||Xh(n,t,e,i,1):!1}function Si(n){for(var t=0;;t++)if(n=n.previousSibling,!n)return t}function er(n){return n.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\\d|SECTION|PRE)$/.test(n.nodeName)}function Xh(n,t,e,i,s){for(;;){if(n==e&&t==i)return!0;if(t==(s<0?0:be(n))){if(n.nodeName=="DIV")return!1;let r=n.parentNode;if(!r||r.nodeType!=1)return!1;t=Si(n)+(s<0?0:1),n=r}else if(n.nodeType==1){if(n=n.childNodes[t+(s<0?-1:0)],n.nodeType==1&&n.contentEditable=="false")return!1;t=s<0?be(n):0}else return!1}}function be(n){return n.nodeType==3?n.nodeValue.length:n.childNodes.length}function ur(n,t){let e=t?n.left:n.right;return{left:e,right:e,top:n.top,bottom:n.bottom}}function ap(n){let t=n.visualViewport;return t?{left:0,right:t.width,top:0,bottom:t.height}:{left:0,right:n.innerWidth,top:0,bottom:n.innerHeight}}function Of(n,t){let e=t.width/n.offsetWidth,i=t.height/n.offsetHeight;return(e>.995&&e<1.005||!isFinite(e)||Math.abs(t.width-n.offsetWidth)<1)&&(e=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(t.height-n.offsetHeight)<1)&&(i=1),{scaleX:e,scaleY:i}}function hp(n,t,e,i,s,r,o,l){let a=n.ownerDocument,h=a.defaultView||window;for(let f=n,c=!1;f&&!c;)if(f.nodeType==1){let u,d=f==a.body,p=1,g=1;if(d)u=ap(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(f).position)&&(c=!0),f.scrollHeight<=f.clientHeight&&f.scrollWidth<=f.clientWidth){f=f.assignedSlot||f.parentNode;continue}let y=f.getBoundingClientRect();({scaleX:p,scaleY:g}=Of(f,y)),u={left:y.left,right:y.left+f.clientWidth*p,top:y.top,bottom:y.top+f.clientHeight*g}}let m=0,b=0;if(s=="nearest")t.top0&&t.bottom>u.bottom+b&&(b=t.bottom-u.bottom+o)):t.bottom>u.bottom&&(b=t.bottom-u.bottom+o,e<0&&t.top-b0&&t.right>u.right+m&&(m=t.right-u.right+r)):t.right>u.right&&(m=t.right-u.right+r,e<0&&t.leftu.bottom||t.leftu.right)&&(t={left:Math.max(t.left,u.left),right:Math.min(t.right,u.right),top:Math.max(t.top,u.top),bottom:Math.min(t.bottom,u.bottom)}),f=f.assignedSlot||f.parentNode}else if(f.nodeType==11)f=f.host;else break}function fp(n){let t=n.ownerDocument,e,i;for(let s=n.parentNode;s&&!(s==t.body||e&&i);)if(s.nodeType==1)!i&&s.scrollHeight>s.clientHeight&&(i=s),!e&&s.scrollWidth>s.clientWidth&&(e=s),s=s.assignedSlot||s.parentNode;else if(s.nodeType==11)s=s.host;else break;return{x:e,y:i}}var Uo=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?be(e):0),i,Math.min(t.focusOffset,i?be(i):0))}set(t,e,i,s){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=s}},Ki=null;function Tf(n){if(n.setActive)return n.setActive();if(Ki)return n.focus(Ki);let t=[];for(let e=n;e&&(t.push(e,e.scrollTop,e.scrollLeft),e!=e.ownerDocument);e=e.parentNode);if(n.focus(Ki==null?{get preventScroll(){return Ki={preventScroll:!0},!0}}:void 0),!Ki){Ki=!1;for(let e=0;eMath.max(1,n.scrollHeight-n.clientHeight-4)}function Ef(n,t){for(let e=n,i=t;;){if(e.nodeType==3&&i>0)return{node:e,offset:i};if(e.nodeType==1&&i>0){if(e.contentEditable=="false")return null;e=e.childNodes[i-1],i=be(e)}else if(e.parentNode&&!er(e))i=Si(e),e=e.parentNode;else return null}}function Rf(n,t){for(let e=n,i=t;;){if(e.nodeType==3&&ie)return c.domBoundsAround(t,e,h);if(u>=t&&s==-1&&(s=a,r=h),h>e&&c.dom.parentNode==this.dom){o=a,l=f;break}f=u,h=u+c.breakAfter}return{from:r,to:l<0?i+this.length:l,startDOM:(s?this.children[s-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:o=0?this.children[o].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),e.flags&1)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,this.flags&7&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=kl){this.markDirty();for(let s=t;sthis.pos||t==this.pos&&(e>0||this.i==0||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}};function Bf(n,t,e,i,s,r,o,l,a){let{children:h}=n,f=h.length?h[t]:null,c=r.length?r[r.length-1]:null,u=c?c.breakAfter:o;if(!(t==i&&f&&!o&&!u&&r.length<2&&f.merge(e,s,r.length?c:null,e==0,l,a))){if(i0&&(!o&&r.length&&f.merge(e,f.length,r[0],!1,l,0)?f.breakAfter=r.shift().breakAfter:(e2),P={mac:ef||/Mac/.test(Nt.platform),windows:/Win/.test(Nt.platform),linux:/Linux|X11/.test(Nt.platform),ie:dr,ie_version:If?Ko.documentMode||6:Xo?+Xo[1]:Yo?+Yo[1]:0,gecko:Zh,gecko_version:Zh?+(/Firefox\\/(\\d+)/.exec(Nt.userAgent)||[0,0])[1]:0,chrome:!!Wo,chrome_version:Wo?+Wo[1]:0,ios:ef,android:/Android\\b/.test(Nt.userAgent),webkit:tf,safari:Lf,webkit_version:tf?+(/\\bAppleWebKit\\/(\\d+)/.exec(Nt.userAgent)||[0,0])[1]:0,tabSize:Ko.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"},dp=256,ye=class n extends J{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){t.nodeType==3&&this.createDOM(t)}merge(t,e,i){return this.flags&8||i&&(!(i instanceof n)||this.length-(e-t)+i.length>dp||i.flags&8)?!1:(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new n(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=this.flags&8,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new Pt(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return pp(this.dom,t,e)}},ti=class n extends J{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let s of e)s.setParent(this)}setAttrs(t){if(Df(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!((this.flags|t.flags)&8)}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?this.flags&4&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,s,r,o){return i&&(!(i instanceof n&&i.mark.eq(this.mark))||t&&r<=0||et&&e.push(i=t&&(s=r),i=a,r++}let o=this.length-t;return this.length=t,s>-1&&(this.children.length=s,this.markDirty()),new n(this.mark,e,o)}domAtPos(t){return _f(this,t)}coordsAt(t,e){return Ff(this,t,e)}};function pp(n,t,e){let i=n.nodeValue.length;t>i&&(t=i);let s=t,r=t,o=0;t==0&&e<0||t==i&&e>=0?P.chrome||P.gecko||(t?(s--,o=1):r=0)?0:l.length-1];return P.safari&&!o&&a.width==0&&(a=Array.prototype.find.call(l,h=>h.width)||a),o?ur(a,o<0):a||null}var sr=class n extends J{static create(t,e,i){return new n(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=n.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){(!this.dom||!this.widget.updateDOM(this.dom,t))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,s,r,o){return i&&(!(i instanceof n)||!this.widget.compare(i.widget)||t>0&&r<=0||e0)?Pt.before(this.dom):Pt.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let s=this.dom.getClientRects(),r=null;if(!s.length)return null;let o=this.side?this.side<0:t>0;for(let l=o?s.length-1:0;r=s[l],!(t>0?l==0:l==s.length-1||r.top0?Pt.before(this.dom):Pt.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return q.empty}get isHidden(){return!0}};ye.prototype.children=sr.prototype.children=Hs.prototype.children=kl;function _f(n,t){let e=n.dom,{children:i}=n,s=0;for(let r=0;sr&&t0;r--){let o=i[r-1];if(o.dom.parentNode==e)return o.domAtPos(o.length)}for(let r=s;r0&&t instanceof ti&&s.length&&(i=s[s.length-1])instanceof ti&&i.mark.eq(t.mark)?Hf(i,t.children[0],e-1):(s.push(t),t.setParent(n)),n.length+=t.length}function Ff(n,t,e){let i=null,s=-1,r=null,o=-1;function l(h,f){for(let c=0,u=0;c=f&&(d.children.length?l(d,f-u):(!r||r.isHidden&&(e>0||mp(r,d)))&&(p>f||u==p&&d.getSide()>0)?(r=d,o=f-u):(u-1?1:0)!=s.length-(e&&s.indexOf(e)>-1?1:0))return!1;for(let r of i)if(r!=e&&(s.indexOf(r)==-1||n[r]!==t[r]))return!1;return!0}function Qo(n,t,e){let i=!1;if(t)for(let s in t)e&&s in e||(i=!0,s=="style"?n.style.cssText="":n.removeAttribute(s));if(e)for(let s in e)t&&t[s]==e[s]||(i=!0,s=="style"?n.style.cssText=e[s]:n.setAttribute(s,e[s]));return i}function bp(n){let t=Object.create(null);for(let e=0;e0?3e8:-4e8:e>0?1e8:-1e8,new ei(t,e,e,i,t.widget||null,!1)}static replace(t){let e=!!t.block,i,s;if(t.isBlockGap)i=-5e8,s=4e8;else{let{start:r,end:o}=Vf(t,e);i=(r?e?-3e8:-1:5e8)-1,s=(o?e?2e8:1:-6e8)+1}return new ei(t,i,s,e,t.widget||null,!0)}static line(t){return new Vs(t)}static set(t,e=!1){return lt.of(t,e)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};pt.none=lt.empty;var Fs=class n extends pt{constructor(t){let{start:e,end:i}=Vf(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof n&&this.tagName==t.tagName&&(this.class||((e=this.attrs)===null||e===void 0?void 0:e.class))==(t.class||((i=t.attrs)===null||i===void 0?void 0:i.class))&&nr(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}};Fs.prototype.point=!1;var Vs=class n extends pt{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof n&&this.spec.class==t.spec.class&&nr(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}};Vs.prototype.mapMode=Rt.TrackBefore;Vs.prototype.point=!0;var ei=class n extends pt{constructor(t,e,i,s,r,o){super(e,i,r,t),this.block=s,this.isReplace=o,this.mapMode=s?e<=0?Rt.TrackBefore:Rt.TrackAfter:Rt.TrackDel}get type(){return this.startSide!=this.endSide?ge.WidgetRange:this.startSide<=0?ge.WidgetBefore:ge.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof n&&yp(this.widget,t.widget)&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}};ei.prototype.point=!0;function Vf(n,t=!1){let{inclusiveStart:e,inclusiveEnd:i}=n;return e==null&&(e=n.inclusive),i==null&&(i=n.inclusive),{start:e!=null?e:t,end:i!=null?i:t}}function yp(n,t){return n==t||!!(n&&t&&n.compare(t))}function Qn(n,t,e,i=0){let s=e.length-1;s>=0&&e[s]+i>=n?e[s]=Math.max(e[s],t):e.push(n,t)}var xt=class n extends J{constructor(){super(...arguments),this.children=[],this.length=0,this.prevAttrs=void 0,this.attrs=null,this.breakAfter=0}merge(t,e,i,s,r,o){if(i){if(!(i instanceof n))return!1;this.dom||i.transferDOM(this)}return s&&this.setDeco(i?i.attrs:null),Nf(this,t,e,i?i.children.slice():[],r,o),!0}split(t){let e=new n;if(e.breakAfter=this.breakAfter,this.length==0)return e;let{i,off:s}=this.childPos(t);s&&(e.append(this.children[i].split(s),0),this.children[i].merge(s,this.children[i].length,null,!1,0,0),i++);for(let r=i;r0&&this.children[i-1].length==0;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=this.prevAttrs===void 0?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){nr(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){Hf(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=Jo(e,this.attrs||{})),i&&(this.attrs=Jo({class:i},this.attrs||{}))}domAtPos(t){return _f(this,t)}reuseDOM(t){t.nodeName=="DIV"&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?this.flags&4&&(Df(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),this.prevAttrs!==void 0&&(Qo(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let s=this.dom.lastChild;for(;s&&J.get(s)instanceof ti;)s=s.lastChild;if(!s||!this.length||s.nodeName!="BR"&&((i=J.get(s))===null||i===void 0?void 0:i.isEditable)==!1&&(!P.ios||!this.children.some(r=>r instanceof ye))){let r=document.createElement("BR");r.cmIgnore=!0,this.dom.appendChild(r)}}measureTextSize(){if(this.children.length==0||this.length>20)return null;let t=0,e;for(let i of this.children){if(!(i instanceof ye)||/[^ -~]/.test(i.text))return null;let s=_s(i.dom);if(s.length!=1)return null;t+=s[0].width,e=s[0].height}return t?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:t/this.length,textHeight:e}:null}coordsAt(t,e){let i=Ff(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:s}=this.parent.view.viewState,r=i.bottom-i.top;if(Math.abs(r-s.lineHeight)<2&&s.textHeight=e){if(r instanceof n)return r;if(o>e)break}s=o+r.breakAfter}return null}},vi=class n extends J{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,s,r,o){return i&&(!(i instanceof n)||!this.widget.compare(i.widget)||t>0&&r<=0||e0}},zs=class extends Ji{constructor(t){super(),this.height=t}toDOM(){let t=document.createElement("div");return t.className="cm-gap",this.updateDOM(t),t}eq(t){return t.height==this.height}updateDOM(t){return t.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}},Rs=class n{constructor(t,e,i,s){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=s,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(this.content.length==0)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof vi&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new xt),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(jn(new Hs(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,!this.posCovered()&&!(t&&this.content.length&&this.content[this.content.length-1]instanceof vi)&&this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:r,lineBreak:o,done:l}=this.cursor.next(this.skip);if(this.skip=0,l)throw new Error("Ran out of text content when drawing inline views");if(o){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}else this.text=r,this.textOff=0}let s=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(jn(new ye(this.text.slice(this.textOff,this.textOff+s)),e),i),this.atCursorPos=!0,this.textOff+=s,t-=s,i=0}}span(t,e,i,s){this.buildText(e-t,i,s),this.pos=e,this.openStart<0&&(this.openStart=s)}point(t,e,i,s,r,o){if(this.disallowBlockEffectsFor[o]&&i instanceof ei){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let l=e-t;if(i instanceof ei)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new vi(i.widget||ii.block,l,i));else{let a=sr.create(i.widget||ii.inline,l,l?0:i.startSide),h=this.atCursorPos&&!a.isEditable&&r<=s.length&&(t0),f=!a.isEditable&&(ts.length||i.startSide<=0),c=this.getLine();this.pendingBuffer==2&&!h&&!a.isEditable&&(this.pendingBuffer=0),this.flushBuffer(s),h&&(c.append(jn(new Hs(1),s),r),r=s.length+Math.max(0,r-s.length)),c.append(jn(a,s),r),this.atCursorPos=f,this.pendingBuffer=f?ts.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=s.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);l&&(this.textOff+l<=this.text.length?this.textOff+=l:(this.skip+=l-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=r)}static build(t,e,i,s,r){let o=new n(t,e,i,r);return o.openEnd=lt.spans(s,e,i,o),o.openStart<0&&(o.openStart=o.openEnd),o.finish(o.openEnd),o}};function jn(n,t){for(let e of t)n=new ti(e,[n],n.length);return n}var ii=class extends Ji{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}};ii.inline=new ii("span");ii.block=new ii("div");var gt=function(n){return n[n.LTR=0]="LTR",n[n.RTL=1]="RTL",n}(gt||(gt={})),Ai=gt.LTR,vl=gt.RTL;function zf(n){let t=[];for(let e=0;e=e){if(l.level==i)return o;(r<0||(s!=0?s<0?l.frome:t[r].level>l.level))&&(r=o)}}if(r<0)throw new RangeError("Index out of range");return r}};function qf(n,t){if(n.length!=t.length)return!1;for(let e=0;e=0;g-=3)if(ue[g+1]==-d){let m=ue[g+2],b=m&2?s:m&4?m&1?r:s:0;b&&(K[c]=K[ue[g]]=b),l=g;break}}else{if(ue.length==189)break;ue[l++]=c,ue[l++]=u,ue[l++]=a}else if((p=K[c])==2||p==1){let g=p==s;a=g?0:1;for(let m=l-3;m>=0;m-=3){let b=ue[m+2];if(b&2)break;if(g)ue[m+2]|=2;else{if(b&4)break;ue[m+2]|=4}}}}}function Cp(n,t,e,i){for(let s=0,r=i;s<=e.length;s++){let o=s?e[s-1].to:n,l=sa;)p==m&&(p=e[--g].from,m=g?e[g-1].to:n),K[--p]=d;a=f}else r=h,a++}}}function tl(n,t,e,i,s,r,o){let l=i%2?2:1;if(i%2==s%2)for(let a=t,h=0;aa&&o.push(new pe(a,g.from,d));let m=g.direction==Ai!=!(d%2);el(n,m?i+1:i,s,g.inner,g.from,g.to,o),a=g.to}p=g.to}else{if(p==e||(f?K[p]!=l:K[p]==l))break;p++}u?tl(n,a,p,i+1,s,u,o):at;){let f=!0,c=!1;if(!h||a>r[h-1].to){let g=K[a-1];g!=l&&(f=!1,c=g==16)}let u=!f&&l==1?[]:null,d=f?i:i+1,p=a;t:for(;;)if(h&&p==r[h-1].to){if(c)break t;let g=r[--h];if(!f)for(let m=g.from,b=h;;){if(m==t)break t;if(b&&r[b-1].to==m)m=r[--b].from;else{if(K[m-1]==l)break t;break}}if(u)u.push(g);else{g.toK.length;)K[K.length]=256;let i=[],s=t==Ai?0:1;return el(n,s,s,e,0,n.length,i),i}function jf(n){return[new pe(0,n,0)]}var Gf="";function Mp(n,t,e,i,s){var r;let o=i.head-n.from,l=pe.find(t,o,(r=i.bidiLevel)!==null&&r!==void 0?r:-1,i.assoc),a=t[l],h=a.side(s,e);if(o==h){let u=l+=s?1:-1;if(u<0||u>=t.length)return null;a=t[l=u],o=a.side(!s,e),h=a.side(s,e)}let f=ce(n.text,o,a.forward(s,e));(fa.to)&&(f=h),Gf=n.text.slice(Math.min(o,f),Math.max(o,f));let c=l==(s?t.length-1:0)?null:t[l+(s?1:-1)];return c&&f==h&&c.level+(s?0:1)n.some(t=>t)}),Tp=B.define({combine:n=>n.some(t=>t)}),Zf=B.define(),Bs=class n{constructor(t,e="nearest",i="nearest",s=5,r=5,o=!1){this.range=t,this.y=e,this.x=i,this.yMargin=s,this.xMargin=r,this.isSnapshot=o}map(t){return t.empty?this:new n(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new n(I.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},Gn=it.define({map:(n,t)=>n.map(t)}),tc=it.define();function ne(n,t,e){let i=n.facet(Yf);i.length?i[0](t):window.onerror?window.onerror(String(t),e,void 0,void 0,t):e?console.error(e+":",t):console.error(t)}var ze=B.define({combine:n=>n.length?n[0]:!0}),Dp=0,Os=B.define(),Qi=class n{constructor(t,e,i,s,r){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=s,this.extension=r(this)}static define(t,e){let{eventHandlers:i,eventObservers:s,provide:r,decorations:o}=e||{};return new n(Dp++,t,i,s,l=>{let a=[Os.of(l)];return o&&a.push(Ws.of(h=>{let f=h.plugin(l);return f?o(f):pt.none})),r&&a.push(r(l)),a})}static fromClass(t,e){return n.define(i=>new t(i),e)}},Ns=class{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(i){if(ne(e.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(s){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){ne(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(!((e=this.value)===null||e===void 0)&&e.destroy)try{this.value.destroy()}catch(i){ne(t.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},ec=B.define(),Al=B.define(),Ws=B.define(),ic=B.define(),Ml=B.define(),sc=B.define();function nf(n,t){let e=n.state.facet(sc);if(!e.length)return e;let i=e.map(r=>r instanceof Function?r(n):r),s=[];return lt.spans(i,t.from,t.to,{point(){},span(r,o,l,a){let h=r-t.from,f=o-t.from,c=s;for(let u=l.length-1;u>=0;u--,a--){let d=l[u].spec.bidiIsolate,p;if(d==null&&(d=Op(t.text,h,f)),a>0&&c.length&&(p=c[c.length-1]).to==h&&p.direction==d)p.to=f,c=p.inner;else{let g={from:h,to:f,direction:d,inner:[]};c.push(g),c=g.inner}}}}),s}var nc=B.define();function rc(n){let t=0,e=0,i=0,s=0;for(let r of n.state.facet(nc)){let o=r(n);o&&(o.left!=null&&(t=Math.max(t,o.left)),o.right!=null&&(e=Math.max(e,o.right)),o.top!=null&&(i=Math.max(i,o.top)),o.bottom!=null&&(s=Math.max(s,o.bottom)))}return{left:t,right:e,top:i,bottom:s}}var Ts=B.define(),me=class n{constructor(t,e,i,s){this.fromA=t,this.toA=e,this.fromB=i,this.toB=s}join(t){return new n(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let s=t[e-1];if(!(s.fromA>i.toA)){if(s.toAf)break;r+=2}if(!a)return i;new n(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),o=a.toA,l=a.toB}}},rr=class n{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=Ft.empty(this.startState.doc.length);for(let r of i)this.changes=this.changes.compose(r.changes);let s=[];this.changes.iterChangedRanges((r,o,l,a)=>s.push(new me(r,o,l,a))),this.changedRanges=s}static create(t,e,i){return new n(t,e,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(t=>t.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},or=class extends J{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.editContextFormatting=pt.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new xt],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new me(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:h,toA:f})=>fthis.minWidthTo)?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(t);let s=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((e=this.domChanged)===null||e===void 0)&&e.newSel?s=this.domChanged.newSel.head:!Lp(t.changes,this.hasComposition)&&!t.selectionSet&&(s=t.state.selection.main.head));let r=s>-1?Ep(this.view,t.changes,s):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:h,to:f}=this.hasComposition;i=new me(h,f,t.changes.mapPos(h,-1),t.changes.mapPos(f,1)).addToSet(i.slice())}this.hasComposition=r?{from:r.range.fromB,to:r.range.toB}:null,(P.ie||P.chrome)&&!r&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let o=this.decorations,l=this.updateDeco(),a=Np(o,l,t.changes);return i=me.extendWithRanges(i,a),!(this.flags&7)&&i.length==0?!1:(this.updateInner(i,t.startState.doc.length,r),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:s}=this.view;s.ignore(()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=P.chrome||P.ios?{node:s.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,o),this.flags&=-8,o&&(o.written||s.selectionRange.focusNode!=o.node)&&(this.forceSelection=!0),this.dom.style.height=""}),this.markedForComposition.forEach(o=>o.flags&=-9);let r=[];if(this.view.viewport.from||this.view.viewport.to=0?s[o]:null;if(!l)break;let{fromA:a,toA:h,fromB:f,toB:c}=l,u,d,p,g;if(i&&i.range.fromBf){let x=Rs.build(this.view.state.doc,f,i.range.fromB,this.decorations,this.dynamicDecorationMap),v=Rs.build(this.view.state.doc,i.range.toB,c,this.decorations,this.dynamicDecorationMap);d=x.breakAtStart,p=x.openStart,g=v.openEnd;let C=this.compositionView(i);v.breakAtStart?C.breakAfter=1:v.content.length&&C.merge(C.length,C.length,v.content[0],!1,v.openStart,0)&&(C.breakAfter=v.content[0].breakAfter,v.content.shift()),x.content.length&&C.merge(0,0,x.content[x.content.length-1],!0,0,x.openEnd)&&x.content.pop(),u=x.content.concat(C).concat(v.content)}else({content:u,breakAtStart:d,openStart:p,openEnd:g}=Rs.build(this.view.state.doc,f,c,this.decorations,this.dynamicDecorationMap));let{i:m,off:b}=r.findPos(h,1),{i:y,off:w}=r.findPos(a,-1);Bf(this,y,w,m,b,u,d,p,g)}i&&this.fixCompositionDOM(i)}updateEditContextFormatting(t){this.editContextFormatting=this.editContextFormatting.map(t.changes);for(let e of t.transactions)for(let i of e.effects)i.is(tc)&&(this.editContextFormatting=i.value)}compositionView(t){let e=new ye(t.text.nodeValue);e.flags|=8;for(let{deco:s}of t.marks)e=new ti(s,[e],e.length);let i=new xt;return i.append(e,0),i}fixCompositionDOM(t){let e=(r,o)=>{o.flags|=8|(o.children.some(a=>a.flags&7)?1:0),this.markedForComposition.add(o);let l=J.get(r);l&&l!=o&&(l.dom=null),o.setDOM(r)},i=this.childPos(t.range.fromB,1),s=this.children[i.i];e(t.line,s);for(let r=t.marks.length-1;r>=-1;r--)i=s.childPos(i.off,1),s=s.children[i.i],e(r>=0?t.marks[r].node:t.text,s)}updateSelection(t=!1,e=!1){(t||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let i=this.view.root.activeElement,s=i==this.dom,r=!s&&!(this.view.state.facet(ze)||this.dom.tabIndex>-1)&&Jn(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(s||e||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(l.anchor)),h=l.empty?a:this.moveToLine(this.domAtPos(l.head));if(P.gecko&&l.empty&&!this.hasComposition&&Pp(a)){let c=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(c,a.node.childNodes[a.offset]||null)),a=h=new Pt(c,0),o=!0}let f=this.view.observer.selectionRange;(o||!f.focusNode||(!Es(a.node,a.offset,f.anchorNode,f.anchorOffset)||!Es(h.node,h.offset,f.focusNode,f.focusOffset))&&!this.suppressWidgetCursorChange(f,l))&&(this.view.observer.ignore(()=>{P.android&&P.chrome&&this.dom.contains(f.focusNode)&&Ip(f.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let c=Ls(this.view.root);if(c)if(l.empty){if(P.gecko){let u=Rp(a.node,a.offset);if(u&&u!=3){let d=(u==1?Ef:Rf)(a.node,a.offset);d&&(a=new Pt(d.node,d.offset))}}c.collapse(a.node,a.offset),l.bidiLevel!=null&&c.caretBidiLevel!==void 0&&(c.caretBidiLevel=l.bidiLevel)}else if(c.extend){c.collapse(a.node,a.offset);try{c.extend(h.node,h.offset)}catch(u){}}else{let u=document.createRange();l.anchor>l.head&&([a,h]=[h,a]),u.setEnd(h.node,h.offset),u.setStart(a.node,a.offset),c.removeAllRanges(),c.addRange(u)}r&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())}),this.view.observer.setSelectionRange(a,h)),this.impreciseAnchor=a.precise?null:new Pt(f.anchorNode,f.anchorOffset),this.impreciseHead=h.precise?null:new Pt(f.focusNode,f.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&Es(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=Ls(t.root),{anchorNode:s,anchorOffset:r}=t.observer.selectionRange;if(!i||!e.empty||!e.assoc||!i.modify)return;let o=xt.find(this,e.head);if(!o)return;let l=o.posAtStart;if(e.head==l||e.head==l+o.length)return;let a=this.coordsAt(e.head,-1),h=this.coordsAt(e.head,1);if(!a||!h||a.bottom>h.top)return;let f=this.domAtPos(e.head+e.assoc);i.collapse(f.node,f.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let c=t.observer.selectionRange;t.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=e.from&&i.collapse(s,r)}moveToLine(t){let e=this.dom,i;if(t.node!=e)return t;for(let s=t.offset;!i&&s=0;s--){let r=J.get(e.childNodes[s]);r instanceof xt&&(i=r.domAtPos(r.length))}return i?new Pt(i.node,i.offset,!0):t}nearest(t){for(let e=t;e;){let i=J.get(e);if(i&&i.rootView==this)return i;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e=0;o--){let l=this.children[o],a=r-l.breakAfter,h=a-l.length;if(at||l.covers(1))&&(!i||l instanceof xt&&!(i instanceof xt&&e>=0)))i=l,s=h;else if(i&&h==t&&a==t&&l instanceof vi&&Math.abs(e)<2){if(l.deco.startSide<0)break;o&&(i=null)}r=h}return i?i.coordsAt(t-s,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),s=this.children[e];if(!(s instanceof xt))return null;for(;s.children.length;){let{i:l,off:a}=s.childPos(i,1);for(;;l++){if(l==s.children.length)return null;if((s=s.children[l]).length)break}i=a}if(!(s instanceof ye))return null;let r=ce(s.text,i);if(r==i)return null;let o=Ci(s.dom,i,r).getClientRects();for(let l=0;lMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,l=-1,a=this.view.textDirection==gt.LTR;for(let h=0,f=0;fs)break;if(h>=i){let d=c.dom.getBoundingClientRect();if(e.push(d.height),o){let p=c.dom.lastChild,g=p?_s(p):[];if(g.length){let m=g[g.length-1],b=a?m.right-d.left:d.right-m.left;b>l&&(l=b,this.minWidth=r,this.minWidthFrom=h,this.minWidthTo=u)}}}h=u+c.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return getComputedStyle(this.children[e].dom).direction=="rtl"?gt.RTL:gt.LTR}measureTextSize(){for(let r of this.children)if(r instanceof xt){let o=r.measureTextSize();if(o)return o}let t=document.createElement("div"),e,i,s;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.dom.appendChild(t);let r=_s(t.firstChild)[0];e=t.getBoundingClientRect().height,i=r?r.width/27:7,s=r?r.height:e,t.remove()}),{lineHeight:e,charWidth:i,textHeight:s}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new ir(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,s=0;;s++){let r=s==e.viewports.length?null:e.viewports[s],o=r?r.from-1:this.length;if(o>i){let l=(e.lineBlockAt(o).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(pt.replace({widget:new zs(l),block:!0,inclusive:!0,isBlockGap:!0}).range(i,o))}if(!r)break;i=r.to+1}return pt.set(t)}updateDeco(){let t=1,e=this.view.state.facet(Ws).map(r=>(this.dynamicDecorationMap[t++]=typeof r=="function")?r(this.view):r),i=!1,s=this.view.state.facet(ic).map((r,o)=>{let l=typeof r=="function";return l&&(i=!0),l?r(this.view):r});for(s.length&&(this.dynamicDecorationMap[t++]=i,e.push(lt.join(s))),this.decorations=[this.editContextFormatting,...e,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];te.anchor?-1:1),s;if(!i)return;!e.empty&&(s=this.coordsAt(e.anchor,e.anchor>e.head?-1:1))&&(i={left:Math.min(i.left,s.left),top:Math.min(i.top,s.top),right:Math.max(i.right,s.right),bottom:Math.max(i.bottom,s.bottom)});let r=rc(this.view),o={left:i.left-r.left,top:i.top-r.top,right:i.right+r.right,bottom:i.bottom+r.bottom},{offsetWidth:l,offsetHeight:a}=this.view.scrollDOM;hp(this.view.scrollDOM,o,e.head{it.from&&(e=!0)}),e}function _p(n,t,e=1){let i=n.charCategorizer(t),s=n.doc.lineAt(t),r=t-s.from;if(s.length==0)return I.cursor(t);r==0?e=1:r==s.length&&(e=-1);let o=r,l=r;e<0?o=ce(s.text,r,!1):l=ce(s.text,r);let a=i(s.text.slice(o,l));for(;o>0;){let h=ce(s.text,o,!1);if(i(s.text.slice(h,o))!=a)break;o=h}for(;ln?t.left-n:Math.max(0,n-t.right)}function Fp(n,t){return t.top>n?t.top-n:Math.max(0,n-t.bottom)}function qo(n,t){return n.topt.top+1}function rf(n,t){return tn.bottom?{top:n.top,left:n.left,right:n.right,bottom:t}:n}function sl(n,t,e){let i,s,r,o,l=!1,a,h,f,c;for(let p=n.firstChild;p;p=p.nextSibling){let g=_s(p);for(let m=0;mw||o==w&&r>y){i=p,s=b,r=y,o=w;let x=w?e0?m0)}y==0?e>b.bottom&&(!f||f.bottomb.top)&&(h=p,c=b):f&&qo(f,b)?f=of(f,b.bottom):c&&qo(c,b)&&(c=rf(c,b.top))}}if(f&&f.bottom>=e?(i=a,s=f):c&&c.top<=e&&(i=h,s=c),!i)return{node:n,offset:0};let u=Math.max(s.left,Math.min(s.right,t));if(i.nodeType==3)return lf(i,u,e);if(l&&i.contentEditable!="false")return sl(i,u,e);let d=Array.prototype.indexOf.call(n.childNodes,i)+(t>=(s.left+s.right)/2?1:0);return{node:n,offset:d}}function lf(n,t,e){let i=n.nodeValue.length,s=-1,r=1e9,o=0;for(let l=0;le?f.top-e:e-f.bottom)-1;if(f.left-1<=t&&f.right+1>=t&&c=(f.left+f.right)/2,d=u;if((P.chrome||P.gecko)&&Ci(n,l).getBoundingClientRect().left==f.right&&(d=!u),c<=0)return{node:n,offset:l+(d?1:0)};s=l+(d?1:0),r=c}}}return{node:n,offset:s>-1?s:o>0?n.nodeValue.length:0}}function lc(n,t,e,i=-1){var s,r;let o=n.contentDOM.getBoundingClientRect(),l=o.top+n.viewState.paddingTop,a,{docHeight:h}=n.viewState,{x:f,y:c}=t,u=c-l;if(u<0)return 0;if(u>h)return n.state.doc.length;for(let x=n.viewState.heightOracle.textHeight/2,v=!1;a=n.elementAtHeight(u),a.type!=ge.Text;)for(;u=i>0?a.bottom+x:a.top-x,!(u>=0&&u<=h);){if(v)return e?null:0;v=!0,i=-i}c=l+u;let d=a.from;if(dn.viewport.to)return n.viewport.to==n.state.doc.length?n.state.doc.length:e?null:af(n,o,a,f,c);let p=n.dom.ownerDocument,g=n.root.elementFromPoint?n.root:p,m=g.elementFromPoint(f,c);m&&!n.contentDOM.contains(m)&&(m=null),m||(f=Math.max(o.left+1,Math.min(o.right-1,f)),m=g.elementFromPoint(f,c),m&&!n.contentDOM.contains(m)&&(m=null));let b,y=-1;if(m&&((s=n.docView.nearest(m))===null||s===void 0?void 0:s.isEditable)!=!1){if(p.caretPositionFromPoint){let x=p.caretPositionFromPoint(f,c);x&&({offsetNode:b,offset:y}=x)}else if(p.caretRangeFromPoint){let x=p.caretRangeFromPoint(f,c);x&&({startContainer:b,startOffset:y}=x,(!n.contentDOM.contains(b)||P.safari&&Vp(b,y,f)||P.chrome&&zp(b,y,f))&&(b=void 0))}b&&(y=Math.min(be(b),y))}if(!b||!n.docView.dom.contains(b)){let x=xt.find(n.docView,d);if(!x)return u>a.top+a.height/2?a.to:a.from;({node:b,offset:y}=sl(x.dom,f,c))}let w=n.docView.nearest(b);if(!w)return null;if(w.isWidget&&((r=w.dom)===null||r===void 0?void 0:r.nodeType)==1){let x=w.dom.getBoundingClientRect();return t.yn.defaultLineHeight*1.5){let l=n.viewState.heightOracle.textHeight,a=Math.floor((s-e.top-(n.defaultLineHeight-l)*.5)/l);r+=a*n.viewState.heightOracle.lineLength}let o=n.state.sliceDoc(e.from,e.to);return e.from+$h(o,r,n.state.tabSize)}function Vp(n,t,e){let i;if(n.nodeType!=3||t!=(i=n.nodeValue.length))return!1;for(let s=n.nextSibling;s;s=s.nextSibling)if(s.nodeType!=1||s.nodeName!="BR")return!1;return Ci(n,i-1,i).getBoundingClientRect().left>e}function zp(n,t,e){if(t!=0)return!1;for(let s=n;;){let r=s.parentNode;if(!r||r.nodeType!=1||r.firstChild!=s)return!1;if(r.classList.contains("cm-line"))break;s=r}let i=n.nodeType==1?n.getBoundingClientRect():Ci(n,0,Math.max(n.nodeValue.length,1)).getBoundingClientRect();return e-i.left>5}function Wp(n,t,e){let i=n.lineBlockAt(t);if(Array.isArray(i.type)){let s;for(let r of i.type){if(r.from>t)break;if(!(r.tot)return r;(!s||r.type==ge.Text&&(s.type!=r.type||(e<0?r.fromt)))&&(s=r)}}return s||i}return i}function qp(n,t,e,i){let s=Wp(n,t.head,t.assoc||-1),r=!i||s.type!=ge.Text||!(n.lineWrapping||s.widgetLineBreaks)?null:n.coordsAtPos(t.assoc<0&&t.head>s.from?t.head-1:t.head);if(r){let o=n.dom.getBoundingClientRect(),l=n.textDirectionAt(s.from),a=n.posAtCoords({x:e==(l==gt.LTR)?o.right-1:o.left+1,y:(r.top+r.bottom)/2});if(a!=null)return I.cursor(a,e?-1:1)}return I.cursor(e?s.to:s.from,e?-1:1)}function hf(n,t,e,i){let s=n.state.doc.lineAt(t.head),r=n.bidiSpans(s),o=n.textDirectionAt(s.from);for(let l=t,a=null;;){let h=Mp(s,r,o,l,e),f=Gf;if(!h){if(s.number==(e?n.state.doc.lines:1))return l;f=`\n`,s=n.state.doc.line(s.number+(e?1:-1)),r=n.bidiSpans(s),h=n.visualLineSide(s,!e)}if(a){if(!a(f))return l}else{if(!i)return h;a=i(f)}l=h}}function jp(n,t,e){let i=n.state.charCategorizer(t),s=i(e);return r=>{let o=i(r);return s==fe.Space&&(s=o),s==o}}function Gp(n,t,e,i){let s=t.head,r=e?1:-1;if(s==(e?n.state.doc.length:0))return I.cursor(s,t.assoc);let o=t.goalColumn,l,a=n.contentDOM.getBoundingClientRect(),h=n.coordsAtPos(s,t.assoc||-1),f=n.documentTop;if(h)o==null&&(o=h.left-a.left),l=r<0?h.top:h.bottom;else{let d=n.viewState.lineBlockAt(s);o==null&&(o=Math.min(a.right-a.left,n.defaultCharacterWidth*(s-d.from))),l=(r<0?d.top:d.bottom)+f}let c=a.left+o,u=i!=null?i:n.viewState.heightOracle.textHeight>>1;for(let d=0;;d+=10){let p=l+(u+d)*r,g=lc(n,{x:c,y:p},!1,r);if(pa.bottom||(r<0?gs)){let m=n.docView.coordsForChar(g),b=!m||p{if(t>r&&ts(n)),e.from,t.head>e.from?-1:1);return i==e.from?e:I.cursor(i,ir)&&this.lineBreak(),s=o}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,s=this.lineSeparator?null:/\\r\\n?|\\n/g;;){let r=-1,o=1,l;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(l=s.exec(e))&&(r=l.index,o=l[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let a of this.points)a.node==t&&a.pos>this.text.length&&(a.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=J.get(t),i=e&&e.overrideDOMText;if(i!=null){this.findPointInside(t,i.length);for(let s=i.iter();!s.next().done;)s.lineBreak?this.lineBreak():this.append(s.value)}else t.nodeType==3?this.readTextNode(t):t.nodeName=="BR"?t.nextSibling&&this.lineBreak():t.nodeType==1&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(t.nodeType==3?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+($p(t,i.node,i.offset)?e:0))}};function $p(n,t,e){for(;;){if(!t||e-1;let{impreciseHead:r,impreciseAnchor:o}=t.docView;if(t.state.readOnly&&e>-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let l=r||o?[]:Yp(t),a=new nl(l,t.state);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=Xp(l,this.bounds.from)}else{let l=t.observer.selectionRange,a=r&&r.node==l.focusNode&&r.offset==l.focusOffset||!$o(t.contentDOM,l.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(l.focusNode,l.focusOffset),h=o&&o.node==l.anchorNode&&o.offset==l.anchorOffset||!$o(t.contentDOM,l.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(l.anchorNode,l.anchorOffset),f=t.viewport;if((P.ios||P.chrome)&&t.state.selection.main.empty&&a!=h&&(f.from>0||f.toDate.now()-100?n.inputState.lastKeyCode:-1;if(t.bounds){let{from:o,to:l}=t.bounds,a=s.from,h=null;(r===8||P.android&&t.text.length=s.from&&e.to<=s.to&&(e.from!=s.from||e.to!=s.to)&&s.to-s.from-(e.to-e.from)<=4?e={from:s.from,to:s.to,insert:n.state.doc.slice(s.from,e.from).append(e.insert).append(n.state.doc.slice(e.to,s.to))}:P.chrome&&e&&e.from==e.to&&e.from==s.head&&e.insert.toString()==`\n `&&n.lineWrapping&&(i&&(i=I.single(i.main.anchor-1,i.main.head-1)),e={from:s.from,to:s.to,insert:q.of([" "])}),e)return Ol(n,e,i,r);if(i&&!i.main.eq(s)){let o=!1,l="select";return n.inputState.lastSelectionTime>Date.now()-50&&(n.inputState.lastSelectionOrigin=="select"&&(o=!0),l=n.inputState.lastSelectionOrigin),n.dispatch({selection:i,scrollIntoView:o,userEvent:l}),!0}else return!1}function Ol(n,t,e,i=-1){if(P.ios&&n.inputState.flushIOSKey(t))return!0;let s=n.state.selection.main;if(P.android&&(t.to==s.to&&(t.from==s.from||t.from==s.from-1&&n.state.sliceDoc(t.from,s.from)==" ")&&t.insert.length==1&&t.insert.lines==2&&Xi(n.contentDOM,"Enter",13)||(t.from==s.from-1&&t.to==s.to&&t.insert.length==0||i==8&&t.insert.lengths.head)&&Xi(n.contentDOM,"Backspace",8)||t.from==s.from&&t.to==s.to+1&&t.insert.length==0&&Xi(n.contentDOM,"Delete",46)))return!0;let r=t.insert.toString();n.inputState.composing>=0&&n.inputState.composing++;let o,l=()=>o||(o=Up(n,t,e));return n.state.facet(Xf).some(a=>a(n,t.from,t.to,r,l))||n.dispatch(l()),!0}function Up(n,t,e){let i,s=n.state,r=s.selection.main;if(t.from>=r.from&&t.to<=r.to&&t.to-t.from>=(r.to-r.from)/3&&(!e||e.main.empty&&e.main.from==t.from+t.insert.length)&&n.inputState.composing<0){let l=r.fromt.to?s.sliceDoc(t.to,r.to):"";i=s.replaceSelection(n.state.toText(l+t.insert.sliceString(0,void 0,n.state.lineBreak)+a))}else{let l=s.changes(t),a=e&&e.main.to<=l.newLength?e.main:void 0;if(s.selection.ranges.length>1&&n.inputState.composing>=0&&t.to<=r.to&&t.to>=r.to-10){let h=n.state.sliceDoc(t.from,t.to),f,c=e&&oc(n,e.main.head);if(c){let p=t.insert.length-(t.to-t.from);f={from:c.from,to:c.to-p}}else f=n.state.doc.lineAt(r.head);let u=r.to-t.to,d=r.to-r.from;i=s.changeByRange(p=>{if(p.from==r.from&&p.to==r.to)return{changes:l,range:a||p.map(l)};let g=p.to-u,m=g-h.length;if(p.to-p.from!=d||n.state.sliceDoc(m,g)!=h||p.to>=f.from&&p.from<=f.to)return{range:p};let b=s.changes({from:m,to:g,insert:t.insert}),y=p.to-r.to;return{changes:b,range:a?I.range(Math.max(0,a.anchor+y),Math.max(0,a.head+y)):p.map(b)}})}else i={changes:l,selection:a&&s.selection.replaceRange(a)}}let o="input.type";return(n.composing||n.inputState.compositionPendingChange&&n.inputState.compositionEndedAt>Date.now()-50)&&(n.inputState.compositionPendingChange=!1,o+=".compose",n.inputState.compositionFirstChange&&(o+=".start",n.inputState.compositionFirstChange=!1)),s.update(i,{userEvent:o,scrollIntoView:!0})}function Kp(n,t,e,i){let s=Math.min(n.length,t.length),r=0;for(;r0&&l>0&&n.charCodeAt(o-1)==t.charCodeAt(l-1);)o--,l--;if(i=="end"){let a=Math.max(0,r-Math.min(o,l));e-=o+a-r}if(o=o?r-e:0;r-=a,l=r+(l-o),o=r}else if(l=l?r-e:0;r-=a,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}function Yp(n){let t=[];if(n.root.activeElement!=n.contentDOM)return t;let{anchorNode:e,anchorOffset:i,focusNode:s,focusOffset:r}=n.observer.selectionRange;return e&&(t.push(new lr(e,i)),(s!=e||r!=i)&&t.push(new lr(s,r))),t}function Xp(n,t){if(n.length==0)return null;let e=n[0].pos,i=n.length==2?n[1].pos:e;return e>-1&&i>-1?I.single(e+t,i+t):null}var ol=class{setSelectionOrigin(t){this.lastSelectionOrigin=t,this.lastSelectionTime=Date.now()}constructor(t){this.view=t,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=t.hasFocus,P.safari&&t.contentDOM.addEventListener("input",()=>null),P.gecko&&ug(t.contentDOM.ownerDocument)}handleEvent(t){!ng(this.view,t)||this.ignoreDuringComposition(t)||t.type=="keydown"&&this.keydown(t)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(t.type,t)):this.runHandlers(t.type,t))}runHandlers(t,e){let i=this.handlers[t];if(i){for(let s of i.observers)s(this.view,e);for(let s of i.handlers){if(e.defaultPrevented)break;if(s(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=Jp(t),i=this.handlers,s=this.view.contentDOM;for(let r in e)if(r!="scroll"){let o=!e[r].handlers.length,l=i[r];l&&o!=!l.handlers.length&&(s.removeEventListener(r,this.handleEvent),l=null),l||s.addEventListener(r,this.handleEvent,{passive:o})}for(let r in i)r!="scroll"&&!e[r]&&s.removeEventListener(r,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),t.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&t.keyCode!=27&&Zp.indexOf(t.keyCode)<0&&(this.tabFocusMode=-1),P.android&&P.chrome&&!t.synthetic&&(t.keyCode==13||t.keyCode==8))return this.view.observer.delayAndroidKey(t.key,t.keyCode),!0;let e;return P.ios&&!t.synthetic&&!t.altKey&&!t.metaKey&&((e=hc.find(i=>i.keyCode==t.keyCode))&&!t.ctrlKey||Qp.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(this.pendingIOSKey=e||t,setTimeout(()=>this.flushIOSKey(),250),!0):(t.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(t){let e=this.pendingIOSKey;return!e||e.key=="Enter"&&t&&t.from0?!0:P.safari&&!P.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1:!1}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.view.observer.update(t),this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function ff(n,t){return(e,i)=>{try{return t.call(n,i,e)}catch(s){ne(e.state,s)}}}function Jp(n){let t=Object.create(null);function e(i){return t[i]||(t[i]={observers:[],handlers:[]})}for(let i of n){let s=i.spec;if(s&&s.domEventHandlers)for(let r in s.domEventHandlers){let o=s.domEventHandlers[r];o&&e(r).handlers.push(ff(i.value,o))}if(s&&s.domEventObservers)for(let r in s.domEventObservers){let o=s.domEventObservers[r];o&&e(r).observers.push(ff(i.value,o))}}for(let i in re)e(i).handlers.push(re[i]);for(let i in Qt)e(i).observers.push(Qt[i]);return t}var hc=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],Qp="dthko",Zp=[16,17,18,20,91,92,224,225],$n=6;function Un(n){return Math.max(0,n)*.7+8}function tg(n,t){return Math.max(Math.abs(n.clientX-t.clientX),Math.abs(n.clientY-t.clientY))}var ll=class{constructor(t,e,i,s){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=s,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParents=fp(t.contentDOM),this.atoms=t.state.facet(Ml).map(o=>o(t));let r=t.contentDOM.ownerDocument;r.addEventListener("mousemove",this.move=this.move.bind(this)),r.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(nt.allowMultipleSelections)&&eg(t,e),this.dragging=sg(t,e)&&uc(e)==1?null:!1}start(t){this.dragging===!1&&this.select(t)}move(t){if(t.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&tg(this.startEvent,t)<10)return;this.select(this.lastEvent=t);let e=0,i=0,s=0,r=0,o=this.view.win.innerWidth,l=this.view.win.innerHeight;this.scrollParents.x&&({left:s,right:o}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:r,bottom:l}=this.scrollParents.y.getBoundingClientRect());let a=rc(this.view);t.clientX-a.left<=s+$n?e=-Un(s-t.clientX):t.clientX+a.right>=o-$n&&(e=Un(t.clientX-o)),t.clientY-a.top<=r+$n?i=-Un(r-t.clientY):t.clientY+a.bottom>=l-$n&&(i=Un(t.clientY-l)),this.setScrollSpeed(e,i)}up(t){this.dragging==null&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:t,y:e}=this.scrollSpeed;t&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=t,t=0),e&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=e,e=0),(t||e)&&this.view.win.scrollBy(t,e),this.dragging===!1&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;ie.isUserEvent("input.type"))?this.destroy():this.style.update(t)&&setTimeout(()=>this.select(this.lastEvent),20)}};function eg(n,t){let e=n.state.facet($f);return e.length?e[0](t):P.mac?t.metaKey:t.ctrlKey}function ig(n,t){let e=n.state.facet(Uf);return e.length?e[0](t):P.mac?!t.altKey:!t.ctrlKey}function sg(n,t){let{main:e}=n.state.selection;if(e.empty)return!1;let i=Ls(n.root);if(!i||i.rangeCount==0)return!0;let s=i.getRangeAt(0).getClientRects();for(let r=0;r=t.clientX&&o.top<=t.clientY&&o.bottom>=t.clientY)return!0}return!1}function ng(n,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let e=t.target,i;e!=n.contentDOM;e=e.parentNode)if(!e||e.nodeType==11||(i=J.get(e))&&i.ignoreEvent(t))return!1;return!0}var re=Object.create(null),Qt=Object.create(null),fc=P.ie&&P.ie_version<15||P.ios&&P.webkit_version<604;function rg(n){let t=n.dom.parentNode;if(!t)return;let e=t.appendChild(document.createElement("textarea"));e.style.cssText="position: fixed; left: -10000px; top: 10px",e.focus(),setTimeout(()=>{n.focus(),e.remove(),cc(n,e.value)},50)}function pr(n,t,e){for(let i of n.facet(t))e=i(e,n);return e}function cc(n,t){t=pr(n.state,Sl,t);let{state:e}=n,i,s=1,r=e.toText(t),o=r.lines==e.selection.ranges.length;if(al!=null&&e.selection.ranges.every(a=>a.empty)&&al==r.toString()){let a=-1;i=e.changeByRange(h=>{let f=e.doc.lineAt(h.from);if(f.from==a)return{range:h};a=f.from;let c=e.toText((o?r.line(s++).text:t)+e.lineBreak);return{changes:{from:f.from,insert:c},range:I.cursor(h.from+c.length)}})}else o?i=e.changeByRange(a=>{let h=r.line(s++);return{changes:{from:a.from,to:a.to,insert:h.text},range:I.cursor(a.from+h.length)}}):i=e.replaceSelection(r);n.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}Qt.scroll=n=>{n.inputState.lastScrollTop=n.scrollDOM.scrollTop,n.inputState.lastScrollLeft=n.scrollDOM.scrollLeft};re.keydown=(n,t)=>(n.inputState.setSelectionOrigin("select"),t.keyCode==27&&n.inputState.tabFocusMode!=0&&(n.inputState.tabFocusMode=Date.now()+2e3),!1);Qt.touchstart=(n,t)=>{n.inputState.lastTouchTime=Date.now(),n.inputState.setSelectionOrigin("select.pointer")};Qt.touchmove=n=>{n.inputState.setSelectionOrigin("select.pointer")};re.mousedown=(n,t)=>{if(n.observer.flush(),n.inputState.lastTouchTime>Date.now()-2e3)return!1;let e=null;for(let i of n.state.facet(Kf))if(e=i(n,t),e)break;if(!e&&t.button==0&&(e=ag(n,t)),e){let i=!n.hasFocus;n.inputState.startMouseSelection(new ll(n,t,e,i)),i&&n.observer.ignore(()=>{Tf(n.contentDOM);let r=n.root.activeElement;r&&!r.contains(n.contentDOM)&&r.blur()});let s=n.inputState.mouseSelection;if(s)return s.start(t),s.dragging===!1}return!1};function cf(n,t,e,i){if(i==1)return I.cursor(t,e);if(i==2)return _p(n.state,t,e);{let s=xt.find(n.docView,t),r=n.state.doc.lineAt(s?s.posAtEnd:t),o=s?s.posAtStart:r.from,l=s?s.posAtEnd:r.to;return lt>=e.top&&t<=e.bottom&&n>=e.left&&n<=e.right;function og(n,t,e,i){let s=xt.find(n.docView,t);if(!s)return 1;let r=t-s.posAtStart;if(r==0)return 1;if(r==s.length)return-1;let o=s.coordsAt(r,-1);if(o&&uf(e,i,o))return-1;let l=s.coordsAt(r,1);return l&&uf(e,i,l)?1:o&&o.bottom>=i?-1:1}function df(n,t){let e=n.posAtCoords({x:t.clientX,y:t.clientY},!1);return{pos:e,bias:og(n,e,t.clientX,t.clientY)}}var lg=P.ie&&P.ie_version<=11,pf=null,gf=0,mf=0;function uc(n){if(!lg)return n.detail;let t=pf,e=mf;return pf=n,mf=Date.now(),gf=!t||e>Date.now()-400&&Math.abs(t.clientX-n.clientX)<2&&Math.abs(t.clientY-n.clientY)<2?(gf+1)%3:1}function ag(n,t){let e=df(n,t),i=uc(t),s=n.state.selection;return{update(r){r.docChanged&&(e.pos=r.changes.mapPos(e.pos),s=s.map(r.changes))},get(r,o,l){let a=df(n,r),h,f=cf(n,a.pos,a.bias,i);if(e.pos!=a.pos&&!o){let c=cf(n,e.pos,e.bias,i),u=Math.min(c.from,f.from),d=Math.max(c.to,f.to);f=u1&&(h=hg(s,a.pos))?h:l?s.addRange(f):I.create([f])}}}function hg(n,t){for(let e=0;e=t)return I.create(n.ranges.slice(0,e).concat(n.ranges.slice(e+1)),n.mainIndex==e?0:n.mainIndex-(n.mainIndex>e?1:0))}return null}re.dragstart=(n,t)=>{let{selection:{main:e}}=n.state;if(t.target.draggable){let s=n.docView.nearest(t.target);if(s&&s.isWidget){let r=s.posAtStart,o=r+s.length;(r>=e.to||o<=e.from)&&(e=I.range(r,o))}}let{inputState:i}=n;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=e,t.dataTransfer&&(t.dataTransfer.setData("Text",pr(n.state,Cl,n.state.sliceDoc(e.from,e.to))),t.dataTransfer.effectAllowed="copyMove"),!1};re.dragend=n=>(n.inputState.draggedContent=null,!1);function bf(n,t,e,i){if(e=pr(n.state,Sl,e),!e)return;let s=n.posAtCoords({x:t.clientX,y:t.clientY},!1),{draggedContent:r}=n.inputState,o=i&&r&&ig(n,t)?{from:r.from,to:r.to}:null,l={from:s,insert:e},a=n.state.changes(o?[o,l]:l);n.focus(),n.dispatch({changes:a,selection:{anchor:a.mapPos(s,-1),head:a.mapPos(s,1)},userEvent:o?"move.drop":"input.drop"}),n.inputState.draggedContent=null}re.drop=(n,t)=>{if(!t.dataTransfer)return!1;if(n.state.readOnly)return!0;let e=t.dataTransfer.files;if(e&&e.length){let i=Array(e.length),s=0,r=()=>{++s==e.length&&bf(n,t,i.filter(o=>o!=null).join(n.state.lineBreak),!1)};for(let o=0;o{/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(l.result)||(i[o]=l.result),r()},l.readAsText(e[o])}return!0}else{let i=t.dataTransfer.getData("Text");if(i)return bf(n,t,i,!0),!0}return!1};re.paste=(n,t)=>{if(n.state.readOnly)return!0;n.observer.flush();let e=fc?null:t.clipboardData;return e?(cc(n,e.getData("text/plain")||e.getData("text/uri-list")),!0):(rg(n),!1)};function fg(n,t){let e=n.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=t,i.focus(),i.selectionEnd=t.length,i.selectionStart=0,setTimeout(()=>{i.remove(),n.focus()},50)}function cg(n){let t=[],e=[],i=!1;for(let s of n.selection.ranges)s.empty||(t.push(n.sliceDoc(s.from,s.to)),e.push(s));if(!t.length){let s=-1;for(let{from:r}of n.selection.ranges){let o=n.doc.lineAt(r);o.number>s&&(t.push(o.text),e.push({from:o.from,to:Math.min(n.doc.length,o.to+1)})),s=o.number}i=!0}return{text:pr(n,Cl,t.join(n.lineBreak)),ranges:e,linewise:i}}var al=null;re.copy=re.cut=(n,t)=>{let{text:e,ranges:i,linewise:s}=cg(n.state);if(!e&&!s)return!1;al=s?e:null,t.type=="cut"&&!n.state.readOnly&&n.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let r=fc?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",e),!0):(fg(n,e),!1)};var dc=He.define();function pc(n,t){let e=[];for(let i of n.facet(Jf)){let s=i(n,t);s&&e.push(s)}return e.length?n.update({effects:e,annotations:dc.of(!0)}):null}function gc(n){setTimeout(()=>{let t=n.hasFocus;if(t!=n.inputState.notifiedFocused){let e=pc(n.state,t);e?n.dispatch(e):n.update([])}},10)}Qt.focus=n=>{n.inputState.lastFocusTime=Date.now(),!n.scrollDOM.scrollTop&&(n.inputState.lastScrollTop||n.inputState.lastScrollLeft)&&(n.scrollDOM.scrollTop=n.inputState.lastScrollTop,n.scrollDOM.scrollLeft=n.inputState.lastScrollLeft),gc(n)};Qt.blur=n=>{n.observer.clearSelectionRange(),gc(n)};Qt.compositionstart=Qt.compositionupdate=n=>{n.observer.editContext||(n.inputState.compositionFirstChange==null&&(n.inputState.compositionFirstChange=!0),n.inputState.composing<0&&(n.inputState.composing=0))};Qt.compositionend=n=>{n.observer.editContext||(n.inputState.composing=-1,n.inputState.compositionEndedAt=Date.now(),n.inputState.compositionPendingKey=!0,n.inputState.compositionPendingChange=n.observer.pendingRecords().length>0,n.inputState.compositionFirstChange=null,P.chrome&&P.android?n.observer.flushSoon():n.inputState.compositionPendingChange?Promise.resolve().then(()=>n.observer.flush()):setTimeout(()=>{n.inputState.composing<0&&n.docView.hasComposition&&n.update([])},50))};Qt.contextmenu=n=>{n.inputState.lastContextMenu=Date.now()};re.beforeinput=(n,t)=>{var e,i;if(t.inputType=="insertReplacementText"&&n.observer.editContext){let r=(e=t.dataTransfer)===null||e===void 0?void 0:e.getData("text/plain"),o=t.getTargetRanges();if(r&&o.length){let l=o[0],a=n.posAtDOM(l.startContainer,l.startOffset),h=n.posAtDOM(l.endContainer,l.endOffset);return Ol(n,{from:a,to:h,insert:n.state.toText(r)},null),!0}}let s;if(P.chrome&&P.android&&(s=hc.find(r=>r.inputType==t.inputType))&&(n.observer.delayAndroidKey(s.key,s.keyCode),s.key=="Backspace"||s.key=="Delete")){let r=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var o;(((o=window.visualViewport)===null||o===void 0?void 0:o.height)||0)>r+10&&n.hasFocus&&(n.contentDOM.blur(),n.focus())},100)}return P.ios&&t.inputType=="deleteContentForward"&&n.observer.flushSoon(),P.safari&&t.inputType=="insertText"&&n.inputState.composing>=0&&setTimeout(()=>Qt.compositionend(n,t),20),!1};var yf=new Set;function ug(n){yf.has(n)||(yf.add(n),n.addEventListener("copy",()=>{}),n.addEventListener("cut",()=>{}))}var wf=["pre-wrap","normal","pre-line","break-spaces"],Zi=!1;function xf(){Zi=!1}var hl=class{constructor(t){this.lineWrapping=t,this.doc=q.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){return this.lineWrapping?(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return wf.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=l;if(this.lineWrapping=l,this.lineHeight=e,this.charWidth=i,this.textHeight=s,this.lineLength=r,a){this.heightSamples={};for(let h=0;h0}set outdated(t){this.flags=(t?2:0)|this.flags&-3}setHeight(t){this.height!=t&&(Math.abs(this.height-t)>tr&&(Zi=!0),this.height=t)}replace(t,e,i){return n.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,s){let r=this,o=i.doc;for(let l=s.length-1;l>=0;l--){let{fromA:a,toA:h,fromB:f,toB:c}=s[l],u=r.lineAt(a,Z.ByPosNoHeight,i.setDoc(e),0,0),d=u.to>=h?u:r.lineAt(h,Z.ByPosNoHeight,i,0,0);for(c+=d.to-h,h=d.to;l>0&&u.from<=s[l-1].toA;)a=s[l-1].fromA,f=s[l-1].fromB,l--,ar*2){let l=t[e-1];l.break?t.splice(--e,1,l.left,null,l.right):t.splice(--e,1,l.left,l.right),i+=1+l.break,s-=l.size}else if(r>s*2){let l=t[i];l.break?t.splice(i,1,l.left,null,l.right):t.splice(i,1,l.left,l.right),i+=2+l.break,r-=l.size}else break;else if(s=r&&o(this.blockAt(0,i,s,r))}updateHeight(t,e=0,i=!1,s){return s&&s.from<=e&&s.more&&this.setHeight(s.heights[s.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}},Jt=class n extends hr{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,s){return new de(s,this.length,i,this.height,this.breaks)}replace(t,e,i){let s=i[0];return i.length==1&&(s instanceof n||s instanceof Ze&&s.flags&4)&&Math.abs(this.length-s.length)<10?(s instanceof Ze?s=new n(s.length,this.height):s.height=this.height,this.outdated||(s.outdated=!1),s):Vt.of(i)}updateHeight(t,e=0,i=!1,s){return s&&s.from<=e&&s.more?this.setHeight(s.heights[s.index++]):(i||this.outdated)&&this.setHeight(Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},Ze=class n extends Vt{constructor(t){super(t,0)}heightMetrics(t,e){let i=t.doc.lineAt(e).number,s=t.doc.lineAt(e+this.length).number,r=s-i+1,o,l=0;if(t.lineWrapping){let a=Math.min(this.height,t.lineHeight*r);o=a/r,this.length>r+1&&(l=(this.height-a)/(this.length-r-1))}else o=this.height/r;return{firstLine:i,lastLine:s,perLine:o,perChar:l}}blockAt(t,e,i,s){let{firstLine:r,lastLine:o,perLine:l,perChar:a}=this.heightMetrics(e,s);if(e.lineWrapping){let h=s+(t0){let r=i[i.length-1];r instanceof n?i[i.length-1]=new n(r.length+s):i.push(null,new n(s-1))}if(t>0){let r=i[0];r instanceof n?i[0]=new n(t+r.length):i.unshift(new n(t-1),null)}return Vt.of(i)}decomposeLeft(t,e){e.push(new n(t-1),null)}decomposeRight(t,e){e.push(null,new n(this.length-t-1))}updateHeight(t,e=0,i=!1,s){let r=e+this.length;if(s&&s.from<=e+this.length&&s.more){let o=[],l=Math.max(e,s.from),a=-1;for(s.from>e&&o.push(new n(s.from-e-1).updateHeight(t,e));l<=r&&s.more;){let f=t.doc.lineAt(l).length;o.length&&o.push(null);let c=s.heights[s.index++];a==-1?a=c:Math.abs(c-a)>=tr&&(a=-2);let u=new Jt(f,c);u.outdated=!1,o.push(u),l+=f+1}l<=r&&o.push(null,new n(r-l).updateHeight(t,l));let h=Vt.of(o);return(a<0||Math.abs(h.height-this.height)>=tr||Math.abs(a-this.heightMetrics(t,e).perLine)>=tr)&&(Zi=!0),ar(this,h)}else(i||this.outdated)&&(this.setHeight(t.heightForGap(e,e+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},cl=class extends Vt{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return this.flags&1}blockAt(t,e,i,s){let r=i+this.left.height;return tl))return h;let f=e==Z.ByPosNoHeight?Z.ByPosNoHeight:Z.ByPos;return a?h.join(this.right.lineAt(l,f,i,o,l)):this.left.lineAt(l,f,i,s,r).join(h)}forEachLine(t,e,i,s,r,o){let l=s+this.left.height,a=r+this.left.length+this.break;if(this.break)t=a&&this.right.forEachLine(t,e,i,l,a,o);else{let h=this.lineAt(a,Z.ByPos,i,s,r);t=t&&h.from<=e&&o(h),e>h.to&&this.right.forEachLine(h.to+1,e,i,l,a,o)}}replace(t,e,i){let s=this.left.length+this.break;if(ethis.left.length)return this.balanced(this.left,this.right.replace(t-s,e-s,i));let r=[];t>0&&this.decomposeLeft(t,r);let o=r.length;for(let l of i)r.push(l);if(t>0&&kf(r,o-1),e=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,s=i+this.break;if(t>=s)return this.right.decomposeRight(t-s,e);t2*e.size||e.size>2*t.size?Vt.of(this.break?[t,null,e]:[t,e]):(this.left=ar(this.left,t),this.right=ar(this.right,e),this.setHeight(t.height+e.height),this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,s){let{left:r,right:o}=this,l=e+r.length+this.break,a=null;return s&&s.from<=e+r.length&&s.more?a=r=r.updateHeight(t,e,i,s):r.updateHeight(t,e,i),s&&s.from<=l+o.length&&s.more?a=o=o.updateHeight(t,l,i,s):o.updateHeight(t,l,i),a?this.balanced(r,o):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function kf(n,t){let e,i;n[t]==null&&(e=n[t-1])instanceof Ze&&(i=n[t+1])instanceof Ze&&n.splice(t-1,3,new Ze(e.length+1+i.length))}var dg=5,ul=class n{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let i=Math.min(e,this.lineEnd),s=this.nodes[this.nodes.length-1];s instanceof Jt?s.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new Jt(i-this.pos,-1)),this.writtenTo=i,e>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t=dg)&&this.addLineDeco(s,r,o)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTot&&this.nodes.push(new Jt(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new Ze(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof Jt)return t;let e=new Jt(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let s=this.ensureLine();s.length+=i,s.collapsed+=i,s.widgetHeight=Math.max(s.widgetHeight,t),s.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(e instanceof Jt)&&!this.isCovered?this.nodes.push(new Jt(0,-1)):(this.writtenTof.clientHeight||f.scrollWidth>f.clientWidth)&&c.overflow!="visible"){let u=f.getBoundingClientRect();r=Math.max(r,u.left),o=Math.min(o,u.right),l=Math.max(l,u.top),a=Math.min(h==n.parentNode?s.innerHeight:a,u.bottom)}h=c.position=="absolute"||c.position=="fixed"?f.offsetParent:f.parentNode}else if(h.nodeType==11)h=h.host;else break;return{left:r-e.left,right:Math.max(r,o)-e.left,top:l-(e.top+t),bottom:Math.max(l,a)-(e.top+t)}}function mg(n){let t=n.getBoundingClientRect(),e=n.ownerDocument.defaultView||window;return t.left0&&t.top0}function bg(n,t){let e=n.getBoundingClientRect();return{left:0,right:e.right-e.left,top:t,bottom:e.bottom-(e.top+t)}}var Is=class{constructor(t,e,i,s){this.from=t,this.to=e,this.size=i,this.displaySize=s}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new hl(e),this.stateDeco=t.facet(Ws).filter(i=>typeof i!="function"),this.heightMap=Vt.empty().applyChanges(this.stateDeco,q.empty,this.heightOracle.setDoc(t.doc),[new me(0,0,0,t.doc.length)]);for(let i=0;i<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());i++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=pt.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let s=i?e.head:e.anchor;if(!t.some(({from:r,to:o})=>s>=r&&s<=o)){let{from:r,to:o}=this.lineBlockAt(s);t.push(new Yi(r,o))}}return this.viewports=t.sort((i,s)=>i.from-s.from),this.updateScaler()}updateScaler(){let t=this.scaler;return this.scaler=this.heightMap.height<=7e6?vf:new gl(this.heightOracle,this.heightMap,this.viewports),t.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,t=>{this.viewportLines.push(Ps(t,this.scaler))})}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(Ws).filter(f=>typeof f!="function");let s=t.changedRanges,r=me.extendWithRanges(s,pg(i,this.stateDeco,t?t.changes:Ft.empty(this.state.doc.length))),o=this.heightMap.height,l=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);xf(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),r),(this.heightMap.height!=o||Zi)&&(t.flags|=2),l?(this.scrollAnchorPos=t.changes.mapPos(l.from,-1),this.scrollAnchorHeight=l.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=o);let a=r.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let h=a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,t.flags|=this.updateForViewport(),(h||!t.changes.empty||t.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(t.changes),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(Tp)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let e=t.contentDOM,i=window.getComputedStyle(e),s=this.heightOracle,r=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?gt.RTL:gt.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=e.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,f=0;if(l.width&&l.height){let{scaleX:x,scaleY:v}=Of(e,l);(x>.005&&Math.abs(this.scaleX-x)>.005||v>.005&&Math.abs(this.scaleY-v)>.005)&&(this.scaleX=x,this.scaleY=v,h|=16,o=a=!0)}let c=(parseInt(i.paddingTop)||0)*this.scaleY,u=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=c||this.paddingBottom!=u)&&(this.paddingTop=c,this.paddingBottom=u,h|=18),this.editorWidth!=t.scrollDOM.clientWidth&&(s.lineWrapping&&(a=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=16);let d=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=Pf(t.scrollDOM);let p=(this.printing?bg:gg)(e,this.paddingTop),g=p.top-this.pixelViewport.top,m=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let b=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(b!=this.inView&&(this.inView=b,b&&(a=!0)),!this.inView&&!this.scrollTarget&&!mg(t.dom))return 0;let y=l.width;if((this.contentDOMWidth!=y||this.editorHeight!=t.scrollDOM.clientHeight)&&(this.contentDOMWidth=l.width,this.editorHeight=t.scrollDOM.clientHeight,h|=16),a){let x=t.docView.measureVisibleLineHeights(this.viewport);if(s.mustRefreshForHeights(x)&&(o=!0),o||s.lineWrapping&&Math.abs(y-this.contentDOMWidth)>s.charWidth){let{lineHeight:v,charWidth:C,textHeight:k}=t.docView.measureTextSize();o=v>0&&s.refresh(r,v,C,k,y/C,x),o&&(t.docView.minWidth=0,h|=16)}g>0&&m>0?f=Math.max(g,m):g<0&&m<0&&(f=Math.min(g,m)),xf();for(let v of this.viewports){let C=v.from==this.viewport.from?x:t.docView.measureVisibleLineHeights(v);this.heightMap=(o?Vt.empty().applyChanges(this.stateDeco,q.empty,this.heightOracle,[new me(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(s,0,o,new fl(v.from,C))}Zi&&(h|=2)}let w=!this.viewportIsAppropriate(this.viewport,f)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return w&&(h&2&&(h|=this.updateScaler()),this.viewport=this.getViewport(f,this.scrollTarget),h|=this.updateForViewport()),(h&2||w)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),s=this.heightMap,r=this.heightOracle,{visibleTop:o,visibleBottom:l}=this,a=new Yi(s.lineAt(o-i*1e3,Z.ByHeight,r,0,0).from,s.lineAt(l+(1-i)*1e3,Z.ByHeight,r,0,0).to);if(e){let{head:h}=e.range;if(ha.to){let f=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),c=s.lineAt(h,Z.ByPos,r,0,0),u;e.y=="center"?u=(c.top+c.bottom)/2-f/2:e.y=="start"||e.y=="nearest"&&h=l+Math.max(10,Math.min(i,250)))&&s>o-2*1e3&&r>1,o=s<<1;if(this.defaultTextDirection!=gt.LTR&&!i)return[];let l=[],a=(f,c,u,d)=>{if(c-ff&&bb.from>=u.from&&b.to<=u.to&&Math.abs(b.from-f)b.fromy));if(!m){if(cw.from<=c&&w.to>=c)){let w=e.moveToLineBoundary(I.cursor(c),!1,!0).head;w>f&&(c=w)}let b=this.gapSize(u,f,c,d),y=i||b<2e6?b:2e6;m=new Is(f,c,b,y)}l.push(m)},h=f=>{if(f.length2e6)for(let C of t)C.from>=f.from&&C.fromf.from&&a(f.from,d,f,c),pe.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(t){let e=this.stateDeco;this.lineGaps.length&&(e=e.concat(this.lineGapDeco));let i=[];lt.spans(e,this.viewport.from,this.viewport.to,{span(r,o){i.push({from:r,to:o})},point(){}},20);let s=0;if(i.length!=this.visibleRanges.length)s=12;else for(let r=0;r=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find(e=>e.from<=t&&e.to>=t)||Ps(this.heightMap.lineAt(t,Z.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return t>=this.viewportLines[0].top&&t<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(e=>e.top<=t&&e.bottom>=t)||Ps(this.heightMap.lineAt(this.scaler.fromDOM(t),Z.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return Ps(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},Yi=class{constructor(t,e){this.from=t,this.to=e}};function yg(n,t,e){let i=[],s=n,r=0;return lt.spans(e,n,t,{span(){},point(o,l){o>s&&(i.push({from:s,to:o}),r+=o-s),s=l}},20),s=1)return t[t.length-1].to;let i=Math.floor(n*e);for(let s=0;;s++){let{from:r,to:o}=t[s],l=o-r;if(i<=l)return r+i;i-=l}}function Yn(n,t){let e=0;for(let{from:i,to:s}of n.ranges){if(t<=s){e+=t-i;break}e+=s-i}return e/n.total}function wg(n,t){for(let e of n)if(t(e))return e}var vf={toDOM(n){return n},fromDOM(n){return n},scale:1,eq(n){return n==this}},gl=class n{constructor(t,e,i){let s=0,r=0,o=0;this.viewports=i.map(({from:l,to:a})=>{let h=e.lineAt(l,Z.ByPos,t,0,0).top,f=e.lineAt(a,Z.ByPos,t,0,0).bottom;return s+=f-h,{from:l,to:a,top:h,bottom:f,domTop:0,domBottom:0}}),this.scale=(7e6-s)/(e.height-s);for(let l of this.viewports)l.domTop=o+(l.top-r)*this.scale,o=l.domBottom=l.domTop+(l.bottom-l.top),r=l.bottom}toDOM(t){for(let e=0,i=0,s=0;;e++){let r=ee.from==t.viewports[i].from&&e.to==t.viewports[i].to):!1}};function Ps(n,t){if(t.scale==1)return n;let e=t.toDOM(n.top),i=t.toDOM(n.bottom);return new de(n.from,n.length,e,i-e,Array.isArray(n._content)?n._content.map(s=>Ps(s,t)):n._content)}var Xn=B.define({combine:n=>n.join(" ")}),ml=B.define({combine:n=>n.indexOf(!0)>-1}),bl=Xt.newName(),mc=Xt.newName(),bc=Xt.newName(),yc={"&light":"."+mc,"&dark":"."+bc};function yl(n,t,e){return new Xt(t,{finish(i){return/&/.test(i)?i.replace(/&\\w*/,s=>{if(s=="&")return n;if(!e||!e[s])throw new RangeError(`Unsupported selector: ${s}`);return e[s]}):n+" "+i}})}var xg=yl("."+bl,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url(\'data:image/svg+xml,\')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},yc),kg={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Go=P.ie&&P.ie_version<=11,wl=class{constructor(t){this.view=t,this.active=!1,this.editContext=null,this.selectionRange=new Uo,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver(e=>{for(let i of e)this.queue.push(i);(P.ie&&P.ie_version<=11||P.ios&&t.composing)&&e.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&t.constructor.EDIT_CONTEXT!==!1&&!(P.chrome&&P.chrome_version<126)&&(this.editContext=new xl(t),t.state.facet(ze)&&(t.contentDOM.editContext=this.editContext.editContext)),Go&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var e;((e=this.view.docView)===null||e===void 0?void 0:e.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(t){(t.type=="change"||!t.type)&&!t.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some((e,i)=>e!=t[i]))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,s=this.selectionRange;if(i.state.facet(ze)?i.root.activeElement!=this.dom:!Jn(this.dom,s))return;let r=s.anchorNode&&i.docView.nearest(s.anchorNode);if(r&&r.ignoreEvent(t)){e||(this.selectionChanged=!1);return}(P.ie&&P.ie_version<=11||P.android&&P.chrome)&&!i.state.selection.main.empty&&s.focusNode&&Es(s.focusNode,s.focusOffset,s.anchorNode,s.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=Ls(t.root);if(!e)return!1;let i=P.safari&&t.root.nodeType==11&&t.root.activeElement==this.dom&&vg(this.view,e)||e;if(!i||this.selectionRange.eq(i))return!1;let s=Jn(this.dom,i);return s&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime{let r=this.delayedAndroidKey;r&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=r.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&r.force&&Xi(this.dom,r.key,r.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(s)}(!this.delayedAndroidKey||t=="Enter")&&(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,s=!1;for(let r of t){let o=this.readMutation(r);o&&(o.typeOver&&(s=!0),e==-1?{from:e,to:i}=o:(e=Math.min(o.from,e),i=Math.max(o.to,i)))}return{from:e,to:i,typeOver:s}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),s=this.selectionChanged&&Jn(this.dom,this.selectionRange);if(t<0&&!s)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let r=new rl(this.view,t,e,i);return this.view.docView.domChanged={newSel:r.newSel?r.newSel.main:null},r}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,s=ac(this.view,e);return this.view.state==i&&(e.domChanged||e.newSel&&!e.newSel.main.eq(this.view.state.selection.main))&&this.view.update([]),s}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty(t.type=="attributes"),t.type=="attributes"&&(e.flags|=4),t.type=="childList"){let i=Sf(e,t.previousSibling||t.target.previousSibling,-1),s=Sf(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:s?e.posBefore(s):e.posAtEnd,typeOver:!1}}else return t.type=="characterData"?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}update(t){this.editContext&&(this.editContext.update(t),t.startState.facet(ze)!=t.state.facet(ze)&&(t.view.contentDOM.editContext=t.state.facet(ze)?this.editContext.editContext:null))}destroy(){var t,e,i;this.stop(),(t=this.intersection)===null||t===void 0||t.disconnect(),(e=this.gapIntersection)===null||e===void 0||e.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let s of this.scrollTargets)s.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function Sf(n,t,e){for(;t;){let i=J.get(t);if(i&&i.parent==n)return i;let s=t.parentNode;t=s!=n.dom?s:e>0?t.nextSibling:t.previousSibling}return null}function Cf(n,t){let e=t.startContainer,i=t.startOffset,s=t.endContainer,r=t.endOffset,o=n.docView.domAtPos(n.state.selection.main.anchor);return Es(o.node,o.offset,s,r)&&([e,i,s,r]=[s,r,e,i]),{anchorNode:e,anchorOffset:i,focusNode:s,focusOffset:r}}function vg(n,t){if(t.getComposedRanges){let s=t.getComposedRanges(n.root)[0];if(s)return Cf(n,s)}let e=null;function i(s){s.preventDefault(),s.stopImmediatePropagation(),e=s.getTargetRanges()[0]}return n.contentDOM.addEventListener("beforeinput",i,!0),n.dom.ownerDocument.execCommand("indent"),n.contentDOM.removeEventListener("beforeinput",i,!0),e?Cf(n,e):null}var xl=class{constructor(t){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(t.state);let e=this.editContext=new window.EditContext({text:t.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,t.state.selection.main.anchor))),selectionEnd:this.toContextPos(t.state.selection.main.head)});this.handlers.textupdate=i=>{let s=t.state.selection.main,{anchor:r,head:o}=s,l=this.toEditorPos(i.updateRangeStart),a=this.toEditorPos(i.updateRangeEnd);t.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:l,drifted:!1});let h={from:l,to:a,insert:q.of(i.text.split(`\n`))};if(h.from==this.from&&rthis.to&&(h.to=r),h.from==h.to&&!h.insert.length){let f=I.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));f.main.eq(s)||t.dispatch({selection:f,userEvent:"select"});return}if((P.mac||P.android)&&h.from==o-1&&/^\\. ?$/.test(i.text)&&t.contentDOM.getAttribute("autocorrect")=="off"&&(h={from:l,to:a,insert:q.of([i.text.replace("."," ")])}),this.pendingContextChange=h,!t.state.readOnly){let f=this.to-this.from+(h.to-h.from+h.insert.length);Ol(t,h,I.single(this.toEditorPos(i.selectionStart,f),this.toEditorPos(i.selectionEnd,f)))}this.pendingContextChange&&(this.revertPending(t.state),this.setSelection(t.state))},this.handlers.characterboundsupdate=i=>{let s=[],r=null;for(let o=this.toEditorPos(i.rangeStart),l=this.toEditorPos(i.rangeEnd);o{let s=[];for(let r of i.getTextFormats()){let o=r.underlineStyle,l=r.underlineThickness;if(o!="None"&&l!="None"){let a=this.toEditorPos(r.rangeStart),h=this.toEditorPos(r.rangeEnd);if(a{t.inputState.composing<0&&(t.inputState.composing=0,t.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(t.inputState.composing=-1,t.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(t.state)}};for(let i in this.handlers)e.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let s=Ls(i.root);s&&s.rangeCount&&this.editContext.updateSelectionBounds(s.getRangeAt(0).getBoundingClientRect())}}}applyEdits(t){let e=0,i=!1,s=this.pendingContextChange;return t.changes.iterChanges((r,o,l,a,h)=>{if(i)return;let f=h.length-(o-r);if(s&&o>=s.to)if(s.from==r&&s.to==o&&s.insert.eq(h)){s=this.pendingContextChange=null,e+=f,this.to+=f;return}else s=null,this.revertPending(t.state);if(r+=e,o+=e,o<=this.from)this.from+=f,this.to+=f;else if(rthis.to||this.to-this.from+h.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(r),this.toContextPos(o),h.toString()),this.to+=f}e+=f}),s&&!i&&this.revertPending(t.state),!i}update(t){let e=this.pendingContextChange,i=t.startState.selection.main;this.composing&&(this.composing.drifted||!t.changes.touchesRange(i.from,i.to)&&t.transactions.some(s=>!s.isUserEvent("input.type")&&s.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=t.changes.mapPos(this.composing.editorBase)):!this.applyEdits(t)||!this.rangeIsValid(t.state)?(this.pendingContextChange=null,this.reset(t.state)):(t.docChanged||t.selectionSet||e)&&this.setSelection(t.state),(t.geometryChanged||t.docChanged||t.selectionSet)&&t.view.requestMeasure(this.measureReq)}resetRange(t){let{head:e}=t.selection.main;this.from=Math.max(0,e-1e4),this.to=Math.min(t.doc.length,e+1e4)}reset(t){this.resetRange(t),this.editContext.updateText(0,this.editContext.text.length,t.doc.sliceString(this.from,this.to)),this.setSelection(t)}revertPending(t){let e=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(e.from),this.toContextPos(e.from+e.insert.length),t.doc.sliceString(e.from,e.to))}setSelection(t){let{main:e}=t.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,e.anchor))),s=this.toContextPos(e.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=s)&&this.editContext.updateSelection(i,s)}rangeIsValid(t){let{head:e}=t.selection.main;return!(this.from>0&&e-this.from<500||this.to1e4*3)}toEditorPos(t,e=this.to-this.from){t=Math.min(t,e);let i=this.composing;return i&&i.drifted?i.editorBase+(t-i.contextBase):t+this.from}toContextPos(t){let e=this.composing;return e&&e.drifted?e.contextBase+(t-e.editorBase):t-this.from}destroy(){for(let t in this.handlers)this.editContext.removeEventListener(t,this.handlers[t])}},j=class n{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){var e;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:i}=t;this.dispatchTransactions=t.dispatchTransactions||i&&(s=>s.forEach(r=>i(r,this)))||(s=>this.update(s)),this.dispatch=this.dispatch.bind(this),this._root=t.root||cp(t.parent)||document,this.viewState=new fr(t.state||nt.create(t)),t.scrollTo&&t.scrollTo.is(Gn)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(Os).map(s=>new Ns(s));for(let s of this.plugins)s.update(this);this.observer=new wl(this),this.inputState=new ol(this),this.inputState.ensureHandlers(this.plugins),this.docView=new or(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((e=document.fonts)===null||e===void 0)&&e.ready&&document.fonts.ready.then(()=>this.requestMeasure())}dispatch(...t){let e=t.length==1&&t[0]instanceof Bt?t:t.length==1&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e=!1,i=!1,s,r=this.state;for(let u of t){if(u.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn\'t start from the previous state.");r=u.state}if(this.destroyed){this.viewState.state=r;return}let o=this.hasFocus,l=0,a=null;t.some(u=>u.annotation(dc))?(this.inputState.notifiedFocused=o,l=1):o!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=o,a=pc(r,o),a||(l=1));let h=this.observer.delayedAndroidKey,f=null;if(h?(this.observer.clearDelayedAndroidKey(),f=this.observer.readChange(),(f&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(f=null)):this.observer.clear(),r.facet(nt.phrases)!=this.state.facet(nt.phrases))return this.setState(r);s=rr.create(this,r,t),s.flags|=l;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let u of t){if(c&&(c=c.map(u.changes)),u.scrollIntoView){let{main:d}=u.state.selection;c=new Bs(d.empty?d:I.cursor(d.head,d.head>d.anchor?-1:1))}for(let d of u.effects)d.is(Gn)&&(c=d.value.clip(this.state))}this.viewState.update(s,c),this.bidiCache=cr.update(this.bidiCache,s.changes),s.empty||(this.updatePlugins(s),this.inputState.update(s)),e=this.docView.update(s),this.state.facet(Ts)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(e,t.some(u=>u.isUserEvent("select.pointer")))}finally{this.updateState=0}if(s.startState.facet(Xn)!=s.state.facet(Xn)&&(this.viewState.mustMeasureContent=!0),(e||i||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),e&&this.docViewUpdate(),!s.empty)for(let u of this.state.facet(il))try{u(s)}catch(d){ne(this.state,d,"update listener")}(a||f)&&Promise.resolve().then(()=>{a&&this.state==a.startState&&this.dispatch(a),f&&!ac(this,f)&&h.force&&Xi(this.contentDOM,h.key,h.keyCode)})}setState(t){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=t;return}this.updateState=2;let e=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new fr(t),this.plugins=t.facet(Os).map(i=>new Ns(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new or(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(Os),i=t.state.facet(Os);if(e!=i){let s=[];for(let r of i){let o=e.indexOf(r);if(o<0)s.push(new Ns(r));else{let l=this.plugins[o];l.mustUpdate=t,s.push(l)}}for(let r of this.plugins)r.mustUpdate!=t&&r.destroy(this);this.plugins=s,this.pluginMap.clear()}else for(let s of this.plugins)s.mustUpdate=t;for(let s=0;s-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,s=i.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:o}=this.viewState;Math.abs(s-this.viewState.scrollTop)>1&&(o=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(o<0)if(Pf(i))r=-1,o=this.viewState.heightMap.height;else{let d=this.viewState.scrollAnchorAt(s);r=d.from,o=d.top}this.updateState=1;let a=this.viewState.measure(this);if(!a&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let h=[];a&4||([this.measureRequests,h]=[h,this.measureRequests]);let f=h.map(d=>{try{return d.read(this)}catch(p){return ne(this.state,p),Af}}),c=rr.create(this,this.state,[]),u=!1;c.flags|=a,e?e.flags|=a:e=c,this.updateState=2,c.empty||(this.updatePlugins(c),this.inputState.update(c),this.updateAttrs(),u=this.docView.update(c),u&&this.docViewUpdate());for(let d=0;d1||p<-1){s=s+p,i.scrollTop=s/this.scaleY,o=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let l of this.state.facet(il))l(e)}get themeClasses(){return bl+" "+(this.state.facet(ml)?bc:mc)+" "+this.state.facet(Xn)}updateAttrs(){let t=Mf(this,ec,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(ze)?"true":"false",class:"cm-content",style:`${P.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),Mf(this,Al,e);let i=this.observer.ignore(()=>{let s=Qo(this.contentDOM,this.contentAttrs,e),r=Qo(this.dom,this.editorAttrs,t);return s||r});return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let s of i.effects)if(s.is(n.announce)){e&&(this.announceDOM.textContent=""),e=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=s.value}}mountStyles(){this.styleModules=this.state.facet(Ts);let t=this.state.facet(n.cspNonce);Xt.mount(this.root,this.styleModules.concat(xg).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn\'t allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),t){if(this.measureRequests.indexOf(t)>-1)return;if(t.key!=null){for(let e=0;ei.spec==t)||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return jo(this,t,hf(this,t,e,i))}moveByGroup(t,e){return jo(this,t,hf(this,t,e,i=>jp(this,t.head,i)))}visualLineSide(t,e){let i=this.bidiSpans(t),s=this.textDirectionAt(t.from),r=i[e?i.length-1:0];return I.cursor(r.side(e,s)+t.from,r.forward(!e,s)?1:-1)}moveToLineBoundary(t,e,i=!0){return qp(this,t,e,i)}moveVertically(t,e,i){return jo(this,t,Gp(this,t,e,i))}domAtPos(t){return this.docView.domAtPos(t)}posAtDOM(t,e=0){return this.docView.posFromDOM(t,e)}posAtCoords(t,e=!0){return this.readMeasured(),lc(this,t,e)}coordsAtPos(t,e=1){this.readMeasured();let i=this.docView.coordsAt(t,e);if(!i||i.left==i.right)return i;let s=this.state.doc.lineAt(t),r=this.bidiSpans(s),o=r[pe.find(r,t-s.from,-1,e)];return ur(i,o.dir==gt.LTR==e>0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(Qf)||tthis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>Sg)return jf(t.length);let e=this.textDirectionAt(t.from),i;for(let r of this.bidiCache)if(r.from==t.from&&r.dir==e&&(r.fresh||qf(r.isolates,i=nf(this,t))))return r.order;i||(i=nf(this,t));let s=Ap(t.text,e,i);return this.bidiCache.push(new cr(t.from,t.to,e,i,!0,s)),s}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||P.safari&&((t=this.inputState)===null||t===void 0?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{Tf(this.contentDOM),this.docView.updateSelection()})}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((t.nodeType==9?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return Gn.of(new Bs(typeof t=="number"?I.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return Gn.of(new Bs(I.cursor(i.from),"start","start",i.top-t,e,!0))}setTabFocusMode(t){t==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof t=="boolean"?this.inputState.tabFocusMode=t?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+t)}static domEventHandlers(t){return Qi.define(()=>({}),{eventHandlers:t})}static domEventObservers(t){return Qi.define(()=>({}),{eventObservers:t})}static theme(t,e){let i=Xt.newName(),s=[Xn.of(i),Ts.of(yl(`.${i}`,t))];return e&&e.dark&&s.push(ml.of(!0)),s}static baseTheme(t){return _o.lowest(Ts.of(yl("."+bl,t,yc)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),s=i&&J.get(i)||J.get(t);return((e=s==null?void 0:s.rootView)===null||e===void 0?void 0:e.view)||null}};j.styleModule=Ts;j.inputHandler=Xf;j.clipboardInputFilter=Sl;j.clipboardOutputFilter=Cl;j.scrollHandler=Zf;j.focusChangeEffect=Jf;j.perLineTextDirection=Qf;j.exceptionSink=Yf;j.updateListener=il;j.editable=ze;j.mouseSelectionStyle=Kf;j.dragMovesSelection=Uf;j.clickAddsSelectionRange=$f;j.decorations=Ws;j.outerDecorations=ic;j.atomicRanges=Ml;j.bidiIsolatedRanges=sc;j.scrollMargins=nc;j.darkTheme=ml;j.cspNonce=B.define({combine:n=>n.length?n[0]:""});j.contentAttributes=Al;j.editorAttributes=ec;j.lineWrapping=j.contentAttributes.of({class:"cm-lineWrapping"});j.announce=it.define();var Sg=4096,Af={},cr=class n{constructor(t,e,i,s,r,o){this.from=t,this.to=e,this.dir=i,this.isolates=s,this.fresh=r,this.order=o}static update(t,e){if(e.empty&&!t.some(r=>r.fresh))return t;let i=[],s=t.length?t[t.length-1].dir:gt.LTR;for(let r=Math.max(0,t.length-10);r=0;s--){let r=i[s],o=typeof r=="function"?r(n):r;o&&Jo(o,e)}return e}var Hb=P.mac?"mac":P.windows?"win":P.linux?"linux":"key";var Fb=/x/.unicode!=null?"gu":"g";var Vb=j.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:`${7*2}px`,position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"\'\'",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}});var We=class extends Fe{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}};We.prototype.elementClass="";We.prototype.toDOM=void 0;We.prototype.mapMode=Rt.TrackBefore;We.prototype.startSide=We.prototype.endSide=-1;We.prototype.point=!0;var Cg=0,qs=class{constructor(t,e){this.from=t,this.to=e}},U=class{constructor(t={}){this.id=Cg++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn\'t define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can\'t add per-node props to node types");return typeof t!="function"&&(t=Zt.match(t)),e=>{let i=t(e);return i===void 0?null:[this,i]}}};U.closedBy=new U({deserialize:n=>n.split(" ")});U.openedBy=new U({deserialize:n=>n.split(" ")});U.group=new U({deserialize:n=>n.split(" ")});U.isolate=new U({deserialize:n=>{if(n&&n!="rtl"&&n!="ltr"&&n!="auto")throw new RangeError("Invalid value for isolate: "+n);return n||"auto"}});U.contextHash=new U({perNode:!0});U.lookAhead=new U({perNode:!0});U.mounted=new U({perNode:!0});var ts=class{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[U.mounted.id]}},Ag=Object.create(null),Zt=class n{constructor(t,e,i,s=0){this.name=t,this.props=e,this.id=i,this.flags=s}static define(t){let e=t.props&&t.props.length?Object.create(null):Ag,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(t.name==null?8:0),s=new n(t.name||"",e,t.id,i);if(t.props){for(let r of t.props)if(Array.isArray(r)||(r=r(s)),r){if(r[0].perNode)throw new RangeError("Can\'t store a per-node prop on a node type");e[r[0].id]=r[1]}}return s}prop(t){return this.props[t.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(t){if(typeof t=="string"){if(this.name==t)return!0;let e=this.prop(U.group);return e?e.indexOf(t)>-1:!1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let s of i.split(" "))e[s]=t[i];return i=>{for(let s=i.prop(U.group),r=-1;r<(s?s.length:0);r++){let o=e[r<0?i.name:s[r]];if(o)return o}}}};Zt.none=new Zt("",Object.create(null),0,8);var gr=new WeakMap,wc=new WeakMap,mt;(function(n){n[n.ExcludeBuffers=1]="ExcludeBuffers",n[n.IncludeAnonymous=2]="IncludeAnonymous",n[n.IgnoreMounts=4]="IgnoreMounts",n[n.IgnoreOverlays=8]="IgnoreOverlays"})(mt||(mt={}));var St=class n{constructor(t,e,i,s,r){if(this.type=t,this.children=e,this.positions=i,this.length=s,this.props=null,r&&r.length){this.props=Object.create(null);for(let[o,l]of r)this.props[typeof o=="number"?o:o.id]=l}}toString(){let t=ts.get(this);if(t&&!t.overlay)return t.tree.toString();let e="";for(let i of this.children){let s=i.toString();s&&(e&&(e+=","),e+=s)}return this.type.name?(/\\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(e.length?"("+e+")":""):e}cursor(t=0){return new $s(this.topNode,t)}cursorAt(t,e=0,i=0){let s=gr.get(this)||this.topNode,r=new $s(s);return r.moveTo(t,e),gr.set(this,r._tree),r}get topNode(){return new we(this,0,0,null)}resolve(t,e=0){let i=js(gr.get(this)||this.topNode,t,e,!1);return gr.set(this,i),i}resolveInner(t,e=0){let i=js(wc.get(this)||this.topNode,t,e,!0);return wc.set(this,i),i}resolveStack(t,e=0){return Mg(this,t,e)}iterate(t){let{enter:e,leave:i,from:s=0,to:r=this.length}=t,o=t.mode||0,l=(o&mt.IncludeAnonymous)>0;for(let a=this.cursor(o|mt.IncludeAnonymous);;){let h=!1;if(a.from<=r&&a.to>=s&&(!l&&a.type.isAnonymous||e(a)!==!1)){if(a.firstChild())continue;h=!0}for(;h&&i&&(l||!a.type.isAnonymous)&&i(a),!a.nextSibling();){if(!a.parent())return;h=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:Nl(Zt.none,this.children,this.positions,0,this.children.length,0,this.length,(e,i,s)=>new n(this.type,e,i,s,this.propValues),t.makeTree||((e,i,s)=>new n(Zt.none,e,i,s)))}static build(t){return Og(t)}};St.empty=new St(Zt.none,[],[],0);var Tl=class n{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new n(this.buffer,this.index)}},si=class n{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return Zt.none}toString(){let t=[];for(let e=0;e0));a=o[a+3]);return l}slice(t,e,i){let s=this.buffer,r=new Uint16Array(e-t),o=0;for(let l=t,a=0;l=t&&et;case 1:return e<=t&&i>t;case 2:return i>t;case 4:return!0}}function js(n,t,e,i){for(var s;n.from==n.to||(e<1?n.from>=t:n.from>t)||(e>-1?n.to<=t:n.to0?l.length:-1;t!=h;t+=e){let f=l[t],c=a[t]+o.from;if(vc(s,i,c,c+f.length)){if(f instanceof si){if(r&mt.ExcludeBuffers)continue;let u=f.findChild(0,f.buffer.length,e,i-c,s);if(u>-1)return new Gs(new Pl(o,f,t,c),null,u)}else if(r&mt.IncludeAnonymous||!f.type.isAnonymous||Bl(f)){let u;if(!(r&mt.IgnoreMounts)&&(u=ts.get(f))&&!u.overlay)return new n(u.tree,c,t,o);let d=new n(f,c,t,o);return r&mt.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(e<0?f.children.length-1:0,e,i,s)}}}if(r&mt.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?t=o.index+e:t=e<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let s;if(!(i&mt.IgnoreOverlays)&&(s=ts.get(this._tree))&&s.overlay){let r=t-this.from;for(let{from:o,to:l}of s.overlay)if((e>0?o<=r:o=r:l>r))return new n(s.tree,s.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function xc(n,t,e,i){let s=n.cursor(),r=[];if(!s.firstChild())return r;if(e!=null){for(let o=!1;!o;)if(o=s.type.is(e),!s.nextSibling())return r}for(;;){if(i!=null&&s.type.is(i))return r;if(s.type.is(t)&&r.push(s.node),!s.nextSibling())return i==null?r:[]}}function Dl(n,t,e=t.length-1){for(let i=n;e>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(t[e]&&t[e]!=i.name)return!1;e--}}return!0}var Pl=class{constructor(t,e,i,s){this.parent=t,this.buffer=e,this.index=i,this.start=s}},Gs=class n extends br{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:s}=this.context,r=s.findChild(this.index+4,s.buffer[this.index+3],t,e-this.context.start,i);return r<0?null:new n(this.context,this,r)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&mt.ExcludeBuffers)return null;let{buffer:s}=this.context,r=s.findChild(this.index+4,s.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return r<0?null:new n(this.context,this,r)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new n(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new n(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,s=this.index+4,r=i.buffer[this.index+3];if(r>s){let o=i.buffer[this.index+1];t.push(i.slice(s,r,o)),e.push(0)}return new St(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Sc(n){if(!n.length)return null;let t=0,e=n[0];for(let r=1;re.from||o.to=t){let l=new we(o.tree,o.overlay[0].from+r.from,-1,r);(s||(s=[i])).push(js(l,t,e,!1))}}return s?Sc(s):i}var $s=class{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof we)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let i=t._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return t?(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0):!1}yieldBuf(t,e){this.index=t;let{start:i,buffer:s}=this.buffer;return this.type=e||s.set.types[s.buffer[t]],this.from=i+s.buffer[t+1],this.to=i+s.buffer[t+2],!0}yield(t){return t?t instanceof we?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,i){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,i,this.mode));let{buffer:s}=this.buffer,r=s.findChild(this.index+4,s.buffer[this.index+3],t,e-this.buffer.start,i);return r<0?!1:(this.stack.push(this.index),this.yieldBuf(r))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,i=this.mode){return this.buffer?i&mt.ExcludeBuffers?!1:this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&mt.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&mt.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode)):!1;let{buffer:e}=this.buffer,i=this.stack.length-1;if(t<0){let s=i<0?0:this.stack[i]+4;if(this.index!=s)return this.yieldBuf(e.findChild(s,this.index,-1,0,4))}else{let s=e.buffer[this.index+3];if(s<(i<0?e.buffer.length:e.buffer[this.stack[i]+3]))return this.yieldBuf(s)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,i,{buffer:s}=this;if(s){if(t>0){if(this.index-1)for(let r=e+t,o=t<0?-1:i._tree.children.length;r!=o;r+=t){let l=i._tree.children[r];if(this.mode&mt.IncludeAnonymous||l instanceof si||!l.type.isAnonymous||Bl(l))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to=0;){for(let o=t;o;o=o._parent)if(o.index==s){if(s==this.index)return o;e=o,i=r+1;break t}s=this.stack[--r]}for(let s=i;s=0;r--){if(r<0)return Dl(this._tree,t,s);let o=i[e.buffer[this.stack[r]]];if(!o.isAnonymous){if(t[s]&&t[s]!=o.name)return!1;s--}}return!0}};function Bl(n){return n.children.some(t=>t instanceof si||!t.type.isAnonymous||Bl(t))}function Og(n){var t;let{buffer:e,nodeSet:i,maxBufferLength:s=1024,reused:r=[],minRepeatType:o=i.types.length}=n,l=Array.isArray(e)?new Tl(e,e.length):e,a=i.types,h=0,f=0;function c(v,C,k,H,R,F){let{id:D,start:S,end:N,size:L}=l,z=f,yt=h;for(;L<0;)if(l.next(),L==-1){let dt=r[D];k.push(dt),H.push(S-v);return}else if(L==-3){h=D;return}else if(L==-4){f=D;return}else throw new RangeError(`Unrecognized record size: ${L}`);let se=a[D],Ne,Ot,xs=S-v;if(N-S<=s&&(Ot=m(l.pos-C,R))){let dt=new Uint16Array(Ot.size-Ot.skip),Q=l.pos-Ot.size,st=dt.length;for(;l.pos>Q;)st=b(Ot.start,dt,st);Ne=new si(dt,N-Ot.start,i),xs=Ot.start-v}else{let dt=l.pos-L;l.next();let Q=[],st=[],Tt=D>=o?D:-1,_t=0,Ie=N;for(;l.pos>dt;)Tt>=0&&l.id==Tt&&l.size>=0?(l.end<=Ie-s&&(p(Q,st,S,_t,l.end,Ie,Tt,z,yt),_t=Q.length,Ie=l.end),l.next()):F>2500?u(S,dt,Q,st):c(S,dt,Q,st,Tt,F+1);if(Tt>=0&&_t>0&&_t-1&&_t>0){let ks=d(se,yt);Ne=Nl(se,Q,st,0,Q.length,0,N-S,ks,ks)}else Ne=g(se,Q,st,N-S,z-N,yt)}k.push(Ne),H.push(xs)}function u(v,C,k,H){let R=[],F=0,D=-1;for(;l.pos>C;){let{id:S,start:N,end:L,size:z}=l;if(z>4)l.next();else{if(D>-1&&N=0;L-=3)S[z++]=R[L],S[z++]=R[L+1]-N,S[z++]=R[L+2]-N,S[z++]=z;k.push(new si(S,R[2]-N,i)),H.push(N-v)}}function d(v,C){return(k,H,R)=>{let F=0,D=k.length-1,S,N;if(D>=0&&(S=k[D])instanceof St){if(!D&&S.type==v&&S.length==R)return S;(N=S.prop(U.lookAhead))&&(F=H[D]+S.length+N)}return g(v,k,H,R,F,C)}}function p(v,C,k,H,R,F,D,S,N){let L=[],z=[];for(;v.length>H;)L.push(v.pop()),z.push(C.pop()+k-R);v.push(g(i.types[D],L,z,F-R,S-F,N)),C.push(R-k)}function g(v,C,k,H,R,F,D){if(F){let S=[U.contextHash,F];D=D?[S].concat(D):[S]}if(R>25){let S=[U.lookAhead,R];D=D?[S].concat(D):[S]}return new St(v,C,k,H,D)}function m(v,C){let k=l.fork(),H=0,R=0,F=0,D=k.end-s,S={size:0,start:0,skip:0};t:for(let N=k.pos-v;k.pos>N;){let L=k.size;if(k.id==C&&L>=0){S.size=H,S.start=R,S.skip=F,F+=4,H+=4,k.next();continue}let z=k.pos-L;if(L<0||z=o?4:0,se=k.start;for(k.next();k.pos>z;){if(k.size<0)if(k.size==-3)yt+=4;else break t;else k.id>=o&&(yt+=4);k.next()}R=se,H+=L,F+=yt}return(C<0||H==v)&&(S.size=H,S.start=R,S.skip=F),S.size>4?S:void 0}function b(v,C,k){let{id:H,start:R,end:F,size:D}=l;if(l.next(),D>=0&&H4){let N=l.pos-(D-4);for(;l.pos>N;)k=b(v,C,k)}C[--k]=S,C[--k]=F-v,C[--k]=R-v,C[--k]=H}else D==-3?h=H:D==-4&&(f=H);return k}let y=[],w=[];for(;l.pos>0;)c(n.start||0,n.bufferStart||0,y,w,-1,0);let x=(t=n.length)!==null&&t!==void 0?t:y.length?w[0]+y[0].length:0;return new St(a[n.topID],y.reverse(),w.reverse(),x)}var kc=new WeakMap;function mr(n,t){if(!n.isAnonymous||t instanceof si||t.type!=n)return 1;let e=kc.get(t);if(e==null){e=1;for(let i of t.children){if(i.type!=n||!(i instanceof St)){e=1;break}e+=mr(n,i)}kc.set(t,e)}return e}function Nl(n,t,e,i,s,r,o,l,a){let h=0;for(let p=i;p=f)break;C+=k}if(w==x+1){if(C>f){let k=p[x];d(k.children,k.positions,0,k.children.length,g[x]+y);continue}c.push(p[x])}else{let k=g[w-1]+p[w-1].length-v;c.push(Nl(n,p,g,x,w,v,k,null,a))}u.push(v+y-r)}}return d(t,e,i,s,0),(l||a)(c,u,o)}var oe=class n{constructor(t,e,i,s,r=!1,o=!1){this.from=t,this.to=e,this.tree=i,this.offset=s,this.open=(r?1:0)|(o?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(t,e=[],i=!1){let s=[new n(0,t.length,t,0,!1,i)];for(let r of e)r.to>t.length&&s.push(r);return s}static applyChanges(t,e,i=128){if(!e.length)return t;let s=[],r=1,o=t.length?t[0]:null;for(let l=0,a=0,h=0;;l++){let f=l=i)for(;o&&o.from=u.from||c<=u.to||h){let d=Math.max(u.from,a)-h,p=Math.min(u.to,c)-h;u=d>=p?null:new n(d,p,u.tree,u.offset+h,l>0,!!f)}if(u&&s.push(u),o.to>c)break;o=rnew qs(s.from,s.to)):[new qs(0,0)]:[new qs(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let s=this.startParse(t,e,i);for(;;){let r=s.advance();if(r)return r}}},Rl=class{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}};var Xb=new U({perNode:!0});var Tg=0,le=class n{constructor(t,e,i,s){this.name=t,this.set=e,this.base=i,this.modified=s,this.id=Tg++}toString(){let{name:t}=this;for(let e of this.modified)e.name&&(t=`${e.name}(${t})`);return t}static define(t,e){let i=typeof t=="string"?t:"?";if(t instanceof n&&(e=t),e!=null&&e.base)throw new Error("Can not derive from a modified tag");let s=new n(i,[],null,[]);if(s.set.push(s),e)for(let r of e.set)s.set.push(r);return s}static defineModifier(t){let e=new vr(t);return i=>i.modified.indexOf(e)>-1?i:vr.get(i.base||i,i.modified.concat(e).sort((s,r)=>s.id-r.id))}},Dg=0,vr=class n{constructor(t){this.name=t,this.instances=[],this.id=Dg++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find(l=>l.base==t&&Pg(e,l.modified));if(i)return i;let s=[],r=new le(t.name,s,t,e);for(let l of e)l.instances.push(r);let o=Eg(e);for(let l of t.set)if(!l.modified.length)for(let a of o)s.push(n.get(l,a));return r}};function Pg(n,t){return n.length==t.length&&n.every((e,i)=>e==t[i])}function Eg(n){let t=[[]];for(let e=0;ei.length-e.length)}var Zb=new U,Sr=class{constructor(t,e,i,s){this.tags=t,this.mode=e,this.context=i,this.next=s}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(t){return!t||t.depth{let o=s;for(let l of r)for(let a of l.set){let h=e[a.id];if(h){o=o?o+" "+h:h;break}}return o},scope:i}}var A=le.define,wr=A(),ni=A(),Cc=A(ni),Ac=A(ni),ri=A(),xr=A(ri),Il=A(ri),ve=A(),Mi=A(ve),xe=A(),ke=A(),Ll=A(),Us=A(Ll),kr=A(),O={comment:wr,lineComment:A(wr),blockComment:A(wr),docComment:A(wr),name:ni,variableName:A(ni),typeName:Cc,tagName:A(Cc),propertyName:Ac,attributeName:A(Ac),className:A(ni),labelName:A(ni),namespace:A(ni),macroName:A(ni),literal:ri,string:xr,docString:A(xr),character:A(xr),attributeValue:A(xr),number:Il,integer:A(Il),float:A(Il),bool:A(ri),regexp:A(ri),escape:A(ri),color:A(ri),url:A(ri),keyword:xe,self:A(xe),null:A(xe),atom:A(xe),unit:A(xe),modifier:A(xe),operatorKeyword:A(xe),controlKeyword:A(xe),definitionKeyword:A(xe),moduleKeyword:A(xe),operator:ke,derefOperator:A(ke),arithmeticOperator:A(ke),logicOperator:A(ke),bitwiseOperator:A(ke),compareOperator:A(ke),updateOperator:A(ke),definitionOperator:A(ke),typeOperator:A(ke),controlOperator:A(ke),punctuation:Ll,separator:A(Ll),bracket:Us,angleBracket:A(Us),squareBracket:A(Us),paren:A(Us),brace:A(Us),content:ve,heading:Mi,heading1:A(Mi),heading2:A(Mi),heading3:A(Mi),heading4:A(Mi),heading5:A(Mi),heading6:A(Mi),contentSeparator:A(ve),list:A(ve),quote:A(ve),emphasis:A(ve),strong:A(ve),link:A(ve),monospace:A(ve),strikethrough:A(ve),inserted:A(),deleted:A(),changed:A(),invalid:A(),meta:kr,documentMeta:A(kr),annotation:A(kr),processingInstruction:A(kr),definition:le.defineModifier("definition"),constant:le.defineModifier("constant"),function:le.defineModifier("function"),standard:le.defineModifier("standard"),local:le.defineModifier("local"),special:le.defineModifier("special")};for(let n in O){let t=O[n];t instanceof le&&(t.name=n)}var ty=_l([{tag:O.link,class:"tok-link"},{tag:O.heading,class:"tok-heading"},{tag:O.emphasis,class:"tok-emphasis"},{tag:O.strong,class:"tok-strong"},{tag:O.keyword,class:"tok-keyword"},{tag:O.atom,class:"tok-atom"},{tag:O.bool,class:"tok-bool"},{tag:O.url,class:"tok-url"},{tag:O.labelName,class:"tok-labelName"},{tag:O.inserted,class:"tok-inserted"},{tag:O.deleted,class:"tok-deleted"},{tag:O.literal,class:"tok-literal"},{tag:O.string,class:"tok-string"},{tag:O.number,class:"tok-number"},{tag:[O.regexp,O.escape,O.special(O.string)],class:"tok-string2"},{tag:O.variableName,class:"tok-variableName"},{tag:O.local(O.variableName),class:"tok-variableName tok-local"},{tag:O.definition(O.variableName),class:"tok-variableName tok-definition"},{tag:O.special(O.variableName),class:"tok-variableName2"},{tag:O.definition(O.propertyName),class:"tok-propertyName tok-definition"},{tag:O.typeName,class:"tok-typeName"},{tag:O.namespace,class:"tok-namespace"},{tag:O.className,class:"tok-className"},{tag:O.macroName,class:"tok-macroName"},{tag:O.propertyName,class:"tok-propertyName"},{tag:O.operator,class:"tok-operator"},{tag:O.comment,class:"tok-comment"},{tag:O.meta,class:"tok-meta"},{tag:O.invalid,class:"tok-invalid"},{tag:O.punctuation,class:"tok-punctuation"}]);var Hl,Ys=new U;var Rg=new U,te=class{constructor(t,e,i=[],s=""){this.data=t,this.name=s,nt.prototype.hasOwnProperty("tree")||Object.defineProperty(nt.prototype,"tree",{get(){return Vl(this)}}),this.parser=e,this.extension=[es.of(this),nt.languageData.of((r,o,l)=>{let a=Mc(r,o,l),h=a.type.prop(Ys);if(!h)return[];let f=r.facet(h),c=a.type.prop(Rg);if(c){let u=a.resolve(o-a.from,l);for(let d of c)if(d.test(u,r)){let p=r.facet(d.facet);return d.type=="replace"?p:p.concat(f)}}return f})].concat(i)}isActiveAt(t,e,i=-1){return Mc(t,e,i).type.prop(Ys)==this.data}findRegions(t){let e=t.facet(es);if((e==null?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],s=(r,o)=>{if(r.prop(Ys)==this.data){i.push({from:o,to:o+r.length});return}let l=r.prop(U.mounted);if(l){if(l.tree.prop(Ys)==this.data){if(l.overlay)for(let a of l.overlay)i.push({from:a.from+o,to:a.to+o});else i.push({from:o,to:o+r.length});return}else if(l.overlay){let a=i.length;if(s(l.tree,l.overlay[0].from+o),i.length>a)return}}for(let a=0;a=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}},Ks=null,zl=class n{constructor(t,e,i=[],s,r,o,l,a){this.parser=t,this.state=e,this.fragments=i,this.tree=s,this.treeLen=r,this.viewport=o,this.skipped=l,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new n(t,e,[],St.empty,0,i,[],null)}startParse(){return this.parser.startParse(new Xs(this.state.doc),this.fragments)}work(t,e){return e!=null&&e>=this.state.doc.length&&(e=void 0),this.tree!=St.empty&&this.isDone(e!=null?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof t=="number"){let s=Date.now()+t;t=()=>Date.now()>s}for(this.parse||(this.parse=this.startParse()),e!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&e=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext(()=>{for(;!(e=this.parse.advance()););}),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(oe.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=Ks;Ks=this;try{return t()}finally{Ks=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=Oc(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:s,treeLen:r,viewport:o,skipped:l}=this;if(this.takeTree(),!t.empty){let a=[];if(t.iterChangedRanges((h,f,c,u)=>a.push({fromA:h,toA:f,fromB:c,toB:u})),i=oe.applyChanges(i,a),s=St.empty,r=0,o={from:t.mapPos(o.from,-1),to:t.mapPos(o.to,1)},this.skipped.length){l=[];for(let h of this.skipped){let f=t.mapPos(h.from,1),c=t.mapPos(h.to,-1);ft.from&&(this.fragments=Oc(this.fragments,s,r),this.skipped.splice(i--,1))}return this.skipped.length>=e?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends yr{createParse(e,i,s){let r=s[0].from,o=s[s.length-1].to;return{parsedPos:r,advance(){let a=Ks;if(a){for(let h of s)a.tempSkipped.push(h);t&&(a.scheduleOn=a.scheduleOn?Promise.all([a.scheduleOn,t]):t)}return this.parsedPos=o,new St(Zt.none,[],[],o-r)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&e[0].from==0&&e[0].to>=t}static get(){return Ks}};function Oc(n,t,e){return oe.applyChanges(n,[{fromA:t,toA:e,fromB:t,toB:e}])}var Js=class n{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new n(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=zl.create(t.facet(es).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new n(i)}};te.state=Yt.define({create:Js.init,update(n,t){for(let e of t.effects)if(e.is(te.setState))return e.value;return t.startState.facet(es)!=t.state.facet(es)?Js.init(t.state):n.apply(t)}});var Tc=n=>{let t=setTimeout(()=>n(),500);return()=>clearTimeout(t)};typeof requestIdleCallback!="undefined"&&(Tc=n=>{let t=-1,e=setTimeout(()=>{t=requestIdleCallback(n,{timeout:400})},100);return()=>t<0?clearTimeout(e):cancelIdleCallback(t)});var Fl=typeof navigator!="undefined"&&(!((Hl=navigator.scheduling)===null||Hl===void 0)&&Hl.isInputPending)?()=>navigator.scheduling.isInputPending():null,Bg=Qi.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(te.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(te.state);(e.tree!=e.context.tree||!e.context.isDone(t.doc.length))&&(this.working=Tc(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEnds+1e3,a=r.context.work(()=>Fl&&Fl()||Date.now()>o,s+(l?0:1e5));this.chunkBudget-=Date.now()-e,(a||this.chunkBudget<=0)&&(r.context.takeTree(),this.view.dispatch({effects:te.setState.of(new Js(r.context))})),this.chunkBudget>0&&!(a&&!l)&&this.scheduleWork(),this.checkAsyncSchedule(r.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then(()=>this.scheduleWork()).catch(e=>ne(this.view.state,e)).then(()=>this.workScheduled--),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),es=B.define({combine(n){return n.length?n[0]:null},enables:n=>[te.state,Bg,j.contentAttributes.compute([n],t=>{let e=t.facet(n);return e&&e.name?{"data-language":e.name}:{}})]});var Wl=class n{constructor(t,e){this.specs=t;let i;function s(l){let a=Xt.newName();return(i||(i=Object.create(null)))["."+a]=l,a}let r=typeof e.all=="string"?e.all:e.all?s(e.all):void 0,o=e.scope;this.scope=o instanceof te?l=>l.prop(Ys)==o.data:o?l=>l==o:void 0,this.style=_l(t.map(l=>({tag:l.tag,class:l.class||s(Object.assign({},l,{tag:null}))})),{all:r}).style,this.module=i?new Xt(i):null,this.themeType=e.themeType}static define(t,e){return new n(t,e||{})}};var cy=Wl.define([{tag:O.meta,color:"#404740"},{tag:O.link,textDecoration:"underline"},{tag:O.heading,textDecoration:"underline",fontWeight:"bold"},{tag:O.emphasis,fontStyle:"italic"},{tag:O.strong,fontWeight:"bold"},{tag:O.strikethrough,textDecoration:"line-through"},{tag:O.keyword,color:"#708"},{tag:[O.atom,O.bool,O.url,O.contentSeparator,O.labelName],color:"#219"},{tag:[O.literal,O.inserted],color:"#164"},{tag:[O.string,O.deleted],color:"#a11"},{tag:[O.regexp,O.escape,O.special(O.string)],color:"#e40"},{tag:O.definition(O.variableName),color:"#00f"},{tag:O.local(O.variableName),color:"#30a"},{tag:[O.typeName,O.namespace],color:"#085"},{tag:O.className,color:"#167"},{tag:[O.special(O.variableName),O.macroName],color:"#256"},{tag:O.definition(O.propertyName),color:"#00c"},{tag:O.comment,color:"#940"},{tag:O.invalid,color:"#f00"}]);var uy=[Zt.none];var dy={rtl:pt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:gt.RTL}),ltr:pt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:gt.LTR}),auto:pt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var Oi;(e=>{})(Oi||(Oi={}));var Sy=B.define({combine:n=>n[0]}),Cy=new Dt,Ay=B.define({combine:n=>n[0]}),My=new Dt,Oy=B.define({combine:n=>n[0]}),Ty=new Dt,Dy=B.define({combine:n=>n[0]}),Py=new Dt,Ey=B.define({combine:n=>n[0]}),Ry=new Dt,By=B.define({combine:n=>n[0]}),Ny=new Dt,Iy=B.define({combine:n=>n[0]}),Ly=new Dt,_y=B.define({combine:n=>n[0]}),Hy=new Dt,Fy=B.define({combine:n=>n[0]}),Vy=new Dt,zy=new Dt,Dc=it.define();var Ng=0,Qs=class{constructor(t,e){this.from=t,this.to=e}},W=class{constructor(t={}){this.id=Ng++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn\'t define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can\'t add per-node props to node types");return typeof t!="function"&&(t=Ct.match(t)),e=>{let i=t(e);return i===void 0?null:[this,i]}}};W.closedBy=new W({deserialize:n=>n.split(" ")});W.openedBy=new W({deserialize:n=>n.split(" ")});W.group=new W({deserialize:n=>n.split(" ")});W.isolate=new W({deserialize:n=>{if(n&&n!="rtl"&&n!="ltr"&&n!="auto")throw new RangeError("Invalid value for isolate: "+n);return n||"auto"}});W.contextHash=new W({perNode:!0});W.lookAhead=new W({perNode:!0});W.mounted=new W({perNode:!0});var is=class{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[W.mounted.id]}},Ig=Object.create(null),Ct=class n{constructor(t,e,i,s=0){this.name=t,this.props=e,this.id=i,this.flags=s}static define(t){let e=t.props&&t.props.length?Object.create(null):Ig,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(t.name==null?8:0),s=new n(t.name||"",e,t.id,i);if(t.props){for(let r of t.props)if(Array.isArray(r)||(r=r(s)),r){if(r[0].perNode)throw new RangeError("Can\'t store a per-node prop on a node type");e[r[0].id]=r[1]}}return s}prop(t){return this.props[t.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(t){if(typeof t=="string"){if(this.name==t)return!0;let e=this.prop(W.group);return e?e.indexOf(t)>-1:!1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let s of i.split(" "))e[s]=t[i];return i=>{for(let s=i.prop(W.group),r=-1;r<(s?s.length:0);r++){let o=e[r<0?i.name:s[r]];if(o)return o}}}};Ct.none=new Ct("",Object.create(null),0,8);var Zs=class n{constructor(t){this.types=t;for(let e=0;e0;for(let a=this.cursor(o|ht.IncludeAnonymous);;){let h=!1;if(a.from<=r&&a.to>=s&&(!l&&a.type.isAnonymous||e(a)!==!1)){if(a.firstChild())continue;h=!0}for(;h&&i&&(l||!a.type.isAnonymous)&&i(a),!a.nextSibling();){if(!a.parent())return;h=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:Yl(Ct.none,this.children,this.positions,0,this.children.length,0,this.length,(e,i,s)=>new n(this.type,e,i,s,this.propValues),t.makeTree||((e,i,s)=>new n(Ct.none,e,i,s)))}static build(t){return _g(t)}};rt.empty=new rt(Ct.none,[],[],0);var ql=class n{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new n(this.buffer,this.index)}},oi=class n{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return Ct.none}toString(){let t=[];for(let e=0;e0));a=o[a+3]);return l}slice(t,e,i){let s=this.buffer,r=new Uint16Array(e-t),o=0;for(let l=t,a=0;l=t&&et;case 1:return e<=t&&i>t;case 2:return i>t;case 4:return!0}}function tn(n,t,e,i){for(var s;n.from==n.to||(e<1?n.from>=t:n.from>t)||(e>-1?n.to<=t:n.to0?l.length:-1;t!=h;t+=e){let f=l[t],c=a[t]+o.from;if(Bc(s,i,c,c+f.length)){if(f instanceof oi){if(r&ht.ExcludeBuffers)continue;let u=f.findChild(0,f.buffer.length,e,i-c,s);if(u>-1)return new en(new Gl(o,f,t,c),null,u)}else if(r&ht.IncludeAnonymous||!f.type.isAnonymous||Kl(f)){let u;if(!(r&ht.IgnoreMounts)&&(u=is.get(f))&&!u.overlay)return new n(u.tree,c,t,o);let d=new n(f,c,t,o);return r&ht.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(e<0?f.children.length-1:0,e,i,s)}}}if(r&ht.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?t=o.index+e:t=e<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let s;if(!(i&ht.IgnoreOverlays)&&(s=is.get(this._tree))&&s.overlay){let r=t-this.from;for(let{from:o,to:l}of s.overlay)if((e>0?o<=r:o=r:l>r))return new n(s.tree,s.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Ec(n,t,e,i){let s=n.cursor(),r=[];if(!s.firstChild())return r;if(e!=null){for(let o=!1;!o;)if(o=s.type.is(e),!s.nextSibling())return r}for(;;){if(i!=null&&s.type.is(i))return r;if(s.type.is(t)&&r.push(s.node),!s.nextSibling())return i==null?r:[]}}function jl(n,t,e=t.length-1){for(let i=n;e>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(t[e]&&t[e]!=i.name)return!1;e--}}return!0}var Gl=class{constructor(t,e,i,s){this.parent=t,this.buffer=e,this.index=i,this.start=s}},en=class n extends Mr{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:s}=this.context,r=s.findChild(this.index+4,s.buffer[this.index+3],t,e-this.context.start,i);return r<0?null:new n(this.context,this,r)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&ht.ExcludeBuffers)return null;let{buffer:s}=this.context,r=s.findChild(this.index+4,s.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return r<0?null:new n(this.context,this,r)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new n(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new n(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,s=this.index+4,r=i.buffer[this.index+3];if(r>s){let o=i.buffer[this.index+1];t.push(i.slice(s,r,o)),e.push(0)}return new rt(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Nc(n){if(!n.length)return null;let t=0,e=n[0];for(let r=1;re.from||o.to=t){let l=new Se(o.tree,o.overlay[0].from+r.from,-1,r);(s||(s=[i])).push(tn(l,t,e,!1))}}return s?Nc(s):i}var sn=class{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof Se)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let i=t._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return t?(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0):!1}yieldBuf(t,e){this.index=t;let{start:i,buffer:s}=this.buffer;return this.type=e||s.set.types[s.buffer[t]],this.from=i+s.buffer[t+1],this.to=i+s.buffer[t+2],!0}yield(t){return t?t instanceof Se?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,i){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,i,this.mode));let{buffer:s}=this.buffer,r=s.findChild(this.index+4,s.buffer[this.index+3],t,e-this.buffer.start,i);return r<0?!1:(this.stack.push(this.index),this.yieldBuf(r))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,i=this.mode){return this.buffer?i&ht.ExcludeBuffers?!1:this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&ht.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&ht.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode)):!1;let{buffer:e}=this.buffer,i=this.stack.length-1;if(t<0){let s=i<0?0:this.stack[i]+4;if(this.index!=s)return this.yieldBuf(e.findChild(s,this.index,-1,0,4))}else{let s=e.buffer[this.index+3];if(s<(i<0?e.buffer.length:e.buffer[this.stack[i]+3]))return this.yieldBuf(s)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,i,{buffer:s}=this;if(s){if(t>0){if(this.index-1)for(let r=e+t,o=t<0?-1:i._tree.children.length;r!=o;r+=t){let l=i._tree.children[r];if(this.mode&ht.IncludeAnonymous||l instanceof oi||!l.type.isAnonymous||Kl(l))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to=0;){for(let o=t;o;o=o._parent)if(o.index==s){if(s==this.index)return o;e=o,i=r+1;break t}s=this.stack[--r]}for(let s=i;s=0;r--){if(r<0)return jl(this._tree,t,s);let o=i[e.buffer[this.stack[r]]];if(!o.isAnonymous){if(t[s]&&t[s]!=o.name)return!1;s--}}return!0}};function Kl(n){return n.children.some(t=>t instanceof oi||!t.type.isAnonymous||Kl(t))}function _g(n){var t;let{buffer:e,nodeSet:i,maxBufferLength:s=1024,reused:r=[],minRepeatType:o=i.types.length}=n,l=Array.isArray(e)?new ql(e,e.length):e,a=i.types,h=0,f=0;function c(v,C,k,H,R,F){let{id:D,start:S,end:N,size:L}=l,z=f,yt=h;for(;L<0;)if(l.next(),L==-1){let dt=r[D];k.push(dt),H.push(S-v);return}else if(L==-3){h=D;return}else if(L==-4){f=D;return}else throw new RangeError(`Unrecognized record size: ${L}`);let se=a[D],Ne,Ot,xs=S-v;if(N-S<=s&&(Ot=m(l.pos-C,R))){let dt=new Uint16Array(Ot.size-Ot.skip),Q=l.pos-Ot.size,st=dt.length;for(;l.pos>Q;)st=b(Ot.start,dt,st);Ne=new oi(dt,N-Ot.start,i),xs=Ot.start-v}else{let dt=l.pos-L;l.next();let Q=[],st=[],Tt=D>=o?D:-1,_t=0,Ie=N;for(;l.pos>dt;)Tt>=0&&l.id==Tt&&l.size>=0?(l.end<=Ie-s&&(p(Q,st,S,_t,l.end,Ie,Tt,z,yt),_t=Q.length,Ie=l.end),l.next()):F>2500?u(S,dt,Q,st):c(S,dt,Q,st,Tt,F+1);if(Tt>=0&&_t>0&&_t-1&&_t>0){let ks=d(se,yt);Ne=Yl(se,Q,st,0,Q.length,0,N-S,ks,ks)}else Ne=g(se,Q,st,N-S,z-N,yt)}k.push(Ne),H.push(xs)}function u(v,C,k,H){let R=[],F=0,D=-1;for(;l.pos>C;){let{id:S,start:N,end:L,size:z}=l;if(z>4)l.next();else{if(D>-1&&N=0;L-=3)S[z++]=R[L],S[z++]=R[L+1]-N,S[z++]=R[L+2]-N,S[z++]=z;k.push(new oi(S,R[2]-N,i)),H.push(N-v)}}function d(v,C){return(k,H,R)=>{let F=0,D=k.length-1,S,N;if(D>=0&&(S=k[D])instanceof rt){if(!D&&S.type==v&&S.length==R)return S;(N=S.prop(W.lookAhead))&&(F=H[D]+S.length+N)}return g(v,k,H,R,F,C)}}function p(v,C,k,H,R,F,D,S,N){let L=[],z=[];for(;v.length>H;)L.push(v.pop()),z.push(C.pop()+k-R);v.push(g(i.types[D],L,z,F-R,S-F,N)),C.push(R-k)}function g(v,C,k,H,R,F,D){if(F){let S=[W.contextHash,F];D=D?[S].concat(D):[S]}if(R>25){let S=[W.lookAhead,R];D=D?[S].concat(D):[S]}return new rt(v,C,k,H,D)}function m(v,C){let k=l.fork(),H=0,R=0,F=0,D=k.end-s,S={size:0,start:0,skip:0};t:for(let N=k.pos-v;k.pos>N;){let L=k.size;if(k.id==C&&L>=0){S.size=H,S.start=R,S.skip=F,F+=4,H+=4,k.next();continue}let z=k.pos-L;if(L<0||z=o?4:0,se=k.start;for(k.next();k.pos>z;){if(k.size<0)if(k.size==-3)yt+=4;else break t;else k.id>=o&&(yt+=4);k.next()}R=se,H+=L,F+=yt}return(C<0||H==v)&&(S.size=H,S.start=R,S.skip=F),S.size>4?S:void 0}function b(v,C,k){let{id:H,start:R,end:F,size:D}=l;if(l.next(),D>=0&&H4){let N=l.pos-(D-4);for(;l.pos>N;)k=b(v,C,k)}C[--k]=S,C[--k]=F-v,C[--k]=R-v,C[--k]=H}else D==-3?h=H:D==-4&&(f=H);return k}let y=[],w=[];for(;l.pos>0;)c(n.start||0,n.bufferStart||0,y,w,-1,0);let x=(t=n.length)!==null&&t!==void 0?t:y.length?w[0]+y[0].length:0;return new rt(a[n.topID],y.reverse(),w.reverse(),x)}var Rc=new WeakMap;function Ar(n,t){if(!n.isAnonymous||t instanceof oi||t.type!=n)return 1;let e=Rc.get(t);if(e==null){e=1;for(let i of t.children){if(i.type!=n||!(i instanceof rt)){e=1;break}e+=Ar(n,i)}Rc.set(t,e)}return e}function Yl(n,t,e,i,s,r,o,l,a){let h=0;for(let p=i;p=f)break;C+=k}if(w==x+1){if(C>f){let k=p[x];d(k.children,k.positions,0,k.children.length,g[x]+y);continue}c.push(p[x])}else{let k=g[w-1]+p[w-1].length-v;c.push(Yl(n,p,g,x,w,v,k,null,a))}u.push(v+y-r)}}return d(t,e,i,s,0),(l||a)(c,u,o)}var Ti=class n{constructor(t,e,i,s,r=!1,o=!1){this.from=t,this.to=e,this.tree=i,this.offset=s,this.open=(r?1:0)|(o?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(t,e=[],i=!1){let s=[new n(0,t.length,t,0,!1,i)];for(let r of e)r.to>t.length&&s.push(r);return s}static applyChanges(t,e,i=128){if(!e.length)return t;let s=[],r=1,o=t.length?t[0]:null;for(let l=0,a=0,h=0;;l++){let f=l=i)for(;o&&o.from=u.from||c<=u.to||h){let d=Math.max(u.from,a)-h,p=Math.min(u.to,c)-h;u=d>=p?null:new n(d,p,u.tree,u.offset+h,l>0,!!f)}if(u&&s.push(u),o.to>c)break;o=rnew Qs(s.from,s.to)):[new Qs(0,0)]:[new Qs(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let s=this.startParse(t,e,i);for(;;){let r=s.advance();if(r)return r}}},Ul=class{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}};var qy=new W({perNode:!0});var G=class n{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,i){[t,e]=hs(this,t,e);let s=[];return this.decompose(0,t,s,2),i.length&&i.decompose(0,i.length,s,3),this.decompose(e,this.length,s,1),rs.from(s,this.length-(e-t)+i.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=hs(this,t,e);let i=[];return this.decompose(t,e,i,0),rs.from(i,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),s=new Ei(this),r=new Ei(t);for(let o=e,l=e;;){if(s.next(o),r.next(o),o=0,s.lineBreak!=r.lineBreak||s.done!=r.done||s.value!=r.value)return!1;if(l+=s.value.length,s.done||l>=i)return!0}}iter(t=1){return new Ei(this,t)}iterRange(t,e=this.length){return new Er(this,t,e)}iterLines(t,e){let i;if(t==null)i=this.iter();else{e==null&&(e=this.lines+1);let s=this.line(t).from;i=this.iterRange(s,Math.max(s,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new Rr(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(t){if(t.length==0)throw new RangeError("A document must have at least one line");return t.length==1&&!t[0]?n.empty:t.length<=32?new zt(t):rs.from(zt.split(t,[]))}},zt=class n extends G{constructor(t,e=Hg(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,s){for(let r=0;;r++){let o=this.text[r],l=s+o.length;if((e?i:l)>=t)return new Jl(s,l,i,o);s=l+1,i++}}decompose(t,e,i,s){let r=t<=0&&e>=this.length?this:new n(Ic(this.text,t,e),Math.min(e,this.length)-Math.max(0,t));if(s&1){let o=i.pop(),l=Dr(r.text,o.text.slice(),0,r.length);if(l.length<=32)i.push(new n(l,o.length+r.length));else{let a=l.length>>1;i.push(new n(l.slice(0,a)),new n(l.slice(a)))}}else i.push(r)}replace(t,e,i){if(!(i instanceof n))return super.replace(t,e,i);[t,e]=hs(this,t,e);let s=Dr(this.text,Dr(i.text,Ic(this.text,0,t)),e),r=this.length+i.length-(e-t);return s.length<=32?new n(s,r):rs.from(n.split(s,[]),r)}sliceString(t,e=this.length,i=`\n`){[t,e]=hs(this,t,e);let s="";for(let r=0,o=0;r<=e&&ot&&o&&(s+=i),tr&&(s+=l.slice(Math.max(0,t-r),e-r)),r=a+1}return s}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,e){let i=[],s=-1;for(let r of t)i.push(r),s+=r.length+1,i.length==32&&(e.push(new n(i,s)),i=[],s=-1);return s>-1&&e.push(new n(i,s)),e}},rs=class n extends G{constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let i of t)this.lines+=i.lines}lineInner(t,e,i,s){for(let r=0;;r++){let o=this.children[r],l=s+o.length,a=i+o.lines-1;if((e?a:l)>=t)return o.lineInner(t,e,i,s);s=l+1,i=a+1}}decompose(t,e,i,s){for(let r=0,o=0;o<=e&&r=o){let h=s&((o<=t?1:0)|(a>=e?2:0));o>=t&&a<=e&&!h?i.push(l):l.decompose(t-o,e-o,i,h)}o=a+1}}replace(t,e,i){if([t,e]=hs(this,t,e),i.lines=r&&e<=l){let a=o.replace(t-r,e-r,i),h=this.lines-o.lines+a.lines;if(a.lines>4&&a.lines>h>>6){let f=this.children.slice();return f[s]=a,new n(f,this.length-(e-t)+i.length)}return super.replace(r,l,a)}r=l+1}return super.replace(t,e,i)}sliceString(t,e=this.length,i=`\n`){[t,e]=hs(this,t,e);let s="";for(let r=0,o=0;rt&&r&&(s+=i),to&&(s+=l.sliceString(t-o,e-o,i)),o=a+1}return s}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof n))return 0;let i=0,[s,r,o,l]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;s+=e,r+=e){if(s==o||r==l)return i;let a=this.children[s],h=t.children[r];if(a!=h)return i+a.scanIdentical(h,e);i+=a.length+1}}static from(t,e=t.reduce((i,s)=>i+s.length+1,-1)){let i=0;for(let d of t)i+=d.lines;if(i<32){let d=[];for(let p of t)p.flatten(d);return new zt(d,e)}let s=Math.max(32,i>>5),r=s<<1,o=s>>1,l=[],a=0,h=-1,f=[];function c(d){let p;if(d.lines>r&&d instanceof n)for(let g of d.children)c(g);else d.lines>o&&(a>o||!a)?(u(),l.push(d)):d instanceof zt&&a&&(p=f[f.length-1])instanceof zt&&d.lines+p.lines<=32?(a+=d.lines,h+=d.length+1,f[f.length-1]=new zt(p.text.concat(d.text),p.length+1+d.length)):(a+d.lines>s&&u(),a+=d.lines,h+=d.length+1,f.push(d))}function u(){a!=0&&(l.push(f.length==1?f[0]:n.from(f,h)),h=-1,a=f.length=0)}for(let d of t)c(d);return u(),l.length==1?l[0]:new n(l,e)}};G.empty=new zt([""],0);function Hg(n){let t=-1;for(let e of n)t+=e.length+1;return t}function Dr(n,t,e=0,i=1e9){for(let s=0,r=0,o=!0;r=e&&(a>i&&(l=l.slice(0,i-s)),s0?1:(t instanceof zt?t.text.length:t.children.length)<<1]}nextInner(t,e){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,s=this.nodes[i],r=this.offsets[i],o=r>>1,l=s instanceof zt?s.text.length:s.children.length;if(o==(e>0?l:0)){if(i==0)return this.done=!0,this.value="",this;e>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((r&1)==(e>0?0:1)){if(this.offsets[i]+=e,t==0)return this.lineBreak=!0,this.value=`\n`,this;t--}else if(s instanceof zt){let a=s.text[o+(e<0?-1:0)];if(this.offsets[i]+=e,a.length>Math.max(0,t))return this.value=t==0?a:e>0?a.slice(t):a.slice(0,a.length-t),this;t-=a.length}else{let a=s.children[o+(e<0?-1:0)];t>a.length?(t-=a.length,this.offsets[i]+=e):(e<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(e>0?1:(a instanceof zt?a.text.length:a.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}},Er=class{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new Ei(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:s}=this.cursor.next(t);return this.pos+=(s.length+t)*e,this.value=s.length<=i?s:e<0?s.slice(s.length-i):s.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},Rr=class{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:s}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=s,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol!="undefined"&&(G.prototype[Symbol.iterator]=function(){return this.iter()},Ei.prototype[Symbol.iterator]=Er.prototype[Symbol.iterator]=Rr.prototype[Symbol.iterator]=function(){return this});var Jl=class{constructor(t,e,i,s){this.from=t,this.to=e,this.number=i,this.text=s}get length(){return this.to-this.from}};function hs(n,t,e){return t=Math.max(0,Math.min(n.length,t)),[t,Math.max(t,Math.min(n.length,e))]}var os="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(n=>n?parseInt(n,36):1);for(let n=1;nn)return os[t-1]<=n;return!1}function Lc(n){return n>=127462&&n<=127487}var _c=8205;function Ae(n,t,e=!0,i=!0){return(e?qc:Vg)(n,t,i)}function qc(n,t,e){if(t==n.length)return t;t&&jc(n.charCodeAt(t))&&Gc(n.charCodeAt(t-1))&&t--;let i=Pr(n,t);for(t+=Ql(i);t=0&&Lc(Pr(n,o));)r++,o-=2;if(r%2==0)break;t+=2}else break}return t}function Vg(n,t,e){for(;t>0;){let i=qc(n,t-2,e);if(i=56320&&n<57344}function Gc(n){return n>=55296&&n<56320}function Pr(n,t){let e=n.charCodeAt(t);if(!Gc(e)||t+1==n.length)return e;let i=n.charCodeAt(t+1);return jc(i)?(e-55296<<10)+(i-56320)+65536:e}function Ql(n){return n<65536?1:2}var Zl=/\\r\\n?|\\n/,It=function(n){return n[n.Simple=0]="Simple",n[n.TrackDel=1]="TrackDel",n[n.TrackBefore=2]="TrackBefore",n[n.TrackAfter=3]="TrackAfter",n}(It||(It={})),Ri=class n{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;et)return r+(t-s);r+=l}else{if(i!=It.Simple&&h>=t&&(i==It.TrackDel&&st||i==It.TrackBefore&&st))return null;if(h>t||h==t&&e<0&&!l)return t==s||e<0?r:r+a;r+=a}s=h}if(t>s)throw new RangeError(`Position ${t} is out of range for changeset of length ${s}`);return r}touchesRange(t,e=t){for(let i=0,s=0;i=0&&s<=e&&l>=t)return se?"cover":!0;s=l}return!1}toString(){let t="";for(let e=0;e=0?":"+s:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new n(t)}static create(t){return new n(t)}},Wt=class n extends Ri{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return ta(this,(e,i,s,r,o)=>t=t.replace(s,s+(i-e),o),!1),t}mapDesc(t,e=!1){return ea(this,t,e,!0)}invert(t){let e=this.sections.slice(),i=[];for(let s=0,r=0;s=0){e[s]=l,e[s+1]=o;let a=s>>1;for(;i.length0&&li(i,e,r.text),r.forward(f),l+=f}let h=t[o++];for(;l>1].toJSON()))}return t}static of(t,e,i){let s=[],r=[],o=0,l=null;function a(f=!1){if(!f&&!s.length)return;ou||c<0||u>e)throw new RangeError(`Invalid change range ${c} to ${u} (in doc of length ${e})`);let p=d?typeof d=="string"?G.of(d.split(i||Zl)):d:G.empty,g=p.length;if(c==u&&g==0)return;co&&At(s,c-o,-1),At(s,u-c,g),li(r,s,p),o=u}}return h(t),a(!l),l}static empty(t){return new n(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw new RangeError("Invalid JSON representation of ChangeSet");let e=[],i=[];for(let s=0;sl&&typeof o!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(r.length==1)e.push(r[0],0);else{for(;i.length=0&&e<=0&&e==n[s+1]?n[s]+=t:t==0&&n[s]==0?n[s+1]+=e:i?(n[s]+=t,n[s+1]+=e):n.push(t,e)}function li(n,t,e){if(e.length==0)return;let i=t.length-2>>1;if(i>1])),!(e||o==n.sections.length||n.sections[o+1]<0);)l=n.sections[o++],a=n.sections[o++];t(s,h,r,f,c),s=h,r=f}}}function ea(n,t,e,i=!1){let s=[],r=i?[]:null,o=new Bi(n),l=new Bi(t);for(let a=-1;;)if(o.ins==-1&&l.ins==-1){let h=Math.min(o.len,l.len);At(s,h,-1),o.forward(h),l.forward(h)}else if(l.ins>=0&&(o.ins<0||a==o.i||o.off==0&&(l.len=0&&a=0){let h=0,f=o.len;for(;f;)if(l.ins==-1){let c=Math.min(f,l.len);h+=c,f-=c,l.forward(c)}else if(l.ins==0&&l.lena||o.ins>=0&&o.len>a)&&(l||i.length>h),r.forward2(a),o.forward(a)}}}}var Bi=class{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i>1;return e>=t.length?G.empty:t[e]}textBit(t){let{inserted:e}=this.set,i=this.i-2>>1;return i>=e.length&&!t?G.empty:e[i].slice(this.off,t==null?void 0:this.off+t)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){this.ins==-1?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}},ns=class n{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let t=this.flags&7;return t==7?null:t}get goalColumn(){let t=this.flags>>6;return t==16777215?void 0:t}map(t,e=-1){let i,s;return this.empty?i=s=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),s=t.mapPos(this.to,-1)),i==this.from&&s==this.to?this:new n(i,s,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return _.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return _.range(this.anchor,i)}eq(t,e=!1){return this.anchor==t.anchor&&this.head==t.head&&(!e||!this.empty||this.assoc==t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||typeof t.anchor!="number"||typeof t.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return _.range(t.anchor,t.head)}static create(t,e,i){return new n(t,e,i)}},_=class n{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:n.create(this.ranges.map(i=>i.map(t,e)),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;it.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!="number"||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new n(t.ranges.map(e=>ns.fromJSON(e)),t.main)}static single(t,e=t){return new n([n.range(t,e)],0)}static create(t,e=0){if(t.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,s=0;st?8:0)|r)}static normalized(t,e=0){let i=t[e];t.sort((s,r)=>s.from-r.from),e=t.indexOf(i);for(let s=1;sr.head?n.range(a,l):n.range(l,a))}}return new n(t,e)}};function Uc(n,t){for(let e of n.ranges)if(e.to>t)throw new RangeError("Selection points outside of document")}var ca=0,V=class n{constructor(t,e,i,s,r){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=s,this.id=ca++,this.default=t([]),this.extensions=typeof r=="function"?r(this):r}get reader(){return this}static define(t={}){return new n(t.combine||(e=>e),t.compareInput||((e,i)=>e===i),t.compare||(t.combine?(e,i)=>e===i:ua),!!t.static,t.enables)}of(t){return new ls([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new ls(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can\'t compute a static facet");return new ls(t,this,2,e)}from(t,e){return e||(e=i=>i),this.compute([t],i=>e(i.field(t)))}};function ua(n,t){return n==t||n.length==t.length&&n.every((e,i)=>e===t[i])}var ls=class{constructor(t,e,i,s){this.dependencies=t,this.facet=e,this.type=i,this.value=s,this.id=ca++}dynamicSlot(t){var e;let i=this.value,s=this.facet.compareInput,r=this.id,o=t[r]>>1,l=this.type==2,a=!1,h=!1,f=[];for(let c of this.dependencies)c=="doc"?a=!0:c=="selection"?h=!0:(((e=t[c.id])!==null&&e!==void 0?e:1)&1)==0&&f.push(t[c.id]);return{create(c){return c.values[o]=i(c),1},update(c,u){if(a&&u.docChanged||h&&(u.docChanged||u.selection)||ia(c,f)){let d=i(c);if(l?!Hc(d,c.values[o],s):!s(d,c.values[o]))return c.values[o]=d,1}return 0},reconfigure:(c,u)=>{let d,p=u.config.address[r];if(p!=null){let g=Lr(u,p);if(this.dependencies.every(m=>m instanceof V?u.facet(m)===c.facet(m):m instanceof qe?u.field(m,!1)==c.field(m,!1):!0)||(l?Hc(d=i(c),g,s):s(d=i(c),g)))return c.values[o]=g,0}else d=i(c);return c.values[o]=d,1}}}};function Hc(n,t,e){if(n.length!=t.length)return!1;for(let i=0;in[a.id]),s=e.map(a=>a.type),r=i.filter(a=>!(a&1)),o=n[t.id]>>1;function l(a){let h=[];for(let f=0;fi===s),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(Fc).find(i=>i.field==this);return((e==null?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:i=>(i.values[e]=this.create(i),1),update:(i,s)=>{let r=i.values[e],o=this.updateF(r,s);return this.compareF(r,o)?0:(i.values[e]=o,1)},reconfigure:(i,s)=>s.config.address[this.id]!=null?(i.values[e]=s.field(this),0):(i.values[e]=this.create(i),1)}}init(t){return[this,Fc.of({field:this,create:t})]}get extension(){return this}},Di={lowest:4,low:3,default:2,high:1,highest:0};function nn(n){return t=>new Br(t,n)}var da={highest:nn(Di.highest),high:nn(Di.high),default:nn(Di.default),low:nn(Di.low),lowest:nn(Di.lowest)},Br=class{constructor(t,e){this.inner=t,this.prec=e}},Nr=class n{of(t){return new on(this,t)}reconfigure(t){return n.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}},on=class{constructor(t,e){this.compartment=t,this.inner=e}},Ir=class n{constructor(t,e,i,s,r,o){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=s,this.staticValues=r,this.facets=o,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(t,e,i){let s=[],r=Object.create(null),o=new Map;for(let u of Wg(t,e,o))u instanceof qe?s.push(u):(r[u.facet.id]||(r[u.facet.id]=[])).push(u);let l=Object.create(null),a=[],h=[];for(let u of s)l[u.id]=h.length<<1,h.push(d=>u.slot(d));let f=i==null?void 0:i.config.facets;for(let u in r){let d=r[u],p=d[0].facet,g=f&&f[u]||[];if(d.every(m=>m.type==0))if(l[p.id]=a.length<<1|1,ua(g,d))a.push(i.facet(p));else{let m=p.combine(d.map(b=>b.value));a.push(i&&p.compare(m,i.facet(p))?i.facet(p):m)}else{for(let m of d)m.type==0?(l[m.id]=a.length<<1|1,a.push(m.value)):(l[m.id]=h.length<<1,h.push(b=>m.dynamicSlot(b)));l[p.id]=h.length<<1,h.push(m=>zg(m,p,d))}}let c=h.map(u=>u(l));return new n(t,o,c,l,a,r)}};function Wg(n,t,e){let i=[[],[],[],[],[]],s=new Map;function r(o,l){let a=s.get(o);if(a!=null){if(a<=l)return;let h=i[a].indexOf(o);h>-1&&i[a].splice(h,1),o instanceof on&&e.delete(o.compartment)}if(s.set(o,l),Array.isArray(o))for(let h of o)r(h,l);else if(o instanceof on){if(e.has(o.compartment))throw new RangeError("Duplicate use of compartment in extensions");let h=t.get(o.compartment)||o.inner;e.set(o.compartment,h),r(h,l)}else if(o instanceof Br)r(o.inner,o.prec);else if(o instanceof qe)i[l].push(o),o.provides&&r(o.provides,l);else if(o instanceof ls)i[l].push(o),o.facet.extensions&&r(o.facet.extensions,Di.default);else{let h=o.extension;if(!h)throw new Error(`Unrecognized extension value in extension set (${o}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(h,l)}}return r(n,Di.default),i.reduce((o,l)=>o.concat(l))}function rn(n,t){if(t&1)return 2;let e=t>>1,i=n.status[e];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;n.status[e]=4;let s=n.computeSlot(n,n.config.dynamicSlots[e]);return n.status[e]=2|s}function Lr(n,t){return t&1?n.config.staticValues[t>>1]:n.values[t>>1]}var Kc=V.define(),sa=V.define({combine:n=>n.some(t=>t),static:!0}),Yc=V.define({combine:n=>n.length?n[0]:void 0,static:!0}),Xc=V.define(),Jc=V.define(),Qc=V.define(),Zc=V.define({combine:n=>n.length?n[0]:!1}),je=class{constructor(t,e){this.type=t,this.value=e}static define(){return new na}},na=class{of(t){return new je(this,t)}},ra=class{constructor(t){this.map=t}of(t){return new ft(this,t)}},ft=class n{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return e===void 0?void 0:e==this.value?this:new n(this.type,e)}is(t){return this.type==t}static define(t={}){return new ra(t.map||(e=>e))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let s of t){let r=s.map(e);r&&i.push(r)}return i}};ft.reconfigure=ft.define();ft.appendConfig=ft.define();var Lt=class n{constructor(t,e,i,s,r,o){this.startState=t,this.changes=e,this.selection=i,this.effects=s,this.annotations=r,this.scrollIntoView=o,this._doc=null,this._state=null,i&&Uc(i,e.newLength),r.some(l=>l.type==n.time)||(this.annotations=r.concat(n.time.of(Date.now())))}static create(t,e,i,s,r,o){return new n(t,e,i,s,r,o)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(n.userEvent);return!!(e&&(e==t||e.length>t.length&&e.slice(0,t.length)==t&&e[t.length]=="."))}};Lt.time=je.define();Lt.userEvent=je.define();Lt.addToHistory=je.define();Lt.remote=je.define();function qg(n,t){let e=[];for(let i=0,s=0;;){let r,o;if(i=n[i]))r=n[i++],o=n[i++];else if(s=0;s--){let r=i[s](n);r instanceof Lt?n=r:Array.isArray(r)&&r.length==1&&r[0]instanceof Lt?n=r[0]:n=eu(t,as(r),!1)}return n}function Gg(n){let t=n.startState,e=t.facet(Qc),i=n;for(let s=e.length-1;s>=0;s--){let r=e[s](n);r&&Object.keys(r).length&&(i=tu(i,oa(t,r,n.changes.newLength),!0))}return i==n?n:Lt.create(t,n.changes,n.selection,i.effects,i.annotations,i.scrollIntoView)}var $g=[];function as(n){return n==null?$g:Array.isArray(n)?n:[n]}var Ce=function(n){return n[n.Word=0]="Word",n[n.Space=1]="Space",n[n.Other=2]="Other",n}(Ce||(Ce={})),Ug=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/,la;try{la=new RegExp("[\\\\p{Alphabetic}\\\\p{Number}_]","u")}catch(n){}function Kg(n){if(la)return la.test(n);for(let t=0;t"\\x80"&&(e.toUpperCase()!=e.toLowerCase()||Ug.test(e)))return!0}return!1}function Yg(n){return t=>{if(!/\\S/.test(t))return Ce.Space;if(Kg(t))return Ce.Word;for(let e=0;e-1)return Ce.Word;return Ce.Other}}var ot=class n{constructor(t,e,i,s,r,o){this.config=t,this.doc=e,this.selection=i,this.values=s,this.status=t.statusTemplate.slice(),this.computeSlot=r,o&&(o._state=this);for(let l=0;ls.set(h,a)),e=null),s.set(l.value.compartment,l.value.extension)):l.is(ft.reconfigure)?(e=null,i=l.value):l.is(ft.appendConfig)&&(e=null,i=as(i).concat(l.value));let r;e?r=t.startState.values.slice():(e=Ir.resolve(i,s,this),r=new n(e,this.doc,this.selection,e.dynamicSlots.map(()=>null),(a,h)=>h.reconfigure(a,this),null).values);let o=t.startState.facet(sa)?t.newSelection:t.newSelection.asSingle();new n(e,t.newDoc,o,r,(l,a)=>a.update(l,t),t)}replaceSelection(t){return typeof t=="string"&&(t=this.toText(t)),this.changeByRange(e=>({changes:{from:e.from,to:e.to,insert:t},range:_.cursor(e.from+t.length)}))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),s=this.changes(i.changes),r=[i.range],o=as(i.effects);for(let l=1;lo.spec.fromJSON(l,a)))}}return n.create({doc:t.doc,selection:_.fromJSON(t.selection),extensions:e.extensions?s.concat([e.extensions]):s})}static create(t={}){let e=Ir.resolve(t.extensions||[],new Map),i=t.doc instanceof G?t.doc:G.of((t.doc||"").split(e.staticFacet(n.lineSeparator)||Zl)),s=t.selection?t.selection instanceof _?t.selection:_.single(t.selection.anchor,t.selection.head):_.single(0);return Uc(s,i.length),e.staticFacet(sa)||(s=s.asSingle()),new n(e,i,s,e.dynamicSlots.map(()=>null),(r,o)=>o.create(r),null)}get tabSize(){return this.facet(n.tabSize)}get lineBreak(){return this.facet(n.lineSeparator)||`\n`}get readOnly(){return this.facet(Zc)}phrase(t,...e){for(let i of this.facet(n.phrases))if(Object.prototype.hasOwnProperty.call(i,t)){t=i[t];break}return e.length&&(t=t.replace(/\\$(\\$|\\d*)/g,(i,s)=>{if(s=="$")return"$";let r=+(s||1);return!r||r>e.length?i:e[r-1]})),t}languageDataAt(t,e,i=-1){let s=[];for(let r of this.facet(Kc))for(let o of r(this,e,i))Object.prototype.hasOwnProperty.call(o,t)&&s.push(o[t]);return s}charCategorizer(t){return Yg(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:s}=this.doc.lineAt(t),r=this.charCategorizer(t),o=t-i,l=t-i;for(;o>0;){let a=Ae(e,o,!1);if(r(e.slice(a,o))!=Ce.Word)break;o=a}for(;ln.length?n[0]:4});ot.lineSeparator=Yc;ot.readOnly=Zc;ot.phrases=V.define({compare(n,t){let e=Object.keys(n),i=Object.keys(t);return e.length==i.length&&e.every(s=>n[s]==t[s])}});ot.languageData=Kc;ot.changeFilter=Xc;ot.transactionFilter=Jc;ot.transactionExtender=Qc;Nr.reconfigure=ft.define();var Ge=class{eq(t){return this==t}range(t,e=t){return ln.create(t,e,this)}};Ge.prototype.startSide=Ge.prototype.endSide=0;Ge.prototype.point=!1;Ge.prototype.mapMode=It.TrackDel;var ln=class n{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(t,e,i){return new n(t,e,i)}};function aa(n,t){return n.from-t.from||n.value.startSide-t.value.startSide}var ha=class n{constructor(t,e,i,s){this.from=t,this.to=e,this.value=i,this.maxPoint=s}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,s=0){let r=i?this.to:this.from;for(let o=s,l=r.length;;){if(o==l)return o;let a=o+l>>1,h=r[a]-t||(i?this.value[a].endSide:this.value[a].startSide)-e;if(a==o)return h>=0?o:l;h>=0?l=a:o=a+1}}between(t,e,i,s){for(let r=this.findIndex(e,-1e9,!0),o=this.findIndex(i,1e9,!1,r);rd||u==d&&h.startSide>0&&h.endSide<=0)continue;(d-u||h.endSide-h.startSide)<0||(o<0&&(o=u),h.point&&(l=Math.max(l,d-u)),i.push(h),s.push(u-o),r.push(d-o))}return{mapped:i.length?new n(s,r,i,l):null,pos:o}}},ct=class n{constructor(t,e,i,s){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=s}static create(t,e,i,s){return new n(t,e,i,s)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:s=0,filterTo:r=this.length}=t,o=t.filter;if(e.length==0&&!o)return this;if(i&&(e=e.slice().sort(aa)),this.isEmpty)return e.length?n.of(e):this;let l=new _r(this,null,-1).goto(0),a=0,h=[],f=new fs;for(;l.value||a=0){let c=e[a++];f.addInner(c.from,c.to,c.value)||h.push(c)}else l.rangeIndex==1&&l.chunkIndexthis.chunkEnd(l.chunkIndex)||rl.to||r=r&&t<=r+o.length&&o.between(r,t-r,e-r,i)===!1)return}this.nextLayer.between(t,e,i)}}iter(t=0){return an.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return an.from(t).goto(e)}static compare(t,e,i,s,r=-1){let o=t.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=r),l=e.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=r),a=Vc(o,l,i),h=new Pi(o,a,r),f=new Pi(l,a,r);i.iterGaps((c,u,d)=>zc(h,c,f,u,d,s)),i.empty&&i.length==0&&zc(h,0,f,0,0,s)}static eq(t,e,i=0,s){s==null&&(s=999999999);let r=t.filter(f=>!f.isEmpty&&e.indexOf(f)<0),o=e.filter(f=>!f.isEmpty&&t.indexOf(f)<0);if(r.length!=o.length)return!1;if(!r.length)return!0;let l=Vc(r,o),a=new Pi(r,l,0).goto(i),h=new Pi(o,l,0).goto(i);for(;;){if(a.to!=h.to||!fa(a.active,h.active)||a.point&&(!h.point||!a.point.eq(h.point)))return!1;if(a.to>s)return!0;a.next(),h.next()}}static spans(t,e,i,s,r=-1){let o=new Pi(t,null,r).goto(e),l=e,a=o.openStart;for(;;){let h=Math.min(o.to,i);if(o.point){let f=o.activeForPoint(o.to),c=o.pointFroml&&(s.span(l,h,o.active,a),a=o.openEnd(h));if(o.to>i)return a+(o.point&&o.to>i?1:0);l=o.to,o.next()}}static of(t,e=!1){let i=new fs;for(let s of t instanceof ln?[t]:e?Xg(t):t)i.add(s.from,s.to,s.value);return i.finish()}static join(t){if(!t.length)return n.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let s=t[i];s!=n.empty;s=s.nextLayer)e=new n(s.chunkPos,s.chunk,e,Math.max(s.maxPoint,e.maxPoint));return e}};ct.empty=new ct([],[],null,-1);function Xg(n){if(n.length>1)for(let t=n[0],e=1;e0)return n.slice().sort(aa);t=i}return n}ct.empty.nextLayer=ct.empty;var fs=class n{finishChunk(t){this.chunks.push(new ha(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new n)).add(t,e,i)}addInner(t,e,i){let s=t-this.lastTo||i.startSide-this.last.endSide;if(s<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return s<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(ct.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return t;let e=ct.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}};function Vc(n,t,e){let i=new Map;for(let r of n)for(let o=0;o=this.minPoint)break}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&s.push(new _r(o,e,i,r));return s.length==1?s[0]:new n(s)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let i=this.heap.length>>1;i>=0;i--)Xl(this.heap,i);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let i=this.heap.length>>1;i>=0;i--)Xl(this.heap,i);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),Xl(this.heap,0)}}};function Xl(n,t){for(let e=n[t];;){let i=(t<<1)+1;if(i>=n.length)break;let s=n[i];if(i+1=0&&(s=n[i+1],i++),e.compare(s)<0)break;n[i]=e,n[t]=s,t=i}}var Pi=class{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=an.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){Or(this.active,t),Or(this.activeTo,t),Or(this.activeRank,t),this.minActive=Wc(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:s,rank:r}=this.cursor;for(;e0;)e++;Tr(this.active,e,i),Tr(this.activeTo,e,s),Tr(this.activeRank,e,r),t&&Tr(t,e,this.cursor.from),this.minActive=Wc(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let s=this.minActive;if(s>-1&&(this.activeTo[s]-this.cursor.from||this.active[s].endSide-this.cursor.startSide)<0){if(this.activeTo[s]>t){this.to=this.activeTo[s],this.endSide=this.active[s].endSide;break}this.removeActive(s),i&&Or(i,s)}else if(this.cursor.value)if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let r=this.cursor.value;if(!r.point)this.addActive(i),this.cursor.next();else if(e&&this.cursor.to==this.to&&this.cursor.from=0&&i[s]=0&&!(this.activeRank[i]t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}};function zc(n,t,e,i,s,r){n.goto(t),e.goto(i);let o=i+s,l=i,a=i-t;for(;;){let h=n.to+a-e.to||n.endSide-e.endSide,f=h<0?n.to+a:e.to,c=Math.min(f,o);if(n.point||e.point?n.point&&e.point&&(n.point==e.point||n.point.eq(e.point))&&fa(n.activeForPoint(n.to),e.activeForPoint(e.to))||r.comparePoint(l,c,n.point,e.point):c>l&&!fa(n.active,e.active)&&r.compareRange(l,c,n.active,e.active),f>o)break;l=f,h<=0&&n.next(),h>=0&&e.next()}}function fa(n,t){if(n.length!=t.length)return!1;for(let e=0;e=t;i--)n[i+1]=n[i];n[t]=e}function Wc(n,t){let e=-1,i=1e9;for(let s=0;s=t)return s;if(s==n.length)break;r+=n.charCodeAt(s)==9?e-r%e:1,s=Ae(n,s)}return i===!0?-1:n.length}var pa="\\u037C",su=typeof Symbol=="undefined"?"__"+pa:Symbol.for(pa),ga=typeof Symbol=="undefined"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),nu=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:{},ee=class{constructor(t,e){this.rules=[];let{finish:i}=e||{};function s(o){return/^@/.test(o)?[o]:o.split(/,\\s*/)}function r(o,l,a,h){let f=[],c=/^@(\\w+)\\b/.exec(o[0]),u=c&&c[1]=="keyframes";if(c&&l==null)return a.push(o[0]+";");for(let d in l){let p=l[d];if(/&/.test(d))r(d.split(/,\\s*/).map(g=>o.map(m=>g.replace(/&/,m))).reduce((g,m)=>g.concat(m)),p,a);else if(p&&typeof p=="object"){if(!c)throw new RangeError("The value of a property ("+d+") should be a primitive value.");r(s(d),p,f,u)}else p!=null&&f.push(d.replace(/_.*/,"").replace(/[A-Z]/g,g=>"-"+g.toLowerCase())+": "+p+";")}(f.length||u)&&a.push((i&&!c&&!h?o.map(i):o).join(", ")+" {"+f.join(" ")+"}")}for(let o in t)r(s(o),t[o],this.rules)}getRules(){return this.rules.join(`\n`)}static newName(){let t=nu[su]||1;return nu[su]=t+1,pa+t.toString(36)}static mount(t,e,i){let s=t[ga],r=i&&i.nonce;s?r&&s.setNonce(r):s=new ma(t,r),s.mount(Array.isArray(e)?e:[e])}},ru=new Map,ma=class{constructor(t,e){let i=t.ownerDocument||t,s=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&s.CSSStyleSheet){let r=ru.get(i);if(r)return t.adoptedStyleSheets=[r.sheet,...t.adoptedStyleSheets],t[ga]=r;this.sheet=new s.CSSStyleSheet,t.adoptedStyleSheets=[this.sheet,...t.adoptedStyleSheets],ru.set(i,this)}else{this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);let r=t.head||t;r.insertBefore(this.styleTag,r.firstChild)}this.modules=[],t[ga]=this}mount(t){let e=this.sheet,i=0,s=0;for(let r=0;r-1&&(this.modules.splice(l,1),s--,l=-1),l==-1){if(this.modules.splice(s++,0,o),e)for(let a=0;a",191:"?",192:"~",219:"{",220:"|",221:"}",222:\'"\'},Uy=typeof navigator!="undefined"&&/Mac/.test(navigator.platform),Ky=typeof navigator!="undefined"&&/MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent);for(ut=0;ut<10;ut++)Ni[48+ut]=Ni[96+ut]=String(ut);var ut;for(ut=1;ut<=24;ut++)Ni[ut+111]="F"+ut;var ut;for(ut=65;ut<=90;ut++)Ni[ut]=String.fromCharCode(ut+32),Fr[ut]=String.fromCharCode(ut);var ut;for(Hr in Ni)Fr.hasOwnProperty(Hr)||(Fr[Hr]=Ni[Hr]);var Hr;function Xr(n){let t;return n.nodeType==11?t=n.getSelection?n:n.ownerDocument:t=n,t.getSelection()}function ka(n,t){return t?n==t||n.contains(t.nodeType!=1?t.parentNode:t):!1}function Zg(n){let t=n.activeElement;for(;t&&t.shadowRoot;)t=t.shadowRoot.activeElement;return t}function Ur(n,t){if(!t.anchorNode)return!1;try{return ka(n,t.anchorNode)}catch(e){return!1}}function yn(n){return n.nodeType==3?Ii(n,0,n.nodeValue.length).getClientRects():n.nodeType==1?n.getClientRects():[]}function dn(n,t,e,i){return e?ou(n,t,e,i,-1)||ou(n,t,e,i,1):!1}function wn(n){for(var t=0;;t++)if(n=n.previousSibling,!n)return t}function ou(n,t,e,i,s){for(;;){if(n==e&&t==i)return!0;if(t==(s<0?0:Ke(n))){if(n.nodeName=="DIV")return!1;let r=n.parentNode;if(!r||r.nodeType!=1)return!1;t=wn(n)+(s<0?0:1),n=r}else if(n.nodeType==1){if(n=n.childNodes[t+(s<0?-1:0)],n.nodeType==1&&n.contentEditable=="false")return!1;t=s<0?Ke(n):0}else return!1}}function Ke(n){return n.nodeType==3?n.nodeValue.length:n.childNodes.length}function Xa(n,t){let e=t?n.left:n.right;return{left:e,right:e,top:n.top,bottom:n.bottom}}function tm(n){return{left:0,right:n.innerWidth,top:0,bottom:n.innerHeight}}function Lu(n,t){let e=t.width/n.offsetWidth,i=t.height/n.offsetHeight;return(e>.995&&e<1.005||!isFinite(e)||Math.abs(t.width-n.offsetWidth)<1)&&(e=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(t.height-n.offsetHeight)<1)&&(i=1),{scaleX:e,scaleY:i}}function em(n,t,e,i,s,r,o,l){let a=n.ownerDocument,h=a.defaultView||window;for(let f=n,c=!1;f&&!c;)if(f.nodeType==1){let u,d=f==a.body,p=1,g=1;if(d)u=tm(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(f).position)&&(c=!0),f.scrollHeight<=f.clientHeight&&f.scrollWidth<=f.clientWidth){f=f.assignedSlot||f.parentNode;continue}let y=f.getBoundingClientRect();({scaleX:p,scaleY:g}=Lu(f,y)),u={left:y.left,right:y.left+f.clientWidth*p,top:y.top,bottom:y.top+f.clientHeight*g}}let m=0,b=0;if(s=="nearest")t.top0&&t.bottom>u.bottom+b&&(b=t.bottom-u.bottom+b+o)):t.bottom>u.bottom&&(b=t.bottom-u.bottom+o,e<0&&t.top-b0&&t.right>u.right+m&&(m=t.right-u.right+m+r)):t.right>u.right&&(m=t.right-u.right+r,e<0&&t.lefte.clientHeight||e.scrollWidth>e.clientWidth)return e;e=e.assignedSlot||e.parentNode}else if(e.nodeType==11)e=e.host;else break;return null}var va=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?Ke(e):0),i,Math.min(t.focusOffset,i?Ke(i):0))}set(t,e,i,s){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=s}},cs=null;function _u(n){if(n.setActive)return n.setActive();if(cs)return n.focus(cs);let t=[];for(let e=n;e&&(t.push(e,e.scrollTop,e.scrollLeft),e!=e.ownerDocument);e=e.parentNode);if(n.focus(cs==null?{get preventScroll(){return cs={preventScroll:!0},!0}}:void 0),!cs){cs=!1;for(let e=0;eMath.max(1,n.scrollHeight-n.clientHeight-4)}var Et=class n{constructor(t,e,i=!0){this.node=t,this.offset=e,this.precise=i}static before(t,e){return new n(t.parentNode,wn(t),e)}static after(t,e){return new n(t.parentNode,wn(t)+1,e)}},Ja=[],et=class n{constructor(){this.parent=null,this.dom=null,this.flags=2}get overrideDOMText(){return null}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(t){let e=this.posAtStart;for(let i of this.children){if(i==t)return e;e+=i.length+i.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(t){return this.posBefore(t)+t.length}sync(t,e){if(this.flags&2){let i=this.dom,s=null,r;for(let o of this.children){if(o.flags&7){if(!o.dom&&(r=s?s.nextSibling:i.firstChild)){let l=n.get(r);(!l||!l.parent&&l.canReuseDOM(o))&&o.reuseDOM(r)}o.sync(t,e),o.flags&=-8}if(r=s?s.nextSibling:i.firstChild,e&&!e.written&&e.node==i&&r!=o.dom&&(e.written=!0),o.dom.parentNode==i)for(;r&&r!=o.dom;)r=au(r);else i.insertBefore(o.dom,r);s=o.dom}for(r=s?s.nextSibling:i.firstChild,r&&e&&e.node==i&&(e.written=!0);r;)r=au(r)}else if(this.flags&1)for(let i of this.children)i.flags&7&&(i.sync(t,e),i.flags&=-8)}reuseDOM(t){}localPosFromDOM(t,e){let i;if(t==this.dom)i=this.dom.childNodes[e];else{let s=Ke(t)==0?0:e==0?-1:1;for(;;){let r=t.parentNode;if(r==this.dom)break;s==0&&r.firstChild!=r.lastChild&&(t==r.firstChild?s=-1:s=1),t=r}s<0?i=t:i=t.nextSibling}if(i==this.dom.firstChild)return 0;for(;i&&!n.get(i);)i=i.nextSibling;if(!i)return this.length;for(let s=0,r=0;;s++){let o=this.children[s];if(o.dom==i)return r;r+=o.length+o.breakAfter}}domBoundsAround(t,e,i=0){let s=-1,r=-1,o=-1,l=-1;for(let a=0,h=i,f=i;ae)return c.domBoundsAround(t,e,h);if(u>=t&&s==-1&&(s=a,r=h),h>e&&c.dom.parentNode==this.dom){o=a,l=f;break}f=u,h=u+c.breakAfter}return{from:r,to:l<0?i+this.length:l,startDOM:(s?this.children[s-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:o=0?this.children[o].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),e.flags&1)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,this.flags&7&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=Ja){this.markDirty();for(let s=t;sthis.pos||t==this.pos&&(e>0||this.i==0||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}};function Vu(n,t,e,i,s,r,o,l,a){let{children:h}=n,f=h.length?h[t]:null,c=r.length?r[r.length-1]:null,u=c?c.breakAfter:o;if(!(t==i&&f&&!o&&!u&&r.length<2&&f.merge(e,s,r.length?c:null,e==0,l,a))){if(i0&&(!o&&r.length&&f.merge(e,f.length,r[0],!1,l,0)?f.breakAfter=r.shift().breakAfter:(e2),E={mac:cu||/Mac/.test(qt.platform),windows:/Win/.test(qt.platform),linux:/Linux|X11/.test(qt.platform),ie:lo,ie_version:Wu?Sa.documentMode||6:Aa?+Aa[1]:Ca?+Ca[1]:0,gecko:hu,gecko_version:hu?+(/Firefox\\/(\\d+)/.exec(qt.userAgent)||[0,0])[1]:0,chrome:!!ba,chrome_version:ba?+ba[1]:0,ios:cu,android:/Android\\b/.test(qt.userAgent),webkit:fu,safari:qu,webkit_version:fu?+(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent)||[0,0])[1]:0,tabSize:Sa.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"},rm=256,hi=class n extends et{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){t.nodeType==3&&this.createDOM(t)}merge(t,e,i){return this.flags&8||i&&(!(i instanceof n)||this.length-(e-t)+i.length>rm||i.flags&8)?!1:(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new n(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=this.flags&8,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new Et(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return om(this.dom,t,e)}},fi=class n extends et{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let s of e)s.setParent(this)}setAttrs(t){if(Hu(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!((this.flags|t.flags)&8)}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?this.flags&4&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,s,r,o){return i&&(!(i instanceof n&&i.mark.eq(this.mark))||t&&r<=0||et&&e.push(i=t&&(s=r),i=a,r++}let o=this.length-t;return this.length=t,s>-1&&(this.children.length=s,this.markDirty()),new n(this.mark,e,o)}domAtPos(t){return ju(this,t)}coordsAt(t,e){return $u(this,t,e)}};function om(n,t,e){let i=n.nodeValue.length;t>i&&(t=i);let s=t,r=t,o=0;t==0&&e<0||t==i&&e>=0?E.chrome||E.gecko||(t?(s--,o=1):r=0)?0:l.length-1];return E.safari&&!o&&a.width==0&&(a=Array.prototype.find.call(l,h=>h.width)||a),o?Xa(a,o<0):a||null}var Qr=class n extends et{static create(t,e,i){return new n(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=n.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){(!this.dom||!this.widget.updateDOM(this.dom,t))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,s,r,o){return i&&(!(i instanceof n)||!this.widget.compare(i.widget)||t>0&&r<=0||e0)?Et.before(this.dom):Et.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let s=this.dom.getClientRects(),r=null;if(!s.length)return null;let o=this.side?this.side<0:t>0;for(let l=o?s.length-1:0;r=s[l],!(t>0?l==0:l==s.length-1||r.top0?Et.before(this.dom):Et.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return G.empty}get isHidden(){return!0}};hi.prototype.children=Qr.prototype.children=xn.prototype.children=Ja;function ju(n,t){let e=n.dom,{children:i}=n,s=0;for(let r=0;sr&&t0;r--){let o=i[r-1];if(o.dom.parentNode==e)return o.domAtPos(o.length)}for(let r=s;r0&&t instanceof fi&&s.length&&(i=s[s.length-1])instanceof fi&&i.mark.eq(t.mark)?Gu(i,t.children[0],e-1):(s.push(t),t.setParent(n)),n.length+=t.length}function $u(n,t,e){let i=null,s=-1,r=null,o=-1;function l(h,f){for(let c=0,u=0;c=f&&(d.children.length?l(d,f-u):(!r||r.isHidden&&e>0)&&(p>f||u==p&&d.getSide()>0)?(r=d,o=f-u):(u-1?1:0)!=s.length-(e&&s.indexOf(e)>-1?1:0))return!1;for(let r of i)if(r!=e&&(s.indexOf(r)==-1||n[r]!==t[r]))return!1;return!0}function Oa(n,t,e){let i=!1;if(t)for(let s in t)e&&s in e||(i=!0,s=="style"?n.style.cssText="":n.removeAttribute(s));if(e)for(let s in e)t&&t[s]==e[s]||(i=!0,s=="style"?n.style.cssText=e[s]:n.setAttribute(s,e[s]));return i}function am(n){let t=Object.create(null);for(let e=0;e0&&this.children[i-1].length==0;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=this.prevAttrs===void 0?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){Qa(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){Gu(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=Ma(e,this.attrs||{})),i&&(this.attrs=Ma({class:i},this.attrs||{}))}domAtPos(t){return ju(this,t)}reuseDOM(t){t.nodeName=="DIV"&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?this.flags&4&&(Hu(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),this.prevAttrs!==void 0&&(Oa(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let s=this.dom.lastChild;for(;s&&et.get(s)instanceof fi;)s=s.lastChild;if(!s||!this.length||s.nodeName!="BR"&&((i=et.get(s))===null||i===void 0?void 0:i.isEditable)==!1&&(!E.ios||!this.children.some(r=>r instanceof hi))){let r=document.createElement("BR");r.cmIgnore=!0,this.dom.appendChild(r)}}measureTextSize(){if(this.children.length==0||this.length>20)return null;let t=0,e;for(let i of this.children){if(!(i instanceof hi)||/[^ -~]/.test(i.text))return null;let s=yn(i.dom);if(s.length!=1)return null;t+=s[0].width,e=s[0].height}return t?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:t/this.length,textHeight:e}:null}coordsAt(t,e){let i=$u(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:s}=this.parent.view.viewState,r=i.bottom-i.top;if(Math.abs(r-s.lineHeight)<2&&s.textHeight=e){if(r instanceof n)return r;if(o>e)break}s=o+r.breakAfter}return null}},ps=class n extends et{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,s,r,o){return i&&(!(i instanceof n)||!this.widget.compare(i.widget)||t>0&&r<=0||e0}},gs=class{eq(t){return!1}updateDOM(t,e){return!1}compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}get estimatedHeight(){return-1}get lineBreaks(){return 0}ignoreEvent(t){return!0}coordsAt(t,e,i){return null}get isHidden(){return!1}get editable(){return!1}destroy(t){}},$e=function(n){return n[n.Text=0]="Text",n[n.WidgetBefore=1]="WidgetBefore",n[n.WidgetAfter=2]="WidgetAfter",n[n.WidgetRange=3]="WidgetRange",n}($e||($e={})),Mt=class extends Ge{constructor(t,e,i,s){super(),this.startSide=t,this.endSide=e,this.widget=i,this.spec=s}get heightRelevant(){return!1}static mark(t){return new kn(t)}static widget(t){let e=Math.max(-1e4,Math.min(1e4,t.side||0)),i=!!t.block;return e+=i&&!t.inlineOrder?e>0?3e8:-4e8:e>0?1e8:-1e8,new ci(t,e,e,i,t.widget||null,!1)}static replace(t){let e=!!t.block,i,s;if(t.isBlockGap)i=-5e8,s=4e8;else{let{start:r,end:o}=Uu(t,e);i=(r?e?-3e8:-1:5e8)-1,s=(o?e?2e8:1:-6e8)+1}return new ci(t,i,s,e,t.widget||null,!0)}static line(t){return new vn(t)}static set(t,e=!1){return ct.of(t,e)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};Mt.none=ct.empty;var kn=class n extends Mt{constructor(t){let{start:e,end:i}=Uu(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof n&&this.tagName==t.tagName&&(this.class||((e=this.attrs)===null||e===void 0?void 0:e.class))==(t.class||((i=t.attrs)===null||i===void 0?void 0:i.class))&&Qa(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}};kn.prototype.point=!1;var vn=class n extends Mt{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof n&&this.spec.class==t.spec.class&&Qa(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}};vn.prototype.mapMode=It.TrackBefore;vn.prototype.point=!0;var ci=class n extends Mt{constructor(t,e,i,s,r,o){super(e,i,r,t),this.block=s,this.isReplace=o,this.mapMode=s?e<=0?It.TrackBefore:It.TrackAfter:It.TrackDel}get type(){return this.startSide!=this.endSide?$e.WidgetRange:this.startSide<=0?$e.WidgetBefore:$e.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof n&&hm(this.widget,t.widget)&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}};ci.prototype.point=!0;function Uu(n,t=!1){let{inclusiveStart:e,inclusiveEnd:i}=n;return e==null&&(e=n.inclusive),i==null&&(i=n.inclusive),{start:e!=null?e:t,end:i!=null?i:t}}function hm(n,t){return n==t||!!(n&&t&&n.compare(t))}function Ta(n,t,e,i=0){let s=e.length-1;s>=0&&e[s]+i>=n?e[s]=Math.max(e[s],t):e.push(n,t)}var pn=class n{constructor(t,e,i,s){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=s,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(this.content.length==0)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof ps&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new kt),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(Vr(new xn(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,!this.posCovered()&&!(t&&this.content.length&&this.content[this.content.length-1]instanceof ps)&&this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:r,lineBreak:o,done:l}=this.cursor.next(this.skip);if(this.skip=0,l)throw new Error("Ran out of text content when drawing inline views");if(o){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}else this.text=r,this.textOff=0}let s=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(Vr(new hi(this.text.slice(this.textOff,this.textOff+s)),e),i),this.atCursorPos=!0,this.textOff+=s,t-=s,i=0}}span(t,e,i,s){this.buildText(e-t,i,s),this.pos=e,this.openStart<0&&(this.openStart=s)}point(t,e,i,s,r,o){if(this.disallowBlockEffectsFor[o]&&i instanceof ci){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let l=e-t;if(i instanceof ci)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new ps(i.widget||new Zr("div"),l,i));else{let a=Qr.create(i.widget||new Zr("span"),l,l?0:i.startSide),h=this.atCursorPos&&!a.isEditable&&r<=s.length&&(t0),f=!a.isEditable&&(ts.length||i.startSide<=0),c=this.getLine();this.pendingBuffer==2&&!h&&!a.isEditable&&(this.pendingBuffer=0),this.flushBuffer(s),h&&(c.append(Vr(new xn(1),s),r),r=s.length+Math.max(0,r-s.length)),c.append(Vr(a,s),r),this.atCursorPos=f,this.pendingBuffer=f?ts.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=s.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);l&&(this.textOff+l<=this.text.length?this.textOff+=l:(this.skip+=l-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=r)}static build(t,e,i,s,r){let o=new n(t,e,i,r);return o.openEnd=ct.spans(s,e,i,o),o.openStart<0&&(o.openStart=o.openEnd),o.finish(o.openEnd),o}};function Vr(n,t){for(let e of t)n=new fi(e,[n],n.length);return n}var Zr=class extends gs{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}},bt=function(n){return n[n.LTR=0]="LTR",n[n.RTL=1]="RTL",n}(bt||(bt={})),Li=bt.LTR,Za=bt.RTL;function Ku(n){let t=[];for(let e=0;e=e){if(l.level==i)return o;(r<0||(s!=0?s<0?l.frome:t[r].level>l.level))&&(r=o)}}if(r<0)throw new RangeError("Index out of range");return r}};function Xu(n,t){if(n.length!=t.length)return!1;for(let e=0;e=0;g-=3)if(Me[g+1]==-d){let m=Me[g+2],b=m&2?s:m&4?m&1?r:s:0;b&&(Y[c]=Y[Me[g]]=b),l=g;break}}else{if(Me.length==189)break;Me[l++]=c,Me[l++]=u,Me[l++]=a}else if((p=Y[c])==2||p==1){let g=p==s;a=g?0:1;for(let m=l-3;m>=0;m-=3){let b=Me[m+2];if(b&2)break;if(g)Me[m+2]|=2;else{if(b&4)break;Me[m+2]|=4}}}}}function gm(n,t,e,i){for(let s=0,r=i;s<=e.length;s++){let o=s?e[s-1].to:n,l=sa;)p==m&&(p=e[--g].from,m=g?e[g-1].to:n),Y[--p]=d;a=f}else r=h,a++}}}function Pa(n,t,e,i,s,r,o){let l=i%2?2:1;if(i%2==s%2)for(let a=t,h=0;aa&&o.push(new Te(a,g.from,d));let m=g.direction==Li!=!(d%2);Ea(n,m?i+1:i,s,g.inner,g.from,g.to,o),a=g.to}p=g.to}else{if(p==e||(f?Y[p]!=l:Y[p]==l))break;p++}u?Pa(n,a,p,i+1,s,u,o):at;){let f=!0,c=!1;if(!h||a>r[h-1].to){let g=Y[a-1];g!=l&&(f=!1,c=g==16)}let u=!f&&l==1?[]:null,d=f?i:i+1,p=a;t:for(;;)if(h&&p==r[h-1].to){if(c)break t;let g=r[--h];if(!f)for(let m=g.from,b=h;;){if(m==t)break t;if(b&&r[b-1].to==m)m=r[--b].from;else{if(Y[m-1]==l)break t;break}}if(u)u.push(g);else{g.toY.length;)Y[Y.length]=256;let i=[],s=t==Li?0:1;return Ea(n,s,s,e,0,n.length,i),i}function Ju(n){return[new Te(0,n,0)]}var Qu="";function bm(n,t,e,i,s){var r;let o=i.head-n.from,l=Te.find(t,o,(r=i.bidiLevel)!==null&&r!==void 0?r:-1,i.assoc),a=t[l],h=a.side(s,e);if(o==h){let u=l+=s?1:-1;if(u<0||u>=t.length)return null;a=t[l=u],o=a.side(!s,e),h=a.side(s,e)}let f=Ae(n.text,o,a.forward(s,e));(fa.to)&&(f=h),Qu=n.text.slice(Math.min(o,f),Math.max(o,f));let c=l==(s?t.length-1:0)?null:t[l+(s?1:-1)];return c&&f==h&&c.level+(s?0:1)n.some(t=>t)}),wm=V.define({combine:n=>n.some(t=>t)}),gn=class n{constructor(t,e="nearest",i="nearest",s=5,r=5,o=!1){this.range=t,this.y=e,this.x=i,this.yMargin=s,this.xMargin=r,this.isSnapshot=o}map(t){return t.empty?this:new n(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new n(_.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},zr=ft.define({map:(n,t)=>n.map(t)});function Ue(n,t,e){let i=n.facet(id);i.length?i[0](t):window.onerror?window.onerror(String(t),e,void 0,void 0,t):e?console.error(e+":",t):console.error(t)}var ao=V.define({combine:n=>n.length?n[0]:!0}),xm=0,hn=V.define(),ms=class n{constructor(t,e,i,s,r){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=s,this.extension=r(this)}static define(t,e){let{eventHandlers:i,eventObservers:s,provide:r,decorations:o}=e||{};return new n(xm++,t,i,s,l=>{let a=[hn.of(l)];return o&&a.push(Sn.of(h=>{let f=h.plugin(l);return f?o(f):Mt.none})),r&&a.push(r(l)),a})}static fromClass(t,e){return n.define(i=>new t(i),e)}},mn=class{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(i){if(Ue(e.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(s){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){Ue(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(!((e=this.value)===null||e===void 0)&&e.destroy)try{this.value.destroy()}catch(i){Ue(t.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},od=V.define(),th=V.define(),Sn=V.define(),ld=V.define(),eh=V.define(),ad=V.define();function du(n,t){let e=n.state.facet(ad);if(!e.length)return e;let i=e.map(r=>r instanceof Function?r(n):r),s=[];return ct.spans(i,t.from,t.to,{point(){},span(r,o,l,a){let h=r-t.from,f=o-t.from,c=s;for(let u=l.length-1;u>=0;u--,a--){let d=l[u].spec.bidiIsolate,p;if(d==null&&(d=ym(t.text,h,f)),a>0&&c.length&&(p=c[c.length-1]).to==h&&p.direction==d)p.to=f,c=p.inner;else{let g={from:h,to:f,direction:d,inner:[]};c.push(g),c=g.inner}}}}),s}var hd=V.define();function fd(n){let t=0,e=0,i=0,s=0;for(let r of n.state.facet(hd)){let o=r(n);o&&(o.left!=null&&(t=Math.max(t,o.left)),o.right!=null&&(e=Math.max(e,o.right)),o.top!=null&&(i=Math.max(i,o.top)),o.bottom!=null&&(s=Math.max(s,o.bottom)))}return{left:t,right:e,top:i,bottom:s}}var fn=V.define(),De=class n{constructor(t,e,i,s){this.fromA=t,this.toA=e,this.fromB=i,this.toB=s}join(t){return new n(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let s=t[e-1];if(!(s.fromA>i.toA)){if(s.toAf)break;r+=2}if(!a)return i;new n(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),o=a.toA,l=a.toB}}},to=class n{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=Wt.empty(this.startState.doc.length);for(let r of i)this.changes=this.changes.compose(r.changes);let s=[];this.changes.iterChangedRanges((r,o,l,a)=>s.push(new De(r,o,l,a))),this.changedRanges=s}static create(t,e,i){return new n(t,e,i)}get viewportChanged(){return(this.flags&4)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&10)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(t=>t.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},eo=class extends et{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new kt],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new De(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:h,toA:f})=>fthis.minWidthTo)?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0);let s=-1;this.view.inputState.composing>=0&&(!((e=this.domChanged)===null||e===void 0)&&e.newSel?s=this.domChanged.newSel.head:!Om(t.changes,this.hasComposition)&&!t.selectionSet&&(s=t.state.selection.main.head));let r=s>-1?vm(this.view,t.changes,s):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:h,to:f}=this.hasComposition;i=new De(h,f,t.changes.mapPos(h,-1),t.changes.mapPos(f,1)).addToSet(i.slice())}this.hasComposition=r?{from:r.range.fromB,to:r.range.toB}:null,(E.ie||E.chrome)&&!r&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let o=this.decorations,l=this.updateDeco(),a=Am(o,l,t.changes);return i=De.extendWithRanges(i,a),!(this.flags&7)&&i.length==0?!1:(this.updateInner(i,t.startState.doc.length,r),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:s}=this.view;s.ignore(()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=E.chrome||E.ios?{node:s.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,o),this.flags&=-8,o&&(o.written||s.selectionRange.focusNode!=o.node)&&(this.forceSelection=!0),this.dom.style.height=""}),this.markedForComposition.forEach(o=>o.flags&=-9);let r=[];if(this.view.viewport.from||this.view.viewport.to=0?s[o]:null;if(!l)break;let{fromA:a,toA:h,fromB:f,toB:c}=l,u,d,p,g;if(i&&i.range.fromBf){let x=pn.build(this.view.state.doc,f,i.range.fromB,this.decorations,this.dynamicDecorationMap),v=pn.build(this.view.state.doc,i.range.toB,c,this.decorations,this.dynamicDecorationMap);d=x.breakAtStart,p=x.openStart,g=v.openEnd;let C=this.compositionView(i);v.breakAtStart?C.breakAfter=1:v.content.length&&C.merge(C.length,C.length,v.content[0],!1,v.openStart,0)&&(C.breakAfter=v.content[0].breakAfter,v.content.shift()),x.content.length&&C.merge(0,0,x.content[x.content.length-1],!0,0,x.openEnd)&&x.content.pop(),u=x.content.concat(C).concat(v.content)}else({content:u,breakAtStart:d,openStart:p,openEnd:g}=pn.build(this.view.state.doc,f,c,this.decorations,this.dynamicDecorationMap));let{i:m,off:b}=r.findPos(h,1),{i:y,off:w}=r.findPos(a,-1);Vu(this,y,w,m,b,u,d,p,g)}i&&this.fixCompositionDOM(i)}compositionView(t){let e=new hi(t.text.nodeValue);e.flags|=8;for(let{deco:s}of t.marks)e=new fi(s,[e],e.length);let i=new kt;return i.append(e,0),i}fixCompositionDOM(t){let e=(r,o)=>{o.flags|=8|(o.children.some(a=>a.flags&7)?1:0),this.markedForComposition.add(o);let l=et.get(r);l&&l!=o&&(l.dom=null),o.setDOM(r)},i=this.childPos(t.range.fromB,1),s=this.children[i.i];e(t.line,s);for(let r=t.marks.length-1;r>=-1;r--)i=s.childPos(i.off,1),s=s.children[i.i],e(r>=0?t.marks[r].node:t.text,s)}updateSelection(t=!1,e=!1){(t||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let i=this.view.root.activeElement,s=i==this.dom,r=!s&&Ur(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(s||e||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(l.anchor)),h=l.empty?a:this.moveToLine(this.domAtPos(l.head));if(E.gecko&&l.empty&&!this.hasComposition&&km(a)){let c=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(c,a.node.childNodes[a.offset]||null)),a=h=new Et(c,0),o=!0}let f=this.view.observer.selectionRange;(o||!f.focusNode||(!dn(a.node,a.offset,f.anchorNode,f.anchorOffset)||!dn(h.node,h.offset,f.focusNode,f.focusOffset))&&!this.suppressWidgetCursorChange(f,l))&&(this.view.observer.ignore(()=>{E.android&&E.chrome&&this.dom.contains(f.focusNode)&&Mm(f.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let c=Xr(this.view.root);if(c)if(l.empty){if(E.gecko){let u=Sm(a.node,a.offset);if(u&&u!=3){let d=ud(a.node,a.offset,u==1?1:-1);d&&(a=new Et(d.node,d.offset))}}c.collapse(a.node,a.offset),l.bidiLevel!=null&&c.caretBidiLevel!==void 0&&(c.caretBidiLevel=l.bidiLevel)}else if(c.extend){c.collapse(a.node,a.offset);try{c.extend(h.node,h.offset)}catch(u){}}else{let u=document.createRange();l.anchor>l.head&&([a,h]=[h,a]),u.setEnd(h.node,h.offset),u.setStart(a.node,a.offset),c.removeAllRanges(),c.addRange(u)}r&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())}),this.view.observer.setSelectionRange(a,h)),this.impreciseAnchor=a.precise?null:new Et(f.anchorNode,f.anchorOffset),this.impreciseHead=h.precise?null:new Et(f.focusNode,f.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&dn(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=Xr(t.root),{anchorNode:s,anchorOffset:r}=t.observer.selectionRange;if(!i||!e.empty||!e.assoc||!i.modify)return;let o=kt.find(this,e.head);if(!o)return;let l=o.posAtStart;if(e.head==l||e.head==l+o.length)return;let a=this.coordsAt(e.head,-1),h=this.coordsAt(e.head,1);if(!a||!h||a.bottom>h.top)return;let f=this.domAtPos(e.head+e.assoc);i.collapse(f.node,f.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let c=t.observer.selectionRange;t.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=e.from&&i.collapse(s,r)}moveToLine(t){let e=this.dom,i;if(t.node!=e)return t;for(let s=t.offset;!i&&s=0;s--){let r=et.get(e.childNodes[s]);r instanceof kt&&(i=r.domAtPos(r.length))}return i?new Et(i.node,i.offset,!0):t}nearest(t){for(let e=t;e;){let i=et.get(e);if(i&&i.rootView==this)return i;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e=0;o--){let l=this.children[o],a=r-l.breakAfter,h=a-l.length;if(at||l.covers(1))&&(!i||l instanceof kt&&!(i instanceof kt&&e>=0))&&(i=l,s=h),r=h}return i?i.coordsAt(t-s,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),s=this.children[e];if(!(s instanceof kt))return null;for(;s.children.length;){let{i:l,off:a}=s.childPos(i,1);for(;;l++){if(l==s.children.length)return null;if((s=s.children[l]).length)break}i=a}if(!(s instanceof hi))return null;let r=Ae(s.text,i);if(r==i)return null;let o=Ii(s.dom,i,r).getClientRects();for(let l=0;lMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,l=-1,a=this.view.textDirection==bt.LTR;for(let h=0,f=0;fs)break;if(h>=i){let d=c.dom.getBoundingClientRect();if(e.push(d.height),o){let p=c.dom.lastChild,g=p?yn(p):[];if(g.length){let m=g[g.length-1],b=a?m.right-d.left:d.right-m.left;b>l&&(l=b,this.minWidth=r,this.minWidthFrom=h,this.minWidthTo=u)}}}h=u+c.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return getComputedStyle(this.children[e].dom).direction=="rtl"?bt.RTL:bt.LTR}measureTextSize(){for(let r of this.children)if(r instanceof kt){let o=r.measureTextSize();if(o)return o}let t=document.createElement("div"),e,i,s;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.dom.appendChild(t);let r=yn(t.firstChild)[0];e=t.getBoundingClientRect().height,i=r?r.width/27:7,s=r?r.height:e,t.remove()}),{lineHeight:e,charWidth:i,textHeight:s}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new Jr(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,s=0;;s++){let r=s==e.viewports.length?null:e.viewports[s],o=r?r.from-1:this.length;if(o>i){let l=(e.lineBlockAt(o).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(Mt.replace({widget:new io(l),block:!0,inclusive:!0,isBlockGap:!0}).range(i,o))}if(!r)break;i=r.to+1}return Mt.set(t)}updateDeco(){let t=this.view.state.facet(Sn).map((s,r)=>(this.dynamicDecorationMap[r]=typeof s=="function")?s(this.view):s),e=!1,i=this.view.state.facet(ld).map((s,r)=>{let o=typeof s=="function";return o&&(e=!0),o?s(this.view):s});i.length&&(this.dynamicDecorationMap[t.length]=e,t.push(ct.join(i)));for(let s=t.length;se.anchor?-1:1),s;if(!i)return;!e.empty&&(s=this.coordsAt(e.anchor,e.anchor>e.head?-1:1))&&(i={left:Math.min(i.left,s.left),top:Math.min(i.top,s.top),right:Math.max(i.right,s.right),bottom:Math.max(i.bottom,s.bottom)});let r=fd(this.view),o={left:i.left-r.left,top:i.top-r.top,right:i.right+r.right,bottom:i.bottom+r.bottom},{offsetWidth:l,offsetHeight:a}=this.view.scrollDOM;em(this.view.scrollDOM,o,e.head0)i=i.childNodes[s-1],s=Ke(i);else break}if(e>=0)for(let i=n,s=t;;){if(i.nodeType==3)return{node:i,offset:s};if(i.nodeType==1&&s=0)i=i.childNodes[s],s=0;else break}return null}function Sm(n,t){return n.nodeType!=1?0:(t&&n.childNodes[t-1].contentEditable=="false"?1:0)|(t{it.from&&(e=!0)}),e}function Tm(n,t,e=1){let i=n.charCategorizer(t),s=n.doc.lineAt(t),r=t-s.from;if(s.length==0)return _.cursor(t);r==0?e=1:r==s.length&&(e=-1);let o=r,l=r;e<0?o=Ae(s.text,r,!1):l=Ae(s.text,r);let a=i(s.text.slice(o,l));for(;o>0;){let h=Ae(s.text,o,!1);if(i(s.text.slice(h,o))!=a)break;o=h}for(;ln?t.left-n:Math.max(0,n-t.right)}function Pm(n,t){return t.top>n?t.top-n:Math.max(0,n-t.bottom)}function ya(n,t){return n.topt.top+1}function pu(n,t){return tn.bottom?{top:n.top,left:n.left,right:n.right,bottom:t}:n}function Ba(n,t,e){let i,s,r,o,l=!1,a,h,f,c;for(let p=n.firstChild;p;p=p.nextSibling){let g=yn(p);for(let m=0;mw||o==w&&r>y){i=p,s=b,r=y,o=w;let x=w?e0?m0)}y==0?e>b.bottom&&(!f||f.bottomb.top)&&(h=p,c=b):f&&ya(f,b)?f=gu(f,b.bottom):c&&ya(c,b)&&(c=pu(c,b.top))}}if(f&&f.bottom>=e?(i=a,s=f):c&&c.top<=e&&(i=h,s=c),!i)return{node:n,offset:0};let u=Math.max(s.left,Math.min(s.right,t));if(i.nodeType==3)return mu(i,u,e);if(l&&i.contentEditable!="false")return Ba(i,u,e);let d=Array.prototype.indexOf.call(n.childNodes,i)+(t>=(s.left+s.right)/2?1:0);return{node:n,offset:d}}function mu(n,t,e){let i=n.nodeValue.length,s=-1,r=1e9,o=0;for(let l=0;le?f.top-e:e-f.bottom)-1;if(f.left-1<=t&&f.right+1>=t&&c=(f.left+f.right)/2,d=u;if((E.chrome||E.gecko)&&Ii(n,l).getBoundingClientRect().left==f.right&&(d=!u),c<=0)return{node:n,offset:l+(d?1:0)};s=l+(d?1:0),r=c}}}return{node:n,offset:s>-1?s:o>0?n.nodeValue.length:0}}function dd(n,t,e,i=-1){var s,r;let o=n.contentDOM.getBoundingClientRect(),l=o.top+n.viewState.paddingTop,a,{docHeight:h}=n.viewState,{x:f,y:c}=t,u=c-l;if(u<0)return 0;if(u>h)return n.state.doc.length;for(let x=n.viewState.heightOracle.textHeight/2,v=!1;a=n.elementAtHeight(u),a.type!=$e.Text;)for(;u=i>0?a.bottom+x:a.top-x,!(u>=0&&u<=h);){if(v)return e?null:0;v=!0,i=-i}c=l+u;let d=a.from;if(dn.viewport.to)return n.viewport.to==n.state.doc.length?n.state.doc.length:e?null:bu(n,o,a,f,c);let p=n.dom.ownerDocument,g=n.root.elementFromPoint?n.root:p,m=g.elementFromPoint(f,c);m&&!n.contentDOM.contains(m)&&(m=null),m||(f=Math.max(o.left+1,Math.min(o.right-1,f)),m=g.elementFromPoint(f,c),m&&!n.contentDOM.contains(m)&&(m=null));let b,y=-1;if(m&&((s=n.docView.nearest(m))===null||s===void 0?void 0:s.isEditable)!=!1){if(p.caretPositionFromPoint){let x=p.caretPositionFromPoint(f,c);x&&({offsetNode:b,offset:y}=x)}else if(p.caretRangeFromPoint){let x=p.caretRangeFromPoint(f,c);x&&({startContainer:b,startOffset:y}=x,(!n.contentDOM.contains(b)||E.safari&&Em(b,y,f)||E.chrome&&Rm(b,y,f))&&(b=void 0))}}if(!b||!n.docView.dom.contains(b)){let x=kt.find(n.docView,d);if(!x)return u>a.top+a.height/2?a.to:a.from;({node:b,offset:y}=Ba(x.dom,f,c))}let w=n.docView.nearest(b);if(!w)return null;if(w.isWidget&&((r=w.dom)===null||r===void 0?void 0:r.nodeType)==1){let x=w.dom.getBoundingClientRect();return t.yn.defaultLineHeight*1.5){let l=n.viewState.heightOracle.textHeight,a=Math.floor((s-e.top-(n.defaultLineHeight-l)*.5)/l);r+=a*n.viewState.heightOracle.lineLength}let o=n.state.sliceDoc(e.from,e.to);return e.from+iu(o,r,n.state.tabSize)}function Em(n,t,e){let i;if(n.nodeType!=3||t!=(i=n.nodeValue.length))return!1;for(let s=n.nextSibling;s;s=s.nextSibling)if(s.nodeType!=1||s.nodeName!="BR")return!1;return Ii(n,i-1,i).getBoundingClientRect().left>e}function Rm(n,t,e){if(t!=0)return!1;for(let s=n;;){let r=s.parentNode;if(!r||r.nodeType!=1||r.firstChild!=s)return!1;if(r.classList.contains("cm-line"))break;s=r}let i=n.nodeType==1?n.getBoundingClientRect():Ii(n,0,Math.max(n.nodeValue.length,1)).getBoundingClientRect();return e-i.left>5}function Bm(n,t){let e=n.lineBlockAt(t);if(Array.isArray(e.type)){for(let i of e.type)if(i.to>t||i.to==t&&(i.to==e.to||i.type==$e.Text))return i}return e}function Nm(n,t,e,i){let s=Bm(n,t.head),r=!i||s.type!=$e.Text||!(n.lineWrapping||s.widgetLineBreaks)?null:n.coordsAtPos(t.assoc<0&&t.head>s.from?t.head-1:t.head);if(r){let o=n.dom.getBoundingClientRect(),l=n.textDirectionAt(s.from),a=n.posAtCoords({x:e==(l==bt.LTR)?o.right-1:o.left+1,y:(r.top+r.bottom)/2});if(a!=null)return _.cursor(a,e?-1:1)}return _.cursor(e?s.to:s.from,e?-1:1)}function yu(n,t,e,i){let s=n.state.doc.lineAt(t.head),r=n.bidiSpans(s),o=n.textDirectionAt(s.from);for(let l=t,a=null;;){let h=bm(s,r,o,l,e),f=Qu;if(!h){if(s.number==(e?n.state.doc.lines:1))return l;f=`\n`,s=n.state.doc.line(s.number+(e?1:-1)),r=n.bidiSpans(s),h=n.visualLineSide(s,!e)}if(a){if(!a(f))return l}else{if(!i)return h;a=i(f)}l=h}}function Im(n,t,e){let i=n.state.charCategorizer(t),s=i(e);return r=>{let o=i(r);return s==Ce.Space&&(s=o),s==o}}function Lm(n,t,e,i){let s=t.head,r=e?1:-1;if(s==(e?n.state.doc.length:0))return _.cursor(s,t.assoc);let o=t.goalColumn,l,a=n.contentDOM.getBoundingClientRect(),h=n.coordsAtPos(s,t.assoc||-1),f=n.documentTop;if(h)o==null&&(o=h.left-a.left),l=r<0?h.top:h.bottom;else{let d=n.viewState.lineBlockAt(s);o==null&&(o=Math.min(a.right-a.left,n.defaultCharacterWidth*(s-d.from))),l=(r<0?d.top:d.bottom)+f}let c=a.left+o,u=i!=null?i:n.viewState.heightOracle.textHeight>>1;for(let d=0;;d+=10){let p=l+(u+d)*r,g=dd(n,{x:c,y:p},!1,r);if(pa.bottom||(r<0?gs)){let m=n.docView.coordsForChar(g),b=!m||p{if(t>r&&ts(n)),e.from,t.head>e.from?-1:1);return i==e.from?e:_.cursor(i,inull),E.gecko&&Qm(t.contentDOM.ownerDocument)}handleEvent(t){!jm(this.view,t)||this.ignoreDuringComposition(t)||t.type=="keydown"&&this.keydown(t)||this.runHandlers(t.type,t)}runHandlers(t,e){let i=this.handlers[t];if(i){for(let s of i.observers)s(this.view,e);for(let s of i.handlers){if(e.defaultPrevented)break;if(s(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=_m(t),i=this.handlers,s=this.view.contentDOM;for(let r in e)if(r!="scroll"){let o=!e[r].handlers.length,l=i[r];l&&o!=!l.handlers.length&&(s.removeEventListener(r,this.handleEvent),l=null),l||s.addEventListener(r,this.handleEvent,{passive:o})}for(let r in i)r!="scroll"&&!e[r]&&s.removeEventListener(r,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),t.keyCode==9&&Date.now()i.keyCode==t.keyCode))&&!t.ctrlKey||Hm.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(this.pendingIOSKey=e||t,setTimeout(()=>this.flushIOSKey(),250),!0):(t.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(){let t=this.pendingIOSKey;return t?(this.pendingIOSKey=void 0,ds(this.view.contentDOM,t.key,t.keyCode)):!1}ignoreDuringComposition(t){return/^key/.test(t.type)?this.composing>0?!0:E.safari&&!E.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1:!1}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function wu(n,t){return(e,i)=>{try{return t.call(n,i,e)}catch(s){Ue(e.state,s)}}}function _m(n){let t=Object.create(null);function e(i){return t[i]||(t[i]={observers:[],handlers:[]})}for(let i of n){let s=i.spec;if(s&&s.domEventHandlers)for(let r in s.domEventHandlers){let o=s.domEventHandlers[r];o&&e(r).handlers.push(wu(i.value,o))}if(s&&s.domEventObservers)for(let r in s.domEventObservers){let o=s.domEventObservers[r];o&&e(r).observers.push(wu(i.value,o))}}for(let i in ae)e(i).handlers.push(ae[i]);for(let i in he)e(i).observers.push(he[i]);return t}var pd=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],Hm="dthko",Fm=[16,17,18,20,91,92,224,225],Wr=6;function qr(n){return Math.max(0,n)*.7+8}function Vm(n,t){return Math.max(Math.abs(n.clientX-t.clientX),Math.abs(n.clientY-t.clientY))}var Ia=class{constructor(t,e,i,s){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=s,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParent=im(t.contentDOM),this.atoms=t.state.facet(eh).map(o=>o(t));let r=t.contentDOM.ownerDocument;r.addEventListener("mousemove",this.move=this.move.bind(this)),r.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(ot.allowMultipleSelections)&&zm(t,e),this.dragging=qm(t,e)&&yd(e)==1?null:!1}start(t){this.dragging===!1&&this.select(t)}move(t){var e;if(t.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&Vm(this.startEvent,t)<10)return;this.select(this.lastEvent=t);let i=0,s=0,r=((e=this.scrollParent)===null||e===void 0?void 0:e.getBoundingClientRect())||{left:0,top:0,right:this.view.win.innerWidth,bottom:this.view.win.innerHeight},o=fd(this.view);t.clientX-o.left<=r.left+Wr?i=-qr(r.left-t.clientX):t.clientX+o.right>=r.right-Wr&&(i=qr(t.clientX-r.right)),t.clientY-o.top<=r.top+Wr?s=-qr(r.top-t.clientY):t.clientY+o.bottom>=r.bottom-Wr&&(s=qr(t.clientY-r.bottom)),this.setScrollSpeed(i,s)}up(t){this.dragging==null&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){this.scrollParent?(this.scrollParent.scrollLeft+=this.scrollSpeed.x,this.scrollParent.scrollTop+=this.scrollSpeed.y):this.view.win.scrollBy(this.scrollSpeed.x,this.scrollSpeed.y),this.dragging===!1&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;ithis.select(this.lastEvent),20)}};function zm(n,t){let e=n.state.facet(Zu);return e.length?e[0](t):E.mac?t.metaKey:t.ctrlKey}function Wm(n,t){let e=n.state.facet(td);return e.length?e[0](t):E.mac?!t.altKey:!t.ctrlKey}function qm(n,t){let{main:e}=n.state.selection;if(e.empty)return!1;let i=Xr(n.root);if(!i||i.rangeCount==0)return!0;let s=i.getRangeAt(0).getClientRects();for(let r=0;r=t.clientX&&o.top<=t.clientY&&o.bottom>=t.clientY)return!0}return!1}function jm(n,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let e=t.target,i;e!=n.contentDOM;e=e.parentNode)if(!e||e.nodeType==11||(i=et.get(e))&&i.ignoreEvent(t))return!1;return!0}var ae=Object.create(null),he=Object.create(null),gd=E.ie&&E.ie_version<15||E.ios&&E.webkit_version<604;function Gm(n){let t=n.dom.parentNode;if(!t)return;let e=t.appendChild(document.createElement("textarea"));e.style.cssText="position: fixed; left: -10000px; top: 10px",e.focus(),setTimeout(()=>{n.focus(),e.remove(),md(n,e.value)},50)}function md(n,t){let{state:e}=n,i,s=1,r=e.toText(t),o=r.lines==e.selection.ranges.length;if(La!=null&&e.selection.ranges.every(a=>a.empty)&&La==r.toString()){let a=-1;i=e.changeByRange(h=>{let f=e.doc.lineAt(h.from);if(f.from==a)return{range:h};a=f.from;let c=e.toText((o?r.line(s++).text:t)+e.lineBreak);return{changes:{from:f.from,insert:c},range:_.cursor(h.from+c.length)}})}else o?i=e.changeByRange(a=>{let h=r.line(s++);return{changes:{from:a.from,to:a.to,insert:h.text},range:_.cursor(a.from+h.length)}}):i=e.replaceSelection(r);n.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}he.scroll=n=>{n.inputState.lastScrollTop=n.scrollDOM.scrollTop,n.inputState.lastScrollLeft=n.scrollDOM.scrollLeft};ae.keydown=(n,t)=>(n.inputState.setSelectionOrigin("select"),t.keyCode==27&&(n.inputState.lastEscPress=Date.now()),!1);he.touchstart=(n,t)=>{n.inputState.lastTouchTime=Date.now(),n.inputState.setSelectionOrigin("select.pointer")};he.touchmove=n=>{n.inputState.setSelectionOrigin("select.pointer")};ae.mousedown=(n,t)=>{if(n.observer.flush(),n.inputState.lastTouchTime>Date.now()-2e3)return!1;let e=null;for(let i of n.state.facet(ed))if(e=i(n,t),e)break;if(!e&&t.button==0&&(e=Km(n,t)),e){let i=!n.hasFocus;n.inputState.startMouseSelection(new Ia(n,t,e,i)),i&&n.observer.ignore(()=>_u(n.contentDOM));let s=n.inputState.mouseSelection;if(s)return s.start(t),s.dragging===!1}return!1};function xu(n,t,e,i){if(i==1)return _.cursor(t,e);if(i==2)return Tm(n.state,t,e);{let s=kt.find(n.docView,t),r=n.state.doc.lineAt(s?s.posAtEnd:t),o=s?s.posAtStart:r.from,l=s?s.posAtEnd:r.to;return ln>=t.top&&n<=t.bottom,ku=(n,t,e)=>bd(t,e)&&n>=e.left&&n<=e.right;function $m(n,t,e,i){let s=kt.find(n.docView,t);if(!s)return 1;let r=t-s.posAtStart;if(r==0)return 1;if(r==s.length)return-1;let o=s.coordsAt(r,-1);if(o&&ku(e,i,o))return-1;let l=s.coordsAt(r,1);return l&&ku(e,i,l)?1:o&&bd(i,o)?-1:1}function vu(n,t){let e=n.posAtCoords({x:t.clientX,y:t.clientY},!1);return{pos:e,bias:$m(n,e,t.clientX,t.clientY)}}var Um=E.ie&&E.ie_version<=11,Su=null,Cu=0,Au=0;function yd(n){if(!Um)return n.detail;let t=Su,e=Au;return Su=n,Au=Date.now(),Cu=!t||e>Date.now()-400&&Math.abs(t.clientX-n.clientX)<2&&Math.abs(t.clientY-n.clientY)<2?(Cu+1)%3:1}function Km(n,t){let e=vu(n,t),i=yd(t),s=n.state.selection;return{update(r){r.docChanged&&(e.pos=r.changes.mapPos(e.pos),s=s.map(r.changes))},get(r,o,l){let a=vu(n,r),h,f=xu(n,a.pos,a.bias,i);if(e.pos!=a.pos&&!o){let c=xu(n,e.pos,e.bias,i),u=Math.min(c.from,f.from),d=Math.max(c.to,f.to);f=u1&&(h=Ym(s,a.pos))?h:l?s.addRange(f):_.create([f])}}}function Ym(n,t){for(let e=0;e=t)return _.create(n.ranges.slice(0,e).concat(n.ranges.slice(e+1)),n.mainIndex==e?0:n.mainIndex-(n.mainIndex>e?1:0))}return null}ae.dragstart=(n,t)=>{let{selection:{main:e}}=n.state;if(t.target.draggable){let s=n.docView.nearest(t.target);if(s&&s.isWidget){let r=s.posAtStart,o=r+s.length;(r>=e.to||o<=e.from)&&(e=_.range(r,o))}}let{inputState:i}=n;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=e,t.dataTransfer&&(t.dataTransfer.setData("Text",n.state.sliceDoc(e.from,e.to)),t.dataTransfer.effectAllowed="copyMove"),!1};ae.dragend=n=>(n.inputState.draggedContent=null,!1);function Mu(n,t,e,i){if(!e)return;let s=n.posAtCoords({x:t.clientX,y:t.clientY},!1),{draggedContent:r}=n.inputState,o=i&&r&&Wm(n,t)?{from:r.from,to:r.to}:null,l={from:s,insert:e},a=n.state.changes(o?[o,l]:l);n.focus(),n.dispatch({changes:a,selection:{anchor:a.mapPos(s,-1),head:a.mapPos(s,1)},userEvent:o?"move.drop":"input.drop"}),n.inputState.draggedContent=null}ae.drop=(n,t)=>{if(!t.dataTransfer)return!1;if(n.state.readOnly)return!0;let e=t.dataTransfer.files;if(e&&e.length){let i=Array(e.length),s=0,r=()=>{++s==e.length&&Mu(n,t,i.filter(o=>o!=null).join(n.state.lineBreak),!1)};for(let o=0;o{/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(l.result)||(i[o]=l.result),r()},l.readAsText(e[o])}return!0}else{let i=t.dataTransfer.getData("Text");if(i)return Mu(n,t,i,!0),!0}return!1};ae.paste=(n,t)=>{if(n.state.readOnly)return!0;n.observer.flush();let e=gd?null:t.clipboardData;return e?(md(n,e.getData("text/plain")||e.getData("text/uri-text")),!0):(Gm(n),!1)};function Xm(n,t){let e=n.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=t,i.focus(),i.selectionEnd=t.length,i.selectionStart=0,setTimeout(()=>{i.remove(),n.focus()},50)}function Jm(n){let t=[],e=[],i=!1;for(let s of n.selection.ranges)s.empty||(t.push(n.sliceDoc(s.from,s.to)),e.push(s));if(!t.length){let s=-1;for(let{from:r}of n.selection.ranges){let o=n.doc.lineAt(r);o.number>s&&(t.push(o.text),e.push({from:o.from,to:Math.min(n.doc.length,o.to+1)})),s=o.number}i=!0}return{text:t.join(n.lineBreak),ranges:e,linewise:i}}var La=null;ae.copy=ae.cut=(n,t)=>{let{text:e,ranges:i,linewise:s}=Jm(n.state);if(!e&&!s)return!1;La=s?e:null,t.type=="cut"&&!n.state.readOnly&&n.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let r=gd?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",e),!0):(Xm(n,e),!1)};var wd=je.define();function xd(n,t){let e=[];for(let i of n.facet(nd)){let s=i(n,t);s&&e.push(s)}return e?n.update({effects:e,annotations:wd.of(!0)}):null}function kd(n){setTimeout(()=>{let t=n.hasFocus;if(t!=n.inputState.notifiedFocused){let e=xd(n.state,t);e?n.dispatch(e):n.update([])}},10)}he.focus=n=>{n.inputState.lastFocusTime=Date.now(),!n.scrollDOM.scrollTop&&(n.inputState.lastScrollTop||n.inputState.lastScrollLeft)&&(n.scrollDOM.scrollTop=n.inputState.lastScrollTop,n.scrollDOM.scrollLeft=n.inputState.lastScrollLeft),kd(n)};he.blur=n=>{n.observer.clearSelectionRange(),kd(n)};he.compositionstart=he.compositionupdate=n=>{n.inputState.compositionFirstChange==null&&(n.inputState.compositionFirstChange=!0),n.inputState.composing<0&&(n.inputState.composing=0)};he.compositionend=n=>{n.inputState.composing=-1,n.inputState.compositionEndedAt=Date.now(),n.inputState.compositionPendingKey=!0,n.inputState.compositionPendingChange=n.observer.pendingRecords().length>0,n.inputState.compositionFirstChange=null,E.chrome&&E.android?n.observer.flushSoon():n.inputState.compositionPendingChange?Promise.resolve().then(()=>n.observer.flush()):setTimeout(()=>{n.inputState.composing<0&&n.docView.hasComposition&&n.update([])},50)};he.contextmenu=n=>{n.inputState.lastContextMenu=Date.now()};ae.beforeinput=(n,t)=>{var e;let i;if(E.chrome&&E.android&&(i=pd.find(s=>s.inputType==t.inputType))&&(n.observer.delayAndroidKey(i.key,i.keyCode),i.key=="Backspace"||i.key=="Delete")){let s=((e=window.visualViewport)===null||e===void 0?void 0:e.height)||0;setTimeout(()=>{var r;(((r=window.visualViewport)===null||r===void 0?void 0:r.height)||0)>s+10&&n.hasFocus&&(n.contentDOM.blur(),n.focus())},100)}return!1};var Ou=new Set;function Qm(n){Ou.has(n)||(Ou.add(n),n.addEventListener("copy",()=>{}),n.addEventListener("cut",()=>{}))}var Tu=["pre-wrap","normal","pre-line","break-spaces"],_a=class{constructor(t){this.lineWrapping=t,this.doc=G.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30,this.heightChanged=!1}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){return this.lineWrapping?(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return Tu.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=l;if(this.lineWrapping=l,this.lineHeight=e,this.charWidth=i,this.textHeight=s,this.lineLength=r,a){this.heightSamples={};for(let h=0;h0}set outdated(t){this.flags=(t?2:0)|this.flags&-3}setHeight(t,e){this.height!=e&&(Math.abs(this.height-e)>Yr&&(t.heightChanged=!0),this.height=e)}replace(t,e,i){return n.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,s){let r=this,o=i.doc;for(let l=s.length-1;l>=0;l--){let{fromA:a,toA:h,fromB:f,toB:c}=s[l],u=r.lineAt(a,tt.ByPosNoHeight,i.setDoc(e),0,0),d=u.to>=h?u:r.lineAt(h,tt.ByPosNoHeight,i,0,0);for(c+=d.to-h,h=d.to;l>0&&u.from<=s[l-1].toA;)a=s[l-1].fromA,f=s[l-1].fromB,l--,ar*2){let l=t[e-1];l.break?t.splice(--e,1,l.left,null,l.right):t.splice(--e,1,l.left,l.right),i+=1+l.break,s-=l.size}else if(r>s*2){let l=t[i];l.break?t.splice(i,1,l.left,null,l.right):t.splice(i,1,l.left,l.right),i+=2+l.break,r-=l.size}else break;else if(s=r&&o(this.blockAt(0,i,s,r))}updateHeight(t,e=0,i=!1,s){return s&&s.from<=e&&s.more&&this.setHeight(t,s.heights[s.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}},ie=class n extends so{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,s){return new Oe(s,this.length,i,this.height,this.breaks)}replace(t,e,i){let s=i[0];return i.length==1&&(s instanceof n||s instanceof ai&&s.flags&4)&&Math.abs(this.length-s.length)<10?(s instanceof ai?s=new n(s.length,this.height):s.height=this.height,this.outdated||(s.outdated=!1),s):jt.of(i)}updateHeight(t,e=0,i=!1,s){return s&&s.from<=e&&s.more?this.setHeight(t,s.heights[s.index++]):(i||this.outdated)&&this.setHeight(t,Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},ai=class n extends jt{constructor(t){super(t,0)}heightMetrics(t,e){let i=t.doc.lineAt(e).number,s=t.doc.lineAt(e+this.length).number,r=s-i+1,o,l=0;if(t.lineWrapping){let a=Math.min(this.height,t.lineHeight*r);o=a/r,this.length>r+1&&(l=(this.height-a)/(this.length-r-1))}else o=this.height/r;return{firstLine:i,lastLine:s,perLine:o,perChar:l}}blockAt(t,e,i,s){let{firstLine:r,lastLine:o,perLine:l,perChar:a}=this.heightMetrics(e,s);if(e.lineWrapping){let h=s+Math.round(Math.max(0,Math.min(1,(t-i)/this.height))*this.length),f=e.doc.lineAt(h),c=l+f.length*a,u=Math.max(i,t-c/2);return new Oe(f.from,f.length,u,c,0)}else{let h=Math.max(0,Math.min(o-r,Math.floor((t-i)/l))),{from:f,length:c}=e.doc.line(r+h);return new Oe(f,c,i+l*h,l,0)}}lineAt(t,e,i,s,r){if(e==tt.ByHeight)return this.blockAt(t,i,s,r);if(e==tt.ByPosNoHeight){let{from:d,to:p}=i.doc.lineAt(t);return new Oe(d,p-d,0,0,0)}let{firstLine:o,perLine:l,perChar:a}=this.heightMetrics(i,r),h=i.doc.lineAt(t),f=l+h.length*a,c=h.number-o,u=s+l*c+a*(h.from-r-c);return new Oe(h.from,h.length,Math.max(s,Math.min(u,s+this.height-f)),f,0)}forEachLine(t,e,i,s,r,o){t=Math.max(t,r),e=Math.min(e,r+this.length);let{firstLine:l,perLine:a,perChar:h}=this.heightMetrics(i,r);for(let f=t,c=s;f<=e;){let u=i.doc.lineAt(f);if(f==t){let p=u.number-l;c+=a*p+h*(t-r-p)}let d=a+h*u.length;o(new Oe(u.from,u.length,c,d,0)),c+=d,f=u.to+1}}replace(t,e,i){let s=this.length-e;if(s>0){let r=i[i.length-1];r instanceof n?i[i.length-1]=new n(r.length+s):i.push(null,new n(s-1))}if(t>0){let r=i[0];r instanceof n?i[0]=new n(t+r.length):i.unshift(new n(t-1),null)}return jt.of(i)}decomposeLeft(t,e){e.push(new n(t-1),null)}decomposeRight(t,e){e.push(null,new n(this.length-t-1))}updateHeight(t,e=0,i=!1,s){let r=e+this.length;if(s&&s.from<=e+this.length&&s.more){let o=[],l=Math.max(e,s.from),a=-1;for(s.from>e&&o.push(new n(s.from-e-1).updateHeight(t,e));l<=r&&s.more;){let f=t.doc.lineAt(l).length;o.length&&o.push(null);let c=s.heights[s.index++];a==-1?a=c:Math.abs(c-a)>=Yr&&(a=-2);let u=new ie(f,c);u.outdated=!1,o.push(u),l+=f+1}l<=r&&o.push(null,new n(r-l).updateHeight(t,l));let h=jt.of(o);return(a<0||Math.abs(h.height-this.height)>=Yr||Math.abs(a-this.heightMetrics(t,e).perLine)>=Yr)&&(t.heightChanged=!0),h}else(i||this.outdated)&&(this.setHeight(t,t.heightForGap(e,e+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},Fa=class extends jt{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return this.flags&1}blockAt(t,e,i,s){let r=i+this.left.height;return tl))return h;let f=e==tt.ByPosNoHeight?tt.ByPosNoHeight:tt.ByPos;return a?h.join(this.right.lineAt(l,f,i,o,l)):this.left.lineAt(l,f,i,s,r).join(h)}forEachLine(t,e,i,s,r,o){let l=s+this.left.height,a=r+this.left.length+this.break;if(this.break)t=a&&this.right.forEachLine(t,e,i,l,a,o);else{let h=this.lineAt(a,tt.ByPos,i,s,r);t=t&&h.from<=e&&o(h),e>h.to&&this.right.forEachLine(h.to+1,e,i,l,a,o)}}replace(t,e,i){let s=this.left.length+this.break;if(ethis.left.length)return this.balanced(this.left,this.right.replace(t-s,e-s,i));let r=[];t>0&&this.decomposeLeft(t,r);let o=r.length;for(let l of i)r.push(l);if(t>0&&Du(r,o-1),e=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,s=i+this.break;if(t>=s)return this.right.decomposeRight(t-s,e);t2*e.size||e.size>2*t.size?jt.of(this.break?[t,null,e]:[t,e]):(this.left=t,this.right=e,this.height=t.height+e.height,this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,s){let{left:r,right:o}=this,l=e+r.length+this.break,a=null;return s&&s.from<=e+r.length&&s.more?a=r=r.updateHeight(t,e,i,s):r.updateHeight(t,e,i),s&&s.from<=l+o.length&&s.more?a=o=o.updateHeight(t,l,i,s):o.updateHeight(t,l,i),a?this.balanced(r,o):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function Du(n,t){let e,i;n[t]==null&&(e=n[t-1])instanceof ai&&(i=n[t+1])instanceof ai&&n.splice(t-1,3,new ai(e.length+1+i.length))}var Zm=5,Va=class n{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let i=Math.min(e,this.lineEnd),s=this.nodes[this.nodes.length-1];s instanceof ie?s.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new ie(i-this.pos,-1)),this.writtenTo=i,e>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t=Zm)&&this.addLineDeco(s,r,o)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTot&&this.nodes.push(new ie(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new ai(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof ie)return t;let e=new ie(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let s=this.ensureLine();s.length+=i,s.collapsed+=i,s.widgetHeight=Math.max(s.widgetHeight,t),s.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(e instanceof ie)&&!this.isCovered?this.nodes.push(new ie(0,-1)):(this.writtenTof.clientHeight||f.scrollWidth>f.clientWidth)&&c.overflow!="visible"){let u=f.getBoundingClientRect();r=Math.max(r,u.left),o=Math.min(o,u.right),l=Math.max(l,u.top),a=h==n.parentNode?u.bottom:Math.min(a,u.bottom)}h=c.position=="absolute"||c.position=="fixed"?f.offsetParent:f.parentNode}else if(h.nodeType==11)h=h.host;else break;return{left:r-e.left,right:Math.max(r,o)-e.left,top:l-(e.top+t),bottom:Math.max(l,a)-(e.top+t)}}function i0(n,t){let e=n.getBoundingClientRect();return{left:0,right:e.right-e.left,top:t,bottom:e.bottom-(e.top+t)}}var bn=class{constructor(t,e,i){this.from=t,this.to=e,this.size=i}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new _a(e),this.stateDeco=t.facet(Sn).filter(i=>typeof i!="function"),this.heightMap=jt.empty().applyChanges(this.stateDeco,G.empty,this.heightOracle.setDoc(t.doc),[new De(0,0,0,t.doc.length)]),this.viewport=this.getViewport(0,null),this.updateViewportLines(),this.updateForViewport(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=Mt.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let s=i?e.head:e.anchor;if(!t.some(({from:r,to:o})=>s>=r&&s<=o)){let{from:r,to:o}=this.lineBlockAt(s);t.push(new us(r,o))}}this.viewports=t.sort((i,s)=>i.from-s.from),this.scaler=this.heightMap.height<=7e6?Pu:new qa(this.heightOracle,this.heightMap,this.viewports)}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,t=>{this.viewportLines.push(this.scaler.scale==1?t:cn(t,this.scaler))})}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(Sn).filter(f=>typeof f!="function");let s=t.changedRanges,r=De.extendWithRanges(s,t0(i,this.stateDeco,t?t.changes:Wt.empty(this.state.doc.length))),o=this.heightMap.height,l=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),r),this.heightMap.height!=o&&(t.flags|=2),l?(this.scrollAnchorPos=t.changes.mapPos(l.from,-1),this.scrollAnchorHeight=l.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=this.heightMap.height);let a=r.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let h=!t.changes.empty||t.flags&2||a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,this.updateForViewport(),h&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(wm)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let e=t.contentDOM,i=window.getComputedStyle(e),s=this.heightOracle,r=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?bt.RTL:bt.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=e.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,f=0;if(l.width&&l.height){let{scaleX:x,scaleY:v}=Lu(e,l);(this.scaleX!=x||this.scaleY!=v)&&(this.scaleX=x,this.scaleY=v,h|=8,o=a=!0)}let c=(parseInt(i.paddingTop)||0)*this.scaleY,u=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=c||this.paddingBottom!=u)&&(this.paddingTop=c,this.paddingBottom=u,h|=10),this.editorWidth!=t.scrollDOM.clientWidth&&(s.lineWrapping&&(a=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=8);let d=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=Fu(t.scrollDOM);let p=(this.printing?i0:e0)(e,this.paddingTop),g=p.top-this.pixelViewport.top,m=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let b=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(b!=this.inView&&(this.inView=b,b&&(a=!0)),!this.inView&&!this.scrollTarget)return 0;let y=l.width;if((this.contentDOMWidth!=y||this.editorHeight!=t.scrollDOM.clientHeight)&&(this.contentDOMWidth=l.width,this.editorHeight=t.scrollDOM.clientHeight,h|=8),a){let x=t.docView.measureVisibleLineHeights(this.viewport);if(s.mustRefreshForHeights(x)&&(o=!0),o||s.lineWrapping&&Math.abs(y-this.contentDOMWidth)>s.charWidth){let{lineHeight:v,charWidth:C,textHeight:k}=t.docView.measureTextSize();o=v>0&&s.refresh(r,v,C,k,y/C,x),o&&(t.docView.minWidth=0,h|=8)}g>0&&m>0?f=Math.max(g,m):g<0&&m<0&&(f=Math.min(g,m)),s.heightChanged=!1;for(let v of this.viewports){let C=v.from==this.viewport.from?x:t.docView.measureVisibleLineHeights(v);this.heightMap=(o?jt.empty().applyChanges(this.stateDeco,G.empty,this.heightOracle,[new De(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(s,0,o,new Ha(v.from,C))}s.heightChanged&&(h|=2)}let w=!this.viewportIsAppropriate(this.viewport,f)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return w&&(this.viewport=this.getViewport(f,this.scrollTarget)),this.updateForViewport(),(h&2||w)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),s=this.heightMap,r=this.heightOracle,{visibleTop:o,visibleBottom:l}=this,a=new us(s.lineAt(o-i*1e3,tt.ByHeight,r,0,0).from,s.lineAt(l+(1-i)*1e3,tt.ByHeight,r,0,0).to);if(e){let{head:h}=e.range;if(ha.to){let f=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),c=s.lineAt(h,tt.ByPos,r,0,0),u;e.y=="center"?u=(c.top+c.bottom)/2-f/2:e.y=="start"||e.y=="nearest"&&h=l+Math.max(10,Math.min(i,250)))&&s>o-2*1e3&&r>1,o=s<<1;if(this.defaultTextDirection!=bt.LTR&&!i)return[];let l=[],a=(h,f,c,u)=>{if(f-hh&&mm.from>=c.from&&m.to<=c.to&&Math.abs(m.from-h)m.fromb));if(!g){if(fm.from<=f&&m.to>=f)){let m=e.moveToLineBoundary(_.cursor(f),!1,!0).head;m>h&&(f=m)}g=new bn(h,f,this.gapSize(c,h,f,u))}l.push(g)};for(let h of this.viewportLines){if(h.lengthh.from&&a(h.from,u,h,f),de.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let e=[];ct.spans(t,this.viewport.from,this.viewport.to,{span(s,r){e.push({from:s,to:r})},point(){}},20);let i=e.length!=this.visibleRanges.length||this.visibleRanges.some((s,r)=>s.from!=e[r].from||s.to!=e[r].to);return this.visibleRanges=e,i?4:0}lineBlockAt(t){return t>=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find(e=>e.from<=t&&e.to>=t)||cn(this.heightMap.lineAt(t,tt.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return cn(this.heightMap.lineAt(this.scaler.fromDOM(t),tt.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return cn(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},us=class{constructor(t,e){this.from=t,this.to=e}};function s0(n,t,e){let i=[],s=n,r=0;return ct.spans(e,n,t,{span(){},point(o,l){o>s&&(i.push({from:s,to:o}),r+=o-s),s=l}},20),s=1)return t[t.length-1].to;let i=Math.floor(n*e);for(let s=0;;s++){let{from:r,to:o}=t[s],l=o-r;if(i<=l)return r+i;i-=l}}function Gr(n,t){let e=0;for(let{from:i,to:s}of n.ranges){if(t<=s){e+=t-i;break}e+=s-i}return e/n.total}function n0(n,t){for(let e of n)if(t(e))return e}var Pu={toDOM(n){return n},fromDOM(n){return n},scale:1},qa=class{constructor(t,e,i){let s=0,r=0,o=0;this.viewports=i.map(({from:l,to:a})=>{let h=e.lineAt(l,tt.ByPos,t,0,0).top,f=e.lineAt(a,tt.ByPos,t,0,0).bottom;return s+=f-h,{from:l,to:a,top:h,bottom:f,domTop:0,domBottom:0}}),this.scale=(7e6-s)/(e.height-s);for(let l of this.viewports)l.domTop=o+(l.top-r)*this.scale,o=l.domBottom=l.domTop+(l.bottom-l.top),r=l.bottom}toDOM(t){for(let e=0,i=0,s=0;;e++){let r=ecn(s,t)):n._content)}var $r=V.define({combine:n=>n.join(" ")}),ja=V.define({combine:n=>n.indexOf(!0)>-1}),Ga=ee.newName(),vd=ee.newName(),Sd=ee.newName(),Cd={"&light":"."+vd,"&dark":"."+Sd};function $a(n,t,e){return new ee(t,{finish(i){return/&/.test(i)?i.replace(/&\\w*/,s=>{if(s=="&")return n;if(!e||!e[s])throw new RangeError(`Unsupported selector: ${s}`);return e[s]}):n+" "+i}})}var r0=$a("."+Ga,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#444"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top"},".cm-highlightSpace:before":{content:"attr(data-display)",position:"absolute",pointerEvents:"none",color:"#888"},".cm-highlightTab":{backgroundImage:`url(\'data:image/svg+xml,\')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Cd),un="\\uFFFF",Ua=class{constructor(t,e){this.points=t,this.text="",this.lineSeparator=e.facet(ot.lineSeparator)}append(t){this.text+=t}lineBreak(){this.text+=un}readRange(t,e){if(!t)return this;let i=t.parentNode;for(let s=t;;){this.findPointBefore(i,s);let r=this.text.length;this.readNode(s);let o=s.nextSibling;if(o==e)break;let l=et.get(s),a=et.get(o);(l&&a?l.breakAfter:(l?l.breakAfter:Eu(s))||Eu(o)&&(s.nodeName!="BR"||s.cmIgnore)&&this.text.length>r)&&this.lineBreak(),s=o}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,s=this.lineSeparator?null:/\\r\\n?|\\n/g;;){let r=-1,o=1,l;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(l=s.exec(e))&&(r=l.index,o=l[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let a of this.points)a.node==t&&a.pos>this.text.length&&(a.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=et.get(t),i=e&&e.overrideDOMText;if(i!=null){this.findPointInside(t,i.length);for(let s=i.iter();!s.next().done;)s.lineBreak?this.lineBreak():this.append(s.value)}else t.nodeType==3?this.readTextNode(t):t.nodeName=="BR"?t.nextSibling&&this.lineBreak():t.nodeType==1&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(t.nodeType==3?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+(o0(t,i.node,i.offset)?e:0))}};function o0(n,t,e){for(;;){if(!t||e-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let l=r||o?[]:h0(t),a=new Ua(l,t.state);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=f0(l,this.bounds.from)}else{let l=t.observer.selectionRange,a=r&&r.node==l.focusNode&&r.offset==l.focusOffset||!ka(t.contentDOM,l.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(l.focusNode,l.focusOffset),h=o&&o.node==l.anchorNode&&o.offset==l.anchorOffset||!ka(t.contentDOM,l.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(l.anchorNode,l.anchorOffset),f=t.viewport;if(E.ios&&t.state.selection.main.empty&&a!=h&&(f.from>0||f.toDate.now()-100?n.inputState.lastKeyCode:-1;if(t.bounds){let{from:o,to:l}=t.bounds,a=s.from,h=null;(r===8||E.android&&t.text.length=s.from&&e.to<=s.to&&(e.from!=s.from||e.to!=s.to)&&s.to-s.from-(e.to-e.from)<=4?e={from:s.from,to:s.to,insert:n.state.doc.slice(s.from,e.from).append(e.insert).append(n.state.doc.slice(e.to,s.to))}:(E.mac||E.android)&&e&&e.from==e.to&&e.from==s.head-1&&/^\\. ?$/.test(e.insert.toString())&&n.contentDOM.getAttribute("autocorrect")=="off"?(i&&e.insert.length==2&&(i=_.single(i.main.anchor-1,i.main.head-1)),e={from:s.from,to:s.to,insert:G.of([" "])}):E.chrome&&e&&e.from==e.to&&e.from==s.head&&e.insert.toString()==`\n `&&n.lineWrapping&&(i&&(i=_.single(i.main.anchor-1,i.main.head-1)),e={from:s.from,to:s.to,insert:G.of([" "])}),e){if(E.ios&&n.inputState.flushIOSKey()||E.android&&(e.from==s.from&&e.to==s.to&&e.insert.length==1&&e.insert.lines==2&&ds(n.contentDOM,"Enter",13)||(e.from==s.from-1&&e.to==s.to&&e.insert.length==0||r==8&&e.insert.lengths.head)&&ds(n.contentDOM,"Backspace",8)||e.from==s.from&&e.to==s.to+1&&e.insert.length==0&&ds(n.contentDOM,"Delete",46)))return!0;let o=e.insert.toString();n.inputState.composing>=0&&n.inputState.composing++;let l,a=()=>l||(l=l0(n,e,i));return n.state.facet(sd).some(h=>h(n,e.from,e.to,o,a))||n.dispatch(a()),!0}else if(i&&!i.main.eq(s)){let o=!1,l="select";return n.inputState.lastSelectionTime>Date.now()-50&&(n.inputState.lastSelectionOrigin=="select"&&(o=!0),l=n.inputState.lastSelectionOrigin),n.dispatch({selection:i,scrollIntoView:o,userEvent:l}),!0}else return!1}function l0(n,t,e){let i,s=n.state,r=s.selection.main;if(t.from>=r.from&&t.to<=r.to&&t.to-t.from>=(r.to-r.from)/3&&(!e||e.main.empty&&e.main.from==t.from+t.insert.length)&&n.inputState.composing<0){let l=r.fromt.to?s.sliceDoc(t.to,r.to):"";i=s.replaceSelection(n.state.toText(l+t.insert.sliceString(0,void 0,n.state.lineBreak)+a))}else{let l=s.changes(t),a=e&&e.main.to<=l.newLength?e.main:void 0;if(s.selection.ranges.length>1&&n.inputState.composing>=0&&t.to<=r.to&&t.to>=r.to-10){let h=n.state.sliceDoc(t.from,t.to),f,c=e&&cd(n,e.main.head);if(c){let p=t.insert.length-(t.to-t.from);f={from:c.from,to:c.to-p}}else f=n.state.doc.lineAt(r.head);let u=r.to-t.to,d=r.to-r.from;i=s.changeByRange(p=>{if(p.from==r.from&&p.to==r.to)return{changes:l,range:a||p.map(l)};let g=p.to-u,m=g-h.length;if(p.to-p.from!=d||n.state.sliceDoc(m,g)!=h||p.to>=f.from&&p.from<=f.to)return{range:p};let b=s.changes({from:m,to:g,insert:t.insert}),y=p.to-r.to;return{changes:b,range:a?_.range(Math.max(0,a.anchor+y),Math.max(0,a.head+y)):p.map(b)}})}else i={changes:l,selection:a&&s.selection.replaceRange(a)}}let o="input.type";return(n.composing||n.inputState.compositionPendingChange&&n.inputState.compositionEndedAt>Date.now()-50)&&(n.inputState.compositionPendingChange=!1,o+=".compose",n.inputState.compositionFirstChange&&(o+=".start",n.inputState.compositionFirstChange=!1)),s.update(i,{userEvent:o,scrollIntoView:!0})}function a0(n,t,e,i){let s=Math.min(n.length,t.length),r=0;for(;r0&&l>0&&n.charCodeAt(o-1)==t.charCodeAt(l-1);)o--,l--;if(i=="end"){let a=Math.max(0,r-Math.min(o,l));e-=o+a-r}if(o=o?r-e:0;r-=a,l=r+(l-o),o=r}else if(l=l?r-e:0;r-=a,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}function h0(n){let t=[];if(n.root.activeElement!=n.contentDOM)return t;let{anchorNode:e,anchorOffset:i,focusNode:s,focusOffset:r}=n.observer.selectionRange;return e&&(t.push(new ro(e,i)),(s!=e||r!=i)&&t.push(new ro(s,r))),t}function f0(n,t){if(n.length==0)return null;let e=n[0].pos,i=n.length==2?n[1].pos:e;return e>-1&&i>-1?_.single(e+t,i+t):null}var c0={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},xa=E.ie&&E.ie_version<=11,Ya=class{constructor(t){this.view=t,this.active=!1,this.selectionRange=new va,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver(e=>{for(let i of e)this.queue.push(i);(E.ie&&E.ie_version<=11||E.ios&&t.composing)&&e.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),xa&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var e;((e=this.view.docView)===null||e===void 0?void 0:e.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(){this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500)}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some((e,i)=>e!=t[i]))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,s=this.selectionRange;if(i.state.facet(ao)?i.root.activeElement!=this.dom:!Ur(i.dom,s))return;let r=s.anchorNode&&i.docView.nearest(s.anchorNode);if(r&&r.ignoreEvent(t)){e||(this.selectionChanged=!1);return}(E.ie&&E.ie_version<=11||E.android&&E.chrome)&&!i.state.selection.main.empty&&s.focusNode&&dn(s.focusNode,s.focusOffset,s.anchorNode,s.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=E.safari&&t.root.nodeType==11&&Zg(this.dom.ownerDocument)==this.dom&&u0(this.view)||Xr(t.root);if(!e||this.selectionRange.eq(e))return!1;let i=Ur(this.dom,e);return i&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime{let r=this.delayedAndroidKey;r&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=r.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&r.force&&ds(this.dom,r.key,r.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(s)}(!this.delayedAndroidKey||t=="Enter")&&(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,s=!1;for(let r of t){let o=this.readMutation(r);o&&(o.typeOver&&(s=!0),e==-1?{from:e,to:i}=o:(e=Math.min(o.from,e),i=Math.max(o.to,i)))}return{from:e,to:i,typeOver:s}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),s=this.selectionChanged&&Ur(this.dom,this.selectionRange);if(t<0&&!s)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let r=new Ka(this.view,t,e,i);return this.view.docView.domChanged={newSel:r.newSel?r.newSel.main:null},r}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,s=Ad(this.view,e);return this.view.state==i&&this.view.update([]),s}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty(t.type=="attributes"),t.type=="attributes"&&(e.flags|=4),t.type=="childList"){let i=Ru(e,t.previousSibling||t.target.previousSibling,-1),s=Ru(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:s?e.posBefore(s):e.posAtEnd,typeOver:!1}}else return t.type=="characterData"?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}destroy(){var t,e,i;this.stop(),(t=this.intersection)===null||t===void 0||t.disconnect(),(e=this.gapIntersection)===null||e===void 0||e.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let s of this.scrollTargets)s.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey)}};function Ru(n,t,e){for(;t;){let i=et.get(t);if(i&&i.parent==n)return i;let s=t.parentNode;t=s!=n.dom?s:e>0?t.nextSibling:t.previousSibling}return null}function u0(n){let t=null;function e(a){a.preventDefault(),a.stopImmediatePropagation(),t=a.getTargetRanges()[0]}if(n.contentDOM.addEventListener("beforeinput",e,!0),n.dom.ownerDocument.execCommand("indent"),n.contentDOM.removeEventListener("beforeinput",e,!0),!t)return null;let i=t.startContainer,s=t.startOffset,r=t.endContainer,o=t.endOffset,l=n.docView.domAtPos(n.state.selection.main.anchor);return dn(l.node,l.offset,r,o)&&([i,s,r,o]=[r,o,i,s]),{anchorNode:i,anchorOffset:s,focusNode:r,focusOffset:o}}var X=class n{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return this.inputState.composing>0}get compositionStarted(){return this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:e}=t;this.dispatchTransactions=t.dispatchTransactions||e&&(i=>i.forEach(s=>e(s,this)))||(i=>this.update(i)),this.dispatch=this.dispatch.bind(this),this._root=t.root||sm(t.parent)||document,this.viewState=new no(t.state||ot.create(t)),t.scrollTo&&t.scrollTo.is(zr)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(hn).map(i=>new mn(i));for(let i of this.plugins)i.update(this);this.observer=new Ya(this),this.inputState=new Na(this),this.inputState.ensureHandlers(this.plugins),this.docView=new eo(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure()}dispatch(...t){let e=t.length==1&&t[0]instanceof Lt?t:t.length==1&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e=!1,i=!1,s,r=this.state;for(let u of t){if(u.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn\'t start from the previous state.");r=u.state}if(this.destroyed){this.viewState.state=r;return}let o=this.hasFocus,l=0,a=null;t.some(u=>u.annotation(wd))?(this.inputState.notifiedFocused=o,l=1):o!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=o,a=xd(r,o),a||(l=1));let h=this.observer.delayedAndroidKey,f=null;if(h?(this.observer.clearDelayedAndroidKey(),f=this.observer.readChange(),(f&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(f=null)):this.observer.clear(),r.facet(ot.phrases)!=this.state.facet(ot.phrases))return this.setState(r);s=to.create(this,r,t),s.flags|=l;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let u of t){if(c&&(c=c.map(u.changes)),u.scrollIntoView){let{main:d}=u.state.selection;c=new gn(d.empty?d:_.cursor(d.head,d.head>d.anchor?-1:1))}for(let d of u.effects)d.is(zr)&&(c=d.value.clip(this.state))}this.viewState.update(s,c),this.bidiCache=oo.update(this.bidiCache,s.changes),s.empty||(this.updatePlugins(s),this.inputState.update(s)),e=this.docView.update(s),this.state.facet(fn)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(e,t.some(u=>u.isUserEvent("select.pointer")))}finally{this.updateState=0}if(s.startState.facet($r)!=s.state.facet($r)&&(this.viewState.mustMeasureContent=!0),(e||i||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),!s.empty)for(let u of this.state.facet(Ra))try{u(s)}catch(d){Ue(this.state,d,"update listener")}(a||f)&&Promise.resolve().then(()=>{a&&this.state==a.startState&&this.dispatch(a),f&&!Ad(this,f)&&h.force&&ds(this.contentDOM,h.key,h.keyCode)})}setState(t){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=t;return}this.updateState=2;let e=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new no(t),this.plugins=t.facet(hn).map(i=>new mn(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new eo(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(hn),i=t.state.facet(hn);if(e!=i){let s=[];for(let r of i){let o=e.indexOf(r);if(o<0)s.push(new mn(r));else{let l=this.plugins[o];l.mustUpdate=t,s.push(l)}}for(let r of this.plugins)r.mustUpdate!=t&&r.destroy(this);this.plugins=s,this.pluginMap.clear()}else for(let s of this.plugins)s.mustUpdate=t;for(let s=0;s-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,s=i.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:o}=this.viewState;Math.abs(s-this.viewState.scrollTop)>1&&(o=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(o<0)if(Fu(i))r=-1,o=this.viewState.heightMap.height;else{let d=this.viewState.scrollAnchorAt(s);r=d.from,o=d.top}this.updateState=1;let a=this.viewState.measure(this);if(!a&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let h=[];a&4||([this.measureRequests,h]=[h,this.measureRequests]);let f=h.map(d=>{try{return d.read(this)}catch(p){return Ue(this.state,p),Bu}}),c=to.create(this,this.state,[]),u=!1;c.flags|=a,e?e.flags|=a:e=c,this.updateState=2,c.empty||(this.updatePlugins(c),this.inputState.update(c),this.updateAttrs(),u=this.docView.update(c));for(let d=0;d1||p<-1){s=s+p,i.scrollTop=s/this.scaleY,o=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let l of this.state.facet(Ra))l(e)}get themeClasses(){return Ga+" "+(this.state.facet(ja)?Sd:vd)+" "+this.state.facet($r)}updateAttrs(){let t=Nu(this,od,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",translate:"no",contenteditable:this.state.facet(ao)?"true":"false",class:"cm-content",style:`${E.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),Nu(this,th,e);let i=this.observer.ignore(()=>{let s=Oa(this.contentDOM,this.contentAttrs,e),r=Oa(this.dom,this.editorAttrs,t);return s||r});return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let s of i.effects)if(s.is(n.announce)){e&&(this.announceDOM.textContent=""),e=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=s.value}}mountStyles(){this.styleModules=this.state.facet(fn);let t=this.state.facet(n.cspNonce);ee.mount(this.root,this.styleModules.concat(r0).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn\'t allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),t){if(this.measureRequests.indexOf(t)>-1)return;if(t.key!=null){for(let e=0;ei.spec==t)||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return wa(this,t,yu(this,t,e,i))}moveByGroup(t,e){return wa(this,t,yu(this,t,e,i=>Im(this,t.head,i)))}visualLineSide(t,e){let i=this.bidiSpans(t),s=this.textDirectionAt(t.from),r=i[e?i.length-1:0];return _.cursor(r.side(e,s)+t.from,r.forward(!e,s)?1:-1)}moveToLineBoundary(t,e,i=!0){return Nm(this,t,e,i)}moveVertically(t,e,i){return wa(this,t,Lm(this,t,e,i))}domAtPos(t){return this.docView.domAtPos(t)}posAtDOM(t,e=0){return this.docView.posFromDOM(t,e)}posAtCoords(t,e=!0){return this.readMeasured(),dd(this,t,e)}coordsAtPos(t,e=1){this.readMeasured();let i=this.docView.coordsAt(t,e);if(!i||i.left==i.right)return i;let s=this.state.doc.lineAt(t),r=this.bidiSpans(s),o=r[Te.find(r,t-s.from,-1,e)];return Xa(i,o.dir==bt.LTR==e>0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(rd)||tthis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>d0)return Ju(t.length);let e=this.textDirectionAt(t.from),i;for(let r of this.bidiCache)if(r.from==t.from&&r.dir==e&&(r.fresh||Xu(r.isolates,i=du(this,t))))return r.order;i||(i=du(this,t));let s=mm(t.text,e,i);return this.bidiCache.push(new oo(t.from,t.to,e,i,!0,s)),s}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||E.safari&&((t=this.inputState)===null||t===void 0?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{_u(this.contentDOM),this.docView.updateSelection()})}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((t.nodeType==9?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return zr.of(new gn(typeof t=="number"?_.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return zr.of(new gn(_.cursor(i.from),"start","start",i.top-t,e,!0))}static domEventHandlers(t){return ms.define(()=>({}),{eventHandlers:t})}static domEventObservers(t){return ms.define(()=>({}),{eventObservers:t})}static theme(t,e){let i=ee.newName(),s=[$r.of(i),fn.of($a(`.${i}`,t))];return e&&e.dark&&s.push(ja.of(!0)),s}static baseTheme(t){return da.lowest(fn.of($a("."+Ga,t,Cd)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),s=i&&et.get(i)||et.get(t);return((e=s==null?void 0:s.rootView)===null||e===void 0?void 0:e.view)||null}};X.styleModule=fn;X.inputHandler=sd;X.focusChangeEffect=nd;X.perLineTextDirection=rd;X.exceptionSink=id;X.updateListener=Ra;X.editable=ao;X.mouseSelectionStyle=ed;X.dragMovesSelection=td;X.clickAddsSelectionRange=Zu;X.decorations=Sn;X.outerDecorations=ld;X.atomicRanges=eh;X.bidiIsolatedRanges=ad;X.scrollMargins=hd;X.darkTheme=ja;X.cspNonce=V.define({combine:n=>n.length?n[0]:""});X.contentAttributes=th;X.editorAttributes=od;X.lineWrapping=X.contentAttributes.of({class:"cm-lineWrapping"});X.announce=ft.define();var d0=4096,Bu={},oo=class n{constructor(t,e,i,s,r,o){this.from=t,this.to=e,this.dir=i,this.isolates=s,this.fresh=r,this.order=o}static update(t,e){if(e.empty&&!t.some(r=>r.fresh))return t;let i=[],s=t.length?t[t.length-1].dir:bt.LTR;for(let r=Math.max(0,t.length-10);r=0;s--){let r=i[s],o=typeof r=="function"?r(n):r;o&&Ma(o,e)}return e}var ew=E.mac?"mac":E.windows?"win":E.linux?"linux":"key";var p0=!E.ios;var Iu={".cm-line":{"& ::selection":{backgroundColor:"transparent !important"},"&::selection":{backgroundColor:"transparent !important"}}};p0&&(Iu[".cm-line"].caretColor="transparent !important",Iu[".cm-content"]={caretColor:"transparent !important"});var iw=/x/.unicode!=null?"gu":"g";var sw=X.baseTheme({".cm-tooltip":{zIndex:100,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:`${7*2}px`,position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"\'\'",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}});var Ye=class extends Ge{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}};Ye.prototype.elementClass="";Ye.prototype.toDOM=void 0;Ye.prototype.mapMode=It.TrackBefore;Ye.prototype.startSide=Ye.prototype.endSide=-1;Ye.prototype.point=!0;var g0=0,Be=class n{constructor(t,e,i){this.set=t,this.base=e,this.modified=i,this.id=g0++}static define(t){if(t!=null&&t.base)throw new Error("Can not derive from a modified tag");let e=new n([],null,[]);if(e.set.push(e),t)for(let i of t.set)e.set.push(i);return e}static defineModifier(){let t=new uo;return e=>e.modified.indexOf(t)>-1?e:uo.get(e.base||e,e.modified.concat(t).sort((i,s)=>i.id-s.id))}},m0=0,uo=class n{constructor(){this.instances=[],this.id=m0++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find(l=>l.base==t&&b0(e,l.modified));if(i)return i;let s=[],r=new Be(s,t,e);for(let l of e)l.instances.push(r);let o=y0(e);for(let l of t.set)if(!l.modified.length)for(let a of o)s.push(n.get(l,a));return r}};function b0(n,t){return n.length==t.length&&n.every((e,i)=>e==t[i])}function y0(n){let t=[[]];for(let e=0;ei.length-e.length)}function Td(n){let t=Object.create(null);for(let e in n){let i=n[e];Array.isArray(i)||(i=[i]);for(let s of e.split(" "))if(s){let r=[],o=2,l=s;for(let c=0;;){if(l=="..."&&c>0&&c+3==s.length){o=1;break}let u=/^"(?:[^"\\\\]|\\\\.)*?"|[^\\/!]+/.exec(l);if(!u)throw new RangeError("Invalid path: "+s);if(r.push(u[0]=="*"?"":u[0][0]==\'"\'?JSON.parse(u[0]):u[0]),c+=u[0].length,c==s.length)break;let d=s[c++];if(c==s.length&&d=="!"){o=0;break}if(d!="/")throw new RangeError("Invalid path: "+s);l=s.slice(c)}let a=r.length-1,h=r[a];if(!h)throw new RangeError("Invalid path: "+s);let f=new An(i,o,a>0?r.slice(0,a):null);t[h]=f.sort(t[h])}}return w0.add(t)}var w0=new W,An=class{constructor(t,e,i,s){this.tags=t,this.mode=e,this.context=i,this.next=s}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(t){return!t||t.depth{let o=s;for(let l of r)for(let a of l.set){let h=e[a.id];if(h){o=o?o+" "+h:h;break}}return o},scope:i}}var M=Be.define,ho=M(),ui=M(),Md=M(ui),Od=M(ui),di=M(),fo=M(di),ih=M(di),Re=M(),_i=M(Re),Pe=M(),Ee=M(),sh=M(),Cn=M(sh),co=M(),T={comment:ho,lineComment:M(ho),blockComment:M(ho),docComment:M(ho),name:ui,variableName:M(ui),typeName:Md,tagName:M(Md),propertyName:Od,attributeName:M(Od),className:M(ui),labelName:M(ui),namespace:M(ui),macroName:M(ui),literal:di,string:fo,docString:M(fo),character:M(fo),attributeValue:M(fo),number:ih,integer:M(ih),float:M(ih),bool:M(di),regexp:M(di),escape:M(di),color:M(di),url:M(di),keyword:Pe,self:M(Pe),null:M(Pe),atom:M(Pe),unit:M(Pe),modifier:M(Pe),operatorKeyword:M(Pe),controlKeyword:M(Pe),definitionKeyword:M(Pe),moduleKeyword:M(Pe),operator:Ee,derefOperator:M(Ee),arithmeticOperator:M(Ee),logicOperator:M(Ee),bitwiseOperator:M(Ee),compareOperator:M(Ee),updateOperator:M(Ee),definitionOperator:M(Ee),typeOperator:M(Ee),controlOperator:M(Ee),punctuation:sh,separator:M(sh),bracket:Cn,angleBracket:M(Cn),squareBracket:M(Cn),paren:M(Cn),brace:M(Cn),content:Re,heading:_i,heading1:M(_i),heading2:M(_i),heading3:M(_i),heading4:M(_i),heading5:M(_i),heading6:M(_i),contentSeparator:M(Re),list:M(Re),quote:M(Re),emphasis:M(Re),strong:M(Re),link:M(Re),monospace:M(Re),strikethrough:M(Re),inserted:M(),deleted:M(),changed:M(),invalid:M(),meta:co,documentMeta:M(co),annotation:M(co),processingInstruction:M(co),definition:Be.defineModifier(),constant:Be.defineModifier(),function:Be.defineModifier(),standard:Be.defineModifier(),local:Be.defineModifier(),special:Be.defineModifier()},ow=nh([{tag:T.link,class:"tok-link"},{tag:T.heading,class:"tok-heading"},{tag:T.emphasis,class:"tok-emphasis"},{tag:T.strong,class:"tok-strong"},{tag:T.keyword,class:"tok-keyword"},{tag:T.atom,class:"tok-atom"},{tag:T.bool,class:"tok-bool"},{tag:T.url,class:"tok-url"},{tag:T.labelName,class:"tok-labelName"},{tag:T.inserted,class:"tok-inserted"},{tag:T.deleted,class:"tok-deleted"},{tag:T.literal,class:"tok-literal"},{tag:T.string,class:"tok-string"},{tag:T.number,class:"tok-number"},{tag:[T.regexp,T.escape,T.special(T.string)],class:"tok-string2"},{tag:T.variableName,class:"tok-variableName"},{tag:T.local(T.variableName),class:"tok-variableName tok-local"},{tag:T.definition(T.variableName),class:"tok-variableName tok-definition"},{tag:T.special(T.variableName),class:"tok-variableName2"},{tag:T.definition(T.propertyName),class:"tok-propertyName tok-definition"},{tag:T.typeName,class:"tok-typeName"},{tag:T.namespace,class:"tok-namespace"},{tag:T.className,class:"tok-className"},{tag:T.macroName,class:"tok-macroName"},{tag:T.propertyName,class:"tok-propertyName"},{tag:T.operator,class:"tok-operator"},{tag:T.comment,class:"tok-comment"},{tag:T.meta,class:"tok-meta"},{tag:T.invalid,class:"tok-invalid"},{tag:T.punctuation,class:"tok-punctuation"}]);var rh,bs=new W;function x0(n){return V.define({combine:n?t=>t.concat(n):void 0})}var k0=new W,Gt=class{constructor(t,e,i=[],s=""){this.data=t,this.name=s,ot.prototype.hasOwnProperty("tree")||Object.defineProperty(ot.prototype,"tree",{get(){return ah(this)}}),this.parser=e,this.extension=[ys.of(this),ot.languageData.of((r,o,l)=>{let a=Dd(r,o,l),h=a.type.prop(bs);if(!h)return[];let f=r.facet(h),c=a.type.prop(k0);if(c){let u=a.resolve(o-a.from,l);for(let d of c)if(d.test(u,r)){let p=r.facet(d.facet);return d.type=="replace"?p:p.concat(f)}}return f})].concat(i)}isActiveAt(t,e,i=-1){return Dd(t,e,i).type.prop(bs)==this.data}findRegions(t){let e=t.facet(ys);if((e==null?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],s=(r,o)=>{if(r.prop(bs)==this.data){i.push({from:o,to:o+r.length});return}let l=r.prop(W.mounted);if(l){if(l.tree.prop(bs)==this.data){if(l.overlay)for(let a of l.overlay)i.push({from:a.from+o,to:a.to+o});else i.push({from:o,to:o+r.length});return}else if(l.overlay){let a=i.length;if(s(l.tree,l.overlay[0].from+o),i.length>a)return}}for(let a=0;ai.isTop?e:void 0)]}),t.name)}configure(t,e){return new n(this.data,this.parser.configure(t),e||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function ah(n){let t=n.field(Gt.state,!1);return t?t.tree:rt.empty}var hh=class{constructor(t){this.doc=t,this.cursorPos=0,this.string="",this.cursor=t.iter()}get length(){return this.doc.length}syncTo(t){return this.string=this.cursor.next(t-this.cursorPos).value,this.cursorPos=t+this.string.length,this.cursorPos-this.string.length}chunk(t){return this.syncTo(t),this.string}get lineChunks(){return!0}read(t,e){let i=this.cursorPos-this.string.length;return t=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}},Mn=null,fh=class n{constructor(t,e,i=[],s,r,o,l,a){this.parser=t,this.state=e,this.fragments=i,this.tree=s,this.treeLen=r,this.viewport=o,this.skipped=l,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new n(t,e,[],rt.empty,0,i,[],null)}startParse(){return this.parser.startParse(new hh(this.state.doc),this.fragments)}work(t,e){return e!=null&&e>=this.state.doc.length&&(e=void 0),this.tree!=rt.empty&&this.isDone(e!=null?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof t=="number"){let s=Date.now()+t;t=()=>Date.now()>s}for(this.parse||(this.parse=this.startParse()),e!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&e=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext(()=>{for(;!(e=this.parse.advance()););}),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(Ti.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=Mn;Mn=this;try{return t()}finally{Mn=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=Pd(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:s,treeLen:r,viewport:o,skipped:l}=this;if(this.takeTree(),!t.empty){let a=[];if(t.iterChangedRanges((h,f,c,u)=>a.push({fromA:h,toA:f,fromB:c,toB:u})),i=Ti.applyChanges(i,a),s=rt.empty,r=0,o={from:t.mapPos(o.from,-1),to:t.mapPos(o.to,1)},this.skipped.length){l=[];for(let h of this.skipped){let f=t.mapPos(h.from,1),c=t.mapPos(h.to,-1);ft.from&&(this.fragments=Pd(this.fragments,s,r),this.skipped.splice(i--,1))}return this.skipped.length>=e?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends ss{createParse(e,i,s){let r=s[0].from,o=s[s.length-1].to;return{parsedPos:r,advance(){let a=Mn;if(a){for(let h of s)a.tempSkipped.push(h);t&&(a.scheduleOn=a.scheduleOn?Promise.all([a.scheduleOn,t]):t)}return this.parsedPos=o,new rt(Ct.none,[],[],o-r)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&e[0].from==0&&e[0].to>=t}static get(){return Mn}};function Pd(n,t,e){return Ti.applyChanges(n,[{fromA:t,toA:e,fromB:t,toB:e}])}var On=class n{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new n(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=fh.create(t.facet(ys).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new n(i)}};Gt.state=qe.define({create:On.init,update(n,t){for(let e of t.effects)if(e.is(Gt.setState))return e.value;return t.startState.facet(ys)!=t.state.facet(ys)?On.init(t.state):n.apply(t)}});var Nd=n=>{let t=setTimeout(()=>n(),500);return()=>clearTimeout(t)};typeof requestIdleCallback!="undefined"&&(Nd=n=>{let t=-1,e=setTimeout(()=>{t=requestIdleCallback(n,{timeout:400})},100);return()=>t<0?clearTimeout(e):cancelIdleCallback(t)});var oh=typeof navigator!="undefined"&&(!((rh=navigator.scheduling)===null||rh===void 0)&&rh.isInputPending)?()=>navigator.scheduling.isInputPending():null,v0=ms.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(Gt.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(Gt.state);(e.tree!=e.context.tree||!e.context.isDone(t.doc.length))&&(this.working=Nd(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEnds+1e3,a=r.context.work(()=>oh&&oh()||Date.now()>o,s+(l?0:1e5));this.chunkBudget-=Date.now()-e,(a||this.chunkBudget<=0)&&(r.context.takeTree(),this.view.dispatch({effects:Gt.setState.of(new On(r.context))})),this.chunkBudget>0&&!(a&&!l)&&this.scheduleWork(),this.checkAsyncSchedule(r.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then(()=>this.scheduleWork()).catch(e=>Ue(this.view.state,e)).then(()=>this.workScheduled--),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),ys=V.define({combine(n){return n.length?n[0]:null},enables:n=>[Gt.state,v0,X.contentAttributes.compute([n],t=>{let e=t.facet(n);return e&&e.name?{"data-language":e.name}:{}})]});var ch=class n{constructor(t,e){this.specs=t;let i;function s(l){let a=ee.newName();return(i||(i=Object.create(null)))["."+a]=l,a}let r=typeof e.all=="string"?e.all:e.all?s(e.all):void 0,o=e.scope;this.scope=o instanceof Gt?l=>l.prop(bs)==o.data:o?l=>l==o:void 0,this.style=nh(t.map(l=>({tag:l.tag,class:l.class||s(Object.assign({},l,{tag:null}))})),{all:r}).style,this.module=i?new ee(i):null,this.themeType=e.themeType}static define(t,e){return new n(t,e||{})}};var mw=ch.define([{tag:T.meta,color:"#404740"},{tag:T.link,textDecoration:"underline"},{tag:T.heading,textDecoration:"underline",fontWeight:"bold"},{tag:T.emphasis,fontStyle:"italic"},{tag:T.strong,fontWeight:"bold"},{tag:T.strikethrough,textDecoration:"line-through"},{tag:T.keyword,color:"#708"},{tag:[T.atom,T.bool,T.url,T.contentSeparator,T.labelName],color:"#219"},{tag:[T.literal,T.inserted],color:"#164"},{tag:[T.string,T.deleted],color:"#a11"},{tag:[T.regexp,T.escape,T.special(T.string)],color:"#e40"},{tag:T.definition(T.variableName),color:"#00f"},{tag:T.local(T.variableName),color:"#30a"},{tag:[T.typeName,T.namespace],color:"#085"},{tag:T.className,color:"#167"},{tag:[T.special(T.variableName),T.macroName],color:"#256"},{tag:T.definition(T.propertyName),color:"#00c"},{tag:T.comment,color:"#940"},{tag:T.invalid,color:"#f00"}]);var S0=Object.create(null),Ed=[Ct.none];var Rd=[],Bd=Object.create(null),C0=Object.create(null);for(let[n,t]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])C0[n]=A0(S0,t);function lh(n,t){Rd.indexOf(n)>-1||(Rd.push(n),console.warn(t))}function A0(n,t){let e=[];for(let l of t.split(" ")){let a=[];for(let h of l.split(".")){let f=n[h]||T[h];f?typeof f=="function"?a.length?a=a.map(f):lh(h,`Modifier ${h} used at start of tag`):a.length?lh(h,`Tag ${h} used as modifier`):a=Array.isArray(f)?f:[f]:lh(h,`Unknown highlighting tag ${h}`)}for(let h of a)e.push(h)}if(!e.length)return 0;let i=t.replace(/ /g,"_"),s=i+" "+e.map(l=>l.id),r=Bd[s];if(r)return r.id;let o=Bd[s]=Ct.define({id:Ed.length,name:i,props:[Td({[i]:e})]});return Ed.push(o),o.id}var bw={rtl:Mt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:bt.RTL}),ltr:Mt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:bt.LTR}),auto:Mt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var dh=class n{constructor(t,e,i,s,r,o,l,a,h,f=0,c){this.p=t,this.stack=e,this.state=i,this.reducePos=s,this.pos=r,this.score=o,this.buffer=l,this.bufferBase=a,this.curContext=h,this.lookAhead=f,this.parent=c}toString(){return`[${this.stack.filter((t,e)=>e%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(t,e,i=0){let s=t.parser.context;return new n(t,[],e,i,i,0,[],0,s?new go(s,s.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(t,e){this.stack.push(this.state,e,this.bufferBase+this.buffer.length),this.state=t}reduce(t){var e;let i=t>>19,s=t&65535,{parser:r}=this.p,o=r.dynamicPrecedence(s);if(o&&(this.score+=o),i==0){this.pushState(r.getGoto(this.state,s,!0),this.reducePos),s=2e3&&!(!((e=this.p.parser.nodeSet.types[s])===null||e===void 0)&&e.isAnonymous)&&(a==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=h):this.p.lastBigReductionSizel;)this.stack.pop();this.reduceContext(s,a)}storeNode(t,e,i,s=4,r=!1){if(t==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&o.buffer[l-4]==0&&o.buffer[l-1]>-1){if(e==i)return;if(o.buffer[l-2]>=e){o.buffer[l-2]=i;return}}}if(!r||this.pos==i)this.buffer.push(t,e,i,s);else{let o=this.buffer.length;if(o>0&&this.buffer[o-4]!=0)for(;o>0&&this.buffer[o-2]>i;)this.buffer[o]=this.buffer[o-4],this.buffer[o+1]=this.buffer[o-3],this.buffer[o+2]=this.buffer[o-2],this.buffer[o+3]=this.buffer[o-1],o-=4,s>4&&(s-=4);this.buffer[o]=t,this.buffer[o+1]=e,this.buffer[o+2]=i,this.buffer[o+3]=s}}shift(t,e,i,s){if(t&131072)this.pushState(t&65535,this.pos);else if((t&262144)==0){let r=t,{parser:o}=this.p;(s>this.pos||e<=o.maxNode)&&(this.pos=s,o.stateFlag(r,1)||(this.reducePos=s)),this.pushState(r,i),this.shiftContext(e,i),e<=o.maxNode&&this.buffer.push(e,i,s,4)}else this.pos=s,this.shiftContext(e,i),e<=this.p.parser.maxNode&&this.buffer.push(e,i,s,4)}apply(t,e,i,s){t&65536?this.reduce(t):this.shift(t,e,i,s)}useNode(t,e){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=t)&&(this.p.reused.push(t),i++);let s=this.pos;this.reducePos=this.pos=s+t.length,this.pushState(e,s),this.buffer.push(i,s,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,t,this,this.p.stream.reset(this.pos-t.length)))}split(){let t=this,e=t.buffer.length;for(;e>0&&t.buffer[e-2]>t.reducePos;)e-=4;let i=t.buffer.slice(e),s=t.bufferBase+e;for(;t&&s==t.bufferBase;)t=t.parent;return new n(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,s,this.curContext,this.lookAhead,t)}recoverByDelete(t,e){let i=t<=this.p.parser.maxNode;i&&this.storeNode(t,this.pos,e,4),this.storeNode(0,this.pos,e,i?8:4),this.pos=this.reducePos=e,this.score-=190}canShift(t){for(let e=new ph(this);;){let i=this.p.parser.stateSlot(e.state,4)||this.p.parser.hasAction(e.state,t);if(i==0)return!1;if((i&65536)==0)return!0;e.reduce(i)}}recoverByInsert(t){if(this.stack.length>=300)return[];let e=this.p.parser.nextStates(this.state);if(e.length>8||this.stack.length>=120){let s=[];for(let r=0,o;ra&1&&l==o)||s.push(e[r],o)}e=s}let i=[];for(let s=0;s>19,s=e&65535,r=this.stack.length-i*3;if(r<0||t.getGoto(this.stack[r],s,!1)<0){let o=this.findForcedReduction();if(o==null)return!1;e=o}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(e),!0}findForcedReduction(){let{parser:t}=this.p,e=[],i=(s,r)=>{if(!e.includes(s))return e.push(s),t.allActions(s,o=>{if(!(o&393216))if(o&65536){let l=(o>>19)-r;if(l>1){let a=o&65535,h=this.stack.length-l*3;if(h>=0&&t.getGoto(this.stack[h],a,!1)>=0)return l<<19|65536|a}}else{let l=i(o,r+1);if(l!=null)return l}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:t}=this.p;return t.data[t.stateSlot(this.state,1)]==65535&&!t.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(t){if(this.state!=t.state||this.stack.length!=t.stack.length)return!1;for(let e=0;ethis.lookAhead&&(this.emitLookAhead(),this.lookAhead=t)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}},go=class{constructor(t,e){this.tracker=t,this.context=e,this.hash=t.strict?t.hash(e):0}},ph=class{constructor(t){this.start=t,this.state=t.state,this.stack=t.stack,this.base=this.stack.length}reduce(t){let e=t&65535,i=t>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let s=this.start.p.parser.getGoto(this.stack[this.base-3],e,!0);this.state=s}},gh=class n{constructor(t,e,i){this.stack=t,this.pos=e,this.index=i,this.buffer=t.buffer,this.index==0&&this.maybeNext()}static create(t,e=t.bufferBase+t.buffer.length){return new n(t,e,e-t.bufferBase)}maybeNext(){let t=this.stack.parent;t!=null&&(this.index=this.stack.bufferBase-t.bufferBase,this.stack=t,this.buffer=t.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new n(this.stack,this.pos,this.index)}};function Tn(n,t=Uint16Array){if(typeof n!="string")return n;let e=null;for(let i=0,s=0;i=92&&o--,o>=34&&o--;let a=o-32;if(a>=46&&(a-=46,l=!0),r+=a,l)break;r*=46}e?e[s++]=r:e=new t(r)}return e}var ws=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},Id=new ws,mh=class{constructor(t,e){this.input=t,this.ranges=e,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Id,this.rangeIndex=0,this.pos=this.chunkPos=e[0].from,this.range=e[0],this.end=e[e.length-1].to,this.readNext()}resolveOffset(t,e){let i=this.range,s=this.rangeIndex,r=this.pos+t;for(;ri.to:r>=i.to;){if(s==this.ranges.length-1)return null;let o=this.ranges[++s];r+=o.from-i.to,i=o}return r}clipPos(t){if(t>=this.range.from&&tt)return Math.max(t,e.from);return this.end}peek(t){let e=this.chunkOff+t,i,s;if(e>=0&&e=this.chunk2Pos&&il.to&&(this.chunk2=this.chunk2.slice(0,l.to-i)),s=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),s}acceptToken(t,e=0){let i=e?this.resolveOffset(e,-1):this.pos;if(i==null||i=this.chunk2Pos&&this.posthis.range.to?t.slice(0,this.range.to-this.pos):t,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(t=1){for(this.chunkOff+=t;this.pos+t>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();t-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=t,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(t,e){if(e?(this.token=e,e.start=t,e.lookAhead=t+1,e.value=e.extended=-1):this.token=Id,this.pos!=t){if(this.pos=t,t==this.end)return this.setDone(),this;for(;t=this.range.to;)this.range=this.ranges[++this.rangeIndex];t>=this.chunkPos&&t=this.chunkPos&&e<=this.chunkPos+this.chunk.length)return this.chunk.slice(t-this.chunkPos,e-this.chunkPos);if(t>=this.chunk2Pos&&e<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(t-this.chunk2Pos,e-this.chunk2Pos);if(t>=this.range.from&&e<=this.range.to)return this.input.read(t,e);let i="";for(let s of this.ranges){if(s.from>=e)break;s.to>t&&(i+=this.input.read(Math.max(s.from,t),Math.min(s.to,e)))}return i}},pi=class{constructor(t,e){this.data=t,this.id=e}token(t,e){let{parser:i}=e.p;Vd(this.data,t,e,this.id,i.data,i.tokenPrecTable)}};pi.prototype.contextual=pi.prototype.fallback=pi.prototype.extend=!1;var Je=class{constructor(t,e,i){this.precTable=e,this.elseToken=i,this.data=typeof t=="string"?Tn(t):t}token(t,e){let i=t.pos,s=0;for(;;){let r=t.next<0,o=t.resolveOffset(1,1);if(Vd(this.data,t,e,0,this.data,this.precTable),t.token.value>-1)break;if(this.elseToken==null)return;if(r||s++,o==null)break;t.reset(o,t.token)}s&&(t.reset(i,t.token),t.acceptToken(this.elseToken,s))}};Je.prototype.contextual=pi.prototype.fallback=pi.prototype.extend=!1;function Vd(n,t,e,i,s,r){let o=0,l=1<0){let p=n[d];if(a.allows(p)&&(t.token.value==-1||t.token.value==p||O0(p,t.token.value,s,r))){t.acceptToken(p);break}}let f=t.next,c=0,u=n[o+2];if(t.next<0&&u>c&&n[h+u*3-3]==65535){o=n[h+u*3-1];continue t}for(;c>1,p=h+d+(d<<1),g=n[p],m=n[p+1]||65536;if(f=m)c=d+1;else{o=n[p+2],t.advance();continue t}}break}}function Ld(n,t,e){for(let i=t,s;(s=n[i])!=65535;i++)if(s==e)return i-t;return-1}function O0(n,t,e,i){let s=Ld(e,i,t);return s<0||Ld(e,i,n)t)&&!i.type.isError)return e<0?Math.max(0,Math.min(i.to-1,t-25)):Math.min(n.length,Math.max(i.from+1,t+25));if(e<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return e<0?0:n.length}}var bh=class{constructor(t,e){this.fragments=t,this.nodeSet=e,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let t=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(t){for(this.safeFrom=t.openStart?_d(t.tree,t.from+t.offset,1)-t.offset:t.from,this.safeTo=t.openEnd?_d(t.tree,t.to+t.offset,-1)-t.offset:t.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(t.tree),this.start.push(-t.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(t){if(tt)return this.nextStart=o,null;if(r instanceof rt){if(o==t){if(o=Math.max(this.safeFrom,t)&&(this.trees.push(r),this.start.push(o),this.index.push(0))}else this.index[e]++,this.nextStart=o+r.length}}},yh=class{constructor(t,e){this.stream=e,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=t.tokenizers.map(i=>new ws)}getActions(t){let e=0,i=null,{parser:s}=t.p,{tokenizers:r}=s,o=s.stateSlot(t.state,3),l=t.curContext?t.curContext.hash:0,a=0;for(let h=0;hc.end+25&&(a=Math.max(c.lookAhead,a)),c.value!=0)){let u=e;if(c.extended>-1&&(e=this.addActions(t,c.extended,c.end,e)),e=this.addActions(t,c.value,c.end,e),!f.extend&&(i=c,e>u))break}}for(;this.actions.length>e;)this.actions.pop();return a&&t.setLookAhead(a),!i&&t.pos==this.stream.end&&(i=new ws,i.value=t.p.parser.eofTerm,i.start=i.end=t.pos,e=this.addActions(t,i.value,i.end,e)),this.mainToken=i,this.actions}getMainToken(t){if(this.mainToken)return this.mainToken;let e=new ws,{pos:i,p:s}=t;return e.start=i,e.end=Math.min(i+1,s.stream.end),e.value=i==s.stream.end?s.parser.eofTerm:0,e}updateCachedToken(t,e,i){let s=this.stream.clipPos(i.pos);if(e.token(this.stream.reset(s,t),i),t.value>-1){let{parser:r}=i.p;for(let o=0;o=0&&i.p.parser.dialect.allows(l>>1)){(l&1)==0?t.value=l>>1:t.extended=l>>1;break}}}else t.value=0,t.end=this.stream.clipPos(s+1)}putAction(t,e,i,s){for(let r=0;rt.bufferLength*4?new bh(i,t.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let t=this.stacks,e=this.minStackPos,i=this.stacks=[],s,r;if(this.bigReductionCount>300&&t.length==1){let[o]=t;for(;o.forceReduce()&&o.stack.length&&o.stack[o.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let o=0;oe)i.push(l);else{if(this.advanceStack(l,i,t))continue;{s||(s=[],r=[]),s.push(l);let a=this.tokens.getMainToken(l);r.push(a.value,a.end)}}break}}if(!i.length){let o=s&&T0(s);if(o)return $t&&console.log("Finish with "+this.stackID(o)),this.stackToTree(o);if(this.parser.strict)throw $t&&s&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+e);this.recovering||(this.recovering=5)}if(this.recovering&&s){let o=this.stoppedAt!=null&&s[0].pos>this.stoppedAt?s[0]:this.runRecovery(s,r,i);if(o)return $t&&console.log("Force-finish "+this.stackID(o)),this.stackToTree(o.forceAll())}if(this.recovering){let o=this.recovering==1?1:this.recovering*3;if(i.length>o)for(i.sort((l,a)=>a.score-l.score);i.length>o;)i.pop();i.some(l=>l.reducePos>e)&&this.recovering--}else if(i.length>1){t:for(let o=0;o500&&h.buffer.length>500)if((l.score-h.score||l.buffer.length-h.buffer.length)>0)i.splice(a--,1);else{i.splice(o--,1);continue t}}}i.length>12&&i.splice(12,i.length-12)}this.minStackPos=i[0].pos;for(let o=1;o ":"";if(this.stoppedAt!=null&&s>this.stoppedAt)return t.forceReduce()?t:null;if(this.fragments){let h=t.curContext&&t.curContext.tracker.strict,f=h?t.curContext.hash:0;for(let c=this.fragments.nodeAt(s);c;){let u=this.parser.nodeSet.types[c.type.id]==c.type?r.getGoto(t.state,c.type.id):-1;if(u>-1&&c.length&&(!h||(c.prop(W.contextHash)||0)==f))return t.useNode(c,u),$t&&console.log(o+this.stackID(t)+` (via reuse of ${r.getName(c.type.id)})`),!0;if(!(c instanceof rt)||c.children.length==0||c.positions[0]>0)break;let d=c.children[0];if(d instanceof rt&&c.positions[0]==0)c=d;else break}}let l=r.stateSlot(t.state,4);if(l>0)return t.reduce(l),$t&&console.log(o+this.stackID(t)+` (via always-reduce ${r.getName(l&65535)})`),!0;if(t.stack.length>=8400)for(;t.stack.length>6e3&&t.forceReduce(););let a=this.tokens.getActions(t);for(let h=0;hs?e.push(p):i.push(p)}return!1}advanceFully(t,e){let i=t.pos;for(;;){if(!this.advanceStack(t,null,null))return!1;if(t.pos>i)return Hd(t,e),!0}}runRecovery(t,e,i){let s=null,r=!1;for(let o=0;o ":"";if(l.deadEnd&&(r||(r=!0,l.restart(),$t&&console.log(f+this.stackID(l)+" (restarted)"),this.advanceFully(l,i))))continue;let c=l.split(),u=f;for(let d=0;c.forceReduce()&&d<10&&($t&&console.log(u+this.stackID(c)+" (via force-reduce)"),!this.advanceFully(c,i));d++)$t&&(u=this.stackID(c)+" -> ");for(let d of l.recoverByInsert(a))$t&&console.log(f+this.stackID(d)+" (via recover-insert)"),this.advanceFully(d,i);this.stream.end>l.pos?(h==l.pos&&(h++,a=0),l.recoverByDelete(a,h),$t&&console.log(f+this.stackID(l)+` (via recover-delete ${this.parser.getName(a)})`),Hd(l,i)):(!s||s.scoret.topRules[l][1]),s=[];for(let l=0;l=0)r(f,a,l[h++]);else{let c=l[h+-f];for(let u=-f;u>0;u--)r(l[h++],a,c);h++}}}this.nodeSet=new Zs(e.map((l,a)=>Ct.define({name:a>=this.minRepeatTerm?void 0:l,id:a,props:s[a],top:i.indexOf(a)>-1,error:a==0,skipped:t.skippedNodes&&t.skippedNodes.indexOf(a)>-1}))),t.propSources&&(this.nodeSet=this.nodeSet.extend(...t.propSources)),this.strict=!1,this.bufferLength=1024;let o=Tn(t.tokenData);this.context=t.context,this.specializerSpecs=t.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let l=0;ltypeof l=="number"?new pi(o,l):l),this.topRules=t.topRules,this.dialects=t.dialects||{},this.dynamicPrecedences=t.dynamicPrecedences||null,this.tokenPrecTable=t.tokenPrec,this.termNames=t.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(t,e,i){let s=new wh(this,t,e,i);for(let r of this.wrappers)s=r(s,t,e,i);return s}getGoto(t,e,i=!1){let s=this.goto;if(e>=s[0])return-1;for(let r=s[e+1];;){let o=s[r++],l=o&1,a=s[r++];if(l&&i)return a;for(let h=r+(o>>1);r0}validAction(t,e){return!!this.allActions(t,i=>i==e?!0:null)}allActions(t,e){let i=this.stateSlot(t,4),s=i?e(i):void 0;for(let r=this.stateSlot(t,1);s==null;r+=3){if(this.data[r]==65535)if(this.data[r+1]==1)r=Xe(this.data,r+2);else break;s=e(Xe(this.data,r+1))}return s}nextStates(t){let e=[];for(let i=this.stateSlot(t,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=Xe(this.data,i+2);else break;if((this.data[i+2]&1)==0){let s=this.data[i+1];e.some((r,o)=>o&1&&r==s)||e.push(this.data[i],s)}}return e}configure(t){let e=Object.assign(Object.create(n.prototype),this);if(t.props&&(e.nodeSet=this.nodeSet.extend(...t.props)),t.top){let i=this.topRules[t.top];if(!i)throw new RangeError(`Invalid top rule name ${t.top}`);e.top=i}return t.tokenizers&&(e.tokenizers=this.tokenizers.map(i=>{let s=t.tokenizers.find(r=>r.from==i);return s?s.to:i})),t.specializers&&(e.specializers=this.specializers.slice(),e.specializerSpecs=this.specializerSpecs.map((i,s)=>{let r=t.specializers.find(l=>l.from==i.external);if(!r)return i;let o=Object.assign(Object.assign({},i),{external:r.to});return e.specializers[s]=Fd(o),o})),t.contextTracker&&(e.context=t.contextTracker),t.dialect&&(e.dialect=this.parseDialect(t.dialect)),t.strict!=null&&(e.strict=t.strict),t.wrap&&(e.wrappers=e.wrappers.concat(t.wrap)),t.bufferLength!=null&&(e.bufferLength=t.bufferLength),e}hasWrappers(){return this.wrappers.length>0}getName(t){return this.termNames?this.termNames[t]:String(t<=this.maxNode&&this.nodeSet.types[t].name||t)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(t){let e=this.dynamicPrecedences;return e==null?0:e[t]||0}parseDialect(t){let e=Object.keys(this.dialects),i=e.map(()=>!1);if(t)for(let r of t.split(" ")){let o=e.indexOf(r);o>=0&&(i[o]=!0)}let s=null;for(let r=0;ri)&&e.p.parser.stateFlag(e.state,2)&&(!t||t.scoren.external(e,i)<<1|t}return n.get}var D0=mo.deserialize({version:14,states:")`QQOPOOOfOQO\'#C^OqOSO\'#C`O|OWO\'#CbO!XO`O\'#CeO!dOpO\'#CgOOOO\'#Ck\'#CkOOOO\'#Ci\'#CiQQOPOOOOOO,58x,58xO!oOQO,58xO!wOQO,58xOOOO,58z,58zO#POSO,58zO#XOSO,58zO#aOWO,58|O#iOWO,58|O#qOWO,58|OOOO,59P,59PO#yO`O,59PO$RO`O,59POOOO,59R,59RO$ZOpO,59RO$cOpO,59ROOOO-E6g-E6gOOOO1G.d1G.dO$kOQO1G.dO$nOQO1G.dOOOO1G.f1G.fO$sOSO1G.fO$vOSO1G.fOOOO1G.h1G.hO${OWO1G.hO%QOWO1G.hO%YOWO1G.hO%bOWO1G.hOOOO1G.k1G.kO%gO`O1G.kO%jO`O1G.kOOOO1G.m1G.mO%oOpO1G.mO%rOpO1G.mOOOO7+$O7+$OO%wOQO7+$OOOOO7+$Q7+$QO%|OSO7+$QOOOO7+$S7+$SO&ROWO7+$SO&WOWO7+$SO&`OWO7+$SOOOO7+$V7+$VO&eO`O7+$VOOOO7+$X7+$XO&jOpO7+$XOOOO<p.is(Dc)))return this.create(t.state);if(!t.docChanged)return n.inserted_ranges=[],n.deleted_ranges=[],n;let e=[];t.changes.iterChangedRanges((p,g,m,b)=>e.push({fromA:p,toA:g,fromB:m,toB:b}));let i=oe.applyChanges(n.fragments,e),s=t.state.doc.toString(),r=bo.parser.parse(new Xs(t.state.doc),i);i=oe.addTree(r,i);let o=new Map,l=[],a=new Map,h=new Set;for(let p of e){n.ranges.tree.search([p.fromA,p.toA],(g,m)=>{n.ranges.tree.remove(m,g),h.add(g);for(let b of g.base_range.thread)a.set(b.from,b);return!0});for(let g of kh(r,s,p.fromB,p.toB))o.set(g.from,g);l.push([p.toA,p.toB-p.fromB-(p.toA-p.fromA)])}for(let p of h)p.type==="comment"&&a.delete(p.from);let f=0,c=n.ranges.tree.nil_node;function u(p){if(p!=null&&p!=c){for(u(p.left);l.length&&p.item.key.low>=l[0][0];)f+=l.shift()[1];p.item.value.apply_offset(f),p.item.key.low=p.item.value.from,p.item.key.high=p.item.value.to,u(p.right),p.left!=c&&(p.max.low=p.left.max.low),p.right!=c&&(p.max.high=p.right.max.high)}}u(n.ranges.tree.root);let d=Array.from(o.values());for(let p of d)n.ranges.tree.insert([p.from,p.to],p);for(let p of d)p.type==="comment"&&a.set(p.from,p);if(a.size){let p=[],g,m=[];for(let b of Array.from(a.values()).sort((y,w)=>y.from-w.from))b.clear_references(),b.replies.length=0,!g||g!=null&&g.right_adjacent(b)?m.push(b):(p.push(m),m=[b]),g=b;p.push(m);for(let b of p){let y=b[0],w=n.ranges.tree.search([y.from,y.from])[0];w.replies.length=0;for(let x of b.slice(w===y?1:0))x.add_reply(w)}}return n.ranges.ranges=n.ranges.tree.values,{tree:r,ranges:n.ranges,fragments:i,inserted_ranges:d,deleted_ranges:[...h]}}});function P0(n,t){var s,r;let e=Oi.PLUGIN_SETTINGS.enable_metadata&&((s=n.firstChild)!=null&&s.type.name.startsWith("MDSep"))?n.firstChild.from:void 0,i;if(n.type.name==="Substitution"){let o=e?(r=n.firstChild)==null?void 0:r.nextSibling:n.firstChild;if(!o||o.type.name!=="MSub")return;i=o.from}return E0(n.from,n.to,n.type.name,t.slice(n.from,n.to),i,e)}function kh(n,t,e=0,i=t.length){let s=[],r,o=n.cursor();if(o.childAfter(e-1),o.node.type.name==="CriticMarkup"||o.node.from>i)return s;if(o)do{let l=o.node;if(l.type.name==="\\u26A0")continue;let a=P0(l,t);a&&(a.type==="comment"&&r&&r.right_adjacent(a)&&a.add_reply(r),s.push(a),r=a)}while(o.nextSibling()&&o.node.from<=i);return s}function zd(n){let t=bo.parser.parse(n);return kh(t,n)}function E0(n,t,e,i,s,r){switch(e){case"Addition":return new gi(n,t,i,r);case"Deletion":return new Fi(n,t,i,r);case"Substitution":return new zi(n,s,t,i,r);case"Highlight":return new Vi(n,t,i,r);case"Comment":return new Hi(n,t,i,r);default:return new gi(n,t,i,r)}}var Hw={addition:gi,deletion:Fi,highlight:Vi,substitution:zi,comment:Hi};var f1={addition:"ignore_metadata",deletion:"ignore_metadata",substitution:"ignore_metadata",comment:"ignore_metadata",highlight:"ignore_metadata"},c1={addition:"stay_inside",deletion:"stay_inside",substitution:"stay_inside",comment:"stay_inside",highlight:"stay_inside"};async function Wd(n,t){return Oi.PLUGIN_SETTINGS=t,await Promise.all(n.map(async e=>zd(e)))}self.onmessage=async n=>{self.postMessage(await Wd(n.data.files,n.data.settings))};\n//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3Jhbmdlcy9kZWZpbml0aW9ucy50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL2Jhc2VfcmFuZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3Jhbmdlcy90eXBlcy9hZGRpdGlvbl9yYW5nZS50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL3R5cGVzL2NvbW1lbnRfcmFuZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3Jhbmdlcy90eXBlcy9kZWxldGlvbl9yYW5nZS50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL3R5cGVzL2hpZ2hsaWdodF9yYW5nZS50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcmFuZ2VzL3R5cGVzL3N1YnN0aXR1dGlvbl9yYW5nZS50cyIsICIuLi8uLi9AbWFyaWpuL2ZpbmQtY2x1c3Rlci1icmVhay9zcmMvaW5kZXguanMiLCAiLi4vLi4vQGNvZGVtaXJyb3Ivc3RhdGUvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9AZmxhdHRlbi1qcy9pbnRlcnZhbC10cmVlL2Rpc3QvbWFpbi5tanMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3Jhbmdlcy9ncm91cGVkX3JhbmdlLnRzIiwgIi4uLy4uL3N0eWxlLW1vZC9zcmMvc3R5bGUtbW9kLmpzIiwgIi4uLy4uL3czYy1rZXluYW1lL2luZGV4LmpzIiwgIi4uLy4uL0Bjb2RlbWlycm9yL3ZpZXcvZGlzdC9pbmRleC5qcyIsICIuLi8uLi9AbGV6ZXIvY29tbW9uL2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vQGxlemVyL2hpZ2hsaWdodC9kaXN0L2luZGV4LmpzIiwgIi4uLy4uL0Bjb2RlbWlycm9yL2xhbmd1YWdlL2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vLi4vc3JjL2dsb2JhbC50cyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL3NldHRpbmdzL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL0BsZXplci9jb21tb24vZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcGFyc2VyL25vZGVfbW9kdWxlcy9AY29kZW1pcnJvci9zdGF0ZS9kaXN0L2luZGV4LmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL3N0eWxlLW1vZC9zcmMvc3R5bGUtbW9kLmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL3czYy1rZXluYW1lL2luZGV4LmpzIiwgIi4uLy4uLy4uL3NyYy9lZGl0b3IvYmFzZS9wYXJzZXIvbm9kZV9tb2R1bGVzL0Bjb2RlbWlycm9yL3ZpZXcvZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcGFyc2VyL25vZGVfbW9kdWxlcy9AbGV6ZXIvaGlnaGxpZ2h0L2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL3BhcnNlci9ub2RlX21vZHVsZXMvQGNvZGVtaXJyb3IvbGFuZ3VhZ2UvZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcGFyc2VyL25vZGVfbW9kdWxlcy9AbGV6ZXIvbHIvZGlzdC9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvZWRpdG9yL2Jhc2UvcGFyc2VyL2Rpc3QvaW5kZXguanMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL2VkaXQtdXRpbC9yYW5nZS1wYXJzZXIudHMiLCAiLi4vLi4vLi4vc3JjL2VkaXRvci9iYXNlL2VkaXQtaGFuZGxlci9jdXJzb3IudHMiLCAiLi4vLi4vLi4vc3JjL2luZGV4LXdvcmtlci50cyIsICIuLi8uLi8uLi9zcmMvZGF0YWJhc2UvaW5kZXhlci53b3JrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbInR5cGUgRW51bURpY3Rpb25hcnk8VCBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCB8IG51bWJlciwgVT4gPSB7XG5cdFtLIGluIFRdOiBVO1xufTtcblxuZXhwb3J0IHR5cGUgU1RSSU5HX1NVR0dFU1RJT05fVFlQRSA9IFwiQWRkaXRpb25cIiB8IFwiRGVsZXRpb25cIiB8IFwiU3Vic3RpdHV0aW9uXCIgfCBcIkhpZ2hsaWdodFwiIHwgXCJDb21tZW50XCI7XG5cbmV4cG9ydCB0eXBlIE1FVEFEQVRBX1RZUEUgPSBcImF1dGhvclwiIHwgXCJkYXRlXCIgfCBcImNvbXBsZXRlZFwiIHwgXCJ1cmdlbmN5XCIgfCBcInN0eWxlXCI7XG5cbi8vIEZJWE1FOiBDaGFuZ2VkIHRvIHN0cmluZyB0eXBlcywgYnV0IGJleW9uZCBpZGVhbCAtLS0gZmFyIHRvbyBtdWNoIGJsb2F0XG5leHBvcnQgZW51bSBTdWdnZXN0aW9uVHlwZSB7XG5cdEFERElUSU9OID0gXCJhZGRpdGlvblwiLFxuXHRERUxFVElPTiA9IFwiZGVsZXRpb25cIixcblx0U1VCU1RJVFVUSU9OID0gXCJzdWJzdGl0dXRpb25cIixcblx0SElHSExJR0hUID0gXCJoaWdobGlnaHRcIixcblx0Q09NTUVOVCA9IFwiY29tbWVudFwiLFxufVxuXG5leHBvcnQgdHlwZSBSYW5nZVR5cGUgPSBTdWdnZXN0aW9uVHlwZSB8IFwiXCI7XG5cbmV4cG9ydCBjb25zdCBDTV9TdWdnZXN0aW9uVHlwZXM6IEVudW1EaWN0aW9uYXJ5PHN0cmluZywgU3VnZ2VzdGlvblR5cGU+ID0ge1xuXHRcIkFkZGl0aW9uXCI6IFN1Z2dlc3Rpb25UeXBlLkFERElUSU9OLFxuXHRcIkRlbGV0aW9uXCI6IFN1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OLFxuXHRcIlN1YnN0aXR1dGlvblwiOiBTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT04sXG5cdFwiSGlnaGxpZ2h0XCI6IFN1Z2dlc3Rpb25UeXBlLkhJR0hMSUdIVCxcblx0XCJDb21tZW50XCI6IFN1Z2dlc3Rpb25UeXBlLkNPTU1FTlQsXG59O1xuXG5leHBvcnQgY29uc3QgQ01fU3ludGF4OiBFbnVtRGljdGlvbmFyeTxTdWdnZXN0aW9uVHlwZSwgW3N0cmluZywgc3RyaW5nXT4gPSB7XG5cdFtTdWdnZXN0aW9uVHlwZS5BRERJVElPTl06IFtcIitcIiwgXCIrXCJdLFxuXHRbU3VnZ2VzdGlvblR5cGUuREVMRVRJT05dOiBbXCItXCIsIFwiLVwiXSxcblx0W1N1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTl06IFtcIn5cIiwgXCJ+XCJdLFxuXHRbU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUXTogW1wiPVwiLCBcIj1cIl0sXG5cdFtTdWdnZXN0aW9uVHlwZS5DT01NRU5UXTogW1wiPlwiLCBcIjxcIl0sXG59O1xuXG5leHBvcnQgY29uc3QgQ01fQWxsX0JyYWNrZXRzOiBFbnVtRGljdGlvbmFyeTxTdWdnZXN0aW9uVHlwZSwgc3RyaW5nW10+ID0ge1xuXHRbU3VnZ2VzdGlvblR5cGUuQURESVRJT05dOiBbXCJ7KytcIiwgXCIrK31cIl0sXG5cdFtTdWdnZXN0aW9uVHlwZS5ERUxFVElPTl06IFtcInstLVwiLCBcIi0tfVwiXSxcblx0W1N1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTl06IFtcInt+flwiLCBcIn4+XCIsIFwifn59XCJdLFxuXHRbU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUXTogW1wiez09XCIsIFwiPT19XCJdLFxuXHRbU3VnZ2VzdGlvblR5cGUuQ09NTUVOVF06IFtcIns+PlwiLCBcIjw8fVwiXSxcbn07XG5cbmV4cG9ydCBjb25zdCBDTV9CcmFja2V0czogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge1xuXHRcInsrK1wiOiBbXCIrK31cIl0sXG5cdFwiey0tXCI6IFtcIi0tfVwiXSxcblx0XCJ7fn5cIjogW1wifj5cIiwgXCJ+fn1cIl0sXG5cdFwiez09XCI6IFtcIj09fVwiXSxcblx0XCJ7Pj5cIjogW1wiPDx9XCJdLFxufTtcblxuZXhwb3J0IGNvbnN0IFNVR0dFU1RJT05fSUNPTl9NQVBQRVIgPSB7XG5cdFtTdWdnZXN0aW9uVHlwZS5BRERJVElPTl06IFwicGx1cy1jaXJjbGVcIixcblx0W1N1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OXTogXCJtaW51cy1zcXVhcmVcIixcblx0W1N1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTl06IFwicmVwbGFjZVwiLFxuXHRbU3VnZ2VzdGlvblR5cGUuSElHSExJR0hUXTogXCJoaWdobGlnaHRlclwiLFxuXHRbU3VnZ2VzdGlvblR5cGUuQ09NTUVOVF06IFwibWVzc2FnZS1zcXVhcmVcIixcbn07XG4iLCAiaW1wb3J0IHsgUHJldmlld01vZGUsIFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04gfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgRWRpdG9yQ2hhbmdlIH0gZnJvbSBcIi4uL2VkaXQtaGFuZGxlclwiO1xuaW1wb3J0IHsgQ01fQWxsX0JyYWNrZXRzLCB0eXBlIFNUUklOR19TVUdHRVNUSU9OX1RZUEUsIHR5cGUgU3VnZ2VzdGlvblR5cGUgfSBmcm9tIFwiLi9kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBDb21tZW50UmFuZ2UgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBzaG9ydEhhbmRNYXBwaW5nID0ge1xuXHRcImFcIjogXCJhdXRob3JcIixcblx0XCJ0XCI6IFwidGltZVwiLFxuXHRcImRcIjogXCJkb25lXCIsXG5cdFwic1wiOiBcInN0eWxlXCIsXG5cdFwiY1wiOiBcImNvbG9yXCIsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhRmllbGRzIHtcblx0YXV0aG9yPzogc3RyaW5nO1xuXHR0aW1lPzogbnVtYmVyO1xuXHRkb25lPzogYm9vbGVhbjtcblx0c3R5bGU/OiBzdHJpbmc7XG5cdGNvbG9yPzogc3RyaW5nO1xuXHRbcHJvcDogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRmaWVsZHM6IE1ldGFkYXRhRmllbGRzID0ge307XG5cdHJlcGxpZXM6IENvbW1lbnRSYW5nZVtdID0gW107XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuXHRcdHB1YmxpYyBmcm9tOiBudW1iZXIsXG5cdFx0cHVibGljIHRvOiBudW1iZXIsXG5cdFx0cHVibGljIHR5cGU6IFN1Z2dlc3Rpb25UeXBlLFxuXHRcdHB1YmxpYyByZXByOiBTVFJJTkdfU1VHR0VTVElPTl9UWVBFLFxuXHRcdHB1YmxpYyB0ZXh0OiBzdHJpbmcsXG5cdFx0cHVibGljIG1ldGFkYXRhPzogbnVtYmVyLFxuXHQpIHtcblx0XHRpZiAobWV0YWRhdGEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgbWV0YWRhdGFfc2VwYXJhdG9yID0gbWV0YWRhdGEgLSBmcm9tO1xuXHRcdFx0Y29uc3QgbWV0YWRhdGFfdGV4dCA9IHRleHQuc2xpY2UoMywgbWV0YWRhdGFfc2VwYXJhdG9yKTtcblx0XHRcdHRoaXMudGV4dCA9IHRleHQuc2xpY2UoMCwgMykgKyB0ZXh0LnNsaWNlKG1ldGFkYXRhX3NlcGFyYXRvciArIDIpO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gVE9ETzogRGV0ZXJtaW5lIHdoZXRoZXIgbWV0YWRhdGEgc3BlY2lmaWNhdGlvbiBzaG91bGQgaGF2ZSBxdW90ZXMgYXJvdW5kIGtleXdvcmRzXG5cdFx0XHRcdC8vICAgKyBDbGVhbmVyLCBzaG9ydGVyXG5cdFx0XHRcdC8vICAgLSBOb3QgdmFsaWQgSlNPTlxuXHRcdFx0XHQvLyBUT0RPOiBKUyBjYW4gYmUgaW5qZWN0ZWQgaGVyZSwgcG9zc2libGUgc2VjdXJpdHkgcmlza1xuXHRcdFx0XHQvLyB0aGlzLmZpZWxkcyA9IEpTT04ucGFyc2UoYHske21ldGFkYXRhX3RleHR9fWApO1xuXHRcdFx0XHR0aGlzLmZpZWxkcyA9IEpTT04ucGFyc2UobWV0YWRhdGFfdGV4dCk7XG5cdFx0XHRcdGZvciAoY29uc3Qga2V5IGluIHRoaXMuZmllbGRzKSB7XG5cdFx0XHRcdFx0aWYgKGtleSBpbiBzaG9ydEhhbmRNYXBwaW5nKSB7XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlIChUaGlzIGlzIGEgcGFpbiB0byB0eXBlLCB0aGUgdHMtaWdub3JlIGlzIDEwMCUgd29ydGggaXQpXG5cdFx0XHRcdFx0XHR0aGlzLmZpZWxkc1tzaG9ydEhhbmRNYXBwaW5nW2tleV1dID0gdGhpcy5maWVsZHNba2V5XTtcblx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLmZpZWxkc1trZXkgYXMga2V5b2YgdHlwZW9mIHRoaXMuZmllbGRzXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0Ly8gVE9ETzogTWFyayBhcyBpbnZhbGlkIG1hcmtkb3duICh0aGlzIGNhbiBoYXBwZW4gd2hlbiBzZXBhcmF0b3IgQEAgZXhpc3RzLCBidXQge30gaXMgbm90IGdpdmVuXG5cdFx0XHRcdHRoaXMuZmllbGRzID0ge307XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Z2V0IGJhc2VfcmFuZ2UoKTogQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Z2V0IGZ1bGxfdGhyZWFkKCk6IENyaXRpY01hcmt1cFJhbmdlW10ge1xuXHRcdHJldHVybiBbdGhpcywgLi4udGhpcy5yZXBsaWVzXTtcblx0fVxuXG5cdGdldCB0aHJlYWQoKTogQ29tbWVudFJhbmdlW10ge1xuXHRcdHJldHVybiBbLi4udGhpcy5yZXBsaWVzXTtcblx0fVxuXG5cdGdldCBsZW5ndGgoKSB7XG5cdFx0cmV0dXJuIHRoaXMudG8gLSB0aGlzLmZyb20gLSA2O1xuXHR9XG5cblx0Z2V0IGZ1bGxfdGV4dCgpIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0ICsgdGhpcy5yZXBsaWVzLm1hcChyZXBseSA9PiByZXBseS50ZXh0KS5qb2luKFwiXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvY2F0aW9uOiB7Kip7XCJtZXRhXCI6IFwiZGF0YVwifUBAXHUyNTkxc29tZTt0ZXh0Kip9LCB7KipcdTI1OTFzb21lIHRleHQqKn1cblx0ICovXG5cdGdldCByYW5nZV9zdGFydCgpIHtcblx0XHRyZXR1cm4gdGhpcy5tZXRhZGF0YSA/IHRoaXMubWV0YWRhdGEgKyAyIDogdGhpcy5mcm9tICsgMztcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2NhdGlvbjogeyoqe1wibWV0YVwiOiBcImRhdGFcIn1cdTI1OTFAQHNvbWU7dGV4dCoqfSwgXHUyNTkxeyoqc29tZSB0ZXh0Kip9XG5cdCAqL1xuXHRnZXQgcmFuZ2VfZnJvbnQoKSB7XG5cdFx0cmV0dXJuIHRoaXMubWV0YWRhdGEgPyB0aGlzLm1ldGFkYXRhIC0gMSA6IHRoaXMuZnJvbTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2NhdGlvbjogXHUyNTkxeyoqc29tZTt0ZXh0Kip9ez4+Y29tbWVudDw8fSwgXHUyNTkxeyoqc29tZSB0ZXh0Kip9XG5cdCAqL1xuXHRnZXQgZnVsbF9yYW5nZV9mcm9udCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLmJhc2VfcmFuZ2UuZnJvbTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2NhdGlvbjogeyoqc29tZTt0ZXh0Kip9ez4+Y29tbWVudDw8fVx1MjU5MSwgeyoqc29tZSB0ZXh0Kip9XHUyNTkxXG5cdCAqL1xuXHRnZXQgZnVsbF9yYW5nZV9iYWNrKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZV9yYW5nZS5yZXBsaWVzLmxlbmd0aCA/XG5cdFx0XHR0aGlzLmJhc2VfcmFuZ2UucmVwbGllc1t0aGlzLmJhc2VfcmFuZ2UucmVwbGllcy5sZW5ndGggLSAxXS50byA6XG5cdFx0XHR0aGlzLnRvO1xuXHR9XG5cblx0cmFuZ2VfdHlwZShmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpOiBTdWdnZXN0aW9uVHlwZSB7XG5cdFx0cmV0dXJuIHRoaXMudHlwZTtcblx0fVxuXG5cdHJlbW92ZV9tZXRhZGF0YSgpOiBFZGl0b3JDaGFuZ2VbXSB7XG5cdFx0aWYgKCF0aGlzLm1ldGFkYXRhKSByZXR1cm4gW107XG5cdFx0cmV0dXJuIFt7XG5cdFx0XHRmcm9tOiB0aGlzLmZyb20gKyAzLFxuXHRcdFx0dG86IHRoaXMubWV0YWRhdGEgKyAyLFxuXHRcdFx0aW5zZXJ0OiBcIlwiLFxuXHRcdH1dO1xuXHR9XG5cblx0ZGVsZXRlX21ldGFkYXRhKGtleTogc3RyaW5nKTogRWRpdG9yQ2hhbmdlW10ge1xuXHRcdGlmIChrZXkgaW4gc2hvcnRIYW5kTWFwcGluZykga2V5ID0gc2hvcnRIYW5kTWFwcGluZ1trZXkgYXMga2V5b2YgdHlwZW9mIHNob3J0SGFuZE1hcHBpbmddO1xuXG5cdFx0aWYgKGtleSBpbiB0aGlzLmZpZWxkcykge1xuXHRcdFx0ZGVsZXRlIHRoaXMuZmllbGRzW2tleSBhcyBrZXlvZiB0eXBlb2YgdGhpcy5maWVsZHNdO1xuXHRcdFx0aWYgKE9iamVjdC5rZXlzKHRoaXMuZmllbGRzKS5sZW5ndGggPT09IDApXG5cdFx0XHRcdHRoaXMucmVtb3ZlX21ldGFkYXRhKCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuc2V0X21ldGFkYXRhKHRoaXMuZmllbGRzKTtcblx0XHR9XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0YWRkX21ldGFkYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IEVkaXRvckNoYW5nZVtdIHtcblx0XHR0aGlzLmZpZWxkc1trZXkgYXMga2V5b2YgdHlwZW9mIHRoaXMuZmllbGRzXSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzLnNldF9tZXRhZGF0YSh0aGlzLmZpZWxkcyk7XG5cdH1cblxuXHRzZXRfbWV0YWRhdGEoZmllbGRzOiBNZXRhZGF0YUZpZWxkcyk6IEVkaXRvckNoYW5nZVtdIHtcblx0XHQvLyBUT0RPOiBQb3NzaWJseSByZWR1bmRhbnQgYXNzaWdubWVudCwgcmFuZ2VzIHdpbGwgYXV0b21hdGljYWxseSBnZXQgcmUtY29uc3RydWN0ZWQgd2l0aCB0aGUgRWRpdG9yQ2hhbmdlXG5cdFx0dGhpcy5maWVsZHMgPSBmaWVsZHM7XG5cdFx0aWYgKHRoaXMubWV0YWRhdGEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIFt7XG5cdFx0XHRcdGZyb206IHRoaXMuZnJvbSArIDMsXG5cdFx0XHRcdHRvOiB0aGlzLm1ldGFkYXRhLFxuXHRcdFx0XHRpbnNlcnQ6IEpTT04uc3RyaW5naWZ5KGZpZWxkcyksXG5cdFx0XHR9XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFt7XG5cdFx0XHRcdGZyb206IHRoaXMuZnJvbSArIDMsXG5cdFx0XHRcdHRvOiB0aGlzLmZyb20gKyAzLFxuXHRcdFx0XHRpbnNlcnQ6IEpTT04uc3RyaW5naWZ5KGZpZWxkcykgKyBcIkBAXCIsXG5cdFx0XHR9XTtcblx0XHR9XG5cdH1cblxuXHRoYXNfY29tbWVudChyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy50aHJlYWQuaW5jbHVkZXMocmFuZ2UgYXMgQ29tbWVudFJhbmdlKTtcblx0fVxuXG5cdGNvcHkoKTogQ3JpdGljTWFya3VwUmFuZ2Uge1xuXHRcdHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpKSwgdGhpcyk7XG5cdH1cblxuXHRlcXVhbHMob3RoZXI6IENyaXRpY01hcmt1cFJhbmdlKSB7XG5cdFx0cmV0dXJuIHRoaXMudHlwZSA9PT0gb3RoZXIudHlwZSAmJiB0aGlzLmZyb20gPT09IG90aGVyLmZyb20gJiYgdGhpcy50byA9PT0gb3RoZXIudG8gJiZcblx0XHRcdHRoaXMucmVwbGllcy5sZW5ndGggPT09IG90aGVyLnJlcGxpZXMubGVuZ3RoICYmIHRoaXMuZnVsbF90ZXh0ID09PSBvdGhlci5mdWxsX3RleHQ7XG5cdH1cblxuXHRsZWZ0X2FkamFjZW50KG90aGVyOiBDcml0aWNNYXJrdXBSYW5nZSkge1xuXHRcdHJldHVybiB0aGlzLmZyb20gPT09IG90aGVyLnRvO1xuXHR9XG5cblx0cmlnaHRfYWRqYWNlbnQob3RoZXI6IENyaXRpY01hcmt1cFJhbmdlKSB7XG5cdFx0cmV0dXJuIHRoaXMudG8gPT09IG90aGVyLmZyb207XG5cdH1cblxuXHRwYXJ0X2lzX2VtcHR5KGxlZnQ6IGJvb2xlYW4pIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRlbXB0eSgpIHtcblx0XHRyZXR1cm4gNiA9PT0gdGhpcy50byAtIHRoaXMuZnJvbTtcblx0fVxuXG5cdHVud3JhcCgpIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0LnNsaWNlKDMsIC0zKTtcblx0fVxuXG5cdHVud3JhcF9icmFja2V0KGxlZnQgPSBmYWxzZSkge1xuXHRcdHJldHVybiBsZWZ0ID8gdGhpcy50ZXh0LnNsaWNlKDMpIDogdGhpcy50ZXh0LnNsaWNlKDAsIC0zKTtcblx0fVxuXG5cdHVud3JhcF9wYXJ0cygpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIFt0aGlzLnVud3JhcCgpXTtcblx0fVxuXG5cdHVud3JhcF9zbGljZShmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpIHtcblx0XHRmcm9tIC09IHRoaXMucmFuZ2VfZnJvbnQ7XG5cdFx0dG8gLT0gdGhpcy5yYW5nZV9mcm9udDtcblx0XHRpZiAodG8gPD0gMCB8fCBmcm9tID09PSB0bykgcmV0dXJuIFwiXCI7XG5cblx0XHRyZXR1cm4gdGhpcy50ZXh0LnNsaWNlKE1hdGgubWF4KDMsIGZyb20pLCBNYXRoLm1pbih0aGlzLnRleHQubGVuZ3RoIC0gMywgdG8pKTtcblx0fVxuXG5cdHBhcnRpYWxseV9pbl9yYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuXHRcdC8vIHJldHVybiB0aGlzLmZyb20gPCBlbmQgJiYgc3RhcnQgPCB0aGlzLnRvO1xuXHRcdHJldHVybiAhKHN0YXJ0ID4gdGhpcy50byB8fCBlbmQgPCB0aGlzLmZyb20pO1xuXHR9XG5cblx0ZW5jbG9zZXNfcmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHN0cmljdCA9IGZhbHNlKSB7XG5cdFx0aWYgKHN0cmljdCkgcmV0dXJuIHRoaXMuZnJvbSA8IHN0YXJ0ICYmIHRoaXMudG8gPiBlbmQ7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbSA8PSBzdGFydCAmJiB0aGlzLnRvID49IGVuZDtcblx0fVxuXG5cdHBhcnRfZW5jbG9zZXNfcmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGxlZnQ6IGJvb2xlYW4pIHtcblx0XHRyZXR1cm4gdGhpcy5lbmNsb3Nlc19yYW5nZShzdGFydCwgZW5kKTtcblx0fVxuXG5cdGFjY2VwdCgpIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0O1xuXHR9XG5cblx0cmVqZWN0KCkge1xuXHRcdHJldHVybiB0aGlzLnRleHQ7XG5cdH1cblxuXHR0b3VjaGVzKGN1cnNvcjogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbSA9PT0gY3Vyc29yIHx8IHRoaXMudG8gPT09IGN1cnNvcjtcblx0fVxuXG5cdGN1cnNvcl9pbnNpZGUoY3Vyc29yOiBudW1iZXIpIHtcblx0XHRyZXR1cm4gdGhpcy5mcm9tIDw9IGN1cnNvciAmJiBjdXJzb3IgPD0gdGhpcy50bztcblx0fVxuXG5cdGN1cnNvcl9iZWZvcmVfcmFuZ2UoY3Vyc29yOiBudW1iZXIpIHtcblx0XHRyZXR1cm4gY3Vyc29yIDwgdGhpcy5mcm9tO1xuXHR9XG5cblx0Y3Vyc29yX2FmdGVyX3JhbmdlKGN1cnNvcjogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIGN1cnNvciA+IHRoaXMudG87XG5cdH1cblxuXHQvKipcblx0ICogTW92ZXMgYSBjdXJzb3IgaW5zaWRlIHRoZSBmaXJzdCBub24tc3ludGF4L21ldGFkYXRhIGlmIGl0IGlzIGVpdGhlciBvdXRzaWRlIHRoZSByYW5nZSwgb3IgaW5zaWRlIHN5bnRheFxuXHQgKiBAcGFyYW0gY3Vyc29yIEN1cnNvciB0byBtb3ZlXG5cdCAqIEBwYXJhbSBza2lwX21ldGFkYXRhIFdoZXRoZXIgdG8gc2tpcCBtZXRhZGF0YVxuXHQgKiBAcmVtYXJrIEN1cnNvciB3aWxsIGp1bXAgdG8gcmFuZ2UgcmVnYXJkbGVzcyB3aGV0aGVyIGl0IGlzIGFkamFjZW50IHRvIHRoZSByYW5nZSBvciBub3Rcblx0ICovXG5cdGN1cnNvcl9tb3ZlX2luc2lkZShjdXJzb3I6IG51bWJlciwgc2tpcF9tZXRhZGF0YSA9IGZhbHNlKSB7XG5cdFx0cmV0dXJuIE1hdGgubWluKFxuXHRcdFx0TWF0aC5tYXgoKHNraXBfbWV0YWRhdGEgJiYgdGhpcy5tZXRhZGF0YSkgPyB0aGlzLm1ldGFkYXRhICsgMiA6IHRoaXMuZnJvbSArIDMsIGN1cnNvciksXG5cdFx0XHR0aGlzLnRvIC0gMyxcblx0XHQpO1xuXHR9XG5cblx0Y3Vyc29yX3Bhc3Nfc3ludGF4KGN1cnNvcjogbnVtYmVyLCByaWdodDogYm9vbGVhbiwgc2tpcF9tZXRhZGF0YTogYm9vbGVhbiA9IGZhbHNlKSB7XG5cdFx0aWYgKHJpZ2h0KSB7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVzX2xlZnRfYnJhY2tldChjdXJzb3IsIHRydWUsIGZhbHNlLCBza2lwX21ldGFkYXRhKSlcblx0XHRcdFx0Y3Vyc29yID0gKHNraXBfbWV0YWRhdGEgJiYgdGhpcy5tZXRhZGF0YSkgPyAodGhpcy5tZXRhZGF0YSEgKyAyKSA6ICh0aGlzLmZyb20gKyAzKTtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfcmlnaHRfYnJhY2tldChjdXJzb3IsIGZhbHNlLCB0cnVlKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy50bztcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMudG91Y2hlc19yaWdodF9icmFja2V0KGN1cnNvciwgdHJ1ZSwgZmFsc2UpKVxuXHRcdFx0XHRjdXJzb3IgPSB0aGlzLnRvIC0gMztcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfbGVmdF9icmFja2V0KGN1cnNvciwgZmFsc2UsIHRydWUsIHNraXBfbWV0YWRhdGEpKVxuXHRcdFx0XHRjdXJzb3IgPSB0aGlzLmZyb207XG5cdFx0fVxuXHRcdHJldHVybiBjdXJzb3I7XG5cdH1cblxuXHRjdXJzb3JfbW92ZV90aHJvdWdoKGN1cnNvcjogbnVtYmVyLCByaWdodDogYm9vbGVhbiwgbW92ZW1lbnQ6IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04pIHtcblx0XHRpZiAobW92ZW1lbnQgPT0gUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5VTkNIQU5HRUQgfHwgIXRoaXMuY3Vyc29yX2luc2lkZShjdXJzb3IpKSB7IC8qIE5vIGFjdGlvbiAqLyB9XG5cdFx0ZWxzZSBpZiAobW92ZW1lbnQgPT0gUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5JR05PUkVfQ09NUExFVEVMWSlcblx0XHRcdGN1cnNvciA9IHJpZ2h0ID8gdGhpcy50byA6IHRoaXMuZnJvbTtcblx0XHRlbHNlXG5cdFx0XHRjdXJzb3IgPSB0aGlzLmN1cnNvcl9wYXNzX3N5bnRheChjdXJzb3IsIHJpZ2h0LCBtb3ZlbWVudCA9PSBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSk7XG5cdFx0cmV0dXJuIGN1cnNvcjtcblx0fVxuXG5cdHRvdWNoZXNfbGVmdF9icmFja2V0KGN1cnNvcjogbnVtYmVyLCBvdXRzaWRlX2xvb3NlID0gZmFsc2UsIGluc2lkZV9sb29zZSA9IGZhbHNlLCBpbmNsdWRlX21ldGFkYXRhID0gZmFsc2UpIHtcblx0XHRyZXR1cm4gY3Vyc29yICsgKG91dHNpZGVfbG9vc2UgPyAwIDogMSkgPj0gdGhpcy5mcm9tICYmXG5cdFx0XHRjdXJzb3IgKyAoaW5zaWRlX2xvb3NlID8gMCA6IDEpIDw9XG5cdFx0XHRcdCgoaW5jbHVkZV9tZXRhZGF0YSAmJiB0aGlzLm1ldGFkYXRhKSA/IHRoaXMubWV0YWRhdGEgKyAyIDogdGhpcy5mcm9tICsgMyk7XG5cdH1cblxuXHR0b3VjaGVzX3NlcGFyYXRvcihjdXJzb3I6IG51bWJlciwgbGVmdF9sb29zZSA9IGZhbHNlLCByaWdodF9sb29zZSA9IGZhbHNlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0dG91Y2hlc19yaWdodF9icmFja2V0KGN1cnNvcjogbnVtYmVyLCBvdXRzaWRlX2xvb3NlID0gZmFsc2UsIGluc2lkZV9sb29zZSA9IGZhbHNlKSB7XG5cdFx0cmV0dXJuIGN1cnNvciAtIChpbnNpZGVfbG9vc2UgPyAwIDogMSkgPj0gdGhpcy50byAtIDMgJiYgY3Vyc29yIC0gKG91dHNpZGVfbG9vc2UgPyAwIDogMSkgPD0gdGhpcy50bztcblx0fVxuXG5cdHRvdWNoZXNfYnJhY2tldChjdXJzb3I6IG51bWJlciwgbGVmdDogYm9vbGVhbiwgb3V0c2lkZV9sb29zZSA9IGZhbHNlLCBpbnNpZGVfbG9vc2UgPSBmYWxzZSkge1xuXHRcdHJldHVybiBsZWZ0ID9cblx0XHRcdHRoaXMudG91Y2hlc19sZWZ0X2JyYWNrZXQoY3Vyc29yLCBvdXRzaWRlX2xvb3NlLCBpbnNpZGVfbG9vc2UpIDpcblx0XHRcdHRoaXMudG91Y2hlc19yaWdodF9icmFja2V0KGN1cnNvciwgb3V0c2lkZV9sb29zZSwgaW5zaWRlX2xvb3NlKTtcblx0fVxuXG5cdHBvc3Rwcm9jZXNzKFxuXHRcdHVud3JhcDogYm9vbGVhbiA9IHRydWUsXG5cdFx0cHJldmlld01vZGU6IFByZXZpZXdNb2RlID0gUHJldmlld01vZGUuQUxMLFxuXHRcdHRhZzoga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwID0gXCJkaXZcIixcblx0XHRsZWZ0OiBib29sZWFuIHwgbnVsbCA9IG51bGwsXG5cdFx0dGV4dD86IHN0cmluZyxcblx0KTogc3RyaW5nIHwgSFRNTEVsZW1lbnQge1xuXHRcdGxldCBzdHIgPSB0ZXh0ID8/IHRoaXMudGV4dDtcblx0XHRpZiAoIXRleHQgJiYgdW53cmFwKSB7XG5cdFx0XHRpZiAodGhpcy50byA+PSBzdHIubGVuZ3RoICYmICFzdHIuZW5kc1dpdGgoQ01fQWxsX0JyYWNrZXRzW3RoaXMudHlwZV0uYXQoLTEpISkpXG5cdFx0XHRcdHN0ciA9IHRoaXMudW53cmFwX2JyYWNrZXQodHJ1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHN0ciA9IHRoaXMudW53cmFwKCk7XG5cdFx0fVxuXHRcdHJldHVybiBgPCR7dGFnfSBjbGFzcz0nY210ci0ke3RoaXMucmVwci50b0xvd2VyQ2FzZSgpfSc+JHtzdHJ9PC8ke3RhZ30+YDtcblx0fVxuXG5cdGFwcGx5X29mZnNldChvZmZzZXQ6IG51bWJlcikge1xuXHRcdHRoaXMuZnJvbSArPSBvZmZzZXQ7XG5cdFx0dGhpcy50byArPSBvZmZzZXQ7XG5cdFx0aWYgKHRoaXMubWV0YWRhdGEgIT09IHVuZGVmaW5lZCkgdGhpcy5tZXRhZGF0YSArPSBvZmZzZXQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSByZXF1aXJlZCBjaGFyYWN0ZXJzIHRvIGZpeCBhIHJhbmdlIHdoZW4gc3BsaXR0aW5nIGEgcmFuZ2UgYXQgZ2l2ZW4gY3Vyc29yIHBvc2l0aW9uXG5cdCAqIEBwYXJhbSBjdXJzb3IgQ3Vyc29yIHBvc2l0aW9uIHRvIHNwbGl0IGF0XG5cdCAqL1xuXHRzcGxpdF9yYW5nZShjdXJzb3I6IG51bWJlcik6IFtzdHJpbmcsIHN0cmluZ10ge1xuXHRcdHJldHVybiBbdGhpcy50ZXh0LnNsaWNlKC0zKSwgdGhpcy50ZXh0LnNsaWNlKDAsIDMpICsgKHRoaXMubWV0YWRhdGEgPyBKU09OLnN0cmluZ2lmeSh0aGlzLmZpZWxkcykgKyBcIkBAXCIgOiBcIlwiKV07XG5cdH1cbn1cbiIsICJpbXBvcnQgeyBQcmV2aWV3TW9kZSB9IGZyb20gXCIuLi8uLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgQ3JpdGljTWFya3VwUmFuZ2UgfSBmcm9tIFwiLi4vYmFzZV9yYW5nZVwiO1xuaW1wb3J0IHsgQ01fQWxsX0JyYWNrZXRzLCBTdWdnZXN0aW9uVHlwZSB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkaXRpb25SYW5nZSBleHRlbmRzIENyaXRpY01hcmt1cFJhbmdlIHtcblx0Y29uc3RydWN0b3IoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIG1ldGFkYXRhPzogbnVtYmVyKSB7XG5cdFx0c3VwZXIoZnJvbSwgdG8sIFN1Z2dlc3Rpb25UeXBlLkFERElUSU9OLCBcIkFkZGl0aW9uXCIsIHRleHQsIG1ldGFkYXRhKTtcblx0fVxuXG5cdGFjY2VwdCgpIHtcblx0XHRyZXR1cm4gdGhpcy51bndyYXAoKTtcblx0fVxuXG5cdHJlamVjdCgpIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdHBvc3Rwcm9jZXNzKFxuXHRcdHVud3JhcDogYm9vbGVhbiA9IHRydWUsXG5cdFx0cHJldmlld01vZGU6IFByZXZpZXdNb2RlID0gUHJldmlld01vZGUuQUxMLFxuXHRcdHRhZzoga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwID0gXCJkaXZcIixcblx0XHRsZWZ0OiBib29sZWFuIHwgbnVsbCA9IG51bGwsXG5cdFx0dGV4dD86IHN0cmluZyxcblx0KSB7XG5cdFx0bGV0IHN0ciA9IHRleHQgPz8gdGhpcy50ZXh0O1xuXHRcdGlmICghdGV4dCAmJiB1bndyYXApIHtcblx0XHRcdGlmICh0aGlzLnRvID49IHN0ci5sZW5ndGggJiYgIXN0ci5lbmRzV2l0aChDTV9BbGxfQnJhY2tldHNbdGhpcy50eXBlXS5hdCgtMSkhKSlcblx0XHRcdFx0c3RyID0gdGhpcy51bndyYXBfYnJhY2tldCh0cnVlKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0c3RyID0gdGhpcy51bndyYXAoKTtcblx0XHR9XG5cblx0XHRsZXQgY2xzID0gXCJjbXRyLXByZXZpZXdcIjtcblx0XHRpZiAocHJldmlld01vZGUgPT09IFByZXZpZXdNb2RlLkFMTClcblx0XHRcdGNscyArPSBcIiBjbXRyLWFkZGl0aW9uXCI7XG5cdFx0ZWxzZSBpZiAocHJldmlld01vZGUgPT09IFByZXZpZXdNb2RlLlJFSkVDVClcblx0XHRcdHN0ciA9IFwiXCI7XG5cblx0XHRyZXR1cm4gYDwke3RhZ30gY2xhc3M9JyR7Y2xzfSc+JHtzdHJ9PC8ke3RhZ30+YDtcblx0fVxufVxuIiwgImltcG9ydCB7IENyaXRpY01hcmt1cFJhbmdlIH0gZnJvbSBcIi4uL2Jhc2VfcmFuZ2VcIjtcbmltcG9ydCB7IFN1Z2dlc3Rpb25UeXBlIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBDb21tZW50UmFuZ2UgZXh0ZW5kcyBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdHJlcGx5X2RlcHRoID0gMDtcblx0YXR0YWNoZWRfY29tbWVudDogQ3JpdGljTWFya3VwUmFuZ2UgfCBudWxsID0gbnVsbDtcblxuXHRnZXQgYmFzZV9yYW5nZSgpOiBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdFx0cmV0dXJuIHRoaXMuYXR0YWNoZWRfY29tbWVudCB8fCB0aGlzO1xuXHR9XG5cblx0Z2V0IHRocmVhZCgpOiBDb21tZW50UmFuZ2VbXSB7XG5cdFx0cmV0dXJuIHRoaXMuYXR0YWNoZWRfY29tbWVudCA/IFsuLi50aGlzLmF0dGFjaGVkX2NvbW1lbnQudGhyZWFkXSA6IFt0aGlzLCAuLi50aGlzLnJlcGxpZXNdO1xuXHR9XG5cblx0Y2xlYXJfcmVmZXJlbmNlcygpIHtcblx0XHR0aGlzLmF0dGFjaGVkX2NvbW1lbnQgPSBudWxsO1xuXHRcdHRoaXMucmVwbHlfZGVwdGggPSAwO1xuXHR9XG5cblx0YWRkX3JlcGx5KHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSkge1xuXHRcdHRoaXMuYXR0YWNoX3RvX3JhbmdlKHJhbmdlLnR5cGUgPT09IFN1Z2dlc3Rpb25UeXBlLkNPTU1FTlQgPyAocmFuZ2UgYXMgQ29tbWVudFJhbmdlKS5iYXNlX3JhbmdlIDogcmFuZ2UpO1xuXHR9XG5cblx0YXR0YWNoX3RvX3JhbmdlKHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSkge1xuXHRcdHJhbmdlLnJlcGxpZXMucHVzaCh0aGlzKTtcblx0XHR0aGlzLnJlcGx5X2RlcHRoID0gcmFuZ2UucmVwbGllcy5sZW5ndGggLSAocmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCA/IDAgOiAxKTtcblx0XHR0aGlzLmF0dGFjaGVkX2NvbW1lbnQgPSByYW5nZTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKGZyb206IG51bWJlciwgdG86IG51bWJlciwgdGV4dDogc3RyaW5nLCBtZXRhZGF0YT86IG51bWJlcikge1xuXHRcdHN1cGVyKGZyb20sIHRvLCBTdWdnZXN0aW9uVHlwZS5DT01NRU5ULCBcIkNvbW1lbnRcIiwgdGV4dCwgbWV0YWRhdGEpO1xuXHR9XG59XG4iLCAiaW1wb3J0IHsgUHJldmlld01vZGUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IENyaXRpY01hcmt1cFJhbmdlIH0gZnJvbSBcIi4uL2Jhc2VfcmFuZ2VcIjtcbmltcG9ydCB7IENNX0FsbF9CcmFja2V0cywgU3VnZ2VzdGlvblR5cGUgfSBmcm9tIFwiLi4vZGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGNsYXNzIERlbGV0aW9uUmFuZ2UgZXh0ZW5kcyBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdGNvbnN0cnVjdG9yKGZyb206IG51bWJlciwgdG86IG51bWJlciwgdGV4dDogc3RyaW5nLCBtZXRhZGF0YT86IG51bWJlcikge1xuXHRcdHN1cGVyKGZyb20sIHRvLCBTdWdnZXN0aW9uVHlwZS5ERUxFVElPTiwgXCJEZWxldGlvblwiLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdH1cblxuXHRhY2NlcHQoKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHRyZWplY3QoKSB7XG5cdFx0cmV0dXJuIHRoaXMudW53cmFwKCk7XG5cdH1cblxuXHRwb3N0cHJvY2Vzcyhcblx0XHR1bndyYXA6IGJvb2xlYW4gPSB0cnVlLFxuXHRcdHByZXZpZXdNb2RlOiBQcmV2aWV3TW9kZSA9IFByZXZpZXdNb2RlLkFMTCxcblx0XHR0YWc6IGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcCA9IFwiZGl2XCIsXG5cdFx0bGVmdDogYm9vbGVhbiB8IG51bGwgPSBudWxsLFxuXHRcdHRleHQ/OiBzdHJpbmcsXG5cdCkge1xuXHRcdGxldCBzdHIgPSB0ZXh0ID8/IHRoaXMudGV4dDtcblx0XHRpZiAoIXRleHQgJiYgdW53cmFwKSB7XG5cdFx0XHRpZiAodGhpcy50byA+PSBzdHIubGVuZ3RoICYmICFzdHIuZW5kc1dpdGgoQ01fQWxsX0JyYWNrZXRzW3RoaXMudHlwZV0uYXQoLTEpISkpXG5cdFx0XHRcdHN0ciA9IHRoaXMudW53cmFwX2JyYWNrZXQodHJ1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHN0ciA9IHRoaXMudW53cmFwKCk7XG5cdFx0fVxuXG5cdFx0bGV0IGNscyA9IFwiY210ci1wcmV2aWV3XCI7XG5cdFx0aWYgKHByZXZpZXdNb2RlID09PSBQcmV2aWV3TW9kZS5BTEwpXG5cdFx0XHRjbHMgKz0gXCIgY210ci1kZWxldGlvblwiO1xuXHRcdGVsc2UgaWYgKHByZXZpZXdNb2RlID09PSBQcmV2aWV3TW9kZS5BQ0NFUFQpXG5cdFx0XHRzdHIgPSBcIlwiO1xuXG5cdFx0cmV0dXJuIGA8JHt0YWd9IGNsYXNzPScke2Nsc30nPiR7c3RyfTwvJHt0YWd9PmA7XG5cdH1cbn1cbiIsICJpbXBvcnQgeyBDcml0aWNNYXJrdXBSYW5nZSB9IGZyb20gXCIuLi9iYXNlX3JhbmdlXCI7XG5pbXBvcnQgeyBTdWdnZXN0aW9uVHlwZSB9IGZyb20gXCIuLi9kZWZpbml0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgSGlnaGxpZ2h0UmFuZ2UgZXh0ZW5kcyBDcml0aWNNYXJrdXBSYW5nZSB7XG5cdGNvbnN0cnVjdG9yKGZyb206IG51bWJlciwgdG86IG51bWJlciwgdGV4dDogc3RyaW5nLCBtZXRhZGF0YT86IG51bWJlcikge1xuXHRcdHN1cGVyKGZyb20sIHRvLCBTdWdnZXN0aW9uVHlwZS5ISUdITElHSFQsIFwiSGlnaGxpZ2h0XCIsIHRleHQsIG1ldGFkYXRhKTtcblx0fVxufVxuIiwgImltcG9ydCB7IFByZXZpZXdNb2RlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBDcml0aWNNYXJrdXBSYW5nZSB9IGZyb20gXCIuLi9iYXNlX3JhbmdlXCI7XG5pbXBvcnQgeyBDTV9BbGxfQnJhY2tldHMsIFN1Z2dlc3Rpb25UeXBlIH0gZnJvbSBcIi4uL2RlZmluaXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBTdWJzdGl0dXRpb25SYW5nZSBleHRlbmRzIENyaXRpY01hcmt1cFJhbmdlIHtcblx0Y29uc3RydWN0b3IoZnJvbTogbnVtYmVyLCBwdWJsaWMgbWlkZGxlOiBudW1iZXIsIHRvOiBudW1iZXIsIHRleHQ6IHN0cmluZywgbWV0YWRhdGE/OiBudW1iZXIpIHtcblx0XHRzdXBlcihmcm9tLCB0bywgU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OLCBcIlN1YnN0aXR1dGlvblwiLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdH1cblxuXHRnZXQgbGVuZ3RoKCkge1xuXHRcdHJldHVybiB0aGlzLnRvIC0gdGhpcy5mcm9tIC0gODtcblx0fVxuXG5cdGdldCBjaGFyX21pZGRsZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5taWRkbGUgLSB0aGlzLnJhbmdlX2Zyb250O1xuXHR9XG5cblx0cmFuZ2VfdHlwZShmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpIHtcblx0XHRyZXR1cm4gdG8gPD0gdGhpcy5taWRkbGUgKyAyID9cblx0XHRcdFN1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OIDpcblx0XHRcdGZyb20gPj0gdGhpcy5taWRkbGUgP1xuXHRcdFx0U3VnZ2VzdGlvblR5cGUuQURESVRJT04gOlxuXHRcdFx0U3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OO1xuXHR9XG5cblx0dW53cmFwKCkge1xuXHRcdHJldHVybiB0aGlzLnRleHQuc2xpY2UoMywgdGhpcy5jaGFyX21pZGRsZSkgKyB0aGlzLnRleHQuc2xpY2UodGhpcy5jaGFyX21pZGRsZSArIDIsIC0zKTtcblx0fVxuXG5cdHVud3JhcF9wYXJ0cygpIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0dGhpcy50ZXh0LnNsaWNlKDMsIHRoaXMuY2hhcl9taWRkbGUpLFxuXHRcdFx0dGhpcy50ZXh0LnNsaWNlKHRoaXMuY2hhcl9taWRkbGUgKyAyLCAtMyksXG5cdFx0XTtcblx0fVxuXG5cdHVud3JhcF9zbGljZV9wYXJ0c19pbnZlcnRlZChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpIHtcblx0XHRmcm9tIC09IHRoaXMucmFuZ2VfZnJvbnQ7XG5cdFx0dG8gLT0gdGhpcy5yYW5nZV9mcm9udDtcblxuXHRcdGZyb20gPSBNYXRoLm1heCgwLCBmcm9tKTtcblxuXHRcdGlmICh0byA8PSAwKSByZXR1cm4gdGhpcy51bndyYXBfcGFydHMoKTtcblx0XHRpZiAodG8gPD0gdGhpcy5jaGFyX21pZGRsZSkge1xuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKDMsIGZyb20pICsgdGhpcy50ZXh0LnNsaWNlKHRvLCB0aGlzLmNoYXJfbWlkZGxlKSxcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKHRoaXMuY2hhcl9taWRkbGUgKyAyLCAtMyksXG5cdFx0XHRdO1xuXHRcdH1cblx0XHRpZiAoZnJvbSA+PSB0aGlzLmNoYXJfbWlkZGxlICsgMikge1xuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKDMsIHRoaXMuY2hhcl9taWRkbGUpLFxuXHRcdFx0XHR0aGlzLnRleHQuc2xpY2UodGhpcy5jaGFyX21pZGRsZSArIDIsIGZyb20pICsgdGhpcy50ZXh0LnNsaWNlKHRvLCAtMyksXG5cdFx0XHRdO1xuXHRcdH1cblx0XHRyZXR1cm4gW1xuXHRcdFx0dGhpcy50ZXh0LnNsaWNlKDMsIGZyb20pLFxuXHRcdFx0dGhpcy50ZXh0LnNsaWNlKHRvLCAtMyksXG5cdFx0XTtcblx0fVxuXG5cdHVud3JhcF9wYXJ0c19icmFja2V0KGxlZnQ6IGJvb2xlYW4sIG9mZnNldCA9IDApIHtcblx0XHRpZiAobGVmdCkge1xuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKDMsIHRoaXMuY2hhcl9taWRkbGUpLFxuXHRcdFx0XHR0aGlzLnRleHQuc2xpY2UodGhpcy5jaGFyX21pZGRsZSArIDIpLFxuXHRcdFx0XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0dGhpcy50ZXh0LnNsaWNlKDAsIHRoaXMuY2hhcl9taWRkbGUpLFxuXHRcdFx0XHR0aGlzLnRleHQuc2xpY2UodGhpcy5jaGFyX21pZGRsZSArIDIsIC0zKSxcblx0XHRcdF07XG5cdFx0fVxuXHR9XG5cblx0dW53cmFwX3NsaWNlKGZyb206IG51bWJlciwgdG86IG51bWJlcikge1xuXHRcdGZyb20gLT0gdGhpcy5yYW5nZV9mcm9udDtcblx0XHR0byAtPSB0aGlzLnJhbmdlX2Zyb250O1xuXHRcdGlmICh0byA8PSAwIHx8IGZyb20gPT09IHRvKSByZXR1cm4gXCJcIjtcblxuXHRcdGlmIChmcm9tID49IHRoaXMuY2hhcl9taWRkbGUpXG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0LnNsaWNlKE1hdGgubWF4KHRoaXMuY2hhcl9taWRkbGUgKyAyLCBmcm9tKSwgTWF0aC5taW4odGhpcy50ZXh0Lmxlbmd0aCAtIDMsIHRvKSk7XG5cdFx0aWYgKHRvIDw9IHRoaXMuY2hhcl9taWRkbGUpXG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0LnNsaWNlKE1hdGgubWF4KDMsIGZyb20pLCBNYXRoLm1pbih0aGlzLmNoYXJfbWlkZGxlLCB0bykpO1xuXHRcdHJldHVybiB0aGlzLnRleHQuc2xpY2UoTWF0aC5tYXgoMywgZnJvbSksIHRoaXMuY2hhcl9taWRkbGUpICtcblx0XHRcdHRoaXMudGV4dC5zbGljZSh0aGlzLmNoYXJfbWlkZGxlICsgMiwgTWF0aC5taW4odGhpcy50ZXh0Lmxlbmd0aCAtIDMsIHRvKSk7XG5cdH1cblxuXHRhY2NlcHQoKSB7XG5cdFx0cmV0dXJuIHRoaXMudW53cmFwX3BhcnRzKClbMV07XG5cdH1cblxuXHRyZWplY3QoKSB7XG5cdFx0cmV0dXJuIHRoaXMudW53cmFwX3BhcnRzKClbMF07XG5cdH1cblxuXHR0b3VjaGVzX3NlcGFyYXRvcihjdXJzb3I6IG51bWJlciwgbGVmdF9sb29zZSA9IGZhbHNlLCByaWdodF9sb29zZSA9IGZhbHNlKSB7XG5cdFx0cmV0dXJuIGN1cnNvciArIChsZWZ0X2xvb3NlID8gMSA6IDApID49IHRoaXMubWlkZGxlICYmIGN1cnNvciAtIChyaWdodF9sb29zZSA/IDAgOiAxKSA8PSB0aGlzLm1pZGRsZSArIDI7XG5cdH1cblxuXHRjb250YWluc19zZXBhcmF0b3IoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIGZyb20gPD0gdGhpcy5taWRkbGUgKyAyICYmIHRvID49IHRoaXMubWlkZGxlO1xuXHR9XG5cblx0Y29udGFpbnNfcGFydChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIHN0cmljdCA9IHRydWUpIHtcblx0XHRpZiAoc3RyaWN0KVxuXHRcdFx0cmV0dXJuIHRvIDwgdGhpcy5taWRkbGUgPyB0cnVlIDogZnJvbSA+IHRoaXMubWlkZGxlICsgMiA/IGZhbHNlIDogdW5kZWZpbmVkO1xuXHRcdHJldHVybiB0byA8PSB0aGlzLm1pZGRsZSA/IHRydWUgOiBmcm9tID49IHRoaXMubWlkZGxlICsgMiA/IGZhbHNlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0Y3Vyc29yX3Bhc3Nfc3ludGF4KGN1cnNvcjogbnVtYmVyLCByaWdodDogYm9vbGVhbiwgc2tpcF9tZXRhZGF0YTogYm9vbGVhbiA9IGZhbHNlKTogbnVtYmVyIHtcblx0XHRpZiAocmlnaHQpIHtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfbGVmdF9icmFja2V0KGN1cnNvciwgdHJ1ZSwgZmFsc2UsIHNraXBfbWV0YWRhdGEpKVxuXHRcdFx0XHRjdXJzb3IgPSAoc2tpcF9tZXRhZGF0YSAmJiB0aGlzLm1ldGFkYXRhKSA/ICh0aGlzLm1ldGFkYXRhISArIDIpIDogKHRoaXMuZnJvbSArIDMpO1xuXHRcdFx0aWYgKHRoaXMudG91Y2hlc19zZXBhcmF0b3IoY3Vyc29yLCBmYWxzZSwgdHJ1ZSkpXG5cdFx0XHRcdGN1cnNvciA9IHRoaXMubWlkZGxlICsgMjtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfcmlnaHRfYnJhY2tldChjdXJzb3IsIGZhbHNlLCB0cnVlKSlcblx0XHRcdFx0Y3Vyc29yID0gdGhpcy50bztcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMudG91Y2hlc19yaWdodF9icmFja2V0KGN1cnNvciwgdHJ1ZSwgZmFsc2UpKVxuXHRcdFx0XHRjdXJzb3IgPSB0aGlzLnRvIC0gMztcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfc2VwYXJhdG9yKGN1cnNvciwgZmFsc2UsIHRydWUpKVxuXHRcdFx0XHRjdXJzb3IgPSB0aGlzLm1pZGRsZTtcblx0XHRcdGlmICh0aGlzLnRvdWNoZXNfbGVmdF9icmFja2V0KGN1cnNvciwgZmFsc2UsIHRydWUsIHNraXBfbWV0YWRhdGEpKVxuXHRcdFx0XHRjdXJzb3IgPSB0aGlzLmZyb207XG5cdFx0fVxuXHRcdHJldHVybiBjdXJzb3I7XG5cdH1cblxuXHRwYXJ0X2VuY2xvc2VzX3JhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBsZWZ0OiBib29sZWFuKTogYm9vbGVhbiB7XG5cdFx0aWYgKGxlZnQpXG5cdFx0XHRyZXR1cm4gdGhpcy5mcm9tIDw9IHN0YXJ0ICYmIGVuZCA8PSB0aGlzLm1pZGRsZSArIDI7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHRoaXMubWlkZGxlIDw9IHN0YXJ0ICYmIGVuZCA8PSB0aGlzLnRvO1xuXHR9XG5cblx0ZW1wdHkoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbSArIDMgPT09IHRoaXMubWlkZGxlICYmIHRoaXMubWlkZGxlICsgMiA9PT0gdGhpcy50byAtIDM7XG5cdH1cblxuXHRwYXJ0X2lzX2VtcHR5KGxlZnQ6IGJvb2xlYW4pIHtcblx0XHRyZXR1cm4gbGVmdCA/IHRoaXMuZnJvbSArIDMgPT09IHRoaXMubWlkZGxlIDogdGhpcy5taWRkbGUgKyAyID09PSB0aGlzLnRvIC0gMztcblx0fVxuXG5cdHBvc3Rwcm9jZXNzKFxuXHRcdHVud3JhcDogYm9vbGVhbiA9IHRydWUsXG5cdFx0cHJldmlld01vZGU6IFByZXZpZXdNb2RlID0gUHJldmlld01vZGUuQUxMLFxuXHRcdHRhZzoga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwID0gXCJkaXZcIixcblx0XHRsZWZ0OiBib29sZWFuIHwgbnVsbCA9IG51bGwsXG5cdFx0dGV4dD86IHN0cmluZyxcblx0KSB7XG5cdFx0bGV0IHN0ciA9IHRleHQgPz8gdGhpcy50ZXh0O1xuXHRcdGxldCBwYXJ0czogc3RyaW5nW10gPSBbc3RyXTtcblx0XHRpZiAoIXRleHQgJiYgdW53cmFwKSB7XG5cdFx0XHQvLyBSYW5nZSBpcyBsYXJnZXIgdGhhbiB3aGF0IGlzIGFjdHVhbGx5IGdpdmVuIChubyBlbmQgYnJhY2tldCBmb3VuZCB3aXRoaW4gdGV4dClcblx0XHRcdGlmICh0aGlzLnRvID49IHN0ci5sZW5ndGggJiYgIXN0ci5lbmRzV2l0aChDTV9BbGxfQnJhY2tldHNbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXVsyXSkpXG5cdFx0XHRcdHBhcnRzID0gdGhpcy51bndyYXBfcGFydHNfYnJhY2tldCh0cnVlKTtcblx0XHRcdGVsc2UgaWYgKHRoaXMuZnJvbSA8PSAwICYmICFzdHIuc3RhcnRzV2l0aChDTV9BbGxfQnJhY2tldHNbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXVswXSkpXG5cdFx0XHRcdHBhcnRzID0gdGhpcy51bndyYXBfcGFydHNfYnJhY2tldChmYWxzZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHBhcnRzID0gdGhpcy51bndyYXBfcGFydHMoKTtcblx0XHR9XG5cblx0XHRjb25zdCBjbHMgPSBcImNtdHItcHJldmlld1wiO1xuXHRcdGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcblx0XHRcdHBhcnRzWysobGVmdCBhcyBib29sZWFuKV0gPSBwYXJ0c1swXTtcblx0XHRcdHBhcnRzWyshbGVmdF0gPSBcIlwiO1xuXHRcdH1cblxuXHRcdHN0ciA9IFwiXCI7XG5cdFx0aWYgKHByZXZpZXdNb2RlID09PSBQcmV2aWV3TW9kZS5BTEwpIHtcblx0XHRcdGlmIChwYXJ0c1swXS5sZW5ndGgpXG5cdFx0XHRcdHN0ciArPSBgPCR7dGFnfSBjbGFzcz0nJHtjbHN9IGNtdHItZGVsZXRpb24nPiR7cGFydHNbMF19PC8ke3RhZ30+YDtcblx0XHRcdGlmIChwYXJ0c1sxXS5sZW5ndGgpXG5cdFx0XHRcdHN0ciArPSBgPCR7dGFnfSBjbGFzcz0nJHtjbHN9IGNtdHItYWRkaXRpb24nPiR7cGFydHNbMV19PC8ke3RhZ30+YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHByZXZpZXdNb2RlID09PSBQcmV2aWV3TW9kZS5BQ0NFUFQpIHtcblx0XHRcdFx0aWYgKHBhcnRzWzFdLmxlbmd0aClcblx0XHRcdFx0XHRzdHIgKz0gYDwke3RhZ30gY2xhc3M9JyR7Y2xzfSc+JHtwYXJ0c1sxXX08LyR7dGFnfT5gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKHBhcnRzWzBdLmxlbmd0aClcblx0XHRcdFx0XHRzdHIgKz0gYDwke3RhZ30gY2xhc3M9JyR7Y2xzfSc+JHtwYXJ0c1swXX08LyR7dGFnfT5gO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc3RyO1xuXHR9XG5cblx0YXBwbHlfb2Zmc2V0KG9mZnNldDogbnVtYmVyKSB7XG5cdFx0dGhpcy5mcm9tICs9IG9mZnNldDtcblx0XHR0aGlzLm1pZGRsZSArPSBvZmZzZXQ7XG5cdFx0dGhpcy50byArPSBvZmZzZXQ7XG5cdFx0aWYgKHRoaXMubWV0YWRhdGEgIT09IHVuZGVmaW5lZCkgdGhpcy5tZXRhZGF0YSArPSBvZmZzZXQ7XG5cdH1cblxuXHRzcGxpdF9yYW5nZShjdXJzb3I6IG51bWJlcik6IFtzdHJpbmcsIHN0cmluZ10ge1xuXHRcdGNvbnN0IHJhbmdlID0gc3VwZXIuc3BsaXRfcmFuZ2UoY3Vyc29yKTtcblx0XHRpZiAoY3Vyc29yIDw9IHRoaXMubWlkZGxlKVxuXHRcdFx0cmFuZ2VbMF0gPSBDTV9BbGxfQnJhY2tldHMuc3Vic3RpdHV0aW9uWzFdICsgcmFuZ2VbMF07XG5cdFx0ZWxzZVxuXHRcdFx0cmFuZ2VbMV0gPSByYW5nZVsxXSArIENNX0FsbF9CcmFja2V0cy5zdWJzdGl0dXRpb25bMV07XG5cdFx0cmV0dXJuIHJhbmdlO1xuXHR9XG5cblx0Y3Vyc29yX21vdmVfaW5zaWRlKGN1cnNvcjogbnVtYmVyLCBza2lwX21ldGFkYXRhID0gZmFsc2UpIHtcblx0XHRjdXJzb3IgPSBzdXBlci5jdXJzb3JfbW92ZV9pbnNpZGUoY3Vyc29yLCBza2lwX21ldGFkYXRhKTtcblx0XHRpZiAoY3Vyc29yID09IHRoaXMubWlkZGxlICsgMSlcblx0XHRcdGN1cnNvciA9IHRoaXMubWlkZGxlICsgMjtcblx0XHRyZXR1cm4gY3Vyc29yO1xuXHR9XG59XG4iLCAiLy8gVGhlc2UgYXJlIGZpbGxlZCB3aXRoIHJhbmdlcyAocmFuZ2VGcm9tW2ldIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nXG4vLyByYW5nZVRvW2ldKSBvZiBjb2RlIHBvaW50cyB0aGF0IGNvdW50IGFzIGV4dGVuZGluZyBjaGFyYWN0ZXJzLlxubGV0IHJhbmdlRnJvbSA9IFtdLCByYW5nZVRvID0gW11cblxuOygoKSA9PiB7XG4gIC8vIENvbXByZXNzZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIEdyYXBoZW1lX0NsdXN0ZXJfQnJlYWs9RXh0ZW5kXG4gIC8vIGluZm9ybWF0aW9uIGZyb21cbiAgLy8gaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvMTYuMC4wL3VjZC9hdXhpbGlhcnkvR3JhcGhlbWVCcmVha1Byb3BlcnR5LnR4dC5cbiAgLy8gRWFjaCBwYWlyIG9mIGVsZW1lbnRzIHJlcHJlc2VudHMgYSByYW5nZSwgYXMgYW4gb2ZmZXQgZnJvbSB0aGVcbiAgLy8gcHJldmlvdXMgcmFuZ2UgYW5kIGEgbGVuZ3RoLiBOdW1iZXJzIGFyZSBpbiBiYXNlLTM2LCB3aXRoIHRoZSBlbXB0eVxuICAvLyBzdHJpbmcgYmVpbmcgYSBzaG9ydGhhbmQgZm9yIDEuXG4gIGxldCBudW1iZXJzID0gXCJsYywzNCw3biw3LDdiLDE5LCwsLDIsLDIsLCwyMCxiLDFjLGwsZywsMnQsNywyLDYsMiwyLCw0LHosLHUsciwyaixiLDFtLDksOSwsbyw0LCw5LCwzLCw1LDE3LDMsM2IsZiwsdywxaiwsLCw0LDgsNCwsMyw3LGEsMix0LCwxbSwsLCwyLDQsOCwsOSwsYSwyLHEsLDIsMiwxbCwsNCwyLDQsMiwyLDMsMywsdSwyLDMsLGIsMiwxbCwsNCw1LCwyLDQsLGssMixtLDYsLCwxbSwsLDIsLDQsOCwsNywzLGEsMix1LCwxbiwsLCxjLCw5LCwxNCwsMywsMWwsMyw1LDMsLDQsNywyLGIsMix0LCwxbSwsMiwsMiwsMywsNSwyLDcsMixiLDIscywyLDFsLDIsLCwyLDQsOCwsOSwsYSwyLHQsLDIwLCw0LCwyLDMsLCw4LCwyOSwsMiw3LGMsOCwycSwsMiw5LGIsNiwyMiwyLHIsLCwsLCwxaixlLCw1LCwyLDUsYiwsMTAsOSwsMnUsNCwsNiwsMiwyLDIscCwyLDQsMyxnLDQsZCwsMiwyLDYsLGYsLGpqLDMscWEsMyx0LDMsdCwyLHUsMiwxcywyLCw3LDgsLDIsYiw5LCwxOSwzLDNiLDIseSwsM2EsMyw0LDIsOSwsNiwzLDYzLDIsMiwsMW0sLCw3LCwsLCwyLDgsNixhLDIsLDFjLGgsMXIsNCwxYyw3LCwsNSwsMTQsOSxjLDIsdyw0LDIsMiwsMywxaywsLDIsMywsLDMsMW0sOCwyLDIsNDgsMywsZCwsNyw0LCw2LCwzLDIsNWksMW0sLDUsZWssLDVmLHgsMmRhLDMsM3gsLDJvLHcsZmUsNiwyeCwyLG45dyw0LCxhLHcsMiwyOCwyLDdrLCwzLCw0LCxwLDIsNSwsNDcsMixxLGksZCwsMTIsOCxwLGIsMWEsMywxYywsMiw0LDIsMiwxMywsMXYsNiwyLDIsMiwyLGMsLDgsLDFiLCwxZiwsLDMsMiwyLDUsMiwsLDE2LDIsOCwsNm0sLDIsLDQsLGZuNCwsa2gsZyxnLGcsYTYsMixndCwsNmEsLDQ1LDUsMWFlLDMsLDIsNSw0LDE0LDMsNCwsNGwsMixmeCw0LGFyLDIsNDksYiw0dywsMWksZiwxaywzLDFkLDQsMiwyLDF4LDMsMTAsNSwsOCwxcSwsYywyLDFnLDksYSw0LDIsLDJuLDMsMiwsLDIsNiwsNGcsLDMsOCxsLDIsMWwsMiwsLCwsbSwsZSw3LDMsNSw1Ziw4LDIsMywsLG4sLDI5LCwyLDYsLCwyLCwsMiwsMiw2aiwsMiw0LDYsMiwsMixyLDIsMmQsOCwyLCwsMiwyeSwsLCwyLDYsLCwydCwzLDIsNCwsNSw3Nyw5LCwyLDZ0LCxhLDIsLCw0LCw0MCw0LDIsMiw0LCx3LGEsMTQsNiwyLDQsOCwsOSw2LDIsMywxYSxkLCwyLGJhLDcsLDYsLCwyYSxtLDIsNywsMiwsMiwzZSw2LDMsLCwyLCw3LCwsMjAsMiwzLCwsLDluLDIsZjBiLDUsMW4sNyx0NCwsMXIsNCwyOSwsZjVrLDIsNDNxLCwsMyw0LDUsOCw4LDIsNyx1LDQsNDQsMywxaXosMWosNCwxZSw4LCxlLCxtLDUsLGYsMTFzLDcsLGgsMiw3LCwyLCw1LDc5LDcsYzUsNCwxNXMsNywzMSw3LDI0MCw1LGd4N2ssMm8sM2ssNm9cIi5zcGxpdChcIixcIikubWFwKHMgPT4gcyA/IHBhcnNlSW50KHMsIDM2KSA6IDEpXG4gIGZvciAobGV0IGkgPSAwLCBuID0gMDsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspXG4gICAgKGkgJSAyID8gcmFuZ2VUbyA6IHJhbmdlRnJvbSkucHVzaChuID0gbiArIG51bWJlcnNbaV0pXG59KSgpXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0V4dGVuZGluZ0NoYXIoY29kZSkge1xuICBpZiAoY29kZSA8IDc2OCkgcmV0dXJuIGZhbHNlXG4gIGZvciAobGV0IGZyb20gPSAwLCB0byA9IHJhbmdlRnJvbS5sZW5ndGg7Oykge1xuICAgIGxldCBtaWQgPSAoZnJvbSArIHRvKSA+PiAxXG4gICAgaWYgKGNvZGUgPCByYW5nZUZyb21bbWlkXSkgdG8gPSBtaWRcbiAgICBlbHNlIGlmIChjb2RlID49IHJhbmdlVG9bbWlkXSkgZnJvbSA9IG1pZCArIDFcbiAgICBlbHNlIHJldHVybiB0cnVlXG4gICAgaWYgKGZyb20gPT0gdG8pIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzUmVnaW9uYWxJbmRpY2F0b3IoY29kZSkge1xuICByZXR1cm4gY29kZSA+PSAweDFGMUU2ICYmIGNvZGUgPD0gMHgxRjFGRlxufVxuXG5mdW5jdGlvbiBjaGVjayhjb2RlKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VGcm9tLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJhbmdlVG9baV0gPiBjb2RlKSByZXR1cm4gcmFuZ2VGcm9tW2ldIDw9IGNvZGVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgWldKID0gMHgyMDBkXG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ2x1c3RlckJyZWFrKHN0ciwgcG9zLCBmb3J3YXJkID0gdHJ1ZSwgaW5jbHVkZUV4dGVuZGluZyA9IHRydWUpIHtcbiAgcmV0dXJuIChmb3J3YXJkID8gbmV4dENsdXN0ZXJCcmVhayA6IHByZXZDbHVzdGVyQnJlYWspKHN0ciwgcG9zLCBpbmNsdWRlRXh0ZW5kaW5nKVxufVxuXG5mdW5jdGlvbiBuZXh0Q2x1c3RlckJyZWFrKHN0ciwgcG9zLCBpbmNsdWRlRXh0ZW5kaW5nKSB7XG4gIGlmIChwb3MgPT0gc3RyLmxlbmd0aCkgcmV0dXJuIHBvc1xuICAvLyBJZiBwb3MgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyLCBtb3ZlIHRvIGl0cyBzdGFydFxuICBpZiAocG9zICYmIHN1cnJvZ2F0ZUxvdyhzdHIuY2hhckNvZGVBdChwb3MpKSAmJiBzdXJyb2dhdGVIaWdoKHN0ci5jaGFyQ29kZUF0KHBvcyAtIDEpKSkgcG9zLS1cbiAgbGV0IHByZXYgPSBjb2RlUG9pbnRBdChzdHIsIHBvcylcbiAgcG9zICs9IGNvZGVQb2ludFNpemUocHJldilcbiAgd2hpbGUgKHBvcyA8IHN0ci5sZW5ndGgpIHtcbiAgICBsZXQgbmV4dCA9IGNvZGVQb2ludEF0KHN0ciwgcG9zKVxuICAgIGlmIChwcmV2ID09IFpXSiB8fCBuZXh0ID09IFpXSiB8fCBpbmNsdWRlRXh0ZW5kaW5nICYmIGlzRXh0ZW5kaW5nQ2hhcihuZXh0KSkge1xuICAgICAgcG9zICs9IGNvZGVQb2ludFNpemUobmV4dClcbiAgICAgIHByZXYgPSBuZXh0XG4gICAgfSBlbHNlIGlmIChpc1JlZ2lvbmFsSW5kaWNhdG9yKG5leHQpKSB7XG4gICAgICBsZXQgY291bnRCZWZvcmUgPSAwLCBpID0gcG9zIC0gMlxuICAgICAgd2hpbGUgKGkgPj0gMCAmJiBpc1JlZ2lvbmFsSW5kaWNhdG9yKGNvZGVQb2ludEF0KHN0ciwgaSkpKSB7IGNvdW50QmVmb3JlKys7IGkgLT0gMiB9XG4gICAgICBpZiAoY291bnRCZWZvcmUgJSAyID09IDApIGJyZWFrXG4gICAgICBlbHNlIHBvcyArPSAyXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiBwb3Ncbn1cblxuZnVuY3Rpb24gcHJldkNsdXN0ZXJCcmVhayhzdHIsIHBvcywgaW5jbHVkZUV4dGVuZGluZykge1xuICB3aGlsZSAocG9zID4gMCkge1xuICAgIGxldCBmb3VuZCA9IG5leHRDbHVzdGVyQnJlYWsoc3RyLCBwb3MgLSAyLCBpbmNsdWRlRXh0ZW5kaW5nKVxuICAgIGlmIChmb3VuZCA8IHBvcykgcmV0dXJuIGZvdW5kXG4gICAgcG9zLS1cbiAgfVxuICByZXR1cm4gMFxufVxuXG5mdW5jdGlvbiBjb2RlUG9pbnRBdChzdHIsIHBvcykge1xuICBsZXQgY29kZTAgPSBzdHIuY2hhckNvZGVBdChwb3MpXG4gIGlmICghc3Vycm9nYXRlSGlnaChjb2RlMCkgfHwgcG9zICsgMSA9PSBzdHIubGVuZ3RoKSByZXR1cm4gY29kZTBcbiAgbGV0IGNvZGUxID0gc3RyLmNoYXJDb2RlQXQocG9zICsgMSlcbiAgaWYgKCFzdXJyb2dhdGVMb3coY29kZTEpKSByZXR1cm4gY29kZTBcbiAgcmV0dXJuICgoY29kZTAgLSAweGQ4MDApIDw8IDEwKSArIChjb2RlMSAtIDB4ZGMwMCkgKyAweDEwMDAwXG59XG5cbmZ1bmN0aW9uIHN1cnJvZ2F0ZUxvdyhjaCkgeyByZXR1cm4gY2ggPj0gMHhEQzAwICYmIGNoIDwgMHhFMDAwIH1cbmZ1bmN0aW9uIHN1cnJvZ2F0ZUhpZ2goY2gpIHsgcmV0dXJuIGNoID49IDB4RDgwMCAmJiBjaCA8IDB4REMwMCB9XG5mdW5jdGlvbiBjb2RlUG9pbnRTaXplKGNvZGUpIHsgcmV0dXJuIGNvZGUgPCAweDEwMDAwID8gMSA6IDIgfVxuIiwgImltcG9ydCB7IGZpbmRDbHVzdGVyQnJlYWsgYXMgZmluZENsdXN0ZXJCcmVhayQxIH0gZnJvbSAnQG1hcmlqbi9maW5kLWNsdXN0ZXItYnJlYWsnO1xuXG4vKipcblRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgZG9jdW1lbnRzLiBAbm9uYWJzdHJhY3RcbiovXG5jbGFzcyBUZXh0IHtcbiAgICAvKipcbiAgICBHZXQgdGhlIGxpbmUgZGVzY3JpcHRpb24gYXJvdW5kIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGxpbmVBdChwb3MpIHtcbiAgICAgICAgaWYgKHBvcyA8IDAgfHwgcG9zID4gdGhpcy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBwb3NpdGlvbiAke3Bvc30gaW4gZG9jdW1lbnQgb2YgbGVuZ3RoICR7dGhpcy5sZW5ndGh9YCk7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVJbm5lcihwb3MsIGZhbHNlLCAxLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGdpdmVuICgxLWJhc2VkKSBsaW5lIG51bWJlci5cbiAgICAqL1xuICAgIGxpbmUobikge1xuICAgICAgICBpZiAobiA8IDEgfHwgbiA+IHRoaXMubGluZXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBsaW5lIG51bWJlciAke259IGluICR7dGhpcy5saW5lc30tbGluZSBkb2N1bWVudGApO1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lSW5uZXIobiwgdHJ1ZSwgMSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgYSByYW5nZSBvZiB0aGUgdGV4dCB3aXRoIHRoZSBnaXZlbiBjb250ZW50LlxuICAgICovXG4gICAgcmVwbGFjZShmcm9tLCB0bywgdGV4dCkge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgICAgICB0aGlzLmRlY29tcG9zZSgwLCBmcm9tLCBwYXJ0cywgMiAvKiBPcGVuLlRvICovKTtcbiAgICAgICAgaWYgKHRleHQubGVuZ3RoKVxuICAgICAgICAgICAgdGV4dC5kZWNvbXBvc2UoMCwgdGV4dC5sZW5ndGgsIHBhcnRzLCAxIC8qIE9wZW4uRnJvbSAqLyB8IDIgLyogT3Blbi5UbyAqLyk7XG4gICAgICAgIHRoaXMuZGVjb21wb3NlKHRvLCB0aGlzLmxlbmd0aCwgcGFydHMsIDEgLyogT3Blbi5Gcm9tICovKTtcbiAgICAgICAgcmV0dXJuIFRleHROb2RlLmZyb20ocGFydHMsIHRoaXMubGVuZ3RoIC0gKHRvIC0gZnJvbSkgKyB0ZXh0Lmxlbmd0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGVuZCBhbm90aGVyIGRvY3VtZW50IHRvIHRoaXMgb25lLlxuICAgICovXG4gICAgYXBwZW5kKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UodGhpcy5sZW5ndGgsIHRoaXMubGVuZ3RoLCBvdGhlcik7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlIHRoZSB0ZXh0IGJldHdlZW4gdGhlIGdpdmVuIHBvaW50cy5cbiAgICAqL1xuICAgIHNsaWNlKGZyb20sIHRvID0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBsZXQgcGFydHMgPSBbXTtcbiAgICAgICAgdGhpcy5kZWNvbXBvc2UoZnJvbSwgdG8sIHBhcnRzLCAwKTtcbiAgICAgICAgcmV0dXJuIFRleHROb2RlLmZyb20ocGFydHMsIHRvIC0gZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGlzIHRleHQgaXMgZXF1YWwgdG8gYW5vdGhlciBpbnN0YW5jZS5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciA9PSB0aGlzKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvdGhlci5sZW5ndGggIT0gdGhpcy5sZW5ndGggfHwgb3RoZXIubGluZXMgIT0gdGhpcy5saW5lcylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zY2FuSWRlbnRpY2FsKG90aGVyLCAxKSwgZW5kID0gdGhpcy5sZW5ndGggLSB0aGlzLnNjYW5JZGVudGljYWwob3RoZXIsIC0xKTtcbiAgICAgICAgbGV0IGEgPSBuZXcgUmF3VGV4dEN1cnNvcih0aGlzKSwgYiA9IG5ldyBSYXdUZXh0Q3Vyc29yKG90aGVyKTtcbiAgICAgICAgZm9yIChsZXQgc2tpcCA9IHN0YXJ0LCBwb3MgPSBzdGFydDs7KSB7XG4gICAgICAgICAgICBhLm5leHQoc2tpcCk7XG4gICAgICAgICAgICBiLm5leHQoc2tpcCk7XG4gICAgICAgICAgICBza2lwID0gMDtcbiAgICAgICAgICAgIGlmIChhLmxpbmVCcmVhayAhPSBiLmxpbmVCcmVhayB8fCBhLmRvbmUgIT0gYi5kb25lIHx8IGEudmFsdWUgIT0gYi52YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBwb3MgKz0gYS52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoYS5kb25lIHx8IHBvcyA+PSBlbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSB0ZXh0LiBXaGVuIGBkaXJgIGlzIGAtMWAsIGl0ZXJhdGlvbiBoYXBwZW5zXG4gICAgZnJvbSBlbmQgdG8gc3RhcnQuIFRoaXMgd2lsbCByZXR1cm4gbGluZXMgYW5kIHRoZSBicmVha3MgYmV0d2VlblxuICAgIHRoZW0gYXMgc2VwYXJhdGUgc3RyaW5ncy5cbiAgICAqL1xuICAgIGl0ZXIoZGlyID0gMSkgeyByZXR1cm4gbmV3IFJhd1RleHRDdXJzb3IodGhpcywgZGlyKTsgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciBhIHJhbmdlIG9mIHRoZSB0ZXh0LiBXaGVuIGBmcm9tYCA+IGB0b2AsIHRoZVxuICAgIGl0ZXJhdG9yIHdpbGwgcnVuIGluIHJldmVyc2UuXG4gICAgKi9cbiAgICBpdGVyUmFuZ2UoZnJvbSwgdG8gPSB0aGlzLmxlbmd0aCkgeyByZXR1cm4gbmV3IFBhcnRpYWxUZXh0Q3Vyc29yKHRoaXMsIGZyb20sIHRvKTsgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIGN1cnNvciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIGdpdmVuIHJhbmdlIG9mIGxpbmVzLFxuICAgIF93aXRob3V0XyByZXR1cm5pbmcgdGhlIGxpbmUgYnJlYWtzIGJldHdlZW4sIGFuZCB5aWVsZGluZyBlbXB0eVxuICAgIHN0cmluZ3MgZm9yIGVtcHR5IGxpbmVzLlxuICAgIFxuICAgIFdoZW4gYGZyb21gIGFuZCBgdG9gIGFyZSBnaXZlbiwgdGhleSBzaG91bGQgYmUgMS1iYXNlZCBsaW5lIG51bWJlcnMuXG4gICAgKi9cbiAgICBpdGVyTGluZXMoZnJvbSwgdG8pIHtcbiAgICAgICAgbGV0IGlubmVyO1xuICAgICAgICBpZiAoZnJvbSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpbm5lciA9IHRoaXMuaXRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICAgICAgdG8gPSB0aGlzLmxpbmVzICsgMTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMubGluZShmcm9tKS5mcm9tO1xuICAgICAgICAgICAgaW5uZXIgPSB0aGlzLml0ZXJSYW5nZShzdGFydCwgTWF0aC5tYXgoc3RhcnQsIHRvID09IHRoaXMubGluZXMgKyAxID8gdGhpcy5sZW5ndGggOiB0byA8PSAxID8gMCA6IHRoaXMubGluZSh0byAtIDEpLnRvKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lQ3Vyc29yKGlubmVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBkb2N1bWVudCBhcyBhIHN0cmluZywgdXNpbmcgbmV3bGluZSBjaGFyYWN0ZXJzIHRvXG4gICAgc2VwYXJhdGUgbGluZXMuXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMuc2xpY2VTdHJpbmcoMCk7IH1cbiAgICAvKipcbiAgICBDb252ZXJ0IHRoZSBkb2N1bWVudCB0byBhbiBhcnJheSBvZiBsaW5lcyAod2hpY2ggY2FuIGJlXG4gICAgZGVzZXJpYWxpemVkIGFnYWluIHZpYSBbYFRleHQub2ZgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHReb2YpKS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IGxpbmVzID0gW107XG4gICAgICAgIHRoaXMuZmxhdHRlbihsaW5lcyk7XG4gICAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGBUZXh0YCBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIGxpbmVzLlxuICAgICovXG4gICAgc3RhdGljIG9mKHRleHQpIHtcbiAgICAgICAgaWYgKHRleHQubGVuZ3RoID09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkEgZG9jdW1lbnQgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBsaW5lXCIpO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMSAmJiAhdGV4dFswXSlcbiAgICAgICAgICAgIHJldHVybiBUZXh0LmVtcHR5O1xuICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8gPyBuZXcgVGV4dExlYWYodGV4dCkgOiBUZXh0Tm9kZS5mcm9tKFRleHRMZWFmLnNwbGl0KHRleHQsIFtdKSk7XG4gICAgfVxufVxuLy8gTGVhdmVzIHN0b3JlIGFuIGFycmF5IG9mIGxpbmUgc3RyaW5ncy4gVGhlcmUgYXJlIGFsd2F5cyBsaW5lIGJyZWFrc1xuLy8gYmV0d2VlbiB0aGVzZSBzdHJpbmdzLiBMZWF2ZXMgYXJlIGxpbWl0ZWQgaW4gc2l6ZSBhbmQgaGF2ZSB0byBiZVxuLy8gY29udGFpbmVkIGluIFRleHROb2RlIGluc3RhbmNlcyBmb3IgYmlnZ2VyIGRvY3VtZW50cy5cbmNsYXNzIFRleHRMZWFmIGV4dGVuZHMgVGV4dCB7XG4gICAgY29uc3RydWN0b3IodGV4dCwgbGVuZ3RoID0gdGV4dExlbmd0aCh0ZXh0KSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICB9XG4gICAgZ2V0IGxpbmVzKCkgeyByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDsgfVxuICAgIGdldCBjaGlsZHJlbigpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBsaW5lSW5uZXIodGFyZ2V0LCBpc0xpbmUsIGxpbmUsIG9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0cmluZyA9IHRoaXMudGV4dFtpXSwgZW5kID0gb2Zmc2V0ICsgc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICgoaXNMaW5lID8gbGluZSA6IGVuZCkgPj0gdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGluZShvZmZzZXQsIGVuZCwgbGluZSwgc3RyaW5nKTtcbiAgICAgICAgICAgIG9mZnNldCA9IGVuZCArIDE7XG4gICAgICAgICAgICBsaW5lKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVjb21wb3NlKGZyb20sIHRvLCB0YXJnZXQsIG9wZW4pIHtcbiAgICAgICAgbGV0IHRleHQgPSBmcm9tIDw9IDAgJiYgdG8gPj0gdGhpcy5sZW5ndGggPyB0aGlzXG4gICAgICAgICAgICA6IG5ldyBUZXh0TGVhZihzbGljZVRleHQodGhpcy50ZXh0LCBmcm9tLCB0byksIE1hdGgubWluKHRvLCB0aGlzLmxlbmd0aCkgLSBNYXRoLm1heCgwLCBmcm9tKSk7XG4gICAgICAgIGlmIChvcGVuICYgMSAvKiBPcGVuLkZyb20gKi8pIHtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gdGFyZ2V0LnBvcCgpO1xuICAgICAgICAgICAgbGV0IGpvaW5lZCA9IGFwcGVuZFRleHQodGV4dC50ZXh0LCBwcmV2LnRleHQuc2xpY2UoKSwgMCwgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKGpvaW5lZC5sZW5ndGggPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8pIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChuZXcgVGV4dExlYWYoam9pbmVkLCBwcmV2Lmxlbmd0aCArIHRleHQubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbWlkID0gam9pbmVkLmxlbmd0aCA+PiAxO1xuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKG5ldyBUZXh0TGVhZihqb2luZWQuc2xpY2UoMCwgbWlkKSksIG5ldyBUZXh0TGVhZihqb2luZWQuc2xpY2UobWlkKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShmcm9tLCB0bywgdGV4dCkge1xuICAgICAgICBpZiAoISh0ZXh0IGluc3RhbmNlb2YgVGV4dExlYWYpKVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2UoZnJvbSwgdG8sIHRleHQpO1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCBsaW5lcyA9IGFwcGVuZFRleHQodGhpcy50ZXh0LCBhcHBlbmRUZXh0KHRleHQudGV4dCwgc2xpY2VUZXh0KHRoaXMudGV4dCwgMCwgZnJvbSkpLCB0byk7XG4gICAgICAgIGxldCBuZXdMZW4gPSB0aGlzLmxlbmd0aCArIHRleHQubGVuZ3RoIC0gKHRvIC0gZnJvbSk7XG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8pXG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRMZWFmKGxpbmVzLCBuZXdMZW4pO1xuICAgICAgICByZXR1cm4gVGV4dE5vZGUuZnJvbShUZXh0TGVhZi5zcGxpdChsaW5lcywgW10pLCBuZXdMZW4pO1xuICAgIH1cbiAgICBzbGljZVN0cmluZyhmcm9tLCB0byA9IHRoaXMubGVuZ3RoLCBsaW5lU2VwID0gXCJcXG5cIikge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDsgcG9zIDw9IHRvICYmIGkgPCB0aGlzLnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gdGhpcy50ZXh0W2ldLCBlbmQgPSBwb3MgKyBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tICYmIGkpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmVTZXA7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IGVuZCAmJiB0byA+IHBvcylcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gbGluZS5zbGljZShNYXRoLm1heCgwLCBmcm9tIC0gcG9zKSwgdG8gLSBwb3MpO1xuICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmbGF0dGVuKHRhcmdldCkge1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHRoaXMudGV4dClcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKGxpbmUpO1xuICAgIH1cbiAgICBzY2FuSWRlbnRpY2FsKCkgeyByZXR1cm4gMDsgfVxuICAgIHN0YXRpYyBzcGxpdCh0ZXh0LCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IHBhcnQgPSBbXSwgbGVuID0gLTE7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2YgdGV4dCkge1xuICAgICAgICAgICAgcGFydC5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgbGVuICs9IGxpbmUubGVuZ3RoICsgMTtcbiAgICAgICAgICAgIGlmIChwYXJ0Lmxlbmd0aCA9PSAzMiAvKiBUcmVlLkJyYW5jaCAqLykge1xuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKG5ldyBUZXh0TGVhZihwYXJ0LCBsZW4pKTtcbiAgICAgICAgICAgICAgICBwYXJ0ID0gW107XG4gICAgICAgICAgICAgICAgbGVuID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlbiA+IC0xKVxuICAgICAgICAgICAgdGFyZ2V0LnB1c2gobmV3IFRleHRMZWFmKHBhcnQsIGxlbikpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbn1cbi8vIE5vZGVzIHByb3ZpZGUgdGhlIHRyZWUgc3RydWN0dXJlIG9mIHRoZSBgVGV4dGAgdHlwZS4gVGhleSBzdG9yZSBhXG4vLyBudW1iZXIgb2Ygb3RoZXIgbm9kZXMgb3IgbGVhdmVzLCB0YWtpbmcgY2FyZSB0byBiYWxhbmNlIHRoZW1zZWx2ZXNcbi8vIG9uIGNoYW5nZXMuIFRoZXJlIGFyZSBpbXBsaWVkIGxpbmUgYnJlYWtzIF9iZXR3ZWVuXyB0aGUgY2hpbGRyZW4gb2Zcbi8vIGEgbm9kZSAoYnV0IG5vdCBiZWZvcmUgdGhlIGZpcnN0IG9yIGFmdGVyIHRoZSBsYXN0IGNoaWxkKS5cbmNsYXNzIFRleHROb2RlIGV4dGVuZHMgVGV4dCB7XG4gICAgY29uc3RydWN0b3IoY2hpbGRyZW4sIGxlbmd0aCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLmxpbmVzID0gMDtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICB0aGlzLmxpbmVzICs9IGNoaWxkLmxpbmVzO1xuICAgIH1cbiAgICBsaW5lSW5uZXIodGFyZ2V0LCBpc0xpbmUsIGxpbmUsIG9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2Zmc2V0ICsgY2hpbGQubGVuZ3RoLCBlbmRMaW5lID0gbGluZSArIGNoaWxkLmxpbmVzIC0gMTtcbiAgICAgICAgICAgIGlmICgoaXNMaW5lID8gZW5kTGluZSA6IGVuZCkgPj0gdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5saW5lSW5uZXIodGFyZ2V0LCBpc0xpbmUsIGxpbmUsIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQgKyAxO1xuICAgICAgICAgICAgbGluZSA9IGVuZExpbmUgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlY29tcG9zZShmcm9tLCB0bywgdGFyZ2V0LCBvcGVuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBwb3MgPD0gdG8gJiYgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChmcm9tIDw9IGVuZCAmJiB0byA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRPcGVuID0gb3BlbiAmICgocG9zIDw9IGZyb20gPyAxIC8qIE9wZW4uRnJvbSAqLyA6IDApIHwgKGVuZCA+PSB0byA/IDIgLyogT3Blbi5UbyAqLyA6IDApKTtcbiAgICAgICAgICAgICAgICBpZiAocG9zID49IGZyb20gJiYgZW5kIDw9IHRvICYmICFjaGlsZE9wZW4pXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmRlY29tcG9zZShmcm9tIC0gcG9zLCB0byAtIHBvcywgdGFyZ2V0LCBjaGlsZE9wZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKGZyb20sIHRvLCB0ZXh0KSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgaWYgKHRleHQubGluZXMgPCB0aGlzLmxpbmVzKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogaWYgdGhlIGNoYW5nZSBvbmx5IGFmZmVjdHMgb25lIGNoaWxkIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAvLyBjaGlsZCdzIHNpemUgcmVtYWlucyBpbiB0aGUgYWNjZXB0YWJsZSByYW5nZSwgb25seSB1cGRhdGVcbiAgICAgICAgICAgICAgICAvLyB0aGF0IGNoaWxkXG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPj0gcG9zICYmIHRvIDw9IGVuZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZCA9IGNoaWxkLnJlcGxhY2UoZnJvbSAtIHBvcywgdG8gLSBwb3MsIHRleHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWxMaW5lcyA9IHRoaXMubGluZXMgLSBjaGlsZC5saW5lcyArIHVwZGF0ZWQubGluZXM7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkLmxpbmVzIDwgKHRvdGFsTGluZXMgPj4gKDUgLyogVHJlZS5CcmFuY2hTaGlmdCAqLyAtIDEpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC5saW5lcyA+ICh0b3RhbExpbmVzID4+ICg1IC8qIFRyZWUuQnJhbmNoU2hpZnQgKi8gKyAxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3B5ID0gdGhpcy5jaGlsZHJlbi5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29weVtpXSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRleHROb2RlKGNvcHksIHRoaXMubGVuZ3RoIC0gKHRvIC0gZnJvbSkgKyB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcGxhY2UocG9zLCBlbmQsIHVwZGF0ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgPSBlbmQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShmcm9tLCB0bywgdGV4dCk7XG4gICAgfVxuICAgIHNsaWNlU3RyaW5nKGZyb20sIHRvID0gdGhpcy5sZW5ndGgsIGxpbmVTZXAgPSBcIlxcblwiKSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGggJiYgcG9zIDw9IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tICYmIGkpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmVTZXA7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IGVuZCAmJiB0byA+IHBvcylcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2hpbGQuc2xpY2VTdHJpbmcoZnJvbSAtIHBvcywgdG8gLSBwb3MsIGxpbmVTZXApO1xuICAgICAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmbGF0dGVuKHRhcmdldCkge1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgICAgICAgY2hpbGQuZmxhdHRlbih0YXJnZXQpO1xuICAgIH1cbiAgICBzY2FuSWRlbnRpY2FsKG90aGVyLCBkaXIpIHtcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBUZXh0Tm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgICAgIGxldCBbaUEsIGlCLCBlQSwgZUJdID0gZGlyID4gMCA/IFswLCAwLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgb3RoZXIuY2hpbGRyZW4ubGVuZ3RoXVxuICAgICAgICAgICAgOiBbdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxLCBvdGhlci5jaGlsZHJlbi5sZW5ndGggLSAxLCAtMSwgLTFdO1xuICAgICAgICBmb3IgKDs7IGlBICs9IGRpciwgaUIgKz0gZGlyKSB7XG4gICAgICAgICAgICBpZiAoaUEgPT0gZUEgfHwgaUIgPT0gZUIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgICAgICAgIGxldCBjaEEgPSB0aGlzLmNoaWxkcmVuW2lBXSwgY2hCID0gb3RoZXIuY2hpbGRyZW5baUJdO1xuICAgICAgICAgICAgaWYgKGNoQSAhPSBjaEIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aCArIGNoQS5zY2FuSWRlbnRpY2FsKGNoQiwgZGlyKTtcbiAgICAgICAgICAgIGxlbmd0aCArPSBjaEEubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZnJvbShjaGlsZHJlbiwgbGVuZ3RoID0gY2hpbGRyZW4ucmVkdWNlKChsLCBjaCkgPT4gbCArIGNoLmxlbmd0aCArIDEsIC0xKSkge1xuICAgICAgICBsZXQgbGluZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCBjaCBvZiBjaGlsZHJlbilcbiAgICAgICAgICAgIGxpbmVzICs9IGNoLmxpbmVzO1xuICAgICAgICBpZiAobGluZXMgPCAzMiAvKiBUcmVlLkJyYW5jaCAqLykge1xuICAgICAgICAgICAgbGV0IGZsYXQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNoIG9mIGNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGNoLmZsYXR0ZW4oZmxhdCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRMZWFmKGZsYXQsIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNodW5rID0gTWF0aC5tYXgoMzIgLyogVHJlZS5CcmFuY2ggKi8sIGxpbmVzID4+IDUgLyogVHJlZS5CcmFuY2hTaGlmdCAqLyksIG1heENodW5rID0gY2h1bmsgPDwgMSwgbWluQ2h1bmsgPSBjaHVuayA+PiAxO1xuICAgICAgICBsZXQgY2h1bmtlZCA9IFtdLCBjdXJyZW50TGluZXMgPSAwLCBjdXJyZW50TGVuID0gLTEsIGN1cnJlbnRDaHVuayA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGQoY2hpbGQpIHtcbiAgICAgICAgICAgIGxldCBsYXN0O1xuICAgICAgICAgICAgaWYgKGNoaWxkLmxpbmVzID4gbWF4Q2h1bmsgJiYgY2hpbGQgaW5zdGFuY2VvZiBUZXh0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG5vZGUgb2YgY2hpbGQuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgIGFkZChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLmxpbmVzID4gbWluQ2h1bmsgJiYgKGN1cnJlbnRMaW5lcyA+IG1pbkNodW5rIHx8ICFjdXJyZW50TGluZXMpKSB7XG4gICAgICAgICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgICAgICAgICBjaHVua2VkLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUZXh0TGVhZiAmJiBjdXJyZW50TGluZXMgJiZcbiAgICAgICAgICAgICAgICAobGFzdCA9IGN1cnJlbnRDaHVua1tjdXJyZW50Q2h1bmsubGVuZ3RoIC0gMV0pIGluc3RhbmNlb2YgVGV4dExlYWYgJiZcbiAgICAgICAgICAgICAgICBjaGlsZC5saW5lcyArIGxhc3QubGluZXMgPD0gMzIgLyogVHJlZS5CcmFuY2ggKi8pIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZXMgKz0gY2hpbGQubGluZXM7XG4gICAgICAgICAgICAgICAgY3VycmVudExlbiArPSBjaGlsZC5sZW5ndGggKyAxO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDaHVua1tjdXJyZW50Q2h1bmsubGVuZ3RoIC0gMV0gPSBuZXcgVGV4dExlYWYobGFzdC50ZXh0LmNvbmNhdChjaGlsZC50ZXh0KSwgbGFzdC5sZW5ndGggKyAxICsgY2hpbGQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGluZXMgKyBjaGlsZC5saW5lcyA+IGNodW5rKVxuICAgICAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lcyArPSBjaGlsZC5saW5lcztcbiAgICAgICAgICAgICAgICBjdXJyZW50TGVuICs9IGNoaWxkLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgY3VycmVudENodW5rLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lcyA9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNodW5rZWQucHVzaChjdXJyZW50Q2h1bmsubGVuZ3RoID09IDEgPyBjdXJyZW50Q2h1bmtbMF0gOiBUZXh0Tm9kZS5mcm9tKGN1cnJlbnRDaHVuaywgY3VycmVudExlbikpO1xuICAgICAgICAgICAgY3VycmVudExlbiA9IC0xO1xuICAgICAgICAgICAgY3VycmVudExpbmVzID0gY3VycmVudENodW5rLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICBhZGQoY2hpbGQpO1xuICAgICAgICBmbHVzaCgpO1xuICAgICAgICByZXR1cm4gY2h1bmtlZC5sZW5ndGggPT0gMSA/IGNodW5rZWRbMF0gOiBuZXcgVGV4dE5vZGUoY2h1bmtlZCwgbGVuZ3RoKTtcbiAgICB9XG59XG5UZXh0LmVtcHR5ID0gLypAX19QVVJFX18qL25ldyBUZXh0TGVhZihbXCJcIl0sIDApO1xuZnVuY3Rpb24gdGV4dExlbmd0aCh0ZXh0KSB7XG4gICAgbGV0IGxlbmd0aCA9IC0xO1xuICAgIGZvciAobGV0IGxpbmUgb2YgdGV4dClcbiAgICAgICAgbGVuZ3RoICs9IGxpbmUubGVuZ3RoICsgMTtcbiAgICByZXR1cm4gbGVuZ3RoO1xufVxuZnVuY3Rpb24gYXBwZW5kVGV4dCh0ZXh0LCB0YXJnZXQsIGZyb20gPSAwLCB0byA9IDFlOSkge1xuICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwLCBmaXJzdCA9IHRydWU7IGkgPCB0ZXh0Lmxlbmd0aCAmJiBwb3MgPD0gdG87IGkrKykge1xuICAgICAgICBsZXQgbGluZSA9IHRleHRbaV0sIGVuZCA9IHBvcyArIGxpbmUubGVuZ3RoO1xuICAgICAgICBpZiAoZW5kID49IGZyb20pIHtcbiAgICAgICAgICAgIGlmIChlbmQgPiB0bylcbiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zbGljZSgwLCB0byAtIHBvcyk7XG4gICAgICAgICAgICBpZiAocG9zIDwgZnJvbSlcbiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zbGljZShmcm9tIC0gcG9zKTtcbiAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgIHRhcmdldFt0YXJnZXQubGVuZ3RoIC0gMV0gKz0gbGluZTtcbiAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIHBvcyA9IGVuZCArIDE7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiBzbGljZVRleHQodGV4dCwgZnJvbSwgdG8pIHtcbiAgICByZXR1cm4gYXBwZW5kVGV4dCh0ZXh0LCBbXCJcIl0sIGZyb20sIHRvKTtcbn1cbmNsYXNzIFJhd1RleHRDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKHRleHQsIGRpciA9IDEpIHtcbiAgICAgICAgdGhpcy5kaXIgPSBkaXI7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxpbmVCcmVhayA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgdGhpcy5ub2RlcyA9IFt0ZXh0XTtcbiAgICAgICAgdGhpcy5vZmZzZXRzID0gW2RpciA+IDAgPyAxIDogKHRleHQgaW5zdGFuY2VvZiBUZXh0TGVhZiA/IHRleHQudGV4dC5sZW5ndGggOiB0ZXh0LmNoaWxkcmVuLmxlbmd0aCkgPDwgMV07XG4gICAgfVxuICAgIG5leHRJbm5lcihza2lwLCBkaXIpIHtcbiAgICAgICAgdGhpcy5kb25lID0gdGhpcy5saW5lQnJlYWsgPSBmYWxzZTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGxhc3QgPSB0aGlzLm5vZGVzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBsZXQgdG9wID0gdGhpcy5ub2Rlc1tsYXN0XSwgb2Zmc2V0VmFsdWUgPSB0aGlzLm9mZnNldHNbbGFzdF0sIG9mZnNldCA9IG9mZnNldFZhbHVlID4+IDE7XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHRvcCBpbnN0YW5jZW9mIFRleHRMZWFmID8gdG9wLnRleHQubGVuZ3RoIDogdG9wLmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gKGRpciA+IDAgPyBzaXplIDogMCkpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRpciA+IDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0IC0gMV0rKztcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0cy5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChvZmZzZXRWYWx1ZSAmIDEpID09IChkaXIgPiAwID8gMCA6IDEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdICs9IGRpcjtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUJyZWFrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXFxuXCI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBza2lwLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0b3AgaW5zdGFuY2VvZiBUZXh0TGVhZikge1xuICAgICAgICAgICAgICAgIC8vIE1vdmUgdG8gdGhlIG5leHQgc3RyaW5nXG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0b3AudGV4dFtvZmZzZXQgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tsYXN0XSArPSBkaXI7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQubGVuZ3RoID4gTWF0aC5tYXgoMCwgc2tpcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHNraXAgPT0gMCA/IG5leHQgOiBkaXIgPiAwID8gbmV4dC5zbGljZShza2lwKSA6IG5leHQuc2xpY2UoMCwgbmV4dC5sZW5ndGggLSBza2lwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNraXAgLT0gbmV4dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRvcC5jaGlsZHJlbltvZmZzZXQgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgICAgIGlmIChza2lwID4gbmV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2tpcCAtPSBuZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdICs9IGRpcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdLS07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzLnB1c2goZGlyID4gMCA/IDEgOiAobmV4dCBpbnN0YW5jZW9mIFRleHRMZWFmID8gbmV4dC50ZXh0Lmxlbmd0aCA6IG5leHQuY2hpbGRyZW4ubGVuZ3RoKSA8PCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dChza2lwID0gMCkge1xuICAgICAgICBpZiAoc2tpcCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMubmV4dElubmVyKC1za2lwLCAoLXRoaXMuZGlyKSk7XG4gICAgICAgICAgICBza2lwID0gdGhpcy52YWx1ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dElubmVyKHNraXAsIHRoaXMuZGlyKTtcbiAgICB9XG59XG5jbGFzcyBQYXJ0aWFsVGV4dEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IodGV4dCwgc3RhcnQsIGVuZCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gbmV3IFJhd1RleHRDdXJzb3IodGV4dCwgc3RhcnQgPiBlbmQgPyAtMSA6IDEpO1xuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0ID4gZW5kID8gdGV4dC5sZW5ndGggOiAwO1xuICAgICAgICB0aGlzLmZyb20gPSBNYXRoLm1pbihzdGFydCwgZW5kKTtcbiAgICAgICAgdGhpcy50byA9IE1hdGgubWF4KHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgICBuZXh0SW5uZXIoc2tpcCwgZGlyKSB7XG4gICAgICAgIGlmIChkaXIgPCAwID8gdGhpcy5wb3MgPD0gdGhpcy5mcm9tIDogdGhpcy5wb3MgPj0gdGhpcy50bykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgc2tpcCArPSBNYXRoLm1heCgwLCBkaXIgPCAwID8gdGhpcy5wb3MgLSB0aGlzLnRvIDogdGhpcy5mcm9tIC0gdGhpcy5wb3MpO1xuICAgICAgICBsZXQgbGltaXQgPSBkaXIgPCAwID8gdGhpcy5wb3MgLSB0aGlzLmZyb20gOiB0aGlzLnRvIC0gdGhpcy5wb3M7XG4gICAgICAgIGlmIChza2lwID4gbGltaXQpXG4gICAgICAgICAgICBza2lwID0gbGltaXQ7XG4gICAgICAgIGxpbWl0IC09IHNraXA7XG4gICAgICAgIGxldCB7IHZhbHVlIH0gPSB0aGlzLmN1cnNvci5uZXh0KHNraXApO1xuICAgICAgICB0aGlzLnBvcyArPSAodmFsdWUubGVuZ3RoICsgc2tpcCkgKiBkaXI7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZS5sZW5ndGggPD0gbGltaXQgPyB2YWx1ZSA6IGRpciA8IDAgPyB2YWx1ZS5zbGljZSh2YWx1ZS5sZW5ndGggLSBsaW1pdCkgOiB2YWx1ZS5zbGljZSgwLCBsaW1pdCk7XG4gICAgICAgIHRoaXMuZG9uZSA9ICF0aGlzLnZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgbmV4dChza2lwID0gMCkge1xuICAgICAgICBpZiAoc2tpcCA8IDApXG4gICAgICAgICAgICBza2lwID0gTWF0aC5tYXgoc2tpcCwgdGhpcy5mcm9tIC0gdGhpcy5wb3MpO1xuICAgICAgICBlbHNlIGlmIChza2lwID4gMClcbiAgICAgICAgICAgIHNraXAgPSBNYXRoLm1pbihza2lwLCB0aGlzLnRvIC0gdGhpcy5wb3MpO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0SW5uZXIoc2tpcCwgdGhpcy5jdXJzb3IuZGlyKTtcbiAgICB9XG4gICAgZ2V0IGxpbmVCcmVhaygpIHsgcmV0dXJuIHRoaXMuY3Vyc29yLmxpbmVCcmVhayAmJiB0aGlzLnZhbHVlICE9IFwiXCI7IH1cbn1cbmNsYXNzIExpbmVDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGlubmVyKSB7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBpbm5lcjtcbiAgICAgICAgdGhpcy5hZnRlckJyZWFrID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgIH1cbiAgICBuZXh0KHNraXAgPSAwKSB7XG4gICAgICAgIGxldCB7IGRvbmUsIGxpbmVCcmVhaywgdmFsdWUgfSA9IHRoaXMuaW5uZXIubmV4dChza2lwKTtcbiAgICAgICAgaWYgKGRvbmUgJiYgdGhpcy5hZnRlckJyZWFrKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJCcmVhayA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsaW5lQnJlYWspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFmdGVyQnJlYWspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJCcmVhayA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmFmdGVyQnJlYWsgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZ2V0IGxpbmVCcmVhaygpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5pZiAodHlwZW9mIFN5bWJvbCAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgVGV4dC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuaXRlcigpOyB9O1xuICAgIFJhd1RleHRDdXJzb3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBQYXJ0aWFsVGV4dEN1cnNvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9XG4gICAgICAgIExpbmVDdXJzb3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xufVxuLyoqXG5UaGlzIHR5cGUgZGVzY3JpYmVzIGEgbGluZSBpbiB0aGUgZG9jdW1lbnQuIEl0IGlzIGNyZWF0ZWRcbm9uLWRlbWFuZCB3aGVuIGxpbmVzIGFyZSBbcXVlcmllZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UZXh0LmxpbmVBdCkuXG4qL1xuY2xhc3MgTGluZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgKF9iZWZvcmVfIHRoZSBsaW5lIGJyZWFrLFxuICAgIG9yIGF0IHRoZSBlbmQgb2YgZG9jdW1lbnQgZm9yIHRoZSBsYXN0IGxpbmUpLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoaXMgbGluZSdzIGxpbmUgbnVtYmVyICgxLWJhc2VkKS5cbiAgICAqL1xuICAgIG51bWJlciwgXG4gICAgLyoqXG4gICAgVGhlIGxpbmUncyBjb250ZW50LlxuICAgICovXG4gICAgdGV4dCkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyO1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBsaW5lIChub3QgaW5jbHVkaW5nIGFueSBsaW5lIGJyZWFrIGFmdGVyIGl0KS5cbiAgICAqL1xuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnRvIC0gdGhpcy5mcm9tOyB9XG59XG5mdW5jdGlvbiBjbGlwKHRleHQsIGZyb20sIHRvKSB7XG4gICAgZnJvbSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRleHQubGVuZ3RoLCBmcm9tKSk7XG4gICAgcmV0dXJuIFtmcm9tLCBNYXRoLm1heChmcm9tLCBNYXRoLm1pbih0ZXh0Lmxlbmd0aCwgdG8pKV07XG59XG5cbi8qKlxuUmV0dXJucyBhIG5leHQgZ3JhcGhlbWUgY2x1c3RlciBicmVhayBfYWZ0ZXJfIChub3QgZXF1YWwgdG8pXG5gcG9zYCwgaWYgYGZvcndhcmRgIGlzIHRydWUsIG9yIGJlZm9yZSBvdGhlcndpc2UuIFJldHVybnMgYHBvc2Bcbml0c2VsZiBpZiBubyBmdXJ0aGVyIGNsdXN0ZXIgYnJlYWsgaXMgYXZhaWxhYmxlIGluIHRoZSBzdHJpbmcuXG5Nb3ZlcyBhY3Jvc3Mgc3Vycm9nYXRlIHBhaXJzLCBleHRlbmRpbmcgY2hhcmFjdGVycyAod2hlblxuYGluY2x1ZGVFeHRlbmRpbmdgIGlzIHRydWUpLCBjaGFyYWN0ZXJzIGpvaW5lZCB3aXRoIHplcm8td2lkdGhcbmpvaW5lcnMsIGFuZCBmbGFnIGVtb2ppLlxuKi9cbmZ1bmN0aW9uIGZpbmRDbHVzdGVyQnJlYWsoc3RyLCBwb3MsIGZvcndhcmQgPSB0cnVlLCBpbmNsdWRlRXh0ZW5kaW5nID0gdHJ1ZSkge1xuICAgIHJldHVybiBmaW5kQ2x1c3RlckJyZWFrJDEoc3RyLCBwb3MsIGZvcndhcmQsIGluY2x1ZGVFeHRlbmRpbmcpO1xufVxuZnVuY3Rpb24gc3Vycm9nYXRlTG93KGNoKSB7IHJldHVybiBjaCA+PSAweERDMDAgJiYgY2ggPCAweEUwMDA7IH1cbmZ1bmN0aW9uIHN1cnJvZ2F0ZUhpZ2goY2gpIHsgcmV0dXJuIGNoID49IDB4RDgwMCAmJiBjaCA8IDB4REMwMDsgfVxuLyoqXG5GaW5kIHRoZSBjb2RlIHBvaW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBhIHN0cmluZyAobGlrZSB0aGVcbltgY29kZVBvaW50QXRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvY29kZVBvaW50QXQpXG5zdHJpbmcgbWV0aG9kKS5cbiovXG5mdW5jdGlvbiBjb2RlUG9pbnRBdChzdHIsIHBvcykge1xuICAgIGxldCBjb2RlMCA9IHN0ci5jaGFyQ29kZUF0KHBvcyk7XG4gICAgaWYgKCFzdXJyb2dhdGVIaWdoKGNvZGUwKSB8fCBwb3MgKyAxID09IHN0ci5sZW5ndGgpXG4gICAgICAgIHJldHVybiBjb2RlMDtcbiAgICBsZXQgY29kZTEgPSBzdHIuY2hhckNvZGVBdChwb3MgKyAxKTtcbiAgICBpZiAoIXN1cnJvZ2F0ZUxvdyhjb2RlMSkpXG4gICAgICAgIHJldHVybiBjb2RlMDtcbiAgICByZXR1cm4gKChjb2RlMCAtIDB4ZDgwMCkgPDwgMTApICsgKGNvZGUxIC0gMHhkYzAwKSArIDB4MTAwMDA7XG59XG4vKipcbkdpdmVuIGEgVW5pY29kZSBjb2RlcG9pbnQsIHJldHVybiB0aGUgSmF2YVNjcmlwdCBzdHJpbmcgdGhhdFxucmVzcHJlc2VudHMgaXQgKGxpa2VcbltgU3RyaW5nLmZyb21Db2RlUG9pbnRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvZnJvbUNvZGVQb2ludCkpLlxuKi9cbmZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoY29kZSkge1xuICAgIGlmIChjb2RlIDw9IDB4ZmZmZilcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7XG4gICAgY29kZSAtPSAweDEwMDAwO1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlID4+IDEwKSArIDB4ZDgwMCwgKGNvZGUgJiAxMDIzKSArIDB4ZGMwMCk7XG59XG4vKipcblRoZSBhbW91bnQgb2YgcG9zaXRpb25zIGEgY2hhcmFjdGVyIHRha2VzIHVwIGluIGEgSmF2YVNjcmlwdCBzdHJpbmcuXG4qL1xuZnVuY3Rpb24gY29kZVBvaW50U2l6ZShjb2RlKSB7IHJldHVybiBjb2RlIDwgMHgxMDAwMCA/IDEgOiAyOyB9XG5cbmNvbnN0IERlZmF1bHRTcGxpdCA9IC9cXHJcXG4/fFxcbi87XG4vKipcbkRpc3Rpbmd1aXNoZXMgZGlmZmVyZW50IHdheXMgaW4gd2hpY2ggcG9zaXRpb25zIGNhbiBiZSBtYXBwZWQuXG4qL1xudmFyIE1hcE1vZGUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChNYXBNb2RlKSB7XG4gICAgLyoqXG4gICAgTWFwIGEgcG9zaXRpb24gdG8gYSB2YWxpZCBuZXcgcG9zaXRpb24sIGV2ZW4gd2hlbiBpdHMgY29udGV4dFxuICAgIHdhcyBkZWxldGVkLlxuICAgICovXG4gICAgTWFwTW9kZVtNYXBNb2RlW1wiU2ltcGxlXCJdID0gMF0gPSBcIlNpbXBsZVwiO1xuICAgIC8qKlxuICAgIFJldHVybiBudWxsIGlmIGRlbGV0aW9uIGhhcHBlbnMgYWNyb3NzIHRoZSBwb3NpdGlvbi5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlRyYWNrRGVsXCJdID0gMV0gPSBcIlRyYWNrRGVsXCI7XG4gICAgLyoqXG4gICAgUmV0dXJuIG51bGwgaWYgdGhlIGNoYXJhY3RlciBfYmVmb3JlXyB0aGUgcG9zaXRpb24gaXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlRyYWNrQmVmb3JlXCJdID0gMl0gPSBcIlRyYWNrQmVmb3JlXCI7XG4gICAgLyoqXG4gICAgUmV0dXJuIG51bGwgaWYgdGhlIGNoYXJhY3RlciBfYWZ0ZXJfIHRoZSBwb3NpdGlvbiBpcyBkZWxldGVkLlxuICAgICovXG4gICAgTWFwTW9kZVtNYXBNb2RlW1wiVHJhY2tBZnRlclwiXSA9IDNdID0gXCJUcmFja0FmdGVyXCI7XG5yZXR1cm4gTWFwTW9kZX0pKE1hcE1vZGUgfHwgKE1hcE1vZGUgPSB7fSkpO1xuLyoqXG5BIGNoYW5nZSBkZXNjcmlwdGlvbiBpcyBhIHZhcmlhbnQgb2YgW2NoYW5nZSBzZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0KVxudGhhdCBkb2Vzbid0IHN0b3JlIHRoZSBpbnNlcnRlZCB0ZXh0LiBBcyBzdWNoLCBpdCBjYW4ndCBiZVxuYXBwbGllZCwgYnV0IGlzIGNoZWFwZXIgdG8gc3RvcmUgYW5kIG1hbmlwdWxhdGUuXG4qL1xuY2xhc3MgQ2hhbmdlRGVzYyB7XG4gICAgLy8gU2VjdGlvbnMgYXJlIGVuY29kZWQgYXMgcGFpcnMgb2YgaW50ZWdlcnMuIFRoZSBmaXJzdCBpcyB0aGVcbiAgICAvLyBsZW5ndGggaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQsIGFuZCB0aGUgc2Vjb25kIGlzIC0xIGZvclxuICAgIC8vIHVuYWZmZWN0ZWQgc2VjdGlvbnMsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSByZXBsYWNlbWVudCBjb250ZW50XG4gICAgLy8gb3RoZXJ3aXNlLiBTbyBhbiBpbnNlcnRpb24gd291bGQgYmUgKDAsIG4+MCksIGEgZGVsZXRpb24gKG4+MCxcbiAgICAvLyAwKSwgYW5kIGEgcmVwbGFjZW1lbnQgdHdvIHBvc2l0aXZlIG51bWJlcnMuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNlY3Rpb25zKSB7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBzZWN0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuc2VjdGlvbnNbaV07XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IGFmdGVyIHRoZSBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgbmV3TGVuZ3RoKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBsZXQgaW5zID0gdGhpcy5zZWN0aW9uc1tpICsgMV07XG4gICAgICAgICAgICByZXN1bHQgKz0gaW5zIDwgMCA/IHRoaXMuc2VjdGlvbnNbaV0gOiBpbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRmFsc2Ugd2hlbiB0aGVyZSBhcmUgYWN0dWFsIGNoYW5nZXMgaW4gdGhpcyBzZXQuXG4gICAgKi9cbiAgICBnZXQgZW1wdHkoKSB7IHJldHVybiB0aGlzLnNlY3Rpb25zLmxlbmd0aCA9PSAwIHx8IHRoaXMuc2VjdGlvbnMubGVuZ3RoID09IDIgJiYgdGhpcy5zZWN0aW9uc1sxXSA8IDA7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHVuY2hhbmdlZCBwYXJ0cyBsZWZ0IGJ5IHRoZXNlIGNoYW5nZXMuIGBwb3NBYFxuICAgIHByb3ZpZGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmFuZ2UgaW4gdGhlIG9sZCBkb2N1bWVudCwgYHBvc0JgXG4gICAgdGhlIG5ldyBwb3NpdGlvbiBpbiB0aGUgY2hhbmdlZCBkb2N1bWVudC5cbiAgICAqL1xuICAgIGl0ZXJHYXBzKGYpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvc0EgPSAwLCBwb3NCID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApIHtcbiAgICAgICAgICAgICAgICBmKHBvc0EsIHBvc0IsIGxlbik7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwb3NCICs9IGlucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvc0EgKz0gbGVuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgcmFuZ2VzIGNoYW5nZWQgYnkgdGhlc2UgY2hhbmdlcy4gKFNlZVxuICAgIFtgQ2hhbmdlU2V0Lml0ZXJDaGFuZ2VzYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VTZXQuaXRlckNoYW5nZXMpIGZvciBhXG4gICAgdmFyaWFudCB0aGF0IGFsc28gcHJvdmlkZXMgeW91IHdpdGggdGhlIGluc2VydGVkIHRleHQuKVxuICAgIGBmcm9tQWAvYHRvQWAgcHJvdmlkZXMgdGhlIGV4dGVudCBvZiB0aGUgY2hhbmdlIGluIHRoZSBzdGFydGluZ1xuICAgIGRvY3VtZW50LCBgZnJvbUJgL2B0b0JgIHRoZSBleHRlbnQgb2YgdGhlIHJlcGxhY2VtZW50IGluIHRoZVxuICAgIGNoYW5nZWQgZG9jdW1lbnQuXG4gICAgXG4gICAgV2hlbiBgaW5kaXZpZHVhbGAgaXMgdHJ1ZSwgYWRqYWNlbnQgY2hhbmdlcyAod2hpY2ggYXJlIGtlcHRcbiAgICBzZXBhcmF0ZSBmb3IgW3Bvc2l0aW9uIG1hcHBpbmddKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlRGVzYy5tYXBQb3MpKSBhcmVcbiAgICByZXBvcnRlZCBzZXBhcmF0ZWx5LlxuICAgICovXG4gICAgaXRlckNoYW5nZWRSYW5nZXMoZiwgaW5kaXZpZHVhbCA9IGZhbHNlKSB7XG4gICAgICAgIGl0ZXJDaGFuZ2VzKHRoaXMsIGYsIGluZGl2aWR1YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaW52ZXJ0ZWQgZm9ybSBvZiB0aGVzZSBjaGFuZ2VzLlxuICAgICovXG4gICAgZ2V0IGludmVydGVkRGVzYygpIHtcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK107XG4gICAgICAgICAgICBpZiAoaW5zIDwgMClcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKGxlbiwgaW5zKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKGlucywgbGVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENoYW5nZURlc2Moc2VjdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wdXRlIHRoZSBjb21iaW5lZCBlZmZlY3Qgb2YgYXBwbHlpbmcgYW5vdGhlciBzZXQgb2YgY2hhbmdlc1xuICAgIGFmdGVyIHRoaXMgb25lLiBUaGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCBhZnRlciB0aGlzIHNldCBzaG91bGRcbiAgICBtYXRjaCB0aGUgbGVuZ3RoIGJlZm9yZSBgb3RoZXJgLlxuICAgICovXG4gICAgY29tcG9zZURlc2Mob3RoZXIpIHsgcmV0dXJuIHRoaXMuZW1wdHkgPyBvdGhlciA6IG90aGVyLmVtcHR5ID8gdGhpcyA6IGNvbXBvc2VTZXRzKHRoaXMsIG90aGVyKTsgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIGRlc2NyaXB0aW9uLCB3aGljaCBzaG91bGQgc3RhcnQgd2l0aCB0aGUgc2FtZSBkb2N1bWVudFxuICAgIGFzIGBvdGhlcmAsIG92ZXIgYW5vdGhlciBzZXQgb2YgY2hhbmdlcywgc28gdGhhdCBpdCBjYW4gYmVcbiAgICBhcHBsaWVkIGFmdGVyIGl0LiBXaGVuIGBiZWZvcmVgIGlzIHRydWUsIG1hcCBhcyBpZiB0aGUgY2hhbmdlc1xuICAgIGluIGB0aGlzYCBoYXBwZW5lZCBiZWZvcmUgdGhlIG9uZXMgaW4gYG90aGVyYC5cbiAgICAqL1xuICAgIG1hcERlc2Mob3RoZXIsIGJlZm9yZSA9IGZhbHNlKSB7IHJldHVybiBvdGhlci5lbXB0eSA/IHRoaXMgOiBtYXBTZXQodGhpcywgb3RoZXIsIGJlZm9yZSk7IH1cbiAgICBtYXBQb3MocG9zLCBhc3NvYyA9IC0xLCBtb2RlID0gTWFwTW9kZS5TaW1wbGUpIHtcbiAgICAgICAgbGV0IHBvc0EgPSAwLCBwb3NCID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDspIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnNlY3Rpb25zW2krK10sIGlucyA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgZW5kQSA9IHBvc0EgKyBsZW47XG4gICAgICAgICAgICBpZiAoaW5zIDwgMCkge1xuICAgICAgICAgICAgICAgIGlmIChlbmRBID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zQiArIChwb3MgLSBwb3NBKTtcbiAgICAgICAgICAgICAgICBwb3NCICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlICE9IE1hcE1vZGUuU2ltcGxlICYmIGVuZEEgPj0gcG9zICYmXG4gICAgICAgICAgICAgICAgICAgIChtb2RlID09IE1hcE1vZGUuVHJhY2tEZWwgJiYgcG9zQSA8IHBvcyAmJiBlbmRBID4gcG9zIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID09IE1hcE1vZGUuVHJhY2tCZWZvcmUgJiYgcG9zQSA8IHBvcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PSBNYXBNb2RlLlRyYWNrQWZ0ZXIgJiYgZW5kQSA+IHBvcykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChlbmRBID4gcG9zIHx8IGVuZEEgPT0gcG9zICYmIGFzc29jIDwgMCAmJiAhbGVuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zID09IHBvc0EgfHwgYXNzb2MgPCAwID8gcG9zQiA6IHBvc0IgKyBpbnM7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBpbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3NBID0gZW5kQTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zID4gcG9zQSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBQb3NpdGlvbiAke3Bvc30gaXMgb3V0IG9mIHJhbmdlIGZvciBjaGFuZ2VzZXQgb2YgbGVuZ3RoICR7cG9zQX1gKTtcbiAgICAgICAgcmV0dXJuIHBvc0I7XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIHdoZXRoZXIgdGhlc2UgY2hhbmdlcyB0b3VjaCBhIGdpdmVuIHJhbmdlLiBXaGVuIG9uZSBvZiB0aGVcbiAgICBjaGFuZ2VzIGVudGlyZWx5IGNvdmVycyB0aGUgcmFuZ2UsIHRoZSBzdHJpbmcgYFwiY292ZXJcImAgaXNcbiAgICByZXR1cm5lZC5cbiAgICAqL1xuICAgIHRvdWNoZXNSYW5nZShmcm9tLCB0byA9IGZyb20pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aCAmJiBwb3MgPD0gdG87KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK10sIGVuZCA9IHBvcyArIGxlbjtcbiAgICAgICAgICAgIGlmIChpbnMgPj0gMCAmJiBwb3MgPD0gdG8gJiYgZW5kID49IGZyb20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcyA8IGZyb20gJiYgZW5kID4gdG8gPyBcImNvdmVyXCIgOiB0cnVlO1xuICAgICAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK107XG4gICAgICAgICAgICByZXN1bHQgKz0gKHJlc3VsdCA/IFwiIFwiIDogXCJcIikgKyBsZW4gKyAoaW5zID49IDAgPyBcIjpcIiArIGlucyA6IFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGlzIGNoYW5nZSBkZXNjIHRvIGEgSlNPTi1yZXByZXNlbnRhYmxlIHZhbHVlLlxuICAgICovXG4gICAgdG9KU09OKCkgeyByZXR1cm4gdGhpcy5zZWN0aW9uczsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNoYW5nZSBkZXNjIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24gKGFzIHByb2R1Y2VkXG4gICAgYnkgW2B0b0pTT05gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZURlc2MudG9KU09OKS5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uKSB8fCBqc29uLmxlbmd0aCAlIDIgfHwganNvbi5zb21lKGEgPT4gdHlwZW9mIGEgIT0gXCJudW1iZXJcIikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBDaGFuZ2VEZXNjXCIpO1xuICAgICAgICByZXR1cm4gbmV3IENoYW5nZURlc2MoanNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShzZWN0aW9ucykgeyByZXR1cm4gbmV3IENoYW5nZURlc2Moc2VjdGlvbnMpOyB9XG59XG4vKipcbkEgY2hhbmdlIHNldCByZXByZXNlbnRzIGEgZ3JvdXAgb2YgbW9kaWZpY2F0aW9ucyB0byBhIGRvY3VtZW50LiBJdFxuc3RvcmVzIHRoZSBkb2N1bWVudCBsZW5ndGgsIGFuZCBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGRvY3VtZW50c1xud2l0aCBleGFjdGx5IHRoYXQgbGVuZ3RoLlxuKi9cbmNsYXNzIENoYW5nZVNldCBleHRlbmRzIENoYW5nZURlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHNlY3Rpb25zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGluc2VydGVkKSB7XG4gICAgICAgIHN1cGVyKHNlY3Rpb25zKTtcbiAgICAgICAgdGhpcy5pbnNlcnRlZCA9IGluc2VydGVkO1xuICAgIH1cbiAgICAvKipcbiAgICBBcHBseSB0aGUgY2hhbmdlcyB0byBhIGRvY3VtZW50LCByZXR1cm5pbmcgdGhlIG1vZGlmaWVkXG4gICAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9IGRvYy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkFwcGx5aW5nIGNoYW5nZSBzZXQgdG8gYSBkb2N1bWVudCB3aXRoIHRoZSB3cm9uZyBsZW5ndGhcIik7XG4gICAgICAgIGl0ZXJDaGFuZ2VzKHRoaXMsIChmcm9tQSwgdG9BLCBmcm9tQiwgX3RvQiwgdGV4dCkgPT4gZG9jID0gZG9jLnJlcGxhY2UoZnJvbUIsIGZyb21CICsgKHRvQSAtIGZyb21BKSwgdGV4dCksIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGRvYztcbiAgICB9XG4gICAgbWFwRGVzYyhvdGhlciwgYmVmb3JlID0gZmFsc2UpIHsgcmV0dXJuIG1hcFNldCh0aGlzLCBvdGhlciwgYmVmb3JlLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEdpdmVuIHRoZSBkb2N1bWVudCBhcyBpdCBleGlzdGVkIF9iZWZvcmVfIHRoZSBjaGFuZ2VzLCByZXR1cm4gYVxuICAgIGNoYW5nZSBzZXQgdGhhdCByZXByZXNlbnRzIHRoZSBpbnZlcnNlIG9mIHRoaXMgc2V0LCB3aGljaCBjb3VsZFxuICAgIGJlIHVzZWQgdG8gZ28gZnJvbSB0aGUgZG9jdW1lbnQgY3JlYXRlZCBieSB0aGUgY2hhbmdlcyBiYWNrIHRvXG4gICAgdGhlIGRvY3VtZW50IGFzIGl0IGV4aXN0ZWQgYmVmb3JlIHRoZSBjaGFuZ2VzLlxuICAgICovXG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICBsZXQgc2VjdGlvbnMgPSB0aGlzLnNlY3Rpb25zLnNsaWNlKCksIGluc2VydGVkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgc2VjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSBzZWN0aW9uc1tpXSwgaW5zID0gc2VjdGlvbnNbaSArIDFdO1xuICAgICAgICAgICAgaWYgKGlucyA+PSAwKSB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnNbaV0gPSBpbnM7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnNbaSArIDFdID0gbGVuO1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGkgPj4gMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5zZXJ0ZWQubGVuZ3RoIDwgaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIGluc2VydGVkLnB1c2goVGV4dC5lbXB0eSk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0ZWQucHVzaChsZW4gPyBkb2Muc2xpY2UocG9zLCBwb3MgKyBsZW4pIDogVGV4dC5lbXB0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgKz0gbGVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbWJpbmUgdHdvIHN1YnNlcXVlbnQgY2hhbmdlIHNldHMgaW50byBhIHNpbmdsZSBzZXQuIGBvdGhlcmBcbiAgICBtdXN0IHN0YXJ0IGluIHRoZSBkb2N1bWVudCBwcm9kdWNlZCBieSBgdGhpc2AuIElmIGB0aGlzYCBnb2VzXG4gICAgYGRvY0FgIFx1MjE5MiBgZG9jQmAgYW5kIGBvdGhlcmAgcmVwcmVzZW50cyBgZG9jQmAgXHUyMTkyIGBkb2NDYCwgdGhlXG4gICAgcmV0dXJuZWQgdmFsdWUgd2lsbCByZXByZXNlbnQgdGhlIGNoYW5nZSBgZG9jQWAgXHUyMTkyIGBkb2NDYC5cbiAgICAqL1xuICAgIGNvbXBvc2Uob3RoZXIpIHsgcmV0dXJuIHRoaXMuZW1wdHkgPyBvdGhlciA6IG90aGVyLmVtcHR5ID8gdGhpcyA6IGNvbXBvc2VTZXRzKHRoaXMsIG90aGVyLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEdpdmVuIGFub3RoZXIgY2hhbmdlIHNldCBzdGFydGluZyBpbiB0aGUgc2FtZSBkb2N1bWVudCwgbWFwcyB0aGlzXG4gICAgY2hhbmdlIHNldCBvdmVyIHRoZSBvdGhlciwgcHJvZHVjaW5nIGEgbmV3IGNoYW5nZSBzZXQgdGhhdCBjYW4gYmVcbiAgICBhcHBsaWVkIHRvIHRoZSBkb2N1bWVudCBwcm9kdWNlZCBieSBhcHBseWluZyBgb3RoZXJgLiBXaGVuXG4gICAgYGJlZm9yZWAgaXMgYHRydWVgLCBvcmRlciBjaGFuZ2VzIGFzIGlmIGB0aGlzYCBjb21lcyBiZWZvcmVcbiAgICBgb3RoZXJgLCBvdGhlcndpc2UgKHRoZSBkZWZhdWx0KSB0cmVhdCBgb3RoZXJgIGFzIGNvbWluZyBmaXJzdC5cbiAgICBcbiAgICBHaXZlbiB0d28gY2hhbmdlcyBgQWAgYW5kIGBCYCwgYEEuY29tcG9zZShCLm1hcChBKSlgIGFuZFxuICAgIGBCLmNvbXBvc2UoQS5tYXAoQiwgdHJ1ZSkpYCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgZG9jdW1lbnQuIFRoaXNcbiAgICBwcm92aWRlcyBhIGJhc2ljIGZvcm0gb2YgW29wZXJhdGlvbmFsXG4gICAgdHJhbnNmb3JtYXRpb25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09wZXJhdGlvbmFsX3RyYW5zZm9ybWF0aW9uKSxcbiAgICBhbmQgY2FuIGJlIHVzZWQgZm9yIGNvbGxhYm9yYXRpdmUgZWRpdGluZy5cbiAgICAqL1xuICAgIG1hcChvdGhlciwgYmVmb3JlID0gZmFsc2UpIHsgcmV0dXJuIG90aGVyLmVtcHR5ID8gdGhpcyA6IG1hcFNldCh0aGlzLCBvdGhlciwgYmVmb3JlLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgY2hhbmdlZCByYW5nZXMgaW4gdGhlIGRvY3VtZW50LCBjYWxsaW5nIGBmYCBmb3JcbiAgICBlYWNoLCB3aXRoIHRoZSByYW5nZSBpbiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgKGBmcm9tQWAtYHRvQWApXG4gICAgYW5kIHRoZSByYW5nZSB0aGF0IHJlcGxhY2VzIGl0IGluIHRoZSBuZXcgZG9jdW1lbnRcbiAgICAoYGZyb21CYC1gdG9CYCkuXG4gICAgXG4gICAgV2hlbiBgaW5kaXZpZHVhbGAgaXMgdHJ1ZSwgYWRqYWNlbnQgY2hhbmdlcyBhcmUgcmVwb3J0ZWRcbiAgICBzZXBhcmF0ZWx5LlxuICAgICovXG4gICAgaXRlckNoYW5nZXMoZiwgaW5kaXZpZHVhbCA9IGZhbHNlKSB7XG4gICAgICAgIGl0ZXJDaGFuZ2VzKHRoaXMsIGYsIGluZGl2aWR1YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbY2hhbmdlIGRlc2NyaXB0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZURlc2MpIGZvciB0aGlzIGNoYW5nZVxuICAgIHNldC5cbiAgICAqL1xuICAgIGdldCBkZXNjKCkgeyByZXR1cm4gQ2hhbmdlRGVzYy5jcmVhdGUodGhpcy5zZWN0aW9ucyk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbHRlcihyYW5nZXMpIHtcbiAgICAgICAgbGV0IHJlc3VsdFNlY3Rpb25zID0gW10sIHJlc3VsdEluc2VydGVkID0gW10sIGZpbHRlcmVkU2VjdGlvbnMgPSBbXTtcbiAgICAgICAgbGV0IGl0ZXIgPSBuZXcgU2VjdGlvbkl0ZXIodGhpcyk7XG4gICAgICAgIGRvbmU6IGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gaSA9PSByYW5nZXMubGVuZ3RoID8gMWU5IDogcmFuZ2VzW2krK107XG4gICAgICAgICAgICB3aGlsZSAocG9zIDwgbmV4dCB8fCBwb3MgPT0gbmV4dCAmJiBpdGVyLmxlbiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXIuZG9uZSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgZG9uZTtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gTWF0aC5taW4oaXRlci5sZW4sIG5leHQgLSBwb3MpO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oZmlsdGVyZWRTZWN0aW9ucywgbGVuLCAtMSk7XG4gICAgICAgICAgICAgICAgbGV0IGlucyA9IGl0ZXIuaW5zID09IC0xID8gLTEgOiBpdGVyLm9mZiA9PSAwID8gaXRlci5pbnMgOiAwO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24ocmVzdWx0U2VjdGlvbnMsIGxlbiwgaW5zKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zID4gMClcbiAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KHJlc3VsdEluc2VydGVkLCByZXN1bHRTZWN0aW9ucywgaXRlci50ZXh0KTtcbiAgICAgICAgICAgICAgICBpdGVyLmZvcndhcmQobGVuKTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGVuZCA9IHJhbmdlc1tpKytdO1xuICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGVuZCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyLmRvbmUpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIGRvbmU7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGl0ZXIubGVuLCBlbmQgLSBwb3MpO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24ocmVzdWx0U2VjdGlvbnMsIGxlbiwgLTEpO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oZmlsdGVyZWRTZWN0aW9ucywgbGVuLCBpdGVyLmlucyA9PSAtMSA/IC0xIDogaXRlci5vZmYgPT0gMCA/IGl0ZXIuaW5zIDogMCk7XG4gICAgICAgICAgICAgICAgaXRlci5mb3J3YXJkKGxlbik7XG4gICAgICAgICAgICAgICAgcG9zICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjaGFuZ2VzOiBuZXcgQ2hhbmdlU2V0KHJlc3VsdFNlY3Rpb25zLCByZXN1bHRJbnNlcnRlZCksXG4gICAgICAgICAgICBmaWx0ZXJlZDogQ2hhbmdlRGVzYy5jcmVhdGUoZmlsdGVyZWRTZWN0aW9ucykgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2VyaWFsaXplIHRoaXMgY2hhbmdlIHNldCB0byBhIEpTT04tcmVwcmVzZW50YWJsZSB2YWx1ZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IHBhcnRzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaV0sIGlucyA9IHRoaXMuc2VjdGlvbnNbaSArIDFdO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChsZW4pO1xuICAgICAgICAgICAgZWxzZSBpZiAoaW5zID09IDApXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChbbGVuXSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChbbGVuXS5jb25jYXQodGhpcy5pbnNlcnRlZFtpID4+IDFdLnRvSlNPTigpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRzO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjaGFuZ2Ugc2V0IGZvciB0aGUgZ2l2ZW4gY2hhbmdlcywgZm9yIGEgZG9jdW1lbnQgb2YgdGhlXG4gICAgZ2l2ZW4gbGVuZ3RoLCB1c2luZyBgbGluZVNlcGAgYXMgbGluZSBzZXBhcmF0b3IuXG4gICAgKi9cbiAgICBzdGF0aWMgb2YoY2hhbmdlcywgbGVuZ3RoLCBsaW5lU2VwKSB7XG4gICAgICAgIGxldCBzZWN0aW9ucyA9IFtdLCBpbnNlcnRlZCA9IFtdLCBwb3MgPSAwO1xuICAgICAgICBsZXQgdG90YWwgPSBudWxsO1xuICAgICAgICBmdW5jdGlvbiBmbHVzaChmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAoIWZvcmNlICYmICFzZWN0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHBvcyA8IGxlbmd0aClcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW5ndGggLSBwb3MsIC0xKTtcbiAgICAgICAgICAgIGxldCBzZXQgPSBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgICAgICAgICB0b3RhbCA9IHRvdGFsID8gdG90YWwuY29tcG9zZShzZXQubWFwKHRvdGFsKSkgOiBzZXQ7XG4gICAgICAgICAgICBzZWN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgaW5zZXJ0ZWQgPSBbXTtcbiAgICAgICAgICAgIHBvcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcHJvY2VzcyhzcGVjKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzcGVjKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHN1YiBvZiBzcGVjKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKHN1Yik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzcGVjIGluc3RhbmNlb2YgQ2hhbmdlU2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwZWMubGVuZ3RoICE9IGxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE1pc21hdGNoZWQgY2hhbmdlIHNldCBsZW5ndGggKGdvdCAke3NwZWMubGVuZ3RofSwgZXhwZWN0ZWQgJHtsZW5ndGh9KWApO1xuICAgICAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgICAgICAgICAgdG90YWwgPSB0b3RhbCA/IHRvdGFsLmNvbXBvc2Uoc3BlYy5tYXAodG90YWwpKSA6IHNwZWM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBmcm9tLCB0byA9IGZyb20sIGluc2VydCB9ID0gc3BlYztcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA+IHRvIHx8IGZyb20gPCAwIHx8IHRvID4gbGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBjaGFuZ2UgcmFuZ2UgJHtmcm9tfSB0byAke3RvfSAoaW4gZG9jIG9mIGxlbmd0aCAke2xlbmd0aH0pYCk7XG4gICAgICAgICAgICAgICAgbGV0IGluc1RleHQgPSAhaW5zZXJ0ID8gVGV4dC5lbXB0eSA6IHR5cGVvZiBpbnNlcnQgPT0gXCJzdHJpbmdcIiA/IFRleHQub2YoaW5zZXJ0LnNwbGl0KGxpbmVTZXAgfHwgRGVmYXVsdFNwbGl0KSkgOiBpbnNlcnQ7XG4gICAgICAgICAgICAgICAgbGV0IGluc0xlbiA9IGluc1RleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID09IHRvICYmIGluc0xlbiA9PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPCBwb3MpXG4gICAgICAgICAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGZyb20gLSBwb3MsIC0xKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCB0byAtIGZyb20sIGluc0xlbik7XG4gICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydGVkLCBzZWN0aW9ucywgaW5zVGV4dCk7XG4gICAgICAgICAgICAgICAgcG9zID0gdG87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2VzcyhjaGFuZ2VzKTtcbiAgICAgICAgZmx1c2goIXRvdGFsKTtcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZW1wdHkgY2hhbmdlc2V0IG9mIHRoZSBnaXZlbiBsZW5ndGguXG4gICAgKi9cbiAgICBzdGF0aWMgZW1wdHkobGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KGxlbmd0aCA/IFtsZW5ndGgsIC0xXSA6IFtdLCBbXSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNoYW5nZXNldCBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uIChhcyBwcm9kdWNlZCBieVxuICAgIFtgdG9KU09OYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VTZXQudG9KU09OKS5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIG9mIENoYW5nZVNldFwiKTtcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gW10sIGluc2VydGVkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHBhcnQgPSBqc29uW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHBhcnQsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHBhcnQpIHx8IHR5cGVvZiBwYXJ0WzBdICE9IFwibnVtYmVyXCIgfHwgcGFydC5zb21lKChlLCBpKSA9PiBpICYmIHR5cGVvZiBlICE9IFwic3RyaW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gb2YgQ2hhbmdlU2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFydC5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zLnB1c2gocGFydFswXSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5zZXJ0ZWQubGVuZ3RoIDwgaSlcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQucHVzaChUZXh0LmVtcHR5KTtcbiAgICAgICAgICAgICAgICBpbnNlcnRlZFtpXSA9IFRleHQub2YocGFydC5zbGljZSgxKSk7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChwYXJ0WzBdLCBpbnNlcnRlZFtpXS5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VTZXQoc2VjdGlvbnMsIGluc2VydGVkKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW4sIGlucywgZm9yY2VKb2luID0gZmFsc2UpIHtcbiAgICBpZiAobGVuID09IDAgJiYgaW5zIDw9IDApXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgbGFzdCA9IHNlY3Rpb25zLmxlbmd0aCAtIDI7XG4gICAgaWYgKGxhc3QgPj0gMCAmJiBpbnMgPD0gMCAmJiBpbnMgPT0gc2VjdGlvbnNbbGFzdCArIDFdKVxuICAgICAgICBzZWN0aW9uc1tsYXN0XSArPSBsZW47XG4gICAgZWxzZSBpZiAobGFzdCA+PSAwICYmIGxlbiA9PSAwICYmIHNlY3Rpb25zW2xhc3RdID09IDApXG4gICAgICAgIHNlY3Rpb25zW2xhc3QgKyAxXSArPSBpbnM7XG4gICAgZWxzZSBpZiAoZm9yY2VKb2luKSB7XG4gICAgICAgIHNlY3Rpb25zW2xhc3RdICs9IGxlbjtcbiAgICAgICAgc2VjdGlvbnNbbGFzdCArIDFdICs9IGlucztcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICBzZWN0aW9ucy5wdXNoKGxlbiwgaW5zKTtcbn1cbmZ1bmN0aW9uIGFkZEluc2VydCh2YWx1ZXMsIHNlY3Rpb25zLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBpbmRleCA9IChzZWN0aW9ucy5sZW5ndGggLSAyKSA+PiAxO1xuICAgIGlmIChpbmRleCA8IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXSA9IHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV0uYXBwZW5kKHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdoaWxlICh2YWx1ZXMubGVuZ3RoIDwgaW5kZXgpXG4gICAgICAgICAgICB2YWx1ZXMucHVzaChUZXh0LmVtcHR5KTtcbiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGl0ZXJDaGFuZ2VzKGRlc2MsIGYsIGluZGl2aWR1YWwpIHtcbiAgICBsZXQgaW5zZXJ0ZWQgPSBkZXNjLmluc2VydGVkO1xuICAgIGZvciAobGV0IHBvc0EgPSAwLCBwb3NCID0gMCwgaSA9IDA7IGkgPCBkZXNjLnNlY3Rpb25zLmxlbmd0aDspIHtcbiAgICAgICAgbGV0IGxlbiA9IGRlc2Muc2VjdGlvbnNbaSsrXSwgaW5zID0gZGVzYy5zZWN0aW9uc1tpKytdO1xuICAgICAgICBpZiAoaW5zIDwgMCkge1xuICAgICAgICAgICAgcG9zQSArPSBsZW47XG4gICAgICAgICAgICBwb3NCICs9IGxlbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlbmRBID0gcG9zQSwgZW5kQiA9IHBvc0IsIHRleHQgPSBUZXh0LmVtcHR5O1xuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGVuZEEgKz0gbGVuO1xuICAgICAgICAgICAgICAgIGVuZEIgKz0gaW5zO1xuICAgICAgICAgICAgICAgIGlmIChpbnMgJiYgaW5zZXJ0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LmFwcGVuZChpbnNlcnRlZFsoaSAtIDIpID4+IDFdKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kaXZpZHVhbCB8fCBpID09IGRlc2Muc2VjdGlvbnMubGVuZ3RoIHx8IGRlc2Muc2VjdGlvbnNbaSArIDFdIDwgMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbGVuID0gZGVzYy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgICAgIGlucyA9IGRlc2Muc2VjdGlvbnNbaSsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGYocG9zQSwgZW5kQSwgcG9zQiwgZW5kQiwgdGV4dCk7XG4gICAgICAgICAgICBwb3NBID0gZW5kQTtcbiAgICAgICAgICAgIHBvc0IgPSBlbmRCO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gbWFwU2V0KHNldEEsIHNldEIsIGJlZm9yZSwgbWtTZXQgPSBmYWxzZSkge1xuICAgIC8vIFByb2R1Y2UgYSBjb3B5IG9mIHNldEEgdGhhdCBhcHBsaWVzIHRvIHRoZSBkb2N1bWVudCBhZnRlciBzZXRCXG4gICAgLy8gaGFzIGJlZW4gYXBwbGllZCAoYXNzdW1pbmcgYm90aCBzdGFydCBhdCB0aGUgc2FtZSBkb2N1bWVudCkuXG4gICAgbGV0IHNlY3Rpb25zID0gW10sIGluc2VydCA9IG1rU2V0ID8gW10gOiBudWxsO1xuICAgIGxldCBhID0gbmV3IFNlY3Rpb25JdGVyKHNldEEpLCBiID0gbmV3IFNlY3Rpb25JdGVyKHNldEIpO1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBib3RoIHNldHMgaW4gcGFyYWxsZWwuIGluc2VydGVkIHRyYWNrcywgZm9yIGNoYW5nZXNcbiAgICAvLyBpbiBBIHRoYXQgaGF2ZSB0byBiZSBwcm9jZXNzZWQgcGllY2UtYnktcGllY2UsIHdoZXRoZXIgdGhlaXJcbiAgICAvLyBjb250ZW50IGhhcyBiZWVuIGluc2VydGVkIGFscmVhZHksIGFuZCByZWZlcnMgdG8gdGhlIHNlY3Rpb25cbiAgICAvLyBpbmRleC5cbiAgICBmb3IgKGxldCBpbnNlcnRlZCA9IC0xOzspIHtcbiAgICAgICAgaWYgKGEuZG9uZSAmJiBiLmxlbiB8fCBiLmRvbmUgJiYgYS5sZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc21hdGNoZWQgY2hhbmdlIHNldCBsZW5ndGhzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuaW5zID09IC0xICYmIGIuaW5zID09IC0xKSB7XG4gICAgICAgICAgICAvLyBNb3ZlIGFjcm9zcyByYW5nZXMgc2tpcHBlZCBieSBib3RoIHNldHMuXG4gICAgICAgICAgICBsZXQgbGVuID0gTWF0aC5taW4oYS5sZW4sIGIubGVuKTtcbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGxlbiwgLTEpO1xuICAgICAgICAgICAgYS5mb3J3YXJkKGxlbik7XG4gICAgICAgICAgICBiLmZvcndhcmQobGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiLmlucyA+PSAwICYmIChhLmlucyA8IDAgfHwgaW5zZXJ0ZWQgPT0gYS5pIHx8IGEub2ZmID09IDAgJiYgKGIubGVuIDwgYS5sZW4gfHwgYi5sZW4gPT0gYS5sZW4gJiYgIWJlZm9yZSkpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGEgY2hhbmdlIGluIEIgdGhhdCBjb21lcyBiZWZvcmUgdGhlIG5leHQgY2hhbmdlIGluXG4gICAgICAgICAgICAvLyBBIChvcmRlcmVkIGJ5IHN0YXJ0IHBvcywgdGhlbiBsZW4sIHRoZW4gYmVmb3JlIGZsYWcpLCBza2lwXG4gICAgICAgICAgICAvLyB0aGF0IChhbmQgcHJvY2VzcyBhbnkgY2hhbmdlcyBpbiBBIGl0IGNvdmVycykuXG4gICAgICAgICAgICBsZXQgbGVuID0gYi5sZW47XG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBiLmlucywgLTEpO1xuICAgICAgICAgICAgd2hpbGUgKGxlbikge1xuICAgICAgICAgICAgICAgIGxldCBwaWVjZSA9IE1hdGgubWluKGEubGVuLCBsZW4pO1xuICAgICAgICAgICAgICAgIGlmIChhLmlucyA+PSAwICYmIGluc2VydGVkIDwgYS5pICYmIGEubGVuIDw9IHBpZWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIDAsIGEuaW5zKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBhLnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZCA9IGEuaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYS5mb3J3YXJkKHBpZWNlKTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gcGllY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmlucyA+PSAwKSB7XG4gICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBwYXJ0IG9mIGEgY2hhbmdlIGluIEEgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0XG4gICAgICAgICAgICAvLyBub24tZGVsZXRpb24gY2hhbmdlIGluIEIgKGlmIG92ZXJsYXBwaW5nKS5cbiAgICAgICAgICAgIGxldCBsZW4gPSAwLCBsZWZ0ID0gYS5sZW47XG4gICAgICAgICAgICB3aGlsZSAobGVmdCkge1xuICAgICAgICAgICAgICAgIGlmIChiLmlucyA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGllY2UgPSBNYXRoLm1pbihsZWZ0LCBiLmxlbik7XG4gICAgICAgICAgICAgICAgICAgIGxlbiArPSBwaWVjZTtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCAtPSBwaWVjZTtcbiAgICAgICAgICAgICAgICAgICAgYi5mb3J3YXJkKHBpZWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYi5pbnMgPT0gMCAmJiBiLmxlbiA8IGxlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCAtPSBiLmxlbjtcbiAgICAgICAgICAgICAgICAgICAgYi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW4sIGluc2VydGVkIDwgYS5pID8gYS5pbnMgOiAwKTtcbiAgICAgICAgICAgIGlmIChpbnNlcnQgJiYgaW5zZXJ0ZWQgPCBhLmkpXG4gICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGEudGV4dCk7XG4gICAgICAgICAgICBpbnNlcnRlZCA9IGEuaTtcbiAgICAgICAgICAgIGEuZm9yd2FyZChhLmxlbiAtIGxlZnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuZG9uZSAmJiBiLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnNlcnQgPyBDaGFuZ2VTZXQuY3JlYXRlU2V0KHNlY3Rpb25zLCBpbnNlcnQpIDogQ2hhbmdlRGVzYy5jcmVhdGUoc2VjdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzbWF0Y2hlZCBjaGFuZ2Ugc2V0IGxlbmd0aHNcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjb21wb3NlU2V0cyhzZXRBLCBzZXRCLCBta1NldCA9IGZhbHNlKSB7XG4gICAgbGV0IHNlY3Rpb25zID0gW107XG4gICAgbGV0IGluc2VydCA9IG1rU2V0ID8gW10gOiBudWxsO1xuICAgIGxldCBhID0gbmV3IFNlY3Rpb25JdGVyKHNldEEpLCBiID0gbmV3IFNlY3Rpb25JdGVyKHNldEIpO1xuICAgIGZvciAobGV0IG9wZW4gPSBmYWxzZTs7KSB7XG4gICAgICAgIGlmIChhLmRvbmUgJiYgYi5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zZXJ0ID8gQ2hhbmdlU2V0LmNyZWF0ZVNldChzZWN0aW9ucywgaW5zZXJ0KSA6IENoYW5nZURlc2MuY3JlYXRlKHNlY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmlucyA9PSAwKSB7IC8vIERlbGV0aW9uIGluIEFcbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGEubGVuLCAwLCBvcGVuKTtcbiAgICAgICAgICAgIGEubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIubGVuID09IDAgJiYgIWIuZG9uZSkgeyAvLyBJbnNlcnRpb24gaW4gQlxuICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgMCwgYi5pbnMsIG9wZW4pO1xuICAgICAgICAgICAgaWYgKGluc2VydClcbiAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYi50ZXh0KTtcbiAgICAgICAgICAgIGIubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuZG9uZSB8fCBiLmRvbmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc21hdGNoZWQgY2hhbmdlIHNldCBsZW5ndGhzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGEubGVuMiwgYi5sZW4pLCBzZWN0aW9uTGVuID0gc2VjdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGEuaW5zID09IC0xKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluc0IgPSBiLmlucyA9PSAtMSA/IC0xIDogYi5vZmYgPyAwIDogYi5pbnM7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuLCBpbnNCLCBvcGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0ICYmIGluc0IpXG4gICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBiLnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYi5pbnMgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBhLm9mZiA/IDAgOiBhLmxlbiwgbGVuLCBvcGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYS50ZXh0Qml0KGxlbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgYS5vZmYgPyAwIDogYS5sZW4sIGIub2ZmID8gMCA6IGIuaW5zLCBvcGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0ICYmICFiLm9mZilcbiAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGIudGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcGVuID0gKGEuaW5zID4gbGVuIHx8IGIuaW5zID49IDAgJiYgYi5sZW4gPiBsZW4pICYmIChvcGVuIHx8IHNlY3Rpb25zLmxlbmd0aCA+IHNlY3Rpb25MZW4pO1xuICAgICAgICAgICAgYS5mb3J3YXJkMihsZW4pO1xuICAgICAgICAgICAgYi5mb3J3YXJkKGxlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBTZWN0aW9uSXRlciB7XG4gICAgY29uc3RydWN0b3Ioc2V0KSB7XG4gICAgICAgIHRoaXMuc2V0ID0gc2V0O1xuICAgICAgICB0aGlzLmkgPSAwO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgbGV0IHsgc2VjdGlvbnMgfSA9IHRoaXMuc2V0O1xuICAgICAgICBpZiAodGhpcy5pIDwgc2VjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxlbiA9IHNlY3Rpb25zW3RoaXMuaSsrXTtcbiAgICAgICAgICAgIHRoaXMuaW5zID0gc2VjdGlvbnNbdGhpcy5pKytdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sZW4gPSAwO1xuICAgICAgICAgICAgdGhpcy5pbnMgPSAtMjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9mZiA9IDA7XG4gICAgfVxuICAgIGdldCBkb25lKCkgeyByZXR1cm4gdGhpcy5pbnMgPT0gLTI7IH1cbiAgICBnZXQgbGVuMigpIHsgcmV0dXJuIHRoaXMuaW5zIDwgMCA/IHRoaXMubGVuIDogdGhpcy5pbnM7IH1cbiAgICBnZXQgdGV4dCgpIHtcbiAgICAgICAgbGV0IHsgaW5zZXJ0ZWQgfSA9IHRoaXMuc2V0LCBpbmRleCA9ICh0aGlzLmkgLSAyKSA+PiAxO1xuICAgICAgICByZXR1cm4gaW5kZXggPj0gaW5zZXJ0ZWQubGVuZ3RoID8gVGV4dC5lbXB0eSA6IGluc2VydGVkW2luZGV4XTtcbiAgICB9XG4gICAgdGV4dEJpdChsZW4pIHtcbiAgICAgICAgbGV0IHsgaW5zZXJ0ZWQgfSA9IHRoaXMuc2V0LCBpbmRleCA9ICh0aGlzLmkgLSAyKSA+PiAxO1xuICAgICAgICByZXR1cm4gaW5kZXggPj0gaW5zZXJ0ZWQubGVuZ3RoICYmICFsZW4gPyBUZXh0LmVtcHR5XG4gICAgICAgICAgICA6IGluc2VydGVkW2luZGV4XS5zbGljZSh0aGlzLm9mZiwgbGVuID09IG51bGwgPyB1bmRlZmluZWQgOiB0aGlzLm9mZiArIGxlbik7XG4gICAgfVxuICAgIGZvcndhcmQobGVuKSB7XG4gICAgICAgIGlmIChsZW4gPT0gdGhpcy5sZW4pXG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxlbiAtPSBsZW47XG4gICAgICAgICAgICB0aGlzLm9mZiArPSBsZW47XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yd2FyZDIobGVuKSB7XG4gICAgICAgIGlmICh0aGlzLmlucyA9PSAtMSlcbiAgICAgICAgICAgIHRoaXMuZm9yd2FyZChsZW4pO1xuICAgICAgICBlbHNlIGlmIChsZW4gPT0gdGhpcy5pbnMpXG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlucyAtPSBsZW47XG4gICAgICAgICAgICB0aGlzLm9mZiArPSBsZW47XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuQSBzaW5nbGUgc2VsZWN0aW9uIHJhbmdlLiBXaGVuXG5bYGFsbG93TXVsdGlwbGVTZWxlY3Rpb25zYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5hbGxvd011bHRpcGxlU2VsZWN0aW9ucylcbmlzIGVuYWJsZWQsIGEgW3NlbGVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTZWxlY3Rpb24pIG1heSBob2xkXG5tdWx0aXBsZSByYW5nZXMuIEJ5IGRlZmF1bHQsIHNlbGVjdGlvbnMgaG9sZCBleGFjdGx5IG9uZSByYW5nZS5cbiovXG5jbGFzcyBTZWxlY3Rpb25SYW5nZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgZmxhZ3MpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBhbmNob3Igb2YgdGhlIHJhbmdlXHUyMDE0dGhlIHNpZGUgdGhhdCBkb2Vzbid0IG1vdmUgd2hlbiB5b3VcbiAgICBleHRlbmQgaXQuXG4gICAgKi9cbiAgICBnZXQgYW5jaG9yKCkgeyByZXR1cm4gdGhpcy5mbGFncyAmIDMyIC8qIFJhbmdlRmxhZy5JbnZlcnRlZCAqLyA/IHRoaXMudG8gOiB0aGlzLmZyb207IH1cbiAgICAvKipcbiAgICBUaGUgaGVhZCBvZiB0aGUgcmFuZ2UsIHdoaWNoIGlzIG1vdmVkIHdoZW4gdGhlIHJhbmdlIGlzXG4gICAgW2V4dGVuZGVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvblJhbmdlLmV4dGVuZCkuXG4gICAgKi9cbiAgICBnZXQgaGVhZCgpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgJiAzMiAvKiBSYW5nZUZsYWcuSW52ZXJ0ZWQgKi8gPyB0aGlzLmZyb20gOiB0aGlzLnRvOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIGBhbmNob3JgIGFuZCBgaGVhZGAgYXJlIGF0IHRoZSBzYW1lIHBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IGVtcHR5KCkgeyByZXR1cm4gdGhpcy5mcm9tID09IHRoaXMudG87IH1cbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIGEgY3Vyc29yIHRoYXQgaXMgZXhwbGljaXRseSBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAgY2hhcmFjdGVyIG9uIG9uZSBvZiBpdHMgc2lkZXMsIHRoaXMgcmV0dXJucyB0aGUgc2lkZS4gLTEgbWVhbnNcbiAgICB0aGUgY2hhcmFjdGVyIGJlZm9yZSBpdHMgcG9zaXRpb24sIDEgdGhlIGNoYXJhY3RlciBhZnRlciwgYW5kIDBcbiAgICBtZWFucyBubyBhc3NvY2lhdGlvbi5cbiAgICAqL1xuICAgIGdldCBhc3NvYygpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgJiA4IC8qIFJhbmdlRmxhZy5Bc3NvY0JlZm9yZSAqLyA/IC0xIDogdGhpcy5mbGFncyAmIDE2IC8qIFJhbmdlRmxhZy5Bc3NvY0FmdGVyICovID8gMSA6IDA7IH1cbiAgICAvKipcbiAgICBUaGUgYmlkaXJlY3Rpb25hbCB0ZXh0IGxldmVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGN1cnNvciwgaWZcbiAgICBhbnkuXG4gICAgKi9cbiAgICBnZXQgYmlkaUxldmVsKCkge1xuICAgICAgICBsZXQgbGV2ZWwgPSB0aGlzLmZsYWdzICYgNyAvKiBSYW5nZUZsYWcuQmlkaUxldmVsTWFzayAqLztcbiAgICAgICAgcmV0dXJuIGxldmVsID09IDcgPyBudWxsIDogbGV2ZWw7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBnb2FsIGNvbHVtbiAoc3RvcmVkIHZlcnRpY2FsIG9mZnNldCkgYXNzb2NpYXRlZCB3aXRoIGFcbiAgICBjdXJzb3IuIFRoaXMgaXMgdXNlZCB0byBwcmVzZXJ2ZSB0aGUgdmVydGljYWwgcG9zaXRpb24gd2hlblxuICAgIFttb3ZpbmddKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Lm1vdmVWZXJ0aWNhbGx5KSBhY3Jvc3NcbiAgICBsaW5lcyBvZiBkaWZmZXJlbnQgbGVuZ3RoLlxuICAgICovXG4gICAgZ2V0IGdvYWxDb2x1bW4oKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuZmxhZ3MgPj4gNiAvKiBSYW5nZUZsYWcuR29hbENvbHVtbk9mZnNldCAqLztcbiAgICAgICAgcmV0dXJuIHZhbHVlID09IDE2Nzc3MjE1IC8qIFJhbmdlRmxhZy5Ob0dvYWxDb2x1bW4gKi8gPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIHRoaXMgcmFuZ2UgdGhyb3VnaCBhIGNoYW5nZSwgcHJvZHVjaW5nIGEgdmFsaWQgcmFuZ2UgaW4gdGhlXG4gICAgdXBkYXRlZCBkb2N1bWVudC5cbiAgICAqL1xuICAgIG1hcChjaGFuZ2UsIGFzc29jID0gLTEpIHtcbiAgICAgICAgbGV0IGZyb20sIHRvO1xuICAgICAgICBpZiAodGhpcy5lbXB0eSkge1xuICAgICAgICAgICAgZnJvbSA9IHRvID0gY2hhbmdlLm1hcFBvcyh0aGlzLmZyb20sIGFzc29jKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZyb20gPSBjaGFuZ2UubWFwUG9zKHRoaXMuZnJvbSwgMSk7XG4gICAgICAgICAgICB0byA9IGNoYW5nZS5tYXBQb3ModGhpcy50bywgLTEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcm9tID09IHRoaXMuZnJvbSAmJiB0byA9PSB0aGlzLnRvID8gdGhpcyA6IG5ldyBTZWxlY3Rpb25SYW5nZShmcm9tLCB0bywgdGhpcy5mbGFncyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEV4dGVuZCB0aGlzIHJhbmdlIHRvIGNvdmVyIGF0IGxlYXN0IGBmcm9tYCB0byBgdG9gLlxuICAgICovXG4gICAgZXh0ZW5kKGZyb20sIHRvID0gZnJvbSkge1xuICAgICAgICBpZiAoZnJvbSA8PSB0aGlzLmFuY2hvciAmJiB0byA+PSB0aGlzLmFuY2hvcilcbiAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pO1xuICAgICAgICBsZXQgaGVhZCA9IE1hdGguYWJzKGZyb20gLSB0aGlzLmFuY2hvcikgPiBNYXRoLmFicyh0byAtIHRoaXMuYW5jaG9yKSA/IGZyb20gOiB0bztcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZSh0aGlzLmFuY2hvciwgaGVhZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyByYW5nZSB0byBhbm90aGVyIHJhbmdlLlxuICAgICovXG4gICAgZXEob3RoZXIsIGluY2x1ZGVBc3NvYyA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuY2hvciA9PSBvdGhlci5hbmNob3IgJiYgdGhpcy5oZWFkID09IG90aGVyLmhlYWQgJiZcbiAgICAgICAgICAgICghaW5jbHVkZUFzc29jIHx8ICF0aGlzLmVtcHR5IHx8IHRoaXMuYXNzb2MgPT0gb3RoZXIuYXNzb2MpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBKU09OLXNlcmlhbGl6YWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByYW5nZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHsgcmV0dXJuIHsgYW5jaG9yOiB0aGlzLmFuY2hvciwgaGVhZDogdGhpcy5oZWFkIH07IH1cbiAgICAvKipcbiAgICBDb252ZXJ0IGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhIHJhbmdlIHRvIGEgYFNlbGVjdGlvblJhbmdlYFxuICAgIGluc3RhbmNlLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uIHx8IHR5cGVvZiBqc29uLmFuY2hvciAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLmhlYWQgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBTZWxlY3Rpb25SYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZShqc29uLmFuY2hvciwganNvbi5oZWFkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGZyb20sIHRvLCBmbGFncykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvblJhbmdlKGZyb20sIHRvLCBmbGFncyk7XG4gICAgfVxufVxuLyoqXG5BbiBlZGl0b3Igc2VsZWN0aW9uIGhvbGRzIG9uZSBvciBtb3JlIHNlbGVjdGlvbiByYW5nZXMuXG4qL1xuY2xhc3MgRWRpdG9yU2VsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcmFuZ2VzIGluIHRoZSBzZWxlY3Rpb24sIHNvcnRlZCBieSBwb3NpdGlvbi4gUmFuZ2VzIGNhbm5vdFxuICAgIG92ZXJsYXAgKGJ1dCB0aGV5IG1heSB0b3VjaCwgaWYgdGhleSBhcmVuJ3QgZW1wdHkpLlxuICAgICovXG4gICAgcmFuZ2VzLCBcbiAgICAvKipcbiAgICBUaGUgaW5kZXggb2YgdGhlIF9tYWluXyByYW5nZSBpbiB0aGUgc2VsZWN0aW9uICh3aGljaCBpc1xuICAgIHVzdWFsbHkgdGhlIHJhbmdlIHRoYXQgd2FzIGFkZGVkIGxhc3QpLlxuICAgICovXG4gICAgbWFpbkluZGV4KSB7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICB0aGlzLm1haW5JbmRleCA9IG1haW5JbmRleDtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIGEgc2VsZWN0aW9uIHRocm91Z2ggYSBjaGFuZ2UuIFVzZWQgdG8gYWRqdXN0IHRoZSBzZWxlY3Rpb25cbiAgICBwb3NpdGlvbiBmb3IgY2hhbmdlcy5cbiAgICAqL1xuICAgIG1hcChjaGFuZ2UsIGFzc29jID0gLTEpIHtcbiAgICAgICAgaWYgKGNoYW5nZS5lbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZSh0aGlzLnJhbmdlcy5tYXAociA9PiByLm1hcChjaGFuZ2UsIGFzc29jKSksIHRoaXMubWFpbkluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIHNlbGVjdGlvbiB0byBhbm90aGVyIHNlbGVjdGlvbi4gQnkgZGVmYXVsdCwgcmFuZ2VzXG4gICAgYXJlIGNvbXBhcmVkIG9ubHkgYnkgcG9zaXRpb24uIFdoZW4gYGluY2x1ZGVBc3NvY2AgaXMgdHJ1ZSxcbiAgICBjdXJzb3IgcmFuZ2VzIG11c3QgYWxzbyBoYXZlIHRoZSBzYW1lXG4gICAgW2Bhc3NvY2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uUmFuZ2UuYXNzb2MpIHZhbHVlLlxuICAgICovXG4gICAgZXEob3RoZXIsIGluY2x1ZGVBc3NvYyA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlcy5sZW5ndGggIT0gb3RoZXIucmFuZ2VzLmxlbmd0aCB8fFxuICAgICAgICAgICAgdGhpcy5tYWluSW5kZXggIT0gb3RoZXIubWFpbkluZGV4KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnJhbmdlc1tpXS5lcShvdGhlci5yYW5nZXNbaV0sIGluY2x1ZGVBc3NvYykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBwcmltYXJ5IHNlbGVjdGlvbiByYW5nZS4gVXN1YWxseSwgeW91IHNob3VsZCBtYWtlIHN1cmVcbiAgICB5b3VyIGNvZGUgYXBwbGllcyB0byBfYWxsXyByYW5nZXMsIGJ5IHVzaW5nIG1ldGhvZHMgbGlrZVxuICAgIFtgY2hhbmdlQnlSYW5nZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuY2hhbmdlQnlSYW5nZSkuXG4gICAgKi9cbiAgICBnZXQgbWFpbigpIHsgcmV0dXJuIHRoaXMucmFuZ2VzW3RoaXMubWFpbkluZGV4XTsgfVxuICAgIC8qKlxuICAgIE1ha2Ugc3VyZSB0aGUgc2VsZWN0aW9uIG9ubHkgaGFzIG9uZSByYW5nZS4gUmV0dXJucyBhIHNlbGVjdGlvblxuICAgIGhvbGRpbmcgb25seSB0aGUgbWFpbiByYW5nZSBmcm9tIHRoaXMgc2VsZWN0aW9uLlxuICAgICovXG4gICAgYXNTaW5nbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlcy5sZW5ndGggPT0gMSA/IHRoaXMgOiBuZXcgRWRpdG9yU2VsZWN0aW9uKFt0aGlzLm1haW5dLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRXh0ZW5kIHRoaXMgc2VsZWN0aW9uIHdpdGggYW4gZXh0cmEgcmFuZ2UuXG4gICAgKi9cbiAgICBhZGRSYW5nZShyYW5nZSwgbWFpbiA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUoW3JhbmdlXS5jb25jYXQodGhpcy5yYW5nZXMpLCBtYWluID8gMCA6IHRoaXMubWFpbkluZGV4ICsgMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgYSBnaXZlbiByYW5nZSB3aXRoIGFub3RoZXIgcmFuZ2UsIGFuZCB0aGVuIG5vcm1hbGl6ZSB0aGVcbiAgICBzZWxlY3Rpb24gdG8gbWVyZ2UgYW5kIHNvcnQgcmFuZ2VzIGlmIG5lY2Vzc2FyeS5cbiAgICAqL1xuICAgIHJlcGxhY2VSYW5nZShyYW5nZSwgd2hpY2ggPSB0aGlzLm1haW5JbmRleCkge1xuICAgICAgICBsZXQgcmFuZ2VzID0gdGhpcy5yYW5nZXMuc2xpY2UoKTtcbiAgICAgICAgcmFuZ2VzW3doaWNoXSA9IHJhbmdlO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShyYW5nZXMsIHRoaXMubWFpbkluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGlzIHNlbGVjdGlvbiB0byBhbiBvYmplY3QgdGhhdCBjYW4gYmUgc2VyaWFsaXplZCB0b1xuICAgIEpTT04uXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlczogdGhpcy5yYW5nZXMubWFwKHIgPT4gci50b0pTT04oKSksIG1haW46IHRoaXMubWFpbkluZGV4IH07XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNlbGVjdGlvbiBmcm9tIGEgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghanNvbiB8fCAhQXJyYXkuaXNBcnJheShqc29uLnJhbmdlcykgfHwgdHlwZW9mIGpzb24ubWFpbiAhPSBcIm51bWJlclwiIHx8IGpzb24ubWFpbiA+PSBqc29uLnJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRWRpdG9yU2VsZWN0aW9uXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihqc29uLnJhbmdlcy5tYXAoKHIpID0+IFNlbGVjdGlvblJhbmdlLmZyb21KU09OKHIpKSwganNvbi5tYWluKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2VsZWN0aW9uIGhvbGRpbmcgYSBzaW5nbGUgcmFuZ2UuXG4gICAgKi9cbiAgICBzdGF0aWMgc2luZ2xlKGFuY2hvciwgaGVhZCA9IGFuY2hvcikge1xuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihbRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGFuY2hvciwgaGVhZCldLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgU29ydCBhbmQgbWVyZ2UgdGhlIGdpdmVuIHNldCBvZiByYW5nZXMsIGNyZWF0aW5nIGEgdmFsaWRcbiAgICBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHJhbmdlcywgbWFpbkluZGV4ID0gMCkge1xuICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBIHNlbGVjdGlvbiBuZWVkcyBhdCBsZWFzdCBvbmUgcmFuZ2VcIik7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZXNbaV07XG4gICAgICAgICAgICBpZiAocmFuZ2UuZW1wdHkgPyByYW5nZS5mcm9tIDw9IHBvcyA6IHJhbmdlLmZyb20gPCBwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5ub3JtYWxpemVkKHJhbmdlcy5zbGljZSgpLCBtYWluSW5kZXgpO1xuICAgICAgICAgICAgcG9zID0gcmFuZ2UudG87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFZGl0b3JTZWxlY3Rpb24ocmFuZ2VzLCBtYWluSW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjdXJzb3Igc2VsZWN0aW9uIHJhbmdlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4gWW91IGNhblxuICAgIHNhZmVseSBpZ25vcmUgdGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBpbiBtb3N0IHNpdHVhdGlvbnMuXG4gICAgKi9cbiAgICBzdGF0aWMgY3Vyc29yKHBvcywgYXNzb2MgPSAwLCBiaWRpTGV2ZWwsIGdvYWxDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIFNlbGVjdGlvblJhbmdlLmNyZWF0ZShwb3MsIHBvcywgKGFzc29jID09IDAgPyAwIDogYXNzb2MgPCAwID8gOCAvKiBSYW5nZUZsYWcuQXNzb2NCZWZvcmUgKi8gOiAxNiAvKiBSYW5nZUZsYWcuQXNzb2NBZnRlciAqLykgfFxuICAgICAgICAgICAgKGJpZGlMZXZlbCA9PSBudWxsID8gNyA6IE1hdGgubWluKDYsIGJpZGlMZXZlbCkpIHxcbiAgICAgICAgICAgICgoZ29hbENvbHVtbiAhPT0gbnVsbCAmJiBnb2FsQ29sdW1uICE9PSB2b2lkIDAgPyBnb2FsQ29sdW1uIDogMTY3NzcyMTUgLyogUmFuZ2VGbGFnLk5vR29hbENvbHVtbiAqLykgPDwgNiAvKiBSYW5nZUZsYWcuR29hbENvbHVtbk9mZnNldCAqLykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZWxlY3Rpb24gcmFuZ2UuXG4gICAgKi9cbiAgICBzdGF0aWMgcmFuZ2UoYW5jaG9yLCBoZWFkLCBnb2FsQ29sdW1uLCBiaWRpTGV2ZWwpIHtcbiAgICAgICAgbGV0IGZsYWdzID0gKChnb2FsQ29sdW1uICE9PSBudWxsICYmIGdvYWxDb2x1bW4gIT09IHZvaWQgMCA/IGdvYWxDb2x1bW4gOiAxNjc3NzIxNSAvKiBSYW5nZUZsYWcuTm9Hb2FsQ29sdW1uICovKSA8PCA2IC8qIFJhbmdlRmxhZy5Hb2FsQ29sdW1uT2Zmc2V0ICovKSB8XG4gICAgICAgICAgICAoYmlkaUxldmVsID09IG51bGwgPyA3IDogTWF0aC5taW4oNiwgYmlkaUxldmVsKSk7XG4gICAgICAgIHJldHVybiBoZWFkIDwgYW5jaG9yID8gU2VsZWN0aW9uUmFuZ2UuY3JlYXRlKGhlYWQsIGFuY2hvciwgMzIgLyogUmFuZ2VGbGFnLkludmVydGVkICovIHwgMTYgLyogUmFuZ2VGbGFnLkFzc29jQWZ0ZXIgKi8gfCBmbGFncylcbiAgICAgICAgICAgIDogU2VsZWN0aW9uUmFuZ2UuY3JlYXRlKGFuY2hvciwgaGVhZCwgKGhlYWQgPiBhbmNob3IgPyA4IC8qIFJhbmdlRmxhZy5Bc3NvY0JlZm9yZSAqLyA6IDApIHwgZmxhZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBub3JtYWxpemVkKHJhbmdlcywgbWFpbkluZGV4ID0gMCkge1xuICAgICAgICBsZXQgbWFpbiA9IHJhbmdlc1ttYWluSW5kZXhdO1xuICAgICAgICByYW5nZXMuc29ydCgoYSwgYikgPT4gYS5mcm9tIC0gYi5mcm9tKTtcbiAgICAgICAgbWFpbkluZGV4ID0gcmFuZ2VzLmluZGV4T2YobWFpbik7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZXNbaV0sIHByZXYgPSByYW5nZXNbaSAtIDFdO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVtcHR5ID8gcmFuZ2UuZnJvbSA8PSBwcmV2LnRvIDogcmFuZ2UuZnJvbSA8IHByZXYudG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IHByZXYuZnJvbSwgdG8gPSBNYXRoLm1heChyYW5nZS50bywgcHJldi50byk7XG4gICAgICAgICAgICAgICAgaWYgKGkgPD0gbWFpbkluZGV4KVxuICAgICAgICAgICAgICAgICAgICBtYWluSW5kZXgtLTtcbiAgICAgICAgICAgICAgICByYW5nZXMuc3BsaWNlKC0taSwgMiwgcmFuZ2UuYW5jaG9yID4gcmFuZ2UuaGVhZCA/IEVkaXRvclNlbGVjdGlvbi5yYW5nZSh0bywgZnJvbSkgOiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihyYW5nZXMsIG1haW5JbmRleCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tTZWxlY3Rpb24oc2VsZWN0aW9uLCBkb2NMZW5ndGgpIHtcbiAgICBmb3IgKGxldCByYW5nZSBvZiBzZWxlY3Rpb24ucmFuZ2VzKVxuICAgICAgICBpZiAocmFuZ2UudG8gPiBkb2NMZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlNlbGVjdGlvbiBwb2ludHMgb3V0c2lkZSBvZiBkb2N1bWVudFwiKTtcbn1cblxubGV0IG5leHRJRCA9IDA7XG4vKipcbkEgZmFjZXQgaXMgYSBsYWJlbGVkIHZhbHVlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVkaXRvclxuc3RhdGUuIEl0IHRha2VzIGlucHV0cyBmcm9tIGFueSBudW1iZXIgb2YgZXh0ZW5zaW9ucywgYW5kIGNvbWJpbmVzXG50aG9zZSBpbnRvIGEgc2luZ2xlIG91dHB1dCB2YWx1ZS5cblxuRXhhbXBsZXMgb2YgdXNlcyBvZiBmYWNldHMgYXJlIHRoZSBbdGFiXG5zaXplXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRhYlNpemUpLCBbZWRpdG9yXG5hdHRyaWJ1dGVzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15lZGl0b3JBdHRyaWJ1dGVzKSwgYW5kIFt1cGRhdGVcbmxpc3RlbmVyc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdedXBkYXRlTGlzdGVuZXIpLlxuXG5Ob3RlIHRoYXQgYEZhY2V0YCBpbnN0YW5jZXMgY2FuIGJlIHVzZWQgYW55d2hlcmUgd2hlcmVcbltgRmFjZXRSZWFkZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkZhY2V0UmVhZGVyKSBpcyBleHBlY3RlZC5cbiovXG5jbGFzcyBGYWNldCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21iaW5lLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhcmVJbnB1dCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXJlLCBpc1N0YXRpYywgZW5hYmxlcykge1xuICAgICAgICB0aGlzLmNvbWJpbmUgPSBjb21iaW5lO1xuICAgICAgICB0aGlzLmNvbXBhcmVJbnB1dCA9IGNvbXBhcmVJbnB1dDtcbiAgICAgICAgdGhpcy5jb21wYXJlID0gY29tcGFyZTtcbiAgICAgICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuaWQgPSBuZXh0SUQrKztcbiAgICAgICAgdGhpcy5kZWZhdWx0ID0gY29tYmluZShbXSk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHR5cGVvZiBlbmFibGVzID09IFwiZnVuY3Rpb25cIiA/IGVuYWJsZXModGhpcykgOiBlbmFibGVzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGEgZmFjZXQgcmVhZGVyIGZvciB0aGlzIGZhY2V0LCB3aGljaCBjYW4gYmUgdXNlZCB0b1xuICAgIFtyZWFkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmZhY2V0KSBpdCBidXQgbm90IHRvIGRlZmluZSB2YWx1ZXMgZm9yIGl0LlxuICAgICovXG4gICAgZ2V0IHJlYWRlcigpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBuZXcgZmFjZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgRmFjZXQoY29uZmlnLmNvbWJpbmUgfHwgKChhKSA9PiBhKSwgY29uZmlnLmNvbXBhcmVJbnB1dCB8fCAoKGEsIGIpID0+IGEgPT09IGIpLCBjb25maWcuY29tcGFyZSB8fCAoIWNvbmZpZy5jb21iaW5lID8gc2FtZUFycmF5IDogKGEsIGIpID0+IGEgPT09IGIpLCAhIWNvbmZpZy5zdGF0aWMsIGNvbmZpZy5lbmFibGVzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBhZGRzIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGlzIGZhY2V0LlxuICAgICovXG4gICAgb2YodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWNldFByb3ZpZGVyKFtdLCB0aGlzLCAwIC8qIFByb3ZpZGVyLlN0YXRpYyAqLywgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgY29tcHV0ZXMgYSB2YWx1ZSBmb3IgdGhlIGZhY2V0IGZyb20gYVxuICAgIHN0YXRlLiBZb3UgbXVzdCB0YWtlIGNhcmUgdG8gZGVjbGFyZSB0aGUgcGFydHMgb2YgdGhlIHN0YXRlIHRoYXRcbiAgICB0aGlzIHZhbHVlIGRlcGVuZHMgb24sIHNpbmNlIHlvdXIgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgYWdhaW5cbiAgICBmb3IgYSBuZXcgc3RhdGUgd2hlbiBvbmUgb2YgdGhvc2UgcGFydHMgY2hhbmdlZC5cbiAgICBcbiAgICBJbiBjYXNlcyB3aGVyZSB5b3VyIHZhbHVlIGRlcGVuZHMgb25seSBvbiBhIHNpbmdsZSBmaWVsZCwgeW91J2xsXG4gICAgd2FudCB0byB1c2UgdGhlIFtgZnJvbWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRmFjZXQuZnJvbSkgbWV0aG9kIGluc3RlYWQuXG4gICAgKi9cbiAgICBjb21wdXRlKGRlcHMsIGdldCkge1xuICAgICAgICBpZiAodGhpcy5pc1N0YXRpYylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNvbXB1dGUgYSBzdGF0aWMgZmFjZXRcIik7XG4gICAgICAgIHJldHVybiBuZXcgRmFjZXRQcm92aWRlcihkZXBzLCB0aGlzLCAxIC8qIFByb3ZpZGVyLlNpbmdsZSAqLywgZ2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IGNvbXB1dGVzIHplcm8gb3IgbW9yZSB2YWx1ZXMgZm9yIHRoaXNcbiAgICBmYWNldCBmcm9tIGEgc3RhdGUuXG4gICAgKi9cbiAgICBjb21wdXRlTihkZXBzLCBnZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTdGF0aWMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjb21wdXRlIGEgc3RhdGljIGZhY2V0XCIpO1xuICAgICAgICByZXR1cm4gbmV3IEZhY2V0UHJvdmlkZXIoZGVwcywgdGhpcywgMiAvKiBQcm92aWRlci5NdWx0aSAqLywgZ2V0KTtcbiAgICB9XG4gICAgZnJvbShmaWVsZCwgZ2V0KSB7XG4gICAgICAgIGlmICghZ2V0KVxuICAgICAgICAgICAgZ2V0ID0geCA9PiB4O1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlKFtmaWVsZF0sIHN0YXRlID0+IGdldChzdGF0ZS5maWVsZChmaWVsZCkpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzYW1lQXJyYXkoYSwgYikge1xuICAgIHJldHVybiBhID09IGIgfHwgYS5sZW5ndGggPT0gYi5sZW5ndGggJiYgYS5ldmVyeSgoZSwgaSkgPT4gZSA9PT0gYltpXSk7XG59XG5jbGFzcyBGYWNldFByb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihkZXBlbmRlbmNpZXMsIGZhY2V0LCB0eXBlLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgICAgICAgdGhpcy5mYWNldCA9IGZhY2V0O1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaWQgPSBuZXh0SUQrKztcbiAgICB9XG4gICAgZHluYW1pY1Nsb3QoYWRkcmVzc2VzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGdldHRlciA9IHRoaXMudmFsdWU7XG4gICAgICAgIGxldCBjb21wYXJlID0gdGhpcy5mYWNldC5jb21wYXJlSW5wdXQ7XG4gICAgICAgIGxldCBpZCA9IHRoaXMuaWQsIGlkeCA9IGFkZHJlc3Nlc1tpZF0gPj4gMSwgbXVsdGkgPSB0aGlzLnR5cGUgPT0gMiAvKiBQcm92aWRlci5NdWx0aSAqLztcbiAgICAgICAgbGV0IGRlcERvYyA9IGZhbHNlLCBkZXBTZWwgPSBmYWxzZSwgZGVwQWRkcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZGVwIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICBpZiAoZGVwID09IFwiZG9jXCIpXG4gICAgICAgICAgICAgICAgZGVwRG9jID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRlcCA9PSBcInNlbGVjdGlvblwiKVxuICAgICAgICAgICAgICAgIGRlcFNlbCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmICgoKChfYSA9IGFkZHJlc3Nlc1tkZXAuaWRdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAxKSAmIDEpID09IDApXG4gICAgICAgICAgICAgICAgZGVwQWRkcnMucHVzaChhZGRyZXNzZXNbZGVwLmlkXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNyZWF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gZ2V0dGVyKHN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlKHN0YXRlLCB0cikge1xuICAgICAgICAgICAgICAgIGlmICgoZGVwRG9jICYmIHRyLmRvY0NoYW5nZWQpIHx8IChkZXBTZWwgJiYgKHRyLmRvY0NoYW5nZWQgfHwgdHIuc2VsZWN0aW9uKSkgfHwgZW5zdXJlQWxsKHN0YXRlLCBkZXBBZGRycykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1ZhbCA9IGdldHRlcihzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aSA/ICFjb21wYXJlQXJyYXkobmV3VmFsLCBzdGF0ZS52YWx1ZXNbaWR4XSwgY29tcGFyZSkgOiAhY29tcGFyZShuZXdWYWwsIHN0YXRlLnZhbHVlc1tpZHhdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVjb25maWd1cmU6IChzdGF0ZSwgb2xkU3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3VmFsLCBvbGRBZGRyID0gb2xkU3RhdGUuY29uZmlnLmFkZHJlc3NbaWRdO1xuICAgICAgICAgICAgICAgIGlmIChvbGRBZGRyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9sZFZhbCA9IGdldEFkZHIob2xkU3RhdGUsIG9sZEFkZHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXMuZXZlcnkoZGVwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXAgaW5zdGFuY2VvZiBGYWNldCA/IG9sZFN0YXRlLmZhY2V0KGRlcCkgPT09IHN0YXRlLmZhY2V0KGRlcCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcCBpbnN0YW5jZW9mIFN0YXRlRmllbGQgPyBvbGRTdGF0ZS5maWVsZChkZXAsIGZhbHNlKSA9PSBzdGF0ZS5maWVsZChkZXAsIGZhbHNlKSA6IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0pIHx8IChtdWx0aSA/IGNvbXBhcmVBcnJheShuZXdWYWwgPSBnZXR0ZXIoc3RhdGUpLCBvbGRWYWwsIGNvbXBhcmUpIDogY29tcGFyZShuZXdWYWwgPSBnZXR0ZXIoc3RhdGUpLCBvbGRWYWwpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRWYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsID0gZ2V0dGVyKHN0YXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXBhcmVBcnJheShhLCBiLCBjb21wYXJlKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIWNvbXBhcmUoYVtpXSwgYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBlbnN1cmVBbGwoc3RhdGUsIGFkZHJzKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBhZGRyIG9mIGFkZHJzKVxuICAgICAgICBpZiAoZW5zdXJlQWRkcihzdGF0ZSwgYWRkcikgJiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLylcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIHJldHVybiBjaGFuZ2VkO1xufVxuZnVuY3Rpb24gZHluYW1pY0ZhY2V0U2xvdChhZGRyZXNzZXMsIGZhY2V0LCBwcm92aWRlcnMpIHtcbiAgICBsZXQgcHJvdmlkZXJBZGRycyA9IHByb3ZpZGVycy5tYXAocCA9PiBhZGRyZXNzZXNbcC5pZF0pO1xuICAgIGxldCBwcm92aWRlclR5cGVzID0gcHJvdmlkZXJzLm1hcChwID0+IHAudHlwZSk7XG4gICAgbGV0IGR5bmFtaWMgPSBwcm92aWRlckFkZHJzLmZpbHRlcihwID0+ICEocCAmIDEpKTtcbiAgICBsZXQgaWR4ID0gYWRkcmVzc2VzW2ZhY2V0LmlkXSA+PiAxO1xuICAgIGZ1bmN0aW9uIGdldChzdGF0ZSkge1xuICAgICAgICBsZXQgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvdmlkZXJBZGRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0QWRkcihzdGF0ZSwgcHJvdmlkZXJBZGRyc1tpXSk7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXJUeXBlc1tpXSA9PSAyIC8qIFByb3ZpZGVyLk11bHRpICovKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHZhbCBvZiB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhY2V0LmNvbWJpbmUodmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBhZGRyIG9mIHByb3ZpZGVyQWRkcnMpXG4gICAgICAgICAgICAgICAgZW5zdXJlQWRkcihzdGF0ZSwgYWRkcik7XG4gICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IGdldChzdGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZShzdGF0ZSwgdHIpIHtcbiAgICAgICAgICAgIGlmICghZW5zdXJlQWxsKHN0YXRlLCBkeW5hbWljKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldChzdGF0ZSk7XG4gICAgICAgICAgICBpZiAoZmFjZXQuY29tcGFyZSh2YWx1ZSwgc3RhdGUudmFsdWVzW2lkeF0pKVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgfSxcbiAgICAgICAgcmVjb25maWd1cmUoc3RhdGUsIG9sZFN0YXRlKSB7XG4gICAgICAgICAgICBsZXQgZGVwQ2hhbmdlZCA9IGVuc3VyZUFsbChzdGF0ZSwgcHJvdmlkZXJBZGRycyk7XG4gICAgICAgICAgICBsZXQgb2xkUHJvdmlkZXJzID0gb2xkU3RhdGUuY29uZmlnLmZhY2V0c1tmYWNldC5pZF0sIG9sZFZhbHVlID0gb2xkU3RhdGUuZmFjZXQoZmFjZXQpO1xuICAgICAgICAgICAgaWYgKG9sZFByb3ZpZGVycyAmJiAhZGVwQ2hhbmdlZCAmJiBzYW1lQXJyYXkocHJvdmlkZXJzLCBvbGRQcm92aWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldChzdGF0ZSk7XG4gICAgICAgICAgICBpZiAoZmFjZXQuY29tcGFyZSh2YWx1ZSwgb2xkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgIH1cbiAgICB9O1xufVxuY29uc3QgaW5pdEZpZWxkID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IHN0YXRpYzogdHJ1ZSB9KTtcbi8qKlxuRmllbGRzIGNhbiBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIGFuIGVkaXRvciBzdGF0ZSwgYW5kXG5rZWVwIGl0IGluIHN5bmMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgc3RhdGUuXG4qL1xuY2xhc3MgU3RhdGVGaWVsZCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpZCwgY3JlYXRlRiwgdXBkYXRlRiwgY29tcGFyZUYsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3BlYykge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuY3JlYXRlRiA9IGNyZWF0ZUY7XG4gICAgICAgIHRoaXMudXBkYXRlRiA9IHVwZGF0ZUY7XG4gICAgICAgIHRoaXMuY29tcGFyZUYgPSBjb21wYXJlRjtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnByb3ZpZGVzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBzdGF0ZSBmaWVsZC5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoY29uZmlnKSB7XG4gICAgICAgIGxldCBmaWVsZCA9IG5ldyBTdGF0ZUZpZWxkKG5leHRJRCsrLCBjb25maWcuY3JlYXRlLCBjb25maWcudXBkYXRlLCBjb25maWcuY29tcGFyZSB8fCAoKGEsIGIpID0+IGEgPT09IGIpLCBjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLnByb3ZpZGUpXG4gICAgICAgICAgICBmaWVsZC5wcm92aWRlcyA9IGNvbmZpZy5wcm92aWRlKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbiAgICBjcmVhdGUoc3RhdGUpIHtcbiAgICAgICAgbGV0IGluaXQgPSBzdGF0ZS5mYWNldChpbml0RmllbGQpLmZpbmQoaSA9PiBpLmZpZWxkID09IHRoaXMpO1xuICAgICAgICByZXR1cm4gKChpbml0ID09PSBudWxsIHx8IGluaXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGluaXQuY3JlYXRlKSB8fCB0aGlzLmNyZWF0ZUYpKHN0YXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzbG90KGFkZHJlc3Nlcykge1xuICAgICAgICBsZXQgaWR4ID0gYWRkcmVzc2VzW3RoaXMuaWRdID4+IDE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjcmVhdGU6IChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdGhpcy5jcmVhdGUoc3RhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGU6IChzdGF0ZSwgdHIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgb2xkVmFsID0gc3RhdGUudmFsdWVzW2lkeF07XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy51cGRhdGVGKG9sZFZhbCwgdHIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhcmVGKG9sZFZhbCwgdmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWNvbmZpZ3VyZTogKHN0YXRlLCBvbGRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpbml0ID0gc3RhdGUuZmFjZXQoaW5pdEZpZWxkKSwgb2xkSW5pdCA9IG9sZFN0YXRlLmZhY2V0KGluaXRGaWVsZCksIHJlSW5pdDtcbiAgICAgICAgICAgICAgICBpZiAoKHJlSW5pdCA9IGluaXQuZmluZChpID0+IGkuZmllbGQgPT0gdGhpcykpICYmIHJlSW5pdCAhPSBvbGRJbml0LmZpbmQoaSA9PiBpLmZpZWxkID09IHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gcmVJbml0LmNyZWF0ZShzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlLmNvbmZpZy5hZGRyZXNzW3RoaXMuaWRdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRTdGF0ZS5maWVsZCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdGhpcy5jcmVhdGUoc3RhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBlbmFibGVzIHRoaXMgZmllbGQgYW5kIG92ZXJyaWRlcyB0aGVcbiAgICB3YXkgaXQgaXMgaW5pdGlhbGl6ZWQuIENhbiBiZSB1c2VmdWwgd2hlbiB5b3UgbmVlZCB0byBwcm92aWRlIGFcbiAgICBub24tZGVmYXVsdCBzdGFydGluZyB2YWx1ZSBmb3IgdGhlIGZpZWxkLlxuICAgICovXG4gICAgaW5pdChjcmVhdGUpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLCBpbml0RmllbGQub2YoeyBmaWVsZDogdGhpcywgY3JlYXRlIH0pXTtcbiAgICB9XG4gICAgLyoqXG4gICAgU3RhdGUgZmllbGQgaW5zdGFuY2VzIGNhbiBiZSB1c2VkIGFzXG4gICAgW2BFeHRlbnNpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkV4dGVuc2lvbikgdmFsdWVzIHRvIGVuYWJsZSB0aGUgZmllbGQgaW4gYVxuICAgIGdpdmVuIHN0YXRlLlxuICAgICovXG4gICAgZ2V0IGV4dGVuc2lvbigpIHsgcmV0dXJuIHRoaXM7IH1cbn1cbmNvbnN0IFByZWNfID0geyBsb3dlc3Q6IDQsIGxvdzogMywgZGVmYXVsdDogMiwgaGlnaDogMSwgaGlnaGVzdDogMCB9O1xuZnVuY3Rpb24gcHJlYyh2YWx1ZSkge1xuICAgIHJldHVybiAoZXh0KSA9PiBuZXcgUHJlY0V4dGVuc2lvbihleHQsIHZhbHVlKTtcbn1cbi8qKlxuQnkgZGVmYXVsdCBleHRlbnNpb25zIGFyZSByZWdpc3RlcmVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSBmb3VuZFxuaW4gdGhlIGZsYXR0ZW5lZCBmb3JtIG9mIG5lc3RlZCBhcnJheSB0aGF0IHdhcyBwcm92aWRlZC5cbkluZGl2aWR1YWwgZXh0ZW5zaW9uIHZhbHVlcyBjYW4gYmUgYXNzaWduZWQgYSBwcmVjZWRlbmNlIHRvXG5vdmVycmlkZSB0aGlzLiBFeHRlbnNpb25zIHRoYXQgZG8gbm90IGhhdmUgYSBwcmVjZWRlbmNlIHNldCBnZXRcbnRoZSBwcmVjZWRlbmNlIG9mIHRoZSBuZWFyZXN0IHBhcmVudCB3aXRoIGEgcHJlY2VkZW5jZSwgb3JcbltgZGVmYXVsdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUHJlYy5kZWZhdWx0KSBpZiB0aGVyZSBpcyBubyBzdWNoIHBhcmVudC4gVGhlXG5maW5hbCBvcmRlcmluZyBvZiBleHRlbnNpb25zIGlzIGRldGVybWluZWQgYnkgZmlyc3Qgc29ydGluZyBieVxucHJlY2VkZW5jZSBhbmQgdGhlbiBieSBvcmRlciB3aXRoaW4gZWFjaCBwcmVjZWRlbmNlLlxuKi9cbmNvbnN0IFByZWMgPSB7XG4gICAgLyoqXG4gICAgVGhlIGhpZ2hlc3QgcHJlY2VkZW5jZSBsZXZlbCwgZm9yIGV4dGVuc2lvbnMgdGhhdCBzaG91bGQgZW5kIHVwXG4gICAgbmVhciB0aGUgc3RhcnQgb2YgdGhlIHByZWNlZGVuY2Ugb3JkZXJpbmcuXG4gICAgKi9cbiAgICBoaWdoZXN0OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5oaWdoZXN0KSxcbiAgICAvKipcbiAgICBBIGhpZ2hlci10aGFuLWRlZmF1bHQgcHJlY2VkZW5jZSwgZm9yIGV4dGVuc2lvbnMgdGhhdCBzaG91bGRcbiAgICBjb21lIGJlZm9yZSB0aG9zZSB3aXRoIGRlZmF1bHQgcHJlY2VkZW5jZS5cbiAgICAqL1xuICAgIGhpZ2g6IC8qQF9fUFVSRV9fKi9wcmVjKFByZWNfLmhpZ2gpLFxuICAgIC8qKlxuICAgIFRoZSBkZWZhdWx0IHByZWNlZGVuY2UsIHdoaWNoIGlzIGFsc28gdXNlZCBmb3IgZXh0ZW5zaW9uc1xuICAgIHdpdGhvdXQgYW4gZXhwbGljaXQgcHJlY2VkZW5jZS5cbiAgICAqL1xuICAgIGRlZmF1bHQ6IC8qQF9fUFVSRV9fKi9wcmVjKFByZWNfLmRlZmF1bHQpLFxuICAgIC8qKlxuICAgIEEgbG93ZXItdGhhbi1kZWZhdWx0IHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBsb3c6IC8qQF9fUFVSRV9fKi9wcmVjKFByZWNfLmxvdyksXG4gICAgLyoqXG4gICAgVGhlIGxvd2VzdCBwcmVjZWRlbmNlIGxldmVsLiBNZWFudCBmb3IgdGhpbmdzIHRoYXQgc2hvdWxkIGVuZCB1cFxuICAgIG5lYXIgdGhlIGVuZCBvZiB0aGUgZXh0ZW5zaW9uIG9yZGVyLlxuICAgICovXG4gICAgbG93ZXN0OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5sb3dlc3QpXG59O1xuY2xhc3MgUHJlY0V4dGVuc2lvbiB7XG4gICAgY29uc3RydWN0b3IoaW5uZXIsIHByZWMpIHtcbiAgICAgICAgdGhpcy5pbm5lciA9IGlubmVyO1xuICAgICAgICB0aGlzLnByZWMgPSBwcmVjO1xuICAgIH1cbn1cbi8qKlxuRXh0ZW5zaW9uIGNvbXBhcnRtZW50cyBjYW4gYmUgdXNlZCB0byBtYWtlIGEgY29uZmlndXJhdGlvblxuZHluYW1pYy4gQnkgW3dyYXBwaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNvbXBhcnRtZW50Lm9mKSBwYXJ0IG9mIHlvdXJcbmNvbmZpZ3VyYXRpb24gaW4gYSBjb21wYXJ0bWVudCwgeW91IGNhbiBsYXRlclxuW3JlcGxhY2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ29tcGFydG1lbnQucmVjb25maWd1cmUpIHRoYXQgcGFydCB0aHJvdWdoIGFcbnRyYW5zYWN0aW9uLlxuKi9cbmNsYXNzIENvbXBhcnRtZW50IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjb21wYXJ0bWVudCB0byBhZGQgdG8geW91ciBbc3RhdGVcbiAgICBjb25maWd1cmF0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlQ29uZmlnLmV4dGVuc2lvbnMpLlxuICAgICovXG4gICAgb2YoZXh0KSB7IHJldHVybiBuZXcgQ29tcGFydG1lbnRJbnN0YW5jZSh0aGlzLCBleHQpOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIFtlZmZlY3RdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpIHRoYXRcbiAgICByZWNvbmZpZ3VyZXMgdGhpcyBjb21wYXJ0bWVudC5cbiAgICAqL1xuICAgIHJlY29uZmlndXJlKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIENvbXBhcnRtZW50LnJlY29uZmlndXJlLm9mKHsgY29tcGFydG1lbnQ6IHRoaXMsIGV4dGVuc2lvbjogY29udGVudCB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIGNvbXBhcnRtZW50IGluIHRoZSBzdGF0ZSwgb3JcbiAgICBgdW5kZWZpbmVkYCBpZiBpdCBpc24ndCBwcmVzZW50LlxuICAgICovXG4gICAgZ2V0KHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5jb25maWcuY29tcGFydG1lbnRzLmdldCh0aGlzKTtcbiAgICB9XG59XG5jbGFzcyBDb21wYXJ0bWVudEluc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3Rvcihjb21wYXJ0bWVudCwgaW5uZXIpIHtcbiAgICAgICAgdGhpcy5jb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50O1xuICAgICAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gICAgfVxufVxuY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgY29tcGFydG1lbnRzLCBkeW5hbWljU2xvdHMsIGFkZHJlc3MsIHN0YXRpY1ZhbHVlcywgZmFjZXRzKSB7XG4gICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgICAgIHRoaXMuY29tcGFydG1lbnRzID0gY29tcGFydG1lbnRzO1xuICAgICAgICB0aGlzLmR5bmFtaWNTbG90cyA9IGR5bmFtaWNTbG90cztcbiAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgICAgICAgdGhpcy5zdGF0aWNWYWx1ZXMgPSBzdGF0aWNWYWx1ZXM7XG4gICAgICAgIHRoaXMuZmFjZXRzID0gZmFjZXRzO1xuICAgICAgICB0aGlzLnN0YXR1c1RlbXBsYXRlID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnN0YXR1c1RlbXBsYXRlLmxlbmd0aCA8IGR5bmFtaWNTbG90cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RlbXBsYXRlLnB1c2goMCAvKiBTbG90U3RhdHVzLlVucmVzb2x2ZWQgKi8pO1xuICAgIH1cbiAgICBzdGF0aWNGYWNldChmYWNldCkge1xuICAgICAgICBsZXQgYWRkciA9IHRoaXMuYWRkcmVzc1tmYWNldC5pZF07XG4gICAgICAgIHJldHVybiBhZGRyID09IG51bGwgPyBmYWNldC5kZWZhdWx0IDogdGhpcy5zdGF0aWNWYWx1ZXNbYWRkciA+PiAxXTtcbiAgICB9XG4gICAgc3RhdGljIHJlc29sdmUoYmFzZSwgY29tcGFydG1lbnRzLCBvbGRTdGF0ZSkge1xuICAgICAgICBsZXQgZmllbGRzID0gW107XG4gICAgICAgIGxldCBmYWNldHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBsZXQgbmV3Q29tcGFydG1lbnRzID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGxldCBleHQgb2YgZmxhdHRlbihiYXNlLCBjb21wYXJ0bWVudHMsIG5ld0NvbXBhcnRtZW50cykpIHtcbiAgICAgICAgICAgIGlmIChleHQgaW5zdGFuY2VvZiBTdGF0ZUZpZWxkKVxuICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGV4dCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgKGZhY2V0c1tleHQuZmFjZXQuaWRdIHx8IChmYWNldHNbZXh0LmZhY2V0LmlkXSA9IFtdKSkucHVzaChleHQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhZGRyZXNzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IHN0YXRpY1ZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgZHluYW1pY1Nsb3RzID0gW107XG4gICAgICAgIGZvciAobGV0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICAgICAgYWRkcmVzc1tmaWVsZC5pZF0gPSBkeW5hbWljU2xvdHMubGVuZ3RoIDw8IDE7XG4gICAgICAgICAgICBkeW5hbWljU2xvdHMucHVzaChhID0+IGZpZWxkLnNsb3QoYSkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvbGRGYWNldHMgPSBvbGRTdGF0ZSA9PT0gbnVsbCB8fCBvbGRTdGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2xkU3RhdGUuY29uZmlnLmZhY2V0cztcbiAgICAgICAgZm9yIChsZXQgaWQgaW4gZmFjZXRzKSB7XG4gICAgICAgICAgICBsZXQgcHJvdmlkZXJzID0gZmFjZXRzW2lkXSwgZmFjZXQgPSBwcm92aWRlcnNbMF0uZmFjZXQ7XG4gICAgICAgICAgICBsZXQgb2xkUHJvdmlkZXJzID0gb2xkRmFjZXRzICYmIG9sZEZhY2V0c1tpZF0gfHwgW107XG4gICAgICAgICAgICBpZiAocHJvdmlkZXJzLmV2ZXJ5KHAgPT4gcC50eXBlID09IDAgLyogUHJvdmlkZXIuU3RhdGljICovKSkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3NbZmFjZXQuaWRdID0gKHN0YXRpY1ZhbHVlcy5sZW5ndGggPDwgMSkgfCAxO1xuICAgICAgICAgICAgICAgIGlmIChzYW1lQXJyYXkob2xkUHJvdmlkZXJzLCBwcm92aWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY1ZhbHVlcy5wdXNoKG9sZFN0YXRlLmZhY2V0KGZhY2V0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBmYWNldC5jb21iaW5lKHByb3ZpZGVycy5tYXAocCA9PiBwLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY1ZhbHVlcy5wdXNoKG9sZFN0YXRlICYmIGZhY2V0LmNvbXBhcmUodmFsdWUsIG9sZFN0YXRlLmZhY2V0KGZhY2V0KSkgPyBvbGRTdGF0ZS5mYWNldChmYWNldCkgOiB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCBvZiBwcm92aWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAudHlwZSA9PSAwIC8qIFByb3ZpZGVyLlN0YXRpYyAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1twLmlkXSA9IChzdGF0aWNWYWx1ZXMubGVuZ3RoIDw8IDEpIHwgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY1ZhbHVlcy5wdXNoKHAudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1twLmlkXSA9IGR5bmFtaWNTbG90cy5sZW5ndGggPDwgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTbG90cy5wdXNoKGEgPT4gcC5keW5hbWljU2xvdChhKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkcmVzc1tmYWNldC5pZF0gPSBkeW5hbWljU2xvdHMubGVuZ3RoIDw8IDE7XG4gICAgICAgICAgICAgICAgZHluYW1pY1Nsb3RzLnB1c2goYSA9PiBkeW5hbWljRmFjZXRTbG90KGEsIGZhY2V0LCBwcm92aWRlcnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZHluYW1pYyA9IGR5bmFtaWNTbG90cy5tYXAoZiA9PiBmKGFkZHJlc3MpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uKGJhc2UsIG5ld0NvbXBhcnRtZW50cywgZHluYW1pYywgYWRkcmVzcywgc3RhdGljVmFsdWVzLCBmYWNldHMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZsYXR0ZW4oZXh0ZW5zaW9uLCBjb21wYXJ0bWVudHMsIG5ld0NvbXBhcnRtZW50cykge1xuICAgIGxldCByZXN1bHQgPSBbW10sIFtdLCBbXSwgW10sIFtdXTtcbiAgICBsZXQgc2VlbiA9IG5ldyBNYXAoKTtcbiAgICBmdW5jdGlvbiBpbm5lcihleHQsIHByZWMpIHtcbiAgICAgICAgbGV0IGtub3duID0gc2Vlbi5nZXQoZXh0KTtcbiAgICAgICAgaWYgKGtub3duICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChrbm93biA8PSBwcmVjKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IHJlc3VsdFtrbm93bl0uaW5kZXhPZihleHQpO1xuICAgICAgICAgICAgaWYgKGZvdW5kID4gLTEpXG4gICAgICAgICAgICAgICAgcmVzdWx0W2tub3duXS5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgICAgICAgaWYgKGV4dCBpbnN0YW5jZW9mIENvbXBhcnRtZW50SW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgbmV3Q29tcGFydG1lbnRzLmRlbGV0ZShleHQuY29tcGFydG1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHNlZW4uc2V0KGV4dCwgcHJlYyk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4dCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGUgb2YgZXh0KVxuICAgICAgICAgICAgICAgIGlubmVyKGUsIHByZWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4dCBpbnN0YW5jZW9mIENvbXBhcnRtZW50SW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGlmIChuZXdDb21wYXJ0bWVudHMuaGFzKGV4dC5jb21wYXJ0bWVudCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYER1cGxpY2F0ZSB1c2Ugb2YgY29tcGFydG1lbnQgaW4gZXh0ZW5zaW9uc2ApO1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBjb21wYXJ0bWVudHMuZ2V0KGV4dC5jb21wYXJ0bWVudCkgfHwgZXh0LmlubmVyO1xuICAgICAgICAgICAgbmV3Q29tcGFydG1lbnRzLnNldChleHQuY29tcGFydG1lbnQsIGNvbnRlbnQpO1xuICAgICAgICAgICAgaW5uZXIoY29udGVudCwgcHJlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0IGluc3RhbmNlb2YgUHJlY0V4dGVuc2lvbikge1xuICAgICAgICAgICAgaW5uZXIoZXh0LmlubmVyLCBleHQucHJlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0IGluc3RhbmNlb2YgU3RhdGVGaWVsZCkge1xuICAgICAgICAgICAgcmVzdWx0W3ByZWNdLnB1c2goZXh0KTtcbiAgICAgICAgICAgIGlmIChleHQucHJvdmlkZXMpXG4gICAgICAgICAgICAgICAgaW5uZXIoZXh0LnByb3ZpZGVzLCBwcmVjKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHQgaW5zdGFuY2VvZiBGYWNldFByb3ZpZGVyKSB7XG4gICAgICAgICAgICByZXN1bHRbcHJlY10ucHVzaChleHQpO1xuICAgICAgICAgICAgaWYgKGV4dC5mYWNldC5leHRlbnNpb25zKVxuICAgICAgICAgICAgICAgIGlubmVyKGV4dC5mYWNldC5leHRlbnNpb25zLCBQcmVjXy5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gZXh0LmV4dGVuc2lvbjtcbiAgICAgICAgICAgIGlmICghY29udGVudClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBleHRlbnNpb24gdmFsdWUgaW4gZXh0ZW5zaW9uIHNldCAoJHtleHR9KS4gVGhpcyBzb21ldGltZXMgaGFwcGVucyBiZWNhdXNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBAY29kZW1pcnJvci9zdGF0ZSBhcmUgbG9hZGVkLCBicmVha2luZyBpbnN0YW5jZW9mIGNoZWNrcy5gKTtcbiAgICAgICAgICAgIGlubmVyKGNvbnRlbnQsIHByZWMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlubmVyKGV4dGVuc2lvbiwgUHJlY18uZGVmYXVsdCk7XG4gICAgcmV0dXJuIHJlc3VsdC5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpKTtcbn1cbmZ1bmN0aW9uIGVuc3VyZUFkZHIoc3RhdGUsIGFkZHIpIHtcbiAgICBpZiAoYWRkciAmIDEpXG4gICAgICAgIHJldHVybiAyIC8qIFNsb3RTdGF0dXMuQ29tcHV0ZWQgKi87XG4gICAgbGV0IGlkeCA9IGFkZHIgPj4gMTtcbiAgICBsZXQgc3RhdHVzID0gc3RhdGUuc3RhdHVzW2lkeF07XG4gICAgaWYgKHN0YXR1cyA9PSA0IC8qIFNsb3RTdGF0dXMuQ29tcHV0aW5nICovKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDeWNsaWMgZGVwZW5kZW5jeSBiZXR3ZWVuIGZpZWxkcyBhbmQvb3IgZmFjZXRzXCIpO1xuICAgIGlmIChzdGF0dXMgJiAyIC8qIFNsb3RTdGF0dXMuQ29tcHV0ZWQgKi8pXG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgc3RhdGUuc3RhdHVzW2lkeF0gPSA0IC8qIFNsb3RTdGF0dXMuQ29tcHV0aW5nICovO1xuICAgIGxldCBjaGFuZ2VkID0gc3RhdGUuY29tcHV0ZVNsb3Qoc3RhdGUsIHN0YXRlLmNvbmZpZy5keW5hbWljU2xvdHNbaWR4XSk7XG4gICAgcmV0dXJuIHN0YXRlLnN0YXR1c1tpZHhdID0gMiAvKiBTbG90U3RhdHVzLkNvbXB1dGVkICovIHwgY2hhbmdlZDtcbn1cbmZ1bmN0aW9uIGdldEFkZHIoc3RhdGUsIGFkZHIpIHtcbiAgICByZXR1cm4gYWRkciAmIDEgPyBzdGF0ZS5jb25maWcuc3RhdGljVmFsdWVzW2FkZHIgPj4gMV0gOiBzdGF0ZS52YWx1ZXNbYWRkciA+PiAxXTtcbn1cblxuY29uc3QgbGFuZ3VhZ2VEYXRhID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUodiA9PiB2KSxcbiAgICBzdGF0aWM6IHRydWVcbn0pO1xuY29uc3QgbGluZVNlcGFyYXRvciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogdW5kZWZpbmVkLFxuICAgIHN0YXRpYzogdHJ1ZVxufSk7XG5jb25zdCBjaGFuZ2VGaWx0ZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCB0cmFuc2FjdGlvbkZpbHRlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IHRyYW5zYWN0aW9uRXh0ZW5kZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCByZWFkT25seSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogZmFsc2Vcbn0pO1xuXG4vKipcbkFubm90YXRpb25zIGFyZSB0YWdnZWQgdmFsdWVzIHRoYXQgYXJlIHVzZWQgdG8gYWRkIG1ldGFkYXRhIHRvXG50cmFuc2FjdGlvbnMgaW4gYW4gZXh0ZW5zaWJsZSB3YXkuIFRoZXkgc2hvdWxkIGJlIHVzZWQgdG8gbW9kZWxcbnRoaW5ncyB0aGF0IGVmZmVjdCB0aGUgZW50aXJlIHRyYW5zYWN0aW9uIChzdWNoIGFzIGl0cyBbdGltZVxuc3RhbXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25edGltZSkgb3IgaW5mb3JtYXRpb24gYWJvdXQgaXRzXG5bb3JpZ2luXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uXnVzZXJFdmVudCkpLiBGb3IgZWZmZWN0cyB0aGF0IGhhcHBlblxuX2Fsb25nc2lkZV8gdGhlIG90aGVyIGNoYW5nZXMgbWFkZSBieSB0aGUgdHJhbnNhY3Rpb24sIFtzdGF0ZVxuZWZmZWN0c10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdCkgYXJlIG1vcmUgYXBwcm9wcmlhdGUuXG4qL1xuY2xhc3MgQW5ub3RhdGlvbiB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgYW5ub3RhdGlvbiB0eXBlLlxuICAgICovXG4gICAgdHlwZSwgXG4gICAgLyoqXG4gICAgVGhlIHZhbHVlIG9mIHRoaXMgYW5ub3RhdGlvbi5cbiAgICAqL1xuICAgIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbmV3IHR5cGUgb2YgYW5ub3RhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoKSB7IHJldHVybiBuZXcgQW5ub3RhdGlvblR5cGUoKTsgfVxufVxuLyoqXG5NYXJrZXIgdGhhdCBpZGVudGlmaWVzIGEgdHlwZSBvZiBbYW5ub3RhdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5Bbm5vdGF0aW9uKS5cbiovXG5jbGFzcyBBbm5vdGF0aW9uVHlwZSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgYW5ub3RhdGlvbi5cbiAgICAqL1xuICAgIG9mKHZhbHVlKSB7IHJldHVybiBuZXcgQW5ub3RhdGlvbih0aGlzLCB2YWx1ZSk7IH1cbn1cbi8qKlxuUmVwcmVzZW50YXRpb24gb2YgYSB0eXBlIG9mIHN0YXRlIGVmZmVjdC4gRGVmaW5lZCB3aXRoXG5bYFN0YXRlRWZmZWN0LmRlZmluZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3ReZGVmaW5lKS5cbiovXG5jbGFzcyBTdGF0ZUVmZmVjdFR5cGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhlIGBhbnlgIHR5cGVzIGluIHRoZXNlIGZ1bmN0aW9uIHR5cGVzIGFyZSB0aGVyZSB0byB3b3JrXG4gICAgLy8gYXJvdW5kIFR5cGVTY3JpcHQgaXNzdWUgIzM3NjMxLCB3aGVyZSB0aGUgdHlwZSBndWFyZCBvblxuICAgIC8vIGBTdGF0ZUVmZmVjdC5pc2AgbXlzdGVyaW91c2x5IHN0b3BzIHdvcmtpbmcgd2hlbiB0aGVzZSBwcm9wZXJseVxuICAgIC8vIGhhdmUgdHlwZSBgVmFsdWVgLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWFwKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbc3RhdGUgZWZmZWN0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0KSBpbnN0YW5jZSBvZiB0aGlzXG4gICAgdHlwZS5cbiAgICAqL1xuICAgIG9mKHZhbHVlKSB7IHJldHVybiBuZXcgU3RhdGVFZmZlY3QodGhpcywgdmFsdWUpOyB9XG59XG4vKipcblN0YXRlIGVmZmVjdHMgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGFkZGl0aW9uYWwgZWZmZWN0c1xuYXNzb2NpYXRlZCB3aXRoIGEgW3RyYW5zYWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLmVmZmVjdHMpLiBUaGV5XG5hcmUgb2Z0ZW4gdXNlZnVsIHRvIG1vZGVsIGNoYW5nZXMgdG8gY3VzdG9tIFtzdGF0ZVxuZmllbGRzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRmllbGQpLCB3aGVuIHRob3NlIGNoYW5nZXMgYXJlbid0IGltcGxpY2l0IGluXG5kb2N1bWVudCBvciBzZWxlY3Rpb24gY2hhbmdlcy5cbiovXG5jbGFzcyBTdGF0ZUVmZmVjdCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBvZiB0aGlzIGVmZmVjdC5cbiAgICAqL1xuICAgIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIHRoaXMgZWZmZWN0IHRocm91Z2ggYSBwb3NpdGlvbiBtYXBwaW5nLiBXaWxsIHJldHVyblxuICAgIGB1bmRlZmluZWRgIHdoZW4gdGhhdCBlbmRzIHVwIGRlbGV0aW5nIHRoZSBlZmZlY3QuXG4gICAgKi9cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgbWFwcGVkID0gdGhpcy50eXBlLm1hcCh0aGlzLnZhbHVlLCBtYXBwaW5nKTtcbiAgICAgICAgcmV0dXJuIG1hcHBlZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbWFwcGVkID09IHRoaXMudmFsdWUgPyB0aGlzIDogbmV3IFN0YXRlRWZmZWN0KHRoaXMudHlwZSwgbWFwcGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhpcyBlZmZlY3Qgb2JqZWN0IGlzIG9mIGEgZ2l2ZW5cbiAgICBbdHlwZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdFR5cGUpLlxuICAgICovXG4gICAgaXModHlwZSkgeyByZXR1cm4gdGhpcy50eXBlID09IHR5cGU7IH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBuZXcgZWZmZWN0IHR5cGUuIFRoZSB0eXBlIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIHR5cGVcbiAgICBvZiB2YWx1ZXMgdGhhdCBoaXMgZWZmZWN0IGhvbGRzLiBJdCBzaG91bGQgYmUgYSB0eXBlIHRoYXRcbiAgICBkb2Vzbid0IGluY2x1ZGUgYHVuZGVmaW5lZGAsIHNpbmNlIHRoYXQgaXMgdXNlZCBpblxuICAgIFttYXBwaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0Lm1hcCkgdG8gaW5kaWNhdGUgdGhhdCBhbiBlZmZlY3QgaXNcbiAgICByZW1vdmVkLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShzcGVjID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZUVmZmVjdFR5cGUoc3BlYy5tYXAgfHwgKHYgPT4gdikpO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgYW4gYXJyYXkgb2YgZWZmZWN0cyB0aHJvdWdoIGEgY2hhbmdlIHNldC5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXBFZmZlY3RzKGVmZmVjdHMsIG1hcHBpbmcpIHtcbiAgICAgICAgaWYgKCFlZmZlY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBlZmZlY3RzO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGVmZmVjdCBvZiBlZmZlY3RzKSB7XG4gICAgICAgICAgICBsZXQgbWFwcGVkID0gZWZmZWN0Lm1hcChtYXBwaW5nKTtcbiAgICAgICAgICAgIGlmIChtYXBwZWQpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobWFwcGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuVGhpcyBlZmZlY3QgY2FuIGJlIHVzZWQgdG8gcmVjb25maWd1cmUgdGhlIHJvb3QgZXh0ZW5zaW9ucyBvZlxudGhlIGVkaXRvci4gRG9pbmcgdGhpcyB3aWxsIGRpc2NhcmQgYW55IGV4dGVuc2lvbnNcblthcHBlbmRlZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdF5hcHBlbmRDb25maWcpLCBidXQgZG9lcyBub3QgcmVzZXRcbnRoZSBjb250ZW50IG9mIFtyZWNvbmZpZ3VyZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ29tcGFydG1lbnQucmVjb25maWd1cmUpXG5jb21wYXJ0bWVudHMuXG4qL1xuU3RhdGVFZmZlY3QucmVjb25maWd1cmUgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4vKipcbkFwcGVuZCBleHRlbnNpb25zIHRvIHRoZSB0b3AtbGV2ZWwgY29uZmlndXJhdGlvbiBvZiB0aGUgZWRpdG9yLlxuKi9cblN0YXRlRWZmZWN0LmFwcGVuZENvbmZpZyA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbi8qKlxuQ2hhbmdlcyB0byB0aGUgZWRpdG9yIHN0YXRlIGFyZSBncm91cGVkIGludG8gdHJhbnNhY3Rpb25zLlxuVHlwaWNhbGx5LCBhIHVzZXIgYWN0aW9uIGNyZWF0ZXMgYSBzaW5nbGUgdHJhbnNhY3Rpb24sIHdoaWNoIG1heVxuY29udGFpbiBhbnkgbnVtYmVyIG9mIGRvY3VtZW50IGNoYW5nZXMsIG1heSBjaGFuZ2UgdGhlIHNlbGVjdGlvbixcbm9yIGhhdmUgb3RoZXIgZWZmZWN0cy4gQ3JlYXRlIGEgdHJhbnNhY3Rpb24gYnkgY2FsbGluZ1xuW2BFZGl0b3JTdGF0ZS51cGRhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnVwZGF0ZSksIG9yIGltbWVkaWF0ZWx5XG5kaXNwYXRjaCBvbmUgYnkgY2FsbGluZ1xuW2BFZGl0b3JWaWV3LmRpc3BhdGNoYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGlzcGF0Y2gpLlxuKi9cbmNsYXNzIFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhdGUgZnJvbSB3aGljaCB0aGUgdHJhbnNhY3Rpb24gc3RhcnRzLlxuICAgICovXG4gICAgc3RhcnRTdGF0ZSwgXG4gICAgLyoqXG4gICAgVGhlIGRvY3VtZW50IGNoYW5nZXMgbWFkZSBieSB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgY2hhbmdlcywgXG4gICAgLyoqXG4gICAgVGhlIHNlbGVjdGlvbiBzZXQgYnkgdGhpcyB0cmFuc2FjdGlvbiwgb3IgdW5kZWZpbmVkIGlmIGl0XG4gICAgZG9lc24ndCBleHBsaWNpdGx5IHNldCBhIHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIHNlbGVjdGlvbiwgXG4gICAgLyoqXG4gICAgVGhlIGVmZmVjdHMgYWRkZWQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZWZmZWN0cywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhbm5vdGF0aW9ucywgXG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgc2VsZWN0aW9uIHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcgYWZ0ZXIgdGhpc1xuICAgIHRyYW5zYWN0aW9uIGlzIGRpc3BhdGNoZWQuXG4gICAgKi9cbiAgICBzY3JvbGxJbnRvVmlldykge1xuICAgICAgICB0aGlzLnN0YXJ0U3RhdGUgPSBzdGFydFN0YXRlO1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBjaGFuZ2VzO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5lZmZlY3RzID0gZWZmZWN0cztcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zO1xuICAgICAgICB0aGlzLnNjcm9sbEludG9WaWV3ID0gc2Nyb2xsSW50b1ZpZXc7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fZG9jID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IG51bGw7XG4gICAgICAgIGlmIChzZWxlY3Rpb24pXG4gICAgICAgICAgICBjaGVja1NlbGVjdGlvbihzZWxlY3Rpb24sIGNoYW5nZXMubmV3TGVuZ3RoKTtcbiAgICAgICAgaWYgKCFhbm5vdGF0aW9ucy5zb21lKChhKSA9PiBhLnR5cGUgPT0gVHJhbnNhY3Rpb24udGltZSkpXG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuY29uY2F0KFRyYW5zYWN0aW9uLnRpbWUub2YoRGF0ZS5ub3coKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoc3RhcnRTdGF0ZSwgY2hhbmdlcywgc2VsZWN0aW9uLCBlZmZlY3RzLCBhbm5vdGF0aW9ucywgc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbihzdGFydFN0YXRlLCBjaGFuZ2VzLCBzZWxlY3Rpb24sIGVmZmVjdHMsIGFubm90YXRpb25zLCBzY3JvbGxJbnRvVmlldyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBuZXcgZG9jdW1lbnQgcHJvZHVjZWQgYnkgdGhlIHRyYW5zYWN0aW9uLiBDb250cmFyeSB0b1xuICAgIFtgLnN0YXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zdGF0ZSlgLmRvY2AsIGFjY2Vzc2luZyB0aGlzIHdvbid0XG4gICAgZm9yY2UgdGhlIGVudGlyZSBuZXcgc3RhdGUgdG8gYmUgY29tcHV0ZWQgcmlnaHQgYXdheSwgc28gaXQgaXNcbiAgICByZWNvbW1lbmRlZCB0aGF0IFt0cmFuc2FjdGlvblxuICAgIGZpbHRlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedHJhbnNhY3Rpb25GaWx0ZXIpIHVzZSB0aGlzIGdldHRlclxuICAgIHdoZW4gdGhleSBuZWVkIHRvIGxvb2sgYXQgdGhlIG5ldyBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBuZXdEb2MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kb2MgfHwgKHRoaXMuX2RvYyA9IHRoaXMuY2hhbmdlcy5hcHBseSh0aGlzLnN0YXJ0U3RhdGUuZG9jKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBuZXcgc2VsZWN0aW9uIHByb2R1Y2VkIGJ5IHRoZSB0cmFuc2FjdGlvbi4gSWZcbiAgICBbYHRoaXMuc2VsZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zZWxlY3Rpb24pIGlzIHVuZGVmaW5lZCxcbiAgICB0aGlzIHdpbGwgW21hcF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTZWxlY3Rpb24ubWFwKSB0aGUgc3RhcnQgc3RhdGUnc1xuICAgIGN1cnJlbnQgc2VsZWN0aW9uIHRocm91Z2ggdGhlIGNoYW5nZXMgbWFkZSBieSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgKi9cbiAgICBnZXQgbmV3U2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24gfHwgdGhpcy5zdGFydFN0YXRlLnNlbGVjdGlvbi5tYXAodGhpcy5jaGFuZ2VzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIG5ldyBzdGF0ZSBjcmVhdGVkIGJ5IHRoZSB0cmFuc2FjdGlvbi4gQ29tcHV0ZWQgb24gZGVtYW5kXG4gICAgKGJ1dCByZXRhaW5lZCBmb3Igc3Vic2VxdWVudCBhY2Nlc3MpLCBzbyBpdCBpcyByZWNvbW1lbmRlZCBub3QgdG9cbiAgICBhY2Nlc3MgaXQgaW4gW3RyYW5zYWN0aW9uXG4gICAgZmlsdGVyc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50cmFuc2FjdGlvbkZpbHRlcikgd2hlbiBwb3NzaWJsZS5cbiAgICAqL1xuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdGF0ZSlcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTdGF0ZS5hcHBseVRyYW5zYWN0aW9uKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGFubm90YXRpb24gdHlwZSwgaWYgYW55LlxuICAgICovXG4gICAgYW5ub3RhdGlvbih0eXBlKSB7XG4gICAgICAgIGZvciAobGV0IGFubiBvZiB0aGlzLmFubm90YXRpb25zKVxuICAgICAgICAgICAgaWYgKGFubi50eXBlID09IHR5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFubi52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIGNoYW5nZWQgdGhlIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IGRvY0NoYW5nZWQoKSB7IHJldHVybiAhdGhpcy5jaGFuZ2VzLmVtcHR5OyB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc2FjdGlvbiByZWNvbmZpZ3VyZXMgdGhlIHN0YXRlXG4gICAgKHRocm91Z2ggYSBbY29uZmlndXJhdGlvbiBjb21wYXJ0bWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5Db21wYXJ0bWVudCkgb3JcbiAgICB3aXRoIGEgdG9wLWxldmVsIGNvbmZpZ3VyYXRpb25cbiAgICBbZWZmZWN0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0XnJlY29uZmlndXJlKS5cbiAgICAqL1xuICAgIGdldCByZWNvbmZpZ3VyZWQoKSB7IHJldHVybiB0aGlzLnN0YXJ0U3RhdGUuY29uZmlnICE9IHRoaXMuc3RhdGUuY29uZmlnOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgYSBbdXNlclxuICAgIGV2ZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uXnVzZXJFdmVudCkgYW5ub3RhdGlvbiB0aGF0IGlzIGVxdWFsIHRvXG4gICAgb3IgbW9yZSBzcGVjaWZpYyB0aGFuIGBldmVudGAuIEZvciBleGFtcGxlLCBpZiB0aGUgdHJhbnNhY3Rpb25cbiAgICBoYXMgYFwic2VsZWN0LnBvaW50ZXJcImAgYXMgdXNlciBldmVudCwgYFwic2VsZWN0XCJgIGFuZFxuICAgIGBcInNlbGVjdC5wb2ludGVyXCJgIHdpbGwgbWF0Y2ggaXQuXG4gICAgKi9cbiAgICBpc1VzZXJFdmVudChldmVudCkge1xuICAgICAgICBsZXQgZSA9IHRoaXMuYW5ub3RhdGlvbihUcmFuc2FjdGlvbi51c2VyRXZlbnQpO1xuICAgICAgICByZXR1cm4gISEoZSAmJiAoZSA9PSBldmVudCB8fCBlLmxlbmd0aCA+IGV2ZW50Lmxlbmd0aCAmJiBlLnNsaWNlKDAsIGV2ZW50Lmxlbmd0aCkgPT0gZXZlbnQgJiYgZVtldmVudC5sZW5ndGhdID09IFwiLlwiKSk7XG4gICAgfVxufVxuLyoqXG5Bbm5vdGF0aW9uIHVzZWQgdG8gc3RvcmUgdHJhbnNhY3Rpb24gdGltZXN0YW1wcy4gQXV0b21hdGljYWxseVxuYWRkZWQgdG8gZXZlcnkgdHJhbnNhY3Rpb24sIGhvbGRpbmcgYERhdGUubm93KClgLlxuKi9cblRyYW5zYWN0aW9uLnRpbWUgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbi8qKlxuQW5ub3RhdGlvbiB1c2VkIHRvIGFzc29jaWF0ZSBhIHRyYW5zYWN0aW9uIHdpdGggYSB1c2VyIGludGVyZmFjZVxuZXZlbnQuIEhvbGRzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBldmVudCwgdXNpbmcgYVxuZG90LXNlcGFyYXRlZCBmb3JtYXQgdG8gc3VwcG9ydCBhdHRhY2hpbmcgbW9yZSBzcGVjaWZpY1xuaW5mb3JtYXRpb24uIFRoZSBldmVudHMgdXNlZCBieSB0aGUgY29yZSBsaWJyYXJpZXMgYXJlOlxuXG4gLSBgXCJpbnB1dFwiYCB3aGVuIGNvbnRlbnQgaXMgZW50ZXJlZFxuICAgLSBgXCJpbnB1dC50eXBlXCJgIGZvciB0eXBlZCBpbnB1dFxuICAgICAtIGBcImlucHV0LnR5cGUuY29tcG9zZVwiYCBmb3IgY29tcG9zaXRpb25cbiAgIC0gYFwiaW5wdXQucGFzdGVcImAgZm9yIHBhc3RlZCBpbnB1dFxuICAgLSBgXCJpbnB1dC5kcm9wXCJgIHdoZW4gYWRkaW5nIGNvbnRlbnQgd2l0aCBkcmFnLWFuZC1kcm9wXG4gICAtIGBcImlucHV0LmNvbXBsZXRlXCJgIHdoZW4gYXV0b2NvbXBsZXRpbmdcbiAtIGBcImRlbGV0ZVwiYCB3aGVuIHRoZSB1c2VyIGRlbGV0ZXMgY29udGVudFxuICAgLSBgXCJkZWxldGUuc2VsZWN0aW9uXCJgIHdoZW4gZGVsZXRpbmcgdGhlIHNlbGVjdGlvblxuICAgLSBgXCJkZWxldGUuZm9yd2FyZFwiYCB3aGVuIGRlbGV0aW5nIGZvcndhcmQgZnJvbSB0aGUgc2VsZWN0aW9uXG4gICAtIGBcImRlbGV0ZS5iYWNrd2FyZFwiYCB3aGVuIGRlbGV0aW5nIGJhY2t3YXJkIGZyb20gdGhlIHNlbGVjdGlvblxuICAgLSBgXCJkZWxldGUuY3V0XCJgIHdoZW4gY3V0dGluZyB0byB0aGUgY2xpcGJvYXJkXG4gLSBgXCJtb3ZlXCJgIHdoZW4gY29udGVudCBpcyBtb3ZlZFxuICAgLSBgXCJtb3ZlLmRyb3BcImAgd2hlbiBjb250ZW50IGlzIG1vdmVkIHdpdGhpbiB0aGUgZWRpdG9yIHRocm91Z2ggZHJhZy1hbmQtZHJvcFxuIC0gYFwic2VsZWN0XCJgIHdoZW4gZXhwbGljaXRseSBjaGFuZ2luZyB0aGUgc2VsZWN0aW9uXG4gICAtIGBcInNlbGVjdC5wb2ludGVyXCJgIHdoZW4gc2VsZWN0aW5nIHdpdGggYSBtb3VzZSBvciBvdGhlciBwb2ludGluZyBkZXZpY2VcbiAtIGBcInVuZG9cImAgYW5kIGBcInJlZG9cImAgZm9yIGhpc3RvcnkgYWN0aW9uc1xuXG5Vc2UgW2Bpc1VzZXJFdmVudGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uaXNVc2VyRXZlbnQpIHRvIGNoZWNrXG53aGV0aGVyIHRoZSBhbm5vdGF0aW9uIG1hdGNoZXMgYSBnaXZlbiBldmVudC5cbiovXG5UcmFuc2FjdGlvbi51c2VyRXZlbnQgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbi8qKlxuQW5ub3RhdGlvbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWRkZWQgdG9cbnRoZSB1bmRvIGhpc3Rvcnkgb3Igbm90LlxuKi9cblRyYW5zYWN0aW9uLmFkZFRvSGlzdG9yeSA9IC8qQF9fUFVSRV9fKi9Bbm5vdGF0aW9uLmRlZmluZSgpO1xuLyoqXG5Bbm5vdGF0aW9uIGluZGljYXRpbmcgKHdoZW4gcHJlc2VudCBhbmQgdHJ1ZSkgdGhhdCBhIHRyYW5zYWN0aW9uXG5yZXByZXNlbnRzIGEgY2hhbmdlIG1hZGUgYnkgc29tZSBvdGhlciBhY3Rvciwgbm90IHRoZSB1c2VyLiBUaGlzXG5pcyB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gdGFnIG90aGVyIHBlb3BsZSdzIGNoYW5nZXMgaW5cbmNvbGxhYm9yYXRpdmUgZWRpdGluZy5cbiovXG5UcmFuc2FjdGlvbi5yZW1vdGUgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbmZ1bmN0aW9uIGpvaW5SYW5nZXMoYSwgYikge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpQSA9IDAsIGlCID0gMDs7KSB7XG4gICAgICAgIGxldCBmcm9tLCB0bztcbiAgICAgICAgaWYgKGlBIDwgYS5sZW5ndGggJiYgKGlCID09IGIubGVuZ3RoIHx8IGJbaUJdID49IGFbaUFdKSkge1xuICAgICAgICAgICAgZnJvbSA9IGFbaUErK107XG4gICAgICAgICAgICB0byA9IGFbaUErK107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaUIgPCBiLmxlbmd0aCkge1xuICAgICAgICAgICAgZnJvbSA9IGJbaUIrK107XG4gICAgICAgICAgICB0byA9IGJbaUIrK107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoIHx8IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPCBmcm9tKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJvbSwgdG8pO1xuICAgICAgICBlbHNlIGlmIChyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdIDwgdG8pXG4gICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID0gdG87XG4gICAgfVxufVxuZnVuY3Rpb24gbWVyZ2VUcmFuc2FjdGlvbihhLCBiLCBzZXF1ZW50aWFsKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBtYXBGb3JBLCBtYXBGb3JCLCBjaGFuZ2VzO1xuICAgIGlmIChzZXF1ZW50aWFsKSB7XG4gICAgICAgIG1hcEZvckEgPSBiLmNoYW5nZXM7XG4gICAgICAgIG1hcEZvckIgPSBDaGFuZ2VTZXQuZW1wdHkoYi5jaGFuZ2VzLmxlbmd0aCk7XG4gICAgICAgIGNoYW5nZXMgPSBhLmNoYW5nZXMuY29tcG9zZShiLmNoYW5nZXMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbWFwRm9yQSA9IGIuY2hhbmdlcy5tYXAoYS5jaGFuZ2VzKTtcbiAgICAgICAgbWFwRm9yQiA9IGEuY2hhbmdlcy5tYXBEZXNjKGIuY2hhbmdlcywgdHJ1ZSk7XG4gICAgICAgIGNoYW5nZXMgPSBhLmNoYW5nZXMuY29tcG9zZShtYXBGb3JBKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgc2VsZWN0aW9uOiBiLnNlbGVjdGlvbiA/IGIuc2VsZWN0aW9uLm1hcChtYXBGb3JCKSA6IChfYSA9IGEuc2VsZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKG1hcEZvckEpLFxuICAgICAgICBlZmZlY3RzOiBTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGEuZWZmZWN0cywgbWFwRm9yQSkuY29uY2F0KFN0YXRlRWZmZWN0Lm1hcEVmZmVjdHMoYi5lZmZlY3RzLCBtYXBGb3JCKSksXG4gICAgICAgIGFubm90YXRpb25zOiBhLmFubm90YXRpb25zLmxlbmd0aCA/IGEuYW5ub3RhdGlvbnMuY29uY2F0KGIuYW5ub3RhdGlvbnMpIDogYi5hbm5vdGF0aW9ucyxcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXc6IGEuc2Nyb2xsSW50b1ZpZXcgfHwgYi5zY3JvbGxJbnRvVmlld1xuICAgIH07XG59XG5mdW5jdGlvbiByZXNvbHZlVHJhbnNhY3Rpb25Jbm5lcihzdGF0ZSwgc3BlYywgZG9jU2l6ZSkge1xuICAgIGxldCBzZWwgPSBzcGVjLnNlbGVjdGlvbiwgYW5ub3RhdGlvbnMgPSBhc0FycmF5KHNwZWMuYW5ub3RhdGlvbnMpO1xuICAgIGlmIChzcGVjLnVzZXJFdmVudClcbiAgICAgICAgYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucy5jb25jYXQoVHJhbnNhY3Rpb24udXNlckV2ZW50Lm9mKHNwZWMudXNlckV2ZW50KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlczogc3BlYy5jaGFuZ2VzIGluc3RhbmNlb2YgQ2hhbmdlU2V0ID8gc3BlYy5jaGFuZ2VzXG4gICAgICAgICAgICA6IENoYW5nZVNldC5vZihzcGVjLmNoYW5nZXMgfHwgW10sIGRvY1NpemUsIHN0YXRlLmZhY2V0KGxpbmVTZXBhcmF0b3IpKSxcbiAgICAgICAgc2VsZWN0aW9uOiBzZWwgJiYgKHNlbCBpbnN0YW5jZW9mIEVkaXRvclNlbGVjdGlvbiA/IHNlbCA6IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUoc2VsLmFuY2hvciwgc2VsLmhlYWQpKSxcbiAgICAgICAgZWZmZWN0czogYXNBcnJheShzcGVjLmVmZmVjdHMpLFxuICAgICAgICBhbm5vdGF0aW9ucyxcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXc6ICEhc3BlYy5zY3JvbGxJbnRvVmlld1xuICAgIH07XG59XG5mdW5jdGlvbiByZXNvbHZlVHJhbnNhY3Rpb24oc3RhdGUsIHNwZWNzLCBmaWx0ZXIpIHtcbiAgICBsZXQgcyA9IHJlc29sdmVUcmFuc2FjdGlvbklubmVyKHN0YXRlLCBzcGVjcy5sZW5ndGggPyBzcGVjc1swXSA6IHt9LCBzdGF0ZS5kb2MubGVuZ3RoKTtcbiAgICBpZiAoc3BlY3MubGVuZ3RoICYmIHNwZWNzWzBdLmZpbHRlciA9PT0gZmFsc2UpXG4gICAgICAgIGZpbHRlciA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3BlY3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNwZWNzW2ldLmZpbHRlciA9PT0gZmFsc2UpXG4gICAgICAgICAgICBmaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNlcSA9ICEhc3BlY3NbaV0uc2VxdWVudGlhbDtcbiAgICAgICAgcyA9IG1lcmdlVHJhbnNhY3Rpb24ocywgcmVzb2x2ZVRyYW5zYWN0aW9uSW5uZXIoc3RhdGUsIHNwZWNzW2ldLCBzZXEgPyBzLmNoYW5nZXMubmV3TGVuZ3RoIDogc3RhdGUuZG9jLmxlbmd0aCksIHNlcSk7XG4gICAgfVxuICAgIGxldCB0ciA9IFRyYW5zYWN0aW9uLmNyZWF0ZShzdGF0ZSwgcy5jaGFuZ2VzLCBzLnNlbGVjdGlvbiwgcy5lZmZlY3RzLCBzLmFubm90YXRpb25zLCBzLnNjcm9sbEludG9WaWV3KTtcbiAgICByZXR1cm4gZXh0ZW5kVHJhbnNhY3Rpb24oZmlsdGVyID8gZmlsdGVyVHJhbnNhY3Rpb24odHIpIDogdHIpO1xufVxuLy8gRmluaXNoIGEgdHJhbnNhY3Rpb24gYnkgYXBwbHlpbmcgZmlsdGVycyBpZiBuZWNlc3NhcnkuXG5mdW5jdGlvbiBmaWx0ZXJUcmFuc2FjdGlvbih0cikge1xuICAgIGxldCBzdGF0ZSA9IHRyLnN0YXJ0U3RhdGU7XG4gICAgLy8gQ2hhbmdlIGZpbHRlcnNcbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBmaWx0ZXIgb2Ygc3RhdGUuZmFjZXQoY2hhbmdlRmlsdGVyKSkge1xuICAgICAgICBsZXQgdmFsdWUgPSBmaWx0ZXIodHIpO1xuICAgICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gdHJ1ZSA/IHZhbHVlIDogam9pblJhbmdlcyhyZXN1bHQsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICBsZXQgY2hhbmdlcywgYmFjaztcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJhY2sgPSB0ci5jaGFuZ2VzLmludmVydGVkRGVzYztcbiAgICAgICAgICAgIGNoYW5nZXMgPSBDaGFuZ2VTZXQuZW1wdHkoc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZmlsdGVyZWQgPSB0ci5jaGFuZ2VzLmZpbHRlcihyZXN1bHQpO1xuICAgICAgICAgICAgY2hhbmdlcyA9IGZpbHRlcmVkLmNoYW5nZXM7XG4gICAgICAgICAgICBiYWNrID0gZmlsdGVyZWQuZmlsdGVyZWQubWFwRGVzYyhmaWx0ZXJlZC5jaGFuZ2VzKS5pbnZlcnRlZERlc2M7XG4gICAgICAgIH1cbiAgICAgICAgdHIgPSBUcmFuc2FjdGlvbi5jcmVhdGUoc3RhdGUsIGNoYW5nZXMsIHRyLnNlbGVjdGlvbiAmJiB0ci5zZWxlY3Rpb24ubWFwKGJhY2spLCBTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKHRyLmVmZmVjdHMsIGJhY2spLCB0ci5hbm5vdGF0aW9ucywgdHIuc2Nyb2xsSW50b1ZpZXcpO1xuICAgIH1cbiAgICAvLyBUcmFuc2FjdGlvbiBmaWx0ZXJzXG4gICAgbGV0IGZpbHRlcnMgPSBzdGF0ZS5mYWNldCh0cmFuc2FjdGlvbkZpbHRlcik7XG4gICAgZm9yIChsZXQgaSA9IGZpbHRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IGZpbHRlcmVkID0gZmlsdGVyc1tpXSh0cik7XG4gICAgICAgIGlmIChmaWx0ZXJlZCBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uKVxuICAgICAgICAgICAgdHIgPSBmaWx0ZXJlZDtcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJlZCkgJiYgZmlsdGVyZWQubGVuZ3RoID09IDEgJiYgZmlsdGVyZWRbMF0gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbilcbiAgICAgICAgICAgIHRyID0gZmlsdGVyZWRbMF07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRyID0gcmVzb2x2ZVRyYW5zYWN0aW9uKHN0YXRlLCBhc0FycmF5KGZpbHRlcmVkKSwgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdHI7XG59XG5mdW5jdGlvbiBleHRlbmRUcmFuc2FjdGlvbih0cikge1xuICAgIGxldCBzdGF0ZSA9IHRyLnN0YXJ0U3RhdGUsIGV4dGVuZGVycyA9IHN0YXRlLmZhY2V0KHRyYW5zYWN0aW9uRXh0ZW5kZXIpLCBzcGVjID0gdHI7XG4gICAgZm9yIChsZXQgaSA9IGV4dGVuZGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBsZXQgZXh0ZW5zaW9uID0gZXh0ZW5kZXJzW2ldKHRyKTtcbiAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBPYmplY3Qua2V5cyhleHRlbnNpb24pLmxlbmd0aClcbiAgICAgICAgICAgIHNwZWMgPSBtZXJnZVRyYW5zYWN0aW9uKHNwZWMsIHJlc29sdmVUcmFuc2FjdGlvbklubmVyKHN0YXRlLCBleHRlbnNpb24sIHRyLmNoYW5nZXMubmV3TGVuZ3RoKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBzcGVjID09IHRyID8gdHIgOiBUcmFuc2FjdGlvbi5jcmVhdGUoc3RhdGUsIHRyLmNoYW5nZXMsIHRyLnNlbGVjdGlvbiwgc3BlYy5lZmZlY3RzLCBzcGVjLmFubm90YXRpb25zLCBzcGVjLnNjcm9sbEludG9WaWV3KTtcbn1cbmNvbnN0IG5vbmUgPSBbXTtcbmZ1bmN0aW9uIGFzQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IG5vbmUgOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuLyoqXG5UaGUgY2F0ZWdvcmllcyBwcm9kdWNlZCBieSBhIFtjaGFyYWN0ZXJcbmNhdGVnb3JpemVyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmNoYXJDYXRlZ29yaXplcikuIFRoZXNlIGFyZSB1c2VkXG5kbyB0aGluZ3MgbGlrZSBzZWxlY3RpbmcgYnkgd29yZC5cbiovXG52YXIgQ2hhckNhdGVnb3J5ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQ2hhckNhdGVnb3J5KSB7XG4gICAgLyoqXG4gICAgV29yZCBjaGFyYWN0ZXJzLlxuICAgICovXG4gICAgQ2hhckNhdGVnb3J5W0NoYXJDYXRlZ29yeVtcIldvcmRcIl0gPSAwXSA9IFwiV29yZFwiO1xuICAgIC8qKlxuICAgIFdoaXRlc3BhY2UuXG4gICAgKi9cbiAgICBDaGFyQ2F0ZWdvcnlbQ2hhckNhdGVnb3J5W1wiU3BhY2VcIl0gPSAxXSA9IFwiU3BhY2VcIjtcbiAgICAvKipcbiAgICBBbnl0aGluZyBlbHNlLlxuICAgICovXG4gICAgQ2hhckNhdGVnb3J5W0NoYXJDYXRlZ29yeVtcIk90aGVyXCJdID0gMl0gPSBcIk90aGVyXCI7XG5yZXR1cm4gQ2hhckNhdGVnb3J5fSkoQ2hhckNhdGVnb3J5IHx8IChDaGFyQ2F0ZWdvcnkgPSB7fSkpO1xuY29uc3Qgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIgPSAvW1xcdTAwZGZcXHUwNTg3XFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MzA0MC1cXHUzMDlmXFx1MzBhMC1cXHUzMGZmXFx1MzQwMC1cXHU0ZGI1XFx1NGUwMC1cXHU5ZmNjXFx1YWMwMC1cXHVkN2FmXS87XG5sZXQgd29yZENoYXI7XG50cnkge1xuICAgIHdvcmRDaGFyID0gLypAX19QVVJFX18qL25ldyBSZWdFeHAoXCJbXFxcXHB7QWxwaGFiZXRpY31cXFxccHtOdW1iZXJ9X11cIiwgXCJ1XCIpO1xufVxuY2F0Y2ggKF8pIHsgfVxuZnVuY3Rpb24gaGFzV29yZENoYXIoc3RyKSB7XG4gICAgaWYgKHdvcmRDaGFyKVxuICAgICAgICByZXR1cm4gd29yZENoYXIudGVzdChzdHIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaCA9IHN0cltpXTtcbiAgICAgICAgaWYgKC9cXHcvLnRlc3QoY2gpIHx8IGNoID4gXCJcXHg4MFwiICYmIChjaC50b1VwcGVyQ2FzZSgpICE9IGNoLnRvTG93ZXJDYXNlKCkgfHwgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIudGVzdChjaCkpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIG1ha2VDYXRlZ29yaXplcih3b3JkQ2hhcnMpIHtcbiAgICByZXR1cm4gKGNoYXIpID0+IHtcbiAgICAgICAgaWYgKCEvXFxTLy50ZXN0KGNoYXIpKVxuICAgICAgICAgICAgcmV0dXJuIENoYXJDYXRlZ29yeS5TcGFjZTtcbiAgICAgICAgaWYgKGhhc1dvcmRDaGFyKGNoYXIpKVxuICAgICAgICAgICAgcmV0dXJuIENoYXJDYXRlZ29yeS5Xb3JkO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmRDaGFycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChjaGFyLmluZGV4T2Yod29yZENoYXJzW2ldKSA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuV29yZDtcbiAgICAgICAgcmV0dXJuIENoYXJDYXRlZ29yeS5PdGhlcjtcbiAgICB9O1xufVxuXG4vKipcblRoZSBlZGl0b3Igc3RhdGUgY2xhc3MgaXMgYSBwZXJzaXN0ZW50IChpbW11dGFibGUpIGRhdGEgc3RydWN0dXJlLlxuVG8gdXBkYXRlIGEgc3RhdGUsIHlvdSBbY3JlYXRlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnVwZGF0ZSkgYVxuW3RyYW5zYWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uKSwgd2hpY2ggcHJvZHVjZXMgYSBfbmV3XyBzdGF0ZVxuaW5zdGFuY2UsIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBvYmplY3QuXG5cbkFzIHN1Y2gsIF9uZXZlcl8gbXV0YXRlIHByb3BlcnRpZXMgb2YgYSBzdGF0ZSBkaXJlY3RseS4gVGhhdCdsbFxuanVzdCBicmVhayB0aGluZ3MuXG4qL1xuY2xhc3MgRWRpdG9yU3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uZmlnLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBkb2N1bWVudC5cbiAgICAqL1xuICAgIGRvYywgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICAgICovXG4gICAgc2VsZWN0aW9uLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHZhbHVlcywgY29tcHV0ZVNsb3QsIHRyKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IGNvbmZpZy5zdGF0dXNUZW1wbGF0ZS5zbGljZSgpO1xuICAgICAgICB0aGlzLmNvbXB1dGVTbG90ID0gY29tcHV0ZVNsb3Q7XG4gICAgICAgIC8vIEZpbGwgaW4gdGhlIGNvbXB1dGVkIHN0YXRlIGltbWVkaWF0ZWx5LCBzbyB0aGF0IGZ1cnRoZXIgcXVlcmllc1xuICAgICAgICAvLyBmb3IgaXQgbWFkZSBkdXJpbmcgdGhlIHVwZGF0ZSByZXR1cm4gdGhpcyBzdGF0ZVxuICAgICAgICBpZiAodHIpXG4gICAgICAgICAgICB0ci5fc3RhdGUgPSB0aGlzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29uZmlnLmR5bmFtaWNTbG90cy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGVuc3VyZUFkZHIodGhpcywgaSA8PCAxKTtcbiAgICAgICAgdGhpcy5jb21wdXRlU2xvdCA9IG51bGw7XG4gICAgfVxuICAgIGZpZWxkKGZpZWxkLCByZXF1aXJlID0gdHJ1ZSkge1xuICAgICAgICBsZXQgYWRkciA9IHRoaXMuY29uZmlnLmFkZHJlc3NbZmllbGQuaWRdO1xuICAgICAgICBpZiAoYWRkciA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVxdWlyZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkZpZWxkIGlzIG5vdCBwcmVzZW50IGluIHRoaXMgc3RhdGVcIik7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVuc3VyZUFkZHIodGhpcywgYWRkcik7XG4gICAgICAgIHJldHVybiBnZXRBZGRyKHRoaXMsIGFkZHIpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbdHJhbnNhY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24pIHRoYXQgdXBkYXRlcyB0aGlzXG4gICAgc3RhdGUuIEFueSBudW1iZXIgb2YgW3RyYW5zYWN0aW9uIHNwZWNzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYylcbiAgICBjYW4gYmUgcGFzc2VkLiBVbmxlc3NcbiAgICBbYHNlcXVlbnRpYWxgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5zZXF1ZW50aWFsKSBpcyBzZXQsIHRoZVxuICAgIFtjaGFuZ2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5jaGFuZ2VzKSAoaWYgYW55KSBvZiBlYWNoIHNwZWNcbiAgICBhcmUgYXNzdW1lZCB0byBzdGFydCBpbiB0aGUgX2N1cnJlbnRfIGRvY3VtZW50IChub3QgdGhlIGRvY3VtZW50XG4gICAgcHJvZHVjZWQgYnkgcHJldmlvdXMgc3BlY3MpLCBhbmQgaXRzXG4gICAgW3NlbGVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuc2VsZWN0aW9uKSBhbmRcbiAgICBbZWZmZWN0c10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZWZmZWN0cykgYXJlIGFzc3VtZWQgdG8gcmVmZXJcbiAgICB0byB0aGUgZG9jdW1lbnQgY3JlYXRlZCBieSBpdHMgX293bl8gY2hhbmdlcy4gVGhlIHJlc3VsdGluZ1xuICAgIHRyYW5zYWN0aW9uIGNvbnRhaW5zIHRoZSBjb21iaW5lZCBlZmZlY3Qgb2YgYWxsIHRoZSBkaWZmZXJlbnRcbiAgICBzcGVjcy4gRm9yIFtzZWxlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLnNlbGVjdGlvbiksIGxhdGVyXG4gICAgc3BlY3MgdGFrZSBwcmVjZWRlbmNlIG92ZXIgZWFybGllciBvbmVzLlxuICAgICovXG4gICAgdXBkYXRlKC4uLnNwZWNzKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlVHJhbnNhY3Rpb24odGhpcywgc3BlY3MsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFwcGx5VHJhbnNhY3Rpb24odHIpIHtcbiAgICAgICAgbGV0IGNvbmYgPSB0aGlzLmNvbmZpZywgeyBiYXNlLCBjb21wYXJ0bWVudHMgfSA9IGNvbmY7XG4gICAgICAgIGZvciAobGV0IGVmZmVjdCBvZiB0ci5lZmZlY3RzKSB7XG4gICAgICAgICAgICBpZiAoZWZmZWN0LmlzKENvbXBhcnRtZW50LnJlY29uZmlndXJlKSkge1xuICAgICAgICAgICAgICAgIGlmIChjb25mKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhcnRtZW50cyA9IG5ldyBNYXA7XG4gICAgICAgICAgICAgICAgICAgIGNvbmYuY29tcGFydG1lbnRzLmZvckVhY2goKHZhbCwga2V5KSA9PiBjb21wYXJ0bWVudHMuc2V0KGtleSwgdmFsKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmYgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wYXJ0bWVudHMuc2V0KGVmZmVjdC52YWx1ZS5jb21wYXJ0bWVudCwgZWZmZWN0LnZhbHVlLmV4dGVuc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlZmZlY3QuaXMoU3RhdGVFZmZlY3QucmVjb25maWd1cmUpKSB7XG4gICAgICAgICAgICAgICAgY29uZiA9IG51bGw7XG4gICAgICAgICAgICAgICAgYmFzZSA9IGVmZmVjdC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVmZmVjdC5pcyhTdGF0ZUVmZmVjdC5hcHBlbmRDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29uZiA9IG51bGw7XG4gICAgICAgICAgICAgICAgYmFzZSA9IGFzQXJyYXkoYmFzZSkuY29uY2F0KGVmZmVjdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0VmFsdWVzO1xuICAgICAgICBpZiAoIWNvbmYpIHtcbiAgICAgICAgICAgIGNvbmYgPSBDb25maWd1cmF0aW9uLnJlc29sdmUoYmFzZSwgY29tcGFydG1lbnRzLCB0aGlzKTtcbiAgICAgICAgICAgIGxldCBpbnRlcm1lZGlhdGVTdGF0ZSA9IG5ldyBFZGl0b3JTdGF0ZShjb25mLCB0aGlzLmRvYywgdGhpcy5zZWxlY3Rpb24sIGNvbmYuZHluYW1pY1Nsb3RzLm1hcCgoKSA9PiBudWxsKSwgKHN0YXRlLCBzbG90KSA9PiBzbG90LnJlY29uZmlndXJlKHN0YXRlLCB0aGlzKSwgbnVsbCk7XG4gICAgICAgICAgICBzdGFydFZhbHVlcyA9IGludGVybWVkaWF0ZVN0YXRlLnZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0VmFsdWVzID0gdHIuc3RhcnRTdGF0ZS52YWx1ZXMuc2xpY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2VsZWN0aW9uID0gdHIuc3RhcnRTdGF0ZS5mYWNldChhbGxvd011bHRpcGxlU2VsZWN0aW9ucykgPyB0ci5uZXdTZWxlY3Rpb24gOiB0ci5uZXdTZWxlY3Rpb24uYXNTaW5nbGUoKTtcbiAgICAgICAgbmV3IEVkaXRvclN0YXRlKGNvbmYsIHRyLm5ld0RvYywgc2VsZWN0aW9uLCBzdGFydFZhbHVlcywgKHN0YXRlLCBzbG90KSA9PiBzbG90LnVwZGF0ZShzdGF0ZSwgdHIpLCB0cik7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIFt0cmFuc2FjdGlvbiBzcGVjXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYykgdGhhdFxuICAgIHJlcGxhY2VzIGV2ZXJ5IHNlbGVjdGlvbiByYW5nZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50LlxuICAgICovXG4gICAgcmVwbGFjZVNlbGVjdGlvbih0ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdGV4dCA9IHRoaXMudG9UZXh0KHRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2VCeVJhbmdlKHJhbmdlID0+ICh7IGNoYW5nZXM6IHsgZnJvbTogcmFuZ2UuZnJvbSwgdG86IHJhbmdlLnRvLCBpbnNlcnQ6IHRleHQgfSxcbiAgICAgICAgICAgIHJhbmdlOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHJhbmdlLmZyb20gKyB0ZXh0Lmxlbmd0aCkgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgb2YgY2hhbmdlcyBhbmQgYSBuZXcgc2VsZWN0aW9uIGJ5IHJ1bm5pbmcgdGhlIGdpdmVuXG4gICAgZnVuY3Rpb24gZm9yIGVhY2ggcmFuZ2UgaW4gdGhlIGFjdGl2ZSBzZWxlY3Rpb24uIFRoZSBmdW5jdGlvblxuICAgIGNhbiByZXR1cm4gYW4gb3B0aW9uYWwgc2V0IG9mIGNoYW5nZXMgKGluIHRoZSBjb29yZGluYXRlIHNwYWNlXG4gICAgb2YgdGhlIHN0YXJ0IGRvY3VtZW50KSwgcGx1cyBhbiB1cGRhdGVkIHJhbmdlIChpbiB0aGUgY29vcmRpbmF0ZVxuICAgIHNwYWNlIG9mIHRoZSBkb2N1bWVudCBwcm9kdWNlZCBieSB0aGUgY2FsbCdzIG93biBjaGFuZ2VzKS4gVGhpc1xuICAgIG1ldGhvZCB3aWxsIG1lcmdlIGFsbCB0aGUgY2hhbmdlcyBhbmQgcmFuZ2VzIGludG8gYSBzaW5nbGVcbiAgICBjaGFuZ2VzZXQgYW5kIHNlbGVjdGlvbiwgYW5kIHJldHVybiBpdCBhcyBhIFt0cmFuc2FjdGlvblxuICAgIHNwZWNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjKSwgd2hpY2ggY2FuIGJlIHBhc3NlZCB0b1xuICAgIFtgdXBkYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpLlxuICAgICovXG4gICAgY2hhbmdlQnlSYW5nZShmKSB7XG4gICAgICAgIGxldCBzZWwgPSB0aGlzLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0IHJlc3VsdDEgPSBmKHNlbC5yYW5nZXNbMF0pO1xuICAgICAgICBsZXQgY2hhbmdlcyA9IHRoaXMuY2hhbmdlcyhyZXN1bHQxLmNoYW5nZXMpLCByYW5nZXMgPSBbcmVzdWx0MS5yYW5nZV07XG4gICAgICAgIGxldCBlZmZlY3RzID0gYXNBcnJheShyZXN1bHQxLmVmZmVjdHMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBmKHNlbC5yYW5nZXNbaV0pO1xuICAgICAgICAgICAgbGV0IG5ld0NoYW5nZXMgPSB0aGlzLmNoYW5nZXMocmVzdWx0LmNoYW5nZXMpLCBuZXdNYXBwZWQgPSBuZXdDaGFuZ2VzLm1hcChjaGFuZ2VzKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaTsgaisrKVxuICAgICAgICAgICAgICAgIHJhbmdlc1tqXSA9IHJhbmdlc1tqXS5tYXAobmV3TWFwcGVkKTtcbiAgICAgICAgICAgIGxldCBtYXBCeSA9IGNoYW5nZXMubWFwRGVzYyhuZXdDaGFuZ2VzLCB0cnVlKTtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKHJlc3VsdC5yYW5nZS5tYXAobWFwQnkpKTtcbiAgICAgICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzLmNvbXBvc2UobmV3TWFwcGVkKTtcbiAgICAgICAgICAgIGVmZmVjdHMgPSBTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGVmZmVjdHMsIG5ld01hcHBlZCkuY29uY2F0KFN0YXRlRWZmZWN0Lm1hcEVmZmVjdHMoYXNBcnJheShyZXN1bHQuZWZmZWN0cyksIG1hcEJ5KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNoYW5nZXMsXG4gICAgICAgICAgICBzZWxlY3Rpb246IEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzLCBzZWwubWFpbkluZGV4KSxcbiAgICAgICAgICAgIGVmZmVjdHNcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgW2NoYW5nZSBzZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0KSBmcm9tIHRoZSBnaXZlbiBjaGFuZ2VcbiAgICBkZXNjcmlwdGlvbiwgdGFraW5nIHRoZSBzdGF0ZSdzIGRvY3VtZW50IGxlbmd0aCBhbmQgbGluZVxuICAgIHNlcGFyYXRvciBpbnRvIGFjY291bnQuXG4gICAgKi9cbiAgICBjaGFuZ2VzKHNwZWMgPSBbXSkge1xuICAgICAgICBpZiAoc3BlYyBpbnN0YW5jZW9mIENoYW5nZVNldClcbiAgICAgICAgICAgIHJldHVybiBzcGVjO1xuICAgICAgICByZXR1cm4gQ2hhbmdlU2V0Lm9mKHNwZWMsIHRoaXMuZG9jLmxlbmd0aCwgdGhpcy5mYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVzaW5nIHRoZSBzdGF0ZSdzIFtsaW5lXG4gICAgc2VwYXJhdG9yXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmxpbmVTZXBhcmF0b3IpLCBjcmVhdGUgYVxuICAgIFtgVGV4dGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVGV4dCkgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgICovXG4gICAgdG9UZXh0KHN0cmluZykge1xuICAgICAgICByZXR1cm4gVGV4dC5vZihzdHJpbmcuc3BsaXQodGhpcy5mYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSB8fCBEZWZhdWx0U3BsaXQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZG9jdW1lbnQgYXMgYSBzdHJpbmcuXG4gICAgKi9cbiAgICBzbGljZURvYyhmcm9tID0gMCwgdG8gPSB0aGlzLmRvYy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvLCB0aGlzLmxpbmVCcmVhayk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgYSBzdGF0ZSBbZmFjZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRmFjZXQpLlxuICAgICovXG4gICAgZmFjZXQoZmFjZXQpIHtcbiAgICAgICAgbGV0IGFkZHIgPSB0aGlzLmNvbmZpZy5hZGRyZXNzW2ZhY2V0LmlkXTtcbiAgICAgICAgaWYgKGFkZHIgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWNldC5kZWZhdWx0O1xuICAgICAgICBlbnN1cmVBZGRyKHRoaXMsIGFkZHIpO1xuICAgICAgICByZXR1cm4gZ2V0QWRkcih0aGlzLCBhZGRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGlzIHN0YXRlIHRvIGEgSlNPTi1zZXJpYWxpemFibGUgb2JqZWN0LiBXaGVuIGN1c3RvbVxuICAgIGZpZWxkcyBzaG91bGQgYmUgc2VyaWFsaXplZCwgeW91IGNhbiBwYXNzIHRoZW0gaW4gYXMgYW4gb2JqZWN0XG4gICAgbWFwcGluZyBwcm9wZXJ0eSBuYW1lcyAoaW4gdGhlIHJlc3VsdGluZyBvYmplY3QsIHdoaWNoIHNob3VsZFxuICAgIG5vdCB1c2UgYGRvY2Agb3IgYHNlbGVjdGlvbmApIHRvIGZpZWxkcy5cbiAgICAqL1xuICAgIHRvSlNPTihmaWVsZHMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGRvYzogdGhpcy5zbGljZURvYygpLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvbi50b0pTT04oKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoZmllbGRzKVxuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBmaWVsZHNbcHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RhdGVGaWVsZCAmJiB0aGlzLmNvbmZpZy5hZGRyZXNzW3ZhbHVlLmlkXSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbcHJvcF0gPSB2YWx1ZS5zcGVjLnRvSlNPTih0aGlzLmZpZWxkKGZpZWxkc1twcm9wXSksIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIHN0YXRlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uIFdoZW4gY3VzdG9tXG4gICAgZmllbGRzIHNob3VsZCBiZSBkZXNlcmlhbGl6ZWQsIHBhc3MgdGhlIHNhbWUgb2JqZWN0IHlvdSBwYXNzZWRcbiAgICB0byBbYHRvSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUudG9KU09OKSB3aGVuIHNlcmlhbGl6aW5nIGFzXG4gICAgdGhpcmQgYXJndW1lbnQuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbiwgY29uZmlnID0ge30sIGZpZWxkcykge1xuICAgICAgICBpZiAoIWpzb24gfHwgdHlwZW9mIGpzb24uZG9jICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRWRpdG9yU3RhdGVcIik7XG4gICAgICAgIGxldCBmaWVsZEluaXQgPSBbXTtcbiAgICAgICAgaWYgKGZpZWxkcylcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChqc29uLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmllbGQgPSBmaWVsZHNbcHJvcF0sIHZhbHVlID0ganNvbltwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRJbml0LnB1c2goZmllbGQuaW5pdChzdGF0ZSA9PiBmaWVsZC5zcGVjLmZyb21KU09OKHZhbHVlLCBzdGF0ZSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBFZGl0b3JTdGF0ZS5jcmVhdGUoe1xuICAgICAgICAgICAgZG9jOiBqc29uLmRvYyxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogRWRpdG9yU2VsZWN0aW9uLmZyb21KU09OKGpzb24uc2VsZWN0aW9uKSxcbiAgICAgICAgICAgIGV4dGVuc2lvbnM6IGNvbmZpZy5leHRlbnNpb25zID8gZmllbGRJbml0LmNvbmNhdChbY29uZmlnLmV4dGVuc2lvbnNdKSA6IGZpZWxkSW5pdFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IHN0YXRlLiBZb3UnbGwgdXN1YWxseSBvbmx5IG5lZWQgdGhpcyB3aGVuXG4gICAgaW5pdGlhbGl6aW5nIGFuIGVkaXRvclx1MjAxNHVwZGF0ZWQgc3RhdGVzIGFyZSBjcmVhdGVkIGJ5IGFwcGx5aW5nXG4gICAgdHJhbnNhY3Rpb25zLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShjb25maWcgPSB7fSkge1xuICAgICAgICBsZXQgY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24ucmVzb2x2ZShjb25maWcuZXh0ZW5zaW9ucyB8fCBbXSwgbmV3IE1hcCk7XG4gICAgICAgIGxldCBkb2MgPSBjb25maWcuZG9jIGluc3RhbmNlb2YgVGV4dCA/IGNvbmZpZy5kb2NcbiAgICAgICAgICAgIDogVGV4dC5vZigoY29uZmlnLmRvYyB8fCBcIlwiKS5zcGxpdChjb25maWd1cmF0aW9uLnN0YXRpY0ZhY2V0KEVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IpIHx8IERlZmF1bHRTcGxpdCkpO1xuICAgICAgICBsZXQgc2VsZWN0aW9uID0gIWNvbmZpZy5zZWxlY3Rpb24gPyBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKDApXG4gICAgICAgICAgICA6IGNvbmZpZy5zZWxlY3Rpb24gaW5zdGFuY2VvZiBFZGl0b3JTZWxlY3Rpb24gPyBjb25maWcuc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgOiBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKGNvbmZpZy5zZWxlY3Rpb24uYW5jaG9yLCBjb25maWcuc2VsZWN0aW9uLmhlYWQpO1xuICAgICAgICBjaGVja1NlbGVjdGlvbihzZWxlY3Rpb24sIGRvYy5sZW5ndGgpO1xuICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb24uc3RhdGljRmFjZXQoYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMpKVxuICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLmFzU2luZ2xlKCk7XG4gICAgICAgIHJldHVybiBuZXcgRWRpdG9yU3RhdGUoY29uZmlndXJhdGlvbiwgZG9jLCBzZWxlY3Rpb24sIGNvbmZpZ3VyYXRpb24uZHluYW1pY1Nsb3RzLm1hcCgoKSA9PiBudWxsKSwgKHN0YXRlLCBzbG90KSA9PiBzbG90LmNyZWF0ZShzdGF0ZSksIG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2l6ZSAoaW4gY29sdW1ucykgb2YgYSB0YWIgaW4gdGhlIGRvY3VtZW50LCBkZXRlcm1pbmVkIGJ5XG4gICAgdGhlIFtgdGFiU2l6ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedGFiU2l6ZSkgZmFjZXQuXG4gICAgKi9cbiAgICBnZXQgdGFiU2l6ZSgpIHsgcmV0dXJuIHRoaXMuZmFjZXQoRWRpdG9yU3RhdGUudGFiU2l6ZSk7IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHByb3BlciBbbGluZS1icmVha10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5saW5lU2VwYXJhdG9yKVxuICAgIHN0cmluZyBmb3IgdGhpcyBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCBsaW5lQnJlYWsoKSB7IHJldHVybiB0aGlzLmZhY2V0KEVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IpIHx8IFwiXFxuXCI7IH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZWRpdG9yIGlzXG4gICAgW2NvbmZpZ3VyZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVecmVhZE9ubHkpIHRvIGJlIHJlYWQtb25seS5cbiAgICAqL1xuICAgIGdldCByZWFkT25seSgpIHsgcmV0dXJuIHRoaXMuZmFjZXQocmVhZE9ubHkpOyB9XG4gICAgLyoqXG4gICAgTG9vayB1cCBhIHRyYW5zbGF0aW9uIGZvciB0aGUgZ2l2ZW4gcGhyYXNlICh2aWEgdGhlXG4gICAgW2BwaHJhc2VzYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5waHJhc2VzKSBmYWNldCksIG9yIHJldHVybiB0aGVcbiAgICBvcmlnaW5hbCBzdHJpbmcgaWYgbm8gdHJhbnNsYXRpb24gaXMgZm91bmQuXG4gICAgXG4gICAgSWYgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHBhc3NlZCwgdGhleSB3aWxsIGJlIGluc2VydGVkIGluXG4gICAgcGxhY2Ugb2YgbWFya2VycyBsaWtlIGAkMWAgKGZvciB0aGUgZmlyc3QgdmFsdWUpIGFuZCBgJDJgLCBldGMuXG4gICAgQSBzaW5nbGUgYCRgIGlzIGVxdWl2YWxlbnQgdG8gYCQxYCwgYW5kIGAkJGAgd2lsbCBwcm9kdWNlIGFcbiAgICBsaXRlcmFsIGRvbGxhciBzaWduLlxuICAgICovXG4gICAgcGhyYXNlKHBocmFzZSwgLi4uaW5zZXJ0KSB7XG4gICAgICAgIGZvciAobGV0IG1hcCBvZiB0aGlzLmZhY2V0KEVkaXRvclN0YXRlLnBocmFzZXMpKVxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtYXAsIHBocmFzZSkpIHtcbiAgICAgICAgICAgICAgICBwaHJhc2UgPSBtYXBbcGhyYXNlXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGluc2VydC5sZW5ndGgpXG4gICAgICAgICAgICBwaHJhc2UgPSBwaHJhc2UucmVwbGFjZSgvXFwkKFxcJHxcXGQqKS9nLCAobSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpID09IFwiJFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIkXCI7XG4gICAgICAgICAgICAgICAgbGV0IG4gPSArKGkgfHwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFuIHx8IG4gPiBpbnNlcnQubGVuZ3RoID8gbSA6IGluc2VydFtuIC0gMV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBocmFzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgdmFsdWVzIGZvciBhIGdpdmVuIGxhbmd1YWdlIGRhdGEgZmllbGQsIHByb3ZpZGVkIGJ5IHRoZVxuICAgIHRoZSBbYGxhbmd1YWdlRGF0YWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVebGFuZ3VhZ2VEYXRhKSBmYWNldC5cbiAgICBcbiAgICBFeGFtcGxlcyBvZiBsYW5ndWFnZSBkYXRhIGZpZWxkcyBhcmUuLi5cbiAgICBcbiAgICAtIFtgXCJjb21tZW50VG9rZW5zXCJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2NvbW1hbmRzLkNvbW1lbnRUb2tlbnMpIGZvciBzcGVjaWZ5aW5nXG4gICAgICBjb21tZW50IHN5bnRheC5cbiAgICAtIFtgXCJhdXRvY29tcGxldGVcImBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jYXV0b2NvbXBsZXRlLmF1dG9jb21wbGV0aW9uXmNvbmZpZy5vdmVycmlkZSlcbiAgICAgIGZvciBwcm92aWRpbmcgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGxldGlvbiBzb3VyY2VzLlxuICAgIC0gW2BcIndvcmRDaGFyc1wiYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIpIGZvciBhZGRpbmdcbiAgICAgIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgYmUgY29uc2lkZXJlZCBwYXJ0IG9mIHdvcmRzIGluIHRoaXNcbiAgICAgIGxhbmd1YWdlLlxuICAgIC0gW2BcImNsb3NlQnJhY2tldHNcImBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jYXV0b2NvbXBsZXRlLkNsb3NlQnJhY2tldENvbmZpZykgY29udHJvbHNcbiAgICAgIGJyYWNrZXQgY2xvc2luZyBiZWhhdmlvci5cbiAgICAqL1xuICAgIGxhbmd1YWdlRGF0YUF0KG5hbWUsIHBvcywgc2lkZSA9IC0xKSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcHJvdmlkZXIgb2YgdGhpcy5mYWNldChsYW5ndWFnZURhdGEpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByZXN1bHQgb2YgcHJvdmlkZXIodGhpcywgcG9zLCBzaWRlKSkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBuYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2gocmVzdWx0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBjYXRlZ29yaXplIHN0cmluZ3MgKGV4cGVjdGVkIHRvXG4gICAgcmVwcmVzZW50IGEgc2luZ2xlIFtncmFwaGVtZSBjbHVzdGVyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLmZpbmRDbHVzdGVyQnJlYWspKVxuICAgIGludG8gb25lIG9mOlxuICAgIFxuICAgICAtIFdvcmQgKGNvbnRhaW5zIGFuIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXIgb3IgYSBjaGFyYWN0ZXJcbiAgICAgICBleHBsaWNpdGx5IGxpc3RlZCBpbiB0aGUgbG9jYWwgbGFuZ3VhZ2UncyBgXCJ3b3JkQ2hhcnNcImBcbiAgICAgICBsYW5ndWFnZSBkYXRhLCB3aGljaCBzaG91bGQgYmUgYSBzdHJpbmcpXG4gICAgIC0gU3BhY2UgKGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZSlcbiAgICAgLSBPdGhlciAoYW55dGhpbmcgZWxzZSlcbiAgICAqL1xuICAgIGNoYXJDYXRlZ29yaXplcihhdCkge1xuICAgICAgICByZXR1cm4gbWFrZUNhdGVnb3JpemVyKHRoaXMubGFuZ3VhZ2VEYXRhQXQoXCJ3b3JkQ2hhcnNcIiwgYXQpLmpvaW4oXCJcIikpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSB3b3JkIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgbWVhbmluZyB0aGUgcmFuZ2VcbiAgICBjb250YWluaW5nIGFsbCBbd29yZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFyQ2F0ZWdvcnkuV29yZCkgY2hhcmFjdGVyc1xuICAgIGFyb3VuZCBpdC4gSWYgbm8gd29yZCBjaGFyYWN0ZXJzIGFyZSBhZGphY2VudCB0byB0aGUgcG9zaXRpb24sXG4gICAgdGhpcyByZXR1cm5zIG51bGwuXG4gICAgKi9cbiAgICB3b3JkQXQocG9zKSB7XG4gICAgICAgIGxldCB7IHRleHQsIGZyb20sIGxlbmd0aCB9ID0gdGhpcy5kb2MubGluZUF0KHBvcyk7XG4gICAgICAgIGxldCBjYXQgPSB0aGlzLmNoYXJDYXRlZ29yaXplcihwb3MpO1xuICAgICAgICBsZXQgc3RhcnQgPSBwb3MgLSBmcm9tLCBlbmQgPSBwb3MgLSBmcm9tO1xuICAgICAgICB3aGlsZSAoc3RhcnQgPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IGZpbmRDbHVzdGVyQnJlYWsodGV4dCwgc3RhcnQsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChjYXQodGV4dC5zbGljZShwcmV2LCBzdGFydCkpICE9IENoYXJDYXRlZ29yeS5Xb3JkKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgc3RhcnQgPSBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChlbmQgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZmluZENsdXN0ZXJCcmVhayh0ZXh0LCBlbmQpO1xuICAgICAgICAgICAgaWYgKGNhdCh0ZXh0LnNsaWNlKGVuZCwgbmV4dCkpICE9IENoYXJDYXRlZ29yeS5Xb3JkKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZW5kID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhcnQgPT0gZW5kID8gbnVsbCA6IEVkaXRvclNlbGVjdGlvbi5yYW5nZShzdGFydCArIGZyb20sIGVuZCArIGZyb20pO1xuICAgIH1cbn1cbi8qKlxuQSBmYWNldCB0aGF0LCB3aGVuIGVuYWJsZWQsIGNhdXNlcyB0aGUgZWRpdG9yIHRvIGFsbG93IG11bHRpcGxlXG5yYW5nZXMgdG8gYmUgc2VsZWN0ZWQuIEJlIGNhcmVmdWwgdGhvdWdoLCBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlXG5lZGl0b3IgcmVsaWVzIG9uIHRoZSBuYXRpdmUgRE9NIHNlbGVjdGlvbiwgd2hpY2ggY2Fubm90IGhhbmRsZVxubXVsdGlwbGUgc2VsZWN0aW9ucy4gQW4gZXh0ZW5zaW9uIGxpa2VcbltgZHJhd1NlbGVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5kcmF3U2VsZWN0aW9uKSBjYW4gYmUgdXNlZCB0byBtYWtlXG5zZWNvbmRhcnkgc2VsZWN0aW9ucyB2aXNpYmxlIHRvIHRoZSB1c2VyLlxuKi9cbkVkaXRvclN0YXRlLmFsbG93TXVsdGlwbGVTZWxlY3Rpb25zID0gYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnM7XG4vKipcbkNvbmZpZ3VyZXMgdGhlIHRhYiBzaXplIHRvIHVzZSBpbiB0aGlzIHN0YXRlLiBUaGUgZmlyc3RcbihoaWdoZXN0LXByZWNlZGVuY2UpIHZhbHVlIG9mIHRoZSBmYWNldCBpcyB1c2VkLiBJZiBubyB2YWx1ZSBpc1xuZ2l2ZW4sIHRoaXMgZGVmYXVsdHMgdG8gNC5cbiovXG5FZGl0b3JTdGF0ZS50YWJTaXplID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5sZW5ndGggPyB2YWx1ZXNbMF0gOiA0XG59KTtcbi8qKlxuVGhlIGxpbmUgc2VwYXJhdG9yIHRvIHVzZS4gQnkgZGVmYXVsdCwgYW55IG9mIGBcIlxcblwiYCwgYFwiXFxyXFxuXCJgXG5hbmQgYFwiXFxyXCJgIGlzIHRyZWF0ZWQgYXMgYSBzZXBhcmF0b3Igd2hlbiBzcGxpdHRpbmcgbGluZXMsIGFuZFxubGluZXMgYXJlIGpvaW5lZCB3aXRoIGBcIlxcblwiYC5cblxuV2hlbiB5b3UgY29uZmlndXJlIGEgdmFsdWUgaGVyZSwgb25seSB0aGF0IHByZWNpc2Ugc2VwYXJhdG9yXG53aWxsIGJlIHVzZWQsIGFsbG93aW5nIHlvdSB0byByb3VuZC10cmlwIGRvY3VtZW50cyB0aHJvdWdoIHRoZVxuZWRpdG9yIHdpdGhvdXQgbm9ybWFsaXppbmcgbGluZSBzZXBhcmF0b3JzLlxuKi9cbkVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IgPSBsaW5lU2VwYXJhdG9yO1xuLyoqXG5UaGlzIGZhY2V0IGNvbnRyb2xzIHRoZSB2YWx1ZSBvZiB0aGVcbltgcmVhZE9ubHlgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnJlYWRPbmx5KSBnZXR0ZXIsIHdoaWNoIGlzXG5jb25zdWx0ZWQgYnkgY29tbWFuZHMgYW5kIGV4dGVuc2lvbnMgdGhhdCBpbXBsZW1lbnQgZWRpdGluZ1xuZnVuY3Rpb25hbGl0eSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGV5IHNob3VsZCBhcHBseS4gSXRcbmRlZmF1bHRzIHRvIGZhbHNlLCBidXQgd2hlbiBpdHMgaGlnaGVzdC1wcmVjZWRlbmNlIHZhbHVlIGlzXG5gdHJ1ZWAsIHN1Y2ggZnVuY3Rpb25hbGl0eSBkaXNhYmxlcyBpdHNlbGYuXG5cbk5vdCB0byBiZSBjb25mdXNlZCB3aXRoXG5bYEVkaXRvclZpZXcuZWRpdGFibGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15lZGl0YWJsZSksIHdoaWNoXG5jb250cm9scyB3aGV0aGVyIHRoZSBlZGl0b3IncyBET00gaXMgc2V0IHRvIGJlIGVkaXRhYmxlIChhbmRcbnRodXMgZm9jdXNhYmxlKS5cbiovXG5FZGl0b3JTdGF0ZS5yZWFkT25seSA9IHJlYWRPbmx5O1xuLyoqXG5SZWdpc3RlcnMgdHJhbnNsYXRpb24gcGhyYXNlcy4gVGhlXG5bYHBocmFzZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUucGhyYXNlKSBtZXRob2Qgd2lsbCBsb29rIHRocm91Z2hcbmFsbCBvYmplY3RzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGZhY2V0IHRvIGZpbmQgdHJhbnNsYXRpb25zIGZvclxuaXRzIGFyZ3VtZW50LlxuKi9cbkVkaXRvclN0YXRlLnBocmFzZXMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21wYXJlKGEsIGIpIHtcbiAgICAgICAgbGV0IGtBID0gT2JqZWN0LmtleXMoYSksIGtCID0gT2JqZWN0LmtleXMoYik7XG4gICAgICAgIHJldHVybiBrQS5sZW5ndGggPT0ga0IubGVuZ3RoICYmIGtBLmV2ZXJ5KGsgPT4gYVtrXSA9PSBiW2tdKTtcbiAgICB9XG59KTtcbi8qKlxuQSBmYWNldCB1c2VkIHRvIHJlZ2lzdGVyIFtsYW5ndWFnZVxuZGF0YV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGFBdCkgcHJvdmlkZXJzLlxuKi9cbkVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YSA9IGxhbmd1YWdlRGF0YTtcbi8qKlxuRmFjZXQgdXNlZCB0byByZWdpc3RlciBjaGFuZ2UgZmlsdGVycywgd2hpY2ggYXJlIGNhbGxlZCBmb3IgZWFjaFxudHJhbnNhY3Rpb24gKHVubGVzcyBleHBsaWNpdGx5XG5bZGlzYWJsZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmZpbHRlcikpLCBhbmQgY2FuIHN1cHByZXNzXG5wYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbidzIGNoYW5nZXMuXG5cblN1Y2ggYSBmdW5jdGlvbiBjYW4gcmV0dXJuIGB0cnVlYCB0byBpbmRpY2F0ZSB0aGF0IGl0IGRvZXNuJ3RcbndhbnQgdG8gZG8gYW55dGhpbmcsIGBmYWxzZWAgdG8gY29tcGxldGVseSBzdG9wIHRoZSBjaGFuZ2VzIGluXG50aGUgdHJhbnNhY3Rpb24sIG9yIGEgc2V0IG9mIHJhbmdlcyBpbiB3aGljaCBjaGFuZ2VzIHNob3VsZCBiZVxuc3VwcHJlc3NlZC4gU3VjaCByYW5nZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIG51bWJlcnMsXG53aXRoIGVhY2ggcGFpciBvZiB0d28gbnVtYmVycyBpbmRpY2F0aW5nIHRoZSBzdGFydCBhbmQgZW5kIG9mIGFcbnJhbmdlLiBTbyBmb3IgZXhhbXBsZSBgWzEwLCAyMCwgMTAwLCAxMTBdYCBzdXBwcmVzc2VzIGNoYW5nZXNcbmJldHdlZW4gMTAgYW5kIDIwLCBhbmQgYmV0d2VlbiAxMDAgYW5kIDExMC5cbiovXG5FZGl0b3JTdGF0ZS5jaGFuZ2VGaWx0ZXIgPSBjaGFuZ2VGaWx0ZXI7XG4vKipcbkZhY2V0IHVzZWQgdG8gcmVnaXN0ZXIgYSBob29rIHRoYXQgZ2V0cyBhIGNoYW5jZSB0byB1cGRhdGUgb3JcbnJlcGxhY2UgdHJhbnNhY3Rpb24gc3BlY3MgYmVmb3JlIHRoZXkgYXJlIGFwcGxpZWQuIFRoaXMgd2lsbFxub25seSBiZSBhcHBsaWVkIGZvciB0cmFuc2FjdGlvbnMgdGhhdCBkb24ndCBoYXZlXG5bYGZpbHRlcmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmZpbHRlcikgc2V0IHRvIGBmYWxzZWAuIFlvdVxuY2FuIGVpdGhlciByZXR1cm4gYSBzaW5nbGUgdHJhbnNhY3Rpb24gc3BlYyAocG9zc2libHkgdGhlIGlucHV0XG50cmFuc2FjdGlvbiksIG9yIGFuIGFycmF5IG9mIHNwZWNzICh3aGljaCB3aWxsIGJlIGNvbWJpbmVkIGluXG50aGUgc2FtZSB3YXkgYXMgdGhlIGFyZ3VtZW50cyB0b1xuW2BFZGl0b3JTdGF0ZS51cGRhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnVwZGF0ZSkpLlxuXG5XaGVuIHBvc3NpYmxlLCBpdCBpcyByZWNvbW1lbmRlZCB0byBhdm9pZCBhY2Nlc3NpbmdcbltgVHJhbnNhY3Rpb24uc3RhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLnN0YXRlKSBpbiBhIGZpbHRlcixcbnNpbmNlIGl0IHdpbGwgZm9yY2UgY3JlYXRpb24gb2YgYSBzdGF0ZSB0aGF0IHdpbGwgdGhlbiBiZVxuZGlzY2FyZGVkIGFnYWluLCBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgYWN0dWFsbHkgZmlsdGVyZWQuXG5cbihUaGlzIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlLiBJbmRpc2NyaW1pbmF0ZWx5XG5tb2RpZnlpbmcgdHJhbnNhY3Rpb24gaXMgbGlrZWx5IHRvIGJyZWFrIHNvbWV0aGluZyBvciBkZWdyYWRlXG50aGUgdXNlciBleHBlcmllbmNlLilcbiovXG5FZGl0b3JTdGF0ZS50cmFuc2FjdGlvbkZpbHRlciA9IHRyYW5zYWN0aW9uRmlsdGVyO1xuLyoqXG5UaGlzIGlzIGEgbW9yZSBsaW1pdGVkIGZvcm0gb2ZcbltgdHJhbnNhY3Rpb25GaWx0ZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRyYW5zYWN0aW9uRmlsdGVyKSxcbndoaWNoIGNhbiBvbmx5IGFkZFxuW2Fubm90YXRpb25zXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5hbm5vdGF0aW9ucykgYW5kXG5bZWZmZWN0c10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZWZmZWN0cykuIF9CdXRfLCB0aGlzIHR5cGVcbm9mIGZpbHRlciBydW5zIGV2ZW4gaWYgdGhlIHRyYW5zYWN0aW9uIGhhcyBkaXNhYmxlZCByZWd1bGFyXG5bZmlsdGVyaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5maWx0ZXIpLCBtYWtpbmcgaXQgc3VpdGFibGVcbmZvciBlZmZlY3RzIHRoYXQgZG9uJ3QgbmVlZCB0byB0b3VjaCB0aGUgY2hhbmdlcyBvciBzZWxlY3Rpb24sXG5idXQgZG8gd2FudCB0byBwcm9jZXNzIGV2ZXJ5IHRyYW5zYWN0aW9uLlxuXG5FeHRlbmRlcnMgcnVuIF9hZnRlcl8gZmlsdGVycywgd2hlbiBib3RoIGFyZSBwcmVzZW50LlxuKi9cbkVkaXRvclN0YXRlLnRyYW5zYWN0aW9uRXh0ZW5kZXIgPSB0cmFuc2FjdGlvbkV4dGVuZGVyO1xuQ29tcGFydG1lbnQucmVjb25maWd1cmUgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG5cbi8qKlxuVXRpbGl0eSBmdW5jdGlvbiBmb3IgY29tYmluaW5nIGJlaGF2aW9ycyB0byBmaWxsIGluIGEgY29uZmlnXG5vYmplY3QgZnJvbSBhbiBhcnJheSBvZiBwcm92aWRlZCBjb25maWdzLiBgZGVmYXVsdHNgIHNob3VsZCBob2xkXG5kZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcyBpbiBgQ29uZmlnYC5cblxuVGhlIGZ1bmN0aW9uIHdpbGwsIGJ5IGRlZmF1bHQsIGVycm9yXG53aGVuIGEgZmllbGQgZ2V0cyB0d28gdmFsdWVzIHRoYXQgYXJlbid0IGA9PT1gLWVxdWFsLCBidXQgeW91IGNhblxucHJvdmlkZSBjb21iaW5lIGZ1bmN0aW9ucyBwZXIgZmllbGQgdG8gZG8gc29tZXRoaW5nIGVsc2UuXG4qL1xuZnVuY3Rpb24gY29tYmluZUNvbmZpZyhjb25maWdzLCBkZWZhdWx0cywgLy8gU2hvdWxkIGhvbGQgb25seSB0aGUgb3B0aW9uYWwgcHJvcGVydGllcyBvZiBDb25maWcsIGJ1dCBJIGhhdmVuJ3QgbWFuYWdlZCB0byBleHByZXNzIHRoYXRcbmNvbWJpbmUgPSB7fSkge1xuICAgIGxldCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGxldCBjb25maWcgb2YgY29uZmlncylcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGNvbmZpZ1trZXldLCBjdXJyZW50ID0gcmVzdWx0W2tleV07XG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50ID09PSB2YWx1ZSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA7IC8vIE5vIGNvbmZsaWN0XG4gICAgICAgICAgICBlbHNlIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChjb21iaW5lLCBrZXkpKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gY29tYmluZVtrZXldKGN1cnJlbnQsIHZhbHVlKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25maWcgbWVyZ2UgY29uZmxpY3QgZm9yIGZpZWxkIFwiICsga2V5KTtcbiAgICAgICAgfVxuICAgIGZvciAobGV0IGtleSBpbiBkZWZhdWx0cylcbiAgICAgICAgaWYgKHJlc3VsdFtrZXldID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IGRlZmF1bHRzW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG5FYWNoIHJhbmdlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHZhbHVlLCB3aGljaCBtdXN0IGluaGVyaXQgZnJvbVxudGhpcyBjbGFzcy5cbiovXG5jbGFzcyBSYW5nZVZhbHVlIHtcbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgdmFsdWUgd2l0aCBhbm90aGVyIHZhbHVlLiBVc2VkIHdoZW4gY29tcGFyaW5nXG4gICAgcmFuZ2VzZXRzLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjb21wYXJlcyBieSBpZGVudGl0eS5cbiAgICBVbmxlc3MgeW91IGFyZSBvbmx5IGNyZWF0aW5nIGEgZml4ZWQgbnVtYmVyIG9mIHVuaXF1ZSBpbnN0YW5jZXNcbiAgICBvZiB5b3VyIHZhbHVlIHR5cGUsIGl0IGlzIGEgZ29vZCBpZGVhIHRvIGltcGxlbWVudCB0aGlzXG4gICAgcHJvcGVybHkuXG4gICAgKi9cbiAgICBlcShvdGhlcikgeyByZXR1cm4gdGhpcyA9PSBvdGhlcjsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIFtyYW5nZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZSkgd2l0aCB0aGlzIHZhbHVlLlxuICAgICovXG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7IHJldHVybiBSYW5nZS5jcmVhdGUoZnJvbSwgdG8sIHRoaXMpOyB9XG59XG5SYW5nZVZhbHVlLnByb3RvdHlwZS5zdGFydFNpZGUgPSBSYW5nZVZhbHVlLnByb3RvdHlwZS5lbmRTaWRlID0gMDtcblJhbmdlVmFsdWUucHJvdG90eXBlLnBvaW50ID0gZmFsc2U7XG5SYW5nZVZhbHVlLnByb3RvdHlwZS5tYXBNb2RlID0gTWFwTW9kZS5UcmFja0RlbDtcbi8qKlxuQSByYW5nZSBhc3NvY2lhdGVzIGEgdmFsdWUgd2l0aCBhIHJhbmdlIG9mIHBvc2l0aW9ucy5cbiovXG5jbGFzcyBSYW5nZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHJhbmdlJ3Mgc3RhcnQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBJdHMgZW5kIHBvc2l0aW9uLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByYW5nZS5cbiAgICAqL1xuICAgIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZnJvbSwgdG8sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UoZnJvbSwgdG8sIHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbXBSYW5nZShhLCBiKSB7XG4gICAgcmV0dXJuIGEuZnJvbSAtIGIuZnJvbSB8fCBhLnZhbHVlLnN0YXJ0U2lkZSAtIGIudmFsdWUuc3RhcnRTaWRlO1xufVxuY2xhc3MgQ2h1bmsge1xuICAgIGNvbnN0cnVjdG9yKGZyb20sIHRvLCB2YWx1ZSwgXG4gICAgLy8gQ2h1bmtzIGFyZSBtYXJrZWQgd2l0aCB0aGUgbGFyZ2VzdCBwb2ludCB0aGF0IG9jY3Vyc1xuICAgIC8vIGluIHRoZW0gKG9yIC0xIGZvciBubyBwb2ludHMpLCBzbyB0aGF0IHNjYW5zIHRoYXQgYXJlXG4gICAgLy8gb25seSBpbnRlcmVzdGVkIGluIHBvaW50cyAoc3VjaCBhcyB0aGVcbiAgICAvLyBoZWlnaHRtYXAtcmVsYXRlZCBsb2dpYykgY2FuIHNraXAgcmFuZ2Utb25seSBjaHVua3MuXG4gICAgbWF4UG9pbnQpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSBtYXhQb2ludDtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMudG9bdGhpcy50by5sZW5ndGggLSAxXTsgfVxuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgc2lkZS4gVXNlIHRoZSByYW5nZXMnXG4gICAgLy8gYGZyb21gIHBvcyB3aGVuIGBlbmQgPT0gZmFsc2VgLCBgdG9gIHdoZW4gYGVuZCA9PSB0cnVlYC5cbiAgICBmaW5kSW5kZXgocG9zLCBzaWRlLCBlbmQsIHN0YXJ0QXQgPSAwKSB7XG4gICAgICAgIGxldCBhcnIgPSBlbmQgPyB0aGlzLnRvIDogdGhpcy5mcm9tO1xuICAgICAgICBmb3IgKGxldCBsbyA9IHN0YXJ0QXQsIGhpID0gYXJyLmxlbmd0aDs7KSB7XG4gICAgICAgICAgICBpZiAobG8gPT0gaGkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvO1xuICAgICAgICAgICAgbGV0IG1pZCA9IChsbyArIGhpKSA+PiAxO1xuICAgICAgICAgICAgbGV0IGRpZmYgPSBhcnJbbWlkXSAtIHBvcyB8fCAoZW5kID8gdGhpcy52YWx1ZVttaWRdLmVuZFNpZGUgOiB0aGlzLnZhbHVlW21pZF0uc3RhcnRTaWRlKSAtIHNpZGU7XG4gICAgICAgICAgICBpZiAobWlkID09IGxvKVxuICAgICAgICAgICAgICAgIHJldHVybiBkaWZmID49IDAgPyBsbyA6IGhpO1xuICAgICAgICAgICAgaWYgKGRpZmYgPj0gMClcbiAgICAgICAgICAgICAgICBoaSA9IG1pZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBsbyA9IG1pZCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmV0d2VlbihvZmZzZXQsIGZyb20sIHRvLCBmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmZpbmRJbmRleChmcm9tLCAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLywgdHJ1ZSksIGUgPSB0aGlzLmZpbmRJbmRleCh0bywgMTAwMDAwMDAwMCAvKiBDLkZhciAqLywgZmFsc2UsIGkpOyBpIDwgZTsgaSsrKVxuICAgICAgICAgICAgaWYgKGYodGhpcy5mcm9tW2ldICsgb2Zmc2V0LCB0aGlzLnRvW2ldICsgb2Zmc2V0LCB0aGlzLnZhbHVlW2ldKSA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBtYXAob2Zmc2V0LCBjaGFuZ2VzKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IFtdLCBmcm9tID0gW10sIHRvID0gW10sIG5ld1BvcyA9IC0xLCBtYXhQb2ludCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSB0aGlzLnZhbHVlW2ldLCBjdXJGcm9tID0gdGhpcy5mcm9tW2ldICsgb2Zmc2V0LCBjdXJUbyA9IHRoaXMudG9baV0gKyBvZmZzZXQsIG5ld0Zyb20sIG5ld1RvO1xuICAgICAgICAgICAgaWYgKGN1ckZyb20gPT0gY3VyVG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFwcGVkID0gY2hhbmdlcy5tYXBQb3MoY3VyRnJvbSwgdmFsLnN0YXJ0U2lkZSwgdmFsLm1hcE1vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChtYXBwZWQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgbmV3RnJvbSA9IG5ld1RvID0gbWFwcGVkO1xuICAgICAgICAgICAgICAgIGlmICh2YWwuc3RhcnRTaWRlICE9IHZhbC5lbmRTaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1RvID0gY2hhbmdlcy5tYXBQb3MoY3VyRnJvbSwgdmFsLmVuZFNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3VG8gPCBuZXdGcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3RnJvbSA9IGNoYW5nZXMubWFwUG9zKGN1ckZyb20sIHZhbC5zdGFydFNpZGUpO1xuICAgICAgICAgICAgICAgIG5ld1RvID0gY2hhbmdlcy5tYXBQb3MoY3VyVG8sIHZhbC5lbmRTaWRlKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3RnJvbSA+IG5ld1RvIHx8IG5ld0Zyb20gPT0gbmV3VG8gJiYgdmFsLnN0YXJ0U2lkZSA+IDAgJiYgdmFsLmVuZFNpZGUgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG5ld1RvIC0gbmV3RnJvbSB8fCB2YWwuZW5kU2lkZSAtIHZhbC5zdGFydFNpZGUpIDwgMClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChuZXdQb3MgPCAwKVxuICAgICAgICAgICAgICAgIG5ld1BvcyA9IG5ld0Zyb207XG4gICAgICAgICAgICBpZiAodmFsLnBvaW50KVxuICAgICAgICAgICAgICAgIG1heFBvaW50ID0gTWF0aC5tYXgobWF4UG9pbnQsIG5ld1RvIC0gbmV3RnJvbSk7XG4gICAgICAgICAgICB2YWx1ZS5wdXNoKHZhbCk7XG4gICAgICAgICAgICBmcm9tLnB1c2gobmV3RnJvbSAtIG5ld1Bvcyk7XG4gICAgICAgICAgICB0by5wdXNoKG5ld1RvIC0gbmV3UG9zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtYXBwZWQ6IHZhbHVlLmxlbmd0aCA/IG5ldyBDaHVuayhmcm9tLCB0bywgdmFsdWUsIG1heFBvaW50KSA6IG51bGwsIHBvczogbmV3UG9zIH07XG4gICAgfVxufVxuLyoqXG5BIHJhbmdlIHNldCBzdG9yZXMgYSBjb2xsZWN0aW9uIG9mIFtyYW5nZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpIGluIGFcbndheSB0aGF0IG1ha2VzIHRoZW0gZWZmaWNpZW50IHRvIFttYXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2VTZXQubWFwKSBhbmRcblt1cGRhdGVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2VTZXQudXBkYXRlKS4gVGhpcyBpcyBhbiBpbW11dGFibGUgZGF0YVxuc3RydWN0dXJlLlxuKi9cbmNsYXNzIFJhbmdlU2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNodW5rUG9zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNodW5rLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG5leHRMYXllciwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXhQb2ludCkge1xuICAgICAgICB0aGlzLmNodW5rUG9zID0gY2h1bmtQb3M7XG4gICAgICAgIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgICAgICAgdGhpcy5uZXh0TGF5ZXIgPSBuZXh0TGF5ZXI7XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSBtYXhQb2ludDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGNodW5rUG9zLCBjaHVuaywgbmV4dExheWVyLCBtYXhQb2ludCkge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlU2V0KGNodW5rUG9zLCBjaHVuaywgbmV4dExheWVyLCBtYXhQb2ludCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNodW5rLmxlbmd0aCAtIDE7XG4gICAgICAgIHJldHVybiBsYXN0IDwgMCA/IDAgOiBNYXRoLm1heCh0aGlzLmNodW5rRW5kKGxhc3QpLCB0aGlzLm5leHRMYXllci5sZW5ndGgpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbnVtYmVyIG9mIHJhbmdlcyBpbiB0aGUgc2V0LlxuICAgICovXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgbGV0IHNpemUgPSB0aGlzLm5leHRMYXllci5zaXplO1xuICAgICAgICBmb3IgKGxldCBjaHVuayBvZiB0aGlzLmNodW5rKVxuICAgICAgICAgICAgc2l6ZSArPSBjaHVuay52YWx1ZS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNodW5rRW5kKGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNodW5rUG9zW2luZGV4XSArIHRoaXMuY2h1bmtbaW5kZXhdLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSByYW5nZSBzZXQsIG9wdGlvbmFsbHkgYWRkaW5nIG5ldyByYW5nZXMgb3IgZmlsdGVyaW5nXG4gICAgb3V0IGV4aXN0aW5nIG9uZXMuXG4gICAgXG4gICAgKE5vdGU6IFRoZSB0eXBlIHBhcmFtZXRlciBpcyBqdXN0IHRoZXJlIGFzIGEga2x1ZGdlIHRvIHdvcmtcbiAgICBhcm91bmQgVHlwZVNjcmlwdCB2YXJpYW5jZSBpc3N1ZXMgdGhhdCBwcmV2ZW50ZWQgYFJhbmdlU2V0PFg+YFxuICAgIGZyb20gYmVpbmcgYSBzdWJ0eXBlIG9mIGBSYW5nZVNldDxZPmAgd2hlbiBgWGAgaXMgYSBzdWJ0eXBlIG9mXG4gICAgYFlgLilcbiAgICAqL1xuICAgIHVwZGF0ZSh1cGRhdGVTcGVjKSB7XG4gICAgICAgIGxldCB7IGFkZCA9IFtdLCBzb3J0ID0gZmFsc2UsIGZpbHRlckZyb20gPSAwLCBmaWx0ZXJUbyA9IHRoaXMubGVuZ3RoIH0gPSB1cGRhdGVTcGVjO1xuICAgICAgICBsZXQgZmlsdGVyID0gdXBkYXRlU3BlYy5maWx0ZXI7XG4gICAgICAgIGlmIChhZGQubGVuZ3RoID09IDAgJiYgIWZpbHRlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBpZiAoc29ydClcbiAgICAgICAgICAgIGFkZCA9IGFkZC5zbGljZSgpLnNvcnQoY21wUmFuZ2UpO1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIGFkZC5sZW5ndGggPyBSYW5nZVNldC5vZihhZGQpIDogdGhpcztcbiAgICAgICAgbGV0IGN1ciA9IG5ldyBMYXllckN1cnNvcih0aGlzLCBudWxsLCAtMSkuZ290bygwKSwgaSA9IDAsIHNwaWxsID0gW107XG4gICAgICAgIGxldCBidWlsZGVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICB3aGlsZSAoY3VyLnZhbHVlIHx8IGkgPCBhZGQubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaSA8IGFkZC5sZW5ndGggJiYgKGN1ci5mcm9tIC0gYWRkW2ldLmZyb20gfHwgY3VyLnN0YXJ0U2lkZSAtIGFkZFtpXS52YWx1ZS5zdGFydFNpZGUpID49IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBhZGRbaSsrXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJ1aWxkZXIuYWRkSW5uZXIocmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHJhbmdlLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgc3BpbGwucHVzaChyYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXIucmFuZ2VJbmRleCA9PSAxICYmIGN1ci5jaHVua0luZGV4IDwgdGhpcy5jaHVuay5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAoaSA9PSBhZGQubGVuZ3RoIHx8IHRoaXMuY2h1bmtFbmQoY3VyLmNodW5rSW5kZXgpIDwgYWRkW2ldLmZyb20pICYmXG4gICAgICAgICAgICAgICAgKCFmaWx0ZXIgfHwgZmlsdGVyRnJvbSA+IHRoaXMuY2h1bmtFbmQoY3VyLmNodW5rSW5kZXgpIHx8IGZpbHRlclRvIDwgdGhpcy5jaHVua1Bvc1tjdXIuY2h1bmtJbmRleF0pICYmXG4gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDaHVuayh0aGlzLmNodW5rUG9zW2N1ci5jaHVua0luZGV4XSwgdGhpcy5jaHVua1tjdXIuY2h1bmtJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgY3VyLm5leHRDaHVuaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyRnJvbSA+IGN1ci50byB8fCBmaWx0ZXJUbyA8IGN1ci5mcm9tIHx8IGZpbHRlcihjdXIuZnJvbSwgY3VyLnRvLCBjdXIudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYnVpbGRlci5hZGRJbm5lcihjdXIuZnJvbSwgY3VyLnRvLCBjdXIudmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3BpbGwucHVzaChSYW5nZS5jcmVhdGUoY3VyLmZyb20sIGN1ci50bywgY3VyLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1ci5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoSW5uZXIodGhpcy5uZXh0TGF5ZXIuaXNFbXB0eSAmJiAhc3BpbGwubGVuZ3RoID8gUmFuZ2VTZXQuZW1wdHlcbiAgICAgICAgICAgIDogdGhpcy5uZXh0TGF5ZXIudXBkYXRlKHsgYWRkOiBzcGlsbCwgZmlsdGVyLCBmaWx0ZXJGcm9tLCBmaWx0ZXJUbyB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIHJhbmdlIHNldCB0aHJvdWdoIGEgc2V0IG9mIGNoYW5nZXMsIHJldHVybiB0aGUgbmV3IHNldC5cbiAgICAqL1xuICAgIG1hcChjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmVtcHR5IHx8IHRoaXMuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgY2h1bmtzID0gW10sIGNodW5rUG9zID0gW10sIG1heFBvaW50ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaHVuay5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5jaHVua1Bvc1tpXSwgY2h1bmsgPSB0aGlzLmNodW5rW2ldO1xuICAgICAgICAgICAgbGV0IHRvdWNoID0gY2hhbmdlcy50b3VjaGVzUmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgY2h1bmsubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmICh0b3VjaCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBtYXhQb2ludCA9IE1hdGgubWF4KG1heFBvaW50LCBjaHVuay5tYXhQb2ludCk7XG4gICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgIGNodW5rUG9zLnB1c2goY2hhbmdlcy5tYXBQb3Moc3RhcnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgbWFwcGVkLCBwb3MgfSA9IGNodW5rLm1hcChzdGFydCwgY2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICBtYXhQb2ludCA9IE1hdGgubWF4KG1heFBvaW50LCBtYXBwZWQubWF4UG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChtYXBwZWQpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua1Bvcy5wdXNoKHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5uZXh0TGF5ZXIubWFwKGNoYW5nZXMpO1xuICAgICAgICByZXR1cm4gY2h1bmtzLmxlbmd0aCA9PSAwID8gbmV4dCA6IG5ldyBSYW5nZVNldChjaHVua1BvcywgY2h1bmtzLCBuZXh0IHx8IFJhbmdlU2V0LmVtcHR5LCBtYXhQb2ludCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgcmFuZ2VzIHRoYXQgdG91Y2ggdGhlIHJlZ2lvbiBgZnJvbWAgdG8gYHRvYCxcbiAgICBjYWxsaW5nIGBmYCBmb3IgZWFjaC4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHJhbmdlcyB3aWxsXG4gICAgYmUgcmVwb3J0ZWQgaW4gYW55IHNwZWNpZmljIG9yZGVyLiBXaGVuIHRoZSBjYWxsYmFjayByZXR1cm5zXG4gICAgYGZhbHNlYCwgaXRlcmF0aW9uIHN0b3BzLlxuICAgICovXG4gICAgYmV0d2Vlbihmcm9tLCB0bywgZikge1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2h1bmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuY2h1bmtQb3NbaV0sIGNodW5rID0gdGhpcy5jaHVua1tpXTtcbiAgICAgICAgICAgIGlmICh0byA+PSBzdGFydCAmJiBmcm9tIDw9IHN0YXJ0ICsgY2h1bmsubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgY2h1bmsuYmV0d2VlbihzdGFydCwgZnJvbSAtIHN0YXJ0LCB0byAtIHN0YXJ0LCBmKSA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dExheWVyLmJldHdlZW4oZnJvbSwgdG8sIGYpO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyBpbiB0aGlzIHNldCwgaW4gb3JkZXIsIGluY2x1ZGluZyBhbGxcbiAgICByYW5nZXMgdGhhdCBlbmQgYXQgb3IgYWZ0ZXIgYGZyb21gLlxuICAgICovXG4gICAgaXRlcihmcm9tID0gMCkge1xuICAgICAgICByZXR1cm4gSGVhcEN1cnNvci5mcm9tKFt0aGlzXSkuZ290byhmcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaXNFbXB0eSgpIHsgcmV0dXJuIHRoaXMubmV4dExheWVyID09IHRoaXM7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyBpbiBhIGNvbGxlY3Rpb24gb2Ygc2V0cywgaW4gb3JkZXIsXG4gICAgc3RhcnRpbmcgZnJvbSBgZnJvbWAuXG4gICAgKi9cbiAgICBzdGF0aWMgaXRlcihzZXRzLCBmcm9tID0gMCkge1xuICAgICAgICByZXR1cm4gSGVhcEN1cnNvci5mcm9tKHNldHMpLmdvdG8oZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0d28gZ3JvdXBzIG9mIHNldHMsIGNhbGxpbmcgbWV0aG9kcyBvbiBgY29tcGFyYXRvcmBcbiAgICB0byBub3RpZnkgaXQgb2YgcG9zc2libGUgZGlmZmVyZW5jZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgY29tcGFyZShvbGRTZXRzLCBuZXdTZXRzLCBcbiAgICAvKipcbiAgICBUaGlzIGluZGljYXRlcyBob3cgdGhlIHVuZGVybHlpbmcgZGF0YSBjaGFuZ2VkIGJldHdlZW4gdGhlc2VcbiAgICByYW5nZXMsIGFuZCBpcyBuZWVkZWQgdG8gc3luY2hyb25pemUgdGhlIGl0ZXJhdGlvbi5cbiAgICAqL1xuICAgIHRleHREaWZmLCBjb21wYXJhdG9yLCBcbiAgICAvKipcbiAgICBDYW4gYmUgdXNlZCB0byBpZ25vcmUgYWxsIG5vbi1wb2ludCByYW5nZXMsIGFuZCBwb2ludHMgYmVsb3dcbiAgICB0aGUgZ2l2ZW4gc2l6ZS4gV2hlbiAtMSwgYWxsIHJhbmdlcyBhcmUgY29tcGFyZWQuXG4gICAgKi9cbiAgICBtaW5Qb2ludFNpemUgPSAtMSkge1xuICAgICAgICBsZXQgYSA9IG9sZFNldHMuZmlsdGVyKHNldCA9PiBzZXQubWF4UG9pbnQgPiAwIHx8ICFzZXQuaXNFbXB0eSAmJiBzZXQubWF4UG9pbnQgPj0gbWluUG9pbnRTaXplKTtcbiAgICAgICAgbGV0IGIgPSBuZXdTZXRzLmZpbHRlcihzZXQgPT4gc2V0Lm1heFBvaW50ID4gMCB8fCAhc2V0LmlzRW1wdHkgJiYgc2V0Lm1heFBvaW50ID49IG1pblBvaW50U2l6ZSk7XG4gICAgICAgIGxldCBzaGFyZWRDaHVua3MgPSBmaW5kU2hhcmVkQ2h1bmtzKGEsIGIsIHRleHREaWZmKTtcbiAgICAgICAgbGV0IHNpZGVBID0gbmV3IFNwYW5DdXJzb3IoYSwgc2hhcmVkQ2h1bmtzLCBtaW5Qb2ludFNpemUpO1xuICAgICAgICBsZXQgc2lkZUIgPSBuZXcgU3BhbkN1cnNvcihiLCBzaGFyZWRDaHVua3MsIG1pblBvaW50U2l6ZSk7XG4gICAgICAgIHRleHREaWZmLml0ZXJHYXBzKChmcm9tQSwgZnJvbUIsIGxlbmd0aCkgPT4gY29tcGFyZShzaWRlQSwgZnJvbUEsIHNpZGVCLCBmcm9tQiwgbGVuZ3RoLCBjb21wYXJhdG9yKSk7XG4gICAgICAgIGlmICh0ZXh0RGlmZi5lbXB0eSAmJiB0ZXh0RGlmZi5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIGNvbXBhcmUoc2lkZUEsIDAsIHNpZGVCLCAwLCAwLCBjb21wYXJhdG9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGUgY29udGVudHMgb2YgdHdvIGdyb3VwcyBvZiByYW5nZSBzZXRzLCByZXR1cm5pbmcgdHJ1ZVxuICAgIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQgaW4gdGhlIGdpdmVuIHJhbmdlLlxuICAgICovXG4gICAgc3RhdGljIGVxKG9sZFNldHMsIG5ld1NldHMsIGZyb20gPSAwLCB0bykge1xuICAgICAgICBpZiAodG8gPT0gbnVsbClcbiAgICAgICAgICAgIHRvID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLyAtIDE7XG4gICAgICAgIGxldCBhID0gb2xkU2V0cy5maWx0ZXIoc2V0ID0+ICFzZXQuaXNFbXB0eSAmJiBuZXdTZXRzLmluZGV4T2Yoc2V0KSA8IDApO1xuICAgICAgICBsZXQgYiA9IG5ld1NldHMuZmlsdGVyKHNldCA9PiAhc2V0LmlzRW1wdHkgJiYgb2xkU2V0cy5pbmRleE9mKHNldCkgPCAwKTtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWEubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCBzaGFyZWRDaHVua3MgPSBmaW5kU2hhcmVkQ2h1bmtzKGEsIGIpO1xuICAgICAgICBsZXQgc2lkZUEgPSBuZXcgU3BhbkN1cnNvcihhLCBzaGFyZWRDaHVua3MsIDApLmdvdG8oZnJvbSksIHNpZGVCID0gbmV3IFNwYW5DdXJzb3IoYiwgc2hhcmVkQ2h1bmtzLCAwKS5nb3RvKGZyb20pO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoc2lkZUEudG8gIT0gc2lkZUIudG8gfHxcbiAgICAgICAgICAgICAgICAhc2FtZVZhbHVlcyhzaWRlQS5hY3RpdmUsIHNpZGVCLmFjdGl2ZSkgfHxcbiAgICAgICAgICAgICAgICBzaWRlQS5wb2ludCAmJiAoIXNpZGVCLnBvaW50IHx8ICFzaWRlQS5wb2ludC5lcShzaWRlQi5wb2ludCkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzaWRlQS50byA+IHRvKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgc2lkZUEubmV4dCgpO1xuICAgICAgICAgICAgc2lkZUIubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciBhIGdyb3VwIG9mIHJhbmdlIHNldHMgYXQgdGhlIHNhbWUgdGltZSwgbm90aWZ5aW5nXG4gICAgdGhlIGl0ZXJhdG9yIGFib3V0IHRoZSByYW5nZXMgY292ZXJpbmcgZXZlcnkgZ2l2ZW4gcGllY2Ugb2ZcbiAgICBjb250ZW50LiBSZXR1cm5zIHRoZSBvcGVuIGNvdW50IChzZWVcbiAgICBbYFNwYW5JdGVyYXRvci5zcGFuYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TcGFuSXRlcmF0b3Iuc3BhbikpIGF0IHRoZSBlbmRcbiAgICBvZiB0aGUgaXRlcmF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIHNwYW5zKHNldHMsIGZyb20sIHRvLCBpdGVyYXRvciwgXG4gICAgLyoqXG4gICAgV2hlbiBnaXZlbiBhbmQgZ3JlYXRlciB0aGFuIC0xLCBvbmx5IHBvaW50cyBvZiBhdCBsZWFzdCB0aGlzXG4gICAgc2l6ZSBhcmUgdGFrZW4gaW50byBhY2NvdW50LlxuICAgICovXG4gICAgbWluUG9pbnRTaXplID0gLTEpIHtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBTcGFuQ3Vyc29yKHNldHMsIG51bGwsIG1pblBvaW50U2l6ZSkuZ290byhmcm9tKSwgcG9zID0gZnJvbTtcbiAgICAgICAgbGV0IG9wZW5SYW5nZXMgPSBjdXJzb3Iub3BlblN0YXJ0O1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgY3VyVG8gPSBNYXRoLm1pbihjdXJzb3IudG8sIHRvKTtcbiAgICAgICAgICAgIGlmIChjdXJzb3IucG9pbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWN0aXZlID0gY3Vyc29yLmFjdGl2ZUZvclBvaW50KGN1cnNvci50byk7XG4gICAgICAgICAgICAgICAgbGV0IG9wZW5Db3VudCA9IGN1cnNvci5wb2ludEZyb20gPCBmcm9tID8gYWN0aXZlLmxlbmd0aCArIDFcbiAgICAgICAgICAgICAgICAgICAgOiBjdXJzb3IucG9pbnQuc3RhcnRTaWRlIDwgMCA/IGFjdGl2ZS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgIDogTWF0aC5taW4oYWN0aXZlLmxlbmd0aCwgb3BlblJhbmdlcyk7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3IucG9pbnQocG9zLCBjdXJUbywgY3Vyc29yLnBvaW50LCBhY3RpdmUsIG9wZW5Db3VudCwgY3Vyc29yLnBvaW50UmFuayk7XG4gICAgICAgICAgICAgICAgb3BlblJhbmdlcyA9IE1hdGgubWluKGN1cnNvci5vcGVuRW5kKGN1clRvKSwgYWN0aXZlLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJUbyA+IHBvcykge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNwYW4ocG9zLCBjdXJUbywgY3Vyc29yLmFjdGl2ZSwgb3BlblJhbmdlcyk7XG4gICAgICAgICAgICAgICAgb3BlblJhbmdlcyA9IGN1cnNvci5vcGVuRW5kKGN1clRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJzb3IudG8gPiB0bylcbiAgICAgICAgICAgICAgICByZXR1cm4gb3BlblJhbmdlcyArIChjdXJzb3IucG9pbnQgJiYgY3Vyc29yLnRvID4gdG8gPyAxIDogMCk7XG4gICAgICAgICAgICBwb3MgPSBjdXJzb3IudG87XG4gICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJhbmdlIHNldCBmb3IgdGhlIGdpdmVuIHJhbmdlIG9yIGFycmF5IG9mIHJhbmdlcy4gQnlcbiAgICBkZWZhdWx0LCB0aGlzIGV4cGVjdHMgdGhlIHJhbmdlcyB0byBiZSBfc29ydGVkXyAoYnkgc3RhcnRcbiAgICBwb3NpdGlvbiBhbmQsIGlmIHR3byBzdGFydCBhdCB0aGUgc2FtZSBwb3NpdGlvbixcbiAgICBgdmFsdWUuc3RhcnRTaWRlYCkuIFlvdSBjYW4gcGFzcyBgdHJ1ZWAgYXMgc2Vjb25kIGFyZ3VtZW50IHRvXG4gICAgY2F1c2UgdGhlIG1ldGhvZCB0byBzb3J0IHRoZW0uXG4gICAgKi9cbiAgICBzdGF0aWMgb2YocmFuZ2VzLCBzb3J0ID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IGJ1aWxkID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICBmb3IgKGxldCByYW5nZSBvZiByYW5nZXMgaW5zdGFuY2VvZiBSYW5nZSA/IFtyYW5nZXNdIDogc29ydCA/IGxhenlTb3J0KHJhbmdlcykgOiByYW5nZXMpXG4gICAgICAgICAgICBidWlsZC5hZGQocmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHJhbmdlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkLmZpbmlzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICBKb2luIGFuIGFycmF5IG9mIHJhbmdlIHNldHMgaW50byBhIHNpbmdsZSBzZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgam9pbihzZXRzKSB7XG4gICAgICAgIGlmICghc2V0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gUmFuZ2VTZXQuZW1wdHk7XG4gICAgICAgIGxldCByZXN1bHQgPSBzZXRzW3NldHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGZvciAobGV0IGkgPSBzZXRzLmxlbmd0aCAtIDI7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBsYXllciA9IHNldHNbaV07IGxheWVyICE9IFJhbmdlU2V0LmVtcHR5OyBsYXllciA9IGxheWVyLm5leHRMYXllcilcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUmFuZ2VTZXQobGF5ZXIuY2h1bmtQb3MsIGxheWVyLmNodW5rLCByZXN1bHQsIE1hdGgubWF4KGxheWVyLm1heFBvaW50LCByZXN1bHQubWF4UG9pbnQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNldCBvZiByYW5nZXMuXG4qL1xuUmFuZ2VTZXQuZW1wdHkgPSAvKkBfX1BVUkVfXyovbmV3IFJhbmdlU2V0KFtdLCBbXSwgbnVsbCwgLTEpO1xuZnVuY3Rpb24gbGF6eVNvcnQocmFuZ2VzKSB7XG4gICAgaWYgKHJhbmdlcy5sZW5ndGggPiAxKVxuICAgICAgICBmb3IgKGxldCBwcmV2ID0gcmFuZ2VzWzBdLCBpID0gMTsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGN1ciA9IHJhbmdlc1tpXTtcbiAgICAgICAgICAgIGlmIChjbXBSYW5nZShwcmV2LCBjdXIpID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2VzLnNsaWNlKCkuc29ydChjbXBSYW5nZSk7XG4gICAgICAgICAgICBwcmV2ID0gY3VyO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblJhbmdlU2V0LmVtcHR5Lm5leHRMYXllciA9IFJhbmdlU2V0LmVtcHR5O1xuLyoqXG5BIHJhbmdlIHNldCBidWlsZGVyIGlzIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBoZWxwcyBidWlsZCB1cCBhXG5bcmFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0KSBkaXJlY3RseSwgd2l0aG91dCBmaXJzdCBhbGxvY2F0aW5nXG5hbiBhcnJheSBvZiBbYFJhbmdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZSkgb2JqZWN0cy5cbiovXG5jbGFzcyBSYW5nZVNldEJ1aWxkZXIge1xuICAgIGZpbmlzaENodW5rKG5ld0FycmF5cykge1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKG5ldyBDaHVuayh0aGlzLmZyb20sIHRoaXMudG8sIHRoaXMudmFsdWUsIHRoaXMubWF4UG9pbnQpKTtcbiAgICAgICAgdGhpcy5jaHVua1Bvcy5wdXNoKHRoaXMuY2h1bmtTdGFydCk7XG4gICAgICAgIHRoaXMuY2h1bmtTdGFydCA9IC0xO1xuICAgICAgICB0aGlzLnNldE1heFBvaW50ID0gTWF0aC5tYXgodGhpcy5zZXRNYXhQb2ludCwgdGhpcy5tYXhQb2ludCk7XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSAtMTtcbiAgICAgICAgaWYgKG5ld0FycmF5cykge1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gW107XG4gICAgICAgICAgICB0aGlzLnRvID0gW107XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGVtcHR5IGJ1aWxkZXIuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1BvcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0RnJvbSA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICB0aGlzLmxhc3RUbyA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICB0aGlzLmZyb20gPSBbXTtcbiAgICAgICAgdGhpcy50byA9IFtdO1xuICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSAtMTtcbiAgICAgICAgdGhpcy5zZXRNYXhQb2ludCA9IC0xO1xuICAgICAgICB0aGlzLm5leHRMYXllciA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCBhIHJhbmdlLiBSYW5nZXMgc2hvdWxkIGJlIGFkZGVkIGluIHNvcnRlZCAoYnkgYGZyb21gIGFuZFxuICAgIGB2YWx1ZS5zdGFydFNpZGVgKSBvcmRlci5cbiAgICAqL1xuICAgIGFkZChmcm9tLCB0bywgdmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFkZElubmVyKGZyb20sIHRvLCB2YWx1ZSkpXG4gICAgICAgICAgICAodGhpcy5uZXh0TGF5ZXIgfHwgKHRoaXMubmV4dExheWVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcikpLmFkZChmcm9tLCB0bywgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFkZElubmVyKGZyb20sIHRvLCB2YWx1ZSkge1xuICAgICAgICBsZXQgZGlmZiA9IGZyb20gLSB0aGlzLmxhc3RUbyB8fCB2YWx1ZS5zdGFydFNpZGUgLSB0aGlzLmxhc3QuZW5kU2lkZTtcbiAgICAgICAgaWYgKGRpZmYgPD0gMCAmJiAoZnJvbSAtIHRoaXMubGFzdEZyb20gfHwgdmFsdWUuc3RhcnRTaWRlIC0gdGhpcy5sYXN0LnN0YXJ0U2lkZSkgPCAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmFuZ2VzIG11c3QgYmUgYWRkZWQgc29ydGVkIGJ5IGBmcm9tYCBwb3NpdGlvbiBhbmQgYHN0YXJ0U2lkZWBcIik7XG4gICAgICAgIGlmIChkaWZmIDwgMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZnJvbS5sZW5ndGggPT0gMjUwIC8qIEMuQ2h1bmtTaXplICovKVxuICAgICAgICAgICAgdGhpcy5maW5pc2hDaHVuayh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtTdGFydCA8IDApXG4gICAgICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSBmcm9tO1xuICAgICAgICB0aGlzLmZyb20ucHVzaChmcm9tIC0gdGhpcy5jaHVua1N0YXJ0KTtcbiAgICAgICAgdGhpcy50by5wdXNoKHRvIC0gdGhpcy5jaHVua1N0YXJ0KTtcbiAgICAgICAgdGhpcy5sYXN0ID0gdmFsdWU7XG4gICAgICAgIHRoaXMubGFzdEZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmxhc3RUbyA9IHRvO1xuICAgICAgICB0aGlzLnZhbHVlLnB1c2godmFsdWUpO1xuICAgICAgICBpZiAodmFsdWUucG9pbnQpXG4gICAgICAgICAgICB0aGlzLm1heFBvaW50ID0gTWF0aC5tYXgodGhpcy5tYXhQb2ludCwgdG8gLSBmcm9tKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYWRkQ2h1bmsoZnJvbSwgY2h1bmspIHtcbiAgICAgICAgaWYgKChmcm9tIC0gdGhpcy5sYXN0VG8gfHwgY2h1bmsudmFsdWVbMF0uc3RhcnRTaWRlIC0gdGhpcy5sYXN0LmVuZFNpZGUpIDwgMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZnJvbS5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmZpbmlzaENodW5rKHRydWUpO1xuICAgICAgICB0aGlzLnNldE1heFBvaW50ID0gTWF0aC5tYXgodGhpcy5zZXRNYXhQb2ludCwgY2h1bmsubWF4UG9pbnQpO1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgdGhpcy5jaHVua1Bvcy5wdXNoKGZyb20pO1xuICAgICAgICBsZXQgbGFzdCA9IGNodW5rLnZhbHVlLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMubGFzdCA9IGNodW5rLnZhbHVlW2xhc3RdO1xuICAgICAgICB0aGlzLmxhc3RGcm9tID0gY2h1bmsuZnJvbVtsYXN0XSArIGZyb207XG4gICAgICAgIHRoaXMubGFzdFRvID0gY2h1bmsudG9bbGFzdF0gKyBmcm9tO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluaXNoIHRoZSByYW5nZSBzZXQuIFJldHVybnMgdGhlIG5ldyBzZXQuIFRoZSBidWlsZGVyIGNhbid0IGJlXG4gICAgdXNlZCBhbnltb3JlIGFmdGVyIHRoaXMgaGFzIGJlZW4gY2FsbGVkLlxuICAgICovXG4gICAgZmluaXNoKCkgeyByZXR1cm4gdGhpcy5maW5pc2hJbm5lcihSYW5nZVNldC5lbXB0eSk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbmlzaElubmVyKG5leHQpIHtcbiAgICAgICAgaWYgKHRoaXMuZnJvbS5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmZpbmlzaENodW5rKGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIGxldCByZXN1bHQgPSBSYW5nZVNldC5jcmVhdGUodGhpcy5jaHVua1BvcywgdGhpcy5jaHVua3MsIHRoaXMubmV4dExheWVyID8gdGhpcy5uZXh0TGF5ZXIuZmluaXNoSW5uZXIobmV4dCkgOiBuZXh0LCB0aGlzLnNldE1heFBvaW50KTtcbiAgICAgICAgdGhpcy5mcm9tID0gbnVsbDsgLy8gTWFrZSBzdXJlIGZ1cnRoZXIgYGFkZGAgY2FsbHMgcHJvZHVjZSBlcnJvcnNcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kU2hhcmVkQ2h1bmtzKGEsIGIsIHRleHREaWZmKSB7XG4gICAgbGV0IGluQSA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGxldCBzZXQgb2YgYSlcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQuY2h1bmsubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoc2V0LmNodW5rW2ldLm1heFBvaW50IDw9IDApXG4gICAgICAgICAgICAgICAgaW5BLnNldChzZXQuY2h1bmtbaV0sIHNldC5jaHVua1Bvc1tpXSk7XG4gICAgbGV0IHNoYXJlZCA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGxldCBzZXQgb2YgYilcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQuY2h1bmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBrbm93biA9IGluQS5nZXQoc2V0LmNodW5rW2ldKTtcbiAgICAgICAgICAgIGlmIChrbm93biAhPSBudWxsICYmICh0ZXh0RGlmZiA/IHRleHREaWZmLm1hcFBvcyhrbm93bikgOiBrbm93bikgPT0gc2V0LmNodW5rUG9zW2ldICYmXG4gICAgICAgICAgICAgICAgISh0ZXh0RGlmZiA9PT0gbnVsbCB8fCB0ZXh0RGlmZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dERpZmYudG91Y2hlc1JhbmdlKGtub3duLCBrbm93biArIHNldC5jaHVua1tpXS5sZW5ndGgpKSlcbiAgICAgICAgICAgICAgICBzaGFyZWQuYWRkKHNldC5jaHVua1tpXSk7XG4gICAgICAgIH1cbiAgICByZXR1cm4gc2hhcmVkO1xufVxuY2xhc3MgTGF5ZXJDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGxheWVyLCBza2lwLCBtaW5Qb2ludCwgcmFuayA9IDApIHtcbiAgICAgICAgdGhpcy5sYXllciA9IGxheWVyO1xuICAgICAgICB0aGlzLnNraXAgPSBza2lwO1xuICAgICAgICB0aGlzLm1pblBvaW50ID0gbWluUG9pbnQ7XG4gICAgICAgIHRoaXMucmFuayA9IHJhbms7XG4gICAgfVxuICAgIGdldCBzdGFydFNpZGUoKSB7IHJldHVybiB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5zdGFydFNpZGUgOiAwOyB9XG4gICAgZ2V0IGVuZFNpZGUoKSB7IHJldHVybiB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5lbmRTaWRlIDogMDsgfVxuICAgIGdvdG8ocG9zLCBzaWRlID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi8pIHtcbiAgICAgICAgdGhpcy5jaHVua0luZGV4ID0gdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5nb3RvSW5uZXIocG9zLCBzaWRlLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBnb3RvSW5uZXIocG9zLCBzaWRlLCBmb3J3YXJkKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLmNodW5rSW5kZXggPCB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF07XG4gICAgICAgICAgICBpZiAoISh0aGlzLnNraXAgJiYgdGhpcy5za2lwLmhhcyhuZXh0KSB8fFxuICAgICAgICAgICAgICAgIHRoaXMubGF5ZXIuY2h1bmtFbmQodGhpcy5jaHVua0luZGV4KSA8IHBvcyB8fFxuICAgICAgICAgICAgICAgIG5leHQubWF4UG9pbnQgPCB0aGlzLm1pblBvaW50KSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgZm9yd2FyZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNodW5rSW5kZXggPCB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJhbmdlSW5kZXggPSB0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF0uZmluZEluZGV4KHBvcyAtIHRoaXMubGF5ZXIuY2h1bmtQb3NbdGhpcy5jaHVua0luZGV4XSwgc2lkZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIWZvcndhcmQgfHwgdGhpcy5yYW5nZUluZGV4IDwgcmFuZ2VJbmRleClcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlSW5kZXgocmFuZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICAgIGZvcndhcmQocG9zLCBzaWRlKSB7XG4gICAgICAgIGlmICgodGhpcy50byAtIHBvcyB8fCB0aGlzLmVuZFNpZGUgLSBzaWRlKSA8IDApXG4gICAgICAgICAgICB0aGlzLmdvdG9Jbm5lcihwb3MsIHNpZGUsIHRydWUpO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaHVua0luZGV4ID09IHRoaXMubGF5ZXIuY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcm9tID0gdGhpcy50byA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgY2h1bmtQb3MgPSB0aGlzLmxheWVyLmNodW5rUG9zW3RoaXMuY2h1bmtJbmRleF0sIGNodW5rID0gdGhpcy5sYXllci5jaHVua1t0aGlzLmNodW5rSW5kZXhdO1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gY2h1bmtQb3MgKyBjaHVuay5mcm9tW3RoaXMucmFuZ2VJbmRleF07XG4gICAgICAgICAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvID0gY2h1bmtQb3MgKyBjaHVuay50b1t0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBjaHVuay52YWx1ZVt0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2VJbmRleCh0aGlzLnJhbmdlSW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5taW5Qb2ludCA8IDAgfHwgdGhpcy52YWx1ZS5wb2ludCAmJiB0aGlzLnRvIC0gdGhpcy5mcm9tID49IHRoaXMubWluUG9pbnQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNldFJhbmdlSW5kZXgoaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID09IHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2tpcCkge1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLmNodW5rSW5kZXggPCB0aGlzLmxheWVyLmNodW5rLmxlbmd0aCAmJiB0aGlzLnNraXAuaGFzKHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XSkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIG5leHRDaHVuaygpIHtcbiAgICAgICAgdGhpcy5jaHVua0luZGV4Kys7XG4gICAgICAgIHRoaXMucmFuZ2VJbmRleCA9IDA7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICBjb21wYXJlKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb20gLSBvdGhlci5mcm9tIHx8IHRoaXMuc3RhcnRTaWRlIC0gb3RoZXIuc3RhcnRTaWRlIHx8IHRoaXMucmFuayAtIG90aGVyLnJhbmsgfHxcbiAgICAgICAgICAgIHRoaXMudG8gLSBvdGhlci50byB8fCB0aGlzLmVuZFNpZGUgLSBvdGhlci5lbmRTaWRlO1xuICAgIH1cbn1cbmNsYXNzIEhlYXBDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGhlYXApIHtcbiAgICAgICAgdGhpcy5oZWFwID0gaGVhcDtcbiAgICB9XG4gICAgc3RhdGljIGZyb20oc2V0cywgc2tpcCA9IG51bGwsIG1pblBvaW50ID0gLTEpIHtcbiAgICAgICAgbGV0IGhlYXAgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjdXIgPSBzZXRzW2ldOyAhY3VyLmlzRW1wdHk7IGN1ciA9IGN1ci5uZXh0TGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VyLm1heFBvaW50ID49IG1pblBvaW50KVxuICAgICAgICAgICAgICAgICAgICBoZWFwLnB1c2gobmV3IExheWVyQ3Vyc29yKGN1ciwgc2tpcCwgbWluUG9pbnQsIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVhcC5sZW5ndGggPT0gMSA/IGhlYXBbMF0gOiBuZXcgSGVhcEN1cnNvcihoZWFwKTtcbiAgICB9XG4gICAgZ2V0IHN0YXJ0U2lkZSgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLnN0YXJ0U2lkZSA6IDA7IH1cbiAgICBnb3RvKHBvcywgc2lkZSA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovKSB7XG4gICAgICAgIGZvciAobGV0IGN1ciBvZiB0aGlzLmhlYXApXG4gICAgICAgICAgICBjdXIuZ290byhwb3MsIHNpZGUpO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5oZWFwLmxlbmd0aCA+PiAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgIGhlYXBCdWJibGUodGhpcy5oZWFwLCBpKTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBmb3J3YXJkKHBvcywgc2lkZSkge1xuICAgICAgICBmb3IgKGxldCBjdXIgb2YgdGhpcy5oZWFwKVxuICAgICAgICAgICAgY3VyLmZvcndhcmQocG9zLCBzaWRlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaGVhcC5sZW5ndGggPj4gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBoZWFwQnViYmxlKHRoaXMuaGVhcCwgaSk7XG4gICAgICAgIGlmICgodGhpcy50byAtIHBvcyB8fCB0aGlzLnZhbHVlLmVuZFNpZGUgLSBzaWRlKSA8IDApXG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGVhcC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gdGhpcy50byA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMucmFuayA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMuaGVhcFswXTtcbiAgICAgICAgICAgIHRoaXMuZnJvbSA9IHRvcC5mcm9tO1xuICAgICAgICAgICAgdGhpcy50byA9IHRvcC50bztcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0b3AudmFsdWU7XG4gICAgICAgICAgICB0aGlzLnJhbmsgPSB0b3AucmFuaztcbiAgICAgICAgICAgIGlmICh0b3AudmFsdWUpXG4gICAgICAgICAgICAgICAgdG9wLm5leHQoKTtcbiAgICAgICAgICAgIGhlYXBCdWJibGUodGhpcy5oZWFwLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGhlYXBCdWJibGUoaGVhcCwgaW5kZXgpIHtcbiAgICBmb3IgKGxldCBjdXIgPSBoZWFwW2luZGV4XTs7KSB7XG4gICAgICAgIGxldCBjaGlsZEluZGV4ID0gKGluZGV4IDw8IDEpICsgMTtcbiAgICAgICAgaWYgKGNoaWxkSW5kZXggPj0gaGVhcC5sZW5ndGgpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IGNoaWxkID0gaGVhcFtjaGlsZEluZGV4XTtcbiAgICAgICAgaWYgKGNoaWxkSW5kZXggKyAxIDwgaGVhcC5sZW5ndGggJiYgY2hpbGQuY29tcGFyZShoZWFwW2NoaWxkSW5kZXggKyAxXSkgPj0gMCkge1xuICAgICAgICAgICAgY2hpbGQgPSBoZWFwW2NoaWxkSW5kZXggKyAxXTtcbiAgICAgICAgICAgIGNoaWxkSW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VyLmNvbXBhcmUoY2hpbGQpIDwgMClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBoZWFwW2NoaWxkSW5kZXhdID0gY3VyO1xuICAgICAgICBoZWFwW2luZGV4XSA9IGNoaWxkO1xuICAgICAgICBpbmRleCA9IGNoaWxkSW5kZXg7XG4gICAgfVxufVxuY2xhc3MgU3BhbkN1cnNvciB7XG4gICAgY29uc3RydWN0b3Ioc2V0cywgc2tpcCwgbWluUG9pbnQpIHtcbiAgICAgICAgdGhpcy5taW5Qb2ludCA9IG1pblBvaW50O1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IFtdO1xuICAgICAgICB0aGlzLmFjdGl2ZVRvID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlUmFuayA9IFtdO1xuICAgICAgICB0aGlzLm1pbkFjdGl2ZSA9IC0xO1xuICAgICAgICAvLyBBIGN1cnJlbnRseSBhY3RpdmUgcG9pbnQgcmFuZ2UsIGlmIGFueVxuICAgICAgICB0aGlzLnBvaW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb2ludEZyb20gPSAwO1xuICAgICAgICB0aGlzLnBvaW50UmFuayA9IDA7XG4gICAgICAgIHRoaXMudG8gPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgdGhpcy5lbmRTaWRlID0gMDtcbiAgICAgICAgLy8gVGhlIGFtb3VudCBvZiBvcGVuIGFjdGl2ZSByYW5nZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgLy8gTm90IGluY2x1ZGluZyBwb2ludHMuXG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gSGVhcEN1cnNvci5mcm9tKHNldHMsIHNraXAsIG1pblBvaW50KTtcbiAgICB9XG4gICAgZ290byhwb3MsIHNpZGUgPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLykge1xuICAgICAgICB0aGlzLmN1cnNvci5nb3RvKHBvcywgc2lkZSk7XG4gICAgICAgIHRoaXMuYWN0aXZlLmxlbmd0aCA9IHRoaXMuYWN0aXZlVG8ubGVuZ3RoID0gdGhpcy5hY3RpdmVSYW5rLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMubWluQWN0aXZlID0gLTE7XG4gICAgICAgIHRoaXMudG8gPSBwb3M7XG4gICAgICAgIHRoaXMuZW5kU2lkZSA9IHNpZGU7XG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZm9yd2FyZChwb3MsIHNpZGUpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMubWluQWN0aXZlID4gLTEgJiYgKHRoaXMuYWN0aXZlVG9bdGhpcy5taW5BY3RpdmVdIC0gcG9zIHx8IHRoaXMuYWN0aXZlW3RoaXMubWluQWN0aXZlXS5lbmRTaWRlIC0gc2lkZSkgPCAwKVxuICAgICAgICAgICAgdGhpcy5yZW1vdmVBY3RpdmUodGhpcy5taW5BY3RpdmUpO1xuICAgICAgICB0aGlzLmN1cnNvci5mb3J3YXJkKHBvcywgc2lkZSk7XG4gICAgfVxuICAgIHJlbW92ZUFjdGl2ZShpbmRleCkge1xuICAgICAgICByZW1vdmUodGhpcy5hY3RpdmUsIGluZGV4KTtcbiAgICAgICAgcmVtb3ZlKHRoaXMuYWN0aXZlVG8sIGluZGV4KTtcbiAgICAgICAgcmVtb3ZlKHRoaXMuYWN0aXZlUmFuaywgaW5kZXgpO1xuICAgICAgICB0aGlzLm1pbkFjdGl2ZSA9IGZpbmRNaW5JbmRleCh0aGlzLmFjdGl2ZSwgdGhpcy5hY3RpdmVUbyk7XG4gICAgfVxuICAgIGFkZEFjdGl2ZSh0cmFja09wZW4pIHtcbiAgICAgICAgbGV0IGkgPSAwLCB7IHZhbHVlLCB0bywgcmFuayB9ID0gdGhpcy5jdXJzb3I7XG4gICAgICAgIC8vIE9yZ2FuaXplIGFjdGl2ZSBtYXJrcyBieSByYW5rIGZpcnN0LCB0aGVuIGJ5IHNpemVcbiAgICAgICAgd2hpbGUgKGkgPCB0aGlzLmFjdGl2ZVJhbmsubGVuZ3RoICYmIChyYW5rIC0gdGhpcy5hY3RpdmVSYW5rW2ldIHx8IHRvIC0gdGhpcy5hY3RpdmVUb1tpXSkgPiAwKVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICBpbnNlcnQodGhpcy5hY3RpdmUsIGksIHZhbHVlKTtcbiAgICAgICAgaW5zZXJ0KHRoaXMuYWN0aXZlVG8sIGksIHRvKTtcbiAgICAgICAgaW5zZXJ0KHRoaXMuYWN0aXZlUmFuaywgaSwgcmFuayk7XG4gICAgICAgIGlmICh0cmFja09wZW4pXG4gICAgICAgICAgICBpbnNlcnQodHJhY2tPcGVuLCBpLCB0aGlzLmN1cnNvci5mcm9tKTtcbiAgICAgICAgdGhpcy5taW5BY3RpdmUgPSBmaW5kTWluSW5kZXgodGhpcy5hY3RpdmUsIHRoaXMuYWN0aXZlVG8pO1xuICAgIH1cbiAgICAvLyBBZnRlciBjYWxsaW5nIHRoaXMsIGlmIGB0aGlzLnBvaW50YCAhPSBudWxsLCB0aGUgbmV4dCByYW5nZSBpcyBhXG4gICAgLy8gcG9pbnQuIE90aGVyd2lzZSwgaXQncyBhIHJlZ3VsYXIgcmFuZ2UsIGNvdmVyZWQgYnkgYHRoaXMuYWN0aXZlYC5cbiAgICBuZXh0KCkge1xuICAgICAgICBsZXQgZnJvbSA9IHRoaXMudG8sIHdhc1BvaW50ID0gdGhpcy5wb2ludDtcbiAgICAgICAgdGhpcy5wb2ludCA9IG51bGw7XG4gICAgICAgIGxldCB0cmFja09wZW4gPSB0aGlzLm9wZW5TdGFydCA8IDAgPyBbXSA6IG51bGw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBhID0gdGhpcy5taW5BY3RpdmU7XG4gICAgICAgICAgICBpZiAoYSA+IC0xICYmICh0aGlzLmFjdGl2ZVRvW2FdIC0gdGhpcy5jdXJzb3IuZnJvbSB8fCB0aGlzLmFjdGl2ZVthXS5lbmRTaWRlIC0gdGhpcy5jdXJzb3Iuc3RhcnRTaWRlKSA8IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVUb1thXSA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50byA9IHRoaXMuYWN0aXZlVG9bYV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kU2lkZSA9IHRoaXMuYWN0aXZlW2FdLmVuZFNpZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUFjdGl2ZShhKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tPcGVuKVxuICAgICAgICAgICAgICAgICAgICByZW1vdmUodHJhY2tPcGVuLCBhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmN1cnNvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG8gPSB0aGlzLmVuZFNpZGUgPSAxMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jdXJzb3IuZnJvbSA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvID0gdGhpcy5jdXJzb3IuZnJvbTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFNpZGUgPSB0aGlzLmN1cnNvci5zdGFydFNpZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFZhbCA9IHRoaXMuY3Vyc29yLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghbmV4dFZhbC5wb2ludCkgeyAvLyBPcGVuaW5nIGEgcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRBY3RpdmUodHJhY2tPcGVuKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh3YXNQb2ludCAmJiB0aGlzLmN1cnNvci50byA9PSB0aGlzLnRvICYmIHRoaXMuY3Vyc29yLmZyb20gPCB0aGlzLmN1cnNvci50bykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYW55IG5vbi1lbXB0eSBwb2ludHMgdGhhdCBlbmQgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgdGhlIHByZXYgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgLy8gTmV3IHBvaW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnQgPSBuZXh0VmFsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50RnJvbSA9IHRoaXMuY3Vyc29yLmZyb207XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRSYW5rID0gdGhpcy5jdXJzb3IucmFuaztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50byA9IHRoaXMuY3Vyc29yLnRvO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZFNpZGUgPSBuZXh0VmFsLmVuZFNpZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3J3YXJkKHRoaXMudG8sIHRoaXMuZW5kU2lkZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2tPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5TdGFydCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdHJhY2tPcGVuLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiB0cmFja09wZW5baV0gPCBmcm9tOyBpLS0pXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuU3RhcnQrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhY3RpdmVGb3JQb2ludCh0bykge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgICAgICAgbGV0IGFjdGl2ZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVJhbmtbaV0gPCB0aGlzLnBvaW50UmFuaylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVRvW2ldID4gdG8gfHwgdGhpcy5hY3RpdmVUb1tpXSA9PSB0byAmJiB0aGlzLmFjdGl2ZVtpXS5lbmRTaWRlID49IHRoaXMucG9pbnQuZW5kU2lkZSlcbiAgICAgICAgICAgICAgICBhY3RpdmUucHVzaCh0aGlzLmFjdGl2ZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjdGl2ZS5yZXZlcnNlKCk7XG4gICAgfVxuICAgIG9wZW5FbmQodG8pIHtcbiAgICAgICAgbGV0IG9wZW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVUby5sZW5ndGggLSAxOyBpID49IDAgJiYgdGhpcy5hY3RpdmVUb1tpXSA+IHRvOyBpLS0pXG4gICAgICAgICAgICBvcGVuKys7XG4gICAgICAgIHJldHVybiBvcGVuO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgc3RhcnRBLCBiLCBzdGFydEIsIGxlbmd0aCwgY29tcGFyYXRvcikge1xuICAgIGEuZ290byhzdGFydEEpO1xuICAgIGIuZ290byhzdGFydEIpO1xuICAgIGxldCBlbmRCID0gc3RhcnRCICsgbGVuZ3RoO1xuICAgIGxldCBwb3MgPSBzdGFydEIsIGRQb3MgPSBzdGFydEIgLSBzdGFydEE7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBsZXQgZEVuZCA9IChhLnRvICsgZFBvcykgLSBiLnRvLCBkaWZmID0gZEVuZCB8fCBhLmVuZFNpZGUgLSBiLmVuZFNpZGU7XG4gICAgICAgIGxldCBlbmQgPSBkaWZmIDwgMCA/IGEudG8gKyBkUG9zIDogYi50bywgY2xpcEVuZCA9IE1hdGgubWluKGVuZCwgZW5kQik7XG4gICAgICAgIGlmIChhLnBvaW50IHx8IGIucG9pbnQpIHtcbiAgICAgICAgICAgIGlmICghKGEucG9pbnQgJiYgYi5wb2ludCAmJiAoYS5wb2ludCA9PSBiLnBvaW50IHx8IGEucG9pbnQuZXEoYi5wb2ludCkpICYmXG4gICAgICAgICAgICAgICAgc2FtZVZhbHVlcyhhLmFjdGl2ZUZvclBvaW50KGEudG8pLCBiLmFjdGl2ZUZvclBvaW50KGIudG8pKSkpXG4gICAgICAgICAgICAgICAgY29tcGFyYXRvci5jb21wYXJlUG9pbnQocG9zLCBjbGlwRW5kLCBhLnBvaW50LCBiLnBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjbGlwRW5kID4gcG9zICYmICFzYW1lVmFsdWVzKGEuYWN0aXZlLCBiLmFjdGl2ZSkpXG4gICAgICAgICAgICAgICAgY29tcGFyYXRvci5jb21wYXJlUmFuZ2UocG9zLCBjbGlwRW5kLCBhLmFjdGl2ZSwgYi5hY3RpdmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPiBlbmRCKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmICgoZEVuZCB8fCBhLm9wZW5FbmQgIT0gYi5vcGVuRW5kKSAmJiBjb21wYXJhdG9yLmJvdW5kQ2hhbmdlKVxuICAgICAgICAgICAgY29tcGFyYXRvci5ib3VuZENoYW5nZShlbmQpO1xuICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgIGlmIChkaWZmIDw9IDApXG4gICAgICAgICAgICBhLm5leHQoKTtcbiAgICAgICAgaWYgKGRpZmYgPj0gMClcbiAgICAgICAgICAgIGIubmV4dCgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVWYWx1ZXMoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKGFbaV0gIT0gYltpXSAmJiAhYVtpXS5lcShiW2ldKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlbW92ZShhcnJheSwgaW5kZXgpIHtcbiAgICBmb3IgKGxldCBpID0gaW5kZXgsIGUgPSBhcnJheS5sZW5ndGggLSAxOyBpIDwgZTsgaSsrKVxuICAgICAgICBhcnJheVtpXSA9IGFycmF5W2kgKyAxXTtcbiAgICBhcnJheS5wb3AoKTtcbn1cbmZ1bmN0aW9uIGluc2VydChhcnJheSwgaW5kZXgsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gaW5kZXg7IGktLSlcbiAgICAgICAgYXJyYXlbaSArIDFdID0gYXJyYXlbaV07XG4gICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7XG59XG5mdW5jdGlvbiBmaW5kTWluSW5kZXgodmFsdWUsIGFycmF5KSB7XG4gICAgbGV0IGZvdW5kID0gLTEsIGZvdW5kUG9zID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoKGFycmF5W2ldIC0gZm91bmRQb3MgfHwgdmFsdWVbaV0uZW5kU2lkZSAtIHZhbHVlW2ZvdW5kXS5lbmRTaWRlKSA8IDApIHtcbiAgICAgICAgICAgIGZvdW5kID0gaTtcbiAgICAgICAgICAgIGZvdW5kUG9zID0gYXJyYXlbaV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gZm91bmQ7XG59XG5cbi8qKlxuQ291bnQgdGhlIGNvbHVtbiBwb3NpdGlvbiBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IGludG8gdGhlIHN0cmluZyxcbnRha2luZyBleHRlbmRpbmcgY2hhcmFjdGVycyBhbmQgdGFiIHNpemUgaW50byBhY2NvdW50LlxuKi9cbmZ1bmN0aW9uIGNvdW50Q29sdW1uKHN0cmluZywgdGFiU2l6ZSwgdG8gPSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgbGV0IG4gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG8gJiYgaSA8IHN0cmluZy5sZW5ndGg7KSB7XG4gICAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdChpKSA9PSA5KSB7XG4gICAgICAgICAgICBuICs9IHRhYlNpemUgLSAobiAlIHRhYlNpemUpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbisrO1xuICAgICAgICAgICAgaSA9IGZpbmRDbHVzdGVyQnJlYWsoc3RyaW5nLCBpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbjtcbn1cbi8qKlxuRmluZCB0aGUgb2Zmc2V0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIGNvbHVtbiBwb3NpdGlvbiBpbiBhXG5zdHJpbmcsIHRha2luZyBleHRlbmRpbmcgY2hhcmFjdGVycyBhbmQgdGFiIHNpemUgaW50byBhY2NvdW50LiBCeVxuZGVmYXVsdCwgdGhlIHN0cmluZyBsZW5ndGggaXMgcmV0dXJuZWQgd2hlbiBpdCBpcyB0b28gc2hvcnQgdG9cbnJlYWNoIHRoZSBjb2x1bW4uIFBhc3MgYHN0cmljdGAgdHJ1ZSB0byBtYWtlIGl0IHJldHVybiAtMSBpbiB0aGF0XG5zaXR1YXRpb24uXG4qL1xuZnVuY3Rpb24gZmluZENvbHVtbihzdHJpbmcsIGNvbCwgdGFiU2l6ZSwgc3RyaWN0KSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSAwOzspIHtcbiAgICAgICAgaWYgKG4gPj0gY29sKVxuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIGlmIChpID09IHN0cmluZy5sZW5ndGgpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbiArPSBzdHJpbmcuY2hhckNvZGVBdChpKSA9PSA5ID8gdGFiU2l6ZSAtIChuICUgdGFiU2l6ZSkgOiAxO1xuICAgICAgICBpID0gZmluZENsdXN0ZXJCcmVhayhzdHJpbmcsIGkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaWN0ID09PSB0cnVlID8gLTEgOiBzdHJpbmcubGVuZ3RoO1xufVxuXG5leHBvcnQgeyBBbm5vdGF0aW9uLCBBbm5vdGF0aW9uVHlwZSwgQ2hhbmdlRGVzYywgQ2hhbmdlU2V0LCBDaGFyQ2F0ZWdvcnksIENvbXBhcnRtZW50LCBFZGl0b3JTZWxlY3Rpb24sIEVkaXRvclN0YXRlLCBGYWNldCwgTGluZSwgTWFwTW9kZSwgUHJlYywgUmFuZ2UsIFJhbmdlU2V0LCBSYW5nZVNldEJ1aWxkZXIsIFJhbmdlVmFsdWUsIFNlbGVjdGlvblJhbmdlLCBTdGF0ZUVmZmVjdCwgU3RhdGVFZmZlY3RUeXBlLCBTdGF0ZUZpZWxkLCBUZXh0LCBUcmFuc2FjdGlvbiwgY29kZVBvaW50QXQsIGNvZGVQb2ludFNpemUsIGNvbWJpbmVDb25maWcsIGNvdW50Q29sdW1uLCBmaW5kQ2x1c3RlckJyZWFrLCBmaW5kQ29sdW1uLCBmcm9tQ29kZVBvaW50IH07XG4iLCAiLyoqXG4gKiBDcmVhdGVkIGJ5IEFsZXggQm9sIG9uIDQvMS8yMDE3LlxuICovXG5cbi8qKlxuICogSW50ZXJ2YWwgaXMgYSBwYWlyIG9mIG51bWJlcnMgb3IgYSBwYWlyIG9mIGFueSBjb21wYXJhYmxlIG9iamVjdHMgb24gd2hpY2ggbWF5IGJlIGRlZmluZWQgcHJlZGljYXRlc1xuICogKmVxdWFsKiwgKmxlc3MqIGFuZCBtZXRob2QgKm1heChwMSwgcDEpKiB0aGF0IHJldHVybnMgbWF4aW11bSBpbiBhIHBhaXIuXG4gKiBXaGVuIGludGVydmFsIGlzIGFuIG9iamVjdCByYXRoZXIgdGhhbiBhIHBhaXIgb2YgbnVtYmVycywgdGhpcyBvYmplY3Qgc2hvdWxkIGhhdmUgcHJvcGVydGllcyAqbG93KiwgKmhpZ2gqLCAqbWF4KlxuICogYW5kIGltcGxlbWVudCBtZXRob2RzICpsZXNzX3RoYW4oKSwgZXF1YWxfdG8oKSwgaW50ZXJzZWN0KCksIG5vdF9pbnRlcnNlY3QoKSwgY2xvbmUoKSwgb3V0cHV0KCkqLlxuICogVHdvIHN0YXRpYyBtZXRob2RzICpjb21wYXJhYmxlX21heCgpLCBjb21wYXJhYmxlX2xlc3NfdGhhbigpKiBkZWZpbmUgaG93IHRvIGNvbXBhcmUgdmFsdWVzIGluIHBhaXIuIDxici8+XG4gKiBUaGlzIGludGVyZmFjZSBpcyBkZXNjcmliZWQgaW4gdHlwZXNjcmlwdCBkZWZpbml0aW9uIGZpbGUgKmluZGV4LmQudHMqXG4gKlxuICogQXhpcyBhbGlnbmVkIHJlY3RhbmdsZSBpcyBhbiBleGFtcGxlIG9mIHN1Y2ggaW50ZXJ2YWwuXG4gKiBXZSBtYXkgbG9vayBhdCByZWN0YW5nbGUgYXMgYW4gaW50ZXJ2YWwgYmV0d2VlbiBpdHMgbG93IGxlZnQgYW5kIHRvcCByaWdodCBjb3JuZXJzLlxuICogU2VlICoqQm94KiogY2xhc3MgaW4gW2ZsYXR0ZW4tanNdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbGV4Ym9sOTkvZmxhdHRlbi1qcykgbGlicmFyeSBhcyB0aGUgZXhhbXBsZVxuICogb2YgSW50ZXJ2YWwgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uXG4gKiBAdHlwZSB7SW50ZXJ2YWx9XG4gKi9cbmNvbnN0IEludGVydmFsID0gY2xhc3MgSW50ZXJ2YWwge1xuICAgIC8qKlxuICAgICAqIEFjY2VwdCB0d28gY29tcGFyYWJsZSB2YWx1ZXMgYW5kIGNyZWF0ZXMgbmV3IGluc3RhbmNlIG9mIGludGVydmFsXG4gICAgICogUHJlZGljYXRlIEludGVydmFsLmNvbXBhcmFibGVfbGVzcyhsb3csIGhpZ2gpIHN1cHBvc2VkIHRvIHJldHVybiB0cnVlIG9uIHRoZXNlIHZhbHVlc1xuICAgICAqIEBwYXJhbSBsb3dcbiAgICAgKiBAcGFyYW0gaGlnaFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGxvdywgaGlnaCkge1xuICAgICAgICB0aGlzLmxvdyA9IGxvdztcbiAgICAgICAgdGhpcy5oaWdoID0gaGlnaDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9uZSBpbnRlcnZhbFxuICAgICAqIEByZXR1cm5zIHtJbnRlcnZhbH1cbiAgICAgKi9cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbCh0aGlzLmxvdywgdGhpcy5oaWdoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9wZXJ5IG1heCByZXR1cm5zIGNsb25lIG9mIHRoaXMgaW50ZXJ2YWxcbiAgICAgKiBAcmV0dXJucyB7SW50ZXJ2YWx9XG4gICAgICovXG4gICAgZ2V0IG1heCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKTsgICAvLyB0aGlzLmhpZ2g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlZGljYXRlIHJldHVybnMgdHJ1ZSBpcyB0aGlzIGludGVydmFsIGxlc3MgdGhhbiBvdGhlciBpbnRlcnZhbFxuICAgICAqIEBwYXJhbSBvdGhlcl9pbnRlcnZhbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGxlc3NfdGhhbihvdGhlcl9pbnRlcnZhbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb3cgPCBvdGhlcl9pbnRlcnZhbC5sb3cgfHxcbiAgICAgICAgICAgIHRoaXMubG93ID09PSBvdGhlcl9pbnRlcnZhbC5sb3cgJiYgdGhpcy5oaWdoIDwgb3RoZXJfaW50ZXJ2YWwuaGlnaDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVkaWNhdGUgcmV0dXJucyB0cnVlIGlzIHRoaXMgaW50ZXJ2YWwgZXF1YWxzIHRvIG90aGVyIGludGVydmFsXG4gICAgICogQHBhcmFtIG90aGVyX2ludGVydmFsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZXF1YWxfdG8ob3RoZXJfaW50ZXJ2YWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG93ID09PSBvdGhlcl9pbnRlcnZhbC5sb3cgJiYgdGhpcy5oaWdoID09PSBvdGhlcl9pbnRlcnZhbC5oaWdoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZWRpY2F0ZSByZXR1cm5zIHRydWUgaWYgdGhpcyBpbnRlcnZhbCBpbnRlcnNlY3RzIG90aGVyIGludGVydmFsXG4gICAgICogQHBhcmFtIG90aGVyX2ludGVydmFsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaW50ZXJzZWN0KG90aGVyX2ludGVydmFsKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5ub3RfaW50ZXJzZWN0KG90aGVyX2ludGVydmFsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVkaWNhdGUgcmV0dXJucyB0cnVlIGlmIHRoaXMgaW50ZXJ2YWwgZG9lcyBub3QgaW50ZXJzZWN0IG90aGVyIGludGVydmFsXG4gICAgICogQHBhcmFtIG90aGVyX2ludGVydmFsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgbm90X2ludGVyc2VjdChvdGhlcl9pbnRlcnZhbCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaGlnaCA8IG90aGVyX2ludGVydmFsLmxvdyB8fCBvdGhlcl9pbnRlcnZhbC5oaWdoIDwgdGhpcy5sb3cpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgbmV3IGludGVydmFsIG1lcmdlZCB3aXRoIG90aGVyIGludGVydmFsXG4gICAgICogQHBhcmFtIHtJbnRlcnZhbH0gb3RoZXJfaW50ZXJ2YWwgLSBPdGhlciBpbnRlcnZhbCB0byBtZXJnZSB3aXRoXG4gICAgICogQHJldHVybnMge0ludGVydmFsfVxuICAgICAqL1xuICAgIG1lcmdlKG90aGVyX2ludGVydmFsKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoXG4gICAgICAgICAgICB0aGlzLmxvdyA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgICAgICBvdGhlcl9pbnRlcnZhbC5sb3cgOiAodGhpcy5sb3cgPCBvdGhlcl9pbnRlcnZhbC5sb3cgPyB0aGlzLmxvdyA6IG90aGVyX2ludGVydmFsLmxvdyksXG4gICAgICAgICAgICB0aGlzLmhpZ2ggPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgb3RoZXJfaW50ZXJ2YWwuaGlnaCA6ICh0aGlzLmhpZ2ggPiBvdGhlcl9pbnRlcnZhbC5oaWdoID8gdGhpcy5oaWdoIDogb3RoZXJfaW50ZXJ2YWwuaGlnaClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGhvdyBrZXkgc2hvdWxkIHJldHVyblxuICAgICAqL1xuICAgIG91dHB1dCgpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLmxvdywgdGhpcy5oaWdoXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiByZXR1cm5zIG1heGltdW0gYmV0d2VlbiB0d28gY29tcGFyYWJsZSB2YWx1ZXNcbiAgICAgKiBAcGFyYW0gaW50ZXJ2YWwxXG4gICAgICogQHBhcmFtIGludGVydmFsMlxuICAgICAqIEByZXR1cm5zIHtJbnRlcnZhbH1cbiAgICAgKi9cbiAgICBzdGF0aWMgY29tcGFyYWJsZV9tYXgoaW50ZXJ2YWwxLCBpbnRlcnZhbDIpIHtcbiAgICAgICAgcmV0dXJuIGludGVydmFsMS5tZXJnZShpbnRlcnZhbDIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZWRpY2F0ZSByZXR1cm5zIHRydWUgaWYgZmlyc3QgdmFsdWUgbGVzcyB0aGFuIHNlY29uZCB2YWx1ZVxuICAgICAqIEBwYXJhbSB2YWwxXG4gICAgICogQHBhcmFtIHZhbDJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgY29tcGFyYWJsZV9sZXNzX3RoYW4odmFsMSwgdmFsMiApIHtcbiAgICAgICAgcmV0dXJuIHZhbDEgPCB2YWwyO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlZCBieSBBbGV4IEJvbCBvbiAzLzI4LzIwMTcuXG4gKi9cblxuXG4vLyBtb2R1bGUuZXhwb3J0cyA9IHtcbi8vICAgICBSQl9UUkVFX0NPTE9SX1JFRDogMCxcbi8vICAgICBSQl9UUkVFX0NPTE9SX0JMQUNLOiAxXG4vLyB9O1xuXG5jb25zdCBSQl9UUkVFX0NPTE9SX1JFRCA9IDA7XG5jb25zdCBSQl9UUkVFX0NPTE9SX0JMQUNLID0gMTtcblxuLyoqXG4gKiBDcmVhdGVkIGJ5IEFsZXggQm9sIG9uIDQvMS8yMDE3LlxuICovXG5cblxuY2xhc3MgTm9kZSB7XG4gICAgY29uc3RydWN0b3Ioa2V5ID0gdW5kZWZpbmVkLCB2YWx1ZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBsZWZ0ID0gbnVsbCwgcmlnaHQgPSBudWxsLCBwYXJlbnQgPSBudWxsLCBjb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDsgICAgICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgdG8gbGVmdCBjaGlsZCBub2RlXG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodDsgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHJpZ2h0IGNoaWxkIG5vZGVcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7ICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgdG8gcGFyZW50IG5vZGVcbiAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yO1xuXG4gICAgICAgIHRoaXMuaXRlbSA9IHtrZXk6IGtleSwgdmFsdWU6IHZhbHVlfTsgICAvLyBrZXkgaXMgc3VwcG9zZWQgdG8gYmUgaW5zdGFuY2Ugb2YgSW50ZXJ2YWxcblxuICAgICAgICAvKiBJZiBub3QsIHRoaXMgc2hvdWxkIGJ5IGFuIGFycmF5IG9mIHR3byBudW1iZXJzICovXG4gICAgICAgIGlmIChrZXkgJiYga2V5IGluc3RhbmNlb2YgQXJyYXkgJiYga2V5Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oa2V5WzBdKSAmJiAhTnVtYmVyLmlzTmFOKGtleVsxXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgW2xvdywgaGlnaF0gPSBrZXk7XG4gICAgICAgICAgICAgICAgaWYgKGxvdyA+IGhpZ2gpIFtsb3csIGhpZ2hdID0gW2hpZ2gsIGxvd107XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtLmtleSA9IG5ldyBJbnRlcnZhbChsb3csIGhpZ2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYXggPSB0aGlzLml0ZW0ua2V5ID8gdGhpcy5pdGVtLmtleS5tYXggOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaXNOaWwoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pdGVtLmtleSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuaXRlbS52YWx1ZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0aGlzLmxlZnQgPT09IG51bGwgJiYgdGhpcy5yaWdodCA9PT0gbnVsbCAmJiB0aGlzLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLKTtcbiAgICB9XG5cbiAgICBfdmFsdWVfbGVzc190aGFuKG90aGVyX25vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbS52YWx1ZSAmJiBvdGhlcl9ub2RlLml0ZW0udmFsdWUgJiYgdGhpcy5pdGVtLnZhbHVlLmxlc3NfdGhhbiA/XG4gICAgICAgICAgICB0aGlzLml0ZW0udmFsdWUubGVzc190aGFuKG90aGVyX25vZGUuaXRlbS52YWx1ZSkgOlxuICAgICAgICAgICAgdGhpcy5pdGVtLnZhbHVlIDwgb3RoZXJfbm9kZS5pdGVtLnZhbHVlO1xuICAgIH1cblxuICAgIGxlc3NfdGhhbihvdGhlcl9ub2RlKSB7XG4gICAgICAgIC8vIGlmIHRyZWUgc3RvcmVzIG9ubHkga2V5c1xuICAgICAgICBpZiAodGhpcy5pdGVtLnZhbHVlID09PSB0aGlzLml0ZW0ua2V5ICYmIG90aGVyX25vZGUuaXRlbS52YWx1ZSA9PT0gb3RoZXJfbm9kZS5pdGVtLmtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbS5rZXkubGVzc190aGFuKG90aGVyX25vZGUuaXRlbS5rZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgICAvLyBpZiB0cmVlIHN0b3JlcyBrZXlzIGFuZCB2YWx1ZXNcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW0ua2V5Lmxlc3NfdGhhbihvdGhlcl9ub2RlLml0ZW0ua2V5KSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbS5rZXkuZXF1YWxfdG8oKG90aGVyX25vZGUuaXRlbS5rZXkpKSAmJiB0aGlzLl92YWx1ZV9sZXNzX3RoYW4ob3RoZXJfbm9kZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF92YWx1ZV9lcXVhbChvdGhlcl9ub2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW0udmFsdWUgJiYgb3RoZXJfbm9kZS5pdGVtLnZhbHVlICYmIHRoaXMuaXRlbS52YWx1ZS5lcXVhbF90byA/XG4gICAgICAgICAgICB0aGlzLml0ZW0udmFsdWUuZXF1YWxfdG8ob3RoZXJfbm9kZS5pdGVtLnZhbHVlKSA6XG4gICAgICAgICAgICB0aGlzLml0ZW0udmFsdWUgPT09IG90aGVyX25vZGUuaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgZXF1YWxfdG8ob3RoZXJfbm9kZSkge1xuICAgICAgICAvLyBpZiB0cmVlIHN0b3JlcyBvbmx5IGtleXNcbiAgICAgICAgaWYgKHRoaXMuaXRlbS52YWx1ZSA9PT0gdGhpcy5pdGVtLmtleSAmJiBvdGhlcl9ub2RlLml0ZW0udmFsdWUgPT09IG90aGVyX25vZGUuaXRlbS5rZXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW0ua2V5LmVxdWFsX3RvKG90aGVyX25vZGUuaXRlbS5rZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgICAvLyBpZiB0cmVlIHN0b3JlcyBrZXlzIGFuZCB2YWx1ZXNcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW0ua2V5LmVxdWFsX3RvKG90aGVyX25vZGUuaXRlbS5rZXkpICYmIHRoaXMuX3ZhbHVlX2VxdWFsKG90aGVyX25vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW50ZXJzZWN0KG90aGVyX25vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbS5rZXkuaW50ZXJzZWN0KG90aGVyX25vZGUuaXRlbS5rZXkpO1xuICAgIH1cblxuICAgIGNvcHlfZGF0YShvdGhlcl9ub2RlKSB7XG4gICAgICAgIHRoaXMuaXRlbS5rZXkgPSBvdGhlcl9ub2RlLml0ZW0ua2V5O1xuICAgICAgICB0aGlzLml0ZW0udmFsdWUgPSBvdGhlcl9ub2RlLml0ZW0udmFsdWU7XG4gICAgfVxuXG4gICAgdXBkYXRlX21heCgpIHtcbiAgICAgICAgLy8gdXNlIGtleSAoSW50ZXJ2YWwpIG1heCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGtleS5oaWdoXG4gICAgICAgIHRoaXMubWF4ID0gdGhpcy5pdGVtLmtleSA/IHRoaXMuaXRlbS5rZXkubWF4IDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5yaWdodCAmJiB0aGlzLnJpZ2h0Lm1heCkge1xuICAgICAgICAgICAgY29uc3QgY29tcGFyYWJsZV9tYXggPSB0aGlzLml0ZW0ua2V5LmNvbnN0cnVjdG9yLmNvbXBhcmFibGVfbWF4OyAgLy8gc3RhdGljIG1ldGhvZFxuICAgICAgICAgICAgdGhpcy5tYXggPSBjb21wYXJhYmxlX21heCh0aGlzLm1heCwgdGhpcy5yaWdodC5tYXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxlZnQgJiYgdGhpcy5sZWZ0Lm1heCkge1xuICAgICAgICAgICAgY29uc3QgY29tcGFyYWJsZV9tYXggPSB0aGlzLml0ZW0ua2V5LmNvbnN0cnVjdG9yLmNvbXBhcmFibGVfbWF4OyAgLy8gc3RhdGljIG1ldGhvZFxuICAgICAgICAgICAgdGhpcy5tYXggPSBjb21wYXJhYmxlX21heCh0aGlzLm1heCwgdGhpcy5sZWZ0Lm1heCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPdGhlcl9ub2RlIGRvZXMgbm90IGludGVyc2VjdCBhbnkgbm9kZSBvZiBsZWZ0IHN1YnRyZWUsIGlmIHRoaXMubGVmdC5tYXggPCBvdGhlcl9ub2RlLml0ZW0ua2V5Lmxvd1xuICAgIG5vdF9pbnRlcnNlY3RfbGVmdF9zdWJ0cmVlKHNlYXJjaF9ub2RlKSB7XG4gICAgICAgIGNvbnN0IGNvbXBhcmFibGVfbGVzc190aGFuID0gdGhpcy5pdGVtLmtleS5jb25zdHJ1Y3Rvci5jb21wYXJhYmxlX2xlc3NfdGhhbjsgIC8vIHN0YXRpYyBtZXRob2RcbiAgICAgICAgbGV0IGhpZ2ggPSB0aGlzLmxlZnQubWF4LmhpZ2ggIT09IHVuZGVmaW5lZCA/IHRoaXMubGVmdC5tYXguaGlnaCA6IHRoaXMubGVmdC5tYXg7XG4gICAgICAgIHJldHVybiBjb21wYXJhYmxlX2xlc3NfdGhhbihoaWdoLCBzZWFyY2hfbm9kZS5pdGVtLmtleS5sb3cpO1xuICAgIH1cblxuICAgIC8vIE90aGVyX25vZGUgZG9lcyBub3QgaW50ZXJzZWN0IHJpZ2h0IHN1YnRyZWUgaWYgb3RoZXJfbm9kZS5pdGVtLmtleS5oaWdoIDwgdGhpcy5yaWdodC5rZXkubG93XG4gICAgbm90X2ludGVyc2VjdF9yaWdodF9zdWJ0cmVlKHNlYXJjaF9ub2RlKSB7XG4gICAgICAgIGNvbnN0IGNvbXBhcmFibGVfbGVzc190aGFuID0gdGhpcy5pdGVtLmtleS5jb25zdHJ1Y3Rvci5jb21wYXJhYmxlX2xlc3NfdGhhbjsgIC8vIHN0YXRpYyBtZXRob2RcbiAgICAgICAgbGV0IGxvdyA9IHRoaXMucmlnaHQubWF4LmxvdyAhPT0gdW5kZWZpbmVkID8gdGhpcy5yaWdodC5tYXgubG93IDogdGhpcy5yaWdodC5pdGVtLmtleS5sb3c7XG4gICAgICAgIHJldHVybiBjb21wYXJhYmxlX2xlc3NfdGhhbihzZWFyY2hfbm9kZS5pdGVtLmtleS5oaWdoLCBsb3cpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVkIGJ5IEFsZXggQm9sIG9uIDMvMzEvMjAxNy5cbiAqL1xuXG4vLyBjb25zdCBuaWxfbm9kZSA9IG5ldyBOb2RlKCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgaW50ZXJ2YWwgYmluYXJ5IHNlYXJjaCB0cmVlIDxici8+XG4gKiBJbnRlcnZhbCB0cmVlIHN0b3JlcyBpdGVtcyB3aGljaCBhcmUgY291cGxlcyBvZiB7a2V5OmludGVydmFsLCB2YWx1ZTogdmFsdWV9IDxici8+XG4gKiBJbnRlcnZhbCBpcyBhbiBvYmplY3Qgd2l0aCBoaWdoIGFuZCBsb3cgcHJvcGVydGllcyBvciBzaW1wbHkgcGFpciBbbG93LGhpZ2hdIG9mIG51bWVyaWMgdmFsdWVzIDxiciAvPlxuICogQHR5cGUge0ludGVydmFsVHJlZX1cbiAqL1xuY2xhc3MgSW50ZXJ2YWxUcmVlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgbmV3IGVtcHR5IGluc3RhbmNlIG9mIEludGVydmFsVHJlZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJvb3QgPSBudWxsO1xuICAgICAgICB0aGlzLm5pbF9ub2RlID0gbmV3IE5vZGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIG51bWJlciBvZiBpdGVtcyBzdG9yZWQgaW4gdGhlIGludGVydmFsIHRyZWVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICB0aGlzLnRyZWVfd2Fsayh0aGlzLnJvb3QsICgpID0+IGNvdW50KyspO1xuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhcnJheSBvZiBzb3J0ZWQga2V5cyBpbiB0aGUgYXNjZW5kaW5nIG9yZGVyXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGdldCBrZXlzKCkge1xuICAgICAgICBsZXQgcmVzID0gW107XG4gICAgICAgIHRoaXMudHJlZV93YWxrKHRoaXMucm9vdCwgKG5vZGUpID0+IHJlcy5wdXNoKFxuICAgICAgICAgICAgbm9kZS5pdGVtLmtleS5vdXRwdXQgPyBub2RlLml0ZW0ua2V5Lm91dHB1dCgpIDogbm9kZS5pdGVtLmtleVxuICAgICAgICApKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYXJyYXkgb2YgdmFsdWVzIGluIHRoZSBhc2NlbmRpbmcga2V5cyBvcmRlclxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBnZXQgdmFsdWVzKCkge1xuICAgICAgICBsZXQgcmVzID0gW107XG4gICAgICAgIHRoaXMudHJlZV93YWxrKHRoaXMucm9vdCwgKG5vZGUpID0+IHJlcy5wdXNoKG5vZGUuaXRlbS52YWx1ZSkpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYXJyYXkgb2YgaXRlbXMgKDxrZXksdmFsdWU+IHBhaXJzKSBpbiB0aGUgYXNjZW5kZWQga2V5cyBvcmRlclxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICBnZXQgaXRlbXMoKSB7XG4gICAgICAgIGxldCByZXMgPSBbXTtcbiAgICAgICAgdGhpcy50cmVlX3dhbGsodGhpcy5yb290LCAobm9kZSkgPT4gcmVzLnB1c2goe1xuICAgICAgICAgICAga2V5OiBub2RlLml0ZW0ua2V5Lm91dHB1dCA/IG5vZGUuaXRlbS5rZXkub3V0cHV0KCkgOiBub2RlLml0ZW0ua2V5LFxuICAgICAgICAgICAgdmFsdWU6IG5vZGUuaXRlbS52YWx1ZVxuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRyZWUgaXMgZW1wdHlcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMucm9vdCA9PSBudWxsIHx8IHRoaXMucm9vdCA9PT0gdGhpcy5uaWxfbm9kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdHJlZVxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnJvb3QgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBuZXcgaXRlbSBpbnRvIGludGVydmFsIHRyZWVcbiAgICAgKiBAcGFyYW0ge0ludGVydmFsfSBrZXkgLSBpbnRlcnZhbCBvYmplY3Qgb3IgYXJyYXkgb2YgdHdvIG51bWJlcnMgW2xvdywgaGlnaF1cbiAgICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSB2YWx1ZSByZXByZXNlbnRpbmcgYW55IG9iamVjdCAob3B0aW9uYWwpXG4gICAgICogQHJldHVybnMge05vZGV9IHJldHVybnMgcmVmZXJlbmNlIHRvIGluc2VydGVkIG5vZGUgYXMgYW4gb2JqZWN0IHtrZXk6aW50ZXJ2YWwsIHZhbHVlOiB2YWx1ZX1cbiAgICAgKi9cbiAgICBpbnNlcnQoa2V5LCB2YWx1ZSA9IGtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IGluc2VydF9ub2RlID0gbmV3IE5vZGUoa2V5LCB2YWx1ZSwgdGhpcy5uaWxfbm9kZSwgdGhpcy5uaWxfbm9kZSwgbnVsbCwgUkJfVFJFRV9DT0xPUl9SRUQpO1xuICAgICAgICB0aGlzLnRyZWVfaW5zZXJ0KGluc2VydF9ub2RlKTtcbiAgICAgICAgdGhpcy5yZWNhbGNfbWF4KGluc2VydF9ub2RlKTtcbiAgICAgICAgcmV0dXJuIGluc2VydF9ub2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBpdGVtIHtrZXksdmFsdWV9IGV4aXN0IGluIHRoZSB0cmVlXG4gICAgICogQHBhcmFtIHtJbnRlcnZhbH0ga2V5IC0gaW50ZXJ2YWwgY29ycmVzcG9uZGVudCB0byBrZXlzIHN0b3JlZCBpbiB0aGUgdHJlZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIHZhbHVlIG9iamVjdCB0byBiZSBjaGVja2VkXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgaXRlbSB7a2V5LCB2YWx1ZX0gZXhpc3QgaW4gdGhlIHRyZWUsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGV4aXN0KGtleSwgdmFsdWUgPSBrZXkpIHtcbiAgICAgICAgbGV0IHNlYXJjaF9ub2RlID0gbmV3IE5vZGUoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiAhIXRoaXMudHJlZV9zZWFyY2godGhpcy5yb290LCBzZWFyY2hfbm9kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGVudHJ5IHtrZXksIHZhbHVlfSBmcm9tIHRoZSB0cmVlXG4gICAgICogQHBhcmFtIHtJbnRlcnZhbH0ga2V5IC0gaW50ZXJ2YWwgY29ycmVzcG9uZGVudCB0byBrZXlzIHN0b3JlZCBpbiB0aGUgdHJlZVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIHZhbHVlIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGl0ZW0ge2tleSwgdmFsdWV9IGRlbGV0ZWQsIGZhbHNlIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHJlbW92ZShrZXksIHZhbHVlID0ga2V5KSB7XG4gICAgICAgIGxldCBzZWFyY2hfbm9kZSA9IG5ldyBOb2RlKGtleSwgdmFsdWUpO1xuICAgICAgICBsZXQgZGVsZXRlX25vZGUgPSB0aGlzLnRyZWVfc2VhcmNoKHRoaXMucm9vdCwgc2VhcmNoX25vZGUpO1xuICAgICAgICBpZiAoZGVsZXRlX25vZGUpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZV9kZWxldGUoZGVsZXRlX25vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWxldGVfbm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFycmF5IG9mIGVudHJ5IHZhbHVlcyB3aGljaCBrZXlzIGludGVyc2VjdCB3aXRoIGdpdmVuIGludGVydmFsIDxici8+XG4gICAgICogSWYgbm8gdmFsdWVzIHN0b3JlZCBpbiB0aGUgdHJlZSwgcmV0dXJucyBhcnJheSBvZiBrZXlzIHdoaWNoIGludGVyc2VjdCBnaXZlbiBpbnRlcnZhbFxuICAgICAqIEBwYXJhbSB7SW50ZXJ2YWx9IGludGVydmFsIC0gc2VhcmNoIGludGVydmFsLCBvciB0dXBsZSBbbG93LCBoaWdoXVxuICAgICAqIEBwYXJhbSBvdXRwdXRNYXBwZXJGbih2YWx1ZSxrZXkpIC0gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBtYXBzICh2YWx1ZSwga2V5KSB0byBjdXN0b20gb3V0cHV0XG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIHNlYXJjaChpbnRlcnZhbCwgb3V0cHV0TWFwcGVyRm4gPSAodmFsdWUsIGtleSkgPT4gdmFsdWUgPT09IGtleSA/IGtleS5vdXRwdXQoKSA6IHZhbHVlKSB7XG4gICAgICAgIGxldCBzZWFyY2hfbm9kZSA9IG5ldyBOb2RlKGludGVydmFsKTtcbiAgICAgICAgbGV0IHJlc3Bfbm9kZXMgPSBbXTtcbiAgICAgICAgdGhpcy50cmVlX3NlYXJjaF9pbnRlcnZhbCh0aGlzLnJvb3QsIHNlYXJjaF9ub2RlLCByZXNwX25vZGVzKTtcbiAgICAgICAgcmV0dXJuIHJlc3Bfbm9kZXMubWFwKG5vZGUgPT4gb3V0cHV0TWFwcGVyRm4obm9kZS5pdGVtLnZhbHVlLCBub2RlLml0ZW0ua2V5KSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgaW50ZXJzZWN0aW9uIGJldHdlZW4gZ2l2ZW4gYW5kIGFueSBpbnRlcnZhbCBzdG9yZWQgaW4gdGhlIHRyZWUgZm91bmRcbiAgICAgKiBAcGFyYW0ge0ludGVydmFsfSBpbnRlcnZhbCAtIHNlYXJjaCBpbnRlcnZhbCBvciB0dXBsZSBbbG93LCBoaWdoXVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGludGVyc2VjdF9hbnkoaW50ZXJ2YWwpIHtcbiAgICAgICAgbGV0IHNlYXJjaF9ub2RlID0gbmV3IE5vZGUoaW50ZXJ2YWwpO1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlX2ZpbmRfYW55X2ludGVydmFsKHRoaXMucm9vdCwgc2VhcmNoX25vZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyZWUgdmlzaXRvci4gRm9yIGVhY2ggbm9kZSBpbXBsZW1lbnQgYSBjYWxsYmFjayBmdW5jdGlvbi4gPGJyLz5cbiAgICAgKiBNZXRob2QgY2FsbHMgYSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHR3byBwYXJhbWV0ZXJzIChrZXksIHZhbHVlKVxuICAgICAqIEBwYXJhbSB2aXNpdG9yKGtleSx2YWx1ZSkgLSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIGVhY2ggdHJlZSBpdGVtXG4gICAgICovXG4gICAgZm9yRWFjaCh2aXNpdG9yKSB7XG4gICAgICAgIHRoaXMudHJlZV93YWxrKHRoaXMucm9vdCwgKG5vZGUpID0+IHZpc2l0b3Iobm9kZS5pdGVtLmtleSwgbm9kZS5pdGVtLnZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsdWUgTWFwcGVyLiBXYWxrIHRocm91Z2ggZXZlcnkgbm9kZSBhbmQgbWFwIG5vZGUgdmFsdWUgdG8gYW5vdGhlciB2YWx1ZVxuICAgICAqIEBwYXJhbSBjYWxsYmFjayh2YWx1ZSxrZXkpIC0gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGZvciBlYWNoIHRyZWUgaXRlbVxuICAgICAqL1xuICAgIG1hcChjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB0cmVlID0gbmV3IEludGVydmFsVHJlZSgpO1xuICAgICAgICB0aGlzLnRyZWVfd2Fsayh0aGlzLnJvb3QsIChub2RlKSA9PiB0cmVlLmluc2VydChub2RlLml0ZW0ua2V5LCBjYWxsYmFjayhub2RlLml0ZW0udmFsdWUsIG5vZGUuaXRlbS5rZXkpKSk7XG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7SW50ZXJ2YWx9IGludGVydmFsIC0gb3B0aW9uYWwgaWYgdGhlIGl0ZXJhdG9yIGlzIGludGVuZGVkIHRvIHN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZ1xuICAgICAqIEBwYXJhbSBvdXRwdXRNYXBwZXJGbih2YWx1ZSxrZXkpIC0gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBtYXBzICh2YWx1ZSwga2V5KSB0byBjdXN0b20gb3V0cHV0XG4gICAgICogQHJldHVybnMge0l0ZXJhdG9yfVxuICAgICAqL1xuICAgICppdGVyYXRlKGludGVydmFsLCBvdXRwdXRNYXBwZXJGbiA9ICh2YWx1ZSwga2V5KSA9PiB2YWx1ZSA9PT0ga2V5ID8ga2V5Lm91dHB1dCgpIDogdmFsdWUpIHtcbiAgICAgICAgbGV0IG5vZGU7XG4gICAgICAgIGlmIChpbnRlcnZhbCkge1xuICAgICAgICAgICAgbm9kZSA9IHRoaXMudHJlZV9zZWFyY2hfbmVhcmVzdF9mb3J3YXJkKHRoaXMucm9vdCwgbmV3IE5vZGUoaW50ZXJ2YWwpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIG5vZGUgPSB0aGlzLmxvY2FsX21pbmltdW0odGhpcy5yb290KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgeWllbGQgb3V0cHV0TWFwcGVyRm4obm9kZS5pdGVtLnZhbHVlLCBub2RlLml0ZW0ua2V5KTtcbiAgICAgICAgICAgIG5vZGUgPSB0aGlzLnRyZWVfc3VjY2Vzc29yKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVjYWxjX21heChub2RlKSB7XG4gICAgICAgIGxldCBub2RlX2N1cnJlbnQgPSBub2RlO1xuICAgICAgICB3aGlsZSAobm9kZV9jdXJyZW50LnBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBub2RlX2N1cnJlbnQucGFyZW50LnVwZGF0ZV9tYXgoKTtcbiAgICAgICAgICAgIG5vZGVfY3VycmVudCA9IG5vZGVfY3VycmVudC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmVlX2luc2VydChpbnNlcnRfbm9kZSkge1xuICAgICAgICBsZXQgY3VycmVudF9ub2RlID0gdGhpcy5yb290O1xuICAgICAgICBsZXQgcGFyZW50X25vZGUgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT0gbnVsbCB8fCB0aGlzLnJvb3QgPT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IGluc2VydF9ub2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRfbm9kZSAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgICAgIHBhcmVudF9ub2RlID0gY3VycmVudF9ub2RlO1xuICAgICAgICAgICAgICAgIGlmIChpbnNlcnRfbm9kZS5sZXNzX3RoYW4oY3VycmVudF9ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBjdXJyZW50X25vZGUubGVmdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZS5yaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc2VydF9ub2RlLnBhcmVudCA9IHBhcmVudF9ub2RlO1xuXG4gICAgICAgICAgICBpZiAoaW5zZXJ0X25vZGUubGVzc190aGFuKHBhcmVudF9ub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhcmVudF9ub2RlLmxlZnQgPSBpbnNlcnRfbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmVudF9ub2RlLnJpZ2h0ID0gaW5zZXJ0X25vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluc2VydF9maXh1cChpbnNlcnRfbm9kZSk7XG4gICAgfVxuXG4vLyBBZnRlciBpbnNlcnRpb24gaW5zZXJ0X25vZGUgbWF5IGhhdmUgcmVkLWNvbG9yZWQgcGFyZW50LCBhbmQgdGhpcyBpcyBhIHNpbmdsZSBwb3NzaWJsZSB2aW9sYXRpb25cbi8vIEdvIHVwd29yZHMgdG8gdGhlIHJvb3QgYW5kIHJlLWNvbG9yIHVudGlsIHZpb2xhdGlvbiB3aWxsIGJlIHJlc29sdmVkXG4gICAgaW5zZXJ0X2ZpeHVwKGluc2VydF9ub2RlKSB7XG4gICAgICAgIGxldCBjdXJyZW50X25vZGU7XG4gICAgICAgIGxldCB1bmNsZV9ub2RlO1xuXG4gICAgICAgIGN1cnJlbnRfbm9kZSA9IGluc2VydF9ub2RlO1xuICAgICAgICB3aGlsZSAoY3VycmVudF9ub2RlICE9PSB0aGlzLnJvb3QgJiYgY3VycmVudF9ub2RlLnBhcmVudC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9SRUQpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50X25vZGUucGFyZW50ID09PSBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudC5sZWZ0KSB7ICAgLy8gcGFyZW50IGlzIGxlZnQgY2hpbGQgb2YgZ3JhbmRmYXRoZXJcbiAgICAgICAgICAgICAgICB1bmNsZV9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQucmlnaHQ7ICAgICAgICAgICAgICAvLyByaWdodCBicm90aGVyIG9mIHBhcmVudFxuICAgICAgICAgICAgICAgIGlmICh1bmNsZV9ub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX1JFRCkgeyAgICAgICAgICAgICAvLyBDYXNlIDEuIFVuY2xlIGlzIHJlZFxuICAgICAgICAgICAgICAgICAgICAvLyByZS1jb2xvciBmYXRoZXIgYW5kIHVuY2xlIGludG8gYmxhY2tcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgICAgICAgICAgICAgICAgIHVuY2xlX25vZGUuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhc2UgMiAmIDMuIFVuY2xlIGlzIGJsYWNrXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X25vZGUgPT09IGN1cnJlbnRfbm9kZS5wYXJlbnQucmlnaHQpIHsgICAgIC8vIENhc2UgMi4gQ3VycmVudCBpZiByaWdodCBjaGlsZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYXNlIGlzIHRyYW5zZm9ybWVkIGludG8gQ2FzZSAzLlxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlX2xlZnQoY3VycmVudF9ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSzsgICAgLy8gQ2FzZSAzLiBDdXJyZW50IGlzIGxlZnQgY2hpbGQuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlLWNvbG9yIGZhdGhlciBhbmQgZ3JhbmRmYXRoZXIsIHJvdGF0ZSBncmFuZGZhdGhlciByaWdodFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfUkVEO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9yaWdodChjdXJyZW50X25vZGUucGFyZW50LnBhcmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IGlzIHJpZ2h0IGNoaWxkIG9mIGdyYW5kZmF0aGVyXG4gICAgICAgICAgICAgICAgdW5jbGVfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQucGFyZW50LmxlZnQ7ICAgICAgICAgICAgICAvLyBsZWZ0IGJyb3RoZXIgb2YgcGFyZW50XG4gICAgICAgICAgICAgICAgaWYgKHVuY2xlX25vZGUuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfUkVEKSB7ICAgICAgICAgICAgIC8vIENhc2UgNC4gVW5jbGUgaXMgcmVkXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlLWNvbG9yIGZhdGhlciBhbmQgdW5jbGUgaW50byBibGFja1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSztcbiAgICAgICAgICAgICAgICAgICAgdW5jbGVfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQucGFyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfbm9kZSA9PT0gY3VycmVudF9ub2RlLnBhcmVudC5sZWZ0KSB7ICAgICAgICAgICAgIC8vIENhc2UgNS4gQ3VycmVudCBpcyBsZWZ0IGNoaWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gaW50byBjYXNlIDZcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9yaWdodChjdXJyZW50X25vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLOyAgICAvLyBDYXNlIDYuIEN1cnJlbnQgaXMgcmlnaHQgY2hpbGQuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlLWNvbG9yIGZhdGhlciBhbmQgZ3JhbmRmYXRoZXIsIHJvdGF0ZSBncmFuZGZhdGhlciBsZWZ0XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlX2xlZnQoY3VycmVudF9ub2RlLnBhcmVudC5wYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucm9vdC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgfVxuXG4gICAgdHJlZV9kZWxldGUoZGVsZXRlX25vZGUpIHtcbiAgICAgICAgbGV0IGN1dF9ub2RlOyAgIC8vIG5vZGUgdG8gYmUgY3V0IC0gZWl0aGVyIGRlbGV0ZV9ub2RlIG9yIHN1Y2Nlc3Nvcl9ub2RlICAoXCJ5XCIgZnJvbSAxNC40KVxuICAgICAgICBsZXQgZml4X25vZGU7ICAgLy8gbm9kZSB0byBmaXggcmIgdHJlZSBwcm9wZXJ0eSAgIChcInhcIiBmcm9tIDE0LjQpXG5cbiAgICAgICAgaWYgKGRlbGV0ZV9ub2RlLmxlZnQgPT09IHRoaXMubmlsX25vZGUgfHwgZGVsZXRlX25vZGUucmlnaHQgPT09IHRoaXMubmlsX25vZGUpIHsgIC8vIGRlbGV0ZV9ub2RlIGhhcyBsZXNzIHRoZW4gMiBjaGlsZHJlblxuICAgICAgICAgICAgY3V0X25vZGUgPSBkZWxldGVfbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlX25vZGUgaGFzIDIgY2hpbGRyZW5cbiAgICAgICAgICAgIGN1dF9ub2RlID0gdGhpcy50cmVlX3N1Y2Nlc3NvcihkZWxldGVfbm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXhfbm9kZSBpZiBzaW5nbGUgY2hpbGQgb2YgY3V0X25vZGVcbiAgICAgICAgaWYgKGN1dF9ub2RlLmxlZnQgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIGZpeF9ub2RlID0gY3V0X25vZGUubGVmdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZpeF9ub2RlID0gY3V0X25vZGUucmlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmUgY3V0X25vZGUgZnJvbSBwYXJlbnRcbiAgICAgICAgLyppZiAoZml4X25vZGUgIT0gdGhpcy5uaWxfbm9kZSkgeyovXG4gICAgICAgICAgICBmaXhfbm9kZS5wYXJlbnQgPSBjdXRfbm9kZS5wYXJlbnQ7XG4gICAgICAgIC8qfSovXG5cbiAgICAgICAgaWYgKGN1dF9ub2RlID09PSB0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IGZpeF9ub2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN1dF9ub2RlID09PSBjdXRfbm9kZS5wYXJlbnQubGVmdCkge1xuICAgICAgICAgICAgICAgIGN1dF9ub2RlLnBhcmVudC5sZWZ0ID0gZml4X25vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXRfbm9kZS5wYXJlbnQucmlnaHQgPSBmaXhfbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1dF9ub2RlLnBhcmVudC51cGRhdGVfbWF4KCk7ICAgICAgICAvLyB1cGRhdGUgbWF4IHByb3BlcnR5IG9mIHRoZSBwYXJlbnRcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVjYWxjX21heChmaXhfbm9kZSk7ICAgICAgICAgICAgICAvLyB1cGRhdGUgbWF4IHByb3BlcnR5IHVwd2FyZCBmcm9tIGZpeF9ub2RlIHRvIHJvb3RcblxuICAgICAgICAvLyBDT1BZIERBVEEgISEhXG4gICAgICAgIC8vIERlbGV0ZV9ub2RlIGJlY29tZXMgY3V0X25vZGUsIGl0IG1lYW5zIHRoYXQgd2UgY2Fubm90IGhvbGQgcmVmZXJlbmNlXG4gICAgICAgIC8vIHRvIG5vZGUgaW4gb3V0ZXIgc3RydWN0dXJlIGFuZCB3ZSB3aWxsIGhhdmUgdG8gZGVsZXRlIGJ5IGtleSwgYWRkaXRpb25hbCBzZWFyY2ggbmVlZFxuICAgICAgICBpZiAoY3V0X25vZGUgIT09IGRlbGV0ZV9ub2RlKSB7XG4gICAgICAgICAgICBkZWxldGVfbm9kZS5jb3B5X2RhdGEoY3V0X25vZGUpO1xuICAgICAgICAgICAgZGVsZXRlX25vZGUudXBkYXRlX21heCgpOyAgICAgICAgICAgLy8gdXBkYXRlIG1heCBwcm9wZXJ0eSBvZiB0aGUgY3V0IG5vZGUgYXQgdGhlIG5ldyBwbGFjZVxuICAgICAgICAgICAgdGhpcy5yZWNhbGNfbWF4KGRlbGV0ZV9ub2RlKTsgICAgICAgLy8gdXBkYXRlIG1heCBwcm9wZXJ0eSB1cHdhcmQgZnJvbSBkZWxldGVfbm9kZSB0byByb290XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoLypmaXhfbm9kZSAhPSB0aGlzLm5pbF9ub2RlICYmICovY3V0X25vZGUuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlX2ZpeHVwKGZpeF9ub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlbGV0ZV9maXh1cChmaXhfbm9kZSkge1xuICAgICAgICBsZXQgY3VycmVudF9ub2RlID0gZml4X25vZGU7XG4gICAgICAgIGxldCBicm90aGVyX25vZGU7XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnRfbm9kZSAhPT0gdGhpcy5yb290ICYmIGN1cnJlbnRfbm9kZS5wYXJlbnQgIT0gbnVsbCAmJiBjdXJyZW50X25vZGUuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50X25vZGUgPT09IGN1cnJlbnRfbm9kZS5wYXJlbnQubGVmdCkgeyAgICAgICAgICAvLyBmaXggbm9kZSBpcyBsZWZ0IGNoaWxkXG4gICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudC5yaWdodDtcbiAgICAgICAgICAgICAgICBpZiAoYnJvdGhlcl9ub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX1JFRCkgeyAgIC8vIENhc2UgMS4gQnJvdGhlciBpcyByZWRcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSzsgICAgICAgICAvLyByZS1jb2xvciBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX1JFRDsgICAgLy8gcmUtY29sb3IgZmF0aGVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlX2xlZnQoY3VycmVudF9ub2RlLnBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQucmlnaHQ7ICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBicm90aGVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIERlcml2ZSB0byBjYXNlcyAyLi40OiBicm90aGVyIGlzIGJsYWNrXG4gICAgICAgICAgICAgICAgaWYgKGJyb3RoZXJfbm9kZS5sZWZ0LmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLICYmXG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5yaWdodC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSykgeyAgLy8gY2FzZSAyOiBib3RoIG5lcGhld3MgYmxhY2tcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7ICAgICAgICAgICAgICAvLyByZS1jb2xvciBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQ7ICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgaXRlcmF0aW9uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnJvdGhlcl9ub2RlLnJpZ2h0LmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX0JMQUNLKSB7ICAgLy8gY2FzZSAzOiBsZWZ0IG5lcGhldyByZWQsIHJpZ2h0IG5lcGhldyBibGFja1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7ICAgICAgICAgIC8vIHJlLWNvbG9yIGJyb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5sZWZ0LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSzsgICAvLyByZS1jb2xvciBuZXBoZXdcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlX3JpZ2h0KGJyb3RoZXJfbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LnJpZ2h0OyAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXJpdmUgdG8gY2FzZSA0OiBsZWZ0IG5lcGhldyBibGFjaywgcmlnaHQgbmVwaGV3IHJlZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgNDogbGVmdCBuZXBoZXcgYmxhY2ssIHJpZ2h0IG5lcGhldyByZWRcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gY3VycmVudF9ub2RlLnBhcmVudC5jb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZS5yaWdodC5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlX2xlZnQoY3VycmVudF9ub2RlLnBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IHRoaXMucm9vdDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpdCBmcm9tIGxvb3BcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXggbm9kZSBpcyByaWdodCBjaGlsZFxuICAgICAgICAgICAgICAgIGJyb3RoZXJfbm9kZSA9IGN1cnJlbnRfbm9kZS5wYXJlbnQubGVmdDtcbiAgICAgICAgICAgICAgICBpZiAoYnJvdGhlcl9ub2RlLmNvbG9yID09PSBSQl9UUkVFX0NPTE9SX1JFRCkgeyAgIC8vIENhc2UgMS4gQnJvdGhlciBpcyByZWRcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSzsgICAgICAgICAvLyByZS1jb2xvciBicm90aGVyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX1JFRDsgICAgLy8gcmUtY29sb3IgZmF0aGVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlX3JpZ2h0KGN1cnJlbnRfbm9kZS5wYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LmxlZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGJyb3RoZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gR28gdG8gY2FzZXMgMi4uNFxuICAgICAgICAgICAgICAgIGlmIChicm90aGVyX25vZGUubGVmdC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSyAmJlxuICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUucmlnaHQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHsgICAvLyBjYXNlIDJcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7ICAgICAgICAgICAgIC8vIHJlLWNvbG9yIGJyb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gY3VycmVudF9ub2RlLnBhcmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZSBpdGVyYXRpb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChicm90aGVyX25vZGUubGVmdC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSykgeyAgLy8gY2FzZSAzOiByaWdodCBuZXBoZXcgcmVkLCBsZWZ0IG5lcGhldyBibGFja1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmNvbG9yID0gUkJfVFJFRV9DT0xPUl9SRUQ7ICAgICAgICAgICAgLy8gcmUtY29sb3IgYnJvdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLnJpZ2h0LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSzsgICAgLy8gcmUtY29sb3IgbmVwaGV3XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9sZWZ0KGJyb3RoZXJfbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUgPSBjdXJyZW50X25vZGUucGFyZW50LmxlZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGJyb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlcml2ZSB0byBjYXNlIDQ6IHJpZ2h0IG5lcGhldyBibGFjaywgbGVmdCBuZXBoZXcgcmVkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSA0OiByaWdodCBuZXBoZXcgYmxhY2ssIGxlZnQgbmVwaGV3IHJlZFxuICAgICAgICAgICAgICAgICAgICBicm90aGVyX25vZGUuY29sb3IgPSBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNvbG9yID0gUkJfVFJFRV9DT0xPUl9CTEFDSztcbiAgICAgICAgICAgICAgICAgICAgYnJvdGhlcl9ub2RlLmxlZnQuY29sb3IgPSBSQl9UUkVFX0NPTE9SX0JMQUNLO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZV9yaWdodChjdXJyZW50X25vZGUucGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gdGhpcy5yb290OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSBleGl0IGZyb20gbG9vcFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRfbm9kZS5jb2xvciA9IFJCX1RSRUVfQ09MT1JfQkxBQ0s7XG4gICAgfVxuXG4gICAgdHJlZV9zZWFyY2gobm9kZSwgc2VhcmNoX25vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCB8fCBub2RlID09PSB0aGlzLm5pbF9ub2RlKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoc2VhcmNoX25vZGUuZXF1YWxfdG8obm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWFyY2hfbm9kZS5sZXNzX3RoYW4obm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyZWVfc2VhcmNoKG5vZGUubGVmdCwgc2VhcmNoX25vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJlZV9zZWFyY2gobm9kZS5yaWdodCwgc2VhcmNoX25vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJlZV9zZWFyY2hfbmVhcmVzdF9mb3J3YXJkKG5vZGUsIHNlYXJjaF9ub2RlKSB7XG4gICAgICAgIGxldCBiZXN0O1xuICAgICAgICBsZXQgY3VyciA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChjdXJyICYmIGN1cnIgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyLmxlc3NfdGhhbihzZWFyY2hfbm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyci5pbnRlcnNlY3Qoc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjdXJyO1xuICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3Vyci5sZWZ0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyLnJpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFiZXN0IHx8IGN1cnIubGVzc190aGFuKGJlc3QpKSBiZXN0ID0gY3VycjtcbiAgICAgICAgICAgICAgICBjdXJyID0gY3Vyci5sZWZ0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gT3JpZ2luYWwgc2VhcmNoX2ludGVydmFsIG1ldGhvZDsgY29udGFpbmVyIHJlcyBzdXBwb3J0IHB1c2goKSBpbnNlcnRpb25cbiAgICAvLyBTZWFyY2ggYWxsIGludGVydmFscyBpbnRlcnNlY3RpbmcgZ2l2ZW4gb25lXG4gICAgdHJlZV9zZWFyY2hfaW50ZXJ2YWwobm9kZSwgc2VhcmNoX25vZGUsIHJlcykge1xuICAgICAgICBpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIC8vIGlmIChub2RlLT5sZWZ0ICE9IHRoaXMubmlsX25vZGUgJiYgbm9kZS0+bGVmdC0+bWF4ID49IGxvdykge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVmdCAhPT0gdGhpcy5uaWxfbm9kZSAmJiAhbm9kZS5ub3RfaW50ZXJzZWN0X2xlZnRfc3VidHJlZShzZWFyY2hfbm9kZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVfc2VhcmNoX2ludGVydmFsKG5vZGUubGVmdCwgc2VhcmNoX25vZGUsIHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAobG93IDw9IG5vZGUtPmhpZ2ggJiYgbm9kZS0+bG93IDw9IGhpZ2gpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmludGVyc2VjdChzZWFyY2hfbm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIChub2RlLT5yaWdodCAhPSB0aGlzLm5pbF9ub2RlICYmIG5vZGUtPmxvdyA8PSBoaWdoKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5yaWdodCAhPT0gdGhpcy5uaWxfbm9kZSAmJiAhbm9kZS5ub3RfaW50ZXJzZWN0X3JpZ2h0X3N1YnRyZWUoc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlX3NlYXJjaF9pbnRlcnZhbChub2RlLnJpZ2h0LCBzZWFyY2hfbm9kZSwgcmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyZWVfZmluZF9hbnlfaW50ZXJ2YWwobm9kZSwgc2VhcmNoX25vZGUpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGlmIChub2RlICE9IG51bGwgJiYgbm9kZSAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVmdCAhPT0gdGhpcy5uaWxfbm9kZSAmJiAhbm9kZS5ub3RfaW50ZXJzZWN0X2xlZnRfc3VidHJlZShzZWFyY2hfbm9kZSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRoaXMudHJlZV9maW5kX2FueV9pbnRlcnZhbChub2RlLmxlZnQsIHNlYXJjaF9ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IG5vZGUuaW50ZXJzZWN0KHNlYXJjaF9ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQgJiYgbm9kZS5yaWdodCAhPT0gdGhpcy5uaWxfbm9kZSAmJiAhbm9kZS5ub3RfaW50ZXJzZWN0X3JpZ2h0X3N1YnRyZWUoc2VhcmNoX25vZGUpKSB7XG4gICAgICAgICAgICAgICAgZm91bmQgPSB0aGlzLnRyZWVfZmluZF9hbnlfaW50ZXJ2YWwobm9kZS5yaWdodCwgc2VhcmNoX25vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG5cbiAgICBsb2NhbF9taW5pbXVtKG5vZGUpIHtcbiAgICAgICAgbGV0IG5vZGVfbWluID0gbm9kZTtcbiAgICAgICAgd2hpbGUgKG5vZGVfbWluLmxlZnQgIT0gbnVsbCAmJiBub2RlX21pbi5sZWZ0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICBub2RlX21pbiA9IG5vZGVfbWluLmxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVfbWluO1xuICAgIH1cblxuICAgIC8vIG5vdCBpbiB1c2VcbiAgICBsb2NhbF9tYXhpbXVtKG5vZGUpIHtcbiAgICAgICAgbGV0IG5vZGVfbWF4ID0gbm9kZTtcbiAgICAgICAgd2hpbGUgKG5vZGVfbWF4LnJpZ2h0ICE9IG51bGwgJiYgbm9kZV9tYXgucmlnaHQgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIG5vZGVfbWF4ID0gbm9kZV9tYXgucmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVfbWF4O1xuICAgIH1cblxuICAgIHRyZWVfc3VjY2Vzc29yKG5vZGUpIHtcbiAgICAgICAgbGV0IG5vZGVfc3VjY2Vzc29yO1xuICAgICAgICBsZXQgY3VycmVudF9ub2RlO1xuICAgICAgICBsZXQgcGFyZW50X25vZGU7XG5cbiAgICAgICAgaWYgKG5vZGUucmlnaHQgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIG5vZGVfc3VjY2Vzc29yID0gdGhpcy5sb2NhbF9taW5pbXVtKG5vZGUucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudF9ub2RlID0gbm9kZTtcbiAgICAgICAgICAgIHBhcmVudF9ub2RlID0gbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICB3aGlsZSAocGFyZW50X25vZGUgIT0gbnVsbCAmJiBwYXJlbnRfbm9kZS5yaWdodCA9PT0gY3VycmVudF9ub2RlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gcGFyZW50X25vZGU7XG4gICAgICAgICAgICAgICAgcGFyZW50X25vZGUgPSBwYXJlbnRfbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlX3N1Y2Nlc3NvciA9IHBhcmVudF9ub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlX3N1Y2Nlc3NvcjtcbiAgICB9XG5cbiAgICAvLyAgICAgICAgICAgfCAgICAgICAgICAgIHJpZ2h0LXJvdGF0ZShULHkpICAgICAgIHxcbiAgICAvLyAgICAgICAgICAgeSAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS4gICAgICAgeFxuICAgIC8vICAgICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXFxuICAgIC8vICAgICAgICAgeCAgIGMgICAgICAgICAgbGVmdC1yb3RhdGUoVCx4KSAgICAgIGEgICB5XG4gICAgLy8gICAgICAgIC8gXFwgICAgICAgICAgICAgPC0tLS0tLS0tLS0tLS0tLSAgICAgICAgIC8gXFxcbiAgICAvLyAgICAgICBhICAgYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgICBjXG5cbiAgICByb3RhdGVfbGVmdCh4KSB7XG4gICAgICAgIGxldCB5ID0geC5yaWdodDtcblxuICAgICAgICB4LnJpZ2h0ID0geS5sZWZ0OyAgICAgICAgICAgLy8gYiBnb2VzIHRvIHgucmlnaHRcblxuICAgICAgICBpZiAoeS5sZWZ0ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB5LmxlZnQucGFyZW50ID0geDsgICAgIC8vIHggYmVjb21lcyBwYXJlbnQgb2YgYlxuICAgICAgICB9XG4gICAgICAgIHkucGFyZW50ID0geC5wYXJlbnQ7ICAgICAgIC8vIG1vdmUgcGFyZW50XG5cbiAgICAgICAgaWYgKHggPT09IHRoaXMucm9vdCkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0geTsgICAgICAgICAgIC8vIHkgYmVjb21lcyByb290XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8geSBiZWNvbWVzIGNoaWxkIG9mIHgucGFyZW50XG4gICAgICAgICAgICBpZiAoeCA9PT0geC5wYXJlbnQubGVmdCkge1xuICAgICAgICAgICAgICAgIHgucGFyZW50LmxlZnQgPSB5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgeC5wYXJlbnQucmlnaHQgPSB5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHkubGVmdCA9IHg7ICAgICAgICAgICAgICAgICAvLyB4IGJlY29tZXMgbGVmdCBjaGlsZCBvZiB5XG4gICAgICAgIHgucGFyZW50ID0geTsgICAgICAgICAgICAgICAvLyBhbmQgeSBiZWNvbWVzIHBhcmVudCBvZiB4XG5cbiAgICAgICAgaWYgKHggIT0gbnVsbCAmJiB4ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB4LnVwZGF0ZV9tYXgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHkgPSB4LnBhcmVudDtcbiAgICAgICAgaWYgKHkgIT0gbnVsbCAmJiB5ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB5LnVwZGF0ZV9tYXgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJvdGF0ZV9yaWdodCh5KSB7XG4gICAgICAgIGxldCB4ID0geS5sZWZ0O1xuXG4gICAgICAgIHkubGVmdCA9IHgucmlnaHQ7ICAgICAgICAgICAvLyBiIGdvZXMgdG8geS5sZWZ0XG5cbiAgICAgICAgaWYgKHgucmlnaHQgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIHgucmlnaHQucGFyZW50ID0geTsgICAgICAgIC8vIHkgYmVjb21lcyBwYXJlbnQgb2YgYlxuICAgICAgICB9XG4gICAgICAgIHgucGFyZW50ID0geS5wYXJlbnQ7ICAgICAgICAgIC8vIG1vdmUgcGFyZW50XG5cbiAgICAgICAgaWYgKHkgPT09IHRoaXMucm9vdCkgeyAgICAgICAgLy8geCBiZWNvbWVzIHJvb3RcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLy8geSBiZWNvbWVzIGNoaWxkIG9mIHgucGFyZW50XG4gICAgICAgICAgICBpZiAoeSA9PT0geS5wYXJlbnQubGVmdCkge1xuICAgICAgICAgICAgICAgIHkucGFyZW50LmxlZnQgPSB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgeS5wYXJlbnQucmlnaHQgPSB4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHgucmlnaHQgPSB5OyAgICAgICAgICAgICAgICAgLy8geSBiZWNvbWVzIHJpZ2h0IGNoaWxkIG9mIHhcbiAgICAgICAgeS5wYXJlbnQgPSB4OyAgICAgICAgICAgICAgIC8vIGFuZCB4IGJlY29tZXMgcGFyZW50IG9mIHlcblxuICAgICAgICBpZiAoeSAhPT0gbnVsbCAmJiB5ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB5LnVwZGF0ZV9tYXgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHggPSB5LnBhcmVudDtcbiAgICAgICAgaWYgKHggIT0gbnVsbCAmJiB4ICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB4LnVwZGF0ZV9tYXgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRyZWVfd2Fsayhub2RlLCBhY3Rpb24pIHtcbiAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlICE9PSB0aGlzLm5pbF9ub2RlKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVfd2Fsayhub2RlLmxlZnQsIGFjdGlvbik7XG4gICAgICAgICAgICAvLyBhcnIucHVzaChub2RlLnRvQXJyYXkoKSk7XG4gICAgICAgICAgICBhY3Rpb24obm9kZSk7XG4gICAgICAgICAgICB0aGlzLnRyZWVfd2Fsayhub2RlLnJpZ2h0LCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIHRydWUgaWYgYWxsIHJlZCBub2RlcyBoYXZlIGV4YWN0bHkgdHdvIGJsYWNrIGNoaWxkIG5vZGVzICovXG4gICAgdGVzdFJlZEJsYWNrUHJvcGVydHkoKSB7XG4gICAgICAgIGxldCByZXMgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyZWVfd2Fsayh0aGlzLnJvb3QsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9SRUQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShub2RlLmxlZnQuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0sgJiYgbm9kZS5yaWdodC5jb2xvciA9PT0gUkJfVFJFRV9DT0xPUl9CTEFDSykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKiBUaHJvdyBlcnJvciBpZiBub3QgZXZlcnkgcGF0aCBmcm9tIHJvb3QgdG8gYm90dG9tIGhhcyBzYW1lIGJsYWNrIGhlaWdodCAqL1xuICAgIHRlc3RCbGFja0hlaWdodFByb3BlcnR5KG5vZGUpIHtcbiAgICAgICAgbGV0IGhlaWdodCA9IDA7XG4gICAgICAgIGxldCBoZWlnaHRMZWZ0ID0gMDtcbiAgICAgICAgbGV0IGhlaWdodFJpZ2h0ID0gMDtcbiAgICAgICAgaWYgKG5vZGUuY29sb3IgPT09IFJCX1RSRUVfQ09MT1JfQkxBQ0spIHtcbiAgICAgICAgICAgIGhlaWdodCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmxlZnQgIT09IHRoaXMubmlsX25vZGUpIHtcbiAgICAgICAgICAgIGhlaWdodExlZnQgPSB0aGlzLnRlc3RCbGFja0hlaWdodFByb3BlcnR5KG5vZGUubGVmdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoZWlnaHRMZWZ0ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5yaWdodCAhPT0gdGhpcy5uaWxfbm9kZSkge1xuICAgICAgICAgICAgaGVpZ2h0UmlnaHQgPSB0aGlzLnRlc3RCbGFja0hlaWdodFByb3BlcnR5KG5vZGUucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0UmlnaHQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWlnaHRMZWZ0ICE9PSBoZWlnaHRSaWdodCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWQtYmxhY2sgaGVpZ2h0IHByb3BlcnR5IHZpb2xhdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaGVpZ2h0ICs9IGhlaWdodExlZnQ7XG4gICAgICAgIHJldHVybiBoZWlnaHQ7XG4gICAgfVxufVxuXG5leHBvcnQgeyBJbnRlcnZhbCwgTm9kZSwgSW50ZXJ2YWxUcmVlIGFzIGRlZmF1bHQgfTtcbiIsICJpbXBvcnQgeyBUZXh0IH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgSW50ZXJ2YWxUcmVlIGZyb20gXCJAZmxhdHRlbi1qcy9pbnRlcnZhbC10cmVlXCI7XG5pbXBvcnQgeyB0eXBlIENyaXRpY01hcmt1cFJhbmdlIH0gZnJvbSBcIi4vYmFzZV9yYW5nZVwiO1xuXG5leHBvcnQgY2xhc3MgQ3JpdGljTWFya3VwUmFuZ2VzIHtcblx0cmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZVtdO1xuXHR0cmVlOiBJbnRlcnZhbFRyZWU8Q3JpdGljTWFya3VwUmFuZ2U+O1xuXG5cdGNvbnN0cnVjdG9yKHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXSkge1xuXHRcdHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuXHRcdHRoaXMudHJlZSA9IG5ldyBJbnRlcnZhbFRyZWUoKTtcblx0XHRmb3IgKGNvbnN0IHJhbmdlIG9mIHJhbmdlcylcblx0XHRcdHRoaXMudHJlZS5pbnNlcnQoW3JhbmdlLmZyb20sIHJhbmdlLnRvXSwgcmFuZ2UpO1xuXHR9XG5cblx0ZW1wdHkoKSB7XG5cdFx0cmV0dXJuIHRoaXMucmFuZ2VzLmxlbmd0aCA9PT0gMDtcblx0fVxuXG5cdGdldChpbmRleDogbnVtYmVyKSB7XG5cdFx0aWYgKGluZGV4IDwgMClcblx0XHRcdHJldHVybiB0aGlzLnJhbmdlc1t0aGlzLnJhbmdlcy5sZW5ndGggKyBpbmRleF07XG5cdFx0cmV0dXJuIHRoaXMucmFuZ2VzW2luZGV4XTtcblx0fVxuXG5cdC8vIFJpZ2h0IGJyZWFrcyB0aWVzIGlmIGN1cnNvciBiZXR3ZWVuIHR3byByYW5nZXMsIGRlZmF1bHRzIHRvIHRoZSBsZWZ0IHJhbmdlXG5cdGF0X2N1cnNvcihjdXJzb3I6IG51bWJlciwgcmlnaHQgPSBmYWxzZSk6IENyaXRpY01hcmt1cFJhbmdlIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBzZWFyY2ggPSB0aGlzLnRyZWUuc2VhcmNoKFtjdXJzb3IsIGN1cnNvcl0pO1xuXHRcdHJldHVybiBzZWFyY2gubGVuZ3RoID8gKHJpZ2h0ICYmIHNlYXJjaC5sZW5ndGggPiAxKSA/IHNlYXJjaFsxXSA6IHNlYXJjaFswXSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnRhaW5zX3JhbmdlKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnRyZWUuaW50ZXJzZWN0X2FueShbZnJvbSwgdG9dKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHJhbmdlIHRoYXQgaXMgKG5vdCBkaXJlY3RseSkgYWRqYWNlbnQgdG8gdGhlIGN1cnNvciBpbiBnaXZlbiBkaXJlY3Rpb25cblx0ICogQHBhcmFtIGN1cnNvciAtIEN1cnNvciBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIGxlZnQgLSBXaGV0aGVyIHRvIGxvb2sgbGVmdCBvciByaWdodCBvZiB0aGUgY3Vyc29yXG5cdCAqIEBwYXJhbSBsb29zZSAtIFdoZXRoZXIgdG8gaW5jbHVkZSByYW5nZXMgdGhhdCBhcmUgcGFydGlhbGx5IGFkamFjZW50IHRvIHRoZSBjdXJzb3Jcblx0ICogQHBhcmFtIGluY2x1ZGVfZWRnZSAtIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgZWRnZXMgb2YgdGhlIHJhbmdlXG5cdCAqL1xuXHRyYW5nZV9hZGphY2VudF90b19jdXJzb3IoY3Vyc29yOiBudW1iZXIsIGxlZnQ6IGJvb2xlYW4sIGxvb3NlID0gZmFsc2UsIGluY2x1ZGVfZWRnZSA9IGZhbHNlKSB7XG5cdFx0Y29uc3QgcmFuZ2VzID0gbGVmdCA/IHRoaXMucmFuZ2VzLnNsaWNlKCkucmV2ZXJzZSgpIDogdGhpcy5yYW5nZXM7XG5cdFx0aWYgKGluY2x1ZGVfZWRnZSkge1xuXHRcdFx0cmV0dXJuIHJhbmdlcy5maW5kKHJhbmdlID0+XG5cdFx0XHRcdGxlZnQgPyAoKGxvb3NlID8gcmFuZ2UuZnJvbSA6IHJhbmdlLnRvKSA8IGN1cnNvcikgOiAoY3Vyc29yIDwgKGxvb3NlID8gcmFuZ2UudG8gOiByYW5nZS5mcm9tKSlcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiByYW5nZXMuZmluZChyYW5nZSA9PlxuXHRcdFx0XHRsZWZ0ID8gKChsb29zZSA/IHJhbmdlLmZyb20gOiByYW5nZS50bykgPD0gY3Vyc29yKSA6IChjdXJzb3IgPD0gKGxvb3NlID8gcmFuZ2UudG8gOiByYW5nZS5mcm9tKSlcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0YWRqYWNlbnRfcmFuZ2UocmFuZ2U6IENyaXRpY01hcmt1cFJhbmdlLCBsZWZ0OiBib29sZWFuLCBkaXJlY3RseV9hZGphY2VudCA9IGZhbHNlKSB7XG5cdFx0Y29uc3QgcmFuZ2VfaWR4ID0gdGhpcy5yYW5nZXMuZmluZEluZGV4KG4gPT4gbiA9PT0gcmFuZ2UpO1xuXHRcdGlmIChyYW5nZV9pZHggPT09IC0xKVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRjb25zdCBhZGphY2VudCA9IGxlZnQgPyB0aGlzLnJhbmdlc1tyYW5nZV9pZHggLSAxXSA6IHRoaXMucmFuZ2VzW3JhbmdlX2lkeCArIDFdO1xuXHRcdGlmICghYWRqYWNlbnQpXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0aWYgKGRpcmVjdGx5X2FkamFjZW50KSB7XG5cdFx0XHRpZiAobGVmdCA/IGFkamFjZW50LnRvID09PSByYW5nZS5mcm9tIDogcmFuZ2UudG8gPT09IGFkamFjZW50LmZyb20pXG5cdFx0XHRcdHJldHVybiBhZGphY2VudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGFkamFjZW50O1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cmFuZ2VzX2luX3JhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSB7XG5cdFx0cmV0dXJuIHRoaXMudHJlZS5zZWFyY2goW3N0YXJ0LCBlbmRdKSBhcyBDcml0aWNNYXJrdXBSYW5nZVtdO1xuXHR9XG5cblx0Ly8gcmFuZ2VzX2Z1bGx5X2luX3JhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSB7XG5cdC8vIFx0Y29uc3QgcmFuZ2VzID0gdGhpcy5yYW5nZXNfaW5fcmFuZ2Uoc3RhcnQsIGVuZCk7XG5cdC8vIFx0aWYgKHJhbmdlc1tyYW5nZXMubGVuZ3RoIC0gMV0/LnRvdWNoZXNfbGVmdF9icmFja2V0KHN0YXJ0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSkpXG5cdC8vIFx0XHRyYW5nZXMucG9wKCk7XG5cdC8vIFx0aWYgKHJhbmdlc1swXT8udG91Y2hlc19yaWdodF9icmFja2V0KGVuZCwgZmFsc2UsIHRydWUpKVxuXHQvLyBcdFx0cmFuZ2VzLnNoaWZ0KCk7XG5cdC8vIFx0cmV0dXJuIHJhbmdlcztcblx0Ly8gfVxuXG5cdHVud3JhcF9pbl9yYW5nZShcblx0XHRkb2M6IFRleHQsXG5cdFx0ZnJvbSA9IDAsXG5cdFx0dG8gPSBkb2MubGVuZ3RoLFxuXHRcdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXSB8IG51bGwgPSBudWxsLFxuXHQpOiB7IG91dHB1dDogc3RyaW5nOyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXI7IGZyb250X3JhbmdlPzogQ3JpdGljTWFya3VwUmFuZ2U7IGJhY2tfcmFuZ2U/OiBDcml0aWNNYXJrdXBSYW5nZSB9IHtcblx0XHRsZXQgZnJvbnRfcmFuZ2U6IHVuZGVmaW5lZCB8IENyaXRpY01hcmt1cFJhbmdlLCBiYWNrX3JhbmdlOiB1bmRlZmluZWQgfCBDcml0aWNNYXJrdXBSYW5nZTtcblxuXHRcdGlmICghcmFuZ2VzKVxuXHRcdFx0cmFuZ2VzID0gdGhpcy5yYW5nZXNfaW5fcmFuZ2UoZnJvbSwgdG8pO1xuXG5cdFx0aWYgKHJhbmdlcy5sZW5ndGggPT09IDApXG5cdFx0XHRyZXR1cm4geyBvdXRwdXQ6IGRvYy5zbGljZVN0cmluZyhmcm9tLCB0byksIGZyb20sIHRvIH07XG5cblx0XHRsZXQgb3V0cHV0ID0gXCJcIjtcblx0XHRpZiAoZnJvbSA8IHJhbmdlc1swXS5mcm9tKVxuXHRcdFx0b3V0cHV0ICs9IGRvYy5zbGljZVN0cmluZyhmcm9tLCByYW5nZXNbMF0uZnJvbSk7XG5cdFx0ZWxzZVxuXHRcdFx0ZnJvbnRfcmFuZ2UgPSByYW5nZXNbMF07XG5cblx0XHRsZXQgcHJldl9yYW5nZSA9IC0xO1xuXHRcdGZvciAoY29uc3QgcmFuZ2Ugb2YgcmFuZ2VzKSB7XG5cdFx0XHRpZiAocHJldl9yYW5nZSAhPT0gLTEpXG5cdFx0XHRcdG91dHB1dCArPSBkb2Muc2xpY2VTdHJpbmcocHJldl9yYW5nZSwgcmFuZ2UuZnJvbSk7XG5cdFx0XHRvdXRwdXQgKz0gcmFuZ2UudW53cmFwX3NsaWNlKE1hdGgubWF4KDAsIGZyb20pLCB0byk7XG5cdFx0XHRwcmV2X3JhbmdlID0gcmFuZ2UudG87XG5cdFx0fVxuXG5cdFx0aWYgKHRvID49IHJhbmdlcy5hdCgtMSkhLnRvKVxuXHRcdFx0b3V0cHV0ICs9IGRvYy5zbGljZVN0cmluZyhyYW5nZXMuYXQoLTEpIS50bywgdG8pO1xuXHRcdGVsc2Vcblx0XHRcdGJhY2tfcmFuZ2UgPSByYW5nZXMuYXQoLTEpITtcblxuXHRcdGNvbnN0IG5ld19mcm9tID0gZnJvbnRfcmFuZ2UgPyBmcm9udF9yYW5nZS5jdXJzb3JfcGFzc19zeW50YXgoZnJvbSwgZmFsc2UpIDogZnJvbTtcblx0XHRjb25zdCBuZXdfdG8gPSBiYWNrX3JhbmdlID8gYmFja19yYW5nZS5jdXJzb3JfcGFzc19zeW50YXgodG8sIHRydWUpIDogdG87XG5cdFx0aWYgKG5ld19mcm9tICE9PSBmcm9tIHx8IGZyb20gPT09IGZyb250X3JhbmdlPy5mcm9tKSBmcm9udF9yYW5nZSA9IHVuZGVmaW5lZDtcblx0XHRpZiAobmV3X3RvICE9PSB0byB8fCB0byA9PT0gYmFja19yYW5nZT8udG8pIGJhY2tfcmFuZ2UgPSB1bmRlZmluZWQ7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b3V0cHV0LFxuXHRcdFx0ZnJvbTogbmV3X2Zyb20sXG5cdFx0XHR0bzogbmV3X3RvLFxuXHRcdFx0ZnJvbnRfcmFuZ2UsXG5cdFx0XHRiYWNrX3JhbmdlLFxuXHRcdH07XG5cdH1cbn1cbiIsICJjb25zdCBDID0gXCJcXHUwMzdjXCJcbmNvbnN0IENPVU5UID0gdHlwZW9mIFN5bWJvbCA9PSBcInVuZGVmaW5lZFwiID8gXCJfX1wiICsgQyA6IFN5bWJvbC5mb3IoQylcbmNvbnN0IFNFVCA9IHR5cGVvZiBTeW1ib2wgPT0gXCJ1bmRlZmluZWRcIiA/IFwiX19zdHlsZVNldFwiICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMWU4KSA6IFN5bWJvbChcInN0eWxlU2V0XCIpXG5jb25zdCB0b3AgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9XG5cbi8vIDo6IC0gU3R5bGUgbW9kdWxlcyBlbmNhcHN1bGF0ZSBhIHNldCBvZiBDU1MgcnVsZXMgZGVmaW5lZCBmcm9tXG4vLyBKYXZhU2NyaXB0LiBUaGVpciBkZWZpbml0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgaW4gYSBnaXZlbiBET01cbi8vIHJvb3QgYWZ0ZXIgaXQgaGFzIGJlZW4gX21vdW50ZWRfIHRoZXJlIHdpdGggYFN0eWxlTW9kdWxlLm1vdW50YC5cbi8vXG4vLyBTdHlsZSBtb2R1bGVzIHNob3VsZCBiZSBjcmVhdGVkIG9uY2UgYW5kIHN0b3JlZCBzb21ld2hlcmUsIGFzXG4vLyBvcHBvc2VkIHRvIHJlLWNyZWF0aW5nIHRoZW0gZXZlcnkgdGltZSB5b3UgbmVlZCB0aGVtLiBUaGUgYW1vdW50IG9mXG4vLyBDU1MgcnVsZXMgZ2VuZXJhdGVkIGZvciBhIGdpdmVuIERPTSByb290IGlzIGJvdW5kZWQgYnkgdGhlIGFtb3VudFxuLy8gb2Ygc3R5bGUgbW9kdWxlcyB0aGF0IHdlcmUgdXNlZC4gU28gdG8gYXZvaWQgbGVha2luZyBydWxlcywgZG9uJ3Rcbi8vIGNyZWF0ZSB0aGVzZSBkeW5hbWljYWxseSwgYnV0IHRyZWF0IHRoZW0gYXMgb25lLXRpbWUgYWxsb2NhdGlvbnMuXG5leHBvcnQgY2xhc3MgU3R5bGVNb2R1bGUge1xuICAvLyA6OiAoT2JqZWN0PFN0eWxlPiwgP3tmaW5pc2g6ID8oc3RyaW5nKSBcdTIxOTIgc3RyaW5nfSlcbiAgLy8gQ3JlYXRlIGEgc3R5bGUgbW9kdWxlIGZyb20gdGhlIGdpdmVuIHNwZWMuXG4gIC8vXG4gIC8vIFdoZW4gYGZpbmlzaGAgaXMgZ2l2ZW4sIGl0IGlzIGNhbGxlZCBvbiByZWd1bGFyIChub24tYEBgKVxuICAvLyBzZWxlY3RvcnMgKGFmdGVyIGAmYCBleHBhbnNpb24pIHRvIGNvbXB1dGUgdGhlIGZpbmFsIHNlbGVjdG9yLlxuICBjb25zdHJ1Y3RvcihzcGVjLCBvcHRpb25zKSB7XG4gICAgdGhpcy5ydWxlcyA9IFtdXG4gICAgbGV0IHtmaW5pc2h9ID0gb3B0aW9ucyB8fCB7fVxuXG4gICAgZnVuY3Rpb24gc3BsaXRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIC9eQC8udGVzdChzZWxlY3RvcikgPyBbc2VsZWN0b3JdIDogc2VsZWN0b3Iuc3BsaXQoLyxcXHMqLylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW5kZXIoc2VsZWN0b3JzLCBzcGVjLCB0YXJnZXQsIGlzS2V5ZnJhbWVzKSB7XG4gICAgICBsZXQgbG9jYWwgPSBbXSwgaXNBdCA9IC9eQChcXHcrKVxcYi8uZXhlYyhzZWxlY3RvcnNbMF0pLCBrZXlmcmFtZXMgPSBpc0F0ICYmIGlzQXRbMV0gPT0gXCJrZXlmcmFtZXNcIlxuICAgICAgaWYgKGlzQXQgJiYgc3BlYyA9PSBudWxsKSByZXR1cm4gdGFyZ2V0LnB1c2goc2VsZWN0b3JzWzBdICsgXCI7XCIpXG4gICAgICBmb3IgKGxldCBwcm9wIGluIHNwZWMpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gc3BlY1twcm9wXVxuICAgICAgICBpZiAoLyYvLnRlc3QocHJvcCkpIHtcbiAgICAgICAgICByZW5kZXIocHJvcC5zcGxpdCgvLFxccyovKS5tYXAocGFydCA9PiBzZWxlY3RvcnMubWFwKHNlbCA9PiBwYXJ0LnJlcGxhY2UoLyYvLCBzZWwpKSkucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSksXG4gICAgICAgICAgICAgICAgIHZhbHVlLCB0YXJnZXQpXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBpZiAoIWlzQXQpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgKFwiICsgcHJvcCArIFwiKSBzaG91bGQgYmUgYSBwcmltaXRpdmUgdmFsdWUuXCIpXG4gICAgICAgICAgcmVuZGVyKHNwbGl0U2VsZWN0b3IocHJvcCksIHZhbHVlLCBsb2NhbCwga2V5ZnJhbWVzKVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBsb2NhbC5wdXNoKHByb3AucmVwbGFjZSgvXy4qLywgXCJcIikucmVwbGFjZSgvW0EtWl0vZywgbCA9PiBcIi1cIiArIGwudG9Mb3dlckNhc2UoKSkgKyBcIjogXCIgKyB2YWx1ZSArIFwiO1wiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG9jYWwubGVuZ3RoIHx8IGtleWZyYW1lcykge1xuICAgICAgICB0YXJnZXQucHVzaCgoZmluaXNoICYmICFpc0F0ICYmICFpc0tleWZyYW1lcyA/IHNlbGVjdG9ycy5tYXAoZmluaXNoKSA6IHNlbGVjdG9ycykuam9pbihcIiwgXCIpICtcbiAgICAgICAgICAgICAgICAgICAgXCIge1wiICsgbG9jYWwuam9pbihcIiBcIikgKyBcIn1cIilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBwcm9wIGluIHNwZWMpIHJlbmRlcihzcGxpdFNlbGVjdG9yKHByb3ApLCBzcGVjW3Byb3BdLCB0aGlzLnJ1bGVzKVxuICB9XG5cbiAgLy8gOjogKCkgXHUyMTkyIHN0cmluZ1xuICAvLyBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1vZHVsZSdzIENTUyBydWxlcy5cbiAgZ2V0UnVsZXMoKSB7IHJldHVybiB0aGlzLnJ1bGVzLmpvaW4oXCJcXG5cIikgfVxuXG4gIC8vIDo6ICgpIFx1MjE5MiBzdHJpbmdcbiAgLy8gR2VuZXJhdGUgYSBuZXcgdW5pcXVlIENTUyBjbGFzcyBuYW1lLlxuICBzdGF0aWMgbmV3TmFtZSgpIHtcbiAgICBsZXQgaWQgPSB0b3BbQ09VTlRdIHx8IDFcbiAgICB0b3BbQ09VTlRdID0gaWQgKyAxXG4gICAgcmV0dXJuIEMgKyBpZC50b1N0cmluZygzNilcbiAgfVxuXG4gIC8vIDo6ICh1bmlvbjxEb2N1bWVudCwgU2hhZG93Um9vdD4sIHVuaW9uPFtTdHlsZU1vZHVsZV0sIFN0eWxlTW9kdWxlPiwgP3tub25jZTogP3N0cmluZ30pXG4gIC8vXG4gIC8vIE1vdW50IHRoZSBnaXZlbiBzZXQgb2YgbW9kdWxlcyBpbiB0aGUgZ2l2ZW4gRE9NIHJvb3QsIHdoaWNoIGVuc3VyZXNcbiAgLy8gdGhhdCB0aGUgQ1NTIHJ1bGVzIGRlZmluZWQgYnkgdGhlIG1vZHVsZSBhcmUgYXZhaWxhYmxlIGluIHRoYXRcbiAgLy8gY29udGV4dC5cbiAgLy9cbiAgLy8gUnVsZXMgYXJlIG9ubHkgYWRkZWQgdG8gdGhlIGRvY3VtZW50IG9uY2UgcGVyIHJvb3QuXG4gIC8vXG4gIC8vIFJ1bGUgb3JkZXIgd2lsbCBmb2xsb3cgdGhlIG9yZGVyIG9mIHRoZSBtb2R1bGVzLCBzbyB0aGF0IHJ1bGVzIGZyb21cbiAgLy8gbW9kdWxlcyBsYXRlciBpbiB0aGUgYXJyYXkgdGFrZSBwcmVjZWRlbmNlIG9mIHRob3NlIGZyb20gZWFybGllclxuICAvLyBtb2R1bGVzLiBJZiB5b3UgY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZSByb290XG4gIC8vIGluIGEgd2F5IHRoYXQgY2hhbmdlcyB0aGUgb3JkZXIgb2YgYWxyZWFkeSBtb3VudGVkIG1vZHVsZXMsIHRoZSBvbGRcbiAgLy8gb3JkZXIgd2lsbCBiZSBjaGFuZ2VkLlxuICAvL1xuICAvLyBJZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IG5vbmNlIGlzIHByb3ZpZGVkLCBpdCBpcyBhZGRlZCB0b1xuICAvLyB0aGUgYDxzdHlsZT5gIHRhZyBnZW5lcmF0ZWQgYnkgdGhlIGxpYnJhcnkuXG4gIHN0YXRpYyBtb3VudChyb290LCBtb2R1bGVzLCBvcHRpb25zKSB7XG4gICAgbGV0IHNldCA9IHJvb3RbU0VUXSwgbm9uY2UgPSBvcHRpb25zICYmIG9wdGlvbnMubm9uY2VcbiAgICBpZiAoIXNldCkgc2V0ID0gbmV3IFN0eWxlU2V0KHJvb3QsIG5vbmNlKVxuICAgIGVsc2UgaWYgKG5vbmNlKSBzZXQuc2V0Tm9uY2Uobm9uY2UpXG4gICAgc2V0Lm1vdW50KEFycmF5LmlzQXJyYXkobW9kdWxlcykgPyBtb2R1bGVzIDogW21vZHVsZXNdLCByb290KVxuICB9XG59XG5cbmxldCBhZG9wdGVkU2V0ID0gbmV3IE1hcCAvLzxEb2N1bWVudCwgU3R5bGVTZXQ+XG5cbmNsYXNzIFN0eWxlU2V0IHtcbiAgY29uc3RydWN0b3Iocm9vdCwgbm9uY2UpIHtcbiAgICBsZXQgZG9jID0gcm9vdC5vd25lckRvY3VtZW50IHx8IHJvb3QsIHdpbiA9IGRvYy5kZWZhdWx0Vmlld1xuICAgIGlmICghcm9vdC5oZWFkICYmIHJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzICYmIHdpbi5DU1NTdHlsZVNoZWV0KSB7XG4gICAgICBsZXQgYWRvcHRlZCA9IGFkb3B0ZWRTZXQuZ2V0KGRvYylcbiAgICAgIGlmIChhZG9wdGVkKSByZXR1cm4gcm9vdFtTRVRdID0gYWRvcHRlZFxuICAgICAgdGhpcy5zaGVldCA9IG5ldyB3aW4uQ1NTU3R5bGVTaGVldFxuICAgICAgYWRvcHRlZFNldC5zZXQoZG9jLCB0aGlzKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0eWxlVGFnID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKVxuICAgICAgaWYgKG5vbmNlKSB0aGlzLnN0eWxlVGFnLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKVxuICAgIH1cbiAgICB0aGlzLm1vZHVsZXMgPSBbXVxuICAgIHJvb3RbU0VUXSA9IHRoaXNcbiAgfVxuXG4gIG1vdW50KG1vZHVsZXMsIHJvb3QpIHtcbiAgICBsZXQgc2hlZXQgPSB0aGlzLnNoZWV0XG4gICAgbGV0IHBvcyA9IDAgLyogQ3VycmVudCBydWxlIG9mZnNldCAqLywgaiA9IDAgLyogSW5kZXggaW50byB0aGlzLm1vZHVsZXMgKi9cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBtb2QgPSBtb2R1bGVzW2ldLCBpbmRleCA9IHRoaXMubW9kdWxlcy5pbmRleE9mKG1vZClcbiAgICAgIGlmIChpbmRleCA8IGogJiYgaW5kZXggPiAtMSkgeyAvLyBPcmRlcmluZyBjb25mbGljdFxuICAgICAgICB0aGlzLm1vZHVsZXMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICBqLS1cbiAgICAgICAgaW5kZXggPSAtMVxuICAgICAgfVxuICAgICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICAgIHRoaXMubW9kdWxlcy5zcGxpY2UoaisrLCAwLCBtb2QpXG4gICAgICAgIGlmIChzaGVldCkgZm9yIChsZXQgayA9IDA7IGsgPCBtb2QucnVsZXMubGVuZ3RoOyBrKyspXG4gICAgICAgICAgc2hlZXQuaW5zZXJ0UnVsZShtb2QucnVsZXNba10sIHBvcysrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKGogPCBpbmRleCkgcG9zICs9IHRoaXMubW9kdWxlc1tqKytdLnJ1bGVzLmxlbmd0aFxuICAgICAgICBwb3MgKz0gbW9kLnJ1bGVzLmxlbmd0aFxuICAgICAgICBqKytcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hlZXQpIHtcbiAgICAgIGlmIChyb290LmFkb3B0ZWRTdHlsZVNoZWV0cy5pbmRleE9mKHRoaXMuc2hlZXQpIDwgMClcbiAgICAgICAgcm9vdC5hZG9wdGVkU3R5bGVTaGVldHMgPSBbdGhpcy5zaGVldCwgLi4ucm9vdC5hZG9wdGVkU3R5bGVTaGVldHNdXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB0ZXh0ID0gXCJcIlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1vZHVsZXMubGVuZ3RoOyBpKyspXG4gICAgICAgIHRleHQgKz0gdGhpcy5tb2R1bGVzW2ldLmdldFJ1bGVzKCkgKyBcIlxcblwiXG4gICAgICB0aGlzLnN0eWxlVGFnLnRleHRDb250ZW50ID0gdGV4dFxuICAgICAgbGV0IHRhcmdldCA9IHJvb3QuaGVhZCB8fCByb290XG4gICAgICBpZiAodGhpcy5zdHlsZVRhZy5wYXJlbnROb2RlICE9IHRhcmdldClcbiAgICAgICAgdGFyZ2V0Lmluc2VydEJlZm9yZSh0aGlzLnN0eWxlVGFnLCB0YXJnZXQuZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICBzZXROb25jZShub25jZSkge1xuICAgIGlmICh0aGlzLnN0eWxlVGFnICYmIHRoaXMuc3R5bGVUYWcuZ2V0QXR0cmlidXRlKFwibm9uY2VcIikgIT0gbm9uY2UpXG4gICAgICB0aGlzLnN0eWxlVGFnLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKVxuICB9XG59XG5cbi8vIFN0eWxlOjpPYmplY3Q8dW5pb248U3R5bGUsc3RyaW5nPj5cbi8vXG4vLyBBIHN0eWxlIGlzIGFuIG9iamVjdCB0aGF0LCBpbiB0aGUgc2ltcGxlIGNhc2UsIG1hcHMgQ1NTIHByb3BlcnR5XG4vLyBuYW1lcyB0byBzdHJpbmdzIGhvbGRpbmcgdGhlaXIgdmFsdWVzLCBhcyBpbiBge2NvbG9yOiBcInJlZFwiLFxuLy8gZm9udFdlaWdodDogXCJib2xkXCJ9YC4gVGhlIHByb3BlcnR5IG5hbWVzIGNhbiBiZSBnaXZlbiBpblxuLy8gY2FtZWwtY2FzZVx1MjAxNHRoZSBsaWJyYXJ5IHdpbGwgaW5zZXJ0IGEgZGFzaCBiZWZvcmUgY2FwaXRhbCBsZXR0ZXJzXG4vLyB3aGVuIGNvbnZlcnRpbmcgdGhlbSB0byBDU1MuXG4vL1xuLy8gSWYgeW91IGluY2x1ZGUgYW4gdW5kZXJzY29yZSBpbiBhIHByb3BlcnR5IG5hbWUsIGl0IGFuZCBldmVyeXRoaW5nXG4vLyBhZnRlciBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0LCB3aGljaCBjYW4gYmUgdXNlZnVsIHdoZW5cbi8vIHByb3ZpZGluZyBhIHByb3BlcnR5IG11bHRpcGxlIHRpbWVzLCBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4vLyByZWFzb25zLlxuLy9cbi8vIEEgcHJvcGVydHkgaW4gYSBzdHlsZSBvYmplY3QgY2FuIGFsc28gYmUgYSBzdWItc2VsZWN0b3IsIHdoaWNoXG4vLyBleHRlbmRzIHRoZSBjdXJyZW50IGNvbnRleHQgdG8gYWRkIGEgcHNldWRvLXNlbGVjdG9yIG9yIGEgY2hpbGRcbi8vIHNlbGVjdG9yLiBTdWNoIGEgcHJvcGVydHkgc2hvdWxkIGNvbnRhaW4gYSBgJmAgY2hhcmFjdGVyLCB3aGljaFxuLy8gd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgY3VycmVudCBzZWxlY3Rvci4gRm9yIGV4YW1wbGUgYHtcIiY6YmVmb3JlXCI6XG4vLyB7Y29udGVudDogJ1wiaGlcIid9fWAuIFN1Yi1zZWxlY3RvcnMgYW5kIHJlZ3VsYXIgcHJvcGVydGllcyBjYW5cbi8vIGZyZWVseSBiZSBtaXhlZCBpbiBhIGdpdmVuIG9iamVjdC4gQW55IHByb3BlcnR5IGNvbnRhaW5pbmcgYSBgJmAgaXNcbi8vIGFzc3VtZWQgdG8gYmUgYSBzdWItc2VsZWN0b3IuXG4vL1xuLy8gRmluYWxseSwgYSBwcm9wZXJ0eSBjYW4gc3BlY2lmeSBhbiBALWJsb2NrIHRvIGJlIHdyYXBwZWQgYXJvdW5kIHRoZVxuLy8gc3R5bGVzIGRlZmluZWQgaW5zaWRlIHRoZSBvYmplY3QgdGhhdCdzIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLiBGb3Jcbi8vIGV4YW1wbGUgdG8gY3JlYXRlIGEgbWVkaWEgcXVlcnkgeW91IGNhbiBkbyBge1wiQG1lZGlhIHNjcmVlbiBhbmRcbi8vIChtaW4td2lkdGg6IDQwMHB4KVwiOiB7Li4ufX1gLlxuIiwgImV4cG9ydCB2YXIgYmFzZSA9IHtcbiAgODogXCJCYWNrc3BhY2VcIixcbiAgOTogXCJUYWJcIixcbiAgMTA6IFwiRW50ZXJcIixcbiAgMTI6IFwiTnVtTG9ja1wiLFxuICAxMzogXCJFbnRlclwiLFxuICAxNjogXCJTaGlmdFwiLFxuICAxNzogXCJDb250cm9sXCIsXG4gIDE4OiBcIkFsdFwiLFxuICAyMDogXCJDYXBzTG9ja1wiLFxuICAyNzogXCJFc2NhcGVcIixcbiAgMzI6IFwiIFwiLFxuICAzMzogXCJQYWdlVXBcIixcbiAgMzQ6IFwiUGFnZURvd25cIixcbiAgMzU6IFwiRW5kXCIsXG4gIDM2OiBcIkhvbWVcIixcbiAgMzc6IFwiQXJyb3dMZWZ0XCIsXG4gIDM4OiBcIkFycm93VXBcIixcbiAgMzk6IFwiQXJyb3dSaWdodFwiLFxuICA0MDogXCJBcnJvd0Rvd25cIixcbiAgNDQ6IFwiUHJpbnRTY3JlZW5cIixcbiAgNDU6IFwiSW5zZXJ0XCIsXG4gIDQ2OiBcIkRlbGV0ZVwiLFxuICA1OTogXCI7XCIsXG4gIDYxOiBcIj1cIixcbiAgOTE6IFwiTWV0YVwiLFxuICA5MjogXCJNZXRhXCIsXG4gIDEwNjogXCIqXCIsXG4gIDEwNzogXCIrXCIsXG4gIDEwODogXCIsXCIsXG4gIDEwOTogXCItXCIsXG4gIDExMDogXCIuXCIsXG4gIDExMTogXCIvXCIsXG4gIDE0NDogXCJOdW1Mb2NrXCIsXG4gIDE0NTogXCJTY3JvbGxMb2NrXCIsXG4gIDE2MDogXCJTaGlmdFwiLFxuICAxNjE6IFwiU2hpZnRcIixcbiAgMTYyOiBcIkNvbnRyb2xcIixcbiAgMTYzOiBcIkNvbnRyb2xcIixcbiAgMTY0OiBcIkFsdFwiLFxuICAxNjU6IFwiQWx0XCIsXG4gIDE3MzogXCItXCIsXG4gIDE4NjogXCI7XCIsXG4gIDE4NzogXCI9XCIsXG4gIDE4ODogXCIsXCIsXG4gIDE4OTogXCItXCIsXG4gIDE5MDogXCIuXCIsXG4gIDE5MTogXCIvXCIsXG4gIDE5MjogXCJgXCIsXG4gIDIxOTogXCJbXCIsXG4gIDIyMDogXCJcXFxcXCIsXG4gIDIyMTogXCJdXCIsXG4gIDIyMjogXCInXCJcbn1cblxuZXhwb3J0IHZhciBzaGlmdCA9IHtcbiAgNDg6IFwiKVwiLFxuICA0OTogXCIhXCIsXG4gIDUwOiBcIkBcIixcbiAgNTE6IFwiI1wiLFxuICA1MjogXCIkXCIsXG4gIDUzOiBcIiVcIixcbiAgNTQ6IFwiXlwiLFxuICA1NTogXCImXCIsXG4gIDU2OiBcIipcIixcbiAgNTc6IFwiKFwiLFxuICA1OTogXCI6XCIsXG4gIDYxOiBcIitcIixcbiAgMTczOiBcIl9cIixcbiAgMTg2OiBcIjpcIixcbiAgMTg3OiBcIitcIixcbiAgMTg4OiBcIjxcIixcbiAgMTg5OiBcIl9cIixcbiAgMTkwOiBcIj5cIixcbiAgMTkxOiBcIj9cIixcbiAgMTkyOiBcIn5cIixcbiAgMjE5OiBcIntcIixcbiAgMjIwOiBcInxcIixcbiAgMjIxOiBcIn1cIixcbiAgMjIyOiBcIlxcXCJcIlxufVxuXG52YXIgbWFjID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmIC9NYWMvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxudmFyIGllID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmIC9NU0lFIFxcZHxUcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KVxuXG4vLyBGaWxsIGluIHRoZSBkaWdpdCBrZXlzXG5mb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIGJhc2VbNDggKyBpXSA9IGJhc2VbOTYgKyBpXSA9IFN0cmluZyhpKVxuXG4vLyBUaGUgZnVuY3Rpb24ga2V5c1xuZm9yICh2YXIgaSA9IDE7IGkgPD0gMjQ7IGkrKykgYmFzZVtpICsgMTExXSA9IFwiRlwiICsgaVxuXG4vLyBBbmQgdGhlIGFscGhhYmV0aWMga2V5c1xuZm9yICh2YXIgaSA9IDY1OyBpIDw9IDkwOyBpKyspIHtcbiAgYmFzZVtpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSArIDMyKVxuICBzaGlmdFtpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSlcbn1cblxuLy8gRm9yIGVhY2ggY29kZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHNoaWZ0LWVxdWl2YWxlbnQsIGNvcHkgdGhlIGJhc2UgbmFtZVxuZm9yICh2YXIgY29kZSBpbiBiYXNlKSBpZiAoIXNoaWZ0Lmhhc093blByb3BlcnR5KGNvZGUpKSBzaGlmdFtjb2RlXSA9IGJhc2VbY29kZV1cblxuZXhwb3J0IGZ1bmN0aW9uIGtleU5hbWUoZXZlbnQpIHtcbiAgLy8gT24gbWFjT1MsIGtleXMgaGVsZCB3aXRoIFNoaWZ0IGFuZCBDbWQgZG9uJ3QgcmVmbGVjdCB0aGUgZWZmZWN0IG9mIFNoaWZ0IGluIGAua2V5YC5cbiAgLy8gT24gSUUsIHNoaWZ0IGVmZmVjdCBpcyBuZXZlciBpbmNsdWRlZCBpbiBgLmtleWAuXG4gIHZhciBpZ25vcmVLZXkgPSBtYWMgJiYgZXZlbnQubWV0YUtleSAmJiBldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5IHx8XG4gICAgICBpZSAmJiBldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXkgJiYgZXZlbnQua2V5Lmxlbmd0aCA9PSAxIHx8XG4gICAgICBldmVudC5rZXkgPT0gXCJVbmlkZW50aWZpZWRcIlxuICB2YXIgbmFtZSA9ICghaWdub3JlS2V5ICYmIGV2ZW50LmtleSkgfHxcbiAgICAoZXZlbnQuc2hpZnRLZXkgPyBzaGlmdCA6IGJhc2UpW2V2ZW50LmtleUNvZGVdIHx8XG4gICAgZXZlbnQua2V5IHx8IFwiVW5pZGVudGlmaWVkXCJcbiAgLy8gRWRnZSBzb21ldGltZXMgcHJvZHVjZXMgd3JvbmcgbmFtZXMgKElzc3VlICMzKVxuICBpZiAobmFtZSA9PSBcIkVzY1wiKSBuYW1lID0gXCJFc2NhcGVcIlxuICBpZiAobmFtZSA9PSBcIkRlbFwiKSBuYW1lID0gXCJEZWxldGVcIlxuICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy84ODYwNTcxL1xuICBpZiAobmFtZSA9PSBcIkxlZnRcIikgbmFtZSA9IFwiQXJyb3dMZWZ0XCJcbiAgaWYgKG5hbWUgPT0gXCJVcFwiKSBuYW1lID0gXCJBcnJvd1VwXCJcbiAgaWYgKG5hbWUgPT0gXCJSaWdodFwiKSBuYW1lID0gXCJBcnJvd1JpZ2h0XCJcbiAgaWYgKG5hbWUgPT0gXCJEb3duXCIpIG5hbWUgPSBcIkFycm93RG93blwiXG4gIHJldHVybiBuYW1lXG59XG4iLCAiaW1wb3J0IHsgVGV4dCwgUmFuZ2VTZXQsIE1hcE1vZGUsIFJhbmdlVmFsdWUsIGZpbmRDbHVzdGVyQnJlYWssIEVkaXRvclNlbGVjdGlvbiwgRmFjZXQsIFN0YXRlRWZmZWN0LCBDaGFuZ2VTZXQsIGZpbmRDb2x1bW4sIENoYXJDYXRlZ29yeSwgRWRpdG9yU3RhdGUsIEFubm90YXRpb24sIFRyYW5zYWN0aW9uLCBQcmVjLCBjb2RlUG9pbnRBdCwgY29kZVBvaW50U2l6ZSwgY29tYmluZUNvbmZpZywgU3RhdGVGaWVsZCwgUmFuZ2VTZXRCdWlsZGVyLCBjb3VudENvbHVtbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IFN0eWxlTW9kdWxlIH0gZnJvbSAnc3R5bGUtbW9kJztcbmltcG9ydCB7IGtleU5hbWUsIGJhc2UsIHNoaWZ0IH0gZnJvbSAndzNjLWtleW5hbWUnO1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24ocm9vdCkge1xuICAgIGxldCB0YXJnZXQ7XG4gICAgLy8gQnJvd3NlcnMgZGlmZmVyIG9uIHdoZXRoZXIgc2hhZG93IHJvb3RzIGhhdmUgYSBnZXRTZWxlY3Rpb25cbiAgICAvLyBtZXRob2QuIElmIGl0IGV4aXN0cywgdXNlIHRoYXQsIG90aGVyd2lzZSwgY2FsbCBpdCBvbiB0aGVcbiAgICAvLyBkb2N1bWVudC5cbiAgICBpZiAocm9vdC5ub2RlVHlwZSA9PSAxMSkgeyAvLyBTaGFkb3cgcm9vdFxuICAgICAgICB0YXJnZXQgPSByb290LmdldFNlbGVjdGlvbiA/IHJvb3QgOiByb290Lm93bmVyRG9jdW1lbnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSByb290O1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0LmdldFNlbGVjdGlvbigpO1xufVxuZnVuY3Rpb24gY29udGFpbnMoZG9tLCBub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgPyBkb20gPT0gbm9kZSB8fCBkb20uY29udGFpbnMobm9kZS5ub2RlVHlwZSAhPSAxID8gbm9kZS5wYXJlbnROb2RlIDogbm9kZSkgOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhc1NlbGVjdGlvbihkb20sIHNlbGVjdGlvbikge1xuICAgIGlmICghc2VsZWN0aW9uLmFuY2hvck5vZGUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICAvLyBGaXJlZm94IHdpbGwgcmFpc2UgJ3Blcm1pc3Npb24gZGVuaWVkJyBlcnJvcnMgd2hlbiBhY2Nlc3NpbmdcbiAgICAgICAgLy8gcHJvcGVydGllcyBvZiBgc2VsLmFuY2hvck5vZGVgIHdoZW4gaXQncyBpbiBhIGdlbmVyYXRlZCBDU1NcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zKGRvbSwgc2VsZWN0aW9uLmFuY2hvck5vZGUpO1xuICAgIH1cbiAgICBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gY2xpZW50UmVjdHNGb3IoZG9tKSB7XG4gICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICByZXR1cm4gdGV4dFJhbmdlKGRvbSwgMCwgZG9tLm5vZGVWYWx1ZS5sZW5ndGgpLmdldENsaWVudFJlY3RzKCk7XG4gICAgZWxzZSBpZiAoZG9tLm5vZGVUeXBlID09IDEpXG4gICAgICAgIHJldHVybiBkb20uZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBbXTtcbn1cbi8vIFNjYW5zIGZvcndhcmQgYW5kIGJhY2t3YXJkIHRocm91Z2ggRE9NIHBvc2l0aW9ucyBlcXVpdmFsZW50IHRvIHRoZVxuLy8gZ2l2ZW4gb25lIHRvIHNlZSBpZiB0aGUgdHdvIGFyZSBpbiB0aGUgc2FtZSBwbGFjZSAoaS5lLiBhZnRlciBhXG4vLyB0ZXh0IG5vZGUgdnMgYXQgdGhlIGVuZCBvZiB0aGF0IHRleHQgbm9kZSlcbmZ1bmN0aW9uIGlzRXF1aXZhbGVudFBvc2l0aW9uKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmKSB7XG4gICAgcmV0dXJuIHRhcmdldE5vZGUgPyAoc2NhbkZvcihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZiwgLTEpIHx8XG4gICAgICAgIHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIDEpKSA6IGZhbHNlO1xufVxuZnVuY3Rpb24gZG9tSW5kZXgobm9kZSkge1xuICAgIGZvciAodmFyIGluZGV4ID0gMDs7IGluZGV4KyspIHtcbiAgICAgICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNCbG9ja0VsZW1lbnQobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09IDEgJiYgL14oRElWfFB8TEl8VUx8T0x8QkxPQ0tRVU9URXxERHxEVHxIXFxkfFNFQ1RJT058UFJFKSQvLnRlc3Qobm9kZS5ub2RlTmFtZSk7XG59XG5mdW5jdGlvbiBzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCBkaXIpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChub2RlID09IHRhcmdldE5vZGUgJiYgb2ZmID09IHRhcmdldE9mZilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAob2ZmID09IChkaXIgPCAwID8gMCA6IG1heE9mZnNldChub2RlKSkpIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IFwiRElWXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5ub2RlVHlwZSAhPSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIG9mZiA9IGRvbUluZGV4KG5vZGUpICsgKGRpciA8IDAgPyAwIDogMSk7XG4gICAgICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmYgKyAoZGlyIDwgMCA/IC0xIDogMCldO1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBub2RlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgb2ZmID0gZGlyIDwgMCA/IG1heE9mZnNldChub2RlKSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBtYXhPZmZzZXQobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09IDMgPyBub2RlLm5vZGVWYWx1ZS5sZW5ndGggOiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xufVxuZnVuY3Rpb24gZmxhdHRlblJlY3QocmVjdCwgbGVmdCkge1xuICAgIGxldCB4ID0gbGVmdCA/IHJlY3QubGVmdCA6IHJlY3QucmlnaHQ7XG4gICAgcmV0dXJuIHsgbGVmdDogeCwgcmlnaHQ6IHgsIHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC5ib3R0b20gfTtcbn1cbmZ1bmN0aW9uIHdpbmRvd1JlY3Qod2luKSB7XG4gICAgbGV0IHZwID0gd2luLnZpc3VhbFZpZXdwb3J0O1xuICAgIGlmICh2cClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IDAsIHJpZ2h0OiB2cC53aWR0aCxcbiAgICAgICAgICAgIHRvcDogMCwgYm90dG9tOiB2cC5oZWlnaHRcbiAgICAgICAgfTtcbiAgICByZXR1cm4geyBsZWZ0OiAwLCByaWdodDogd2luLmlubmVyV2lkdGgsXG4gICAgICAgIHRvcDogMCwgYm90dG9tOiB3aW4uaW5uZXJIZWlnaHQgfTtcbn1cbmZ1bmN0aW9uIGdldFNjYWxlKGVsdCwgcmVjdCkge1xuICAgIGxldCBzY2FsZVggPSByZWN0LndpZHRoIC8gZWx0Lm9mZnNldFdpZHRoO1xuICAgIGxldCBzY2FsZVkgPSByZWN0LmhlaWdodCAvIGVsdC5vZmZzZXRIZWlnaHQ7XG4gICAgaWYgKHNjYWxlWCA+IDAuOTk1ICYmIHNjYWxlWCA8IDEuMDA1IHx8ICFpc0Zpbml0ZShzY2FsZVgpIHx8IE1hdGguYWJzKHJlY3Qud2lkdGggLSBlbHQub2Zmc2V0V2lkdGgpIDwgMSlcbiAgICAgICAgc2NhbGVYID0gMTtcbiAgICBpZiAoc2NhbGVZID4gMC45OTUgJiYgc2NhbGVZIDwgMS4wMDUgfHwgIWlzRmluaXRlKHNjYWxlWSkgfHwgTWF0aC5hYnMocmVjdC5oZWlnaHQgLSBlbHQub2Zmc2V0SGVpZ2h0KSA8IDEpXG4gICAgICAgIHNjYWxlWSA9IDE7XG4gICAgcmV0dXJuIHsgc2NhbGVYLCBzY2FsZVkgfTtcbn1cbmZ1bmN0aW9uIHNjcm9sbFJlY3RJbnRvVmlldyhkb20sIHJlY3QsIHNpZGUsIHgsIHksIHhNYXJnaW4sIHlNYXJnaW4sIGx0cikge1xuICAgIGxldCBkb2MgPSBkb20ub3duZXJEb2N1bWVudCwgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICBmb3IgKGxldCBjdXIgPSBkb20sIHN0b3AgPSBmYWxzZTsgY3VyICYmICFzdG9wOykge1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09IDEpIHsgLy8gRWxlbWVudFxuICAgICAgICAgICAgbGV0IGJvdW5kaW5nLCB0b3AgPSBjdXIgPT0gZG9jLmJvZHk7XG4gICAgICAgICAgICBsZXQgc2NhbGVYID0gMSwgc2NhbGVZID0gMTtcbiAgICAgICAgICAgIGlmICh0b3ApIHtcbiAgICAgICAgICAgICAgICBib3VuZGluZyA9IHdpbmRvd1JlY3Qod2luKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICgvXihmaXhlZHxzdGlja3kpJC8udGVzdChnZXRDb21wdXRlZFN0eWxlKGN1cikucG9zaXRpb24pKVxuICAgICAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY3VyLnNjcm9sbEhlaWdodCA8PSBjdXIuY2xpZW50SGVpZ2h0ICYmIGN1ci5zY3JvbGxXaWR0aCA8PSBjdXIuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZWN0ID0gY3VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICh7IHNjYWxlWCwgc2NhbGVZIH0gPSBnZXRTY2FsZShjdXIsIHJlY3QpKTtcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgc2Nyb2xsYmFyIHdpZHRoIGlzbid0IGluY2x1ZGVkIGluIHRoZSByZWN0YW5nbGVcbiAgICAgICAgICAgICAgICBib3VuZGluZyA9IHsgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5sZWZ0ICsgY3VyLmNsaWVudFdpZHRoICogc2NhbGVYLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IHJlY3QudG9wLCBib3R0b206IHJlY3QudG9wICsgY3VyLmNsaWVudEhlaWdodCAqIHNjYWxlWSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG1vdmVYID0gMCwgbW92ZVkgPSAwO1xuICAgICAgICAgICAgaWYgKHkgPT0gXCJuZWFyZXN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVjdC50b3AgPCBib3VuZGluZy50b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVkgPSByZWN0LnRvcCAtIChib3VuZGluZy50b3AgKyB5TWFyZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpZGUgPiAwICYmIHJlY3QuYm90dG9tID4gYm91bmRpbmcuYm90dG9tICsgbW92ZVkpXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlWSA9IHJlY3QuYm90dG9tIC0gYm91bmRpbmcuYm90dG9tICsgeU1hcmdpbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVjdC5ib3R0b20gPiBib3VuZGluZy5ib3R0b20pIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVkgPSByZWN0LmJvdHRvbSAtIGJvdW5kaW5nLmJvdHRvbSArIHlNYXJnaW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlIDwgMCAmJiAocmVjdC50b3AgLSBtb3ZlWSkgPCBib3VuZGluZy50b3ApXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlWSA9IHJlY3QudG9wIC0gKGJvdW5kaW5nLnRvcCArIHlNYXJnaW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByZWN0SGVpZ2h0ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcCwgYm91bmRpbmdIZWlnaHQgPSBib3VuZGluZy5ib3R0b20gLSBib3VuZGluZy50b3A7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldFRvcCA9IHkgPT0gXCJjZW50ZXJcIiAmJiByZWN0SGVpZ2h0IDw9IGJvdW5kaW5nSGVpZ2h0ID8gcmVjdC50b3AgKyByZWN0SGVpZ2h0IC8gMiAtIGJvdW5kaW5nSGVpZ2h0IC8gMiA6XG4gICAgICAgICAgICAgICAgICAgIHkgPT0gXCJzdGFydFwiIHx8IHkgPT0gXCJjZW50ZXJcIiAmJiBzaWRlIDwgMCA/IHJlY3QudG9wIC0geU1hcmdpbiA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSAtIGJvdW5kaW5nSGVpZ2h0ICsgeU1hcmdpbjtcbiAgICAgICAgICAgICAgICBtb3ZlWSA9IHRhcmdldFRvcCAtIGJvdW5kaW5nLnRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh4ID09IFwibmVhcmVzdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlY3QubGVmdCA8IGJvdW5kaW5nLmxlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVggPSByZWN0LmxlZnQgLSAoYm91bmRpbmcubGVmdCArIHhNYXJnaW4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lkZSA+IDAgJiYgcmVjdC5yaWdodCA+IGJvdW5kaW5nLnJpZ2h0ICsgbW92ZVgpXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlWCA9IHJlY3QucmlnaHQgLSBib3VuZGluZy5yaWdodCArIHhNYXJnaW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlY3QucmlnaHQgPiBib3VuZGluZy5yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBtb3ZlWCA9IHJlY3QucmlnaHQgLSBib3VuZGluZy5yaWdodCArIHhNYXJnaW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlIDwgMCAmJiByZWN0LmxlZnQgPCBib3VuZGluZy5sZWZ0ICsgbW92ZVgpXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlWCA9IHJlY3QubGVmdCAtIChib3VuZGluZy5sZWZ0ICsgeE1hcmdpbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldExlZnQgPSB4ID09IFwiY2VudGVyXCIgPyByZWN0LmxlZnQgKyAocmVjdC5yaWdodCAtIHJlY3QubGVmdCkgLyAyIC0gKGJvdW5kaW5nLnJpZ2h0IC0gYm91bmRpbmcubGVmdCkgLyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHggPT0gXCJzdGFydFwiKSA9PSBsdHIgPyByZWN0LmxlZnQgLSB4TWFyZ2luIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgLSAoYm91bmRpbmcucmlnaHQgLSBib3VuZGluZy5sZWZ0KSArIHhNYXJnaW47XG4gICAgICAgICAgICAgICAgbW92ZVggPSB0YXJnZXRMZWZ0IC0gYm91bmRpbmcubGVmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb3ZlWCB8fCBtb3ZlWSkge1xuICAgICAgICAgICAgICAgIGlmICh0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgd2luLnNjcm9sbEJ5KG1vdmVYLCBtb3ZlWSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbW92ZWRYID0gMCwgbW92ZWRZID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBjdXIuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyLnNjcm9sbFRvcCArPSBtb3ZlWSAvIHNjYWxlWTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkWSA9IChjdXIuc2Nyb2xsVG9wIC0gc3RhcnQpICogc2NhbGVZO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gY3VyLnNjcm9sbExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXIuc2Nyb2xsTGVmdCArPSBtb3ZlWCAvIHNjYWxlWDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkWCA9IChjdXIuc2Nyb2xsTGVmdCAtIHN0YXJ0KSAqIHNjYWxlWDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZWN0ID0geyBsZWZ0OiByZWN0LmxlZnQgLSBtb3ZlZFgsIHRvcDogcmVjdC50b3AgLSBtb3ZlZFksXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodDogcmVjdC5yaWdodCAtIG1vdmVkWCwgYm90dG9tOiByZWN0LmJvdHRvbSAtIG1vdmVkWSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAobW92ZWRYICYmIE1hdGguYWJzKG1vdmVkWCAtIG1vdmVYKSA8IDEpXG4gICAgICAgICAgICAgICAgICAgICAgICB4ID0gXCJuZWFyZXN0XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlZFkgJiYgTWF0aC5hYnMobW92ZWRZIC0gbW92ZVkpIDwgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBcIm5lYXJlc3RcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9wKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKHJlY3QudG9wIDwgYm91bmRpbmcudG9wIHx8IHJlY3QuYm90dG9tID4gYm91bmRpbmcuYm90dG9tIHx8XG4gICAgICAgICAgICAgICAgcmVjdC5sZWZ0IDwgYm91bmRpbmcubGVmdCB8fCByZWN0LnJpZ2h0ID4gYm91bmRpbmcucmlnaHQpXG4gICAgICAgICAgICAgICAgcmVjdCA9IHsgbGVmdDogTWF0aC5tYXgocmVjdC5sZWZ0LCBib3VuZGluZy5sZWZ0KSwgcmlnaHQ6IE1hdGgubWluKHJlY3QucmlnaHQsIGJvdW5kaW5nLnJpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBNYXRoLm1heChyZWN0LnRvcCwgYm91bmRpbmcudG9wKSwgYm90dG9tOiBNYXRoLm1pbihyZWN0LmJvdHRvbSwgYm91bmRpbmcuYm90dG9tKSB9O1xuICAgICAgICAgICAgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXIubm9kZVR5cGUgPT0gMTEpIHsgLy8gQSBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgY3VyID0gY3VyLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNjcm9sbGFibGVQYXJlbnRzKGRvbSkge1xuICAgIGxldCBkb2MgPSBkb20ub3duZXJEb2N1bWVudCwgeCwgeTtcbiAgICBmb3IgKGxldCBjdXIgPSBkb20ucGFyZW50Tm9kZTsgY3VyOykge1xuICAgICAgICBpZiAoY3VyID09IGRvYy5ib2R5IHx8ICh4ICYmIHkpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXIubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgaWYgKCF5ICYmIGN1ci5zY3JvbGxIZWlnaHQgPiBjdXIuY2xpZW50SGVpZ2h0KVxuICAgICAgICAgICAgICAgIHkgPSBjdXI7XG4gICAgICAgICAgICBpZiAoIXggJiYgY3VyLnNjcm9sbFdpZHRoID4gY3VyLmNsaWVudFdpZHRoKVxuICAgICAgICAgICAgICAgIHggPSBjdXI7XG4gICAgICAgICAgICBjdXIgPSBjdXIuYXNzaWduZWRTbG90IHx8IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1ci5ub2RlVHlwZSA9PSAxMSkge1xuICAgICAgICAgICAgY3VyID0gY3VyLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB4LCB5IH07XG59XG5jbGFzcyBET01TZWxlY3Rpb25TdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuYW5jaG9yT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5mb2N1c05vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmZvY3VzT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgZXEoZG9tU2VsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuY2hvck5vZGUgPT0gZG9tU2VsLmFuY2hvck5vZGUgJiYgdGhpcy5hbmNob3JPZmZzZXQgPT0gZG9tU2VsLmFuY2hvck9mZnNldCAmJlxuICAgICAgICAgICAgdGhpcy5mb2N1c05vZGUgPT0gZG9tU2VsLmZvY3VzTm9kZSAmJiB0aGlzLmZvY3VzT2Zmc2V0ID09IGRvbVNlbC5mb2N1c09mZnNldDtcbiAgICB9XG4gICAgc2V0UmFuZ2UocmFuZ2UpIHtcbiAgICAgICAgbGV0IHsgYW5jaG9yTm9kZSwgZm9jdXNOb2RlIH0gPSByYW5nZTtcbiAgICAgICAgLy8gQ2xpcCBvZmZzZXRzIHRvIG5vZGUgc2l6ZSB0byBhdm9pZCBjcmFzaGVzIHdoZW4gU2FmYXJpIHJlcG9ydHMgYm9ndXMgb2Zmc2V0cyAoIzExNTIpXG4gICAgICAgIHRoaXMuc2V0KGFuY2hvck5vZGUsIE1hdGgubWluKHJhbmdlLmFuY2hvck9mZnNldCwgYW5jaG9yTm9kZSA/IG1heE9mZnNldChhbmNob3JOb2RlKSA6IDApLCBmb2N1c05vZGUsIE1hdGgubWluKHJhbmdlLmZvY3VzT2Zmc2V0LCBmb2N1c05vZGUgPyBtYXhPZmZzZXQoZm9jdXNOb2RlKSA6IDApKTtcbiAgICB9XG4gICAgc2V0KGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkge1xuICAgICAgICB0aGlzLmFuY2hvck5vZGUgPSBhbmNob3JOb2RlO1xuICAgICAgICB0aGlzLmFuY2hvck9mZnNldCA9IGFuY2hvck9mZnNldDtcbiAgICAgICAgdGhpcy5mb2N1c05vZGUgPSBmb2N1c05vZGU7XG4gICAgICAgIHRoaXMuZm9jdXNPZmZzZXQgPSBmb2N1c09mZnNldDtcbiAgICB9XG59XG5sZXQgcHJldmVudFNjcm9sbFN1cHBvcnRlZCA9IG51bGw7XG4vLyBGZWF0dXJlLWRldGVjdHMgc3VwcG9ydCBmb3IgLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiB0cnVlfSksIGFuZCB1c2VzXG4vLyBhIGZhbGxiYWNrIGtsdWRnZSB3aGVuIG5vdCBzdXBwb3J0ZWQuXG5mdW5jdGlvbiBmb2N1c1ByZXZlbnRTY3JvbGwoZG9tKSB7XG4gICAgaWYgKGRvbS5zZXRBY3RpdmUpXG4gICAgICAgIHJldHVybiBkb20uc2V0QWN0aXZlKCk7IC8vIGluIElFXG4gICAgaWYgKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQpXG4gICAgICAgIHJldHVybiBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCk7XG4gICAgbGV0IHN0YWNrID0gW107XG4gICAgZm9yIChsZXQgY3VyID0gZG9tOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlKSB7XG4gICAgICAgIHN0YWNrLnB1c2goY3VyLCBjdXIuc2Nyb2xsVG9wLCBjdXIuc2Nyb2xsTGVmdCk7XG4gICAgICAgIGlmIChjdXIgPT0gY3VyLm93bmVyRG9jdW1lbnQpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZG9tLmZvY3VzKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPT0gbnVsbCA/IHtcbiAgICAgICAgZ2V0IHByZXZlbnRTY3JvbGwoKSB7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0geyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0gOiB1bmRlZmluZWQpO1xuICAgIGlmICghcHJldmVudFNjcm9sbFN1cHBvcnRlZCkge1xuICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGVsdCA9IHN0YWNrW2krK10sIHRvcCA9IHN0YWNrW2krK10sIGxlZnQgPSBzdGFja1tpKytdO1xuICAgICAgICAgICAgaWYgKGVsdC5zY3JvbGxUb3AgIT0gdG9wKVxuICAgICAgICAgICAgICAgIGVsdC5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICAgICAgICBpZiAoZWx0LnNjcm9sbExlZnQgIT0gbGVmdClcbiAgICAgICAgICAgICAgICBlbHQuc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5sZXQgc2NyYXRjaFJhbmdlO1xuZnVuY3Rpb24gdGV4dFJhbmdlKG5vZGUsIGZyb20sIHRvID0gZnJvbSkge1xuICAgIGxldCByYW5nZSA9IHNjcmF0Y2hSYW5nZSB8fCAoc2NyYXRjaFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSk7XG4gICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIHRvKTtcbiAgICByYW5nZS5zZXRTdGFydChub2RlLCBmcm9tKTtcbiAgICByZXR1cm4gcmFuZ2U7XG59XG5mdW5jdGlvbiBkaXNwYXRjaEtleShlbHQsIG5hbWUsIGNvZGUsIG1vZHMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IHsga2V5OiBuYW1lLCBjb2RlOiBuYW1lLCBrZXlDb2RlOiBjb2RlLCB3aGljaDogY29kZSwgY2FuY2VsYWJsZTogdHJ1ZSB9O1xuICAgIGlmIChtb2RzKVxuICAgICAgICAoeyBhbHRLZXk6IG9wdGlvbnMuYWx0S2V5LCBjdHJsS2V5OiBvcHRpb25zLmN0cmxLZXksIHNoaWZ0S2V5OiBvcHRpb25zLnNoaWZ0S2V5LCBtZXRhS2V5OiBvcHRpb25zLm1ldGFLZXkgfSA9IG1vZHMpO1xuICAgIGxldCBkb3duID0gbmV3IEtleWJvYXJkRXZlbnQoXCJrZXlkb3duXCIsIG9wdGlvbnMpO1xuICAgIGRvd24uc3ludGhldGljID0gdHJ1ZTtcbiAgICBlbHQuZGlzcGF0Y2hFdmVudChkb3duKTtcbiAgICBsZXQgdXAgPSBuZXcgS2V5Ym9hcmRFdmVudChcImtleXVwXCIsIG9wdGlvbnMpO1xuICAgIHVwLnN5bnRoZXRpYyA9IHRydWU7XG4gICAgZWx0LmRpc3BhdGNoRXZlbnQodXApO1xuICAgIHJldHVybiBkb3duLmRlZmF1bHRQcmV2ZW50ZWQgfHwgdXAuZGVmYXVsdFByZXZlbnRlZDtcbn1cbmZ1bmN0aW9uIGdldFJvb3Qobm9kZSkge1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlICYmIChub2RlLm5vZGVUeXBlID09IDkgfHwgbm9kZS5ub2RlVHlwZSA9PSAxMSAmJiBub2RlLmhvc3QpKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmFzc2lnbmVkU2xvdCB8fCBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY2xlYXJBdHRyaWJ1dGVzKG5vZGUpIHtcbiAgICB3aGlsZSAobm9kZS5hdHRyaWJ1dGVzLmxlbmd0aClcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGVOb2RlKG5vZGUuYXR0cmlidXRlc1swXSk7XG59XG5mdW5jdGlvbiBhdEVsZW1lbnRTdGFydChkb2MsIHNlbGVjdGlvbikge1xuICAgIGxldCBub2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSwgb2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0O1xuICAgIGlmICghbm9kZSB8fCBzZWxlY3Rpb24uYW5jaG9yTm9kZSAhPSBub2RlIHx8IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgIT0gb2Zmc2V0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gU2FmYXJpIGNhbiByZXBvcnQgYm9ndXMgb2Zmc2V0cyAoIzExNTIpXG4gICAgb2Zmc2V0ID0gTWF0aC5taW4ob2Zmc2V0LCBtYXhPZmZzZXQobm9kZSkpO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG9mZnNldCkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcHJldiA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgIGlmIChwcmV2LmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gcHJldjtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBtYXhPZmZzZXQobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZSA9PSBkb2MpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaXNTY3JvbGxlZFRvQm90dG9tKGVsdCkge1xuICAgIHJldHVybiBlbHQuc2Nyb2xsVG9wID4gTWF0aC5tYXgoMSwgZWx0LnNjcm9sbEhlaWdodCAtIGVsdC5jbGllbnRIZWlnaHQgLSA0KTtcbn1cbmZ1bmN0aW9uIHRleHROb2RlQmVmb3JlKHN0YXJ0Tm9kZSwgc3RhcnRPZmZzZXQpIHtcbiAgICBmb3IgKGxldCBub2RlID0gc3RhcnROb2RlLCBvZmZzZXQgPSBzdGFydE9mZnNldDs7KSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgb2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogbm9kZSwgb2Zmc2V0OiBvZmZzZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgb2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgaWYgKG5vZGUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgICAgICBvZmZzZXQgPSBtYXhPZmZzZXQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5wYXJlbnROb2RlICYmICFpc0Jsb2NrRWxlbWVudChub2RlKSkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB0ZXh0Tm9kZUFmdGVyKHN0YXJ0Tm9kZSwgc3RhcnRPZmZzZXQpIHtcbiAgICBmb3IgKGxldCBub2RlID0gc3RhcnROb2RlLCBvZmZzZXQgPSBzdGFydE9mZnNldDs7KSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgb2Zmc2V0IDwgbm9kZS5ub2RlVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiBub2RlLCBvZmZzZXQ6IG9mZnNldCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgJiYgIWlzQmxvY2tFbGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKSArIDE7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIERPTVBvcyB7XG4gICAgY29uc3RydWN0b3Iobm9kZSwgb2Zmc2V0LCBwcmVjaXNlID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5wcmVjaXNlID0gcHJlY2lzZTtcbiAgICB9XG4gICAgc3RhdGljIGJlZm9yZShkb20sIHByZWNpc2UpIHsgcmV0dXJuIG5ldyBET01Qb3MoZG9tLnBhcmVudE5vZGUsIGRvbUluZGV4KGRvbSksIHByZWNpc2UpOyB9XG4gICAgc3RhdGljIGFmdGVyKGRvbSwgcHJlY2lzZSkgeyByZXR1cm4gbmV3IERPTVBvcyhkb20ucGFyZW50Tm9kZSwgZG9tSW5kZXgoZG9tKSArIDEsIHByZWNpc2UpOyB9XG59XG5jb25zdCBub0NoaWxkcmVuID0gW107XG5jbGFzcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5kb20gPSBudWxsO1xuICAgICAgICB0aGlzLmZsYWdzID0gMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi87XG4gICAgfVxuICAgIGdldCBvdmVycmlkZURPTVRleHQoKSB7IHJldHVybiBudWxsOyB9XG4gICAgZ2V0IHBvc0F0U3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnBvc0JlZm9yZSh0aGlzKSA6IDA7XG4gICAgfVxuICAgIGdldCBwb3NBdEVuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zQXRTdGFydCArIHRoaXMubGVuZ3RoO1xuICAgIH1cbiAgICBwb3NCZWZvcmUodmlldykge1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5wb3NBdFN0YXJ0O1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQgPT0gdmlldylcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgICAgcG9zICs9IGNoaWxkLmxlbmd0aCArIGNoaWxkLmJyZWFrQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGNoaWxkIGluIHBvc0JlZm9yZVwiKTtcbiAgICB9XG4gICAgcG9zQWZ0ZXIodmlldykge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NCZWZvcmUodmlldykgKyB2aWV3Lmxlbmd0aDtcbiAgICB9XG4gICAgc3luYyh2aWV3LCB0cmFjaykge1xuICAgICAgICBpZiAodGhpcy5mbGFncyAmIDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5kb207XG4gICAgICAgICAgICBsZXQgcHJldiA9IG51bGwsIG5leHQ7XG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLmRvbSAmJiAobmV4dCA9IHByZXYgPyBwcmV2Lm5leHRTaWJsaW5nIDogcGFyZW50LmZpcnN0Q2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudFZpZXcgPSBDb250ZW50Vmlldy5nZXQobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRWaWV3IHx8ICFjb250ZW50Vmlldy5wYXJlbnQgJiYgY29udGVudFZpZXcuY2FuUmV1c2VET00oY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnJldXNlRE9NKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnN5bmModmlldywgdHJhY2spO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5mbGFncyAmPSB+NyAvKiBWaWV3RmxhZy5EaXJ0eSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV4dCA9IHByZXYgPyBwcmV2Lm5leHRTaWJsaW5nIDogcGFyZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNrICYmICF0cmFjay53cml0dGVuICYmIHRyYWNrLm5vZGUgPT0gcGFyZW50ICYmIG5leHQgIT0gY2hpbGQuZG9tKVxuICAgICAgICAgICAgICAgICAgICB0cmFjay53cml0dGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZG9tLnBhcmVudE5vZGUgPT0gcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQgIT0gY2hpbGQuZG9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHJtJDEobmV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLmRvbSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXYgPSBjaGlsZC5kb207XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0ID0gcHJldiA/IHByZXYubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGlmIChuZXh0ICYmIHRyYWNrICYmIHRyYWNrLm5vZGUgPT0gcGFyZW50KVxuICAgICAgICAgICAgICAgIHRyYWNrLndyaXR0ZW4gPSB0cnVlO1xuICAgICAgICAgICAgd2hpbGUgKG5leHQpXG4gICAgICAgICAgICAgICAgbmV4dCA9IHJtJDEobmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5mbGFncyAmIDEgLyogVmlld0ZsYWcuQ2hpbGREaXJ0eSAqLykge1xuICAgICAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZmxhZ3MgJiA3IC8qIFZpZXdGbGFnLkRpcnR5ICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnN5bmModmlldywgdHJhY2spO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5mbGFncyAmPSB+NyAvKiBWaWV3RmxhZy5EaXJ0eSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV1c2VET00oX2RvbSkgeyB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkge1xuICAgICAgICBsZXQgYWZ0ZXI7XG4gICAgICAgIGlmIChub2RlID09IHRoaXMuZG9tKSB7XG4gICAgICAgICAgICBhZnRlciA9IHRoaXMuZG9tLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBiaWFzID0gbWF4T2Zmc2V0KG5vZGUpID09IDAgPyAwIDogb2Zmc2V0ID09IDAgPyAtMSA6IDE7XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09IHRoaXMuZG9tKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoYmlhcyA9PSAwICYmIHBhcmVudC5maXJzdENoaWxkICE9IHBhcmVudC5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gcGFyZW50LmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICBiaWFzID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJpYXMgPCAwKVxuICAgICAgICAgICAgICAgIGFmdGVyID0gbm9kZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhZnRlciA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFmdGVyID09IHRoaXMuZG9tLmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgd2hpbGUgKGFmdGVyICYmICFDb250ZW50Vmlldy5nZXQoYWZ0ZXIpKVxuICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci5uZXh0U2libGluZztcbiAgICAgICAgaWYgKCFhZnRlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAoY2hpbGQuZG9tID09IGFmdGVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgICBwb3MgKz0gY2hpbGQubGVuZ3RoICsgY2hpbGQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkb21Cb3VuZHNBcm91bmQoZnJvbSwgdG8sIG9mZnNldCA9IDApIHtcbiAgICAgICAgbGV0IGZyb21JID0gLTEsIGZyb21TdGFydCA9IC0xLCB0b0kgPSAtMSwgdG9FbmQgPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IG9mZnNldCwgcHJldkVuZCA9IG9mZnNldDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChwb3MgPCBmcm9tICYmIGVuZCA+IHRvKVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5kb21Cb3VuZHNBcm91bmQoZnJvbSwgdG8sIHBvcyk7XG4gICAgICAgICAgICBpZiAoZW5kID49IGZyb20gJiYgZnJvbUkgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBmcm9tSSA9IGk7XG4gICAgICAgICAgICAgICAgZnJvbVN0YXJ0ID0gcG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA+IHRvICYmIGNoaWxkLmRvbS5wYXJlbnROb2RlID09IHRoaXMuZG9tKSB7XG4gICAgICAgICAgICAgICAgdG9JID0gaTtcbiAgICAgICAgICAgICAgICB0b0VuZCA9IHByZXZFbmQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2RW5kID0gZW5kO1xuICAgICAgICAgICAgcG9zID0gZW5kICsgY2hpbGQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmcm9tOiBmcm9tU3RhcnQsIHRvOiB0b0VuZCA8IDAgPyBvZmZzZXQgKyB0aGlzLmxlbmd0aCA6IHRvRW5kLFxuICAgICAgICAgICAgc3RhcnRET006IChmcm9tSSA/IHRoaXMuY2hpbGRyZW5bZnJvbUkgLSAxXS5kb20ubmV4dFNpYmxpbmcgOiBudWxsKSB8fCB0aGlzLmRvbS5maXJzdENoaWxkLFxuICAgICAgICAgICAgZW5kRE9NOiB0b0kgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aCAmJiB0b0kgPj0gMCA/IHRoaXMuY2hpbGRyZW5bdG9JXS5kb20gOiBudWxsIH07XG4gICAgfVxuICAgIG1hcmtEaXJ0eShhbmRQYXJlbnQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLmZsYWdzIHw9IDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovO1xuICAgICAgICB0aGlzLm1hcmtQYXJlbnRzRGlydHkoYW5kUGFyZW50KTtcbiAgICB9XG4gICAgbWFya1BhcmVudHNEaXJ0eShjaGlsZExpc3QpIHtcbiAgICAgICAgZm9yIChsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQ7IHBhcmVudDsgcGFyZW50ID0gcGFyZW50LnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTGlzdClcbiAgICAgICAgICAgICAgICBwYXJlbnQuZmxhZ3MgfD0gMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi87XG4gICAgICAgICAgICBpZiAocGFyZW50LmZsYWdzICYgMSAvKiBWaWV3RmxhZy5DaGlsZERpcnR5ICovKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHBhcmVudC5mbGFncyB8PSAxIC8qIFZpZXdGbGFnLkNoaWxkRGlydHkgKi87XG4gICAgICAgICAgICBjaGlsZExpc3QgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJlbnQocGFyZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCAhPSBwYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiA3IC8qIFZpZXdGbGFnLkRpcnR5ICovKVxuICAgICAgICAgICAgICAgIHRoaXMubWFya1BhcmVudHNEaXJ0eSh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRET00oZG9tKSB7XG4gICAgICAgIGlmICh0aGlzLmRvbSA9PSBkb20pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmRvbSlcbiAgICAgICAgICAgIHRoaXMuZG9tLmNtVmlldyA9IG51bGw7XG4gICAgICAgIHRoaXMuZG9tID0gZG9tO1xuICAgICAgICBkb20uY21WaWV3ID0gdGhpcztcbiAgICB9XG4gICAgZ2V0IHJvb3RWaWV3KCkge1xuICAgICAgICBmb3IgKGxldCB2ID0gdGhpczs7KSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdi5wYXJlbnQ7XG4gICAgICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgIHYgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZUNoaWxkcmVuKGZyb20sIHRvLCBjaGlsZHJlbiA9IG5vQ2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGNoaWxkLnBhcmVudCA9PSB0aGlzICYmIGNoaWxkcmVuLmluZGV4T2YoY2hpbGQpIDwgMClcbiAgICAgICAgICAgICAgICBjaGlsZC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA8IDI1MClcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGZyb20sIHRvIC0gZnJvbSwgLi4uY2hpbGRyZW4pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gW10uY29uY2F0KHRoaXMuY2hpbGRyZW4uc2xpY2UoMCwgZnJvbSksIGNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLnNsaWNlKHRvKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBjaGlsZHJlbltpXS5zZXRQYXJlbnQodGhpcyk7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKF9yZWMpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWdub3JlRXZlbnQoX2V2ZW50KSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGNoaWxkQ3Vyc29yKHBvcyA9IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hpbGRDdXJzb3IodGhpcy5jaGlsZHJlbiwgcG9zLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgfVxuICAgIGNoaWxkUG9zKHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRDdXJzb3IoKS5maW5kUG9zKHBvcywgYmlhcyk7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgbmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZS5yZXBsYWNlKFwiVmlld1wiLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIG5hbWUgKyAodGhpcy5jaGlsZHJlbi5sZW5ndGggPyBcIihcIiArIHRoaXMuY2hpbGRyZW4uam9pbigpICsgXCIpXCIgOlxuICAgICAgICAgICAgdGhpcy5sZW5ndGggPyBcIltcIiArIChuYW1lID09IFwiVGV4dFwiID8gdGhpcy50ZXh0IDogdGhpcy5sZW5ndGgpICsgXCJdXCIgOiBcIlwiKSArXG4gICAgICAgICAgICAodGhpcy5icmVha0FmdGVyID8gXCIjXCIgOiBcIlwiKTtcbiAgICB9XG4gICAgc3RhdGljIGdldChub2RlKSB7IHJldHVybiBub2RlLmNtVmlldzsgfVxuICAgIGdldCBpc0VkaXRhYmxlKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGdldCBpc1dpZGdldCgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBoYXNTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYmVjb21lKG90aGVyKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGNhblJldXNlRE9NKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlci5jb25zdHJ1Y3RvciA9PSB0aGlzLmNvbnN0cnVjdG9yICYmICEoKHRoaXMuZmxhZ3MgfCBvdGhlci5mbGFncykgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKTtcbiAgICB9XG4gICAgLy8gV2hlbiB0aGlzIGlzIGEgemVyby1sZW5ndGggdmlldyB3aXRoIGEgc2lkZSwgdGhpcyBzaG91bGQgcmV0dXJuIGFcbiAgICAvLyBudW1iZXIgPD0gMCB0byBpbmRpY2F0ZSBpdCBpcyBiZWZvcmUgaXRzIHBvc2l0aW9uLCBvciBhXG4gICAgLy8gbnVtYmVyID4gMCB3aGVuIGFmdGVyIGl0cyBwb3NpdGlvbi5cbiAgICBnZXRTaWRlKCkgeyByZXR1cm4gMDsgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICBpZiAoY2hpbGQucGFyZW50ID09IHRoaXMpXG4gICAgICAgICAgICAgICAgY2hpbGQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgfVxufVxuQ29udGVudFZpZXcucHJvdG90eXBlLmJyZWFrQWZ0ZXIgPSAwO1xuLy8gUmVtb3ZlIGEgRE9NIG5vZGUgYW5kIHJldHVybiBpdHMgbmV4dCBzaWJsaW5nLlxuZnVuY3Rpb24gcm0kMShkb20pIHtcbiAgICBsZXQgbmV4dCA9IGRvbS5uZXh0U2libGluZztcbiAgICBkb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb20pO1xuICAgIHJldHVybiBuZXh0O1xufVxuY2xhc3MgQ2hpbGRDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNoaWxkcmVuLCBwb3MsIGkpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5pID0gaTtcbiAgICAgICAgdGhpcy5vZmYgPSAwO1xuICAgIH1cbiAgICBmaW5kUG9zKHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKHBvcyA+IHRoaXMucG9zIHx8IHBvcyA9PSB0aGlzLnBvcyAmJlxuICAgICAgICAgICAgICAgIChiaWFzID4gMCB8fCB0aGlzLmkgPT0gMCB8fCB0aGlzLmNoaWxkcmVuW3RoaXMuaSAtIDFdLmJyZWFrQWZ0ZXIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYgPSBwb3MgLSB0aGlzLnBvcztcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5jaGlsZHJlblstLXRoaXMuaV07XG4gICAgICAgICAgICB0aGlzLnBvcyAtPSBuZXh0Lmxlbmd0aCArIG5leHQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHJlcGxhY2VSYW5nZShwYXJlbnQsIGZyb21JLCBmcm9tT2ZmLCB0b0ksIHRvT2ZmLCBpbnNlcnQsIGJyZWFrQXRTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgbGV0IHsgY2hpbGRyZW4gfSA9IHBhcmVudDtcbiAgICBsZXQgYmVmb3JlID0gY2hpbGRyZW4ubGVuZ3RoID8gY2hpbGRyZW5bZnJvbUldIDogbnVsbDtcbiAgICBsZXQgbGFzdCA9IGluc2VydC5sZW5ndGggPyBpbnNlcnRbaW5zZXJ0Lmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICBsZXQgYnJlYWtBdEVuZCA9IGxhc3QgPyBsYXN0LmJyZWFrQWZ0ZXIgOiBicmVha0F0U3RhcnQ7XG4gICAgLy8gQ2hhbmdlIHdpdGhpbiBhIHNpbmdsZSBjaGlsZFxuICAgIGlmIChmcm9tSSA9PSB0b0kgJiYgYmVmb3JlICYmICFicmVha0F0U3RhcnQgJiYgIWJyZWFrQXRFbmQgJiYgaW5zZXJ0Lmxlbmd0aCA8IDIgJiZcbiAgICAgICAgYmVmb3JlLm1lcmdlKGZyb21PZmYsIHRvT2ZmLCBpbnNlcnQubGVuZ3RoID8gbGFzdCA6IG51bGwsIGZyb21PZmYgPT0gMCwgb3BlblN0YXJ0LCBvcGVuRW5kKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmICh0b0kgPCBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGFmdGVyID0gY2hpbGRyZW5bdG9JXTtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBlbmQgb2YgdGhlIGNoaWxkIGFmdGVyIHRoZSB1cGRhdGUgaXMgcHJlc2VydmVkIGluIGBhZnRlcmBcbiAgICAgICAgaWYgKGFmdGVyICYmICh0b09mZiA8IGFmdGVyLmxlbmd0aCB8fCBhZnRlci5icmVha0FmdGVyICYmIChsYXN0ID09PSBudWxsIHx8IGxhc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhc3QuYnJlYWtBZnRlcikpKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSdyZSBzcGxpdHRpbmcgYSBjaGlsZCwgc2VwYXJhdGUgcGFydCBvZiBpdCB0byBhdm9pZCB0aGF0XG4gICAgICAgICAgICAvLyBiZWluZyBtYW5nbGVkIHdoZW4gdXBkYXRpbmcgdGhlIGNoaWxkIGJlZm9yZSB0aGUgdXBkYXRlLlxuICAgICAgICAgICAgaWYgKGZyb21JID09IHRvSSkge1xuICAgICAgICAgICAgICAgIGFmdGVyID0gYWZ0ZXIuc3BsaXQodG9PZmYpO1xuICAgICAgICAgICAgICAgIHRvT2ZmID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGFmdGVyIHRoZSByZXBsYWNlbWVudCBzaG91bGQgYmUgbWVyZ2VkIHdpdGhcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IHJlcGxhY2luZyBlbGVtZW50LCB1cGRhdGUgYGNvbnRlbnRgXG4gICAgICAgICAgICBpZiAoIWJyZWFrQXRFbmQgJiYgbGFzdCAmJiBhZnRlci5tZXJnZSgwLCB0b09mZiwgbGFzdCwgdHJ1ZSwgMCwgb3BlbkVuZCkpIHtcbiAgICAgICAgICAgICAgICBpbnNlcnRbaW5zZXJ0Lmxlbmd0aCAtIDFdID0gYWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHN0YXJ0IG9mIHRoZSBhZnRlciBlbGVtZW50LCBpZiBuZWNlc3NhcnksIGFuZFxuICAgICAgICAgICAgICAgIC8vIGFkZCBpdCB0byBgY29udGVudGAuXG4gICAgICAgICAgICAgICAgaWYgKHRvT2ZmIHx8IGFmdGVyLmNoaWxkcmVuLmxlbmd0aCAmJiAhYWZ0ZXIuY2hpbGRyZW5bMF0ubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBhZnRlci5tZXJnZSgwLCB0b09mZiwgbnVsbCwgZmFsc2UsIDAsIG9wZW5FbmQpO1xuICAgICAgICAgICAgICAgIGluc2VydC5wdXNoKGFmdGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhZnRlciA9PT0gbnVsbCB8fCBhZnRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWZ0ZXIuYnJlYWtBZnRlcikge1xuICAgICAgICAgICAgLy8gVGhlIGVsZW1lbnQgYXQgYHRvSWAgaXMgZW50aXJlbHkgY292ZXJlZCBieSB0aGlzIHJhbmdlLlxuICAgICAgICAgICAgLy8gUHJlc2VydmUgaXRzIGxpbmUgYnJlYWssIGlmIGFueS5cbiAgICAgICAgICAgIGlmIChsYXN0KVxuICAgICAgICAgICAgICAgIGxhc3QuYnJlYWtBZnRlciA9IDE7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYnJlYWtBdFN0YXJ0ID0gMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5jZSB3ZSd2ZSBoYW5kbGVkIHRoZSBuZXh0IGVsZW1lbnQgZnJvbSB0aGUgY3VycmVudCBlbGVtZW50c1xuICAgICAgICAvLyBub3csIG1ha2Ugc3VyZSBgdG9JYCBwb2ludHMgYWZ0ZXIgdGhhdC5cbiAgICAgICAgdG9JKys7XG4gICAgfVxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgICAgYmVmb3JlLmJyZWFrQWZ0ZXIgPSBicmVha0F0U3RhcnQ7XG4gICAgICAgIGlmIChmcm9tT2ZmID4gMCkge1xuICAgICAgICAgICAgaWYgKCFicmVha0F0U3RhcnQgJiYgaW5zZXJ0Lmxlbmd0aCAmJiBiZWZvcmUubWVyZ2UoZnJvbU9mZiwgYmVmb3JlLmxlbmd0aCwgaW5zZXJ0WzBdLCBmYWxzZSwgb3BlblN0YXJ0LCAwKSkge1xuICAgICAgICAgICAgICAgIGJlZm9yZS5icmVha0FmdGVyID0gaW5zZXJ0LnNoaWZ0KCkuYnJlYWtBZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZyb21PZmYgPCBiZWZvcmUubGVuZ3RoIHx8IGJlZm9yZS5jaGlsZHJlbi5sZW5ndGggJiYgYmVmb3JlLmNoaWxkcmVuW2JlZm9yZS5jaGlsZHJlbi5sZW5ndGggLSAxXS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIGJlZm9yZS5tZXJnZShmcm9tT2ZmLCBiZWZvcmUubGVuZ3RoLCBudWxsLCBmYWxzZSwgb3BlblN0YXJ0LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21JKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVHJ5IHRvIG1lcmdlIHdpZGdldHMgb24gdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJlcGxhY2VtZW50XG4gICAgd2hpbGUgKGZyb21JIDwgdG9JICYmIGluc2VydC5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW3RvSSAtIDFdLmJlY29tZShpbnNlcnRbaW5zZXJ0Lmxlbmd0aCAtIDFdKSkge1xuICAgICAgICAgICAgdG9JLS07XG4gICAgICAgICAgICBpbnNlcnQucG9wKCk7XG4gICAgICAgICAgICBvcGVuRW5kID0gaW5zZXJ0Lmxlbmd0aCA/IDAgOiBvcGVuU3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hpbGRyZW5bZnJvbUldLmJlY29tZShpbnNlcnRbMF0pKSB7XG4gICAgICAgICAgICBmcm9tSSsrO1xuICAgICAgICAgICAgaW5zZXJ0LnNoaWZ0KCk7XG4gICAgICAgICAgICBvcGVuU3RhcnQgPSBpbnNlcnQubGVuZ3RoID8gMCA6IG9wZW5FbmQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWluc2VydC5sZW5ndGggJiYgZnJvbUkgJiYgdG9JIDwgY2hpbGRyZW4ubGVuZ3RoICYmICFjaGlsZHJlbltmcm9tSSAtIDFdLmJyZWFrQWZ0ZXIgJiZcbiAgICAgICAgY2hpbGRyZW5bdG9JXS5tZXJnZSgwLCAwLCBjaGlsZHJlbltmcm9tSSAtIDFdLCBmYWxzZSwgb3BlblN0YXJ0LCBvcGVuRW5kKSlcbiAgICAgICAgZnJvbUktLTtcbiAgICBpZiAoZnJvbUkgPCB0b0kgfHwgaW5zZXJ0Lmxlbmd0aClcbiAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZHJlbihmcm9tSSwgdG9JLCBpbnNlcnQpO1xufVxuZnVuY3Rpb24gbWVyZ2VDaGlsZHJlbkludG8ocGFyZW50LCBmcm9tLCB0bywgaW5zZXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICBsZXQgY3VyID0gcGFyZW50LmNoaWxkQ3Vyc29yKCk7XG4gICAgbGV0IHsgaTogdG9JLCBvZmY6IHRvT2ZmIH0gPSBjdXIuZmluZFBvcyh0bywgMSk7XG4gICAgbGV0IHsgaTogZnJvbUksIG9mZjogZnJvbU9mZiB9ID0gY3VyLmZpbmRQb3MoZnJvbSwgLTEpO1xuICAgIGxldCBkTGVuID0gZnJvbSAtIHRvO1xuICAgIGZvciAobGV0IHZpZXcgb2YgaW5zZXJ0KVxuICAgICAgICBkTGVuICs9IHZpZXcubGVuZ3RoO1xuICAgIHBhcmVudC5sZW5ndGggKz0gZExlbjtcbiAgICByZXBsYWNlUmFuZ2UocGFyZW50LCBmcm9tSSwgZnJvbU9mZiwgdG9JLCB0b09mZiwgaW5zZXJ0LCAwLCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xufVxuXG5sZXQgbmF2ID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiID8gbmF2aWdhdG9yIDogeyB1c2VyQWdlbnQ6IFwiXCIsIHZlbmRvcjogXCJcIiwgcGxhdGZvcm06IFwiXCIgfTtcbmxldCBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgIT0gXCJ1bmRlZmluZWRcIiA/IGRvY3VtZW50IDogeyBkb2N1bWVudEVsZW1lbnQ6IHsgc3R5bGU6IHt9IH0gfTtcbmNvbnN0IGllX2VkZ2UgPSAvKkBfX1BVUkVfXyovL0VkZ2VcXC8oXFxkKykvLmV4ZWMobmF2LnVzZXJBZ2VudCk7XG5jb25zdCBpZV91cHRvMTAgPSAvKkBfX1BVUkVfXyovL01TSUUgXFxkLy50ZXN0KG5hdi51c2VyQWdlbnQpO1xuY29uc3QgaWVfMTF1cCA9IC8qQF9fUFVSRV9fKi8vVHJpZGVudFxcLyg/Ols3LTldfFxcZHsyLH0pXFwuLipydjooXFxkKykvLmV4ZWMobmF2LnVzZXJBZ2VudCk7XG5jb25zdCBpZSA9ICEhKGllX3VwdG8xMCB8fCBpZV8xMXVwIHx8IGllX2VkZ2UpO1xuY29uc3QgZ2Vja28gPSAhaWUgJiYgLypAX19QVVJFX18qLy9nZWNrb1xcLyhcXGQrKS9pLnRlc3QobmF2LnVzZXJBZ2VudCk7XG5jb25zdCBjaHJvbWUgPSAhaWUgJiYgLypAX19QVVJFX18qLy9DaHJvbWVcXC8oXFxkKykvLmV4ZWMobmF2LnVzZXJBZ2VudCk7XG5jb25zdCB3ZWJraXQgPSBcIndlYmtpdEZvbnRTbW9vdGhpbmdcIiBpbiBkb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuY29uc3Qgc2FmYXJpID0gIWllICYmIC8qQF9fUFVSRV9fKi8vQXBwbGUgQ29tcHV0ZXIvLnRlc3QobmF2LnZlbmRvcik7XG5jb25zdCBpb3MgPSBzYWZhcmkgJiYgKC8qQF9fUFVSRV9fKi8vTW9iaWxlXFwvXFx3Ky8udGVzdChuYXYudXNlckFnZW50KSB8fCBuYXYubWF4VG91Y2hQb2ludHMgPiAyKTtcbnZhciBicm93c2VyID0ge1xuICAgIG1hYzogaW9zIHx8IC8qQF9fUFVSRV9fKi8vTWFjLy50ZXN0KG5hdi5wbGF0Zm9ybSksXG4gICAgd2luZG93czogLypAX19QVVJFX18qLy9XaW4vLnRlc3QobmF2LnBsYXRmb3JtKSxcbiAgICBsaW51eDogLypAX19QVVJFX18qLy9MaW51eHxYMTEvLnRlc3QobmF2LnBsYXRmb3JtKSxcbiAgICBpZSxcbiAgICBpZV92ZXJzaW9uOiBpZV91cHRvMTAgPyBkb2MuZG9jdW1lbnRNb2RlIHx8IDYgOiBpZV8xMXVwID8gK2llXzExdXBbMV0gOiBpZV9lZGdlID8gK2llX2VkZ2VbMV0gOiAwLFxuICAgIGdlY2tvLFxuICAgIGdlY2tvX3ZlcnNpb246IGdlY2tvID8gKygvKkBfX1BVUkVfXyovL0ZpcmVmb3hcXC8oXFxkKykvLmV4ZWMobmF2LnVzZXJBZ2VudCkgfHwgWzAsIDBdKVsxXSA6IDAsXG4gICAgY2hyb21lOiAhIWNocm9tZSxcbiAgICBjaHJvbWVfdmVyc2lvbjogY2hyb21lID8gK2Nocm9tZVsxXSA6IDAsXG4gICAgaW9zLFxuICAgIGFuZHJvaWQ6IC8qQF9fUFVSRV9fKi8vQW5kcm9pZFxcYi8udGVzdChuYXYudXNlckFnZW50KSxcbiAgICB3ZWJraXQsXG4gICAgc2FmYXJpLFxuICAgIHdlYmtpdF92ZXJzaW9uOiB3ZWJraXQgPyArKC8qQF9fUFVSRV9fKi8vXFxiQXBwbGVXZWJLaXRcXC8oXFxkKykvLmV4ZWMobmF2LnVzZXJBZ2VudCkgfHwgWzAsIDBdKVsxXSA6IDAsXG4gICAgdGFiU2l6ZTogZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS50YWJTaXplICE9IG51bGwgPyBcInRhYi1zaXplXCIgOiBcIi1tb3otdGFiLXNpemVcIlxufTtcblxuY29uc3QgTWF4Sm9pbkxlbiA9IDI1NjtcbmNsYXNzIFRleHRWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKHRleHQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMudGV4dC5sZW5ndGg7IH1cbiAgICBjcmVhdGVET00odGV4dERPTSkge1xuICAgICAgICB0aGlzLnNldERPTSh0ZXh0RE9NIHx8IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMudGV4dCkpO1xuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIGlmICghdGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZURPTSgpO1xuICAgICAgICBpZiAodGhpcy5kb20ubm9kZVZhbHVlICE9IHRoaXMudGV4dCkge1xuICAgICAgICAgICAgaWYgKHRyYWNrICYmIHRyYWNrLm5vZGUgPT0gdGhpcy5kb20pXG4gICAgICAgICAgICAgICAgdHJhY2sud3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRvbS5ub2RlVmFsdWUgPSB0aGlzLnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV1c2VET00oZG9tKSB7XG4gICAgICAgIGlmIChkb20ubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRE9NKGRvbSk7XG4gICAgfVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UpIHtcbiAgICAgICAgaWYgKCh0aGlzLmZsYWdzICYgOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLykgfHxcbiAgICAgICAgICAgIHNvdXJjZSAmJiAoIShzb3VyY2UgaW5zdGFuY2VvZiBUZXh0VmlldykgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmxlbmd0aCAtICh0byAtIGZyb20pICsgc291cmNlLmxlbmd0aCA+IE1heEpvaW5MZW4gfHxcbiAgICAgICAgICAgICAgICAoc291cmNlLmZsYWdzICYgOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLykpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnRleHQgPSB0aGlzLnRleHQuc2xpY2UoMCwgZnJvbSkgKyAoc291cmNlID8gc291cmNlLnRleHQgOiBcIlwiKSArIHRoaXMudGV4dC5zbGljZSh0byk7XG4gICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzcGxpdChmcm9tKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVGV4dFZpZXcodGhpcy50ZXh0LnNsaWNlKGZyb20pKTtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnNsaWNlKDAsIGZyb20pO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICByZXN1bHQuZmxhZ3MgfD0gdGhpcy5mbGFncyAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi87XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGxvY2FsUG9zRnJvbURPTShub2RlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUgPT0gdGhpcy5kb20gPyBvZmZzZXQgOiBvZmZzZXQgPyB0aGlzLnRleHQubGVuZ3RoIDogMDtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7IHJldHVybiBuZXcgRE9NUG9zKHRoaXMuZG9tLCBwb3MpOyB9XG4gICAgZG9tQm91bmRzQXJvdW5kKF9mcm9tLCBfdG8sIG9mZnNldCkge1xuICAgICAgICByZXR1cm4geyBmcm9tOiBvZmZzZXQsIHRvOiBvZmZzZXQgKyB0aGlzLmxlbmd0aCwgc3RhcnRET006IHRoaXMuZG9tLCBlbmRET006IHRoaXMuZG9tLm5leHRTaWJsaW5nIH07XG4gICAgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICByZXR1cm4gdGV4dENvb3Jkcyh0aGlzLmRvbSwgcG9zLCBzaWRlKTtcbiAgICB9XG59XG5jbGFzcyBNYXJrVmlldyBleHRlbmRzIENvbnRlbnRWaWV3IHtcbiAgICBjb25zdHJ1Y3RvcihtYXJrLCBjaGlsZHJlbiA9IFtdLCBsZW5ndGggPSAwKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGNoIG9mIGNoaWxkcmVuKVxuICAgICAgICAgICAgY2guc2V0UGFyZW50KHRoaXMpO1xuICAgIH1cbiAgICBzZXRBdHRycyhkb20pIHtcbiAgICAgICAgY2xlYXJBdHRyaWJ1dGVzKGRvbSk7XG4gICAgICAgIGlmICh0aGlzLm1hcmsuY2xhc3MpXG4gICAgICAgICAgICBkb20uY2xhc3NOYW1lID0gdGhpcy5tYXJrLmNsYXNzO1xuICAgICAgICBpZiAodGhpcy5tYXJrLmF0dHJzKVxuICAgICAgICAgICAgZm9yIChsZXQgbmFtZSBpbiB0aGlzLm1hcmsuYXR0cnMpXG4gICAgICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShuYW1lLCB0aGlzLm1hcmsuYXR0cnNbbmFtZV0pO1xuICAgICAgICByZXR1cm4gZG9tO1xuICAgIH1cbiAgICBjYW5SZXVzZURPTShvdGhlcikge1xuICAgICAgICByZXR1cm4gc3VwZXIuY2FuUmV1c2VET00ob3RoZXIpICYmICEoKHRoaXMuZmxhZ3MgfCBvdGhlci5mbGFncykgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKTtcbiAgICB9XG4gICAgcmV1c2VET00obm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PSB0aGlzLm1hcmsudGFnTmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnNldERPTShub2RlKTtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3MgfD0gNCAvKiBWaWV3RmxhZy5BdHRyc0RpcnR5ICovIHwgMiAvKiBWaWV3RmxhZy5Ob2RlRGlydHkgKi87XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3luYyh2aWV3LCB0cmFjaykge1xuICAgICAgICBpZiAoIXRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy5zZXRET00odGhpcy5zZXRBdHRycyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMubWFyay50YWdOYW1lKSkpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLmZsYWdzICYgNCAvKiBWaWV3RmxhZy5BdHRyc0RpcnR5ICovKVxuICAgICAgICAgICAgdGhpcy5zZXRBdHRycyh0aGlzLmRvbSk7XG4gICAgICAgIHN1cGVyLnN5bmModmlldywgdHJhY2spO1xuICAgIH1cbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBfaGFzU3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgICAgICBpZiAoc291cmNlICYmICghKHNvdXJjZSBpbnN0YW5jZW9mIE1hcmtWaWV3ICYmIHNvdXJjZS5tYXJrLmVxKHRoaXMubWFyaykpIHx8XG4gICAgICAgICAgICAoZnJvbSAmJiBvcGVuU3RhcnQgPD0gMCkgfHwgKHRvIDwgdGhpcy5sZW5ndGggJiYgb3BlbkVuZCA8PSAwKSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIG1lcmdlQ2hpbGRyZW5JbnRvKHRoaXMsIGZyb20sIHRvLCBzb3VyY2UgPyBzb3VyY2UuY2hpbGRyZW4uc2xpY2UoKSA6IFtdLCBvcGVuU3RhcnQgLSAxLCBvcGVuRW5kIC0gMSk7XG4gICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzcGxpdChmcm9tKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXSwgb2ZmID0gMCwgZGV0YWNoRnJvbSA9IC0xLCBpID0gMDtcbiAgICAgICAgZm9yIChsZXQgZWx0IG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGxldCBlbmQgPSBvZmYgKyBlbHQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+IGZyb20pXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob2ZmIDwgZnJvbSA/IGVsdC5zcGxpdChmcm9tIC0gb2ZmKSA6IGVsdCk7XG4gICAgICAgICAgICBpZiAoZGV0YWNoRnJvbSA8IDAgJiYgb2ZmID49IGZyb20pXG4gICAgICAgICAgICAgICAgZGV0YWNoRnJvbSA9IGk7XG4gICAgICAgICAgICBvZmYgPSBlbmQ7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxlbmd0aCA9IHRoaXMubGVuZ3RoIC0gZnJvbTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBmcm9tO1xuICAgICAgICBpZiAoZGV0YWNoRnJvbSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuLmxlbmd0aCA9IGRldGFjaEZyb207XG4gICAgICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTWFya1ZpZXcodGhpcy5tYXJrLCByZXN1bHQsIGxlbmd0aCk7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICByZXR1cm4gaW5saW5lRE9NQXRQb3ModGhpcywgcG9zKTtcbiAgICB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIHJldHVybiBjb29yZHNJbkNoaWxkcmVuKHRoaXMsIHBvcywgc2lkZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gdGV4dENvb3Jkcyh0ZXh0LCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgbGVuZ3RoID0gdGV4dC5ub2RlVmFsdWUubGVuZ3RoO1xuICAgIGlmIChwb3MgPiBsZW5ndGgpXG4gICAgICAgIHBvcyA9IGxlbmd0aDtcbiAgICBsZXQgZnJvbSA9IHBvcywgdG8gPSBwb3MsIGZsYXR0ZW4gPSAwO1xuICAgIGlmIChwb3MgPT0gMCAmJiBzaWRlIDwgMCB8fCBwb3MgPT0gbGVuZ3RoICYmIHNpZGUgPj0gMCkge1xuICAgICAgICBpZiAoIShicm93c2VyLmNocm9tZSB8fCBicm93c2VyLmdlY2tvKSkgeyAvLyBUaGVzZSBicm93c2VycyByZWxpYWJseSByZXR1cm4gdmFsaWQgcmVjdGFuZ2xlcyBmb3IgZW1wdHkgcmFuZ2VzXG4gICAgICAgICAgICBpZiAocG9zKSB7XG4gICAgICAgICAgICAgICAgZnJvbS0tO1xuICAgICAgICAgICAgICAgIGZsYXR0ZW4gPSAxO1xuICAgICAgICAgICAgfSAvLyBGSVhNRSB0aGlzIGlzIHdyb25nIGluIFJUTCB0ZXh0XG4gICAgICAgICAgICBlbHNlIGlmICh0byA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRvKys7XG4gICAgICAgICAgICAgICAgZmxhdHRlbiA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoc2lkZSA8IDApXG4gICAgICAgICAgICBmcm9tLS07XG4gICAgICAgIGVsc2UgaWYgKHRvIDwgbGVuZ3RoKVxuICAgICAgICAgICAgdG8rKztcbiAgICB9XG4gICAgbGV0IHJlY3RzID0gdGV4dFJhbmdlKHRleHQsIGZyb20sIHRvKS5nZXRDbGllbnRSZWN0cygpO1xuICAgIGlmICghcmVjdHMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgcmVjdCA9IHJlY3RzWyhmbGF0dGVuID8gZmxhdHRlbiA8IDAgOiBzaWRlID49IDApID8gMCA6IHJlY3RzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChicm93c2VyLnNhZmFyaSAmJiAhZmxhdHRlbiAmJiByZWN0LndpZHRoID09IDApXG4gICAgICAgIHJlY3QgPSBBcnJheS5wcm90b3R5cGUuZmluZC5jYWxsKHJlY3RzLCByID0+IHIud2lkdGgpIHx8IHJlY3Q7XG4gICAgcmV0dXJuIGZsYXR0ZW4gPyBmbGF0dGVuUmVjdChyZWN0LCBmbGF0dGVuIDwgMCkgOiByZWN0IHx8IG51bGw7XG59XG4vLyBBbHNvIHVzZWQgZm9yIGNvbGxhcHNlZCByYW5nZXMgdGhhdCBkb24ndCBoYXZlIGEgcGxhY2Vob2xkZXIgd2lkZ2V0IVxuY2xhc3MgV2lkZ2V0VmlldyBleHRlbmRzIENvbnRlbnRWaWV3IHtcbiAgICBzdGF0aWMgY3JlYXRlKHdpZGdldCwgbGVuZ3RoLCBzaWRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2lkZ2V0Vmlldyh3aWRnZXQsIGxlbmd0aCwgc2lkZSk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHdpZGdldCwgbGVuZ3RoLCBzaWRlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5zaWRlID0gc2lkZTtcbiAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gbnVsbDtcbiAgICB9XG4gICAgc3BsaXQoZnJvbSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gV2lkZ2V0Vmlldy5jcmVhdGUodGhpcy53aWRnZXQsIHRoaXMubGVuZ3RoIC0gZnJvbSwgdGhpcy5zaWRlKTtcbiAgICAgICAgdGhpcy5sZW5ndGggLT0gZnJvbTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgc3luYyh2aWV3KSB7XG4gICAgICAgIGlmICghdGhpcy5kb20gfHwgIXRoaXMud2lkZ2V0LnVwZGF0ZURPTSh0aGlzLmRvbSwgdmlldykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSAmJiB0aGlzLnByZXZXaWRnZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0LmRlc3Ryb3kodGhpcy5kb20pO1xuICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKHRoaXMud2lkZ2V0LnRvRE9NKHZpZXcpKTtcbiAgICAgICAgICAgIGlmICghdGhpcy53aWRnZXQuZWRpdGFibGUpXG4gICAgICAgICAgICAgICAgdGhpcy5kb20uY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFNpZGUoKSB7IHJldHVybiB0aGlzLnNpZGU7IH1cbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBoYXNTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgICAgIGlmIChzb3VyY2UgJiYgKCEoc291cmNlIGluc3RhbmNlb2YgV2lkZ2V0VmlldykgfHwgIXRoaXMud2lkZ2V0LmNvbXBhcmUoc291cmNlLndpZGdldCkgfHxcbiAgICAgICAgICAgIGZyb20gPiAwICYmIG9wZW5TdGFydCA8PSAwIHx8IHRvIDwgdGhpcy5sZW5ndGggJiYgb3BlbkVuZCA8PSAwKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBmcm9tICsgKHNvdXJjZSA/IHNvdXJjZS5sZW5ndGggOiAwKSArICh0aGlzLmxlbmd0aCAtIHRvKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGJlY29tZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBXaWRnZXRWaWV3ICYmIG90aGVyLnNpZGUgPT0gdGhpcy5zaWRlICYmXG4gICAgICAgICAgICB0aGlzLndpZGdldC5jb25zdHJ1Y3RvciA9PSBvdGhlci53aWRnZXQuY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy53aWRnZXQuY29tcGFyZShvdGhlci53aWRnZXQpKVxuICAgICAgICAgICAgICAgIHRoaXMubWFya0RpcnR5KHRydWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZG9tICYmICF0aGlzLnByZXZXaWRnZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gdGhpcy53aWRnZXQ7XG4gICAgICAgICAgICB0aGlzLndpZGdldCA9IG90aGVyLndpZGdldDtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbigpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBpZ25vcmVFdmVudChldmVudCkgeyByZXR1cm4gdGhpcy53aWRnZXQuaWdub3JlRXZlbnQoZXZlbnQpOyB9XG4gICAgZ2V0IG92ZXJyaWRlRE9NVGV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gVGV4dC5lbXB0eTtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXM7XG4gICAgICAgIHdoaWxlICh0b3AucGFyZW50KVxuICAgICAgICAgICAgdG9wID0gdG9wLnBhcmVudDtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdG9wLCB0ZXh0ID0gdmlldyAmJiB2aWV3LnN0YXRlLmRvYywgc3RhcnQgPSB0aGlzLnBvc0F0U3RhcnQ7XG4gICAgICAgIHJldHVybiB0ZXh0ID8gdGV4dC5zbGljZShzdGFydCwgc3RhcnQgKyB0aGlzLmxlbmd0aCkgOiBUZXh0LmVtcHR5O1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmxlbmd0aCA/IHBvcyA9PSAwIDogdGhpcy5zaWRlID4gMClcbiAgICAgICAgICAgID8gRE9NUG9zLmJlZm9yZSh0aGlzLmRvbSlcbiAgICAgICAgICAgIDogRE9NUG9zLmFmdGVyKHRoaXMuZG9tLCBwb3MgPT0gdGhpcy5sZW5ndGgpO1xuICAgIH1cbiAgICBkb21Cb3VuZHNBcm91bmQoKSB7IHJldHVybiBudWxsOyB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCBjdXN0b20gPSB0aGlzLndpZGdldC5jb29yZHNBdCh0aGlzLmRvbSwgcG9zLCBzaWRlKTtcbiAgICAgICAgaWYgKGN1c3RvbSlcbiAgICAgICAgICAgIHJldHVybiBjdXN0b207XG4gICAgICAgIGxldCByZWN0cyA9IHRoaXMuZG9tLmdldENsaWVudFJlY3RzKCksIHJlY3QgPSBudWxsO1xuICAgICAgICBpZiAoIXJlY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZnJvbUJhY2sgPSB0aGlzLnNpZGUgPyB0aGlzLnNpZGUgPCAwIDogcG9zID4gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb21CYWNrID8gcmVjdHMubGVuZ3RoIC0gMSA6IDA7OyBpICs9IChmcm9tQmFjayA/IC0xIDogMSkpIHtcbiAgICAgICAgICAgIHJlY3QgPSByZWN0c1tpXTtcbiAgICAgICAgICAgIGlmIChwb3MgPiAwID8gaSA9PSAwIDogaSA9PSByZWN0cy5sZW5ndGggLSAxIHx8IHJlY3QudG9wIDwgcmVjdC5ib3R0b20pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5SZWN0KHJlY3QsICFmcm9tQmFjayk7XG4gICAgfVxuICAgIGdldCBpc0VkaXRhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBnZXQgaXNXaWRnZXQoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IGlzSGlkZGVuKCkgeyByZXR1cm4gdGhpcy53aWRnZXQuaXNIaWRkZW47IH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLmRvbSlcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmRlc3Ryb3kodGhpcy5kb20pO1xuICAgIH1cbn1cbi8vIFRoZXNlIGFyZSBkcmF3biBhcm91bmQgdW5lZGl0YWJsZSB3aWRnZXRzIHRvIGF2b2lkIGEgbnVtYmVyIG9mXG4vLyBicm93c2VyIGJ1Z3MgdGhhdCBzaG93IHVwIHdoZW4gdGhlIGN1cnNvciBpcyBkaXJlY3RseSBuZXh0IHRvXG4vLyB1bmVkaXRhYmxlIGlubGluZSBjb250ZW50LlxuY2xhc3MgV2lkZ2V0QnVmZmVyVmlldyBleHRlbmRzIENvbnRlbnRWaWV3IHtcbiAgICBjb25zdHJ1Y3RvcihzaWRlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2lkZSA9IHNpZGU7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiAwOyB9XG4gICAgbWVyZ2UoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGJlY29tZShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBXaWRnZXRCdWZmZXJWaWV3ICYmIG90aGVyLnNpZGUgPT0gdGhpcy5zaWRlO1xuICAgIH1cbiAgICBzcGxpdCgpIHsgcmV0dXJuIG5ldyBXaWRnZXRCdWZmZXJWaWV3KHRoaXMuc2lkZSk7IH1cbiAgICBzeW5jKCkge1xuICAgICAgICBpZiAoIXRoaXMuZG9tKSB7XG4gICAgICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgICAgICAgIGRvbS5jbGFzc05hbWUgPSBcImNtLXdpZGdldEJ1ZmZlclwiO1xuICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKGRvbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0U2lkZSgpIHsgcmV0dXJuIHRoaXMuc2lkZTsgfVxuICAgIGRvbUF0UG9zKHBvcykgeyByZXR1cm4gdGhpcy5zaWRlID4gMCA/IERPTVBvcy5iZWZvcmUodGhpcy5kb20pIDogRE9NUG9zLmFmdGVyKHRoaXMuZG9tKTsgfVxuICAgIGxvY2FsUG9zRnJvbURPTSgpIHsgcmV0dXJuIDA7IH1cbiAgICBkb21Cb3VuZHNBcm91bmQoKSB7IHJldHVybiBudWxsOyB9XG4gICAgY29vcmRzQXQocG9zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG4gICAgZ2V0IG92ZXJyaWRlRE9NVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIFRleHQuZW1wdHk7XG4gICAgfVxuICAgIGdldCBpc0hpZGRlbigpIHsgcmV0dXJuIHRydWU7IH1cbn1cblRleHRWaWV3LnByb3RvdHlwZS5jaGlsZHJlbiA9IFdpZGdldFZpZXcucHJvdG90eXBlLmNoaWxkcmVuID0gV2lkZ2V0QnVmZmVyVmlldy5wcm90b3R5cGUuY2hpbGRyZW4gPSBub0NoaWxkcmVuO1xuZnVuY3Rpb24gaW5saW5lRE9NQXRQb3MocGFyZW50LCBwb3MpIHtcbiAgICBsZXQgZG9tID0gcGFyZW50LmRvbSwgeyBjaGlsZHJlbiB9ID0gcGFyZW50LCBpID0gMDtcbiAgICBmb3IgKGxldCBvZmYgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gY2hpbGRyZW5baV0sIGVuZCA9IG9mZiArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgaWYgKGVuZCA9PSBvZmYgJiYgY2hpbGQuZ2V0U2lkZSgpIDw9IDApXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKHBvcyA+IG9mZiAmJiBwb3MgPCBlbmQgJiYgY2hpbGQuZG9tLnBhcmVudE5vZGUgPT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmRvbUF0UG9zKHBvcyAtIG9mZik7XG4gICAgICAgIGlmIChwb3MgPD0gb2ZmKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIG9mZiA9IGVuZDtcbiAgICB9XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPiAwOyBqLS0pIHtcbiAgICAgICAgbGV0IHByZXYgPSBjaGlsZHJlbltqIC0gMV07XG4gICAgICAgIGlmIChwcmV2LmRvbS5wYXJlbnROb2RlID09IGRvbSlcbiAgICAgICAgICAgIHJldHVybiBwcmV2LmRvbUF0UG9zKHByZXYubGVuZ3RoKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICBsZXQgbmV4dCA9IGNoaWxkcmVuW2pdO1xuICAgICAgICBpZiAobmV4dC5kb20ucGFyZW50Tm9kZSA9PSBkb20pXG4gICAgICAgICAgICByZXR1cm4gbmV4dC5kb21BdFBvcygwKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBET01Qb3MoZG9tLCAwKTtcbn1cbi8vIEFzc3VtZXMgYHZpZXdgLCBpZiBhIG1hcmsgdmlldywgaGFzIHByZWNpc2VseSAxIGNoaWxkLlxuZnVuY3Rpb24gam9pbklubGluZUludG8ocGFyZW50LCB2aWV3LCBvcGVuKSB7XG4gICAgbGV0IGxhc3QsIHsgY2hpbGRyZW4gfSA9IHBhcmVudDtcbiAgICBpZiAob3BlbiA+IDAgJiYgdmlldyBpbnN0YW5jZW9mIE1hcmtWaWV3ICYmIGNoaWxkcmVuLmxlbmd0aCAmJlxuICAgICAgICAobGFzdCA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdKSBpbnN0YW5jZW9mIE1hcmtWaWV3ICYmIGxhc3QubWFyay5lcSh2aWV3Lm1hcmspKSB7XG4gICAgICAgIGpvaW5JbmxpbmVJbnRvKGxhc3QsIHZpZXcuY2hpbGRyZW5bMF0sIG9wZW4gLSAxKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNoaWxkcmVuLnB1c2godmlldyk7XG4gICAgICAgIHZpZXcuc2V0UGFyZW50KHBhcmVudCk7XG4gICAgfVxuICAgIHBhcmVudC5sZW5ndGggKz0gdmlldy5sZW5ndGg7XG59XG5mdW5jdGlvbiBjb29yZHNJbkNoaWxkcmVuKHZpZXcsIHBvcywgc2lkZSkge1xuICAgIGxldCBiZWZvcmUgPSBudWxsLCBiZWZvcmVQb3MgPSAtMSwgYWZ0ZXIgPSBudWxsLCBhZnRlclBvcyA9IC0xO1xuICAgIGZ1bmN0aW9uIHNjYW4odmlldywgcG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBvZmYgPSAwOyBpIDwgdmlldy5jaGlsZHJlbi5sZW5ndGggJiYgb2ZmIDw9IHBvczsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB2aWV3LmNoaWxkcmVuW2ldLCBlbmQgPSBvZmYgKyBjaGlsZC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID49IHBvcykge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NhbihjaGlsZCwgcG9zIC0gb2ZmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoKCFhZnRlciB8fCBhZnRlci5pc0hpZGRlbiAmJiAoc2lkZSA+IDAgfHwgb25TYW1lTGluZShhZnRlciwgY2hpbGQpKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGVuZCA+IHBvcyB8fCBvZmYgPT0gZW5kICYmIGNoaWxkLmdldFNpZGUoKSA+IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyUG9zID0gcG9zIC0gb2ZmO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvZmYgPCBwb3MgfHwgKG9mZiA9PSBlbmQgJiYgY2hpbGQuZ2V0U2lkZSgpIDwgMCkgJiYgIWNoaWxkLmlzSGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZSA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmVQb3MgPSBwb3MgLSBvZmY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmID0gZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNjYW4odmlldywgcG9zKTtcbiAgICBsZXQgdGFyZ2V0ID0gKHNpZGUgPCAwID8gYmVmb3JlIDogYWZ0ZXIpIHx8IGJlZm9yZSB8fCBhZnRlcjtcbiAgICBpZiAodGFyZ2V0KVxuICAgICAgICByZXR1cm4gdGFyZ2V0LmNvb3Jkc0F0KE1hdGgubWF4KDAsIHRhcmdldCA9PSBiZWZvcmUgPyBiZWZvcmVQb3MgOiBhZnRlclBvcyksIHNpZGUpO1xuICAgIHJldHVybiBmYWxsYmFja1JlY3Qodmlldyk7XG59XG5mdW5jdGlvbiBmYWxsYmFja1JlY3Qodmlldykge1xuICAgIGxldCBsYXN0ID0gdmlldy5kb20ubGFzdENoaWxkO1xuICAgIGlmICghbGFzdClcbiAgICAgICAgcmV0dXJuIHZpZXcuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCByZWN0cyA9IGNsaWVudFJlY3RzRm9yKGxhc3QpO1xuICAgIHJldHVybiByZWN0c1tyZWN0cy5sZW5ndGggLSAxXSB8fCBudWxsO1xufVxuZnVuY3Rpb24gb25TYW1lTGluZShhLCBiKSB7XG4gICAgbGV0IHBvc0EgPSBhLmNvb3Jkc0F0KDAsIDEpLCBwb3NCID0gYi5jb29yZHNBdCgwLCAxKTtcbiAgICByZXR1cm4gcG9zQSAmJiBwb3NCICYmIHBvc0IudG9wIDwgcG9zQS5ib3R0b207XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVBdHRycyhzb3VyY2UsIHRhcmdldCkge1xuICAgIGZvciAobGV0IG5hbWUgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChuYW1lID09IFwiY2xhc3NcIiAmJiB0YXJnZXQuY2xhc3MpXG4gICAgICAgICAgICB0YXJnZXQuY2xhc3MgKz0gXCIgXCIgKyBzb3VyY2UuY2xhc3M7XG4gICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gXCJzdHlsZVwiICYmIHRhcmdldC5zdHlsZSlcbiAgICAgICAgICAgIHRhcmdldC5zdHlsZSArPSBcIjtcIiArIHNvdXJjZS5zdHlsZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGFyZ2V0W25hbWVdID0gc291cmNlW25hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuY29uc3Qgbm9BdHRycyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuZnVuY3Rpb24gYXR0cnNFcShhLCBiLCBpZ25vcmUpIHtcbiAgICBpZiAoYSA9PSBiKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWEpXG4gICAgICAgIGEgPSBub0F0dHJzO1xuICAgIGlmICghYilcbiAgICAgICAgYiA9IG5vQXR0cnM7XG4gICAgbGV0IGtleXNBID0gT2JqZWN0LmtleXMoYSksIGtleXNCID0gT2JqZWN0LmtleXMoYik7XG4gICAgaWYgKGtleXNBLmxlbmd0aCAtIChpZ25vcmUgJiYga2V5c0EuaW5kZXhPZihpZ25vcmUpID4gLTEgPyAxIDogMCkgIT1cbiAgICAgICAga2V5c0IubGVuZ3RoIC0gKGlnbm9yZSAmJiBrZXlzQi5pbmRleE9mKGlnbm9yZSkgPiAtMSA/IDEgOiAwKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGtleSBvZiBrZXlzQSkge1xuICAgICAgICBpZiAoa2V5ICE9IGlnbm9yZSAmJiAoa2V5c0IuaW5kZXhPZihrZXkpID09IC0xIHx8IGFba2V5XSAhPT0gYltrZXldKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB1cGRhdGVBdHRycyhkb20sIHByZXYsIGF0dHJzKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBpZiAocHJldilcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBwcmV2KVxuICAgICAgICAgICAgaWYgKCEoYXR0cnMgJiYgbmFtZSBpbiBhdHRycykpIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBcInN0eWxlXCIpXG4gICAgICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5jc3NUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgaWYgKGF0dHJzKVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKVxuICAgICAgICAgICAgaWYgKCEocHJldiAmJiBwcmV2W25hbWVdID09IGF0dHJzW25hbWVdKSkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IFwic3R5bGVcIilcbiAgICAgICAgICAgICAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgPSBhdHRyc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUobmFtZSwgYXR0cnNbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgIHJldHVybiBjaGFuZ2VkO1xufVxuZnVuY3Rpb24gZ2V0QXR0cnMoZG9tKSB7XG4gICAgbGV0IGF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBhdHRyID0gZG9tLmF0dHJpYnV0ZXNbaV07XG4gICAgICAgIGF0dHJzW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gYXR0cnM7XG59XG5cbi8qKlxuV2lkZ2V0cyBhZGRlZCB0byB0aGUgY29udGVudCBhcmUgZGVzY3JpYmVkIGJ5IHN1YmNsYXNzZXMgb2YgdGhpc1xuY2xhc3MuIFVzaW5nIGEgZGVzY3JpcHRpb24gb2JqZWN0IGxpa2UgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0b1xuZGVsYXkgY3JlYXRpbmcgb2YgdGhlIERPTSBzdHJ1Y3R1cmUgZm9yIGEgd2lkZ2V0IHVudGlsIGl0IGlzXG5uZWVkZWQsIGFuZCB0byBhdm9pZCByZWRyYXdpbmcgd2lkZ2V0cyBldmVuIGlmIHRoZSBkZWNvcmF0aW9uc1xudGhhdCBkZWZpbmUgdGhlbSBhcmUgcmVjcmVhdGVkLlxuKi9cbmNsYXNzIFdpZGdldFR5cGUge1xuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyBpbnN0YW5jZSB0byBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSBzYW1lIHR5cGUuXG4gICAgKFR5cGVTY3JpcHQgY2FuJ3QgZXhwcmVzcyB0aGlzLCBidXQgb25seSBpbnN0YW5jZXMgb2YgdGhlIHNhbWVcbiAgICBzcGVjaWZpYyBjbGFzcyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4pIFRoaXMgaXMgdXNlZCB0b1xuICAgIGF2b2lkIHJlZHJhd2luZyB3aWRnZXRzIHdoZW4gdGhleSBhcmUgcmVwbGFjZWQgYnkgYSBuZXdcbiAgICBkZWNvcmF0aW9uIG9mIHRoZSBzYW1lIHR5cGUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3RcbiAgICByZXR1cm5zIGBmYWxzZWAsIHdoaWNoIHdpbGwgY2F1c2UgbmV3IGluc3RhbmNlcyBvZiB0aGUgd2lkZ2V0IHRvXG4gICAgYWx3YXlzIGJlIHJlZHJhd24uXG4gICAgKi9cbiAgICBlcSh3aWRnZXQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgVXBkYXRlIGEgRE9NIGVsZW1lbnQgY3JlYXRlZCBieSBhIHdpZGdldCBvZiB0aGUgc2FtZSB0eXBlIChidXRcbiAgICBkaWZmZXJlbnQsIG5vbi1gZXFgIGNvbnRlbnQpIHRvIHJlZmxlY3QgdGhpcyB3aWRnZXQuIE1heSByZXR1cm5cbiAgICB0cnVlIHRvIGluZGljYXRlIHRoYXQgaXQgY291bGQgdXBkYXRlLCBmYWxzZSB0byBpbmRpY2F0ZSBpdFxuICAgIGNvdWxkbid0IChpbiB3aGljaCBjYXNlIHRoZSB3aWRnZXQgd2lsbCBiZSByZWRyYXduKS4gVGhlIGRlZmF1bHRcbiAgICBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgZmFsc2UuXG4gICAgKi9cbiAgICB1cGRhdGVET00oZG9tLCB2aWV3KSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcGFyZShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fCB0aGlzLmNvbnN0cnVjdG9yID09IG90aGVyLmNvbnN0cnVjdG9yICYmIHRoaXMuZXEob3RoZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZXN0aW1hdGVkIGhlaWdodCB0aGlzIHdpZGdldCB3aWxsIGhhdmUsIHRvIGJlIHVzZWQgd2hlblxuICAgIGVzdGltYXRpbmcgdGhlIGhlaWdodCBvZiBjb250ZW50IHRoYXQgaGFzbid0IGJlZW4gZHJhd24uIE1heVxuICAgIHJldHVybiAtMSB0byBpbmRpY2F0ZSB5b3UgZG9uJ3Qga25vdy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25cbiAgICByZXR1cm5zIC0xLlxuICAgICovXG4gICAgZ2V0IGVzdGltYXRlZEhlaWdodCgpIHsgcmV0dXJuIC0xOyB9XG4gICAgLyoqXG4gICAgRm9yIGlubGluZSB3aWRnZXRzIHRoYXQgYXJlIGRpc3BsYXllZCBpbmxpbmUgKGFzIG9wcG9zZWQgdG9cbiAgICBgaW5saW5lLWJsb2NrYCkgYW5kIGludHJvZHVjZSBsaW5lIGJyZWFrcyAodGhyb3VnaCBgPGJyPmAgdGFnc1xuICAgIG9yIHRleHR1YWwgbmV3bGluZXMpLCB0aGlzIG11c3QgaW5kaWNhdGUgdGhlIGFtb3VudCBvZiBsaW5lXG4gICAgYnJlYWtzIHRoZXkgaW50cm9kdWNlLiBEZWZhdWx0cyB0byAwLlxuICAgICovXG4gICAgZ2V0IGxpbmVCcmVha3MoKSB7IHJldHVybiAwOyB9XG4gICAgLyoqXG4gICAgQ2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHdoaWNoIGtpbmRzIG9mIGV2ZW50cyBpbnNpZGUgdGhlIHdpZGdldFxuICAgIHNob3VsZCBiZSBpZ25vcmVkIGJ5IHRoZSBlZGl0b3IuIFRoZSBkZWZhdWx0IGlzIHRvIGlnbm9yZSBhbGxcbiAgICBldmVudHMuXG4gICAgKi9cbiAgICBpZ25vcmVFdmVudChldmVudCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIC8qKlxuICAgIE92ZXJyaWRlIHRoZSB3YXkgc2NyZWVuIGNvb3JkaW5hdGVzIGZvciBwb3NpdGlvbnMgYXQvaW4gdGhlXG4gICAgd2lkZ2V0IGFyZSBmb3VuZC4gYHBvc2Agd2lsbCBiZSB0aGUgb2Zmc2V0IGludG8gdGhlIHdpZGdldCwgYW5kXG4gICAgYHNpZGVgIHRoZSBzaWRlIG9mIHRoZSBwb3NpdGlvbiB0aGF0IGlzIGJlaW5nIHF1ZXJpZWRcdTIwMTRsZXNzIHRoYW5cbiAgICB6ZXJvIGZvciBiZWZvcmUsIGdyZWF0ZXIgdGhhbiB6ZXJvIGZvciBhZnRlciwgYW5kIHplcm8gZm9yXG4gICAgZGlyZWN0bHkgYXQgdGhhdCBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGNvb3Jkc0F0KGRvbSwgcG9zLCBzaWRlKSB7IHJldHVybiBudWxsOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGVkaXRhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhbiBpbnN0YW5jZSBvZiB0aGUgd2lkZ2V0IGlzIHJlbW92ZWRcbiAgICBmcm9tIHRoZSBlZGl0b3Igdmlldy5cbiAgICAqL1xuICAgIGRlc3Ryb3koZG9tKSB7IH1cbn1cbi8qKlxuVGhlIGRpZmZlcmVudCB0eXBlcyBvZiBibG9ja3MgdGhhdCBjYW4gb2NjdXIgaW4gYW4gZWRpdG9yIHZpZXcuXG4qL1xudmFyIEJsb2NrVHlwZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEJsb2NrVHlwZSkge1xuICAgIC8qKlxuICAgIEEgbGluZSBvZiB0ZXh0LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIlRleHRcIl0gPSAwXSA9IFwiVGV4dFwiO1xuICAgIC8qKlxuICAgIEEgYmxvY2sgd2lkZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9zaXRpb24gYWZ0ZXIgaXQuXG4gICAgKi9cbiAgICBCbG9ja1R5cGVbQmxvY2tUeXBlW1wiV2lkZ2V0QmVmb3JlXCJdID0gMV0gPSBcIldpZGdldEJlZm9yZVwiO1xuICAgIC8qKlxuICAgIEEgYmxvY2sgd2lkZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9zaXRpb24gYmVmb3JlIGl0LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIldpZGdldEFmdGVyXCJdID0gMl0gPSBcIldpZGdldEFmdGVyXCI7XG4gICAgLyoqXG4gICAgQSBibG9jayB3aWRnZXQgW3JlcGxhY2luZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb25ecmVwbGFjZSkgYSByYW5nZSBvZiBjb250ZW50LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIldpZGdldFJhbmdlXCJdID0gM10gPSBcIldpZGdldFJhbmdlXCI7XG5yZXR1cm4gQmxvY2tUeXBlfSkoQmxvY2tUeXBlIHx8IChCbG9ja1R5cGUgPSB7fSkpO1xuLyoqXG5BIGRlY29yYXRpb24gcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gaG93IHRvIGRyYXcgb3Igc3R5bGUgYSBwaWVjZVxub2YgY29udGVudC4gWW91J2xsIHVzdWFsbHkgdXNlIGl0IHdyYXBwZWQgaW4gYVxuW2BSYW5nZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpLCB3aGljaCBhZGRzIGEgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbi5cbkBub25hYnN0cmFjdFxuKi9cbmNsYXNzIERlY29yYXRpb24gZXh0ZW5kcyBSYW5nZVZhbHVlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXJ0U2lkZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlbmRTaWRlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHdpZGdldCwgXG4gICAgLyoqXG4gICAgVGhlIGNvbmZpZyBvYmplY3QgdXNlZCB0byBjcmVhdGUgdGhpcyBkZWNvcmF0aW9uLiBZb3UgY2FuXG4gICAgaW5jbHVkZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaW4gdGhlcmUgdG8gc3RvcmUgbWV0YWRhdGEgYWJvdXRcbiAgICB5b3VyIGRlY29yYXRpb24uXG4gICAgKi9cbiAgICBzcGVjKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc3RhcnRTaWRlID0gc3RhcnRTaWRlO1xuICAgICAgICB0aGlzLmVuZFNpZGUgPSBlbmRTaWRlO1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaGVpZ2h0UmVsZXZhbnQoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcmsgZGVjb3JhdGlvbiwgd2hpY2ggaW5mbHVlbmNlcyB0aGUgc3R5bGluZyBvZiB0aGVcbiAgICBjb250ZW50IGluIGl0cyByYW5nZS4gTmVzdGVkIG1hcmsgZGVjb3JhdGlvbnMgd2lsbCBjYXVzZSBuZXN0ZWRcbiAgICBET00gZWxlbWVudHMgdG8gYmUgY3JlYXRlZC4gTmVzdGluZyBvcmRlciBpcyBkZXRlcm1pbmVkIGJ5XG4gICAgcHJlY2VkZW5jZSBvZiB0aGUgW2ZhY2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15kZWNvcmF0aW9ucyksIHdpdGhcbiAgICB0aGUgaGlnaGVyLXByZWNlZGVuY2UgZGVjb3JhdGlvbnMgY3JlYXRpbmcgdGhlIGlubmVyIERPTSBub2Rlcy5cbiAgICBTdWNoIGVsZW1lbnRzIGFyZSBzcGxpdCBvbiBsaW5lIGJvdW5kYXJpZXMgYW5kIG9uIHRoZSBib3VuZGFyaWVzXG4gICAgb2YgbG93ZXItcHJlY2VkZW5jZSBkZWNvcmF0aW9ucy5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXJrKHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrRGVjb3JhdGlvbihzcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgd2lkZ2V0IGRlY29yYXRpb24sIHdoaWNoIGRpc3BsYXlzIGEgRE9NIGVsZW1lbnQgYXQgdGhlXG4gICAgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgd2lkZ2V0KHNwZWMpIHtcbiAgICAgICAgbGV0IHNpZGUgPSBNYXRoLm1heCgtMTAwMDAsIE1hdGgubWluKDEwMDAwLCBzcGVjLnNpZGUgfHwgMCkpLCBibG9jayA9ICEhc3BlYy5ibG9jaztcbiAgICAgICAgc2lkZSArPSAoYmxvY2sgJiYgIXNwZWMuaW5saW5lT3JkZXIpXG4gICAgICAgICAgICA/IChzaWRlID4gMCA/IDMwMDAwMDAwMCAvKiBTaWRlLkJsb2NrQWZ0ZXIgKi8gOiAtNDAwMDAwMDAwIC8qIFNpZGUuQmxvY2tCZWZvcmUgKi8pXG4gICAgICAgICAgICA6IChzaWRlID4gMCA/IDEwMDAwMDAwMCAvKiBTaWRlLklubGluZUFmdGVyICovIDogLTEwMDAwMDAwMCAvKiBTaWRlLklubGluZUJlZm9yZSAqLyk7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnREZWNvcmF0aW9uKHNwZWMsIHNpZGUsIHNpZGUsIGJsb2NrLCBzcGVjLndpZGdldCB8fCBudWxsLCBmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJlcGxhY2UgZGVjb3JhdGlvbiB3aGljaCByZXBsYWNlcyB0aGUgZ2l2ZW4gcmFuZ2Ugd2l0aFxuICAgIGEgd2lkZ2V0LCBvciBzaW1wbHkgaGlkZXMgaXQuXG4gICAgKi9cbiAgICBzdGF0aWMgcmVwbGFjZShzcGVjKSB7XG4gICAgICAgIGxldCBibG9jayA9ICEhc3BlYy5ibG9jaywgc3RhcnRTaWRlLCBlbmRTaWRlO1xuICAgICAgICBpZiAoc3BlYy5pc0Jsb2NrR2FwKSB7XG4gICAgICAgICAgICBzdGFydFNpZGUgPSAtNTAwMDAwMDAwIC8qIFNpZGUuR2FwU3RhcnQgKi87XG4gICAgICAgICAgICBlbmRTaWRlID0gNDAwMDAwMDAwIC8qIFNpZGUuR2FwRW5kICovO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHsgc3RhcnQsIGVuZCB9ID0gZ2V0SW5jbHVzaXZlKHNwZWMsIGJsb2NrKTtcbiAgICAgICAgICAgIHN0YXJ0U2lkZSA9IChzdGFydCA/IChibG9jayA/IC0zMDAwMDAwMDAgLyogU2lkZS5CbG9ja0luY1N0YXJ0ICovIDogLTEgLyogU2lkZS5JbmxpbmVJbmNTdGFydCAqLykgOiA1MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNTdGFydCAqLykgLSAxO1xuICAgICAgICAgICAgZW5kU2lkZSA9IChlbmQgPyAoYmxvY2sgPyAyMDAwMDAwMDAgLyogU2lkZS5CbG9ja0luY0VuZCAqLyA6IDEgLyogU2lkZS5JbmxpbmVJbmNFbmQgKi8pIDogLTYwMDAwMDAwMCAvKiBTaWRlLk5vbkluY0VuZCAqLykgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnREZWNvcmF0aW9uKHNwZWMsIHN0YXJ0U2lkZSwgZW5kU2lkZSwgYmxvY2ssIHNwZWMud2lkZ2V0IHx8IG51bGwsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBsaW5lIGRlY29yYXRpb24sIHdoaWNoIGNhbiBhZGQgRE9NIGF0dHJpYnV0ZXMgdG8gdGhlXG4gICAgbGluZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgbGluZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGluZURlY29yYXRpb24oc3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEJ1aWxkIGEgW2BEZWNvcmF0aW9uU2V0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb25TZXQpIGZyb20gdGhlIGdpdmVuXG4gICAgZGVjb3JhdGVkIHJhbmdlIG9yIHJhbmdlcy4gSWYgdGhlIHJhbmdlcyBhcmVuJ3QgYWxyZWFkeSBzb3J0ZWQsXG4gICAgcGFzcyBgdHJ1ZWAgZm9yIGBzb3J0YCB0byBtYWtlIHRoZSBsaWJyYXJ5IHNvcnQgdGhlbSBmb3IgeW91LlxuICAgICovXG4gICAgc3RhdGljIHNldChvZiwgc29ydCA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBSYW5nZVNldC5vZihvZiwgc29ydCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaGFzSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy53aWRnZXQgPyB0aGlzLndpZGdldC5lc3RpbWF0ZWRIZWlnaHQgPiAtMSA6IGZhbHNlOyB9XG59XG4vKipcblRoZSBlbXB0eSBzZXQgb2YgZGVjb3JhdGlvbnMuXG4qL1xuRGVjb3JhdGlvbi5ub25lID0gUmFuZ2VTZXQuZW1wdHk7XG5jbGFzcyBNYXJrRGVjb3JhdGlvbiBleHRlbmRzIERlY29yYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNwZWMpIHtcbiAgICAgICAgbGV0IHsgc3RhcnQsIGVuZCB9ID0gZ2V0SW5jbHVzaXZlKHNwZWMpO1xuICAgICAgICBzdXBlcihzdGFydCA/IC0xIC8qIFNpZGUuSW5saW5lSW5jU3RhcnQgKi8gOiA1MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNTdGFydCAqLywgZW5kID8gMSAvKiBTaWRlLklubGluZUluY0VuZCAqLyA6IC02MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNFbmQgKi8sIG51bGwsIHNwZWMpO1xuICAgICAgICB0aGlzLnRhZ05hbWUgPSBzcGVjLnRhZ05hbWUgfHwgXCJzcGFuXCI7XG4gICAgICAgIHRoaXMuY2xhc3MgPSBzcGVjLmNsYXNzIHx8IFwiXCI7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBzcGVjLmF0dHJpYnV0ZXMgfHwgbnVsbDtcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHxcbiAgICAgICAgICAgIG90aGVyIGluc3RhbmNlb2YgTWFya0RlY29yYXRpb24gJiZcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ05hbWUgPT0gb3RoZXIudGFnTmFtZSAmJlxuICAgICAgICAgICAgICAgICh0aGlzLmNsYXNzIHx8ICgoX2EgPSB0aGlzLmF0dHJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xhc3MpKSA9PSAob3RoZXIuY2xhc3MgfHwgKChfYiA9IG90aGVyLmF0dHJzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2xhc3MpKSAmJlxuICAgICAgICAgICAgICAgIGF0dHJzRXEodGhpcy5hdHRycywgb3RoZXIuYXR0cnMsIFwiY2xhc3NcIik7XG4gICAgfVxuICAgIHJhbmdlKGZyb20sIHRvID0gZnJvbSkge1xuICAgICAgICBpZiAoZnJvbSA+PSB0bylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTWFyayBkZWNvcmF0aW9ucyBtYXkgbm90IGJlIGVtcHR5XCIpO1xuICAgICAgICByZXR1cm4gc3VwZXIucmFuZ2UoZnJvbSwgdG8pO1xuICAgIH1cbn1cbk1hcmtEZWNvcmF0aW9uLnByb3RvdHlwZS5wb2ludCA9IGZhbHNlO1xuY2xhc3MgTGluZURlY29yYXRpb24gZXh0ZW5kcyBEZWNvcmF0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIHN1cGVyKC0yMDAwMDAwMDAgLyogU2lkZS5MaW5lICovLCAtMjAwMDAwMDAwIC8qIFNpZGUuTGluZSAqLywgbnVsbCwgc3BlYyk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIExpbmVEZWNvcmF0aW9uICYmXG4gICAgICAgICAgICB0aGlzLnNwZWMuY2xhc3MgPT0gb3RoZXIuc3BlYy5jbGFzcyAmJlxuICAgICAgICAgICAgYXR0cnNFcSh0aGlzLnNwZWMuYXR0cmlidXRlcywgb3RoZXIuc3BlYy5hdHRyaWJ1dGVzKTtcbiAgICB9XG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGlmICh0byAhPSBmcm9tKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJMaW5lIGRlY29yYXRpb24gcmFuZ2VzIG11c3QgYmUgemVyby1sZW5ndGhcIik7XG4gICAgICAgIHJldHVybiBzdXBlci5yYW5nZShmcm9tLCB0byk7XG4gICAgfVxufVxuTGluZURlY29yYXRpb24ucHJvdG90eXBlLm1hcE1vZGUgPSBNYXBNb2RlLlRyYWNrQmVmb3JlO1xuTGluZURlY29yYXRpb24ucHJvdG90eXBlLnBvaW50ID0gdHJ1ZTtcbmNsYXNzIFBvaW50RGVjb3JhdGlvbiBleHRlbmRzIERlY29yYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNwZWMsIHN0YXJ0U2lkZSwgZW5kU2lkZSwgYmxvY2ssIHdpZGdldCwgaXNSZXBsYWNlKSB7XG4gICAgICAgIHN1cGVyKHN0YXJ0U2lkZSwgZW5kU2lkZSwgd2lkZ2V0LCBzcGVjKTtcbiAgICAgICAgdGhpcy5ibG9jayA9IGJsb2NrO1xuICAgICAgICB0aGlzLmlzUmVwbGFjZSA9IGlzUmVwbGFjZTtcbiAgICAgICAgdGhpcy5tYXBNb2RlID0gIWJsb2NrID8gTWFwTW9kZS5UcmFja0RlbCA6IHN0YXJ0U2lkZSA8PSAwID8gTWFwTW9kZS5UcmFja0JlZm9yZSA6IE1hcE1vZGUuVHJhY2tBZnRlcjtcbiAgICB9XG4gICAgLy8gT25seSByZWxldmFudCB3aGVuIHRoaXMuYmxvY2sgPT0gdHJ1ZVxuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydFNpZGUgIT0gdGhpcy5lbmRTaWRlID8gQmxvY2tUeXBlLldpZGdldFJhbmdlXG4gICAgICAgICAgICA6IHRoaXMuc3RhcnRTaWRlIDw9IDAgPyBCbG9ja1R5cGUuV2lkZ2V0QmVmb3JlIDogQmxvY2tUeXBlLldpZGdldEFmdGVyO1xuICAgIH1cbiAgICBnZXQgaGVpZ2h0UmVsZXZhbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsb2NrIHx8ICEhdGhpcy53aWRnZXQgJiYgKHRoaXMud2lkZ2V0LmVzdGltYXRlZEhlaWdodCA+PSA1IHx8IHRoaXMud2lkZ2V0LmxpbmVCcmVha3MgPiAwKTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgUG9pbnREZWNvcmF0aW9uICYmXG4gICAgICAgICAgICB3aWRnZXRzRXEodGhpcy53aWRnZXQsIG90aGVyLndpZGdldCkgJiZcbiAgICAgICAgICAgIHRoaXMuYmxvY2sgPT0gb3RoZXIuYmxvY2sgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTaWRlID09IG90aGVyLnN0YXJ0U2lkZSAmJiB0aGlzLmVuZFNpZGUgPT0gb3RoZXIuZW5kU2lkZTtcbiAgICB9XG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVwbGFjZSAmJiAoZnJvbSA+IHRvIHx8IChmcm9tID09IHRvICYmIHRoaXMuc3RhcnRTaWRlID4gMCAmJiB0aGlzLmVuZFNpZGUgPD0gMCkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHJhbmdlIGZvciByZXBsYWNlbWVudCBkZWNvcmF0aW9uXCIpO1xuICAgICAgICBpZiAoIXRoaXMuaXNSZXBsYWNlICYmIHRvICE9IGZyb20pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIldpZGdldCBkZWNvcmF0aW9ucyBjYW4gb25seSBoYXZlIHplcm8tbGVuZ3RoIHJhbmdlc1wiKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnJhbmdlKGZyb20sIHRvKTtcbiAgICB9XG59XG5Qb2ludERlY29yYXRpb24ucHJvdG90eXBlLnBvaW50ID0gdHJ1ZTtcbmZ1bmN0aW9uIGdldEluY2x1c2l2ZShzcGVjLCBibG9jayA9IGZhbHNlKSB7XG4gICAgbGV0IHsgaW5jbHVzaXZlU3RhcnQ6IHN0YXJ0LCBpbmNsdXNpdmVFbmQ6IGVuZCB9ID0gc3BlYztcbiAgICBpZiAoc3RhcnQgPT0gbnVsbClcbiAgICAgICAgc3RhcnQgPSBzcGVjLmluY2x1c2l2ZTtcbiAgICBpZiAoZW5kID09IG51bGwpXG4gICAgICAgIGVuZCA9IHNwZWMuaW5jbHVzaXZlO1xuICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydCAhPT0gbnVsbCAmJiBzdGFydCAhPT0gdm9pZCAwID8gc3RhcnQgOiBibG9jaywgZW5kOiBlbmQgIT09IG51bGwgJiYgZW5kICE9PSB2b2lkIDAgPyBlbmQgOiBibG9jayB9O1xufVxuZnVuY3Rpb24gd2lkZ2V0c0VxKGEsIGIpIHtcbiAgICByZXR1cm4gYSA9PSBiIHx8ICEhKGEgJiYgYiAmJiBhLmNvbXBhcmUoYikpO1xufVxuZnVuY3Rpb24gYWRkUmFuZ2UoZnJvbSwgdG8sIHJhbmdlcywgbWFyZ2luID0gMCkge1xuICAgIGxldCBsYXN0ID0gcmFuZ2VzLmxlbmd0aCAtIDE7XG4gICAgaWYgKGxhc3QgPj0gMCAmJiByYW5nZXNbbGFzdF0gKyBtYXJnaW4gPj0gZnJvbSlcbiAgICAgICAgcmFuZ2VzW2xhc3RdID0gTWF0aC5tYXgocmFuZ2VzW2xhc3RdLCB0byk7XG4gICAgZWxzZVxuICAgICAgICByYW5nZXMucHVzaChmcm9tLCB0byk7XG59XG5cbmNsYXNzIExpbmVWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBudWxsO1xuICAgICAgICB0aGlzLmJyZWFrQWZ0ZXIgPSAwO1xuICAgIH1cbiAgICAvLyBDb25zdW1lcyBzb3VyY2VcbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBoYXNTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmICghKHNvdXJjZSBpbnN0YW5jZW9mIExpbmVWaWV3KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZG9tKVxuICAgICAgICAgICAgICAgIHNvdXJjZS50cmFuc2ZlckRPTSh0aGlzKTsgLy8gUmV1c2Ugc291cmNlLmRvbSB3aGVuIGFwcHJvcHJpYXRlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1N0YXJ0KVxuICAgICAgICAgICAgdGhpcy5zZXREZWNvKHNvdXJjZSA/IHNvdXJjZS5hdHRycyA6IG51bGwpO1xuICAgICAgICBtZXJnZUNoaWxkcmVuSW50byh0aGlzLCBmcm9tLCB0bywgc291cmNlID8gc291cmNlLmNoaWxkcmVuLnNsaWNlKCkgOiBbXSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNwbGl0KGF0KSB7XG4gICAgICAgIGxldCBlbmQgPSBuZXcgTGluZVZpZXc7XG4gICAgICAgIGVuZC5icmVha0FmdGVyID0gdGhpcy5icmVha0FmdGVyO1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBlbmQ7XG4gICAgICAgIGxldCB7IGksIG9mZiB9ID0gdGhpcy5jaGlsZFBvcyhhdCk7XG4gICAgICAgIGlmIChvZmYpIHtcbiAgICAgICAgICAgIGVuZC5hcHBlbmQodGhpcy5jaGlsZHJlbltpXS5zcGxpdChvZmYpLCAwKTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0ubWVyZ2Uob2ZmLCB0aGlzLmNoaWxkcmVuW2ldLmxlbmd0aCwgbnVsbCwgZmFsc2UsIDAsIDApO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGorKylcbiAgICAgICAgICAgIGVuZC5hcHBlbmQodGhpcy5jaGlsZHJlbltqXSwgMCk7XG4gICAgICAgIHdoaWxlIChpID4gMCAmJiB0aGlzLmNoaWxkcmVuW2kgLSAxXS5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5bLS1pXS5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gaTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBhdDtcbiAgICAgICAgcmV0dXJuIGVuZDtcbiAgICB9XG4gICAgdHJhbnNmZXJET00ob3RoZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgb3RoZXIuc2V0RE9NKHRoaXMuZG9tKTtcbiAgICAgICAgb3RoZXIucHJldkF0dHJzID0gdGhpcy5wcmV2QXR0cnMgPT09IHVuZGVmaW5lZCA/IHRoaXMuYXR0cnMgOiB0aGlzLnByZXZBdHRycztcbiAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZG9tID0gbnVsbDtcbiAgICB9XG4gICAgc2V0RGVjbyhhdHRycykge1xuICAgICAgICBpZiAoIWF0dHJzRXEodGhpcy5hdHRycywgYXR0cnMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZBdHRycyA9IHRoaXMuYXR0cnM7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBlbmQoY2hpbGQsIG9wZW5TdGFydCkge1xuICAgICAgICBqb2luSW5saW5lSW50byh0aGlzLCBjaGlsZCwgb3BlblN0YXJ0KTtcbiAgICB9XG4gICAgLy8gT25seSBjYWxsZWQgd2hlbiBidWlsZGluZyBhIGxpbmUgdmlldyBpbiBDb250ZW50QnVpbGRlclxuICAgIGFkZExpbmVEZWNvKGRlY28pIHtcbiAgICAgICAgbGV0IGF0dHJzID0gZGVjby5zcGVjLmF0dHJpYnV0ZXMsIGNscyA9IGRlY28uc3BlYy5jbGFzcztcbiAgICAgICAgaWYgKGF0dHJzKVxuICAgICAgICAgICAgdGhpcy5hdHRycyA9IGNvbWJpbmVBdHRycyhhdHRycywgdGhpcy5hdHRycyB8fCB7fSk7XG4gICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICB0aGlzLmF0dHJzID0gY29tYmluZUF0dHJzKHsgY2xhc3M6IGNscyB9LCB0aGlzLmF0dHJzIHx8IHt9KTtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiBpbmxpbmVET01BdFBvcyh0aGlzLCBwb3MpO1xuICAgIH1cbiAgICByZXVzZURPTShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IFwiRElWXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5mbGFncyB8PSA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi8gfCAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzeW5jKHZpZXcsIHRyYWNrKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSkge1xuICAgICAgICAgICAgdGhpcy5zZXRET00oZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWxpbmVcIjtcbiAgICAgICAgICAgIHRoaXMucHJldkF0dHJzID0gdGhpcy5hdHRycyA/IG51bGwgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5mbGFncyAmIDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLykge1xuICAgICAgICAgICAgY2xlYXJBdHRyaWJ1dGVzKHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tbGluZVwiO1xuICAgICAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB0aGlzLmF0dHJzID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcmV2QXR0cnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdXBkYXRlQXR0cnModGhpcy5kb20sIHRoaXMucHJldkF0dHJzLCB0aGlzLmF0dHJzKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1saW5lXCIpO1xuICAgICAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuc3luYyh2aWV3LCB0cmFjayk7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5kb20ubGFzdENoaWxkO1xuICAgICAgICB3aGlsZSAobGFzdCAmJiBDb250ZW50Vmlldy5nZXQobGFzdCkgaW5zdGFuY2VvZiBNYXJrVmlldylcbiAgICAgICAgICAgIGxhc3QgPSBsYXN0Lmxhc3RDaGlsZDtcbiAgICAgICAgaWYgKCFsYXN0IHx8ICF0aGlzLmxlbmd0aCB8fFxuICAgICAgICAgICAgbGFzdC5ub2RlTmFtZSAhPSBcIkJSXCIgJiYgKChfYSA9IENvbnRlbnRWaWV3LmdldChsYXN0KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzRWRpdGFibGUpID09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgKCFicm93c2VyLmlvcyB8fCAhdGhpcy5jaGlsZHJlbi5zb21lKGNoID0+IGNoIGluc3RhbmNlb2YgVGV4dFZpZXcpKSkge1xuICAgICAgICAgICAgbGV0IGhhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiQlJcIik7XG4gICAgICAgICAgICBoYWNrLmNtSWdub3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGhhY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1lYXN1cmVUZXh0U2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09IDAgfHwgdGhpcy5sZW5ndGggPiAyMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IDAsIHRleHRIZWlnaHQ7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgVGV4dFZpZXcpIHx8IC9bXiAtfl0vLnRlc3QoY2hpbGQudGV4dCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBsZXQgcmVjdHMgPSBjbGllbnRSZWN0c0ZvcihjaGlsZC5kb20pO1xuICAgICAgICAgICAgaWYgKHJlY3RzLmxlbmd0aCAhPSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgdG90YWxXaWR0aCArPSByZWN0c1swXS53aWR0aDtcbiAgICAgICAgICAgIHRleHRIZWlnaHQgPSByZWN0c1swXS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF0b3RhbFdpZHRoID8gbnVsbCA6IHtcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCxcbiAgICAgICAgICAgIGNoYXJXaWR0aDogdG90YWxXaWR0aCAvIHRoaXMubGVuZ3RoLFxuICAgICAgICAgICAgdGV4dEhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IHJlY3QgPSBjb29yZHNJbkNoaWxkcmVuKHRoaXMsIHBvcywgc2lkZSk7XG4gICAgICAgIC8vIENvcnJlY3QgcmVjdGFuZ2xlIGhlaWdodCBmb3IgZW1wdHkgbGluZXMgd2hlbiB0aGUgcmV0dXJuZWRcbiAgICAgICAgLy8gaGVpZ2h0IGlzIGxhcmdlciB0aGFuIHRoZSB0ZXh0IGhlaWdodC5cbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuLmxlbmd0aCAmJiByZWN0ICYmIHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBsZXQgeyBoZWlnaHRPcmFjbGUgfSA9IHRoaXMucGFyZW50LnZpZXcudmlld1N0YXRlLCBoZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wO1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGhlaWdodCAtIGhlaWdodE9yYWNsZS5saW5lSGVpZ2h0KSA8IDIgJiYgaGVpZ2h0T3JhY2xlLnRleHRIZWlnaHQgPCBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzdCA9IChoZWlnaHQgLSBoZWlnaHRPcmFjbGUudGV4dEhlaWdodCkgLyAyO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHRvcDogcmVjdC50b3AgKyBkaXN0LCBib3R0b206IHJlY3QuYm90dG9tIC0gZGlzdCwgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5sZWZ0IH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgfVxuICAgIGJlY29tZShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBMaW5lVmlldyAmJiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PSAwICYmIG90aGVyLmNoaWxkcmVuLmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgICBhdHRyc0VxKHRoaXMuYXR0cnMsIG90aGVyLmF0dHJzKSAmJiB0aGlzLmJyZWFrQWZ0ZXIgPT0gb3RoZXIuYnJlYWtBZnRlcjtcbiAgICB9XG4gICAgY292ZXJzKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIHN0YXRpYyBmaW5kKGRvY1ZpZXcsIHBvcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgb2ZmID0gMDsgaSA8IGRvY1ZpZXcuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBibG9jayA9IGRvY1ZpZXcuY2hpbGRyZW5baV0sIGVuZCA9IG9mZiArIGJsb2NrLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrIGluc3RhbmNlb2YgTGluZVZpZXcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9jaztcbiAgICAgICAgICAgICAgICBpZiAoZW5kID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IGVuZCArIGJsb2NrLmJyZWFrQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuY2xhc3MgQmxvY2tXaWRnZXRWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKHdpZGdldCwgbGVuZ3RoLCBkZWNvKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5kZWNvID0gZGVjbztcbiAgICAgICAgdGhpcy5icmVha0FmdGVyID0gMDtcbiAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gbnVsbDtcbiAgICB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSwgX3Rha2VEZWNvLCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiAoIShzb3VyY2UgaW5zdGFuY2VvZiBCbG9ja1dpZGdldFZpZXcpIHx8ICF0aGlzLndpZGdldC5jb21wYXJlKHNvdXJjZS53aWRnZXQpIHx8XG4gICAgICAgICAgICBmcm9tID4gMCAmJiBvcGVuU3RhcnQgPD0gMCB8fCB0byA8IHRoaXMubGVuZ3RoICYmIG9wZW5FbmQgPD0gMCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gZnJvbSArIChzb3VyY2UgPyBzb3VyY2UubGVuZ3RoIDogMCkgKyAodGhpcy5sZW5ndGggLSB0byk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIHBvcyA9PSAwID8gRE9NUG9zLmJlZm9yZSh0aGlzLmRvbSkgOiBET01Qb3MuYWZ0ZXIodGhpcy5kb20sIHBvcyA9PSB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICAgIHNwbGl0KGF0KSB7XG4gICAgICAgIGxldCBsZW4gPSB0aGlzLmxlbmd0aCAtIGF0O1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGF0O1xuICAgICAgICBsZXQgZW5kID0gbmV3IEJsb2NrV2lkZ2V0Vmlldyh0aGlzLndpZGdldCwgbGVuLCB0aGlzLmRlY28pO1xuICAgICAgICBlbmQuYnJlYWtBZnRlciA9IHRoaXMuYnJlYWtBZnRlcjtcbiAgICAgICAgcmV0dXJuIGVuZDtcbiAgICB9XG4gICAgZ2V0IGNoaWxkcmVuKCkgeyByZXR1cm4gbm9DaGlsZHJlbjsgfVxuICAgIHN5bmModmlldykge1xuICAgICAgICBpZiAoIXRoaXMuZG9tIHx8ICF0aGlzLndpZGdldC51cGRhdGVET00odGhpcy5kb20sIHZpZXcpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgdGhpcy5wcmV2V2lkZ2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucHJldldpZGdldC5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMucHJldldpZGdldCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNldERPTSh0aGlzLndpZGdldC50b0RPTSh2aWV3KSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMud2lkZ2V0LmVkaXRhYmxlKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC52aWV3LnN0YXRlLmRvYy5zbGljZSh0aGlzLnBvc0F0U3RhcnQsIHRoaXMucG9zQXRFbmQpIDogVGV4dC5lbXB0eTtcbiAgICB9XG4gICAgZG9tQm91bmRzQXJvdW5kKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGJlY29tZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBCbG9ja1dpZGdldFZpZXcgJiZcbiAgICAgICAgICAgIG90aGVyLndpZGdldC5jb25zdHJ1Y3RvciA9PSB0aGlzLndpZGdldC5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgaWYgKCFvdGhlci53aWRnZXQuY29tcGFyZSh0aGlzLndpZGdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgIXRoaXMucHJldldpZGdldClcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSB0aGlzLndpZGdldDtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0ID0gb3RoZXIud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBvdGhlci5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmRlY28gPSBvdGhlci5kZWNvO1xuICAgICAgICAgICAgdGhpcy5icmVha0FmdGVyID0gb3RoZXIuYnJlYWtBZnRlcjtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24oKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWdub3JlRXZlbnQoZXZlbnQpIHsgcmV0dXJuIHRoaXMud2lkZ2V0Lmlnbm9yZUV2ZW50KGV2ZW50KTsgfVxuICAgIGdldCBpc0VkaXRhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBnZXQgaXNXaWRnZXQoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgY29vcmRzQXQocG9zLCBzaWRlKSB7XG4gICAgICAgIGxldCBjdXN0b20gPSB0aGlzLndpZGdldC5jb29yZHNBdCh0aGlzLmRvbSwgcG9zLCBzaWRlKTtcbiAgICAgICAgaWYgKGN1c3RvbSlcbiAgICAgICAgICAgIHJldHVybiBjdXN0b207XG4gICAgICAgIGlmICh0aGlzLndpZGdldCBpbnN0YW5jZW9mIEJsb2NrR2FwV2lkZ2V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBmbGF0dGVuUmVjdCh0aGlzLmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgdGhpcy5sZW5ndGggPyBwb3MgPT0gMCA6IHNpZGUgPD0gMCk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy53aWRnZXQuZGVzdHJveSh0aGlzLmRvbSk7XG4gICAgfVxuICAgIGNvdmVycyhzaWRlKSB7XG4gICAgICAgIGxldCB7IHN0YXJ0U2lkZSwgZW5kU2lkZSB9ID0gdGhpcy5kZWNvO1xuICAgICAgICByZXR1cm4gc3RhcnRTaWRlID09IGVuZFNpZGUgPyBmYWxzZSA6IHNpZGUgPCAwID8gc3RhcnRTaWRlIDwgMCA6IGVuZFNpZGUgPiAwO1xuICAgIH1cbn1cbmNsYXNzIEJsb2NrR2FwV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IoaGVpZ2h0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIH1cbiAgICB0b0RPTSgpIHtcbiAgICAgICAgbGV0IGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGVsdC5jbGFzc05hbWUgPSBcImNtLWdhcFwiO1xuICAgICAgICB0aGlzLnVwZGF0ZURPTShlbHQpO1xuICAgICAgICByZXR1cm4gZWx0O1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIuaGVpZ2h0ID09IHRoaXMuaGVpZ2h0OyB9XG4gICAgdXBkYXRlRE9NKGVsdCkge1xuICAgICAgICBlbHQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBcInB4XCI7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgZWRpdGFibGUoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IGVzdGltYXRlZEhlaWdodCgpIHsgcmV0dXJuIHRoaXMuaGVpZ2h0OyB9XG4gICAgaWdub3JlRXZlbnQoKSB7IHJldHVybiBmYWxzZTsgfVxufVxuXG5jbGFzcyBDb250ZW50QnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IoZG9jLCBwb3MsIGVuZCwgZGlzYWxsb3dCbG9ja0VmZmVjdHNGb3IpIHtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmVuZCA9IGVuZDtcbiAgICAgICAgdGhpcy5kaXNhbGxvd0Jsb2NrRWZmZWN0c0ZvciA9IGRpc2FsbG93QmxvY2tFZmZlY3RzRm9yO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJMaW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy5icmVha0F0U3RhcnQgPSAwO1xuICAgICAgICB0aGlzLnBlbmRpbmdCdWZmZXIgPSAwIC8qIEJ1Zi5ObyAqLztcbiAgICAgICAgdGhpcy5idWZmZXJNYXJrcyA9IFtdO1xuICAgICAgICAvLyBTZXQgdG8gZmFsc2UgZGlyZWN0bHkgYWZ0ZXIgYSB3aWRnZXQgdGhhdCBjb3ZlcnMgdGhlIHBvc2l0aW9uIGFmdGVyIGl0XG4gICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICB0aGlzLm9wZW5TdGFydCA9IC0xO1xuICAgICAgICB0aGlzLm9wZW5FbmQgPSAtMTtcbiAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy50ZXh0T2ZmID0gMDtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBkb2MuaXRlcigpO1xuICAgICAgICB0aGlzLnNraXAgPSBwb3M7XG4gICAgfVxuICAgIHBvc0NvdmVyZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuYnJlYWtBdFN0YXJ0ICYmIHRoaXMuZG9jLmxpbmVBdCh0aGlzLnBvcykuZnJvbSAhPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdO1xuICAgICAgICByZXR1cm4gIShsYXN0LmJyZWFrQWZ0ZXIgfHwgbGFzdCBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldyAmJiBsYXN0LmRlY28uZW5kU2lkZSA8IDApO1xuICAgIH1cbiAgICBnZXRMaW5lKCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VyTGluZSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50LnB1c2godGhpcy5jdXJMaW5lID0gbmV3IExpbmVWaWV3KTtcbiAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmN1ckxpbmU7XG4gICAgfVxuICAgIGZsdXNoQnVmZmVyKGFjdGl2ZSA9IHRoaXMuYnVmZmVyTWFya3MpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5jdXJMaW5lLmFwcGVuZCh3cmFwTWFya3MobmV3IFdpZGdldEJ1ZmZlclZpZXcoLTEpLCBhY3RpdmUpLCBhY3RpdmUubGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZEJsb2NrV2lkZ2V0KHZpZXcpIHtcbiAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmN1ckxpbmUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbnRlbnQucHVzaCh2aWV3KTtcbiAgICB9XG4gICAgZmluaXNoKG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlciAmJiBvcGVuRW5kIDw9IHRoaXMuYnVmZmVyTWFya3MubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcigpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdCdWZmZXIgPSAwIC8qIEJ1Zi5ObyAqLztcbiAgICAgICAgaWYgKCF0aGlzLnBvc0NvdmVyZWQoKSAmJlxuICAgICAgICAgICAgIShvcGVuRW5kICYmIHRoaXMuY29udGVudC5sZW5ndGggJiYgdGhpcy5jb250ZW50W3RoaXMuY29udGVudC5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldykpXG4gICAgICAgICAgICB0aGlzLmdldExpbmUoKTtcbiAgICB9XG4gICAgYnVpbGRUZXh0KGxlbmd0aCwgYWN0aXZlLCBvcGVuU3RhcnQpIHtcbiAgICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRleHRPZmYgPT0gdGhpcy50ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCB7IHZhbHVlLCBsaW5lQnJlYWssIGRvbmUgfSA9IHRoaXMuY3Vyc29yLm5leHQodGhpcy5za2lwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNraXAgPSAwO1xuICAgICAgICAgICAgICAgIGlmIChkb25lKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSYW4gb3V0IG9mIHRleHQgY29udGVudCB3aGVuIGRyYXdpbmcgaW5saW5lIHZpZXdzXCIpO1xuICAgICAgICAgICAgICAgIGlmIChsaW5lQnJlYWspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBvc0NvdmVyZWQoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0uYnJlYWtBZnRlciA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnJlYWtBdFN0YXJ0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1ckxpbmUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0Q3Vyc29yUG9zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLS07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dE9mZiA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRha2UgPSBNYXRoLm1pbih0aGlzLnRleHQubGVuZ3RoIC0gdGhpcy50ZXh0T2ZmLCBsZW5ndGgsIDUxMiAvKiBULkNodW5rICovKTtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hCdWZmZXIoYWN0aXZlLnNsaWNlKGFjdGl2ZS5sZW5ndGggLSBvcGVuU3RhcnQpKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpLmFwcGVuZCh3cmFwTWFya3MobmV3IFRleHRWaWV3KHRoaXMudGV4dC5zbGljZSh0aGlzLnRleHRPZmYsIHRoaXMudGV4dE9mZiArIHRha2UpKSwgYWN0aXZlKSwgb3BlblN0YXJ0KTtcbiAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50ZXh0T2ZmICs9IHRha2U7XG4gICAgICAgICAgICBsZW5ndGggLT0gdGFrZTtcbiAgICAgICAgICAgIG9wZW5TdGFydCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3Bhbihmcm9tLCB0bywgYWN0aXZlLCBvcGVuU3RhcnQpIHtcbiAgICAgICAgdGhpcy5idWlsZFRleHQodG8gLSBmcm9tLCBhY3RpdmUsIG9wZW5TdGFydCk7XG4gICAgICAgIHRoaXMucG9zID0gdG87XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdGFydCA8IDApXG4gICAgICAgICAgICB0aGlzLm9wZW5TdGFydCA9IG9wZW5TdGFydDtcbiAgICB9XG4gICAgcG9pbnQoZnJvbSwgdG8sIGRlY28sIGFjdGl2ZSwgb3BlblN0YXJ0LCBpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhbGxvd0Jsb2NrRWZmZWN0c0ZvcltpbmRleF0gJiYgZGVjbyBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbikge1xuICAgICAgICAgICAgaWYgKGRlY28uYmxvY2spXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCbG9jayBkZWNvcmF0aW9ucyBtYXkgbm90IGJlIHNwZWNpZmllZCB2aWEgcGx1Z2luc1wiKTtcbiAgICAgICAgICAgIGlmICh0byA+IHRoaXMuZG9jLmxpbmVBdCh0aGlzLnBvcykudG8pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEZWNvcmF0aW9ucyB0aGF0IHJlcGxhY2UgbGluZSBicmVha3MgbWF5IG5vdCBiZSBzcGVjaWZpZWQgdmlhIHBsdWdpbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxlbiA9IHRvIC0gZnJvbTtcbiAgICAgICAgaWYgKGRlY28gaW5zdGFuY2VvZiBQb2ludERlY29yYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChkZWNvLmJsb2NrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlY28uc3RhcnRTaWRlID4gMCAmJiAhdGhpcy5wb3NDb3ZlcmVkKCkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQmxvY2tXaWRnZXQobmV3IEJsb2NrV2lkZ2V0VmlldyhkZWNvLndpZGdldCB8fCBOdWxsV2lkZ2V0LmJsb2NrLCBsZW4sIGRlY28pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB2aWV3ID0gV2lkZ2V0Vmlldy5jcmVhdGUoZGVjby53aWRnZXQgfHwgTnVsbFdpZGdldC5pbmxpbmUsIGxlbiwgbGVuID8gMCA6IGRlY28uc3RhcnRTaWRlKTtcbiAgICAgICAgICAgICAgICBsZXQgY3Vyc29yQmVmb3JlID0gdGhpcy5hdEN1cnNvclBvcyAmJiAhdmlldy5pc0VkaXRhYmxlICYmIG9wZW5TdGFydCA8PSBhY3RpdmUubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIChmcm9tIDwgdG8gfHwgZGVjby5zdGFydFNpZGUgPiAwKTtcbiAgICAgICAgICAgICAgICBsZXQgY3Vyc29yQWZ0ZXIgPSAhdmlldy5pc0VkaXRhYmxlICYmIChmcm9tIDwgdG8gfHwgb3BlblN0YXJ0ID4gYWN0aXZlLmxlbmd0aCB8fCBkZWNvLnN0YXJ0U2lkZSA8PSAwKTtcbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdCdWZmZXIgPT0gMiAvKiBCdWYuSWZDdXJzb3IgKi8gJiYgIWN1cnNvckJlZm9yZSAmJiAhdmlldy5pc0VkaXRhYmxlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdCdWZmZXIgPSAwIC8qIEJ1Zi5ObyAqLztcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKGFjdGl2ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvckJlZm9yZSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCh3cmFwTWFya3MobmV3IFdpZGdldEJ1ZmZlclZpZXcoMSksIGFjdGl2ZSksIG9wZW5TdGFydCk7XG4gICAgICAgICAgICAgICAgICAgIG9wZW5TdGFydCA9IGFjdGl2ZS5sZW5ndGggKyBNYXRoLm1heCgwLCBvcGVuU3RhcnQgLSBhY3RpdmUubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGluZS5hcHBlbmQod3JhcE1hcmtzKHZpZXcsIGFjdGl2ZSksIG9wZW5TdGFydCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IGN1cnNvckFmdGVyO1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9ICFjdXJzb3JBZnRlciA/IDAgLyogQnVmLk5vICovIDogZnJvbSA8IHRvIHx8IG9wZW5TdGFydCA+IGFjdGl2ZS5sZW5ndGggPyAxIC8qIEJ1Zi5ZZXMgKi8gOiAyIC8qIEJ1Zi5JZkN1cnNvciAqLztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nQnVmZmVyKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlck1hcmtzID0gYWN0aXZlLnNsaWNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5kb2MubGluZUF0KHRoaXMucG9zKS5mcm9tID09IHRoaXMucG9zKSB7IC8vIExpbmUgZGVjb3JhdGlvblxuICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCkuYWRkTGluZURlY28oZGVjbyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgLy8gQWR2YW5jZSB0aGUgaXRlcmF0b3IgcGFzdCB0aGUgcmVwbGFjZWQgY29udGVudFxuICAgICAgICAgICAgaWYgKHRoaXMudGV4dE9mZiArIGxlbiA8PSB0aGlzLnRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T2ZmICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcCArPSBsZW4gLSAodGhpcy50ZXh0Lmxlbmd0aCAtIHRoaXMudGV4dE9mZik7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPZmYgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wb3MgPSB0bztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcGVuU3RhcnQgPCAwKVxuICAgICAgICAgICAgdGhpcy5vcGVuU3RhcnQgPSBvcGVuU3RhcnQ7XG4gICAgfVxuICAgIHN0YXRpYyBidWlsZCh0ZXh0LCBmcm9tLCB0bywgZGVjb3JhdGlvbnMsIGR5bmFtaWNEZWNvcmF0aW9uTWFwKSB7XG4gICAgICAgIGxldCBidWlsZGVyID0gbmV3IENvbnRlbnRCdWlsZGVyKHRleHQsIGZyb20sIHRvLCBkeW5hbWljRGVjb3JhdGlvbk1hcCk7XG4gICAgICAgIGJ1aWxkZXIub3BlbkVuZCA9IFJhbmdlU2V0LnNwYW5zKGRlY29yYXRpb25zLCBmcm9tLCB0bywgYnVpbGRlcik7XG4gICAgICAgIGlmIChidWlsZGVyLm9wZW5TdGFydCA8IDApXG4gICAgICAgICAgICBidWlsZGVyLm9wZW5TdGFydCA9IGJ1aWxkZXIub3BlbkVuZDtcbiAgICAgICAgYnVpbGRlci5maW5pc2goYnVpbGRlci5vcGVuRW5kKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfVxufVxuZnVuY3Rpb24gd3JhcE1hcmtzKHZpZXcsIGFjdGl2ZSkge1xuICAgIGZvciAobGV0IG1hcmsgb2YgYWN0aXZlKVxuICAgICAgICB2aWV3ID0gbmV3IE1hcmtWaWV3KG1hcmssIFt2aWV3XSwgdmlldy5sZW5ndGgpO1xuICAgIHJldHVybiB2aWV3O1xufVxuY2xhc3MgTnVsbFdpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHRhZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRhZyA9IHRhZztcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIG90aGVyLnRhZyA9PSB0aGlzLnRhZzsgfVxuICAgIHRvRE9NKCkgeyByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLnRhZyk7IH1cbiAgICB1cGRhdGVET00oZWx0KSB7IHJldHVybiBlbHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSB0aGlzLnRhZzsgfVxuICAgIGdldCBpc0hpZGRlbigpIHsgcmV0dXJuIHRydWU7IH1cbn1cbk51bGxXaWRnZXQuaW5saW5lID0gLypAX19QVVJFX18qL25ldyBOdWxsV2lkZ2V0KFwic3BhblwiKTtcbk51bGxXaWRnZXQuYmxvY2sgPSAvKkBfX1BVUkVfXyovbmV3IE51bGxXaWRnZXQoXCJkaXZcIik7XG5cbi8qKlxuVXNlZCB0byBpbmRpY2F0ZSBbdGV4dCBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pLlxuKi9cbnZhciBEaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChEaXJlY3Rpb24pIHtcbiAgICAvLyAoVGhlc2UgYXJlIGNob3NlbiB0byBtYXRjaCB0aGUgYmFzZSBsZXZlbHMsIGluIGJpZGkgYWxnb3JpdGhtXG4gICAgLy8gdGVybXMsIG9mIHNwYW5zIGluIHRoYXQgZGlyZWN0aW9uLilcbiAgICAvKipcbiAgICBMZWZ0LXRvLXJpZ2h0LlxuICAgICovXG4gICAgRGlyZWN0aW9uW0RpcmVjdGlvbltcIkxUUlwiXSA9IDBdID0gXCJMVFJcIjtcbiAgICAvKipcbiAgICBSaWdodC10by1sZWZ0LlxuICAgICovXG4gICAgRGlyZWN0aW9uW0RpcmVjdGlvbltcIlJUTFwiXSA9IDFdID0gXCJSVExcIjtcbnJldHVybiBEaXJlY3Rpb259KShEaXJlY3Rpb24gfHwgKERpcmVjdGlvbiA9IHt9KSk7XG5jb25zdCBMVFIgPSBEaXJlY3Rpb24uTFRSLCBSVEwgPSBEaXJlY3Rpb24uUlRMO1xuLy8gRGVjb2RlIGEgc3RyaW5nIHdpdGggZWFjaCB0eXBlIGVuY29kZWQgYXMgbG9nMih0eXBlKVxuZnVuY3Rpb24gZGVjKHN0cikge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKylcbiAgICAgICAgcmVzdWx0LnB1c2goMSA8PCArc3RyW2ldKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8gQ2hhcmFjdGVyIHR5cGVzIGZvciBjb2RlcG9pbnRzIDAgdG8gMHhmOFxuY29uc3QgTG93VHlwZXMgPSAvKkBfX1BVUkVfXyovZGVjKFwiODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg2NjY4ODg4ODg3ODc4MzMzMzMzMzMzMzc4ODg4ODgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg4ODg4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODc4NjY2Njg4ODgwODg4ODg2NjMzODA4ODgzMDg4ODg4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhcIik7XG4vLyBDaGFyYWN0ZXIgdHlwZXMgZm9yIGNvZGVwb2ludHMgMHg2MDAgdG8gMHg2ZjlcbmNvbnN0IEFyYWJpY1R5cGVzID0gLypAX19QVVJFX18qL2RlYyhcIjQ0NDQ0NDg4MjY2MjcyODg5OTk5OTk5OTk5OTIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjk5OTk5OTk5OTk5OTk5OTk5OTk5OTQ0NDQ0NDQ0NDQ2NDQyMjI4MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI5OTk5OTk5NDk5OTk5OTkyMjk5ODk5OTkyMjMzMzMzMzMzMzNcIik7XG5jb25zdCBCcmFja2V0cyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpLCBCcmFja2V0U3RhY2sgPSBbXTtcbi8vIFRoZXJlJ3MgYSBsb3QgbW9yZSBpblxuLy8gaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL0JpZGlCcmFja2V0cy50eHQsXG4vLyB3aGljaCBhcmUgbGVmdCBvdXQgdG8ga2VlcCBjb2RlIHNpemUgZG93bi5cbmZvciAobGV0IHAgb2YgW1wiKClcIiwgXCJbXVwiLCBcInt9XCJdKSB7XG4gICAgbGV0IGwgPSAvKkBfX1BVUkVfXyovcC5jaGFyQ29kZUF0KDApLCByID0gLypAX19QVVJFX18qL3AuY2hhckNvZGVBdCgxKTtcbiAgICBCcmFja2V0c1tsXSA9IHI7XG4gICAgQnJhY2tldHNbcl0gPSAtbDtcbn1cbmZ1bmN0aW9uIGNoYXJUeXBlKGNoKSB7XG4gICAgcmV0dXJuIGNoIDw9IDB4ZjcgPyBMb3dUeXBlc1tjaF0gOlxuICAgICAgICAweDU5MCA8PSBjaCAmJiBjaCA8PSAweDVmNCA/IDIgLyogVC5SICovIDpcbiAgICAgICAgICAgIDB4NjAwIDw9IGNoICYmIGNoIDw9IDB4NmY5ID8gQXJhYmljVHlwZXNbY2ggLSAweDYwMF0gOlxuICAgICAgICAgICAgICAgIDB4NmVlIDw9IGNoICYmIGNoIDw9IDB4OGFjID8gNCAvKiBULkFMICovIDpcbiAgICAgICAgICAgICAgICAgICAgMHgyMDAwIDw9IGNoICYmIGNoIDw9IDB4MjAwYyA/IDI1NiAvKiBULk5JICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmI1MCA8PSBjaCAmJiBjaCA8PSAweGZkZmYgPyA0IC8qIFQuQUwgKi8gOiAxIC8qIFQuTCAqLztcbn1cbmNvbnN0IEJpZGlSRSA9IC9bXFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MDcwMC1cXHUwOGFjXFx1ZmI1MC1cXHVmZGZmXS87XG4vKipcblJlcHJlc2VudHMgYSBjb250aWd1b3VzIHJhbmdlIG9mIHRleHQgdGhhdCBoYXMgYSBzaW5nbGUgZGlyZWN0aW9uXG4oYXMgaW4gbGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0KS5cbiovXG5jbGFzcyBCaWRpU3BhbiB7XG4gICAgLyoqXG4gICAgVGhlIGRpcmVjdGlvbiBvZiB0aGlzIHNwYW4uXG4gICAgKi9cbiAgICBnZXQgZGlyKCkgeyByZXR1cm4gdGhpcy5sZXZlbCAlIDIgPyBSVEwgOiBMVFI7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgc3BhbiAocmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lKS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgb2YgdGhlIHNwYW4uXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIFtcImJpZGlcbiAgICBsZXZlbFwiXShodHRwczovL3VuaWNvZGUub3JnL3JlcG9ydHMvdHI5LyNCYXNpY19EaXNwbGF5X0FsZ29yaXRobSlcbiAgICBvZiB0aGUgc3BhbiAoaW4gdGhpcyBjb250ZXh0LCAwIG1lYW5zXG4gICAgbGVmdC10by1yaWdodCwgMSBtZWFucyByaWdodC10by1sZWZ0LCAyIG1lYW5zIGxlZnQtdG8tcmlnaHRcbiAgICBudW1iZXIgaW5zaWRlIHJpZ2h0LXRvLWxlZnQgdGV4dCkuXG4gICAgKi9cbiAgICBsZXZlbCkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzaWRlKGVuZCwgZGlyKSB7IHJldHVybiAodGhpcy5kaXIgPT0gZGlyKSA9PSBlbmQgPyB0aGlzLnRvIDogdGhpcy5mcm9tOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmb3J3YXJkKGZvcndhcmQsIGRpcikgeyByZXR1cm4gZm9yd2FyZCA9PSAodGhpcy5kaXIgPT0gZGlyKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZpbmQob3JkZXIsIGluZGV4LCBsZXZlbCwgYXNzb2MpIHtcbiAgICAgICAgbGV0IG1heWJlID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzcGFuID0gb3JkZXJbaV07XG4gICAgICAgICAgICBpZiAoc3Bhbi5mcm9tIDw9IGluZGV4ICYmIHNwYW4udG8gPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3Bhbi5sZXZlbCA9PSBsZXZlbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBtdWx0aXBsZSBzcGFucyBtYXRjaCwgaWYgYXNzb2MgIT0gMCwgdGFrZSB0aGUgb25lIHRoYXRcbiAgICAgICAgICAgICAgICAvLyBjb3ZlcnMgdGhhdCBzaWRlLCBvdGhlcndpc2UgdGFrZSB0aGUgb25lIHdpdGggdGhlIG1pbmltdW1cbiAgICAgICAgICAgICAgICAvLyBsZXZlbC5cbiAgICAgICAgICAgICAgICBpZiAobWF5YmUgPCAwIHx8IChhc3NvYyAhPSAwID8gKGFzc29jIDwgMCA/IHNwYW4uZnJvbSA8IGluZGV4IDogc3Bhbi50byA+IGluZGV4KSA6IG9yZGVyW21heWJlXS5sZXZlbCA+IHNwYW4ubGV2ZWwpKVxuICAgICAgICAgICAgICAgICAgICBtYXliZSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlIDwgMClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgICByZXR1cm4gbWF5YmU7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNvbGF0ZXNFcShhLCBiKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBpQSA9IGFbaV0sIGlCID0gYltpXTtcbiAgICAgICAgaWYgKGlBLmZyb20gIT0gaUIuZnJvbSB8fCBpQS50byAhPSBpQi50byB8fCBpQS5kaXJlY3Rpb24gIT0gaUIuZGlyZWN0aW9uIHx8ICFpc29sYXRlc0VxKGlBLmlubmVyLCBpQi5pbm5lcikpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLy8gUmV1c2VkIGFycmF5IG9mIGNoYXJhY3RlciB0eXBlc1xuY29uc3QgdHlwZXMgPSBbXTtcbi8vIEZpbGwgaW4gdGhlIGNoYXJhY3RlciB0eXBlcyAoaW4gYHR5cGVzYCkgZnJvbSBgZnJvbWAgdG8gYHRvYCBhbmRcbi8vIGFwcGx5IFcgbm9ybWFsaXphdGlvbiBydWxlcy5cbmZ1bmN0aW9uIGNvbXB1dGVDaGFyVHlwZXMobGluZSwgckZyb20sIHJUbywgaXNvbGF0ZXMsIG91dGVyVHlwZSkge1xuICAgIGZvciAobGV0IGlJID0gMDsgaUkgPD0gaXNvbGF0ZXMubGVuZ3RoOyBpSSsrKSB7XG4gICAgICAgIGxldCBmcm9tID0gaUkgPyBpc29sYXRlc1tpSSAtIDFdLnRvIDogckZyb20sIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgbGV0IHByZXZUeXBlID0gaUkgPyAyNTYgLyogVC5OSSAqLyA6IG91dGVyVHlwZTtcbiAgICAgICAgLy8gVzEuIEV4YW1pbmUgZWFjaCBub24tc3BhY2luZyBtYXJrIChOU00pIGluIHRoZSBsZXZlbCBydW4sIGFuZFxuICAgICAgICAvLyBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIE5TTSB0byB0aGUgdHlwZSBvZiB0aGUgcHJldmlvdXNcbiAgICAgICAgLy8gY2hhcmFjdGVyLiBJZiB0aGUgTlNNIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGV2ZWwgcnVuLCBpdCB3aWxsXG4gICAgICAgIC8vIGdldCB0aGUgdHlwZSBvZiBzb3IuXG4gICAgICAgIC8vIFcyLiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlclxuICAgICAgICAvLyB1bnRpbCB0aGUgZmlyc3Qgc3Ryb25nIHR5cGUgKFIsIEwsIEFMLCBvciBzb3IpIGlzIGZvdW5kLiBJZiBhblxuICAgICAgICAvLyBBTCBpcyBmb3VuZCwgY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gQXJhYmljXG4gICAgICAgIC8vIG51bWJlci5cbiAgICAgICAgLy8gVzMuIENoYW5nZSBhbGwgQUxzIHRvIFIuXG4gICAgICAgIC8vIChMZWZ0IGFmdGVyIHRoaXM6IEwsIFIsIEVOLCBBTiwgRVQsIENTLCBOSSlcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb20sIHByZXYgPSBwcmV2VHlwZSwgcHJldlN0cm9uZyA9IHByZXZUeXBlOyBpIDwgdG87IGkrKykge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBjaGFyVHlwZShsaW5lLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gNTEyIC8qIFQuTlNNICovKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBwcmV2O1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSA4IC8qIFQuRU4gKi8gJiYgcHJldlN0cm9uZyA9PSA0IC8qIFQuQUwgKi8pXG4gICAgICAgICAgICAgICAgdHlwZSA9IDE2IC8qIFQuQU4gKi87XG4gICAgICAgICAgICB0eXBlc1tpXSA9IHR5cGUgPT0gNCAvKiBULkFMICovID8gMiAvKiBULlIgKi8gOiB0eXBlO1xuICAgICAgICAgICAgaWYgKHR5cGUgJiA3IC8qIFQuU3Ryb25nICovKVxuICAgICAgICAgICAgICAgIHByZXZTdHJvbmcgPSB0eXBlO1xuICAgICAgICAgICAgcHJldiA9IHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVzUuIEEgc2VxdWVuY2Ugb2YgRXVyb3BlYW4gdGVybWluYXRvcnMgYWRqYWNlbnQgdG8gRXVyb3BlYW5cbiAgICAgICAgLy8gbnVtYmVycyBjaGFuZ2VzIHRvIGFsbCBFdXJvcGVhbiBudW1iZXJzLlxuICAgICAgICAvLyBXNi4gT3RoZXJ3aXNlLCBzZXBhcmF0b3JzIGFuZCB0ZXJtaW5hdG9ycyBjaGFuZ2UgdG8gT3RoZXJcbiAgICAgICAgLy8gTmV1dHJhbC5cbiAgICAgICAgLy8gVzcuIFNlYXJjaCBiYWNrd2FyZHMgZnJvbSBlYWNoIGluc3RhbmNlIG9mIGEgRXVyb3BlYW4gbnVtYmVyXG4gICAgICAgIC8vIHVudGlsIHRoZSBmaXJzdCBzdHJvbmcgdHlwZSAoUiwgTCwgb3Igc29yKSBpcyBmb3VuZC4gSWYgYW4gTCBpc1xuICAgICAgICAvLyBmb3VuZCwgdGhlbiBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIEV1cm9wZWFuIG51bWJlciB0byBMLlxuICAgICAgICAvLyAoTGVmdCBhZnRlciB0aGlzOiBMLCBSLCBFTitBTiwgTkkpXG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tLCBwcmV2ID0gcHJldlR5cGUsIHByZXZTdHJvbmcgPSBwcmV2VHlwZTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZSA9PSAxMjggLyogVC5DUyAqLykge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgdG8gLSAxICYmIHByZXYgPT0gdHlwZXNbaSArIDFdICYmIChwcmV2ICYgMjQgLyogVC5OdW0gKi8pKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gdHlwZXNbaV0gPSBwcmV2O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdHlwZXNbaV0gPSAyNTYgLyogVC5OSSAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gNjQgLyogVC5FVCAqLykge1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoZW5kIDwgdG8gJiYgdHlwZXNbZW5kXSA9PSA2NCAvKiBULkVUICovKVxuICAgICAgICAgICAgICAgICAgICBlbmQrKztcbiAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZSA9IChpICYmIHByZXYgPT0gOCAvKiBULkVOICovKSB8fCAoZW5kIDwgclRvICYmIHR5cGVzW2VuZF0gPT0gOCAvKiBULkVOICovKSA/IChwcmV2U3Ryb25nID09IDEgLyogVC5MICovID8gMSAvKiBULkwgKi8gOiA4IC8qIFQuRU4gKi8pIDogMjU2IC8qIFQuTkkgKi87XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBlbmQ7IGorKylcbiAgICAgICAgICAgICAgICAgICAgdHlwZXNbal0gPSByZXBsYWNlO1xuICAgICAgICAgICAgICAgIGkgPSBlbmQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSA4IC8qIFQuRU4gKi8gJiYgcHJldlN0cm9uZyA9PSAxIC8qIFQuTCAqLykge1xuICAgICAgICAgICAgICAgIHR5cGVzW2ldID0gMSAvKiBULkwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2ID0gdHlwZTtcbiAgICAgICAgICAgIGlmICh0eXBlICYgNyAvKiBULlN0cm9uZyAqLylcbiAgICAgICAgICAgICAgICBwcmV2U3Ryb25nID0gdHlwZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIFByb2Nlc3MgYnJhY2tldHMgdGhyb3VnaG91dCBhIHJ1biBzZXF1ZW5jZS5cbmZ1bmN0aW9uIHByb2Nlc3NCcmFja2V0UGFpcnMobGluZSwgckZyb20sIHJUbywgaXNvbGF0ZXMsIG91dGVyVHlwZSkge1xuICAgIGxldCBvcHBvc2l0ZVR5cGUgPSBvdXRlclR5cGUgPT0gMSAvKiBULkwgKi8gPyAyIC8qIFQuUiAqLyA6IDEgLyogVC5MICovO1xuICAgIGZvciAobGV0IGlJID0gMCwgc0kgPSAwLCBjb250ZXh0ID0gMDsgaUkgPD0gaXNvbGF0ZXMubGVuZ3RoOyBpSSsrKSB7XG4gICAgICAgIGxldCBmcm9tID0gaUkgPyBpc29sYXRlc1tpSSAtIDFdLnRvIDogckZyb20sIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgLy8gTjAuIFByb2Nlc3MgYnJhY2tldCBwYWlycyBpbiBhbiBpc29sYXRpbmcgcnVuIHNlcXVlbmNlXG4gICAgICAgIC8vIHNlcXVlbnRpYWxseSBpbiB0aGUgbG9naWNhbCBvcmRlciBvZiB0aGUgdGV4dCBwb3NpdGlvbnMgb2YgdGhlXG4gICAgICAgIC8vIG9wZW5pbmcgcGFpcmVkIGJyYWNrZXRzIHVzaW5nIHRoZSBsb2dpYyBnaXZlbiBiZWxvdy4gV2l0aGluIHRoaXNcbiAgICAgICAgLy8gc2NvcGUsIGJpZGlyZWN0aW9uYWwgdHlwZXMgRU4gYW5kIEFOIGFyZSB0cmVhdGVkIGFzIFIuXG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tLCBjaCwgYnIsIHR5cGU7IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBLZWVwcyBbc3RhcnRJbmRleCwgdHlwZSwgc3Ryb25nU2Vlbl0gdHJpcGxlcyBmb3IgZWFjaCBvcGVuXG4gICAgICAgICAgICAvLyBicmFja2V0IG9uIEJyYWNrZXRTdGFjay5cbiAgICAgICAgICAgIGlmIChiciA9IEJyYWNrZXRzW2NoID0gbGluZS5jaGFyQ29kZUF0KGkpXSkge1xuICAgICAgICAgICAgICAgIGlmIChiciA8IDApIHsgLy8gQ2xvc2luZyBicmFja2V0XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHNKID0gc0kgLSAzOyBzSiA+PSAwOyBzSiAtPSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQnJhY2tldFN0YWNrW3NKICsgMV0gPT0gLWJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZsYWdzID0gQnJhY2tldFN0YWNrW3NKICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSAoZmxhZ3MgJiAyIC8qIEJyYWNrZXRlZC5FbWJlZEluc2lkZSAqLykgPyBvdXRlclR5cGUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGZsYWdzICYgNCAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVJbnNpZGUgKi8pID8gMCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiAxIC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUJlZm9yZSAqLykgPyBvcHBvc2l0ZVR5cGUgOiBvdXRlclR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzW2ldID0gdHlwZXNbQnJhY2tldFN0YWNrW3NKXV0gPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNJID0gc0o7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoQnJhY2tldFN0YWNrLmxlbmd0aCA9PSAxODkgLyogQnJhY2tldGVkLk1heERlcHRoICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NJKytdID0gaTtcbiAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NJKytdID0gY2g7XG4gICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSSsrXSA9IGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKHR5cGUgPSB0eXBlc1tpXSkgPT0gMiAvKiBULlIgKi8gfHwgdHlwZSA9PSAxIC8qIFQuTCAqLykge1xuICAgICAgICAgICAgICAgIGxldCBlbWJlZCA9IHR5cGUgPT0gb3V0ZXJUeXBlO1xuICAgICAgICAgICAgICAgIGNvbnRleHQgPSBlbWJlZCA/IDAgOiAxIC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUJlZm9yZSAqLztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzSiA9IHNJIC0gMzsgc0ogPj0gMDsgc0ogLT0gMykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VyID0gQnJhY2tldFN0YWNrW3NKICsgMl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXIgJiAyIC8qIEJyYWNrZXRlZC5FbWJlZEluc2lkZSAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW1iZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSiArIDJdIHw9IDIgLyogQnJhY2tldGVkLkVtYmVkSW5zaWRlICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ciAmIDQgLyogQnJhY2tldGVkLk9wcG9zaXRlSW5zaWRlICovKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NKICsgMl0gfD0gNCAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVJbnNpZGUgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBwcm9jZXNzTmV1dHJhbHMockZyb20sIHJUbywgaXNvbGF0ZXMsIG91dGVyVHlwZSkge1xuICAgIGZvciAobGV0IGlJID0gMCwgcHJldiA9IG91dGVyVHlwZTsgaUkgPD0gaXNvbGF0ZXMubGVuZ3RoOyBpSSsrKSB7XG4gICAgICAgIGxldCBmcm9tID0gaUkgPyBpc29sYXRlc1tpSSAtIDFdLnRvIDogckZyb20sIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgLy8gTjEuIEEgc2VxdWVuY2Ugb2YgbmV1dHJhbHMgdGFrZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGVcbiAgICAgICAgLy8gc3Vycm91bmRpbmcgc3Ryb25nIHRleHQgaWYgdGhlIHRleHQgb24gYm90aCBzaWRlcyBoYXMgdGhlIHNhbWVcbiAgICAgICAgLy8gZGlyZWN0aW9uLiBFdXJvcGVhbiBhbmQgQXJhYmljIG51bWJlcnMgYWN0IGFzIGlmIHRoZXkgd2VyZSBSIGluXG4gICAgICAgIC8vIHRlcm1zIG9mIHRoZWlyIGluZmx1ZW5jZSBvbiBuZXV0cmFscy4gU3RhcnQtb2YtbGV2ZWwtcnVuIChzb3IpXG4gICAgICAgIC8vIGFuZCBlbmQtb2YtbGV2ZWwtcnVuIChlb3IpIGFyZSB1c2VkIGF0IGxldmVsIHJ1biBib3VuZGFyaWVzLlxuICAgICAgICAvLyBOMi4gQW55IHJlbWFpbmluZyBuZXV0cmFscyB0YWtlIHRoZSBlbWJlZGRpbmcgZGlyZWN0aW9uLlxuICAgICAgICAvLyAoTGVmdCBhZnRlciB0aGlzOiBMLCBSLCBFTitBTilcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzspIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZSA9PSAyNTYgLyogVC5OSSAqLykge1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmQgPT0gdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpSSA9PSBpc29sYXRlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBpc29sYXRlc1tpSSsrXS50bztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlc1tlbmRdID09IDI1NiAvKiBULk5JICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBiZWZvcmVMID0gcHJldiA9PSAxIC8qIFQuTCAqLztcbiAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJMID0gKGVuZCA8IHJUbyA/IHR5cGVzW2VuZF0gOiBvdXRlclR5cGUpID09IDEgLyogVC5MICovO1xuICAgICAgICAgICAgICAgIGxldCByZXBsYWNlID0gYmVmb3JlTCA9PSBhZnRlckwgPyAoYmVmb3JlTCA/IDEgLyogVC5MICovIDogMiAvKiBULlIgKi8pIDogb3V0ZXJUeXBlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBlbmQsIGpJID0gaUksIGZyb21KID0gakkgPyBpc29sYXRlc1tqSSAtIDFdLnRvIDogckZyb207IGogPiBpOykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBmcm9tSikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGlzb2xhdGVzWy0takldLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tSiA9IGpJID8gaXNvbGF0ZXNbakkgLSAxXS50byA6IHJGcm9tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVzWy0tal0gPSByZXBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpID0gZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IHR5cGU7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8gRmluZCB0aGUgY29udGlndW91cyByYW5nZXMgb2YgY2hhcmFjdGVyIHR5cGVzIGluIGEgZ2l2ZW4gcmFuZ2UsIGFuZFxuLy8gZW1pdCBzcGFucyBmb3IgdGhlbS4gRmxpcCB0aGUgb3JkZXIgb2YgdGhlIHNwYW5zIGFzIGFwcHJvcHJpYXRlXG4vLyBiYXNlZCBvbiB0aGUgbGV2ZWwsIGFuZCBjYWxsIHRocm91Z2ggdG8gY29tcHV0ZSB0aGUgc3BhbnMgZm9yXG4vLyBpc29sYXRlcyBhdCB0aGUgcHJvcGVyIHBvaW50LlxuZnVuY3Rpb24gZW1pdFNwYW5zKGxpbmUsIGZyb20sIHRvLCBsZXZlbCwgYmFzZUxldmVsLCBpc29sYXRlcywgb3JkZXIpIHtcbiAgICBsZXQgb3VyVHlwZSA9IGxldmVsICUgMiA/IDIgLyogVC5SICovIDogMSAvKiBULkwgKi87XG4gICAgaWYgKChsZXZlbCAlIDIpID09IChiYXNlTGV2ZWwgJSAyKSkgeyAvLyBTYW1lIGRpciBhcyBiYXNlIGRpcmVjdGlvbiwgZG9uJ3QgZmxpcFxuICAgICAgICBmb3IgKGxldCBpQ2ggPSBmcm9tLCBpSSA9IDA7IGlDaCA8IHRvOykge1xuICAgICAgICAgICAgLy8gU2NhbiBhIHNlY3Rpb24gb2YgY2hhcmFjdGVycyBpbiBkaXJlY3Rpb24gb3VyVHlwZSwgdW5sZXNzXG4gICAgICAgICAgICAvLyB0aGVyZSdzIGFub3RoZXIgdHlwZSBvZiBjaGFyIHJpZ2h0IGFmdGVyIGlDaCwgaW4gd2hpY2ggY2FzZVxuICAgICAgICAgICAgLy8gd2Ugc2NhbiBhIHNlY3Rpb24gb2Ygb3RoZXIgY2hhcmFjdGVycyAod2hpY2gsIGlmIG91clR5cGUgPT1cbiAgICAgICAgICAgIC8vIFQuTCwgbWF5IGNvbnRhaW4gYm90aCBULlIgYW5kIFQuQU4gY2hhcnMpLlxuICAgICAgICAgICAgbGV0IHNhbWVEaXIgPSB0cnVlLCBpc051bSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGlJID09IGlzb2xhdGVzLmxlbmd0aCB8fCBpQ2ggPCBpc29sYXRlc1tpSV0uZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdHlwZXNbaUNoXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBvdXJUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhbWVEaXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaXNOdW0gPSBuZXh0ID09IDE2IC8qIFQuQU4gKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSG9sZHMgYW4gYXJyYXkgb2YgaXNvbGF0ZXMgdG8gcGFzcyB0byBhIHJlY3Vyc2l2ZSBjYWxsIGlmIHdlXG4gICAgICAgICAgICAvLyBtdXN0IHJlY3Vyc2UgKHRvIGRpc3Rpbmd1aXNoIFQuQU4gaW5zaWRlIGFuIFJUTCBzZWN0aW9uIGluXG4gICAgICAgICAgICAvLyBMVFIgdGV4dCksIG51bGwgaWYgd2UgY2FuIGVtaXQgZGlyZWN0bHlcbiAgICAgICAgICAgIGxldCByZWN1cnNlID0gIXNhbWVEaXIgJiYgb3VyVHlwZSA9PSAxIC8qIFQuTCAqLyA/IFtdIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBsb2NhbExldmVsID0gc2FtZURpciA/IGxldmVsIDogbGV2ZWwgKyAxO1xuICAgICAgICAgICAgbGV0IGlTY2FuID0gaUNoO1xuICAgICAgICAgICAgcnVuOiBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlJIDwgaXNvbGF0ZXMubGVuZ3RoICYmIGlTY2FuID09IGlzb2xhdGVzW2lJXS5mcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc051bSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzbyA9IGlzb2xhdGVzW2lJXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2NhbiBhaGVhZCB0byB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBhbm90aGVyIGNoYXIgaW4gdGhpcyBkaXIgYWZ0ZXIgdGhlIGlzb2xhdGUocylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzYW1lRGlyKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdXB0byA9IGlzby50bywgakkgPSBpSSArIDE7Oykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cHRvID09IHRvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpJIDwgaXNvbGF0ZXMubGVuZ3RoICYmIGlzb2xhdGVzW2pJXS5mcm9tID09IHVwdG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwdG8gPSBpc29sYXRlc1tqSSsrXS50bztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlc1t1cHRvXSA9PSBvdXJUeXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaUkrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UucHVzaChpc28pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzby5mcm9tID4gaUNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlDaCwgaXNvLmZyb20sIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXJTd2FwID0gKGlzby5kaXJlY3Rpb24gPT0gTFRSKSAhPSAhKGxvY2FsTGV2ZWwgJSAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVTZWN0aW9uT3JkZXIobGluZSwgZGlyU3dhcCA/IGxldmVsICsgMSA6IGxldmVsLCBiYXNlTGV2ZWwsIGlzby5pbm5lciwgaXNvLmZyb20sIGlzby50bywgb3JkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaUNoID0gaXNvLnRvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlTY2FuID0gaXNvLnRvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpU2NhbiA9PSB0byB8fCAoc2FtZURpciA/IHR5cGVzW2lTY2FuXSAhPSBvdXJUeXBlIDogdHlwZXNbaVNjYW5dID09IG91clR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaVNjYW4rKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVjdXJzZSlcbiAgICAgICAgICAgICAgICBlbWl0U3BhbnMobGluZSwgaUNoLCBpU2NhbiwgbGV2ZWwgKyAxLCBiYXNlTGV2ZWwsIHJlY3Vyc2UsIG9yZGVyKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlDaCA8IGlTY2FuKVxuICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlDaCwgaVNjYW4sIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgIGlDaCA9IGlTY2FuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJdGVyYXRlIGluIHJldmVyc2UgdG8gZmxpcCB0aGUgc3BhbiBvcmRlci4gU2FtZSBjb2RlIGFnYWluLCBidXRcbiAgICAgICAgLy8gZ29pbmcgZnJvbSB0aGUgYmFjayBvZiB0aGUgc2VjdGlvbiB0byB0aGUgZnJvbnRcbiAgICAgICAgZm9yIChsZXQgaUNoID0gdG8sIGlJID0gaXNvbGF0ZXMubGVuZ3RoOyBpQ2ggPiBmcm9tOykge1xuICAgICAgICAgICAgbGV0IHNhbWVEaXIgPSB0cnVlLCBpc051bSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFpSSB8fCBpQ2ggPiBpc29sYXRlc1tpSSAtIDFdLnRvKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0eXBlc1tpQ2ggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBvdXJUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhbWVEaXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaXNOdW0gPSBuZXh0ID09IDE2IC8qIFQuQU4gKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlY3Vyc2UgPSAhc2FtZURpciAmJiBvdXJUeXBlID09IDEgLyogVC5MICovID8gW10gOiBudWxsO1xuICAgICAgICAgICAgbGV0IGxvY2FsTGV2ZWwgPSBzYW1lRGlyID8gbGV2ZWwgOiBsZXZlbCArIDE7XG4gICAgICAgICAgICBsZXQgaVNjYW4gPSBpQ2g7XG4gICAgICAgICAgICBydW46IGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBpZiAoaUkgJiYgaVNjYW4gPT0gaXNvbGF0ZXNbaUkgLSAxXS50bykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOdW0pXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc28gPSBpc29sYXRlc1stLWlJXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2NhbiBhaGVhZCB0byB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBhbm90aGVyIGNoYXIgaW4gdGhpcyBkaXIgYWZ0ZXIgdGhlIGlzb2xhdGUocylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzYW1lRGlyKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdXB0byA9IGlzby5mcm9tLCBqSSA9IGlJOzspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXB0byA9PSBmcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpJICYmIGlzb2xhdGVzW2pJIC0gMV0udG8gPT0gdXB0bylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXB0byA9IGlzb2xhdGVzWy0takldLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZXNbdXB0byAtIDFdID09IG91clR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVjdXJzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZS5wdXNoKGlzbyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNvLnRvIDwgaUNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlzby50bywgaUNoLCBsb2NhbExldmVsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlyU3dhcCA9IChpc28uZGlyZWN0aW9uID09IExUUikgIT0gIShsb2NhbExldmVsICUgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlU2VjdGlvbk9yZGVyKGxpbmUsIGRpclN3YXAgPyBsZXZlbCArIDEgOiBsZXZlbCwgYmFzZUxldmVsLCBpc28uaW5uZXIsIGlzby5mcm9tLCBpc28udG8sIG9yZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlDaCA9IGlzby5mcm9tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlTY2FuID0gaXNvLmZyb207XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlTY2FuID09IGZyb20gfHwgKHNhbWVEaXIgPyB0eXBlc1tpU2NhbiAtIDFdICE9IG91clR5cGUgOiB0eXBlc1tpU2NhbiAtIDFdID09IG91clR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaVNjYW4tLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVjdXJzZSlcbiAgICAgICAgICAgICAgICBlbWl0U3BhbnMobGluZSwgaVNjYW4sIGlDaCwgbGV2ZWwgKyAxLCBiYXNlTGV2ZWwsIHJlY3Vyc2UsIG9yZGVyKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlTY2FuIDwgaUNoKVxuICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlTY2FuLCBpQ2gsIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgIGlDaCA9IGlTY2FuO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZVNlY3Rpb25PcmRlcihsaW5lLCBsZXZlbCwgYmFzZUxldmVsLCBpc29sYXRlcywgZnJvbSwgdG8sIG9yZGVyKSB7XG4gICAgbGV0IG91dGVyVHlwZSA9IChsZXZlbCAlIDIgPyAyIC8qIFQuUiAqLyA6IDEgLyogVC5MICovKTtcbiAgICBjb21wdXRlQ2hhclR5cGVzKGxpbmUsIGZyb20sIHRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKTtcbiAgICBwcm9jZXNzQnJhY2tldFBhaXJzKGxpbmUsIGZyb20sIHRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKTtcbiAgICBwcm9jZXNzTmV1dHJhbHMoZnJvbSwgdG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpO1xuICAgIGVtaXRTcGFucyhsaW5lLCBmcm9tLCB0bywgbGV2ZWwsIGJhc2VMZXZlbCwgaXNvbGF0ZXMsIG9yZGVyKTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVPcmRlcihsaW5lLCBkaXJlY3Rpb24sIGlzb2xhdGVzKSB7XG4gICAgaWYgKCFsaW5lKVxuICAgICAgICByZXR1cm4gW25ldyBCaWRpU3BhbigwLCAwLCBkaXJlY3Rpb24gPT0gUlRMID8gMSA6IDApXTtcbiAgICBpZiAoZGlyZWN0aW9uID09IExUUiAmJiAhaXNvbGF0ZXMubGVuZ3RoICYmICFCaWRpUkUudGVzdChsaW5lKSlcbiAgICAgICAgcmV0dXJuIHRyaXZpYWxPcmRlcihsaW5lLmxlbmd0aCk7XG4gICAgaWYgKGlzb2xhdGVzLmxlbmd0aClcbiAgICAgICAgd2hpbGUgKGxpbmUubGVuZ3RoID4gdHlwZXMubGVuZ3RoKVxuICAgICAgICAgICAgdHlwZXNbdHlwZXMubGVuZ3RoXSA9IDI1NiAvKiBULk5JICovOyAvLyBNYWtlIHN1cmUgdHlwZXMgYXJyYXkgaGFzIG5vIGdhcHNcbiAgICBsZXQgb3JkZXIgPSBbXSwgbGV2ZWwgPSBkaXJlY3Rpb24gPT0gTFRSID8gMCA6IDE7XG4gICAgY29tcHV0ZVNlY3Rpb25PcmRlcihsaW5lLCBsZXZlbCwgbGV2ZWwsIGlzb2xhdGVzLCAwLCBsaW5lLmxlbmd0aCwgb3JkZXIpO1xuICAgIHJldHVybiBvcmRlcjtcbn1cbmZ1bmN0aW9uIHRyaXZpYWxPcmRlcihsZW5ndGgpIHtcbiAgICByZXR1cm4gW25ldyBCaWRpU3BhbigwLCBsZW5ndGgsIDApXTtcbn1cbmxldCBtb3ZlZE92ZXIgPSBcIlwiO1xuLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBtb3ZlcyBzdHJpY3RseSB2aXN1YWxseSwgd2l0aG91dCBjb25jZXJuIGZvciBhXG4vLyB0cmF2ZXJzYWwgdmlzaXRpbmcgZXZlcnkgbG9naWNhbCBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nLiBJdCB3aWxsXG4vLyBzdGlsbCBkbyBzbyBmb3Igc2ltcGxlIGlucHV0LCBidXQgc2l0dWF0aW9ucyBsaWtlIG11bHRpcGxlIGlzb2xhdGVzXG4vLyB3aXRoIHRoZSBzYW1lIGxldmVsIG5leHQgdG8gZWFjaCBvdGhlciwgb3IgdGV4dCBnb2luZyBhZ2FpbnN0IHRoZVxuLy8gbWFpbiBkaXIgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgd2lsbCBtYWtlIHNvbWUgcG9zaXRpb25zXG4vLyB1bnJlYWNoYWJsZSB3aXRoIHRoaXMgbW90aW9uLiBFYWNoIHZpc2libGUgY3Vyc29yIHBvc2l0aW9uIHdpbGxcbi8vIGNvcnJlc3BvbmQgdG8gdGhlIGxvd2VyLWxldmVsIGJpZGkgc3BhbiB0aGF0IHRvdWNoZXMgaXQuXG4vL1xuLy8gVGhlIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHNvbHZlIGFuIG9yZGVyIGdsb2JhbGx5IGZvciBhIGdpdmVuXG4vLyBsaW5lLCBtYWtpbmcgc3VyZSB0aGF0IGl0IGluY2x1ZGVzIGV2ZXJ5IHBvc2l0aW9uLCBidXQgdGhhdCB3b3VsZFxuLy8gcmVxdWlyZSBhc3NvY2lhdGluZyBub24tY2Fub25pY2FsIChoaWdoZXIgYmlkaSBzcGFuIGxldmVsKVxuLy8gcG9zaXRpb25zIHdpdGggYSBnaXZlbiB2aXN1YWwgcG9zaXRpb24sIHdoaWNoIGlzIGxpa2VseSB0byBjb25mdXNlXG4vLyBwZW9wbGUuIChBbmQgd291bGQgZ2VuZXJhbGx5IGJlIGEgbG90IG1vcmUgY29tcGxpY2F0ZWQuKVxuZnVuY3Rpb24gbW92ZVZpc3VhbGx5KGxpbmUsIG9yZGVyLCBkaXIsIHN0YXJ0LCBmb3J3YXJkKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBzdGFydEluZGV4ID0gc3RhcnQuaGVhZCAtIGxpbmUuZnJvbTtcbiAgICBsZXQgc3BhbkkgPSBCaWRpU3Bhbi5maW5kKG9yZGVyLCBzdGFydEluZGV4LCAoX2EgPSBzdGFydC5iaWRpTGV2ZWwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IC0xLCBzdGFydC5hc3NvYyk7XG4gICAgbGV0IHNwYW4gPSBvcmRlcltzcGFuSV0sIHNwYW5FbmQgPSBzcGFuLnNpZGUoZm9yd2FyZCwgZGlyKTtcbiAgICAvLyBFbmQgb2Ygc3BhblxuICAgIGlmIChzdGFydEluZGV4ID09IHNwYW5FbmQpIHtcbiAgICAgICAgbGV0IG5leHRJID0gc3BhbkkgKz0gZm9yd2FyZCA/IDEgOiAtMTtcbiAgICAgICAgaWYgKG5leHRJIDwgMCB8fCBuZXh0SSA+PSBvcmRlci5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgc3BhbiA9IG9yZGVyW3NwYW5JID0gbmV4dEldO1xuICAgICAgICBzdGFydEluZGV4ID0gc3Bhbi5zaWRlKCFmb3J3YXJkLCBkaXIpO1xuICAgICAgICBzcGFuRW5kID0gc3Bhbi5zaWRlKGZvcndhcmQsIGRpcik7XG4gICAgfVxuICAgIGxldCBuZXh0SW5kZXggPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgc3RhcnRJbmRleCwgc3Bhbi5mb3J3YXJkKGZvcndhcmQsIGRpcikpO1xuICAgIGlmIChuZXh0SW5kZXggPCBzcGFuLmZyb20gfHwgbmV4dEluZGV4ID4gc3Bhbi50bylcbiAgICAgICAgbmV4dEluZGV4ID0gc3BhbkVuZDtcbiAgICBtb3ZlZE92ZXIgPSBsaW5lLnRleHQuc2xpY2UoTWF0aC5taW4oc3RhcnRJbmRleCwgbmV4dEluZGV4KSwgTWF0aC5tYXgoc3RhcnRJbmRleCwgbmV4dEluZGV4KSk7XG4gICAgbGV0IG5leHRTcGFuID0gc3BhbkkgPT0gKGZvcndhcmQgPyBvcmRlci5sZW5ndGggLSAxIDogMCkgPyBudWxsIDogb3JkZXJbc3BhbkkgKyAoZm9yd2FyZCA/IDEgOiAtMSldO1xuICAgIGlmIChuZXh0U3BhbiAmJiBuZXh0SW5kZXggPT0gc3BhbkVuZCAmJiBuZXh0U3Bhbi5sZXZlbCArIChmb3J3YXJkID8gMCA6IDEpIDwgc3Bhbi5sZXZlbClcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IobmV4dFNwYW4uc2lkZSghZm9yd2FyZCwgZGlyKSArIGxpbmUuZnJvbSwgbmV4dFNwYW4uZm9yd2FyZChmb3J3YXJkLCBkaXIpID8gMSA6IC0xLCBuZXh0U3Bhbi5sZXZlbCk7XG4gICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IobmV4dEluZGV4ICsgbGluZS5mcm9tLCBzcGFuLmZvcndhcmQoZm9yd2FyZCwgZGlyKSA/IC0xIDogMSwgc3Bhbi5sZXZlbCk7XG59XG5mdW5jdGlvbiBhdXRvRGlyZWN0aW9uKHRleHQsIGZyb20sIHRvKSB7XG4gICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgIGxldCB0eXBlID0gY2hhclR5cGUodGV4dC5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgaWYgKHR5cGUgPT0gMSAvKiBULkwgKi8pXG4gICAgICAgICAgICByZXR1cm4gTFRSO1xuICAgICAgICBpZiAodHlwZSA9PSAyIC8qIFQuUiAqLyB8fCB0eXBlID09IDQgLyogVC5BTCAqLylcbiAgICAgICAgICAgIHJldHVybiBSVEw7XG4gICAgfVxuICAgIHJldHVybiBMVFI7XG59XG5cbmNvbnN0IGNsaWNrQWRkc1NlbGVjdGlvblJhbmdlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZHJhZ01vdmVzU2VsZWN0aW9uJDEgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBtb3VzZVNlbGVjdGlvblN0eWxlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZXhjZXB0aW9uU2luayA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IHVwZGF0ZUxpc3RlbmVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgaW5wdXRIYW5kbGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZm9jdXNDaGFuZ2VFZmZlY3QgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBjbGlwYm9hcmRJbnB1dEZpbHRlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGNsaXBib2FyZE91dHB1dEZpbHRlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IHBlckxpbmVUZXh0RGlyZWN0aW9uID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5zb21lKHggPT4geClcbn0pO1xuY29uc3QgbmF0aXZlU2VsZWN0aW9uSGlkZGVuID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5zb21lKHggPT4geClcbn0pO1xuY29uc3Qgc2Nyb2xsSGFuZGxlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNsYXNzIFNjcm9sbFRhcmdldCB7XG4gICAgY29uc3RydWN0b3IocmFuZ2UsIHkgPSBcIm5lYXJlc3RcIiwgeCA9IFwibmVhcmVzdFwiLCB5TWFyZ2luID0gNSwgeE1hcmdpbiA9IDUsIFxuICAgIC8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgYWJ1c2VkIHRvIGFsc28gc3RvcmUgcHJlY2lzZSBzY3JvbGxcbiAgICAvLyBzbmFwc2hvdHMsIGluc3RlYWQgb2YgYSBgc2Nyb2xsSW50b1ZpZXdgIHJlcXVlc3QuIFdoZW4gdGhpc1xuICAgIC8vIGZsYWcgaXMgYHRydWVgLCBgcmFuZ2VgIHBvaW50cyBhdCBhIHBvc2l0aW9uIGluIHRoZSByZWZlcmVuY2VcbiAgICAvLyBsaW5lLCBgeU1hcmdpbmAgaG9sZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdG9wIG9mIHRoYXRcbiAgICAvLyBsaW5lIGFuZCB0aGUgdG9wIG9mIHRoZSBlZGl0b3IsIGFuZCBgeE1hcmdpbmAgaG9sZHMgdGhlXG4gICAgLy8gZWRpdG9yJ3MgYHNjcm9sbExlZnRgLlxuICAgIGlzU25hcHNob3QgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnJhbmdlID0gcmFuZ2U7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueU1hcmdpbiA9IHlNYXJnaW47XG4gICAgICAgIHRoaXMueE1hcmdpbiA9IHhNYXJnaW47XG4gICAgICAgIHRoaXMuaXNTbmFwc2hvdCA9IGlzU25hcHNob3Q7XG4gICAgfVxuICAgIG1hcChjaGFuZ2VzKSB7XG4gICAgICAgIHJldHVybiBjaGFuZ2VzLmVtcHR5ID8gdGhpcyA6XG4gICAgICAgICAgICBuZXcgU2Nyb2xsVGFyZ2V0KHRoaXMucmFuZ2UubWFwKGNoYW5nZXMpLCB0aGlzLnksIHRoaXMueCwgdGhpcy55TWFyZ2luLCB0aGlzLnhNYXJnaW4sIHRoaXMuaXNTbmFwc2hvdCk7XG4gICAgfVxuICAgIGNsaXAoc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2UudG8gPD0gc3RhdGUuZG9jLmxlbmd0aCA/IHRoaXMgOlxuICAgICAgICAgICAgbmV3IFNjcm9sbFRhcmdldChFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHN0YXRlLmRvYy5sZW5ndGgpLCB0aGlzLnksIHRoaXMueCwgdGhpcy55TWFyZ2luLCB0aGlzLnhNYXJnaW4sIHRoaXMuaXNTbmFwc2hvdCk7XG4gICAgfVxufVxuY29uc3Qgc2Nyb2xsSW50b1ZpZXcgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKHsgbWFwOiAodCwgY2gpID0+IHQubWFwKGNoKSB9KTtcbmNvbnN0IHNldEVkaXRDb250ZXh0Rm9ybWF0dGluZyA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbi8qKlxuTG9nIG9yIHJlcG9ydCBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uIGluIGNsaWVudCBjb2RlLiBTaG91bGRcbnByb2JhYmx5IG9ubHkgYmUgdXNlZCBieSBleHRlbnNpb24gY29kZSB0aGF0IGFsbG93cyBjbGllbnQgY29kZSB0b1xucHJvdmlkZSBmdW5jdGlvbnMsIGFuZCBjYWxscyB0aG9zZSBmdW5jdGlvbnMgaW4gYSBjb250ZXh0IHdoZXJlIGFuXG5leGNlcHRpb24gY2FuJ3QgYmUgcHJvcGFnYXRlZCB0byBjYWxsaW5nIGNvZGUgaW4gYSByZWFzb25hYmxlIHdheVxuKGZvciBleGFtcGxlIHdoZW4gaW4gYW4gZXZlbnQgaGFuZGxlcikuXG5cbkVpdGhlciBjYWxscyBhIGhhbmRsZXIgcmVnaXN0ZXJlZCB3aXRoXG5bYEVkaXRvclZpZXcuZXhjZXB0aW9uU2lua2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmV4Y2VwdGlvblNpbmspLFxuYHdpbmRvdy5vbmVycm9yYCwgaWYgZGVmaW5lZCwgb3IgYGNvbnNvbGUuZXJyb3JgIChpbiB3aGljaCBjYXNlXG5pdCdsbCBwYXNzIGBjb250ZXh0YCwgd2hlbiBnaXZlbiwgYXMgZmlyc3QgYXJndW1lbnQpLlxuKi9cbmZ1bmN0aW9uIGxvZ0V4Y2VwdGlvbihzdGF0ZSwgZXhjZXB0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IGhhbmRsZXIgPSBzdGF0ZS5mYWNldChleGNlcHRpb25TaW5rKTtcbiAgICBpZiAoaGFuZGxlci5sZW5ndGgpXG4gICAgICAgIGhhbmRsZXJbMF0oZXhjZXB0aW9uKTtcbiAgICBlbHNlIGlmICh3aW5kb3cub25lcnJvcilcbiAgICAgICAgd2luZG93Lm9uZXJyb3IoU3RyaW5nKGV4Y2VwdGlvbiksIGNvbnRleHQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBleGNlcHRpb24pO1xuICAgIGVsc2UgaWYgKGNvbnRleHQpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY29udGV4dCArIFwiOlwiLCBleGNlcHRpb24pO1xuICAgIGVsc2VcbiAgICAgICAgY29uc29sZS5lcnJvcihleGNlcHRpb24pO1xufVxuY29uc3QgZWRpdGFibGUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5sZW5ndGggPyB2YWx1ZXNbMF0gOiB0cnVlIH0pO1xubGV0IG5leHRQbHVnaW5JRCA9IDA7XG5jb25zdCB2aWV3UGx1Z2luID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5WaWV3IHBsdWdpbnMgYXNzb2NpYXRlIHN0YXRlZnVsIHZhbHVlcyB3aXRoIGEgdmlldy4gVGhleSBjYW5cbmluZmx1ZW5jZSB0aGUgd2F5IHRoZSBjb250ZW50IGlzIGRyYXduLCBhbmQgYXJlIG5vdGlmaWVkIG9mIHRoaW5nc1xudGhhdCBoYXBwZW4gaW4gdGhlIHZpZXcuXG4qL1xuY2xhc3MgVmlld1BsdWdpbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpZCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjcmVhdGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZG9tRXZlbnRIYW5kbGVycywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkb21FdmVudE9ic2VydmVycywgYnVpbGRFeHRlbnNpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRIYW5kbGVycyA9IGRvbUV2ZW50SGFuZGxlcnM7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRPYnNlcnZlcnMgPSBkb21FdmVudE9ic2VydmVycztcbiAgICAgICAgdGhpcy5leHRlbnNpb24gPSBidWlsZEV4dGVuc2lvbnModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHBsdWdpbiBmcm9tIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZVxuICAgIHBsdWdpbidzIHZhbHVlLCBnaXZlbiBhbiBlZGl0b3Igdmlldy5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoY3JlYXRlLCBzcGVjKSB7XG4gICAgICAgIGNvbnN0IHsgZXZlbnRIYW5kbGVycywgZXZlbnRPYnNlcnZlcnMsIHByb3ZpZGUsIGRlY29yYXRpb25zOiBkZWNvIH0gPSBzcGVjIHx8IHt9O1xuICAgICAgICByZXR1cm4gbmV3IFZpZXdQbHVnaW4obmV4dFBsdWdpbklEKyssIGNyZWF0ZSwgZXZlbnRIYW5kbGVycywgZXZlbnRPYnNlcnZlcnMsIHBsdWdpbiA9PiB7XG4gICAgICAgICAgICBsZXQgZXh0ID0gW3ZpZXdQbHVnaW4ub2YocGx1Z2luKV07XG4gICAgICAgICAgICBpZiAoZGVjbylcbiAgICAgICAgICAgICAgICBleHQucHVzaChkZWNvcmF0aW9ucy5vZih2aWV3ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBsdWdpbkluc3QgPSB2aWV3LnBsdWdpbihwbHVnaW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGx1Z2luSW5zdCA/IGRlY28ocGx1Z2luSW5zdCkgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGUpXG4gICAgICAgICAgICAgICAgZXh0LnB1c2gocHJvdmlkZShwbHVnaW4pKTtcbiAgICAgICAgICAgIHJldHVybiBleHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBwbHVnaW4gZm9yIGEgY2xhc3Mgd2hvc2UgY29uc3RydWN0b3IgdGFrZXMgYSBzaW5nbGVcbiAgICBlZGl0b3IgdmlldyBhcyBhcmd1bWVudC5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tQ2xhc3MoY2xzLCBzcGVjKSB7XG4gICAgICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+IG5ldyBjbHModmlldyksIHNwZWMpO1xuICAgIH1cbn1cbmNsYXNzIFBsdWdpbkluc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgICAgIC8vIFdoZW4gc3RhcnRpbmcgYW4gdXBkYXRlLCBhbGwgcGx1Z2lucyBoYXZlIHRoaXMgZmllbGQgc2V0IHRvIHRoZVxuICAgICAgICAvLyB1cGRhdGUgb2JqZWN0LCBpbmRpY2F0aW5nIHRoZXkgbmVlZCB0byBiZSB1cGRhdGVkLiBXaGVuIGZpbmlzaGVkXG4gICAgICAgIC8vIHVwZGF0aW5nLCBpdCBpcyBzZXQgdG8gYGZhbHNlYC4gUmV0cmlldmluZyBhIHBsdWdpbiB0aGF0IG5lZWRzIHRvXG4gICAgICAgIC8vIGJlIHVwZGF0ZWQgd2l0aCBgdmlldy5wbHVnaW5gIGZvcmNlcyBhbiBlYWdlciB1cGRhdGUuXG4gICAgICAgIHRoaXMubXVzdFVwZGF0ZSA9IG51bGw7XG4gICAgICAgIC8vIFRoaXMgaXMgbnVsbCB3aGVuIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIGJ1dFxuICAgICAgICAvLyBpbml0aWFsaXplZCBvbiB0aGUgZmlyc3QgdXBkYXRlLlxuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdXBkYXRlKHZpZXcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zcGVjKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuc3BlYy5jcmVhdGUodmlldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlLCBcIkNvZGVNaXJyb3IgcGx1Z2luIGNyYXNoZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm11c3RVcGRhdGUpIHtcbiAgICAgICAgICAgIGxldCB1cGRhdGUgPSB0aGlzLm11c3RVcGRhdGU7XG4gICAgICAgICAgICB0aGlzLm11c3RVcGRhdGUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUudXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHVwZGF0ZS5zdGF0ZSwgZSwgXCJDb2RlTWlycm9yIHBsdWdpbiBjcmFzaGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZS5kZXN0cm95KVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZXN0cm95KHZpZXcpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoKF9hID0gdGhpcy52YWx1ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlc3Ryb3kpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlLCBcIkNvZGVNaXJyb3IgcGx1Z2luIGNyYXNoZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVhY3RpdmF0ZSgpIHtcbiAgICAgICAgdGhpcy5zcGVjID0gdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfVxufVxuY29uc3QgZWRpdG9yQXR0cmlidXRlcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGNvbnRlbnRBdHRyaWJ1dGVzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLy8gUHJvdmlkZSBkZWNvcmF0aW9uc1xuY29uc3QgZGVjb3JhdGlvbnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBvdXRlckRlY29yYXRpb25zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgYXRvbWljUmFuZ2VzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgYmlkaUlzb2xhdGVkUmFuZ2VzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuZnVuY3Rpb24gZ2V0SXNvbGF0ZWRSYW5nZXModmlldywgbGluZSkge1xuICAgIGxldCBpc29sYXRlcyA9IHZpZXcuc3RhdGUuZmFjZXQoYmlkaUlzb2xhdGVkUmFuZ2VzKTtcbiAgICBpZiAoIWlzb2xhdGVzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGlzb2xhdGVzO1xuICAgIGxldCBzZXRzID0gaXNvbGF0ZXMubWFwKGkgPT4gaSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gaSh2aWV3KSA6IGkpO1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBSYW5nZVNldC5zcGFucyhzZXRzLCBsaW5lLmZyb20sIGxpbmUudG8sIHtcbiAgICAgICAgcG9pbnQoKSB7IH0sXG4gICAgICAgIHNwYW4oZnJvbURvYywgdG9Eb2MsIGFjdGl2ZSwgb3Blbikge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBmcm9tRG9jIC0gbGluZS5mcm9tLCB0byA9IHRvRG9jIC0gbGluZS5mcm9tO1xuICAgICAgICAgICAgbGV0IGxldmVsID0gcmVzdWx0O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGFjdGl2ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSwgb3Blbi0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IGFjdGl2ZVtpXS5zcGVjLmJpZGlJc29sYXRlLCB1cGRhdGU7XG4gICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBhdXRvRGlyZWN0aW9uKGxpbmUudGV4dCwgZnJvbSwgdG8pO1xuICAgICAgICAgICAgICAgIGlmIChvcGVuID4gMCAmJiBsZXZlbC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZSA9IGxldmVsW2xldmVsLmxlbmd0aCAtIDFdKS50byA9PSBmcm9tICYmIHVwZGF0ZS5kaXJlY3Rpb24gPT0gZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZS50byA9IHRvO1xuICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IHVwZGF0ZS5pbm5lcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhZGQgPSB7IGZyb20sIHRvLCBkaXJlY3Rpb24sIGlubmVyOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICBsZXZlbC5wdXNoKGFkZCk7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsID0gYWRkLmlubmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBzY3JvbGxNYXJnaW5zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuZnVuY3Rpb24gZ2V0U2Nyb2xsTWFyZ2lucyh2aWV3KSB7XG4gICAgbGV0IGxlZnQgPSAwLCByaWdodCA9IDAsIHRvcCA9IDAsIGJvdHRvbSA9IDA7XG4gICAgZm9yIChsZXQgc291cmNlIG9mIHZpZXcuc3RhdGUuZmFjZXQoc2Nyb2xsTWFyZ2lucykpIHtcbiAgICAgICAgbGV0IG0gPSBzb3VyY2Uodmlldyk7XG4gICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgICBpZiAobS5sZWZ0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgbGVmdCA9IE1hdGgubWF4KGxlZnQsIG0ubGVmdCk7XG4gICAgICAgICAgICBpZiAobS5yaWdodCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHJpZ2h0ID0gTWF0aC5tYXgocmlnaHQsIG0ucmlnaHQpO1xuICAgICAgICAgICAgaWYgKG0udG9wICE9IG51bGwpXG4gICAgICAgICAgICAgICAgdG9wID0gTWF0aC5tYXgodG9wLCBtLnRvcCk7XG4gICAgICAgICAgICBpZiAobS5ib3R0b20gIT0gbnVsbClcbiAgICAgICAgICAgICAgICBib3R0b20gPSBNYXRoLm1heChib3R0b20sIG0uYm90dG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20gfTtcbn1cbmNvbnN0IHN0eWxlTW9kdWxlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY2xhc3MgQ2hhbmdlZFJhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tQSwgdG9BLCBmcm9tQiwgdG9CKSB7XG4gICAgICAgIHRoaXMuZnJvbUEgPSBmcm9tQTtcbiAgICAgICAgdGhpcy50b0EgPSB0b0E7XG4gICAgICAgIHRoaXMuZnJvbUIgPSBmcm9tQjtcbiAgICAgICAgdGhpcy50b0IgPSB0b0I7XG4gICAgfVxuICAgIGpvaW4ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VkUmFuZ2UoTWF0aC5taW4odGhpcy5mcm9tQSwgb3RoZXIuZnJvbUEpLCBNYXRoLm1heCh0aGlzLnRvQSwgb3RoZXIudG9BKSwgTWF0aC5taW4odGhpcy5mcm9tQiwgb3RoZXIuZnJvbUIpLCBNYXRoLm1heCh0aGlzLnRvQiwgb3RoZXIudG9CKSk7XG4gICAgfVxuICAgIGFkZFRvU2V0KHNldCkge1xuICAgICAgICBsZXQgaSA9IHNldC5sZW5ndGgsIG1lID0gdGhpcztcbiAgICAgICAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHNldFtpIC0gMV07XG4gICAgICAgICAgICBpZiAocmFuZ2UuZnJvbUEgPiBtZS50b0EpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmFuZ2UudG9BIDwgbWUuZnJvbUEpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBtZSA9IG1lLmpvaW4ocmFuZ2UpO1xuICAgICAgICAgICAgc2V0LnNwbGljZShpIC0gMSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0LnNwbGljZShpLCAwLCBtZSk7XG4gICAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBleHRlbmRXaXRoUmFuZ2VzKGRpZmYsIHJhbmdlcykge1xuICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZEkgPSAwLCBySSA9IDAsIHBvc0EgPSAwLCBwb3NCID0gMDs7IGRJKyspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZEkgPT0gZGlmZi5sZW5ndGggPyBudWxsIDogZGlmZltkSV0sIG9mZiA9IHBvc0EgLSBwb3NCO1xuICAgICAgICAgICAgbGV0IGVuZCA9IG5leHQgPyBuZXh0LmZyb21CIDogMWU5O1xuICAgICAgICAgICAgd2hpbGUgKHJJIDwgcmFuZ2VzLmxlbmd0aCAmJiByYW5nZXNbckldIDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSByYW5nZXNbckldLCB0byA9IHJhbmdlc1tySSArIDFdO1xuICAgICAgICAgICAgICAgIGxldCBmcm9tQiA9IE1hdGgubWF4KHBvc0IsIGZyb20pLCB0b0IgPSBNYXRoLm1pbihlbmQsIHRvKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUIgPD0gdG9CKVxuICAgICAgICAgICAgICAgICAgICBuZXcgQ2hhbmdlZFJhbmdlKGZyb21CICsgb2ZmLCB0b0IgKyBvZmYsIGZyb21CLCB0b0IpLmFkZFRvU2V0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHRvID4gZW5kKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJJICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIG5ldyBDaGFuZ2VkUmFuZ2UobmV4dC5mcm9tQSwgbmV4dC50b0EsIG5leHQuZnJvbUIsIG5leHQudG9CKS5hZGRUb1NldChyZXN1bHQpO1xuICAgICAgICAgICAgcG9zQSA9IG5leHQudG9BO1xuICAgICAgICAgICAgcG9zQiA9IG5leHQudG9CO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG5WaWV3IFtwbHVnaW5zXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuVmlld1BsdWdpbikgYXJlIGdpdmVuIGluc3RhbmNlcyBvZiB0aGlzXG5jbGFzcywgd2hpY2ggZGVzY3JpYmUgd2hhdCBoYXBwZW5lZCwgd2hlbmV2ZXIgdGhlIHZpZXcgaXMgdXBkYXRlZC5cbiovXG5jbGFzcyBWaWV3VXBkYXRlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgZWRpdG9yIHZpZXcgdGhhdCB0aGUgdXBkYXRlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICAqL1xuICAgIHZpZXcsIFxuICAgIC8qKlxuICAgIFRoZSBuZXcgZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgc3RhdGUsIFxuICAgIC8qKlxuICAgIFRoZSB0cmFuc2FjdGlvbnMgaW52b2x2ZWQgaW4gdGhlIHVwZGF0ZS4gTWF5IGJlIGVtcHR5LlxuICAgICovXG4gICAgdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB0cmFuc2FjdGlvbnM7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mbGFncyA9IDA7XG4gICAgICAgIHRoaXMuc3RhcnRTdGF0ZSA9IHZpZXcuc3RhdGU7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IENoYW5nZVNldC5lbXB0eSh0aGlzLnN0YXJ0U3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHRyYW5zYWN0aW9ucylcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlcyA9IHRoaXMuY2hhbmdlcy5jb21wb3NlKHRyLmNoYW5nZXMpO1xuICAgICAgICBsZXQgY2hhbmdlZFJhbmdlcyA9IFtdO1xuICAgICAgICB0aGlzLmNoYW5nZXMuaXRlckNoYW5nZWRSYW5nZXMoKGZyb21BLCB0b0EsIGZyb21CLCB0b0IpID0+IGNoYW5nZWRSYW5nZXMucHVzaChuZXcgQ2hhbmdlZFJhbmdlKGZyb21BLCB0b0EsIGZyb21CLCB0b0IpKSk7XG4gICAgICAgIHRoaXMuY2hhbmdlZFJhbmdlcyA9IGNoYW5nZWRSYW5nZXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZSh2aWV3LCBzdGF0ZSwgdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmlld1VwZGF0ZSh2aWV3LCBzdGF0ZSwgdHJhbnNhY3Rpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhlIFt2aWV3cG9ydF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudmlld3BvcnQpIG9yXG4gICAgW3Zpc2libGUgcmFuZ2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy52aXNpYmxlUmFuZ2VzKSBjaGFuZ2VkIGluIHRoaXNcbiAgICB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgdmlld3BvcnRDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiA0IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnQgKi8pID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIHdoZW5cbiAgICBbYHZpZXdwb3J0Q2hhbmdlZGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5WaWV3VXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCkgaXMgdHJ1ZVxuICAgIGFuZCB0aGUgdmlld3BvcnQgY2hhbmdlIGlzIG5vdCBqdXN0IHRoZSByZXN1bHQgb2YgbWFwcGluZyBpdCBpblxuICAgIHJlc3BvbnNlIHRvIGRvY3VtZW50IGNoYW5nZXMuXG4gICAgKi9cbiAgICBnZXQgdmlld3BvcnRNb3ZlZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgOCAvKiBVcGRhdGVGbGFnLlZpZXdwb3J0TW92ZWQgKi8pID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGhlaWdodCBvZiBhIGJsb2NrIGVsZW1lbnQgaW4gdGhlIGVkaXRvclxuICAgIGNoYW5nZWQgaW4gdGhpcyB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgaGVpZ2h0Q2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLykgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZG9jdW1lbnQgd2FzIG1vZGlmaWVkIG9yIHRoZSBzaXplIG9mIHRoZVxuICAgIGVkaXRvciwgb3IgZWxlbWVudHMgd2l0aGluIHRoZSBlZGl0b3IsIGNoYW5nZWQuXG4gICAgKi9cbiAgICBnZXQgZ2VvbWV0cnlDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NDaGFuZ2VkIHx8ICh0aGlzLmZsYWdzICYgKDE2IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi8gfCAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKSkgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyB1cGRhdGUgaW5kaWNhdGVzIGEgZm9jdXMgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IGZvY3VzQ2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgMSAvKiBVcGRhdGVGbGFnLkZvY3VzICovKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIGRvY3VtZW50IGNoYW5nZWQgaW4gdGhpcyB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgZG9jQ2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNoYW5nZXMuZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiB3YXMgZXhwbGljaXRseSBzZXQgaW4gdGhpcyB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgc2VsZWN0aW9uU2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5zZWxlY3Rpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBlbXB0eSgpIHsgcmV0dXJuIHRoaXMuZmxhZ3MgPT0gMCAmJiB0aGlzLnRyYW5zYWN0aW9ucy5sZW5ndGggPT0gMDsgfVxufVxuXG5jbGFzcyBEb2NWaWV3IGV4dGVuZHMgQ29udGVudFZpZXcge1xuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnZpZXcuc3RhdGUuZG9jLmxlbmd0aDsgfVxuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwID0gW2ZhbHNlXTtcbiAgICAgICAgdGhpcy5kb21DaGFuZ2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYXNDb21wb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24gPSBuZXcgU2V0O1xuICAgICAgICB0aGlzLmVkaXRDb250ZXh0Rm9ybWF0dGluZyA9IERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgdGhpcy5sYXN0Q29tcG9zaXRpb25BZnRlckN1cnNvciA9IGZhbHNlO1xuICAgICAgICAvLyBUcmFjayBhIG1pbmltdW0gd2lkdGggZm9yIHRoZSBlZGl0b3IuIFdoZW4gbWVhc3VyaW5nIHNpemVzIGluXG4gICAgICAgIC8vIG1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHMsIHRoaXMgaXMgdXBkYXRlZCB0byBwb2ludCBhdCB0aGUgd2lkdGhcbiAgICAgICAgLy8gb2YgYSBnaXZlbiBlbGVtZW50IGFuZCBpdHMgZXh0ZW50IGluIHRoZSBkb2N1bWVudC4gV2hlbiBhIGNoYW5nZVxuICAgICAgICAvLyBoYXBwZW5zIGluIHRoYXQgcmFuZ2UsIHRoZXNlIGFyZSByZXNldC4gVGhhdCB3YXksIG9uY2Ugd2UndmUgc2VlblxuICAgICAgICAvLyBhIGxpbmUvZWxlbWVudCBvZiBhIGdpdmVuIGxlbmd0aCwgd2Uga2VlcCB0aGUgZWRpdG9yIHdpZGUgZW5vdWdoXG4gICAgICAgIC8vIHRvIGZpdCBhdCBsZWFzdCB0aGF0IGVsZW1lbnQsIHVudGlsIGl0IGlzIGNoYW5nZWQsIGF0IHdoaWNoIHBvaW50XG4gICAgICAgIC8vIHdlIGZvcmdldCBpdCBhZ2Fpbi5cbiAgICAgICAgdGhpcy5taW5XaWR0aCA9IDA7XG4gICAgICAgIHRoaXMubWluV2lkdGhGcm9tID0gMDtcbiAgICAgICAgdGhpcy5taW5XaWR0aFRvID0gMDtcbiAgICAgICAgLy8gVHJhY2sgd2hldGhlciB0aGUgRE9NIHNlbGVjdGlvbiB3YXMgc2V0IGluIGEgbG9zc3kgd2F5LCBzbyB0aGF0XG4gICAgICAgIC8vIHdlIGRvbid0IG1lc3MgaXQgdXAgd2hlbiByZWFkaW5nIGl0IGJhY2sgaXRcbiAgICAgICAgdGhpcy5pbXByZWNpc2VBbmNob3IgPSBudWxsO1xuICAgICAgICB0aGlzLmltcHJlY2lzZUhlYWQgPSBudWxsO1xuICAgICAgICB0aGlzLmZvcmNlU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIC8vIFVzZWQgYnkgdGhlIHJlc2l6ZSBvYnNlcnZlciB0byBpZ25vcmUgcmVzaXplcyB0aGF0IHdlIGNhdXNlZFxuICAgICAgICAvLyBvdXJzZWx2ZXNcbiAgICAgICAgdGhpcy5sYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5zZXRET00odmlldy5jb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtuZXcgTGluZVZpZXddO1xuICAgICAgICB0aGlzLmNoaWxkcmVuWzBdLnNldFBhcmVudCh0aGlzKTtcbiAgICAgICAgdGhpcy51cGRhdGVEZWNvKCk7XG4gICAgICAgIHRoaXMudXBkYXRlSW5uZXIoW25ldyBDaGFuZ2VkUmFuZ2UoMCwgMCwgMCwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoKV0sIDAsIG51bGwpO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgdGhlIGRvY3VtZW50IHZpZXcgdG8gYSBnaXZlbiBzdGF0ZS5cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNoYW5nZWRSYW5nZXMgPSB1cGRhdGUuY2hhbmdlZFJhbmdlcztcbiAgICAgICAgaWYgKHRoaXMubWluV2lkdGggPiAwICYmIGNoYW5nZWRSYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZWRSYW5nZXMuZXZlcnkoKHsgZnJvbUEsIHRvQSB9KSA9PiB0b0EgPCB0aGlzLm1pbldpZHRoRnJvbSB8fCBmcm9tQSA+IHRoaXMubWluV2lkdGhUbykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoID0gdGhpcy5taW5XaWR0aEZyb20gPSB0aGlzLm1pbldpZHRoVG8gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aEZyb20gPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModGhpcy5taW5XaWR0aEZyb20sIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMubWluV2lkdGhUbyA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh0aGlzLm1pbldpZHRoVG8sIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlRWRpdENvbnRleHRGb3JtYXR0aW5nKHVwZGF0ZSk7XG4gICAgICAgIGxldCByZWFkQ29tcG9zaXRpb25BdCA9IC0xO1xuICAgICAgICBpZiAodGhpcy52aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDAgJiYgIXRoaXMudmlldy5vYnNlcnZlci5lZGl0Q29udGV4dCkge1xuICAgICAgICAgICAgaWYgKChfYSA9IHRoaXMuZG9tQ2hhbmdlZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5ld1NlbClcbiAgICAgICAgICAgICAgICByZWFkQ29tcG9zaXRpb25BdCA9IHRoaXMuZG9tQ2hhbmdlZC5uZXdTZWwuaGVhZDtcbiAgICAgICAgICAgIGVsc2UgaWYgKCF0b3VjaGVzQ29tcG9zaXRpb24odXBkYXRlLmNoYW5nZXMsIHRoaXMuaGFzQ29tcG9zaXRpb24pICYmICF1cGRhdGUuc2VsZWN0aW9uU2V0KVxuICAgICAgICAgICAgICAgIHJlYWRDb21wb3NpdGlvbkF0ID0gdXBkYXRlLnN0YXRlLnNlbGVjdGlvbi5tYWluLmhlYWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbXBvc2l0aW9uID0gcmVhZENvbXBvc2l0aW9uQXQgPiAtMSA/IGZpbmRDb21wb3NpdGlvblJhbmdlKHRoaXMudmlldywgdXBkYXRlLmNoYW5nZXMsIHJlYWRDb21wb3NpdGlvbkF0KSA6IG51bGw7XG4gICAgICAgIHRoaXMuZG9tQ2hhbmdlZCA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbXBvc2l0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtlZEZvckNvbXBvc2l0aW9uLmNsZWFyKCk7XG4gICAgICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gdGhpcy5oYXNDb21wb3NpdGlvbjtcbiAgICAgICAgICAgIGNoYW5nZWRSYW5nZXMgPSBuZXcgQ2hhbmdlZFJhbmdlKGZyb20sIHRvLCB1cGRhdGUuY2hhbmdlcy5tYXBQb3MoZnJvbSwgLTEpLCB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModG8sIDEpKVxuICAgICAgICAgICAgICAgIC5hZGRUb1NldChjaGFuZ2VkUmFuZ2VzLnNsaWNlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzQ29tcG9zaXRpb24gPSBjb21wb3NpdGlvbiA/IHsgZnJvbTogY29tcG9zaXRpb24ucmFuZ2UuZnJvbUIsIHRvOiBjb21wb3NpdGlvbi5yYW5nZS50b0IgfSA6IG51bGw7XG4gICAgICAgIC8vIFdoZW4gdGhlIERPTSBub2RlcyBhcm91bmQgdGhlIHNlbGVjdGlvbiBhcmUgbW92ZWQgdG8gYW5vdGhlclxuICAgICAgICAvLyBwYXJlbnQsIENocm9tZSBzb21ldGltZXMgcmVwb3J0cyBhIGRpZmZlcmVudCBzZWxlY3Rpb24gdGhyb3VnaFxuICAgICAgICAvLyBnZXRTZWxlY3Rpb24gdGhhbiB0aGUgb25lIHRoYXQgaXQgYWN0dWFsbHkgc2hvd3MgdG8gdGhlIHVzZXIuXG4gICAgICAgIC8vIFRoaXMgZm9yY2VzIGEgc2VsZWN0aW9uIHVwZGF0ZSB3aGVuIGxpbmVzIGFyZSBqb2luZWQgdG8gd29ya1xuICAgICAgICAvLyBhcm91bmQgdGhhdC4gSXNzdWUgIzU0XG4gICAgICAgIGlmICgoYnJvd3Nlci5pZSB8fCBicm93c2VyLmNocm9tZSkgJiYgIWNvbXBvc2l0aW9uICYmIHVwZGF0ZSAmJlxuICAgICAgICAgICAgdXBkYXRlLnN0YXRlLmRvYy5saW5lcyAhPSB1cGRhdGUuc3RhcnRTdGF0ZS5kb2MubGluZXMpXG4gICAgICAgICAgICB0aGlzLmZvcmNlU2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgbGV0IHByZXZEZWNvID0gdGhpcy5kZWNvcmF0aW9ucywgZGVjbyA9IHRoaXMudXBkYXRlRGVjbygpO1xuICAgICAgICBsZXQgZGVjb0RpZmYgPSBmaW5kQ2hhbmdlZERlY28ocHJldkRlY28sIGRlY28sIHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgY2hhbmdlZFJhbmdlcyA9IENoYW5nZWRSYW5nZS5leHRlbmRXaXRoUmFuZ2VzKGNoYW5nZWRSYW5nZXMsIGRlY29EaWZmKTtcbiAgICAgICAgaWYgKCEodGhpcy5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pICYmIGNoYW5nZWRSYW5nZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5uZXIoY2hhbmdlZFJhbmdlcywgdXBkYXRlLnN0YXJ0U3RhdGUuZG9jLmxlbmd0aCwgY29tcG9zaXRpb24pO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBVc2VkIGJ5IHVwZGF0ZSBhbmQgdGhlIGNvbnN0cnVjdG9yIGRvIHBlcmZvcm0gdGhlIGFjdHVhbCBET01cbiAgICAvLyB1cGRhdGVcbiAgICB1cGRhdGVJbm5lcihjaGFuZ2VzLCBvbGRMZW5ndGgsIGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMudmlldy52aWV3U3RhdGUubXVzdE1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbihjaGFuZ2VzLCBvbGRMZW5ndGgsIGNvbXBvc2l0aW9uKTtcbiAgICAgICAgbGV0IHsgb2JzZXJ2ZXIgfSA9IHRoaXMudmlldztcbiAgICAgICAgb2JzZXJ2ZXIuaWdub3JlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIExvY2sgdGhlIGhlaWdodCBkdXJpbmcgcmVkcmF3aW5nLCBzaW5jZSBDaHJvbWUgc29tZXRpbWVzXG4gICAgICAgICAgICAvLyBtZXNzZXMgd2l0aCB0aGUgc2Nyb2xsIHBvc2l0aW9uIGR1cmluZyBET00gbXV0YXRpb24gKHRob3VnaFxuICAgICAgICAgICAgLy8gbm8gcmVsYXlvdXQgaXMgdHJpZ2dlcmVkIGFuZCBJIGNhbm5vdCBpbWFnaW5lIGhvdyBpdCBjYW5cbiAgICAgICAgICAgIC8vIHJlY29tcHV0ZSB0aGUgc2Nyb2xsIHBvc2l0aW9uIHdpdGhvdXQgYSBsYXlvdXQpXG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5oZWlnaHQgPSB0aGlzLnZpZXcudmlld1N0YXRlLmNvbnRlbnRIZWlnaHQgLyB0aGlzLnZpZXcuc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuZmxleEJhc2lzID0gdGhpcy5taW5XaWR0aCA/IHRoaXMubWluV2lkdGggKyBcInB4XCIgOiBcIlwiO1xuICAgICAgICAgICAgLy8gQ2hyb21lIHdpbGwgc29tZXRpbWVzLCB3aGVuIERPTSBtdXRhdGlvbnMgb2NjdXIgZGlyZWN0bHlcbiAgICAgICAgICAgIC8vIGFyb3VuZCB0aGUgc2VsZWN0aW9uLCBnZXQgY29uZnVzZWQgYW5kIHJlcG9ydCBhIGRpZmZlcmVudFxuICAgICAgICAgICAgLy8gc2VsZWN0aW9uIGZyb20gdGhlIG9uZSBpdCBkaXNwbGF5cyAoaXNzdWUgIzIxOCkuIFRoaXMgdHJpZXNcbiAgICAgICAgICAgIC8vIHRvIGRldGVjdCB0aGF0IHNpdHVhdGlvbi5cbiAgICAgICAgICAgIGxldCB0cmFjayA9IGJyb3dzZXIuY2hyb21lIHx8IGJyb3dzZXIuaW9zID8geyBub2RlOiBvYnNlcnZlci5zZWxlY3Rpb25SYW5nZS5mb2N1c05vZGUsIHdyaXR0ZW46IGZhbHNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnN5bmModGhpcy52aWV3LCB0cmFjayk7XG4gICAgICAgICAgICB0aGlzLmZsYWdzICY9IH43IC8qIFZpZXdGbGFnLkRpcnR5ICovO1xuICAgICAgICAgICAgaWYgKHRyYWNrICYmICh0cmFjay53cml0dGVuIHx8IG9ic2VydmVyLnNlbGVjdGlvblJhbmdlLmZvY3VzTm9kZSAhPSB0cmFjay5ub2RlKSlcbiAgICAgICAgICAgICAgICB0aGlzLmZvcmNlU2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmhlaWdodCA9IFwiXCI7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1hcmtlZEZvckNvbXBvc2l0aW9uLmZvckVhY2goY1ZpZXcgPT4gY1ZpZXcuZmxhZ3MgJj0gfjggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pO1xuICAgICAgICBsZXQgZ2FwcyA9IFtdO1xuICAgICAgICBpZiAodGhpcy52aWV3LnZpZXdwb3J0LmZyb20gfHwgdGhpcy52aWV3LnZpZXdwb3J0LnRvIDwgdGhpcy52aWV3LnN0YXRlLmRvYy5sZW5ndGgpXG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldyAmJiBjaGlsZC53aWRnZXQgaW5zdGFuY2VvZiBCbG9ja0dhcFdpZGdldClcbiAgICAgICAgICAgICAgICAgICAgZ2Fwcy5wdXNoKGNoaWxkLmRvbSk7XG4gICAgICAgIG9ic2VydmVyLnVwZGF0ZUdhcHMoZ2Fwcyk7XG4gICAgfVxuICAgIHVwZGF0ZUNoaWxkcmVuKGNoYW5nZXMsIG9sZExlbmd0aCwgY29tcG9zaXRpb24pIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IGNvbXBvc2l0aW9uID8gY29tcG9zaXRpb24ucmFuZ2UuYWRkVG9TZXQoY2hhbmdlcy5zbGljZSgpKSA6IGNoYW5nZXM7XG4gICAgICAgIGxldCBjdXJzb3IgPSB0aGlzLmNoaWxkQ3Vyc29yKG9sZExlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSByYW5nZXMubGVuZ3RoIC0gMTs7IGktLSkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBpID49IDAgPyByYW5nZXNbaV0gOiBudWxsO1xuICAgICAgICAgICAgaWYgKCFuZXh0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IHsgZnJvbUEsIHRvQSwgZnJvbUIsIHRvQiB9ID0gbmV4dCwgY29udGVudCwgYnJlYWtBdFN0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQ7XG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb24gJiYgY29tcG9zaXRpb24ucmFuZ2UuZnJvbUIgPCB0b0IgJiYgY29tcG9zaXRpb24ucmFuZ2UudG9CID4gZnJvbUIpIHtcbiAgICAgICAgICAgICAgICBsZXQgYmVmb3JlID0gQ29udGVudEJ1aWxkZXIuYnVpbGQodGhpcy52aWV3LnN0YXRlLmRvYywgZnJvbUIsIGNvbXBvc2l0aW9uLnJhbmdlLmZyb21CLCB0aGlzLmRlY29yYXRpb25zLCB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwKTtcbiAgICAgICAgICAgICAgICBsZXQgYWZ0ZXIgPSBDb250ZW50QnVpbGRlci5idWlsZCh0aGlzLnZpZXcuc3RhdGUuZG9jLCBjb21wb3NpdGlvbi5yYW5nZS50b0IsIHRvQiwgdGhpcy5kZWNvcmF0aW9ucywgdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcCk7XG4gICAgICAgICAgICAgICAgYnJlYWtBdFN0YXJ0ID0gYmVmb3JlLmJyZWFrQXRTdGFydDtcbiAgICAgICAgICAgICAgICBvcGVuU3RhcnQgPSBiZWZvcmUub3BlblN0YXJ0O1xuICAgICAgICAgICAgICAgIG9wZW5FbmQgPSBhZnRlci5vcGVuRW5kO1xuICAgICAgICAgICAgICAgIGxldCBjb21wTGluZSA9IHRoaXMuY29tcG9zaXRpb25WaWV3KGNvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIuYnJlYWtBdFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBMaW5lLmJyZWFrQWZ0ZXIgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhZnRlci5jb250ZW50Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICBjb21wTGluZS5tZXJnZShjb21wTGluZS5sZW5ndGgsIGNvbXBMaW5lLmxlbmd0aCwgYWZ0ZXIuY29udGVudFswXSwgZmFsc2UsIGFmdGVyLm9wZW5TdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcExpbmUuYnJlYWtBZnRlciA9IGFmdGVyLmNvbnRlbnRbMF0uYnJlYWtBZnRlcjtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIuY29udGVudC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYmVmb3JlLmNvbnRlbnQubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbXBMaW5lLm1lcmdlKDAsIDAsIGJlZm9yZS5jb250ZW50W2JlZm9yZS5jb250ZW50Lmxlbmd0aCAtIDFdLCB0cnVlLCAwLCBiZWZvcmUub3BlbkVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlLmNvbnRlbnQucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBiZWZvcmUuY29udGVudC5jb25jYXQoY29tcExpbmUpLmNvbmNhdChhZnRlci5jb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICh7IGNvbnRlbnQsIGJyZWFrQXRTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kIH0gPVxuICAgICAgICAgICAgICAgICAgICBDb250ZW50QnVpbGRlci5idWlsZCh0aGlzLnZpZXcuc3RhdGUuZG9jLCBmcm9tQiwgdG9CLCB0aGlzLmRlY29yYXRpb25zLCB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgeyBpOiB0b0ksIG9mZjogdG9PZmYgfSA9IGN1cnNvci5maW5kUG9zKHRvQSwgMSk7XG4gICAgICAgICAgICBsZXQgeyBpOiBmcm9tSSwgb2ZmOiBmcm9tT2ZmIH0gPSBjdXJzb3IuZmluZFBvcyhmcm9tQSwgLTEpO1xuICAgICAgICAgICAgcmVwbGFjZVJhbmdlKHRoaXMsIGZyb21JLCBmcm9tT2ZmLCB0b0ksIHRvT2ZmLCBjb250ZW50LCBicmVha0F0U3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBvc2l0aW9uKVxuICAgICAgICAgICAgdGhpcy5maXhDb21wb3NpdGlvbkRPTShjb21wb3NpdGlvbik7XG4gICAgfVxuICAgIHVwZGF0ZUVkaXRDb250ZXh0Rm9ybWF0dGluZyh1cGRhdGUpIHtcbiAgICAgICAgdGhpcy5lZGl0Q29udGV4dEZvcm1hdHRpbmcgPSB0aGlzLmVkaXRDb250ZXh0Rm9ybWF0dGluZy5tYXAodXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICBmb3IgKGxldCB0ciBvZiB1cGRhdGUudHJhbnNhY3Rpb25zKVxuICAgICAgICAgICAgZm9yIChsZXQgZWZmZWN0IG9mIHRyLmVmZmVjdHMpXG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdC5pcyhzZXRFZGl0Q29udGV4dEZvcm1hdHRpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHRGb3JtYXR0aW5nID0gZWZmZWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICB9XG4gICAgY29tcG9zaXRpb25WaWV3KGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBjdXIgPSBuZXcgVGV4dFZpZXcoY29tcG9zaXRpb24udGV4dC5ub2RlVmFsdWUpO1xuICAgICAgICBjdXIuZmxhZ3MgfD0gOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLztcbiAgICAgICAgZm9yIChsZXQgeyBkZWNvIH0gb2YgY29tcG9zaXRpb24ubWFya3MpXG4gICAgICAgICAgICBjdXIgPSBuZXcgTWFya1ZpZXcoZGVjbywgW2N1cl0sIGN1ci5sZW5ndGgpO1xuICAgICAgICBsZXQgbGluZSA9IG5ldyBMaW5lVmlldztcbiAgICAgICAgbGluZS5hcHBlbmQoY3VyLCAwKTtcbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfVxuICAgIGZpeENvbXBvc2l0aW9uRE9NKGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBmaXggPSAoZG9tLCBjVmlldykgPT4ge1xuICAgICAgICAgICAgY1ZpZXcuZmxhZ3MgfD0gOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLyB8IChjVmlldy5jaGlsZHJlbi5zb21lKGMgPT4gYy5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pID8gMSAvKiBWaWV3RmxhZy5DaGlsZERpcnR5ICovIDogMCk7XG4gICAgICAgICAgICB0aGlzLm1hcmtlZEZvckNvbXBvc2l0aW9uLmFkZChjVmlldyk7XG4gICAgICAgICAgICBsZXQgcHJldiA9IENvbnRlbnRWaWV3LmdldChkb20pO1xuICAgICAgICAgICAgaWYgKHByZXYgJiYgcHJldiAhPSBjVmlldylcbiAgICAgICAgICAgICAgICBwcmV2LmRvbSA9IG51bGw7XG4gICAgICAgICAgICBjVmlldy5zZXRET00oZG9tKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuY2hpbGRQb3MoY29tcG9zaXRpb24ucmFuZ2UuZnJvbUIsIDEpO1xuICAgICAgICBsZXQgY1ZpZXcgPSB0aGlzLmNoaWxkcmVuW3Bvcy5pXTtcbiAgICAgICAgZml4KGNvbXBvc2l0aW9uLmxpbmUsIGNWaWV3KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGNvbXBvc2l0aW9uLm1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gLTE7IGktLSkge1xuICAgICAgICAgICAgcG9zID0gY1ZpZXcuY2hpbGRQb3MocG9zLm9mZiwgMSk7XG4gICAgICAgICAgICBjVmlldyA9IGNWaWV3LmNoaWxkcmVuW3Bvcy5pXTtcbiAgICAgICAgICAgIGZpeChpID49IDAgPyBjb21wb3NpdGlvbi5tYXJrc1tpXS5ub2RlIDogY29tcG9zaXRpb24udGV4dCwgY1ZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFN5bmMgdGhlIERPTSBzZWxlY3Rpb24gdG8gdGhpcy5zdGF0ZS5zZWxlY3Rpb25cbiAgICB1cGRhdGVTZWxlY3Rpb24obXVzdFJlYWQgPSBmYWxzZSwgZnJvbVBvaW50ZXIgPSBmYWxzZSkge1xuICAgICAgICBpZiAobXVzdFJlYWQgfHwgIXRoaXMudmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZS5mb2N1c05vZGUpXG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBhY3RpdmVFbHQgPSB0aGlzLnZpZXcucm9vdC5hY3RpdmVFbGVtZW50LCBmb2N1c2VkID0gYWN0aXZlRWx0ID09IHRoaXMuZG9tO1xuICAgICAgICBsZXQgc2VsZWN0aW9uTm90Rm9jdXMgPSAhZm9jdXNlZCAmJiAhKHRoaXMudmlldy5zdGF0ZS5mYWNldChlZGl0YWJsZSkgfHwgdGhpcy5kb20udGFiSW5kZXggPiAtMSkgJiZcbiAgICAgICAgICAgIGhhc1NlbGVjdGlvbih0aGlzLmRvbSwgdGhpcy52aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlKSAmJiAhKGFjdGl2ZUVsdCAmJiB0aGlzLmRvbS5jb250YWlucyhhY3RpdmVFbHQpKTtcbiAgICAgICAgaWYgKCEoZm9jdXNlZCB8fCBmcm9tUG9pbnRlciB8fCBzZWxlY3Rpb25Ob3RGb2N1cykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBmb3JjZSA9IHRoaXMuZm9yY2VTZWxlY3Rpb247XG4gICAgICAgIHRoaXMuZm9yY2VTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgbGV0IG1haW4gPSB0aGlzLnZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgIGxldCBhbmNob3IgPSB0aGlzLm1vdmVUb0xpbmUodGhpcy5kb21BdFBvcyhtYWluLmFuY2hvcikpO1xuICAgICAgICBsZXQgaGVhZCA9IG1haW4uZW1wdHkgPyBhbmNob3IgOiB0aGlzLm1vdmVUb0xpbmUodGhpcy5kb21BdFBvcyhtYWluLmhlYWQpKTtcbiAgICAgICAgLy8gQWx3YXlzIHJlc2V0IG9uIEZpcmVmb3ggd2hlbiBuZXh0IHRvIGFuIHVuZWRpdGFibGUgbm9kZSB0b1xuICAgICAgICAvLyBhdm9pZCBpbnZpc2libGUgY3Vyc29yIGJ1Z3MgKCMxMTEpXG4gICAgICAgIGlmIChicm93c2VyLmdlY2tvICYmIG1haW4uZW1wdHkgJiYgIXRoaXMuaGFzQ29tcG9zaXRpb24gJiYgYmV0d2VlblVuZWRpdGFibGUoYW5jaG9yKSkge1xuICAgICAgICAgICAgbGV0IGR1bW15ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuaWdub3JlKCgpID0+IGFuY2hvci5ub2RlLmluc2VydEJlZm9yZShkdW1teSwgYW5jaG9yLm5vZGUuY2hpbGROb2Rlc1thbmNob3Iub2Zmc2V0XSB8fCBudWxsKSk7XG4gICAgICAgICAgICBhbmNob3IgPSBoZWFkID0gbmV3IERPTVBvcyhkdW1teSwgMCk7XG4gICAgICAgICAgICBmb3JjZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRvbVNlbCA9IHRoaXMudmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBhbHJlYWR5IGhlcmUsIG9yIGluIGFuIGVxdWl2YWxlbnQgcG9zaXRpb24sIGRvbid0IHRvdWNoIGl0XG4gICAgICAgIGlmIChmb3JjZSB8fCAhZG9tU2VsLmZvY3VzTm9kZSB8fCAoIWlzRXF1aXZhbGVudFBvc2l0aW9uKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0LCBkb21TZWwuYW5jaG9yTm9kZSwgZG9tU2VsLmFuY2hvck9mZnNldCkgfHxcbiAgICAgICAgICAgICFpc0VxdWl2YWxlbnRQb3NpdGlvbihoZWFkLm5vZGUsIGhlYWQub2Zmc2V0LCBkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQpKSAmJiAhdGhpcy5zdXBwcmVzc1dpZGdldEN1cnNvckNoYW5nZShkb21TZWwsIG1haW4pKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuaWdub3JlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDaHJvbWUgQW5kcm9pZCB3aWxsIGhpZGUgdGhlIHZpcnR1YWwga2V5Ym9hcmQgd2hlbiB0YXBwaW5nXG4gICAgICAgICAgICAgICAgLy8gaW5zaWRlIGFuIHVuZWRpdGFibGUgbm9kZSwgYW5kIG5vdCBicmluZyBpdCBiYWNrIHdoZW4gd2VcbiAgICAgICAgICAgICAgICAvLyBtb3ZlIHRoZSBjdXJzb3IgdG8gaXRzIHByb3BlciBwb3NpdGlvbi4gVGhpcyB0cmllcyB0b1xuICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIGtleWJvYXJkIGJ5IGN5Y2xpbmcgZm9jdXMuXG4gICAgICAgICAgICAgICAgaWYgKGJyb3dzZXIuYW5kcm9pZCAmJiBicm93c2VyLmNocm9tZSAmJiB0aGlzLmRvbS5jb250YWlucyhkb21TZWwuZm9jdXNOb2RlKSAmJlxuICAgICAgICAgICAgICAgICAgICBpblVuZWRpdGFibGUoZG9tU2VsLmZvY3VzTm9kZSwgdGhpcy5kb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmF3U2VsID0gZ2V0U2VsZWN0aW9uKHRoaXMudmlldy5yb290KTtcbiAgICAgICAgICAgICAgICBpZiAoIXJhd1NlbCkgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1haW4uZW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV29yayBhcm91bmQgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMjA3NlxuICAgICAgICAgICAgICAgICAgICBpZiAoYnJvd3Nlci5nZWNrbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRUbyA9IG5leHRUb1VuZWRpdGFibGUoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRUbyAmJiBuZXh0VG8gIT0gKDEgLyogTmV4dFRvLkJlZm9yZSAqLyB8IDIgLyogTmV4dFRvLkFmdGVyICovKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gKG5leHRUbyA9PSAxIC8qIE5leHRUby5CZWZvcmUgKi8gPyB0ZXh0Tm9kZUJlZm9yZSA6IHRleHROb2RlQWZ0ZXIpKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gbmV3IERPTVBvcyh0ZXh0Lm5vZGUsIHRleHQub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByYXdTZWwuY29sbGFwc2UoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFpbi5iaWRpTGV2ZWwgIT0gbnVsbCAmJiByYXdTZWwuY2FyZXRCaWRpTGV2ZWwgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd1NlbC5jYXJldEJpZGlMZXZlbCA9IG1haW4uYmlkaUxldmVsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXdTZWwuZXh0ZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdGlvbi5leHRlbmQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuICdpbnZlcnRlZCcgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIC8vIChvbmUgd2hlcmUgdGhlIGZvY3VzIGlzIGJlZm9yZSB0aGUgYW5jaG9yKSwgYnV0IG5vdCBhbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gYnJvd3NlcnMgc3VwcG9ydCBpdCB5ZXQuXG4gICAgICAgICAgICAgICAgICAgIHJhd1NlbC5jb2xsYXBzZShhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhZmFyaSB3aWxsIGlnbm9yZSB0aGUgY2FsbCBhYm92ZSB3aGVuIHRoZSBlZGl0b3IgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZGVuLCBhbmQgdGhlbiByYWlzZSBhbiBlcnJvciBvbiB0aGUgY2FsbCB0byBleHRlbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gKCM5NDApLlxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmV4dGVuZChoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBQcmltaXRpdmUgKElFKSB3YXlcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1haW4uYW5jaG9yID4gbWFpbi5oZWFkKVxuICAgICAgICAgICAgICAgICAgICAgICAgW2FuY2hvciwgaGVhZF0gPSBbaGVhZCwgYW5jaG9yXTtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKGhlYWQubm9kZSwgaGVhZC5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIHJhd1NlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbk5vdEZvY3VzICYmIHRoaXMudmlldy5yb290LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uYmx1cigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlRWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRWx0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuc2V0U2VsZWN0aW9uUmFuZ2UoYW5jaG9yLCBoZWFkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmltcHJlY2lzZUFuY2hvciA9IGFuY2hvci5wcmVjaXNlID8gbnVsbCA6IG5ldyBET01Qb3MoZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpO1xuICAgICAgICB0aGlzLmltcHJlY2lzZUhlYWQgPSBoZWFkLnByZWNpc2UgPyBudWxsIDogbmV3IERPTVBvcyhkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQpO1xuICAgIH1cbiAgICAvLyBJZiBhIHplcm8tbGVuZ3RoIHdpZGdldCBpcyBpbnNlcnRlZCBuZXh0IHRvIHRoZSBjdXJzb3IgZHVyaW5nXG4gICAgLy8gY29tcG9zaXRpb24sIGF2b2lkIG1vdmluZyBpdCBhY3Jvc3MgaXQgYW5kIGRpc3J1cHRpbmcgdGhlXG4gICAgLy8gY29tcG9zaXRpb24uXG4gICAgc3VwcHJlc3NXaWRnZXRDdXJzb3JDaGFuZ2Uoc2VsLCBjdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzQ29tcG9zaXRpb24gJiYgY3Vyc29yLmVtcHR5ICYmXG4gICAgICAgICAgICBpc0VxdWl2YWxlbnRQb3NpdGlvbihzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQsIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KSAmJlxuICAgICAgICAgICAgdGhpcy5wb3NGcm9tRE9NKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCkgPT0gY3Vyc29yLmhlYWQ7XG4gICAgfVxuICAgIGVuZm9yY2VDdXJzb3JBc3NvYygpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29tcG9zaXRpb24pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXMsIGN1cnNvciA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgIGxldCBzZWwgPSBnZXRTZWxlY3Rpb24odmlldy5yb290KTtcbiAgICAgICAgbGV0IHsgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0IH0gPSB2aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICBpZiAoIXNlbCB8fCAhY3Vyc29yLmVtcHR5IHx8ICFjdXJzb3IuYXNzb2MgfHwgIXNlbC5tb2RpZnkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBsaW5lID0gTGluZVZpZXcuZmluZCh0aGlzLCBjdXJzb3IuaGVhZCk7XG4gICAgICAgIGlmICghbGluZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGxpbmVTdGFydCA9IGxpbmUucG9zQXRTdGFydDtcbiAgICAgICAgaWYgKGN1cnNvci5oZWFkID09IGxpbmVTdGFydCB8fCBjdXJzb3IuaGVhZCA9PSBsaW5lU3RhcnQgKyBsaW5lLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGJlZm9yZSA9IHRoaXMuY29vcmRzQXQoY3Vyc29yLmhlYWQsIC0xKSwgYWZ0ZXIgPSB0aGlzLmNvb3Jkc0F0KGN1cnNvci5oZWFkLCAxKTtcbiAgICAgICAgaWYgKCFiZWZvcmUgfHwgIWFmdGVyIHx8IGJlZm9yZS5ib3R0b20gPiBhZnRlci50b3ApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBkb20gPSB0aGlzLmRvbUF0UG9zKGN1cnNvci5oZWFkICsgY3Vyc29yLmFzc29jKTtcbiAgICAgICAgc2VsLmNvbGxhcHNlKGRvbS5ub2RlLCBkb20ub2Zmc2V0KTtcbiAgICAgICAgc2VsLm1vZGlmeShcIm1vdmVcIiwgY3Vyc29yLmFzc29jIDwgMCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiLCBcImxpbmVib3VuZGFyeVwiKTtcbiAgICAgICAgLy8gVGhpcyBjYW4gZ28gd3JvbmcgaW4gY29ybmVyIGNhc2VzIGxpa2Ugc2luZ2xlLWNoYXJhY3RlciBsaW5lcyxcbiAgICAgICAgLy8gc28gY2hlY2sgYW5kIHJlc2V0IGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgdmlldy5vYnNlcnZlci5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IG5ld1JhbmdlID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgaWYgKHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKG5ld1JhbmdlLmFuY2hvck5vZGUsIG5ld1JhbmdlLmFuY2hvck9mZnNldCkgIT0gY3Vyc29yLmZyb20pXG4gICAgICAgICAgICBzZWwuY29sbGFwc2UoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gSWYgYSBwb3NpdGlvbiBpcyBpbi9uZWFyIGEgYmxvY2sgd2lkZ2V0LCBtb3ZlIGl0IHRvIGEgbmVhcmJ5IHRleHRcbiAgICAvLyBsaW5lLCBzaW5jZSB3ZSBkb24ndCB3YW50IHRoZSBjdXJzb3IgaW5zaWRlIGEgYmxvY2sgd2lkZ2V0LlxuICAgIG1vdmVUb0xpbmUocG9zKSB7XG4gICAgICAgIC8vIEJsb2NrIHdpZGdldHMgd2lsbCByZXR1cm4gcG9zaXRpb25zIGJlZm9yZS9hZnRlciB0aGVtLCB3aGljaFxuICAgICAgICAvLyBhcmUgdGh1cyBkaXJlY3RseSBpbiB0aGUgZG9jdW1lbnQgRE9NIGVsZW1lbnQuXG4gICAgICAgIGxldCBkb20gPSB0aGlzLmRvbSwgbmV3UG9zO1xuICAgICAgICBpZiAocG9zLm5vZGUgIT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgZm9yIChsZXQgaSA9IHBvcy5vZmZzZXQ7ICFuZXdQb3MgJiYgaSA8IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChkb20uY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIExpbmVWaWV3KVxuICAgICAgICAgICAgICAgIG5ld1BvcyA9IHZpZXcuZG9tQXRQb3MoMCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IHBvcy5vZmZzZXQgLSAxOyAhbmV3UG9zICYmIGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChkb20uY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIExpbmVWaWV3KVxuICAgICAgICAgICAgICAgIG5ld1BvcyA9IHZpZXcuZG9tQXRQb3Modmlldy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdQb3MgPyBuZXcgRE9NUG9zKG5ld1Bvcy5ub2RlLCBuZXdQb3Mub2Zmc2V0LCB0cnVlKSA6IHBvcztcbiAgICB9XG4gICAgbmVhcmVzdChkb20pIHtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gZG9tOyBjdXI7KSB7XG4gICAgICAgICAgICBsZXQgZG9tVmlldyA9IENvbnRlbnRWaWV3LmdldChjdXIpO1xuICAgICAgICAgICAgaWYgKGRvbVZpZXcgJiYgZG9tVmlldy5yb290VmlldyA9PSB0aGlzKVxuICAgICAgICAgICAgICAgIHJldHVybiBkb21WaWV3O1xuICAgICAgICAgICAgY3VyID0gY3VyLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5uZWFyZXN0KG5vZGUpO1xuICAgICAgICBpZiAoIXZpZXcpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRyeWluZyB0byBmaW5kIHBvc2l0aW9uIGZvciBhIERPTSBwb3NpdGlvbiBvdXRzaWRlIG9mIHRoZSBkb2N1bWVudFwiKTtcbiAgICAgICAgcmV0dXJuIHZpZXcubG9jYWxQb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkgKyB2aWV3LnBvc0F0U3RhcnQ7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICBsZXQgeyBpLCBvZmYgfSA9IHRoaXMuY2hpbGRDdXJzb3IoKS5maW5kUG9zKHBvcywgLTEpO1xuICAgICAgICBmb3IgKDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAob2ZmIDwgY2hpbGQubGVuZ3RoIHx8IGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBvZmYgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2ldLmRvbUF0UG9zKG9mZik7XG4gICAgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgYmVzdCA9IG51bGwsIGJlc3RQb3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBvZmYgPSB0aGlzLmxlbmd0aCwgaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZiAtIGNoaWxkLmJyZWFrQWZ0ZXIsIHN0YXJ0ID0gZW5kIC0gY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA8IHBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChzdGFydCA8PSBwb3MgJiYgKHN0YXJ0IDwgcG9zIHx8IGNoaWxkLmNvdmVycygtMSkpICYmIChlbmQgPiBwb3MgfHwgY2hpbGQuY292ZXJzKDEpKSAmJlxuICAgICAgICAgICAgICAgICghYmVzdCB8fCBjaGlsZCBpbnN0YW5jZW9mIExpbmVWaWV3ICYmICEoYmVzdCBpbnN0YW5jZW9mIExpbmVWaWV3ICYmIHNpZGUgPj0gMCkpKSB7XG4gICAgICAgICAgICAgICAgYmVzdCA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGJlc3RQb3MgPSBzdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJlc3QgJiYgc3RhcnQgPT0gcG9zICYmIGVuZCA9PSBwb3MgJiYgY2hpbGQgaW5zdGFuY2VvZiBCbG9ja1dpZGdldFZpZXcgJiYgTWF0aC5hYnMoc2lkZSkgPCAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmRlY28uc3RhcnRTaWRlIDwgMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmYgPSBzdGFydDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmVzdCA/IGJlc3QuY29vcmRzQXQocG9zIC0gYmVzdFBvcywgc2lkZSkgOiBudWxsO1xuICAgIH1cbiAgICBjb29yZHNGb3JDaGFyKHBvcykge1xuICAgICAgICBsZXQgeyBpLCBvZmYgfSA9IHRoaXMuY2hpbGRQb3MocG9zLCAxKSwgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIExpbmVWaWV3KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB3aGlsZSAoY2hpbGQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgeyBpLCBvZmY6IGNoaWxkT2ZmIH0gPSBjaGlsZC5jaGlsZFBvcyhvZmYsIDEpO1xuICAgICAgICAgICAgZm9yICg7OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBjaGlsZC5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmICgoY2hpbGQgPSBjaGlsZC5jaGlsZHJlbltpXSkubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IGNoaWxkT2ZmO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgVGV4dFZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBlbmQgPSBmaW5kQ2x1c3RlckJyZWFrKGNoaWxkLnRleHQsIG9mZik7XG4gICAgICAgIGlmIChlbmQgPT0gb2ZmKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByZWN0cyA9IHRleHRSYW5nZShjaGlsZC5kb20sIG9mZiwgZW5kKS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2ldO1xuICAgICAgICAgICAgaWYgKGkgPT0gcmVjdHMubGVuZ3RoIC0gMSB8fCByZWN0LnRvcCA8IHJlY3QuYm90dG9tICYmIHJlY3QubGVmdCA8IHJlY3QucmlnaHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIG1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHModmlld3BvcnQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdLCB7IGZyb20sIHRvIH0gPSB2aWV3cG9ydDtcbiAgICAgICAgbGV0IGNvbnRlbnRXaWR0aCA9IHRoaXMudmlldy5jb250ZW50RE9NLmNsaWVudFdpZHRoO1xuICAgICAgICBsZXQgaXNXaWRlciA9IGNvbnRlbnRXaWR0aCA+IE1hdGgubWF4KHRoaXMudmlldy5zY3JvbGxET00uY2xpZW50V2lkdGgsIHRoaXMubWluV2lkdGgpICsgMTtcbiAgICAgICAgbGV0IHdpZGVzdCA9IC0xLCBsdHIgPSB0aGlzLnZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IHBvcyArIGNoaWxkLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPiB0bylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChwb3MgPj0gZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZFJlY3QgPSBjaGlsZC5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGRSZWN0LmhlaWdodCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzV2lkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBjaGlsZC5kb20ubGFzdENoaWxkO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdHMgPSBsYXN0ID8gY2xpZW50UmVjdHNGb3IobGFzdCkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tyZWN0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IGx0ciA/IHJlY3QucmlnaHQgLSBjaGlsZFJlY3QubGVmdCA6IGNoaWxkUmVjdC5yaWdodCAtIHJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IHdpZGVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGVzdCA9IHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluV2lkdGggPSBjb250ZW50V2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aEZyb20gPSBwb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aFRvID0gZW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gZW5kICsgY2hpbGQuYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0ZXh0RGlyZWN0aW9uQXQocG9zKSB7XG4gICAgICAgIGxldCB7IGkgfSA9IHRoaXMuY2hpbGRQb3MocG9zLCAxKTtcbiAgICAgICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGlsZHJlbltpXS5kb20pLmRpcmVjdGlvbiA9PSBcInJ0bFwiID8gRGlyZWN0aW9uLlJUTCA6IERpcmVjdGlvbi5MVFI7XG4gICAgfVxuICAgIG1lYXN1cmVUZXh0U2l6ZSgpIHtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVhc3VyZSA9IGNoaWxkLm1lYXN1cmVUZXh0U2l6ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBubyB3b3JrYWJsZSBsaW5lIGV4aXN0cywgZm9yY2UgYSBsYXlvdXQgb2YgYSBtZWFzdXJhYmxlIGVsZW1lbnRcbiAgICAgICAgbGV0IGR1bW15ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSwgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0O1xuICAgICAgICBkdW1teS5jbGFzc05hbWUgPSBcImNtLWxpbmVcIjtcbiAgICAgICAgZHVtbXkuc3R5bGUud2lkdGggPSBcIjk5OTk5cHhcIjtcbiAgICAgICAgZHVtbXkuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgIGR1bW15LnRleHRDb250ZW50ID0gXCJhYmMgZGVmIGdoaSBqa2wgbW5vIHBxciBzdHVcIjtcbiAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZChkdW1teSk7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IGNsaWVudFJlY3RzRm9yKGR1bW15LmZpcnN0Q2hpbGQpWzBdO1xuICAgICAgICAgICAgbGluZUhlaWdodCA9IGR1bW15LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgIGNoYXJXaWR0aCA9IHJlY3QgPyByZWN0LndpZHRoIC8gMjcgOiA3O1xuICAgICAgICAgICAgdGV4dEhlaWdodCA9IHJlY3QgPyByZWN0LmhlaWdodCA6IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBkdW1teS5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCB9O1xuICAgIH1cbiAgICBjaGlsZEN1cnNvcihwb3MgPSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAvLyBNb3ZlIGJhY2sgdG8gc3RhcnQgb2YgbGFzdCBlbGVtZW50IHdoZW4gcG9zc2libGUsIHNvIHRoYXRcbiAgICAgICAgLy8gYENoaWxkQ3Vyc29yLmZpbmRQb3NgIGRvZXNuJ3QgaGF2ZSB0byBkZWFsIHdpdGggdGhlIGVkZ2UgY2FzZVxuICAgICAgICAvLyBvZiBiZWluZyBhZnRlciB0aGUgbGFzdCBlbGVtZW50LlxuICAgICAgICBsZXQgaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICBpZiAoaSlcbiAgICAgICAgICAgIHBvcyAtPSB0aGlzLmNoaWxkcmVuWy0taV0ubGVuZ3RoO1xuICAgICAgICByZXR1cm4gbmV3IENoaWxkQ3Vyc29yKHRoaXMuY2hpbGRyZW4sIHBvcywgaSk7XG4gICAgfVxuICAgIGNvbXB1dGVCbG9ja0dhcERlY28oKSB7XG4gICAgICAgIGxldCBkZWNvID0gW10sIHZzID0gdGhpcy52aWV3LnZpZXdTdGF0ZTtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gMCwgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gaSA9PSB2cy52aWV3cG9ydHMubGVuZ3RoID8gbnVsbCA6IHZzLnZpZXdwb3J0c1tpXTtcbiAgICAgICAgICAgIGxldCBlbmQgPSBuZXh0ID8gbmV4dC5mcm9tIC0gMSA6IHRoaXMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHBvcykge1xuICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSAodnMubGluZUJsb2NrQXQoZW5kKS5ib3R0b20gLSB2cy5saW5lQmxvY2tBdChwb3MpLnRvcCkgLyB0aGlzLnZpZXcuc2NhbGVZO1xuICAgICAgICAgICAgICAgIGRlY28ucHVzaChEZWNvcmF0aW9uLnJlcGxhY2Uoe1xuICAgICAgICAgICAgICAgICAgICB3aWRnZXQ6IG5ldyBCbG9ja0dhcFdpZGdldChoZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICBibG9jazogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBpc0Jsb2NrR2FwOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pLnJhbmdlKHBvcywgZW5kKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBwb3MgPSBuZXh0LnRvICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5zZXQoZGVjbyk7XG4gICAgfVxuICAgIHVwZGF0ZURlY28oKSB7XG4gICAgICAgIGxldCBpID0gMTtcbiAgICAgICAgbGV0IGFsbERlY28gPSB0aGlzLnZpZXcuc3RhdGUuZmFjZXQoZGVjb3JhdGlvbnMpLm1hcChkID0+IHtcbiAgICAgICAgICAgIGxldCBkeW5hbWljID0gdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcFtpKytdID0gdHlwZW9mIGQgPT0gXCJmdW5jdGlvblwiO1xuICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWMgPyBkKHRoaXMudmlldykgOiBkO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGR5bmFtaWNPdXRlciA9IGZhbHNlLCBvdXRlckRlY28gPSB0aGlzLnZpZXcuc3RhdGUuZmFjZXQob3V0ZXJEZWNvcmF0aW9ucykubWFwKChkLCBpKSA9PiB7XG4gICAgICAgICAgICBsZXQgZHluYW1pYyA9IHR5cGVvZiBkID09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgICAgIGlmIChkeW5hbWljKVxuICAgICAgICAgICAgICAgIGR5bmFtaWNPdXRlciA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZHluYW1pYyA/IGQodGhpcy52aWV3KSA6IGQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3V0ZXJEZWNvLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcFtpKytdID0gZHluYW1pY091dGVyO1xuICAgICAgICAgICAgYWxsRGVjby5wdXNoKFJhbmdlU2V0LmpvaW4ob3V0ZXJEZWNvKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IFtcbiAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHRGb3JtYXR0aW5nLFxuICAgICAgICAgICAgLi4uYWxsRGVjbyxcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZUJsb2NrR2FwRGVjbygpLFxuICAgICAgICAgICAgdGhpcy52aWV3LnZpZXdTdGF0ZS5saW5lR2FwRGVjb1xuICAgICAgICBdO1xuICAgICAgICB3aGlsZSAoaSA8IHRoaXMuZGVjb3JhdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcFtpKytdID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmRlY29yYXRpb25zO1xuICAgIH1cbiAgICBzY3JvbGxJbnRvVmlldyh0YXJnZXQpIHtcbiAgICAgICAgaWYgKHRhcmdldC5pc1NuYXBzaG90KSB7XG4gICAgICAgICAgICBsZXQgcmVmID0gdGhpcy52aWV3LnZpZXdTdGF0ZS5saW5lQmxvY2tBdCh0YXJnZXQucmFuZ2UuaGVhZCk7XG4gICAgICAgICAgICB0aGlzLnZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCA9IHJlZi50b3AgLSB0YXJnZXQueU1hcmdpbjtcbiAgICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdCA9IHRhcmdldC54TWFyZ2luO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGhhbmRsZXIgb2YgdGhpcy52aWV3LnN0YXRlLmZhY2V0KHNjcm9sbEhhbmRsZXIpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKHRoaXMudmlldywgdGFyZ2V0LnJhbmdlLCB0YXJnZXQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHRoaXMudmlldy5zdGF0ZSwgZSwgXCJzY3JvbGwgaGFuZGxlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgeyByYW5nZSB9ID0gdGFyZ2V0O1xuICAgICAgICBsZXQgcmVjdCA9IHRoaXMuY29vcmRzQXQocmFuZ2UuaGVhZCwgcmFuZ2UuZW1wdHkgPyByYW5nZS5hc3NvYyA6IHJhbmdlLmhlYWQgPiByYW5nZS5hbmNob3IgPyAtMSA6IDEpLCBvdGhlcjtcbiAgICAgICAgaWYgKCFyZWN0KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoIXJhbmdlLmVtcHR5ICYmIChvdGhlciA9IHRoaXMuY29vcmRzQXQocmFuZ2UuYW5jaG9yLCByYW5nZS5hbmNob3IgPiByYW5nZS5oZWFkID8gLTEgOiAxKSkpXG4gICAgICAgICAgICByZWN0ID0geyBsZWZ0OiBNYXRoLm1pbihyZWN0LmxlZnQsIG90aGVyLmxlZnQpLCB0b3A6IE1hdGgubWluKHJlY3QudG9wLCBvdGhlci50b3ApLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiBNYXRoLm1heChyZWN0LnJpZ2h0LCBvdGhlci5yaWdodCksIGJvdHRvbTogTWF0aC5tYXgocmVjdC5ib3R0b20sIG90aGVyLmJvdHRvbSkgfTtcbiAgICAgICAgbGV0IG1hcmdpbnMgPSBnZXRTY3JvbGxNYXJnaW5zKHRoaXMudmlldyk7XG4gICAgICAgIGxldCB0YXJnZXRSZWN0ID0ge1xuICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0IC0gbWFyZ2lucy5sZWZ0LCB0b3A6IHJlY3QudG9wIC0gbWFyZ2lucy50b3AsXG4gICAgICAgICAgICByaWdodDogcmVjdC5yaWdodCArIG1hcmdpbnMucmlnaHQsIGJvdHRvbTogcmVjdC5ib3R0b20gKyBtYXJnaW5zLmJvdHRvbVxuICAgICAgICB9O1xuICAgICAgICBsZXQgeyBvZmZzZXRXaWR0aCwgb2Zmc2V0SGVpZ2h0IH0gPSB0aGlzLnZpZXcuc2Nyb2xsRE9NO1xuICAgICAgICBzY3JvbGxSZWN0SW50b1ZpZXcodGhpcy52aWV3LnNjcm9sbERPTSwgdGFyZ2V0UmVjdCwgcmFuZ2UuaGVhZCA8IHJhbmdlLmFuY2hvciA/IC0xIDogMSwgdGFyZ2V0LngsIHRhcmdldC55LCBNYXRoLm1heChNYXRoLm1pbih0YXJnZXQueE1hcmdpbiwgb2Zmc2V0V2lkdGgpLCAtb2Zmc2V0V2lkdGgpLCBNYXRoLm1heChNYXRoLm1pbih0YXJnZXQueU1hcmdpbiwgb2Zmc2V0SGVpZ2h0KSwgLW9mZnNldEhlaWdodCksIHRoaXMudmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJldHdlZW5VbmVkaXRhYmxlKHBvcykge1xuICAgIHJldHVybiBwb3Mubm9kZS5ub2RlVHlwZSA9PSAxICYmIHBvcy5ub2RlLmZpcnN0Q2hpbGQgJiZcbiAgICAgICAgKHBvcy5vZmZzZXQgPT0gMCB8fCBwb3Mubm9kZS5jaGlsZE5vZGVzW3Bvcy5vZmZzZXQgLSAxXS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKSAmJlxuICAgICAgICAocG9zLm9mZnNldCA9PSBwb3Mubm9kZS5jaGlsZE5vZGVzLmxlbmd0aCB8fCBwb3Mubm9kZS5jaGlsZE5vZGVzW3Bvcy5vZmZzZXRdLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpO1xufVxuZnVuY3Rpb24gZmluZENvbXBvc2l0aW9uTm9kZSh2aWV3LCBoZWFkUG9zKSB7XG4gICAgbGV0IHNlbCA9IHZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgaWYgKCFzZWwuZm9jdXNOb2RlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgdGV4dEJlZm9yZSA9IHRleHROb2RlQmVmb3JlKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCk7XG4gICAgbGV0IHRleHRBZnRlciA9IHRleHROb2RlQWZ0ZXIoc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICBsZXQgdGV4dE5vZGUgPSB0ZXh0QmVmb3JlIHx8IHRleHRBZnRlcjtcbiAgICBpZiAodGV4dEFmdGVyICYmIHRleHRCZWZvcmUgJiYgdGV4dEFmdGVyLm5vZGUgIT0gdGV4dEJlZm9yZS5ub2RlKSB7XG4gICAgICAgIGxldCBkZXNjQWZ0ZXIgPSBDb250ZW50Vmlldy5nZXQodGV4dEFmdGVyLm5vZGUpO1xuICAgICAgICBpZiAoIWRlc2NBZnRlciB8fCBkZXNjQWZ0ZXIgaW5zdGFuY2VvZiBUZXh0VmlldyAmJiBkZXNjQWZ0ZXIudGV4dCAhPSB0ZXh0QWZ0ZXIubm9kZS5ub2RlVmFsdWUpIHtcbiAgICAgICAgICAgIHRleHROb2RlID0gdGV4dEFmdGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZpZXcuZG9jVmlldy5sYXN0Q29tcG9zaXRpb25BZnRlckN1cnNvcikge1xuICAgICAgICAgICAgbGV0IGRlc2NCZWZvcmUgPSBDb250ZW50Vmlldy5nZXQodGV4dEJlZm9yZS5ub2RlKTtcbiAgICAgICAgICAgIGlmICghKCFkZXNjQmVmb3JlIHx8IGRlc2NCZWZvcmUgaW5zdGFuY2VvZiBUZXh0VmlldyAmJiBkZXNjQmVmb3JlLnRleHQgIT0gdGV4dEJlZm9yZS5ub2RlLm5vZGVWYWx1ZSkpXG4gICAgICAgICAgICAgICAgdGV4dE5vZGUgPSB0ZXh0QWZ0ZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlldy5kb2NWaWV3Lmxhc3RDb21wb3NpdGlvbkFmdGVyQ3Vyc29yID0gdGV4dE5vZGUgIT0gdGV4dEJlZm9yZTtcbiAgICBpZiAoIXRleHROb2RlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgZnJvbSA9IGhlYWRQb3MgLSB0ZXh0Tm9kZS5vZmZzZXQ7XG4gICAgcmV0dXJuIHsgZnJvbSwgdG86IGZyb20gKyB0ZXh0Tm9kZS5ub2RlLm5vZGVWYWx1ZS5sZW5ndGgsIG5vZGU6IHRleHROb2RlLm5vZGUgfTtcbn1cbmZ1bmN0aW9uIGZpbmRDb21wb3NpdGlvblJhbmdlKHZpZXcsIGNoYW5nZXMsIGhlYWRQb3MpIHtcbiAgICBsZXQgZm91bmQgPSBmaW5kQ29tcG9zaXRpb25Ob2RlKHZpZXcsIGhlYWRQb3MpO1xuICAgIGlmICghZm91bmQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCB7IG5vZGU6IHRleHROb2RlLCBmcm9tLCB0byB9ID0gZm91bmQsIHRleHQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWU7XG4gICAgLy8gRG9uJ3QgdHJ5IHRvIHByZXNlcnZlIG11bHRpLWxpbmUgY29tcG9zaXRpb25zXG4gICAgaWYgKC9bXFxuXFxyXS8udGVzdCh0ZXh0KSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKGZvdW5kLmZyb20sIGZvdW5kLnRvKSAhPSB0ZXh0KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgaW52ID0gY2hhbmdlcy5pbnZlcnRlZERlc2M7XG4gICAgbGV0IHJhbmdlID0gbmV3IENoYW5nZWRSYW5nZShpbnYubWFwUG9zKGZyb20pLCBpbnYubWFwUG9zKHRvKSwgZnJvbSwgdG8pO1xuICAgIGxldCBtYXJrcyA9IFtdO1xuICAgIGZvciAobGV0IHBhcmVudCA9IHRleHROb2RlLnBhcmVudE5vZGU7OyBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSkge1xuICAgICAgICBsZXQgcGFyZW50VmlldyA9IENvbnRlbnRWaWV3LmdldChwYXJlbnQpO1xuICAgICAgICBpZiAocGFyZW50VmlldyBpbnN0YW5jZW9mIE1hcmtWaWV3KVxuICAgICAgICAgICAgbWFya3MucHVzaCh7IG5vZGU6IHBhcmVudCwgZGVjbzogcGFyZW50Vmlldy5tYXJrIH0pO1xuICAgICAgICBlbHNlIGlmIChwYXJlbnRWaWV3IGluc3RhbmNlb2YgTGluZVZpZXcgfHwgcGFyZW50Lm5vZGVOYW1lID09IFwiRElWXCIgJiYgcGFyZW50LnBhcmVudE5vZGUgPT0gdmlldy5jb250ZW50RE9NKVxuICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQ6IHRleHROb2RlLCBtYXJrcywgbGluZTogcGFyZW50IH07XG4gICAgICAgIGVsc2UgaWYgKHBhcmVudCAhPSB2aWV3LmNvbnRlbnRET00pXG4gICAgICAgICAgICBtYXJrcy5wdXNoKHsgbm9kZTogcGFyZW50LCBkZWNvOiBuZXcgTWFya0RlY29yYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGdldEF0dHJzKHBhcmVudCksXG4gICAgICAgICAgICAgICAgICAgIHRhZ05hbWU6IHBhcmVudC50YWdOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICB9KSB9KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuZnVuY3Rpb24gbmV4dFRvVW5lZGl0YWJsZShub2RlLCBvZmZzZXQpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAxKVxuICAgICAgICByZXR1cm4gMDtcbiAgICByZXR1cm4gKG9mZnNldCAmJiBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV0uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIiA/IDEgLyogTmV4dFRvLkJlZm9yZSAqLyA6IDApIHxcbiAgICAgICAgKG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggJiYgbm9kZS5jaGlsZE5vZGVzW29mZnNldF0uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIiA/IDIgLyogTmV4dFRvLkFmdGVyICovIDogMCk7XG59XG5sZXQgRGVjb3JhdGlvbkNvbXBhcmF0b3IkMSA9IGNsYXNzIERlY29yYXRpb25Db21wYXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gW107XG4gICAgfVxuICAgIGNvbXBhcmVSYW5nZShmcm9tLCB0bykgeyBhZGRSYW5nZShmcm9tLCB0bywgdGhpcy5jaGFuZ2VzKTsgfVxuICAgIGNvbXBhcmVQb2ludChmcm9tLCB0bykgeyBhZGRSYW5nZShmcm9tLCB0bywgdGhpcy5jaGFuZ2VzKTsgfVxuICAgIGJvdW5kQ2hhbmdlKHBvcykgeyBhZGRSYW5nZShwb3MsIHBvcywgdGhpcy5jaGFuZ2VzKTsgfVxufTtcbmZ1bmN0aW9uIGZpbmRDaGFuZ2VkRGVjbyhhLCBiLCBkaWZmKSB7XG4gICAgbGV0IGNvbXAgPSBuZXcgRGVjb3JhdGlvbkNvbXBhcmF0b3IkMTtcbiAgICBSYW5nZVNldC5jb21wYXJlKGEsIGIsIGRpZmYsIGNvbXApO1xuICAgIHJldHVybiBjb21wLmNoYW5nZXM7XG59XG5mdW5jdGlvbiBpblVuZWRpdGFibGUobm9kZSwgaW5zaWRlKSB7XG4gICAgZm9yIChsZXQgY3VyID0gbm9kZTsgY3VyICYmIGN1ciAhPSBpbnNpZGU7IGN1ciA9IGN1ci5hc3NpZ25lZFNsb3QgfHwgY3VyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSA9PSAxICYmIGN1ci5jb250ZW50RWRpdGFibGUgPT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdG91Y2hlc0NvbXBvc2l0aW9uKGNoYW5nZXMsIGNvbXBvc2l0aW9uKSB7XG4gICAgbGV0IHRvdWNoZWQgPSBmYWxzZTtcbiAgICBpZiAoY29tcG9zaXRpb24pXG4gICAgICAgIGNoYW5nZXMuaXRlckNoYW5nZWRSYW5nZXMoKGZyb20sIHRvKSA9PiB7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IGNvbXBvc2l0aW9uLnRvICYmIHRvID4gY29tcG9zaXRpb24uZnJvbSlcbiAgICAgICAgICAgICAgICB0b3VjaGVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgcmV0dXJuIHRvdWNoZWQ7XG59XG5cbmZ1bmN0aW9uIGdyb3VwQXQoc3RhdGUsIHBvcywgYmlhcyA9IDEpIHtcbiAgICBsZXQgY2F0ZWdvcml6ZSA9IHN0YXRlLmNoYXJDYXRlZ29yaXplcihwb3MpO1xuICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChwb3MpLCBsaW5lUG9zID0gcG9zIC0gbGluZS5mcm9tO1xuICAgIGlmIChsaW5lLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MpO1xuICAgIGlmIChsaW5lUG9zID09IDApXG4gICAgICAgIGJpYXMgPSAxO1xuICAgIGVsc2UgaWYgKGxpbmVQb3MgPT0gbGluZS5sZW5ndGgpXG4gICAgICAgIGJpYXMgPSAtMTtcbiAgICBsZXQgZnJvbSA9IGxpbmVQb3MsIHRvID0gbGluZVBvcztcbiAgICBpZiAoYmlhcyA8IDApXG4gICAgICAgIGZyb20gPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgbGluZVBvcywgZmFsc2UpO1xuICAgIGVsc2VcbiAgICAgICAgdG8gPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgbGluZVBvcyk7XG4gICAgbGV0IGNhdCA9IGNhdGVnb3JpemUobGluZS50ZXh0LnNsaWNlKGZyb20sIHRvKSk7XG4gICAgd2hpbGUgKGZyb20gPiAwKSB7XG4gICAgICAgIGxldCBwcmV2ID0gZmluZENsdXN0ZXJCcmVhayhsaW5lLnRleHQsIGZyb20sIGZhbHNlKTtcbiAgICAgICAgaWYgKGNhdGVnb3JpemUobGluZS50ZXh0LnNsaWNlKHByZXYsIGZyb20pKSAhPSBjYXQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZnJvbSA9IHByZXY7XG4gICAgfVxuICAgIHdoaWxlICh0byA8IGxpbmUubGVuZ3RoKSB7XG4gICAgICAgIGxldCBuZXh0ID0gZmluZENsdXN0ZXJCcmVhayhsaW5lLnRleHQsIHRvKTtcbiAgICAgICAgaWYgKGNhdGVnb3JpemUobGluZS50ZXh0LnNsaWNlKHRvLCBuZXh0KSkgIT0gY2F0KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIHRvID0gbmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tICsgbGluZS5mcm9tLCB0byArIGxpbmUuZnJvbSk7XG59XG4vLyBTZWFyY2ggdGhlIERPTSBmb3IgdGhlIHtub2RlLCBvZmZzZXR9IHBvc2l0aW9uIGNsb3Nlc3QgdG8gdGhlIGdpdmVuXG4vLyBjb29yZGluYXRlcy4gVmVyeSBpbmVmZmljaWVudCBhbmQgY3J1ZGUsIGJ1dCBjYW4gdXN1YWxseSBiZSBhdm9pZGVkXG4vLyBieSBjYWxsaW5nIGNhcmV0KFBvc2l0aW9ufFJhbmdlKUZyb21Qb2ludCBpbnN0ZWFkLlxuZnVuY3Rpb24gZ2V0ZHgoeCwgcmVjdCkge1xuICAgIHJldHVybiByZWN0LmxlZnQgPiB4ID8gcmVjdC5sZWZ0IC0geCA6IE1hdGgubWF4KDAsIHggLSByZWN0LnJpZ2h0KTtcbn1cbmZ1bmN0aW9uIGdldGR5KHksIHJlY3QpIHtcbiAgICByZXR1cm4gcmVjdC50b3AgPiB5ID8gcmVjdC50b3AgLSB5IDogTWF0aC5tYXgoMCwgeSAtIHJlY3QuYm90dG9tKTtcbn1cbmZ1bmN0aW9uIHlPdmVybGFwKGEsIGIpIHtcbiAgICByZXR1cm4gYS50b3AgPCBiLmJvdHRvbSAtIDEgJiYgYS5ib3R0b20gPiBiLnRvcCArIDE7XG59XG5mdW5jdGlvbiB1cFRvcChyZWN0LCB0b3ApIHtcbiAgICByZXR1cm4gdG9wIDwgcmVjdC50b3AgPyB7IHRvcCwgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5yaWdodCwgYm90dG9tOiByZWN0LmJvdHRvbSB9IDogcmVjdDtcbn1cbmZ1bmN0aW9uIHVwQm90KHJlY3QsIGJvdHRvbSkge1xuICAgIHJldHVybiBib3R0b20gPiByZWN0LmJvdHRvbSA/IHsgdG9wOiByZWN0LnRvcCwgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5yaWdodCwgYm90dG9tIH0gOiByZWN0O1xufVxuZnVuY3Rpb24gZG9tUG9zQXRDb29yZHMocGFyZW50LCB4LCB5KSB7XG4gICAgbGV0IGNsb3Nlc3QsIGNsb3Nlc3RSZWN0LCBjbG9zZXN0WCwgY2xvc2VzdFksIGNsb3Nlc3RPdmVybGFwID0gZmFsc2U7XG4gICAgbGV0IGFib3ZlLCBiZWxvdywgYWJvdmVSZWN0LCBiZWxvd1JlY3Q7XG4gICAgZm9yIChsZXQgY2hpbGQgPSBwYXJlbnQuZmlyc3RDaGlsZDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgbGV0IHJlY3RzID0gY2xpZW50UmVjdHNGb3IoY2hpbGQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2ldO1xuICAgICAgICAgICAgaWYgKGNsb3Nlc3RSZWN0ICYmIHlPdmVybGFwKGNsb3Nlc3RSZWN0LCByZWN0KSlcbiAgICAgICAgICAgICAgICByZWN0ID0gdXBUb3AodXBCb3QocmVjdCwgY2xvc2VzdFJlY3QuYm90dG9tKSwgY2xvc2VzdFJlY3QudG9wKTtcbiAgICAgICAgICAgIGxldCBkeCA9IGdldGR4KHgsIHJlY3QpLCBkeSA9IGdldGR5KHksIHJlY3QpO1xuICAgICAgICAgICAgaWYgKGR4ID09IDAgJiYgZHkgPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQubm9kZVR5cGUgPT0gMyA/IGRvbVBvc0luVGV4dChjaGlsZCwgeCwgeSkgOiBkb21Qb3NBdENvb3JkcyhjaGlsZCwgeCwgeSk7XG4gICAgICAgICAgICBpZiAoIWNsb3Nlc3QgfHwgY2xvc2VzdFkgPiBkeSB8fCBjbG9zZXN0WSA9PSBkeSAmJiBjbG9zZXN0WCA+IGR4KSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdCA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RSZWN0ID0gcmVjdDtcbiAgICAgICAgICAgICAgICBjbG9zZXN0WCA9IGR4O1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RZID0gZHk7XG4gICAgICAgICAgICAgICAgbGV0IHNpZGUgPSBkeSA/ICh5IDwgcmVjdC50b3AgPyAtMSA6IDEpIDogZHggPyAoeCA8IHJlY3QubGVmdCA/IC0xIDogMSkgOiAwO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RPdmVybGFwID0gIXNpZGUgfHwgKHNpZGUgPiAwID8gaSA8IHJlY3RzLmxlbmd0aCAtIDEgOiBpID4gMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZHggPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh5ID4gcmVjdC5ib3R0b20gJiYgKCFhYm92ZVJlY3QgfHwgYWJvdmVSZWN0LmJvdHRvbSA8IHJlY3QuYm90dG9tKSkge1xuICAgICAgICAgICAgICAgICAgICBhYm92ZSA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBhYm92ZVJlY3QgPSByZWN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh5IDwgcmVjdC50b3AgJiYgKCFiZWxvd1JlY3QgfHwgYmVsb3dSZWN0LnRvcCA+IHJlY3QudG9wKSkge1xuICAgICAgICAgICAgICAgICAgICBiZWxvdyA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBiZWxvd1JlY3QgPSByZWN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFib3ZlUmVjdCAmJiB5T3ZlcmxhcChhYm92ZVJlY3QsIHJlY3QpKSB7XG4gICAgICAgICAgICAgICAgYWJvdmVSZWN0ID0gdXBCb3QoYWJvdmVSZWN0LCByZWN0LmJvdHRvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiZWxvd1JlY3QgJiYgeU92ZXJsYXAoYmVsb3dSZWN0LCByZWN0KSkge1xuICAgICAgICAgICAgICAgIGJlbG93UmVjdCA9IHVwVG9wKGJlbG93UmVjdCwgcmVjdC50b3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhYm92ZVJlY3QgJiYgYWJvdmVSZWN0LmJvdHRvbSA+PSB5KSB7XG4gICAgICAgIGNsb3Nlc3QgPSBhYm92ZTtcbiAgICAgICAgY2xvc2VzdFJlY3QgPSBhYm92ZVJlY3Q7XG4gICAgfVxuICAgIGVsc2UgaWYgKGJlbG93UmVjdCAmJiBiZWxvd1JlY3QudG9wIDw9IHkpIHtcbiAgICAgICAgY2xvc2VzdCA9IGJlbG93O1xuICAgICAgICBjbG9zZXN0UmVjdCA9IGJlbG93UmVjdDtcbiAgICB9XG4gICAgaWYgKCFjbG9zZXN0KVxuICAgICAgICByZXR1cm4geyBub2RlOiBwYXJlbnQsIG9mZnNldDogMCB9O1xuICAgIGxldCBjbGlwWCA9IE1hdGgubWF4KGNsb3Nlc3RSZWN0LmxlZnQsIE1hdGgubWluKGNsb3Nlc3RSZWN0LnJpZ2h0LCB4KSk7XG4gICAgaWYgKGNsb3Nlc3Qubm9kZVR5cGUgPT0gMylcbiAgICAgICAgcmV0dXJuIGRvbVBvc0luVGV4dChjbG9zZXN0LCBjbGlwWCwgeSk7XG4gICAgaWYgKGNsb3Nlc3RPdmVybGFwICYmIGNsb3Nlc3QuY29udGVudEVkaXRhYmxlICE9IFwiZmFsc2VcIilcbiAgICAgICAgcmV0dXJuIGRvbVBvc0F0Q29vcmRzKGNsb3Nlc3QsIGNsaXBYLCB5KTtcbiAgICBsZXQgb2Zmc2V0ID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChwYXJlbnQuY2hpbGROb2RlcywgY2xvc2VzdCkgK1xuICAgICAgICAoeCA+PSAoY2xvc2VzdFJlY3QubGVmdCArIGNsb3Nlc3RSZWN0LnJpZ2h0KSAvIDIgPyAxIDogMCk7XG4gICAgcmV0dXJuIHsgbm9kZTogcGFyZW50LCBvZmZzZXQgfTtcbn1cbmZ1bmN0aW9uIGRvbVBvc0luVGV4dChub2RlLCB4LCB5KSB7XG4gICAgbGV0IGxlbiA9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICBsZXQgY2xvc2VzdE9mZnNldCA9IC0xLCBjbG9zZXN0RFkgPSAxZTksIGdlbmVyYWxTaWRlID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGxldCByZWN0cyA9IHRleHRSYW5nZShub2RlLCBpLCBpICsgMSkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tqXTtcbiAgICAgICAgICAgIGlmIChyZWN0LnRvcCA9PSByZWN0LmJvdHRvbSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghZ2VuZXJhbFNpZGUpXG4gICAgICAgICAgICAgICAgZ2VuZXJhbFNpZGUgPSB4IC0gcmVjdC5sZWZ0O1xuICAgICAgICAgICAgbGV0IGR5ID0gKHJlY3QudG9wID4geSA/IHJlY3QudG9wIC0geSA6IHkgLSByZWN0LmJvdHRvbSkgLSAxO1xuICAgICAgICAgICAgaWYgKHJlY3QubGVmdCAtIDEgPD0geCAmJiByZWN0LnJpZ2h0ICsgMSA+PSB4ICYmIGR5IDwgY2xvc2VzdERZKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJpZ2h0ID0geCA+PSAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyLCBhZnRlciA9IHJpZ2h0O1xuICAgICAgICAgICAgICAgIGlmIChicm93c2VyLmNocm9tZSB8fCBicm93c2VyLmdlY2tvKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBSVEwgb24gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGdldHRpbmcgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY3RzIGZvciBlbXB0eSByYW5nZXMuXG4gICAgICAgICAgICAgICAgICAgIGxldCByZWN0QmVmb3JlID0gdGV4dFJhbmdlKG5vZGUsIGkpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjdEJlZm9yZS5sZWZ0ID09IHJlY3QucmlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlciA9ICFyaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGR5IDw9IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG5vZGUsIG9mZnNldDogaSArIChhZnRlciA/IDEgOiAwKSB9O1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RPZmZzZXQgPSBpICsgKGFmdGVyID8gMSA6IDApO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3REWSA9IGR5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG5vZGUsIG9mZnNldDogY2xvc2VzdE9mZnNldCA+IC0xID8gY2xvc2VzdE9mZnNldCA6IGdlbmVyYWxTaWRlID4gMCA/IG5vZGUubm9kZVZhbHVlLmxlbmd0aCA6IDAgfTtcbn1cbmZ1bmN0aW9uIHBvc0F0Q29vcmRzKHZpZXcsIGNvb3JkcywgcHJlY2lzZSwgYmlhcyA9IC0xKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBsZXQgY29udGVudCA9IHZpZXcuY29udGVudERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgZG9jVG9wID0gY29udGVudC50b3AgKyB2aWV3LnZpZXdTdGF0ZS5wYWRkaW5nVG9wO1xuICAgIGxldCBibG9jaywgeyBkb2NIZWlnaHQgfSA9IHZpZXcudmlld1N0YXRlO1xuICAgIGxldCB7IHgsIHkgfSA9IGNvb3JkcywgeU9mZnNldCA9IHkgLSBkb2NUb3A7XG4gICAgaWYgKHlPZmZzZXQgPCAwKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBpZiAoeU9mZnNldCA+IGRvY0hlaWdodClcbiAgICAgICAgcmV0dXJuIHZpZXcuc3RhdGUuZG9jLmxlbmd0aDtcbiAgICAvLyBTY2FuIGZvciBhIHRleHQgYmxvY2sgbmVhciB0aGUgcXVlcmllZCB5IHBvc2l0aW9uXG4gICAgZm9yIChsZXQgaGFsZkxpbmUgPSB2aWV3LnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUudGV4dEhlaWdodCAvIDIsIGJvdW5jZWQgPSBmYWxzZTs7KSB7XG4gICAgICAgIGJsb2NrID0gdmlldy5lbGVtZW50QXRIZWlnaHQoeU9mZnNldCk7XG4gICAgICAgIGlmIChibG9jay50eXBlID09IEJsb2NrVHlwZS5UZXh0KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIHkgcG9zaXRpb24gb3V0IG9mIHRoaXMgYmxvY2tcbiAgICAgICAgICAgIHlPZmZzZXQgPSBiaWFzID4gMCA/IGJsb2NrLmJvdHRvbSArIGhhbGZMaW5lIDogYmxvY2sudG9wIC0gaGFsZkxpbmU7XG4gICAgICAgICAgICBpZiAoeU9mZnNldCA+PSAwICYmIHlPZmZzZXQgPD0gZG9jSGVpZ2h0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGRvY3VtZW50IGNvbnNpc3RzIGVudGlyZWx5IG9mIHJlcGxhY2VkIHdpZGdldHMsIHdlXG4gICAgICAgICAgICAvLyB3b24ndCBmaW5kIGEgdGV4dCBibG9jaywgc28gcmV0dXJuIDBcbiAgICAgICAgICAgIGlmIChib3VuY2VkKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmVjaXNlID8gbnVsbCA6IDA7XG4gICAgICAgICAgICBib3VuY2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGJpYXMgPSAtYmlhcztcbiAgICAgICAgfVxuICAgIH1cbiAgICB5ID0gZG9jVG9wICsgeU9mZnNldDtcbiAgICBsZXQgbGluZVN0YXJ0ID0gYmxvY2suZnJvbTtcbiAgICAvLyBJZiB0aGlzIGlzIG91dHNpZGUgb2YgdGhlIHJlbmRlcmVkIHZpZXdwb3J0LCB3ZSBjYW4ndCBkZXRlcm1pbmUgYSBwb3NpdGlvblxuICAgIGlmIChsaW5lU3RhcnQgPCB2aWV3LnZpZXdwb3J0LmZyb20pXG4gICAgICAgIHJldHVybiB2aWV3LnZpZXdwb3J0LmZyb20gPT0gMCA/IDAgOiBwcmVjaXNlID8gbnVsbCA6IHBvc0F0Q29vcmRzSW1wcmVjaXNlKHZpZXcsIGNvbnRlbnQsIGJsb2NrLCB4LCB5KTtcbiAgICBpZiAobGluZVN0YXJ0ID4gdmlldy52aWV3cG9ydC50bylcbiAgICAgICAgcmV0dXJuIHZpZXcudmlld3BvcnQudG8gPT0gdmlldy5zdGF0ZS5kb2MubGVuZ3RoID8gdmlldy5zdGF0ZS5kb2MubGVuZ3RoIDpcbiAgICAgICAgICAgIHByZWNpc2UgPyBudWxsIDogcG9zQXRDb29yZHNJbXByZWNpc2UodmlldywgY29udGVudCwgYmxvY2ssIHgsIHkpO1xuICAgIC8vIFByZWZlciBTaGFkb3dSb290T3JEb2N1bWVudC5lbGVtZW50RnJvbVBvaW50IGlmIHByZXNlbnQsIGZhbGwgYmFjayB0byBkb2N1bWVudCBpZiBub3RcbiAgICBsZXQgZG9jID0gdmlldy5kb20ub3duZXJEb2N1bWVudDtcbiAgICBsZXQgcm9vdCA9IHZpZXcucm9vdC5lbGVtZW50RnJvbVBvaW50ID8gdmlldy5yb290IDogZG9jO1xuICAgIGxldCBlbGVtZW50ID0gcm9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuICAgIGlmIChlbGVtZW50ICYmICF2aWV3LmNvbnRlbnRET00uY29udGFpbnMoZWxlbWVudCkpXG4gICAgICAgIGVsZW1lbnQgPSBudWxsO1xuICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIHVuZXhwZWN0ZWQsIGNsaXAgeCBhdCB0aGUgc2lkZXMgb2YgdGhlIGNvbnRlbnQgYXJlYSBhbmQgdHJ5IGFnYWluXG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHggPSBNYXRoLm1heChjb250ZW50LmxlZnQgKyAxLCBNYXRoLm1pbihjb250ZW50LnJpZ2h0IC0gMSwgeCkpO1xuICAgICAgICBlbGVtZW50ID0gcm9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuICAgICAgICBpZiAoZWxlbWVudCAmJiAhdmlldy5jb250ZW50RE9NLmNvbnRhaW5zKGVsZW1lbnQpKVxuICAgICAgICAgICAgZWxlbWVudCA9IG51bGw7XG4gICAgfVxuICAgIC8vIFRoZXJlJ3MgdmlzaWJsZSBlZGl0b3IgY29udGVudCB1bmRlciB0aGUgcG9pbnQsIHNvIHdlIGNhbiB0cnlcbiAgICAvLyB1c2luZyBjYXJldChQb3NpdGlvbnxSYW5nZSlGcm9tUG9pbnQgYXMgYSBzaG9ydGN1dFxuICAgIGxldCBub2RlLCBvZmZzZXQgPSAtMTtcbiAgICBpZiAoZWxlbWVudCAmJiAoKF9hID0gdmlldy5kb2NWaWV3Lm5lYXJlc3QoZWxlbWVudCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pc0VkaXRhYmxlKSAhPSBmYWxzZSkge1xuICAgICAgICBpZiAoZG9jLmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBkb2MuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCh4LCB5KTtcbiAgICAgICAgICAgIGlmIChwb3MpXG4gICAgICAgICAgICAgICAgKHsgb2Zmc2V0Tm9kZTogbm9kZSwgb2Zmc2V0IH0gPSBwb3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSBkb2MuY2FyZXRSYW5nZUZyb21Qb2ludCh4LCB5KTtcbiAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgICh7IHN0YXJ0Q29udGFpbmVyOiBub2RlLCBzdGFydE9mZnNldDogb2Zmc2V0IH0gPSByYW5nZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF2aWV3LmNvbnRlbnRET00uY29udGFpbnMobm9kZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgYnJvd3Nlci5zYWZhcmkgJiYgaXNTdXNwaWNpb3VzU2FmYXJpQ2FyZXRSZXN1bHQobm9kZSwgb2Zmc2V0LCB4KSB8fFxuICAgICAgICAgICAgICAgICAgICBicm93c2VyLmNocm9tZSAmJiBpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdChub2RlLCBvZmZzZXQsIHgpKVxuICAgICAgICAgICAgICAgICAgICBub2RlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENocm9tZSB3aWxsIHJldHVybiBvZmZzZXRzIGludG8gPGlucHV0PiBlbGVtZW50cyB3aXRob3V0IGNoaWxkXG4gICAgICAgIC8vIG5vZGVzLCB3aGljaCB3aWxsIGxlYWQgdG8gYSBudWxsIGRlcmVmIGJlbG93LCBzbyBjbGlwIHRoZVxuICAgICAgICAvLyBvZmZzZXQgdG8gdGhlIG5vZGUgc2l6ZS5cbiAgICAgICAgaWYgKG5vZGUpXG4gICAgICAgICAgICBvZmZzZXQgPSBNYXRoLm1pbihtYXhPZmZzZXQobm9kZSksIG9mZnNldCk7XG4gICAgfVxuICAgIC8vIE5vIGx1Y2ssIGRvIG91ciBvd24gKHBvdGVudGlhbGx5IGV4cGVuc2l2ZSkgc2VhcmNoXG4gICAgaWYgKCFub2RlIHx8ICF2aWV3LmRvY1ZpZXcuZG9tLmNvbnRhaW5zKG5vZGUpKSB7XG4gICAgICAgIGxldCBsaW5lID0gTGluZVZpZXcuZmluZCh2aWV3LmRvY1ZpZXcsIGxpbmVTdGFydCk7XG4gICAgICAgIGlmICghbGluZSlcbiAgICAgICAgICAgIHJldHVybiB5T2Zmc2V0ID4gYmxvY2sudG9wICsgYmxvY2suaGVpZ2h0IC8gMiA/IGJsb2NrLnRvIDogYmxvY2suZnJvbTtcbiAgICAgICAgKHsgbm9kZSwgb2Zmc2V0IH0gPSBkb21Qb3NBdENvb3JkcyhsaW5lLmRvbSwgeCwgeSkpO1xuICAgIH1cbiAgICBsZXQgbmVhcmVzdCA9IHZpZXcuZG9jVmlldy5uZWFyZXN0KG5vZGUpO1xuICAgIGlmICghbmVhcmVzdClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKG5lYXJlc3QuaXNXaWRnZXQgJiYgKChfYiA9IG5lYXJlc3QuZG9tKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iubm9kZVR5cGUpID09IDEpIHtcbiAgICAgICAgbGV0IHJlY3QgPSBuZWFyZXN0LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgcmV0dXJuIGNvb3Jkcy55IDwgcmVjdC50b3AgfHwgY29vcmRzLnkgPD0gcmVjdC5ib3R0b20gJiYgY29vcmRzLnggPD0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMlxuICAgICAgICAgICAgPyBuZWFyZXN0LnBvc0F0U3RhcnQgOiBuZWFyZXN0LnBvc0F0RW5kO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5lYXJlc3QubG9jYWxQb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkgKyBuZWFyZXN0LnBvc0F0U3RhcnQ7XG4gICAgfVxufVxuZnVuY3Rpb24gcG9zQXRDb29yZHNJbXByZWNpc2UodmlldywgY29udGVudFJlY3QsIGJsb2NrLCB4LCB5KSB7XG4gICAgbGV0IGludG8gPSBNYXRoLnJvdW5kKCh4IC0gY29udGVudFJlY3QubGVmdCkgKiB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCk7XG4gICAgaWYgKHZpZXcubGluZVdyYXBwaW5nICYmIGJsb2NrLmhlaWdodCA+IHZpZXcuZGVmYXVsdExpbmVIZWlnaHQgKiAxLjUpIHtcbiAgICAgICAgbGV0IHRleHRIZWlnaHQgPSB2aWV3LnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUudGV4dEhlaWdodDtcbiAgICAgICAgbGV0IGxpbmUgPSBNYXRoLmZsb29yKCh5IC0gYmxvY2sudG9wIC0gKHZpZXcuZGVmYXVsdExpbmVIZWlnaHQgLSB0ZXh0SGVpZ2h0KSAqIDAuNSkgLyB0ZXh0SGVpZ2h0KTtcbiAgICAgICAgaW50byArPSBsaW5lICogdmlldy52aWV3U3RhdGUuaGVpZ2h0T3JhY2xlLmxpbmVMZW5ndGg7XG4gICAgfVxuICAgIGxldCBjb250ZW50ID0gdmlldy5zdGF0ZS5zbGljZURvYyhibG9jay5mcm9tLCBibG9jay50byk7XG4gICAgcmV0dXJuIGJsb2NrLmZyb20gKyBmaW5kQ29sdW1uKGNvbnRlbnQsIGludG8sIHZpZXcuc3RhdGUudGFiU2l6ZSk7XG59XG4vLyBJbiBjYXNlIG9mIGEgaGlnaCBsaW5lIGhlaWdodCwgU2FmYXJpJ3MgY2FyZXRSYW5nZUZyb21Qb2ludCB0cmVhdHNcbi8vIHRoZSBzcGFjZSBiZXR3ZWVuIGxpbmVzIGFzIGJlbG9uZ2luZyB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlXG4vLyBsaW5lIGJlZm9yZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVjdCBzdWNoIGEgcmVzdWx0IHNvIHRoYXQgaXQgY2FuIGJlXG4vLyBpZ25vcmVkIChpc3N1ZSAjNDAxKS5cbmZ1bmN0aW9uIGlzU3VzcGljaW91c1NhZmFyaUNhcmV0UmVzdWx0KG5vZGUsIG9mZnNldCwgeCkge1xuICAgIGxldCBsZW47XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMyB8fCBvZmZzZXQgIT0gKGxlbiA9IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBuZXh0ID0gbm9kZS5uZXh0U2libGluZzsgbmV4dDsgbmV4dCA9IG5leHQubmV4dFNpYmxpbmcpXG4gICAgICAgIGlmIChuZXh0Lm5vZGVUeXBlICE9IDEgfHwgbmV4dC5ub2RlTmFtZSAhPSBcIkJSXCIpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRleHRSYW5nZShub2RlLCBsZW4gLSAxLCBsZW4pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgPiB4O1xufVxuLy8gQ2hyb21lIHdpbGwgbW92ZSBwb3NpdGlvbnMgYmV0d2VlbiBsaW5lcyB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbGluZVxuZnVuY3Rpb24gaXNTdXNwaWNpb3VzQ2hyb21lQ2FyZXRSZXN1bHQobm9kZSwgb2Zmc2V0LCB4KSB7XG4gICAgaWYgKG9mZnNldCAhPSAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgY3VyID0gbm9kZTs7KSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50Lm5vZGVUeXBlICE9IDEgfHwgcGFyZW50LmZpcnN0Q2hpbGQgIT0gY3VyKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAocGFyZW50LmNsYXNzTGlzdC5jb250YWlucyhcImNtLWxpbmVcIikpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY3VyID0gcGFyZW50O1xuICAgIH1cbiAgICBsZXQgcmVjdCA9IG5vZGUubm9kZVR5cGUgPT0gMSA/IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgOiB0ZXh0UmFuZ2Uobm9kZSwgMCwgTWF0aC5tYXgobm9kZS5ub2RlVmFsdWUubGVuZ3RoLCAxKSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHggLSByZWN0LmxlZnQgPiA1O1xufVxuZnVuY3Rpb24gYmxvY2tBdCh2aWV3LCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXQocG9zKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShsaW5lLnR5cGUpKSB7XG4gICAgICAgIGxldCBiZXN0O1xuICAgICAgICBmb3IgKGxldCBsIG9mIGxpbmUudHlwZSkge1xuICAgICAgICAgICAgaWYgKGwuZnJvbSA+IHBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChsLnRvIDwgcG9zKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGwuZnJvbSA8IHBvcyAmJiBsLnRvID4gcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiBsO1xuICAgICAgICAgICAgaWYgKCFiZXN0IHx8IChsLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQgJiYgKGJlc3QudHlwZSAhPSBsLnR5cGUgfHwgKHNpZGUgPCAwID8gbC5mcm9tIDwgcG9zIDogbC50byA+IHBvcykpKSlcbiAgICAgICAgICAgICAgICBiZXN0ID0gbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmVzdCB8fCBsaW5lO1xuICAgIH1cbiAgICByZXR1cm4gbGluZTtcbn1cbmZ1bmN0aW9uIG1vdmVUb0xpbmVCb3VuZGFyeSh2aWV3LCBzdGFydCwgZm9yd2FyZCwgaW5jbHVkZVdyYXApIHtcbiAgICBsZXQgbGluZSA9IGJsb2NrQXQodmlldywgc3RhcnQuaGVhZCwgc3RhcnQuYXNzb2MgfHwgLTEpO1xuICAgIGxldCBjb29yZHMgPSAhaW5jbHVkZVdyYXAgfHwgbGluZS50eXBlICE9IEJsb2NrVHlwZS5UZXh0IHx8ICEodmlldy5saW5lV3JhcHBpbmcgfHwgbGluZS53aWRnZXRMaW5lQnJlYWtzKSA/IG51bGxcbiAgICAgICAgOiB2aWV3LmNvb3Jkc0F0UG9zKHN0YXJ0LmFzc29jIDwgMCAmJiBzdGFydC5oZWFkID4gbGluZS5mcm9tID8gc3RhcnQuaGVhZCAtIDEgOiBzdGFydC5oZWFkKTtcbiAgICBpZiAoY29vcmRzKSB7XG4gICAgICAgIGxldCBlZGl0b3JSZWN0ID0gdmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBkaXJlY3Rpb24gPSB2aWV3LnRleHREaXJlY3Rpb25BdChsaW5lLmZyb20pO1xuICAgICAgICBsZXQgcG9zID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGZvcndhcmQgPT0gKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSKSA/IGVkaXRvclJlY3QucmlnaHQgLSAxIDogZWRpdG9yUmVjdC5sZWZ0ICsgMSxcbiAgICAgICAgICAgIHk6IChjb29yZHMudG9wICsgY29vcmRzLmJvdHRvbSkgLyAyIH0pO1xuICAgICAgICBpZiAocG9zICE9IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MsIGZvcndhcmQgPyAtMSA6IDEpO1xuICAgIH1cbiAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihmb3J3YXJkID8gbGluZS50byA6IGxpbmUuZnJvbSwgZm9yd2FyZCA/IC0xIDogMSk7XG59XG5mdW5jdGlvbiBtb3ZlQnlDaGFyKHZpZXcsIHN0YXJ0LCBmb3J3YXJkLCBieSkge1xuICAgIGxldCBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHN0YXJ0LmhlYWQpLCBzcGFucyA9IHZpZXcuYmlkaVNwYW5zKGxpbmUpO1xuICAgIGxldCBkaXJlY3Rpb24gPSB2aWV3LnRleHREaXJlY3Rpb25BdChsaW5lLmZyb20pO1xuICAgIGZvciAobGV0IGN1ciA9IHN0YXJ0LCBjaGVjayA9IG51bGw7Oykge1xuICAgICAgICBsZXQgbmV4dCA9IG1vdmVWaXN1YWxseShsaW5lLCBzcGFucywgZGlyZWN0aW9uLCBjdXIsIGZvcndhcmQpLCBjaGFyID0gbW92ZWRPdmVyO1xuICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgIGlmIChsaW5lLm51bWJlciA9PSAoZm9yd2FyZCA/IHZpZXcuc3RhdGUuZG9jLmxpbmVzIDogMSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cjtcbiAgICAgICAgICAgIGNoYXIgPSBcIlxcblwiO1xuICAgICAgICAgICAgbGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmUobGluZS5udW1iZXIgKyAoZm9yd2FyZCA/IDEgOiAtMSkpO1xuICAgICAgICAgICAgc3BhbnMgPSB2aWV3LmJpZGlTcGFucyhsaW5lKTtcbiAgICAgICAgICAgIG5leHQgPSB2aWV3LnZpc3VhbExpbmVTaWRlKGxpbmUsICFmb3J3YXJkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoZWNrKSB7XG4gICAgICAgICAgICBpZiAoIWJ5KVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgY2hlY2sgPSBieShjaGFyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghY2hlY2soY2hhcikpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXI7XG4gICAgICAgIH1cbiAgICAgICAgY3VyID0gbmV4dDtcbiAgICB9XG59XG5mdW5jdGlvbiBieUdyb3VwKHZpZXcsIHBvcywgc3RhcnQpIHtcbiAgICBsZXQgY2F0ZWdvcml6ZSA9IHZpZXcuc3RhdGUuY2hhckNhdGVnb3JpemVyKHBvcyk7XG4gICAgbGV0IGNhdCA9IGNhdGVnb3JpemUoc3RhcnQpO1xuICAgIHJldHVybiAobmV4dCkgPT4ge1xuICAgICAgICBsZXQgbmV4dENhdCA9IGNhdGVnb3JpemUobmV4dCk7XG4gICAgICAgIGlmIChjYXQgPT0gQ2hhckNhdGVnb3J5LlNwYWNlKVxuICAgICAgICAgICAgY2F0ID0gbmV4dENhdDtcbiAgICAgICAgcmV0dXJuIGNhdCA9PSBuZXh0Q2F0O1xuICAgIH07XG59XG5mdW5jdGlvbiBtb3ZlVmVydGljYWxseSh2aWV3LCBzdGFydCwgZm9yd2FyZCwgZGlzdGFuY2UpIHtcbiAgICBsZXQgc3RhcnRQb3MgPSBzdGFydC5oZWFkLCBkaXIgPSBmb3J3YXJkID8gMSA6IC0xO1xuICAgIGlmIChzdGFydFBvcyA9PSAoZm9yd2FyZCA/IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCA6IDApKVxuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihzdGFydFBvcywgc3RhcnQuYXNzb2MpO1xuICAgIGxldCBnb2FsID0gc3RhcnQuZ29hbENvbHVtbiwgc3RhcnRZO1xuICAgIGxldCByZWN0ID0gdmlldy5jb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBzdGFydENvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3Moc3RhcnRQb3MsIHN0YXJ0LmFzc29jIHx8IC0xKSwgZG9jVG9wID0gdmlldy5kb2N1bWVudFRvcDtcbiAgICBpZiAoc3RhcnRDb29yZHMpIHtcbiAgICAgICAgaWYgKGdvYWwgPT0gbnVsbClcbiAgICAgICAgICAgIGdvYWwgPSBzdGFydENvb3Jkcy5sZWZ0IC0gcmVjdC5sZWZ0O1xuICAgICAgICBzdGFydFkgPSBkaXIgPCAwID8gc3RhcnRDb29yZHMudG9wIDogc3RhcnRDb29yZHMuYm90dG9tO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGxpbmUgPSB2aWV3LnZpZXdTdGF0ZS5saW5lQmxvY2tBdChzdGFydFBvcyk7XG4gICAgICAgIGlmIChnb2FsID09IG51bGwpXG4gICAgICAgICAgICBnb2FsID0gTWF0aC5taW4ocmVjdC5yaWdodCAtIHJlY3QubGVmdCwgdmlldy5kZWZhdWx0Q2hhcmFjdGVyV2lkdGggKiAoc3RhcnRQb3MgLSBsaW5lLmZyb20pKTtcbiAgICAgICAgc3RhcnRZID0gKGRpciA8IDAgPyBsaW5lLnRvcCA6IGxpbmUuYm90dG9tKSArIGRvY1RvcDtcbiAgICB9XG4gICAgbGV0IHJlc29sdmVkR29hbCA9IHJlY3QubGVmdCArIGdvYWw7XG4gICAgbGV0IGRpc3QgPSBkaXN0YW5jZSAhPT0gbnVsbCAmJiBkaXN0YW5jZSAhPT0gdm9pZCAwID8gZGlzdGFuY2UgOiAodmlldy52aWV3U3RhdGUuaGVpZ2h0T3JhY2xlLnRleHRIZWlnaHQgPj4gMSk7XG4gICAgZm9yIChsZXQgZXh0cmEgPSAwOzsgZXh0cmEgKz0gMTApIHtcbiAgICAgICAgbGV0IGN1clkgPSBzdGFydFkgKyAoZGlzdCArIGV4dHJhKSAqIGRpcjtcbiAgICAgICAgbGV0IHBvcyA9IHBvc0F0Q29vcmRzKHZpZXcsIHsgeDogcmVzb2x2ZWRHb2FsLCB5OiBjdXJZIH0sIGZhbHNlLCBkaXIpO1xuICAgICAgICBpZiAoY3VyWSA8IHJlY3QudG9wIHx8IGN1clkgPiByZWN0LmJvdHRvbSB8fCAoZGlyIDwgMCA/IHBvcyA8IHN0YXJ0UG9zIDogcG9zID4gc3RhcnRQb3MpKSB7XG4gICAgICAgICAgICBsZXQgY2hhclJlY3QgPSB2aWV3LmRvY1ZpZXcuY29vcmRzRm9yQ2hhcihwb3MpO1xuICAgICAgICAgICAgbGV0IGFzc29jID0gIWNoYXJSZWN0IHx8IGN1clkgPCBjaGFyUmVjdC50b3AgPyAtMSA6IDE7XG4gICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MsIGFzc29jLCB1bmRlZmluZWQsIGdvYWwpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2tpcEF0b21pY1JhbmdlcyhhdG9tcywgcG9zLCBiaWFzKSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBsZXQgbW92ZWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBzZXQgb2YgYXRvbXMpIHtcbiAgICAgICAgICAgIHNldC5iZXR3ZWVuKHBvcyAtIDEsIHBvcyArIDEsIChmcm9tLCB0bywgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocG9zID4gZnJvbSAmJiBwb3MgPCB0bykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2lkZSA9IG1vdmVkIHx8IGJpYXMgfHwgKHBvcyAtIGZyb20gPCB0byAtIHBvcyA/IC0xIDogMSk7XG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IHNpZGUgPCAwID8gZnJvbSA6IHRvO1xuICAgICAgICAgICAgICAgICAgICBtb3ZlZCA9IHNpZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtb3ZlZClcbiAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgfVxufVxuZnVuY3Rpb24gc2tpcEF0b21zKHZpZXcsIG9sZFBvcywgcG9zKSB7XG4gICAgbGV0IG5ld1BvcyA9IHNraXBBdG9taWNSYW5nZXModmlldy5zdGF0ZS5mYWNldChhdG9taWNSYW5nZXMpLm1hcChmID0+IGYodmlldykpLCBwb3MuZnJvbSwgb2xkUG9zLmhlYWQgPiBwb3MuZnJvbSA/IC0xIDogMSk7XG4gICAgcmV0dXJuIG5ld1BvcyA9PSBwb3MuZnJvbSA/IHBvcyA6IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IobmV3UG9zLCBuZXdQb3MgPCBwb3MuZnJvbSA/IDEgOiAtMSk7XG59XG5cbmNvbnN0IExpbmVCcmVha1BsYWNlaG9sZGVyID0gXCJcXHVmZmZmXCI7XG5jbGFzcyBET01SZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvaW50cywgc3RhdGUpIHtcbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG4gICAgICAgIHRoaXMudGV4dCA9IFwiXCI7XG4gICAgICAgIHRoaXMubGluZVNlcGFyYXRvciA9IHN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IpO1xuICAgIH1cbiAgICBhcHBlbmQodGV4dCkge1xuICAgICAgICB0aGlzLnRleHQgKz0gdGV4dDtcbiAgICB9XG4gICAgbGluZUJyZWFrKCkge1xuICAgICAgICB0aGlzLnRleHQgKz0gTGluZUJyZWFrUGxhY2Vob2xkZXI7XG4gICAgfVxuICAgIHJlYWRSYW5nZShzdGFydCwgZW5kKSB7XG4gICAgICAgIGlmICghc3RhcnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IHBhcmVudCA9IHN0YXJ0LnBhcmVudE5vZGU7XG4gICAgICAgIGZvciAobGV0IGN1ciA9IHN0YXJ0OzspIHtcbiAgICAgICAgICAgIHRoaXMuZmluZFBvaW50QmVmb3JlKHBhcmVudCwgY3VyKTtcbiAgICAgICAgICAgIGxldCBvbGRMZW4gPSB0aGlzLnRleHQubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5yZWFkTm9kZShjdXIpO1xuICAgICAgICAgICAgbGV0IG5leHQgPSBjdXIubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAobmV4dCA9PSBlbmQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChjdXIpLCBuZXh0VmlldyA9IENvbnRlbnRWaWV3LmdldChuZXh0KTtcbiAgICAgICAgICAgIGlmICh2aWV3ICYmIG5leHRWaWV3ID8gdmlldy5icmVha0FmdGVyIDpcbiAgICAgICAgICAgICAgICAodmlldyA/IHZpZXcuYnJlYWtBZnRlciA6IGlzQmxvY2tFbGVtZW50KGN1cikpIHx8XG4gICAgICAgICAgICAgICAgICAgIChpc0Jsb2NrRWxlbWVudChuZXh0KSAmJiAoY3VyLm5vZGVOYW1lICE9IFwiQlJcIiB8fCBjdXIuY21JZ25vcmUpICYmIHRoaXMudGV4dC5sZW5ndGggPiBvbGRMZW4pKVxuICAgICAgICAgICAgICAgIHRoaXMubGluZUJyZWFrKCk7XG4gICAgICAgICAgICBjdXIgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluZFBvaW50QmVmb3JlKHBhcmVudCwgZW5kKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJlYWRUZXh0Tm9kZShub2RlKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gbm9kZS5ub2RlVmFsdWU7XG4gICAgICAgIGZvciAobGV0IHBvaW50IG9mIHRoaXMucG9pbnRzKVxuICAgICAgICAgICAgaWYgKHBvaW50Lm5vZGUgPT0gbm9kZSlcbiAgICAgICAgICAgICAgICBwb2ludC5wb3MgPSB0aGlzLnRleHQubGVuZ3RoICsgTWF0aC5taW4ocG9pbnQub2Zmc2V0LCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IG9mZiA9IDAsIHJlID0gdGhpcy5saW5lU2VwYXJhdG9yID8gbnVsbCA6IC9cXHJcXG4/fFxcbi9nOzspIHtcbiAgICAgICAgICAgIGxldCBuZXh0QnJlYWsgPSAtMSwgYnJlYWtTaXplID0gMSwgbTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBuZXh0QnJlYWsgPSB0ZXh0LmluZGV4T2YodGhpcy5saW5lU2VwYXJhdG9yLCBvZmYpO1xuICAgICAgICAgICAgICAgIGJyZWFrU2l6ZSA9IHRoaXMubGluZVNlcGFyYXRvci5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtID0gcmUuZXhlYyh0ZXh0KSkge1xuICAgICAgICAgICAgICAgIG5leHRCcmVhayA9IG0uaW5kZXg7XG4gICAgICAgICAgICAgICAgYnJlYWtTaXplID0gbVswXS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCh0ZXh0LnNsaWNlKG9mZiwgbmV4dEJyZWFrIDwgMCA/IHRleHQubGVuZ3RoIDogbmV4dEJyZWFrKSk7XG4gICAgICAgICAgICBpZiAobmV4dEJyZWFrIDwgMClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHRoaXMubGluZUJyZWFrKCk7XG4gICAgICAgICAgICBpZiAoYnJlYWtTaXplID4gMSlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwb2ludCBvZiB0aGlzLnBvaW50cylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50Lm5vZGUgPT0gbm9kZSAmJiBwb2ludC5wb3MgPiB0aGlzLnRleHQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQucG9zIC09IGJyZWFrU2l6ZSAtIDE7XG4gICAgICAgICAgICBvZmYgPSBuZXh0QnJlYWsgKyBicmVha1NpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVhZE5vZGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5jbUlnbm9yZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHZpZXcgPSBDb250ZW50Vmlldy5nZXQobm9kZSk7XG4gICAgICAgIGxldCBmcm9tVmlldyA9IHZpZXcgJiYgdmlldy5vdmVycmlkZURPTVRleHQ7XG4gICAgICAgIGlmIChmcm9tVmlldyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRQb2ludEluc2lkZShub2RlLCBmcm9tVmlldy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGZyb21WaWV3Lml0ZXIoKTsgIWkubmV4dCgpLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgaWYgKGkubGluZUJyZWFrKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVCcmVhaygpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoaS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRUZXh0Tm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVOYW1lID09IFwiQlJcIikge1xuICAgICAgICAgICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZFJhbmdlKG5vZGUuZmlyc3RDaGlsZCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluZFBvaW50QmVmb3JlKG5vZGUsIG5leHQpIHtcbiAgICAgICAgZm9yIChsZXQgcG9pbnQgb2YgdGhpcy5wb2ludHMpXG4gICAgICAgICAgICBpZiAocG9pbnQubm9kZSA9PSBub2RlICYmIG5vZGUuY2hpbGROb2Rlc1twb2ludC5vZmZzZXRdID09IG5leHQpXG4gICAgICAgICAgICAgICAgcG9pbnQucG9zID0gdGhpcy50ZXh0Lmxlbmd0aDtcbiAgICB9XG4gICAgZmluZFBvaW50SW5zaWRlKG5vZGUsIGxlbmd0aCkge1xuICAgICAgICBmb3IgKGxldCBwb2ludCBvZiB0aGlzLnBvaW50cylcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgPyBwb2ludC5ub2RlID09IG5vZGUgOiBub2RlLmNvbnRhaW5zKHBvaW50Lm5vZGUpKVxuICAgICAgICAgICAgICAgIHBvaW50LnBvcyA9IHRoaXMudGV4dC5sZW5ndGggKyAoaXNBdEVuZChub2RlLCBwb2ludC5ub2RlLCBwb2ludC5vZmZzZXQpID8gbGVuZ3RoIDogMCk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNBdEVuZChwYXJlbnQsIG5vZGUsIG9mZnNldCkge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKCFub2RlIHx8IG9mZnNldCA8IG1heE9mZnNldChub2RlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKG5vZGUgPT0gcGFyZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIG9mZnNldCA9IGRvbUluZGV4KG5vZGUpICsgMTtcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG59XG5jbGFzcyBET01Qb2ludCB7XG4gICAgY29uc3RydWN0b3Iobm9kZSwgb2Zmc2V0KSB7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLnBvcyA9IC0xO1xuICAgIH1cbn1cblxuY2xhc3MgRE9NQ2hhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBzdGFydCwgZW5kLCB0eXBlT3Zlcikge1xuICAgICAgICB0aGlzLnR5cGVPdmVyID0gdHlwZU92ZXI7XG4gICAgICAgIHRoaXMuYm91bmRzID0gbnVsbDtcbiAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5kb21DaGFuZ2VkID0gc3RhcnQgPiAtMTtcbiAgICAgICAgbGV0IHsgaW1wcmVjaXNlSGVhZDogaUhlYWQsIGltcHJlY2lzZUFuY2hvcjogaUFuY2hvciB9ID0gdmlldy5kb2NWaWV3O1xuICAgICAgICBpZiAodmlldy5zdGF0ZS5yZWFkT25seSAmJiBzdGFydCA+IC0xKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgY2hhbmdlcyB3aGVuIHRoZSBlZGl0b3IgaXMgcmVhZC1vbmx5XG4gICAgICAgICAgICB0aGlzLm5ld1NlbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhcnQgPiAtMSAmJiAodGhpcy5ib3VuZHMgPSB2aWV3LmRvY1ZpZXcuZG9tQm91bmRzQXJvdW5kKHN0YXJ0LCBlbmQsIDApKSkge1xuICAgICAgICAgICAgbGV0IHNlbFBvaW50cyA9IGlIZWFkIHx8IGlBbmNob3IgPyBbXSA6IHNlbGVjdGlvblBvaW50cyh2aWV3KTtcbiAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRE9NUmVhZGVyKHNlbFBvaW50cywgdmlldy5zdGF0ZSk7XG4gICAgICAgICAgICByZWFkZXIucmVhZFJhbmdlKHRoaXMuYm91bmRzLnN0YXJ0RE9NLCB0aGlzLmJvdW5kcy5lbmRET00pO1xuICAgICAgICAgICAgdGhpcy50ZXh0ID0gcmVhZGVyLnRleHQ7XG4gICAgICAgICAgICB0aGlzLm5ld1NlbCA9IHNlbGVjdGlvbkZyb21Qb2ludHMoc2VsUG9pbnRzLCB0aGlzLmJvdW5kcy5mcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkb21TZWwgPSB2aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICAgICAgbGV0IGhlYWQgPSBpSGVhZCAmJiBpSGVhZC5ub2RlID09IGRvbVNlbC5mb2N1c05vZGUgJiYgaUhlYWQub2Zmc2V0ID09IGRvbVNlbC5mb2N1c09mZnNldCB8fFxuICAgICAgICAgICAgICAgICFjb250YWlucyh2aWV3LmNvbnRlbnRET00sIGRvbVNlbC5mb2N1c05vZGUpXG4gICAgICAgICAgICAgICAgPyB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmhlYWRcbiAgICAgICAgICAgICAgICA6IHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCk7XG4gICAgICAgICAgICBsZXQgYW5jaG9yID0gaUFuY2hvciAmJiBpQW5jaG9yLm5vZGUgPT0gZG9tU2VsLmFuY2hvck5vZGUgJiYgaUFuY2hvci5vZmZzZXQgPT0gZG9tU2VsLmFuY2hvck9mZnNldCB8fFxuICAgICAgICAgICAgICAgICFjb250YWlucyh2aWV3LmNvbnRlbnRET00sIGRvbVNlbC5hbmNob3JOb2RlKVxuICAgICAgICAgICAgICAgID8gdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5hbmNob3JcbiAgICAgICAgICAgICAgICA6IHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KTtcbiAgICAgICAgICAgIC8vIGlPUyB3aWxsIHJlZnVzZSB0byBzZWxlY3QgdGhlIGJsb2NrIGdhcHMgd2hlbiBkb2luZ1xuICAgICAgICAgICAgLy8gc2VsZWN0LWFsbC5cbiAgICAgICAgICAgIC8vIENocm9tZSB3aWxsIHB1dCB0aGUgc2VsZWN0aW9uICppbnNpZGUqIHRoZW0sIGNvbmZ1c2luZ1xuICAgICAgICAgICAgLy8gcG9zRnJvbURPTVxuICAgICAgICAgICAgbGV0IHZwID0gdmlldy52aWV3cG9ydDtcbiAgICAgICAgICAgIGlmICgoYnJvd3Nlci5pb3MgfHwgYnJvd3Nlci5jaHJvbWUpICYmIHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4uZW1wdHkgJiYgaGVhZCAhPSBhbmNob3IgJiZcbiAgICAgICAgICAgICAgICAodnAuZnJvbSA+IDAgfHwgdnAudG8gPCB2aWV3LnN0YXRlLmRvYy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBNYXRoLm1pbihoZWFkLCBhbmNob3IpLCB0byA9IE1hdGgubWF4KGhlYWQsIGFuY2hvcik7XG4gICAgICAgICAgICAgICAgbGV0IG9mZkZyb20gPSB2cC5mcm9tIC0gZnJvbSwgb2ZmVG8gPSB2cC50byAtIHRvO1xuICAgICAgICAgICAgICAgIGlmICgob2ZmRnJvbSA9PSAwIHx8IG9mZkZyb20gPT0gMSB8fCBmcm9tID09IDApICYmIChvZmZUbyA9PSAwIHx8IG9mZlRvID09IC0xIHx8IHRvID09IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvciA9IHZpZXcuc3RhdGUuZG9jLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5ld1NlbCA9IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUoYW5jaG9yLCBoZWFkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGx5RE9NQ2hhbmdlKHZpZXcsIGRvbUNoYW5nZSkge1xuICAgIGxldCBjaGFuZ2U7XG4gICAgbGV0IHsgbmV3U2VsIH0gPSBkb21DaGFuZ2UsIHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgbGV0IGxhc3RLZXkgPSB2aWV3LmlucHV0U3RhdGUubGFzdEtleVRpbWUgPiBEYXRlLm5vdygpIC0gMTAwID8gdmlldy5pbnB1dFN0YXRlLmxhc3RLZXlDb2RlIDogLTE7XG4gICAgaWYgKGRvbUNoYW5nZS5ib3VuZHMpIHtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IGRvbUNoYW5nZS5ib3VuZHM7XG4gICAgICAgIGxldCBwcmVmZXJyZWRQb3MgPSBzZWwuZnJvbSwgcHJlZmVycmVkU2lkZSA9IG51bGw7XG4gICAgICAgIC8vIFByZWZlciBhbmNob3JpbmcgdG8gZW5kIHdoZW4gQmFja3NwYWNlIGlzIHByZXNzZWQgKG9yLCBvblxuICAgICAgICAvLyBBbmRyb2lkLCB3aGVuIHNvbWV0aGluZyB3YXMgZGVsZXRlZClcbiAgICAgICAgaWYgKGxhc3RLZXkgPT09IDggfHwgYnJvd3Nlci5hbmRyb2lkICYmIGRvbUNoYW5nZS50ZXh0Lmxlbmd0aCA8IHRvIC0gZnJvbSkge1xuICAgICAgICAgICAgcHJlZmVycmVkUG9zID0gc2VsLnRvO1xuICAgICAgICAgICAgcHJlZmVycmVkU2lkZSA9IFwiZW5kXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRpZmYgPSBmaW5kRGlmZih2aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZyhmcm9tLCB0bywgTGluZUJyZWFrUGxhY2Vob2xkZXIpLCBkb21DaGFuZ2UudGV4dCwgcHJlZmVycmVkUG9zIC0gZnJvbSwgcHJlZmVycmVkU2lkZSk7XG4gICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICAvLyBDaHJvbWUgaW5zZXJ0cyB0d28gbmV3bGluZXMgd2hlbiBwcmVzc2luZyBzaGlmdC1lbnRlciBhdCB0aGVcbiAgICAgICAgICAgIC8vIGVuZCBvZiBhIGxpbmUuIERvbUNoYW5nZSBkcm9wcyBvbmUgb2YgdGhvc2UuXG4gICAgICAgICAgICBpZiAoYnJvd3Nlci5jaHJvbWUgJiYgbGFzdEtleSA9PSAxMyAmJlxuICAgICAgICAgICAgICAgIGRpZmYudG9CID09IGRpZmYuZnJvbSArIDIgJiYgZG9tQ2hhbmdlLnRleHQuc2xpY2UoZGlmZi5mcm9tLCBkaWZmLnRvQikgPT0gTGluZUJyZWFrUGxhY2Vob2xkZXIgKyBMaW5lQnJlYWtQbGFjZWhvbGRlcilcbiAgICAgICAgICAgICAgICBkaWZmLnRvQi0tO1xuICAgICAgICAgICAgY2hhbmdlID0geyBmcm9tOiBmcm9tICsgZGlmZi5mcm9tLCB0bzogZnJvbSArIGRpZmYudG9BLFxuICAgICAgICAgICAgICAgIGluc2VydDogVGV4dC5vZihkb21DaGFuZ2UudGV4dC5zbGljZShkaWZmLmZyb20sIGRpZmYudG9CKS5zcGxpdChMaW5lQnJlYWtQbGFjZWhvbGRlcikpIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobmV3U2VsICYmICghdmlldy5oYXNGb2N1cyAmJiB2aWV3LnN0YXRlLmZhY2V0KGVkaXRhYmxlKSB8fCBuZXdTZWwubWFpbi5lcShzZWwpKSkge1xuICAgICAgICBuZXdTZWwgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIWNoYW5nZSAmJiAhbmV3U2VsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFjaGFuZ2UgJiYgZG9tQ2hhbmdlLnR5cGVPdmVyICYmICFzZWwuZW1wdHkgJiYgbmV3U2VsICYmIG5ld1NlbC5tYWluLmVtcHR5KSB7XG4gICAgICAgIC8vIEhldXJpc3RpYyB0byBub3RpY2UgdHlwaW5nIG92ZXIgYSBzZWxlY3RlZCBjaGFyYWN0ZXJcbiAgICAgICAgY2hhbmdlID0geyBmcm9tOiBzZWwuZnJvbSwgdG86IHNlbC50bywgaW5zZXJ0OiB2aWV3LnN0YXRlLmRvYy5zbGljZShzZWwuZnJvbSwgc2VsLnRvKSB9O1xuICAgIH1cbiAgICBlbHNlIGlmICgoYnJvd3Nlci5tYWMgfHwgYnJvd3Nlci5hbmRyb2lkKSAmJiBjaGFuZ2UgJiYgY2hhbmdlLmZyb20gPT0gY2hhbmdlLnRvICYmIGNoYW5nZS5mcm9tID09IHNlbC5oZWFkIC0gMSAmJlxuICAgICAgICAvXlxcLiA/JC8udGVzdChjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCkpICYmIHZpZXcuY29udGVudERPTS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29ycmVjdFwiKSA9PSBcIm9mZlwiKSB7XG4gICAgICAgIC8vIERldGVjdCBpbnNlcnQtcGVyaW9kLW9uLWRvdWJsZS1zcGFjZSBNYWMgYW5kIEFuZHJvaWQgYmVoYXZpb3IsXG4gICAgICAgIC8vIGFuZCB0cmFuc2Zvcm0gaXQgaW50byBhIHJlZ3VsYXIgc3BhY2UgaW5zZXJ0LlxuICAgICAgICBpZiAobmV3U2VsICYmIGNoYW5nZS5pbnNlcnQubGVuZ3RoID09IDIpXG4gICAgICAgICAgICBuZXdTZWwgPSBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKG5ld1NlbC5tYWluLmFuY2hvciAtIDEsIG5ld1NlbC5tYWluLmhlYWQgLSAxKTtcbiAgICAgICAgY2hhbmdlID0geyBmcm9tOiBjaGFuZ2UuZnJvbSwgdG86IGNoYW5nZS50bywgaW5zZXJ0OiBUZXh0Lm9mKFtjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCkucmVwbGFjZShcIi5cIiwgXCIgXCIpXSkgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hhbmdlICYmIGNoYW5nZS5mcm9tID49IHNlbC5mcm9tICYmIGNoYW5nZS50byA8PSBzZWwudG8gJiZcbiAgICAgICAgKGNoYW5nZS5mcm9tICE9IHNlbC5mcm9tIHx8IGNoYW5nZS50byAhPSBzZWwudG8pICYmXG4gICAgICAgIChzZWwudG8gLSBzZWwuZnJvbSkgLSAoY2hhbmdlLnRvIC0gY2hhbmdlLmZyb20pIDw9IDQpIHtcbiAgICAgICAgLy8gSWYgdGhlIGNoYW5nZSBpcyBpbnNpZGUgdGhlIHNlbGVjdGlvbiBhbmQgY292ZXJzIG1vc3Qgb2YgaXQsXG4gICAgICAgIC8vIGFzc3VtZSBpdCBpcyBhIHNlbGVjdGlvbiByZXBsYWNlICh3aXRoIGlkZW50aWNhbCBjaGFyYWN0ZXJzIGF0XG4gICAgICAgIC8vIHRoZSBzdGFydC9lbmQgbm90IGluY2x1ZGVkIGluIHRoZSBkaWZmKVxuICAgICAgICBjaGFuZ2UgPSB7XG4gICAgICAgICAgICBmcm9tOiBzZWwuZnJvbSwgdG86IHNlbC50byxcbiAgICAgICAgICAgIGluc2VydDogdmlldy5zdGF0ZS5kb2Muc2xpY2Uoc2VsLmZyb20sIGNoYW5nZS5mcm9tKS5hcHBlbmQoY2hhbmdlLmluc2VydCkuYXBwZW5kKHZpZXcuc3RhdGUuZG9jLnNsaWNlKGNoYW5nZS50bywgc2VsLnRvKSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnJvd3Nlci5jaHJvbWUgJiYgY2hhbmdlICYmIGNoYW5nZS5mcm9tID09IGNoYW5nZS50byAmJiBjaGFuZ2UuZnJvbSA9PSBzZWwuaGVhZCAmJlxuICAgICAgICBjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCkgPT0gXCJcXG4gXCIgJiYgdmlldy5saW5lV3JhcHBpbmcpIHtcbiAgICAgICAgLy8gSW4gQ2hyb21lLCBpZiB5b3UgaW5zZXJ0IGEgc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIGEgd3JhcHBlZFxuICAgICAgICAvLyBsaW5lLCBpdCB3aWxsIGFjdHVhbGx5IGluc2VydCBhIG5ld2xpbmUgYW5kIGEgc3BhY2UsIGNhdXNpbmcgYVxuICAgICAgICAvLyBib2d1cyBuZXcgbGluZSB0byBiZSBjcmVhdGVkIGluIENvZGVNaXJyb3IgKCM5NjgpXG4gICAgICAgIGlmIChuZXdTZWwpXG4gICAgICAgICAgICBuZXdTZWwgPSBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKG5ld1NlbC5tYWluLmFuY2hvciAtIDEsIG5ld1NlbC5tYWluLmhlYWQgLSAxKTtcbiAgICAgICAgY2hhbmdlID0geyBmcm9tOiBzZWwuZnJvbSwgdG86IHNlbC50bywgaW5zZXJ0OiBUZXh0Lm9mKFtcIiBcIl0pIH07XG4gICAgfVxuICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIGFwcGx5RE9NQ2hhbmdlSW5uZXIodmlldywgY2hhbmdlLCBuZXdTZWwsIGxhc3RLZXkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChuZXdTZWwgJiYgIW5ld1NlbC5tYWluLmVxKHNlbCkpIHtcbiAgICAgICAgbGV0IHNjcm9sbEludG9WaWV3ID0gZmFsc2UsIHVzZXJFdmVudCA9IFwic2VsZWN0XCI7XG4gICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUubGFzdFNlbGVjdGlvblRpbWUgPiBEYXRlLm5vdygpIC0gNTApIHtcbiAgICAgICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUubGFzdFNlbGVjdGlvbk9yaWdpbiA9PSBcInNlbGVjdFwiKVxuICAgICAgICAgICAgICAgIHNjcm9sbEludG9WaWV3ID0gdHJ1ZTtcbiAgICAgICAgICAgIHVzZXJFdmVudCA9IHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2VsZWN0aW9uT3JpZ2luO1xuICAgICAgICB9XG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBzZWxlY3Rpb246IG5ld1NlbCwgc2Nyb2xsSW50b1ZpZXcsIHVzZXJFdmVudCB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwbHlET01DaGFuZ2VJbm5lcih2aWV3LCBjaGFuZ2UsIG5ld1NlbCwgbGFzdEtleSA9IC0xKSB7XG4gICAgaWYgKGJyb3dzZXIuaW9zICYmIHZpZXcuaW5wdXRTdGF0ZS5mbHVzaElPU0tleShjaGFuZ2UpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAvLyBBbmRyb2lkIGJyb3dzZXJzIGRvbid0IGZpcmUgcmVhc29uYWJsZSBrZXkgZXZlbnRzIGZvciBlbnRlcixcbiAgICAvLyBiYWNrc3BhY2UsIG9yIGRlbGV0ZS4gU28gdGhpcyBkZXRlY3RzIGNoYW5nZXMgdGhhdCBsb29rIGxpa2VcbiAgICAvLyB0aGV5J3JlIGNhdXNlZCBieSB0aG9zZSBrZXlzLCBhbmQgcmVpbnRlcnByZXRzIHRoZW0gYXMga2V5XG4gICAgLy8gZXZlbnRzLiAoU29tZSBvZiB0aGVzZSBrZXlzIGFyZSBhbHNvIGhhbmRsZWQgYnkgYmVmb3JlaW5wdXRcbiAgICAvLyBldmVudHMgYW5kIHRoZSBwZW5kaW5nQW5kcm9pZEtleSBtZWNoYW5pc20sIGJ1dCB0aGF0J3Mgbm90XG4gICAgLy8gcmVsaWFibGUgaW4gYWxsIHNpdHVhdGlvbnMuKVxuICAgIGlmIChicm93c2VyLmFuZHJvaWQgJiZcbiAgICAgICAgKChjaGFuZ2UudG8gPT0gc2VsLnRvICYmXG4gICAgICAgICAgICAvLyBHQm9hcmQgd2lsbCBzb21ldGltZXMgcmVtb3ZlIGEgc3BhY2UgaXQganVzdCBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gYWZ0ZXIgYSBjb21wbGV0aW9uIHdoZW4geW91IHByZXNzIGVudGVyXG4gICAgICAgICAgICAoY2hhbmdlLmZyb20gPT0gc2VsLmZyb20gfHwgY2hhbmdlLmZyb20gPT0gc2VsLmZyb20gLSAxICYmIHZpZXcuc3RhdGUuc2xpY2VEb2MoY2hhbmdlLmZyb20sIHNlbC5mcm9tKSA9PSBcIiBcIikgJiZcbiAgICAgICAgICAgIGNoYW5nZS5pbnNlcnQubGVuZ3RoID09IDEgJiYgY2hhbmdlLmluc2VydC5saW5lcyA9PSAyICYmXG4gICAgICAgICAgICBkaXNwYXRjaEtleSh2aWV3LmNvbnRlbnRET00sIFwiRW50ZXJcIiwgMTMpKSB8fFxuICAgICAgICAgICAgKChjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAtIDEgJiYgY2hhbmdlLnRvID09IHNlbC50byAmJiBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA9PSAwIHx8XG4gICAgICAgICAgICAgICAgbGFzdEtleSA9PSA4ICYmIGNoYW5nZS5pbnNlcnQubGVuZ3RoIDwgY2hhbmdlLnRvIC0gY2hhbmdlLmZyb20gJiYgY2hhbmdlLnRvID4gc2VsLmhlYWQpICYmXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hLZXkodmlldy5jb250ZW50RE9NLCBcIkJhY2tzcGFjZVwiLCA4KSkgfHxcbiAgICAgICAgICAgIChjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAmJiBjaGFuZ2UudG8gPT0gc2VsLnRvICsgMSAmJiBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hLZXkodmlldy5jb250ZW50RE9NLCBcIkRlbGV0ZVwiLCA0NikpKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IHRleHQgPSBjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCk7XG4gICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPj0gMClcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZysrO1xuICAgIGxldCBkZWZhdWx0VHI7XG4gICAgbGV0IGRlZmF1bHRJbnNlcnQgPSAoKSA9PiBkZWZhdWx0VHIgfHwgKGRlZmF1bHRUciA9IGFwcGx5RGVmYXVsdEluc2VydCh2aWV3LCBjaGFuZ2UsIG5ld1NlbCkpO1xuICAgIGlmICghdmlldy5zdGF0ZS5mYWNldChpbnB1dEhhbmRsZXIpLnNvbWUoaCA9PiBoKHZpZXcsIGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8sIHRleHQsIGRlZmF1bHRJbnNlcnQpKSlcbiAgICAgICAgdmlldy5kaXNwYXRjaChkZWZhdWx0SW5zZXJ0KCkpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gYXBwbHlEZWZhdWx0SW5zZXJ0KHZpZXcsIGNoYW5nZSwgbmV3U2VsKSB7XG4gICAgbGV0IHRyLCBzdGFydFN0YXRlID0gdmlldy5zdGF0ZSwgc2VsID0gc3RhcnRTdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICBpZiAoY2hhbmdlLmZyb20gPj0gc2VsLmZyb20gJiYgY2hhbmdlLnRvIDw9IHNlbC50byAmJiBjaGFuZ2UudG8gLSBjaGFuZ2UuZnJvbSA+PSAoc2VsLnRvIC0gc2VsLmZyb20pIC8gMyAmJlxuICAgICAgICAoIW5ld1NlbCB8fCBuZXdTZWwubWFpbi5lbXB0eSAmJiBuZXdTZWwubWFpbi5mcm9tID09IGNoYW5nZS5mcm9tICsgY2hhbmdlLmluc2VydC5sZW5ndGgpICYmXG4gICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPCAwKSB7XG4gICAgICAgIGxldCBiZWZvcmUgPSBzZWwuZnJvbSA8IGNoYW5nZS5mcm9tID8gc3RhcnRTdGF0ZS5zbGljZURvYyhzZWwuZnJvbSwgY2hhbmdlLmZyb20pIDogXCJcIjtcbiAgICAgICAgbGV0IGFmdGVyID0gc2VsLnRvID4gY2hhbmdlLnRvID8gc3RhcnRTdGF0ZS5zbGljZURvYyhjaGFuZ2UudG8sIHNlbC50bykgOiBcIlwiO1xuICAgICAgICB0ciA9IHN0YXJ0U3RhdGUucmVwbGFjZVNlbGVjdGlvbih2aWV3LnN0YXRlLnRvVGV4dChiZWZvcmUgKyBjaGFuZ2UuaW5zZXJ0LnNsaWNlU3RyaW5nKDAsIHVuZGVmaW5lZCwgdmlldy5zdGF0ZS5saW5lQnJlYWspICsgYWZ0ZXIpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBjaGFuZ2VzID0gc3RhcnRTdGF0ZS5jaGFuZ2VzKGNoYW5nZSk7XG4gICAgICAgIGxldCBtYWluU2VsID0gbmV3U2VsICYmIG5ld1NlbC5tYWluLnRvIDw9IGNoYW5nZXMubmV3TGVuZ3RoID8gbmV3U2VsLm1haW4gOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFRyeSB0byBhcHBseSBhIGNvbXBvc2l0aW9uIGNoYW5nZSB0byBhbGwgY3Vyc29yc1xuICAgICAgICBpZiAoc3RhcnRTdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLmxlbmd0aCA+IDEgJiYgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwICYmXG4gICAgICAgICAgICBjaGFuZ2UudG8gPD0gc2VsLnRvICYmIGNoYW5nZS50byA+PSBzZWwudG8gLSAxMCkge1xuICAgICAgICAgICAgbGV0IHJlcGxhY2VkID0gdmlldy5zdGF0ZS5zbGljZURvYyhjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKTtcbiAgICAgICAgICAgIGxldCBjb21wb3NpdGlvblJhbmdlLCBjb21wb3NpdGlvbiA9IG5ld1NlbCAmJiBmaW5kQ29tcG9zaXRpb25Ob2RlKHZpZXcsIG5ld1NlbC5tYWluLmhlYWQpO1xuICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRMZW4gPSBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCAtIChjaGFuZ2UudG8gLSBjaGFuZ2UuZnJvbSk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25SYW5nZSA9IHsgZnJvbTogY29tcG9zaXRpb24uZnJvbSwgdG86IGNvbXBvc2l0aW9uLnRvIC0gZExlbiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25SYW5nZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChzZWwuaGVhZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gc2VsLnRvIC0gY2hhbmdlLnRvLCBzaXplID0gc2VsLnRvIC0gc2VsLmZyb207XG4gICAgICAgICAgICB0ciA9IHN0YXJ0U3RhdGUuY2hhbmdlQnlSYW5nZShyYW5nZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLmZyb20gPT0gc2VsLmZyb20gJiYgcmFuZ2UudG8gPT0gc2VsLnRvKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjaGFuZ2VzLCByYW5nZTogbWFpblNlbCB8fCByYW5nZS5tYXAoY2hhbmdlcykgfTtcbiAgICAgICAgICAgICAgICBsZXQgdG8gPSByYW5nZS50byAtIG9mZnNldCwgZnJvbSA9IHRvIC0gcmVwbGFjZWQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZS50byAtIHJhbmdlLmZyb20gIT0gc2l6ZSB8fCB2aWV3LnN0YXRlLnNsaWNlRG9jKGZyb20sIHRvKSAhPSByZXBsYWNlZCB8fFxuICAgICAgICAgICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGVyZSdzIG5vIHdheSB0byBtYWtlIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZXMgaW4gdGhlIHNhbWUgbm9kZSB3b3JrIHdpdGhvdXQgYWJvcnRpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9zaXRpb24sIHNvIGN1cnNvcnMgaW4gdGhlIGNvbXBvc2l0aW9uIHJhbmdlIGFyZVxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVkLlxuICAgICAgICAgICAgICAgICAgICByYW5nZS50byA+PSBjb21wb3NpdGlvblJhbmdlLmZyb20gJiYgcmFuZ2UuZnJvbSA8PSBjb21wb3NpdGlvblJhbmdlLnRvKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyByYW5nZSB9O1xuICAgICAgICAgICAgICAgIGxldCByYW5nZUNoYW5nZXMgPSBzdGFydFN0YXRlLmNoYW5nZXMoeyBmcm9tLCB0bywgaW5zZXJ0OiBjaGFuZ2UuaW5zZXJ0IH0pLCBzZWxPZmYgPSByYW5nZS50byAtIHNlbC50bztcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzOiByYW5nZUNoYW5nZXMsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlOiAhbWFpblNlbCA/IHJhbmdlLm1hcChyYW5nZUNoYW5nZXMpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRvclNlbGVjdGlvbi5yYW5nZShNYXRoLm1heCgwLCBtYWluU2VsLmFuY2hvciArIHNlbE9mZiksIE1hdGgubWF4KDAsIG1haW5TZWwuaGVhZCArIHNlbE9mZikpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdHIgPSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IG1haW5TZWwgJiYgc3RhcnRTdGF0ZS5zZWxlY3Rpb24ucmVwbGFjZVJhbmdlKG1haW5TZWwpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB1c2VyRXZlbnQgPSBcImlucHV0LnR5cGVcIjtcbiAgICBpZiAodmlldy5jb21wb3NpbmcgfHxcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSAmJiB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25FbmRlZEF0ID4gRGF0ZS5ub3coKSAtIDUwKSB7XG4gICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgdXNlckV2ZW50ICs9IFwiLmNvbXBvc2VcIjtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB1c2VyRXZlbnQgKz0gXCIuc3RhcnRcIjtcbiAgICAgICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkZpcnN0Q2hhbmdlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0U3RhdGUudXBkYXRlKHRyLCB7IHVzZXJFdmVudCwgc2Nyb2xsSW50b1ZpZXc6IHRydWUgfSk7XG59XG5mdW5jdGlvbiBmaW5kRGlmZihhLCBiLCBwcmVmZXJyZWRQb3MsIHByZWZlcnJlZFNpZGUpIHtcbiAgICBsZXQgbWluTGVuID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKTtcbiAgICBsZXQgZnJvbSA9IDA7XG4gICAgd2hpbGUgKGZyb20gPCBtaW5MZW4gJiYgYS5jaGFyQ29kZUF0KGZyb20pID09IGIuY2hhckNvZGVBdChmcm9tKSlcbiAgICAgICAgZnJvbSsrO1xuICAgIGlmIChmcm9tID09IG1pbkxlbiAmJiBhLmxlbmd0aCA9PSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHRvQSA9IGEubGVuZ3RoLCB0b0IgPSBiLmxlbmd0aDtcbiAgICB3aGlsZSAodG9BID4gMCAmJiB0b0IgPiAwICYmIGEuY2hhckNvZGVBdCh0b0EgLSAxKSA9PSBiLmNoYXJDb2RlQXQodG9CIC0gMSkpIHtcbiAgICAgICAgdG9BLS07XG4gICAgICAgIHRvQi0tO1xuICAgIH1cbiAgICBpZiAocHJlZmVycmVkU2lkZSA9PSBcImVuZFwiKSB7XG4gICAgICAgIGxldCBhZGp1c3QgPSBNYXRoLm1heCgwLCBmcm9tIC0gTWF0aC5taW4odG9BLCB0b0IpKTtcbiAgICAgICAgcHJlZmVycmVkUG9zIC09IHRvQSArIGFkanVzdCAtIGZyb207XG4gICAgfVxuICAgIGlmICh0b0EgPCBmcm9tICYmIGEubGVuZ3RoIDwgYi5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gZnJvbSAmJiBwcmVmZXJyZWRQb3MgPj0gdG9BID8gZnJvbSAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIGZyb20gLT0gbW92ZTtcbiAgICAgICAgdG9CID0gZnJvbSArICh0b0IgLSB0b0EpO1xuICAgICAgICB0b0EgPSBmcm9tO1xuICAgIH1cbiAgICBlbHNlIGlmICh0b0IgPCBmcm9tKSB7XG4gICAgICAgIGxldCBtb3ZlID0gcHJlZmVycmVkUG9zIDw9IGZyb20gJiYgcHJlZmVycmVkUG9zID49IHRvQiA/IGZyb20gLSBwcmVmZXJyZWRQb3MgOiAwO1xuICAgICAgICBmcm9tIC09IG1vdmU7XG4gICAgICAgIHRvQSA9IGZyb20gKyAodG9BIC0gdG9CKTtcbiAgICAgICAgdG9CID0gZnJvbTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZnJvbSwgdG9BLCB0b0IgfTtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvblBvaW50cyh2aWV3KSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGlmICh2aWV3LnJvb3QuYWN0aXZlRWxlbWVudCAhPSB2aWV3LmNvbnRlbnRET00pXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgbGV0IHsgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0IH0gPSB2aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgIGlmIChhbmNob3JOb2RlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG5ldyBET01Qb2ludChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpKTtcbiAgICAgICAgaWYgKGZvY3VzTm9kZSAhPSBhbmNob3JOb2RlIHx8IGZvY3VzT2Zmc2V0ICE9IGFuY2hvck9mZnNldClcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBET01Qb2ludChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBzZWxlY3Rpb25Gcm9tUG9pbnRzKHBvaW50cywgYmFzZSkge1xuICAgIGlmIChwb2ludHMubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBhbmNob3IgPSBwb2ludHNbMF0ucG9zLCBoZWFkID0gcG9pbnRzLmxlbmd0aCA9PSAyID8gcG9pbnRzWzFdLnBvcyA6IGFuY2hvcjtcbiAgICByZXR1cm4gYW5jaG9yID4gLTEgJiYgaGVhZCA+IC0xID8gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZShhbmNob3IgKyBiYXNlLCBoZWFkICsgYmFzZSkgOiBudWxsO1xufVxuXG5jbGFzcyBJbnB1dFN0YXRlIHtcbiAgICBzZXRTZWxlY3Rpb25PcmlnaW4ob3JpZ2luKSB7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGlvbk9yaWdpbiA9IG9yaWdpbjtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uVGltZSA9IERhdGUubm93KCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5sYXN0S2V5Q29kZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdEtleVRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RUb3VjaFRpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RGb2N1c1RpbWUgPSAwO1xuICAgICAgICB0aGlzLmxhc3RTY3JvbGxUb3AgPSAwO1xuICAgICAgICB0aGlzLmxhc3RTY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgLy8gT24gaU9TLCBzb21lIGtleXMgbmVlZCB0byBoYXZlIHRoZWlyIGRlZmF1bHQgYmVoYXZpb3IgaGFwcGVuXG4gICAgICAgIC8vIChhZnRlciB3aGljaCB3ZSByZXRyb2FjdGl2ZWx5IGhhbmRsZSB0aGVtIGFuZCByZXNldCB0aGUgRE9NKSB0b1xuICAgICAgICAvLyBhdm9pZCBtZXNzaW5nIHVwIHRoZSB2aXJ0dWFsIGtleWJvYXJkIHN0YXRlLlxuICAgICAgICB0aGlzLnBlbmRpbmdJT1NLZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICBXaGVuIGVuYWJsZWQgKD4tMSksIHRhYiBwcmVzc2VzIGFyZSBub3QgZ2l2ZW4gdG8ga2V5IGhhbmRsZXJzLFxuICAgICAgICBsZWF2aW5nIHRoZSBicm93c2VyJ3MgZGVmYXVsdCBiZWhhdmlvci4gSWYgPjAsIHRoZSBtb2RlIGV4cGlyZXNcbiAgICAgICAgYXQgdGhhdCB0aW1lc3RhbXAsIGFuZCBhbnkgb3RoZXIga2V5cHJlc3MgY2xlYXJzIGl0LlxuICAgICAgICBFc2MgZW5hYmxlcyB0ZW1wb3JhcnkgdGFiIGZvY3VzIG1vZGUgZm9yIHR3byBzZWNvbmRzIHdoZW4gbm90XG4gICAgICAgIG90aGVyd2lzZSBoYW5kbGVkLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhYkZvY3VzTW9kZSA9IC0xO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25PcmlnaW4gPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25UaW1lID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q29udGV4dE1lbnUgPSAwO1xuICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXJzID0gW107XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyAtMSBtZWFucyBub3QgaW4gYSBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLCB0aGlzIGNvdW50cyB0aGUgbnVtYmVyXG4gICAgICAgIC8vIG9mIGNoYW5nZXMgbWFkZSBkdXJpbmcgdGhlIGNvbXBvc2l0aW9uLiBUaGUgY291bnQgaXMgdXNlZCB0b1xuICAgICAgICAvLyBhdm9pZCB0cmVhdGluZyB0aGUgc3RhcnQgc3RhdGUgb2YgdGhlIGNvbXBvc2l0aW9uLCBiZWZvcmUgYW55XG4gICAgICAgIC8vIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUsIGFzIHBhcnQgb2YgdGhlIGNvbXBvc2l0aW9uLlxuICAgICAgICB0aGlzLmNvbXBvc2luZyA9IC0xO1xuICAgICAgICAvLyBUcmFja3Mgd2hldGhlciB0aGUgbmV4dCBjaGFuZ2Ugc2hvdWxkIGJlIG1hcmtlZCBhcyBzdGFydGluZyB0aGVcbiAgICAgICAgLy8gY29tcG9zaXRpb24gKG51bGwgbWVhbnMgbm8gY29tcG9zaXRpb24sIHRydWUgbWVhbnMgbmV4dCBpcyB0aGVcbiAgICAgICAgLy8gZmlyc3QsIGZhbHNlIG1lYW5zIGZpcnN0IGhhcyBhbHJlYWR5IGJlZW4gbWFya2VkIGZvciB0aGlzXG4gICAgICAgIC8vIGNvbXBvc2l0aW9uKVxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSBudWxsO1xuICAgICAgICAvLyBFbmQgdGltZSBvZiB0aGUgcHJldmlvdXMgY29tcG9zaXRpb25cbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbkVuZGVkQXQgPSAwO1xuICAgICAgICAvLyBVc2VkIGluIGEga2x1ZGdlIHRvIGRldGVjdCB3aGVuIGFuIEVudGVyIGtleXByZXNzIHNob3VsZCBiZVxuICAgICAgICAvLyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGNvbXBvc2l0aW9uIG9uIFNhZmFyaSwgd2hpY2ggZmlyZXMgZXZlbnRzXG4gICAgICAgIC8vIGluIHRoZSB3cm9uZyBvcmRlclxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0tleSA9IGZhbHNlO1xuICAgICAgICAvLyBVc2VkIHRvIGNhdGVnb3JpemUgY2hhbmdlcyBhcyBwYXJ0IG9mIGEgY29tcG9zaXRpb24sIGV2ZW4gd2hlblxuICAgICAgICAvLyB0aGUgbXV0YXRpb24gZXZlbnRzIGZpcmUgc2hvcnRseSBhZnRlciB0aGUgY29tcG9zaXRpb25lbmQgZXZlbnRcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgIC8vIFdoZW4gYSBkcmFnIGZyb20gdGhlIGVkaXRvciBpcyBhY3RpdmUsIHRoaXMgcG9pbnRzIGF0IHRoZSByYW5nZVxuICAgICAgICAvLyBiZWluZyBkcmFnZ2VkLlxuICAgICAgICB0aGlzLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYW5kbGVFdmVudCA9IHRoaXMuaGFuZGxlRXZlbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5ub3RpZmllZEZvY3VzZWQgPSB2aWV3Lmhhc0ZvY3VzO1xuICAgICAgICAvLyBPbiBTYWZhcmkgYWRkaW5nIGFuIGlucHV0IGV2ZW50IGhhbmRsZXIgc29tZWhvdyBwcmV2ZW50cyBhblxuICAgICAgICAvLyBpc3N1ZSB3aGVyZSB0aGUgY29tcG9zaXRpb24gdmFuaXNoZXMgd2hlbiB5b3UgcHJlc3MgZW50ZXIuXG4gICAgICAgIGlmIChicm93c2VyLnNhZmFyaSlcbiAgICAgICAgICAgIHZpZXcuY29udGVudERPTS5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgKCkgPT4gbnVsbCk7XG4gICAgICAgIGlmIChicm93c2VyLmdlY2tvKVxuICAgICAgICAgICAgZmlyZWZveENvcHlDdXRIYWNrKHZpZXcuY29udGVudERPTS5vd25lckRvY3VtZW50KTtcbiAgICB9XG4gICAgaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKCFldmVudEJlbG9uZ3NUb0VkaXRvcih0aGlzLnZpZXcsIGV2ZW50KSB8fCB0aGlzLmlnbm9yZUR1cmluZ0NvbXBvc2l0aW9uKGV2ZW50KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gXCJrZXlkb3duXCIgJiYgdGhpcy5rZXlkb3duKGV2ZW50KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMudmlldy51cGRhdGVTdGF0ZSAhPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi8pXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMucnVuSGFuZGxlcnMoZXZlbnQudHlwZSwgZXZlbnQpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5ydW5IYW5kbGVycyhldmVudC50eXBlLCBldmVudCk7XG4gICAgfVxuICAgIHJ1bkhhbmRsZXJzKHR5cGUsIGV2ZW50KSB7XG4gICAgICAgIGxldCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnNbdHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICAgICAgZm9yIChsZXQgb2JzZXJ2ZXIgb2YgaGFuZGxlcnMub2JzZXJ2ZXJzKVxuICAgICAgICAgICAgICAgIG9ic2VydmVyKHRoaXMudmlldywgZXZlbnQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaGFuZGxlciBvZiBoYW5kbGVycy5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcih0aGlzLnZpZXcsIGV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW5zdXJlSGFuZGxlcnMocGx1Z2lucykge1xuICAgICAgICBsZXQgaGFuZGxlcnMgPSBjb21wdXRlSGFuZGxlcnMocGx1Z2lucyksIHByZXYgPSB0aGlzLmhhbmRsZXJzLCBkb20gPSB0aGlzLnZpZXcuY29udGVudERPTTtcbiAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBoYW5kbGVycylcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwic2Nyb2xsXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFzc2l2ZSA9ICFoYW5kbGVyc1t0eXBlXS5oYW5kbGVycy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IHByZXZbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0cyAmJiBwYXNzaXZlICE9ICFleGlzdHMuaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXMuaGFuZGxlRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cylcbiAgICAgICAgICAgICAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgdGhpcy5oYW5kbGVFdmVudCwgeyBwYXNzaXZlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCB0eXBlIGluIHByZXYpXG4gICAgICAgICAgICBpZiAodHlwZSAhPSBcInNjcm9sbFwiICYmICFoYW5kbGVyc1t0eXBlXSlcbiAgICAgICAgICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzLmhhbmRsZUV2ZW50KTtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IGhhbmRsZXJzO1xuICAgIH1cbiAgICBrZXlkb3duKGV2ZW50KSB7XG4gICAgICAgIC8vIE11c3QgYWx3YXlzIHJ1biwgZXZlbiBpZiBhIGN1c3RvbSBoYW5kbGVyIGhhbmRsZWQgdGhlIGV2ZW50XG4gICAgICAgIHRoaXMubGFzdEtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgICAgICB0aGlzLmxhc3RLZXlUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gOSAmJiB0aGlzLnRhYkZvY3VzTW9kZSA+IC0xICYmICghdGhpcy50YWJGb2N1c01vZGUgfHwgRGF0ZS5ub3coKSA8PSB0aGlzLnRhYkZvY3VzTW9kZSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMudGFiRm9jdXNNb2RlID4gMCAmJiBldmVudC5rZXlDb2RlICE9IDI3ICYmIG1vZGlmaWVyQ29kZXMuaW5kZXhPZihldmVudC5rZXlDb2RlKSA8IDApXG4gICAgICAgICAgICB0aGlzLnRhYkZvY3VzTW9kZSA9IC0xO1xuICAgICAgICAvLyBDaHJvbWUgZm9yIEFuZHJvaWQgdXN1YWxseSBkb2Vzbid0IGZpcmUgcHJvcGVyIGtleSBldmVudHMsIGJ1dFxuICAgICAgICAvLyBvY2Nhc2lvbmFsbHkgZG9lcywgdXN1YWxseSBzdXJyb3VuZGVkIGJ5IGEgYnVuY2ggb2YgY29tcGxpY2F0ZWRcbiAgICAgICAgLy8gY29tcG9zaXRpb24gY2hhbmdlcy4gV2hlbiBhbiBlbnRlciBvciBiYWNrc3BhY2Uga2V5IGV2ZW50IGlzXG4gICAgICAgIC8vIHNlZW4sIGhvbGQgb2ZmIG9uIGhhbmRsaW5nIERPTSBldmVudHMgZm9yIGEgYml0LCBhbmQgdGhlblxuICAgICAgICAvLyBkaXNwYXRjaCBpdC5cbiAgICAgICAgaWYgKGJyb3dzZXIuYW5kcm9pZCAmJiBicm93c2VyLmNocm9tZSAmJiAhZXZlbnQuc3ludGhldGljICYmXG4gICAgICAgICAgICAoZXZlbnQua2V5Q29kZSA9PSAxMyB8fCBldmVudC5rZXlDb2RlID09IDgpKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuZGVsYXlBbmRyb2lkS2V5KGV2ZW50LmtleSwgZXZlbnQua2V5Q29kZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIEVudGVyIG9uIGlPUyBtYWtlcyB0aGVcbiAgICAgICAgLy8gdmlydHVhbCBrZXlib2FyZCBnZXQgc3R1Y2sgaW4gdGhlIHdyb25nIChsb3dlcmNhc2UpXG4gICAgICAgIC8vIHN0YXRlLiBTbyB3ZSBsZXQgaXQgZ28gdGhyb3VnaCwgYW5kIHRoZW4sIGluXG4gICAgICAgIC8vIGFwcGx5RE9NQ2hhbmdlLCBub3RpZnkga2V5IGhhbmRsZXJzIG9mIGl0IGFuZCByZXNldCB0b1xuICAgICAgICAvLyB0aGUgc3RhdGUgdGhleSBwcm9kdWNlLlxuICAgICAgICBsZXQgcGVuZGluZztcbiAgICAgICAgaWYgKGJyb3dzZXIuaW9zICYmICFldmVudC5zeW50aGV0aWMgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQubWV0YUtleSAmJlxuICAgICAgICAgICAgKChwZW5kaW5nID0gUGVuZGluZ0tleXMuZmluZChrZXkgPT4ga2V5LmtleUNvZGUgPT0gZXZlbnQua2V5Q29kZSkpICYmICFldmVudC5jdHJsS2V5IHx8XG4gICAgICAgICAgICAgICAgRW1hY3N5UGVuZGluZ0tleXMuaW5kZXhPZihldmVudC5rZXkpID4gLTEgJiYgZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkpKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdJT1NLZXkgPSBwZW5kaW5nIHx8IGV2ZW50O1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZsdXNoSU9TS2V5KCksIDI1MCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSAhPSAyMjkpXG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZsdXNoSU9TS2V5KGNoYW5nZSkge1xuICAgICAgICBsZXQga2V5ID0gdGhpcy5wZW5kaW5nSU9TS2V5O1xuICAgICAgICBpZiAoIWtleSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gVGhpcyBsb29rcyBsaWtlIGFuIGF1dG9jb3JyZWN0aW9uIGJlZm9yZSBFbnRlclxuICAgICAgICBpZiAoa2V5LmtleSA9PSBcIkVudGVyXCIgJiYgY2hhbmdlICYmIGNoYW5nZS5mcm9tIDwgY2hhbmdlLnRvICYmIC9eXFxTKyQvLnRlc3QoY2hhbmdlLmluc2VydC50b1N0cmluZygpKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5wZW5kaW5nSU9TS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2hLZXkodGhpcy52aWV3LmNvbnRlbnRET00sIGtleS5rZXksIGtleS5rZXlDb2RlLCBrZXkgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ID8ga2V5IDogdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgaWdub3JlRHVyaW5nQ29tcG9zaXRpb24oZXZlbnQpIHtcbiAgICAgICAgaWYgKCEvXmtleS8udGVzdChldmVudC50eXBlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY29tcG9zaW5nID4gMClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cuc3R1bS5kZS8yMDE2LzA2LzI0L2hhbmRsaW5nLWltZS1ldmVudHMtaW4tamF2YXNjcmlwdC8uXG4gICAgICAgIC8vIE9uIHNvbWUgaW5wdXQgbWV0aG9kIGVkaXRvcnMgKElNRXMpLCB0aGUgRW50ZXIga2V5IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gY29uZmlybSBjaGFyYWN0ZXIgc2VsZWN0aW9uLiBPbiBTYWZhcmksIHdoZW4gRW50ZXIgaXMgcHJlc3NlZCxcbiAgICAgICAgLy8gY29tcG9zaXRpb25lbmQgYW5kIGtleWRvd24gZXZlbnRzIGFyZSBzb21ldGltZXMgZW1pdHRlZCBpbiB0aGVcbiAgICAgICAgLy8gd3Jvbmcgb3JkZXIuIFRoZSBrZXkgZXZlbnQgc2hvdWxkIHN0aWxsIGJlIGlnbm9yZWQsIGV2ZW4gd2hlblxuICAgICAgICAvLyBpdCBoYXBwZW5zIGFmdGVyIHRoZSBjb21wb3NpdGlvbmVuZCBldmVudC5cbiAgICAgICAgaWYgKGJyb3dzZXIuc2FmYXJpICYmICFicm93c2VyLmlvcyAmJiB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0tleSAmJiBEYXRlLm5vdygpIC0gdGhpcy5jb21wb3NpdGlvbkVuZGVkQXQgPCAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9zaXRpb25QZW5kaW5nS2V5ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN0YXJ0TW91c2VTZWxlY3Rpb24obW91c2VTZWxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHRoaXMubW91c2VTZWxlY3Rpb24pXG4gICAgICAgICAgICB0aGlzLm1vdXNlU2VsZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbiA9IG1vdXNlU2VsZWN0aW9uO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIHRoaXMudmlldy5vYnNlcnZlci51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgaWYgKHRoaXMubW91c2VTZWxlY3Rpb24pXG4gICAgICAgICAgICB0aGlzLm1vdXNlU2VsZWN0aW9uLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICBpZiAodGhpcy5kcmFnZ2VkQ29udGVudCAmJiB1cGRhdGUuZG9jQ2hhbmdlZClcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dlZENvbnRlbnQgPSB0aGlzLmRyYWdnZWRDb250ZW50Lm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgIGlmICh1cGRhdGUudHJhbnNhY3Rpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMubGFzdEtleUNvZGUgPSB0aGlzLmxhc3RTZWxlY3Rpb25UaW1lID0gMDtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMubW91c2VTZWxlY3Rpb24pXG4gICAgICAgICAgICB0aGlzLm1vdXNlU2VsZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB9XG59XG5mdW5jdGlvbiBiaW5kSGFuZGxlcihwbHVnaW4sIGhhbmRsZXIpIHtcbiAgICByZXR1cm4gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlci5jYWxsKHBsdWdpbiwgZXZlbnQsIHZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dFeGNlcHRpb24odmlldy5zdGF0ZSwgZSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gY29tcHV0ZUhhbmRsZXJzKHBsdWdpbnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmdW5jdGlvbiByZWNvcmQodHlwZSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0W3R5cGVdIHx8IChyZXN1bHRbdHlwZV0gPSB7IG9ic2VydmVyczogW10sIGhhbmRsZXJzOiBbXSB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgbGV0IHNwZWMgPSBwbHVnaW4uc3BlYztcbiAgICAgICAgaWYgKHNwZWMgJiYgc3BlYy5kb21FdmVudEhhbmRsZXJzKVxuICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBzcGVjLmRvbUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZiA9IHNwZWMuZG9tRXZlbnRIYW5kbGVyc1t0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAoZilcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkKHR5cGUpLmhhbmRsZXJzLnB1c2goYmluZEhhbmRsZXIocGx1Z2luLnZhbHVlLCBmKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjICYmIHNwZWMuZG9tRXZlbnRPYnNlcnZlcnMpXG4gICAgICAgICAgICBmb3IgKGxldCB0eXBlIGluIHNwZWMuZG9tRXZlbnRPYnNlcnZlcnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZiA9IHNwZWMuZG9tRXZlbnRPYnNlcnZlcnNbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICAgICAgICAgIHJlY29yZCh0eXBlKS5vYnNlcnZlcnMucHVzaChiaW5kSGFuZGxlcihwbHVnaW4udmFsdWUsIGYpKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgdHlwZSBpbiBoYW5kbGVycylcbiAgICAgICAgcmVjb3JkKHR5cGUpLmhhbmRsZXJzLnB1c2goaGFuZGxlcnNbdHlwZV0pO1xuICAgIGZvciAobGV0IHR5cGUgaW4gb2JzZXJ2ZXJzKVxuICAgICAgICByZWNvcmQodHlwZSkub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXJzW3R5cGVdKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgUGVuZGluZ0tleXMgPSBbXG4gICAgeyBrZXk6IFwiQmFja3NwYWNlXCIsIGtleUNvZGU6IDgsIGlucHV0VHlwZTogXCJkZWxldGVDb250ZW50QmFja3dhcmRcIiB9LFxuICAgIHsga2V5OiBcIkVudGVyXCIsIGtleUNvZGU6IDEzLCBpbnB1dFR5cGU6IFwiaW5zZXJ0UGFyYWdyYXBoXCIgfSxcbiAgICB7IGtleTogXCJFbnRlclwiLCBrZXlDb2RlOiAxMywgaW5wdXRUeXBlOiBcImluc2VydExpbmVCcmVha1wiIH0sXG4gICAgeyBrZXk6IFwiRGVsZXRlXCIsIGtleUNvZGU6IDQ2LCBpbnB1dFR5cGU6IFwiZGVsZXRlQ29udGVudEZvcndhcmRcIiB9XG5dO1xuY29uc3QgRW1hY3N5UGVuZGluZ0tleXMgPSBcImR0aGtvXCI7XG4vLyBLZXkgY29kZXMgZm9yIG1vZGlmaWVyIGtleXNcbmNvbnN0IG1vZGlmaWVyQ29kZXMgPSBbMTYsIDE3LCAxOCwgMjAsIDkxLCA5MiwgMjI0LCAyMjVdO1xuY29uc3QgZHJhZ1Njcm9sbE1hcmdpbiA9IDY7XG5mdW5jdGlvbiBkcmFnU2Nyb2xsU3BlZWQoZGlzdCkge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCBkaXN0KSAqIDAuNyArIDg7XG59XG5mdW5jdGlvbiBkaXN0KGEsIGIpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnMoYS5jbGllbnRYIC0gYi5jbGllbnRYKSwgTWF0aC5hYnMoYS5jbGllbnRZIC0gYi5jbGllbnRZKSk7XG59XG5jbGFzcyBNb3VzZVNlbGVjdGlvbiB7XG4gICAgY29uc3RydWN0b3Iodmlldywgc3RhcnRFdmVudCwgc3R5bGUsIG11c3RTZWxlY3QpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5zdGFydEV2ZW50ID0gc3RhcnRFdmVudDtcbiAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlO1xuICAgICAgICB0aGlzLm11c3RTZWxlY3QgPSBtdXN0U2VsZWN0O1xuICAgICAgICB0aGlzLnNjcm9sbFNwZWVkID0geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIHRoaXMuc2Nyb2xsaW5nID0gLTE7XG4gICAgICAgIHRoaXMubGFzdEV2ZW50ID0gc3RhcnRFdmVudDtcbiAgICAgICAgdGhpcy5zY3JvbGxQYXJlbnRzID0gc2Nyb2xsYWJsZVBhcmVudHModmlldy5jb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5hdG9tcyA9IHZpZXcuc3RhdGUuZmFjZXQoYXRvbWljUmFuZ2VzKS5tYXAoZiA9PiBmKHZpZXcpKTtcbiAgICAgICAgbGV0IGRvYyA9IHZpZXcuY29udGVudERPTS5vd25lckRvY3VtZW50O1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdmUgPSB0aGlzLm1vdmUuYmluZCh0aGlzKSk7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwID0gdGhpcy51cC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5leHRlbmQgPSBzdGFydEV2ZW50LnNoaWZ0S2V5O1xuICAgICAgICB0aGlzLm11bHRpcGxlID0gdmlldy5zdGF0ZS5mYWNldChFZGl0b3JTdGF0ZS5hbGxvd011bHRpcGxlU2VsZWN0aW9ucykgJiYgYWRkc1NlbGVjdGlvblJhbmdlKHZpZXcsIHN0YXJ0RXZlbnQpO1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gaXNJblByaW1hcnlTZWxlY3Rpb24odmlldywgc3RhcnRFdmVudCkgJiYgZ2V0Q2xpY2tUeXBlKHN0YXJ0RXZlbnQpID09IDEgPyBudWxsIDogZmFsc2U7XG4gICAgfVxuICAgIHN0YXJ0KGV2ZW50KSB7XG4gICAgICAgIC8vIFdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgc2VsZWN0aW9uLCBpbW1lZGlhdGVseSBhcHBseSB0aGVcbiAgICAgICAgLy8gZWZmZWN0IG9mIHN0YXJ0aW5nIHRoZSBzZWxlY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3QoZXZlbnQpO1xuICAgIH1cbiAgICBtb3ZlKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5idXR0b25zID09IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLmRyYWdnaW5nIHx8IHRoaXMuZHJhZ2dpbmcgPT0gbnVsbCAmJiBkaXN0KHRoaXMuc3RhcnRFdmVudCwgZXZlbnQpIDwgMTApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuc2VsZWN0KHRoaXMubGFzdEV2ZW50ID0gZXZlbnQpO1xuICAgICAgICBsZXQgc3ggPSAwLCBzeSA9IDA7XG4gICAgICAgIGxldCBsZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSB0aGlzLnZpZXcud2luLmlubmVyV2lkdGgsIGJvdHRvbSA9IHRoaXMudmlldy53aW4uaW5uZXJIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFBhcmVudHMueClcbiAgICAgICAgICAgICh7IGxlZnQsIHJpZ2h0IH0gPSB0aGlzLnNjcm9sbFBhcmVudHMueC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFBhcmVudHMueSlcbiAgICAgICAgICAgICh7IHRvcCwgYm90dG9tIH0gPSB0aGlzLnNjcm9sbFBhcmVudHMueS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgICAgIGxldCBtYXJnaW5zID0gZ2V0U2Nyb2xsTWFyZ2lucyh0aGlzLnZpZXcpO1xuICAgICAgICBpZiAoZXZlbnQuY2xpZW50WCAtIG1hcmdpbnMubGVmdCA8PSBsZWZ0ICsgZHJhZ1Njcm9sbE1hcmdpbilcbiAgICAgICAgICAgIHN4ID0gLWRyYWdTY3JvbGxTcGVlZChsZWZ0IC0gZXZlbnQuY2xpZW50WCk7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmNsaWVudFggKyBtYXJnaW5zLnJpZ2h0ID49IHJpZ2h0IC0gZHJhZ1Njcm9sbE1hcmdpbilcbiAgICAgICAgICAgIHN4ID0gZHJhZ1Njcm9sbFNwZWVkKGV2ZW50LmNsaWVudFggLSByaWdodCk7XG4gICAgICAgIGlmIChldmVudC5jbGllbnRZIC0gbWFyZ2lucy50b3AgPD0gdG9wICsgZHJhZ1Njcm9sbE1hcmdpbilcbiAgICAgICAgICAgIHN5ID0gLWRyYWdTY3JvbGxTcGVlZCh0b3AgLSBldmVudC5jbGllbnRZKTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQuY2xpZW50WSArIG1hcmdpbnMuYm90dG9tID49IGJvdHRvbSAtIGRyYWdTY3JvbGxNYXJnaW4pXG4gICAgICAgICAgICBzeSA9IGRyYWdTY3JvbGxTcGVlZChldmVudC5jbGllbnRZIC0gYm90dG9tKTtcbiAgICAgICAgdGhpcy5zZXRTY3JvbGxTcGVlZChzeCwgc3kpO1xuICAgIH1cbiAgICB1cChldmVudCkge1xuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5sYXN0RXZlbnQpO1xuICAgICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zZXRTY3JvbGxTcGVlZCgwLCAwKTtcbiAgICAgICAgbGV0IGRvYyA9IHRoaXMudmlldy5jb250ZW50RE9NLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW92ZSk7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwKTtcbiAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubW91c2VTZWxlY3Rpb24gPSB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IG51bGw7XG4gICAgfVxuICAgIHNldFNjcm9sbFNwZWVkKHN4LCBzeSkge1xuICAgICAgICB0aGlzLnNjcm9sbFNwZWVkID0geyB4OiBzeCwgeTogc3kgfTtcbiAgICAgICAgaWYgKHN4IHx8IHN5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zY3JvbGxpbmcgPCAwKVxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsaW5nID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5zY3JvbGwoKSwgNTApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc2Nyb2xsaW5nID4gLTEpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY3JvbGxpbmcpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxpbmcgPSAtMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY3JvbGwoKSB7XG4gICAgICAgIGxldCB7IHgsIHkgfSA9IHRoaXMuc2Nyb2xsU3BlZWQ7XG4gICAgICAgIGlmICh4ICYmIHRoaXMuc2Nyb2xsUGFyZW50cy54KSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFBhcmVudHMueC5zY3JvbGxMZWZ0ICs9IHg7XG4gICAgICAgICAgICB4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeSAmJiB0aGlzLnNjcm9sbFBhcmVudHMueSkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxQYXJlbnRzLnkuc2Nyb2xsVG9wICs9IHk7XG4gICAgICAgICAgICB5ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeCB8fCB5KVxuICAgICAgICAgICAgdGhpcy52aWV3Lndpbi5zY3JvbGxCeSh4LCB5KTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5sYXN0RXZlbnQpO1xuICAgIH1cbiAgICBza2lwQXRvbXMoc2VsKSB7XG4gICAgICAgIGxldCByYW5nZXMgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHNlbC5yYW5nZXNbaV0sIHVwZGF0ZWQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvcyA9IHNraXBBdG9taWNSYW5nZXModGhpcy5hdG9tcywgcmFuZ2UuZnJvbSwgMCk7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyAhPSByYW5nZS5mcm9tKVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gc2tpcEF0b21pY1Jhbmdlcyh0aGlzLmF0b21zLCByYW5nZS5mcm9tLCAtMSk7XG4gICAgICAgICAgICAgICAgbGV0IHRvID0gc2tpcEF0b21pY1Jhbmdlcyh0aGlzLmF0b21zLCByYW5nZS50bywgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gIT0gcmFuZ2UuZnJvbSB8fCB0byAhPSByYW5nZS50bylcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IEVkaXRvclNlbGVjdGlvbi5yYW5nZShyYW5nZS5mcm9tID09IHJhbmdlLmFuY2hvciA/IGZyb20gOiB0bywgcmFuZ2UuZnJvbSA9PSByYW5nZS5oZWFkID8gZnJvbSA6IHRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyYW5nZXMpXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlcyA9IHNlbC5yYW5nZXMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICByYW5nZXNbaV0gPSB1cGRhdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYW5nZXMgPyBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcywgc2VsLm1haW5JbmRleCkgOiBzZWw7XG4gICAgfVxuICAgIHNlbGVjdChldmVudCkge1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzLCBzZWxlY3Rpb24gPSB0aGlzLnNraXBBdG9tcyh0aGlzLnN0eWxlLmdldChldmVudCwgdGhpcy5leHRlbmQsIHRoaXMubXVsdGlwbGUpKTtcbiAgICAgICAgaWYgKHRoaXMubXVzdFNlbGVjdCB8fCAhc2VsZWN0aW9uLmVxKHZpZXcuc3RhdGUuc2VsZWN0aW9uLCB0aGlzLmRyYWdnaW5nID09PSBmYWxzZSkpXG4gICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbixcbiAgICAgICAgICAgICAgICB1c2VyRXZlbnQ6IFwic2VsZWN0LnBvaW50ZXJcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubXVzdFNlbGVjdCA9IGZhbHNlO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh1cGRhdGUudHJhbnNhY3Rpb25zLnNvbWUodHIgPT4gdHIuaXNVc2VyRXZlbnQoXCJpbnB1dC50eXBlXCIpKSlcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLnN0eWxlLnVwZGF0ZSh1cGRhdGUpKVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCksIDIwKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRzU2VsZWN0aW9uUmFuZ2UodmlldywgZXZlbnQpIHtcbiAgICBsZXQgZmFjZXQgPSB2aWV3LnN0YXRlLmZhY2V0KGNsaWNrQWRkc1NlbGVjdGlvblJhbmdlKTtcbiAgICByZXR1cm4gZmFjZXQubGVuZ3RoID8gZmFjZXRbMF0oZXZlbnQpIDogYnJvd3Nlci5tYWMgPyBldmVudC5tZXRhS2V5IDogZXZlbnQuY3RybEtleTtcbn1cbmZ1bmN0aW9uIGRyYWdNb3Zlc1NlbGVjdGlvbih2aWV3LCBldmVudCkge1xuICAgIGxldCBmYWNldCA9IHZpZXcuc3RhdGUuZmFjZXQoZHJhZ01vdmVzU2VsZWN0aW9uJDEpO1xuICAgIHJldHVybiBmYWNldC5sZW5ndGggPyBmYWNldFswXShldmVudCkgOiBicm93c2VyLm1hYyA/ICFldmVudC5hbHRLZXkgOiAhZXZlbnQuY3RybEtleTtcbn1cbmZ1bmN0aW9uIGlzSW5QcmltYXJ5U2VsZWN0aW9uKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHsgbWFpbiB9ID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKG1haW4uZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBPbiBib3VuZGFyeSBjbGlja3MsIGNoZWNrIHdoZXRoZXIgdGhlIGNvb3JkaW5hdGVzIGFyZSBpbnNpZGUgdGhlXG4gICAgLy8gc2VsZWN0aW9uJ3MgY2xpZW50IHJlY3RhbmdsZXNcbiAgICBsZXQgc2VsID0gZ2V0U2VsZWN0aW9uKHZpZXcucm9vdCk7XG4gICAgaWYgKCFzZWwgfHwgc2VsLnJhbmdlQ291bnQgPT0gMClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IHJlY3RzID0gc2VsLmdldFJhbmdlQXQoMCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgIGlmIChyZWN0LmxlZnQgPD0gZXZlbnQuY2xpZW50WCAmJiByZWN0LnJpZ2h0ID49IGV2ZW50LmNsaWVudFggJiZcbiAgICAgICAgICAgIHJlY3QudG9wIDw9IGV2ZW50LmNsaWVudFkgJiYgcmVjdC5ib3R0b20gPj0gZXZlbnQuY2xpZW50WSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBldmVudEJlbG9uZ3NUb0VkaXRvcih2aWV3LCBldmVudCkge1xuICAgIGlmICghZXZlbnQuYnViYmxlcylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBub2RlID0gZXZlbnQudGFyZ2V0LCBjVmlldzsgbm9kZSAhPSB2aWV3LmNvbnRlbnRET007IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpXG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlID09IDExIHx8ICgoY1ZpZXcgPSBDb250ZW50Vmlldy5nZXQobm9kZSkpICYmIGNWaWV3Lmlnbm9yZUV2ZW50KGV2ZW50KSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5jb25zdCBoYW5kbGVycyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3Qgb2JzZXJ2ZXJzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG4vLyBUaGlzIGlzIHZlcnkgY3J1ZGUsIGJ1dCB1bmZvcnR1bmF0ZWx5IGJvdGggdGhlc2UgYnJvd3NlcnMgX3ByZXRlbmRfXG4vLyB0aGF0IHRoZXkgaGF2ZSBhIGNsaXBib2FyZCBBUElcdTIwMTRhbGwgdGhlIG9iamVjdHMgYW5kIG1ldGhvZHMgYXJlXG4vLyB0aGVyZSwgdGhleSBqdXN0IGRvbid0IHdvcmssIGFuZCB0aGV5IGFyZSBoYXJkIHRvIHRlc3QuXG5jb25zdCBicm9rZW5DbGlwYm9hcmRBUEkgPSAoYnJvd3Nlci5pZSAmJiBicm93c2VyLmllX3ZlcnNpb24gPCAxNSkgfHxcbiAgICAoYnJvd3Nlci5pb3MgJiYgYnJvd3Nlci53ZWJraXRfdmVyc2lvbiA8IDYwNCk7XG5mdW5jdGlvbiBjYXB0dXJlUGFzdGUodmlldykge1xuICAgIGxldCBwYXJlbnQgPSB2aWV3LmRvbS5wYXJlbnROb2RlO1xuICAgIGlmICghcGFyZW50KVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHRhcmdldCA9IHBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIikpO1xuICAgIHRhcmdldC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwMHB4OyB0b3A6IDEwcHhcIjtcbiAgICB0YXJnZXQuZm9jdXMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlKCk7XG4gICAgICAgIGRvUGFzdGUodmlldywgdGFyZ2V0LnZhbHVlKTtcbiAgICB9LCA1MCk7XG59XG5mdW5jdGlvbiB0ZXh0RmlsdGVyKHN0YXRlLCBmYWNldCwgdGV4dCkge1xuICAgIGZvciAobGV0IGZpbHRlciBvZiBzdGF0ZS5mYWNldChmYWNldCkpXG4gICAgICAgIHRleHQgPSBmaWx0ZXIodGV4dCwgc3RhdGUpO1xuICAgIHJldHVybiB0ZXh0O1xufVxuZnVuY3Rpb24gZG9QYXN0ZSh2aWV3LCBpbnB1dCkge1xuICAgIGlucHV0ID0gdGV4dEZpbHRlcih2aWV3LnN0YXRlLCBjbGlwYm9hcmRJbnB1dEZpbHRlciwgaW5wdXQpO1xuICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBjaGFuZ2VzLCBpID0gMSwgdGV4dCA9IHN0YXRlLnRvVGV4dChpbnB1dCk7XG4gICAgbGV0IGJ5TGluZSA9IHRleHQubGluZXMgPT0gc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5sZW5ndGg7XG4gICAgbGV0IGxpbmV3aXNlID0gbGFzdExpbmV3aXNlQ29weSAhPSBudWxsICYmIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMuZXZlcnkociA9PiByLmVtcHR5KSAmJiBsYXN0TGluZXdpc2VDb3B5ID09IHRleHQudG9TdHJpbmcoKTtcbiAgICBpZiAobGluZXdpc2UpIHtcbiAgICAgICAgbGV0IGxhc3RMaW5lID0gLTE7XG4gICAgICAgIGNoYW5nZXMgPSBzdGF0ZS5jaGFuZ2VCeVJhbmdlKHJhbmdlID0+IHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChyYW5nZS5mcm9tKTtcbiAgICAgICAgICAgIGlmIChsaW5lLmZyb20gPT0gbGFzdExpbmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2UgfTtcbiAgICAgICAgICAgIGxhc3RMaW5lID0gbGluZS5mcm9tO1xuICAgICAgICAgICAgbGV0IGluc2VydCA9IHN0YXRlLnRvVGV4dCgoYnlMaW5lID8gdGV4dC5saW5lKGkrKykudGV4dCA6IGlucHV0KSArIHN0YXRlLmxpbmVCcmVhayk7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFuZ2VzOiB7IGZyb206IGxpbmUuZnJvbSwgaW5zZXJ0IH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6IEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocmFuZ2UuZnJvbSArIGluc2VydC5sZW5ndGgpIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChieUxpbmUpIHtcbiAgICAgICAgY2hhbmdlcyA9IHN0YXRlLmNoYW5nZUJ5UmFuZ2UocmFuZ2UgPT4ge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSB0ZXh0LmxpbmUoaSsrKTtcbiAgICAgICAgICAgIHJldHVybiB7IGNoYW5nZXM6IHsgZnJvbTogcmFuZ2UuZnJvbSwgdG86IHJhbmdlLnRvLCBpbnNlcnQ6IGxpbmUudGV4dCB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHJhbmdlLmZyb20gKyBsaW5lLmxlbmd0aCkgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjaGFuZ2VzID0gc3RhdGUucmVwbGFjZVNlbGVjdGlvbih0ZXh0KTtcbiAgICB9XG4gICAgdmlldy5kaXNwYXRjaChjaGFuZ2VzLCB7XG4gICAgICAgIHVzZXJFdmVudDogXCJpbnB1dC5wYXN0ZVwiLFxuICAgICAgICBzY3JvbGxJbnRvVmlldzogdHJ1ZVxuICAgIH0pO1xufVxub2JzZXJ2ZXJzLnNjcm9sbCA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsVG9wID0gdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsTGVmdCA9IHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQ7XG59O1xuaGFuZGxlcnMua2V5ZG93biA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5zZXRTZWxlY3Rpb25PcmlnaW4oXCJzZWxlY3RcIik7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gMjcgJiYgdmlldy5pbnB1dFN0YXRlLnRhYkZvY3VzTW9kZSAhPSAwKVxuICAgICAgICB2aWV3LmlucHV0U3RhdGUudGFiRm9jdXNNb2RlID0gRGF0ZS5ub3coKSArIDIwMDA7XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbm9ic2VydmVycy50b3VjaHN0YXJ0ID0gKHZpZXcsIGUpID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdFRvdWNoVGltZSA9IERhdGUubm93KCk7XG4gICAgdmlldy5pbnB1dFN0YXRlLnNldFNlbGVjdGlvbk9yaWdpbihcInNlbGVjdC5wb2ludGVyXCIpO1xufTtcbm9ic2VydmVycy50b3VjaG1vdmUgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUuc2V0U2VsZWN0aW9uT3JpZ2luKFwic2VsZWN0LnBvaW50ZXJcIik7XG59O1xuaGFuZGxlcnMubW91c2Vkb3duID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgdmlldy5vYnNlcnZlci5mbHVzaCgpO1xuICAgIGlmICh2aWV3LmlucHV0U3RhdGUubGFzdFRvdWNoVGltZSA+IERhdGUubm93KCkgLSAyMDAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIElnbm9yZSB0b3VjaCBpbnRlcmFjdGlvblxuICAgIGxldCBzdHlsZSA9IG51bGw7XG4gICAgZm9yIChsZXQgbWFrZVN0eWxlIG9mIHZpZXcuc3RhdGUuZmFjZXQobW91c2VTZWxlY3Rpb25TdHlsZSkpIHtcbiAgICAgICAgc3R5bGUgPSBtYWtlU3R5bGUodmlldywgZXZlbnQpO1xuICAgICAgICBpZiAoc3R5bGUpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKCFzdHlsZSAmJiBldmVudC5idXR0b24gPT0gMClcbiAgICAgICAgc3R5bGUgPSBiYXNpY01vdXNlU2VsZWN0aW9uKHZpZXcsIGV2ZW50KTtcbiAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgbGV0IG11c3RGb2N1cyA9ICF2aWV3Lmhhc0ZvY3VzO1xuICAgICAgICB2aWV3LmlucHV0U3RhdGUuc3RhcnRNb3VzZVNlbGVjdGlvbihuZXcgTW91c2VTZWxlY3Rpb24odmlldywgZXZlbnQsIHN0eWxlLCBtdXN0Rm9jdXMpKTtcbiAgICAgICAgaWYgKG11c3RGb2N1cylcbiAgICAgICAgICAgIHZpZXcub2JzZXJ2ZXIuaWdub3JlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBmb2N1c1ByZXZlbnRTY3JvbGwodmlldy5jb250ZW50RE9NKTtcbiAgICAgICAgICAgICAgICBsZXQgYWN0aXZlID0gdmlldy5yb290LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSAmJiAhYWN0aXZlLmNvbnRhaW5zKHZpZXcuY29udGVudERPTSkpXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5ibHVyKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgbGV0IG1vdXNlU2VsID0gdmlldy5pbnB1dFN0YXRlLm1vdXNlU2VsZWN0aW9uO1xuICAgICAgICBpZiAobW91c2VTZWwpIHtcbiAgICAgICAgICAgIG1vdXNlU2VsLnN0YXJ0KGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybiBtb3VzZVNlbC5kcmFnZ2luZyA9PT0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmZ1bmN0aW9uIHJhbmdlRm9yQ2xpY2sodmlldywgcG9zLCBiaWFzLCB0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT0gMSkgeyAvLyBTaW5nbGUgY2xpY2tcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zLCBiaWFzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSA9PSAyKSB7IC8vIERvdWJsZSBjbGlja1xuICAgICAgICByZXR1cm4gZ3JvdXBBdCh2aWV3LnN0YXRlLCBwb3MsIGJpYXMpO1xuICAgIH1cbiAgICBlbHNlIHsgLy8gVHJpcGxlIGNsaWNrXG4gICAgICAgIGxldCB2aXN1YWwgPSBMaW5lVmlldy5maW5kKHZpZXcuZG9jVmlldywgcG9zKSwgbGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdCh2aXN1YWwgPyB2aXN1YWwucG9zQXRFbmQgOiBwb3MpO1xuICAgICAgICBsZXQgZnJvbSA9IHZpc3VhbCA/IHZpc3VhbC5wb3NBdFN0YXJ0IDogbGluZS5mcm9tLCB0byA9IHZpc3VhbCA/IHZpc3VhbC5wb3NBdEVuZCA6IGxpbmUudG87XG4gICAgICAgIGlmICh0byA8IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCAmJiB0byA9PSBsaW5lLnRvKVxuICAgICAgICAgICAgdG8rKztcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tLCB0byk7XG4gICAgfVxufVxubGV0IGluc2lkZSA9ICh4LCB5LCByZWN0KSA9PiB5ID49IHJlY3QudG9wICYmIHkgPD0gcmVjdC5ib3R0b20gJiYgeCA+PSByZWN0LmxlZnQgJiYgeCA8PSByZWN0LnJpZ2h0O1xuLy8gVHJ5IHRvIGRldGVybWluZSwgZm9yIHRoZSBnaXZlbiBjb29yZGluYXRlcywgYXNzb2NpYXRlZCB3aXRoIHRoZVxuLy8gZ2l2ZW4gcG9zaXRpb24sIHdoZXRoZXIgdGhleSBhcmUgcmVsYXRlZCB0byB0aGUgZWxlbWVudCBiZWZvcmUgb3Jcbi8vIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBwb3NpdGlvbi5cbmZ1bmN0aW9uIGZpbmRQb3NpdGlvblNpZGUodmlldywgcG9zLCB4LCB5KSB7XG4gICAgbGV0IGxpbmUgPSBMaW5lVmlldy5maW5kKHZpZXcuZG9jVmlldywgcG9zKTtcbiAgICBpZiAoIWxpbmUpXG4gICAgICAgIHJldHVybiAxO1xuICAgIGxldCBvZmYgPSBwb3MgLSBsaW5lLnBvc0F0U3RhcnQ7XG4gICAgLy8gTGluZSBib3VuZGFyaWVzIHBvaW50IGludG8gdGhlIGxpbmVcbiAgICBpZiAob2ZmID09IDApXG4gICAgICAgIHJldHVybiAxO1xuICAgIGlmIChvZmYgPT0gbGluZS5sZW5ndGgpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAvLyBQb3NpdGlvbnMgb24gdG9wIG9mIGFuIGVsZW1lbnQgcG9pbnQgYXQgdGhhdCBlbGVtZW50XG4gICAgbGV0IGJlZm9yZSA9IGxpbmUuY29vcmRzQXQob2ZmLCAtMSk7XG4gICAgaWYgKGJlZm9yZSAmJiBpbnNpZGUoeCwgeSwgYmVmb3JlKSlcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIGxldCBhZnRlciA9IGxpbmUuY29vcmRzQXQob2ZmLCAxKTtcbiAgICBpZiAoYWZ0ZXIgJiYgaW5zaWRlKHgsIHksIGFmdGVyKSlcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgLy8gVGhpcyBpcyBwcm9iYWJseSBhIGxpbmUgd3JhcCBwb2ludC4gUGljayBiZWZvcmUgaWYgdGhlIHBvaW50IGlzXG4gICAgLy8gYWJvdmUgaXRzIGJvdHRvbS5cbiAgICByZXR1cm4gYmVmb3JlICYmIGJlZm9yZS5ib3R0b20gPj0geSA/IC0xIDogMTtcbn1cbmZ1bmN0aW9uIHF1ZXJ5UG9zKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHBvcyA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0sIGZhbHNlKTtcbiAgICByZXR1cm4geyBwb3MsIGJpYXM6IGZpbmRQb3NpdGlvblNpZGUodmlldywgcG9zLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSB9O1xufVxuY29uc3QgQmFkTW91c2VEZXRhaWwgPSBicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8PSAxMTtcbmxldCBsYXN0TW91c2VEb3duID0gbnVsbCwgbGFzdE1vdXNlRG93bkNvdW50ID0gMCwgbGFzdE1vdXNlRG93blRpbWUgPSAwO1xuZnVuY3Rpb24gZ2V0Q2xpY2tUeXBlKGV2ZW50KSB7XG4gICAgaWYgKCFCYWRNb3VzZURldGFpbClcbiAgICAgICAgcmV0dXJuIGV2ZW50LmRldGFpbDtcbiAgICBsZXQgbGFzdCA9IGxhc3RNb3VzZURvd24sIGxhc3RUaW1lID0gbGFzdE1vdXNlRG93blRpbWU7XG4gICAgbGFzdE1vdXNlRG93biA9IGV2ZW50O1xuICAgIGxhc3RNb3VzZURvd25UaW1lID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gbGFzdE1vdXNlRG93bkNvdW50ID0gIWxhc3QgfHwgKGxhc3RUaW1lID4gRGF0ZS5ub3coKSAtIDQwMCAmJiBNYXRoLmFicyhsYXN0LmNsaWVudFggLSBldmVudC5jbGllbnRYKSA8IDIgJiZcbiAgICAgICAgTWF0aC5hYnMobGFzdC5jbGllbnRZIC0gZXZlbnQuY2xpZW50WSkgPCAyKSA/IChsYXN0TW91c2VEb3duQ291bnQgKyAxKSAlIDMgOiAxO1xufVxuZnVuY3Rpb24gYmFzaWNNb3VzZVNlbGVjdGlvbih2aWV3LCBldmVudCkge1xuICAgIGxldCBzdGFydCA9IHF1ZXJ5UG9zKHZpZXcsIGV2ZW50KSwgdHlwZSA9IGdldENsaWNrVHlwZShldmVudCk7XG4gICAgbGV0IHN0YXJ0U2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQucG9zID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHN0YXJ0LnBvcyk7XG4gICAgICAgICAgICAgICAgc3RhcnRTZWwgPSBzdGFydFNlbC5tYXAodXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXQoZXZlbnQsIGV4dGVuZCwgbXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSBxdWVyeVBvcyh2aWV3LCBldmVudCksIHJlbW92ZWQ7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZUZvckNsaWNrKHZpZXcsIGN1ci5wb3MsIGN1ci5iaWFzLCB0eXBlKTtcbiAgICAgICAgICAgIGlmIChzdGFydC5wb3MgIT0gY3VyLnBvcyAmJiAhZXh0ZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0UmFuZ2UgPSByYW5nZUZvckNsaWNrKHZpZXcsIHN0YXJ0LnBvcywgc3RhcnQuYmlhcywgdHlwZSk7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBNYXRoLm1pbihzdGFydFJhbmdlLmZyb20sIHJhbmdlLmZyb20pLCB0byA9IE1hdGgubWF4KHN0YXJ0UmFuZ2UudG8sIHJhbmdlLnRvKTtcbiAgICAgICAgICAgICAgICByYW5nZSA9IGZyb20gPCByYW5nZS5mcm9tID8gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20sIHRvKSA6IEVkaXRvclNlbGVjdGlvbi5yYW5nZSh0bywgZnJvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXh0ZW5kKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbC5yZXBsYWNlUmFuZ2Uoc3RhcnRTZWwubWFpbi5leHRlbmQocmFuZ2UuZnJvbSwgcmFuZ2UudG8pKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKG11bHRpcGxlICYmIHR5cGUgPT0gMSAmJiBzdGFydFNlbC5yYW5nZXMubGVuZ3RoID4gMSAmJiAocmVtb3ZlZCA9IHJlbW92ZVJhbmdlQXJvdW5kKHN0YXJ0U2VsLCBjdXIucG9zKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgICAgICAgICBlbHNlIGlmIChtdWx0aXBsZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRTZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKFtyYW5nZV0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVJhbmdlQXJvdW5kKHNlbCwgcG9zKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSBzZWwucmFuZ2VzW2ldO1xuICAgICAgICBpZiAoZnJvbSA8PSBwb3MgJiYgdG8gPj0gcG9zKVxuICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUoc2VsLnJhbmdlcy5zbGljZSgwLCBpKS5jb25jYXQoc2VsLnJhbmdlcy5zbGljZShpICsgMSkpLCBzZWwubWFpbkluZGV4ID09IGkgPyAwIDogc2VsLm1haW5JbmRleCAtIChzZWwubWFpbkluZGV4ID4gaSA/IDEgOiAwKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuaGFuZGxlcnMuZHJhZ3N0YXJ0ID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgbGV0IHsgc2VsZWN0aW9uOiB7IG1haW46IHJhbmdlIH0gfSA9IHZpZXcuc3RhdGU7XG4gICAgaWYgKGV2ZW50LnRhcmdldC5kcmFnZ2FibGUpIHtcbiAgICAgICAgbGV0IGNWaWV3ID0gdmlldy5kb2NWaWV3Lm5lYXJlc3QoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgaWYgKGNWaWV3ICYmIGNWaWV3LmlzV2lkZ2V0KSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGNWaWV3LnBvc0F0U3RhcnQsIHRvID0gZnJvbSArIGNWaWV3Lmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChmcm9tID49IHJhbmdlLnRvIHx8IHRvIDw9IHJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB7IGlucHV0U3RhdGUgfSA9IHZpZXc7XG4gICAgaWYgKGlucHV0U3RhdGUubW91c2VTZWxlY3Rpb24pXG4gICAgICAgIGlucHV0U3RhdGUubW91c2VTZWxlY3Rpb24uZHJhZ2dpbmcgPSB0cnVlO1xuICAgIGlucHV0U3RhdGUuZHJhZ2dlZENvbnRlbnQgPSByYW5nZTtcbiAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKFwiVGV4dFwiLCB0ZXh0RmlsdGVyKHZpZXcuc3RhdGUsIGNsaXBib2FyZE91dHB1dEZpbHRlciwgdmlldy5zdGF0ZS5zbGljZURvYyhyYW5nZS5mcm9tLCByYW5nZS50bykpKTtcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSBcImNvcHlNb3ZlXCI7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5oYW5kbGVycy5kcmFnZW5kID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZnVuY3Rpb24gZHJvcFRleHQodmlldywgZXZlbnQsIHRleHQsIGRpcmVjdCkge1xuICAgIHRleHQgPSB0ZXh0RmlsdGVyKHZpZXcuc3RhdGUsIGNsaXBib2FyZElucHV0RmlsdGVyLCB0ZXh0KTtcbiAgICBpZiAoIXRleHQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgZHJvcFBvcyA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH0sIGZhbHNlKTtcbiAgICBsZXQgeyBkcmFnZ2VkQ29udGVudCB9ID0gdmlldy5pbnB1dFN0YXRlO1xuICAgIGxldCBkZWwgPSBkaXJlY3QgJiYgZHJhZ2dlZENvbnRlbnQgJiYgZHJhZ01vdmVzU2VsZWN0aW9uKHZpZXcsIGV2ZW50KVxuICAgICAgICA/IHsgZnJvbTogZHJhZ2dlZENvbnRlbnQuZnJvbSwgdG86IGRyYWdnZWRDb250ZW50LnRvIH0gOiBudWxsO1xuICAgIGxldCBpbnMgPSB7IGZyb206IGRyb3BQb3MsIGluc2VydDogdGV4dCB9O1xuICAgIGxldCBjaGFuZ2VzID0gdmlldy5zdGF0ZS5jaGFuZ2VzKGRlbCA/IFtkZWwsIGluc10gOiBpbnMpO1xuICAgIHZpZXcuZm9jdXMoKTtcbiAgICB2aWV3LmRpc3BhdGNoKHtcbiAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgc2VsZWN0aW9uOiB7IGFuY2hvcjogY2hhbmdlcy5tYXBQb3MoZHJvcFBvcywgLTEpLCBoZWFkOiBjaGFuZ2VzLm1hcFBvcyhkcm9wUG9zLCAxKSB9LFxuICAgICAgICB1c2VyRXZlbnQ6IGRlbCA/IFwibW92ZS5kcm9wXCIgOiBcImlucHV0LmRyb3BcIlxuICAgIH0pO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IG51bGw7XG59XG5oYW5kbGVycy5kcm9wID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodmlldy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IGZpbGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzO1xuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGgpIHsgLy8gRm9yIGEgZmlsZSBkcm9wLCByZWFkIHRoZSBmaWxlJ3MgdGV4dC5cbiAgICAgICAgbGV0IHRleHQgPSBBcnJheShmaWxlcy5sZW5ndGgpLCByZWFkID0gMDtcbiAgICAgICAgbGV0IGZpbmlzaEZpbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoKytyZWFkID09IGZpbGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBkcm9wVGV4dCh2aWV3LCBldmVudCwgdGV4dC5maWx0ZXIocyA9PiBzICE9IG51bGwpLmpvaW4odmlldy5zdGF0ZS5saW5lQnJlYWspLCBmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcjtcbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZmluaXNoRmlsZTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEvW1xceDAwLVxceDA4XFx4MGUtXFx4MWZdezJ9Ly50ZXN0KHJlYWRlci5yZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0W2ldID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBmaW5pc2hGaWxlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHRleHQgPSBldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcIlRleHRcIik7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICBkcm9wVGV4dCh2aWV3LCBldmVudCwgdGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuaGFuZGxlcnMucGFzdGUgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBpZiAodmlldy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgdmlldy5vYnNlcnZlci5mbHVzaCgpO1xuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZG9QYXN0ZSh2aWV3LCBkYXRhLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpIHx8IGRhdGEuZ2V0RGF0YShcInRleHQvdXJpLWxpc3RcIikpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNhcHR1cmVQYXN0ZSh2aWV3KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjYXB0dXJlQ29weSh2aWV3LCB0ZXh0KSB7XG4gICAgLy8gVGhlIGV4dHJhIHdyYXBwZXIgaXMgc29tZWhvdyBuZWNlc3Nhcnkgb24gSUUvRWRnZSB0byBwcmV2ZW50IHRoZVxuICAgIC8vIGNvbnRlbnQgZnJvbSBiZWluZyBtYW5nbGVkIHdoZW4gaXQgaXMgcHV0IG9udG8gdGhlIGNsaXBib2FyZFxuICAgIGxldCBwYXJlbnQgPSB2aWV3LmRvbS5wYXJlbnROb2RlO1xuICAgIGlmICghcGFyZW50KVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHRhcmdldCA9IHBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIikpO1xuICAgIHRhcmdldC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwMHB4OyB0b3A6IDEwcHhcIjtcbiAgICB0YXJnZXQudmFsdWUgPSB0ZXh0O1xuICAgIHRhcmdldC5mb2N1cygpO1xuICAgIHRhcmdldC5zZWxlY3Rpb25FbmQgPSB0ZXh0Lmxlbmd0aDtcbiAgICB0YXJnZXQuc2VsZWN0aW9uU3RhcnQgPSAwO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0YXJnZXQucmVtb3ZlKCk7XG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICB9LCA1MCk7XG59XG5mdW5jdGlvbiBjb3BpZWRSYW5nZShzdGF0ZSkge1xuICAgIGxldCBjb250ZW50ID0gW10sIHJhbmdlcyA9IFtdLCBsaW5ld2lzZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IHJhbmdlIG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpXG4gICAgICAgIGlmICghcmFuZ2UuZW1wdHkpIHtcbiAgICAgICAgICAgIGNvbnRlbnQucHVzaChzdGF0ZS5zbGljZURvYyhyYW5nZS5mcm9tLCByYW5nZS50bykpO1xuICAgICAgICAgICAgcmFuZ2VzLnB1c2gocmFuZ2UpO1xuICAgICAgICB9XG4gICAgaWYgKCFjb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAvLyBOb3RoaW5nIHNlbGVjdGVkLCBkbyBhIGxpbmUtd2lzZSBjb3B5XG4gICAgICAgIGxldCB1cHRvID0gLTE7XG4gICAgICAgIGZvciAobGV0IHsgZnJvbSB9IG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChmcm9tKTtcbiAgICAgICAgICAgIGlmIChsaW5lLm51bWJlciA+IHVwdG8pIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LnB1c2gobGluZS50ZXh0KTtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaCh7IGZyb206IGxpbmUuZnJvbSwgdG86IE1hdGgubWluKHN0YXRlLmRvYy5sZW5ndGgsIGxpbmUudG8gKyAxKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwdG8gPSBsaW5lLm51bWJlcjtcbiAgICAgICAgfVxuICAgICAgICBsaW5ld2lzZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB7IHRleHQ6IHRleHRGaWx0ZXIoc3RhdGUsIGNsaXBib2FyZE91dHB1dEZpbHRlciwgY29udGVudC5qb2luKHN0YXRlLmxpbmVCcmVhaykpLCByYW5nZXMsIGxpbmV3aXNlIH07XG59XG5sZXQgbGFzdExpbmV3aXNlQ29weSA9IG51bGw7XG5oYW5kbGVycy5jb3B5ID0gaGFuZGxlcnMuY3V0ID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgbGV0IHsgdGV4dCwgcmFuZ2VzLCBsaW5ld2lzZSB9ID0gY29waWVkUmFuZ2Uodmlldy5zdGF0ZSk7XG4gICAgaWYgKCF0ZXh0ICYmICFsaW5ld2lzZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxhc3RMaW5ld2lzZUNvcHkgPSBsaW5ld2lzZSA/IHRleHQgOiBudWxsO1xuICAgIGlmIChldmVudC50eXBlID09IFwiY3V0XCIgJiYgIXZpZXcuc3RhdGUucmVhZE9ubHkpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goe1xuICAgICAgICAgICAgY2hhbmdlczogcmFuZ2VzLFxuICAgICAgICAgICAgc2Nyb2xsSW50b1ZpZXc6IHRydWUsXG4gICAgICAgICAgICB1c2VyRXZlbnQ6IFwiZGVsZXRlLmN1dFwiXG4gICAgICAgIH0pO1xuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZGF0YS5jbGVhckRhdGEoKTtcbiAgICAgICAgZGF0YS5zZXREYXRhKFwidGV4dC9wbGFpblwiLCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjYXB0dXJlQ29weSh2aWV3LCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5jb25zdCBpc0ZvY3VzQ2hhbmdlID0gLypAX19QVVJFX18qL0Fubm90YXRpb24uZGVmaW5lKCk7XG5mdW5jdGlvbiBmb2N1c0NoYW5nZVRyYW5zYWN0aW9uKHN0YXRlLCBmb2N1cykge1xuICAgIGxldCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgZ2V0RWZmZWN0IG9mIHN0YXRlLmZhY2V0KGZvY3VzQ2hhbmdlRWZmZWN0KSkge1xuICAgICAgICBsZXQgZWZmZWN0ID0gZ2V0RWZmZWN0KHN0YXRlLCBmb2N1cyk7XG4gICAgICAgIGlmIChlZmZlY3QpXG4gICAgICAgICAgICBlZmZlY3RzLnB1c2goZWZmZWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIGVmZmVjdHMubGVuZ3RoID8gc3RhdGUudXBkYXRlKHsgZWZmZWN0cywgYW5ub3RhdGlvbnM6IGlzRm9jdXNDaGFuZ2Uub2YodHJ1ZSkgfSkgOiBudWxsO1xufVxuZnVuY3Rpb24gdXBkYXRlRm9yRm9jdXNDaGFuZ2Uodmlldykge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsZXQgZm9jdXMgPSB2aWV3Lmhhc0ZvY3VzO1xuICAgICAgICBpZiAoZm9jdXMgIT0gdmlldy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCkge1xuICAgICAgICAgICAgbGV0IHRyID0gZm9jdXNDaGFuZ2VUcmFuc2FjdGlvbih2aWV3LnN0YXRlLCBmb2N1cyk7XG4gICAgICAgICAgICBpZiAodHIpXG4gICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdmlldy51cGRhdGUoW10pO1xuICAgICAgICB9XG4gICAgfSwgMTApO1xufVxub2JzZXJ2ZXJzLmZvY3VzID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmxhc3RGb2N1c1RpbWUgPSBEYXRlLm5vdygpO1xuICAgIC8vIFdoZW4gZm9jdXNpbmcgcmVzZXQgdGhlIHNjcm9sbCBwb3NpdGlvbiwgbW92ZSBpdCBiYWNrIHRvIHdoZXJlIGl0IHdhc1xuICAgIGlmICghdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wICYmICh2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbFRvcCB8fCB2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbExlZnQpKSB7XG4gICAgICAgIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCA9IHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsVG9wO1xuICAgICAgICB2aWV3LnNjcm9sbERPTS5zY3JvbGxMZWZ0ID0gdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxMZWZ0O1xuICAgIH1cbiAgICB1cGRhdGVGb3JGb2N1c0NoYW5nZSh2aWV3KTtcbn07XG5vYnNlcnZlcnMuYmx1ciA9IHZpZXcgPT4ge1xuICAgIHZpZXcub2JzZXJ2ZXIuY2xlYXJTZWxlY3Rpb25SYW5nZSgpO1xuICAgIHVwZGF0ZUZvckZvY3VzQ2hhbmdlKHZpZXcpO1xufTtcbm9ic2VydmVycy5jb21wb3NpdGlvbnN0YXJ0ID0gb2JzZXJ2ZXJzLmNvbXBvc2l0aW9udXBkYXRlID0gdmlldyA9PiB7XG4gICAgaWYgKHZpZXcub2JzZXJ2ZXIuZWRpdENvbnRleHQpXG4gICAgICAgIHJldHVybjsgLy8gQ29tcG9zaXRpb24gaGFuZGxlZCBieSBlZGl0IGNvbnRleHRcbiAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPT0gbnVsbClcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSB0cnVlO1xuICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nIDwgMCkge1xuICAgICAgICAvLyBGSVhNRSBwb3NzaWJseSBzZXQgYSB0aW1lb3V0IHRvIGNsZWFyIGl0IGFnYWluIG9uIEFuZHJvaWRcbiAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA9IDA7XG4gICAgfVxufTtcbm9ic2VydmVycy5jb21wb3NpdGlvbmVuZCA9IHZpZXcgPT4ge1xuICAgIGlmICh2aWV3Lm9ic2VydmVyLmVkaXRDb250ZXh0KVxuICAgICAgICByZXR1cm47IC8vIENvbXBvc2l0aW9uIGhhbmRsZWQgYnkgZWRpdCBjb250ZXh0XG4gICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA9IC0xO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkVuZGVkQXQgPSBEYXRlLm5vdygpO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdLZXkgPSB0cnVlO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UgPSB2aWV3Lm9ic2VydmVyLnBlbmRpbmdSZWNvcmRzKCkubGVuZ3RoID4gMDtcbiAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IG51bGw7XG4gICAgaWYgKGJyb3dzZXIuY2hyb21lICYmIGJyb3dzZXIuYW5kcm9pZCkge1xuICAgICAgICAvLyBEZWxheSBmbHVzaGluZyBmb3IgYSBiaXQgb24gQW5kcm9pZCBiZWNhdXNlIGl0J2xsIG9mdGVuIGZpcmUgYVxuICAgICAgICAvLyBidW5jaCBvZiBjb250cmFkaWN0b3J5IGNoYW5nZXMgaW4gYSByb3cgYXQgZW5kIG9mIGNvbXBvc2l0b25cbiAgICAgICAgdmlldy5vYnNlcnZlci5mbHVzaFNvb24oKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSkge1xuICAgICAgICAvLyBJZiB3ZSBmb3VuZCBwZW5kaW5nIHJlY29yZHMsIHNjaGVkdWxlIGEgZmx1c2guXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdmlldy5vYnNlcnZlci5mbHVzaCgpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgbWFrZSBzdXJlIHRoYXQsIGlmIG5vIGNoYW5nZXMgY29tZSBpbiBzb29uLCB0aGVcbiAgICAgICAgLy8gY29tcG9zaXRpb24gdmlldyBpcyBjbGVhcmVkLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nIDwgMCAmJiB2aWV3LmRvY1ZpZXcuaGFzQ29tcG9zaXRpb24pXG4gICAgICAgICAgICAgICAgdmlldy51cGRhdGUoW10pO1xuICAgICAgICB9LCA1MCk7XG4gICAgfVxufTtcbm9ic2VydmVycy5jb250ZXh0bWVudSA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0Q29udGV4dE1lbnUgPSBEYXRlLm5vdygpO1xufTtcbmhhbmRsZXJzLmJlZm9yZWlucHV0ID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICAvLyBJbiBFZGl0Q29udGV4dCBtb2RlLCB3ZSBtdXN0IGhhbmRsZSBpbnNlcnRSZXBsYWNlbWVudFRleHQgZXZlbnRzXG4gICAgLy8gZGlyZWN0bHksIHRvIG1ha2Ugc3BlbGwgY2hlY2tpbmcgY29ycmVjdGlvbnMgd29ya1xuICAgIGlmIChldmVudC5pbnB1dFR5cGUgPT0gXCJpbnNlcnRSZXBsYWNlbWVudFRleHRcIiAmJiB2aWV3Lm9ic2VydmVyLmVkaXRDb250ZXh0KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gKF9hID0gZXZlbnQuZGF0YVRyYW5zZmVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0RGF0YShcInRleHQvcGxhaW5cIiksIHJhbmdlcyA9IGV2ZW50LmdldFRhcmdldFJhbmdlcygpO1xuICAgICAgICBpZiAodGV4dCAmJiByYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgciA9IHJhbmdlc1swXTtcbiAgICAgICAgICAgIGxldCBmcm9tID0gdmlldy5wb3NBdERPTShyLnN0YXJ0Q29udGFpbmVyLCByLnN0YXJ0T2Zmc2V0KSwgdG8gPSB2aWV3LnBvc0F0RE9NKHIuZW5kQ29udGFpbmVyLCByLmVuZE9mZnNldCk7XG4gICAgICAgICAgICBhcHBseURPTUNoYW5nZUlubmVyKHZpZXcsIHsgZnJvbSwgdG8sIGluc2VydDogdmlldy5zdGF0ZS50b1RleHQodGV4dCkgfSwgbnVsbCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCZWNhdXNlIENocm9tZSBBbmRyb2lkIGRvZXNuJ3QgZmlyZSB1c2VmdWwga2V5IGV2ZW50cywgdXNlXG4gICAgLy8gYmVmb3JlaW5wdXQgdG8gZGV0ZWN0IGJhY2tzcGFjZSAoYW5kIHBvc3NpYmx5IGVudGVyIGFuZCBkZWxldGUsXG4gICAgLy8gYnV0IHRob3NlIHVzdWFsbHkgZG9uJ3QgZXZlbiBzZWVtIHRvIGZpcmUgYmVmb3JlaW5wdXQgZXZlbnRzIGF0XG4gICAgLy8gdGhlIG1vbWVudCkgYW5kIGZha2UgYSBrZXkgZXZlbnQgZm9yIGl0LlxuICAgIC8vXG4gICAgLy8gKHByZXZlbnREZWZhdWx0IG9uIGJlZm9yZWlucHV0LCB0aG91Z2ggc3VwcG9ydGVkIGluIHRoZSBzcGVjLFxuICAgIC8vIHNlZW1zIHRvIGRvIG5vdGhpbmcgYXQgYWxsIG9uIENocm9tZSkuXG4gICAgbGV0IHBlbmRpbmc7XG4gICAgaWYgKGJyb3dzZXIuY2hyb21lICYmIGJyb3dzZXIuYW5kcm9pZCAmJiAocGVuZGluZyA9IFBlbmRpbmdLZXlzLmZpbmQoa2V5ID0+IGtleS5pbnB1dFR5cGUgPT0gZXZlbnQuaW5wdXRUeXBlKSkpIHtcbiAgICAgICAgdmlldy5vYnNlcnZlci5kZWxheUFuZHJvaWRLZXkocGVuZGluZy5rZXksIHBlbmRpbmcua2V5Q29kZSk7XG4gICAgICAgIGlmIChwZW5kaW5nLmtleSA9PSBcIkJhY2tzcGFjZVwiIHx8IHBlbmRpbmcua2V5ID09IFwiRGVsZXRlXCIpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFZpZXdIZWlnaHQgPSAoKF9iID0gd2luZG93LnZpc3VhbFZpZXdwb3J0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaGVpZ2h0KSB8fCAwO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIC8vIEJhY2tzcGFjaW5nIG5lYXIgdW5lZGl0YWJsZSBub2RlcyBvbiBDaHJvbWUgQW5kcm9pZCBzb21ldGltZXNcbiAgICAgICAgICAgICAgICAvLyBjbG9zZXMgdGhlIHZpcnR1YWwga2V5Ym9hcmQuIFRoaXMgdHJpZXMgdG8gY3J1ZGVseSBkZXRlY3RcbiAgICAgICAgICAgICAgICAvLyB0aGF0IGFuZCByZWZvY3VzIHRvIGdldCBpdCBiYWNrLlxuICAgICAgICAgICAgICAgIGlmICgoKChfYSA9IHdpbmRvdy52aXN1YWxWaWV3cG9ydCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhlaWdodCkgfHwgMCkgPiBzdGFydFZpZXdIZWlnaHQgKyAxMCAmJiB2aWV3Lmhhc0ZvY3VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuY29udGVudERPTS5ibHVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChicm93c2VyLmlvcyAmJiBldmVudC5pbnB1dFR5cGUgPT0gXCJkZWxldGVDb250ZW50Rm9yd2FyZFwiKSB7XG4gICAgICAgIC8vIEZvciBzb21lIHJlYXNvbiwgRE9NIGNoYW5nZXMgKGFuZCBiZWZvcmVpbnB1dCkgaGFwcGVuIF9iZWZvcmVfXG4gICAgICAgIC8vIHRoZSBrZXkgZXZlbnQgZm9yIGN0cmwtZCBvbiBpT1Mgd2hlbiB1c2luZyBhbiBleHRlcm5hbFxuICAgICAgICAvLyBrZXlib2FyZC5cbiAgICAgICAgdmlldy5vYnNlcnZlci5mbHVzaFNvb24oKTtcbiAgICB9XG4gICAgLy8gU2FmYXJpIHdpbGwgb2NjYXNpb25hbGx5IGZvcmdldCB0byBmaXJlIGNvbXBvc2l0aW9uZW5kIGF0IHRoZSBlbmQgb2YgYSBkZWFkLWtleSBjb21wb3NpdGlvblxuICAgIGlmIChicm93c2VyLnNhZmFyaSAmJiBldmVudC5pbnB1dFR5cGUgPT0gXCJpbnNlcnRUZXh0XCIgJiYgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gb2JzZXJ2ZXJzLmNvbXBvc2l0aW9uZW5kKHZpZXcsIGV2ZW50KSwgMjApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuY29uc3QgYXBwbGllZEZpcmVmb3hIYWNrID0gLypAX19QVVJFX18qL25ldyBTZXQ7XG4vLyBJbiBGaXJlZm94LCB3aGVuIGN1dC9jb3B5IGhhbmRsZXJzIGFyZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQsIHRoYXRcbi8vIHNvbWVob3cgYXZvaWRzIGEgYnVnIHdoZXJlIHRob3NlIGV2ZW50cyBhcmVuJ3QgZmlyZWQgd2hlbiB0aGVcbi8vIHNlbGVjdGlvbiBpcyBlbXB0eS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2Rldi9pc3N1ZXMvMTA4MlxuLy8gYW5kIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTk5NTk2MVxuZnVuY3Rpb24gZmlyZWZveENvcHlDdXRIYWNrKGRvYykge1xuICAgIGlmICghYXBwbGllZEZpcmVmb3hIYWNrLmhhcyhkb2MpKSB7XG4gICAgICAgIGFwcGxpZWRGaXJlZm94SGFjay5hZGQoZG9jKTtcbiAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoXCJjb3B5XCIsICgpID0+IHsgfSk7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwiY3V0XCIsICgpID0+IHsgfSk7XG4gICAgfVxufVxuXG5jb25zdCB3cmFwcGluZ1doaXRlU3BhY2UgPSBbXCJwcmUtd3JhcFwiLCBcIm5vcm1hbFwiLCBcInByZS1saW5lXCIsIFwiYnJlYWstc3BhY2VzXCJdO1xuLy8gVXNlZCB0byB0cmFjaywgZHVyaW5nIHVwZGF0ZUhlaWdodCwgaWYgYW55IGFjdHVhbCBoZWlnaHRzIGNoYW5nZWRcbmxldCBoZWlnaHRDaGFuZ2VGbGFnID0gZmFsc2U7XG5mdW5jdGlvbiBjbGVhckhlaWdodENoYW5nZUZsYWcoKSB7IGhlaWdodENoYW5nZUZsYWcgPSBmYWxzZTsgfVxuY2xhc3MgSGVpZ2h0T3JhY2xlIHtcbiAgICBjb25zdHJ1Y3RvcihsaW5lV3JhcHBpbmcpIHtcbiAgICAgICAgdGhpcy5saW5lV3JhcHBpbmcgPSBsaW5lV3JhcHBpbmc7XG4gICAgICAgIHRoaXMuZG9jID0gVGV4dC5lbXB0eTtcbiAgICAgICAgdGhpcy5oZWlnaHRTYW1wbGVzID0ge307XG4gICAgICAgIHRoaXMubGluZUhlaWdodCA9IDE0OyAvLyBUaGUgaGVpZ2h0IG9mIGFuIGVudGlyZSBsaW5lIChsaW5lLWhlaWdodClcbiAgICAgICAgdGhpcy5jaGFyV2lkdGggPSA3O1xuICAgICAgICB0aGlzLnRleHRIZWlnaHQgPSAxNDsgLy8gVGhlIGhlaWdodCBvZiB0aGUgYWN0dWFsIGZvbnQgKGZvbnQtc2l6ZSlcbiAgICAgICAgdGhpcy5saW5lTGVuZ3RoID0gMzA7XG4gICAgfVxuICAgIGhlaWdodEZvckdhcChmcm9tLCB0bykge1xuICAgICAgICBsZXQgbGluZXMgPSB0aGlzLmRvYy5saW5lQXQodG8pLm51bWJlciAtIHRoaXMuZG9jLmxpbmVBdChmcm9tKS5udW1iZXIgKyAxO1xuICAgICAgICBpZiAodGhpcy5saW5lV3JhcHBpbmcpXG4gICAgICAgICAgICBsaW5lcyArPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKCh0byAtIGZyb20pIC0gKGxpbmVzICogdGhpcy5saW5lTGVuZ3RoICogMC41KSkgLyB0aGlzLmxpbmVMZW5ndGgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZUhlaWdodCAqIGxpbmVzO1xuICAgIH1cbiAgICBoZWlnaHRGb3JMaW5lKGxlbmd0aCkge1xuICAgICAgICBpZiAoIXRoaXMubGluZVdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGluZUhlaWdodDtcbiAgICAgICAgbGV0IGxpbmVzID0gMSArIE1hdGgubWF4KDAsIE1hdGguY2VpbCgobGVuZ3RoIC0gdGhpcy5saW5lTGVuZ3RoKSAvICh0aGlzLmxpbmVMZW5ndGggLSA1KSkpO1xuICAgICAgICByZXR1cm4gbGluZXMgKiB0aGlzLmxpbmVIZWlnaHQ7XG4gICAgfVxuICAgIHNldERvYyhkb2MpIHsgdGhpcy5kb2MgPSBkb2M7IHJldHVybiB0aGlzOyB9XG4gICAgbXVzdFJlZnJlc2hGb3JXcmFwcGluZyh3aGl0ZVNwYWNlKSB7XG4gICAgICAgIHJldHVybiAod3JhcHBpbmdXaGl0ZVNwYWNlLmluZGV4T2Yod2hpdGVTcGFjZSkgPiAtMSkgIT0gdGhpcy5saW5lV3JhcHBpbmc7XG4gICAgfVxuICAgIG11c3RSZWZyZXNoRm9ySGVpZ2h0cyhsaW5lSGVpZ2h0cykge1xuICAgICAgICBsZXQgbmV3SGVpZ2h0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZUhlaWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBoID0gbGluZUhlaWdodHNbaV07XG4gICAgICAgICAgICBpZiAoaCA8IDApIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5oZWlnaHRTYW1wbGVzW01hdGguZmxvb3IoaCAqIDEwKV0pIHsgLy8gUm91bmQgdG8gLjEgcGl4ZWxzXG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodFNhbXBsZXNbTWF0aC5mbG9vcihoICogMTApXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0hlaWdodDtcbiAgICB9XG4gICAgcmVmcmVzaCh3aGl0ZVNwYWNlLCBsaW5lSGVpZ2h0LCBjaGFyV2lkdGgsIHRleHRIZWlnaHQsIGxpbmVMZW5ndGgsIGtub3duSGVpZ2h0cykge1xuICAgICAgICBsZXQgbGluZVdyYXBwaW5nID0gd3JhcHBpbmdXaGl0ZVNwYWNlLmluZGV4T2Yod2hpdGVTcGFjZSkgPiAtMTtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSBNYXRoLnJvdW5kKGxpbmVIZWlnaHQpICE9IE1hdGgucm91bmQodGhpcy5saW5lSGVpZ2h0KSB8fCB0aGlzLmxpbmVXcmFwcGluZyAhPSBsaW5lV3JhcHBpbmc7XG4gICAgICAgIHRoaXMubGluZVdyYXBwaW5nID0gbGluZVdyYXBwaW5nO1xuICAgICAgICB0aGlzLmxpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0O1xuICAgICAgICB0aGlzLmNoYXJXaWR0aCA9IGNoYXJXaWR0aDtcbiAgICAgICAgdGhpcy50ZXh0SGVpZ2h0ID0gdGV4dEhlaWdodDtcbiAgICAgICAgdGhpcy5saW5lTGVuZ3RoID0gbGluZUxlbmd0aDtcbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrbm93bkhlaWdodHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgaCA9IGtub3duSGVpZ2h0c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaCA8IDApXG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlc1tNYXRoLmZsb29yKGggKiAxMCldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG59XG4vLyBUaGlzIG9iamVjdCBpcyB1c2VkIGJ5IGB1cGRhdGVIZWlnaHRgIHRvIG1ha2UgRE9NIG1lYXN1cmVtZW50c1xuLy8gYXJyaXZlIGF0IHRoZSByaWdodCBuaWRlcy4gVGhlIGBoZWlnaHRzYCBhcnJheSBpcyBhIHNlcXVlbmNlIG9mXG4vLyBibG9jayBoZWlnaHRzLCBzdGFydGluZyBmcm9tIHBvc2l0aW9uIGBmcm9tYC5cbmNsYXNzIE1lYXN1cmVkSGVpZ2h0cyB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgaGVpZ2h0cykge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmhlaWdodHMgPSBoZWlnaHRzO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB9XG4gICAgZ2V0IG1vcmUoKSB7IHJldHVybiB0aGlzLmluZGV4IDwgdGhpcy5oZWlnaHRzLmxlbmd0aDsgfVxufVxuLyoqXG5SZWNvcmQgdXNlZCB0byByZXByZXNlbnQgaW5mb3JtYXRpb24gYWJvdXQgYSBibG9jay1sZXZlbCBlbGVtZW50XG5pbiB0aGUgZWRpdG9yIHZpZXcuXG4qL1xuY2xhc3MgQmxvY2tJbmZvIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBlbGVtZW50LlxuICAgICovXG4gICAgbGVuZ3RoLCBcbiAgICAvKipcbiAgICBUaGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IChyZWxhdGl2ZSB0byB0aGUgdG9wIG9mIHRoZVxuICAgIGRvY3VtZW50KS5cbiAgICAqL1xuICAgIHRvcCwgXG4gICAgLyoqXG4gICAgSXRzIGhlaWdodC5cbiAgICAqL1xuICAgIGhlaWdodCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsIFdlaXJkIHBhY2tlZCBmaWVsZCB0aGF0IGhvbGRzIGFuIGFycmF5IG9mIGNoaWxkcmVuXG4gICAgZm9yIGNvbXBvc2l0ZSBibG9ja3MsIGEgZGVjb3JhdGlvbiBmb3IgYmxvY2sgd2lkZ2V0cywgYW5kIGFcbiAgICBudW1iZXIgaW5kaWNhdGluZyB0aGUgYW1vdW50IG9mIHdpZGdldC1jcmVhdGUgbGluZSBicmVha3MgZm9yXG4gICAgdGV4dCBibG9ja3MuXG4gICAgKi9cbiAgICBfY29udGVudCkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gX2NvbnRlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSB0eXBlIG9mIGVsZW1lbnQgdGhpcyBpcy4gV2hlbiBxdWVyeWluZyBsaW5lcywgdGhpcyBtYXkgYmVcbiAgICBhbiBhcnJheSBvZiBhbGwgdGhlIGJsb2NrcyB0aGF0IG1ha2UgdXAgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9jb250ZW50ID09IFwibnVtYmVyXCIgPyBCbG9ja1R5cGUuVGV4dCA6XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHRoaXMuX2NvbnRlbnQpID8gdGhpcy5fY29udGVudCA6IHRoaXMuX2NvbnRlbnQudHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiB0aGUgZWxlbWVudCBhcyBhIGRvY3VtZW50IHBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IHRvKCkgeyByZXR1cm4gdGhpcy5mcm9tICsgdGhpcy5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBUaGUgYm90dG9tIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50LlxuICAgICovXG4gICAgZ2V0IGJvdHRvbSgpIHsgcmV0dXJuIHRoaXMudG9wICsgdGhpcy5oZWlnaHQ7IH1cbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIGEgd2lkZ2V0IGJsb2NrLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSB3aWRnZXRcbiAgICBhc3NvY2lhdGVkIHdpdGggaXQuXG4gICAgKi9cbiAgICBnZXQgd2lkZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudCBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbiA/IHRoaXMuX2NvbnRlbnQud2lkZ2V0IDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgSWYgdGhpcyBpcyBhIHRleHRibG9jaywgdGhpcyBob2xkcyB0aGUgbnVtYmVyIG9mIGxpbmUgYnJlYWtzXG4gICAgdGhhdCBhcHBlYXIgaW4gd2lkZ2V0cyBpbnNpZGUgdGhlIGJsb2NrLlxuICAgICovXG4gICAgZ2V0IHdpZGdldExpbmVCcmVha3MoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5fY29udGVudCA9PSBcIm51bWJlclwiID8gdGhpcy5fY29udGVudCA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgam9pbihvdGhlcikge1xuICAgICAgICBsZXQgY29udGVudCA9IChBcnJheS5pc0FycmF5KHRoaXMuX2NvbnRlbnQpID8gdGhpcy5fY29udGVudCA6IFt0aGlzXSlcbiAgICAgICAgICAgIC5jb25jYXQoQXJyYXkuaXNBcnJheShvdGhlci5fY29udGVudCkgPyBvdGhlci5fY29udGVudCA6IFtvdGhlcl0pO1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyh0aGlzLmZyb20sIHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoLCB0aGlzLnRvcCwgdGhpcy5oZWlnaHQgKyBvdGhlci5oZWlnaHQsIGNvbnRlbnQpO1xuICAgIH1cbn1cbnZhciBRdWVyeVR5cGUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChRdWVyeVR5cGUpIHtcbiAgICBRdWVyeVR5cGVbUXVlcnlUeXBlW1wiQnlQb3NcIl0gPSAwXSA9IFwiQnlQb3NcIjtcbiAgICBRdWVyeVR5cGVbUXVlcnlUeXBlW1wiQnlIZWlnaHRcIl0gPSAxXSA9IFwiQnlIZWlnaHRcIjtcbiAgICBRdWVyeVR5cGVbUXVlcnlUeXBlW1wiQnlQb3NOb0hlaWdodFwiXSA9IDJdID0gXCJCeVBvc05vSGVpZ2h0XCI7XG5yZXR1cm4gUXVlcnlUeXBlfSkoUXVlcnlUeXBlIHx8IChRdWVyeVR5cGUgPSB7fSkpO1xuY29uc3QgRXBzaWxvbiA9IDFlLTM7XG5jbGFzcyBIZWlnaHRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCwgLy8gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvdmVyZWRcbiAgICBoZWlnaHQsIC8vIEhlaWdodCBvZiB0aGlzIHBhcnQgb2YgdGhlIGRvY3VtZW50XG4gICAgZmxhZ3MgPSAyIC8qIEZsYWcuT3V0ZGF0ZWQgKi8pIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgfVxuICAgIGdldCBvdXRkYXRlZCgpIHsgcmV0dXJuICh0aGlzLmZsYWdzICYgMiAvKiBGbGFnLk91dGRhdGVkICovKSA+IDA7IH1cbiAgICBzZXQgb3V0ZGF0ZWQodmFsdWUpIHsgdGhpcy5mbGFncyA9ICh2YWx1ZSA/IDIgLyogRmxhZy5PdXRkYXRlZCAqLyA6IDApIHwgKHRoaXMuZmxhZ3MgJiB+MiAvKiBGbGFnLk91dGRhdGVkICovKTsgfVxuICAgIHNldEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0ICE9IGhlaWdodCkge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHRoaXMuaGVpZ2h0IC0gaGVpZ2h0KSA+IEVwc2lsb24pXG4gICAgICAgICAgICAgICAgaGVpZ2h0Q2hhbmdlRmxhZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCYXNlIGNhc2UgaXMgdG8gcmVwbGFjZSBhIGxlYWYgbm9kZSwgd2hpY2ggc2ltcGx5IGJ1aWxkcyBhIHRyZWVcbiAgICAvLyBmcm9tIHRoZSBuZXcgbm9kZXMgYW5kIHJldHVybnMgdGhhdCAoSGVpZ2h0TWFwQnJhbmNoIGFuZFxuICAgIC8vIEhlaWdodE1hcEdhcCBvdmVycmlkZSB0aGlzIHRvIGFjdHVhbGx5IHVzZSBmcm9tL3RvKVxuICAgIHJlcGxhY2UoX2Zyb20sIF90bywgbm9kZXMpIHtcbiAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZihub2Rlcyk7XG4gICAgfVxuICAgIC8vIEFnYWluLCB0aGVzZSBhcmUgYmFzZSBjYXNlcywgYW5kIGFyZSBvdmVycmlkZGVuIGZvciBicmFuY2ggYW5kIGdhcCBub2Rlcy5cbiAgICBkZWNvbXBvc2VMZWZ0KF90bywgcmVzdWx0KSB7IHJlc3VsdC5wdXNoKHRoaXMpOyB9XG4gICAgZGVjb21wb3NlUmlnaHQoX2Zyb20sIHJlc3VsdCkgeyByZXN1bHQucHVzaCh0aGlzKTsgfVxuICAgIGFwcGx5Q2hhbmdlcyhkZWNvcmF0aW9ucywgb2xkRG9jLCBvcmFjbGUsIGNoYW5nZXMpIHtcbiAgICAgICAgbGV0IG1lID0gdGhpcywgZG9jID0gb3JhY2xlLmRvYztcbiAgICAgICAgZm9yIChsZXQgaSA9IGNoYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB7IGZyb21BLCB0b0EsIGZyb21CLCB0b0IgfSA9IGNoYW5nZXNbaV07XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBtZS5saW5lQXQoZnJvbUEsIFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0LCBvcmFjbGUuc2V0RG9jKG9sZERvYyksIDAsIDApO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHN0YXJ0LnRvID49IHRvQSA/IHN0YXJ0IDogbWUubGluZUF0KHRvQSwgUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQsIG9yYWNsZSwgMCwgMCk7XG4gICAgICAgICAgICB0b0IgKz0gZW5kLnRvIC0gdG9BO1xuICAgICAgICAgICAgdG9BID0gZW5kLnRvO1xuICAgICAgICAgICAgd2hpbGUgKGkgPiAwICYmIHN0YXJ0LmZyb20gPD0gY2hhbmdlc1tpIC0gMV0udG9BKSB7XG4gICAgICAgICAgICAgICAgZnJvbUEgPSBjaGFuZ2VzW2kgLSAxXS5mcm9tQTtcbiAgICAgICAgICAgICAgICBmcm9tQiA9IGNoYW5nZXNbaSAtIDFdLmZyb21CO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUEgPCBzdGFydC5mcm9tKVxuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG1lLmxpbmVBdChmcm9tQSwgUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQsIG9yYWNsZSwgMCwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcm9tQiArPSBzdGFydC5mcm9tIC0gZnJvbUE7XG4gICAgICAgICAgICBmcm9tQSA9IHN0YXJ0LmZyb207XG4gICAgICAgICAgICBsZXQgbm9kZXMgPSBOb2RlQnVpbGRlci5idWlsZChvcmFjbGUuc2V0RG9jKGRvYyksIGRlY29yYXRpb25zLCBmcm9tQiwgdG9CKTtcbiAgICAgICAgICAgIG1lID0gcmVwbGFjZShtZSwgbWUucmVwbGFjZShmcm9tQSwgdG9BLCBub2RlcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZS51cGRhdGVIZWlnaHQob3JhY2xlLCAwKTtcbiAgICB9XG4gICAgc3RhdGljIGVtcHR5KCkgeyByZXR1cm4gbmV3IEhlaWdodE1hcFRleHQoMCwgMCk7IH1cbiAgICAvLyBub2RlcyB1c2VzIG51bGwgdmFsdWVzIHRvIGluZGljYXRlIHRoZSBwb3NpdGlvbiBvZiBsaW5lIGJyZWFrcy5cbiAgICAvLyBUaGVyZSBhcmUgbmV2ZXIgbGluZSBicmVha3MgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgYXJyYXksIG9yXG4gICAgLy8gdHdvIGxpbmUgYnJlYWtzIG5leHQgdG8gZWFjaCBvdGhlciwgYW5kIHRoZSBhcnJheSBpc24ndCBhbGxvd2VkXG4gICAgLy8gdG8gYmUgZW1wdHkgKHNhbWUgcmVzdHJpY3Rpb25zIGFzIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBidWlsZGVyKS5cbiAgICBzdGF0aWMgb2Yobm9kZXMpIHtcbiAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PSAxKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVzWzBdO1xuICAgICAgICBsZXQgaSA9IDAsIGogPSBub2Rlcy5sZW5ndGgsIGJlZm9yZSA9IDAsIGFmdGVyID0gMDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKGkgPT0gaikge1xuICAgICAgICAgICAgICAgIGlmIChiZWZvcmUgPiBhZnRlciAqIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwbGl0ID0gbm9kZXNbaSAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3BsaXQuYnJlYWspXG4gICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5zcGxpY2UoLS1pLCAxLCBzcGxpdC5sZWZ0LCBudWxsLCBzcGxpdC5yaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZSgtLWksIDEsIHNwbGl0LmxlZnQsIHNwbGl0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgaiArPSAxICsgc3BsaXQuYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZSAtPSBzcGxpdC5zaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhZnRlciA+IGJlZm9yZSAqIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwbGl0ID0gbm9kZXNbal07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdC5icmVhaylcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZShqLCAxLCBzcGxpdC5sZWZ0LCBudWxsLCBzcGxpdC5yaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnNwbGljZShqLCAxLCBzcGxpdC5sZWZ0LCBzcGxpdC5yaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGogKz0gMiArIHNwbGl0LmJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBhZnRlciAtPSBzcGxpdC5zaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmVmb3JlIDwgYWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGVzW2krK107XG4gICAgICAgICAgICAgICAgaWYgKG5leHQpXG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZSArPSBuZXh0LnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGVzWy0tal07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQpXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyICs9IG5leHQuc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgYnJrID0gMDtcbiAgICAgICAgaWYgKG5vZGVzW2kgLSAxXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBicmsgPSAxO1xuICAgICAgICAgICAgaS0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGVzW2ldID09IG51bGwpIHtcbiAgICAgICAgICAgIGJyayA9IDE7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBIZWlnaHRNYXBCcmFuY2goSGVpZ2h0TWFwLm9mKG5vZGVzLnNsaWNlKDAsIGkpKSwgYnJrLCBIZWlnaHRNYXAub2Yobm9kZXMuc2xpY2UoaikpKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZXBsYWNlKG9sZCwgdmFsKSB7XG4gICAgaWYgKG9sZCA9PSB2YWwpXG4gICAgICAgIHJldHVybiBvbGQ7XG4gICAgaWYgKG9sZC5jb25zdHJ1Y3RvciAhPSB2YWwuY29uc3RydWN0b3IpXG4gICAgICAgIGhlaWdodENoYW5nZUZsYWcgPSB0cnVlO1xuICAgIHJldHVybiB2YWw7XG59XG5IZWlnaHRNYXAucHJvdG90eXBlLnNpemUgPSAxO1xuY2xhc3MgSGVpZ2h0TWFwQmxvY2sgZXh0ZW5kcyBIZWlnaHRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCwgaGVpZ2h0LCBkZWNvKSB7XG4gICAgICAgIHN1cGVyKGxlbmd0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5kZWNvID0gZGVjbztcbiAgICB9XG4gICAgYmxvY2tBdChfaGVpZ2h0LCBfb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhvZmZzZXQsIHRoaXMubGVuZ3RoLCB0b3AsIHRoaXMuaGVpZ2h0LCB0aGlzLmRlY28gfHwgMCk7XG4gICAgfVxuICAgIGxpbmVBdChfdmFsdWUsIF90eXBlLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsb2NrQXQoMCwgb3JhY2xlLCB0b3AsIG9mZnNldCk7XG4gICAgfVxuICAgIGZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHRvcCwgb2Zmc2V0LCBmKSB7XG4gICAgICAgIGlmIChmcm9tIDw9IG9mZnNldCArIHRoaXMubGVuZ3RoICYmIHRvID49IG9mZnNldClcbiAgICAgICAgICAgIGYodGhpcy5ibG9ja0F0KDAsIG9yYWNsZSwgdG9wLCBvZmZzZXQpKTtcbiAgICB9XG4gICAgdXBkYXRlSGVpZ2h0KG9yYWNsZSwgb2Zmc2V0ID0gMCwgX2ZvcmNlID0gZmFsc2UsIG1lYXN1cmVkKSB7XG4gICAgICAgIGlmIChtZWFzdXJlZCAmJiBtZWFzdXJlZC5mcm9tIDw9IG9mZnNldCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQobWVhc3VyZWQuaGVpZ2h0c1ttZWFzdXJlZC5pbmRleCsrXSk7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYGJsb2NrKCR7dGhpcy5sZW5ndGh9KWA7IH1cbn1cbmNsYXNzIEhlaWdodE1hcFRleHQgZXh0ZW5kcyBIZWlnaHRNYXBCbG9jayB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCBoZWlnaHQpIHtcbiAgICAgICAgc3VwZXIobGVuZ3RoLCBoZWlnaHQsIG51bGwpO1xuICAgICAgICB0aGlzLmNvbGxhcHNlZCA9IDA7IC8vIEFtb3VudCBvZiBjb2xsYXBzZWQgY29udGVudCBpbiB0aGUgbGluZVxuICAgICAgICB0aGlzLndpZGdldEhlaWdodCA9IDA7IC8vIE1heGltdW0gaW5saW5lIHdpZGdldCBoZWlnaHRcbiAgICAgICAgdGhpcy5icmVha3MgPSAwOyAvLyBOdW1iZXIgb2Ygd2lkZ2V0LWludHJvZHVjZWQgbGluZSBicmVha3Mgb24gdGhlIGxpbmVcbiAgICB9XG4gICAgYmxvY2tBdChfaGVpZ2h0LCBfb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhvZmZzZXQsIHRoaXMubGVuZ3RoLCB0b3AsIHRoaXMuaGVpZ2h0LCB0aGlzLmJyZWFrcyk7XG4gICAgfVxuICAgIHJlcGxhY2UoX2Zyb20sIF90bywgbm9kZXMpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBub2Rlc1swXTtcbiAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PSAxICYmIChub2RlIGluc3RhbmNlb2YgSGVpZ2h0TWFwVGV4dCB8fCBub2RlIGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwICYmIChub2RlLmZsYWdzICYgNCAvKiBGbGFnLlNpbmdsZUxpbmUgKi8pKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnModGhpcy5sZW5ndGggLSBub2RlLmxlbmd0aCkgPCAxMCkge1xuICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBIZWlnaHRNYXBUZXh0KG5vZGUubGVuZ3RoLCB0aGlzLmhlaWdodCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbm9kZS5oZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgICAgIGlmICghdGhpcy5vdXRkYXRlZClcbiAgICAgICAgICAgICAgICBub2RlLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBIZWlnaHRNYXAub2Yobm9kZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCA9IDAsIGZvcmNlID0gZmFsc2UsIG1lYXN1cmVkKSB7XG4gICAgICAgIGlmIChtZWFzdXJlZCAmJiBtZWFzdXJlZC5mcm9tIDw9IG9mZnNldCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQobWVhc3VyZWQuaGVpZ2h0c1ttZWFzdXJlZC5pbmRleCsrXSk7XG4gICAgICAgIGVsc2UgaWYgKGZvcmNlIHx8IHRoaXMub3V0ZGF0ZWQpXG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodChNYXRoLm1heCh0aGlzLndpZGdldEhlaWdodCwgb3JhY2xlLmhlaWdodEZvckxpbmUodGhpcy5sZW5ndGggLSB0aGlzLmNvbGxhcHNlZCkpICtcbiAgICAgICAgICAgICAgICB0aGlzLmJyZWFrcyAqIG9yYWNsZS5saW5lSGVpZ2h0KTtcbiAgICAgICAgdGhpcy5vdXRkYXRlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgbGluZSgke3RoaXMubGVuZ3RofSR7dGhpcy5jb2xsYXBzZWQgPyAtdGhpcy5jb2xsYXBzZWQgOiBcIlwifSR7dGhpcy53aWRnZXRIZWlnaHQgPyBcIjpcIiArIHRoaXMud2lkZ2V0SGVpZ2h0IDogXCJcIn0pYDtcbiAgICB9XG59XG5jbGFzcyBIZWlnaHRNYXBHYXAgZXh0ZW5kcyBIZWlnaHRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCkgeyBzdXBlcihsZW5ndGgsIDApOyB9XG4gICAgaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCkge1xuICAgICAgICBsZXQgZmlyc3RMaW5lID0gb3JhY2xlLmRvYy5saW5lQXQob2Zmc2V0KS5udW1iZXIsIGxhc3RMaW5lID0gb3JhY2xlLmRvYy5saW5lQXQob2Zmc2V0ICsgdGhpcy5sZW5ndGgpLm51bWJlcjtcbiAgICAgICAgbGV0IGxpbmVzID0gbGFzdExpbmUgLSBmaXJzdExpbmUgKyAxO1xuICAgICAgICBsZXQgcGVyTGluZSwgcGVyQ2hhciA9IDA7XG4gICAgICAgIGlmIChvcmFjbGUubGluZVdyYXBwaW5nKSB7XG4gICAgICAgICAgICBsZXQgdG90YWxQZXJMaW5lID0gTWF0aC5taW4odGhpcy5oZWlnaHQsIG9yYWNsZS5saW5lSGVpZ2h0ICogbGluZXMpO1xuICAgICAgICAgICAgcGVyTGluZSA9IHRvdGFsUGVyTGluZSAvIGxpbmVzO1xuICAgICAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gbGluZXMgKyAxKVxuICAgICAgICAgICAgICAgIHBlckNoYXIgPSAodGhpcy5oZWlnaHQgLSB0b3RhbFBlckxpbmUpIC8gKHRoaXMubGVuZ3RoIC0gbGluZXMgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBlckxpbmUgPSB0aGlzLmhlaWdodCAvIGxpbmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZpcnN0TGluZSwgbGFzdExpbmUsIHBlckxpbmUsIHBlckNoYXIgfTtcbiAgICB9XG4gICAgYmxvY2tBdChoZWlnaHQsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IHsgZmlyc3RMaW5lLCBsYXN0TGluZSwgcGVyTGluZSwgcGVyQ2hhciB9ID0gdGhpcy5oZWlnaHRNZXRyaWNzKG9yYWNsZSwgb2Zmc2V0KTtcbiAgICAgICAgaWYgKG9yYWNsZS5saW5lV3JhcHBpbmcpIHtcbiAgICAgICAgICAgIGxldCBndWVzcyA9IG9mZnNldCArIChoZWlnaHQgPCBvcmFjbGUubGluZUhlaWdodCA/IDBcbiAgICAgICAgICAgICAgICA6IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKGhlaWdodCAtIHRvcCkgLyB0aGlzLmhlaWdodCkpICogdGhpcy5sZW5ndGgpKTtcbiAgICAgICAgICAgIGxldCBsaW5lID0gb3JhY2xlLmRvYy5saW5lQXQoZ3Vlc3MpLCBsaW5lSGVpZ2h0ID0gcGVyTGluZSArIGxpbmUubGVuZ3RoICogcGVyQ2hhcjtcbiAgICAgICAgICAgIGxldCBsaW5lVG9wID0gTWF0aC5tYXgodG9wLCBoZWlnaHQgLSBsaW5lSGVpZ2h0IC8gMik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhsaW5lLmZyb20sIGxpbmUubGVuZ3RoLCBsaW5lVG9wLCBsaW5lSGVpZ2h0LCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obGFzdExpbmUgLSBmaXJzdExpbmUsIE1hdGguZmxvb3IoKGhlaWdodCAtIHRvcCkgLyBwZXJMaW5lKSkpO1xuICAgICAgICAgICAgbGV0IHsgZnJvbSwgbGVuZ3RoIH0gPSBvcmFjbGUuZG9jLmxpbmUoZmlyc3RMaW5lICsgbGluZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhmcm9tLCBsZW5ndGgsIHRvcCArIHBlckxpbmUgKiBsaW5lLCBwZXJMaW5lLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsaW5lQXQodmFsdWUsIHR5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKHR5cGUgPT0gUXVlcnlUeXBlLkJ5SGVpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tBdCh2YWx1ZSwgb3JhY2xlLCB0b3AsIG9mZnNldCk7XG4gICAgICAgIGlmICh0eXBlID09IFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0KSB7XG4gICAgICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gb3JhY2xlLmRvYy5saW5lQXQodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8oZnJvbSwgdG8gLSBmcm9tLCAwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBmaXJzdExpbmUsIHBlckxpbmUsIHBlckNoYXIgfSA9IHRoaXMuaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCk7XG4gICAgICAgIGxldCBsaW5lID0gb3JhY2xlLmRvYy5saW5lQXQodmFsdWUpLCBsaW5lSGVpZ2h0ID0gcGVyTGluZSArIGxpbmUubGVuZ3RoICogcGVyQ2hhcjtcbiAgICAgICAgbGV0IGxpbmVzQWJvdmUgPSBsaW5lLm51bWJlciAtIGZpcnN0TGluZTtcbiAgICAgICAgbGV0IGxpbmVUb3AgPSB0b3AgKyBwZXJMaW5lICogbGluZXNBYm92ZSArIHBlckNoYXIgKiAobGluZS5mcm9tIC0gb2Zmc2V0IC0gbGluZXNBYm92ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGxpbmUuZnJvbSwgbGluZS5sZW5ndGgsIE1hdGgubWF4KHRvcCwgTWF0aC5taW4obGluZVRvcCwgdG9wICsgdGhpcy5oZWlnaHQgLSBsaW5lSGVpZ2h0KSksIGxpbmVIZWlnaHQsIDApO1xuICAgIH1cbiAgICBmb3JFYWNoTGluZShmcm9tLCB0bywgb3JhY2xlLCB0b3AsIG9mZnNldCwgZikge1xuICAgICAgICBmcm9tID0gTWF0aC5tYXgoZnJvbSwgb2Zmc2V0KTtcbiAgICAgICAgdG8gPSBNYXRoLm1pbih0bywgb2Zmc2V0ICsgdGhpcy5sZW5ndGgpO1xuICAgICAgICBsZXQgeyBmaXJzdExpbmUsIHBlckxpbmUsIHBlckNoYXIgfSA9IHRoaXMuaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCk7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IGZyb20sIGxpbmVUb3AgPSB0b3A7IHBvcyA8PSB0bzspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gb3JhY2xlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgICAgIGlmIChwb3MgPT0gZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBsaW5lc0Fib3ZlID0gbGluZS5udW1iZXIgLSBmaXJzdExpbmU7XG4gICAgICAgICAgICAgICAgbGluZVRvcCArPSBwZXJMaW5lICogbGluZXNBYm92ZSArIHBlckNoYXIgKiAoZnJvbSAtIG9mZnNldCAtIGxpbmVzQWJvdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGxpbmVIZWlnaHQgPSBwZXJMaW5lICsgcGVyQ2hhciAqIGxpbmUubGVuZ3RoO1xuICAgICAgICAgICAgZihuZXcgQmxvY2tJbmZvKGxpbmUuZnJvbSwgbGluZS5sZW5ndGgsIGxpbmVUb3AsIGxpbmVIZWlnaHQsIDApKTtcbiAgICAgICAgICAgIGxpbmVUb3AgKz0gbGluZUhlaWdodDtcbiAgICAgICAgICAgIHBvcyA9IGxpbmUudG8gKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UoZnJvbSwgdG8sIG5vZGVzKSB7XG4gICAgICAgIGxldCBhZnRlciA9IHRoaXMubGVuZ3RoIC0gdG87XG4gICAgICAgIGlmIChhZnRlciA+IDApIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcClcbiAgICAgICAgICAgICAgICBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXSA9IG5ldyBIZWlnaHRNYXBHYXAobGFzdC5sZW5ndGggKyBhZnRlcik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChudWxsLCBuZXcgSGVpZ2h0TWFwR2FwKGFmdGVyIC0gMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmcm9tID4gMCkge1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gbm9kZXNbMF07XG4gICAgICAgICAgICBpZiAoZmlyc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgICAgICAgICAgbm9kZXNbMF0gPSBuZXcgSGVpZ2h0TWFwR2FwKGZyb20gKyBmaXJzdC5sZW5ndGgpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG5vZGVzLnVuc2hpZnQobmV3IEhlaWdodE1hcEdhcChmcm9tIC0gMSksIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBIZWlnaHRNYXAub2Yobm9kZXMpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VMZWZ0KHRvLCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IEhlaWdodE1hcEdhcCh0byAtIDEpLCBudWxsKTtcbiAgICB9XG4gICAgZGVjb21wb3NlUmlnaHQoZnJvbSwgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG51bGwsIG5ldyBIZWlnaHRNYXBHYXAodGhpcy5sZW5ndGggLSBmcm9tIC0gMSkpO1xuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBmb3JjZSA9IGZhbHNlLCBtZWFzdXJlZCkge1xuICAgICAgICBsZXQgZW5kID0gb2Zmc2V0ICsgdGhpcy5sZW5ndGg7XG4gICAgICAgIGlmIChtZWFzdXJlZCAmJiBtZWFzdXJlZC5mcm9tIDw9IG9mZnNldCArIHRoaXMubGVuZ3RoICYmIG1lYXN1cmVkLm1vcmUpIHtcbiAgICAgICAgICAgIC8vIEZpbGwgaW4gcGFydCBvZiB0aGlzIGdhcCB3aXRoIG1lYXN1cmVkIGxpbmVzLiBXZSBrbm93IHRoZXJlXG4gICAgICAgICAgICAvLyBjYW4ndCBiZSB3aWRnZXRzIG9yIGNvbGxhcHNlZCByYW5nZXMgaW4gdGhvc2UgbGluZXMsIGJlY2F1c2VcbiAgICAgICAgICAgIC8vIHRoZXkgd291bGQgYWxyZWFkeSBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGhlaWdodG1hcCAoZ2Fwc1xuICAgICAgICAgICAgLy8gb25seSBjb250YWluIHBsYWluIHRleHQpLlxuICAgICAgICAgICAgbGV0IG5vZGVzID0gW10sIHBvcyA9IE1hdGgubWF4KG9mZnNldCwgbWVhc3VyZWQuZnJvbSksIHNpbmdsZUhlaWdodCA9IC0xO1xuICAgICAgICAgICAgaWYgKG1lYXN1cmVkLmZyb20gPiBvZmZzZXQpXG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwR2FwKG1lYXN1cmVkLmZyb20gLSBvZmZzZXQgLSAxKS51cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIHdoaWxlIChwb3MgPD0gZW5kICYmIG1lYXN1cmVkLm1vcmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gb3JhY2xlLmRvYy5saW5lQXQocG9zKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gbWVhc3VyZWQuaGVpZ2h0c1ttZWFzdXJlZC5pbmRleCsrXTtcbiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlSGVpZ2h0ID09IC0xKVxuICAgICAgICAgICAgICAgICAgICBzaW5nbGVIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoaGVpZ2h0IC0gc2luZ2xlSGVpZ2h0KSA+PSBFcHNpbG9uKVxuICAgICAgICAgICAgICAgICAgICBzaW5nbGVIZWlnaHQgPSAtMjtcbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IG5ldyBIZWlnaHRNYXBUZXh0KGxlbiwgaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBsaW5lLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgPD0gZW5kKVxuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobnVsbCwgbmV3IEhlaWdodE1hcEdhcChlbmQgLSBwb3MpLnVwZGF0ZUhlaWdodChvcmFjbGUsIHBvcykpO1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IEhlaWdodE1hcC5vZihub2Rlcyk7XG4gICAgICAgICAgICBpZiAoc2luZ2xlSGVpZ2h0IDwgMCB8fCBNYXRoLmFicyhyZXN1bHQuaGVpZ2h0IC0gdGhpcy5oZWlnaHQpID49IEVwc2lsb24gfHxcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhzaW5nbGVIZWlnaHQgLSB0aGlzLmhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpLnBlckxpbmUpID49IEVwc2lsb24pXG4gICAgICAgICAgICAgICAgaGVpZ2h0Q2hhbmdlRmxhZyA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZSh0aGlzLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZvcmNlIHx8IHRoaXMub3V0ZGF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KG9yYWNsZS5oZWlnaHRGb3JHYXAob2Zmc2V0LCBvZmZzZXQgKyB0aGlzLmxlbmd0aCkpO1xuICAgICAgICAgICAgdGhpcy5vdXRkYXRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBnYXAoJHt0aGlzLmxlbmd0aH0pYDsgfVxufVxuY2xhc3MgSGVpZ2h0TWFwQnJhbmNoIGV4dGVuZHMgSGVpZ2h0TWFwIHtcbiAgICBjb25zdHJ1Y3RvcihsZWZ0LCBicmssIHJpZ2h0KSB7XG4gICAgICAgIHN1cGVyKGxlZnQubGVuZ3RoICsgYnJrICsgcmlnaHQubGVuZ3RoLCBsZWZ0LmhlaWdodCArIHJpZ2h0LmhlaWdodCwgYnJrIHwgKGxlZnQub3V0ZGF0ZWQgfHwgcmlnaHQub3V0ZGF0ZWQgPyAyIC8qIEZsYWcuT3V0ZGF0ZWQgKi8gOiAwKSk7XG4gICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcbiAgICAgICAgdGhpcy5zaXplID0gbGVmdC5zaXplICsgcmlnaHQuc2l6ZTtcbiAgICB9XG4gICAgZ2V0IGJyZWFrKCkgeyByZXR1cm4gdGhpcy5mbGFncyAmIDEgLyogRmxhZy5CcmVhayAqLzsgfVxuICAgIGJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBtaWQgPSB0b3AgKyB0aGlzLmxlZnQuaGVpZ2h0O1xuICAgICAgICByZXR1cm4gaGVpZ2h0IDwgbWlkID8gdGhpcy5sZWZ0LmJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIHRvcCwgb2Zmc2V0KVxuICAgICAgICAgICAgOiB0aGlzLnJpZ2h0LmJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIG1pZCwgb2Zmc2V0ICsgdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWspO1xuICAgIH1cbiAgICBsaW5lQXQodmFsdWUsIHR5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IHJpZ2h0VG9wID0gdG9wICsgdGhpcy5sZWZ0LmhlaWdodCwgcmlnaHRPZmZzZXQgPSBvZmZzZXQgKyB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhaztcbiAgICAgICAgbGV0IGxlZnQgPSB0eXBlID09IFF1ZXJ5VHlwZS5CeUhlaWdodCA/IHZhbHVlIDwgcmlnaHRUb3AgOiB2YWx1ZSA8IHJpZ2h0T2Zmc2V0O1xuICAgICAgICBsZXQgYmFzZSA9IGxlZnQgPyB0aGlzLmxlZnQubGluZUF0KHZhbHVlLCB0eXBlLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KVxuICAgICAgICAgICAgOiB0aGlzLnJpZ2h0LmxpbmVBdCh2YWx1ZSwgdHlwZSwgb3JhY2xlLCByaWdodFRvcCwgcmlnaHRPZmZzZXQpO1xuICAgICAgICBpZiAodGhpcy5icmVhayB8fCAobGVmdCA/IGJhc2UudG8gPCByaWdodE9mZnNldCA6IGJhc2UuZnJvbSA+IHJpZ2h0T2Zmc2V0KSlcbiAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICBsZXQgc3ViUXVlcnkgPSB0eXBlID09IFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0ID8gUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQgOiBRdWVyeVR5cGUuQnlQb3M7XG4gICAgICAgIGlmIChsZWZ0KVxuICAgICAgICAgICAgcmV0dXJuIGJhc2Uuam9pbih0aGlzLnJpZ2h0LmxpbmVBdChyaWdodE9mZnNldCwgc3ViUXVlcnksIG9yYWNsZSwgcmlnaHRUb3AsIHJpZ2h0T2Zmc2V0KSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQubGluZUF0KHJpZ2h0T2Zmc2V0LCBzdWJRdWVyeSwgb3JhY2xlLCB0b3AsIG9mZnNldCkuam9pbihiYXNlKTtcbiAgICB9XG4gICAgZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpIHtcbiAgICAgICAgbGV0IHJpZ2h0VG9wID0gdG9wICsgdGhpcy5sZWZ0LmhlaWdodCwgcmlnaHRPZmZzZXQgPSBvZmZzZXQgKyB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhaztcbiAgICAgICAgaWYgKHRoaXMuYnJlYWspIHtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgcmlnaHRPZmZzZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0LmZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHRvcCwgb2Zmc2V0LCBmKTtcbiAgICAgICAgICAgIGlmICh0byA+PSByaWdodE9mZnNldClcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHJpZ2h0VG9wLCByaWdodE9mZnNldCwgZik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gdGhpcy5saW5lQXQocmlnaHRPZmZzZXQsIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCB0b3AsIG9mZnNldCk7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IG1pZC5mcm9tKVxuICAgICAgICAgICAgICAgIHRoaXMubGVmdC5mb3JFYWNoTGluZShmcm9tLCBtaWQuZnJvbSAtIDEsIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpO1xuICAgICAgICAgICAgaWYgKG1pZC50byA+PSBmcm9tICYmIG1pZC5mcm9tIDw9IHRvKVxuICAgICAgICAgICAgICAgIGYobWlkKTtcbiAgICAgICAgICAgIGlmICh0byA+IG1pZC50bylcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hMaW5lKG1pZC50byArIDEsIHRvLCBvcmFjbGUsIHJpZ2h0VG9wLCByaWdodE9mZnNldCwgZik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShmcm9tLCB0bywgbm9kZXMpIHtcbiAgICAgICAgbGV0IHJpZ2h0U3RhcnQgPSB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhaztcbiAgICAgICAgaWYgKHRvIDwgcmlnaHRTdGFydClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhbGFuY2VkKHRoaXMubGVmdC5yZXBsYWNlKGZyb20sIHRvLCBub2RlcyksIHRoaXMucmlnaHQpO1xuICAgICAgICBpZiAoZnJvbSA+IHRoaXMubGVmdC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWxhbmNlZCh0aGlzLmxlZnQsIHRoaXMucmlnaHQucmVwbGFjZShmcm9tIC0gcmlnaHRTdGFydCwgdG8gLSByaWdodFN0YXJ0LCBub2RlcykpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGlmIChmcm9tID4gMClcbiAgICAgICAgICAgIHRoaXMuZGVjb21wb3NlTGVmdChmcm9tLCByZXN1bHQpO1xuICAgICAgICBsZXQgbGVmdCA9IHJlc3VsdC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IG5vZGUgb2Ygbm9kZXMpXG4gICAgICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgaWYgKGZyb20gPiAwKVxuICAgICAgICAgICAgbWVyZ2VHYXBzKHJlc3VsdCwgbGVmdCAtIDEpO1xuICAgICAgICBpZiAodG8gPCB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJpZ2h0ID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZGVjb21wb3NlUmlnaHQodG8sIHJlc3VsdCk7XG4gICAgICAgICAgICBtZXJnZUdhcHMocmVzdWx0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZihyZXN1bHQpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VMZWZ0KHRvLCByZXN1bHQpIHtcbiAgICAgICAgbGV0IGxlZnQgPSB0aGlzLmxlZnQubGVuZ3RoO1xuICAgICAgICBpZiAodG8gPD0gbGVmdClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQuZGVjb21wb3NlTGVmdCh0bywgcmVzdWx0KTtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5sZWZ0KTtcbiAgICAgICAgaWYgKHRoaXMuYnJlYWspIHtcbiAgICAgICAgICAgIGxlZnQrKztcbiAgICAgICAgICAgIGlmICh0byA+PSBsZWZ0KVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0byA+IGxlZnQpXG4gICAgICAgICAgICB0aGlzLnJpZ2h0LmRlY29tcG9zZUxlZnQodG8gLSBsZWZ0LCByZXN1bHQpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VSaWdodChmcm9tLCByZXN1bHQpIHtcbiAgICAgICAgbGV0IGxlZnQgPSB0aGlzLmxlZnQubGVuZ3RoLCByaWdodCA9IGxlZnQgKyB0aGlzLmJyZWFrO1xuICAgICAgICBpZiAoZnJvbSA+PSByaWdodClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LmRlY29tcG9zZVJpZ2h0KGZyb20gLSByaWdodCwgcmVzdWx0KTtcbiAgICAgICAgaWYgKGZyb20gPCBsZWZ0KVxuICAgICAgICAgICAgdGhpcy5sZWZ0LmRlY29tcG9zZVJpZ2h0KGZyb20sIHJlc3VsdCk7XG4gICAgICAgIGlmICh0aGlzLmJyZWFrICYmIGZyb20gPCByaWdodClcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnJpZ2h0KTtcbiAgICB9XG4gICAgYmFsYW5jZWQobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgaWYgKGxlZnQuc2l6ZSA+IDIgKiByaWdodC5zaXplIHx8IHJpZ2h0LnNpemUgPiAyICogbGVmdC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZih0aGlzLmJyZWFrID8gW2xlZnQsIG51bGwsIHJpZ2h0XSA6IFtsZWZ0LCByaWdodF0pO1xuICAgICAgICB0aGlzLmxlZnQgPSByZXBsYWNlKHRoaXMubGVmdCwgbGVmdCk7XG4gICAgICAgIHRoaXMucmlnaHQgPSByZXBsYWNlKHRoaXMucmlnaHQsIHJpZ2h0KTtcbiAgICAgICAgdGhpcy5zZXRIZWlnaHQobGVmdC5oZWlnaHQgKyByaWdodC5oZWlnaHQpO1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gbGVmdC5vdXRkYXRlZCB8fCByaWdodC5vdXRkYXRlZDtcbiAgICAgICAgdGhpcy5zaXplID0gbGVmdC5zaXplICsgcmlnaHQuc2l6ZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWsgKyByaWdodC5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBmb3JjZSA9IGZhbHNlLCBtZWFzdXJlZCkge1xuICAgICAgICBsZXQgeyBsZWZ0LCByaWdodCB9ID0gdGhpcywgcmlnaHRTdGFydCA9IG9mZnNldCArIGxlZnQubGVuZ3RoICsgdGhpcy5icmVhaywgcmViYWxhbmNlID0gbnVsbDtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gb2Zmc2V0ICsgbGVmdC5sZW5ndGggJiYgbWVhc3VyZWQubW9yZSlcbiAgICAgICAgICAgIHJlYmFsYW5jZSA9IGxlZnQgPSBsZWZ0LnVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCwgZm9yY2UsIG1lYXN1cmVkKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGVmdC51cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQsIGZvcmNlKTtcbiAgICAgICAgaWYgKG1lYXN1cmVkICYmIG1lYXN1cmVkLmZyb20gPD0gcmlnaHRTdGFydCArIHJpZ2h0Lmxlbmd0aCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgcmViYWxhbmNlID0gcmlnaHQgPSByaWdodC51cGRhdGVIZWlnaHQob3JhY2xlLCByaWdodFN0YXJ0LCBmb3JjZSwgbWVhc3VyZWQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByaWdodC51cGRhdGVIZWlnaHQob3JhY2xlLCByaWdodFN0YXJ0LCBmb3JjZSk7XG4gICAgICAgIGlmIChyZWJhbGFuY2UpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWxhbmNlZChsZWZ0LCByaWdodCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5sZWZ0LmhlaWdodCArIHRoaXMucmlnaHQuaGVpZ2h0O1xuICAgICAgICB0aGlzLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMubGVmdCArICh0aGlzLmJyZWFrID8gXCIgXCIgOiBcIi1cIikgKyB0aGlzLnJpZ2h0OyB9XG59XG5mdW5jdGlvbiBtZXJnZUdhcHMobm9kZXMsIGFyb3VuZCkge1xuICAgIGxldCBiZWZvcmUsIGFmdGVyO1xuICAgIGlmIChub2Rlc1thcm91bmRdID09IG51bGwgJiZcbiAgICAgICAgKGJlZm9yZSA9IG5vZGVzW2Fyb3VuZCAtIDFdKSBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcCAmJlxuICAgICAgICAoYWZ0ZXIgPSBub2Rlc1thcm91bmQgKyAxXSkgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgIG5vZGVzLnNwbGljZShhcm91bmQgLSAxLCAzLCBuZXcgSGVpZ2h0TWFwR2FwKGJlZm9yZS5sZW5ndGggKyAxICsgYWZ0ZXIubGVuZ3RoKSk7XG59XG5jb25zdCByZWxldmFudFdpZGdldEhlaWdodCA9IDU7XG5jbGFzcyBOb2RlQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IocG9zLCBvcmFjbGUpIHtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMub3JhY2xlID0gb3JhY2xlO1xuICAgICAgICB0aGlzLm5vZGVzID0gW107XG4gICAgICAgIHRoaXMubGluZVN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMubGluZUVuZCA9IC0xO1xuICAgICAgICB0aGlzLmNvdmVyaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy53cml0dGVuVG8gPSBwb3M7XG4gICAgfVxuICAgIGdldCBpc0NvdmVyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvdmVyaW5nICYmIHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXSA9PSB0aGlzLmNvdmVyaW5nO1xuICAgIH1cbiAgICBzcGFuKF9mcm9tLCB0bykge1xuICAgICAgICBpZiAodGhpcy5saW5lU3RhcnQgPiAtMSkge1xuICAgICAgICAgICAgbGV0IGVuZCA9IE1hdGgubWluKHRvLCB0aGlzLmxpbmVFbmQpLCBsYXN0ID0gdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0KVxuICAgICAgICAgICAgICAgIGxhc3QubGVuZ3RoICs9IGVuZCAtIHRoaXMucG9zO1xuICAgICAgICAgICAgZWxzZSBpZiAoZW5kID4gdGhpcy5wb3MgfHwgIXRoaXMuaXNDb3ZlcmVkKVxuICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwVGV4dChlbmQgLSB0aGlzLnBvcywgLTEpKTtcbiAgICAgICAgICAgIHRoaXMud3JpdHRlblRvID0gZW5kO1xuICAgICAgICAgICAgaWYgKHRvID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdHRlblRvKys7XG4gICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcyA9IHRvO1xuICAgIH1cbiAgICBwb2ludChmcm9tLCB0bywgZGVjbykge1xuICAgICAgICBpZiAoZnJvbSA8IHRvIHx8IGRlY28uaGVpZ2h0UmVsZXZhbnQpIHtcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBkZWNvLndpZGdldCA/IGRlY28ud2lkZ2V0LmVzdGltYXRlZEhlaWdodCA6IDA7XG4gICAgICAgICAgICBsZXQgYnJlYWtzID0gZGVjby53aWRnZXQgPyBkZWNvLndpZGdldC5saW5lQnJlYWtzIDogMDtcbiAgICAgICAgICAgIGlmIChoZWlnaHQgPCAwKVxuICAgICAgICAgICAgICAgIGhlaWdodCA9IHRoaXMub3JhY2xlLmxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBsZXQgbGVuID0gdG8gLSBmcm9tO1xuICAgICAgICAgICAgaWYgKGRlY28uYmxvY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEJsb2NrKG5ldyBIZWlnaHRNYXBCbG9jayhsZW4sIGhlaWdodCwgZGVjbykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGVuIHx8IGJyZWFrcyB8fCBoZWlnaHQgPj0gcmVsZXZhbnRXaWRnZXRIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZExpbmVEZWNvKGhlaWdodCwgYnJlYWtzLCBsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvID4gZnJvbSkge1xuICAgICAgICAgICAgdGhpcy5zcGFuKGZyb20sIHRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saW5lRW5kID4gLTEgJiYgdGhpcy5saW5lRW5kIDwgdGhpcy5wb3MpXG4gICAgICAgICAgICB0aGlzLmxpbmVFbmQgPSB0aGlzLm9yYWNsZS5kb2MubGluZUF0KHRoaXMucG9zKS50bztcbiAgICB9XG4gICAgZW50ZXJMaW5lKCkge1xuICAgICAgICBpZiAodGhpcy5saW5lU3RhcnQgPiAtMSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHRoaXMub3JhY2xlLmRvYy5saW5lQXQodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLmxpbmVTdGFydCA9IGZyb207XG4gICAgICAgIHRoaXMubGluZUVuZCA9IHRvO1xuICAgICAgICBpZiAodGhpcy53cml0dGVuVG8gPCBmcm9tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy53cml0dGVuVG8gPCBmcm9tIC0gMSB8fCB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoIC0gMV0gPT0gbnVsbClcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2godGhpcy5ibGFua0NvbnRlbnQodGhpcy53cml0dGVuVG8sIGZyb20gLSAxKSk7XG4gICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2gobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9zID4gZnJvbSlcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwVGV4dCh0aGlzLnBvcyAtIGZyb20sIC0xKSk7XG4gICAgICAgIHRoaXMud3JpdHRlblRvID0gdGhpcy5wb3M7XG4gICAgfVxuICAgIGJsYW5rQ29udGVudChmcm9tLCB0bykge1xuICAgICAgICBsZXQgZ2FwID0gbmV3IEhlaWdodE1hcEdhcCh0byAtIGZyb20pO1xuICAgICAgICBpZiAodGhpcy5vcmFjbGUuZG9jLmxpbmVBdChmcm9tKS50byA9PSB0bylcbiAgICAgICAgICAgIGdhcC5mbGFncyB8PSA0IC8qIEZsYWcuU2luZ2xlTGluZSAqLztcbiAgICAgICAgcmV0dXJuIGdhcDtcbiAgICB9XG4gICAgZW5zdXJlTGluZSgpIHtcbiAgICAgICAgdGhpcy5lbnRlckxpbmUoKTtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLm5vZGVzLmxlbmd0aCA/IHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXSA6IG51bGw7XG4gICAgICAgIGlmIChsYXN0IGluc3RhbmNlb2YgSGVpZ2h0TWFwVGV4dClcbiAgICAgICAgICAgIHJldHVybiBsYXN0O1xuICAgICAgICBsZXQgbGluZSA9IG5ldyBIZWlnaHRNYXBUZXh0KDAsIC0xKTtcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKGxpbmUpO1xuICAgICAgICByZXR1cm4gbGluZTtcbiAgICB9XG4gICAgYWRkQmxvY2soYmxvY2spIHtcbiAgICAgICAgdGhpcy5lbnRlckxpbmUoKTtcbiAgICAgICAgbGV0IGRlY28gPSBibG9jay5kZWNvO1xuICAgICAgICBpZiAoZGVjbyAmJiBkZWNvLnN0YXJ0U2lkZSA+IDAgJiYgIXRoaXMuaXNDb3ZlcmVkKVxuICAgICAgICAgICAgdGhpcy5lbnN1cmVMaW5lKCk7XG4gICAgICAgIHRoaXMubm9kZXMucHVzaChibG9jayk7XG4gICAgICAgIHRoaXMud3JpdHRlblRvID0gdGhpcy5wb3MgPSB0aGlzLnBvcyArIGJsb2NrLmxlbmd0aDtcbiAgICAgICAgaWYgKGRlY28gJiYgZGVjby5lbmRTaWRlID4gMClcbiAgICAgICAgICAgIHRoaXMuY292ZXJpbmcgPSBibG9jaztcbiAgICB9XG4gICAgYWRkTGluZURlY28oaGVpZ2h0LCBicmVha3MsIGxlbmd0aCkge1xuICAgICAgICBsZXQgbGluZSA9IHRoaXMuZW5zdXJlTGluZSgpO1xuICAgICAgICBsaW5lLmxlbmd0aCArPSBsZW5ndGg7XG4gICAgICAgIGxpbmUuY29sbGFwc2VkICs9IGxlbmd0aDtcbiAgICAgICAgbGluZS53aWRnZXRIZWlnaHQgPSBNYXRoLm1heChsaW5lLndpZGdldEhlaWdodCwgaGVpZ2h0KTtcbiAgICAgICAgbGluZS5icmVha3MgKz0gYnJlYWtzO1xuICAgICAgICB0aGlzLndyaXR0ZW5UbyA9IHRoaXMucG9zID0gdGhpcy5wb3MgKyBsZW5ndGg7XG4gICAgfVxuICAgIGZpbmlzaChmcm9tKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5ub2Rlcy5sZW5ndGggPT0gMCA/IG51bGwgOiB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICh0aGlzLmxpbmVTdGFydCA+IC0xICYmICEobGFzdCBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQpICYmICF0aGlzLmlzQ292ZXJlZClcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwVGV4dCgwLCAtMSkpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLndyaXR0ZW5UbyA8IHRoaXMucG9zIHx8IGxhc3QgPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaCh0aGlzLmJsYW5rQ29udGVudCh0aGlzLndyaXR0ZW5UbywgdGhpcy5wb3MpKTtcbiAgICAgICAgbGV0IHBvcyA9IGZyb207XG4gICAgICAgIGZvciAobGV0IG5vZGUgb2YgdGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0KVxuICAgICAgICAgICAgICAgIG5vZGUudXBkYXRlSGVpZ2h0KHRoaXMub3JhY2xlLCBwb3MpO1xuICAgICAgICAgICAgcG9zICs9IG5vZGUgPyBub2RlLmxlbmd0aCA6IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXM7XG4gICAgfVxuICAgIC8vIEFsd2F5cyBjYWxsZWQgd2l0aCBhIHJlZ2lvbiB0aGF0IG9uIGJvdGggc2lkZXMgZWl0aGVyIHN0cmV0Y2hlc1xuICAgIC8vIHRvIGEgbGluZSBicmVhayBvciB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICAvLyBUaGUgcmV0dXJuZWQgYXJyYXkgdXNlcyBudWxsIHRvIGluZGljYXRlIGxpbmUgYnJlYWtzLCBidXQgbmV2ZXJcbiAgICAvLyBzdGFydHMgb3IgZW5kcyBpbiBhIGxpbmUgYnJlYWssIG9yIGhhcyBtdWx0aXBsZSBsaW5lIGJyZWFrcyBuZXh0XG4gICAgLy8gdG8gZWFjaCBvdGhlci5cbiAgICBzdGF0aWMgYnVpbGQob3JhY2xlLCBkZWNvcmF0aW9ucywgZnJvbSwgdG8pIHtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgTm9kZUJ1aWxkZXIoZnJvbSwgb3JhY2xlKTtcbiAgICAgICAgUmFuZ2VTZXQuc3BhbnMoZGVjb3JhdGlvbnMsIGZyb20sIHRvLCBidWlsZGVyLCAwKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKGZyb20pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhlaWdodFJlbGV2YW50RGVjb0NoYW5nZXMoYSwgYiwgZGlmZikge1xuICAgIGxldCBjb21wID0gbmV3IERlY29yYXRpb25Db21wYXJhdG9yO1xuICAgIFJhbmdlU2V0LmNvbXBhcmUoYSwgYiwgZGlmZiwgY29tcCwgMCk7XG4gICAgcmV0dXJuIGNvbXAuY2hhbmdlcztcbn1cbmNsYXNzIERlY29yYXRpb25Db21wYXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0gW107XG4gICAgfVxuICAgIGNvbXBhcmVSYW5nZSgpIHsgfVxuICAgIGNvbXBhcmVQb2ludChmcm9tLCB0bywgYSwgYikge1xuICAgICAgICBpZiAoZnJvbSA8IHRvIHx8IGEgJiYgYS5oZWlnaHRSZWxldmFudCB8fCBiICYmIGIuaGVpZ2h0UmVsZXZhbnQpXG4gICAgICAgICAgICBhZGRSYW5nZShmcm9tLCB0bywgdGhpcy5jaGFuZ2VzLCA1KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZpc2libGVQaXhlbFJhbmdlKGRvbSwgcGFkZGluZ1RvcCkge1xuICAgIGxldCByZWN0ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBkb2MgPSBkb20ub3duZXJEb2N1bWVudCwgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICBsZXQgbGVmdCA9IE1hdGgubWF4KDAsIHJlY3QubGVmdCksIHJpZ2h0ID0gTWF0aC5taW4od2luLmlubmVyV2lkdGgsIHJlY3QucmlnaHQpO1xuICAgIGxldCB0b3AgPSBNYXRoLm1heCgwLCByZWN0LnRvcCksIGJvdHRvbSA9IE1hdGgubWluKHdpbi5pbm5lckhlaWdodCwgcmVjdC5ib3R0b20pO1xuICAgIGZvciAobGV0IHBhcmVudCA9IGRvbS5wYXJlbnROb2RlOyBwYXJlbnQgJiYgcGFyZW50ICE9IGRvYy5ib2R5Oykge1xuICAgICAgICBpZiAocGFyZW50Lm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIGxldCBlbHQgPSBwYXJlbnQ7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbHQpO1xuICAgICAgICAgICAgaWYgKChlbHQuc2Nyb2xsSGVpZ2h0ID4gZWx0LmNsaWVudEhlaWdodCB8fCBlbHQuc2Nyb2xsV2lkdGggPiBlbHQuY2xpZW50V2lkdGgpICYmXG4gICAgICAgICAgICAgICAgc3R5bGUub3ZlcmZsb3cgIT0gXCJ2aXNpYmxlXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50UmVjdCA9IGVsdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBsZWZ0ID0gTWF0aC5tYXgobGVmdCwgcGFyZW50UmVjdC5sZWZ0KTtcbiAgICAgICAgICAgICAgICByaWdodCA9IE1hdGgubWluKHJpZ2h0LCBwYXJlbnRSZWN0LnJpZ2h0KTtcbiAgICAgICAgICAgICAgICB0b3AgPSBNYXRoLm1heCh0b3AsIHBhcmVudFJlY3QudG9wKTtcbiAgICAgICAgICAgICAgICBib3R0b20gPSBNYXRoLm1pbihwYXJlbnQgPT0gZG9tLnBhcmVudE5vZGUgPyB3aW4uaW5uZXJIZWlnaHQgOiBib3R0b20sIHBhcmVudFJlY3QuYm90dG9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudCA9IHN0eWxlLnBvc2l0aW9uID09IFwiYWJzb2x1dGVcIiB8fCBzdHlsZS5wb3NpdGlvbiA9PSBcImZpeGVkXCIgPyBlbHQub2Zmc2V0UGFyZW50IDogZWx0LnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFyZW50Lm5vZGVUeXBlID09IDExKSB7IC8vIFNoYWRvdyByb290XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGxlZnQ6IGxlZnQgLSByZWN0LmxlZnQsIHJpZ2h0OiBNYXRoLm1heChsZWZ0LCByaWdodCkgLSByZWN0LmxlZnQsXG4gICAgICAgIHRvcDogdG9wIC0gKHJlY3QudG9wICsgcGFkZGluZ1RvcCksIGJvdHRvbTogTWF0aC5tYXgodG9wLCBib3R0b20pIC0gKHJlY3QudG9wICsgcGFkZGluZ1RvcCkgfTtcbn1cbmZ1bmN0aW9uIGluV2luZG93KGVsdCkge1xuICAgIGxldCByZWN0ID0gZWx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCB3aW4gPSBlbHQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgcmV0dXJuIHJlY3QubGVmdCA8IHdpbi5pbm5lcldpZHRoICYmIHJlY3QucmlnaHQgPiAwICYmXG4gICAgICAgIHJlY3QudG9wIDwgd2luLmlubmVySGVpZ2h0ICYmIHJlY3QuYm90dG9tID4gMDtcbn1cbmZ1bmN0aW9uIGZ1bGxQaXhlbFJhbmdlKGRvbSwgcGFkZGluZ1RvcCkge1xuICAgIGxldCByZWN0ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiB7IGxlZnQ6IDAsIHJpZ2h0OiByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LFxuICAgICAgICB0b3A6IHBhZGRpbmdUb3AsIGJvdHRvbTogcmVjdC5ib3R0b20gLSAocmVjdC50b3AgKyBwYWRkaW5nVG9wKSB9O1xufVxuLy8gTGluZSBnYXBzIGFyZSBwbGFjZWhvbGRlciB3aWRnZXRzIHVzZWQgdG8gaGlkZSBwaWVjZXMgb2Ygb3Zlcmxvbmdcbi8vIGxpbmVzIHdpdGhpbiB0aGUgdmlld3BvcnQsIGFzIGEga2x1ZGdlIHRvIGtlZXAgdGhlIGVkaXRvclxuLy8gcmVzcG9uc2l2ZSB3aGVuIGEgcmlkaWN1bG91c2x5IGxvbmcgbGluZSBpcyBsb2FkZWQgaW50byBpdC5cbmNsYXNzIExpbmVHYXAge1xuICAgIGNvbnN0cnVjdG9yKGZyb20sIHRvLCBzaXplLCBkaXNwbGF5U2l6ZSkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgICAgIHRoaXMuZGlzcGxheVNpemUgPSBkaXNwbGF5U2l6ZTtcbiAgICB9XG4gICAgc3RhdGljIHNhbWUoYSwgYikge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGdBID0gYVtpXSwgZ0IgPSBiW2ldO1xuICAgICAgICAgICAgaWYgKGdBLmZyb20gIT0gZ0IuZnJvbSB8fCBnQS50byAhPSBnQi50byB8fCBnQS5zaXplICE9IGdCLnNpemUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBkcmF3KHZpZXdTdGF0ZSwgd3JhcHBpbmcpIHtcbiAgICAgICAgcmV0dXJuIERlY29yYXRpb24ucmVwbGFjZSh7XG4gICAgICAgICAgICB3aWRnZXQ6IG5ldyBMaW5lR2FwV2lkZ2V0KHRoaXMuZGlzcGxheVNpemUgKiAod3JhcHBpbmcgPyB2aWV3U3RhdGUuc2NhbGVZIDogdmlld1N0YXRlLnNjYWxlWCksIHdyYXBwaW5nKVxuICAgICAgICB9KS5yYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xuICAgIH1cbn1cbmNsYXNzIExpbmVHYXBXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihzaXplLCB2ZXJ0aWNhbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLnZlcnRpY2FsID0gdmVydGljYWw7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci5zaXplID09IHRoaXMuc2l6ZSAmJiBvdGhlci52ZXJ0aWNhbCA9PSB0aGlzLnZlcnRpY2FsOyB9XG4gICAgdG9ET00oKSB7XG4gICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBpZiAodGhpcy52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgZWx0LnN0eWxlLmhlaWdodCA9IHRoaXMuc2l6ZSArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVsdC5zdHlsZS53aWR0aCA9IHRoaXMuc2l6ZSArIFwicHhcIjtcbiAgICAgICAgICAgIGVsdC5zdHlsZS5oZWlnaHQgPSBcIjJweFwiO1xuICAgICAgICAgICAgZWx0LnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbHQ7XG4gICAgfVxuICAgIGdldCBlc3RpbWF0ZWRIZWlnaHQoKSB7IHJldHVybiB0aGlzLnZlcnRpY2FsID8gdGhpcy5zaXplIDogLTE7IH1cbn1cbmNsYXNzIFZpZXdTdGF0ZSB7XG4gICAgY29uc3RydWN0b3Ioc3RhdGUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAvLyBUaGVzZSBhcmUgY29udGVudERPTS1sb2NhbCBjb29yZGluYXRlc1xuICAgICAgICB0aGlzLnBpeGVsVmlld3BvcnQgPSB7IGxlZnQ6IDAsIHJpZ2h0OiB3aW5kb3cuaW5uZXJXaWR0aCwgdG9wOiAwLCBib3R0b206IDAgfTtcbiAgICAgICAgdGhpcy5pblZpZXcgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhZGRpbmdUb3AgPSAwOyAvLyBQYWRkaW5nIGFib3ZlIHRoZSBkb2N1bWVudCwgc2NhbGVkXG4gICAgICAgIHRoaXMucGFkZGluZ0JvdHRvbSA9IDA7IC8vIFBhZGRpbmcgYmVsb3cgdGhlIGRvY3VtZW50LCBzY2FsZWRcbiAgICAgICAgdGhpcy5jb250ZW50RE9NV2lkdGggPSAwOyAvLyBjb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXG4gICAgICAgIHRoaXMuY29udGVudERPTUhlaWdodCA9IDA7IC8vIGNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgIHRoaXMuZWRpdG9ySGVpZ2h0ID0gMDsgLy8gc2Nyb2xsRE9NLmNsaWVudEhlaWdodCwgdW5zY2FsZWRcbiAgICAgICAgdGhpcy5lZGl0b3JXaWR0aCA9IDA7IC8vIHNjcm9sbERPTS5jbGllbnRXaWR0aCwgdW5zY2FsZWRcbiAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSAwOyAvLyBMYXN0IHNlZW4gc2Nyb2xsRE9NLnNjcm9sbFRvcCwgc2NhbGVkXG4gICAgICAgIHRoaXMuc2Nyb2xsZWRUb0JvdHRvbSA9IGZhbHNlO1xuICAgICAgICAvLyBUaGUgQ1NTLXRyYW5zZm9ybWF0aW9uIHNjYWxlIG9mIHRoZSBlZGl0b3IgKHRyYW5zZm9ybWVkIHNpemUgL1xuICAgICAgICAvLyBjb25jcmV0ZSBzaXplKVxuICAgICAgICB0aGlzLnNjYWxlWCA9IDE7XG4gICAgICAgIHRoaXMuc2NhbGVZID0gMTtcbiAgICAgICAgLy8gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIChkb2N1bWVudC1yZWxhdGl2ZSkgdG8gd2hpY2ggdG8gYW5jaG9yIHRoZVxuICAgICAgICAvLyBzY3JvbGwgcG9zaXRpb24uIC0xIG1lYW5zIGFuY2hvciB0byB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JQb3MgPSAwO1xuICAgICAgICAvLyBUaGUgaGVpZ2h0IGF0IHRoZSBhbmNob3IgcG9zaXRpb24uIFNldCBieSB0aGUgRE9NIHVwZGF0ZSBwaGFzZS5cbiAgICAgICAgLy8gLTEgbWVhbnMgbm8gaGVpZ2h0IGF2YWlsYWJsZS5cbiAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgLy8gU2VlIFZQLk1heERPTUhlaWdodFxuICAgICAgICB0aGlzLnNjYWxlciA9IElkU2NhbGVyO1xuICAgICAgICB0aGlzLnNjcm9sbFRhcmdldCA9IG51bGw7XG4gICAgICAgIC8vIEJyaWVmbHkgc2V0IHRvIHRydWUgd2hlbiBwcmludGluZywgdG8gZGlzYWJsZSB2aWV3cG9ydCBsaW1pdGluZ1xuICAgICAgICB0aGlzLnByaW50aW5nID0gZmFsc2U7XG4gICAgICAgIC8vIEZsYWcgc2V0IHdoZW4gZWRpdG9yIGNvbnRlbnQgd2FzIHJlZHJhd24sIHNvIHRoYXQgdGhlIG5leHRcbiAgICAgICAgLy8gbWVhc3VyZSBzdGFnZSBrbm93cyBpdCBtdXN0IHJlYWQgRE9NIGxheW91dFxuICAgICAgICB0aGlzLm11c3RNZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdFRleHREaXJlY3Rpb24gPSBEaXJlY3Rpb24uTFRSO1xuICAgICAgICB0aGlzLnZpc2libGVSYW5nZXMgPSBbXTtcbiAgICAgICAgLy8gQ3Vyc29yICdhc3NvYycgaXMgb25seSBzaWduaWZpY2FudCB3aGVuIHRoZSBjdXJzb3IgaXMgb24gYSBsaW5lXG4gICAgICAgIC8vIHdyYXAgcG9pbnQsIHdoZXJlIGl0IG11c3Qgc3RpY2sgdG8gdGhlIGNoYXJhY3RlciB0aGF0IGl0IGlzXG4gICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aC4gU2luY2UgYnJvd3NlcnMgZG9uJ3QgcHJvdmlkZSBhIHJlYXNvbmFibGVcbiAgICAgICAgLy8gaW50ZXJmYWNlIHRvIHNldCBvciBxdWVyeSB0aGlzLCB3aGVuIGEgc2VsZWN0aW9uIGlzIHNldCB0aGF0XG4gICAgICAgIC8vIG1pZ2h0IGNhdXNlIHRoaXMgdG8gYmUgc2lnbmlmaWNhbnQsIHRoaXMgZmxhZyBpcyBzZXQuIFRoZSBuZXh0XG4gICAgICAgIC8vIG1lYXN1cmUgcGhhc2Ugd2lsbCBjaGVjayB3aGV0aGVyIHRoZSBjdXJzb3IgaXMgb24gYSBsaW5lLXdyYXBwaW5nXG4gICAgICAgIC8vIGJvdW5kYXJ5IGFuZCwgaWYgc28sIHJlc2V0IGl0IHRvIG1ha2Ugc3VyZSBpdCBpcyBwb3NpdGlvbmVkIGluXG4gICAgICAgIC8vIHRoZSByaWdodCBwbGFjZS5cbiAgICAgICAgdGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jID0gZmFsc2U7XG4gICAgICAgIGxldCBndWVzc1dyYXBwaW5nID0gc3RhdGUuZmFjZXQoY29udGVudEF0dHJpYnV0ZXMpLnNvbWUodiA9PiB0eXBlb2YgdiAhPSBcImZ1bmN0aW9uXCIgJiYgdi5jbGFzcyA9PSBcImNtLWxpbmVXcmFwcGluZ1wiKTtcbiAgICAgICAgdGhpcy5oZWlnaHRPcmFjbGUgPSBuZXcgSGVpZ2h0T3JhY2xlKGd1ZXNzV3JhcHBpbmcpO1xuICAgICAgICB0aGlzLnN0YXRlRGVjbyA9IHN0YXRlLmZhY2V0KGRlY29yYXRpb25zKS5maWx0ZXIoZCA9PiB0eXBlb2YgZCAhPSBcImZ1bmN0aW9uXCIpO1xuICAgICAgICB0aGlzLmhlaWdodE1hcCA9IEhlaWdodE1hcC5lbXB0eSgpLmFwcGx5Q2hhbmdlcyh0aGlzLnN0YXRlRGVjbywgVGV4dC5lbXB0eSwgdGhpcy5oZWlnaHRPcmFjbGUuc2V0RG9jKHN0YXRlLmRvYyksIFtuZXcgQ2hhbmdlZFJhbmdlKDAsIDAsIDAsIHN0YXRlLmRvYy5sZW5ndGgpXSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0ID0gdGhpcy5nZXRWaWV3cG9ydCgwLCBudWxsKTtcbiAgICAgICAgICAgIGlmICghdGhpcy51cGRhdGVGb3JWaWV3cG9ydCgpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnRMaW5lcygpO1xuICAgICAgICB0aGlzLmxpbmVHYXBzID0gdGhpcy5lbnN1cmVMaW5lR2FwcyhbXSk7XG4gICAgICAgIHRoaXMubGluZUdhcERlY28gPSBEZWNvcmF0aW9uLnNldCh0aGlzLmxpbmVHYXBzLm1hcChnYXAgPT4gZ2FwLmRyYXcodGhpcywgZmFsc2UpKSk7XG4gICAgICAgIHRoaXMuY29tcHV0ZVZpc2libGVSYW5nZXMoKTtcbiAgICB9XG4gICAgdXBkYXRlRm9yVmlld3BvcnQoKSB7XG4gICAgICAgIGxldCB2aWV3cG9ydHMgPSBbdGhpcy52aWV3cG9ydF0sIHsgbWFpbiB9ID0gdGhpcy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDE7IGkrKykge1xuICAgICAgICAgICAgbGV0IHBvcyA9IGkgPyBtYWluLmhlYWQgOiBtYWluLmFuY2hvcjtcbiAgICAgICAgICAgIGlmICghdmlld3BvcnRzLnNvbWUoKHsgZnJvbSwgdG8gfSkgPT4gcG9zID49IGZyb20gJiYgcG9zIDw9IHRvKSkge1xuICAgICAgICAgICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSB0aGlzLmxpbmVCbG9ja0F0KHBvcyk7XG4gICAgICAgICAgICAgICAgdmlld3BvcnRzLnB1c2gobmV3IFZpZXdwb3J0KGZyb20sIHRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWV3cG9ydHMgPSB2aWV3cG9ydHMuc29ydCgoYSwgYikgPT4gYS5mcm9tIC0gYi5mcm9tKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU2NhbGVyKCk7XG4gICAgfVxuICAgIHVwZGF0ZVNjYWxlcigpIHtcbiAgICAgICAgbGV0IHNjYWxlciA9IHRoaXMuc2NhbGVyO1xuICAgICAgICB0aGlzLnNjYWxlciA9IHRoaXMuaGVpZ2h0TWFwLmhlaWdodCA8PSA3MDAwMDAwIC8qIFZQLk1heERPTUhlaWdodCAqLyA/IElkU2NhbGVyIDpcbiAgICAgICAgICAgIG5ldyBCaWdTY2FsZXIodGhpcy5oZWlnaHRPcmFjbGUsIHRoaXMuaGVpZ2h0TWFwLCB0aGlzLnZpZXdwb3J0cyk7XG4gICAgICAgIHJldHVybiBzY2FsZXIuZXEodGhpcy5zY2FsZXIpID8gMCA6IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi87XG4gICAgfVxuICAgIHVwZGF0ZVZpZXdwb3J0TGluZXMoKSB7XG4gICAgICAgIHRoaXMudmlld3BvcnRMaW5lcyA9IFtdO1xuICAgICAgICB0aGlzLmhlaWdodE1hcC5mb3JFYWNoTGluZSh0aGlzLnZpZXdwb3J0LmZyb20sIHRoaXMudmlld3BvcnQudG8sIHRoaXMuaGVpZ2h0T3JhY2xlLnNldERvYyh0aGlzLnN0YXRlLmRvYyksIDAsIDAsIGJsb2NrID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRMaW5lcy5wdXNoKHNjYWxlQmxvY2soYmxvY2ssIHRoaXMuc2NhbGVyKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlLCBzY3JvbGxUYXJnZXQgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB1cGRhdGUuc3RhdGU7XG4gICAgICAgIGxldCBwcmV2RGVjbyA9IHRoaXMuc3RhdGVEZWNvO1xuICAgICAgICB0aGlzLnN0YXRlRGVjbyA9IHRoaXMuc3RhdGUuZmFjZXQoZGVjb3JhdGlvbnMpLmZpbHRlcihkID0+IHR5cGVvZiBkICE9IFwiZnVuY3Rpb25cIik7XG4gICAgICAgIGxldCBjb250ZW50Q2hhbmdlcyA9IHVwZGF0ZS5jaGFuZ2VkUmFuZ2VzO1xuICAgICAgICBsZXQgaGVpZ2h0Q2hhbmdlcyA9IENoYW5nZWRSYW5nZS5leHRlbmRXaXRoUmFuZ2VzKGNvbnRlbnRDaGFuZ2VzLCBoZWlnaHRSZWxldmFudERlY29DaGFuZ2VzKHByZXZEZWNvLCB0aGlzLnN0YXRlRGVjbywgdXBkYXRlID8gdXBkYXRlLmNoYW5nZXMgOiBDaGFuZ2VTZXQuZW1wdHkodGhpcy5zdGF0ZS5kb2MubGVuZ3RoKSkpO1xuICAgICAgICBsZXQgcHJldkhlaWdodCA9IHRoaXMuaGVpZ2h0TWFwLmhlaWdodDtcbiAgICAgICAgbGV0IHNjcm9sbEFuY2hvciA9IHRoaXMuc2Nyb2xsZWRUb0JvdHRvbSA/IG51bGwgOiB0aGlzLnNjcm9sbEFuY2hvckF0KHRoaXMuc2Nyb2xsVG9wKTtcbiAgICAgICAgY2xlYXJIZWlnaHRDaGFuZ2VGbGFnKCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwID0gdGhpcy5oZWlnaHRNYXAuYXBwbHlDaGFuZ2VzKHRoaXMuc3RhdGVEZWNvLCB1cGRhdGUuc3RhcnRTdGF0ZS5kb2MsIHRoaXMuaGVpZ2h0T3JhY2xlLnNldERvYyh0aGlzLnN0YXRlLmRvYyksIGhlaWdodENoYW5nZXMpO1xuICAgICAgICBpZiAodGhpcy5oZWlnaHRNYXAuaGVpZ2h0ICE9IHByZXZIZWlnaHQgfHwgaGVpZ2h0Q2hhbmdlRmxhZylcbiAgICAgICAgICAgIHVwZGF0ZS5mbGFncyB8PSAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovO1xuICAgICAgICBpZiAoc2Nyb2xsQW5jaG9yKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvclBvcyA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyhzY3JvbGxBbmNob3IuZnJvbSwgLTEpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JIZWlnaHQgPSBzY3JvbGxBbmNob3IudG9wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JQb3MgPSAtMTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gcHJldkhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmlld3BvcnQgPSBoZWlnaHRDaGFuZ2VzLmxlbmd0aCA/IHRoaXMubWFwVmlld3BvcnQodGhpcy52aWV3cG9ydCwgdXBkYXRlLmNoYW5nZXMpIDogdGhpcy52aWV3cG9ydDtcbiAgICAgICAgaWYgKHNjcm9sbFRhcmdldCAmJiAoc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgPCB2aWV3cG9ydC5mcm9tIHx8IHNjcm9sbFRhcmdldC5yYW5nZS5oZWFkID4gdmlld3BvcnQudG8pIHx8XG4gICAgICAgICAgICAhdGhpcy52aWV3cG9ydElzQXBwcm9wcmlhdGUodmlld3BvcnQpKVxuICAgICAgICAgICAgdmlld3BvcnQgPSB0aGlzLmdldFZpZXdwb3J0KDAsIHNjcm9sbFRhcmdldCk7XG4gICAgICAgIGxldCB2aWV3cG9ydENoYW5nZSA9IHZpZXdwb3J0LmZyb20gIT0gdGhpcy52aWV3cG9ydC5mcm9tIHx8IHZpZXdwb3J0LnRvICE9IHRoaXMudmlld3BvcnQudG87XG4gICAgICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICAgICAgdXBkYXRlLmZsYWdzIHw9IHRoaXMudXBkYXRlRm9yVmlld3BvcnQoKTtcbiAgICAgICAgaWYgKHZpZXdwb3J0Q2hhbmdlIHx8ICF1cGRhdGUuY2hhbmdlcy5lbXB0eSB8fCAodXBkYXRlLmZsYWdzICYgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLykpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0TGluZXMoKTtcbiAgICAgICAgaWYgKHRoaXMubGluZUdhcHMubGVuZ3RoIHx8IHRoaXMudmlld3BvcnQudG8gLSB0aGlzLnZpZXdwb3J0LmZyb20gPiAoMjAwMCAvKiBMRy5NYXJnaW4gKi8gPDwgMSkpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxpbmVHYXBzKHRoaXMuZW5zdXJlTGluZUdhcHModGhpcy5tYXBMaW5lR2Fwcyh0aGlzLmxpbmVHYXBzLCB1cGRhdGUuY2hhbmdlcykpKTtcbiAgICAgICAgdXBkYXRlLmZsYWdzIHw9IHRoaXMuY29tcHV0ZVZpc2libGVSYW5nZXModXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0KVxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQgPSBzY3JvbGxUYXJnZXQ7XG4gICAgICAgIGlmICghdGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jICYmIHVwZGF0ZS5zZWxlY3Rpb25TZXQgJiYgdXBkYXRlLnZpZXcubGluZVdyYXBwaW5nICYmXG4gICAgICAgICAgICB1cGRhdGUuc3RhdGUuc2VsZWN0aW9uLm1haW4uZW1wdHkgJiYgdXBkYXRlLnN0YXRlLnNlbGVjdGlvbi5tYWluLmFzc29jICYmXG4gICAgICAgICAgICAhdXBkYXRlLnN0YXRlLmZhY2V0KG5hdGl2ZVNlbGVjdGlvbkhpZGRlbikpXG4gICAgICAgICAgICB0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgPSB0cnVlO1xuICAgIH1cbiAgICBtZWFzdXJlKHZpZXcpIHtcbiAgICAgICAgbGV0IGRvbSA9IHZpZXcuY29udGVudERPTSwgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb20pO1xuICAgICAgICBsZXQgb3JhY2xlID0gdGhpcy5oZWlnaHRPcmFjbGU7XG4gICAgICAgIGxldCB3aGl0ZVNwYWNlID0gc3R5bGUud2hpdGVTcGFjZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VGV4dERpcmVjdGlvbiA9IHN0eWxlLmRpcmVjdGlvbiA9PSBcInJ0bFwiID8gRGlyZWN0aW9uLlJUTCA6IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIGxldCByZWZyZXNoID0gdGhpcy5oZWlnaHRPcmFjbGUubXVzdFJlZnJlc2hGb3JXcmFwcGluZyh3aGl0ZVNwYWNlKTtcbiAgICAgICAgbGV0IGRvbVJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBtZWFzdXJlQ29udGVudCA9IHJlZnJlc2ggfHwgdGhpcy5tdXN0TWVhc3VyZUNvbnRlbnQgfHwgdGhpcy5jb250ZW50RE9NSGVpZ2h0ICE9IGRvbVJlY3QuaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbnRlbnRET01IZWlnaHQgPSBkb21SZWN0LmhlaWdodDtcbiAgICAgICAgdGhpcy5tdXN0TWVhc3VyZUNvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDAsIGJpYXMgPSAwO1xuICAgICAgICBpZiAoZG9tUmVjdC53aWR0aCAmJiBkb21SZWN0LmhlaWdodCkge1xuICAgICAgICAgICAgbGV0IHsgc2NhbGVYLCBzY2FsZVkgfSA9IGdldFNjYWxlKGRvbSwgZG9tUmVjdCk7XG4gICAgICAgICAgICBpZiAoc2NhbGVYID4gLjAwNSAmJiBNYXRoLmFicyh0aGlzLnNjYWxlWCAtIHNjYWxlWCkgPiAuMDA1IHx8XG4gICAgICAgICAgICAgICAgc2NhbGVZID4gLjAwNSAmJiBNYXRoLmFicyh0aGlzLnNjYWxlWSAtIHNjYWxlWSkgPiAuMDA1KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsZVggPSBzY2FsZVg7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsZVkgPSBzY2FsZVk7XG4gICAgICAgICAgICAgICAgcmVzdWx0IHw9IDE2IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi87XG4gICAgICAgICAgICAgICAgcmVmcmVzaCA9IG1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBWZXJ0aWNhbCBwYWRkaW5nXG4gICAgICAgIGxldCBwYWRkaW5nVG9wID0gKHBhcnNlSW50KHN0eWxlLnBhZGRpbmdUb3ApIHx8IDApICogdGhpcy5zY2FsZVk7XG4gICAgICAgIGxldCBwYWRkaW5nQm90dG9tID0gKHBhcnNlSW50KHN0eWxlLnBhZGRpbmdCb3R0b20pIHx8IDApICogdGhpcy5zY2FsZVk7XG4gICAgICAgIGlmICh0aGlzLnBhZGRpbmdUb3AgIT0gcGFkZGluZ1RvcCB8fCB0aGlzLnBhZGRpbmdCb3R0b20gIT0gcGFkZGluZ0JvdHRvbSkge1xuICAgICAgICAgICAgdGhpcy5wYWRkaW5nVG9wID0gcGFkZGluZ1RvcDtcbiAgICAgICAgICAgIHRoaXMucGFkZGluZ0JvdHRvbSA9IHBhZGRpbmdCb3R0b207XG4gICAgICAgICAgICByZXN1bHQgfD0gMTYgLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLyB8IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZWRpdG9yV2lkdGggIT0gdmlldy5zY3JvbGxET00uY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgIGlmIChvcmFjbGUubGluZVdyYXBwaW5nKVxuICAgICAgICAgICAgICAgIG1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yV2lkdGggPSB2aWV3LnNjcm9sbERPTS5jbGllbnRXaWR0aDtcbiAgICAgICAgICAgIHJlc3VsdCB8PSAxNiAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzY3JvbGxUb3AgPSB2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3AgKiB0aGlzLnNjYWxlWTtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVG9wICE9IHNjcm9sbFRvcCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2Nyb2xsZWRUb0JvdHRvbSA9IGlzU2Nyb2xsZWRUb0JvdHRvbSh2aWV3LnNjcm9sbERPTSk7XG4gICAgICAgIC8vIFBpeGVsIHZpZXdwb3J0XG4gICAgICAgIGxldCBwaXhlbFZpZXdwb3J0ID0gKHRoaXMucHJpbnRpbmcgPyBmdWxsUGl4ZWxSYW5nZSA6IHZpc2libGVQaXhlbFJhbmdlKShkb20sIHRoaXMucGFkZGluZ1RvcCk7XG4gICAgICAgIGxldCBkVG9wID0gcGl4ZWxWaWV3cG9ydC50b3AgLSB0aGlzLnBpeGVsVmlld3BvcnQudG9wLCBkQm90dG9tID0gcGl4ZWxWaWV3cG9ydC5ib3R0b20gLSB0aGlzLnBpeGVsVmlld3BvcnQuYm90dG9tO1xuICAgICAgICB0aGlzLnBpeGVsVmlld3BvcnQgPSBwaXhlbFZpZXdwb3J0O1xuICAgICAgICBsZXQgaW5WaWV3ID0gdGhpcy5waXhlbFZpZXdwb3J0LmJvdHRvbSA+IHRoaXMucGl4ZWxWaWV3cG9ydC50b3AgJiYgdGhpcy5waXhlbFZpZXdwb3J0LnJpZ2h0ID4gdGhpcy5waXhlbFZpZXdwb3J0LmxlZnQ7XG4gICAgICAgIGlmIChpblZpZXcgIT0gdGhpcy5pblZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuaW5WaWV3ID0gaW5WaWV3O1xuICAgICAgICAgICAgaWYgKGluVmlldylcbiAgICAgICAgICAgICAgICBtZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmluVmlldyAmJiAhdGhpcy5zY3JvbGxUYXJnZXQgJiYgIWluV2luZG93KHZpZXcuZG9tKSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBsZXQgY29udGVudFdpZHRoID0gZG9tUmVjdC53aWR0aDtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudERPTVdpZHRoICE9IGNvbnRlbnRXaWR0aCB8fCB0aGlzLmVkaXRvckhlaWdodCAhPSB2aWV3LnNjcm9sbERPTS5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudERPTVdpZHRoID0gZG9tUmVjdC53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9ySGVpZ2h0ID0gdmlldy5zY3JvbGxET00uY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgcmVzdWx0IHw9IDE2IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lYXN1cmVDb250ZW50KSB7XG4gICAgICAgICAgICBsZXQgbGluZUhlaWdodHMgPSB2aWV3LmRvY1ZpZXcubWVhc3VyZVZpc2libGVMaW5lSGVpZ2h0cyh0aGlzLnZpZXdwb3J0KTtcbiAgICAgICAgICAgIGlmIChvcmFjbGUubXVzdFJlZnJlc2hGb3JIZWlnaHRzKGxpbmVIZWlnaHRzKSlcbiAgICAgICAgICAgICAgICByZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChyZWZyZXNoIHx8IG9yYWNsZS5saW5lV3JhcHBpbmcgJiYgTWF0aC5hYnMoY29udGVudFdpZHRoIC0gdGhpcy5jb250ZW50RE9NV2lkdGgpID4gb3JhY2xlLmNoYXJXaWR0aCkge1xuICAgICAgICAgICAgICAgIGxldCB7IGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCB9ID0gdmlldy5kb2NWaWV3Lm1lYXN1cmVUZXh0U2l6ZSgpO1xuICAgICAgICAgICAgICAgIHJlZnJlc2ggPSBsaW5lSGVpZ2h0ID4gMCAmJiBvcmFjbGUucmVmcmVzaCh3aGl0ZVNwYWNlLCBsaW5lSGVpZ2h0LCBjaGFyV2lkdGgsIHRleHRIZWlnaHQsIGNvbnRlbnRXaWR0aCAvIGNoYXJXaWR0aCwgbGluZUhlaWdodHMpO1xuICAgICAgICAgICAgICAgIGlmIChyZWZyZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuZG9jVmlldy5taW5XaWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAxNiAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkVG9wID4gMCAmJiBkQm90dG9tID4gMClcbiAgICAgICAgICAgICAgICBiaWFzID0gTWF0aC5tYXgoZFRvcCwgZEJvdHRvbSk7XG4gICAgICAgICAgICBlbHNlIGlmIChkVG9wIDwgMCAmJiBkQm90dG9tIDwgMClcbiAgICAgICAgICAgICAgICBiaWFzID0gTWF0aC5taW4oZFRvcCwgZEJvdHRvbSk7XG4gICAgICAgICAgICBjbGVhckhlaWdodENoYW5nZUZsYWcoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHZwIG9mIHRoaXMudmlld3BvcnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodHMgPSB2cC5mcm9tID09IHRoaXMudmlld3BvcnQuZnJvbSA/IGxpbmVIZWlnaHRzIDogdmlldy5kb2NWaWV3Lm1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHModnApO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0TWFwID0gKHJlZnJlc2ggPyBIZWlnaHRNYXAuZW1wdHkoKS5hcHBseUNoYW5nZXModGhpcy5zdGF0ZURlY28sIFRleHQuZW1wdHksIHRoaXMuaGVpZ2h0T3JhY2xlLCBbbmV3IENoYW5nZWRSYW5nZSgwLCAwLCAwLCB2aWV3LnN0YXRlLmRvYy5sZW5ndGgpXSkgOiB0aGlzLmhlaWdodE1hcCkudXBkYXRlSGVpZ2h0KG9yYWNsZSwgMCwgcmVmcmVzaCwgbmV3IE1lYXN1cmVkSGVpZ2h0cyh2cC5mcm9tLCBoZWlnaHRzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGVpZ2h0Q2hhbmdlRmxhZylcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLztcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmlld3BvcnRDaGFuZ2UgPSAhdGhpcy52aWV3cG9ydElzQXBwcm9wcmlhdGUodGhpcy52aWV3cG9ydCwgYmlhcykgfHxcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ICYmICh0aGlzLnNjcm9sbFRhcmdldC5yYW5nZS5oZWFkIDwgdGhpcy52aWV3cG9ydC5mcm9tIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA+IHRoaXMudmlld3BvcnQudG8pO1xuICAgICAgICBpZiAodmlld3BvcnRDaGFuZ2UpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKVxuICAgICAgICAgICAgICAgIHJlc3VsdCB8PSB0aGlzLnVwZGF0ZVNjYWxlcigpO1xuICAgICAgICAgICAgdGhpcy52aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld3BvcnQoYmlhcywgdGhpcy5zY3JvbGxUYXJnZXQpO1xuICAgICAgICAgICAgcmVzdWx0IHw9IHRoaXMudXBkYXRlRm9yVmlld3BvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHJlc3VsdCAmIDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi8pIHx8IHZpZXdwb3J0Q2hhbmdlKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydExpbmVzKCk7XG4gICAgICAgIGlmICh0aGlzLmxpbmVHYXBzLmxlbmd0aCB8fCB0aGlzLnZpZXdwb3J0LnRvIC0gdGhpcy52aWV3cG9ydC5mcm9tID4gKDIwMDAgLyogTEcuTWFyZ2luICovIDw8IDEpKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVMaW5lR2Fwcyh0aGlzLmVuc3VyZUxpbmVHYXBzKHJlZnJlc2ggPyBbXSA6IHRoaXMubGluZUdhcHMsIHZpZXcpKTtcbiAgICAgICAgcmVzdWx0IHw9IHRoaXMuY29tcHV0ZVZpc2libGVSYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMubXVzdEVuZm9yY2VDdXJzb3JBc3NvYykge1xuICAgICAgICAgICAgdGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgaW4gdGhlIHJlYWQgc3RhZ2UsIGJlY2F1c2UgbW92aW5nIHRoZSBzZWxlY3Rpb25cbiAgICAgICAgICAgIC8vIHRvIGEgbGluZSBlbmQgaXMgZ29pbmcgdG8gdHJpZ2dlciBhIGxheW91dCBhbnl3YXksIHNvIGl0XG4gICAgICAgICAgICAvLyBjYW4ndCBiZSBhIHB1cmUgd3JpdGUuIEl0IHNob3VsZCBiZSByYXJlIHRoYXQgaXQgZG9lcyBhbnlcbiAgICAgICAgICAgIC8vIHdyaXRpbmcuXG4gICAgICAgICAgICB2aWV3LmRvY1ZpZXcuZW5mb3JjZUN1cnNvckFzc29jKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZ2V0IHZpc2libGVUb3AoKSB7IHJldHVybiB0aGlzLnNjYWxlci5mcm9tRE9NKHRoaXMucGl4ZWxWaWV3cG9ydC50b3ApOyB9XG4gICAgZ2V0IHZpc2libGVCb3R0b20oKSB7IHJldHVybiB0aGlzLnNjYWxlci5mcm9tRE9NKHRoaXMucGl4ZWxWaWV3cG9ydC5ib3R0b20pOyB9XG4gICAgZ2V0Vmlld3BvcnQoYmlhcywgc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCBkaXZpZGUgVlAuTWFyZ2luIGJldHdlZW4gdGhlIHRvcCBhbmQgdGhlXG4gICAgICAgIC8vIGJvdHRvbSwgZGVwZW5kaW5nIG9uIHRoZSBiaWFzICh0aGUgY2hhbmdlIGluIHZpZXdwb3J0IHBvc2l0aW9uXG4gICAgICAgIC8vIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZSkuIEl0J2xsIGhvbGQgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxXG4gICAgICAgIGxldCBtYXJnaW5Ub3AgPSAwLjUgLSBNYXRoLm1heCgtMC41LCBNYXRoLm1pbigwLjUsIGJpYXMgLyAxMDAwIC8qIFZQLk1hcmdpbiAqLyAvIDIpKTtcbiAgICAgICAgbGV0IG1hcCA9IHRoaXMuaGVpZ2h0TWFwLCBvcmFjbGUgPSB0aGlzLmhlaWdodE9yYWNsZTtcbiAgICAgICAgbGV0IHsgdmlzaWJsZVRvcCwgdmlzaWJsZUJvdHRvbSB9ID0gdGhpcztcbiAgICAgICAgbGV0IHZpZXdwb3J0ID0gbmV3IFZpZXdwb3J0KG1hcC5saW5lQXQodmlzaWJsZVRvcCAtIG1hcmdpblRvcCAqIDEwMDAgLyogVlAuTWFyZ2luICovLCBRdWVyeVR5cGUuQnlIZWlnaHQsIG9yYWNsZSwgMCwgMCkuZnJvbSwgbWFwLmxpbmVBdCh2aXNpYmxlQm90dG9tICsgKDEgLSBtYXJnaW5Ub3ApICogMTAwMCAvKiBWUC5NYXJnaW4gKi8sIFF1ZXJ5VHlwZS5CeUhlaWdodCwgb3JhY2xlLCAwLCAwKS50byk7XG4gICAgICAgIC8vIElmIHNjcm9sbFRhcmdldCBpcyBnaXZlbiwgbWFrZSBzdXJlIHRoZSB2aWV3cG9ydCBpbmNsdWRlcyB0aGF0IHBvc2l0aW9uXG4gICAgICAgIGlmIChzY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgICAgIGxldCB7IGhlYWQgfSA9IHNjcm9sbFRhcmdldC5yYW5nZTtcbiAgICAgICAgICAgIGlmIChoZWFkIDwgdmlld3BvcnQuZnJvbSB8fCBoZWFkID4gdmlld3BvcnQudG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgdmlld0hlaWdodCA9IE1hdGgubWluKHRoaXMuZWRpdG9ySGVpZ2h0LCB0aGlzLnBpeGVsVmlld3BvcnQuYm90dG9tIC0gdGhpcy5waXhlbFZpZXdwb3J0LnRvcCk7XG4gICAgICAgICAgICAgICAgbGV0IGJsb2NrID0gbWFwLmxpbmVBdChoZWFkLCBRdWVyeVR5cGUuQnlQb3MsIG9yYWNsZSwgMCwgMCksIHRvcFBvcztcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0LnkgPT0gXCJjZW50ZXJcIilcbiAgICAgICAgICAgICAgICAgICAgdG9wUG9zID0gKGJsb2NrLnRvcCArIGJsb2NrLmJvdHRvbSkgLyAyIC0gdmlld0hlaWdodCAvIDI7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2Nyb2xsVGFyZ2V0LnkgPT0gXCJzdGFydFwiIHx8IHNjcm9sbFRhcmdldC55ID09IFwibmVhcmVzdFwiICYmIGhlYWQgPCB2aWV3cG9ydC5mcm9tKVxuICAgICAgICAgICAgICAgICAgICB0b3BQb3MgPSBibG9jay50b3A7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0b3BQb3MgPSBibG9jay5ib3R0b20gLSB2aWV3SGVpZ2h0O1xuICAgICAgICAgICAgICAgIHZpZXdwb3J0ID0gbmV3IFZpZXdwb3J0KG1hcC5saW5lQXQodG9wUG9zIC0gMTAwMCAvKiBWUC5NYXJnaW4gKi8gLyAyLCBRdWVyeVR5cGUuQnlIZWlnaHQsIG9yYWNsZSwgMCwgMCkuZnJvbSwgbWFwLmxpbmVBdCh0b3BQb3MgKyB2aWV3SGVpZ2h0ICsgMTAwMCAvKiBWUC5NYXJnaW4gKi8gLyAyLCBRdWVyeVR5cGUuQnlIZWlnaHQsIG9yYWNsZSwgMCwgMCkudG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aWV3cG9ydDtcbiAgICB9XG4gICAgbWFwVmlld3BvcnQodmlld3BvcnQsIGNoYW5nZXMpIHtcbiAgICAgICAgbGV0IGZyb20gPSBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC5mcm9tLCAtMSksIHRvID0gY2hhbmdlcy5tYXBQb3Modmlld3BvcnQudG8sIDEpO1xuICAgICAgICByZXR1cm4gbmV3IFZpZXdwb3J0KHRoaXMuaGVpZ2h0TWFwLmxpbmVBdChmcm9tLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKS5mcm9tLCB0aGlzLmhlaWdodE1hcC5saW5lQXQodG8sIFF1ZXJ5VHlwZS5CeVBvcywgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApLnRvKTtcbiAgICB9XG4gICAgLy8gQ2hlY2tzIGlmIGEgZ2l2ZW4gdmlld3BvcnQgY292ZXJzIHRoZSB2aXNpYmxlIHBhcnQgb2YgdGhlXG4gICAgLy8gZG9jdW1lbnQgYW5kIG5vdCB0b28gbXVjaCBiZXlvbmQgdGhhdC5cbiAgICB2aWV3cG9ydElzQXBwcm9wcmlhdGUoeyBmcm9tLCB0byB9LCBiaWFzID0gMCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5WaWV3KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCB7IHRvcCB9ID0gdGhpcy5oZWlnaHRNYXAubGluZUF0KGZyb20sIFF1ZXJ5VHlwZS5CeVBvcywgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApO1xuICAgICAgICBsZXQgeyBib3R0b20gfSA9IHRoaXMuaGVpZ2h0TWFwLmxpbmVBdCh0bywgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCk7XG4gICAgICAgIGxldCB7IHZpc2libGVUb3AsIHZpc2libGVCb3R0b20gfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiAoZnJvbSA9PSAwIHx8IHRvcCA8PSB2aXNpYmxlVG9wIC0gTWF0aC5tYXgoMTAgLyogVlAuTWluQ292ZXJNYXJnaW4gKi8sIE1hdGgubWluKC1iaWFzLCAyNTAgLyogVlAuTWF4Q292ZXJNYXJnaW4gKi8pKSkgJiZcbiAgICAgICAgICAgICh0byA9PSB0aGlzLnN0YXRlLmRvYy5sZW5ndGggfHxcbiAgICAgICAgICAgICAgICBib3R0b20gPj0gdmlzaWJsZUJvdHRvbSArIE1hdGgubWF4KDEwIC8qIFZQLk1pbkNvdmVyTWFyZ2luICovLCBNYXRoLm1pbihiaWFzLCAyNTAgLyogVlAuTWF4Q292ZXJNYXJnaW4gKi8pKSkgJiZcbiAgICAgICAgICAgICh0b3AgPiB2aXNpYmxlVG9wIC0gMiAqIDEwMDAgLyogVlAuTWFyZ2luICovICYmIGJvdHRvbSA8IHZpc2libGVCb3R0b20gKyAyICogMTAwMCAvKiBWUC5NYXJnaW4gKi8pO1xuICAgIH1cbiAgICBtYXBMaW5lR2FwcyhnYXBzLCBjaGFuZ2VzKSB7XG4gICAgICAgIGlmICghZ2Fwcy5sZW5ndGggfHwgY2hhbmdlcy5lbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBnYXBzO1xuICAgICAgICBsZXQgbWFwcGVkID0gW107XG4gICAgICAgIGZvciAobGV0IGdhcCBvZiBnYXBzKVxuICAgICAgICAgICAgaWYgKCFjaGFuZ2VzLnRvdWNoZXNSYW5nZShnYXAuZnJvbSwgZ2FwLnRvKSlcbiAgICAgICAgICAgICAgICBtYXBwZWQucHVzaChuZXcgTGluZUdhcChjaGFuZ2VzLm1hcFBvcyhnYXAuZnJvbSksIGNoYW5nZXMubWFwUG9zKGdhcC50byksIGdhcC5zaXplLCBnYXAuZGlzcGxheVNpemUpKTtcbiAgICAgICAgcmV0dXJuIG1hcHBlZDtcbiAgICB9XG4gICAgLy8gQ29tcHV0ZXMgcG9zaXRpb25zIGluIHRoZSB2aWV3cG9ydCB3aGVyZSB0aGUgc3RhcnQgb3IgZW5kIG9mIGFcbiAgICAvLyBsaW5lIHNob3VsZCBiZSBoaWRkZW4sIHRyeWluZyB0byByZXVzZSBleGlzdGluZyBsaW5lIGdhcHMgd2hlblxuICAgIC8vIGFwcHJvcHJpYXRlIHRvIGF2b2lkIHVubmVjY2VzYXJ5IHJlZHJhd3MuXG4gICAgLy8gVXNlcyBjcnVkZSBjaGFyYWN0ZXItY291bnRpbmcgZm9yIHRoZSBwb3NpdGlvbmluZyBhbmQgc2l6aW5nLFxuICAgIC8vIHNpbmNlIGFjdHVhbCBET00gY29vcmRpbmF0ZXMgYXJlbid0IGFsd2F5cyBhdmFpbGFibGUgYW5kXG4gICAgLy8gcHJlZGljdGFibGUuIFJlbGllcyBvbiBnZW5lcm91cyBtYXJnaW5zIChzZWUgTEcuTWFyZ2luKSB0byBoaWRlXG4gICAgLy8gdGhlIGFydGlmYWN0cyB0aGlzIG1pZ2h0IHByb2R1Y2UgZnJvbSB0aGUgdXNlci5cbiAgICBlbnN1cmVMaW5lR2FwcyhjdXJyZW50LCBtYXlNZWFzdXJlKSB7XG4gICAgICAgIGxldCB3cmFwcGluZyA9IHRoaXMuaGVpZ2h0T3JhY2xlLmxpbmVXcmFwcGluZztcbiAgICAgICAgbGV0IG1hcmdpbiA9IHdyYXBwaW5nID8gMTAwMDAgLyogTEcuTWFyZ2luV3JhcCAqLyA6IDIwMDAgLyogTEcuTWFyZ2luICovLCBoYWxmTWFyZ2luID0gbWFyZ2luID4+IDEsIGRvdWJsZU1hcmdpbiA9IG1hcmdpbiA8PCAxO1xuICAgICAgICAvLyBUaGUgbm9uLXdyYXBwaW5nIGxvZ2ljIHdvbid0IHdvcmsgYXQgYWxsIGluIHByZWRvbWluYW50bHkgcmlnaHQtdG8tbGVmdCB0ZXh0LlxuICAgICAgICBpZiAodGhpcy5kZWZhdWx0VGV4dERpcmVjdGlvbiAhPSBEaXJlY3Rpb24uTFRSICYmICF3cmFwcGluZylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgbGV0IGdhcHMgPSBbXTtcbiAgICAgICAgbGV0IGFkZEdhcCA9IChmcm9tLCB0bywgbGluZSwgc3RydWN0dXJlKSA9PiB7XG4gICAgICAgICAgICBpZiAodG8gLSBmcm9tIDwgaGFsZk1hcmdpbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgc2VsID0gdGhpcy5zdGF0ZS5zZWxlY3Rpb24ubWFpbiwgYXZvaWQgPSBbc2VsLmZyb21dO1xuICAgICAgICAgICAgaWYgKCFzZWwuZW1wdHkpXG4gICAgICAgICAgICAgICAgYXZvaWQucHVzaChzZWwudG8pO1xuICAgICAgICAgICAgZm9yIChsZXQgcG9zIG9mIGF2b2lkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20gJiYgcG9zIDwgdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkR2FwKGZyb20sIHBvcyAtIDEwIC8qIExHLlNlbGVjdGlvbk1hcmdpbiAqLywgbGluZSwgc3RydWN0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkR2FwKHBvcyArIDEwIC8qIExHLlNlbGVjdGlvbk1hcmdpbiAqLywgdG8sIGxpbmUsIHN0cnVjdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZ2FwID0gZmluZChjdXJyZW50LCBnYXAgPT4gZ2FwLmZyb20gPj0gbGluZS5mcm9tICYmIGdhcC50byA8PSBsaW5lLnRvICYmXG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoZ2FwLmZyb20gLSBmcm9tKSA8IGhhbGZNYXJnaW4gJiYgTWF0aC5hYnMoZ2FwLnRvIC0gdG8pIDwgaGFsZk1hcmdpbiAmJlxuICAgICAgICAgICAgICAgICFhdm9pZC5zb21lKHBvcyA9PiBnYXAuZnJvbSA8IHBvcyAmJiBnYXAudG8gPiBwb3MpKTtcbiAgICAgICAgICAgIGlmICghZ2FwKSB7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBzY3JvbGxpbmcgZG93biwgc25hcCBnYXAgZW5kcyB0byBsaW5lIHN0YXJ0cyB0byBhdm9pZCBzaGlmdHMgaW4gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICBpZiAodG8gPCBsaW5lLnRvICYmIG1heU1lYXN1cmUgJiYgd3JhcHBpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgbWF5TWVhc3VyZS52aXNpYmxlUmFuZ2VzLnNvbWUociA9PiByLmZyb20gPD0gdG8gJiYgci50byA+PSB0bykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVTdGFydCA9IG1heU1lYXN1cmUubW92ZVRvTGluZUJvdW5kYXJ5KEVkaXRvclNlbGVjdGlvbi5jdXJzb3IodG8pLCBmYWxzZSwgdHJ1ZSkuaGVhZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVTdGFydCA+IGZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICB0byA9IGxpbmVTdGFydDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0aGlzLmdhcFNpemUobGluZSwgZnJvbSwgdG8sIHN0cnVjdHVyZSk7XG4gICAgICAgICAgICAgICAgbGV0IGRpc3BsYXlTaXplID0gd3JhcHBpbmcgfHwgc2l6ZSA8IDIwMDAwMDAgLyogVlAuTWF4SG9yaXpHYXAgKi8gPyBzaXplIDogMjAwMDAwMCAvKiBWUC5NYXhIb3JpekdhcCAqLztcbiAgICAgICAgICAgICAgICBnYXAgPSBuZXcgTGluZUdhcChmcm9tLCB0bywgc2l6ZSwgZGlzcGxheVNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2Fwcy5wdXNoKGdhcCk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBjaGVja0xpbmUgPSAobGluZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoIDwgZG91YmxlTWFyZ2luIHx8IGxpbmUudHlwZSAhPSBCbG9ja1R5cGUuVGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgc3RydWN0dXJlID0gbGluZVN0cnVjdHVyZShsaW5lLmZyb20sIGxpbmUudG8sIHRoaXMuc3RhdGVEZWNvKTtcbiAgICAgICAgICAgIGlmIChzdHJ1Y3R1cmUudG90YWwgPCBkb3VibGVNYXJnaW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuc2Nyb2xsVGFyZ2V0ID8gdGhpcy5zY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA6IG51bGw7XG4gICAgICAgICAgICBsZXQgdmlld0Zyb20sIHZpZXdUbztcbiAgICAgICAgICAgIGlmICh3cmFwcGluZykge1xuICAgICAgICAgICAgICAgIGxldCBtYXJnaW5IZWlnaHQgPSAobWFyZ2luIC8gdGhpcy5oZWlnaHRPcmFjbGUubGluZUxlbmd0aCkgKiB0aGlzLmhlaWdodE9yYWNsZS5saW5lSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGxldCB0b3AsIGJvdDtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldEZyYWMgPSBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BhY2VGcmFjID0gKCh0aGlzLnZpc2libGVCb3R0b20gLSB0aGlzLnZpc2libGVUb3ApIC8gMiArIG1hcmdpbkhlaWdodCkgLyBsaW5lLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gdGFyZ2V0RnJhYyAtIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICAgICAgYm90ID0gdGFyZ2V0RnJhYyArIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9ICh0aGlzLnZpc2libGVUb3AgLSBsaW5lLnRvcCAtIG1hcmdpbkhlaWdodCkgLyBsaW5lLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgYm90ID0gKHRoaXMudmlzaWJsZUJvdHRvbSAtIGxpbmUudG9wICsgbWFyZ2luSGVpZ2h0KSAvIGxpbmUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2aWV3RnJvbSA9IGZpbmRQb3NpdGlvbihzdHJ1Y3R1cmUsIHRvcCk7XG4gICAgICAgICAgICAgICAgdmlld1RvID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgYm90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFdpZHRoID0gc3RydWN0dXJlLnRvdGFsICogdGhpcy5oZWlnaHRPcmFjbGUuY2hhcldpZHRoO1xuICAgICAgICAgICAgICAgIGxldCBtYXJnaW5XaWR0aCA9IG1hcmdpbiAqIHRoaXMuaGVpZ2h0T3JhY2xlLmNoYXJXaWR0aDtcbiAgICAgICAgICAgICAgICBsZXQgaG9yaXpPZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIGlmICh0b3RhbFdpZHRoID4gMjAwMDAwMCAvKiBWUC5NYXhIb3JpekdhcCAqLylcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgb2xkIG9mIGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGQuZnJvbSA+PSBsaW5lLmZyb20gJiYgb2xkLmZyb20gPCBsaW5lLnRvICYmIG9sZC5zaXplICE9IG9sZC5kaXNwbGF5U2l6ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5mcm9tICogdGhpcy5oZWlnaHRPcmFjbGUuY2hhcldpZHRoICsgaG9yaXpPZmZzZXQgPCB0aGlzLnBpeGVsVmlld3BvcnQubGVmdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpek9mZnNldCA9IG9sZC5zaXplIC0gb2xkLmRpc3BsYXlTaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHB4TGVmdCA9IHRoaXMucGl4ZWxWaWV3cG9ydC5sZWZ0ICsgaG9yaXpPZmZzZXQsIHB4UmlnaHQgPSB0aGlzLnBpeGVsVmlld3BvcnQucmlnaHQgKyBob3Jpek9mZnNldDtcbiAgICAgICAgICAgICAgICBsZXQgbGVmdCwgcmlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXRGcmFjID0gZmluZEZyYWN0aW9uKHN0cnVjdHVyZSwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwYWNlRnJhYyA9ICgocHhSaWdodCAtIHB4TGVmdCkgLyAyICsgbWFyZ2luV2lkdGgpIC8gdG90YWxXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHRhcmdldEZyYWMgLSBzcGFjZUZyYWM7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gdGFyZ2V0RnJhYyArIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSAocHhMZWZ0IC0gbWFyZ2luV2lkdGgpIC8gdG90YWxXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSAocHhSaWdodCArIG1hcmdpbldpZHRoKSAvIHRvdGFsV2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZpZXdGcm9tID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgbGVmdCk7XG4gICAgICAgICAgICAgICAgdmlld1RvID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgcmlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpZXdGcm9tID4gbGluZS5mcm9tKVxuICAgICAgICAgICAgICAgIGFkZEdhcChsaW5lLmZyb20sIHZpZXdGcm9tLCBsaW5lLCBzdHJ1Y3R1cmUpO1xuICAgICAgICAgICAgaWYgKHZpZXdUbyA8IGxpbmUudG8pXG4gICAgICAgICAgICAgICAgYWRkR2FwKHZpZXdUbywgbGluZS50bywgbGluZSwgc3RydWN0dXJlKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiB0aGlzLnZpZXdwb3J0TGluZXMpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpbmUudHlwZSkpXG4gICAgICAgICAgICAgICAgbGluZS50eXBlLmZvckVhY2goY2hlY2tMaW5lKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjaGVja0xpbmUobGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdhcHM7XG4gICAgfVxuICAgIGdhcFNpemUobGluZSwgZnJvbSwgdG8sIHN0cnVjdHVyZSkge1xuICAgICAgICBsZXQgZnJhY3Rpb24gPSBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCB0bykgLSBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCBmcm9tKTtcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0T3JhY2xlLmxpbmVXcmFwcGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGxpbmUuaGVpZ2h0ICogZnJhY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3RydWN0dXJlLnRvdGFsICogdGhpcy5oZWlnaHRPcmFjbGUuY2hhcldpZHRoICogZnJhY3Rpb247XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlTGluZUdhcHMoZ2Fwcykge1xuICAgICAgICBpZiAoIUxpbmVHYXAuc2FtZShnYXBzLCB0aGlzLmxpbmVHYXBzKSkge1xuICAgICAgICAgICAgdGhpcy5saW5lR2FwcyA9IGdhcHM7XG4gICAgICAgICAgICB0aGlzLmxpbmVHYXBEZWNvID0gRGVjb3JhdGlvbi5zZXQoZ2Fwcy5tYXAoZ2FwID0+IGdhcC5kcmF3KHRoaXMsIHRoaXMuaGVpZ2h0T3JhY2xlLmxpbmVXcmFwcGluZykpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb21wdXRlVmlzaWJsZVJhbmdlcyhjaGFuZ2VzKSB7XG4gICAgICAgIGxldCBkZWNvID0gdGhpcy5zdGF0ZURlY287XG4gICAgICAgIGlmICh0aGlzLmxpbmVHYXBzLmxlbmd0aClcbiAgICAgICAgICAgIGRlY28gPSBkZWNvLmNvbmNhdCh0aGlzLmxpbmVHYXBEZWNvKTtcbiAgICAgICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgICAgICBSYW5nZVNldC5zcGFucyhkZWNvLCB0aGlzLnZpZXdwb3J0LmZyb20sIHRoaXMudmlld3BvcnQudG8sIHtcbiAgICAgICAgICAgIHNwYW4oZnJvbSwgdG8pIHsgcmFuZ2VzLnB1c2goeyBmcm9tLCB0byB9KTsgfSxcbiAgICAgICAgICAgIHBvaW50KCkgeyB9XG4gICAgICAgIH0sIDIwKTtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSAwO1xuICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCAhPSB0aGlzLnZpc2libGVSYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFuZ2VkID0gOCAvKiBVcGRhdGVGbGFnLlZpZXdwb3J0TW92ZWQgKi8gfCA0IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnQgKi87XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGggJiYgIShjaGFuZ2VkICYgOCAvKiBVcGRhdGVGbGFnLlZpZXdwb3J0TW92ZWQgKi8pOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb2xkID0gdGhpcy52aXNpYmxlUmFuZ2VzW2ldLCBudyA9IHJhbmdlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAob2xkLmZyb20gIT0gbncuZnJvbSB8fCBvbGQudG8gIT0gbncudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCB8PSA0IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnQgKi87XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGNoYW5nZXMgJiYgY2hhbmdlcy5tYXBQb3Mob2xkLmZyb20sIC0xKSA9PSBudy5mcm9tICYmIGNoYW5nZXMubWFwUG9zKG9sZC50bywgMSkgPT0gbncudG8pKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCB8PSA4IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnRNb3ZlZCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpYmxlUmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG4gICAgbGluZUJsb2NrQXQocG9zKSB7XG4gICAgICAgIHJldHVybiAocG9zID49IHRoaXMudmlld3BvcnQuZnJvbSAmJiBwb3MgPD0gdGhpcy52aWV3cG9ydC50byAmJlxuICAgICAgICAgICAgdGhpcy52aWV3cG9ydExpbmVzLmZpbmQoYiA9PiBiLmZyb20gPD0gcG9zICYmIGIudG8gPj0gcG9zKSkgfHxcbiAgICAgICAgICAgIHNjYWxlQmxvY2sodGhpcy5oZWlnaHRNYXAubGluZUF0KHBvcywgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCksIHRoaXMuc2NhbGVyKTtcbiAgICB9XG4gICAgbGluZUJsb2NrQXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiAoaGVpZ2h0ID49IHRoaXMudmlld3BvcnRMaW5lc1swXS50b3AgJiYgaGVpZ2h0IDw9IHRoaXMudmlld3BvcnRMaW5lc1t0aGlzLnZpZXdwb3J0TGluZXMubGVuZ3RoIC0gMV0uYm90dG9tICYmXG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0TGluZXMuZmluZChsID0+IGwudG9wIDw9IGhlaWdodCAmJiBsLmJvdHRvbSA+PSBoZWlnaHQpKSB8fFxuICAgICAgICAgICAgc2NhbGVCbG9jayh0aGlzLmhlaWdodE1hcC5saW5lQXQodGhpcy5zY2FsZXIuZnJvbURPTShoZWlnaHQpLCBRdWVyeVR5cGUuQnlIZWlnaHQsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKSwgdGhpcy5zY2FsZXIpO1xuICAgIH1cbiAgICBzY3JvbGxBbmNob3JBdChzY3JvbGxUb3ApIHtcbiAgICAgICAgbGV0IGJsb2NrID0gdGhpcy5saW5lQmxvY2tBdEhlaWdodChzY3JvbGxUb3AgKyA4KTtcbiAgICAgICAgcmV0dXJuIGJsb2NrLmZyb20gPj0gdGhpcy52aWV3cG9ydC5mcm9tIHx8IHRoaXMudmlld3BvcnRMaW5lc1swXS50b3AgLSBzY3JvbGxUb3AgPiAyMDAgPyBibG9jayA6IHRoaXMudmlld3BvcnRMaW5lc1swXTtcbiAgICB9XG4gICAgZWxlbWVudEF0SGVpZ2h0KGhlaWdodCkge1xuICAgICAgICByZXR1cm4gc2NhbGVCbG9jayh0aGlzLmhlaWdodE1hcC5ibG9ja0F0KHRoaXMuc2NhbGVyLmZyb21ET00oaGVpZ2h0KSwgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApLCB0aGlzLnNjYWxlcik7XG4gICAgfVxuICAgIGdldCBkb2NIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjYWxlci50b0RPTSh0aGlzLmhlaWdodE1hcC5oZWlnaHQpO1xuICAgIH1cbiAgICBnZXQgY29udGVudEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jSGVpZ2h0ICsgdGhpcy5wYWRkaW5nVG9wICsgdGhpcy5wYWRkaW5nQm90dG9tO1xuICAgIH1cbn1cbmNsYXNzIFZpZXdwb3J0IHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bykge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgfVxufVxuZnVuY3Rpb24gbGluZVN0cnVjdHVyZShmcm9tLCB0bywgc3RhdGVEZWNvKSB7XG4gICAgbGV0IHJhbmdlcyA9IFtdLCBwb3MgPSBmcm9tLCB0b3RhbCA9IDA7XG4gICAgUmFuZ2VTZXQuc3BhbnMoc3RhdGVEZWNvLCBmcm9tLCB0bywge1xuICAgICAgICBzcGFuKCkgeyB9LFxuICAgICAgICBwb2ludChmcm9tLCB0bykge1xuICAgICAgICAgICAgaWYgKGZyb20gPiBwb3MpIHtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaCh7IGZyb206IHBvcywgdG86IGZyb20gfSk7XG4gICAgICAgICAgICAgICAgdG90YWwgKz0gZnJvbSAtIHBvcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcyA9IHRvO1xuICAgICAgICB9XG4gICAgfSwgMjApOyAvLyBXZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gY29sbGFwc2VkIHJhbmdlcyBvZiBhIHNpZ25pZmljYW50IHNpemVcbiAgICBpZiAocG9zIDwgdG8pIHtcbiAgICAgICAgcmFuZ2VzLnB1c2goeyBmcm9tOiBwb3MsIHRvIH0pO1xuICAgICAgICB0b3RhbCArPSB0byAtIHBvcztcbiAgICB9XG4gICAgcmV0dXJuIHsgdG90YWwsIHJhbmdlcyB9O1xufVxuZnVuY3Rpb24gZmluZFBvc2l0aW9uKHsgdG90YWwsIHJhbmdlcyB9LCByYXRpbykge1xuICAgIGlmIChyYXRpbyA8PSAwKVxuICAgICAgICByZXR1cm4gcmFuZ2VzWzBdLmZyb207XG4gICAgaWYgKHJhdGlvID49IDEpXG4gICAgICAgIHJldHVybiByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLnRvO1xuICAgIGxldCBkaXN0ID0gTWF0aC5mbG9vcih0b3RhbCAqIHJhdGlvKTtcbiAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gcmFuZ2VzW2ldLCBzaXplID0gdG8gLSBmcm9tO1xuICAgICAgICBpZiAoZGlzdCA8PSBzaXplKVxuICAgICAgICAgICAgcmV0dXJuIGZyb20gKyBkaXN0O1xuICAgICAgICBkaXN0IC09IHNpemU7XG4gICAgfVxufVxuZnVuY3Rpb24gZmluZEZyYWN0aW9uKHN0cnVjdHVyZSwgcG9zKSB7XG4gICAgbGV0IGNvdW50ZWQgPSAwO1xuICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiBzdHJ1Y3R1cmUucmFuZ2VzKSB7XG4gICAgICAgIGlmIChwb3MgPD0gdG8pIHtcbiAgICAgICAgICAgIGNvdW50ZWQgKz0gcG9zIC0gZnJvbTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50ZWQgKz0gdG8gLSBmcm9tO1xuICAgIH1cbiAgICByZXR1cm4gY291bnRlZCAvIHN0cnVjdHVyZS50b3RhbDtcbn1cbmZ1bmN0aW9uIGZpbmQoYXJyYXksIGYpIHtcbiAgICBmb3IgKGxldCB2YWwgb2YgYXJyYXkpXG4gICAgICAgIGlmIChmKHZhbCkpXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG4vLyBEb24ndCBzY2FsZSB3aGVuIHRoZSBkb2N1bWVudCBoZWlnaHQgaXMgd2l0aGluIHRoZSByYW5nZSBvZiB3aGF0XG4vLyB0aGUgRE9NIGNhbiBoYW5kbGUuXG5jb25zdCBJZFNjYWxlciA9IHtcbiAgICB0b0RPTShuKSB7IHJldHVybiBuOyB9LFxuICAgIGZyb21ET00obikgeyByZXR1cm4gbjsgfSxcbiAgICBzY2FsZTogMSxcbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIgPT0gdGhpczsgfVxufTtcbi8vIFdoZW4gdGhlIGhlaWdodCBpcyB0b28gYmlnICg+IFZQLk1heERPTUhlaWdodCksIHNjYWxlIGRvd24gdGhlXG4vLyByZWdpb25zIG91dHNpZGUgdGhlIHZpZXdwb3J0cyBzbyB0aGF0IHRoZSB0b3RhbCBoZWlnaHQgaXNcbi8vIFZQLk1heERPTUhlaWdodC5cbmNsYXNzIEJpZ1NjYWxlciB7XG4gICAgY29uc3RydWN0b3Iob3JhY2xlLCBoZWlnaHRNYXAsIHZpZXdwb3J0cykge1xuICAgICAgICBsZXQgdnBIZWlnaHQgPSAwLCBiYXNlID0gMCwgZG9tQmFzZSA9IDA7XG4gICAgICAgIHRoaXMudmlld3BvcnRzID0gdmlld3BvcnRzLm1hcCgoeyBmcm9tLCB0byB9KSA9PiB7XG4gICAgICAgICAgICBsZXQgdG9wID0gaGVpZ2h0TWFwLmxpbmVBdChmcm9tLCBRdWVyeVR5cGUuQnlQb3MsIG9yYWNsZSwgMCwgMCkudG9wO1xuICAgICAgICAgICAgbGV0IGJvdHRvbSA9IGhlaWdodE1hcC5saW5lQXQodG8sIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCAwLCAwKS5ib3R0b207XG4gICAgICAgICAgICB2cEhlaWdodCArPSBib3R0b20gLSB0b3A7XG4gICAgICAgICAgICByZXR1cm4geyBmcm9tLCB0bywgdG9wLCBib3R0b20sIGRvbVRvcDogMCwgZG9tQm90dG9tOiAwIH07XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNjYWxlID0gKDcwMDAwMDAgLyogVlAuTWF4RE9NSGVpZ2h0ICovIC0gdnBIZWlnaHQpIC8gKGhlaWdodE1hcC5oZWlnaHQgLSB2cEhlaWdodCk7XG4gICAgICAgIGZvciAobGV0IG9iaiBvZiB0aGlzLnZpZXdwb3J0cykge1xuICAgICAgICAgICAgb2JqLmRvbVRvcCA9IGRvbUJhc2UgKyAob2JqLnRvcCAtIGJhc2UpICogdGhpcy5zY2FsZTtcbiAgICAgICAgICAgIGRvbUJhc2UgPSBvYmouZG9tQm90dG9tID0gb2JqLmRvbVRvcCArIChvYmouYm90dG9tIC0gb2JqLnRvcCk7XG4gICAgICAgICAgICBiYXNlID0gb2JqLmJvdHRvbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0RPTShuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBiYXNlID0gMCwgZG9tQmFzZSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2cCA9IGkgPCB0aGlzLnZpZXdwb3J0cy5sZW5ndGggPyB0aGlzLnZpZXdwb3J0c1tpXSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoIXZwIHx8IG4gPCB2cC50b3ApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbUJhc2UgKyAobiAtIGJhc2UpICogdGhpcy5zY2FsZTtcbiAgICAgICAgICAgIGlmIChuIDw9IHZwLmJvdHRvbSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdnAuZG9tVG9wICsgKG4gLSB2cC50b3ApO1xuICAgICAgICAgICAgYmFzZSA9IHZwLmJvdHRvbTtcbiAgICAgICAgICAgIGRvbUJhc2UgPSB2cC5kb21Cb3R0b207XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnJvbURPTShuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBiYXNlID0gMCwgZG9tQmFzZSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2cCA9IGkgPCB0aGlzLnZpZXdwb3J0cy5sZW5ndGggPyB0aGlzLnZpZXdwb3J0c1tpXSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoIXZwIHx8IG4gPCB2cC5kb21Ub3ApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UgKyAobiAtIGRvbUJhc2UpIC8gdGhpcy5zY2FsZTtcbiAgICAgICAgICAgIGlmIChuIDw9IHZwLmRvbUJvdHRvbSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdnAudG9wICsgKG4gLSB2cC5kb21Ub3ApO1xuICAgICAgICAgICAgYmFzZSA9IHZwLmJvdHRvbTtcbiAgICAgICAgICAgIGRvbUJhc2UgPSB2cC5kb21Cb3R0b207XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBCaWdTY2FsZXIpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5zY2FsZSA9PSBvdGhlci5zY2FsZSAmJiB0aGlzLnZpZXdwb3J0cy5sZW5ndGggPT0gb3RoZXIudmlld3BvcnRzLmxlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy52aWV3cG9ydHMuZXZlcnkoKHZwLCBpKSA9PiB2cC5mcm9tID09IG90aGVyLnZpZXdwb3J0c1tpXS5mcm9tICYmIHZwLnRvID09IG90aGVyLnZpZXdwb3J0c1tpXS50byk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2NhbGVCbG9jayhibG9jaywgc2NhbGVyKSB7XG4gICAgaWYgKHNjYWxlci5zY2FsZSA9PSAxKVxuICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgbGV0IGJUb3AgPSBzY2FsZXIudG9ET00oYmxvY2sudG9wKSwgYkJvdHRvbSA9IHNjYWxlci50b0RPTShibG9jay5ib3R0b20pO1xuICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGJsb2NrLmZyb20sIGJsb2NrLmxlbmd0aCwgYlRvcCwgYkJvdHRvbSAtIGJUb3AsIEFycmF5LmlzQXJyYXkoYmxvY2suX2NvbnRlbnQpID8gYmxvY2suX2NvbnRlbnQubWFwKGIgPT4gc2NhbGVCbG9jayhiLCBzY2FsZXIpKSA6IGJsb2NrLl9jb250ZW50KTtcbn1cblxuY29uc3QgdGhlbWUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogc3RycyA9PiBzdHJzLmpvaW4oXCIgXCIpIH0pO1xuY29uc3QgZGFya1RoZW1lID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuaW5kZXhPZih0cnVlKSA+IC0xIH0pO1xuY29uc3QgYmFzZVRoZW1lSUQgPSAvKkBfX1BVUkVfXyovU3R5bGVNb2R1bGUubmV3TmFtZSgpLCBiYXNlTGlnaHRJRCA9IC8qQF9fUFVSRV9fKi9TdHlsZU1vZHVsZS5uZXdOYW1lKCksIGJhc2VEYXJrSUQgPSAvKkBfX1BVUkVfXyovU3R5bGVNb2R1bGUubmV3TmFtZSgpO1xuY29uc3QgbGlnaHREYXJrSURzID0geyBcIiZsaWdodFwiOiBcIi5cIiArIGJhc2VMaWdodElELCBcIiZkYXJrXCI6IFwiLlwiICsgYmFzZURhcmtJRCB9O1xuZnVuY3Rpb24gYnVpbGRUaGVtZShtYWluLCBzcGVjLCBzY29wZXMpIHtcbiAgICByZXR1cm4gbmV3IFN0eWxlTW9kdWxlKHNwZWMsIHtcbiAgICAgICAgZmluaXNoKHNlbCkge1xuICAgICAgICAgICAgcmV0dXJuIC8mLy50ZXN0KHNlbCkgPyBzZWwucmVwbGFjZSgvJlxcdyovLCBtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobSA9PSBcIiZcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1haW47XG4gICAgICAgICAgICAgICAgaWYgKCFzY29wZXMgfHwgIXNjb3Blc1ttXSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVuc3VwcG9ydGVkIHNlbGVjdG9yOiAke219YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjb3Blc1ttXTtcbiAgICAgICAgICAgIH0pIDogbWFpbiArIFwiIFwiICsgc2VsO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5jb25zdCBiYXNlVGhlbWUkMSA9IC8qQF9fUFVSRV9fKi9idWlsZFRoZW1lKFwiLlwiICsgYmFzZVRoZW1lSUQsIHtcbiAgICBcIiZcIjoge1xuICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZSAhaW1wb3J0YW50XCIsXG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIFwiJi5jbS1mb2N1c2VkXCI6IHtcbiAgICAgICAgICAgIC8vIFByb3ZpZGUgYSBzaW1wbGUgZGVmYXVsdCBvdXRsaW5lIHRvIG1ha2Ugc3VyZSBhIGZvY3VzZWRcbiAgICAgICAgICAgIC8vIGVkaXRvciBpcyB2aXN1YWxseSBkaXN0aW5jdC4gQ2FuJ3QgbGVhdmUgdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3aWxsIGFwcGx5IHRvIHRoZSBjb250ZW50IGVsZW1lbnQsIHdoaWNoIGlzXG4gICAgICAgICAgICAvLyBpbnNpZGUgdGhlIHNjcm9sbGFibGUgY29udGFpbmVyIGFuZCBkb2Vzbid0IGluY2x1ZGUgdGhlXG4gICAgICAgICAgICAvLyBndXR0ZXJzLiBXZSBhbHNvIGNhbid0IHVzZSBhbiAnYXV0bycgb3V0bGluZSwgc2luY2UgdGhvc2VcbiAgICAgICAgICAgIC8vIGFyZSwgZm9yIHNvbWUgcmVhc29uLCBkcmF3biBiZWhpbmQgdGhlIGVsZW1lbnQgY29udGVudCwgd2hpY2hcbiAgICAgICAgICAgIC8vIHdpbGwgY2F1c2UgdGhpbmdzIGxpa2UgdGhlIGFjdGl2ZSBsaW5lIGJhY2tncm91bmQgdG8gY292ZXJcbiAgICAgICAgICAgIC8vIHRoZSBvdXRsaW5lICgjMjk3KS5cbiAgICAgICAgICAgIG91dGxpbmU6IFwiMXB4IGRvdHRlZCAjMjEyMTIxXCJcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcGxheTogXCJmbGV4ICFpbXBvcnRhbnRcIixcbiAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIlxuICAgIH0sXG4gICAgXCIuY20tc2Nyb2xsZXJcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImZsZXggIWltcG9ydGFudFwiLFxuICAgICAgICBhbGlnbkl0ZW1zOiBcImZsZXgtc3RhcnQgIWltcG9ydGFudFwiLFxuICAgICAgICBmb250RmFtaWx5OiBcIm1vbm9zcGFjZVwiLFxuICAgICAgICBsaW5lSGVpZ2h0OiAxLjQsXG4gICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgIG92ZXJmbG93WDogXCJhdXRvXCIsXG4gICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICAgIHpJbmRleDogMCxcbiAgICAgICAgb3ZlcmZsb3dBbmNob3I6IFwibm9uZVwiLFxuICAgIH0sXG4gICAgXCIuY20tY29udGVudFwiOiB7XG4gICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgZmxleEdyb3c6IDIsXG4gICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIixcbiAgICAgICAgd2hpdGVTcGFjZTogXCJwcmVcIixcbiAgICAgICAgd29yZFdyYXA6IFwibm9ybWFsXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2Rldi9pc3N1ZXMvNDU2XG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIG1pbkhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiNHB4IDBcIixcbiAgICAgICAgb3V0bGluZTogXCJub25lXCIsXG4gICAgICAgIFwiJltjb250ZW50ZWRpdGFibGU9dHJ1ZV1cIjoge1xuICAgICAgICAgICAgV2Via2l0VXNlck1vZGlmeTogXCJyZWFkLXdyaXRlLXBsYWludGV4dC1vbmx5XCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwiLmNtLWxpbmVXcmFwcGluZ1wiOiB7XG4gICAgICAgIHdoaXRlU3BhY2VfZmFsbGJhY2s6IFwicHJlLXdyYXBcIiwgLy8gRm9yIElFXG4gICAgICAgIHdoaXRlU3BhY2U6IFwiYnJlYWstc3BhY2VzXCIsXG4gICAgICAgIHdvcmRCcmVhazogXCJicmVhay13b3JkXCIsIC8vIEZvciBTYWZhcmksIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZVxuICAgICAgICBvdmVyZmxvd1dyYXA6IFwiYW55d2hlcmVcIixcbiAgICAgICAgZmxleFNocmluazogMVxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWNvbnRlbnRcIjogeyBjYXJldENvbG9yOiBcImJsYWNrXCIgfSxcbiAgICBcIiZkYXJrIC5jbS1jb250ZW50XCI6IHsgY2FyZXRDb2xvcjogXCJ3aGl0ZVwiIH0sXG4gICAgXCIuY20tbGluZVwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIixcbiAgICAgICAgcGFkZGluZzogXCIwIDJweCAwIDZweFwiXG4gICAgfSxcbiAgICBcIi5jbS1sYXllclwiOiB7XG4gICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgY29udGFpbjogXCJzaXplIHN0eWxlXCIsXG4gICAgICAgIFwiJiA+ICpcIjoge1xuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tc2VsZWN0aW9uQmFja2dyb3VuZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IFwiI2Q5ZDlkOVwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCIjMjIyXCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0LmNtLWZvY3VzZWQgPiAuY20tc2Nyb2xsZXIgPiAuY20tc2VsZWN0aW9uTGF5ZXIgLmNtLXNlbGVjdGlvbkJhY2tncm91bmRcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kOiBcIiNkN2Q0ZjBcIlxuICAgIH0sXG4gICAgXCImZGFyay5jbS1mb2N1c2VkID4gLmNtLXNjcm9sbGVyID4gLmNtLXNlbGVjdGlvbkxheWVyIC5jbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCIjMjMzXCJcbiAgICB9LFxuICAgIFwiLmNtLWN1cnNvckxheWVyXCI6IHtcbiAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCJcbiAgICB9LFxuICAgIFwiJi5jbS1mb2N1c2VkID4gLmNtLXNjcm9sbGVyID4gLmNtLWN1cnNvckxheWVyXCI6IHtcbiAgICAgICAgYW5pbWF0aW9uOiBcInN0ZXBzKDEpIGNtLWJsaW5rIDEuMnMgaW5maW5pdGVcIlxuICAgIH0sXG4gICAgLy8gVHdvIGFuaW1hdGlvbnMgZGVmaW5lZCBzbyB0aGF0IHdlIGNhbiBzd2l0Y2ggYmV0d2VlbiB0aGVtIHRvXG4gICAgLy8gcmVzdGFydCB0aGUgYW5pbWF0aW9uIHdpdGhvdXQgZm9yY2luZyBhbm90aGVyIHN0eWxlXG4gICAgLy8gcmVjb21wdXRhdGlvbi5cbiAgICBcIkBrZXlmcmFtZXMgY20tYmxpbmtcIjogeyBcIjAlXCI6IHt9LCBcIjUwJVwiOiB7IG9wYWNpdHk6IDAgfSwgXCIxMDAlXCI6IHt9IH0sXG4gICAgXCJAa2V5ZnJhbWVzIGNtLWJsaW5rMlwiOiB7IFwiMCVcIjoge30sIFwiNTAlXCI6IHsgb3BhY2l0eTogMCB9LCBcIjEwMCVcIjoge30gfSxcbiAgICBcIi5jbS1jdXJzb3IsIC5jbS1kcm9wQ3Vyc29yXCI6IHtcbiAgICAgICAgYm9yZGVyTGVmdDogXCIxLjJweCBzb2xpZCBibGFja1wiLFxuICAgICAgICBtYXJnaW5MZWZ0OiBcIi0wLjZweFwiLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIixcbiAgICB9LFxuICAgIFwiLmNtLWN1cnNvclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwibm9uZVwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1jdXJzb3JcIjoge1xuICAgICAgICBib3JkZXJMZWZ0Q29sb3I6IFwiI2RkZFwiXG4gICAgfSxcbiAgICBcIi5jbS1kcm9wQ3Vyc29yXCI6IHtcbiAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIlxuICAgIH0sXG4gICAgXCImLmNtLWZvY3VzZWQgPiAuY20tc2Nyb2xsZXIgPiAuY20tY3Vyc29yTGF5ZXIgLmNtLWN1cnNvclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIlxuICAgIH0sXG4gICAgXCIuY20taXNvXCI6IHtcbiAgICAgICAgdW5pY29kZUJpZGk6IFwiaXNvbGF0ZVwiXG4gICAgfSxcbiAgICBcIi5jbS1hbm5vdW5jZWRcIjoge1xuICAgICAgICBwb3NpdGlvbjogXCJmaXhlZFwiLFxuICAgICAgICB0b3A6IFwiLTEwMDAwcHhcIlxuICAgIH0sXG4gICAgXCJAbWVkaWEgcHJpbnRcIjoge1xuICAgICAgICBcIi5jbS1hbm5vdW5jZWRcIjogeyBkaXNwbGF5OiBcIm5vbmVcIiB9XG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tYWN0aXZlTGluZVwiOiB7IGJhY2tncm91bmRDb2xvcjogXCIjY2NlZWZmNDRcIiB9LFxuICAgIFwiJmRhcmsgLmNtLWFjdGl2ZUxpbmVcIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwiIzk5ZWVmZjMzXCIgfSxcbiAgICBcIiZsaWdodCAuY20tc3BlY2lhbENoYXJcIjogeyBjb2xvcjogXCJyZWRcIiB9LFxuICAgIFwiJmRhcmsgLmNtLXNwZWNpYWxDaGFyXCI6IHsgY29sb3I6IFwiI2Y3OFwiIH0sXG4gICAgXCIuY20tZ3V0dGVyc1wiOiB7XG4gICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgICB6SW5kZXg6IDIwMFxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWd1dHRlcnNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2Y1ZjVmNVwiLFxuICAgICAgICBjb2xvcjogXCIjNmM2YzZjXCIsXG4gICAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjZGRkXCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLWd1dHRlcnNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzMzMzMzOFwiLFxuICAgICAgICBjb2xvcjogXCIjY2NjXCJcbiAgICB9LFxuICAgIFwiLmNtLWd1dHRlclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiZmxleCAhaW1wb3J0YW50XCIsIC8vIE5lY2Vzc2FyeSAtLSBwcmV2ZW50cyBtYXJnaW4gY29sbGFwc2luZ1xuICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBtaW5IZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIlxuICAgIH0sXG4gICAgXCIuY20tZ3V0dGVyRWxlbWVudFwiOiB7XG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCJcbiAgICB9LFxuICAgIFwiLmNtLWxpbmVOdW1iZXJzIC5jbS1ndXR0ZXJFbGVtZW50XCI6IHtcbiAgICAgICAgcGFkZGluZzogXCIwIDNweCAwIDVweFwiLFxuICAgICAgICBtaW5XaWR0aDogXCIyMHB4XCIsXG4gICAgICAgIHRleHRBbGlnbjogXCJyaWdodFwiLFxuICAgICAgICB3aGl0ZVNwYWNlOiBcIm5vd3JhcFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tYWN0aXZlTGluZUd1dHRlclwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZTJmMmZmXCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLWFjdGl2ZUxpbmVHdXR0ZXJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzIyMjIyN1wiXG4gICAgfSxcbiAgICBcIi5jbS1wYW5lbHNcIjoge1xuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBwb3NpdGlvbjogXCJzdGlja3lcIixcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgIHpJbmRleDogMzAwXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tcGFuZWxzXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmNWY1ZjVcIixcbiAgICAgICAgY29sb3I6IFwiYmxhY2tcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXBhbmVscy10b3BcIjoge1xuICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkICNkZGRcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLXBhbmVscy1ib3R0b21cIjoge1xuICAgICAgICBib3JkZXJUb3A6IFwiMXB4IHNvbGlkICNkZGRcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tcGFuZWxzXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiMzMzMzMzhcIixcbiAgICAgICAgY29sb3I6IFwid2hpdGVcIlxuICAgIH0sXG4gICAgXCIuY20tdGFiXCI6IHtcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwiYm90dG9tXCJcbiAgICB9LFxuICAgIFwiLmNtLXdpZGdldEJ1ZmZlclwiOiB7XG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwidGV4dC10b3BcIixcbiAgICAgICAgaGVpZ2h0OiBcIjFlbVwiLFxuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIlxuICAgIH0sXG4gICAgXCIuY20tcGxhY2Vob2xkZXJcIjoge1xuICAgICAgICBjb2xvcjogXCIjODg4XCIsXG4gICAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwidG9wXCIsXG4gICAgICAgIHVzZXJTZWxlY3Q6IFwibm9uZVwiXG4gICAgfSxcbiAgICBcIi5jbS1oaWdobGlnaHRTcGFjZVwiOiB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogXCJyYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDUwJSA1NSUsICNhYWEgMjAlLCB0cmFuc3BhcmVudCA1JSlcIixcbiAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiBcImNlbnRlclwiLFxuICAgIH0sXG4gICAgXCIuY20taGlnaGxpZ2h0VGFiXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiBgdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWwsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMDBcIiBoZWlnaHQ9XCIyMFwiPjxwYXRoIHN0cm9rZT1cIiUyMzg4OFwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGQ9XCJNMSAxMEgxOTZMMTkwIDVNMTkwIDE1TDE5NiAxME0xOTcgNEwxOTcgMTZcIi8+PC9zdmc+JylgLFxuICAgICAgICBiYWNrZ3JvdW5kU2l6ZTogXCJhdXRvIDEwMCVcIixcbiAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiBcInJpZ2h0IDkwJVwiLFxuICAgICAgICBiYWNrZ3JvdW5kUmVwZWF0OiBcIm5vLXJlcGVhdFwiXG4gICAgfSxcbiAgICBcIi5jbS10cmFpbGluZ1NwYWNlXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiNmZjMzMjI1NVwiXG4gICAgfSxcbiAgICBcIi5jbS1idXR0b25cIjoge1xuICAgICAgICB2ZXJ0aWNhbEFsaWduOiBcIm1pZGRsZVwiLFxuICAgICAgICBjb2xvcjogXCJpbmhlcml0XCIsXG4gICAgICAgIGZvbnRTaXplOiBcIjcwJVwiLFxuICAgICAgICBwYWRkaW5nOiBcIi4yZW0gMWVtXCIsXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIxcHhcIlxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWJ1dHRvblwiOiB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogXCJsaW5lYXItZ3JhZGllbnQoI2VmZjFmNSwgI2Q5ZDlkZilcIixcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjODg4XCIsXG4gICAgICAgIFwiJjphY3RpdmVcIjoge1xuICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudCgjYjRiNGI0LCAjZDBkM2Q2KVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLWJ1dHRvblwiOiB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogXCJsaW5lYXItZ3JhZGllbnQoIzM5MzkzOSwgIzExMSlcIixcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjODg4XCIsXG4gICAgICAgIFwiJjphY3RpdmVcIjoge1xuICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlOiBcImxpbmVhci1ncmFkaWVudCgjMTExLCAjMzMzKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwiLmNtLXRleHRmaWVsZFwiOiB7XG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFwibWlkZGxlXCIsXG4gICAgICAgIGNvbG9yOiBcImluaGVyaXRcIixcbiAgICAgICAgZm9udFNpemU6IFwiNzAlXCIsXG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgc2lsdmVyXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiLjJlbSAuNWVtXCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS10ZXh0ZmllbGRcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwid2hpdGVcIlxuICAgIH0sXG4gICAgXCImZGFyayAuY20tdGV4dGZpZWxkXCI6IHtcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjNTU1XCIsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJpbmhlcml0XCJcbiAgICB9XG59LCBsaWdodERhcmtJRHMpO1xuXG5jb25zdCBvYnNlcnZlT3B0aW9ucyA9IHtcbiAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICBzdWJ0cmVlOiB0cnVlLFxuICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgY2hhcmFjdGVyRGF0YU9sZFZhbHVlOiB0cnVlXG59O1xuLy8gSUUxMSBoYXMgdmVyeSBicm9rZW4gbXV0YXRpb24gb2JzZXJ2ZXJzLCBzbyB3ZSBhbHNvIGxpc3RlbiB0b1xuLy8gRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkIHRoZXJlXG5jb25zdCB1c2VDaGFyRGF0YSA9IGJyb3dzZXIuaWUgJiYgYnJvd3Nlci5pZV92ZXJzaW9uIDw9IDExO1xuY2xhc3MgRE9NT2JzZXJ2ZXIge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lZGl0Q29udGV4dCA9IG51bGw7XG4gICAgICAgIC8vIFRoZSBrbm93biBzZWxlY3Rpb24uIEtlcHQgaW4gb3VyIG93biBvYmplY3QsIGFzIG9wcG9zZWQgdG8ganVzdFxuICAgICAgICAvLyBkaXJlY3RseSBhY2Nlc3NpbmcgdGhlIHNlbGVjdGlvbiBiZWNhdXNlOlxuICAgICAgICAvLyAgLSBTYWZhcmkgZG9lc24ndCByZXBvcnQgdGhlIHJpZ2h0IHNlbGVjdGlvbiBpbiBzaGFkb3cgRE9NXG4gICAgICAgIC8vICAtIFJlYWRpbmcgZnJvbSB0aGUgc2VsZWN0aW9uIGZvcmNlcyBhIERPTSBsYXlvdXRcbiAgICAgICAgLy8gIC0gVGhpcyB3YXksIHdlIGNhbiBpZ25vcmUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50cyBpZiB3ZSBoYXZlXG4gICAgICAgIC8vICAgIGFscmVhZHkgc2VlbiB0aGUgJ25ldycgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2UgPSBuZXcgRE9NU2VsZWN0aW9uU3RhdGU7XG4gICAgICAgIC8vIFNldCB3aGVuIGEgc2VsZWN0aW9uIGNoYW5nZSBpcyBkZXRlY3RlZCwgY2xlYXJlZCBvbiBmbHVzaFxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWxheWVkRmx1c2ggPSAtMTtcbiAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5kZWxheWVkQW5kcm9pZEtleSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5ID0gLTE7XG4gICAgICAgIHRoaXMubGFzdENoYW5nZSA9IDA7XG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0cyA9IFtdO1xuICAgICAgICB0aGlzLmludGVyc2VjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMucmVzaXplU2Nyb2xsID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5nYXBJbnRlcnNlY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmdhcHMgPSBbXTtcbiAgICAgICAgdGhpcy5wcmludFF1ZXJ5ID0gbnVsbDtcbiAgICAgICAgLy8gVGltZW91dCBmb3Igc2NoZWR1bGluZyBjaGVjayBvZiB0aGUgcGFyZW50cyB0aGF0IG5lZWQgc2Nyb2xsIGhhbmRsZXJzXG4gICAgICAgIHRoaXMucGFyZW50Q2hlY2sgPSAtMTtcbiAgICAgICAgdGhpcy5kb20gPSB2aWV3LmNvbnRlbnRET007XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgbXV0IG9mIG11dGF0aW9ucylcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobXV0KTtcbiAgICAgICAgICAgIC8vIElFMTEgd2lsbCBzb21ldGltZXMgKG9uIHR5cGluZyBvdmVyIGEgc2VsZWN0aW9uIG9yXG4gICAgICAgICAgICAvLyBiYWNrc3BhY2luZyBvdXQgYSBzaW5nbGUgY2hhcmFjdGVyIHRleHQgbm9kZSkgY2FsbCB0aGVcbiAgICAgICAgICAgIC8vIG9ic2VydmVyIGNhbGxiYWNrIGJlZm9yZSBhY3R1YWxseSB1cGRhdGluZyB0aGUgRE9NLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFVucmVsYXRlZGx5LCBpT1MgU2FmYXJpIHdpbGwsIHdoZW4gZW5kaW5nIGEgY29tcG9zaXRpb24sXG4gICAgICAgICAgICAvLyBzb21ldGltZXMgZmlyc3QgY2xlYXIgaXQsIGRlbGl2ZXIgdGhlIG11dGF0aW9ucywgYW5kIHRoZW5cbiAgICAgICAgICAgIC8vIHJlaW5zZXJ0IHRoZSBmaW5pc2hlZCB0ZXh0LiBDb2RlTWlycm9yJ3MgaGFuZGxpbmcgb2YgdGhlXG4gICAgICAgICAgICAvLyBkZWxldGlvbiB3aWxsIHByZXZlbnQgdGhlIHJlaW5zZXJ0aW9uIGZyb20gaGFwcGVuaW5nLFxuICAgICAgICAgICAgLy8gYnJlYWtpbmcgY29tcG9zaXRpb24uXG4gICAgICAgICAgICBpZiAoKGJyb3dzZXIuaWUgJiYgYnJvd3Nlci5pZV92ZXJzaW9uIDw9IDExIHx8IGJyb3dzZXIuaW9zICYmIHZpZXcuY29tcG9zaW5nKSAmJlxuICAgICAgICAgICAgICAgIG11dGF0aW9ucy5zb21lKG0gPT4gbS50eXBlID09IFwiY2hpbGRMaXN0XCIgJiYgbS5yZW1vdmVkTm9kZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgIG0udHlwZSA9PSBcImNoYXJhY3RlckRhdGFcIiAmJiBtLm9sZFZhbHVlLmxlbmd0aCA+IG0udGFyZ2V0Lm5vZGVWYWx1ZS5sZW5ndGgpKVxuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHdpbmRvdy5FZGl0Q29udGV4dCAmJiB2aWV3LmNvbnN0cnVjdG9yLkVESVRfQ09OVEVYVCAhPT0gZmFsc2UgJiZcbiAgICAgICAgICAgIC8vIENocm9tZSA8MTI2IGRvZXNuJ3Qgc3VwcG9ydCBpbnZlcnRlZCBzZWxlY3Rpb25zIGluIGVkaXQgY29udGV4dCAoIzEzOTIpXG4gICAgICAgICAgICAhKGJyb3dzZXIuY2hyb21lICYmIGJyb3dzZXIuY2hyb21lX3ZlcnNpb24gPCAxMjYpKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRDb250ZXh0ID0gbmV3IEVkaXRDb250ZXh0TWFuYWdlcih2aWV3KTtcbiAgICAgICAgICAgIGlmICh2aWV3LnN0YXRlLmZhY2V0KGVkaXRhYmxlKSlcbiAgICAgICAgICAgICAgICB2aWV3LmNvbnRlbnRET00uZWRpdENvbnRleHQgPSB0aGlzLmVkaXRDb250ZXh0LmVkaXRDb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2VDaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMub25DaGFyRGF0YSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaCh7IHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImNoYXJhY3RlckRhdGFcIixcbiAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWU6IGV2ZW50LnByZXZWYWx1ZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblJlc2l6ZSA9IHRoaXMub25SZXNpemUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblByaW50ID0gdGhpcy5vblByaW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25TY3JvbGwgPSB0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcyk7XG4gICAgICAgIGlmICh3aW5kb3cubWF0Y2hNZWRpYSlcbiAgICAgICAgICAgIHRoaXMucHJpbnRRdWVyeSA9IHdpbmRvdy5tYXRjaE1lZGlhKFwicHJpbnRcIik7XG4gICAgICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVNjcm9sbCA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICgoKF9hID0gdGhpcy52aWV3LmRvY1ZpZXcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYXN0VXBkYXRlKSA8IERhdGUubm93KCkgLSA3NSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJlc2l6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVNjcm9sbC5vYnNlcnZlKHZpZXcuc2Nyb2xsRE9NKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZFdpbmRvd0xpc3RlbmVycyh0aGlzLndpbiA9IHZpZXcud2luKTtcbiAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICBpZiAodHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb24gPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Q2hlY2sgPCAwKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENoZWNrID0gc2V0VGltZW91dCh0aGlzLmxpc3RlbkZvclNjcm9sbC5iaW5kKHRoaXMpLCAxMDAwKTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmIChlbnRyaWVzW2VudHJpZXMubGVuZ3RoIC0gMV0uaW50ZXJzZWN0aW9uUmF0aW8gPiAwKSAhPSB0aGlzLmludGVyc2VjdGluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVyc2VjdGluZyA9ICF0aGlzLmludGVyc2VjdGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJzZWN0aW5nICE9IHRoaXMudmlldy5pblZpZXcpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2Nyb2xsQ2hhbmdlZChkb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7IHRocmVzaG9sZDogWzAsIC4wMDFdIH0pO1xuICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb24ub2JzZXJ2ZSh0aGlzLmRvbSk7XG4gICAgICAgICAgICB0aGlzLmdhcEludGVyc2VjdGlvbiA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmIGVudHJpZXNbZW50cmllcy5sZW5ndGggLSAxXS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2VkKGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIikpO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuRm9yU2Nyb2xsKCk7XG4gICAgICAgIHRoaXMucmVhZFNlbGVjdGlvblJhbmdlKCk7XG4gICAgfVxuICAgIG9uU2Nyb2xsQ2hhbmdlZChlKSB7XG4gICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLnJ1bkhhbmRsZXJzKFwic2Nyb2xsXCIsIGUpO1xuICAgICAgICBpZiAodGhpcy5pbnRlcnNlY3RpbmcpXG4gICAgICAgICAgICB0aGlzLnZpZXcubWVhc3VyZSgpO1xuICAgIH1cbiAgICBvblNjcm9sbChlKSB7XG4gICAgICAgIGlmICh0aGlzLmludGVyc2VjdGluZylcbiAgICAgICAgICAgIHRoaXMuZmx1c2goZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5lZGl0Q29udGV4dClcbiAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSh0aGlzLmVkaXRDb250ZXh0Lm1lYXN1cmVSZXEpO1xuICAgICAgICB0aGlzLm9uU2Nyb2xsQ2hhbmdlZChlKTtcbiAgICB9XG4gICAgb25SZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZVRpbWVvdXQgPCAwKVxuICAgICAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0ID0gLTE7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgfVxuICAgIG9uUHJpbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKChldmVudC50eXBlID09IFwiY2hhbmdlXCIgfHwgIWV2ZW50LnR5cGUpICYmICFldmVudC5tYXRjaGVzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnZpZXcudmlld1N0YXRlLnByaW50aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWV3Lm1lYXN1cmUoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpZXcudmlld1N0YXRlLnByaW50aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnZpZXcucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICB9XG4gICAgdXBkYXRlR2FwcyhnYXBzKSB7XG4gICAgICAgIGlmICh0aGlzLmdhcEludGVyc2VjdGlvbiAmJiAoZ2Fwcy5sZW5ndGggIT0gdGhpcy5nYXBzLmxlbmd0aCB8fCB0aGlzLmdhcHMuc29tZSgoZywgaSkgPT4gZyAhPSBnYXBzW2ldKSkpIHtcbiAgICAgICAgICAgIHRoaXMuZ2FwSW50ZXJzZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGdhcCBvZiBnYXBzKVxuICAgICAgICAgICAgICAgIHRoaXMuZ2FwSW50ZXJzZWN0aW9uLm9ic2VydmUoZ2FwKTtcbiAgICAgICAgICAgIHRoaXMuZ2FwcyA9IGdhcHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgbGV0IHdhc0NoYW5nZWQgPSB0aGlzLnNlbGVjdGlvbkNoYW5nZWQ7XG4gICAgICAgIGlmICghdGhpcy5yZWFkU2VsZWN0aW9uUmFuZ2UoKSB8fCB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzLCBzZWwgPSB0aGlzLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICBpZiAodmlldy5zdGF0ZS5mYWNldChlZGl0YWJsZSkgPyB2aWV3LnJvb3QuYWN0aXZlRWxlbWVudCAhPSB0aGlzLmRvbSA6ICFoYXNTZWxlY3Rpb24odGhpcy5kb20sIHNlbCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBjb250ZXh0ID0gc2VsLmFuY2hvck5vZGUgJiYgdmlldy5kb2NWaWV3Lm5lYXJlc3Qoc2VsLmFuY2hvck5vZGUpO1xuICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Lmlnbm9yZUV2ZW50KGV2ZW50KSkge1xuICAgICAgICAgICAgaWYgKCF3YXNDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlbGV0aW9ucyBvbiBJRTExIGZpcmUgdGhlaXIgZXZlbnRzIGluIHRoZSB3cm9uZyBvcmRlciwgZ2l2aW5nXG4gICAgICAgIC8vIHVzIGEgc2VsZWN0aW9uIGNoYW5nZSBldmVudCBiZWZvcmUgdGhlIERPTSBjaGFuZ2VzIGFyZVxuICAgICAgICAvLyByZXBvcnRlZC5cbiAgICAgICAgLy8gQ2hyb21lIEFuZHJvaWQgaGFzIGEgc2ltaWxhciBpc3N1ZSB3aGVuIGJhY2tzcGFjaW5nIG91dCBhXG4gICAgICAgIC8vIHNlbGVjdGlvbiAoIzY0NSkuXG4gICAgICAgIGlmICgoYnJvd3Nlci5pZSAmJiBicm93c2VyLmllX3ZlcnNpb24gPD0gMTEgfHwgYnJvd3Nlci5hbmRyb2lkICYmIGJyb3dzZXIuY2hyb21lKSAmJiAhdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5lbXB0eSAmJlxuICAgICAgICAgICAgLy8gKFNlbGVjdGlvbi5pc0NvbGxhcHNlZCBpc24ndCByZWxpYWJsZSBvbiBJRSlcbiAgICAgICAgICAgIHNlbC5mb2N1c05vZGUgJiYgaXNFcXVpdmFsZW50UG9zaXRpb24oc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0LCBzZWwuYW5jaG9yTm9kZSwgc2VsLmFuY2hvck9mZnNldCkpXG4gICAgICAgICAgICB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmZsdXNoKGZhbHNlKTtcbiAgICB9XG4gICAgcmVhZFNlbGVjdGlvblJhbmdlKCkge1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzO1xuICAgICAgICAvLyBUaGUgU2VsZWN0aW9uIG9iamVjdCBpcyBicm9rZW4gaW4gc2hhZG93IHJvb3RzIGluIFNhZmFyaS4gU2VlXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2Rldi9pc3N1ZXMvNDE0XG4gICAgICAgIGxldCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24odmlldy5yb290KTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCByYW5nZSA9IGJyb3dzZXIuc2FmYXJpICYmIHZpZXcucm9vdC5ub2RlVHlwZSA9PSAxMSAmJlxuICAgICAgICAgICAgdmlldy5yb290LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5kb20gJiZcbiAgICAgICAgICAgIHNhZmFyaVNlbGVjdGlvblJhbmdlSGFjayh0aGlzLnZpZXcsIHNlbGVjdGlvbikgfHwgc2VsZWN0aW9uO1xuICAgICAgICBpZiAoIXJhbmdlIHx8IHRoaXMuc2VsZWN0aW9uUmFuZ2UuZXEocmFuZ2UpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgbG9jYWwgPSBoYXNTZWxlY3Rpb24odGhpcy5kb20sIHJhbmdlKTtcbiAgICAgICAgLy8gRGV0ZWN0IHRoZSBzaXR1YXRpb24gd2hlcmUgdGhlIGJyb3dzZXIgaGFzLCBvbiBmb2N1cywgbW92ZWQgdGhlXG4gICAgICAgIC8vIHNlbGVjdGlvbiB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbnRlbnQgZWxlbWVudC4gUmVzZXQgaXQgdG8gdGhlXG4gICAgICAgIC8vIHBvc2l0aW9uIGZyb20gdGhlIGVkaXRvciBzdGF0ZS5cbiAgICAgICAgaWYgKGxvY2FsICYmICF0aGlzLnNlbGVjdGlvbkNoYW5nZWQgJiZcbiAgICAgICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0Rm9jdXNUaW1lID4gRGF0ZS5ub3coKSAtIDIwMCAmJlxuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmxhc3RUb3VjaFRpbWUgPCBEYXRlLm5vdygpIC0gMzAwICYmXG4gICAgICAgICAgICBhdEVsZW1lbnRTdGFydCh0aGlzLmRvbSwgcmFuZ2UpKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5sYXN0Rm9jdXNUaW1lID0gMDtcbiAgICAgICAgICAgIHZpZXcuZG9jVmlldy51cGRhdGVTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGlvblJhbmdlLnNldFJhbmdlKHJhbmdlKTtcbiAgICAgICAgaWYgKGxvY2FsKVxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNldFNlbGVjdGlvblJhbmdlKGFuY2hvciwgaGVhZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblJhbmdlLnNldChhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCwgaGVhZC5ub2RlLCBoZWFkLm9mZnNldCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBjbGVhclNlbGVjdGlvblJhbmdlKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblJhbmdlLnNldChudWxsLCAwLCBudWxsLCAwKTtcbiAgICB9XG4gICAgbGlzdGVuRm9yU2Nyb2xsKCkge1xuICAgICAgICB0aGlzLnBhcmVudENoZWNrID0gLTE7XG4gICAgICAgIGxldCBpID0gMCwgY2hhbmdlZCA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGRvbSA9IHRoaXMuZG9tOyBkb207KSB7XG4gICAgICAgICAgICBpZiAoZG9tLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZWQgJiYgaSA8IHRoaXMuc2Nyb2xsVGFyZ2V0cy5sZW5ndGggJiYgdGhpcy5zY3JvbGxUYXJnZXRzW2ldID09IGRvbSlcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFjaGFuZ2VkKVxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdGhpcy5zY3JvbGxUYXJnZXRzLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKVxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkLnB1c2goZG9tKTtcbiAgICAgICAgICAgICAgICBkb20gPSBkb20uYXNzaWduZWRTbG90IHx8IGRvbS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tLm5vZGVUeXBlID09IDExKSB7IC8vIFNoYWRvdyByb290XG4gICAgICAgICAgICAgICAgZG9tID0gZG9tLmhvc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA8IHRoaXMuc2Nyb2xsVGFyZ2V0cy5sZW5ndGggJiYgIWNoYW5nZWQpXG4gICAgICAgICAgICBjaGFuZ2VkID0gdGhpcy5zY3JvbGxUYXJnZXRzLnNsaWNlKDAsIGkpO1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgZG9tIG9mIHRoaXMuc2Nyb2xsVGFyZ2V0cylcbiAgICAgICAgICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICAgICAgICAgIGZvciAobGV0IGRvbSBvZiB0aGlzLnNjcm9sbFRhcmdldHMgPSBjaGFuZ2VkKVxuICAgICAgICAgICAgICAgIGRvbS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlnbm9yZShmKSB7XG4gICAgICAgIGlmICghdGhpcy5hY3RpdmUpXG4gICAgICAgICAgICByZXR1cm4gZigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgICByZXR1cm4gZigpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmRvbSwgb2JzZXJ2ZU9wdGlvbnMpO1xuICAgICAgICBpZiAodXNlQ2hhckRhdGEpXG4gICAgICAgICAgICB0aGlzLmRvbS5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCIsIHRoaXMub25DaGFyRGF0YSk7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIGlmICh1c2VDaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIiwgdGhpcy5vbkNoYXJEYXRhKTtcbiAgICB9XG4gICAgLy8gVGhyb3cgYXdheSBhbnkgcGVuZGluZyBjaGFuZ2VzXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1JlY29yZHMoKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gQ2hyb21lIEFuZHJvaWQsIGVzcGVjaWFsbHkgaW4gY29tYmluYXRpb24gd2l0aCBHQm9hcmQsIG5vdCBvbmx5XG4gICAgLy8gZG9lc24ndCByZWxpYWJseSBmaXJlIHJlZ3VsYXIga2V5IGV2ZW50cywgYnV0IGFsc28gb2Z0ZW5cbiAgICAvLyBzdXJyb3VuZHMgdGhlIGVmZmVjdCBvZiBlbnRlciBvciBiYWNrc3BhY2Ugd2l0aCBhIGJ1bmNoIG9mXG4gICAgLy8gY29tcG9zaXRpb24gZXZlbnRzIHRoYXQsIHdoZW4gaW50ZXJydXB0ZWQsIGNhdXNlIHRleHQgZHVwbGljYXRpb25cbiAgICAvLyBvciBvdGhlciBraW5kcyBvZiBjb3JydXB0aW9uLiBUaGlzIGhhY2sgbWFrZXMgdGhlIGVkaXRvciBiYWNrIG9mZlxuICAgIC8vIGZyb20gaGFuZGxpbmcgRE9NIGNoYW5nZXMgZm9yIGEgbW9tZW50IHdoZW4gc3VjaCBhIGtleSBpc1xuICAgIC8vIGRldGVjdGVkICh2aWEgYmVmb3JlaW5wdXQgb3Iga2V5ZG93biksIGFuZCB0aGVuIHRyaWVzIHRvIGZsdXNoXG4gICAgLy8gdGhlbSBvciwgaWYgdGhhdCBoYXMgbm8gZWZmZWN0LCBkaXNwYXRjaGVzIHRoZSBnaXZlbiBrZXkuXG4gICAgZGVsYXlBbmRyb2lkS2V5KGtleSwga2V5Q29kZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy5kZWxheWVkQW5kcm9pZEtleSkge1xuICAgICAgICAgICAgbGV0IGZsdXNoID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5O1xuICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckRlbGF5ZWRBbmRyb2lkS2V5KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLmxhc3RLZXlDb2RlID0ga2V5LmtleUNvZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlldy5pbnB1dFN0YXRlLmxhc3RLZXlUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZsdXNoZWQgPSB0aGlzLmZsdXNoKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmx1c2hlZCAmJiBrZXkuZm9yY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh0aGlzLmRvbSwga2V5LmtleSwga2V5LmtleUNvZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmZsdXNoaW5nQW5kcm9pZEtleSA9IHRoaXMudmlldy53aW4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZsdXNoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5jZSBiYWNrc3BhY2UgYmVmb3JlaW5wdXQgaXMgc29tZXRpbWVzIHNpZ25hbGxlZCBzcHVyaW91c2x5LFxuICAgICAgICAvLyBFbnRlciBhbHdheXMgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICAgICAgaWYgKCF0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5IHx8IGtleSA9PSBcIkVudGVyXCIpXG4gICAgICAgICAgICB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5ID0ge1xuICAgICAgICAgICAgICAgIGtleSwga2V5Q29kZSxcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHJ1biB0aGUga2V5IGhhbmRsZXIgd2hlbiBubyBjaGFuZ2VzIGFyZSBkZXRlY3RlZCBpZlxuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXNuJ3QgY29taW5nIHJpZ2h0IGFmdGVyIGFub3RoZXIgY2hhbmdlLCBpbiB3aGljaCBjYXNlXG4gICAgICAgICAgICAgICAgLy8gaXQgaXMgcHJvYmFibHkgcGFydCBvZiBhIHdlaXJkIGNoYWluIG9mIHVwZGF0ZXMsIGFuZCBzaG91bGRcbiAgICAgICAgICAgICAgICAvLyBiZSBpZ25vcmVkIGlmIGl0IHJldHVybnMgdGhlIERPTSB0byBpdHMgcHJldmlvdXMgc3RhdGUuXG4gICAgICAgICAgICAgICAgZm9yY2U6IHRoaXMubGFzdENoYW5nZSA8IERhdGUubm93KCkgLSA1MCB8fCAhISgoX2EgPSB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9yY2UpXG4gICAgICAgICAgICB9O1xuICAgIH1cbiAgICBjbGVhckRlbGF5ZWRBbmRyb2lkS2V5KCkge1xuICAgICAgICB0aGlzLndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZsdXNoaW5nQW5kcm9pZEtleSk7XG4gICAgICAgIHRoaXMuZGVsYXllZEFuZHJvaWRLZXkgPSBudWxsO1xuICAgICAgICB0aGlzLmZsdXNoaW5nQW5kcm9pZEtleSA9IC0xO1xuICAgIH1cbiAgICBmbHVzaFNvb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmRlbGF5ZWRGbHVzaCA8IDApXG4gICAgICAgICAgICB0aGlzLmRlbGF5ZWRGbHVzaCA9IHRoaXMudmlldy53aW4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsgdGhpcy5kZWxheWVkRmx1c2ggPSAtMTsgdGhpcy5mbHVzaCgpOyB9KTtcbiAgICB9XG4gICAgZm9yY2VGbHVzaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsYXllZEZsdXNoID49IDApIHtcbiAgICAgICAgICAgIHRoaXMudmlldy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5kZWxheWVkRmx1c2gpO1xuICAgICAgICAgICAgdGhpcy5kZWxheWVkRmx1c2ggPSAtMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgfVxuICAgIHBlbmRpbmdSZWNvcmRzKCkge1xuICAgICAgICBmb3IgKGxldCBtdXQgb2YgdGhpcy5vYnNlcnZlci50YWtlUmVjb3JkcygpKVxuICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKG11dCk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlO1xuICAgIH1cbiAgICBwcm9jZXNzUmVjb3JkcygpIHtcbiAgICAgICAgbGV0IHJlY29yZHMgPSB0aGlzLnBlbmRpbmdSZWNvcmRzKCk7XG4gICAgICAgIGlmIChyZWNvcmRzLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgbGV0IGZyb20gPSAtMSwgdG8gPSAtMSwgdHlwZU92ZXIgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHRoaXMucmVhZE11dGF0aW9uKHJlY29yZCk7XG4gICAgICAgICAgICBpZiAoIXJhbmdlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJhbmdlLnR5cGVPdmVyKVxuICAgICAgICAgICAgICAgIHR5cGVPdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChmcm9tID09IC0xKSB7XG4gICAgICAgICAgICAgICAgKHsgZnJvbSwgdG8gfSA9IHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gPSBNYXRoLm1pbihyYW5nZS5mcm9tLCBmcm9tKTtcbiAgICAgICAgICAgICAgICB0byA9IE1hdGgubWF4KHJhbmdlLnRvLCB0byk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZnJvbSwgdG8sIHR5cGVPdmVyIH07XG4gICAgfVxuICAgIHJlYWRDaGFuZ2UoKSB7XG4gICAgICAgIGxldCB7IGZyb20sIHRvLCB0eXBlT3ZlciB9ID0gdGhpcy5wcm9jZXNzUmVjb3JkcygpO1xuICAgICAgICBsZXQgbmV3U2VsID0gdGhpcy5zZWxlY3Rpb25DaGFuZ2VkICYmIGhhc1NlbGVjdGlvbih0aGlzLmRvbSwgdGhpcy5zZWxlY3Rpb25SYW5nZSk7XG4gICAgICAgIGlmIChmcm9tIDwgMCAmJiAhbmV3U2VsKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChmcm9tID4gLTEpXG4gICAgICAgICAgICB0aGlzLmxhc3RDaGFuZ2UgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5sYXN0Rm9jdXNUaW1lID0gMDtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBjaGFuZ2UgPSBuZXcgRE9NQ2hhbmdlKHRoaXMudmlldywgZnJvbSwgdG8sIHR5cGVPdmVyKTtcbiAgICAgICAgdGhpcy52aWV3LmRvY1ZpZXcuZG9tQ2hhbmdlZCA9IHsgbmV3U2VsOiBjaGFuZ2UubmV3U2VsID8gY2hhbmdlLm5ld1NlbC5tYWluIDogbnVsbCB9O1xuICAgICAgICByZXR1cm4gY2hhbmdlO1xuICAgIH1cbiAgICAvLyBBcHBseSBwZW5kaW5nIGNoYW5nZXMsIGlmIGFueVxuICAgIGZsdXNoKHJlYWRTZWxlY3Rpb24gPSB0cnVlKSB7XG4gICAgICAgIC8vIENvbXBsZXRlbHkgaG9sZCBvZmYgZmx1c2hpbmcgd2hlbiBwZW5kaW5nIGtleXMgYXJlIHNldFx1MjAxNHRoZSBjb2RlXG4gICAgICAgIC8vIG1hbmFnaW5nIHRob3NlIHdpbGwgbWFrZSBzdXJlIHByb2Nlc3NSZWNvcmRzIGlzIGNhbGxlZCBhbmQgdGhlXG4gICAgICAgIC8vIHZpZXcgaXMgcmVzeW5jaHJvbml6ZWQgYWZ0ZXJcbiAgICAgICAgaWYgKHRoaXMuZGVsYXllZEZsdXNoID49IDAgfHwgdGhpcy5kZWxheWVkQW5kcm9pZEtleSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHJlYWRTZWxlY3Rpb24pXG4gICAgICAgICAgICB0aGlzLnJlYWRTZWxlY3Rpb25SYW5nZSgpO1xuICAgICAgICBsZXQgZG9tQ2hhbmdlID0gdGhpcy5yZWFkQ2hhbmdlKCk7XG4gICAgICAgIGlmICghZG9tQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnRTdGF0ZSA9IHRoaXMudmlldy5zdGF0ZTtcbiAgICAgICAgbGV0IGhhbmRsZWQgPSBhcHBseURPTUNoYW5nZSh0aGlzLnZpZXcsIGRvbUNoYW5nZSk7XG4gICAgICAgIC8vIFRoZSB2aWV3IHdhc24ndCB1cGRhdGVkIGJ1dCBET00vc2VsZWN0aW9uIGNoYW5nZXMgd2VyZSBzZWVuLiBSZXNldCB0aGUgdmlldy5cbiAgICAgICAgaWYgKHRoaXMudmlldy5zdGF0ZSA9PSBzdGFydFN0YXRlICYmXG4gICAgICAgICAgICAoZG9tQ2hhbmdlLmRvbUNoYW5nZWQgfHwgZG9tQ2hhbmdlLm5ld1NlbCAmJiAhZG9tQ2hhbmdlLm5ld1NlbC5tYWluLmVxKHRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbikpKVxuICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgIH1cbiAgICByZWFkTXV0YXRpb24ocmVjKSB7XG4gICAgICAgIGxldCBjVmlldyA9IHRoaXMudmlldy5kb2NWaWV3Lm5lYXJlc3QocmVjLnRhcmdldCk7XG4gICAgICAgIGlmICghY1ZpZXcgfHwgY1ZpZXcuaWdub3JlTXV0YXRpb24ocmVjKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjVmlldy5tYXJrRGlydHkocmVjLnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIpO1xuICAgICAgICBpZiAocmVjLnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIpXG4gICAgICAgICAgICBjVmlldy5mbGFncyB8PSA0IC8qIFZpZXdGbGFnLkF0dHJzRGlydHkgKi87XG4gICAgICAgIGlmIChyZWMudHlwZSA9PSBcImNoaWxkTGlzdFwiKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRCZWZvcmUgPSBmaW5kQ2hpbGQoY1ZpZXcsIHJlYy5wcmV2aW91c1NpYmxpbmcgfHwgcmVjLnRhcmdldC5wcmV2aW91c1NpYmxpbmcsIC0xKTtcbiAgICAgICAgICAgIGxldCBjaGlsZEFmdGVyID0gZmluZENoaWxkKGNWaWV3LCByZWMubmV4dFNpYmxpbmcgfHwgcmVjLnRhcmdldC5uZXh0U2libGluZywgMSk7XG4gICAgICAgICAgICByZXR1cm4geyBmcm9tOiBjaGlsZEJlZm9yZSA/IGNWaWV3LnBvc0FmdGVyKGNoaWxkQmVmb3JlKSA6IGNWaWV3LnBvc0F0U3RhcnQsXG4gICAgICAgICAgICAgICAgdG86IGNoaWxkQWZ0ZXIgPyBjVmlldy5wb3NCZWZvcmUoY2hpbGRBZnRlcikgOiBjVmlldy5wb3NBdEVuZCwgdHlwZU92ZXI6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVjLnR5cGUgPT0gXCJjaGFyYWN0ZXJEYXRhXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IGNWaWV3LnBvc0F0U3RhcnQsIHRvOiBjVmlldy5wb3NBdEVuZCwgdHlwZU92ZXI6IHJlYy50YXJnZXQubm9kZVZhbHVlID09IHJlYy5vbGRWYWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0V2luZG93KHdpbikge1xuICAgICAgICBpZiAod2luICE9IHRoaXMud2luKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVdpbmRvd0xpc3RlbmVycyh0aGlzLndpbik7XG4gICAgICAgICAgICB0aGlzLndpbiA9IHdpbjtcbiAgICAgICAgICAgIHRoaXMuYWRkV2luZG93TGlzdGVuZXJzKHRoaXMud2luKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRXaW5kb3dMaXN0ZW5lcnMod2luKSB7XG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMub25SZXNpemUpO1xuICAgICAgICBpZiAodGhpcy5wcmludFF1ZXJ5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmludFF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgICAgICAgdGhpcy5wcmludFF1ZXJ5LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgdGhpcy5vblByaW50KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLnByaW50UXVlcnkuYWRkTGlzdGVuZXIodGhpcy5vblByaW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXByaW50XCIsIHRoaXMub25QcmludCk7XG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB3aW4uZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgICB9XG4gICAgcmVtb3ZlV2luZG93TGlzdGVuZXJzKHdpbikge1xuICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5vblJlc2l6ZSk7XG4gICAgICAgIGlmICh0aGlzLnByaW50UXVlcnkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByaW50UXVlcnkucmVtb3ZlRXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICAgICAgICB0aGlzLnByaW50UXVlcnkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCB0aGlzLm9uUHJpbnQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMucHJpbnRRdWVyeS5yZW1vdmVMaXN0ZW5lcih0aGlzLm9uUHJpbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JlcHJpbnRcIiwgdGhpcy5vblByaW50KTtcbiAgICAgICAgd2luLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuZWRpdENvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICBpZiAodXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoZWRpdGFibGUpICE9IHVwZGF0ZS5zdGF0ZS5mYWNldChlZGl0YWJsZSkpXG4gICAgICAgICAgICAgICAgdXBkYXRlLnZpZXcuY29udGVudERPTS5lZGl0Q29udGV4dCA9IHVwZGF0ZS5zdGF0ZS5mYWNldChlZGl0YWJsZSkgPyB0aGlzLmVkaXRDb250ZXh0LmVkaXRDb250ZXh0IDogbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgIChfYSA9IHRoaXMuaW50ZXJzZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGlzY29ubmVjdCgpO1xuICAgICAgICAoX2IgPSB0aGlzLmdhcEludGVyc2VjdGlvbikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgKF9jID0gdGhpcy5yZXNpemVTY3JvbGwpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5kaXNjb25uZWN0KCk7XG4gICAgICAgIGZvciAobGV0IGRvbSBvZiB0aGlzLnNjcm9sbFRhcmdldHMpXG4gICAgICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICAgICAgdGhpcy5yZW1vdmVXaW5kb3dMaXN0ZW5lcnModGhpcy53aW4pO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wYXJlbnRDaGVjayk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVvdXQpO1xuICAgICAgICB0aGlzLndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmRlbGF5ZWRGbHVzaCk7XG4gICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5KTtcbiAgICAgICAgaWYgKHRoaXMuZWRpdENvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5jb250ZW50RE9NLmVkaXRDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZmluZENoaWxkKGNWaWV3LCBkb20sIGRpcikge1xuICAgIHdoaWxlIChkb20pIHtcbiAgICAgICAgbGV0IGN1clZpZXcgPSBDb250ZW50Vmlldy5nZXQoZG9tKTtcbiAgICAgICAgaWYgKGN1clZpZXcgJiYgY3VyVmlldy5wYXJlbnQgPT0gY1ZpZXcpXG4gICAgICAgICAgICByZXR1cm4gY3VyVmlldztcbiAgICAgICAgbGV0IHBhcmVudCA9IGRvbS5wYXJlbnROb2RlO1xuICAgICAgICBkb20gPSBwYXJlbnQgIT0gY1ZpZXcuZG9tID8gcGFyZW50IDogZGlyID4gMCA/IGRvbS5uZXh0U2libGluZyA6IGRvbS5wcmV2aW91c1NpYmxpbmc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gYnVpbGRTZWxlY3Rpb25SYW5nZUZyb21SYW5nZSh2aWV3LCByYW5nZSkge1xuICAgIGxldCBhbmNob3JOb2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXIsIGFuY2hvck9mZnNldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgIGxldCBmb2N1c05vZGUgPSByYW5nZS5lbmRDb250YWluZXIsIGZvY3VzT2Zmc2V0ID0gcmFuZ2UuZW5kT2Zmc2V0O1xuICAgIGxldCBjdXJBbmNob3IgPSB2aWV3LmRvY1ZpZXcuZG9tQXRQb3Modmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5hbmNob3IpO1xuICAgIC8vIFNpbmNlIHN1Y2ggYSByYW5nZSBkb2Vzbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gYW5jaG9yIGFuZCBoZWFkLFxuICAgIC8vIHVzZSBhIGhldXJpc3RpYyB0aGF0IGZsaXBzIGl0IGFyb3VuZCBpZiBpdHMgZW5kIG1hdGNoZXMgdGhlXG4gICAgLy8gY3VycmVudCBhbmNob3IuXG4gICAgaWYgKGlzRXF1aXZhbGVudFBvc2l0aW9uKGN1ckFuY2hvci5ub2RlLCBjdXJBbmNob3Iub2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSlcbiAgICAgICAgW2FuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldF0gPSBbZm9jdXNOb2RlLCBmb2N1c09mZnNldCwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0XTtcbiAgICByZXR1cm4geyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfTtcbn1cbi8vIFVzZWQgdG8gd29yayBhcm91bmQgYSBTYWZhcmkgU2VsZWN0aW9uL3NoYWRvdyBET00gYnVnICgjNDE0KVxuZnVuY3Rpb24gc2FmYXJpU2VsZWN0aW9uUmFuZ2VIYWNrKHZpZXcsIHNlbGVjdGlvbikge1xuICAgIGlmIChzZWxlY3Rpb24uZ2V0Q29tcG9zZWRSYW5nZXMpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gc2VsZWN0aW9uLmdldENvbXBvc2VkUmFuZ2VzKHZpZXcucm9vdClbMF07XG4gICAgICAgIGlmIChyYW5nZSlcbiAgICAgICAgICAgIHJldHVybiBidWlsZFNlbGVjdGlvblJhbmdlRnJvbVJhbmdlKHZpZXcsIHJhbmdlKTtcbiAgICB9XG4gICAgbGV0IGZvdW5kID0gbnVsbDtcbiAgICAvLyBCZWNhdXNlIFNhZmFyaSAoYXQgbGVhc3QgaW4gMjAxOC0yMDIxKSBkb2Vzbid0IHByb3ZpZGUgcmVndWxhclxuICAgIC8vIGFjY2VzcyB0byB0aGUgc2VsZWN0aW9uIGluc2lkZSBhIHNoYWRvd3Jvb3QsIHdlIGhhdmUgdG8gcGVyZm9ybSBhXG4gICAgLy8gcmlkaWN1bG91cyBoYWNrIHRvIGdldCBhdCBpdFx1MjAxNHVzaW5nIGBleGVjQ29tbWFuZGAgdG8gdHJpZ2dlciBhXG4gICAgLy8gYGJlZm9yZUlucHV0YCBldmVudCBzbyB0aGF0IHdlIGNhbiByZWFkIHRoZSB0YXJnZXQgcmFuZ2UgZnJvbSB0aGVcbiAgICAvLyBldmVudC5cbiAgICBmdW5jdGlvbiByZWFkKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBmb3VuZCA9IGV2ZW50LmdldFRhcmdldFJhbmdlcygpWzBdO1xuICAgIH1cbiAgICB2aWV3LmNvbnRlbnRET00uYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZWlucHV0XCIsIHJlYWQsIHRydWUpO1xuICAgIHZpZXcuZG9tLm93bmVyRG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJpbmRlbnRcIik7XG4gICAgdmlldy5jb250ZW50RE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCByZWFkLCB0cnVlKTtcbiAgICByZXR1cm4gZm91bmQgPyBidWlsZFNlbGVjdGlvblJhbmdlRnJvbVJhbmdlKHZpZXcsIGZvdW5kKSA6IG51bGw7XG59XG5jbGFzcyBFZGl0Q29udGV4dE1hbmFnZXIge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgLy8gVGhlIGRvY3VtZW50IHdpbmRvdyBmb3Igd2hpY2ggdGhlIHRleHQgaW4gdGhlIGNvbnRleHQgaXNcbiAgICAgICAgLy8gbWFpbnRhaW5lZC4gRm9yIGxhcmdlIGRvY3VtZW50cywgdGhpcyBtYXkgYmUgc21hbGxlciB0aGFuIHRoZVxuICAgICAgICAvLyBlZGl0b3IgZG9jdW1lbnQuIFRoaXMgd2luZG93IGFsd2F5cyBpbmNsdWRlcyB0aGUgc2VsZWN0aW9uIGhlYWQuXG4gICAgICAgIHRoaXMuZnJvbSA9IDA7XG4gICAgICAgIHRoaXMudG8gPSAwO1xuICAgICAgICAvLyBXaGVuIGFwcGx5aW5nIGEgdHJhbnNhY3Rpb24sIHRoaXMgaXMgdXNlZCB0byBjb21wYXJlIHRoZSBjaGFuZ2VcbiAgICAgICAgLy8gbWFkZSB0byB0aGUgY29udGV4dCBjb250ZW50IHRvIHRoZSBjaGFuZ2UgaW4gdGhlIHRyYW5zYWN0aW9uIGluXG4gICAgICAgIC8vIG9yZGVyIHRvIG1ha2UgdGhlIG1pbmltYWwgY2hhbmdlcyB0byB0aGUgY29udGV4dCAoc2luY2UgdG91Y2hpbmdcbiAgICAgICAgLy8gdGhhdCBzb21ldGltZXMgYnJlYWtzIHNlcmllcyBvZiBtdWx0aXBsZSBlZGl0cyBtYWRlIGZvciBhIHNpbmdsZVxuICAgICAgICAvLyB1c2VyIGFjdGlvbiBvbiBzb21lIEFuZHJvaWQga2V5Ym9hcmRzKVxuICAgICAgICB0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIEtsdWRnZSB0byB3b3JrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IEVkaXRDb250ZXh0IGRvZXMgbm90IHJlc3BvbmRcbiAgICAgICAgLy8gd2VsbCB0byBoYXZpbmcgaXRzIGNvbnRlbnQgdXBkYXRlZCBkdXJpbmcgYSBjb21wb3NpdGlvbiAoc2VlICMxNDcyKVxuICAgICAgICB0aGlzLmNvbXBvc2luZyA9IG51bGw7XG4gICAgICAgIHRoaXMucmVzZXRSYW5nZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLmVkaXRDb250ZXh0ID0gbmV3IHdpbmRvdy5FZGl0Q29udGV4dCh7XG4gICAgICAgICAgICB0ZXh0OiB2aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZyh0aGlzLmZyb20sIHRoaXMudG8pLFxuICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQ6IHRoaXMudG9Db250ZXh0UG9zKE1hdGgubWF4KHRoaXMuZnJvbSwgTWF0aC5taW4odGhpcy50bywgdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5hbmNob3IpKSksXG4gICAgICAgICAgICBzZWxlY3Rpb25FbmQ6IHRoaXMudG9Db250ZXh0UG9zKHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZClcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMudGV4dHVwZGF0ZSA9IGUgPT4ge1xuICAgICAgICAgICAgbGV0IG1haW4gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLCB7IGFuY2hvciwgaGVhZCB9ID0gbWFpbjtcbiAgICAgICAgICAgIGxldCBmcm9tID0gdGhpcy50b0VkaXRvclBvcyhlLnVwZGF0ZVJhbmdlU3RhcnQpLCB0byA9IHRoaXMudG9FZGl0b3JQb3MoZS51cGRhdGVSYW5nZUVuZCk7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwICYmICF0aGlzLmNvbXBvc2luZylcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvc2luZyA9IHsgY29udGV4dEJhc2U6IGUudXBkYXRlUmFuZ2VTdGFydCwgZWRpdG9yQmFzZTogZnJvbSwgZHJpZnRlZDogZmFsc2UgfTtcbiAgICAgICAgICAgIGxldCBjaGFuZ2UgPSB7IGZyb20sIHRvLCBpbnNlcnQ6IFRleHQub2YoZS50ZXh0LnNwbGl0KFwiXFxuXCIpKSB9O1xuICAgICAgICAgICAgLy8gSWYgdGhlIHdpbmRvdyBkb2Vzbid0IGluY2x1ZGUgdGhlIGFuY2hvciwgYXNzdW1lIGNoYW5nZXNcbiAgICAgICAgICAgIC8vIGFkamFjZW50IHRvIGEgc2lkZSBnbyB1cCB0byB0aGUgYW5jaG9yLlxuICAgICAgICAgICAgaWYgKGNoYW5nZS5mcm9tID09IHRoaXMuZnJvbSAmJiBhbmNob3IgPCB0aGlzLmZyb20pXG4gICAgICAgICAgICAgICAgY2hhbmdlLmZyb20gPSBhbmNob3I7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGFuZ2UudG8gPT0gdGhpcy50byAmJiBhbmNob3IgPiB0aGlzLnRvKVxuICAgICAgICAgICAgICAgIGNoYW5nZS50byA9IGFuY2hvcjtcbiAgICAgICAgICAgIC8vIEVkaXQgY29udGV4dHMgc29tZXRpbWVzIGZpcmUgZW1wdHkgY2hhbmdlc1xuICAgICAgICAgICAgaWYgKGNoYW5nZS5mcm9tID09IGNoYW5nZS50byAmJiAhY2hhbmdlLmluc2VydC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3U2VsID0gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZSh0aGlzLnRvRWRpdG9yUG9zKGUuc2VsZWN0aW9uU3RhcnQpLCB0aGlzLnRvRWRpdG9yUG9zKGUuc2VsZWN0aW9uRW5kKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXdTZWwubWFpbi5lcShtYWluKSlcbiAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IHNlbGVjdGlvbjogbmV3U2VsLCB1c2VyRXZlbnQ6IFwic2VsZWN0XCIgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChicm93c2VyLm1hYyB8fCBicm93c2VyLmFuZHJvaWQpICYmIGNoYW5nZS5mcm9tID09IGhlYWQgLSAxICYmXG4gICAgICAgICAgICAgICAgL15cXC4gPyQvLnRlc3QoZS50ZXh0KSAmJiB2aWV3LmNvbnRlbnRET00uZ2V0QXR0cmlidXRlKFwiYXV0b2NvcnJlY3RcIikgPT0gXCJvZmZcIilcbiAgICAgICAgICAgICAgICBjaGFuZ2UgPSB7IGZyb20sIHRvLCBpbnNlcnQ6IFRleHQub2YoW2UudGV4dC5yZXBsYWNlKFwiLlwiLCBcIiBcIildKSB9O1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ29udGV4dENoYW5nZSA9IGNoYW5nZTtcbiAgICAgICAgICAgIGlmICghdmlldy5zdGF0ZS5yZWFkT25seSkge1xuICAgICAgICAgICAgICAgIGxldCBuZXdMZW4gPSB0aGlzLnRvIC0gdGhpcy5mcm9tICsgKGNoYW5nZS50byAtIGNoYW5nZS5mcm9tICsgY2hhbmdlLmluc2VydC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGFwcGx5RE9NQ2hhbmdlSW5uZXIodmlldywgY2hhbmdlLCBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKHRoaXMudG9FZGl0b3JQb3MoZS5zZWxlY3Rpb25TdGFydCwgbmV3TGVuKSwgdGhpcy50b0VkaXRvclBvcyhlLnNlbGVjdGlvbkVuZCwgbmV3TGVuKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdGhlIHRyYW5zYWN0aW9uIGRpZG4ndCBmbHVzaCBvdXIgY2hhbmdlLCByZXZlcnQgaXQgc29cbiAgICAgICAgICAgIC8vIHRoYXQgdGhlIGNvbnRleHQgaXMgaW4gc3luYyB3aXRoIHRoZSBlZGl0b3Igc3RhdGUgYWdhaW4uXG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ29udGV4dENoYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJ0UGVuZGluZyh2aWV3LnN0YXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbih2aWV3LnN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVycy5jaGFyYWN0ZXJib3VuZHN1cGRhdGUgPSBlID0+IHtcbiAgICAgICAgICAgIGxldCByZWN0cyA9IFtdLCBwcmV2ID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnRvRWRpdG9yUG9zKGUucmFuZ2VTdGFydCksIGVuZCA9IHRoaXMudG9FZGl0b3JQb3MoZS5yYW5nZUVuZCk7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByZWN0ID0gdmlldy5jb29yZHNGb3JDaGFyKGkpO1xuICAgICAgICAgICAgICAgIHByZXYgPSAocmVjdCAmJiBuZXcgRE9NUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LCByZWN0LmJvdHRvbSAtIHJlY3QudG9wKSlcbiAgICAgICAgICAgICAgICAgICAgfHwgcHJldiB8fCBuZXcgRE9NUmVjdDtcbiAgICAgICAgICAgICAgICByZWN0cy5wdXNoKHByZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGV4dC51cGRhdGVDaGFyYWN0ZXJCb3VuZHMoZS5yYW5nZVN0YXJ0LCByZWN0cyk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlcnMudGV4dGZvcm1hdHVwZGF0ZSA9IGUgPT4ge1xuICAgICAgICAgICAgbGV0IGRlY28gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGZvcm1hdCBvZiBlLmdldFRleHRGb3JtYXRzKCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGluZVN0eWxlID0gZm9ybWF0LnVuZGVybGluZVN0eWxlLCB0aGlja25lc3MgPSBmb3JtYXQudW5kZXJsaW5lVGhpY2tuZXNzO1xuICAgICAgICAgICAgICAgIGlmIChsaW5lU3R5bGUgIT0gXCJOb25lXCIgJiYgdGhpY2tuZXNzICE9IFwiTm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmcm9tID0gdGhpcy50b0VkaXRvclBvcyhmb3JtYXQucmFuZ2VTdGFydCksIHRvID0gdGhpcy50b0VkaXRvclBvcyhmb3JtYXQucmFuZ2VFbmQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbSA8IHRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgJHtsaW5lU3R5bGUgPT0gXCJEYXNoZWRcIiA/IFwiZGFzaGVkIFwiIDogbGluZVN0eWxlID09IFwiU3F1aWdnbGVcIiA/IFwid2F2eSBcIiA6IFwiXCJ9JHt0aGlja25lc3MgPT0gXCJUaGluXCIgPyAxIDogMn1weGA7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvLnB1c2goRGVjb3JhdGlvbi5tYXJrKHsgYXR0cmlidXRlczogeyBzdHlsZSB9IH0pLnJhbmdlKGZyb20sIHRvKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogc2V0RWRpdENvbnRleHRGb3JtYXR0aW5nLm9mKERlY29yYXRpb24uc2V0KGRlY28pKSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVycy5jb21wb3NpdGlvbnN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPCAwKSB7XG4gICAgICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA9IDA7XG4gICAgICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmNvbXBvc2l0aW9uZW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA9IC0xO1xuICAgICAgICAgICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgZHJpZnRlZCB9ID0gdGhpcy5jb21wb3Npbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb3NpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChkcmlmdGVkKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KHZpZXcuc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGxldCBldmVudCBpbiB0aGlzLmhhbmRsZXJzKVxuICAgICAgICAgICAgY29udGV4dC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCB0aGlzLmhhbmRsZXJzW2V2ZW50XSk7XG4gICAgICAgIHRoaXMubWVhc3VyZVJlcSA9IHsgcmVhZDogdmlldyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0Q29udGV4dC51cGRhdGVDb250cm9sQm91bmRzKHZpZXcuY29udGVudERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgICAgICAgICAgICAgbGV0IHNlbCA9IGdldFNlbGVjdGlvbih2aWV3LnJvb3QpO1xuICAgICAgICAgICAgICAgIGlmIChzZWwgJiYgc2VsLnJhbmdlQ291bnQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQudXBkYXRlU2VsZWN0aW9uQm91bmRzKHNlbC5nZXRSYW5nZUF0KDApLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgICAgIH0gfTtcbiAgICB9XG4gICAgYXBwbHlFZGl0cyh1cGRhdGUpIHtcbiAgICAgICAgbGV0IG9mZiA9IDAsIGFib3J0ID0gZmFsc2UsIHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlO1xuICAgICAgICB1cGRhdGUuY2hhbmdlcy5pdGVyQ2hhbmdlcygoZnJvbUEsIHRvQSwgX2Zyb21CLCBfdG9CLCBpbnNlcnQpID0+IHtcbiAgICAgICAgICAgIGlmIChhYm9ydClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgZExlbiA9IGluc2VydC5sZW5ndGggLSAodG9BIC0gZnJvbUEpO1xuICAgICAgICAgICAgaWYgKHBlbmRpbmcgJiYgdG9BID49IHBlbmRpbmcudG8pIHtcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZy5mcm9tID09IGZyb21BICYmIHBlbmRpbmcudG8gPT0gdG9BICYmIHBlbmRpbmcuaW5zZXJ0LmVxKGluc2VydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2UgPSBudWxsOyAvLyBNYXRjaFxuICAgICAgICAgICAgICAgICAgICBvZmYgKz0gZExlbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50byArPSBkTGVuO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBNaXNtYXRjaCwgcmV2ZXJ0XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldmVydFBlbmRpbmcodXBkYXRlLnN0YXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcm9tQSArPSBvZmY7XG4gICAgICAgICAgICB0b0EgKz0gb2ZmO1xuICAgICAgICAgICAgaWYgKHRvQSA8PSB0aGlzLmZyb20pIHsgLy8gQmVmb3JlIHRoZSB3aW5kb3dcbiAgICAgICAgICAgICAgICB0aGlzLmZyb20gKz0gZExlbjtcbiAgICAgICAgICAgICAgICB0aGlzLnRvICs9IGRMZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChmcm9tQSA8IHRoaXMudG8pIHsgLy8gT3ZlcmxhcHMgd2l0aCB3aW5kb3dcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUEgPCB0aGlzLmZyb20gfHwgdG9BID4gdGhpcy50byB8fCAodGhpcy50byAtIHRoaXMuZnJvbSkgKyBpbnNlcnQubGVuZ3RoID4gMzAwMDAgLyogQ3hWcC5NYXhTaXplICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3J0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRDb250ZXh0LnVwZGF0ZVRleHQodGhpcy50b0NvbnRleHRQb3MoZnJvbUEpLCB0aGlzLnRvQ29udGV4dFBvcyh0b0EpLCBpbnNlcnQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy50byArPSBkTGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmICs9IGRMZW47XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocGVuZGluZyAmJiAhYWJvcnQpXG4gICAgICAgICAgICB0aGlzLnJldmVydFBlbmRpbmcodXBkYXRlLnN0YXRlKTtcbiAgICAgICAgcmV0dXJuICFhYm9ydDtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBsZXQgcmV2ZXJ0ZWQgPSB0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlLCBzdGFydFNlbCA9IHVwZGF0ZS5zdGFydFN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgICAgICBpZiAodGhpcy5jb21wb3NpbmcgJiZcbiAgICAgICAgICAgICh0aGlzLmNvbXBvc2luZy5kcmlmdGVkIHx8XG4gICAgICAgICAgICAgICAgKCF1cGRhdGUuY2hhbmdlcy50b3VjaGVzUmFuZ2Uoc3RhcnRTZWwuZnJvbSwgc3RhcnRTZWwudG8pICYmXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZS50cmFuc2FjdGlvbnMuc29tZSh0ciA9PiAhdHIuaXNVc2VyRXZlbnQoXCJpbnB1dC50eXBlXCIpICYmIHRyLmNoYW5nZXMudG91Y2hlc1JhbmdlKHRoaXMuZnJvbSwgdGhpcy50bykpKSkpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9zaW5nLmRyaWZ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb21wb3NpbmcuZWRpdG9yQmFzZSA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh0aGlzLmNvbXBvc2luZy5lZGl0b3JCYXNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGhpcy5hcHBseUVkaXRzKHVwZGF0ZSkgfHwgIXRoaXMucmFuZ2VJc1ZhbGlkKHVwZGF0ZS5zdGF0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NvbnRleHRDaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yZXNldCh1cGRhdGUuc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5zZWxlY3Rpb25TZXQgfHwgcmV2ZXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKHVwZGF0ZS5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQgfHwgdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldClcbiAgICAgICAgICAgIHVwZGF0ZS52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgfVxuICAgIHJlc2V0UmFuZ2Uoc3RhdGUpIHtcbiAgICAgICAgbGV0IHsgaGVhZCB9ID0gc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgIHRoaXMuZnJvbSA9IE1hdGgubWF4KDAsIGhlYWQgLSAxMDAwMCAvKiBDeFZwLk1hcmdpbiAqLyk7XG4gICAgICAgIHRoaXMudG8gPSBNYXRoLm1pbihzdGF0ZS5kb2MubGVuZ3RoLCBoZWFkICsgMTAwMDAgLyogQ3hWcC5NYXJnaW4gKi8pO1xuICAgIH1cbiAgICByZXNldChzdGF0ZSkge1xuICAgICAgICB0aGlzLnJlc2V0UmFuZ2Uoc3RhdGUpO1xuICAgICAgICB0aGlzLmVkaXRDb250ZXh0LnVwZGF0ZVRleHQoMCwgdGhpcy5lZGl0Q29udGV4dC50ZXh0Lmxlbmd0aCwgc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRoaXMuZnJvbSwgdGhpcy50bykpO1xuICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihzdGF0ZSk7XG4gICAgfVxuICAgIHJldmVydFBlbmRpbmcoc3RhdGUpIHtcbiAgICAgICAgbGV0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlO1xuICAgICAgICB0aGlzLnBlbmRpbmdDb250ZXh0Q2hhbmdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5lZGl0Q29udGV4dC51cGRhdGVUZXh0KHRoaXMudG9Db250ZXh0UG9zKHBlbmRpbmcuZnJvbSksIHRoaXMudG9Db250ZXh0UG9zKHBlbmRpbmcuZnJvbSArIHBlbmRpbmcuaW5zZXJ0Lmxlbmd0aCksIHN0YXRlLmRvYy5zbGljZVN0cmluZyhwZW5kaW5nLmZyb20sIHBlbmRpbmcudG8pKTtcbiAgICB9XG4gICAgc2V0U2VsZWN0aW9uKHN0YXRlKSB7XG4gICAgICAgIGxldCB7IG1haW4gfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy50b0NvbnRleHRQb3MoTWF0aC5tYXgodGhpcy5mcm9tLCBNYXRoLm1pbih0aGlzLnRvLCBtYWluLmFuY2hvcikpKTtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMudG9Db250ZXh0UG9zKG1haW4uaGVhZCk7XG4gICAgICAgIGlmICh0aGlzLmVkaXRDb250ZXh0LnNlbGVjdGlvblN0YXJ0ICE9IHN0YXJ0IHx8IHRoaXMuZWRpdENvbnRleHQuc2VsZWN0aW9uRW5kICE9IGVuZClcbiAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQudXBkYXRlU2VsZWN0aW9uKHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgICByYW5nZUlzVmFsaWQoc3RhdGUpIHtcbiAgICAgICAgbGV0IHsgaGVhZCB9ID0gc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgIHJldHVybiAhKHRoaXMuZnJvbSA+IDAgJiYgaGVhZCAtIHRoaXMuZnJvbSA8IDUwMCAvKiBDeFZwLk1pbk1hcmdpbiAqLyB8fFxuICAgICAgICAgICAgdGhpcy50byA8IHN0YXRlLmRvYy5sZW5ndGggJiYgdGhpcy50byAtIGhlYWQgPCA1MDAgLyogQ3hWcC5NaW5NYXJnaW4gKi8gfHxcbiAgICAgICAgICAgIHRoaXMudG8gLSB0aGlzLmZyb20gPiAxMDAwMCAvKiBDeFZwLk1hcmdpbiAqLyAqIDMpO1xuICAgIH1cbiAgICB0b0VkaXRvclBvcyhjb250ZXh0UG9zLCBjbGlwTGVuID0gdGhpcy50byAtIHRoaXMuZnJvbSkge1xuICAgICAgICBjb250ZXh0UG9zID0gTWF0aC5taW4oY29udGV4dFBvcywgY2xpcExlbik7XG4gICAgICAgIGxldCBjID0gdGhpcy5jb21wb3Npbmc7XG4gICAgICAgIHJldHVybiBjICYmIGMuZHJpZnRlZCA/IGMuZWRpdG9yQmFzZSArIChjb250ZXh0UG9zIC0gYy5jb250ZXh0QmFzZSkgOiBjb250ZXh0UG9zICsgdGhpcy5mcm9tO1xuICAgIH1cbiAgICB0b0NvbnRleHRQb3MoZWRpdG9yUG9zKSB7XG4gICAgICAgIGxldCBjID0gdGhpcy5jb21wb3Npbmc7XG4gICAgICAgIHJldHVybiBjICYmIGMuZHJpZnRlZCA/IGMuY29udGV4dEJhc2UgKyAoZWRpdG9yUG9zIC0gYy5lZGl0b3JCYXNlKSA6IGVkaXRvclBvcyAtIHRoaXMuZnJvbTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChsZXQgZXZlbnQgaW4gdGhpcy5oYW5kbGVycylcbiAgICAgICAgICAgIHRoaXMuZWRpdENvbnRleHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgdGhpcy5oYW5kbGVyc1tldmVudF0pO1xuICAgIH1cbn1cblxuLy8gVGhlIGVkaXRvcidzIHVwZGF0ZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6XG4vL1xuLy8gICAgIElkbGUgXHUyMTkyIFVwZGF0aW5nIFx1MjFDNiBJZGxlICh1bmNoZWNrZWQpIFx1MjE5MiBNZWFzdXJpbmcgXHUyMTkyIElkbGVcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTIxOTEgICAgICBcdTIxOTNcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGluZyAobWVhc3VyZSlcbi8vXG4vLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICdJZGxlJyBhbmQgJ0lkbGUgKHVuY2hlY2tlZCknIGxpZXMgaW5cbi8vIHdoZXRoZXIgYSBsYXlvdXQgY2hlY2sgaGFzIGJlZW4gc2NoZWR1bGVkLiBBIHJlZ3VsYXIgdXBkYXRlIHRocm91Z2hcbi8vIHRoZSBgdXBkYXRlYCBtZXRob2QgdXBkYXRlcyB0aGUgRE9NIGluIGEgd3JpdGUtb25seSBmYXNoaW9uLCBhbmRcbi8vIHJlbGllcyBvbiBhIGNoZWNrIChzY2hlZHVsZWQgd2l0aCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCkgdG8gbWFrZVxuLy8gc3VyZSBldmVyeXRoaW5nIGlzIHdoZXJlIGl0IHNob3VsZCBiZSBhbmQgdGhlIHZpZXdwb3J0IGNvdmVycyB0aGVcbi8vIHZpc2libGUgY29kZS4gVGhhdCBjaGVjayBjb250aW51ZXMgdG8gbWVhc3VyZSBhbmQgdGhlbiBvcHRpb25hbGx5XG4vLyB1cGRhdGUgdW50aWwgaXQgcmVhY2hlcyBhIGNvaGVyZW50IHN0YXRlLlxuLyoqXG5BbiBlZGl0b3IgdmlldyByZXByZXNlbnRzIHRoZSBlZGl0b3IncyB1c2VyIGludGVyZmFjZS4gSXQgaG9sZHNcbnRoZSBlZGl0YWJsZSBET00gc3VyZmFjZSwgYW5kIHBvc3NpYmx5IG90aGVyIGVsZW1lbnRzIHN1Y2ggYXMgdGhlXG5saW5lIG51bWJlciBndXR0ZXIuIEl0IGhhbmRsZXMgZXZlbnRzIGFuZCBkaXNwYXRjaGVzIHN0YXRlXG50cmFuc2FjdGlvbnMgZm9yIGVkaXRpbmcgYWN0aW9ucy5cbiovXG5jbGFzcyBFZGl0b3JWaWV3IHtcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBnZXQgc3RhdGUoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5zdGF0ZTsgfVxuICAgIC8qKlxuICAgIFRvIGJlIGFibGUgdG8gZGlzcGxheSBsYXJnZSBkb2N1bWVudHMgd2l0aG91dCBjb25zdW1pbmcgdG9vIG11Y2hcbiAgICBtZW1vcnkgb3Igb3ZlcmxvYWRpbmcgdGhlIGJyb3dzZXIsIENvZGVNaXJyb3Igb25seSBkcmF3cyB0aGVcbiAgICBjb2RlIHRoYXQgaXMgdmlzaWJsZSAocGx1cyBhIG1hcmdpbiBhcm91bmQgaXQpIHRvIHRoZSBET00uIFRoaXNcbiAgICBwcm9wZXJ0eSB0ZWxscyB5b3UgdGhlIGV4dGVudCBvZiB0aGUgY3VycmVudCBkcmF3biB2aWV3cG9ydCwgaW5cbiAgICBkb2N1bWVudCBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBnZXQgdmlld3BvcnQoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS52aWV3cG9ydDsgfVxuICAgIC8qKlxuICAgIFdoZW4gdGhlcmUgYXJlLCBmb3IgZXhhbXBsZSwgbGFyZ2UgY29sbGFwc2VkIHJhbmdlcyBpbiB0aGVcbiAgICB2aWV3cG9ydCwgaXRzIHNpemUgY2FuIGJlIGEgbG90IGJpZ2dlciB0aGFuIHRoZSBhY3R1YWwgdmlzaWJsZVxuICAgIGNvbnRlbnQuIFRodXMsIGlmIHlvdSBhcmUgZG9pbmcgc29tZXRoaW5nIGxpa2Ugc3R5bGluZyB0aGVcbiAgICBjb250ZW50IGluIHRoZSB2aWV3cG9ydCwgaXQgaXMgcHJlZmVyYWJsZSB0byBvbmx5IGRvIHNvIGZvclxuICAgIHRoZXNlIHJhbmdlcywgd2hpY2ggYXJlIHRoZSBzdWJzZXQgb2YgdGhlIHZpZXdwb3J0IHRoYXQgaXNcbiAgICBhY3R1YWxseSBkcmF3bi5cbiAgICAqL1xuICAgIGdldCB2aXNpYmxlUmFuZ2VzKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUudmlzaWJsZVJhbmdlczsgfVxuICAgIC8qKlxuICAgIFJldHVybnMgZmFsc2Ugd2hlbiB0aGUgZWRpdG9yIGlzIGVudGlyZWx5IHNjcm9sbGVkIG91dCBvZiB2aWV3XG4gICAgb3Igb3RoZXJ3aXNlIGhpZGRlbi5cbiAgICAqL1xuICAgIGdldCBpblZpZXcoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5pblZpZXc7IH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBpcyBjdXJyZW50bHkgY29tcG9zaW5nIHRleHQgdmlhXG4gICAgW0lNRV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW5wdXRfbWV0aG9kKSwgYW5kIGF0IGxlYXN0XG4gICAgb25lIGNoYW5nZSBoYXMgYmVlbiBtYWRlIGluIHRoZSBjdXJyZW50IGNvbXBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IGNvbXBvc2luZygpIHsgcmV0dXJuICEhdGhpcy5pbnB1dFN0YXRlICYmIHRoaXMuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPiAwOyB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVzZXIgaXMgY3VycmVudGx5IGluIGNvbXBvc2luZyBzdGF0ZS4gTm90ZVxuICAgIHRoYXQgb24gc29tZSBwbGF0Zm9ybXMsIGxpa2UgQW5kcm9pZCwgdGhpcyB3aWxsIGJlIHRoZSBjYXNlIGFcbiAgICBsb3QsIHNpbmNlIGp1c3QgcHV0dGluZyB0aGUgY3Vyc29yIG9uIGEgd29yZCBzdGFydHMgYVxuICAgIGNvbXBvc2l0aW9uIHRoZXJlLlxuICAgICovXG4gICAgZ2V0IGNvbXBvc2l0aW9uU3RhcnRlZCgpIHsgcmV0dXJuICEhdGhpcy5pbnB1dFN0YXRlICYmIHRoaXMuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPj0gMDsgfVxuICAgIC8qKlxuICAgIFRoZSBkb2N1bWVudCBvciBzaGFkb3cgcm9vdCB0aGF0IHRoZSB2aWV3IGxpdmVzIGluLlxuICAgICovXG4gICAgZ2V0IHJvb3QoKSB7IHJldHVybiB0aGlzLl9yb290OyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgd2luKCkgeyByZXR1cm4gdGhpcy5kb20ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7IH1cbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBuZXcgdmlldy4gWW91J2xsIHdhbnQgdG8gZWl0aGVyIHByb3ZpZGUgYSBgcGFyZW50YFxuICAgIG9wdGlvbiwgb3IgcHV0IGB2aWV3LmRvbWAgaW50byB5b3VyIGRvY3VtZW50IGFmdGVyIGNyZWF0aW5nIGFcbiAgICB2aWV3LCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzZWUgdGhlIGVkaXRvci5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gW107XG4gICAgICAgIHRoaXMucGx1Z2luTWFwID0gbmV3IE1hcDtcbiAgICAgICAgdGhpcy5lZGl0b3JBdHRycyA9IHt9O1xuICAgICAgICB0aGlzLmNvbnRlbnRBdHRycyA9IHt9O1xuICAgICAgICB0aGlzLmJpZGlDYWNoZSA9IFtdO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA9IC0xO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubWVhc3VyZVJlcXVlc3RzID0gW107XG4gICAgICAgIHRoaXMuY29udGVudERPTSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuc2Nyb2xsRE9NID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5zY3JvbGxET00udGFiSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5zY3JvbGxET00uY2xhc3NOYW1lID0gXCJjbS1zY3JvbGxlclwiO1xuICAgICAgICB0aGlzLnNjcm9sbERPTS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLmFubm91bmNlRE9NID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZURPTS5jbGFzc05hbWUgPSBcImNtLWFubm91bmNlZFwiO1xuICAgICAgICB0aGlzLmFubm91bmNlRE9NLnNldEF0dHJpYnV0ZShcImFyaWEtbGl2ZVwiLCBcInBvbGl0ZVwiKTtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZCh0aGlzLmFubm91bmNlRE9NKTtcbiAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQodGhpcy5zY3JvbGxET00pO1xuICAgICAgICBpZiAoY29uZmlnLnBhcmVudClcbiAgICAgICAgICAgIGNvbmZpZy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5kb20pO1xuICAgICAgICBsZXQgeyBkaXNwYXRjaCB9ID0gY29uZmlnO1xuICAgICAgICB0aGlzLmRpc3BhdGNoVHJhbnNhY3Rpb25zID0gY29uZmlnLmRpc3BhdGNoVHJhbnNhY3Rpb25zIHx8XG4gICAgICAgICAgICAoZGlzcGF0Y2ggJiYgKCh0cnMpID0+IHRycy5mb3JFYWNoKHRyID0+IGRpc3BhdGNoKHRyLCB0aGlzKSkpKSB8fFxuICAgICAgICAgICAgKCh0cnMpID0+IHRoaXMudXBkYXRlKHRycykpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5kaXNwYXRjaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9yb290ID0gKGNvbmZpZy5yb290IHx8IGdldFJvb3QoY29uZmlnLnBhcmVudCkgfHwgZG9jdW1lbnQpO1xuICAgICAgICB0aGlzLnZpZXdTdGF0ZSA9IG5ldyBWaWV3U3RhdGUoY29uZmlnLnN0YXRlIHx8IEVkaXRvclN0YXRlLmNyZWF0ZShjb25maWcpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5zY3JvbGxUbyAmJiBjb25maWcuc2Nyb2xsVG8uaXMoc2Nyb2xsSW50b1ZpZXcpKVxuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0ID0gY29uZmlnLnNjcm9sbFRvLnZhbHVlLmNsaXAodGhpcy52aWV3U3RhdGUuc3RhdGUpO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSB0aGlzLnN0YXRlLmZhY2V0KHZpZXdQbHVnaW4pLm1hcChzcGVjID0+IG5ldyBQbHVnaW5JbnN0YW5jZShzcGVjKSk7XG4gICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICBwbHVnaW4udXBkYXRlKHRoaXMpO1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IERPTU9ic2VydmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmlucHV0U3RhdGUgPSBuZXcgSW5wdXRTdGF0ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmVuc3VyZUhhbmRsZXJzKHRoaXMucGx1Z2lucyk7XG4gICAgICAgIHRoaXMuZG9jVmlldyA9IG5ldyBEb2NWaWV3KHRoaXMpO1xuICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQXR0cnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLztcbiAgICAgICAgdGhpcy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgICAgICBpZiAoKF9hID0gZG9jdW1lbnQuZm9udHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZWFkeSlcbiAgICAgICAgICAgIGRvY3VtZW50LmZvbnRzLnJlYWR5LnRoZW4oKCkgPT4gdGhpcy5yZXF1ZXN0TWVhc3VyZSgpKTtcbiAgICB9XG4gICAgZGlzcGF0Y2goLi4uaW5wdXQpIHtcbiAgICAgICAgbGV0IHRycyA9IGlucHV0Lmxlbmd0aCA9PSAxICYmIGlucHV0WzBdIGluc3RhbmNlb2YgVHJhbnNhY3Rpb24gPyBpbnB1dFxuICAgICAgICAgICAgOiBpbnB1dC5sZW5ndGggPT0gMSAmJiBBcnJheS5pc0FycmF5KGlucHV0WzBdKSA/IGlucHV0WzBdXG4gICAgICAgICAgICAgICAgOiBbdGhpcy5zdGF0ZS51cGRhdGUoLi4uaW5wdXQpXTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaFRyYW5zYWN0aW9ucyh0cnMsIHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHZpZXcgZm9yIHRoZSBnaXZlbiBhcnJheSBvZiB0cmFuc2FjdGlvbnMuIFRoaXMgd2lsbFxuICAgIHVwZGF0ZSB0aGUgdmlzaWJsZSBkb2N1bWVudCBhbmQgc2VsZWN0aW9uIHRvIG1hdGNoIHRoZSBzdGF0ZVxuICAgIHByb2R1Y2VkIGJ5IHRoZSB0cmFuc2FjdGlvbnMsIGFuZCBub3RpZnkgdmlldyBwbHVnaW5zIG9mIHRoZVxuICAgIGNoYW5nZS4gWW91IHNob3VsZCB1c3VhbGx5IGNhbGxcbiAgICBbYGRpc3BhdGNoYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGlzcGF0Y2gpIGluc3RlYWQsIHdoaWNoIHVzZXMgdGhpc1xuICAgIGFzIGEgcHJpbWl0aXZlLlxuICAgICovXG4gICAgdXBkYXRlKHRyYW5zYWN0aW9ucykge1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdGF0ZSAhPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxscyB0byBFZGl0b3JWaWV3LnVwZGF0ZSBhcmUgbm90IGFsbG93ZWQgd2hpbGUgYW4gdXBkYXRlIGlzIGluIHByb2dyZXNzXCIpO1xuICAgICAgICBsZXQgcmVkcmF3biA9IGZhbHNlLCBhdHRyc0NoYW5nZWQgPSBmYWxzZSwgdXBkYXRlO1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgICBmb3IgKGxldCB0ciBvZiB0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0ci5zdGFydFN0YXRlICE9IHN0YXRlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVHJ5aW5nIHRvIHVwZGF0ZSBzdGF0ZSB3aXRoIGEgdHJhbnNhY3Rpb24gdGhhdCBkb2Vzbid0IHN0YXJ0IGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLlwiKTtcbiAgICAgICAgICAgIHN0YXRlID0gdHIuc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmb2N1cyA9IHRoaXMuaGFzRm9jdXMsIGZvY3VzRmxhZyA9IDAsIGRpc3BhdGNoRm9jdXMgPSBudWxsO1xuICAgICAgICBpZiAodHJhbnNhY3Rpb25zLnNvbWUodHIgPT4gdHIuYW5ub3RhdGlvbihpc0ZvY3VzQ2hhbmdlKSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQgPSBmb2N1cztcbiAgICAgICAgICAgIC8vIElmIGEgZm9jdXMtY2hhbmdlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIGRpc3BhdGNoZWQsIHNldCB0aGlzIHVwZGF0ZSBmbGFnLlxuICAgICAgICAgICAgZm9jdXNGbGFnID0gMSAvKiBVcGRhdGVGbGFnLkZvY3VzICovO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZvY3VzICE9IHRoaXMuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQgPSBmb2N1cztcbiAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgc2VwYXJhdGUgZm9jdXMgdHJhbnNhY3Rpb24gaWYgbmVjZXNzYXJ5LCBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIGFkZCBhIGZsYWcgdG8gdGhpcyB1cGRhdGVcbiAgICAgICAgICAgIGRpc3BhdGNoRm9jdXMgPSBmb2N1c0NoYW5nZVRyYW5zYWN0aW9uKHN0YXRlLCBmb2N1cyk7XG4gICAgICAgICAgICBpZiAoIWRpc3BhdGNoRm9jdXMpXG4gICAgICAgICAgICAgICAgZm9jdXNGbGFnID0gMSAvKiBVcGRhdGVGbGFnLkZvY3VzICovO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIHBlbmRpbmcgRE9NIGNoYW5nZSwgZWFnZXJseSByZWFkIGl0IGFuZCB0cnkgdG9cbiAgICAgICAgLy8gYXBwbHkgaXQgYWZ0ZXIgdGhlIGdpdmVuIHRyYW5zYWN0aW9ucy5cbiAgICAgICAgbGV0IHBlbmRpbmdLZXkgPSB0aGlzLm9ic2VydmVyLmRlbGF5ZWRBbmRyb2lkS2V5LCBkb21DaGFuZ2UgPSBudWxsO1xuICAgICAgICBpZiAocGVuZGluZ0tleSkge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5jbGVhckRlbGF5ZWRBbmRyb2lkS2V5KCk7XG4gICAgICAgICAgICBkb21DaGFuZ2UgPSB0aGlzLm9ic2VydmVyLnJlYWRDaGFuZ2UoKTtcbiAgICAgICAgICAgIC8vIE9ubHkgdHJ5IHRvIGFwcGx5IERPTSBjaGFuZ2VzIGlmIHRoZSB0cmFuc2FjdGlvbnMgZGlkbid0XG4gICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGRvYyBvciBzZWxlY3Rpb24uXG4gICAgICAgICAgICBpZiAoZG9tQ2hhbmdlICYmICF0aGlzLnN0YXRlLmRvYy5lcShzdGF0ZS5kb2MpIHx8ICF0aGlzLnN0YXRlLnNlbGVjdGlvbi5lcShzdGF0ZS5zZWxlY3Rpb24pKVxuICAgICAgICAgICAgICAgIGRvbUNoYW5nZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiB0aGUgcGhyYXNlcyBjaGFuZ2UsIHJlZHJhdyB0aGUgZWRpdG9yXG4gICAgICAgIGlmIChzdGF0ZS5mYWNldChFZGl0b3JTdGF0ZS5waHJhc2VzKSAhPSB0aGlzLnN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLnBocmFzZXMpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoc3RhdGUpO1xuICAgICAgICB1cGRhdGUgPSBWaWV3VXBkYXRlLmNyZWF0ZSh0aGlzLCBzdGF0ZSwgdHJhbnNhY3Rpb25zKTtcbiAgICAgICAgdXBkYXRlLmZsYWdzIHw9IGZvY3VzRmxhZztcbiAgICAgICAgbGV0IHNjcm9sbFRhcmdldCA9IHRoaXMudmlld1N0YXRlLnNjcm9sbFRhcmdldDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovO1xuICAgICAgICAgICAgZm9yIChsZXQgdHIgb2YgdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbFRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVGFyZ2V0ID0gc2Nyb2xsVGFyZ2V0Lm1hcCh0ci5jaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICBpZiAodHIuc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgbWFpbiB9ID0gdHIuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUYXJnZXQgPSBuZXcgU2Nyb2xsVGFyZ2V0KG1haW4uZW1wdHkgPyBtYWluIDogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihtYWluLmhlYWQsIG1haW4uaGVhZCA+IG1haW4uYW5jaG9yID8gLTEgOiAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGUgb2YgdHIuZWZmZWN0cylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuaXMoc2Nyb2xsSW50b1ZpZXcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVGFyZ2V0ID0gZS52YWx1ZS5jbGlwKHRoaXMuc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUudXBkYXRlKHVwZGF0ZSwgc2Nyb2xsVGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMuYmlkaUNhY2hlID0gQ2FjaGVkT3JkZXIudXBkYXRlKHRoaXMuYmlkaUNhY2hlLCB1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgICAgICBpZiAoIXVwZGF0ZS5lbXB0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGx1Z2lucyh1cGRhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlZHJhd24gPSB0aGlzLmRvY1ZpZXcudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5mYWNldChzdHlsZU1vZHVsZSkgIT0gdGhpcy5zdHlsZU1vZHVsZXMpXG4gICAgICAgICAgICAgICAgdGhpcy5tb3VudFN0eWxlcygpO1xuICAgICAgICAgICAgYXR0cnNDaGFuZ2VkID0gdGhpcy51cGRhdGVBdHRycygpO1xuICAgICAgICAgICAgdGhpcy5zaG93QW5ub3VuY2VtZW50cyh0cmFuc2FjdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3LnVwZGF0ZVNlbGVjdGlvbihyZWRyYXduLCB0cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5pc1VzZXJFdmVudChcInNlbGVjdC5wb2ludGVyXCIpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldCh0aGVtZSkgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KHRoZW1lKSlcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLm11c3RNZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgIGlmIChyZWRyYXduIHx8IGF0dHJzQ2hhbmdlZCB8fCBzY3JvbGxUYXJnZXQgfHwgdGhpcy52aWV3U3RhdGUubXVzdEVuZm9yY2VDdXJzb3JBc3NvYyB8fCB0aGlzLnZpZXdTdGF0ZS5tdXN0TWVhc3VyZUNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgIGlmIChyZWRyYXduKVxuICAgICAgICAgICAgdGhpcy5kb2NWaWV3VXBkYXRlKCk7XG4gICAgICAgIGlmICghdXBkYXRlLmVtcHR5KVxuICAgICAgICAgICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgdGhpcy5zdGF0ZS5mYWNldCh1cGRhdGVMaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcih1cGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dFeGNlcHRpb24odGhpcy5zdGF0ZSwgZSwgXCJ1cGRhdGUgbGlzdGVuZXJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcGF0Y2hGb2N1cyB8fCBkb21DaGFuZ2UpXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGlzcGF0Y2hGb2N1cyAmJiB0aGlzLnN0YXRlID09IGRpc3BhdGNoRm9jdXMuc3RhcnRTdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaChkaXNwYXRjaEZvY3VzKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9tQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXBwbHlET01DaGFuZ2UodGhpcywgZG9tQ2hhbmdlKSAmJiBwZW5kaW5nS2V5LmZvcmNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hLZXkodGhpcy5jb250ZW50RE9NLCBwZW5kaW5nS2V5LmtleSwgcGVuZGluZ0tleS5rZXlDb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVzZXQgdGhlIHZpZXcgdG8gdGhlIGdpdmVuIHN0YXRlLiAoVGhpcyB3aWxsIGNhdXNlIHRoZSBlbnRpcmVcbiAgICBkb2N1bWVudCB0byBiZSByZWRyYXduIGFuZCBhbGwgdmlldyBwbHVnaW5zIHRvIGJlIHJlaW5pdGlhbGl6ZWQsXG4gICAgc28geW91IHNob3VsZCBwcm9iYWJseSBvbmx5IHVzZSBpdCB3aGVuIHRoZSBuZXcgc3RhdGUgaXNuJ3RcbiAgICBkZXJpdmVkIGZyb20gdGhlIG9sZCBzdGF0ZS4gT3RoZXJ3aXNlLCB1c2VcbiAgICBbYGRpc3BhdGNoYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGlzcGF0Y2gpIGluc3RlYWQuKVxuICAgICovXG4gICAgc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlU3RhdGUgIT0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FsbHMgdG8gRWRpdG9yVmlldy5zZXRTdGF0ZSBhcmUgbm90IGFsbG93ZWQgd2hpbGUgYW4gdXBkYXRlIGlzIGluIHByb2dyZXNzXCIpO1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLnN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi87XG4gICAgICAgIGxldCBoYWRGb2N1cyA9IHRoaXMuaGFzRm9jdXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIHBsdWdpbi5kZXN0cm95KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUgPSBuZXcgVmlld1N0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2lucyA9IG5ld1N0YXRlLmZhY2V0KHZpZXdQbHVnaW4pLm1hcChzcGVjID0+IG5ldyBQbHVnaW5JbnN0YW5jZShzcGVjKSk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbk1hcC5jbGVhcigpO1xuICAgICAgICAgICAgZm9yIChsZXQgcGx1Z2luIG9mIHRoaXMucGx1Z2lucylcbiAgICAgICAgICAgICAgICBwbHVnaW4udXBkYXRlKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuZG9jVmlldyA9IG5ldyBEb2NWaWV3KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmVuc3VyZUhhbmRsZXJzKHRoaXMucGx1Z2lucyk7XG4gICAgICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUF0dHJzKCk7XG4gICAgICAgICAgICB0aGlzLmJpZGlDYWNoZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFkRm9jdXMpXG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICB9XG4gICAgdXBkYXRlUGx1Z2lucyh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHByZXZTcGVjcyA9IHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHZpZXdQbHVnaW4pLCBzcGVjcyA9IHVwZGF0ZS5zdGF0ZS5mYWNldCh2aWV3UGx1Z2luKTtcbiAgICAgICAgaWYgKHByZXZTcGVjcyAhPSBzcGVjcykge1xuICAgICAgICAgICAgbGV0IG5ld1BsdWdpbnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBwcmV2U3BlY3MuaW5kZXhPZihzcGVjKTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BsdWdpbnMucHVzaChuZXcgUGx1Z2luSW5zdGFuY2Uoc3BlYykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHRoaXMucGx1Z2luc1tmb3VuZF07XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5tdXN0VXBkYXRlID0gdXBkYXRlO1xuICAgICAgICAgICAgICAgICAgICBuZXdQbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4ubXVzdFVwZGF0ZSAhPSB1cGRhdGUpXG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5kZXN0cm95KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zID0gbmV3UGx1Z2lucztcbiAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwIG9mIHRoaXMucGx1Z2lucylcbiAgICAgICAgICAgICAgICBwLm11c3RVcGRhdGUgPSB1cGRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBsdWdpbnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLnBsdWdpbnNbaV0udXBkYXRlKHRoaXMpO1xuICAgICAgICBpZiAocHJldlNwZWNzICE9IHNwZWNzKVxuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmVuc3VyZUhhbmRsZXJzKHRoaXMucGx1Z2lucyk7XG4gICAgfVxuICAgIGRvY1ZpZXdVcGRhdGUoKSB7XG4gICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSBwbHVnaW4udmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsICYmIHZhbC5kb2NWaWV3VXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsLmRvY1ZpZXdVcGRhdGUodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih0aGlzLnN0YXRlLCBlLCBcImRvYyB2aWV3IHVwZGF0ZSBsaXN0ZW5lclwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtZWFzdXJlKGZsdXNoID0gdHJ1ZSkge1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPiAtMSlcbiAgICAgICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMubWVhc3VyZVNjaGVkdWxlZCk7XG4gICAgICAgIGlmICh0aGlzLm9ic2VydmVyLmRlbGF5ZWRBbmRyb2lkS2V5KSB7XG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAtMTtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAwOyAvLyBQcmV2ZW50IHJlcXVlc3RNZWFzdXJlIGNhbGxzIGZyb20gc2NoZWR1bGluZyBhbm90aGVyIGFuaW1hdGlvbiBmcmFtZVxuICAgICAgICBpZiAoZmx1c2gpXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmZvcmNlRmx1c2goKTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBudWxsO1xuICAgICAgICBsZXQgc0RPTSA9IHRoaXMuc2Nyb2xsRE9NLCBzY3JvbGxUb3AgPSBzRE9NLnNjcm9sbFRvcCAqIHRoaXMuc2NhbGVZO1xuICAgICAgICBsZXQgeyBzY3JvbGxBbmNob3JQb3MsIHNjcm9sbEFuY2hvckhlaWdodCB9ID0gdGhpcy52aWV3U3RhdGU7XG4gICAgICAgIGlmIChNYXRoLmFicyhzY3JvbGxUb3AgLSB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUb3ApID4gMSlcbiAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbEFuY2hvckhlaWdodCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2Nyb2xsZWRUb0JvdHRvbShzRE9NKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9yUG9zID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRNYXAuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJsb2NrID0gdGhpcy52aWV3U3RhdGUuc2Nyb2xsQW5jaG9yQXQoc2Nyb2xsVG9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvclBvcyA9IGJsb2NrLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSBibG9jay50b3A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDEgLyogVXBkYXRlU3RhdGUuTWVhc3VyaW5nICovO1xuICAgICAgICAgICAgICAgIGxldCBjaGFuZ2VkID0gdGhpcy52aWV3U3RhdGUubWVhc3VyZSh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZWQgJiYgIXRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aCAmJiB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGkgPiA1KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybih0aGlzLm1lYXN1cmVSZXF1ZXN0cy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJNZWFzdXJlIGxvb3AgcmVzdGFydGVkIG1vcmUgdGhhbiA1IHRpbWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJWaWV3cG9ydCBmYWlsZWQgdG8gc3RhYmlsaXplXCIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG1lYXN1cmluZyA9IFtdO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgcnVuIG1lYXN1cmUgcmVxdWVzdHMgaW4gdGhpcyBjeWNsZSB3aGVuIHRoZSB2aWV3cG9ydCBkaWRuJ3QgY2hhbmdlXG4gICAgICAgICAgICAgICAgaWYgKCEoY2hhbmdlZCAmIDQgLyogVXBkYXRlRmxhZy5WaWV3cG9ydCAqLykpXG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLm1lYXN1cmVSZXF1ZXN0cywgbWVhc3VyaW5nXSA9IFttZWFzdXJpbmcsIHRoaXMubWVhc3VyZVJlcXVlc3RzXTtcbiAgICAgICAgICAgICAgICBsZXQgbWVhc3VyZWQgPSBtZWFzdXJpbmcubWFwKG0gPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0ucmVhZCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHRoaXMuc3RhdGUsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhZE1lYXN1cmU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgdXBkYXRlID0gVmlld1VwZGF0ZS5jcmVhdGUodGhpcywgdGhpcy5zdGF0ZSwgW10pLCByZWRyYXduID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdXBkYXRlLmZsYWdzIHw9IGNoYW5nZWQ7XG4gICAgICAgICAgICAgICAgaWYgKCF1cGRhdGVkKVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gdXBkYXRlO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC5mbGFncyB8PSBjaGFuZ2VkO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGx1Z2lucyh1cGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQXR0cnMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVkcmF3biA9IHRoaXMuZG9jVmlldy51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZHJhd24pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXdVcGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZWFzdXJpbmcubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlZFtpXSAhPSBCYWRNZWFzdXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtID0gbWVhc3VyaW5nW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtLndyaXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLndyaXRlKG1lYXN1cmVkW2ldLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHRoaXMuc3RhdGUsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlZHJhd24pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGVTZWxlY3Rpb24odHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF1cGRhdGUudmlld3BvcnRDaGFuZ2VkICYmIHRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdTdGF0ZS5lZGl0b3JIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcuc2Nyb2xsSW50b1ZpZXcodGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0FuY2hvckhlaWdodCA9IHNjcm9sbEFuY2hvclBvcyA8IDAgPyB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRNYXAuaGVpZ2h0IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUubGluZUJsb2NrQXQoc2Nyb2xsQW5jaG9yUG9zKS50b3A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpZmYgPSBuZXdBbmNob3JIZWlnaHQgLSBzY3JvbGxBbmNob3JIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAxIHx8IGRpZmYgPCAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgPSBzY3JvbGxUb3AgKyBkaWZmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRE9NLnNjcm9sbFRvcCA9IHNjcm9sbFRvcCAvIHRoaXMuc2NhbGVZO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi87XG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZCAmJiAhdXBkYXRlZC5lbXB0eSlcbiAgICAgICAgICAgIGZvciAobGV0IGxpc3RlbmVyIG9mIHRoaXMuc3RhdGUuZmFjZXQodXBkYXRlTGlzdGVuZXIpKVxuICAgICAgICAgICAgICAgIGxpc3RlbmVyKHVwZGF0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIENTUyBjbGFzc2VzIGZvciB0aGUgY3VycmVudGx5IGFjdGl2ZSBlZGl0b3IgdGhlbWVzLlxuICAgICovXG4gICAgZ2V0IHRoZW1lQ2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VUaGVtZUlEICsgXCIgXCIgK1xuICAgICAgICAgICAgKHRoaXMuc3RhdGUuZmFjZXQoZGFya1RoZW1lKSA/IGJhc2VEYXJrSUQgOiBiYXNlTGlnaHRJRCkgKyBcIiBcIiArXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmZhY2V0KHRoZW1lKTtcbiAgICB9XG4gICAgdXBkYXRlQXR0cnMoKSB7XG4gICAgICAgIGxldCBlZGl0b3JBdHRycyA9IGF0dHJzRnJvbUZhY2V0KHRoaXMsIGVkaXRvckF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIGNsYXNzOiBcImNtLWVkaXRvclwiICsgKHRoaXMuaGFzRm9jdXMgPyBcIiBjbS1mb2N1c2VkIFwiIDogXCIgXCIpICsgdGhpcy50aGVtZUNsYXNzZXNcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBjb250ZW50QXR0cnMgPSB7XG4gICAgICAgICAgICBzcGVsbGNoZWNrOiBcImZhbHNlXCIsXG4gICAgICAgICAgICBhdXRvY29ycmVjdDogXCJvZmZcIixcbiAgICAgICAgICAgIGF1dG9jYXBpdGFsaXplOiBcIm9mZlwiLFxuICAgICAgICAgICAgd3JpdGluZ3N1Z2dlc3Rpb25zOiBcImZhbHNlXCIsXG4gICAgICAgICAgICB0cmFuc2xhdGU6IFwibm9cIixcbiAgICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZTogIXRoaXMuc3RhdGUuZmFjZXQoZWRpdGFibGUpID8gXCJmYWxzZVwiIDogXCJ0cnVlXCIsXG4gICAgICAgICAgICBjbGFzczogXCJjbS1jb250ZW50XCIsXG4gICAgICAgICAgICBzdHlsZTogYCR7YnJvd3Nlci50YWJTaXplfTogJHt0aGlzLnN0YXRlLnRhYlNpemV9YCxcbiAgICAgICAgICAgIHJvbGU6IFwidGV4dGJveFwiLFxuICAgICAgICAgICAgXCJhcmlhLW11bHRpbGluZVwiOiBcInRydWVcIlxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgICAgIGNvbnRlbnRBdHRyc1tcImFyaWEtcmVhZG9ubHlcIl0gPSBcInRydWVcIjtcbiAgICAgICAgYXR0cnNGcm9tRmFjZXQodGhpcywgY29udGVudEF0dHJpYnV0ZXMsIGNvbnRlbnRBdHRycyk7XG4gICAgICAgIGxldCBjaGFuZ2VkID0gdGhpcy5vYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNoYW5nZWRDb250ZW50ID0gdXBkYXRlQXR0cnModGhpcy5jb250ZW50RE9NLCB0aGlzLmNvbnRlbnRBdHRycywgY29udGVudEF0dHJzKTtcbiAgICAgICAgICAgIGxldCBjaGFuZ2VkRWRpdG9yID0gdXBkYXRlQXR0cnModGhpcy5kb20sIHRoaXMuZWRpdG9yQXR0cnMsIGVkaXRvckF0dHJzKTtcbiAgICAgICAgICAgIHJldHVybiBjaGFuZ2VkQ29udGVudCB8fCBjaGFuZ2VkRWRpdG9yO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lZGl0b3JBdHRycyA9IGVkaXRvckF0dHJzO1xuICAgICAgICB0aGlzLmNvbnRlbnRBdHRycyA9IGNvbnRlbnRBdHRycztcbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuICAgIHNob3dBbm5vdW5jZW1lbnRzKHRycykge1xuICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCB0ciBvZiB0cnMpXG4gICAgICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgdHIuZWZmZWN0cylcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LmlzKEVkaXRvclZpZXcuYW5ub3VuY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VET00udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGl2ID0gdGhpcy5hbm5vdW5jZURPTS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgZGl2LnRleHRDb250ZW50ID0gZWZmZWN0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICB9XG4gICAgbW91bnRTdHlsZXMoKSB7XG4gICAgICAgIHRoaXMuc3R5bGVNb2R1bGVzID0gdGhpcy5zdGF0ZS5mYWNldChzdHlsZU1vZHVsZSk7XG4gICAgICAgIGxldCBub25jZSA9IHRoaXMuc3RhdGUuZmFjZXQoRWRpdG9yVmlldy5jc3BOb25jZSk7XG4gICAgICAgIFN0eWxlTW9kdWxlLm1vdW50KHRoaXMucm9vdCwgdGhpcy5zdHlsZU1vZHVsZXMuY29uY2F0KGJhc2VUaGVtZSQxKS5yZXZlcnNlKCksIG5vbmNlID8geyBub25jZSB9IDogdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgcmVhZE1lYXN1cmVkKCkge1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdGF0ZSA9PSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhZGluZyB0aGUgZWRpdG9yIGxheW91dCBpc24ndCBhbGxvd2VkIGR1cmluZyBhbiB1cGRhdGVcIik7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZVN0YXRlID09IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLyAmJiB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPiAtMSlcbiAgICAgICAgICAgIHRoaXMubWVhc3VyZShmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFNjaGVkdWxlIGEgbGF5b3V0IG1lYXN1cmVtZW50LCBvcHRpb25hbGx5IHByb3ZpZGluZyBjYWxsYmFja3MgdG9cbiAgICBkbyBjdXN0b20gRE9NIG1lYXN1cmluZyBmb2xsb3dlZCBieSBhIERPTSB3cml0ZSBwaGFzZS4gVXNpbmdcbiAgICB0aGlzIGlzIHByZWZlcmFibGUgcmVhZGluZyBET00gbGF5b3V0IGRpcmVjdGx5IGZyb20sIGZvclxuICAgIGV4YW1wbGUsIGFuIGV2ZW50IGhhbmRsZXIsIGJlY2F1c2UgaXQnbGwgbWFrZSBzdXJlIG1lYXN1cmluZyBhbmRcbiAgICBkcmF3aW5nIGRvbmUgYnkgb3RoZXIgY29tcG9uZW50cyBpcyBzeW5jaHJvbml6ZWQsIGF2b2lkaW5nXG4gICAgdW5uZWNlc3NhcnkgRE9NIGxheW91dCBjb21wdXRhdGlvbnMuXG4gICAgKi9cbiAgICByZXF1ZXN0TWVhc3VyZShyZXF1ZXN0KSB7XG4gICAgICAgIGlmICh0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPCAwKVxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlU2NoZWR1bGVkID0gdGhpcy53aW4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMubWVhc3VyZSgpKTtcbiAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1lYXN1cmVSZXF1ZXN0cy5pbmRleE9mKHJlcXVlc3QpID4gLTEpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3Qua2V5ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1lYXN1cmVSZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tZWFzdXJlUmVxdWVzdHNbaV0ua2V5ID09PSByZXF1ZXN0LmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWFzdXJlUmVxdWVzdHNbaV0gPSByZXF1ZXN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlUmVxdWVzdHMucHVzaChyZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgcGx1Z2luLCBpZiBwcmVzZW50LiBOb3RlIHRoYXRcbiAgICBwbHVnaW5zIHRoYXQgY3Jhc2ggY2FuIGJlIGRyb3BwZWQgZnJvbSBhIHZpZXcsIHNvIGV2ZW4gd2hlbiB5b3VcbiAgICBrbm93IHlvdSByZWdpc3RlcmVkIGEgZ2l2ZW4gcGx1Z2luLCBpdCBpcyByZWNvbW1lbmRlZCB0byBjaGVja1xuICAgIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBtZXRob2QuXG4gICAgKi9cbiAgICBwbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIGxldCBrbm93biA9IHRoaXMucGx1Z2luTWFwLmdldChwbHVnaW4pO1xuICAgICAgICBpZiAoa25vd24gPT09IHVuZGVmaW5lZCB8fCBrbm93biAmJiBrbm93bi5zcGVjICE9IHBsdWdpbilcbiAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwLnNldChwbHVnaW4sIGtub3duID0gdGhpcy5wbHVnaW5zLmZpbmQocCA9PiBwLnNwZWMgPT0gcGx1Z2luKSB8fCBudWxsKTtcbiAgICAgICAgcmV0dXJuIGtub3duICYmIGtub3duLnVwZGF0ZSh0aGlzKS52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgZG9jdW1lbnQsIGluIHNjcmVlbiBjb29yZGluYXRlcy4gVGhpc1xuICAgIG1heSBiZSBuZWdhdGl2ZSB3aGVuIHRoZSBlZGl0b3IgaXMgc2Nyb2xsZWQgZG93bi4gUG9pbnRzXG4gICAgZGlyZWN0bHkgdG8gdGhlIHRvcCBvZiB0aGUgZmlyc3QgbGluZSwgbm90IGFib3ZlIHRoZSBwYWRkaW5nLlxuICAgICovXG4gICAgZ2V0IGRvY3VtZW50VG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHRoaXMudmlld1N0YXRlLnBhZGRpbmdUb3A7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcG9ydHMgdGhlIHBhZGRpbmcgYWJvdmUgYW5kIGJlbG93IHRoZSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBkb2N1bWVudFBhZGRpbmcoKSB7XG4gICAgICAgIHJldHVybiB7IHRvcDogdGhpcy52aWV3U3RhdGUucGFkZGluZ1RvcCwgYm90dG9tOiB0aGlzLnZpZXdTdGF0ZS5wYWRkaW5nQm90dG9tIH07XG4gICAgfVxuICAgIC8qKlxuICAgIElmIHRoZSBlZGl0b3IgaXMgdHJhbnNmb3JtZWQgd2l0aCBDU1MsIHRoaXMgcHJvdmlkZXMgdGhlIHNjYWxlXG4gICAgYWxvbmcgdGhlIFggYXhpcy4gT3RoZXJ3aXNlLCBpdCB3aWxsIGp1c3QgYmUgMS4gTm90ZSB0aGF0XG4gICAgdHJhbnNmb3JtcyBvdGhlciB0aGFuIHRyYW5zbGF0aW9uIGFuZCBzY2FsaW5nIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICovXG4gICAgZ2V0IHNjYWxlWCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLnNjYWxlWDsgfVxuICAgIC8qKlxuICAgIFByb3ZpZGUgdGhlIENTUyB0cmFuc2Zvcm1lZCBzY2FsZSBhbG9uZyB0aGUgWSBheGlzLlxuICAgICovXG4gICAgZ2V0IHNjYWxlWSgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLnNjYWxlWTsgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIHRleHQgbGluZSBvciBibG9jayB3aWRnZXQgYXQgdGhlIGdpdmVuIHZlcnRpY2FsXG4gICAgcG9zaXRpb24gKHdoaWNoIGlzIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoZSBbdG9wIG9mIHRoZVxuICAgIGRvY3VtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kb2N1bWVudFRvcCkpLlxuICAgICovXG4gICAgZWxlbWVudEF0SGVpZ2h0KGhlaWdodCkge1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3U3RhdGUuZWxlbWVudEF0SGVpZ2h0KGhlaWdodCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGxpbmUgYmxvY2sgKHNlZVxuICAgIFtgbGluZUJsb2NrQXRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5saW5lQmxvY2tBdCkgYXQgdGhlIGdpdmVuXG4gICAgaGVpZ2h0LCBhZ2FpbiBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgW3RvcCBvZiB0aGVcbiAgICBkb2N1bWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZG9jdW1lbnRUb3ApLlxuICAgICovXG4gICAgbGluZUJsb2NrQXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMucmVhZE1lYXN1cmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdTdGF0ZS5saW5lQmxvY2tBdEhlaWdodChoZWlnaHQpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGV4dGVudCBhbmQgdmVydGljYWwgcG9zaXRpb24gb2YgYWxsIFtsaW5lXG4gICAgYmxvY2tzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5saW5lQmxvY2tBdCkgaW4gdGhlIHZpZXdwb3J0LiBQb3NpdGlvbnNcbiAgICBhcmUgcmVsYXRpdmUgdG8gdGhlIFt0b3Agb2YgdGhlXG4gICAgZG9jdW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRvY3VtZW50VG9wKTtcbiAgICAqL1xuICAgIGdldCB2aWV3cG9ydExpbmVCbG9ja3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdTdGF0ZS52aWV3cG9ydExpbmVzO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBsaW5lIGJsb2NrIGFyb3VuZCB0aGUgZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uIEEgbGluZVxuICAgIGJsb2NrIGlzIGEgcmFuZ2UgZGVsaW1pdGVkIG9uIGJvdGggc2lkZXMgYnkgZWl0aGVyIGFcbiAgICBub24tW2hpZGRlbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb25ecmVwbGFjZSkgbGluZSBicmVhaywgb3IgdGhlXG4gICAgc3RhcnQvZW5kIG9mIHRoZSBkb2N1bWVudC4gSXQgd2lsbCB1c3VhbGx5IGp1c3QgaG9sZCBhIGxpbmUgb2ZcbiAgICB0ZXh0LCBidXQgbWF5IGJlIGJyb2tlbiBpbnRvIG11bHRpcGxlIHRleHRibG9ja3MgYnkgYmxvY2tcbiAgICB3aWRnZXRzLlxuICAgICovXG4gICAgbGluZUJsb2NrQXQocG9zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdTdGF0ZS5saW5lQmxvY2tBdChwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZWRpdG9yJ3MgdG90YWwgY29udGVudCBoZWlnaHQuXG4gICAgKi9cbiAgICBnZXQgY29udGVudEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmNvbnRlbnRIZWlnaHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYSBjdXJzb3IgcG9zaXRpb24gYnkgW2dyYXBoZW1lXG4gICAgY2x1c3Rlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5maW5kQ2x1c3RlckJyZWFrKS4gYGZvcndhcmRgIGRldGVybWluZXMgd2hldGhlclxuICAgIHRoZSBtb3Rpb24gaXMgYXdheSBmcm9tIHRoZSBsaW5lIHN0YXJ0LCBvciB0b3dhcmRzIGl0LiBJblxuICAgIGJpZGlyZWN0aW9uYWwgdGV4dCwgdGhlIGxpbmUgaXMgdHJhdmVyc2VkIGluIHZpc3VhbCBvcmRlciwgdXNpbmdcbiAgICB0aGUgZWRpdG9yJ3MgW3RleHQgZGlyZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy50ZXh0RGlyZWN0aW9uKS5cbiAgICBXaGVuIHRoZSBzdGFydCBwb3NpdGlvbiB3YXMgdGhlIGxhc3Qgb25lIG9uIHRoZSBsaW5lLCB0aGVcbiAgICByZXR1cm5lZCBwb3NpdGlvbiB3aWxsIGJlIGFjcm9zcyB0aGUgbGluZSBicmVhay4gSWYgdGhlcmUgaXMgbm9cbiAgICBmdXJ0aGVyIGxpbmUsIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBpcyByZXR1cm5lZC5cbiAgICBcbiAgICBCeSBkZWZhdWx0LCB0aGlzIG1ldGhvZCBtb3ZlcyBvdmVyIGEgc2luZ2xlIGNsdXN0ZXIuIFRoZVxuICAgIG9wdGlvbmFsIGBieWAgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gbW92ZSBhY3Jvc3MgbW9yZS4gSXQgd2lsbFxuICAgIGJlIGNhbGxlZCB3aXRoIHRoZSBmaXJzdCBjbHVzdGVyIGFzIGFyZ3VtZW50LCBhbmQgc2hvdWxkIHJldHVyblxuICAgIGEgcHJlZGljYXRlIHRoYXQgZGV0ZXJtaW5lcywgZm9yIGVhY2ggc3Vic2VxdWVudCBjbHVzdGVyLFxuICAgIHdoZXRoZXIgaXQgc2hvdWxkIGFsc28gYmUgbW92ZWQgb3Zlci5cbiAgICAqL1xuICAgIG1vdmVCeUNoYXIoc3RhcnQsIGZvcndhcmQsIGJ5KSB7XG4gICAgICAgIHJldHVybiBza2lwQXRvbXModGhpcywgc3RhcnQsIG1vdmVCeUNoYXIodGhpcywgc3RhcnQsIGZvcndhcmQsIGJ5KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYSBjdXJzb3IgcG9zaXRpb24gYWNyb3NzIHRoZSBuZXh0IGdyb3VwIG9mIGVpdGhlclxuICAgIFtsZXR0ZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmNoYXJDYXRlZ29yaXplcikgb3Igbm9uLWxldHRlclxuICAgIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMuXG4gICAgKi9cbiAgICBtb3ZlQnlHcm91cChzdGFydCwgZm9yd2FyZCkge1xuICAgICAgICByZXR1cm4gc2tpcEF0b21zKHRoaXMsIHN0YXJ0LCBtb3ZlQnlDaGFyKHRoaXMsIHN0YXJ0LCBmb3J3YXJkLCBpbml0aWFsID0+IGJ5R3JvdXAodGhpcywgc3RhcnQuaGVhZCwgaW5pdGlhbCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdmlzdWFsbHkgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIGxpbmUuXG4gICAgTm90ZSB0aGF0IHRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBfbG9naWNhbF8gcG9zaXRpb24gYXQgaXRzXG4gICAgc3RhcnQgb3IgZW5kICh3aGljaCBpcyBzaW1wbHkgYXQgYGxpbmUuZnJvbWAvYGxpbmUudG9gKSBpZiB0ZXh0XG4gICAgYXQgdGhlIHN0YXJ0IG9yIGVuZCBnb2VzIGFnYWluc3QgdGhlIGxpbmUncyBiYXNlIHRleHQgZGlyZWN0aW9uLlxuICAgICovXG4gICAgdmlzdWFsTGluZVNpZGUobGluZSwgZW5kKSB7XG4gICAgICAgIGxldCBvcmRlciA9IHRoaXMuYmlkaVNwYW5zKGxpbmUpLCBkaXIgPSB0aGlzLnRleHREaXJlY3Rpb25BdChsaW5lLmZyb20pO1xuICAgICAgICBsZXQgc3BhbiA9IG9yZGVyW2VuZCA/IG9yZGVyLmxlbmd0aCAtIDEgOiAwXTtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3Ioc3Bhbi5zaWRlKGVuZCwgZGlyKSArIGxpbmUuZnJvbSwgc3Bhbi5mb3J3YXJkKCFlbmQsIGRpcikgPyAxIDogLTEpO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBuZXh0IGxpbmUgYm91bmRhcnkgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbi4gSWZcbiAgICBgaW5jbHVkZVdyYXBgIGlzIHRydWUsIGxpbmUgd3JhcHBpbmcgaXMgb24sIGFuZCB0aGVyZSBpcyBhXG4gICAgZnVydGhlciB3cmFwIHBvaW50IG9uIHRoZSBjdXJyZW50IGxpbmUsIHRoZSB3cmFwIHBvaW50IHdpbGwgYmVcbiAgICByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHN0YXJ0IG9yIGVuZFxuICAgIG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgbW92ZVRvTGluZUJvdW5kYXJ5KHN0YXJ0LCBmb3J3YXJkLCBpbmNsdWRlV3JhcCA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIG1vdmVUb0xpbmVCb3VuZGFyeSh0aGlzLCBzdGFydCwgZm9yd2FyZCwgaW5jbHVkZVdyYXApO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIGEgY3Vyc29yIHBvc2l0aW9uIHZlcnRpY2FsbHkuIFdoZW4gYGRpc3RhbmNlYCBpc24ndCBnaXZlbixcbiAgICBpdCBkZWZhdWx0cyB0byBtb3ZpbmcgdG8gdGhlIG5leHQgbGluZSAoaW5jbHVkaW5nIHdyYXBwZWRcbiAgICBsaW5lcykuIE90aGVyd2lzZSwgYGRpc3RhbmNlYCBzaG91bGQgcHJvdmlkZSBhIHBvc2l0aXZlIGRpc3RhbmNlXG4gICAgaW4gcGl4ZWxzLlxuICAgIFxuICAgIFdoZW4gYHN0YXJ0YCBoYXMgYVxuICAgIFtgZ29hbENvbHVtbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uUmFuZ2UuZ29hbENvbHVtbiksIHRoZSB2ZXJ0aWNhbFxuICAgIG1vdGlvbiB3aWxsIHVzZSB0aGF0IGFzIGEgdGFyZ2V0IGhvcml6b250YWwgcG9zaXRpb24uIE90aGVyd2lzZSxcbiAgICB0aGUgY3Vyc29yJ3Mgb3duIGhvcml6b250YWwgcG9zaXRpb24gaXMgdXNlZC4gVGhlIHJldHVybmVkXG4gICAgY3Vyc29yIHdpbGwgaGF2ZSBpdHMgZ29hbCBjb2x1bW4gc2V0IHRvIHdoaWNoZXZlciBjb2x1bW4gd2FzXG4gICAgdXNlZC5cbiAgICAqL1xuICAgIG1vdmVWZXJ0aWNhbGx5KHN0YXJ0LCBmb3J3YXJkLCBkaXN0YW5jZSkge1xuICAgICAgICByZXR1cm4gc2tpcEF0b21zKHRoaXMsIHN0YXJ0LCBtb3ZlVmVydGljYWxseSh0aGlzLCBzdGFydCwgZm9yd2FyZCwgZGlzdGFuY2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgRE9NIHBhcmVudCBub2RlIGFuZCBvZmZzZXQgKGNoaWxkIG9mZnNldCBpZiBgbm9kZWAgaXNcbiAgICBhbiBlbGVtZW50LCBjaGFyYWN0ZXIgb2Zmc2V0IHdoZW4gaXQgaXMgYSB0ZXh0IG5vZGUpIGF0IHRoZVxuICAgIGdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLlxuICAgIFxuICAgIE5vdGUgdGhhdCBmb3IgcG9zaXRpb25zIHRoYXQgYXJlbid0IGN1cnJlbnRseSBpblxuICAgIGB2aXNpYmxlUmFuZ2VzYCwgdGhlIHJlc3VsdGluZyBET00gcG9zaXRpb24gaXNuJ3QgbmVjZXNzYXJpbHlcbiAgICBtZWFuaW5nZnVsIChpdCBtYXkganVzdCBwb2ludCBiZWZvcmUgb3IgYWZ0ZXIgYSBwbGFjZWhvbGRlclxuICAgIGVsZW1lbnQpLlxuICAgICovXG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY1ZpZXcuZG9tQXRQb3MocG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZG9jdW1lbnQgcG9zaXRpb24gYXQgdGhlIGdpdmVuIERPTSBub2RlLiBDYW4gYmUgdXNlZnVsXG4gICAgZm9yIGFzc29jaWF0aW5nIHBvc2l0aW9ucyB3aXRoIERPTSBldmVudHMuIFdpbGwgcmFpc2UgYW4gZXJyb3JcbiAgICB3aGVuIGBub2RlYCBpc24ndCBwYXJ0IG9mIHRoZSBlZGl0b3IgY29udGVudC5cbiAgICAqL1xuICAgIHBvc0F0RE9NKG5vZGUsIG9mZnNldCA9IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5wb3NGcm9tRE9NKG5vZGUsIG9mZnNldCk7XG4gICAgfVxuICAgIHBvc0F0Q29vcmRzKGNvb3JkcywgcHJlY2lzZSA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHBvc0F0Q29vcmRzKHRoaXMsIGNvb3JkcywgcHJlY2lzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgc2NyZWVuIGNvb3JkaW5hdGVzIGF0IHRoZSBnaXZlbiBkb2N1bWVudCBwb3NpdGlvbi5cbiAgICBgc2lkZWAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb29yZGluYXRlcyBhcmUgYmFzZWQgb24gdGhlXG4gICAgZWxlbWVudCBiZWZvcmUgKC0xKSBvciBhZnRlciAoMSkgdGhlIHBvc2l0aW9uIChpZiBubyBlbGVtZW50IGlzXG4gICAgYXZhaWxhYmxlIG9uIHRoZSBnaXZlbiBzaWRlLCB0aGUgbWV0aG9kIHdpbGwgdHJhbnNwYXJlbnRseSB1c2VcbiAgICBhbm90aGVyIHN0cmF0ZWd5IHRvIGdldCByZWFzb25hYmxlIGNvb3JkaW5hdGVzKS5cbiAgICAqL1xuICAgIGNvb3Jkc0F0UG9zKHBvcywgc2lkZSA9IDEpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgbGV0IHJlY3QgPSB0aGlzLmRvY1ZpZXcuY29vcmRzQXQocG9zLCBzaWRlKTtcbiAgICAgICAgaWYgKCFyZWN0IHx8IHJlY3QubGVmdCA9PSByZWN0LnJpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5zdGF0ZS5kb2MubGluZUF0KHBvcyksIG9yZGVyID0gdGhpcy5iaWRpU3BhbnMobGluZSk7XG4gICAgICAgIGxldCBzcGFuID0gb3JkZXJbQmlkaVNwYW4uZmluZChvcmRlciwgcG9zIC0gbGluZS5mcm9tLCAtMSwgc2lkZSldO1xuICAgICAgICByZXR1cm4gZmxhdHRlblJlY3QocmVjdCwgKHNwYW4uZGlyID09IERpcmVjdGlvbi5MVFIpID09IChzaWRlID4gMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gdGhlIHJlY3RhbmdsZSBhcm91bmQgYSBnaXZlbiBjaGFyYWN0ZXIuIElmIGBwb3NgIGRvZXMgbm90XG4gICAgcG9pbnQgaW4gZnJvbnQgb2YgYSBjaGFyYWN0ZXIgdGhhdCBpcyBpbiB0aGUgdmlld3BvcnQgYW5kXG4gICAgcmVuZGVyZWQgKGkuZS4gbm90IHJlcGxhY2VkLCBub3QgYSBsaW5lIGJyZWFrKSwgdGhpcyB3aWxsIHJldHVyblxuICAgIG51bGwuIEZvciBzcGFjZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIGEgbGluZSB3cmFwIHBvaW50LCB0aGlzIHdpbGxcbiAgICByZXR1cm4gdGhlIHBvc2l0aW9uIGJlZm9yZSB0aGUgbGluZSBicmVhay5cbiAgICAqL1xuICAgIGNvb3Jkc0ZvckNoYXIocG9zKSB7XG4gICAgICAgIHRoaXMucmVhZE1lYXN1cmVkKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY1ZpZXcuY29vcmRzRm9yQ2hhcihwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZGVmYXVsdCB3aWR0aCBvZiBhIGNoYXJhY3RlciBpbiB0aGUgZWRpdG9yLiBNYXkgbm90XG4gICAgYWNjdXJhdGVseSByZWZsZWN0IHRoZSB3aWR0aCBvZiBhbGwgY2hhcmFjdGVycyAoZ2l2ZW4gdmFyaWFibGVcbiAgICB3aWR0aCBmb250cyBvciBzdHlsaW5nIG9mIGludmlkaWR1YWwgcmFuZ2VzKS5cbiAgICAqL1xuICAgIGdldCBkZWZhdWx0Q2hhcmFjdGVyV2lkdGgoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUuY2hhcldpZHRoOyB9XG4gICAgLyoqXG4gICAgVGhlIGRlZmF1bHQgaGVpZ2h0IG9mIGEgbGluZSBpbiB0aGUgZWRpdG9yLiBNYXkgbm90IGJlIGFjY3VyYXRlXG4gICAgZm9yIGFsbCBsaW5lcy5cbiAgICAqL1xuICAgIGdldCBkZWZhdWx0TGluZUhlaWdodCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmhlaWdodE9yYWNsZS5saW5lSGVpZ2h0OyB9XG4gICAgLyoqXG4gICAgVGhlIHRleHQgZGlyZWN0aW9uXG4gICAgKFtgZGlyZWN0aW9uYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2RpcmVjdGlvbilcbiAgICBDU1MgcHJvcGVydHkpIG9mIHRoZSBlZGl0b3IncyBjb250ZW50IGVsZW1lbnQuXG4gICAgKi9cbiAgICBnZXQgdGV4dERpcmVjdGlvbigpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmRlZmF1bHRUZXh0RGlyZWN0aW9uOyB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgdGV4dCBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgYXNcbiAgICBhc3NpZ25lZCBieSBDU1MuIElmXG4gICAgW2BwZXJMaW5lVGV4dERpcmVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnBlckxpbmVUZXh0RGlyZWN0aW9uKVxuICAgIGlzbid0IGVuYWJsZWQsIG9yIHRoZSBnaXZlbiBwb3NpdGlvbiBpcyBvdXRzaWRlIG9mIHRoZSB2aWV3cG9ydCxcbiAgICB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBhc1xuICAgIFtgdGV4dERpcmVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pLiBOb3RlIHRoYXRcbiAgICB0aGlzIG1heSB0cmlnZ2VyIGEgRE9NIGxheW91dC5cbiAgICAqL1xuICAgIHRleHREaXJlY3Rpb25BdChwb3MpIHtcbiAgICAgICAgbGV0IHBlckxpbmUgPSB0aGlzLnN0YXRlLmZhY2V0KHBlckxpbmVUZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKCFwZXJMaW5lIHx8IHBvcyA8IHRoaXMudmlld3BvcnQuZnJvbSB8fCBwb3MgPiB0aGlzLnZpZXdwb3J0LnRvKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dERpcmVjdGlvbjtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy50ZXh0RGlyZWN0aW9uQXQocG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGlzIGVkaXRvciBbd3JhcHMgbGluZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmxpbmVXcmFwcGluZylcbiAgICAoYXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAgICBbYHdoaXRlLXNwYWNlYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3doaXRlLXNwYWNlKVxuICAgIENTUyBwcm9wZXJ0eSBvZiBpdHMgY29udGVudCBlbGVtZW50KS5cbiAgICAqL1xuICAgIGdldCBsaW5lV3JhcHBpbmcoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGUgYmlkaXJlY3Rpb25hbCB0ZXh0IHN0cnVjdHVyZSBvZiB0aGUgZ2l2ZW4gbGluZVxuICAgICh3aGljaCBzaG91bGQgYmUgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQpIGFzIGFuIGFycmF5IG9mIHNwYW5cbiAgICBvYmplY3RzLiBUaGUgb3JkZXIgb2YgdGhlc2Ugc3BhbnMgbWF0Y2hlcyB0aGUgW3RleHRcbiAgICBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pXHUyMDE0aWYgdGhhdCBpc1xuICAgIGxlZnQtdG8tcmlnaHQsIHRoZSBsZWZ0bW9zdCBzcGFucyBjb21lIGZpcnN0LCBvdGhlcndpc2UgdGhlXG4gICAgcmlnaHRtb3N0IHNwYW5zIGNvbWUgZmlyc3QuXG4gICAgKi9cbiAgICBiaWRpU3BhbnMobGluZSkge1xuICAgICAgICBpZiAobGluZS5sZW5ndGggPiBNYXhCaWRpTGluZSlcbiAgICAgICAgICAgIHJldHVybiB0cml2aWFsT3JkZXIobGluZS5sZW5ndGgpO1xuICAgICAgICBsZXQgZGlyID0gdGhpcy50ZXh0RGlyZWN0aW9uQXQobGluZS5mcm9tKSwgaXNvbGF0ZXM7XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHRoaXMuYmlkaUNhY2hlKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuZnJvbSA9PSBsaW5lLmZyb20gJiYgZW50cnkuZGlyID09IGRpciAmJlxuICAgICAgICAgICAgICAgIChlbnRyeS5mcmVzaCB8fCBpc29sYXRlc0VxKGVudHJ5Lmlzb2xhdGVzLCBpc29sYXRlcyA9IGdldElzb2xhdGVkUmFuZ2VzKHRoaXMsIGxpbmUpKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm9yZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNvbGF0ZXMpXG4gICAgICAgICAgICBpc29sYXRlcyA9IGdldElzb2xhdGVkUmFuZ2VzKHRoaXMsIGxpbmUpO1xuICAgICAgICBsZXQgb3JkZXIgPSBjb21wdXRlT3JkZXIobGluZS50ZXh0LCBkaXIsIGlzb2xhdGVzKTtcbiAgICAgICAgdGhpcy5iaWRpQ2FjaGUucHVzaChuZXcgQ2FjaGVkT3JkZXIobGluZS5mcm9tLCBsaW5lLnRvLCBkaXIsIGlzb2xhdGVzLCB0cnVlLCBvcmRlcikpO1xuICAgICAgICByZXR1cm4gb3JkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIHdoZXRoZXIgdGhlIGVkaXRvciBoYXMgZm9jdXMuXG4gICAgKi9cbiAgICBnZXQgaGFzRm9jdXMoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gU2FmYXJpIHJldHVybiBmYWxzZSBmb3IgaGFzRm9jdXMgd2hlbiB0aGUgY29udGV4dCBtZW51IGlzIG9wZW5cbiAgICAgICAgLy8gb3IgY2xvc2luZywgd2hpY2ggbGVhZHMgdXMgdG8gaWdub3JlIHNlbGVjdGlvbiBjaGFuZ2VzIGZyb20gdGhlXG4gICAgICAgIC8vIGNvbnRleHQgbWVudSBiZWNhdXNlIGl0IGxvb2tzIGxpa2UgdGhlIGVkaXRvciBpc24ndCBmb2N1c2VkLlxuICAgICAgICAvLyBUaGlzIGtsdWRnZXMgYXJvdW5kIHRoYXQuXG4gICAgICAgIHJldHVybiAodGhpcy5kb20ub3duZXJEb2N1bWVudC5oYXNGb2N1cygpIHx8IGJyb3dzZXIuc2FmYXJpICYmICgoX2EgPSB0aGlzLmlucHV0U3RhdGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYXN0Q29udGV4dE1lbnUpID4gRGF0ZS5ub3coKSAtIDNlNCkgJiZcbiAgICAgICAgICAgIHRoaXMucm9vdC5hY3RpdmVFbGVtZW50ID09IHRoaXMuY29udGVudERPTTtcbiAgICB9XG4gICAgLyoqXG4gICAgUHV0IGZvY3VzIG9uIHRoZSBlZGl0b3IuXG4gICAgKi9cbiAgICBmb2N1cygpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5pZ25vcmUoKCkgPT4ge1xuICAgICAgICAgICAgZm9jdXNQcmV2ZW50U2Nyb2xsKHRoaXMuY29udGVudERPTSk7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcudXBkYXRlU2VsZWN0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIFtyb290XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvIyN2aWV3LkVkaXRvclZpZXdDb25maWcucm9vdCkgaW4gd2hpY2ggdGhlIGVkaXRvciBsaXZlcy4gVGhpcyBpcyBvbmx5XG4gICAgbmVjZXNzYXJ5IHdoZW4gbW92aW5nIHRoZSBlZGl0b3IncyBleGlzdGluZyBET00gdG8gYSBuZXcgd2luZG93IG9yIHNoYWRvdyByb290LlxuICAgICovXG4gICAgc2V0Um9vdChyb290KSB7XG4gICAgICAgIGlmICh0aGlzLl9yb290ICE9IHJvb3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSByb290O1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5zZXRXaW5kb3coKHJvb3Qubm9kZVR5cGUgPT0gOSA/IHJvb3QgOiByb290Lm93bmVyRG9jdW1lbnQpLmRlZmF1bHRWaWV3IHx8IHdpbmRvdyk7XG4gICAgICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ2xlYW4gdXAgdGhpcyBlZGl0b3IgdmlldywgcmVtb3ZpbmcgaXRzIGVsZW1lbnQgZnJvbSB0aGVcbiAgICBkb2N1bWVudCwgdW5yZWdpc3RlcmluZyBldmVudCBoYW5kbGVycywgYW5kIG5vdGlmeWluZ1xuICAgIHBsdWdpbnMuIFRoZSB2aWV3IGluc3RhbmNlIGNhbiBubyBsb25nZXIgYmUgdXNlZCBhZnRlclxuICAgIGNhbGxpbmcgdGhpcy5cbiAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3QuYWN0aXZlRWxlbWVudCA9PSB0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRET00uYmx1cigpO1xuICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgcGx1Z2luLmRlc3Ryb3kodGhpcyk7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IFtdO1xuICAgICAgICB0aGlzLmlucHV0U3RhdGUuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRvY1ZpZXcuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPiAtMSlcbiAgICAgICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMubWVhc3VyZVNjaGVkdWxlZCk7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhbiBlZmZlY3QgdGhhdCBjYW4gYmVcbiAgICBbYWRkZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpIHRvIGEgdHJhbnNhY3Rpb24gdG9cbiAgICBjYXVzZSBpdCB0byBzY3JvbGwgdGhlIGdpdmVuIHBvc2l0aW9uIG9yIHJhbmdlIGludG8gdmlldy5cbiAgICAqL1xuICAgIHN0YXRpYyBzY3JvbGxJbnRvVmlldyhwb3MsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gc2Nyb2xsSW50b1ZpZXcub2YobmV3IFNjcm9sbFRhcmdldCh0eXBlb2YgcG9zID09IFwibnVtYmVyXCIgPyBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcykgOiBwb3MsIG9wdGlvbnMueSwgb3B0aW9ucy54LCBvcHRpb25zLnlNYXJnaW4sIG9wdGlvbnMueE1hcmdpbikpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYW4gZWZmZWN0IHRoYXQgcmVzZXRzIHRoZSBlZGl0b3IgdG8gaXRzIGN1cnJlbnQgKGF0IHRoZVxuICAgIHRpbWUgdGhpcyBtZXRob2Qgd2FzIGNhbGxlZCkgc2Nyb2xsIHBvc2l0aW9uLiBOb3RlIHRoYXQgdGhpc1xuICAgIG9ubHkgYWZmZWN0cyB0aGUgZWRpdG9yJ3Mgb3duIHNjcm9sbGFibGUgZWxlbWVudCwgbm90IHBhcmVudHMuXG4gICAgU2VlIGFsc29cbiAgICBbYEVkaXRvclZpZXdDb25maWcuc2Nyb2xsVG9gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld0NvbmZpZy5zY3JvbGxUbykuXG4gICAgXG4gICAgVGhlIGVmZmVjdCBzaG91bGQgYmUgdXNlZCB3aXRoIGEgZG9jdW1lbnQgaWRlbnRpY2FsIHRvIHRoZSBvbmVcbiAgICBpdCB3YXMgY3JlYXRlZCBmb3IuIEZhaWxpbmcgdG8gZG8gc28gaXMgbm90IGFuIGVycm9yLCBidXQgbWF5XG4gICAgbm90IHNjcm9sbCB0byB0aGUgZXhwZWN0ZWQgcG9zaXRpb24uIFlvdSBjYW5cbiAgICBbbWFwXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0Lm1hcCkgdGhlIGVmZmVjdCB0byBhY2NvdW50IGZvciBjaGFuZ2VzLlxuICAgICovXG4gICAgc2Nyb2xsU25hcHNob3QoKSB7XG4gICAgICAgIGxldCB7IHNjcm9sbFRvcCwgc2Nyb2xsTGVmdCB9ID0gdGhpcy5zY3JvbGxET007XG4gICAgICAgIGxldCByZWYgPSB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxBbmNob3JBdChzY3JvbGxUb3ApO1xuICAgICAgICByZXR1cm4gc2Nyb2xsSW50b1ZpZXcub2YobmV3IFNjcm9sbFRhcmdldChFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHJlZi5mcm9tKSwgXCJzdGFydFwiLCBcInN0YXJ0XCIsIHJlZi50b3AgLSBzY3JvbGxUb3AsIHNjcm9sbExlZnQsIHRydWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRW5hYmxlIG9yIGRpc2FibGUgdGFiLWZvY3VzIG1vZGUsIHdoaWNoIGRpc2FibGVzIGtleSBiaW5kaW5nc1xuICAgIGZvciBUYWIgYW5kIFNoaWZ0LVRhYiwgbGV0dGluZyB0aGUgYnJvd3NlcidzIGRlZmF1bHRcbiAgICBmb2N1cy1jaGFuZ2luZyBiZWhhdmlvciBnbyB0aHJvdWdoIGluc3RlYWQuIFRoaXMgaXMgdXNlZnVsIHRvXG4gICAgcHJldmVudCB0cmFwcGluZyBrZXlib2FyZCB1c2VycyBpbiB5b3VyIGVkaXRvci5cbiAgICBcbiAgICBXaXRob3V0IGFyZ3VtZW50LCB0aGlzIHRvZ2dsZXMgdGhlIG1vZGUuIFdpdGggYSBib29sZWFuLCBpdFxuICAgIGVuYWJsZXMgKHRydWUpIG9yIGRpc2FibGVzIGl0IChmYWxzZSkuIEdpdmVuIGEgbnVtYmVyLCBpdFxuICAgIHRlbXBvcmFyaWx5IGVuYWJsZXMgdGhlIG1vZGUgdW50aWwgdGhhdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXG4gICAgaGF2ZSBwYXNzZWQgb3IgYW5vdGhlciBub24tVGFiIGtleSBpcyBwcmVzc2VkLlxuICAgICovXG4gICAgc2V0VGFiRm9jdXNNb2RlKHRvKSB7XG4gICAgICAgIGlmICh0byA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLnRhYkZvY3VzTW9kZSA9IHRoaXMuaW5wdXRTdGF0ZS50YWJGb2N1c01vZGUgPCAwID8gMCA6IC0xO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdG8gPT0gXCJib29sZWFuXCIpXG4gICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUudGFiRm9jdXNNb2RlID0gdG8gPyAwIDogLTE7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaW5wdXRTdGF0ZS50YWJGb2N1c01vZGUgIT0gMClcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTdGF0ZS50YWJGb2N1c01vZGUgPSBEYXRlLm5vdygpICsgdG87XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIERPTSBldmVudCBoYW5kbGVycy5cbiAgICBUaGUgdmFsdWUgc2hvdWxkIGJlIGFuIG9iamVjdCBtYXBwaW5nIGV2ZW50IG5hbWVzIHRvIGhhbmRsZXJcbiAgICBmdW5jdGlvbnMuIEZvciBhbnkgZ2l2ZW4gZXZlbnQsIHN1Y2ggZnVuY3Rpb25zIGFyZSBvcmRlcmVkIGJ5XG4gICAgZXh0ZW5zaW9uIHByZWNlZGVuY2UsIGFuZCB0aGUgZmlyc3QgaGFuZGxlciB0byByZXR1cm4gdHJ1ZSB3aWxsXG4gICAgYmUgYXNzdW1lZCB0byBoYXZlIGhhbmRsZWQgdGhhdCBldmVudCwgYW5kIG5vIG90aGVyIGhhbmRsZXJzIG9yXG4gICAgYnVpbHQtaW4gYmVoYXZpb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZm9yIGl0LiBUaGVzZSBhcmUgcmVnaXN0ZXJlZFxuICAgIG9uIHRoZSBbY29udGVudCBlbGVtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5jb250ZW50RE9NKSwgZXhjZXB0XG4gICAgZm9yIGBzY3JvbGxgIGhhbmRsZXJzLCB3aGljaCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSB0aGVcbiAgICBlZGl0b3IncyBbc2Nyb2xsIGVsZW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnNjcm9sbERPTSkgb3Igb25lIG9mXG4gICAgaXRzIHBhcmVudCBub2RlcyBpcyBzY3JvbGxlZC5cbiAgICAqL1xuICAgIHN0YXRpYyBkb21FdmVudEhhbmRsZXJzKGhhbmRsZXJzKSB7XG4gICAgICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSgoKSA9PiAoe30pLCB7IGV2ZW50SGFuZGxlcnM6IGhhbmRsZXJzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgcmVnaXN0ZXJzIERPTSBldmVudCBvYnNlcnZlcnMuIENvbnRyYXJ5XG4gICAgdG8gZXZlbnQgW2hhbmRsZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15kb21FdmVudEhhbmRsZXJzKSxcbiAgICBvYnNlcnZlcnMgY2FuJ3QgYmUgcHJldmVudGVkIGZyb20gcnVubmluZyBieSBhIGhpZ2hlci1wcmVjZWRlbmNlXG4gICAgaGFuZGxlciByZXR1cm5pbmcgdHJ1ZS4gVGhleSBhbHNvIGRvbid0IHByZXZlbnQgb3RoZXIgaGFuZGxlcnNcbiAgICBhbmQgb2JzZXJ2ZXJzIGZyb20gcnVubmluZyB3aGVuIHRoZXkgcmV0dXJuIHRydWUsIGFuZCBzaG91bGQgbm90XG4gICAgY2FsbCBgcHJldmVudERlZmF1bHRgLlxuICAgICovXG4gICAgc3RhdGljIGRvbUV2ZW50T2JzZXJ2ZXJzKG9ic2VydmVycykge1xuICAgICAgICByZXR1cm4gVmlld1BsdWdpbi5kZWZpbmUoKCkgPT4gKHt9KSwgeyBldmVudE9ic2VydmVyczogb2JzZXJ2ZXJzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSB0aGVtZSBleHRlbnNpb24uIFRoZSBmaXJzdCBhcmd1bWVudCBjYW4gYmUgYVxuICAgIFtgc3R5bGUtbW9kYF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvc3R5bGUtbW9kI2RvY3VtZW50YXRpb24pXG4gICAgc3R5bGUgc3BlYyBwcm92aWRpbmcgdGhlIHN0eWxlcyBmb3IgdGhlIHRoZW1lLiBUaGVzZSB3aWxsIGJlXG4gICAgcHJlZml4ZWQgd2l0aCBhIGdlbmVyYXRlZCBjbGFzcyBmb3IgdGhlIHN0eWxlLlxuICAgIFxuICAgIEJlY2F1c2UgdGhlIHNlbGVjdG9ycyB3aWxsIGJlIHByZWZpeGVkIHdpdGggYSBzY29wZSBjbGFzcywgcnVsZVxuICAgIHRoYXQgZGlyZWN0bHkgbWF0Y2ggdGhlIGVkaXRvcidzIFt3cmFwcGVyXG4gICAgZWxlbWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZG9tKVx1MjAxNHRvIHdoaWNoIHRoZSBzY29wZSBjbGFzcyB3aWxsIGJlXG4gICAgYWRkZWRcdTIwMTRuZWVkIHRvIGJlIGV4cGxpY2l0bHkgZGlmZmVyZW50aWF0ZWQgYnkgYWRkaW5nIGFuIGAmYCB0b1xuICAgIHRoZSBzZWxlY3RvciBmb3IgdGhhdCBlbGVtZW50XHUyMDE0Zm9yIGV4YW1wbGVcbiAgICBgJi5jbS1mb2N1c2VkYC5cbiAgICBcbiAgICBXaGVuIGBkYXJrYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIHRoZW1lIHdpbGwgYmUgbWFya2VkIGFzIGRhcmssXG4gICAgd2hpY2ggd2lsbCBjYXVzZSB0aGUgYCZkYXJrYCBydWxlcyBmcm9tIFtiYXNlXG4gICAgdGhlbWVzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15iYXNlVGhlbWUpIHRvIGJlIHVzZWQgKGFzIG9wcG9zZWQgdG9cbiAgICBgJmxpZ2h0YCB3aGVuIGEgbGlnaHQgdGhlbWUgaXMgYWN0aXZlKS5cbiAgICAqL1xuICAgIHN0YXRpYyB0aGVtZShzcGVjLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBwcmVmaXggPSBTdHlsZU1vZHVsZS5uZXdOYW1lKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBbdGhlbWUub2YocHJlZml4KSwgc3R5bGVNb2R1bGUub2YoYnVpbGRUaGVtZShgLiR7cHJlZml4fWAsIHNwZWMpKV07XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGFyaylcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRhcmtUaGVtZS5vZih0cnVlKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBhZGRzIHN0eWxlcyB0byB0aGUgYmFzZSB0aGVtZS4gTGlrZVxuICAgIHdpdGggW2B0aGVtZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnRoZW1lKSwgdXNlIGAmYCB0byBpbmRpY2F0ZSB0aGVcbiAgICBwbGFjZSBvZiB0aGUgZWRpdG9yIHdyYXBwZXIgZWxlbWVudCB3aGVuIGRpcmVjdGx5IHRhcmdldGluZ1xuICAgIHRoYXQuIFlvdSBjYW4gYWxzbyB1c2UgYCZkYXJrYCBvciBgJmxpZ2h0YCBpbnN0ZWFkIHRvIG9ubHlcbiAgICB0YXJnZXQgZWRpdG9ycyB3aXRoIGEgZGFyayBvciBsaWdodCB0aGVtZS5cbiAgICAqL1xuICAgIHN0YXRpYyBiYXNlVGhlbWUoc3BlYykge1xuICAgICAgICByZXR1cm4gUHJlYy5sb3dlc3Qoc3R5bGVNb2R1bGUub2YoYnVpbGRUaGVtZShcIi5cIiArIGJhc2VUaGVtZUlELCBzcGVjLCBsaWdodERhcmtJRHMpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlIGFuIGVkaXRvciB2aWV3IGluc3RhbmNlIGZyb20gdGhlIHZpZXcncyBET01cbiAgICByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmaW5kRnJvbURPTShkb20pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY29udGVudCA9IGRvbS5xdWVyeVNlbGVjdG9yKFwiLmNtLWNvbnRlbnRcIik7XG4gICAgICAgIGxldCBjVmlldyA9IGNvbnRlbnQgJiYgQ29udGVudFZpZXcuZ2V0KGNvbnRlbnQpIHx8IENvbnRlbnRWaWV3LmdldChkb20pO1xuICAgICAgICByZXR1cm4gKChfYSA9IGNWaWV3ID09PSBudWxsIHx8IGNWaWV3ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjVmlldy5yb290VmlldykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZpZXcpIHx8IG51bGw7XG4gICAgfVxufVxuLyoqXG5GYWNldCB0byBhZGQgYSBbc3R5bGVcbm1vZHVsZV0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvc3R5bGUtbW9kI2RvY3VtZW50YXRpb24pIHRvXG5hbiBlZGl0b3Igdmlldy4gVGhlIHZpZXcgd2lsbCBlbnN1cmUgdGhhdCB0aGUgbW9kdWxlIGlzXG5tb3VudGVkIGluIGl0cyBbZG9jdW1lbnRcbnJvb3RdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmNvbnN0cnVjdG9yXmNvbmZpZy5yb290KS5cbiovXG5FZGl0b3JWaWV3LnN0eWxlTW9kdWxlID0gc3R5bGVNb2R1bGU7XG4vKipcbkFuIGlucHV0IGhhbmRsZXIgY2FuIG92ZXJyaWRlIHRoZSB3YXkgY2hhbmdlcyB0byB0aGUgZWRpdGFibGVcbkRPTSBjb250ZW50IGFyZSBoYW5kbGVkLiBIYW5kbGVycyBhcmUgcGFzc2VkIHRoZSBkb2N1bWVudFxucG9zaXRpb25zIGJldHdlZW4gd2hpY2ggdGhlIGNoYW5nZSB3YXMgZm91bmQsIGFuZCB0aGUgbmV3XG5jb250ZW50LiBXaGVuIG9uZSByZXR1cm5zIHRydWUsIG5vIGZ1cnRoZXIgaW5wdXQgaGFuZGxlcnMgYXJlXG5jYWxsZWQgYW5kIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHByZXZlbnRlZC5cblxuVGhlIGBpbnNlcnRgIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgZGVmYXVsdCB0cmFuc2FjdGlvblxudGhhdCB3b3VsZCBiZSBhcHBsaWVkIGZvciB0aGlzIGlucHV0LiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlblxuZGlzcGF0Y2hpbmcgdGhlIGN1c3RvbSBiZWhhdmlvciBhcyBhIHNlcGFyYXRlIHRyYW5zYWN0aW9uLlxuKi9cbkVkaXRvclZpZXcuaW5wdXRIYW5kbGVyID0gaW5wdXRIYW5kbGVyO1xuLyoqXG5GdW5jdGlvbnMgcHJvdmlkZWQgaW4gdGhpcyBmYWNldCB3aWxsIGJlIHVzZWQgdG8gdHJhbnNmb3JtIHRleHRcbnBhc3RlZCBvciBkcm9wcGVkIGludG8gdGhlIGVkaXRvci5cbiovXG5FZGl0b3JWaWV3LmNsaXBib2FyZElucHV0RmlsdGVyID0gY2xpcGJvYXJkSW5wdXRGaWx0ZXI7XG4vKipcblRyYW5zZm9ybSB0ZXh0IGNvcGllZCBvciBkcmFnZ2VkIGZyb20gdGhlIGVkaXRvci5cbiovXG5FZGl0b3JWaWV3LmNsaXBib2FyZE91dHB1dEZpbHRlciA9IGNsaXBib2FyZE91dHB1dEZpbHRlcjtcbi8qKlxuU2Nyb2xsIGhhbmRsZXJzIGNhbiBvdmVycmlkZSBob3cgdGhpbmdzIGFyZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG5JZiB0aGV5IHJldHVybiBgdHJ1ZWAsIG5vIGZ1cnRoZXIgaGFuZGxpbmcgaGFwcGVucyBmb3IgdGhlXG5zY3JvbGxpbmcuIElmIHRoZXkgcmV0dXJuIGZhbHNlLCB0aGUgZGVmYXVsdCBzY3JvbGwgYmVoYXZpb3IgaXNcbmFwcGxpZWQuIFNjcm9sbCBoYW5kbGVycyBzaG91bGQgbmV2ZXIgaW5pdGlhdGUgZWRpdG9yIHVwZGF0ZXMuXG4qL1xuRWRpdG9yVmlldy5zY3JvbGxIYW5kbGVyID0gc2Nyb2xsSGFuZGxlcjtcbi8qKlxuVGhpcyBmYWNldCBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGZ1bmN0aW9ucyB0aGF0IGNyZWF0ZSBlZmZlY3RzXG50byBiZSBkaXNwYXRjaGVkIHdoZW4gdGhlIGVkaXRvcidzIGZvY3VzIHN0YXRlIGNoYW5nZXMuXG4qL1xuRWRpdG9yVmlldy5mb2N1c0NoYW5nZUVmZmVjdCA9IGZvY3VzQ2hhbmdlRWZmZWN0O1xuLyoqXG5CeSBkZWZhdWx0LCB0aGUgZWRpdG9yIGFzc3VtZXMgYWxsIGl0cyBjb250ZW50IGhhcyB0aGUgc2FtZVxuW3RleHQgZGlyZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGlyZWN0aW9uKS4gQ29uZmlndXJlIHRoaXMgd2l0aCBhIGB0cnVlYFxudmFsdWUgdG8gbWFrZSBpdCByZWFkIHRoZSB0ZXh0IGRpcmVjdGlvbiBvZiBldmVyeSAocmVuZGVyZWQpXG5saW5lIHNlcGFyYXRlbHkuXG4qL1xuRWRpdG9yVmlldy5wZXJMaW5lVGV4dERpcmVjdGlvbiA9IHBlckxpbmVUZXh0RGlyZWN0aW9uO1xuLyoqXG5BbGxvd3MgeW91IHRvIHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGVcbmxpYnJhcnkgY2F0Y2hlcyBhbiBleGNlcHRpb24gZnJvbSBhbiBleHRlbnNpb24gKG1vc3RseSBmcm9tIHZpZXdcbnBsdWdpbnMsIGJ1dCBtYXkgYmUgdXNlZCBieSBvdGhlciBleHRlbnNpb25zIHRvIHJvdXRlIGV4Y2VwdGlvbnNcbmZyb20gdXNlci1jb2RlLXByb3ZpZGVkIGNhbGxiYWNrcykuIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3JcbmRlYnVnZ2luZyBhbmQgbG9nZ2luZy4gU2VlIFtgbG9nRXhjZXB0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LmxvZ0V4Y2VwdGlvbikuXG4qL1xuRWRpdG9yVmlldy5leGNlcHRpb25TaW5rID0gZXhjZXB0aW9uU2luaztcbi8qKlxuQSBmYWNldCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXG5ldmVyeSB0aW1lIHRoZSB2aWV3IHVwZGF0ZXMuXG4qL1xuRWRpdG9yVmlldy51cGRhdGVMaXN0ZW5lciA9IHVwZGF0ZUxpc3RlbmVyO1xuLyoqXG5GYWNldCB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgdGhlIGVkaXRvciBjb250ZW50IERPTSBpcyBlZGl0YWJsZS5cbldoZW4gaXRzIGhpZ2hlc3QtcHJlY2VkZW5jZSB2YWx1ZSBpcyBgZmFsc2VgLCB0aGUgZWxlbWVudCB3aWxsXG5ub3QgaGF2ZSBpdHMgYGNvbnRlbnRlZGl0YWJsZWAgYXR0cmlidXRlIHNldC4gKE5vdGUgdGhhdCB0aGlzXG5kb2Vzbid0IGFmZmVjdCBBUEkgY2FsbHMgdGhhdCBjaGFuZ2UgdGhlIGVkaXRvciBjb250ZW50LCBldmVuXG53aGVuIHRob3NlIGFyZSBib3VuZCB0byBrZXlzIG9yIGJ1dHRvbnMuIFNlZSB0aGVcbltgcmVhZE9ubHlgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnJlYWRPbmx5KSBmYWNldCBmb3IgdGhhdC4pXG4qL1xuRWRpdG9yVmlldy5lZGl0YWJsZSA9IGVkaXRhYmxlO1xuLyoqXG5BbGxvd3MgeW91IHRvIGluZmx1ZW5jZSB0aGUgd2F5IG1vdXNlIHNlbGVjdGlvbiBoYXBwZW5zLiBUaGVcbmZ1bmN0aW9ucyBpbiB0aGlzIGZhY2V0IHdpbGwgYmUgY2FsbGVkIGZvciBhIGBtb3VzZWRvd25gIGV2ZW50XG5vbiB0aGUgZWRpdG9yLCBhbmQgY2FuIHJldHVybiBhbiBvYmplY3QgdGhhdCBvdmVycmlkZXMgdGhlIHdheSBhXG5zZWxlY3Rpb24gaXMgY29tcHV0ZWQgZnJvbSB0aGF0IG1vdXNlIGNsaWNrIG9yIGRyYWcuXG4qL1xuRWRpdG9yVmlldy5tb3VzZVNlbGVjdGlvblN0eWxlID0gbW91c2VTZWxlY3Rpb25TdHlsZTtcbi8qKlxuRmFjZXQgdXNlZCB0byBjb25maWd1cmUgd2hldGhlciBhIGdpdmVuIHNlbGVjdGlvbiBkcmFnIGV2ZW50XG5zaG91bGQgbW92ZSBvciBjb3B5IHRoZSBzZWxlY3Rpb24uIFRoZSBnaXZlbiBwcmVkaWNhdGUgd2lsbCBiZVxuY2FsbGVkIHdpdGggdGhlIGBtb3VzZWRvd25gIGV2ZW50LCBhbmQgY2FuIHJldHVybiBgdHJ1ZWAgd2hlblxudGhlIGRyYWcgc2hvdWxkIG1vdmUgdGhlIGNvbnRlbnQuXG4qL1xuRWRpdG9yVmlldy5kcmFnTW92ZXNTZWxlY3Rpb24gPSBkcmFnTW92ZXNTZWxlY3Rpb24kMTtcbi8qKlxuRmFjZXQgdXNlZCB0byBjb25maWd1cmUgd2hldGhlciBhIGdpdmVuIHNlbGVjdGluZyBjbGljayBhZGRzIGFcbm5ldyByYW5nZSB0byB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIG9yIHJlcGxhY2VzIGl0IGVudGlyZWx5LiBUaGVcbmRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2hlY2sgYGV2ZW50Lm1ldGFLZXlgIG9uIG1hY09TLCBhbmRcbmBldmVudC5jdHJsS2V5YCBlbHNld2hlcmUuXG4qL1xuRWRpdG9yVmlldy5jbGlja0FkZHNTZWxlY3Rpb25SYW5nZSA9IGNsaWNrQWRkc1NlbGVjdGlvblJhbmdlO1xuLyoqXG5BIGZhY2V0IHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBbZGVjb3JhdGlvbnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uKVxuYXJlIHNob3duIGluIHRoZSB2aWV3LiBEZWNvcmF0aW9ucyBjYW4gYmUgcHJvdmlkZWQgaW4gdHdvXG53YXlzXHUyMDE0ZGlyZWN0bHksIG9yIHZpYSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gZWRpdG9yIHZpZXcuXG5cbk9ubHkgZGVjb3JhdGlvbiBzZXRzIHByb3ZpZGVkIGRpcmVjdGx5IGFyZSBhbGxvd2VkIHRvIGluZmx1ZW5jZVxudGhlIGVkaXRvcidzIHZlcnRpY2FsIGxheW91dCBzdHJ1Y3R1cmUuIFRoZSBvbmVzIHByb3ZpZGVkIGFzXG5mdW5jdGlvbnMgYXJlIGNhbGxlZCBfYWZ0ZXJfIHRoZSBuZXcgdmlld3BvcnQgaGFzIGJlZW4gY29tcHV0ZWQsXG5hbmQgdGh1cyAqKm11c3Qgbm90KiogaW50cm9kdWNlIGJsb2NrIHdpZGdldHMgb3IgcmVwbGFjaW5nXG5kZWNvcmF0aW9ucyB0aGF0IGNvdmVyIGxpbmUgYnJlYWtzLlxuXG5JZiB5b3Ugd2FudCBkZWNvcmF0ZWQgcmFuZ2VzIHRvIGJlaGF2ZSBsaWtlIGF0b21pYyB1bml0cyBmb3JcbmN1cnNvciBtb3Rpb24gYW5kIGRlbGV0aW9uIHB1cnBvc2VzLCBhbHNvIHByb3ZpZGUgdGhlIHJhbmdlIHNldFxuY29udGFpbmluZyB0aGUgZGVjb3JhdGlvbnMgdG9cbltgRWRpdG9yVmlldy5hdG9taWNSYW5nZXNgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15hdG9taWNSYW5nZXMpLlxuKi9cbkVkaXRvclZpZXcuZGVjb3JhdGlvbnMgPSBkZWNvcmF0aW9ucztcbi8qKlxuRmFjZXQgdGhhdCB3b3JrcyBtdWNoIGxpa2VcbltgZGVjb3JhdGlvbnNgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15kZWNvcmF0aW9ucyksIGJ1dCBwdXRzIGl0c1xuaW5wdXRzIGF0IHRoZSB2ZXJ5IGJvdHRvbSBvZiB0aGUgcHJlY2VkZW5jZSBzdGFjaywgbWVhbmluZyBtYXJrXG5kZWNvcmF0aW9ucyBwcm92aWRlZCBoZXJlIHdpbGwgb25seSBiZSBzcGxpdCBieSBvdGhlciwgcGFydGlhbGx5XG5vdmVybGFwcGluZyBcXGBvdXRlckRlY29yYXRpb25zXFxgIHJhbmdlcywgYW5kIHdyYXAgYXJvdW5kIGFsbFxucmVndWxhciBkZWNvcmF0aW9ucy4gVXNlIHRoaXMgZm9yIG1hcmsgZWxlbWVudHMgdGhhdCBzaG91bGQsIGFzXG5tdWNoIGFzIHBvc3NpYmxlLCByZW1haW4gaW4gb25lIHBpZWNlLlxuKi9cbkVkaXRvclZpZXcub3V0ZXJEZWNvcmF0aW9ucyA9IG91dGVyRGVjb3JhdGlvbnM7XG4vKipcblVzZWQgdG8gcHJvdmlkZSByYW5nZXMgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhdG9tcyBhcyBmYXIgYXNcbmN1cnNvciBtb3Rpb24gaXMgY29uY2VybmVkLiBUaGlzIGNhdXNlcyBtZXRob2RzIGxpa2VcbltgbW92ZUJ5Q2hhcmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Lm1vdmVCeUNoYXIpIGFuZFxuW2Btb3ZlVmVydGljYWxseWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3Lm1vdmVWZXJ0aWNhbGx5KSAoYW5kIHRoZVxuY29tbWFuZHMgYnVpbHQgb24gdG9wIG9mIHRoZW0pIHRvIHNraXAgYWNyb3NzIHN1Y2ggcmVnaW9ucyB3aGVuXG5hIHNlbGVjdGlvbiBlbmRwb2ludCB3b3VsZCBlbnRlciB0aGVtLiBUaGlzIGRvZXMgX25vdF8gcHJldmVudFxuZGlyZWN0IHByb2dyYW1tYXRpYyBbc2VsZWN0aW9uXG51cGRhdGVzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5zZWxlY3Rpb24pIGZyb20gbW92aW5nIGludG8gc3VjaFxucmVnaW9ucy5cbiovXG5FZGl0b3JWaWV3LmF0b21pY1JhbmdlcyA9IGF0b21pY1Jhbmdlcztcbi8qKlxuV2hlbiByYW5nZSBkZWNvcmF0aW9ucyBhZGQgYSBgdW5pY29kZS1iaWRpOiBpc29sYXRlYCBzdHlsZSwgdGhleVxuc2hvdWxkIGFsc28gaW5jbHVkZSBhXG5bYGJpZGlJc29sYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3Lk1hcmtEZWNvcmF0aW9uU3BlYy5iaWRpSXNvbGF0ZSkgcHJvcGVydHlcbmluIHRoZWlyIGRlY29yYXRpb24gc3BlYywgYW5kIGJlIGV4cG9zZWQgdGhyb3VnaCB0aGlzIGZhY2V0LCBzb1xudGhhdCB0aGUgZWRpdG9yIGNhbiBjb21wdXRlIHRoZSBwcm9wZXIgdGV4dCBvcmRlci4gKE90aGVyIHZhbHVlc1xuZm9yIGB1bmljb2RlLWJpZGlgLCBleGNlcHQgb2YgY291cnNlIGBub3JtYWxgLCBhcmUgbm90XG5zdXBwb3J0ZWQuKVxuKi9cbkVkaXRvclZpZXcuYmlkaUlzb2xhdGVkUmFuZ2VzID0gYmlkaUlzb2xhdGVkUmFuZ2VzO1xuLyoqXG5GYWNldCB0aGF0IGFsbG93cyBleHRlbnNpb25zIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBzY3JvbGxcbm1hcmdpbnMgKHNwYWNlIGFyb3VuZCB0aGUgc2lkZXMgb2YgdGhlIHNjcm9sbGluZyBlbGVtZW50IHRoYXRcbnNob3VsZCBiZSBjb25zaWRlcmVkIGludmlzaWJsZSkuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHRoZVxucGx1Z2luIGludHJvZHVjZXMgZWxlbWVudHMgdGhhdCBjb3ZlciBwYXJ0IG9mIHRoYXQgZWxlbWVudCAoZm9yXG5leGFtcGxlIGEgaG9yaXpvbnRhbGx5IGZpeGVkIGd1dHRlcikuXG4qL1xuRWRpdG9yVmlldy5zY3JvbGxNYXJnaW5zID0gc2Nyb2xsTWFyZ2lucztcbi8qKlxuVGhpcyBmYWNldCByZWNvcmRzIHdoZXRoZXIgYSBkYXJrIHRoZW1lIGlzIGFjdGl2ZS4gVGhlIGV4dGVuc2lvblxucmV0dXJuZWQgYnkgW2B0aGVtZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnRoZW1lKSBhdXRvbWF0aWNhbGx5XG5pbmNsdWRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIHdoZW4gdGhlIGBkYXJrYCBvcHRpb24gaXMgc2V0IHRvXG50cnVlLlxuKi9cbkVkaXRvclZpZXcuZGFya1RoZW1lID0gZGFya1RoZW1lO1xuLyoqXG5Qcm92aWRlcyBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IG5vbmNlIHRvIHVzZSB3aGVuIGNyZWF0aW5nXG50aGUgc3R5bGUgc2hlZXRzIGZvciB0aGUgZWRpdG9yLiBIb2xkcyB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gbm9cbm5vbmNlIGhhcyBiZWVuIHByb3ZpZGVkLlxuKi9cbkVkaXRvclZpZXcuY3NwTm9uY2UgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5sZW5ndGggPyB2YWx1ZXNbMF0gOiBcIlwiIH0pO1xuLyoqXG5GYWNldCB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgRE9NIGF0dHJpYnV0ZXMgZm9yIHRoZSBlZGl0b3Inc1xuZWRpdGFibGUgRE9NIGVsZW1lbnQuXG4qL1xuRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcyA9IGNvbnRlbnRBdHRyaWJ1dGVzO1xuLyoqXG5GYWNldCB0aGF0IHByb3ZpZGVzIERPTSBhdHRyaWJ1dGVzIGZvciB0aGUgZWRpdG9yJ3Mgb3V0ZXJcbmVsZW1lbnQuXG4qL1xuRWRpdG9yVmlldy5lZGl0b3JBdHRyaWJ1dGVzID0gZWRpdG9yQXR0cmlidXRlcztcbi8qKlxuQW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyBsaW5lIHdyYXBwaW5nIGluIHRoZSBlZGl0b3IgKGJ5XG5zZXR0aW5nIENTUyBgd2hpdGUtc3BhY2VgIHRvIGBwcmUtd3JhcGAgaW4gdGhlIGNvbnRlbnQpLlxuKi9cbkVkaXRvclZpZXcubGluZVdyYXBwaW5nID0gLypAX19QVVJFX18qL0VkaXRvclZpZXcuY29udGVudEF0dHJpYnV0ZXMub2YoeyBcImNsYXNzXCI6IFwiY20tbGluZVdyYXBwaW5nXCIgfSk7XG4vKipcblN0YXRlIGVmZmVjdCB1c2VkIHRvIGluY2x1ZGUgc2NyZWVuIHJlYWRlciBhbm5vdW5jZW1lbnRzIGluIGFcbnRyYW5zYWN0aW9uLiBUaGVzZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBET00gaW4gYSB2aXN1YWxseSBoaWRkZW5cbmVsZW1lbnQgd2l0aCBgYXJpYS1saXZlPVwicG9saXRlXCJgIHNldCwgYW5kIHNob3VsZCBiZSB1c2VkIHRvXG5kZXNjcmliZSBlZmZlY3RzIHRoYXQgYXJlIHZpc3VhbGx5IG9idmlvdXMgYnV0IG1heSBub3QgYmVcbm5vdGljZWQgYnkgc2NyZWVuIHJlYWRlciB1c2VycyAoc3VjaCBhcyBtb3ZpbmcgdG8gdGhlIG5leHRcbnNlYXJjaCBtYXRjaCkuXG4qL1xuRWRpdG9yVmlldy5hbm5vdW5jZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbi8vIE1heGltdW0gbGluZSBsZW5ndGggZm9yIHdoaWNoIHdlIGNvbXB1dGUgYWNjdXJhdGUgYmlkaSBpbmZvXG5jb25zdCBNYXhCaWRpTGluZSA9IDQwOTY7XG5jb25zdCBCYWRNZWFzdXJlID0ge307XG5jbGFzcyBDYWNoZWRPcmRlciB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8sIGRpciwgaXNvbGF0ZXMsIGZyZXNoLCBvcmRlcikge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuZGlyID0gZGlyO1xuICAgICAgICB0aGlzLmlzb2xhdGVzID0gaXNvbGF0ZXM7XG4gICAgICAgIHRoaXMuZnJlc2ggPSBmcmVzaDtcbiAgICAgICAgdGhpcy5vcmRlciA9IG9yZGVyO1xuICAgIH1cbiAgICBzdGF0aWMgdXBkYXRlKGNhY2hlLCBjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmVtcHR5ICYmICFjYWNoZS5zb21lKGMgPT4gYy5mcmVzaCkpXG4gICAgICAgICAgICByZXR1cm4gY2FjaGU7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXSwgbGFzdERpciA9IGNhY2hlLmxlbmd0aCA/IGNhY2hlW2NhY2hlLmxlbmd0aCAtIDFdLmRpciA6IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIGZvciAobGV0IGkgPSBNYXRoLm1heCgwLCBjYWNoZS5sZW5ndGggLSAxMCk7IGkgPCBjYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gY2FjaGVbaV07XG4gICAgICAgICAgICBpZiAoZW50cnkuZGlyID09IGxhc3REaXIgJiYgIWNoYW5nZXMudG91Y2hlc1JhbmdlKGVudHJ5LmZyb20sIGVudHJ5LnRvKSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgQ2FjaGVkT3JkZXIoY2hhbmdlcy5tYXBQb3MoZW50cnkuZnJvbSwgMSksIGNoYW5nZXMubWFwUG9zKGVudHJ5LnRvLCAtMSksIGVudHJ5LmRpciwgZW50cnkuaXNvbGF0ZXMsIGZhbHNlLCBlbnRyeS5vcmRlcikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gYXR0cnNGcm9tRmFjZXQodmlldywgZmFjZXQsIGJhc2UpIHtcbiAgICBmb3IgKGxldCBzb3VyY2VzID0gdmlldy5zdGF0ZS5mYWNldChmYWNldCksIGkgPSBzb3VyY2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VzW2ldLCB2YWx1ZSA9IHR5cGVvZiBzb3VyY2UgPT0gXCJmdW5jdGlvblwiID8gc291cmNlKHZpZXcpIDogc291cmNlO1xuICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICBjb21iaW5lQXR0cnModmFsdWUsIGJhc2UpO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbn1cblxuY29uc3QgY3VycmVudFBsYXRmb3JtID0gYnJvd3Nlci5tYWMgPyBcIm1hY1wiIDogYnJvd3Nlci53aW5kb3dzID8gXCJ3aW5cIiA6IGJyb3dzZXIubGludXggPyBcImxpbnV4XCIgOiBcImtleVwiO1xuZnVuY3Rpb24gbm9ybWFsaXplS2V5TmFtZShuYW1lLCBwbGF0Zm9ybSkge1xuICAgIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISQpLyk7XG4gICAgbGV0IHJlc3VsdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChyZXN1bHQgPT0gXCJTcGFjZVwiKVxuICAgICAgICByZXN1bHQgPSBcIiBcIjtcbiAgICBsZXQgYWx0LCBjdHJsLCBzaGlmdCwgbWV0YTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBjb25zdCBtb2QgPSBwYXJ0c1tpXTtcbiAgICAgICAgaWYgKC9eKGNtZHxtZXRhfG0pJC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIG1ldGEgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXmEobHQpPyQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBhbHQgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXihjfGN0cmx8Y29udHJvbCkkL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgY3RybCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9ecyhoaWZ0KT8kL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgc2hpZnQgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXm1vZCQvaS50ZXN0KG1vZCkpIHtcbiAgICAgICAgICAgIGlmIChwbGF0Zm9ybSA9PSBcIm1hY1wiKVxuICAgICAgICAgICAgICAgIG1ldGEgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGN0cmwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBtb2RpZmllciBuYW1lOiBcIiArIG1vZCk7XG4gICAgfVxuICAgIGlmIChhbHQpXG4gICAgICAgIHJlc3VsdCA9IFwiQWx0LVwiICsgcmVzdWx0O1xuICAgIGlmIChjdHJsKVxuICAgICAgICByZXN1bHQgPSBcIkN0cmwtXCIgKyByZXN1bHQ7XG4gICAgaWYgKG1ldGEpXG4gICAgICAgIHJlc3VsdCA9IFwiTWV0YS1cIiArIHJlc3VsdDtcbiAgICBpZiAoc2hpZnQpXG4gICAgICAgIHJlc3VsdCA9IFwiU2hpZnQtXCIgKyByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZGlmaWVycyhuYW1lLCBldmVudCwgc2hpZnQpIHtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgICBuYW1lID0gXCJBbHQtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5jdHJsS2V5KVxuICAgICAgICBuYW1lID0gXCJDdHJsLVwiICsgbmFtZTtcbiAgICBpZiAoZXZlbnQubWV0YUtleSlcbiAgICAgICAgbmFtZSA9IFwiTWV0YS1cIiArIG5hbWU7XG4gICAgaWYgKHNoaWZ0ICE9PSBmYWxzZSAmJiBldmVudC5zaGlmdEtleSlcbiAgICAgICAgbmFtZSA9IFwiU2hpZnQtXCIgKyBuYW1lO1xuICAgIHJldHVybiBuYW1lO1xufVxuY29uc3QgaGFuZGxlS2V5RXZlbnRzID0gLypAX19QVVJFX18qL1ByZWMuZGVmYXVsdCgvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5kb21FdmVudEhhbmRsZXJzKHtcbiAgICBrZXlkb3duKGV2ZW50LCB2aWV3KSB7XG4gICAgICAgIHJldHVybiBydW5IYW5kbGVycyhnZXRLZXltYXAodmlldy5zdGF0ZSksIGV2ZW50LCB2aWV3LCBcImVkaXRvclwiKTtcbiAgICB9XG59KSk7XG4vKipcbkZhY2V0IHVzZWQgZm9yIHJlZ2lzdGVyaW5nIGtleW1hcHMuXG5cbllvdSBjYW4gYWRkIG11bHRpcGxlIGtleW1hcHMgdG8gYW4gZWRpdG9yLiBUaGVpciBwcmlvcml0aWVzXG5kZXRlcm1pbmUgdGhlaXIgcHJlY2VkZW5jZSAodGhlIG9uZXMgc3BlY2lmaWVkIGVhcmx5IG9yIHdpdGggaGlnaFxucHJpb3JpdHkgZ2V0IGNoZWNrZWQgZmlyc3QpLiBXaGVuIGEgaGFuZGxlciBoYXMgcmV0dXJuZWQgYHRydWVgXG5mb3IgYSBnaXZlbiBrZXksIG5vIGZ1cnRoZXIgaGFuZGxlcnMgYXJlIGNhbGxlZC5cbiovXG5jb25zdCBrZXltYXAgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgZW5hYmxlczogaGFuZGxlS2V5RXZlbnRzIH0pO1xuY29uc3QgS2V5bWFwcyA9IC8qQF9fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuLy8gVGhpcyBpcyBoaWRkZW4gYmVoaW5kIGFuIGluZGlyZWN0aW9uLCByYXRoZXIgdGhhbiBkaXJlY3RseSBjb21wdXRlZFxuLy8gYnkgdGhlIGZhY2V0LCB0byBrZWVwIGludGVybmFsIHR5cGVzIG91dCBvZiB0aGUgZmFjZXQncyB0eXBlLlxuZnVuY3Rpb24gZ2V0S2V5bWFwKHN0YXRlKSB7XG4gICAgbGV0IGJpbmRpbmdzID0gc3RhdGUuZmFjZXQoa2V5bWFwKTtcbiAgICBsZXQgbWFwID0gS2V5bWFwcy5nZXQoYmluZGluZ3MpO1xuICAgIGlmICghbWFwKVxuICAgICAgICBLZXltYXBzLnNldChiaW5kaW5ncywgbWFwID0gYnVpbGRLZXltYXAoYmluZGluZ3MucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pKSk7XG4gICAgcmV0dXJuIG1hcDtcbn1cbi8qKlxuUnVuIHRoZSBrZXkgaGFuZGxlcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBzY29wZS4gVGhlIGV2ZW50XG5vYmplY3Qgc2hvdWxkIGJlIGEgYFwia2V5ZG93blwiYCBldmVudC4gUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGVcbmhhbmRsZXJzIGhhbmRsZWQgaXQuXG4qL1xuZnVuY3Rpb24gcnVuU2NvcGVIYW5kbGVycyh2aWV3LCBldmVudCwgc2NvcGUpIHtcbiAgICByZXR1cm4gcnVuSGFuZGxlcnMoZ2V0S2V5bWFwKHZpZXcuc3RhdGUpLCBldmVudCwgdmlldywgc2NvcGUpO1xufVxubGV0IHN0b3JlZFByZWZpeCA9IG51bGw7XG5jb25zdCBQcmVmaXhUaW1lb3V0ID0gNDAwMDtcbmZ1bmN0aW9uIGJ1aWxkS2V5bWFwKGJpbmRpbmdzLCBwbGF0Zm9ybSA9IGN1cnJlbnRQbGF0Zm9ybSkge1xuICAgIGxldCBib3VuZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGlzUHJlZml4ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgY2hlY2tQcmVmaXggPSAobmFtZSwgaXMpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBpc1ByZWZpeFtuYW1lXTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbClcbiAgICAgICAgICAgIGlzUHJlZml4W25hbWVdID0gaXM7XG4gICAgICAgIGVsc2UgaWYgKGN1cnJlbnQgIT0gaXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJLZXkgYmluZGluZyBcIiArIG5hbWUgKyBcIiBpcyB1c2VkIGJvdGggYXMgYSByZWd1bGFyIGJpbmRpbmcgYW5kIGFzIGEgbXVsdGktc3Ryb2tlIHByZWZpeFwiKTtcbiAgICB9O1xuICAgIGxldCBhZGQgPSAoc2NvcGUsIGtleSwgY29tbWFuZCwgcHJldmVudERlZmF1bHQsIHN0b3BQcm9wYWdhdGlvbikgPT4ge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBsZXQgc2NvcGVPYmogPSBib3VuZFtzY29wZV0gfHwgKGJvdW5kW3Njb3BlXSA9IE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAgICBsZXQgcGFydHMgPSBrZXkuc3BsaXQoLyAoPyEkKS8pLm1hcChrID0+IG5vcm1hbGl6ZUtleU5hbWUoaywgcGxhdGZvcm0pKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHByZWZpeCA9IHBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgY2hlY2tQcmVmaXgocHJlZml4LCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghc2NvcGVPYmpbcHJlZml4XSlcbiAgICAgICAgICAgICAgICBzY29wZU9ialtwcmVmaXhdID0ge1xuICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcnVuOiBbKHZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3VyT2JqID0gc3RvcmVkUHJlZml4ID0geyB2aWV3LCBwcmVmaXgsIHNjb3BlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChzdG9yZWRQcmVmaXggPT0gb3VyT2JqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWRQcmVmaXggPSBudWxsOyB9LCBQcmVmaXhUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZnVsbCA9IHBhcnRzLmpvaW4oXCIgXCIpO1xuICAgICAgICBjaGVja1ByZWZpeChmdWxsLCBmYWxzZSk7XG4gICAgICAgIGxldCBiaW5kaW5nID0gc2NvcGVPYmpbZnVsbF0gfHwgKHNjb3BlT2JqW2Z1bGxdID0ge1xuICAgICAgICAgICAgcHJldmVudERlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIHJ1bjogKChfYiA9IChfYSA9IHNjb3BlT2JqLl9hbnkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ydW4pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zbGljZSgpKSB8fCBbXVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbW1hbmQpXG4gICAgICAgICAgICBiaW5kaW5nLnJ1bi5wdXNoKGNvbW1hbmQpO1xuICAgICAgICBpZiAocHJldmVudERlZmF1bHQpXG4gICAgICAgICAgICBiaW5kaW5nLnByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHN0b3BQcm9wYWdhdGlvbilcbiAgICAgICAgICAgIGJpbmRpbmcuc3RvcFByb3BhZ2F0aW9uID0gdHJ1ZTtcbiAgICB9O1xuICAgIGZvciAobGV0IGIgb2YgYmluZGluZ3MpIHtcbiAgICAgICAgbGV0IHNjb3BlcyA9IGIuc2NvcGUgPyBiLnNjb3BlLnNwbGl0KFwiIFwiKSA6IFtcImVkaXRvclwiXTtcbiAgICAgICAgaWYgKGIuYW55KVxuICAgICAgICAgICAgZm9yIChsZXQgc2NvcGUgb2Ygc2NvcGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNjb3BlT2JqID0gYm91bmRbc2NvcGVdIHx8IChib3VuZFtzY29wZV0gPSBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjb3BlT2JqLl9hbnkpXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlT2JqLl9hbnkgPSB7IHByZXZlbnREZWZhdWx0OiBmYWxzZSwgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZSwgcnVuOiBbXSB9O1xuICAgICAgICAgICAgICAgIGxldCB7IGFueSB9ID0gYjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gc2NvcGVPYmopXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlT2JqW2tleV0ucnVuLnB1c2godmlldyA9PiBhbnkodmlldywgY3VycmVudEtleUV2ZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGxldCBuYW1lID0gYltwbGF0Zm9ybV0gfHwgYi5rZXk7XG4gICAgICAgIGlmICghbmFtZSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGxldCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICAgICAgICAgIGFkZChzY29wZSwgbmFtZSwgYi5ydW4sIGIucHJldmVudERlZmF1bHQsIGIuc3RvcFByb3BhZ2F0aW9uKTtcbiAgICAgICAgICAgIGlmIChiLnNoaWZ0KVxuICAgICAgICAgICAgICAgIGFkZChzY29wZSwgXCJTaGlmdC1cIiArIG5hbWUsIGIuc2hpZnQsIGIucHJldmVudERlZmF1bHQsIGIuc3RvcFByb3BhZ2F0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYm91bmQ7XG59XG5sZXQgY3VycmVudEtleUV2ZW50ID0gbnVsbDtcbmZ1bmN0aW9uIHJ1bkhhbmRsZXJzKG1hcCwgZXZlbnQsIHZpZXcsIHNjb3BlKSB7XG4gICAgY3VycmVudEtleUV2ZW50ID0gZXZlbnQ7XG4gICAgbGV0IG5hbWUgPSBrZXlOYW1lKGV2ZW50KTtcbiAgICBsZXQgY2hhckNvZGUgPSBjb2RlUG9pbnRBdChuYW1lLCAwKSwgaXNDaGFyID0gY29kZVBvaW50U2l6ZShjaGFyQ29kZSkgPT0gbmFtZS5sZW5ndGggJiYgbmFtZSAhPSBcIiBcIjtcbiAgICBsZXQgcHJlZml4ID0gXCJcIiwgaGFuZGxlZCA9IGZhbHNlLCBwcmV2ZW50ZWQgPSBmYWxzZSwgc3RvcFByb3BhZ2F0aW9uID0gZmFsc2U7XG4gICAgaWYgKHN0b3JlZFByZWZpeCAmJiBzdG9yZWRQcmVmaXgudmlldyA9PSB2aWV3ICYmIHN0b3JlZFByZWZpeC5zY29wZSA9PSBzY29wZSkge1xuICAgICAgICBwcmVmaXggPSBzdG9yZWRQcmVmaXgucHJlZml4ICsgXCIgXCI7XG4gICAgICAgIGlmIChtb2RpZmllckNvZGVzLmluZGV4T2YoZXZlbnQua2V5Q29kZSkgPCAwKSB7XG4gICAgICAgICAgICBwcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgICAgc3RvcmVkUHJlZml4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgcmFuID0gbmV3IFNldDtcbiAgICBsZXQgcnVuRm9yID0gKGJpbmRpbmcpID0+IHtcbiAgICAgICAgaWYgKGJpbmRpbmcpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNtZCBvZiBiaW5kaW5nLnJ1bilcbiAgICAgICAgICAgICAgICBpZiAoIXJhbi5oYXMoY21kKSkge1xuICAgICAgICAgICAgICAgICAgICByYW4uYWRkKGNtZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjbWQodmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nLnN0b3BQcm9wYWdhdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wUHJvcGFnYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmluZGluZy5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nLnN0b3BQcm9wYWdhdGlvbilcbiAgICAgICAgICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIGxldCBzY29wZU9iaiA9IG1hcFtzY29wZV0sIGJhc2VOYW1lLCBzaGlmdE5hbWU7XG4gICAgaWYgKHNjb3BlT2JqKSB7XG4gICAgICAgIGlmIChydW5Gb3Ioc2NvcGVPYmpbcHJlZml4ICsgbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCAhaXNDaGFyKV0pKSB7XG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0NoYXIgJiYgKGV2ZW50LmFsdEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmXG4gICAgICAgICAgICAvLyBDdHJsLUFsdCBtYXkgYmUgdXNlZCBmb3IgQWx0R3Igb24gV2luZG93c1xuICAgICAgICAgICAgIShicm93c2VyLndpbmRvd3MgJiYgZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkpICYmXG4gICAgICAgICAgICAoYmFzZU5hbWUgPSBiYXNlW2V2ZW50LmtleUNvZGVdKSAmJiBiYXNlTmFtZSAhPSBuYW1lKSB7XG4gICAgICAgICAgICBpZiAocnVuRm9yKHNjb3BlT2JqW3ByZWZpeCArIG1vZGlmaWVycyhiYXNlTmFtZSwgZXZlbnQsIHRydWUpXSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIChzaGlmdE5hbWUgPSBzaGlmdFtldmVudC5rZXlDb2RlXSkgIT0gbmFtZSAmJiBzaGlmdE5hbWUgIT0gYmFzZU5hbWUgJiZcbiAgICAgICAgICAgICAgICBydW5Gb3Ioc2NvcGVPYmpbcHJlZml4ICsgbW9kaWZpZXJzKHNoaWZ0TmFtZSwgZXZlbnQsIGZhbHNlKV0pKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDaGFyICYmIGV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICAgICAgICBydW5Gb3Ioc2NvcGVPYmpbcHJlZml4ICsgbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCB0cnVlKV0pKSB7XG4gICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhhbmRsZWQgJiYgcnVuRm9yKHNjb3BlT2JqLl9hbnkpKVxuICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChwcmV2ZW50ZWQpXG4gICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgIGlmIChoYW5kbGVkICYmIHN0b3BQcm9wYWdhdGlvbilcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY3VycmVudEtleUV2ZW50ID0gbnVsbDtcbiAgICByZXR1cm4gaGFuZGxlZDtcbn1cblxuLyoqXG5JbXBsZW1lbnRhdGlvbiBvZiBbYExheWVyTWFya2VyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkxheWVyTWFya2VyKSB0aGF0IGNyZWF0ZXNcbmEgcmVjdGFuZ2xlIGF0IGEgZ2l2ZW4gc2V0IG9mIGNvb3JkaW5hdGVzLlxuKi9cbmNsYXNzIFJlY3RhbmdsZU1hcmtlciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFya2VyIHdpdGggdGhlIGdpdmVuIGNsYXNzIGFuZCBkaW1lbnNpb25zLiBJZiBgd2lkdGhgXG4gICAgaXMgbnVsbCwgdGhlIERPTSBlbGVtZW50IHdpbGwgZ2V0IG5vIHdpZHRoIHN0eWxlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY2xhc3NOYW1lLCBcbiAgICAvKipcbiAgICBUaGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgbWFya2VyIChpbiBwaXhlbHMsIGRvY3VtZW50LXJlbGF0aXZlKS5cbiAgICAqL1xuICAgIGxlZnQsIFxuICAgIC8qKlxuICAgIFRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIG1hcmtlci5cbiAgICAqL1xuICAgIHRvcCwgXG4gICAgLyoqXG4gICAgVGhlIHdpZHRoIG9mIHRoZSBtYXJrZXIsIG9yIG51bGwgaWYgaXQgc2hvdWxkbid0IGdldCBhIHdpZHRoIGFzc2lnbmVkLlxuICAgICovXG4gICAgd2lkdGgsIFxuICAgIC8qKlxuICAgIFRoZSBoZWlnaHQgb2YgdGhlIG1hcmtlci5cbiAgICAqL1xuICAgIGhlaWdodCkge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgfVxuICAgIGRyYXcoKSB7XG4gICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBlbHQuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWU7XG4gICAgICAgIHRoaXMuYWRqdXN0KGVsdCk7XG4gICAgICAgIHJldHVybiBlbHQ7XG4gICAgfVxuICAgIHVwZGF0ZShlbHQsIHByZXYpIHtcbiAgICAgICAgaWYgKHByZXYuY2xhc3NOYW1lICE9IHRoaXMuY2xhc3NOYW1lKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmFkanVzdChlbHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYWRqdXN0KGVsdCkge1xuICAgICAgICBlbHQuc3R5bGUubGVmdCA9IHRoaXMubGVmdCArIFwicHhcIjtcbiAgICAgICAgZWx0LnN0eWxlLnRvcCA9IHRoaXMudG9wICsgXCJweFwiO1xuICAgICAgICBpZiAodGhpcy53aWR0aCAhPSBudWxsKVxuICAgICAgICAgICAgZWx0LnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArIFwicHhcIjtcbiAgICAgICAgZWx0LnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgXCJweFwiO1xuICAgIH1cbiAgICBlcShwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZnQgPT0gcC5sZWZ0ICYmIHRoaXMudG9wID09IHAudG9wICYmIHRoaXMud2lkdGggPT0gcC53aWR0aCAmJiB0aGlzLmhlaWdodCA9PSBwLmhlaWdodCAmJlxuICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPT0gcC5jbGFzc05hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNldCBvZiByZWN0YW5nbGVzIGZvciB0aGUgZ2l2ZW4gc2VsZWN0aW9uIHJhbmdlLFxuICAgIGFzc2lnbmluZyB0aGVtIHRoZWNsYXNzYGNsYXNzTmFtZWAuIFdpbGwgY3JlYXRlIGEgc2luZ2xlXG4gICAgcmVjdGFuZ2xlIGZvciBlbXB0eSByYW5nZXMsIGFuZCBhIHNldCBvZiBzZWxlY3Rpb24tc3R5bGVcbiAgICByZWN0YW5nbGVzIGNvdmVyaW5nIHRoZSByYW5nZSdzIGNvbnRlbnQgKGluIGEgYmlkaS1hd2FyZVxuICAgIHdheSkgZm9yIG5vbi1lbXB0eSBvbmVzLlxuICAgICovXG4gICAgc3RhdGljIGZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgcmFuZ2UpIHtcbiAgICAgICAgaWYgKHJhbmdlLmVtcHR5KSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gdmlldy5jb29yZHNBdFBvcyhyYW5nZS5oZWFkLCByYW5nZS5hc3NvYyB8fCAxKTtcbiAgICAgICAgICAgIGlmICghcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIGxldCBiYXNlID0gZ2V0QmFzZSh2aWV3KTtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFJlY3RhbmdsZU1hcmtlcihjbGFzc05hbWUsIHBvcy5sZWZ0IC0gYmFzZS5sZWZ0LCBwb3MudG9wIC0gYmFzZS50b3AsIG51bGwsIHBvcy5ib3R0b20gLSBwb3MudG9wKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjdGFuZ2xlc0ZvclJhbmdlKHZpZXcsIGNsYXNzTmFtZSwgcmFuZ2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0QmFzZSh2aWV3KSB7XG4gICAgbGV0IHJlY3QgPSB2aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgbGVmdCA9IHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSID8gcmVjdC5sZWZ0IDogcmVjdC5yaWdodCAtIHZpZXcuc2Nyb2xsRE9NLmNsaWVudFdpZHRoICogdmlldy5zY2FsZVg7XG4gICAgcmV0dXJuIHsgbGVmdDogbGVmdCAtIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbExlZnQgKiB2aWV3LnNjYWxlWCwgdG9wOiByZWN0LnRvcCAtIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCAqIHZpZXcuc2NhbGVZIH07XG59XG5mdW5jdGlvbiB3cmFwcGVkTGluZSh2aWV3LCBwb3MsIHNpZGUsIGluc2lkZSkge1xuICAgIGxldCBjb29yZHMgPSB2aWV3LmNvb3Jkc0F0UG9zKHBvcywgc2lkZSAqIDIpO1xuICAgIGlmICghY29vcmRzKVxuICAgICAgICByZXR1cm4gaW5zaWRlO1xuICAgIGxldCBlZGl0b3JSZWN0ID0gdmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHkgPSAoY29vcmRzLnRvcCArIGNvb3Jkcy5ib3R0b20pIC8gMjtcbiAgICBsZXQgbGVmdCA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBlZGl0b3JSZWN0LmxlZnQgKyAxLCB5IH0pO1xuICAgIGxldCByaWdodCA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBlZGl0b3JSZWN0LnJpZ2h0IC0gMSwgeSB9KTtcbiAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpXG4gICAgICAgIHJldHVybiBpbnNpZGU7XG4gICAgcmV0dXJuIHsgZnJvbTogTWF0aC5tYXgoaW5zaWRlLmZyb20sIE1hdGgubWluKGxlZnQsIHJpZ2h0KSksIHRvOiBNYXRoLm1pbihpbnNpZGUudG8sIE1hdGgubWF4KGxlZnQsIHJpZ2h0KSkgfTtcbn1cbmZ1bmN0aW9uIHJlY3RhbmdsZXNGb3JSYW5nZSh2aWV3LCBjbGFzc05hbWUsIHJhbmdlKSB7XG4gICAgaWYgKHJhbmdlLnRvIDw9IHZpZXcudmlld3BvcnQuZnJvbSB8fCByYW5nZS5mcm9tID49IHZpZXcudmlld3BvcnQudG8pXG4gICAgICAgIHJldHVybiBbXTtcbiAgICBsZXQgZnJvbSA9IE1hdGgubWF4KHJhbmdlLmZyb20sIHZpZXcudmlld3BvcnQuZnJvbSksIHRvID0gTWF0aC5taW4ocmFuZ2UudG8sIHZpZXcudmlld3BvcnQudG8pO1xuICAgIGxldCBsdHIgPSB2aWV3LnRleHREaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUjtcbiAgICBsZXQgY29udGVudCA9IHZpZXcuY29udGVudERPTSwgY29udGVudFJlY3QgPSBjb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBiYXNlID0gZ2V0QmFzZSh2aWV3KTtcbiAgICBsZXQgbGluZUVsdCA9IGNvbnRlbnQucXVlcnlTZWxlY3RvcihcIi5jbS1saW5lXCIpLCBsaW5lU3R5bGUgPSBsaW5lRWx0ICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGxpbmVFbHQpO1xuICAgIGxldCBsZWZ0U2lkZSA9IGNvbnRlbnRSZWN0LmxlZnQgK1xuICAgICAgICAobGluZVN0eWxlID8gcGFyc2VJbnQobGluZVN0eWxlLnBhZGRpbmdMZWZ0KSArIE1hdGgubWluKDAsIHBhcnNlSW50KGxpbmVTdHlsZS50ZXh0SW5kZW50KSkgOiAwKTtcbiAgICBsZXQgcmlnaHRTaWRlID0gY29udGVudFJlY3QucmlnaHQgLSAobGluZVN0eWxlID8gcGFyc2VJbnQobGluZVN0eWxlLnBhZGRpbmdSaWdodCkgOiAwKTtcbiAgICBsZXQgc3RhcnRCbG9jayA9IGJsb2NrQXQodmlldywgZnJvbSwgMSksIGVuZEJsb2NrID0gYmxvY2tBdCh2aWV3LCB0bywgLTEpO1xuICAgIGxldCB2aXN1YWxTdGFydCA9IHN0YXJ0QmxvY2sudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCA/IHN0YXJ0QmxvY2sgOiBudWxsO1xuICAgIGxldCB2aXN1YWxFbmQgPSBlbmRCbG9jay50eXBlID09IEJsb2NrVHlwZS5UZXh0ID8gZW5kQmxvY2sgOiBudWxsO1xuICAgIGlmICh2aXN1YWxTdGFydCAmJiAodmlldy5saW5lV3JhcHBpbmcgfHwgc3RhcnRCbG9jay53aWRnZXRMaW5lQnJlYWtzKSlcbiAgICAgICAgdmlzdWFsU3RhcnQgPSB3cmFwcGVkTGluZSh2aWV3LCBmcm9tLCAxLCB2aXN1YWxTdGFydCk7XG4gICAgaWYgKHZpc3VhbEVuZCAmJiAodmlldy5saW5lV3JhcHBpbmcgfHwgZW5kQmxvY2sud2lkZ2V0TGluZUJyZWFrcykpXG4gICAgICAgIHZpc3VhbEVuZCA9IHdyYXBwZWRMaW5lKHZpZXcsIHRvLCAtMSwgdmlzdWFsRW5kKTtcbiAgICBpZiAodmlzdWFsU3RhcnQgJiYgdmlzdWFsRW5kICYmIHZpc3VhbFN0YXJ0LmZyb20gPT0gdmlzdWFsRW5kLmZyb20gJiYgdmlzdWFsU3RhcnQudG8gPT0gdmlzdWFsRW5kLnRvKSB7XG4gICAgICAgIHJldHVybiBwaWVjZXMoZHJhd0ZvckxpbmUocmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHZpc3VhbFN0YXJ0KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgdG9wID0gdmlzdWFsU3RhcnQgPyBkcmF3Rm9yTGluZShyYW5nZS5mcm9tLCBudWxsLCB2aXN1YWxTdGFydCkgOiBkcmF3Rm9yV2lkZ2V0KHN0YXJ0QmxvY2ssIGZhbHNlKTtcbiAgICAgICAgbGV0IGJvdHRvbSA9IHZpc3VhbEVuZCA/IGRyYXdGb3JMaW5lKG51bGwsIHJhbmdlLnRvLCB2aXN1YWxFbmQpIDogZHJhd0ZvcldpZGdldChlbmRCbG9jaywgdHJ1ZSk7XG4gICAgICAgIGxldCBiZXR3ZWVuID0gW107XG4gICAgICAgIGlmICgodmlzdWFsU3RhcnQgfHwgc3RhcnRCbG9jaykudG8gPCAodmlzdWFsRW5kIHx8IGVuZEJsb2NrKS5mcm9tIC0gKHZpc3VhbFN0YXJ0ICYmIHZpc3VhbEVuZCA/IDEgOiAwKSB8fFxuICAgICAgICAgICAgc3RhcnRCbG9jay53aWRnZXRMaW5lQnJlYWtzID4gMSAmJiB0b3AuYm90dG9tICsgdmlldy5kZWZhdWx0TGluZUhlaWdodCAvIDIgPCBib3R0b20udG9wKVxuICAgICAgICAgICAgYmV0d2Vlbi5wdXNoKHBpZWNlKGxlZnRTaWRlLCB0b3AuYm90dG9tLCByaWdodFNpZGUsIGJvdHRvbS50b3ApKTtcbiAgICAgICAgZWxzZSBpZiAodG9wLmJvdHRvbSA8IGJvdHRvbS50b3AgJiYgdmlldy5lbGVtZW50QXRIZWlnaHQoKHRvcC5ib3R0b20gKyBib3R0b20udG9wKSAvIDIpLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQpXG4gICAgICAgICAgICB0b3AuYm90dG9tID0gYm90dG9tLnRvcCA9ICh0b3AuYm90dG9tICsgYm90dG9tLnRvcCkgLyAyO1xuICAgICAgICByZXR1cm4gcGllY2VzKHRvcCkuY29uY2F0KGJldHdlZW4pLmNvbmNhdChwaWVjZXMoYm90dG9tKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBpZWNlKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZU1hcmtlcihjbGFzc05hbWUsIGxlZnQgLSBiYXNlLmxlZnQsIHRvcCAtIGJhc2UudG9wLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBpZWNlcyh7IHRvcCwgYm90dG9tLCBob3Jpem9udGFsIH0pIHtcbiAgICAgICAgbGV0IHBpZWNlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhvcml6b250YWwubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgICAgICBwaWVjZXMucHVzaChwaWVjZShob3Jpem9udGFsW2ldLCB0b3AsIGhvcml6b250YWxbaSArIDFdLCBib3R0b20pKTtcbiAgICAgICAgcmV0dXJuIHBpZWNlcztcbiAgICB9XG4gICAgLy8gR2V0cyBwYXNzZWQgZnJvbS90byBpbiBsaW5lLWxvY2FsIHBvc2l0aW9uc1xuICAgIGZ1bmN0aW9uIGRyYXdGb3JMaW5lKGZyb20sIHRvLCBsaW5lKSB7XG4gICAgICAgIGxldCB0b3AgPSAxZTksIGJvdHRvbSA9IC0xZTksIGhvcml6b250YWwgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gYWRkU3Bhbihmcm9tLCBmcm9tT3BlbiwgdG8sIHRvT3BlbiwgZGlyKSB7XG4gICAgICAgICAgICAvLyBQYXNzaW5nIDIvLTIgaXMgYSBrbHVkZ2UgdG8gZm9yY2UgdGhlIHZpZXcgdG8gcmV0dXJuXG4gICAgICAgICAgICAvLyBjb29yZGluYXRlcyBvbiB0aGUgcHJvcGVyIHNpZGUgb2YgYmxvY2sgd2lkZ2V0cywgc2luY2VcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6aW5nIHRoZSBzaWRlIHRoZXJlLCB0aG91Z2ggYXBwcm9wcmlhdGUgZm9yIG1vc3RcbiAgICAgICAgICAgIC8vIGNvb3Jkc0F0UG9zIHF1ZXJpZXMsIHdvdWxkIGJyZWFrIHNlbGVjdGlvbiBkcmF3aW5nLlxuICAgICAgICAgICAgbGV0IGZyb21Db29yZHMgPSB2aWV3LmNvb3Jkc0F0UG9zKGZyb20sIChmcm9tID09IGxpbmUudG8gPyAtMiA6IDIpKTtcbiAgICAgICAgICAgIGxldCB0b0Nvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3ModG8sICh0byA9PSBsaW5lLmZyb20gPyAyIDogLTIpKTtcbiAgICAgICAgICAgIGlmICghZnJvbUNvb3JkcyB8fCAhdG9Db29yZHMpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdG9wID0gTWF0aC5taW4oZnJvbUNvb3Jkcy50b3AsIHRvQ29vcmRzLnRvcCwgdG9wKTtcbiAgICAgICAgICAgIGJvdHRvbSA9IE1hdGgubWF4KGZyb21Db29yZHMuYm90dG9tLCB0b0Nvb3Jkcy5ib3R0b20sIGJvdHRvbSk7XG4gICAgICAgICAgICBpZiAoZGlyID09IERpcmVjdGlvbi5MVFIpXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5wdXNoKGx0ciAmJiBmcm9tT3BlbiA/IGxlZnRTaWRlIDogZnJvbUNvb3Jkcy5sZWZ0LCBsdHIgJiYgdG9PcGVuID8gcmlnaHRTaWRlIDogdG9Db29yZHMucmlnaHQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGhvcml6b250YWwucHVzaCghbHRyICYmIHRvT3BlbiA/IGxlZnRTaWRlIDogdG9Db29yZHMubGVmdCwgIWx0ciAmJiBmcm9tT3BlbiA/IHJpZ2h0U2lkZSA6IGZyb21Db29yZHMucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydCA9IGZyb20gIT09IG51bGwgJiYgZnJvbSAhPT0gdm9pZCAwID8gZnJvbSA6IGxpbmUuZnJvbSwgZW5kID0gdG8gIT09IG51bGwgJiYgdG8gIT09IHZvaWQgMCA/IHRvIDogbGluZS50bztcbiAgICAgICAgLy8gU3BsaXQgdGhlIHJhbmdlIGJ5IHZpc2libGUgcmFuZ2UgYW5kIGRvY3VtZW50IGxpbmVcbiAgICAgICAgZm9yIChsZXQgciBvZiB2aWV3LnZpc2libGVSYW5nZXMpXG4gICAgICAgICAgICBpZiAoci50byA+IHN0YXJ0ICYmIHIuZnJvbSA8IGVuZCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBvcyA9IE1hdGgubWF4KHIuZnJvbSwgc3RhcnQpLCBlbmRQb3MgPSBNYXRoLm1pbihyLnRvLCBlbmQpOzspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvY0xpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3BhbiBvZiB2aWV3LmJpZGlTcGFucyhkb2NMaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwYW5Gcm9tID0gc3Bhbi5mcm9tICsgZG9jTGluZS5mcm9tLCBzcGFuVG8gPSBzcGFuLnRvICsgZG9jTGluZS5mcm9tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5Gcm9tID49IGVuZFBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuVG8gPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3BhbihNYXRoLm1heChzcGFuRnJvbSwgcG9zKSwgZnJvbSA9PSBudWxsICYmIHNwYW5Gcm9tIDw9IHN0YXJ0LCBNYXRoLm1pbihzcGFuVG8sIGVuZFBvcyksIHRvID09IG51bGwgJiYgc3BhblRvID49IGVuZCwgc3Bhbi5kaXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IGRvY0xpbmUudG8gKyAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zID49IGVuZFBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGhvcml6b250YWwubGVuZ3RoID09IDApXG4gICAgICAgICAgICBhZGRTcGFuKHN0YXJ0LCBmcm9tID09IG51bGwsIGVuZCwgdG8gPT0gbnVsbCwgdmlldy50ZXh0RGlyZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHsgdG9wLCBib3R0b20sIGhvcml6b250YWwgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZHJhd0ZvcldpZGdldChibG9jaywgdG9wKSB7XG4gICAgICAgIGxldCB5ID0gY29udGVudFJlY3QudG9wICsgKHRvcCA/IGJsb2NrLnRvcCA6IGJsb2NrLmJvdHRvbSk7XG4gICAgICAgIHJldHVybiB7IHRvcDogeSwgYm90dG9tOiB5LCBob3Jpem9udGFsOiBbXSB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVNYXJrZXIoYSwgYikge1xuICAgIHJldHVybiBhLmNvbnN0cnVjdG9yID09IGIuY29uc3RydWN0b3IgJiYgYS5lcShiKTtcbn1cbmNsYXNzIExheWVyVmlldyB7XG4gICAgY29uc3RydWN0b3IodmlldywgbGF5ZXIpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5sYXllciA9IGxheWVyO1xuICAgICAgICB0aGlzLmRyYXduID0gW107XG4gICAgICAgIHRoaXMuc2NhbGVYID0gMTtcbiAgICAgICAgdGhpcy5zY2FsZVkgPSAxO1xuICAgICAgICB0aGlzLm1lYXN1cmVSZXEgPSB7IHJlYWQ6IHRoaXMubWVhc3VyZS5iaW5kKHRoaXMpLCB3cml0ZTogdGhpcy5kcmF3LmJpbmQodGhpcykgfTtcbiAgICAgICAgdGhpcy5kb20gPSB2aWV3LnNjcm9sbERPTS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChcImNtLWxheWVyXCIpO1xuICAgICAgICBpZiAobGF5ZXIuYWJvdmUpXG4gICAgICAgICAgICB0aGlzLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tbGF5ZXItYWJvdmVcIik7XG4gICAgICAgIGlmIChsYXllci5jbGFzcylcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQobGF5ZXIuY2xhc3MpO1xuICAgICAgICB0aGlzLnNjYWxlKCk7XG4gICAgICAgIHRoaXMuZG9tLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgdGhpcy5zZXRPcmRlcih2aWV3LnN0YXRlKTtcbiAgICAgICAgdmlldy5yZXF1ZXN0TWVhc3VyZSh0aGlzLm1lYXN1cmVSZXEpO1xuICAgICAgICBpZiAobGF5ZXIubW91bnQpXG4gICAgICAgICAgICBsYXllci5tb3VudCh0aGlzLmRvbSwgdmlldyk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGxheWVyT3JkZXIpICE9IHVwZGF0ZS5zdGF0ZS5mYWNldChsYXllck9yZGVyKSlcbiAgICAgICAgICAgIHRoaXMuc2V0T3JkZXIodXBkYXRlLnN0YXRlKTtcbiAgICAgICAgaWYgKHRoaXMubGF5ZXIudXBkYXRlKHVwZGF0ZSwgdGhpcy5kb20pIHx8IHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2NhbGUoKTtcbiAgICAgICAgICAgIHVwZGF0ZS52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZG9jVmlld1VwZGF0ZSh2aWV3KSB7XG4gICAgICAgIGlmICh0aGlzLmxheWVyLnVwZGF0ZU9uRG9jVmlld1VwZGF0ZSAhPT0gZmFsc2UpXG4gICAgICAgICAgICB2aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgfVxuICAgIHNldE9yZGVyKHN0YXRlKSB7XG4gICAgICAgIGxldCBwb3MgPSAwLCBvcmRlciA9IHN0YXRlLmZhY2V0KGxheWVyT3JkZXIpO1xuICAgICAgICB3aGlsZSAocG9zIDwgb3JkZXIubGVuZ3RoICYmIG9yZGVyW3Bvc10gIT0gdGhpcy5sYXllcilcbiAgICAgICAgICAgIHBvcysrO1xuICAgICAgICB0aGlzLmRvbS5zdHlsZS56SW5kZXggPSBTdHJpbmcoKHRoaXMubGF5ZXIuYWJvdmUgPyAxNTAgOiAtMSkgLSBwb3MpO1xuICAgIH1cbiAgICBtZWFzdXJlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXllci5tYXJrZXJzKHRoaXMudmlldyk7XG4gICAgfVxuICAgIHNjYWxlKCkge1xuICAgICAgICBsZXQgeyBzY2FsZVgsIHNjYWxlWSB9ID0gdGhpcy52aWV3O1xuICAgICAgICBpZiAoc2NhbGVYICE9IHRoaXMuc2NhbGVYIHx8IHNjYWxlWSAhPSB0aGlzLnNjYWxlWSkge1xuICAgICAgICAgICAgdGhpcy5zY2FsZVggPSBzY2FsZVg7XG4gICAgICAgICAgICB0aGlzLnNjYWxlWSA9IHNjYWxlWTtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezEgLyBzY2FsZVh9LCAkezEgLyBzY2FsZVl9KWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJhdyhtYXJrZXJzKSB7XG4gICAgICAgIGlmIChtYXJrZXJzLmxlbmd0aCAhPSB0aGlzLmRyYXduLmxlbmd0aCB8fCBtYXJrZXJzLnNvbWUoKHAsIGkpID0+ICFzYW1lTWFya2VyKHAsIHRoaXMuZHJhd25baV0pKSkge1xuICAgICAgICAgICAgbGV0IG9sZCA9IHRoaXMuZG9tLmZpcnN0Q2hpbGQsIG9sZEkgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgbWFya2VyIG9mIG1hcmtlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAobWFya2VyLnVwZGF0ZSAmJiBvbGQgJiYgbWFya2VyLmNvbnN0cnVjdG9yICYmIHRoaXMuZHJhd25bb2xkSV0uY29uc3RydWN0b3IgJiZcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyLnVwZGF0ZShvbGQsIHRoaXMuZHJhd25bb2xkSV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZCA9IG9sZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgb2xkSSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uaW5zZXJ0QmVmb3JlKG1hcmtlci5kcmF3KCksIG9sZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKG9sZCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gb2xkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIG9sZC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBvbGQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kcmF3biA9IG1hcmtlcnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMubGF5ZXIuZGVzdHJveSlcbiAgICAgICAgICAgIHRoaXMubGF5ZXIuZGVzdHJveSh0aGlzLmRvbSwgdGhpcy52aWV3KTtcbiAgICAgICAgdGhpcy5kb20ucmVtb3ZlKCk7XG4gICAgfVxufVxuY29uc3QgbGF5ZXJPcmRlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuRGVmaW5lIGEgbGF5ZXIuXG4qL1xuZnVuY3Rpb24gbGF5ZXIoY29uZmlnKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgVmlld1BsdWdpbi5kZWZpbmUodiA9PiBuZXcgTGF5ZXJWaWV3KHYsIGNvbmZpZykpLFxuICAgICAgICBsYXllck9yZGVyLm9mKGNvbmZpZylcbiAgICBdO1xufVxuXG5jb25zdCBzZWxlY3Rpb25Db25maWcgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKGNvbmZpZ3MpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVDb25maWcoY29uZmlncywge1xuICAgICAgICAgICAgY3Vyc29yQmxpbmtSYXRlOiAxMjAwLFxuICAgICAgICAgICAgZHJhd1JhbmdlQ3Vyc29yOiB0cnVlXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGN1cnNvckJsaW5rUmF0ZTogKGEsIGIpID0+IE1hdGgubWluKGEsIGIpLFxuICAgICAgICAgICAgZHJhd1JhbmdlQ3Vyc29yOiAoYSwgYikgPT4gYSB8fCBiXG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGhpZGVzIHRoZSBicm93c2VyJ3MgbmF0aXZlIHNlbGVjdGlvbiBhbmRcbmN1cnNvciwgcmVwbGFjaW5nIHRoZSBzZWxlY3Rpb24gd2l0aCBhIGJhY2tncm91bmQgYmVoaW5kIHRoZSB0ZXh0XG4od2l0aCB0aGUgYGNtLXNlbGVjdGlvbkJhY2tncm91bmRgIGNsYXNzKSwgYW5kIHRoZVxuY3Vyc29ycyB3aXRoIGVsZW1lbnRzIG92ZXJsYWlkIG92ZXIgdGhlIGNvZGUgKHVzaW5nXG5gY20tY3Vyc29yLXByaW1hcnlgIGFuZCBgY20tY3Vyc29yLXNlY29uZGFyeWApLlxuXG5UaGlzIGFsbG93cyB0aGUgZWRpdG9yIHRvIGRpc3BsYXkgc2Vjb25kYXJ5IHNlbGVjdGlvbiByYW5nZXMsIGFuZFxudGVuZHMgdG8gcHJvZHVjZSBhIHR5cGUgb2Ygc2VsZWN0aW9uIG1vcmUgaW4gbGluZSB3aXRoIHRoYXQgdXNlcnNcbmV4cGVjdCBpbiBhIHRleHQgZWRpdG9yICh0aGUgbmF0aXZlIHNlbGVjdGlvbiBzdHlsaW5nIHdpbGwgb2Z0ZW5cbmxlYXZlIGdhcHMgYmV0d2VlbiBsaW5lcyBhbmQgd29uJ3QgZmlsbCB0aGUgaG9yaXpvbnRhbCBzcGFjZSBhZnRlclxuYSBsaW5lIHdoZW4gdGhlIHNlbGVjdGlvbiBjb250aW51ZXMgcGFzdCBpdCkuXG5cbkl0IGRvZXMgaGF2ZSBhIHBlcmZvcm1hbmNlIGNvc3QsIGluIHRoYXQgaXQgcmVxdWlyZXMgYW4gZXh0cmEgRE9NXG5sYXlvdXQgY3ljbGUgZm9yIG1hbnkgdXBkYXRlcyAodGhlIHNlbGVjdGlvbiBpcyBkcmF3biBiYXNlZCBvbiBET01cbmxheW91dCBpbmZvcm1hdGlvbiB0aGF0J3Mgb25seSBhdmFpbGFibGUgYWZ0ZXIgbGF5aW5nIG91dCB0aGVcbmNvbnRlbnQpLlxuKi9cbmZ1bmN0aW9uIGRyYXdTZWxlY3Rpb24oY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBzZWxlY3Rpb25Db25maWcub2YoY29uZmlnKSxcbiAgICAgICAgY3Vyc29yTGF5ZXIsXG4gICAgICAgIHNlbGVjdGlvbkxheWVyLFxuICAgICAgICBoaWRlTmF0aXZlU2VsZWN0aW9uLFxuICAgICAgICBuYXRpdmVTZWxlY3Rpb25IaWRkZW4ub2YodHJ1ZSlcbiAgICBdO1xufVxuLyoqXG5SZXRyaWV2ZSB0aGUgW2BkcmF3U2VsZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LmRyYXdTZWxlY3Rpb24pIGNvbmZpZ3VyYXRpb25cbmZvciB0aGlzIHN0YXRlLiAoTm90ZSB0aGF0IHRoaXMgd2lsbCByZXR1cm4gYSBzZXQgb2YgZGVmYXVsdHMgZXZlblxuaWYgYGRyYXdTZWxlY3Rpb25gIGlzbid0IGVuYWJsZWQuKVxuKi9cbmZ1bmN0aW9uIGdldERyYXdTZWxlY3Rpb25Db25maWcoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKTtcbn1cbmZ1bmN0aW9uIGNvbmZpZ0NoYW5nZWQodXBkYXRlKSB7XG4gICAgcmV0dXJuIHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHNlbGVjdGlvbkNvbmZpZykgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KHNlbGVjdGlvbkNvbmZpZyk7XG59XG5jb25zdCBjdXJzb3JMYXllciA9IC8qQF9fUFVSRV9fKi9sYXllcih7XG4gICAgYWJvdmU6IHRydWUsXG4gICAgbWFya2Vycyh2aWV3KSB7XG4gICAgICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBjb25mID0gc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKTtcbiAgICAgICAgbGV0IGN1cnNvcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgciBvZiBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgICAgICBsZXQgcHJpbSA9IHIgPT0gc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgICAgICBpZiAoci5lbXB0eSB8fCBjb25mLmRyYXdSYW5nZUN1cnNvcikge1xuICAgICAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSBwcmltID8gXCJjbS1jdXJzb3IgY20tY3Vyc29yLXByaW1hcnlcIiA6IFwiY20tY3Vyc29yIGNtLWN1cnNvci1zZWNvbmRhcnlcIjtcbiAgICAgICAgICAgICAgICBsZXQgY3Vyc29yID0gci5lbXB0eSA/IHIgOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHIuaGVhZCwgci5oZWFkID4gci5hbmNob3IgPyAtMSA6IDEpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBpZWNlIG9mIFJlY3RhbmdsZU1hcmtlci5mb3JSYW5nZSh2aWV3LCBjbGFzc05hbWUsIGN1cnNvcikpXG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcnMucHVzaChwaWVjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnNvcnM7XG4gICAgfSxcbiAgICB1cGRhdGUodXBkYXRlLCBkb20pIHtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5zZWxlY3Rpb24pKVxuICAgICAgICAgICAgZG9tLnN0eWxlLmFuaW1hdGlvbk5hbWUgPSBkb20uc3R5bGUuYW5pbWF0aW9uTmFtZSA9PSBcImNtLWJsaW5rXCIgPyBcImNtLWJsaW5rMlwiIDogXCJjbS1ibGlua1wiO1xuICAgICAgICBsZXQgY29uZkNoYW5nZSA9IGNvbmZpZ0NoYW5nZWQodXBkYXRlKTtcbiAgICAgICAgaWYgKGNvbmZDaGFuZ2UpXG4gICAgICAgICAgICBzZXRCbGlua1JhdGUodXBkYXRlLnN0YXRlLCBkb20pO1xuICAgICAgICByZXR1cm4gdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldCB8fCBjb25mQ2hhbmdlO1xuICAgIH0sXG4gICAgbW91bnQoZG9tLCB2aWV3KSB7XG4gICAgICAgIHNldEJsaW5rUmF0ZSh2aWV3LnN0YXRlLCBkb20pO1xuICAgIH0sXG4gICAgY2xhc3M6IFwiY20tY3Vyc29yTGF5ZXJcIlxufSk7XG5mdW5jdGlvbiBzZXRCbGlua1JhdGUoc3RhdGUsIGRvbSkge1xuICAgIGRvbS5zdHlsZS5hbmltYXRpb25EdXJhdGlvbiA9IHN0YXRlLmZhY2V0KHNlbGVjdGlvbkNvbmZpZykuY3Vyc29yQmxpbmtSYXRlICsgXCJtc1wiO1xufVxuY29uc3Qgc2VsZWN0aW9uTGF5ZXIgPSAvKkBfX1BVUkVfXyovbGF5ZXIoe1xuICAgIGFib3ZlOiBmYWxzZSxcbiAgICBtYXJrZXJzKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5tYXAociA9PiByLmVtcHR5ID8gW10gOiBSZWN0YW5nbGVNYXJrZXIuZm9yUmFuZ2UodmlldywgXCJjbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCIsIHIpKVxuICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYikpO1xuICAgIH0sXG4gICAgdXBkYXRlKHVwZGF0ZSwgZG9tKSB7XG4gICAgICAgIHJldHVybiB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuc2VsZWN0aW9uU2V0IHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQgfHwgY29uZmlnQ2hhbmdlZCh1cGRhdGUpO1xuICAgIH0sXG4gICAgY2xhc3M6IFwiY20tc2VsZWN0aW9uTGF5ZXJcIlxufSk7XG5jb25zdCBoaWRlTmF0aXZlU2VsZWN0aW9uID0gLypAX19QVVJFX18qL1ByZWMuaGlnaGVzdCgvKkBfX1BVUkVfXyovRWRpdG9yVmlldy50aGVtZSh7XG4gICAgXCIuY20tbGluZVwiOiB7XG4gICAgICAgIFwiJiA6OnNlbGVjdGlvbiwgJjo6c2VsZWN0aW9uXCI6IHsgYmFja2dyb3VuZENvbG9yOiBcInRyYW5zcGFyZW50ICFpbXBvcnRhbnRcIiB9LFxuICAgICAgICBjYXJldENvbG9yOiBcInRyYW5zcGFyZW50ICFpbXBvcnRhbnRcIlxuICAgIH0sXG4gICAgXCIuY20tY29udGVudFwiOiB7XG4gICAgICAgIGNhcmV0Q29sb3I6IFwidHJhbnNwYXJlbnQgIWltcG9ydGFudFwiLFxuICAgICAgICBcIiYgOmZvY3VzXCI6IHtcbiAgICAgICAgICAgIGNhcmV0Q29sb3I6IFwiaW5pdGlhbCAhaW1wb3J0YW50XCIsXG4gICAgICAgICAgICBcIiY6OnNlbGVjdGlvbiwgJiA6OnNlbGVjdGlvblwiOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIkhpZ2hsaWdodCAhaW1wb3J0YW50XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pKTtcblxuY29uc3Qgc2V0RHJvcEN1cnNvclBvcyA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoe1xuICAgIG1hcChwb3MsIG1hcHBpbmcpIHsgcmV0dXJuIHBvcyA9PSBudWxsID8gbnVsbCA6IG1hcHBpbmcubWFwUG9zKHBvcyk7IH1cbn0pO1xuY29uc3QgZHJvcEN1cnNvclBvcyA9IC8qQF9fUFVSRV9fKi9TdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgY3JlYXRlKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICB1cGRhdGUocG9zLCB0cikge1xuICAgICAgICBpZiAocG9zICE9IG51bGwpXG4gICAgICAgICAgICBwb3MgPSB0ci5jaGFuZ2VzLm1hcFBvcyhwb3MpO1xuICAgICAgICByZXR1cm4gdHIuZWZmZWN0cy5yZWR1Y2UoKHBvcywgZSkgPT4gZS5pcyhzZXREcm9wQ3Vyc29yUG9zKSA/IGUudmFsdWUgOiBwb3MsIHBvcyk7XG4gICAgfVxufSk7XG5jb25zdCBkcmF3RHJvcEN1cnNvciA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmN1cnNvciA9IG51bGw7XG4gICAgICAgIHRoaXMubWVhc3VyZVJlcSA9IHsgcmVhZDogdGhpcy5yZWFkUG9zLmJpbmQodGhpcyksIHdyaXRlOiB0aGlzLmRyYXdDdXJzb3IuYmluZCh0aGlzKSB9O1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGN1cnNvclBvcyA9IHVwZGF0ZS5zdGF0ZS5maWVsZChkcm9wQ3Vyc29yUG9zKTtcbiAgICAgICAgaWYgKGN1cnNvclBvcyA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJzb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIChfYSA9IHRoaXMuY3Vyc29yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnNvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yID0gdGhpcy52aWV3LnNjcm9sbERPTS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5jbGFzc05hbWUgPSBcImNtLWRyb3BDdXJzb3JcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1cGRhdGUuc3RhcnRTdGF0ZS5maWVsZChkcm9wQ3Vyc29yUG9zKSAhPSBjdXJzb3JQb3MgfHwgdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLmdlb21ldHJ5Q2hhbmdlZClcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcucmVxdWVzdE1lYXN1cmUodGhpcy5tZWFzdXJlUmVxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWFkUG9zKCkge1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzO1xuICAgICAgICBsZXQgcG9zID0gdmlldy5zdGF0ZS5maWVsZChkcm9wQ3Vyc29yUG9zKTtcbiAgICAgICAgbGV0IHJlY3QgPSBwb3MgIT0gbnVsbCAmJiB2aWV3LmNvb3Jkc0F0UG9zKHBvcyk7XG4gICAgICAgIGlmICghcmVjdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgb3V0ZXIgPSB2aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCAtIG91dGVyLmxlZnQgKyB2aWV3LnNjcm9sbERPTS5zY3JvbGxMZWZ0ICogdmlldy5zY2FsZVgsXG4gICAgICAgICAgICB0b3A6IHJlY3QudG9wIC0gb3V0ZXIudG9wICsgdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wICogdmlldy5zY2FsZVksXG4gICAgICAgICAgICBoZWlnaHQ6IHJlY3QuYm90dG9tIC0gcmVjdC50b3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZHJhd0N1cnNvcihwb3MpIHtcbiAgICAgICAgaWYgKHRoaXMuY3Vyc29yKSB7XG4gICAgICAgICAgICBsZXQgeyBzY2FsZVgsIHNjYWxlWSB9ID0gdGhpcy52aWV3O1xuICAgICAgICAgICAgaWYgKHBvcykge1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLmxlZnQgPSBwb3MubGVmdCAvIHNjYWxlWCArIFwicHhcIjtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5zdHlsZS50b3AgPSBwb3MudG9wIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yLnN0eWxlLmhlaWdodCA9IHBvcy5oZWlnaHQgLyBzY2FsZVkgKyBcInB4XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5zdHlsZS5sZWZ0ID0gXCItMTAwMDAwcHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5jdXJzb3IpXG4gICAgICAgICAgICB0aGlzLmN1cnNvci5yZW1vdmUoKTtcbiAgICB9XG4gICAgc2V0RHJvcFBvcyhwb3MpIHtcbiAgICAgICAgaWYgKHRoaXMudmlldy5zdGF0ZS5maWVsZChkcm9wQ3Vyc29yUG9zKSAhPSBwb3MpXG4gICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBzZXREcm9wQ3Vyc29yUG9zLm9mKHBvcykgfSk7XG4gICAgfVxufSwge1xuICAgIGV2ZW50T2JzZXJ2ZXJzOiB7XG4gICAgICAgIGRyYWdvdmVyKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldERyb3BQb3ModGhpcy52aWV3LnBvc0F0Q29vcmRzKHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRyYWdsZWF2ZShldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PSB0aGlzLnZpZXcuY29udGVudERPTSB8fCAhdGhpcy52aWV3LmNvbnRlbnRET00uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREcm9wUG9zKG51bGwpO1xuICAgICAgICB9LFxuICAgICAgICBkcmFnZW5kKCkge1xuICAgICAgICAgICAgdGhpcy5zZXREcm9wUG9zKG51bGwpO1xuICAgICAgICB9LFxuICAgICAgICBkcm9wKCkge1xuICAgICAgICAgICAgdGhpcy5zZXREcm9wUG9zKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG4vKipcbkRyYXdzIGEgY3Vyc29yIGF0IHRoZSBjdXJyZW50IGRyb3AgcG9zaXRpb24gd2hlbiBzb21ldGhpbmcgaXNcbmRyYWdnZWQgb3ZlciB0aGUgZWRpdG9yLlxuKi9cbmZ1bmN0aW9uIGRyb3BDdXJzb3IoKSB7XG4gICAgcmV0dXJuIFtkcm9wQ3Vyc29yUG9zLCBkcmF3RHJvcEN1cnNvcl07XG59XG5cbmZ1bmN0aW9uIGl0ZXJNYXRjaGVzKGRvYywgcmUsIGZyb20sIHRvLCBmKSB7XG4gICAgcmUubGFzdEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBjdXJzb3IgPSBkb2MuaXRlclJhbmdlKGZyb20sIHRvKSwgcG9zID0gZnJvbSwgbTsgIWN1cnNvci5uZXh0KCkuZG9uZTsgcG9zICs9IGN1cnNvci52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCFjdXJzb3IubGluZUJyZWFrKVxuICAgICAgICAgICAgd2hpbGUgKG0gPSByZS5leGVjKGN1cnNvci52YWx1ZSkpXG4gICAgICAgICAgICAgICAgZihwb3MgKyBtLmluZGV4LCBtKTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYXRjaFJhbmdlcyh2aWV3LCBtYXhMZW5ndGgpIHtcbiAgICBsZXQgdmlzaWJsZSA9IHZpZXcudmlzaWJsZVJhbmdlcztcbiAgICBpZiAodmlzaWJsZS5sZW5ndGggPT0gMSAmJiB2aXNpYmxlWzBdLmZyb20gPT0gdmlldy52aWV3cG9ydC5mcm9tICYmXG4gICAgICAgIHZpc2libGVbMF0udG8gPT0gdmlldy52aWV3cG9ydC50bylcbiAgICAgICAgcmV0dXJuIHZpc2libGU7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiB2aXNpYmxlKSB7XG4gICAgICAgIGZyb20gPSBNYXRoLm1heCh2aWV3LnN0YXRlLmRvYy5saW5lQXQoZnJvbSkuZnJvbSwgZnJvbSAtIG1heExlbmd0aCk7XG4gICAgICAgIHRvID0gTWF0aC5taW4odmlldy5zdGF0ZS5kb2MubGluZUF0KHRvKS50bywgdG8gKyBtYXhMZW5ndGgpO1xuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCAmJiByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdLnRvID49IGZyb20pXG4gICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdLnRvID0gdG87XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgZnJvbSwgdG8gfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbkhlbHBlciBjbGFzcyB1c2VkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIG1haW50YWluIGRlY29yYXRpb25zIG9uXG52aXNpYmxlIGNvZGUgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLiBUbyBiZSB1c2VkXG5pbiBhIFt2aWV3IHBsdWdpbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LlZpZXdQbHVnaW4pLiBJbnN0YW5jZXMgb2YgdGhpcyBvYmplY3RcbnJlcHJlc2VudCBhIG1hdGNoaW5nIGNvbmZpZ3VyYXRpb24uXG4qL1xuY2xhc3MgTWF0Y2hEZWNvcmF0b3Ige1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIGRlY29yYXRvci5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICBjb25zdCB7IHJlZ2V4cCwgZGVjb3JhdGlvbiwgZGVjb3JhdGUsIGJvdW5kYXJ5LCBtYXhMZW5ndGggPSAxMDAwIH0gPSBjb25maWc7XG4gICAgICAgIGlmICghcmVnZXhwLmdsb2JhbClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiB0byBNYXRjaERlY29yYXRvciBzaG91bGQgaGF2ZSBpdHMgJ2cnIGZsYWcgc2V0XCIpO1xuICAgICAgICB0aGlzLnJlZ2V4cCA9IHJlZ2V4cDtcbiAgICAgICAgaWYgKGRlY29yYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE1hdGNoID0gKG1hdGNoLCB2aWV3LCBmcm9tLCBhZGQpID0+IGRlY29yYXRlKGFkZCwgZnJvbSwgZnJvbSArIG1hdGNoWzBdLmxlbmd0aCwgbWF0Y2gsIHZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZWNvcmF0aW9uID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5hZGRNYXRjaCA9IChtYXRjaCwgdmlldywgZnJvbSwgYWRkKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGRlY28gPSBkZWNvcmF0aW9uKG1hdGNoLCB2aWV3LCBmcm9tKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVjbylcbiAgICAgICAgICAgICAgICAgICAgYWRkKGZyb20sIGZyb20gKyBtYXRjaFswXS5sZW5ndGgsIGRlY28pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZWNvcmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE1hdGNoID0gKG1hdGNoLCBfdmlldywgZnJvbSwgYWRkKSA9PiBhZGQoZnJvbSwgZnJvbSArIG1hdGNoWzBdLmxlbmd0aCwgZGVjb3JhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkVpdGhlciAnZGVjb3JhdGUnIG9yICdkZWNvcmF0aW9uJyBzaG91bGQgYmUgcHJvdmlkZWQgdG8gTWF0Y2hEZWNvcmF0b3JcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ib3VuZGFyeSA9IGJvdW5kYXJ5O1xuICAgICAgICB0aGlzLm1heExlbmd0aCA9IG1heExlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcHV0ZSB0aGUgZnVsbCBzZXQgb2YgZGVjb3JhdGlvbnMgZm9yIG1hdGNoZXMgaW4gdGhlIGdpdmVuXG4gICAgdmlldydzIHZpZXdwb3J0LiBZb3UnbGwgd2FudCB0byBjYWxsIHRoaXMgd2hlbiBpbml0aWFsaXppbmcgeW91clxuICAgIHBsdWdpbi5cbiAgICAqL1xuICAgIGNyZWF0ZURlY28odmlldykge1xuICAgICAgICBsZXQgYnVpbGQgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCksIGFkZCA9IGJ1aWxkLmFkZC5iaW5kKGJ1aWxkKTtcbiAgICAgICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIG1hdGNoUmFuZ2VzKHZpZXcsIHRoaXMubWF4TGVuZ3RoKSlcbiAgICAgICAgICAgIGl0ZXJNYXRjaGVzKHZpZXcuc3RhdGUuZG9jLCB0aGlzLnJlZ2V4cCwgZnJvbSwgdG8sIChmcm9tLCBtKSA9PiB0aGlzLmFkZE1hdGNoKG0sIHZpZXcsIGZyb20sIGFkZCkpO1xuICAgICAgICByZXR1cm4gYnVpbGQuZmluaXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSBhIHNldCBvZiBkZWNvcmF0aW9ucyBmb3IgYSB2aWV3IHVwZGF0ZS4gYGRlY29gIF9tdXN0XyBiZVxuICAgIHRoZSBzZXQgb2YgZGVjb3JhdGlvbnMgcHJvZHVjZWQgYnkgX3RoaXNfIGBNYXRjaERlY29yYXRvcmAgZm9yXG4gICAgdGhlIHZpZXcgc3RhdGUgYmVmb3JlIHRoZSB1cGRhdGUuXG4gICAgKi9cbiAgICB1cGRhdGVEZWNvKHVwZGF0ZSwgZGVjbykge1xuICAgICAgICBsZXQgY2hhbmdlRnJvbSA9IDFlOSwgY2hhbmdlVG8gPSAtMTtcbiAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkKVxuICAgICAgICAgICAgdXBkYXRlLmNoYW5nZXMuaXRlckNoYW5nZXMoKF9mLCBfdCwgZnJvbSwgdG8pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodG8gPj0gdXBkYXRlLnZpZXcudmlld3BvcnQuZnJvbSAmJiBmcm9tIDw9IHVwZGF0ZS52aWV3LnZpZXdwb3J0LnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZUZyb20gPSBNYXRoLm1pbihmcm9tLCBjaGFuZ2VGcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlVG8gPSBNYXRoLm1heCh0bywgY2hhbmdlVG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAodXBkYXRlLnZpZXdwb3J0TW92ZWQgfHwgY2hhbmdlVG8gLSBjaGFuZ2VGcm9tID4gMTAwMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURlY28odXBkYXRlLnZpZXcpO1xuICAgICAgICBpZiAoY2hhbmdlVG8gPiAtMSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVJhbmdlKHVwZGF0ZS52aWV3LCBkZWNvLm1hcCh1cGRhdGUuY2hhbmdlcyksIGNoYW5nZUZyb20sIGNoYW5nZVRvKTtcbiAgICAgICAgcmV0dXJuIGRlY287XG4gICAgfVxuICAgIHVwZGF0ZVJhbmdlKHZpZXcsIGRlY28sIHVwZGF0ZUZyb20sIHVwZGF0ZVRvKSB7XG4gICAgICAgIGZvciAobGV0IHIgb2Ygdmlldy52aXNpYmxlUmFuZ2VzKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWF4KHIuZnJvbSwgdXBkYXRlRnJvbSksIHRvID0gTWF0aC5taW4oci50bywgdXBkYXRlVG8pO1xuICAgICAgICAgICAgaWYgKHRvID4gZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tTGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChmcm9tKSwgdG9MaW5lID0gZnJvbUxpbmUudG8gPCB0byA/IHZpZXcuc3RhdGUuZG9jLmxpbmVBdCh0bykgOiBmcm9tTGluZTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBNYXRoLm1heChyLmZyb20sIGZyb21MaW5lLmZyb20pLCBlbmQgPSBNYXRoLm1pbihyLnRvLCB0b0xpbmUudG8pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyBmcm9tID4gZnJvbUxpbmUuZnJvbTsgZnJvbS0tKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYm91bmRhcnkudGVzdChmcm9tTGluZS50ZXh0W2Zyb20gLSAxIC0gZnJvbUxpbmUuZnJvbV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBmcm9tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdG8gPCB0b0xpbmUudG87IHRvKyspXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ib3VuZGFyeS50ZXN0KHRvTGluZS50ZXh0W3RvIC0gdG9MaW5lLmZyb21dKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHRvO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2VzID0gW10sIG07XG4gICAgICAgICAgICAgICAgbGV0IGFkZCA9IChmcm9tLCB0bywgZGVjbykgPT4gcmFuZ2VzLnB1c2goZGVjby5yYW5nZShmcm9tLCB0bykpO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tTGluZSA9PSB0b0xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWdleHAubGFzdEluZGV4ID0gc3RhcnQgLSBmcm9tTGluZS5mcm9tO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKG0gPSB0aGlzLnJlZ2V4cC5leGVjKGZyb21MaW5lLnRleHQpKSAmJiBtLmluZGV4IDwgZW5kIC0gZnJvbUxpbmUuZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2gobSwgdmlldywgbS5pbmRleCArIGZyb21MaW5lLmZyb20sIGFkZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpdGVyTWF0Y2hlcyh2aWV3LnN0YXRlLmRvYywgdGhpcy5yZWdleHAsIHN0YXJ0LCBlbmQsIChmcm9tLCBtKSA9PiB0aGlzLmFkZE1hdGNoKG0sIHZpZXcsIGZyb20sIGFkZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWNvID0gZGVjby51cGRhdGUoeyBmaWx0ZXJGcm9tOiBzdGFydCwgZmlsdGVyVG86IGVuZCwgZmlsdGVyOiAoZnJvbSwgdG8pID0+IGZyb20gPCBzdGFydCB8fCB0byA+IGVuZCwgYWRkOiByYW5nZXMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlY287XG4gICAgfVxufVxuXG5jb25zdCBVbmljb2RlUmVnZXhwU3VwcG9ydCA9IC94Ly51bmljb2RlICE9IG51bGwgPyBcImd1XCIgOiBcImdcIjtcbmNvbnN0IFNwZWNpYWxzID0gLypAX19QVVJFX18qL25ldyBSZWdFeHAoXCJbXFx1MDAwMC1cXHUwMDA4XFx1MDAwYS1cXHUwMDFmXFx1MDA3Zi1cXHUwMDlmXFx1MDBhZFxcdTA2MWNcXHUyMDBiXFx1MjAwZVxcdTIwMGZcXHUyMDI4XFx1MjAyOVxcdTIwMmRcXHUyMDJlXFx1MjA2NlxcdTIwNjdcXHUyMDY5XFx1ZmVmZlxcdWZmZjktXFx1ZmZmY11cIiwgVW5pY29kZVJlZ2V4cFN1cHBvcnQpO1xuY29uc3QgTmFtZXMgPSB7XG4gICAgMDogXCJudWxsXCIsXG4gICAgNzogXCJiZWxsXCIsXG4gICAgODogXCJiYWNrc3BhY2VcIixcbiAgICAxMDogXCJuZXdsaW5lXCIsXG4gICAgMTE6IFwidmVydGljYWwgdGFiXCIsXG4gICAgMTM6IFwiY2FycmlhZ2UgcmV0dXJuXCIsXG4gICAgMjc6IFwiZXNjYXBlXCIsXG4gICAgODIwMzogXCJ6ZXJvIHdpZHRoIHNwYWNlXCIsXG4gICAgODIwNDogXCJ6ZXJvIHdpZHRoIG5vbi1qb2luZXJcIixcbiAgICA4MjA1OiBcInplcm8gd2lkdGggam9pbmVyXCIsXG4gICAgODIwNjogXCJsZWZ0LXRvLXJpZ2h0IG1hcmtcIixcbiAgICA4MjA3OiBcInJpZ2h0LXRvLWxlZnQgbWFya1wiLFxuICAgIDgyMzI6IFwibGluZSBzZXBhcmF0b3JcIixcbiAgICA4MjM3OiBcImxlZnQtdG8tcmlnaHQgb3ZlcnJpZGVcIixcbiAgICA4MjM4OiBcInJpZ2h0LXRvLWxlZnQgb3ZlcnJpZGVcIixcbiAgICA4Mjk0OiBcImxlZnQtdG8tcmlnaHQgaXNvbGF0ZVwiLFxuICAgIDgyOTU6IFwicmlnaHQtdG8tbGVmdCBpc29sYXRlXCIsXG4gICAgODI5NzogXCJwb3AgZGlyZWN0aW9uYWwgaXNvbGF0ZVwiLFxuICAgIDgyMzM6IFwicGFyYWdyYXBoIHNlcGFyYXRvclwiLFxuICAgIDY1Mjc5OiBcInplcm8gd2lkdGggbm8tYnJlYWsgc3BhY2VcIixcbiAgICA2NTUzMjogXCJvYmplY3QgcmVwbGFjZW1lbnRcIlxufTtcbmxldCBfc3VwcG9ydHNUYWJTaXplID0gbnVsbDtcbmZ1bmN0aW9uIHN1cHBvcnRzVGFiU2l6ZSgpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKF9zdXBwb3J0c1RhYlNpemUgPT0gbnVsbCAmJiB0eXBlb2YgZG9jdW1lbnQgIT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIGxldCBzdHlsZXMgPSBkb2N1bWVudC5ib2R5LnN0eWxlO1xuICAgICAgICBfc3VwcG9ydHNUYWJTaXplID0gKChfYSA9IHN0eWxlcy50YWJTaXplKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBzdHlsZXMuTW96VGFiU2l6ZSkgIT0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIF9zdXBwb3J0c1RhYlNpemUgfHwgZmFsc2U7XG59XG5jb25zdCBzcGVjaWFsQ2hhckNvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICBsZXQgY29uZmlnID0gY29tYmluZUNvbmZpZyhjb25maWdzLCB7XG4gICAgICAgICAgICByZW5kZXI6IG51bGwsXG4gICAgICAgICAgICBzcGVjaWFsQ2hhcnM6IFNwZWNpYWxzLFxuICAgICAgICAgICAgYWRkU3BlY2lhbENoYXJzOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY29uZmlnLnJlcGxhY2VUYWJzID0gIXN1cHBvcnRzVGFiU2l6ZSgpKVxuICAgICAgICAgICAgY29uZmlnLnNwZWNpYWxDaGFycyA9IG5ldyBSZWdFeHAoXCJcXHR8XCIgKyBjb25maWcuc3BlY2lhbENoYXJzLnNvdXJjZSwgVW5pY29kZVJlZ2V4cFN1cHBvcnQpO1xuICAgICAgICBpZiAoY29uZmlnLmFkZFNwZWNpYWxDaGFycylcbiAgICAgICAgICAgIGNvbmZpZy5zcGVjaWFsQ2hhcnMgPSBuZXcgUmVnRXhwKGNvbmZpZy5zcGVjaWFsQ2hhcnMuc291cmNlICsgXCJ8XCIgKyBjb25maWcuYWRkU3BlY2lhbENoYXJzLnNvdXJjZSwgVW5pY29kZVJlZ2V4cFN1cHBvcnQpO1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbn0pO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGluc3RhbGxzIGhpZ2hsaWdodGluZyBvZiBzcGVjaWFsXG5jaGFyYWN0ZXJzLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodFNwZWNpYWxDaGFycyhcbi8qKlxuQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuKi9cbmNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIFtzcGVjaWFsQ2hhckNvbmZpZy5vZihjb25maWcpLCBzcGVjaWFsQ2hhclBsdWdpbigpXTtcbn1cbmxldCBfcGx1Z2luID0gbnVsbDtcbmZ1bmN0aW9uIHNwZWNpYWxDaGFyUGx1Z2luKCkge1xuICAgIHJldHVybiBfcGx1Z2luIHx8IChfcGx1Z2luID0gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdG9yID0gdGhpcy5tYWtlRGVjb3JhdG9yKHZpZXcuc3RhdGUuZmFjZXQoc3BlY2lhbENoYXJDb25maWcpKTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRvci5jcmVhdGVEZWNvKHZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIG1ha2VEZWNvcmF0b3IoY29uZikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXRjaERlY29yYXRvcih7XG4gICAgICAgICAgICAgICAgcmVnZXhwOiBjb25mLnNwZWNpYWxDaGFycyxcbiAgICAgICAgICAgICAgICBkZWNvcmF0aW9uOiAobSwgdmlldywgcG9zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB7IGRvYyB9ID0gdmlldy5zdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvZGUgPSBjb2RlUG9pbnRBdChtWzBdLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gOSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBkb2MubGluZUF0KHBvcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHZpZXcuc3RhdGUudGFiU2l6ZSwgY29sID0gY291bnRDb2x1bW4obGluZS50ZXh0LCBzaXplLCBwb3MgLSBsaW5lLmZyb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb24ucmVwbGFjZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0OiBuZXcgVGFiV2lkZ2V0KChzaXplIC0gKGNvbCAlIHNpemUpKSAqIHRoaXMudmlldy5kZWZhdWx0Q2hhcmFjdGVyV2lkdGggLyB0aGlzLnZpZXcuc2NhbGVYKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjb3JhdGlvbkNhY2hlW2NvZGVdIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5kZWNvcmF0aW9uQ2FjaGVbY29kZV0gPSBEZWNvcmF0aW9uLnJlcGxhY2UoeyB3aWRnZXQ6IG5ldyBTcGVjaWFsQ2hhcldpZGdldChjb25mLCBjb2RlKSB9KSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBib3VuZGFyeTogY29uZi5yZXBsYWNlVGFicyA/IHVuZGVmaW5lZCA6IC9bXl0vXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBsZXQgY29uZiA9IHVwZGF0ZS5zdGF0ZS5mYWNldChzcGVjaWFsQ2hhckNvbmZpZyk7XG4gICAgICAgICAgICBpZiAodXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoc3BlY2lhbENoYXJDb25maWcpICE9IGNvbmYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRvciA9IHRoaXMubWFrZURlY29yYXRvcihjb25mKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5kZWNvcmF0b3IuY3JlYXRlRGVjbyh1cGRhdGUudmlldyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5kZWNvcmF0b3IudXBkYXRlRGVjbyh1cGRhdGUsIHRoaXMuZGVjb3JhdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zXG4gICAgfSkpO1xufVxuY29uc3QgRGVmYXVsdFBsYWNlaG9sZGVyID0gXCJcXHUyMDIyXCI7XG4vLyBBc3NpZ25zIHBsYWNlaG9sZGVyIGNoYXJhY3RlcnMgZnJvbSB0aGUgQ29udHJvbCBQaWN0dXJlcyBibG9jayB0b1xuLy8gQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJzXG5mdW5jdGlvbiBwbGFjZWhvbGRlciQxKGNvZGUpIHtcbiAgICBpZiAoY29kZSA+PSAzMilcbiAgICAgICAgcmV0dXJuIERlZmF1bHRQbGFjZWhvbGRlcjtcbiAgICBpZiAoY29kZSA9PSAxMClcbiAgICAgICAgcmV0dXJuIFwiXFx1MjQyNFwiO1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDkyMTYgKyBjb2RlKTtcbn1cbmNsYXNzIFNwZWNpYWxDaGFyV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29kZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIuY29kZSA9PSB0aGlzLmNvZGU7IH1cbiAgICB0b0RPTSh2aWV3KSB7XG4gICAgICAgIGxldCBwaCA9IHBsYWNlaG9sZGVyJDEodGhpcy5jb2RlKTtcbiAgICAgICAgbGV0IGRlc2MgPSB2aWV3LnN0YXRlLnBocmFzZShcIkNvbnRyb2wgY2hhcmFjdGVyXCIpICsgXCIgXCIgKyAoTmFtZXNbdGhpcy5jb2RlXSB8fCBcIjB4XCIgKyB0aGlzLmNvZGUudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgbGV0IGN1c3RvbSA9IHRoaXMub3B0aW9ucy5yZW5kZXIgJiYgdGhpcy5vcHRpb25zLnJlbmRlcih0aGlzLmNvZGUsIGRlc2MsIHBoKTtcbiAgICAgICAgaWYgKGN1c3RvbSlcbiAgICAgICAgICAgIHJldHVybiBjdXN0b207XG4gICAgICAgIGxldCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBwaDtcbiAgICAgICAgc3Bhbi50aXRsZSA9IGRlc2M7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBkZXNjKTtcbiAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSBcImNtLXNwZWNpYWxDaGFyXCI7XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH1cbiAgICBpZ25vcmVFdmVudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5jbGFzcyBUYWJXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih3aWR0aCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci53aWR0aCA9PSB0aGlzLndpZHRoOyB9XG4gICAgdG9ET00oKSB7XG4gICAgICAgIGxldCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBcIlxcdFwiO1xuICAgICAgICBzcGFuLmNsYXNzTmFtZSA9IFwiY20tdGFiXCI7XG4gICAgICAgIHNwYW4uc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgXCJweFwiO1xuICAgICAgICByZXR1cm4gc3BhbjtcbiAgICB9XG4gICAgaWdub3JlRXZlbnQoKSB7IHJldHVybiBmYWxzZTsgfVxufVxuXG5jb25zdCBwbHVnaW4gPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmhlaWdodCA9IDEwMDA7XG4gICAgICAgIHRoaXMuYXR0cnMgPSB7IHN0eWxlOiBcInBhZGRpbmctYm90dG9tOiAxMDAwcHhcIiB9O1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHVwZGF0ZTtcbiAgICAgICAgbGV0IGhlaWdodCA9IHZpZXcudmlld1N0YXRlLmVkaXRvckhlaWdodCAtXG4gICAgICAgICAgICB2aWV3LmRlZmF1bHRMaW5lSGVpZ2h0IC0gdmlldy5kb2N1bWVudFBhZGRpbmcudG9wIC0gMC41O1xuICAgICAgICBpZiAoaGVpZ2h0ID49IDAgJiYgaGVpZ2h0ICE9IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuYXR0cnMgPSB7IHN0eWxlOiBgcGFkZGluZy1ib3R0b206ICR7aGVpZ2h0fXB4YCB9O1xuICAgICAgICB9XG4gICAgfVxufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgbWFrZXMgc3VyZSB0aGUgY29udGVudCBoYXMgYSBib3R0b21cbm1hcmdpbiBlcXVpdmFsZW50IHRvIHRoZSBoZWlnaHQgb2YgdGhlIGVkaXRvciwgbWludXMgb25lIGxpbmVcbmhlaWdodCwgc28gdGhhdCBldmVyeSBsaW5lIGluIHRoZSBkb2N1bWVudCBjYW4gYmUgc2Nyb2xsZWQgdG8gdGhlXG50b3Agb2YgdGhlIGVkaXRvci5cblxuVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiB0aGUgZWRpdG9yIGlzIHNjcm9sbGFibGUsIGFuZCBzaG91bGRcbm5vdCBiZSBlbmFibGVkIGluIGVkaXRvcnMgdGhhdCB0YWtlIHRoZSBzaXplIG9mIHRoZWlyIGNvbnRlbnQuXG4qL1xuZnVuY3Rpb24gc2Nyb2xsUGFzdEVuZCgpIHtcbiAgICByZXR1cm4gW3BsdWdpbiwgY29udGVudEF0dHJpYnV0ZXMub2YodmlldyA9PiB7IHZhciBfYTsgcmV0dXJuICgoX2EgPSB2aWV3LnBsdWdpbihwbHVnaW4pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXR0cnMpIHx8IG51bGw7IH0pXTtcbn1cblxuLyoqXG5NYXJrIGxpbmVzIHRoYXQgaGF2ZSBhIGN1cnNvciBvbiB0aGVtIHdpdGggdGhlIGBcImNtLWFjdGl2ZUxpbmVcImBcbkRPTSBjbGFzcy5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRBY3RpdmVMaW5lKCkge1xuICAgIHJldHVybiBhY3RpdmVMaW5lSGlnaGxpZ2h0ZXI7XG59XG5jb25zdCBsaW5lRGVjbyA9IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLmxpbmUoeyBjbGFzczogXCJjbS1hY3RpdmVMaW5lXCIgfSk7XG5jb25zdCBhY3RpdmVMaW5lSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZ2V0RGVjbyh2aWV3KTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldClcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmdldERlY28odXBkYXRlLnZpZXcpO1xuICAgIH1cbiAgICBnZXREZWNvKHZpZXcpIHtcbiAgICAgICAgbGV0IGxhc3RMaW5lU3RhcnQgPSAtMSwgZGVjbyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByIG9mIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHIuaGVhZCk7XG4gICAgICAgICAgICBpZiAobGluZS5mcm9tID4gbGFzdExpbmVTdGFydCkge1xuICAgICAgICAgICAgICAgIGRlY28ucHVzaChsaW5lRGVjby5yYW5nZShsaW5lLmZyb20pKTtcbiAgICAgICAgICAgICAgICBsYXN0TGluZVN0YXJ0ID0gbGluZS5mcm9tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChkZWNvKTtcbiAgICB9XG59LCB7XG4gICAgZGVjb3JhdGlvbnM6IHYgPT4gdi5kZWNvcmF0aW9uc1xufSk7XG5cbmNsYXNzIFBsYWNlaG9sZGVyIGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IoY29udGVudCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgIH1cbiAgICB0b0RPTSh2aWV3KSB7XG4gICAgICAgIGxldCB3cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHdyYXAuY2xhc3NOYW1lID0gXCJjbS1wbGFjZWhvbGRlclwiO1xuICAgICAgICB3cmFwLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcbiAgICAgICAgd3JhcC5hcHBlbmRDaGlsZCh0eXBlb2YgdGhpcy5jb250ZW50ID09IFwic3RyaW5nXCIgPyBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmNvbnRlbnQpIDpcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmNvbnRlbnQgPT0gXCJmdW5jdGlvblwiID8gdGhpcy5jb250ZW50KHZpZXcpIDpcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgICAgd3JhcC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIHJldHVybiB3cmFwO1xuICAgIH1cbiAgICBjb29yZHNBdChkb20pIHtcbiAgICAgICAgbGV0IHJlY3RzID0gZG9tLmZpcnN0Q2hpbGQgPyBjbGllbnRSZWN0c0Zvcihkb20uZmlyc3RDaGlsZCkgOiBbXTtcbiAgICAgICAgaWYgKCFyZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9tLnBhcmVudE5vZGUpO1xuICAgICAgICBsZXQgcmVjdCA9IGZsYXR0ZW5SZWN0KHJlY3RzWzBdLCBzdHlsZS5kaXJlY3Rpb24gIT0gXCJydGxcIik7XG4gICAgICAgIGxldCBsaW5lSGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUubGluZUhlaWdodCk7XG4gICAgICAgIGlmIChyZWN0LmJvdHRvbSAtIHJlY3QudG9wID4gbGluZUhlaWdodCAqIDEuNSlcbiAgICAgICAgICAgIHJldHVybiB7IGxlZnQ6IHJlY3QubGVmdCwgcmlnaHQ6IHJlY3QucmlnaHQsIHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC50b3AgKyBsaW5lSGVpZ2h0IH07XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cbiAgICBpZ25vcmVFdmVudCgpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG4vKipcbkV4dGVuc2lvbiB0aGF0IGVuYWJsZXMgYSBwbGFjZWhvbGRlclx1MjAxNGEgcGllY2Ugb2YgZXhhbXBsZSBjb250ZW50XG50byBzaG93IHdoZW4gdGhlIGVkaXRvciBpcyBlbXB0eS5cbiovXG5mdW5jdGlvbiBwbGFjZWhvbGRlcihjb250ZW50KSB7XG4gICAgbGV0IHBsdWdpbiA9IFZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICAgICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSBjb250ZW50XG4gICAgICAgICAgICAgICAgPyBEZWNvcmF0aW9uLnNldChbRGVjb3JhdGlvbi53aWRnZXQoeyB3aWRnZXQ6IG5ldyBQbGFjZWhvbGRlcihjb250ZW50KSwgc2lkZTogMSB9KS5yYW5nZSgwKV0pXG4gICAgICAgICAgICAgICAgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGRlY29yYXRpb25zKCkgeyByZXR1cm4gdGhpcy52aWV3LnN0YXRlLmRvYy5sZW5ndGggPyBEZWNvcmF0aW9uLm5vbmUgOiB0aGlzLnBsYWNlaG9sZGVyOyB9XG4gICAgfSwgeyBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zIH0pO1xuICAgIHJldHVybiB0eXBlb2YgY29udGVudCA9PSBcInN0cmluZ1wiID8gW1xuICAgICAgICBwbHVnaW4sIEVkaXRvclZpZXcuY29udGVudEF0dHJpYnV0ZXMub2YoeyBcImFyaWEtcGxhY2Vob2xkZXJcIjogY29udGVudCB9KVxuICAgIF0gOiBwbHVnaW47XG59XG5cbi8vIERvbid0IGNvbXB1dGUgcHJlY2lzZSBjb2x1bW4gcG9zaXRpb25zIGZvciBsaW5lIG9mZnNldHMgYWJvdmUgdGhpc1xuLy8gKHNpbmNlIGl0IGNvdWxkIGdldCBleHBlbnNpdmUpLiBBc3N1bWUgb2Zmc2V0PT1jb2x1bW4gZm9yIHRoZW0uXG5jb25zdCBNYXhPZmYgPSAyMDAwO1xuZnVuY3Rpb24gcmVjdGFuZ2xlRm9yKHN0YXRlLCBhLCBiKSB7XG4gICAgbGV0IHN0YXJ0TGluZSA9IE1hdGgubWluKGEubGluZSwgYi5saW5lKSwgZW5kTGluZSA9IE1hdGgubWF4KGEubGluZSwgYi5saW5lKTtcbiAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgaWYgKGEub2ZmID4gTWF4T2ZmIHx8IGIub2ZmID4gTWF4T2ZmIHx8IGEuY29sIDwgMCB8fCBiLmNvbCA8IDApIHtcbiAgICAgICAgbGV0IHN0YXJ0T2ZmID0gTWF0aC5taW4oYS5vZmYsIGIub2ZmKSwgZW5kT2ZmID0gTWF0aC5tYXgoYS5vZmYsIGIub2ZmKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0TGluZTsgaSA8PSBlbmRMaW5lOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmUoaSk7XG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPD0gZW5kT2ZmKVxuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKEVkaXRvclNlbGVjdGlvbi5yYW5nZShsaW5lLmZyb20gKyBzdGFydE9mZiwgbGluZS50byArIGVuZE9mZikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgc3RhcnRDb2wgPSBNYXRoLm1pbihhLmNvbCwgYi5jb2wpLCBlbmRDb2wgPSBNYXRoLm1heChhLmNvbCwgYi5jb2wpO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRMaW5lOyBpIDw9IGVuZExpbmU7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZShpKTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IGZpbmRDb2x1bW4obGluZS50ZXh0LCBzdGFydENvbCwgc3RhdGUudGFiU2l6ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihsaW5lLnRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kID0gZmluZENvbHVtbihsaW5lLnRleHQsIGVuZENvbCwgc3RhdGUudGFiU2l6ZSk7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGxpbmUuZnJvbSArIHN0YXJ0LCBsaW5lLmZyb20gKyBlbmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmFuZ2VzO1xufVxuZnVuY3Rpb24gYWJzb2x1dGVDb2x1bW4odmlldywgeCkge1xuICAgIGxldCByZWYgPSB2aWV3LmNvb3Jkc0F0UG9zKHZpZXcudmlld3BvcnQuZnJvbSk7XG4gICAgcmV0dXJuIHJlZiA/IE1hdGgucm91bmQoTWF0aC5hYnMoKHJlZi5sZWZ0IC0geCkgLyB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCkpIDogLTE7XG59XG5mdW5jdGlvbiBnZXRQb3ModmlldywgZXZlbnQpIHtcbiAgICBsZXQgb2Zmc2V0ID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSwgZmFsc2UpO1xuICAgIGxldCBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KG9mZnNldCksIG9mZiA9IG9mZnNldCAtIGxpbmUuZnJvbTtcbiAgICBsZXQgY29sID0gb2ZmID4gTWF4T2ZmID8gLTFcbiAgICAgICAgOiBvZmYgPT0gbGluZS5sZW5ndGggPyBhYnNvbHV0ZUNvbHVtbih2aWV3LCBldmVudC5jbGllbnRYKVxuICAgICAgICAgICAgOiBjb3VudENvbHVtbihsaW5lLnRleHQsIHZpZXcuc3RhdGUudGFiU2l6ZSwgb2Zmc2V0IC0gbGluZS5mcm9tKTtcbiAgICByZXR1cm4geyBsaW5lOiBsaW5lLm51bWJlciwgY29sLCBvZmYgfTtcbn1cbmZ1bmN0aW9uIHJlY3RhbmdsZVNlbGVjdGlvblN0eWxlKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHN0YXJ0ID0gZ2V0UG9zKHZpZXcsIGV2ZW50KSwgc3RhcnRTZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIXN0YXJ0KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3U3RhcnQgPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModXBkYXRlLnN0YXJ0U3RhdGUuZG9jLmxpbmUoc3RhcnQubGluZSkuZnJvbSk7XG4gICAgICAgICAgICAgICAgbGV0IG5ld0xpbmUgPSB1cGRhdGUuc3RhdGUuZG9jLmxpbmVBdChuZXdTdGFydCk7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSB7IGxpbmU6IG5ld0xpbmUubnVtYmVyLCBjb2w6IHN0YXJ0LmNvbCwgb2ZmOiBNYXRoLm1pbihzdGFydC5vZmYsIG5ld0xpbmUubGVuZ3RoKSB9O1xuICAgICAgICAgICAgICAgIHN0YXJ0U2VsID0gc3RhcnRTZWwubWFwKHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0KGV2ZW50LCBfZXh0ZW5kLCBtdWx0aXBsZSkge1xuICAgICAgICAgICAgbGV0IGN1ciA9IGdldFBvcyh2aWV3LCBldmVudCk7XG4gICAgICAgICAgICBpZiAoIWN1cilcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRTZWw7XG4gICAgICAgICAgICBsZXQgcmFuZ2VzID0gcmVjdGFuZ2xlRm9yKHZpZXcuc3RhdGUsIHN0YXJ0LCBjdXIpO1xuICAgICAgICAgICAgaWYgKCFyYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbDtcbiAgICAgICAgICAgIGlmIChtdWx0aXBsZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShyYW5nZXMuY29uY2F0KHN0YXJ0U2VsLnJhbmdlcykpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyByZWN0YW5ndWxhciBzZWxlY3Rpb25zLiBCeVxuZGVmYXVsdCwgaXQgd2lsbCByZWFjdCB0byBsZWZ0IG1vdXNlIGRyYWcgd2l0aCB0aGUgQWx0IGtleSBoZWxkXG5kb3duLiBXaGVuIHN1Y2ggYSBzZWxlY3Rpb24gb2NjdXJzLCB0aGUgdGV4dCB3aXRoaW4gdGhlIHJlY3RhbmdsZVxudGhhdCB3YXMgZHJhZ2dlZCBvdmVyIHdpbGwgYmUgc2VsZWN0ZWQsIGFzIG9uZSBzZWxlY3Rpb25cbltyYW5nZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25SYW5nZSkgcGVyIGxpbmUuXG4qL1xuZnVuY3Rpb24gcmVjdGFuZ3VsYXJTZWxlY3Rpb24ob3B0aW9ucykge1xuICAgIGxldCBmaWx0ZXIgPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmV2ZW50RmlsdGVyKSB8fCAoZSA9PiBlLmFsdEtleSAmJiBlLmJ1dHRvbiA9PSAwKTtcbiAgICByZXR1cm4gRWRpdG9yVmlldy5tb3VzZVNlbGVjdGlvblN0eWxlLm9mKCh2aWV3LCBldmVudCkgPT4gZmlsdGVyKGV2ZW50KSA/IHJlY3RhbmdsZVNlbGVjdGlvblN0eWxlKHZpZXcsIGV2ZW50KSA6IG51bGwpO1xufVxuY29uc3Qga2V5cyA9IHtcbiAgICBBbHQ6IFsxOCwgZSA9PiAhIWUuYWx0S2V5XSxcbiAgICBDb250cm9sOiBbMTcsIGUgPT4gISFlLmN0cmxLZXldLFxuICAgIFNoaWZ0OiBbMTYsIGUgPT4gISFlLnNoaWZ0S2V5XSxcbiAgICBNZXRhOiBbOTEsIGUgPT4gISFlLm1ldGFLZXldXG59O1xuY29uc3Qgc2hvd0Nyb3NzaGFpciA9IHsgc3R5bGU6IFwiY3Vyc29yOiBjcm9zc2hhaXJcIiB9O1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IHR1cm5zIHRoZSBwb2ludGVyIGN1cnNvciBpbnRvIGFcbmNyb3NzaGFpciB3aGVuIGEgZ2l2ZW4gbW9kaWZpZXIga2V5LCBkZWZhdWx0aW5nIHRvIEFsdCwgaXMgaGVsZFxuZG93bi4gQ2FuIHNlcnZlIGFzIGEgdmlzdWFsIGhpbnQgdGhhdCByZWN0YW5ndWxhciBzZWxlY3Rpb24gaXNcbmdvaW5nIHRvIGhhcHBlbiB3aGVuIHBhaXJlZCB3aXRoXG5bYHJlY3Rhbmd1bGFyU2VsZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LnJlY3Rhbmd1bGFyU2VsZWN0aW9uKS5cbiovXG5mdW5jdGlvbiBjcm9zc2hhaXJDdXJzb3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IFtjb2RlLCBnZXR0ZXJdID0ga2V5c1tvcHRpb25zLmtleSB8fCBcIkFsdFwiXTtcbiAgICBsZXQgcGx1Z2luID0gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICAgICAgdGhpcy5pc0Rvd24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBzZXQoaXNEb3duKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0Rvd24gIT0gaXNEb3duKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Rvd24gPSBpc0Rvd247XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGV2ZW50T2JzZXJ2ZXJzOiB7XG4gICAgICAgICAgICBrZXlkb3duKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChlLmtleUNvZGUgPT0gY29kZSB8fCBnZXR0ZXIoZSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGtleXVwKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09IGNvZGUgfHwgIWdldHRlcihlKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdXNlbW92ZShlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoZ2V0dGVyKGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIHBsdWdpbixcbiAgICAgICAgRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5vZih2aWV3ID0+IHsgdmFyIF9hOyByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKHBsdWdpbikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pc0Rvd24pID8gc2hvd0Nyb3NzaGFpciA6IG51bGw7IH0pXG4gICAgXTtcbn1cblxuY29uc3QgT3V0c2lkZSA9IFwiLTEwMDAwcHhcIjtcbmNsYXNzIFRvb2x0aXBWaWV3TWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IodmlldywgZmFjZXQsIGNyZWF0ZVRvb2x0aXBWaWV3LCByZW1vdmVUb29sdGlwVmlldykge1xuICAgICAgICB0aGlzLmZhY2V0ID0gZmFjZXQ7XG4gICAgICAgIHRoaXMuY3JlYXRlVG9vbHRpcFZpZXcgPSBjcmVhdGVUb29sdGlwVmlldztcbiAgICAgICAgdGhpcy5yZW1vdmVUb29sdGlwVmlldyA9IHJlbW92ZVRvb2x0aXBWaWV3O1xuICAgICAgICB0aGlzLmlucHV0ID0gdmlldy5zdGF0ZS5mYWNldChmYWNldCk7XG4gICAgICAgIHRoaXMudG9vbHRpcHMgPSB0aGlzLmlucHV0LmZpbHRlcih0ID0+IHQpO1xuICAgICAgICBsZXQgcHJldiA9IG51bGw7XG4gICAgICAgIHRoaXMudG9vbHRpcFZpZXdzID0gdGhpcy50b29sdGlwcy5tYXAodCA9PiBwcmV2ID0gY3JlYXRlVG9vbHRpcFZpZXcodCwgcHJldikpO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlLCBhYm92ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBpbnB1dCA9IHVwZGF0ZS5zdGF0ZS5mYWNldCh0aGlzLmZhY2V0KTtcbiAgICAgICAgbGV0IHRvb2x0aXBzID0gaW5wdXQuZmlsdGVyKHggPT4geCk7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gdGhpcy5pbnB1dCkge1xuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgICAgICBpZiAodC51cGRhdGUpXG4gICAgICAgICAgICAgICAgICAgIHQudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRvb2x0aXBWaWV3cyA9IFtdLCBuZXdBYm92ZSA9IGFib3ZlID8gW10gOiBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvb2x0aXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdGlwID0gdG9vbHRpcHNbaV0sIGtub3duID0gLTE7XG4gICAgICAgICAgICBpZiAoIXRpcClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50b29sdGlwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBvdGhlciA9IHRoaXMudG9vbHRpcHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKG90aGVyICYmIG90aGVyLmNyZWF0ZSA9PSB0aXAuY3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICBrbm93biA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa25vd24gPCAwKSB7XG4gICAgICAgICAgICAgICAgdG9vbHRpcFZpZXdzW2ldID0gdGhpcy5jcmVhdGVUb29sdGlwVmlldyh0aXAsIGkgPyB0b29sdGlwVmlld3NbaSAtIDFdIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Fib3ZlKVxuICAgICAgICAgICAgICAgICAgICBuZXdBYm92ZVtpXSA9ICEhdGlwLmFib3ZlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRvb2x0aXBWaWV3ID0gdG9vbHRpcFZpZXdzW2ldID0gdGhpcy50b29sdGlwVmlld3Nba25vd25dO1xuICAgICAgICAgICAgICAgIGlmIChuZXdBYm92ZSlcbiAgICAgICAgICAgICAgICAgICAgbmV3QWJvdmVbaV0gPSBhYm92ZVtrbm93bl07XG4gICAgICAgICAgICAgICAgaWYgKHRvb2x0aXBWaWV3LnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFZpZXcudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgIGlmICh0b29sdGlwVmlld3MuaW5kZXhPZih0KSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVRvb2x0aXBWaWV3KHQpO1xuICAgICAgICAgICAgICAgIChfYSA9IHQuZGVzdHJveSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChhYm92ZSkge1xuICAgICAgICAgICAgbmV3QWJvdmUuZm9yRWFjaCgodmFsLCBpKSA9PiBhYm92ZVtpXSA9IHZhbCk7XG4gICAgICAgICAgICBhYm92ZS5sZW5ndGggPSBuZXdBYm92ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLnRvb2x0aXBzID0gdG9vbHRpcHM7XG4gICAgICAgIHRoaXMudG9vbHRpcFZpZXdzID0gdG9vbHRpcFZpZXdzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4vKipcbkNyZWF0ZXMgYW4gZXh0ZW5zaW9uIHRoYXQgY29uZmlndXJlcyB0b29sdGlwIGJlaGF2aW9yLlxuKi9cbmZ1bmN0aW9uIHRvb2x0aXBzKGNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIHRvb2x0aXBDb25maWcub2YoY29uZmlnKTtcbn1cbmZ1bmN0aW9uIHdpbmRvd1NwYWNlKHZpZXcpIHtcbiAgICBsZXQgZG9jRWx0ID0gdmlldy5kb20ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IGRvY0VsdC5jbGllbnRIZWlnaHQsIHJpZ2h0OiBkb2NFbHQuY2xpZW50V2lkdGggfTtcbn1cbmNvbnN0IHRvb2x0aXBDb25maWcgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4ge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgcmV0dXJuICh7XG4gICAgICAgICAgICBwb3NpdGlvbjogYnJvd3Nlci5pb3MgPyBcImFic29sdXRlXCIgOiAoKF9hID0gdmFsdWVzLmZpbmQoY29uZiA9PiBjb25mLnBvc2l0aW9uKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBvc2l0aW9uKSB8fCBcImZpeGVkXCIsXG4gICAgICAgICAgICBwYXJlbnQ6ICgoX2IgPSB2YWx1ZXMuZmluZChjb25mID0+IGNvbmYucGFyZW50KSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnBhcmVudCkgfHwgbnVsbCxcbiAgICAgICAgICAgIHRvb2x0aXBTcGFjZTogKChfYyA9IHZhbHVlcy5maW5kKGNvbmYgPT4gY29uZi50b29sdGlwU3BhY2UpKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudG9vbHRpcFNwYWNlKSB8fCB3aW5kb3dTcGFjZSxcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5jb25zdCBrbm93bkhlaWdodCA9IC8qQF9fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuY29uc3QgdG9vbHRpcFBsdWdpbiA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmFib3ZlID0gW107XG4gICAgICAgIHRoaXMuaW5WaWV3ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5tYWRlQWJzb2x1dGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sYXN0VHJhbnNhY3Rpb24gPSAwO1xuICAgICAgICB0aGlzLm1lYXN1cmVUaW1lb3V0ID0gLTE7XG4gICAgICAgIGxldCBjb25maWcgPSB2aWV3LnN0YXRlLmZhY2V0KHRvb2x0aXBDb25maWcpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gY29uZmlnLnBvc2l0aW9uO1xuICAgICAgICB0aGlzLnBhcmVudCA9IGNvbmZpZy5wYXJlbnQ7XG4gICAgICAgIHRoaXMuY2xhc3NlcyA9IHZpZXcudGhlbWVDbGFzc2VzO1xuICAgICAgICB0aGlzLmNyZWF0ZUNvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLm1lYXN1cmVSZXEgPSB7IHJlYWQ6IHRoaXMucmVhZE1lYXN1cmUuYmluZCh0aGlzKSwgd3JpdGU6IHRoaXMud3JpdGVNZWFzdXJlLmJpbmQodGhpcyksIGtleTogdGhpcyB9O1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gdHlwZW9mIFJlc2l6ZU9ic2VydmVyID09IFwiZnVuY3Rpb25cIiA/IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLm1lYXN1cmVTb29uKCkpIDogbnVsbDtcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbmV3IFRvb2x0aXBWaWV3TWFuYWdlcih2aWV3LCBzaG93VG9vbHRpcCwgKHQsIHApID0+IHRoaXMuY3JlYXRlVG9vbHRpcCh0LCBwKSwgdCA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcilcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZSh0LmRvbSk7XG4gICAgICAgICAgICB0LmRvbS5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWJvdmUgPSB0aGlzLm1hbmFnZXIudG9vbHRpcHMubWFwKHQgPT4gISF0LmFib3ZlKTtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlciA9IHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciA9PSBcImZ1bmN0aW9uXCIgPyBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IHRoaXMubGFzdFRyYW5zYWN0aW9uIC0gNTAgJiZcbiAgICAgICAgICAgICAgICBlbnRyaWVzLmxlbmd0aCA+IDAgJiYgZW50cmllc1tlbnRyaWVzLmxlbmd0aCAtIDFdLmludGVyc2VjdGlvblJhdGlvIDwgMSlcbiAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVTb29uKCk7XG4gICAgICAgIH0sIHsgdGhyZXNob2xkOiBbMV0gfSkgOiBudWxsO1xuICAgICAgICB0aGlzLm9ic2VydmVJbnRlcnNlY3Rpb24oKTtcbiAgICAgICAgdmlldy53aW4uYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm1lYXN1cmVTb29uID0gdGhpcy5tZWFzdXJlU29vbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5tYXliZU1lYXN1cmUoKTtcbiAgICB9XG4gICAgY3JlYXRlQ29udGFpbmVyKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gdGhpcy52aWV3LnRoZW1lQ2xhc3NlcztcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy52aWV3LmRvbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvYnNlcnZlSW50ZXJzZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBmb3IgKGxldCB0b29sdGlwIG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5vYnNlcnZlKHRvb2x0aXAuZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtZWFzdXJlU29vbigpIHtcbiAgICAgICAgaWYgKHRoaXMubWVhc3VyZVRpbWVvdXQgPCAwKVxuICAgICAgICAgICAgdGhpcy5tZWFzdXJlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgICAgICAgICB0aGlzLm1heWJlTWVhc3VyZSgpO1xuICAgICAgICAgICAgfSwgNTApO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh1cGRhdGUudHJhbnNhY3Rpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMubGFzdFRyYW5zYWN0aW9uID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSB0aGlzLm1hbmFnZXIudXBkYXRlKHVwZGF0ZSwgdGhpcy5hYm92ZSk7XG4gICAgICAgIGlmICh1cGRhdGVkKVxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlSW50ZXJzZWN0aW9uKCk7XG4gICAgICAgIGxldCBzaG91bGRNZWFzdXJlID0gdXBkYXRlZCB8fCB1cGRhdGUuZ2VvbWV0cnlDaGFuZ2VkO1xuICAgICAgICBsZXQgbmV3Q29uZmlnID0gdXBkYXRlLnN0YXRlLmZhY2V0KHRvb2x0aXBDb25maWcpO1xuICAgICAgICBpZiAobmV3Q29uZmlnLnBvc2l0aW9uICE9IHRoaXMucG9zaXRpb24gJiYgIXRoaXMubWFkZUFic29sdXRlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gbmV3Q29uZmlnLnBvc2l0aW9uO1xuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIHQuZG9tLnN0eWxlLnBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbjtcbiAgICAgICAgICAgIHNob3VsZE1lYXN1cmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdDb25maWcucGFyZW50ICE9IHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLnBhcmVudCA9IG5ld0NvbmZpZy5wYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbnRhaW5lcigpO1xuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHQuZG9tKTtcbiAgICAgICAgICAgIHNob3VsZE1lYXN1cmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMudmlldy50aGVtZUNsYXNzZXMgIT0gdGhpcy5jbGFzc2VzKSB7XG4gICAgICAgICAgICB0aGlzLmNsYXNzZXMgPSB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSB0aGlzLnZpZXcudGhlbWVDbGFzc2VzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRNZWFzdXJlKVxuICAgICAgICAgICAgdGhpcy5tYXliZU1lYXN1cmUoKTtcbiAgICB9XG4gICAgY3JlYXRlVG9vbHRpcCh0b29sdGlwLCBwcmV2KSB7XG4gICAgICAgIGxldCB0b29sdGlwVmlldyA9IHRvb2x0aXAuY3JlYXRlKHRoaXMudmlldyk7XG4gICAgICAgIGxldCBiZWZvcmUgPSBwcmV2ID8gcHJldi5kb20gOiBudWxsO1xuICAgICAgICB0b29sdGlwVmlldy5kb20uY2xhc3NMaXN0LmFkZChcImNtLXRvb2x0aXBcIik7XG4gICAgICAgIGlmICh0b29sdGlwLmFycm93ICYmICF0b29sdGlwVmlldy5kb20ucXVlcnlTZWxlY3RvcihcIi5jbS10b29sdGlwID4gLmNtLXRvb2x0aXAtYXJyb3dcIikpIHtcbiAgICAgICAgICAgIGxldCBhcnJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBhcnJvdy5jbGFzc05hbWUgPSBcImNtLXRvb2x0aXAtYXJyb3dcIjtcbiAgICAgICAgICAgIHRvb2x0aXBWaWV3LmRvbS5hcHBlbmRDaGlsZChhcnJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgdG9vbHRpcFZpZXcuZG9tLnN0eWxlLnBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbjtcbiAgICAgICAgdG9vbHRpcFZpZXcuZG9tLnN0eWxlLnRvcCA9IE91dHNpZGU7XG4gICAgICAgIHRvb2x0aXBWaWV3LmRvbS5zdHlsZS5sZWZ0ID0gXCIwcHhcIjtcbiAgICAgICAgdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvb2x0aXBWaWV3LmRvbSwgYmVmb3JlKTtcbiAgICAgICAgaWYgKHRvb2x0aXBWaWV3Lm1vdW50KVxuICAgICAgICAgICAgdG9vbHRpcFZpZXcubW91bnQodGhpcy52aWV3KTtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodG9vbHRpcFZpZXcuZG9tKTtcbiAgICAgICAgcmV0dXJuIHRvb2x0aXBWaWV3O1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdGhpcy52aWV3Lndpbi5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMubWVhc3VyZVNvb24pO1xuICAgICAgICBmb3IgKGxldCB0b29sdGlwVmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICB0b29sdGlwVmlldy5kb20ucmVtb3ZlKCk7XG4gICAgICAgICAgICAoX2EgPSB0b29sdGlwVmlldy5kZXN0cm95KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0b29sdGlwVmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFyZW50KVxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgIChfYiA9IHRoaXMucmVzaXplT2JzZXJ2ZXIpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5kaXNjb25uZWN0KCk7XG4gICAgICAgIChfYyA9IHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5kaXNjb25uZWN0KCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1lYXN1cmVUaW1lb3V0KTtcbiAgICB9XG4gICAgcmVhZE1lYXN1cmUoKSB7XG4gICAgICAgIGxldCBzY2FsZVggPSAxLCBzY2FsZVkgPSAxLCBtYWtlQWJzb2x1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT0gXCJmaXhlZFwiICYmIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgeyBkb20gfSA9IHRoaXMubWFuYWdlci50b29sdGlwVmlld3NbMF07XG4gICAgICAgICAgICBpZiAoYnJvd3Nlci5nZWNrbykge1xuICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggc2V0cyB0aGUgZWxlbWVudCdzIGBvZmZzZXRQYXJlbnRgIHRvIHRoZVxuICAgICAgICAgICAgICAgIC8vIHRyYW5zZm9ybWVkIGVsZW1lbnQgd2hlbiBhIHRyYW5zZm9ybSBpbnRlcmZlcmVzIHdpdGggZml4ZWRcbiAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbmluZy5cbiAgICAgICAgICAgICAgICBtYWtlQWJzb2x1dGUgPSBkb20ub2Zmc2V0UGFyZW50ICE9IHRoaXMuY29udGFpbmVyLm93bmVyRG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRvbS5zdHlsZS50b3AgPT0gT3V0c2lkZSAmJiBkb20uc3R5bGUubGVmdCA9PSBcIjBweFwiKSB7XG4gICAgICAgICAgICAgICAgLy8gT24gb3RoZXIgYnJvd3NlcnMsIHdlIGhhdmUgdG8gYXdrd2FyZGx5IHRyeSBhbmQgdXNlIG90aGVyXG4gICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gdG8gZGV0ZWN0IGEgdHJhbnNmb3JtLlxuICAgICAgICAgICAgICAgIGxldCByZWN0ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIG1ha2VBYnNvbHV0ZSA9IE1hdGguYWJzKHJlY3QudG9wICsgMTAwMDApID4gMSB8fCBNYXRoLmFicyhyZWN0LmxlZnQpID4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWFrZUFic29sdXRlIHx8IHRoaXMucG9zaXRpb24gPT0gXCJhYnNvbHV0ZVwiKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHRoaXMucGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZWN0LndpZHRoICYmIHJlY3QuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNjYWxlWCA9IHJlY3Qud2lkdGggLyB0aGlzLnBhcmVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgc2NhbGVZID0gcmVjdC5oZWlnaHQgLyB0aGlzLnBhcmVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgKHsgc2NhbGVYLCBzY2FsZVkgfSA9IHRoaXMudmlldy52aWV3U3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB2aXNpYmxlID0gdGhpcy52aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgbWFyZ2lucyA9IGdldFNjcm9sbE1hcmdpbnModGhpcy52aWV3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZpc2libGU6IHtcbiAgICAgICAgICAgICAgICBsZWZ0OiB2aXNpYmxlLmxlZnQgKyBtYXJnaW5zLmxlZnQsIHRvcDogdmlzaWJsZS50b3AgKyBtYXJnaW5zLnRvcCxcbiAgICAgICAgICAgICAgICByaWdodDogdmlzaWJsZS5yaWdodCAtIG1hcmdpbnMucmlnaHQsIGJvdHRvbTogdmlzaWJsZS5ib3R0b20gLSBtYXJnaW5zLmJvdHRvbVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQgPyB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IHRoaXMudmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBwb3M6IHRoaXMubWFuYWdlci50b29sdGlwcy5tYXAoKHQsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdHYgPSB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzW2ldO1xuICAgICAgICAgICAgICAgIHJldHVybiB0di5nZXRDb29yZHMgPyB0di5nZXRDb29yZHModC5wb3MpIDogdGhpcy52aWV3LmNvb3Jkc0F0UG9zKHQucG9zKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2l6ZTogdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cy5tYXAoKHsgZG9tIH0pID0+IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksXG4gICAgICAgICAgICBzcGFjZTogdGhpcy52aWV3LnN0YXRlLmZhY2V0KHRvb2x0aXBDb25maWcpLnRvb2x0aXBTcGFjZSh0aGlzLnZpZXcpLFxuICAgICAgICAgICAgc2NhbGVYLCBzY2FsZVksIG1ha2VBYnNvbHV0ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICB3cml0ZU1lYXN1cmUobWVhc3VyZWQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAobWVhc3VyZWQubWFrZUFic29sdXRlKSB7XG4gICAgICAgICAgICB0aGlzLm1hZGVBYnNvbHV0ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgICAgIHQuZG9tLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHZpc2libGUsIHNwYWNlLCBzY2FsZVgsIHNjYWxlWSB9ID0gbWVhc3VyZWQ7XG4gICAgICAgIGxldCBvdGhlcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hbmFnZXIudG9vbHRpcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0b29sdGlwID0gdGhpcy5tYW5hZ2VyLnRvb2x0aXBzW2ldLCB0VmlldyA9IHRoaXMubWFuYWdlci50b29sdGlwVmlld3NbaV0sIHsgZG9tIH0gPSB0VmlldztcbiAgICAgICAgICAgIGxldCBwb3MgPSBtZWFzdXJlZC5wb3NbaV0sIHNpemUgPSBtZWFzdXJlZC5zaXplW2ldO1xuICAgICAgICAgICAgLy8gSGlkZSB0b29sdGlwcyB0aGF0IGFyZSBvdXRzaWRlIG9mIHRoZSBlZGl0b3IuXG4gICAgICAgICAgICBpZiAoIXBvcyB8fCB0b29sdGlwLmNsaXAgIT09IGZhbHNlICYmIChwb3MuYm90dG9tIDw9IE1hdGgubWF4KHZpc2libGUudG9wLCBzcGFjZS50b3ApIHx8XG4gICAgICAgICAgICAgICAgcG9zLnRvcCA+PSBNYXRoLm1pbih2aXNpYmxlLmJvdHRvbSwgc3BhY2UuYm90dG9tKSB8fFxuICAgICAgICAgICAgICAgIHBvcy5yaWdodCA8IE1hdGgubWF4KHZpc2libGUubGVmdCwgc3BhY2UubGVmdCkgLSAuMSB8fFxuICAgICAgICAgICAgICAgIHBvcy5sZWZ0ID4gTWF0aC5taW4odmlzaWJsZS5yaWdodCwgc3BhY2UucmlnaHQpICsgLjEpKSB7XG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLnRvcCA9IE91dHNpZGU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYXJyb3cgPSB0b29sdGlwLmFycm93ID8gdFZpZXcuZG9tLnF1ZXJ5U2VsZWN0b3IoXCIuY20tdG9vbHRpcC1hcnJvd1wiKSA6IG51bGw7XG4gICAgICAgICAgICBsZXQgYXJyb3dIZWlnaHQgPSBhcnJvdyA/IDcgLyogQXJyb3cuU2l6ZSAqLyA6IDA7XG4gICAgICAgICAgICBsZXQgd2lkdGggPSBzaXplLnJpZ2h0IC0gc2l6ZS5sZWZ0LCBoZWlnaHQgPSAoX2EgPSBrbm93bkhlaWdodC5nZXQodFZpZXcpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBzaXplLmJvdHRvbSAtIHNpemUudG9wO1xuICAgICAgICAgICAgbGV0IG9mZnNldCA9IHRWaWV3Lm9mZnNldCB8fCBub09mZnNldCwgbHRyID0gdGhpcy52aWV3LnRleHREaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUjtcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gc2l6ZS53aWR0aCA+IHNwYWNlLnJpZ2h0IC0gc3BhY2UubGVmdFxuICAgICAgICAgICAgICAgID8gKGx0ciA/IHNwYWNlLmxlZnQgOiBzcGFjZS5yaWdodCAtIHNpemUud2lkdGgpXG4gICAgICAgICAgICAgICAgOiBsdHIgPyBNYXRoLm1heChzcGFjZS5sZWZ0LCBNYXRoLm1pbihwb3MubGVmdCAtIChhcnJvdyA/IDE0IC8qIEFycm93Lk9mZnNldCAqLyA6IDApICsgb2Zmc2V0LngsIHNwYWNlLnJpZ2h0IC0gd2lkdGgpKVxuICAgICAgICAgICAgICAgICAgICA6IE1hdGgubWluKE1hdGgubWF4KHNwYWNlLmxlZnQsIHBvcy5sZWZ0IC0gd2lkdGggKyAoYXJyb3cgPyAxNCAvKiBBcnJvdy5PZmZzZXQgKi8gOiAwKSAtIG9mZnNldC54KSwgc3BhY2UucmlnaHQgLSB3aWR0aCk7XG4gICAgICAgICAgICBsZXQgYWJvdmUgPSB0aGlzLmFib3ZlW2ldO1xuICAgICAgICAgICAgaWYgKCF0b29sdGlwLnN0cmljdFNpZGUgJiYgKGFib3ZlXG4gICAgICAgICAgICAgICAgPyBwb3MudG9wIC0gaGVpZ2h0IC0gYXJyb3dIZWlnaHQgLSBvZmZzZXQueSA8IHNwYWNlLnRvcFxuICAgICAgICAgICAgICAgIDogcG9zLmJvdHRvbSArIGhlaWdodCArIGFycm93SGVpZ2h0ICsgb2Zmc2V0LnkgPiBzcGFjZS5ib3R0b20pICYmXG4gICAgICAgICAgICAgICAgYWJvdmUgPT0gKHNwYWNlLmJvdHRvbSAtIHBvcy5ib3R0b20gPiBwb3MudG9wIC0gc3BhY2UudG9wKSlcbiAgICAgICAgICAgICAgICBhYm92ZSA9IHRoaXMuYWJvdmVbaV0gPSAhYWJvdmU7XG4gICAgICAgICAgICBsZXQgc3BhY2VWZXJ0ID0gKGFib3ZlID8gcG9zLnRvcCAtIHNwYWNlLnRvcCA6IHNwYWNlLmJvdHRvbSAtIHBvcy5ib3R0b20pIC0gYXJyb3dIZWlnaHQ7XG4gICAgICAgICAgICBpZiAoc3BhY2VWZXJ0IDwgaGVpZ2h0ICYmIHRWaWV3LnJlc2l6ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3BhY2VWZXJ0IDwgdGhpcy52aWV3LmRlZmF1bHRMaW5lSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbS5zdHlsZS50b3AgPSBPdXRzaWRlO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga25vd25IZWlnaHQuc2V0KHRWaWV3LCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5oZWlnaHQgPSAoaGVpZ2h0ID0gc3BhY2VWZXJ0KSAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRvbS5zdHlsZS5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUuaGVpZ2h0ID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0b3AgPSBhYm92ZSA/IHBvcy50b3AgLSBoZWlnaHQgLSBhcnJvd0hlaWdodCAtIG9mZnNldC55IDogcG9zLmJvdHRvbSArIGFycm93SGVpZ2h0ICsgb2Zmc2V0Lnk7XG4gICAgICAgICAgICBsZXQgcmlnaHQgPSBsZWZ0ICsgd2lkdGg7XG4gICAgICAgICAgICBpZiAodFZpZXcub3ZlcmxhcCAhPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByIG9mIG90aGVycylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIubGVmdCA8IHJpZ2h0ICYmIHIucmlnaHQgPiBsZWZ0ICYmIHIudG9wIDwgdG9wICsgaGVpZ2h0ICYmIHIuYm90dG9tID4gdG9wKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gYWJvdmUgPyByLnRvcCAtIGhlaWdodCAtIDIgLSBhcnJvd0hlaWdodCA6IHIuYm90dG9tICsgYXJyb3dIZWlnaHQgKyAyO1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPT0gXCJhYnNvbHV0ZVwiKSB7XG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLnRvcCA9ICh0b3AgLSBtZWFzdXJlZC5wYXJlbnQudG9wKSAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICBzZXRMZWZ0U3R5bGUoZG9tLCAobGVmdCAtIG1lYXN1cmVkLnBhcmVudC5sZWZ0KSAvIHNjYWxlWCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUudG9wID0gdG9wIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIHNldExlZnRTdHlsZShkb20sIGxlZnQgLyBzY2FsZVgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFycm93KSB7XG4gICAgICAgICAgICAgICAgbGV0IGFycm93TGVmdCA9IHBvcy5sZWZ0ICsgKGx0ciA/IG9mZnNldC54IDogLW9mZnNldC54KSAtIChsZWZ0ICsgMTQgLyogQXJyb3cuT2Zmc2V0ICovIC0gNyAvKiBBcnJvdy5TaXplICovKTtcbiAgICAgICAgICAgICAgICBhcnJvdy5zdHlsZS5sZWZ0ID0gYXJyb3dMZWZ0IC8gc2NhbGVYICsgXCJweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRWaWV3Lm92ZXJsYXAgIT09IHRydWUpXG4gICAgICAgICAgICAgICAgb3RoZXJzLnB1c2goeyBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b206IHRvcCArIGhlaWdodCB9KTtcbiAgICAgICAgICAgIGRvbS5jbGFzc0xpc3QudG9nZ2xlKFwiY20tdG9vbHRpcC1hYm92ZVwiLCBhYm92ZSk7XG4gICAgICAgICAgICBkb20uY2xhc3NMaXN0LnRvZ2dsZShcImNtLXRvb2x0aXAtYmVsb3dcIiwgIWFib3ZlKTtcbiAgICAgICAgICAgIGlmICh0Vmlldy5wb3NpdGlvbmVkKVxuICAgICAgICAgICAgICAgIHRWaWV3LnBvc2l0aW9uZWQobWVhc3VyZWQuc3BhY2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1heWJlTWVhc3VyZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubWFuYWdlci50b29sdGlwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcuaW5WaWV3KVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5yZXF1ZXN0TWVhc3VyZSh0aGlzLm1lYXN1cmVSZXEpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5WaWV3ICE9IHRoaXMudmlldy5pblZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluVmlldyA9IHRoaXMudmlldy5pblZpZXc7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluVmlldylcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdHYgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgICAgICAgICAgICAgIHR2LmRvbS5zdHlsZS50b3AgPSBPdXRzaWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSwge1xuICAgIGV2ZW50T2JzZXJ2ZXJzOiB7XG4gICAgICAgIHNjcm9sbCgpIHsgdGhpcy5tYXliZU1lYXN1cmUoKTsgfVxuICAgIH1cbn0pO1xuZnVuY3Rpb24gc2V0TGVmdFN0eWxlKGVsdCwgdmFsdWUpIHtcbiAgICBsZXQgY3VycmVudCA9IHBhcnNlSW50KGVsdC5zdHlsZS5sZWZ0LCAxMCk7XG4gICAgaWYgKGlzTmFOKGN1cnJlbnQpIHx8IE1hdGguYWJzKHZhbHVlIC0gY3VycmVudCkgPiAxKVxuICAgICAgICBlbHQuc3R5bGUubGVmdCA9IHZhbHVlICsgXCJweFwiO1xufVxuY29uc3QgYmFzZVRoZW1lID0gLypAX19QVVJFX18qL0VkaXRvclZpZXcuYmFzZVRoZW1lKHtcbiAgICBcIi5jbS10b29sdGlwXCI6IHtcbiAgICAgICAgekluZGV4OiA1MDAsXG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS10b29sdGlwXCI6IHtcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjYmJiXCIsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZjVmNWY1XCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS10b29sdGlwLXNlY3Rpb246bm90KDpmaXJzdC1jaGlsZClcIjoge1xuICAgICAgICBib3JkZXJUb3A6IFwiMXB4IHNvbGlkICNiYmJcIixcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLXRvb2x0aXBcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzMzMzMzOFwiLFxuICAgICAgICBjb2xvcjogXCJ3aGl0ZVwiXG4gICAgfSxcbiAgICBcIi5jbS10b29sdGlwLWFycm93XCI6IHtcbiAgICAgICAgaGVpZ2h0OiBgJHs3IC8qIEFycm93LlNpemUgKi99cHhgLFxuICAgICAgICB3aWR0aDogYCR7NyAvKiBBcnJvdy5TaXplICovICogMn1weGAsXG4gICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgIHpJbmRleDogLTEsXG4gICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgICBcIiY6YmVmb3JlLCAmOmFmdGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFwiJydcIixcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgIGJvcmRlckxlZnQ6IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCB0cmFuc3BhcmVudGAsXG4gICAgICAgICAgICBib3JkZXJSaWdodDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkIHRyYW5zcGFyZW50YCxcbiAgICAgICAgfSxcbiAgICAgICAgXCIuY20tdG9vbHRpcC1hYm92ZSAmXCI6IHtcbiAgICAgICAgICAgIGJvdHRvbTogYC0kezcgLyogQXJyb3cuU2l6ZSAqL31weGAsXG4gICAgICAgICAgICBcIiY6YmVmb3JlXCI6IHtcbiAgICAgICAgICAgICAgICBib3JkZXJUb3A6IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCAjYmJiYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIiY6YWZ0ZXJcIjoge1xuICAgICAgICAgICAgICAgIGJvcmRlclRvcDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkICNmNWY1ZjVgLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogXCIxcHhcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIi5jbS10b29sdGlwLWJlbG93ICZcIjoge1xuICAgICAgICAgICAgdG9wOiBgLSR7NyAvKiBBcnJvdy5TaXplICovfXB4YCxcbiAgICAgICAgICAgIFwiJjpiZWZvcmVcIjoge1xuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkICNiYmJgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiJjphZnRlclwiOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgI2Y1ZjVmNWAsXG4gICAgICAgICAgICAgICAgdG9wOiBcIjFweFwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS10b29sdGlwIC5jbS10b29sdGlwLWFycm93XCI6IHtcbiAgICAgICAgXCImOmJlZm9yZVwiOiB7XG4gICAgICAgICAgICBib3JkZXJUb3BDb2xvcjogXCIjMzMzMzM4XCIsXG4gICAgICAgICAgICBib3JkZXJCb3R0b21Db2xvcjogXCIjMzMzMzM4XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCImOmFmdGVyXCI6IHtcbiAgICAgICAgICAgIGJvcmRlclRvcENvbG9yOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgICAgICBib3JkZXJCb3R0b21Db2xvcjogXCJ0cmFuc3BhcmVudFwiXG4gICAgICAgIH1cbiAgICB9XG59KTtcbmNvbnN0IG5vT2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07XG4vKipcbkZhY2V0IHRvIHdoaWNoIGFuIGV4dGVuc2lvbiBjYW4gYWRkIGEgdmFsdWUgdG8gc2hvdyBhIHRvb2x0aXAuXG4qL1xuY29uc3Qgc2hvd1Rvb2x0aXAgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBlbmFibGVzOiBbdG9vbHRpcFBsdWdpbiwgYmFzZVRoZW1lXVxufSk7XG5jb25zdCBzaG93SG92ZXJUb29sdGlwID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogaW5wdXRzID0+IGlucHV0cy5yZWR1Y2UoKGEsIGkpID0+IGEuY29uY2F0KGkpLCBbXSlcbn0pO1xuY2xhc3MgSG92ZXJUb29sdGlwSG9zdCB7XG4gICAgLy8gTmVlZHMgdG8gYmUgc3RhdGljIHNvIHRoYXQgaG9zdCB0b29sdGlwIGluc3RhbmNlcyBhbHdheXMgbWF0Y2hcbiAgICBzdGF0aWMgY3JlYXRlKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIb3ZlclRvb2x0aXBIb3N0KHZpZXcpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMubW91bnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS10b29sdGlwLWhvdmVyXCIpO1xuICAgICAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVG9vbHRpcFZpZXdNYW5hZ2VyKHZpZXcsIHNob3dIb3ZlclRvb2x0aXAsICh0LCBwKSA9PiB0aGlzLmNyZWF0ZUhvc3RlZFZpZXcodCwgcCksIHQgPT4gdC5kb20ucmVtb3ZlKCkpO1xuICAgIH1cbiAgICBjcmVhdGVIb3N0ZWRWaWV3KHRvb2x0aXAsIHByZXYpIHtcbiAgICAgICAgbGV0IGhvc3RlZFZpZXcgPSB0b29sdGlwLmNyZWF0ZSh0aGlzLnZpZXcpO1xuICAgICAgICBob3N0ZWRWaWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tdG9vbHRpcC1zZWN0aW9uXCIpO1xuICAgICAgICB0aGlzLmRvbS5pbnNlcnRCZWZvcmUoaG9zdGVkVmlldy5kb20sIHByZXYgPyBwcmV2LmRvbS5uZXh0U2libGluZyA6IHRoaXMuZG9tLmZpcnN0Q2hpbGQpO1xuICAgICAgICBpZiAodGhpcy5tb3VudGVkICYmIGhvc3RlZFZpZXcubW91bnQpXG4gICAgICAgICAgICBob3N0ZWRWaWV3Lm1vdW50KHRoaXMudmlldyk7XG4gICAgICAgIHJldHVybiBob3N0ZWRWaWV3O1xuICAgIH1cbiAgICBtb3VudCh2aWV3KSB7XG4gICAgICAgIGZvciAobGV0IGhvc3RlZFZpZXcgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cykge1xuICAgICAgICAgICAgaWYgKGhvc3RlZFZpZXcubW91bnQpXG4gICAgICAgICAgICAgICAgaG9zdGVkVmlldy5tb3VudCh2aWV3KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBwb3NpdGlvbmVkKHNwYWNlKSB7XG4gICAgICAgIGZvciAobGV0IGhvc3RlZFZpZXcgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cykge1xuICAgICAgICAgICAgaWYgKGhvc3RlZFZpZXcucG9zaXRpb25lZClcbiAgICAgICAgICAgICAgICBob3N0ZWRWaWV3LnBvc2l0aW9uZWQoc3BhY2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyLnVwZGF0ZSh1cGRhdGUpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgIChfYSA9IHQuZGVzdHJveSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodCk7XG4gICAgfVxuICAgIHBhc3NQcm9wKG5hbWUpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGxldCB2aWV3IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpIHtcbiAgICAgICAgICAgIGxldCBnaXZlbiA9IHZpZXdbbmFtZV07XG4gICAgICAgICAgICBpZiAoZ2l2ZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGdpdmVuO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSBnaXZlbilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGdldCBvZmZzZXQoKSB7IHJldHVybiB0aGlzLnBhc3NQcm9wKFwib2Zmc2V0XCIpOyB9XG4gICAgZ2V0IGdldENvb3JkcygpIHsgcmV0dXJuIHRoaXMucGFzc1Byb3AoXCJnZXRDb29yZHNcIik7IH1cbiAgICBnZXQgb3ZlcmxhcCgpIHsgcmV0dXJuIHRoaXMucGFzc1Byb3AoXCJvdmVybGFwXCIpOyB9XG4gICAgZ2V0IHJlc2l6ZSgpIHsgcmV0dXJuIHRoaXMucGFzc1Byb3AoXCJyZXNpemVcIik7IH1cbn1cbmNvbnN0IHNob3dIb3ZlclRvb2x0aXBIb3N0ID0gLypAX19QVVJFX18qL3Nob3dUb29sdGlwLmNvbXB1dGUoW3Nob3dIb3ZlclRvb2x0aXBdLCBzdGF0ZSA9PiB7XG4gICAgbGV0IHRvb2x0aXBzID0gc3RhdGUuZmFjZXQoc2hvd0hvdmVyVG9vbHRpcCk7XG4gICAgaWYgKHRvb2x0aXBzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcG9zOiBNYXRoLm1pbiguLi50b29sdGlwcy5tYXAodCA9PiB0LnBvcykpLFxuICAgICAgICBlbmQ6IE1hdGgubWF4KC4uLnRvb2x0aXBzLm1hcCh0ID0+IHsgdmFyIF9hOyByZXR1cm4gKF9hID0gdC5lbmQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHQucG9zOyB9KSksXG4gICAgICAgIGNyZWF0ZTogSG92ZXJUb29sdGlwSG9zdC5jcmVhdGUsXG4gICAgICAgIGFib3ZlOiB0b29sdGlwc1swXS5hYm92ZSxcbiAgICAgICAgYXJyb3c6IHRvb2x0aXBzLnNvbWUodCA9PiB0LmFycm93KSxcbiAgICB9O1xufSk7XG5jbGFzcyBIb3ZlclBsdWdpbiB7XG4gICAgY29uc3RydWN0b3Iodmlldywgc291cmNlLCBmaWVsZCwgc2V0SG92ZXIsIGhvdmVyVGltZSkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkO1xuICAgICAgICB0aGlzLnNldEhvdmVyID0gc2V0SG92ZXI7XG4gICAgICAgIHRoaXMuaG92ZXJUaW1lID0gaG92ZXJUaW1lO1xuICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLnJlc3RhcnRUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdE1vdmUgPSB7IHg6IDAsIHk6IDAsIHRhcmdldDogdmlldy5kb20sIHRpbWU6IDAgfTtcbiAgICAgICAgdGhpcy5jaGVja0hvdmVyID0gdGhpcy5jaGVja0hvdmVyLmJpbmQodGhpcyk7XG4gICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHRoaXMubW91c2VsZWF2ZSA9IHRoaXMubW91c2VsZWF2ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdXNlbW92ZSA9IHRoaXMubW91c2Vtb3ZlLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXN0YXJ0VGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLnJlc3RhcnRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnN0YXJ0SG92ZXIoKSwgMjApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBhY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuc3RhdGUuZmllbGQodGhpcy5maWVsZCk7XG4gICAgfVxuICAgIGNoZWNrSG92ZXIoKSB7XG4gICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gLTE7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBob3ZlcmVkID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdE1vdmUudGltZTtcbiAgICAgICAgaWYgKGhvdmVyZWQgPCB0aGlzLmhvdmVyVGltZSlcbiAgICAgICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLmNoZWNrSG92ZXIsIHRoaXMuaG92ZXJUaW1lIC0gaG92ZXJlZCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuc3RhcnRIb3ZlcigpO1xuICAgIH1cbiAgICBzdGFydEhvdmVyKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXN0YXJ0VGltZW91dCk7XG4gICAgICAgIGxldCB7IHZpZXcsIGxhc3RNb3ZlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuZG9jVmlldy5uZWFyZXN0KGxhc3RNb3ZlLnRhcmdldCk7XG4gICAgICAgIGlmICghZGVzYylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHBvcywgc2lkZSA9IDE7XG4gICAgICAgIGlmIChkZXNjIGluc3RhbmNlb2YgV2lkZ2V0Vmlldykge1xuICAgICAgICAgICAgcG9zID0gZGVzYy5wb3NBdFN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcG9zID0gdmlldy5wb3NBdENvb3JkcyhsYXN0TW92ZSk7XG4gICAgICAgICAgICBpZiAocG9zID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbGV0IHBvc0Nvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3MocG9zKTtcbiAgICAgICAgICAgIGlmICghcG9zQ29vcmRzIHx8XG4gICAgICAgICAgICAgICAgbGFzdE1vdmUueSA8IHBvc0Nvb3Jkcy50b3AgfHwgbGFzdE1vdmUueSA+IHBvc0Nvb3Jkcy5ib3R0b20gfHxcbiAgICAgICAgICAgICAgICBsYXN0TW92ZS54IDwgcG9zQ29vcmRzLmxlZnQgLSB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCB8fFxuICAgICAgICAgICAgICAgIGxhc3RNb3ZlLnggPiBwb3NDb29yZHMucmlnaHQgKyB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgYmlkaSA9IHZpZXcuYmlkaVNwYW5zKHZpZXcuc3RhdGUuZG9jLmxpbmVBdChwb3MpKS5maW5kKHMgPT4gcy5mcm9tIDw9IHBvcyAmJiBzLnRvID49IHBvcyk7XG4gICAgICAgICAgICBsZXQgcnRsID0gYmlkaSAmJiBiaWRpLmRpciA9PSBEaXJlY3Rpb24uUlRMID8gLTEgOiAxO1xuICAgICAgICAgICAgc2lkZSA9IChsYXN0TW92ZS54IDwgcG9zQ29vcmRzLmxlZnQgPyAtcnRsIDogcnRsKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlbiA9IHRoaXMuc291cmNlKHZpZXcsIHBvcywgc2lkZSk7XG4gICAgICAgIGlmIChvcGVuID09PSBudWxsIHx8IG9wZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wZW4udGhlbikge1xuICAgICAgICAgICAgbGV0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcgPSB7IHBvcyB9O1xuICAgICAgICAgICAgb3Blbi50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZyA9PSBwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgIShBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgIXJlc3VsdC5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YoQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogW3Jlc3VsdF0pIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGUgPT4gbG9nRXhjZXB0aW9uKHZpZXcuc3RhdGUsIGUsIFwiaG92ZXIgdG9vbHRpcFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3BlbiAmJiAhKEFycmF5LmlzQXJyYXkob3BlbikgJiYgIW9wZW4ubGVuZ3RoKSkge1xuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YoQXJyYXkuaXNBcnJheShvcGVuKSA/IG9wZW4gOiBbb3Blbl0pIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCB0b29sdGlwKCkge1xuICAgICAgICBsZXQgcGx1Z2luID0gdGhpcy52aWV3LnBsdWdpbih0b29sdGlwUGx1Z2luKTtcbiAgICAgICAgbGV0IGluZGV4ID0gcGx1Z2luID8gcGx1Z2luLm1hbmFnZXIudG9vbHRpcHMuZmluZEluZGV4KHQgPT4gdC5jcmVhdGUgPT0gSG92ZXJUb29sdGlwSG9zdC5jcmVhdGUpIDogLTE7XG4gICAgICAgIHJldHVybiBpbmRleCA+IC0xID8gcGx1Z2luLm1hbmFnZXIudG9vbHRpcFZpZXdzW2luZGV4XSA6IG51bGw7XG4gICAgfVxuICAgIG1vdXNlbW92ZShldmVudCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0aGlzLmxhc3RNb3ZlID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZLCB0YXJnZXQ6IGV2ZW50LnRhcmdldCwgdGltZTogRGF0ZS5ub3coKSB9O1xuICAgICAgICBpZiAodGhpcy5ob3ZlclRpbWVvdXQgPCAwKVxuICAgICAgICAgICAgdGhpcy5ob3ZlclRpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMuY2hlY2tIb3ZlciwgdGhpcy5ob3ZlclRpbWUpO1xuICAgICAgICBsZXQgeyBhY3RpdmUsIHRvb2x0aXAgfSA9IHRoaXM7XG4gICAgICAgIGlmIChhY3RpdmUubGVuZ3RoICYmIHRvb2x0aXAgJiYgIWlzSW5Ub29sdGlwKHRvb2x0aXAuZG9tLCBldmVudCkgfHwgdGhpcy5wZW5kaW5nKSB7XG4gICAgICAgICAgICBsZXQgeyBwb3MgfSA9IGFjdGl2ZVswXSB8fCB0aGlzLnBlbmRpbmcsIGVuZCA9IChfYiA9IChfYSA9IGFjdGl2ZVswXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVuZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogcG9zO1xuICAgICAgICAgICAgaWYgKChwb3MgPT0gZW5kID8gdGhpcy52aWV3LnBvc0F0Q29vcmRzKHRoaXMubGFzdE1vdmUpICE9IHBvc1xuICAgICAgICAgICAgICAgIDogIWlzT3ZlclJhbmdlKHRoaXMudmlldywgcG9zLCBlbmQsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YoW10pIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW91c2VsZWF2ZShldmVudCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ob3ZlclRpbWVvdXQpO1xuICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IC0xO1xuICAgICAgICBsZXQgeyBhY3RpdmUgfSA9IHRoaXM7XG4gICAgICAgIGlmIChhY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgeyB0b29sdGlwIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IGluVG9vbHRpcCA9IHRvb2x0aXAgJiYgdG9vbHRpcC5kb20uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCk7XG4gICAgICAgICAgICBpZiAoIWluVG9vbHRpcClcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB0aGlzLnNldEhvdmVyLm9mKFtdKSB9KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLndhdGNoVG9vbHRpcExlYXZlKHRvb2x0aXAuZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3YXRjaFRvb2x0aXBMZWF2ZSh0b29sdGlwKSB7XG4gICAgICAgIGxldCB3YXRjaCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdG9vbHRpcC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCB3YXRjaCk7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUubGVuZ3RoICYmICF0aGlzLnZpZXcuZG9tLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YoW10pIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0b29sdGlwLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHdhdGNoKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaG92ZXJUaW1lb3V0KTtcbiAgICAgICAgdGhpcy52aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCB0aGlzLm1vdXNlbGVhdmUpO1xuICAgICAgICB0aGlzLnZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3VzZW1vdmUpO1xuICAgIH1cbn1cbmNvbnN0IHRvb2x0aXBNYXJnaW4gPSA0O1xuZnVuY3Rpb24gaXNJblRvb2x0aXAodG9vbHRpcCwgZXZlbnQpIHtcbiAgICBsZXQgeyBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20gfSA9IHRvb2x0aXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGFycm93O1xuICAgIGlmIChhcnJvdyA9IHRvb2x0aXAucXVlcnlTZWxlY3RvcihcIi5jbS10b29sdGlwLWFycm93XCIpKSB7XG4gICAgICAgIGxldCBhcnJvd1JlY3QgPSBhcnJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdG9wID0gTWF0aC5taW4oYXJyb3dSZWN0LnRvcCwgdG9wKTtcbiAgICAgICAgYm90dG9tID0gTWF0aC5tYXgoYXJyb3dSZWN0LmJvdHRvbSwgYm90dG9tKTtcbiAgICB9XG4gICAgcmV0dXJuIGV2ZW50LmNsaWVudFggPj0gbGVmdCAtIHRvb2x0aXBNYXJnaW4gJiYgZXZlbnQuY2xpZW50WCA8PSByaWdodCArIHRvb2x0aXBNYXJnaW4gJiZcbiAgICAgICAgZXZlbnQuY2xpZW50WSA+PSB0b3AgLSB0b29sdGlwTWFyZ2luICYmIGV2ZW50LmNsaWVudFkgPD0gYm90dG9tICsgdG9vbHRpcE1hcmdpbjtcbn1cbmZ1bmN0aW9uIGlzT3ZlclJhbmdlKHZpZXcsIGZyb20sIHRvLCB4LCB5LCBtYXJnaW4pIHtcbiAgICBsZXQgcmVjdCA9IHZpZXcuc2Nyb2xsRE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBkb2NCb3R0b20gPSB2aWV3LmRvY3VtZW50VG9wICsgdmlldy5kb2N1bWVudFBhZGRpbmcudG9wICsgdmlldy5jb250ZW50SGVpZ2h0O1xuICAgIGlmIChyZWN0LmxlZnQgPiB4IHx8IHJlY3QucmlnaHQgPCB4IHx8IHJlY3QudG9wID4geSB8fCBNYXRoLm1pbihyZWN0LmJvdHRvbSwgZG9jQm90dG9tKSA8IHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgcG9zID0gdmlldy5wb3NBdENvb3Jkcyh7IHgsIHkgfSwgZmFsc2UpO1xuICAgIHJldHVybiBwb3MgPj0gZnJvbSAmJiBwb3MgPD0gdG87XG59XG4vKipcblNldCB1cCBhIGhvdmVyIHRvb2x0aXAsIHdoaWNoIHNob3dzIHVwIHdoZW4gdGhlIHBvaW50ZXIgaG92ZXJzXG5vdmVyIHJhbmdlcyBvZiB0ZXh0LiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIG1vdXNlIGhvdmVyc1xub3ZlciB0aGUgZG9jdW1lbnQgdGV4dC4gSXQgc2hvdWxkLCBpZiB0aGVyZSBpcyBhIHRvb2x0aXBcbmFzc29jaWF0ZWQgd2l0aCBwb3NpdGlvbiBgcG9zYCwgcmV0dXJuIHRoZSB0b29sdGlwIGRlc2NyaXB0aW9uXG4oZWl0aGVyIGRpcmVjdGx5IG9yIGluIGEgcHJvbWlzZSkuIFRoZSBgc2lkZWAgYXJndW1lbnQgaW5kaWNhdGVzXG5vbiB3aGljaCBzaWRlIG9mIHRoZSBwb3NpdGlvbiB0aGUgcG9pbnRlciBpc1x1MjAxNGl0IHdpbGwgYmUgLTEgaWYgdGhlXG5wb2ludGVyIGlzIGJlZm9yZSB0aGUgcG9zaXRpb24sIDEgaWYgYWZ0ZXIgdGhlIHBvc2l0aW9uLlxuXG5Ob3RlIHRoYXQgYWxsIGhvdmVyIHRvb2x0aXBzIGFyZSBob3N0ZWQgd2l0aGluIGEgc2luZ2xlIHRvb2x0aXBcbmNvbnRhaW5lciBlbGVtZW50LiBUaGlzIGFsbG93cyBtdWx0aXBsZSB0b29sdGlwcyBvdmVyIHRoZSBzYW1lXG5yYW5nZSB0byBiZSBcIm1lcmdlZFwiIHRvZ2V0aGVyIHdpdGhvdXQgb3ZlcmxhcHBpbmcuXG5cblRoZSByZXR1cm4gdmFsdWUgaXMgYSB2YWxpZCBbZWRpdG9yIGV4dGVuc2lvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FeHRlbnNpb24pXG5idXQgYWxzbyBwcm92aWRlcyBhbiBgYWN0aXZlYCBwcm9wZXJ0eSBob2xkaW5nIGEgc3RhdGUgZmllbGQgdGhhdFxuY2FuIGJlIHVzZWQgdG8gcmVhZCB0aGUgY3VycmVudGx5IGFjdGl2ZSB0b29sdGlwcyBwcm9kdWNlZCBieSB0aGlzXG5leHRlbnNpb24uXG4qL1xuZnVuY3Rpb24gaG92ZXJUb29sdGlwKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IHNldEhvdmVyID0gU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4gICAgbGV0IGhvdmVyU3RhdGUgPSBTdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgICAgIGNyZWF0ZSgpIHsgcmV0dXJuIFtdOyB9LFxuICAgICAgICB1cGRhdGUodmFsdWUsIHRyKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGlkZU9uQ2hhbmdlICYmICh0ci5kb2NDaGFuZ2VkIHx8IHRyLnNlbGVjdGlvbikpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gW107XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5oaWRlT24pXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZmlsdGVyKHYgPT4gIW9wdGlvbnMuaGlkZU9uKHRyLCB2KSk7XG4gICAgICAgICAgICAgICAgaWYgKHRyLmRvY0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcHBlZCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0b29sdGlwIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UG9zID0gdHIuY2hhbmdlcy5tYXBQb3ModG9vbHRpcC5wb3MsIC0xLCBNYXBNb2RlLlRyYWNrRGVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdQb3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3B5ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCB0b29sdGlwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5LnBvcyA9IG5ld1BvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29weS5lbmQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weS5lbmQgPSB0ci5jaGFuZ2VzLm1hcFBvcyhjb3B5LmVuZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkLnB1c2goY29weSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtYXBwZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgZWZmZWN0IG9mIHRyLmVmZmVjdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LmlzKHNldEhvdmVyKSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlZmZlY3QudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdC5pcyhjbG9zZUhvdmVyVG9vbHRpcEVmZmVjdCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHByb3ZpZGU6IGYgPT4gc2hvd0hvdmVyVG9vbHRpcC5mcm9tKGYpXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aXZlOiBob3ZlclN0YXRlLFxuICAgICAgICBleHRlbnNpb246IFtcbiAgICAgICAgICAgIGhvdmVyU3RhdGUsXG4gICAgICAgICAgICBWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+IG5ldyBIb3ZlclBsdWdpbih2aWV3LCBzb3VyY2UsIGhvdmVyU3RhdGUsIHNldEhvdmVyLCBvcHRpb25zLmhvdmVyVGltZSB8fCAzMDAgLyogSG92ZXIuVGltZSAqLykpLFxuICAgICAgICAgICAgc2hvd0hvdmVyVG9vbHRpcEhvc3RcbiAgICAgICAgXVxuICAgIH07XG59XG4vKipcbkdldCB0aGUgYWN0aXZlIHRvb2x0aXAgdmlldyBmb3IgYSBnaXZlbiB0b29sdGlwLCBpZiBhdmFpbGFibGUuXG4qL1xuZnVuY3Rpb24gZ2V0VG9vbHRpcCh2aWV3LCB0b29sdGlwKSB7XG4gICAgbGV0IHBsdWdpbiA9IHZpZXcucGx1Z2luKHRvb2x0aXBQbHVnaW4pO1xuICAgIGlmICghcGx1Z2luKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgZm91bmQgPSBwbHVnaW4ubWFuYWdlci50b29sdGlwcy5pbmRleE9mKHRvb2x0aXApO1xuICAgIHJldHVybiBmb3VuZCA8IDAgPyBudWxsIDogcGx1Z2luLm1hbmFnZXIudG9vbHRpcFZpZXdzW2ZvdW5kXTtcbn1cbi8qKlxuUmV0dXJucyB0cnVlIGlmIGFueSBob3ZlciB0b29sdGlwcyBhcmUgY3VycmVudGx5IGFjdGl2ZS5cbiovXG5mdW5jdGlvbiBoYXNIb3ZlclRvb2x0aXBzKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmZhY2V0KHNob3dIb3ZlclRvb2x0aXApLnNvbWUoeCA9PiB4KTtcbn1cbmNvbnN0IGNsb3NlSG92ZXJUb29sdGlwRWZmZWN0ID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLyoqXG5UcmFuc2FjdGlvbiBlZmZlY3QgdGhhdCBjbG9zZXMgYWxsIGhvdmVyIHRvb2x0aXBzLlxuKi9cbmNvbnN0IGNsb3NlSG92ZXJUb29sdGlwcyA9IC8qQF9fUFVSRV9fKi9jbG9zZUhvdmVyVG9vbHRpcEVmZmVjdC5vZihudWxsKTtcbi8qKlxuVGVsbCB0aGUgdG9vbHRpcCBleHRlbnNpb24gdG8gcmVjb21wdXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWN0aXZlXG50b29sdGlwcy4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gc29tZXRoaW5nIGhhcHBlbnMgKHN1Y2ggYXMgYVxucmUtcG9zaXRpb25pbmcgb3IgQ1NTIGNoYW5nZSBhZmZlY3RpbmcgdGhlIGVkaXRvcikgdGhhdCBjb3VsZFxuaW52YWxpZGF0ZSB0aGUgZXhpc3RpbmcgdG9vbHRpcCBwb3NpdGlvbnMuXG4qL1xuZnVuY3Rpb24gcmVwb3NpdGlvblRvb2x0aXBzKHZpZXcpIHtcbiAgICBsZXQgcGx1Z2luID0gdmlldy5wbHVnaW4odG9vbHRpcFBsdWdpbik7XG4gICAgaWYgKHBsdWdpbilcbiAgICAgICAgcGx1Z2luLm1heWJlTWVhc3VyZSgpO1xufVxuXG5jb25zdCBwYW5lbENvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICBsZXQgdG9wQ29udGFpbmVyLCBib3R0b21Db250YWluZXI7XG4gICAgICAgIGZvciAobGV0IGMgb2YgY29uZmlncykge1xuICAgICAgICAgICAgdG9wQ29udGFpbmVyID0gdG9wQ29udGFpbmVyIHx8IGMudG9wQ29udGFpbmVyO1xuICAgICAgICAgICAgYm90dG9tQ29udGFpbmVyID0gYm90dG9tQ29udGFpbmVyIHx8IGMuYm90dG9tQ29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHRvcENvbnRhaW5lciwgYm90dG9tQ29udGFpbmVyIH07XG4gICAgfVxufSk7XG4vKipcbkNvbmZpZ3VyZXMgdGhlIHBhbmVsLW1hbmFnaW5nIGV4dGVuc2lvbi5cbiovXG5mdW5jdGlvbiBwYW5lbHMoY29uZmlnKSB7XG4gICAgcmV0dXJuIGNvbmZpZyA/IFtwYW5lbENvbmZpZy5vZihjb25maWcpXSA6IFtdO1xufVxuLyoqXG5HZXQgdGhlIGFjdGl2ZSBwYW5lbCBjcmVhdGVkIGJ5IHRoZSBnaXZlbiBjb25zdHJ1Y3RvciwgaWYgYW55LlxuVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91IG5lZWQgYWNjZXNzIHRvIHlvdXIgcGFuZWxzJyBET01cbnN0cnVjdHVyZS5cbiovXG5mdW5jdGlvbiBnZXRQYW5lbCh2aWV3LCBwYW5lbCkge1xuICAgIGxldCBwbHVnaW4gPSB2aWV3LnBsdWdpbihwYW5lbFBsdWdpbik7XG4gICAgbGV0IGluZGV4ID0gcGx1Z2luID8gcGx1Z2luLnNwZWNzLmluZGV4T2YocGFuZWwpIDogLTE7XG4gICAgcmV0dXJuIGluZGV4ID4gLTEgPyBwbHVnaW4ucGFuZWxzW2luZGV4XSA6IG51bGw7XG59XG5jb25zdCBwYW5lbFBsdWdpbiA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLmlucHV0ID0gdmlldy5zdGF0ZS5mYWNldChzaG93UGFuZWwpO1xuICAgICAgICB0aGlzLnNwZWNzID0gdGhpcy5pbnB1dC5maWx0ZXIocyA9PiBzKTtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSB0aGlzLnNwZWNzLm1hcChzcGVjID0+IHNwZWModmlldykpO1xuICAgICAgICBsZXQgY29uZiA9IHZpZXcuc3RhdGUuZmFjZXQocGFuZWxDb25maWcpO1xuICAgICAgICB0aGlzLnRvcCA9IG5ldyBQYW5lbEdyb3VwKHZpZXcsIHRydWUsIGNvbmYudG9wQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5ib3R0b20gPSBuZXcgUGFuZWxHcm91cCh2aWV3LCBmYWxzZSwgY29uZi5ib3R0b21Db250YWluZXIpO1xuICAgICAgICB0aGlzLnRvcC5zeW5jKHRoaXMucGFuZWxzLmZpbHRlcihwID0+IHAudG9wKSk7XG4gICAgICAgIHRoaXMuYm90dG9tLnN5bmModGhpcy5wYW5lbHMuZmlsdGVyKHAgPT4gIXAudG9wKSk7XG4gICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wYW5lbHMpIHtcbiAgICAgICAgICAgIHAuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1wYW5lbFwiKTtcbiAgICAgICAgICAgIGlmIChwLm1vdW50KVxuICAgICAgICAgICAgICAgIHAubW91bnQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCBjb25mID0gdXBkYXRlLnN0YXRlLmZhY2V0KHBhbmVsQ29uZmlnKTtcbiAgICAgICAgaWYgKHRoaXMudG9wLmNvbnRhaW5lciAhPSBjb25mLnRvcENvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy50b3Auc3luYyhbXSk7XG4gICAgICAgICAgICB0aGlzLnRvcCA9IG5ldyBQYW5lbEdyb3VwKHVwZGF0ZS52aWV3LCB0cnVlLCBjb25mLnRvcENvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYm90dG9tLmNvbnRhaW5lciAhPSBjb25mLmJvdHRvbUNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5ib3R0b20uc3luYyhbXSk7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbSA9IG5ldyBQYW5lbEdyb3VwKHVwZGF0ZS52aWV3LCBmYWxzZSwgY29uZi5ib3R0b21Db250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9wLnN5bmNDbGFzc2VzKCk7XG4gICAgICAgIHRoaXMuYm90dG9tLnN5bmNDbGFzc2VzKCk7XG4gICAgICAgIGxldCBpbnB1dCA9IHVwZGF0ZS5zdGF0ZS5mYWNldChzaG93UGFuZWwpO1xuICAgICAgICBpZiAoaW5wdXQgIT0gdGhpcy5pbnB1dCkge1xuICAgICAgICAgICAgbGV0IHNwZWNzID0gaW5wdXQuZmlsdGVyKHggPT4geCk7XG4gICAgICAgICAgICBsZXQgcGFuZWxzID0gW10sIHRvcCA9IFtdLCBib3R0b20gPSBbXSwgbW91bnQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgICAgICAgICAgICBsZXQga25vd24gPSB0aGlzLnNwZWNzLmluZGV4T2Yoc3BlYyksIHBhbmVsO1xuICAgICAgICAgICAgICAgIGlmIChrbm93biA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFuZWwgPSBzcGVjKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgbW91bnQucHVzaChwYW5lbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbCA9IHRoaXMucGFuZWxzW2tub3duXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhbmVsLnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYW5lbHMucHVzaChwYW5lbCk7XG4gICAgICAgICAgICAgICAgKHBhbmVsLnRvcCA/IHRvcCA6IGJvdHRvbSkucHVzaChwYW5lbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNwZWNzID0gc3BlY3M7XG4gICAgICAgICAgICB0aGlzLnBhbmVscyA9IHBhbmVscztcbiAgICAgICAgICAgIHRoaXMudG9wLnN5bmModG9wKTtcbiAgICAgICAgICAgIHRoaXMuYm90dG9tLnN5bmMoYm90dG9tKTtcbiAgICAgICAgICAgIGZvciAobGV0IHAgb2YgbW91bnQpIHtcbiAgICAgICAgICAgICAgICBwLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tcGFuZWxcIik7XG4gICAgICAgICAgICAgICAgaWYgKHAubW91bnQpXG4gICAgICAgICAgICAgICAgICAgIHAubW91bnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wYW5lbHMpXG4gICAgICAgICAgICAgICAgaWYgKHAudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICBwLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudG9wLnN5bmMoW10pO1xuICAgICAgICB0aGlzLmJvdHRvbS5zeW5jKFtdKTtcbiAgICB9XG59LCB7XG4gICAgcHJvdmlkZTogcGx1Z2luID0+IEVkaXRvclZpZXcuc2Nyb2xsTWFyZ2lucy5vZih2aWV3ID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gdmlldy5wbHVnaW4ocGx1Z2luKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIHsgdG9wOiB2YWx1ZS50b3Auc2Nyb2xsTWFyZ2luKCksIGJvdHRvbTogdmFsdWUuYm90dG9tLnNjcm9sbE1hcmdpbigpIH07XG4gICAgfSlcbn0pO1xuY2xhc3MgUGFuZWxHcm91cCB7XG4gICAgY29uc3RydWN0b3IodmlldywgdG9wLCBjb250YWluZXIpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgICAgICB0aGlzLmRvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jbGFzc2VzID0gXCJcIjtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSBbXTtcbiAgICAgICAgdGhpcy5zeW5jQ2xhc3NlcygpO1xuICAgIH1cbiAgICBzeW5jKHBhbmVscykge1xuICAgICAgICBmb3IgKGxldCBwIG9mIHRoaXMucGFuZWxzKVxuICAgICAgICAgICAgaWYgKHAuZGVzdHJveSAmJiBwYW5lbHMuaW5kZXhPZihwKSA8IDApXG4gICAgICAgICAgICAgICAgcC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucGFuZWxzID0gcGFuZWxzO1xuICAgICAgICB0aGlzLnN5bmNET00oKTtcbiAgICB9XG4gICAgc3luY0RPTSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFuZWxzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRvbS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZG9tKSB7XG4gICAgICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSB0aGlzLnRvcCA/IFwiY20tcGFuZWxzIGNtLXBhbmVscy10b3BcIiA6IFwiY20tcGFuZWxzIGNtLXBhbmVscy1ib3R0b21cIjtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlW3RoaXMudG9wID8gXCJ0b3BcIiA6IFwiYm90dG9tXCJdID0gXCIwXCI7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5jb250YWluZXIgfHwgdGhpcy52aWV3LmRvbTtcbiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcy5kb20sIHRoaXMudG9wID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3VyRE9NID0gdGhpcy5kb20uZmlyc3RDaGlsZDtcbiAgICAgICAgZm9yIChsZXQgcGFuZWwgb2YgdGhpcy5wYW5lbHMpIHtcbiAgICAgICAgICAgIGlmIChwYW5lbC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJET00gIT0gcGFuZWwuZG9tKVxuICAgICAgICAgICAgICAgICAgICBjdXJET00gPSBybShjdXJET00pO1xuICAgICAgICAgICAgICAgIGN1ckRPTSA9IGN1ckRPTS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShwYW5lbC5kb20sIGN1ckRPTSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGN1ckRPTSlcbiAgICAgICAgICAgIGN1ckRPTSA9IHJtKGN1ckRPTSk7XG4gICAgfVxuICAgIHNjcm9sbE1hcmdpbigpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRvbSB8fCB0aGlzLmNvbnRhaW5lciA/IDBcbiAgICAgICAgICAgIDogTWF0aC5tYXgoMCwgdGhpcy50b3AgP1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSAtIE1hdGgubWF4KDAsIHRoaXMudmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wKSA6XG4gICAgICAgICAgICAgICAgTWF0aC5taW4oaW5uZXJIZWlnaHQsIHRoaXMudmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tKSAtIHRoaXMuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCk7XG4gICAgfVxuICAgIHN5bmNDbGFzc2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyIHx8IHRoaXMuY2xhc3NlcyA9PSB0aGlzLnZpZXcudGhlbWVDbGFzc2VzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCBjbHMgb2YgdGhpcy5jbGFzc2VzLnNwbGl0KFwiIFwiKSlcbiAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShjbHMpO1xuICAgICAgICBmb3IgKGxldCBjbHMgb2YgKHRoaXMuY2xhc3NlcyA9IHRoaXMudmlldy50aGVtZUNsYXNzZXMpLnNwbGl0KFwiIFwiKSlcbiAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChjbHMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJtKG5vZGUpIHtcbiAgICBsZXQgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgbm9kZS5yZW1vdmUoKTtcbiAgICByZXR1cm4gbmV4dDtcbn1cbi8qKlxuT3BlbmluZyBhIHBhbmVsIGlzIGRvbmUgYnkgcHJvdmlkaW5nIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yXG50aGUgcGFuZWwgdGhyb3VnaCB0aGlzIGZhY2V0LiAoVGhlIHBhbmVsIGlzIGNsb3NlZCBhZ2FpbiB3aGVuIGl0c1xuY29uc3RydWN0b3IgaXMgbm8gbG9uZ2VyIHByb3ZpZGVkLikgVmFsdWVzIG9mIGBudWxsYCBhcmUgaWdub3JlZC5cbiovXG5jb25zdCBzaG93UGFuZWwgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBlbmFibGVzOiBwYW5lbFBsdWdpblxufSk7XG5cbi8qKlxuQSBndXR0ZXIgbWFya2VyIHJlcHJlc2VudHMgYSBiaXQgb2YgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gYSBsaW5lXG5pbiBhIHNwZWNpZmljIGd1dHRlci4gWW91ciBvd24gY3VzdG9tIG1hcmtlcnMgaGF2ZSB0byBleHRlbmQgdGhpc1xuY2xhc3MuXG4qL1xuY2xhc3MgR3V0dGVyTWFya2VyIGV4dGVuZHMgUmFuZ2VWYWx1ZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXJlKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8IHRoaXMuY29uc3RydWN0b3IgPT0gb3RoZXIuY29uc3RydWN0b3IgJiYgdGhpcy5lcShvdGhlcik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyBtYXJrZXIgdG8gYW5vdGhlciBtYXJrZXIgb2YgdGhlIHNhbWUgdHlwZS5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIENhbGxlZCBpZiB0aGUgbWFya2VyIGhhcyBhIGB0b0RPTWAgbWV0aG9kIGFuZCBpdHMgcmVwcmVzZW50YXRpb25cbiAgICB3YXMgcmVtb3ZlZCBmcm9tIGEgZ3V0dGVyLlxuICAgICovXG4gICAgZGVzdHJveShkb20pIHsgfVxufVxuR3V0dGVyTWFya2VyLnByb3RvdHlwZS5lbGVtZW50Q2xhc3MgPSBcIlwiO1xuR3V0dGVyTWFya2VyLnByb3RvdHlwZS50b0RPTSA9IHVuZGVmaW5lZDtcbkd1dHRlck1hcmtlci5wcm90b3R5cGUubWFwTW9kZSA9IE1hcE1vZGUuVHJhY2tCZWZvcmU7XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLnN0YXJ0U2lkZSA9IEd1dHRlck1hcmtlci5wcm90b3R5cGUuZW5kU2lkZSA9IC0xO1xuR3V0dGVyTWFya2VyLnByb3RvdHlwZS5wb2ludCA9IHRydWU7XG4vKipcbkZhY2V0IHVzZWQgdG8gYWRkIGEgY2xhc3MgdG8gYWxsIGd1dHRlciBlbGVtZW50cyBmb3IgYSBnaXZlbiBsaW5lLlxuTWFya2VycyBnaXZlbiB0byB0aGlzIGZhY2V0IHNob3VsZCBfb25seV8gZGVmaW5lIGFuXG5bYGVsZW1lbnRjbGFzc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5HdXR0ZXJNYXJrZXIuZWxlbWVudENsYXNzKSwgbm90IGFcbltgdG9ET01gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuR3V0dGVyTWFya2VyLnRvRE9NKSAob3IgdGhlIG1hcmtlciB3aWxsIGFwcGVhclxuaW4gYWxsIGd1dHRlcnMgZm9yIHRoZSBsaW5lKS5cbiovXG5jb25zdCBndXR0ZXJMaW5lQ2xhc3MgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcbkZhY2V0IHVzZWQgdG8gYWRkIGEgY2xhc3MgdG8gYWxsIGd1dHRlciBlbGVtZW50cyBuZXh0IHRvIGEgd2lkZ2V0LlxuU2hvdWxkIG5vdCBwcm92aWRlIHdpZGdldHMgd2l0aCBhIGB0b0RPTWAgbWV0aG9kLlxuKi9cbmNvbnN0IGd1dHRlcldpZGdldENsYXNzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgY2xhc3M6IFwiXCIsXG4gICAgcmVuZGVyRW1wdHlFbGVtZW50czogZmFsc2UsXG4gICAgZWxlbWVudFN0eWxlOiBcIlwiLFxuICAgIG1hcmtlcnM6ICgpID0+IFJhbmdlU2V0LmVtcHR5LFxuICAgIGxpbmVNYXJrZXI6ICgpID0+IG51bGwsXG4gICAgd2lkZ2V0TWFya2VyOiAoKSA9PiBudWxsLFxuICAgIGxpbmVNYXJrZXJDaGFuZ2U6IG51bGwsXG4gICAgaW5pdGlhbFNwYWNlcjogbnVsbCxcbiAgICB1cGRhdGVTcGFjZXI6IG51bGwsXG4gICAgZG9tRXZlbnRIYW5kbGVyczoge31cbn07XG5jb25zdCBhY3RpdmVHdXR0ZXJzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5EZWZpbmUgYW4gZWRpdG9yIGd1dHRlci4gVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBndXR0ZXJzIGFwcGVhciBpc1xuZGV0ZXJtaW5lZCBieSB0aGVpciBleHRlbnNpb24gcHJpb3JpdHkuXG4qL1xuZnVuY3Rpb24gZ3V0dGVyKGNvbmZpZykge1xuICAgIHJldHVybiBbZ3V0dGVycygpLCBhY3RpdmVHdXR0ZXJzLm9mKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMpLCBjb25maWcpKV07XG59XG5jb25zdCB1bmZpeEd1dHRlcnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KVxufSk7XG4vKipcblRoZSBndXR0ZXItZHJhd2luZyBwbHVnaW4gaXMgYXV0b21hdGljYWxseSBlbmFibGVkIHdoZW4geW91IGFkZCBhXG5ndXR0ZXIsIGJ1dCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGV4cGxpY2l0bHkgY29uZmlndXJlIGl0LlxuXG5Vbmxlc3MgYGZpeGVkYCBpcyBleHBsaWNpdGx5IHNldCB0byBgZmFsc2VgLCB0aGUgZ3V0dGVycyBhcmVcbmZpeGVkLCBtZWFuaW5nIHRoZXkgZG9uJ3Qgc2Nyb2xsIGFsb25nIHdpdGggdGhlIGNvbnRlbnRcbmhvcml6b250YWxseSAoZXhjZXB0IG9uIEludGVybmV0IEV4cGxvcmVyLCB3aGljaCBkb2Vzbid0IHN1cHBvcnRcbkNTUyBbYHBvc2l0aW9uOlxuc3RpY2t5YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3Bvc2l0aW9uI3N0aWNreSkpLlxuKi9cbmZ1bmN0aW9uIGd1dHRlcnMoY29uZmlnKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtcbiAgICAgICAgZ3V0dGVyVmlldyxcbiAgICBdO1xuICAgIGlmIChjb25maWcgJiYgY29uZmlnLmZpeGVkID09PSBmYWxzZSlcbiAgICAgICAgcmVzdWx0LnB1c2godW5maXhHdXR0ZXJzLm9mKHRydWUpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgZ3V0dGVyVmlldyA9IC8qQF9fUFVSRV9fKi9WaWV3UGx1Z2luLmZyb21DbGFzcyhjbGFzcyB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnByZXZWaWV3cG9ydCA9IHZpZXcudmlld3BvcnQ7XG4gICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1ndXR0ZXJzXCI7XG4gICAgICAgIHRoaXMuZG9tLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgdGhpcy5kb20uc3R5bGUubWluSGVpZ2h0ID0gKHRoaXMudmlldy5jb250ZW50SGVpZ2h0IC8gdGhpcy52aWV3LnNjYWxlWSkgKyBcInB4XCI7XG4gICAgICAgIHRoaXMuZ3V0dGVycyA9IHZpZXcuc3RhdGUuZmFjZXQoYWN0aXZlR3V0dGVycykubWFwKGNvbmYgPT4gbmV3IFNpbmdsZUd1dHRlclZpZXcodmlldywgY29uZikpO1xuICAgICAgICBmb3IgKGxldCBndXR0ZXIgb2YgdGhpcy5ndXR0ZXJzKVxuICAgICAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQoZ3V0dGVyLmRvbSk7XG4gICAgICAgIHRoaXMuZml4ZWQgPSAhdmlldy5zdGF0ZS5mYWNldCh1bmZpeEd1dHRlcnMpO1xuICAgICAgICBpZiAodGhpcy5maXhlZCkge1xuICAgICAgICAgICAgLy8gRklYTUUgSUUxMSBmYWxsYmFjaywgd2hpY2ggZG9lc24ndCBzdXBwb3J0IHBvc2l0aW9uOiBzdGlja3ksXG4gICAgICAgICAgICAvLyBieSB1c2luZyBwb3NpdGlvbjogcmVsYXRpdmUgKyBldmVudCBoYW5kbGVycyB0aGF0IHJlYWxpZ24gdGhlXG4gICAgICAgICAgICAvLyBndXR0ZXIgKG9yIGp1c3QgZm9yY2UgZml4ZWQ9ZmFsc2Ugb24gSUUxMT8pXG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5wb3NpdGlvbiA9IFwic3RpY2t5XCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zeW5jR3V0dGVycyhmYWxzZSk7XG4gICAgICAgIHZpZXcuc2Nyb2xsRE9NLmluc2VydEJlZm9yZSh0aGlzLmRvbSwgdmlldy5jb250ZW50RE9NKTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodGhpcy51cGRhdGVHdXR0ZXJzKHVwZGF0ZSkpIHtcbiAgICAgICAgICAgIC8vIERldGFjaCBkdXJpbmcgc3luYyB3aGVuIHRoZSB2aWV3cG9ydCBjaGFuZ2VkIHNpZ25pZmljYW50bHlcbiAgICAgICAgICAgIC8vIChzdWNoIGFzIGR1cmluZyBzY3JvbGxpbmcpLCBzaW5jZSBmb3IgbGFyZ2UgdXBkYXRlcyB0aGF0IGlzXG4gICAgICAgICAgICAvLyBmYXN0ZXIuXG4gICAgICAgICAgICBsZXQgdnBBID0gdGhpcy5wcmV2Vmlld3BvcnQsIHZwQiA9IHVwZGF0ZS52aWV3LnZpZXdwb3J0O1xuICAgICAgICAgICAgbGV0IHZwT3ZlcmxhcCA9IE1hdGgubWluKHZwQS50bywgdnBCLnRvKSAtIE1hdGgubWF4KHZwQS5mcm9tLCB2cEIuZnJvbSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNHdXR0ZXJzKHZwT3ZlcmxhcCA8ICh2cEIudG8gLSB2cEIuZnJvbSkgKiAwLjgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGUuZ2VvbWV0cnlDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5taW5IZWlnaHQgPSAodGhpcy52aWV3LmNvbnRlbnRIZWlnaHQgLyB0aGlzLnZpZXcuc2NhbGVZKSArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlLmZhY2V0KHVuZml4R3V0dGVycykgIT0gIXRoaXMuZml4ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZml4ZWQgPSAhdGhpcy5maXhlZDtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnBvc2l0aW9uID0gdGhpcy5maXhlZCA/IFwic3RpY2t5XCIgOiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldlZpZXdwb3J0ID0gdXBkYXRlLnZpZXcudmlld3BvcnQ7XG4gICAgfVxuICAgIHN5bmNHdXR0ZXJzKGRldGFjaCkge1xuICAgICAgICBsZXQgYWZ0ZXIgPSB0aGlzLmRvbS5uZXh0U2libGluZztcbiAgICAgICAgaWYgKGRldGFjaClcbiAgICAgICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgICAgICBsZXQgbGluZUNsYXNzZXMgPSBSYW5nZVNldC5pdGVyKHRoaXMudmlldy5zdGF0ZS5mYWNldChndXR0ZXJMaW5lQ2xhc3MpLCB0aGlzLnZpZXcudmlld3BvcnQuZnJvbSk7XG4gICAgICAgIGxldCBjbGFzc1NldCA9IFtdO1xuICAgICAgICBsZXQgY29udGV4dHMgPSB0aGlzLmd1dHRlcnMubWFwKGd1dHRlciA9PiBuZXcgVXBkYXRlQ29udGV4dChndXR0ZXIsIHRoaXMudmlldy52aWV3cG9ydCwgLXRoaXMudmlldy5kb2N1bWVudFBhZGRpbmcudG9wKSk7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2YgdGhpcy52aWV3LnZpZXdwb3J0TGluZUJsb2Nrcykge1xuICAgICAgICAgICAgaWYgKGNsYXNzU2V0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICBjbGFzc1NldCA9IFtdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGluZS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYiBvZiBsaW5lLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCAmJiBmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZUN1cnNvcihsaW5lQ2xhc3NlcywgY2xhc3NTZXQsIGIuZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeC5saW5lKHRoaXMudmlldywgYiwgY2xhc3NTZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChiLndpZGdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3gud2lkZ2V0KHRoaXMudmlldywgYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsaW5lLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQpIHtcbiAgICAgICAgICAgICAgICBhZHZhbmNlQ3Vyc29yKGxpbmVDbGFzc2VzLCBjbGFzc1NldCwgbGluZS5mcm9tKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgICAgICAgICAgY3gubGluZSh0aGlzLnZpZXcsIGxpbmUsIGNsYXNzU2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGxpbmUud2lkZ2V0KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICAgICAgICAgIGN4LndpZGdldCh0aGlzLnZpZXcsIGxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGN4IG9mIGNvbnRleHRzKVxuICAgICAgICAgICAgY3guZmluaXNoKCk7XG4gICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICB0aGlzLnZpZXcuc2Nyb2xsRE9NLmluc2VydEJlZm9yZSh0aGlzLmRvbSwgYWZ0ZXIpO1xuICAgIH1cbiAgICB1cGRhdGVHdXR0ZXJzKHVwZGF0ZSkge1xuICAgICAgICBsZXQgcHJldiA9IHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGFjdGl2ZUd1dHRlcnMpLCBjdXIgPSB1cGRhdGUuc3RhdGUuZmFjZXQoYWN0aXZlR3V0dGVycyk7XG4gICAgICAgIGxldCBjaGFuZ2UgPSB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuaGVpZ2h0Q2hhbmdlZCB8fCB1cGRhdGUudmlld3BvcnRDaGFuZ2VkIHx8XG4gICAgICAgICAgICAhUmFuZ2VTZXQuZXEodXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoZ3V0dGVyTGluZUNsYXNzKSwgdXBkYXRlLnN0YXRlLmZhY2V0KGd1dHRlckxpbmVDbGFzcyksIHVwZGF0ZS52aWV3LnZpZXdwb3J0LmZyb20sIHVwZGF0ZS52aWV3LnZpZXdwb3J0LnRvKTtcbiAgICAgICAgaWYgKHByZXYgPT0gY3VyKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBndXR0ZXIgb2YgdGhpcy5ndXR0ZXJzKVxuICAgICAgICAgICAgICAgIGlmIChndXR0ZXIudXBkYXRlKHVwZGF0ZSkpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGd1dHRlcnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNvbmYgb2YgY3VyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtub3duID0gcHJldi5pbmRleE9mKGNvbmYpO1xuICAgICAgICAgICAgICAgIGlmIChrbm93biA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ3V0dGVycy5wdXNoKG5ldyBTaW5nbGVHdXR0ZXJWaWV3KHRoaXMudmlldywgY29uZikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ndXR0ZXJzW2tub3duXS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgZ3V0dGVycy5wdXNoKHRoaXMuZ3V0dGVyc1trbm93bl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGcgb2YgdGhpcy5ndXR0ZXJzKSB7XG4gICAgICAgICAgICAgICAgZy5kb20ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGd1dHRlcnMuaW5kZXhPZihnKSA8IDApXG4gICAgICAgICAgICAgICAgICAgIGcuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgZyBvZiBndXR0ZXJzKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGcuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuZ3V0dGVycyA9IGd1dHRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChsZXQgdmlldyBvZiB0aGlzLmd1dHRlcnMpXG4gICAgICAgICAgICB2aWV3LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kb20ucmVtb3ZlKCk7XG4gICAgfVxufSwge1xuICAgIHByb3ZpZGU6IHBsdWdpbiA9PiBFZGl0b3JWaWV3LnNjcm9sbE1hcmdpbnMub2YodmlldyA9PiB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHZpZXcucGx1Z2luKHBsdWdpbik7XG4gICAgICAgIGlmICghdmFsdWUgfHwgdmFsdWUuZ3V0dGVycy5sZW5ndGggPT0gMCB8fCAhdmFsdWUuZml4ZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSXG4gICAgICAgICAgICA/IHsgbGVmdDogdmFsdWUuZG9tLm9mZnNldFdpZHRoICogdmlldy5zY2FsZVggfVxuICAgICAgICAgICAgOiB7IHJpZ2h0OiB2YWx1ZS5kb20ub2Zmc2V0V2lkdGggKiB2aWV3LnNjYWxlWCB9O1xuICAgIH0pXG59KTtcbmZ1bmN0aW9uIGFzQXJyYXkodmFsKSB7IHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF0pOyB9XG5mdW5jdGlvbiBhZHZhbmNlQ3Vyc29yKGN1cnNvciwgY29sbGVjdCwgcG9zKSB7XG4gICAgd2hpbGUgKGN1cnNvci52YWx1ZSAmJiBjdXJzb3IuZnJvbSA8PSBwb3MpIHtcbiAgICAgICAgaWYgKGN1cnNvci5mcm9tID09IHBvcylcbiAgICAgICAgICAgIGNvbGxlY3QucHVzaChjdXJzb3IudmFsdWUpO1xuICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgIH1cbn1cbmNsYXNzIFVwZGF0ZUNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKGd1dHRlciwgdmlld3BvcnQsIGhlaWdodCkge1xuICAgICAgICB0aGlzLmd1dHRlciA9IGd1dHRlcjtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuaSA9IDA7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gUmFuZ2VTZXQuaXRlcihndXR0ZXIubWFya2Vycywgdmlld3BvcnQuZnJvbSk7XG4gICAgfVxuICAgIGFkZEVsZW1lbnQodmlldywgYmxvY2ssIG1hcmtlcnMpIHtcbiAgICAgICAgbGV0IHsgZ3V0dGVyIH0gPSB0aGlzLCBhYm92ZSA9IChibG9jay50b3AgLSB0aGlzLmhlaWdodCkgLyB2aWV3LnNjYWxlWSwgaGVpZ2h0ID0gYmxvY2suaGVpZ2h0IC8gdmlldy5zY2FsZVk7XG4gICAgICAgIGlmICh0aGlzLmkgPT0gZ3V0dGVyLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IG5ld0VsdCA9IG5ldyBHdXR0ZXJFbGVtZW50KHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMpO1xuICAgICAgICAgICAgZ3V0dGVyLmVsZW1lbnRzLnB1c2gobmV3RWx0KTtcbiAgICAgICAgICAgIGd1dHRlci5kb20uYXBwZW5kQ2hpbGQobmV3RWx0LmRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBndXR0ZXIuZWxlbWVudHNbdGhpcy5pXS51cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBibG9jay5ib3R0b207XG4gICAgICAgIHRoaXMuaSsrO1xuICAgIH1cbiAgICBsaW5lKHZpZXcsIGxpbmUsIGV4dHJhTWFya2Vycykge1xuICAgICAgICBsZXQgbG9jYWxNYXJrZXJzID0gW107XG4gICAgICAgIGFkdmFuY2VDdXJzb3IodGhpcy5jdXJzb3IsIGxvY2FsTWFya2VycywgbGluZS5mcm9tKTtcbiAgICAgICAgaWYgKGV4dHJhTWFya2Vycy5sZW5ndGgpXG4gICAgICAgICAgICBsb2NhbE1hcmtlcnMgPSBsb2NhbE1hcmtlcnMuY29uY2F0KGV4dHJhTWFya2Vycyk7XG4gICAgICAgIGxldCBmb3JMaW5lID0gdGhpcy5ndXR0ZXIuY29uZmlnLmxpbmVNYXJrZXIodmlldywgbGluZSwgbG9jYWxNYXJrZXJzKTtcbiAgICAgICAgaWYgKGZvckxpbmUpXG4gICAgICAgICAgICBsb2NhbE1hcmtlcnMudW5zaGlmdChmb3JMaW5lKTtcbiAgICAgICAgbGV0IGd1dHRlciA9IHRoaXMuZ3V0dGVyO1xuICAgICAgICBpZiAobG9jYWxNYXJrZXJzLmxlbmd0aCA9PSAwICYmICFndXR0ZXIuY29uZmlnLnJlbmRlckVtcHR5RWxlbWVudHMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuYWRkRWxlbWVudCh2aWV3LCBsaW5lLCBsb2NhbE1hcmtlcnMpO1xuICAgIH1cbiAgICB3aWRnZXQodmlldywgYmxvY2spIHtcbiAgICAgICAgbGV0IG1hcmtlciA9IHRoaXMuZ3V0dGVyLmNvbmZpZy53aWRnZXRNYXJrZXIodmlldywgYmxvY2sud2lkZ2V0LCBibG9jayksIG1hcmtlcnMgPSBtYXJrZXIgPyBbbWFya2VyXSA6IG51bGw7XG4gICAgICAgIGZvciAobGV0IGNscyBvZiB2aWV3LnN0YXRlLmZhY2V0KGd1dHRlcldpZGdldENsYXNzKSkge1xuICAgICAgICAgICAgbGV0IG1hcmtlciA9IGNscyh2aWV3LCBibG9jay53aWRnZXQsIGJsb2NrKTtcbiAgICAgICAgICAgIGlmIChtYXJrZXIpXG4gICAgICAgICAgICAgICAgKG1hcmtlcnMgfHwgKG1hcmtlcnMgPSBbXSkpLnB1c2gobWFya2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFya2VycylcbiAgICAgICAgICAgIHRoaXMuYWRkRWxlbWVudCh2aWV3LCBibG9jaywgbWFya2Vycyk7XG4gICAgfVxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgbGV0IGd1dHRlciA9IHRoaXMuZ3V0dGVyO1xuICAgICAgICB3aGlsZSAoZ3V0dGVyLmVsZW1lbnRzLmxlbmd0aCA+IHRoaXMuaSkge1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBndXR0ZXIuZWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICBndXR0ZXIuZG9tLnJlbW92ZUNoaWxkKGxhc3QuZG9tKTtcbiAgICAgICAgICAgIGxhc3QuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgU2luZ2xlR3V0dGVyVmlldyB7XG4gICAgY29uc3RydWN0b3IodmlldywgY29uZmlnKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0gW107XG4gICAgICAgIHRoaXMuc3BhY2VyID0gbnVsbDtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWd1dHRlclwiICsgKHRoaXMuY29uZmlnLmNsYXNzID8gXCIgXCIgKyB0aGlzLmNvbmZpZy5jbGFzcyA6IFwiXCIpO1xuICAgICAgICBmb3IgKGxldCBwcm9wIGluIGNvbmZpZy5kb21FdmVudEhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmRvbS5hZGRFdmVudExpc3RlbmVyKHByb3AsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQsIHk7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSB0aGlzLmRvbSAmJiB0aGlzLmRvbS5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0YXJnZXQucGFyZW50Tm9kZSAhPSB0aGlzLmRvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IChyZWN0LnRvcCArIHJlY3QuYm90dG9tKSAvIDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB5ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0SGVpZ2h0KHkgLSB2aWV3LmRvY3VtZW50VG9wKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmRvbUV2ZW50SGFuZGxlcnNbcHJvcF0odmlldywgbGluZSwgZXZlbnQpKVxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrZXJzID0gYXNBcnJheShjb25maWcubWFya2Vycyh2aWV3KSk7XG4gICAgICAgIGlmIChjb25maWcuaW5pdGlhbFNwYWNlcikge1xuICAgICAgICAgICAgdGhpcy5zcGFjZXIgPSBuZXcgR3V0dGVyRWxlbWVudCh2aWV3LCAwLCAwLCBbY29uZmlnLmluaXRpYWxTcGFjZXIodmlldyldKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKHRoaXMuc3BhY2VyLmRvbSk7XG4gICAgICAgICAgICB0aGlzLnNwYWNlci5kb20uc3R5bGUuY3NzVGV4dCArPSBcInZpc2liaWxpdHk6IGhpZGRlbjsgcG9pbnRlci1ldmVudHM6IG5vbmVcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCBwcmV2TWFya2VycyA9IHRoaXMubWFya2VycztcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gYXNBcnJheSh0aGlzLmNvbmZpZy5tYXJrZXJzKHVwZGF0ZS52aWV3KSk7XG4gICAgICAgIGlmICh0aGlzLnNwYWNlciAmJiB0aGlzLmNvbmZpZy51cGRhdGVTcGFjZXIpIHtcbiAgICAgICAgICAgIGxldCB1cGRhdGVkID0gdGhpcy5jb25maWcudXBkYXRlU3BhY2VyKHRoaXMuc3BhY2VyLm1hcmtlcnNbMF0sIHVwZGF0ZSk7XG4gICAgICAgICAgICBpZiAodXBkYXRlZCAhPSB0aGlzLnNwYWNlci5tYXJrZXJzWzBdKVxuICAgICAgICAgICAgICAgIHRoaXMuc3BhY2VyLnVwZGF0ZSh1cGRhdGUudmlldywgMCwgMCwgW3VwZGF0ZWRdKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdnAgPSB1cGRhdGUudmlldy52aWV3cG9ydDtcbiAgICAgICAgcmV0dXJuICFSYW5nZVNldC5lcSh0aGlzLm1hcmtlcnMsIHByZXZNYXJrZXJzLCB2cC5mcm9tLCB2cC50bykgfHxcbiAgICAgICAgICAgICh0aGlzLmNvbmZpZy5saW5lTWFya2VyQ2hhbmdlID8gdGhpcy5jb25maWcubGluZU1hcmtlckNoYW5nZSh1cGRhdGUpIDogZmFsc2UpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGxldCBlbHQgb2YgdGhpcy5lbGVtZW50cylcbiAgICAgICAgICAgIGVsdC5kZXN0cm95KCk7XG4gICAgfVxufVxuY2xhc3MgR3V0dGVyRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycykge1xuICAgICAgICB0aGlzLmhlaWdodCA9IC0xO1xuICAgICAgICB0aGlzLmFib3ZlID0gMDtcbiAgICAgICAgdGhpcy5tYXJrZXJzID0gW107XG4gICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1ndXR0ZXJFbGVtZW50XCI7XG4gICAgICAgIHRoaXMudXBkYXRlKHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMpO1xuICAgIH1cbiAgICB1cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycykge1xuICAgICAgICBpZiAodGhpcy5oZWlnaHQgIT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmhlaWdodCA9IGhlaWdodCArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hYm92ZSAhPSBhYm92ZSlcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLm1hcmdpblRvcCA9ICh0aGlzLmFib3ZlID0gYWJvdmUpID8gYWJvdmUgKyBcInB4XCIgOiBcIlwiO1xuICAgICAgICBpZiAoIXNhbWVNYXJrZXJzKHRoaXMubWFya2VycywgbWFya2VycykpXG4gICAgICAgICAgICB0aGlzLnNldE1hcmtlcnModmlldywgbWFya2Vycyk7XG4gICAgfVxuICAgIHNldE1hcmtlcnModmlldywgbWFya2Vycykge1xuICAgICAgICBsZXQgY2xzID0gXCJjbS1ndXR0ZXJFbGVtZW50XCIsIGRvbVBvcyA9IHRoaXMuZG9tLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGZvciAobGV0IGlOZXcgPSAwLCBpT2xkID0gMDs7KSB7XG4gICAgICAgICAgICBsZXQgc2tpcFRvID0gaU9sZCwgbWFya2VyID0gaU5ldyA8IG1hcmtlcnMubGVuZ3RoID8gbWFya2Vyc1tpTmV3KytdIDogbnVsbCwgbWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKG1hcmtlcikge1xuICAgICAgICAgICAgICAgIGxldCBjID0gbWFya2VyLmVsZW1lbnRDbGFzcztcbiAgICAgICAgICAgICAgICBpZiAoYylcbiAgICAgICAgICAgICAgICAgICAgY2xzICs9IFwiIFwiICsgYztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gaU9sZDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFya2Vyc1tpXS5jb21wYXJlKG1hcmtlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBUbyA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBza2lwVG8gPSB0aGlzLm1hcmtlcnMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGlPbGQgPCBza2lwVG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMubWFya2Vyc1tpT2xkKytdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0LnRvRE9NKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQuZGVzdHJveShkb21Qb3MpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXIgPSBkb21Qb3MubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGRvbVBvcy5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZG9tUG9zID0gYWZ0ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtYXJrZXIpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAobWFya2VyLnRvRE9NKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWQpXG4gICAgICAgICAgICAgICAgICAgIGRvbVBvcyA9IGRvbVBvcy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShtYXJrZXIudG9ET00odmlldyksIGRvbVBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hlZClcbiAgICAgICAgICAgICAgICBpT2xkKys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gY2xzO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBtYXJrZXJzO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnNldE1hcmtlcnMobnVsbCwgW10pOyAvLyBGaXJzdCBhcmd1bWVudCBub3QgdXNlZCB1bmxlc3MgY3JlYXRpbmcgbWFya2Vyc1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVNYXJrZXJzKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghYVtpXS5jb21wYXJlKGJbaV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG5GYWNldCB1c2VkIHRvIHByb3ZpZGUgbWFya2VycyB0byB0aGUgbGluZSBudW1iZXIgZ3V0dGVyLlxuKi9cbmNvbnN0IGxpbmVOdW1iZXJNYXJrZXJzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5GYWNldCB1c2VkIHRvIGNyZWF0ZSBtYXJrZXJzIGluIHRoZSBsaW5lIG51bWJlciBndXR0ZXIgbmV4dCB0byB3aWRnZXRzLlxuKi9cbmNvbnN0IGxpbmVOdW1iZXJXaWRnZXRNYXJrZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBsaW5lTnVtYmVyQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVDb25maWcodmFsdWVzLCB7IGZvcm1hdE51bWJlcjogU3RyaW5nLCBkb21FdmVudEhhbmRsZXJzOiB7fSB9LCB7XG4gICAgICAgICAgICBkb21FdmVudEhhbmRsZXJzKGEsIGIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgYSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZXZlbnQgaW4gYikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RzID0gcmVzdWx0W2V2ZW50XSwgYWRkID0gYltldmVudF07XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtldmVudF0gPSBleGlzdHMgPyAodmlldywgbGluZSwgZXZlbnQpID0+IGV4aXN0cyh2aWV3LCBsaW5lLCBldmVudCkgfHwgYWRkKHZpZXcsIGxpbmUsIGV2ZW50KSA6IGFkZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5jbGFzcyBOdW1iZXJNYXJrZXIgZXh0ZW5kcyBHdXR0ZXJNYXJrZXIge1xuICAgIGNvbnN0cnVjdG9yKG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMubnVtYmVyID09IG90aGVyLm51bWJlcjsgfVxuICAgIHRvRE9NKCkgeyByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5udW1iZXIpOyB9XG59XG5mdW5jdGlvbiBmb3JtYXROdW1iZXIodmlldywgbnVtYmVyKSB7XG4gICAgcmV0dXJuIHZpZXcuc3RhdGUuZmFjZXQobGluZU51bWJlckNvbmZpZykuZm9ybWF0TnVtYmVyKG51bWJlciwgdmlldy5zdGF0ZSk7XG59XG5jb25zdCBsaW5lTnVtYmVyR3V0dGVyID0gLypAX19QVVJFX18qL2FjdGl2ZUd1dHRlcnMuY29tcHV0ZShbbGluZU51bWJlckNvbmZpZ10sIHN0YXRlID0+ICh7XG4gICAgY2xhc3M6IFwiY20tbGluZU51bWJlcnNcIixcbiAgICByZW5kZXJFbXB0eUVsZW1lbnRzOiBmYWxzZSxcbiAgICBtYXJrZXJzKHZpZXcpIHsgcmV0dXJuIHZpZXcuc3RhdGUuZmFjZXQobGluZU51bWJlck1hcmtlcnMpOyB9LFxuICAgIGxpbmVNYXJrZXIodmlldywgbGluZSwgb3RoZXJzKSB7XG4gICAgICAgIGlmIChvdGhlcnMuc29tZShtID0+IG0udG9ET00pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyTWFya2VyKGZvcm1hdE51bWJlcih2aWV3LCB2aWV3LnN0YXRlLmRvYy5saW5lQXQobGluZS5mcm9tKS5udW1iZXIpKTtcbiAgICB9LFxuICAgIHdpZGdldE1hcmtlcjogKHZpZXcsIHdpZGdldCwgYmxvY2spID0+IHtcbiAgICAgICAgZm9yIChsZXQgbSBvZiB2aWV3LnN0YXRlLmZhY2V0KGxpbmVOdW1iZXJXaWRnZXRNYXJrZXIpKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbSh2aWV3LCB3aWRnZXQsIGJsb2NrKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGxpbmVNYXJrZXJDaGFuZ2U6IHVwZGF0ZSA9PiB1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChsaW5lTnVtYmVyQ29uZmlnKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQobGluZU51bWJlckNvbmZpZyksXG4gICAgaW5pdGlhbFNwYWNlcih2aWV3KSB7XG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyTWFya2VyKGZvcm1hdE51bWJlcih2aWV3LCBtYXhMaW5lTnVtYmVyKHZpZXcuc3RhdGUuZG9jLmxpbmVzKSkpO1xuICAgIH0sXG4gICAgdXBkYXRlU3BhY2VyKHNwYWNlciwgdXBkYXRlKSB7XG4gICAgICAgIGxldCBtYXggPSBmb3JtYXROdW1iZXIodXBkYXRlLnZpZXcsIG1heExpbmVOdW1iZXIodXBkYXRlLnZpZXcuc3RhdGUuZG9jLmxpbmVzKSk7XG4gICAgICAgIHJldHVybiBtYXggPT0gc3BhY2VyLm51bWJlciA/IHNwYWNlciA6IG5ldyBOdW1iZXJNYXJrZXIobWF4KTtcbiAgICB9LFxuICAgIGRvbUV2ZW50SGFuZGxlcnM6IHN0YXRlLmZhY2V0KGxpbmVOdW1iZXJDb25maWcpLmRvbUV2ZW50SGFuZGxlcnNcbn0pKTtcbi8qKlxuQ3JlYXRlIGEgbGluZSBudW1iZXIgZ3V0dGVyIGV4dGVuc2lvbi5cbiovXG5mdW5jdGlvbiBsaW5lTnVtYmVycyhjb25maWcgPSB7fSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIGxpbmVOdW1iZXJDb25maWcub2YoY29uZmlnKSxcbiAgICAgICAgZ3V0dGVycygpLFxuICAgICAgICBsaW5lTnVtYmVyR3V0dGVyXG4gICAgXTtcbn1cbmZ1bmN0aW9uIG1heExpbmVOdW1iZXIobGluZXMpIHtcbiAgICBsZXQgbGFzdCA9IDk7XG4gICAgd2hpbGUgKGxhc3QgPCBsaW5lcylcbiAgICAgICAgbGFzdCA9IGxhc3QgKiAxMCArIDk7XG4gICAgcmV0dXJuIGxhc3Q7XG59XG5jb25zdCBhY3RpdmVMaW5lR3V0dGVyTWFya2VyID0gLypAX19QVVJFX18qL25ldyBjbGFzcyBleHRlbmRzIEd1dHRlck1hcmtlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuZWxlbWVudENsYXNzID0gXCJjbS1hY3RpdmVMaW5lR3V0dGVyXCI7XG4gICAgfVxufTtcbmNvbnN0IGFjdGl2ZUxpbmVHdXR0ZXJIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9ndXR0ZXJMaW5lQ2xhc3MuY29tcHV0ZShbXCJzZWxlY3Rpb25cIl0sIHN0YXRlID0+IHtcbiAgICBsZXQgbWFya3MgPSBbXSwgbGFzdCA9IC0xO1xuICAgIGZvciAobGV0IHJhbmdlIG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgbGV0IGxpbmVQb3MgPSBzdGF0ZS5kb2MubGluZUF0KHJhbmdlLmhlYWQpLmZyb207XG4gICAgICAgIGlmIChsaW5lUG9zID4gbGFzdCkge1xuICAgICAgICAgICAgbGFzdCA9IGxpbmVQb3M7XG4gICAgICAgICAgICBtYXJrcy5wdXNoKGFjdGl2ZUxpbmVHdXR0ZXJNYXJrZXIucmFuZ2UobGluZVBvcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBSYW5nZVNldC5vZihtYXJrcyk7XG59KTtcbi8qKlxuUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBhZGRzIGEgYGNtLWFjdGl2ZUxpbmVHdXR0ZXJgIGNsYXNzIHRvXG5hbGwgZ3V0dGVyIGVsZW1lbnRzIG9uIHRoZSBbYWN0aXZlXG5saW5lXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuaGlnaGxpZ2h0QWN0aXZlTGluZSkuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0QWN0aXZlTGluZUd1dHRlcigpIHtcbiAgICByZXR1cm4gYWN0aXZlTGluZUd1dHRlckhpZ2hsaWdodGVyO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyKGRlY29yYXRvcikge1xuICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+ICh7XG4gICAgICAgIGRlY29yYXRpb25zOiBkZWNvcmF0b3IuY3JlYXRlRGVjbyh2aWV3KSxcbiAgICAgICAgdXBkYXRlKHUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSBkZWNvcmF0b3IudXBkYXRlRGVjbyh1LCB0aGlzLmRlY29yYXRpb25zKTtcbiAgICAgICAgfSxcbiAgICB9KSwge1xuICAgICAgICBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zXG4gICAgfSk7XG59XG5jb25zdCB0YWJEZWNvID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLWhpZ2hsaWdodFRhYlwiIH0pO1xuY29uc3Qgc3BhY2VEZWNvID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLWhpZ2hsaWdodFNwYWNlXCIgfSk7XG5jb25zdCB3aGl0ZXNwYWNlSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovbWF0Y2hlcigvKkBfX1BVUkVfXyovbmV3IE1hdGNoRGVjb3JhdG9yKHtcbiAgICByZWdleHA6IC9cXHR8IC9nLFxuICAgIGRlY29yYXRpb246IG1hdGNoID0+IG1hdGNoWzBdID09IFwiXFx0XCIgPyB0YWJEZWNvIDogc3BhY2VEZWNvLFxuICAgIGJvdW5kYXJ5OiAvXFxTLyxcbn0pKTtcbi8qKlxuUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBoaWdobGlnaHRzIHdoaXRlc3BhY2UsIGFkZGluZyBhXG5gY20taGlnaGxpZ2h0U3BhY2VgIGNsYXNzIHRvIHN0cmV0Y2hlcyBvZiBzcGFjZXMsIGFuZCBhXG5gY20taGlnaGxpZ2h0VGFiYCBjbGFzcyB0byBpbmRpdmlkdWFsIHRhYiBjaGFyYWN0ZXJzLiBCeSBkZWZhdWx0LFxudGhlIGZvcm1lciBhcmUgc2hvd24gYXMgZmFpbnQgZG90cywgYW5kIHRoZSBsYXR0ZXIgYXMgYXJyb3dzLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodFdoaXRlc3BhY2UoKSB7XG4gICAgcmV0dXJuIHdoaXRlc3BhY2VIaWdobGlnaHRlcjtcbn1cbmNvbnN0IHRyYWlsaW5nSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovbWF0Y2hlcigvKkBfX1BVUkVfXyovbmV3IE1hdGNoRGVjb3JhdG9yKHtcbiAgICByZWdleHA6IC9cXHMrJC9nLFxuICAgIGRlY29yYXRpb246IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS10cmFpbGluZ1NwYWNlXCIgfSksXG4gICAgYm91bmRhcnk6IC9cXFMvLFxufSkpO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGFkZHMgYSBgY20tdHJhaWxpbmdTcGFjZWAgY2xhc3MgdG8gYWxsXG50cmFpbGluZyB3aGl0ZXNwYWNlLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodFRyYWlsaW5nV2hpdGVzcGFjZSgpIHtcbiAgICByZXR1cm4gdHJhaWxpbmdIaWdobGlnaHRlcjtcbn1cblxuLyoqXG5AaW50ZXJuYWxcbiovXG5jb25zdCBfX3Rlc3QgPSB7IEhlaWdodE1hcCwgSGVpZ2h0T3JhY2xlLCBNZWFzdXJlZEhlaWdodHMsIFF1ZXJ5VHlwZSwgQ2hhbmdlZFJhbmdlLCBjb21wdXRlT3JkZXIsXG4gICAgbW92ZVZpc3VhbGx5LCBjbGVhckhlaWdodENoYW5nZUZsYWcsIGdldEhlaWdodENoYW5nZUZsYWc6ICgpID0+IGhlaWdodENoYW5nZUZsYWcgfTtcblxuZXhwb3J0IHsgQmlkaVNwYW4sIEJsb2NrSW5mbywgQmxvY2tUeXBlLCBEZWNvcmF0aW9uLCBEaXJlY3Rpb24sIEVkaXRvclZpZXcsIEd1dHRlck1hcmtlciwgTWF0Y2hEZWNvcmF0b3IsIFJlY3RhbmdsZU1hcmtlciwgVmlld1BsdWdpbiwgVmlld1VwZGF0ZSwgV2lkZ2V0VHlwZSwgX190ZXN0LCBjbG9zZUhvdmVyVG9vbHRpcHMsIGNyb3NzaGFpckN1cnNvciwgZHJhd1NlbGVjdGlvbiwgZHJvcEN1cnNvciwgZ2V0RHJhd1NlbGVjdGlvbkNvbmZpZywgZ2V0UGFuZWwsIGdldFRvb2x0aXAsIGd1dHRlciwgZ3V0dGVyTGluZUNsYXNzLCBndXR0ZXJXaWRnZXRDbGFzcywgZ3V0dGVycywgaGFzSG92ZXJUb29sdGlwcywgaGlnaGxpZ2h0QWN0aXZlTGluZSwgaGlnaGxpZ2h0QWN0aXZlTGluZUd1dHRlciwgaGlnaGxpZ2h0U3BlY2lhbENoYXJzLCBoaWdobGlnaHRUcmFpbGluZ1doaXRlc3BhY2UsIGhpZ2hsaWdodFdoaXRlc3BhY2UsIGhvdmVyVG9vbHRpcCwga2V5bWFwLCBsYXllciwgbGluZU51bWJlck1hcmtlcnMsIGxpbmVOdW1iZXJXaWRnZXRNYXJrZXIsIGxpbmVOdW1iZXJzLCBsb2dFeGNlcHRpb24sIHBhbmVscywgcGxhY2Vob2xkZXIsIHJlY3Rhbmd1bGFyU2VsZWN0aW9uLCByZXBvc2l0aW9uVG9vbHRpcHMsIHJ1blNjb3BlSGFuZGxlcnMsIHNjcm9sbFBhc3RFbmQsIHNob3dQYW5lbCwgc2hvd1Rvb2x0aXAsIHRvb2x0aXBzIH07XG4iLCAiLyoqXG5UaGUgZGVmYXVsdCBtYXhpbXVtIGxlbmd0aCBvZiBhIGBUcmVlQnVmZmVyYCBub2RlLlxuKi9cbmNvbnN0IERlZmF1bHRCdWZmZXJMZW5ndGggPSAxMDI0O1xubGV0IG5leHRQcm9wSUQgPSAwO1xuY2xhc3MgUmFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKGZyb20sIHRvKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICB9XG59XG4vKipcbkVhY2ggW25vZGUgdHlwZV0oI2NvbW1vbi5Ob2RlVHlwZSkgb3IgW2luZGl2aWR1YWwgdHJlZV0oI2NvbW1vbi5UcmVlKVxuY2FuIGhhdmUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGl0IGluIHByb3BzLiBJbnN0YW5jZXMgb2YgdGhpc1xuY2xhc3MgcmVwcmVzZW50IHByb3AgbmFtZXMuXG4qL1xuY2xhc3MgTm9kZVByb3Age1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBub2RlIHByb3AgdHlwZS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHRoaXMuaWQgPSBuZXh0UHJvcElEKys7XG4gICAgICAgIHRoaXMucGVyTm9kZSA9ICEhY29uZmlnLnBlck5vZGU7XG4gICAgICAgIHRoaXMuZGVzZXJpYWxpemUgPSBjb25maWcuZGVzZXJpYWxpemUgfHwgKCgpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbm9kZSB0eXBlIGRvZXNuJ3QgZGVmaW5lIGEgZGVzZXJpYWxpemUgZnVuY3Rpb25cIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgd2l0aFxuICAgIFtgTm9kZVNldC5leHRlbmRgXSgjY29tbW9uLk5vZGVTZXQuZXh0ZW5kKSBvclxuICAgIFtgTFJQYXJzZXIuY29uZmlndXJlYF0oI2xyLlBhcnNlckNvbmZpZy5wcm9wcykgdG8gY29tcHV0ZVxuICAgIHByb3AgdmFsdWVzIGZvciBlYWNoIG5vZGUgdHlwZSBpbiB0aGUgc2V0LiBUYWtlcyBhIFttYXRjaFxuICAgIG9iamVjdF0oI2NvbW1vbi5Ob2RlVHlwZV5tYXRjaCkgb3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHVuZGVmaW5lZFxuICAgIGlmIHRoZSBub2RlIHR5cGUgZG9lc24ndCBnZXQgdGhpcyBwcm9wLCBhbmQgdGhlIHByb3AncyB2YWx1ZSBpZlxuICAgIGl0IGRvZXMuXG4gICAgKi9cbiAgICBhZGQobWF0Y2gpIHtcbiAgICAgICAgaWYgKHRoaXMucGVyTm9kZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQ2FuJ3QgYWRkIHBlci1ub2RlIHByb3BzIHRvIG5vZGUgdHlwZXNcIik7XG4gICAgICAgIGlmICh0eXBlb2YgbWF0Y2ggIT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgbWF0Y2ggPSBOb2RlVHlwZS5tYXRjaChtYXRjaCk7XG4gICAgICAgIHJldHVybiAodHlwZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG1hdGNoKHR5cGUpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFt0aGlzLCByZXN1bHRdO1xuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuUHJvcCB0aGF0IGlzIHVzZWQgdG8gZGVzY3JpYmUgbWF0Y2hpbmcgZGVsaW1pdGVycy4gRm9yIG9wZW5pbmdcbmRlbGltaXRlcnMsIHRoaXMgaG9sZHMgYW4gYXJyYXkgb2Ygbm9kZSBuYW1lcyAod3JpdHRlbiBhcyBhXG5zcGFjZS1zZXBhcmF0ZWQgc3RyaW5nIHdoZW4gZGVjbGFyaW5nIHRoaXMgcHJvcCBpbiBhIGdyYW1tYXIpXG5mb3IgdGhlIG5vZGUgdHlwZXMgb2YgY2xvc2luZyBkZWxpbWl0ZXJzIHRoYXQgbWF0Y2ggaXQuXG4qL1xuTm9kZVByb3AuY2xvc2VkQnkgPSBuZXcgTm9kZVByb3AoeyBkZXNlcmlhbGl6ZTogc3RyID0+IHN0ci5zcGxpdChcIiBcIikgfSk7XG4vKipcblRoZSBpbnZlcnNlIG9mIFtgY2xvc2VkQnlgXSgjY29tbW9uLk5vZGVQcm9wXmNsb3NlZEJ5KS4gVGhpcyBpc1xuYXR0YWNoZWQgdG8gY2xvc2luZyBkZWxpbWl0ZXJzLCBob2xkaW5nIGFuIGFycmF5IG9mIG5vZGUgbmFtZXNcbm9mIHR5cGVzIG9mIG1hdGNoaW5nIG9wZW5pbmcgZGVsaW1pdGVycy5cbiovXG5Ob2RlUHJvcC5vcGVuZWRCeSA9IG5ldyBOb2RlUHJvcCh7IGRlc2VyaWFsaXplOiBzdHIgPT4gc3RyLnNwbGl0KFwiIFwiKSB9KTtcbi8qKlxuVXNlZCB0byBhc3NpZ24gbm9kZSB0eXBlcyB0byBncm91cHMgKGZvciBleGFtcGxlLCBhbGwgbm9kZVxudHlwZXMgdGhhdCByZXByZXNlbnQgYW4gZXhwcmVzc2lvbiBjb3VsZCBiZSB0YWdnZWQgd2l0aCBhblxuYFwiRXhwcmVzc2lvblwiYCBncm91cCkuXG4qL1xuTm9kZVByb3AuZ3JvdXAgPSBuZXcgTm9kZVByb3AoeyBkZXNlcmlhbGl6ZTogc3RyID0+IHN0ci5zcGxpdChcIiBcIikgfSk7XG4vKipcbkF0dGFjaGVkIHRvIG5vZGVzIHRvIGluZGljYXRlIHRoZXNlIHNob3VsZCBiZVxuW2Rpc3BsYXllZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9kb2NzL3JlZi8jbGFuZ3VhZ2Uuc3ludGF4VHJlZSlcbmluIGEgYmlkaXJlY3Rpb25hbCB0ZXh0IGlzb2xhdGUsIHNvIHRoYXQgZGlyZWN0aW9uLW5ldXRyYWxcbmNoYXJhY3RlcnMgb24gdGhlaXIgc2lkZXMgZG9uJ3QgaW5jb3JyZWN0bHkgZ2V0IGFzc29jaWF0ZWQgd2l0aFxuc3Vycm91bmRpbmcgdGV4dC4gWW91J2xsIGdlbmVyYWxseSB3YW50IHRvIHNldCB0aGlzIGZvciBub2Rlc1xudGhhdCBjb250YWluIGFyYml0cmFyeSB0ZXh0LCBsaWtlIHN0cmluZ3MgYW5kIGNvbW1lbnRzLCBhbmQgZm9yXG5ub2RlcyB0aGF0IGFwcGVhciBfaW5zaWRlXyBhcmJpdHJhcnkgdGV4dCwgbGlrZSBIVE1MIHRhZ3MuIFdoZW5cbm5vdCBnaXZlbiBhIHZhbHVlLCBpbiBhIGdyYW1tYXIgZGVjbGFyYXRpb24sIGRlZmF1bHRzIHRvXG5gXCJhdXRvXCJgLlxuKi9cbk5vZGVQcm9wLmlzb2xhdGUgPSBuZXcgTm9kZVByb3AoeyBkZXNlcmlhbGl6ZTogdmFsdWUgPT4ge1xuICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUgIT0gXCJydGxcIiAmJiB2YWx1ZSAhPSBcImx0clwiICYmIHZhbHVlICE9IFwiYXV0b1wiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHZhbHVlIGZvciBpc29sYXRlOiBcIiArIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlIHx8IFwiYXV0b1wiO1xuICAgIH0gfSk7XG4vKipcblRoZSBoYXNoIG9mIHRoZSBbY29udGV4dF0oI2xyLkNvbnRleHRUcmFja2VyLmNvbnN0cnVjdG9yKVxudGhhdCB0aGUgbm9kZSB3YXMgcGFyc2VkIGluLCBpZiBhbnkuIFVzZWQgdG8gbGltaXQgcmV1c2Ugb2ZcbmNvbnRleHR1YWwgbm9kZXMuXG4qL1xuTm9kZVByb3AuY29udGV4dEhhc2ggPSBuZXcgTm9kZVByb3AoeyBwZXJOb2RlOiB0cnVlIH0pO1xuLyoqXG5UaGUgZGlzdGFuY2UgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG5vZGUgdGhhdCB0aGUgdG9rZW5pemVyXG5sb29rZWQgYWhlYWQgZm9yIGFueSBvZiB0aGUgdG9rZW5zIGluc2lkZSB0aGUgbm9kZS4gKFRoZSBMUlxucGFyc2VyIG9ubHkgc3RvcmVzIHRoaXMgd2hlbiBpdCBpcyBsYXJnZXIgdGhhbiAyNSwgZm9yXG5lZmZpY2llbmN5IHJlYXNvbnMuKVxuKi9cbk5vZGVQcm9wLmxvb2tBaGVhZCA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG4vKipcblRoaXMgcGVyLW5vZGUgcHJvcCBpcyB1c2VkIHRvIHJlcGxhY2UgYSBnaXZlbiBub2RlLCBvciBwYXJ0IG9mIGFcbm5vZGUsIHdpdGggYW5vdGhlciB0cmVlLiBUaGlzIGlzIHVzZWZ1bCB0byBpbmNsdWRlIHRyZWVzIGZyb21cbmRpZmZlcmVudCBsYW5ndWFnZXMgaW4gbWl4ZWQtbGFuZ3VhZ2UgcGFyc2Vycy5cbiovXG5Ob2RlUHJvcC5tb3VudGVkID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbi8qKlxuQSBtb3VudGVkIHRyZWUsIHdoaWNoIGNhbiBiZSBbc3RvcmVkXSgjY29tbW9uLk5vZGVQcm9wXm1vdW50ZWQpIG9uXG5hIHRyZWUgbm9kZSB0byBpbmRpY2F0ZSB0aGF0IHBhcnRzIG9mIGl0cyBjb250ZW50IGFyZVxucmVwcmVzZW50ZWQgYnkgYW5vdGhlciB0cmVlLlxuKi9cbmNsYXNzIE1vdW50ZWRUcmVlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgaW5uZXIgdHJlZS5cbiAgICAqL1xuICAgIHRyZWUsIFxuICAgIC8qKlxuICAgIElmIHRoaXMgaXMgbnVsbCwgdGhpcyB0cmVlIHJlcGxhY2VzIHRoZSBlbnRpcmUgbm9kZSAoaXQgd2lsbFxuICAgIGJlIGluY2x1ZGVkIGluIHRoZSByZWd1bGFyIGl0ZXJhdGlvbiBpbnN0ZWFkIG9mIGl0cyBob3N0XG4gICAgbm9kZSkuIElmIG5vdCwgb25seSB0aGUgZ2l2ZW4gcmFuZ2VzIGFyZSBjb25zaWRlcmVkIHRvIGJlXG4gICAgY292ZXJlZCBieSB0aGlzIHRyZWUuIFRoaXMgaXMgdXNlZCBmb3IgdHJlZXMgdGhhdCBhcmUgbWl4ZWQgaW5cbiAgICBhIHdheSB0aGF0IGlzbid0IHN0cmljdGx5IGhpZXJhcmNoaWNhbC4gU3VjaCBtb3VudGVkIHRyZWVzIGFyZVxuICAgIG9ubHkgZW50ZXJlZCBieSBbYHJlc29sdmVJbm5lcmBdKCNjb21tb24uVHJlZS5yZXNvbHZlSW5uZXIpXG4gICAgYW5kIFtgZW50ZXJgXSgjY29tbW9uLlN5bnRheE5vZGUuZW50ZXIpLlxuICAgICovXG4gICAgb3ZlcmxheSwgXG4gICAgLyoqXG4gICAgVGhlIHBhcnNlciB1c2VkIHRvIGNyZWF0ZSB0aGlzIHN1YnRyZWUuXG4gICAgKi9cbiAgICBwYXJzZXIpIHtcbiAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgdGhpcy5vdmVybGF5ID0gb3ZlcmxheTtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGdldCh0cmVlKSB7XG4gICAgICAgIHJldHVybiB0cmVlICYmIHRyZWUucHJvcHMgJiYgdHJlZS5wcm9wc1tOb2RlUHJvcC5tb3VudGVkLmlkXTtcbiAgICB9XG59XG5jb25zdCBub1Byb3BzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKlxuRWFjaCBub2RlIGluIGEgc3ludGF4IHRyZWUgaGFzIGEgbm9kZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBpdC5cbiovXG5jbGFzcyBOb2RlVHlwZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbmFtZSBvZiB0aGUgbm9kZSB0eXBlLiBOb3QgbmVjZXNzYXJpbHkgdW5pcXVlLCBidXQgaWYgdGhlXG4gICAgZ3JhbW1hciB3YXMgd3JpdHRlbiBwcm9wZXJseSwgZGlmZmVyZW50IG5vZGUgdHlwZXMgd2l0aCB0aGVcbiAgICBzYW1lIG5hbWUgd2l0aGluIGEgbm9kZSBzZXQgc2hvdWxkIHBsYXkgdGhlIHNhbWUgc2VtYW50aWNcbiAgICByb2xlLlxuICAgICovXG4gICAgbmFtZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBwcm9wcywgXG4gICAgLyoqXG4gICAgVGhlIGlkIG9mIHRoaXMgbm9kZSBpbiBpdHMgc2V0LiBDb3JyZXNwb25kcyB0byB0aGUgdGVybSBpZHNcbiAgICB1c2VkIGluIHRoZSBwYXJzZXIuXG4gICAgKi9cbiAgICBpZCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmbGFncyA9IDApIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbm9kZSB0eXBlLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShzcGVjKSB7XG4gICAgICAgIGxldCBwcm9wcyA9IHNwZWMucHJvcHMgJiYgc3BlYy5wcm9wcy5sZW5ndGggPyBPYmplY3QuY3JlYXRlKG51bGwpIDogbm9Qcm9wcztcbiAgICAgICAgbGV0IGZsYWdzID0gKHNwZWMudG9wID8gMSAvKiBOb2RlRmxhZy5Ub3AgKi8gOiAwKSB8IChzcGVjLnNraXBwZWQgPyAyIC8qIE5vZGVGbGFnLlNraXBwZWQgKi8gOiAwKSB8XG4gICAgICAgICAgICAoc3BlYy5lcnJvciA/IDQgLyogTm9kZUZsYWcuRXJyb3IgKi8gOiAwKSB8IChzcGVjLm5hbWUgPT0gbnVsbCA/IDggLyogTm9kZUZsYWcuQW5vbnltb3VzICovIDogMCk7XG4gICAgICAgIGxldCB0eXBlID0gbmV3IE5vZGVUeXBlKHNwZWMubmFtZSB8fCBcIlwiLCBwcm9wcywgc3BlYy5pZCwgZmxhZ3MpO1xuICAgICAgICBpZiAoc3BlYy5wcm9wcylcbiAgICAgICAgICAgIGZvciAobGV0IHNyYyBvZiBzcGVjLnByb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNyYykpXG4gICAgICAgICAgICAgICAgICAgIHNyYyA9IHNyYyh0eXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoc3JjKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcmNbMF0ucGVyTm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQ2FuJ3Qgc3RvcmUgYSBwZXItbm9kZSBwcm9wIG9uIGEgbm9kZSB0eXBlXCIpO1xuICAgICAgICAgICAgICAgICAgICBwcm9wc1tzcmNbMF0uaWRdID0gc3JjWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlcyBhIG5vZGUgcHJvcCBmb3IgdGhpcyB0eXBlLiBXaWxsIHJldHVybiBgdW5kZWZpbmVkYCBpZlxuICAgIHRoZSBwcm9wIGlzbid0IHByZXNlbnQgb24gdGhpcyBub2RlLlxuICAgICovXG4gICAgcHJvcChwcm9wKSB7IHJldHVybiB0aGlzLnByb3BzW3Byb3AuaWRdOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgdGhlIHRvcCBub2RlIG9mIGEgZ3JhbW1hci5cbiAgICAqL1xuICAgIGdldCBpc1RvcCgpIHsgcmV0dXJuICh0aGlzLmZsYWdzICYgMSAvKiBOb2RlRmxhZy5Ub3AgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIG5vZGUgaXMgcHJvZHVjZWQgYnkgYSBza2lwIHJ1bGUuXG4gICAgKi9cbiAgICBnZXQgaXNTa2lwcGVkKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiAyIC8qIE5vZGVGbGFnLlNraXBwZWQgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gZXJyb3Igbm9kZS5cbiAgICAqL1xuICAgIGdldCBpc0Vycm9yKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiA0IC8qIE5vZGVGbGFnLkVycm9yICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBXaGVuIHRydWUsIHRoaXMgbm9kZSB0eXBlIGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhIHVzZXItZGVjbGFyZWRcbiAgICBuYW1lZCBub2RlLCBmb3IgZXhhbXBsZSBiZWNhdXNlIGl0IGlzIHVzZWQgdG8gY2FjaGUgcmVwZXRpdGlvbi5cbiAgICAqL1xuICAgIGdldCBpc0Fub255bW91cygpIHsgcmV0dXJuICh0aGlzLmZsYWdzICYgOCAvKiBOb2RlRmxhZy5Bbm9ueW1vdXMgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdHJ1ZSB3aGVuIHRoaXMgbm9kZSdzIG5hbWUgb3Igb25lIG9mIGl0c1xuICAgIFtncm91cHNdKCNjb21tb24uTm9kZVByb3BeZ3JvdXApIG1hdGNoZXMgdGhlIGdpdmVuIHN0cmluZy5cbiAgICAqL1xuICAgIGlzKG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5uYW1lID09IG5hbWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBsZXQgZ3JvdXAgPSB0aGlzLnByb3AoTm9kZVByb3AuZ3JvdXApO1xuICAgICAgICAgICAgcmV0dXJuIGdyb3VwID8gZ3JvdXAuaW5kZXhPZihuYW1lKSA+IC0xIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaWQgPT0gbmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgZnVuY3Rpb24gZnJvbSBub2RlIHR5cGVzIHRvIGFyYml0cmFyeSB2YWx1ZXMgYnlcbiAgICBzcGVjaWZ5aW5nIGFuIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBuYW1lcyBhcmUgbm9kZSBvclxuICAgIFtncm91cF0oI2NvbW1vbi5Ob2RlUHJvcF5ncm91cCkgbmFtZXMuIE9mdGVuIHVzZWZ1bCB3aXRoXG4gICAgW2BOb2RlUHJvcC5hZGRgXSgjY29tbW9uLk5vZGVQcm9wLmFkZCkuIFlvdSBjYW4gcHV0IG11bHRpcGxlXG4gICAgbmFtZXMsIHNlcGFyYXRlZCBieSBzcGFjZXMsIGluIGEgc2luZ2xlIHByb3BlcnR5IG5hbWUgdG8gbWFwXG4gICAgbXVsdGlwbGUgbm9kZSBuYW1lcyB0byBhIHNpbmdsZSB2YWx1ZS5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXRjaChtYXApIHtcbiAgICAgICAgbGV0IGRpcmVjdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gbWFwKVxuICAgICAgICAgICAgZm9yIChsZXQgbmFtZSBvZiBwcm9wLnNwbGl0KFwiIFwiKSlcbiAgICAgICAgICAgICAgICBkaXJlY3RbbmFtZV0gPSBtYXBbcHJvcF07XG4gICAgICAgIHJldHVybiAobm9kZSkgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgZ3JvdXBzID0gbm9kZS5wcm9wKE5vZGVQcm9wLmdyb3VwKSwgaSA9IC0xOyBpIDwgKGdyb3VwcyA/IGdyb3Vwcy5sZW5ndGggOiAwKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZGlyZWN0W2kgPCAwID8gbm9kZS5uYW1lIDogZ3JvdXBzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG4vKipcbkFuIGVtcHR5IGR1bW15IG5vZGUgdHlwZSB0byB1c2Ugd2hlbiBubyBhY3R1YWwgdHlwZSBpcyBhdmFpbGFibGUuXG4qL1xuTm9kZVR5cGUubm9uZSA9IG5ldyBOb2RlVHlwZShcIlwiLCBPYmplY3QuY3JlYXRlKG51bGwpLCAwLCA4IC8qIE5vZGVGbGFnLkFub255bW91cyAqLyk7XG4vKipcbkEgbm9kZSBzZXQgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIG5vZGUgdHlwZXMuIEl0IGlzIHVzZWQgdG9cbmNvbXBhY3RseSByZXByZXNlbnQgdHJlZXMgYnkgc3RvcmluZyB0aGVpciB0eXBlIGlkcywgcmF0aGVyIHRoYW4gYVxuZnVsbCBwb2ludGVyIHRvIHRoZSB0eXBlIG9iamVjdCwgaW4gYSBudW1lcmljIGFycmF5LiBFYWNoIHBhcnNlclxuW2hhc10oI2xyLkxSUGFyc2VyLm5vZGVTZXQpIGEgbm9kZSBzZXQsIGFuZCBbdHJlZVxuYnVmZmVyc10oI2NvbW1vbi5UcmVlQnVmZmVyKSBjYW4gb25seSBzdG9yZSBjb2xsZWN0aW9ucyBvZiBub2Rlc1xuZnJvbSB0aGUgc2FtZSBzZXQuIEEgc2V0IGNhbiBoYXZlIGEgbWF4aW11bSBvZiAyKioxNiAoNjU1MzYpIG5vZGVcbnR5cGVzIGluIGl0LCBzbyB0aGF0IHRoZSBpZHMgZml0IGludG8gMTYtYml0IHR5cGVkIGFycmF5IHNsb3RzLlxuKi9cbmNsYXNzIE5vZGVTZXQge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNldCB3aXRoIHRoZSBnaXZlbiB0eXBlcy4gVGhlIGBpZGAgcHJvcGVydHkgb2YgZWFjaFxuICAgIHR5cGUgc2hvdWxkIGNvcnJlc3BvbmQgdG8gaXRzIHBvc2l0aW9uIHdpdGhpbiB0aGUgYXJyYXkuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbm9kZSB0eXBlcyBpbiB0aGlzIHNldCwgYnkgaWQuXG4gICAgKi9cbiAgICB0eXBlcykge1xuICAgICAgICB0aGlzLnR5cGVzID0gdHlwZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAodHlwZXNbaV0uaWQgIT0gaSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vZGUgdHlwZSBpZHMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gYXJyYXkgcG9zaXRpb25zIHdoZW4gY3JlYXRpbmcgYSBub2RlIHNldFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgY29weSBvZiB0aGlzIHNldCB3aXRoIHNvbWUgbm9kZSBwcm9wZXJ0aWVzIGFkZGVkLiBUaGVcbiAgICBhcmd1bWVudHMgdG8gdGhpcyBtZXRob2QgY2FuIGJlIGNyZWF0ZWQgd2l0aFxuICAgIFtgTm9kZVByb3AuYWRkYF0oI2NvbW1vbi5Ob2RlUHJvcC5hZGQpLlxuICAgICovXG4gICAgZXh0ZW5kKC4uLnByb3BzKSB7XG4gICAgICAgIGxldCBuZXdUeXBlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB0eXBlIG9mIHRoaXMudHlwZXMpIHtcbiAgICAgICAgICAgIGxldCBuZXdQcm9wcyA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGxldCBzb3VyY2Ugb2YgcHJvcHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWRkID0gc291cmNlKHR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgdHlwZS5wcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzW2FkZFswXS5pZF0gPSBhZGRbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3VHlwZXMucHVzaChuZXdQcm9wcyA/IG5ldyBOb2RlVHlwZSh0eXBlLm5hbWUsIG5ld1Byb3BzLCB0eXBlLmlkLCB0eXBlLmZsYWdzKSA6IHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTm9kZVNldChuZXdUeXBlcyk7XG4gICAgfVxufVxuY29uc3QgQ2FjaGVkTm9kZSA9IG5ldyBXZWFrTWFwKCksIENhY2hlZElubmVyTm9kZSA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbk9wdGlvbnMgdGhhdCBjb250cm9sIGl0ZXJhdGlvbi4gQ2FuIGJlIGNvbWJpbmVkIHdpdGggdGhlIGB8YFxub3BlcmF0b3IgdG8gZW5hYmxlIG11bHRpcGxlIG9uZXMuXG4qL1xudmFyIEl0ZXJNb2RlO1xuKGZ1bmN0aW9uIChJdGVyTW9kZSkge1xuICAgIC8qKlxuICAgIFdoZW4gZW5hYmxlZCwgaXRlcmF0aW9uIHdpbGwgb25seSB2aXNpdCBbYFRyZWVgXSgjY29tbW9uLlRyZWUpXG4gICAgb2JqZWN0cywgbm90IG5vZGVzIHBhY2tlZCBpbnRvXG4gICAgW2BUcmVlQnVmZmVyYF0oI2NvbW1vbi5UcmVlQnVmZmVyKXMuXG4gICAgKi9cbiAgICBJdGVyTW9kZVtJdGVyTW9kZVtcIkV4Y2x1ZGVCdWZmZXJzXCJdID0gMV0gPSBcIkV4Y2x1ZGVCdWZmZXJzXCI7XG4gICAgLyoqXG4gICAgRW5hYmxlIHRoaXMgdG8gbWFrZSBpdGVyYXRpb24gaW5jbHVkZSBhbm9ueW1vdXMgbm9kZXMgKHN1Y2ggYXNcbiAgICB0aGUgbm9kZXMgdGhhdCB3cmFwIHJlcGVhdGVkIGdyYW1tYXIgY29uc3RydWN0cyBpbnRvIGEgYmFsYW5jZWRcbiAgICB0cmVlKS5cbiAgICAqL1xuICAgIEl0ZXJNb2RlW0l0ZXJNb2RlW1wiSW5jbHVkZUFub255bW91c1wiXSA9IDJdID0gXCJJbmNsdWRlQW5vbnltb3VzXCI7XG4gICAgLyoqXG4gICAgQnkgZGVmYXVsdCwgcmVndWxhciBbbW91bnRlZF0oI2NvbW1vbi5Ob2RlUHJvcF5tb3VudGVkKSBub2Rlc1xuICAgIHJlcGxhY2UgdGhlaXIgYmFzZSBub2RlIGluIGl0ZXJhdGlvbi4gRW5hYmxlIHRoaXMgdG8gaWdub3JlIHRoZW1cbiAgICBpbnN0ZWFkLlxuICAgICovXG4gICAgSXRlck1vZGVbSXRlck1vZGVbXCJJZ25vcmVNb3VudHNcIl0gPSA0XSA9IFwiSWdub3JlTW91bnRzXCI7XG4gICAgLyoqXG4gICAgVGhpcyBvcHRpb24gb25seSBhcHBsaWVzIGluXG4gICAgW2BlbnRlcmBdKCNjb21tb24uU3ludGF4Tm9kZS5lbnRlciktc3R5bGUgbWV0aG9kcy4gSXQgdGVsbHMgdGhlXG4gICAgbGlicmFyeSB0byBub3QgZW50ZXIgbW91bnRlZCBvdmVybGF5cyBpZiBvbmUgY292ZXJzIHRoZSBnaXZlblxuICAgIHBvc2l0aW9uLlxuICAgICovXG4gICAgSXRlck1vZGVbSXRlck1vZGVbXCJJZ25vcmVPdmVybGF5c1wiXSA9IDhdID0gXCJJZ25vcmVPdmVybGF5c1wiO1xufSkoSXRlck1vZGUgfHwgKEl0ZXJNb2RlID0ge30pKTtcbi8qKlxuQSBwaWVjZSBvZiBzeW50YXggdHJlZS4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIGFwcHJvYWNoIHRoZXNlXG50cmVlczogdGhlIHdheSB0aGV5IGFyZSBhY3R1YWxseSBzdG9yZWQgaW4gbWVtb3J5LCBhbmQgdGhlXG5jb252ZW5pZW50IHdheS5cblxuU3ludGF4IHRyZWVzIGFyZSBzdG9yZWQgYXMgYSB0cmVlIG9mIGBUcmVlYCBhbmQgYFRyZWVCdWZmZXJgXG5vYmplY3RzLiBCeSBwYWNraW5nIGRldGFpbCBpbmZvcm1hdGlvbiBpbnRvIGBUcmVlQnVmZmVyYCBsZWFmXG5ub2RlcywgdGhlIHJlcHJlc2VudGF0aW9uIGlzIG1hZGUgYSBsb3QgbW9yZSBtZW1vcnktZWZmaWNpZW50LlxuXG5Ib3dldmVyLCB3aGVuIHlvdSB3YW50IHRvIGFjdHVhbGx5IHdvcmsgd2l0aCB0cmVlIG5vZGVzLCB0aGlzXG5yZXByZXNlbnRhdGlvbiBpcyB2ZXJ5IGF3a3dhcmQsIHNvIG1vc3QgY2xpZW50IGNvZGUgd2lsbCB3YW50IHRvXG51c2UgdGhlIFtgVHJlZUN1cnNvcmBdKCNjb21tb24uVHJlZUN1cnNvcikgb3JcbltgU3ludGF4Tm9kZWBdKCNjb21tb24uU3ludGF4Tm9kZSkgaW50ZXJmYWNlIGluc3RlYWQsIHdoaWNoIHByb3ZpZGVzXG5hIHZpZXcgb24gc29tZSBwYXJ0IG9mIHRoaXMgZGF0YSBzdHJ1Y3R1cmUsIGFuZCBjYW4gYmUgdXNlZCB0b1xubW92ZSBhcm91bmQgdG8gYWRqYWNlbnQgbm9kZXMuXG4qL1xuY2xhc3MgVHJlZSB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgbmV3IHRyZWUuIFNlZSBhbHNvIFtgVHJlZS5idWlsZGBdKCNjb21tb24uVHJlZV5idWlsZCkuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgdHlwZSBvZiB0aGUgdG9wIG5vZGUuXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBUaGlzIG5vZGUncyBjaGlsZCBub2Rlcy5cbiAgICAqL1xuICAgIGNoaWxkcmVuLCBcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb25zIChvZmZzZXRzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGlzIHRyZWUpIG9mXG4gICAgdGhlIGNoaWxkcmVuLlxuICAgICovXG4gICAgcG9zaXRpb25zLCBcbiAgICAvKipcbiAgICBUaGUgdG90YWwgbGVuZ3RoIG9mIHRoaXMgdHJlZVxuICAgICovXG4gICAgbGVuZ3RoLCBcbiAgICAvKipcbiAgICBQZXItbm9kZSBbbm9kZSBwcm9wc10oI2NvbW1vbi5Ob2RlUHJvcCkgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBub2RlLlxuICAgICovXG4gICAgcHJvcHMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IHBvc2l0aW9ucztcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcm9wcyA9IG51bGw7XG4gICAgICAgIGlmIChwcm9wcyAmJiBwcm9wcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgZm9yIChsZXQgW3Byb3AsIHZhbHVlXSBvZiBwcm9wcylcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzW3R5cGVvZiBwcm9wID09IFwibnVtYmVyXCIgPyBwcm9wIDogcHJvcC5pZF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgbW91bnRlZCA9IE1vdW50ZWRUcmVlLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKG1vdW50ZWQgJiYgIW1vdW50ZWQub3ZlcmxheSlcbiAgICAgICAgICAgIHJldHVybiBtb3VudGVkLnRyZWUudG9TdHJpbmcoKTtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgY2ggb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgbGV0IHN0ciA9IGNoLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuKVxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiArPSBcIixcIjtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiArPSBzdHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF0aGlzLnR5cGUubmFtZSA/IGNoaWxkcmVuIDpcbiAgICAgICAgICAgICgvXFxXLy50ZXN0KHRoaXMudHlwZS5uYW1lKSAmJiAhdGhpcy50eXBlLmlzRXJyb3IgPyBKU09OLnN0cmluZ2lmeSh0aGlzLnR5cGUubmFtZSkgOiB0aGlzLnR5cGUubmFtZSkgK1xuICAgICAgICAgICAgICAgIChjaGlsZHJlbi5sZW5ndGggPyBcIihcIiArIGNoaWxkcmVuICsgXCIpXCIgOiBcIlwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgW3RyZWUgY3Vyc29yXSgjY29tbW9uLlRyZWVDdXJzb3IpIHBvc2l0aW9uZWQgYXQgdGhlIHRvcCBvZlxuICAgIHRoZSB0cmVlLiBNb2RlIGNhbiBiZSB1c2VkIHRvIFtjb250cm9sXSgjY29tbW9uLkl0ZXJNb2RlKSB3aGljaFxuICAgIG5vZGVzIHRoZSBjdXJzb3IgdmlzaXRzLlxuICAgICovXG4gICAgY3Vyc29yKG1vZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJlZUN1cnNvcih0aGlzLnRvcE5vZGUsIG1vZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbdHJlZSBjdXJzb3JdKCNjb21tb24uVHJlZUN1cnNvcikgcG9pbnRpbmcgaW50byB0aGlzIHRyZWVcbiAgICBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHNpZGUgKHNlZVxuICAgIFtgbW92ZVRvYF0oI2NvbW1vbi5UcmVlQ3Vyc29yLm1vdmVUbykuXG4gICAgKi9cbiAgICBjdXJzb3JBdChwb3MsIHNpZGUgPSAwLCBtb2RlID0gMCkge1xuICAgICAgICBsZXQgc2NvcGUgPSBDYWNoZWROb2RlLmdldCh0aGlzKSB8fCB0aGlzLnRvcE5vZGU7XG4gICAgICAgIGxldCBjdXJzb3IgPSBuZXcgVHJlZUN1cnNvcihzY29wZSk7XG4gICAgICAgIGN1cnNvci5tb3ZlVG8ocG9zLCBzaWRlKTtcbiAgICAgICAgQ2FjaGVkTm9kZS5zZXQodGhpcywgY3Vyc29yLl90cmVlKTtcbiAgICAgICAgcmV0dXJuIGN1cnNvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgW3N5bnRheCBub2RlXSgjY29tbW9uLlN5bnRheE5vZGUpIG9iamVjdCBmb3IgdGhlIHRvcCBvZiB0aGVcbiAgICB0cmVlLlxuICAgICovXG4gICAgZ2V0IHRvcE5vZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJlZU5vZGUodGhpcywgMCwgMCwgbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgW3N5bnRheCBub2RlXSgjY29tbW9uLlN5bnRheE5vZGUpIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICBJZiBgc2lkZWAgaXMgLTEsIHRoaXMgd2lsbCBtb3ZlIGludG8gbm9kZXMgdGhhdCBlbmQgYXQgdGhlXG4gICAgcG9zaXRpb24uIElmIDEsIGl0J2xsIG1vdmUgaW50byBub2RlcyB0aGF0IHN0YXJ0IGF0IHRoZVxuICAgIHBvc2l0aW9uLiBXaXRoIDAsIGl0J2xsIG9ubHkgZW50ZXIgbm9kZXMgdGhhdCBjb3ZlciB0aGUgcG9zaXRpb25cbiAgICBmcm9tIGJvdGggc2lkZXMuXG4gICAgXG4gICAgTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgZW50ZXJcbiAgICBbb3ZlcmxheXNdKCNjb21tb24uTW91bnRlZFRyZWUub3ZlcmxheSksIGFuZCB5b3Ugb2Z0ZW4gd2FudFxuICAgIFtgcmVzb2x2ZUlubmVyYF0oI2NvbW1vbi5UcmVlLnJlc29sdmVJbm5lcikgaW5zdGVhZC5cbiAgICAqL1xuICAgIHJlc29sdmUocG9zLCBzaWRlID0gMCkge1xuICAgICAgICBsZXQgbm9kZSA9IHJlc29sdmVOb2RlKENhY2hlZE5vZGUuZ2V0KHRoaXMpIHx8IHRoaXMudG9wTm9kZSwgcG9zLCBzaWRlLCBmYWxzZSk7XG4gICAgICAgIENhY2hlZE5vZGUuc2V0KHRoaXMsIG5vZGUpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTGlrZSBbYHJlc29sdmVgXSgjY29tbW9uLlRyZWUucmVzb2x2ZSksIGJ1dCB3aWxsIGVudGVyXG4gICAgW292ZXJsYWlkXSgjY29tbW9uLk1vdW50ZWRUcmVlLm92ZXJsYXkpIG5vZGVzLCBwcm9kdWNpbmcgYSBzeW50YXggbm9kZVxuICAgIHBvaW50aW5nIGludG8gdGhlIGlubmVybW9zdCBvdmVybGFpZCB0cmVlIGF0IHRoZSBnaXZlbiBwb3NpdGlvblxuICAgICh3aXRoIHBhcmVudCBsaW5rcyBnb2luZyB0aHJvdWdoIGFsbCBwYXJlbnQgc3RydWN0dXJlLCBpbmNsdWRpbmdcbiAgICB0aGUgaG9zdCB0cmVlcykuXG4gICAgKi9cbiAgICByZXNvbHZlSW5uZXIocG9zLCBzaWRlID0gMCkge1xuICAgICAgICBsZXQgbm9kZSA9IHJlc29sdmVOb2RlKENhY2hlZElubmVyTm9kZS5nZXQodGhpcykgfHwgdGhpcy50b3BOb2RlLCBwb3MsIHNpZGUsIHRydWUpO1xuICAgICAgICBDYWNoZWRJbm5lck5vZGUuc2V0KHRoaXMsIG5vZGUpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgSW4gc29tZSBzaXR1YXRpb25zLCBpdCBjYW4gYmUgdXNlZnVsIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGxcbiAgICBub2RlcyBhcm91bmQgYSBwb3NpdGlvbiwgaW5jbHVkaW5nIHRob3NlIGluIG92ZXJsYXlzIHRoYXQgZG9uJ3RcbiAgICBkaXJlY3RseSBjb3ZlciB0aGUgcG9zaXRpb24uIFRoaXMgbWV0aG9kIGdpdmVzIHlvdSBhbiBpdGVyYXRvclxuICAgIHRoYXQgd2lsbCBwcm9kdWNlIGFsbCBub2RlcywgZnJvbSBzbWFsbCB0byBiaWcsIGFyb3VuZCB0aGUgZ2l2ZW5cbiAgICBwb3NpdGlvbi5cbiAgICAqL1xuICAgIHJlc29sdmVTdGFjayhwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiBzdGFja0l0ZXJhdG9yKHRoaXMsIHBvcywgc2lkZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBhbmQgaXRzIGNoaWxkcmVuLCBjYWxsaW5nIGBlbnRlcmAgZm9yIGFueVxuICAgIG5vZGUgdGhhdCB0b3VjaGVzIHRoZSBgZnJvbWAvYHRvYCByZWdpb24gKGlmIGdpdmVuKSBiZWZvcmVcbiAgICBydW5uaW5nIG92ZXIgc3VjaCBhIG5vZGUncyBjaGlsZHJlbiwgYW5kIGBsZWF2ZWAgKGlmIGdpdmVuKSB3aGVuXG4gICAgbGVhdmluZyB0aGUgbm9kZS4gV2hlbiBgZW50ZXJgIHJldHVybnMgYGZhbHNlYCwgdGhhdCBub2RlIHdpbGxcbiAgICBub3QgaGF2ZSBpdHMgY2hpbGRyZW4gaXRlcmF0ZWQgb3ZlciAob3IgYGxlYXZlYCBjYWxsZWQpLlxuICAgICovXG4gICAgaXRlcmF0ZShzcGVjKSB7XG4gICAgICAgIGxldCB7IGVudGVyLCBsZWF2ZSwgZnJvbSA9IDAsIHRvID0gdGhpcy5sZW5ndGggfSA9IHNwZWM7XG4gICAgICAgIGxldCBtb2RlID0gc3BlYy5tb2RlIHx8IDAsIGFub24gPSAobW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpID4gMDtcbiAgICAgICAgZm9yIChsZXQgYyA9IHRoaXMuY3Vyc29yKG1vZGUgfCBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKTs7KSB7XG4gICAgICAgICAgICBsZXQgZW50ZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGMuZnJvbSA8PSB0byAmJiBjLnRvID49IGZyb20gJiYgKCFhbm9uICYmIGMudHlwZS5pc0Fub255bW91cyB8fCBlbnRlcihjKSAhPT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMuZmlyc3RDaGlsZCgpKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBlbnRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBpZiAoZW50ZXJlZCAmJiBsZWF2ZSAmJiAoYW5vbiB8fCAhYy50eXBlLmlzQW5vbnltb3VzKSlcbiAgICAgICAgICAgICAgICAgICAgbGVhdmUoYyk7XG4gICAgICAgICAgICAgICAgaWYgKGMubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKCFjLnBhcmVudCgpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgZW50ZXJlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gW25vZGUgcHJvcF0oI2NvbW1vbi5Ob2RlUHJvcCkgZm9yIHRoaXNcbiAgICBub2RlLiBXb3JrcyB3aXRoIGJvdGggcGVyLW5vZGUgYW5kIHBlci10eXBlIHByb3BzLlxuICAgICovXG4gICAgcHJvcChwcm9wKSB7XG4gICAgICAgIHJldHVybiAhcHJvcC5wZXJOb2RlID8gdGhpcy50eXBlLnByb3AocHJvcCkgOiB0aGlzLnByb3BzID8gdGhpcy5wcm9wc1twcm9wLmlkXSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGUgbm9kZSdzIFtwZXItbm9kZSBwcm9wc10oI2NvbW1vbi5Ob2RlUHJvcC5wZXJOb2RlKSBpbiBhXG4gICAgZm9ybWF0IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgW2BUcmVlYF0oI2NvbW1vbi5UcmVlKVxuICAgIGNvbnN0cnVjdG9yLlxuICAgICovXG4gICAgZ2V0IHByb3BWYWx1ZXMoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMpXG4gICAgICAgICAgICBmb3IgKGxldCBpZCBpbiB0aGlzLnByb3BzKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFsraWQsIHRoaXMucHJvcHNbaWRdXSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEJhbGFuY2UgdGhlIGRpcmVjdCBjaGlsZHJlbiBvZiB0aGlzIHRyZWUsIHByb2R1Y2luZyBhIGNvcHkgb2ZcbiAgICB3aGljaCBtYXkgaGF2ZSBjaGlsZHJlbiBncm91cGVkIGludG8gc3VidHJlZXMgd2l0aCB0eXBlXG4gICAgW2BOb2RlVHlwZS5ub25lYF0oI2NvbW1vbi5Ob2RlVHlwZV5ub25lKS5cbiAgICAqL1xuICAgIGJhbGFuY2UoY29uZmlnID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoIDw9IDggLyogQmFsYW5jZS5CcmFuY2hGYWN0b3IgKi8gPyB0aGlzIDpcbiAgICAgICAgICAgIGJhbGFuY2VSYW5nZShOb2RlVHlwZS5ub25lLCB0aGlzLmNoaWxkcmVuLCB0aGlzLnBvc2l0aW9ucywgMCwgdGhpcy5jaGlsZHJlbi5sZW5ndGgsIDAsIHRoaXMubGVuZ3RoLCAoY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoKSA9PiBuZXcgVHJlZSh0aGlzLnR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCwgdGhpcy5wcm9wVmFsdWVzKSwgY29uZmlnLm1ha2VUcmVlIHx8ICgoY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoKSA9PiBuZXcgVHJlZShOb2RlVHlwZS5ub25lLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEJ1aWxkIGEgdHJlZSBmcm9tIGEgcG9zdGZpeC1vcmRlcmVkIGJ1ZmZlciBvZiBub2RlIGluZm9ybWF0aW9uLFxuICAgIG9yIGEgY3Vyc29yIG92ZXIgc3VjaCBhIGJ1ZmZlci5cbiAgICAqL1xuICAgIHN0YXRpYyBidWlsZChkYXRhKSB7IHJldHVybiBidWlsZFRyZWUoZGF0YSk7IH1cbn1cbi8qKlxuVGhlIGVtcHR5IHRyZWVcbiovXG5UcmVlLmVtcHR5ID0gbmV3IFRyZWUoTm9kZVR5cGUubm9uZSwgW10sIFtdLCAwKTtcbmNsYXNzIEZsYXRCdWZmZXJDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlciwgaW5kZXgpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICB9XG4gICAgZ2V0IGlkKCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDRdOyB9XG4gICAgZ2V0IHN0YXJ0KCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDNdOyB9XG4gICAgZ2V0IGVuZCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSAyXTsgfVxuICAgIGdldCBzaXplKCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDFdOyB9XG4gICAgZ2V0IHBvcygpIHsgcmV0dXJuIHRoaXMuaW5kZXg7IH1cbiAgICBuZXh0KCkgeyB0aGlzLmluZGV4IC09IDQ7IH1cbiAgICBmb3JrKCkgeyByZXR1cm4gbmV3IEZsYXRCdWZmZXJDdXJzb3IodGhpcy5idWZmZXIsIHRoaXMuaW5kZXgpOyB9XG59XG4vKipcblRyZWUgYnVmZmVycyBjb250YWluICh0eXBlLCBzdGFydCwgZW5kLCBlbmRJbmRleCkgcXVhZHMgZm9yIGVhY2hcbm5vZGUuIEluIHN1Y2ggYSBidWZmZXIsIG5vZGVzIGFyZSBzdG9yZWQgaW4gcHJlZml4IG9yZGVyIChwYXJlbnRzXG5iZWZvcmUgY2hpbGRyZW4sIHdpdGggdGhlIGVuZEluZGV4IG9mIHRoZSBwYXJlbnQgaW5kaWNhdGluZyB3aGljaFxuY2hpbGRyZW4gYmVsb25nIHRvIGl0KS5cbiovXG5jbGFzcyBUcmVlQnVmZmVyIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSB0cmVlIGJ1ZmZlci5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBidWZmZXIncyBjb250ZW50LlxuICAgICovXG4gICAgYnVmZmVyLCBcbiAgICAvKipcbiAgICBUaGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBncm91cCBvZiBub2RlcyBpbiB0aGUgYnVmZmVyLlxuICAgICovXG4gICAgbGVuZ3RoLCBcbiAgICAvKipcbiAgICBUaGUgbm9kZSBzZXQgdXNlZCBpbiB0aGlzIGJ1ZmZlci5cbiAgICAqL1xuICAgIHNldCkge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuc2V0ID0gc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCB0eXBlKCkgeyByZXR1cm4gTm9kZVR5cGUubm9uZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuYnVmZmVyLmxlbmd0aDspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY2hpbGRTdHJpbmcoaW5kZXgpKTtcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5idWZmZXJbaW5kZXggKyAzXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCIsXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNoaWxkU3RyaW5nKGluZGV4KSB7XG4gICAgICAgIGxldCBpZCA9IHRoaXMuYnVmZmVyW2luZGV4XSwgZW5kSW5kZXggPSB0aGlzLmJ1ZmZlcltpbmRleCArIDNdO1xuICAgICAgICBsZXQgdHlwZSA9IHRoaXMuc2V0LnR5cGVzW2lkXSwgcmVzdWx0ID0gdHlwZS5uYW1lO1xuICAgICAgICBpZiAoL1xcVy8udGVzdChyZXN1bHQpICYmICF0eXBlLmlzRXJyb3IpXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnN0cmluZ2lmeShyZXN1bHQpO1xuICAgICAgICBpbmRleCArPSA0O1xuICAgICAgICBpZiAoZW5kSW5kZXggPT0gaW5kZXgpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5jaGlsZFN0cmluZyhpbmRleCkpO1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmJ1ZmZlcltpbmRleCArIDNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQgKyBcIihcIiArIGNoaWxkcmVuLmpvaW4oXCIsXCIpICsgXCIpXCI7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZmluZENoaWxkKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBkaXIsIHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMsIHBpY2sgPSAtMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgIT0gZW5kSW5kZXg7IGkgPSBidWZmZXJbaSArIDNdKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tTaWRlKHNpZGUsIHBvcywgYnVmZmVyW2kgKyAxXSwgYnVmZmVyW2kgKyAyXSkpIHtcbiAgICAgICAgICAgICAgICBwaWNrID0gaTtcbiAgICAgICAgICAgICAgICBpZiAoZGlyID4gMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBpY2s7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2xpY2Uoc3RhcnRJLCBlbmRJLCBmcm9tKSB7XG4gICAgICAgIGxldCBiID0gdGhpcy5idWZmZXI7XG4gICAgICAgIGxldCBjb3B5ID0gbmV3IFVpbnQxNkFycmF5KGVuZEkgLSBzdGFydEkpLCBsZW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJLCBqID0gMDsgaSA8IGVuZEk7KSB7XG4gICAgICAgICAgICBjb3B5W2orK10gPSBiW2krK107XG4gICAgICAgICAgICBjb3B5W2orK10gPSBiW2krK10gLSBmcm9tO1xuICAgICAgICAgICAgbGV0IHRvID0gY29weVtqKytdID0gYltpKytdIC0gZnJvbTtcbiAgICAgICAgICAgIGNvcHlbaisrXSA9IGJbaSsrXSAtIHN0YXJ0STtcbiAgICAgICAgICAgIGxlbiA9IE1hdGgubWF4KGxlbiwgdG8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVHJlZUJ1ZmZlcihjb3B5LCBsZW4sIHRoaXMuc2V0KTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja1NpZGUoc2lkZSwgcG9zLCBmcm9tLCB0bykge1xuICAgIHN3aXRjaCAoc2lkZSkge1xuICAgICAgICBjYXNlIC0yIC8qIFNpZGUuQmVmb3JlICovOiByZXR1cm4gZnJvbSA8IHBvcztcbiAgICAgICAgY2FzZSAtMSAvKiBTaWRlLkF0T3JCZWZvcmUgKi86IHJldHVybiB0byA+PSBwb3MgJiYgZnJvbSA8IHBvcztcbiAgICAgICAgY2FzZSAwIC8qIFNpZGUuQXJvdW5kICovOiByZXR1cm4gZnJvbSA8IHBvcyAmJiB0byA+IHBvcztcbiAgICAgICAgY2FzZSAxIC8qIFNpZGUuQXRPckFmdGVyICovOiByZXR1cm4gZnJvbSA8PSBwb3MgJiYgdG8gPiBwb3M7XG4gICAgICAgIGNhc2UgMiAvKiBTaWRlLkFmdGVyICovOiByZXR1cm4gdG8gPiBwb3M7XG4gICAgICAgIGNhc2UgNCAvKiBTaWRlLkRvbnRDYXJlICovOiByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiByZXNvbHZlTm9kZShub2RlLCBwb3MsIHNpZGUsIG92ZXJsYXlzKSB7XG4gICAgdmFyIF9hO1xuICAgIC8vIE1vdmUgdXAgdG8gYSBub2RlIHRoYXQgYWN0dWFsbHkgaG9sZHMgdGhlIHBvc2l0aW9uLCBpZiBwb3NzaWJsZVxuICAgIHdoaWxlIChub2RlLmZyb20gPT0gbm9kZS50byB8fFxuICAgICAgICAoc2lkZSA8IDEgPyBub2RlLmZyb20gPj0gcG9zIDogbm9kZS5mcm9tID4gcG9zKSB8fFxuICAgICAgICAoc2lkZSA+IC0xID8gbm9kZS50byA8PSBwb3MgOiBub2RlLnRvIDwgcG9zKSkge1xuICAgICAgICBsZXQgcGFyZW50ID0gIW92ZXJsYXlzICYmIG5vZGUgaW5zdGFuY2VvZiBUcmVlTm9kZSAmJiBub2RlLmluZGV4IDwgMCA/IG51bGwgOiBub2RlLnBhcmVudDtcbiAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICB9XG4gICAgbGV0IG1vZGUgPSBvdmVybGF5cyA/IDAgOiBJdGVyTW9kZS5JZ25vcmVPdmVybGF5cztcbiAgICAvLyBNdXN0IGdvIHVwIG91dCBvZiBvdmVybGF5cyB3aGVuIHRob3NlIGRvIG5vdCBvdmVybGFwIHdpdGggcG9zXG4gICAgaWYgKG92ZXJsYXlzKVxuICAgICAgICBmb3IgKGxldCBzY2FuID0gbm9kZSwgcGFyZW50ID0gc2Nhbi5wYXJlbnQ7IHBhcmVudDsgc2NhbiA9IHBhcmVudCwgcGFyZW50ID0gc2Nhbi5wYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChzY2FuIGluc3RhbmNlb2YgVHJlZU5vZGUgJiYgc2Nhbi5pbmRleCA8IDAgJiYgKChfYSA9IHBhcmVudC5lbnRlcihwb3MsIHNpZGUsIG1vZGUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZnJvbSkgIT0gc2Nhbi5mcm9tKVxuICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGxldCBpbm5lciA9IG5vZGUuZW50ZXIocG9zLCBzaWRlLCBtb2RlKTtcbiAgICAgICAgaWYgKCFpbm5lcilcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICBub2RlID0gaW5uZXI7XG4gICAgfVxufVxuY2xhc3MgQmFzZU5vZGUge1xuICAgIGN1cnNvcihtb2RlID0gMCkgeyByZXR1cm4gbmV3IFRyZWVDdXJzb3IodGhpcywgbW9kZSk7IH1cbiAgICBnZXRDaGlsZCh0eXBlLCBiZWZvcmUgPSBudWxsLCBhZnRlciA9IG51bGwpIHtcbiAgICAgICAgbGV0IHIgPSBnZXRDaGlsZHJlbih0aGlzLCB0eXBlLCBiZWZvcmUsIGFmdGVyKTtcbiAgICAgICAgcmV0dXJuIHIubGVuZ3RoID8gclswXSA6IG51bGw7XG4gICAgfVxuICAgIGdldENoaWxkcmVuKHR5cGUsIGJlZm9yZSA9IG51bGwsIGFmdGVyID0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4odGhpcywgdHlwZSwgYmVmb3JlLCBhZnRlcik7XG4gICAgfVxuICAgIHJlc29sdmUocG9zLCBzaWRlID0gMCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZU5vZGUodGhpcywgcG9zLCBzaWRlLCBmYWxzZSk7XG4gICAgfVxuICAgIHJlc29sdmVJbm5lcihwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlTm9kZSh0aGlzLCBwb3MsIHNpZGUsIHRydWUpO1xuICAgIH1cbiAgICBtYXRjaENvbnRleHQoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hOb2RlQ29udGV4dCh0aGlzLnBhcmVudCwgY29udGV4dCk7XG4gICAgfVxuICAgIGVudGVyVW5maW5pc2hlZE5vZGVzQmVmb3JlKHBvcykge1xuICAgICAgICBsZXQgc2NhbiA9IHRoaXMuY2hpbGRCZWZvcmUocG9zKSwgbm9kZSA9IHRoaXM7XG4gICAgICAgIHdoaWxlIChzY2FuKSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IHNjYW4ubGFzdENoaWxkO1xuICAgICAgICAgICAgaWYgKCFsYXN0IHx8IGxhc3QudG8gIT0gc2Nhbi50bylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChsYXN0LnR5cGUuaXNFcnJvciAmJiBsYXN0LmZyb20gPT0gbGFzdC50bykge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBzY2FuO1xuICAgICAgICAgICAgICAgIHNjYW4gPSBsYXN0LnByZXZTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2NhbiA9IGxhc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGdldCBub2RlKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIGdldCBuZXh0KCkgeyByZXR1cm4gdGhpcy5wYXJlbnQ7IH1cbn1cbmNsYXNzIFRyZWVOb2RlIGV4dGVuZHMgQmFzZU5vZGUge1xuICAgIGNvbnN0cnVjdG9yKF90cmVlLCBmcm9tLCBcbiAgICAvLyBJbmRleCBpbiBwYXJlbnQgbm9kZSwgc2V0IHRvIC0xIGlmIHRoZSBub2RlIGlzIG5vdCBhIGRpcmVjdCBjaGlsZCBvZiBfcGFyZW50Lm5vZGUgKG92ZXJsYXkpXG4gICAgaW5kZXgsIF9wYXJlbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fdHJlZSA9IF90cmVlO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuX3BhcmVudCA9IF9wYXJlbnQ7XG4gICAgfVxuICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHJlZS50eXBlOyB9XG4gICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl90cmVlLnR5cGUubmFtZTsgfVxuICAgIGdldCB0bygpIHsgcmV0dXJuIHRoaXMuZnJvbSArIHRoaXMuX3RyZWUubGVuZ3RoOyB9XG4gICAgbmV4dENoaWxkKGksIGRpciwgcG9zLCBzaWRlLCBtb2RlID0gMCkge1xuICAgICAgICBmb3IgKGxldCBwYXJlbnQgPSB0aGlzOzspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHsgY2hpbGRyZW4sIHBvc2l0aW9ucyB9ID0gcGFyZW50Ll90cmVlLCBlID0gZGlyID4gMCA/IGNoaWxkcmVuLmxlbmd0aCA6IC0xOyBpICE9IGU7IGkgKz0gZGlyKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBjaGlsZHJlbltpXSwgc3RhcnQgPSBwb3NpdGlvbnNbaV0gKyBwYXJlbnQuZnJvbTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoZWNrU2lkZShzaWRlLCBwb3MsIHN0YXJ0LCBzdGFydCArIG5leHQubGVuZ3RoKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBUcmVlQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlICYgSXRlck1vZGUuRXhjbHVkZUJ1ZmZlcnMpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gbmV4dC5maW5kQ2hpbGQoMCwgbmV4dC5idWZmZXIubGVuZ3RoLCBkaXIsIHBvcyAtIHN0YXJ0LCBzaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlck5vZGUobmV3IEJ1ZmZlckNvbnRleHQocGFyZW50LCBuZXh0LCBpLCBzdGFydCksIG51bGwsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoKG1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSB8fCAoIW5leHQudHlwZS5pc0Fub255bW91cyB8fCBoYXNDaGlsZChuZXh0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vdW50ZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKG1vZGUgJiBJdGVyTW9kZS5JZ25vcmVNb3VudHMpICYmIChtb3VudGVkID0gTW91bnRlZFRyZWUuZ2V0KG5leHQpKSAmJiAhbW91bnRlZC5vdmVybGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmVlTm9kZShtb3VudGVkLnRyZWUsIHN0YXJ0LCBpLCBwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5uZXIgPSBuZXcgVHJlZU5vZGUobmV4dCwgc3RhcnQsIGksIHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpIHx8ICFpbm5lci50eXBlLmlzQW5vbnltb3VzID8gaW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaW5uZXIubmV4dENoaWxkKGRpciA8IDAgPyBuZXh0LmNoaWxkcmVuLmxlbmd0aCAtIDEgOiAwLCBkaXIsIHBvcywgc2lkZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChtb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgfHwgIXBhcmVudC50eXBlLmlzQW5vbnltb3VzKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgaWYgKHBhcmVudC5pbmRleCA+PSAwKVxuICAgICAgICAgICAgICAgIGkgPSBwYXJlbnQuaW5kZXggKyBkaXI7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgaSA9IGRpciA8IDAgPyAtMSA6IHBhcmVudC5fcGFyZW50Ll90cmVlLmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5fcGFyZW50O1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGZpcnN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLm5leHRDaGlsZCgwLCAxLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgZ2V0IGxhc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMubmV4dENoaWxkKHRoaXMuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMSwgLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICBjaGlsZEFmdGVyKHBvcykgeyByZXR1cm4gdGhpcy5uZXh0Q2hpbGQoMCwgMSwgcG9zLCAyIC8qIFNpZGUuQWZ0ZXIgKi8pOyB9XG4gICAgY2hpbGRCZWZvcmUocG9zKSB7IHJldHVybiB0aGlzLm5leHRDaGlsZCh0aGlzLl90cmVlLmNoaWxkcmVuLmxlbmd0aCAtIDEsIC0xLCBwb3MsIC0yIC8qIFNpZGUuQmVmb3JlICovKTsgfVxuICAgIGVudGVyKHBvcywgc2lkZSwgbW9kZSA9IDApIHtcbiAgICAgICAgbGV0IG1vdW50ZWQ7XG4gICAgICAgIGlmICghKG1vZGUgJiBJdGVyTW9kZS5JZ25vcmVPdmVybGF5cykgJiYgKG1vdW50ZWQgPSBNb3VudGVkVHJlZS5nZXQodGhpcy5fdHJlZSkpICYmIG1vdW50ZWQub3ZlcmxheSkge1xuICAgICAgICAgICAgbGV0IHJQb3MgPSBwb3MgLSB0aGlzLmZyb207XG4gICAgICAgICAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2YgbW91bnRlZC5vdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgaWYgKChzaWRlID4gMCA/IGZyb20gPD0gclBvcyA6IGZyb20gPCByUG9zKSAmJlxuICAgICAgICAgICAgICAgICAgICAoc2lkZSA8IDAgPyB0byA+PSByUG9zIDogdG8gPiByUG9zKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmVlTm9kZShtb3VudGVkLnRyZWUsIG1vdW50ZWQub3ZlcmxheVswXS5mcm9tICsgdGhpcy5mcm9tLCAtMSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dENoaWxkKDAsIDEsIHBvcywgc2lkZSwgbW9kZSk7XG4gICAgfVxuICAgIG5leHRTaWduaWZpY2FudFBhcmVudCgpIHtcbiAgICAgICAgbGV0IHZhbCA9IHRoaXM7XG4gICAgICAgIHdoaWxlICh2YWwudHlwZS5pc0Fub255bW91cyAmJiB2YWwuX3BhcmVudClcbiAgICAgICAgICAgIHZhbCA9IHZhbC5fcGFyZW50O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICBnZXQgcGFyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50ID8gdGhpcy5fcGFyZW50Lm5leHRTaWduaWZpY2FudFBhcmVudCgpIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IG5leHRTaWJsaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50ICYmIHRoaXMuaW5kZXggPj0gMCA/IHRoaXMuX3BhcmVudC5uZXh0Q2hpbGQodGhpcy5pbmRleCArIDEsIDEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLykgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgcHJldlNpYmxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgJiYgdGhpcy5pbmRleCA+PSAwID8gdGhpcy5fcGFyZW50Lm5leHRDaGlsZCh0aGlzLmluZGV4IC0gMSwgLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLykgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgdHJlZSgpIHsgcmV0dXJuIHRoaXMuX3RyZWU7IH1cbiAgICB0b1RyZWUoKSB7IHJldHVybiB0aGlzLl90cmVlOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMuX3RyZWUudG9TdHJpbmcoKTsgfVxufVxuZnVuY3Rpb24gZ2V0Q2hpbGRyZW4obm9kZSwgdHlwZSwgYmVmb3JlLCBhZnRlcikge1xuICAgIGxldCBjdXIgPSBub2RlLmN1cnNvcigpLCByZXN1bHQgPSBbXTtcbiAgICBpZiAoIWN1ci5maXJzdENoaWxkKCkpXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgaWYgKGJlZm9yZSAhPSBudWxsKVxuICAgICAgICBmb3IgKGxldCBmb3VuZCA9IGZhbHNlOyAhZm91bmQ7KSB7XG4gICAgICAgICAgICBmb3VuZCA9IGN1ci50eXBlLmlzKGJlZm9yZSk7XG4gICAgICAgICAgICBpZiAoIWN1ci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChhZnRlciAhPSBudWxsICYmIGN1ci50eXBlLmlzKGFmdGVyKSlcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGlmIChjdXIudHlwZS5pcyh0eXBlKSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGN1ci5ub2RlKTtcbiAgICAgICAgaWYgKCFjdXIubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgIHJldHVybiBhZnRlciA9PSBudWxsID8gcmVzdWx0IDogW107XG4gICAgfVxufVxuZnVuY3Rpb24gbWF0Y2hOb2RlQ29udGV4dChub2RlLCBjb250ZXh0LCBpID0gY29udGV4dC5sZW5ndGggLSAxKSB7XG4gICAgZm9yIChsZXQgcCA9IG5vZGU7IGkgPj0gMDsgcCA9IHAucGFyZW50KSB7XG4gICAgICAgIGlmICghcClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFwLnR5cGUuaXNBbm9ueW1vdXMpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0W2ldICYmIGNvbnRleHRbaV0gIT0gcC5uYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNsYXNzIEJ1ZmZlckNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgYnVmZmVyLCBpbmRleCwgc3RhcnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICB9XG59XG5jbGFzcyBCdWZmZXJOb2RlIGV4dGVuZHMgQmFzZU5vZGUge1xuICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy50eXBlLm5hbWU7IH1cbiAgICBnZXQgZnJvbSgpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5zdGFydCArIHRoaXMuY29udGV4dC5idWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAxXTsgfVxuICAgIGdldCB0bygpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5zdGFydCArIHRoaXMuY29udGV4dC5idWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAyXTsgfVxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQsIF9wYXJlbnQsIGluZGV4KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuX3BhcmVudCA9IF9wYXJlbnQ7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy50eXBlID0gY29udGV4dC5idWZmZXIuc2V0LnR5cGVzW2NvbnRleHQuYnVmZmVyLmJ1ZmZlcltpbmRleF1dO1xuICAgIH1cbiAgICBjaGlsZChkaXIsIHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IGluZGV4ID0gYnVmZmVyLmZpbmRDaGlsZCh0aGlzLmluZGV4ICsgNCwgYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM10sIGRpciwgcG9zIC0gdGhpcy5jb250ZXh0LnN0YXJ0LCBzaWRlKTtcbiAgICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IG51bGwgOiBuZXcgQnVmZmVyTm9kZSh0aGlzLmNvbnRleHQsIHRoaXMsIGluZGV4KTtcbiAgICB9XG4gICAgZ2V0IGZpcnN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmNoaWxkKDEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jaGlsZCgtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIGNoaWxkQWZ0ZXIocG9zKSB7IHJldHVybiB0aGlzLmNoaWxkKDEsIHBvcywgMiAvKiBTaWRlLkFmdGVyICovKTsgfVxuICAgIGNoaWxkQmVmb3JlKHBvcykgeyByZXR1cm4gdGhpcy5jaGlsZCgtMSwgcG9zLCAtMiAvKiBTaWRlLkJlZm9yZSAqLyk7IH1cbiAgICBlbnRlcihwb3MsIHNpZGUsIG1vZGUgPSAwKSB7XG4gICAgICAgIGlmIChtb2RlICYgSXRlck1vZGUuRXhjbHVkZUJ1ZmZlcnMpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBpbmRleCA9IGJ1ZmZlci5maW5kQ2hpbGQodGhpcy5pbmRleCArIDQsIGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdLCBzaWRlID4gMCA/IDEgOiAtMSwgcG9zIC0gdGhpcy5jb250ZXh0LnN0YXJ0LCBzaWRlKTtcbiAgICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IG51bGwgOiBuZXcgQnVmZmVyTm9kZSh0aGlzLmNvbnRleHQsIHRoaXMsIGluZGV4KTtcbiAgICB9XG4gICAgZ2V0IHBhcmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCB8fCB0aGlzLmNvbnRleHQucGFyZW50Lm5leHRTaWduaWZpY2FudFBhcmVudCgpO1xuICAgIH1cbiAgICBleHRlcm5hbFNpYmxpbmcoZGlyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgPyBudWxsIDogdGhpcy5jb250ZXh0LnBhcmVudC5uZXh0Q2hpbGQodGhpcy5jb250ZXh0LmluZGV4ICsgZGlyLCBkaXIsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7XG4gICAgfVxuICAgIGdldCBuZXh0U2libGluZygpIHtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBhZnRlciA9IGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdO1xuICAgICAgICBpZiAoYWZ0ZXIgPCAodGhpcy5fcGFyZW50ID8gYnVmZmVyLmJ1ZmZlclt0aGlzLl9wYXJlbnQuaW5kZXggKyAzXSA6IGJ1ZmZlci5idWZmZXIubGVuZ3RoKSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyTm9kZSh0aGlzLmNvbnRleHQsIHRoaXMuX3BhcmVudCwgYWZ0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5leHRlcm5hbFNpYmxpbmcoMSk7XG4gICAgfVxuICAgIGdldCBwcmV2U2libGluZygpIHtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBwYXJlbnRTdGFydCA9IHRoaXMuX3BhcmVudCA/IHRoaXMuX3BhcmVudC5pbmRleCArIDQgOiAwO1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PSBwYXJlbnRTdGFydClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dGVybmFsU2libGluZygtMSk7XG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyTm9kZSh0aGlzLmNvbnRleHQsIHRoaXMuX3BhcmVudCwgYnVmZmVyLmZpbmRDaGlsZChwYXJlbnRTdGFydCwgdGhpcy5pbmRleCwgLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLykpO1xuICAgIH1cbiAgICBnZXQgdHJlZSgpIHsgcmV0dXJuIG51bGw7IH1cbiAgICB0b1RyZWUoKSB7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IFtdLCBwb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBzdGFydEkgPSB0aGlzLmluZGV4ICsgNCwgZW5kSSA9IGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdO1xuICAgICAgICBpZiAoZW5kSSA+IHN0YXJ0SSkge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAxXTtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goYnVmZmVyLnNsaWNlKHN0YXJ0SSwgZW5kSSwgZnJvbSkpO1xuICAgICAgICAgICAgcG9zaXRpb25zLnB1c2goMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlKHRoaXMudHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgdGhpcy50byAtIHRoaXMuZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiB0aGlzLmNvbnRleHQuYnVmZmVyLmNoaWxkU3RyaW5nKHRoaXMuaW5kZXgpOyB9XG59XG5mdW5jdGlvbiBpdGVyU3RhY2soaGVhZHMpIHtcbiAgICBpZiAoIWhlYWRzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHBpY2sgPSAwLCBwaWNrZWQgPSBoZWFkc1swXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGhlYWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBub2RlID0gaGVhZHNbaV07XG4gICAgICAgIGlmIChub2RlLmZyb20gPiBwaWNrZWQuZnJvbSB8fCBub2RlLnRvIDwgcGlja2VkLnRvKSB7XG4gICAgICAgICAgICBwaWNrZWQgPSBub2RlO1xuICAgICAgICAgICAgcGljayA9IGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IG5leHQgPSBwaWNrZWQgaW5zdGFuY2VvZiBUcmVlTm9kZSAmJiBwaWNrZWQuaW5kZXggPCAwID8gbnVsbCA6IHBpY2tlZC5wYXJlbnQ7XG4gICAgbGV0IG5ld0hlYWRzID0gaGVhZHMuc2xpY2UoKTtcbiAgICBpZiAobmV4dClcbiAgICAgICAgbmV3SGVhZHNbcGlja10gPSBuZXh0O1xuICAgIGVsc2VcbiAgICAgICAgbmV3SGVhZHMuc3BsaWNlKHBpY2ssIDEpO1xuICAgIHJldHVybiBuZXcgU3RhY2tJdGVyYXRvcihuZXdIZWFkcywgcGlja2VkKTtcbn1cbmNsYXNzIFN0YWNrSXRlcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGhlYWRzLCBub2RlKSB7XG4gICAgICAgIHRoaXMuaGVhZHMgPSBoZWFkcztcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgZ2V0IG5leHQoKSB7IHJldHVybiBpdGVyU3RhY2sodGhpcy5oZWFkcyk7IH1cbn1cbmZ1bmN0aW9uIHN0YWNrSXRlcmF0b3IodHJlZSwgcG9zLCBzaWRlKSB7XG4gICAgbGV0IGlubmVyID0gdHJlZS5yZXNvbHZlSW5uZXIocG9zLCBzaWRlKSwgbGF5ZXJzID0gbnVsbDtcbiAgICBmb3IgKGxldCBzY2FuID0gaW5uZXIgaW5zdGFuY2VvZiBUcmVlTm9kZSA/IGlubmVyIDogaW5uZXIuY29udGV4dC5wYXJlbnQ7IHNjYW47IHNjYW4gPSBzY2FuLnBhcmVudCkge1xuICAgICAgICBpZiAoc2Nhbi5pbmRleCA8IDApIHsgLy8gVGhpcyBpcyBhbiBvdmVybGF5IHJvb3RcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBzY2FuLnBhcmVudDtcbiAgICAgICAgICAgIChsYXllcnMgfHwgKGxheWVycyA9IFtpbm5lcl0pKS5wdXNoKHBhcmVudC5yZXNvbHZlKHBvcywgc2lkZSkpO1xuICAgICAgICAgICAgc2NhbiA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtb3VudCA9IE1vdW50ZWRUcmVlLmdldChzY2FuLnRyZWUpO1xuICAgICAgICAgICAgLy8gUmVsZXZhbnQgb3ZlcmxheSBicmFuY2hpbmcgb2ZmXG4gICAgICAgICAgICBpZiAobW91bnQgJiYgbW91bnQub3ZlcmxheSAmJiBtb3VudC5vdmVybGF5WzBdLmZyb20gPD0gcG9zICYmIG1vdW50Lm92ZXJsYXlbbW91bnQub3ZlcmxheS5sZW5ndGggLSAxXS50byA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9vdCA9IG5ldyBUcmVlTm9kZShtb3VudC50cmVlLCBtb3VudC5vdmVybGF5WzBdLmZyb20gKyBzY2FuLmZyb20sIC0xLCBzY2FuKTtcbiAgICAgICAgICAgICAgICAobGF5ZXJzIHx8IChsYXllcnMgPSBbaW5uZXJdKSkucHVzaChyZXNvbHZlTm9kZShyb290LCBwb3MsIHNpZGUsIGZhbHNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxheWVycyA/IGl0ZXJTdGFjayhsYXllcnMpIDogaW5uZXI7XG59XG4vKipcbkEgdHJlZSBjdXJzb3Igb2JqZWN0IGZvY3VzZXMgb24gYSBnaXZlbiBub2RlIGluIGEgc3ludGF4IHRyZWUsIGFuZFxuYWxsb3dzIHlvdSB0byBtb3ZlIHRvIGFkamFjZW50IG5vZGVzLlxuKi9cbmNsYXNzIFRyZWVDdXJzb3Ige1xuICAgIC8qKlxuICAgIFNob3J0aGFuZCBmb3IgYC50eXBlLm5hbWVgLlxuICAgICovXG4gICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLnR5cGUubmFtZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3Iobm9kZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtb2RlID0gMCkge1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICB0aGlzLmJ1ZmZlck5vZGUgPSBudWxsO1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnlpZWxkTm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3RyZWUgPSBub2RlLmNvbnRleHQucGFyZW50O1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBub2RlLmNvbnRleHQ7XG4gICAgICAgICAgICBmb3IgKGxldCBuID0gbm9kZS5fcGFyZW50OyBuOyBuID0gbi5fcGFyZW50KVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sudW5zaGlmdChuLmluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyTm9kZSA9IG5vZGU7XG4gICAgICAgICAgICB0aGlzLnlpZWxkQnVmKG5vZGUuaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHlpZWxkTm9kZShub2RlKSB7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5fdHJlZSA9IG5vZGU7XG4gICAgICAgIHRoaXMudHlwZSA9IG5vZGUudHlwZTtcbiAgICAgICAgdGhpcy5mcm9tID0gbm9kZS5mcm9tO1xuICAgICAgICB0aGlzLnRvID0gbm9kZS50bztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHlpZWxkQnVmKGluZGV4LCB0eXBlKSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgbGV0IHsgc3RhcnQsIGJ1ZmZlciB9ID0gdGhpcy5idWZmZXI7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGUgfHwgYnVmZmVyLnNldC50eXBlc1tidWZmZXIuYnVmZmVyW2luZGV4XV07XG4gICAgICAgIHRoaXMuZnJvbSA9IHN0YXJ0ICsgYnVmZmVyLmJ1ZmZlcltpbmRleCArIDFdO1xuICAgICAgICB0aGlzLnRvID0gc3RhcnQgKyBidWZmZXIuYnVmZmVyW2luZGV4ICsgMl07XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHlpZWxkKG5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZE5vZGUobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWZmZXIgPSBub2RlLmNvbnRleHQ7XG4gICAgICAgIHJldHVybiB0aGlzLnlpZWxkQnVmKG5vZGUuaW5kZXgsIG5vZGUudHlwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyLmJ1ZmZlci5jaGlsZFN0cmluZyh0aGlzLmluZGV4KSA6IHRoaXMuX3RyZWUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlbnRlckNoaWxkKGRpciwgcG9zLCBzaWRlKSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZCh0aGlzLl90cmVlLm5leHRDaGlsZChkaXIgPCAwID8gdGhpcy5fdHJlZS5fdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxIDogMCwgZGlyLCBwb3MsIHNpZGUsIHRoaXMubW9kZSkpO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuYnVmZmVyO1xuICAgICAgICBsZXQgaW5kZXggPSBidWZmZXIuZmluZENoaWxkKHRoaXMuaW5kZXggKyA0LCBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXSwgZGlyLCBwb3MgLSB0aGlzLmJ1ZmZlci5zdGFydCwgc2lkZSk7XG4gICAgICAgIGlmIChpbmRleCA8IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLmluZGV4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYoaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhpcyBub2RlJ3MgZmlyc3QgY2hpbGQuIFdoZW4gdGhpcyByZXR1cm5zXG4gICAgZmFsc2UsIHRoZSBub2RlIGhhcyBubyBjaGlsZCwgYW5kIHRoZSBjdXJzb3IgaGFzIG5vdCBiZWVuIG1vdmVkLlxuICAgICovXG4gICAgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuZW50ZXJDaGlsZCgxLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0aGUgY3Vyc29yIHRvIHRoaXMgbm9kZSdzIGxhc3QgY2hpbGQuXG4gICAgKi9cbiAgICBsYXN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmVudGVyQ2hpbGQoLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGZpcnN0IGNoaWxkIHRoYXQgZW5kcyBhZnRlciBgcG9zYC5cbiAgICAqL1xuICAgIGNoaWxkQWZ0ZXIocG9zKSB7IHJldHVybiB0aGlzLmVudGVyQ2hpbGQoMSwgcG9zLCAyIC8qIFNpZGUuQWZ0ZXIgKi8pOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGUgbGFzdCBjaGlsZCB0aGF0IHN0YXJ0cyBiZWZvcmUgYHBvc2AuXG4gICAgKi9cbiAgICBjaGlsZEJlZm9yZShwb3MpIHsgcmV0dXJuIHRoaXMuZW50ZXJDaGlsZCgtMSwgcG9zLCAtMiAvKiBTaWRlLkJlZm9yZSAqLyk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGNoaWxkIGFyb3VuZCBgcG9zYC4gSWYgc2lkZSBpcyAtMSB0aGVcbiAgICBjaGlsZCBtYXkgZW5kIGF0IHRoYXQgcG9zaXRpb24sIHdoZW4gMSBpdCBtYXkgc3RhcnQgdGhlcmUuIFRoaXNcbiAgICB3aWxsIGFsc28gZW50ZXIgW292ZXJsYWlkXSgjY29tbW9uLk1vdW50ZWRUcmVlLm92ZXJsYXkpXG4gICAgW21vdW50ZWRdKCNjb21tb24uTm9kZVByb3BebW91bnRlZCkgdHJlZXMgdW5sZXNzIGBvdmVybGF5c2AgaXNcbiAgICBzZXQgdG8gZmFsc2UuXG4gICAgKi9cbiAgICBlbnRlcihwb3MsIHNpZGUsIG1vZGUgPSB0aGlzLm1vZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkKHRoaXMuX3RyZWUuZW50ZXIocG9zLCBzaWRlLCBtb2RlKSk7XG4gICAgICAgIHJldHVybiBtb2RlICYgSXRlck1vZGUuRXhjbHVkZUJ1ZmZlcnMgPyBmYWxzZSA6IHRoaXMuZW50ZXJDaGlsZCgxLCBwb3MsIHNpZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBub2RlJ3MgcGFyZW50IG5vZGUsIGlmIHRoaXMgaXNuJ3QgdGhlIHRvcCBub2RlLlxuICAgICovXG4gICAgcGFyZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGROb2RlKCh0aGlzLm1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSA/IHRoaXMuX3RyZWUuX3BhcmVudCA6IHRoaXMuX3RyZWUucGFyZW50KTtcbiAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYodGhpcy5zdGFjay5wb3AoKSk7XG4gICAgICAgIGxldCBwYXJlbnQgPSAodGhpcy5tb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgPyB0aGlzLmJ1ZmZlci5wYXJlbnQgOiB0aGlzLmJ1ZmZlci5wYXJlbnQubmV4dFNpZ25pZmljYW50UGFyZW50KCk7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMueWllbGROb2RlKHBhcmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2libGluZyhkaXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5fdHJlZS5fcGFyZW50ID8gZmFsc2VcbiAgICAgICAgICAgICAgICA6IHRoaXMueWllbGQodGhpcy5fdHJlZS5pbmRleCA8IDAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5fdHJlZS5fcGFyZW50Lm5leHRDaGlsZCh0aGlzLl90cmVlLmluZGV4ICsgZGlyLCBkaXIsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLywgdGhpcy5tb2RlKSk7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5idWZmZXIsIGQgPSB0aGlzLnN0YWNrLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChkaXIgPCAwKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50U3RhcnQgPSBkIDwgMCA/IDAgOiB0aGlzLnN0YWNrW2RdICsgNDtcbiAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ICE9IHBhcmVudFN0YXJ0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkQnVmKGJ1ZmZlci5maW5kQ2hpbGQocGFyZW50U3RhcnQsIHRoaXMuaW5kZXgsIC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhZnRlciA9IGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdO1xuICAgICAgICAgICAgaWYgKGFmdGVyIDwgKGQgPCAwID8gYnVmZmVyLmJ1ZmZlci5sZW5ndGggOiBidWZmZXIuYnVmZmVyW3RoaXMuc3RhY2tbZF0gKyAzXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGRCdWYoYWZ0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkIDwgMCA/IHRoaXMueWllbGQodGhpcy5idWZmZXIucGFyZW50Lm5leHRDaGlsZCh0aGlzLmJ1ZmZlci5pbmRleCArIGRpciwgZGlyLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8sIHRoaXMubW9kZSkpIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhpcyBub2RlJ3MgbmV4dCBzaWJsaW5nLCBpZiBhbnkuXG4gICAgKi9cbiAgICBuZXh0U2libGluZygpIHsgcmV0dXJuIHRoaXMuc2libGluZygxKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhpcyBub2RlJ3MgcHJldmlvdXMgc2libGluZywgaWYgYW55LlxuICAgICovXG4gICAgcHJldlNpYmxpbmcoKSB7IHJldHVybiB0aGlzLnNpYmxpbmcoLTEpOyB9XG4gICAgYXRMYXN0Tm9kZShkaXIpIHtcbiAgICAgICAgbGV0IGluZGV4LCBwYXJlbnQsIHsgYnVmZmVyIH0gPSB0aGlzO1xuICAgICAgICBpZiAoYnVmZmVyKSB7XG4gICAgICAgICAgICBpZiAoZGlyID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZGV4IDwgYnVmZmVyLmJ1ZmZlci5idWZmZXIubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5kZXg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5idWZmZXIuYnVmZmVyW2kgKyAzXSA8IHRoaXMuaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoeyBpbmRleCwgcGFyZW50IH0gPSBidWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgKHsgaW5kZXgsIF9wYXJlbnQ6IHBhcmVudCB9ID0gdGhpcy5fdHJlZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IHBhcmVudDsgeyBpbmRleCwgX3BhcmVudDogcGFyZW50IH0gPSBwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBpbmRleCArIGRpciwgZSA9IGRpciA8IDAgPyAtMSA6IHBhcmVudC5fdHJlZS5jaGlsZHJlbi5sZW5ndGg7IGkgIT0gZTsgaSArPSBkaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gcGFyZW50Ll90cmVlLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMubW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCBpbnN0YW5jZW9mIFRyZWVCdWZmZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGlsZC50eXBlLmlzQW5vbnltb3VzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDaGlsZChjaGlsZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBtb3ZlKGRpciwgZW50ZXIpIHtcbiAgICAgICAgaWYgKGVudGVyICYmIHRoaXMuZW50ZXJDaGlsZChkaXIsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLykpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2libGluZyhkaXIpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuYXRMYXN0Tm9kZShkaXIpIHx8ICF0aGlzLnBhcmVudCgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBuZXh0IG5vZGUgaW4gYVxuICAgIFtwcmUtb3JkZXJdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RyZWVfdHJhdmVyc2FsI1ByZS1vcmRlcixfTkxSKVxuICAgIHRyYXZlcnNhbCwgZ29pbmcgZnJvbSBhIG5vZGUgdG8gaXRzIGZpcnN0IGNoaWxkIG9yLCBpZiB0aGVcbiAgICBjdXJyZW50IG5vZGUgaXMgZW1wdHkgb3IgYGVudGVyYCBpcyBmYWxzZSwgaXRzIG5leHQgc2libGluZyBvclxuICAgIHRoZSBuZXh0IHNpYmxpbmcgb2YgdGhlIGZpcnN0IHBhcmVudCBub2RlIHRoYXQgaGFzIG9uZS5cbiAgICAqL1xuICAgIG5leHQoZW50ZXIgPSB0cnVlKSB7IHJldHVybiB0aGlzLm1vdmUoMSwgZW50ZXIpOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGUgbmV4dCBub2RlIGluIGEgbGFzdC10by1maXJzdCBwcmUtb3JkZXIgdHJhdmVyc2FsLiBBXG4gICAgbm9kZSBpcyBmb2xsb3dlZCBieSBpdHMgbGFzdCBjaGlsZCBvciwgaWYgaXQgaGFzIG5vbmUsIGl0c1xuICAgIHByZXZpb3VzIHNpYmxpbmcgb3IgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2YgdGhlIGZpcnN0IHBhcmVudFxuICAgIG5vZGUgdGhhdCBoYXMgb25lLlxuICAgICovXG4gICAgcHJldihlbnRlciA9IHRydWUpIHsgcmV0dXJuIHRoaXMubW92ZSgtMSwgZW50ZXIpOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBpbm5lcm1vc3Qgbm9kZSB0aGF0IGNvdmVycyBgcG9zYC4gSWZcbiAgICBgc2lkZWAgaXMgLTEsIGl0IHdpbGwgZW50ZXIgbm9kZXMgdGhhdCBlbmQgYXQgYHBvc2AuIElmIGl0IGlzIDEsXG4gICAgaXQgd2lsbCBlbnRlciBub2RlcyB0aGF0IHN0YXJ0IGF0IGBwb3NgLlxuICAgICovXG4gICAgbW92ZVRvKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgLy8gTW92ZSB1cCB0byBhIG5vZGUgdGhhdCBhY3R1YWxseSBob2xkcyB0aGUgcG9zaXRpb24sIGlmIHBvc3NpYmxlXG4gICAgICAgIHdoaWxlICh0aGlzLmZyb20gPT0gdGhpcy50byB8fFxuICAgICAgICAgICAgKHNpZGUgPCAxID8gdGhpcy5mcm9tID49IHBvcyA6IHRoaXMuZnJvbSA+IHBvcykgfHxcbiAgICAgICAgICAgIChzaWRlID4gLTEgPyB0aGlzLnRvIDw9IHBvcyA6IHRoaXMudG8gPCBwb3MpKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmVudCgpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBUaGVuIHNjYW4gZG93biBpbnRvIGNoaWxkIG5vZGVzIGFzIGZhciBhcyBwb3NzaWJsZVxuICAgICAgICB3aGlsZSAodGhpcy5lbnRlckNoaWxkKDEsIHBvcywgc2lkZSkpIHsgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgW3N5bnRheCBub2RlXSgjY29tbW9uLlN5bnRheE5vZGUpIGF0IHRoZSBjdXJzb3IncyBjdXJyZW50XG4gICAgcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgbm9kZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmVlO1xuICAgICAgICBsZXQgY2FjaGUgPSB0aGlzLmJ1ZmZlck5vZGUsIHJlc3VsdCA9IG51bGwsIGRlcHRoID0gMDtcbiAgICAgICAgaWYgKGNhY2hlICYmIGNhY2hlLmNvbnRleHQgPT0gdGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgIHNjYW46IGZvciAobGV0IGluZGV4ID0gdGhpcy5pbmRleCwgZCA9IHRoaXMuc3RhY2subGVuZ3RoOyBkID49IDA7KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IGNhY2hlOyBjOyBjID0gYy5fcGFyZW50KVxuICAgICAgICAgICAgICAgICAgICBpZiAoYy5pbmRleCA9PSBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IHRoaXMuaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSBkICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNjYW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbmRleCA9IHRoaXMuc3RhY2tbLS1kXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gZGVwdGg7IGkgPCB0aGlzLnN0YWNrLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEJ1ZmZlck5vZGUodGhpcy5idWZmZXIsIHJlc3VsdCwgdGhpcy5zdGFja1tpXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlck5vZGUgPSBuZXcgQnVmZmVyTm9kZSh0aGlzLmJ1ZmZlciwgcmVzdWx0LCB0aGlzLmluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBbdHJlZV0oI2NvbW1vbi5UcmVlKSB0aGF0IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgbm9kZSwgaWZcbiAgICBhbnkuIFdpbGwgcmV0dXJuIG51bGwgd2hlbiB0aGUgbm9kZSBpcyBpbiBhIFt0cmVlXG4gICAgYnVmZmVyXSgjY29tbW9uLlRyZWVCdWZmZXIpLlxuICAgICovXG4gICAgZ2V0IHRyZWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlciA/IG51bGwgOiB0aGlzLl90cmVlLl90cmVlO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIGN1cnJlbnQgbm9kZSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cywgY2FsbGluZ1xuICAgIGBlbnRlcmAgd2hlbiBlbnRlcmluZyBhIG5vZGUgYW5kIGBsZWF2ZWAsIGlmIGdpdmVuLCB3aGVuIGxlYXZpbmdcbiAgICBvbmUuIFdoZW4gYGVudGVyYCByZXR1cm5zIGBmYWxzZWAsIGFueSBjaGlsZHJlbiBvZiB0aGF0IG5vZGUgYXJlXG4gICAgc2tpcHBlZCwgYW5kIGBsZWF2ZWAgaXNuJ3QgY2FsbGVkIGZvciBpdC5cbiAgICAqL1xuICAgIGl0ZXJhdGUoZW50ZXIsIGxlYXZlKSB7XG4gICAgICAgIGZvciAobGV0IGRlcHRoID0gMDs7KSB7XG4gICAgICAgICAgICBsZXQgbXVzdExlYXZlID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy50eXBlLmlzQW5vbnltb3VzIHx8IGVudGVyKHRoaXMpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpcnN0Q2hpbGQoKSkge1xuICAgICAgICAgICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGUuaXNBbm9ueW1vdXMpXG4gICAgICAgICAgICAgICAgICAgIG11c3RMZWF2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKG11c3RMZWF2ZSAmJiBsZWF2ZSlcbiAgICAgICAgICAgICAgICAgICAgbGVhdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgbXVzdExlYXZlID0gdGhpcy50eXBlLmlzQW5vbnltb3VzO1xuICAgICAgICAgICAgICAgIGlmICghZGVwdGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudCgpO1xuICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICAgICAgbXVzdExlYXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgbm9kZSBtYXRjaGVzIGEgZ2l2ZW4gY29udGV4dFx1MjAxNGEgc2VxdWVuY2VcbiAgICBvZiBkaXJlY3QgcGFyZW50IG5vZGUgbmFtZXMuIEVtcHR5IHN0cmluZ3MgaW4gdGhlIGNvbnRleHQgYXJyYXlcbiAgICBhcmUgdHJlYXRlZCBhcyB3aWxkY2FyZHMuXG4gICAgKi9cbiAgICBtYXRjaENvbnRleHQoY29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoTm9kZUNvbnRleHQodGhpcy5ub2RlLnBhcmVudCwgY29udGV4dCk7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5idWZmZXIsIHsgdHlwZXMgfSA9IGJ1ZmZlci5zZXQ7XG4gICAgICAgIGZvciAobGV0IGkgPSBjb250ZXh0Lmxlbmd0aCAtIDEsIGQgPSB0aGlzLnN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgZC0tKSB7XG4gICAgICAgICAgICBpZiAoZCA8IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoTm9kZUNvbnRleHQodGhpcy5fdHJlZSwgY29udGV4dCwgaSk7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHR5cGVzW2J1ZmZlci5idWZmZXJbdGhpcy5zdGFja1tkXV1dO1xuICAgICAgICAgICAgaWYgKCF0eXBlLmlzQW5vbnltb3VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHRbaV0gJiYgY29udGV4dFtpXSAhPSB0eXBlLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFzQ2hpbGQodHJlZSkge1xuICAgIHJldHVybiB0cmVlLmNoaWxkcmVuLnNvbWUoY2ggPT4gY2ggaW5zdGFuY2VvZiBUcmVlQnVmZmVyIHx8ICFjaC50eXBlLmlzQW5vbnltb3VzIHx8IGhhc0NoaWxkKGNoKSk7XG59XG5mdW5jdGlvbiBidWlsZFRyZWUoZGF0YSkge1xuICAgIHZhciBfYTtcbiAgICBsZXQgeyBidWZmZXIsIG5vZGVTZXQsIG1heEJ1ZmZlckxlbmd0aCA9IERlZmF1bHRCdWZmZXJMZW5ndGgsIHJldXNlZCA9IFtdLCBtaW5SZXBlYXRUeXBlID0gbm9kZVNldC50eXBlcy5sZW5ndGggfSA9IGRhdGE7XG4gICAgbGV0IGN1cnNvciA9IEFycmF5LmlzQXJyYXkoYnVmZmVyKSA/IG5ldyBGbGF0QnVmZmVyQ3Vyc29yKGJ1ZmZlciwgYnVmZmVyLmxlbmd0aCkgOiBidWZmZXI7XG4gICAgbGV0IHR5cGVzID0gbm9kZVNldC50eXBlcztcbiAgICBsZXQgY29udGV4dEhhc2ggPSAwLCBsb29rQWhlYWQgPSAwO1xuICAgIGZ1bmN0aW9uIHRha2VOb2RlKHBhcmVudFN0YXJ0LCBtaW5Qb3MsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGluUmVwZWF0LCBkZXB0aCkge1xuICAgICAgICBsZXQgeyBpZCwgc3RhcnQsIGVuZCwgc2l6ZSB9ID0gY3Vyc29yO1xuICAgICAgICBsZXQgbG9va0FoZWFkQXRTdGFydCA9IGxvb2tBaGVhZCwgY29udGV4dEF0U3RhcnQgPSBjb250ZXh0SGFzaDtcbiAgICAgICAgd2hpbGUgKHNpemUgPCAwKSB7XG4gICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgaWYgKHNpemUgPT0gLTEgLyogU3BlY2lhbFJlY29yZC5SZXVzZSAqLykge1xuICAgICAgICAgICAgICAgIGxldCBub2RlID0gcmV1c2VkW2lkXTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHN0YXJ0IC0gcGFyZW50U3RhcnQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gLTMgLyogU3BlY2lhbFJlY29yZC5Db250ZXh0Q2hhbmdlICovKSB7IC8vIENvbnRleHQgY2hhbmdlXG4gICAgICAgICAgICAgICAgY29udGV4dEhhc2ggPSBpZDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzaXplID09IC00IC8qIFNwZWNpYWxSZWNvcmQuTG9va0FoZWFkICovKSB7XG4gICAgICAgICAgICAgICAgbG9va0FoZWFkID0gaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVucmVjb2duaXplZCByZWNvcmQgc2l6ZTogJHtzaXplfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdHlwZXNbaWRdLCBub2RlLCBidWZmZXI7XG4gICAgICAgIGxldCBzdGFydFBvcyA9IHN0YXJ0IC0gcGFyZW50U3RhcnQ7XG4gICAgICAgIGlmIChlbmQgLSBzdGFydCA8PSBtYXhCdWZmZXJMZW5ndGggJiYgKGJ1ZmZlciA9IGZpbmRCdWZmZXJTaXplKGN1cnNvci5wb3MgLSBtaW5Qb3MsIGluUmVwZWF0KSkpIHtcbiAgICAgICAgICAgIC8vIFNtYWxsIGVub3VnaCBmb3IgYSBidWZmZXIsIGFuZCBubyByZXVzZWQgbm9kZXMgaW5zaWRlXG4gICAgICAgICAgICBsZXQgZGF0YSA9IG5ldyBVaW50MTZBcnJheShidWZmZXIuc2l6ZSAtIGJ1ZmZlci5za2lwKTtcbiAgICAgICAgICAgIGxldCBlbmRQb3MgPSBjdXJzb3IucG9zIC0gYnVmZmVyLnNpemUsIGluZGV4ID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IGVuZFBvcylcbiAgICAgICAgICAgICAgICBpbmRleCA9IGNvcHlUb0J1ZmZlcihidWZmZXIuc3RhcnQsIGRhdGEsIGluZGV4KTtcbiAgICAgICAgICAgIG5vZGUgPSBuZXcgVHJlZUJ1ZmZlcihkYXRhLCBlbmQgLSBidWZmZXIuc3RhcnQsIG5vZGVTZXQpO1xuICAgICAgICAgICAgc3RhcnRQb3MgPSBidWZmZXIuc3RhcnQgLSBwYXJlbnRTdGFydDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gTWFrZSBpdCBhIG5vZGVcbiAgICAgICAgICAgIGxldCBlbmRQb3MgPSBjdXJzb3IucG9zIC0gc2l6ZTtcbiAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICBsZXQgbG9jYWxDaGlsZHJlbiA9IFtdLCBsb2NhbFBvc2l0aW9ucyA9IFtdO1xuICAgICAgICAgICAgbGV0IGxvY2FsSW5SZXBlYXQgPSBpZCA+PSBtaW5SZXBlYXRUeXBlID8gaWQgOiAtMTtcbiAgICAgICAgICAgIGxldCBsYXN0R3JvdXAgPSAwLCBsYXN0RW5kID0gZW5kO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5wb3MgPiBlbmRQb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxJblJlcGVhdCA+PSAwICYmIGN1cnNvci5pZCA9PSBsb2NhbEluUmVwZWF0ICYmIGN1cnNvci5zaXplID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5lbmQgPD0gbGFzdEVuZCAtIG1heEJ1ZmZlckxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVJlcGVhdExlYWYobG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIHN0YXJ0LCBsYXN0R3JvdXAsIGN1cnNvci5lbmQsIGxhc3RFbmQsIGxvY2FsSW5SZXBlYXQsIGxvb2tBaGVhZEF0U3RhcnQsIGNvbnRleHRBdFN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHcm91cCA9IGxvY2FsQ2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVuZCA9IGN1cnNvci5lbmQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVwdGggPiAyNTAwIC8qIEN1dE9mZi5EZXB0aCAqLykge1xuICAgICAgICAgICAgICAgICAgICB0YWtlRmxhdE5vZGUoc3RhcnQsIGVuZFBvcywgbG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFrZU5vZGUoc3RhcnQsIGVuZFBvcywgbG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIGxvY2FsSW5SZXBlYXQsIGRlcHRoICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxvY2FsSW5SZXBlYXQgPj0gMCAmJiBsYXN0R3JvdXAgPiAwICYmIGxhc3RHcm91cCA8IGxvY2FsQ2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgICAgIG1ha2VSZXBlYXRMZWFmKGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCBzdGFydCwgbGFzdEdyb3VwLCBzdGFydCwgbGFzdEVuZCwgbG9jYWxJblJlcGVhdCwgbG9va0FoZWFkQXRTdGFydCwgY29udGV4dEF0U3RhcnQpO1xuICAgICAgICAgICAgbG9jYWxDaGlsZHJlbi5yZXZlcnNlKCk7XG4gICAgICAgICAgICBsb2NhbFBvc2l0aW9ucy5yZXZlcnNlKCk7XG4gICAgICAgICAgICBpZiAobG9jYWxJblJlcGVhdCA+IC0xICYmIGxhc3RHcm91cCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFrZSA9IG1ha2VCYWxhbmNlZCh0eXBlLCBjb250ZXh0QXRTdGFydCk7XG4gICAgICAgICAgICAgICAgbm9kZSA9IGJhbGFuY2VSYW5nZSh0eXBlLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgMCwgbG9jYWxDaGlsZHJlbi5sZW5ndGgsIDAsIGVuZCAtIHN0YXJ0LCBtYWtlLCBtYWtlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBtYWtlVHJlZSh0eXBlLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgZW5kIC0gc3RhcnQsIGxvb2tBaGVhZEF0U3RhcnQgLSBlbmQsIGNvbnRleHRBdFN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgICAgICBwb3NpdGlvbnMucHVzaChzdGFydFBvcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRha2VGbGF0Tm9kZShwYXJlbnRTdGFydCwgbWluUG9zLCBjaGlsZHJlbiwgcG9zaXRpb25zKSB7XG4gICAgICAgIGxldCBub2RlcyA9IFtdOyAvLyBUZW1wb3JhcnksIGludmVydGVkIGFycmF5IG9mIGxlYWYgbm9kZXMgZm91bmQsIHdpdGggYWJzb2x1dGUgcG9zaXRpb25zXG4gICAgICAgIGxldCBub2RlQ291bnQgPSAwLCBzdG9wQXQgPSAtMTtcbiAgICAgICAgd2hpbGUgKGN1cnNvci5wb3MgPiBtaW5Qb3MpIHtcbiAgICAgICAgICAgIGxldCB7IGlkLCBzdGFydCwgZW5kLCBzaXplIH0gPSBjdXJzb3I7XG4gICAgICAgICAgICBpZiAoc2l6ZSA+IDQpIHsgLy8gTm90IGEgbGVhZlxuICAgICAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdG9wQXQgPiAtMSAmJiBzdGFydCA8IHN0b3BBdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3BBdCA8IDApXG4gICAgICAgICAgICAgICAgICAgIHN0b3BBdCA9IGVuZCAtIG1heEJ1ZmZlckxlbmd0aDtcbiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKGlkLCBzdGFydCwgZW5kKTtcbiAgICAgICAgICAgICAgICBub2RlQ291bnQrKztcbiAgICAgICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlQ291bnQpIHtcbiAgICAgICAgICAgIGxldCBidWZmZXIgPSBuZXcgVWludDE2QXJyYXkobm9kZUNvdW50ICogNCk7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBub2Rlc1tub2Rlcy5sZW5ndGggLSAyXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBub2Rlcy5sZW5ndGggLSAzLCBqID0gMDsgaSA+PSAwOyBpIC09IDMpIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbaisrXSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gbm9kZXNbaSArIDFdIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2orK10gPSBub2Rlc1tpICsgMl0gLSBzdGFydDtcbiAgICAgICAgICAgICAgICBidWZmZXJbaisrXSA9IGo7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG5ldyBUcmVlQnVmZmVyKGJ1ZmZlciwgbm9kZXNbMl0gLSBzdGFydCwgbm9kZVNldCkpO1xuICAgICAgICAgICAgcG9zaXRpb25zLnB1c2goc3RhcnQgLSBwYXJlbnRTdGFydCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbWFrZUJhbGFuY2VkKHR5cGUsIGNvbnRleHRIYXNoKSB7XG4gICAgICAgIHJldHVybiAoY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoKSA9PiB7XG4gICAgICAgICAgICBsZXQgbG9va0FoZWFkID0gMCwgbGFzdEkgPSBjaGlsZHJlbi5sZW5ndGggLSAxLCBsYXN0LCBsb29rQWhlYWRQcm9wO1xuICAgICAgICAgICAgaWYgKGxhc3RJID49IDAgJiYgKGxhc3QgPSBjaGlsZHJlbltsYXN0SV0pIGluc3RhbmNlb2YgVHJlZSkge1xuICAgICAgICAgICAgICAgIGlmICghbGFzdEkgJiYgbGFzdC50eXBlID09IHR5cGUgJiYgbGFzdC5sZW5ndGggPT0gbGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFzdDtcbiAgICAgICAgICAgICAgICBpZiAobG9va0FoZWFkUHJvcCA9IGxhc3QucHJvcChOb2RlUHJvcC5sb29rQWhlYWQpKVxuICAgICAgICAgICAgICAgICAgICBsb29rQWhlYWQgPSBwb3NpdGlvbnNbbGFzdEldICsgbGFzdC5sZW5ndGggKyBsb29rQWhlYWRQcm9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ha2VUcmVlKHR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCwgbG9va0FoZWFkLCBjb250ZXh0SGFzaCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1ha2VSZXBlYXRMZWFmKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGJhc2UsIGksIGZyb20sIHRvLCB0eXBlLCBsb29rQWhlYWQsIGNvbnRleHRIYXNoKSB7XG4gICAgICAgIGxldCBsb2NhbENoaWxkcmVuID0gW10sIGxvY2FsUG9zaXRpb25zID0gW107XG4gICAgICAgIHdoaWxlIChjaGlsZHJlbi5sZW5ndGggPiBpKSB7XG4gICAgICAgICAgICBsb2NhbENoaWxkcmVuLnB1c2goY2hpbGRyZW4ucG9wKCkpO1xuICAgICAgICAgICAgbG9jYWxQb3NpdGlvbnMucHVzaChwb3NpdGlvbnMucG9wKCkgKyBiYXNlIC0gZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4ucHVzaChtYWtlVHJlZShub2RlU2V0LnR5cGVzW3R5cGVdLCBsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgdG8gLSBmcm9tLCBsb29rQWhlYWQgLSB0bywgY29udGV4dEhhc2gpKTtcbiAgICAgICAgcG9zaXRpb25zLnB1c2goZnJvbSAtIGJhc2UpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYWtlVHJlZSh0eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgsIGxvb2tBaGVhZCwgY29udGV4dEhhc2gsIHByb3BzKSB7XG4gICAgICAgIGlmIChjb250ZXh0SGFzaCkge1xuICAgICAgICAgICAgbGV0IHBhaXIgPSBbTm9kZVByb3AuY29udGV4dEhhc2gsIGNvbnRleHRIYXNoXTtcbiAgICAgICAgICAgIHByb3BzID0gcHJvcHMgPyBbcGFpcl0uY29uY2F0KHByb3BzKSA6IFtwYWlyXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9va0FoZWFkID4gMjUpIHtcbiAgICAgICAgICAgIGxldCBwYWlyID0gW05vZGVQcm9wLmxvb2tBaGVhZCwgbG9va0FoZWFkXTtcbiAgICAgICAgICAgIHByb3BzID0gcHJvcHMgPyBbcGFpcl0uY29uY2F0KHByb3BzKSA6IFtwYWlyXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRyZWUodHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoLCBwcm9wcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRCdWZmZXJTaXplKG1heFNpemUsIGluUmVwZWF0KSB7XG4gICAgICAgIC8vIFNjYW4gdGhyb3VnaCB0aGUgYnVmZmVyIHRvIGZpbmQgcHJldmlvdXMgc2libGluZ3MgdGhhdCBmaXRcbiAgICAgICAgLy8gdG9nZXRoZXIgaW4gYSBUcmVlQnVmZmVyLCBhbmQgZG9uJ3QgY29udGFpbiBhbnkgcmV1c2VkIG5vZGVzXG4gICAgICAgIC8vICh3aGljaCBjYW4ndCBiZSBzdG9yZWQgaW4gYSBidWZmZXIpLlxuICAgICAgICAvLyBJZiBgaW5SZXBlYXRgIGlzID4gLTEsIGlnbm9yZSBub2RlIGJvdW5kYXJpZXMgb2YgdGhhdCB0eXBlIGZvclxuICAgICAgICAvLyBuZXN0aW5nLCBidXQgbWFrZSBzdXJlIHRoZSBlbmQgZmFsbHMgZWl0aGVyIGF0IHRoZSBzdGFydFxuICAgICAgICAvLyAoYG1heFNpemVgKSBvciBiZWZvcmUgc3VjaCBhIG5vZGUuXG4gICAgICAgIGxldCBmb3JrID0gY3Vyc29yLmZvcmsoKTtcbiAgICAgICAgbGV0IHNpemUgPSAwLCBzdGFydCA9IDAsIHNraXAgPSAwLCBtaW5TdGFydCA9IGZvcmsuZW5kIC0gbWF4QnVmZmVyTGVuZ3RoO1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBzaXplOiAwLCBzdGFydDogMCwgc2tpcDogMCB9O1xuICAgICAgICBzY2FuOiBmb3IgKGxldCBtaW5Qb3MgPSBmb3JrLnBvcyAtIG1heFNpemU7IGZvcmsucG9zID4gbWluUG9zOykge1xuICAgICAgICAgICAgbGV0IG5vZGVTaXplID0gZm9yay5zaXplO1xuICAgICAgICAgICAgLy8gUHJldGVuZCBuZXN0ZWQgcmVwZWF0IG5vZGVzIG9mIHRoZSBzYW1lIHR5cGUgZG9uJ3QgZXhpc3RcbiAgICAgICAgICAgIGlmIChmb3JrLmlkID09IGluUmVwZWF0ICYmIG5vZGVTaXplID49IDApIHtcbiAgICAgICAgICAgICAgICAvLyBFeGNlcHQgdGhhdCB3ZSBzdG9yZSB0aGUgY3VycmVudCBzdGF0ZSBhcyBhIHZhbGlkIHJldHVyblxuICAgICAgICAgICAgICAgIC8vIHZhbHVlLlxuICAgICAgICAgICAgICAgIHJlc3VsdC5zaXplID0gc2l6ZTtcbiAgICAgICAgICAgICAgICByZXN1bHQuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgICAgICAgICByZXN1bHQuc2tpcCA9IHNraXA7XG4gICAgICAgICAgICAgICAgc2tpcCArPSA0O1xuICAgICAgICAgICAgICAgIHNpemUgKz0gNDtcbiAgICAgICAgICAgICAgICBmb3JrLm5leHQoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzdGFydFBvcyA9IGZvcmsucG9zIC0gbm9kZVNpemU7XG4gICAgICAgICAgICBpZiAobm9kZVNpemUgPCAwIHx8IHN0YXJ0UG9zIDwgbWluUG9zIHx8IGZvcmsuc3RhcnQgPCBtaW5TdGFydClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCBsb2NhbFNraXBwZWQgPSBmb3JrLmlkID49IG1pblJlcGVhdFR5cGUgPyA0IDogMDtcbiAgICAgICAgICAgIGxldCBub2RlU3RhcnQgPSBmb3JrLnN0YXJ0O1xuICAgICAgICAgICAgZm9yay5uZXh0KCk7XG4gICAgICAgICAgICB3aGlsZSAoZm9yay5wb3MgPiBzdGFydFBvcykge1xuICAgICAgICAgICAgICAgIGlmIChmb3JrLnNpemUgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JrLnNpemUgPT0gLTMgLyogU3BlY2lhbFJlY29yZC5Db250ZXh0Q2hhbmdlICovKVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTa2lwcGVkICs9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNjYW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvcmsuaWQgPj0gbWluUmVwZWF0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFNraXBwZWQgKz0gNDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yay5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFydCA9IG5vZGVTdGFydDtcbiAgICAgICAgICAgIHNpemUgKz0gbm9kZVNpemU7XG4gICAgICAgICAgICBza2lwICs9IGxvY2FsU2tpcHBlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5SZXBlYXQgPCAwIHx8IHNpemUgPT0gbWF4U2l6ZSkge1xuICAgICAgICAgICAgcmVzdWx0LnNpemUgPSBzaXplO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICByZXN1bHQuc2tpcCA9IHNraXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zaXplID4gNCA/IHJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29weVRvQnVmZmVyKGJ1ZmZlclN0YXJ0LCBidWZmZXIsIGluZGV4KSB7XG4gICAgICAgIGxldCB7IGlkLCBzdGFydCwgZW5kLCBzaXplIH0gPSBjdXJzb3I7XG4gICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgIGlmIChzaXplID49IDAgJiYgaWQgPCBtaW5SZXBlYXRUeXBlKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgaWYgKHNpemUgPiA0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZFBvcyA9IGN1cnNvci5wb3MgLSAoc2l6ZSAtIDQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IucG9zID4gZW5kUG9zKVxuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGNvcHlUb0J1ZmZlcihidWZmZXJTdGFydCwgYnVmZmVyLCBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXJbLS1pbmRleF0gPSBzdGFydEluZGV4O1xuICAgICAgICAgICAgYnVmZmVyWy0taW5kZXhdID0gZW5kIC0gYnVmZmVyU3RhcnQ7XG4gICAgICAgICAgICBidWZmZXJbLS1pbmRleF0gPSBzdGFydCAtIGJ1ZmZlclN0YXJ0O1xuICAgICAgICAgICAgYnVmZmVyWy0taW5kZXhdID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAtMyAvKiBTcGVjaWFsUmVjb3JkLkNvbnRleHRDaGFuZ2UgKi8pIHtcbiAgICAgICAgICAgIGNvbnRleHRIYXNoID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAtNCAvKiBTcGVjaWFsUmVjb3JkLkxvb2tBaGVhZCAqLykge1xuICAgICAgICAgICAgbG9va0FoZWFkID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgICBsZXQgY2hpbGRyZW4gPSBbXSwgcG9zaXRpb25zID0gW107XG4gICAgd2hpbGUgKGN1cnNvci5wb3MgPiAwKVxuICAgICAgICB0YWtlTm9kZShkYXRhLnN0YXJ0IHx8IDAsIGRhdGEuYnVmZmVyU3RhcnQgfHwgMCwgY2hpbGRyZW4sIHBvc2l0aW9ucywgLTEsIDApO1xuICAgIGxldCBsZW5ndGggPSAoX2EgPSBkYXRhLmxlbmd0aCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogKGNoaWxkcmVuLmxlbmd0aCA/IHBvc2l0aW9uc1swXSArIGNoaWxkcmVuWzBdLmxlbmd0aCA6IDApO1xuICAgIHJldHVybiBuZXcgVHJlZSh0eXBlc1tkYXRhLnRvcElEXSwgY2hpbGRyZW4ucmV2ZXJzZSgpLCBwb3NpdGlvbnMucmV2ZXJzZSgpLCBsZW5ndGgpO1xufVxuY29uc3Qgbm9kZVNpemVDYWNoZSA9IG5ldyBXZWFrTWFwO1xuZnVuY3Rpb24gbm9kZVNpemUoYmFsYW5jZVR5cGUsIG5vZGUpIHtcbiAgICBpZiAoIWJhbGFuY2VUeXBlLmlzQW5vbnltb3VzIHx8IG5vZGUgaW5zdGFuY2VvZiBUcmVlQnVmZmVyIHx8IG5vZGUudHlwZSAhPSBiYWxhbmNlVHlwZSlcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgbGV0IHNpemUgPSBub2RlU2l6ZUNhY2hlLmdldChub2RlKTtcbiAgICBpZiAoc2l6ZSA9PSBudWxsKSB7XG4gICAgICAgIHNpemUgPSAxO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQudHlwZSAhPSBiYWxhbmNlVHlwZSB8fCAhKGNoaWxkIGluc3RhbmNlb2YgVHJlZSkpIHtcbiAgICAgICAgICAgICAgICBzaXplID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpemUgKz0gbm9kZVNpemUoYmFsYW5jZVR5cGUsIGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlU2l6ZUNhY2hlLnNldChub2RlLCBzaXplKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG59XG5mdW5jdGlvbiBiYWxhbmNlUmFuZ2UoXG4vLyBUaGUgdHlwZSB0aGUgYmFsYW5jZWQgdHJlZSdzIGlubmVyIG5vZGVzLlxuYmFsYW5jZVR5cGUsIFxuLy8gVGhlIGRpcmVjdCBjaGlsZHJlbiBhbmQgdGhlaXIgcG9zaXRpb25zXG5jaGlsZHJlbiwgcG9zaXRpb25zLCBcbi8vIFRoZSBpbmRleCByYW5nZSBpbiBjaGlsZHJlbi9wb3NpdGlvbnMgdG8gdXNlXG5mcm9tLCB0bywgXG4vLyBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIG5vZGVzLCByZWxhdGl2ZSB0byB0aGVpciBwYXJlbnQuXG5zdGFydCwgXG4vLyBMZW5ndGggb2YgdGhlIG91dGVyIG5vZGVcbmxlbmd0aCwgXG4vLyBGdW5jdGlvbiB0byBidWlsZCB0aGUgdG9wIG5vZGUgb2YgdGhlIGJhbGFuY2VkIHRyZWVcbm1rVG9wLCBcbi8vIEZ1bmN0aW9uIHRvIGJ1aWxkIGludGVybmFsIG5vZGVzIGZvciB0aGUgYmFsYW5jZWQgdHJlZVxubWtUcmVlKSB7XG4gICAgbGV0IHRvdGFsID0gMDtcbiAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOyBpKyspXG4gICAgICAgIHRvdGFsICs9IG5vZGVTaXplKGJhbGFuY2VUeXBlLCBjaGlsZHJlbltpXSk7XG4gICAgbGV0IG1heENoaWxkID0gTWF0aC5jZWlsKCh0b3RhbCAqIDEuNSkgLyA4IC8qIEJhbGFuY2UuQnJhbmNoRmFjdG9yICovKTtcbiAgICBsZXQgbG9jYWxDaGlsZHJlbiA9IFtdLCBsb2NhbFBvc2l0aW9ucyA9IFtdO1xuICAgIGZ1bmN0aW9uIGRpdmlkZShjaGlsZHJlbiwgcG9zaXRpb25zLCBmcm9tLCB0bywgb2Zmc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87KSB7XG4gICAgICAgICAgICBsZXQgZ3JvdXBGcm9tID0gaSwgZ3JvdXBTdGFydCA9IHBvc2l0aW9uc1tpXSwgZ3JvdXBTaXplID0gbm9kZVNpemUoYmFsYW5jZVR5cGUsIGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGZvciAoOyBpIDwgdG87IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0U2l6ZSA9IG5vZGVTaXplKGJhbGFuY2VUeXBlLCBjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwU2l6ZSArIG5leHRTaXplID49IG1heENoaWxkKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBncm91cFNpemUgKz0gbmV4dFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSA9PSBncm91cEZyb20gKyAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwU2l6ZSA+IG1heENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvbmx5ID0gY2hpbGRyZW5bZ3JvdXBGcm9tXTsgLy8gT25seSB0cmVlcyBjYW4gaGF2ZSBhIHNpemUgPiAxXG4gICAgICAgICAgICAgICAgICAgIGRpdmlkZShvbmx5LmNoaWxkcmVuLCBvbmx5LnBvc2l0aW9ucywgMCwgb25seS5jaGlsZHJlbi5sZW5ndGgsIHBvc2l0aW9uc1tncm91cEZyb21dICsgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvY2FsQ2hpbGRyZW4ucHVzaChjaGlsZHJlbltncm91cEZyb21dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBsZW5ndGggPSBwb3NpdGlvbnNbaSAtIDFdICsgY2hpbGRyZW5baSAtIDFdLmxlbmd0aCAtIGdyb3VwU3RhcnQ7XG4gICAgICAgICAgICAgICAgbG9jYWxDaGlsZHJlbi5wdXNoKGJhbGFuY2VSYW5nZShiYWxhbmNlVHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgZ3JvdXBGcm9tLCBpLCBncm91cFN0YXJ0LCBsZW5ndGgsIG51bGwsIG1rVHJlZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9jYWxQb3NpdGlvbnMucHVzaChncm91cFN0YXJ0ICsgb2Zmc2V0IC0gc3RhcnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpdmlkZShjaGlsZHJlbiwgcG9zaXRpb25zLCBmcm9tLCB0bywgMCk7XG4gICAgcmV0dXJuIChta1RvcCB8fCBta1RyZWUpKGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCBsZW5ndGgpO1xufVxuLyoqXG5Qcm92aWRlcyBhIHdheSB0byBhc3NvY2lhdGUgdmFsdWVzIHdpdGggcGllY2VzIG9mIHRyZWVzLiBBcyBsb25nXG5hcyB0aGF0IHBhcnQgb2YgdGhlIHRyZWUgaXMgcmV1c2VkLCB0aGUgYXNzb2NpYXRlZCB2YWx1ZXMgY2FuIGJlXG5yZXRyaWV2ZWQgZnJvbSBhbiB1cGRhdGVkIHRyZWUuXG4qL1xuY2xhc3MgTm9kZVdlYWtNYXAge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgfVxuICAgIHNldEJ1ZmZlcihidWZmZXIsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICBsZXQgaW5uZXIgPSB0aGlzLm1hcC5nZXQoYnVmZmVyKTtcbiAgICAgICAgaWYgKCFpbm5lcilcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChidWZmZXIsIGlubmVyID0gbmV3IE1hcCk7XG4gICAgICAgIGlubmVyLnNldChpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgICBnZXRCdWZmZXIoYnVmZmVyLCBpbmRleCkge1xuICAgICAgICBsZXQgaW5uZXIgPSB0aGlzLm1hcC5nZXQoYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIGlubmVyICYmIGlubmVyLmdldChpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFNldCB0aGUgdmFsdWUgZm9yIHRoaXMgc3ludGF4IG5vZGUuXG4gICAgKi9cbiAgICBzZXQobm9kZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBCdWZmZXJOb2RlKVxuICAgICAgICAgICAgdGhpcy5zZXRCdWZmZXIobm9kZS5jb250ZXh0LmJ1ZmZlciwgbm9kZS5pbmRleCwgdmFsdWUpO1xuICAgICAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUpXG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQobm9kZS50cmVlLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlIHZhbHVlIGZvciB0aGlzIHN5bnRheCBub2RlLCBpZiBpdCBleGlzdHMgaW4gdGhlIG1hcC5cbiAgICAqL1xuICAgIGdldChub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2YgQnVmZmVyTm9kZSA/IHRoaXMuZ2V0QnVmZmVyKG5vZGUuY29udGV4dC5idWZmZXIsIG5vZGUuaW5kZXgpXG4gICAgICAgICAgICA6IG5vZGUgaW5zdGFuY2VvZiBUcmVlTm9kZSA/IHRoaXMubWFwLmdldChub2RlLnRyZWUpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgdGhlIHZhbHVlIGZvciB0aGUgbm9kZSB0aGF0IGEgY3Vyc29yIGN1cnJlbnRseSBwb2ludHMgdG8uXG4gICAgKi9cbiAgICBjdXJzb3JTZXQoY3Vyc29yLCB2YWx1ZSkge1xuICAgICAgICBpZiAoY3Vyc29yLmJ1ZmZlcilcbiAgICAgICAgICAgIHRoaXMuc2V0QnVmZmVyKGN1cnNvci5idWZmZXIuYnVmZmVyLCBjdXJzb3IuaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5tYXAuc2V0KGN1cnNvci50cmVlLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlIHRoZSB2YWx1ZSBmb3IgdGhlIG5vZGUgdGhhdCBhIGN1cnNvciBjdXJyZW50bHkgcG9pbnRzXG4gICAgdG8uXG4gICAgKi9cbiAgICBjdXJzb3JHZXQoY3Vyc29yKSB7XG4gICAgICAgIHJldHVybiBjdXJzb3IuYnVmZmVyID8gdGhpcy5nZXRCdWZmZXIoY3Vyc29yLmJ1ZmZlci5idWZmZXIsIGN1cnNvci5pbmRleCkgOiB0aGlzLm1hcC5nZXQoY3Vyc29yLnRyZWUpO1xuICAgIH1cbn1cblxuLyoqXG5UcmVlIGZyYWdtZW50cyBhcmUgdXNlZCBkdXJpbmcgW2luY3JlbWVudGFsXG5wYXJzaW5nXSgjY29tbW9uLlBhcnNlci5zdGFydFBhcnNlKSB0byB0cmFjayBwYXJ0cyBvZiBvbGQgdHJlZXNcbnRoYXQgY2FuIGJlIHJldXNlZCBpbiBhIG5ldyBwYXJzZS4gQW4gYXJyYXkgb2YgZnJhZ21lbnRzIGlzIHVzZWRcbnRvIHRyYWNrIHJlZ2lvbnMgb2YgYW4gb2xkIHRyZWUgd2hvc2Ugbm9kZXMgbWlnaHQgYmUgcmV1c2VkIGluIG5ld1xucGFyc2VzLiBVc2UgdGhlIHN0YXRpY1xuW2BhcHBseUNoYW5nZXNgXSgjY29tbW9uLlRyZWVGcmFnbWVudF5hcHBseUNoYW5nZXMpIG1ldGhvZCB0b1xudXBkYXRlIGZyYWdtZW50cyBmb3IgZG9jdW1lbnQgY2hhbmdlcy5cbiovXG5jbGFzcyBUcmVlRnJhZ21lbnQge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIHRyZWUgZnJhZ21lbnQuIFlvdSdsbCB1c3VhbGx5IHdhbnQgdG8gdXNlXG4gICAgW2BhZGRUcmVlYF0oI2NvbW1vbi5UcmVlRnJhZ21lbnReYWRkVHJlZSkgYW5kXG4gICAgW2BhcHBseUNoYW5nZXNgXSgjY29tbW9uLlRyZWVGcmFnbWVudF5hcHBseUNoYW5nZXMpIGluc3RlYWQgb2ZcbiAgICBjYWxsaW5nIHRoaXMgZGlyZWN0bHkuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgb2YgdGhlIHVuY2hhbmdlZCByYW5nZSBwb2ludGVkIHRvIGJ5IHRoaXMgZnJhZ21lbnQuXG4gICAgVGhpcyByZWZlcnMgdG8gYW4gb2Zmc2V0IGluIHRoZSBfdXBkYXRlZF8gZG9jdW1lbnQgKGFzIG9wcG9zZWRcbiAgICB0byB0aGUgb3JpZ2luYWwgdHJlZSkuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHRoZSB1bmNoYW5nZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIHRyZWUgdGhhdCB0aGlzIGZyYWdtZW50IGlzIGJhc2VkIG9uLlxuICAgICovXG4gICAgdHJlZSwgXG4gICAgLyoqXG4gICAgVGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBmcmFnbWVudCdzIHRyZWUgYW5kIHRoZSBkb2N1bWVudCB0aGF0XG4gICAgdGhpcyBmcmFnbWVudCBjYW4gYmUgdXNlZCBhZ2FpbnN0LiBBZGQgdGhpcyB3aGVuIGdvaW5nIGZyb21cbiAgICBkb2N1bWVudCB0byB0cmVlIHBvc2l0aW9ucywgc3VidHJhY3QgaXQgdG8gZ28gZnJvbSB0cmVlIHRvXG4gICAgZG9jdW1lbnQgcG9zaXRpb25zLlxuICAgICovXG4gICAgb2Zmc2V0LCBvcGVuU3RhcnQgPSBmYWxzZSwgb3BlbkVuZCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMub3BlbiA9IChvcGVuU3RhcnQgPyAxIC8qIE9wZW4uU3RhcnQgKi8gOiAwKSB8IChvcGVuRW5kID8gMiAvKiBPcGVuLkVuZCAqLyA6IDApO1xuICAgIH1cbiAgICAvKipcbiAgICBXaGV0aGVyIHRoZSBzdGFydCBvZiB0aGUgZnJhZ21lbnQgcmVwcmVzZW50cyB0aGUgc3RhcnQgb2YgYVxuICAgIHBhcnNlLCBvciB0aGUgZW5kIG9mIGEgY2hhbmdlLiAoSW4gdGhlIHNlY29uZCBjYXNlLCBpdCBtYXkgbm90XG4gICAgYmUgc2FmZSB0byByZXVzZSBzb21lIG5vZGVzIGF0IHRoZSBzdGFydCwgZGVwZW5kaW5nIG9uIHRoZVxuICAgIHBhcnNpbmcgYWxnb3JpdGhtLilcbiAgICAqL1xuICAgIGdldCBvcGVuU3RhcnQoKSB7IHJldHVybiAodGhpcy5vcGVuICYgMSAvKiBPcGVuLlN0YXJ0ICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBXaGV0aGVyIHRoZSBlbmQgb2YgdGhlIGZyYWdtZW50IHJlcHJlc2VudHMgdGhlIGVuZCBvZiBhXG4gICAgZnVsbC1kb2N1bWVudCBwYXJzZSwgb3IgdGhlIHN0YXJ0IG9mIGEgY2hhbmdlLlxuICAgICovXG4gICAgZ2V0IG9wZW5FbmQoKSB7IHJldHVybiAodGhpcy5vcGVuICYgMiAvKiBPcGVuLkVuZCAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IG9mIGZyYWdtZW50cyBmcm9tIGEgZnJlc2hseSBwYXJzZWQgdHJlZSwgb3IgdXBkYXRlXG4gICAgYW4gZXhpc3Rpbmcgc2V0IG9mIGZyYWdtZW50cyBieSByZXBsYWNpbmcgdGhlIG9uZXMgdGhhdCBvdmVybGFwXG4gICAgd2l0aCBhIHRyZWUgd2l0aCBjb250ZW50IGZyb20gdGhlIG5ldyB0cmVlLiBXaGVuIGBwYXJ0aWFsYCBpc1xuICAgIHRydWUsIHRoZSBwYXJzZSBpcyB0cmVhdGVkIGFzIGluY29tcGxldGUsIGFuZCB0aGUgcmVzdWx0aW5nXG4gICAgZnJhZ21lbnQgaGFzIFtgb3BlbkVuZGBdKCNjb21tb24uVHJlZUZyYWdtZW50Lm9wZW5FbmQpIHNldCB0b1xuICAgIHRydWUuXG4gICAgKi9cbiAgICBzdGF0aWMgYWRkVHJlZSh0cmVlLCBmcmFnbWVudHMgPSBbXSwgcGFydGlhbCA9IGZhbHNlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbbmV3IFRyZWVGcmFnbWVudCgwLCB0cmVlLmxlbmd0aCwgdHJlZSwgMCwgZmFsc2UsIHBhcnRpYWwpXTtcbiAgICAgICAgZm9yIChsZXQgZiBvZiBmcmFnbWVudHMpXG4gICAgICAgICAgICBpZiAoZi50byA+IHRyZWUubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGYpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBBcHBseSBhIHNldCBvZiBlZGl0cyB0byBhbiBhcnJheSBvZiBmcmFnbWVudHMsIHJlbW92aW5nIG9yXG4gICAgc3BsaXR0aW5nIGZyYWdtZW50cyBhcyBuZWNlc3NhcnkgdG8gcmVtb3ZlIGVkaXRlZCByYW5nZXMsIGFuZFxuICAgIGFkanVzdGluZyBvZmZzZXRzIGZvciBmcmFnbWVudHMgdGhhdCBtb3ZlZC5cbiAgICAqL1xuICAgIHN0YXRpYyBhcHBseUNoYW5nZXMoZnJhZ21lbnRzLCBjaGFuZ2VzLCBtaW5HYXAgPSAxMjgpIHtcbiAgICAgICAgaWYgKCFjaGFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmcmFnbWVudHM7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgbGV0IGZJID0gMSwgbmV4dEYgPSBmcmFnbWVudHMubGVuZ3RoID8gZnJhZ21lbnRzWzBdIDogbnVsbDtcbiAgICAgICAgZm9yIChsZXQgY0kgPSAwLCBwb3MgPSAwLCBvZmYgPSAwOzsgY0krKykge1xuICAgICAgICAgICAgbGV0IG5leHRDID0gY0kgPCBjaGFuZ2VzLmxlbmd0aCA/IGNoYW5nZXNbY0ldIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBuZXh0UG9zID0gbmV4dEMgPyBuZXh0Qy5mcm9tQSA6IDFlOTtcbiAgICAgICAgICAgIGlmIChuZXh0UG9zIC0gcG9zID49IG1pbkdhcClcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dEYgJiYgbmV4dEYuZnJvbSA8IG5leHRQb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1dCA9IG5leHRGO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zID49IGN1dC5mcm9tIHx8IG5leHRQb3MgPD0gY3V0LnRvIHx8IG9mZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZGcm9tID0gTWF0aC5tYXgoY3V0LmZyb20sIHBvcykgLSBvZmYsIGZUbyA9IE1hdGgubWluKGN1dC50bywgbmV4dFBvcykgLSBvZmY7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXQgPSBmRnJvbSA+PSBmVG8gPyBudWxsIDogbmV3IFRyZWVGcmFnbWVudChmRnJvbSwgZlRvLCBjdXQudHJlZSwgY3V0Lm9mZnNldCArIG9mZiwgY0kgPiAwLCAhIW5leHRDKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY3V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY3V0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRGLnRvID4gbmV4dFBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBuZXh0RiA9IGZJIDwgZnJhZ21lbnRzLmxlbmd0aCA/IGZyYWdtZW50c1tmSSsrXSA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFuZXh0QylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHBvcyA9IG5leHRDLnRvQTtcbiAgICAgICAgICAgIG9mZiA9IG5leHRDLnRvQSAtIG5leHRDLnRvQjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuQSBzdXBlcmNsYXNzIHRoYXQgcGFyc2VycyBzaG91bGQgZXh0ZW5kLlxuKi9cbmNsYXNzIFBhcnNlciB7XG4gICAgLyoqXG4gICAgU3RhcnQgYSBwYXJzZSwgcmV0dXJuaW5nIGEgW3BhcnRpYWwgcGFyc2VdKCNjb21tb24uUGFydGlhbFBhcnNlKVxuICAgIG9iamVjdC4gW2BmcmFnbWVudHNgXSgjY29tbW9uLlRyZWVGcmFnbWVudCkgY2FuIGJlIHBhc3NlZCBpbiB0b1xuICAgIG1ha2UgdGhlIHBhcnNlIGluY3JlbWVudGFsLlxuICAgIFxuICAgIEJ5IGRlZmF1bHQsIHRoZSBlbnRpcmUgaW5wdXQgaXMgcGFyc2VkLiBZb3UgY2FuIHBhc3MgYHJhbmdlc2AsXG4gICAgd2hpY2ggc2hvdWxkIGJlIGEgc29ydGVkIGFycmF5IG9mIG5vbi1lbXB0eSwgbm9uLW92ZXJsYXBwaW5nXG4gICAgcmFuZ2VzLCB0byBwYXJzZSBvbmx5IHRob3NlIHJhbmdlcy4gVGhlIHRyZWUgcmV0dXJuZWQgaW4gdGhhdFxuICAgIGNhc2Ugd2lsbCBzdGFydCBhdCBgcmFuZ2VzWzBdLmZyb21gLlxuICAgICovXG4gICAgc3RhcnRQYXJzZShpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgaW5wdXQgPSBuZXcgU3RyaW5nSW5wdXQoaW5wdXQpO1xuICAgICAgICByYW5nZXMgPSAhcmFuZ2VzID8gW25ldyBSYW5nZSgwLCBpbnB1dC5sZW5ndGgpXSA6IHJhbmdlcy5sZW5ndGggPyByYW5nZXMubWFwKHIgPT4gbmV3IFJhbmdlKHIuZnJvbSwgci50bykpIDogW25ldyBSYW5nZSgwLCAwKV07XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnNlKGlucHV0LCBmcmFnbWVudHMgfHwgW10sIHJhbmdlcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJ1biBhIGZ1bGwgcGFyc2UsIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIHRyZWUuXG4gICAgKi9cbiAgICBwYXJzZShpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgbGV0IHBhcnNlID0gdGhpcy5zdGFydFBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcyk7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBkb25lID0gcGFyc2UuYWR2YW5jZSgpO1xuICAgICAgICAgICAgaWYgKGRvbmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbmU7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBTdHJpbmdJbnB1dCB7XG4gICAgY29uc3RydWN0b3Ioc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5zdHJpbmcubGVuZ3RoOyB9XG4gICAgY2h1bmsoZnJvbSkgeyByZXR1cm4gdGhpcy5zdHJpbmcuc2xpY2UoZnJvbSk7IH1cbiAgICBnZXQgbGluZUNodW5rcygpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgcmVhZChmcm9tLCB0bykgeyByZXR1cm4gdGhpcy5zdHJpbmcuc2xpY2UoZnJvbSwgdG8pOyB9XG59XG5cbi8qKlxuQ3JlYXRlIGEgcGFyc2Ugd3JhcHBlciB0aGF0LCBhZnRlciB0aGUgaW5uZXIgcGFyc2UgY29tcGxldGVzLFxuc2NhbnMgaXRzIHRyZWUgZm9yIG1peGVkIGxhbmd1YWdlIHJlZ2lvbnMgd2l0aCB0aGUgYG5lc3RgXG5mdW5jdGlvbiwgcnVucyB0aGUgcmVzdWx0aW5nIFtpbm5lciBwYXJzZXNdKCNjb21tb24uTmVzdGVkUGFyc2UpLFxuYW5kIHRoZW4gW21vdW50c10oI2NvbW1vbi5Ob2RlUHJvcF5tb3VudGVkKSB0aGVpciByZXN1bHRzIG9udG8gdGhlXG50cmVlLlxuKi9cbmZ1bmN0aW9uIHBhcnNlTWl4ZWQobmVzdCkge1xuICAgIHJldHVybiAocGFyc2UsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykgPT4gbmV3IE1peGVkUGFyc2UocGFyc2UsIG5lc3QsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcyk7XG59XG5jbGFzcyBJbm5lclBhcnNlIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIsIHBhcnNlLCBvdmVybGF5LCB0YXJnZXQsIGZyb20pIHtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMucGFyc2UgPSBwYXJzZTtcbiAgICAgICAgdGhpcy5vdmVybGF5ID0gb3ZlcmxheTtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tSYW5nZXMocmFuZ2VzKSB7XG4gICAgaWYgKCFyYW5nZXMubGVuZ3RoIHx8IHJhbmdlcy5zb21lKHIgPT4gci5mcm9tID49IHIudG8pKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5uZXIgcGFyc2UgcmFuZ2VzIGdpdmVuOiBcIiArIEpTT04uc3RyaW5naWZ5KHJhbmdlcykpO1xufVxuY2xhc3MgQWN0aXZlT3ZlcmxheSB7XG4gICAgY29uc3RydWN0b3IocGFyc2VyLCBwcmVkaWNhdGUsIG1vdW50cywgaW5kZXgsIHN0YXJ0LCB0YXJnZXQsIHByZXYpIHtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMucHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgICAgICB0aGlzLm1vdW50cyA9IG1vdW50cztcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLnByZXYgPSBwcmV2O1xuICAgICAgICB0aGlzLmRlcHRoID0gMDtcbiAgICAgICAgdGhpcy5yYW5nZXMgPSBbXTtcbiAgICB9XG59XG5jb25zdCBzdG9wcGVkSW5uZXIgPSBuZXcgTm9kZVByb3AoeyBwZXJOb2RlOiB0cnVlIH0pO1xuY2xhc3MgTWl4ZWRQYXJzZSB7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgbmVzdCwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgIHRoaXMubmVzdCA9IG5lc3Q7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBmcmFnbWVudHM7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICB0aGlzLmlubmVyID0gW107XG4gICAgICAgIHRoaXMuaW5uZXJEb25lID0gMDtcbiAgICAgICAgdGhpcy5iYXNlVHJlZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYXNlUGFyc2UgPSBiYXNlO1xuICAgIH1cbiAgICBhZHZhbmNlKCkge1xuICAgICAgICBpZiAodGhpcy5iYXNlUGFyc2UpIHtcbiAgICAgICAgICAgIGxldCBkb25lID0gdGhpcy5iYXNlUGFyc2UuYWR2YW5jZSgpO1xuICAgICAgICAgICAgaWYgKCFkb25lKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgdGhpcy5iYXNlUGFyc2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5iYXNlVHJlZSA9IGRvbmU7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0SW5uZXIoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3BwZWRBdCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlubmVyIG9mIHRoaXMuaW5uZXIpXG4gICAgICAgICAgICAgICAgICAgIGlubmVyLnBhcnNlLnN0b3BBdCh0aGlzLnN0b3BwZWRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5uZXJEb25lID09IHRoaXMuaW5uZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5iYXNlVHJlZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3BwZWRBdCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUcmVlKHJlc3VsdC50eXBlLCByZXN1bHQuY2hpbGRyZW4sIHJlc3VsdC5wb3NpdGlvbnMsIHJlc3VsdC5sZW5ndGgsIHJlc3VsdC5wcm9wVmFsdWVzLmNvbmNhdChbW3N0b3BwZWRJbm5lciwgdGhpcy5zdG9wcGVkQXRdXSkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5uZXIgPSB0aGlzLmlubmVyW3RoaXMuaW5uZXJEb25lXSwgZG9uZSA9IGlubmVyLnBhcnNlLmFkdmFuY2UoKTtcbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHRoaXMuaW5uZXJEb25lKys7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgc29tZXdoYXQgZG9kZ3kgYnV0IHN1cGVyIGhlbHBmdWwgaGFjayB3aGVyZSB3ZVxuICAgICAgICAgICAgLy8gcGF0Y2ggdXAgbm9kZXMgY3JlYXRlZCBieSB0aGUgaW5uZXIgcGFyc2UgKGFuZCB0aHVzXG4gICAgICAgICAgICAvLyBwcmVzdW1hYmx5IG5vdCBhbGlhc2VkIGFueXdoZXJlIGVsc2UpIHRvIGhvbGQgdGhlIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAvLyBhYm91dCB0aGUgaW5uZXIgcGFyc2UuXG4gICAgICAgICAgICBsZXQgcHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIGlubmVyLnRhcmdldC5wcm9wcyk7XG4gICAgICAgICAgICBwcm9wc1tOb2RlUHJvcC5tb3VudGVkLmlkXSA9IG5ldyBNb3VudGVkVHJlZShkb25lLCBpbm5lci5vdmVybGF5LCBpbm5lci5wYXJzZXIpO1xuICAgICAgICAgICAgaW5uZXIudGFyZ2V0LnByb3BzID0gcHJvcHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGdldCBwYXJzZWRQb3MoKSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VQYXJzZSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5pbnB1dC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmlubmVyRG9uZTsgaSA8IHRoaXMuaW5uZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlubmVyW2ldLmZyb20gPCBwb3MpXG4gICAgICAgICAgICAgICAgcG9zID0gTWF0aC5taW4ocG9zLCB0aGlzLmlubmVyW2ldLnBhcnNlLnBhcnNlZFBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gICAgc3RvcEF0KHBvcykge1xuICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IHBvcztcbiAgICAgICAgaWYgKHRoaXMuYmFzZVBhcnNlKVxuICAgICAgICAgICAgdGhpcy5iYXNlUGFyc2Uuc3RvcEF0KHBvcyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmlubmVyRG9uZTsgaSA8IHRoaXMuaW5uZXIubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgdGhpcy5pbm5lcltpXS5wYXJzZS5zdG9wQXQocG9zKTtcbiAgICB9XG4gICAgc3RhcnRJbm5lcigpIHtcbiAgICAgICAgbGV0IGZyYWdtZW50Q3Vyc29yID0gbmV3IEZyYWdtZW50Q3Vyc29yKHRoaXMuZnJhZ21lbnRzKTtcbiAgICAgICAgbGV0IG92ZXJsYXkgPSBudWxsO1xuICAgICAgICBsZXQgY292ZXJlZCA9IG51bGw7XG4gICAgICAgIGxldCBjdXJzb3IgPSBuZXcgVHJlZUN1cnNvcihuZXcgVHJlZU5vZGUodGhpcy5iYXNlVHJlZSwgdGhpcy5yYW5nZXNbMF0uZnJvbSwgMCwgbnVsbCksIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMgfCBJdGVyTW9kZS5JZ25vcmVNb3VudHMpO1xuICAgICAgICBzY2FuOiBmb3IgKGxldCBuZXN0LCBpc0NvdmVyZWQ7Oykge1xuICAgICAgICAgICAgbGV0IGVudGVyID0gdHJ1ZSwgcmFuZ2U7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9wcGVkQXQgIT0gbnVsbCAmJiBjdXJzb3IuZnJvbSA+PSB0aGlzLnN0b3BwZWRBdCkge1xuICAgICAgICAgICAgICAgIGVudGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChmcmFnbWVudEN1cnNvci5oYXNOb2RlKGN1cnNvcikpIHtcbiAgICAgICAgICAgICAgICBpZiAob3ZlcmxheSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSBvdmVybGF5Lm1vdW50cy5maW5kKG0gPT4gbS5mcmFnLmZyb20gPD0gY3Vyc29yLmZyb20gJiYgbS5mcmFnLnRvID49IGN1cnNvci50byAmJiBtLm1vdW50Lm92ZXJsYXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByIG9mIG1hdGNoLm1vdW50Lm92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IHIuZnJvbSArIG1hdGNoLnBvcywgdG8gPSByLnRvICsgbWF0Y2gucG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tID49IGN1cnNvci5mcm9tICYmIHRvIDw9IGN1cnNvci50byAmJiAhb3ZlcmxheS5yYW5nZXMuc29tZShyID0+IHIuZnJvbSA8IHRvICYmIHIudG8gPiBmcm9tKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS5yYW5nZXMucHVzaCh7IGZyb20sIHRvIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbnRlciA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY292ZXJlZCAmJiAoaXNDb3ZlcmVkID0gY2hlY2tDb3Zlcihjb3ZlcmVkLnJhbmdlcywgY3Vyc29yLmZyb20sIGN1cnNvci50bykpKSB7XG4gICAgICAgICAgICAgICAgZW50ZXIgPSBpc0NvdmVyZWQgIT0gMiAvKiBDb3Zlci5GdWxsICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWN1cnNvci50eXBlLmlzQW5vbnltb3VzICYmIChuZXN0ID0gdGhpcy5uZXN0KGN1cnNvciwgdGhpcy5pbnB1dCkpICYmXG4gICAgICAgICAgICAgICAgKGN1cnNvci5mcm9tIDwgY3Vyc29yLnRvIHx8ICFuZXN0Lm92ZXJsYXkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IudHJlZSlcbiAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWxpemUoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICBsZXQgb2xkTW91bnRzID0gZnJhZ21lbnRDdXJzb3IuZmluZE1vdW50cyhjdXJzb3IuZnJvbSwgbmVzdC5wYXJzZXIpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmVzdC5vdmVybGF5ID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBvdmVybGF5ID0gbmV3IEFjdGl2ZU92ZXJsYXkobmVzdC5wYXJzZXIsIG5lc3Qub3ZlcmxheSwgb2xkTW91bnRzLCB0aGlzLmlubmVyLmxlbmd0aCwgY3Vyc29yLmZyb20sIGN1cnNvci50cmVlLCBvdmVybGF5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZXMgPSBwdW5jaFJhbmdlcyh0aGlzLnJhbmdlcywgbmVzdC5vdmVybGF5IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoY3Vyc29yLmZyb20gPCBjdXJzb3IudG8gPyBbbmV3IFJhbmdlKGN1cnNvci5mcm9tLCBjdXJzb3IudG8pXSA6IFtdKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tSYW5nZXMocmFuZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGggfHwgIW5lc3Qub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5uZXIucHVzaChuZXcgSW5uZXJQYXJzZShuZXN0LnBhcnNlciwgcmFuZ2VzLmxlbmd0aCA/IG5lc3QucGFyc2VyLnN0YXJ0UGFyc2UodGhpcy5pbnB1dCwgZW50ZXJGcmFnbWVudHMob2xkTW91bnRzLCByYW5nZXMpLCByYW5nZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXN0LnBhcnNlci5zdGFydFBhcnNlKFwiXCIpLCBuZXN0Lm92ZXJsYXkgPyBuZXN0Lm92ZXJsYXkubWFwKHIgPT4gbmV3IFJhbmdlKHIuZnJvbSAtIGN1cnNvci5mcm9tLCByLnRvIC0gY3Vyc29yLmZyb20pKSA6IG51bGwsIGN1cnNvci50cmVlLCByYW5nZXMubGVuZ3RoID8gcmFuZ2VzWzBdLmZyb20gOiBjdXJzb3IuZnJvbSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5lc3Qub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmVkID0geyByYW5nZXMsIGRlcHRoOiAwLCBwcmV2OiBjb3ZlcmVkIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3ZlcmxheSAmJiAocmFuZ2UgPSBvdmVybGF5LnByZWRpY2F0ZShjdXJzb3IpKSkge1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZSA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBuZXcgUmFuZ2UoY3Vyc29yLmZyb20sIGN1cnNvci50byk7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLmZyb20gPCByYW5nZS50bykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IG92ZXJsYXkucmFuZ2VzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0ID49IDAgJiYgb3ZlcmxheS5yYW5nZXNbbGFzdF0udG8gPT0gcmFuZ2UuZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXkucmFuZ2VzW2xhc3RdID0geyBmcm9tOiBvdmVybGF5LnJhbmdlc1tsYXN0XS5mcm9tLCB0bzogcmFuZ2UudG8gfTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS5yYW5nZXMucHVzaChyYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudGVyICYmIGN1cnNvci5maXJzdENoaWxkKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAob3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheS5kZXB0aCsrO1xuICAgICAgICAgICAgICAgIGlmIChjb3ZlcmVkKVxuICAgICAgICAgICAgICAgICAgICBjb3ZlcmVkLmRlcHRoKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5wYXJlbnQoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNjYW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChvdmVybGF5ICYmICEtLW92ZXJsYXkuZGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByYW5nZXMgPSBwdW5jaFJhbmdlcyh0aGlzLnJhbmdlcywgb3ZlcmxheS5yYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1JhbmdlcyhyYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5uZXIuc3BsaWNlKG92ZXJsYXkuaW5kZXgsIDAsIG5ldyBJbm5lclBhcnNlKG92ZXJsYXkucGFyc2VyLCBvdmVybGF5LnBhcnNlci5zdGFydFBhcnNlKHRoaXMuaW5wdXQsIGVudGVyRnJhZ21lbnRzKG92ZXJsYXkubW91bnRzLCByYW5nZXMpLCByYW5nZXMpLCBvdmVybGF5LnJhbmdlcy5tYXAociA9PiBuZXcgUmFuZ2Uoci5mcm9tIC0gb3ZlcmxheS5zdGFydCwgci50byAtIG92ZXJsYXkuc3RhcnQpKSwgb3ZlcmxheS50YXJnZXQsIHJhbmdlc1swXS5mcm9tKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5ID0gb3ZlcmxheS5wcmV2O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3ZlcmVkICYmICEtLWNvdmVyZWQuZGVwdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmVkID0gY292ZXJlZC5wcmV2O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrQ292ZXIoY292ZXJlZCwgZnJvbSwgdG8pIHtcbiAgICBmb3IgKGxldCByYW5nZSBvZiBjb3ZlcmVkKSB7XG4gICAgICAgIGlmIChyYW5nZS5mcm9tID49IHRvKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmIChyYW5nZS50byA+IGZyb20pXG4gICAgICAgICAgICByZXR1cm4gcmFuZ2UuZnJvbSA8PSBmcm9tICYmIHJhbmdlLnRvID49IHRvID8gMiAvKiBDb3Zlci5GdWxsICovIDogMSAvKiBDb3Zlci5QYXJ0aWFsICovO1xuICAgIH1cbiAgICByZXR1cm4gMCAvKiBDb3Zlci5Ob25lICovO1xufVxuLy8gVGFrZSBhIHBpZWNlIG9mIGJ1ZmZlciBhbmQgY29udmVydCBpdCBpbnRvIGEgc3RhbmQtYWxvbmVcbi8vIFRyZWVCdWZmZXIuXG5mdW5jdGlvbiBzbGljZUJ1ZihidWYsIHN0YXJ0SSwgZW5kSSwgbm9kZXMsIHBvc2l0aW9ucywgb2ZmKSB7XG4gICAgaWYgKHN0YXJ0SSA8IGVuZEkpIHtcbiAgICAgICAgbGV0IGZyb20gPSBidWYuYnVmZmVyW3N0YXJ0SSArIDFdO1xuICAgICAgICBub2Rlcy5wdXNoKGJ1Zi5zbGljZShzdGFydEksIGVuZEksIGZyb20pKTtcbiAgICAgICAgcG9zaXRpb25zLnB1c2goZnJvbSAtIG9mZik7XG4gICAgfVxufVxuLy8gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIG5vZGUgdGhhdCdzIGluIGEgYnVmZmVyLCBhbmQgY29udmVydHMgaXQsIGFuZFxuLy8gaXRzIHBhcmVudCBidWZmZXIgbm9kZXMsIGludG8gYSBUcmVlLiBUaGlzIGlzIGFnYWluIGFjdGluZyBvbiB0aGVcbi8vIGFzc3VtcHRpb24gdGhhdCB0aGUgdHJlZXMgYW5kIGJ1ZmZlcnMgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkIGJ5IHRoZVxuLy8gcGFyc2UgdGhhdCB3YXMgcmFuIHZpYSB0aGUgbWl4IHBhcnNlciwgYW5kIHRodXMgYXJlbid0IHNoYXJlZCB3aXRoXG4vLyBhbnkgb3RoZXIgY29kZSwgbWFraW5nIHZpb2xhdGlvbnMgb2YgdGhlIGltbXV0YWJpbGl0eSBzYWZlLlxuZnVuY3Rpb24gbWF0ZXJpYWxpemUoY3Vyc29yKSB7XG4gICAgbGV0IHsgbm9kZSB9ID0gY3Vyc29yLCBzdGFjayA9IFtdO1xuICAgIGxldCBidWZmZXIgPSBub2RlLmNvbnRleHQuYnVmZmVyO1xuICAgIC8vIFNjYW4gdXAgdG8gdGhlIG5lYXJlc3QgdHJlZVxuICAgIGRvIHtcbiAgICAgICAgc3RhY2sucHVzaChjdXJzb3IuaW5kZXgpO1xuICAgICAgICBjdXJzb3IucGFyZW50KCk7XG4gICAgfSB3aGlsZSAoIWN1cnNvci50cmVlKTtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgYnVmZmVyIGluIHRoYXQgdHJlZVxuICAgIGxldCBiYXNlID0gY3Vyc29yLnRyZWUsIGkgPSBiYXNlLmNoaWxkcmVuLmluZGV4T2YoYnVmZmVyKTtcbiAgICBsZXQgYnVmID0gYmFzZS5jaGlsZHJlbltpXSwgYiA9IGJ1Zi5idWZmZXIsIG5ld1N0YWNrID0gW2ldO1xuICAgIC8vIFNwbGl0IGEgbGV2ZWwgaW4gdGhlIGJ1ZmZlciwgcHV0dGluZyB0aGUgbm9kZXMgYmVmb3JlIGFuZCBhZnRlclxuICAgIC8vIHRoZSBjaGlsZCB0aGF0IGNvbnRhaW5zIGBub2RlYCBpbnRvIG5ldyBidWZmZXJzLlxuICAgIGZ1bmN0aW9uIHNwbGl0KHN0YXJ0SSwgZW5kSSwgdHlwZSwgaW5uZXJPZmZzZXQsIGxlbmd0aCwgc3RhY2tQb3MpIHtcbiAgICAgICAgbGV0IHRhcmdldEkgPSBzdGFja1tzdGFja1Bvc107XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IFtdLCBwb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgc2xpY2VCdWYoYnVmLCBzdGFydEksIHRhcmdldEksIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGlubmVyT2Zmc2V0KTtcbiAgICAgICAgbGV0IGZyb20gPSBiW3RhcmdldEkgKyAxXSwgdG8gPSBiW3RhcmdldEkgKyAyXTtcbiAgICAgICAgbmV3U3RhY2sucHVzaChjaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICBsZXQgY2hpbGQgPSBzdGFja1Bvc1xuICAgICAgICAgICAgPyBzcGxpdCh0YXJnZXRJICsgNCwgYlt0YXJnZXRJICsgM10sIGJ1Zi5zZXQudHlwZXNbYlt0YXJnZXRJXV0sIGZyb20sIHRvIC0gZnJvbSwgc3RhY2tQb3MgLSAxKVxuICAgICAgICAgICAgOiBub2RlLnRvVHJlZSgpO1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgcG9zaXRpb25zLnB1c2goZnJvbSAtIGlubmVyT2Zmc2V0KTtcbiAgICAgICAgc2xpY2VCdWYoYnVmLCBiW3RhcmdldEkgKyAzXSwgZW5kSSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgaW5uZXJPZmZzZXQpO1xuICAgICAgICByZXR1cm4gbmV3IFRyZWUodHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoKTtcbiAgICB9XG4gICAgYmFzZS5jaGlsZHJlbltpXSA9IHNwbGl0KDAsIGIubGVuZ3RoLCBOb2RlVHlwZS5ub25lLCAwLCBidWYubGVuZ3RoLCBzdGFjay5sZW5ndGggLSAxKTtcbiAgICAvLyBNb3ZlIHRoZSBjdXJzb3IgYmFjayB0byB0aGUgdGFyZ2V0IG5vZGVcbiAgICBmb3IgKGxldCBpbmRleCBvZiBuZXdTdGFjaykge1xuICAgICAgICBsZXQgdHJlZSA9IGN1cnNvci50cmVlLmNoaWxkcmVuW2luZGV4XSwgcG9zID0gY3Vyc29yLnRyZWUucG9zaXRpb25zW2luZGV4XTtcbiAgICAgICAgY3Vyc29yLnlpZWxkKG5ldyBUcmVlTm9kZSh0cmVlLCBwb3MgKyBjdXJzb3IuZnJvbSwgaW5kZXgsIGN1cnNvci5fdHJlZSkpO1xuICAgIH1cbn1cbmNsYXNzIFN0cnVjdHVyZUN1cnNvciB7XG4gICAgY29uc3RydWN0b3Iocm9vdCwgb2Zmc2V0KSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSByb290LmN1cnNvcihJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzIHwgSXRlck1vZGUuSWdub3JlTW91bnRzKTtcbiAgICB9XG4gICAgLy8gTW92ZSB0byB0aGUgZmlyc3Qgbm9kZSAoaW4gcHJlLW9yZGVyKSB0aGF0IHN0YXJ0cyBhdCBvciBhZnRlciBgcG9zYC5cbiAgICBtb3ZlVG8ocG9zKSB7XG4gICAgICAgIGxldCB7IGN1cnNvciB9ID0gdGhpcywgcCA9IHBvcyAtIHRoaXMub2Zmc2V0O1xuICAgICAgICB3aGlsZSAoIXRoaXMuZG9uZSAmJiBjdXJzb3IuZnJvbSA8IHApIHtcbiAgICAgICAgICAgIGlmIChjdXJzb3IudG8gPj0gcG9zICYmIGN1cnNvci5lbnRlcihwLCAxLCBJdGVyTW9kZS5JZ25vcmVPdmVybGF5cyB8IEl0ZXJNb2RlLkV4Y2x1ZGVCdWZmZXJzKSkgO1xuICAgICAgICAgICAgZWxzZSBpZiAoIWN1cnNvci5uZXh0KGZhbHNlKSlcbiAgICAgICAgICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhc05vZGUoY3Vyc29yKSB7XG4gICAgICAgIHRoaXMubW92ZVRvKGN1cnNvci5mcm9tKTtcbiAgICAgICAgaWYgKCF0aGlzLmRvbmUgJiYgdGhpcy5jdXJzb3IuZnJvbSArIHRoaXMub2Zmc2V0ID09IGN1cnNvci5mcm9tICYmIHRoaXMuY3Vyc29yLnRyZWUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHRyZWUgPSB0aGlzLmN1cnNvci50cmVlOzspIHtcbiAgICAgICAgICAgICAgICBpZiAodHJlZSA9PSBjdXJzb3IudHJlZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHRyZWUuY2hpbGRyZW4ubGVuZ3RoICYmIHRyZWUucG9zaXRpb25zWzBdID09IDAgJiYgdHJlZS5jaGlsZHJlblswXSBpbnN0YW5jZW9mIFRyZWUpXG4gICAgICAgICAgICAgICAgICAgIHRyZWUgPSB0cmVlLmNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmNsYXNzIEZyYWdtZW50Q3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihmcmFnbWVudHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cztcbiAgICAgICAgdGhpcy5jdXJUbyA9IDA7XG4gICAgICAgIHRoaXMuZnJhZ0kgPSAwO1xuICAgICAgICBpZiAoZnJhZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gdGhpcy5jdXJGcmFnID0gZnJhZ21lbnRzWzBdO1xuICAgICAgICAgICAgdGhpcy5jdXJUbyA9IChfYSA9IGZpcnN0LnRyZWUucHJvcChzdG9wcGVkSW5uZXIpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmaXJzdC50bztcbiAgICAgICAgICAgIHRoaXMuaW5uZXIgPSBuZXcgU3RydWN0dXJlQ3Vyc29yKGZpcnN0LnRyZWUsIC1maXJzdC5vZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJGcmFnID0gdGhpcy5pbm5lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFzTm9kZShub2RlKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLmN1ckZyYWcgJiYgbm9kZS5mcm9tID49IHRoaXMuY3VyVG8pXG4gICAgICAgICAgICB0aGlzLm5leHRGcmFnKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmN1ckZyYWcgJiYgdGhpcy5jdXJGcmFnLmZyb20gPD0gbm9kZS5mcm9tICYmIHRoaXMuY3VyVG8gPj0gbm9kZS50byAmJiB0aGlzLmlubmVyLmhhc05vZGUobm9kZSk7XG4gICAgfVxuICAgIG5leHRGcmFnKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuZnJhZ0krKztcbiAgICAgICAgaWYgKHRoaXMuZnJhZ0kgPT0gdGhpcy5mcmFnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmN1ckZyYWcgPSB0aGlzLmlubmVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmcmFnID0gdGhpcy5jdXJGcmFnID0gdGhpcy5mcmFnbWVudHNbdGhpcy5mcmFnSV07XG4gICAgICAgICAgICB0aGlzLmN1clRvID0gKF9hID0gZnJhZy50cmVlLnByb3Aoc3RvcHBlZElubmVyKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZnJhZy50bztcbiAgICAgICAgICAgIHRoaXMuaW5uZXIgPSBuZXcgU3RydWN0dXJlQ3Vyc29yKGZyYWcudHJlZSwgLWZyYWcub2Zmc2V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5kTW91bnRzKHBvcywgcGFyc2VyKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAodGhpcy5pbm5lcikge1xuICAgICAgICAgICAgdGhpcy5pbm5lci5jdXJzb3IubW92ZVRvKHBvcywgMSk7XG4gICAgICAgICAgICBmb3IgKGxldCBwb3MgPSB0aGlzLmlubmVyLmN1cnNvci5ub2RlOyBwb3M7IHBvcyA9IHBvcy5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbW91bnQgPSAoX2EgPSBwb3MudHJlZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnByb3AoTm9kZVByb3AubW91bnRlZCk7XG4gICAgICAgICAgICAgICAgaWYgKG1vdW50ICYmIG1vdW50LnBhcnNlciA9PSBwYXJzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuZnJhZ0k7IGkgPCB0aGlzLmZyYWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZyYWcgPSB0aGlzLmZyYWdtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFnLmZyb20gPj0gcG9zLnRvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYWcudHJlZSA9PSB0aGlzLmN1ckZyYWcudHJlZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvczogcG9zLmZyb20gLSBmcmFnLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHB1bmNoUmFuZ2VzKG91dGVyLCByYW5nZXMpIHtcbiAgICBsZXQgY29weSA9IG51bGwsIGN1cnJlbnQgPSByYW5nZXM7XG4gICAgZm9yIChsZXQgaSA9IDEsIGogPSAwOyBpIDwgb3V0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGdhcEZyb20gPSBvdXRlcltpIC0gMV0udG8sIGdhcFRvID0gb3V0ZXJbaV0uZnJvbTtcbiAgICAgICAgZm9yICg7IGogPCBjdXJyZW50Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBsZXQgciA9IGN1cnJlbnRbal07XG4gICAgICAgICAgICBpZiAoci5mcm9tID49IGdhcFRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKHIudG8gPD0gZ2FwRnJvbSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY29weSA9IHJhbmdlcy5zbGljZSgpO1xuICAgICAgICAgICAgaWYgKHIuZnJvbSA8IGdhcEZyb20pIHtcbiAgICAgICAgICAgICAgICBjb3B5W2pdID0gbmV3IFJhbmdlKHIuZnJvbSwgZ2FwRnJvbSk7XG4gICAgICAgICAgICAgICAgaWYgKHIudG8gPiBnYXBUbylcbiAgICAgICAgICAgICAgICAgICAgY29weS5zcGxpY2UoaiArIDEsIDAsIG5ldyBSYW5nZShnYXBUbywgci50bykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoci50byA+IGdhcFRvKSB7XG4gICAgICAgICAgICAgICAgY29weVtqLS1dID0gbmV3IFJhbmdlKGdhcFRvLCByLnRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvcHkuc3BsaWNlKGotLSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG59XG5mdW5jdGlvbiBmaW5kQ292ZXJDaGFuZ2VzKGEsIGIsIGZyb20sIHRvKSB7XG4gICAgbGV0IGlBID0gMCwgaUIgPSAwLCBpbkEgPSBmYWxzZSwgaW5CID0gZmFsc2UsIHBvcyA9IC0xZTk7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgbGV0IG5leHRBID0gaUEgPT0gYS5sZW5ndGggPyAxZTkgOiBpbkEgPyBhW2lBXS50byA6IGFbaUFdLmZyb207XG4gICAgICAgIGxldCBuZXh0QiA9IGlCID09IGIubGVuZ3RoID8gMWU5IDogaW5CID8gYltpQl0udG8gOiBiW2lCXS5mcm9tO1xuICAgICAgICBpZiAoaW5BICE9IGluQikge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgocG9zLCBmcm9tKSwgZW5kID0gTWF0aC5taW4obmV4dEEsIG5leHRCLCB0byk7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPCBlbmQpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFJhbmdlKHN0YXJ0LCBlbmQpKTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBNYXRoLm1pbihuZXh0QSwgbmV4dEIpO1xuICAgICAgICBpZiAocG9zID09IDFlOSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAobmV4dEEgPT0gcG9zKSB7XG4gICAgICAgICAgICBpZiAoIWluQSlcbiAgICAgICAgICAgICAgICBpbkEgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5BID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaUErKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dEIgPT0gcG9zKSB7XG4gICAgICAgICAgICBpZiAoIWluQilcbiAgICAgICAgICAgICAgICBpbkIgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5CID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaUIrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8gR2l2ZW4gYSBudW1iZXIgb2YgZnJhZ21lbnRzIGZvciB0aGUgb3V0ZXIgdHJlZSwgYW5kIGEgc2V0IG9mIHJhbmdlc1xuLy8gdG8gcGFyc2UsIGZpbmQgZnJhZ21lbnRzIGZvciBpbm5lciB0cmVlcyBtb3VudGVkIGFyb3VuZCB0aG9zZVxuLy8gcmFuZ2VzLCBpZiBhbnkuXG5mdW5jdGlvbiBlbnRlckZyYWdtZW50cyhtb3VudHMsIHJhbmdlcykge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCB7IHBvcywgbW91bnQsIGZyYWcgfSBvZiBtb3VudHMpIHtcbiAgICAgICAgbGV0IHN0YXJ0UG9zID0gcG9zICsgKG1vdW50Lm92ZXJsYXkgPyBtb3VudC5vdmVybGF5WzBdLmZyb20gOiAwKSwgZW5kUG9zID0gc3RhcnRQb3MgKyBtb3VudC50cmVlLmxlbmd0aDtcbiAgICAgICAgbGV0IGZyb20gPSBNYXRoLm1heChmcmFnLmZyb20sIHN0YXJ0UG9zKSwgdG8gPSBNYXRoLm1pbihmcmFnLnRvLCBlbmRQb3MpO1xuICAgICAgICBpZiAobW91bnQub3ZlcmxheSkge1xuICAgICAgICAgICAgbGV0IG92ZXJsYXkgPSBtb3VudC5vdmVybGF5Lm1hcChyID0+IG5ldyBSYW5nZShyLmZyb20gKyBwb3MsIHIudG8gKyBwb3MpKTtcbiAgICAgICAgICAgIGxldCBjaGFuZ2VzID0gZmluZENvdmVyQ2hhbmdlcyhyYW5nZXMsIG92ZXJsYXksIGZyb20sIHRvKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSBmcm9tOzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBpID09IGNoYW5nZXMubGVuZ3RoLCBlbmQgPSBsYXN0ID8gdG8gOiBjaGFuZ2VzW2ldLmZyb207XG4gICAgICAgICAgICAgICAgaWYgKGVuZCA+IHBvcylcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFRyZWVGcmFnbWVudChwb3MsIGVuZCwgbW91bnQudHJlZSwgLXN0YXJ0UG9zLCBmcmFnLmZyb20gPj0gcG9zIHx8IGZyYWcub3BlblN0YXJ0LCBmcmFnLnRvIDw9IGVuZCB8fCBmcmFnLm9wZW5FbmQpKTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgcG9zID0gY2hhbmdlc1tpXS50bztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBUcmVlRnJhZ21lbnQoZnJvbSwgdG8sIG1vdW50LnRyZWUsIC1zdGFydFBvcywgZnJhZy5mcm9tID49IHN0YXJ0UG9zIHx8IGZyYWcub3BlblN0YXJ0LCBmcmFnLnRvIDw9IGVuZFBvcyB8fCBmcmFnLm9wZW5FbmQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgeyBEZWZhdWx0QnVmZmVyTGVuZ3RoLCBJdGVyTW9kZSwgTW91bnRlZFRyZWUsIE5vZGVQcm9wLCBOb2RlU2V0LCBOb2RlVHlwZSwgTm9kZVdlYWtNYXAsIFBhcnNlciwgVHJlZSwgVHJlZUJ1ZmZlciwgVHJlZUN1cnNvciwgVHJlZUZyYWdtZW50LCBwYXJzZU1peGVkIH07XG4iLCAiaW1wb3J0IHsgTm9kZVByb3AgfSBmcm9tICdAbGV6ZXIvY29tbW9uJztcblxubGV0IG5leHRUYWdJRCA9IDA7XG4vKipcbkhpZ2hsaWdodGluZyB0YWdzIGFyZSBtYXJrZXJzIHRoYXQgZGVub3RlIGEgaGlnaGxpZ2h0aW5nIGNhdGVnb3J5LlxuVGhleSBhcmUgW2Fzc29jaWF0ZWRdKCNoaWdobGlnaHQuc3R5bGVUYWdzKSB3aXRoIHBhcnRzIG9mIGEgc3ludGF4XG50cmVlIGJ5IGEgbGFuZ3VhZ2UgbW9kZSwgYW5kIHRoZW4gbWFwcGVkIHRvIGFuIGFjdHVhbCBDU1Mgc3R5bGUgYnlcbmEgW2hpZ2hsaWdodGVyXSgjaGlnaGxpZ2h0LkhpZ2hsaWdodGVyKS5cblxuQmVjYXVzZSBzeW50YXggdHJlZSBub2RlIHR5cGVzIGFuZCBoaWdobGlnaHQgc3R5bGVzIGhhdmUgdG8gYmVcbmFibGUgdG8gdGFsayB0aGUgc2FtZSBsYW5ndWFnZSwgQ29kZU1pcnJvciB1c2VzIGEgbW9zdGx5IF9jbG9zZWRfXG5bdm9jYWJ1bGFyeV0oI2hpZ2hsaWdodC50YWdzKSBvZiBzeW50YXggdGFncyAoYXMgb3Bwb3NlZCB0b1xudHJhZGl0aW9uYWwgb3BlbiBzdHJpbmctYmFzZWQgc3lzdGVtcywgd2hpY2ggbWFrZSBpdCBoYXJkIGZvclxuaGlnaGxpZ2h0aW5nIHRoZW1lcyB0byBjb3ZlciBhbGwgdGhlIHRva2VucyBwcm9kdWNlZCBieSB0aGVcbnZhcmlvdXMgbGFuZ3VhZ2VzKS5cblxuSXQgX2lzXyBwb3NzaWJsZSB0byBbZGVmaW5lXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmUpIHlvdXIgb3duXG5oaWdobGlnaHRpbmcgdGFncyBmb3Igc3lzdGVtLWludGVybmFsIHVzZSAod2hlcmUgeW91IGNvbnRyb2wgYm90aFxudGhlIGxhbmd1YWdlIHBhY2thZ2UgYW5kIHRoZSBoaWdobGlnaHRlciksIGJ1dCBzdWNoIHRhZ3Mgd2lsbCBub3RcbmJlIHBpY2tlZCB1cCBieSByZWd1bGFyIGhpZ2hsaWdodGVycyAodGhvdWdoIHlvdSBjYW4gZGVyaXZlIHRoZW1cbmZyb20gc3RhbmRhcmQgdGFncyB0byBhbGxvdyBoaWdobGlnaHRlcnMgdG8gZmFsbCBiYWNrIHRvIHRob3NlKS5cbiovXG5jbGFzcyBUYWcge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGJhc2UgdGFnIEBpbnRlcm5hbFxuICAgICovXG4gICAgbmFtZSwgXG4gICAgLyoqXG4gICAgVGhlIHNldCBvZiB0aGlzIHRhZyBhbmQgYWxsIGl0cyBwYXJlbnQgdGFncywgc3RhcnRpbmcgd2l0aFxuICAgIHRoaXMgb25lIGl0c2VsZiBhbmQgc29ydGVkIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgc3BlY2lmaWNpdHkuXG4gICAgKi9cbiAgICBzZXQsIFxuICAgIC8qKlxuICAgIFRoZSBiYXNlIHVubW9kaWZpZWQgdGFnIHRoYXQgdGhpcyBvbmUgaXMgYmFzZWQgb24sIGlmIGl0J3NcbiAgICBtb2RpZmllZCBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGJhc2UsIFxuICAgIC8qKlxuICAgIFRoZSBtb2RpZmllcnMgYXBwbGllZCB0byB0aGlzLmJhc2UgQGludGVybmFsXG4gICAgKi9cbiAgICBtb2RpZmllZCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnNldCA9IHNldDtcbiAgICAgICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICAgICAgdGhpcy5tb2RpZmllZCA9IG1vZGlmaWVkO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuaWQgPSBuZXh0VGFnSUQrKztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCB7IG5hbWUgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IG1vZCBvZiB0aGlzLm1vZGlmaWVkKVxuICAgICAgICAgICAgaWYgKG1vZC5uYW1lKVxuICAgICAgICAgICAgICAgIG5hbWUgPSBgJHttb2QubmFtZX0oJHtuYW1lfSlgO1xuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG4gICAgc3RhdGljIGRlZmluZShuYW1lT3JQYXJlbnQsIHBhcmVudCkge1xuICAgICAgICBsZXQgbmFtZSA9IHR5cGVvZiBuYW1lT3JQYXJlbnQgPT0gXCJzdHJpbmdcIiA/IG5hbWVPclBhcmVudCA6IFwiP1wiO1xuICAgICAgICBpZiAobmFtZU9yUGFyZW50IGluc3RhbmNlb2YgVGFnKVxuICAgICAgICAgICAgcGFyZW50ID0gbmFtZU9yUGFyZW50O1xuICAgICAgICBpZiAocGFyZW50ID09PSBudWxsIHx8IHBhcmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyZW50LmJhc2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4gbm90IGRlcml2ZSBmcm9tIGEgbW9kaWZpZWQgdGFnXCIpO1xuICAgICAgICBsZXQgdGFnID0gbmV3IFRhZyhuYW1lLCBbXSwgbnVsbCwgW10pO1xuICAgICAgICB0YWcuc2V0LnB1c2godGFnKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgcGFyZW50LnNldClcbiAgICAgICAgICAgICAgICB0YWcuc2V0LnB1c2godCk7XG4gICAgICAgIHJldHVybiB0YWc7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHRhZyBfbW9kaWZpZXJfLCB3aGljaCBpcyBhIGZ1bmN0aW9uIHRoYXQsIGdpdmVuIGEgdGFnLFxuICAgIHdpbGwgcmV0dXJuIGEgdGFnIHRoYXQgaXMgYSBzdWJ0YWcgb2YgdGhlIG9yaWdpbmFsLiBBcHBseWluZyB0aGVcbiAgICBzYW1lIG1vZGlmaWVyIHRvIGEgdHdpY2UgdGFnIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIChgbTEodDEpXG4gICAgPT0gbTEodDEpYCkgYW5kIGFwcGx5aW5nIG11bHRpcGxlIG1vZGlmaWVycyB3aWxsLCByZWdhcmRsZXNzIG9yXG4gICAgb3JkZXIsIHByb2R1Y2UgdGhlIHNhbWUgdGFnIChgbTEobTIodDEpKSA9PSBtMihtMSh0MSkpYCkuXG4gICAgXG4gICAgV2hlbiBtdWx0aXBsZSBtb2RpZmllcnMgYXJlIGFwcGxpZWQgdG8gYSBnaXZlbiBiYXNlIHRhZywgZWFjaFxuICAgIHNtYWxsZXIgc2V0IG9mIG1vZGlmaWVycyBpcyByZWdpc3RlcmVkIGFzIGEgcGFyZW50LCBzbyB0aGF0IGZvclxuICAgIGV4YW1wbGUgYG0xKG0yKG0zKHQxKSkpYCBpcyBhIHN1YnR5cGUgb2YgYG0xKG0yKHQxKSlgLFxuICAgIGBtMShtMyh0MSlgLCBhbmQgc28gb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lTW9kaWZpZXIobmFtZSkge1xuICAgICAgICBsZXQgbW9kID0gbmV3IE1vZGlmaWVyKG5hbWUpO1xuICAgICAgICByZXR1cm4gKHRhZykgPT4ge1xuICAgICAgICAgICAgaWYgKHRhZy5tb2RpZmllZC5pbmRleE9mKG1vZCkgPiAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFnO1xuICAgICAgICAgICAgcmV0dXJuIE1vZGlmaWVyLmdldCh0YWcuYmFzZSB8fCB0YWcsIHRhZy5tb2RpZmllZC5jb25jYXQobW9kKS5zb3J0KChhLCBiKSA9PiBhLmlkIC0gYi5pZCkpO1xuICAgICAgICB9O1xuICAgIH1cbn1cbmxldCBuZXh0TW9kaWZpZXJJRCA9IDA7XG5jbGFzcyBNb2RpZmllciB7XG4gICAgY29uc3RydWN0b3IobmFtZSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmluc3RhbmNlcyA9IFtdO1xuICAgICAgICB0aGlzLmlkID0gbmV4dE1vZGlmaWVySUQrKztcbiAgICB9XG4gICAgc3RhdGljIGdldChiYXNlLCBtb2RzKSB7XG4gICAgICAgIGlmICghbW9kcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgbGV0IGV4aXN0cyA9IG1vZHNbMF0uaW5zdGFuY2VzLmZpbmQodCA9PiB0LmJhc2UgPT0gYmFzZSAmJiBzYW1lQXJyYXkobW9kcywgdC5tb2RpZmllZCkpO1xuICAgICAgICBpZiAoZXhpc3RzKVxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0cztcbiAgICAgICAgbGV0IHNldCA9IFtdLCB0YWcgPSBuZXcgVGFnKGJhc2UubmFtZSwgc2V0LCBiYXNlLCBtb2RzKTtcbiAgICAgICAgZm9yIChsZXQgbSBvZiBtb2RzKVxuICAgICAgICAgICAgbS5pbnN0YW5jZXMucHVzaCh0YWcpO1xuICAgICAgICBsZXQgY29uZmlncyA9IHBvd2VyU2V0KG1vZHMpO1xuICAgICAgICBmb3IgKGxldCBwYXJlbnQgb2YgYmFzZS5zZXQpXG4gICAgICAgICAgICBpZiAoIXBhcmVudC5tb2RpZmllZC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29uZmlnIG9mIGNvbmZpZ3MpXG4gICAgICAgICAgICAgICAgICAgIHNldC5wdXNoKE1vZGlmaWVyLmdldChwYXJlbnQsIGNvbmZpZykpO1xuICAgICAgICByZXR1cm4gdGFnO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVBcnJheShhLCBiKSB7XG4gICAgcmV0dXJuIGEubGVuZ3RoID09IGIubGVuZ3RoICYmIGEuZXZlcnkoKHgsIGkpID0+IHggPT0gYltpXSk7XG59XG5mdW5jdGlvbiBwb3dlclNldChhcnJheSkge1xuICAgIGxldCBzZXRzID0gW1tdXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwLCBlID0gc2V0cy5sZW5ndGg7IGogPCBlOyBqKyspIHtcbiAgICAgICAgICAgIHNldHMucHVzaChzZXRzW2pdLmNvbmNhdChhcnJheVtpXSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZXRzLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpO1xufVxuLyoqXG5UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIGEgc2V0IG9mIHRhZ3MgdG8gYSBsYW5ndWFnZSBzeW50YXhcbnZpYSBbYE5vZGVTZXQuZXh0ZW5kYF0oI2NvbW1vbi5Ob2RlU2V0LmV4dGVuZCkgb3JcbltgTFJQYXJzZXIuY29uZmlndXJlYF0oI2xyLkxSUGFyc2VyLmNvbmZpZ3VyZSkuXG5cblRoZSBhcmd1bWVudCBvYmplY3QgbWFwcyBub2RlIHNlbGVjdG9ycyB0byBbaGlnaGxpZ2h0aW5nXG50YWdzXSgjaGlnaGxpZ2h0LlRhZykgb3IgYXJyYXlzIG9mIHRhZ3MuXG5cbk5vZGUgc2VsZWN0b3JzIG1heSBob2xkIG9uZSBvciBtb3JlIChzcGFjZS1zZXBhcmF0ZWQpIG5vZGUgcGF0aHMuXG5TdWNoIGEgcGF0aCBjYW4gYmUgYSBbbm9kZSBuYW1lXSgjY29tbW9uLk5vZGVUeXBlLm5hbWUpLCBvclxubXVsdGlwbGUgbm9kZSBuYW1lcyAob3IgYCpgIHdpbGRjYXJkcykgc2VwYXJhdGVkIGJ5IHNsYXNoXG5jaGFyYWN0ZXJzLCBhcyBpbiBgXCJCbG9jay9EZWNsYXJhdGlvbi9WYXJpYWJsZU5hbWVcImAuIFN1Y2ggYSBwYXRoXG5tYXRjaGVzIHRoZSBmaW5hbCBub2RlIGJ1dCBvbmx5IGlmIGl0cyBkaXJlY3QgcGFyZW50IG5vZGVzIGFyZSB0aGVcbm90aGVyIG5vZGVzIG1lbnRpb25lZC4gQSBgKmAgaW4gc3VjaCBhIHBhdGggbWF0Y2hlcyBhbnkgcGFyZW50LFxuYnV0IG9ubHkgYSBzaW5nbGUgbGV2ZWxcdTIwMTR3aWxkY2FyZHMgdGhhdCBtYXRjaCBtdWx0aXBsZSBwYXJlbnRzXG5hcmVuJ3Qgc3VwcG9ydGVkLCBib3RoIGZvciBlZmZpY2llbmN5IHJlYXNvbnMgYW5kIGJlY2F1c2UgTGV6ZXJcbnRyZWVzIG1ha2UgaXQgcmF0aGVyIGhhcmQgdG8gcmVhc29uIGFib3V0IHdoYXQgdGhleSB3b3VsZCBtYXRjaC4pXG5cbkEgcGF0aCBjYW4gYmUgZW5kZWQgd2l0aCBgLy4uLmAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdGFnIGFzc2lnbmVkXG50byB0aGUgbm9kZSBzaG91bGQgYWxzbyBhcHBseSB0byBhbGwgY2hpbGQgbm9kZXMsIGV2ZW4gaWYgdGhleVxubWF0Y2ggdGhlaXIgb3duIHN0eWxlIChieSBkZWZhdWx0LCBvbmx5IHRoZSBpbm5lcm1vc3Qgc3R5bGUgaXNcbnVzZWQpLlxuXG5XaGVuIGEgcGF0aCBlbmRzIGluIGAhYCwgYXMgaW4gYEF0dHJpYnV0ZSFgLCBubyBmdXJ0aGVyIG1hdGNoaW5nXG5oYXBwZW5zIGZvciB0aGUgbm9kZSdzIGNoaWxkIG5vZGVzLCBhbmQgdGhlIGVudGlyZSBub2RlIGdldHMgdGhlXG5naXZlbiBzdHlsZS5cblxuSW4gdGhpcyBub3RhdGlvbiwgbm9kZSBuYW1lcyB0aGF0IGNvbnRhaW4gYC9gLCBgIWAsIGAqYCwgb3IgYC4uLmBcbm11c3QgYmUgcXVvdGVkIGFzIEpTT04gc3RyaW5ncy5cblxuRm9yIGV4YW1wbGU6XG5cbmBgYGphdmFzY3JpcHRcbnBhcnNlci53aXRoUHJvcHMoXG4gIHN0eWxlVGFncyh7XG4gICAgLy8gU3R5bGUgTnVtYmVyIGFuZCBCaWdOdW1iZXIgbm9kZXNcbiAgICBcIk51bWJlciBCaWdOdW1iZXJcIjogdGFncy5udW1iZXIsXG4gICAgLy8gU3R5bGUgRXNjYXBlIG5vZGVzIHdob3NlIHBhcmVudCBpcyBTdHJpbmdcbiAgICBcIlN0cmluZy9Fc2NhcGVcIjogdGFncy5lc2NhcGUsXG4gICAgLy8gU3R5bGUgYW55dGhpbmcgaW5zaWRlIEF0dHJpYnV0ZXMgbm9kZXNcbiAgICBcIkF0dHJpYnV0ZXMhXCI6IHRhZ3MubWV0YSxcbiAgICAvLyBBZGQgYSBzdHlsZSB0byBhbGwgY29udGVudCBpbnNpZGUgSXRhbGljIG5vZGVzXG4gICAgXCJJdGFsaWMvLi4uXCI6IHRhZ3MuZW1waGFzaXMsXG4gICAgLy8gU3R5bGUgSW52YWxpZFN0cmluZyBub2RlcyBhcyBib3RoIGBzdHJpbmdgIGFuZCBgaW52YWxpZGBcbiAgICBcIkludmFsaWRTdHJpbmdcIjogW3RhZ3Muc3RyaW5nLCB0YWdzLmludmFsaWRdLFxuICAgIC8vIFN0eWxlIHRoZSBub2RlIG5hbWVkIFwiL1wiIGFzIHB1bmN0dWF0aW9uXG4gICAgJ1wiL1wiJzogdGFncy5wdW5jdHVhdGlvblxuICB9KVxuKVxuYGBgXG4qL1xuZnVuY3Rpb24gc3R5bGVUYWdzKHNwZWMpIHtcbiAgICBsZXQgYnlOYW1lID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCBwcm9wIGluIHNwZWMpIHtcbiAgICAgICAgbGV0IHRhZ3MgPSBzcGVjW3Byb3BdO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFncykpXG4gICAgICAgICAgICB0YWdzID0gW3RhZ3NdO1xuICAgICAgICBmb3IgKGxldCBwYXJ0IG9mIHByb3Auc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgaWYgKHBhcnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGllY2VzID0gW10sIG1vZGUgPSAyIC8qIE1vZGUuTm9ybWFsICovLCByZXN0ID0gcGFydDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwb3MgPSAwOzspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3QgPT0gXCIuLi5cIiAmJiBwb3MgPiAwICYmIHBvcyArIDMgPT0gcGFydC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSAxIC8qIE1vZGUuSW5oZXJpdCAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBtID0gL15cIig/OlteXCJcXFxcXXxcXFxcLikqP1wifFteXFwvIV0rLy5leGVjKHJlc3QpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW0pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgcGF0aDogXCIgKyBwYXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgcGllY2VzLnB1c2gobVswXSA9PSBcIipcIiA/IFwiXCIgOiBtWzBdWzBdID09ICdcIicgPyBKU09OLnBhcnNlKG1bMF0pIDogbVswXSk7XG4gICAgICAgICAgICAgICAgICAgIHBvcyArPSBtWzBdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBwYXJ0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHBhcnRbcG9zKytdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zID09IHBhcnQubGVuZ3RoICYmIG5leHQgPT0gXCIhXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSAwIC8qIE1vZGUuT3BhcXVlICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT0gXCIvXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgcGF0aDogXCIgKyBwYXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdCA9IHBhcnQuc2xpY2UocG9zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBwaWVjZXMubGVuZ3RoIC0gMSwgaW5uZXIgPSBwaWVjZXNbbGFzdF07XG4gICAgICAgICAgICAgICAgaWYgKCFpbm5lcilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHBhdGg6IFwiICsgcGFydCk7XG4gICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBuZXcgUnVsZSh0YWdzLCBtb2RlLCBsYXN0ID4gMCA/IHBpZWNlcy5zbGljZSgwLCBsYXN0KSA6IG51bGwpO1xuICAgICAgICAgICAgICAgIGJ5TmFtZVtpbm5lcl0gPSBydWxlLnNvcnQoYnlOYW1lW2lubmVyXSk7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBydWxlTm9kZVByb3AuYWRkKGJ5TmFtZSk7XG59XG5jb25zdCBydWxlTm9kZVByb3AgPSBuZXcgTm9kZVByb3AoKTtcbmNsYXNzIFJ1bGUge1xuICAgIGNvbnN0cnVjdG9yKHRhZ3MsIG1vZGUsIGNvbnRleHQsIG5leHQpIHtcbiAgICAgICAgdGhpcy50YWdzID0gdGFncztcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDtcbiAgICB9XG4gICAgZ2V0IG9wYXF1ZSgpIHsgcmV0dXJuIHRoaXMubW9kZSA9PSAwIC8qIE1vZGUuT3BhcXVlICovOyB9XG4gICAgZ2V0IGluaGVyaXQoKSB7IHJldHVybiB0aGlzLm1vZGUgPT0gMSAvKiBNb2RlLkluaGVyaXQgKi87IH1cbiAgICBzb3J0KG90aGVyKSB7XG4gICAgICAgIGlmICghb3RoZXIgfHwgb3RoZXIuZGVwdGggPCB0aGlzLmRlcHRoKSB7XG4gICAgICAgICAgICB0aGlzLm5leHQgPSBvdGhlcjtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIG90aGVyLm5leHQgPSB0aGlzLnNvcnQob3RoZXIubmV4dCk7XG4gICAgICAgIHJldHVybiBvdGhlcjtcbiAgICB9XG4gICAgZ2V0IGRlcHRoKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0ID8gdGhpcy5jb250ZXh0Lmxlbmd0aCA6IDA7IH1cbn1cblJ1bGUuZW1wdHkgPSBuZXcgUnVsZShbXSwgMiAvKiBNb2RlLk5vcm1hbCAqLywgbnVsbCk7XG4vKipcbkRlZmluZSBhIFtoaWdobGlnaHRlcl0oI2hpZ2hsaWdodC5IaWdobGlnaHRlcikgZnJvbSBhbiBhcnJheSBvZlxudGFnL2NsYXNzIHBhaXJzLiBDbGFzc2VzIGFzc29jaWF0ZWQgd2l0aCBtb3JlIHNwZWNpZmljIHRhZ3Mgd2lsbFxudGFrZSBwcmVjZWRlbmNlLlxuKi9cbmZ1bmN0aW9uIHRhZ0hpZ2hsaWdodGVyKHRhZ3MsIG9wdGlvbnMpIHtcbiAgICBsZXQgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCBzdHlsZSBvZiB0YWdzKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdHlsZS50YWcpKVxuICAgICAgICAgICAgbWFwW3N0eWxlLnRhZy5pZF0gPSBzdHlsZS5jbGFzcztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZm9yIChsZXQgdGFnIG9mIHN0eWxlLnRhZylcbiAgICAgICAgICAgICAgICBtYXBbdGFnLmlkXSA9IHN0eWxlLmNsYXNzO1xuICAgIH1cbiAgICBsZXQgeyBzY29wZSwgYWxsID0gbnVsbCB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdHlsZTogKHRhZ3MpID0+IHtcbiAgICAgICAgICAgIGxldCBjbHMgPSBhbGw7XG4gICAgICAgICAgICBmb3IgKGxldCB0YWcgb2YgdGFncykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHN1YiBvZiB0YWcuc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdDbGFzcyA9IG1hcFtzdWIuaWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFnQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNscyA9IGNscyA/IGNscyArIFwiIFwiICsgdGFnQ2xhc3MgOiB0YWdDbGFzcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNscztcbiAgICAgICAgfSxcbiAgICAgICAgc2NvcGVcbiAgICB9O1xufVxuZnVuY3Rpb24gaGlnaGxpZ2h0VGFncyhoaWdobGlnaHRlcnMsIHRhZ3MpIHtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBmb3IgKGxldCBoaWdobGlnaHRlciBvZiBoaWdobGlnaHRlcnMpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gaGlnaGxpZ2h0ZXIuc3R5bGUodGFncyk7XG4gICAgICAgIGlmICh2YWx1ZSlcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCA/IHJlc3VsdCArIFwiIFwiICsgdmFsdWUgOiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuSGlnaGxpZ2h0IHRoZSBnaXZlbiBbdHJlZV0oI2NvbW1vbi5UcmVlKSB3aXRoIHRoZSBnaXZlblxuW2hpZ2hsaWdodGVyXSgjaGlnaGxpZ2h0LkhpZ2hsaWdodGVyKS4gT2Z0ZW4sIHRoZSBoaWdoZXItbGV2ZWxcbltgaGlnaGxpZ2h0Q29kZWBdKCNoaWdobGlnaHQuaGlnaGxpZ2h0Q29kZSkgZnVuY3Rpb24gaXMgZWFzaWVyIHRvXG51c2UuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0VHJlZSh0cmVlLCBoaWdobGlnaHRlciwgXG4vKipcbkFzc2lnbiBzdHlsaW5nIHRvIGEgcmVnaW9uIG9mIHRoZSB0ZXh0LiBXaWxsIGJlIGNhbGxlZCwgaW4gb3JkZXJcbm9mIHBvc2l0aW9uLCBmb3IgYW55IHJhbmdlcyB3aGVyZSBtb3JlIHRoYW4gemVybyBjbGFzc2VzIGFwcGx5LlxuYGNsYXNzZXNgIGlzIGEgc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBDU1MgY2xhc3Nlcy5cbiovXG5wdXRTdHlsZSwgXG4vKipcblRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gaGlnaGxpZ2h0LlxuKi9cbmZyb20gPSAwLCBcbi8qKlxuVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4qL1xudG8gPSB0cmVlLmxlbmd0aCkge1xuICAgIGxldCBidWlsZGVyID0gbmV3IEhpZ2hsaWdodEJ1aWxkZXIoZnJvbSwgQXJyYXkuaXNBcnJheShoaWdobGlnaHRlcikgPyBoaWdobGlnaHRlciA6IFtoaWdobGlnaHRlcl0sIHB1dFN0eWxlKTtcbiAgICBidWlsZGVyLmhpZ2hsaWdodFJhbmdlKHRyZWUuY3Vyc29yKCksIGZyb20sIHRvLCBcIlwiLCBidWlsZGVyLmhpZ2hsaWdodGVycyk7XG4gICAgYnVpbGRlci5mbHVzaCh0byk7XG59XG4vKipcbkhpZ2hsaWdodCB0aGUgZ2l2ZW4gdHJlZSB3aXRoIHRoZSBnaXZlbiBoaWdobGlnaHRlciwgY2FsbGluZ1xuYHB1dFRleHRgIGZvciBldmVyeSBwaWVjZSBvZiB0ZXh0LCBlaXRoZXIgd2l0aCBhIHNldCBvZiBjbGFzc2VzIG9yXG53aXRoIHRoZSBlbXB0eSBzdHJpbmcgd2hlbiB1bnN0eWxlZCwgYW5kIGBwdXRCcmVha2AgZm9yIGV2ZXJ5IGxpbmVcbmJyZWFrLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodENvZGUoY29kZSwgdHJlZSwgaGlnaGxpZ2h0ZXIsIHB1dFRleHQsIHB1dEJyZWFrLCBmcm9tID0gMCwgdG8gPSBjb2RlLmxlbmd0aCkge1xuICAgIGxldCBwb3MgPSBmcm9tO1xuICAgIGZ1bmN0aW9uIHdyaXRlVG8ocCwgY2xhc3Nlcykge1xuICAgICAgICBpZiAocCA8PSBwb3MpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZvciAobGV0IHRleHQgPSBjb2RlLnNsaWNlKHBvcywgcCksIGkgPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBuZXh0QnJlYWsgPSB0ZXh0LmluZGV4T2YoXCJcXG5cIiwgaSk7XG4gICAgICAgICAgICBsZXQgdXB0byA9IG5leHRCcmVhayA8IDAgPyB0ZXh0Lmxlbmd0aCA6IG5leHRCcmVhaztcbiAgICAgICAgICAgIGlmICh1cHRvID4gaSlcbiAgICAgICAgICAgICAgICBwdXRUZXh0KHRleHQuc2xpY2UoaSwgdXB0byksIGNsYXNzZXMpO1xuICAgICAgICAgICAgaWYgKG5leHRCcmVhayA8IDApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBwdXRCcmVhaygpO1xuICAgICAgICAgICAgaSA9IG5leHRCcmVhayArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcG9zID0gcDtcbiAgICB9XG4gICAgaGlnaGxpZ2h0VHJlZSh0cmVlLCBoaWdobGlnaHRlciwgKGZyb20sIHRvLCBjbGFzc2VzKSA9PiB7XG4gICAgICAgIHdyaXRlVG8oZnJvbSwgXCJcIik7XG4gICAgICAgIHdyaXRlVG8odG8sIGNsYXNzZXMpO1xuICAgIH0sIGZyb20sIHRvKTtcbiAgICB3cml0ZVRvKHRvLCBcIlwiKTtcbn1cbmNsYXNzIEhpZ2hsaWdodEJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKGF0LCBoaWdobGlnaHRlcnMsIHNwYW4pIHtcbiAgICAgICAgdGhpcy5hdCA9IGF0O1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVycyA9IGhpZ2hsaWdodGVycztcbiAgICAgICAgdGhpcy5zcGFuID0gc3BhbjtcbiAgICAgICAgdGhpcy5jbGFzcyA9IFwiXCI7XG4gICAgfVxuICAgIHN0YXJ0U3BhbihhdCwgY2xzKSB7XG4gICAgICAgIGlmIChjbHMgIT0gdGhpcy5jbGFzcykge1xuICAgICAgICAgICAgdGhpcy5mbHVzaChhdCk7XG4gICAgICAgICAgICBpZiAoYXQgPiB0aGlzLmF0KVxuICAgICAgICAgICAgICAgIHRoaXMuYXQgPSBhdDtcbiAgICAgICAgICAgIHRoaXMuY2xhc3MgPSBjbHM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmx1c2godG8pIHtcbiAgICAgICAgaWYgKHRvID4gdGhpcy5hdCAmJiB0aGlzLmNsYXNzKVxuICAgICAgICAgICAgdGhpcy5zcGFuKHRoaXMuYXQsIHRvLCB0aGlzLmNsYXNzKTtcbiAgICB9XG4gICAgaGlnaGxpZ2h0UmFuZ2UoY3Vyc29yLCBmcm9tLCB0bywgaW5oZXJpdGVkQ2xhc3MsIGhpZ2hsaWdodGVycykge1xuICAgICAgICBsZXQgeyB0eXBlLCBmcm9tOiBzdGFydCwgdG86IGVuZCB9ID0gY3Vyc29yO1xuICAgICAgICBpZiAoc3RhcnQgPj0gdG8gfHwgZW5kIDw9IGZyb20pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0eXBlLmlzVG9wKVxuICAgICAgICAgICAgaGlnaGxpZ2h0ZXJzID0gdGhpcy5oaWdobGlnaHRlcnMuZmlsdGVyKGggPT4gIWguc2NvcGUgfHwgaC5zY29wZSh0eXBlKSk7XG4gICAgICAgIGxldCBjbHMgPSBpbmhlcml0ZWRDbGFzcztcbiAgICAgICAgbGV0IHJ1bGUgPSBnZXRTdHlsZVRhZ3MoY3Vyc29yKSB8fCBSdWxlLmVtcHR5O1xuICAgICAgICBsZXQgdGFnQ2xzID0gaGlnaGxpZ2h0VGFncyhoaWdobGlnaHRlcnMsIHJ1bGUudGFncyk7XG4gICAgICAgIGlmICh0YWdDbHMpIHtcbiAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgY2xzICs9IFwiIFwiO1xuICAgICAgICAgICAgY2xzICs9IHRhZ0NscztcbiAgICAgICAgICAgIGlmIChydWxlLm1vZGUgPT0gMSAvKiBNb2RlLkluaGVyaXQgKi8pXG4gICAgICAgICAgICAgICAgaW5oZXJpdGVkQ2xhc3MgKz0gKGluaGVyaXRlZENsYXNzID8gXCIgXCIgOiBcIlwiKSArIHRhZ0NscztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXJ0U3BhbihNYXRoLm1heChmcm9tLCBzdGFydCksIGNscyk7XG4gICAgICAgIGlmIChydWxlLm9wYXF1ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IG1vdW50ZWQgPSBjdXJzb3IudHJlZSAmJiBjdXJzb3IudHJlZS5wcm9wKE5vZGVQcm9wLm1vdW50ZWQpO1xuICAgICAgICBpZiAobW91bnRlZCAmJiBtb3VudGVkLm92ZXJsYXkpIHtcbiAgICAgICAgICAgIGxldCBpbm5lciA9IGN1cnNvci5ub2RlLmVudGVyKG1vdW50ZWQub3ZlcmxheVswXS5mcm9tICsgc3RhcnQsIDEpO1xuICAgICAgICAgICAgbGV0IGlubmVySGlnaGxpZ2h0ZXJzID0gdGhpcy5oaWdobGlnaHRlcnMuZmlsdGVyKGggPT4gIWguc2NvcGUgfHwgaC5zY29wZShtb3VudGVkLnRyZWUudHlwZSkpO1xuICAgICAgICAgICAgbGV0IGhhc0NoaWxkID0gY3Vyc29yLmZpcnN0Q2hpbGQoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSBzdGFydDs7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gaSA8IG1vdW50ZWQub3ZlcmxheS5sZW5ndGggPyBtb3VudGVkLm92ZXJsYXlbaV0gOiBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBuZXh0UG9zID0gbmV4dCA/IG5leHQuZnJvbSArIHN0YXJ0IDogZW5kO1xuICAgICAgICAgICAgICAgIGxldCByYW5nZUZyb20gPSBNYXRoLm1heChmcm9tLCBwb3MpLCByYW5nZVRvID0gTWF0aC5taW4odG8sIG5leHRQb3MpO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZUZyb20gPCByYW5nZVRvICYmIGhhc0NoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IuZnJvbSA8IHJhbmdlVG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0UmFuZ2UoY3Vyc29yLCByYW5nZUZyb20sIHJhbmdlVG8sIGluaGVyaXRlZENsYXNzLCBoaWdobGlnaHRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFNwYW4oTWF0aC5taW4ocmFuZ2VUbywgY3Vyc29yLnRvKSwgY2xzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IudG8gPj0gbmV4dFBvcyB8fCAhY3Vyc29yLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8IG5leHRQb3MgPiB0bylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgcG9zID0gbmV4dC50byArIHN0YXJ0O1xuICAgICAgICAgICAgICAgIGlmIChwb3MgPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0UmFuZ2UoaW5uZXIuY3Vyc29yKCksIE1hdGgubWF4KGZyb20sIG5leHQuZnJvbSArIHN0YXJ0KSwgTWF0aC5taW4odG8sIHBvcyksIFwiXCIsIGlubmVySGlnaGxpZ2h0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFNwYW4oTWF0aC5taW4odG8sIHBvcyksIGNscyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc0NoaWxkKVxuICAgICAgICAgICAgICAgIGN1cnNvci5wYXJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXJzb3IuZmlyc3RDaGlsZCgpKSB7XG4gICAgICAgICAgICBpZiAobW91bnRlZClcbiAgICAgICAgICAgICAgICBpbmhlcml0ZWRDbGFzcyA9IFwiXCI7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci50byA8PSBmcm9tKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmZyb20gPj0gdG8pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0UmFuZ2UoY3Vyc29yLCBmcm9tLCB0bywgaW5oZXJpdGVkQ2xhc3MsIGhpZ2hsaWdodGVycyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFNwYW4oTWF0aC5taW4odG8sIGN1cnNvci50byksIGNscyk7XG4gICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubmV4dFNpYmxpbmcoKSk7XG4gICAgICAgICAgICBjdXJzb3IucGFyZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbk1hdGNoIGEgc3ludGF4IG5vZGUncyBbaGlnaGxpZ2h0IHJ1bGVzXSgjaGlnaGxpZ2h0LnN0eWxlVGFncykuIElmXG50aGVyZSdzIGEgbWF0Y2gsIHJldHVybiBpdHMgc2V0IG9mIHRhZ3MsIGFuZCB3aGV0aGVyIGl0IGlzXG5vcGFxdWUgKHVzZXMgYSBgIWApIG9yIGFwcGxpZXMgdG8gYWxsIGNoaWxkIG5vZGVzIChgLy4uLmApLlxuKi9cbmZ1bmN0aW9uIGdldFN0eWxlVGFncyhub2RlKSB7XG4gICAgbGV0IHJ1bGUgPSBub2RlLnR5cGUucHJvcChydWxlTm9kZVByb3ApO1xuICAgIHdoaWxlIChydWxlICYmIHJ1bGUuY29udGV4dCAmJiAhbm9kZS5tYXRjaENvbnRleHQocnVsZS5jb250ZXh0KSlcbiAgICAgICAgcnVsZSA9IHJ1bGUubmV4dDtcbiAgICByZXR1cm4gcnVsZSB8fCBudWxsO1xufVxuY29uc3QgdCA9IFRhZy5kZWZpbmU7XG5jb25zdCBjb21tZW50ID0gdCgpLCBuYW1lID0gdCgpLCB0eXBlTmFtZSA9IHQobmFtZSksIHByb3BlcnR5TmFtZSA9IHQobmFtZSksIGxpdGVyYWwgPSB0KCksIHN0cmluZyA9IHQobGl0ZXJhbCksIG51bWJlciA9IHQobGl0ZXJhbCksIGNvbnRlbnQgPSB0KCksIGhlYWRpbmcgPSB0KGNvbnRlbnQpLCBrZXl3b3JkID0gdCgpLCBvcGVyYXRvciA9IHQoKSwgcHVuY3R1YXRpb24gPSB0KCksIGJyYWNrZXQgPSB0KHB1bmN0dWF0aW9uKSwgbWV0YSA9IHQoKTtcbi8qKlxuVGhlIGRlZmF1bHQgc2V0IG9mIGhpZ2hsaWdodGluZyBbdGFnc10oI2hpZ2hsaWdodC5UYWcpLlxuXG5UaGlzIGNvbGxlY3Rpb24gaXMgaGVhdmlseSBiaWFzZWQgdG93YXJkcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMsXG5hbmQgbmVjZXNzYXJpbHkgaW5jb21wbGV0ZS4gQSBmdWxsIG9udG9sb2d5IG9mIHN5bnRhY3RpY1xuY29uc3RydWN0cyB3b3VsZCBmaWxsIGEgc3RhY2sgb2YgYm9va3MsIGFuZCBiZSBpbXByYWN0aWNhbCB0b1xud3JpdGUgdGhlbWVzIGZvci4gU28gdHJ5IHRvIG1ha2UgZG8gd2l0aCB0aGlzIHNldC4gSWYgYWxsIGVsc2VcbmZhaWxzLCBbb3BlbiBhblxuaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IubmV4dCkgdG8gcHJvcG9zZSBhXG5uZXcgdGFnLCBvciBbZGVmaW5lXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmUpIGEgbG9jYWwgY3VzdG9tIHRhZyBmb3JcbnlvdXIgdXNlIGNhc2UuXG5cbk5vdGUgdGhhdCBpdCBpcyBub3Qgb2JsaWdhdG9yeSB0byBhbHdheXMgYXR0YWNoIHRoZSBtb3N0IHNwZWNpZmljXG50YWcgcG9zc2libGUgdG8gYW4gZWxlbWVudFx1MjAxNGlmIHlvdXIgZ3JhbW1hciBjYW4ndCBlYXNpbHlcbmRpc3Rpbmd1aXNoIGEgY2VydGFpbiB0eXBlIG9mIGVsZW1lbnQgKHN1Y2ggYXMgYSBsb2NhbCB2YXJpYWJsZSksXG5pdCBpcyBva2F5IHRvIHN0eWxlIGl0IGFzIGl0cyBtb3JlIGdlbmVyYWwgdmFyaWFudCAoYSB2YXJpYWJsZSkuXG5cbkZvciB0YWdzIHRoYXQgZXh0ZW5kIHNvbWUgcGFyZW50IHRhZywgdGhlIGRvY3VtZW50YXRpb24gbGlua3MgdG9cbnRoZSBwYXJlbnQuXG4qL1xuY29uc3QgdGFncyA9IHtcbiAgICAvKipcbiAgICBBIGNvbW1lbnQuXG4gICAgKi9cbiAgICBjb21tZW50LFxuICAgIC8qKlxuICAgIEEgbGluZSBbY29tbWVudF0oI2hpZ2hsaWdodC50YWdzLmNvbW1lbnQpLlxuICAgICovXG4gICAgbGluZUNvbW1lbnQ6IHQoY29tbWVudCksXG4gICAgLyoqXG4gICAgQSBibG9jayBbY29tbWVudF0oI2hpZ2hsaWdodC50YWdzLmNvbW1lbnQpLlxuICAgICovXG4gICAgYmxvY2tDb21tZW50OiB0KGNvbW1lbnQpLFxuICAgIC8qKlxuICAgIEEgZG9jdW1lbnRhdGlvbiBbY29tbWVudF0oI2hpZ2hsaWdodC50YWdzLmNvbW1lbnQpLlxuICAgICovXG4gICAgZG9jQ29tbWVudDogdChjb21tZW50KSxcbiAgICAvKipcbiAgICBBbnkga2luZCBvZiBpZGVudGlmaWVyLlxuICAgICovXG4gICAgbmFtZSxcbiAgICAvKipcbiAgICBUaGUgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKSBvZiBhIHZhcmlhYmxlLlxuICAgICovXG4gICAgdmFyaWFibGVOYW1lOiB0KG5hbWUpLFxuICAgIC8qKlxuICAgIEEgdHlwZSBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpLlxuICAgICovXG4gICAgdHlwZU5hbWU6IHR5cGVOYW1lLFxuICAgIC8qKlxuICAgIEEgdGFnIG5hbWUgKHN1YnRhZyBvZiBbYHR5cGVOYW1lYF0oI2hpZ2hsaWdodC50YWdzLnR5cGVOYW1lKSkuXG4gICAgKi9cbiAgICB0YWdOYW1lOiB0KHR5cGVOYW1lKSxcbiAgICAvKipcbiAgICBBIHByb3BlcnR5IG9yIGZpZWxkIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkuXG4gICAgKi9cbiAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAvKipcbiAgICBBbiBhdHRyaWJ1dGUgbmFtZSAoc3VidGFnIG9mIFtgcHJvcGVydHlOYW1lYF0oI2hpZ2hsaWdodC50YWdzLnByb3BlcnR5TmFtZSkpLlxuICAgICovXG4gICAgYXR0cmlidXRlTmFtZTogdChwcm9wZXJ0eU5hbWUpLFxuICAgIC8qKlxuICAgIFRoZSBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpIG9mIGEgY2xhc3MuXG4gICAgKi9cbiAgICBjbGFzc05hbWU6IHQobmFtZSksXG4gICAgLyoqXG4gICAgQSBsYWJlbCBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpLlxuICAgICovXG4gICAgbGFiZWxOYW1lOiB0KG5hbWUpLFxuICAgIC8qKlxuICAgIEEgbmFtZXNwYWNlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkuXG4gICAgKi9cbiAgICBuYW1lc3BhY2U6IHQobmFtZSksXG4gICAgLyoqXG4gICAgVGhlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkgb2YgYSBtYWNyby5cbiAgICAqL1xuICAgIG1hY3JvTmFtZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBBIGxpdGVyYWwgdmFsdWUuXG4gICAgKi9cbiAgICBsaXRlcmFsLFxuICAgIC8qKlxuICAgIEEgc3RyaW5nIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCkuXG4gICAgKi9cbiAgICBzdHJpbmcsXG4gICAgLyoqXG4gICAgQSBkb2N1bWVudGF0aW9uIFtzdHJpbmddKCNoaWdobGlnaHQudGFncy5zdHJpbmcpLlxuICAgICovXG4gICAgZG9jU3RyaW5nOiB0KHN0cmluZyksXG4gICAgLyoqXG4gICAgQSBjaGFyYWN0ZXIgbGl0ZXJhbCAoc3VidGFnIG9mIFtzdHJpbmddKCNoaWdobGlnaHQudGFncy5zdHJpbmcpKS5cbiAgICAqL1xuICAgIGNoYXJhY3RlcjogdChzdHJpbmcpLFxuICAgIC8qKlxuICAgIEFuIGF0dHJpYnV0ZSB2YWx1ZSAoc3VidGFnIG9mIFtzdHJpbmddKCNoaWdobGlnaHQudGFncy5zdHJpbmcpKS5cbiAgICAqL1xuICAgIGF0dHJpYnV0ZVZhbHVlOiB0KHN0cmluZyksXG4gICAgLyoqXG4gICAgQSBudW1iZXIgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIG51bWJlcixcbiAgICAvKipcbiAgICBBbiBpbnRlZ2VyIFtudW1iZXJdKCNoaWdobGlnaHQudGFncy5udW1iZXIpIGxpdGVyYWwuXG4gICAgKi9cbiAgICBpbnRlZ2VyOiB0KG51bWJlciksXG4gICAgLyoqXG4gICAgQSBmbG9hdGluZy1wb2ludCBbbnVtYmVyXSgjaGlnaGxpZ2h0LnRhZ3MubnVtYmVyKSBsaXRlcmFsLlxuICAgICovXG4gICAgZmxvYXQ6IHQobnVtYmVyKSxcbiAgICAvKipcbiAgICBBIGJvb2xlYW4gW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIGJvb2w6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgUmVndWxhciBleHByZXNzaW9uIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCkuXG4gICAgKi9cbiAgICByZWdleHA6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgQW4gZXNjYXBlIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCksIGZvciBleGFtcGxlIGFcbiAgICBiYWNrc2xhc2ggZXNjYXBlIGluIGEgc3RyaW5nLlxuICAgICovXG4gICAgZXNjYXBlOiB0KGxpdGVyYWwpLFxuICAgIC8qKlxuICAgIEEgY29sb3IgW2xpdGVyYWxdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKS5cbiAgICAqL1xuICAgIGNvbG9yOiB0KGxpdGVyYWwpLFxuICAgIC8qKlxuICAgIEEgVVJMIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCkuXG4gICAgKi9cbiAgICB1cmw6IHQobGl0ZXJhbCksXG4gICAgLyoqXG4gICAgQSBsYW5ndWFnZSBrZXl3b3JkLlxuICAgICovXG4gICAga2V5d29yZCxcbiAgICAvKipcbiAgICBUaGUgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSBmb3IgdGhlIHNlbGYgb3IgdGhpc1xuICAgIG9iamVjdC5cbiAgICAqL1xuICAgIHNlbGY6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgVGhlIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgZm9yIG51bGwuXG4gICAgKi9cbiAgICBudWxsOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSBkZW5vdGluZyBzb21lIGF0b21pYyB2YWx1ZS5cbiAgICAqL1xuICAgIGF0b206IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIHRoYXQgcmVwcmVzZW50cyBhIHVuaXQuXG4gICAgKi9cbiAgICB1bml0OiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgbW9kaWZpZXIgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKS5cbiAgICAqL1xuICAgIG1vZGlmaWVyOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSB0aGF0IGFjdHMgYXMgYW4gb3BlcmF0b3IuXG4gICAgKi9cbiAgICBvcGVyYXRvcktleXdvcmQ6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBjb250cm9sLWZsb3cgcmVsYXRlZCBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpLlxuICAgICovXG4gICAgY29udHJvbEtleXdvcmQ6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIHRoYXQgZGVmaW5lcyBzb21ldGhpbmcuXG4gICAgKi9cbiAgICBkZWZpbml0aW9uS2V5d29yZDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgcmVsYXRlZCB0byBkZWZpbmluZyBvclxuICAgIGludGVyZmFjaW5nIHdpdGggbW9kdWxlcy5cbiAgICAqL1xuICAgIG1vZHVsZUtleXdvcmQ6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQW4gb3BlcmF0b3IuXG4gICAgKi9cbiAgICBvcGVyYXRvcixcbiAgICAvKipcbiAgICBBbiBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikgdGhhdCBkZXJlZmVyZW5jZXMgc29tZXRoaW5nLlxuICAgICovXG4gICAgZGVyZWZPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgQXJpdGhtZXRpYy1yZWxhdGVkIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIGFyaXRobWV0aWNPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgTG9naWNhbCBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICBsb2dpY09wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBCaXQgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgYml0d2lzZU9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBDb21wYXJpc29uIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIGNvbXBhcmVPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgW09wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpIHRoYXQgdXBkYXRlcyBpdHMgb3BlcmFuZC5cbiAgICAqL1xuICAgIHVwZGF0ZU9wZXJhdG9yOiB0KG9wZXJhdG9yKSxcbiAgICAvKipcbiAgICBbT3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikgdGhhdCBkZWZpbmVzIHNvbWV0aGluZy5cbiAgICAqL1xuICAgIGRlZmluaXRpb25PcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgVHlwZS1yZWxhdGVkIFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIHR5cGVPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgQ29udHJvbC1mbG93IFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIGNvbnRyb2xPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgUHJvZ3JhbSBvciBtYXJrdXAgcHVuY3R1YXRpb24uXG4gICAgKi9cbiAgICBwdW5jdHVhdGlvbixcbiAgICAvKipcbiAgICBbUHVuY3R1YXRpb25dKCNoaWdobGlnaHQudGFncy5wdW5jdHVhdGlvbikgdGhhdCBzZXBhcmF0ZXNcbiAgICB0aGluZ3MuXG4gICAgKi9cbiAgICBzZXBhcmF0b3I6IHQocHVuY3R1YXRpb24pLFxuICAgIC8qKlxuICAgIEJyYWNrZXQtc3R5bGUgW3B1bmN0dWF0aW9uXSgjaGlnaGxpZ2h0LnRhZ3MucHVuY3R1YXRpb24pLlxuICAgICovXG4gICAgYnJhY2tldCxcbiAgICAvKipcbiAgICBBbmdsZSBbYnJhY2tldHNdKCNoaWdobGlnaHQudGFncy5icmFja2V0KSAodXN1YWxseSBgPGAgYW5kIGA+YFxuICAgIHRva2VucykuXG4gICAgKi9cbiAgICBhbmdsZUJyYWNrZXQ6IHQoYnJhY2tldCksXG4gICAgLyoqXG4gICAgU3F1YXJlIFticmFja2V0c10oI2hpZ2hsaWdodC50YWdzLmJyYWNrZXQpICh1c3VhbGx5IGBbYCBhbmQgYF1gXG4gICAgdG9rZW5zKS5cbiAgICAqL1xuICAgIHNxdWFyZUJyYWNrZXQ6IHQoYnJhY2tldCksXG4gICAgLyoqXG4gICAgUGFyZW50aGVzZXMgKHVzdWFsbHkgYChgIGFuZCBgKWAgdG9rZW5zKS4gU3VidGFnIG9mXG4gICAgW2JyYWNrZXRdKCNoaWdobGlnaHQudGFncy5icmFja2V0KS5cbiAgICAqL1xuICAgIHBhcmVuOiB0KGJyYWNrZXQpLFxuICAgIC8qKlxuICAgIEJyYWNlcyAodXN1YWxseSBge2AgYW5kIGB9YCB0b2tlbnMpLiBTdWJ0YWcgb2ZcbiAgICBbYnJhY2tldF0oI2hpZ2hsaWdodC50YWdzLmJyYWNrZXQpLlxuICAgICovXG4gICAgYnJhY2U6IHQoYnJhY2tldCksXG4gICAgLyoqXG4gICAgQ29udGVudCwgZm9yIGV4YW1wbGUgcGxhaW4gdGV4dCBpbiBYTUwgb3IgbWFya3VwIGRvY3VtZW50cy5cbiAgICAqL1xuICAgIGNvbnRlbnQsXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IHJlcHJlc2VudHMgYSBoZWFkaW5nLlxuICAgICovXG4gICAgaGVhZGluZyxcbiAgICAvKipcbiAgICBBIGxldmVsIDEgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmcxOiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgMiBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzI6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCAzIFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nMzogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDQgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmc0OiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgNSBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzU6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCA2IFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nNjogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIHByb3NlIFtjb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgc2VwYXJhdG9yIChzdWNoIGFzIGEgaG9yaXpvbnRhbCBydWxlKS5cbiAgICAqL1xuICAgIGNvbnRlbnRTZXBhcmF0b3I6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IHJlcHJlc2VudHMgYSBsaXN0LlxuICAgICovXG4gICAgbGlzdDogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgcmVwcmVzZW50cyBhIHF1b3RlLlxuICAgICovXG4gICAgcXVvdGU6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IGlzIGVtcGhhc2l6ZWQuXG4gICAgKi9cbiAgICBlbXBoYXNpczogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaXMgc3R5bGVkIHN0cm9uZy5cbiAgICAqL1xuICAgIHN0cm9uZzogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaXMgcGFydCBvZiBhIGxpbmsuXG4gICAgKi9cbiAgICBsaW5rOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBpcyBzdHlsZWQgYXMgY29kZSBvclxuICAgIG1vbm9zcGFjZS5cbiAgICAqL1xuICAgIG1vbm9zcGFjZTogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaGFzIGEgc3RyaWtlLXRocm91Z2hcbiAgICBzdHlsZS5cbiAgICAqL1xuICAgIHN0cmlrZXRocm91Z2g6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgSW5zZXJ0ZWQgdGV4dCBpbiBhIGNoYW5nZS10cmFja2luZyBmb3JtYXQuXG4gICAgKi9cbiAgICBpbnNlcnRlZDogdCgpLFxuICAgIC8qKlxuICAgIERlbGV0ZWQgdGV4dC5cbiAgICAqL1xuICAgIGRlbGV0ZWQ6IHQoKSxcbiAgICAvKipcbiAgICBDaGFuZ2VkIHRleHQuXG4gICAgKi9cbiAgICBjaGFuZ2VkOiB0KCksXG4gICAgLyoqXG4gICAgQW4gaW52YWxpZCBvciB1bnN5bnRhY3RpYyBlbGVtZW50LlxuICAgICovXG4gICAgaW52YWxpZDogdCgpLFxuICAgIC8qKlxuICAgIE1ldGFkYXRhIG9yIG1ldGEtaW5zdHJ1Y3Rpb24uXG4gICAgKi9cbiAgICBtZXRhLFxuICAgIC8qKlxuICAgIFtNZXRhZGF0YV0oI2hpZ2hsaWdodC50YWdzLm1ldGEpIHRoYXQgYXBwbGllcyB0byB0aGUgZW50aXJlXG4gICAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBkb2N1bWVudE1ldGE6IHQobWV0YSksXG4gICAgLyoqXG4gICAgW01ldGFkYXRhXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSkgdGhhdCBhbm5vdGF0ZXMgb3IgYWRkc1xuICAgIGF0dHJpYnV0ZXMgdG8gYSBnaXZlbiBzeW50YWN0aWMgZWxlbWVudC5cbiAgICAqL1xuICAgIGFubm90YXRpb246IHQobWV0YSksXG4gICAgLyoqXG4gICAgUHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBvciBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlLiBTdWJ0YWcgb2ZcbiAgICBbbWV0YV0oI2hpZ2hsaWdodC50YWdzLm1ldGEpLlxuICAgICovXG4gICAgcHJvY2Vzc2luZ0luc3RydWN0aW9uOiB0KG1ldGEpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXQgaW5kaWNhdGVzIHRoYXQgYVxuICAgIGdpdmVuIGVsZW1lbnQgaXMgYmVpbmcgZGVmaW5lZC4gRXhwZWN0ZWQgdG8gYmUgdXNlZCB3aXRoIHRoZVxuICAgIHZhcmlvdXMgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKSB0YWdzLlxuICAgICovXG4gICAgZGVmaW5pdGlvbjogVGFnLmRlZmluZU1vZGlmaWVyKFwiZGVmaW5pdGlvblwiKSxcbiAgICAvKipcbiAgICBbTW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB0aGF0IGluZGljYXRlcyB0aGF0XG4gICAgc29tZXRoaW5nIGlzIGNvbnN0YW50LiBNb3N0bHkgZXhwZWN0ZWQgdG8gYmUgdXNlZCB3aXRoXG4gICAgW3ZhcmlhYmxlIG5hbWVzXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKS5cbiAgICAqL1xuICAgIGNvbnN0YW50OiBUYWcuZGVmaW5lTW9kaWZpZXIoXCJjb25zdGFudFwiKSxcbiAgICAvKipcbiAgICBbTW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB1c2VkIHRvIGluZGljYXRlIHRoYXRcbiAgICBhIFt2YXJpYWJsZV0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSkgb3IgW3Byb3BlcnR5XG4gICAgbmFtZV0oI2hpZ2hsaWdodC50YWdzLnByb3BlcnR5TmFtZSkgaXMgYmVpbmcgY2FsbGVkIG9yIGRlZmluZWRcbiAgICBhcyBhIGZ1bmN0aW9uLlxuICAgICovXG4gICAgZnVuY3Rpb246IFRhZy5kZWZpbmVNb2RpZmllcihcImZ1bmN0aW9uXCIpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG9cbiAgICBbbmFtZXNdKCNoaWdobGlnaHQudGFncy5uYW1lKSB0byBpbmRpY2F0ZSB0aGF0IHRoZXkgYmVsb25nIHRvXG4gICAgdGhlIGxhbmd1YWdlJ3Mgc3RhbmRhcmQgZW52aXJvbm1lbnQuXG4gICAgKi9cbiAgICBzdGFuZGFyZDogVGFnLmRlZmluZU1vZGlmaWVyKFwic3RhbmRhcmRcIiksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdCBpbmRpY2F0ZXMgYSBnaXZlblxuICAgIFtuYW1lc10oI2hpZ2hsaWdodC50YWdzLm5hbWUpIGlzIGxvY2FsIHRvIHNvbWUgc2NvcGUuXG4gICAgKi9cbiAgICBsb2NhbDogVGFnLmRlZmluZU1vZGlmaWVyKFwibG9jYWxcIiksXG4gICAgLyoqXG4gICAgQSBnZW5lcmljIHZhcmlhbnQgW21vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdFxuICAgIGNhbiBiZSB1c2VkIHRvIHRhZyBsYW5ndWFnZS1zcGVjaWZpYyBhbHRlcm5hdGl2ZSB2YXJpYW50cyBvZlxuICAgIHNvbWUgY29tbW9uIHRhZy4gSXQgaXMgcmVjb21tZW5kZWQgZm9yIHRoZW1lcyB0byBkZWZpbmUgc3BlY2lhbFxuICAgIGZvcm1zIG9mIGF0IGxlYXN0IHRoZSBbc3RyaW5nXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKSBhbmRcbiAgICBbdmFyaWFibGUgbmFtZV0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSkgdGFncywgc2luY2UgdGhvc2VcbiAgICBjb21lIHVwIGEgbG90LlxuICAgICovXG4gICAgc3BlY2lhbDogVGFnLmRlZmluZU1vZGlmaWVyKFwic3BlY2lhbFwiKVxufTtcbmZvciAobGV0IG5hbWUgaW4gdGFncykge1xuICAgIGxldCB2YWwgPSB0YWdzW25hbWVdO1xuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBUYWcpXG4gICAgICAgIHZhbC5uYW1lID0gbmFtZTtcbn1cbi8qKlxuVGhpcyBpcyBhIGhpZ2hsaWdodGVyIHRoYXQgYWRkcyBzdGFibGUsIHByZWRpY3RhYmxlIGNsYXNzZXMgdG9cbnRva2VucywgZm9yIHN0eWxpbmcgd2l0aCBleHRlcm5hbCBDU1MuXG5cblRoZSBmb2xsb3dpbmcgdGFncyBhcmUgbWFwcGVkIHRvIHRoZWlyIG5hbWUgcHJlZml4ZWQgd2l0aCBgXCJ0b2stXCJgXG4oZm9yIGV4YW1wbGUgYFwidG9rLWNvbW1lbnRcImApOlxuXG4qIFtgbGlua2BdKCNoaWdobGlnaHQudGFncy5saW5rKVxuKiBbYGhlYWRpbmdgXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZylcbiogW2BlbXBoYXNpc2BdKCNoaWdobGlnaHQudGFncy5lbXBoYXNpcylcbiogW2BzdHJvbmdgXSgjaGlnaGxpZ2h0LnRhZ3Muc3Ryb25nKVxuKiBbYGtleXdvcmRgXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZClcbiogW2BhdG9tYF0oI2hpZ2hsaWdodC50YWdzLmF0b20pXG4qIFtgYm9vbGBdKCNoaWdobGlnaHQudGFncy5ib29sKVxuKiBbYHVybGBdKCNoaWdobGlnaHQudGFncy51cmwpXG4qIFtgbGFiZWxOYW1lYF0oI2hpZ2hsaWdodC50YWdzLmxhYmVsTmFtZSlcbiogW2BpbnNlcnRlZGBdKCNoaWdobGlnaHQudGFncy5pbnNlcnRlZClcbiogW2BkZWxldGVkYF0oI2hpZ2hsaWdodC50YWdzLmRlbGV0ZWQpXG4qIFtgbGl0ZXJhbGBdKCNoaWdobGlnaHQudGFncy5saXRlcmFsKVxuKiBbYHN0cmluZ2BdKCNoaWdobGlnaHQudGFncy5zdHJpbmcpXG4qIFtgbnVtYmVyYF0oI2hpZ2hsaWdodC50YWdzLm51bWJlcilcbiogW2B2YXJpYWJsZU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKVxuKiBbYHR5cGVOYW1lYF0oI2hpZ2hsaWdodC50YWdzLnR5cGVOYW1lKVxuKiBbYG5hbWVzcGFjZWBdKCNoaWdobGlnaHQudGFncy5uYW1lc3BhY2UpXG4qIFtgY2xhc3NOYW1lYF0oI2hpZ2hsaWdodC50YWdzLmNsYXNzTmFtZSlcbiogW2BtYWNyb05hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MubWFjcm9OYW1lKVxuKiBbYHByb3BlcnR5TmFtZWBdKCNoaWdobGlnaHQudGFncy5wcm9wZXJ0eU5hbWUpXG4qIFtgb3BlcmF0b3JgXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpXG4qIFtgY29tbWVudGBdKCNoaWdobGlnaHQudGFncy5jb21tZW50KVxuKiBbYG1ldGFgXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSlcbiogW2BwdW5jdHVhdGlvbmBdKCNoaWdobGlnaHQudGFncy5wdW5jdHVhdGlvbilcbiogW2BpbnZhbGlkYF0oI2hpZ2hsaWdodC50YWdzLmludmFsaWQpXG5cbkluIGFkZGl0aW9uLCB0aGVzZSBtYXBwaW5ncyBhcmUgcHJvdmlkZWQ6XG5cbiogW2ByZWdleHBgXSgjaGlnaGxpZ2h0LnRhZ3MucmVnZXhwKSxcbiAgW2Blc2NhcGVgXSgjaGlnaGxpZ2h0LnRhZ3MuZXNjYXBlKSwgYW5kXG4gIFtgc3BlY2lhbGBdKCNoaWdobGlnaHQudGFncy5zcGVjaWFsKVtgKHN0cmluZylgXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKVxuICBhcmUgbWFwcGVkIHRvIGBcInRvay1zdHJpbmcyXCJgXG4qIFtgc3BlY2lhbGBdKCNoaWdobGlnaHQudGFncy5zcGVjaWFsKVtgKHZhcmlhYmxlTmFtZSlgXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKVxuICB0byBgXCJ0b2stdmFyaWFibGVOYW1lMlwiYFxuKiBbYGxvY2FsYF0oI2hpZ2hsaWdodC50YWdzLmxvY2FsKVtgKHZhcmlhYmxlTmFtZSlgXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKVxuICB0byBgXCJ0b2stdmFyaWFibGVOYW1lIHRvay1sb2NhbFwiYFxuKiBbYGRlZmluaXRpb25gXSgjaGlnaGxpZ2h0LnRhZ3MuZGVmaW5pdGlvbilbYCh2YXJpYWJsZU5hbWUpYF0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSlcbiAgdG8gYFwidG9rLXZhcmlhYmxlTmFtZSB0b2stZGVmaW5pdGlvblwiYFxuKiBbYGRlZmluaXRpb25gXSgjaGlnaGxpZ2h0LnRhZ3MuZGVmaW5pdGlvbilbYChwcm9wZXJ0eU5hbWUpYF0oI2hpZ2hsaWdodC50YWdzLnByb3BlcnR5TmFtZSlcbiAgdG8gYFwidG9rLXByb3BlcnR5TmFtZSB0b2stZGVmaW5pdGlvblwiYFxuKi9cbmNvbnN0IGNsYXNzSGlnaGxpZ2h0ZXIgPSB0YWdIaWdobGlnaHRlcihbXG4gICAgeyB0YWc6IHRhZ3MubGluaywgY2xhc3M6IFwidG9rLWxpbmtcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmhlYWRpbmcsIGNsYXNzOiBcInRvay1oZWFkaW5nXCIgfSxcbiAgICB7IHRhZzogdGFncy5lbXBoYXNpcywgY2xhc3M6IFwidG9rLWVtcGhhc2lzXCIgfSxcbiAgICB7IHRhZzogdGFncy5zdHJvbmcsIGNsYXNzOiBcInRvay1zdHJvbmdcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmtleXdvcmQsIGNsYXNzOiBcInRvay1rZXl3b3JkXCIgfSxcbiAgICB7IHRhZzogdGFncy5hdG9tLCBjbGFzczogXCJ0b2stYXRvbVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuYm9vbCwgY2xhc3M6IFwidG9rLWJvb2xcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnVybCwgY2xhc3M6IFwidG9rLXVybFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubGFiZWxOYW1lLCBjbGFzczogXCJ0b2stbGFiZWxOYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5pbnNlcnRlZCwgY2xhc3M6IFwidG9rLWluc2VydGVkXCIgfSxcbiAgICB7IHRhZzogdGFncy5kZWxldGVkLCBjbGFzczogXCJ0b2stZGVsZXRlZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubGl0ZXJhbCwgY2xhc3M6IFwidG9rLWxpdGVyYWxcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnN0cmluZywgY2xhc3M6IFwidG9rLXN0cmluZ1wiIH0sXG4gICAgeyB0YWc6IHRhZ3MubnVtYmVyLCBjbGFzczogXCJ0b2stbnVtYmVyXCIgfSxcbiAgICB7IHRhZzogW3RhZ3MucmVnZXhwLCB0YWdzLmVzY2FwZSwgdGFncy5zcGVjaWFsKHRhZ3Muc3RyaW5nKV0sIGNsYXNzOiBcInRvay1zdHJpbmcyXCIgfSxcbiAgICB7IHRhZzogdGFncy52YXJpYWJsZU5hbWUsIGNsYXNzOiBcInRvay12YXJpYWJsZU5hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmxvY2FsKHRhZ3MudmFyaWFibGVOYW1lKSwgY2xhc3M6IFwidG9rLXZhcmlhYmxlTmFtZSB0b2stbG9jYWxcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmRlZmluaXRpb24odGFncy52YXJpYWJsZU5hbWUpLCBjbGFzczogXCJ0b2stdmFyaWFibGVOYW1lIHRvay1kZWZpbml0aW9uXCIgfSxcbiAgICB7IHRhZzogdGFncy5zcGVjaWFsKHRhZ3MudmFyaWFibGVOYW1lKSwgY2xhc3M6IFwidG9rLXZhcmlhYmxlTmFtZTJcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmRlZmluaXRpb24odGFncy5wcm9wZXJ0eU5hbWUpLCBjbGFzczogXCJ0b2stcHJvcGVydHlOYW1lIHRvay1kZWZpbml0aW9uXCIgfSxcbiAgICB7IHRhZzogdGFncy50eXBlTmFtZSwgY2xhc3M6IFwidG9rLXR5cGVOYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5uYW1lc3BhY2UsIGNsYXNzOiBcInRvay1uYW1lc3BhY2VcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmNsYXNzTmFtZSwgY2xhc3M6IFwidG9rLWNsYXNzTmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubWFjcm9OYW1lLCBjbGFzczogXCJ0b2stbWFjcm9OYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5wcm9wZXJ0eU5hbWUsIGNsYXNzOiBcInRvay1wcm9wZXJ0eU5hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm9wZXJhdG9yLCBjbGFzczogXCJ0b2stb3BlcmF0b3JcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmNvbW1lbnQsIGNsYXNzOiBcInRvay1jb21tZW50XCIgfSxcbiAgICB7IHRhZzogdGFncy5tZXRhLCBjbGFzczogXCJ0b2stbWV0YVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaW52YWxpZCwgY2xhc3M6IFwidG9rLWludmFsaWRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnB1bmN0dWF0aW9uLCBjbGFzczogXCJ0b2stcHVuY3R1YXRpb25cIiB9XG5dKTtcblxuZXhwb3J0IHsgVGFnLCBjbGFzc0hpZ2hsaWdodGVyLCBnZXRTdHlsZVRhZ3MsIGhpZ2hsaWdodENvZGUsIGhpZ2hsaWdodFRyZWUsIHN0eWxlVGFncywgdGFnSGlnaGxpZ2h0ZXIsIHRhZ3MgfTtcbiIsICJpbXBvcnQgeyBOb2RlUHJvcCwgSXRlck1vZGUsIFRyZWUsIFRyZWVGcmFnbWVudCwgUGFyc2VyLCBOb2RlVHlwZSwgTm9kZVNldCB9IGZyb20gJ0BsZXplci9jb21tb24nO1xuaW1wb3J0IHsgU3RhdGVFZmZlY3QsIFN0YXRlRmllbGQsIEZhY2V0LCBFZGl0b3JTdGF0ZSwgY291bnRDb2x1bW4sIGNvbWJpbmVDb25maWcsIFJhbmdlU2V0LCBSYW5nZVNldEJ1aWxkZXIsIFByZWMgfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBWaWV3UGx1Z2luLCBsb2dFeGNlcHRpb24sIEVkaXRvclZpZXcsIERlY29yYXRpb24sIFdpZGdldFR5cGUsIGd1dHRlciwgR3V0dGVyTWFya2VyLCBEaXJlY3Rpb24gfSBmcm9tICdAY29kZW1pcnJvci92aWV3JztcbmltcG9ydCB7IHRhZ3MsIHRhZ0hpZ2hsaWdodGVyLCBoaWdobGlnaHRUcmVlIH0gZnJvbSAnQGxlemVyL2hpZ2hsaWdodCc7XG5pbXBvcnQgeyBTdHlsZU1vZHVsZSB9IGZyb20gJ3N0eWxlLW1vZCc7XG5cbnZhciBfYTtcbi8qKlxuTm9kZSBwcm9wIHN0b3JlZCBpbiBhIHBhcnNlcidzIHRvcCBzeW50YXggbm9kZSB0byBwcm92aWRlIHRoZVxuZmFjZXQgdGhhdCBzdG9yZXMgbGFuZ3VhZ2Utc3BlY2lmaWMgZGF0YSBmb3IgdGhhdCBsYW5ndWFnZS5cbiovXG5jb25zdCBsYW5ndWFnZURhdGFQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLyoqXG5IZWxwZXIgZnVuY3Rpb24gdG8gZGVmaW5lIGEgZmFjZXQgKHRvIGJlIGFkZGVkIHRvIHRoZSB0b3Agc3ludGF4XG5ub2RlKHMpIGZvciBhIGxhbmd1YWdlIHZpYVxuW2BsYW5ndWFnZURhdGFQcm9wYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5sYW5ndWFnZURhdGFQcm9wKSksIHRoYXQgd2lsbCBiZVxudXNlZCB0byBhc3NvY2lhdGUgbGFuZ3VhZ2UgZGF0YSB3aXRoIHRoZSBsYW5ndWFnZS4gWW91XG5wcm9iYWJseSBvbmx5IG5lZWQgdGhpcyB3aGVuIHN1YmNsYXNzaW5nXG5bYExhbmd1YWdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZSkuXG4qL1xuZnVuY3Rpb24gZGVmaW5lTGFuZ3VhZ2VGYWNldChiYXNlRGF0YSkge1xuICAgIHJldHVybiBGYWNldC5kZWZpbmUoe1xuICAgICAgICBjb21iaW5lOiBiYXNlRGF0YSA/IHZhbHVlcyA9PiB2YWx1ZXMuY29uY2F0KGJhc2VEYXRhKSA6IHVuZGVmaW5lZFxuICAgIH0pO1xufVxuLyoqXG5TeW50YXggbm9kZSBwcm9wIHVzZWQgdG8gcmVnaXN0ZXIgc3VibGFuZ3VhZ2VzLiBTaG91bGQgYmUgYWRkZWQgdG9cbnRoZSB0b3AgbGV2ZWwgbm9kZSB0eXBlIGZvciB0aGUgbGFuZ3VhZ2UuXG4qL1xuY29uc3Qgc3VibGFuZ3VhZ2VQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLyoqXG5BIGxhbmd1YWdlIG9iamVjdCBtYW5hZ2VzIHBhcnNpbmcgYW5kIHBlci1sYW5ndWFnZVxuW21ldGFkYXRhXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YUF0KS4gUGFyc2UgZGF0YSBpc1xubWFuYWdlZCBhcyBhIFtMZXplcl0oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldCkgdHJlZS4gVGhlIGNsYXNzXG5jYW4gYmUgdXNlZCBkaXJlY3RseSwgdmlhIHRoZSBbYExSTGFuZ3VhZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxSTGFuZ3VhZ2UpXG5zdWJjbGFzcyBmb3IgW0xlemVyXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0LykgTFIgcGFyc2Vycywgb3JcbnZpYSB0aGUgW2BTdHJlYW1MYW5ndWFnZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuU3RyZWFtTGFuZ3VhZ2UpIHN1YmNsYXNzXG5mb3Igc3RyZWFtIHBhcnNlcnMuXG4qL1xuY2xhc3MgTGFuZ3VhZ2Uge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIGxhbmd1YWdlIG9iamVjdC4gSWYgeW91IG5lZWQgdG8gaW52b2tlIHRoaXNcbiAgICBkaXJlY3RseSwgZmlyc3QgZGVmaW5lIGEgZGF0YSBmYWNldCB3aXRoXG4gICAgW2BkZWZpbmVMYW5ndWFnZUZhY2V0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5kZWZpbmVMYW5ndWFnZUZhY2V0KSwgYW5kIHRoZW5cbiAgICBjb25maWd1cmUgeW91ciBwYXJzZXIgdG8gW2F0dGFjaF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5sYW5ndWFnZURhdGFQcm9wKSBpdFxuICAgIHRvIHRoZSBsYW5ndWFnZSdzIG91dGVyIHN5bnRheCBub2RlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIFtsYW5ndWFnZSBkYXRhXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YUF0KSBmYWNldFxuICAgIHVzZWQgZm9yIHRoaXMgbGFuZ3VhZ2UuXG4gICAgKi9cbiAgICBkYXRhLCBwYXJzZXIsIGV4dHJhRXh0ZW5zaW9ucyA9IFtdLCBcbiAgICAvKipcbiAgICBBIGxhbmd1YWdlIG5hbWUuXG4gICAgKi9cbiAgICBuYW1lID0gXCJcIikge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAvLyBLbHVkZ2UgdG8gZGVmaW5lIEVkaXRvclN0YXRlLnRyZWUgYXMgYSBkZWJ1Z2dpbmcgaGVscGVyLFxuICAgICAgICAvLyB3aXRob3V0IHRoZSBFZGl0b3JTdGF0ZSBwYWNrYWdlIGFjdHVhbGx5IGtub3dpbmcgYWJvdXRcbiAgICAgICAgLy8gbGFuZ3VhZ2VzIGFuZCBsZXplciB0cmVlcy5cbiAgICAgICAgaWYgKCFFZGl0b3JTdGF0ZS5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJ0cmVlXCIpKVxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVkaXRvclN0YXRlLnByb3RvdHlwZSwgXCJ0cmVlXCIsIHsgZ2V0KCkgeyByZXR1cm4gc3ludGF4VHJlZSh0aGlzKTsgfSB9KTtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gW1xuICAgICAgICAgICAgbGFuZ3VhZ2Uub2YodGhpcyksXG4gICAgICAgICAgICBFZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGEub2YoKHN0YXRlLCBwb3MsIHNpZGUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdG9wID0gdG9wTm9kZUF0KHN0YXRlLCBwb3MsIHNpZGUpLCBkYXRhID0gdG9wLnR5cGUucHJvcChsYW5ndWFnZURhdGFQcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICBsZXQgYmFzZSA9IHN0YXRlLmZhY2V0KGRhdGEpLCBzdWIgPSB0b3AudHlwZS5wcm9wKHN1Ymxhbmd1YWdlUHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKHN1Yikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5uZXJOb2RlID0gdG9wLnJlc29sdmUocG9zIC0gdG9wLmZyb20sIHNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdWJsYW5nIG9mIHN1YilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJsYW5nLnRlc3QoaW5uZXJOb2RlLCBzdGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHN0YXRlLmZhY2V0KHN1YmxhbmcuZmFjZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJsYW5nLnR5cGUgPT0gXCJyZXBsYWNlXCIgPyBkYXRhIDogZGF0YS5jb25jYXQoYmFzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXS5jb25jYXQoZXh0cmFFeHRlbnNpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUXVlcnkgd2hldGhlciB0aGlzIGxhbmd1YWdlIGlzIGFjdGl2ZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBpc0FjdGl2ZUF0KHN0YXRlLCBwb3MsIHNpZGUgPSAtMSkge1xuICAgICAgICByZXR1cm4gdG9wTm9kZUF0KHN0YXRlLCBwb3MsIHNpZGUpLnR5cGUucHJvcChsYW5ndWFnZURhdGFQcm9wKSA9PSB0aGlzLmRhdGE7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGRvY3VtZW50IHJlZ2lvbnMgdGhhdCB3ZXJlIHBhcnNlZCB1c2luZyB0aGlzIGxhbmd1YWdlLlxuICAgIFRoZSByZXR1cm5lZCByZWdpb25zIHdpbGwgX2luY2x1ZGVfIGFueSBuZXN0ZWQgbGFuZ3VhZ2VzIHJvb3RlZFxuICAgIGluIHRoaXMgbGFuZ3VhZ2UsIHdoZW4gdGhvc2UgZXhpc3QuXG4gICAgKi9cbiAgICBmaW5kUmVnaW9ucyhzdGF0ZSkge1xuICAgICAgICBsZXQgbGFuZyA9IHN0YXRlLmZhY2V0KGxhbmd1YWdlKTtcbiAgICAgICAgaWYgKChsYW5nID09PSBudWxsIHx8IGxhbmcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhbmcuZGF0YSkgPT0gdGhpcy5kYXRhKVxuICAgICAgICAgICAgcmV0dXJuIFt7IGZyb206IDAsIHRvOiBzdGF0ZS5kb2MubGVuZ3RoIH1dO1xuICAgICAgICBpZiAoIWxhbmcgfHwgIWxhbmcuYWxsb3dzTmVzdGluZylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgZXhwbG9yZSA9ICh0cmVlLCBmcm9tKSA9PiB7XG4gICAgICAgICAgICBpZiAodHJlZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgZnJvbSwgdG86IGZyb20gKyB0cmVlLmxlbmd0aCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbW91bnQgPSB0cmVlLnByb3AoTm9kZVByb3AubW91bnRlZCk7XG4gICAgICAgICAgICBpZiAobW91bnQpIHtcbiAgICAgICAgICAgICAgICBpZiAobW91bnQudHJlZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW91bnQub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgbW91bnQub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGZyb206IHIuZnJvbSArIGZyb20sIHRvOiByLnRvICsgZnJvbSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBmcm9tOiBmcm9tLCB0bzogZnJvbSArIHRyZWUubGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vdW50Lm92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSByZXN1bHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBleHBsb3JlKG1vdW50LnRyZWUsIG1vdW50Lm92ZXJsYXlbMF0uZnJvbSArIGZyb20pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IHNpemUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmVlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoID0gdHJlZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggaW5zdGFuY2VvZiBUcmVlKVxuICAgICAgICAgICAgICAgICAgICBleHBsb3JlKGNoLCB0cmVlLnBvc2l0aW9uc1tpXSArIGZyb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBleHBsb3JlKHN5bnRheFRyZWUoc3RhdGUpLCAwKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBsYW5ndWFnZSBhbGxvd3MgbmVzdGVkIGxhbmd1YWdlcy4gVGhlXG4gICAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUuXG4gICAgKi9cbiAgICBnZXQgYWxsb3dzTmVzdGluZygpIHsgcmV0dXJuIHRydWU7IH1cbn1cbi8qKlxuQGludGVybmFsXG4qL1xuTGFuZ3VhZ2Uuc2V0U3RhdGUgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG5mdW5jdGlvbiB0b3BOb2RlQXQoc3RhdGUsIHBvcywgc2lkZSkge1xuICAgIGxldCB0b3BMYW5nID0gc3RhdGUuZmFjZXQobGFuZ3VhZ2UpLCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSkudG9wTm9kZTtcbiAgICBpZiAoIXRvcExhbmcgfHwgdG9wTGFuZy5hbGxvd3NOZXN0aW5nKSB7XG4gICAgICAgIGZvciAobGV0IG5vZGUgPSB0cmVlOyBub2RlOyBub2RlID0gbm9kZS5lbnRlcihwb3MsIHNpZGUsIEl0ZXJNb2RlLkV4Y2x1ZGVCdWZmZXJzKSlcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUuaXNUb3ApXG4gICAgICAgICAgICAgICAgdHJlZSA9IG5vZGU7XG4gICAgfVxuICAgIHJldHVybiB0cmVlO1xufVxuLyoqXG5BIHN1YmNsYXNzIG9mIFtgTGFuZ3VhZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSBmb3IgdXNlIHdpdGggTGV6ZXJcbltMUiBwYXJzZXJzXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0L2RvY3MvcmVmI2xyLkxSUGFyc2VyKVxucGFyc2Vycy5cbiovXG5jbGFzcyBMUkxhbmd1YWdlIGV4dGVuZHMgTGFuZ3VhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHBhcnNlciwgbmFtZSkge1xuICAgICAgICBzdXBlcihkYXRhLCBwYXJzZXIsIFtdLCBuYW1lKTtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIGxhbmd1YWdlIGZyb20gYSBwYXJzZXIuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHNwZWMpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBkZWZpbmVMYW5ndWFnZUZhY2V0KHNwZWMubGFuZ3VhZ2VEYXRhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMUkxhbmd1YWdlKGRhdGEsIHNwZWMucGFyc2VyLmNvbmZpZ3VyZSh7XG4gICAgICAgICAgICBwcm9wczogW2xhbmd1YWdlRGF0YVByb3AuYWRkKHR5cGUgPT4gdHlwZS5pc1RvcCA/IGRhdGEgOiB1bmRlZmluZWQpXVxuICAgICAgICB9KSwgc3BlYy5uYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgbGFuZ3VhZ2Ugd2l0aCBhIHJlY29uZmlndXJlZFxuICAgIHZlcnNpb24gb2YgaXRzIHBhcnNlciBhbmQgb3B0aW9uYWxseSBhIG5ldyBuYW1lLlxuICAgICovXG4gICAgY29uZmlndXJlKG9wdGlvbnMsIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMUkxhbmd1YWdlKHRoaXMuZGF0YSwgdGhpcy5wYXJzZXIuY29uZmlndXJlKG9wdGlvbnMpLCBuYW1lIHx8IHRoaXMubmFtZSk7XG4gICAgfVxuICAgIGdldCBhbGxvd3NOZXN0aW5nKCkgeyByZXR1cm4gdGhpcy5wYXJzZXIuaGFzV3JhcHBlcnMoKTsgfVxufVxuLyoqXG5HZXQgdGhlIHN5bnRheCB0cmVlIGZvciBhIHN0YXRlLCB3aGljaCBpcyB0aGUgY3VycmVudCAocG9zc2libHlcbmluY29tcGxldGUpIHBhcnNlIHRyZWUgb2YgdGhlIGFjdGl2ZVxuW2xhbmd1YWdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSwgb3IgdGhlIGVtcHR5IHRyZWUgaWYgdGhlcmUgaXMgbm9cbmxhbmd1YWdlIGF2YWlsYWJsZS5cbiovXG5mdW5jdGlvbiBzeW50YXhUcmVlKHN0YXRlKSB7XG4gICAgbGV0IGZpZWxkID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUsIGZhbHNlKTtcbiAgICByZXR1cm4gZmllbGQgPyBmaWVsZC50cmVlIDogVHJlZS5lbXB0eTtcbn1cbi8qKlxuVHJ5IHRvIGdldCBhIHBhcnNlIHRyZWUgdGhhdCBzcGFucyBhdCBsZWFzdCB1cCB0byBgdXB0b2AuIFRoZVxubWV0aG9kIHdpbGwgZG8gYXQgbW9zdCBgdGltZW91dGAgbWlsbGlzZWNvbmRzIG9mIHdvcmsgdG8gcGFyc2VcbnVwIHRvIHRoYXQgcG9pbnQgaWYgdGhlIHRyZWUgaXNuJ3QgYWxyZWFkeSBhdmFpbGFibGUuXG4qL1xuZnVuY3Rpb24gZW5zdXJlU3ludGF4VHJlZShzdGF0ZSwgdXB0bywgdGltZW91dCA9IDUwKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBwYXJzZSA9IChfYSA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlLCBmYWxzZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb250ZXh0O1xuICAgIGlmICghcGFyc2UpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBvbGRWaWVwb3J0ID0gcGFyc2Uudmlld3BvcnQ7XG4gICAgcGFyc2UudXBkYXRlVmlld3BvcnQoeyBmcm9tOiAwLCB0bzogdXB0byB9KTtcbiAgICBsZXQgcmVzdWx0ID0gcGFyc2UuaXNEb25lKHVwdG8pIHx8IHBhcnNlLndvcmsodGltZW91dCwgdXB0bykgPyBwYXJzZS50cmVlIDogbnVsbDtcbiAgICBwYXJzZS51cGRhdGVWaWV3cG9ydChvbGRWaWVwb3J0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5RdWVyaWVzIHdoZXRoZXIgdGhlcmUgaXMgYSBmdWxsIHN5bnRheCB0cmVlIGF2YWlsYWJsZSB1cCB0byB0aGVcbmdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLiBJZiB0aGVyZSBpc24ndCwgdGhlIGJhY2tncm91bmQgcGFyc2VcbnByb2Nlc3MgX21pZ2h0XyBzdGlsbCBiZSB3b3JraW5nIGFuZCB1cGRhdGUgdGhlIHRyZWUgZnVydGhlciwgYnV0XG50aGVyZSBpcyBubyBndWFyYW50ZWUgb2YgdGhhdFx1MjAxNHRoZSBwYXJzZXIgd2lsbCBbc3RvcFxud29ya2luZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5zeW50YXhQYXJzZXJSdW5uaW5nKSB3aGVuIGl0IGhhcyBzcGVudCBhXG5jZXJ0YWluIGFtb3VudCBvZiB0aW1lIG9yIGhhcyBtb3ZlZCBiZXlvbmQgdGhlIHZpc2libGUgdmlld3BvcnQuXG5BbHdheXMgcmV0dXJucyBmYWxzZSBpZiBubyBsYW5ndWFnZSBoYXMgYmVlbiBlbmFibGVkLlxuKi9cbmZ1bmN0aW9uIHN5bnRheFRyZWVBdmFpbGFibGUoc3RhdGUsIHVwdG8gPSBzdGF0ZS5kb2MubGVuZ3RoKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoKF9hID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUsIGZhbHNlKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbnRleHQuaXNEb25lKHVwdG8pKSB8fCBmYWxzZTtcbn1cbi8qKlxuTW92ZSBwYXJzaW5nIGZvcndhcmQsIGFuZCB1cGRhdGUgdGhlIGVkaXRvciBzdGF0ZSBhZnRlcndhcmRzIHRvXG5yZWZsZWN0IHRoZSBuZXcgdHJlZS4gV2lsbCB3b3JrIGZvciBhdCBtb3N0IGB0aW1lb3V0YFxubWlsbGlzZWNvbmRzLiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhcnNlciBtYW5hZ2VkIGdldCB0byB0aGUgZ2l2ZW5cbnBvc2l0aW9uIGluIHRoYXQgdGltZS5cbiovXG5mdW5jdGlvbiBmb3JjZVBhcnNpbmcodmlldywgdXB0byA9IHZpZXcudmlld3BvcnQudG8sIHRpbWVvdXQgPSAxMDApIHtcbiAgICBsZXQgc3VjY2VzcyA9IGVuc3VyZVN5bnRheFRyZWUodmlldy5zdGF0ZSwgdXB0bywgdGltZW91dCk7XG4gICAgaWYgKHN1Y2Nlc3MgIT0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKSlcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7fSk7XG4gICAgcmV0dXJuICEhc3VjY2Vzcztcbn1cbi8qKlxuVGVsbHMgeW91IHdoZXRoZXIgdGhlIGxhbmd1YWdlIHBhcnNlciBpcyBwbGFubmluZyB0byBkbyBtb3JlXG5wYXJzaW5nIHdvcmsgKGluIGEgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgIHBzZXVkby10aHJlYWQpIG9yIGhhc1xuc3RvcHBlZCBydW5uaW5nLCBlaXRoZXIgYmVjYXVzZSBpdCBwYXJzZWQgdGhlIGVudGlyZSBkb2N1bWVudCxcbmJlY2F1c2UgaXQgc3BlbnQgdG9vIG11Y2ggdGltZSBhbmQgd2FzIGN1dCBvZmYsIG9yIGJlY2F1c2UgdGhlcmVcbmlzIG5vIGxhbmd1YWdlIHBhcnNlciBlbmFibGVkLlxuKi9cbmZ1bmN0aW9uIHN5bnRheFBhcnNlclJ1bm5pbmcodmlldykge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKHBhcnNlV29ya2VyKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzV29ya2luZygpKSB8fCBmYWxzZTtcbn1cbi8qKlxuTGV6ZXItc3R5bGVcbltgSW5wdXRgXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0L2RvY3MvcmVmI2NvbW1vbi5JbnB1dClcbm9iamVjdCBmb3IgYSBbYFRleHRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHQpIG9iamVjdC5cbiovXG5jbGFzcyBEb2NJbnB1dCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGlucHV0IG9iamVjdCBmb3IgdGhlIGdpdmVuIGRvY3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoZG9jKSB7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmN1cnNvclBvcyA9IDA7XG4gICAgICAgIHRoaXMuc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBkb2MuaXRlcigpO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5kb2MubGVuZ3RoOyB9XG4gICAgc3luY1RvKHBvcykge1xuICAgICAgICB0aGlzLnN0cmluZyA9IHRoaXMuY3Vyc29yLm5leHQocG9zIC0gdGhpcy5jdXJzb3JQb3MpLnZhbHVlO1xuICAgICAgICB0aGlzLmN1cnNvclBvcyA9IHBvcyArIHRoaXMuc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3Vyc29yUG9zIC0gdGhpcy5zdHJpbmcubGVuZ3RoO1xuICAgIH1cbiAgICBjaHVuayhwb3MpIHtcbiAgICAgICAgdGhpcy5zeW5jVG8ocG9zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nO1xuICAgIH1cbiAgICBnZXQgbGluZUNodW5rcygpIHsgcmV0dXJuIHRydWU7IH1cbiAgICByZWFkKGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBzdHJpbmdTdGFydCA9IHRoaXMuY3Vyc29yUG9zIC0gdGhpcy5zdHJpbmcubGVuZ3RoO1xuICAgICAgICBpZiAoZnJvbSA8IHN0cmluZ1N0YXJ0IHx8IHRvID49IHRoaXMuY3Vyc29yUG9zKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKGZyb20gLSBzdHJpbmdTdGFydCwgdG8gLSBzdHJpbmdTdGFydCk7XG4gICAgfVxufVxubGV0IGN1cnJlbnRDb250ZXh0ID0gbnVsbDtcbi8qKlxuQSBwYXJzZSBjb250ZXh0IHByb3ZpZGVkIHRvIHBhcnNlcnMgd29ya2luZyBvbiB0aGUgZWRpdG9yIGNvbnRlbnQuXG4qL1xuY2xhc3MgUGFyc2VDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIsIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIHN0YXRlLCBcbiAgICAvKipcbiAgICBUcmVlIGZyYWdtZW50cyB0aGF0IGNhbiBiZSByZXVzZWQgYnkgaW5jcmVtZW50YWwgcmUtcGFyc2VzLlxuICAgICovXG4gICAgZnJhZ21lbnRzID0gW10sIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdHJlZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0cmVlTGVuLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBlZGl0b3Igdmlld3BvcnQgKG9yIHNvbWUgb3ZlcmFwcHJveGltYXRpb25cbiAgICB0aGVyZW9mKS4gSW50ZW5kZWQgdG8gYmUgdXNlZCBmb3Igb3Bwb3J0dW5pc3RpY2FsbHkgYXZvaWRpbmdcbiAgICB3b3JrIChpbiB3aGljaCBjYXNlXG4gICAgW2Bza2lwVW50aWxJblZpZXdgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLlBhcnNlQ29udGV4dC5za2lwVW50aWxJblZpZXcpXG4gICAgc2hvdWxkIGJlIGNhbGxlZCB0byBtYWtlIHN1cmUgdGhlIHBhcnNlciBpcyByZXN0YXJ0ZWQgd2hlbiB0aGVcbiAgICBza2lwcGVkIHJlZ2lvbiBiZWNvbWVzIHZpc2libGUpLlxuICAgICovXG4gICAgdmlld3BvcnQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2tpcHBlZCwgXG4gICAgLyoqXG4gICAgVGhpcyBpcyB3aGVyZSBza2lwcGluZyBwYXJzZXJzIGNhbiByZWdpc3RlciBhIHByb21pc2UgdGhhdCxcbiAgICB3aGVuIHJlc29sdmVkLCB3aWxsIHNjaGVkdWxlIGEgbmV3IHBhcnNlLiBJdCBpcyBjbGVhcmVkIHdoZW5cbiAgICB0aGUgcGFyc2Ugd29ya2VyIHBpY2tzIHVwIHRoZSBwcm9taXNlLiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNjaGVkdWxlT24pIHtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBmcmFnbWVudHM7XG4gICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgIHRoaXMudHJlZUxlbiA9IHRyZWVMZW47XG4gICAgICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICAgICAgdGhpcy5za2lwcGVkID0gc2tpcHBlZDtcbiAgICAgICAgdGhpcy5zY2hlZHVsZU9uID0gc2NoZWR1bGVPbjtcbiAgICAgICAgdGhpcy5wYXJzZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy50ZW1wU2tpcHBlZCA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUocGFyc2VyLCBzdGF0ZSwgdmlld3BvcnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJzZUNvbnRleHQocGFyc2VyLCBzdGF0ZSwgW10sIFRyZWUuZW1wdHksIDAsIHZpZXdwb3J0LCBbXSwgbnVsbCk7XG4gICAgfVxuICAgIHN0YXJ0UGFyc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlci5zdGFydFBhcnNlKG5ldyBEb2NJbnB1dCh0aGlzLnN0YXRlLmRvYyksIHRoaXMuZnJhZ21lbnRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB3b3JrKHVudGlsLCB1cHRvKSB7XG4gICAgICAgIGlmICh1cHRvICE9IG51bGwgJiYgdXB0byA+PSB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpXG4gICAgICAgICAgICB1cHRvID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy50cmVlICE9IFRyZWUuZW1wdHkgJiYgdGhpcy5pc0RvbmUodXB0byAhPT0gbnVsbCAmJiB1cHRvICE9PSB2b2lkIDAgPyB1cHRvIDogdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKSkge1xuICAgICAgICAgICAgdGhpcy50YWtlVHJlZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aENvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1bnRpbCA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZFRpbWUgPSBEYXRlLm5vdygpICsgdW50aWw7XG4gICAgICAgICAgICAgICAgdW50aWwgPSAoKSA9PiBEYXRlLm5vdygpID4gZW5kVGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJzZSlcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5zdGFydFBhcnNlKCk7XG4gICAgICAgICAgICBpZiAodXB0byAhPSBudWxsICYmICh0aGlzLnBhcnNlLnN0b3BwZWRBdCA9PSBudWxsIHx8IHRoaXMucGFyc2Uuc3RvcHBlZEF0ID4gdXB0bykgJiZcbiAgICAgICAgICAgICAgICB1cHRvIDwgdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2Uuc3RvcEF0KHVwdG8pO1xuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGxldCBkb25lID0gdGhpcy5wYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFnbWVudHMgPSB0aGlzLndpdGhvdXRUZW1wU2tpcHBlZChUcmVlRnJhZ21lbnQuYWRkVHJlZShkb25lLCB0aGlzLmZyYWdtZW50cywgdGhpcy5wYXJzZS5zdG9wcGVkQXQgIT0gbnVsbCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVMZW4gPSAoX2EgPSB0aGlzLnBhcnNlLnN0b3BwZWRBdCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5zdGF0ZS5kb2MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWUgPSBkb25lO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJlZUxlbiA8ICh1cHRvICE9PSBudWxsICYmIHVwdG8gIT09IHZvaWQgMCA/IHVwdG8gOiB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZSA9IHRoaXMuc3RhcnRQYXJzZSgpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHVudGlsKCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdGFrZVRyZWUoKSB7XG4gICAgICAgIGxldCBwb3MsIHRyZWU7XG4gICAgICAgIGlmICh0aGlzLnBhcnNlICYmIChwb3MgPSB0aGlzLnBhcnNlLnBhcnNlZFBvcykgPj0gdGhpcy50cmVlTGVuKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJzZS5zdG9wcGVkQXQgPT0gbnVsbCB8fCB0aGlzLnBhcnNlLnN0b3BwZWRBdCA+IHBvcylcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlLnN0b3BBdChwb3MpO1xuICAgICAgICAgICAgdGhpcy53aXRoQ29udGV4dCgoKSA9PiB7IHdoaWxlICghKHRyZWUgPSB0aGlzLnBhcnNlLmFkdmFuY2UoKSkpIHsgfSB9KTtcbiAgICAgICAgICAgIHRoaXMudHJlZUxlbiA9IHBvcztcbiAgICAgICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50cyA9IHRoaXMud2l0aG91dFRlbXBTa2lwcGVkKFRyZWVGcmFnbWVudC5hZGRUcmVlKHRoaXMudHJlZSwgdGhpcy5mcmFnbWVudHMsIHRydWUpKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdpdGhDb250ZXh0KGYpIHtcbiAgICAgICAgbGV0IHByZXYgPSBjdXJyZW50Q29udGV4dDtcbiAgICAgICAgY3VycmVudENvbnRleHQgPSB0aGlzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGYoKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gcHJldjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aXRob3V0VGVtcFNraXBwZWQoZnJhZ21lbnRzKSB7XG4gICAgICAgIGZvciAobGV0IHI7IHIgPSB0aGlzLnRlbXBTa2lwcGVkLnBvcCgpOylcbiAgICAgICAgICAgIGZyYWdtZW50cyA9IGN1dEZyYWdtZW50cyhmcmFnbWVudHMsIHIuZnJvbSwgci50byk7XG4gICAgICAgIHJldHVybiBmcmFnbWVudHM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2hhbmdlcyhjaGFuZ2VzLCBuZXdTdGF0ZSkge1xuICAgICAgICBsZXQgeyBmcmFnbWVudHMsIHRyZWUsIHRyZWVMZW4sIHZpZXdwb3J0LCBza2lwcGVkIH0gPSB0aGlzO1xuICAgICAgICB0aGlzLnRha2VUcmVlKCk7XG4gICAgICAgIGlmICghY2hhbmdlcy5lbXB0eSkge1xuICAgICAgICAgICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgICAgICAgICAgY2hhbmdlcy5pdGVyQ2hhbmdlZFJhbmdlcygoZnJvbUEsIHRvQSwgZnJvbUIsIHRvQikgPT4gcmFuZ2VzLnB1c2goeyBmcm9tQSwgdG9BLCBmcm9tQiwgdG9CIH0pKTtcbiAgICAgICAgICAgIGZyYWdtZW50cyA9IFRyZWVGcmFnbWVudC5hcHBseUNoYW5nZXMoZnJhZ21lbnRzLCByYW5nZXMpO1xuICAgICAgICAgICAgdHJlZSA9IFRyZWUuZW1wdHk7XG4gICAgICAgICAgICB0cmVlTGVuID0gMDtcbiAgICAgICAgICAgIHZpZXdwb3J0ID0geyBmcm9tOiBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC5mcm9tLCAtMSksIHRvOiBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC50bywgMSkgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNraXBwZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2tpcHBlZCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgdGhpcy5za2lwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmcm9tID0gY2hhbmdlcy5tYXBQb3Moci5mcm9tLCAxKSwgdG8gPSBjaGFuZ2VzLm1hcFBvcyhyLnRvLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tIDwgdG8pXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkLnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQYXJzZUNvbnRleHQodGhpcy5wYXJzZXIsIG5ld1N0YXRlLCBmcmFnbWVudHMsIHRyZWUsIHRyZWVMZW4sIHZpZXdwb3J0LCBza2lwcGVkLCB0aGlzLnNjaGVkdWxlT24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHVwZGF0ZVZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdwb3J0LmZyb20gPT0gdmlld3BvcnQuZnJvbSAmJiB0aGlzLnZpZXdwb3J0LnRvID09IHZpZXdwb3J0LnRvKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgICAgIGxldCBzdGFydExlbiA9IHRoaXMuc2tpcHBlZC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5za2lwcGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gdGhpcy5za2lwcGVkW2ldO1xuICAgICAgICAgICAgaWYgKGZyb20gPCB2aWV3cG9ydC50byAmJiB0byA+IHZpZXdwb3J0LmZyb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGN1dEZyYWdtZW50cyh0aGlzLmZyYWdtZW50cywgZnJvbSwgdG8pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcHBlZC5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5za2lwcGVkLmxlbmd0aCA+PSBzdGFydExlbilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZXNldCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMudGFrZVRyZWUoKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE5vdGlmeSB0aGUgcGFyc2Ugc2NoZWR1bGVyIHRoYXQgdGhlIGdpdmVuIHJlZ2lvbiB3YXMgc2tpcHBlZFxuICAgIGJlY2F1c2UgaXQgd2Fzbid0IGluIHZpZXcsIGFuZCB0aGUgcGFyc2Ugc2hvdWxkIGJlIHJlc3RhcnRlZFxuICAgIHdoZW4gaXQgY29tZXMgaW50byB2aWV3LlxuICAgICovXG4gICAgc2tpcFVudGlsSW5WaWV3KGZyb20sIHRvKSB7XG4gICAgICAgIHRoaXMuc2tpcHBlZC5wdXNoKHsgZnJvbSwgdG8gfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYSBwYXJzZXIgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBwbGFjZWhvbGRlciB3aGVuXG4gICAgYXN5bmNocm9ub3VzbHkgbG9hZGluZyBhIG5lc3RlZCBwYXJzZXIuIEl0J2xsIHNraXAgaXRzIGlucHV0IGFuZFxuICAgIG1hcmsgaXQgYXMgbm90LXJlYWxseS1wYXJzZWQsIHNvIHRoYXQgdGhlIG5leHQgdXBkYXRlIHdpbGwgcGFyc2VcbiAgICBpdCBhZ2Fpbi5cbiAgICBcbiAgICBXaGVuIGB1bnRpbGAgaXMgZ2l2ZW4sIGEgcmVwYXJzZSB3aWxsIGJlIHNjaGVkdWxlZCB3aGVuIHRoYXRcbiAgICBwcm9taXNlIHJlc29sdmVzLlxuICAgICovXG4gICAgc3RhdGljIGdldFNraXBwaW5nUGFyc2VyKHVudGlsKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2xhc3MgZXh0ZW5kcyBQYXJzZXIge1xuICAgICAgICAgICAgY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSByYW5nZXNbMF0uZnJvbSwgdG8gPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLnRvO1xuICAgICAgICAgICAgICAgIGxldCBwYXJzZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZFBvczogZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjeCA9IGN1cnJlbnRDb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciBvZiByYW5nZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4LnRlbXBTa2lwcGVkLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVudGlsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeC5zY2hlZHVsZU9uID0gY3guc2NoZWR1bGVPbiA/IFByb21pc2UuYWxsKFtjeC5zY2hlZHVsZU9uLCB1bnRpbF0pIDogdW50aWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZFBvcyA9IHRvO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmVlKE5vZGVUeXBlLm5vbmUsIFtdLCBbXSwgdG8gLSBmcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcHBlZEF0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzdG9wQXQoKSB7IH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaXNEb25lKHVwdG8pIHtcbiAgICAgICAgdXB0byA9IE1hdGgubWluKHVwdG8sIHRoaXMuc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIGxldCBmcmFncyA9IHRoaXMuZnJhZ21lbnRzO1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlTGVuID49IHVwdG8gJiYgZnJhZ3MubGVuZ3RoICYmIGZyYWdzWzBdLmZyb20gPT0gMCAmJiBmcmFnc1swXS50byA+PSB1cHRvO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNvbnRleHQgZm9yIHRoZSBjdXJyZW50IHBhcnNlLCBvciBgbnVsbGAgaWYgbm8gZWRpdG9yXG4gICAgcGFyc2UgaXMgaW4gcHJvZ3Jlc3MuXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0KCkgeyByZXR1cm4gY3VycmVudENvbnRleHQ7IH1cbn1cbmZ1bmN0aW9uIGN1dEZyYWdtZW50cyhmcmFnbWVudHMsIGZyb20sIHRvKSB7XG4gICAgcmV0dXJuIFRyZWVGcmFnbWVudC5hcHBseUNoYW5nZXMoZnJhZ21lbnRzLCBbeyBmcm9tQTogZnJvbSwgdG9BOiB0bywgZnJvbUI6IGZyb20sIHRvQjogdG8gfV0pO1xufVxuY2xhc3MgTGFuZ3VhZ2VTdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gQSBtdXRhYmxlIHBhcnNlIHN0YXRlIHRoYXQgaXMgdXNlZCB0byBwcmVzZXJ2ZSB3b3JrIGRvbmUgZHVyaW5nXG4gICAgLy8gdGhlIGxpZmV0aW1lIG9mIGEgc3RhdGUgd2hlbiBtb3ZpbmcgdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgY29udGV4dCkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLnRyZWUgPSBjb250ZXh0LnRyZWU7XG4gICAgfVxuICAgIGFwcGx5KHRyKSB7XG4gICAgICAgIGlmICghdHIuZG9jQ2hhbmdlZCAmJiB0aGlzLnRyZWUgPT0gdGhpcy5jb250ZXh0LnRyZWUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IG5ld0N4ID0gdGhpcy5jb250ZXh0LmNoYW5nZXModHIuY2hhbmdlcywgdHIuc3RhdGUpO1xuICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgcGFyc2Ugd2Fzbid0IGRvbmUsIGdvIGZvcndhcmQgb25seSB1cCB0byBpdHNcbiAgICAgICAgLy8gZW5kIHBvc2l0aW9uIG9yIHRoZSBlbmQgb2YgdGhlIHZpZXdwb3J0LCB0byBhdm9pZCBzbG93aW5nIGRvd25cbiAgICAgICAgLy8gc3RhdGUgdXBkYXRlcyB3aXRoIHBhcnNlIHdvcmsgYmV5b25kIHRoZSB2aWV3cG9ydC5cbiAgICAgICAgbGV0IHVwdG8gPSB0aGlzLmNvbnRleHQudHJlZUxlbiA9PSB0ci5zdGFydFN0YXRlLmRvYy5sZW5ndGggPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogTWF0aC5tYXgodHIuY2hhbmdlcy5tYXBQb3ModGhpcy5jb250ZXh0LnRyZWVMZW4pLCBuZXdDeC52aWV3cG9ydC50byk7XG4gICAgICAgIGlmICghbmV3Q3gud29yaygyMCAvKiBXb3JrLkFwcGx5ICovLCB1cHRvKSlcbiAgICAgICAgICAgIG5ld0N4LnRha2VUcmVlKCk7XG4gICAgICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VTdGF0ZShuZXdDeCk7XG4gICAgfVxuICAgIHN0YXRpYyBpbml0KHN0YXRlKSB7XG4gICAgICAgIGxldCB2cFRvID0gTWF0aC5taW4oMzAwMCAvKiBXb3JrLkluaXRWaWV3cG9ydCAqLywgc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIGxldCBwYXJzZVN0YXRlID0gUGFyc2VDb250ZXh0LmNyZWF0ZShzdGF0ZS5mYWNldChsYW5ndWFnZSkucGFyc2VyLCBzdGF0ZSwgeyBmcm9tOiAwLCB0bzogdnBUbyB9KTtcbiAgICAgICAgaWYgKCFwYXJzZVN0YXRlLndvcmsoMjAgLyogV29yay5BcHBseSAqLywgdnBUbykpXG4gICAgICAgICAgICBwYXJzZVN0YXRlLnRha2VUcmVlKCk7XG4gICAgICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VTdGF0ZShwYXJzZVN0YXRlKTtcbiAgICB9XG59XG5MYW5ndWFnZS5zdGF0ZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgY3JlYXRlOiBMYW5ndWFnZVN0YXRlLmluaXQsXG4gICAgdXBkYXRlKHZhbHVlLCB0cikge1xuICAgICAgICBmb3IgKGxldCBlIG9mIHRyLmVmZmVjdHMpXG4gICAgICAgICAgICBpZiAoZS5pcyhMYW5ndWFnZS5zZXRTdGF0ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWU7XG4gICAgICAgIGlmICh0ci5zdGFydFN0YXRlLmZhY2V0KGxhbmd1YWdlKSAhPSB0ci5zdGF0ZS5mYWNldChsYW5ndWFnZSkpXG4gICAgICAgICAgICByZXR1cm4gTGFuZ3VhZ2VTdGF0ZS5pbml0KHRyLnN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmFwcGx5KHRyKTtcbiAgICB9XG59KTtcbmxldCByZXF1ZXN0SWRsZSA9IChjYWxsYmFjaykgPT4ge1xuICAgIGxldCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjYWxsYmFjaygpLCA1MDAgLyogV29yay5NYXhQYXVzZSAqLyk7XG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn07XG5pZiAodHlwZW9mIHJlcXVlc3RJZGxlQ2FsbGJhY2sgIT0gXCJ1bmRlZmluZWRcIilcbiAgICByZXF1ZXN0SWRsZSA9IChjYWxsYmFjaykgPT4ge1xuICAgICAgICBsZXQgaWRsZSA9IC0xLCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZGxlID0gcmVxdWVzdElkbGVDYWxsYmFjayhjYWxsYmFjaywgeyB0aW1lb3V0OiA1MDAgLyogV29yay5NYXhQYXVzZSAqLyAtIDEwMCAvKiBXb3JrLk1pblBhdXNlICovIH0pO1xuICAgICAgICB9LCAxMDAgLyogV29yay5NaW5QYXVzZSAqLyk7XG4gICAgICAgIHJldHVybiAoKSA9PiBpZGxlIDwgMCA/IGNsZWFyVGltZW91dCh0aW1lb3V0KSA6IGNhbmNlbElkbGVDYWxsYmFjayhpZGxlKTtcbiAgICB9O1xuY29uc3QgaXNJbnB1dFBlbmRpbmcgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgKChfYSA9IG5hdmlnYXRvci5zY2hlZHVsaW5nKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNJbnB1dFBlbmRpbmcpXG4gICAgPyAoKSA9PiBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZygpIDogbnVsbDtcbmNvbnN0IHBhcnNlV29ya2VyID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIFBhcnNlV29ya2VyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMud29ya2luZyA9IG51bGw7XG4gICAgICAgIHRoaXMud29ya1NjaGVkdWxlZCA9IDA7XG4gICAgICAgIC8vIEVuZCBvZiB0aGUgY3VycmVudCB0aW1lIGNodW5rXG4gICAgICAgIHRoaXMuY2h1bmtFbmQgPSAtMTtcbiAgICAgICAgLy8gTWlsbGlzZWNvbmRzIG9mIGJ1ZGdldCBsZWZ0IGZvciB0aGlzIGNodW5rXG4gICAgICAgIHRoaXMuY2h1bmtCdWRnZXQgPSAtMTtcbiAgICAgICAgdGhpcy53b3JrID0gdGhpcy53b3JrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVXb3JrKCk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IGN4ID0gdGhpcy52aWV3LnN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlKS5jb250ZXh0O1xuICAgICAgICBpZiAoY3gudXBkYXRlVmlld3BvcnQodXBkYXRlLnZpZXcudmlld3BvcnQpIHx8IHRoaXMudmlldy52aWV3cG9ydC50byA+IGN4LnRyZWVMZW4pXG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlV29yaygpO1xuICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlldy5oYXNGb2N1cylcbiAgICAgICAgICAgICAgICB0aGlzLmNodW5rQnVkZ2V0ICs9IDUwIC8qIFdvcmsuQ2hhbmdlQm9udXMgKi87XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlV29yaygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2tBc3luY1NjaGVkdWxlKGN4KTtcbiAgICB9XG4gICAgc2NoZWR1bGVXb3JrKCkge1xuICAgICAgICBpZiAodGhpcy53b3JraW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgeyBzdGF0ZSB9ID0gdGhpcy52aWV3LCBmaWVsZCA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlKTtcbiAgICAgICAgaWYgKGZpZWxkLnRyZWUgIT0gZmllbGQuY29udGV4dC50cmVlIHx8ICFmaWVsZC5jb250ZXh0LmlzRG9uZShzdGF0ZS5kb2MubGVuZ3RoKSlcbiAgICAgICAgICAgIHRoaXMud29ya2luZyA9IHJlcXVlc3RJZGxlKHRoaXMud29yayk7XG4gICAgfVxuICAgIHdvcmsoZGVhZGxpbmUpIHtcbiAgICAgICAgdGhpcy53b3JraW5nID0gbnVsbDtcbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmICh0aGlzLmNodW5rRW5kIDwgbm93ICYmICh0aGlzLmNodW5rRW5kIDwgMCB8fCB0aGlzLnZpZXcuaGFzRm9jdXMpKSB7IC8vIFN0YXJ0IGEgbmV3IGNodW5rXG4gICAgICAgICAgICB0aGlzLmNodW5rRW5kID0gbm93ICsgMzAwMDAgLyogV29yay5DaHVua1RpbWUgKi87XG4gICAgICAgICAgICB0aGlzLmNodW5rQnVkZ2V0ID0gMzAwMCAvKiBXb3JrLkNodW5rQnVkZ2V0ICovO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNodW5rQnVkZ2V0IDw9IDApXG4gICAgICAgICAgICByZXR1cm47IC8vIE5vIG1vcmUgYnVkZ2V0XG4gICAgICAgIGxldCB7IHN0YXRlLCB2aWV3cG9ydDogeyB0bzogdnBUbyB9IH0gPSB0aGlzLnZpZXcsIGZpZWxkID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUpO1xuICAgICAgICBpZiAoZmllbGQudHJlZSA9PSBmaWVsZC5jb250ZXh0LnRyZWUgJiYgZmllbGQuY29udGV4dC5pc0RvbmUodnBUbyArIDEwMDAwMCAvKiBXb3JrLk1heFBhcnNlQWhlYWQgKi8pKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgZW5kVGltZSA9IERhdGUubm93KCkgKyBNYXRoLm1pbih0aGlzLmNodW5rQnVkZ2V0LCAxMDAgLyogV29yay5TbGljZSAqLywgZGVhZGxpbmUgJiYgIWlzSW5wdXRQZW5kaW5nID8gTWF0aC5tYXgoMjUgLyogV29yay5NaW5TbGljZSAqLywgZGVhZGxpbmUudGltZVJlbWFpbmluZygpIC0gNSkgOiAxZTkpO1xuICAgICAgICBsZXQgdmlld3BvcnRGaXJzdCA9IGZpZWxkLmNvbnRleHQudHJlZUxlbiA8IHZwVG8gJiYgc3RhdGUuZG9jLmxlbmd0aCA+IHZwVG8gKyAxMDAwO1xuICAgICAgICBsZXQgZG9uZSA9IGZpZWxkLmNvbnRleHQud29yaygoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaXNJbnB1dFBlbmRpbmcgJiYgaXNJbnB1dFBlbmRpbmcoKSB8fCBEYXRlLm5vdygpID4gZW5kVGltZTtcbiAgICAgICAgfSwgdnBUbyArICh2aWV3cG9ydEZpcnN0ID8gMCA6IDEwMDAwMCAvKiBXb3JrLk1heFBhcnNlQWhlYWQgKi8pKTtcbiAgICAgICAgdGhpcy5jaHVua0J1ZGdldCAtPSBEYXRlLm5vdygpIC0gbm93O1xuICAgICAgICBpZiAoZG9uZSB8fCB0aGlzLmNodW5rQnVkZ2V0IDw9IDApIHtcbiAgICAgICAgICAgIGZpZWxkLmNvbnRleHQudGFrZVRyZWUoKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IExhbmd1YWdlLnNldFN0YXRlLm9mKG5ldyBMYW5ndWFnZVN0YXRlKGZpZWxkLmNvbnRleHQpKSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaHVua0J1ZGdldCA+IDAgJiYgIShkb25lICYmICF2aWV3cG9ydEZpcnN0KSlcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVXb3JrKCk7XG4gICAgICAgIHRoaXMuY2hlY2tBc3luY1NjaGVkdWxlKGZpZWxkLmNvbnRleHQpO1xuICAgIH1cbiAgICBjaGVja0FzeW5jU2NoZWR1bGUoY3gpIHtcbiAgICAgICAgaWYgKGN4LnNjaGVkdWxlT24pIHtcbiAgICAgICAgICAgIHRoaXMud29ya1NjaGVkdWxlZCsrO1xuICAgICAgICAgICAgY3guc2NoZWR1bGVPblxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuc2NoZWR1bGVXb3JrKCkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBsb2dFeGNlcHRpb24odGhpcy52aWV3LnN0YXRlLCBlcnIpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMud29ya1NjaGVkdWxlZC0tKTtcbiAgICAgICAgICAgIGN4LnNjaGVkdWxlT24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtpbmcpXG4gICAgICAgICAgICB0aGlzLndvcmtpbmcoKTtcbiAgICB9XG4gICAgaXNXb3JraW5nKCkge1xuICAgICAgICByZXR1cm4gISEodGhpcy53b3JraW5nIHx8IHRoaXMud29ya1NjaGVkdWxlZCA+IDApO1xuICAgIH1cbn0sIHtcbiAgICBldmVudEhhbmRsZXJzOiB7IGZvY3VzKCkgeyB0aGlzLnNjaGVkdWxlV29yaygpOyB9IH1cbn0pO1xuLyoqXG5UaGUgZmFjZXQgdXNlZCB0byBhc3NvY2lhdGUgYSBsYW5ndWFnZSB3aXRoIGFuIGVkaXRvciBzdGF0ZS4gVXNlZFxuYnkgYExhbmd1YWdlYCBvYmplY3QncyBgZXh0ZW5zaW9uYCBwcm9wZXJ0eSAoc28geW91IGRvbid0IG5lZWQgdG9cbm1hbnVhbGx5IHdyYXAgeW91ciBsYW5ndWFnZXMgaW4gdGhpcykuIENhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGVcbmN1cnJlbnQgbGFuZ3VhZ2Ugb24gYSBzdGF0ZS5cbiovXG5jb25zdCBsYW5ndWFnZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUobGFuZ3VhZ2VzKSB7IHJldHVybiBsYW5ndWFnZXMubGVuZ3RoID8gbGFuZ3VhZ2VzWzBdIDogbnVsbDsgfSxcbiAgICBlbmFibGVzOiBsYW5ndWFnZSA9PiBbXG4gICAgICAgIExhbmd1YWdlLnN0YXRlLFxuICAgICAgICBwYXJzZVdvcmtlcixcbiAgICAgICAgRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5jb21wdXRlKFtsYW5ndWFnZV0sIHN0YXRlID0+IHtcbiAgICAgICAgICAgIGxldCBsYW5nID0gc3RhdGUuZmFjZXQobGFuZ3VhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIGxhbmcgJiYgbGFuZy5uYW1lID8geyBcImRhdGEtbGFuZ3VhZ2VcIjogbGFuZy5uYW1lIH0gOiB7fTtcbiAgICAgICAgfSlcbiAgICBdXG59KTtcbi8qKlxuVGhpcyBjbGFzcyBidW5kbGVzIGEgW2xhbmd1YWdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSB3aXRoIGFuXG5vcHRpb25hbCBzZXQgb2Ygc3VwcG9ydGluZyBleHRlbnNpb25zLiBMYW5ndWFnZSBwYWNrYWdlcyBhcmVcbmVuY291cmFnZWQgdG8gZXhwb3J0IGEgZnVuY3Rpb24gdGhhdCBvcHRpb25hbGx5IHRha2VzIGFcbmNvbmZpZ3VyYXRpb24gb2JqZWN0IGFuZCByZXR1cm5zIGEgYExhbmd1YWdlU3VwcG9ydGAgaW5zdGFuY2UsIGFzXG50aGUgbWFpbiB3YXkgZm9yIGNsaWVudCBjb2RlIHRvIHVzZSB0aGUgcGFja2FnZS5cbiovXG5jbGFzcyBMYW5ndWFnZVN1cHBvcnQge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIGxhbmd1YWdlIHN1cHBvcnQgb2JqZWN0LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxhbmd1YWdlIG9iamVjdC5cbiAgICAqL1xuICAgIGxhbmd1YWdlLCBcbiAgICAvKipcbiAgICBBbiBvcHRpb25hbCBzZXQgb2Ygc3VwcG9ydGluZyBleHRlbnNpb25zLiBXaGVuIG5lc3RpbmcgYVxuICAgIGxhbmd1YWdlIGluIGFub3RoZXIgbGFuZ3VhZ2UsIHRoZSBvdXRlciBsYW5ndWFnZSBpcyBlbmNvdXJhZ2VkXG4gICAgdG8gaW5jbHVkZSB0aGUgc3VwcG9ydGluZyBleHRlbnNpb25zIGZvciBpdHMgaW5uZXIgbGFuZ3VhZ2VzXG4gICAgaW4gaXRzIG93biBzZXQgb2Ygc3VwcG9ydCBleHRlbnNpb25zLlxuICAgICovXG4gICAgc3VwcG9ydCA9IFtdKSB7XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICAgICAgdGhpcy5zdXBwb3J0ID0gc3VwcG9ydDtcbiAgICAgICAgdGhpcy5leHRlbnNpb24gPSBbbGFuZ3VhZ2UsIHN1cHBvcnRdO1xuICAgIH1cbn1cbi8qKlxuTGFuZ3VhZ2UgZGVzY3JpcHRpb25zIGFyZSB1c2VkIHRvIHN0b3JlIG1ldGFkYXRhIGFib3V0IGxhbmd1YWdlc1xuYW5kIHRvIGR5bmFtaWNhbGx5IGxvYWQgdGhlbS4gVGhlaXIgbWFpbiByb2xlIGlzIGZpbmRpbmcgdGhlXG5hcHByb3ByaWF0ZSBsYW5ndWFnZSBmb3IgYSBmaWxlbmFtZSBvciBkeW5hbWljYWxseSBsb2FkaW5nIG5lc3RlZFxucGFyc2Vycy5cbiovXG5jbGFzcyBMYW5ndWFnZURlc2NyaXB0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbmFtZSBvZiB0aGlzIGxhbmd1YWdlLlxuICAgICovXG4gICAgbmFtZSwgXG4gICAgLyoqXG4gICAgQWx0ZXJuYXRpdmUgbmFtZXMgZm9yIHRoZSBtb2RlIChsb3dlcmNhc2VkLCBpbmNsdWRlcyBgdGhpcy5uYW1lYCkuXG4gICAgKi9cbiAgICBhbGlhcywgXG4gICAgLyoqXG4gICAgRmlsZSBleHRlbnNpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxhbmd1YWdlLlxuICAgICovXG4gICAgZXh0ZW5zaW9ucywgXG4gICAgLyoqXG4gICAgT3B0aW9uYWwgZmlsZW5hbWUgcGF0dGVybiB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpc1xuICAgIGxhbmd1YWdlLlxuICAgICovXG4gICAgZmlsZW5hbWUsIGxvYWRGdW5jLCBcbiAgICAvKipcbiAgICBJZiB0aGUgbGFuZ3VhZ2UgaGFzIGJlZW4gbG9hZGVkLCB0aGlzIHdpbGwgaG9sZCBpdHMgdmFsdWUuXG4gICAgKi9cbiAgICBzdXBwb3J0ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgICAgICAgdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcbiAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lO1xuICAgICAgICB0aGlzLmxvYWRGdW5jID0gbG9hZEZ1bmM7XG4gICAgICAgIHRoaXMuc3VwcG9ydCA9IHN1cHBvcnQ7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFN0YXJ0IGxvYWRpbmcgdGhlIHRoZSBsYW5ndWFnZS4gV2lsbCByZXR1cm4gYSBwcm9taXNlIHRoYXRcbiAgICByZXNvbHZlcyB0byBhIFtgTGFuZ3VhZ2VTdXBwb3J0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZVN1cHBvcnQpXG4gICAgb2JqZWN0IHdoZW4gdGhlIGxhbmd1YWdlIHN1Y2Nlc3NmdWxseSBsb2Fkcy5cbiAgICAqL1xuICAgIGxvYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmcgfHwgKHRoaXMubG9hZGluZyA9IHRoaXMubG9hZEZ1bmMoKS50aGVuKHN1cHBvcnQgPT4gdGhpcy5zdXBwb3J0ID0gc3VwcG9ydCwgZXJyID0+IHsgdGhpcy5sb2FkaW5nID0gbnVsbDsgdGhyb3cgZXJyOyB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGxhbmd1YWdlIGRlc2NyaXB0aW9uLlxuICAgICovXG4gICAgc3RhdGljIG9mKHNwZWMpIHtcbiAgICAgICAgbGV0IHsgbG9hZCwgc3VwcG9ydCB9ID0gc3BlYztcbiAgICAgICAgaWYgKCFsb2FkKSB7XG4gICAgICAgICAgICBpZiAoIXN1cHBvcnQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdXN0IHBhc3MgZWl0aGVyICdsb2FkJyBvciAnc3VwcG9ydCcgdG8gTGFuZ3VhZ2VEZXNjcmlwdGlvbi5vZlwiKTtcbiAgICAgICAgICAgIGxvYWQgPSAoKSA9PiBQcm9taXNlLnJlc29sdmUoc3VwcG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBMYW5ndWFnZURlc2NyaXB0aW9uKHNwZWMubmFtZSwgKHNwZWMuYWxpYXMgfHwgW10pLmNvbmNhdChzcGVjLm5hbWUpLm1hcChzID0+IHMudG9Mb3dlckNhc2UoKSksIHNwZWMuZXh0ZW5zaW9ucyB8fCBbXSwgc3BlYy5maWxlbmFtZSwgbG9hZCwgc3VwcG9ydCk7XG4gICAgfVxuICAgIC8qKlxuICAgIExvb2sgZm9yIGEgbGFuZ3VhZ2UgaW4gdGhlIGdpdmVuIGFycmF5IG9mIGRlc2NyaXB0aW9ucyB0aGF0XG4gICAgbWF0Y2hlcyB0aGUgZmlsZW5hbWUuIFdpbGwgZmlyc3QgbWF0Y2hcbiAgICBbYGZpbGVuYW1lYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZURlc2NyaXB0aW9uLmZpbGVuYW1lKSBwYXR0ZXJucyxcbiAgICBhbmQgdGhlbiBbZXh0ZW5zaW9uc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZURlc2NyaXB0aW9uLmV4dGVuc2lvbnMpLFxuICAgIGFuZCByZXR1cm4gdGhlIGZpcnN0IGxhbmd1YWdlIHRoYXQgbWF0Y2hlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXRjaEZpbGVuYW1lKGRlc2NzLCBmaWxlbmFtZSkge1xuICAgICAgICBmb3IgKGxldCBkIG9mIGRlc2NzKVxuICAgICAgICAgICAgaWYgKGQuZmlsZW5hbWUgJiYgZC5maWxlbmFtZS50ZXN0KGZpbGVuYW1lKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgbGV0IGV4dCA9IC9cXC4oW14uXSspJC8uZXhlYyhmaWxlbmFtZSk7XG4gICAgICAgIGlmIChleHQpXG4gICAgICAgICAgICBmb3IgKGxldCBkIG9mIGRlc2NzKVxuICAgICAgICAgICAgICAgIGlmIChkLmV4dGVuc2lvbnMuaW5kZXhPZihleHRbMV0pID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgTG9vayBmb3IgYSBsYW5ndWFnZSB3aG9zZSBuYW1lIG9yIGFsaWFzIG1hdGNoZXMgdGhlIHRoZSBnaXZlblxuICAgIG5hbWUgKGNhc2UtaW5zZW5zaXRpdmVseSkuIElmIGBmdXp6eWAgaXMgdHJ1ZSwgYW5kIG5vIGRpcmVjdFxuICAgIG1hdGNocyBpcyBmb3VuZCwgdGhpcydsbCBhbHNvIHNlYXJjaCBmb3IgYSBsYW5ndWFnZSB3aG9zZSBuYW1lXG4gICAgb3IgYWxpYXMgb2NjdXJzIGluIHRoZSBzdHJpbmcgKGZvciBuYW1lcyBzaG9ydGVyIHRoYW4gdGhyZWVcbiAgICBjaGFyYWN0ZXJzLCBvbmx5IHdoZW4gc3Vycm91bmRlZCBieSBub24td29yZCBjaGFyYWN0ZXJzKS5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXRjaExhbmd1YWdlTmFtZShkZXNjcywgbmFtZSwgZnV6enkgPSB0cnVlKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGZvciAobGV0IGQgb2YgZGVzY3MpXG4gICAgICAgICAgICBpZiAoZC5hbGlhcy5zb21lKGEgPT4gYSA9PSBuYW1lKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgaWYgKGZ1enp5KVxuICAgICAgICAgICAgZm9yIChsZXQgZCBvZiBkZXNjcylcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhIG9mIGQuYWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gbmFtZS5pbmRleE9mKGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgPiAtMSAmJiAoYS5sZW5ndGggPiAyIHx8ICEvXFx3Ly50ZXN0KG5hbWVbZm91bmQgLSAxXSkgJiYgIS9cXHcvLnRlc3QobmFtZVtmb3VuZCArIGEubGVuZ3RoXSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbi8qKlxuRmFjZXQgdGhhdCBkZWZpbmVzIGEgd2F5IHRvIHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IGNvbXB1dGVzIHRoZVxuYXBwcm9wcmlhdGUgaW5kZW50YXRpb24gZGVwdGgsIGFzIGEgY29sdW1uIG51bWJlciAoc2VlXG5bYGluZGVudFN0cmluZ2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U3RyaW5nKSksIGF0IHRoZSBzdGFydCBvZiBhIGdpdmVuXG5saW5lLiBBIHJldHVybiB2YWx1ZSBvZiBgbnVsbGAgaW5kaWNhdGVzIG5vIGluZGVudGF0aW9uIGNhbiBiZVxuZGV0ZXJtaW5lZCwgYW5kIHRoZSBsaW5lIHNob3VsZCBpbmhlcml0IHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgb25lXG5hYm92ZSBpdC4gQSByZXR1cm4gdmFsdWUgb2YgYHVuZGVmaW5lZGAgZGVmZXJzIHRvIHRoZSBuZXh0IGluZGVudFxuc2VydmljZS5cbiovXG5jb25zdCBpbmRlbnRTZXJ2aWNlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5GYWNldCBmb3Igb3ZlcnJpZGluZyB0aGUgdW5pdCBieSB3aGljaCBpbmRlbnRhdGlvbiBoYXBwZW5zLiBTaG91bGRcbmJlIGEgc3RyaW5nIGNvbnNpc3RpbmcgZWl0aGVyIGVudGlyZWx5IG9mIHRoZSBzYW1lIHdoaXRlc3BhY2VcbmNoYXJhY3Rlci4gV2hlbiBub3Qgc2V0LCB0aGlzIGRlZmF1bHRzIHRvIDIgc3BhY2VzLlxuKi9cbmNvbnN0IGluZGVudFVuaXQgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4ge1xuICAgICAgICBpZiAoIXZhbHVlcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gXCIgIFwiO1xuICAgICAgICBsZXQgdW5pdCA9IHZhbHVlc1swXTtcbiAgICAgICAgaWYgKCF1bml0IHx8IC9cXFMvLnRlc3QodW5pdCkgfHwgQXJyYXkuZnJvbSh1bml0KS5zb21lKGUgPT4gZSAhPSB1bml0WzBdKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5kZW50IHVuaXQ6IFwiICsgSlNPTi5zdHJpbmdpZnkodmFsdWVzWzBdKSk7XG4gICAgICAgIHJldHVybiB1bml0O1xuICAgIH1cbn0pO1xuLyoqXG5SZXR1cm4gdGhlIF9jb2x1bW4gd2lkdGhfIG9mIGFuIGluZGVudCB1bml0IGluIHRoZSBzdGF0ZS5cbkRldGVybWluZWQgYnkgdGhlIFtgaW5kZW50VW5pdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50VW5pdClcbmZhY2V0LCBhbmQgW2B0YWJTaXplYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50YWJTaXplKSB3aGVuIHRoYXRcbmNvbnRhaW5zIHRhYnMuXG4qL1xuZnVuY3Rpb24gZ2V0SW5kZW50VW5pdChzdGF0ZSkge1xuICAgIGxldCB1bml0ID0gc3RhdGUuZmFjZXQoaW5kZW50VW5pdCk7XG4gICAgcmV0dXJuIHVuaXQuY2hhckNvZGVBdCgwKSA9PSA5ID8gc3RhdGUudGFiU2l6ZSAqIHVuaXQubGVuZ3RoIDogdW5pdC5sZW5ndGg7XG59XG4vKipcbkNyZWF0ZSBhbiBpbmRlbnRhdGlvbiBzdHJpbmcgdGhhdCBjb3ZlcnMgY29sdW1ucyAwIHRvIGBjb2xzYC5cbldpbGwgdXNlIHRhYnMgZm9yIGFzIG11Y2ggb2YgdGhlIGNvbHVtbnMgYXMgcG9zc2libGUgd2hlbiB0aGVcbltgaW5kZW50VW5pdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50VW5pdCkgZmFjZXQgY29udGFpbnNcbnRhYnMuXG4qL1xuZnVuY3Rpb24gaW5kZW50U3RyaW5nKHN0YXRlLCBjb2xzKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCIsIHRzID0gc3RhdGUudGFiU2l6ZSwgY2ggPSBzdGF0ZS5mYWNldChpbmRlbnRVbml0KVswXTtcbiAgICBpZiAoY2ggPT0gXCJcXHRcIikge1xuICAgICAgICB3aGlsZSAoY29scyA+PSB0cykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IFwiXFx0XCI7XG4gICAgICAgICAgICBjb2xzIC09IHRzO1xuICAgICAgICB9XG4gICAgICAgIGNoID0gXCIgXCI7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sczsgaSsrKVxuICAgICAgICByZXN1bHQgKz0gY2g7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuR2V0IHRoZSBpbmRlbnRhdGlvbiwgYXMgYSBjb2x1bW4gbnVtYmVyLCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG5XaWxsIGZpcnN0IGNvbnN1bHQgYW55IFtpbmRlbnQgc2VydmljZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U2VydmljZSlcbnRoYXQgYXJlIHJlZ2lzdGVyZWQsIGFuZCBpZiBub25lIG9mIHRob3NlIHJldHVybiBhbiBpbmRlbnRhdGlvbixcbnRoaXMgd2lsbCBjaGVjayB0aGUgc3ludGF4IHRyZWUgZm9yIHRoZSBbaW5kZW50IG5vZGVcbnByb3BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50Tm9kZVByb3ApIGFuZCB1c2UgdGhhdCBpZiBmb3VuZC4gUmV0dXJucyBhXG5udW1iZXIgd2hlbiBhbiBpbmRlbnRhdGlvbiBjb3VsZCBiZSBkZXRlcm1pbmVkLCBhbmQgbnVsbFxub3RoZXJ3aXNlLlxuKi9cbmZ1bmN0aW9uIGdldEluZGVudGF0aW9uKGNvbnRleHQsIHBvcykge1xuICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWRpdG9yU3RhdGUpXG4gICAgICAgIGNvbnRleHQgPSBuZXcgSW5kZW50Q29udGV4dChjb250ZXh0KTtcbiAgICBmb3IgKGxldCBzZXJ2aWNlIG9mIGNvbnRleHQuc3RhdGUuZmFjZXQoaW5kZW50U2VydmljZSkpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNlcnZpY2UoY29udGV4dCwgcG9zKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKGNvbnRleHQuc3RhdGUpO1xuICAgIHJldHVybiB0cmVlLmxlbmd0aCA+PSBwb3MgPyBzeW50YXhJbmRlbnRhdGlvbihjb250ZXh0LCB0cmVlLCBwb3MpIDogbnVsbDtcbn1cbi8qKlxuQ3JlYXRlIGEgY2hhbmdlIHNldCB0aGF0IGF1dG8taW5kZW50cyBhbGwgbGluZXMgdG91Y2hlZCBieSB0aGVcbmdpdmVuIGRvY3VtZW50IHJhbmdlLlxuKi9cbmZ1bmN0aW9uIGluZGVudFJhbmdlKHN0YXRlLCBmcm9tLCB0bykge1xuICAgIGxldCB1cGRhdGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgY29udGV4dCA9IG5ldyBJbmRlbnRDb250ZXh0KHN0YXRlLCB7IG92ZXJyaWRlSW5kZW50YXRpb246IHN0YXJ0ID0+IHsgdmFyIF9hOyByZXR1cm4gKF9hID0gdXBkYXRlZFtzdGFydF0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IC0xOyB9IH0pO1xuICAgIGxldCBjaGFuZ2VzID0gW107XG4gICAgZm9yIChsZXQgcG9zID0gZnJvbTsgcG9zIDw9IHRvOykge1xuICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgcG9zID0gbGluZS50byArIDE7XG4gICAgICAgIGxldCBpbmRlbnQgPSBnZXRJbmRlbnRhdGlvbihjb250ZXh0LCBsaW5lLmZyb20pO1xuICAgICAgICBpZiAoaW5kZW50ID09IG51bGwpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKCEvXFxTLy50ZXN0KGxpbmUudGV4dCkpXG4gICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICBsZXQgY3VyID0gL15cXHMqLy5leGVjKGxpbmUudGV4dClbMF07XG4gICAgICAgIGxldCBub3JtID0gaW5kZW50U3RyaW5nKHN0YXRlLCBpbmRlbnQpO1xuICAgICAgICBpZiAoY3VyICE9IG5vcm0pIHtcbiAgICAgICAgICAgIHVwZGF0ZWRbbGluZS5mcm9tXSA9IGluZGVudDtcbiAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7IGZyb206IGxpbmUuZnJvbSwgdG86IGxpbmUuZnJvbSArIGN1ci5sZW5ndGgsIGluc2VydDogbm9ybSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhdGUuY2hhbmdlcyhjaGFuZ2VzKTtcbn1cbi8qKlxuSW5kZW50YXRpb24gY29udGV4dHMgYXJlIHVzZWQgd2hlbiBjYWxsaW5nIFtpbmRlbnRhdGlvblxuc2VydmljZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U2VydmljZSkuIFRoZXkgcHJvdmlkZSBoZWxwZXIgdXRpbGl0aWVzXG51c2VmdWwgaW4gaW5kZW50YXRpb24gbG9naWMsIGFuZCBjYW4gc2VsZWN0aXZlbHkgb3ZlcnJpZGUgdGhlXG5pbmRlbnRhdGlvbiByZXBvcnRlZCBmb3Igc29tZSBsaW5lcy5cbiovXG5jbGFzcyBJbmRlbnRDb250ZXh0IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW5kZW50IGNvbnRleHQuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgc3RhdGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy51bml0ID0gZ2V0SW5kZW50VW5pdChzdGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgdGFraW5nXG4gICAgW3NpbXVsYXRlZCBsaW5lXG4gICAgYnJlYWtzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkluZGVudENvbnRleHQuY29uc3RydWN0b3Jeb3B0aW9ucy5zaW11bGF0ZUJyZWFrKVxuICAgIGludG8gYWNjb3VudC4gSWYgdGhlcmUgaXMgc3VjaCBhIGJyZWFrIGF0IGBwb3NgLCB0aGUgYGJpYXNgXG4gICAgYXJndW1lbnQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXJ0IG9mIHRoZSBsaW5lIGxpbmUgYmVmb3JlIG9yXG4gICAgYWZ0ZXIgdGhlIGJyZWFrIGlzIHVzZWQuXG4gICAgKi9cbiAgICBsaW5lQXQocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBsZXQgbGluZSA9IHRoaXMuc3RhdGUuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICBsZXQgeyBzaW11bGF0ZUJyZWFrLCBzaW11bGF0ZURvdWJsZUJyZWFrIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmIChzaW11bGF0ZUJyZWFrICE9IG51bGwgJiYgc2ltdWxhdGVCcmVhayA+PSBsaW5lLmZyb20gJiYgc2ltdWxhdGVCcmVhayA8PSBsaW5lLnRvKSB7XG4gICAgICAgICAgICBpZiAoc2ltdWxhdGVEb3VibGVCcmVhayAmJiBzaW11bGF0ZUJyZWFrID09IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0OiBcIlwiLCBmcm9tOiBwb3MgfTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGJpYXMgPCAwID8gc2ltdWxhdGVCcmVhayA8IHBvcyA6IHNpbXVsYXRlQnJlYWsgPD0gcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHRleHQ6IGxpbmUudGV4dC5zbGljZShzaW11bGF0ZUJyZWFrIC0gbGluZS5mcm9tKSwgZnJvbTogc2ltdWxhdGVCcmVhayB9O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHRleHQ6IGxpbmUudGV4dC5zbGljZSgwLCBzaW11bGF0ZUJyZWFrIC0gbGluZS5mcm9tKSwgZnJvbTogbGluZS5mcm9tIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdGV4dCBkaXJlY3RseSBhZnRlciBgcG9zYCwgZWl0aGVyIHRoZSBlbnRpcmUgbGluZVxuICAgIG9yIHRoZSBuZXh0IDEwMCBjaGFyYWN0ZXJzLCB3aGljaGV2ZXIgaXMgc2hvcnRlci5cbiAgICAqL1xuICAgIHRleHRBZnRlclBvcyhwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2ltdWxhdGVEb3VibGVCcmVhayAmJiBwb3MgPT0gdGhpcy5vcHRpb25zLnNpbXVsYXRlQnJlYWspXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IHsgdGV4dCwgZnJvbSB9ID0gdGhpcy5saW5lQXQocG9zLCBiaWFzKTtcbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UocG9zIC0gZnJvbSwgTWF0aC5taW4odGV4dC5sZW5ndGgsIHBvcyArIDEwMCAtIGZyb20pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgY29sdW1uIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBjb2x1bW4ocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBsZXQgeyB0ZXh0LCBmcm9tIH0gPSB0aGlzLmxpbmVBdChwb3MsIGJpYXMpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5jb3VudENvbHVtbih0ZXh0LCBwb3MgLSBmcm9tKTtcbiAgICAgICAgbGV0IG92ZXJyaWRlID0gdGhpcy5vcHRpb25zLm92ZXJyaWRlSW5kZW50YXRpb24gPyB0aGlzLm9wdGlvbnMub3ZlcnJpZGVJbmRlbnRhdGlvbihmcm9tKSA6IC0xO1xuICAgICAgICBpZiAob3ZlcnJpZGUgPiAtMSlcbiAgICAgICAgICAgIHJlc3VsdCArPSBvdmVycmlkZSAtIHRoaXMuY291bnRDb2x1bW4odGV4dCwgdGV4dC5zZWFyY2goL1xcU3wkLykpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBjb2x1bW4gcG9zaXRpb24gKHRha2luZyB0YWJzIGludG8gYWNjb3VudCkgb2YgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24gaW4gdGhlIGdpdmVuIHN0cmluZy5cbiAgICAqL1xuICAgIGNvdW50Q29sdW1uKGxpbmUsIHBvcyA9IGxpbmUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBjb3VudENvbHVtbihsaW5lLCB0aGlzLnN0YXRlLnRhYlNpemUsIHBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGluZGVudGF0aW9uIGNvbHVtbiBvZiB0aGUgbGluZSBhdCB0aGUgZ2l2ZW4gcG9pbnQuXG4gICAgKi9cbiAgICBsaW5lSW5kZW50KHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgbGV0IHsgdGV4dCwgZnJvbSB9ID0gdGhpcy5saW5lQXQocG9zLCBiaWFzKTtcbiAgICAgICAgbGV0IG92ZXJyaWRlID0gdGhpcy5vcHRpb25zLm92ZXJyaWRlSW5kZW50YXRpb247XG4gICAgICAgIGlmIChvdmVycmlkZSkge1xuICAgICAgICAgICAgbGV0IG92ZXJyaWRlbiA9IG92ZXJyaWRlKGZyb20pO1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlbiA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiBvdmVycmlkZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY291bnRDb2x1bW4odGV4dCwgdGV4dC5zZWFyY2goL1xcU3wkLykpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBbc2ltdWxhdGVkIGxpbmVcbiAgICBicmVha10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5JbmRlbnRDb250ZXh0LmNvbnN0cnVjdG9yXm9wdGlvbnMuc2ltdWxhdGVCcmVhaylcbiAgICBmb3IgdGhpcyBjb250ZXh0LCBpZiBhbnkuXG4gICAgKi9cbiAgICBnZXQgc2ltdWxhdGVkQnJlYWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2ltdWxhdGVCcmVhayB8fCBudWxsO1xuICAgIH1cbn1cbi8qKlxuQSBzeW50YXggdHJlZSBub2RlIHByb3AgdXNlZCB0byBhc3NvY2lhdGUgaW5kZW50YXRpb24gc3RyYXRlZ2llc1xud2l0aCBub2RlIHR5cGVzLiBTdWNoIGEgc3RyYXRlZ3kgaXMgYSBmdW5jdGlvbiBmcm9tIGFuIGluZGVudGF0aW9uXG5jb250ZXh0IHRvIGEgY29sdW1uIG51bWJlciAoc2VlIGFsc29cbltgaW5kZW50U3RyaW5nYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRTdHJpbmcpKSBvciBudWxsLCB3aGVyZSBudWxsXG5pbmRpY2F0ZXMgdGhhdCBubyBkZWZpbml0aXZlIGluZGVudGF0aW9uIGNhbiBiZSBkZXRlcm1pbmVkLlxuKi9cbmNvbnN0IGluZGVudE5vZGVQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLy8gQ29tcHV0ZSB0aGUgaW5kZW50YXRpb24gZm9yIGEgZ2l2ZW4gcG9zaXRpb24gZnJvbSB0aGUgc3ludGF4IHRyZWUuXG5mdW5jdGlvbiBzeW50YXhJbmRlbnRhdGlvbihjeCwgYXN0LCBwb3MpIHtcbiAgICBsZXQgc3RhY2sgPSBhc3QucmVzb2x2ZVN0YWNrKHBvcyk7XG4gICAgbGV0IGlubmVyID0gYXN0LnJlc29sdmVJbm5lcihwb3MsIC0xKS5yZXNvbHZlKHBvcywgMCkuZW50ZXJVbmZpbmlzaGVkTm9kZXNCZWZvcmUocG9zKTtcbiAgICBpZiAoaW5uZXIgIT0gc3RhY2subm9kZSkge1xuICAgICAgICBsZXQgYWRkID0gW107XG4gICAgICAgIGZvciAobGV0IGN1ciA9IGlubmVyOyBjdXIgJiYgIShjdXIuZnJvbSA9PSBzdGFjay5ub2RlLmZyb20gJiYgY3VyLnR5cGUgPT0gc3RhY2subm9kZS50eXBlKTsgY3VyID0gY3VyLnBhcmVudClcbiAgICAgICAgICAgIGFkZC5wdXNoKGN1cik7XG4gICAgICAgIGZvciAobGV0IGkgPSBhZGQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICBzdGFjayA9IHsgbm9kZTogYWRkW2ldLCBuZXh0OiBzdGFjayB9O1xuICAgIH1cbiAgICByZXR1cm4gaW5kZW50Rm9yKHN0YWNrLCBjeCwgcG9zKTtcbn1cbmZ1bmN0aW9uIGluZGVudEZvcihzdGFjaywgY3gsIHBvcykge1xuICAgIGZvciAobGV0IGN1ciA9IHN0YWNrOyBjdXI7IGN1ciA9IGN1ci5uZXh0KSB7XG4gICAgICAgIGxldCBzdHJhdGVneSA9IGluZGVudFN0cmF0ZWd5KGN1ci5ub2RlKTtcbiAgICAgICAgaWYgKHN0cmF0ZWd5KVxuICAgICAgICAgICAgcmV0dXJuIHN0cmF0ZWd5KFRyZWVJbmRlbnRDb250ZXh0LmNyZWF0ZShjeCwgcG9zLCBjdXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5mdW5jdGlvbiBpZ25vcmVDbG9zZWQoY3gpIHtcbiAgICByZXR1cm4gY3gucG9zID09IGN4Lm9wdGlvbnMuc2ltdWxhdGVCcmVhayAmJiBjeC5vcHRpb25zLnNpbXVsYXRlRG91YmxlQnJlYWs7XG59XG5mdW5jdGlvbiBpbmRlbnRTdHJhdGVneSh0cmVlKSB7XG4gICAgbGV0IHN0cmF0ZWd5ID0gdHJlZS50eXBlLnByb3AoaW5kZW50Tm9kZVByb3ApO1xuICAgIGlmIChzdHJhdGVneSlcbiAgICAgICAgcmV0dXJuIHN0cmF0ZWd5O1xuICAgIGxldCBmaXJzdCA9IHRyZWUuZmlyc3RDaGlsZCwgY2xvc2U7XG4gICAgaWYgKGZpcnN0ICYmIChjbG9zZSA9IGZpcnN0LnR5cGUucHJvcChOb2RlUHJvcC5jbG9zZWRCeSkpKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdHJlZS5sYXN0Q2hpbGQsIGNsb3NlZCA9IGxhc3QgJiYgY2xvc2UuaW5kZXhPZihsYXN0Lm5hbWUpID4gLTE7XG4gICAgICAgIHJldHVybiBjeCA9PiBkZWxpbWl0ZWRTdHJhdGVneShjeCwgdHJ1ZSwgMSwgdW5kZWZpbmVkLCBjbG9zZWQgJiYgIWlnbm9yZUNsb3NlZChjeCkgPyBsYXN0LmZyb20gOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJlZS5wYXJlbnQgPT0gbnVsbCA/IHRvcEluZGVudCA6IG51bGw7XG59XG5mdW5jdGlvbiB0b3BJbmRlbnQoKSB7IHJldHVybiAwOyB9XG4vKipcbk9iamVjdHMgb2YgdGhpcyB0eXBlIHByb3ZpZGUgY29udGV4dCBpbmZvcm1hdGlvbiBhbmQgaGVscGVyXG5tZXRob2RzIHRvIGluZGVudGF0aW9uIGZ1bmN0aW9ucyByZWdpc3RlcmVkIG9uIHN5bnRheCBub2Rlcy5cbiovXG5jbGFzcyBUcmVlSW5kZW50Q29udGV4dCBleHRlbmRzIEluZGVudENvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBhdCB3aGljaCBpbmRlbnRhdGlvbiBpcyBiZWluZyBjb21wdXRlZC5cbiAgICAqL1xuICAgIHBvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKGJhc2Uuc3RhdGUsIGJhc2Uub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc3ludGF4IHRyZWUgbm9kZSB0byB3aGljaCB0aGUgaW5kZW50YXRpb24gc3RyYXRlZ3lcbiAgICBhcHBsaWVzLlxuICAgICovXG4gICAgZ2V0IG5vZGUoKSB7IHJldHVybiB0aGlzLmNvbnRleHQubm9kZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShiYXNlLCBwb3MsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlSW5kZW50Q29udGV4dChiYXNlLCBwb3MsIGNvbnRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHRleHQgZGlyZWN0bHkgYWZ0ZXIgYHRoaXMucG9zYCwgZWl0aGVyIHRoZSBlbnRpcmUgbGluZVxuICAgIG9yIHRoZSBuZXh0IDEwMCBjaGFyYWN0ZXJzLCB3aGljaGV2ZXIgaXMgc2hvcnRlci5cbiAgICAqL1xuICAgIGdldCB0ZXh0QWZ0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRBZnRlclBvcyh0aGlzLnBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgaW5kZW50YXRpb24gYXQgdGhlIHJlZmVyZW5jZSBsaW5lIGZvciBgdGhpcy5ub2RlYCwgd2hpY2hcbiAgICBpcyB0aGUgbGluZSBvbiB3aGljaCBpdCBzdGFydHMsIHVubGVzcyB0aGVyZSBpcyBhIG5vZGUgdGhhdCBpc1xuICAgIF9ub3RfIGEgcGFyZW50IG9mIHRoaXMgbm9kZSBjb3ZlcmluZyB0aGUgc3RhcnQgb2YgdGhhdCBsaW5lLiBJZlxuICAgIHNvLCB0aGUgbGluZSBhdCB0aGUgc3RhcnQgb2YgdGhhdCBub2RlIGlzIHRyaWVkLCBhZ2FpbiBza2lwcGluZ1xuICAgIG9uIGlmIGl0IGlzIGNvdmVyZWQgYnkgYW5vdGhlciBzdWNoIG5vZGUuXG4gICAgKi9cbiAgICBnZXQgYmFzZUluZGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUluZGVudEZvcih0aGlzLm5vZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGluZGVudGF0aW9uIGZvciB0aGUgcmVmZXJlbmNlIGxpbmUgb2YgdGhlIGdpdmVuIG5vZGVcbiAgICAoc2VlIFtgYmFzZUluZGVudGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuVHJlZUluZGVudENvbnRleHQuYmFzZUluZGVudCkpLlxuICAgICovXG4gICAgYmFzZUluZGVudEZvcihub2RlKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5zdGF0ZS5kb2MubGluZUF0KG5vZGUuZnJvbSk7XG4gICAgICAgIC8vIFNraXAgbGluZSBzdGFydHMgdGhhdCBhcmUgY292ZXJlZCBieSBhIHNpYmxpbmcgKG9yIGNvdXNpbiwgZXRjKVxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgYXRCcmVhayA9IG5vZGUucmVzb2x2ZShsaW5lLmZyb20pO1xuICAgICAgICAgICAgd2hpbGUgKGF0QnJlYWsucGFyZW50ICYmIGF0QnJlYWsucGFyZW50LmZyb20gPT0gYXRCcmVhay5mcm9tKVxuICAgICAgICAgICAgICAgIGF0QnJlYWsgPSBhdEJyZWFrLnBhcmVudDtcbiAgICAgICAgICAgIGlmIChpc1BhcmVudChhdEJyZWFrLCBub2RlKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQoYXRCcmVhay5mcm9tKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5saW5lSW5kZW50KGxpbmUuZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnRpbnVlIGxvb2tpbmcgZm9yIGluZGVudGF0aW9ucyBpbiB0aGUgbm9kZSdzIHBhcmVudCBub2RlcyxcbiAgICBhbmQgcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhhdC5cbiAgICAqL1xuICAgIGNvbnRpbnVlKCkge1xuICAgICAgICByZXR1cm4gaW5kZW50Rm9yKHRoaXMuY29udGV4dC5uZXh0LCB0aGlzLmJhc2UsIHRoaXMucG9zKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1BhcmVudChwYXJlbnQsIG9mKSB7XG4gICAgZm9yIChsZXQgY3VyID0gb2Y7IGN1cjsgY3VyID0gY3VyLnBhcmVudClcbiAgICAgICAgaWYgKHBhcmVudCA9PSBjdXIpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBDaGVjayB3aGV0aGVyIGEgZGVsaW1pdGVkIG5vZGUgaXMgYWxpZ25lZCAobWVhbmluZyB0aGVyZSBhcmVcbi8vIG5vbi1za2lwcGVkIG5vZGVzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIG9wZW5pbmcgZGVsaW1pdGVyKS4gQW5kXG4vLyBpZiBzbywgcmV0dXJuIHRoZSBvcGVuaW5nIHRva2VuLlxuZnVuY3Rpb24gYnJhY2tldGVkQWxpZ25lZChjb250ZXh0KSB7XG4gICAgbGV0IHRyZWUgPSBjb250ZXh0Lm5vZGU7XG4gICAgbGV0IG9wZW5Ub2tlbiA9IHRyZWUuY2hpbGRBZnRlcih0cmVlLmZyb20pLCBsYXN0ID0gdHJlZS5sYXN0Q2hpbGQ7XG4gICAgaWYgKCFvcGVuVG9rZW4pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBzaW0gPSBjb250ZXh0Lm9wdGlvbnMuc2ltdWxhdGVCcmVhaztcbiAgICBsZXQgb3BlbkxpbmUgPSBjb250ZXh0LnN0YXRlLmRvYy5saW5lQXQob3BlblRva2VuLmZyb20pO1xuICAgIGxldCBsaW5lRW5kID0gc2ltID09IG51bGwgfHwgc2ltIDw9IG9wZW5MaW5lLmZyb20gPyBvcGVuTGluZS50byA6IE1hdGgubWluKG9wZW5MaW5lLnRvLCBzaW0pO1xuICAgIGZvciAobGV0IHBvcyA9IG9wZW5Ub2tlbi50bzs7KSB7XG4gICAgICAgIGxldCBuZXh0ID0gdHJlZS5jaGlsZEFmdGVyKHBvcyk7XG4gICAgICAgIGlmICghbmV4dCB8fCBuZXh0ID09IGxhc3QpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFuZXh0LnR5cGUuaXNTa2lwcGVkKSB7XG4gICAgICAgICAgICBpZiAobmV4dC5mcm9tID49IGxpbmVFbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBsZXQgc3BhY2UgPSAvXiAqLy5leGVjKG9wZW5MaW5lLnRleHQuc2xpY2Uob3BlblRva2VuLnRvIC0gb3BlbkxpbmUuZnJvbSkpWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IG9wZW5Ub2tlbi5mcm9tLCB0bzogb3BlblRva2VuLnRvICsgc3BhY2UgfTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBuZXh0LnRvO1xuICAgIH1cbn1cbi8qKlxuQW4gaW5kZW50YXRpb24gc3RyYXRlZ3kgZm9yIGRlbGltaXRlZCAodXN1YWxseSBicmFja2V0ZWQpIG5vZGVzLlxuV2lsbCwgYnkgZGVmYXVsdCwgaW5kZW50IG9uZSB1bml0IG1vcmUgdGhhbiB0aGUgcGFyZW50J3MgYmFzZVxuaW5kZW50IHVubGVzcyB0aGUgbGluZSBzdGFydHMgd2l0aCBhIGNsb3NpbmcgdG9rZW4uIFdoZW4gYGFsaWduYFxuaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG5vbi1za2lwcGVkIG5vZGVzIG9uIHRoZSBub2RlJ3Mgb3BlbmluZ1xubGluZSwgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUgd2lsbCBiZSBhbGlnbmVkIHdpdGggdGhlIGVuZCBvZiB0aGVcbm9wZW5pbmcgbm9kZSwgbGlrZSB0aGlzOlxuXG4gICAgZm9vKGJhcixcbiAgICAgICAgYmF6KVxuKi9cbmZ1bmN0aW9uIGRlbGltaXRlZEluZGVudCh7IGNsb3NpbmcsIGFsaWduID0gdHJ1ZSwgdW5pdHMgPSAxIH0pIHtcbiAgICByZXR1cm4gKGNvbnRleHQpID0+IGRlbGltaXRlZFN0cmF0ZWd5KGNvbnRleHQsIGFsaWduLCB1bml0cywgY2xvc2luZyk7XG59XG5mdW5jdGlvbiBkZWxpbWl0ZWRTdHJhdGVneShjb250ZXh0LCBhbGlnbiwgdW5pdHMsIGNsb3NpbmcsIGNsb3NlZEF0KSB7XG4gICAgbGV0IGFmdGVyID0gY29udGV4dC50ZXh0QWZ0ZXIsIHNwYWNlID0gYWZ0ZXIubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoO1xuICAgIGxldCBjbG9zZWQgPSBjbG9zaW5nICYmIGFmdGVyLnNsaWNlKHNwYWNlLCBzcGFjZSArIGNsb3NpbmcubGVuZ3RoKSA9PSBjbG9zaW5nIHx8IGNsb3NlZEF0ID09IGNvbnRleHQucG9zICsgc3BhY2U7XG4gICAgbGV0IGFsaWduZWQgPSBhbGlnbiA/IGJyYWNrZXRlZEFsaWduZWQoY29udGV4dCkgOiBudWxsO1xuICAgIGlmIChhbGlnbmVkKVxuICAgICAgICByZXR1cm4gY2xvc2VkID8gY29udGV4dC5jb2x1bW4oYWxpZ25lZC5mcm9tKSA6IGNvbnRleHQuY29sdW1uKGFsaWduZWQudG8pO1xuICAgIHJldHVybiBjb250ZXh0LmJhc2VJbmRlbnQgKyAoY2xvc2VkID8gMCA6IGNvbnRleHQudW5pdCAqIHVuaXRzKTtcbn1cbi8qKlxuQW4gaW5kZW50YXRpb24gc3RyYXRlZ3kgdGhhdCBhbGlnbnMgYSBub2RlJ3MgY29udGVudCB0byBpdHMgYmFzZVxuaW5kZW50YXRpb24uXG4qL1xuY29uc3QgZmxhdEluZGVudCA9IChjb250ZXh0KSA9PiBjb250ZXh0LmJhc2VJbmRlbnQ7XG4vKipcbkNyZWF0ZXMgYW4gaW5kZW50YXRpb24gc3RyYXRlZ3kgdGhhdCwgYnkgZGVmYXVsdCwgaW5kZW50c1xuY29udGludWVkIGxpbmVzIG9uZSB1bml0IG1vcmUgdGhhbiB0aGUgbm9kZSdzIGJhc2UgaW5kZW50YXRpb24uXG5Zb3UgY2FuIHByb3ZpZGUgYGV4Y2VwdGAgdG8gcHJldmVudCBpbmRlbnRhdGlvbiBvZiBsaW5lcyB0aGF0XG5tYXRjaCBhIHBhdHRlcm4gKGZvciBleGFtcGxlIGAvXmVsc2VcXGIvYCBpbiBgaWZgL2BlbHNlYFxuY29uc3RydWN0cyksIGFuZCB5b3UgY2FuIGNoYW5nZSB0aGUgYW1vdW50IG9mIHVuaXRzIHVzZWQgd2l0aCB0aGVcbmB1bml0c2Agb3B0aW9uLlxuKi9cbmZ1bmN0aW9uIGNvbnRpbnVlZEluZGVudCh7IGV4Y2VwdCwgdW5pdHMgPSAxIH0gPSB7fSkge1xuICAgIHJldHVybiAoY29udGV4dCkgPT4ge1xuICAgICAgICBsZXQgbWF0Y2hFeGNlcHQgPSBleGNlcHQgJiYgZXhjZXB0LnRlc3QoY29udGV4dC50ZXh0QWZ0ZXIpO1xuICAgICAgICByZXR1cm4gY29udGV4dC5iYXNlSW5kZW50ICsgKG1hdGNoRXhjZXB0ID8gMCA6IHVuaXRzICogY29udGV4dC51bml0KTtcbiAgICB9O1xufVxuY29uc3QgRG9udEluZGVudEJleW9uZCA9IDIwMDtcbi8qKlxuRW5hYmxlcyByZWluZGVudGF0aW9uIG9uIGlucHV0LiBXaGVuIGEgbGFuZ3VhZ2UgZGVmaW5lcyBhblxuYGluZGVudE9uSW5wdXRgIGZpZWxkIGluIGl0cyBbbGFuZ3VhZ2VcbmRhdGFdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUubGFuZ3VhZ2VEYXRhQXQpLCB3aGljaCBtdXN0IGhvbGQgYSByZWd1bGFyXG5leHByZXNzaW9uLCB0aGUgbGluZSBhdCB0aGUgY3Vyc29yIHdpbGwgYmUgcmVpbmRlbnRlZCB3aGVuZXZlciBuZXdcbnRleHQgaXMgdHlwZWQgYW5kIHRoZSBpbnB1dCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbGluZSB1cCB0byB0aGVcbmN1cnNvciBtYXRjaGVzIHRoYXQgcmVnZXhwLlxuXG5UbyBhdm9pZCB1bm5lY2Nlc2FyeSByZWluZGVudHMsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHN0YXJ0IHRoZVxucmVnZXhwIHdpdGggYF5gICh1c3VhbGx5IGZvbGxvd2VkIGJ5IGBcXHMqYCksIGFuZCBlbmQgaXQgd2l0aCBgJGAuXG5Gb3IgZXhhbXBsZSwgYC9eXFxzKlxcfSQvYCB3aWxsIHJlaW5kZW50IHdoZW4gYSBjbG9zaW5nIGJyYWNlIGlzXG5hZGRlZCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLlxuKi9cbmZ1bmN0aW9uIGluZGVudE9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIEVkaXRvclN0YXRlLnRyYW5zYWN0aW9uRmlsdGVyLm9mKHRyID0+IHtcbiAgICAgICAgaWYgKCF0ci5kb2NDaGFuZ2VkIHx8ICF0ci5pc1VzZXJFdmVudChcImlucHV0LnR5cGVcIikgJiYgIXRyLmlzVXNlckV2ZW50KFwiaW5wdXQuY29tcGxldGVcIikpXG4gICAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIGxldCBydWxlcyA9IHRyLnN0YXJ0U3RhdGUubGFuZ3VhZ2VEYXRhQXQoXCJpbmRlbnRPbklucHV0XCIsIHRyLnN0YXJ0U3RhdGUuc2VsZWN0aW9uLm1haW4uaGVhZCk7XG4gICAgICAgIGlmICghcnVsZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRyO1xuICAgICAgICBsZXQgZG9jID0gdHIubmV3RG9jLCB7IGhlYWQgfSA9IHRyLm5ld1NlbGVjdGlvbi5tYWluLCBsaW5lID0gZG9jLmxpbmVBdChoZWFkKTtcbiAgICAgICAgaWYgKGhlYWQgPiBsaW5lLmZyb20gKyBEb250SW5kZW50QmV5b25kKVxuICAgICAgICAgICAgcmV0dXJuIHRyO1xuICAgICAgICBsZXQgbGluZVN0YXJ0ID0gZG9jLnNsaWNlU3RyaW5nKGxpbmUuZnJvbSwgaGVhZCk7XG4gICAgICAgIGlmICghcnVsZXMuc29tZShyID0+IHIudGVzdChsaW5lU3RhcnQpKSlcbiAgICAgICAgICAgIHJldHVybiB0cjtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHRyLCBsYXN0ID0gLTEsIGNoYW5nZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgeyBoZWFkIH0gb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KGhlYWQpO1xuICAgICAgICAgICAgaWYgKGxpbmUuZnJvbSA9PSBsYXN0KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGFzdCA9IGxpbmUuZnJvbTtcbiAgICAgICAgICAgIGxldCBpbmRlbnQgPSBnZXRJbmRlbnRhdGlvbihzdGF0ZSwgbGluZS5mcm9tKTtcbiAgICAgICAgICAgIGlmIChpbmRlbnQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBjdXIgPSAvXlxccyovLmV4ZWMobGluZS50ZXh0KVswXTtcbiAgICAgICAgICAgIGxldCBub3JtID0gaW5kZW50U3RyaW5nKHN0YXRlLCBpbmRlbnQpO1xuICAgICAgICAgICAgaWYgKGN1ciAhPSBub3JtKVxuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7IGZyb206IGxpbmUuZnJvbSwgdG86IGxpbmUuZnJvbSArIGN1ci5sZW5ndGgsIGluc2VydDogbm9ybSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hhbmdlcy5sZW5ndGggPyBbdHIsIHsgY2hhbmdlcywgc2VxdWVudGlhbDogdHJ1ZSB9XSA6IHRyO1xuICAgIH0pO1xufVxuXG4vKipcbkEgZmFjZXQgdGhhdCByZWdpc3RlcnMgYSBjb2RlIGZvbGRpbmcgc2VydmljZS4gV2hlbiBjYWxsZWQgd2l0aFxudGhlIGV4dGVudCBvZiBhIGxpbmUsIHN1Y2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgZm9sZGFibGVcbnJhbmdlIHRoYXQgc3RhcnRzIG9uIHRoYXQgbGluZSAoYnV0IGNvbnRpbnVlcyBiZXlvbmQgaXQpLCBpZiBvbmVcbmNhbiBiZSBmb3VuZC5cbiovXG5jb25zdCBmb2xkU2VydmljZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuVGhpcyBub2RlIHByb3AgaXMgdXNlZCB0byBhc3NvY2lhdGUgZm9sZGluZyBpbmZvcm1hdGlvbiB3aXRoXG5zeW50YXggbm9kZSB0eXBlcy4gR2l2ZW4gYSBzeW50YXggbm9kZSwgaXQgc2hvdWxkIGNoZWNrIHdoZXRoZXJcbnRoYXQgdHJlZSBpcyBmb2xkYWJsZSBhbmQgcmV0dXJuIHRoZSByYW5nZSB0aGF0IGNhbiBiZSBjb2xsYXBzZWRcbndoZW4gaXQgaXMuXG4qL1xuY29uc3QgZm9sZE5vZGVQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLyoqXG5bRm9sZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkTm9kZVByb3ApIGZ1bmN0aW9uIHRoYXQgZm9sZHMgZXZlcnl0aGluZyBidXRcbnRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgY2hpbGQgb2YgYSBzeW50YXggbm9kZS4gVXNlZnVsIGZvciBub2Rlc1xudGhhdCBzdGFydCBhbmQgZW5kIHdpdGggZGVsaW1pdGVycy5cbiovXG5mdW5jdGlvbiBmb2xkSW5zaWRlKG5vZGUpIHtcbiAgICBsZXQgZmlyc3QgPSBub2RlLmZpcnN0Q2hpbGQsIGxhc3QgPSBub2RlLmxhc3RDaGlsZDtcbiAgICByZXR1cm4gZmlyc3QgJiYgZmlyc3QudG8gPCBsYXN0LmZyb20gPyB7IGZyb206IGZpcnN0LnRvLCB0bzogbGFzdC50eXBlLmlzRXJyb3IgPyBub2RlLnRvIDogbGFzdC5mcm9tIH0gOiBudWxsO1xufVxuZnVuY3Rpb24gc3ludGF4Rm9sZGluZyhzdGF0ZSwgc3RhcnQsIGVuZCkge1xuICAgIGxldCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSk7XG4gICAgaWYgKHRyZWUubGVuZ3RoIDwgZW5kKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgc3RhY2sgPSB0cmVlLnJlc29sdmVTdGFjayhlbmQsIDEpO1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgZm9yIChsZXQgaXRlciA9IHN0YWNrOyBpdGVyOyBpdGVyID0gaXRlci5uZXh0KSB7XG4gICAgICAgIGxldCBjdXIgPSBpdGVyLm5vZGU7XG4gICAgICAgIGlmIChjdXIudG8gPD0gZW5kIHx8IGN1ci5mcm9tID4gZW5kKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChmb3VuZCAmJiBjdXIuZnJvbSA8IHN0YXJ0KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGxldCBwcm9wID0gY3VyLnR5cGUucHJvcChmb2xkTm9kZVByb3ApO1xuICAgICAgICBpZiAocHJvcCAmJiAoY3VyLnRvIDwgdHJlZS5sZW5ndGggLSA1MCB8fCB0cmVlLmxlbmd0aCA9PSBzdGF0ZS5kb2MubGVuZ3RoIHx8ICFpc1VuZmluaXNoZWQoY3VyKSkpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHByb3AoY3VyLCBzdGF0ZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUuZnJvbSA8PSBlbmQgJiYgdmFsdWUuZnJvbSA+PSBzdGFydCAmJiB2YWx1ZS50byA+IGVuZClcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbn1cbmZ1bmN0aW9uIGlzVW5maW5pc2hlZChub2RlKSB7XG4gICAgbGV0IGNoID0gbm9kZS5sYXN0Q2hpbGQ7XG4gICAgcmV0dXJuIGNoICYmIGNoLnRvID09IG5vZGUudG8gJiYgY2gudHlwZS5pc0Vycm9yO1xufVxuLyoqXG5DaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBsaW5lIGlzIGZvbGRhYmxlLiBGaXJzdCBhc2tzIGFueSBmb2xkXG5zZXJ2aWNlcyByZWdpc3RlcmVkIHRocm91Z2hcbltgZm9sZFNlcnZpY2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGRTZXJ2aWNlKSwgYW5kIGlmIG5vbmUgb2YgdGhlbSByZXR1cm5cbmEgcmVzdWx0LCB0cmllcyB0byBxdWVyeSB0aGUgW2ZvbGQgbm9kZVxucHJvcF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkTm9kZVByb3ApIG9mIHN5bnRheCBub2RlcyB0aGF0IGNvdmVyIHRoZSBlbmRcbm9mIHRoZSBsaW5lLlxuKi9cbmZ1bmN0aW9uIGZvbGRhYmxlKHN0YXRlLCBsaW5lU3RhcnQsIGxpbmVFbmQpIHtcbiAgICBmb3IgKGxldCBzZXJ2aWNlIG9mIHN0YXRlLmZhY2V0KGZvbGRTZXJ2aWNlKSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gc2VydmljZShzdGF0ZSwgbGluZVN0YXJ0LCBsaW5lRW5kKTtcbiAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBzeW50YXhGb2xkaW5nKHN0YXRlLCBsaW5lU3RhcnQsIGxpbmVFbmQpO1xufVxuZnVuY3Rpb24gbWFwUmFuZ2UocmFuZ2UsIG1hcHBpbmcpIHtcbiAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwUG9zKHJhbmdlLmZyb20sIDEpLCB0byA9IG1hcHBpbmcubWFwUG9zKHJhbmdlLnRvLCAtMSk7XG4gICAgcmV0dXJuIGZyb20gPj0gdG8gPyB1bmRlZmluZWQgOiB7IGZyb20sIHRvIH07XG59XG4vKipcblN0YXRlIGVmZmVjdCB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIHRyYW5zYWN0aW9uIHRvIGZvbGQgdGhlXG5naXZlbiByYW5nZS4gKFlvdSBwcm9iYWJseSBvbmx5IG5lZWQgdGhpcyBpbiBleGNlcHRpb25hbFxuY2lyY3Vtc3RhbmNlc1x1MjAxNHVzdWFsbHkgeW91J2xsIGp1c3Qgd2FudCB0byBsZXRcbltgZm9sZENvZGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGRDb2RlKSBhbmQgdGhlIFtmb2xkXG5ndXR0ZXJdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZEd1dHRlcikgY3JlYXRlIHRoZSB0cmFuc2FjdGlvbnMuKVxuKi9cbmNvbnN0IGZvbGRFZmZlY3QgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKHsgbWFwOiBtYXBSYW5nZSB9KTtcbi8qKlxuU3RhdGUgZWZmZWN0IHRoYXQgdW5mb2xkcyB0aGUgZ2l2ZW4gcmFuZ2UgKGlmIGl0IHdhcyBmb2xkZWQpLlxuKi9cbmNvbnN0IHVuZm9sZEVmZmVjdCA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoeyBtYXA6IG1hcFJhbmdlIH0pO1xuZnVuY3Rpb24gc2VsZWN0ZWRMaW5lcyh2aWV3KSB7XG4gICAgbGV0IGxpbmVzID0gW107XG4gICAgZm9yIChsZXQgeyBoZWFkIH0gb2Ygdmlldy5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgIGlmIChsaW5lcy5zb21lKGwgPT4gbC5mcm9tIDw9IGhlYWQgJiYgbC50byA+PSBoZWFkKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsaW5lcy5wdXNoKHZpZXcubGluZUJsb2NrQXQoaGVhZCkpO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXM7XG59XG4vKipcblRoZSBzdGF0ZSBmaWVsZCB0aGF0IHN0b3JlcyB0aGUgZm9sZGVkIHJhbmdlcyAoYXMgYSBbZGVjb3JhdGlvblxuc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvblNldCkpLiBDYW4gYmUgcGFzc2VkIHRvXG5bYEVkaXRvclN0YXRlLnRvSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUudG9KU09OKSBhbmRcbltgZnJvbUpTT05gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmZyb21KU09OKSB0byBzZXJpYWxpemUgdGhlIGZvbGRcbnN0YXRlLlxuKi9cbmNvbnN0IGZvbGRTdGF0ZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5ub25lO1xuICAgIH0sXG4gICAgdXBkYXRlKGZvbGRlZCwgdHIpIHtcbiAgICAgICAgZm9sZGVkID0gZm9sZGVkLm1hcCh0ci5jaGFuZ2VzKTtcbiAgICAgICAgZm9yIChsZXQgZSBvZiB0ci5lZmZlY3RzKSB7XG4gICAgICAgICAgICBpZiAoZS5pcyhmb2xkRWZmZWN0KSAmJiAhZm9sZEV4aXN0cyhmb2xkZWQsIGUudmFsdWUuZnJvbSwgZS52YWx1ZS50bykpIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBwcmVwYXJlUGxhY2Vob2xkZXIgfSA9IHRyLnN0YXRlLmZhY2V0KGZvbGRDb25maWcpO1xuICAgICAgICAgICAgICAgIGxldCB3aWRnZXQgPSAhcHJlcGFyZVBsYWNlaG9sZGVyID8gZm9sZFdpZGdldCA6XG4gICAgICAgICAgICAgICAgICAgIERlY29yYXRpb24ucmVwbGFjZSh7IHdpZGdldDogbmV3IFByZXBhcmVkRm9sZFdpZGdldChwcmVwYXJlUGxhY2Vob2xkZXIodHIuc3RhdGUsIGUudmFsdWUpKSB9KTtcbiAgICAgICAgICAgICAgICBmb2xkZWQgPSBmb2xkZWQudXBkYXRlKHsgYWRkOiBbd2lkZ2V0LnJhbmdlKGUudmFsdWUuZnJvbSwgZS52YWx1ZS50byldIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZS5pcyh1bmZvbGRFZmZlY3QpKSB7XG4gICAgICAgICAgICAgICAgZm9sZGVkID0gZm9sZGVkLnVwZGF0ZSh7IGZpbHRlcjogKGZyb20sIHRvKSA9PiBlLnZhbHVlLmZyb20gIT0gZnJvbSB8fCBlLnZhbHVlLnRvICE9IHRvLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGcm9tOiBlLnZhbHVlLmZyb20sIGZpbHRlclRvOiBlLnZhbHVlLnRvIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENsZWFyIGZvbGRlZCByYW5nZXMgdGhhdCBjb3ZlciB0aGUgc2VsZWN0aW9uIGhlYWRcbiAgICAgICAgaWYgKHRyLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgbGV0IG9uU2VsZWN0aW9uID0gZmFsc2UsIHsgaGVhZCB9ID0gdHIuc2VsZWN0aW9uLm1haW47XG4gICAgICAgICAgICBmb2xkZWQuYmV0d2VlbihoZWFkLCBoZWFkLCAoYSwgYikgPT4geyBpZiAoYSA8IGhlYWQgJiYgYiA+IGhlYWQpXG4gICAgICAgICAgICAgICAgb25TZWxlY3Rpb24gPSB0cnVlOyB9KTtcbiAgICAgICAgICAgIGlmIChvblNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICBmb2xkZWQgPSBmb2xkZWQudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyRnJvbTogaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVG86IGhlYWQsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcjogKGEsIGIpID0+IGIgPD0gaGVhZCB8fCBhID49IGhlYWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9sZGVkO1xuICAgIH0sXG4gICAgcHJvdmlkZTogZiA9PiBFZGl0b3JWaWV3LmRlY29yYXRpb25zLmZyb20oZiksXG4gICAgdG9KU09OKGZvbGRlZCwgc3RhdGUpIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgICAgICBmb2xkZWQuYmV0d2VlbigwLCBzdGF0ZS5kb2MubGVuZ3RoLCAoZnJvbSwgdG8pID0+IHsgcmFuZ2VzLnB1c2goZnJvbSwgdG8pOyB9KTtcbiAgICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICB9LFxuICAgIGZyb21KU09OKHZhbHVlKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUubGVuZ3RoICUgMilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIGZvciBmb2xkIHN0YXRlXCIpO1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGZyb20gPSB2YWx1ZVtpKytdLCB0byA9IHZhbHVlW2krK107XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdG8gIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiBmb3IgZm9sZCBzdGF0ZVwiKTtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKGZvbGRXaWRnZXQucmFuZ2UoZnJvbSwgdG8pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5zZXQocmFuZ2VzLCB0cnVlKTtcbiAgICB9XG59KTtcbi8qKlxuR2V0IGEgW3JhbmdlIHNldF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZVNldCkgY29udGFpbmluZyB0aGUgZm9sZGVkIHJhbmdlc1xuaW4gdGhlIGdpdmVuIHN0YXRlLlxuKi9cbmZ1bmN0aW9uIGZvbGRlZFJhbmdlcyhzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKSB8fCBSYW5nZVNldC5lbXB0eTtcbn1cbmZ1bmN0aW9uIGZpbmRGb2xkKHN0YXRlLCBmcm9tLCB0bykge1xuICAgIHZhciBfYTtcbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIChfYSA9IHN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYmV0d2Vlbihmcm9tLCB0bywgKGZyb20sIHRvKSA9PiB7XG4gICAgICAgIGlmICghZm91bmQgfHwgZm91bmQuZnJvbSA+IGZyb20pXG4gICAgICAgICAgICBmb3VuZCA9IHsgZnJvbSwgdG8gfTtcbiAgICB9KTtcbiAgICByZXR1cm4gZm91bmQ7XG59XG5mdW5jdGlvbiBmb2xkRXhpc3RzKGZvbGRlZCwgZnJvbSwgdG8pIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBmb2xkZWQuYmV0d2Vlbihmcm9tLCBmcm9tLCAoYSwgYikgPT4geyBpZiAoYSA9PSBmcm9tICYmIGIgPT0gdG8pXG4gICAgICAgIGZvdW5kID0gdHJ1ZTsgfSk7XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuZnVuY3Rpb24gbWF5YmVFbmFibGUoc3RhdGUsIG90aGVyKSB7XG4gICAgcmV0dXJuIHN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpID8gb3RoZXIgOiBvdGhlci5jb25jYXQoU3RhdGVFZmZlY3QuYXBwZW5kQ29uZmlnLm9mKGNvZGVGb2xkaW5nKCkpKTtcbn1cbi8qKlxuRm9sZCB0aGUgbGluZXMgdGhhdCBhcmUgc2VsZWN0ZWQsIGlmIHBvc3NpYmxlLlxuKi9cbmNvbnN0IGZvbGRDb2RlID0gdmlldyA9PiB7XG4gICAgZm9yIChsZXQgbGluZSBvZiBzZWxlY3RlZExpbmVzKHZpZXcpKSB7XG4gICAgICAgIGxldCByYW5nZSA9IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IG1heWJlRW5hYmxlKHZpZXcuc3RhdGUsIFtmb2xkRWZmZWN0Lm9mKHJhbmdlKSwgYW5ub3VuY2VGb2xkKHZpZXcsIHJhbmdlKV0pIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbi8qKlxuVW5mb2xkIGZvbGRlZCByYW5nZXMgb24gc2VsZWN0ZWQgbGluZXMuXG4qL1xuY29uc3QgdW5mb2xkQ29kZSA9IHZpZXcgPT4ge1xuICAgIGlmICghdmlldy5zdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgbGluZSBvZiBzZWxlY3RlZExpbmVzKHZpZXcpKSB7XG4gICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGVkKVxuICAgICAgICAgICAgZWZmZWN0cy5wdXNoKHVuZm9sZEVmZmVjdC5vZihmb2xkZWQpLCBhbm5vdW5jZUZvbGQodmlldywgZm9sZGVkLCBmYWxzZSkpO1xuICAgIH1cbiAgICBpZiAoZWZmZWN0cy5sZW5ndGgpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzIH0pO1xuICAgIHJldHVybiBlZmZlY3RzLmxlbmd0aCA+IDA7XG59O1xuZnVuY3Rpb24gYW5ub3VuY2VGb2xkKHZpZXcsIHJhbmdlLCBmb2xkID0gdHJ1ZSkge1xuICAgIGxldCBsaW5lRnJvbSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChyYW5nZS5mcm9tKS5udW1iZXIsIGxpbmVUbyA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChyYW5nZS50bykubnVtYmVyO1xuICAgIHJldHVybiBFZGl0b3JWaWV3LmFubm91bmNlLm9mKGAke3ZpZXcuc3RhdGUucGhyYXNlKGZvbGQgPyBcIkZvbGRlZCBsaW5lc1wiIDogXCJVbmZvbGRlZCBsaW5lc1wiKX0gJHtsaW5lRnJvbX0gJHt2aWV3LnN0YXRlLnBocmFzZShcInRvXCIpfSAke2xpbmVUb30uYCk7XG59XG4vKipcbkZvbGQgYWxsIHRvcC1sZXZlbCBmb2xkYWJsZSByYW5nZXMuIE5vdGUgdGhhdCwgaW4gbW9zdCBjYXNlcyxcbmZvbGRpbmcgaW5mb3JtYXRpb24gd2lsbCBkZXBlbmQgb24gdGhlIFtzeW50YXhcbnRyZWVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2Uuc3ludGF4VHJlZSksIGFuZCBmb2xkaW5nIGV2ZXJ5dGhpbmcgbWF5IG5vdCB3b3JrXG5yZWxpYWJseSB3aGVuIHRoZSBkb2N1bWVudCBoYXNuJ3QgYmVlbiBmdWxseSBwYXJzZWQgKGVpdGhlclxuYmVjYXVzZSB0aGUgZWRpdG9yIHN0YXRlIHdhcyBvbmx5IGp1c3QgaW5pdGlhbGl6ZWQsIG9yIGJlY2F1c2UgdGhlXG5kb2N1bWVudCBpcyBzbyBiaWcgdGhhdCB0aGUgcGFyc2VyIGRlY2lkZWQgbm90IHRvIHBhcnNlIGl0XG5lbnRpcmVseSkuXG4qL1xuY29uc3QgZm9sZEFsbCA9IHZpZXcgPT4ge1xuICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgcG9zID0gMDsgcG9zIDwgc3RhdGUuZG9jLmxlbmd0aDspIHtcbiAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHBvcyksIHJhbmdlID0gZm9sZGFibGUoc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChyYW5nZSlcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaChmb2xkRWZmZWN0Lm9mKHJhbmdlKSk7XG4gICAgICAgIHBvcyA9IChyYW5nZSA/IHZpZXcubGluZUJsb2NrQXQocmFuZ2UudG8pIDogbGluZSkudG8gKyAxO1xuICAgIH1cbiAgICBpZiAoZWZmZWN0cy5sZW5ndGgpXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBtYXliZUVuYWJsZSh2aWV3LnN0YXRlLCBlZmZlY3RzKSB9KTtcbiAgICByZXR1cm4gISFlZmZlY3RzLmxlbmd0aDtcbn07XG4vKipcblVuZm9sZCBhbGwgZm9sZGVkIGNvZGUuXG4qL1xuY29uc3QgdW5mb2xkQWxsID0gdmlldyA9PiB7XG4gICAgbGV0IGZpZWxkID0gdmlldy5zdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKTtcbiAgICBpZiAoIWZpZWxkIHx8ICFmaWVsZC5zaXplKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmaWVsZC5iZXR3ZWVuKDAsIHZpZXcuc3RhdGUuZG9jLmxlbmd0aCwgKGZyb20sIHRvKSA9PiB7IGVmZmVjdHMucHVzaCh1bmZvbGRFZmZlY3Qub2YoeyBmcm9tLCB0byB9KSk7IH0pO1xuICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzIH0pO1xuICAgIHJldHVybiB0cnVlO1xufTtcbi8vIEZpbmQgdGhlIGZvbGRhYmxlIHJlZ2lvbiBjb250YWluaW5nIHRoZSBnaXZlbiBsaW5lLCBpZiBvbmUgZXhpc3RzXG5mdW5jdGlvbiBmb2xkYWJsZUNvbnRhaW5lcih2aWV3LCBsaW5lQmxvY2spIHtcbiAgICAvLyBMb29rIGJhY2t3YXJkcyB0aHJvdWdoIGxpbmUgYmxvY2tzIHVudGlsIHdlIGZpbmQgYSBmb2xkYWJsZSByZWdpb24gdGhhdFxuICAgIC8vIGludGVyc2VjdHMgd2l0aCB0aGUgbGluZVxuICAgIGZvciAobGV0IGxpbmUgPSBsaW5lQmxvY2s7Oykge1xuICAgICAgICBsZXQgZm9sZGFibGVSZWdpb24gPSBmb2xkYWJsZSh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGFibGVSZWdpb24gJiYgZm9sZGFibGVSZWdpb24udG8gPiBsaW5lQmxvY2suZnJvbSlcbiAgICAgICAgICAgIHJldHVybiBmb2xkYWJsZVJlZ2lvbjtcbiAgICAgICAgaWYgKCFsaW5lLmZyb20pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGluZSA9IHZpZXcubGluZUJsb2NrQXQobGluZS5mcm9tIC0gMSk7XG4gICAgfVxufVxuLyoqXG5Ub2dnbGUgZm9sZGluZyBhdCBjdXJzb3JzLiBVbmZvbGRzIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGZvbGRcbnN0YXJ0aW5nIGluIHRoYXQgbGluZSwgdHJpZXMgdG8gZmluZCBhIGZvbGRhYmxlIHJhbmdlIGFyb3VuZCBpdFxub3RoZXJ3aXNlLlxuKi9cbmNvbnN0IHRvZ2dsZUZvbGQgPSAodmlldykgPT4ge1xuICAgIGxldCBlZmZlY3RzID0gW107XG4gICAgZm9yIChsZXQgbGluZSBvZiBzZWxlY3RlZExpbmVzKHZpZXcpKSB7XG4gICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGVkKSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCksIGFubm91bmNlRm9sZCh2aWV3LCBmb2xkZWQsIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZm9sZFJhbmdlID0gZm9sZGFibGVDb250YWluZXIodmlldywgbGluZSk7XG4gICAgICAgICAgICBpZiAoZm9sZFJhbmdlKVxuICAgICAgICAgICAgICAgIGVmZmVjdHMucHVzaChmb2xkRWZmZWN0Lm9mKGZvbGRSYW5nZSksIGFubm91bmNlRm9sZCh2aWV3LCBmb2xkUmFuZ2UpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWZmZWN0cy5sZW5ndGggPiAwKVxuICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogbWF5YmVFbmFibGUodmlldy5zdGF0ZSwgZWZmZWN0cykgfSk7XG4gICAgcmV0dXJuICEhZWZmZWN0cy5sZW5ndGg7XG59O1xuLyoqXG5EZWZhdWx0IGZvbGQtcmVsYXRlZCBrZXkgYmluZGluZ3MuXG5cbiAtIEN0cmwtU2hpZnQtWyAoQ21kLUFsdC1bIG9uIG1hY09TKTogW2Bmb2xkQ29kZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZENvZGUpLlxuIC0gQ3RybC1TaGlmdC1dIChDbWQtQWx0LV0gb24gbWFjT1MpOiBbYHVuZm9sZENvZGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLnVuZm9sZENvZGUpLlxuIC0gQ3RybC1BbHQtWzogW2Bmb2xkQWxsYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkQWxsKS5cbiAtIEN0cmwtQWx0LV06IFtgdW5mb2xkQWxsYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS51bmZvbGRBbGwpLlxuKi9cbmNvbnN0IGZvbGRLZXltYXAgPSBbXG4gICAgeyBrZXk6IFwiQ3RybC1TaGlmdC1bXCIsIG1hYzogXCJDbWQtQWx0LVtcIiwgcnVuOiBmb2xkQ29kZSB9LFxuICAgIHsga2V5OiBcIkN0cmwtU2hpZnQtXVwiLCBtYWM6IFwiQ21kLUFsdC1dXCIsIHJ1bjogdW5mb2xkQ29kZSB9LFxuICAgIHsga2V5OiBcIkN0cmwtQWx0LVtcIiwgcnVuOiBmb2xkQWxsIH0sXG4gICAgeyBrZXk6IFwiQ3RybC1BbHQtXVwiLCBydW46IHVuZm9sZEFsbCB9XG5dO1xuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgICBwbGFjZWhvbGRlckRPTTogbnVsbCxcbiAgICBwcmVwYXJlUGxhY2Vob2xkZXI6IG51bGwsXG4gICAgcGxhY2Vob2xkZXJUZXh0OiBcIlx1MjAyNlwiXG59O1xuY29uc3QgZm9sZENvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUodmFsdWVzKSB7IHJldHVybiBjb21iaW5lQ29uZmlnKHZhbHVlcywgZGVmYXVsdENvbmZpZyk7IH1cbn0pO1xuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgY29uZmlndXJlcyBjb2RlIGZvbGRpbmcuXG4qL1xuZnVuY3Rpb24gY29kZUZvbGRpbmcoY29uZmlnKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtmb2xkU3RhdGUsIGJhc2VUaGVtZSQxXTtcbiAgICBpZiAoY29uZmlnKVxuICAgICAgICByZXN1bHQucHVzaChmb2xkQ29uZmlnLm9mKGNvbmZpZykpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiB3aWRnZXRUb0RPTSh2aWV3LCBwcmVwYXJlZCkge1xuICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCBjb25mID0gc3RhdGUuZmFjZXQoZm9sZENvbmZpZyk7XG4gICAgbGV0IG9uY2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHZpZXcucG9zQXRET00oZXZlbnQudGFyZ2V0KSk7XG4gICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICBpZiAoZm9sZGVkKVxuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHVuZm9sZEVmZmVjdC5vZihmb2xkZWQpIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG4gICAgaWYgKGNvbmYucGxhY2Vob2xkZXJET00pXG4gICAgICAgIHJldHVybiBjb25mLnBsYWNlaG9sZGVyRE9NKHZpZXcsIG9uY2xpY2ssIHByZXBhcmVkKTtcbiAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSBjb25mLnBsYWNlaG9sZGVyVGV4dDtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgc3RhdGUucGhyYXNlKFwiZm9sZGVkIGNvZGVcIikpO1xuICAgIGVsZW1lbnQudGl0bGUgPSBzdGF0ZS5waHJhc2UoXCJ1bmZvbGRcIik7XG4gICAgZWxlbWVudC5jbGFzc05hbWUgPSBcImNtLWZvbGRQbGFjZWhvbGRlclwiO1xuICAgIGVsZW1lbnQub25jbGljayA9IG9uY2xpY2s7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG5jb25zdCBmb2xkV2lkZ2V0ID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ucmVwbGFjZSh7IHdpZGdldDogLypAX19QVVJFX18qL25ldyBjbGFzcyBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgICAgICB0b0RPTSh2aWV3KSB7IHJldHVybiB3aWRnZXRUb0RPTSh2aWV3LCBudWxsKTsgfVxuICAgIH0gfSk7XG5jbGFzcyBQcmVwYXJlZEZvbGRXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiB0aGlzLnZhbHVlID09IG90aGVyLnZhbHVlOyB9XG4gICAgdG9ET00odmlldykgeyByZXR1cm4gd2lkZ2V0VG9ET00odmlldywgdGhpcy52YWx1ZSk7IH1cbn1cbmNvbnN0IGZvbGRHdXR0ZXJEZWZhdWx0cyA9IHtcbiAgICBvcGVuVGV4dDogXCJcdTIzMDRcIixcbiAgICBjbG9zZWRUZXh0OiBcIlx1MjAzQVwiLFxuICAgIG1hcmtlckRPTTogbnVsbCxcbiAgICBkb21FdmVudEhhbmRsZXJzOiB7fSxcbiAgICBmb2xkaW5nQ2hhbmdlZDogKCkgPT4gZmFsc2Vcbn07XG5jbGFzcyBGb2xkTWFya2VyIGV4dGVuZHMgR3V0dGVyTWFya2VyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcsIG9wZW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMub3BlbiA9IG9wZW47XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiB0aGlzLmNvbmZpZyA9PSBvdGhlci5jb25maWcgJiYgdGhpcy5vcGVuID09IG90aGVyLm9wZW47IH1cbiAgICB0b0RPTSh2aWV3KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5tYXJrZXJET00pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcubWFya2VyRE9NKHRoaXMub3Blbik7XG4gICAgICAgIGxldCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLm9wZW4gPyB0aGlzLmNvbmZpZy5vcGVuVGV4dCA6IHRoaXMuY29uZmlnLmNsb3NlZFRleHQ7XG4gICAgICAgIHNwYW4udGl0bGUgPSB2aWV3LnN0YXRlLnBocmFzZSh0aGlzLm9wZW4gPyBcIkZvbGQgbGluZVwiIDogXCJVbmZvbGQgbGluZVwiKTtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfVxufVxuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgcmVnaXN0ZXJzIGEgZm9sZCBndXR0ZXIsIHdoaWNoIHNob3dzIGFcbmZvbGQgc3RhdHVzIGluZGljYXRvciBiZWZvcmUgZm9sZGFibGUgbGluZXMgKHdoaWNoIGNhbiBiZSBjbGlja2VkXG50byBmb2xkIG9yIHVuZm9sZCB0aGUgbGluZSkuXG4qL1xuZnVuY3Rpb24gZm9sZEd1dHRlcihjb25maWcgPSB7fSkge1xuICAgIGxldCBmdWxsQ29uZmlnID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmb2xkR3V0dGVyRGVmYXVsdHMpLCBjb25maWcpO1xuICAgIGxldCBjYW5Gb2xkID0gbmV3IEZvbGRNYXJrZXIoZnVsbENvbmZpZywgdHJ1ZSksIGNhblVuZm9sZCA9IG5ldyBGb2xkTWFya2VyKGZ1bGxDb25maWcsIGZhbHNlKTtcbiAgICBsZXQgbWFya2VycyA9IFZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICAgICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gdmlldy52aWV3cG9ydC5mcm9tO1xuICAgICAgICAgICAgdGhpcy5tYXJrZXJzID0gdGhpcy5idWlsZE1hcmtlcnModmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQgfHxcbiAgICAgICAgICAgICAgICB1cGRhdGUuc3RhcnRTdGF0ZS5mYWNldChsYW5ndWFnZSkgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KGxhbmd1YWdlKSB8fFxuICAgICAgICAgICAgICAgIHVwZGF0ZS5zdGFydFN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpICE9IHVwZGF0ZS5zdGF0ZS5maWVsZChmb2xkU3RhdGUsIGZhbHNlKSB8fFxuICAgICAgICAgICAgICAgIHN5bnRheFRyZWUodXBkYXRlLnN0YXJ0U3RhdGUpICE9IHN5bnRheFRyZWUodXBkYXRlLnN0YXRlKSB8fFxuICAgICAgICAgICAgICAgIGZ1bGxDb25maWcuZm9sZGluZ0NoYW5nZWQodXBkYXRlKSlcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlcnMgPSB0aGlzLmJ1aWxkTWFya2Vycyh1cGRhdGUudmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbGRNYXJrZXJzKHZpZXcpIHtcbiAgICAgICAgICAgIGxldCBidWlsZGVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICAgICAgZm9yIChsZXQgbGluZSBvZiB2aWV3LnZpZXdwb3J0TGluZUJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBtYXJrID0gZmluZEZvbGQodmlldy5zdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKSA/IGNhblVuZm9sZFxuICAgICAgICAgICAgICAgICAgICA6IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50bykgPyBjYW5Gb2xkIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAobWFyaylcbiAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGQobGluZS5mcm9tLCBsaW5lLmZyb20sIG1hcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgeyBkb21FdmVudEhhbmRsZXJzIH0gPSBmdWxsQ29uZmlnO1xuICAgIHJldHVybiBbXG4gICAgICAgIG1hcmtlcnMsXG4gICAgICAgIGd1dHRlcih7XG4gICAgICAgICAgICBjbGFzczogXCJjbS1mb2xkR3V0dGVyXCIsXG4gICAgICAgICAgICBtYXJrZXJzKHZpZXcpIHsgdmFyIF9hOyByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKG1hcmtlcnMpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFya2VycykgfHwgUmFuZ2VTZXQuZW1wdHk7IH0sXG4gICAgICAgICAgICBpbml0aWFsU3BhY2VyKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRm9sZE1hcmtlcihmdWxsQ29uZmlnLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZG9tRXZlbnRIYW5kbGVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkb21FdmVudEhhbmRsZXJzKSwgeyBjbGljazogKHZpZXcsIGxpbmUsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21FdmVudEhhbmRsZXJzLmNsaWNrICYmIGRvbUV2ZW50SGFuZGxlcnMuY2xpY2sodmlldywgbGluZSwgZXZlbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2xkZWQgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBmb2xkYWJsZSh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBmb2xkRWZmZWN0Lm9mKHJhbmdlKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IH0pXG4gICAgICAgIH0pLFxuICAgICAgICBjb2RlRm9sZGluZygpXG4gICAgXTtcbn1cbmNvbnN0IGJhc2VUaGVtZSQxID0gLypAX19QVVJFX18qL0VkaXRvclZpZXcuYmFzZVRoZW1lKHtcbiAgICBcIi5jbS1mb2xkUGxhY2Vob2xkZXJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2VlZVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNkZGRcIixcbiAgICAgICAgY29sb3I6IFwiIzg4OFwiLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiLjJlbVwiLFxuICAgICAgICBtYXJnaW46IFwiMCAxcHhcIixcbiAgICAgICAgcGFkZGluZzogXCIwIDFweFwiLFxuICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiXG4gICAgfSxcbiAgICBcIi5jbS1mb2xkR3V0dGVyIHNwYW5cIjoge1xuICAgICAgICBwYWRkaW5nOiBcIjAgMXB4XCIsXG4gICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgICB9XG59KTtcblxuLyoqXG5BIGhpZ2hsaWdodCBzdHlsZSBhc3NvY2lhdGVzIENTUyBzdHlsZXMgd2l0aCBoaWdsaWdodGluZ1xuW3RhZ3NdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYjaGlnaGxpZ2h0LlRhZykuXG4qL1xuY2xhc3MgSGlnaGxpZ2h0U3R5bGUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0YWcgc3R5bGVzIHVzZWQgdG8gY3JlYXRlIHRoaXMgaGlnaGxpZ2h0IHN0eWxlLlxuICAgICovXG4gICAgc3BlY3MsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zcGVjcyA9IHNwZWNzO1xuICAgICAgICBsZXQgbW9kU3BlYztcbiAgICAgICAgZnVuY3Rpb24gZGVmKHNwZWMpIHtcbiAgICAgICAgICAgIGxldCBjbHMgPSBTdHlsZU1vZHVsZS5uZXdOYW1lKCk7XG4gICAgICAgICAgICAobW9kU3BlYyB8fCAobW9kU3BlYyA9IE9iamVjdC5jcmVhdGUobnVsbCkpKVtcIi5cIiArIGNsc10gPSBzcGVjO1xuICAgICAgICAgICAgcmV0dXJuIGNscztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGwgPSB0eXBlb2Ygb3B0aW9ucy5hbGwgPT0gXCJzdHJpbmdcIiA/IG9wdGlvbnMuYWxsIDogb3B0aW9ucy5hbGwgPyBkZWYob3B0aW9ucy5hbGwpIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzY29wZU9wdCA9IG9wdGlvbnMuc2NvcGU7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZU9wdCBpbnN0YW5jZW9mIExhbmd1YWdlID8gKHR5cGUpID0+IHR5cGUucHJvcChsYW5ndWFnZURhdGFQcm9wKSA9PSBzY29wZU9wdC5kYXRhXG4gICAgICAgICAgICA6IHNjb3BlT3B0ID8gKHR5cGUpID0+IHR5cGUgPT0gc2NvcGVPcHQgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc3R5bGUgPSB0YWdIaWdobGlnaHRlcihzcGVjcy5tYXAoc3R5bGUgPT4gKHtcbiAgICAgICAgICAgIHRhZzogc3R5bGUudGFnLFxuICAgICAgICAgICAgY2xhc3M6IHN0eWxlLmNsYXNzIHx8IGRlZihPYmplY3QuYXNzaWduKHt9LCBzdHlsZSwgeyB0YWc6IG51bGwgfSkpXG4gICAgICAgIH0pKSwge1xuICAgICAgICAgICAgYWxsLFxuICAgICAgICB9KS5zdHlsZTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2RTcGVjID8gbmV3IFN0eWxlTW9kdWxlKG1vZFNwZWMpIDogbnVsbDtcbiAgICAgICAgdGhpcy50aGVtZVR5cGUgPSBvcHRpb25zLnRoZW1lVHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgaGlnaGxpZ2h0ZXIgc3R5bGUgdGhhdCBhc3NvY2lhdGVzIHRoZSBnaXZlbiBzdHlsZXMgdG9cbiAgICB0aGUgZ2l2ZW4gdGFncy4gVGhlIHNwZWNzIG11c3QgYmUgb2JqZWN0cyB0aGF0IGhvbGQgYSBzdHlsZSB0YWdcbiAgICBvciBhcnJheSBvZiB0YWdzIGluIHRoZWlyIGB0YWdgIHByb3BlcnR5LCBhbmQgZWl0aGVyIGEgc2luZ2xlXG4gICAgYGNsYXNzYCBwcm9wZXJ0eSBwcm92aWRpbmcgYSBzdGF0aWMgQ1NTIGNsYXNzIChmb3IgaGlnaGxpZ2h0ZXJcbiAgICB0aGF0IHJlbHkgb24gZXh0ZXJuYWwgc3R5bGluZyksIG9yIGFcbiAgICBbYHN0eWxlLW1vZGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL3N0eWxlLW1vZCNkb2N1bWVudGF0aW9uKS1zdHlsZVxuICAgIHNldCBvZiBDU1MgcHJvcGVydGllcyAod2hpY2ggZGVmaW5lIHRoZSBzdHlsaW5nIGZvciB0aG9zZSB0YWdzKS5cbiAgICBcbiAgICBUaGUgQ1NTIHJ1bGVzIGNyZWF0ZWQgZm9yIGEgaGlnaGxpZ2h0ZXIgd2lsbCBiZSBlbWl0dGVkIGluIHRoZVxuICAgIG9yZGVyIG9mIHRoZSBzcGVjJ3MgcHJvcGVydGllcy4gVGhhdCBtZWFucyB0aGF0IGZvciBlbGVtZW50cyB0aGF0XG4gICAgaGF2ZSBtdWx0aXBsZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLCBzdHlsZXMgZGVmaW5lZCBmdXJ0aGVyXG4gICAgZG93biBpbiB0aGUgbGlzdCB3aWxsIGhhdmUgYSBoaWdoZXIgQ1NTIHByZWNlZGVuY2UgdGhhbiBzdHlsZXNcbiAgICBkZWZpbmVkIGVhcmxpZXIuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHNwZWNzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgSGlnaGxpZ2h0U3R5bGUoc3BlY3MsIG9wdGlvbnMgfHwge30pO1xuICAgIH1cbn1cbmNvbnN0IGhpZ2hsaWdodGVyRmFjZXQgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBmYWxsYmFja0hpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZSh2YWx1ZXMpIHsgcmV0dXJuIHZhbHVlcy5sZW5ndGggPyBbdmFsdWVzWzBdXSA6IG51bGw7IH1cbn0pO1xuZnVuY3Rpb24gZ2V0SGlnaGxpZ2h0ZXJzKHN0YXRlKSB7XG4gICAgbGV0IG1haW4gPSBzdGF0ZS5mYWNldChoaWdobGlnaHRlckZhY2V0KTtcbiAgICByZXR1cm4gbWFpbi5sZW5ndGggPyBtYWluIDogc3RhdGUuZmFjZXQoZmFsbGJhY2tIaWdobGlnaHRlcik7XG59XG4vKipcbldyYXAgYSBoaWdobGlnaHRlciBpbiBhbiBlZGl0b3IgZXh0ZW5zaW9uIHRoYXQgdXNlcyBpdCB0byBhcHBseVxuc3ludGF4IGhpZ2hsaWdodGluZyB0byB0aGUgZWRpdG9yIGNvbnRlbnQuXG5cbldoZW4gbXVsdGlwbGUgKG5vbi1mYWxsYmFjaykgc3R5bGVzIGFyZSBwcm92aWRlZCwgdGhlIHN0eWxpbmdcbmFwcGxpZWQgaXMgdGhlIHVuaW9uIG9mIHRoZSBjbGFzc2VzIHRoZXkgZW1pdC5cbiovXG5mdW5jdGlvbiBzeW50YXhIaWdobGlnaHRpbmcoaGlnaGxpZ2h0ZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgZXh0ID0gW3RyZWVIaWdobGlnaHRlcl0sIHRoZW1lVHlwZTtcbiAgICBpZiAoaGlnaGxpZ2h0ZXIgaW5zdGFuY2VvZiBIaWdobGlnaHRTdHlsZSkge1xuICAgICAgICBpZiAoaGlnaGxpZ2h0ZXIubW9kdWxlKVxuICAgICAgICAgICAgZXh0LnB1c2goRWRpdG9yVmlldy5zdHlsZU1vZHVsZS5vZihoaWdobGlnaHRlci5tb2R1bGUpKTtcbiAgICAgICAgdGhlbWVUeXBlID0gaGlnaGxpZ2h0ZXIudGhlbWVUeXBlO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZhbGxiYWNrKVxuICAgICAgICBleHQucHVzaChmYWxsYmFja0hpZ2hsaWdodGVyLm9mKGhpZ2hsaWdodGVyKSk7XG4gICAgZWxzZSBpZiAodGhlbWVUeXBlKVxuICAgICAgICBleHQucHVzaChoaWdobGlnaHRlckZhY2V0LmNvbXB1dGVOKFtFZGl0b3JWaWV3LmRhcmtUaGVtZV0sIHN0YXRlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5mYWNldChFZGl0b3JWaWV3LmRhcmtUaGVtZSkgPT0gKHRoZW1lVHlwZSA9PSBcImRhcmtcIikgPyBbaGlnaGxpZ2h0ZXJdIDogW107XG4gICAgICAgIH0pKTtcbiAgICBlbHNlXG4gICAgICAgIGV4dC5wdXNoKGhpZ2hsaWdodGVyRmFjZXQub2YoaGlnaGxpZ2h0ZXIpKTtcbiAgICByZXR1cm4gZXh0O1xufVxuLyoqXG5SZXR1cm5zIHRoZSBDU1MgY2xhc3NlcyAoaWYgYW55KSB0aGF0IHRoZSBoaWdobGlnaHRlcnMgYWN0aXZlIGluXG50aGUgc3RhdGUgd291bGQgYXNzaWduIHRvIHRoZSBnaXZlbiBzdHlsZVxuW3RhZ3NdKGh0dHBzOi8vbGV6ZXIuY29kZW1pcnJvci5uZXQvZG9jcy9yZWYjaGlnaGxpZ2h0LlRhZykgYW5kXG4ob3B0aW9uYWwpIGxhbmd1YWdlXG5bc2NvcGVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuSGlnaGxpZ2h0U3R5bGVeZGVmaW5lXm9wdGlvbnMuc2NvcGUpLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodGluZ0ZvcihzdGF0ZSwgdGFncywgc2NvcGUpIHtcbiAgICBsZXQgaGlnaGxpZ2h0ZXJzID0gZ2V0SGlnaGxpZ2h0ZXJzKHN0YXRlKTtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoaGlnaGxpZ2h0ZXJzKVxuICAgICAgICBmb3IgKGxldCBoaWdobGlnaHRlciBvZiBoaWdobGlnaHRlcnMpIHtcbiAgICAgICAgICAgIGlmICghaGlnaGxpZ2h0ZXIuc2NvcGUgfHwgc2NvcGUgJiYgaGlnaGxpZ2h0ZXIuc2NvcGUoc2NvcGUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNscyA9IGhpZ2hsaWdodGVyLnN0eWxlKHRhZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChjbHMpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCA/IHJlc3VsdCArIFwiIFwiICsgY2xzIDogY2xzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNsYXNzIFRyZWVIaWdobGlnaHRlciB7XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLm1hcmtDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMudHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG4gICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmJ1aWxkRGVjbyh2aWV3LCBnZXRIaWdobGlnaHRlcnModmlldy5zdGF0ZSkpO1xuICAgICAgICB0aGlzLmRlY29yYXRlZFRvID0gdmlldy52aWV3cG9ydC50bztcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBsZXQgdHJlZSA9IHN5bnRheFRyZWUodXBkYXRlLnN0YXRlKSwgaGlnaGxpZ2h0ZXJzID0gZ2V0SGlnaGxpZ2h0ZXJzKHVwZGF0ZS5zdGF0ZSk7XG4gICAgICAgIGxldCBzdHlsZUNoYW5nZSA9IGhpZ2hsaWdodGVycyAhPSBnZXRIaWdobGlnaHRlcnModXBkYXRlLnN0YXJ0U3RhdGUpO1xuICAgICAgICBsZXQgeyB2aWV3cG9ydCB9ID0gdXBkYXRlLnZpZXcsIGRlY29yYXRlZFRvTWFwcGVkID0gdXBkYXRlLmNoYW5nZXMubWFwUG9zKHRoaXMuZGVjb3JhdGVkVG8sIDEpO1xuICAgICAgICBpZiAodHJlZS5sZW5ndGggPCB2aWV3cG9ydC50byAmJiAhc3R5bGVDaGFuZ2UgJiYgdHJlZS50eXBlID09IHRoaXMudHJlZS50eXBlICYmIGRlY29yYXRlZFRvTWFwcGVkID49IHZpZXdwb3J0LnRvKSB7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5kZWNvcmF0aW9ucy5tYXAodXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0ZWRUbyA9IGRlY29yYXRlZFRvTWFwcGVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRyZWUgIT0gdGhpcy50cmVlIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQgfHwgc3R5bGVDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5idWlsZERlY28odXBkYXRlLnZpZXcsIGhpZ2hsaWdodGVycyk7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRlZFRvID0gdmlld3BvcnQudG87XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnVpbGREZWNvKHZpZXcsIGhpZ2hsaWdodGVycykge1xuICAgICAgICBpZiAoIWhpZ2hsaWdodGVycyB8fCAhdGhpcy50cmVlLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgIGxldCBidWlsZGVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2Ygdmlldy52aXNpYmxlUmFuZ2VzKSB7XG4gICAgICAgICAgICBoaWdobGlnaHRUcmVlKHRoaXMudHJlZSwgaGlnaGxpZ2h0ZXJzLCAoZnJvbSwgdG8sIHN0eWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgYnVpbGRlci5hZGQoZnJvbSwgdG8sIHRoaXMubWFya0NhY2hlW3N0eWxlXSB8fCAodGhpcy5tYXJrQ2FjaGVbc3R5bGVdID0gRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IHN0eWxlIH0pKSk7XG4gICAgICAgICAgICB9LCBmcm9tLCB0byk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7XG4gICAgfVxufVxuY29uc3QgdHJlZUhpZ2hsaWdodGVyID0gLypAX19QVVJFX18qL1ByZWMuaGlnaCgvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoVHJlZUhpZ2hsaWdodGVyLCB7XG4gICAgZGVjb3JhdGlvbnM6IHYgPT4gdi5kZWNvcmF0aW9uc1xufSkpO1xuLyoqXG5BIGRlZmF1bHQgaGlnaGxpZ2h0IHN0eWxlICh3b3JrcyB3ZWxsIHdpdGggbGlnaHQgdGhlbWVzKS5cbiovXG5jb25zdCBkZWZhdWx0SGlnaGxpZ2h0U3R5bGUgPSAvKkBfX1BVUkVfXyovSGlnaGxpZ2h0U3R5bGUuZGVmaW5lKFtcbiAgICB7IHRhZzogdGFncy5tZXRhLFxuICAgICAgICBjb2xvcjogXCIjNDA0NzQwXCIgfSxcbiAgICB7IHRhZzogdGFncy5saW5rLFxuICAgICAgICB0ZXh0RGVjb3JhdGlvbjogXCJ1bmRlcmxpbmVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmhlYWRpbmcsXG4gICAgICAgIHRleHREZWNvcmF0aW9uOiBcInVuZGVybGluZVwiLFxuICAgICAgICBmb250V2VpZ2h0OiBcImJvbGRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmVtcGhhc2lzLFxuICAgICAgICBmb250U3R5bGU6IFwiaXRhbGljXCIgfSxcbiAgICB7IHRhZzogdGFncy5zdHJvbmcsXG4gICAgICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3Muc3RyaWtldGhyb3VnaCxcbiAgICAgICAgdGV4dERlY29yYXRpb246IFwibGluZS10aHJvdWdoXCIgfSxcbiAgICB7IHRhZzogdGFncy5rZXl3b3JkLFxuICAgICAgICBjb2xvcjogXCIjNzA4XCIgfSxcbiAgICB7IHRhZzogW3RhZ3MuYXRvbSwgdGFncy5ib29sLCB0YWdzLnVybCwgdGFncy5jb250ZW50U2VwYXJhdG9yLCB0YWdzLmxhYmVsTmFtZV0sXG4gICAgICAgIGNvbG9yOiBcIiMyMTlcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5saXRlcmFsLCB0YWdzLmluc2VydGVkXSxcbiAgICAgICAgY29sb3I6IFwiIzE2NFwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLnN0cmluZywgdGFncy5kZWxldGVkXSxcbiAgICAgICAgY29sb3I6IFwiI2ExMVwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLnJlZ2V4cCwgdGFncy5lc2NhcGUsIC8qQF9fUFVSRV9fKi90YWdzLnNwZWNpYWwodGFncy5zdHJpbmcpXSxcbiAgICAgICAgY29sb3I6IFwiI2U0MFwiIH0sXG4gICAgeyB0YWc6IC8qQF9fUFVSRV9fKi90YWdzLmRlZmluaXRpb24odGFncy52YXJpYWJsZU5hbWUpLFxuICAgICAgICBjb2xvcjogXCIjMDBmXCIgfSxcbiAgICB7IHRhZzogLypAX19QVVJFX18qL3RhZ3MubG9jYWwodGFncy52YXJpYWJsZU5hbWUpLFxuICAgICAgICBjb2xvcjogXCIjMzBhXCIgfSxcbiAgICB7IHRhZzogW3RhZ3MudHlwZU5hbWUsIHRhZ3MubmFtZXNwYWNlXSxcbiAgICAgICAgY29sb3I6IFwiIzA4NVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuY2xhc3NOYW1lLFxuICAgICAgICBjb2xvcjogXCIjMTY3XCIgfSxcbiAgICB7IHRhZzogWy8qQF9fUFVSRV9fKi90YWdzLnNwZWNpYWwodGFncy52YXJpYWJsZU5hbWUpLCB0YWdzLm1hY3JvTmFtZV0sXG4gICAgICAgIGNvbG9yOiBcIiMyNTZcIiB9LFxuICAgIHsgdGFnOiAvKkBfX1BVUkVfXyovdGFncy5kZWZpbml0aW9uKHRhZ3MucHJvcGVydHlOYW1lKSxcbiAgICAgICAgY29sb3I6IFwiIzAwY1wiIH0sXG4gICAgeyB0YWc6IHRhZ3MuY29tbWVudCxcbiAgICAgICAgY29sb3I6IFwiIzk0MFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaW52YWxpZCxcbiAgICAgICAgY29sb3I6IFwiI2YwMFwiIH1cbl0pO1xuXG5jb25zdCBiYXNlVGhlbWUgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5iYXNlVGhlbWUoe1xuICAgIFwiJi5jbS1mb2N1c2VkIC5jbS1tYXRjaGluZ0JyYWNrZXRcIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwiIzMyOGM4MjUyXCIgfSxcbiAgICBcIiYuY20tZm9jdXNlZCAuY20tbm9ubWF0Y2hpbmdCcmFja2V0XCI6IHsgYmFja2dyb3VuZENvbG9yOiBcIiNiYjU1NTU0NFwiIH1cbn0pO1xuY29uc3QgRGVmYXVsdFNjYW5EaXN0ID0gMTAwMDAsIERlZmF1bHRCcmFja2V0cyA9IFwiKClbXXt9XCI7XG5jb25zdCBicmFja2V0TWF0Y2hpbmdDb25maWcgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKGNvbmZpZ3MpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVDb25maWcoY29uZmlncywge1xuICAgICAgICAgICAgYWZ0ZXJDdXJzb3I6IHRydWUsXG4gICAgICAgICAgICBicmFja2V0czogRGVmYXVsdEJyYWNrZXRzLFxuICAgICAgICAgICAgbWF4U2NhbkRpc3RhbmNlOiBEZWZhdWx0U2NhbkRpc3QsXG4gICAgICAgICAgICByZW5kZXJNYXRjaDogZGVmYXVsdFJlbmRlck1hdGNoXG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuY29uc3QgbWF0Y2hpbmdNYXJrID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLW1hdGNoaW5nQnJhY2tldFwiIH0pLCBub25tYXRjaGluZ01hcmsgPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20tbm9ubWF0Y2hpbmdCcmFja2V0XCIgfSk7XG5mdW5jdGlvbiBkZWZhdWx0UmVuZGVyTWF0Y2gobWF0Y2gpIHtcbiAgICBsZXQgZGVjb3JhdGlvbnMgPSBbXTtcbiAgICBsZXQgbWFyayA9IG1hdGNoLm1hdGNoZWQgPyBtYXRjaGluZ01hcmsgOiBub25tYXRjaGluZ01hcms7XG4gICAgZGVjb3JhdGlvbnMucHVzaChtYXJrLnJhbmdlKG1hdGNoLnN0YXJ0LmZyb20sIG1hdGNoLnN0YXJ0LnRvKSk7XG4gICAgaWYgKG1hdGNoLmVuZClcbiAgICAgICAgZGVjb3JhdGlvbnMucHVzaChtYXJrLnJhbmdlKG1hdGNoLmVuZC5mcm9tLCBtYXRjaC5lbmQudG8pKTtcbiAgICByZXR1cm4gZGVjb3JhdGlvbnM7XG59XG5jb25zdCBicmFja2V0TWF0Y2hpbmdTdGF0ZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgY3JlYXRlKCkgeyByZXR1cm4gRGVjb3JhdGlvbi5ub25lOyB9LFxuICAgIHVwZGF0ZShkZWNvLCB0cikge1xuICAgICAgICBpZiAoIXRyLmRvY0NoYW5nZWQgJiYgIXRyLnNlbGVjdGlvbilcbiAgICAgICAgICAgIHJldHVybiBkZWNvO1xuICAgICAgICBsZXQgZGVjb3JhdGlvbnMgPSBbXTtcbiAgICAgICAgbGV0IGNvbmZpZyA9IHRyLnN0YXRlLmZhY2V0KGJyYWNrZXRNYXRjaGluZ0NvbmZpZyk7XG4gICAgICAgIGZvciAobGV0IHJhbmdlIG9mIHRyLnN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgICAgIGlmICghcmFuZ2UuZW1wdHkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSBtYXRjaEJyYWNrZXRzKHRyLnN0YXRlLCByYW5nZS5oZWFkLCAtMSwgY29uZmlnKVxuICAgICAgICAgICAgICAgIHx8IChyYW5nZS5oZWFkID4gMCAmJiBtYXRjaEJyYWNrZXRzKHRyLnN0YXRlLCByYW5nZS5oZWFkIC0gMSwgMSwgY29uZmlnKSlcbiAgICAgICAgICAgICAgICB8fCAoY29uZmlnLmFmdGVyQ3Vyc29yICYmXG4gICAgICAgICAgICAgICAgICAgIChtYXRjaEJyYWNrZXRzKHRyLnN0YXRlLCByYW5nZS5oZWFkLCAxLCBjb25maWcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAocmFuZ2UuaGVhZCA8IHRyLnN0YXRlLmRvYy5sZW5ndGggJiYgbWF0Y2hCcmFja2V0cyh0ci5zdGF0ZSwgcmFuZ2UuaGVhZCArIDEsIC0xLCBjb25maWcpKSkpO1xuICAgICAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgICAgIGRlY29yYXRpb25zID0gZGVjb3JhdGlvbnMuY29uY2F0KGNvbmZpZy5yZW5kZXJNYXRjaChtYXRjaCwgdHIuc3RhdGUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5zZXQoZGVjb3JhdGlvbnMsIHRydWUpO1xuICAgIH0sXG4gICAgcHJvdmlkZTogZiA9PiBFZGl0b3JWaWV3LmRlY29yYXRpb25zLmZyb20oZilcbn0pO1xuY29uc3QgYnJhY2tldE1hdGNoaW5nVW5pcXVlID0gW1xuICAgIGJyYWNrZXRNYXRjaGluZ1N0YXRlLFxuICAgIGJhc2VUaGVtZVxuXTtcbi8qKlxuQ3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IGVuYWJsZXMgYnJhY2tldCBtYXRjaGluZy4gV2hlbmV2ZXIgdGhlXG5jdXJzb3IgaXMgbmV4dCB0byBhIGJyYWNrZXQsIHRoYXQgYnJhY2tldCBhbmQgdGhlIG9uZSBpdCBtYXRjaGVzXG5hcmUgaGlnaGxpZ2h0ZWQuIE9yLCB3aGVuIG5vIG1hdGNoaW5nIGJyYWNrZXQgaXMgZm91bmQsIGFub3RoZXJcbmhpZ2hsaWdodGluZyBzdHlsZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoaXMuXG4qL1xuZnVuY3Rpb24gYnJhY2tldE1hdGNoaW5nKGNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIFticmFja2V0TWF0Y2hpbmdDb25maWcub2YoY29uZmlnKSwgYnJhY2tldE1hdGNoaW5nVW5pcXVlXTtcbn1cbi8qKlxuV2hlbiBsYXJnZXIgc3ludGF4IG5vZGVzLCBzdWNoIGFzIEhUTUwgdGFncywgYXJlIG1hcmtlZCBhc1xub3BlbmluZy9jbG9zaW5nLCBpdCBjYW4gYmUgYSBiaXQgbWVzc3kgdG8gdHJlYXQgdGhlIHdob2xlIG5vZGUgYXNcbmEgbWF0Y2hhYmxlIGJyYWNrZXQuIFRoaXMgbm9kZSBwcm9wIGFsbG93cyB5b3UgdG8gZGVmaW5lLCBmb3Igc3VjaFxuYSBub2RlLCBhIFx1MjAxOGhhbmRsZVx1MjAxOVx1MjAxNHRoZSBwYXJ0IG9mIHRoZSBub2RlIHRoYXQgaXMgaGlnaGxpZ2h0ZWQsIGFuZFxudGhhdCB0aGUgY3Vyc29yIG11c3QgYmUgb24gdG8gYWN0aXZhdGUgaGlnaGxpZ2h0aW5nIGluIHRoZSBmaXJzdFxucGxhY2UuXG4qL1xuY29uc3QgYnJhY2tldE1hdGNoaW5nSGFuZGxlID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuZnVuY3Rpb24gbWF0Y2hpbmdOb2Rlcyhub2RlLCBkaXIsIGJyYWNrZXRzKSB7XG4gICAgbGV0IGJ5UHJvcCA9IG5vZGUucHJvcChkaXIgPCAwID8gTm9kZVByb3Aub3BlbmVkQnkgOiBOb2RlUHJvcC5jbG9zZWRCeSk7XG4gICAgaWYgKGJ5UHJvcClcbiAgICAgICAgcmV0dXJuIGJ5UHJvcDtcbiAgICBpZiAobm9kZS5uYW1lLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIGxldCBpbmRleCA9IGJyYWNrZXRzLmluZGV4T2Yobm9kZS5uYW1lKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEgJiYgaW5kZXggJSAyID09IChkaXIgPCAwID8gMSA6IDApKVxuICAgICAgICAgICAgcmV0dXJuIFticmFja2V0c1tpbmRleCArIGRpcl1dO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGZpbmRIYW5kbGUobm9kZSkge1xuICAgIGxldCBoYXNIYW5kbGUgPSBub2RlLnR5cGUucHJvcChicmFja2V0TWF0Y2hpbmdIYW5kbGUpO1xuICAgIHJldHVybiBoYXNIYW5kbGUgPyBoYXNIYW5kbGUobm9kZS5ub2RlKSA6IG5vZGU7XG59XG4vKipcbkZpbmQgdGhlIG1hdGNoaW5nIGJyYWNrZXQgZm9yIHRoZSB0b2tlbiBhdCBgcG9zYCwgc2Nhbm5pbmdcbmRpcmVjdGlvbiBgZGlyYC4gT25seSB0aGUgYGJyYWNrZXRzYCBhbmQgYG1heFNjYW5EaXN0YW5jZWBcbnByb3BlcnRpZXMgYXJlIHVzZWQgZnJvbSBgY29uZmlnYCwgaWYgZ2l2ZW4uIFJldHVybnMgbnVsbCBpZiBub1xuYnJhY2tldCB3YXMgZm91bmQgYXQgYHBvc2AsIG9yIGEgbWF0Y2ggcmVzdWx0IG90aGVyd2lzZS5cbiovXG5mdW5jdGlvbiBtYXRjaEJyYWNrZXRzKHN0YXRlLCBwb3MsIGRpciwgY29uZmlnID0ge30pIHtcbiAgICBsZXQgbWF4U2NhbkRpc3RhbmNlID0gY29uZmlnLm1heFNjYW5EaXN0YW5jZSB8fCBEZWZhdWx0U2NhbkRpc3QsIGJyYWNrZXRzID0gY29uZmlnLmJyYWNrZXRzIHx8IERlZmF1bHRCcmFja2V0cztcbiAgICBsZXQgdHJlZSA9IHN5bnRheFRyZWUoc3RhdGUpLCBub2RlID0gdHJlZS5yZXNvbHZlSW5uZXIocG9zLCBkaXIpO1xuICAgIGZvciAobGV0IGN1ciA9IG5vZGU7IGN1cjsgY3VyID0gY3VyLnBhcmVudCkge1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IG1hdGNoaW5nTm9kZXMoY3VyLnR5cGUsIGRpciwgYnJhY2tldHMpO1xuICAgICAgICBpZiAobWF0Y2hlcyAmJiBjdXIuZnJvbSA8IGN1ci50bykge1xuICAgICAgICAgICAgbGV0IGhhbmRsZSA9IGZpbmRIYW5kbGUoY3VyKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGUgJiYgKGRpciA+IDAgPyBwb3MgPj0gaGFuZGxlLmZyb20gJiYgcG9zIDwgaGFuZGxlLnRvIDogcG9zID4gaGFuZGxlLmZyb20gJiYgcG9zIDw9IGhhbmRsZS50bykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoTWFya2VkQnJhY2tldHMoc3RhdGUsIHBvcywgZGlyLCBjdXIsIGhhbmRsZSwgbWF0Y2hlcywgYnJhY2tldHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRjaFBsYWluQnJhY2tldHMoc3RhdGUsIHBvcywgZGlyLCB0cmVlLCBub2RlLnR5cGUsIG1heFNjYW5EaXN0YW5jZSwgYnJhY2tldHMpO1xufVxuZnVuY3Rpb24gbWF0Y2hNYXJrZWRCcmFja2V0cyhfc3RhdGUsIF9wb3MsIGRpciwgdG9rZW4sIGhhbmRsZSwgbWF0Y2hpbmcsIGJyYWNrZXRzKSB7XG4gICAgbGV0IHBhcmVudCA9IHRva2VuLnBhcmVudCwgZmlyc3RUb2tlbiA9IHsgZnJvbTogaGFuZGxlLmZyb20sIHRvOiBoYW5kbGUudG8gfTtcbiAgICBsZXQgZGVwdGggPSAwLCBjdXJzb3IgPSBwYXJlbnQgPT09IG51bGwgfHwgcGFyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJlbnQuY3Vyc29yKCk7XG4gICAgaWYgKGN1cnNvciAmJiAoZGlyIDwgMCA/IGN1cnNvci5jaGlsZEJlZm9yZSh0b2tlbi5mcm9tKSA6IGN1cnNvci5jaGlsZEFmdGVyKHRva2VuLnRvKSkpXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmIChkaXIgPCAwID8gY3Vyc29yLnRvIDw9IHRva2VuLmZyb20gOiBjdXJzb3IuZnJvbSA+PSB0b2tlbi50bykge1xuICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwICYmIG1hdGNoaW5nLmluZGV4T2YoY3Vyc29yLnR5cGUubmFtZSkgPiAtMSAmJiBjdXJzb3IuZnJvbSA8IGN1cnNvci50bykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZW5kSGFuZGxlID0gZmluZEhhbmRsZShjdXJzb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdGFydDogZmlyc3RUb2tlbiwgZW5kOiBlbmRIYW5kbGUgPyB7IGZyb206IGVuZEhhbmRsZS5mcm9tLCB0bzogZW5kSGFuZGxlLnRvIH0gOiB1bmRlZmluZWQsIG1hdGNoZWQ6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hpbmdOb2RlcyhjdXJzb3IudHlwZSwgZGlyLCBicmFja2V0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hpbmdOb2RlcyhjdXJzb3IudHlwZSwgLWRpciwgYnJhY2tldHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kSGFuZGxlID0gZmluZEhhbmRsZShjdXJzb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogZmlyc3RUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGVuZEhhbmRsZSAmJiBlbmRIYW5kbGUuZnJvbSA8IGVuZEhhbmRsZS50byA/IHsgZnJvbTogZW5kSGFuZGxlLmZyb20sIHRvOiBlbmRIYW5kbGUudG8gfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoZGlyIDwgMCA/IGN1cnNvci5wcmV2U2libGluZygpIDogY3Vyc29yLm5leHRTaWJsaW5nKCkpO1xuICAgIHJldHVybiB7IHN0YXJ0OiBmaXJzdFRva2VuLCBtYXRjaGVkOiBmYWxzZSB9O1xufVxuZnVuY3Rpb24gbWF0Y2hQbGFpbkJyYWNrZXRzKHN0YXRlLCBwb3MsIGRpciwgdHJlZSwgdG9rZW5UeXBlLCBtYXhTY2FuRGlzdGFuY2UsIGJyYWNrZXRzKSB7XG4gICAgbGV0IHN0YXJ0Q2ggPSBkaXIgPCAwID8gc3RhdGUuc2xpY2VEb2MocG9zIC0gMSwgcG9zKSA6IHN0YXRlLnNsaWNlRG9jKHBvcywgcG9zICsgMSk7XG4gICAgbGV0IGJyYWNrZXQgPSBicmFja2V0cy5pbmRleE9mKHN0YXJ0Q2gpO1xuICAgIGlmIChicmFja2V0IDwgMCB8fCAoYnJhY2tldCAlIDIgPT0gMCkgIT0gKGRpciA+IDApKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgc3RhcnRUb2tlbiA9IHsgZnJvbTogZGlyIDwgMCA/IHBvcyAtIDEgOiBwb3MsIHRvOiBkaXIgPiAwID8gcG9zICsgMSA6IHBvcyB9O1xuICAgIGxldCBpdGVyID0gc3RhdGUuZG9jLml0ZXJSYW5nZShwb3MsIGRpciA+IDAgPyBzdGF0ZS5kb2MubGVuZ3RoIDogMCksIGRlcHRoID0gMDtcbiAgICBmb3IgKGxldCBkaXN0YW5jZSA9IDA7ICEoaXRlci5uZXh0KCkpLmRvbmUgJiYgZGlzdGFuY2UgPD0gbWF4U2NhbkRpc3RhbmNlOykge1xuICAgICAgICBsZXQgdGV4dCA9IGl0ZXIudmFsdWU7XG4gICAgICAgIGlmIChkaXIgPCAwKVxuICAgICAgICAgICAgZGlzdGFuY2UgKz0gdGV4dC5sZW5ndGg7XG4gICAgICAgIGxldCBiYXNlUG9zID0gcG9zICsgZGlzdGFuY2UgKiBkaXI7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IGRpciA+IDAgPyAwIDogdGV4dC5sZW5ndGggLSAxLCBlbmQgPSBkaXIgPiAwID8gdGV4dC5sZW5ndGggOiAtMTsgcG9zICE9IGVuZDsgcG9zICs9IGRpcikge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gYnJhY2tldHMuaW5kZXhPZih0ZXh0W3Bvc10pO1xuICAgICAgICAgICAgaWYgKGZvdW5kIDwgMCB8fCB0cmVlLnJlc29sdmVJbm5lcihiYXNlUG9zICsgcG9zLCAxKS50eXBlICE9IHRva2VuVHlwZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICgoZm91bmQgJSAyID09IDApID09IChkaXIgPiAwKSkge1xuICAgICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkZXB0aCA9PSAxKSB7IC8vIENsb3NpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRUb2tlbiwgZW5kOiB7IGZyb206IGJhc2VQb3MgKyBwb3MsIHRvOiBiYXNlUG9zICsgcG9zICsgMSB9LCBtYXRjaGVkOiAoZm91bmQgPj4gMSkgPT0gKGJyYWNrZXQgPj4gMSkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpciA+IDApXG4gICAgICAgICAgICBkaXN0YW5jZSArPSB0ZXh0Lmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZXIuZG9uZSA/IHsgc3RhcnQ6IHN0YXJ0VG9rZW4sIG1hdGNoZWQ6IGZhbHNlIH0gOiBudWxsO1xufVxuXG4vLyBDb3VudHMgdGhlIGNvbHVtbiBvZmZzZXQgaW4gYSBzdHJpbmcsIHRha2luZyB0YWJzIGludG8gYWNjb3VudC5cbi8vIFVzZWQgbW9zdGx5IHRvIGZpbmQgaW5kZW50YXRpb24uXG5mdW5jdGlvbiBjb3VudENvbChzdHJpbmcsIGVuZCwgdGFiU2l6ZSwgc3RhcnRJbmRleCA9IDAsIHN0YXJ0VmFsdWUgPSAwKSB7XG4gICAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgICAgIGVuZCA9IHN0cmluZy5zZWFyY2goL1teXFxzXFx1MDBhMF0vKTtcbiAgICAgICAgaWYgKGVuZCA9PSAtMSlcbiAgICAgICAgICAgIGVuZCA9IHN0cmluZy5sZW5ndGg7XG4gICAgfVxuICAgIGxldCBuID0gc3RhcnRWYWx1ZTtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdChpKSA9PSA5KVxuICAgICAgICAgICAgbiArPSB0YWJTaXplIC0gKG4gJSB0YWJTaXplKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbisrO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbn1cbi8qKlxuRW5jYXBzdWxhdGVzIGEgc2luZ2xlIGxpbmUgb2YgaW5wdXQuIEdpdmVuIHRvIHN0cmVhbSBzeW50YXggY29kZSxcbndoaWNoIHVzZXMgaXQgdG8gdG9rZW5pemUgdGhlIGNvbnRlbnQuXG4qL1xuY2xhc3MgU3RyaW5nU3RyZWFtIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBzdHJlYW0uXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbGluZS5cbiAgICAqL1xuICAgIHN0cmluZywgdGFiU2l6ZSwgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgaW5kZW50IHVuaXQgc2l6ZS5cbiAgICAqL1xuICAgIGluZGVudFVuaXQsIGxvb2tBaGVhZCwgb3ZlcnJpZGVJbmRlbnQpIHtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgICAgIHRoaXMudGFiU2l6ZSA9IHRhYlNpemU7XG4gICAgICAgIHRoaXMuaW5kZW50VW5pdCA9IGluZGVudFVuaXQ7XG4gICAgICAgIHRoaXMubG9va0FoZWFkID0gbG9va0FoZWFkO1xuICAgICAgICB0aGlzLm92ZXJyaWRlSW5kZW50ID0gb3ZlcnJpZGVJbmRlbnQ7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgbGluZS5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHRva2VuLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0YXJ0ID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q29sdW1uUG9zID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q29sdW1uVmFsdWUgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgZW9sKCkgeyByZXR1cm4gdGhpcy5wb3MgPj0gdGhpcy5zdHJpbmcubGVuZ3RoOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSBpZiB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgc29sKCkgeyByZXR1cm4gdGhpcy5wb3MgPT0gMDsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbmV4dCBjb2RlIHVuaXQgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24sIG9yIHVuZGVmaW5lZFxuICAgIGlmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBwZWVrKCkgeyByZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSB8fCB1bmRlZmluZWQ7IH1cbiAgICAvKipcbiAgICBSZWFkIHRoZSBuZXh0IGNvZGUgdW5pdCBhbmQgYWR2YW5jZSBgdGhpcy5wb3NgLlxuICAgICovXG4gICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMucG9zIDwgdGhpcy5zdHJpbmcubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcysrKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWF0Y2ggdGhlIG5leHQgY2hhcmFjdGVyIGFnYWluc3QgdGhlIGdpdmVuIHN0cmluZywgcmVndWxhclxuICAgIGV4cHJlc3Npb24sIG9yIHByZWRpY2F0ZS4gQ29uc3VtZSBhbmQgcmV0dXJuIGl0IGlmIGl0IG1hdGNoZXMuXG4gICAgKi9cbiAgICBlYXQobWF0Y2gpIHtcbiAgICAgICAgbGV0IGNoID0gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKTtcbiAgICAgICAgbGV0IG9rO1xuICAgICAgICBpZiAodHlwZW9mIG1hdGNoID09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICBvayA9IGNoID09IG1hdGNoO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBvayA9IGNoICYmIChtYXRjaCBpbnN0YW5jZW9mIFJlZ0V4cCA/IG1hdGNoLnRlc3QoY2gpIDogbWF0Y2goY2gpKTtcbiAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgICArK3RoaXMucG9zO1xuICAgICAgICAgICAgcmV0dXJuIGNoO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnRpbnVlIG1hdGNoaW5nIGNoYXJhY3RlcnMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gc3RyaW5nLFxuICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiwgb3IgcHJlZGljYXRlIGZ1bmN0aW9uLiBSZXR1cm4gdHJ1ZSBpZiBhbnlcbiAgICBjaGFyYWN0ZXJzIHdlcmUgY29uc3VtZWQuXG4gICAgKi9cbiAgICBlYXRXaGlsZShtYXRjaCkge1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnBvcztcbiAgICAgICAgd2hpbGUgKHRoaXMuZWF0KG1hdGNoKSkgeyB9XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyA+IHN0YXJ0O1xuICAgIH1cbiAgICAvKipcbiAgICBDb25zdW1lIHdoaXRlc3BhY2UgYWhlYWQgb2YgYHRoaXMucG9zYC4gUmV0dXJuIHRydWUgaWYgYW55IHdhc1xuICAgIGZvdW5kLlxuICAgICovXG4gICAgZWF0U3BhY2UoKSB7XG4gICAgICAgIGxldCBzdGFydCA9IHRoaXMucG9zO1xuICAgICAgICB3aGlsZSAoL1tcXHNcXHUwMGEwXS8udGVzdCh0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpKSlcbiAgICAgICAgICAgICsrdGhpcy5wb3M7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyA+IHN0YXJ0O1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBza2lwVG9FbmQoKSB7IHRoaXMucG9zID0gdGhpcy5zdHJpbmcubGVuZ3RoOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0byBkaXJlY3RseSBiZWZvcmUgdGhlIGdpdmVuIGNoYXJhY3RlciwgaWYgZm91bmQgb24gdGhlXG4gICAgY3VycmVudCBsaW5lLlxuICAgICovXG4gICAgc2tpcFRvKGNoKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IHRoaXMuc3RyaW5nLmluZGV4T2YoY2gsIHRoaXMucG9zKTtcbiAgICAgICAgaWYgKGZvdW5kID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucG9zID0gZm91bmQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIGJhY2sgYG5gIGNoYXJhY3RlcnMuXG4gICAgKi9cbiAgICBiYWNrVXAobikgeyB0aGlzLnBvcyAtPSBuOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjb2x1bW4gcG9zaXRpb24gYXQgYHRoaXMucG9zYC5cbiAgICAqL1xuICAgIGNvbHVtbigpIHtcbiAgICAgICAgaWYgKHRoaXMubGFzdENvbHVtblBvcyA8IHRoaXMuc3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdENvbHVtblZhbHVlID0gY291bnRDb2wodGhpcy5zdHJpbmcsIHRoaXMuc3RhcnQsIHRoaXMudGFiU2l6ZSwgdGhpcy5sYXN0Q29sdW1uUG9zLCB0aGlzLmxhc3RDb2x1bW5WYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmxhc3RDb2x1bW5Qb3MgPSB0aGlzLnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RDb2x1bW5WYWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBpbmRlbnRhdGlvbiBjb2x1bW4gb2YgdGhlIGN1cnJlbnQgbGluZS5cbiAgICAqL1xuICAgIGluZGVudGF0aW9uKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLm92ZXJyaWRlSW5kZW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjb3VudENvbCh0aGlzLnN0cmluZywgbnVsbCwgdGhpcy50YWJTaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWF0Y2ggdGhlIGlucHV0IGFnYWluc3QgdGhlIGdpdmVuIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb25cbiAgICAod2hpY2ggc2hvdWxkIHN0YXJ0IHdpdGggYSBgXmApLiBSZXR1cm4gdHJ1ZSBvciB0aGUgcmVnZXhwIG1hdGNoXG4gICAgaWYgaXQgbWF0Y2hlcy5cbiAgICBcbiAgICBVbmxlc3MgYGNvbnN1bWVgIGlzIHNldCB0byBgZmFsc2VgLCB0aGlzIHdpbGwgbW92ZSBgdGhpcy5wb3NgXG4gICAgcGFzdCB0aGUgbWF0Y2hlZCB0ZXh0LlxuICAgIFxuICAgIFdoZW4gbWF0Y2hpbmcgYSBzdHJpbmcgYGNhc2VJbnNlbnNpdGl2ZWAgY2FuIGJlIHNldCB0byB0cnVlIHRvXG4gICAgbWFrZSB0aGUgbWF0Y2ggY2FzZS1pbnNlbnNpdGl2ZS5cbiAgICAqL1xuICAgIG1hdGNoKHBhdHRlcm4sIGNvbnN1bWUsIGNhc2VJbnNlbnNpdGl2ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IGNhc2VkID0gKHN0cikgPT4gY2FzZUluc2Vuc2l0aXZlID8gc3RyLnRvTG93ZXJDYXNlKCkgOiBzdHI7XG4gICAgICAgICAgICBsZXQgc3Vic3RyID0gdGhpcy5zdHJpbmcuc3Vic3RyKHRoaXMucG9zLCBwYXR0ZXJuLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoY2FzZWQoc3Vic3RyKSA9PSBjYXNlZChwYXR0ZXJuKSkge1xuICAgICAgICAgICAgICAgIGlmIChjb25zdW1lICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3MgKz0gcGF0dGVybi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnBvcykubWF0Y2gocGF0dGVybik7XG4gICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2guaW5kZXggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgaWYgKG1hdGNoICYmIGNvbnN1bWUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGN1cnJlbnQgdG9rZW4uXG4gICAgKi9cbiAgICBjdXJyZW50KCkgeyByZXR1cm4gdGhpcy5zdHJpbmcuc2xpY2UodGhpcy5zdGFydCwgdGhpcy5wb3MpOyB9XG59XG5cbmZ1bmN0aW9uIGZ1bGxQYXJzZXIoc3BlYykge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHNwZWMubmFtZSB8fCBcIlwiLFxuICAgICAgICB0b2tlbjogc3BlYy50b2tlbixcbiAgICAgICAgYmxhbmtMaW5lOiBzcGVjLmJsYW5rTGluZSB8fCAoKCkgPT4gbnVsbCksXG4gICAgICAgIHN0YXJ0U3RhdGU6IHNwZWMuc3RhcnRTdGF0ZSB8fCAoKCkgPT4gdHJ1ZSksXG4gICAgICAgIGNvcHlTdGF0ZTogc3BlYy5jb3B5U3RhdGUgfHwgZGVmYXVsdENvcHlTdGF0ZSxcbiAgICAgICAgaW5kZW50OiBzcGVjLmluZGVudCB8fCAoKCkgPT4gbnVsbCksXG4gICAgICAgIGxhbmd1YWdlRGF0YTogc3BlYy5sYW5ndWFnZURhdGEgfHwge30sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDb3B5U3RhdGUoc3RhdGUpIHtcbiAgICBpZiAodHlwZW9mIHN0YXRlICE9IFwib2JqZWN0XCIpXG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICBsZXQgbmV3U3RhdGUgPSB7fTtcbiAgICBmb3IgKGxldCBwcm9wIGluIHN0YXRlKSB7XG4gICAgICAgIGxldCB2YWwgPSBzdGF0ZVtwcm9wXTtcbiAgICAgICAgbmV3U3RhdGVbcHJvcF0gPSAodmFsIGluc3RhbmNlb2YgQXJyYXkgPyB2YWwuc2xpY2UoKSA6IHZhbCk7XG4gICAgfVxuICAgIHJldHVybiBuZXdTdGF0ZTtcbn1cbmNvbnN0IEluZGVudGVkRnJvbSA9IC8qQF9fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuLyoqXG5BIFtsYW5ndWFnZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZSkgY2xhc3MgYmFzZWQgb24gYSBDb2RlTWlycm9yXG41LXN0eWxlIFtzdHJlYW1pbmcgcGFyc2VyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLlN0cmVhbVBhcnNlcikuXG4qL1xuY2xhc3MgU3RyZWFtTGFuZ3VhZ2UgZXh0ZW5kcyBMYW5ndWFnZSB7XG4gICAgY29uc3RydWN0b3IocGFyc2VyKSB7XG4gICAgICAgIGxldCBkYXRhID0gZGVmaW5lTGFuZ3VhZ2VGYWNldChwYXJzZXIubGFuZ3VhZ2VEYXRhKTtcbiAgICAgICAgbGV0IHAgPSBmdWxsUGFyc2VyKHBhcnNlciksIHNlbGY7XG4gICAgICAgIGxldCBpbXBsID0gbmV3IGNsYXNzIGV4dGVuZHMgUGFyc2VyIHtcbiAgICAgICAgICAgIGNyZWF0ZVBhcnNlKGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGFyc2Uoc2VsZiwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc3VwZXIoZGF0YSwgaW1wbCwgW10sIHBhcnNlci5uYW1lKTtcbiAgICAgICAgdGhpcy50b3BOb2RlID0gZG9jSUQoZGF0YSwgdGhpcyk7XG4gICAgICAgIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLnN0cmVhbVBhcnNlciA9IHA7XG4gICAgICAgIHRoaXMuc3RhdGVBZnRlciA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHN0cmVhbSBsYW5ndWFnZS5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlYykgeyByZXR1cm4gbmV3IFN0cmVhbUxhbmd1YWdlKHNwZWMpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXRJbmRlbnQoY3gpIHtcbiAgICAgICAgbGV0IGZyb20gPSB1bmRlZmluZWQ7XG4gICAgICAgIGxldCB7IG92ZXJyaWRlSW5kZW50YXRpb24gfSA9IGN4Lm9wdGlvbnM7XG4gICAgICAgIGlmIChvdmVycmlkZUluZGVudGF0aW9uKSB7XG4gICAgICAgICAgICBmcm9tID0gSW5kZW50ZWRGcm9tLmdldChjeC5zdGF0ZSk7XG4gICAgICAgICAgICBpZiAoZnJvbSAhPSBudWxsICYmIGZyb20gPCBjeC5wb3MgLSAxZTQpXG4gICAgICAgICAgICAgICAgZnJvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnQgPSBmaW5kU3RhdGUodGhpcywgY3gubm9kZS50cmVlLCBjeC5ub2RlLmZyb20sIGN4Lm5vZGUuZnJvbSwgZnJvbSAhPT0gbnVsbCAmJiBmcm9tICE9PSB2b2lkIDAgPyBmcm9tIDogY3gucG9zKSwgc3RhdGVQb3MsIHN0YXRlO1xuICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gc3RhcnQuc3RhdGU7XG4gICAgICAgICAgICBzdGF0ZVBvcyA9IHN0YXJ0LnBvcyArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHRoaXMuc3RyZWFtUGFyc2VyLnN0YXJ0U3RhdGUoY3gudW5pdCk7XG4gICAgICAgICAgICBzdGF0ZVBvcyA9IGN4Lm5vZGUuZnJvbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3gucG9zIC0gc3RhdGVQb3MgPiAxMDAwMCAvKiBDLk1heEluZGVudFNjYW5EaXN0ICovKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHdoaWxlIChzdGF0ZVBvcyA8IGN4LnBvcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBjeC5zdGF0ZS5kb2MubGluZUF0KHN0YXRlUG9zKSwgZW5kID0gTWF0aC5taW4oY3gucG9zLCBsaW5lLnRvKTtcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBpbmRlbnRhdGlvbiA9IG92ZXJyaWRlSW5kZW50YXRpb24gPyBvdmVycmlkZUluZGVudGF0aW9uKGxpbmUuZnJvbSkgOiAtMTtcbiAgICAgICAgICAgICAgICBsZXQgbG9va2FoZWFkID0gKG4pID0+IG4gKyBsaW5lLm51bWJlciA+IGN4LnN0YXRlLmRvYy5saW5lcyA/ICcnIDogY3guc3RhdGUuZG9jLmxpbmUobiArIGxpbmUubnVtYmVyKS50ZXh0O1xuICAgICAgICAgICAgICAgIGxldCBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKGxpbmUudGV4dCwgY3guc3RhdGUudGFiU2l6ZSwgY3gudW5pdCwgbG9va2FoZWFkLCBpbmRlbnRhdGlvbiA8IDAgPyB1bmRlZmluZWQgOiBpbmRlbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHN0cmVhbS5wb3MgPCBlbmQgLSBsaW5lLmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHJlYWRUb2tlbih0aGlzLnN0cmVhbVBhcnNlci50b2tlbiwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbVBhcnNlci5ibGFua0xpbmUoc3RhdGUsIGN4LnVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVuZCA9PSBjeC5wb3MpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBzdGF0ZVBvcyA9IGxpbmUudG8gKyAxO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lID0gY3gubGluZUF0KGN4LnBvcyk7XG4gICAgICAgIGlmIChvdmVycmlkZUluZGVudGF0aW9uICYmIGZyb20gPT0gbnVsbClcbiAgICAgICAgICAgIEluZGVudGVkRnJvbS5zZXQoY3guc3RhdGUsIGxpbmUuZnJvbSk7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnN0cmVhbVBhcnNlci5pbmRlbnQoc3RhdGUsIC9eXFxzKiguKikvLmV4ZWMobGluZS50ZXh0KVsxXSwgY3gpO1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC50b1N0cmluZygpID09PSAnQ29kZU1pcnJvci5QYXNzJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZ2V0IGFsbG93c05lc3RpbmcoKSB7IHJldHVybiBmYWxzZTsgfVxufVxuZnVuY3Rpb24gZmluZFN0YXRlKGxhbmcsIHRyZWUsIG9mZiwgc3RhcnRQb3MsIGJlZm9yZSkge1xuICAgIGxldCBzdGF0ZSA9IG9mZiA+PSBzdGFydFBvcyAmJiBvZmYgKyB0cmVlLmxlbmd0aCA8PSBiZWZvcmUgJiYgdHJlZS5wcm9wKGxhbmcuc3RhdGVBZnRlcik7XG4gICAgaWYgKHN0YXRlKVxuICAgICAgICByZXR1cm4geyBzdGF0ZTogbGFuZy5zdHJlYW1QYXJzZXIuY29weVN0YXRlKHN0YXRlKSwgcG9zOiBvZmYgKyB0cmVlLmxlbmd0aCB9O1xuICAgIGZvciAobGV0IGkgPSB0cmVlLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IHRyZWUuY2hpbGRyZW5baV0sIHBvcyA9IG9mZiArIHRyZWUucG9zaXRpb25zW2ldO1xuICAgICAgICBsZXQgZm91bmQgPSBjaGlsZCBpbnN0YW5jZW9mIFRyZWUgJiYgcG9zIDwgYmVmb3JlICYmIGZpbmRTdGF0ZShsYW5nLCBjaGlsZCwgcG9zLCBzdGFydFBvcywgYmVmb3JlKTtcbiAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGN1dFRyZWUobGFuZywgdHJlZSwgZnJvbSwgdG8sIGluc2lkZSkge1xuICAgIGlmIChpbnNpZGUgJiYgZnJvbSA8PSAwICYmIHRvID49IHRyZWUubGVuZ3RoKVxuICAgICAgICByZXR1cm4gdHJlZTtcbiAgICBpZiAoIWluc2lkZSAmJiBmcm9tID09IDAgJiYgdHJlZS50eXBlID09IGxhbmcudG9wTm9kZSlcbiAgICAgICAgaW5zaWRlID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBsZXQgcG9zID0gdHJlZS5wb3NpdGlvbnNbaV0sIGNoaWxkID0gdHJlZS5jaGlsZHJlbltpXSwgaW5uZXI7XG4gICAgICAgIGlmIChwb3MgPCB0byAmJiBjaGlsZCBpbnN0YW5jZW9mIFRyZWUpIHtcbiAgICAgICAgICAgIGlmICghKGlubmVyID0gY3V0VHJlZShsYW5nLCBjaGlsZCwgZnJvbSAtIHBvcywgdG8gLSBwb3MsIGluc2lkZSkpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcmV0dXJuICFpbnNpZGUgPyBpbm5lclxuICAgICAgICAgICAgICAgIDogbmV3IFRyZWUodHJlZS50eXBlLCB0cmVlLmNoaWxkcmVuLnNsaWNlKDAsIGkpLmNvbmNhdChpbm5lciksIHRyZWUucG9zaXRpb25zLnNsaWNlKDAsIGkgKyAxKSwgcG9zICsgaW5uZXIubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGZpbmRTdGFydEluRnJhZ21lbnRzKGxhbmcsIGZyYWdtZW50cywgc3RhcnRQb3MsIGVuZFBvcywgZWRpdG9yU3RhdGUpIHtcbiAgICBmb3IgKGxldCBmIG9mIGZyYWdtZW50cykge1xuICAgICAgICBsZXQgZnJvbSA9IGYuZnJvbSArIChmLm9wZW5TdGFydCA/IDI1IDogMCksIHRvID0gZi50byAtIChmLm9wZW5FbmQgPyAyNSA6IDApO1xuICAgICAgICBsZXQgZm91bmQgPSBmcm9tIDw9IHN0YXJ0UG9zICYmIHRvID4gc3RhcnRQb3MgJiYgZmluZFN0YXRlKGxhbmcsIGYudHJlZSwgMCAtIGYub2Zmc2V0LCBzdGFydFBvcywgdG8pLCB0cmVlO1xuICAgICAgICBpZiAoZm91bmQgJiYgZm91bmQucG9zIDw9IGVuZFBvcyAmJiAodHJlZSA9IGN1dFRyZWUobGFuZywgZi50cmVlLCBzdGFydFBvcyArIGYub2Zmc2V0LCBmb3VuZC5wb3MgKyBmLm9mZnNldCwgZmFsc2UpKSlcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXRlOiBmb3VuZC5zdGF0ZSwgdHJlZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzdGF0ZTogbGFuZy5zdHJlYW1QYXJzZXIuc3RhcnRTdGF0ZShlZGl0b3JTdGF0ZSA/IGdldEluZGVudFVuaXQoZWRpdG9yU3RhdGUpIDogNCksIHRyZWU6IFRyZWUuZW1wdHkgfTtcbn1cbmNsYXNzIFBhcnNlIHtcbiAgICBjb25zdHJ1Y3RvcihsYW5nLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy5sYW5nID0gbGFuZztcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cztcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1BvcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rID0gW107XG4gICAgICAgIHRoaXMuY2h1bmtSZXVzZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudG9rZW5DYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLnJhbmdlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnRvID0gcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXS50bztcbiAgICAgICAgbGV0IGNvbnRleHQgPSBQYXJzZUNvbnRleHQuZ2V0KCksIGZyb20gPSByYW5nZXNbMF0uZnJvbTtcbiAgICAgICAgbGV0IHsgc3RhdGUsIHRyZWUgfSA9IGZpbmRTdGFydEluRnJhZ21lbnRzKGxhbmcsIGZyYWdtZW50cywgZnJvbSwgdGhpcy50bywgY29udGV4dCA9PT0gbnVsbCB8fCBjb250ZXh0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb250ZXh0LnN0YXRlKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLnBhcnNlZFBvcyA9IHRoaXMuY2h1bmtTdGFydCA9IGZyb20gKyB0cmVlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmVlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmNodW5rcy5wdXNoKHRyZWUuY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgdGhpcy5jaHVua1Bvcy5wdXNoKHRyZWUucG9zaXRpb25zW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udGV4dCAmJiB0aGlzLnBhcnNlZFBvcyA8IGNvbnRleHQudmlld3BvcnQuZnJvbSAtIDEwMDAwMCAvKiBDLk1heERpc3RhbmNlQmVmb3JlVmlld3BvcnQgKi8gJiZcbiAgICAgICAgICAgIHJhbmdlcy5zb21lKHIgPT4gci5mcm9tIDw9IGNvbnRleHQudmlld3BvcnQuZnJvbSAmJiByLnRvID49IGNvbnRleHQudmlld3BvcnQuZnJvbSkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLmxhbmcuc3RyZWFtUGFyc2VyLnN0YXJ0U3RhdGUoZ2V0SW5kZW50VW5pdChjb250ZXh0LnN0YXRlKSk7XG4gICAgICAgICAgICBjb250ZXh0LnNraXBVbnRpbEluVmlldyh0aGlzLnBhcnNlZFBvcywgY29udGV4dC52aWV3cG9ydC5mcm9tKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkUG9zID0gY29udGV4dC52aWV3cG9ydC5mcm9tO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW92ZVJhbmdlSW5kZXgoKTtcbiAgICB9XG4gICAgYWR2YW5jZSgpIHtcbiAgICAgICAgbGV0IGNvbnRleHQgPSBQYXJzZUNvbnRleHQuZ2V0KCk7XG4gICAgICAgIGxldCBwYXJzZUVuZCA9IHRoaXMuc3RvcHBlZEF0ID09IG51bGwgPyB0aGlzLnRvIDogTWF0aC5taW4odGhpcy50bywgdGhpcy5zdG9wcGVkQXQpO1xuICAgICAgICBsZXQgZW5kID0gTWF0aC5taW4ocGFyc2VFbmQsIHRoaXMuY2h1bmtTdGFydCArIDIwNDggLyogQy5DaHVua1NpemUgKi8pO1xuICAgICAgICAvLyBQYXJzZSBqdXN0IGEgbGl0dGxlIGJpdCBtb3JlIHRoYW4gdGhlIHZpZXdwb3J0LlxuICAgICAgICBsZXQgb3ZlcmJ1ZmZlciA9IDUwMDA7XG4gICAgICAgIGxldCB2aWV3cG9ydEVuZCA9IGNvbnRleHQudmlld3BvcnQudG8gKyBvdmVyYnVmZmVyO1xuICAgICAgICBpZiAoY29udGV4dClcbiAgICAgICAgICAgIGVuZCA9IE1hdGgubWluKGVuZCwgdmlld3BvcnRFbmQpO1xuICAgICAgICB3aGlsZSAodGhpcy5wYXJzZWRQb3MgPCBlbmQpXG4gICAgICAgICAgICB0aGlzLnBhcnNlTGluZShjb250ZXh0KTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtTdGFydCA8IHRoaXMucGFyc2VkUG9zKVxuICAgICAgICAgICAgdGhpcy5maW5pc2hDaHVuaygpO1xuICAgICAgICBpZiAodGhpcy5wYXJzZWRQb3MgPj0gcGFyc2VFbmQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2goKTtcbiAgICAgICAgaWYgKGNvbnRleHQgJiYgdGhpcy5wYXJzZWRQb3MgPj0gdmlld3BvcnRFbmQpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2tpcFVudGlsSW5WaWV3KHRoaXMucGFyc2VkUG9zIC0gb3ZlcmJ1ZmZlciwgcGFyc2VFbmQpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHN0b3BBdChwb3MpIHtcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBwb3M7XG4gICAgfVxuICAgIGxpbmVBZnRlcihwb3MpIHtcbiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5pbnB1dC5jaHVuayhwb3MpO1xuICAgICAgICBpZiAoIXRoaXMuaW5wdXQubGluZUNodW5rcykge1xuICAgICAgICAgICAgbGV0IGVvbCA9IGNodW5rLmluZGV4T2YoXCJcXG5cIik7XG4gICAgICAgICAgICBpZiAoZW9sID4gLTEpXG4gICAgICAgICAgICAgICAgY2h1bmsgPSBjaHVuay5zbGljZSgwLCBlb2wpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNodW5rID09IFwiXFxuXCIpIHtcbiAgICAgICAgICAgIGNodW5rID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zICsgY2h1bmsubGVuZ3RoIDw9IHRoaXMudG8gPyBjaHVuayA6IGNodW5rLnNsaWNlKDAsIHRoaXMudG8gLSBwb3MpO1xuICAgIH1cbiAgICBuZXh0TGluZSgpIHtcbiAgICAgICAgbGV0IGZyb20gPSB0aGlzLnBhcnNlZFBvcywgbGluZSA9IHRoaXMubGluZUFmdGVyKGZyb20pLCBlbmQgPSBmcm9tICsgbGluZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gdGhpcy5yYW5nZUluZGV4OzspIHtcbiAgICAgICAgICAgIGxldCByYW5nZUVuZCA9IHRoaXMucmFuZ2VzW2luZGV4XS50bztcbiAgICAgICAgICAgIGlmIChyYW5nZUVuZCA+PSBlbmQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsaW5lID0gbGluZS5zbGljZSgwLCByYW5nZUVuZCAtIChlbmQgLSBsaW5lLmxlbmd0aCkpO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIGlmIChpbmRleCA9PSB0aGlzLnJhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgcmFuZ2VTdGFydCA9IHRoaXMucmFuZ2VzW2luZGV4XS5mcm9tO1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gdGhpcy5saW5lQWZ0ZXIocmFuZ2VTdGFydCk7XG4gICAgICAgICAgICBsaW5lICs9IGFmdGVyO1xuICAgICAgICAgICAgZW5kID0gcmFuZ2VTdGFydCArIGFmdGVyLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBsaW5lLCBlbmQgfTtcbiAgICB9XG4gICAgc2tpcEdhcHNUbyhwb3MsIG9mZnNldCwgc2lkZSkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgZW5kID0gdGhpcy5yYW5nZXNbdGhpcy5yYW5nZUluZGV4XS50bywgb2ZmUG9zID0gcG9zICsgb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKHNpZGUgPiAwID8gZW5kID4gb2ZmUG9zIDogZW5kID49IG9mZlBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMucmFuZ2VzWysrdGhpcy5yYW5nZUluZGV4XS5mcm9tO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHN0YXJ0IC0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICAgIG1vdmVSYW5nZUluZGV4KCkge1xuICAgICAgICB3aGlsZSAodGhpcy5yYW5nZXNbdGhpcy5yYW5nZUluZGV4XS50byA8IHRoaXMucGFyc2VkUG9zKVxuICAgICAgICAgICAgdGhpcy5yYW5nZUluZGV4Kys7XG4gICAgfVxuICAgIGVtaXRUb2tlbihpZCwgZnJvbSwgdG8sIHNpemUsIG9mZnNldCkge1xuICAgICAgICBpZiAodGhpcy5yYW5nZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5za2lwR2Fwc1RvKGZyb20sIG9mZnNldCwgMSk7XG4gICAgICAgICAgICBmcm9tICs9IG9mZnNldDtcbiAgICAgICAgICAgIGxldCBsZW4wID0gdGhpcy5jaHVuay5sZW5ndGg7XG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnNraXBHYXBzVG8odG8sIG9mZnNldCwgLTEpO1xuICAgICAgICAgICAgdG8gKz0gb2Zmc2V0O1xuICAgICAgICAgICAgc2l6ZSArPSB0aGlzLmNodW5rLmxlbmd0aCAtIGxlbjA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNodW5rLmxlbmd0aCAtIDQ7XG4gICAgICAgIGlmIChzaXplID09IDQgJiYgbGFzdCA+PSAwICYmIHRoaXMuY2h1bmtbbGFzdF0gPT0gaWQgJiYgdGhpcy5jaHVua1tsYXN0ICsgMl0gPT0gZnJvbSlcbiAgICAgICAgICAgIHRoaXMuY2h1bmtbbGFzdCArIDJdID0gdG87XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuY2h1bmsucHVzaChpZCwgZnJvbSwgdG8sIHNpemUpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBwYXJzZUxpbmUoY29udGV4dCkge1xuICAgICAgICBsZXQgeyBsaW5lLCBlbmQgfSA9IHRoaXMubmV4dExpbmUoKSwgb2Zmc2V0ID0gMCwgeyBzdHJlYW1QYXJzZXIgfSA9IHRoaXMubGFuZywgeyB0b2tlbkNhY2hlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgbG9va2FoZWFkID0gKG4pID0+IHtcbiAgICAgICAgICAgIGxldCBwb3MgPSB0aGlzLnBhcnNlZFBvcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcG9zICs9IHRoaXMubGluZUFmdGVyKHBvcykubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChwb3MgPCB0aGlzLmlucHV0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saW5lQWZ0ZXIocG9zKTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0obGluZSwgY29udGV4dCA/IGNvbnRleHQuc3RhdGUudGFiU2l6ZSA6IDQsIGNvbnRleHQgPyBnZXRJbmRlbnRVbml0KGNvbnRleHQuc3RhdGUpIDogMiwgbG9va2FoZWFkKTtcbiAgICAgICAgbGV0IGNodW5rcyA9IFtdO1xuICAgICAgICBsZXQgbGluZUNsYXNzZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGlmIChzdHJlYW0uZW9sKCkpIHtcbiAgICAgICAgICAgIGxldCB0b2tlbiA9IHN0cmVhbVBhcnNlci5ibGFua0xpbmUodGhpcy5zdGF0ZSwgc3RyZWFtLmluZGVudFVuaXQpO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgdG9rZW4uc3BsaXQoJyAnKS5mb3JFYWNoKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5lQ2xhc3MgPSB0Lm1hdGNoKC9ebGluZS0oYmFja2dyb3VuZC0pPyguKikkLyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVDbGFzc2VzLmFkZChsaW5lQ2xhc3NbMl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IG51bGw7XG4gICAgICAgICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkge1xuICAgICAgICAgICAgICAgIGxldCB0b2tlbiA9IHJlYWRUb2tlbihzdHJlYW1QYXJzZXIudG9rZW4sIHN0cmVhbSwgdGhpcy5zdGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjYWNoZWQgPSB0b2tlbkNhY2hlW3Rva2VuXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVjbHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNscztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gY2FjaGVkWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNscyA9IGNhY2hlZFsxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b2tlbnMgPSB0b2tlbi5zcGxpdCgnICcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gdG9rZW5zLmZpbHRlcih0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZUNsYXNzID0gdC5tYXRjaCgvXmxpbmUtKGJhY2tncm91bmQtKT8oLiopJC8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNscy5wdXNoKGxpbmVDbGFzc1syXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNscyA9IHRva2Vucy5zb3J0KCkuam9pbignICcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5DYWNoZVt0b2tlbl0gPSBbY2xzLCBsaW5lY2xzXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGluZWNscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjbHMgb2YgbGluZWNscykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVDbGFzc2VzLmFkZChjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBmcm9tID0gdGhpcy5wYXJzZWRQb3MgKyBzdHJlYW0uc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0byA9IHRoaXMucGFyc2VkUG9zICsgc3RyZWFtLnBvcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgJiYgbGFzdC5jbHMgPT09IGNscyAmJiBsYXN0LnRvID09PSBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0LnRvID0gdG87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0geyBjbHMsIGZyb20sIHRvIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChsYXN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGNodW5rIG9mIGNodW5rcykge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuZW1pdFRva2VuKHRva2VuSUQoY2h1bmsuY2xzKSwgY2h1bmsuZnJvbSwgY2h1bmsudG8sIDQsIG9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmVDbGFzc2VzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLmVtaXRUb2tlbih0b2tlbklEKEFycmF5LmZyb20obGluZUNsYXNzZXMpLnNvcnQoKS5qb2luKCcgJyksIHRydWUpLCB0aGlzLnBhcnNlZFBvcywgdGhpcy5wYXJzZWRQb3MgKyBsaW5lLmxlbmd0aCwgKGNodW5rcy5sZW5ndGggKyAxKSAqIDQsIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJzZWRQb3MgPSBlbmQ7XG4gICAgICAgIHRoaXMubW92ZVJhbmdlSW5kZXgoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyc2VkUG9zIDwgdGhpcy50bylcbiAgICAgICAgICAgIHRoaXMucGFyc2VkUG9zKys7XG4gICAgfVxuICAgIGZpbmlzaENodW5rKCkge1xuICAgICAgICBsZXQgdHJlZSA9IFRyZWUuYnVpbGQoe1xuICAgICAgICAgICAgYnVmZmVyOiB0aGlzLmNodW5rLFxuICAgICAgICAgICAgc3RhcnQ6IHRoaXMuY2h1bmtTdGFydCxcbiAgICAgICAgICAgIGxlbmd0aDogdGhpcy5wYXJzZWRQb3MgLSB0aGlzLmNodW5rU3RhcnQsXG4gICAgICAgICAgICBub2RlU2V0LFxuICAgICAgICAgICAgdG9wSUQ6IDAsXG4gICAgICAgICAgICBtYXhCdWZmZXJMZW5ndGg6IDIwNDggLyogQy5DaHVua1NpemUgKi8sXG4gICAgICAgICAgICByZXVzZWQ6IHRoaXMuY2h1bmtSZXVzZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHRyZWUgPSBuZXcgVHJlZSh0cmVlLnR5cGUsIHRyZWUuY2hpbGRyZW4sIHRyZWUucG9zaXRpb25zLCB0cmVlLmxlbmd0aCwgW1t0aGlzLmxhbmcuc3RhdGVBZnRlciwgdGhpcy5sYW5nLnN0cmVhbVBhcnNlci5jb3B5U3RhdGUodGhpcy5zdGF0ZSldXSk7XG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2godHJlZSk7XG4gICAgICAgIHRoaXMuY2h1bmtQb3MucHVzaCh0aGlzLmNodW5rU3RhcnQgLSB0aGlzLnJhbmdlc1swXS5mcm9tKTtcbiAgICAgICAgdGhpcy5jaHVuayA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rUmV1c2VkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSB0aGlzLnBhcnNlZFBvcztcbiAgICB9XG4gICAgZmluaXNoKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyZWUodGhpcy5sYW5nLnRvcE5vZGUsIHRoaXMuY2h1bmtzLCB0aGlzLmNodW5rUG9zLCB0aGlzLnBhcnNlZFBvcyAtIHRoaXMucmFuZ2VzWzBdLmZyb20pLmJhbGFuY2UoKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZWFkVG9rZW4odG9rZW4sIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBzdHJlYW0uc3RhcnQgPSBzdHJlYW0ucG9zO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdG9rZW4oc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIGlmIChzdHJlYW0ucG9zID4gc3RyZWFtLnN0YXJ0KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3RyZWFtIHBhcnNlciBmYWlsZWQgdG8gYWR2YW5jZSBzdHJlYW0uXCIpO1xufVxuY29uc3QgdG9rZW5UYWJsZSA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3QgdHlwZUFycmF5ID0gW05vZGVUeXBlLm5vbmVdO1xuY29uc3Qgbm9kZVNldCA9IC8qQF9fUFVSRV9fKi9uZXcgTm9kZVNldCh0eXBlQXJyYXkpO1xuLy8gQ2FjaGUgb2Ygbm9kZSB0eXBlcyBieSBuYW1lIGFuZCB0YWdzXG5jb25zdCBieVRhZyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuZnVuY3Rpb24gdG9rZW5JRCh0YWcsIGxpbmVNb2RlKSB7XG4gICAgcmV0dXJuICF0YWcgPyAwIDogdG9rZW5UYWJsZVt0YWddIHx8ICh0b2tlblRhYmxlW3RhZ10gPSBjcmVhdGVUb2tlblR5cGUodGFnLCBsaW5lTW9kZSkpO1xufVxuZnVuY3Rpb24gY3JlYXRlVG9rZW5UeXBlKHRhZ1N0ciwgbGluZU1vZGUpIHtcbiAgICBsZXQgbmFtZSA9IHRhZ1N0ci5yZXBsYWNlKC8gL2csIFwiX1wiKSwga2V5ID0gbmFtZTtcbiAgICBsZXQga25vd24gPSBieVRhZ1trZXldO1xuICAgIGlmIChrbm93bilcbiAgICAgICAgcmV0dXJuIGtub3duLmlkO1xuICAgIGxldCB0eXBlID0gYnlUYWdba2V5XSA9IE5vZGVUeXBlLmRlZmluZSh7XG4gICAgICAgIGlkOiB0eXBlQXJyYXkubGVuZ3RoLFxuICAgICAgICBuYW1lLFxuICAgICAgICBwcm9wczogW2xpbmVNb2RlID8gbGluZUNsYXNzTm9kZVByb3AuYWRkKHsgW25hbWVdOiB0YWdTdHIgfSkgOiB0b2tlbkNsYXNzTm9kZVByb3AuYWRkKHsgW25hbWVdOiB0YWdTdHIgfSldXG4gICAgfSk7XG4gICAgdHlwZUFycmF5LnB1c2godHlwZSk7XG4gICAgcmV0dXJuIHR5cGUuaWQ7XG59XG5mdW5jdGlvbiBkb2NJRChkYXRhLCBsYW5nKSB7XG4gICAgbGV0IHR5cGUgPSBOb2RlVHlwZS5kZWZpbmUoeyBpZDogdHlwZUFycmF5Lmxlbmd0aCwgbmFtZTogXCJEb2N1bWVudFwiLCBwcm9wczogW1xuICAgICAgICAgICAgbGFuZ3VhZ2VEYXRhUHJvcC5hZGQoKCkgPT4gZGF0YSksXG4gICAgICAgICAgICBpbmRlbnROb2RlUHJvcC5hZGQoKCkgPT4gY3ggPT4gbGFuZy5nZXRJbmRlbnQoY3gpKVxuICAgICAgICBdLCB0b3A6IHRydWUgfSk7XG4gICAgdHlwZUFycmF5LnB1c2godHlwZSk7XG4gICAgcmV0dXJuIHR5cGU7XG59XG4vLyBUaGUgTm9kZVByb3AgdGhhdCBob2xkcyB0aGUgY3NzIGNsYXNzIHdlIHdhbnQgdG8gYXBwbHlcbmNvbnN0IHRva2VuQ2xhc3NOb2RlUHJvcCA9IC8qQF9fUFVSRV9fKi9uZXcgTm9kZVByb3AoKTtcbmNvbnN0IGxpbmVDbGFzc05vZGVQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuY2xhc3MgTGluZUhpZ2hsaWdodGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMubGluZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy50b2tlbkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy50cmVlID0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvKHZpZXcpO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCB0cmVlID0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpO1xuICAgICAgICBpZiAodHJlZS5sZW5ndGggPCB1cGRhdGUudmlldy52aWV3cG9ydC50byB8fCB1cGRhdGUudmlldy5jb21wb3NpdGlvblN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRpb25zLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJlZSAhPSB0aGlzLnRyZWUgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmJ1aWxkRGVjbyh1cGRhdGUudmlldyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnVpbGREZWNvKHZpZXcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRyZWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgbGV0IHNwZWxsY2hlY2tJZ25vcmVUb2tlbnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgc3RyIG9mIHZpZXcuc3RhdGUuZmFjZXQoaWdub3JlU3BlbGxjaGVja1Rva2VuKSkge1xuICAgICAgICAgICAgc3BlbGxjaGVja0lnbm9yZVRva2Vucy5wdXNoKC4uLnN0ci5zcGxpdCgnICcpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3BlbGxDaGVja0lnbm9yZVNldCA9IG5ldyBTZXQoc3BlbGxjaGVja0lnbm9yZVRva2Vucyk7XG4gICAgICAgIGxldCBoYXNTcGVsbGNoZWNrSWdub3JlVG9rZW5zID0gc3BlbGxDaGVja0lnbm9yZVNldC5zaXplID4gMDtcbiAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgICAgIGxldCBsYXN0UG9zID0gMDtcbiAgICAgICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHZpZXcudmlzaWJsZVJhbmdlcykge1xuICAgICAgICAgICAgdGhpcy50cmVlLml0ZXJhdGUoe1xuICAgICAgICAgICAgICAgIGZyb20sIHRvLFxuICAgICAgICAgICAgICAgIGVudGVyOiAoeyB0eXBlLCBmcm9tLCB0byB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5lU3R5bGUgPSB0eXBlLnByb3AobGluZUNsYXNzTm9kZVByb3ApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGluZVN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZURlY28gPSB0aGlzLmxpbmVDYWNoZVtsaW5lU3R5bGVdIHx8ICh0aGlzLmxpbmVDYWNoZVtsaW5lU3R5bGVdID0gRGVjb3JhdGlvbi5saW5lKHsgYXR0cmlidXRlczogeyBjbGFzczogbGluZVN0eWxlIH0gfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0Zyb20gPSB2aWV3LmxpbmVCbG9ja0F0KGZyb20pLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgbGluZSBtb2RlcyB0aGF0IHN0YXJ0IGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgbGluZSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFBvcyA+IG5ld0Zyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChuZXdGcm9tLCBuZXdGcm9tLCBsaW5lRGVjbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0UG9zID0gbmV3RnJvbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgdG9rZW5TdHlsZSA9IHR5cGUucHJvcCh0b2tlbkNsYXNzTm9kZVByb3ApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5TdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQb3MgPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmVEZWNvID0gdGhpcy50b2tlbkNhY2hlW3Rva2VuU3R5bGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lRGVjbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b2tlbnMgPSB0b2tlblN0eWxlLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwZWMgPSB7IGNsYXNzOiB0b2tlbnMubWFwKGMgPT4gJ2NtLScgKyBjKS5qb2luKCcgJykgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzU3BlbGxjaGVja0lnbm9yZVRva2VucyAmJiB0b2tlbnMuc29tZSh0b2tlbiA9PiBzcGVsbENoZWNrSWdub3JlU2V0Lmhhcyh0b2tlbikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWMuYXR0cmlidXRlcyA9IHsgc3BlbGxjaGVjazogJ2ZhbHNlJyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lRGVjbyA9IHRoaXMudG9rZW5DYWNoZVt0b2tlblN0eWxlXSA9IERlY29yYXRpb24ubWFyayhzcGVjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKGZyb20sIHRvLCBsaW5lRGVjbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0UG9zID0gdG87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcbiAgICB9XG59XG4vLyBUaGlzIGV4dGVuc2lvbiBpbnN0YWxscyBhIGhpZ2hsaWdodGVyIHRoYXQgaGlnaGxpZ2h0cyBsaW5lcyBiYXNlZCBvbiB0aGUgbm9kZSBwcm9wIGFib3ZlXG5jb25zdCBsaW5lSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovUHJlYy5sb3dlc3QoLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZGVmaW5lKHZpZXcgPT4gbmV3IExpbmVIaWdobGlnaHRlcih2aWV3KSwge1xuICAgIGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnNcbn0pKTtcbmNvbnN0IGlnbm9yZVNwZWxsY2hlY2tUb2tlbiA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe30pO1xuXG5mdW5jdGlvbiBidWlsZEZvckxpbmUobGluZSkge1xuICAgIHJldHVybiBsaW5lLmxlbmd0aCA8PSA0MDk2ICYmIC9bXFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MDcwMC1cXHUwOGFjXFx1ZmI1MC1cXHVmZGZmXS8udGVzdChsaW5lKTtcbn1cbmZ1bmN0aW9uIHRleHRIYXNSVEwodGV4dCkge1xuICAgIGZvciAobGV0IGkgPSB0ZXh0Lml0ZXIoKTsgIWkubmV4dCgpLmRvbmU7KVxuICAgICAgICBpZiAoYnVpbGRGb3JMaW5lKGkudmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY2hhbmdlQWRkc1JUTChjaGFuZ2UpIHtcbiAgICBsZXQgYWRkZWQgPSBmYWxzZTtcbiAgICBjaGFuZ2UuaXRlckNoYW5nZXMoKGZBLCB0QSwgZkIsIHRCLCBpbnMpID0+IHtcbiAgICAgICAgaWYgKCFhZGRlZCAmJiB0ZXh0SGFzUlRMKGlucykpXG4gICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFkZGVkO1xufVxuY29uc3QgYWx3YXlzSXNvbGF0ZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KSB9KTtcbi8qKlxuTWFrZSBzdXJlIG5vZGVzXG5bbWFya2VkXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tb24uTm9kZVByb3BeaXNvbGF0ZSlcbmFzIGlzb2xhdGluZyBmb3IgYmlkaXJlY3Rpb25hbCB0ZXh0IGFyZSByZW5kZXJlZCBpbiBhIHdheSB0aGF0XG5pc29sYXRlcyB0aGVtIGZyb20gdGhlIHN1cnJvdW5kaW5nIHRleHQuXG4qL1xuZnVuY3Rpb24gYmlkaUlzb2xhdGVzKG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBleHRlbnNpb25zID0gW2lzb2xhdGVNYXJrc107XG4gICAgaWYgKG9wdGlvbnMuYWx3YXlzSXNvbGF0ZSlcbiAgICAgICAgZXh0ZW5zaW9ucy5wdXNoKGFsd2F5c0lzb2xhdGUub2YodHJ1ZSkpO1xuICAgIHJldHVybiBleHRlbnNpb25zO1xufVxuY29uc3QgaXNvbGF0ZU1hcmtzID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMuYWx3YXlzID0gdmlldy5zdGF0ZS5mYWNldChhbHdheXNJc29sYXRlKSB8fFxuICAgICAgICAgICAgdmlldy50ZXh0RGlyZWN0aW9uICE9IERpcmVjdGlvbi5MVFIgfHxcbiAgICAgICAgICAgIHZpZXcuc3RhdGUuZmFjZXQoRWRpdG9yVmlldy5wZXJMaW5lVGV4dERpcmVjdGlvbik7XG4gICAgICAgIHRoaXMuaGFzUlRMID0gIXRoaXMuYWx3YXlzICYmIHRleHRIYXNSVEwodmlldy5zdGF0ZS5kb2MpO1xuICAgICAgICB0aGlzLnRyZWUgPSBzeW50YXhUcmVlKHZpZXcuc3RhdGUpO1xuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5hbHdheXMgfHwgdGhpcy5oYXNSVEwgPyBidWlsZERlY28odmlldywgdGhpcy50cmVlLCB0aGlzLmFsd2F5cykgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IGFsd2F5cyA9IHVwZGF0ZS5zdGF0ZS5mYWNldChhbHdheXNJc29sYXRlKSB8fFxuICAgICAgICAgICAgdXBkYXRlLnZpZXcudGV4dERpcmVjdGlvbiAhPSBEaXJlY3Rpb24uTFRSIHx8XG4gICAgICAgICAgICB1cGRhdGUuc3RhdGUuZmFjZXQoRWRpdG9yVmlldy5wZXJMaW5lVGV4dERpcmVjdGlvbik7XG4gICAgICAgIGlmICghYWx3YXlzICYmICF0aGlzLmhhc1JUTCAmJiBjaGFuZ2VBZGRzUlRMKHVwZGF0ZS5jaGFuZ2VzKSlcbiAgICAgICAgICAgIHRoaXMuaGFzUlRMID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFhbHdheXMgJiYgIXRoaXMuaGFzUlRMKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgdHJlZSA9IHN5bnRheFRyZWUodXBkYXRlLnN0YXRlKTtcbiAgICAgICAgaWYgKGFsd2F5cyAhPSB0aGlzLmFsd2F5cyB8fCB0cmVlICE9IHRoaXMudHJlZSB8fCB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUudmlld3BvcnRDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICAgICAgdGhpcy5hbHdheXMgPSBhbHdheXM7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gYnVpbGREZWNvKHVwZGF0ZS52aWV3LCB0cmVlLCBhbHdheXMpO1xuICAgICAgICB9XG4gICAgfVxufSwge1xuICAgIHByb3ZpZGU6IHBsdWdpbiA9PiB7XG4gICAgICAgIGZ1bmN0aW9uIGFjY2Vzcyh2aWV3KSB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHZpZXcucGx1Z2luKHBsdWdpbikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWNvcmF0aW9ucykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbRWRpdG9yVmlldy5vdXRlckRlY29yYXRpb25zLm9mKGFjY2VzcyksXG4gICAgICAgICAgICBQcmVjLmxvd2VzdChFZGl0b3JWaWV3LmJpZGlJc29sYXRlZFJhbmdlcy5vZihhY2Nlc3MpKV07XG4gICAgfVxufSk7XG5mdW5jdGlvbiBidWlsZERlY28odmlldywgdHJlZSwgYWx3YXlzKSB7XG4gICAgbGV0IGRlY28gPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgbGV0IHJhbmdlcyA9IHZpZXcudmlzaWJsZVJhbmdlcztcbiAgICBpZiAoIWFsd2F5cylcbiAgICAgICAgcmFuZ2VzID0gY2xpcFJUTExpbmVzKHJhbmdlcywgdmlldy5zdGF0ZS5kb2MpO1xuICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiByYW5nZXMpIHtcbiAgICAgICAgdHJlZS5pdGVyYXRlKHtcbiAgICAgICAgICAgIGVudGVyOiBub2RlID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaXNvID0gbm9kZS50eXBlLnByb3AoTm9kZVByb3AuaXNvbGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzbylcbiAgICAgICAgICAgICAgICAgICAgZGVjby5hZGQobm9kZS5mcm9tLCBub2RlLnRvLCBtYXJrc1tpc29dKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmcm9tLCB0b1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY28uZmluaXNoKCk7XG59XG5mdW5jdGlvbiBjbGlwUlRMTGluZXMocmFuZ2VzLCBkb2MpIHtcbiAgICBsZXQgY3VyID0gZG9jLml0ZXIoKSwgcG9zID0gMCwgcmVzdWx0ID0gW10sIGxhc3QgPSBudWxsO1xuICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiByYW5nZXMpIHtcbiAgICAgICAgaWYgKGxhc3QgJiYgbGFzdC50byA+IGZyb20pIHtcbiAgICAgICAgICAgIGZyb20gPSBsYXN0LnRvO1xuICAgICAgICAgICAgaWYgKGZyb20gPj0gdG8pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyArIGN1ci52YWx1ZS5sZW5ndGggPCBmcm9tKSB7XG4gICAgICAgICAgICBjdXIubmV4dChmcm9tIC0gKHBvcyArIGN1ci52YWx1ZS5sZW5ndGgpKTtcbiAgICAgICAgICAgIHBvcyA9IGZyb207XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gcG9zLCBlbmQgPSBwb3MgKyBjdXIudmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKCFjdXIubGluZUJyZWFrICYmIGJ1aWxkRm9yTGluZShjdXIudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QgJiYgbGFzdC50byA+IHN0YXJ0IC0gMTApXG4gICAgICAgICAgICAgICAgICAgIGxhc3QudG8gPSBNYXRoLm1pbih0bywgZW5kKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGxhc3QgPSB7IGZyb206IHN0YXJ0LCB0bzogTWF0aC5taW4odG8sIGVuZCkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kID49IHRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICAgICAgY3VyLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgbWFya3MgPSB7XG4gICAgcnRsOiAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20taXNvXCIsIGluY2x1c2l2ZTogdHJ1ZSwgYXR0cmlidXRlczogeyBkaXI6IFwicnRsXCIgfSwgYmlkaUlzb2xhdGU6IERpcmVjdGlvbi5SVEwgfSksXG4gICAgbHRyOiAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5tYXJrKHsgY2xhc3M6IFwiY20taXNvXCIsIGluY2x1c2l2ZTogdHJ1ZSwgYXR0cmlidXRlczogeyBkaXI6IFwibHRyXCIgfSwgYmlkaUlzb2xhdGU6IERpcmVjdGlvbi5MVFIgfSksXG4gICAgYXV0bzogLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLWlzb1wiLCBpbmNsdXNpdmU6IHRydWUsIGF0dHJpYnV0ZXM6IHsgZGlyOiBcImF1dG9cIiB9LCBiaWRpSXNvbGF0ZTogbnVsbCB9KVxufTtcblxuZXhwb3J0IHsgRG9jSW5wdXQsIEhpZ2hsaWdodFN0eWxlLCBJbmRlbnRDb250ZXh0LCBMUkxhbmd1YWdlLCBMYW5ndWFnZSwgTGFuZ3VhZ2VEZXNjcmlwdGlvbiwgTGFuZ3VhZ2VTdXBwb3J0LCBQYXJzZUNvbnRleHQsIFN0cmVhbUxhbmd1YWdlLCBTdHJpbmdTdHJlYW0sIFRyZWVJbmRlbnRDb250ZXh0LCBiaWRpSXNvbGF0ZXMsIGJyYWNrZXRNYXRjaGluZywgYnJhY2tldE1hdGNoaW5nSGFuZGxlLCBjb2RlRm9sZGluZywgY29udGludWVkSW5kZW50LCBkZWZhdWx0SGlnaGxpZ2h0U3R5bGUsIGRlZmluZUxhbmd1YWdlRmFjZXQsIGRlbGltaXRlZEluZGVudCwgZW5zdXJlU3ludGF4VHJlZSwgZmxhdEluZGVudCwgZm9sZEFsbCwgZm9sZENvZGUsIGZvbGRFZmZlY3QsIGZvbGRHdXR0ZXIsIGZvbGRJbnNpZGUsIGZvbGRLZXltYXAsIGZvbGROb2RlUHJvcCwgZm9sZFNlcnZpY2UsIGZvbGRTdGF0ZSwgZm9sZGFibGUsIGZvbGRlZFJhbmdlcywgZm9yY2VQYXJzaW5nLCBnZXRJbmRlbnRVbml0LCBnZXRJbmRlbnRhdGlvbiwgaGlnaGxpZ2h0aW5nRm9yLCBpZ25vcmVTcGVsbGNoZWNrVG9rZW4sIGluZGVudE5vZGVQcm9wLCBpbmRlbnRPbklucHV0LCBpbmRlbnRSYW5nZSwgaW5kZW50U2VydmljZSwgaW5kZW50U3RyaW5nLCBpbmRlbnRVbml0LCBsYW5ndWFnZSwgbGFuZ3VhZ2VEYXRhUHJvcCwgbGluZUNsYXNzTm9kZVByb3AsIGxpbmVIaWdobGlnaHRlciwgbWF0Y2hCcmFja2V0cywgc3VibGFuZ3VhZ2VQcm9wLCBzeW50YXhIaWdobGlnaHRpbmcsIHN5bnRheFBhcnNlclJ1bm5pbmcsIHN5bnRheFRyZWUsIHN5bnRheFRyZWVBdmFpbGFibGUsIHRvZ2dsZUZvbGQsIHRva2VuQ2xhc3NOb2RlUHJvcCwgdW5mb2xkQWxsLCB1bmZvbGRDb2RlLCB1bmZvbGRFZmZlY3QgfTtcbiIsICJpbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgdHlwZSBQbHVnaW5TZXR0aW5ncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgbmFtZXNwYWNlIENPTU1FTlRBVE9SX0dMT0JBTCB7XG5cdC8qKlxuXHQgKiBUcmFkaW5nIG9uZSBnbG9iYWwgZm9yIGFuIGFkbWl0dGVkbHkgd29yc2UgZ2xvYmFsXG5cdCAqIFBhc3NpbmcgdGhlIEFwcCBpbnN0YW5jZSB0byBDTSBwbHVnaW5zIGlzIGp1c3QgYSBtYWpvciBQaXRBXG5cdCAqL1xuXHRleHBvcnQgbGV0IGFwcDogQXBwO1xuXHRleHBvcnQgbGV0IFBMVUdJTl9TRVRUSU5HUzogUGx1Z2luU2V0dGluZ3M7XG59XG4iLCAiaW1wb3J0IHsgQ29tcGFydG1lbnQsIEZhY2V0LCBTdGF0ZUVmZmVjdCwgU3RhdGVFZmZlY3RUeXBlLCBTdGF0ZUZpZWxkIH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgeyBFZGl0TW9kZSwgUHJldmlld01vZGUgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBQcm92aWRlIGEgU3RhdGVGaWVsZCBleHRlbnNpb24gZm9yIGFuIGFyYml0cmFyeSB2YWx1ZSB0aGF0IGNhbiBiZSB1cGRhdGVkIHZpYSBlZmZlY3RzXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgZmllbGRcbiAqIEBwYXJhbSBlZmZlY3QgLSBFZmZlY3QgdG8gdXBkYXRlIHRoZSB2YWx1ZSBvblxuICogQHJlbWFyayBVc2luZyBpbXBsZW1lbnRhdGlvbiBmcm9tIE9ic2lkaWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hWYWx1ZTxUPih2YWx1ZTogVCwgZWZmZWN0OiBTdGF0ZUVmZmVjdFR5cGU8VD4pIHtcblx0Y29uc3QgZmllbGQ6IFN0YXRlRmllbGQ8VD4gPSBTdGF0ZUZpZWxkLmRlZmluZSh7XG5cdFx0Y3JlYXRlKCkge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH0sXG5cblx0XHR1cGRhdGUoZSwgbikge1xuXHRcdFx0Zm9yIChjb25zdCBjdXJyX2VmZmVjdCBvZiBuLmVmZmVjdHMpIHtcblx0XHRcdFx0aWYgKGN1cnJfZWZmZWN0LmlzKGVmZmVjdCkpXG5cdFx0XHRcdFx0cmV0dXJuIGN1cnJfZWZmZWN0LnZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH0sXG5cdH0pO1xuXG5cdHJldHVybiBmaWVsZDtcbn1cblxuZXhwb3J0IGNvbnN0IGhpZGVFbXB0eUFubm90YXRpb25HdXR0ZXJTdGF0ZSA9IEZhY2V0LmRlZmluZTxib29sZWFuLCBib29sZWFuPih7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXNbMF0gfSk7XG5leHBvcnQgY29uc3QgaGlkZUVtcHR5QW5ub3RhdGlvbkd1dHRlciA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckZvbGRCdXR0b25TdGF0ZSA9IEZhY2V0LmRlZmluZTxib29sZWFuLCBib29sZWFuPih7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXNbMF0gfSk7XG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckZvbGRCdXR0b24gPSBuZXcgQ29tcGFydG1lbnQoKTtcblxuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJSZXNpemVIYW5kbGVTdGF0ZSA9IEZhY2V0LmRlZmluZTxib29sZWFuLCBib29sZWFuPih7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXNbMF0gfSk7XG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlclJlc2l6ZUhhbmRsZSA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5cbmV4cG9ydCBjb25zdCBhbm5vdGF0aW9uR3V0dGVyV2lkdGhTdGF0ZSA9IEZhY2V0LmRlZmluZTxudW1iZXIsIG51bWJlcj4oeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzWzBdIH0pO1xuZXhwb3J0IGNvbnN0IGFubm90YXRpb25HdXR0ZXJXaWR0aCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckZvbGRlZFN0YXRlID0gRmFjZXQuZGVmaW5lPGJvb2xlYW4sIGJvb2xlYW4+KHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlc1swXSB9KTtcbmV4cG9ydCBjb25zdCBhbm5vdGF0aW9uR3V0dGVyRm9sZGVkID0gbmV3IENvbXBhcnRtZW50KCk7XG5cbmV4cG9ydCBjb25zdCBhbm5vdGF0aW9uR3V0dGVySW5jbHVkZWRUeXBlc1N0YXRlID0gRmFjZXQuZGVmaW5lPG51bWJlciwgbnVtYmVyPih7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXNbMF0gfSk7XG5leHBvcnQgY29uc3QgYW5ub3RhdGlvbkd1dHRlckluY2x1ZGVkVHlwZXMgPSBuZXcgQ29tcGFydG1lbnQoKTtcblxuZXhwb3J0IGNvbnN0IGhpZGVFbXB0eURpZmZHdXR0ZXJTdGF0ZSA9IEZhY2V0LmRlZmluZTxib29sZWFuLCBib29sZWFuPih7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXNbMF0gfSk7XG5leHBvcnQgY29uc3QgaGlkZUVtcHR5RGlmZkd1dHRlciA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5leHBvcnQgY29uc3QgcHJldmlld01vZGVTdGF0ZSA9IEZhY2V0LmRlZmluZTxQcmV2aWV3TW9kZSwgUHJldmlld01vZGU+KHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlc1swXSB9KTtcbmV4cG9ydCBjb25zdCBwcmV2aWV3TW9kZSA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5leHBvcnQgY29uc3QgZWRpdE1vZGVWYWx1ZVN0YXRlID0gRmFjZXQuZGVmaW5lPEVkaXRNb2RlLCBFZGl0TW9kZT4oeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzWzBdIH0pO1xuZXhwb3J0IGNvbnN0IGVkaXRNb2RlVmFsdWUgPSBuZXcgQ29tcGFydG1lbnQoKTtcbmV4cG9ydCBjb25zdCBlZGl0TW9kZSA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG5leHBvcnQgY29uc3QgZnVsbFJlbG9hZEVmZmVjdCA9IFN0YXRlRWZmZWN0LmRlZmluZTxib29sZWFuPigpO1xuIiwgIi8qKlxuVGhlIGRlZmF1bHQgbWF4aW11bSBsZW5ndGggb2YgYSBgVHJlZUJ1ZmZlcmAgbm9kZS5cbiovXG5jb25zdCBEZWZhdWx0QnVmZmVyTGVuZ3RoID0gMTAyNDtcbmxldCBuZXh0UHJvcElEID0gMDtcbmNsYXNzIFJhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bykge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgfVxufVxuLyoqXG5FYWNoIFtub2RlIHR5cGVdKCNjb21tb24uTm9kZVR5cGUpIG9yIFtpbmRpdmlkdWFsIHRyZWVdKCNjb21tb24uVHJlZSlcbmNhbiBoYXZlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdCBpbiBwcm9wcy4gSW5zdGFuY2VzIG9mIHRoaXNcbmNsYXNzIHJlcHJlc2VudCBwcm9wIG5hbWVzLlxuKi9cbmNsYXNzIE5vZGVQcm9wIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgbm9kZSBwcm9wIHR5cGUuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcgPSB7fSkge1xuICAgICAgICB0aGlzLmlkID0gbmV4dFByb3BJRCsrO1xuICAgICAgICB0aGlzLnBlck5vZGUgPSAhIWNvbmZpZy5wZXJOb2RlO1xuICAgICAgICB0aGlzLmRlc2VyaWFsaXplID0gY29uZmlnLmRlc2VyaWFsaXplIHx8ICgoKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG5vZGUgdHlwZSBkb2Vzbid0IGRlZmluZSBhIGRlc2VyaWFsaXplIGZ1bmN0aW9uXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhpcyBpcyBtZWFudCB0byBiZSB1c2VkIHdpdGhcbiAgICBbYE5vZGVTZXQuZXh0ZW5kYF0oI2NvbW1vbi5Ob2RlU2V0LmV4dGVuZCkgb3JcbiAgICBbYExSUGFyc2VyLmNvbmZpZ3VyZWBdKCNsci5QYXJzZXJDb25maWcucHJvcHMpIHRvIGNvbXB1dGVcbiAgICBwcm9wIHZhbHVlcyBmb3IgZWFjaCBub2RlIHR5cGUgaW4gdGhlIHNldC4gVGFrZXMgYSBbbWF0Y2hcbiAgICBvYmplY3RdKCNjb21tb24uTm9kZVR5cGVebWF0Y2gpIG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB1bmRlZmluZWRcbiAgICBpZiB0aGUgbm9kZSB0eXBlIGRvZXNuJ3QgZ2V0IHRoaXMgcHJvcCwgYW5kIHRoZSBwcm9wJ3MgdmFsdWUgaWZcbiAgICBpdCBkb2VzLlxuICAgICovXG4gICAgYWRkKG1hdGNoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlck5vZGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNhbid0IGFkZCBwZXItbm9kZSBwcm9wcyB0byBub2RlIHR5cGVzXCIpO1xuICAgICAgICBpZiAodHlwZW9mIG1hdGNoICE9IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIG1hdGNoID0gTm9kZVR5cGUubWF0Y2gobWF0Y2gpO1xuICAgICAgICByZXR1cm4gKHR5cGUpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBtYXRjaCh0eXBlKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBbdGhpcywgcmVzdWx0XTtcbiAgICAgICAgfTtcbiAgICB9XG59XG4vKipcblByb3AgdGhhdCBpcyB1c2VkIHRvIGRlc2NyaWJlIG1hdGNoaW5nIGRlbGltaXRlcnMuIEZvciBvcGVuaW5nXG5kZWxpbWl0ZXJzLCB0aGlzIGhvbGRzIGFuIGFycmF5IG9mIG5vZGUgbmFtZXMgKHdyaXR0ZW4gYXMgYVxuc3BhY2Utc2VwYXJhdGVkIHN0cmluZyB3aGVuIGRlY2xhcmluZyB0aGlzIHByb3AgaW4gYSBncmFtbWFyKVxuZm9yIHRoZSBub2RlIHR5cGVzIG9mIGNsb3NpbmcgZGVsaW1pdGVycyB0aGF0IG1hdGNoIGl0LlxuKi9cbk5vZGVQcm9wLmNsb3NlZEJ5ID0gbmV3IE5vZGVQcm9wKHsgZGVzZXJpYWxpemU6IHN0ciA9PiBzdHIuc3BsaXQoXCIgXCIpIH0pO1xuLyoqXG5UaGUgaW52ZXJzZSBvZiBbYGNsb3NlZEJ5YF0oI2NvbW1vbi5Ob2RlUHJvcF5jbG9zZWRCeSkuIFRoaXMgaXNcbmF0dGFjaGVkIHRvIGNsb3NpbmcgZGVsaW1pdGVycywgaG9sZGluZyBhbiBhcnJheSBvZiBub2RlIG5hbWVzXG5vZiB0eXBlcyBvZiBtYXRjaGluZyBvcGVuaW5nIGRlbGltaXRlcnMuXG4qL1xuTm9kZVByb3Aub3BlbmVkQnkgPSBuZXcgTm9kZVByb3AoeyBkZXNlcmlhbGl6ZTogc3RyID0+IHN0ci5zcGxpdChcIiBcIikgfSk7XG4vKipcblVzZWQgdG8gYXNzaWduIG5vZGUgdHlwZXMgdG8gZ3JvdXBzIChmb3IgZXhhbXBsZSwgYWxsIG5vZGVcbnR5cGVzIHRoYXQgcmVwcmVzZW50IGFuIGV4cHJlc3Npb24gY291bGQgYmUgdGFnZ2VkIHdpdGggYW5cbmBcIkV4cHJlc3Npb25cImAgZ3JvdXApLlxuKi9cbk5vZGVQcm9wLmdyb3VwID0gbmV3IE5vZGVQcm9wKHsgZGVzZXJpYWxpemU6IHN0ciA9PiBzdHIuc3BsaXQoXCIgXCIpIH0pO1xuLyoqXG5BdHRhY2hlZCB0byBub2RlcyB0byBpbmRpY2F0ZSB0aGVzZSBzaG91bGQgYmVcbltkaXNwbGF5ZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvZG9jcy9yZWYvI2xhbmd1YWdlLnN5bnRheFRyZWUpXG5pbiBhIGJpZGlyZWN0aW9uYWwgdGV4dCBpc29sYXRlLCBzbyB0aGF0IGRpcmVjdGlvbi1uZXV0cmFsXG5jaGFyYWN0ZXJzIG9uIHRoZWlyIHNpZGVzIGRvbid0IGluY29ycmVjdGx5IGdldCBhc3NvY2lhdGVkIHdpdGhcbnN1cnJvdW5kaW5nIHRleHQuIFlvdSdsbCBnZW5lcmFsbHkgd2FudCB0byBzZXQgdGhpcyBmb3Igbm9kZXNcbnRoYXQgY29udGFpbiBhcmJpdHJhcnkgdGV4dCwgbGlrZSBzdHJpbmdzIGFuZCBjb21tZW50cywgYW5kIGZvclxubm9kZXMgdGhhdCBhcHBlYXIgX2luc2lkZV8gYXJiaXRyYXJ5IHRleHQsIGxpa2UgSFRNTCB0YWdzLiBXaGVuXG5ub3QgZ2l2ZW4gYSB2YWx1ZSwgaW4gYSBncmFtbWFyIGRlY2xhcmF0aW9uLCBkZWZhdWx0cyB0b1xuYFwiYXV0b1wiYC5cbiovXG5Ob2RlUHJvcC5pc29sYXRlID0gbmV3IE5vZGVQcm9wKHsgZGVzZXJpYWxpemU6IHZhbHVlID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlICE9IFwicnRsXCIgJiYgdmFsdWUgIT0gXCJsdHJcIiAmJiB2YWx1ZSAhPSBcImF1dG9cIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB2YWx1ZSBmb3IgaXNvbGF0ZTogXCIgKyB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZSB8fCBcImF1dG9cIjtcbiAgICB9IH0pO1xuLyoqXG5UaGUgaGFzaCBvZiB0aGUgW2NvbnRleHRdKCNsci5Db250ZXh0VHJhY2tlci5jb25zdHJ1Y3RvcilcbnRoYXQgdGhlIG5vZGUgd2FzIHBhcnNlZCBpbiwgaWYgYW55LiBVc2VkIHRvIGxpbWl0IHJldXNlIG9mXG5jb250ZXh0dWFsIG5vZGVzLlxuKi9cbk5vZGVQcm9wLmNvbnRleHRIYXNoID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbi8qKlxuVGhlIGRpc3RhbmNlIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBub2RlIHRoYXQgdGhlIHRva2VuaXplclxubG9va2VkIGFoZWFkIGZvciBhbnkgb2YgdGhlIHRva2VucyBpbnNpZGUgdGhlIG5vZGUuIChUaGUgTFJcbnBhcnNlciBvbmx5IHN0b3JlcyB0aGlzIHdoZW4gaXQgaXMgbGFyZ2VyIHRoYW4gMjUsIGZvclxuZWZmaWNpZW5jeSByZWFzb25zLilcbiovXG5Ob2RlUHJvcC5sb29rQWhlYWQgPSBuZXcgTm9kZVByb3AoeyBwZXJOb2RlOiB0cnVlIH0pO1xuLyoqXG5UaGlzIHBlci1ub2RlIHByb3AgaXMgdXNlZCB0byByZXBsYWNlIGEgZ2l2ZW4gbm9kZSwgb3IgcGFydCBvZiBhXG5ub2RlLCB3aXRoIGFub3RoZXIgdHJlZS4gVGhpcyBpcyB1c2VmdWwgdG8gaW5jbHVkZSB0cmVlcyBmcm9tXG5kaWZmZXJlbnQgbGFuZ3VhZ2VzIGluIG1peGVkLWxhbmd1YWdlIHBhcnNlcnMuXG4qL1xuTm9kZVByb3AubW91bnRlZCA9IG5ldyBOb2RlUHJvcCh7IHBlck5vZGU6IHRydWUgfSk7XG4vKipcbkEgbW91bnRlZCB0cmVlLCB3aGljaCBjYW4gYmUgW3N0b3JlZF0oI2NvbW1vbi5Ob2RlUHJvcF5tb3VudGVkKSBvblxuYSB0cmVlIG5vZGUgdG8gaW5kaWNhdGUgdGhhdCBwYXJ0cyBvZiBpdHMgY29udGVudCBhcmVcbnJlcHJlc2VudGVkIGJ5IGFub3RoZXIgdHJlZS5cbiovXG5jbGFzcyBNb3VudGVkVHJlZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGlubmVyIHRyZWUuXG4gICAgKi9cbiAgICB0cmVlLCBcbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIG51bGwsIHRoaXMgdHJlZSByZXBsYWNlcyB0aGUgZW50aXJlIG5vZGUgKGl0IHdpbGxcbiAgICBiZSBpbmNsdWRlZCBpbiB0aGUgcmVndWxhciBpdGVyYXRpb24gaW5zdGVhZCBvZiBpdHMgaG9zdFxuICAgIG5vZGUpLiBJZiBub3QsIG9ubHkgdGhlIGdpdmVuIHJhbmdlcyBhcmUgY29uc2lkZXJlZCB0byBiZVxuICAgIGNvdmVyZWQgYnkgdGhpcyB0cmVlLiBUaGlzIGlzIHVzZWQgZm9yIHRyZWVzIHRoYXQgYXJlIG1peGVkIGluXG4gICAgYSB3YXkgdGhhdCBpc24ndCBzdHJpY3RseSBoaWVyYXJjaGljYWwuIFN1Y2ggbW91bnRlZCB0cmVlcyBhcmVcbiAgICBvbmx5IGVudGVyZWQgYnkgW2ByZXNvbHZlSW5uZXJgXSgjY29tbW9uLlRyZWUucmVzb2x2ZUlubmVyKVxuICAgIGFuZCBbYGVudGVyYF0oI2NvbW1vbi5TeW50YXhOb2RlLmVudGVyKS5cbiAgICAqL1xuICAgIG92ZXJsYXksIFxuICAgIC8qKlxuICAgIFRoZSBwYXJzZXIgdXNlZCB0byBjcmVhdGUgdGhpcyBzdWJ0cmVlLlxuICAgICovXG4gICAgcGFyc2VyKSB7XG4gICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG92ZXJsYXk7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBnZXQodHJlZSkge1xuICAgICAgICByZXR1cm4gdHJlZSAmJiB0cmVlLnByb3BzICYmIHRyZWUucHJvcHNbTm9kZVByb3AubW91bnRlZC5pZF07XG4gICAgfVxufVxuY29uc3Qgbm9Qcm9wcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKipcbkVhY2ggbm9kZSBpbiBhIHN5bnRheCB0cmVlIGhhcyBhIG5vZGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggaXQuXG4qL1xuY2xhc3MgTm9kZVR5cGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5hbWUgb2YgdGhlIG5vZGUgdHlwZS4gTm90IG5lY2Vzc2FyaWx5IHVuaXF1ZSwgYnV0IGlmIHRoZVxuICAgIGdyYW1tYXIgd2FzIHdyaXR0ZW4gcHJvcGVybHksIGRpZmZlcmVudCBub2RlIHR5cGVzIHdpdGggdGhlXG4gICAgc2FtZSBuYW1lIHdpdGhpbiBhIG5vZGUgc2V0IHNob3VsZCBwbGF5IHRoZSBzYW1lIHNlbWFudGljXG4gICAgcm9sZS5cbiAgICAqL1xuICAgIG5hbWUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHJvcHMsIFxuICAgIC8qKlxuICAgIFRoZSBpZCBvZiB0aGlzIG5vZGUgaW4gaXRzIHNldC4gQ29ycmVzcG9uZHMgdG8gdGhlIHRlcm0gaWRzXG4gICAgdXNlZCBpbiB0aGUgcGFyc2VyLlxuICAgICovXG4gICAgaWQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZmxhZ3MgPSAwKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIG5vZGUgdHlwZS5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlYykge1xuICAgICAgICBsZXQgcHJvcHMgPSBzcGVjLnByb3BzICYmIHNwZWMucHJvcHMubGVuZ3RoID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IG5vUHJvcHM7XG4gICAgICAgIGxldCBmbGFncyA9IChzcGVjLnRvcCA/IDEgLyogTm9kZUZsYWcuVG9wICovIDogMCkgfCAoc3BlYy5za2lwcGVkID8gMiAvKiBOb2RlRmxhZy5Ta2lwcGVkICovIDogMCkgfFxuICAgICAgICAgICAgKHNwZWMuZXJyb3IgPyA0IC8qIE5vZGVGbGFnLkVycm9yICovIDogMCkgfCAoc3BlYy5uYW1lID09IG51bGwgPyA4IC8qIE5vZGVGbGFnLkFub255bW91cyAqLyA6IDApO1xuICAgICAgICBsZXQgdHlwZSA9IG5ldyBOb2RlVHlwZShzcGVjLm5hbWUgfHwgXCJcIiwgcHJvcHMsIHNwZWMuaWQsIGZsYWdzKTtcbiAgICAgICAgaWYgKHNwZWMucHJvcHMpXG4gICAgICAgICAgICBmb3IgKGxldCBzcmMgb2Ygc3BlYy5wcm9wcykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzcmMpKVxuICAgICAgICAgICAgICAgICAgICBzcmMgPSBzcmModHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKHNyYykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3JjWzBdLnBlck5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNhbid0IHN0b3JlIGEgcGVyLW5vZGUgcHJvcCBvbiBhIG5vZGUgdHlwZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHNbc3JjWzBdLmlkXSA9IHNyY1sxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZXMgYSBub2RlIHByb3AgZm9yIHRoaXMgdHlwZS4gV2lsbCByZXR1cm4gYHVuZGVmaW5lZGAgaWZcbiAgICB0aGUgcHJvcCBpc24ndCBwcmVzZW50IG9uIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIHByb3AocHJvcCkgeyByZXR1cm4gdGhpcy5wcm9wc1twcm9wLmlkXTsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIHRoZSB0b3Agbm9kZSBvZiBhIGdyYW1tYXIuXG4gICAgKi9cbiAgICBnZXQgaXNUb3AoKSB7IHJldHVybiAodGhpcy5mbGFncyAmIDEgLyogTm9kZUZsYWcuVG9wICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBub2RlIGlzIHByb2R1Y2VkIGJ5IGEgc2tpcCBydWxlLlxuICAgICovXG4gICAgZ2V0IGlzU2tpcHBlZCgpIHsgcmV0dXJuICh0aGlzLmZsYWdzICYgMiAvKiBOb2RlRmxhZy5Ta2lwcGVkICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIGVycm9yIG5vZGUuXG4gICAgKi9cbiAgICBnZXQgaXNFcnJvcigpIHsgcmV0dXJuICh0aGlzLmZsYWdzICYgNCAvKiBOb2RlRmxhZy5FcnJvciAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgV2hlbiB0cnVlLCB0aGlzIG5vZGUgdHlwZSBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYSB1c2VyLWRlY2xhcmVkXG4gICAgbmFtZWQgbm9kZSwgZm9yIGV4YW1wbGUgYmVjYXVzZSBpdCBpcyB1c2VkIHRvIGNhY2hlIHJlcGV0aXRpb24uXG4gICAgKi9cbiAgICBnZXQgaXNBbm9ueW1vdXMoKSB7IHJldHVybiAodGhpcy5mbGFncyAmIDggLyogTm9kZUZsYWcuQW5vbnltb3VzICovKSA+IDA7IH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIG5vZGUncyBuYW1lIG9yIG9uZSBvZiBpdHNcbiAgICBbZ3JvdXBzXSgjY29tbW9uLk5vZGVQcm9wXmdyb3VwKSBtYXRjaGVzIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAgKi9cbiAgICBpcyhuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSBuYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgbGV0IGdyb3VwID0gdGhpcy5wcm9wKE5vZGVQcm9wLmdyb3VwKTtcbiAgICAgICAgICAgIHJldHVybiBncm91cCA/IGdyb3VwLmluZGV4T2YobmFtZSkgPiAtMSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmlkID09IG5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGZ1bmN0aW9uIGZyb20gbm9kZSB0eXBlcyB0byBhcmJpdHJhcnkgdmFsdWVzIGJ5XG4gICAgc3BlY2lmeWluZyBhbiBvYmplY3Qgd2hvc2UgcHJvcGVydHkgbmFtZXMgYXJlIG5vZGUgb3JcbiAgICBbZ3JvdXBdKCNjb21tb24uTm9kZVByb3BeZ3JvdXApIG5hbWVzLiBPZnRlbiB1c2VmdWwgd2l0aFxuICAgIFtgTm9kZVByb3AuYWRkYF0oI2NvbW1vbi5Ob2RlUHJvcC5hZGQpLiBZb3UgY2FuIHB1dCBtdWx0aXBsZVxuICAgIG5hbWVzLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBpbiBhIHNpbmdsZSBwcm9wZXJ0eSBuYW1lIHRvIG1hcFxuICAgIG11bHRpcGxlIG5vZGUgbmFtZXMgdG8gYSBzaW5nbGUgdmFsdWUuXG4gICAgKi9cbiAgICBzdGF0aWMgbWF0Y2gobWFwKSB7XG4gICAgICAgIGxldCBkaXJlY3QgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGxldCBwcm9wIGluIG1hcClcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgb2YgcHJvcC5zcGxpdChcIiBcIikpXG4gICAgICAgICAgICAgICAgZGlyZWN0W25hbWVdID0gbWFwW3Byb3BdO1xuICAgICAgICByZXR1cm4gKG5vZGUpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGdyb3VwcyA9IG5vZGUucHJvcChOb2RlUHJvcC5ncm91cCksIGkgPSAtMTsgaSA8IChncm91cHMgPyBncm91cHMubGVuZ3RoIDogMCk7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGRpcmVjdFtpIDwgMCA/IG5vZGUubmFtZSA6IGdyb3Vwc1tpXV07XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuLyoqXG5BbiBlbXB0eSBkdW1teSBub2RlIHR5cGUgdG8gdXNlIHdoZW4gbm8gYWN0dWFsIHR5cGUgaXMgYXZhaWxhYmxlLlxuKi9cbk5vZGVUeXBlLm5vbmUgPSBuZXcgTm9kZVR5cGUoXCJcIiwgT2JqZWN0LmNyZWF0ZShudWxsKSwgMCwgOCAvKiBOb2RlRmxhZy5Bbm9ueW1vdXMgKi8pO1xuLyoqXG5BIG5vZGUgc2V0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiBub2RlIHR5cGVzLiBJdCBpcyB1c2VkIHRvXG5jb21wYWN0bHkgcmVwcmVzZW50IHRyZWVzIGJ5IHN0b3JpbmcgdGhlaXIgdHlwZSBpZHMsIHJhdGhlciB0aGFuIGFcbmZ1bGwgcG9pbnRlciB0byB0aGUgdHlwZSBvYmplY3QsIGluIGEgbnVtZXJpYyBhcnJheS4gRWFjaCBwYXJzZXJcbltoYXNdKCNsci5MUlBhcnNlci5ub2RlU2V0KSBhIG5vZGUgc2V0LCBhbmQgW3RyZWVcbmJ1ZmZlcnNdKCNjb21tb24uVHJlZUJ1ZmZlcikgY2FuIG9ubHkgc3RvcmUgY29sbGVjdGlvbnMgb2Ygbm9kZXNcbmZyb20gdGhlIHNhbWUgc2V0LiBBIHNldCBjYW4gaGF2ZSBhIG1heGltdW0gb2YgMioqMTYgKDY1NTM2KSBub2RlXG50eXBlcyBpbiBpdCwgc28gdGhhdCB0aGUgaWRzIGZpdCBpbnRvIDE2LWJpdCB0eXBlZCBhcnJheSBzbG90cy5cbiovXG5jbGFzcyBOb2RlU2V0IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgd2l0aCB0aGUgZ2l2ZW4gdHlwZXMuIFRoZSBgaWRgIHByb3BlcnR5IG9mIGVhY2hcbiAgICB0eXBlIHNob3VsZCBjb3JyZXNwb25kIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIGFycmF5LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5vZGUgdHlwZXMgaW4gdGhpcyBzZXQsIGJ5IGlkLlxuICAgICovXG4gICAgdHlwZXMpIHtcbiAgICAgICAgdGhpcy50eXBlcyA9IHR5cGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHR5cGVzW2ldLmlkICE9IGkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJOb2RlIHR5cGUgaWRzIHNob3VsZCBjb3JyZXNwb25kIHRvIGFycmF5IHBvc2l0aW9ucyB3aGVuIGNyZWF0aW5nIGEgbm9kZSBzZXRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBzZXQgd2l0aCBzb21lIG5vZGUgcHJvcGVydGllcyBhZGRlZC4gVGhlXG4gICAgYXJndW1lbnRzIHRvIHRoaXMgbWV0aG9kIGNhbiBiZSBjcmVhdGVkIHdpdGhcbiAgICBbYE5vZGVQcm9wLmFkZGBdKCNjb21tb24uTm9kZVByb3AuYWRkKS5cbiAgICAqL1xuICAgIGV4dGVuZCguLi5wcm9wcykge1xuICAgICAgICBsZXQgbmV3VHlwZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdHlwZSBvZiB0aGlzLnR5cGVzKSB7XG4gICAgICAgICAgICBsZXQgbmV3UHJvcHMgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgc291cmNlIG9mIHByb3BzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFkZCA9IHNvdXJjZSh0eXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoYWRkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV3UHJvcHMpXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIHR5cGUucHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICBuZXdQcm9wc1thZGRbMF0uaWRdID0gYWRkWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld1R5cGVzLnB1c2gobmV3UHJvcHMgPyBuZXcgTm9kZVR5cGUodHlwZS5uYW1lLCBuZXdQcm9wcywgdHlwZS5pZCwgdHlwZS5mbGFncykgOiB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE5vZGVTZXQobmV3VHlwZXMpO1xuICAgIH1cbn1cbmNvbnN0IENhY2hlZE5vZGUgPSBuZXcgV2Vha01hcCgpLCBDYWNoZWRJbm5lck5vZGUgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG5PcHRpb25zIHRoYXQgY29udHJvbCBpdGVyYXRpb24uIENhbiBiZSBjb21iaW5lZCB3aXRoIHRoZSBgfGBcbm9wZXJhdG9yIHRvIGVuYWJsZSBtdWx0aXBsZSBvbmVzLlxuKi9cbnZhciBJdGVyTW9kZTtcbihmdW5jdGlvbiAoSXRlck1vZGUpIHtcbiAgICAvKipcbiAgICBXaGVuIGVuYWJsZWQsIGl0ZXJhdGlvbiB3aWxsIG9ubHkgdmlzaXQgW2BUcmVlYF0oI2NvbW1vbi5UcmVlKVxuICAgIG9iamVjdHMsIG5vdCBub2RlcyBwYWNrZWQgaW50b1xuICAgIFtgVHJlZUJ1ZmZlcmBdKCNjb21tb24uVHJlZUJ1ZmZlcilzLlxuICAgICovXG4gICAgSXRlck1vZGVbSXRlck1vZGVbXCJFeGNsdWRlQnVmZmVyc1wiXSA9IDFdID0gXCJFeGNsdWRlQnVmZmVyc1wiO1xuICAgIC8qKlxuICAgIEVuYWJsZSB0aGlzIHRvIG1ha2UgaXRlcmF0aW9uIGluY2x1ZGUgYW5vbnltb3VzIG5vZGVzIChzdWNoIGFzXG4gICAgdGhlIG5vZGVzIHRoYXQgd3JhcCByZXBlYXRlZCBncmFtbWFyIGNvbnN0cnVjdHMgaW50byBhIGJhbGFuY2VkXG4gICAgdHJlZSkuXG4gICAgKi9cbiAgICBJdGVyTW9kZVtJdGVyTW9kZVtcIkluY2x1ZGVBbm9ueW1vdXNcIl0gPSAyXSA9IFwiSW5jbHVkZUFub255bW91c1wiO1xuICAgIC8qKlxuICAgIEJ5IGRlZmF1bHQsIHJlZ3VsYXIgW21vdW50ZWRdKCNjb21tb24uTm9kZVByb3BebW91bnRlZCkgbm9kZXNcbiAgICByZXBsYWNlIHRoZWlyIGJhc2Ugbm9kZSBpbiBpdGVyYXRpb24uIEVuYWJsZSB0aGlzIHRvIGlnbm9yZSB0aGVtXG4gICAgaW5zdGVhZC5cbiAgICAqL1xuICAgIEl0ZXJNb2RlW0l0ZXJNb2RlW1wiSWdub3JlTW91bnRzXCJdID0gNF0gPSBcIklnbm9yZU1vdW50c1wiO1xuICAgIC8qKlxuICAgIFRoaXMgb3B0aW9uIG9ubHkgYXBwbGllcyBpblxuICAgIFtgZW50ZXJgXSgjY29tbW9uLlN5bnRheE5vZGUuZW50ZXIpLXN0eWxlIG1ldGhvZHMuIEl0IHRlbGxzIHRoZVxuICAgIGxpYnJhcnkgdG8gbm90IGVudGVyIG1vdW50ZWQgb3ZlcmxheXMgaWYgb25lIGNvdmVycyB0aGUgZ2l2ZW5cbiAgICBwb3NpdGlvbi5cbiAgICAqL1xuICAgIEl0ZXJNb2RlW0l0ZXJNb2RlW1wiSWdub3JlT3ZlcmxheXNcIl0gPSA4XSA9IFwiSWdub3JlT3ZlcmxheXNcIjtcbn0pKEl0ZXJNb2RlIHx8IChJdGVyTW9kZSA9IHt9KSk7XG4vKipcbkEgcGllY2Ugb2Ygc3ludGF4IHRyZWUuIFRoZXJlIGFyZSB0d28gd2F5cyB0byBhcHByb2FjaCB0aGVzZVxudHJlZXM6IHRoZSB3YXkgdGhleSBhcmUgYWN0dWFsbHkgc3RvcmVkIGluIG1lbW9yeSwgYW5kIHRoZVxuY29udmVuaWVudCB3YXkuXG5cblN5bnRheCB0cmVlcyBhcmUgc3RvcmVkIGFzIGEgdHJlZSBvZiBgVHJlZWAgYW5kIGBUcmVlQnVmZmVyYFxub2JqZWN0cy4gQnkgcGFja2luZyBkZXRhaWwgaW5mb3JtYXRpb24gaW50byBgVHJlZUJ1ZmZlcmAgbGVhZlxubm9kZXMsIHRoZSByZXByZXNlbnRhdGlvbiBpcyBtYWRlIGEgbG90IG1vcmUgbWVtb3J5LWVmZmljaWVudC5cblxuSG93ZXZlciwgd2hlbiB5b3Ugd2FudCB0byBhY3R1YWxseSB3b3JrIHdpdGggdHJlZSBub2RlcywgdGhpc1xucmVwcmVzZW50YXRpb24gaXMgdmVyeSBhd2t3YXJkLCBzbyBtb3N0IGNsaWVudCBjb2RlIHdpbGwgd2FudCB0b1xudXNlIHRoZSBbYFRyZWVDdXJzb3JgXSgjY29tbW9uLlRyZWVDdXJzb3IpIG9yXG5bYFN5bnRheE5vZGVgXSgjY29tbW9uLlN5bnRheE5vZGUpIGludGVyZmFjZSBpbnN0ZWFkLCB3aGljaCBwcm92aWRlc1xuYSB2aWV3IG9uIHNvbWUgcGFydCBvZiB0aGlzIGRhdGEgc3RydWN0dXJlLCBhbmQgY2FuIGJlIHVzZWQgdG9cbm1vdmUgYXJvdW5kIHRvIGFkamFjZW50IG5vZGVzLlxuKi9cbmNsYXNzIFRyZWUge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIG5ldyB0cmVlLiBTZWUgYWxzbyBbYFRyZWUuYnVpbGRgXSgjY29tbW9uLlRyZWVeYnVpbGQpLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHR5cGUgb2YgdGhlIHRvcCBub2RlLlxuICAgICovXG4gICAgdHlwZSwgXG4gICAgLyoqXG4gICAgVGhpcyBub2RlJ3MgY2hpbGQgbm9kZXMuXG4gICAgKi9cbiAgICBjaGlsZHJlbiwgXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9ucyAob2Zmc2V0cyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhpcyB0cmVlKSBvZlxuICAgIHRoZSBjaGlsZHJlbi5cbiAgICAqL1xuICAgIHBvc2l0aW9ucywgXG4gICAgLyoqXG4gICAgVGhlIHRvdGFsIGxlbmd0aCBvZiB0aGlzIHRyZWVcbiAgICAqL1xuICAgIGxlbmd0aCwgXG4gICAgLyoqXG4gICAgUGVyLW5vZGUgW25vZGUgcHJvcHNdKCNjb21tb24uTm9kZVByb3ApIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIHByb3BzKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBwb3NpdGlvbnM7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMucHJvcHMgPSBudWxsO1xuICAgICAgICBpZiAocHJvcHMgJiYgcHJvcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIGZvciAobGV0IFtwcm9wLCB2YWx1ZV0gb2YgcHJvcHMpXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wc1t0eXBlb2YgcHJvcCA9PSBcIm51bWJlclwiID8gcHJvcCA6IHByb3AuaWRdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IG1vdW50ZWQgPSBNb3VudGVkVHJlZS5nZXQodGhpcyk7XG4gICAgICAgIGlmIChtb3VudGVkICYmICFtb3VudGVkLm92ZXJsYXkpXG4gICAgICAgICAgICByZXR1cm4gbW91bnRlZC50cmVlLnRvU3RyaW5nKCk7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGNoIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBjaC50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKHN0cikge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbilcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gKz0gXCIsXCI7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gKz0gc3RyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhdGhpcy50eXBlLm5hbWUgPyBjaGlsZHJlbiA6XG4gICAgICAgICAgICAoL1xcVy8udGVzdCh0aGlzLnR5cGUubmFtZSkgJiYgIXRoaXMudHlwZS5pc0Vycm9yID8gSlNPTi5zdHJpbmdpZnkodGhpcy50eXBlLm5hbWUpIDogdGhpcy50eXBlLm5hbWUpICtcbiAgICAgICAgICAgICAgICAoY2hpbGRyZW4ubGVuZ3RoID8gXCIoXCIgKyBjaGlsZHJlbiArIFwiKVwiIDogXCJcIik7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIFt0cmVlIGN1cnNvcl0oI2NvbW1vbi5UcmVlQ3Vyc29yKSBwb3NpdGlvbmVkIGF0IHRoZSB0b3Agb2ZcbiAgICB0aGUgdHJlZS4gTW9kZSBjYW4gYmUgdXNlZCB0byBbY29udHJvbF0oI2NvbW1vbi5JdGVyTW9kZSkgd2hpY2hcbiAgICBub2RlcyB0aGUgY3Vyc29yIHZpc2l0cy5cbiAgICAqL1xuICAgIGN1cnNvcihtb2RlID0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyZWVDdXJzb3IodGhpcy50b3BOb2RlLCBtb2RlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgW3RyZWUgY3Vyc29yXSgjY29tbW9uLlRyZWVDdXJzb3IpIHBvaW50aW5nIGludG8gdGhpcyB0cmVlXG4gICAgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCBzaWRlIChzZWVcbiAgICBbYG1vdmVUb2BdKCNjb21tb24uVHJlZUN1cnNvci5tb3ZlVG8pLlxuICAgICovXG4gICAgY3Vyc29yQXQocG9zLCBzaWRlID0gMCwgbW9kZSA9IDApIHtcbiAgICAgICAgbGV0IHNjb3BlID0gQ2FjaGVkTm9kZS5nZXQodGhpcykgfHwgdGhpcy50b3BOb2RlO1xuICAgICAgICBsZXQgY3Vyc29yID0gbmV3IFRyZWVDdXJzb3Ioc2NvcGUpO1xuICAgICAgICBjdXJzb3IubW92ZVRvKHBvcywgc2lkZSk7XG4gICAgICAgIENhY2hlZE5vZGUuc2V0KHRoaXMsIGN1cnNvci5fdHJlZSk7XG4gICAgICAgIHJldHVybiBjdXJzb3I7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIFtzeW50YXggbm9kZV0oI2NvbW1vbi5TeW50YXhOb2RlKSBvYmplY3QgZm9yIHRoZSB0b3Agb2YgdGhlXG4gICAgdHJlZS5cbiAgICAqL1xuICAgIGdldCB0b3BOb2RlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyZWVOb2RlKHRoaXMsIDAsIDAsIG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIFtzeW50YXggbm9kZV0oI2NvbW1vbi5TeW50YXhOb2RlKSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgSWYgYHNpZGVgIGlzIC0xLCB0aGlzIHdpbGwgbW92ZSBpbnRvIG5vZGVzIHRoYXQgZW5kIGF0IHRoZVxuICAgIHBvc2l0aW9uLiBJZiAxLCBpdCdsbCBtb3ZlIGludG8gbm9kZXMgdGhhdCBzdGFydCBhdCB0aGVcbiAgICBwb3NpdGlvbi4gV2l0aCAwLCBpdCdsbCBvbmx5IGVudGVyIG5vZGVzIHRoYXQgY292ZXIgdGhlIHBvc2l0aW9uXG4gICAgZnJvbSBib3RoIHNpZGVzLlxuICAgIFxuICAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IGVudGVyXG4gICAgW292ZXJsYXlzXSgjY29tbW9uLk1vdW50ZWRUcmVlLm92ZXJsYXkpLCBhbmQgeW91IG9mdGVuIHdhbnRcbiAgICBbYHJlc29sdmVJbm5lcmBdKCNjb21tb24uVHJlZS5yZXNvbHZlSW5uZXIpIGluc3RlYWQuXG4gICAgKi9cbiAgICByZXNvbHZlKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgbGV0IG5vZGUgPSByZXNvbHZlTm9kZShDYWNoZWROb2RlLmdldCh0aGlzKSB8fCB0aGlzLnRvcE5vZGUsIHBvcywgc2lkZSwgZmFsc2UpO1xuICAgICAgICBDYWNoZWROb2RlLnNldCh0aGlzLCBub2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgIExpa2UgW2ByZXNvbHZlYF0oI2NvbW1vbi5UcmVlLnJlc29sdmUpLCBidXQgd2lsbCBlbnRlclxuICAgIFtvdmVybGFpZF0oI2NvbW1vbi5Nb3VudGVkVHJlZS5vdmVybGF5KSBub2RlcywgcHJvZHVjaW5nIGEgc3ludGF4IG5vZGVcbiAgICBwb2ludGluZyBpbnRvIHRoZSBpbm5lcm1vc3Qgb3ZlcmxhaWQgdHJlZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb25cbiAgICAod2l0aCBwYXJlbnQgbGlua3MgZ29pbmcgdGhyb3VnaCBhbGwgcGFyZW50IHN0cnVjdHVyZSwgaW5jbHVkaW5nXG4gICAgdGhlIGhvc3QgdHJlZXMpLlxuICAgICovXG4gICAgcmVzb2x2ZUlubmVyKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgbGV0IG5vZGUgPSByZXNvbHZlTm9kZShDYWNoZWRJbm5lck5vZGUuZ2V0KHRoaXMpIHx8IHRoaXMudG9wTm9kZSwgcG9zLCBzaWRlLCB0cnVlKTtcbiAgICAgICAgQ2FjaGVkSW5uZXJOb2RlLnNldCh0aGlzLCBub2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEluIHNvbWUgc2l0dWF0aW9ucywgaXQgY2FuIGJlIHVzZWZ1bCB0byBpdGVyYXRlIHRocm91Z2ggYWxsXG4gICAgbm9kZXMgYXJvdW5kIGEgcG9zaXRpb24sIGluY2x1ZGluZyB0aG9zZSBpbiBvdmVybGF5cyB0aGF0IGRvbid0XG4gICAgZGlyZWN0bHkgY292ZXIgdGhlIHBvc2l0aW9uLiBUaGlzIG1ldGhvZCBnaXZlcyB5b3UgYW4gaXRlcmF0b3JcbiAgICB0aGF0IHdpbGwgcHJvZHVjZSBhbGwgbm9kZXMsIGZyb20gc21hbGwgdG8gYmlnLCBhcm91bmQgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24uXG4gICAgKi9cbiAgICByZXNvbHZlU3RhY2socG9zLCBzaWRlID0gMCkge1xuICAgICAgICByZXR1cm4gc3RhY2tJdGVyYXRvcih0aGlzLCBwb3MsIHNpZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHRyZWUgYW5kIGl0cyBjaGlsZHJlbiwgY2FsbGluZyBgZW50ZXJgIGZvciBhbnlcbiAgICBub2RlIHRoYXQgdG91Y2hlcyB0aGUgYGZyb21gL2B0b2AgcmVnaW9uIChpZiBnaXZlbikgYmVmb3JlXG4gICAgcnVubmluZyBvdmVyIHN1Y2ggYSBub2RlJ3MgY2hpbGRyZW4sIGFuZCBgbGVhdmVgIChpZiBnaXZlbikgd2hlblxuICAgIGxlYXZpbmcgdGhlIG5vZGUuIFdoZW4gYGVudGVyYCByZXR1cm5zIGBmYWxzZWAsIHRoYXQgbm9kZSB3aWxsXG4gICAgbm90IGhhdmUgaXRzIGNoaWxkcmVuIGl0ZXJhdGVkIG92ZXIgKG9yIGBsZWF2ZWAgY2FsbGVkKS5cbiAgICAqL1xuICAgIGl0ZXJhdGUoc3BlYykge1xuICAgICAgICBsZXQgeyBlbnRlciwgbGVhdmUsIGZyb20gPSAwLCB0byA9IHRoaXMubGVuZ3RoIH0gPSBzcGVjO1xuICAgICAgICBsZXQgbW9kZSA9IHNwZWMubW9kZSB8fCAwLCBhbm9uID0gKG1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSA+IDA7XG4gICAgICAgIGZvciAobGV0IGMgPSB0aGlzLmN1cnNvcihtb2RlIHwgSXRlck1vZGUuSW5jbHVkZUFub255bW91cyk7Oykge1xuICAgICAgICAgICAgbGV0IGVudGVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChjLmZyb20gPD0gdG8gJiYgYy50byA+PSBmcm9tICYmICghYW5vbiAmJiBjLnR5cGUuaXNBbm9ueW1vdXMgfHwgZW50ZXIoYykgIT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIGlmIChjLmZpcnN0Q2hpbGQoKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgZW50ZXJlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudGVyZWQgJiYgbGVhdmUgJiYgKGFub24gfHwgIWMudHlwZS5pc0Fub255bW91cykpXG4gICAgICAgICAgICAgICAgICAgIGxlYXZlKGMpO1xuICAgICAgICAgICAgICAgIGlmIChjLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmICghYy5wYXJlbnQoKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGVudGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIFtub2RlIHByb3BdKCNjb21tb24uTm9kZVByb3ApIGZvciB0aGlzXG4gICAgbm9kZS4gV29ya3Mgd2l0aCBib3RoIHBlci1ub2RlIGFuZCBwZXItdHlwZSBwcm9wcy5cbiAgICAqL1xuICAgIHByb3AocHJvcCkge1xuICAgICAgICByZXR1cm4gIXByb3AucGVyTm9kZSA/IHRoaXMudHlwZS5wcm9wKHByb3ApIDogdGhpcy5wcm9wcyA/IHRoaXMucHJvcHNbcHJvcC5pZF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdGhlIG5vZGUncyBbcGVyLW5vZGUgcHJvcHNdKCNjb21tb24uTm9kZVByb3AucGVyTm9kZSkgaW4gYVxuICAgIGZvcm1hdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIFtgVHJlZWBdKCNjb21tb24uVHJlZSlcbiAgICBjb25zdHJ1Y3Rvci5cbiAgICAqL1xuICAgIGdldCBwcm9wVmFsdWVzKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICh0aGlzLnByb3BzKVxuICAgICAgICAgICAgZm9yIChsZXQgaWQgaW4gdGhpcy5wcm9wcylcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChbK2lkLCB0aGlzLnByb3BzW2lkXV0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBCYWxhbmNlIHRoZSBkaXJlY3QgY2hpbGRyZW4gb2YgdGhpcyB0cmVlLCBwcm9kdWNpbmcgYSBjb3B5IG9mXG4gICAgd2hpY2ggbWF5IGhhdmUgY2hpbGRyZW4gZ3JvdXBlZCBpbnRvIHN1YnRyZWVzIHdpdGggdHlwZVxuICAgIFtgTm9kZVR5cGUubm9uZWBdKCNjb21tb24uTm9kZVR5cGVebm9uZSkuXG4gICAgKi9cbiAgICBiYWxhbmNlKGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA8PSA4IC8qIEJhbGFuY2UuQnJhbmNoRmFjdG9yICovID8gdGhpcyA6XG4gICAgICAgICAgICBiYWxhbmNlUmFuZ2UoTm9kZVR5cGUubm9uZSwgdGhpcy5jaGlsZHJlbiwgdGhpcy5wb3NpdGlvbnMsIDAsIHRoaXMuY2hpbGRyZW4ubGVuZ3RoLCAwLCB0aGlzLmxlbmd0aCwgKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCkgPT4gbmV3IFRyZWUodGhpcy50eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgsIHRoaXMucHJvcFZhbHVlcyksIGNvbmZpZy5tYWtlVHJlZSB8fCAoKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCkgPT4gbmV3IFRyZWUoTm9kZVR5cGUubm9uZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBCdWlsZCBhIHRyZWUgZnJvbSBhIHBvc3RmaXgtb3JkZXJlZCBidWZmZXIgb2Ygbm9kZSBpbmZvcm1hdGlvbixcbiAgICBvciBhIGN1cnNvciBvdmVyIHN1Y2ggYSBidWZmZXIuXG4gICAgKi9cbiAgICBzdGF0aWMgYnVpbGQoZGF0YSkgeyByZXR1cm4gYnVpbGRUcmVlKGRhdGEpOyB9XG59XG4vKipcblRoZSBlbXB0eSB0cmVlXG4qL1xuVHJlZS5lbXB0eSA9IG5ldyBUcmVlKE5vZGVUeXBlLm5vbmUsIFtdLCBbXSwgMCk7XG5jbGFzcyBGbGF0QnVmZmVyQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIsIGluZGV4KSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgfVxuICAgIGdldCBpZCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSA0XTsgfVxuICAgIGdldCBzdGFydCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSAzXTsgfVxuICAgIGdldCBlbmQoKSB7IHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmluZGV4IC0gMl07IH1cbiAgICBnZXQgc2l6ZSgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSAxXTsgfVxuICAgIGdldCBwb3MoKSB7IHJldHVybiB0aGlzLmluZGV4OyB9XG4gICAgbmV4dCgpIHsgdGhpcy5pbmRleCAtPSA0OyB9XG4gICAgZm9yaygpIHsgcmV0dXJuIG5ldyBGbGF0QnVmZmVyQ3Vyc29yKHRoaXMuYnVmZmVyLCB0aGlzLmluZGV4KTsgfVxufVxuLyoqXG5UcmVlIGJ1ZmZlcnMgY29udGFpbiAodHlwZSwgc3RhcnQsIGVuZCwgZW5kSW5kZXgpIHF1YWRzIGZvciBlYWNoXG5ub2RlLiBJbiBzdWNoIGEgYnVmZmVyLCBub2RlcyBhcmUgc3RvcmVkIGluIHByZWZpeCBvcmRlciAocGFyZW50c1xuYmVmb3JlIGNoaWxkcmVuLCB3aXRoIHRoZSBlbmRJbmRleCBvZiB0aGUgcGFyZW50IGluZGljYXRpbmcgd2hpY2hcbmNoaWxkcmVuIGJlbG9uZyB0byBpdCkuXG4qL1xuY2xhc3MgVHJlZUJ1ZmZlciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdHJlZSBidWZmZXIuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgYnVmZmVyJ3MgY29udGVudC5cbiAgICAqL1xuICAgIGJ1ZmZlciwgXG4gICAgLyoqXG4gICAgVGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZ3JvdXAgb2Ygbm9kZXMgaW4gdGhlIGJ1ZmZlci5cbiAgICAqL1xuICAgIGxlbmd0aCwgXG4gICAgLyoqXG4gICAgVGhlIG5vZGUgc2V0IHVzZWQgaW4gdGhpcyBidWZmZXIuXG4gICAgKi9cbiAgICBzZXQpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLnNldCA9IHNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIE5vZGVUeXBlLm5vbmU7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmJ1ZmZlci5sZW5ndGg7KSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmNoaWxkU3RyaW5nKGluZGV4KSk7XG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuYnVmZmVyW2luZGV4ICsgM107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKFwiLFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaGlsZFN0cmluZyhpbmRleCkge1xuICAgICAgICBsZXQgaWQgPSB0aGlzLmJ1ZmZlcltpbmRleF0sIGVuZEluZGV4ID0gdGhpcy5idWZmZXJbaW5kZXggKyAzXTtcbiAgICAgICAgbGV0IHR5cGUgPSB0aGlzLnNldC50eXBlc1tpZF0sIHJlc3VsdCA9IHR5cGUubmFtZTtcbiAgICAgICAgaWYgKC9cXFcvLnRlc3QocmVzdWx0KSAmJiAhdHlwZS5pc0Vycm9yKVxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0KTtcbiAgICAgICAgaW5kZXggKz0gNDtcbiAgICAgICAgaWYgKGVuZEluZGV4ID09IGluZGV4KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gW107XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGVuZEluZGV4KSB7XG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRTdHJpbmcoaW5kZXgpKTtcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5idWZmZXJbaW5kZXggKyAzXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0ICsgXCIoXCIgKyBjaGlsZHJlbi5qb2luKFwiLFwiKSArIFwiKVwiO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbmRDaGlsZChzdGFydEluZGV4LCBlbmRJbmRleCwgZGlyLCBwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLCBwaWNrID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpICE9IGVuZEluZGV4OyBpID0gYnVmZmVyW2kgKyAzXSkge1xuICAgICAgICAgICAgaWYgKGNoZWNrU2lkZShzaWRlLCBwb3MsIGJ1ZmZlcltpICsgMV0sIGJ1ZmZlcltpICsgMl0pKSB7XG4gICAgICAgICAgICAgICAgcGljayA9IGk7XG4gICAgICAgICAgICAgICAgaWYgKGRpciA+IDApXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwaWNrO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNsaWNlKHN0YXJ0SSwgZW5kSSwgZnJvbSkge1xuICAgICAgICBsZXQgYiA9IHRoaXMuYnVmZmVyO1xuICAgICAgICBsZXQgY29weSA9IG5ldyBVaW50MTZBcnJheShlbmRJIC0gc3RhcnRJKSwgbGVuID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SSwgaiA9IDA7IGkgPCBlbmRJOykge1xuICAgICAgICAgICAgY29weVtqKytdID0gYltpKytdO1xuICAgICAgICAgICAgY29weVtqKytdID0gYltpKytdIC0gZnJvbTtcbiAgICAgICAgICAgIGxldCB0byA9IGNvcHlbaisrXSA9IGJbaSsrXSAtIGZyb207XG4gICAgICAgICAgICBjb3B5W2orK10gPSBiW2krK10gLSBzdGFydEk7XG4gICAgICAgICAgICBsZW4gPSBNYXRoLm1heChsZW4sIHRvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRyZWVCdWZmZXIoY29weSwgbGVuLCB0aGlzLnNldCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tTaWRlKHNpZGUsIHBvcywgZnJvbSwgdG8pIHtcbiAgICBzd2l0Y2ggKHNpZGUpIHtcbiAgICAgICAgY2FzZSAtMiAvKiBTaWRlLkJlZm9yZSAqLzogcmV0dXJuIGZyb20gPCBwb3M7XG4gICAgICAgIGNhc2UgLTEgLyogU2lkZS5BdE9yQmVmb3JlICovOiByZXR1cm4gdG8gPj0gcG9zICYmIGZyb20gPCBwb3M7XG4gICAgICAgIGNhc2UgMCAvKiBTaWRlLkFyb3VuZCAqLzogcmV0dXJuIGZyb20gPCBwb3MgJiYgdG8gPiBwb3M7XG4gICAgICAgIGNhc2UgMSAvKiBTaWRlLkF0T3JBZnRlciAqLzogcmV0dXJuIGZyb20gPD0gcG9zICYmIHRvID4gcG9zO1xuICAgICAgICBjYXNlIDIgLyogU2lkZS5BZnRlciAqLzogcmV0dXJuIHRvID4gcG9zO1xuICAgICAgICBjYXNlIDQgLyogU2lkZS5Eb250Q2FyZSAqLzogcmV0dXJuIHRydWU7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZU5vZGUobm9kZSwgcG9zLCBzaWRlLCBvdmVybGF5cykge1xuICAgIHZhciBfYTtcbiAgICAvLyBNb3ZlIHVwIHRvIGEgbm9kZSB0aGF0IGFjdHVhbGx5IGhvbGRzIHRoZSBwb3NpdGlvbiwgaWYgcG9zc2libGVcbiAgICB3aGlsZSAobm9kZS5mcm9tID09IG5vZGUudG8gfHxcbiAgICAgICAgKHNpZGUgPCAxID8gbm9kZS5mcm9tID49IHBvcyA6IG5vZGUuZnJvbSA+IHBvcykgfHxcbiAgICAgICAgKHNpZGUgPiAtMSA/IG5vZGUudG8gPD0gcG9zIDogbm9kZS50byA8IHBvcykpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICFvdmVybGF5cyAmJiBub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUgJiYgbm9kZS5pbmRleCA8IDAgPyBudWxsIDogbm9kZS5wYXJlbnQ7XG4gICAgICAgIGlmICghcGFyZW50KVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGxldCBtb2RlID0gb3ZlcmxheXMgPyAwIDogSXRlck1vZGUuSWdub3JlT3ZlcmxheXM7XG4gICAgLy8gTXVzdCBnbyB1cCBvdXQgb2Ygb3ZlcmxheXMgd2hlbiB0aG9zZSBkbyBub3Qgb3ZlcmxhcCB3aXRoIHBvc1xuICAgIGlmIChvdmVybGF5cylcbiAgICAgICAgZm9yIChsZXQgc2NhbiA9IG5vZGUsIHBhcmVudCA9IHNjYW4ucGFyZW50OyBwYXJlbnQ7IHNjYW4gPSBwYXJlbnQsIHBhcmVudCA9IHNjYW4ucGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoc2NhbiBpbnN0YW5jZW9mIFRyZWVOb2RlICYmIHNjYW4uaW5kZXggPCAwICYmICgoX2EgPSBwYXJlbnQuZW50ZXIocG9zLCBzaWRlLCBtb2RlKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZyb20pICE9IHNjYW4uZnJvbSlcbiAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgZm9yICg7Oykge1xuICAgICAgICBsZXQgaW5uZXIgPSBub2RlLmVudGVyKHBvcywgc2lkZSwgbW9kZSk7XG4gICAgICAgIGlmICghaW5uZXIpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgbm9kZSA9IGlubmVyO1xuICAgIH1cbn1cbmNsYXNzIEJhc2VOb2RlIHtcbiAgICBjdXJzb3IobW9kZSA9IDApIHsgcmV0dXJuIG5ldyBUcmVlQ3Vyc29yKHRoaXMsIG1vZGUpOyB9XG4gICAgZ2V0Q2hpbGQodHlwZSwgYmVmb3JlID0gbnVsbCwgYWZ0ZXIgPSBudWxsKSB7XG4gICAgICAgIGxldCByID0gZ2V0Q2hpbGRyZW4odGhpcywgdHlwZSwgYmVmb3JlLCBhZnRlcik7XG4gICAgICAgIHJldHVybiByLmxlbmd0aCA/IHJbMF0gOiBudWxsO1xuICAgIH1cbiAgICBnZXRDaGlsZHJlbih0eXBlLCBiZWZvcmUgPSBudWxsLCBhZnRlciA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKHRoaXMsIHR5cGUsIGJlZm9yZSwgYWZ0ZXIpO1xuICAgIH1cbiAgICByZXNvbHZlKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVOb2RlKHRoaXMsIHBvcywgc2lkZSwgZmFsc2UpO1xuICAgIH1cbiAgICByZXNvbHZlSW5uZXIocG9zLCBzaWRlID0gMCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZU5vZGUodGhpcywgcG9zLCBzaWRlLCB0cnVlKTtcbiAgICB9XG4gICAgbWF0Y2hDb250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoTm9kZUNvbnRleHQodGhpcy5wYXJlbnQsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbnRlclVuZmluaXNoZWROb2Rlc0JlZm9yZShwb3MpIHtcbiAgICAgICAgbGV0IHNjYW4gPSB0aGlzLmNoaWxkQmVmb3JlKHBvcyksIG5vZGUgPSB0aGlzO1xuICAgICAgICB3aGlsZSAoc2Nhbikge1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBzY2FuLmxhc3RDaGlsZDtcbiAgICAgICAgICAgIGlmICghbGFzdCB8fCBsYXN0LnRvICE9IHNjYW4udG8pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAobGFzdC50eXBlLmlzRXJyb3IgJiYgbGFzdC5mcm9tID09IGxhc3QudG8pIHtcbiAgICAgICAgICAgICAgICBub2RlID0gc2NhbjtcbiAgICAgICAgICAgICAgICBzY2FuID0gbGFzdC5wcmV2U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjYW4gPSBsYXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBnZXQgbm9kZSgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICBnZXQgbmV4dCgpIHsgcmV0dXJuIHRoaXMucGFyZW50OyB9XG59XG5jbGFzcyBUcmVlTm9kZSBleHRlbmRzIEJhc2VOb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihfdHJlZSwgZnJvbSwgXG4gICAgLy8gSW5kZXggaW4gcGFyZW50IG5vZGUsIHNldCB0byAtMSBpZiB0aGUgbm9kZSBpcyBub3QgYSBkaXJlY3QgY2hpbGQgb2YgX3BhcmVudC5ub2RlIChvdmVybGF5KVxuICAgIGluZGV4LCBfcGFyZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3RyZWUgPSBfdHJlZTtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50O1xuICAgIH1cbiAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3RyZWUudHlwZTsgfVxuICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fdHJlZS50eXBlLm5hbWU7IH1cbiAgICBnZXQgdG8oKSB7IHJldHVybiB0aGlzLmZyb20gKyB0aGlzLl90cmVlLmxlbmd0aDsgfVxuICAgIG5leHRDaGlsZChpLCBkaXIsIHBvcywgc2lkZSwgbW9kZSA9IDApIHtcbiAgICAgICAgZm9yIChsZXQgcGFyZW50ID0gdGhpczs7KSB7XG4gICAgICAgICAgICBmb3IgKGxldCB7IGNoaWxkcmVuLCBwb3NpdGlvbnMgfSA9IHBhcmVudC5fdHJlZSwgZSA9IGRpciA+IDAgPyBjaGlsZHJlbi5sZW5ndGggOiAtMTsgaSAhPSBlOyBpICs9IGRpcikge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gY2hpbGRyZW5baV0sIHN0YXJ0ID0gcG9zaXRpb25zW2ldICsgcGFyZW50LmZyb207XG4gICAgICAgICAgICAgICAgaWYgKCFjaGVja1NpZGUoc2lkZSwgcG9zLCBzdGFydCwgc3RhcnQgKyBuZXh0Lmxlbmd0aCkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgVHJlZUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSAmIEl0ZXJNb2RlLkV4Y2x1ZGVCdWZmZXJzKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IG5leHQuZmluZENoaWxkKDAsIG5leHQuYnVmZmVyLmxlbmd0aCwgZGlyLCBwb3MgLSBzdGFydCwgc2lkZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJOb2RlKG5ldyBCdWZmZXJDb250ZXh0KHBhcmVudCwgbmV4dCwgaSwgc3RhcnQpLCBudWxsLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKChtb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgfHwgKCFuZXh0LnR5cGUuaXNBbm9ueW1vdXMgfHwgaGFzQ2hpbGQobmV4dCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtb3VudGVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShtb2RlICYgSXRlck1vZGUuSWdub3JlTW91bnRzKSAmJiAobW91bnRlZCA9IE1vdW50ZWRUcmVlLmdldChuZXh0KSkgJiYgIW1vdW50ZWQub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJlZU5vZGUobW91bnRlZC50cmVlLCBzdGFydCwgaSwgcGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlubmVyID0gbmV3IFRyZWVOb2RlKG5leHQsIHN0YXJ0LCBpLCBwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSB8fCAhaW5uZXIudHlwZS5pc0Fub255bW91cyA/IGlubmVyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGlubmVyLm5leHRDaGlsZChkaXIgPCAwID8gbmV4dC5jaGlsZHJlbi5sZW5ndGggLSAxIDogMCwgZGlyLCBwb3MsIHNpZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgobW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpIHx8ICFwYXJlbnQudHlwZS5pc0Fub255bW91cylcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmIChwYXJlbnQuaW5kZXggPj0gMClcbiAgICAgICAgICAgICAgICBpID0gcGFyZW50LmluZGV4ICsgZGlyO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGkgPSBkaXIgPCAwID8gLTEgOiBwYXJlbnQuX3BhcmVudC5fdHJlZS5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuX3BhcmVudDtcbiAgICAgICAgICAgIGlmICghcGFyZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBmaXJzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5uZXh0Q2hpbGQoMCwgMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIGdldCBsYXN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLm5leHRDaGlsZCh0aGlzLl90cmVlLmNoaWxkcmVuLmxlbmd0aCAtIDEsIC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgY2hpbGRBZnRlcihwb3MpIHsgcmV0dXJuIHRoaXMubmV4dENoaWxkKDAsIDEsIHBvcywgMiAvKiBTaWRlLkFmdGVyICovKTsgfVxuICAgIGNoaWxkQmVmb3JlKHBvcykgeyByZXR1cm4gdGhpcy5uZXh0Q2hpbGQodGhpcy5fdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxLCAtMSwgcG9zLCAtMiAvKiBTaWRlLkJlZm9yZSAqLyk7IH1cbiAgICBlbnRlcihwb3MsIHNpZGUsIG1vZGUgPSAwKSB7XG4gICAgICAgIGxldCBtb3VudGVkO1xuICAgICAgICBpZiAoIShtb2RlICYgSXRlck1vZGUuSWdub3JlT3ZlcmxheXMpICYmIChtb3VudGVkID0gTW91bnRlZFRyZWUuZ2V0KHRoaXMuX3RyZWUpKSAmJiBtb3VudGVkLm92ZXJsYXkpIHtcbiAgICAgICAgICAgIGxldCByUG9zID0gcG9zIC0gdGhpcy5mcm9tO1xuICAgICAgICAgICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIG1vdW50ZWQub3ZlcmxheSkge1xuICAgICAgICAgICAgICAgIGlmICgoc2lkZSA+IDAgPyBmcm9tIDw9IHJQb3MgOiBmcm9tIDwgclBvcykgJiZcbiAgICAgICAgICAgICAgICAgICAgKHNpZGUgPCAwID8gdG8gPj0gclBvcyA6IHRvID4gclBvcykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJlZU5vZGUobW91bnRlZC50cmVlLCBtb3VudGVkLm92ZXJsYXlbMF0uZnJvbSArIHRoaXMuZnJvbSwgLTEsIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5leHRDaGlsZCgwLCAxLCBwb3MsIHNpZGUsIG1vZGUpO1xuICAgIH1cbiAgICBuZXh0U2lnbmlmaWNhbnRQYXJlbnQoKSB7XG4gICAgICAgIGxldCB2YWwgPSB0aGlzO1xuICAgICAgICB3aGlsZSAodmFsLnR5cGUuaXNBbm9ueW1vdXMgJiYgdmFsLl9wYXJlbnQpXG4gICAgICAgICAgICB2YWwgPSB2YWwuX3BhcmVudDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgZ2V0IHBhcmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCA/IHRoaXMuX3BhcmVudC5uZXh0U2lnbmlmaWNhbnRQYXJlbnQoKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBuZXh0U2libGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCAmJiB0aGlzLmluZGV4ID49IDAgPyB0aGlzLl9wYXJlbnQubmV4dENoaWxkKHRoaXMuaW5kZXggKyAxLCAxLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IHByZXZTaWJsaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50ICYmIHRoaXMuaW5kZXggPj0gMCA/IHRoaXMuX3BhcmVudC5uZXh0Q2hpbGQodGhpcy5pbmRleCAtIDEsIC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pIDogbnVsbDtcbiAgICB9XG4gICAgZ2V0IHRyZWUoKSB7IHJldHVybiB0aGlzLl90cmVlOyB9XG4gICAgdG9UcmVlKCkgeyByZXR1cm4gdGhpcy5fdHJlZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiB0aGlzLl90cmVlLnRvU3RyaW5nKCk7IH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkcmVuKG5vZGUsIHR5cGUsIGJlZm9yZSwgYWZ0ZXIpIHtcbiAgICBsZXQgY3VyID0gbm9kZS5jdXJzb3IoKSwgcmVzdWx0ID0gW107XG4gICAgaWYgKCFjdXIuZmlyc3RDaGlsZCgpKVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIGlmIChiZWZvcmUgIT0gbnVsbClcbiAgICAgICAgZm9yIChsZXQgZm91bmQgPSBmYWxzZTsgIWZvdW5kOykge1xuICAgICAgICAgICAgZm91bmQgPSBjdXIudHlwZS5pcyhiZWZvcmUpO1xuICAgICAgICAgICAgaWYgKCFjdXIubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoYWZ0ZXIgIT0gbnVsbCAmJiBjdXIudHlwZS5pcyhhZnRlcikpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICBpZiAoY3VyLnR5cGUuaXModHlwZSkpXG4gICAgICAgICAgICByZXN1bHQucHVzaChjdXIubm9kZSk7XG4gICAgICAgIGlmICghY3VyLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICByZXR1cm4gYWZ0ZXIgPT0gbnVsbCA/IHJlc3VsdCA6IFtdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1hdGNoTm9kZUNvbnRleHQobm9kZSwgY29udGV4dCwgaSA9IGNvbnRleHQubGVuZ3RoIC0gMSkge1xuICAgIGZvciAobGV0IHAgPSBub2RlOyBpID49IDA7IHAgPSBwLnBhcmVudCkge1xuICAgICAgICBpZiAoIXApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghcC50eXBlLmlzQW5vbnltb3VzKSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dFtpXSAmJiBjb250ZXh0W2ldICE9IHAubmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5jbGFzcyBCdWZmZXJDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIGJ1ZmZlciwgaW5kZXgsIHN0YXJ0KSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgfVxufVxuY2xhc3MgQnVmZmVyTm9kZSBleHRlbmRzIEJhc2VOb2RlIHtcbiAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMudHlwZS5uYW1lOyB9XG4gICAgZ2V0IGZyb20oKSB7IHJldHVybiB0aGlzLmNvbnRleHQuc3RhcnQgKyB0aGlzLmNvbnRleHQuYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgMV07IH1cbiAgICBnZXQgdG8oKSB7IHJldHVybiB0aGlzLmNvbnRleHQuc3RhcnQgKyB0aGlzLmNvbnRleHQuYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgMl07IH1cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBfcGFyZW50LCBpbmRleCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50O1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMudHlwZSA9IGNvbnRleHQuYnVmZmVyLnNldC50eXBlc1tjb250ZXh0LmJ1ZmZlci5idWZmZXJbaW5kZXhdXTtcbiAgICB9XG4gICAgY2hpbGQoZGlyLCBwb3MsIHNpZGUpIHtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBpbmRleCA9IGJ1ZmZlci5maW5kQ2hpbGQodGhpcy5pbmRleCArIDQsIGJ1ZmZlci5idWZmZXJbdGhpcy5pbmRleCArIDNdLCBkaXIsIHBvcyAtIHRoaXMuY29udGV4dC5zdGFydCwgc2lkZSk7XG4gICAgICAgIHJldHVybiBpbmRleCA8IDAgPyBudWxsIDogbmV3IEJ1ZmZlck5vZGUodGhpcy5jb250ZXh0LCB0aGlzLCBpbmRleCk7XG4gICAgfVxuICAgIGdldCBmaXJzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jaGlsZCgxLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgZ2V0IGxhc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY2hpbGQoLTEsIDAsIDQgLyogU2lkZS5Eb250Q2FyZSAqLyk7IH1cbiAgICBjaGlsZEFmdGVyKHBvcykgeyByZXR1cm4gdGhpcy5jaGlsZCgxLCBwb3MsIDIgLyogU2lkZS5BZnRlciAqLyk7IH1cbiAgICBjaGlsZEJlZm9yZShwb3MpIHsgcmV0dXJuIHRoaXMuY2hpbGQoLTEsIHBvcywgLTIgLyogU2lkZS5CZWZvcmUgKi8pOyB9XG4gICAgZW50ZXIocG9zLCBzaWRlLCBtb2RlID0gMCkge1xuICAgICAgICBpZiAobW9kZSAmIEl0ZXJNb2RlLkV4Y2x1ZGVCdWZmZXJzKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgaW5kZXggPSBidWZmZXIuZmluZENoaWxkKHRoaXMuaW5kZXggKyA0LCBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXSwgc2lkZSA+IDAgPyAxIDogLTEsIHBvcyAtIHRoaXMuY29udGV4dC5zdGFydCwgc2lkZSk7XG4gICAgICAgIHJldHVybiBpbmRleCA8IDAgPyBudWxsIDogbmV3IEJ1ZmZlck5vZGUodGhpcy5jb250ZXh0LCB0aGlzLCBpbmRleCk7XG4gICAgfVxuICAgIGdldCBwYXJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgfHwgdGhpcy5jb250ZXh0LnBhcmVudC5uZXh0U2lnbmlmaWNhbnRQYXJlbnQoKTtcbiAgICB9XG4gICAgZXh0ZXJuYWxTaWJsaW5nKGRpcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50ID8gbnVsbCA6IHRoaXMuY29udGV4dC5wYXJlbnQubmV4dENoaWxkKHRoaXMuY29udGV4dC5pbmRleCArIGRpciwgZGlyLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pO1xuICAgIH1cbiAgICBnZXQgbmV4dFNpYmxpbmcoKSB7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgYWZ0ZXIgPSBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXTtcbiAgICAgICAgaWYgKGFmdGVyIDwgKHRoaXMuX3BhcmVudCA/IGJ1ZmZlci5idWZmZXJbdGhpcy5fcGFyZW50LmluZGV4ICsgM10gOiBidWZmZXIuYnVmZmVyLmxlbmd0aCkpXG4gICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlck5vZGUodGhpcy5jb250ZXh0LCB0aGlzLl9wYXJlbnQsIGFmdGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZXJuYWxTaWJsaW5nKDEpO1xuICAgIH1cbiAgICBnZXQgcHJldlNpYmxpbmcoKSB7XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgcGFyZW50U3RhcnQgPSB0aGlzLl9wYXJlbnQgPyB0aGlzLl9wYXJlbnQuaW5kZXggKyA0IDogMDtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT0gcGFyZW50U3RhcnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlcm5hbFNpYmxpbmcoLTEpO1xuICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlck5vZGUodGhpcy5jb250ZXh0LCB0aGlzLl9wYXJlbnQsIGJ1ZmZlci5maW5kQ2hpbGQocGFyZW50U3RhcnQsIHRoaXMuaW5kZXgsIC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pKTtcbiAgICB9XG4gICAgZ2V0IHRyZWUoKSB7IHJldHVybiBudWxsOyB9XG4gICAgdG9UcmVlKCkge1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBbXSwgcG9zaXRpb25zID0gW107XG4gICAgICAgIGxldCB7IGJ1ZmZlciB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgc3RhcnRJID0gdGhpcy5pbmRleCArIDQsIGVuZEkgPSBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXTtcbiAgICAgICAgaWYgKGVuZEkgPiBzdGFydEkpIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgMV07XG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGJ1ZmZlci5zbGljZShzdGFydEksIGVuZEksIGZyb20pKTtcbiAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKDApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVHJlZSh0aGlzLnR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIHRoaXMudG8gLSB0aGlzLmZyb20pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmJ1ZmZlci5jaGlsZFN0cmluZyh0aGlzLmluZGV4KTsgfVxufVxuZnVuY3Rpb24gaXRlclN0YWNrKGhlYWRzKSB7XG4gICAgaWYgKCFoZWFkcy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBwaWNrID0gMCwgcGlja2VkID0gaGVhZHNbMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBoZWFkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbm9kZSA9IGhlYWRzW2ldO1xuICAgICAgICBpZiAobm9kZS5mcm9tID4gcGlja2VkLmZyb20gfHwgbm9kZS50byA8IHBpY2tlZC50bykge1xuICAgICAgICAgICAgcGlja2VkID0gbm9kZTtcbiAgICAgICAgICAgIHBpY2sgPSBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBuZXh0ID0gcGlja2VkIGluc3RhbmNlb2YgVHJlZU5vZGUgJiYgcGlja2VkLmluZGV4IDwgMCA/IG51bGwgOiBwaWNrZWQucGFyZW50O1xuICAgIGxldCBuZXdIZWFkcyA9IGhlYWRzLnNsaWNlKCk7XG4gICAgaWYgKG5leHQpXG4gICAgICAgIG5ld0hlYWRzW3BpY2tdID0gbmV4dDtcbiAgICBlbHNlXG4gICAgICAgIG5ld0hlYWRzLnNwbGljZShwaWNrLCAxKTtcbiAgICByZXR1cm4gbmV3IFN0YWNrSXRlcmF0b3IobmV3SGVhZHMsIHBpY2tlZCk7XG59XG5jbGFzcyBTdGFja0l0ZXJhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihoZWFkcywgbm9kZSkge1xuICAgICAgICB0aGlzLmhlYWRzID0gaGVhZHM7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIGdldCBuZXh0KCkgeyByZXR1cm4gaXRlclN0YWNrKHRoaXMuaGVhZHMpOyB9XG59XG5mdW5jdGlvbiBzdGFja0l0ZXJhdG9yKHRyZWUsIHBvcywgc2lkZSkge1xuICAgIGxldCBpbm5lciA9IHRyZWUucmVzb2x2ZUlubmVyKHBvcywgc2lkZSksIGxheWVycyA9IG51bGw7XG4gICAgZm9yIChsZXQgc2NhbiA9IGlubmVyIGluc3RhbmNlb2YgVHJlZU5vZGUgPyBpbm5lciA6IGlubmVyLmNvbnRleHQucGFyZW50OyBzY2FuOyBzY2FuID0gc2Nhbi5wYXJlbnQpIHtcbiAgICAgICAgaWYgKHNjYW4uaW5kZXggPCAwKSB7IC8vIFRoaXMgaXMgYW4gb3ZlcmxheSByb290XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gc2Nhbi5wYXJlbnQ7XG4gICAgICAgICAgICAobGF5ZXJzIHx8IChsYXllcnMgPSBbaW5uZXJdKSkucHVzaChwYXJlbnQucmVzb2x2ZShwb3MsIHNpZGUpKTtcbiAgICAgICAgICAgIHNjYW4gPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbW91bnQgPSBNb3VudGVkVHJlZS5nZXQoc2Nhbi50cmVlKTtcbiAgICAgICAgICAgIC8vIFJlbGV2YW50IG92ZXJsYXkgYnJhbmNoaW5nIG9mZlxuICAgICAgICAgICAgaWYgKG1vdW50ICYmIG1vdW50Lm92ZXJsYXkgJiYgbW91bnQub3ZlcmxheVswXS5mcm9tIDw9IHBvcyAmJiBtb3VudC5vdmVybGF5W21vdW50Lm92ZXJsYXkubGVuZ3RoIC0gMV0udG8gPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvb3QgPSBuZXcgVHJlZU5vZGUobW91bnQudHJlZSwgbW91bnQub3ZlcmxheVswXS5mcm9tICsgc2Nhbi5mcm9tLCAtMSwgc2Nhbik7XG4gICAgICAgICAgICAgICAgKGxheWVycyB8fCAobGF5ZXJzID0gW2lubmVyXSkpLnB1c2gocmVzb2x2ZU5vZGUocm9vdCwgcG9zLCBzaWRlLCBmYWxzZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsYXllcnMgPyBpdGVyU3RhY2sobGF5ZXJzKSA6IGlubmVyO1xufVxuLyoqXG5BIHRyZWUgY3Vyc29yIG9iamVjdCBmb2N1c2VzIG9uIGEgZ2l2ZW4gbm9kZSBpbiBhIHN5bnRheCB0cmVlLCBhbmRcbmFsbG93cyB5b3UgdG8gbW92ZSB0byBhZGphY2VudCBub2Rlcy5cbiovXG5jbGFzcyBUcmVlQ3Vyc29yIHtcbiAgICAvKipcbiAgICBTaG9ydGhhbmQgZm9yIGAudHlwZS5uYW1lYC5cbiAgICAqL1xuICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy50eXBlLm5hbWU7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5vZGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbW9kZSA9IDApIHtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5idWZmZXJOb2RlID0gbnVsbDtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBUcmVlTm9kZSkge1xuICAgICAgICAgICAgdGhpcy55aWVsZE5vZGUobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl90cmVlID0gbm9kZS5jb250ZXh0LnBhcmVudDtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbm9kZS5jb250ZXh0O1xuICAgICAgICAgICAgZm9yIChsZXQgbiA9IG5vZGUuX3BhcmVudDsgbjsgbiA9IG4uX3BhcmVudClcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnVuc2hpZnQobi5pbmRleCk7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlck5vZGUgPSBub2RlO1xuICAgICAgICAgICAgdGhpcy55aWVsZEJ1Zihub2RlLmluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB5aWVsZE5vZGUobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuX3RyZWUgPSBub2RlO1xuICAgICAgICB0aGlzLnR5cGUgPSBub2RlLnR5cGU7XG4gICAgICAgIHRoaXMuZnJvbSA9IG5vZGUuZnJvbTtcbiAgICAgICAgdGhpcy50byA9IG5vZGUudG87XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB5aWVsZEJ1ZihpbmRleCwgdHlwZSkge1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGxldCB7IHN0YXJ0LCBidWZmZXIgfSA9IHRoaXMuYnVmZmVyO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8IGJ1ZmZlci5zZXQudHlwZXNbYnVmZmVyLmJ1ZmZlcltpbmRleF1dO1xuICAgICAgICB0aGlzLmZyb20gPSBzdGFydCArIGJ1ZmZlci5idWZmZXJbaW5kZXggKyAxXTtcbiAgICAgICAgdGhpcy50byA9IHN0YXJ0ICsgYnVmZmVyLmJ1ZmZlcltpbmRleCArIDJdO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB5aWVsZChub2RlKSB7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBUcmVlTm9kZSkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGROb2RlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyID0gbm9kZS5jb250ZXh0O1xuICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1Zihub2RlLmluZGV4LCBub2RlLnR5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIgPyB0aGlzLmJ1ZmZlci5idWZmZXIuY2hpbGRTdHJpbmcodGhpcy5pbmRleCkgOiB0aGlzLl90cmVlLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZW50ZXJDaGlsZChkaXIsIHBvcywgc2lkZSkge1xuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMueWllbGQodGhpcy5fdHJlZS5uZXh0Q2hpbGQoZGlyIDwgMCA/IHRoaXMuX3RyZWUuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoIC0gMSA6IDAsIGRpciwgcG9zLCBzaWRlLCB0aGlzLm1vZGUpKTtcbiAgICAgICAgbGV0IHsgYnVmZmVyIH0gPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgbGV0IGluZGV4ID0gYnVmZmVyLmZpbmRDaGlsZCh0aGlzLmluZGV4ICsgNCwgYnVmZmVyLmJ1ZmZlclt0aGlzLmluZGV4ICsgM10sIGRpciwgcG9zIC0gdGhpcy5idWZmZXIuc3RhcnQsIHNpZGUpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5pbmRleCk7XG4gICAgICAgIHJldHVybiB0aGlzLnlpZWxkQnVmKGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSB0aGUgY3Vyc29yIHRvIHRoaXMgbm9kZSdzIGZpcnN0IGNoaWxkLiBXaGVuIHRoaXMgcmV0dXJuc1xuICAgIGZhbHNlLCB0aGUgbm9kZSBoYXMgbm8gY2hpbGQsIGFuZCB0aGUgY3Vyc29yIGhhcyBub3QgYmVlbiBtb3ZlZC5cbiAgICAqL1xuICAgIGZpcnN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmVudGVyQ2hpbGQoMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGlzIG5vZGUncyBsYXN0IGNoaWxkLlxuICAgICovXG4gICAgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5lbnRlckNoaWxkKC0xLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBmaXJzdCBjaGlsZCB0aGF0IGVuZHMgYWZ0ZXIgYHBvc2AuXG4gICAgKi9cbiAgICBjaGlsZEFmdGVyKHBvcykgeyByZXR1cm4gdGhpcy5lbnRlckNoaWxkKDEsIHBvcywgMiAvKiBTaWRlLkFmdGVyICovKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIGxhc3QgY2hpbGQgdGhhdCBzdGFydHMgYmVmb3JlIGBwb3NgLlxuICAgICovXG4gICAgY2hpbGRCZWZvcmUocG9zKSB7IHJldHVybiB0aGlzLmVudGVyQ2hpbGQoLTEsIHBvcywgLTIgLyogU2lkZS5CZWZvcmUgKi8pOyB9XG4gICAgLyoqXG4gICAgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBjaGlsZCBhcm91bmQgYHBvc2AuIElmIHNpZGUgaXMgLTEgdGhlXG4gICAgY2hpbGQgbWF5IGVuZCBhdCB0aGF0IHBvc2l0aW9uLCB3aGVuIDEgaXQgbWF5IHN0YXJ0IHRoZXJlLiBUaGlzXG4gICAgd2lsbCBhbHNvIGVudGVyIFtvdmVybGFpZF0oI2NvbW1vbi5Nb3VudGVkVHJlZS5vdmVybGF5KVxuICAgIFttb3VudGVkXSgjY29tbW9uLk5vZGVQcm9wXm1vdW50ZWQpIHRyZWVzIHVubGVzcyBgb3ZlcmxheXNgIGlzXG4gICAgc2V0IHRvIGZhbHNlLlxuICAgICovXG4gICAgZW50ZXIocG9zLCBzaWRlLCBtb2RlID0gdGhpcy5tb2RlKSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZCh0aGlzLl90cmVlLmVudGVyKHBvcywgc2lkZSwgbW9kZSkpO1xuICAgICAgICByZXR1cm4gbW9kZSAmIEl0ZXJNb2RlLkV4Y2x1ZGVCdWZmZXJzID8gZmFsc2UgOiB0aGlzLmVudGVyQ2hpbGQoMSwgcG9zLCBzaWRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGUgbm9kZSdzIHBhcmVudCBub2RlLCBpZiB0aGlzIGlzbid0IHRoZSB0b3Agbm9kZS5cbiAgICAqL1xuICAgIHBhcmVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkTm9kZSgodGhpcy5tb2RlICYgSXRlck1vZGUuSW5jbHVkZUFub255bW91cykgPyB0aGlzLl90cmVlLl9wYXJlbnQgOiB0aGlzLl90cmVlLnBhcmVudCk7XG4gICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkQnVmKHRoaXMuc3RhY2sucG9wKCkpO1xuICAgICAgICBsZXQgcGFyZW50ID0gKHRoaXMubW9kZSAmIEl0ZXJNb2RlLkluY2x1ZGVBbm9ueW1vdXMpID8gdGhpcy5idWZmZXIucGFyZW50IDogdGhpcy5idWZmZXIucGFyZW50Lm5leHRTaWduaWZpY2FudFBhcmVudCgpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLnlpZWxkTm9kZShwYXJlbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNpYmxpbmcoZGlyKSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuX3RyZWUuX3BhcmVudCA/IGZhbHNlXG4gICAgICAgICAgICAgICAgOiB0aGlzLnlpZWxkKHRoaXMuX3RyZWUuaW5kZXggPCAwID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX3RyZWUuX3BhcmVudC5uZXh0Q2hpbGQodGhpcy5fdHJlZS5pbmRleCArIGRpciwgZGlyLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8sIHRoaXMubW9kZSkpO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuYnVmZmVyLCBkID0gdGhpcy5zdGFjay5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoZGlyIDwgMCkge1xuICAgICAgICAgICAgbGV0IHBhcmVudFN0YXJ0ID0gZCA8IDAgPyAwIDogdGhpcy5zdGFja1tkXSArIDQ7XG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleCAhPSBwYXJlbnRTdGFydClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy55aWVsZEJ1ZihidWZmZXIuZmluZENoaWxkKHBhcmVudFN0YXJ0LCB0aGlzLmluZGV4LCAtMSwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBidWZmZXIuYnVmZmVyW3RoaXMuaW5kZXggKyAzXTtcbiAgICAgICAgICAgIGlmIChhZnRlciA8IChkIDwgMCA/IGJ1ZmZlci5idWZmZXIubGVuZ3RoIDogYnVmZmVyLmJ1ZmZlclt0aGlzLnN0YWNrW2RdICsgM10pKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnlpZWxkQnVmKGFmdGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZCA8IDAgPyB0aGlzLnlpZWxkKHRoaXMuYnVmZmVyLnBhcmVudC5uZXh0Q2hpbGQodGhpcy5idWZmZXIuaW5kZXggKyBkaXIsIGRpciwgMCwgNCAvKiBTaWRlLkRvbnRDYXJlICovLCB0aGlzLm1vZGUpKSA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoaXMgbm9kZSdzIG5leHQgc2libGluZywgaWYgYW55LlxuICAgICovXG4gICAgbmV4dFNpYmxpbmcoKSB7IHJldHVybiB0aGlzLnNpYmxpbmcoMSk7IH1cbiAgICAvKipcbiAgICBNb3ZlIHRvIHRoaXMgbm9kZSdzIHByZXZpb3VzIHNpYmxpbmcsIGlmIGFueS5cbiAgICAqL1xuICAgIHByZXZTaWJsaW5nKCkgeyByZXR1cm4gdGhpcy5zaWJsaW5nKC0xKTsgfVxuICAgIGF0TGFzdE5vZGUoZGlyKSB7XG4gICAgICAgIGxldCBpbmRleCwgcGFyZW50LCB7IGJ1ZmZlciB9ID0gdGhpcztcbiAgICAgICAgaWYgKGJ1ZmZlcikge1xuICAgICAgICAgICAgaWYgKGRpciA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmRleCA8IGJ1ZmZlci5idWZmZXIuYnVmZmVyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmluZGV4OyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIuYnVmZmVyLmJ1ZmZlcltpICsgM10gPCB0aGlzLmluZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKHsgaW5kZXgsIHBhcmVudCB9ID0gYnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICh7IGluZGV4LCBfcGFyZW50OiBwYXJlbnQgfSA9IHRoaXMuX3RyZWUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyBwYXJlbnQ7IHsgaW5kZXgsIF9wYXJlbnQ6IHBhcmVudCB9ID0gcGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gaW5kZXggKyBkaXIsIGUgPSBkaXIgPCAwID8gLTEgOiBwYXJlbnQuX3RyZWUuY2hpbGRyZW4ubGVuZ3RoOyBpICE9IGU7IGkgKz0gZGlyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IHBhcmVudC5fdHJlZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLm1vZGUgJiBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgaW5zdGFuY2VvZiBUcmVlQnVmZmVyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhY2hpbGQudHlwZS5pc0Fub255bW91cyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2hpbGQoY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbW92ZShkaXIsIGVudGVyKSB7XG4gICAgICAgIGlmIChlbnRlciAmJiB0aGlzLmVudGVyQ2hpbGQoZGlyLCAwLCA0IC8qIFNpZGUuRG9udENhcmUgKi8pKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNpYmxpbmcoZGlyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmF0TGFzdE5vZGUoZGlyKSB8fCAhdGhpcy5wYXJlbnQoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGUgbmV4dCBub2RlIGluIGFcbiAgICBbcHJlLW9yZGVyXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UcmVlX3RyYXZlcnNhbCNQcmUtb3JkZXIsX05MUilcbiAgICB0cmF2ZXJzYWwsIGdvaW5nIGZyb20gYSBub2RlIHRvIGl0cyBmaXJzdCBjaGlsZCBvciwgaWYgdGhlXG4gICAgY3VycmVudCBub2RlIGlzIGVtcHR5IG9yIGBlbnRlcmAgaXMgZmFsc2UsIGl0cyBuZXh0IHNpYmxpbmcgb3JcbiAgICB0aGUgbmV4dCBzaWJsaW5nIG9mIHRoZSBmaXJzdCBwYXJlbnQgbm9kZSB0aGF0IGhhcyBvbmUuXG4gICAgKi9cbiAgICBuZXh0KGVudGVyID0gdHJ1ZSkgeyByZXR1cm4gdGhpcy5tb3ZlKDEsIGVudGVyKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5leHQgbm9kZSBpbiBhIGxhc3QtdG8tZmlyc3QgcHJlLW9yZGVyIHRyYXZlcnNhbC4gQVxuICAgIG5vZGUgaXMgZm9sbG93ZWQgYnkgaXRzIGxhc3QgY2hpbGQgb3IsIGlmIGl0IGhhcyBub25lLCBpdHNcbiAgICBwcmV2aW91cyBzaWJsaW5nIG9yIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIHRoZSBmaXJzdCBwYXJlbnRcbiAgICBub2RlIHRoYXQgaGFzIG9uZS5cbiAgICAqL1xuICAgIHByZXYoZW50ZXIgPSB0cnVlKSB7IHJldHVybiB0aGlzLm1vdmUoLTEsIGVudGVyKTsgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgaW5uZXJtb3N0IG5vZGUgdGhhdCBjb3ZlcnMgYHBvc2AuIElmXG4gICAgYHNpZGVgIGlzIC0xLCBpdCB3aWxsIGVudGVyIG5vZGVzIHRoYXQgZW5kIGF0IGBwb3NgLiBJZiBpdCBpcyAxLFxuICAgIGl0IHdpbGwgZW50ZXIgbm9kZXMgdGhhdCBzdGFydCBhdCBgcG9zYC5cbiAgICAqL1xuICAgIG1vdmVUbyhwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIC8vIE1vdmUgdXAgdG8gYSBub2RlIHRoYXQgYWN0dWFsbHkgaG9sZHMgdGhlIHBvc2l0aW9uLCBpZiBwb3NzaWJsZVxuICAgICAgICB3aGlsZSAodGhpcy5mcm9tID09IHRoaXMudG8gfHxcbiAgICAgICAgICAgIChzaWRlIDwgMSA/IHRoaXMuZnJvbSA+PSBwb3MgOiB0aGlzLmZyb20gPiBwb3MpIHx8XG4gICAgICAgICAgICAoc2lkZSA+IC0xID8gdGhpcy50byA8PSBwb3MgOiB0aGlzLnRvIDwgcG9zKSlcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJlbnQoKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gVGhlbiBzY2FuIGRvd24gaW50byBjaGlsZCBub2RlcyBhcyBmYXIgYXMgcG9zc2libGVcbiAgICAgICAgd2hpbGUgKHRoaXMuZW50ZXJDaGlsZCgxLCBwb3MsIHNpZGUpKSB7IH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIFtzeW50YXggbm9kZV0oI2NvbW1vbi5TeW50YXhOb2RlKSBhdCB0aGUgY3Vyc29yJ3MgY3VycmVudFxuICAgIHBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IG5vZGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5idWZmZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJlZTtcbiAgICAgICAgbGV0IGNhY2hlID0gdGhpcy5idWZmZXJOb2RlLCByZXN1bHQgPSBudWxsLCBkZXB0aCA9IDA7XG4gICAgICAgIGlmIChjYWNoZSAmJiBjYWNoZS5jb250ZXh0ID09IHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgICBzY2FuOiBmb3IgKGxldCBpbmRleCA9IHRoaXMuaW5kZXgsIGQgPSB0aGlzLnN0YWNrLmxlbmd0aDsgZCA+PSAwOykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSBjYWNoZTsgYzsgYyA9IGMuX3BhcmVudClcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMuaW5kZXggPT0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSB0aGlzLmluZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0gZCArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzY2FuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5kZXggPSB0aGlzLnN0YWNrWy0tZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IGRlcHRoOyBpIDwgdGhpcy5zdGFjay5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBCdWZmZXJOb2RlKHRoaXMuYnVmZmVyLCByZXN1bHQsIHRoaXMuc3RhY2tbaV0pO1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXJOb2RlID0gbmV3IEJ1ZmZlck5vZGUodGhpcy5idWZmZXIsIHJlc3VsdCwgdGhpcy5pbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgW3RyZWVdKCNjb21tb24uVHJlZSkgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IG5vZGUsIGlmXG4gICAgYW55LiBXaWxsIHJldHVybiBudWxsIHdoZW4gdGhlIG5vZGUgaXMgaW4gYSBbdHJlZVxuICAgIGJ1ZmZlcl0oI2NvbW1vbi5UcmVlQnVmZmVyKS5cbiAgICAqL1xuICAgIGdldCB0cmVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIgPyBudWxsIDogdGhpcy5fdHJlZS5fdHJlZTtcbiAgICB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIHRoZSBjdXJyZW50IG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMsIGNhbGxpbmdcbiAgICBgZW50ZXJgIHdoZW4gZW50ZXJpbmcgYSBub2RlIGFuZCBgbGVhdmVgLCBpZiBnaXZlbiwgd2hlbiBsZWF2aW5nXG4gICAgb25lLiBXaGVuIGBlbnRlcmAgcmV0dXJucyBgZmFsc2VgLCBhbnkgY2hpbGRyZW4gb2YgdGhhdCBub2RlIGFyZVxuICAgIHNraXBwZWQsIGFuZCBgbGVhdmVgIGlzbid0IGNhbGxlZCBmb3IgaXQuXG4gICAgKi9cbiAgICBpdGVyYXRlKGVudGVyLCBsZWF2ZSkge1xuICAgICAgICBmb3IgKGxldCBkZXB0aCA9IDA7Oykge1xuICAgICAgICAgICAgbGV0IG11c3RMZWF2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZS5pc0Fub255bW91cyB8fCBlbnRlcih0aGlzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maXJzdENoaWxkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy50eXBlLmlzQW5vbnltb3VzKVxuICAgICAgICAgICAgICAgICAgICBtdXN0TGVhdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGlmIChtdXN0TGVhdmUgJiYgbGVhdmUpXG4gICAgICAgICAgICAgICAgICAgIGxlYXZlKHRoaXMpO1xuICAgICAgICAgICAgICAgIG11c3RMZWF2ZSA9IHRoaXMudHlwZS5pc0Fub255bW91cztcbiAgICAgICAgICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubmV4dFNpYmxpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQoKTtcbiAgICAgICAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICAgICAgICAgIG11c3RMZWF2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoZSBjdXJyZW50IG5vZGUgbWF0Y2hlcyBhIGdpdmVuIGNvbnRleHRcdTIwMTRhIHNlcXVlbmNlXG4gICAgb2YgZGlyZWN0IHBhcmVudCBub2RlIG5hbWVzLiBFbXB0eSBzdHJpbmdzIGluIHRoZSBjb250ZXh0IGFycmF5XG4gICAgYXJlIHRyZWF0ZWQgYXMgd2lsZGNhcmRzLlxuICAgICovXG4gICAgbWF0Y2hDb250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1ZmZlcilcbiAgICAgICAgICAgIHJldHVybiBtYXRjaE5vZGVDb250ZXh0KHRoaXMubm9kZS5wYXJlbnQsIGNvbnRleHQpO1xuICAgICAgICBsZXQgeyBidWZmZXIgfSA9IHRoaXMuYnVmZmVyLCB7IHR5cGVzIH0gPSBidWZmZXIuc2V0O1xuICAgICAgICBmb3IgKGxldCBpID0gY29udGV4dC5sZW5ndGggLSAxLCBkID0gdGhpcy5zdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGQtLSkge1xuICAgICAgICAgICAgaWYgKGQgPCAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaE5vZGVDb250ZXh0KHRoaXMuX3RyZWUsIGNvbnRleHQsIGkpO1xuICAgICAgICAgICAgbGV0IHR5cGUgPSB0eXBlc1tidWZmZXIuYnVmZmVyW3RoaXMuc3RhY2tbZF1dXTtcbiAgICAgICAgICAgIGlmICghdHlwZS5pc0Fub255bW91cykge1xuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0W2ldICYmIGNvbnRleHRbaV0gIT0gdHlwZS5uYW1lKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhc0NoaWxkKHRyZWUpIHtcbiAgICByZXR1cm4gdHJlZS5jaGlsZHJlbi5zb21lKGNoID0+IGNoIGluc3RhbmNlb2YgVHJlZUJ1ZmZlciB8fCAhY2gudHlwZS5pc0Fub255bW91cyB8fCBoYXNDaGlsZChjaCkpO1xufVxuZnVuY3Rpb24gYnVpbGRUcmVlKGRhdGEpIHtcbiAgICB2YXIgX2E7XG4gICAgbGV0IHsgYnVmZmVyLCBub2RlU2V0LCBtYXhCdWZmZXJMZW5ndGggPSBEZWZhdWx0QnVmZmVyTGVuZ3RoLCByZXVzZWQgPSBbXSwgbWluUmVwZWF0VHlwZSA9IG5vZGVTZXQudHlwZXMubGVuZ3RoIH0gPSBkYXRhO1xuICAgIGxldCBjdXJzb3IgPSBBcnJheS5pc0FycmF5KGJ1ZmZlcikgPyBuZXcgRmxhdEJ1ZmZlckN1cnNvcihidWZmZXIsIGJ1ZmZlci5sZW5ndGgpIDogYnVmZmVyO1xuICAgIGxldCB0eXBlcyA9IG5vZGVTZXQudHlwZXM7XG4gICAgbGV0IGNvbnRleHRIYXNoID0gMCwgbG9va0FoZWFkID0gMDtcbiAgICBmdW5jdGlvbiB0YWtlTm9kZShwYXJlbnRTdGFydCwgbWluUG9zLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBpblJlcGVhdCwgZGVwdGgpIHtcbiAgICAgICAgbGV0IHsgaWQsIHN0YXJ0LCBlbmQsIHNpemUgfSA9IGN1cnNvcjtcbiAgICAgICAgbGV0IGxvb2tBaGVhZEF0U3RhcnQgPSBsb29rQWhlYWQsIGNvbnRleHRBdFN0YXJ0ID0gY29udGV4dEhhc2g7XG4gICAgICAgIHdoaWxlIChzaXplIDwgMCkge1xuICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgIGlmIChzaXplID09IC0xIC8qIFNwZWNpYWxSZWNvcmQuUmV1c2UgKi8pIHtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHJldXNlZFtpZF07XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbnMucHVzaChzdGFydCAtIHBhcmVudFN0YXJ0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzaXplID09IC0zIC8qIFNwZWNpYWxSZWNvcmQuQ29udGV4dENoYW5nZSAqLykgeyAvLyBDb250ZXh0IGNoYW5nZVxuICAgICAgICAgICAgICAgIGNvbnRleHRIYXNoID0gaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAtNCAvKiBTcGVjaWFsUmVjb3JkLkxvb2tBaGVhZCAqLykge1xuICAgICAgICAgICAgICAgIGxvb2tBaGVhZCA9IGlkO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbnJlY29nbml6ZWQgcmVjb3JkIHNpemU6ICR7c2l6ZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdHlwZSA9IHR5cGVzW2lkXSwgbm9kZSwgYnVmZmVyO1xuICAgICAgICBsZXQgc3RhcnRQb3MgPSBzdGFydCAtIHBhcmVudFN0YXJ0O1xuICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPD0gbWF4QnVmZmVyTGVuZ3RoICYmIChidWZmZXIgPSBmaW5kQnVmZmVyU2l6ZShjdXJzb3IucG9zIC0gbWluUG9zLCBpblJlcGVhdCkpKSB7XG4gICAgICAgICAgICAvLyBTbWFsbCBlbm91Z2ggZm9yIGEgYnVmZmVyLCBhbmQgbm8gcmV1c2VkIG5vZGVzIGluc2lkZVxuICAgICAgICAgICAgbGV0IGRhdGEgPSBuZXcgVWludDE2QXJyYXkoYnVmZmVyLnNpemUgLSBidWZmZXIuc2tpcCk7XG4gICAgICAgICAgICBsZXQgZW5kUG9zID0gY3Vyc29yLnBvcyAtIGJ1ZmZlci5zaXplLCBpbmRleCA9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5wb3MgPiBlbmRQb3MpXG4gICAgICAgICAgICAgICAgaW5kZXggPSBjb3B5VG9CdWZmZXIoYnVmZmVyLnN0YXJ0LCBkYXRhLCBpbmRleCk7XG4gICAgICAgICAgICBub2RlID0gbmV3IFRyZWVCdWZmZXIoZGF0YSwgZW5kIC0gYnVmZmVyLnN0YXJ0LCBub2RlU2V0KTtcbiAgICAgICAgICAgIHN0YXJ0UG9zID0gYnVmZmVyLnN0YXJ0IC0gcGFyZW50U3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIE1ha2UgaXQgYSBub2RlXG4gICAgICAgICAgICBsZXQgZW5kUG9zID0gY3Vyc29yLnBvcyAtIHNpemU7XG4gICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgbGV0IGxvY2FsQ2hpbGRyZW4gPSBbXSwgbG9jYWxQb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGxldCBsb2NhbEluUmVwZWF0ID0gaWQgPj0gbWluUmVwZWF0VHlwZSA/IGlkIDogLTE7XG4gICAgICAgICAgICBsZXQgbGFzdEdyb3VwID0gMCwgbGFzdEVuZCA9IGVuZDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJzb3IucG9zID4gZW5kUG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsSW5SZXBlYXQgPj0gMCAmJiBjdXJzb3IuaWQgPT0gbG9jYWxJblJlcGVhdCAmJiBjdXJzb3Iuc2l6ZSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZW5kIDw9IGxhc3RFbmQgLSBtYXhCdWZmZXJMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VSZXBlYXRMZWFmKGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCBzdGFydCwgbGFzdEdyb3VwLCBjdXJzb3IuZW5kLCBsYXN0RW5kLCBsb2NhbEluUmVwZWF0LCBsb29rQWhlYWRBdFN0YXJ0LCBjb250ZXh0QXRTdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0R3JvdXAgPSBsb2NhbENoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFbmQgPSBjdXJzb3IuZW5kO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlcHRoID4gMjUwMCAvKiBDdXRPZmYuRGVwdGggKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgdGFrZUZsYXROb2RlKHN0YXJ0LCBlbmRQb3MsIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRha2VOb2RlKHN0YXJ0LCBlbmRQb3MsIGxvY2FsQ2hpbGRyZW4sIGxvY2FsUG9zaXRpb25zLCBsb2NhbEluUmVwZWF0LCBkZXB0aCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsb2NhbEluUmVwZWF0ID49IDAgJiYgbGFzdEdyb3VwID4gMCAmJiBsYXN0R3JvdXAgPCBsb2NhbENoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgICAgICAgICBtYWtlUmVwZWF0TGVhZihsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgc3RhcnQsIGxhc3RHcm91cCwgc3RhcnQsIGxhc3RFbmQsIGxvY2FsSW5SZXBlYXQsIGxvb2tBaGVhZEF0U3RhcnQsIGNvbnRleHRBdFN0YXJ0KTtcbiAgICAgICAgICAgIGxvY2FsQ2hpbGRyZW4ucmV2ZXJzZSgpO1xuICAgICAgICAgICAgbG9jYWxQb3NpdGlvbnMucmV2ZXJzZSgpO1xuICAgICAgICAgICAgaWYgKGxvY2FsSW5SZXBlYXQgPiAtMSAmJiBsYXN0R3JvdXAgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1ha2UgPSBtYWtlQmFsYW5jZWQodHlwZSwgY29udGV4dEF0U3RhcnQpO1xuICAgICAgICAgICAgICAgIG5vZGUgPSBiYWxhbmNlUmFuZ2UodHlwZSwgbG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIDAsIGxvY2FsQ2hpbGRyZW4ubGVuZ3RoLCAwLCBlbmQgLSBzdGFydCwgbWFrZSwgbWFrZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbWFrZVRyZWUodHlwZSwgbG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIGVuZCAtIHN0YXJ0LCBsb29rQWhlYWRBdFN0YXJ0IC0gZW5kLCBjb250ZXh0QXRTdGFydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgcG9zaXRpb25zLnB1c2goc3RhcnRQb3MpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0YWtlRmxhdE5vZGUocGFyZW50U3RhcnQsIG1pblBvcywgY2hpbGRyZW4sIHBvc2l0aW9ucykge1xuICAgICAgICBsZXQgbm9kZXMgPSBbXTsgLy8gVGVtcG9yYXJ5LCBpbnZlcnRlZCBhcnJheSBvZiBsZWFmIG5vZGVzIGZvdW5kLCB3aXRoIGFic29sdXRlIHBvc2l0aW9uc1xuICAgICAgICBsZXQgbm9kZUNvdW50ID0gMCwgc3RvcEF0ID0gLTE7XG4gICAgICAgIHdoaWxlIChjdXJzb3IucG9zID4gbWluUG9zKSB7XG4gICAgICAgICAgICBsZXQgeyBpZCwgc3RhcnQsIGVuZCwgc2l6ZSB9ID0gY3Vyc29yO1xuICAgICAgICAgICAgaWYgKHNpemUgPiA0KSB7IC8vIE5vdCBhIGxlYWZcbiAgICAgICAgICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RvcEF0ID4gLTEgJiYgc3RhcnQgPCBzdG9wQXQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzdG9wQXQgPCAwKVxuICAgICAgICAgICAgICAgICAgICBzdG9wQXQgPSBlbmQgLSBtYXhCdWZmZXJMZW5ndGg7XG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChpZCwgc3RhcnQsIGVuZCk7XG4gICAgICAgICAgICAgICAgbm9kZUNvdW50Kys7XG4gICAgICAgICAgICAgICAgY3Vyc29yLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZUNvdW50KSB7XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gbmV3IFVpbnQxNkFycmF5KG5vZGVDb3VudCAqIDQpO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gbm9kZXNbbm9kZXMubGVuZ3RoIC0gMl07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbm9kZXMubGVuZ3RoIC0gMywgaiA9IDA7IGkgPj0gMDsgaSAtPSAzKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2orK10gPSBub2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBidWZmZXJbaisrXSA9IG5vZGVzW2kgKyAxXSAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gbm9kZXNbaSArIDJdIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2orK10gPSBqO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChuZXcgVHJlZUJ1ZmZlcihidWZmZXIsIG5vZGVzWzJdIC0gc3RhcnQsIG5vZGVTZXQpKTtcbiAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHN0YXJ0IC0gcGFyZW50U3RhcnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1ha2VCYWxhbmNlZCh0eXBlLCBjb250ZXh0SGFzaCkge1xuICAgICAgICByZXR1cm4gKGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCkgPT4ge1xuICAgICAgICAgICAgbGV0IGxvb2tBaGVhZCA9IDAsIGxhc3RJID0gY2hpbGRyZW4ubGVuZ3RoIC0gMSwgbGFzdCwgbG9va0FoZWFkUHJvcDtcbiAgICAgICAgICAgIGlmIChsYXN0SSA+PSAwICYmIChsYXN0ID0gY2hpbGRyZW5bbGFzdEldKSBpbnN0YW5jZW9mIFRyZWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWxhc3RJICYmIGxhc3QudHlwZSA9PSB0eXBlICYmIGxhc3QubGVuZ3RoID09IGxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgICAgICAgICAgICAgaWYgKGxvb2tBaGVhZFByb3AgPSBsYXN0LnByb3AoTm9kZVByb3AubG9va0FoZWFkKSlcbiAgICAgICAgICAgICAgICAgICAgbG9va0FoZWFkID0gcG9zaXRpb25zW2xhc3RJXSArIGxhc3QubGVuZ3RoICsgbG9va0FoZWFkUHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYWtlVHJlZSh0eXBlLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBsZW5ndGgsIGxvb2tBaGVhZCwgY29udGV4dEhhc2gpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYWtlUmVwZWF0TGVhZihjaGlsZHJlbiwgcG9zaXRpb25zLCBiYXNlLCBpLCBmcm9tLCB0bywgdHlwZSwgbG9va0FoZWFkLCBjb250ZXh0SGFzaCkge1xuICAgICAgICBsZXQgbG9jYWxDaGlsZHJlbiA9IFtdLCBsb2NhbFBvc2l0aW9ucyA9IFtdO1xuICAgICAgICB3aGlsZSAoY2hpbGRyZW4ubGVuZ3RoID4gaSkge1xuICAgICAgICAgICAgbG9jYWxDaGlsZHJlbi5wdXNoKGNoaWxkcmVuLnBvcCgpKTtcbiAgICAgICAgICAgIGxvY2FsUG9zaXRpb25zLnB1c2gocG9zaXRpb25zLnBvcCgpICsgYmFzZSAtIGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuLnB1c2gobWFrZVRyZWUobm9kZVNldC50eXBlc1t0eXBlXSwgbG9jYWxDaGlsZHJlbiwgbG9jYWxQb3NpdGlvbnMsIHRvIC0gZnJvbSwgbG9va0FoZWFkIC0gdG8sIGNvbnRleHRIYXNoKSk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKGZyb20gLSBiYXNlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFrZVRyZWUodHlwZSwgY2hpbGRyZW4sIHBvc2l0aW9ucywgbGVuZ3RoLCBsb29rQWhlYWQsIGNvbnRleHRIYXNoLCBwcm9wcykge1xuICAgICAgICBpZiAoY29udGV4dEhhc2gpIHtcbiAgICAgICAgICAgIGxldCBwYWlyID0gW05vZGVQcm9wLmNvbnRleHRIYXNoLCBjb250ZXh0SGFzaF07XG4gICAgICAgICAgICBwcm9wcyA9IHByb3BzID8gW3BhaXJdLmNvbmNhdChwcm9wcykgOiBbcGFpcl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvb2tBaGVhZCA+IDI1KSB7XG4gICAgICAgICAgICBsZXQgcGFpciA9IFtOb2RlUHJvcC5sb29rQWhlYWQsIGxvb2tBaGVhZF07XG4gICAgICAgICAgICBwcm9wcyA9IHByb3BzID8gW3BhaXJdLmNvbmNhdChwcm9wcykgOiBbcGFpcl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlKHR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCwgcHJvcHMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5kQnVmZmVyU2l6ZShtYXhTaXplLCBpblJlcGVhdCkge1xuICAgICAgICAvLyBTY2FuIHRocm91Z2ggdGhlIGJ1ZmZlciB0byBmaW5kIHByZXZpb3VzIHNpYmxpbmdzIHRoYXQgZml0XG4gICAgICAgIC8vIHRvZ2V0aGVyIGluIGEgVHJlZUJ1ZmZlciwgYW5kIGRvbid0IGNvbnRhaW4gYW55IHJldXNlZCBub2Rlc1xuICAgICAgICAvLyAod2hpY2ggY2FuJ3QgYmUgc3RvcmVkIGluIGEgYnVmZmVyKS5cbiAgICAgICAgLy8gSWYgYGluUmVwZWF0YCBpcyA+IC0xLCBpZ25vcmUgbm9kZSBib3VuZGFyaWVzIG9mIHRoYXQgdHlwZSBmb3JcbiAgICAgICAgLy8gbmVzdGluZywgYnV0IG1ha2Ugc3VyZSB0aGUgZW5kIGZhbGxzIGVpdGhlciBhdCB0aGUgc3RhcnRcbiAgICAgICAgLy8gKGBtYXhTaXplYCkgb3IgYmVmb3JlIHN1Y2ggYSBub2RlLlxuICAgICAgICBsZXQgZm9yayA9IGN1cnNvci5mb3JrKCk7XG4gICAgICAgIGxldCBzaXplID0gMCwgc3RhcnQgPSAwLCBza2lwID0gMCwgbWluU3RhcnQgPSBmb3JrLmVuZCAtIG1heEJ1ZmZlckxlbmd0aDtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgc2l6ZTogMCwgc3RhcnQ6IDAsIHNraXA6IDAgfTtcbiAgICAgICAgc2NhbjogZm9yIChsZXQgbWluUG9zID0gZm9yay5wb3MgLSBtYXhTaXplOyBmb3JrLnBvcyA+IG1pblBvczspIHtcbiAgICAgICAgICAgIGxldCBub2RlU2l6ZSA9IGZvcmsuc2l6ZTtcbiAgICAgICAgICAgIC8vIFByZXRlbmQgbmVzdGVkIHJlcGVhdCBub2RlcyBvZiB0aGUgc2FtZSB0eXBlIGRvbid0IGV4aXN0XG4gICAgICAgICAgICBpZiAoZm9yay5pZCA9PSBpblJlcGVhdCAmJiBub2RlU2l6ZSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gRXhjZXB0IHRoYXQgd2Ugc3RvcmUgdGhlIGN1cnJlbnQgc3RhdGUgYXMgYSB2YWxpZCByZXR1cm5cbiAgICAgICAgICAgICAgICAvLyB2YWx1ZS5cbiAgICAgICAgICAgICAgICByZXN1bHQuc2l6ZSA9IHNpemU7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnNraXAgPSBza2lwO1xuICAgICAgICAgICAgICAgIHNraXAgKz0gNDtcbiAgICAgICAgICAgICAgICBzaXplICs9IDQ7XG4gICAgICAgICAgICAgICAgZm9yay5uZXh0KCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3RhcnRQb3MgPSBmb3JrLnBvcyAtIG5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKG5vZGVTaXplIDwgMCB8fCBzdGFydFBvcyA8IG1pblBvcyB8fCBmb3JrLnN0YXJ0IDwgbWluU3RhcnQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgbG9jYWxTa2lwcGVkID0gZm9yay5pZCA+PSBtaW5SZXBlYXRUeXBlID8gNCA6IDA7XG4gICAgICAgICAgICBsZXQgbm9kZVN0YXJ0ID0gZm9yay5zdGFydDtcbiAgICAgICAgICAgIGZvcmsubmV4dCgpO1xuICAgICAgICAgICAgd2hpbGUgKGZvcmsucG9zID4gc3RhcnRQb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoZm9yay5zaXplIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9yay5zaXplID09IC0zIC8qIFNwZWNpYWxSZWNvcmQuQ29udGV4dENoYW5nZSAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU2tpcHBlZCArPSA0O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzY2FuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmb3JrLmlkID49IG1pblJlcGVhdFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTa2lwcGVkICs9IDQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvcmsubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhcnQgPSBub2RlU3RhcnQ7XG4gICAgICAgICAgICBzaXplICs9IG5vZGVTaXplO1xuICAgICAgICAgICAgc2tpcCArPSBsb2NhbFNraXBwZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluUmVwZWF0IDwgMCB8fCBzaXplID09IG1heFNpemUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zaXplID0gc2l6ZTtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydCA9IHN0YXJ0O1xuICAgICAgICAgICAgcmVzdWx0LnNraXAgPSBza2lwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuc2l6ZSA+IDQgPyByZXN1bHQgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvcHlUb0J1ZmZlcihidWZmZXJTdGFydCwgYnVmZmVyLCBpbmRleCkge1xuICAgICAgICBsZXQgeyBpZCwgc3RhcnQsIGVuZCwgc2l6ZSB9ID0gY3Vyc29yO1xuICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgICAgICBpZiAoc2l6ZSA+PSAwICYmIGlkIDwgbWluUmVwZWF0VHlwZSkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIGlmIChzaXplID4gNCkge1xuICAgICAgICAgICAgICAgIGxldCBlbmRQb3MgPSBjdXJzb3IucG9zIC0gKHNpemUgLSA0KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3Vyc29yLnBvcyA+IGVuZFBvcylcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBjb3B5VG9CdWZmZXIoYnVmZmVyU3RhcnQsIGJ1ZmZlciwgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZmVyWy0taW5kZXhdID0gc3RhcnRJbmRleDtcbiAgICAgICAgICAgIGJ1ZmZlclstLWluZGV4XSA9IGVuZCAtIGJ1ZmZlclN0YXJ0O1xuICAgICAgICAgICAgYnVmZmVyWy0taW5kZXhdID0gc3RhcnQgLSBidWZmZXJTdGFydDtcbiAgICAgICAgICAgIGJ1ZmZlclstLWluZGV4XSA9IGlkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNpemUgPT0gLTMgLyogU3BlY2lhbFJlY29yZC5Db250ZXh0Q2hhbmdlICovKSB7XG4gICAgICAgICAgICBjb250ZXh0SGFzaCA9IGlkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNpemUgPT0gLTQgLyogU3BlY2lhbFJlY29yZC5Mb29rQWhlYWQgKi8pIHtcbiAgICAgICAgICAgIGxvb2tBaGVhZCA9IGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgbGV0IGNoaWxkcmVuID0gW10sIHBvc2l0aW9ucyA9IFtdO1xuICAgIHdoaWxlIChjdXJzb3IucG9zID4gMClcbiAgICAgICAgdGFrZU5vZGUoZGF0YS5zdGFydCB8fCAwLCBkYXRhLmJ1ZmZlclN0YXJ0IHx8IDAsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIC0xLCAwKTtcbiAgICBsZXQgbGVuZ3RoID0gKF9hID0gZGF0YS5sZW5ndGgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IChjaGlsZHJlbi5sZW5ndGggPyBwb3NpdGlvbnNbMF0gKyBjaGlsZHJlblswXS5sZW5ndGggOiAwKTtcbiAgICByZXR1cm4gbmV3IFRyZWUodHlwZXNbZGF0YS50b3BJRF0sIGNoaWxkcmVuLnJldmVyc2UoKSwgcG9zaXRpb25zLnJldmVyc2UoKSwgbGVuZ3RoKTtcbn1cbmNvbnN0IG5vZGVTaXplQ2FjaGUgPSBuZXcgV2Vha01hcDtcbmZ1bmN0aW9uIG5vZGVTaXplKGJhbGFuY2VUeXBlLCBub2RlKSB7XG4gICAgaWYgKCFiYWxhbmNlVHlwZS5pc0Fub255bW91cyB8fCBub2RlIGluc3RhbmNlb2YgVHJlZUJ1ZmZlciB8fCBub2RlLnR5cGUgIT0gYmFsYW5jZVR5cGUpXG4gICAgICAgIHJldHVybiAxO1xuICAgIGxldCBzaXplID0gbm9kZVNpemVDYWNoZS5nZXQobm9kZSk7XG4gICAgaWYgKHNpemUgPT0gbnVsbCkge1xuICAgICAgICBzaXplID0gMTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGNoaWxkLnR5cGUgIT0gYmFsYW5jZVR5cGUgfHwgIShjaGlsZCBpbnN0YW5jZW9mIFRyZWUpKSB7XG4gICAgICAgICAgICAgICAgc2l6ZSA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaXplICs9IG5vZGVTaXplKGJhbGFuY2VUeXBlLCBjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZVNpemVDYWNoZS5zZXQobm9kZSwgc2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xufVxuZnVuY3Rpb24gYmFsYW5jZVJhbmdlKFxuLy8gVGhlIHR5cGUgdGhlIGJhbGFuY2VkIHRyZWUncyBpbm5lciBub2Rlcy5cbmJhbGFuY2VUeXBlLCBcbi8vIFRoZSBkaXJlY3QgY2hpbGRyZW4gYW5kIHRoZWlyIHBvc2l0aW9uc1xuY2hpbGRyZW4sIHBvc2l0aW9ucywgXG4vLyBUaGUgaW5kZXggcmFuZ2UgaW4gY2hpbGRyZW4vcG9zaXRpb25zIHRvIHVzZVxuZnJvbSwgdG8sIFxuLy8gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBub2RlcywgcmVsYXRpdmUgdG8gdGhlaXIgcGFyZW50Llxuc3RhcnQsIFxuLy8gTGVuZ3RoIG9mIHRoZSBvdXRlciBub2RlXG5sZW5ndGgsIFxuLy8gRnVuY3Rpb24gdG8gYnVpbGQgdGhlIHRvcCBub2RlIG9mIHRoZSBiYWxhbmNlZCB0cmVlXG5ta1RvcCwgXG4vLyBGdW5jdGlvbiB0byBidWlsZCBpbnRlcm5hbCBub2RlcyBmb3IgdGhlIGJhbGFuY2VkIHRyZWVcbm1rVHJlZSkge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzsgaSsrKVxuICAgICAgICB0b3RhbCArPSBub2RlU2l6ZShiYWxhbmNlVHlwZSwgY2hpbGRyZW5baV0pO1xuICAgIGxldCBtYXhDaGlsZCA9IE1hdGguY2VpbCgodG90YWwgKiAxLjUpIC8gOCAvKiBCYWxhbmNlLkJyYW5jaEZhY3RvciAqLyk7XG4gICAgbGV0IGxvY2FsQ2hpbGRyZW4gPSBbXSwgbG9jYWxQb3NpdGlvbnMgPSBbXTtcbiAgICBmdW5jdGlvbiBkaXZpZGUoY2hpbGRyZW4sIHBvc2l0aW9ucywgZnJvbSwgdG8sIG9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvOykge1xuICAgICAgICAgICAgbGV0IGdyb3VwRnJvbSA9IGksIGdyb3VwU3RhcnQgPSBwb3NpdGlvbnNbaV0sIGdyb3VwU2l6ZSA9IG5vZGVTaXplKGJhbGFuY2VUeXBlLCBjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBmb3IgKDsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFNpemUgPSBub2RlU2l6ZShiYWxhbmNlVHlwZSwgY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIGlmIChncm91cFNpemUgKyBuZXh0U2l6ZSA+PSBtYXhDaGlsZClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZ3JvdXBTaXplICs9IG5leHRTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgPT0gZ3JvdXBGcm9tICsgMSkge1xuICAgICAgICAgICAgICAgIGlmIChncm91cFNpemUgPiBtYXhDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb25seSA9IGNoaWxkcmVuW2dyb3VwRnJvbV07IC8vIE9ubHkgdHJlZXMgY2FuIGhhdmUgYSBzaXplID4gMVxuICAgICAgICAgICAgICAgICAgICBkaXZpZGUob25seS5jaGlsZHJlbiwgb25seS5wb3NpdGlvbnMsIDAsIG9ubHkuY2hpbGRyZW4ubGVuZ3RoLCBwb3NpdGlvbnNbZ3JvdXBGcm9tXSArIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2NhbENoaWxkcmVuLnB1c2goY2hpbGRyZW5bZ3JvdXBGcm9tXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbGVuZ3RoID0gcG9zaXRpb25zW2kgLSAxXSArIGNoaWxkcmVuW2kgLSAxXS5sZW5ndGggLSBncm91cFN0YXJ0O1xuICAgICAgICAgICAgICAgIGxvY2FsQ2hpbGRyZW4ucHVzaChiYWxhbmNlUmFuZ2UoYmFsYW5jZVR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGdyb3VwRnJvbSwgaSwgZ3JvdXBTdGFydCwgbGVuZ3RoLCBudWxsLCBta1RyZWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvY2FsUG9zaXRpb25zLnB1c2goZ3JvdXBTdGFydCArIG9mZnNldCAtIHN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkaXZpZGUoY2hpbGRyZW4sIHBvc2l0aW9ucywgZnJvbSwgdG8sIDApO1xuICAgIHJldHVybiAobWtUb3AgfHwgbWtUcmVlKShsb2NhbENoaWxkcmVuLCBsb2NhbFBvc2l0aW9ucywgbGVuZ3RoKTtcbn1cbi8qKlxuUHJvdmlkZXMgYSB3YXkgdG8gYXNzb2NpYXRlIHZhbHVlcyB3aXRoIHBpZWNlcyBvZiB0cmVlcy4gQXMgbG9uZ1xuYXMgdGhhdCBwYXJ0IG9mIHRoZSB0cmVlIGlzIHJldXNlZCwgdGhlIGFzc29jaWF0ZWQgdmFsdWVzIGNhbiBiZVxucmV0cmlldmVkIGZyb20gYW4gdXBkYXRlZCB0cmVlLlxuKi9cbmNsYXNzIE5vZGVXZWFrTWFwIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgIH1cbiAgICBzZXRCdWZmZXIoYnVmZmVyLCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgbGV0IGlubmVyID0gdGhpcy5tYXAuZ2V0KGJ1ZmZlcik7XG4gICAgICAgIGlmICghaW5uZXIpXG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoYnVmZmVyLCBpbm5lciA9IG5ldyBNYXApO1xuICAgICAgICBpbm5lci5zZXQoaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0QnVmZmVyKGJ1ZmZlciwgaW5kZXgpIHtcbiAgICAgICAgbGV0IGlubmVyID0gdGhpcy5tYXAuZ2V0KGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBpbm5lciAmJiBpbm5lci5nZXQoaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgdGhlIHZhbHVlIGZvciB0aGlzIHN5bnRheCBub2RlLlxuICAgICovXG4gICAgc2V0KG5vZGUsIHZhbHVlKSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQnVmZmVyTm9kZSlcbiAgICAgICAgICAgIHRoaXMuc2V0QnVmZmVyKG5vZGUuY29udGV4dC5idWZmZXIsIG5vZGUuaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFRyZWVOb2RlKVxuICAgICAgICAgICAgdGhpcy5tYXAuc2V0KG5vZGUudHJlZSwgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZSB2YWx1ZSBmb3IgdGhpcyBzeW50YXggbm9kZSwgaWYgaXQgZXhpc3RzIGluIHRoZSBtYXAuXG4gICAgKi9cbiAgICBnZXQobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEJ1ZmZlck5vZGUgPyB0aGlzLmdldEJ1ZmZlcihub2RlLmNvbnRleHQuYnVmZmVyLCBub2RlLmluZGV4KVxuICAgICAgICAgICAgOiBub2RlIGluc3RhbmNlb2YgVHJlZU5vZGUgPyB0aGlzLm1hcC5nZXQobm9kZS50cmVlKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgU2V0IHRoZSB2YWx1ZSBmb3IgdGhlIG5vZGUgdGhhdCBhIGN1cnNvciBjdXJyZW50bHkgcG9pbnRzIHRvLlxuICAgICovXG4gICAgY3Vyc29yU2V0KGN1cnNvciwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGN1cnNvci5idWZmZXIpXG4gICAgICAgICAgICB0aGlzLnNldEJ1ZmZlcihjdXJzb3IuYnVmZmVyLmJ1ZmZlciwgY3Vyc29yLmluZGV4LCB2YWx1ZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMubWFwLnNldChjdXJzb3IudHJlZSwgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZSB0aGUgdmFsdWUgZm9yIHRoZSBub2RlIHRoYXQgYSBjdXJzb3IgY3VycmVudGx5IHBvaW50c1xuICAgIHRvLlxuICAgICovXG4gICAgY3Vyc29yR2V0KGN1cnNvcikge1xuICAgICAgICByZXR1cm4gY3Vyc29yLmJ1ZmZlciA/IHRoaXMuZ2V0QnVmZmVyKGN1cnNvci5idWZmZXIuYnVmZmVyLCBjdXJzb3IuaW5kZXgpIDogdGhpcy5tYXAuZ2V0KGN1cnNvci50cmVlKTtcbiAgICB9XG59XG5cbi8qKlxuVHJlZSBmcmFnbWVudHMgYXJlIHVzZWQgZHVyaW5nIFtpbmNyZW1lbnRhbFxucGFyc2luZ10oI2NvbW1vbi5QYXJzZXIuc3RhcnRQYXJzZSkgdG8gdHJhY2sgcGFydHMgb2Ygb2xkIHRyZWVzXG50aGF0IGNhbiBiZSByZXVzZWQgaW4gYSBuZXcgcGFyc2UuIEFuIGFycmF5IG9mIGZyYWdtZW50cyBpcyB1c2VkXG50byB0cmFjayByZWdpb25zIG9mIGFuIG9sZCB0cmVlIHdob3NlIG5vZGVzIG1pZ2h0IGJlIHJldXNlZCBpbiBuZXdcbnBhcnNlcy4gVXNlIHRoZSBzdGF0aWNcbltgYXBwbHlDaGFuZ2VzYF0oI2NvbW1vbi5UcmVlRnJhZ21lbnReYXBwbHlDaGFuZ2VzKSBtZXRob2QgdG9cbnVwZGF0ZSBmcmFnbWVudHMgZm9yIGRvY3VtZW50IGNoYW5nZXMuXG4qL1xuY2xhc3MgVHJlZUZyYWdtZW50IHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSB0cmVlIGZyYWdtZW50LiBZb3UnbGwgdXN1YWxseSB3YW50IHRvIHVzZVxuICAgIFtgYWRkVHJlZWBdKCNjb21tb24uVHJlZUZyYWdtZW50XmFkZFRyZWUpIGFuZFxuICAgIFtgYXBwbHlDaGFuZ2VzYF0oI2NvbW1vbi5UcmVlRnJhZ21lbnReYXBwbHlDaGFuZ2VzKSBpbnN0ZWFkIG9mXG4gICAgY2FsbGluZyB0aGlzIGRpcmVjdGx5LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHRoZSB1bmNoYW5nZWQgcmFuZ2UgcG9pbnRlZCB0byBieSB0aGlzIGZyYWdtZW50LlxuICAgIFRoaXMgcmVmZXJzIHRvIGFuIG9mZnNldCBpbiB0aGUgX3VwZGF0ZWRfIGRvY3VtZW50IChhcyBvcHBvc2VkXG4gICAgdG8gdGhlIG9yaWdpbmFsIHRyZWUpLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiB0aGUgdW5jaGFuZ2VkIHJhbmdlLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSB0cmVlIHRoYXQgdGhpcyBmcmFnbWVudCBpcyBiYXNlZCBvbi5cbiAgICAqL1xuICAgIHRyZWUsIFxuICAgIC8qKlxuICAgIFRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgZnJhZ21lbnQncyB0cmVlIGFuZCB0aGUgZG9jdW1lbnQgdGhhdFxuICAgIHRoaXMgZnJhZ21lbnQgY2FuIGJlIHVzZWQgYWdhaW5zdC4gQWRkIHRoaXMgd2hlbiBnb2luZyBmcm9tXG4gICAgZG9jdW1lbnQgdG8gdHJlZSBwb3NpdGlvbnMsIHN1YnRyYWN0IGl0IHRvIGdvIGZyb20gdHJlZSB0b1xuICAgIGRvY3VtZW50IHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIG9mZnNldCwgb3BlblN0YXJ0ID0gZmFsc2UsIG9wZW5FbmQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLm9wZW4gPSAob3BlblN0YXJ0ID8gMSAvKiBPcGVuLlN0YXJ0ICovIDogMCkgfCAob3BlbkVuZCA/IDIgLyogT3Blbi5FbmQgKi8gOiAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgc3RhcnQgb2YgdGhlIGZyYWdtZW50IHJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIGFcbiAgICBwYXJzZSwgb3IgdGhlIGVuZCBvZiBhIGNoYW5nZS4gKEluIHRoZSBzZWNvbmQgY2FzZSwgaXQgbWF5IG5vdFxuICAgIGJlIHNhZmUgdG8gcmV1c2Ugc29tZSBub2RlcyBhdCB0aGUgc3RhcnQsIGRlcGVuZGluZyBvbiB0aGVcbiAgICBwYXJzaW5nIGFsZ29yaXRobS4pXG4gICAgKi9cbiAgICBnZXQgb3BlblN0YXJ0KCkgeyByZXR1cm4gKHRoaXMub3BlbiAmIDEgLyogT3Blbi5TdGFydCAqLykgPiAwOyB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgZW5kIG9mIHRoZSBmcmFnbWVudCByZXByZXNlbnRzIHRoZSBlbmQgb2YgYVxuICAgIGZ1bGwtZG9jdW1lbnQgcGFyc2UsIG9yIHRoZSBzdGFydCBvZiBhIGNoYW5nZS5cbiAgICAqL1xuICAgIGdldCBvcGVuRW5kKCkgeyByZXR1cm4gKHRoaXMub3BlbiAmIDIgLyogT3Blbi5FbmQgKi8pID4gMDsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNldCBvZiBmcmFnbWVudHMgZnJvbSBhIGZyZXNobHkgcGFyc2VkIHRyZWUsIG9yIHVwZGF0ZVxuICAgIGFuIGV4aXN0aW5nIHNldCBvZiBmcmFnbWVudHMgYnkgcmVwbGFjaW5nIHRoZSBvbmVzIHRoYXQgb3ZlcmxhcFxuICAgIHdpdGggYSB0cmVlIHdpdGggY29udGVudCBmcm9tIHRoZSBuZXcgdHJlZS4gV2hlbiBgcGFydGlhbGAgaXNcbiAgICB0cnVlLCB0aGUgcGFyc2UgaXMgdHJlYXRlZCBhcyBpbmNvbXBsZXRlLCBhbmQgdGhlIHJlc3VsdGluZ1xuICAgIGZyYWdtZW50IGhhcyBbYG9wZW5FbmRgXSgjY29tbW9uLlRyZWVGcmFnbWVudC5vcGVuRW5kKSBzZXQgdG9cbiAgICB0cnVlLlxuICAgICovXG4gICAgc3RhdGljIGFkZFRyZWUodHJlZSwgZnJhZ21lbnRzID0gW10sIHBhcnRpYWwgPSBmYWxzZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW25ldyBUcmVlRnJhZ21lbnQoMCwgdHJlZS5sZW5ndGgsIHRyZWUsIDAsIGZhbHNlLCBwYXJ0aWFsKV07XG4gICAgICAgIGZvciAobGV0IGYgb2YgZnJhZ21lbnRzKVxuICAgICAgICAgICAgaWYgKGYudG8gPiB0cmVlLmxlbmd0aClcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQXBwbHkgYSBzZXQgb2YgZWRpdHMgdG8gYW4gYXJyYXkgb2YgZnJhZ21lbnRzLCByZW1vdmluZyBvclxuICAgIHNwbGl0dGluZyBmcmFnbWVudHMgYXMgbmVjZXNzYXJ5IHRvIHJlbW92ZSBlZGl0ZWQgcmFuZ2VzLCBhbmRcbiAgICBhZGp1c3Rpbmcgb2Zmc2V0cyBmb3IgZnJhZ21lbnRzIHRoYXQgbW92ZWQuXG4gICAgKi9cbiAgICBzdGF0aWMgYXBwbHlDaGFuZ2VzKGZyYWdtZW50cywgY2hhbmdlcywgbWluR2FwID0gMTI4KSB7XG4gICAgICAgIGlmICghY2hhbmdlcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZnJhZ21lbnRzO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGxldCBmSSA9IDEsIG5leHRGID0gZnJhZ21lbnRzLmxlbmd0aCA/IGZyYWdtZW50c1swXSA6IG51bGw7XG4gICAgICAgIGZvciAobGV0IGNJID0gMCwgcG9zID0gMCwgb2ZmID0gMDs7IGNJKyspIHtcbiAgICAgICAgICAgIGxldCBuZXh0QyA9IGNJIDwgY2hhbmdlcy5sZW5ndGggPyBjaGFuZ2VzW2NJXSA6IG51bGw7XG4gICAgICAgICAgICBsZXQgbmV4dFBvcyA9IG5leHRDID8gbmV4dEMuZnJvbUEgOiAxZTk7XG4gICAgICAgICAgICBpZiAobmV4dFBvcyAtIHBvcyA+PSBtaW5HYXApXG4gICAgICAgICAgICAgICAgd2hpbGUgKG5leHRGICYmIG5leHRGLmZyb20gPCBuZXh0UG9zKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXQgPSBuZXh0RjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBjdXQuZnJvbSB8fCBuZXh0UG9zIDw9IGN1dC50byB8fCBvZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmRnJvbSA9IE1hdGgubWF4KGN1dC5mcm9tLCBwb3MpIC0gb2ZmLCBmVG8gPSBNYXRoLm1pbihjdXQudG8sIG5leHRQb3MpIC0gb2ZmO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3V0ID0gZkZyb20gPj0gZlRvID8gbnVsbCA6IG5ldyBUcmVlRnJhZ21lbnQoZkZyb20sIGZUbywgY3V0LnRyZWUsIGN1dC5vZmZzZXQgKyBvZmYsIGNJID4gMCwgISFuZXh0Qyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1dClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGN1dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Ri50byA+IG5leHRQb3MpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbmV4dEYgPSBmSSA8IGZyYWdtZW50cy5sZW5ndGggPyBmcmFnbWVudHNbZkkrK10gOiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbmV4dEMpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBwb3MgPSBuZXh0Qy50b0E7XG4gICAgICAgICAgICBvZmYgPSBuZXh0Qy50b0EgLSBuZXh0Qy50b0I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbkEgc3VwZXJjbGFzcyB0aGF0IHBhcnNlcnMgc2hvdWxkIGV4dGVuZC5cbiovXG5jbGFzcyBQYXJzZXIge1xuICAgIC8qKlxuICAgIFN0YXJ0IGEgcGFyc2UsIHJldHVybmluZyBhIFtwYXJ0aWFsIHBhcnNlXSgjY29tbW9uLlBhcnRpYWxQYXJzZSlcbiAgICBvYmplY3QuIFtgZnJhZ21lbnRzYF0oI2NvbW1vbi5UcmVlRnJhZ21lbnQpIGNhbiBiZSBwYXNzZWQgaW4gdG9cbiAgICBtYWtlIHRoZSBwYXJzZSBpbmNyZW1lbnRhbC5cbiAgICBcbiAgICBCeSBkZWZhdWx0LCB0aGUgZW50aXJlIGlucHV0IGlzIHBhcnNlZC4gWW91IGNhbiBwYXNzIGByYW5nZXNgLFxuICAgIHdoaWNoIHNob3VsZCBiZSBhIHNvcnRlZCBhcnJheSBvZiBub24tZW1wdHksIG5vbi1vdmVybGFwcGluZ1xuICAgIHJhbmdlcywgdG8gcGFyc2Ugb25seSB0aG9zZSByYW5nZXMuIFRoZSB0cmVlIHJldHVybmVkIGluIHRoYXRcbiAgICBjYXNlIHdpbGwgc3RhcnQgYXQgYHJhbmdlc1swXS5mcm9tYC5cbiAgICAqL1xuICAgIHN0YXJ0UGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIGlucHV0ID0gbmV3IFN0cmluZ0lucHV0KGlucHV0KTtcbiAgICAgICAgcmFuZ2VzID0gIXJhbmdlcyA/IFtuZXcgUmFuZ2UoMCwgaW5wdXQubGVuZ3RoKV0gOiByYW5nZXMubGVuZ3RoID8gcmFuZ2VzLm1hcChyID0+IG5ldyBSYW5nZShyLmZyb20sIHIudG8pKSA6IFtuZXcgUmFuZ2UoMCwgMCldO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJzZShpbnB1dCwgZnJhZ21lbnRzIHx8IFtdLCByYW5nZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBSdW4gYSBmdWxsIHBhcnNlLCByZXR1cm5pbmcgdGhlIHJlc3VsdGluZyB0cmVlLlxuICAgICovXG4gICAgcGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgIGxldCBwYXJzZSA9IHRoaXMuc3RhcnRQYXJzZShpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgZG9uZSA9IHBhcnNlLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIGlmIChkb25lKVxuICAgICAgICAgICAgICAgIHJldHVybiBkb25lO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgU3RyaW5nSW5wdXQge1xuICAgIGNvbnN0cnVjdG9yKHN0cmluZykge1xuICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZztcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuc3RyaW5nLmxlbmd0aDsgfVxuICAgIGNodW5rKGZyb20pIHsgcmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKGZyb20pOyB9XG4gICAgZ2V0IGxpbmVDaHVua3MoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJlYWQoZnJvbSwgdG8pIHsgcmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKGZyb20sIHRvKTsgfVxufVxuXG4vKipcbkNyZWF0ZSBhIHBhcnNlIHdyYXBwZXIgdGhhdCwgYWZ0ZXIgdGhlIGlubmVyIHBhcnNlIGNvbXBsZXRlcyxcbnNjYW5zIGl0cyB0cmVlIGZvciBtaXhlZCBsYW5ndWFnZSByZWdpb25zIHdpdGggdGhlIGBuZXN0YFxuZnVuY3Rpb24sIHJ1bnMgdGhlIHJlc3VsdGluZyBbaW5uZXIgcGFyc2VzXSgjY29tbW9uLk5lc3RlZFBhcnNlKSxcbmFuZCB0aGVuIFttb3VudHNdKCNjb21tb24uTm9kZVByb3BebW91bnRlZCkgdGhlaXIgcmVzdWx0cyBvbnRvIHRoZVxudHJlZS5cbiovXG5mdW5jdGlvbiBwYXJzZU1peGVkKG5lc3QpIHtcbiAgICByZXR1cm4gKHBhcnNlLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpID0+IG5ldyBNaXhlZFBhcnNlKHBhcnNlLCBuZXN0LCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpO1xufVxuY2xhc3MgSW5uZXJQYXJzZSB7XG4gICAgY29uc3RydWN0b3IocGFyc2VyLCBwYXJzZSwgb3ZlcmxheSwgdGFyZ2V0LCBmcm9tKSB7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLnBhcnNlID0gcGFyc2U7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG92ZXJsYXk7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrUmFuZ2VzKHJhbmdlcykge1xuICAgIGlmICghcmFuZ2VzLmxlbmd0aCB8fCByYW5nZXMuc29tZShyID0+IHIuZnJvbSA+PSByLnRvKSlcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlubmVyIHBhcnNlIHJhbmdlcyBnaXZlbjogXCIgKyBKU09OLnN0cmluZ2lmeShyYW5nZXMpKTtcbn1cbmNsYXNzIEFjdGl2ZU92ZXJsYXkge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlciwgcHJlZGljYXRlLCBtb3VudHMsIGluZGV4LCBzdGFydCwgdGFyZ2V0LCBwcmV2KSB7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICAgICAgdGhpcy5tb3VudHMgPSBtb3VudHM7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5wcmV2ID0gcHJldjtcbiAgICAgICAgdGhpcy5kZXB0aCA9IDA7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gW107XG4gICAgfVxufVxuY29uc3Qgc3RvcHBlZElubmVyID0gbmV3IE5vZGVQcm9wKHsgcGVyTm9kZTogdHJ1ZSB9KTtcbmNsYXNzIE1peGVkUGFyc2Uge1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIG5lc3QsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICB0aGlzLm5lc3QgPSBuZXN0O1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcztcbiAgICAgICAgdGhpcy5pbm5lciA9IFtdO1xuICAgICAgICB0aGlzLmlubmVyRG9uZSA9IDA7XG4gICAgICAgIHRoaXMuYmFzZVRyZWUgPSBudWxsO1xuICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IG51bGw7XG4gICAgICAgIHRoaXMuYmFzZVBhcnNlID0gYmFzZTtcbiAgICB9XG4gICAgYWR2YW5jZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYmFzZVBhcnNlKSB7XG4gICAgICAgICAgICBsZXQgZG9uZSA9IHRoaXMuYmFzZVBhcnNlLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIGlmICghZG9uZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYmFzZVBhcnNlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYmFzZVRyZWUgPSBkb25lO1xuICAgICAgICAgICAgdGhpcy5zdGFydElubmVyKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9wcGVkQXQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpbm5lciBvZiB0aGlzLmlubmVyKVxuICAgICAgICAgICAgICAgICAgICBpbm5lci5wYXJzZS5zdG9wQXQodGhpcy5zdG9wcGVkQXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlubmVyRG9uZSA9PSB0aGlzLmlubmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuYmFzZVRyZWU7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9wcGVkQXQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVHJlZShyZXN1bHQudHlwZSwgcmVzdWx0LmNoaWxkcmVuLCByZXN1bHQucG9zaXRpb25zLCByZXN1bHQubGVuZ3RoLCByZXN1bHQucHJvcFZhbHVlcy5jb25jYXQoW1tzdG9wcGVkSW5uZXIsIHRoaXMuc3RvcHBlZEF0XV0pKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlubmVyID0gdGhpcy5pbm5lclt0aGlzLmlubmVyRG9uZV0sIGRvbmUgPSBpbm5lci5wYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICB0aGlzLmlubmVyRG9uZSsrO1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHNvbWV3aGF0IGRvZGd5IGJ1dCBzdXBlciBoZWxwZnVsIGhhY2sgd2hlcmUgd2VcbiAgICAgICAgICAgIC8vIHBhdGNoIHVwIG5vZGVzIGNyZWF0ZWQgYnkgdGhlIGlubmVyIHBhcnNlIChhbmQgdGh1c1xuICAgICAgICAgICAgLy8gcHJlc3VtYWJseSBub3QgYWxpYXNlZCBhbnl3aGVyZSBlbHNlKSB0byBob2xkIHRoZSBpbmZvcm1hdGlvblxuICAgICAgICAgICAgLy8gYWJvdXQgdGhlIGlubmVyIHBhcnNlLlxuICAgICAgICAgICAgbGV0IHByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCBpbm5lci50YXJnZXQucHJvcHMpO1xuICAgICAgICAgICAgcHJvcHNbTm9kZVByb3AubW91bnRlZC5pZF0gPSBuZXcgTW91bnRlZFRyZWUoZG9uZSwgaW5uZXIub3ZlcmxheSwgaW5uZXIucGFyc2VyKTtcbiAgICAgICAgICAgIGlubmVyLnRhcmdldC5wcm9wcyA9IHByb3BzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBnZXQgcGFyc2VkUG9zKCkge1xuICAgICAgICBpZiAodGhpcy5iYXNlUGFyc2UpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuaW5wdXQubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbm5lckRvbmU7IGkgPCB0aGlzLmlubmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbm5lcltpXS5mcm9tIDwgcG9zKVxuICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKHBvcywgdGhpcy5pbm5lcltpXS5wYXJzZS5wYXJzZWRQb3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgfVxuICAgIHN0b3BBdChwb3MpIHtcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBwb3M7XG4gICAgICAgIGlmICh0aGlzLmJhc2VQYXJzZSlcbiAgICAgICAgICAgIHRoaXMuYmFzZVBhcnNlLnN0b3BBdChwb3MpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbm5lckRvbmU7IGkgPCB0aGlzLmlubmVyLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJbaV0ucGFyc2Uuc3RvcEF0KHBvcyk7XG4gICAgfVxuICAgIHN0YXJ0SW5uZXIoKSB7XG4gICAgICAgIGxldCBmcmFnbWVudEN1cnNvciA9IG5ldyBGcmFnbWVudEN1cnNvcih0aGlzLmZyYWdtZW50cyk7XG4gICAgICAgIGxldCBvdmVybGF5ID0gbnVsbDtcbiAgICAgICAgbGV0IGNvdmVyZWQgPSBudWxsO1xuICAgICAgICBsZXQgY3Vyc29yID0gbmV3IFRyZWVDdXJzb3IobmV3IFRyZWVOb2RlKHRoaXMuYmFzZVRyZWUsIHRoaXMucmFuZ2VzWzBdLmZyb20sIDAsIG51bGwpLCBJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzIHwgSXRlck1vZGUuSWdub3JlTW91bnRzKTtcbiAgICAgICAgc2NhbjogZm9yIChsZXQgbmVzdCwgaXNDb3ZlcmVkOzspIHtcbiAgICAgICAgICAgIGxldCBlbnRlciA9IHRydWUsIHJhbmdlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwgJiYgY3Vyc29yLmZyb20gPj0gdGhpcy5zdG9wcGVkQXQpIHtcbiAgICAgICAgICAgICAgICBlbnRlciA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZnJhZ21lbnRDdXJzb3IuaGFzTm9kZShjdXJzb3IpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gb3ZlcmxheS5tb3VudHMuZmluZChtID0+IG0uZnJhZy5mcm9tIDw9IGN1cnNvci5mcm9tICYmIG0uZnJhZy50byA+PSBjdXJzb3IudG8gJiYgbS5tb3VudC5vdmVybGF5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciBvZiBtYXRjaC5tb3VudC5vdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZyb20gPSByLmZyb20gKyBtYXRjaC5wb3MsIHRvID0gci50byArIG1hdGNoLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbSA+PSBjdXJzb3IuZnJvbSAmJiB0byA8PSBjdXJzb3IudG8gJiYgIW92ZXJsYXkucmFuZ2VzLnNvbWUociA9PiByLmZyb20gPCB0byAmJiByLnRvID4gZnJvbSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXkucmFuZ2VzLnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvdmVyZWQgJiYgKGlzQ292ZXJlZCA9IGNoZWNrQ292ZXIoY292ZXJlZC5yYW5nZXMsIGN1cnNvci5mcm9tLCBjdXJzb3IudG8pKSkge1xuICAgICAgICAgICAgICAgIGVudGVyID0gaXNDb3ZlcmVkICE9IDIgLyogQ292ZXIuRnVsbCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJzb3IudHlwZS5pc0Fub255bW91cyAmJiAobmVzdCA9IHRoaXMubmVzdChjdXJzb3IsIHRoaXMuaW5wdXQpKSAmJlxuICAgICAgICAgICAgICAgIChjdXJzb3IuZnJvbSA8IGN1cnNvci50byB8fCAhbmVzdC5vdmVybGF5KSkge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLnRyZWUpXG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgbGV0IG9sZE1vdW50cyA9IGZyYWdtZW50Q3Vyc29yLmZpbmRNb3VudHMoY3Vyc29yLmZyb20sIG5lc3QucGFyc2VyKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5lc3Qub3ZlcmxheSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheSA9IG5ldyBBY3RpdmVPdmVybGF5KG5lc3QucGFyc2VyLCBuZXN0Lm92ZXJsYXksIG9sZE1vdW50cywgdGhpcy5pbm5lci5sZW5ndGgsIGN1cnNvci5mcm9tLCBjdXJzb3IudHJlZSwgb3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2VzID0gcHVuY2hSYW5nZXModGhpcy5yYW5nZXMsIG5lc3Qub3ZlcmxheSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnNvci5mcm9tIDwgY3Vyc29yLnRvID8gW25ldyBSYW5nZShjdXJzb3IuZnJvbSwgY3Vyc29yLnRvKV0gOiBbXSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUmFuZ2VzKHJhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZXMubGVuZ3RoIHx8ICFuZXN0Lm92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlubmVyLnB1c2gobmV3IElubmVyUGFyc2UobmVzdC5wYXJzZXIsIHJhbmdlcy5sZW5ndGggPyBuZXN0LnBhcnNlci5zdGFydFBhcnNlKHRoaXMuaW5wdXQsIGVudGVyRnJhZ21lbnRzKG9sZE1vdW50cywgcmFuZ2VzKSwgcmFuZ2VzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmVzdC5wYXJzZXIuc3RhcnRQYXJzZShcIlwiKSwgbmVzdC5vdmVybGF5ID8gbmVzdC5vdmVybGF5Lm1hcChyID0+IG5ldyBSYW5nZShyLmZyb20gLSBjdXJzb3IuZnJvbSwgci50byAtIGN1cnNvci5mcm9tKSkgOiBudWxsLCBjdXJzb3IudHJlZSwgcmFuZ2VzLmxlbmd0aCA/IHJhbmdlc1swXS5mcm9tIDogY3Vyc29yLmZyb20pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXN0Lm92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJlZCA9IHsgcmFuZ2VzLCBkZXB0aDogMCwgcHJldjogY292ZXJlZCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG92ZXJsYXkgJiYgKHJhbmdlID0gb3ZlcmxheS5wcmVkaWNhdGUoY3Vyc29yKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKGN1cnNvci5mcm9tLCBjdXJzb3IudG8pO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZS5mcm9tIDwgcmFuZ2UudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBvdmVybGF5LnJhbmdlcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCA+PSAwICYmIG92ZXJsYXkucmFuZ2VzW2xhc3RdLnRvID09IHJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5LnJhbmdlc1tsYXN0XSA9IHsgZnJvbTogb3ZlcmxheS5yYW5nZXNbbGFzdF0uZnJvbSwgdG86IHJhbmdlLnRvIH07XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXkucmFuZ2VzLnB1c2gocmFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnRlciAmJiBjdXJzb3IuZmlyc3RDaGlsZCgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG92ZXJsYXkpXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXkuZGVwdGgrKztcbiAgICAgICAgICAgICAgICBpZiAoY292ZXJlZClcbiAgICAgICAgICAgICAgICAgICAgY292ZXJlZC5kZXB0aCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLm5leHRTaWJsaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IucGFyZW50KCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzY2FuO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcmxheSAmJiAhLS1vdmVybGF5LmRlcHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmFuZ2VzID0gcHVuY2hSYW5nZXModGhpcy5yYW5nZXMsIG92ZXJsYXkucmFuZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tSYW5nZXMocmFuZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlubmVyLnNwbGljZShvdmVybGF5LmluZGV4LCAwLCBuZXcgSW5uZXJQYXJzZShvdmVybGF5LnBhcnNlciwgb3ZlcmxheS5wYXJzZXIuc3RhcnRQYXJzZSh0aGlzLmlucHV0LCBlbnRlckZyYWdtZW50cyhvdmVybGF5Lm1vdW50cywgcmFuZ2VzKSwgcmFuZ2VzKSwgb3ZlcmxheS5yYW5nZXMubWFwKHIgPT4gbmV3IFJhbmdlKHIuZnJvbSAtIG92ZXJsYXkuc3RhcnQsIHIudG8gLSBvdmVybGF5LnN0YXJ0KSksIG92ZXJsYXkudGFyZ2V0LCByYW5nZXNbMF0uZnJvbSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheSA9IG92ZXJsYXkucHJldjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY292ZXJlZCAmJiAhLS1jb3ZlcmVkLmRlcHRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJlZCA9IGNvdmVyZWQucHJldjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0NvdmVyKGNvdmVyZWQsIGZyb20sIHRvKSB7XG4gICAgZm9yIChsZXQgcmFuZ2Ugb2YgY292ZXJlZCkge1xuICAgICAgICBpZiAocmFuZ2UuZnJvbSA+PSB0bylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAocmFuZ2UudG8gPiBmcm9tKVxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlLmZyb20gPD0gZnJvbSAmJiByYW5nZS50byA+PSB0byA/IDIgLyogQ292ZXIuRnVsbCAqLyA6IDEgLyogQ292ZXIuUGFydGlhbCAqLztcbiAgICB9XG4gICAgcmV0dXJuIDAgLyogQ292ZXIuTm9uZSAqLztcbn1cbi8vIFRha2UgYSBwaWVjZSBvZiBidWZmZXIgYW5kIGNvbnZlcnQgaXQgaW50byBhIHN0YW5kLWFsb25lXG4vLyBUcmVlQnVmZmVyLlxuZnVuY3Rpb24gc2xpY2VCdWYoYnVmLCBzdGFydEksIGVuZEksIG5vZGVzLCBwb3NpdGlvbnMsIG9mZikge1xuICAgIGlmIChzdGFydEkgPCBlbmRJKSB7XG4gICAgICAgIGxldCBmcm9tID0gYnVmLmJ1ZmZlcltzdGFydEkgKyAxXTtcbiAgICAgICAgbm9kZXMucHVzaChidWYuc2xpY2Uoc3RhcnRJLCBlbmRJLCBmcm9tKSk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKGZyb20gLSBvZmYpO1xuICAgIH1cbn1cbi8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBub2RlIHRoYXQncyBpbiBhIGJ1ZmZlciwgYW5kIGNvbnZlcnRzIGl0LCBhbmRcbi8vIGl0cyBwYXJlbnQgYnVmZmVyIG5vZGVzLCBpbnRvIGEgVHJlZS4gVGhpcyBpcyBhZ2FpbiBhY3Rpbmcgb24gdGhlXG4vLyBhc3N1bXB0aW9uIHRoYXQgdGhlIHRyZWVzIGFuZCBidWZmZXJzIGhhdmUgYmVlbiBjb25zdHJ1Y3RlZCBieSB0aGVcbi8vIHBhcnNlIHRoYXQgd2FzIHJhbiB2aWEgdGhlIG1peCBwYXJzZXIsIGFuZCB0aHVzIGFyZW4ndCBzaGFyZWQgd2l0aFxuLy8gYW55IG90aGVyIGNvZGUsIG1ha2luZyB2aW9sYXRpb25zIG9mIHRoZSBpbW11dGFiaWxpdHkgc2FmZS5cbmZ1bmN0aW9uIG1hdGVyaWFsaXplKGN1cnNvcikge1xuICAgIGxldCB7IG5vZGUgfSA9IGN1cnNvciwgc3RhY2sgPSBbXTtcbiAgICBsZXQgYnVmZmVyID0gbm9kZS5jb250ZXh0LmJ1ZmZlcjtcbiAgICAvLyBTY2FuIHVwIHRvIHRoZSBuZWFyZXN0IHRyZWVcbiAgICBkbyB7XG4gICAgICAgIHN0YWNrLnB1c2goY3Vyc29yLmluZGV4KTtcbiAgICAgICAgY3Vyc29yLnBhcmVudCgpO1xuICAgIH0gd2hpbGUgKCFjdXJzb3IudHJlZSk7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGJ1ZmZlciBpbiB0aGF0IHRyZWVcbiAgICBsZXQgYmFzZSA9IGN1cnNvci50cmVlLCBpID0gYmFzZS5jaGlsZHJlbi5pbmRleE9mKGJ1ZmZlcik7XG4gICAgbGV0IGJ1ZiA9IGJhc2UuY2hpbGRyZW5baV0sIGIgPSBidWYuYnVmZmVyLCBuZXdTdGFjayA9IFtpXTtcbiAgICAvLyBTcGxpdCBhIGxldmVsIGluIHRoZSBidWZmZXIsIHB1dHRpbmcgdGhlIG5vZGVzIGJlZm9yZSBhbmQgYWZ0ZXJcbiAgICAvLyB0aGUgY2hpbGQgdGhhdCBjb250YWlucyBgbm9kZWAgaW50byBuZXcgYnVmZmVycy5cbiAgICBmdW5jdGlvbiBzcGxpdChzdGFydEksIGVuZEksIHR5cGUsIGlubmVyT2Zmc2V0LCBsZW5ndGgsIHN0YWNrUG9zKSB7XG4gICAgICAgIGxldCB0YXJnZXRJID0gc3RhY2tbc3RhY2tQb3NdO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBbXSwgcG9zaXRpb25zID0gW107XG4gICAgICAgIHNsaWNlQnVmKGJ1Ziwgc3RhcnRJLCB0YXJnZXRJLCBjaGlsZHJlbiwgcG9zaXRpb25zLCBpbm5lck9mZnNldCk7XG4gICAgICAgIGxldCBmcm9tID0gYlt0YXJnZXRJICsgMV0sIHRvID0gYlt0YXJnZXRJICsgMl07XG4gICAgICAgIG5ld1N0YWNrLnB1c2goY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgbGV0IGNoaWxkID0gc3RhY2tQb3NcbiAgICAgICAgICAgID8gc3BsaXQodGFyZ2V0SSArIDQsIGJbdGFyZ2V0SSArIDNdLCBidWYuc2V0LnR5cGVzW2JbdGFyZ2V0SV1dLCBmcm9tLCB0byAtIGZyb20sIHN0YWNrUG9zIC0gMSlcbiAgICAgICAgICAgIDogbm9kZS50b1RyZWUoKTtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgIHBvc2l0aW9ucy5wdXNoKGZyb20gLSBpbm5lck9mZnNldCk7XG4gICAgICAgIHNsaWNlQnVmKGJ1ZiwgYlt0YXJnZXRJICsgM10sIGVuZEksIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGlubmVyT2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmVlKHR5cGUsIGNoaWxkcmVuLCBwb3NpdGlvbnMsIGxlbmd0aCk7XG4gICAgfVxuICAgIGJhc2UuY2hpbGRyZW5baV0gPSBzcGxpdCgwLCBiLmxlbmd0aCwgTm9kZVR5cGUubm9uZSwgMCwgYnVmLmxlbmd0aCwgc3RhY2subGVuZ3RoIC0gMSk7XG4gICAgLy8gTW92ZSB0aGUgY3Vyc29yIGJhY2sgdG8gdGhlIHRhcmdldCBub2RlXG4gICAgZm9yIChsZXQgaW5kZXggb2YgbmV3U3RhY2spIHtcbiAgICAgICAgbGV0IHRyZWUgPSBjdXJzb3IudHJlZS5jaGlsZHJlbltpbmRleF0sIHBvcyA9IGN1cnNvci50cmVlLnBvc2l0aW9uc1tpbmRleF07XG4gICAgICAgIGN1cnNvci55aWVsZChuZXcgVHJlZU5vZGUodHJlZSwgcG9zICsgY3Vyc29yLmZyb20sIGluZGV4LCBjdXJzb3IuX3RyZWUpKTtcbiAgICB9XG59XG5jbGFzcyBTdHJ1Y3R1cmVDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKHJvb3QsIG9mZnNldCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gcm9vdC5jdXJzb3IoSXRlck1vZGUuSW5jbHVkZUFub255bW91cyB8IEl0ZXJNb2RlLklnbm9yZU1vdW50cyk7XG4gICAgfVxuICAgIC8vIE1vdmUgdG8gdGhlIGZpcnN0IG5vZGUgKGluIHByZS1vcmRlcikgdGhhdCBzdGFydHMgYXQgb3IgYWZ0ZXIgYHBvc2AuXG4gICAgbW92ZVRvKHBvcykge1xuICAgICAgICBsZXQgeyBjdXJzb3IgfSA9IHRoaXMsIHAgPSBwb3MgLSB0aGlzLm9mZnNldDtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmRvbmUgJiYgY3Vyc29yLmZyb20gPCBwKSB7XG4gICAgICAgICAgICBpZiAoY3Vyc29yLnRvID49IHBvcyAmJiBjdXJzb3IuZW50ZXIocCwgMSwgSXRlck1vZGUuSWdub3JlT3ZlcmxheXMgfCBJdGVyTW9kZS5FeGNsdWRlQnVmZmVycykpIDtcbiAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJzb3IubmV4dChmYWxzZSkpXG4gICAgICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNOb2RlKGN1cnNvcikge1xuICAgICAgICB0aGlzLm1vdmVUbyhjdXJzb3IuZnJvbSk7XG4gICAgICAgIGlmICghdGhpcy5kb25lICYmIHRoaXMuY3Vyc29yLmZyb20gKyB0aGlzLm9mZnNldCA9PSBjdXJzb3IuZnJvbSAmJiB0aGlzLmN1cnNvci50cmVlKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0cmVlID0gdGhpcy5jdXJzb3IudHJlZTs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRyZWUgPT0gY3Vyc29yLnRyZWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICh0cmVlLmNoaWxkcmVuLmxlbmd0aCAmJiB0cmVlLnBvc2l0aW9uc1swXSA9PSAwICYmIHRyZWUuY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBUcmVlKVxuICAgICAgICAgICAgICAgICAgICB0cmVlID0gdHJlZS5jaGlsZHJlblswXTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5jbGFzcyBGcmFnbWVudEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoZnJhZ21lbnRzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBmcmFnbWVudHM7XG4gICAgICAgIHRoaXMuY3VyVG8gPSAwO1xuICAgICAgICB0aGlzLmZyYWdJID0gMDtcbiAgICAgICAgaWYgKGZyYWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRoaXMuY3VyRnJhZyA9IGZyYWdtZW50c1swXTtcbiAgICAgICAgICAgIHRoaXMuY3VyVG8gPSAoX2EgPSBmaXJzdC50cmVlLnByb3Aoc3RvcHBlZElubmVyKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmlyc3QudG87XG4gICAgICAgICAgICB0aGlzLmlubmVyID0gbmV3IFN0cnVjdHVyZUN1cnNvcihmaXJzdC50cmVlLCAtZmlyc3Qub2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VyRnJhZyA9IHRoaXMuaW5uZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhc05vZGUobm9kZSkge1xuICAgICAgICB3aGlsZSAodGhpcy5jdXJGcmFnICYmIG5vZGUuZnJvbSA+PSB0aGlzLmN1clRvKVxuICAgICAgICAgICAgdGhpcy5uZXh0RnJhZygpO1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJGcmFnICYmIHRoaXMuY3VyRnJhZy5mcm9tIDw9IG5vZGUuZnJvbSAmJiB0aGlzLmN1clRvID49IG5vZGUudG8gJiYgdGhpcy5pbm5lci5oYXNOb2RlKG5vZGUpO1xuICAgIH1cbiAgICBuZXh0RnJhZygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmZyYWdJKys7XG4gICAgICAgIGlmICh0aGlzLmZyYWdJID09IHRoaXMuZnJhZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jdXJGcmFnID0gdGhpcy5pbm5lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZnJhZyA9IHRoaXMuY3VyRnJhZyA9IHRoaXMuZnJhZ21lbnRzW3RoaXMuZnJhZ0ldO1xuICAgICAgICAgICAgdGhpcy5jdXJUbyA9IChfYSA9IGZyYWcudHJlZS5wcm9wKHN0b3BwZWRJbm5lcikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZyYWcudG87XG4gICAgICAgICAgICB0aGlzLmlubmVyID0gbmV3IFN0cnVjdHVyZUN1cnNvcihmcmFnLnRyZWUsIC1mcmFnLm9mZnNldCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluZE1vdW50cyhwb3MsIHBhcnNlcikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuaW5uZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaW5uZXIuY3Vyc29yLm1vdmVUbyhwb3MsIDEpO1xuICAgICAgICAgICAgZm9yIChsZXQgcG9zID0gdGhpcy5pbm5lci5jdXJzb3Iubm9kZTsgcG9zOyBwb3MgPSBwb3MucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IG1vdW50ID0gKF9hID0gcG9zLnRyZWUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wcm9wKE5vZGVQcm9wLm1vdW50ZWQpO1xuICAgICAgICAgICAgICAgIGlmIChtb3VudCAmJiBtb3VudC5wYXJzZXIgPT0gcGFyc2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmZyYWdJOyBpIDwgdGhpcy5mcmFnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcmFnID0gdGhpcy5mcmFnbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhZy5mcm9tID49IHBvcy50bylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFnLnRyZWUgPT0gdGhpcy5jdXJGcmFnLnRyZWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M6IHBvcy5mcm9tIC0gZnJhZy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBwdW5jaFJhbmdlcyhvdXRlciwgcmFuZ2VzKSB7XG4gICAgbGV0IGNvcHkgPSBudWxsLCBjdXJyZW50ID0gcmFuZ2VzO1xuICAgIGZvciAobGV0IGkgPSAxLCBqID0gMDsgaSA8IG91dGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBnYXBGcm9tID0gb3V0ZXJbaSAtIDFdLnRvLCBnYXBUbyA9IG91dGVyW2ldLmZyb207XG4gICAgICAgIGZvciAoOyBqIDwgY3VycmVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IHIgPSBjdXJyZW50W2pdO1xuICAgICAgICAgICAgaWYgKHIuZnJvbSA+PSBnYXBUbylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChyLnRvIDw9IGdhcEZyb20pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWNvcHkpXG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGNvcHkgPSByYW5nZXMuc2xpY2UoKTtcbiAgICAgICAgICAgIGlmIChyLmZyb20gPCBnYXBGcm9tKSB7XG4gICAgICAgICAgICAgICAgY29weVtqXSA9IG5ldyBSYW5nZShyLmZyb20sIGdhcEZyb20pO1xuICAgICAgICAgICAgICAgIGlmIChyLnRvID4gZ2FwVG8pXG4gICAgICAgICAgICAgICAgICAgIGNvcHkuc3BsaWNlKGogKyAxLCAwLCBuZXcgUmFuZ2UoZ2FwVG8sIHIudG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHIudG8gPiBnYXBUbykge1xuICAgICAgICAgICAgICAgIGNvcHlbai0tXSA9IG5ldyBSYW5nZShnYXBUbywgci50byk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3B5LnNwbGljZShqLS0sIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xufVxuZnVuY3Rpb24gZmluZENvdmVyQ2hhbmdlcyhhLCBiLCBmcm9tLCB0bykge1xuICAgIGxldCBpQSA9IDAsIGlCID0gMCwgaW5BID0gZmFsc2UsIGluQiA9IGZhbHNlLCBwb3MgPSAtMWU5O1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGxldCBuZXh0QSA9IGlBID09IGEubGVuZ3RoID8gMWU5IDogaW5BID8gYVtpQV0udG8gOiBhW2lBXS5mcm9tO1xuICAgICAgICBsZXQgbmV4dEIgPSBpQiA9PSBiLmxlbmd0aCA/IDFlOSA6IGluQiA/IGJbaUJdLnRvIDogYltpQl0uZnJvbTtcbiAgICAgICAgaWYgKGluQSAhPSBpbkIpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IE1hdGgubWF4KHBvcywgZnJvbSksIGVuZCA9IE1hdGgubWluKG5leHRBLCBuZXh0QiwgdG8pO1xuICAgICAgICAgICAgaWYgKHN0YXJ0IDwgZW5kKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBSYW5nZShzdGFydCwgZW5kKSk7XG4gICAgICAgIH1cbiAgICAgICAgcG9zID0gTWF0aC5taW4obmV4dEEsIG5leHRCKTtcbiAgICAgICAgaWYgKHBvcyA9PSAxZTkpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKG5leHRBID09IHBvcykge1xuICAgICAgICAgICAgaWYgKCFpbkEpXG4gICAgICAgICAgICAgICAgaW5BID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluQSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlBKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHRCID09IHBvcykge1xuICAgICAgICAgICAgaWYgKCFpbkIpXG4gICAgICAgICAgICAgICAgaW5CID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluQiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlCKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIEdpdmVuIGEgbnVtYmVyIG9mIGZyYWdtZW50cyBmb3IgdGhlIG91dGVyIHRyZWUsIGFuZCBhIHNldCBvZiByYW5nZXNcbi8vIHRvIHBhcnNlLCBmaW5kIGZyYWdtZW50cyBmb3IgaW5uZXIgdHJlZXMgbW91bnRlZCBhcm91bmQgdGhvc2Vcbi8vIHJhbmdlcywgaWYgYW55LlxuZnVuY3Rpb24gZW50ZXJGcmFnbWVudHMobW91bnRzLCByYW5nZXMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgeyBwb3MsIG1vdW50LCBmcmFnIH0gb2YgbW91bnRzKSB7XG4gICAgICAgIGxldCBzdGFydFBvcyA9IHBvcyArIChtb3VudC5vdmVybGF5ID8gbW91bnQub3ZlcmxheVswXS5mcm9tIDogMCksIGVuZFBvcyA9IHN0YXJ0UG9zICsgbW91bnQudHJlZS5sZW5ndGg7XG4gICAgICAgIGxldCBmcm9tID0gTWF0aC5tYXgoZnJhZy5mcm9tLCBzdGFydFBvcyksIHRvID0gTWF0aC5taW4oZnJhZy50bywgZW5kUG9zKTtcbiAgICAgICAgaWYgKG1vdW50Lm92ZXJsYXkpIHtcbiAgICAgICAgICAgIGxldCBvdmVybGF5ID0gbW91bnQub3ZlcmxheS5tYXAociA9PiBuZXcgUmFuZ2Uoci5mcm9tICsgcG9zLCByLnRvICsgcG9zKSk7XG4gICAgICAgICAgICBsZXQgY2hhbmdlcyA9IGZpbmRDb3ZlckNoYW5nZXMocmFuZ2VzLCBvdmVybGF5LCBmcm9tLCB0byk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gZnJvbTs7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gaSA9PSBjaGFuZ2VzLmxlbmd0aCwgZW5kID0gbGFzdCA/IHRvIDogY2hhbmdlc1tpXS5mcm9tO1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBUcmVlRnJhZ21lbnQocG9zLCBlbmQsIG1vdW50LnRyZWUsIC1zdGFydFBvcywgZnJhZy5mcm9tID49IHBvcyB8fCBmcmFnLm9wZW5TdGFydCwgZnJhZy50byA8PSBlbmQgfHwgZnJhZy5vcGVuRW5kKSk7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHBvcyA9IGNoYW5nZXNbaV0udG87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuZXcgVHJlZUZyYWdtZW50KGZyb20sIHRvLCBtb3VudC50cmVlLCAtc3RhcnRQb3MsIGZyYWcuZnJvbSA+PSBzdGFydFBvcyB8fCBmcmFnLm9wZW5TdGFydCwgZnJhZy50byA8PSBlbmRQb3MgfHwgZnJhZy5vcGVuRW5kKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IHsgRGVmYXVsdEJ1ZmZlckxlbmd0aCwgSXRlck1vZGUsIE1vdW50ZWRUcmVlLCBOb2RlUHJvcCwgTm9kZVNldCwgTm9kZVR5cGUsIE5vZGVXZWFrTWFwLCBQYXJzZXIsIFRyZWUsIFRyZWVCdWZmZXIsIFRyZWVDdXJzb3IsIFRyZWVGcmFnbWVudCwgcGFyc2VNaXhlZCB9O1xuIiwgIi8qKlxuVGhlIGRhdGEgc3RydWN0dXJlIGZvciBkb2N1bWVudHMuIEBub25hYnN0cmFjdFxuKi9cbmNsYXNzIFRleHQge1xuICAgIC8qKlxuICAgIEdldCB0aGUgbGluZSBkZXNjcmlwdGlvbiBhcm91bmQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgbGluZUF0KHBvcykge1xuICAgICAgICBpZiAocG9zIDwgMCB8fCBwb3MgPiB0aGlzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIHBvc2l0aW9uICR7cG9zfSBpbiBkb2N1bWVudCBvZiBsZW5ndGggJHt0aGlzLmxlbmd0aH1gKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZUlubmVyKHBvcywgZmFsc2UsIDEsIDApO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgZ2l2ZW4gKDEtYmFzZWQpIGxpbmUgbnVtYmVyLlxuICAgICovXG4gICAgbGluZShuKSB7XG4gICAgICAgIGlmIChuIDwgMSB8fCBuID4gdGhpcy5saW5lcylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIGxpbmUgbnVtYmVyICR7bn0gaW4gJHt0aGlzLmxpbmVzfS1saW5lIGRvY3VtZW50YCk7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVJbm5lcihuLCB0cnVlLCAxLCAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSBhIHJhbmdlIG9mIHRoZSB0ZXh0IHdpdGggdGhlIGdpdmVuIGNvbnRlbnQuXG4gICAgKi9cbiAgICByZXBsYWNlKGZyb20sIHRvLCB0ZXh0KSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgbGV0IHBhcnRzID0gW107XG4gICAgICAgIHRoaXMuZGVjb21wb3NlKDAsIGZyb20sIHBhcnRzLCAyIC8qIE9wZW4uVG8gKi8pO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGgpXG4gICAgICAgICAgICB0ZXh0LmRlY29tcG9zZSgwLCB0ZXh0Lmxlbmd0aCwgcGFydHMsIDEgLyogT3Blbi5Gcm9tICovIHwgMiAvKiBPcGVuLlRvICovKTtcbiAgICAgICAgdGhpcy5kZWNvbXBvc2UodG8sIHRoaXMubGVuZ3RoLCBwYXJ0cywgMSAvKiBPcGVuLkZyb20gKi8pO1xuICAgICAgICByZXR1cm4gVGV4dE5vZGUuZnJvbShwYXJ0cywgdGhpcy5sZW5ndGggLSAodG8gLSBmcm9tKSArIHRleHQubGVuZ3RoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQXBwZW5kIGFub3RoZXIgZG9jdW1lbnQgdG8gdGhpcyBvbmUuXG4gICAgKi9cbiAgICBhcHBlbmQob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSh0aGlzLmxlbmd0aCwgdGhpcy5sZW5ndGgsIG90aGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmUgdGhlIHRleHQgYmV0d2VlbiB0aGUgZ2l2ZW4gcG9pbnRzLlxuICAgICovXG4gICAgc2xpY2UoZnJvbSwgdG8gPSB0aGlzLmxlbmd0aCkge1xuICAgICAgICBbZnJvbSwgdG9dID0gY2xpcCh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgICAgICB0aGlzLmRlY29tcG9zZShmcm9tLCB0bywgcGFydHMsIDApO1xuICAgICAgICByZXR1cm4gVGV4dE5vZGUuZnJvbShwYXJ0cywgdG8gLSBmcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoaXMgdGV4dCBpcyBlcXVhbCB0byBhbm90aGVyIGluc3RhbmNlLlxuICAgICovXG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgaWYgKG90aGVyID09IHRoaXMpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG90aGVyLmxlbmd0aCAhPSB0aGlzLmxlbmd0aCB8fCBvdGhlci5saW5lcyAhPSB0aGlzLmxpbmVzKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnNjYW5JZGVudGljYWwob3RoZXIsIDEpLCBlbmQgPSB0aGlzLmxlbmd0aCAtIHRoaXMuc2NhbklkZW50aWNhbChvdGhlciwgLTEpO1xuICAgICAgICBsZXQgYSA9IG5ldyBSYXdUZXh0Q3Vyc29yKHRoaXMpLCBiID0gbmV3IFJhd1RleHRDdXJzb3Iob3RoZXIpO1xuICAgICAgICBmb3IgKGxldCBza2lwID0gc3RhcnQsIHBvcyA9IHN0YXJ0OzspIHtcbiAgICAgICAgICAgIGEubmV4dChza2lwKTtcbiAgICAgICAgICAgIGIubmV4dChza2lwKTtcbiAgICAgICAgICAgIHNraXAgPSAwO1xuICAgICAgICAgICAgaWYgKGEubGluZUJyZWFrICE9IGIubGluZUJyZWFrIHx8IGEuZG9uZSAhPSBiLmRvbmUgfHwgYS52YWx1ZSAhPSBiLnZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHBvcyArPSBhLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChhLmRvbmUgfHwgcG9zID49IGVuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHRleHQuIFdoZW4gYGRpcmAgaXMgYC0xYCwgaXRlcmF0aW9uIGhhcHBlbnNcbiAgICBmcm9tIGVuZCB0byBzdGFydC4gVGhpcyB3aWxsIHJldHVybiBsaW5lcyBhbmQgdGhlIGJyZWFrcyBiZXR3ZWVuXG4gICAgdGhlbSBhcyBzZXBhcmF0ZSBzdHJpbmdzLlxuICAgICovXG4gICAgaXRlcihkaXIgPSAxKSB7IHJldHVybiBuZXcgUmF3VGV4dEN1cnNvcih0aGlzLCBkaXIpOyB9XG4gICAgLyoqXG4gICAgSXRlcmF0ZSBvdmVyIGEgcmFuZ2Ugb2YgdGhlIHRleHQuIFdoZW4gYGZyb21gID4gYHRvYCwgdGhlXG4gICAgaXRlcmF0b3Igd2lsbCBydW4gaW4gcmV2ZXJzZS5cbiAgICAqL1xuICAgIGl0ZXJSYW5nZShmcm9tLCB0byA9IHRoaXMubGVuZ3RoKSB7IHJldHVybiBuZXcgUGFydGlhbFRleHRDdXJzb3IodGhpcywgZnJvbSwgdG8pOyB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgY3Vyc29yIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgbGluZXMsXG4gICAgX3dpdGhvdXRfIHJldHVybmluZyB0aGUgbGluZSBicmVha3MgYmV0d2VlbiwgYW5kIHlpZWxkaW5nIGVtcHR5XG4gICAgc3RyaW5ncyBmb3IgZW1wdHkgbGluZXMuXG4gICAgXG4gICAgV2hlbiBgZnJvbWAgYW5kIGB0b2AgYXJlIGdpdmVuLCB0aGV5IHNob3VsZCBiZSAxLWJhc2VkIGxpbmUgbnVtYmVycy5cbiAgICAqL1xuICAgIGl0ZXJMaW5lcyhmcm9tLCB0bykge1xuICAgICAgICBsZXQgaW5uZXI7XG4gICAgICAgIGlmIChmcm9tID09IG51bGwpIHtcbiAgICAgICAgICAgIGlubmVyID0gdGhpcy5pdGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodG8gPT0gbnVsbClcbiAgICAgICAgICAgICAgICB0byA9IHRoaXMubGluZXMgKyAxO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5saW5lKGZyb20pLmZyb207XG4gICAgICAgICAgICBpbm5lciA9IHRoaXMuaXRlclJhbmdlKHN0YXJ0LCBNYXRoLm1heChzdGFydCwgdG8gPT0gdGhpcy5saW5lcyArIDEgPyB0aGlzLmxlbmd0aCA6IHRvIDw9IDEgPyAwIDogdGhpcy5saW5lKHRvIC0gMSkudG8pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IExpbmVDdXJzb3IoaW5uZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gdGhlIGRvY3VtZW50IGFzIGEgc3RyaW5nLCB1c2luZyBuZXdsaW5lIGNoYXJhY3RlcnMgdG9cbiAgICBzZXBhcmF0ZSBsaW5lcy5cbiAgICAqL1xuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gdGhpcy5zbGljZVN0cmluZygwKTsgfVxuICAgIC8qKlxuICAgIENvbnZlcnQgdGhlIGRvY3VtZW50IHRvIGFuIGFycmF5IG9mIGxpbmVzICh3aGljaCBjYW4gYmVcbiAgICBkZXNlcmlhbGl6ZWQgYWdhaW4gdmlhIFtgVGV4dC5vZmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVGV4dF5vZikpLlxuICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQgbGluZXMgPSBbXTtcbiAgICAgICAgdGhpcy5mbGF0dGVuKGxpbmVzKTtcbiAgICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgYFRleHRgIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2YgbGluZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgb2YodGV4dCkge1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQSBkb2N1bWVudCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGxpbmVcIik7XG4gICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAxICYmICF0ZXh0WzBdKVxuICAgICAgICAgICAgcmV0dXJuIFRleHQuZW1wdHk7XG4gICAgICAgIHJldHVybiB0ZXh0Lmxlbmd0aCA8PSAzMiAvKiBUcmVlLkJyYW5jaCAqLyA/IG5ldyBUZXh0TGVhZih0ZXh0KSA6IFRleHROb2RlLmZyb20oVGV4dExlYWYuc3BsaXQodGV4dCwgW10pKTtcbiAgICB9XG59XG4vLyBMZWF2ZXMgc3RvcmUgYW4gYXJyYXkgb2YgbGluZSBzdHJpbmdzLiBUaGVyZSBhcmUgYWx3YXlzIGxpbmUgYnJlYWtzXG4vLyBiZXR3ZWVuIHRoZXNlIHN0cmluZ3MuIExlYXZlcyBhcmUgbGltaXRlZCBpbiBzaXplIGFuZCBoYXZlIHRvIGJlXG4vLyBjb250YWluZWQgaW4gVGV4dE5vZGUgaW5zdGFuY2VzIGZvciBiaWdnZXIgZG9jdW1lbnRzLlxuY2xhc3MgVGV4dExlYWYgZXh0ZW5kcyBUZXh0IHtcbiAgICBjb25zdHJ1Y3Rvcih0ZXh0LCBsZW5ndGggPSB0ZXh0TGVuZ3RoKHRleHQpKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgIH1cbiAgICBnZXQgbGluZXMoKSB7IHJldHVybiB0aGlzLnRleHQubGVuZ3RoOyB9XG4gICAgZ2V0IGNoaWxkcmVuKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGxpbmVJbm5lcih0YXJnZXQsIGlzTGluZSwgbGluZSwgb2Zmc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RyaW5nID0gdGhpcy50ZXh0W2ldLCBlbmQgPSBvZmZzZXQgKyBzdHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKChpc0xpbmUgPyBsaW5lIDogZW5kKSA+PSB0YXJnZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5lKG9mZnNldCwgZW5kLCBsaW5lLCBzdHJpbmcpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kICsgMTtcbiAgICAgICAgICAgIGxpbmUrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWNvbXBvc2UoZnJvbSwgdG8sIHRhcmdldCwgb3Blbikge1xuICAgICAgICBsZXQgdGV4dCA9IGZyb20gPD0gMCAmJiB0byA+PSB0aGlzLmxlbmd0aCA/IHRoaXNcbiAgICAgICAgICAgIDogbmV3IFRleHRMZWFmKHNsaWNlVGV4dCh0aGlzLnRleHQsIGZyb20sIHRvKSwgTWF0aC5taW4odG8sIHRoaXMubGVuZ3RoKSAtIE1hdGgubWF4KDAsIGZyb20pKTtcbiAgICAgICAgaWYgKG9wZW4gJiAxIC8qIE9wZW4uRnJvbSAqLykge1xuICAgICAgICAgICAgbGV0IHByZXYgPSB0YXJnZXQucG9wKCk7XG4gICAgICAgICAgICBsZXQgam9pbmVkID0gYXBwZW5kVGV4dCh0ZXh0LnRleHQsIHByZXYudGV4dC5zbGljZSgpLCAwLCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoam9pbmVkLmxlbmd0aCA8PSAzMiAvKiBUcmVlLkJyYW5jaCAqLykge1xuICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKG5ldyBUZXh0TGVhZihqb2luZWQsIHByZXYubGVuZ3RoICsgdGV4dC5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBtaWQgPSBqb2luZWQubGVuZ3RoID4+IDE7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2gobmV3IFRleHRMZWFmKGpvaW5lZC5zbGljZSgwLCBtaWQpKSwgbmV3IFRleHRMZWFmKGpvaW5lZC5zbGljZShtaWQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh0ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKGZyb20sIHRvLCB0ZXh0KSB7XG4gICAgICAgIGlmICghKHRleHQgaW5zdGFuY2VvZiBUZXh0TGVhZikpXG4gICAgICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShmcm9tLCB0bywgdGV4dCk7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgbGV0IGxpbmVzID0gYXBwZW5kVGV4dCh0aGlzLnRleHQsIGFwcGVuZFRleHQodGV4dC50ZXh0LCBzbGljZVRleHQodGhpcy50ZXh0LCAwLCBmcm9tKSksIHRvKTtcbiAgICAgICAgbGV0IG5ld0xlbiA9IHRoaXMubGVuZ3RoICsgdGV4dC5sZW5ndGggLSAodG8gLSBmcm9tKTtcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSAzMiAvKiBUcmVlLkJyYW5jaCAqLylcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dExlYWYobGluZXMsIG5ld0xlbik7XG4gICAgICAgIHJldHVybiBUZXh0Tm9kZS5mcm9tKFRleHRMZWFmLnNwbGl0KGxpbmVzLCBbXSksIG5ld0xlbik7XG4gICAgfVxuICAgIHNsaWNlU3RyaW5nKGZyb20sIHRvID0gdGhpcy5sZW5ndGgsIGxpbmVTZXAgPSBcIlxcblwiKSB7XG4gICAgICAgIFtmcm9tLCB0b10gPSBjbGlwKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwOyBwb3MgPD0gdG8gJiYgaSA8IHRoaXMudGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSB0aGlzLnRleHRbaV0sIGVuZCA9IHBvcyArIGxpbmUubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20gJiYgaSlcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gbGluZVNlcDtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgZW5kICYmIHRvID4gcG9zKVxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsaW5lLnNsaWNlKE1hdGgubWF4KDAsIGZyb20gLSBwb3MpLCB0byAtIHBvcyk7XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGZsYXR0ZW4odGFyZ2V0KSB7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2YgdGhpcy50ZXh0KVxuICAgICAgICAgICAgdGFyZ2V0LnB1c2gobGluZSk7XG4gICAgfVxuICAgIHNjYW5JZGVudGljYWwoKSB7IHJldHVybiAwOyB9XG4gICAgc3RhdGljIHNwbGl0KHRleHQsIHRhcmdldCkge1xuICAgICAgICBsZXQgcGFydCA9IFtdLCBsZW4gPSAtMTtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiB0ZXh0KSB7XG4gICAgICAgICAgICBwYXJ0LnB1c2gobGluZSk7XG4gICAgICAgICAgICBsZW4gKz0gbGluZS5sZW5ndGggKyAxO1xuICAgICAgICAgICAgaWYgKHBhcnQubGVuZ3RoID09IDMyIC8qIFRyZWUuQnJhbmNoICovKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2gobmV3IFRleHRMZWFmKHBhcnQsIGxlbikpO1xuICAgICAgICAgICAgICAgIHBhcnQgPSBbXTtcbiAgICAgICAgICAgICAgICBsZW4gPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGVuID4gLTEpXG4gICAgICAgICAgICB0YXJnZXQucHVzaChuZXcgVGV4dExlYWYocGFydCwgbGVuKSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxufVxuLy8gTm9kZXMgcHJvdmlkZSB0aGUgdHJlZSBzdHJ1Y3R1cmUgb2YgdGhlIGBUZXh0YCB0eXBlLiBUaGV5IHN0b3JlIGFcbi8vIG51bWJlciBvZiBvdGhlciBub2RlcyBvciBsZWF2ZXMsIHRha2luZyBjYXJlIHRvIGJhbGFuY2UgdGhlbXNlbHZlc1xuLy8gb24gY2hhbmdlcy4gVGhlcmUgYXJlIGltcGxpZWQgbGluZSBicmVha3MgX2JldHdlZW5fIHRoZSBjaGlsZHJlbiBvZlxuLy8gYSBub2RlIChidXQgbm90IGJlZm9yZSB0aGUgZmlyc3Qgb3IgYWZ0ZXIgdGhlIGxhc3QgY2hpbGQpLlxuY2xhc3MgVGV4dE5vZGUgZXh0ZW5kcyBUZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihjaGlsZHJlbiwgbGVuZ3RoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMubGluZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbilcbiAgICAgICAgICAgIHRoaXMubGluZXMgKz0gY2hpbGQubGluZXM7XG4gICAgfVxuICAgIGxpbmVJbm5lcih0YXJnZXQsIGlzTGluZSwgbGluZSwgb2Zmc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBvZmZzZXQgKyBjaGlsZC5sZW5ndGgsIGVuZExpbmUgPSBsaW5lICsgY2hpbGQubGluZXMgLSAxO1xuICAgICAgICAgICAgaWYgKChpc0xpbmUgPyBlbmRMaW5lIDogZW5kKSA+PSB0YXJnZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmxpbmVJbm5lcih0YXJnZXQsIGlzTGluZSwgbGluZSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCA9IGVuZCArIDE7XG4gICAgICAgICAgICBsaW5lID0gZW5kTGluZSArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVjb21wb3NlKGZyb20sIHRvLCB0YXJnZXQsIG9wZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IHBvcyA8PSB0byAmJiBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGZyb20gPD0gZW5kICYmIHRvID49IHBvcykge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZE9wZW4gPSBvcGVuICYgKChwb3MgPD0gZnJvbSA/IDEgLyogT3Blbi5Gcm9tICovIDogMCkgfCAoZW5kID49IHRvID8gMiAvKiBPcGVuLlRvICovIDogMCkpO1xuICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gZnJvbSAmJiBlbmQgPD0gdG8gJiYgIWNoaWxkT3BlbilcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuZGVjb21wb3NlKGZyb20gLSBwb3MsIHRvIC0gcG9zLCB0YXJnZXQsIGNoaWxkT3Blbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UoZnJvbSwgdG8sIHRleHQpIHtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBpZiAodGV4dC5saW5lcyA8IHRoaXMubGluZXMpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBwb3MgKyBjaGlsZC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoOiBpZiB0aGUgY2hhbmdlIG9ubHkgYWZmZWN0cyBvbmUgY2hpbGQgYW5kIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNoaWxkJ3Mgc2l6ZSByZW1haW5zIGluIHRoZSBhY2NlcHRhYmxlIHJhbmdlLCBvbmx5IHVwZGF0ZVxuICAgICAgICAgICAgICAgIC8vIHRoYXQgY2hpbGRcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA+PSBwb3MgJiYgdG8gPD0gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVkID0gY2hpbGQucmVwbGFjZShmcm9tIC0gcG9zLCB0byAtIHBvcywgdGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbExpbmVzID0gdGhpcy5saW5lcyAtIGNoaWxkLmxpbmVzICsgdXBkYXRlZC5saW5lcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWQubGluZXMgPCAodG90YWxMaW5lcyA+PiAoNSAvKiBUcmVlLkJyYW5jaFNoaWZ0ICovIC0gMSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkLmxpbmVzID4gKHRvdGFsTGluZXMgPj4gKDUgLyogVHJlZS5CcmFuY2hTaGlmdCAqLyArIDEpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvcHkgPSB0aGlzLmNoaWxkcmVuLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3B5W2ldID0gdXBkYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dE5vZGUoY29weSwgdGhpcy5sZW5ndGggLSAodG8gLSBmcm9tKSArIHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVwbGFjZShwb3MsIGVuZCwgdXBkYXRlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBvcyA9IGVuZCArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5yZXBsYWNlKGZyb20sIHRvLCB0ZXh0KTtcbiAgICB9XG4gICAgc2xpY2VTdHJpbmcoZnJvbSwgdG8gPSB0aGlzLmxlbmd0aCwgbGluZVNlcCA9IFwiXFxuXCIpIHtcbiAgICAgICAgW2Zyb20sIHRvXSA9IGNsaXAodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aCAmJiBwb3MgPD0gdG87IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20gJiYgaSlcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gbGluZVNlcDtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgZW5kICYmIHRvID4gcG9zKVxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjaGlsZC5zbGljZVN0cmluZyhmcm9tIC0gcG9zLCB0byAtIHBvcywgbGluZVNlcCk7XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGZsYXR0ZW4odGFyZ2V0KSB7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICBjaGlsZC5mbGF0dGVuKHRhcmdldCk7XG4gICAgfVxuICAgIHNjYW5JZGVudGljYWwob3RoZXIsIGRpcikge1xuICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFRleHROb2RlKSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICAgICAgbGV0IFtpQSwgaUIsIGVBLCBlQl0gPSBkaXIgPiAwID8gWzAsIDAsIHRoaXMuY2hpbGRyZW4ubGVuZ3RoLCBvdGhlci5jaGlsZHJlbi5sZW5ndGhdXG4gICAgICAgICAgICA6IFt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDEsIG90aGVyLmNoaWxkcmVuLmxlbmd0aCAtIDEsIC0xLCAtMV07XG4gICAgICAgIGZvciAoOzsgaUEgKz0gZGlyLCBpQiArPSBkaXIpIHtcbiAgICAgICAgICAgIGlmIChpQSA9PSBlQSB8fCBpQiA9PSBlQilcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGNoQSA9IHRoaXMuY2hpbGRyZW5baUFdLCBjaEIgPSBvdGhlci5jaGlsZHJlbltpQl07XG4gICAgICAgICAgICBpZiAoY2hBICE9IGNoQilcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoICsgY2hBLnNjYW5JZGVudGljYWwoY2hCLCBkaXIpO1xuICAgICAgICAgICAgbGVuZ3RoICs9IGNoQS5sZW5ndGggKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tKGNoaWxkcmVuLCBsZW5ndGggPSBjaGlsZHJlbi5yZWR1Y2UoKGwsIGNoKSA9PiBsICsgY2gubGVuZ3RoICsgMSwgLTEpKSB7XG4gICAgICAgIGxldCBsaW5lcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGNoIG9mIGNoaWxkcmVuKVxuICAgICAgICAgICAgbGluZXMgKz0gY2gubGluZXM7XG4gICAgICAgIGlmIChsaW5lcyA8IDMyIC8qIFRyZWUuQnJhbmNoICovKSB7XG4gICAgICAgICAgICBsZXQgZmxhdCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgY2ggb2YgY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgY2guZmxhdHRlbihmbGF0KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dExlYWYoZmxhdCwgbGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2h1bmsgPSBNYXRoLm1heCgzMiAvKiBUcmVlLkJyYW5jaCAqLywgbGluZXMgPj4gNSAvKiBUcmVlLkJyYW5jaFNoaWZ0ICovKSwgbWF4Q2h1bmsgPSBjaHVuayA8PCAxLCBtaW5DaHVuayA9IGNodW5rID4+IDE7XG4gICAgICAgIGxldCBjaHVua2VkID0gW10sIGN1cnJlbnRMaW5lcyA9IDAsIGN1cnJlbnRMZW4gPSAtMSwgY3VycmVudENodW5rID0gW107XG4gICAgICAgIGZ1bmN0aW9uIGFkZChjaGlsZCkge1xuICAgICAgICAgICAgbGV0IGxhc3Q7XG4gICAgICAgICAgICBpZiAoY2hpbGQubGluZXMgPiBtYXhDaHVuayAmJiBjaGlsZCBpbnN0YW5jZW9mIFRleHROb2RlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbm9kZSBvZiBjaGlsZC5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICAgICAgYWRkKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGQubGluZXMgPiBtaW5DaHVuayAmJiAoY3VycmVudExpbmVzID4gbWluQ2h1bmsgfHwgIWN1cnJlbnRMaW5lcykpIHtcbiAgICAgICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIGNodW5rZWQucHVzaChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRleHRMZWFmICYmIGN1cnJlbnRMaW5lcyAmJlxuICAgICAgICAgICAgICAgIChsYXN0ID0gY3VycmVudENodW5rW2N1cnJlbnRDaHVuay5sZW5ndGggLSAxXSkgaW5zdGFuY2VvZiBUZXh0TGVhZiAmJlxuICAgICAgICAgICAgICAgIGNoaWxkLmxpbmVzICsgbGFzdC5saW5lcyA8PSAzMiAvKiBUcmVlLkJyYW5jaCAqLykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lcyArPSBjaGlsZC5saW5lcztcbiAgICAgICAgICAgICAgICBjdXJyZW50TGVuICs9IGNoaWxkLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgY3VycmVudENodW5rW2N1cnJlbnRDaHVuay5sZW5ndGggLSAxXSA9IG5ldyBUZXh0TGVhZihsYXN0LnRleHQuY29uY2F0KGNoaWxkLnRleHQpLCBsYXN0Lmxlbmd0aCArIDEgKyBjaGlsZC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lcyArIGNoaWxkLmxpbmVzID4gY2h1bmspXG4gICAgICAgICAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmVzICs9IGNoaWxkLmxpbmVzO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMZW4gKz0gY2hpbGQubGVuZ3RoICsgMTtcbiAgICAgICAgICAgICAgICBjdXJyZW50Q2h1bmsucHVzaChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudExpbmVzID09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2h1bmtlZC5wdXNoKGN1cnJlbnRDaHVuay5sZW5ndGggPT0gMSA/IGN1cnJlbnRDaHVua1swXSA6IFRleHROb2RlLmZyb20oY3VycmVudENodW5rLCBjdXJyZW50TGVuKSk7XG4gICAgICAgICAgICBjdXJyZW50TGVuID0gLTE7XG4gICAgICAgICAgICBjdXJyZW50TGluZXMgPSBjdXJyZW50Q2h1bmsubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbilcbiAgICAgICAgICAgIGFkZChjaGlsZCk7XG4gICAgICAgIGZsdXNoKCk7XG4gICAgICAgIHJldHVybiBjaHVua2VkLmxlbmd0aCA9PSAxID8gY2h1bmtlZFswXSA6IG5ldyBUZXh0Tm9kZShjaHVua2VkLCBsZW5ndGgpO1xuICAgIH1cbn1cblRleHQuZW1wdHkgPSAvKkBfX1BVUkVfXyovbmV3IFRleHRMZWFmKFtcIlwiXSwgMCk7XG5mdW5jdGlvbiB0ZXh0TGVuZ3RoKHRleHQpIHtcbiAgICBsZXQgbGVuZ3RoID0gLTE7XG4gICAgZm9yIChsZXQgbGluZSBvZiB0ZXh0KVxuICAgICAgICBsZW5ndGggKz0gbGluZS5sZW5ndGggKyAxO1xuICAgIHJldHVybiBsZW5ndGg7XG59XG5mdW5jdGlvbiBhcHBlbmRUZXh0KHRleHQsIHRhcmdldCwgZnJvbSA9IDAsIHRvID0gMWU5KSB7XG4gICAgZm9yIChsZXQgcG9zID0gMCwgaSA9IDAsIGZpcnN0ID0gdHJ1ZTsgaSA8IHRleHQubGVuZ3RoICYmIHBvcyA8PSB0bzsgaSsrKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGV4dFtpXSwgZW5kID0gcG9zICsgbGluZS5sZW5ndGg7XG4gICAgICAgIGlmIChlbmQgPj0gZnJvbSkge1xuICAgICAgICAgICAgaWYgKGVuZCA+IHRvKVxuICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNsaWNlKDAsIHRvIC0gcG9zKTtcbiAgICAgICAgICAgIGlmIChwb3MgPCBmcm9tKVxuICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNsaWNlKGZyb20gLSBwb3MpO1xuICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3RhcmdldC5sZW5ndGggLSAxXSArPSBsaW5lO1xuICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2gobGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgcG9zID0gZW5kICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIHNsaWNlVGV4dCh0ZXh0LCBmcm9tLCB0bykge1xuICAgIHJldHVybiBhcHBlbmRUZXh0KHRleHQsIFtcIlwiXSwgZnJvbSwgdG8pO1xufVxuY2xhc3MgUmF3VGV4dEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IodGV4dCwgZGlyID0gMSkge1xuICAgICAgICB0aGlzLmRpciA9IGRpcjtcbiAgICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMubGluZUJyZWFrID0gZmFsc2U7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICB0aGlzLm5vZGVzID0gW3RleHRdO1xuICAgICAgICB0aGlzLm9mZnNldHMgPSBbZGlyID4gMCA/IDEgOiAodGV4dCBpbnN0YW5jZW9mIFRleHRMZWFmID8gdGV4dC50ZXh0Lmxlbmd0aCA6IHRleHQuY2hpbGRyZW4ubGVuZ3RoKSA8PCAxXTtcbiAgICB9XG4gICAgbmV4dElubmVyKHNraXAsIGRpcikge1xuICAgICAgICB0aGlzLmRvbmUgPSB0aGlzLmxpbmVCcmVhayA9IGZhbHNlO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMubm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGxldCB0b3AgPSB0aGlzLm5vZGVzW2xhc3RdLCBvZmZzZXRWYWx1ZSA9IHRoaXMub2Zmc2V0c1tsYXN0XSwgb2Zmc2V0ID0gb2Zmc2V0VmFsdWUgPj4gMTtcbiAgICAgICAgICAgIGxldCBzaXplID0gdG9wIGluc3RhbmNlb2YgVGV4dExlYWYgPyB0b3AudGV4dC5sZW5ndGggOiB0b3AuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAoZGlyID4gMCA/IHNpemUgOiAwKSkge1xuICAgICAgICAgICAgICAgIGlmIChsYXN0ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlyID4gMClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3QgLSAxXSsrO1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzLnBvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKG9mZnNldFZhbHVlICYgMSkgPT0gKGRpciA+IDAgPyAwIDogMSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbbGFzdF0gKz0gZGlyO1xuICAgICAgICAgICAgICAgIGlmIChza2lwID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcXG5cIjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNraXAtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRvcCBpbnN0YW5jZW9mIFRleHRMZWFmKSB7XG4gICAgICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBzdHJpbmdcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRvcC50ZXh0W29mZnNldCArIChkaXIgPCAwID8gLTEgOiAwKV07XG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2xhc3RdICs9IGRpcjtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC5sZW5ndGggPiBNYXRoLm1heCgwLCBza2lwKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gc2tpcCA9PSAwID8gbmV4dCA6IGRpciA+IDAgPyBuZXh0LnNsaWNlKHNraXApIDogbmV4dC5zbGljZSgwLCBuZXh0Lmxlbmd0aCAtIHNraXApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2tpcCAtPSBuZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdG9wLmNoaWxkcmVuW29mZnNldCArIChkaXIgPCAwID8gLTEgOiAwKV07XG4gICAgICAgICAgICAgICAgaWYgKHNraXAgPiBuZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBza2lwIC09IG5leHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbbGFzdF0gKz0gZGlyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA8IDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbbGFzdF0tLTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHMucHVzaChkaXIgPiAwID8gMSA6IChuZXh0IGluc3RhbmNlb2YgVGV4dExlYWYgPyBuZXh0LnRleHQubGVuZ3RoIDogbmV4dC5jaGlsZHJlbi5sZW5ndGgpIDw8IDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBuZXh0KHNraXAgPSAwKSB7XG4gICAgICAgIGlmIChza2lwIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5uZXh0SW5uZXIoLXNraXAsICgtdGhpcy5kaXIpKTtcbiAgICAgICAgICAgIHNraXAgPSB0aGlzLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0SW5uZXIoc2tpcCwgdGhpcy5kaXIpO1xuICAgIH1cbn1cbmNsYXNzIFBhcnRpYWxUZXh0Q3Vyc29yIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZXh0LCBzdGFydCwgZW5kKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBuZXcgUmF3VGV4dEN1cnNvcih0ZXh0LCBzdGFydCA+IGVuZCA/IC0xIDogMSk7XG4gICAgICAgIHRoaXMucG9zID0gc3RhcnQgPiBlbmQgPyB0ZXh0Lmxlbmd0aCA6IDA7XG4gICAgICAgIHRoaXMuZnJvbSA9IE1hdGgubWluKHN0YXJ0LCBlbmQpO1xuICAgICAgICB0aGlzLnRvID0gTWF0aC5tYXgoc3RhcnQsIGVuZCk7XG4gICAgfVxuICAgIG5leHRJbm5lcihza2lwLCBkaXIpIHtcbiAgICAgICAgaWYgKGRpciA8IDAgPyB0aGlzLnBvcyA8PSB0aGlzLmZyb20gOiB0aGlzLnBvcyA+PSB0aGlzLnRvKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBza2lwICs9IE1hdGgubWF4KDAsIGRpciA8IDAgPyB0aGlzLnBvcyAtIHRoaXMudG8gOiB0aGlzLmZyb20gLSB0aGlzLnBvcyk7XG4gICAgICAgIGxldCBsaW1pdCA9IGRpciA8IDAgPyB0aGlzLnBvcyAtIHRoaXMuZnJvbSA6IHRoaXMudG8gLSB0aGlzLnBvcztcbiAgICAgICAgaWYgKHNraXAgPiBsaW1pdClcbiAgICAgICAgICAgIHNraXAgPSBsaW1pdDtcbiAgICAgICAgbGltaXQgLT0gc2tpcDtcbiAgICAgICAgbGV0IHsgdmFsdWUgfSA9IHRoaXMuY3Vyc29yLm5leHQoc2tpcCk7XG4gICAgICAgIHRoaXMucG9zICs9ICh2YWx1ZS5sZW5ndGggKyBza2lwKSAqIGRpcjtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlLmxlbmd0aCA8PSBsaW1pdCA/IHZhbHVlIDogZGlyIDwgMCA/IHZhbHVlLnNsaWNlKHZhbHVlLmxlbmd0aCAtIGxpbWl0KSA6IHZhbHVlLnNsaWNlKDAsIGxpbWl0KTtcbiAgICAgICAgdGhpcy5kb25lID0gIXRoaXMudmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBuZXh0KHNraXAgPSAwKSB7XG4gICAgICAgIGlmIChza2lwIDwgMClcbiAgICAgICAgICAgIHNraXAgPSBNYXRoLm1heChza2lwLCB0aGlzLmZyb20gLSB0aGlzLnBvcyk7XG4gICAgICAgIGVsc2UgaWYgKHNraXAgPiAwKVxuICAgICAgICAgICAgc2tpcCA9IE1hdGgubWluKHNraXAsIHRoaXMudG8gLSB0aGlzLnBvcyk7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHRJbm5lcihza2lwLCB0aGlzLmN1cnNvci5kaXIpO1xuICAgIH1cbiAgICBnZXQgbGluZUJyZWFrKCkgeyByZXR1cm4gdGhpcy5jdXJzb3IubGluZUJyZWFrICYmIHRoaXMudmFsdWUgIT0gXCJcIjsgfVxufVxuY2xhc3MgTGluZUN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoaW5uZXIpIHtcbiAgICAgICAgdGhpcy5pbm5lciA9IGlubmVyO1xuICAgICAgICB0aGlzLmFmdGVyQnJlYWsgPSB0cnVlO1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgfVxuICAgIG5leHQoc2tpcCA9IDApIHtcbiAgICAgICAgbGV0IHsgZG9uZSwgbGluZUJyZWFrLCB2YWx1ZSB9ID0gdGhpcy5pbm5lci5uZXh0KHNraXApO1xuICAgICAgICBpZiAoZG9uZSAmJiB0aGlzLmFmdGVyQnJlYWspIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgdGhpcy5hZnRlckJyZWFrID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZG9uZSkge1xuICAgICAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxpbmVCcmVhaykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWZ0ZXJCcmVhaykge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlckJyZWFrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJCcmVhayA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBnZXQgbGluZUJyZWFrKCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbmlmICh0eXBlb2YgU3ltYm9sICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICBUZXh0LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5pdGVyKCk7IH07XG4gICAgUmF3VGV4dEN1cnNvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IFBhcnRpYWxUZXh0Q3Vyc29yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID1cbiAgICAgICAgTGluZUN1cnNvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG59XG4vKipcblRoaXMgdHlwZSBkZXNjcmliZXMgYSBsaW5lIGluIHRoZSBkb2N1bWVudC4gSXQgaXMgY3JlYXRlZFxub24tZGVtYW5kIHdoZW4gbGluZXMgYXJlIFtxdWVyaWVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHQubGluZUF0KS5cbiovXG5jbGFzcyBMaW5lIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgbGluZSAoX2JlZm9yZV8gdGhlIGxpbmUgYnJlYWssXG4gICAgb3IgYXQgdGhlIGVuZCBvZiBkb2N1bWVudCBmb3IgdGhlIGxhc3QgbGluZSkuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhpcyBsaW5lJ3MgbGluZSBudW1iZXIgKDEtYmFzZWQpLlxuICAgICovXG4gICAgbnVtYmVyLCBcbiAgICAvKipcbiAgICBUaGUgbGluZSdzIGNvbnRlbnQuXG4gICAgKi9cbiAgICB0ZXh0KSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGxpbmUgKG5vdCBpbmNsdWRpbmcgYW55IGxpbmUgYnJlYWsgYWZ0ZXIgaXQpLlxuICAgICovXG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMudG8gLSB0aGlzLmZyb207IH1cbn1cbmZ1bmN0aW9uIGNsaXAodGV4dCwgZnJvbSwgdG8pIHtcbiAgICBmcm9tID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGV4dC5sZW5ndGgsIGZyb20pKTtcbiAgICByZXR1cm4gW2Zyb20sIE1hdGgubWF4KGZyb20sIE1hdGgubWluKHRleHQubGVuZ3RoLCB0bykpXTtcbn1cblxuLy8gQ29tcHJlc3NlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgR3JhcGhlbWVfQ2x1c3Rlcl9CcmVhaz1FeHRlbmRcbi8vIGluZm9ybWF0aW9uIGZyb21cbi8vIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzEzLjAuMC91Y2QvYXV4aWxpYXJ5L0dyYXBoZW1lQnJlYWtQcm9wZXJ0eS50eHQuXG4vLyBFYWNoIHBhaXIgb2YgZWxlbWVudHMgcmVwcmVzZW50cyBhIHJhbmdlLCBhcyBhbiBvZmZldCBmcm9tIHRoZVxuLy8gcHJldmlvdXMgcmFuZ2UgYW5kIGEgbGVuZ3RoLiBOdW1iZXJzIGFyZSBpbiBiYXNlLTM2LCB3aXRoIHRoZSBlbXB0eVxuLy8gc3RyaW5nIGJlaW5nIGEgc2hvcnRoYW5kIGZvciAxLlxubGV0IGV4dGVuZCA9IC8qQF9fUFVSRV9fKi9cImxjLDM0LDduLDcsN2IsMTksLCwsMiwsMiwsLDIwLGIsMWMsbCxnLCwydCw3LDIsNiwyLDIsLDQseiwsdSxyLDJqLGIsMW0sOSw5LCxvLDQsLDksLDMsLDUsMTcsMywzYixmLCx3LDFqLCwsLDQsOCw0LCwzLDcsYSwyLHQsLDFtLCwsLDIsNCw4LCw5LCxhLDIscSwsMiwyLDFsLCw0LDIsNCwyLDIsMywzLCx1LDIsMywsYiwyLDFsLCw0LDUsLDIsNCwsaywyLG0sNiwsLDFtLCwsMiwsNCw4LCw3LDMsYSwyLHUsLDFuLCwsLGMsLDksLDE0LCwzLCwxbCwzLDUsMywsNCw3LDIsYiwyLHQsLDFtLCwyLCwyLCwzLCw1LDIsNywyLGIsMixzLDIsMWwsMiwsLDIsNCw4LCw5LCxhLDIsdCwsMjAsLDQsLDIsMywsLDgsLDI5LCwyLDcsYyw4LDJxLCwyLDksYiw2LDIyLDIsciwsLCwsLDFqLGUsLDUsLDIsNSxiLCwxMCw5LCwydSw0LCw2LCwyLDIsMixwLDIsNCwzLGcsNCxkLCwyLDIsNiwsZiwsamosMyxxYSwzLHQsMyx0LDIsdSwyLDFzLDIsLDcsOCwsMixiLDksLDE5LDMsM2IsMix5LCwzYSwzLDQsMiw5LCw2LDMsNjMsMiwyLCwxbSwsLDcsLCwsLDIsOCw2LGEsMiwsMWMsaCwxciw0LDFjLDcsLCw1LCwxNCw5LGMsMix3LDQsMiwyLCwzLDFrLCwsMiwzLCwsMywxbSw4LDIsMiw0OCwzLCxkLCw3LDQsLDYsLDMsMiw1aSwxbSwsNSxlaywsNWYseCwyZGEsMywzeCwsMm8sdyxmZSw2LDJ4LDIsbjl3LDQsLGEsdywyLDI4LDIsN2ssLDMsLDQsLHAsMiw1LCw0NywyLHEsaSxkLCwxMiw4LHAsYiwxYSwzLDFjLCwyLDQsMiwyLDEzLCwxdiw2LDIsMiwyLDIsYywsOCwsMWIsLDFmLCwsMywyLDIsNSwyLCwsMTYsMiw4LCw2bSwsMiwsNCwsZm40LCxraCxnLGcsZyxhNiwyLGd0LCw2YSwsNDUsNSwxYWUsMywsMiw1LDQsMTQsMyw0LCw0bCwyLGZ4LDQsYXIsMiw0OSxiLDR3LCwxaSxmLDFrLDMsMWQsNCwyLDIsMXgsMywxMCw1LCw4LDFxLCxjLDIsMWcsOSxhLDQsMiwsMm4sMywyLCwsMiw2LCw0ZywsMyw4LGwsMiwxbCwyLCwsLCxtLCxlLDcsMyw1LDVmLDgsMiwzLCwsbiwsMjksLDIsNiwsLDIsLCwyLCwyLDZqLCwyLDQsNiwyLCwyLHIsMiwyZCw4LDIsLCwyLDJ5LCwsLDIsNiwsLDJ0LDMsMiw0LCw1LDc3LDksLDIsNnQsLGEsMiwsLDQsLDQwLDQsMiwyLDQsLHcsYSwxNCw2LDIsNCw4LCw5LDYsMiwzLDFhLGQsLDIsYmEsNywsNiwsLDJhLG0sMiw3LCwyLCwyLDNlLDYsMywsLDIsLDcsLCwyMCwyLDMsLCwsOW4sMixmMGIsNSwxbiw3LHQ0LCwxciw0LDI5LCxmNWssMiw0M3EsLCwzLDQsNSw4LDgsMiw3LHUsNCw0NCwzLDFpeiwxaiw0LDFlLDgsLGUsLG0sNSwsZiwxMXMsNywsaCwyLDcsLDIsLDUsNzksNyxjNSw0LDE1cyw3LDMxLDcsMjQwLDUsZ3g3aywybywzayw2b1wiLnNwbGl0KFwiLFwiKS5tYXAocyA9PiBzID8gcGFyc2VJbnQocywgMzYpIDogMSk7XG4vLyBDb252ZXJ0IG9mZnNldHMgaW50byBhYnNvbHV0ZSB2YWx1ZXNcbmZvciAobGV0IGkgPSAxOyBpIDwgZXh0ZW5kLmxlbmd0aDsgaSsrKVxuICAgIGV4dGVuZFtpXSArPSBleHRlbmRbaSAtIDFdO1xuZnVuY3Rpb24gaXNFeHRlbmRpbmdDaGFyKGNvZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGV4dGVuZC5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgaWYgKGV4dGVuZFtpXSA+IGNvZGUpXG4gICAgICAgICAgICByZXR1cm4gZXh0ZW5kW2kgLSAxXSA8PSBjb2RlO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzUmVnaW9uYWxJbmRpY2F0b3IoY29kZSkge1xuICAgIHJldHVybiBjb2RlID49IDB4MUYxRTYgJiYgY29kZSA8PSAweDFGMUZGO1xufVxuY29uc3QgWldKID0gMHgyMDBkO1xuLyoqXG5SZXR1cm5zIGEgbmV4dCBncmFwaGVtZSBjbHVzdGVyIGJyZWFrIF9hZnRlcl8gKG5vdCBlcXVhbCB0bylcbmBwb3NgLCBpZiBgZm9yd2FyZGAgaXMgdHJ1ZSwgb3IgYmVmb3JlIG90aGVyd2lzZS4gUmV0dXJucyBgcG9zYFxuaXRzZWxmIGlmIG5vIGZ1cnRoZXIgY2x1c3RlciBicmVhayBpcyBhdmFpbGFibGUgaW4gdGhlIHN0cmluZy5cbk1vdmVzIGFjcm9zcyBzdXJyb2dhdGUgcGFpcnMsIGV4dGVuZGluZyBjaGFyYWN0ZXJzICh3aGVuXG5gaW5jbHVkZUV4dGVuZGluZ2AgaXMgdHJ1ZSksIGNoYXJhY3RlcnMgam9pbmVkIHdpdGggemVyby13aWR0aFxuam9pbmVycywgYW5kIGZsYWcgZW1vamkuXG4qL1xuZnVuY3Rpb24gZmluZENsdXN0ZXJCcmVhayhzdHIsIHBvcywgZm9yd2FyZCA9IHRydWUsIGluY2x1ZGVFeHRlbmRpbmcgPSB0cnVlKSB7XG4gICAgcmV0dXJuIChmb3J3YXJkID8gbmV4dENsdXN0ZXJCcmVhayA6IHByZXZDbHVzdGVyQnJlYWspKHN0ciwgcG9zLCBpbmNsdWRlRXh0ZW5kaW5nKTtcbn1cbmZ1bmN0aW9uIG5leHRDbHVzdGVyQnJlYWsoc3RyLCBwb3MsIGluY2x1ZGVFeHRlbmRpbmcpIHtcbiAgICBpZiAocG9zID09IHN0ci5sZW5ndGgpXG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgLy8gSWYgcG9zIGlzIGluIHRoZSBtaWRkbGUgb2YgYSBzdXJyb2dhdGUgcGFpciwgbW92ZSB0byBpdHMgc3RhcnRcbiAgICBpZiAocG9zICYmIHN1cnJvZ2F0ZUxvdyhzdHIuY2hhckNvZGVBdChwb3MpKSAmJiBzdXJyb2dhdGVIaWdoKHN0ci5jaGFyQ29kZUF0KHBvcyAtIDEpKSlcbiAgICAgICAgcG9zLS07XG4gICAgbGV0IHByZXYgPSBjb2RlUG9pbnRBdChzdHIsIHBvcyk7XG4gICAgcG9zICs9IGNvZGVQb2ludFNpemUocHJldik7XG4gICAgd2hpbGUgKHBvcyA8IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG5leHQgPSBjb2RlUG9pbnRBdChzdHIsIHBvcyk7XG4gICAgICAgIGlmIChwcmV2ID09IFpXSiB8fCBuZXh0ID09IFpXSiB8fCBpbmNsdWRlRXh0ZW5kaW5nICYmIGlzRXh0ZW5kaW5nQ2hhcihuZXh0KSkge1xuICAgICAgICAgICAgcG9zICs9IGNvZGVQb2ludFNpemUobmV4dCk7XG4gICAgICAgICAgICBwcmV2ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1JlZ2lvbmFsSW5kaWNhdG9yKG5leHQpKSB7XG4gICAgICAgICAgICBsZXQgY291bnRCZWZvcmUgPSAwLCBpID0gcG9zIC0gMjtcbiAgICAgICAgICAgIHdoaWxlIChpID49IDAgJiYgaXNSZWdpb25hbEluZGljYXRvcihjb2RlUG9pbnRBdChzdHIsIGkpKSkge1xuICAgICAgICAgICAgICAgIGNvdW50QmVmb3JlKys7XG4gICAgICAgICAgICAgICAgaSAtPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvdW50QmVmb3JlICUgMiA9PSAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBvcyArPSAyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBvcztcbn1cbmZ1bmN0aW9uIHByZXZDbHVzdGVyQnJlYWsoc3RyLCBwb3MsIGluY2x1ZGVFeHRlbmRpbmcpIHtcbiAgICB3aGlsZSAocG9zID4gMCkge1xuICAgICAgICBsZXQgZm91bmQgPSBuZXh0Q2x1c3RlckJyZWFrKHN0ciwgcG9zIC0gMiwgaW5jbHVkZUV4dGVuZGluZyk7XG4gICAgICAgIGlmIChmb3VuZCA8IHBvcylcbiAgICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgcG9zLS07XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuZnVuY3Rpb24gc3Vycm9nYXRlTG93KGNoKSB7IHJldHVybiBjaCA+PSAweERDMDAgJiYgY2ggPCAweEUwMDA7IH1cbmZ1bmN0aW9uIHN1cnJvZ2F0ZUhpZ2goY2gpIHsgcmV0dXJuIGNoID49IDB4RDgwMCAmJiBjaCA8IDB4REMwMDsgfVxuLyoqXG5GaW5kIHRoZSBjb2RlIHBvaW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBhIHN0cmluZyAobGlrZSB0aGVcbltgY29kZVBvaW50QXRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvY29kZVBvaW50QXQpXG5zdHJpbmcgbWV0aG9kKS5cbiovXG5mdW5jdGlvbiBjb2RlUG9pbnRBdChzdHIsIHBvcykge1xuICAgIGxldCBjb2RlMCA9IHN0ci5jaGFyQ29kZUF0KHBvcyk7XG4gICAgaWYgKCFzdXJyb2dhdGVIaWdoKGNvZGUwKSB8fCBwb3MgKyAxID09IHN0ci5sZW5ndGgpXG4gICAgICAgIHJldHVybiBjb2RlMDtcbiAgICBsZXQgY29kZTEgPSBzdHIuY2hhckNvZGVBdChwb3MgKyAxKTtcbiAgICBpZiAoIXN1cnJvZ2F0ZUxvdyhjb2RlMSkpXG4gICAgICAgIHJldHVybiBjb2RlMDtcbiAgICByZXR1cm4gKChjb2RlMCAtIDB4ZDgwMCkgPDwgMTApICsgKGNvZGUxIC0gMHhkYzAwKSArIDB4MTAwMDA7XG59XG4vKipcbkdpdmVuIGEgVW5pY29kZSBjb2RlcG9pbnQsIHJldHVybiB0aGUgSmF2YVNjcmlwdCBzdHJpbmcgdGhhdFxucmVzcHJlc2VudHMgaXQgKGxpa2VcbltgU3RyaW5nLmZyb21Db2RlUG9pbnRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvZnJvbUNvZGVQb2ludCkpLlxuKi9cbmZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoY29kZSkge1xuICAgIGlmIChjb2RlIDw9IDB4ZmZmZilcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7XG4gICAgY29kZSAtPSAweDEwMDAwO1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlID4+IDEwKSArIDB4ZDgwMCwgKGNvZGUgJiAxMDIzKSArIDB4ZGMwMCk7XG59XG4vKipcblRoZSBhbW91bnQgb2YgcG9zaXRpb25zIGEgY2hhcmFjdGVyIHRha2VzIHVwIGEgSmF2YVNjcmlwdCBzdHJpbmcuXG4qL1xuZnVuY3Rpb24gY29kZVBvaW50U2l6ZShjb2RlKSB7IHJldHVybiBjb2RlIDwgMHgxMDAwMCA/IDEgOiAyOyB9XG5cbmNvbnN0IERlZmF1bHRTcGxpdCA9IC9cXHJcXG4/fFxcbi87XG4vKipcbkRpc3Rpbmd1aXNoZXMgZGlmZmVyZW50IHdheXMgaW4gd2hpY2ggcG9zaXRpb25zIGNhbiBiZSBtYXBwZWQuXG4qL1xudmFyIE1hcE1vZGUgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChNYXBNb2RlKSB7XG4gICAgLyoqXG4gICAgTWFwIGEgcG9zaXRpb24gdG8gYSB2YWxpZCBuZXcgcG9zaXRpb24sIGV2ZW4gd2hlbiBpdHMgY29udGV4dFxuICAgIHdhcyBkZWxldGVkLlxuICAgICovXG4gICAgTWFwTW9kZVtNYXBNb2RlW1wiU2ltcGxlXCJdID0gMF0gPSBcIlNpbXBsZVwiO1xuICAgIC8qKlxuICAgIFJldHVybiBudWxsIGlmIGRlbGV0aW9uIGhhcHBlbnMgYWNyb3NzIHRoZSBwb3NpdGlvbi5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlRyYWNrRGVsXCJdID0gMV0gPSBcIlRyYWNrRGVsXCI7XG4gICAgLyoqXG4gICAgUmV0dXJuIG51bGwgaWYgdGhlIGNoYXJhY3RlciBfYmVmb3JlXyB0aGUgcG9zaXRpb24gaXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIE1hcE1vZGVbTWFwTW9kZVtcIlRyYWNrQmVmb3JlXCJdID0gMl0gPSBcIlRyYWNrQmVmb3JlXCI7XG4gICAgLyoqXG4gICAgUmV0dXJuIG51bGwgaWYgdGhlIGNoYXJhY3RlciBfYWZ0ZXJfIHRoZSBwb3NpdGlvbiBpcyBkZWxldGVkLlxuICAgICovXG4gICAgTWFwTW9kZVtNYXBNb2RlW1wiVHJhY2tBZnRlclwiXSA9IDNdID0gXCJUcmFja0FmdGVyXCI7XG5yZXR1cm4gTWFwTW9kZX0pKE1hcE1vZGUgfHwgKE1hcE1vZGUgPSB7fSkpO1xuLyoqXG5BIGNoYW5nZSBkZXNjcmlwdGlvbiBpcyBhIHZhcmlhbnQgb2YgW2NoYW5nZSBzZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0KVxudGhhdCBkb2Vzbid0IHN0b3JlIHRoZSBpbnNlcnRlZCB0ZXh0LiBBcyBzdWNoLCBpdCBjYW4ndCBiZVxuYXBwbGllZCwgYnV0IGlzIGNoZWFwZXIgdG8gc3RvcmUgYW5kIG1hbmlwdWxhdGUuXG4qL1xuY2xhc3MgQ2hhbmdlRGVzYyB7XG4gICAgLy8gU2VjdGlvbnMgYXJlIGVuY29kZWQgYXMgcGFpcnMgb2YgaW50ZWdlcnMuIFRoZSBmaXJzdCBpcyB0aGVcbiAgICAvLyBsZW5ndGggaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQsIGFuZCB0aGUgc2Vjb25kIGlzIC0xIGZvclxuICAgIC8vIHVuYWZmZWN0ZWQgc2VjdGlvbnMsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSByZXBsYWNlbWVudCBjb250ZW50XG4gICAgLy8gb3RoZXJ3aXNlLiBTbyBhbiBpbnNlcnRpb24gd291bGQgYmUgKDAsIG4+MCksIGEgZGVsZXRpb24gKG4+MCxcbiAgICAvLyAwKSwgYW5kIGEgcmVwbGFjZW1lbnQgdHdvIHBvc2l0aXZlIG51bWJlcnMuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNlY3Rpb25zKSB7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBzZWN0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuc2VjdGlvbnNbaV07XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IGFmdGVyIHRoZSBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgbmV3TGVuZ3RoKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBsZXQgaW5zID0gdGhpcy5zZWN0aW9uc1tpICsgMV07XG4gICAgICAgICAgICByZXN1bHQgKz0gaW5zIDwgMCA/IHRoaXMuc2VjdGlvbnNbaV0gOiBpbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRmFsc2Ugd2hlbiB0aGVyZSBhcmUgYWN0dWFsIGNoYW5nZXMgaW4gdGhpcyBzZXQuXG4gICAgKi9cbiAgICBnZXQgZW1wdHkoKSB7IHJldHVybiB0aGlzLnNlY3Rpb25zLmxlbmd0aCA9PSAwIHx8IHRoaXMuc2VjdGlvbnMubGVuZ3RoID09IDIgJiYgdGhpcy5zZWN0aW9uc1sxXSA8IDA7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHVuY2hhbmdlZCBwYXJ0cyBsZWZ0IGJ5IHRoZXNlIGNoYW5nZXMuIGBwb3NBYFxuICAgIHByb3ZpZGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmFuZ2UgaW4gdGhlIG9sZCBkb2N1bWVudCwgYHBvc0JgXG4gICAgdGhlIG5ldyBwb3NpdGlvbiBpbiB0aGUgY2hhbmdlZCBkb2N1bWVudC5cbiAgICAqL1xuICAgIGl0ZXJHYXBzKGYpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvc0EgPSAwLCBwb3NCID0gMDsgaSA8IHRoaXMuc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgaW5zID0gdGhpcy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApIHtcbiAgICAgICAgICAgICAgICBmKHBvc0EsIHBvc0IsIGxlbik7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwb3NCICs9IGlucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvc0EgKz0gbGVuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgcmFuZ2VzIGNoYW5nZWQgYnkgdGhlc2UgY2hhbmdlcy4gKFNlZVxuICAgIFtgQ2hhbmdlU2V0Lml0ZXJDaGFuZ2VzYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VTZXQuaXRlckNoYW5nZXMpIGZvciBhXG4gICAgdmFyaWFudCB0aGF0IGFsc28gcHJvdmlkZXMgeW91IHdpdGggdGhlIGluc2VydGVkIHRleHQuKVxuICAgIGBmcm9tQWAvYHRvQWAgcHJvdmlkZXMgdGhlIGV4dGVudCBvZiB0aGUgY2hhbmdlIGluIHRoZSBzdGFydGluZ1xuICAgIGRvY3VtZW50LCBgZnJvbUJgL2B0b0JgIHRoZSBleHRlbnQgb2YgdGhlIHJlcGxhY2VtZW50IGluIHRoZVxuICAgIGNoYW5nZWQgZG9jdW1lbnQuXG4gICAgXG4gICAgV2hlbiBgaW5kaXZpZHVhbGAgaXMgdHJ1ZSwgYWRqYWNlbnQgY2hhbmdlcyAod2hpY2ggYXJlIGtlcHRcbiAgICBzZXBhcmF0ZSBmb3IgW3Bvc2l0aW9uIG1hcHBpbmddKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlRGVzYy5tYXBQb3MpKSBhcmVcbiAgICByZXBvcnRlZCBzZXBhcmF0ZWx5LlxuICAgICovXG4gICAgaXRlckNoYW5nZWRSYW5nZXMoZiwgaW5kaXZpZHVhbCA9IGZhbHNlKSB7XG4gICAgICAgIGl0ZXJDaGFuZ2VzKHRoaXMsIGYsIGluZGl2aWR1YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaW52ZXJ0ZWQgZm9ybSBvZiB0aGVzZSBjaGFuZ2VzLlxuICAgICovXG4gICAgZ2V0IGludmVydGVkRGVzYygpIHtcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK107XG4gICAgICAgICAgICBpZiAoaW5zIDwgMClcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKGxlbiwgaW5zKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKGlucywgbGVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENoYW5nZURlc2Moc2VjdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wdXRlIHRoZSBjb21iaW5lZCBlZmZlY3Qgb2YgYXBwbHlpbmcgYW5vdGhlciBzZXQgb2YgY2hhbmdlc1xuICAgIGFmdGVyIHRoaXMgb25lLiBUaGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCBhZnRlciB0aGlzIHNldCBzaG91bGRcbiAgICBtYXRjaCB0aGUgbGVuZ3RoIGJlZm9yZSBgb3RoZXJgLlxuICAgICovXG4gICAgY29tcG9zZURlc2Mob3RoZXIpIHsgcmV0dXJuIHRoaXMuZW1wdHkgPyBvdGhlciA6IG90aGVyLmVtcHR5ID8gdGhpcyA6IGNvbXBvc2VTZXRzKHRoaXMsIG90aGVyKTsgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIGRlc2NyaXB0aW9uLCB3aGljaCBzaG91bGQgc3RhcnQgd2l0aCB0aGUgc2FtZSBkb2N1bWVudFxuICAgIGFzIGBvdGhlcmAsIG92ZXIgYW5vdGhlciBzZXQgb2YgY2hhbmdlcywgc28gdGhhdCBpdCBjYW4gYmVcbiAgICBhcHBsaWVkIGFmdGVyIGl0LiBXaGVuIGBiZWZvcmVgIGlzIHRydWUsIG1hcCBhcyBpZiB0aGUgY2hhbmdlc1xuICAgIGluIGBvdGhlcmAgaGFwcGVuZWQgYmVmb3JlIHRoZSBvbmVzIGluIGB0aGlzYC5cbiAgICAqL1xuICAgIG1hcERlc2Mob3RoZXIsIGJlZm9yZSA9IGZhbHNlKSB7IHJldHVybiBvdGhlci5lbXB0eSA/IHRoaXMgOiBtYXBTZXQodGhpcywgb3RoZXIsIGJlZm9yZSk7IH1cbiAgICBtYXBQb3MocG9zLCBhc3NvYyA9IC0xLCBtb2RlID0gTWFwTW9kZS5TaW1wbGUpIHtcbiAgICAgICAgbGV0IHBvc0EgPSAwLCBwb3NCID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aDspIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnNlY3Rpb25zW2krK10sIGlucyA9IHRoaXMuc2VjdGlvbnNbaSsrXSwgZW5kQSA9IHBvc0EgKyBsZW47XG4gICAgICAgICAgICBpZiAoaW5zIDwgMCkge1xuICAgICAgICAgICAgICAgIGlmIChlbmRBID4gcG9zKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zQiArIChwb3MgLSBwb3NBKTtcbiAgICAgICAgICAgICAgICBwb3NCICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlICE9IE1hcE1vZGUuU2ltcGxlICYmIGVuZEEgPj0gcG9zICYmXG4gICAgICAgICAgICAgICAgICAgIChtb2RlID09IE1hcE1vZGUuVHJhY2tEZWwgJiYgcG9zQSA8IHBvcyAmJiBlbmRBID4gcG9zIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID09IE1hcE1vZGUuVHJhY2tCZWZvcmUgJiYgcG9zQSA8IHBvcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PSBNYXBNb2RlLlRyYWNrQWZ0ZXIgJiYgZW5kQSA+IHBvcykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChlbmRBID4gcG9zIHx8IGVuZEEgPT0gcG9zICYmIGFzc29jIDwgMCAmJiAhbGVuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zID09IHBvc0EgfHwgYXNzb2MgPCAwID8gcG9zQiA6IHBvc0IgKyBpbnM7XG4gICAgICAgICAgICAgICAgcG9zQiArPSBpbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3NBID0gZW5kQTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zID4gcG9zQSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBQb3NpdGlvbiAke3Bvc30gaXMgb3V0IG9mIHJhbmdlIGZvciBjaGFuZ2VzZXQgb2YgbGVuZ3RoICR7cG9zQX1gKTtcbiAgICAgICAgcmV0dXJuIHBvc0I7XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIHdoZXRoZXIgdGhlc2UgY2hhbmdlcyB0b3VjaCBhIGdpdmVuIHJhbmdlLiBXaGVuIG9uZSBvZiB0aGVcbiAgICBjaGFuZ2VzIGVudGlyZWx5IGNvdmVycyB0aGUgcmFuZ2UsIHRoZSBzdHJpbmcgYFwiY292ZXJcImAgaXNcbiAgICByZXR1cm5lZC5cbiAgICAqL1xuICAgIHRvdWNoZXNSYW5nZShmcm9tLCB0byA9IGZyb20pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCB0aGlzLnNlY3Rpb25zLmxlbmd0aCAmJiBwb3MgPD0gdG87KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK10sIGVuZCA9IHBvcyArIGxlbjtcbiAgICAgICAgICAgIGlmIChpbnMgPj0gMCAmJiBwb3MgPD0gdG8gJiYgZW5kID49IGZyb20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcyA8IGZyb20gJiYgZW5kID4gdG8gPyBcImNvdmVyXCIgOiB0cnVlO1xuICAgICAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5zZWN0aW9uc1tpKytdLCBpbnMgPSB0aGlzLnNlY3Rpb25zW2krK107XG4gICAgICAgICAgICByZXN1bHQgKz0gKHJlc3VsdCA/IFwiIFwiIDogXCJcIikgKyBsZW4gKyAoaW5zID49IDAgPyBcIjpcIiArIGlucyA6IFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGlzIGNoYW5nZSBkZXNjIHRvIGEgSlNPTi1yZXByZXNlbnRhYmxlIHZhbHVlLlxuICAgICovXG4gICAgdG9KU09OKCkgeyByZXR1cm4gdGhpcy5zZWN0aW9uczsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNoYW5nZSBkZXNjIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24gKGFzIHByb2R1Y2VkXG4gICAgYnkgW2B0b0pTT05gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZURlc2MudG9KU09OKS5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uKSB8fCBqc29uLmxlbmd0aCAlIDIgfHwganNvbi5zb21lKGEgPT4gdHlwZW9mIGEgIT0gXCJudW1iZXJcIikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBDaGFuZ2VEZXNjXCIpO1xuICAgICAgICByZXR1cm4gbmV3IENoYW5nZURlc2MoanNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShzZWN0aW9ucykgeyByZXR1cm4gbmV3IENoYW5nZURlc2Moc2VjdGlvbnMpOyB9XG59XG4vKipcbkEgY2hhbmdlIHNldCByZXByZXNlbnRzIGEgZ3JvdXAgb2YgbW9kaWZpY2F0aW9ucyB0byBhIGRvY3VtZW50LiBJdFxuc3RvcmVzIHRoZSBkb2N1bWVudCBsZW5ndGgsIGFuZCBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGRvY3VtZW50c1xud2l0aCBleGFjdGx5IHRoYXQgbGVuZ3RoLlxuKi9cbmNsYXNzIENoYW5nZVNldCBleHRlbmRzIENoYW5nZURlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHNlY3Rpb25zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGluc2VydGVkKSB7XG4gICAgICAgIHN1cGVyKHNlY3Rpb25zKTtcbiAgICAgICAgdGhpcy5pbnNlcnRlZCA9IGluc2VydGVkO1xuICAgIH1cbiAgICAvKipcbiAgICBBcHBseSB0aGUgY2hhbmdlcyB0byBhIGRvY3VtZW50LCByZXR1cm5pbmcgdGhlIG1vZGlmaWVkXG4gICAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9IGRvYy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkFwcGx5aW5nIGNoYW5nZSBzZXQgdG8gYSBkb2N1bWVudCB3aXRoIHRoZSB3cm9uZyBsZW5ndGhcIik7XG4gICAgICAgIGl0ZXJDaGFuZ2VzKHRoaXMsIChmcm9tQSwgdG9BLCBmcm9tQiwgX3RvQiwgdGV4dCkgPT4gZG9jID0gZG9jLnJlcGxhY2UoZnJvbUIsIGZyb21CICsgKHRvQSAtIGZyb21BKSwgdGV4dCksIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGRvYztcbiAgICB9XG4gICAgbWFwRGVzYyhvdGhlciwgYmVmb3JlID0gZmFsc2UpIHsgcmV0dXJuIG1hcFNldCh0aGlzLCBvdGhlciwgYmVmb3JlLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEdpdmVuIHRoZSBkb2N1bWVudCBhcyBpdCBleGlzdGVkIF9iZWZvcmVfIHRoZSBjaGFuZ2VzLCByZXR1cm4gYVxuICAgIGNoYW5nZSBzZXQgdGhhdCByZXByZXNlbnRzIHRoZSBpbnZlcnNlIG9mIHRoaXMgc2V0LCB3aGljaCBjb3VsZFxuICAgIGJlIHVzZWQgdG8gZ28gZnJvbSB0aGUgZG9jdW1lbnQgY3JlYXRlZCBieSB0aGUgY2hhbmdlcyBiYWNrIHRvXG4gICAgdGhlIGRvY3VtZW50IGFzIGl0IGV4aXN0ZWQgYmVmb3JlIHRoZSBjaGFuZ2VzLlxuICAgICovXG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICBsZXQgc2VjdGlvbnMgPSB0aGlzLnNlY3Rpb25zLnNsaWNlKCksIGluc2VydGVkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgc2VjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSBzZWN0aW9uc1tpXSwgaW5zID0gc2VjdGlvbnNbaSArIDFdO1xuICAgICAgICAgICAgaWYgKGlucyA+PSAwKSB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnNbaV0gPSBpbnM7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnNbaSArIDFdID0gbGVuO1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGkgPj4gMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5zZXJ0ZWQubGVuZ3RoIDwgaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIGluc2VydGVkLnB1c2goVGV4dC5lbXB0eSk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0ZWQucHVzaChsZW4gPyBkb2Muc2xpY2UocG9zLCBwb3MgKyBsZW4pIDogVGV4dC5lbXB0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgKz0gbGVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbWJpbmUgdHdvIHN1YnNlcXVlbnQgY2hhbmdlIHNldHMgaW50byBhIHNpbmdsZSBzZXQuIGBvdGhlcmBcbiAgICBtdXN0IHN0YXJ0IGluIHRoZSBkb2N1bWVudCBwcm9kdWNlZCBieSBgdGhpc2AuIElmIGB0aGlzYCBnb2VzXG4gICAgYGRvY0FgIFx1MjE5MiBgZG9jQmAgYW5kIGBvdGhlcmAgcmVwcmVzZW50cyBgZG9jQmAgXHUyMTkyIGBkb2NDYCwgdGhlXG4gICAgcmV0dXJuZWQgdmFsdWUgd2lsbCByZXByZXNlbnQgdGhlIGNoYW5nZSBgZG9jQWAgXHUyMTkyIGBkb2NDYC5cbiAgICAqL1xuICAgIGNvbXBvc2Uob3RoZXIpIHsgcmV0dXJuIHRoaXMuZW1wdHkgPyBvdGhlciA6IG90aGVyLmVtcHR5ID8gdGhpcyA6IGNvbXBvc2VTZXRzKHRoaXMsIG90aGVyLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEdpdmVuIGFub3RoZXIgY2hhbmdlIHNldCBzdGFydGluZyBpbiB0aGUgc2FtZSBkb2N1bWVudCwgbWFwcyB0aGlzXG4gICAgY2hhbmdlIHNldCBvdmVyIHRoZSBvdGhlciwgcHJvZHVjaW5nIGEgbmV3IGNoYW5nZSBzZXQgdGhhdCBjYW4gYmVcbiAgICBhcHBsaWVkIHRvIHRoZSBkb2N1bWVudCBwcm9kdWNlZCBieSBhcHBseWluZyBgb3RoZXJgLiBXaGVuXG4gICAgYGJlZm9yZWAgaXMgYHRydWVgLCBvcmRlciBjaGFuZ2VzIGFzIGlmIGB0aGlzYCBjb21lcyBiZWZvcmVcbiAgICBgb3RoZXJgLCBvdGhlcndpc2UgKHRoZSBkZWZhdWx0KSB0cmVhdCBgb3RoZXJgIGFzIGNvbWluZyBmaXJzdC5cbiAgICBcbiAgICBHaXZlbiB0d28gY2hhbmdlcyBgQWAgYW5kIGBCYCwgYEEuY29tcG9zZShCLm1hcChBKSlgIGFuZFxuICAgIGBCLmNvbXBvc2UoQS5tYXAoQiwgdHJ1ZSkpYCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgZG9jdW1lbnQuIFRoaXNcbiAgICBwcm92aWRlcyBhIGJhc2ljIGZvcm0gb2YgW29wZXJhdGlvbmFsXG4gICAgdHJhbnNmb3JtYXRpb25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09wZXJhdGlvbmFsX3RyYW5zZm9ybWF0aW9uKSxcbiAgICBhbmQgY2FuIGJlIHVzZWQgZm9yIGNvbGxhYm9yYXRpdmUgZWRpdGluZy5cbiAgICAqL1xuICAgIG1hcChvdGhlciwgYmVmb3JlID0gZmFsc2UpIHsgcmV0dXJuIG90aGVyLmVtcHR5ID8gdGhpcyA6IG1hcFNldCh0aGlzLCBvdGhlciwgYmVmb3JlLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgY2hhbmdlZCByYW5nZXMgaW4gdGhlIGRvY3VtZW50LCBjYWxsaW5nIGBmYCBmb3JcbiAgICBlYWNoLCB3aXRoIHRoZSByYW5nZSBpbiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgKGBmcm9tQWAtYHRvQWApXG4gICAgYW5kIHRoZSByYW5nZSB0aGF0IHJlcGxhY2VzIGl0IGluIHRoZSBuZXcgZG9jdW1lbnRcbiAgICAoYGZyb21CYC1gdG9CYCkuXG4gICAgXG4gICAgV2hlbiBgaW5kaXZpZHVhbGAgaXMgdHJ1ZSwgYWRqYWNlbnQgY2hhbmdlcyBhcmUgcmVwb3J0ZWRcbiAgICBzZXBhcmF0ZWx5LlxuICAgICovXG4gICAgaXRlckNoYW5nZXMoZiwgaW5kaXZpZHVhbCA9IGZhbHNlKSB7XG4gICAgICAgIGl0ZXJDaGFuZ2VzKHRoaXMsIGYsIGluZGl2aWR1YWwpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbY2hhbmdlIGRlc2NyaXB0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNoYW5nZURlc2MpIGZvciB0aGlzIGNoYW5nZVxuICAgIHNldC5cbiAgICAqL1xuICAgIGdldCBkZXNjKCkgeyByZXR1cm4gQ2hhbmdlRGVzYy5jcmVhdGUodGhpcy5zZWN0aW9ucyk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbHRlcihyYW5nZXMpIHtcbiAgICAgICAgbGV0IHJlc3VsdFNlY3Rpb25zID0gW10sIHJlc3VsdEluc2VydGVkID0gW10sIGZpbHRlcmVkU2VjdGlvbnMgPSBbXTtcbiAgICAgICAgbGV0IGl0ZXIgPSBuZXcgU2VjdGlvbkl0ZXIodGhpcyk7XG4gICAgICAgIGRvbmU6IGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gaSA9PSByYW5nZXMubGVuZ3RoID8gMWU5IDogcmFuZ2VzW2krK107XG4gICAgICAgICAgICB3aGlsZSAocG9zIDwgbmV4dCB8fCBwb3MgPT0gbmV4dCAmJiBpdGVyLmxlbiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXIuZG9uZSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgZG9uZTtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gTWF0aC5taW4oaXRlci5sZW4sIG5leHQgLSBwb3MpO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oZmlsdGVyZWRTZWN0aW9ucywgbGVuLCAtMSk7XG4gICAgICAgICAgICAgICAgbGV0IGlucyA9IGl0ZXIuaW5zID09IC0xID8gLTEgOiBpdGVyLm9mZiA9PSAwID8gaXRlci5pbnMgOiAwO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24ocmVzdWx0U2VjdGlvbnMsIGxlbiwgaW5zKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5zID4gMClcbiAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KHJlc3VsdEluc2VydGVkLCByZXN1bHRTZWN0aW9ucywgaXRlci50ZXh0KTtcbiAgICAgICAgICAgICAgICBpdGVyLmZvcndhcmQobGVuKTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGVuZCA9IHJhbmdlc1tpKytdO1xuICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGVuZCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyLmRvbmUpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIGRvbmU7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IE1hdGgubWluKGl0ZXIubGVuLCBlbmQgLSBwb3MpO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24ocmVzdWx0U2VjdGlvbnMsIGxlbiwgLTEpO1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oZmlsdGVyZWRTZWN0aW9ucywgbGVuLCBpdGVyLmlucyA9PSAtMSA/IC0xIDogaXRlci5vZmYgPT0gMCA/IGl0ZXIuaW5zIDogMCk7XG4gICAgICAgICAgICAgICAgaXRlci5mb3J3YXJkKGxlbik7XG4gICAgICAgICAgICAgICAgcG9zICs9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjaGFuZ2VzOiBuZXcgQ2hhbmdlU2V0KHJlc3VsdFNlY3Rpb25zLCByZXN1bHRJbnNlcnRlZCksXG4gICAgICAgICAgICBmaWx0ZXJlZDogQ2hhbmdlRGVzYy5jcmVhdGUoZmlsdGVyZWRTZWN0aW9ucykgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2VyaWFsaXplIHRoaXMgY2hhbmdlIHNldCB0byBhIEpTT04tcmVwcmVzZW50YWJsZSB2YWx1ZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IHBhcnRzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9ucy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuc2VjdGlvbnNbaV0sIGlucyA9IHRoaXMuc2VjdGlvbnNbaSArIDFdO1xuICAgICAgICAgICAgaWYgKGlucyA8IDApXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChsZW4pO1xuICAgICAgICAgICAgZWxzZSBpZiAoaW5zID09IDApXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChbbGVuXSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChbbGVuXS5jb25jYXQodGhpcy5pbnNlcnRlZFtpID4+IDFdLnRvSlNPTigpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRzO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjaGFuZ2Ugc2V0IGZvciB0aGUgZ2l2ZW4gY2hhbmdlcywgZm9yIGEgZG9jdW1lbnQgb2YgdGhlXG4gICAgZ2l2ZW4gbGVuZ3RoLCB1c2luZyBgbGluZVNlcGAgYXMgbGluZSBzZXBhcmF0b3IuXG4gICAgKi9cbiAgICBzdGF0aWMgb2YoY2hhbmdlcywgbGVuZ3RoLCBsaW5lU2VwKSB7XG4gICAgICAgIGxldCBzZWN0aW9ucyA9IFtdLCBpbnNlcnRlZCA9IFtdLCBwb3MgPSAwO1xuICAgICAgICBsZXQgdG90YWwgPSBudWxsO1xuICAgICAgICBmdW5jdGlvbiBmbHVzaChmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAoIWZvcmNlICYmICFzZWN0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHBvcyA8IGxlbmd0aClcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW5ndGggLSBwb3MsIC0xKTtcbiAgICAgICAgICAgIGxldCBzZXQgPSBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgICAgICAgICB0b3RhbCA9IHRvdGFsID8gdG90YWwuY29tcG9zZShzZXQubWFwKHRvdGFsKSkgOiBzZXQ7XG4gICAgICAgICAgICBzZWN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgaW5zZXJ0ZWQgPSBbXTtcbiAgICAgICAgICAgIHBvcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcHJvY2VzcyhzcGVjKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzcGVjKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHN1YiBvZiBzcGVjKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKHN1Yik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzcGVjIGluc3RhbmNlb2YgQ2hhbmdlU2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwZWMubGVuZ3RoICE9IGxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE1pc21hdGNoZWQgY2hhbmdlIHNldCBsZW5ndGggKGdvdCAke3NwZWMubGVuZ3RofSwgZXhwZWN0ZWQgJHtsZW5ndGh9KWApO1xuICAgICAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgICAgICAgICAgdG90YWwgPSB0b3RhbCA/IHRvdGFsLmNvbXBvc2Uoc3BlYy5tYXAodG90YWwpKSA6IHNwZWM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBmcm9tLCB0byA9IGZyb20sIGluc2VydCB9ID0gc3BlYztcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA+IHRvIHx8IGZyb20gPCAwIHx8IHRvID4gbGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBjaGFuZ2UgcmFuZ2UgJHtmcm9tfSB0byAke3RvfSAoaW4gZG9jIG9mIGxlbmd0aCAke2xlbmd0aH0pYCk7XG4gICAgICAgICAgICAgICAgbGV0IGluc1RleHQgPSAhaW5zZXJ0ID8gVGV4dC5lbXB0eSA6IHR5cGVvZiBpbnNlcnQgPT0gXCJzdHJpbmdcIiA/IFRleHQub2YoaW5zZXJ0LnNwbGl0KGxpbmVTZXAgfHwgRGVmYXVsdFNwbGl0KSkgOiBpbnNlcnQ7XG4gICAgICAgICAgICAgICAgbGV0IGluc0xlbiA9IGluc1RleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID09IHRvICYmIGluc0xlbiA9PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPCBwb3MpXG4gICAgICAgICAgICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGZyb20gLSBwb3MsIC0xKTtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCB0byAtIGZyb20sIGluc0xlbik7XG4gICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydGVkLCBzZWN0aW9ucywgaW5zVGV4dCk7XG4gICAgICAgICAgICAgICAgcG9zID0gdG87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2VzcyhjaGFuZ2VzKTtcbiAgICAgICAgZmx1c2goIXRvdGFsKTtcbiAgICAgICAgcmV0dXJuIHRvdGFsO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZW1wdHkgY2hhbmdlc2V0IG9mIHRoZSBnaXZlbiBsZW5ndGguXG4gICAgKi9cbiAgICBzdGF0aWMgZW1wdHkobGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KGxlbmd0aCA/IFtsZW5ndGgsIC0xXSA6IFtdLCBbXSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNoYW5nZXNldCBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uIChhcyBwcm9kdWNlZCBieVxuICAgIFtgdG9KU09OYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFuZ2VTZXQudG9KU09OKS5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihqc29uKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIG9mIENoYW5nZVNldFwiKTtcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gW10sIGluc2VydGVkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHBhcnQgPSBqc29uW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHBhcnQsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHBhcnQpIHx8IHR5cGVvZiBwYXJ0WzBdICE9IFwibnVtYmVyXCIgfHwgcGFydC5zb21lKChlLCBpKSA9PiBpICYmIHR5cGVvZiBlICE9IFwic3RyaW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gb2YgQ2hhbmdlU2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFydC5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zLnB1c2gocGFydFswXSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5zZXJ0ZWQubGVuZ3RoIDwgaSlcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQucHVzaChUZXh0LmVtcHR5KTtcbiAgICAgICAgICAgICAgICBpbnNlcnRlZFtpXSA9IFRleHQub2YocGFydC5zbGljZSgxKSk7XG4gICAgICAgICAgICAgICAgc2VjdGlvbnMucHVzaChwYXJ0WzBdLCBpbnNlcnRlZFtpXS5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlU2V0KHNlY3Rpb25zLCBpbnNlcnRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVNldChzZWN0aW9ucywgaW5zZXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VTZXQoc2VjdGlvbnMsIGluc2VydGVkKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW4sIGlucywgZm9yY2VKb2luID0gZmFsc2UpIHtcbiAgICBpZiAobGVuID09IDAgJiYgaW5zIDw9IDApXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgbGFzdCA9IHNlY3Rpb25zLmxlbmd0aCAtIDI7XG4gICAgaWYgKGxhc3QgPj0gMCAmJiBpbnMgPD0gMCAmJiBpbnMgPT0gc2VjdGlvbnNbbGFzdCArIDFdKVxuICAgICAgICBzZWN0aW9uc1tsYXN0XSArPSBsZW47XG4gICAgZWxzZSBpZiAobGVuID09IDAgJiYgc2VjdGlvbnNbbGFzdF0gPT0gMClcbiAgICAgICAgc2VjdGlvbnNbbGFzdCArIDFdICs9IGlucztcbiAgICBlbHNlIGlmIChmb3JjZUpvaW4pIHtcbiAgICAgICAgc2VjdGlvbnNbbGFzdF0gKz0gbGVuO1xuICAgICAgICBzZWN0aW9uc1tsYXN0ICsgMV0gKz0gaW5zO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIHNlY3Rpb25zLnB1c2gobGVuLCBpbnMpO1xufVxuZnVuY3Rpb24gYWRkSW5zZXJ0KHZhbHVlcywgc2VjdGlvbnMsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IGluZGV4ID0gKHNlY3Rpb25zLmxlbmd0aCAtIDIpID4+IDE7XG4gICAgaWYgKGluZGV4IDwgdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdID0gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXS5hcHBlbmQodmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgd2hpbGUgKHZhbHVlcy5sZW5ndGggPCBpbmRleClcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKFRleHQuZW1wdHkpO1xuICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXRlckNoYW5nZXMoZGVzYywgZiwgaW5kaXZpZHVhbCkge1xuICAgIGxldCBpbnNlcnRlZCA9IGRlc2MuaW5zZXJ0ZWQ7XG4gICAgZm9yIChsZXQgcG9zQSA9IDAsIHBvc0IgPSAwLCBpID0gMDsgaSA8IGRlc2Muc2VjdGlvbnMubGVuZ3RoOykge1xuICAgICAgICBsZXQgbGVuID0gZGVzYy5zZWN0aW9uc1tpKytdLCBpbnMgPSBkZXNjLnNlY3Rpb25zW2krK107XG4gICAgICAgIGlmIChpbnMgPCAwKSB7XG4gICAgICAgICAgICBwb3NBICs9IGxlbjtcbiAgICAgICAgICAgIHBvc0IgKz0gbGVuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGVuZEEgPSBwb3NBLCBlbmRCID0gcG9zQiwgdGV4dCA9IFRleHQuZW1wdHk7XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgZW5kQSArPSBsZW47XG4gICAgICAgICAgICAgICAgZW5kQiArPSBpbnM7XG4gICAgICAgICAgICAgICAgaWYgKGlucyAmJiBpbnNlcnRlZClcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuYXBwZW5kKGluc2VydGVkWyhpIC0gMikgPj4gMV0pO1xuICAgICAgICAgICAgICAgIGlmIChpbmRpdmlkdWFsIHx8IGkgPT0gZGVzYy5zZWN0aW9ucy5sZW5ndGggfHwgZGVzYy5zZWN0aW9uc1tpICsgMV0gPCAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBsZW4gPSBkZXNjLnNlY3Rpb25zW2krK107XG4gICAgICAgICAgICAgICAgaW5zID0gZGVzYy5zZWN0aW9uc1tpKytdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZihwb3NBLCBlbmRBLCBwb3NCLCBlbmRCLCB0ZXh0KTtcbiAgICAgICAgICAgIHBvc0EgPSBlbmRBO1xuICAgICAgICAgICAgcG9zQiA9IGVuZEI7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBtYXBTZXQoc2V0QSwgc2V0QiwgYmVmb3JlLCBta1NldCA9IGZhbHNlKSB7XG4gICAgLy8gUHJvZHVjZSBhIGNvcHkgb2Ygc2V0QSB0aGF0IGFwcGxpZXMgdG8gdGhlIGRvY3VtZW50IGFmdGVyIHNldEJcbiAgICAvLyBoYXMgYmVlbiBhcHBsaWVkIChhc3N1bWluZyBib3RoIHN0YXJ0IGF0IHRoZSBzYW1lIGRvY3VtZW50KS5cbiAgICBsZXQgc2VjdGlvbnMgPSBbXSwgaW5zZXJ0ID0gbWtTZXQgPyBbXSA6IG51bGw7XG4gICAgbGV0IGEgPSBuZXcgU2VjdGlvbkl0ZXIoc2V0QSksIGIgPSBuZXcgU2VjdGlvbkl0ZXIoc2V0Qik7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGJvdGggc2V0cyBpbiBwYXJhbGxlbC4gaW5zZXJ0ZWQgdHJhY2tzLCBmb3IgY2hhbmdlc1xuICAgIC8vIGluIEEgdGhhdCBoYXZlIHRvIGJlIHByb2Nlc3NlZCBwaWVjZS1ieS1waWVjZSwgd2hldGhlciB0aGVpclxuICAgIC8vIGNvbnRlbnQgaGFzIGJlZW4gaW5zZXJ0ZWQgYWxyZWFkeSwgYW5kIHJlZmVycyB0byB0aGUgc2VjdGlvblxuICAgIC8vIGluZGV4LlxuICAgIGZvciAobGV0IGluc2VydGVkID0gLTE7Oykge1xuICAgICAgICBpZiAoYS5pbnMgPT0gLTEgJiYgYi5pbnMgPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIE1vdmUgYWNyb3NzIHJhbmdlcyBza2lwcGVkIGJ5IGJvdGggc2V0cy5cbiAgICAgICAgICAgIGxldCBsZW4gPSBNYXRoLm1pbihhLmxlbiwgYi5sZW4pO1xuICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgbGVuLCAtMSk7XG4gICAgICAgICAgICBhLmZvcndhcmQobGVuKTtcbiAgICAgICAgICAgIGIuZm9yd2FyZChsZW4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIuaW5zID49IDAgJiYgKGEuaW5zIDwgMCB8fCBpbnNlcnRlZCA9PSBhLmkgfHwgYS5vZmYgPT0gMCAmJiAoYi5sZW4gPCBhLmxlbiB8fCBiLmxlbiA9PSBhLmxlbiAmJiAhYmVmb3JlKSkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSBjaGFuZ2UgaW4gQiB0aGF0IGNvbWVzIGJlZm9yZSB0aGUgbmV4dCBjaGFuZ2UgaW5cbiAgICAgICAgICAgIC8vIEEgKG9yZGVyZWQgYnkgc3RhcnQgcG9zLCB0aGVuIGxlbiwgdGhlbiBiZWZvcmUgZmxhZyksIHNraXBcbiAgICAgICAgICAgIC8vIHRoYXQgKGFuZCBwcm9jZXNzIGFueSBjaGFuZ2VzIGluIEEgaXQgY292ZXJzKS5cbiAgICAgICAgICAgIGxldCBsZW4gPSBiLmxlbjtcbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGIuaW5zLCAtMSk7XG4gICAgICAgICAgICB3aGlsZSAobGVuKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBpZWNlID0gTWF0aC5taW4oYS5sZW4sIGxlbik7XG4gICAgICAgICAgICAgICAgaWYgKGEuaW5zID49IDAgJiYgaW5zZXJ0ZWQgPCBhLmkgJiYgYS5sZW4gPD0gcGllY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgMCwgYS5pbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGEudGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydGVkID0gYS5pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhLmZvcndhcmQocGllY2UpO1xuICAgICAgICAgICAgICAgIGxlbiAtPSBwaWVjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGIubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuaW5zID49IDApIHtcbiAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHBhcnQgb2YgYSBjaGFuZ2UgaW4gQSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHRcbiAgICAgICAgICAgIC8vIG5vbi1kZWxldGlvbiBjaGFuZ2UgaW4gQiAoaWYgb3ZlcmxhcHBpbmcpLlxuICAgICAgICAgICAgbGV0IGxlbiA9IDAsIGxlZnQgPSBhLmxlbjtcbiAgICAgICAgICAgIHdoaWxlIChsZWZ0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGIuaW5zID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwaWVjZSA9IE1hdGgubWluKGxlZnQsIGIubGVuKTtcbiAgICAgICAgICAgICAgICAgICAgbGVuICs9IHBpZWNlO1xuICAgICAgICAgICAgICAgICAgICBsZWZ0IC09IHBpZWNlO1xuICAgICAgICAgICAgICAgICAgICBiLmZvcndhcmQocGllY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChiLmlucyA9PSAwICYmIGIubGVuIDwgbGVmdCkge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0IC09IGIubGVuO1xuICAgICAgICAgICAgICAgICAgICBiLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGxlbiwgaW5zZXJ0ZWQgPCBhLmkgPyBhLmlucyA6IDApO1xuICAgICAgICAgICAgaWYgKGluc2VydCAmJiBpbnNlcnRlZCA8IGEuaSlcbiAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYS50ZXh0KTtcbiAgICAgICAgICAgIGluc2VydGVkID0gYS5pO1xuICAgICAgICAgICAgYS5mb3J3YXJkKGEubGVuIC0gbGVmdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYS5kb25lICYmIGIuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIGluc2VydCA/IENoYW5nZVNldC5jcmVhdGVTZXQoc2VjdGlvbnMsIGluc2VydCkgOiBDaGFuZ2VEZXNjLmNyZWF0ZShzZWN0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNtYXRjaGVkIGNoYW5nZSBzZXQgbGVuZ3Roc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXBvc2VTZXRzKHNldEEsIHNldEIsIG1rU2V0ID0gZmFsc2UpIHtcbiAgICBsZXQgc2VjdGlvbnMgPSBbXTtcbiAgICBsZXQgaW5zZXJ0ID0gbWtTZXQgPyBbXSA6IG51bGw7XG4gICAgbGV0IGEgPSBuZXcgU2VjdGlvbkl0ZXIoc2V0QSksIGIgPSBuZXcgU2VjdGlvbkl0ZXIoc2V0Qik7XG4gICAgZm9yIChsZXQgb3BlbiA9IGZhbHNlOzspIHtcbiAgICAgICAgaWYgKGEuZG9uZSAmJiBiLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnNlcnQgPyBDaGFuZ2VTZXQuY3JlYXRlU2V0KHNlY3Rpb25zLCBpbnNlcnQpIDogQ2hhbmdlRGVzYy5jcmVhdGUoc2VjdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGEuaW5zID09IDApIHsgLy8gRGVsZXRpb24gaW4gQVxuICAgICAgICAgICAgYWRkU2VjdGlvbihzZWN0aW9ucywgYS5sZW4sIDAsIG9wZW4pO1xuICAgICAgICAgICAgYS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYi5sZW4gPT0gMCAmJiAhYi5kb25lKSB7IC8vIEluc2VydGlvbiBpbiBCXG4gICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCAwLCBiLmlucywgb3Blbik7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0KVxuICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBiLnRleHQpO1xuICAgICAgICAgICAgYi5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYS5kb25lIHx8IGIuZG9uZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzbWF0Y2hlZCBjaGFuZ2Ugc2V0IGxlbmd0aHNcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGVuID0gTWF0aC5taW4oYS5sZW4yLCBiLmxlbiksIHNlY3Rpb25MZW4gPSBzZWN0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoYS5pbnMgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5zQiA9IGIuaW5zID09IC0xID8gLTEgOiBiLm9mZiA/IDAgOiBiLmlucztcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBsZW4sIGluc0IsIG9wZW4pO1xuICAgICAgICAgICAgICAgIGlmIChpbnNlcnQgJiYgaW5zQilcbiAgICAgICAgICAgICAgICAgICAgYWRkSW5zZXJ0KGluc2VydCwgc2VjdGlvbnMsIGIudGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiLmlucyA9PSAtMSkge1xuICAgICAgICAgICAgICAgIGFkZFNlY3Rpb24oc2VjdGlvbnMsIGEub2ZmID8gMCA6IGEubGVuLCBsZW4sIG9wZW4pO1xuICAgICAgICAgICAgICAgIGlmIChpbnNlcnQpXG4gICAgICAgICAgICAgICAgICAgIGFkZEluc2VydChpbnNlcnQsIHNlY3Rpb25zLCBhLnRleHRCaXQobGVuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGRTZWN0aW9uKHNlY3Rpb25zLCBhLm9mZiA/IDAgOiBhLmxlbiwgYi5vZmYgPyAwIDogYi5pbnMsIG9wZW4pO1xuICAgICAgICAgICAgICAgIGlmIChpbnNlcnQgJiYgIWIub2ZmKVxuICAgICAgICAgICAgICAgICAgICBhZGRJbnNlcnQoaW5zZXJ0LCBzZWN0aW9ucywgYi50ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wZW4gPSAoYS5pbnMgPiBsZW4gfHwgYi5pbnMgPj0gMCAmJiBiLmxlbiA+IGxlbikgJiYgKG9wZW4gfHwgc2VjdGlvbnMubGVuZ3RoID4gc2VjdGlvbkxlbik7XG4gICAgICAgICAgICBhLmZvcndhcmQyKGxlbik7XG4gICAgICAgICAgICBiLmZvcndhcmQobGVuKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFNlY3Rpb25JdGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzZXQpIHtcbiAgICAgICAgdGhpcy5zZXQgPSBzZXQ7XG4gICAgICAgIHRoaXMuaSA9IDA7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICBsZXQgeyBzZWN0aW9ucyB9ID0gdGhpcy5zZXQ7XG4gICAgICAgIGlmICh0aGlzLmkgPCBzZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubGVuID0gc2VjdGlvbnNbdGhpcy5pKytdO1xuICAgICAgICAgICAgdGhpcy5pbnMgPSBzZWN0aW9uc1t0aGlzLmkrK107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxlbiA9IDA7XG4gICAgICAgICAgICB0aGlzLmlucyA9IC0yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub2ZmID0gMDtcbiAgICB9XG4gICAgZ2V0IGRvbmUoKSB7IHJldHVybiB0aGlzLmlucyA9PSAtMjsgfVxuICAgIGdldCBsZW4yKCkgeyByZXR1cm4gdGhpcy5pbnMgPCAwID8gdGhpcy5sZW4gOiB0aGlzLmluczsgfVxuICAgIGdldCB0ZXh0KCkge1xuICAgICAgICBsZXQgeyBpbnNlcnRlZCB9ID0gdGhpcy5zZXQsIGluZGV4ID0gKHRoaXMuaSAtIDIpID4+IDE7XG4gICAgICAgIHJldHVybiBpbmRleCA+PSBpbnNlcnRlZC5sZW5ndGggPyBUZXh0LmVtcHR5IDogaW5zZXJ0ZWRbaW5kZXhdO1xuICAgIH1cbiAgICB0ZXh0Qml0KGxlbikge1xuICAgICAgICBsZXQgeyBpbnNlcnRlZCB9ID0gdGhpcy5zZXQsIGluZGV4ID0gKHRoaXMuaSAtIDIpID4+IDE7XG4gICAgICAgIHJldHVybiBpbmRleCA+PSBpbnNlcnRlZC5sZW5ndGggJiYgIWxlbiA/IFRleHQuZW1wdHlcbiAgICAgICAgICAgIDogaW5zZXJ0ZWRbaW5kZXhdLnNsaWNlKHRoaXMub2ZmLCBsZW4gPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHRoaXMub2ZmICsgbGVuKTtcbiAgICB9XG4gICAgZm9yd2FyZChsZW4pIHtcbiAgICAgICAgaWYgKGxlbiA9PSB0aGlzLmxlbilcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGVuIC09IGxlbjtcbiAgICAgICAgICAgIHRoaXMub2ZmICs9IGxlbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3J3YXJkMihsZW4pIHtcbiAgICAgICAgaWYgKHRoaXMuaW5zID09IC0xKVxuICAgICAgICAgICAgdGhpcy5mb3J3YXJkKGxlbik7XG4gICAgICAgIGVsc2UgaWYgKGxlbiA9PSB0aGlzLmlucylcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5zIC09IGxlbjtcbiAgICAgICAgICAgIHRoaXMub2ZmICs9IGxlbjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG5BIHNpbmdsZSBzZWxlY3Rpb24gcmFuZ2UuIFdoZW5cbltgYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnNgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmFsbG93TXVsdGlwbGVTZWxlY3Rpb25zKVxuaXMgZW5hYmxlZCwgYSBbc2VsZWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclNlbGVjdGlvbikgbWF5IGhvbGRcbm11bHRpcGxlIHJhbmdlcy4gQnkgZGVmYXVsdCwgc2VsZWN0aW9ucyBob2xkIGV4YWN0bHkgb25lIHJhbmdlLlxuKi9cbmNsYXNzIFNlbGVjdGlvblJhbmdlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIHJhbmdlLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZS5cbiAgICAqL1xuICAgIHRvLCBmbGFncykge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGFuY2hvciBvZiB0aGUgcmFuZ2VcdTIwMTR0aGUgc2lkZSB0aGF0IGRvZXNuJ3QgbW92ZSB3aGVuIHlvdVxuICAgIGV4dGVuZCBpdC5cbiAgICAqL1xuICAgIGdldCBhbmNob3IoKSB7IHJldHVybiB0aGlzLmZsYWdzICYgMzIgLyogUmFuZ2VGbGFnLkludmVydGVkICovID8gdGhpcy50byA6IHRoaXMuZnJvbTsgfVxuICAgIC8qKlxuICAgIFRoZSBoZWFkIG9mIHRoZSByYW5nZSwgd2hpY2ggaXMgbW92ZWQgd2hlbiB0aGUgcmFuZ2UgaXNcbiAgICBbZXh0ZW5kZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uUmFuZ2UuZXh0ZW5kKS5cbiAgICAqL1xuICAgIGdldCBoZWFkKCkgeyByZXR1cm4gdGhpcy5mbGFncyAmIDMyIC8qIFJhbmdlRmxhZy5JbnZlcnRlZCAqLyA/IHRoaXMuZnJvbSA6IHRoaXMudG87IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gYGFuY2hvcmAgYW5kIGBoZWFkYCBhcmUgYXQgdGhlIHNhbWUgcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgZW1wdHkoKSB7IHJldHVybiB0aGlzLmZyb20gPT0gdGhpcy50bzsgfVxuICAgIC8qKlxuICAgIElmIHRoaXMgaXMgYSBjdXJzb3IgdGhhdCBpcyBleHBsaWNpdGx5IGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICBjaGFyYWN0ZXIgb24gb25lIG9mIGl0cyBzaWRlcywgdGhpcyByZXR1cm5zIHRoZSBzaWRlLiAtMSBtZWFuc1xuICAgIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIGl0cyBwb3NpdGlvbiwgMSB0aGUgY2hhcmFjdGVyIGFmdGVyLCBhbmQgMFxuICAgIG1lYW5zIG5vIGFzc29jaWF0aW9uLlxuICAgICovXG4gICAgZ2V0IGFzc29jKCkgeyByZXR1cm4gdGhpcy5mbGFncyAmIDggLyogUmFuZ2VGbGFnLkFzc29jQmVmb3JlICovID8gLTEgOiB0aGlzLmZsYWdzICYgMTYgLyogUmFuZ2VGbGFnLkFzc29jQWZ0ZXIgKi8gPyAxIDogMDsgfVxuICAgIC8qKlxuICAgIFRoZSBiaWRpcmVjdGlvbmFsIHRleHQgbGV2ZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY3Vyc29yLCBpZlxuICAgIGFueS5cbiAgICAqL1xuICAgIGdldCBiaWRpTGV2ZWwoKSB7XG4gICAgICAgIGxldCBsZXZlbCA9IHRoaXMuZmxhZ3MgJiA3IC8qIFJhbmdlRmxhZy5CaWRpTGV2ZWxNYXNrICovO1xuICAgICAgICByZXR1cm4gbGV2ZWwgPT0gNyA/IG51bGwgOiBsZXZlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGdvYWwgY29sdW1uIChzdG9yZWQgdmVydGljYWwgb2Zmc2V0KSBhc3NvY2lhdGVkIHdpdGggYVxuICAgIGN1cnNvci4gVGhpcyBpcyB1c2VkIHRvIHByZXNlcnZlIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiB3aGVuXG4gICAgW21vdmluZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubW92ZVZlcnRpY2FsbHkpIGFjcm9zc1xuICAgIGxpbmVzIG9mIGRpZmZlcmVudCBsZW5ndGguXG4gICAgKi9cbiAgICBnZXQgZ29hbENvbHVtbigpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5mbGFncyA+PiA2IC8qIFJhbmdlRmxhZy5Hb2FsQ29sdW1uT2Zmc2V0ICovO1xuICAgICAgICByZXR1cm4gdmFsdWUgPT0gMTY3NzcyMTUgLyogUmFuZ2VGbGFnLk5vR29hbENvbHVtbiAqLyA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgdGhpcyByYW5nZSB0aHJvdWdoIGEgY2hhbmdlLCBwcm9kdWNpbmcgYSB2YWxpZCByYW5nZSBpbiB0aGVcbiAgICB1cGRhdGVkIGRvY3VtZW50LlxuICAgICovXG4gICAgbWFwKGNoYW5nZSwgYXNzb2MgPSAtMSkge1xuICAgICAgICBsZXQgZnJvbSwgdG87XG4gICAgICAgIGlmICh0aGlzLmVtcHR5KSB7XG4gICAgICAgICAgICBmcm9tID0gdG8gPSBjaGFuZ2UubWFwUG9zKHRoaXMuZnJvbSwgYXNzb2MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZnJvbSA9IGNoYW5nZS5tYXBQb3ModGhpcy5mcm9tLCAxKTtcbiAgICAgICAgICAgIHRvID0gY2hhbmdlLm1hcFBvcyh0aGlzLnRvLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyb20gPT0gdGhpcy5mcm9tICYmIHRvID09IHRoaXMudG8gPyB0aGlzIDogbmV3IFNlbGVjdGlvblJhbmdlKGZyb20sIHRvLCB0aGlzLmZsYWdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRXh0ZW5kIHRoaXMgcmFuZ2UgdG8gY292ZXIgYXQgbGVhc3QgYGZyb21gIHRvIGB0b2AuXG4gICAgKi9cbiAgICBleHRlbmQoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGlmIChmcm9tIDw9IHRoaXMuYW5jaG9yICYmIHRvID49IHRoaXMuYW5jaG9yKVxuICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tLCB0byk7XG4gICAgICAgIGxldCBoZWFkID0gTWF0aC5hYnMoZnJvbSAtIHRoaXMuYW5jaG9yKSA+IE1hdGguYWJzKHRvIC0gdGhpcy5hbmNob3IpID8gZnJvbSA6IHRvO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHRoaXMuYW5jaG9yLCBoZWFkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIHJhbmdlIHRvIGFub3RoZXIgcmFuZ2UuXG4gICAgKi9cbiAgICBlcShvdGhlciwgaW5jbHVkZUFzc29jID0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5jaG9yID09IG90aGVyLmFuY2hvciAmJiB0aGlzLmhlYWQgPT0gb3RoZXIuaGVhZCAmJlxuICAgICAgICAgICAgKCFpbmNsdWRlQXNzb2MgfHwgIXRoaXMuZW1wdHkgfHwgdGhpcy5hc3NvYyA9PSBvdGhlci5hc3NvYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIEpTT04tc2VyaWFsaXphYmxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJhbmdlLlxuICAgICovXG4gICAgdG9KU09OKCkgeyByZXR1cm4geyBhbmNob3I6IHRoaXMuYW5jaG9yLCBoZWFkOiB0aGlzLmhlYWQgfTsgfVxuICAgIC8qKlxuICAgIENvbnZlcnQgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgcmFuZ2UgdG8gYSBgU2VsZWN0aW9uUmFuZ2VgXG4gICAgaW5zdGFuY2UuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbikge1xuICAgICAgICBpZiAoIWpzb24gfHwgdHlwZW9mIGpzb24uYW5jaG9yICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24uaGVhZCAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFNlbGVjdGlvblJhbmdlXCIpO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGpzb24uYW5jaG9yLCBqc29uLmhlYWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZnJvbSwgdG8sIGZsYWdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uUmFuZ2UoZnJvbSwgdG8sIGZsYWdzKTtcbiAgICB9XG59XG4vKipcbkFuIGVkaXRvciBzZWxlY3Rpb24gaG9sZHMgb25lIG9yIG1vcmUgc2VsZWN0aW9uIHJhbmdlcy5cbiovXG5jbGFzcyBFZGl0b3JTZWxlY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSByYW5nZXMgaW4gdGhlIHNlbGVjdGlvbiwgc29ydGVkIGJ5IHBvc2l0aW9uLiBSYW5nZXMgY2Fubm90XG4gICAgb3ZlcmxhcCAoYnV0IHRoZXkgbWF5IHRvdWNoLCBpZiB0aGV5IGFyZW4ndCBlbXB0eSkuXG4gICAgKi9cbiAgICByYW5nZXMsIFxuICAgIC8qKlxuICAgIFRoZSBpbmRleCBvZiB0aGUgX21haW5fIHJhbmdlIGluIHRoZSBzZWxlY3Rpb24gKHdoaWNoIGlzXG4gICAgdXN1YWxseSB0aGUgcmFuZ2UgdGhhdCB3YXMgYWRkZWQgbGFzdCkuXG4gICAgKi9cbiAgICBtYWluSW5kZXgpIHtcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHRoaXMubWFpbkluZGV4ID0gbWFpbkluZGV4O1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgYSBzZWxlY3Rpb24gdGhyb3VnaCBhIGNoYW5nZS4gVXNlZCB0byBhZGp1c3QgdGhlIHNlbGVjdGlvblxuICAgIHBvc2l0aW9uIGZvciBjaGFuZ2VzLlxuICAgICovXG4gICAgbWFwKGNoYW5nZSwgYXNzb2MgPSAtMSkge1xuICAgICAgICBpZiAoY2hhbmdlLmVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHRoaXMucmFuZ2VzLm1hcChyID0+IHIubWFwKGNoYW5nZSwgYXNzb2MpKSwgdGhpcy5tYWluSW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgc2VsZWN0aW9uIHRvIGFub3RoZXIgc2VsZWN0aW9uLiBCeSBkZWZhdWx0LCByYW5nZXNcbiAgICBhcmUgY29tcGFyZWQgb25seSBieSBwb3NpdGlvbi4gV2hlbiBgaW5jbHVkZUFzc29jYCBpcyB0cnVlLFxuICAgIGN1cnNvciByYW5nZXMgbXVzdCBhbHNvIGhhdmUgdGhlIHNhbWVcbiAgICBbYGFzc29jYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25SYW5nZS5hc3NvYykgdmFsdWUuXG4gICAgKi9cbiAgICBlcShvdGhlciwgaW5jbHVkZUFzc29jID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2VzLmxlbmd0aCAhPSBvdGhlci5yYW5nZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICB0aGlzLm1haW5JbmRleCAhPSBvdGhlci5tYWluSW5kZXgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMucmFuZ2VzW2ldLmVxKG90aGVyLnJhbmdlc1tpXSwgaW5jbHVkZUFzc29jKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHByaW1hcnkgc2VsZWN0aW9uIHJhbmdlLiBVc3VhbGx5LCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZVxuICAgIHlvdXIgY29kZSBhcHBsaWVzIHRvIF9hbGxfIHJhbmdlcywgYnkgdXNpbmcgbWV0aG9kcyBsaWtlXG4gICAgW2BjaGFuZ2VCeVJhbmdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5jaGFuZ2VCeVJhbmdlKS5cbiAgICAqL1xuICAgIGdldCBtYWluKCkgeyByZXR1cm4gdGhpcy5yYW5nZXNbdGhpcy5tYWluSW5kZXhdOyB9XG4gICAgLyoqXG4gICAgTWFrZSBzdXJlIHRoZSBzZWxlY3Rpb24gb25seSBoYXMgb25lIHJhbmdlLiBSZXR1cm5zIGEgc2VsZWN0aW9uXG4gICAgaG9sZGluZyBvbmx5IHRoZSBtYWluIHJhbmdlIGZyb20gdGhpcyBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBhc1NpbmdsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2VzLmxlbmd0aCA9PSAxID8gdGhpcyA6IG5ldyBFZGl0b3JTZWxlY3Rpb24oW3RoaXMubWFpbl0sIDApO1xuICAgIH1cbiAgICAvKipcbiAgICBFeHRlbmQgdGhpcyBzZWxlY3Rpb24gd2l0aCBhbiBleHRyYSByYW5nZS5cbiAgICAqL1xuICAgIGFkZFJhbmdlKHJhbmdlLCBtYWluID0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShbcmFuZ2VdLmNvbmNhdCh0aGlzLnJhbmdlcyksIG1haW4gPyAwIDogdGhpcy5tYWluSW5kZXggKyAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSBhIGdpdmVuIHJhbmdlIHdpdGggYW5vdGhlciByYW5nZSwgYW5kIHRoZW4gbm9ybWFsaXplIHRoZVxuICAgIHNlbGVjdGlvbiB0byBtZXJnZSBhbmQgc29ydCByYW5nZXMgaWYgbmVjZXNzYXJ5LlxuICAgICovXG4gICAgcmVwbGFjZVJhbmdlKHJhbmdlLCB3aGljaCA9IHRoaXMubWFpbkluZGV4KSB7XG4gICAgICAgIGxldCByYW5nZXMgPSB0aGlzLnJhbmdlcy5zbGljZSgpO1xuICAgICAgICByYW5nZXNbd2hpY2hdID0gcmFuZ2U7XG4gICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcywgdGhpcy5tYWluSW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb252ZXJ0IHRoaXMgc2VsZWN0aW9uIHRvIGFuIG9iamVjdCB0aGF0IGNhbiBiZSBzZXJpYWxpemVkIHRvXG4gICAgSlNPTi5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2VzOiB0aGlzLnJhbmdlcy5tYXAociA9PiByLnRvSlNPTigpKSwgbWFpbjogdGhpcy5tYWluSW5kZXggfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2VsZWN0aW9uIGZyb20gYSBKU09OIHJlcHJlc2VudGF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uIHx8ICFBcnJheS5pc0FycmF5KGpzb24ucmFuZ2VzKSB8fCB0eXBlb2YganNvbi5tYWluICE9IFwibnVtYmVyXCIgfHwganNvbi5tYWluID49IGpzb24ucmFuZ2VzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBFZGl0b3JTZWxlY3Rpb25cIik7XG4gICAgICAgIHJldHVybiBuZXcgRWRpdG9yU2VsZWN0aW9uKGpzb24ucmFuZ2VzLm1hcCgocikgPT4gU2VsZWN0aW9uUmFuZ2UuZnJvbUpTT04ocikpLCBqc29uLm1haW4pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZWxlY3Rpb24gaG9sZGluZyBhIHNpbmdsZSByYW5nZS5cbiAgICAqL1xuICAgIHN0YXRpYyBzaW5nbGUoYW5jaG9yLCBoZWFkID0gYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgRWRpdG9yU2VsZWN0aW9uKFtFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoYW5jaG9yLCBoZWFkKV0sIDApO1xuICAgIH1cbiAgICAvKipcbiAgICBTb3J0IGFuZCBtZXJnZSB0aGUgZ2l2ZW4gc2V0IG9mIHJhbmdlcywgY3JlYXRpbmcgYSB2YWxpZFxuICAgIHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUocmFuZ2VzLCBtYWluSW5kZXggPSAwKSB7XG4gICAgICAgIGlmIChyYW5nZXMubGVuZ3RoID09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkEgc2VsZWN0aW9uIG5lZWRzIGF0IGxlYXN0IG9uZSByYW5nZVwiKTtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gMCwgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHJhbmdlc1tpXTtcbiAgICAgICAgICAgIGlmIChyYW5nZS5lbXB0eSA/IHJhbmdlLmZyb20gPD0gcG9zIDogcmFuZ2UuZnJvbSA8IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLm5vcm1hbGl6ZWQocmFuZ2VzLnNsaWNlKCksIG1haW5JbmRleCk7XG4gICAgICAgICAgICBwb3MgPSByYW5nZS50bztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVkaXRvclNlbGVjdGlvbihyYW5nZXMsIG1haW5JbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGN1cnNvciBzZWxlY3Rpb24gcmFuZ2UgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLiBZb3UgY2FuXG4gICAgc2FmZWx5IGlnbm9yZSB0aGUgb3B0aW9uYWwgYXJndW1lbnRzIGluIG1vc3Qgc2l0dWF0aW9ucy5cbiAgICAqL1xuICAgIHN0YXRpYyBjdXJzb3IocG9zLCBhc3NvYyA9IDAsIGJpZGlMZXZlbCwgZ29hbENvbHVtbikge1xuICAgICAgICByZXR1cm4gU2VsZWN0aW9uUmFuZ2UuY3JlYXRlKHBvcywgcG9zLCAoYXNzb2MgPT0gMCA/IDAgOiBhc3NvYyA8IDAgPyA4IC8qIFJhbmdlRmxhZy5Bc3NvY0JlZm9yZSAqLyA6IDE2IC8qIFJhbmdlRmxhZy5Bc3NvY0FmdGVyICovKSB8XG4gICAgICAgICAgICAoYmlkaUxldmVsID09IG51bGwgPyA3IDogTWF0aC5taW4oNiwgYmlkaUxldmVsKSkgfFxuICAgICAgICAgICAgKChnb2FsQ29sdW1uICE9PSBudWxsICYmIGdvYWxDb2x1bW4gIT09IHZvaWQgMCA/IGdvYWxDb2x1bW4gOiAxNjc3NzIxNSAvKiBSYW5nZUZsYWcuTm9Hb2FsQ29sdW1uICovKSA8PCA2IC8qIFJhbmdlRmxhZy5Hb2FsQ29sdW1uT2Zmc2V0ICovKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNlbGVjdGlvbiByYW5nZS5cbiAgICAqL1xuICAgIHN0YXRpYyByYW5nZShhbmNob3IsIGhlYWQsIGdvYWxDb2x1bW4sIGJpZGlMZXZlbCkge1xuICAgICAgICBsZXQgZmxhZ3MgPSAoKGdvYWxDb2x1bW4gIT09IG51bGwgJiYgZ29hbENvbHVtbiAhPT0gdm9pZCAwID8gZ29hbENvbHVtbiA6IDE2Nzc3MjE1IC8qIFJhbmdlRmxhZy5Ob0dvYWxDb2x1bW4gKi8pIDw8IDYgLyogUmFuZ2VGbGFnLkdvYWxDb2x1bW5PZmZzZXQgKi8pIHxcbiAgICAgICAgICAgIChiaWRpTGV2ZWwgPT0gbnVsbCA/IDcgOiBNYXRoLm1pbig2LCBiaWRpTGV2ZWwpKTtcbiAgICAgICAgcmV0dXJuIGhlYWQgPCBhbmNob3IgPyBTZWxlY3Rpb25SYW5nZS5jcmVhdGUoaGVhZCwgYW5jaG9yLCAzMiAvKiBSYW5nZUZsYWcuSW52ZXJ0ZWQgKi8gfCAxNiAvKiBSYW5nZUZsYWcuQXNzb2NBZnRlciAqLyB8IGZsYWdzKVxuICAgICAgICAgICAgOiBTZWxlY3Rpb25SYW5nZS5jcmVhdGUoYW5jaG9yLCBoZWFkLCAoaGVhZCA+IGFuY2hvciA/IDggLyogUmFuZ2VGbGFnLkFzc29jQmVmb3JlICovIDogMCkgfCBmbGFncyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIG5vcm1hbGl6ZWQocmFuZ2VzLCBtYWluSW5kZXggPSAwKSB7XG4gICAgICAgIGxldCBtYWluID0gcmFuZ2VzW21haW5JbmRleF07XG4gICAgICAgIHJhbmdlcy5zb3J0KChhLCBiKSA9PiBhLmZyb20gLSBiLmZyb20pO1xuICAgICAgICBtYWluSW5kZXggPSByYW5nZXMuaW5kZXhPZihtYWluKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHJhbmdlc1tpXSwgcHJldiA9IHJhbmdlc1tpIC0gMV07XG4gICAgICAgICAgICBpZiAocmFuZ2UuZW1wdHkgPyByYW5nZS5mcm9tIDw9IHByZXYudG8gOiByYW5nZS5mcm9tIDwgcHJldi50bykge1xuICAgICAgICAgICAgICAgIGxldCBmcm9tID0gcHJldi5mcm9tLCB0byA9IE1hdGgubWF4KHJhbmdlLnRvLCBwcmV2LnRvKTtcbiAgICAgICAgICAgICAgICBpZiAoaSA8PSBtYWluSW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIG1haW5JbmRleC0tO1xuICAgICAgICAgICAgICAgIHJhbmdlcy5zcGxpY2UoLS1pLCAyLCByYW5nZS5hbmNob3IgPiByYW5nZS5oZWFkID8gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHRvLCBmcm9tKSA6IEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tLCB0bykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRWRpdG9yU2VsZWN0aW9uKHJhbmdlcywgbWFpbkluZGV4KTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja1NlbGVjdGlvbihzZWxlY3Rpb24sIGRvY0xlbmd0aCkge1xuICAgIGZvciAobGV0IHJhbmdlIG9mIHNlbGVjdGlvbi5yYW5nZXMpXG4gICAgICAgIGlmIChyYW5nZS50byA+IGRvY0xlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiU2VsZWN0aW9uIHBvaW50cyBvdXRzaWRlIG9mIGRvY3VtZW50XCIpO1xufVxuXG5sZXQgbmV4dElEID0gMDtcbi8qKlxuQSBmYWNldCBpcyBhIGxhYmVsZWQgdmFsdWUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWRpdG9yXG5zdGF0ZS4gSXQgdGFrZXMgaW5wdXRzIGZyb20gYW55IG51bWJlciBvZiBleHRlbnNpb25zLCBhbmQgY29tYmluZXNcbnRob3NlIGludG8gYSBzaW5nbGUgb3V0cHV0IHZhbHVlLlxuXG5FeGFtcGxlcyBvZiB1c2VzIG9mIGZhY2V0cyBhcmUgdGhlIFt0YWJcbnNpemVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedGFiU2l6ZSksIFtlZGl0b3JcbmF0dHJpYnV0ZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmVkaXRvckF0dHJpYnV0ZXMpLCBhbmQgW3VwZGF0ZVxubGlzdGVuZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld151cGRhdGVMaXN0ZW5lcikuXG5cbk5vdGUgdGhhdCBgRmFjZXRgIGluc3RhbmNlcyBjYW4gYmUgdXNlZCBhbnl3aGVyZSB3aGVyZVxuW2BGYWNldFJlYWRlcmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRmFjZXRSZWFkZXIpIGlzIGV4cGVjdGVkLlxuKi9cbmNsYXNzIEZhY2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbWJpbmUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcGFyZUlucHV0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhcmUsIGlzU3RhdGljLCBlbmFibGVzKSB7XG4gICAgICAgIHRoaXMuY29tYmluZSA9IGNvbWJpbmU7XG4gICAgICAgIHRoaXMuY29tcGFyZUlucHV0ID0gY29tcGFyZUlucHV0O1xuICAgICAgICB0aGlzLmNvbXBhcmUgPSBjb21wYXJlO1xuICAgICAgICB0aGlzLmlzU3RhdGljID0gaXNTdGF0aWM7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pZCA9IG5leHRJRCsrO1xuICAgICAgICB0aGlzLmRlZmF1bHQgPSBjb21iaW5lKFtdKTtcbiAgICAgICAgdGhpcy5leHRlbnNpb25zID0gdHlwZW9mIGVuYWJsZXMgPT0gXCJmdW5jdGlvblwiID8gZW5hYmxlcyh0aGlzKSA6IGVuYWJsZXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYSBmYWNldCByZWFkZXIgZm9yIHRoaXMgZmFjZXQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvXG4gICAgW3JlYWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuZmFjZXQpIGl0IGJ1dCBub3QgdG8gZGVmaW5lIHZhbHVlcyBmb3IgaXQuXG4gICAgKi9cbiAgICBnZXQgcmVhZGVyKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIG5ldyBmYWNldC5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoY29uZmlnID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWNldChjb25maWcuY29tYmluZSB8fCAoKGEpID0+IGEpLCBjb25maWcuY29tcGFyZUlucHV0IHx8ICgoYSwgYikgPT4gYSA9PT0gYiksIGNvbmZpZy5jb21wYXJlIHx8ICghY29uZmlnLmNvbWJpbmUgPyBzYW1lQXJyYXkgOiAoYSwgYikgPT4gYSA9PT0gYiksICEhY29uZmlnLnN0YXRpYywgY29uZmlnLmVuYWJsZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGFkZHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoaXMgZmFjZXQuXG4gICAgKi9cbiAgICBvZih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZhY2V0UHJvdmlkZXIoW10sIHRoaXMsIDAgLyogUHJvdmlkZXIuU3RhdGljICovLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBjb21wdXRlcyBhIHZhbHVlIGZvciB0aGUgZmFjZXQgZnJvbSBhXG4gICAgc3RhdGUuIFlvdSBtdXN0IHRha2UgY2FyZSB0byBkZWNsYXJlIHRoZSBwYXJ0cyBvZiB0aGUgc3RhdGUgdGhhdFxuICAgIHRoaXMgdmFsdWUgZGVwZW5kcyBvbiwgc2luY2UgeW91ciBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBhZ2FpblxuICAgIGZvciBhIG5ldyBzdGF0ZSB3aGVuIG9uZSBvZiB0aG9zZSBwYXJ0cyBjaGFuZ2VkLlxuICAgIFxuICAgIEluIGNhc2VzIHdoZXJlIHlvdXIgdmFsdWUgZGVwZW5kcyBvbmx5IG9uIGEgc2luZ2xlIGZpZWxkLCB5b3UnbGxcbiAgICB3YW50IHRvIHVzZSB0aGUgW2Bmcm9tYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5GYWNldC5mcm9tKSBtZXRob2QgaW5zdGVhZC5cbiAgICAqL1xuICAgIGNvbXB1dGUoZGVwcywgZ2V0KSB7XG4gICAgICAgIGlmICh0aGlzLmlzU3RhdGljKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY29tcHV0ZSBhIHN0YXRpYyBmYWNldFwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWNldFByb3ZpZGVyKGRlcHMsIHRoaXMsIDEgLyogUHJvdmlkZXIuU2luZ2xlICovLCBnZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgY29tcHV0ZXMgemVybyBvciBtb3JlIHZhbHVlcyBmb3IgdGhpc1xuICAgIGZhY2V0IGZyb20gYSBzdGF0ZS5cbiAgICAqL1xuICAgIGNvbXB1dGVOKGRlcHMsIGdldCkge1xuICAgICAgICBpZiAodGhpcy5pc1N0YXRpYylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNvbXB1dGUgYSBzdGF0aWMgZmFjZXRcIik7XG4gICAgICAgIHJldHVybiBuZXcgRmFjZXRQcm92aWRlcihkZXBzLCB0aGlzLCAyIC8qIFByb3ZpZGVyLk11bHRpICovLCBnZXQpO1xuICAgIH1cbiAgICBmcm9tKGZpZWxkLCBnZXQpIHtcbiAgICAgICAgaWYgKCFnZXQpXG4gICAgICAgICAgICBnZXQgPSB4ID0+IHg7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGUoW2ZpZWxkXSwgc3RhdGUgPT4gZ2V0KHN0YXRlLmZpZWxkKGZpZWxkKSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVBcnJheShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPT0gYiB8fCBhLmxlbmd0aCA9PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KChlLCBpKSA9PiBlID09PSBiW2ldKTtcbn1cbmNsYXNzIEZhY2V0UHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKGRlcGVuZGVuY2llcywgZmFjZXQsIHR5cGUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzO1xuICAgICAgICB0aGlzLmZhY2V0ID0gZmFjZXQ7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5pZCA9IG5leHRJRCsrO1xuICAgIH1cbiAgICBkeW5hbWljU2xvdChhZGRyZXNzZXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgZ2V0dGVyID0gdGhpcy52YWx1ZTtcbiAgICAgICAgbGV0IGNvbXBhcmUgPSB0aGlzLmZhY2V0LmNvbXBhcmVJbnB1dDtcbiAgICAgICAgbGV0IGlkID0gdGhpcy5pZCwgaWR4ID0gYWRkcmVzc2VzW2lkXSA+PiAxLCBtdWx0aSA9IHRoaXMudHlwZSA9PSAyIC8qIFByb3ZpZGVyLk11bHRpICovO1xuICAgICAgICBsZXQgZGVwRG9jID0gZmFsc2UsIGRlcFNlbCA9IGZhbHNlLCBkZXBBZGRycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBkZXAgb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIGlmIChkZXAgPT0gXCJkb2NcIilcbiAgICAgICAgICAgICAgICBkZXBEb2MgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoZGVwID09IFwic2VsZWN0aW9uXCIpXG4gICAgICAgICAgICAgICAgZGVwU2VsID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCgoKF9hID0gYWRkcmVzc2VzW2RlcC5pZF0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDEpICYgMSkgPT0gMClcbiAgICAgICAgICAgICAgICBkZXBBZGRycy5wdXNoKGFkZHJlc3Nlc1tkZXAuaWRdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3JlYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBnZXR0ZXIoc3RhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGUoc3RhdGUsIHRyKSB7XG4gICAgICAgICAgICAgICAgaWYgKChkZXBEb2MgJiYgdHIuZG9jQ2hhbmdlZCkgfHwgKGRlcFNlbCAmJiAodHIuZG9jQ2hhbmdlZCB8fCB0ci5zZWxlY3Rpb24pKSB8fCBlbnN1cmVBbGwoc3RhdGUsIGRlcEFkZHJzKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3VmFsID0gZ2V0dGVyKHN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpID8gIWNvbXBhcmVBcnJheShuZXdWYWwsIHN0YXRlLnZhbHVlc1tpZHhdLCBjb21wYXJlKSA6ICFjb21wYXJlKG5ld1ZhbCwgc3RhdGUudmFsdWVzW2lkeF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IG5ld1ZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWNvbmZpZ3VyZTogKHN0YXRlLCBvbGRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBuZXdWYWwsIG9sZEFkZHIgPSBvbGRTdGF0ZS5jb25maWcuYWRkcmVzc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKG9sZEFkZHIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2xkVmFsID0gZ2V0QWRkcihvbGRTdGF0ZSwgb2xkQWRkcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llcy5ldmVyeShkZXAgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlcCBpbnN0YW5jZW9mIEZhY2V0ID8gb2xkU3RhdGUuZmFjZXQoZGVwKSA9PT0gc3RhdGUuZmFjZXQoZGVwKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwIGluc3RhbmNlb2YgU3RhdGVGaWVsZCA/IG9sZFN0YXRlLmZpZWxkKGRlcCwgZmFsc2UpID09IHN0YXRlLmZpZWxkKGRlcCwgZmFsc2UpIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSkgfHwgKG11bHRpID8gY29tcGFyZUFycmF5KG5ld1ZhbCA9IGdldHRlcihzdGF0ZSksIG9sZFZhbCwgY29tcGFyZSkgOiBjb21wYXJlKG5ld1ZhbCA9IGdldHRlcihzdGF0ZSksIG9sZFZhbCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IG9sZFZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXdWYWwgPSBnZXR0ZXIoc3RhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IG5ld1ZhbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBTbG90U3RhdHVzLkNoYW5nZWQgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcGFyZUFycmF5KGEsIGIsIGNvbXBhcmUpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghY29tcGFyZShhW2ldLCBiW2ldKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGVuc3VyZUFsbChzdGF0ZSwgYWRkcnMpIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGFkZHIgb2YgYWRkcnMpXG4gICAgICAgIGlmIChlbnN1cmVBZGRyKHN0YXRlLCBhZGRyKSAmIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovKVxuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBkeW5hbWljRmFjZXRTbG90KGFkZHJlc3NlcywgZmFjZXQsIHByb3ZpZGVycykge1xuICAgIGxldCBwcm92aWRlckFkZHJzID0gcHJvdmlkZXJzLm1hcChwID0+IGFkZHJlc3Nlc1twLmlkXSk7XG4gICAgbGV0IHByb3ZpZGVyVHlwZXMgPSBwcm92aWRlcnMubWFwKHAgPT4gcC50eXBlKTtcbiAgICBsZXQgZHluYW1pYyA9IHByb3ZpZGVyQWRkcnMuZmlsdGVyKHAgPT4gIShwICYgMSkpO1xuICAgIGxldCBpZHggPSBhZGRyZXNzZXNbZmFjZXQuaWRdID4+IDE7XG4gICAgZnVuY3Rpb24gZ2V0KHN0YXRlKSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm92aWRlckFkZHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBnZXRBZGRyKHN0YXRlLCBwcm92aWRlckFkZHJzW2ldKTtcbiAgICAgICAgICAgIGlmIChwcm92aWRlclR5cGVzW2ldID09IDIgLyogUHJvdmlkZXIuTXVsdGkgKi8pXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdmFsIG9mIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWwpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFjZXQuY29tYmluZSh2YWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGUoc3RhdGUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGFkZHIgb2YgcHJvdmlkZXJBZGRycylcbiAgICAgICAgICAgICAgICBlbnN1cmVBZGRyKHN0YXRlLCBhZGRyKTtcbiAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gZ2V0KHN0YXRlKTtcbiAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlKHN0YXRlLCB0cikge1xuICAgICAgICAgICAgaWYgKCFlbnN1cmVBbGwoc3RhdGUsIGR5bmFtaWMpKVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0KHN0YXRlKTtcbiAgICAgICAgICAgIGlmIChmYWNldC5jb21wYXJlKHZhbHVlLCBzdGF0ZS52YWx1ZXNbaWR4XSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICB9LFxuICAgICAgICByZWNvbmZpZ3VyZShzdGF0ZSwgb2xkU3RhdGUpIHtcbiAgICAgICAgICAgIGxldCBkZXBDaGFuZ2VkID0gZW5zdXJlQWxsKHN0YXRlLCBwcm92aWRlckFkZHJzKTtcbiAgICAgICAgICAgIGxldCBvbGRQcm92aWRlcnMgPSBvbGRTdGF0ZS5jb25maWcuZmFjZXRzW2ZhY2V0LmlkXSwgb2xkVmFsdWUgPSBvbGRTdGF0ZS5mYWNldChmYWNldCk7XG4gICAgICAgICAgICBpZiAob2xkUHJvdmlkZXJzICYmICFkZXBDaGFuZ2VkICYmIHNhbWVBcnJheShwcm92aWRlcnMsIG9sZFByb3ZpZGVycykpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IG9sZFZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0KHN0YXRlKTtcbiAgICAgICAgICAgIGlmIChmYWNldC5jb21wYXJlKHZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZXNbaWR4XSA9IG9sZFZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgfVxuICAgIH07XG59XG5jb25zdCBpbml0RmllbGQgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgc3RhdGljOiB0cnVlIH0pO1xuLyoqXG5GaWVsZHMgY2FuIHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gYW4gZWRpdG9yIHN0YXRlLCBhbmRcbmtlZXAgaXQgaW4gc3luYyB3aXRoIHRoZSByZXN0IG9mIHRoZSBzdGF0ZS5cbiovXG5jbGFzcyBTdGF0ZUZpZWxkIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGlkLCBjcmVhdGVGLCB1cGRhdGVGLCBjb21wYXJlRiwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzcGVjKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5jcmVhdGVGID0gY3JlYXRlRjtcbiAgICAgICAgdGhpcy51cGRhdGVGID0gdXBkYXRlRjtcbiAgICAgICAgdGhpcy5jb21wYXJlRiA9IGNvbXBhcmVGO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMucHJvdmlkZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHN0YXRlIGZpZWxkLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShjb25maWcpIHtcbiAgICAgICAgbGV0IGZpZWxkID0gbmV3IFN0YXRlRmllbGQobmV4dElEKyssIGNvbmZpZy5jcmVhdGUsIGNvbmZpZy51cGRhdGUsIGNvbmZpZy5jb21wYXJlIHx8ICgoYSwgYikgPT4gYSA9PT0gYiksIGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZSlcbiAgICAgICAgICAgIGZpZWxkLnByb3ZpZGVzID0gY29uZmlnLnByb3ZpZGUoZmllbGQpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuICAgIGNyZWF0ZShzdGF0ZSkge1xuICAgICAgICBsZXQgaW5pdCA9IHN0YXRlLmZhY2V0KGluaXRGaWVsZCkuZmluZChpID0+IGkuZmllbGQgPT0gdGhpcyk7XG4gICAgICAgIHJldHVybiAoKGluaXQgPT09IG51bGwgfHwgaW5pdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5pdC5jcmVhdGUpIHx8IHRoaXMuY3JlYXRlRikoc3RhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNsb3QoYWRkcmVzc2VzKSB7XG4gICAgICAgIGxldCBpZHggPSBhZGRyZXNzZXNbdGhpcy5pZF0gPj4gMTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNyZWF0ZTogKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSB0aGlzLmNyZWF0ZShzdGF0ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZTogKHN0YXRlLCB0cikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBvbGRWYWwgPSBzdGF0ZS52YWx1ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnVwZGF0ZUYob2xkVmFsLCB0cik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFyZUYob2xkVmFsLCB2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogU2xvdFN0YXR1cy5DaGFuZ2VkICovO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlY29uZmlndXJlOiAoc3RhdGUsIG9sZFN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlLmNvbmZpZy5hZGRyZXNzW3RoaXMuaWRdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudmFsdWVzW2lkeF0gPSBvbGRTdGF0ZS5maWVsZCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlc1tpZHhdID0gdGhpcy5jcmVhdGUoc3RhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIFNsb3RTdGF0dXMuQ2hhbmdlZCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBlbmFibGVzIHRoaXMgZmllbGQgYW5kIG92ZXJyaWRlcyB0aGVcbiAgICB3YXkgaXQgaXMgaW5pdGlhbGl6ZWQuIENhbiBiZSB1c2VmdWwgd2hlbiB5b3UgbmVlZCB0byBwcm92aWRlIGFcbiAgICBub24tZGVmYXVsdCBzdGFydGluZyB2YWx1ZSBmb3IgdGhlIGZpZWxkLlxuICAgICovXG4gICAgaW5pdChjcmVhdGUpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLCBpbml0RmllbGQub2YoeyBmaWVsZDogdGhpcywgY3JlYXRlIH0pXTtcbiAgICB9XG4gICAgLyoqXG4gICAgU3RhdGUgZmllbGQgaW5zdGFuY2VzIGNhbiBiZSB1c2VkIGFzXG4gICAgW2BFeHRlbnNpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkV4dGVuc2lvbikgdmFsdWVzIHRvIGVuYWJsZSB0aGUgZmllbGQgaW4gYVxuICAgIGdpdmVuIHN0YXRlLlxuICAgICovXG4gICAgZ2V0IGV4dGVuc2lvbigpIHsgcmV0dXJuIHRoaXM7IH1cbn1cbmNvbnN0IFByZWNfID0geyBsb3dlc3Q6IDQsIGxvdzogMywgZGVmYXVsdDogMiwgaGlnaDogMSwgaGlnaGVzdDogMCB9O1xuZnVuY3Rpb24gcHJlYyh2YWx1ZSkge1xuICAgIHJldHVybiAoZXh0KSA9PiBuZXcgUHJlY0V4dGVuc2lvbihleHQsIHZhbHVlKTtcbn1cbi8qKlxuQnkgZGVmYXVsdCBleHRlbnNpb25zIGFyZSByZWdpc3RlcmVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSBmb3VuZFxuaW4gdGhlIGZsYXR0ZW5lZCBmb3JtIG9mIG5lc3RlZCBhcnJheSB0aGF0IHdhcyBwcm92aWRlZC5cbkluZGl2aWR1YWwgZXh0ZW5zaW9uIHZhbHVlcyBjYW4gYmUgYXNzaWduZWQgYSBwcmVjZWRlbmNlIHRvXG5vdmVycmlkZSB0aGlzLiBFeHRlbnNpb25zIHRoYXQgZG8gbm90IGhhdmUgYSBwcmVjZWRlbmNlIHNldCBnZXRcbnRoZSBwcmVjZWRlbmNlIG9mIHRoZSBuZWFyZXN0IHBhcmVudCB3aXRoIGEgcHJlY2VkZW5jZSwgb3JcbltgZGVmYXVsdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUHJlYy5kZWZhdWx0KSBpZiB0aGVyZSBpcyBubyBzdWNoIHBhcmVudC4gVGhlXG5maW5hbCBvcmRlcmluZyBvZiBleHRlbnNpb25zIGlzIGRldGVybWluZWQgYnkgZmlyc3Qgc29ydGluZyBieVxucHJlY2VkZW5jZSBhbmQgdGhlbiBieSBvcmRlciB3aXRoaW4gZWFjaCBwcmVjZWRlbmNlLlxuKi9cbmNvbnN0IFByZWMgPSB7XG4gICAgLyoqXG4gICAgVGhlIGhpZ2hlc3QgcHJlY2VkZW5jZSBsZXZlbCwgZm9yIGV4dGVuc2lvbnMgdGhhdCBzaG91bGQgZW5kIHVwXG4gICAgbmVhciB0aGUgc3RhcnQgb2YgdGhlIHByZWNlZGVuY2Ugb3JkZXJpbmcuXG4gICAgKi9cbiAgICBoaWdoZXN0OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5oaWdoZXN0KSxcbiAgICAvKipcbiAgICBBIGhpZ2hlci10aGFuLWRlZmF1bHQgcHJlY2VkZW5jZSwgZm9yIGV4dGVuc2lvbnMgdGhhdCBzaG91bGRcbiAgICBjb21lIGJlZm9yZSB0aG9zZSB3aXRoIGRlZmF1bHQgcHJlY2VkZW5jZS5cbiAgICAqL1xuICAgIGhpZ2g6IC8qQF9fUFVSRV9fKi9wcmVjKFByZWNfLmhpZ2gpLFxuICAgIC8qKlxuICAgIFRoZSBkZWZhdWx0IHByZWNlZGVuY2UsIHdoaWNoIGlzIGFsc28gdXNlZCBmb3IgZXh0ZW5zaW9uc1xuICAgIHdpdGhvdXQgYW4gZXhwbGljaXQgcHJlY2VkZW5jZS5cbiAgICAqL1xuICAgIGRlZmF1bHQ6IC8qQF9fUFVSRV9fKi9wcmVjKFByZWNfLmRlZmF1bHQpLFxuICAgIC8qKlxuICAgIEEgbG93ZXItdGhhbi1kZWZhdWx0IHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBsb3c6IC8qQF9fUFVSRV9fKi9wcmVjKFByZWNfLmxvdyksXG4gICAgLyoqXG4gICAgVGhlIGxvd2VzdCBwcmVjZWRlbmNlIGxldmVsLiBNZWFudCBmb3IgdGhpbmdzIHRoYXQgc2hvdWxkIGVuZCB1cFxuICAgIG5lYXIgdGhlIGVuZCBvZiB0aGUgZXh0ZW5zaW9uIG9yZGVyLlxuICAgICovXG4gICAgbG93ZXN0OiAvKkBfX1BVUkVfXyovcHJlYyhQcmVjXy5sb3dlc3QpXG59O1xuY2xhc3MgUHJlY0V4dGVuc2lvbiB7XG4gICAgY29uc3RydWN0b3IoaW5uZXIsIHByZWMpIHtcbiAgICAgICAgdGhpcy5pbm5lciA9IGlubmVyO1xuICAgICAgICB0aGlzLnByZWMgPSBwcmVjO1xuICAgIH1cbn1cbi8qKlxuRXh0ZW5zaW9uIGNvbXBhcnRtZW50cyBjYW4gYmUgdXNlZCB0byBtYWtlIGEgY29uZmlndXJhdGlvblxuZHluYW1pYy4gQnkgW3dyYXBwaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkNvbXBhcnRtZW50Lm9mKSBwYXJ0IG9mIHlvdXJcbmNvbmZpZ3VyYXRpb24gaW4gYSBjb21wYXJ0bWVudCwgeW91IGNhbiBsYXRlclxuW3JlcGxhY2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ29tcGFydG1lbnQucmVjb25maWd1cmUpIHRoYXQgcGFydCB0aHJvdWdoIGFcbnRyYW5zYWN0aW9uLlxuKi9cbmNsYXNzIENvbXBhcnRtZW50IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjb21wYXJ0bWVudCB0byBhZGQgdG8geW91ciBbc3RhdGVcbiAgICBjb25maWd1cmF0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlQ29uZmlnLmV4dGVuc2lvbnMpLlxuICAgICovXG4gICAgb2YoZXh0KSB7IHJldHVybiBuZXcgQ29tcGFydG1lbnRJbnN0YW5jZSh0aGlzLCBleHQpOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIFtlZmZlY3RdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmVmZmVjdHMpIHRoYXRcbiAgICByZWNvbmZpZ3VyZXMgdGhpcyBjb21wYXJ0bWVudC5cbiAgICAqL1xuICAgIHJlY29uZmlndXJlKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIENvbXBhcnRtZW50LnJlY29uZmlndXJlLm9mKHsgY29tcGFydG1lbnQ6IHRoaXMsIGV4dGVuc2lvbjogY29udGVudCB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIGNvbXBhcnRtZW50IGluIHRoZSBzdGF0ZSwgb3JcbiAgICBgdW5kZWZpbmVkYCBpZiBpdCBpc24ndCBwcmVzZW50LlxuICAgICovXG4gICAgZ2V0KHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5jb25maWcuY29tcGFydG1lbnRzLmdldCh0aGlzKTtcbiAgICB9XG59XG5jbGFzcyBDb21wYXJ0bWVudEluc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3Rvcihjb21wYXJ0bWVudCwgaW5uZXIpIHtcbiAgICAgICAgdGhpcy5jb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50O1xuICAgICAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gICAgfVxufVxuY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgY29tcGFydG1lbnRzLCBkeW5hbWljU2xvdHMsIGFkZHJlc3MsIHN0YXRpY1ZhbHVlcywgZmFjZXRzKSB7XG4gICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgICAgIHRoaXMuY29tcGFydG1lbnRzID0gY29tcGFydG1lbnRzO1xuICAgICAgICB0aGlzLmR5bmFtaWNTbG90cyA9IGR5bmFtaWNTbG90cztcbiAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgICAgICAgdGhpcy5zdGF0aWNWYWx1ZXMgPSBzdGF0aWNWYWx1ZXM7XG4gICAgICAgIHRoaXMuZmFjZXRzID0gZmFjZXRzO1xuICAgICAgICB0aGlzLnN0YXR1c1RlbXBsYXRlID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnN0YXR1c1RlbXBsYXRlLmxlbmd0aCA8IGR5bmFtaWNTbG90cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RlbXBsYXRlLnB1c2goMCAvKiBTbG90U3RhdHVzLlVucmVzb2x2ZWQgKi8pO1xuICAgIH1cbiAgICBzdGF0aWNGYWNldChmYWNldCkge1xuICAgICAgICBsZXQgYWRkciA9IHRoaXMuYWRkcmVzc1tmYWNldC5pZF07XG4gICAgICAgIHJldHVybiBhZGRyID09IG51bGwgPyBmYWNldC5kZWZhdWx0IDogdGhpcy5zdGF0aWNWYWx1ZXNbYWRkciA+PiAxXTtcbiAgICB9XG4gICAgc3RhdGljIHJlc29sdmUoYmFzZSwgY29tcGFydG1lbnRzLCBvbGRTdGF0ZSkge1xuICAgICAgICBsZXQgZmllbGRzID0gW107XG4gICAgICAgIGxldCBmYWNldHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBsZXQgbmV3Q29tcGFydG1lbnRzID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGxldCBleHQgb2YgZmxhdHRlbihiYXNlLCBjb21wYXJ0bWVudHMsIG5ld0NvbXBhcnRtZW50cykpIHtcbiAgICAgICAgICAgIGlmIChleHQgaW5zdGFuY2VvZiBTdGF0ZUZpZWxkKVxuICAgICAgICAgICAgICAgIGZpZWxkcy5wdXNoKGV4dCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgKGZhY2V0c1tleHQuZmFjZXQuaWRdIHx8IChmYWNldHNbZXh0LmZhY2V0LmlkXSA9IFtdKSkucHVzaChleHQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhZGRyZXNzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IHN0YXRpY1ZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgZHluYW1pY1Nsb3RzID0gW107XG4gICAgICAgIGZvciAobGV0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICAgICAgYWRkcmVzc1tmaWVsZC5pZF0gPSBkeW5hbWljU2xvdHMubGVuZ3RoIDw8IDE7XG4gICAgICAgICAgICBkeW5hbWljU2xvdHMucHVzaChhID0+IGZpZWxkLnNsb3QoYSkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvbGRGYWNldHMgPSBvbGRTdGF0ZSA9PT0gbnVsbCB8fCBvbGRTdGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2xkU3RhdGUuY29uZmlnLmZhY2V0cztcbiAgICAgICAgZm9yIChsZXQgaWQgaW4gZmFjZXRzKSB7XG4gICAgICAgICAgICBsZXQgcHJvdmlkZXJzID0gZmFjZXRzW2lkXSwgZmFjZXQgPSBwcm92aWRlcnNbMF0uZmFjZXQ7XG4gICAgICAgICAgICBsZXQgb2xkUHJvdmlkZXJzID0gb2xkRmFjZXRzICYmIG9sZEZhY2V0c1tpZF0gfHwgW107XG4gICAgICAgICAgICBpZiAocHJvdmlkZXJzLmV2ZXJ5KHAgPT4gcC50eXBlID09IDAgLyogUHJvdmlkZXIuU3RhdGljICovKSkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3NbZmFjZXQuaWRdID0gKHN0YXRpY1ZhbHVlcy5sZW5ndGggPDwgMSkgfCAxO1xuICAgICAgICAgICAgICAgIGlmIChzYW1lQXJyYXkob2xkUHJvdmlkZXJzLCBwcm92aWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY1ZhbHVlcy5wdXNoKG9sZFN0YXRlLmZhY2V0KGZhY2V0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBmYWNldC5jb21iaW5lKHByb3ZpZGVycy5tYXAocCA9PiBwLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRpY1ZhbHVlcy5wdXNoKG9sZFN0YXRlICYmIGZhY2V0LmNvbXBhcmUodmFsdWUsIG9sZFN0YXRlLmZhY2V0KGZhY2V0KSkgPyBvbGRTdGF0ZS5mYWNldChmYWNldCkgOiB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCBvZiBwcm92aWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAudHlwZSA9PSAwIC8qIFByb3ZpZGVyLlN0YXRpYyAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1twLmlkXSA9IChzdGF0aWNWYWx1ZXMubGVuZ3RoIDw8IDEpIHwgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY1ZhbHVlcy5wdXNoKHAudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1twLmlkXSA9IGR5bmFtaWNTbG90cy5sZW5ndGggPDwgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTbG90cy5wdXNoKGEgPT4gcC5keW5hbWljU2xvdChhKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkcmVzc1tmYWNldC5pZF0gPSBkeW5hbWljU2xvdHMubGVuZ3RoIDw8IDE7XG4gICAgICAgICAgICAgICAgZHluYW1pY1Nsb3RzLnB1c2goYSA9PiBkeW5hbWljRmFjZXRTbG90KGEsIGZhY2V0LCBwcm92aWRlcnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZHluYW1pYyA9IGR5bmFtaWNTbG90cy5tYXAoZiA9PiBmKGFkZHJlc3MpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uKGJhc2UsIG5ld0NvbXBhcnRtZW50cywgZHluYW1pYywgYWRkcmVzcywgc3RhdGljVmFsdWVzLCBmYWNldHMpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZsYXR0ZW4oZXh0ZW5zaW9uLCBjb21wYXJ0bWVudHMsIG5ld0NvbXBhcnRtZW50cykge1xuICAgIGxldCByZXN1bHQgPSBbW10sIFtdLCBbXSwgW10sIFtdXTtcbiAgICBsZXQgc2VlbiA9IG5ldyBNYXAoKTtcbiAgICBmdW5jdGlvbiBpbm5lcihleHQsIHByZWMpIHtcbiAgICAgICAgbGV0IGtub3duID0gc2Vlbi5nZXQoZXh0KTtcbiAgICAgICAgaWYgKGtub3duICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChrbm93biA8PSBwcmVjKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IHJlc3VsdFtrbm93bl0uaW5kZXhPZihleHQpO1xuICAgICAgICAgICAgaWYgKGZvdW5kID4gLTEpXG4gICAgICAgICAgICAgICAgcmVzdWx0W2tub3duXS5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgICAgICAgaWYgKGV4dCBpbnN0YW5jZW9mIENvbXBhcnRtZW50SW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgbmV3Q29tcGFydG1lbnRzLmRlbGV0ZShleHQuY29tcGFydG1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHNlZW4uc2V0KGV4dCwgcHJlYyk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4dCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGUgb2YgZXh0KVxuICAgICAgICAgICAgICAgIGlubmVyKGUsIHByZWMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4dCBpbnN0YW5jZW9mIENvbXBhcnRtZW50SW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGlmIChuZXdDb21wYXJ0bWVudHMuaGFzKGV4dC5jb21wYXJ0bWVudCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYER1cGxpY2F0ZSB1c2Ugb2YgY29tcGFydG1lbnQgaW4gZXh0ZW5zaW9uc2ApO1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBjb21wYXJ0bWVudHMuZ2V0KGV4dC5jb21wYXJ0bWVudCkgfHwgZXh0LmlubmVyO1xuICAgICAgICAgICAgbmV3Q29tcGFydG1lbnRzLnNldChleHQuY29tcGFydG1lbnQsIGNvbnRlbnQpO1xuICAgICAgICAgICAgaW5uZXIoY29udGVudCwgcHJlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0IGluc3RhbmNlb2YgUHJlY0V4dGVuc2lvbikge1xuICAgICAgICAgICAgaW5uZXIoZXh0LmlubmVyLCBleHQucHJlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0IGluc3RhbmNlb2YgU3RhdGVGaWVsZCkge1xuICAgICAgICAgICAgcmVzdWx0W3ByZWNdLnB1c2goZXh0KTtcbiAgICAgICAgICAgIGlmIChleHQucHJvdmlkZXMpXG4gICAgICAgICAgICAgICAgaW5uZXIoZXh0LnByb3ZpZGVzLCBwcmVjKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHQgaW5zdGFuY2VvZiBGYWNldFByb3ZpZGVyKSB7XG4gICAgICAgICAgICByZXN1bHRbcHJlY10ucHVzaChleHQpO1xuICAgICAgICAgICAgaWYgKGV4dC5mYWNldC5leHRlbnNpb25zKVxuICAgICAgICAgICAgICAgIGlubmVyKGV4dC5mYWNldC5leHRlbnNpb25zLCBQcmVjXy5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gZXh0LmV4dGVuc2lvbjtcbiAgICAgICAgICAgIGlmICghY29udGVudClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBleHRlbnNpb24gdmFsdWUgaW4gZXh0ZW5zaW9uIHNldCAoJHtleHR9KS4gVGhpcyBzb21ldGltZXMgaGFwcGVucyBiZWNhdXNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBAY29kZW1pcnJvci9zdGF0ZSBhcmUgbG9hZGVkLCBicmVha2luZyBpbnN0YW5jZW9mIGNoZWNrcy5gKTtcbiAgICAgICAgICAgIGlubmVyKGNvbnRlbnQsIHByZWMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlubmVyKGV4dGVuc2lvbiwgUHJlY18uZGVmYXVsdCk7XG4gICAgcmV0dXJuIHJlc3VsdC5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpKTtcbn1cbmZ1bmN0aW9uIGVuc3VyZUFkZHIoc3RhdGUsIGFkZHIpIHtcbiAgICBpZiAoYWRkciAmIDEpXG4gICAgICAgIHJldHVybiAyIC8qIFNsb3RTdGF0dXMuQ29tcHV0ZWQgKi87XG4gICAgbGV0IGlkeCA9IGFkZHIgPj4gMTtcbiAgICBsZXQgc3RhdHVzID0gc3RhdGUuc3RhdHVzW2lkeF07XG4gICAgaWYgKHN0YXR1cyA9PSA0IC8qIFNsb3RTdGF0dXMuQ29tcHV0aW5nICovKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDeWNsaWMgZGVwZW5kZW5jeSBiZXR3ZWVuIGZpZWxkcyBhbmQvb3IgZmFjZXRzXCIpO1xuICAgIGlmIChzdGF0dXMgJiAyIC8qIFNsb3RTdGF0dXMuQ29tcHV0ZWQgKi8pXG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgc3RhdGUuc3RhdHVzW2lkeF0gPSA0IC8qIFNsb3RTdGF0dXMuQ29tcHV0aW5nICovO1xuICAgIGxldCBjaGFuZ2VkID0gc3RhdGUuY29tcHV0ZVNsb3Qoc3RhdGUsIHN0YXRlLmNvbmZpZy5keW5hbWljU2xvdHNbaWR4XSk7XG4gICAgcmV0dXJuIHN0YXRlLnN0YXR1c1tpZHhdID0gMiAvKiBTbG90U3RhdHVzLkNvbXB1dGVkICovIHwgY2hhbmdlZDtcbn1cbmZ1bmN0aW9uIGdldEFkZHIoc3RhdGUsIGFkZHIpIHtcbiAgICByZXR1cm4gYWRkciAmIDEgPyBzdGF0ZS5jb25maWcuc3RhdGljVmFsdWVzW2FkZHIgPj4gMV0gOiBzdGF0ZS52YWx1ZXNbYWRkciA+PiAxXTtcbn1cblxuY29uc3QgbGFuZ3VhZ2VEYXRhID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUodiA9PiB2KSxcbiAgICBzdGF0aWM6IHRydWVcbn0pO1xuY29uc3QgbGluZVNlcGFyYXRvciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogdW5kZWZpbmVkLFxuICAgIHN0YXRpYzogdHJ1ZVxufSk7XG5jb25zdCBjaGFuZ2VGaWx0ZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCB0cmFuc2FjdGlvbkZpbHRlciA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IHRyYW5zYWN0aW9uRXh0ZW5kZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCByZWFkT25seSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzWzBdIDogZmFsc2Vcbn0pO1xuXG4vKipcbkFubm90YXRpb25zIGFyZSB0YWdnZWQgdmFsdWVzIHRoYXQgYXJlIHVzZWQgdG8gYWRkIG1ldGFkYXRhIHRvXG50cmFuc2FjdGlvbnMgaW4gYW4gZXh0ZW5zaWJsZSB3YXkuIFRoZXkgc2hvdWxkIGJlIHVzZWQgdG8gbW9kZWxcbnRoaW5ncyB0aGF0IGVmZmVjdCB0aGUgZW50aXJlIHRyYW5zYWN0aW9uIChzdWNoIGFzIGl0cyBbdGltZVxuc3RhbXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25edGltZSkgb3IgaW5mb3JtYXRpb24gYWJvdXQgaXRzXG5bb3JpZ2luXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uXnVzZXJFdmVudCkpLiBGb3IgZWZmZWN0cyB0aGF0IGhhcHBlblxuX2Fsb25nc2lkZV8gdGhlIG90aGVyIGNoYW5nZXMgbWFkZSBieSB0aGUgdHJhbnNhY3Rpb24sIFtzdGF0ZVxuZWZmZWN0c10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdCkgYXJlIG1vcmUgYXBwcm9wcmlhdGUuXG4qL1xuY2xhc3MgQW5ub3RhdGlvbiB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgYW5ub3RhdGlvbiB0eXBlLlxuICAgICovXG4gICAgdHlwZSwgXG4gICAgLyoqXG4gICAgVGhlIHZhbHVlIG9mIHRoaXMgYW5ub3RhdGlvbi5cbiAgICAqL1xuICAgIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbmV3IHR5cGUgb2YgYW5ub3RhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoKSB7IHJldHVybiBuZXcgQW5ub3RhdGlvblR5cGUoKTsgfVxufVxuLyoqXG5NYXJrZXIgdGhhdCBpZGVudGlmaWVzIGEgdHlwZSBvZiBbYW5ub3RhdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5Bbm5vdGF0aW9uKS5cbiovXG5jbGFzcyBBbm5vdGF0aW9uVHlwZSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgYW5ub3RhdGlvbi5cbiAgICAqL1xuICAgIG9mKHZhbHVlKSB7IHJldHVybiBuZXcgQW5ub3RhdGlvbih0aGlzLCB2YWx1ZSk7IH1cbn1cbi8qKlxuUmVwcmVzZW50YXRpb24gb2YgYSB0eXBlIG9mIHN0YXRlIGVmZmVjdC4gRGVmaW5lZCB3aXRoXG5bYFN0YXRlRWZmZWN0LmRlZmluZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuU3RhdGVFZmZlY3ReZGVmaW5lKS5cbiovXG5jbGFzcyBTdGF0ZUVmZmVjdFR5cGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhlIGBhbnlgIHR5cGVzIGluIHRoZXNlIGZ1bmN0aW9uIHR5cGVzIGFyZSB0aGVyZSB0byB3b3JrXG4gICAgLy8gYXJvdW5kIFR5cGVTY3JpcHQgaXNzdWUgIzM3NjMxLCB3aGVyZSB0aGUgdHlwZSBndWFyZCBvblxuICAgIC8vIGBTdGF0ZUVmZmVjdC5pc2AgbXlzdGVyaW91c2x5IHN0b3BzIHdvcmtpbmcgd2hlbiB0aGVzZSBwcm9wZXJseVxuICAgIC8vIGhhdmUgdHlwZSBgVmFsdWVgLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWFwKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbc3RhdGUgZWZmZWN0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0KSBpbnN0YW5jZSBvZiB0aGlzXG4gICAgdHlwZS5cbiAgICAqL1xuICAgIG9mKHZhbHVlKSB7IHJldHVybiBuZXcgU3RhdGVFZmZlY3QodGhpcywgdmFsdWUpOyB9XG59XG4vKipcblN0YXRlIGVmZmVjdHMgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGFkZGl0aW9uYWwgZWZmZWN0c1xuYXNzb2NpYXRlZCB3aXRoIGEgW3RyYW5zYWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLmVmZmVjdHMpLiBUaGV5XG5hcmUgb2Z0ZW4gdXNlZnVsIHRvIG1vZGVsIGNoYW5nZXMgdG8gY3VzdG9tIFtzdGF0ZVxuZmllbGRzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRmllbGQpLCB3aGVuIHRob3NlIGNoYW5nZXMgYXJlbid0IGltcGxpY2l0IGluXG5kb2N1bWVudCBvciBzZWxlY3Rpb24gY2hhbmdlcy5cbiovXG5jbGFzcyBTdGF0ZUVmZmVjdCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBvZiB0aGlzIGVmZmVjdC5cbiAgICAqL1xuICAgIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIHRoaXMgZWZmZWN0IHRocm91Z2ggYSBwb3NpdGlvbiBtYXBwaW5nLiBXaWxsIHJldHVyblxuICAgIGB1bmRlZmluZWRgIHdoZW4gdGhhdCBlbmRzIHVwIGRlbGV0aW5nIHRoZSBlZmZlY3QuXG4gICAgKi9cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgbWFwcGVkID0gdGhpcy50eXBlLm1hcCh0aGlzLnZhbHVlLCBtYXBwaW5nKTtcbiAgICAgICAgcmV0dXJuIG1hcHBlZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbWFwcGVkID09IHRoaXMudmFsdWUgPyB0aGlzIDogbmV3IFN0YXRlRWZmZWN0KHRoaXMudHlwZSwgbWFwcGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhpcyBlZmZlY3Qgb2JqZWN0IGlzIG9mIGEgZ2l2ZW5cbiAgICBbdHlwZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdFR5cGUpLlxuICAgICovXG4gICAgaXModHlwZSkgeyByZXR1cm4gdGhpcy50eXBlID09IHR5cGU7IH1cbiAgICAvKipcbiAgICBEZWZpbmUgYSBuZXcgZWZmZWN0IHR5cGUuIFRoZSB0eXBlIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIHR5cGVcbiAgICBvZiB2YWx1ZXMgdGhhdCBoaXMgZWZmZWN0IGhvbGRzLiBJdCBzaG91bGQgYmUgYSB0eXBlIHRoYXRcbiAgICBkb2Vzbid0IGluY2x1ZGUgYHVuZGVmaW5lZGAsIHNpbmNlIHRoYXQgaXMgdXNlZCBpblxuICAgIFttYXBwaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0Lm1hcCkgdG8gaW5kaWNhdGUgdGhhdCBhbiBlZmZlY3QgaXNcbiAgICByZW1vdmVkLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShzcGVjID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZUVmZmVjdFR5cGUoc3BlYy5tYXAgfHwgKHYgPT4gdikpO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgYW4gYXJyYXkgb2YgZWZmZWN0cyB0aHJvdWdoIGEgY2hhbmdlIHNldC5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXBFZmZlY3RzKGVmZmVjdHMsIG1hcHBpbmcpIHtcbiAgICAgICAgaWYgKCFlZmZlY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBlZmZlY3RzO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGVmZmVjdCBvZiBlZmZlY3RzKSB7XG4gICAgICAgICAgICBsZXQgbWFwcGVkID0gZWZmZWN0Lm1hcChtYXBwaW5nKTtcbiAgICAgICAgICAgIGlmIChtYXBwZWQpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobWFwcGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuVGhpcyBlZmZlY3QgY2FuIGJlIHVzZWQgdG8gcmVjb25maWd1cmUgdGhlIHJvb3QgZXh0ZW5zaW9ucyBvZlxudGhlIGVkaXRvci4gRG9pbmcgdGhpcyB3aWxsIGRpc2NhcmQgYW55IGV4dGVuc2lvbnNcblthcHBlbmRlZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdF5hcHBlbmRDb25maWcpLCBidXQgZG9lcyBub3QgcmVzZXRcbnRoZSBjb250ZW50IG9mIFtyZWNvbmZpZ3VyZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ29tcGFydG1lbnQucmVjb25maWd1cmUpXG5jb21wYXJ0bWVudHMuXG4qL1xuU3RhdGVFZmZlY3QucmVjb25maWd1cmUgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4vKipcbkFwcGVuZCBleHRlbnNpb25zIHRvIHRoZSB0b3AtbGV2ZWwgY29uZmlndXJhdGlvbiBvZiB0aGUgZWRpdG9yLlxuKi9cblN0YXRlRWZmZWN0LmFwcGVuZENvbmZpZyA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbi8qKlxuQ2hhbmdlcyB0byB0aGUgZWRpdG9yIHN0YXRlIGFyZSBncm91cGVkIGludG8gdHJhbnNhY3Rpb25zLlxuVHlwaWNhbGx5LCBhIHVzZXIgYWN0aW9uIGNyZWF0ZXMgYSBzaW5nbGUgdHJhbnNhY3Rpb24sIHdoaWNoIG1heVxuY29udGFpbiBhbnkgbnVtYmVyIG9mIGRvY3VtZW50IGNoYW5nZXMsIG1heSBjaGFuZ2UgdGhlIHNlbGVjdGlvbixcbm9yIGhhdmUgb3RoZXIgZWZmZWN0cy4gQ3JlYXRlIGEgdHJhbnNhY3Rpb24gYnkgY2FsbGluZ1xuW2BFZGl0b3JTdGF0ZS51cGRhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnVwZGF0ZSksIG9yIGltbWVkaWF0ZWx5XG5kaXNwYXRjaCBvbmUgYnkgY2FsbGluZ1xuW2BFZGl0b3JWaWV3LmRpc3BhdGNoYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGlzcGF0Y2gpLlxuKi9cbmNsYXNzIFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhdGUgZnJvbSB3aGljaCB0aGUgdHJhbnNhY3Rpb24gc3RhcnRzLlxuICAgICovXG4gICAgc3RhcnRTdGF0ZSwgXG4gICAgLyoqXG4gICAgVGhlIGRvY3VtZW50IGNoYW5nZXMgbWFkZSBieSB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgY2hhbmdlcywgXG4gICAgLyoqXG4gICAgVGhlIHNlbGVjdGlvbiBzZXQgYnkgdGhpcyB0cmFuc2FjdGlvbiwgb3IgdW5kZWZpbmVkIGlmIGl0XG4gICAgZG9lc24ndCBleHBsaWNpdGx5IHNldCBhIHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIHNlbGVjdGlvbiwgXG4gICAgLyoqXG4gICAgVGhlIGVmZmVjdHMgYWRkZWQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZWZmZWN0cywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhbm5vdGF0aW9ucywgXG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgc2VsZWN0aW9uIHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcgYWZ0ZXIgdGhpc1xuICAgIHRyYW5zYWN0aW9uIGlzIGRpc3BhdGNoZWQuXG4gICAgKi9cbiAgICBzY3JvbGxJbnRvVmlldykge1xuICAgICAgICB0aGlzLnN0YXJ0U3RhdGUgPSBzdGFydFN0YXRlO1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBjaGFuZ2VzO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5lZmZlY3RzID0gZWZmZWN0cztcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zO1xuICAgICAgICB0aGlzLnNjcm9sbEludG9WaWV3ID0gc2Nyb2xsSW50b1ZpZXc7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fZG9jID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IG51bGw7XG4gICAgICAgIGlmIChzZWxlY3Rpb24pXG4gICAgICAgICAgICBjaGVja1NlbGVjdGlvbihzZWxlY3Rpb24sIGNoYW5nZXMubmV3TGVuZ3RoKTtcbiAgICAgICAgaWYgKCFhbm5vdGF0aW9ucy5zb21lKChhKSA9PiBhLnR5cGUgPT0gVHJhbnNhY3Rpb24udGltZSkpXG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuY29uY2F0KFRyYW5zYWN0aW9uLnRpbWUub2YoRGF0ZS5ub3coKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoc3RhcnRTdGF0ZSwgY2hhbmdlcywgc2VsZWN0aW9uLCBlZmZlY3RzLCBhbm5vdGF0aW9ucywgc2Nyb2xsSW50b1ZpZXcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbihzdGFydFN0YXRlLCBjaGFuZ2VzLCBzZWxlY3Rpb24sIGVmZmVjdHMsIGFubm90YXRpb25zLCBzY3JvbGxJbnRvVmlldyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBuZXcgZG9jdW1lbnQgcHJvZHVjZWQgYnkgdGhlIHRyYW5zYWN0aW9uLiBDb250cmFyeSB0b1xuICAgIFtgLnN0YXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zdGF0ZSlgLmRvY2AsIGFjY2Vzc2luZyB0aGlzIHdvbid0XG4gICAgZm9yY2UgdGhlIGVudGlyZSBuZXcgc3RhdGUgdG8gYmUgY29tcHV0ZWQgcmlnaHQgYXdheSwgc28gaXQgaXNcbiAgICByZWNvbW1lbmRlZCB0aGF0IFt0cmFuc2FjdGlvblxuICAgIGZpbHRlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedHJhbnNhY3Rpb25GaWx0ZXIpIHVzZSB0aGlzIGdldHRlclxuICAgIHdoZW4gdGhleSBuZWVkIHRvIGxvb2sgYXQgdGhlIG5ldyBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBuZXdEb2MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kb2MgfHwgKHRoaXMuX2RvYyA9IHRoaXMuY2hhbmdlcy5hcHBseSh0aGlzLnN0YXJ0U3RhdGUuZG9jKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBuZXcgc2VsZWN0aW9uIHByb2R1Y2VkIGJ5IHRoZSB0cmFuc2FjdGlvbi4gSWZcbiAgICBbYHRoaXMuc2VsZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zZWxlY3Rpb24pIGlzIHVuZGVmaW5lZCxcbiAgICB0aGlzIHdpbGwgW21hcF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTZWxlY3Rpb24ubWFwKSB0aGUgc3RhcnQgc3RhdGUnc1xuICAgIGN1cnJlbnQgc2VsZWN0aW9uIHRocm91Z2ggdGhlIGNoYW5nZXMgbWFkZSBieSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgKi9cbiAgICBnZXQgbmV3U2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24gfHwgdGhpcy5zdGFydFN0YXRlLnNlbGVjdGlvbi5tYXAodGhpcy5jaGFuZ2VzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIG5ldyBzdGF0ZSBjcmVhdGVkIGJ5IHRoZSB0cmFuc2FjdGlvbi4gQ29tcHV0ZWQgb24gZGVtYW5kXG4gICAgKGJ1dCByZXRhaW5lZCBmb3Igc3Vic2VxdWVudCBhY2Nlc3MpLCBzbyBpdCBpcyByZWNvbW1lbmRlZCBub3QgdG9cbiAgICBhY2Nlc3MgaXQgaW4gW3RyYW5zYWN0aW9uXG4gICAgZmlsdGVyc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50cmFuc2FjdGlvbkZpbHRlcikgd2hlbiBwb3NzaWJsZS5cbiAgICAqL1xuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdGF0ZSlcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTdGF0ZS5hcHBseVRyYW5zYWN0aW9uKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGFubm90YXRpb24gdHlwZSwgaWYgYW55LlxuICAgICovXG4gICAgYW5ub3RhdGlvbih0eXBlKSB7XG4gICAgICAgIGZvciAobGV0IGFubiBvZiB0aGlzLmFubm90YXRpb25zKVxuICAgICAgICAgICAgaWYgKGFubi50eXBlID09IHR5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFubi52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIGNoYW5nZWQgdGhlIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IGRvY0NoYW5nZWQoKSB7IHJldHVybiAhdGhpcy5jaGFuZ2VzLmVtcHR5OyB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc2FjdGlvbiByZWNvbmZpZ3VyZXMgdGhlIHN0YXRlXG4gICAgKHRocm91Z2ggYSBbY29uZmlndXJhdGlvbiBjb21wYXJ0bWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5Db21wYXJ0bWVudCkgb3JcbiAgICB3aXRoIGEgdG9wLWxldmVsIGNvbmZpZ3VyYXRpb25cbiAgICBbZWZmZWN0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRWZmZWN0XnJlY29uZmlndXJlKS5cbiAgICAqL1xuICAgIGdldCByZWNvbmZpZ3VyZWQoKSB7IHJldHVybiB0aGlzLnN0YXJ0U3RhdGUuY29uZmlnICE9IHRoaXMuc3RhdGUuY29uZmlnOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgYSBbdXNlclxuICAgIGV2ZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uXnVzZXJFdmVudCkgYW5ub3RhdGlvbiB0aGF0IGlzIGVxdWFsIHRvXG4gICAgb3IgbW9yZSBzcGVjaWZpYyB0aGFuIGBldmVudGAuIEZvciBleGFtcGxlLCBpZiB0aGUgdHJhbnNhY3Rpb25cbiAgICBoYXMgYFwic2VsZWN0LnBvaW50ZXJcImAgYXMgdXNlciBldmVudCwgYFwic2VsZWN0XCJgIGFuZFxuICAgIGBcInNlbGVjdC5wb2ludGVyXCJgIHdpbGwgbWF0Y2ggaXQuXG4gICAgKi9cbiAgICBpc1VzZXJFdmVudChldmVudCkge1xuICAgICAgICBsZXQgZSA9IHRoaXMuYW5ub3RhdGlvbihUcmFuc2FjdGlvbi51c2VyRXZlbnQpO1xuICAgICAgICByZXR1cm4gISEoZSAmJiAoZSA9PSBldmVudCB8fCBlLmxlbmd0aCA+IGV2ZW50Lmxlbmd0aCAmJiBlLnNsaWNlKDAsIGV2ZW50Lmxlbmd0aCkgPT0gZXZlbnQgJiYgZVtldmVudC5sZW5ndGhdID09IFwiLlwiKSk7XG4gICAgfVxufVxuLyoqXG5Bbm5vdGF0aW9uIHVzZWQgdG8gc3RvcmUgdHJhbnNhY3Rpb24gdGltZXN0YW1wcy4gQXV0b21hdGljYWxseVxuYWRkZWQgdG8gZXZlcnkgdHJhbnNhY3Rpb24sIGhvbGRpbmcgYERhdGUubm93KClgLlxuKi9cblRyYW5zYWN0aW9uLnRpbWUgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbi8qKlxuQW5ub3RhdGlvbiB1c2VkIHRvIGFzc29jaWF0ZSBhIHRyYW5zYWN0aW9uIHdpdGggYSB1c2VyIGludGVyZmFjZVxuZXZlbnQuIEhvbGRzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBldmVudCwgdXNpbmcgYVxuZG90LXNlcGFyYXRlZCBmb3JtYXQgdG8gc3VwcG9ydCBhdHRhY2hpbmcgbW9yZSBzcGVjaWZpY1xuaW5mb3JtYXRpb24uIFRoZSBldmVudHMgdXNlZCBieSB0aGUgY29yZSBsaWJyYXJpZXMgYXJlOlxuXG4gLSBgXCJpbnB1dFwiYCB3aGVuIGNvbnRlbnQgaXMgZW50ZXJlZFxuICAgLSBgXCJpbnB1dC50eXBlXCJgIGZvciB0eXBlZCBpbnB1dFxuICAgICAtIGBcImlucHV0LnR5cGUuY29tcG9zZVwiYCBmb3IgY29tcG9zaXRpb25cbiAgIC0gYFwiaW5wdXQucGFzdGVcImAgZm9yIHBhc3RlZCBpbnB1dFxuICAgLSBgXCJpbnB1dC5kcm9wXCJgIHdoZW4gYWRkaW5nIGNvbnRlbnQgd2l0aCBkcmFnLWFuZC1kcm9wXG4gICAtIGBcImlucHV0LmNvbXBsZXRlXCJgIHdoZW4gYXV0b2NvbXBsZXRpbmdcbiAtIGBcImRlbGV0ZVwiYCB3aGVuIHRoZSB1c2VyIGRlbGV0ZXMgY29udGVudFxuICAgLSBgXCJkZWxldGUuc2VsZWN0aW9uXCJgIHdoZW4gZGVsZXRpbmcgdGhlIHNlbGVjdGlvblxuICAgLSBgXCJkZWxldGUuZm9yd2FyZFwiYCB3aGVuIGRlbGV0aW5nIGZvcndhcmQgZnJvbSB0aGUgc2VsZWN0aW9uXG4gICAtIGBcImRlbGV0ZS5iYWNrd2FyZFwiYCB3aGVuIGRlbGV0aW5nIGJhY2t3YXJkIGZyb20gdGhlIHNlbGVjdGlvblxuICAgLSBgXCJkZWxldGUuY3V0XCJgIHdoZW4gY3V0dGluZyB0byB0aGUgY2xpcGJvYXJkXG4gLSBgXCJtb3ZlXCJgIHdoZW4gY29udGVudCBpcyBtb3ZlZFxuICAgLSBgXCJtb3ZlLmRyb3BcImAgd2hlbiBjb250ZW50IGlzIG1vdmVkIHdpdGhpbiB0aGUgZWRpdG9yIHRocm91Z2ggZHJhZy1hbmQtZHJvcFxuIC0gYFwic2VsZWN0XCJgIHdoZW4gZXhwbGljaXRseSBjaGFuZ2luZyB0aGUgc2VsZWN0aW9uXG4gICAtIGBcInNlbGVjdC5wb2ludGVyXCJgIHdoZW4gc2VsZWN0aW5nIHdpdGggYSBtb3VzZSBvciBvdGhlciBwb2ludGluZyBkZXZpY2VcbiAtIGBcInVuZG9cImAgYW5kIGBcInJlZG9cImAgZm9yIGhpc3RvcnkgYWN0aW9uc1xuXG5Vc2UgW2Bpc1VzZXJFdmVudGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uaXNVc2VyRXZlbnQpIHRvIGNoZWNrXG53aGV0aGVyIHRoZSBhbm5vdGF0aW9uIG1hdGNoZXMgYSBnaXZlbiBldmVudC5cbiovXG5UcmFuc2FjdGlvbi51c2VyRXZlbnQgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbi8qKlxuQW5ub3RhdGlvbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWRkZWQgdG9cbnRoZSB1bmRvIGhpc3Rvcnkgb3Igbm90LlxuKi9cblRyYW5zYWN0aW9uLmFkZFRvSGlzdG9yeSA9IC8qQF9fUFVSRV9fKi9Bbm5vdGF0aW9uLmRlZmluZSgpO1xuLyoqXG5Bbm5vdGF0aW9uIGluZGljYXRpbmcgKHdoZW4gcHJlc2VudCBhbmQgdHJ1ZSkgdGhhdCBhIHRyYW5zYWN0aW9uXG5yZXByZXNlbnRzIGEgY2hhbmdlIG1hZGUgYnkgc29tZSBvdGhlciBhY3Rvciwgbm90IHRoZSB1c2VyLiBUaGlzXG5pcyB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gdGFnIG90aGVyIHBlb3BsZSdzIGNoYW5nZXMgaW5cbmNvbGxhYm9yYXRpdmUgZWRpdGluZy5cbiovXG5UcmFuc2FjdGlvbi5yZW1vdGUgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbmZ1bmN0aW9uIGpvaW5SYW5nZXMoYSwgYikge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpQSA9IDAsIGlCID0gMDs7KSB7XG4gICAgICAgIGxldCBmcm9tLCB0bztcbiAgICAgICAgaWYgKGlBIDwgYS5sZW5ndGggJiYgKGlCID09IGIubGVuZ3RoIHx8IGJbaUJdID49IGFbaUFdKSkge1xuICAgICAgICAgICAgZnJvbSA9IGFbaUErK107XG4gICAgICAgICAgICB0byA9IGFbaUErK107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaUIgPCBiLmxlbmd0aCkge1xuICAgICAgICAgICAgZnJvbSA9IGJbaUIrK107XG4gICAgICAgICAgICB0byA9IGJbaUIrK107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoIHx8IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPCBmcm9tKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJvbSwgdG8pO1xuICAgICAgICBlbHNlIGlmIChyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdIDwgdG8pXG4gICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID0gdG87XG4gICAgfVxufVxuZnVuY3Rpb24gbWVyZ2VUcmFuc2FjdGlvbihhLCBiLCBzZXF1ZW50aWFsKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBtYXBGb3JBLCBtYXBGb3JCLCBjaGFuZ2VzO1xuICAgIGlmIChzZXF1ZW50aWFsKSB7XG4gICAgICAgIG1hcEZvckEgPSBiLmNoYW5nZXM7XG4gICAgICAgIG1hcEZvckIgPSBDaGFuZ2VTZXQuZW1wdHkoYi5jaGFuZ2VzLmxlbmd0aCk7XG4gICAgICAgIGNoYW5nZXMgPSBhLmNoYW5nZXMuY29tcG9zZShiLmNoYW5nZXMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbWFwRm9yQSA9IGIuY2hhbmdlcy5tYXAoYS5jaGFuZ2VzKTtcbiAgICAgICAgbWFwRm9yQiA9IGEuY2hhbmdlcy5tYXBEZXNjKGIuY2hhbmdlcywgdHJ1ZSk7XG4gICAgICAgIGNoYW5nZXMgPSBhLmNoYW5nZXMuY29tcG9zZShtYXBGb3JBKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlcyxcbiAgICAgICAgc2VsZWN0aW9uOiBiLnNlbGVjdGlvbiA/IGIuc2VsZWN0aW9uLm1hcChtYXBGb3JCKSA6IChfYSA9IGEuc2VsZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKG1hcEZvckEpLFxuICAgICAgICBlZmZlY3RzOiBTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGEuZWZmZWN0cywgbWFwRm9yQSkuY29uY2F0KFN0YXRlRWZmZWN0Lm1hcEVmZmVjdHMoYi5lZmZlY3RzLCBtYXBGb3JCKSksXG4gICAgICAgIGFubm90YXRpb25zOiBhLmFubm90YXRpb25zLmxlbmd0aCA/IGEuYW5ub3RhdGlvbnMuY29uY2F0KGIuYW5ub3RhdGlvbnMpIDogYi5hbm5vdGF0aW9ucyxcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXc6IGEuc2Nyb2xsSW50b1ZpZXcgfHwgYi5zY3JvbGxJbnRvVmlld1xuICAgIH07XG59XG5mdW5jdGlvbiByZXNvbHZlVHJhbnNhY3Rpb25Jbm5lcihzdGF0ZSwgc3BlYywgZG9jU2l6ZSkge1xuICAgIGxldCBzZWwgPSBzcGVjLnNlbGVjdGlvbiwgYW5ub3RhdGlvbnMgPSBhc0FycmF5KHNwZWMuYW5ub3RhdGlvbnMpO1xuICAgIGlmIChzcGVjLnVzZXJFdmVudClcbiAgICAgICAgYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucy5jb25jYXQoVHJhbnNhY3Rpb24udXNlckV2ZW50Lm9mKHNwZWMudXNlckV2ZW50KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hhbmdlczogc3BlYy5jaGFuZ2VzIGluc3RhbmNlb2YgQ2hhbmdlU2V0ID8gc3BlYy5jaGFuZ2VzXG4gICAgICAgICAgICA6IENoYW5nZVNldC5vZihzcGVjLmNoYW5nZXMgfHwgW10sIGRvY1NpemUsIHN0YXRlLmZhY2V0KGxpbmVTZXBhcmF0b3IpKSxcbiAgICAgICAgc2VsZWN0aW9uOiBzZWwgJiYgKHNlbCBpbnN0YW5jZW9mIEVkaXRvclNlbGVjdGlvbiA/IHNlbCA6IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUoc2VsLmFuY2hvciwgc2VsLmhlYWQpKSxcbiAgICAgICAgZWZmZWN0czogYXNBcnJheShzcGVjLmVmZmVjdHMpLFxuICAgICAgICBhbm5vdGF0aW9ucyxcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXc6ICEhc3BlYy5zY3JvbGxJbnRvVmlld1xuICAgIH07XG59XG5mdW5jdGlvbiByZXNvbHZlVHJhbnNhY3Rpb24oc3RhdGUsIHNwZWNzLCBmaWx0ZXIpIHtcbiAgICBsZXQgcyA9IHJlc29sdmVUcmFuc2FjdGlvbklubmVyKHN0YXRlLCBzcGVjcy5sZW5ndGggPyBzcGVjc1swXSA6IHt9LCBzdGF0ZS5kb2MubGVuZ3RoKTtcbiAgICBpZiAoc3BlY3MubGVuZ3RoICYmIHNwZWNzWzBdLmZpbHRlciA9PT0gZmFsc2UpXG4gICAgICAgIGZpbHRlciA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3BlY3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNwZWNzW2ldLmZpbHRlciA9PT0gZmFsc2UpXG4gICAgICAgICAgICBmaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNlcSA9ICEhc3BlY3NbaV0uc2VxdWVudGlhbDtcbiAgICAgICAgcyA9IG1lcmdlVHJhbnNhY3Rpb24ocywgcmVzb2x2ZVRyYW5zYWN0aW9uSW5uZXIoc3RhdGUsIHNwZWNzW2ldLCBzZXEgPyBzLmNoYW5nZXMubmV3TGVuZ3RoIDogc3RhdGUuZG9jLmxlbmd0aCksIHNlcSk7XG4gICAgfVxuICAgIGxldCB0ciA9IFRyYW5zYWN0aW9uLmNyZWF0ZShzdGF0ZSwgcy5jaGFuZ2VzLCBzLnNlbGVjdGlvbiwgcy5lZmZlY3RzLCBzLmFubm90YXRpb25zLCBzLnNjcm9sbEludG9WaWV3KTtcbiAgICByZXR1cm4gZXh0ZW5kVHJhbnNhY3Rpb24oZmlsdGVyID8gZmlsdGVyVHJhbnNhY3Rpb24odHIpIDogdHIpO1xufVxuLy8gRmluaXNoIGEgdHJhbnNhY3Rpb24gYnkgYXBwbHlpbmcgZmlsdGVycyBpZiBuZWNlc3NhcnkuXG5mdW5jdGlvbiBmaWx0ZXJUcmFuc2FjdGlvbih0cikge1xuICAgIGxldCBzdGF0ZSA9IHRyLnN0YXJ0U3RhdGU7XG4gICAgLy8gQ2hhbmdlIGZpbHRlcnNcbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBmaWx0ZXIgb2Ygc3RhdGUuZmFjZXQoY2hhbmdlRmlsdGVyKSkge1xuICAgICAgICBsZXQgdmFsdWUgPSBmaWx0ZXIodHIpO1xuICAgICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gdHJ1ZSA/IHZhbHVlIDogam9pblJhbmdlcyhyZXN1bHQsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICBsZXQgY2hhbmdlcywgYmFjaztcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJhY2sgPSB0ci5jaGFuZ2VzLmludmVydGVkRGVzYztcbiAgICAgICAgICAgIGNoYW5nZXMgPSBDaGFuZ2VTZXQuZW1wdHkoc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZmlsdGVyZWQgPSB0ci5jaGFuZ2VzLmZpbHRlcihyZXN1bHQpO1xuICAgICAgICAgICAgY2hhbmdlcyA9IGZpbHRlcmVkLmNoYW5nZXM7XG4gICAgICAgICAgICBiYWNrID0gZmlsdGVyZWQuZmlsdGVyZWQubWFwRGVzYyhmaWx0ZXJlZC5jaGFuZ2VzKS5pbnZlcnRlZERlc2M7XG4gICAgICAgIH1cbiAgICAgICAgdHIgPSBUcmFuc2FjdGlvbi5jcmVhdGUoc3RhdGUsIGNoYW5nZXMsIHRyLnNlbGVjdGlvbiAmJiB0ci5zZWxlY3Rpb24ubWFwKGJhY2spLCBTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKHRyLmVmZmVjdHMsIGJhY2spLCB0ci5hbm5vdGF0aW9ucywgdHIuc2Nyb2xsSW50b1ZpZXcpO1xuICAgIH1cbiAgICAvLyBUcmFuc2FjdGlvbiBmaWx0ZXJzXG4gICAgbGV0IGZpbHRlcnMgPSBzdGF0ZS5mYWNldCh0cmFuc2FjdGlvbkZpbHRlcik7XG4gICAgZm9yIChsZXQgaSA9IGZpbHRlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IGZpbHRlcmVkID0gZmlsdGVyc1tpXSh0cik7XG4gICAgICAgIGlmIChmaWx0ZXJlZCBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uKVxuICAgICAgICAgICAgdHIgPSBmaWx0ZXJlZDtcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJlZCkgJiYgZmlsdGVyZWQubGVuZ3RoID09IDEgJiYgZmlsdGVyZWRbMF0gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbilcbiAgICAgICAgICAgIHRyID0gZmlsdGVyZWRbMF07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRyID0gcmVzb2x2ZVRyYW5zYWN0aW9uKHN0YXRlLCBhc0FycmF5KGZpbHRlcmVkKSwgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdHI7XG59XG5mdW5jdGlvbiBleHRlbmRUcmFuc2FjdGlvbih0cikge1xuICAgIGxldCBzdGF0ZSA9IHRyLnN0YXJ0U3RhdGUsIGV4dGVuZGVycyA9IHN0YXRlLmZhY2V0KHRyYW5zYWN0aW9uRXh0ZW5kZXIpLCBzcGVjID0gdHI7XG4gICAgZm9yIChsZXQgaSA9IGV4dGVuZGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBsZXQgZXh0ZW5zaW9uID0gZXh0ZW5kZXJzW2ldKHRyKTtcbiAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBPYmplY3Qua2V5cyhleHRlbnNpb24pLmxlbmd0aClcbiAgICAgICAgICAgIHNwZWMgPSBtZXJnZVRyYW5zYWN0aW9uKHNwZWMsIHJlc29sdmVUcmFuc2FjdGlvbklubmVyKHN0YXRlLCBleHRlbnNpb24sIHRyLmNoYW5nZXMubmV3TGVuZ3RoKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBzcGVjID09IHRyID8gdHIgOiBUcmFuc2FjdGlvbi5jcmVhdGUoc3RhdGUsIHRyLmNoYW5nZXMsIHRyLnNlbGVjdGlvbiwgc3BlYy5lZmZlY3RzLCBzcGVjLmFubm90YXRpb25zLCBzcGVjLnNjcm9sbEludG9WaWV3KTtcbn1cbmNvbnN0IG5vbmUgPSBbXTtcbmZ1bmN0aW9uIGFzQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IG5vbmUgOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuLyoqXG5UaGUgY2F0ZWdvcmllcyBwcm9kdWNlZCBieSBhIFtjaGFyYWN0ZXJcbmNhdGVnb3JpemVyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmNoYXJDYXRlZ29yaXplcikuIFRoZXNlIGFyZSB1c2VkXG5kbyB0aGluZ3MgbGlrZSBzZWxlY3RpbmcgYnkgd29yZC5cbiovXG52YXIgQ2hhckNhdGVnb3J5ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoQ2hhckNhdGVnb3J5KSB7XG4gICAgLyoqXG4gICAgV29yZCBjaGFyYWN0ZXJzLlxuICAgICovXG4gICAgQ2hhckNhdGVnb3J5W0NoYXJDYXRlZ29yeVtcIldvcmRcIl0gPSAwXSA9IFwiV29yZFwiO1xuICAgIC8qKlxuICAgIFdoaXRlc3BhY2UuXG4gICAgKi9cbiAgICBDaGFyQ2F0ZWdvcnlbQ2hhckNhdGVnb3J5W1wiU3BhY2VcIl0gPSAxXSA9IFwiU3BhY2VcIjtcbiAgICAvKipcbiAgICBBbnl0aGluZyBlbHNlLlxuICAgICovXG4gICAgQ2hhckNhdGVnb3J5W0NoYXJDYXRlZ29yeVtcIk90aGVyXCJdID0gMl0gPSBcIk90aGVyXCI7XG5yZXR1cm4gQ2hhckNhdGVnb3J5fSkoQ2hhckNhdGVnb3J5IHx8IChDaGFyQ2F0ZWdvcnkgPSB7fSkpO1xuY29uc3Qgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIgPSAvW1xcdTAwZGZcXHUwNTg3XFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MzA0MC1cXHUzMDlmXFx1MzBhMC1cXHUzMGZmXFx1MzQwMC1cXHU0ZGI1XFx1NGUwMC1cXHU5ZmNjXFx1YWMwMC1cXHVkN2FmXS87XG5sZXQgd29yZENoYXI7XG50cnkge1xuICAgIHdvcmRDaGFyID0gLypAX19QVVJFX18qL25ldyBSZWdFeHAoXCJbXFxcXHB7QWxwaGFiZXRpY31cXFxccHtOdW1iZXJ9X11cIiwgXCJ1XCIpO1xufVxuY2F0Y2ggKF8pIHsgfVxuZnVuY3Rpb24gaGFzV29yZENoYXIoc3RyKSB7XG4gICAgaWYgKHdvcmRDaGFyKVxuICAgICAgICByZXR1cm4gd29yZENoYXIudGVzdChzdHIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaCA9IHN0cltpXTtcbiAgICAgICAgaWYgKC9cXHcvLnRlc3QoY2gpIHx8IGNoID4gXCJcXHg4MFwiICYmIChjaC50b1VwcGVyQ2FzZSgpICE9IGNoLnRvTG93ZXJDYXNlKCkgfHwgbm9uQVNDSUlTaW5nbGVDYXNlV29yZENoYXIudGVzdChjaCkpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIG1ha2VDYXRlZ29yaXplcih3b3JkQ2hhcnMpIHtcbiAgICByZXR1cm4gKGNoYXIpID0+IHtcbiAgICAgICAgaWYgKCEvXFxTLy50ZXN0KGNoYXIpKVxuICAgICAgICAgICAgcmV0dXJuIENoYXJDYXRlZ29yeS5TcGFjZTtcbiAgICAgICAgaWYgKGhhc1dvcmRDaGFyKGNoYXIpKVxuICAgICAgICAgICAgcmV0dXJuIENoYXJDYXRlZ29yeS5Xb3JkO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmRDaGFycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChjaGFyLmluZGV4T2Yod29yZENoYXJzW2ldKSA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiBDaGFyQ2F0ZWdvcnkuV29yZDtcbiAgICAgICAgcmV0dXJuIENoYXJDYXRlZ29yeS5PdGhlcjtcbiAgICB9O1xufVxuXG4vKipcblRoZSBlZGl0b3Igc3RhdGUgY2xhc3MgaXMgYSBwZXJzaXN0ZW50IChpbW11dGFibGUpIGRhdGEgc3RydWN0dXJlLlxuVG8gdXBkYXRlIGEgc3RhdGUsIHlvdSBbY3JlYXRlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnVwZGF0ZSkgYVxuW3RyYW5zYWN0aW9uXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uKSwgd2hpY2ggcHJvZHVjZXMgYSBfbmV3XyBzdGF0ZVxuaW5zdGFuY2UsIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBvYmplY3QuXG5cbkFzIHN1Y2gsIF9uZXZlcl8gbXV0YXRlIHByb3BlcnRpZXMgb2YgYSBzdGF0ZSBkaXJlY3RseS4gVGhhdCdsbFxuanVzdCBicmVhayB0aGluZ3MuXG4qL1xuY2xhc3MgRWRpdG9yU3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uZmlnLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBkb2N1bWVudC5cbiAgICAqL1xuICAgIGRvYywgXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICAgICovXG4gICAgc2VsZWN0aW9uLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHZhbHVlcywgY29tcHV0ZVNsb3QsIHRyKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IGNvbmZpZy5zdGF0dXNUZW1wbGF0ZS5zbGljZSgpO1xuICAgICAgICB0aGlzLmNvbXB1dGVTbG90ID0gY29tcHV0ZVNsb3Q7XG4gICAgICAgIC8vIEZpbGwgaW4gdGhlIGNvbXB1dGVkIHN0YXRlIGltbWVkaWF0ZWx5LCBzbyB0aGF0IGZ1cnRoZXIgcXVlcmllc1xuICAgICAgICAvLyBmb3IgaXQgbWFkZSBkdXJpbmcgdGhlIHVwZGF0ZSByZXR1cm4gdGhpcyBzdGF0ZVxuICAgICAgICBpZiAodHIpXG4gICAgICAgICAgICB0ci5fc3RhdGUgPSB0aGlzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29uZmlnLmR5bmFtaWNTbG90cy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGVuc3VyZUFkZHIodGhpcywgaSA8PCAxKTtcbiAgICAgICAgdGhpcy5jb21wdXRlU2xvdCA9IG51bGw7XG4gICAgfVxuICAgIGZpZWxkKGZpZWxkLCByZXF1aXJlID0gdHJ1ZSkge1xuICAgICAgICBsZXQgYWRkciA9IHRoaXMuY29uZmlnLmFkZHJlc3NbZmllbGQuaWRdO1xuICAgICAgICBpZiAoYWRkciA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVxdWlyZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkZpZWxkIGlzIG5vdCBwcmVzZW50IGluIHRoaXMgc3RhdGVcIik7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVuc3VyZUFkZHIodGhpcywgYWRkcik7XG4gICAgICAgIHJldHVybiBnZXRBZGRyKHRoaXMsIGFkZHIpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBbdHJhbnNhY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24pIHRoYXQgdXBkYXRlcyB0aGlzXG4gICAgc3RhdGUuIEFueSBudW1iZXIgb2YgW3RyYW5zYWN0aW9uIHNwZWNzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYylcbiAgICBjYW4gYmUgcGFzc2VkLiBVbmxlc3NcbiAgICBbYHNlcXVlbnRpYWxgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5zZXF1ZW50aWFsKSBpcyBzZXQsIHRoZVxuICAgIFtjaGFuZ2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5jaGFuZ2VzKSAoaWYgYW55KSBvZiBlYWNoIHNwZWNcbiAgICBhcmUgYXNzdW1lZCB0byBzdGFydCBpbiB0aGUgX2N1cnJlbnRfIGRvY3VtZW50IChub3QgdGhlIGRvY3VtZW50XG4gICAgcHJvZHVjZWQgYnkgcHJldmlvdXMgc3BlY3MpLCBhbmQgaXRzXG4gICAgW3NlbGVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuc2VsZWN0aW9uKSBhbmRcbiAgICBbZWZmZWN0c10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZWZmZWN0cykgYXJlIGFzc3VtZWQgdG8gcmVmZXJcbiAgICB0byB0aGUgZG9jdW1lbnQgY3JlYXRlZCBieSBpdHMgX293bl8gY2hhbmdlcy4gVGhlIHJlc3VsdGluZ1xuICAgIHRyYW5zYWN0aW9uIGNvbnRhaW5zIHRoZSBjb21iaW5lZCBlZmZlY3Qgb2YgYWxsIHRoZSBkaWZmZXJlbnRcbiAgICBzcGVjcy4gRm9yIFtzZWxlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLnNlbGVjdGlvbiksIGxhdGVyXG4gICAgc3BlY3MgdGFrZSBwcmVjZWRlbmNlIG92ZXIgZWFybGllciBvbmVzLlxuICAgICovXG4gICAgdXBkYXRlKC4uLnNwZWNzKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlVHJhbnNhY3Rpb24odGhpcywgc3BlY3MsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFwcGx5VHJhbnNhY3Rpb24odHIpIHtcbiAgICAgICAgbGV0IGNvbmYgPSB0aGlzLmNvbmZpZywgeyBiYXNlLCBjb21wYXJ0bWVudHMgfSA9IGNvbmY7XG4gICAgICAgIGZvciAobGV0IGVmZmVjdCBvZiB0ci5lZmZlY3RzKSB7XG4gICAgICAgICAgICBpZiAoZWZmZWN0LmlzKENvbXBhcnRtZW50LnJlY29uZmlndXJlKSkge1xuICAgICAgICAgICAgICAgIGlmIChjb25mKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhcnRtZW50cyA9IG5ldyBNYXA7XG4gICAgICAgICAgICAgICAgICAgIGNvbmYuY29tcGFydG1lbnRzLmZvckVhY2goKHZhbCwga2V5KSA9PiBjb21wYXJ0bWVudHMuc2V0KGtleSwgdmFsKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmYgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wYXJ0bWVudHMuc2V0KGVmZmVjdC52YWx1ZS5jb21wYXJ0bWVudCwgZWZmZWN0LnZhbHVlLmV4dGVuc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlZmZlY3QuaXMoU3RhdGVFZmZlY3QucmVjb25maWd1cmUpKSB7XG4gICAgICAgICAgICAgICAgY29uZiA9IG51bGw7XG4gICAgICAgICAgICAgICAgYmFzZSA9IGVmZmVjdC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVmZmVjdC5pcyhTdGF0ZUVmZmVjdC5hcHBlbmRDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29uZiA9IG51bGw7XG4gICAgICAgICAgICAgICAgYmFzZSA9IGFzQXJyYXkoYmFzZSkuY29uY2F0KGVmZmVjdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0VmFsdWVzO1xuICAgICAgICBpZiAoIWNvbmYpIHtcbiAgICAgICAgICAgIGNvbmYgPSBDb25maWd1cmF0aW9uLnJlc29sdmUoYmFzZSwgY29tcGFydG1lbnRzLCB0aGlzKTtcbiAgICAgICAgICAgIGxldCBpbnRlcm1lZGlhdGVTdGF0ZSA9IG5ldyBFZGl0b3JTdGF0ZShjb25mLCB0aGlzLmRvYywgdGhpcy5zZWxlY3Rpb24sIGNvbmYuZHluYW1pY1Nsb3RzLm1hcCgoKSA9PiBudWxsKSwgKHN0YXRlLCBzbG90KSA9PiBzbG90LnJlY29uZmlndXJlKHN0YXRlLCB0aGlzKSwgbnVsbCk7XG4gICAgICAgICAgICBzdGFydFZhbHVlcyA9IGludGVybWVkaWF0ZVN0YXRlLnZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0VmFsdWVzID0gdHIuc3RhcnRTdGF0ZS52YWx1ZXMuc2xpY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2VsZWN0aW9uID0gdHIuc3RhcnRTdGF0ZS5mYWNldChhbGxvd011bHRpcGxlU2VsZWN0aW9ucykgPyB0ci5uZXdTZWxlY3Rpb24gOiB0ci5uZXdTZWxlY3Rpb24uYXNTaW5nbGUoKTtcbiAgICAgICAgbmV3IEVkaXRvclN0YXRlKGNvbmYsIHRyLm5ld0RvYywgc2VsZWN0aW9uLCBzdGFydFZhbHVlcywgKHN0YXRlLCBzbG90KSA9PiBzbG90LnVwZGF0ZShzdGF0ZSwgdHIpLCB0cik7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIFt0cmFuc2FjdGlvbiBzcGVjXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYykgdGhhdFxuICAgIHJlcGxhY2VzIGV2ZXJ5IHNlbGVjdGlvbiByYW5nZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50LlxuICAgICovXG4gICAgcmVwbGFjZVNlbGVjdGlvbih0ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdGV4dCA9IHRoaXMudG9UZXh0KHRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2VCeVJhbmdlKHJhbmdlID0+ICh7IGNoYW5nZXM6IHsgZnJvbTogcmFuZ2UuZnJvbSwgdG86IHJhbmdlLnRvLCBpbnNlcnQ6IHRleHQgfSxcbiAgICAgICAgICAgIHJhbmdlOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHJhbmdlLmZyb20gKyB0ZXh0Lmxlbmd0aCkgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgb2YgY2hhbmdlcyBhbmQgYSBuZXcgc2VsZWN0aW9uIGJ5IHJ1bm5pbmcgdGhlIGdpdmVuXG4gICAgZnVuY3Rpb24gZm9yIGVhY2ggcmFuZ2UgaW4gdGhlIGFjdGl2ZSBzZWxlY3Rpb24uIFRoZSBmdW5jdGlvblxuICAgIGNhbiByZXR1cm4gYW4gb3B0aW9uYWwgc2V0IG9mIGNoYW5nZXMgKGluIHRoZSBjb29yZGluYXRlIHNwYWNlXG4gICAgb2YgdGhlIHN0YXJ0IGRvY3VtZW50KSwgcGx1cyBhbiB1cGRhdGVkIHJhbmdlIChpbiB0aGUgY29vcmRpbmF0ZVxuICAgIHNwYWNlIG9mIHRoZSBkb2N1bWVudCBwcm9kdWNlZCBieSB0aGUgY2FsbCdzIG93biBjaGFuZ2VzKS4gVGhpc1xuICAgIG1ldGhvZCB3aWxsIG1lcmdlIGFsbCB0aGUgY2hhbmdlcyBhbmQgcmFuZ2VzIGludG8gYSBzaW5nbGVcbiAgICBjaGFuZ2VzZXQgYW5kIHNlbGVjdGlvbiwgYW5kIHJldHVybiBpdCBhcyBhIFt0cmFuc2FjdGlvblxuICAgIHNwZWNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjKSwgd2hpY2ggY2FuIGJlIHBhc3NlZCB0b1xuICAgIFtgdXBkYXRlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS51cGRhdGUpLlxuICAgICovXG4gICAgY2hhbmdlQnlSYW5nZShmKSB7XG4gICAgICAgIGxldCBzZWwgPSB0aGlzLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0IHJlc3VsdDEgPSBmKHNlbC5yYW5nZXNbMF0pO1xuICAgICAgICBsZXQgY2hhbmdlcyA9IHRoaXMuY2hhbmdlcyhyZXN1bHQxLmNoYW5nZXMpLCByYW5nZXMgPSBbcmVzdWx0MS5yYW5nZV07XG4gICAgICAgIGxldCBlZmZlY3RzID0gYXNBcnJheShyZXN1bHQxLmVmZmVjdHMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBmKHNlbC5yYW5nZXNbaV0pO1xuICAgICAgICAgICAgbGV0IG5ld0NoYW5nZXMgPSB0aGlzLmNoYW5nZXMocmVzdWx0LmNoYW5nZXMpLCBuZXdNYXBwZWQgPSBuZXdDaGFuZ2VzLm1hcChjaGFuZ2VzKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaTsgaisrKVxuICAgICAgICAgICAgICAgIHJhbmdlc1tqXSA9IHJhbmdlc1tqXS5tYXAobmV3TWFwcGVkKTtcbiAgICAgICAgICAgIGxldCBtYXBCeSA9IGNoYW5nZXMubWFwRGVzYyhuZXdDaGFuZ2VzLCB0cnVlKTtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKHJlc3VsdC5yYW5nZS5tYXAobWFwQnkpKTtcbiAgICAgICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzLmNvbXBvc2UobmV3TWFwcGVkKTtcbiAgICAgICAgICAgIGVmZmVjdHMgPSBTdGF0ZUVmZmVjdC5tYXBFZmZlY3RzKGVmZmVjdHMsIG5ld01hcHBlZCkuY29uY2F0KFN0YXRlRWZmZWN0Lm1hcEVmZmVjdHMoYXNBcnJheShyZXN1bHQuZWZmZWN0cyksIG1hcEJ5KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNoYW5nZXMsXG4gICAgICAgICAgICBzZWxlY3Rpb246IEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzLCBzZWwubWFpbkluZGV4KSxcbiAgICAgICAgICAgIGVmZmVjdHNcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgW2NoYW5nZSBzZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuQ2hhbmdlU2V0KSBmcm9tIHRoZSBnaXZlbiBjaGFuZ2VcbiAgICBkZXNjcmlwdGlvbiwgdGFraW5nIHRoZSBzdGF0ZSdzIGRvY3VtZW50IGxlbmd0aCBhbmQgbGluZVxuICAgIHNlcGFyYXRvciBpbnRvIGFjY291bnQuXG4gICAgKi9cbiAgICBjaGFuZ2VzKHNwZWMgPSBbXSkge1xuICAgICAgICBpZiAoc3BlYyBpbnN0YW5jZW9mIENoYW5nZVNldClcbiAgICAgICAgICAgIHJldHVybiBzcGVjO1xuICAgICAgICByZXR1cm4gQ2hhbmdlU2V0Lm9mKHNwZWMsIHRoaXMuZG9jLmxlbmd0aCwgdGhpcy5mYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVzaW5nIHRoZSBzdGF0ZSdzIFtsaW5lXG4gICAgc2VwYXJhdG9yXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXmxpbmVTZXBhcmF0b3IpLCBjcmVhdGUgYVxuICAgIFtgVGV4dGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVGV4dCkgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgICovXG4gICAgdG9UZXh0KHN0cmluZykge1xuICAgICAgICByZXR1cm4gVGV4dC5vZihzdHJpbmcuc3BsaXQodGhpcy5mYWNldChFZGl0b3JTdGF0ZS5saW5lU2VwYXJhdG9yKSB8fCBEZWZhdWx0U3BsaXQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZG9jdW1lbnQgYXMgYSBzdHJpbmcuXG4gICAgKi9cbiAgICBzbGljZURvYyhmcm9tID0gMCwgdG8gPSB0aGlzLmRvYy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvLCB0aGlzLmxpbmVCcmVhayk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdmFsdWUgb2YgYSBzdGF0ZSBbZmFjZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRmFjZXQpLlxuICAgICovXG4gICAgZmFjZXQoZmFjZXQpIHtcbiAgICAgICAgbGV0IGFkZHIgPSB0aGlzLmNvbmZpZy5hZGRyZXNzW2ZhY2V0LmlkXTtcbiAgICAgICAgaWYgKGFkZHIgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWNldC5kZWZhdWx0O1xuICAgICAgICBlbnN1cmVBZGRyKHRoaXMsIGFkZHIpO1xuICAgICAgICByZXR1cm4gZ2V0QWRkcih0aGlzLCBhZGRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGlzIHN0YXRlIHRvIGEgSlNPTi1zZXJpYWxpemFibGUgb2JqZWN0LiBXaGVuIGN1c3RvbVxuICAgIGZpZWxkcyBzaG91bGQgYmUgc2VyaWFsaXplZCwgeW91IGNhbiBwYXNzIHRoZW0gaW4gYXMgYW4gb2JqZWN0XG4gICAgbWFwcGluZyBwcm9wZXJ0eSBuYW1lcyAoaW4gdGhlIHJlc3VsdGluZyBvYmplY3QsIHdoaWNoIHNob3VsZFxuICAgIG5vdCB1c2UgYGRvY2Agb3IgYHNlbGVjdGlvbmApIHRvIGZpZWxkcy5cbiAgICAqL1xuICAgIHRvSlNPTihmaWVsZHMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGRvYzogdGhpcy5zbGljZURvYygpLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvbi50b0pTT04oKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoZmllbGRzKVxuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBmaWVsZHNbcHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RhdGVGaWVsZCAmJiB0aGlzLmNvbmZpZy5hZGRyZXNzW3ZhbHVlLmlkXSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbcHJvcF0gPSB2YWx1ZS5zcGVjLnRvSlNPTih0aGlzLmZpZWxkKGZpZWxkc1twcm9wXSksIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIHN0YXRlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uIFdoZW4gY3VzdG9tXG4gICAgZmllbGRzIHNob3VsZCBiZSBkZXNlcmlhbGl6ZWQsIHBhc3MgdGhlIHNhbWUgb2JqZWN0IHlvdSBwYXNzZWRcbiAgICB0byBbYHRvSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUudG9KU09OKSB3aGVuIHNlcmlhbGl6aW5nIGFzXG4gICAgdGhpcmQgYXJndW1lbnQuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oanNvbiwgY29uZmlnID0ge30sIGZpZWxkcykge1xuICAgICAgICBpZiAoIWpzb24gfHwgdHlwZW9mIGpzb24uZG9jICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRWRpdG9yU3RhdGVcIik7XG4gICAgICAgIGxldCBmaWVsZEluaXQgPSBbXTtcbiAgICAgICAgaWYgKGZpZWxkcylcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChqc29uLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmllbGQgPSBmaWVsZHNbcHJvcF0sIHZhbHVlID0ganNvbltwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRJbml0LnB1c2goZmllbGQuaW5pdChzdGF0ZSA9PiBmaWVsZC5zcGVjLmZyb21KU09OKHZhbHVlLCBzdGF0ZSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBFZGl0b3JTdGF0ZS5jcmVhdGUoe1xuICAgICAgICAgICAgZG9jOiBqc29uLmRvYyxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogRWRpdG9yU2VsZWN0aW9uLmZyb21KU09OKGpzb24uc2VsZWN0aW9uKSxcbiAgICAgICAgICAgIGV4dGVuc2lvbnM6IGNvbmZpZy5leHRlbnNpb25zID8gZmllbGRJbml0LmNvbmNhdChbY29uZmlnLmV4dGVuc2lvbnNdKSA6IGZpZWxkSW5pdFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IHN0YXRlLiBZb3UnbGwgdXN1YWxseSBvbmx5IG5lZWQgdGhpcyB3aGVuXG4gICAgaW5pdGlhbGl6aW5nIGFuIGVkaXRvclx1MjAxNHVwZGF0ZWQgc3RhdGVzIGFyZSBjcmVhdGVkIGJ5IGFwcGx5aW5nXG4gICAgdHJhbnNhY3Rpb25zLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShjb25maWcgPSB7fSkge1xuICAgICAgICBsZXQgY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24ucmVzb2x2ZShjb25maWcuZXh0ZW5zaW9ucyB8fCBbXSwgbmV3IE1hcCk7XG4gICAgICAgIGxldCBkb2MgPSBjb25maWcuZG9jIGluc3RhbmNlb2YgVGV4dCA/IGNvbmZpZy5kb2NcbiAgICAgICAgICAgIDogVGV4dC5vZigoY29uZmlnLmRvYyB8fCBcIlwiKS5zcGxpdChjb25maWd1cmF0aW9uLnN0YXRpY0ZhY2V0KEVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IpIHx8IERlZmF1bHRTcGxpdCkpO1xuICAgICAgICBsZXQgc2VsZWN0aW9uID0gIWNvbmZpZy5zZWxlY3Rpb24gPyBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKDApXG4gICAgICAgICAgICA6IGNvbmZpZy5zZWxlY3Rpb24gaW5zdGFuY2VvZiBFZGl0b3JTZWxlY3Rpb24gPyBjb25maWcuc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgOiBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKGNvbmZpZy5zZWxlY3Rpb24uYW5jaG9yLCBjb25maWcuc2VsZWN0aW9uLmhlYWQpO1xuICAgICAgICBjaGVja1NlbGVjdGlvbihzZWxlY3Rpb24sIGRvYy5sZW5ndGgpO1xuICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb24uc3RhdGljRmFjZXQoYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMpKVxuICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLmFzU2luZ2xlKCk7XG4gICAgICAgIHJldHVybiBuZXcgRWRpdG9yU3RhdGUoY29uZmlndXJhdGlvbiwgZG9jLCBzZWxlY3Rpb24sIGNvbmZpZ3VyYXRpb24uZHluYW1pY1Nsb3RzLm1hcCgoKSA9PiBudWxsKSwgKHN0YXRlLCBzbG90KSA9PiBzbG90LmNyZWF0ZShzdGF0ZSksIG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2l6ZSAoaW4gY29sdW1ucykgb2YgYSB0YWIgaW4gdGhlIGRvY3VtZW50LCBkZXRlcm1pbmVkIGJ5XG4gICAgdGhlIFtgdGFiU2l6ZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVedGFiU2l6ZSkgZmFjZXQuXG4gICAgKi9cbiAgICBnZXQgdGFiU2l6ZSgpIHsgcmV0dXJuIHRoaXMuZmFjZXQoRWRpdG9yU3RhdGUudGFiU2l6ZSk7IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHByb3BlciBbbGluZS1icmVha10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5saW5lU2VwYXJhdG9yKVxuICAgIHN0cmluZyBmb3IgdGhpcyBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCBsaW5lQnJlYWsoKSB7IHJldHVybiB0aGlzLmZhY2V0KEVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IpIHx8IFwiXFxuXCI7IH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZWRpdG9yIGlzXG4gICAgW2NvbmZpZ3VyZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVecmVhZE9ubHkpIHRvIGJlIHJlYWQtb25seS5cbiAgICAqL1xuICAgIGdldCByZWFkT25seSgpIHsgcmV0dXJuIHRoaXMuZmFjZXQocmVhZE9ubHkpOyB9XG4gICAgLyoqXG4gICAgTG9vayB1cCBhIHRyYW5zbGF0aW9uIGZvciB0aGUgZ2l2ZW4gcGhyYXNlICh2aWEgdGhlXG4gICAgW2BwaHJhc2VzYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV5waHJhc2VzKSBmYWNldCksIG9yIHJldHVybiB0aGVcbiAgICBvcmlnaW5hbCBzdHJpbmcgaWYgbm8gdHJhbnNsYXRpb24gaXMgZm91bmQuXG4gICAgXG4gICAgSWYgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHBhc3NlZCwgdGhleSB3aWxsIGJlIGluc2VydGVkIGluXG4gICAgcGxhY2Ugb2YgbWFya2VycyBsaWtlIGAkMWAgKGZvciB0aGUgZmlyc3QgdmFsdWUpIGFuZCBgJDJgLCBldGMuXG4gICAgQSBzaW5nbGUgYCRgIGlzIGVxdWl2YWxlbnQgdG8gYCQxYCwgYW5kIGAkJGAgd2lsbCBwcm9kdWNlIGFcbiAgICBsaXRlcmFsIGRvbGxhciBzaWduLlxuICAgICovXG4gICAgcGhyYXNlKHBocmFzZSwgLi4uaW5zZXJ0KSB7XG4gICAgICAgIGZvciAobGV0IG1hcCBvZiB0aGlzLmZhY2V0KEVkaXRvclN0YXRlLnBocmFzZXMpKVxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtYXAsIHBocmFzZSkpIHtcbiAgICAgICAgICAgICAgICBwaHJhc2UgPSBtYXBbcGhyYXNlXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGluc2VydC5sZW5ndGgpXG4gICAgICAgICAgICBwaHJhc2UgPSBwaHJhc2UucmVwbGFjZSgvXFwkKFxcJHxcXGQqKS9nLCAobSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpID09IFwiJFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIkXCI7XG4gICAgICAgICAgICAgICAgbGV0IG4gPSArKGkgfHwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFuIHx8IG4gPiBpbnNlcnQubGVuZ3RoID8gbSA6IGluc2VydFtuIC0gMV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBocmFzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgdmFsdWVzIGZvciBhIGdpdmVuIGxhbmd1YWdlIGRhdGEgZmllbGQsIHByb3ZpZGVkIGJ5IHRoZVxuICAgIHRoZSBbYGxhbmd1YWdlRGF0YWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVebGFuZ3VhZ2VEYXRhKSBmYWNldC5cbiAgICBcbiAgICBFeGFtcGxlcyBvZiBsYW5ndWFnZSBkYXRhIGZpZWxkcyBhcmUuLi5cbiAgICBcbiAgICAtIFtgXCJjb21tZW50VG9rZW5zXCJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2NvbW1hbmRzLkNvbW1lbnRUb2tlbnMpIGZvciBzcGVjaWZ5aW5nXG4gICAgICBjb21tZW50IHN5bnRheC5cbiAgICAtIFtgXCJhdXRvY29tcGxldGVcImBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jYXV0b2NvbXBsZXRlLmF1dG9jb21wbGV0aW9uXmNvbmZpZy5vdmVycmlkZSlcbiAgICAgIGZvciBwcm92aWRpbmcgbGFuZ3VhZ2Utc3BlY2lmaWMgY29tcGxldGlvbiBzb3VyY2VzLlxuICAgIC0gW2BcIndvcmRDaGFyc1wiYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIpIGZvciBhZGRpbmdcbiAgICAgIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgYmUgY29uc2lkZXJlZCBwYXJ0IG9mIHdvcmRzIGluIHRoaXNcbiAgICAgIGxhbmd1YWdlLlxuICAgIC0gW2BcImNsb3NlQnJhY2tldHNcImBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jYXV0b2NvbXBsZXRlLkNsb3NlQnJhY2tldENvbmZpZykgY29udHJvbHNcbiAgICAgIGJyYWNrZXQgY2xvc2luZyBiZWhhdmlvci5cbiAgICAqL1xuICAgIGxhbmd1YWdlRGF0YUF0KG5hbWUsIHBvcywgc2lkZSA9IC0xKSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcHJvdmlkZXIgb2YgdGhpcy5mYWNldChsYW5ndWFnZURhdGEpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByZXN1bHQgb2YgcHJvdmlkZXIodGhpcywgcG9zLCBzaWRlKSkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBuYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2gocmVzdWx0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBjYXRlZ29yaXplIHN0cmluZ3MgKGV4cGVjdGVkIHRvXG4gICAgcmVwcmVzZW50IGEgc2luZ2xlIFtncmFwaGVtZSBjbHVzdGVyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLmZpbmRDbHVzdGVyQnJlYWspKVxuICAgIGludG8gb25lIG9mOlxuICAgIFxuICAgICAtIFdvcmQgKGNvbnRhaW5zIGFuIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXIgb3IgYSBjaGFyYWN0ZXJcbiAgICAgICBleHBsaWNpdGx5IGxpc3RlZCBpbiB0aGUgbG9jYWwgbGFuZ3VhZ2UncyBgXCJ3b3JkQ2hhcnNcImBcbiAgICAgICBsYW5ndWFnZSBkYXRhLCB3aGljaCBzaG91bGQgYmUgYSBzdHJpbmcpXG4gICAgIC0gU3BhY2UgKGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZSlcbiAgICAgLSBPdGhlciAoYW55dGhpbmcgZWxzZSlcbiAgICAqL1xuICAgIGNoYXJDYXRlZ29yaXplcihhdCkge1xuICAgICAgICByZXR1cm4gbWFrZUNhdGVnb3JpemVyKHRoaXMubGFuZ3VhZ2VEYXRhQXQoXCJ3b3JkQ2hhcnNcIiwgYXQpLmpvaW4oXCJcIikpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSB3b3JkIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgbWVhbmluZyB0aGUgcmFuZ2VcbiAgICBjb250YWluaW5nIGFsbCBbd29yZF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5DaGFyQ2F0ZWdvcnkuV29yZCkgY2hhcmFjdGVyc1xuICAgIGFyb3VuZCBpdC4gSWYgbm8gd29yZCBjaGFyYWN0ZXJzIGFyZSBhZGphY2VudCB0byB0aGUgcG9zaXRpb24sXG4gICAgdGhpcyByZXR1cm5zIG51bGwuXG4gICAgKi9cbiAgICB3b3JkQXQocG9zKSB7XG4gICAgICAgIGxldCB7IHRleHQsIGZyb20sIGxlbmd0aCB9ID0gdGhpcy5kb2MubGluZUF0KHBvcyk7XG4gICAgICAgIGxldCBjYXQgPSB0aGlzLmNoYXJDYXRlZ29yaXplcihwb3MpO1xuICAgICAgICBsZXQgc3RhcnQgPSBwb3MgLSBmcm9tLCBlbmQgPSBwb3MgLSBmcm9tO1xuICAgICAgICB3aGlsZSAoc3RhcnQgPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IGZpbmRDbHVzdGVyQnJlYWsodGV4dCwgc3RhcnQsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChjYXQodGV4dC5zbGljZShwcmV2LCBzdGFydCkpICE9IENoYXJDYXRlZ29yeS5Xb3JkKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgc3RhcnQgPSBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChlbmQgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZmluZENsdXN0ZXJCcmVhayh0ZXh0LCBlbmQpO1xuICAgICAgICAgICAgaWYgKGNhdCh0ZXh0LnNsaWNlKGVuZCwgbmV4dCkpICE9IENoYXJDYXRlZ29yeS5Xb3JkKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZW5kID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhcnQgPT0gZW5kID8gbnVsbCA6IEVkaXRvclNlbGVjdGlvbi5yYW5nZShzdGFydCArIGZyb20sIGVuZCArIGZyb20pO1xuICAgIH1cbn1cbi8qKlxuQSBmYWNldCB0aGF0LCB3aGVuIGVuYWJsZWQsIGNhdXNlcyB0aGUgZWRpdG9yIHRvIGFsbG93IG11bHRpcGxlXG5yYW5nZXMgdG8gYmUgc2VsZWN0ZWQuIEJlIGNhcmVmdWwgdGhvdWdoLCBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlXG5lZGl0b3IgcmVsaWVzIG9uIHRoZSBuYXRpdmUgRE9NIHNlbGVjdGlvbiwgd2hpY2ggY2Fubm90IGhhbmRsZVxubXVsdGlwbGUgc2VsZWN0aW9ucy4gQW4gZXh0ZW5zaW9uIGxpa2VcbltgZHJhd1NlbGVjdGlvbmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5kcmF3U2VsZWN0aW9uKSBjYW4gYmUgdXNlZCB0byBtYWtlXG5zZWNvbmRhcnkgc2VsZWN0aW9ucyB2aXNpYmxlIHRvIHRoZSB1c2VyLlxuKi9cbkVkaXRvclN0YXRlLmFsbG93TXVsdGlwbGVTZWxlY3Rpb25zID0gYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnM7XG4vKipcbkNvbmZpZ3VyZXMgdGhlIHRhYiBzaXplIHRvIHVzZSBpbiB0aGlzIHN0YXRlLiBUaGUgZmlyc3RcbihoaWdoZXN0LXByZWNlZGVuY2UpIHZhbHVlIG9mIHRoZSBmYWNldCBpcyB1c2VkLiBJZiBubyB2YWx1ZSBpc1xuZ2l2ZW4sIHRoaXMgZGVmYXVsdHMgdG8gNC5cbiovXG5FZGl0b3JTdGF0ZS50YWJTaXplID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5sZW5ndGggPyB2YWx1ZXNbMF0gOiA0XG59KTtcbi8qKlxuVGhlIGxpbmUgc2VwYXJhdG9yIHRvIHVzZS4gQnkgZGVmYXVsdCwgYW55IG9mIGBcIlxcblwiYCwgYFwiXFxyXFxuXCJgXG5hbmQgYFwiXFxyXCJgIGlzIHRyZWF0ZWQgYXMgYSBzZXBhcmF0b3Igd2hlbiBzcGxpdHRpbmcgbGluZXMsIGFuZFxubGluZXMgYXJlIGpvaW5lZCB3aXRoIGBcIlxcblwiYC5cblxuV2hlbiB5b3UgY29uZmlndXJlIGEgdmFsdWUgaGVyZSwgb25seSB0aGF0IHByZWNpc2Ugc2VwYXJhdG9yXG53aWxsIGJlIHVzZWQsIGFsbG93aW5nIHlvdSB0byByb3VuZC10cmlwIGRvY3VtZW50cyB0aHJvdWdoIHRoZVxuZWRpdG9yIHdpdGhvdXQgbm9ybWFsaXppbmcgbGluZSBzZXBhcmF0b3JzLlxuKi9cbkVkaXRvclN0YXRlLmxpbmVTZXBhcmF0b3IgPSBsaW5lU2VwYXJhdG9yO1xuLyoqXG5UaGlzIGZhY2V0IGNvbnRyb2xzIHRoZSB2YWx1ZSBvZiB0aGVcbltgcmVhZE9ubHlgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnJlYWRPbmx5KSBnZXR0ZXIsIHdoaWNoIGlzXG5jb25zdWx0ZWQgYnkgY29tbWFuZHMgYW5kIGV4dGVuc2lvbnMgdGhhdCBpbXBsZW1lbnQgZWRpdGluZ1xuZnVuY3Rpb25hbGl0eSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGV5IHNob3VsZCBhcHBseS4gSXRcbmRlZmF1bHRzIHRvIGZhbHNlLCBidXQgd2hlbiBpdHMgaGlnaGVzdC1wcmVjZWRlbmNlIHZhbHVlIGlzXG5gdHJ1ZWAsIHN1Y2ggZnVuY3Rpb25hbGl0eSBkaXNhYmxlcyBpdHNlbGYuXG5cbk5vdCB0byBiZSBjb25mdXNlZCB3aXRoXG5bYEVkaXRvclZpZXcuZWRpdGFibGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15lZGl0YWJsZSksIHdoaWNoXG5jb250cm9scyB3aGV0aGVyIHRoZSBlZGl0b3IncyBET00gaXMgc2V0IHRvIGJlIGVkaXRhYmxlIChhbmRcbnRodXMgZm9jdXNhYmxlKS5cbiovXG5FZGl0b3JTdGF0ZS5yZWFkT25seSA9IHJlYWRPbmx5O1xuLyoqXG5SZWdpc3RlcnMgdHJhbnNsYXRpb24gcGhyYXNlcy4gVGhlXG5bYHBocmFzZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUucGhyYXNlKSBtZXRob2Qgd2lsbCBsb29rIHRocm91Z2hcbmFsbCBvYmplY3RzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGZhY2V0IHRvIGZpbmQgdHJhbnNsYXRpb25zIGZvclxuaXRzIGFyZ3VtZW50LlxuKi9cbkVkaXRvclN0YXRlLnBocmFzZXMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21wYXJlKGEsIGIpIHtcbiAgICAgICAgbGV0IGtBID0gT2JqZWN0LmtleXMoYSksIGtCID0gT2JqZWN0LmtleXMoYik7XG4gICAgICAgIHJldHVybiBrQS5sZW5ndGggPT0ga0IubGVuZ3RoICYmIGtBLmV2ZXJ5KGsgPT4gYVtrXSA9PSBiW2tdKTtcbiAgICB9XG59KTtcbi8qKlxuQSBmYWNldCB1c2VkIHRvIHJlZ2lzdGVyIFtsYW5ndWFnZVxuZGF0YV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGFBdCkgcHJvdmlkZXJzLlxuKi9cbkVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YSA9IGxhbmd1YWdlRGF0YTtcbi8qKlxuRmFjZXQgdXNlZCB0byByZWdpc3RlciBjaGFuZ2UgZmlsdGVycywgd2hpY2ggYXJlIGNhbGxlZCBmb3IgZWFjaFxudHJhbnNhY3Rpb24gKHVubGVzcyBleHBsaWNpdGx5XG5bZGlzYWJsZWRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmZpbHRlcikpLCBhbmQgY2FuIHN1cHByZXNzXG5wYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbidzIGNoYW5nZXMuXG5cblN1Y2ggYSBmdW5jdGlvbiBjYW4gcmV0dXJuIGB0cnVlYCB0byBpbmRpY2F0ZSB0aGF0IGl0IGRvZXNuJ3RcbndhbnQgdG8gZG8gYW55dGhpbmcsIGBmYWxzZWAgdG8gY29tcGxldGVseSBzdG9wIHRoZSBjaGFuZ2VzIGluXG50aGUgdHJhbnNhY3Rpb24sIG9yIGEgc2V0IG9mIHJhbmdlcyBpbiB3aGljaCBjaGFuZ2VzIHNob3VsZCBiZVxuc3VwcHJlc3NlZC4gU3VjaCByYW5nZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIG51bWJlcnMsXG53aXRoIGVhY2ggcGFpciBvZiB0d28gbnVtYmVycyBpbmRpY2F0aW5nIHRoZSBzdGFydCBhbmQgZW5kIG9mIGFcbnJhbmdlLiBTbyBmb3IgZXhhbXBsZSBgWzEwLCAyMCwgMTAwLCAxMTBdYCBzdXBwcmVzc2VzIGNoYW5nZXNcbmJldHdlZW4gMTAgYW5kIDIwLCBhbmQgYmV0d2VlbiAxMDAgYW5kIDExMC5cbiovXG5FZGl0b3JTdGF0ZS5jaGFuZ2VGaWx0ZXIgPSBjaGFuZ2VGaWx0ZXI7XG4vKipcbkZhY2V0IHVzZWQgdG8gcmVnaXN0ZXIgYSBob29rIHRoYXQgZ2V0cyBhIGNoYW5jZSB0byB1cGRhdGUgb3JcbnJlcGxhY2UgdHJhbnNhY3Rpb24gc3BlY3MgYmVmb3JlIHRoZXkgYXJlIGFwcGxpZWQuIFRoaXMgd2lsbFxub25seSBiZSBhcHBsaWVkIGZvciB0cmFuc2FjdGlvbnMgdGhhdCBkb24ndCBoYXZlXG5bYGZpbHRlcmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLmZpbHRlcikgc2V0IHRvIGBmYWxzZWAuIFlvdVxuY2FuIGVpdGhlciByZXR1cm4gYSBzaW5nbGUgdHJhbnNhY3Rpb24gc3BlYyAocG9zc2libHkgdGhlIGlucHV0XG50cmFuc2FjdGlvbiksIG9yIGFuIGFycmF5IG9mIHNwZWNzICh3aGljaCB3aWxsIGJlIGNvbWJpbmVkIGluXG50aGUgc2FtZSB3YXkgYXMgdGhlIGFyZ3VtZW50cyB0b1xuW2BFZGl0b3JTdGF0ZS51cGRhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnVwZGF0ZSkpLlxuXG5XaGVuIHBvc3NpYmxlLCBpdCBpcyByZWNvbW1lbmRlZCB0byBhdm9pZCBhY2Nlc3NpbmdcbltgVHJhbnNhY3Rpb24uc3RhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLnN0YXRlKSBpbiBhIGZpbHRlcixcbnNpbmNlIGl0IHdpbGwgZm9yY2UgY3JlYXRpb24gb2YgYSBzdGF0ZSB0aGF0IHdpbGwgdGhlbiBiZVxuZGlzY2FyZGVkIGFnYWluLCBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgYWN0dWFsbHkgZmlsdGVyZWQuXG5cbihUaGlzIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlLiBJbmRpc2NyaW1pbmF0ZWx5XG5tb2RpZnlpbmcgdHJhbnNhY3Rpb24gaXMgbGlrZWx5IHRvIGJyZWFrIHNvbWV0aGluZyBvciBkZWdyYWRlXG50aGUgdXNlciBleHBlcmllbmNlLilcbiovXG5FZGl0b3JTdGF0ZS50cmFuc2FjdGlvbkZpbHRlciA9IHRyYW5zYWN0aW9uRmlsdGVyO1xuLyoqXG5UaGlzIGlzIGEgbW9yZSBsaW1pdGVkIGZvcm0gb2ZcbltgdHJhbnNhY3Rpb25GaWx0ZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlXnRyYW5zYWN0aW9uRmlsdGVyKSxcbndoaWNoIGNhbiBvbmx5IGFkZFxuW2Fubm90YXRpb25zXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5hbm5vdGF0aW9ucykgYW5kXG5bZWZmZWN0c10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvblNwZWMuZWZmZWN0cykuIF9CdXRfLCB0aGlzIHR5cGVcbm9mIGZpbHRlciBydW5zIGV2ZW4gaWYgdGhlIHRyYW5zYWN0aW9uIGhhcyBkaXNhYmxlZCByZWd1bGFyXG5bZmlsdGVyaW5nXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5maWx0ZXIpLCBtYWtpbmcgaXQgc3VpdGFibGVcbmZvciBlZmZlY3RzIHRoYXQgZG9uJ3QgbmVlZCB0byB0b3VjaCB0aGUgY2hhbmdlcyBvciBzZWxlY3Rpb24sXG5idXQgZG8gd2FudCB0byBwcm9jZXNzIGV2ZXJ5IHRyYW5zYWN0aW9uLlxuXG5FeHRlbmRlcnMgcnVuIF9hZnRlcl8gZmlsdGVycywgd2hlbiBib3RoIGFyZSBwcmVzZW50LlxuKi9cbkVkaXRvclN0YXRlLnRyYW5zYWN0aW9uRXh0ZW5kZXIgPSB0cmFuc2FjdGlvbkV4dGVuZGVyO1xuQ29tcGFydG1lbnQucmVjb25maWd1cmUgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG5cbi8qKlxuVXRpbGl0eSBmdW5jdGlvbiBmb3IgY29tYmluaW5nIGJlaGF2aW9ycyB0byBmaWxsIGluIGEgY29uZmlnXG5vYmplY3QgZnJvbSBhbiBhcnJheSBvZiBwcm92aWRlZCBjb25maWdzLiBgZGVmYXVsdHNgIHNob3VsZCBob2xkXG5kZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcyBpbiBgQ29uZmlnYC5cblxuVGhlIGZ1bmN0aW9uIHdpbGwsIGJ5IGRlZmF1bHQsIGVycm9yXG53aGVuIGEgZmllbGQgZ2V0cyB0d28gdmFsdWVzIHRoYXQgYXJlbid0IGA9PT1gLWVxdWFsLCBidXQgeW91IGNhblxucHJvdmlkZSBjb21iaW5lIGZ1bmN0aW9ucyBwZXIgZmllbGQgdG8gZG8gc29tZXRoaW5nIGVsc2UuXG4qL1xuZnVuY3Rpb24gY29tYmluZUNvbmZpZyhjb25maWdzLCBkZWZhdWx0cywgLy8gU2hvdWxkIGhvbGQgb25seSB0aGUgb3B0aW9uYWwgcHJvcGVydGllcyBvZiBDb25maWcsIGJ1dCBJIGhhdmVuJ3QgbWFuYWdlZCB0byBleHByZXNzIHRoYXRcbmNvbWJpbmUgPSB7fSkge1xuICAgIGxldCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGxldCBjb25maWcgb2YgY29uZmlncylcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGNvbmZpZ1trZXldLCBjdXJyZW50ID0gcmVzdWx0W2tleV07XG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50ID09PSB2YWx1ZSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA7IC8vIE5vIGNvbmZsaWN0XG4gICAgICAgICAgICBlbHNlIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChjb21iaW5lLCBrZXkpKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gY29tYmluZVtrZXldKGN1cnJlbnQsIHZhbHVlKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25maWcgbWVyZ2UgY29uZmxpY3QgZm9yIGZpZWxkIFwiICsga2V5KTtcbiAgICAgICAgfVxuICAgIGZvciAobGV0IGtleSBpbiBkZWZhdWx0cylcbiAgICAgICAgaWYgKHJlc3VsdFtrZXldID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IGRlZmF1bHRzW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG5FYWNoIHJhbmdlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHZhbHVlLCB3aGljaCBtdXN0IGluaGVyaXQgZnJvbVxudGhpcyBjbGFzcy5cbiovXG5jbGFzcyBSYW5nZVZhbHVlIHtcbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgdmFsdWUgd2l0aCBhbm90aGVyIHZhbHVlLiBVc2VkIHdoZW4gY29tcGFyaW5nXG4gICAgcmFuZ2VzZXRzLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjb21wYXJlcyBieSBpZGVudGl0eS5cbiAgICBVbmxlc3MgeW91IGFyZSBvbmx5IGNyZWF0aW5nIGEgZml4ZWQgbnVtYmVyIG9mIHVuaXF1ZSBpbnN0YW5jZXNcbiAgICBvZiB5b3VyIHZhbHVlIHR5cGUsIGl0IGlzIGEgZ29vZCBpZGVhIHRvIGltcGxlbWVudCB0aGlzXG4gICAgcHJvcGVybHkuXG4gICAgKi9cbiAgICBlcShvdGhlcikgeyByZXR1cm4gdGhpcyA9PSBvdGhlcjsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIFtyYW5nZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5SYW5nZSkgd2l0aCB0aGlzIHZhbHVlLlxuICAgICovXG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7IHJldHVybiBSYW5nZS5jcmVhdGUoZnJvbSwgdG8sIHRoaXMpOyB9XG59XG5SYW5nZVZhbHVlLnByb3RvdHlwZS5zdGFydFNpZGUgPSBSYW5nZVZhbHVlLnByb3RvdHlwZS5lbmRTaWRlID0gMDtcblJhbmdlVmFsdWUucHJvdG90eXBlLnBvaW50ID0gZmFsc2U7XG5SYW5nZVZhbHVlLnByb3RvdHlwZS5tYXBNb2RlID0gTWFwTW9kZS5UcmFja0RlbDtcbi8qKlxuQSByYW5nZSBhc3NvY2lhdGVzIGEgdmFsdWUgd2l0aCBhIHJhbmdlIG9mIHBvc2l0aW9ucy5cbiovXG5jbGFzcyBSYW5nZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHJhbmdlJ3Mgc3RhcnQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBJdHMgZW5kIHBvc2l0aW9uLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByYW5nZS5cbiAgICAqL1xuICAgIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZnJvbSwgdG8sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UoZnJvbSwgdG8sIHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbXBSYW5nZShhLCBiKSB7XG4gICAgcmV0dXJuIGEuZnJvbSAtIGIuZnJvbSB8fCBhLnZhbHVlLnN0YXJ0U2lkZSAtIGIudmFsdWUuc3RhcnRTaWRlO1xufVxuY2xhc3MgQ2h1bmsge1xuICAgIGNvbnN0cnVjdG9yKGZyb20sIHRvLCB2YWx1ZSwgXG4gICAgLy8gQ2h1bmtzIGFyZSBtYXJrZWQgd2l0aCB0aGUgbGFyZ2VzdCBwb2ludCB0aGF0IG9jY3Vyc1xuICAgIC8vIGluIHRoZW0gKG9yIC0xIGZvciBubyBwb2ludHMpLCBzbyB0aGF0IHNjYW5zIHRoYXQgYXJlXG4gICAgLy8gb25seSBpbnRlcmVzdGVkIGluIHBvaW50cyAoc3VjaCBhcyB0aGVcbiAgICAvLyBoZWlnaHRtYXAtcmVsYXRlZCBsb2dpYykgY2FuIHNraXAgcmFuZ2Utb25seSBjaHVua3MuXG4gICAgbWF4UG9pbnQpIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSBtYXhQb2ludDtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMudG9bdGhpcy50by5sZW5ndGggLSAxXTsgfVxuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgc2lkZS4gVXNlIHRoZSByYW5nZXMnXG4gICAgLy8gYGZyb21gIHBvcyB3aGVuIGBlbmQgPT0gZmFsc2VgLCBgdG9gIHdoZW4gYGVuZCA9PSB0cnVlYC5cbiAgICBmaW5kSW5kZXgocG9zLCBzaWRlLCBlbmQsIHN0YXJ0QXQgPSAwKSB7XG4gICAgICAgIGxldCBhcnIgPSBlbmQgPyB0aGlzLnRvIDogdGhpcy5mcm9tO1xuICAgICAgICBmb3IgKGxldCBsbyA9IHN0YXJ0QXQsIGhpID0gYXJyLmxlbmd0aDs7KSB7XG4gICAgICAgICAgICBpZiAobG8gPT0gaGkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvO1xuICAgICAgICAgICAgbGV0IG1pZCA9IChsbyArIGhpKSA+PiAxO1xuICAgICAgICAgICAgbGV0IGRpZmYgPSBhcnJbbWlkXSAtIHBvcyB8fCAoZW5kID8gdGhpcy52YWx1ZVttaWRdLmVuZFNpZGUgOiB0aGlzLnZhbHVlW21pZF0uc3RhcnRTaWRlKSAtIHNpZGU7XG4gICAgICAgICAgICBpZiAobWlkID09IGxvKVxuICAgICAgICAgICAgICAgIHJldHVybiBkaWZmID49IDAgPyBsbyA6IGhpO1xuICAgICAgICAgICAgaWYgKGRpZmYgPj0gMClcbiAgICAgICAgICAgICAgICBoaSA9IG1pZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBsbyA9IG1pZCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmV0d2VlbihvZmZzZXQsIGZyb20sIHRvLCBmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmZpbmRJbmRleChmcm9tLCAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLywgdHJ1ZSksIGUgPSB0aGlzLmZpbmRJbmRleCh0bywgMTAwMDAwMDAwMCAvKiBDLkZhciAqLywgZmFsc2UsIGkpOyBpIDwgZTsgaSsrKVxuICAgICAgICAgICAgaWYgKGYodGhpcy5mcm9tW2ldICsgb2Zmc2V0LCB0aGlzLnRvW2ldICsgb2Zmc2V0LCB0aGlzLnZhbHVlW2ldKSA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBtYXAob2Zmc2V0LCBjaGFuZ2VzKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IFtdLCBmcm9tID0gW10sIHRvID0gW10sIG5ld1BvcyA9IC0xLCBtYXhQb2ludCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSB0aGlzLnZhbHVlW2ldLCBjdXJGcm9tID0gdGhpcy5mcm9tW2ldICsgb2Zmc2V0LCBjdXJUbyA9IHRoaXMudG9baV0gKyBvZmZzZXQsIG5ld0Zyb20sIG5ld1RvO1xuICAgICAgICAgICAgaWYgKGN1ckZyb20gPT0gY3VyVG8pIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFwcGVkID0gY2hhbmdlcy5tYXBQb3MoY3VyRnJvbSwgdmFsLnN0YXJ0U2lkZSwgdmFsLm1hcE1vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChtYXBwZWQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgbmV3RnJvbSA9IG5ld1RvID0gbWFwcGVkO1xuICAgICAgICAgICAgICAgIGlmICh2YWwuc3RhcnRTaWRlICE9IHZhbC5lbmRTaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1RvID0gY2hhbmdlcy5tYXBQb3MoY3VyRnJvbSwgdmFsLmVuZFNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3VG8gPCBuZXdGcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3RnJvbSA9IGNoYW5nZXMubWFwUG9zKGN1ckZyb20sIHZhbC5zdGFydFNpZGUpO1xuICAgICAgICAgICAgICAgIG5ld1RvID0gY2hhbmdlcy5tYXBQb3MoY3VyVG8sIHZhbC5lbmRTaWRlKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3RnJvbSA+IG5ld1RvIHx8IG5ld0Zyb20gPT0gbmV3VG8gJiYgdmFsLnN0YXJ0U2lkZSA+IDAgJiYgdmFsLmVuZFNpZGUgPD0gMClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG5ld1RvIC0gbmV3RnJvbSB8fCB2YWwuZW5kU2lkZSAtIHZhbC5zdGFydFNpZGUpIDwgMClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChuZXdQb3MgPCAwKVxuICAgICAgICAgICAgICAgIG5ld1BvcyA9IG5ld0Zyb207XG4gICAgICAgICAgICBpZiAodmFsLnBvaW50KVxuICAgICAgICAgICAgICAgIG1heFBvaW50ID0gTWF0aC5tYXgobWF4UG9pbnQsIG5ld1RvIC0gbmV3RnJvbSk7XG4gICAgICAgICAgICB2YWx1ZS5wdXNoKHZhbCk7XG4gICAgICAgICAgICBmcm9tLnB1c2gobmV3RnJvbSAtIG5ld1Bvcyk7XG4gICAgICAgICAgICB0by5wdXNoKG5ld1RvIC0gbmV3UG9zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtYXBwZWQ6IHZhbHVlLmxlbmd0aCA/IG5ldyBDaHVuayhmcm9tLCB0bywgdmFsdWUsIG1heFBvaW50KSA6IG51bGwsIHBvczogbmV3UG9zIH07XG4gICAgfVxufVxuLyoqXG5BIHJhbmdlIHNldCBzdG9yZXMgYSBjb2xsZWN0aW9uIG9mIFtyYW5nZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpIGluIGFcbndheSB0aGF0IG1ha2VzIHRoZW0gZWZmaWNpZW50IHRvIFttYXBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2VTZXQubWFwKSBhbmRcblt1cGRhdGVdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2VTZXQudXBkYXRlKS4gVGhpcyBpcyBhbiBpbW11dGFibGUgZGF0YVxuc3RydWN0dXJlLlxuKi9cbmNsYXNzIFJhbmdlU2V0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNodW5rUG9zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNodW5rLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG5leHRMYXllciwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXhQb2ludCkge1xuICAgICAgICB0aGlzLmNodW5rUG9zID0gY2h1bmtQb3M7XG4gICAgICAgIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgICAgICAgdGhpcy5uZXh0TGF5ZXIgPSBuZXh0TGF5ZXI7XG4gICAgICAgIHRoaXMubWF4UG9pbnQgPSBtYXhQb2ludDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGNodW5rUG9zLCBjaHVuaywgbmV4dExheWVyLCBtYXhQb2ludCkge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlU2V0KGNodW5rUG9zLCBjaHVuaywgbmV4dExheWVyLCBtYXhQb2ludCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNodW5rLmxlbmd0aCAtIDE7XG4gICAgICAgIHJldHVybiBsYXN0IDwgMCA/IDAgOiBNYXRoLm1heCh0aGlzLmNodW5rRW5kKGxhc3QpLCB0aGlzLm5leHRMYXllci5sZW5ndGgpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbnVtYmVyIG9mIHJhbmdlcyBpbiB0aGUgc2V0LlxuICAgICovXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgbGV0IHNpemUgPSB0aGlzLm5leHRMYXllci5zaXplO1xuICAgICAgICBmb3IgKGxldCBjaHVuayBvZiB0aGlzLmNodW5rKVxuICAgICAgICAgICAgc2l6ZSArPSBjaHVuay52YWx1ZS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNodW5rRW5kKGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNodW5rUG9zW2luZGV4XSArIHRoaXMuY2h1bmtbaW5kZXhdLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSByYW5nZSBzZXQsIG9wdGlvbmFsbHkgYWRkaW5nIG5ldyByYW5nZXMgb3IgZmlsdGVyaW5nXG4gICAgb3V0IGV4aXN0aW5nIG9uZXMuXG4gICAgXG4gICAgKE5vdGU6IFRoZSB0eXBlIHBhcmFtZXRlciBpcyBqdXN0IHRoZXJlIGFzIGEga2x1ZGdlIHRvIHdvcmtcbiAgICBhcm91bmQgVHlwZVNjcmlwdCB2YXJpYW5jZSBpc3N1ZXMgdGhhdCBwcmV2ZW50ZWQgYFJhbmdlU2V0PFg+YFxuICAgIGZyb20gYmVpbmcgYSBzdWJ0eXBlIG9mIGBSYW5nZVNldDxZPmAgd2hlbiBgWGAgaXMgYSBzdWJ0eXBlIG9mXG4gICAgYFlgLilcbiAgICAqL1xuICAgIHVwZGF0ZSh1cGRhdGVTcGVjKSB7XG4gICAgICAgIGxldCB7IGFkZCA9IFtdLCBzb3J0ID0gZmFsc2UsIGZpbHRlckZyb20gPSAwLCBmaWx0ZXJUbyA9IHRoaXMubGVuZ3RoIH0gPSB1cGRhdGVTcGVjO1xuICAgICAgICBsZXQgZmlsdGVyID0gdXBkYXRlU3BlYy5maWx0ZXI7XG4gICAgICAgIGlmIChhZGQubGVuZ3RoID09IDAgJiYgIWZpbHRlcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBpZiAoc29ydClcbiAgICAgICAgICAgIGFkZCA9IGFkZC5zbGljZSgpLnNvcnQoY21wUmFuZ2UpO1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIGFkZC5sZW5ndGggPyBSYW5nZVNldC5vZihhZGQpIDogdGhpcztcbiAgICAgICAgbGV0IGN1ciA9IG5ldyBMYXllckN1cnNvcih0aGlzLCBudWxsLCAtMSkuZ290bygwKSwgaSA9IDAsIHNwaWxsID0gW107XG4gICAgICAgIGxldCBidWlsZGVyID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgICAgICB3aGlsZSAoY3VyLnZhbHVlIHx8IGkgPCBhZGQubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaSA8IGFkZC5sZW5ndGggJiYgKGN1ci5mcm9tIC0gYWRkW2ldLmZyb20gfHwgY3VyLnN0YXJ0U2lkZSAtIGFkZFtpXS52YWx1ZS5zdGFydFNpZGUpID49IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSBhZGRbaSsrXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJ1aWxkZXIuYWRkSW5uZXIocmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHJhbmdlLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgc3BpbGwucHVzaChyYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXIucmFuZ2VJbmRleCA9PSAxICYmIGN1ci5jaHVua0luZGV4IDwgdGhpcy5jaHVuay5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAoaSA9PSBhZGQubGVuZ3RoIHx8IHRoaXMuY2h1bmtFbmQoY3VyLmNodW5rSW5kZXgpIDwgYWRkW2ldLmZyb20pICYmXG4gICAgICAgICAgICAgICAgKCFmaWx0ZXIgfHwgZmlsdGVyRnJvbSA+IHRoaXMuY2h1bmtFbmQoY3VyLmNodW5rSW5kZXgpIHx8IGZpbHRlclRvIDwgdGhpcy5jaHVua1Bvc1tjdXIuY2h1bmtJbmRleF0pICYmXG4gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDaHVuayh0aGlzLmNodW5rUG9zW2N1ci5jaHVua0luZGV4XSwgdGhpcy5jaHVua1tjdXIuY2h1bmtJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgY3VyLm5leHRDaHVuaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyRnJvbSA+IGN1ci50byB8fCBmaWx0ZXJUbyA8IGN1ci5mcm9tIHx8IGZpbHRlcihjdXIuZnJvbSwgY3VyLnRvLCBjdXIudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYnVpbGRlci5hZGRJbm5lcihjdXIuZnJvbSwgY3VyLnRvLCBjdXIudmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3BpbGwucHVzaChSYW5nZS5jcmVhdGUoY3VyLmZyb20sIGN1ci50bywgY3VyLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1ci5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoSW5uZXIodGhpcy5uZXh0TGF5ZXIuaXNFbXB0eSAmJiAhc3BpbGwubGVuZ3RoID8gUmFuZ2VTZXQuZW1wdHlcbiAgICAgICAgICAgIDogdGhpcy5uZXh0TGF5ZXIudXBkYXRlKHsgYWRkOiBzcGlsbCwgZmlsdGVyLCBmaWx0ZXJGcm9tLCBmaWx0ZXJUbyB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCB0aGlzIHJhbmdlIHNldCB0aHJvdWdoIGEgc2V0IG9mIGNoYW5nZXMsIHJldHVybiB0aGUgbmV3IHNldC5cbiAgICAqL1xuICAgIG1hcChjaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmVtcHR5IHx8IHRoaXMuaXNFbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgY2h1bmtzID0gW10sIGNodW5rUG9zID0gW10sIG1heFBvaW50ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaHVuay5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5jaHVua1Bvc1tpXSwgY2h1bmsgPSB0aGlzLmNodW5rW2ldO1xuICAgICAgICAgICAgbGV0IHRvdWNoID0gY2hhbmdlcy50b3VjaGVzUmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgY2h1bmsubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmICh0b3VjaCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBtYXhQb2ludCA9IE1hdGgubWF4KG1heFBvaW50LCBjaHVuay5tYXhQb2ludCk7XG4gICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgIGNodW5rUG9zLnB1c2goY2hhbmdlcy5tYXBQb3Moc3RhcnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgbWFwcGVkLCBwb3MgfSA9IGNodW5rLm1hcChzdGFydCwgY2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICBtYXhQb2ludCA9IE1hdGgubWF4KG1heFBvaW50LCBtYXBwZWQubWF4UG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChtYXBwZWQpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua1Bvcy5wdXNoKHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5uZXh0TGF5ZXIubWFwKGNoYW5nZXMpO1xuICAgICAgICByZXR1cm4gY2h1bmtzLmxlbmd0aCA9PSAwID8gbmV4dCA6IG5ldyBSYW5nZVNldChjaHVua1BvcywgY2h1bmtzLCBuZXh0IHx8IFJhbmdlU2V0LmVtcHR5LCBtYXhQb2ludCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0aGUgcmFuZ2VzIHRoYXQgdG91Y2ggdGhlIHJlZ2lvbiBgZnJvbWAgdG8gYHRvYCxcbiAgICBjYWxsaW5nIGBmYCBmb3IgZWFjaC4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHJhbmdlcyB3aWxsXG4gICAgYmUgcmVwb3J0ZWQgaW4gYW55IHNwZWNpZmljIG9yZGVyLiBXaGVuIHRoZSBjYWxsYmFjayByZXR1cm5zXG4gICAgYGZhbHNlYCwgaXRlcmF0aW9uIHN0b3BzLlxuICAgICovXG4gICAgYmV0d2Vlbihmcm9tLCB0bywgZikge1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2h1bmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuY2h1bmtQb3NbaV0sIGNodW5rID0gdGhpcy5jaHVua1tpXTtcbiAgICAgICAgICAgIGlmICh0byA+PSBzdGFydCAmJiBmcm9tIDw9IHN0YXJ0ICsgY2h1bmsubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgY2h1bmsuYmV0d2VlbihzdGFydCwgZnJvbSAtIHN0YXJ0LCB0byAtIHN0YXJ0LCBmKSA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dExheWVyLmJldHdlZW4oZnJvbSwgdG8sIGYpO1xuICAgIH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyBpbiB0aGlzIHNldCwgaW4gb3JkZXIsIGluY2x1ZGluZyBhbGxcbiAgICByYW5nZXMgdGhhdCBlbmQgYXQgb3IgYWZ0ZXIgYGZyb21gLlxuICAgICovXG4gICAgaXRlcihmcm9tID0gMCkge1xuICAgICAgICByZXR1cm4gSGVhcEN1cnNvci5mcm9tKFt0aGlzXSkuZ290byhmcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaXNFbXB0eSgpIHsgcmV0dXJuIHRoaXMubmV4dExheWVyID09IHRoaXM7IH1cbiAgICAvKipcbiAgICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlcyBpbiBhIGNvbGxlY3Rpb24gb2Ygc2V0cywgaW4gb3JkZXIsXG4gICAgc3RhcnRpbmcgZnJvbSBgZnJvbWAuXG4gICAgKi9cbiAgICBzdGF0aWMgaXRlcihzZXRzLCBmcm9tID0gMCkge1xuICAgICAgICByZXR1cm4gSGVhcEN1cnNvci5mcm9tKHNldHMpLmdvdG8oZnJvbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciB0d28gZ3JvdXBzIG9mIHNldHMsIGNhbGxpbmcgbWV0aG9kcyBvbiBgY29tcGFyYXRvcmBcbiAgICB0byBub3RpZnkgaXQgb2YgcG9zc2libGUgZGlmZmVyZW5jZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgY29tcGFyZShvbGRTZXRzLCBuZXdTZXRzLCBcbiAgICAvKipcbiAgICBUaGlzIGluZGljYXRlcyBob3cgdGhlIHVuZGVybHlpbmcgZGF0YSBjaGFuZ2VkIGJldHdlZW4gdGhlc2VcbiAgICByYW5nZXMsIGFuZCBpcyBuZWVkZWQgdG8gc3luY2hyb25pemUgdGhlIGl0ZXJhdGlvbi5cbiAgICAqL1xuICAgIHRleHREaWZmLCBjb21wYXJhdG9yLCBcbiAgICAvKipcbiAgICBDYW4gYmUgdXNlZCB0byBpZ25vcmUgYWxsIG5vbi1wb2ludCByYW5nZXMsIGFuZCBwb2ludHMgYmVsb3dcbiAgICB0aGUgZ2l2ZW4gc2l6ZS4gV2hlbiAtMSwgYWxsIHJhbmdlcyBhcmUgY29tcGFyZWQuXG4gICAgKi9cbiAgICBtaW5Qb2ludFNpemUgPSAtMSkge1xuICAgICAgICBsZXQgYSA9IG9sZFNldHMuZmlsdGVyKHNldCA9PiBzZXQubWF4UG9pbnQgPiAwIHx8ICFzZXQuaXNFbXB0eSAmJiBzZXQubWF4UG9pbnQgPj0gbWluUG9pbnRTaXplKTtcbiAgICAgICAgbGV0IGIgPSBuZXdTZXRzLmZpbHRlcihzZXQgPT4gc2V0Lm1heFBvaW50ID4gMCB8fCAhc2V0LmlzRW1wdHkgJiYgc2V0Lm1heFBvaW50ID49IG1pblBvaW50U2l6ZSk7XG4gICAgICAgIGxldCBzaGFyZWRDaHVua3MgPSBmaW5kU2hhcmVkQ2h1bmtzKGEsIGIsIHRleHREaWZmKTtcbiAgICAgICAgbGV0IHNpZGVBID0gbmV3IFNwYW5DdXJzb3IoYSwgc2hhcmVkQ2h1bmtzLCBtaW5Qb2ludFNpemUpO1xuICAgICAgICBsZXQgc2lkZUIgPSBuZXcgU3BhbkN1cnNvcihiLCBzaGFyZWRDaHVua3MsIG1pblBvaW50U2l6ZSk7XG4gICAgICAgIHRleHREaWZmLml0ZXJHYXBzKChmcm9tQSwgZnJvbUIsIGxlbmd0aCkgPT4gY29tcGFyZShzaWRlQSwgZnJvbUEsIHNpZGVCLCBmcm9tQiwgbGVuZ3RoLCBjb21wYXJhdG9yKSk7XG4gICAgICAgIGlmICh0ZXh0RGlmZi5lbXB0eSAmJiB0ZXh0RGlmZi5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIGNvbXBhcmUoc2lkZUEsIDAsIHNpZGVCLCAwLCAwLCBjb21wYXJhdG9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGUgY29udGVudHMgb2YgdHdvIGdyb3VwcyBvZiByYW5nZSBzZXRzLCByZXR1cm5pbmcgdHJ1ZVxuICAgIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQgaW4gdGhlIGdpdmVuIHJhbmdlLlxuICAgICovXG4gICAgc3RhdGljIGVxKG9sZFNldHMsIG5ld1NldHMsIGZyb20gPSAwLCB0bykge1xuICAgICAgICBpZiAodG8gPT0gbnVsbClcbiAgICAgICAgICAgIHRvID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLyAtIDE7XG4gICAgICAgIGxldCBhID0gb2xkU2V0cy5maWx0ZXIoc2V0ID0+ICFzZXQuaXNFbXB0eSAmJiBuZXdTZXRzLmluZGV4T2Yoc2V0KSA8IDApO1xuICAgICAgICBsZXQgYiA9IG5ld1NldHMuZmlsdGVyKHNldCA9PiAhc2V0LmlzRW1wdHkgJiYgb2xkU2V0cy5pbmRleE9mKHNldCkgPCAwKTtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWEubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCBzaGFyZWRDaHVua3MgPSBmaW5kU2hhcmVkQ2h1bmtzKGEsIGIpO1xuICAgICAgICBsZXQgc2lkZUEgPSBuZXcgU3BhbkN1cnNvcihhLCBzaGFyZWRDaHVua3MsIDApLmdvdG8oZnJvbSksIHNpZGVCID0gbmV3IFNwYW5DdXJzb3IoYiwgc2hhcmVkQ2h1bmtzLCAwKS5nb3RvKGZyb20pO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoc2lkZUEudG8gIT0gc2lkZUIudG8gfHxcbiAgICAgICAgICAgICAgICAhc2FtZVZhbHVlcyhzaWRlQS5hY3RpdmUsIHNpZGVCLmFjdGl2ZSkgfHxcbiAgICAgICAgICAgICAgICBzaWRlQS5wb2ludCAmJiAoIXNpZGVCLnBvaW50IHx8ICFzaWRlQS5wb2ludC5lcShzaWRlQi5wb2ludCkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzaWRlQS50byA+IHRvKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgc2lkZUEubmV4dCgpO1xuICAgICAgICAgICAgc2lkZUIubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEl0ZXJhdGUgb3ZlciBhIGdyb3VwIG9mIHJhbmdlIHNldHMgYXQgdGhlIHNhbWUgdGltZSwgbm90aWZ5aW5nXG4gICAgdGhlIGl0ZXJhdG9yIGFib3V0IHRoZSByYW5nZXMgY292ZXJpbmcgZXZlcnkgZ2l2ZW4gcGllY2Ugb2ZcbiAgICBjb250ZW50LiBSZXR1cm5zIHRoZSBvcGVuIGNvdW50IChzZWVcbiAgICBbYFNwYW5JdGVyYXRvci5zcGFuYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TcGFuSXRlcmF0b3Iuc3BhbikpIGF0IHRoZSBlbmRcbiAgICBvZiB0aGUgaXRlcmF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIHNwYW5zKHNldHMsIGZyb20sIHRvLCBpdGVyYXRvciwgXG4gICAgLyoqXG4gICAgV2hlbiBnaXZlbiBhbmQgZ3JlYXRlciB0aGFuIC0xLCBvbmx5IHBvaW50cyBvZiBhdCBsZWFzdCB0aGlzXG4gICAgc2l6ZSBhcmUgdGFrZW4gaW50byBhY2NvdW50LlxuICAgICovXG4gICAgbWluUG9pbnRTaXplID0gLTEpIHtcbiAgICAgICAgbGV0IGN1cnNvciA9IG5ldyBTcGFuQ3Vyc29yKHNldHMsIG51bGwsIG1pblBvaW50U2l6ZSkuZ290byhmcm9tKSwgcG9zID0gZnJvbTtcbiAgICAgICAgbGV0IG9wZW5SYW5nZXMgPSBjdXJzb3Iub3BlblN0YXJ0O1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgY3VyVG8gPSBNYXRoLm1pbihjdXJzb3IudG8sIHRvKTtcbiAgICAgICAgICAgIGlmIChjdXJzb3IucG9pbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWN0aXZlID0gY3Vyc29yLmFjdGl2ZUZvclBvaW50KGN1cnNvci50byk7XG4gICAgICAgICAgICAgICAgbGV0IG9wZW5Db3VudCA9IGN1cnNvci5wb2ludEZyb20gPCBmcm9tID8gYWN0aXZlLmxlbmd0aCArIDEgOiBNYXRoLm1pbihhY3RpdmUubGVuZ3RoLCBvcGVuUmFuZ2VzKTtcbiAgICAgICAgICAgICAgICBpdGVyYXRvci5wb2ludChwb3MsIGN1clRvLCBjdXJzb3IucG9pbnQsIGFjdGl2ZSwgb3BlbkNvdW50LCBjdXJzb3IucG9pbnRSYW5rKTtcbiAgICAgICAgICAgICAgICBvcGVuUmFuZ2VzID0gTWF0aC5taW4oY3Vyc29yLm9wZW5FbmQoY3VyVG8pLCBhY3RpdmUubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGN1clRvID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3Iuc3Bhbihwb3MsIGN1clRvLCBjdXJzb3IuYWN0aXZlLCBvcGVuUmFuZ2VzKTtcbiAgICAgICAgICAgICAgICBvcGVuUmFuZ2VzID0gY3Vyc29yLm9wZW5FbmQoY3VyVG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1cnNvci50byA+IHRvKVxuICAgICAgICAgICAgICAgIHJldHVybiBvcGVuUmFuZ2VzICsgKGN1cnNvci5wb2ludCAmJiBjdXJzb3IudG8gPiB0byA/IDEgOiAwKTtcbiAgICAgICAgICAgIHBvcyA9IGN1cnNvci50bztcbiAgICAgICAgICAgIGN1cnNvci5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcmFuZ2Ugc2V0IGZvciB0aGUgZ2l2ZW4gcmFuZ2Ugb3IgYXJyYXkgb2YgcmFuZ2VzLiBCeVxuICAgIGRlZmF1bHQsIHRoaXMgZXhwZWN0cyB0aGUgcmFuZ2VzIHRvIGJlIF9zb3J0ZWRfIChieSBzdGFydFxuICAgIHBvc2l0aW9uIGFuZCwgaWYgdHdvIHN0YXJ0IGF0IHRoZSBzYW1lIHBvc2l0aW9uLFxuICAgIGB2YWx1ZS5zdGFydFNpZGVgKS4gWW91IGNhbiBwYXNzIGB0cnVlYCBhcyBzZWNvbmQgYXJndW1lbnQgdG9cbiAgICBjYXVzZSB0aGUgbWV0aG9kIHRvIHNvcnQgdGhlbS5cbiAgICAqL1xuICAgIHN0YXRpYyBvZihyYW5nZXMsIHNvcnQgPSBmYWxzZSkge1xuICAgICAgICBsZXQgYnVpbGQgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgICAgIGZvciAobGV0IHJhbmdlIG9mIHJhbmdlcyBpbnN0YW5jZW9mIFJhbmdlID8gW3Jhbmdlc10gOiBzb3J0ID8gbGF6eVNvcnQocmFuZ2VzKSA6IHJhbmdlcylcbiAgICAgICAgICAgIGJ1aWxkLmFkZChyYW5nZS5mcm9tLCByYW5nZS50bywgcmFuZ2UudmFsdWUpO1xuICAgICAgICByZXR1cm4gYnVpbGQuZmluaXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEpvaW4gYW4gYXJyYXkgb2YgcmFuZ2Ugc2V0cyBpbnRvIGEgc2luZ2xlIHNldC5cbiAgICAqL1xuICAgIHN0YXRpYyBqb2luKHNldHMpIHtcbiAgICAgICAgaWYgKCFzZXRzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBSYW5nZVNldC5lbXB0eTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNldHNbc2V0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNldHMubGVuZ3RoIC0gMjsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGZvciAobGV0IGxheWVyID0gc2V0c1tpXTsgbGF5ZXIgIT0gUmFuZ2VTZXQuZW1wdHk7IGxheWVyID0gbGF5ZXIubmV4dExheWVyKVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBSYW5nZVNldChsYXllci5jaHVua1BvcywgbGF5ZXIuY2h1bmssIHJlc3VsdCwgTWF0aC5tYXgobGF5ZXIubWF4UG9pbnQsIHJlc3VsdC5tYXhQb2ludCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG5UaGUgZW1wdHkgc2V0IG9mIHJhbmdlcy5cbiovXG5SYW5nZVNldC5lbXB0eSA9IC8qQF9fUFVSRV9fKi9uZXcgUmFuZ2VTZXQoW10sIFtdLCBudWxsLCAtMSk7XG5mdW5jdGlvbiBsYXp5U29ydChyYW5nZXMpIHtcbiAgICBpZiAocmFuZ2VzLmxlbmd0aCA+IDEpXG4gICAgICAgIGZvciAobGV0IHByZXYgPSByYW5nZXNbMF0sIGkgPSAxOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY3VyID0gcmFuZ2VzW2ldO1xuICAgICAgICAgICAgaWYgKGNtcFJhbmdlKHByZXYsIGN1cikgPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiByYW5nZXMuc2xpY2UoKS5zb3J0KGNtcFJhbmdlKTtcbiAgICAgICAgICAgIHByZXYgPSBjdXI7XG4gICAgICAgIH1cbiAgICByZXR1cm4gcmFuZ2VzO1xufVxuUmFuZ2VTZXQuZW1wdHkubmV4dExheWVyID0gUmFuZ2VTZXQuZW1wdHk7XG4vKipcbkEgcmFuZ2Ugc2V0IGJ1aWxkZXIgaXMgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGhlbHBzIGJ1aWxkIHVwIGFcbltyYW5nZSBzZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2VTZXQpIGRpcmVjdGx5LCB3aXRob3V0IGZpcnN0IGFsbG9jYXRpbmdcbmFuIGFycmF5IG9mIFtgUmFuZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlKSBvYmplY3RzLlxuKi9cbmNsYXNzIFJhbmdlU2V0QnVpbGRlciB7XG4gICAgZmluaXNoQ2h1bmsobmV3QXJyYXlzKSB7XG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2gobmV3IENodW5rKHRoaXMuZnJvbSwgdGhpcy50bywgdGhpcy52YWx1ZSwgdGhpcy5tYXhQb2ludCkpO1xuICAgICAgICB0aGlzLmNodW5rUG9zLnB1c2godGhpcy5jaHVua1N0YXJ0KTtcbiAgICAgICAgdGhpcy5jaHVua1N0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMuc2V0TWF4UG9pbnQgPSBNYXRoLm1heCh0aGlzLnNldE1heFBvaW50LCB0aGlzLm1heFBvaW50KTtcbiAgICAgICAgdGhpcy5tYXhQb2ludCA9IC0xO1xuICAgICAgICBpZiAobmV3QXJyYXlzKSB7XG4gICAgICAgICAgICB0aGlzLmZyb20gPSBbXTtcbiAgICAgICAgICAgIHRoaXMudG8gPSBbXTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZW1wdHkgYnVpbGRlci5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rUG9zID0gW107XG4gICAgICAgIHRoaXMuY2h1bmtTdGFydCA9IC0xO1xuICAgICAgICB0aGlzLmxhc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RGcm9tID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgIHRoaXMubGFzdFRvID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgIHRoaXMuZnJvbSA9IFtdO1xuICAgICAgICB0aGlzLnRvID0gW107XG4gICAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICAgICAgdGhpcy5tYXhQb2ludCA9IC0xO1xuICAgICAgICB0aGlzLnNldE1heFBvaW50ID0gLTE7XG4gICAgICAgIHRoaXMubmV4dExheWVyID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQWRkIGEgcmFuZ2UuIFJhbmdlcyBzaG91bGQgYmUgYWRkZWQgaW4gc29ydGVkIChieSBgZnJvbWAgYW5kXG4gICAgYHZhbHVlLnN0YXJ0U2lkZWApIG9yZGVyLlxuICAgICovXG4gICAgYWRkKGZyb20sIHRvLCB2YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuYWRkSW5uZXIoZnJvbSwgdG8sIHZhbHVlKSlcbiAgICAgICAgICAgICh0aGlzLm5leHRMYXllciB8fCAodGhpcy5uZXh0TGF5ZXIgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKSkuYWRkKGZyb20sIHRvLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYWRkSW5uZXIoZnJvbSwgdG8sIHZhbHVlKSB7XG4gICAgICAgIGxldCBkaWZmID0gZnJvbSAtIHRoaXMubGFzdFRvIHx8IHZhbHVlLnN0YXJ0U2lkZSAtIHRoaXMubGFzdC5lbmRTaWRlO1xuICAgICAgICBpZiAoZGlmZiA8PSAwICYmIChmcm9tIC0gdGhpcy5sYXN0RnJvbSB8fCB2YWx1ZS5zdGFydFNpZGUgLSB0aGlzLmxhc3Quc3RhcnRTaWRlKSA8IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSYW5nZXMgbXVzdCBiZSBhZGRlZCBzb3J0ZWQgYnkgYGZyb21gIHBvc2l0aW9uIGFuZCBgc3RhcnRTaWRlYFwiKTtcbiAgICAgICAgaWYgKGRpZmYgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5mcm9tLmxlbmd0aCA9PSAyNTAgLyogQy5DaHVua1NpemUgKi8pXG4gICAgICAgICAgICB0aGlzLmZpbmlzaENodW5rKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5jaHVua1N0YXJ0IDwgMClcbiAgICAgICAgICAgIHRoaXMuY2h1bmtTdGFydCA9IGZyb207XG4gICAgICAgIHRoaXMuZnJvbS5wdXNoKGZyb20gLSB0aGlzLmNodW5rU3RhcnQpO1xuICAgICAgICB0aGlzLnRvLnB1c2godG8gLSB0aGlzLmNodW5rU3RhcnQpO1xuICAgICAgICB0aGlzLmxhc3QgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5sYXN0RnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMubGFzdFRvID0gdG87XG4gICAgICAgIHRoaXMudmFsdWUucHVzaCh2YWx1ZSk7XG4gICAgICAgIGlmICh2YWx1ZS5wb2ludClcbiAgICAgICAgICAgIHRoaXMubWF4UG9pbnQgPSBNYXRoLm1heCh0aGlzLm1heFBvaW50LCB0byAtIGZyb20pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhZGRDaHVuayhmcm9tLCBjaHVuaykge1xuICAgICAgICBpZiAoKGZyb20gLSB0aGlzLmxhc3RUbyB8fCBjaHVuay52YWx1ZVswXS5zdGFydFNpZGUgLSB0aGlzLmxhc3QuZW5kU2lkZSkgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5mcm9tLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMuZmluaXNoQ2h1bmsodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0TWF4UG9pbnQgPSBNYXRoLm1heCh0aGlzLnNldE1heFBvaW50LCBjaHVuay5tYXhQb2ludCk7XG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICB0aGlzLmNodW5rUG9zLnB1c2goZnJvbSk7XG4gICAgICAgIGxldCBsYXN0ID0gY2h1bmsudmFsdWUubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5sYXN0ID0gY2h1bmsudmFsdWVbbGFzdF07XG4gICAgICAgIHRoaXMubGFzdEZyb20gPSBjaHVuay5mcm9tW2xhc3RdICsgZnJvbTtcbiAgICAgICAgdGhpcy5sYXN0VG8gPSBjaHVuay50b1tsYXN0XSArIGZyb207XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5pc2ggdGhlIHJhbmdlIHNldC4gUmV0dXJucyB0aGUgbmV3IHNldC4gVGhlIGJ1aWxkZXIgY2FuJ3QgYmVcbiAgICB1c2VkIGFueW1vcmUgYWZ0ZXIgdGhpcyBoYXMgYmVlbiBjYWxsZWQuXG4gICAgKi9cbiAgICBmaW5pc2goKSB7IHJldHVybiB0aGlzLmZpbmlzaElubmVyKFJhbmdlU2V0LmVtcHR5KTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZmluaXNoSW5uZXIobmV4dCkge1xuICAgICAgICBpZiAodGhpcy5mcm9tLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMuZmluaXNoQ2h1bmsoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5jaHVua3MubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFJhbmdlU2V0LmNyZWF0ZSh0aGlzLmNodW5rUG9zLCB0aGlzLmNodW5rcywgdGhpcy5uZXh0TGF5ZXIgPyB0aGlzLm5leHRMYXllci5maW5pc2hJbm5lcihuZXh0KSA6IG5leHQsIHRoaXMuc2V0TWF4UG9pbnQpO1xuICAgICAgICB0aGlzLmZyb20gPSBudWxsOyAvLyBNYWtlIHN1cmUgZnVydGhlciBgYWRkYCBjYWxscyBwcm9kdWNlIGVycm9yc1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmRTaGFyZWRDaHVua3MoYSwgYiwgdGV4dERpZmYpIHtcbiAgICBsZXQgaW5BID0gbmV3IE1hcCgpO1xuICAgIGZvciAobGV0IHNldCBvZiBhKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5jaHVuay5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChzZXQuY2h1bmtbaV0ubWF4UG9pbnQgPD0gMClcbiAgICAgICAgICAgICAgICBpbkEuc2V0KHNldC5jaHVua1tpXSwgc2V0LmNodW5rUG9zW2ldKTtcbiAgICBsZXQgc2hhcmVkID0gbmV3IFNldCgpO1xuICAgIGZvciAobGV0IHNldCBvZiBiKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5jaHVuay5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGtub3duID0gaW5BLmdldChzZXQuY2h1bmtbaV0pO1xuICAgICAgICAgICAgaWYgKGtub3duICE9IG51bGwgJiYgKHRleHREaWZmID8gdGV4dERpZmYubWFwUG9zKGtub3duKSA6IGtub3duKSA9PSBzZXQuY2h1bmtQb3NbaV0gJiZcbiAgICAgICAgICAgICAgICAhKHRleHREaWZmID09PSBudWxsIHx8IHRleHREaWZmID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0RGlmZi50b3VjaGVzUmFuZ2Uoa25vd24sIGtub3duICsgc2V0LmNodW5rW2ldLmxlbmd0aCkpKVxuICAgICAgICAgICAgICAgIHNoYXJlZC5hZGQoc2V0LmNodW5rW2ldKTtcbiAgICAgICAgfVxuICAgIHJldHVybiBzaGFyZWQ7XG59XG5jbGFzcyBMYXllckN1cnNvciB7XG4gICAgY29uc3RydWN0b3IobGF5ZXIsIHNraXAsIG1pblBvaW50LCByYW5rID0gMCkge1xuICAgICAgICB0aGlzLmxheWVyID0gbGF5ZXI7XG4gICAgICAgIHRoaXMuc2tpcCA9IHNraXA7XG4gICAgICAgIHRoaXMubWluUG9pbnQgPSBtaW5Qb2ludDtcbiAgICAgICAgdGhpcy5yYW5rID0gcmFuaztcbiAgICB9XG4gICAgZ2V0IHN0YXJ0U2lkZSgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLnN0YXJ0U2lkZSA6IDA7IH1cbiAgICBnZXQgZW5kU2lkZSgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLmVuZFNpZGUgOiAwOyB9XG4gICAgZ290byhwb3MsIHNpZGUgPSAtMTAwMDAwMDAwMCAvKiBDLkZhciAqLykge1xuICAgICAgICB0aGlzLmNodW5rSW5kZXggPSB0aGlzLnJhbmdlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLmdvdG9Jbm5lcihwb3MsIHNpZGUsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGdvdG9Jbm5lcihwb3MsIHNpZGUsIGZvcndhcmQpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuY2h1bmtJbmRleCA8IHRoaXMubGF5ZXIuY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmICghKHRoaXMuc2tpcCAmJiB0aGlzLnNraXAuaGFzKG5leHQpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5sYXllci5jaHVua0VuZCh0aGlzLmNodW5rSW5kZXgpIDwgcG9zIHx8XG4gICAgICAgICAgICAgICAgbmV4dC5tYXhQb2ludCA8IHRoaXMubWluUG9pbnQpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdGhpcy5jaHVua0luZGV4Kys7XG4gICAgICAgICAgICBmb3J3YXJkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2h1bmtJbmRleCA8IHRoaXMubGF5ZXIuY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2VJbmRleCA9IHRoaXMubGF5ZXIuY2h1bmtbdGhpcy5jaHVua0luZGV4XS5maW5kSW5kZXgocG9zIC0gdGhpcy5sYXllci5jaHVua1Bvc1t0aGlzLmNodW5rSW5kZXhdLCBzaWRlLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghZm9yd2FyZCB8fCB0aGlzLnJhbmdlSW5kZXggPCByYW5nZUluZGV4KVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2VJbmRleChyYW5nZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICB9XG4gICAgZm9yd2FyZChwb3MsIHNpZGUpIHtcbiAgICAgICAgaWYgKCh0aGlzLnRvIC0gcG9zIHx8IHRoaXMuZW5kU2lkZSAtIHNpZGUpIDwgMClcbiAgICAgICAgICAgIHRoaXMuZ290b0lubmVyKHBvcywgc2lkZSwgdHJ1ZSk7XG4gICAgfVxuICAgIG5leHQoKSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNodW5rSW5kZXggPT0gdGhpcy5sYXllci5jaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZyb20gPSB0aGlzLnRvID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBjaHVua1BvcyA9IHRoaXMubGF5ZXIuY2h1bmtQb3NbdGhpcy5jaHVua0luZGV4XSwgY2h1bmsgPSB0aGlzLmxheWVyLmNodW5rW3RoaXMuY2h1bmtJbmRleF07XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBjaHVua1BvcyArIGNodW5rLmZyb21bdGhpcy5yYW5nZUluZGV4XTtcbiAgICAgICAgICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICAgICAgICAgIHRoaXMudG8gPSBjaHVua1BvcyArIGNodW5rLnRvW3RoaXMucmFuZ2VJbmRleF07XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGNodW5rLnZhbHVlW3RoaXMucmFuZ2VJbmRleF07XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZUluZGV4KHRoaXMucmFuZ2VJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1pblBvaW50IDwgMCB8fCB0aGlzLnZhbHVlLnBvaW50ICYmIHRoaXMudG8gLSB0aGlzLmZyb20gPj0gdGhpcy5taW5Qb2ludClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0UmFuZ2VJbmRleChpbmRleCkge1xuICAgICAgICBpZiAoaW5kZXggPT0gdGhpcy5sYXllci5jaHVua1t0aGlzLmNodW5rSW5kZXhdLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaHVua0luZGV4Kys7XG4gICAgICAgICAgICBpZiAodGhpcy5za2lwKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuY2h1bmtJbmRleCA8IHRoaXMubGF5ZXIuY2h1bmsubGVuZ3RoICYmIHRoaXMuc2tpcC5oYXModGhpcy5sYXllci5jaHVua1t0aGlzLmNodW5rSW5kZXhdKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaHVua0luZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJhbmdlSW5kZXggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yYW5nZUluZGV4ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dENodW5rKCkge1xuICAgICAgICB0aGlzLmNodW5rSW5kZXgrKztcbiAgICAgICAgdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICAgIGNvbXBhcmUob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbSAtIG90aGVyLmZyb20gfHwgdGhpcy5zdGFydFNpZGUgLSBvdGhlci5zdGFydFNpZGUgfHwgdGhpcy5yYW5rIC0gb3RoZXIucmFuayB8fFxuICAgICAgICAgICAgdGhpcy50byAtIG90aGVyLnRvIHx8IHRoaXMuZW5kU2lkZSAtIG90aGVyLmVuZFNpZGU7XG4gICAgfVxufVxuY2xhc3MgSGVhcEN1cnNvciB7XG4gICAgY29uc3RydWN0b3IoaGVhcCkge1xuICAgICAgICB0aGlzLmhlYXAgPSBoZWFwO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbShzZXRzLCBza2lwID0gbnVsbCwgbWluUG9pbnQgPSAtMSkge1xuICAgICAgICBsZXQgaGVhcCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGN1ciA9IHNldHNbaV07ICFjdXIuaXNFbXB0eTsgY3VyID0gY3VyLm5leHRMYXllcikge1xuICAgICAgICAgICAgICAgIGlmIChjdXIubWF4UG9pbnQgPj0gbWluUG9pbnQpXG4gICAgICAgICAgICAgICAgICAgIGhlYXAucHVzaChuZXcgTGF5ZXJDdXJzb3IoY3VyLCBza2lwLCBtaW5Qb2ludCwgaSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFwLmxlbmd0aCA9PSAxID8gaGVhcFswXSA6IG5ldyBIZWFwQ3Vyc29yKGhlYXApO1xuICAgIH1cbiAgICBnZXQgc3RhcnRTaWRlKCkgeyByZXR1cm4gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUuc3RhcnRTaWRlIDogMDsgfVxuICAgIGdvdG8ocG9zLCBzaWRlID0gLTEwMDAwMDAwMDAgLyogQy5GYXIgKi8pIHtcbiAgICAgICAgZm9yIChsZXQgY3VyIG9mIHRoaXMuaGVhcClcbiAgICAgICAgICAgIGN1ci5nb3RvKHBvcywgc2lkZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmhlYXAubGVuZ3RoID4+IDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICAgICAgaGVhcEJ1YmJsZSh0aGlzLmhlYXAsIGkpO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGZvcndhcmQocG9zLCBzaWRlKSB7XG4gICAgICAgIGZvciAobGV0IGN1ciBvZiB0aGlzLmhlYXApXG4gICAgICAgICAgICBjdXIuZm9yd2FyZChwb3MsIHNpZGUpO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5oZWFwLmxlbmd0aCA+PiAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgIGhlYXBCdWJibGUodGhpcy5oZWFwLCBpKTtcbiAgICAgICAgaWYgKCh0aGlzLnRvIC0gcG9zIHx8IHRoaXMudmFsdWUuZW5kU2lkZSAtIHNpZGUpIDwgMClcbiAgICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5oZWFwLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZyb20gPSB0aGlzLnRvID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yYW5rID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgdG9wID0gdGhpcy5oZWFwWzBdO1xuICAgICAgICAgICAgdGhpcy5mcm9tID0gdG9wLmZyb207XG4gICAgICAgICAgICB0aGlzLnRvID0gdG9wLnRvO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRvcC52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMucmFuayA9IHRvcC5yYW5rO1xuICAgICAgICAgICAgaWYgKHRvcC52YWx1ZSlcbiAgICAgICAgICAgICAgICB0b3AubmV4dCgpO1xuICAgICAgICAgICAgaGVhcEJ1YmJsZSh0aGlzLmhlYXAsIDApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaGVhcEJ1YmJsZShoZWFwLCBpbmRleCkge1xuICAgIGZvciAobGV0IGN1ciA9IGhlYXBbaW5kZXhdOzspIHtcbiAgICAgICAgbGV0IGNoaWxkSW5kZXggPSAoaW5kZXggPDwgMSkgKyAxO1xuICAgICAgICBpZiAoY2hpbGRJbmRleCA+PSBoZWFwLmxlbmd0aClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBsZXQgY2hpbGQgPSBoZWFwW2NoaWxkSW5kZXhdO1xuICAgICAgICBpZiAoY2hpbGRJbmRleCArIDEgPCBoZWFwLmxlbmd0aCAmJiBjaGlsZC5jb21wYXJlKGhlYXBbY2hpbGRJbmRleCArIDFdKSA+PSAwKSB7XG4gICAgICAgICAgICBjaGlsZCA9IGhlYXBbY2hpbGRJbmRleCArIDFdO1xuICAgICAgICAgICAgY2hpbGRJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXIuY29tcGFyZShjaGlsZCkgPCAwKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGhlYXBbY2hpbGRJbmRleF0gPSBjdXI7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gY2hpbGQ7XG4gICAgICAgIGluZGV4ID0gY2hpbGRJbmRleDtcbiAgICB9XG59XG5jbGFzcyBTcGFuQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihzZXRzLCBza2lwLCBtaW5Qb2ludCkge1xuICAgICAgICB0aGlzLm1pblBvaW50ID0gbWluUG9pbnQ7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlVG8gPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVSYW5rID0gW107XG4gICAgICAgIHRoaXMubWluQWN0aXZlID0gLTE7XG4gICAgICAgIC8vIEEgY3VycmVudGx5IGFjdGl2ZSBwb2ludCByYW5nZSwgaWYgYW55XG4gICAgICAgIHRoaXMucG9pbnQgPSBudWxsO1xuICAgICAgICB0aGlzLnBvaW50RnJvbSA9IDA7XG4gICAgICAgIHRoaXMucG9pbnRSYW5rID0gMDtcbiAgICAgICAgdGhpcy50byA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovO1xuICAgICAgICB0aGlzLmVuZFNpZGUgPSAwO1xuICAgICAgICAvLyBUaGUgYW1vdW50IG9mIG9wZW4gYWN0aXZlIHJhbmdlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAvLyBOb3QgaW5jbHVkaW5nIHBvaW50cy5cbiAgICAgICAgdGhpcy5vcGVuU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBIZWFwQ3Vyc29yLmZyb20oc2V0cywgc2tpcCwgbWluUG9pbnQpO1xuICAgIH1cbiAgICBnb3RvKHBvcywgc2lkZSA9IC0xMDAwMDAwMDAwIC8qIEMuRmFyICovKSB7XG4gICAgICAgIHRoaXMuY3Vyc29yLmdvdG8ocG9zLCBzaWRlKTtcbiAgICAgICAgdGhpcy5hY3RpdmUubGVuZ3RoID0gdGhpcy5hY3RpdmVUby5sZW5ndGggPSB0aGlzLmFjdGl2ZVJhbmsubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5taW5BY3RpdmUgPSAtMTtcbiAgICAgICAgdGhpcy50byA9IHBvcztcbiAgICAgICAgdGhpcy5lbmRTaWRlID0gc2lkZTtcbiAgICAgICAgdGhpcy5vcGVuU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBmb3J3YXJkKHBvcywgc2lkZSkge1xuICAgICAgICB3aGlsZSAodGhpcy5taW5BY3RpdmUgPiAtMSAmJiAodGhpcy5hY3RpdmVUb1t0aGlzLm1pbkFjdGl2ZV0gLSBwb3MgfHwgdGhpcy5hY3RpdmVbdGhpcy5taW5BY3RpdmVdLmVuZFNpZGUgLSBzaWRlKSA8IDApXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUFjdGl2ZSh0aGlzLm1pbkFjdGl2ZSk7XG4gICAgICAgIHRoaXMuY3Vyc29yLmZvcndhcmQocG9zLCBzaWRlKTtcbiAgICB9XG4gICAgcmVtb3ZlQWN0aXZlKGluZGV4KSB7XG4gICAgICAgIHJlbW92ZSh0aGlzLmFjdGl2ZSwgaW5kZXgpO1xuICAgICAgICByZW1vdmUodGhpcy5hY3RpdmVUbywgaW5kZXgpO1xuICAgICAgICByZW1vdmUodGhpcy5hY3RpdmVSYW5rLCBpbmRleCk7XG4gICAgICAgIHRoaXMubWluQWN0aXZlID0gZmluZE1pbkluZGV4KHRoaXMuYWN0aXZlLCB0aGlzLmFjdGl2ZVRvKTtcbiAgICB9XG4gICAgYWRkQWN0aXZlKHRyYWNrT3Blbikge1xuICAgICAgICBsZXQgaSA9IDAsIHsgdmFsdWUsIHRvLCByYW5rIH0gPSB0aGlzLmN1cnNvcjtcbiAgICAgICAgLy8gT3JnYW5pemUgYWN0aXZlIG1hcmtzIGJ5IHJhbmsgZmlyc3QsIHRoZW4gYnkgc2l6ZVxuICAgICAgICB3aGlsZSAoaSA8IHRoaXMuYWN0aXZlUmFuay5sZW5ndGggJiYgKHJhbmsgLSB0aGlzLmFjdGl2ZVJhbmtbaV0gfHwgdG8gLSB0aGlzLmFjdGl2ZVRvW2ldKSA+IDApXG4gICAgICAgICAgICBpKys7XG4gICAgICAgIGluc2VydCh0aGlzLmFjdGl2ZSwgaSwgdmFsdWUpO1xuICAgICAgICBpbnNlcnQodGhpcy5hY3RpdmVUbywgaSwgdG8pO1xuICAgICAgICBpbnNlcnQodGhpcy5hY3RpdmVSYW5rLCBpLCByYW5rKTtcbiAgICAgICAgaWYgKHRyYWNrT3BlbilcbiAgICAgICAgICAgIGluc2VydCh0cmFja09wZW4sIGksIHRoaXMuY3Vyc29yLmZyb20pO1xuICAgICAgICB0aGlzLm1pbkFjdGl2ZSA9IGZpbmRNaW5JbmRleCh0aGlzLmFjdGl2ZSwgdGhpcy5hY3RpdmVUbyk7XG4gICAgfVxuICAgIC8vIEFmdGVyIGNhbGxpbmcgdGhpcywgaWYgYHRoaXMucG9pbnRgICE9IG51bGwsIHRoZSBuZXh0IHJhbmdlIGlzIGFcbiAgICAvLyBwb2ludC4gT3RoZXJ3aXNlLCBpdCdzIGEgcmVndWxhciByYW5nZSwgY292ZXJlZCBieSBgdGhpcy5hY3RpdmVgLlxuICAgIG5leHQoKSB7XG4gICAgICAgIGxldCBmcm9tID0gdGhpcy50bywgd2FzUG9pbnQgPSB0aGlzLnBvaW50O1xuICAgICAgICB0aGlzLnBvaW50ID0gbnVsbDtcbiAgICAgICAgbGV0IHRyYWNrT3BlbiA9IHRoaXMub3BlblN0YXJ0IDwgMCA/IFtdIDogbnVsbDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGEgPSB0aGlzLm1pbkFjdGl2ZTtcbiAgICAgICAgICAgIGlmIChhID4gLTEgJiYgKHRoaXMuYWN0aXZlVG9bYV0gLSB0aGlzLmN1cnNvci5mcm9tIHx8IHRoaXMuYWN0aXZlW2FdLmVuZFNpZGUgLSB0aGlzLmN1cnNvci5zdGFydFNpZGUpIDwgMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVRvW2FdID4gZnJvbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvID0gdGhpcy5hY3RpdmVUb1thXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRTaWRlID0gdGhpcy5hY3RpdmVbYV0uZW5kU2lkZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQWN0aXZlKGEpO1xuICAgICAgICAgICAgICAgIGlmICh0cmFja09wZW4pXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZSh0cmFja09wZW4sIGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuY3Vyc29yLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50byA9IHRoaXMuZW5kU2lkZSA9IDEwMDAwMDAwMDAgLyogQy5GYXIgKi87XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmN1cnNvci5mcm9tID4gZnJvbSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG8gPSB0aGlzLmN1cnNvci5mcm9tO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kU2lkZSA9IHRoaXMuY3Vyc29yLnN0YXJ0U2lkZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0VmFsID0gdGhpcy5jdXJzb3IudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0VmFsLnBvaW50KSB7IC8vIE9wZW5pbmcgYSByYW5nZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEFjdGl2ZSh0cmFja09wZW4pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdhc1BvaW50ICYmIHRoaXMuY3Vyc29yLnRvID09IHRoaXMudG8gJiYgdGhpcy5jdXJzb3IuZnJvbSA8IHRoaXMuY3Vyc29yLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBhbnkgbm9uLWVtcHR5IHBvaW50cyB0aGF0IGVuZCBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiB0aGUgcHJldiBwb2ludFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBOZXcgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludCA9IG5leHRWYWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRGcm9tID0gdGhpcy5jdXJzb3IuZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludFJhbmsgPSB0aGlzLmN1cnNvci5yYW5rO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvID0gdGhpcy5jdXJzb3IudG87XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kU2lkZSA9IG5leHRWYWwuZW5kU2lkZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcndhcmQodGhpcy50bywgdGhpcy5lbmRTaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFja09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub3BlblN0YXJ0ID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0cmFja09wZW4ubGVuZ3RoIC0gMTsgaSA+PSAwICYmIHRyYWNrT3BlbltpXSA8IGZyb207IGktLSlcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5TdGFydCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFjdGl2ZUZvclBvaW50KHRvKSB7XG4gICAgICAgIGlmICghdGhpcy5hY3RpdmUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xuICAgICAgICBsZXQgYWN0aXZlID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlUmFua1tpXSA8IHRoaXMucG9pbnRSYW5rKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlVG9baV0gPiB0byB8fCB0aGlzLmFjdGl2ZVRvW2ldID09IHRvICYmIHRoaXMuYWN0aXZlW2ldLmVuZFNpZGUgPj0gdGhpcy5wb2ludC5lbmRTaWRlKVxuICAgICAgICAgICAgICAgIGFjdGl2ZS5wdXNoKHRoaXMuYWN0aXZlW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWN0aXZlLnJldmVyc2UoKTtcbiAgICB9XG4gICAgb3BlbkVuZCh0bykge1xuICAgICAgICBsZXQgb3BlbiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVRvLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiB0aGlzLmFjdGl2ZVRvW2ldID4gdG87IGktLSlcbiAgICAgICAgICAgIG9wZW4rKztcbiAgICAgICAgcmV0dXJuIG9wZW47XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcGFyZShhLCBzdGFydEEsIGIsIHN0YXJ0QiwgbGVuZ3RoLCBjb21wYXJhdG9yKSB7XG4gICAgYS5nb3RvKHN0YXJ0QSk7XG4gICAgYi5nb3RvKHN0YXJ0Qik7XG4gICAgbGV0IGVuZEIgPSBzdGFydEIgKyBsZW5ndGg7XG4gICAgbGV0IHBvcyA9IHN0YXJ0QiwgZFBvcyA9IHN0YXJ0QiAtIHN0YXJ0QTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGxldCBkaWZmID0gKGEudG8gKyBkUG9zKSAtIGIudG8gfHwgYS5lbmRTaWRlIC0gYi5lbmRTaWRlO1xuICAgICAgICBsZXQgZW5kID0gZGlmZiA8IDAgPyBhLnRvICsgZFBvcyA6IGIudG8sIGNsaXBFbmQgPSBNYXRoLm1pbihlbmQsIGVuZEIpO1xuICAgICAgICBpZiAoYS5wb2ludCB8fCBiLnBvaW50KSB7XG4gICAgICAgICAgICBpZiAoIShhLnBvaW50ICYmIGIucG9pbnQgJiYgKGEucG9pbnQgPT0gYi5wb2ludCB8fCBhLnBvaW50LmVxKGIucG9pbnQpKSAmJlxuICAgICAgICAgICAgICAgIHNhbWVWYWx1ZXMoYS5hY3RpdmVGb3JQb2ludChhLnRvKSwgYi5hY3RpdmVGb3JQb2ludChiLnRvKSkpKVxuICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IuY29tcGFyZVBvaW50KHBvcywgY2xpcEVuZCwgYS5wb2ludCwgYi5wb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY2xpcEVuZCA+IHBvcyAmJiAhc2FtZVZhbHVlcyhhLmFjdGl2ZSwgYi5hY3RpdmUpKVxuICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IuY29tcGFyZVJhbmdlKHBvcywgY2xpcEVuZCwgYS5hY3RpdmUsIGIuYWN0aXZlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kID4gZW5kQilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgIGlmIChkaWZmIDw9IDApXG4gICAgICAgICAgICBhLm5leHQoKTtcbiAgICAgICAgaWYgKGRpZmYgPj0gMClcbiAgICAgICAgICAgIGIubmV4dCgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNhbWVWYWx1ZXMoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKGFbaV0gIT0gYltpXSAmJiAhYVtpXS5lcShiW2ldKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlbW92ZShhcnJheSwgaW5kZXgpIHtcbiAgICBmb3IgKGxldCBpID0gaW5kZXgsIGUgPSBhcnJheS5sZW5ndGggLSAxOyBpIDwgZTsgaSsrKVxuICAgICAgICBhcnJheVtpXSA9IGFycmF5W2kgKyAxXTtcbiAgICBhcnJheS5wb3AoKTtcbn1cbmZ1bmN0aW9uIGluc2VydChhcnJheSwgaW5kZXgsIHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gaW5kZXg7IGktLSlcbiAgICAgICAgYXJyYXlbaSArIDFdID0gYXJyYXlbaV07XG4gICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7XG59XG5mdW5jdGlvbiBmaW5kTWluSW5kZXgodmFsdWUsIGFycmF5KSB7XG4gICAgbGV0IGZvdW5kID0gLTEsIGZvdW5kUG9zID0gMTAwMDAwMDAwMCAvKiBDLkZhciAqLztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoKGFycmF5W2ldIC0gZm91bmRQb3MgfHwgdmFsdWVbaV0uZW5kU2lkZSAtIHZhbHVlW2ZvdW5kXS5lbmRTaWRlKSA8IDApIHtcbiAgICAgICAgICAgIGZvdW5kID0gaTtcbiAgICAgICAgICAgIGZvdW5kUG9zID0gYXJyYXlbaV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gZm91bmQ7XG59XG5cbi8qKlxuQ291bnQgdGhlIGNvbHVtbiBwb3NpdGlvbiBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IGludG8gdGhlIHN0cmluZyxcbnRha2luZyBleHRlbmRpbmcgY2hhcmFjdGVycyBhbmQgdGFiIHNpemUgaW50byBhY2NvdW50LlxuKi9cbmZ1bmN0aW9uIGNvdW50Q29sdW1uKHN0cmluZywgdGFiU2l6ZSwgdG8gPSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgbGV0IG4gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG87KSB7XG4gICAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdChpKSA9PSA5KSB7XG4gICAgICAgICAgICBuICs9IHRhYlNpemUgLSAobiAlIHRhYlNpemUpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbisrO1xuICAgICAgICAgICAgaSA9IGZpbmRDbHVzdGVyQnJlYWsoc3RyaW5nLCBpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbjtcbn1cbi8qKlxuRmluZCB0aGUgb2Zmc2V0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIGNvbHVtbiBwb3NpdGlvbiBpbiBhXG5zdHJpbmcsIHRha2luZyBleHRlbmRpbmcgY2hhcmFjdGVycyBhbmQgdGFiIHNpemUgaW50byBhY2NvdW50LiBCeVxuZGVmYXVsdCwgdGhlIHN0cmluZyBsZW5ndGggaXMgcmV0dXJuZWQgd2hlbiBpdCBpcyB0b28gc2hvcnQgdG9cbnJlYWNoIHRoZSBjb2x1bW4uIFBhc3MgYHN0cmljdGAgdHJ1ZSB0byBtYWtlIGl0IHJldHVybiAtMSBpbiB0aGF0XG5zaXR1YXRpb24uXG4qL1xuZnVuY3Rpb24gZmluZENvbHVtbihzdHJpbmcsIGNvbCwgdGFiU2l6ZSwgc3RyaWN0KSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSAwOzspIHtcbiAgICAgICAgaWYgKG4gPj0gY29sKVxuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIGlmIChpID09IHN0cmluZy5sZW5ndGgpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbiArPSBzdHJpbmcuY2hhckNvZGVBdChpKSA9PSA5ID8gdGFiU2l6ZSAtIChuICUgdGFiU2l6ZSkgOiAxO1xuICAgICAgICBpID0gZmluZENsdXN0ZXJCcmVhayhzdHJpbmcsIGkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaWN0ID09PSB0cnVlID8gLTEgOiBzdHJpbmcubGVuZ3RoO1xufVxuXG5leHBvcnQgeyBBbm5vdGF0aW9uLCBBbm5vdGF0aW9uVHlwZSwgQ2hhbmdlRGVzYywgQ2hhbmdlU2V0LCBDaGFyQ2F0ZWdvcnksIENvbXBhcnRtZW50LCBFZGl0b3JTZWxlY3Rpb24sIEVkaXRvclN0YXRlLCBGYWNldCwgTGluZSwgTWFwTW9kZSwgUHJlYywgUmFuZ2UsIFJhbmdlU2V0LCBSYW5nZVNldEJ1aWxkZXIsIFJhbmdlVmFsdWUsIFNlbGVjdGlvblJhbmdlLCBTdGF0ZUVmZmVjdCwgU3RhdGVFZmZlY3RUeXBlLCBTdGF0ZUZpZWxkLCBUZXh0LCBUcmFuc2FjdGlvbiwgY29kZVBvaW50QXQsIGNvZGVQb2ludFNpemUsIGNvbWJpbmVDb25maWcsIGNvdW50Q29sdW1uLCBmaW5kQ2x1c3RlckJyZWFrLCBmaW5kQ29sdW1uLCBmcm9tQ29kZVBvaW50IH07XG4iLCAiY29uc3QgQyA9IFwiXFx1MDM3Y1wiXG5jb25zdCBDT1VOVCA9IHR5cGVvZiBTeW1ib2wgPT0gXCJ1bmRlZmluZWRcIiA/IFwiX19cIiArIEMgOiBTeW1ib2wuZm9yKEMpXG5jb25zdCBTRVQgPSB0eXBlb2YgU3ltYm9sID09IFwidW5kZWZpbmVkXCIgPyBcIl9fc3R5bGVTZXRcIiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDFlOCkgOiBTeW1ib2woXCJzdHlsZVNldFwiKVxuY29uc3QgdG9wID0gdHlwZW9mIGdsb2JhbFRoaXMgIT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fVxuXG4vLyA6OiAtIFN0eWxlIG1vZHVsZXMgZW5jYXBzdWxhdGUgYSBzZXQgb2YgQ1NTIHJ1bGVzIGRlZmluZWQgZnJvbVxuLy8gSmF2YVNjcmlwdC4gVGhlaXIgZGVmaW5pdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gRE9NXG4vLyByb290IGFmdGVyIGl0IGhhcyBiZWVuIF9tb3VudGVkXyB0aGVyZSB3aXRoIGBTdHlsZU1vZHVsZS5tb3VudGAuXG4vL1xuLy8gU3R5bGUgbW9kdWxlcyBzaG91bGQgYmUgY3JlYXRlZCBvbmNlIGFuZCBzdG9yZWQgc29tZXdoZXJlLCBhc1xuLy8gb3Bwb3NlZCB0byByZS1jcmVhdGluZyB0aGVtIGV2ZXJ5IHRpbWUgeW91IG5lZWQgdGhlbS4gVGhlIGFtb3VudCBvZlxuLy8gQ1NTIHJ1bGVzIGdlbmVyYXRlZCBmb3IgYSBnaXZlbiBET00gcm9vdCBpcyBib3VuZGVkIGJ5IHRoZSBhbW91bnRcbi8vIG9mIHN0eWxlIG1vZHVsZXMgdGhhdCB3ZXJlIHVzZWQuIFNvIHRvIGF2b2lkIGxlYWtpbmcgcnVsZXMsIGRvbid0XG4vLyBjcmVhdGUgdGhlc2UgZHluYW1pY2FsbHksIGJ1dCB0cmVhdCB0aGVtIGFzIG9uZS10aW1lIGFsbG9jYXRpb25zLlxuZXhwb3J0IGNsYXNzIFN0eWxlTW9kdWxlIHtcbiAgLy8gOjogKE9iamVjdDxTdHlsZT4sID97ZmluaXNoOiA/KHN0cmluZykgXHUyMTkyIHN0cmluZ30pXG4gIC8vIENyZWF0ZSBhIHN0eWxlIG1vZHVsZSBmcm9tIHRoZSBnaXZlbiBzcGVjLlxuICAvL1xuICAvLyBXaGVuIGBmaW5pc2hgIGlzIGdpdmVuLCBpdCBpcyBjYWxsZWQgb24gcmVndWxhciAobm9uLWBAYClcbiAgLy8gc2VsZWN0b3JzIChhZnRlciBgJmAgZXhwYW5zaW9uKSB0byBjb21wdXRlIHRoZSBmaW5hbCBzZWxlY3Rvci5cbiAgY29uc3RydWN0b3Ioc3BlYywgb3B0aW9ucykge1xuICAgIHRoaXMucnVsZXMgPSBbXVxuICAgIGxldCB7ZmluaXNofSA9IG9wdGlvbnMgfHwge31cblxuICAgIGZ1bmN0aW9uIHNwbGl0U2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiAvXkAvLnRlc3Qoc2VsZWN0b3IpID8gW3NlbGVjdG9yXSA6IHNlbGVjdG9yLnNwbGl0KC8sXFxzKi8pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVuZGVyKHNlbGVjdG9ycywgc3BlYywgdGFyZ2V0LCBpc0tleWZyYW1lcykge1xuICAgICAgbGV0IGxvY2FsID0gW10sIGlzQXQgPSAvXkAoXFx3KylcXGIvLmV4ZWMoc2VsZWN0b3JzWzBdKSwga2V5ZnJhbWVzID0gaXNBdCAmJiBpc0F0WzFdID09IFwia2V5ZnJhbWVzXCJcbiAgICAgIGlmIChpc0F0ICYmIHNwZWMgPT0gbnVsbCkgcmV0dXJuIHRhcmdldC5wdXNoKHNlbGVjdG9yc1swXSArIFwiO1wiKVxuICAgICAgZm9yIChsZXQgcHJvcCBpbiBzcGVjKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHNwZWNbcHJvcF1cbiAgICAgICAgaWYgKC8mLy50ZXN0KHByb3ApKSB7XG4gICAgICAgICAgcmVuZGVyKHByb3Auc3BsaXQoLyxcXHMqLykubWFwKHBhcnQgPT4gc2VsZWN0b3JzLm1hcChzZWwgPT4gcGFydC5yZXBsYWNlKC8mLywgc2VsKSkpLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYikpLFxuICAgICAgICAgICAgICAgICB2YWx1ZSwgdGFyZ2V0KVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgaWYgKCFpc0F0KSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IChcIiArIHByb3AgKyBcIikgc2hvdWxkIGJlIGEgcHJpbWl0aXZlIHZhbHVlLlwiKVxuICAgICAgICAgIHJlbmRlcihzcGxpdFNlbGVjdG9yKHByb3ApLCB2YWx1ZSwgbG9jYWwsIGtleWZyYW1lcylcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgbG9jYWwucHVzaChwcm9wLnJlcGxhY2UoL18uKi8sIFwiXCIpLnJlcGxhY2UoL1tBLVpdL2csIGwgPT4gXCItXCIgKyBsLnRvTG93ZXJDYXNlKCkpICsgXCI6IFwiICsgdmFsdWUgKyBcIjtcIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvY2FsLmxlbmd0aCB8fCBrZXlmcmFtZXMpIHtcbiAgICAgICAgdGFyZ2V0LnB1c2goKGZpbmlzaCAmJiAhaXNBdCAmJiAhaXNLZXlmcmFtZXMgPyBzZWxlY3RvcnMubWFwKGZpbmlzaCkgOiBzZWxlY3RvcnMpLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIHtcIiArIGxvY2FsLmpvaW4oXCIgXCIpICsgXCJ9XCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgcHJvcCBpbiBzcGVjKSByZW5kZXIoc3BsaXRTZWxlY3Rvcihwcm9wKSwgc3BlY1twcm9wXSwgdGhpcy5ydWxlcylcbiAgfVxuXG4gIC8vIDo6ICgpIFx1MjE5MiBzdHJpbmdcbiAgLy8gUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBtb2R1bGUncyBDU1MgcnVsZXMuXG4gIGdldFJ1bGVzKCkgeyByZXR1cm4gdGhpcy5ydWxlcy5qb2luKFwiXFxuXCIpIH1cblxuICAvLyA6OiAoKSBcdTIxOTIgc3RyaW5nXG4gIC8vIEdlbmVyYXRlIGEgbmV3IHVuaXF1ZSBDU1MgY2xhc3MgbmFtZS5cbiAgc3RhdGljIG5ld05hbWUoKSB7XG4gICAgbGV0IGlkID0gdG9wW0NPVU5UXSB8fCAxXG4gICAgdG9wW0NPVU5UXSA9IGlkICsgMVxuICAgIHJldHVybiBDICsgaWQudG9TdHJpbmcoMzYpXG4gIH1cblxuICAvLyA6OiAodW5pb248RG9jdW1lbnQsIFNoYWRvd1Jvb3Q+LCB1bmlvbjxbU3R5bGVNb2R1bGVdLCBTdHlsZU1vZHVsZT4sID97bm9uY2U6ID9zdHJpbmd9KVxuICAvL1xuICAvLyBNb3VudCB0aGUgZ2l2ZW4gc2V0IG9mIG1vZHVsZXMgaW4gdGhlIGdpdmVuIERPTSByb290LCB3aGljaCBlbnN1cmVzXG4gIC8vIHRoYXQgdGhlIENTUyBydWxlcyBkZWZpbmVkIGJ5IHRoZSBtb2R1bGUgYXJlIGF2YWlsYWJsZSBpbiB0aGF0XG4gIC8vIGNvbnRleHQuXG4gIC8vXG4gIC8vIFJ1bGVzIGFyZSBvbmx5IGFkZGVkIHRvIHRoZSBkb2N1bWVudCBvbmNlIHBlciByb290LlxuICAvL1xuICAvLyBSdWxlIG9yZGVyIHdpbGwgZm9sbG93IHRoZSBvcmRlciBvZiB0aGUgbW9kdWxlcywgc28gdGhhdCBydWxlcyBmcm9tXG4gIC8vIG1vZHVsZXMgbGF0ZXIgaW4gdGhlIGFycmF5IHRha2UgcHJlY2VkZW5jZSBvZiB0aG9zZSBmcm9tIGVhcmxpZXJcbiAgLy8gbW9kdWxlcy4gSWYgeW91IGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWUgcm9vdFxuICAvLyBpbiBhIHdheSB0aGF0IGNoYW5nZXMgdGhlIG9yZGVyIG9mIGFscmVhZHkgbW91bnRlZCBtb2R1bGVzLCB0aGUgb2xkXG4gIC8vIG9yZGVyIHdpbGwgYmUgY2hhbmdlZC5cbiAgLy9cbiAgLy8gSWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBub25jZSBpcyBwcm92aWRlZCwgaXQgaXMgYWRkZWQgdG9cbiAgLy8gdGhlIGA8c3R5bGU+YCB0YWcgZ2VuZXJhdGVkIGJ5IHRoZSBsaWJyYXJ5LlxuICBzdGF0aWMgbW91bnQocm9vdCwgbW9kdWxlcywgb3B0aW9ucykge1xuICAgIGxldCBzZXQgPSByb290W1NFVF0sIG5vbmNlID0gb3B0aW9ucyAmJiBvcHRpb25zLm5vbmNlXG4gICAgaWYgKCFzZXQpIHNldCA9IG5ldyBTdHlsZVNldChyb290LCBub25jZSlcbiAgICBlbHNlIGlmIChub25jZSkgc2V0LnNldE5vbmNlKG5vbmNlKVxuICAgIHNldC5tb3VudChBcnJheS5pc0FycmF5KG1vZHVsZXMpID8gbW9kdWxlcyA6IFttb2R1bGVzXSlcbiAgfVxufVxuXG5sZXQgYWRvcHRlZFNldCA9IG5ldyBNYXAgLy88RG9jdW1lbnQsIFN0eWxlU2V0PlxuXG5jbGFzcyBTdHlsZVNldCB7XG4gIGNvbnN0cnVjdG9yKHJvb3QsIG5vbmNlKSB7XG4gICAgbGV0IGRvYyA9IHJvb3Qub3duZXJEb2N1bWVudCB8fCByb290LCB3aW4gPSBkb2MuZGVmYXVsdFZpZXdcbiAgICBpZiAoIXJvb3QuaGVhZCAmJiByb290LmFkb3B0ZWRTdHlsZVNoZWV0cyAmJiB3aW4uQ1NTU3R5bGVTaGVldCkge1xuICAgICAgbGV0IGFkb3B0ZWQgPSBhZG9wdGVkU2V0LmdldChkb2MpXG4gICAgICBpZiAoYWRvcHRlZCkge1xuICAgICAgICByb290LmFkb3B0ZWRTdHlsZVNoZWV0cyA9IFthZG9wdGVkLnNoZWV0LCAuLi5yb290LmFkb3B0ZWRTdHlsZVNoZWV0c11cbiAgICAgICAgcmV0dXJuIHJvb3RbU0VUXSA9IGFkb3B0ZWRcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hlZXQgPSBuZXcgd2luLkNTU1N0eWxlU2hlZXRcbiAgICAgIHJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzID0gW3RoaXMuc2hlZXQsIC4uLnJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzXVxuICAgICAgYWRvcHRlZFNldC5zZXQoZG9jLCB0aGlzKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0eWxlVGFnID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKVxuICAgICAgaWYgKG5vbmNlKSB0aGlzLnN0eWxlVGFnLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKVxuICAgICAgbGV0IHRhcmdldCA9IHJvb3QuaGVhZCB8fCByb290XG4gICAgICB0YXJnZXQuaW5zZXJ0QmVmb3JlKHRoaXMuc3R5bGVUYWcsIHRhcmdldC5maXJzdENoaWxkKVxuICAgIH1cbiAgICB0aGlzLm1vZHVsZXMgPSBbXVxuICAgIHJvb3RbU0VUXSA9IHRoaXNcbiAgfVxuXG4gIG1vdW50KG1vZHVsZXMpIHtcbiAgICBsZXQgc2hlZXQgPSB0aGlzLnNoZWV0XG4gICAgbGV0IHBvcyA9IDAgLyogQ3VycmVudCBydWxlIG9mZnNldCAqLywgaiA9IDAgLyogSW5kZXggaW50byB0aGlzLm1vZHVsZXMgKi9cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBtb2QgPSBtb2R1bGVzW2ldLCBpbmRleCA9IHRoaXMubW9kdWxlcy5pbmRleE9mKG1vZClcbiAgICAgIGlmIChpbmRleCA8IGogJiYgaW5kZXggPiAtMSkgeyAvLyBPcmRlcmluZyBjb25mbGljdFxuICAgICAgICB0aGlzLm1vZHVsZXMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICBqLS1cbiAgICAgICAgaW5kZXggPSAtMVxuICAgICAgfVxuICAgICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICAgIHRoaXMubW9kdWxlcy5zcGxpY2UoaisrLCAwLCBtb2QpXG4gICAgICAgIGlmIChzaGVldCkgZm9yIChsZXQgayA9IDA7IGsgPCBtb2QucnVsZXMubGVuZ3RoOyBrKyspXG4gICAgICAgICAgc2hlZXQuaW5zZXJ0UnVsZShtb2QucnVsZXNba10sIHBvcysrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKGogPCBpbmRleCkgcG9zICs9IHRoaXMubW9kdWxlc1tqKytdLnJ1bGVzLmxlbmd0aFxuICAgICAgICBwb3MgKz0gbW9kLnJ1bGVzLmxlbmd0aFxuICAgICAgICBqKytcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXNoZWV0KSB7XG4gICAgICBsZXQgdGV4dCA9IFwiXCJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tb2R1bGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICB0ZXh0ICs9IHRoaXMubW9kdWxlc1tpXS5nZXRSdWxlcygpICsgXCJcXG5cIlxuICAgICAgdGhpcy5zdHlsZVRhZy50ZXh0Q29udGVudCA9IHRleHRcbiAgICB9XG4gIH1cblxuICBzZXROb25jZShub25jZSkge1xuICAgIGlmICh0aGlzLnN0eWxlVGFnICYmIHRoaXMuc3R5bGVUYWcuZ2V0QXR0cmlidXRlKFwibm9uY2VcIikgIT0gbm9uY2UpXG4gICAgICB0aGlzLnN0eWxlVGFnLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKVxuICB9XG59XG5cbi8vIFN0eWxlOjpPYmplY3Q8dW5pb248U3R5bGUsc3RyaW5nPj5cbi8vXG4vLyBBIHN0eWxlIGlzIGFuIG9iamVjdCB0aGF0LCBpbiB0aGUgc2ltcGxlIGNhc2UsIG1hcHMgQ1NTIHByb3BlcnR5XG4vLyBuYW1lcyB0byBzdHJpbmdzIGhvbGRpbmcgdGhlaXIgdmFsdWVzLCBhcyBpbiBge2NvbG9yOiBcInJlZFwiLFxuLy8gZm9udFdlaWdodDogXCJib2xkXCJ9YC4gVGhlIHByb3BlcnR5IG5hbWVzIGNhbiBiZSBnaXZlbiBpblxuLy8gY2FtZWwtY2FzZVx1MjAxNHRoZSBsaWJyYXJ5IHdpbGwgaW5zZXJ0IGEgZGFzaCBiZWZvcmUgY2FwaXRhbCBsZXR0ZXJzXG4vLyB3aGVuIGNvbnZlcnRpbmcgdGhlbSB0byBDU1MuXG4vL1xuLy8gSWYgeW91IGluY2x1ZGUgYW4gdW5kZXJzY29yZSBpbiBhIHByb3BlcnR5IG5hbWUsIGl0IGFuZCBldmVyeXRoaW5nXG4vLyBhZnRlciBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0LCB3aGljaCBjYW4gYmUgdXNlZnVsIHdoZW5cbi8vIHByb3ZpZGluZyBhIHByb3BlcnR5IG11bHRpcGxlIHRpbWVzLCBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4vLyByZWFzb25zLlxuLy9cbi8vIEEgcHJvcGVydHkgaW4gYSBzdHlsZSBvYmplY3QgY2FuIGFsc28gYmUgYSBzdWItc2VsZWN0b3IsIHdoaWNoXG4vLyBleHRlbmRzIHRoZSBjdXJyZW50IGNvbnRleHQgdG8gYWRkIGEgcHNldWRvLXNlbGVjdG9yIG9yIGEgY2hpbGRcbi8vIHNlbGVjdG9yLiBTdWNoIGEgcHJvcGVydHkgc2hvdWxkIGNvbnRhaW4gYSBgJmAgY2hhcmFjdGVyLCB3aGljaFxuLy8gd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgY3VycmVudCBzZWxlY3Rvci4gRm9yIGV4YW1wbGUgYHtcIiY6YmVmb3JlXCI6XG4vLyB7Y29udGVudDogJ1wiaGlcIid9fWAuIFN1Yi1zZWxlY3RvcnMgYW5kIHJlZ3VsYXIgcHJvcGVydGllcyBjYW5cbi8vIGZyZWVseSBiZSBtaXhlZCBpbiBhIGdpdmVuIG9iamVjdC4gQW55IHByb3BlcnR5IGNvbnRhaW5pbmcgYSBgJmAgaXNcbi8vIGFzc3VtZWQgdG8gYmUgYSBzdWItc2VsZWN0b3IuXG4vL1xuLy8gRmluYWxseSwgYSBwcm9wZXJ0eSBjYW4gc3BlY2lmeSBhbiBALWJsb2NrIHRvIGJlIHdyYXBwZWQgYXJvdW5kIHRoZVxuLy8gc3R5bGVzIGRlZmluZWQgaW5zaWRlIHRoZSBvYmplY3QgdGhhdCdzIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLiBGb3Jcbi8vIGV4YW1wbGUgdG8gY3JlYXRlIGEgbWVkaWEgcXVlcnkgeW91IGNhbiBkbyBge1wiQG1lZGlhIHNjcmVlbiBhbmRcbi8vIChtaW4td2lkdGg6IDQwMHB4KVwiOiB7Li4ufX1gLlxuIiwgImV4cG9ydCB2YXIgYmFzZSA9IHtcbiAgODogXCJCYWNrc3BhY2VcIixcbiAgOTogXCJUYWJcIixcbiAgMTA6IFwiRW50ZXJcIixcbiAgMTI6IFwiTnVtTG9ja1wiLFxuICAxMzogXCJFbnRlclwiLFxuICAxNjogXCJTaGlmdFwiLFxuICAxNzogXCJDb250cm9sXCIsXG4gIDE4OiBcIkFsdFwiLFxuICAyMDogXCJDYXBzTG9ja1wiLFxuICAyNzogXCJFc2NhcGVcIixcbiAgMzI6IFwiIFwiLFxuICAzMzogXCJQYWdlVXBcIixcbiAgMzQ6IFwiUGFnZURvd25cIixcbiAgMzU6IFwiRW5kXCIsXG4gIDM2OiBcIkhvbWVcIixcbiAgMzc6IFwiQXJyb3dMZWZ0XCIsXG4gIDM4OiBcIkFycm93VXBcIixcbiAgMzk6IFwiQXJyb3dSaWdodFwiLFxuICA0MDogXCJBcnJvd0Rvd25cIixcbiAgNDQ6IFwiUHJpbnRTY3JlZW5cIixcbiAgNDU6IFwiSW5zZXJ0XCIsXG4gIDQ2OiBcIkRlbGV0ZVwiLFxuICA1OTogXCI7XCIsXG4gIDYxOiBcIj1cIixcbiAgOTE6IFwiTWV0YVwiLFxuICA5MjogXCJNZXRhXCIsXG4gIDEwNjogXCIqXCIsXG4gIDEwNzogXCIrXCIsXG4gIDEwODogXCIsXCIsXG4gIDEwOTogXCItXCIsXG4gIDExMDogXCIuXCIsXG4gIDExMTogXCIvXCIsXG4gIDE0NDogXCJOdW1Mb2NrXCIsXG4gIDE0NTogXCJTY3JvbGxMb2NrXCIsXG4gIDE2MDogXCJTaGlmdFwiLFxuICAxNjE6IFwiU2hpZnRcIixcbiAgMTYyOiBcIkNvbnRyb2xcIixcbiAgMTYzOiBcIkNvbnRyb2xcIixcbiAgMTY0OiBcIkFsdFwiLFxuICAxNjU6IFwiQWx0XCIsXG4gIDE3MzogXCItXCIsXG4gIDE4NjogXCI7XCIsXG4gIDE4NzogXCI9XCIsXG4gIDE4ODogXCIsXCIsXG4gIDE4OTogXCItXCIsXG4gIDE5MDogXCIuXCIsXG4gIDE5MTogXCIvXCIsXG4gIDE5MjogXCJgXCIsXG4gIDIxOTogXCJbXCIsXG4gIDIyMDogXCJcXFxcXCIsXG4gIDIyMTogXCJdXCIsXG4gIDIyMjogXCInXCJcbn1cblxuZXhwb3J0IHZhciBzaGlmdCA9IHtcbiAgNDg6IFwiKVwiLFxuICA0OTogXCIhXCIsXG4gIDUwOiBcIkBcIixcbiAgNTE6IFwiI1wiLFxuICA1MjogXCIkXCIsXG4gIDUzOiBcIiVcIixcbiAgNTQ6IFwiXlwiLFxuICA1NTogXCImXCIsXG4gIDU2OiBcIipcIixcbiAgNTc6IFwiKFwiLFxuICA1OTogXCI6XCIsXG4gIDYxOiBcIitcIixcbiAgMTczOiBcIl9cIixcbiAgMTg2OiBcIjpcIixcbiAgMTg3OiBcIitcIixcbiAgMTg4OiBcIjxcIixcbiAgMTg5OiBcIl9cIixcbiAgMTkwOiBcIj5cIixcbiAgMTkxOiBcIj9cIixcbiAgMTkyOiBcIn5cIixcbiAgMjE5OiBcIntcIixcbiAgMjIwOiBcInxcIixcbiAgMjIxOiBcIn1cIixcbiAgMjIyOiBcIlxcXCJcIlxufVxuXG52YXIgbWFjID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmIC9NYWMvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxudmFyIGllID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmIC9NU0lFIFxcZHxUcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KVxuXG4vLyBGaWxsIGluIHRoZSBkaWdpdCBrZXlzXG5mb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIGJhc2VbNDggKyBpXSA9IGJhc2VbOTYgKyBpXSA9IFN0cmluZyhpKVxuXG4vLyBUaGUgZnVuY3Rpb24ga2V5c1xuZm9yICh2YXIgaSA9IDE7IGkgPD0gMjQ7IGkrKykgYmFzZVtpICsgMTExXSA9IFwiRlwiICsgaVxuXG4vLyBBbmQgdGhlIGFscGhhYmV0aWMga2V5c1xuZm9yICh2YXIgaSA9IDY1OyBpIDw9IDkwOyBpKyspIHtcbiAgYmFzZVtpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSArIDMyKVxuICBzaGlmdFtpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSlcbn1cblxuLy8gRm9yIGVhY2ggY29kZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHNoaWZ0LWVxdWl2YWxlbnQsIGNvcHkgdGhlIGJhc2UgbmFtZVxuZm9yICh2YXIgY29kZSBpbiBiYXNlKSBpZiAoIXNoaWZ0Lmhhc093blByb3BlcnR5KGNvZGUpKSBzaGlmdFtjb2RlXSA9IGJhc2VbY29kZV1cblxuZXhwb3J0IGZ1bmN0aW9uIGtleU5hbWUoZXZlbnQpIHtcbiAgLy8gT24gbWFjT1MsIGtleXMgaGVsZCB3aXRoIFNoaWZ0IGFuZCBDbWQgZG9uJ3QgcmVmbGVjdCB0aGUgZWZmZWN0IG9mIFNoaWZ0IGluIGAua2V5YC5cbiAgLy8gT24gSUUsIHNoaWZ0IGVmZmVjdCBpcyBuZXZlciBpbmNsdWRlZCBpbiBgLmtleWAuXG4gIHZhciBpZ25vcmVLZXkgPSBtYWMgJiYgZXZlbnQubWV0YUtleSAmJiBldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5IHx8XG4gICAgICBpZSAmJiBldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXkgJiYgZXZlbnQua2V5Lmxlbmd0aCA9PSAxIHx8XG4gICAgICBldmVudC5rZXkgPT0gXCJVbmlkZW50aWZpZWRcIlxuICB2YXIgbmFtZSA9ICghaWdub3JlS2V5ICYmIGV2ZW50LmtleSkgfHxcbiAgICAoZXZlbnQuc2hpZnRLZXkgPyBzaGlmdCA6IGJhc2UpW2V2ZW50LmtleUNvZGVdIHx8XG4gICAgZXZlbnQua2V5IHx8IFwiVW5pZGVudGlmaWVkXCJcbiAgLy8gRWRnZSBzb21ldGltZXMgcHJvZHVjZXMgd3JvbmcgbmFtZXMgKElzc3VlICMzKVxuICBpZiAobmFtZSA9PSBcIkVzY1wiKSBuYW1lID0gXCJFc2NhcGVcIlxuICBpZiAobmFtZSA9PSBcIkRlbFwiKSBuYW1lID0gXCJEZWxldGVcIlxuICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy84ODYwNTcxL1xuICBpZiAobmFtZSA9PSBcIkxlZnRcIikgbmFtZSA9IFwiQXJyb3dMZWZ0XCJcbiAgaWYgKG5hbWUgPT0gXCJVcFwiKSBuYW1lID0gXCJBcnJvd1VwXCJcbiAgaWYgKG5hbWUgPT0gXCJSaWdodFwiKSBuYW1lID0gXCJBcnJvd1JpZ2h0XCJcbiAgaWYgKG5hbWUgPT0gXCJEb3duXCIpIG5hbWUgPSBcIkFycm93RG93blwiXG4gIHJldHVybiBuYW1lXG59XG4iLCAiaW1wb3J0IHsgVGV4dCwgUmFuZ2VTZXQsIE1hcE1vZGUsIFJhbmdlVmFsdWUsIGZpbmRDbHVzdGVyQnJlYWssIEVkaXRvclNlbGVjdGlvbiwgRmFjZXQsIFN0YXRlRWZmZWN0LCBDaGFuZ2VTZXQsIGZpbmRDb2x1bW4sIENoYXJDYXRlZ29yeSwgQW5ub3RhdGlvbiwgRWRpdG9yU3RhdGUsIFRyYW5zYWN0aW9uLCBQcmVjLCBjb2RlUG9pbnRBdCwgY29kZVBvaW50U2l6ZSwgY29tYmluZUNvbmZpZywgU3RhdGVGaWVsZCwgUmFuZ2VTZXRCdWlsZGVyLCBjb3VudENvbHVtbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IFN0eWxlTW9kdWxlIH0gZnJvbSAnc3R5bGUtbW9kJztcbmltcG9ydCB7IGtleU5hbWUsIGJhc2UsIHNoaWZ0IH0gZnJvbSAndzNjLWtleW5hbWUnO1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24ocm9vdCkge1xuICAgIGxldCB0YXJnZXQ7XG4gICAgLy8gQnJvd3NlcnMgZGlmZmVyIG9uIHdoZXRoZXIgc2hhZG93IHJvb3RzIGhhdmUgYSBnZXRTZWxlY3Rpb25cbiAgICAvLyBtZXRob2QuIElmIGl0IGV4aXN0cywgdXNlIHRoYXQsIG90aGVyd2lzZSwgY2FsbCBpdCBvbiB0aGVcbiAgICAvLyBkb2N1bWVudC5cbiAgICBpZiAocm9vdC5ub2RlVHlwZSA9PSAxMSkgeyAvLyBTaGFkb3cgcm9vdFxuICAgICAgICB0YXJnZXQgPSByb290LmdldFNlbGVjdGlvbiA/IHJvb3QgOiByb290Lm93bmVyRG9jdW1lbnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSByb290O1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0LmdldFNlbGVjdGlvbigpO1xufVxuZnVuY3Rpb24gY29udGFpbnMoZG9tLCBub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgPyBkb20gPT0gbm9kZSB8fCBkb20uY29udGFpbnMobm9kZS5ub2RlVHlwZSAhPSAxID8gbm9kZS5wYXJlbnROb2RlIDogbm9kZSkgOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGRlZXBBY3RpdmVFbGVtZW50KGRvYykge1xuICAgIGxldCBlbHQgPSBkb2MuYWN0aXZlRWxlbWVudDtcbiAgICB3aGlsZSAoZWx0ICYmIGVsdC5zaGFkb3dSb290KVxuICAgICAgICBlbHQgPSBlbHQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O1xuICAgIHJldHVybiBlbHQ7XG59XG5mdW5jdGlvbiBoYXNTZWxlY3Rpb24oZG9tLCBzZWxlY3Rpb24pIHtcbiAgICBpZiAoIXNlbGVjdGlvbi5hbmNob3JOb2RlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gRmlyZWZveCB3aWxsIHJhaXNlICdwZXJtaXNzaW9uIGRlbmllZCcgZXJyb3JzIHdoZW4gYWNjZXNzaW5nXG4gICAgICAgIC8vIHByb3BlcnRpZXMgb2YgYHNlbC5hbmNob3JOb2RlYCB3aGVuIGl0J3MgaW4gYSBnZW5lcmF0ZWQgQ1NTXG4gICAgICAgIC8vIGVsZW1lbnQuXG4gICAgICAgIHJldHVybiBjb250YWlucyhkb20sIHNlbGVjdGlvbi5hbmNob3JOb2RlKTtcbiAgICB9XG4gICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsaWVudFJlY3RzRm9yKGRvbSkge1xuICAgIGlmIChkb20ubm9kZVR5cGUgPT0gMylcbiAgICAgICAgcmV0dXJuIHRleHRSYW5nZShkb20sIDAsIGRvbS5ub2RlVmFsdWUubGVuZ3RoKS5nZXRDbGllbnRSZWN0cygpO1xuICAgIGVsc2UgaWYgKGRvbS5ub2RlVHlwZSA9PSAxKVxuICAgICAgICByZXR1cm4gZG9tLmdldENsaWVudFJlY3RzKCk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gW107XG59XG4vLyBTY2FucyBmb3J3YXJkIGFuZCBiYWNrd2FyZCB0aHJvdWdoIERPTSBwb3NpdGlvbnMgZXF1aXZhbGVudCB0byB0aGVcbi8vIGdpdmVuIG9uZSB0byBzZWUgaWYgdGhlIHR3byBhcmUgaW4gdGhlIHNhbWUgcGxhY2UgKGkuZS4gYWZ0ZXIgYVxuLy8gdGV4dCBub2RlIHZzIGF0IHRoZSBlbmQgb2YgdGhhdCB0ZXh0IG5vZGUpXG5mdW5jdGlvbiBpc0VxdWl2YWxlbnRQb3NpdGlvbihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZikge1xuICAgIHJldHVybiB0YXJnZXROb2RlID8gKHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIC0xKSB8fFxuICAgICAgICBzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCAxKSkgOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGRvbUluZGV4KG5vZGUpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7OyBpbmRleCsrKSB7XG4gICAgICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIGRpcikge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gdGFyZ2V0Tm9kZSAmJiBvZmYgPT0gdGFyZ2V0T2ZmKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvZmYgPT0gKGRpciA8IDAgPyAwIDogbWF4T2Zmc2V0KG5vZGUpKSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJESVZcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50Lm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgb2ZmID0gZG9tSW5kZXgobm9kZSkgKyAoZGlyIDwgMCA/IDAgOiAxKTtcbiAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZiArIChkaXIgPCAwID8gLTEgOiAwKV07XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBvZmYgPSBkaXIgPCAwID8gbWF4T2Zmc2V0KG5vZGUpIDogMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIG1heE9mZnNldChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gMyA/IG5vZGUubm9kZVZhbHVlLmxlbmd0aCA6IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG59XG5mdW5jdGlvbiBmbGF0dGVuUmVjdChyZWN0LCBsZWZ0KSB7XG4gICAgbGV0IHggPSBsZWZ0ID8gcmVjdC5sZWZ0IDogcmVjdC5yaWdodDtcbiAgICByZXR1cm4geyBsZWZ0OiB4LCByaWdodDogeCwgdG9wOiByZWN0LnRvcCwgYm90dG9tOiByZWN0LmJvdHRvbSB9O1xufVxuZnVuY3Rpb24gd2luZG93UmVjdCh3aW4pIHtcbiAgICByZXR1cm4geyBsZWZ0OiAwLCByaWdodDogd2luLmlubmVyV2lkdGgsXG4gICAgICAgIHRvcDogMCwgYm90dG9tOiB3aW4uaW5uZXJIZWlnaHQgfTtcbn1cbmZ1bmN0aW9uIGdldFNjYWxlKGVsdCwgcmVjdCkge1xuICAgIGxldCBzY2FsZVggPSByZWN0LndpZHRoIC8gZWx0Lm9mZnNldFdpZHRoO1xuICAgIGxldCBzY2FsZVkgPSByZWN0LmhlaWdodCAvIGVsdC5vZmZzZXRIZWlnaHQ7XG4gICAgaWYgKHNjYWxlWCA+IDAuOTk1ICYmIHNjYWxlWCA8IDEuMDA1IHx8ICFpc0Zpbml0ZShzY2FsZVgpIHx8IE1hdGguYWJzKHJlY3Qud2lkdGggLSBlbHQub2Zmc2V0V2lkdGgpIDwgMSlcbiAgICAgICAgc2NhbGVYID0gMTtcbiAgICBpZiAoc2NhbGVZID4gMC45OTUgJiYgc2NhbGVZIDwgMS4wMDUgfHwgIWlzRmluaXRlKHNjYWxlWSkgfHwgTWF0aC5hYnMocmVjdC5oZWlnaHQgLSBlbHQub2Zmc2V0SGVpZ2h0KSA8IDEpXG4gICAgICAgIHNjYWxlWSA9IDE7XG4gICAgcmV0dXJuIHsgc2NhbGVYLCBzY2FsZVkgfTtcbn1cbmZ1bmN0aW9uIHNjcm9sbFJlY3RJbnRvVmlldyhkb20sIHJlY3QsIHNpZGUsIHgsIHksIHhNYXJnaW4sIHlNYXJnaW4sIGx0cikge1xuICAgIGxldCBkb2MgPSBkb20ub3duZXJEb2N1bWVudCwgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgICBmb3IgKGxldCBjdXIgPSBkb20sIHN0b3AgPSBmYWxzZTsgY3VyICYmICFzdG9wOykge1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09IDEpIHsgLy8gRWxlbWVudFxuICAgICAgICAgICAgbGV0IGJvdW5kaW5nLCB0b3AgPSBjdXIgPT0gZG9jLmJvZHk7XG4gICAgICAgICAgICBsZXQgc2NhbGVYID0gMSwgc2NhbGVZID0gMTtcbiAgICAgICAgICAgIGlmICh0b3ApIHtcbiAgICAgICAgICAgICAgICBib3VuZGluZyA9IHdpbmRvd1JlY3Qod2luKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICgvXihmaXhlZHxzdGlja3kpJC8udGVzdChnZXRDb21wdXRlZFN0eWxlKGN1cikucG9zaXRpb24pKVxuICAgICAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY3VyLnNjcm9sbEhlaWdodCA8PSBjdXIuY2xpZW50SGVpZ2h0ICYmIGN1ci5zY3JvbGxXaWR0aCA8PSBjdXIuY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZWN0ID0gY3VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICh7IHNjYWxlWCwgc2NhbGVZIH0gPSBnZXRTY2FsZShjdXIsIHJlY3QpKTtcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgc2Nyb2xsYmFyIHdpZHRoIGlzbid0IGluY2x1ZGVkIGluIHRoZSByZWN0YW5nbGVcbiAgICAgICAgICAgICAgICBib3VuZGluZyA9IHsgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5sZWZ0ICsgY3VyLmNsaWVudFdpZHRoICogc2NhbGVYLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IHJlY3QudG9wLCBib3R0b206IHJlY3QudG9wICsgY3VyLmNsaWVudEhlaWdodCAqIHNjYWxlWSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG1vdmVYID0gMCwgbW92ZVkgPSAwO1xuICAgICAgICAgICAgaWYgKHkgPT0gXCJuZWFyZXN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVjdC50b3AgPCBib3VuZGluZy50b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVkgPSAtKGJvdW5kaW5nLnRvcCAtIHJlY3QudG9wICsgeU1hcmdpbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlID4gMCAmJiByZWN0LmJvdHRvbSA+IGJvdW5kaW5nLmJvdHRvbSArIG1vdmVZKVxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZVkgPSByZWN0LmJvdHRvbSAtIGJvdW5kaW5nLmJvdHRvbSArIG1vdmVZICsgeU1hcmdpbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVjdC5ib3R0b20gPiBib3VuZGluZy5ib3R0b20pIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVkgPSByZWN0LmJvdHRvbSAtIGJvdW5kaW5nLmJvdHRvbSArIHlNYXJnaW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlIDwgMCAmJiAocmVjdC50b3AgLSBtb3ZlWSkgPCBib3VuZGluZy50b3ApXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlWSA9IC0oYm91bmRpbmcudG9wICsgbW92ZVkgLSByZWN0LnRvcCArIHlNYXJnaW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByZWN0SGVpZ2h0ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcCwgYm91bmRpbmdIZWlnaHQgPSBib3VuZGluZy5ib3R0b20gLSBib3VuZGluZy50b3A7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldFRvcCA9IHkgPT0gXCJjZW50ZXJcIiAmJiByZWN0SGVpZ2h0IDw9IGJvdW5kaW5nSGVpZ2h0ID8gcmVjdC50b3AgKyByZWN0SGVpZ2h0IC8gMiAtIGJvdW5kaW5nSGVpZ2h0IC8gMiA6XG4gICAgICAgICAgICAgICAgICAgIHkgPT0gXCJzdGFydFwiIHx8IHkgPT0gXCJjZW50ZXJcIiAmJiBzaWRlIDwgMCA/IHJlY3QudG9wIC0geU1hcmdpbiA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSAtIGJvdW5kaW5nSGVpZ2h0ICsgeU1hcmdpbjtcbiAgICAgICAgICAgICAgICBtb3ZlWSA9IHRhcmdldFRvcCAtIGJvdW5kaW5nLnRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh4ID09IFwibmVhcmVzdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlY3QubGVmdCA8IGJvdW5kaW5nLmxlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZVggPSAtKGJvdW5kaW5nLmxlZnQgLSByZWN0LmxlZnQgKyB4TWFyZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpZGUgPiAwICYmIHJlY3QucmlnaHQgPiBib3VuZGluZy5yaWdodCArIG1vdmVYKVxuICAgICAgICAgICAgICAgICAgICAgICAgbW92ZVggPSByZWN0LnJpZ2h0IC0gYm91bmRpbmcucmlnaHQgKyBtb3ZlWCArIHhNYXJnaW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlY3QucmlnaHQgPiBib3VuZGluZy5yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBtb3ZlWCA9IHJlY3QucmlnaHQgLSBib3VuZGluZy5yaWdodCArIHhNYXJnaW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWRlIDwgMCAmJiByZWN0LmxlZnQgPCBib3VuZGluZy5sZWZ0ICsgbW92ZVgpXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlWCA9IC0oYm91bmRpbmcubGVmdCArIG1vdmVYIC0gcmVjdC5sZWZ0ICsgeE1hcmdpbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldExlZnQgPSB4ID09IFwiY2VudGVyXCIgPyByZWN0LmxlZnQgKyAocmVjdC5yaWdodCAtIHJlY3QubGVmdCkgLyAyIC0gKGJvdW5kaW5nLnJpZ2h0IC0gYm91bmRpbmcubGVmdCkgLyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHggPT0gXCJzdGFydFwiKSA9PSBsdHIgPyByZWN0LmxlZnQgLSB4TWFyZ2luIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgLSAoYm91bmRpbmcucmlnaHQgLSBib3VuZGluZy5sZWZ0KSArIHhNYXJnaW47XG4gICAgICAgICAgICAgICAgbW92ZVggPSB0YXJnZXRMZWZ0IC0gYm91bmRpbmcubGVmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb3ZlWCB8fCBtb3ZlWSkge1xuICAgICAgICAgICAgICAgIGlmICh0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgd2luLnNjcm9sbEJ5KG1vdmVYLCBtb3ZlWSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbW92ZWRYID0gMCwgbW92ZWRZID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBjdXIuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyLnNjcm9sbFRvcCArPSBtb3ZlWSAvIHNjYWxlWTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkWSA9IChjdXIuc2Nyb2xsVG9wIC0gc3RhcnQpICogc2NhbGVZO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gY3VyLnNjcm9sbExlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXIuc2Nyb2xsTGVmdCArPSBtb3ZlWCAvIHNjYWxlWDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkWCA9IChjdXIuc2Nyb2xsTGVmdCAtIHN0YXJ0KSAqIHNjYWxlWDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZWN0ID0geyBsZWZ0OiByZWN0LmxlZnQgLSBtb3ZlZFgsIHRvcDogcmVjdC50b3AgLSBtb3ZlZFksXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodDogcmVjdC5yaWdodCAtIG1vdmVkWCwgYm90dG9tOiByZWN0LmJvdHRvbSAtIG1vdmVkWSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAobW92ZWRYICYmIE1hdGguYWJzKG1vdmVkWCAtIG1vdmVYKSA8IDEpXG4gICAgICAgICAgICAgICAgICAgICAgICB4ID0gXCJuZWFyZXN0XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlZFkgJiYgTWF0aC5hYnMobW92ZWRZIC0gbW92ZVkpIDwgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBcIm5lYXJlc3RcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9wKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY3VyID0gY3VyLmFzc2lnbmVkU2xvdCB8fCBjdXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXIubm9kZVR5cGUgPT0gMTEpIHsgLy8gQSBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgY3VyID0gY3VyLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNjcm9sbGFibGVQYXJlbnQoZG9tKSB7XG4gICAgbGV0IGRvYyA9IGRvbS5vd25lckRvY3VtZW50O1xuICAgIGZvciAobGV0IGN1ciA9IGRvbS5wYXJlbnROb2RlOyBjdXI7KSB7XG4gICAgICAgIGlmIChjdXIgPT0gZG9jLmJvZHkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1ci5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICBpZiAoY3VyLnNjcm9sbEhlaWdodCA+IGN1ci5jbGllbnRIZWlnaHQgfHwgY3VyLnNjcm9sbFdpZHRoID4gY3VyLmNsaWVudFdpZHRoKVxuICAgICAgICAgICAgICAgIHJldHVybiBjdXI7XG4gICAgICAgICAgICBjdXIgPSBjdXIuYXNzaWduZWRTbG90IHx8IGN1ci5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1ci5ub2RlVHlwZSA9PSAxMSkge1xuICAgICAgICAgICAgY3VyID0gY3VyLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmNsYXNzIERPTVNlbGVjdGlvblN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hbmNob3JOb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbmNob3JPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmZvY3VzTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9jdXNPZmZzZXQgPSAwO1xuICAgIH1cbiAgICBlcShkb21TZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5jaG9yTm9kZSA9PSBkb21TZWwuYW5jaG9yTm9kZSAmJiB0aGlzLmFuY2hvck9mZnNldCA9PSBkb21TZWwuYW5jaG9yT2Zmc2V0ICYmXG4gICAgICAgICAgICB0aGlzLmZvY3VzTm9kZSA9PSBkb21TZWwuZm9jdXNOb2RlICYmIHRoaXMuZm9jdXNPZmZzZXQgPT0gZG9tU2VsLmZvY3VzT2Zmc2V0O1xuICAgIH1cbiAgICBzZXRSYW5nZShyYW5nZSkge1xuICAgICAgICBsZXQgeyBhbmNob3JOb2RlLCBmb2N1c05vZGUgfSA9IHJhbmdlO1xuICAgICAgICAvLyBDbGlwIG9mZnNldHMgdG8gbm9kZSBzaXplIHRvIGF2b2lkIGNyYXNoZXMgd2hlbiBTYWZhcmkgcmVwb3J0cyBib2d1cyBvZmZzZXRzICgjMTE1MilcbiAgICAgICAgdGhpcy5zZXQoYW5jaG9yTm9kZSwgTWF0aC5taW4ocmFuZ2UuYW5jaG9yT2Zmc2V0LCBhbmNob3JOb2RlID8gbWF4T2Zmc2V0KGFuY2hvck5vZGUpIDogMCksIGZvY3VzTm9kZSwgTWF0aC5taW4ocmFuZ2UuZm9jdXNPZmZzZXQsIGZvY3VzTm9kZSA/IG1heE9mZnNldChmb2N1c05vZGUpIDogMCkpO1xuICAgIH1cbiAgICBzZXQoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IGFuY2hvck5vZGU7XG4gICAgICAgIHRoaXMuYW5jaG9yT2Zmc2V0ID0gYW5jaG9yT2Zmc2V0O1xuICAgICAgICB0aGlzLmZvY3VzTm9kZSA9IGZvY3VzTm9kZTtcbiAgICAgICAgdGhpcy5mb2N1c09mZnNldCA9IGZvY3VzT2Zmc2V0O1xuICAgIH1cbn1cbmxldCBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gbnVsbDtcbi8vIEZlYXR1cmUtZGV0ZWN0cyBzdXBwb3J0IGZvciAuZm9jdXMoe3ByZXZlbnRTY3JvbGw6IHRydWV9KSwgYW5kIHVzZXNcbi8vIGEgZmFsbGJhY2sga2x1ZGdlIHdoZW4gbm90IHN1cHBvcnRlZC5cbmZ1bmN0aW9uIGZvY3VzUHJldmVudFNjcm9sbChkb20pIHtcbiAgICBpZiAoZG9tLnNldEFjdGl2ZSlcbiAgICAgICAgcmV0dXJuIGRvbS5zZXRBY3RpdmUoKTsgLy8gaW4gSUVcbiAgICBpZiAocHJldmVudFNjcm9sbFN1cHBvcnRlZClcbiAgICAgICAgcmV0dXJuIGRvbS5mb2N1cyhwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkKTtcbiAgICBsZXQgc3RhY2sgPSBbXTtcbiAgICBmb3IgKGxldCBjdXIgPSBkb207IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgc3RhY2sucHVzaChjdXIsIGN1ci5zY3JvbGxUb3AsIGN1ci5zY3JvbGxMZWZ0KTtcbiAgICAgICAgaWYgKGN1ciA9PSBjdXIub3duZXJEb2N1bWVudClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCA9PSBudWxsID8ge1xuICAgICAgICBnZXQgcHJldmVudFNjcm9sbCgpIHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSB7IHByZXZlbnRTY3JvbGw6IHRydWUgfTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKCFwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkKSB7XG4gICAgICAgIHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgZWx0ID0gc3RhY2tbaSsrXSwgdG9wID0gc3RhY2tbaSsrXSwgbGVmdCA9IHN0YWNrW2krK107XG4gICAgICAgICAgICBpZiAoZWx0LnNjcm9sbFRvcCAhPSB0b3ApXG4gICAgICAgICAgICAgICAgZWx0LnNjcm9sbFRvcCA9IHRvcDtcbiAgICAgICAgICAgIGlmIChlbHQuc2Nyb2xsTGVmdCAhPSBsZWZ0KVxuICAgICAgICAgICAgICAgIGVsdC5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmxldCBzY3JhdGNoUmFuZ2U7XG5mdW5jdGlvbiB0ZXh0UmFuZ2Uobm9kZSwgZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgbGV0IHJhbmdlID0gc2NyYXRjaFJhbmdlIHx8IChzY3JhdGNoUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpKTtcbiAgICByYW5nZS5zZXRFbmQobm9kZSwgdG8pO1xuICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGZyb20pO1xuICAgIHJldHVybiByYW5nZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoS2V5KGVsdCwgbmFtZSwgY29kZSkge1xuICAgIGxldCBvcHRpb25zID0geyBrZXk6IG5hbWUsIGNvZGU6IG5hbWUsIGtleUNvZGU6IGNvZGUsIHdoaWNoOiBjb2RlLCBjYW5jZWxhYmxlOiB0cnVlIH07XG4gICAgbGV0IGRvd24gPSBuZXcgS2V5Ym9hcmRFdmVudChcImtleWRvd25cIiwgb3B0aW9ucyk7XG4gICAgZG93bi5zeW50aGV0aWMgPSB0cnVlO1xuICAgIGVsdC5kaXNwYXRjaEV2ZW50KGRvd24pO1xuICAgIGxldCB1cCA9IG5ldyBLZXlib2FyZEV2ZW50KFwia2V5dXBcIiwgb3B0aW9ucyk7XG4gICAgdXAuc3ludGhldGljID0gdHJ1ZTtcbiAgICBlbHQuZGlzcGF0Y2hFdmVudCh1cCk7XG4gICAgcmV0dXJuIGRvd24uZGVmYXVsdFByZXZlbnRlZCB8fCB1cC5kZWZhdWx0UHJldmVudGVkO1xufVxuZnVuY3Rpb24gZ2V0Um9vdChub2RlKSB7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgJiYgKG5vZGUubm9kZVR5cGUgPT0gOSB8fCBub2RlLm5vZGVUeXBlID09IDExICYmIG5vZGUuaG9zdCkpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuYXNzaWduZWRTbG90IHx8IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjbGVhckF0dHJpYnV0ZXMobm9kZSkge1xuICAgIHdoaWxlIChub2RlLmF0dHJpYnV0ZXMubGVuZ3RoKVxuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZU5vZGUobm9kZS5hdHRyaWJ1dGVzWzBdKTtcbn1cbmZ1bmN0aW9uIGF0RWxlbWVudFN0YXJ0KGRvYywgc2VsZWN0aW9uKSB7XG4gICAgbGV0IG5vZGUgPSBzZWxlY3Rpb24uZm9jdXNOb2RlLCBvZmZzZXQgPSBzZWxlY3Rpb24uZm9jdXNPZmZzZXQ7XG4gICAgaWYgKCFub2RlIHx8IHNlbGVjdGlvbi5hbmNob3JOb2RlICE9IG5vZGUgfHwgc2VsZWN0aW9uLmFuY2hvck9mZnNldCAhPSBvZmZzZXQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBTYWZhcmkgY2FuIHJlcG9ydCBib2d1cyBvZmZzZXRzICgjMTE1MilcbiAgICBvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIG1heE9mZnNldChub2RlKSk7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAob2Zmc2V0KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgaWYgKHByZXYuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICBvZmZzZXQtLTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBwcmV2O1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IG1heE9mZnNldChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlID09IGRvYykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBpc1Njcm9sbGVkVG9Cb3R0b20oZWx0KSB7XG4gICAgcmV0dXJuIGVsdC5zY3JvbGxUb3AgPiBNYXRoLm1heCgxLCBlbHQuc2Nyb2xsSGVpZ2h0IC0gZWx0LmNsaWVudEhlaWdodCAtIDQpO1xufVxuXG5jbGFzcyBET01Qb3Mge1xuICAgIGNvbnN0cnVjdG9yKG5vZGUsIG9mZnNldCwgcHJlY2lzZSA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMucHJlY2lzZSA9IHByZWNpc2U7XG4gICAgfVxuICAgIHN0YXRpYyBiZWZvcmUoZG9tLCBwcmVjaXNlKSB7IHJldHVybiBuZXcgRE9NUG9zKGRvbS5wYXJlbnROb2RlLCBkb21JbmRleChkb20pLCBwcmVjaXNlKTsgfVxuICAgIHN0YXRpYyBhZnRlcihkb20sIHByZWNpc2UpIHsgcmV0dXJuIG5ldyBET01Qb3MoZG9tLnBhcmVudE5vZGUsIGRvbUluZGV4KGRvbSkgKyAxLCBwcmVjaXNlKTsgfVxufVxuY29uc3Qgbm9DaGlsZHJlbiA9IFtdO1xuY2xhc3MgQ29udGVudFZpZXcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuZG9tID0gbnVsbDtcbiAgICAgICAgdGhpcy5mbGFncyA9IDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovO1xuICAgIH1cbiAgICBnZXQgb3ZlcnJpZGVET01UZXh0KCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGdldCBwb3NBdFN0YXJ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5wb3NCZWZvcmUodGhpcykgOiAwO1xuICAgIH1cbiAgICBnZXQgcG9zQXRFbmQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc0F0U3RhcnQgKyB0aGlzLmxlbmd0aDtcbiAgICB9XG4gICAgcG9zQmVmb3JlKHZpZXcpIHtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMucG9zQXRTdGFydDtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGNoaWxkID09IHZpZXcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgICAgIHBvcyArPSBjaGlsZC5sZW5ndGggKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBjaGlsZCBpbiBwb3NCZWZvcmVcIik7XG4gICAgfVxuICAgIHBvc0FmdGVyKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zQmVmb3JlKHZpZXcpICsgdmlldy5sZW5ndGg7XG4gICAgfVxuICAgIHN5bmModmlldywgdHJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLykge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMuZG9tO1xuICAgICAgICAgICAgbGV0IHByZXYgPSBudWxsLCBuZXh0O1xuICAgICAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5mbGFncyAmIDcgLyogVmlld0ZsYWcuRGlydHkgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5kb20gJiYgKG5leHQgPSBwcmV2ID8gcHJldi5uZXh0U2libGluZyA6IHBhcmVudC5maXJzdENoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRWaWV3ID0gQ29udGVudFZpZXcuZ2V0KG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50VmlldyB8fCAhY29udGVudFZpZXcucGFyZW50ICYmIGNvbnRlbnRWaWV3LmNhblJldXNlRE9NKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5yZXVzZURPTShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5zeW5jKHZpZXcsIHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuZmxhZ3MgJj0gfjcgLyogVmlld0ZsYWcuRGlydHkgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHQgPSBwcmV2ID8gcHJldi5uZXh0U2libGluZyA6IHBhcmVudC5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIGlmICh0cmFjayAmJiAhdHJhY2sud3JpdHRlbiAmJiB0cmFjay5ub2RlID09IHBhcmVudCAmJiBuZXh0ICE9IGNoaWxkLmRvbSlcbiAgICAgICAgICAgICAgICAgICAgdHJhY2sud3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmRvbS5wYXJlbnROb2RlID09IHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCAmJiBuZXh0ICE9IGNoaWxkLmRvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBybSQxKG5leHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZC5kb20sIG5leHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmV2ID0gY2hpbGQuZG9tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dCA9IHByZXYgPyBwcmV2Lm5leHRTaWJsaW5nIDogcGFyZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBpZiAobmV4dCAmJiB0cmFjayAmJiB0cmFjay5ub2RlID09IHBhcmVudClcbiAgICAgICAgICAgICAgICB0cmFjay53cml0dGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHdoaWxlIChuZXh0KVxuICAgICAgICAgICAgICAgIG5leHQgPSBybSQxKG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZmxhZ3MgJiAxIC8qIFZpZXdGbGFnLkNoaWxkRGlydHkgKi8pIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLykge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5zeW5jKHZpZXcsIHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuZmxhZ3MgJj0gfjcgLyogVmlld0ZsYWcuRGlydHkgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldXNlRE9NKF9kb20pIHsgfVxuICAgIGxvY2FsUG9zRnJvbURPTShub2RlLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IGFmdGVyO1xuICAgICAgICBpZiAobm9kZSA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgYWZ0ZXIgPSB0aGlzLmRvbS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgYmlhcyA9IG1heE9mZnNldChub2RlKSA9PSAwID8gMCA6IG9mZnNldCA9PSAwID8gLTEgOiAxO1xuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudCA9PSB0aGlzLmRvbSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGJpYXMgPT0gMCAmJiBwYXJlbnQuZmlyc3RDaGlsZCAhPSBwYXJlbnQubGFzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlID09IHBhcmVudC5maXJzdENoaWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgYmlhcyA9IC0xO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBiaWFzID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiaWFzIDwgMClcbiAgICAgICAgICAgICAgICBhZnRlciA9IG5vZGU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhZnRlciA9PSB0aGlzLmRvbS5maXJzdENoaWxkKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIHdoaWxlIChhZnRlciAmJiAhQ29udGVudFZpZXcuZ2V0KGFmdGVyKSlcbiAgICAgICAgICAgIGFmdGVyID0gYWZ0ZXIubmV4dFNpYmxpbmc7XG4gICAgICAgIGlmICghYWZ0ZXIpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGNoaWxkLmRvbSA9PSBhZnRlcilcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgICAgcG9zICs9IGNoaWxkLmxlbmd0aCArIGNoaWxkLmJyZWFrQWZ0ZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZG9tQm91bmRzQXJvdW5kKGZyb20sIHRvLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGxldCBmcm9tSSA9IC0xLCBmcm9tU3RhcnQgPSAtMSwgdG9JID0gLTEsIHRvRW5kID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSBvZmZzZXQsIHByZXZFbmQgPSBvZmZzZXQ7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBwb3MgKyBjaGlsZC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAocG9zIDwgZnJvbSAmJiBlbmQgPiB0bylcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuZG9tQm91bmRzQXJvdW5kKGZyb20sIHRvLCBwb3MpO1xuICAgICAgICAgICAgaWYgKGVuZCA+PSBmcm9tICYmIGZyb21JID09IC0xKSB7XG4gICAgICAgICAgICAgICAgZnJvbUkgPSBpO1xuICAgICAgICAgICAgICAgIGZyb21TdGFydCA9IHBvcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgPiB0byAmJiBjaGlsZC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHRvSSA9IGk7XG4gICAgICAgICAgICAgICAgdG9FbmQgPSBwcmV2RW5kO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldkVuZCA9IGVuZDtcbiAgICAgICAgICAgIHBvcyA9IGVuZCArIGNoaWxkLmJyZWFrQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZnJvbTogZnJvbVN0YXJ0LCB0bzogdG9FbmQgPCAwID8gb2Zmc2V0ICsgdGhpcy5sZW5ndGggOiB0b0VuZCxcbiAgICAgICAgICAgIHN0YXJ0RE9NOiAoZnJvbUkgPyB0aGlzLmNoaWxkcmVuW2Zyb21JIC0gMV0uZG9tLm5leHRTaWJsaW5nIDogbnVsbCkgfHwgdGhpcy5kb20uZmlyc3RDaGlsZCxcbiAgICAgICAgICAgIGVuZERPTTogdG9JIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGggJiYgdG9JID49IDAgPyB0aGlzLmNoaWxkcmVuW3RvSV0uZG9tIDogbnVsbCB9O1xuICAgIH1cbiAgICBtYXJrRGlydHkoYW5kUGFyZW50ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5mbGFncyB8PSAyIC8qIFZpZXdGbGFnLk5vZGVEaXJ0eSAqLztcbiAgICAgICAgdGhpcy5tYXJrUGFyZW50c0RpcnR5KGFuZFBhcmVudCk7XG4gICAgfVxuICAgIG1hcmtQYXJlbnRzRGlydHkoY2hpbGRMaXN0KSB7XG4gICAgICAgIGZvciAobGV0IHBhcmVudCA9IHRoaXMucGFyZW50OyBwYXJlbnQ7IHBhcmVudCA9IHBhcmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZExpc3QpXG4gICAgICAgICAgICAgICAgcGFyZW50LmZsYWdzIHw9IDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovO1xuICAgICAgICAgICAgaWYgKHBhcmVudC5mbGFncyAmIDEgLyogVmlld0ZsYWcuQ2hpbGREaXJ0eSAqLylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBwYXJlbnQuZmxhZ3MgfD0gMSAvKiBWaWV3RmxhZy5DaGlsZERpcnR5ICovO1xuICAgICAgICAgICAgY2hpbGRMaXN0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0UGFyZW50KHBhcmVudCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQgIT0gcGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgICAgIGlmICh0aGlzLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLylcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtQYXJlbnRzRGlydHkodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0RE9NKGRvbSkge1xuICAgICAgICBpZiAodGhpcy5kb20gPT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLmRvbS5jbVZpZXcgPSBudWxsO1xuICAgICAgICB0aGlzLmRvbSA9IGRvbTtcbiAgICAgICAgZG9tLmNtVmlldyA9IHRoaXM7XG4gICAgfVxuICAgIGdldCByb290VmlldygpIHtcbiAgICAgICAgZm9yIChsZXQgdiA9IHRoaXM7Oykge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHYucGFyZW50O1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICB2ID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2VDaGlsZHJlbihmcm9tLCB0bywgY2hpbGRyZW4gPSBub0NoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMubWFya0RpcnR5KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tOyBpIDwgdG87IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjaGlsZC5wYXJlbnQgPT0gdGhpcyAmJiBjaGlsZHJlbi5pbmRleE9mKGNoaWxkKSA8IDApXG4gICAgICAgICAgICAgICAgY2hpbGQuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKGZyb20sIHRvIC0gZnJvbSwgLi4uY2hpbGRyZW4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgY2hpbGRyZW5baV0uc2V0UGFyZW50KHRoaXMpO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihfcmVjKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlnbm9yZUV2ZW50KF9ldmVudCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBjaGlsZEN1cnNvcihwb3MgPSB0aGlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IENoaWxkQ3Vyc29yKHRoaXMuY2hpbGRyZW4sIHBvcywgdGhpcy5jaGlsZHJlbi5sZW5ndGgpO1xuICAgIH1cbiAgICBjaGlsZFBvcyhwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkQ3Vyc29yKCkuZmluZFBvcyhwb3MsIGJpYXMpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IG5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWUucmVwbGFjZShcIlZpZXdcIiwgXCJcIik7XG4gICAgICAgIHJldHVybiBuYW1lICsgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID8gXCIoXCIgKyB0aGlzLmNoaWxkcmVuLmpvaW4oKSArIFwiKVwiIDpcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID8gXCJbXCIgKyAobmFtZSA9PSBcIlRleHRcIiA/IHRoaXMudGV4dCA6IHRoaXMubGVuZ3RoKSArIFwiXVwiIDogXCJcIikgK1xuICAgICAgICAgICAgKHRoaXMuYnJlYWtBZnRlciA/IFwiI1wiIDogXCJcIik7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQobm9kZSkgeyByZXR1cm4gbm9kZS5jbVZpZXc7IH1cbiAgICBnZXQgaXNFZGl0YWJsZSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBnZXQgaXNXaWRnZXQoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGdldCBpc0hpZGRlbigpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSwgaGFzU3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGJlY29tZShvdGhlcikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBjYW5SZXVzZURPTShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIuY29uc3RydWN0b3IgPT0gdGhpcy5jb25zdHJ1Y3RvciAmJiAhKCh0aGlzLmZsYWdzIHwgb3RoZXIuZmxhZ3MpICYgOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLyk7XG4gICAgfVxuICAgIC8vIFdoZW4gdGhpcyBpcyBhIHplcm8tbGVuZ3RoIHZpZXcgd2l0aCBhIHNpZGUsIHRoaXMgc2hvdWxkIHJldHVybiBhXG4gICAgLy8gbnVtYmVyIDw9IDAgdG8gaW5kaWNhdGUgaXQgaXMgYmVmb3JlIGl0cyBwb3NpdGlvbiwgb3IgYVxuICAgIC8vIG51bWJlciA+IDAgd2hlbiBhZnRlciBpdHMgcG9zaXRpb24uXG4gICAgZ2V0U2lkZSgpIHsgcmV0dXJuIDA7IH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKVxuICAgICAgICAgICAgaWYgKGNoaWxkLnBhcmVudCA9PSB0aGlzKVxuICAgICAgICAgICAgICAgIGNoaWxkLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgIH1cbn1cbkNvbnRlbnRWaWV3LnByb3RvdHlwZS5icmVha0FmdGVyID0gMDtcbi8vIFJlbW92ZSBhIERPTSBub2RlIGFuZCByZXR1cm4gaXRzIG5leHQgc2libGluZy5cbmZ1bmN0aW9uIHJtJDEoZG9tKSB7XG4gICAgbGV0IG5leHQgPSBkb20ubmV4dFNpYmxpbmc7XG4gICAgZG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tKTtcbiAgICByZXR1cm4gbmV4dDtcbn1cbmNsYXNzIENoaWxkQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihjaGlsZHJlbiwgcG9zLCBpKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuaSA9IGk7XG4gICAgICAgIHRoaXMub2ZmID0gMDtcbiAgICB9XG4gICAgZmluZFBvcyhwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmIChwb3MgPiB0aGlzLnBvcyB8fCBwb3MgPT0gdGhpcy5wb3MgJiZcbiAgICAgICAgICAgICAgICAoYmlhcyA+IDAgfHwgdGhpcy5pID09IDAgfHwgdGhpcy5jaGlsZHJlblt0aGlzLmkgLSAxXS5icmVha0FmdGVyKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub2ZmID0gcG9zIC0gdGhpcy5wb3M7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuY2hpbGRyZW5bLS10aGlzLmldO1xuICAgICAgICAgICAgdGhpcy5wb3MgLT0gbmV4dC5sZW5ndGggKyBuZXh0LmJyZWFrQWZ0ZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiByZXBsYWNlUmFuZ2UocGFyZW50LCBmcm9tSSwgZnJvbU9mZiwgdG9JLCB0b09mZiwgaW5zZXJ0LCBicmVha0F0U3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgIGxldCB7IGNoaWxkcmVuIH0gPSBwYXJlbnQ7XG4gICAgbGV0IGJlZm9yZSA9IGNoaWxkcmVuLmxlbmd0aCA/IGNoaWxkcmVuW2Zyb21JXSA6IG51bGw7XG4gICAgbGV0IGxhc3QgPSBpbnNlcnQubGVuZ3RoID8gaW5zZXJ0W2luc2VydC5sZW5ndGggLSAxXSA6IG51bGw7XG4gICAgbGV0IGJyZWFrQXRFbmQgPSBsYXN0ID8gbGFzdC5icmVha0FmdGVyIDogYnJlYWtBdFN0YXJ0O1xuICAgIC8vIENoYW5nZSB3aXRoaW4gYSBzaW5nbGUgY2hpbGRcbiAgICBpZiAoZnJvbUkgPT0gdG9JICYmIGJlZm9yZSAmJiAhYnJlYWtBdFN0YXJ0ICYmICFicmVha0F0RW5kICYmIGluc2VydC5sZW5ndGggPCAyICYmXG4gICAgICAgIGJlZm9yZS5tZXJnZShmcm9tT2ZmLCB0b09mZiwgaW5zZXJ0Lmxlbmd0aCA/IGxhc3QgOiBudWxsLCBmcm9tT2ZmID09IDAsIG9wZW5TdGFydCwgb3BlbkVuZCkpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAodG9JIDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIGxldCBhZnRlciA9IGNoaWxkcmVuW3RvSV07XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZW5kIG9mIHRoZSBjaGlsZCBhZnRlciB0aGUgdXBkYXRlIGlzIHByZXNlcnZlZCBpbiBgYWZ0ZXJgXG4gICAgICAgIGlmIChhZnRlciAmJiAodG9PZmYgPCBhZnRlci5sZW5ndGggfHwgYWZ0ZXIuYnJlYWtBZnRlciAmJiAobGFzdCA9PT0gbnVsbCB8fCBsYXN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsYXN0LmJyZWFrQWZ0ZXIpKSkge1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgc3BsaXR0aW5nIGEgY2hpbGQsIHNlcGFyYXRlIHBhcnQgb2YgaXQgdG8gYXZvaWQgdGhhdFxuICAgICAgICAgICAgLy8gYmVpbmcgbWFuZ2xlZCB3aGVuIHVwZGF0aW5nIHRoZSBjaGlsZCBiZWZvcmUgdGhlIHVwZGF0ZS5cbiAgICAgICAgICAgIGlmIChmcm9tSSA9PSB0b0kpIHtcbiAgICAgICAgICAgICAgICBhZnRlciA9IGFmdGVyLnNwbGl0KHRvT2ZmKTtcbiAgICAgICAgICAgICAgICB0b09mZiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBhZnRlciB0aGUgcmVwbGFjZW1lbnQgc2hvdWxkIGJlIG1lcmdlZCB3aXRoXG4gICAgICAgICAgICAvLyB0aGUgbGFzdCByZXBsYWNpbmcgZWxlbWVudCwgdXBkYXRlIGBjb250ZW50YFxuICAgICAgICAgICAgaWYgKCFicmVha0F0RW5kICYmIGxhc3QgJiYgYWZ0ZXIubWVyZ2UoMCwgdG9PZmYsIGxhc3QsIHRydWUsIDAsIG9wZW5FbmQpKSB7XG4gICAgICAgICAgICAgICAgaW5zZXJ0W2luc2VydC5sZW5ndGggLSAxXSA9IGFmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzdGFydCBvZiB0aGUgYWZ0ZXIgZWxlbWVudCwgaWYgbmVjZXNzYXJ5LCBhbmRcbiAgICAgICAgICAgICAgICAvLyBhZGQgaXQgdG8gYGNvbnRlbnRgLlxuICAgICAgICAgICAgICAgIGlmICh0b09mZiB8fCBhZnRlci5jaGlsZHJlbi5sZW5ndGggJiYgIWFmdGVyLmNoaWxkcmVuWzBdLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIubWVyZ2UoMCwgdG9PZmYsIG51bGwsIGZhbHNlLCAwLCBvcGVuRW5kKTtcbiAgICAgICAgICAgICAgICBpbnNlcnQucHVzaChhZnRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWZ0ZXIgPT09IG51bGwgfHwgYWZ0ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFmdGVyLmJyZWFrQWZ0ZXIpIHtcbiAgICAgICAgICAgIC8vIFRoZSBlbGVtZW50IGF0IGB0b0lgIGlzIGVudGlyZWx5IGNvdmVyZWQgYnkgdGhpcyByYW5nZS5cbiAgICAgICAgICAgIC8vIFByZXNlcnZlIGl0cyBsaW5lIGJyZWFrLCBpZiBhbnkuXG4gICAgICAgICAgICBpZiAobGFzdClcbiAgICAgICAgICAgICAgICBsYXN0LmJyZWFrQWZ0ZXIgPSAxO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGJyZWFrQXRTdGFydCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2luY2Ugd2UndmUgaGFuZGxlZCB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIGN1cnJlbnQgZWxlbWVudHNcbiAgICAgICAgLy8gbm93LCBtYWtlIHN1cmUgYHRvSWAgcG9pbnRzIGFmdGVyIHRoYXQuXG4gICAgICAgIHRvSSsrO1xuICAgIH1cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICAgIGJlZm9yZS5icmVha0FmdGVyID0gYnJlYWtBdFN0YXJ0O1xuICAgICAgICBpZiAoZnJvbU9mZiA+IDApIHtcbiAgICAgICAgICAgIGlmICghYnJlYWtBdFN0YXJ0ICYmIGluc2VydC5sZW5ndGggJiYgYmVmb3JlLm1lcmdlKGZyb21PZmYsIGJlZm9yZS5sZW5ndGgsIGluc2VydFswXSwgZmFsc2UsIG9wZW5TdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICBiZWZvcmUuYnJlYWtBZnRlciA9IGluc2VydC5zaGlmdCgpLmJyZWFrQWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChmcm9tT2ZmIDwgYmVmb3JlLmxlbmd0aCB8fCBiZWZvcmUuY2hpbGRyZW4ubGVuZ3RoICYmIGJlZm9yZS5jaGlsZHJlbltiZWZvcmUuY2hpbGRyZW4ubGVuZ3RoIC0gMV0ubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICBiZWZvcmUubWVyZ2UoZnJvbU9mZiwgYmVmb3JlLmxlbmd0aCwgbnVsbCwgZmFsc2UsIG9wZW5TdGFydCwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcm9tSSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyeSB0byBtZXJnZSB3aWRnZXRzIG9uIHRoZSBib3VuZGFyaWVzIG9mIHRoZSByZXBsYWNlbWVudFxuICAgIHdoaWxlIChmcm9tSSA8IHRvSSAmJiBpbnNlcnQubGVuZ3RoKSB7XG4gICAgICAgIGlmIChjaGlsZHJlblt0b0kgLSAxXS5iZWNvbWUoaW5zZXJ0W2luc2VydC5sZW5ndGggLSAxXSkpIHtcbiAgICAgICAgICAgIHRvSS0tO1xuICAgICAgICAgICAgaW5zZXJ0LnBvcCgpO1xuICAgICAgICAgICAgb3BlbkVuZCA9IGluc2VydC5sZW5ndGggPyAwIDogb3BlblN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkcmVuW2Zyb21JXS5iZWNvbWUoaW5zZXJ0WzBdKSkge1xuICAgICAgICAgICAgZnJvbUkrKztcbiAgICAgICAgICAgIGluc2VydC5zaGlmdCgpO1xuICAgICAgICAgICAgb3BlblN0YXJ0ID0gaW5zZXJ0Lmxlbmd0aCA/IDAgOiBvcGVuRW5kO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpbnNlcnQubGVuZ3RoICYmIGZyb21JICYmIHRvSSA8IGNoaWxkcmVuLmxlbmd0aCAmJiAhY2hpbGRyZW5bZnJvbUkgLSAxXS5icmVha0FmdGVyICYmXG4gICAgICAgIGNoaWxkcmVuW3RvSV0ubWVyZ2UoMCwgMCwgY2hpbGRyZW5bZnJvbUkgLSAxXSwgZmFsc2UsIG9wZW5TdGFydCwgb3BlbkVuZCkpXG4gICAgICAgIGZyb21JLS07XG4gICAgaWYgKGZyb21JIDwgdG9JIHx8IGluc2VydC5sZW5ndGgpXG4gICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGRyZW4oZnJvbUksIHRvSSwgaW5zZXJ0KTtcbn1cbmZ1bmN0aW9uIG1lcmdlQ2hpbGRyZW5JbnRvKHBhcmVudCwgZnJvbSwgdG8sIGluc2VydCwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgbGV0IGN1ciA9IHBhcmVudC5jaGlsZEN1cnNvcigpO1xuICAgIGxldCB7IGk6IHRvSSwgb2ZmOiB0b09mZiB9ID0gY3VyLmZpbmRQb3ModG8sIDEpO1xuICAgIGxldCB7IGk6IGZyb21JLCBvZmY6IGZyb21PZmYgfSA9IGN1ci5maW5kUG9zKGZyb20sIC0xKTtcbiAgICBsZXQgZExlbiA9IGZyb20gLSB0bztcbiAgICBmb3IgKGxldCB2aWV3IG9mIGluc2VydClcbiAgICAgICAgZExlbiArPSB2aWV3Lmxlbmd0aDtcbiAgICBwYXJlbnQubGVuZ3RoICs9IGRMZW47XG4gICAgcmVwbGFjZVJhbmdlKHBhcmVudCwgZnJvbUksIGZyb21PZmYsIHRvSSwgdG9PZmYsIGluc2VydCwgMCwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbn1cblxubGV0IG5hdiA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiA/IG5hdmlnYXRvciA6IHsgdXNlckFnZW50OiBcIlwiLCB2ZW5kb3I6IFwiXCIsIHBsYXRmb3JtOiBcIlwiIH07XG5sZXQgZG9jID0gdHlwZW9mIGRvY3VtZW50ICE9IFwidW5kZWZpbmVkXCIgPyBkb2N1bWVudCA6IHsgZG9jdW1lbnRFbGVtZW50OiB7IHN0eWxlOiB7fSB9IH07XG5jb25zdCBpZV9lZGdlID0gLypAX19QVVJFX18qLy9FZGdlXFwvKFxcZCspLy5leGVjKG5hdi51c2VyQWdlbnQpO1xuY29uc3QgaWVfdXB0bzEwID0gLypAX19QVVJFX18qLy9NU0lFIFxcZC8udGVzdChuYXYudXNlckFnZW50KTtcbmNvbnN0IGllXzExdXAgPSAvKkBfX1BVUkVfXyovL1RyaWRlbnRcXC8oPzpbNy05XXxcXGR7Mix9KVxcLi4qcnY6KFxcZCspLy5leGVjKG5hdi51c2VyQWdlbnQpO1xuY29uc3QgaWUgPSAhIShpZV91cHRvMTAgfHwgaWVfMTF1cCB8fCBpZV9lZGdlKTtcbmNvbnN0IGdlY2tvID0gIWllICYmIC8qQF9fUFVSRV9fKi8vZ2Vja29cXC8oXFxkKykvaS50ZXN0KG5hdi51c2VyQWdlbnQpO1xuY29uc3QgY2hyb21lID0gIWllICYmIC8qQF9fUFVSRV9fKi8vQ2hyb21lXFwvKFxcZCspLy5leGVjKG5hdi51c2VyQWdlbnQpO1xuY29uc3Qgd2Via2l0ID0gXCJ3ZWJraXRGb250U21vb3RoaW5nXCIgaW4gZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZTtcbmNvbnN0IHNhZmFyaSA9ICFpZSAmJiAvKkBfX1BVUkVfXyovL0FwcGxlIENvbXB1dGVyLy50ZXN0KG5hdi52ZW5kb3IpO1xuY29uc3QgaW9zID0gc2FmYXJpICYmICgvKkBfX1BVUkVfXyovL01vYmlsZVxcL1xcdysvLnRlc3QobmF2LnVzZXJBZ2VudCkgfHwgbmF2Lm1heFRvdWNoUG9pbnRzID4gMik7XG52YXIgYnJvd3NlciA9IHtcbiAgICBtYWM6IGlvcyB8fCAvKkBfX1BVUkVfXyovL01hYy8udGVzdChuYXYucGxhdGZvcm0pLFxuICAgIHdpbmRvd3M6IC8qQF9fUFVSRV9fKi8vV2luLy50ZXN0KG5hdi5wbGF0Zm9ybSksXG4gICAgbGludXg6IC8qQF9fUFVSRV9fKi8vTGludXh8WDExLy50ZXN0KG5hdi5wbGF0Zm9ybSksXG4gICAgaWUsXG4gICAgaWVfdmVyc2lvbjogaWVfdXB0bzEwID8gZG9jLmRvY3VtZW50TW9kZSB8fCA2IDogaWVfMTF1cCA/ICtpZV8xMXVwWzFdIDogaWVfZWRnZSA/ICtpZV9lZGdlWzFdIDogMCxcbiAgICBnZWNrbyxcbiAgICBnZWNrb192ZXJzaW9uOiBnZWNrbyA/ICsoLypAX19QVVJFX18qLy9GaXJlZm94XFwvKFxcZCspLy5leGVjKG5hdi51c2VyQWdlbnQpIHx8IFswLCAwXSlbMV0gOiAwLFxuICAgIGNocm9tZTogISFjaHJvbWUsXG4gICAgY2hyb21lX3ZlcnNpb246IGNocm9tZSA/ICtjaHJvbWVbMV0gOiAwLFxuICAgIGlvcyxcbiAgICBhbmRyb2lkOiAvKkBfX1BVUkVfXyovL0FuZHJvaWRcXGIvLnRlc3QobmF2LnVzZXJBZ2VudCksXG4gICAgd2Via2l0LFxuICAgIHNhZmFyaSxcbiAgICB3ZWJraXRfdmVyc2lvbjogd2Via2l0ID8gKygvKkBfX1BVUkVfXyovL1xcYkFwcGxlV2ViS2l0XFwvKFxcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IFswLCAwXSlbMV0gOiAwLFxuICAgIHRhYlNpemU6IGRvYy5kb2N1bWVudEVsZW1lbnQuc3R5bGUudGFiU2l6ZSAhPSBudWxsID8gXCJ0YWItc2l6ZVwiIDogXCItbW96LXRhYi1zaXplXCJcbn07XG5cbmNvbnN0IE1heEpvaW5MZW4gPSAyNTY7XG5jbGFzcyBUZXh0VmlldyBleHRlbmRzIENvbnRlbnRWaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih0ZXh0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgfVxuICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLnRleHQubGVuZ3RoOyB9XG4gICAgY3JlYXRlRE9NKHRleHRET00pIHtcbiAgICAgICAgdGhpcy5zZXRET00odGV4dERPTSB8fCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLnRleHQpKTtcbiAgICB9XG4gICAgc3luYyh2aWV3LCB0cmFjaykge1xuICAgICAgICBpZiAoIXRoaXMuZG9tKVxuICAgICAgICAgICAgdGhpcy5jcmVhdGVET00oKTtcbiAgICAgICAgaWYgKHRoaXMuZG9tLm5vZGVWYWx1ZSAhPSB0aGlzLnRleHQpIHtcbiAgICAgICAgICAgIGlmICh0cmFjayAmJiB0cmFjay5ub2RlID09IHRoaXMuZG9tKVxuICAgICAgICAgICAgICAgIHRyYWNrLndyaXR0ZW4gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kb20ubm9kZVZhbHVlID0gdGhpcy50ZXh0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldXNlRE9NKGRvbSkge1xuICAgICAgICBpZiAoZG9tLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZURPTShkb20pO1xuICAgIH1cbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlKSB7XG4gICAgICAgIGlmICgodGhpcy5mbGFncyAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pIHx8XG4gICAgICAgICAgICBzb3VyY2UgJiYgKCEoc291cmNlIGluc3RhbmNlb2YgVGV4dFZpZXcpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggLSAodG8gLSBmcm9tKSArIHNvdXJjZS5sZW5ndGggPiBNYXhKb2luTGVuIHx8XG4gICAgICAgICAgICAgICAgKHNvdXJjZS5mbGFncyAmIDggLyogVmlld0ZsYWcuQ29tcG9zaXRpb24gKi8pKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnNsaWNlKDAsIGZyb20pICsgKHNvdXJjZSA/IHNvdXJjZS50ZXh0IDogXCJcIikgKyB0aGlzLnRleHQuc2xpY2UodG8pO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3BsaXQoZnJvbSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFRleHRWaWV3KHRoaXMudGV4dC5zbGljZShmcm9tKSk7XG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5zbGljZSgwLCBmcm9tKTtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgcmVzdWx0LmZsYWdzIHw9IHRoaXMuZmxhZ3MgJiA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBsb2NhbFBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBub2RlID09IHRoaXMuZG9tID8gb2Zmc2V0IDogb2Zmc2V0ID8gdGhpcy50ZXh0Lmxlbmd0aCA6IDA7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykgeyByZXR1cm4gbmV3IERPTVBvcyh0aGlzLmRvbSwgcG9zKTsgfVxuICAgIGRvbUJvdW5kc0Fyb3VuZChfZnJvbSwgX3RvLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHsgZnJvbTogb2Zmc2V0LCB0bzogb2Zmc2V0ICsgdGhpcy5sZW5ndGgsIHN0YXJ0RE9NOiB0aGlzLmRvbSwgZW5kRE9NOiB0aGlzLmRvbS5uZXh0U2libGluZyB9O1xuICAgIH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgcmV0dXJuIHRleHRDb29yZHModGhpcy5kb20sIHBvcywgc2lkZSk7XG4gICAgfVxufVxuY2xhc3MgTWFya1ZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3IobWFyaywgY2hpbGRyZW4gPSBbXSwgbGVuZ3RoID0gMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBjaCBvZiBjaGlsZHJlbilcbiAgICAgICAgICAgIGNoLnNldFBhcmVudCh0aGlzKTtcbiAgICB9XG4gICAgc2V0QXR0cnMoZG9tKSB7XG4gICAgICAgIGNsZWFyQXR0cmlidXRlcyhkb20pO1xuICAgICAgICBpZiAodGhpcy5tYXJrLmNsYXNzKVxuICAgICAgICAgICAgZG9tLmNsYXNzTmFtZSA9IHRoaXMubWFyay5jbGFzcztcbiAgICAgICAgaWYgKHRoaXMubWFyay5hdHRycylcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5tYXJrLmF0dHJzKVxuICAgICAgICAgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUobmFtZSwgdGhpcy5tYXJrLmF0dHJzW25hbWVdKTtcbiAgICAgICAgcmV0dXJuIGRvbTtcbiAgICB9XG4gICAgY2FuUmV1c2VET00ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmNhblJldXNlRE9NKG90aGVyKSAmJiAhKCh0aGlzLmZsYWdzIHwgb3RoZXIuZmxhZ3MpICYgOCAvKiBWaWV3RmxhZy5Db21wb3NpdGlvbiAqLyk7XG4gICAgfVxuICAgIHJldXNlRE9NKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gdGhpcy5tYXJrLnRhZ05hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRET00obm9kZSk7XG4gICAgICAgICAgICB0aGlzLmZsYWdzIHw9IDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLyB8IDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN5bmModmlldywgdHJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSlcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKHRoaXMuc2V0QXR0cnMoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLm1hcmsudGFnTmFtZSkpKTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5mbGFncyAmIDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLylcbiAgICAgICAgICAgIHRoaXMuc2V0QXR0cnModGhpcy5kb20pO1xuICAgICAgICBzdXBlci5zeW5jKHZpZXcsIHRyYWNrKTtcbiAgICB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSwgX2hhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiAoIShzb3VyY2UgaW5zdGFuY2VvZiBNYXJrVmlldyAmJiBzb3VyY2UubWFyay5lcSh0aGlzLm1hcmspKSB8fFxuICAgICAgICAgICAgKGZyb20gJiYgb3BlblN0YXJ0IDw9IDApIHx8ICh0byA8IHRoaXMubGVuZ3RoICYmIG9wZW5FbmQgPD0gMCkpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBtZXJnZUNoaWxkcmVuSW50byh0aGlzLCBmcm9tLCB0bywgc291cmNlID8gc291cmNlLmNoaWxkcmVuLnNsaWNlKCkgOiBbXSwgb3BlblN0YXJ0IC0gMSwgb3BlbkVuZCAtIDEpO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3BsaXQoZnJvbSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW10sIG9mZiA9IDAsIGRldGFjaEZyb20gPSAtMSwgaSA9IDA7XG4gICAgICAgIGZvciAobGV0IGVsdCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBsZXQgZW5kID0gb2ZmICsgZWx0Lmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPiBmcm9tKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9mZiA8IGZyb20gPyBlbHQuc3BsaXQoZnJvbSAtIG9mZikgOiBlbHQpO1xuICAgICAgICAgICAgaWYgKGRldGFjaEZyb20gPCAwICYmIG9mZiA+PSBmcm9tKVxuICAgICAgICAgICAgICAgIGRldGFjaEZyb20gPSBpO1xuICAgICAgICAgICAgb2ZmID0gZW5kO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsZW5ndGggPSB0aGlzLmxlbmd0aCAtIGZyb207XG4gICAgICAgIHRoaXMubGVuZ3RoID0gZnJvbTtcbiAgICAgICAgaWYgKGRldGFjaEZyb20gPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5sZW5ndGggPSBkZXRhY2hGcm9tO1xuICAgICAgICAgICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1hcmtWaWV3KHRoaXMubWFyaywgcmVzdWx0LCBsZW5ndGgpO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIGlubGluZURPTUF0UG9zKHRoaXMsIHBvcyk7XG4gICAgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICByZXR1cm4gY29vcmRzSW5DaGlsZHJlbih0aGlzLCBwb3MsIHNpZGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRleHRDb29yZHModGV4dCwgcG9zLCBzaWRlKSB7XG4gICAgbGV0IGxlbmd0aCA9IHRleHQubm9kZVZhbHVlLmxlbmd0aDtcbiAgICBpZiAocG9zID4gbGVuZ3RoKVxuICAgICAgICBwb3MgPSBsZW5ndGg7XG4gICAgbGV0IGZyb20gPSBwb3MsIHRvID0gcG9zLCBmbGF0dGVuID0gMDtcbiAgICBpZiAocG9zID09IDAgJiYgc2lkZSA8IDAgfHwgcG9zID09IGxlbmd0aCAmJiBzaWRlID49IDApIHtcbiAgICAgICAgaWYgKCEoYnJvd3Nlci5jaHJvbWUgfHwgYnJvd3Nlci5nZWNrbykpIHsgLy8gVGhlc2UgYnJvd3NlcnMgcmVsaWFibHkgcmV0dXJuIHZhbGlkIHJlY3RhbmdsZXMgZm9yIGVtcHR5IHJhbmdlc1xuICAgICAgICAgICAgaWYgKHBvcykge1xuICAgICAgICAgICAgICAgIGZyb20tLTtcbiAgICAgICAgICAgICAgICBmbGF0dGVuID0gMTtcbiAgICAgICAgICAgIH0gLy8gRklYTUUgdGhpcyBpcyB3cm9uZyBpbiBSVEwgdGV4dFxuICAgICAgICAgICAgZWxzZSBpZiAodG8gPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0bysrO1xuICAgICAgICAgICAgICAgIGZsYXR0ZW4gPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKHNpZGUgPCAwKVxuICAgICAgICAgICAgZnJvbS0tO1xuICAgICAgICBlbHNlIGlmICh0byA8IGxlbmd0aClcbiAgICAgICAgICAgIHRvKys7XG4gICAgfVxuICAgIGxldCByZWN0cyA9IHRleHRSYW5nZSh0ZXh0LCBmcm9tLCB0bykuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBpZiAoIXJlY3RzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHJlY3QgPSByZWN0c1soZmxhdHRlbiA/IGZsYXR0ZW4gPCAwIDogc2lkZSA+PSAwKSA/IDAgOiByZWN0cy5sZW5ndGggLSAxXTtcbiAgICBpZiAoYnJvd3Nlci5zYWZhcmkgJiYgIWZsYXR0ZW4gJiYgcmVjdC53aWR0aCA9PSAwKVxuICAgICAgICByZWN0ID0gQXJyYXkucHJvdG90eXBlLmZpbmQuY2FsbChyZWN0cywgciA9PiByLndpZHRoKSB8fCByZWN0O1xuICAgIHJldHVybiBmbGF0dGVuID8gZmxhdHRlblJlY3QocmVjdCwgZmxhdHRlbiA8IDApIDogcmVjdCB8fCBudWxsO1xufVxuLy8gQWxzbyB1c2VkIGZvciBjb2xsYXBzZWQgcmFuZ2VzIHRoYXQgZG9uJ3QgaGF2ZSBhIHBsYWNlaG9sZGVyIHdpZGdldCFcbmNsYXNzIFdpZGdldFZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgc3RhdGljIGNyZWF0ZSh3aWRnZXQsIGxlbmd0aCwgc2lkZSkge1xuICAgICAgICByZXR1cm4gbmV3IFdpZGdldFZpZXcod2lkZ2V0LCBsZW5ndGgsIHNpZGUpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih3aWRnZXQsIGxlbmd0aCwgc2lkZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMuc2lkZSA9IHNpZGU7XG4gICAgICAgIHRoaXMucHJldldpZGdldCA9IG51bGw7XG4gICAgfVxuICAgIHNwbGl0KGZyb20pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFdpZGdldFZpZXcuY3JlYXRlKHRoaXMud2lkZ2V0LCB0aGlzLmxlbmd0aCAtIGZyb20sIHRoaXMuc2lkZSk7XG4gICAgICAgIHRoaXMubGVuZ3RoIC09IGZyb207XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHN5bmModmlldykge1xuICAgICAgICBpZiAoIXRoaXMuZG9tIHx8ICF0aGlzLndpZGdldC51cGRhdGVET00odGhpcy5kb20sIHZpZXcpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb20gJiYgdGhpcy5wcmV2V2lkZ2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucHJldldpZGdldC5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMucHJldldpZGdldCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNldERPTSh0aGlzLndpZGdldC50b0RPTSh2aWV3KSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMud2lkZ2V0LmVkaXRhYmxlKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRTaWRlKCkgeyByZXR1cm4gdGhpcy5zaWRlOyB9XG4gICAgbWVyZ2UoZnJvbSwgdG8sIHNvdXJjZSwgaGFzU3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgICAgICBpZiAoc291cmNlICYmICghKHNvdXJjZSBpbnN0YW5jZW9mIFdpZGdldFZpZXcpIHx8ICF0aGlzLndpZGdldC5jb21wYXJlKHNvdXJjZS53aWRnZXQpIHx8XG4gICAgICAgICAgICBmcm9tID4gMCAmJiBvcGVuU3RhcnQgPD0gMCB8fCB0byA8IHRoaXMubGVuZ3RoICYmIG9wZW5FbmQgPD0gMCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gZnJvbSArIChzb3VyY2UgPyBzb3VyY2UubGVuZ3RoIDogMCkgKyAodGhpcy5sZW5ndGggLSB0byk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBiZWNvbWUob3RoZXIpIHtcbiAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgV2lkZ2V0VmlldyAmJiBvdGhlci5zaWRlID09IHRoaXMuc2lkZSAmJlxuICAgICAgICAgICAgdGhpcy53aWRnZXQuY29uc3RydWN0b3IgPT0gb3RoZXIud2lkZ2V0LmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMud2lkZ2V0LmNvbXBhcmUob3RoZXIud2lkZ2V0KSlcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtEaXJ0eSh0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSAmJiAhdGhpcy5wcmV2V2lkZ2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucHJldldpZGdldCA9IHRoaXMud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy53aWRnZXQgPSBvdGhlci53aWRnZXQ7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG90aGVyLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24oKSB7IHJldHVybiB0cnVlOyB9XG4gICAgaWdub3JlRXZlbnQoZXZlbnQpIHsgcmV0dXJuIHRoaXMud2lkZ2V0Lmlnbm9yZUV2ZW50KGV2ZW50KTsgfVxuICAgIGdldCBvdmVycmlkZURPTVRleHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFRleHQuZW1wdHk7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzO1xuICAgICAgICB3aGlsZSAodG9wLnBhcmVudClcbiAgICAgICAgICAgIHRvcCA9IHRvcC5wYXJlbnQ7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRvcCwgdGV4dCA9IHZpZXcgJiYgdmlldy5zdGF0ZS5kb2MsIHN0YXJ0ID0gdGhpcy5wb3NBdFN0YXJ0O1xuICAgICAgICByZXR1cm4gdGV4dCA/IHRleHQuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgdGhpcy5sZW5ndGgpIDogVGV4dC5lbXB0eTtcbiAgICB9XG4gICAgZG9tQXRQb3MocG9zKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5sZW5ndGggPyBwb3MgPT0gMCA6IHRoaXMuc2lkZSA+IDApXG4gICAgICAgICAgICA/IERPTVBvcy5iZWZvcmUodGhpcy5kb20pXG4gICAgICAgICAgICA6IERPTVBvcy5hZnRlcih0aGlzLmRvbSwgcG9zID09IHRoaXMubGVuZ3RoKTtcbiAgICB9XG4gICAgZG9tQm91bmRzQXJvdW5kKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgY3VzdG9tID0gdGhpcy53aWRnZXQuY29vcmRzQXQodGhpcy5kb20sIHBvcywgc2lkZSk7XG4gICAgICAgIGlmIChjdXN0b20pXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tO1xuICAgICAgICBsZXQgcmVjdHMgPSB0aGlzLmRvbS5nZXRDbGllbnRSZWN0cygpLCByZWN0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFyZWN0cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGZyb21CYWNrID0gdGhpcy5zaWRlID8gdGhpcy5zaWRlIDwgMCA6IHBvcyA+IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tQmFjayA/IHJlY3RzLmxlbmd0aCAtIDEgOiAwOzsgaSArPSAoZnJvbUJhY2sgPyAtMSA6IDEpKSB7XG4gICAgICAgICAgICByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAocG9zID4gMCA/IGkgPT0gMCA6IGkgPT0gcmVjdHMubGVuZ3RoIC0gMSB8fCByZWN0LnRvcCA8IHJlY3QuYm90dG9tKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0dGVuUmVjdChyZWN0LCAhZnJvbUJhY2spO1xuICAgIH1cbiAgICBnZXQgaXNFZGl0YWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZ2V0IGlzV2lkZ2V0KCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGdldCBpc0hpZGRlbigpIHsgcmV0dXJuIHRoaXMud2lkZ2V0LmlzSGlkZGVuOyB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5kb20pXG4gICAgICAgICAgICB0aGlzLndpZGdldC5kZXN0cm95KHRoaXMuZG9tKTtcbiAgICB9XG59XG4vLyBUaGVzZSBhcmUgZHJhd24gYXJvdW5kIHVuZWRpdGFibGUgd2lkZ2V0cyB0byBhdm9pZCBhIG51bWJlciBvZlxuLy8gYnJvd3NlciBidWdzIHRoYXQgc2hvdyB1cCB3aGVuIHRoZSBjdXJzb3IgaXMgZGlyZWN0bHkgbmV4dCB0b1xuLy8gdW5lZGl0YWJsZSBpbmxpbmUgY29udGVudC5cbmNsYXNzIFdpZGdldEJ1ZmZlclZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3Ioc2lkZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNpZGUgPSBzaWRlO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gMDsgfVxuICAgIG1lcmdlKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBiZWNvbWUob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgV2lkZ2V0QnVmZmVyVmlldyAmJiBvdGhlci5zaWRlID09IHRoaXMuc2lkZTtcbiAgICB9XG4gICAgc3BsaXQoKSB7IHJldHVybiBuZXcgV2lkZ2V0QnVmZmVyVmlldyh0aGlzLnNpZGUpOyB9XG4gICAgc3luYygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvbSkge1xuICAgICAgICAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICAgICBkb20uY2xhc3NOYW1lID0gXCJjbS13aWRnZXRCdWZmZXJcIjtcbiAgICAgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgICAgICB0aGlzLnNldERPTShkb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFNpZGUoKSB7IHJldHVybiB0aGlzLnNpZGU7IH1cbiAgICBkb21BdFBvcyhwb3MpIHsgcmV0dXJuIHRoaXMuc2lkZSA+IDAgPyBET01Qb3MuYmVmb3JlKHRoaXMuZG9tKSA6IERPTVBvcy5hZnRlcih0aGlzLmRvbSk7IH1cbiAgICBsb2NhbFBvc0Zyb21ET00oKSB7IHJldHVybiAwOyB9XG4gICAgZG9tQm91bmRzQXJvdW5kKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGNvb3Jkc0F0KHBvcykge1xuICAgICAgICByZXR1cm4gdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfVxuICAgIGdldCBvdmVycmlkZURPTVRleHQoKSB7XG4gICAgICAgIHJldHVybiBUZXh0LmVtcHR5O1xuICAgIH1cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiB0cnVlOyB9XG59XG5UZXh0Vmlldy5wcm90b3R5cGUuY2hpbGRyZW4gPSBXaWRnZXRWaWV3LnByb3RvdHlwZS5jaGlsZHJlbiA9IFdpZGdldEJ1ZmZlclZpZXcucHJvdG90eXBlLmNoaWxkcmVuID0gbm9DaGlsZHJlbjtcbmZ1bmN0aW9uIGlubGluZURPTUF0UG9zKHBhcmVudCwgcG9zKSB7XG4gICAgbGV0IGRvbSA9IHBhcmVudC5kb20sIHsgY2hpbGRyZW4gfSA9IHBhcmVudCwgaSA9IDA7XG4gICAgZm9yIChsZXQgb2ZmID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IGNoaWxkcmVuW2ldLCBlbmQgPSBvZmYgKyBjaGlsZC5sZW5ndGg7XG4gICAgICAgIGlmIChlbmQgPT0gb2ZmICYmIGNoaWxkLmdldFNpZGUoKSA8PSAwKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChwb3MgPiBvZmYgJiYgcG9zIDwgZW5kICYmIGNoaWxkLmRvbS5wYXJlbnROb2RlID09IGRvbSlcbiAgICAgICAgICAgIHJldHVybiBjaGlsZC5kb21BdFBvcyhwb3MgLSBvZmYpO1xuICAgICAgICBpZiAocG9zIDw9IG9mZilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBvZmYgPSBlbmQ7XG4gICAgfVxuICAgIGZvciAobGV0IGogPSBpOyBqID4gMDsgai0tKSB7XG4gICAgICAgIGxldCBwcmV2ID0gY2hpbGRyZW5baiAtIDFdO1xuICAgICAgICBpZiAocHJldi5kb20ucGFyZW50Tm9kZSA9PSBkb20pXG4gICAgICAgICAgICByZXR1cm4gcHJldi5kb21BdFBvcyhwcmV2Lmxlbmd0aCk7XG4gICAgfVxuICAgIGZvciAobGV0IGogPSBpOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgbGV0IG5leHQgPSBjaGlsZHJlbltqXTtcbiAgICAgICAgaWYgKG5leHQuZG9tLnBhcmVudE5vZGUgPT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuIG5leHQuZG9tQXRQb3MoMCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRE9NUG9zKGRvbSwgMCk7XG59XG4vLyBBc3N1bWVzIGB2aWV3YCwgaWYgYSBtYXJrIHZpZXcsIGhhcyBwcmVjaXNlbHkgMSBjaGlsZC5cbmZ1bmN0aW9uIGpvaW5JbmxpbmVJbnRvKHBhcmVudCwgdmlldywgb3Blbikge1xuICAgIGxldCBsYXN0LCB7IGNoaWxkcmVuIH0gPSBwYXJlbnQ7XG4gICAgaWYgKG9wZW4gPiAwICYmIHZpZXcgaW5zdGFuY2VvZiBNYXJrVmlldyAmJiBjaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICAgKGxhc3QgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSkgaW5zdGFuY2VvZiBNYXJrVmlldyAmJiBsYXN0Lm1hcmsuZXEodmlldy5tYXJrKSkge1xuICAgICAgICBqb2luSW5saW5lSW50byhsYXN0LCB2aWV3LmNoaWxkcmVuWzBdLCBvcGVuIC0gMSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKHZpZXcpO1xuICAgICAgICB2aWV3LnNldFBhcmVudChwYXJlbnQpO1xuICAgIH1cbiAgICBwYXJlbnQubGVuZ3RoICs9IHZpZXcubGVuZ3RoO1xufVxuZnVuY3Rpb24gY29vcmRzSW5DaGlsZHJlbih2aWV3LCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgYmVmb3JlID0gbnVsbCwgYmVmb3JlUG9zID0gLTEsIGFmdGVyID0gbnVsbCwgYWZ0ZXJQb3MgPSAtMTtcbiAgICBmdW5jdGlvbiBzY2FuKHZpZXcsIHBvcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgb2ZmID0gMDsgaSA8IHZpZXcuY2hpbGRyZW4ubGVuZ3RoICYmIG9mZiA8PSBwb3M7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdmlldy5jaGlsZHJlbltpXSwgZW5kID0gb2ZmICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjYW4oY2hpbGQsIHBvcyAtIG9mZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCghYWZ0ZXIgfHwgYWZ0ZXIuaXNIaWRkZW4gJiYgc2lkZSA+IDApICYmXG4gICAgICAgICAgICAgICAgICAgIChlbmQgPiBwb3MgfHwgb2ZmID09IGVuZCAmJiBjaGlsZC5nZXRTaWRlKCkgPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICBhZnRlciA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBhZnRlclBvcyA9IHBvcyAtIG9mZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob2ZmIDwgcG9zIHx8IChvZmYgPT0gZW5kICYmIGNoaWxkLmdldFNpZGUoKSA8IDApICYmICFjaGlsZC5pc0hpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlUG9zID0gcG9zIC0gb2ZmO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IGVuZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY2FuKHZpZXcsIHBvcyk7XG4gICAgbGV0IHRhcmdldCA9IChzaWRlIDwgMCA/IGJlZm9yZSA6IGFmdGVyKSB8fCBiZWZvcmUgfHwgYWZ0ZXI7XG4gICAgaWYgKHRhcmdldClcbiAgICAgICAgcmV0dXJuIHRhcmdldC5jb29yZHNBdChNYXRoLm1heCgwLCB0YXJnZXQgPT0gYmVmb3JlID8gYmVmb3JlUG9zIDogYWZ0ZXJQb3MpLCBzaWRlKTtcbiAgICByZXR1cm4gZmFsbGJhY2tSZWN0KHZpZXcpO1xufVxuZnVuY3Rpb24gZmFsbGJhY2tSZWN0KHZpZXcpIHtcbiAgICBsZXQgbGFzdCA9IHZpZXcuZG9tLmxhc3RDaGlsZDtcbiAgICBpZiAoIWxhc3QpXG4gICAgICAgIHJldHVybiB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgcmVjdHMgPSBjbGllbnRSZWN0c0ZvcihsYXN0KTtcbiAgICByZXR1cm4gcmVjdHNbcmVjdHMubGVuZ3RoIC0gMV0gfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tYmluZUF0dHJzKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKG5hbWUgPT0gXCJjbGFzc1wiICYmIHRhcmdldC5jbGFzcylcbiAgICAgICAgICAgIHRhcmdldC5jbGFzcyArPSBcIiBcIiArIHNvdXJjZS5jbGFzcztcbiAgICAgICAgZWxzZSBpZiAobmFtZSA9PSBcInN0eWxlXCIgJiYgdGFyZ2V0LnN0eWxlKVxuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlICs9IFwiO1wiICsgc291cmNlLnN0eWxlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0YXJnZXRbbmFtZV0gPSBzb3VyY2VbbmFtZV07XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5jb25zdCBub0F0dHJzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5mdW5jdGlvbiBhdHRyc0VxKGEsIGIsIGlnbm9yZSkge1xuICAgIGlmIChhID09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghYSlcbiAgICAgICAgYSA9IG5vQXR0cnM7XG4gICAgaWYgKCFiKVxuICAgICAgICBiID0gbm9BdHRycztcbiAgICBsZXQga2V5c0EgPSBPYmplY3Qua2V5cyhhKSwga2V5c0IgPSBPYmplY3Qua2V5cyhiKTtcbiAgICBpZiAoa2V5c0EubGVuZ3RoIC0gKGlnbm9yZSAmJiBrZXlzQS5pbmRleE9mKGlnbm9yZSkgPiAtMSA/IDEgOiAwKSAhPVxuICAgICAgICBrZXlzQi5sZW5ndGggLSAoaWdub3JlICYmIGtleXNCLmluZGV4T2YoaWdub3JlKSA+IC0xID8gMSA6IDApKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQga2V5IG9mIGtleXNBKSB7XG4gICAgICAgIGlmIChrZXkgIT0gaWdub3JlICYmIChrZXlzQi5pbmRleE9mKGtleSkgPT0gLTEgfHwgYVtrZXldICE9PSBiW2tleV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUF0dHJzKGRvbSwgcHJldiwgYXR0cnMpIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGlmIChwcmV2KVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHByZXYpXG4gICAgICAgICAgICBpZiAoIShhdHRycyAmJiBuYW1lIGluIGF0dHJzKSkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IFwic3R5bGVcIilcbiAgICAgICAgICAgICAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICBpZiAoYXR0cnMpXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpXG4gICAgICAgICAgICBpZiAoIShwcmV2ICYmIHByZXZbbmFtZV0gPT0gYXR0cnNbbmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgICAgICBkb20uc3R5bGUuY3NzVGV4dCA9IGF0dHJzW25hbWVdO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShuYW1lLCBhdHRyc1tuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBnZXRBdHRycyhkb20pIHtcbiAgICBsZXQgYXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGF0dHIgPSBkb20uYXR0cmlidXRlc1tpXTtcbiAgICAgICAgYXR0cnNbYXR0ci5uYW1lXSA9IGF0dHIudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBhdHRycztcbn1cblxuY2xhc3MgTGluZVZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLnByZXZBdHRycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5hdHRycyA9IG51bGw7XG4gICAgICAgIHRoaXMuYnJlYWtBZnRlciA9IDA7XG4gICAgfVxuICAgIC8vIENvbnN1bWVzIHNvdXJjZVxuICAgIG1lcmdlKGZyb20sIHRvLCBzb3VyY2UsIGhhc1N0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgTGluZVZpZXcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5kb20pXG4gICAgICAgICAgICAgICAgc291cmNlLnRyYW5zZmVyRE9NKHRoaXMpOyAvLyBSZXVzZSBzb3VyY2UuZG9tIHdoZW4gYXBwcm9wcmlhdGVcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzU3RhcnQpXG4gICAgICAgICAgICB0aGlzLnNldERlY28oc291cmNlID8gc291cmNlLmF0dHJzIDogbnVsbCk7XG4gICAgICAgIG1lcmdlQ2hpbGRyZW5JbnRvKHRoaXMsIGZyb20sIHRvLCBzb3VyY2UgPyBzb3VyY2UuY2hpbGRyZW4uc2xpY2UoKSA6IFtdLCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3BsaXQoYXQpIHtcbiAgICAgICAgbGV0IGVuZCA9IG5ldyBMaW5lVmlldztcbiAgICAgICAgZW5kLmJyZWFrQWZ0ZXIgPSB0aGlzLmJyZWFrQWZ0ZXI7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGVuZDtcbiAgICAgICAgbGV0IHsgaSwgb2ZmIH0gPSB0aGlzLmNoaWxkUG9zKGF0KTtcbiAgICAgICAgaWYgKG9mZikge1xuICAgICAgICAgICAgZW5kLmFwcGVuZCh0aGlzLmNoaWxkcmVuW2ldLnNwbGl0KG9mZiksIDApO1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5tZXJnZShvZmYsIHRoaXMuY2hpbGRyZW5baV0ubGVuZ3RoLCBudWxsLCBmYWxzZSwgMCwgMCk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgZW5kLmFwcGVuZCh0aGlzLmNoaWxkcmVuW2pdLCAwKTtcbiAgICAgICAgd2hpbGUgKGkgPiAwICYmIHRoaXMuY2hpbGRyZW5baSAtIDFdLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlblstLWldLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5sZW5ndGggPSBpO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGF0O1xuICAgICAgICByZXR1cm4gZW5kO1xuICAgIH1cbiAgICB0cmFuc2ZlckRPTShvdGhlcikge1xuICAgICAgICBpZiAoIXRoaXMuZG9tKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICBvdGhlci5zZXRET00odGhpcy5kb20pO1xuICAgICAgICBvdGhlci5wcmV2QXR0cnMgPSB0aGlzLnByZXZBdHRycyA9PT0gdW5kZWZpbmVkID8gdGhpcy5hdHRycyA6IHRoaXMucHJldkF0dHJzO1xuICAgICAgICB0aGlzLnByZXZBdHRycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5kb20gPSBudWxsO1xuICAgIH1cbiAgICBzZXREZWNvKGF0dHJzKSB7XG4gICAgICAgIGlmICghYXR0cnNFcSh0aGlzLmF0dHJzLCBhdHRycykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldkF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFwcGVuZChjaGlsZCwgb3BlblN0YXJ0KSB7XG4gICAgICAgIGpvaW5JbmxpbmVJbnRvKHRoaXMsIGNoaWxkLCBvcGVuU3RhcnQpO1xuICAgIH1cbiAgICAvLyBPbmx5IGNhbGxlZCB3aGVuIGJ1aWxkaW5nIGEgbGluZSB2aWV3IGluIENvbnRlbnRCdWlsZGVyXG4gICAgYWRkTGluZURlY28oZGVjbykge1xuICAgICAgICBsZXQgYXR0cnMgPSBkZWNvLnNwZWMuYXR0cmlidXRlcywgY2xzID0gZGVjby5zcGVjLmNsYXNzO1xuICAgICAgICBpZiAoYXR0cnMpXG4gICAgICAgICAgICB0aGlzLmF0dHJzID0gY29tYmluZUF0dHJzKGF0dHJzLCB0aGlzLmF0dHJzIHx8IHt9KTtcbiAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgIHRoaXMuYXR0cnMgPSBjb21iaW5lQXR0cnMoeyBjbGFzczogY2xzIH0sIHRoaXMuYXR0cnMgfHwge30pO1xuICAgIH1cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIGlubGluZURPTUF0UG9zKHRoaXMsIHBvcyk7XG4gICAgfVxuICAgIHJldXNlRE9NKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJESVZcIikge1xuICAgICAgICAgICAgdGhpcy5zZXRET00obm9kZSk7XG4gICAgICAgICAgICB0aGlzLmZsYWdzIHw9IDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLyB8IDIgLyogVmlld0ZsYWcuTm9kZURpcnR5ICovO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN5bmModmlldywgdHJhY2spIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMuZG9tKSB7XG4gICAgICAgICAgICB0aGlzLnNldERPTShkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tbGluZVwiO1xuICAgICAgICAgICAgdGhpcy5wcmV2QXR0cnMgPSB0aGlzLmF0dHJzID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZsYWdzICYgNCAvKiBWaWV3RmxhZy5BdHRyc0RpcnR5ICovKSB7XG4gICAgICAgICAgICBjbGVhckF0dHJpYnV0ZXModGhpcy5kb20pO1xuICAgICAgICAgICAgdGhpcy5kb20uY2xhc3NOYW1lID0gXCJjbS1saW5lXCI7XG4gICAgICAgICAgICB0aGlzLnByZXZBdHRycyA9IHRoaXMuYXR0cnMgPyBudWxsIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByZXZBdHRycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB1cGRhdGVBdHRycyh0aGlzLmRvbSwgdGhpcy5wcmV2QXR0cnMsIHRoaXMuYXR0cnMpO1xuICAgICAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChcImNtLWxpbmVcIik7XG4gICAgICAgICAgICB0aGlzLnByZXZBdHRycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5zeW5jKHZpZXcsIHRyYWNrKTtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmRvbS5sYXN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChsYXN0ICYmIENvbnRlbnRWaWV3LmdldChsYXN0KSBpbnN0YW5jZW9mIE1hcmtWaWV3KVxuICAgICAgICAgICAgbGFzdCA9IGxhc3QubGFzdENoaWxkO1xuICAgICAgICBpZiAoIWxhc3QgfHwgIXRoaXMubGVuZ3RoIHx8XG4gICAgICAgICAgICBsYXN0Lm5vZGVOYW1lICE9IFwiQlJcIiAmJiAoKF9hID0gQ29udGVudFZpZXcuZ2V0KGxhc3QpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNFZGl0YWJsZSkgPT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICAoIWJyb3dzZXIuaW9zIHx8ICF0aGlzLmNoaWxkcmVuLnNvbWUoY2ggPT4gY2ggaW5zdGFuY2VvZiBUZXh0VmlldykpKSB7XG4gICAgICAgICAgICBsZXQgaGFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJCUlwiKTtcbiAgICAgICAgICAgIGhhY2suY21JZ25vcmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQoaGFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWVhc3VyZVRleHRTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT0gMCB8fCB0aGlzLmxlbmd0aCA+IDIwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB0b3RhbFdpZHRoID0gMCwgdGV4dEhlaWdodDtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBUZXh0VmlldykgfHwgL1teIC1+XS8udGVzdChjaGlsZC50ZXh0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGxldCByZWN0cyA9IGNsaWVudFJlY3RzRm9yKGNoaWxkLmRvbSk7XG4gICAgICAgICAgICBpZiAocmVjdHMubGVuZ3RoICE9IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0b3RhbFdpZHRoICs9IHJlY3RzWzBdLndpZHRoO1xuICAgICAgICAgICAgdGV4dEhlaWdodCA9IHJlY3RzWzBdLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXRvdGFsV2lkdGggPyBudWxsIDoge1xuICAgICAgICAgICAgbGluZUhlaWdodDogdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LFxuICAgICAgICAgICAgY2hhcldpZHRoOiB0b3RhbFdpZHRoIC8gdGhpcy5sZW5ndGgsXG4gICAgICAgICAgICB0ZXh0SGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgcmVjdCA9IGNvb3Jkc0luQ2hpbGRyZW4odGhpcywgcG9zLCBzaWRlKTtcbiAgICAgICAgLy8gQ29ycmVjdCByZWN0YW5nbGUgaGVpZ2h0IGZvciBlbXB0eSBsaW5lcyB3aGVuIHRoZSByZXR1cm5lZFxuICAgICAgICAvLyBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhlIHRleHQgaGVpZ2h0LlxuICAgICAgICBpZiAoIXRoaXMuY2hpbGRyZW4ubGVuZ3RoICYmIHJlY3QgJiYgdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGxldCB7IGhlaWdodE9yYWNsZSB9ID0gdGhpcy5wYXJlbnQudmlldy52aWV3U3RhdGUsIGhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoaGVpZ2h0IC0gaGVpZ2h0T3JhY2xlLmxpbmVIZWlnaHQpIDwgMiAmJiBoZWlnaHRPcmFjbGUudGV4dEhlaWdodCA8IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIGxldCBkaXN0ID0gKGhlaWdodCAtIGhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0KSAvIDI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdG9wOiByZWN0LnRvcCArIGRpc3QsIGJvdHRvbTogcmVjdC5ib3R0b20gLSBkaXN0LCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LmxlZnQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICB9XG4gICAgYmVjb21lKF9vdGhlcikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBjb3ZlcnMoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgc3RhdGljIGZpbmQoZG9jVmlldywgcG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBvZmYgPSAwOyBpIDwgZG9jVmlldy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGJsb2NrID0gZG9jVmlldy5jaGlsZHJlbltpXSwgZW5kID0gb2ZmICsgYmxvY2subGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2sgaW5zdGFuY2VvZiBMaW5lVmlldylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrO1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPiBwb3MpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmID0gZW5kICsgYmxvY2suYnJlYWtBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5jbGFzcyBCbG9ja1dpZGdldFZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgY29uc3RydWN0b3Iod2lkZ2V0LCBsZW5ndGgsIGRlY28pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLmRlY28gPSBkZWNvO1xuICAgICAgICB0aGlzLmJyZWFrQWZ0ZXIgPSAwO1xuICAgICAgICB0aGlzLnByZXZXaWRnZXQgPSBudWxsO1xuICAgIH1cbiAgICBtZXJnZShmcm9tLCB0bywgc291cmNlLCBfdGFrZURlY28sIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgICAgICBpZiAoc291cmNlICYmICghKHNvdXJjZSBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldykgfHwgIXRoaXMud2lkZ2V0LmNvbXBhcmUoc291cmNlLndpZGdldCkgfHxcbiAgICAgICAgICAgIGZyb20gPiAwICYmIG9wZW5TdGFydCA8PSAwIHx8IHRvIDwgdGhpcy5sZW5ndGggJiYgb3BlbkVuZCA8PSAwKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBmcm9tICsgKHNvdXJjZSA/IHNvdXJjZS5sZW5ndGggOiAwKSArICh0aGlzLmxlbmd0aCAtIHRvKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICByZXR1cm4gcG9zID09IDAgPyBET01Qb3MuYmVmb3JlKHRoaXMuZG9tKSA6IERPTVBvcy5hZnRlcih0aGlzLmRvbSwgcG9zID09IHRoaXMubGVuZ3RoKTtcbiAgICB9XG4gICAgc3BsaXQoYXQpIHtcbiAgICAgICAgbGV0IGxlbiA9IHRoaXMubGVuZ3RoIC0gYXQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gYXQ7XG4gICAgICAgIGxldCBlbmQgPSBuZXcgQmxvY2tXaWRnZXRWaWV3KHRoaXMud2lkZ2V0LCBsZW4sIHRoaXMuZGVjbyk7XG4gICAgICAgIGVuZC5icmVha0FmdGVyID0gdGhpcy5icmVha0FmdGVyO1xuICAgICAgICByZXR1cm4gZW5kO1xuICAgIH1cbiAgICBnZXQgY2hpbGRyZW4oKSB7IHJldHVybiBub0NoaWxkcmVuOyB9XG4gICAgc3luYyh2aWV3KSB7XG4gICAgICAgIGlmICghdGhpcy5kb20gfHwgIXRoaXMud2lkZ2V0LnVwZGF0ZURPTSh0aGlzLmRvbSwgdmlldykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSAmJiB0aGlzLnByZXZXaWRnZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0LmRlc3Ryb3kodGhpcy5kb20pO1xuICAgICAgICAgICAgdGhpcy5wcmV2V2lkZ2V0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc2V0RE9NKHRoaXMud2lkZ2V0LnRvRE9NKHZpZXcpKTtcbiAgICAgICAgICAgIGlmICghdGhpcy53aWRnZXQuZWRpdGFibGUpXG4gICAgICAgICAgICAgICAgdGhpcy5kb20uY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBvdmVycmlkZURPTVRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnZpZXcuc3RhdGUuZG9jLnNsaWNlKHRoaXMucG9zQXRTdGFydCwgdGhpcy5wb3NBdEVuZCkgOiBUZXh0LmVtcHR5O1xuICAgIH1cbiAgICBkb21Cb3VuZHNBcm91bmQoKSB7IHJldHVybiBudWxsOyB9XG4gICAgYmVjb21lKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIEJsb2NrV2lkZ2V0VmlldyAmJlxuICAgICAgICAgICAgb3RoZXIud2lkZ2V0LmNvbnN0cnVjdG9yID09IHRoaXMud2lkZ2V0LmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBpZiAoIW90aGVyLndpZGdldC5jb21wYXJlKHRoaXMud2lkZ2V0KSlcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtEaXJ0eSh0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSAmJiAhdGhpcy5wcmV2V2lkZ2V0KVxuICAgICAgICAgICAgICAgIHRoaXMucHJldldpZGdldCA9IHRoaXMud2lkZ2V0O1xuICAgICAgICAgICAgdGhpcy53aWRnZXQgPSBvdGhlci53aWRnZXQ7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG90aGVyLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZGVjbyA9IG90aGVyLmRlY287XG4gICAgICAgICAgICB0aGlzLmJyZWFrQWZ0ZXIgPSBvdGhlci5icmVha0FmdGVyO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbigpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBpZ25vcmVFdmVudChldmVudCkgeyByZXR1cm4gdGhpcy53aWRnZXQuaWdub3JlRXZlbnQoZXZlbnQpOyB9XG4gICAgZ2V0IGlzRWRpdGFibGUoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGdldCBpc1dpZGdldCgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBjb29yZHNBdChwb3MsIHNpZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0LmNvb3Jkc0F0KHRoaXMuZG9tLCBwb3MsIHNpZGUpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLmRvbSlcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmRlc3Ryb3kodGhpcy5kb20pO1xuICAgIH1cbiAgICBjb3ZlcnMoc2lkZSkge1xuICAgICAgICBsZXQgeyBzdGFydFNpZGUsIGVuZFNpZGUgfSA9IHRoaXMuZGVjbztcbiAgICAgICAgcmV0dXJuIHN0YXJ0U2lkZSA9PSBlbmRTaWRlID8gZmFsc2UgOiBzaWRlIDwgMCA/IHN0YXJ0U2lkZSA8IDAgOiBlbmRTaWRlID4gMDtcbiAgICB9XG59XG5cbi8qKlxuV2lkZ2V0cyBhZGRlZCB0byB0aGUgY29udGVudCBhcmUgZGVzY3JpYmVkIGJ5IHN1YmNsYXNzZXMgb2YgdGhpc1xuY2xhc3MuIFVzaW5nIGEgZGVzY3JpcHRpb24gb2JqZWN0IGxpa2UgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0b1xuZGVsYXkgY3JlYXRpbmcgb2YgdGhlIERPTSBzdHJ1Y3R1cmUgZm9yIGEgd2lkZ2V0IHVudGlsIGl0IGlzXG5uZWVkZWQsIGFuZCB0byBhdm9pZCByZWRyYXdpbmcgd2lkZ2V0cyBldmVuIGlmIHRoZSBkZWNvcmF0aW9uc1xudGhhdCBkZWZpbmUgdGhlbSBhcmUgcmVjcmVhdGVkLlxuKi9cbmNsYXNzIFdpZGdldFR5cGUge1xuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyBpbnN0YW5jZSB0byBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSBzYW1lIHR5cGUuXG4gICAgKFR5cGVTY3JpcHQgY2FuJ3QgZXhwcmVzcyB0aGlzLCBidXQgb25seSBpbnN0YW5jZXMgb2YgdGhlIHNhbWVcbiAgICBzcGVjaWZpYyBjbGFzcyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIG1ldGhvZC4pIFRoaXMgaXMgdXNlZCB0b1xuICAgIGF2b2lkIHJlZHJhd2luZyB3aWRnZXRzIHdoZW4gdGhleSBhcmUgcmVwbGFjZWQgYnkgYSBuZXdcbiAgICBkZWNvcmF0aW9uIG9mIHRoZSBzYW1lIHR5cGUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3RcbiAgICByZXR1cm5zIGBmYWxzZWAsIHdoaWNoIHdpbGwgY2F1c2UgbmV3IGluc3RhbmNlcyBvZiB0aGUgd2lkZ2V0IHRvXG4gICAgYWx3YXlzIGJlIHJlZHJhd24uXG4gICAgKi9cbiAgICBlcSh3aWRnZXQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgVXBkYXRlIGEgRE9NIGVsZW1lbnQgY3JlYXRlZCBieSBhIHdpZGdldCBvZiB0aGUgc2FtZSB0eXBlIChidXRcbiAgICBkaWZmZXJlbnQsIG5vbi1gZXFgIGNvbnRlbnQpIHRvIHJlZmxlY3QgdGhpcyB3aWRnZXQuIE1heSByZXR1cm5cbiAgICB0cnVlIHRvIGluZGljYXRlIHRoYXQgaXQgY291bGQgdXBkYXRlLCBmYWxzZSB0byBpbmRpY2F0ZSBpdFxuICAgIGNvdWxkbid0IChpbiB3aGljaCBjYXNlIHRoZSB3aWRnZXQgd2lsbCBiZSByZWRyYXduKS4gVGhlIGRlZmF1bHRcbiAgICBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgZmFsc2UuXG4gICAgKi9cbiAgICB1cGRhdGVET00oZG9tLCB2aWV3KSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcGFyZShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fCB0aGlzLmNvbnN0cnVjdG9yID09IG90aGVyLmNvbnN0cnVjdG9yICYmIHRoaXMuZXEob3RoZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZXN0aW1hdGVkIGhlaWdodCB0aGlzIHdpZGdldCB3aWxsIGhhdmUsIHRvIGJlIHVzZWQgd2hlblxuICAgIGVzdGltYXRpbmcgdGhlIGhlaWdodCBvZiBjb250ZW50IHRoYXQgaGFzbid0IGJlZW4gZHJhd24uIE1heVxuICAgIHJldHVybiAtMSB0byBpbmRpY2F0ZSB5b3UgZG9uJ3Qga25vdy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25cbiAgICByZXR1cm5zIC0xLlxuICAgICovXG4gICAgZ2V0IGVzdGltYXRlZEhlaWdodCgpIHsgcmV0dXJuIC0xOyB9XG4gICAgLyoqXG4gICAgRm9yIGlubGluZSB3aWRnZXRzIHRoYXQgYXJlIGRpc3BsYXllZCBpbmxpbmUgKGFzIG9wcG9zZWQgdG9cbiAgICBgaW5saW5lLWJsb2NrYCkgYW5kIGludHJvZHVjZSBsaW5lIGJyZWFrcyAodGhyb3VnaCBgPGJyPmAgdGFnc1xuICAgIG9yIHRleHR1YWwgbmV3bGluZXMpLCB0aGlzIG11c3QgaW5kaWNhdGUgdGhlIGFtb3VudCBvZiBsaW5lXG4gICAgYnJlYWtzIHRoZXkgaW50cm9kdWNlLiBEZWZhdWx0cyB0byAwLlxuICAgICovXG4gICAgZ2V0IGxpbmVCcmVha3MoKSB7IHJldHVybiAwOyB9XG4gICAgLyoqXG4gICAgQ2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHdoaWNoIGtpbmRzIG9mIGV2ZW50cyBpbnNpZGUgdGhlIHdpZGdldFxuICAgIHNob3VsZCBiZSBpZ25vcmVkIGJ5IHRoZSBlZGl0b3IuIFRoZSBkZWZhdWx0IGlzIHRvIGlnbm9yZSBhbGxcbiAgICBldmVudHMuXG4gICAgKi9cbiAgICBpZ25vcmVFdmVudChldmVudCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIC8qKlxuICAgIE92ZXJyaWRlIHRoZSB3YXkgc2NyZWVuIGNvb3JkaW5hdGVzIGZvciBwb3NpdGlvbnMgYXQvaW4gdGhlXG4gICAgd2lkZ2V0IGFyZSBmb3VuZC4gYHBvc2Agd2lsbCBiZSB0aGUgb2Zmc2V0IGludG8gdGhlIHdpZGdldCwgYW5kXG4gICAgYHNpZGVgIHRoZSBzaWRlIG9mIHRoZSBwb3NpdGlvbiB0aGF0IGlzIGJlaW5nIHF1ZXJpZWRcdTIwMTRsZXNzIHRoYW5cbiAgICB6ZXJvIGZvciBiZWZvcmUsIGdyZWF0ZXIgdGhhbiB6ZXJvIGZvciBhZnRlciwgYW5kIHplcm8gZm9yXG4gICAgZGlyZWN0bHkgYXQgdGhhdCBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGNvb3Jkc0F0KGRvbSwgcG9zLCBzaWRlKSB7IHJldHVybiBudWxsOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGVkaXRhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvKipcbiAgICBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhbiBpbnN0YW5jZSBvZiB0aGUgd2lkZ2V0IGlzIHJlbW92ZWRcbiAgICBmcm9tIHRoZSBlZGl0b3Igdmlldy5cbiAgICAqL1xuICAgIGRlc3Ryb3koZG9tKSB7IH1cbn1cbi8qKlxuVGhlIGRpZmZlcmVudCB0eXBlcyBvZiBibG9ja3MgdGhhdCBjYW4gb2NjdXIgaW4gYW4gZWRpdG9yIHZpZXcuXG4qL1xudmFyIEJsb2NrVHlwZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKEJsb2NrVHlwZSkge1xuICAgIC8qKlxuICAgIEEgbGluZSBvZiB0ZXh0LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIlRleHRcIl0gPSAwXSA9IFwiVGV4dFwiO1xuICAgIC8qKlxuICAgIEEgYmxvY2sgd2lkZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9zaXRpb24gYWZ0ZXIgaXQuXG4gICAgKi9cbiAgICBCbG9ja1R5cGVbQmxvY2tUeXBlW1wiV2lkZ2V0QmVmb3JlXCJdID0gMV0gPSBcIldpZGdldEJlZm9yZVwiO1xuICAgIC8qKlxuICAgIEEgYmxvY2sgd2lkZ2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9zaXRpb24gYmVmb3JlIGl0LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIldpZGdldEFmdGVyXCJdID0gMl0gPSBcIldpZGdldEFmdGVyXCI7XG4gICAgLyoqXG4gICAgQSBibG9jayB3aWRnZXQgW3JlcGxhY2luZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb25ecmVwbGFjZSkgYSByYW5nZSBvZiBjb250ZW50LlxuICAgICovXG4gICAgQmxvY2tUeXBlW0Jsb2NrVHlwZVtcIldpZGdldFJhbmdlXCJdID0gM10gPSBcIldpZGdldFJhbmdlXCI7XG5yZXR1cm4gQmxvY2tUeXBlfSkoQmxvY2tUeXBlIHx8IChCbG9ja1R5cGUgPSB7fSkpO1xuLyoqXG5BIGRlY29yYXRpb24gcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gaG93IHRvIGRyYXcgb3Igc3R5bGUgYSBwaWVjZVxub2YgY29udGVudC4gWW91J2xsIHVzdWFsbHkgdXNlIGl0IHdyYXBwZWQgaW4gYVxuW2BSYW5nZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuUmFuZ2UpLCB3aGljaCBhZGRzIGEgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbi5cbkBub25hYnN0cmFjdFxuKi9cbmNsYXNzIERlY29yYXRpb24gZXh0ZW5kcyBSYW5nZVZhbHVlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXJ0U2lkZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlbmRTaWRlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHdpZGdldCwgXG4gICAgLyoqXG4gICAgVGhlIGNvbmZpZyBvYmplY3QgdXNlZCB0byBjcmVhdGUgdGhpcyBkZWNvcmF0aW9uLiBZb3UgY2FuXG4gICAgaW5jbHVkZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaW4gdGhlcmUgdG8gc3RvcmUgbWV0YWRhdGEgYWJvdXRcbiAgICB5b3VyIGRlY29yYXRpb24uXG4gICAgKi9cbiAgICBzcGVjKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc3RhcnRTaWRlID0gc3RhcnRTaWRlO1xuICAgICAgICB0aGlzLmVuZFNpZGUgPSBlbmRTaWRlO1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaGVpZ2h0UmVsZXZhbnQoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcmsgZGVjb3JhdGlvbiwgd2hpY2ggaW5mbHVlbmNlcyB0aGUgc3R5bGluZyBvZiB0aGVcbiAgICBjb250ZW50IGluIGl0cyByYW5nZS4gTmVzdGVkIG1hcmsgZGVjb3JhdGlvbnMgd2lsbCBjYXVzZSBuZXN0ZWRcbiAgICBET00gZWxlbWVudHMgdG8gYmUgY3JlYXRlZC4gTmVzdGluZyBvcmRlciBpcyBkZXRlcm1pbmVkIGJ5XG4gICAgcHJlY2VkZW5jZSBvZiB0aGUgW2ZhY2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15kZWNvcmF0aW9ucyksIHdpdGhcbiAgICB0aGUgaGlnaGVyLXByZWNlZGVuY2UgZGVjb3JhdGlvbnMgY3JlYXRpbmcgdGhlIGlubmVyIERPTSBub2Rlcy5cbiAgICBTdWNoIGVsZW1lbnRzIGFyZSBzcGxpdCBvbiBsaW5lIGJvdW5kYXJpZXMgYW5kIG9uIHRoZSBib3VuZGFyaWVzXG4gICAgb2YgbG93ZXItcHJlY2VkZW5jZSBkZWNvcmF0aW9ucy5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXJrKHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrRGVjb3JhdGlvbihzcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgd2lkZ2V0IGRlY29yYXRpb24sIHdoaWNoIGRpc3BsYXlzIGEgRE9NIGVsZW1lbnQgYXQgdGhlXG4gICAgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgd2lkZ2V0KHNwZWMpIHtcbiAgICAgICAgbGV0IHNpZGUgPSBNYXRoLm1heCgtMTAwMDAsIE1hdGgubWluKDEwMDAwLCBzcGVjLnNpZGUgfHwgMCkpLCBibG9jayA9ICEhc3BlYy5ibG9jaztcbiAgICAgICAgc2lkZSArPSAoYmxvY2sgJiYgIXNwZWMuaW5saW5lT3JkZXIpXG4gICAgICAgICAgICA/IChzaWRlID4gMCA/IDMwMDAwMDAwMCAvKiBTaWRlLkJsb2NrQWZ0ZXIgKi8gOiAtNDAwMDAwMDAwIC8qIFNpZGUuQmxvY2tCZWZvcmUgKi8pXG4gICAgICAgICAgICA6IChzaWRlID4gMCA/IDEwMDAwMDAwMCAvKiBTaWRlLklubGluZUFmdGVyICovIDogLTEwMDAwMDAwMCAvKiBTaWRlLklubGluZUJlZm9yZSAqLyk7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnREZWNvcmF0aW9uKHNwZWMsIHNpZGUsIHNpZGUsIGJsb2NrLCBzcGVjLndpZGdldCB8fCBudWxsLCBmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJlcGxhY2UgZGVjb3JhdGlvbiB3aGljaCByZXBsYWNlcyB0aGUgZ2l2ZW4gcmFuZ2Ugd2l0aFxuICAgIGEgd2lkZ2V0LCBvciBzaW1wbHkgaGlkZXMgaXQuXG4gICAgKi9cbiAgICBzdGF0aWMgcmVwbGFjZShzcGVjKSB7XG4gICAgICAgIGxldCBibG9jayA9ICEhc3BlYy5ibG9jaywgc3RhcnRTaWRlLCBlbmRTaWRlO1xuICAgICAgICBpZiAoc3BlYy5pc0Jsb2NrR2FwKSB7XG4gICAgICAgICAgICBzdGFydFNpZGUgPSAtNTAwMDAwMDAwIC8qIFNpZGUuR2FwU3RhcnQgKi87XG4gICAgICAgICAgICBlbmRTaWRlID0gNDAwMDAwMDAwIC8qIFNpZGUuR2FwRW5kICovO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHsgc3RhcnQsIGVuZCB9ID0gZ2V0SW5jbHVzaXZlKHNwZWMsIGJsb2NrKTtcbiAgICAgICAgICAgIHN0YXJ0U2lkZSA9IChzdGFydCA/IChibG9jayA/IC0zMDAwMDAwMDAgLyogU2lkZS5CbG9ja0luY1N0YXJ0ICovIDogLTEgLyogU2lkZS5JbmxpbmVJbmNTdGFydCAqLykgOiA1MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNTdGFydCAqLykgLSAxO1xuICAgICAgICAgICAgZW5kU2lkZSA9IChlbmQgPyAoYmxvY2sgPyAyMDAwMDAwMDAgLyogU2lkZS5CbG9ja0luY0VuZCAqLyA6IDEgLyogU2lkZS5JbmxpbmVJbmNFbmQgKi8pIDogLTYwMDAwMDAwMCAvKiBTaWRlLk5vbkluY0VuZCAqLykgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnREZWNvcmF0aW9uKHNwZWMsIHN0YXJ0U2lkZSwgZW5kU2lkZSwgYmxvY2ssIHNwZWMud2lkZ2V0IHx8IG51bGwsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBsaW5lIGRlY29yYXRpb24sIHdoaWNoIGNhbiBhZGQgRE9NIGF0dHJpYnV0ZXMgdG8gdGhlXG4gICAgbGluZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgbGluZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGluZURlY29yYXRpb24oc3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEJ1aWxkIGEgW2BEZWNvcmF0aW9uU2V0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb25TZXQpIGZyb20gdGhlIGdpdmVuXG4gICAgZGVjb3JhdGVkIHJhbmdlIG9yIHJhbmdlcy4gSWYgdGhlIHJhbmdlcyBhcmVuJ3QgYWxyZWFkeSBzb3J0ZWQsXG4gICAgcGFzcyBgdHJ1ZWAgZm9yIGBzb3J0YCB0byBtYWtlIHRoZSBsaWJyYXJ5IHNvcnQgdGhlbSBmb3IgeW91LlxuICAgICovXG4gICAgc3RhdGljIHNldChvZiwgc29ydCA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBSYW5nZVNldC5vZihvZiwgc29ydCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaGFzSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy53aWRnZXQgPyB0aGlzLndpZGdldC5lc3RpbWF0ZWRIZWlnaHQgPiAtMSA6IGZhbHNlOyB9XG59XG4vKipcblRoZSBlbXB0eSBzZXQgb2YgZGVjb3JhdGlvbnMuXG4qL1xuRGVjb3JhdGlvbi5ub25lID0gUmFuZ2VTZXQuZW1wdHk7XG5jbGFzcyBNYXJrRGVjb3JhdGlvbiBleHRlbmRzIERlY29yYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNwZWMpIHtcbiAgICAgICAgbGV0IHsgc3RhcnQsIGVuZCB9ID0gZ2V0SW5jbHVzaXZlKHNwZWMpO1xuICAgICAgICBzdXBlcihzdGFydCA/IC0xIC8qIFNpZGUuSW5saW5lSW5jU3RhcnQgKi8gOiA1MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNTdGFydCAqLywgZW5kID8gMSAvKiBTaWRlLklubGluZUluY0VuZCAqLyA6IC02MDAwMDAwMDAgLyogU2lkZS5Ob25JbmNFbmQgKi8sIG51bGwsIHNwZWMpO1xuICAgICAgICB0aGlzLnRhZ05hbWUgPSBzcGVjLnRhZ05hbWUgfHwgXCJzcGFuXCI7XG4gICAgICAgIHRoaXMuY2xhc3MgPSBzcGVjLmNsYXNzIHx8IFwiXCI7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBzcGVjLmF0dHJpYnV0ZXMgfHwgbnVsbDtcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHxcbiAgICAgICAgICAgIG90aGVyIGluc3RhbmNlb2YgTWFya0RlY29yYXRpb24gJiZcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ05hbWUgPT0gb3RoZXIudGFnTmFtZSAmJlxuICAgICAgICAgICAgICAgICh0aGlzLmNsYXNzIHx8ICgoX2EgPSB0aGlzLmF0dHJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xhc3MpKSA9PSAob3RoZXIuY2xhc3MgfHwgKChfYiA9IG90aGVyLmF0dHJzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2xhc3MpKSAmJlxuICAgICAgICAgICAgICAgIGF0dHJzRXEodGhpcy5hdHRycywgb3RoZXIuYXR0cnMsIFwiY2xhc3NcIik7XG4gICAgfVxuICAgIHJhbmdlKGZyb20sIHRvID0gZnJvbSkge1xuICAgICAgICBpZiAoZnJvbSA+PSB0bylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTWFyayBkZWNvcmF0aW9ucyBtYXkgbm90IGJlIGVtcHR5XCIpO1xuICAgICAgICByZXR1cm4gc3VwZXIucmFuZ2UoZnJvbSwgdG8pO1xuICAgIH1cbn1cbk1hcmtEZWNvcmF0aW9uLnByb3RvdHlwZS5wb2ludCA9IGZhbHNlO1xuY2xhc3MgTGluZURlY29yYXRpb24gZXh0ZW5kcyBEZWNvcmF0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIHN1cGVyKC0yMDAwMDAwMDAgLyogU2lkZS5MaW5lICovLCAtMjAwMDAwMDAwIC8qIFNpZGUuTGluZSAqLywgbnVsbCwgc3BlYyk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIExpbmVEZWNvcmF0aW9uICYmXG4gICAgICAgICAgICB0aGlzLnNwZWMuY2xhc3MgPT0gb3RoZXIuc3BlYy5jbGFzcyAmJlxuICAgICAgICAgICAgYXR0cnNFcSh0aGlzLnNwZWMuYXR0cmlidXRlcywgb3RoZXIuc3BlYy5hdHRyaWJ1dGVzKTtcbiAgICB9XG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGlmICh0byAhPSBmcm9tKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJMaW5lIGRlY29yYXRpb24gcmFuZ2VzIG11c3QgYmUgemVyby1sZW5ndGhcIik7XG4gICAgICAgIHJldHVybiBzdXBlci5yYW5nZShmcm9tLCB0byk7XG4gICAgfVxufVxuTGluZURlY29yYXRpb24ucHJvdG90eXBlLm1hcE1vZGUgPSBNYXBNb2RlLlRyYWNrQmVmb3JlO1xuTGluZURlY29yYXRpb24ucHJvdG90eXBlLnBvaW50ID0gdHJ1ZTtcbmNsYXNzIFBvaW50RGVjb3JhdGlvbiBleHRlbmRzIERlY29yYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNwZWMsIHN0YXJ0U2lkZSwgZW5kU2lkZSwgYmxvY2ssIHdpZGdldCwgaXNSZXBsYWNlKSB7XG4gICAgICAgIHN1cGVyKHN0YXJ0U2lkZSwgZW5kU2lkZSwgd2lkZ2V0LCBzcGVjKTtcbiAgICAgICAgdGhpcy5ibG9jayA9IGJsb2NrO1xuICAgICAgICB0aGlzLmlzUmVwbGFjZSA9IGlzUmVwbGFjZTtcbiAgICAgICAgdGhpcy5tYXBNb2RlID0gIWJsb2NrID8gTWFwTW9kZS5UcmFja0RlbCA6IHN0YXJ0U2lkZSA8PSAwID8gTWFwTW9kZS5UcmFja0JlZm9yZSA6IE1hcE1vZGUuVHJhY2tBZnRlcjtcbiAgICB9XG4gICAgLy8gT25seSByZWxldmFudCB3aGVuIHRoaXMuYmxvY2sgPT0gdHJ1ZVxuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydFNpZGUgIT0gdGhpcy5lbmRTaWRlID8gQmxvY2tUeXBlLldpZGdldFJhbmdlXG4gICAgICAgICAgICA6IHRoaXMuc3RhcnRTaWRlIDw9IDAgPyBCbG9ja1R5cGUuV2lkZ2V0QmVmb3JlIDogQmxvY2tUeXBlLldpZGdldEFmdGVyO1xuICAgIH1cbiAgICBnZXQgaGVpZ2h0UmVsZXZhbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsb2NrIHx8ICEhdGhpcy53aWRnZXQgJiYgKHRoaXMud2lkZ2V0LmVzdGltYXRlZEhlaWdodCA+PSA1IHx8IHRoaXMud2lkZ2V0LmxpbmVCcmVha3MgPiAwKTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgUG9pbnREZWNvcmF0aW9uICYmXG4gICAgICAgICAgICB3aWRnZXRzRXEodGhpcy53aWRnZXQsIG90aGVyLndpZGdldCkgJiZcbiAgICAgICAgICAgIHRoaXMuYmxvY2sgPT0gb3RoZXIuYmxvY2sgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTaWRlID09IG90aGVyLnN0YXJ0U2lkZSAmJiB0aGlzLmVuZFNpZGUgPT0gb3RoZXIuZW5kU2lkZTtcbiAgICB9XG4gICAgcmFuZ2UoZnJvbSwgdG8gPSBmcm9tKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVwbGFjZSAmJiAoZnJvbSA+IHRvIHx8IChmcm9tID09IHRvICYmIHRoaXMuc3RhcnRTaWRlID4gMCAmJiB0aGlzLmVuZFNpZGUgPD0gMCkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHJhbmdlIGZvciByZXBsYWNlbWVudCBkZWNvcmF0aW9uXCIpO1xuICAgICAgICBpZiAoIXRoaXMuaXNSZXBsYWNlICYmIHRvICE9IGZyb20pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIldpZGdldCBkZWNvcmF0aW9ucyBjYW4gb25seSBoYXZlIHplcm8tbGVuZ3RoIHJhbmdlc1wiKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnJhbmdlKGZyb20sIHRvKTtcbiAgICB9XG59XG5Qb2ludERlY29yYXRpb24ucHJvdG90eXBlLnBvaW50ID0gdHJ1ZTtcbmZ1bmN0aW9uIGdldEluY2x1c2l2ZShzcGVjLCBibG9jayA9IGZhbHNlKSB7XG4gICAgbGV0IHsgaW5jbHVzaXZlU3RhcnQ6IHN0YXJ0LCBpbmNsdXNpdmVFbmQ6IGVuZCB9ID0gc3BlYztcbiAgICBpZiAoc3RhcnQgPT0gbnVsbClcbiAgICAgICAgc3RhcnQgPSBzcGVjLmluY2x1c2l2ZTtcbiAgICBpZiAoZW5kID09IG51bGwpXG4gICAgICAgIGVuZCA9IHNwZWMuaW5jbHVzaXZlO1xuICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydCAhPT0gbnVsbCAmJiBzdGFydCAhPT0gdm9pZCAwID8gc3RhcnQgOiBibG9jaywgZW5kOiBlbmQgIT09IG51bGwgJiYgZW5kICE9PSB2b2lkIDAgPyBlbmQgOiBibG9jayB9O1xufVxuZnVuY3Rpb24gd2lkZ2V0c0VxKGEsIGIpIHtcbiAgICByZXR1cm4gYSA9PSBiIHx8ICEhKGEgJiYgYiAmJiBhLmNvbXBhcmUoYikpO1xufVxuZnVuY3Rpb24gYWRkUmFuZ2UoZnJvbSwgdG8sIHJhbmdlcywgbWFyZ2luID0gMCkge1xuICAgIGxldCBsYXN0ID0gcmFuZ2VzLmxlbmd0aCAtIDE7XG4gICAgaWYgKGxhc3QgPj0gMCAmJiByYW5nZXNbbGFzdF0gKyBtYXJnaW4gPj0gZnJvbSlcbiAgICAgICAgcmFuZ2VzW2xhc3RdID0gTWF0aC5tYXgocmFuZ2VzW2xhc3RdLCB0byk7XG4gICAgZWxzZVxuICAgICAgICByYW5nZXMucHVzaChmcm9tLCB0byk7XG59XG5cbmNsYXNzIENvbnRlbnRCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihkb2MsIHBvcywgZW5kLCBkaXNhbGxvd0Jsb2NrRWZmZWN0c0Zvcikge1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuZW5kID0gZW5kO1xuICAgICAgICB0aGlzLmRpc2FsbG93QmxvY2tFZmZlY3RzRm9yID0gZGlzYWxsb3dCbG9ja0VmZmVjdHNGb3I7XG4gICAgICAgIHRoaXMuY29udGVudCA9IFtdO1xuICAgICAgICB0aGlzLmN1ckxpbmUgPSBudWxsO1xuICAgICAgICB0aGlzLmJyZWFrQXRTdGFydCA9IDA7XG4gICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICB0aGlzLmJ1ZmZlck1hcmtzID0gW107XG4gICAgICAgIC8vIFNldCB0byBmYWxzZSBkaXJlY3RseSBhZnRlciBhIHdpZGdldCB0aGF0IGNvdmVycyB0aGUgcG9zaXRpb24gYWZ0ZXIgaXRcbiAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IHRydWU7XG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMub3BlbkVuZCA9IC0xO1xuICAgICAgICB0aGlzLnRleHQgPSBcIlwiO1xuICAgICAgICB0aGlzLnRleHRPZmYgPSAwO1xuICAgICAgICB0aGlzLmN1cnNvciA9IGRvYy5pdGVyKCk7XG4gICAgICAgIHRoaXMuc2tpcCA9IHBvcztcbiAgICB9XG4gICAgcG9zQ292ZXJlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5icmVha0F0U3RhcnQgJiYgdGhpcy5kb2MubGluZUF0KHRoaXMucG9zKS5mcm9tICE9IHRoaXMucG9zO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiAhKGxhc3QuYnJlYWtBZnRlciB8fCBsYXN0IGluc3RhbmNlb2YgQmxvY2tXaWRnZXRWaWV3ICYmIGxhc3QuZGVjby5lbmRTaWRlIDwgMCk7XG4gICAgfVxuICAgIGdldExpbmUoKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXJMaW5lKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQucHVzaCh0aGlzLmN1ckxpbmUgPSBuZXcgTGluZVZpZXcpO1xuICAgICAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyTGluZTtcbiAgICB9XG4gICAgZmx1c2hCdWZmZXIoYWN0aXZlID0gdGhpcy5idWZmZXJNYXJrcykge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1ckxpbmUuYXBwZW5kKHdyYXBNYXJrcyhuZXcgV2lkZ2V0QnVmZmVyVmlldygtMSksIGFjdGl2ZSksIGFjdGl2ZS5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQnVmZmVyID0gMCAvKiBCdWYuTm8gKi87XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkQmxvY2tXaWRnZXQodmlldykge1xuICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuY3VyTGluZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY29udGVudC5wdXNoKHZpZXcpO1xuICAgIH1cbiAgICBmaW5pc2gob3BlbkVuZCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQnVmZmVyICYmIG9wZW5FbmQgPD0gdGhpcy5idWZmZXJNYXJrcy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0J1ZmZlciA9IDAgLyogQnVmLk5vICovO1xuICAgICAgICBpZiAoIXRoaXMucG9zQ292ZXJlZCgpICYmXG4gICAgICAgICAgICAhKG9wZW5FbmQgJiYgdGhpcy5jb250ZW50Lmxlbmd0aCAmJiB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgQmxvY2tXaWRnZXRWaWV3KSlcbiAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpO1xuICAgIH1cbiAgICBidWlsZFRleHQobGVuZ3RoLCBhY3RpdmUsIG9wZW5TdGFydCkge1xuICAgICAgICB3aGlsZSAobGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudGV4dE9mZiA9PSB0aGlzLnRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgdmFsdWUsIGxpbmVCcmVhaywgZG9uZSB9ID0gdGhpcy5jdXJzb3IubmV4dCh0aGlzLnNraXApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJhbiBvdXQgb2YgdGV4dCBjb250ZW50IHdoZW4gZHJhd2luZyBpbmxpbmUgdmlld3NcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVCcmVhaykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucG9zQ292ZXJlZCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50W3RoaXMuY29udGVudC5sZW5ndGggLSAxXS5icmVha0FmdGVyID0gMTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icmVha0F0U3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsdXNoQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyTGluZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBsZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0T2ZmID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdGFrZSA9IE1hdGgubWluKHRoaXMudGV4dC5sZW5ndGggLSB0aGlzLnRleHRPZmYsIGxlbmd0aCwgNTEyIC8qIFQuQ2h1bmsgKi8pO1xuICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcihhY3RpdmUuc2xpY2UoYWN0aXZlLmxlbmd0aCAtIG9wZW5TdGFydCkpO1xuICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCkuYXBwZW5kKHdyYXBNYXJrcyhuZXcgVGV4dFZpZXcodGhpcy50ZXh0LnNsaWNlKHRoaXMudGV4dE9mZiwgdGhpcy50ZXh0T2ZmICsgdGFrZSkpLCBhY3RpdmUpLCBvcGVuU3RhcnQpO1xuICAgICAgICAgICAgdGhpcy5hdEN1cnNvclBvcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnRleHRPZmYgKz0gdGFrZTtcbiAgICAgICAgICAgIGxlbmd0aCAtPSB0YWtlO1xuICAgICAgICAgICAgb3BlblN0YXJ0ID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzcGFuKGZyb20sIHRvLCBhY3RpdmUsIG9wZW5TdGFydCkge1xuICAgICAgICB0aGlzLmJ1aWxkVGV4dCh0byAtIGZyb20sIGFjdGl2ZSwgb3BlblN0YXJ0KTtcbiAgICAgICAgdGhpcy5wb3MgPSB0bztcbiAgICAgICAgaWYgKHRoaXMub3BlblN0YXJ0IDwgMClcbiAgICAgICAgICAgIHRoaXMub3BlblN0YXJ0ID0gb3BlblN0YXJ0O1xuICAgIH1cbiAgICBwb2ludChmcm9tLCB0bywgZGVjbywgYWN0aXZlLCBvcGVuU3RhcnQsIGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FsbG93QmxvY2tFZmZlY3RzRm9yW2luZGV4XSAmJiBkZWNvIGluc3RhbmNlb2YgUG9pbnREZWNvcmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZGVjby5ibG9jaylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJsb2NrIGRlY29yYXRpb25zIG1heSBub3QgYmUgc3BlY2lmaWVkIHZpYSBwbHVnaW5zXCIpO1xuICAgICAgICAgICAgaWYgKHRvID4gdGhpcy5kb2MubGluZUF0KHRoaXMucG9zKS50bylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkRlY29yYXRpb25zIHRoYXQgcmVwbGFjZSBsaW5lIGJyZWFrcyBtYXkgbm90IGJlIHNwZWNpZmllZCB2aWEgcGx1Z2luc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGVuID0gdG8gLSBmcm9tO1xuICAgICAgICBpZiAoZGVjbyBpbnN0YW5jZW9mIFBvaW50RGVjb3JhdGlvbikge1xuICAgICAgICAgICAgaWYgKGRlY28uYmxvY2spIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjby5zdGFydFNpZGUgPiAwICYmICF0aGlzLnBvc0NvdmVyZWQoKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRCbG9ja1dpZGdldChuZXcgQmxvY2tXaWRnZXRWaWV3KGRlY28ud2lkZ2V0IHx8IG5ldyBOdWxsV2lkZ2V0KFwiZGl2XCIpLCBsZW4sIGRlY28pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB2aWV3ID0gV2lkZ2V0Vmlldy5jcmVhdGUoZGVjby53aWRnZXQgfHwgbmV3IE51bGxXaWRnZXQoXCJzcGFuXCIpLCBsZW4sIGxlbiA/IDAgOiBkZWNvLnN0YXJ0U2lkZSk7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnNvckJlZm9yZSA9IHRoaXMuYXRDdXJzb3JQb3MgJiYgIXZpZXcuaXNFZGl0YWJsZSAmJiBvcGVuU3RhcnQgPD0gYWN0aXZlLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAoZnJvbSA8IHRvIHx8IGRlY28uc3RhcnRTaWRlID4gMCk7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnNvckFmdGVyID0gIXZpZXcuaXNFZGl0YWJsZSAmJiAoZnJvbSA8IHRvIHx8IG9wZW5TdGFydCA+IGFjdGl2ZS5sZW5ndGggfHwgZGVjby5zdGFydFNpZGUgPD0gMCk7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nQnVmZmVyID09IDIgLyogQnVmLklmQ3Vyc29yICovICYmICFjdXJzb3JCZWZvcmUgJiYgIXZpZXcuaXNFZGl0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQnVmZmVyID0gMCAvKiBCdWYuTm8gKi87XG4gICAgICAgICAgICAgICAgdGhpcy5mbHVzaEJ1ZmZlcihhY3RpdmUpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3JCZWZvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQod3JhcE1hcmtzKG5ldyBXaWRnZXRCdWZmZXJWaWV3KDEpLCBhY3RpdmUpLCBvcGVuU3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICBvcGVuU3RhcnQgPSBhY3RpdmUubGVuZ3RoICsgTWF0aC5tYXgoMCwgb3BlblN0YXJ0IC0gYWN0aXZlLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKHdyYXBNYXJrcyh2aWV3LCBhY3RpdmUpLCBvcGVuU3RhcnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXRDdXJzb3JQb3MgPSBjdXJzb3JBZnRlcjtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdCdWZmZXIgPSAhY3Vyc29yQWZ0ZXIgPyAwIC8qIEJ1Zi5ObyAqLyA6IGZyb20gPCB0byB8fCBvcGVuU3RhcnQgPiBhY3RpdmUubGVuZ3RoID8gMSAvKiBCdWYuWWVzICovIDogMiAvKiBCdWYuSWZDdXJzb3IgKi87XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZ0J1ZmZlcilcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJNYXJrcyA9IGFjdGl2ZS5zbGljZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZG9jLmxpbmVBdCh0aGlzLnBvcykuZnJvbSA9PSB0aGlzLnBvcykgeyAvLyBMaW5lIGRlY29yYXRpb25cbiAgICAgICAgICAgIHRoaXMuZ2V0TGluZSgpLmFkZExpbmVEZWNvKGRlY28pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgIC8vIEFkdmFuY2UgdGhlIGl0ZXJhdG9yIHBhc3QgdGhlIHJlcGxhY2VkIGNvbnRlbnRcbiAgICAgICAgICAgIGlmICh0aGlzLnRleHRPZmYgKyBsZW4gPD0gdGhpcy50ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9mZiArPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNraXAgKz0gbGVuIC0gKHRoaXMudGV4dC5sZW5ndGggLSB0aGlzLnRleHRPZmYpO1xuICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T2ZmID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucG9zID0gdG87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3BlblN0YXJ0IDwgMClcbiAgICAgICAgICAgIHRoaXMub3BlblN0YXJ0ID0gb3BlblN0YXJ0O1xuICAgIH1cbiAgICBzdGF0aWMgYnVpbGQodGV4dCwgZnJvbSwgdG8sIGRlY29yYXRpb25zLCBkeW5hbWljRGVjb3JhdGlvbk1hcCkge1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBDb250ZW50QnVpbGRlcih0ZXh0LCBmcm9tLCB0bywgZHluYW1pY0RlY29yYXRpb25NYXApO1xuICAgICAgICBidWlsZGVyLm9wZW5FbmQgPSBSYW5nZVNldC5zcGFucyhkZWNvcmF0aW9ucywgZnJvbSwgdG8sIGJ1aWxkZXIpO1xuICAgICAgICBpZiAoYnVpbGRlci5vcGVuU3RhcnQgPCAwKVxuICAgICAgICAgICAgYnVpbGRlci5vcGVuU3RhcnQgPSBidWlsZGVyLm9wZW5FbmQ7XG4gICAgICAgIGJ1aWxkZXIuZmluaXNoKGJ1aWxkZXIub3BlbkVuZCk7XG4gICAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHdyYXBNYXJrcyh2aWV3LCBhY3RpdmUpIHtcbiAgICBmb3IgKGxldCBtYXJrIG9mIGFjdGl2ZSlcbiAgICAgICAgdmlldyA9IG5ldyBNYXJrVmlldyhtYXJrLCBbdmlld10sIHZpZXcubGVuZ3RoKTtcbiAgICByZXR1cm4gdmlldztcbn1cbmNsYXNzIE51bGxXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih0YWcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci50YWcgPT0gdGhpcy50YWc7IH1cbiAgICB0b0RPTSgpIHsgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy50YWcpOyB9XG4gICAgdXBkYXRlRE9NKGVsdCkgeyByZXR1cm4gZWx0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gdGhpcy50YWc7IH1cbiAgICBnZXQgaXNIaWRkZW4oKSB7IHJldHVybiB0cnVlOyB9XG59XG5cbi8qKlxuVXNlZCB0byBpbmRpY2F0ZSBbdGV4dCBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pLlxuKi9cbnZhciBEaXJlY3Rpb24gPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChEaXJlY3Rpb24pIHtcbiAgICAvLyAoVGhlc2UgYXJlIGNob3NlbiB0byBtYXRjaCB0aGUgYmFzZSBsZXZlbHMsIGluIGJpZGkgYWxnb3JpdGhtXG4gICAgLy8gdGVybXMsIG9mIHNwYW5zIGluIHRoYXQgZGlyZWN0aW9uLilcbiAgICAvKipcbiAgICBMZWZ0LXRvLXJpZ2h0LlxuICAgICovXG4gICAgRGlyZWN0aW9uW0RpcmVjdGlvbltcIkxUUlwiXSA9IDBdID0gXCJMVFJcIjtcbiAgICAvKipcbiAgICBSaWdodC10by1sZWZ0LlxuICAgICovXG4gICAgRGlyZWN0aW9uW0RpcmVjdGlvbltcIlJUTFwiXSA9IDFdID0gXCJSVExcIjtcbnJldHVybiBEaXJlY3Rpb259KShEaXJlY3Rpb24gfHwgKERpcmVjdGlvbiA9IHt9KSk7XG5jb25zdCBMVFIgPSBEaXJlY3Rpb24uTFRSLCBSVEwgPSBEaXJlY3Rpb24uUlRMO1xuLy8gRGVjb2RlIGEgc3RyaW5nIHdpdGggZWFjaCB0eXBlIGVuY29kZWQgYXMgbG9nMih0eXBlKVxuZnVuY3Rpb24gZGVjKHN0cikge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKylcbiAgICAgICAgcmVzdWx0LnB1c2goMSA8PCArc3RyW2ldKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8gQ2hhcmFjdGVyIHR5cGVzIGZvciBjb2RlcG9pbnRzIDAgdG8gMHhmOFxuY29uc3QgTG93VHlwZXMgPSAvKkBfX1BVUkVfXyovZGVjKFwiODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg2NjY4ODg4ODg3ODc4MzMzMzMzMzMzMzc4ODg4ODgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg4ODg4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODc4NjY2Njg4ODgwODg4ODg2NjMzODA4ODgzMDg4ODg4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhcIik7XG4vLyBDaGFyYWN0ZXIgdHlwZXMgZm9yIGNvZGVwb2ludHMgMHg2MDAgdG8gMHg2ZjlcbmNvbnN0IEFyYWJpY1R5cGVzID0gLypAX19QVVJFX18qL2RlYyhcIjQ0NDQ0NDg4MjY2MjcyODg5OTk5OTk5OTk5OTIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjk5OTk5OTk5OTk5OTk5OTk5OTk5OTQ0NDQ0NDQ0NDQ2NDQyMjI4MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI5OTk5OTk5NDk5OTk5OTkyMjk5ODk5OTkyMjMzMzMzMzMzMzNcIik7XG5jb25zdCBCcmFja2V0cyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpLCBCcmFja2V0U3RhY2sgPSBbXTtcbi8vIFRoZXJlJ3MgYSBsb3QgbW9yZSBpblxuLy8gaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL0JpZGlCcmFja2V0cy50eHQsXG4vLyB3aGljaCBhcmUgbGVmdCBvdXQgdG8ga2VlcCBjb2RlIHNpemUgZG93bi5cbmZvciAobGV0IHAgb2YgW1wiKClcIiwgXCJbXVwiLCBcInt9XCJdKSB7XG4gICAgbGV0IGwgPSAvKkBfX1BVUkVfXyovcC5jaGFyQ29kZUF0KDApLCByID0gLypAX19QVVJFX18qL3AuY2hhckNvZGVBdCgxKTtcbiAgICBCcmFja2V0c1tsXSA9IHI7XG4gICAgQnJhY2tldHNbcl0gPSAtbDtcbn1cbmZ1bmN0aW9uIGNoYXJUeXBlKGNoKSB7XG4gICAgcmV0dXJuIGNoIDw9IDB4ZjcgPyBMb3dUeXBlc1tjaF0gOlxuICAgICAgICAweDU5MCA8PSBjaCAmJiBjaCA8PSAweDVmNCA/IDIgLyogVC5SICovIDpcbiAgICAgICAgICAgIDB4NjAwIDw9IGNoICYmIGNoIDw9IDB4NmY5ID8gQXJhYmljVHlwZXNbY2ggLSAweDYwMF0gOlxuICAgICAgICAgICAgICAgIDB4NmVlIDw9IGNoICYmIGNoIDw9IDB4OGFjID8gNCAvKiBULkFMICovIDpcbiAgICAgICAgICAgICAgICAgICAgMHgyMDAwIDw9IGNoICYmIGNoIDw9IDB4MjAwYyA/IDI1NiAvKiBULk5JICovIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmI1MCA8PSBjaCAmJiBjaCA8PSAweGZkZmYgPyA0IC8qIFQuQUwgKi8gOiAxIC8qIFQuTCAqLztcbn1cbmNvbnN0IEJpZGlSRSA9IC9bXFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MDcwMC1cXHUwOGFjXFx1ZmI1MC1cXHVmZGZmXS87XG4vKipcblJlcHJlc2VudHMgYSBjb250aWd1b3VzIHJhbmdlIG9mIHRleHQgdGhhdCBoYXMgYSBzaW5nbGUgZGlyZWN0aW9uXG4oYXMgaW4gbGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0KS5cbiovXG5jbGFzcyBCaWRpU3BhbiB7XG4gICAgLyoqXG4gICAgVGhlIGRpcmVjdGlvbiBvZiB0aGlzIHNwYW4uXG4gICAgKi9cbiAgICBnZXQgZGlyKCkgeyByZXR1cm4gdGhpcy5sZXZlbCAlIDIgPyBSVEwgOiBMVFI7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgc3BhbiAocmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lKS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgb2YgdGhlIHNwYW4uXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIFtcImJpZGlcbiAgICBsZXZlbFwiXShodHRwczovL3VuaWNvZGUub3JnL3JlcG9ydHMvdHI5LyNCYXNpY19EaXNwbGF5X0FsZ29yaXRobSlcbiAgICBvZiB0aGUgc3BhbiAoaW4gdGhpcyBjb250ZXh0LCAwIG1lYW5zXG4gICAgbGVmdC10by1yaWdodCwgMSBtZWFucyByaWdodC10by1sZWZ0LCAyIG1lYW5zIGxlZnQtdG8tcmlnaHRcbiAgICBudW1iZXIgaW5zaWRlIHJpZ2h0LXRvLWxlZnQgdGV4dCkuXG4gICAgKi9cbiAgICBsZXZlbCkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzaWRlKGVuZCwgZGlyKSB7IHJldHVybiAodGhpcy5kaXIgPT0gZGlyKSA9PSBlbmQgPyB0aGlzLnRvIDogdGhpcy5mcm9tOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmb3J3YXJkKGZvcndhcmQsIGRpcikgeyByZXR1cm4gZm9yd2FyZCA9PSAodGhpcy5kaXIgPT0gZGlyKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZpbmQob3JkZXIsIGluZGV4LCBsZXZlbCwgYXNzb2MpIHtcbiAgICAgICAgbGV0IG1heWJlID0gLTE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzcGFuID0gb3JkZXJbaV07XG4gICAgICAgICAgICBpZiAoc3Bhbi5mcm9tIDw9IGluZGV4ICYmIHNwYW4udG8gPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3Bhbi5sZXZlbCA9PSBsZXZlbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBtdWx0aXBsZSBzcGFucyBtYXRjaCwgaWYgYXNzb2MgIT0gMCwgdGFrZSB0aGUgb25lIHRoYXRcbiAgICAgICAgICAgICAgICAvLyBjb3ZlcnMgdGhhdCBzaWRlLCBvdGhlcndpc2UgdGFrZSB0aGUgb25lIHdpdGggdGhlIG1pbmltdW1cbiAgICAgICAgICAgICAgICAvLyBsZXZlbC5cbiAgICAgICAgICAgICAgICBpZiAobWF5YmUgPCAwIHx8IChhc3NvYyAhPSAwID8gKGFzc29jIDwgMCA/IHNwYW4uZnJvbSA8IGluZGV4IDogc3Bhbi50byA+IGluZGV4KSA6IG9yZGVyW21heWJlXS5sZXZlbCA+IHNwYW4ubGV2ZWwpKVxuICAgICAgICAgICAgICAgICAgICBtYXliZSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlIDwgMClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgICByZXR1cm4gbWF5YmU7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNvbGF0ZXNFcShhLCBiKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBpQSA9IGFbaV0sIGlCID0gYltpXTtcbiAgICAgICAgaWYgKGlBLmZyb20gIT0gaUIuZnJvbSB8fCBpQS50byAhPSBpQi50byB8fCBpQS5kaXJlY3Rpb24gIT0gaUIuZGlyZWN0aW9uIHx8ICFpc29sYXRlc0VxKGlBLmlubmVyLCBpQi5pbm5lcikpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLy8gUmV1c2VkIGFycmF5IG9mIGNoYXJhY3RlciB0eXBlc1xuY29uc3QgdHlwZXMgPSBbXTtcbi8vIEZpbGwgaW4gdGhlIGNoYXJhY3RlciB0eXBlcyAoaW4gYHR5cGVzYCkgZnJvbSBgZnJvbWAgdG8gYHRvYCBhbmRcbi8vIGFwcGx5IFcgbm9ybWFsaXphdGlvbiBydWxlcy5cbmZ1bmN0aW9uIGNvbXB1dGVDaGFyVHlwZXMobGluZSwgckZyb20sIHJUbywgaXNvbGF0ZXMsIG91dGVyVHlwZSkge1xuICAgIGZvciAobGV0IGlJID0gMDsgaUkgPD0gaXNvbGF0ZXMubGVuZ3RoOyBpSSsrKSB7XG4gICAgICAgIGxldCBmcm9tID0gaUkgPyBpc29sYXRlc1tpSSAtIDFdLnRvIDogckZyb20sIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgbGV0IHByZXZUeXBlID0gaUkgPyAyNTYgLyogVC5OSSAqLyA6IG91dGVyVHlwZTtcbiAgICAgICAgLy8gVzEuIEV4YW1pbmUgZWFjaCBub24tc3BhY2luZyBtYXJrIChOU00pIGluIHRoZSBsZXZlbCBydW4sIGFuZFxuICAgICAgICAvLyBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIE5TTSB0byB0aGUgdHlwZSBvZiB0aGUgcHJldmlvdXNcbiAgICAgICAgLy8gY2hhcmFjdGVyLiBJZiB0aGUgTlNNIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGV2ZWwgcnVuLCBpdCB3aWxsXG4gICAgICAgIC8vIGdldCB0aGUgdHlwZSBvZiBzb3IuXG4gICAgICAgIC8vIFcyLiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlclxuICAgICAgICAvLyB1bnRpbCB0aGUgZmlyc3Qgc3Ryb25nIHR5cGUgKFIsIEwsIEFMLCBvciBzb3IpIGlzIGZvdW5kLiBJZiBhblxuICAgICAgICAvLyBBTCBpcyBmb3VuZCwgY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gQXJhYmljXG4gICAgICAgIC8vIG51bWJlci5cbiAgICAgICAgLy8gVzMuIENoYW5nZSBhbGwgQUxzIHRvIFIuXG4gICAgICAgIC8vIChMZWZ0IGFmdGVyIHRoaXM6IEwsIFIsIEVOLCBBTiwgRVQsIENTLCBOSSlcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb20sIHByZXYgPSBwcmV2VHlwZSwgcHJldlN0cm9uZyA9IHByZXZUeXBlOyBpIDwgdG87IGkrKykge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBjaGFyVHlwZShsaW5lLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gNTEyIC8qIFQuTlNNICovKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBwcmV2O1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSA4IC8qIFQuRU4gKi8gJiYgcHJldlN0cm9uZyA9PSA0IC8qIFQuQUwgKi8pXG4gICAgICAgICAgICAgICAgdHlwZSA9IDE2IC8qIFQuQU4gKi87XG4gICAgICAgICAgICB0eXBlc1tpXSA9IHR5cGUgPT0gNCAvKiBULkFMICovID8gMiAvKiBULlIgKi8gOiB0eXBlO1xuICAgICAgICAgICAgaWYgKHR5cGUgJiA3IC8qIFQuU3Ryb25nICovKVxuICAgICAgICAgICAgICAgIHByZXZTdHJvbmcgPSB0eXBlO1xuICAgICAgICAgICAgcHJldiA9IHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVzUuIEEgc2VxdWVuY2Ugb2YgRXVyb3BlYW4gdGVybWluYXRvcnMgYWRqYWNlbnQgdG8gRXVyb3BlYW5cbiAgICAgICAgLy8gbnVtYmVycyBjaGFuZ2VzIHRvIGFsbCBFdXJvcGVhbiBudW1iZXJzLlxuICAgICAgICAvLyBXNi4gT3RoZXJ3aXNlLCBzZXBhcmF0b3JzIGFuZCB0ZXJtaW5hdG9ycyBjaGFuZ2UgdG8gT3RoZXJcbiAgICAgICAgLy8gTmV1dHJhbC5cbiAgICAgICAgLy8gVzcuIFNlYXJjaCBiYWNrd2FyZHMgZnJvbSBlYWNoIGluc3RhbmNlIG9mIGEgRXVyb3BlYW4gbnVtYmVyXG4gICAgICAgIC8vIHVudGlsIHRoZSBmaXJzdCBzdHJvbmcgdHlwZSAoUiwgTCwgb3Igc29yKSBpcyBmb3VuZC4gSWYgYW4gTCBpc1xuICAgICAgICAvLyBmb3VuZCwgdGhlbiBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIEV1cm9wZWFuIG51bWJlciB0byBMLlxuICAgICAgICAvLyAoTGVmdCBhZnRlciB0aGlzOiBMLCBSLCBFTitBTiwgTkkpXG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tLCBwcmV2ID0gcHJldlR5cGUsIHByZXZTdHJvbmcgPSBwcmV2VHlwZTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZSA9PSAxMjggLyogVC5DUyAqLykge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgdG8gLSAxICYmIHByZXYgPT0gdHlwZXNbaSArIDFdICYmIChwcmV2ICYgMjQgLyogVC5OdW0gKi8pKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gdHlwZXNbaV0gPSBwcmV2O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdHlwZXNbaV0gPSAyNTYgLyogVC5OSSAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gNjQgLyogVC5FVCAqLykge1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoZW5kIDwgdG8gJiYgdHlwZXNbZW5kXSA9PSA2NCAvKiBULkVUICovKVxuICAgICAgICAgICAgICAgICAgICBlbmQrKztcbiAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZSA9IChpICYmIHByZXYgPT0gOCAvKiBULkVOICovKSB8fCAoZW5kIDwgclRvICYmIHR5cGVzW2VuZF0gPT0gOCAvKiBULkVOICovKSA/IChwcmV2U3Ryb25nID09IDEgLyogVC5MICovID8gMSAvKiBULkwgKi8gOiA4IC8qIFQuRU4gKi8pIDogMjU2IC8qIFQuTkkgKi87XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBlbmQ7IGorKylcbiAgICAgICAgICAgICAgICAgICAgdHlwZXNbal0gPSByZXBsYWNlO1xuICAgICAgICAgICAgICAgIGkgPSBlbmQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSA4IC8qIFQuRU4gKi8gJiYgcHJldlN0cm9uZyA9PSAxIC8qIFQuTCAqLykge1xuICAgICAgICAgICAgICAgIHR5cGVzW2ldID0gMSAvKiBULkwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2ID0gdHlwZTtcbiAgICAgICAgICAgIGlmICh0eXBlICYgNyAvKiBULlN0cm9uZyAqLylcbiAgICAgICAgICAgICAgICBwcmV2U3Ryb25nID0gdHlwZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIFByb2Nlc3MgYnJhY2tldHMgdGhyb3VnaG91dCBhIHJ1biBzZXF1ZW5jZS5cbmZ1bmN0aW9uIHByb2Nlc3NCcmFja2V0UGFpcnMobGluZSwgckZyb20sIHJUbywgaXNvbGF0ZXMsIG91dGVyVHlwZSkge1xuICAgIGxldCBvcHBvc2l0ZVR5cGUgPSBvdXRlclR5cGUgPT0gMSAvKiBULkwgKi8gPyAyIC8qIFQuUiAqLyA6IDEgLyogVC5MICovO1xuICAgIGZvciAobGV0IGlJID0gMCwgc0kgPSAwLCBjb250ZXh0ID0gMDsgaUkgPD0gaXNvbGF0ZXMubGVuZ3RoOyBpSSsrKSB7XG4gICAgICAgIGxldCBmcm9tID0gaUkgPyBpc29sYXRlc1tpSSAtIDFdLnRvIDogckZyb20sIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgLy8gTjAuIFByb2Nlc3MgYnJhY2tldCBwYWlycyBpbiBhbiBpc29sYXRpbmcgcnVuIHNlcXVlbmNlXG4gICAgICAgIC8vIHNlcXVlbnRpYWxseSBpbiB0aGUgbG9naWNhbCBvcmRlciBvZiB0aGUgdGV4dCBwb3NpdGlvbnMgb2YgdGhlXG4gICAgICAgIC8vIG9wZW5pbmcgcGFpcmVkIGJyYWNrZXRzIHVzaW5nIHRoZSBsb2dpYyBnaXZlbiBiZWxvdy4gV2l0aGluIHRoaXNcbiAgICAgICAgLy8gc2NvcGUsIGJpZGlyZWN0aW9uYWwgdHlwZXMgRU4gYW5kIEFOIGFyZSB0cmVhdGVkIGFzIFIuXG4gICAgICAgIGZvciAobGV0IGkgPSBmcm9tLCBjaCwgYnIsIHR5cGU7IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBLZWVwcyBbc3RhcnRJbmRleCwgdHlwZSwgc3Ryb25nU2Vlbl0gdHJpcGxlcyBmb3IgZWFjaCBvcGVuXG4gICAgICAgICAgICAvLyBicmFja2V0IG9uIEJyYWNrZXRTdGFjay5cbiAgICAgICAgICAgIGlmIChiciA9IEJyYWNrZXRzW2NoID0gbGluZS5jaGFyQ29kZUF0KGkpXSkge1xuICAgICAgICAgICAgICAgIGlmIChiciA8IDApIHsgLy8gQ2xvc2luZyBicmFja2V0XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHNKID0gc0kgLSAzOyBzSiA+PSAwOyBzSiAtPSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQnJhY2tldFN0YWNrW3NKICsgMV0gPT0gLWJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZsYWdzID0gQnJhY2tldFN0YWNrW3NKICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSAoZmxhZ3MgJiAyIC8qIEJyYWNrZXRlZC5FbWJlZEluc2lkZSAqLykgPyBvdXRlclR5cGUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGZsYWdzICYgNCAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVJbnNpZGUgKi8pID8gMCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiAxIC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUJlZm9yZSAqLykgPyBvcHBvc2l0ZVR5cGUgOiBvdXRlclR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzW2ldID0gdHlwZXNbQnJhY2tldFN0YWNrW3NKXV0gPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNJID0gc0o7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoQnJhY2tldFN0YWNrLmxlbmd0aCA9PSAxODkgLyogQnJhY2tldGVkLk1heERlcHRoICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NJKytdID0gaTtcbiAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NJKytdID0gY2g7XG4gICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSSsrXSA9IGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKHR5cGUgPSB0eXBlc1tpXSkgPT0gMiAvKiBULlIgKi8gfHwgdHlwZSA9PSAxIC8qIFQuTCAqLykge1xuICAgICAgICAgICAgICAgIGxldCBlbWJlZCA9IHR5cGUgPT0gb3V0ZXJUeXBlO1xuICAgICAgICAgICAgICAgIGNvbnRleHQgPSBlbWJlZCA/IDAgOiAxIC8qIEJyYWNrZXRlZC5PcHBvc2l0ZUJlZm9yZSAqLztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzSiA9IHNJIC0gMzsgc0ogPj0gMDsgc0ogLT0gMykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VyID0gQnJhY2tldFN0YWNrW3NKICsgMl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXIgJiAyIC8qIEJyYWNrZXRlZC5FbWJlZEluc2lkZSAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW1iZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEJyYWNrZXRTdGFja1tzSiArIDJdIHw9IDIgLyogQnJhY2tldGVkLkVtYmVkSW5zaWRlICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ciAmIDQgLyogQnJhY2tldGVkLk9wcG9zaXRlSW5zaWRlICovKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgQnJhY2tldFN0YWNrW3NKICsgMl0gfD0gNCAvKiBCcmFja2V0ZWQuT3Bwb3NpdGVJbnNpZGUgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBwcm9jZXNzTmV1dHJhbHMockZyb20sIHJUbywgaXNvbGF0ZXMsIG91dGVyVHlwZSkge1xuICAgIGZvciAobGV0IGlJID0gMCwgcHJldiA9IG91dGVyVHlwZTsgaUkgPD0gaXNvbGF0ZXMubGVuZ3RoOyBpSSsrKSB7XG4gICAgICAgIGxldCBmcm9tID0gaUkgPyBpc29sYXRlc1tpSSAtIDFdLnRvIDogckZyb20sIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgLy8gTjEuIEEgc2VxdWVuY2Ugb2YgbmV1dHJhbHMgdGFrZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGVcbiAgICAgICAgLy8gc3Vycm91bmRpbmcgc3Ryb25nIHRleHQgaWYgdGhlIHRleHQgb24gYm90aCBzaWRlcyBoYXMgdGhlIHNhbWVcbiAgICAgICAgLy8gZGlyZWN0aW9uLiBFdXJvcGVhbiBhbmQgQXJhYmljIG51bWJlcnMgYWN0IGFzIGlmIHRoZXkgd2VyZSBSIGluXG4gICAgICAgIC8vIHRlcm1zIG9mIHRoZWlyIGluZmx1ZW5jZSBvbiBuZXV0cmFscy4gU3RhcnQtb2YtbGV2ZWwtcnVuIChzb3IpXG4gICAgICAgIC8vIGFuZCBlbmQtb2YtbGV2ZWwtcnVuIChlb3IpIGFyZSB1c2VkIGF0IGxldmVsIHJ1biBib3VuZGFyaWVzLlxuICAgICAgICAvLyBOMi4gQW55IHJlbWFpbmluZyBuZXV0cmFscyB0YWtlIHRoZSBlbWJlZGRpbmcgZGlyZWN0aW9uLlxuICAgICAgICAvLyAoTGVmdCBhZnRlciB0aGlzOiBMLCBSLCBFTitBTilcbiAgICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzspIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZSA9PSAyNTYgLyogVC5OSSAqLykge1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmQgPT0gdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpSSA9PSBpc29sYXRlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBpc29sYXRlc1tpSSsrXS50bztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gaUkgPCBpc29sYXRlcy5sZW5ndGggPyBpc29sYXRlc1tpSV0uZnJvbSA6IHJUbztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlc1tlbmRdID09IDI1NiAvKiBULk5JICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBiZWZvcmVMID0gcHJldiA9PSAxIC8qIFQuTCAqLztcbiAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJMID0gKGVuZCA8IHJUbyA/IHR5cGVzW2VuZF0gOiBvdXRlclR5cGUpID09IDEgLyogVC5MICovO1xuICAgICAgICAgICAgICAgIGxldCByZXBsYWNlID0gYmVmb3JlTCA9PSBhZnRlckwgPyAoYmVmb3JlTCA/IDEgLyogVC5MICovIDogMiAvKiBULlIgKi8pIDogb3V0ZXJUeXBlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBlbmQsIGpJID0gaUksIGZyb21KID0gakkgPyBpc29sYXRlc1tqSSAtIDFdLnRvIDogckZyb207IGogPiBpOykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBmcm9tSikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGlzb2xhdGVzWy0takldLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tSiA9IGpJID8gaXNvbGF0ZXNbakkgLSAxXS50byA6IHJGcm9tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVzWy0tal0gPSByZXBsYWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpID0gZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IHR5cGU7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8gRmluZCB0aGUgY29udGlndW91cyByYW5nZXMgb2YgY2hhcmFjdGVyIHR5cGVzIGluIGEgZ2l2ZW4gcmFuZ2UsIGFuZFxuLy8gZW1pdCBzcGFucyBmb3IgdGhlbS4gRmxpcCB0aGUgb3JkZXIgb2YgdGhlIHNwYW5zIGFzIGFwcHJvcHJpYXRlXG4vLyBiYXNlZCBvbiB0aGUgbGV2ZWwsIGFuZCBjYWxsIHRocm91Z2ggdG8gY29tcHV0ZSB0aGUgc3BhbnMgZm9yXG4vLyBpc29sYXRlcyBhdCB0aGUgcHJvcGVyIHBvaW50LlxuZnVuY3Rpb24gZW1pdFNwYW5zKGxpbmUsIGZyb20sIHRvLCBsZXZlbCwgYmFzZUxldmVsLCBpc29sYXRlcywgb3JkZXIpIHtcbiAgICBsZXQgb3VyVHlwZSA9IGxldmVsICUgMiA/IDIgLyogVC5SICovIDogMSAvKiBULkwgKi87XG4gICAgaWYgKChsZXZlbCAlIDIpID09IChiYXNlTGV2ZWwgJSAyKSkgeyAvLyBTYW1lIGRpciBhcyBiYXNlIGRpcmVjdGlvbiwgZG9uJ3QgZmxpcFxuICAgICAgICBmb3IgKGxldCBpQ2ggPSBmcm9tLCBpSSA9IDA7IGlDaCA8IHRvOykge1xuICAgICAgICAgICAgLy8gU2NhbiBhIHNlY3Rpb24gb2YgY2hhcmFjdGVycyBpbiBkaXJlY3Rpb24gb3VyVHlwZSwgdW5sZXNzXG4gICAgICAgICAgICAvLyB0aGVyZSdzIGFub3RoZXIgdHlwZSBvZiBjaGFyIHJpZ2h0IGFmdGVyIGlDaCwgaW4gd2hpY2ggY2FzZVxuICAgICAgICAgICAgLy8gd2Ugc2NhbiBhIHNlY3Rpb24gb2Ygb3RoZXIgY2hhcmFjdGVycyAod2hpY2gsIGlmIG91clR5cGUgPT1cbiAgICAgICAgICAgIC8vIFQuTCwgbWF5IGNvbnRhaW4gYm90aCBULlIgYW5kIFQuQU4gY2hhcnMpLlxuICAgICAgICAgICAgbGV0IHNhbWVEaXIgPSB0cnVlLCBpc051bSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGlJID09IGlzb2xhdGVzLmxlbmd0aCB8fCBpQ2ggPCBpc29sYXRlc1tpSV0uZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdHlwZXNbaUNoXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBvdXJUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhbWVEaXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaXNOdW0gPSBuZXh0ID09IDE2IC8qIFQuQU4gKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSG9sZHMgYW4gYXJyYXkgb2YgaXNvbGF0ZXMgdG8gcGFzcyB0byBhIHJlY3Vyc2l2ZSBjYWxsIGlmIHdlXG4gICAgICAgICAgICAvLyBtdXN0IHJlY3Vyc2UgKHRvIGRpc3Rpbmd1aXNoIFQuQU4gaW5zaWRlIGFuIFJUTCBzZWN0aW9uIGluXG4gICAgICAgICAgICAvLyBMVFIgdGV4dCksIG51bGwgaWYgd2UgY2FuIGVtaXQgZGlyZWN0bHlcbiAgICAgICAgICAgIGxldCByZWN1cnNlID0gIXNhbWVEaXIgJiYgb3VyVHlwZSA9PSAxIC8qIFQuTCAqLyA/IFtdIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBsb2NhbExldmVsID0gc2FtZURpciA/IGxldmVsIDogbGV2ZWwgKyAxO1xuICAgICAgICAgICAgbGV0IGlTY2FuID0gaUNoO1xuICAgICAgICAgICAgcnVuOiBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlJIDwgaXNvbGF0ZXMubGVuZ3RoICYmIGlTY2FuID09IGlzb2xhdGVzW2lJXS5mcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc051bSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzbyA9IGlzb2xhdGVzW2lJXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2NhbiBhaGVhZCB0byB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBhbm90aGVyIGNoYXIgaW4gdGhpcyBkaXIgYWZ0ZXIgdGhlIGlzb2xhdGUocylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzYW1lRGlyKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdXB0byA9IGlzby50bywgakkgPSBpSSArIDE7Oykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cHRvID09IHRvKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpJIDwgaXNvbGF0ZXMubGVuZ3RoICYmIGlzb2xhdGVzW2pJXS5mcm9tID09IHVwdG8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwdG8gPSBpc29sYXRlc1tqSSsrXS50bztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlc1t1cHRvXSA9PSBvdXJUeXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaUkrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UucHVzaChpc28pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzby5mcm9tID4gaUNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlDaCwgaXNvLmZyb20sIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaXJTd2FwID0gKGlzby5kaXJlY3Rpb24gPT0gTFRSKSAhPSAhKGxvY2FsTGV2ZWwgJSAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVTZWN0aW9uT3JkZXIobGluZSwgZGlyU3dhcCA/IGxldmVsICsgMSA6IGxldmVsLCBiYXNlTGV2ZWwsIGlzby5pbm5lciwgaXNvLmZyb20sIGlzby50bywgb3JkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaUNoID0gaXNvLnRvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlTY2FuID0gaXNvLnRvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpU2NhbiA9PSB0byB8fCAoc2FtZURpciA/IHR5cGVzW2lTY2FuXSAhPSBvdXJUeXBlIDogdHlwZXNbaVNjYW5dID09IG91clR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaVNjYW4rKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVjdXJzZSlcbiAgICAgICAgICAgICAgICBlbWl0U3BhbnMobGluZSwgaUNoLCBpU2NhbiwgbGV2ZWwgKyAxLCBiYXNlTGV2ZWwsIHJlY3Vyc2UsIG9yZGVyKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlDaCA8IGlTY2FuKVxuICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlDaCwgaVNjYW4sIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgIGlDaCA9IGlTY2FuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJdGVyYXRlIGluIHJldmVyc2UgdG8gZmxpcCB0aGUgc3BhbiBvcmRlci4gU2FtZSBjb2RlIGFnYWluLCBidXRcbiAgICAgICAgLy8gZ29pbmcgZnJvbSB0aGUgYmFjayBvZiB0aGUgc2VjdGlvbiB0byB0aGUgZnJvbnRcbiAgICAgICAgZm9yIChsZXQgaUNoID0gdG8sIGlJID0gaXNvbGF0ZXMubGVuZ3RoOyBpQ2ggPiBmcm9tOykge1xuICAgICAgICAgICAgbGV0IHNhbWVEaXIgPSB0cnVlLCBpc051bSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFpSSB8fCBpQ2ggPiBpc29sYXRlc1tpSSAtIDFdLnRvKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0eXBlc1tpQ2ggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBvdXJUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhbWVEaXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaXNOdW0gPSBuZXh0ID09IDE2IC8qIFQuQU4gKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlY3Vyc2UgPSAhc2FtZURpciAmJiBvdXJUeXBlID09IDEgLyogVC5MICovID8gW10gOiBudWxsO1xuICAgICAgICAgICAgbGV0IGxvY2FsTGV2ZWwgPSBzYW1lRGlyID8gbGV2ZWwgOiBsZXZlbCArIDE7XG4gICAgICAgICAgICBsZXQgaVNjYW4gPSBpQ2g7XG4gICAgICAgICAgICBydW46IGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBpZiAoaUkgJiYgaVNjYW4gPT0gaXNvbGF0ZXNbaUkgLSAxXS50bykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOdW0pXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgIGxldCBpc28gPSBpc29sYXRlc1stLWlJXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2NhbiBhaGVhZCB0byB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBhbm90aGVyIGNoYXIgaW4gdGhpcyBkaXIgYWZ0ZXIgdGhlIGlzb2xhdGUocylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzYW1lRGlyKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdXB0byA9IGlzby5mcm9tLCBqSSA9IGlJOzspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXB0byA9PSBmcm9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBydW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpJICYmIGlzb2xhdGVzW2pJIC0gMV0udG8gPT0gdXB0bylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXB0byA9IGlzb2xhdGVzWy0takldLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZXNbdXB0byAtIDFdID09IG91clR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVjdXJzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZS5wdXNoKGlzbyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNvLnRvIDwgaUNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlzby50bywgaUNoLCBsb2NhbExldmVsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlyU3dhcCA9IChpc28uZGlyZWN0aW9uID09IExUUikgIT0gIShsb2NhbExldmVsICUgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlU2VjdGlvbk9yZGVyKGxpbmUsIGRpclN3YXAgPyBsZXZlbCArIDEgOiBsZXZlbCwgYmFzZUxldmVsLCBpc28uaW5uZXIsIGlzby5mcm9tLCBpc28udG8sIG9yZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlDaCA9IGlzby5mcm9tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlTY2FuID0gaXNvLmZyb207XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlTY2FuID09IGZyb20gfHwgKHNhbWVEaXIgPyB0eXBlc1tpU2NhbiAtIDFdICE9IG91clR5cGUgOiB0eXBlc1tpU2NhbiAtIDFdID09IG91clR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaVNjYW4tLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVjdXJzZSlcbiAgICAgICAgICAgICAgICBlbWl0U3BhbnMobGluZSwgaVNjYW4sIGlDaCwgbGV2ZWwgKyAxLCBiYXNlTGV2ZWwsIHJlY3Vyc2UsIG9yZGVyKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlTY2FuIDwgaUNoKVxuICAgICAgICAgICAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKGlTY2FuLCBpQ2gsIGxvY2FsTGV2ZWwpKTtcbiAgICAgICAgICAgIGlDaCA9IGlTY2FuO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZVNlY3Rpb25PcmRlcihsaW5lLCBsZXZlbCwgYmFzZUxldmVsLCBpc29sYXRlcywgZnJvbSwgdG8sIG9yZGVyKSB7XG4gICAgbGV0IG91dGVyVHlwZSA9IChsZXZlbCAlIDIgPyAyIC8qIFQuUiAqLyA6IDEgLyogVC5MICovKTtcbiAgICBjb21wdXRlQ2hhclR5cGVzKGxpbmUsIGZyb20sIHRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKTtcbiAgICBwcm9jZXNzQnJhY2tldFBhaXJzKGxpbmUsIGZyb20sIHRvLCBpc29sYXRlcywgb3V0ZXJUeXBlKTtcbiAgICBwcm9jZXNzTmV1dHJhbHMoZnJvbSwgdG8sIGlzb2xhdGVzLCBvdXRlclR5cGUpO1xuICAgIGVtaXRTcGFucyhsaW5lLCBmcm9tLCB0bywgbGV2ZWwsIGJhc2VMZXZlbCwgaXNvbGF0ZXMsIG9yZGVyKTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVPcmRlcihsaW5lLCBkaXJlY3Rpb24sIGlzb2xhdGVzKSB7XG4gICAgaWYgKCFsaW5lKVxuICAgICAgICByZXR1cm4gW25ldyBCaWRpU3BhbigwLCAwLCBkaXJlY3Rpb24gPT0gUlRMID8gMSA6IDApXTtcbiAgICBpZiAoZGlyZWN0aW9uID09IExUUiAmJiAhaXNvbGF0ZXMubGVuZ3RoICYmICFCaWRpUkUudGVzdChsaW5lKSlcbiAgICAgICAgcmV0dXJuIHRyaXZpYWxPcmRlcihsaW5lLmxlbmd0aCk7XG4gICAgaWYgKGlzb2xhdGVzLmxlbmd0aClcbiAgICAgICAgd2hpbGUgKGxpbmUubGVuZ3RoID4gdHlwZXMubGVuZ3RoKVxuICAgICAgICAgICAgdHlwZXNbdHlwZXMubGVuZ3RoXSA9IDI1NiAvKiBULk5JICovOyAvLyBNYWtlIHN1cmUgdHlwZXMgYXJyYXkgaGFzIG5vIGdhcHNcbiAgICBsZXQgb3JkZXIgPSBbXSwgbGV2ZWwgPSBkaXJlY3Rpb24gPT0gTFRSID8gMCA6IDE7XG4gICAgY29tcHV0ZVNlY3Rpb25PcmRlcihsaW5lLCBsZXZlbCwgbGV2ZWwsIGlzb2xhdGVzLCAwLCBsaW5lLmxlbmd0aCwgb3JkZXIpO1xuICAgIHJldHVybiBvcmRlcjtcbn1cbmZ1bmN0aW9uIHRyaXZpYWxPcmRlcihsZW5ndGgpIHtcbiAgICByZXR1cm4gW25ldyBCaWRpU3BhbigwLCBsZW5ndGgsIDApXTtcbn1cbmxldCBtb3ZlZE92ZXIgPSBcIlwiO1xuLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBtb3ZlcyBzdHJpY3RseSB2aXN1YWxseSwgd2l0aG91dCBjb25jZXJuIGZvciBhXG4vLyB0cmF2ZXJzYWwgdmlzaXRpbmcgZXZlcnkgbG9naWNhbCBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nLiBJdCB3aWxsXG4vLyBzdGlsbCBkbyBzbyBmb3Igc2ltcGxlIGlucHV0LCBidXQgc2l0dWF0aW9ucyBsaWtlIG11bHRpcGxlIGlzb2xhdGVzXG4vLyB3aXRoIHRoZSBzYW1lIGxldmVsIG5leHQgdG8gZWFjaCBvdGhlciwgb3IgdGV4dCBnb2luZyBhZ2FpbnN0IHRoZVxuLy8gbWFpbiBkaXIgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgd2lsbCBtYWtlIHNvbWUgcG9zaXRpb25zXG4vLyB1bnJlYWNoYWJsZSB3aXRoIHRoaXMgbW90aW9uLiBFYWNoIHZpc2libGUgY3Vyc29yIHBvc2l0aW9uIHdpbGxcbi8vIGNvcnJlc3BvbmQgdG8gdGhlIGxvd2VyLWxldmVsIGJpZGkgc3BhbiB0aGF0IHRvdWNoZXMgaXQuXG4vL1xuLy8gVGhlIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHNvbHZlIGFuIG9yZGVyIGdsb2JhbGx5IGZvciBhIGdpdmVuXG4vLyBsaW5lLCBtYWtpbmcgc3VyZSB0aGF0IGl0IGluY2x1ZGVzIGV2ZXJ5IHBvc2l0aW9uLCBidXQgdGhhdCB3b3VsZFxuLy8gcmVxdWlyZSBhc3NvY2lhdGluZyBub24tY2Fub25pY2FsIChoaWdoZXIgYmlkaSBzcGFuIGxldmVsKVxuLy8gcG9zaXRpb25zIHdpdGggYSBnaXZlbiB2aXN1YWwgcG9zaXRpb24sIHdoaWNoIGlzIGxpa2VseSB0byBjb25mdXNlXG4vLyBwZW9wbGUuIChBbmQgd291bGQgZ2VuZXJhbGx5IGJlIGEgbG90IG1vcmUgY29tcGxpY2F0ZWQuKVxuZnVuY3Rpb24gbW92ZVZpc3VhbGx5KGxpbmUsIG9yZGVyLCBkaXIsIHN0YXJ0LCBmb3J3YXJkKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBzdGFydEluZGV4ID0gc3RhcnQuaGVhZCAtIGxpbmUuZnJvbTtcbiAgICBsZXQgc3BhbkkgPSBCaWRpU3Bhbi5maW5kKG9yZGVyLCBzdGFydEluZGV4LCAoX2EgPSBzdGFydC5iaWRpTGV2ZWwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IC0xLCBzdGFydC5hc3NvYyk7XG4gICAgbGV0IHNwYW4gPSBvcmRlcltzcGFuSV0sIHNwYW5FbmQgPSBzcGFuLnNpZGUoZm9yd2FyZCwgZGlyKTtcbiAgICAvLyBFbmQgb2Ygc3BhblxuICAgIGlmIChzdGFydEluZGV4ID09IHNwYW5FbmQpIHtcbiAgICAgICAgbGV0IG5leHRJID0gc3BhbkkgKz0gZm9yd2FyZCA/IDEgOiAtMTtcbiAgICAgICAgaWYgKG5leHRJIDwgMCB8fCBuZXh0SSA+PSBvcmRlci5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgc3BhbiA9IG9yZGVyW3NwYW5JID0gbmV4dEldO1xuICAgICAgICBzdGFydEluZGV4ID0gc3Bhbi5zaWRlKCFmb3J3YXJkLCBkaXIpO1xuICAgICAgICBzcGFuRW5kID0gc3Bhbi5zaWRlKGZvcndhcmQsIGRpcik7XG4gICAgfVxuICAgIGxldCBuZXh0SW5kZXggPSBmaW5kQ2x1c3RlckJyZWFrKGxpbmUudGV4dCwgc3RhcnRJbmRleCwgc3Bhbi5mb3J3YXJkKGZvcndhcmQsIGRpcikpO1xuICAgIGlmIChuZXh0SW5kZXggPCBzcGFuLmZyb20gfHwgbmV4dEluZGV4ID4gc3Bhbi50bylcbiAgICAgICAgbmV4dEluZGV4ID0gc3BhbkVuZDtcbiAgICBtb3ZlZE92ZXIgPSBsaW5lLnRleHQuc2xpY2UoTWF0aC5taW4oc3RhcnRJbmRleCwgbmV4dEluZGV4KSwgTWF0aC5tYXgoc3RhcnRJbmRleCwgbmV4dEluZGV4KSk7XG4gICAgbGV0IG5leHRTcGFuID0gc3BhbkkgPT0gKGZvcndhcmQgPyBvcmRlci5sZW5ndGggLSAxIDogMCkgPyBudWxsIDogb3JkZXJbc3BhbkkgKyAoZm9yd2FyZCA/IDEgOiAtMSldO1xuICAgIGlmIChuZXh0U3BhbiAmJiBuZXh0SW5kZXggPT0gc3BhbkVuZCAmJiBuZXh0U3Bhbi5sZXZlbCArIChmb3J3YXJkID8gMCA6IDEpIDwgc3Bhbi5sZXZlbClcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IobmV4dFNwYW4uc2lkZSghZm9yd2FyZCwgZGlyKSArIGxpbmUuZnJvbSwgbmV4dFNwYW4uZm9yd2FyZChmb3J3YXJkLCBkaXIpID8gMSA6IC0xLCBuZXh0U3Bhbi5sZXZlbCk7XG4gICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IobmV4dEluZGV4ICsgbGluZS5mcm9tLCBzcGFuLmZvcndhcmQoZm9yd2FyZCwgZGlyKSA/IC0xIDogMSwgc3Bhbi5sZXZlbCk7XG59XG5mdW5jdGlvbiBhdXRvRGlyZWN0aW9uKHRleHQsIGZyb20sIHRvKSB7XG4gICAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0bzsgaSsrKSB7XG4gICAgICAgIGxldCB0eXBlID0gY2hhclR5cGUodGV4dC5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgaWYgKHR5cGUgPT0gMSAvKiBULkwgKi8pXG4gICAgICAgICAgICByZXR1cm4gTFRSO1xuICAgICAgICBpZiAodHlwZSA9PSAyIC8qIFQuUiAqLyB8fCB0eXBlID09IDQgLyogVC5BTCAqLylcbiAgICAgICAgICAgIHJldHVybiBSVEw7XG4gICAgfVxuICAgIHJldHVybiBMVFI7XG59XG5cbmNvbnN0IGNsaWNrQWRkc1NlbGVjdGlvblJhbmdlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZHJhZ01vdmVzU2VsZWN0aW9uJDEgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBtb3VzZVNlbGVjdGlvblN0eWxlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZXhjZXB0aW9uU2luayA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IHVwZGF0ZUxpc3RlbmVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgaW5wdXRIYW5kbGVyID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgZm9jdXNDaGFuZ2VFZmZlY3QgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBwZXJMaW5lVGV4dERpcmVjdGlvbiA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuc29tZSh4ID0+IHgpXG59KTtcbmNvbnN0IG5hdGl2ZVNlbGVjdGlvbkhpZGRlbiA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuc29tZSh4ID0+IHgpXG59KTtcbmNsYXNzIFNjcm9sbFRhcmdldCB7XG4gICAgY29uc3RydWN0b3IocmFuZ2UsIHkgPSBcIm5lYXJlc3RcIiwgeCA9IFwibmVhcmVzdFwiLCB5TWFyZ2luID0gNSwgeE1hcmdpbiA9IDUsIFxuICAgIC8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgYWJ1c2VkIHRvIGFsc28gc3RvcmUgcHJlY2lzZSBzY3JvbGxcbiAgICAvLyBzbmFwc2hvdHMsIGluc3RlYWQgb2YgYSBgc2Nyb2xsSW50b1ZpZXdgIHJlcXVlc3QuIFdoZW4gdGhpc1xuICAgIC8vIGZsYWcgaXMgYHRydWVgLCBgcmFuZ2VgIHBvaW50cyBhdCBhIHBvc2l0aW9uIGluIHRoZSByZWZlcmVuY2VcbiAgICAvLyBsaW5lLCBgeU1hcmdpbmAgaG9sZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdG9wIG9mIHRoYXRcbiAgICAvLyBsaW5lIGFuZCB0aGUgdG9wIG9mIHRoZSBlZGl0b3IsIGFuZCBgeE1hcmdpbmAgaG9sZHMgdGhlXG4gICAgLy8gZWRpdG9yJ3MgYHNjcm9sbExlZnRgLlxuICAgIGlzU25hcHNob3QgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnJhbmdlID0gcmFuZ2U7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueU1hcmdpbiA9IHlNYXJnaW47XG4gICAgICAgIHRoaXMueE1hcmdpbiA9IHhNYXJnaW47XG4gICAgICAgIHRoaXMuaXNTbmFwc2hvdCA9IGlzU25hcHNob3Q7XG4gICAgfVxuICAgIG1hcChjaGFuZ2VzKSB7XG4gICAgICAgIHJldHVybiBjaGFuZ2VzLmVtcHR5ID8gdGhpcyA6XG4gICAgICAgICAgICBuZXcgU2Nyb2xsVGFyZ2V0KHRoaXMucmFuZ2UubWFwKGNoYW5nZXMpLCB0aGlzLnksIHRoaXMueCwgdGhpcy55TWFyZ2luLCB0aGlzLnhNYXJnaW4sIHRoaXMuaXNTbmFwc2hvdCk7XG4gICAgfVxuICAgIGNsaXAoc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2UudG8gPD0gc3RhdGUuZG9jLmxlbmd0aCA/IHRoaXMgOlxuICAgICAgICAgICAgbmV3IFNjcm9sbFRhcmdldChFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHN0YXRlLmRvYy5sZW5ndGgpLCB0aGlzLnksIHRoaXMueCwgdGhpcy55TWFyZ2luLCB0aGlzLnhNYXJnaW4sIHRoaXMuaXNTbmFwc2hvdCk7XG4gICAgfVxufVxuY29uc3Qgc2Nyb2xsSW50b1ZpZXcgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKHsgbWFwOiAodCwgY2gpID0+IHQubWFwKGNoKSB9KTtcbi8qKlxuTG9nIG9yIHJlcG9ydCBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uIGluIGNsaWVudCBjb2RlLiBTaG91bGRcbnByb2JhYmx5IG9ubHkgYmUgdXNlZCBieSBleHRlbnNpb24gY29kZSB0aGF0IGFsbG93cyBjbGllbnQgY29kZSB0b1xucHJvdmlkZSBmdW5jdGlvbnMsIGFuZCBjYWxscyB0aG9zZSBmdW5jdGlvbnMgaW4gYSBjb250ZXh0IHdoZXJlIGFuXG5leGNlcHRpb24gY2FuJ3QgYmUgcHJvcGFnYXRlZCB0byBjYWxsaW5nIGNvZGUgaW4gYSByZWFzb25hYmxlIHdheVxuKGZvciBleGFtcGxlIHdoZW4gaW4gYW4gZXZlbnQgaGFuZGxlcikuXG5cbkVpdGhlciBjYWxscyBhIGhhbmRsZXIgcmVnaXN0ZXJlZCB3aXRoXG5bYEVkaXRvclZpZXcuZXhjZXB0aW9uU2lua2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmV4Y2VwdGlvblNpbmspLFxuYHdpbmRvdy5vbmVycm9yYCwgaWYgZGVmaW5lZCwgb3IgYGNvbnNvbGUuZXJyb3JgIChpbiB3aGljaCBjYXNlXG5pdCdsbCBwYXNzIGBjb250ZXh0YCwgd2hlbiBnaXZlbiwgYXMgZmlyc3QgYXJndW1lbnQpLlxuKi9cbmZ1bmN0aW9uIGxvZ0V4Y2VwdGlvbihzdGF0ZSwgZXhjZXB0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IGhhbmRsZXIgPSBzdGF0ZS5mYWNldChleGNlcHRpb25TaW5rKTtcbiAgICBpZiAoaGFuZGxlci5sZW5ndGgpXG4gICAgICAgIGhhbmRsZXJbMF0oZXhjZXB0aW9uKTtcbiAgICBlbHNlIGlmICh3aW5kb3cub25lcnJvcilcbiAgICAgICAgd2luZG93Lm9uZXJyb3IoU3RyaW5nKGV4Y2VwdGlvbiksIGNvbnRleHQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBleGNlcHRpb24pO1xuICAgIGVsc2UgaWYgKGNvbnRleHQpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY29udGV4dCArIFwiOlwiLCBleGNlcHRpb24pO1xuICAgIGVsc2VcbiAgICAgICAgY29uc29sZS5lcnJvcihleGNlcHRpb24pO1xufVxuY29uc3QgZWRpdGFibGUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5sZW5ndGggPyB2YWx1ZXNbMF0gOiB0cnVlIH0pO1xubGV0IG5leHRQbHVnaW5JRCA9IDA7XG5jb25zdCB2aWV3UGx1Z2luID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5WaWV3IHBsdWdpbnMgYXNzb2NpYXRlIHN0YXRlZnVsIHZhbHVlcyB3aXRoIGEgdmlldy4gVGhleSBjYW5cbmluZmx1ZW5jZSB0aGUgd2F5IHRoZSBjb250ZW50IGlzIGRyYXduLCBhbmQgYXJlIG5vdGlmaWVkIG9mIHRoaW5nc1xudGhhdCBoYXBwZW4gaW4gdGhlIHZpZXcuXG4qL1xuY2xhc3MgVmlld1BsdWdpbiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpZCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjcmVhdGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZG9tRXZlbnRIYW5kbGVycywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkb21FdmVudE9ic2VydmVycywgYnVpbGRFeHRlbnNpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRIYW5kbGVycyA9IGRvbUV2ZW50SGFuZGxlcnM7XG4gICAgICAgIHRoaXMuZG9tRXZlbnRPYnNlcnZlcnMgPSBkb21FdmVudE9ic2VydmVycztcbiAgICAgICAgdGhpcy5leHRlbnNpb24gPSBidWlsZEV4dGVuc2lvbnModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIHBsdWdpbiBmcm9tIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZVxuICAgIHBsdWdpbidzIHZhbHVlLCBnaXZlbiBhbiBlZGl0b3Igdmlldy5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoY3JlYXRlLCBzcGVjKSB7XG4gICAgICAgIGNvbnN0IHsgZXZlbnRIYW5kbGVycywgZXZlbnRPYnNlcnZlcnMsIHByb3ZpZGUsIGRlY29yYXRpb25zOiBkZWNvIH0gPSBzcGVjIHx8IHt9O1xuICAgICAgICByZXR1cm4gbmV3IFZpZXdQbHVnaW4obmV4dFBsdWdpbklEKyssIGNyZWF0ZSwgZXZlbnRIYW5kbGVycywgZXZlbnRPYnNlcnZlcnMsIHBsdWdpbiA9PiB7XG4gICAgICAgICAgICBsZXQgZXh0ID0gW3ZpZXdQbHVnaW4ub2YocGx1Z2luKV07XG4gICAgICAgICAgICBpZiAoZGVjbylcbiAgICAgICAgICAgICAgICBleHQucHVzaChkZWNvcmF0aW9ucy5vZih2aWV3ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBsdWdpbkluc3QgPSB2aWV3LnBsdWdpbihwbHVnaW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGx1Z2luSW5zdCA/IGRlY28ocGx1Z2luSW5zdCkgOiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGUpXG4gICAgICAgICAgICAgICAgZXh0LnB1c2gocHJvdmlkZShwbHVnaW4pKTtcbiAgICAgICAgICAgIHJldHVybiBleHQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBwbHVnaW4gZm9yIGEgY2xhc3Mgd2hvc2UgY29uc3RydWN0b3IgdGFrZXMgYSBzaW5nbGVcbiAgICBlZGl0b3IgdmlldyBhcyBhcmd1bWVudC5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tQ2xhc3MoY2xzLCBzcGVjKSB7XG4gICAgICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+IG5ldyBjbHModmlldyksIHNwZWMpO1xuICAgIH1cbn1cbmNsYXNzIFBsdWdpbkluc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgICAgIC8vIFdoZW4gc3RhcnRpbmcgYW4gdXBkYXRlLCBhbGwgcGx1Z2lucyBoYXZlIHRoaXMgZmllbGQgc2V0IHRvIHRoZVxuICAgICAgICAvLyB1cGRhdGUgb2JqZWN0LCBpbmRpY2F0aW5nIHRoZXkgbmVlZCB0byBiZSB1cGRhdGVkLiBXaGVuIGZpbmlzaGVkXG4gICAgICAgIC8vIHVwZGF0aW5nLCBpdCBpcyBzZXQgdG8gYGZhbHNlYC4gUmV0cmlldmluZyBhIHBsdWdpbiB0aGF0IG5lZWRzIHRvXG4gICAgICAgIC8vIGJlIHVwZGF0ZWQgd2l0aCBgdmlldy5wbHVnaW5gIGZvcmNlcyBhbiBlYWdlciB1cGRhdGUuXG4gICAgICAgIHRoaXMubXVzdFVwZGF0ZSA9IG51bGw7XG4gICAgICAgIC8vIFRoaXMgaXMgbnVsbCB3aGVuIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIGJ1dFxuICAgICAgICAvLyBpbml0aWFsaXplZCBvbiB0aGUgZmlyc3QgdXBkYXRlLlxuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdXBkYXRlKHZpZXcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zcGVjKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuc3BlYy5jcmVhdGUodmlldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlLCBcIkNvZGVNaXJyb3IgcGx1Z2luIGNyYXNoZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm11c3RVcGRhdGUpIHtcbiAgICAgICAgICAgIGxldCB1cGRhdGUgPSB0aGlzLm11c3RVcGRhdGU7XG4gICAgICAgICAgICB0aGlzLm11c3RVcGRhdGUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUudXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHVwZGF0ZS5zdGF0ZSwgZSwgXCJDb2RlTWlycm9yIHBsdWdpbiBjcmFzaGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZS5kZXN0cm95KVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkZXN0cm95KHZpZXcpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoKF9hID0gdGhpcy52YWx1ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlc3Ryb3kpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih2aWV3LnN0YXRlLCBlLCBcIkNvZGVNaXJyb3IgcGx1Z2luIGNyYXNoZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVhY3RpdmF0ZSgpIHtcbiAgICAgICAgdGhpcy5zcGVjID0gdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfVxufVxuY29uc3QgZWRpdG9yQXR0cmlidXRlcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGNvbnRlbnRBdHRyaWJ1dGVzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLy8gUHJvdmlkZSBkZWNvcmF0aW9uc1xuY29uc3QgZGVjb3JhdGlvbnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBvdXRlckRlY29yYXRpb25zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgYXRvbWljUmFuZ2VzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY29uc3QgYmlkaUlzb2xhdGVkUmFuZ2VzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuZnVuY3Rpb24gZ2V0SXNvbGF0ZWRSYW5nZXModmlldywgbGluZSkge1xuICAgIGxldCBpc29sYXRlcyA9IHZpZXcuc3RhdGUuZmFjZXQoYmlkaUlzb2xhdGVkUmFuZ2VzKTtcbiAgICBpZiAoIWlzb2xhdGVzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGlzb2xhdGVzO1xuICAgIGxldCBzZXRzID0gaXNvbGF0ZXMubWFwKGkgPT4gaSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gaSh2aWV3KSA6IGkpO1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBSYW5nZVNldC5zcGFucyhzZXRzLCBsaW5lLmZyb20sIGxpbmUudG8sIHtcbiAgICAgICAgcG9pbnQoKSB7IH0sXG4gICAgICAgIHNwYW4oZnJvbURvYywgdG9Eb2MsIGFjdGl2ZSwgb3Blbikge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBmcm9tRG9jIC0gbGluZS5mcm9tLCB0byA9IHRvRG9jIC0gbGluZS5mcm9tO1xuICAgICAgICAgICAgbGV0IGxldmVsID0gcmVzdWx0O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGFjdGl2ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSwgb3Blbi0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRpcmVjdGlvbiA9IGFjdGl2ZVtpXS5zcGVjLmJpZGlJc29sYXRlLCB1cGRhdGU7XG4gICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBhdXRvRGlyZWN0aW9uKGxpbmUudGV4dCwgZnJvbSwgdG8pO1xuICAgICAgICAgICAgICAgIGlmIChvcGVuID4gMCAmJiBsZXZlbC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZSA9IGxldmVsW2xldmVsLmxlbmd0aCAtIDFdKS50byA9PSBmcm9tICYmIHVwZGF0ZS5kaXJlY3Rpb24gPT0gZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZS50byA9IHRvO1xuICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IHVwZGF0ZS5pbm5lcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhZGQgPSB7IGZyb20sIHRvLCBkaXJlY3Rpb24sIGlubmVyOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICBsZXZlbC5wdXNoKGFkZCk7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsID0gYWRkLmlubmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBzY3JvbGxNYXJnaW5zID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuZnVuY3Rpb24gZ2V0U2Nyb2xsTWFyZ2lucyh2aWV3KSB7XG4gICAgbGV0IGxlZnQgPSAwLCByaWdodCA9IDAsIHRvcCA9IDAsIGJvdHRvbSA9IDA7XG4gICAgZm9yIChsZXQgc291cmNlIG9mIHZpZXcuc3RhdGUuZmFjZXQoc2Nyb2xsTWFyZ2lucykpIHtcbiAgICAgICAgbGV0IG0gPSBzb3VyY2Uodmlldyk7XG4gICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgICBpZiAobS5sZWZ0ICE9IG51bGwpXG4gICAgICAgICAgICAgICAgbGVmdCA9IE1hdGgubWF4KGxlZnQsIG0ubGVmdCk7XG4gICAgICAgICAgICBpZiAobS5yaWdodCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHJpZ2h0ID0gTWF0aC5tYXgocmlnaHQsIG0ucmlnaHQpO1xuICAgICAgICAgICAgaWYgKG0udG9wICE9IG51bGwpXG4gICAgICAgICAgICAgICAgdG9wID0gTWF0aC5tYXgodG9wLCBtLnRvcCk7XG4gICAgICAgICAgICBpZiAobS5ib3R0b20gIT0gbnVsbClcbiAgICAgICAgICAgICAgICBib3R0b20gPSBNYXRoLm1heChib3R0b20sIG0uYm90dG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20gfTtcbn1cbmNvbnN0IHN0eWxlTW9kdWxlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuY2xhc3MgQ2hhbmdlZFJhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tQSwgdG9BLCBmcm9tQiwgdG9CKSB7XG4gICAgICAgIHRoaXMuZnJvbUEgPSBmcm9tQTtcbiAgICAgICAgdGhpcy50b0EgPSB0b0E7XG4gICAgICAgIHRoaXMuZnJvbUIgPSBmcm9tQjtcbiAgICAgICAgdGhpcy50b0IgPSB0b0I7XG4gICAgfVxuICAgIGpvaW4ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VkUmFuZ2UoTWF0aC5taW4odGhpcy5mcm9tQSwgb3RoZXIuZnJvbUEpLCBNYXRoLm1heCh0aGlzLnRvQSwgb3RoZXIudG9BKSwgTWF0aC5taW4odGhpcy5mcm9tQiwgb3RoZXIuZnJvbUIpLCBNYXRoLm1heCh0aGlzLnRvQiwgb3RoZXIudG9CKSk7XG4gICAgfVxuICAgIGFkZFRvU2V0KHNldCkge1xuICAgICAgICBsZXQgaSA9IHNldC5sZW5ndGgsIG1lID0gdGhpcztcbiAgICAgICAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHNldFtpIC0gMV07XG4gICAgICAgICAgICBpZiAocmFuZ2UuZnJvbUEgPiBtZS50b0EpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmFuZ2UudG9BIDwgbWUuZnJvbUEpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBtZSA9IG1lLmpvaW4ocmFuZ2UpO1xuICAgICAgICAgICAgc2V0LnNwbGljZShpIC0gMSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0LnNwbGljZShpLCAwLCBtZSk7XG4gICAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxuICAgIHN0YXRpYyBleHRlbmRXaXRoUmFuZ2VzKGRpZmYsIHJhbmdlcykge1xuICAgICAgICBpZiAocmFuZ2VzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZEkgPSAwLCBySSA9IDAsIHBvc0EgPSAwLCBwb3NCID0gMDs7IGRJKyspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZEkgPT0gZGlmZi5sZW5ndGggPyBudWxsIDogZGlmZltkSV0sIG9mZiA9IHBvc0EgLSBwb3NCO1xuICAgICAgICAgICAgbGV0IGVuZCA9IG5leHQgPyBuZXh0LmZyb21CIDogMWU5O1xuICAgICAgICAgICAgd2hpbGUgKHJJIDwgcmFuZ2VzLmxlbmd0aCAmJiByYW5nZXNbckldIDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSByYW5nZXNbckldLCB0byA9IHJhbmdlc1tySSArIDFdO1xuICAgICAgICAgICAgICAgIGxldCBmcm9tQiA9IE1hdGgubWF4KHBvc0IsIGZyb20pLCB0b0IgPSBNYXRoLm1pbihlbmQsIHRvKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUIgPD0gdG9CKVxuICAgICAgICAgICAgICAgICAgICBuZXcgQ2hhbmdlZFJhbmdlKGZyb21CICsgb2ZmLCB0b0IgKyBvZmYsIGZyb21CLCB0b0IpLmFkZFRvU2V0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHRvID4gZW5kKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJJICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIG5ldyBDaGFuZ2VkUmFuZ2UobmV4dC5mcm9tQSwgbmV4dC50b0EsIG5leHQuZnJvbUIsIG5leHQudG9CKS5hZGRUb1NldChyZXN1bHQpO1xuICAgICAgICAgICAgcG9zQSA9IG5leHQudG9BO1xuICAgICAgICAgICAgcG9zQiA9IG5leHQudG9CO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG5WaWV3IFtwbHVnaW5zXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuVmlld1BsdWdpbikgYXJlIGdpdmVuIGluc3RhbmNlcyBvZiB0aGlzXG5jbGFzcywgd2hpY2ggZGVzY3JpYmUgd2hhdCBoYXBwZW5lZCwgd2hlbmV2ZXIgdGhlIHZpZXcgaXMgdXBkYXRlZC5cbiovXG5jbGFzcyBWaWV3VXBkYXRlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgZWRpdG9yIHZpZXcgdGhhdCB0aGUgdXBkYXRlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICAqL1xuICAgIHZpZXcsIFxuICAgIC8qKlxuICAgIFRoZSBuZXcgZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgc3RhdGUsIFxuICAgIC8qKlxuICAgIFRoZSB0cmFuc2FjdGlvbnMgaW52b2x2ZWQgaW4gdGhlIHVwZGF0ZS4gTWF5IGJlIGVtcHR5LlxuICAgICovXG4gICAgdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB0cmFuc2FjdGlvbnM7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mbGFncyA9IDA7XG4gICAgICAgIHRoaXMuc3RhcnRTdGF0ZSA9IHZpZXcuc3RhdGU7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IENoYW5nZVNldC5lbXB0eSh0aGlzLnN0YXJ0U3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHRyYW5zYWN0aW9ucylcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlcyA9IHRoaXMuY2hhbmdlcy5jb21wb3NlKHRyLmNoYW5nZXMpO1xuICAgICAgICBsZXQgY2hhbmdlZFJhbmdlcyA9IFtdO1xuICAgICAgICB0aGlzLmNoYW5nZXMuaXRlckNoYW5nZWRSYW5nZXMoKGZyb21BLCB0b0EsIGZyb21CLCB0b0IpID0+IGNoYW5nZWRSYW5nZXMucHVzaChuZXcgQ2hhbmdlZFJhbmdlKGZyb21BLCB0b0EsIGZyb21CLCB0b0IpKSk7XG4gICAgICAgIHRoaXMuY2hhbmdlZFJhbmdlcyA9IGNoYW5nZWRSYW5nZXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZSh2aWV3LCBzdGF0ZSwgdHJhbnNhY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmlld1VwZGF0ZSh2aWV3LCBzdGF0ZSwgdHJhbnNhY3Rpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhlIFt2aWV3cG9ydF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudmlld3BvcnQpIG9yXG4gICAgW3Zpc2libGUgcmFuZ2VzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy52aXNpYmxlUmFuZ2VzKSBjaGFuZ2VkIGluIHRoaXNcbiAgICB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgdmlld3BvcnRDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiA0IC8qIFVwZGF0ZUZsYWcuVmlld3BvcnQgKi8pID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGhlaWdodCBvZiBhIGJsb2NrIGVsZW1lbnQgaW4gdGhlIGVkaXRvclxuICAgIGNoYW5nZWQgaW4gdGhpcyB1cGRhdGUuXG4gICAgKi9cbiAgICBnZXQgaGVpZ2h0Q2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZsYWdzICYgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLykgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZG9jdW1lbnQgd2FzIG1vZGlmaWVkIG9yIHRoZSBzaXplIG9mIHRoZVxuICAgIGVkaXRvciwgb3IgZWxlbWVudHMgd2l0aGluIHRoZSBlZGl0b3IsIGNoYW5nZWQuXG4gICAgKi9cbiAgICBnZXQgZ2VvbWV0cnlDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NDaGFuZ2VkIHx8ICh0aGlzLmZsYWdzICYgKDggLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLyB8IDIgLyogVXBkYXRlRmxhZy5IZWlnaHQgKi8pKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIHVwZGF0ZSBpbmRpY2F0ZXMgYSBmb2N1cyBjaGFuZ2UuXG4gICAgKi9cbiAgICBnZXQgZm9jdXNDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiAxIC8qIFVwZGF0ZUZsYWcuRm9jdXMgKi8pID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgZG9jdW1lbnQgY2hhbmdlZCBpbiB0aGlzIHVwZGF0ZS5cbiAgICAqL1xuICAgIGdldCBkb2NDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuY2hhbmdlcy5lbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgc2VsZWN0aW9uIHdhcyBleHBsaWNpdGx5IHNldCBpbiB0aGlzIHVwZGF0ZS5cbiAgICAqL1xuICAgIGdldCBzZWxlY3Rpb25TZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5zb21lKHRyID0+IHRyLnNlbGVjdGlvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGVtcHR5KCkgeyByZXR1cm4gdGhpcy5mbGFncyA9PSAwICYmIHRoaXMudHJhbnNhY3Rpb25zLmxlbmd0aCA9PSAwOyB9XG59XG5cbmNsYXNzIERvY1ZpZXcgZXh0ZW5kcyBDb250ZW50VmlldyB7XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMudmlldy5zdGF0ZS5kb2MubGVuZ3RoOyB9XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gW107XG4gICAgICAgIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXAgPSBbXTtcbiAgICAgICAgdGhpcy5kb21DaGFuZ2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYXNDb21wb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24gPSBuZXcgU2V0O1xuICAgICAgICAvLyBUcmFjayBhIG1pbmltdW0gd2lkdGggZm9yIHRoZSBlZGl0b3IuIFdoZW4gbWVhc3VyaW5nIHNpemVzIGluXG4gICAgICAgIC8vIG1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHMsIHRoaXMgaXMgdXBkYXRlZCB0byBwb2ludCBhdCB0aGUgd2lkdGhcbiAgICAgICAgLy8gb2YgYSBnaXZlbiBlbGVtZW50IGFuZCBpdHMgZXh0ZW50IGluIHRoZSBkb2N1bWVudC4gV2hlbiBhIGNoYW5nZVxuICAgICAgICAvLyBoYXBwZW5zIGluIHRoYXQgcmFuZ2UsIHRoZXNlIGFyZSByZXNldC4gVGhhdCB3YXksIG9uY2Ugd2UndmUgc2VlblxuICAgICAgICAvLyBhIGxpbmUvZWxlbWVudCBvZiBhIGdpdmVuIGxlbmd0aCwgd2Uga2VlcCB0aGUgZWRpdG9yIHdpZGUgZW5vdWdoXG4gICAgICAgIC8vIHRvIGZpdCBhdCBsZWFzdCB0aGF0IGVsZW1lbnQsIHVudGlsIGl0IGlzIGNoYW5nZWQsIGF0IHdoaWNoIHBvaW50XG4gICAgICAgIC8vIHdlIGZvcmdldCBpdCBhZ2Fpbi5cbiAgICAgICAgdGhpcy5taW5XaWR0aCA9IDA7XG4gICAgICAgIHRoaXMubWluV2lkdGhGcm9tID0gMDtcbiAgICAgICAgdGhpcy5taW5XaWR0aFRvID0gMDtcbiAgICAgICAgLy8gVHJhY2sgd2hldGhlciB0aGUgRE9NIHNlbGVjdGlvbiB3YXMgc2V0IGluIGEgbG9zc3kgd2F5LCBzbyB0aGF0XG4gICAgICAgIC8vIHdlIGRvbid0IG1lc3MgaXQgdXAgd2hlbiByZWFkaW5nIGl0IGJhY2sgaXRcbiAgICAgICAgdGhpcy5pbXByZWNpc2VBbmNob3IgPSBudWxsO1xuICAgICAgICB0aGlzLmltcHJlY2lzZUhlYWQgPSBudWxsO1xuICAgICAgICB0aGlzLmZvcmNlU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIC8vIFVzZWQgYnkgdGhlIHJlc2l6ZSBvYnNlcnZlciB0byBpZ25vcmUgcmVzaXplcyB0aGF0IHdlIGNhdXNlZFxuICAgICAgICAvLyBvdXJzZWx2ZXNcbiAgICAgICAgdGhpcy5sYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5zZXRET00odmlldy5jb250ZW50RE9NKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtuZXcgTGluZVZpZXddO1xuICAgICAgICB0aGlzLmNoaWxkcmVuWzBdLnNldFBhcmVudCh0aGlzKTtcbiAgICAgICAgdGhpcy51cGRhdGVEZWNvKCk7XG4gICAgICAgIHRoaXMudXBkYXRlSW5uZXIoW25ldyBDaGFuZ2VkUmFuZ2UoMCwgMCwgMCwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoKV0sIDAsIG51bGwpO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgdGhlIGRvY3VtZW50IHZpZXcgdG8gYSBnaXZlbiBzdGF0ZS5cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNoYW5nZWRSYW5nZXMgPSB1cGRhdGUuY2hhbmdlZFJhbmdlcztcbiAgICAgICAgaWYgKHRoaXMubWluV2lkdGggPiAwICYmIGNoYW5nZWRSYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZWRSYW5nZXMuZXZlcnkoKHsgZnJvbUEsIHRvQSB9KSA9PiB0b0EgPCB0aGlzLm1pbldpZHRoRnJvbSB8fCBmcm9tQSA+IHRoaXMubWluV2lkdGhUbykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoID0gdGhpcy5taW5XaWR0aEZyb20gPSB0aGlzLm1pbldpZHRoVG8gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aEZyb20gPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModGhpcy5taW5XaWR0aEZyb20sIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMubWluV2lkdGhUbyA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyh0aGlzLm1pbldpZHRoVG8sIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZWFkQ29tcG9zaXRpb25BdCA9IC0xO1xuICAgICAgICBpZiAodGhpcy52aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDApIHtcbiAgICAgICAgICAgIGlmICgoX2EgPSB0aGlzLmRvbUNoYW5nZWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5uZXdTZWwpXG4gICAgICAgICAgICAgICAgcmVhZENvbXBvc2l0aW9uQXQgPSB0aGlzLmRvbUNoYW5nZWQubmV3U2VsLmhlYWQ7XG4gICAgICAgICAgICBlbHNlIGlmICghdG91Y2hlc0NvbXBvc2l0aW9uKHVwZGF0ZS5jaGFuZ2VzLCB0aGlzLmhhc0NvbXBvc2l0aW9uKSAmJiAhdXBkYXRlLnNlbGVjdGlvblNldClcbiAgICAgICAgICAgICAgICByZWFkQ29tcG9zaXRpb25BdCA9IHVwZGF0ZS5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb21wb3NpdGlvbiA9IHJlYWRDb21wb3NpdGlvbkF0ID4gLTEgPyBmaW5kQ29tcG9zaXRpb25SYW5nZSh0aGlzLnZpZXcsIHVwZGF0ZS5jaGFuZ2VzLCByZWFkQ29tcG9zaXRpb25BdCkgOiBudWxsO1xuICAgICAgICB0aGlzLmRvbUNoYW5nZWQgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5oYXNDb21wb3NpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5tYXJrZWRGb3JDb21wb3NpdGlvbi5jbGVhcigpO1xuICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHRoaXMuaGFzQ29tcG9zaXRpb247XG4gICAgICAgICAgICBjaGFuZ2VkUmFuZ2VzID0gbmV3IENoYW5nZWRSYW5nZShmcm9tLCB0bywgdXBkYXRlLmNoYW5nZXMubWFwUG9zKGZyb20sIC0xKSwgdXBkYXRlLmNoYW5nZXMubWFwUG9zKHRvLCAxKSlcbiAgICAgICAgICAgICAgICAuYWRkVG9TZXQoY2hhbmdlZFJhbmdlcy5zbGljZSgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhc0NvbXBvc2l0aW9uID0gY29tcG9zaXRpb24gPyB7IGZyb206IGNvbXBvc2l0aW9uLnJhbmdlLmZyb21CLCB0bzogY29tcG9zaXRpb24ucmFuZ2UudG9CIH0gOiBudWxsO1xuICAgICAgICAvLyBXaGVuIHRoZSBET00gbm9kZXMgYXJvdW5kIHRoZSBzZWxlY3Rpb24gYXJlIG1vdmVkIHRvIGFub3RoZXJcbiAgICAgICAgLy8gcGFyZW50LCBDaHJvbWUgc29tZXRpbWVzIHJlcG9ydHMgYSBkaWZmZXJlbnQgc2VsZWN0aW9uIHRocm91Z2hcbiAgICAgICAgLy8gZ2V0U2VsZWN0aW9uIHRoYW4gdGhlIG9uZSB0aGF0IGl0IGFjdHVhbGx5IHNob3dzIHRvIHRoZSB1c2VyLlxuICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIHNlbGVjdGlvbiB1cGRhdGUgd2hlbiBsaW5lcyBhcmUgam9pbmVkIHRvIHdvcmtcbiAgICAgICAgLy8gYXJvdW5kIHRoYXQuIElzc3VlICM1NFxuICAgICAgICBpZiAoKGJyb3dzZXIuaWUgfHwgYnJvd3Nlci5jaHJvbWUpICYmICFjb21wb3NpdGlvbiAmJiB1cGRhdGUgJiZcbiAgICAgICAgICAgIHVwZGF0ZS5zdGF0ZS5kb2MubGluZXMgIT0gdXBkYXRlLnN0YXJ0U3RhdGUuZG9jLmxpbmVzKVxuICAgICAgICAgICAgdGhpcy5mb3JjZVNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIGxldCBwcmV2RGVjbyA9IHRoaXMuZGVjb3JhdGlvbnMsIGRlY28gPSB0aGlzLnVwZGF0ZURlY28oKTtcbiAgICAgICAgbGV0IGRlY29EaWZmID0gZmluZENoYW5nZWREZWNvKHByZXZEZWNvLCBkZWNvLCB1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgIGNoYW5nZWRSYW5nZXMgPSBDaGFuZ2VkUmFuZ2UuZXh0ZW5kV2l0aFJhbmdlcyhjaGFuZ2VkUmFuZ2VzLCBkZWNvRGlmZik7XG4gICAgICAgIGlmICghKHRoaXMuZmxhZ3MgJiA3IC8qIFZpZXdGbGFnLkRpcnR5ICovKSAmJiBjaGFuZ2VkUmFuZ2VzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUlubmVyKGNoYW5nZWRSYW5nZXMsIHVwZGF0ZS5zdGFydFN0YXRlLmRvYy5sZW5ndGgsIGNvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGUudHJhbnNhY3Rpb25zLmxlbmd0aClcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVXNlZCBieSB1cGRhdGUgYW5kIHRoZSBjb25zdHJ1Y3RvciBkbyBwZXJmb3JtIHRoZSBhY3R1YWwgRE9NXG4gICAgLy8gdXBkYXRlXG4gICAgdXBkYXRlSW5uZXIoY2hhbmdlcywgb2xkTGVuZ3RoLCBjb21wb3NpdGlvbikge1xuICAgICAgICB0aGlzLnZpZXcudmlld1N0YXRlLm11c3RNZWFzdXJlQ29udGVudCA9IHRydWU7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW4oY2hhbmdlcywgb2xkTGVuZ3RoLCBjb21wb3NpdGlvbik7XG4gICAgICAgIGxldCB7IG9ic2VydmVyIH0gPSB0aGlzLnZpZXc7XG4gICAgICAgIG9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBMb2NrIHRoZSBoZWlnaHQgZHVyaW5nIHJlZHJhd2luZywgc2luY2UgQ2hyb21lIHNvbWV0aW1lc1xuICAgICAgICAgICAgLy8gbWVzc2VzIHdpdGggdGhlIHNjcm9sbCBwb3NpdGlvbiBkdXJpbmcgRE9NIG11dGF0aW9uICh0aG91Z2hcbiAgICAgICAgICAgIC8vIG5vIHJlbGF5b3V0IGlzIHRyaWdnZXJlZCBhbmQgSSBjYW5ub3QgaW1hZ2luZSBob3cgaXQgY2FuXG4gICAgICAgICAgICAvLyByZWNvbXB1dGUgdGhlIHNjcm9sbCBwb3NpdGlvbiB3aXRob3V0IGEgbGF5b3V0KVxuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gdGhpcy52aWV3LnZpZXdTdGF0ZS5jb250ZW50SGVpZ2h0IC8gdGhpcy52aWV3LnNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLmZsZXhCYXNpcyA9IHRoaXMubWluV2lkdGggPyB0aGlzLm1pbldpZHRoICsgXCJweFwiIDogXCJcIjtcbiAgICAgICAgICAgIC8vIENocm9tZSB3aWxsIHNvbWV0aW1lcywgd2hlbiBET00gbXV0YXRpb25zIG9jY3VyIGRpcmVjdGx5XG4gICAgICAgICAgICAvLyBhcm91bmQgdGhlIHNlbGVjdGlvbiwgZ2V0IGNvbmZ1c2VkIGFuZCByZXBvcnQgYSBkaWZmZXJlbnRcbiAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBmcm9tIHRoZSBvbmUgaXQgZGlzcGxheXMgKGlzc3VlICMyMTgpLiBUaGlzIHRyaWVzXG4gICAgICAgICAgICAvLyB0byBkZXRlY3QgdGhhdCBzaXR1YXRpb24uXG4gICAgICAgICAgICBsZXQgdHJhY2sgPSBicm93c2VyLmNocm9tZSB8fCBicm93c2VyLmlvcyA/IHsgbm9kZTogb2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2UuZm9jdXNOb2RlLCB3cml0dGVuOiBmYWxzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMudmlldywgdHJhY2spO1xuICAgICAgICAgICAgdGhpcy5mbGFncyAmPSB+NyAvKiBWaWV3RmxhZy5EaXJ0eSAqLztcbiAgICAgICAgICAgIGlmICh0cmFjayAmJiAodHJhY2sud3JpdHRlbiB8fCBvYnNlcnZlci5zZWxlY3Rpb25SYW5nZS5mb2N1c05vZGUgIT0gdHJhY2subm9kZSkpXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JjZVNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS5oZWlnaHQgPSBcIlwiO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JDb21wb3NpdGlvbi5mb3JFYWNoKGNWaWV3ID0+IGNWaWV3LmZsYWdzICY9IH44IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovKTtcbiAgICAgICAgbGV0IGdhcHMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMudmlldy52aWV3cG9ydC5mcm9tIHx8IHRoaXMudmlldy52aWV3cG9ydC50byA8IHRoaXMudmlldy5zdGF0ZS5kb2MubGVuZ3RoKVxuICAgICAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBCbG9ja1dpZGdldFZpZXcgJiYgY2hpbGQud2lkZ2V0IGluc3RhbmNlb2YgQmxvY2tHYXBXaWRnZXQpXG4gICAgICAgICAgICAgICAgICAgIGdhcHMucHVzaChjaGlsZC5kb20pO1xuICAgICAgICBvYnNlcnZlci51cGRhdGVHYXBzKGdhcHMpO1xuICAgIH1cbiAgICB1cGRhdGVDaGlsZHJlbihjaGFuZ2VzLCBvbGRMZW5ndGgsIGNvbXBvc2l0aW9uKSB7XG4gICAgICAgIGxldCByYW5nZXMgPSBjb21wb3NpdGlvbiA/IGNvbXBvc2l0aW9uLnJhbmdlLmFkZFRvU2V0KGNoYW5nZXMuc2xpY2UoKSkgOiBjaGFuZ2VzO1xuICAgICAgICBsZXQgY3Vyc29yID0gdGhpcy5jaGlsZEN1cnNvcihvbGRMZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gcmFuZ2VzLmxlbmd0aCAtIDE7OyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gaSA+PSAwID8gcmFuZ2VzW2ldIDogbnVsbDtcbiAgICAgICAgICAgIGlmICghbmV4dClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCB7IGZyb21BLCB0b0EsIGZyb21CLCB0b0IgfSA9IG5leHQsIGNvbnRlbnQsIGJyZWFrQXRTdGFydCwgb3BlblN0YXJ0LCBvcGVuRW5kO1xuICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9uICYmIGNvbXBvc2l0aW9uLnJhbmdlLmZyb21CIDwgdG9CICYmIGNvbXBvc2l0aW9uLnJhbmdlLnRvQiA+IGZyb21CKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJlZm9yZSA9IENvbnRlbnRCdWlsZGVyLmJ1aWxkKHRoaXMudmlldy5zdGF0ZS5kb2MsIGZyb21CLCBjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiwgdGhpcy5kZWNvcmF0aW9ucywgdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcCk7XG4gICAgICAgICAgICAgICAgbGV0IGFmdGVyID0gQ29udGVudEJ1aWxkZXIuYnVpbGQodGhpcy52aWV3LnN0YXRlLmRvYywgY29tcG9zaXRpb24ucmFuZ2UudG9CLCB0b0IsIHRoaXMuZGVjb3JhdGlvbnMsIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXApO1xuICAgICAgICAgICAgICAgIGJyZWFrQXRTdGFydCA9IGJlZm9yZS5icmVha0F0U3RhcnQ7XG4gICAgICAgICAgICAgICAgb3BlblN0YXJ0ID0gYmVmb3JlLm9wZW5TdGFydDtcbiAgICAgICAgICAgICAgICBvcGVuRW5kID0gYWZ0ZXIub3BlbkVuZDtcbiAgICAgICAgICAgICAgICBsZXQgY29tcExpbmUgPSB0aGlzLmNvbXBvc2l0aW9uVmlldyhjb21wb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgaWYgKGFmdGVyLmJyZWFrQXRTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBjb21wTGluZS5icmVha0FmdGVyID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYWZ0ZXIuY29udGVudC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgY29tcExpbmUubWVyZ2UoY29tcExpbmUubGVuZ3RoLCBjb21wTGluZS5sZW5ndGgsIGFmdGVyLmNvbnRlbnRbMF0sIGZhbHNlLCBhZnRlci5vcGVuU3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBMaW5lLmJyZWFrQWZ0ZXIgPSBhZnRlci5jb250ZW50WzBdLmJyZWFrQWZ0ZXI7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyLmNvbnRlbnQuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZS5jb250ZW50Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICBjb21wTGluZS5tZXJnZSgwLCAwLCBiZWZvcmUuY29udGVudFtiZWZvcmUuY29udGVudC5sZW5ndGggLSAxXSwgdHJ1ZSwgMCwgYmVmb3JlLm9wZW5FbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZS5jb250ZW50LnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYmVmb3JlLmNvbnRlbnQuY29uY2F0KGNvbXBMaW5lKS5jb25jYXQoYWZ0ZXIuY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAoeyBjb250ZW50LCBicmVha0F0U3RhcnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID1cbiAgICAgICAgICAgICAgICAgICAgQ29udGVudEJ1aWxkZXIuYnVpbGQodGhpcy52aWV3LnN0YXRlLmRvYywgZnJvbUIsIHRvQiwgdGhpcy5kZWNvcmF0aW9ucywgdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHsgaTogdG9JLCBvZmY6IHRvT2ZmIH0gPSBjdXJzb3IuZmluZFBvcyh0b0EsIDEpO1xuICAgICAgICAgICAgbGV0IHsgaTogZnJvbUksIG9mZjogZnJvbU9mZiB9ID0gY3Vyc29yLmZpbmRQb3MoZnJvbUEsIC0xKTtcbiAgICAgICAgICAgIHJlcGxhY2VSYW5nZSh0aGlzLCBmcm9tSSwgZnJvbU9mZiwgdG9JLCB0b09mZiwgY29udGVudCwgYnJlYWtBdFN0YXJ0LCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wb3NpdGlvbilcbiAgICAgICAgICAgIHRoaXMuZml4Q29tcG9zaXRpb25ET00oY29tcG9zaXRpb24pO1xuICAgIH1cbiAgICBjb21wb3NpdGlvblZpZXcoY29tcG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGN1ciA9IG5ldyBUZXh0Vmlldyhjb21wb3NpdGlvbi50ZXh0Lm5vZGVWYWx1ZSk7XG4gICAgICAgIGN1ci5mbGFncyB8PSA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovO1xuICAgICAgICBmb3IgKGxldCB7IGRlY28gfSBvZiBjb21wb3NpdGlvbi5tYXJrcylcbiAgICAgICAgICAgIGN1ciA9IG5ldyBNYXJrVmlldyhkZWNvLCBbY3VyXSwgY3VyLmxlbmd0aCk7XG4gICAgICAgIGxldCBsaW5lID0gbmV3IExpbmVWaWV3O1xuICAgICAgICBsaW5lLmFwcGVuZChjdXIsIDApO1xuICAgICAgICByZXR1cm4gbGluZTtcbiAgICB9XG4gICAgZml4Q29tcG9zaXRpb25ET00oY29tcG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGZpeCA9IChkb20sIGNWaWV3KSA9PiB7XG4gICAgICAgICAgICBjVmlldy5mbGFncyB8PSA4IC8qIFZpZXdGbGFnLkNvbXBvc2l0aW9uICovIHwgKGNWaWV3LmNoaWxkcmVuLnNvbWUoYyA9PiBjLmZsYWdzICYgNyAvKiBWaWV3RmxhZy5EaXJ0eSAqLykgPyAxIC8qIFZpZXdGbGFnLkNoaWxkRGlydHkgKi8gOiAwKTtcbiAgICAgICAgICAgIHRoaXMubWFya2VkRm9yQ29tcG9zaXRpb24uYWRkKGNWaWV3KTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gQ29udGVudFZpZXcuZ2V0KGRvbSk7XG4gICAgICAgICAgICBpZiAocHJldiAmJiBwcmV2ICE9IGNWaWV3KVxuICAgICAgICAgICAgICAgIHByZXYuZG9tID0gbnVsbDtcbiAgICAgICAgICAgIGNWaWV3LnNldERPTShkb20pO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5jaGlsZFBvcyhjb21wb3NpdGlvbi5yYW5nZS5mcm9tQiwgMSk7XG4gICAgICAgIGxldCBjVmlldyA9IHRoaXMuY2hpbGRyZW5bcG9zLmldO1xuICAgICAgICBmaXgoY29tcG9zaXRpb24ubGluZSwgY1ZpZXcpO1xuICAgICAgICBmb3IgKGxldCBpID0gY29tcG9zaXRpb24ubWFya3MubGVuZ3RoIC0gMTsgaSA+PSAtMTsgaS0tKSB7XG4gICAgICAgICAgICBwb3MgPSBjVmlldy5jaGlsZFBvcyhwb3Mub2ZmLCAxKTtcbiAgICAgICAgICAgIGNWaWV3ID0gY1ZpZXcuY2hpbGRyZW5bcG9zLmldO1xuICAgICAgICAgICAgZml4KGkgPj0gMCA/IGNvbXBvc2l0aW9uLm1hcmtzW2ldLm5vZGUgOiBjb21wb3NpdGlvbi50ZXh0LCBjVmlldyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU3luYyB0aGUgRE9NIHNlbGVjdGlvbiB0byB0aGlzLnN0YXRlLnNlbGVjdGlvblxuICAgIHVwZGF0ZVNlbGVjdGlvbihtdXN0UmVhZCA9IGZhbHNlLCBmcm9tUG9pbnRlciA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChtdXN0UmVhZCB8fCAhdGhpcy52aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlLmZvY3VzTm9kZSlcbiAgICAgICAgICAgIHRoaXMudmlldy5vYnNlcnZlci5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IGFjdGl2ZUVsdCA9IHRoaXMudmlldy5yb290LmFjdGl2ZUVsZW1lbnQsIGZvY3VzZWQgPSBhY3RpdmVFbHQgPT0gdGhpcy5kb207XG4gICAgICAgIGxldCBzZWxlY3Rpb25Ob3RGb2N1cyA9ICFmb2N1c2VkICYmXG4gICAgICAgICAgICBoYXNTZWxlY3Rpb24odGhpcy5kb20sIHRoaXMudmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZSkgJiYgIShhY3RpdmVFbHQgJiYgdGhpcy5kb20uY29udGFpbnMoYWN0aXZlRWx0KSk7XG4gICAgICAgIGlmICghKGZvY3VzZWQgfHwgZnJvbVBvaW50ZXIgfHwgc2VsZWN0aW9uTm90Rm9jdXMpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgZm9yY2UgPSB0aGlzLmZvcmNlU2VsZWN0aW9uO1xuICAgICAgICB0aGlzLmZvcmNlU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIGxldCBtYWluID0gdGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgICAgICBsZXQgYW5jaG9yID0gdGhpcy5tb3ZlVG9MaW5lKHRoaXMuZG9tQXRQb3MobWFpbi5hbmNob3IpKTtcbiAgICAgICAgbGV0IGhlYWQgPSBtYWluLmVtcHR5ID8gYW5jaG9yIDogdGhpcy5tb3ZlVG9MaW5lKHRoaXMuZG9tQXRQb3MobWFpbi5oZWFkKSk7XG4gICAgICAgIC8vIEFsd2F5cyByZXNldCBvbiBGaXJlZm94IHdoZW4gbmV4dCB0byBhbiB1bmVkaXRhYmxlIG5vZGUgdG9cbiAgICAgICAgLy8gYXZvaWQgaW52aXNpYmxlIGN1cnNvciBidWdzICgjMTExKVxuICAgICAgICBpZiAoYnJvd3Nlci5nZWNrbyAmJiBtYWluLmVtcHR5ICYmICF0aGlzLmhhc0NvbXBvc2l0aW9uICYmIGJldHdlZW5VbmVkaXRhYmxlKGFuY2hvcikpIHtcbiAgICAgICAgICAgIGxldCBkdW1teSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgICAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLmlnbm9yZSgoKSA9PiBhbmNob3Iubm9kZS5pbnNlcnRCZWZvcmUoZHVtbXksIGFuY2hvci5ub2RlLmNoaWxkTm9kZXNbYW5jaG9yLm9mZnNldF0gfHwgbnVsbCkpO1xuICAgICAgICAgICAgYW5jaG9yID0gaGVhZCA9IG5ldyBET01Qb3MoZHVtbXksIDApO1xuICAgICAgICAgICAgZm9yY2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkb21TZWwgPSB0aGlzLnZpZXcub2JzZXJ2ZXIuc2VsZWN0aW9uUmFuZ2U7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgYWxyZWFkeSBoZXJlLCBvciBpbiBhbiBlcXVpdmFsZW50IHBvc2l0aW9uLCBkb24ndCB0b3VjaCBpdFxuICAgICAgICBpZiAoZm9yY2UgfHwgIWRvbVNlbC5mb2N1c05vZGUgfHwgKCFpc0VxdWl2YWxlbnRQb3NpdGlvbihhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCwgZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpIHx8XG4gICAgICAgICAgICAhaXNFcXVpdmFsZW50UG9zaXRpb24oaGVhZC5ub2RlLCBoZWFkLm9mZnNldCwgZG9tU2VsLmZvY3VzTm9kZSwgZG9tU2VsLmZvY3VzT2Zmc2V0KSkgJiYgIXRoaXMuc3VwcHJlc3NXaWRnZXRDdXJzb3JDaGFuZ2UoZG9tU2VsLCBtYWluKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3Lm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ2hyb21lIEFuZHJvaWQgd2lsbCBoaWRlIHRoZSB2aXJ0dWFsIGtleWJvYXJkIHdoZW4gdGFwcGluZ1xuICAgICAgICAgICAgICAgIC8vIGluc2lkZSBhbiB1bmVkaXRhYmxlIG5vZGUsIGFuZCBub3QgYnJpbmcgaXQgYmFjayB3aGVuIHdlXG4gICAgICAgICAgICAgICAgLy8gbW92ZSB0aGUgY3Vyc29yIHRvIGl0cyBwcm9wZXIgcG9zaXRpb24uIFRoaXMgdHJpZXMgdG9cbiAgICAgICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBrZXlib2FyZCBieSBjeWNsaW5nIGZvY3VzLlxuICAgICAgICAgICAgICAgIGlmIChicm93c2VyLmFuZHJvaWQgJiYgYnJvd3Nlci5jaHJvbWUgJiYgdGhpcy5kb20uY29udGFpbnMoZG9tU2VsLmZvY3VzTm9kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgaW5VbmVkaXRhYmxlKGRvbVNlbC5mb2N1c05vZGUsIHRoaXMuZG9tKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvbS5ibHVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJhd1NlbCA9IGdldFNlbGVjdGlvbih0aGlzLnZpZXcucm9vdCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyYXdTZWwpIDtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYWluLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdvcmsgYXJvdW5kIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTE2MTIwNzZcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJyb3dzZXIuZ2Vja28pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXh0VG8gPSBuZXh0VG9VbmVkaXRhYmxlKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0VG8gJiYgbmV4dFRvICE9ICgxIC8qIE5leHRUby5CZWZvcmUgKi8gfCAyIC8qIE5leHRUby5BZnRlciAqLykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IG5lYXJieVRleHROb2RlKGFuY2hvci5ub2RlLCBhbmNob3Iub2Zmc2V0LCBuZXh0VG8gPT0gMSAvKiBOZXh0VG8uQmVmb3JlICovID8gMSA6IC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gbmV3IERPTVBvcyh0ZXh0Lm5vZGUsIHRleHQub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByYXdTZWwuY29sbGFwc2UoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFpbi5iaWRpTGV2ZWwgIT0gbnVsbCAmJiByYXdTZWwuY2FyZXRCaWRpTGV2ZWwgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd1NlbC5jYXJldEJpZGlMZXZlbCA9IG1haW4uYmlkaUxldmVsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXdTZWwuZXh0ZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdGlvbi5leHRlbmQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuICdpbnZlcnRlZCcgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIC8vIChvbmUgd2hlcmUgdGhlIGZvY3VzIGlzIGJlZm9yZSB0aGUgYW5jaG9yKSwgYnV0IG5vdCBhbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gYnJvd3NlcnMgc3VwcG9ydCBpdCB5ZXQuXG4gICAgICAgICAgICAgICAgICAgIHJhd1NlbC5jb2xsYXBzZShhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhZmFyaSB3aWxsIGlnbm9yZSB0aGUgY2FsbCBhYm92ZSB3aGVuIHRoZSBlZGl0b3IgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZGVuLCBhbmQgdGhlbiByYWlzZSBhbiBlcnJvciBvbiB0aGUgY2FsbCB0byBleHRlbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gKCM5NDApLlxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmV4dGVuZChoZWFkLm5vZGUsIGhlYWQub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBQcmltaXRpdmUgKElFKSB3YXlcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1haW4uYW5jaG9yID4gbWFpbi5oZWFkKVxuICAgICAgICAgICAgICAgICAgICAgICAgW2FuY2hvciwgaGVhZF0gPSBbaGVhZCwgYW5jaG9yXTtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKGhlYWQubm9kZSwgaGVhZC5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChhbmNob3Iubm9kZSwgYW5jaG9yLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIHJhd1NlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmF3U2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbk5vdEZvY3VzICYmIHRoaXMudmlldy5yb290LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uYmx1cigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlRWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRWx0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuc2V0U2VsZWN0aW9uUmFuZ2UoYW5jaG9yLCBoZWFkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmltcHJlY2lzZUFuY2hvciA9IGFuY2hvci5wcmVjaXNlID8gbnVsbCA6IG5ldyBET01Qb3MoZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpO1xuICAgICAgICB0aGlzLmltcHJlY2lzZUhlYWQgPSBoZWFkLnByZWNpc2UgPyBudWxsIDogbmV3IERPTVBvcyhkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQpO1xuICAgIH1cbiAgICAvLyBJZiBhIHplcm8tbGVuZ3RoIHdpZGdldCBpcyBpbnNlcnRlZCBuZXh0IHRvIHRoZSBjdXJzb3IgZHVyaW5nXG4gICAgLy8gY29tcG9zaXRpb24sIGF2b2lkIG1vdmluZyBpdCBhY3Jvc3MgaXQgYW5kIGRpc3J1cHRpbmcgdGhlXG4gICAgLy8gY29tcG9zaXRpb24uXG4gICAgc3VwcHJlc3NXaWRnZXRDdXJzb3JDaGFuZ2Uoc2VsLCBjdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzQ29tcG9zaXRpb24gJiYgY3Vyc29yLmVtcHR5ICYmXG4gICAgICAgICAgICBpc0VxdWl2YWxlbnRQb3NpdGlvbihzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQsIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KSAmJlxuICAgICAgICAgICAgdGhpcy5wb3NGcm9tRE9NKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCkgPT0gY3Vyc29yLmhlYWQ7XG4gICAgfVxuICAgIGVuZm9yY2VDdXJzb3JBc3NvYygpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29tcG9zaXRpb24pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXMsIGN1cnNvciA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgICAgIGxldCBzZWwgPSBnZXRTZWxlY3Rpb24odmlldy5yb290KTtcbiAgICAgICAgbGV0IHsgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0IH0gPSB2aWV3Lm9ic2VydmVyLnNlbGVjdGlvblJhbmdlO1xuICAgICAgICBpZiAoIXNlbCB8fCAhY3Vyc29yLmVtcHR5IHx8ICFjdXJzb3IuYXNzb2MgfHwgIXNlbC5tb2RpZnkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBsaW5lID0gTGluZVZpZXcuZmluZCh0aGlzLCBjdXJzb3IuaGVhZCk7XG4gICAgICAgIGlmICghbGluZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGxpbmVTdGFydCA9IGxpbmUucG9zQXRTdGFydDtcbiAgICAgICAgaWYgKGN1cnNvci5oZWFkID09IGxpbmVTdGFydCB8fCBjdXJzb3IuaGVhZCA9PSBsaW5lU3RhcnQgKyBsaW5lLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGJlZm9yZSA9IHRoaXMuY29vcmRzQXQoY3Vyc29yLmhlYWQsIC0xKSwgYWZ0ZXIgPSB0aGlzLmNvb3Jkc0F0KGN1cnNvci5oZWFkLCAxKTtcbiAgICAgICAgaWYgKCFiZWZvcmUgfHwgIWFmdGVyIHx8IGJlZm9yZS5ib3R0b20gPiBhZnRlci50b3ApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBkb20gPSB0aGlzLmRvbUF0UG9zKGN1cnNvci5oZWFkICsgY3Vyc29yLmFzc29jKTtcbiAgICAgICAgc2VsLmNvbGxhcHNlKGRvbS5ub2RlLCBkb20ub2Zmc2V0KTtcbiAgICAgICAgc2VsLm1vZGlmeShcIm1vdmVcIiwgY3Vyc29yLmFzc29jIDwgMCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiLCBcImxpbmVib3VuZGFyeVwiKTtcbiAgICAgICAgLy8gVGhpcyBjYW4gZ28gd3JvbmcgaW4gY29ybmVyIGNhc2VzIGxpa2Ugc2luZ2xlLWNoYXJhY3RlciBsaW5lcyxcbiAgICAgICAgLy8gc28gY2hlY2sgYW5kIHJlc2V0IGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgdmlldy5vYnNlcnZlci5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IG5ld1JhbmdlID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgaWYgKHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKG5ld1JhbmdlLmFuY2hvck5vZGUsIG5ld1JhbmdlLmFuY2hvck9mZnNldCkgIT0gY3Vyc29yLmZyb20pXG4gICAgICAgICAgICBzZWwuY29sbGFwc2UoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gSWYgYSBwb3NpdGlvbiBpcyBpbi9uZWFyIGEgYmxvY2sgd2lkZ2V0LCBtb3ZlIGl0IHRvIGEgbmVhcmJ5IHRleHRcbiAgICAvLyBsaW5lLCBzaW5jZSB3ZSBkb24ndCB3YW50IHRoZSBjdXJzb3IgaW5zaWRlIGEgYmxvY2sgd2lkZ2V0LlxuICAgIG1vdmVUb0xpbmUocG9zKSB7XG4gICAgICAgIC8vIEJsb2NrIHdpZGdldHMgd2lsbCByZXR1cm4gcG9zaXRpb25zIGJlZm9yZS9hZnRlciB0aGVtLCB3aGljaFxuICAgICAgICAvLyBhcmUgdGh1cyBkaXJlY3RseSBpbiB0aGUgZG9jdW1lbnQgRE9NIGVsZW1lbnQuXG4gICAgICAgIGxldCBkb20gPSB0aGlzLmRvbSwgbmV3UG9zO1xuICAgICAgICBpZiAocG9zLm5vZGUgIT0gZG9tKVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgZm9yIChsZXQgaSA9IHBvcy5vZmZzZXQ7ICFuZXdQb3MgJiYgaSA8IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChkb20uY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIExpbmVWaWV3KVxuICAgICAgICAgICAgICAgIG5ld1BvcyA9IHZpZXcuZG9tQXRQb3MoMCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IHBvcy5vZmZzZXQgLSAxOyAhbmV3UG9zICYmIGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChkb20uY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIExpbmVWaWV3KVxuICAgICAgICAgICAgICAgIG5ld1BvcyA9IHZpZXcuZG9tQXRQb3Modmlldy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdQb3MgPyBuZXcgRE9NUG9zKG5ld1Bvcy5ub2RlLCBuZXdQb3Mub2Zmc2V0LCB0cnVlKSA6IHBvcztcbiAgICB9XG4gICAgbmVhcmVzdChkb20pIHtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gZG9tOyBjdXI7KSB7XG4gICAgICAgICAgICBsZXQgZG9tVmlldyA9IENvbnRlbnRWaWV3LmdldChjdXIpO1xuICAgICAgICAgICAgaWYgKGRvbVZpZXcgJiYgZG9tVmlldy5yb290VmlldyA9PSB0aGlzKVxuICAgICAgICAgICAgICAgIHJldHVybiBkb21WaWV3O1xuICAgICAgICAgICAgY3VyID0gY3VyLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5uZWFyZXN0KG5vZGUpO1xuICAgICAgICBpZiAoIXZpZXcpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRyeWluZyB0byBmaW5kIHBvc2l0aW9uIGZvciBhIERPTSBwb3NpdGlvbiBvdXRzaWRlIG9mIHRoZSBkb2N1bWVudFwiKTtcbiAgICAgICAgcmV0dXJuIHZpZXcubG9jYWxQb3NGcm9tRE9NKG5vZGUsIG9mZnNldCkgKyB2aWV3LnBvc0F0U3RhcnQ7XG4gICAgfVxuICAgIGRvbUF0UG9zKHBvcykge1xuICAgICAgICBsZXQgeyBpLCBvZmYgfSA9IHRoaXMuY2hpbGRDdXJzb3IoKS5maW5kUG9zKHBvcywgLTEpO1xuICAgICAgICBmb3IgKDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAob2ZmIDwgY2hpbGQubGVuZ3RoIHx8IGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBvZmYgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2ldLmRvbUF0UG9zKG9mZik7XG4gICAgfVxuICAgIGNvb3Jkc0F0KHBvcywgc2lkZSkge1xuICAgICAgICBsZXQgYmVzdCA9IG51bGwsIGJlc3RQb3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBvZmYgPSB0aGlzLmxlbmd0aCwgaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZiAtIGNoaWxkLmJyZWFrQWZ0ZXIsIHN0YXJ0ID0gZW5kIC0gY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA8IHBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChzdGFydCA8PSBwb3MgJiYgKHN0YXJ0IDwgcG9zIHx8IGNoaWxkLmNvdmVycygtMSkpICYmIChlbmQgPiBwb3MgfHwgY2hpbGQuY292ZXJzKDEpKSAmJlxuICAgICAgICAgICAgICAgICghYmVzdCB8fCBjaGlsZCBpbnN0YW5jZW9mIExpbmVWaWV3ICYmICEoYmVzdCBpbnN0YW5jZW9mIExpbmVWaWV3ICYmIHNpZGUgPj0gMCkpKSB7XG4gICAgICAgICAgICAgICAgYmVzdCA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGJlc3RQb3MgPSBzdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZiA9IHN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0ID8gYmVzdC5jb29yZHNBdChwb3MgLSBiZXN0UG9zLCBzaWRlKSA6IG51bGw7XG4gICAgfVxuICAgIGNvb3Jkc0ZvckNoYXIocG9zKSB7XG4gICAgICAgIGxldCB7IGksIG9mZiB9ID0gdGhpcy5jaGlsZFBvcyhwb3MsIDEpLCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgTGluZVZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHdoaWxlIChjaGlsZC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCB7IGksIG9mZjogY2hpbGRPZmYgfSA9IGNoaWxkLmNoaWxkUG9zKG9mZiwgMSk7XG4gICAgICAgICAgICBmb3IgKDs7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpID09IGNoaWxkLmNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKChjaGlsZCA9IGNoaWxkLmNoaWxkcmVuW2ldKS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmID0gY2hpbGRPZmY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBUZXh0VmlldykpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGVuZCA9IGZpbmRDbHVzdGVyQnJlYWsoY2hpbGQudGV4dCwgb2ZmKTtcbiAgICAgICAgaWYgKGVuZCA9PSBvZmYpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHJlY3RzID0gdGV4dFJhbmdlKGNoaWxkLmRvbSwgb2ZmLCBlbmQpLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAoaSA9PSByZWN0cy5sZW5ndGggLSAxIHx8IHJlY3QudG9wIDwgcmVjdC5ib3R0b20gJiYgcmVjdC5sZWZ0IDwgcmVjdC5yaWdodClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbWVhc3VyZVZpc2libGVMaW5lSGVpZ2h0cyh2aWV3cG9ydCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW10sIHsgZnJvbSwgdG8gfSA9IHZpZXdwb3J0O1xuICAgICAgICBsZXQgY29udGVudFdpZHRoID0gdGhpcy52aWV3LmNvbnRlbnRET00uY2xpZW50V2lkdGg7XG4gICAgICAgIGxldCBpc1dpZGVyID0gY29udGVudFdpZHRoID4gTWF0aC5tYXgodGhpcy52aWV3LnNjcm9sbERPTS5jbGllbnRXaWR0aCwgdGhpcy5taW5XaWR0aCkgKyAxO1xuICAgICAgICBsZXQgd2lkZXN0ID0gLTEsIGx0ciA9IHRoaXMudmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IDAsIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gcG9zICsgY2hpbGQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHRvKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKHBvcyA+PSBmcm9tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkUmVjdCA9IGNoaWxkLmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZFJlY3QuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNXaWRlcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGNoaWxkLmRvbS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWN0cyA9IGxhc3QgPyBjbGllbnRSZWN0c0ZvcihsYXN0KSA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW3JlY3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gbHRyID8gcmVjdC5yaWdodCAtIGNoaWxkUmVjdC5sZWZ0IDogY2hpbGRSZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gd2lkZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZXN0ID0gd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5XaWR0aCA9IGNvbnRlbnRXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoRnJvbSA9IHBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbldpZHRoVG8gPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgPSBlbmQgKyBjaGlsZC5icmVha0FmdGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRleHREaXJlY3Rpb25BdChwb3MpIHtcbiAgICAgICAgbGV0IHsgaSB9ID0gdGhpcy5jaGlsZFBvcyhwb3MsIDEpO1xuICAgICAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmNoaWxkcmVuW2ldLmRvbSkuZGlyZWN0aW9uID09IFwicnRsXCIgPyBEaXJlY3Rpb24uUlRMIDogRGlyZWN0aW9uLkxUUjtcbiAgICB9XG4gICAgbWVhc3VyZVRleHRTaXplKCkge1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBMaW5lVmlldykge1xuICAgICAgICAgICAgICAgIGxldCBtZWFzdXJlID0gY2hpbGQubWVhc3VyZVRleHRTaXplKCk7XG4gICAgICAgICAgICAgICAgaWYgKG1lYXN1cmUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vIHdvcmthYmxlIGxpbmUgZXhpc3RzLCBmb3JjZSBhIGxheW91dCBvZiBhIG1lYXN1cmFibGUgZWxlbWVudFxuICAgICAgICBsZXQgZHVtbXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLCBsaW5lSGVpZ2h0LCBjaGFyV2lkdGgsIHRleHRIZWlnaHQ7XG4gICAgICAgIGR1bW15LmNsYXNzTmFtZSA9IFwiY20tbGluZVwiO1xuICAgICAgICBkdW1teS5zdHlsZS53aWR0aCA9IFwiOTk5OTlweFwiO1xuICAgICAgICBkdW1teS5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgZHVtbXkudGV4dENvbnRlbnQgPSBcImFiYyBkZWYgZ2hpIGprbCBtbm8gcHFyIHN0dVwiO1xuICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuaWdub3JlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGR1bW15KTtcbiAgICAgICAgICAgIGxldCByZWN0ID0gY2xpZW50UmVjdHNGb3IoZHVtbXkuZmlyc3RDaGlsZClbMF07XG4gICAgICAgICAgICBsaW5lSGVpZ2h0ID0gZHVtbXkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgY2hhcldpZHRoID0gcmVjdCA/IHJlY3Qud2lkdGggLyAyNyA6IDc7XG4gICAgICAgICAgICB0ZXh0SGVpZ2h0ID0gcmVjdCA/IHJlY3QuaGVpZ2h0IDogbGluZUhlaWdodDtcbiAgICAgICAgICAgIGR1bW15LnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0IH07XG4gICAgfVxuICAgIGNoaWxkQ3Vyc29yKHBvcyA9IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIE1vdmUgYmFjayB0byBzdGFydCBvZiBsYXN0IGVsZW1lbnQgd2hlbiBwb3NzaWJsZSwgc28gdGhhdFxuICAgICAgICAvLyBgQ2hpbGRDdXJzb3IuZmluZFBvc2AgZG9lc24ndCBoYXZlIHRvIGRlYWwgd2l0aCB0aGUgZWRnZSBjYXNlXG4gICAgICAgIC8vIG9mIGJlaW5nIGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQuXG4gICAgICAgIGxldCBpID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgIGlmIChpKVxuICAgICAgICAgICAgcG9zIC09IHRoaXMuY2hpbGRyZW5bLS1pXS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBuZXcgQ2hpbGRDdXJzb3IodGhpcy5jaGlsZHJlbiwgcG9zLCBpKTtcbiAgICB9XG4gICAgY29tcHV0ZUJsb2NrR2FwRGVjbygpIHtcbiAgICAgICAgbGV0IGRlY28gPSBbXSwgdnMgPSB0aGlzLnZpZXcudmlld1N0YXRlO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSAwLCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBpID09IHZzLnZpZXdwb3J0cy5sZW5ndGggPyBudWxsIDogdnMudmlld3BvcnRzW2ldO1xuICAgICAgICAgICAgbGV0IGVuZCA9IG5leHQgPyBuZXh0LmZyb20gLSAxIDogdGhpcy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9ICh2cy5saW5lQmxvY2tBdChlbmQpLmJvdHRvbSAtIHZzLmxpbmVCbG9ja0F0KHBvcykudG9wKSAvIHRoaXMudmlldy5zY2FsZVk7XG4gICAgICAgICAgICAgICAgZGVjby5wdXNoKERlY29yYXRpb24ucmVwbGFjZSh7XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldDogbmV3IEJsb2NrR2FwV2lkZ2V0KGhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGlzQmxvY2tHYXA6IHRydWUsXG4gICAgICAgICAgICAgICAgfSkucmFuZ2UocG9zLCBlbmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbmV4dClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHBvcyA9IG5leHQudG8gKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChkZWNvKTtcbiAgICB9XG4gICAgdXBkYXRlRGVjbygpIHtcbiAgICAgICAgbGV0IGFsbERlY28gPSB0aGlzLnZpZXcuc3RhdGUuZmFjZXQoZGVjb3JhdGlvbnMpLm1hcCgoZCwgaSkgPT4ge1xuICAgICAgICAgICAgbGV0IGR5bmFtaWMgPSB0aGlzLmR5bmFtaWNEZWNvcmF0aW9uTWFwW2ldID0gdHlwZW9mIGQgPT0gXCJmdW5jdGlvblwiO1xuICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWMgPyBkKHRoaXMudmlldykgOiBkO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGR5bmFtaWNPdXRlciA9IGZhbHNlLCBvdXRlckRlY28gPSB0aGlzLnZpZXcuc3RhdGUuZmFjZXQob3V0ZXJEZWNvcmF0aW9ucykubWFwKChkLCBpKSA9PiB7XG4gICAgICAgICAgICBsZXQgZHluYW1pYyA9IHR5cGVvZiBkID09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgICAgIGlmIChkeW5hbWljKVxuICAgICAgICAgICAgICAgIGR5bmFtaWNPdXRlciA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZHluYW1pYyA/IGQodGhpcy52aWV3KSA6IGQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3V0ZXJEZWNvLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5keW5hbWljRGVjb3JhdGlvbk1hcFthbGxEZWNvLmxlbmd0aF0gPSBkeW5hbWljT3V0ZXI7XG4gICAgICAgICAgICBhbGxEZWNvLnB1c2goUmFuZ2VTZXQuam9pbihvdXRlckRlY28pKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gYWxsRGVjby5sZW5ndGg7IGkgPCBhbGxEZWNvLmxlbmd0aCArIDM7IGkrKylcbiAgICAgICAgICAgIHRoaXMuZHluYW1pY0RlY29yYXRpb25NYXBbaV0gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjb3JhdGlvbnMgPSBbXG4gICAgICAgICAgICAuLi5hbGxEZWNvLFxuICAgICAgICAgICAgdGhpcy5jb21wdXRlQmxvY2tHYXBEZWNvKCksXG4gICAgICAgICAgICB0aGlzLnZpZXcudmlld1N0YXRlLmxpbmVHYXBEZWNvXG4gICAgICAgIF07XG4gICAgfVxuICAgIHNjcm9sbEludG9WaWV3KHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0LmlzU25hcHNob3QpIHtcbiAgICAgICAgICAgIGxldCByZWYgPSB0aGlzLnZpZXcudmlld1N0YXRlLmxpbmVCbG9ja0F0KHRhcmdldC5yYW5nZS5oZWFkKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5zY3JvbGxET00uc2Nyb2xsVG9wID0gcmVmLnRvcCAtIHRhcmdldC55TWFyZ2luO1xuICAgICAgICAgICAgdGhpcy52aWV3LnNjcm9sbERPTS5zY3JvbGxMZWZ0ID0gdGFyZ2V0LnhNYXJnaW47XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgcmFuZ2UgfSA9IHRhcmdldDtcbiAgICAgICAgbGV0IHJlY3QgPSB0aGlzLmNvb3Jkc0F0KHJhbmdlLmhlYWQsIHJhbmdlLmVtcHR5ID8gcmFuZ2UuYXNzb2MgOiByYW5nZS5oZWFkID4gcmFuZ2UuYW5jaG9yID8gLTEgOiAxKSwgb3RoZXI7XG4gICAgICAgIGlmICghcmVjdClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSAmJiAob3RoZXIgPSB0aGlzLmNvb3Jkc0F0KHJhbmdlLmFuY2hvciwgcmFuZ2UuYW5jaG9yID4gcmFuZ2UuaGVhZCA/IC0xIDogMSkpKVxuICAgICAgICAgICAgcmVjdCA9IHsgbGVmdDogTWF0aC5taW4ocmVjdC5sZWZ0LCBvdGhlci5sZWZ0KSwgdG9wOiBNYXRoLm1pbihyZWN0LnRvcCwgb3RoZXIudG9wKSxcbiAgICAgICAgICAgICAgICByaWdodDogTWF0aC5tYXgocmVjdC5yaWdodCwgb3RoZXIucmlnaHQpLCBib3R0b206IE1hdGgubWF4KHJlY3QuYm90dG9tLCBvdGhlci5ib3R0b20pIH07XG4gICAgICAgIGxldCBtYXJnaW5zID0gZ2V0U2Nyb2xsTWFyZ2lucyh0aGlzLnZpZXcpO1xuICAgICAgICBsZXQgdGFyZ2V0UmVjdCA9IHtcbiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCAtIG1hcmdpbnMubGVmdCwgdG9wOiByZWN0LnRvcCAtIG1hcmdpbnMudG9wLFxuICAgICAgICAgICAgcmlnaHQ6IHJlY3QucmlnaHQgKyBtYXJnaW5zLnJpZ2h0LCBib3R0b206IHJlY3QuYm90dG9tICsgbWFyZ2lucy5ib3R0b21cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHsgb2Zmc2V0V2lkdGgsIG9mZnNldEhlaWdodCB9ID0gdGhpcy52aWV3LnNjcm9sbERPTTtcbiAgICAgICAgc2Nyb2xsUmVjdEludG9WaWV3KHRoaXMudmlldy5zY3JvbGxET00sIHRhcmdldFJlY3QsIHJhbmdlLmhlYWQgPCByYW5nZS5hbmNob3IgPyAtMSA6IDEsIHRhcmdldC54LCB0YXJnZXQueSwgTWF0aC5tYXgoTWF0aC5taW4odGFyZ2V0LnhNYXJnaW4sIG9mZnNldFdpZHRoKSwgLW9mZnNldFdpZHRoKSwgTWF0aC5tYXgoTWF0aC5taW4odGFyZ2V0LnlNYXJnaW4sIG9mZnNldEhlaWdodCksIC1vZmZzZXRIZWlnaHQpLCB0aGlzLnZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSKTtcbiAgICB9XG59XG5mdW5jdGlvbiBiZXR3ZWVuVW5lZGl0YWJsZShwb3MpIHtcbiAgICByZXR1cm4gcG9zLm5vZGUubm9kZVR5cGUgPT0gMSAmJiBwb3Mubm9kZS5maXJzdENoaWxkICYmXG4gICAgICAgIChwb3Mub2Zmc2V0ID09IDAgfHwgcG9zLm5vZGUuY2hpbGROb2Rlc1twb3Mub2Zmc2V0IC0gMV0uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIikgJiZcbiAgICAgICAgKHBvcy5vZmZzZXQgPT0gcG9zLm5vZGUuY2hpbGROb2Rlcy5sZW5ndGggfHwgcG9zLm5vZGUuY2hpbGROb2Rlc1twb3Mub2Zmc2V0XS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKTtcbn1cbmNsYXNzIEJsb2NrR2FwV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IoaGVpZ2h0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIH1cbiAgICB0b0RPTSgpIHtcbiAgICAgICAgbGV0IGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGVsdC5jbGFzc05hbWUgPSBcImNtLWdhcFwiO1xuICAgICAgICB0aGlzLnVwZGF0ZURPTShlbHQpO1xuICAgICAgICByZXR1cm4gZWx0O1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIuaGVpZ2h0ID09IHRoaXMuaGVpZ2h0OyB9XG4gICAgdXBkYXRlRE9NKGVsdCkge1xuICAgICAgICBlbHQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBcInB4XCI7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgZWRpdGFibGUoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IGVzdGltYXRlZEhlaWdodCgpIHsgcmV0dXJuIHRoaXMuaGVpZ2h0OyB9XG59XG5mdW5jdGlvbiBmaW5kQ29tcG9zaXRpb25Ob2RlKHZpZXcsIGhlYWRQb3MpIHtcbiAgICBsZXQgc2VsID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICBsZXQgdGV4dE5vZGUgPSBzZWwuZm9jdXNOb2RlICYmIG5lYXJieVRleHROb2RlKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCwgMCk7XG4gICAgaWYgKCF0ZXh0Tm9kZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGZyb20gPSBoZWFkUG9zIC0gdGV4dE5vZGUub2Zmc2V0O1xuICAgIHJldHVybiB7IGZyb20sIHRvOiBmcm9tICsgdGV4dE5vZGUubm9kZS5ub2RlVmFsdWUubGVuZ3RoLCBub2RlOiB0ZXh0Tm9kZS5ub2RlIH07XG59XG5mdW5jdGlvbiBmaW5kQ29tcG9zaXRpb25SYW5nZSh2aWV3LCBjaGFuZ2VzLCBoZWFkUG9zKSB7XG4gICAgbGV0IGZvdW5kID0gZmluZENvbXBvc2l0aW9uTm9kZSh2aWV3LCBoZWFkUG9zKTtcbiAgICBpZiAoIWZvdW5kKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgeyBub2RlOiB0ZXh0Tm9kZSwgZnJvbSwgdG8gfSA9IGZvdW5kLCB0ZXh0ID0gdGV4dE5vZGUubm9kZVZhbHVlO1xuICAgIC8vIERvbid0IHRyeSB0byBwcmVzZXJ2ZSBtdWx0aS1saW5lIGNvbXBvc2l0aW9uc1xuICAgIGlmICgvW1xcblxccl0vLnRlc3QodGV4dCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGlmICh2aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZyhmb3VuZC5mcm9tLCBmb3VuZC50bykgIT0gdGV4dClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGludiA9IGNoYW5nZXMuaW52ZXJ0ZWREZXNjO1xuICAgIGxldCByYW5nZSA9IG5ldyBDaGFuZ2VkUmFuZ2UoaW52Lm1hcFBvcyhmcm9tKSwgaW52Lm1hcFBvcyh0byksIGZyb20sIHRvKTtcbiAgICBsZXQgbWFya3MgPSBbXTtcbiAgICBmb3IgKGxldCBwYXJlbnQgPSB0ZXh0Tm9kZS5wYXJlbnROb2RlOzsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgbGV0IHBhcmVudFZpZXcgPSBDb250ZW50Vmlldy5nZXQocGFyZW50KTtcbiAgICAgICAgaWYgKHBhcmVudFZpZXcgaW5zdGFuY2VvZiBNYXJrVmlldylcbiAgICAgICAgICAgIG1hcmtzLnB1c2goeyBub2RlOiBwYXJlbnQsIGRlY286IHBhcmVudFZpZXcubWFyayB9KTtcbiAgICAgICAgZWxzZSBpZiAocGFyZW50VmlldyBpbnN0YW5jZW9mIExpbmVWaWV3IHx8IHBhcmVudC5ub2RlTmFtZSA9PSBcIkRJVlwiICYmIHBhcmVudC5wYXJlbnROb2RlID09IHZpZXcuY29udGVudERPTSlcbiAgICAgICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0OiB0ZXh0Tm9kZSwgbWFya3MsIGxpbmU6IHBhcmVudCB9O1xuICAgICAgICBlbHNlIGlmIChwYXJlbnQgIT0gdmlldy5jb250ZW50RE9NKVxuICAgICAgICAgICAgbWFya3MucHVzaCh7IG5vZGU6IHBhcmVudCwgZGVjbzogbmV3IE1hcmtEZWNvcmF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBnZXRBdHRycyhwYXJlbnQpLFxuICAgICAgICAgICAgICAgICAgICB0YWdOYW1lOiBwYXJlbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgfSkgfSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5lYXJieVRleHROb2RlKHN0YXJ0Tm9kZSwgc3RhcnRPZmZzZXQsIHNpZGUpIHtcbiAgICBpZiAoc2lkZSA8PSAwKVxuICAgICAgICBmb3IgKGxldCBub2RlID0gc3RhcnROb2RlLCBvZmZzZXQgPSBzdGFydE9mZnNldDs7KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IG5vZGUsIG9mZnNldDogb2Zmc2V0IH07XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG9mZnNldCA+IDApIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IG1heE9mZnNldChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgaWYgKHNpZGUgPj0gMClcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IHN0YXJ0Tm9kZSwgb2Zmc2V0ID0gc3RhcnRPZmZzZXQ7Oykge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgICAgICByZXR1cm4geyBub2RlOiBub2RlLCBvZmZzZXQ6IG9mZnNldCB9O1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoICYmIHNpZGUgPj0gMCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIG5leHRUb1VuZWRpdGFibGUobm9kZSwgb2Zmc2V0KSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSlcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgcmV0dXJuIChvZmZzZXQgJiYgbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIgPyAxIC8qIE5leHRUby5CZWZvcmUgKi8gOiAwKSB8XG4gICAgICAgIChvZmZzZXQgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoICYmIG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIgPyAyIC8qIE5leHRUby5BZnRlciAqLyA6IDApO1xufVxubGV0IERlY29yYXRpb25Db21wYXJhdG9yJDEgPSBjbGFzcyBEZWNvcmF0aW9uQ29tcGFyYXRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IFtdO1xuICAgIH1cbiAgICBjb21wYXJlUmFuZ2UoZnJvbSwgdG8pIHsgYWRkUmFuZ2UoZnJvbSwgdG8sIHRoaXMuY2hhbmdlcyk7IH1cbiAgICBjb21wYXJlUG9pbnQoZnJvbSwgdG8pIHsgYWRkUmFuZ2UoZnJvbSwgdG8sIHRoaXMuY2hhbmdlcyk7IH1cbn07XG5mdW5jdGlvbiBmaW5kQ2hhbmdlZERlY28oYSwgYiwgZGlmZikge1xuICAgIGxldCBjb21wID0gbmV3IERlY29yYXRpb25Db21wYXJhdG9yJDE7XG4gICAgUmFuZ2VTZXQuY29tcGFyZShhLCBiLCBkaWZmLCBjb21wKTtcbiAgICByZXR1cm4gY29tcC5jaGFuZ2VzO1xufVxuZnVuY3Rpb24gaW5VbmVkaXRhYmxlKG5vZGUsIGluc2lkZSkge1xuICAgIGZvciAobGV0IGN1ciA9IG5vZGU7IGN1ciAmJiBjdXIgIT0gaW5zaWRlOyBjdXIgPSBjdXIuYXNzaWduZWRTbG90IHx8IGN1ci5wYXJlbnROb2RlKSB7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgPT0gMSAmJiBjdXIuY29udGVudEVkaXRhYmxlID09ICdmYWxzZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHRvdWNoZXNDb21wb3NpdGlvbihjaGFuZ2VzLCBjb21wb3NpdGlvbikge1xuICAgIGxldCB0b3VjaGVkID0gZmFsc2U7XG4gICAgaWYgKGNvbXBvc2l0aW9uKVxuICAgICAgICBjaGFuZ2VzLml0ZXJDaGFuZ2VkUmFuZ2VzKChmcm9tLCB0bykgPT4ge1xuICAgICAgICAgICAgaWYgKGZyb20gPCBjb21wb3NpdGlvbi50byAmJiB0byA+IGNvbXBvc2l0aW9uLmZyb20pXG4gICAgICAgICAgICAgICAgdG91Y2hlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIHJldHVybiB0b3VjaGVkO1xufVxuXG5mdW5jdGlvbiBncm91cEF0KHN0YXRlLCBwb3MsIGJpYXMgPSAxKSB7XG4gICAgbGV0IGNhdGVnb3JpemUgPSBzdGF0ZS5jaGFyQ2F0ZWdvcml6ZXIocG9zKTtcbiAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQocG9zKSwgbGluZVBvcyA9IHBvcyAtIGxpbmUuZnJvbTtcbiAgICBpZiAobGluZS5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zKTtcbiAgICBpZiAobGluZVBvcyA9PSAwKVxuICAgICAgICBiaWFzID0gMTtcbiAgICBlbHNlIGlmIChsaW5lUG9zID09IGxpbmUubGVuZ3RoKVxuICAgICAgICBiaWFzID0gLTE7XG4gICAgbGV0IGZyb20gPSBsaW5lUG9zLCB0byA9IGxpbmVQb3M7XG4gICAgaWYgKGJpYXMgPCAwKVxuICAgICAgICBmcm9tID0gZmluZENsdXN0ZXJCcmVhayhsaW5lLnRleHQsIGxpbmVQb3MsIGZhbHNlKTtcbiAgICBlbHNlXG4gICAgICAgIHRvID0gZmluZENsdXN0ZXJCcmVhayhsaW5lLnRleHQsIGxpbmVQb3MpO1xuICAgIGxldCBjYXQgPSBjYXRlZ29yaXplKGxpbmUudGV4dC5zbGljZShmcm9tLCB0bykpO1xuICAgIHdoaWxlIChmcm9tID4gMCkge1xuICAgICAgICBsZXQgcHJldiA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCBmcm9tLCBmYWxzZSk7XG4gICAgICAgIGlmIChjYXRlZ29yaXplKGxpbmUudGV4dC5zbGljZShwcmV2LCBmcm9tKSkgIT0gY2F0KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGZyb20gPSBwcmV2O1xuICAgIH1cbiAgICB3aGlsZSAodG8gPCBsaW5lLmxlbmd0aCkge1xuICAgICAgICBsZXQgbmV4dCA9IGZpbmRDbHVzdGVyQnJlYWsobGluZS50ZXh0LCB0byk7XG4gICAgICAgIGlmIChjYXRlZ29yaXplKGxpbmUudGV4dC5zbGljZSh0bywgbmV4dCkpICE9IGNhdClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB0byA9IG5leHQ7XG4gICAgfVxuICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSArIGxpbmUuZnJvbSwgdG8gKyBsaW5lLmZyb20pO1xufVxuLy8gU2VhcmNoIHRoZSBET00gZm9yIHRoZSB7bm9kZSwgb2Zmc2V0fSBwb3NpdGlvbiBjbG9zZXN0IHRvIHRoZSBnaXZlblxuLy8gY29vcmRpbmF0ZXMuIFZlcnkgaW5lZmZpY2llbnQgYW5kIGNydWRlLCBidXQgY2FuIHVzdWFsbHkgYmUgYXZvaWRlZFxuLy8gYnkgY2FsbGluZyBjYXJldChQb3NpdGlvbnxSYW5nZSlGcm9tUG9pbnQgaW5zdGVhZC5cbmZ1bmN0aW9uIGdldGR4KHgsIHJlY3QpIHtcbiAgICByZXR1cm4gcmVjdC5sZWZ0ID4geCA/IHJlY3QubGVmdCAtIHggOiBNYXRoLm1heCgwLCB4IC0gcmVjdC5yaWdodCk7XG59XG5mdW5jdGlvbiBnZXRkeSh5LCByZWN0KSB7XG4gICAgcmV0dXJuIHJlY3QudG9wID4geSA/IHJlY3QudG9wIC0geSA6IE1hdGgubWF4KDAsIHkgLSByZWN0LmJvdHRvbSk7XG59XG5mdW5jdGlvbiB5T3ZlcmxhcChhLCBiKSB7XG4gICAgcmV0dXJuIGEudG9wIDwgYi5ib3R0b20gLSAxICYmIGEuYm90dG9tID4gYi50b3AgKyAxO1xufVxuZnVuY3Rpb24gdXBUb3AocmVjdCwgdG9wKSB7XG4gICAgcmV0dXJuIHRvcCA8IHJlY3QudG9wID8geyB0b3AsIGxlZnQ6IHJlY3QubGVmdCwgcmlnaHQ6IHJlY3QucmlnaHQsIGJvdHRvbTogcmVjdC5ib3R0b20gfSA6IHJlY3Q7XG59XG5mdW5jdGlvbiB1cEJvdChyZWN0LCBib3R0b20pIHtcbiAgICByZXR1cm4gYm90dG9tID4gcmVjdC5ib3R0b20gPyB7IHRvcDogcmVjdC50b3AsIGxlZnQ6IHJlY3QubGVmdCwgcmlnaHQ6IHJlY3QucmlnaHQsIGJvdHRvbSB9IDogcmVjdDtcbn1cbmZ1bmN0aW9uIGRvbVBvc0F0Q29vcmRzKHBhcmVudCwgeCwgeSkge1xuICAgIGxldCBjbG9zZXN0LCBjbG9zZXN0UmVjdCwgY2xvc2VzdFgsIGNsb3Nlc3RZLCBjbG9zZXN0T3ZlcmxhcCA9IGZhbHNlO1xuICAgIGxldCBhYm92ZSwgYmVsb3csIGFib3ZlUmVjdCwgYmVsb3dSZWN0O1xuICAgIGZvciAobGV0IGNoaWxkID0gcGFyZW50LmZpcnN0Q2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGxldCByZWN0cyA9IGNsaWVudFJlY3RzRm9yKGNoaWxkKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tpXTtcbiAgICAgICAgICAgIGlmIChjbG9zZXN0UmVjdCAmJiB5T3ZlcmxhcChjbG9zZXN0UmVjdCwgcmVjdCkpXG4gICAgICAgICAgICAgICAgcmVjdCA9IHVwVG9wKHVwQm90KHJlY3QsIGNsb3Nlc3RSZWN0LmJvdHRvbSksIGNsb3Nlc3RSZWN0LnRvcCk7XG4gICAgICAgICAgICBsZXQgZHggPSBnZXRkeCh4LCByZWN0KSwgZHkgPSBnZXRkeSh5LCByZWN0KTtcbiAgICAgICAgICAgIGlmIChkeCA9PSAwICYmIGR5ID09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLm5vZGVUeXBlID09IDMgPyBkb21Qb3NJblRleHQoY2hpbGQsIHgsIHkpIDogZG9tUG9zQXRDb29yZHMoY2hpbGQsIHgsIHkpO1xuICAgICAgICAgICAgaWYgKCFjbG9zZXN0IHx8IGNsb3Nlc3RZID4gZHkgfHwgY2xvc2VzdFkgPT0gZHkgJiYgY2xvc2VzdFggPiBkeCkge1xuICAgICAgICAgICAgICAgIGNsb3Nlc3QgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICBjbG9zZXN0UmVjdCA9IHJlY3Q7XG4gICAgICAgICAgICAgICAgY2xvc2VzdFggPSBkeDtcbiAgICAgICAgICAgICAgICBjbG9zZXN0WSA9IGR5O1xuICAgICAgICAgICAgICAgIGxldCBzaWRlID0gZHkgPyAoeSA8IHJlY3QudG9wID8gLTEgOiAxKSA6IGR4ID8gKHggPCByZWN0LmxlZnQgPyAtMSA6IDEpIDogMDtcbiAgICAgICAgICAgICAgICBjbG9zZXN0T3ZlcmxhcCA9ICFzaWRlIHx8IChzaWRlID4gMCA/IGkgPCByZWN0cy5sZW5ndGggLSAxIDogaSA+IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGR4ID09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoeSA+IHJlY3QuYm90dG9tICYmICghYWJvdmVSZWN0IHx8IGFib3ZlUmVjdC5ib3R0b20gPCByZWN0LmJvdHRvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvdmUgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgYWJvdmVSZWN0ID0gcmVjdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoeSA8IHJlY3QudG9wICYmICghYmVsb3dSZWN0IHx8IGJlbG93UmVjdC50b3AgPiByZWN0LnRvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVsb3cgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgYmVsb3dSZWN0ID0gcmVjdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhYm92ZVJlY3QgJiYgeU92ZXJsYXAoYWJvdmVSZWN0LCByZWN0KSkge1xuICAgICAgICAgICAgICAgIGFib3ZlUmVjdCA9IHVwQm90KGFib3ZlUmVjdCwgcmVjdC5ib3R0b20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmVsb3dSZWN0ICYmIHlPdmVybGFwKGJlbG93UmVjdCwgcmVjdCkpIHtcbiAgICAgICAgICAgICAgICBiZWxvd1JlY3QgPSB1cFRvcChiZWxvd1JlY3QsIHJlY3QudG9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWJvdmVSZWN0ICYmIGFib3ZlUmVjdC5ib3R0b20gPj0geSkge1xuICAgICAgICBjbG9zZXN0ID0gYWJvdmU7XG4gICAgICAgIGNsb3Nlc3RSZWN0ID0gYWJvdmVSZWN0O1xuICAgIH1cbiAgICBlbHNlIGlmIChiZWxvd1JlY3QgJiYgYmVsb3dSZWN0LnRvcCA8PSB5KSB7XG4gICAgICAgIGNsb3Nlc3QgPSBiZWxvdztcbiAgICAgICAgY2xvc2VzdFJlY3QgPSBiZWxvd1JlY3Q7XG4gICAgfVxuICAgIGlmICghY2xvc2VzdClcbiAgICAgICAgcmV0dXJuIHsgbm9kZTogcGFyZW50LCBvZmZzZXQ6IDAgfTtcbiAgICBsZXQgY2xpcFggPSBNYXRoLm1heChjbG9zZXN0UmVjdC5sZWZ0LCBNYXRoLm1pbihjbG9zZXN0UmVjdC5yaWdodCwgeCkpO1xuICAgIGlmIChjbG9zZXN0Lm5vZGVUeXBlID09IDMpXG4gICAgICAgIHJldHVybiBkb21Qb3NJblRleHQoY2xvc2VzdCwgY2xpcFgsIHkpO1xuICAgIGlmIChjbG9zZXN0T3ZlcmxhcCAmJiBjbG9zZXN0LmNvbnRlbnRFZGl0YWJsZSAhPSBcImZhbHNlXCIpXG4gICAgICAgIHJldHVybiBkb21Qb3NBdENvb3JkcyhjbG9zZXN0LCBjbGlwWCwgeSk7XG4gICAgbGV0IG9mZnNldCA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwocGFyZW50LmNoaWxkTm9kZXMsIGNsb3Nlc3QpICtcbiAgICAgICAgKHggPj0gKGNsb3Nlc3RSZWN0LmxlZnQgKyBjbG9zZXN0UmVjdC5yaWdodCkgLyAyID8gMSA6IDApO1xuICAgIHJldHVybiB7IG5vZGU6IHBhcmVudCwgb2Zmc2V0IH07XG59XG5mdW5jdGlvbiBkb21Qb3NJblRleHQobm9kZSwgeCwgeSkge1xuICAgIGxldCBsZW4gPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgbGV0IGNsb3Nlc3RPZmZzZXQgPSAtMSwgY2xvc2VzdERZID0gMWU5LCBnZW5lcmFsU2lkZSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBsZXQgcmVjdHMgPSB0ZXh0UmFuZ2Uobm9kZSwgaSwgaSArIDEpLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVjdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbal07XG4gICAgICAgICAgICBpZiAocmVjdC50b3AgPT0gcmVjdC5ib3R0b20pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWdlbmVyYWxTaWRlKVxuICAgICAgICAgICAgICAgIGdlbmVyYWxTaWRlID0geCAtIHJlY3QubGVmdDtcbiAgICAgICAgICAgIGxldCBkeSA9IChyZWN0LnRvcCA+IHkgPyByZWN0LnRvcCAtIHkgOiB5IC0gcmVjdC5ib3R0b20pIC0gMTtcbiAgICAgICAgICAgIGlmIChyZWN0LmxlZnQgLSAxIDw9IHggJiYgcmVjdC5yaWdodCArIDEgPj0geCAmJiBkeSA8IGNsb3Nlc3REWSkge1xuICAgICAgICAgICAgICAgIGxldCByaWdodCA9IHggPj0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiwgYWZ0ZXIgPSByaWdodDtcbiAgICAgICAgICAgICAgICBpZiAoYnJvd3Nlci5jaHJvbWUgfHwgYnJvd3Nlci5nZWNrbykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgUlRMIG9uIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBnZXR0aW5nIGNsaWVudFxuICAgICAgICAgICAgICAgICAgICAvLyByZWN0cyBmb3IgZW1wdHkgcmFuZ2VzLlxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdEJlZm9yZSA9IHRleHRSYW5nZShub2RlLCBpKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3RCZWZvcmUubGVmdCA9PSByZWN0LnJpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSAhcmlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkeSA8PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBub2RlLCBvZmZzZXQ6IGkgKyAoYWZ0ZXIgPyAxIDogMCkgfTtcbiAgICAgICAgICAgICAgICBjbG9zZXN0T2Zmc2V0ID0gaSArIChhZnRlciA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICBjbG9zZXN0RFkgPSBkeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBub2RlLCBvZmZzZXQ6IGNsb3Nlc3RPZmZzZXQgPiAtMSA/IGNsb3Nlc3RPZmZzZXQgOiBnZW5lcmFsU2lkZSA+IDAgPyBub2RlLm5vZGVWYWx1ZS5sZW5ndGggOiAwIH07XG59XG5mdW5jdGlvbiBwb3NBdENvb3Jkcyh2aWV3LCBjb29yZHMsIHByZWNpc2UsIGJpYXMgPSAtMSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgbGV0IGNvbnRlbnQgPSB2aWV3LmNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGRvY1RvcCA9IGNvbnRlbnQudG9wICsgdmlldy52aWV3U3RhdGUucGFkZGluZ1RvcDtcbiAgICBsZXQgYmxvY2ssIHsgZG9jSGVpZ2h0IH0gPSB2aWV3LnZpZXdTdGF0ZTtcbiAgICBsZXQgeyB4LCB5IH0gPSBjb29yZHMsIHlPZmZzZXQgPSB5IC0gZG9jVG9wO1xuICAgIGlmICh5T2Zmc2V0IDwgMClcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgaWYgKHlPZmZzZXQgPiBkb2NIZWlnaHQpXG4gICAgICAgIHJldHVybiB2aWV3LnN0YXRlLmRvYy5sZW5ndGg7XG4gICAgLy8gU2NhbiBmb3IgYSB0ZXh0IGJsb2NrIG5lYXIgdGhlIHF1ZXJpZWQgeSBwb3NpdGlvblxuICAgIGZvciAobGV0IGhhbGZMaW5lID0gdmlldy52aWV3U3RhdGUuaGVpZ2h0T3JhY2xlLnRleHRIZWlnaHQgLyAyLCBib3VuY2VkID0gZmFsc2U7Oykge1xuICAgICAgICBibG9jayA9IHZpZXcuZWxlbWVudEF0SGVpZ2h0KHlPZmZzZXQpO1xuICAgICAgICBpZiAoYmxvY2sudHlwZSA9PSBCbG9ja1R5cGUuVGV4dClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAvLyBNb3ZlIHRoZSB5IHBvc2l0aW9uIG91dCBvZiB0aGlzIGJsb2NrXG4gICAgICAgICAgICB5T2Zmc2V0ID0gYmlhcyA+IDAgPyBibG9jay5ib3R0b20gKyBoYWxmTGluZSA6IGJsb2NrLnRvcCAtIGhhbGZMaW5lO1xuICAgICAgICAgICAgaWYgKHlPZmZzZXQgPj0gMCAmJiB5T2Zmc2V0IDw9IGRvY0hlaWdodClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIElmIHRoZSBkb2N1bWVudCBjb25zaXN0cyBlbnRpcmVseSBvZiByZXBsYWNlZCB3aWRnZXRzLCB3ZVxuICAgICAgICAgICAgLy8gd29uJ3QgZmluZCBhIHRleHQgYmxvY2ssIHNvIHJldHVybiAwXG4gICAgICAgICAgICBpZiAoYm91bmNlZClcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlY2lzZSA/IG51bGwgOiAwO1xuICAgICAgICAgICAgYm91bmNlZCA9IHRydWU7XG4gICAgICAgICAgICBiaWFzID0gLWJpYXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgeSA9IGRvY1RvcCArIHlPZmZzZXQ7XG4gICAgbGV0IGxpbmVTdGFydCA9IGJsb2NrLmZyb207XG4gICAgLy8gSWYgdGhpcyBpcyBvdXRzaWRlIG9mIHRoZSByZW5kZXJlZCB2aWV3cG9ydCwgd2UgY2FuJ3QgZGV0ZXJtaW5lIGEgcG9zaXRpb25cbiAgICBpZiAobGluZVN0YXJ0IDwgdmlldy52aWV3cG9ydC5mcm9tKVxuICAgICAgICByZXR1cm4gdmlldy52aWV3cG9ydC5mcm9tID09IDAgPyAwIDogcHJlY2lzZSA/IG51bGwgOiBwb3NBdENvb3Jkc0ltcHJlY2lzZSh2aWV3LCBjb250ZW50LCBibG9jaywgeCwgeSk7XG4gICAgaWYgKGxpbmVTdGFydCA+IHZpZXcudmlld3BvcnQudG8pXG4gICAgICAgIHJldHVybiB2aWV3LnZpZXdwb3J0LnRvID09IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCA/IHZpZXcuc3RhdGUuZG9jLmxlbmd0aCA6XG4gICAgICAgICAgICBwcmVjaXNlID8gbnVsbCA6IHBvc0F0Q29vcmRzSW1wcmVjaXNlKHZpZXcsIGNvbnRlbnQsIGJsb2NrLCB4LCB5KTtcbiAgICAvLyBQcmVmZXIgU2hhZG93Um9vdE9yRG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCBpZiBwcmVzZW50LCBmYWxsIGJhY2sgdG8gZG9jdW1lbnQgaWYgbm90XG4gICAgbGV0IGRvYyA9IHZpZXcuZG9tLm93bmVyRG9jdW1lbnQ7XG4gICAgbGV0IHJvb3QgPSB2aWV3LnJvb3QuZWxlbWVudEZyb21Qb2ludCA/IHZpZXcucm9vdCA6IGRvYztcbiAgICBsZXQgZWxlbWVudCA9IHJvb3QuZWxlbWVudEZyb21Qb2ludCh4LCB5KTtcbiAgICBpZiAoZWxlbWVudCAmJiAhdmlldy5jb250ZW50RE9NLmNvbnRhaW5zKGVsZW1lbnQpKVxuICAgICAgICBlbGVtZW50ID0gbnVsbDtcbiAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyB1bmV4cGVjdGVkLCBjbGlwIHggYXQgdGhlIHNpZGVzIG9mIHRoZSBjb250ZW50IGFyZWEgYW5kIHRyeSBhZ2FpblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICB4ID0gTWF0aC5tYXgoY29udGVudC5sZWZ0ICsgMSwgTWF0aC5taW4oY29udGVudC5yaWdodCAtIDEsIHgpKTtcbiAgICAgICAgZWxlbWVudCA9IHJvb3QuZWxlbWVudEZyb21Qb2ludCh4LCB5KTtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgIXZpZXcuY29udGVudERPTS5jb250YWlucyhlbGVtZW50KSlcbiAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgICAvLyBUaGVyZSdzIHZpc2libGUgZWRpdG9yIGNvbnRlbnQgdW5kZXIgdGhlIHBvaW50LCBzbyB3ZSBjYW4gdHJ5XG4gICAgLy8gdXNpbmcgY2FyZXQoUG9zaXRpb258UmFuZ2UpRnJvbVBvaW50IGFzIGEgc2hvcnRjdXRcbiAgICBsZXQgbm9kZSwgb2Zmc2V0ID0gLTE7XG4gICAgaWYgKGVsZW1lbnQgJiYgKChfYSA9IHZpZXcuZG9jVmlldy5uZWFyZXN0KGVsZW1lbnQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNFZGl0YWJsZSkgIT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGRvYy5jYXJldFBvc2l0aW9uRnJvbVBvaW50KSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gZG9jLmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgICAgICBpZiAocG9zKVxuICAgICAgICAgICAgICAgICh7IG9mZnNldE5vZGU6IG5vZGUsIG9mZnNldCB9ID0gcG9zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkb2MuY2FyZXRSYW5nZUZyb21Qb2ludCkge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gZG9jLmNhcmV0UmFuZ2VGcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAoeyBzdGFydENvbnRhaW5lcjogbm9kZSwgc3RhcnRPZmZzZXQ6IG9mZnNldCB9ID0gcmFuZ2UpO1xuICAgICAgICAgICAgICAgIGlmICghdmlldy5jb250ZW50RE9NLmNvbnRhaW5zKG5vZGUpIHx8XG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXIuc2FmYXJpICYmIGlzU3VzcGljaW91c1NhZmFyaUNhcmV0UmVzdWx0KG5vZGUsIG9mZnNldCwgeCkgfHxcbiAgICAgICAgICAgICAgICAgICAgYnJvd3Nlci5jaHJvbWUgJiYgaXNTdXNwaWNpb3VzQ2hyb21lQ2FyZXRSZXN1bHQobm9kZSwgb2Zmc2V0LCB4KSlcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBObyBsdWNrLCBkbyBvdXIgb3duIChwb3RlbnRpYWxseSBleHBlbnNpdmUpIHNlYXJjaFxuICAgIGlmICghbm9kZSB8fCAhdmlldy5kb2NWaWV3LmRvbS5jb250YWlucyhub2RlKSkge1xuICAgICAgICBsZXQgbGluZSA9IExpbmVWaWV3LmZpbmQodmlldy5kb2NWaWV3LCBsaW5lU3RhcnQpO1xuICAgICAgICBpZiAoIWxpbmUpXG4gICAgICAgICAgICByZXR1cm4geU9mZnNldCA+IGJsb2NrLnRvcCArIGJsb2NrLmhlaWdodCAvIDIgPyBibG9jay50byA6IGJsb2NrLmZyb207XG4gICAgICAgICh7IG5vZGUsIG9mZnNldCB9ID0gZG9tUG9zQXRDb29yZHMobGluZS5kb20sIHgsIHkpKTtcbiAgICB9XG4gICAgbGV0IG5lYXJlc3QgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdChub2RlKTtcbiAgICBpZiAoIW5lYXJlc3QpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGlmIChuZWFyZXN0LmlzV2lkZ2V0ICYmICgoX2IgPSBuZWFyZXN0LmRvbSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm5vZGVUeXBlKSA9PSAxKSB7XG4gICAgICAgIGxldCByZWN0ID0gbmVhcmVzdC5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiBjb29yZHMueSA8IHJlY3QudG9wIHx8IGNvb3Jkcy55IDw9IHJlY3QuYm90dG9tICYmIGNvb3Jkcy54IDw9IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDJcbiAgICAgICAgICAgID8gbmVhcmVzdC5wb3NBdFN0YXJ0IDogbmVhcmVzdC5wb3NBdEVuZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZWFyZXN0LmxvY2FsUG9zRnJvbURPTShub2RlLCBvZmZzZXQpICsgbmVhcmVzdC5wb3NBdFN0YXJ0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBvc0F0Q29vcmRzSW1wcmVjaXNlKHZpZXcsIGNvbnRlbnRSZWN0LCBibG9jaywgeCwgeSkge1xuICAgIGxldCBpbnRvID0gTWF0aC5yb3VuZCgoeCAtIGNvbnRlbnRSZWN0LmxlZnQpICogdmlldy5kZWZhdWx0Q2hhcmFjdGVyV2lkdGgpO1xuICAgIGlmICh2aWV3LmxpbmVXcmFwcGluZyAmJiBibG9jay5oZWlnaHQgPiB2aWV3LmRlZmF1bHRMaW5lSGVpZ2h0ICogMS41KSB7XG4gICAgICAgIGxldCB0ZXh0SGVpZ2h0ID0gdmlldy52aWV3U3RhdGUuaGVpZ2h0T3JhY2xlLnRleHRIZWlnaHQ7XG4gICAgICAgIGxldCBsaW5lID0gTWF0aC5mbG9vcigoeSAtIGJsb2NrLnRvcCAtICh2aWV3LmRlZmF1bHRMaW5lSGVpZ2h0IC0gdGV4dEhlaWdodCkgKiAwLjUpIC8gdGV4dEhlaWdodCk7XG4gICAgICAgIGludG8gKz0gbGluZSAqIHZpZXcudmlld1N0YXRlLmhlaWdodE9yYWNsZS5saW5lTGVuZ3RoO1xuICAgIH1cbiAgICBsZXQgY29udGVudCA9IHZpZXcuc3RhdGUuc2xpY2VEb2MoYmxvY2suZnJvbSwgYmxvY2sudG8pO1xuICAgIHJldHVybiBibG9jay5mcm9tICsgZmluZENvbHVtbihjb250ZW50LCBpbnRvLCB2aWV3LnN0YXRlLnRhYlNpemUpO1xufVxuLy8gSW4gY2FzZSBvZiBhIGhpZ2ggbGluZSBoZWlnaHQsIFNhZmFyaSdzIGNhcmV0UmFuZ2VGcm9tUG9pbnQgdHJlYXRzXG4vLyB0aGUgc3BhY2UgYmV0d2VlbiBsaW5lcyBhcyBiZWxvbmdpbmcgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZVxuLy8gbGluZSBiZWZvcmUuIFRoaXMgaXMgdXNlZCB0byBkZXRlY3Qgc3VjaCBhIHJlc3VsdCBzbyB0aGF0IGl0IGNhbiBiZVxuLy8gaWdub3JlZCAoaXNzdWUgIzQwMSkuXG5mdW5jdGlvbiBpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdChub2RlLCBvZmZzZXQsIHgpIHtcbiAgICBsZXQgbGVuO1xuICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDMgfHwgb2Zmc2V0ICE9IChsZW4gPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7IG5leHQ7IG5leHQgPSBuZXh0Lm5leHRTaWJsaW5nKVxuICAgICAgICBpZiAobmV4dC5ub2RlVHlwZSAhPSAxIHx8IG5leHQubm9kZU5hbWUgIT0gXCJCUlwiKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0ZXh0UmFuZ2Uobm9kZSwgbGVuIC0gMSwgbGVuKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ID4geDtcbn1cbi8vIENocm9tZSB3aWxsIG1vdmUgcG9zaXRpb25zIGJldHdlZW4gbGluZXMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGxpbmVcbmZ1bmN0aW9uIGlzU3VzcGljaW91c0Nocm9tZUNhcmV0UmVzdWx0KG5vZGUsIG9mZnNldCwgeCkge1xuICAgIGlmIChvZmZzZXQgIT0gMClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGN1ciA9IG5vZGU7Oykge1xuICAgICAgICBsZXQgcGFyZW50ID0gY3VyLnBhcmVudE5vZGU7XG4gICAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5ub2RlVHlwZSAhPSAxIHx8IHBhcmVudC5maXJzdENoaWxkICE9IGN1cilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHBhcmVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjbS1saW5lXCIpKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGN1ciA9IHBhcmVudDtcbiAgICB9XG4gICAgbGV0IHJlY3QgPSBub2RlLm5vZGVUeXBlID09IDEgPyBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIDogdGV4dFJhbmdlKG5vZGUsIDAsIE1hdGgubWF4KG5vZGUubm9kZVZhbHVlLmxlbmd0aCwgMSkpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiB4IC0gcmVjdC5sZWZ0ID4gNTtcbn1cbmZ1bmN0aW9uIGJsb2NrQXQodmlldywgcG9zKSB7XG4gICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHBvcyk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobGluZS50eXBlKSlcbiAgICAgICAgZm9yIChsZXQgbCBvZiBsaW5lLnR5cGUpIHtcbiAgICAgICAgICAgIGlmIChsLnRvID4gcG9zIHx8IGwudG8gPT0gcG9zICYmIChsLnRvID09IGxpbmUudG8gfHwgbC50eXBlID09IEJsb2NrVHlwZS5UZXh0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbDtcbiAgICAgICAgfVxuICAgIHJldHVybiBsaW5lO1xufVxuZnVuY3Rpb24gbW92ZVRvTGluZUJvdW5kYXJ5KHZpZXcsIHN0YXJ0LCBmb3J3YXJkLCBpbmNsdWRlV3JhcCkge1xuICAgIGxldCBsaW5lID0gYmxvY2tBdCh2aWV3LCBzdGFydC5oZWFkKTtcbiAgICBsZXQgY29vcmRzID0gIWluY2x1ZGVXcmFwIHx8IGxpbmUudHlwZSAhPSBCbG9ja1R5cGUuVGV4dCB8fCAhKHZpZXcubGluZVdyYXBwaW5nIHx8IGxpbmUud2lkZ2V0TGluZUJyZWFrcykgPyBudWxsXG4gICAgICAgIDogdmlldy5jb29yZHNBdFBvcyhzdGFydC5hc3NvYyA8IDAgJiYgc3RhcnQuaGVhZCA+IGxpbmUuZnJvbSA/IHN0YXJ0LmhlYWQgLSAxIDogc3RhcnQuaGVhZCk7XG4gICAgaWYgKGNvb3Jkcykge1xuICAgICAgICBsZXQgZWRpdG9yUmVjdCA9IHZpZXcuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBsZXQgZGlyZWN0aW9uID0gdmlldy50ZXh0RGlyZWN0aW9uQXQobGluZS5mcm9tKTtcbiAgICAgICAgbGV0IHBvcyA9IHZpZXcucG9zQXRDb29yZHMoeyB4OiBmb3J3YXJkID09IChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxUUikgPyBlZGl0b3JSZWN0LnJpZ2h0IC0gMSA6IGVkaXRvclJlY3QubGVmdCArIDEsXG4gICAgICAgICAgICB5OiAoY29vcmRzLnRvcCArIGNvb3Jkcy5ib3R0b20pIC8gMiB9KTtcbiAgICAgICAgaWYgKHBvcyAhPSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zLCBmb3J3YXJkID8gLTEgOiAxKTtcbiAgICB9XG4gICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IoZm9yd2FyZCA/IGxpbmUudG8gOiBsaW5lLmZyb20sIGZvcndhcmQgPyAtMSA6IDEpO1xufVxuZnVuY3Rpb24gbW92ZUJ5Q2hhcih2aWV3LCBzdGFydCwgZm9yd2FyZCwgYnkpIHtcbiAgICBsZXQgbGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChzdGFydC5oZWFkKSwgc3BhbnMgPSB2aWV3LmJpZGlTcGFucyhsaW5lKTtcbiAgICBsZXQgZGlyZWN0aW9uID0gdmlldy50ZXh0RGlyZWN0aW9uQXQobGluZS5mcm9tKTtcbiAgICBmb3IgKGxldCBjdXIgPSBzdGFydCwgY2hlY2sgPSBudWxsOzspIHtcbiAgICAgICAgbGV0IG5leHQgPSBtb3ZlVmlzdWFsbHkobGluZSwgc3BhbnMsIGRpcmVjdGlvbiwgY3VyLCBmb3J3YXJkKSwgY2hhciA9IG1vdmVkT3ZlcjtcbiAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICBpZiAobGluZS5udW1iZXIgPT0gKGZvcndhcmQgPyB2aWV3LnN0YXRlLmRvYy5saW5lcyA6IDEpKVxuICAgICAgICAgICAgICAgIHJldHVybiBjdXI7XG4gICAgICAgICAgICBjaGFyID0gXCJcXG5cIjtcbiAgICAgICAgICAgIGxpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lKGxpbmUubnVtYmVyICsgKGZvcndhcmQgPyAxIDogLTEpKTtcbiAgICAgICAgICAgIHNwYW5zID0gdmlldy5iaWRpU3BhbnMobGluZSk7XG4gICAgICAgICAgICBuZXh0ID0gdmlldy52aXN1YWxMaW5lU2lkZShsaW5lLCAhZm9yd2FyZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGVjaykge1xuICAgICAgICAgICAgaWYgKCFieSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIGNoZWNrID0gYnkoY2hhcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWNoZWNrKGNoYXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VyO1xuICAgICAgICB9XG4gICAgICAgIGN1ciA9IG5leHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gYnlHcm91cCh2aWV3LCBwb3MsIHN0YXJ0KSB7XG4gICAgbGV0IGNhdGVnb3JpemUgPSB2aWV3LnN0YXRlLmNoYXJDYXRlZ29yaXplcihwb3MpO1xuICAgIGxldCBjYXQgPSBjYXRlZ29yaXplKHN0YXJ0KTtcbiAgICByZXR1cm4gKG5leHQpID0+IHtcbiAgICAgICAgbGV0IG5leHRDYXQgPSBjYXRlZ29yaXplKG5leHQpO1xuICAgICAgICBpZiAoY2F0ID09IENoYXJDYXRlZ29yeS5TcGFjZSlcbiAgICAgICAgICAgIGNhdCA9IG5leHRDYXQ7XG4gICAgICAgIHJldHVybiBjYXQgPT0gbmV4dENhdDtcbiAgICB9O1xufVxuZnVuY3Rpb24gbW92ZVZlcnRpY2FsbHkodmlldywgc3RhcnQsIGZvcndhcmQsIGRpc3RhbmNlKSB7XG4gICAgbGV0IHN0YXJ0UG9zID0gc3RhcnQuaGVhZCwgZGlyID0gZm9yd2FyZCA/IDEgOiAtMTtcbiAgICBpZiAoc3RhcnRQb3MgPT0gKGZvcndhcmQgPyB2aWV3LnN0YXRlLmRvYy5sZW5ndGggOiAwKSlcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3Ioc3RhcnRQb3MsIHN0YXJ0LmFzc29jKTtcbiAgICBsZXQgZ29hbCA9IHN0YXJ0LmdvYWxDb2x1bW4sIHN0YXJ0WTtcbiAgICBsZXQgcmVjdCA9IHZpZXcuY29udGVudERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgc3RhcnRDb29yZHMgPSB2aWV3LmNvb3Jkc0F0UG9zKHN0YXJ0UG9zLCBzdGFydC5hc3NvYyB8fCAtMSksIGRvY1RvcCA9IHZpZXcuZG9jdW1lbnRUb3A7XG4gICAgaWYgKHN0YXJ0Q29vcmRzKSB7XG4gICAgICAgIGlmIChnb2FsID09IG51bGwpXG4gICAgICAgICAgICBnb2FsID0gc3RhcnRDb29yZHMubGVmdCAtIHJlY3QubGVmdDtcbiAgICAgICAgc3RhcnRZID0gZGlyIDwgMCA/IHN0YXJ0Q29vcmRzLnRvcCA6IHN0YXJ0Q29vcmRzLmJvdHRvbTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBsaW5lID0gdmlldy52aWV3U3RhdGUubGluZUJsb2NrQXQoc3RhcnRQb3MpO1xuICAgICAgICBpZiAoZ29hbCA9PSBudWxsKVxuICAgICAgICAgICAgZ29hbCA9IE1hdGgubWluKHJlY3QucmlnaHQgLSByZWN0LmxlZnQsIHZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoICogKHN0YXJ0UG9zIC0gbGluZS5mcm9tKSk7XG4gICAgICAgIHN0YXJ0WSA9IChkaXIgPCAwID8gbGluZS50b3AgOiBsaW5lLmJvdHRvbSkgKyBkb2NUb3A7XG4gICAgfVxuICAgIGxldCByZXNvbHZlZEdvYWwgPSByZWN0LmxlZnQgKyBnb2FsO1xuICAgIGxldCBkaXN0ID0gZGlzdGFuY2UgIT09IG51bGwgJiYgZGlzdGFuY2UgIT09IHZvaWQgMCA/IGRpc3RhbmNlIDogKHZpZXcudmlld1N0YXRlLmhlaWdodE9yYWNsZS50ZXh0SGVpZ2h0ID4+IDEpO1xuICAgIGZvciAobGV0IGV4dHJhID0gMDs7IGV4dHJhICs9IDEwKSB7XG4gICAgICAgIGxldCBjdXJZID0gc3RhcnRZICsgKGRpc3QgKyBleHRyYSkgKiBkaXI7XG4gICAgICAgIGxldCBwb3MgPSBwb3NBdENvb3Jkcyh2aWV3LCB7IHg6IHJlc29sdmVkR29hbCwgeTogY3VyWSB9LCBmYWxzZSwgZGlyKTtcbiAgICAgICAgaWYgKGN1clkgPCByZWN0LnRvcCB8fCBjdXJZID4gcmVjdC5ib3R0b20gfHwgKGRpciA8IDAgPyBwb3MgPCBzdGFydFBvcyA6IHBvcyA+IHN0YXJ0UG9zKSkge1xuICAgICAgICAgICAgbGV0IGNoYXJSZWN0ID0gdmlldy5kb2NWaWV3LmNvb3Jkc0ZvckNoYXIocG9zKTtcbiAgICAgICAgICAgIGxldCBhc3NvYyA9ICFjaGFyUmVjdCB8fCBjdXJZIDwgY2hhclJlY3QudG9wID8gLTEgOiAxO1xuICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jdXJzb3IocG9zLCBhc3NvYywgdW5kZWZpbmVkLCBnb2FsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNraXBBdG9taWNSYW5nZXMoYXRvbXMsIHBvcywgYmlhcykge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgbGV0IG1vdmVkID0gMDtcbiAgICAgICAgZm9yIChsZXQgc2V0IG9mIGF0b21zKSB7XG4gICAgICAgICAgICBzZXQuYmV0d2Vlbihwb3MgLSAxLCBwb3MgKyAxLCAoZnJvbSwgdG8sIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyA+IGZyb20gJiYgcG9zIDwgdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpZGUgPSBtb3ZlZCB8fCBiaWFzIHx8IChwb3MgLSBmcm9tIDwgdG8gLSBwb3MgPyAtMSA6IDEpO1xuICAgICAgICAgICAgICAgICAgICBwb3MgPSBzaWRlIDwgMCA/IGZyb20gOiB0bztcbiAgICAgICAgICAgICAgICAgICAgbW92ZWQgPSBzaWRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW92ZWQpXG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNraXBBdG9tcyh2aWV3LCBvbGRQb3MsIHBvcykge1xuICAgIGxldCBuZXdQb3MgPSBza2lwQXRvbWljUmFuZ2VzKHZpZXcuc3RhdGUuZmFjZXQoYXRvbWljUmFuZ2VzKS5tYXAoZiA9PiBmKHZpZXcpKSwgcG9zLmZyb20sIG9sZFBvcy5oZWFkID4gcG9zLmZyb20gPyAtMSA6IDEpO1xuICAgIHJldHVybiBuZXdQb3MgPT0gcG9zLmZyb20gPyBwb3MgOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKG5ld1BvcywgbmV3UG9zIDwgcG9zLmZyb20gPyAxIDogLTEpO1xufVxuXG4vLyBUaGlzIHdpbGwgYWxzbyBiZSB3aGVyZSBkcmFnZ2luZyBpbmZvIGFuZCBzdWNoIGdvZXNcbmNsYXNzIElucHV0U3RhdGUge1xuICAgIHNldFNlbGVjdGlvbk9yaWdpbihvcmlnaW4pIHtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uT3JpZ2luID0gb3JpZ2luO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25UaW1lID0gRGF0ZS5ub3coKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmxhc3RLZXlDb2RlID0gMDtcbiAgICAgICAgdGhpcy5sYXN0S2V5VGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdFRvdWNoVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdEZvY3VzVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdFNjcm9sbFRvcCA9IDA7XG4gICAgICAgIHRoaXMubGFzdFNjcm9sbExlZnQgPSAwO1xuICAgICAgICAvLyBPbiBpT1MsIHNvbWUga2V5cyBuZWVkIHRvIGhhdmUgdGhlaXIgZGVmYXVsdCBiZWhhdmlvciBoYXBwZW5cbiAgICAgICAgLy8gKGFmdGVyIHdoaWNoIHdlIHJldHJvYWN0aXZlbHkgaGFuZGxlIHRoZW0gYW5kIHJlc2V0IHRoZSBET00pIHRvXG4gICAgICAgIC8vIGF2b2lkIG1lc3NpbmcgdXAgdGhlIHZpcnR1YWwga2V5Ym9hcmQgc3RhdGUuXG4gICAgICAgIHRoaXMucGVuZGluZ0lPU0tleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uT3JpZ2luID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdEVzY1ByZXNzID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q29udGV4dE1lbnUgPSAwO1xuICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXJzID0gW107XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyAtMSBtZWFucyBub3QgaW4gYSBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLCB0aGlzIGNvdW50cyB0aGUgbnVtYmVyXG4gICAgICAgIC8vIG9mIGNoYW5nZXMgbWFkZSBkdXJpbmcgdGhlIGNvbXBvc2l0aW9uLiBUaGUgY291bnQgaXMgdXNlZCB0b1xuICAgICAgICAvLyBhdm9pZCB0cmVhdGluZyB0aGUgc3RhcnQgc3RhdGUgb2YgdGhlIGNvbXBvc2l0aW9uLCBiZWZvcmUgYW55XG4gICAgICAgIC8vIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUsIGFzIHBhcnQgb2YgdGhlIGNvbXBvc2l0aW9uLlxuICAgICAgICB0aGlzLmNvbXBvc2luZyA9IC0xO1xuICAgICAgICAvLyBUcmFja3Mgd2hldGhlciB0aGUgbmV4dCBjaGFuZ2Ugc2hvdWxkIGJlIG1hcmtlZCBhcyBzdGFydGluZyB0aGVcbiAgICAgICAgLy8gY29tcG9zaXRpb24gKG51bGwgbWVhbnMgbm8gY29tcG9zaXRpb24sIHRydWUgbWVhbnMgbmV4dCBpcyB0aGVcbiAgICAgICAgLy8gZmlyc3QsIGZhbHNlIG1lYW5zIGZpcnN0IGhhcyBhbHJlYWR5IGJlZW4gbWFya2VkIGZvciB0aGlzXG4gICAgICAgIC8vIGNvbXBvc2l0aW9uKVxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uRmlyc3RDaGFuZ2UgPSBudWxsO1xuICAgICAgICAvLyBFbmQgdGltZSBvZiB0aGUgcHJldmlvdXMgY29tcG9zaXRpb25cbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbkVuZGVkQXQgPSAwO1xuICAgICAgICAvLyBVc2VkIGluIGEga2x1ZGdlIHRvIGRldGVjdCB3aGVuIGFuIEVudGVyIGtleXByZXNzIHNob3VsZCBiZVxuICAgICAgICAvLyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGNvbXBvc2l0aW9uIG9uIFNhZmFyaSwgd2hpY2ggZmlyZXMgZXZlbnRzXG4gICAgICAgIC8vIGluIHRoZSB3cm9uZyBvcmRlclxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0tleSA9IGZhbHNlO1xuICAgICAgICAvLyBVc2VkIHRvIGNhdGVnb3JpemUgY2hhbmdlcyBhcyBwYXJ0IG9mIGEgY29tcG9zaXRpb24sIGV2ZW4gd2hlblxuICAgICAgICAvLyB0aGUgbXV0YXRpb24gZXZlbnRzIGZpcmUgc2hvcnRseSBhZnRlciB0aGUgY29tcG9zaXRpb25lbmQgZXZlbnRcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgIC8vIFdoZW4gYSBkcmFnIGZyb20gdGhlIGVkaXRvciBpcyBhY3RpdmUsIHRoaXMgcG9pbnRzIGF0IHRoZSByYW5nZVxuICAgICAgICAvLyBiZWluZyBkcmFnZ2VkLlxuICAgICAgICB0aGlzLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYW5kbGVFdmVudCA9IHRoaXMuaGFuZGxlRXZlbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5ub3RpZmllZEZvY3VzZWQgPSB2aWV3Lmhhc0ZvY3VzO1xuICAgICAgICAvLyBPbiBTYWZhcmkgYWRkaW5nIGFuIGlucHV0IGV2ZW50IGhhbmRsZXIgc29tZWhvdyBwcmV2ZW50cyBhblxuICAgICAgICAvLyBpc3N1ZSB3aGVyZSB0aGUgY29tcG9zaXRpb24gdmFuaXNoZXMgd2hlbiB5b3UgcHJlc3MgZW50ZXIuXG4gICAgICAgIGlmIChicm93c2VyLnNhZmFyaSlcbiAgICAgICAgICAgIHZpZXcuY29udGVudERPTS5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgKCkgPT4gbnVsbCk7XG4gICAgICAgIGlmIChicm93c2VyLmdlY2tvKVxuICAgICAgICAgICAgZmlyZWZveENvcHlDdXRIYWNrKHZpZXcuY29udGVudERPTS5vd25lckRvY3VtZW50KTtcbiAgICB9XG4gICAgaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKCFldmVudEJlbG9uZ3NUb0VkaXRvcih0aGlzLnZpZXcsIGV2ZW50KSB8fCB0aGlzLmlnbm9yZUR1cmluZ0NvbXBvc2l0aW9uKGV2ZW50KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gXCJrZXlkb3duXCIgJiYgdGhpcy5rZXlkb3duKGV2ZW50KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5ydW5IYW5kbGVycyhldmVudC50eXBlLCBldmVudCk7XG4gICAgfVxuICAgIHJ1bkhhbmRsZXJzKHR5cGUsIGV2ZW50KSB7XG4gICAgICAgIGxldCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnNbdHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICAgICAgZm9yIChsZXQgb2JzZXJ2ZXIgb2YgaGFuZGxlcnMub2JzZXJ2ZXJzKVxuICAgICAgICAgICAgICAgIG9ic2VydmVyKHRoaXMudmlldywgZXZlbnQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaGFuZGxlciBvZiBoYW5kbGVycy5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcih0aGlzLnZpZXcsIGV2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW5zdXJlSGFuZGxlcnMocGx1Z2lucykge1xuICAgICAgICBsZXQgaGFuZGxlcnMgPSBjb21wdXRlSGFuZGxlcnMocGx1Z2lucyksIHByZXYgPSB0aGlzLmhhbmRsZXJzLCBkb20gPSB0aGlzLnZpZXcuY29udGVudERPTTtcbiAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBoYW5kbGVycylcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwic2Nyb2xsXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFzc2l2ZSA9ICFoYW5kbGVyc1t0eXBlXS5oYW5kbGVycy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IHByZXZbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0cyAmJiBwYXNzaXZlICE9ICFleGlzdHMuaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXMuaGFuZGxlRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cylcbiAgICAgICAgICAgICAgICAgICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgdGhpcy5oYW5kbGVFdmVudCwgeyBwYXNzaXZlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCB0eXBlIGluIHByZXYpXG4gICAgICAgICAgICBpZiAodHlwZSAhPSBcInNjcm9sbFwiICYmICFoYW5kbGVyc1t0eXBlXSlcbiAgICAgICAgICAgICAgICBkb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzLmhhbmRsZUV2ZW50KTtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IGhhbmRsZXJzO1xuICAgIH1cbiAgICBrZXlkb3duKGV2ZW50KSB7XG4gICAgICAgIC8vIE11c3QgYWx3YXlzIHJ1biwgZXZlbiBpZiBhIGN1c3RvbSBoYW5kbGVyIGhhbmRsZWQgdGhlIGV2ZW50XG4gICAgICAgIHRoaXMubGFzdEtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgICAgICB0aGlzLmxhc3RLZXlUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gOSAmJiBEYXRlLm5vdygpIDwgdGhpcy5sYXN0RXNjUHJlc3MgKyAyMDAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlICE9IDI3ICYmIG1vZGlmaWVyQ29kZXMuaW5kZXhPZihldmVudC5rZXlDb2RlKSA8IDApXG4gICAgICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5sYXN0RXNjUHJlc3MgPSAwO1xuICAgICAgICAvLyBDaHJvbWUgZm9yIEFuZHJvaWQgdXN1YWxseSBkb2Vzbid0IGZpcmUgcHJvcGVyIGtleSBldmVudHMsIGJ1dFxuICAgICAgICAvLyBvY2Nhc2lvbmFsbHkgZG9lcywgdXN1YWxseSBzdXJyb3VuZGVkIGJ5IGEgYnVuY2ggb2YgY29tcGxpY2F0ZWRcbiAgICAgICAgLy8gY29tcG9zaXRpb24gY2hhbmdlcy4gV2hlbiBhbiBlbnRlciBvciBiYWNrc3BhY2Uga2V5IGV2ZW50IGlzXG4gICAgICAgIC8vIHNlZW4sIGhvbGQgb2ZmIG9uIGhhbmRsaW5nIERPTSBldmVudHMgZm9yIGEgYml0LCBhbmQgdGhlblxuICAgICAgICAvLyBkaXNwYXRjaCBpdC5cbiAgICAgICAgaWYgKGJyb3dzZXIuYW5kcm9pZCAmJiBicm93c2VyLmNocm9tZSAmJiAhZXZlbnQuc3ludGhldGljICYmXG4gICAgICAgICAgICAoZXZlbnQua2V5Q29kZSA9PSAxMyB8fCBldmVudC5rZXlDb2RlID09IDgpKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuZGVsYXlBbmRyb2lkS2V5KGV2ZW50LmtleSwgZXZlbnQua2V5Q29kZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIEVudGVyIG9uIGlPUyBtYWtlcyB0aGVcbiAgICAgICAgLy8gdmlydHVhbCBrZXlib2FyZCBnZXQgc3R1Y2sgaW4gdGhlIHdyb25nIChsb3dlcmNhc2UpXG4gICAgICAgIC8vIHN0YXRlLiBTbyB3ZSBsZXQgaXQgZ28gdGhyb3VnaCwgYW5kIHRoZW4sIGluXG4gICAgICAgIC8vIGFwcGx5RE9NQ2hhbmdlLCBub3RpZnkga2V5IGhhbmRsZXJzIG9mIGl0IGFuZCByZXNldCB0b1xuICAgICAgICAvLyB0aGUgc3RhdGUgdGhleSBwcm9kdWNlLlxuICAgICAgICBsZXQgcGVuZGluZztcbiAgICAgICAgaWYgKGJyb3dzZXIuaW9zICYmICFldmVudC5zeW50aGV0aWMgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQubWV0YUtleSAmJlxuICAgICAgICAgICAgKChwZW5kaW5nID0gUGVuZGluZ0tleXMuZmluZChrZXkgPT4ga2V5LmtleUNvZGUgPT0gZXZlbnQua2V5Q29kZSkpICYmICFldmVudC5jdHJsS2V5IHx8XG4gICAgICAgICAgICAgICAgRW1hY3N5UGVuZGluZ0tleXMuaW5kZXhPZihldmVudC5rZXkpID4gLTEgJiYgZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkpKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdJT1NLZXkgPSBwZW5kaW5nIHx8IGV2ZW50O1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZsdXNoSU9TS2V5KCksIDI1MCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSAhPSAyMjkpXG4gICAgICAgICAgICB0aGlzLnZpZXcub2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZsdXNoSU9TS2V5KCkge1xuICAgICAgICBsZXQga2V5ID0gdGhpcy5wZW5kaW5nSU9TS2V5O1xuICAgICAgICBpZiAoIWtleSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5wZW5kaW5nSU9TS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2hLZXkodGhpcy52aWV3LmNvbnRlbnRET00sIGtleS5rZXksIGtleS5rZXlDb2RlKTtcbiAgICB9XG4gICAgaWdub3JlRHVyaW5nQ29tcG9zaXRpb24oZXZlbnQpIHtcbiAgICAgICAgaWYgKCEvXmtleS8udGVzdChldmVudC50eXBlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY29tcG9zaW5nID4gMClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cuc3R1bS5kZS8yMDE2LzA2LzI0L2hhbmRsaW5nLWltZS1ldmVudHMtaW4tamF2YXNjcmlwdC8uXG4gICAgICAgIC8vIE9uIHNvbWUgaW5wdXQgbWV0aG9kIGVkaXRvcnMgKElNRXMpLCB0aGUgRW50ZXIga2V5IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gY29uZmlybSBjaGFyYWN0ZXIgc2VsZWN0aW9uLiBPbiBTYWZhcmksIHdoZW4gRW50ZXIgaXMgcHJlc3NlZCxcbiAgICAgICAgLy8gY29tcG9zaXRpb25lbmQgYW5kIGtleWRvd24gZXZlbnRzIGFyZSBzb21ldGltZXMgZW1pdHRlZCBpbiB0aGVcbiAgICAgICAgLy8gd3Jvbmcgb3JkZXIuIFRoZSBrZXkgZXZlbnQgc2hvdWxkIHN0aWxsIGJlIGlnbm9yZWQsIGV2ZW4gd2hlblxuICAgICAgICAvLyBpdCBoYXBwZW5zIGFmdGVyIHRoZSBjb21wb3NpdGlvbmVuZCBldmVudC5cbiAgICAgICAgaWYgKGJyb3dzZXIuc2FmYXJpICYmICFicm93c2VyLmlvcyAmJiB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0tleSAmJiBEYXRlLm5vdygpIC0gdGhpcy5jb21wb3NpdGlvbkVuZGVkQXQgPCAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9zaXRpb25QZW5kaW5nS2V5ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN0YXJ0TW91c2VTZWxlY3Rpb24obW91c2VTZWxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHRoaXMubW91c2VTZWxlY3Rpb24pXG4gICAgICAgICAgICB0aGlzLm1vdXNlU2VsZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbiA9IG1vdXNlU2VsZWN0aW9uO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLm1vdXNlU2VsZWN0aW9uKVxuICAgICAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbi51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dlZENvbnRlbnQgJiYgdXBkYXRlLmRvY0NoYW5nZWQpXG4gICAgICAgICAgICB0aGlzLmRyYWdnZWRDb250ZW50ID0gdGhpcy5kcmFnZ2VkQ29udGVudC5tYXAodXBkYXRlLmNoYW5nZXMpO1xuICAgICAgICBpZiAodXBkYXRlLnRyYW5zYWN0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmxhc3RLZXlDb2RlID0gdGhpcy5sYXN0U2VsZWN0aW9uVGltZSA9IDA7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLm1vdXNlU2VsZWN0aW9uKVxuICAgICAgICAgICAgdGhpcy5tb3VzZVNlbGVjdGlvbi5kZXN0cm95KCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYmluZEhhbmRsZXIocGx1Z2luLCBoYW5kbGVyKSB7XG4gICAgcmV0dXJuICh2aWV3LCBldmVudCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIuY2FsbChwbHVnaW4sIGV2ZW50LCB2aWV3KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHZpZXcuc3RhdGUsIGUpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVIYW5kbGVycyhwbHVnaW5zKSB7XG4gICAgbGV0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZnVuY3Rpb24gcmVjb3JkKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdFt0eXBlXSB8fCAocmVzdWx0W3R5cGVdID0geyBvYnNlcnZlcnM6IFtdLCBoYW5kbGVyczogW10gfSk7XG4gICAgfVxuICAgIGZvciAobGV0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgIGxldCBzcGVjID0gcGx1Z2luLnNwZWM7XG4gICAgICAgIGlmIChzcGVjICYmIHNwZWMuZG9tRXZlbnRIYW5kbGVycylcbiAgICAgICAgICAgIGZvciAobGV0IHR5cGUgaW4gc3BlYy5kb21FdmVudEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGYgPSBzcGVjLmRvbUV2ZW50SGFuZGxlcnNbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICAgICAgICAgIHJlY29yZCh0eXBlKS5oYW5kbGVycy5wdXNoKGJpbmRIYW5kbGVyKHBsdWdpbi52YWx1ZSwgZikpO1xuICAgICAgICAgICAgfVxuICAgICAgICBpZiAoc3BlYyAmJiBzcGVjLmRvbUV2ZW50T2JzZXJ2ZXJzKVxuICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBzcGVjLmRvbUV2ZW50T2JzZXJ2ZXJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGYgPSBzcGVjLmRvbUV2ZW50T2JzZXJ2ZXJzW3R5cGVdO1xuICAgICAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgICAgICByZWNvcmQodHlwZSkub2JzZXJ2ZXJzLnB1c2goYmluZEhhbmRsZXIocGx1Z2luLnZhbHVlLCBmKSk7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IHR5cGUgaW4gaGFuZGxlcnMpXG4gICAgICAgIHJlY29yZCh0eXBlKS5oYW5kbGVycy5wdXNoKGhhbmRsZXJzW3R5cGVdKTtcbiAgICBmb3IgKGxldCB0eXBlIGluIG9ic2VydmVycylcbiAgICAgICAgcmVjb3JkKHR5cGUpLm9ic2VydmVycy5wdXNoKG9ic2VydmVyc1t0eXBlXSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IFBlbmRpbmdLZXlzID0gW1xuICAgIHsga2V5OiBcIkJhY2tzcGFjZVwiLCBrZXlDb2RlOiA4LCBpbnB1dFR5cGU6IFwiZGVsZXRlQ29udGVudEJhY2t3YXJkXCIgfSxcbiAgICB7IGtleTogXCJFbnRlclwiLCBrZXlDb2RlOiAxMywgaW5wdXRUeXBlOiBcImluc2VydFBhcmFncmFwaFwiIH0sXG4gICAgeyBrZXk6IFwiRW50ZXJcIiwga2V5Q29kZTogMTMsIGlucHV0VHlwZTogXCJpbnNlcnRMaW5lQnJlYWtcIiB9LFxuICAgIHsga2V5OiBcIkRlbGV0ZVwiLCBrZXlDb2RlOiA0NiwgaW5wdXRUeXBlOiBcImRlbGV0ZUNvbnRlbnRGb3J3YXJkXCIgfVxuXTtcbmNvbnN0IEVtYWNzeVBlbmRpbmdLZXlzID0gXCJkdGhrb1wiO1xuLy8gS2V5IGNvZGVzIGZvciBtb2RpZmllciBrZXlzXG5jb25zdCBtb2RpZmllckNvZGVzID0gWzE2LCAxNywgMTgsIDIwLCA5MSwgOTIsIDIyNCwgMjI1XTtcbmNvbnN0IGRyYWdTY3JvbGxNYXJnaW4gPSA2O1xuZnVuY3Rpb24gZHJhZ1Njcm9sbFNwZWVkKGRpc3QpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgZGlzdCkgKiAwLjcgKyA4O1xufVxuZnVuY3Rpb24gZGlzdChhLCBiKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKGEuY2xpZW50WCAtIGIuY2xpZW50WCksIE1hdGguYWJzKGEuY2xpZW50WSAtIGIuY2xpZW50WSkpO1xufVxuY2xhc3MgTW91c2VTZWxlY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIHN0YXJ0RXZlbnQsIHN0eWxlLCBtdXN0U2VsZWN0KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc3RhcnRFdmVudCA9IHN0YXJ0RXZlbnQ7XG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICAgICAgdGhpcy5tdXN0U2VsZWN0ID0gbXVzdFNlbGVjdDtcbiAgICAgICAgdGhpcy5zY3JvbGxTcGVlZCA9IHsgeDogMCwgeTogMCB9O1xuICAgICAgICB0aGlzLnNjcm9sbGluZyA9IC0xO1xuICAgICAgICB0aGlzLmxhc3RFdmVudCA9IHN0YXJ0RXZlbnQ7XG4gICAgICAgIHRoaXMuc2Nyb2xsUGFyZW50ID0gc2Nyb2xsYWJsZVBhcmVudCh2aWV3LmNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLmF0b21zID0gdmlldy5zdGF0ZS5mYWNldChhdG9taWNSYW5nZXMpLm1hcChmID0+IGYodmlldykpO1xuICAgICAgICBsZXQgZG9jID0gdmlldy5jb250ZW50RE9NLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW92ZSA9IHRoaXMubW92ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMudXAgPSB0aGlzLnVwLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmV4dGVuZCA9IHN0YXJ0RXZlbnQuc2hpZnRLZXk7XG4gICAgICAgIHRoaXMubXVsdGlwbGUgPSB2aWV3LnN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLmFsbG93TXVsdGlwbGVTZWxlY3Rpb25zKSAmJiBhZGRzU2VsZWN0aW9uUmFuZ2Uodmlldywgc3RhcnRFdmVudCk7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBpc0luUHJpbWFyeVNlbGVjdGlvbih2aWV3LCBzdGFydEV2ZW50KSAmJiBnZXRDbGlja1R5cGUoc3RhcnRFdmVudCkgPT0gMSA/IG51bGwgOiBmYWxzZTtcbiAgICB9XG4gICAgc3RhcnQoZXZlbnQpIHtcbiAgICAgICAgLy8gV2hlbiBjbGlja2luZyBvdXRzaWRlIG9mIHRoZSBzZWxlY3Rpb24sIGltbWVkaWF0ZWx5IGFwcGx5IHRoZVxuICAgICAgICAvLyBlZmZlY3Qgb2Ygc3RhcnRpbmcgdGhlIHNlbGVjdGlvblxuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyA9PT0gZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdChldmVudCk7XG4gICAgfVxuICAgIG1vdmUoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoZXZlbnQuYnV0dG9ucyA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyB8fCB0aGlzLmRyYWdnaW5nID09IG51bGwgJiYgZGlzdCh0aGlzLnN0YXJ0RXZlbnQsIGV2ZW50KSA8IDEwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCA9IGV2ZW50KTtcbiAgICAgICAgbGV0IHN4ID0gMCwgc3kgPSAwO1xuICAgICAgICBsZXQgcmVjdCA9ICgoX2EgPSB0aGlzLnNjcm9sbFBhcmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKVxuICAgICAgICAgICAgfHwgeyBsZWZ0OiAwLCB0b3A6IDAsIHJpZ2h0OiB0aGlzLnZpZXcud2luLmlubmVyV2lkdGgsIGJvdHRvbTogdGhpcy52aWV3Lndpbi5pbm5lckhlaWdodCB9O1xuICAgICAgICBsZXQgbWFyZ2lucyA9IGdldFNjcm9sbE1hcmdpbnModGhpcy52aWV3KTtcbiAgICAgICAgaWYgKGV2ZW50LmNsaWVudFggLSBtYXJnaW5zLmxlZnQgPD0gcmVjdC5sZWZ0ICsgZHJhZ1Njcm9sbE1hcmdpbilcbiAgICAgICAgICAgIHN4ID0gLWRyYWdTY3JvbGxTcGVlZChyZWN0LmxlZnQgLSBldmVudC5jbGllbnRYKTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQuY2xpZW50WCArIG1hcmdpbnMucmlnaHQgPj0gcmVjdC5yaWdodCAtIGRyYWdTY3JvbGxNYXJnaW4pXG4gICAgICAgICAgICBzeCA9IGRyYWdTY3JvbGxTcGVlZChldmVudC5jbGllbnRYIC0gcmVjdC5yaWdodCk7XG4gICAgICAgIGlmIChldmVudC5jbGllbnRZIC0gbWFyZ2lucy50b3AgPD0gcmVjdC50b3AgKyBkcmFnU2Nyb2xsTWFyZ2luKVxuICAgICAgICAgICAgc3kgPSAtZHJhZ1Njcm9sbFNwZWVkKHJlY3QudG9wIC0gZXZlbnQuY2xpZW50WSk7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmNsaWVudFkgKyBtYXJnaW5zLmJvdHRvbSA+PSByZWN0LmJvdHRvbSAtIGRyYWdTY3JvbGxNYXJnaW4pXG4gICAgICAgICAgICBzeSA9IGRyYWdTY3JvbGxTcGVlZChldmVudC5jbGllbnRZIC0gcmVjdC5ib3R0b20pO1xuICAgICAgICB0aGlzLnNldFNjcm9sbFNwZWVkKHN4LCBzeSk7XG4gICAgfVxuICAgIHVwKGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdnaW5nID09IG51bGwpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCk7XG4gICAgICAgIGlmICghdGhpcy5kcmFnZ2luZylcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnNldFNjcm9sbFNwZWVkKDAsIDApO1xuICAgICAgICBsZXQgZG9jID0gdGhpcy52aWV3LmNvbnRlbnRET00ub3duZXJEb2N1bWVudDtcbiAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3ZlKTtcbiAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMudXApO1xuICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5tb3VzZVNlbGVjdGlvbiA9IHRoaXMudmlldy5pbnB1dFN0YXRlLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbiAgICB9XG4gICAgc2V0U2Nyb2xsU3BlZWQoc3gsIHN5KSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsU3BlZWQgPSB7IHg6IHN4LCB5OiBzeSB9O1xuICAgICAgICBpZiAoc3ggfHwgc3kpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbGluZyA8IDApXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxpbmcgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnNjcm9sbCgpLCA1MCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zY3JvbGxpbmcgPiAtMSkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnNjcm9sbGluZyk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbGluZyA9IC0xO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNjcm9sbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0ICs9IHRoaXMuc2Nyb2xsU3BlZWQueDtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCArPSB0aGlzLnNjcm9sbFNwZWVkLnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcud2luLnNjcm9sbEJ5KHRoaXMuc2Nyb2xsU3BlZWQueCwgdGhpcy5zY3JvbGxTcGVlZC55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kcmFnZ2luZyA9PT0gZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLmxhc3RFdmVudCk7XG4gICAgfVxuICAgIHNraXBBdG9tcyhzZWwpIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gc2VsLnJhbmdlc1tpXSwgdXBkYXRlZCA9IG51bGw7XG4gICAgICAgICAgICBpZiAocmFuZ2UuZW1wdHkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcG9zID0gc2tpcEF0b21pY1Jhbmdlcyh0aGlzLmF0b21zLCByYW5nZS5mcm9tLCAwKTtcbiAgICAgICAgICAgICAgICBpZiAocG9zICE9IHJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHBvcywgLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBza2lwQXRvbWljUmFuZ2VzKHRoaXMuYXRvbXMsIHJhbmdlLmZyb20sIC0xKTtcbiAgICAgICAgICAgICAgICBsZXQgdG8gPSBza2lwQXRvbWljUmFuZ2VzKHRoaXMuYXRvbXMsIHJhbmdlLnRvLCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSAhPSByYW5nZS5mcm9tIHx8IHRvICE9IHJhbmdlLnRvKVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHJhbmdlLmZyb20gPT0gcmFuZ2UuYW5jaG9yID8gZnJvbSA6IHRvLCByYW5nZS5mcm9tID09IHJhbmdlLmhlYWQgPyBmcm9tIDogdG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJhbmdlcylcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2VzID0gc2VsLnJhbmdlcy5zbGljZSgpO1xuICAgICAgICAgICAgICAgIHJhbmdlc1tpXSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJhbmdlcyA/IEVkaXRvclNlbGVjdGlvbi5jcmVhdGUocmFuZ2VzLCBzZWwubWFpbkluZGV4KSA6IHNlbDtcbiAgICB9XG4gICAgc2VsZWN0KGV2ZW50KSB7XG4gICAgICAgIGxldCB7IHZpZXcgfSA9IHRoaXMsIHNlbGVjdGlvbiA9IHRoaXMuc2tpcEF0b21zKHRoaXMuc3R5bGUuZ2V0KGV2ZW50LCB0aGlzLmV4dGVuZCwgdGhpcy5tdWx0aXBsZSkpO1xuICAgICAgICBpZiAodGhpcy5tdXN0U2VsZWN0IHx8ICFzZWxlY3Rpb24uZXEodmlldy5zdGF0ZS5zZWxlY3Rpb24sIHRoaXMuZHJhZ2dpbmcgPT09IGZhbHNlKSlcbiAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIHVzZXJFdmVudDogXCJzZWxlY3QucG9pbnRlclwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tdXN0U2VsZWN0ID0gZmFsc2U7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUudXBkYXRlKHVwZGF0ZSkpXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VsZWN0KHRoaXMubGFzdEV2ZW50KSwgMjApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZHNTZWxlY3Rpb25SYW5nZSh2aWV3LCBldmVudCkge1xuICAgIGxldCBmYWNldCA9IHZpZXcuc3RhdGUuZmFjZXQoY2xpY2tBZGRzU2VsZWN0aW9uUmFuZ2UpO1xuICAgIHJldHVybiBmYWNldC5sZW5ndGggPyBmYWNldFswXShldmVudCkgOiBicm93c2VyLm1hYyA/IGV2ZW50Lm1ldGFLZXkgOiBldmVudC5jdHJsS2V5O1xufVxuZnVuY3Rpb24gZHJhZ01vdmVzU2VsZWN0aW9uKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IGZhY2V0ID0gdmlldy5zdGF0ZS5mYWNldChkcmFnTW92ZXNTZWxlY3Rpb24kMSk7XG4gICAgcmV0dXJuIGZhY2V0Lmxlbmd0aCA/IGZhY2V0WzBdKGV2ZW50KSA6IGJyb3dzZXIubWFjID8gIWV2ZW50LmFsdEtleSA6ICFldmVudC5jdHJsS2V5O1xufVxuZnVuY3Rpb24gaXNJblByaW1hcnlTZWxlY3Rpb24odmlldywgZXZlbnQpIHtcbiAgICBsZXQgeyBtYWluIH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAobWFpbi5lbXB0eSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIE9uIGJvdW5kYXJ5IGNsaWNrcywgY2hlY2sgd2hldGhlciB0aGUgY29vcmRpbmF0ZXMgYXJlIGluc2lkZSB0aGVcbiAgICAvLyBzZWxlY3Rpb24ncyBjbGllbnQgcmVjdGFuZ2xlc1xuICAgIGxldCBzZWwgPSBnZXRTZWxlY3Rpb24odmlldy5yb290KTtcbiAgICBpZiAoIXNlbCB8fCBzZWwucmFuZ2VDb3VudCA9PSAwKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgcmVjdHMgPSBzZWwuZ2V0UmFuZ2VBdCgwKS5nZXRDbGllbnRSZWN0cygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tpXTtcbiAgICAgICAgaWYgKHJlY3QubGVmdCA8PSBldmVudC5jbGllbnRYICYmIHJlY3QucmlnaHQgPj0gZXZlbnQuY2xpZW50WCAmJlxuICAgICAgICAgICAgcmVjdC50b3AgPD0gZXZlbnQuY2xpZW50WSAmJiByZWN0LmJvdHRvbSA+PSBldmVudC5jbGllbnRZKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGV2ZW50QmVsb25nc1RvRWRpdG9yKHZpZXcsIGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5idWJibGVzKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IG5vZGUgPSBldmVudC50YXJnZXQsIGNWaWV3OyBub2RlICE9IHZpZXcuY29udGVudERPTTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgPT0gMTEgfHwgKChjVmlldyA9IENvbnRlbnRWaWV3LmdldChub2RlKSkgJiYgY1ZpZXcuaWdub3JlRXZlbnQoZXZlbnQpKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IGhhbmRsZXJzID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5jb25zdCBvYnNlcnZlcnMgPSAvKkBfX1BVUkVfXyovT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8vIFRoaXMgaXMgdmVyeSBjcnVkZSwgYnV0IHVuZm9ydHVuYXRlbHkgYm90aCB0aGVzZSBicm93c2VycyBfcHJldGVuZF9cbi8vIHRoYXQgdGhleSBoYXZlIGEgY2xpcGJvYXJkIEFQSVx1MjAxNGFsbCB0aGUgb2JqZWN0cyBhbmQgbWV0aG9kcyBhcmVcbi8vIHRoZXJlLCB0aGV5IGp1c3QgZG9uJ3Qgd29yaywgYW5kIHRoZXkgYXJlIGhhcmQgdG8gdGVzdC5cbmNvbnN0IGJyb2tlbkNsaXBib2FyZEFQSSA9IChicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8IDE1KSB8fFxuICAgIChicm93c2VyLmlvcyAmJiBicm93c2VyLndlYmtpdF92ZXJzaW9uIDwgNjA0KTtcbmZ1bmN0aW9uIGNhcHR1cmVQYXN0ZSh2aWV3KSB7XG4gICAgbGV0IHBhcmVudCA9IHZpZXcuZG9tLnBhcmVudE5vZGU7XG4gICAgaWYgKCFwYXJlbnQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgdGFyZ2V0ID0gcGFyZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSk7XG4gICAgdGFyZ2V0LnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIHRhcmdldC5mb2N1cygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2aWV3LmZvY3VzKCk7XG4gICAgICAgIHRhcmdldC5yZW1vdmUoKTtcbiAgICAgICAgZG9QYXN0ZSh2aWV3LCB0YXJnZXQudmFsdWUpO1xuICAgIH0sIDUwKTtcbn1cbmZ1bmN0aW9uIGRvUGFzdGUodmlldywgaW5wdXQpIHtcbiAgICBsZXQgeyBzdGF0ZSB9ID0gdmlldywgY2hhbmdlcywgaSA9IDEsIHRleHQgPSBzdGF0ZS50b1RleHQoaW5wdXQpO1xuICAgIGxldCBieUxpbmUgPSB0ZXh0LmxpbmVzID09IHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoO1xuICAgIGxldCBsaW5ld2lzZSA9IGxhc3RMaW5ld2lzZUNvcHkgIT0gbnVsbCAmJiBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLmV2ZXJ5KHIgPT4gci5lbXB0eSkgJiYgbGFzdExpbmV3aXNlQ29weSA9PSB0ZXh0LnRvU3RyaW5nKCk7XG4gICAgaWYgKGxpbmV3aXNlKSB7XG4gICAgICAgIGxldCBsYXN0TGluZSA9IC0xO1xuICAgICAgICBjaGFuZ2VzID0gc3RhdGUuY2hhbmdlQnlSYW5nZShyYW5nZSA9PiB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQocmFuZ2UuZnJvbSk7XG4gICAgICAgICAgICBpZiAobGluZS5mcm9tID09IGxhc3RMaW5lKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHJhbmdlIH07XG4gICAgICAgICAgICBsYXN0TGluZSA9IGxpbmUuZnJvbTtcbiAgICAgICAgICAgIGxldCBpbnNlcnQgPSBzdGF0ZS50b1RleHQoKGJ5TGluZSA/IHRleHQubGluZShpKyspLnRleHQgOiBpbnB1dCkgKyBzdGF0ZS5saW5lQnJlYWspO1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhbmdlczogeyBmcm9tOiBsaW5lLmZyb20sIGluc2VydCB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHJhbmdlLmZyb20gKyBpbnNlcnQubGVuZ3RoKSB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnlMaW5lKSB7XG4gICAgICAgIGNoYW5nZXMgPSBzdGF0ZS5jaGFuZ2VCeVJhbmdlKHJhbmdlID0+IHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gdGV4dC5saW5lKGkrKyk7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFuZ2VzOiB7IGZyb206IHJhbmdlLmZyb20sIHRvOiByYW5nZS50bywgaW5zZXJ0OiBsaW5lLnRleHQgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyYW5nZS5mcm9tICsgbGluZS5sZW5ndGgpIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hhbmdlcyA9IHN0YXRlLnJlcGxhY2VTZWxlY3Rpb24odGV4dCk7XG4gICAgfVxuICAgIHZpZXcuZGlzcGF0Y2goY2hhbmdlcywge1xuICAgICAgICB1c2VyRXZlbnQ6IFwiaW5wdXQucGFzdGVcIixcbiAgICAgICAgc2Nyb2xsSW50b1ZpZXc6IHRydWVcbiAgICB9KTtcbn1cbm9ic2VydmVycy5zY3JvbGwgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbFRvcCA9IHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcDtcbiAgICB2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbExlZnQgPSB2aWV3LnNjcm9sbERPTS5zY3JvbGxMZWZ0O1xufTtcbmhhbmRsZXJzLmtleWRvd24gPSAodmlldywgZXZlbnQpID0+IHtcbiAgICB2aWV3LmlucHV0U3RhdGUuc2V0U2VsZWN0aW9uT3JpZ2luKFwic2VsZWN0XCIpO1xuICAgIGlmIChldmVudC5rZXlDb2RlID09IDI3KVxuICAgICAgICB2aWV3LmlucHV0U3RhdGUubGFzdEVzY1ByZXNzID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xub2JzZXJ2ZXJzLnRvdWNoc3RhcnQgPSAodmlldywgZSkgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0VG91Y2hUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB2aWV3LmlucHV0U3RhdGUuc2V0U2VsZWN0aW9uT3JpZ2luKFwic2VsZWN0LnBvaW50ZXJcIik7XG59O1xub2JzZXJ2ZXJzLnRvdWNobW92ZSA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5zZXRTZWxlY3Rpb25PcmlnaW4oXCJzZWxlY3QucG9pbnRlclwiKTtcbn07XG5oYW5kbGVycy5tb3VzZWRvd24gPSAodmlldywgZXZlbnQpID0+IHtcbiAgICB2aWV3Lm9ic2VydmVyLmZsdXNoKCk7XG4gICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5sYXN0VG91Y2hUaW1lID4gRGF0ZS5ub3coKSAtIDIwMDApXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gSWdub3JlIHRvdWNoIGludGVyYWN0aW9uXG4gICAgbGV0IHN0eWxlID0gbnVsbDtcbiAgICBmb3IgKGxldCBtYWtlU3R5bGUgb2Ygdmlldy5zdGF0ZS5mYWNldChtb3VzZVNlbGVjdGlvblN0eWxlKSkge1xuICAgICAgICBzdHlsZSA9IG1ha2VTdHlsZSh2aWV3LCBldmVudCk7XG4gICAgICAgIGlmIChzdHlsZSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoIXN0eWxlICYmIGV2ZW50LmJ1dHRvbiA9PSAwKVxuICAgICAgICBzdHlsZSA9IGJhc2ljTW91c2VTZWxlY3Rpb24odmlldywgZXZlbnQpO1xuICAgIGlmIChzdHlsZSkge1xuICAgICAgICBsZXQgbXVzdEZvY3VzID0gIXZpZXcuaGFzRm9jdXM7XG4gICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5zdGFydE1vdXNlU2VsZWN0aW9uKG5ldyBNb3VzZVNlbGVjdGlvbih2aWV3LCBldmVudCwgc3R5bGUsIG11c3RGb2N1cykpO1xuICAgICAgICBpZiAobXVzdEZvY3VzKVxuICAgICAgICAgICAgdmlldy5vYnNlcnZlci5pZ25vcmUoKCkgPT4gZm9jdXNQcmV2ZW50U2Nyb2xsKHZpZXcuY29udGVudERPTSkpO1xuICAgICAgICBsZXQgbW91c2VTZWwgPSB2aWV3LmlucHV0U3RhdGUubW91c2VTZWxlY3Rpb247XG4gICAgICAgIGlmIChtb3VzZVNlbCkge1xuICAgICAgICAgICAgbW91c2VTZWwuc3RhcnQoZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuIG1vdXNlU2VsLmRyYWdnaW5nID09PSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZnVuY3Rpb24gcmFuZ2VGb3JDbGljayh2aWV3LCBwb3MsIGJpYXMsIHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PSAxKSB7IC8vIFNpbmdsZSBjbGlja1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MsIGJpYXMpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09IDIpIHsgLy8gRG91YmxlIGNsaWNrXG4gICAgICAgIHJldHVybiBncm91cEF0KHZpZXcuc3RhdGUsIHBvcywgYmlhcyk7XG4gICAgfVxuICAgIGVsc2UgeyAvLyBUcmlwbGUgY2xpY2tcbiAgICAgICAgbGV0IHZpc3VhbCA9IExpbmVWaWV3LmZpbmQodmlldy5kb2NWaWV3LCBwb3MpLCBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHZpc3VhbCA/IHZpc3VhbC5wb3NBdEVuZCA6IHBvcyk7XG4gICAgICAgIGxldCBmcm9tID0gdmlzdWFsID8gdmlzdWFsLnBvc0F0U3RhcnQgOiBsaW5lLmZyb20sIHRvID0gdmlzdWFsID8gdmlzdWFsLnBvc0F0RW5kIDogbGluZS50bztcbiAgICAgICAgaWYgKHRvIDwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoICYmIHRvID09IGxpbmUudG8pXG4gICAgICAgICAgICB0bysrO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGZyb20sIHRvKTtcbiAgICB9XG59XG5sZXQgaW5zaWRlWSA9ICh5LCByZWN0KSA9PiB5ID49IHJlY3QudG9wICYmIHkgPD0gcmVjdC5ib3R0b207XG5sZXQgaW5zaWRlID0gKHgsIHksIHJlY3QpID0+IGluc2lkZVkoeSwgcmVjdCkgJiYgeCA+PSByZWN0LmxlZnQgJiYgeCA8PSByZWN0LnJpZ2h0O1xuLy8gVHJ5IHRvIGRldGVybWluZSwgZm9yIHRoZSBnaXZlbiBjb29yZGluYXRlcywgYXNzb2NpYXRlZCB3aXRoIHRoZVxuLy8gZ2l2ZW4gcG9zaXRpb24sIHdoZXRoZXIgdGhleSBhcmUgcmVsYXRlZCB0byB0aGUgZWxlbWVudCBiZWZvcmUgb3Jcbi8vIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBwb3NpdGlvbi5cbmZ1bmN0aW9uIGZpbmRQb3NpdGlvblNpZGUodmlldywgcG9zLCB4LCB5KSB7XG4gICAgbGV0IGxpbmUgPSBMaW5lVmlldy5maW5kKHZpZXcuZG9jVmlldywgcG9zKTtcbiAgICBpZiAoIWxpbmUpXG4gICAgICAgIHJldHVybiAxO1xuICAgIGxldCBvZmYgPSBwb3MgLSBsaW5lLnBvc0F0U3RhcnQ7XG4gICAgLy8gTGluZSBib3VuZGFyaWVzIHBvaW50IGludG8gdGhlIGxpbmVcbiAgICBpZiAob2ZmID09IDApXG4gICAgICAgIHJldHVybiAxO1xuICAgIGlmIChvZmYgPT0gbGluZS5sZW5ndGgpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAvLyBQb3NpdGlvbnMgb24gdG9wIG9mIGFuIGVsZW1lbnQgcG9pbnQgYXQgdGhhdCBlbGVtZW50XG4gICAgbGV0IGJlZm9yZSA9IGxpbmUuY29vcmRzQXQob2ZmLCAtMSk7XG4gICAgaWYgKGJlZm9yZSAmJiBpbnNpZGUoeCwgeSwgYmVmb3JlKSlcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIGxldCBhZnRlciA9IGxpbmUuY29vcmRzQXQob2ZmLCAxKTtcbiAgICBpZiAoYWZ0ZXIgJiYgaW5zaWRlKHgsIHksIGFmdGVyKSlcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgLy8gVGhpcyBpcyBwcm9iYWJseSBhIGxpbmUgd3JhcCBwb2ludC4gUGljayBiZWZvcmUgaWYgdGhlIHBvaW50IGlzXG4gICAgLy8gYmVzaWRlIGl0LlxuICAgIHJldHVybiBiZWZvcmUgJiYgaW5zaWRlWSh5LCBiZWZvcmUpID8gLTEgOiAxO1xufVxuZnVuY3Rpb24gcXVlcnlQb3ModmlldywgZXZlbnQpIHtcbiAgICBsZXQgcG9zID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSwgZmFsc2UpO1xuICAgIHJldHVybiB7IHBvcywgYmlhczogZmluZFBvc2l0aW9uU2lkZSh2aWV3LCBwb3MsIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpIH07XG59XG5jb25zdCBCYWRNb3VzZURldGFpbCA9IGJyb3dzZXIuaWUgJiYgYnJvd3Nlci5pZV92ZXJzaW9uIDw9IDExO1xubGV0IGxhc3RNb3VzZURvd24gPSBudWxsLCBsYXN0TW91c2VEb3duQ291bnQgPSAwLCBsYXN0TW91c2VEb3duVGltZSA9IDA7XG5mdW5jdGlvbiBnZXRDbGlja1R5cGUoZXZlbnQpIHtcbiAgICBpZiAoIUJhZE1vdXNlRGV0YWlsKVxuICAgICAgICByZXR1cm4gZXZlbnQuZGV0YWlsO1xuICAgIGxldCBsYXN0ID0gbGFzdE1vdXNlRG93biwgbGFzdFRpbWUgPSBsYXN0TW91c2VEb3duVGltZTtcbiAgICBsYXN0TW91c2VEb3duID0gZXZlbnQ7XG4gICAgbGFzdE1vdXNlRG93blRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiBsYXN0TW91c2VEb3duQ291bnQgPSAhbGFzdCB8fCAobGFzdFRpbWUgPiBEYXRlLm5vdygpIC0gNDAwICYmIE1hdGguYWJzKGxhc3QuY2xpZW50WCAtIGV2ZW50LmNsaWVudFgpIDwgMiAmJlxuICAgICAgICBNYXRoLmFicyhsYXN0LmNsaWVudFkgLSBldmVudC5jbGllbnRZKSA8IDIpID8gKGxhc3RNb3VzZURvd25Db3VudCArIDEpICUgMyA6IDE7XG59XG5mdW5jdGlvbiBiYXNpY01vdXNlU2VsZWN0aW9uKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHN0YXJ0ID0gcXVlcnlQb3ModmlldywgZXZlbnQpLCB0eXBlID0gZ2V0Q2xpY2tUeXBlKGV2ZW50KTtcbiAgICBsZXQgc3RhcnRTZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICByZXR1cm4ge1xuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBzdGFydC5wb3MgPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3Moc3RhcnQucG9zKTtcbiAgICAgICAgICAgICAgICBzdGFydFNlbCA9IHN0YXJ0U2VsLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldChldmVudCwgZXh0ZW5kLCBtdWx0aXBsZSkge1xuICAgICAgICAgICAgbGV0IGN1ciA9IHF1ZXJ5UG9zKHZpZXcsIGV2ZW50KSwgcmVtb3ZlZDtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHJhbmdlRm9yQ2xpY2sodmlldywgY3VyLnBvcywgY3VyLmJpYXMsIHR5cGUpO1xuICAgICAgICAgICAgaWYgKHN0YXJ0LnBvcyAhPSBjdXIucG9zICYmICFleHRlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRSYW5nZSA9IHJhbmdlRm9yQ2xpY2sodmlldywgc3RhcnQucG9zLCBzdGFydC5iaWFzLCB0eXBlKTtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWluKHN0YXJ0UmFuZ2UuZnJvbSwgcmFuZ2UuZnJvbSksIHRvID0gTWF0aC5tYXgoc3RhcnRSYW5nZS50bywgcmFuZ2UudG8pO1xuICAgICAgICAgICAgICAgIHJhbmdlID0gZnJvbSA8IHJhbmdlLmZyb20gPyBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoZnJvbSwgdG8pIDogRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHRvLCBmcm9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHRlbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0U2VsLnJlcGxhY2VSYW5nZShzdGFydFNlbC5tYWluLmV4dGVuZChyYW5nZS5mcm9tLCByYW5nZS50bykpO1xuICAgICAgICAgICAgZWxzZSBpZiAobXVsdGlwbGUgJiYgdHlwZSA9PSAxICYmIHN0YXJ0U2VsLnJhbmdlcy5sZW5ndGggPiAxICYmIChyZW1vdmVkID0gcmVtb3ZlUmFuZ2VBcm91bmQoc3RhcnRTZWwsIGN1ci5wb3MpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlZDtcbiAgICAgICAgICAgIGVsc2UgaWYgKG11bHRpcGxlKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUoW3JhbmdlXSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gcmVtb3ZlUmFuZ2VBcm91bmQoc2VsLCBwb3MpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHNlbC5yYW5nZXNbaV07XG4gICAgICAgIGlmIChmcm9tIDw9IHBvcyAmJiB0byA+PSBwb3MpXG4gICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShzZWwucmFuZ2VzLnNsaWNlKDAsIGkpLmNvbmNhdChzZWwucmFuZ2VzLnNsaWNlKGkgKyAxKSksIHNlbC5tYWluSW5kZXggPT0gaSA/IDAgOiBzZWwubWFpbkluZGV4IC0gKHNlbC5tYWluSW5kZXggPiBpID8gMSA6IDApKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5oYW5kbGVycy5kcmFnc3RhcnQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBsZXQgeyBzZWxlY3Rpb246IHsgbWFpbjogcmFuZ2UgfSB9ID0gdmlldy5zdGF0ZTtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmRyYWdnYWJsZSkge1xuICAgICAgICBsZXQgY1ZpZXcgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdChldmVudC50YXJnZXQpO1xuICAgICAgICBpZiAoY1ZpZXcgJiYgY1ZpZXcuaXNXaWRnZXQpIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gY1ZpZXcucG9zQXRTdGFydCwgdG8gPSBmcm9tICsgY1ZpZXcubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGZyb20gPj0gcmFuZ2UudG8gfHwgdG8gPD0gcmFuZ2UuZnJvbSlcbiAgICAgICAgICAgICAgICByYW5nZSA9IEVkaXRvclNlbGVjdGlvbi5yYW5nZShmcm9tLCB0byk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHsgaW5wdXRTdGF0ZSB9ID0gdmlldztcbiAgICBpZiAoaW5wdXRTdGF0ZS5tb3VzZVNlbGVjdGlvbilcbiAgICAgICAgaW5wdXRTdGF0ZS5tb3VzZVNlbGVjdGlvbi5kcmFnZ2luZyA9IHRydWU7XG4gICAgaW5wdXRTdGF0ZS5kcmFnZ2VkQ29udGVudCA9IHJhbmdlO1xuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJUZXh0XCIsIHZpZXcuc3RhdGUuc2xpY2VEb2MocmFuZ2UuZnJvbSwgcmFuZ2UudG8pKTtcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSBcImNvcHlNb3ZlXCI7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5oYW5kbGVycy5kcmFnZW5kID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZnVuY3Rpb24gZHJvcFRleHQodmlldywgZXZlbnQsIHRleHQsIGRpcmVjdCkge1xuICAgIGlmICghdGV4dClcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBkcm9wUG9zID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSwgZmFsc2UpO1xuICAgIGxldCB7IGRyYWdnZWRDb250ZW50IH0gPSB2aWV3LmlucHV0U3RhdGU7XG4gICAgbGV0IGRlbCA9IGRpcmVjdCAmJiBkcmFnZ2VkQ29udGVudCAmJiBkcmFnTW92ZXNTZWxlY3Rpb24odmlldywgZXZlbnQpXG4gICAgICAgID8geyBmcm9tOiBkcmFnZ2VkQ29udGVudC5mcm9tLCB0bzogZHJhZ2dlZENvbnRlbnQudG8gfSA6IG51bGw7XG4gICAgbGV0IGlucyA9IHsgZnJvbTogZHJvcFBvcywgaW5zZXJ0OiB0ZXh0IH07XG4gICAgbGV0IGNoYW5nZXMgPSB2aWV3LnN0YXRlLmNoYW5nZXMoZGVsID8gW2RlbCwgaW5zXSA6IGlucyk7XG4gICAgdmlldy5mb2N1cygpO1xuICAgIHZpZXcuZGlzcGF0Y2goe1xuICAgICAgICBjaGFuZ2VzLFxuICAgICAgICBzZWxlY3Rpb246IHsgYW5jaG9yOiBjaGFuZ2VzLm1hcFBvcyhkcm9wUG9zLCAtMSksIGhlYWQ6IGNoYW5nZXMubWFwUG9zKGRyb3BQb3MsIDEpIH0sXG4gICAgICAgIHVzZXJFdmVudDogZGVsID8gXCJtb3ZlLmRyb3BcIiA6IFwiaW5wdXQuZHJvcFwiXG4gICAgfSk7XG4gICAgdmlldy5pbnB1dFN0YXRlLmRyYWdnZWRDb250ZW50ID0gbnVsbDtcbn1cbmhhbmRsZXJzLmRyb3AgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2ZlcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh2aWV3LnN0YXRlLnJlYWRPbmx5KVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkgeyAvLyBGb3IgYSBmaWxlIGRyb3AsIHJlYWQgdGhlIGZpbGUncyB0ZXh0LlxuICAgICAgICBsZXQgdGV4dCA9IEFycmF5KGZpbGVzLmxlbmd0aCksIHJlYWQgPSAwO1xuICAgICAgICBsZXQgZmluaXNoRmlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICgrK3JlYWQgPT0gZmlsZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGRyb3BUZXh0KHZpZXcsIGV2ZW50LCB0ZXh0LmZpbHRlcihzID0+IHMgIT0gbnVsbCkuam9pbih2aWV3LnN0YXRlLmxpbmVCcmVhayksIGZhbHNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyO1xuICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBmaW5pc2hGaWxlO1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIS9bXFx4MDAtXFx4MDhcXHgwZS1cXHgxZl17Mn0vLnRlc3QocmVhZGVyLnJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgIHRleHRbaV0gPSByZWFkZXIucmVzdWx0O1xuICAgICAgICAgICAgICAgIGZpbmlzaEZpbGUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgdGV4dCA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwiVGV4dFwiKTtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgIGRyb3BUZXh0KHZpZXcsIGV2ZW50LCB0ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5oYW5kbGVycy5wYXN0ZSA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIGlmICh2aWV3LnN0YXRlLnJlYWRPbmx5KVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB2aWV3Lm9ic2VydmVyLmZsdXNoKCk7XG4gICAgbGV0IGRhdGEgPSBicm9rZW5DbGlwYm9hcmRBUEkgPyBudWxsIDogZXZlbnQuY2xpcGJvYXJkRGF0YTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBkb1Bhc3RlKHZpZXcsIGRhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIikgfHwgZGF0YS5nZXREYXRhKFwidGV4dC91cmktdGV4dFwiKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2FwdHVyZVBhc3RlKHZpZXcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGNhcHR1cmVDb3B5KHZpZXcsIHRleHQpIHtcbiAgICAvLyBUaGUgZXh0cmEgd3JhcHBlciBpcyBzb21laG93IG5lY2Vzc2FyeSBvbiBJRS9FZGdlIHRvIHByZXZlbnQgdGhlXG4gICAgLy8gY29udGVudCBmcm9tIGJlaW5nIG1hbmdsZWQgd2hlbiBpdCBpcyBwdXQgb250byB0aGUgY2xpcGJvYXJkXG4gICAgbGV0IHBhcmVudCA9IHZpZXcuZG9tLnBhcmVudE5vZGU7XG4gICAgaWYgKCFwYXJlbnQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgdGFyZ2V0ID0gcGFyZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSk7XG4gICAgdGFyZ2V0LnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIHRhcmdldC52YWx1ZSA9IHRleHQ7XG4gICAgdGFyZ2V0LmZvY3VzKCk7XG4gICAgdGFyZ2V0LnNlbGVjdGlvbkVuZCA9IHRleHQubGVuZ3RoO1xuICAgIHRhcmdldC5zZWxlY3Rpb25TdGFydCA9IDA7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRhcmdldC5yZW1vdmUoKTtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgIH0sIDUwKTtcbn1cbmZ1bmN0aW9uIGNvcGllZFJhbmdlKHN0YXRlKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBbXSwgcmFuZ2VzID0gW10sIGxpbmV3aXNlID0gZmFsc2U7XG4gICAgZm9yIChsZXQgcmFuZ2Ugb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcylcbiAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSkge1xuICAgICAgICAgICAgY29udGVudC5wdXNoKHN0YXRlLnNsaWNlRG9jKHJhbmdlLmZyb20sIHJhbmdlLnRvKSk7XG4gICAgICAgICAgICByYW5nZXMucHVzaChyYW5nZSk7XG4gICAgICAgIH1cbiAgICBpZiAoIWNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgc2VsZWN0ZWQsIGRvIGEgbGluZS13aXNlIGNvcHlcbiAgICAgICAgbGV0IHVwdG8gPSAtMTtcbiAgICAgICAgZm9yIChsZXQgeyBmcm9tIH0gb2Ygc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KGZyb20pO1xuICAgICAgICAgICAgaWYgKGxpbmUubnVtYmVyID4gdXB0bykge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChsaW5lLnRleHQpO1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKHsgZnJvbTogbGluZS5mcm9tLCB0bzogTWF0aC5taW4oc3RhdGUuZG9jLmxlbmd0aCwgbGluZS50byArIDEpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXB0byA9IGxpbmUubnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGxpbmV3aXNlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdGV4dDogY29udGVudC5qb2luKHN0YXRlLmxpbmVCcmVhayksIHJhbmdlcywgbGluZXdpc2UgfTtcbn1cbmxldCBsYXN0TGluZXdpc2VDb3B5ID0gbnVsbDtcbmhhbmRsZXJzLmNvcHkgPSBoYW5kbGVycy5jdXQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBsZXQgeyB0ZXh0LCByYW5nZXMsIGxpbmV3aXNlIH0gPSBjb3BpZWRSYW5nZSh2aWV3LnN0YXRlKTtcbiAgICBpZiAoIXRleHQgJiYgIWxpbmV3aXNlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGFzdExpbmV3aXNlQ29weSA9IGxpbmV3aXNlID8gdGV4dCA6IG51bGw7XG4gICAgaWYgKGV2ZW50LnR5cGUgPT0gXCJjdXRcIiAmJiAhdmlldy5zdGF0ZS5yZWFkT25seSlcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICBjaGFuZ2VzOiByYW5nZXMsXG4gICAgICAgICAgICBzY3JvbGxJbnRvVmlldzogdHJ1ZSxcbiAgICAgICAgICAgIHVzZXJFdmVudDogXCJkZWxldGUuY3V0XCJcbiAgICAgICAgfSk7XG4gICAgbGV0IGRhdGEgPSBicm9rZW5DbGlwYm9hcmRBUEkgPyBudWxsIDogZXZlbnQuY2xpcGJvYXJkRGF0YTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmNsZWFyRGF0YSgpO1xuICAgICAgICBkYXRhLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRleHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNhcHR1cmVDb3B5KHZpZXcsIHRleHQpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbmNvbnN0IGlzRm9jdXNDaGFuZ2UgPSAvKkBfX1BVUkVfXyovQW5ub3RhdGlvbi5kZWZpbmUoKTtcbmZ1bmN0aW9uIGZvY3VzQ2hhbmdlVHJhbnNhY3Rpb24oc3RhdGUsIGZvY3VzKSB7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBnZXRFZmZlY3Qgb2Ygc3RhdGUuZmFjZXQoZm9jdXNDaGFuZ2VFZmZlY3QpKSB7XG4gICAgICAgIGxldCBlZmZlY3QgPSBnZXRFZmZlY3Qoc3RhdGUsIGZvY3VzKTtcbiAgICAgICAgaWYgKGVmZmVjdClcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaChlZmZlY3QpO1xuICAgIH1cbiAgICByZXR1cm4gZWZmZWN0cyA/IHN0YXRlLnVwZGF0ZSh7IGVmZmVjdHMsIGFubm90YXRpb25zOiBpc0ZvY3VzQ2hhbmdlLm9mKHRydWUpIH0pIDogbnVsbDtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUZvckZvY3VzQ2hhbmdlKHZpZXcpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IGZvY3VzID0gdmlldy5oYXNGb2N1cztcbiAgICAgICAgaWYgKGZvY3VzICE9IHZpZXcuaW5wdXRTdGF0ZS5ub3RpZmllZEZvY3VzZWQpIHtcbiAgICAgICAgICAgIGxldCB0ciA9IGZvY3VzQ2hhbmdlVHJhbnNhY3Rpb24odmlldy5zdGF0ZSwgZm9jdXMpO1xuICAgICAgICAgICAgaWYgKHRyKVxuICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHZpZXcudXBkYXRlKFtdKTtcbiAgICAgICAgfVxuICAgIH0sIDEwKTtcbn1cbm9ic2VydmVycy5mb2N1cyA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0Rm9jdXNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAvLyBXaGVuIGZvY3VzaW5nIHJlc2V0IHRoZSBzY3JvbGwgcG9zaXRpb24sIG1vdmUgaXQgYmFjayB0byB3aGVyZSBpdCB3YXNcbiAgICBpZiAoIXZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCAmJiAodmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxUb3AgfHwgdmlldy5pbnB1dFN0YXRlLmxhc3RTY3JvbGxMZWZ0KSkge1xuICAgICAgICB2aWV3LnNjcm9sbERPTS5zY3JvbGxUb3AgPSB2aWV3LmlucHV0U3RhdGUubGFzdFNjcm9sbFRvcDtcbiAgICAgICAgdmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdCA9IHZpZXcuaW5wdXRTdGF0ZS5sYXN0U2Nyb2xsTGVmdDtcbiAgICB9XG4gICAgdXBkYXRlRm9yRm9jdXNDaGFuZ2Uodmlldyk7XG59O1xub2JzZXJ2ZXJzLmJsdXIgPSB2aWV3ID0+IHtcbiAgICB2aWV3Lm9ic2VydmVyLmNsZWFyU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICB1cGRhdGVGb3JGb2N1c0NoYW5nZSh2aWV3KTtcbn07XG5vYnNlcnZlcnMuY29tcG9zaXRpb25zdGFydCA9IG9ic2VydmVycy5jb21wb3NpdGlvbnVwZGF0ZSA9IHZpZXcgPT4ge1xuICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9PSBudWxsKVxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IHRydWU7XG4gICAgaWYgKHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPCAwKSB7XG4gICAgICAgIC8vIEZJWE1FIHBvc3NpYmx5IHNldCBhIHRpbWVvdXQgdG8gY2xlYXIgaXQgYWdhaW4gb24gQW5kcm9pZFxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID0gMDtcbiAgICB9XG59O1xub2JzZXJ2ZXJzLmNvbXBvc2l0aW9uZW5kID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2luZyA9IC0xO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvbkVuZGVkQXQgPSBEYXRlLm5vdygpO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdLZXkgPSB0cnVlO1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UgPSB2aWV3Lm9ic2VydmVyLnBlbmRpbmdSZWNvcmRzKCkubGVuZ3RoID4gMDtcbiAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IG51bGw7XG4gICAgaWYgKGJyb3dzZXIuY2hyb21lICYmIGJyb3dzZXIuYW5kcm9pZCkge1xuICAgICAgICAvLyBEZWxheSBmbHVzaGluZyBmb3IgYSBiaXQgb24gQW5kcm9pZCBiZWNhdXNlIGl0J2xsIG9mdGVuIGZpcmUgYVxuICAgICAgICAvLyBidW5jaCBvZiBjb250cmFkaWN0b3J5IGNoYW5nZXMgaW4gYSByb3cgYXQgZW5kIG9mIGNvbXBvc2l0b25cbiAgICAgICAgdmlldy5vYnNlcnZlci5mbHVzaFNvb24oKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZSkge1xuICAgICAgICAvLyBJZiB3ZSBmb3VuZCBwZW5kaW5nIHJlY29yZHMsIHNjaGVkdWxlIGEgZmx1c2guXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdmlldy5vYnNlcnZlci5mbHVzaCgpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgbWFrZSBzdXJlIHRoYXQsIGlmIG5vIGNoYW5nZXMgY29tZSBpbiBzb29uLCB0aGVcbiAgICAgICAgLy8gY29tcG9zaXRpb24gdmlldyBpcyBjbGVhcmVkLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nIDwgMCAmJiB2aWV3LmRvY1ZpZXcuaGFzQ29tcG9zaXRpb24pXG4gICAgICAgICAgICAgICAgdmlldy51cGRhdGUoW10pO1xuICAgICAgICB9LCA1MCk7XG4gICAgfVxufTtcbm9ic2VydmVycy5jb250ZXh0bWVudSA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0Q29udGV4dE1lbnUgPSBEYXRlLm5vdygpO1xufTtcbmhhbmRsZXJzLmJlZm9yZWlucHV0ID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIC8vIEJlY2F1c2UgQ2hyb21lIEFuZHJvaWQgZG9lc24ndCBmaXJlIHVzZWZ1bCBrZXkgZXZlbnRzLCB1c2VcbiAgICAvLyBiZWZvcmVpbnB1dCB0byBkZXRlY3QgYmFja3NwYWNlIChhbmQgcG9zc2libHkgZW50ZXIgYW5kIGRlbGV0ZSxcbiAgICAvLyBidXQgdGhvc2UgdXN1YWxseSBkb24ndCBldmVuIHNlZW0gdG8gZmlyZSBiZWZvcmVpbnB1dCBldmVudHMgYXRcbiAgICAvLyB0aGUgbW9tZW50KSBhbmQgZmFrZSBhIGtleSBldmVudCBmb3IgaXQuXG4gICAgLy9cbiAgICAvLyAocHJldmVudERlZmF1bHQgb24gYmVmb3JlaW5wdXQsIHRob3VnaCBzdXBwb3J0ZWQgaW4gdGhlIHNwZWMsXG4gICAgLy8gc2VlbXMgdG8gZG8gbm90aGluZyBhdCBhbGwgb24gQ2hyb21lKS5cbiAgICBsZXQgcGVuZGluZztcbiAgICBpZiAoYnJvd3Nlci5jaHJvbWUgJiYgYnJvd3Nlci5hbmRyb2lkICYmIChwZW5kaW5nID0gUGVuZGluZ0tleXMuZmluZChrZXkgPT4ga2V5LmlucHV0VHlwZSA9PSBldmVudC5pbnB1dFR5cGUpKSkge1xuICAgICAgICB2aWV3Lm9ic2VydmVyLmRlbGF5QW5kcm9pZEtleShwZW5kaW5nLmtleSwgcGVuZGluZy5rZXlDb2RlKTtcbiAgICAgICAgaWYgKHBlbmRpbmcua2V5ID09IFwiQmFja3NwYWNlXCIgfHwgcGVuZGluZy5rZXkgPT0gXCJEZWxldGVcIikge1xuICAgICAgICAgICAgbGV0IHN0YXJ0Vmlld0hlaWdodCA9ICgoX2EgPSB3aW5kb3cudmlzdWFsVmlld3BvcnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oZWlnaHQpIHx8IDA7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgLy8gQmFja3NwYWNpbmcgbmVhciB1bmVkaXRhYmxlIG5vZGVzIG9uIENocm9tZSBBbmRyb2lkIHNvbWV0aW1lc1xuICAgICAgICAgICAgICAgIC8vIGNsb3NlcyB0aGUgdmlydHVhbCBrZXlib2FyZC4gVGhpcyB0cmllcyB0byBjcnVkZWx5IGRldGVjdFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgYW5kIHJlZm9jdXMgdG8gZ2V0IGl0IGJhY2suXG4gICAgICAgICAgICAgICAgaWYgKCgoKF9hID0gd2luZG93LnZpc3VhbFZpZXdwb3J0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGVpZ2h0KSB8fCAwKSA+IHN0YXJ0Vmlld0hlaWdodCArIDEwICYmIHZpZXcuaGFzRm9jdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5jb250ZW50RE9NLmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmNvbnN0IGFwcGxpZWRGaXJlZm94SGFjayA9IC8qQF9fUFVSRV9fKi9uZXcgU2V0O1xuLy8gSW4gRmlyZWZveCwgd2hlbiBjdXQvY29weSBoYW5kbGVycyBhcmUgYWRkZWQgdG8gdGhlIGRvY3VtZW50LCB0aGF0XG4vLyBzb21laG93IGF2b2lkcyBhIGJ1ZyB3aGVyZSB0aG9zZSBldmVudHMgYXJlbid0IGZpcmVkIHdoZW4gdGhlXG4vLyBzZWxlY3Rpb24gaXMgZW1wdHkuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9kZXYvaXNzdWVzLzEwODJcbi8vIGFuZCBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD05OTU5NjFcbmZ1bmN0aW9uIGZpcmVmb3hDb3B5Q3V0SGFjayhkb2MpIHtcbiAgICBpZiAoIWFwcGxpZWRGaXJlZm94SGFjay5oYXMoZG9jKSkge1xuICAgICAgICBhcHBsaWVkRmlyZWZveEhhY2suYWRkKGRvYyk7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwiY29weVwiLCAoKSA9PiB7IH0pO1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcihcImN1dFwiLCAoKSA9PiB7IH0pO1xuICAgIH1cbn1cblxuY29uc3Qgd3JhcHBpbmdXaGl0ZVNwYWNlID0gW1wicHJlLXdyYXBcIiwgXCJub3JtYWxcIiwgXCJwcmUtbGluZVwiLCBcImJyZWFrLXNwYWNlc1wiXTtcbmNsYXNzIEhlaWdodE9yYWNsZSB7XG4gICAgY29uc3RydWN0b3IobGluZVdyYXBwaW5nKSB7XG4gICAgICAgIHRoaXMubGluZVdyYXBwaW5nID0gbGluZVdyYXBwaW5nO1xuICAgICAgICB0aGlzLmRvYyA9IFRleHQuZW1wdHk7XG4gICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlcyA9IHt9O1xuICAgICAgICB0aGlzLmxpbmVIZWlnaHQgPSAxNDsgLy8gVGhlIGhlaWdodCBvZiBhbiBlbnRpcmUgbGluZSAobGluZS1oZWlnaHQpXG4gICAgICAgIHRoaXMuY2hhcldpZHRoID0gNztcbiAgICAgICAgdGhpcy50ZXh0SGVpZ2h0ID0gMTQ7IC8vIFRoZSBoZWlnaHQgb2YgdGhlIGFjdHVhbCBmb250IChmb250LXNpemUpXG4gICAgICAgIHRoaXMubGluZUxlbmd0aCA9IDMwO1xuICAgICAgICAvLyBVc2VkIHRvIHRyYWNrLCBkdXJpbmcgdXBkYXRlSGVpZ2h0LCBpZiBhbnkgYWN0dWFsIGhlaWdodHMgY2hhbmdlZFxuICAgICAgICB0aGlzLmhlaWdodENoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaGVpZ2h0Rm9yR2FwKGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHRoaXMuZG9jLmxpbmVBdCh0bykubnVtYmVyIC0gdGhpcy5kb2MubGluZUF0KGZyb20pLm51bWJlciArIDE7XG4gICAgICAgIGlmICh0aGlzLmxpbmVXcmFwcGluZylcbiAgICAgICAgICAgIGxpbmVzICs9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoKHRvIC0gZnJvbSkgLSAobGluZXMgKiB0aGlzLmxpbmVMZW5ndGggKiAwLjUpKSAvIHRoaXMubGluZUxlbmd0aCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lSGVpZ2h0ICogbGluZXM7XG4gICAgfVxuICAgIGhlaWdodEZvckxpbmUobGVuZ3RoKSB7XG4gICAgICAgIGlmICghdGhpcy5saW5lV3JhcHBpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saW5lSGVpZ2h0O1xuICAgICAgICBsZXQgbGluZXMgPSAxICsgTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChsZW5ndGggLSB0aGlzLmxpbmVMZW5ndGgpIC8gKHRoaXMubGluZUxlbmd0aCAtIDUpKSk7XG4gICAgICAgIHJldHVybiBsaW5lcyAqIHRoaXMubGluZUhlaWdodDtcbiAgICB9XG4gICAgc2V0RG9jKGRvYykgeyB0aGlzLmRvYyA9IGRvYzsgcmV0dXJuIHRoaXM7IH1cbiAgICBtdXN0UmVmcmVzaEZvcldyYXBwaW5nKHdoaXRlU3BhY2UpIHtcbiAgICAgICAgcmV0dXJuICh3cmFwcGluZ1doaXRlU3BhY2UuaW5kZXhPZih3aGl0ZVNwYWNlKSA+IC0xKSAhPSB0aGlzLmxpbmVXcmFwcGluZztcbiAgICB9XG4gICAgbXVzdFJlZnJlc2hGb3JIZWlnaHRzKGxpbmVIZWlnaHRzKSB7XG4gICAgICAgIGxldCBuZXdIZWlnaHQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lSGVpZ2h0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGggPSBsaW5lSGVpZ2h0c1tpXTtcbiAgICAgICAgICAgIGlmIChoIDwgMCkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmhlaWdodFNhbXBsZXNbTWF0aC5mbG9vcihoICogMTApXSkgeyAvLyBSb3VuZCB0byAuMSBwaXhlbHNcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0U2FtcGxlc1tNYXRoLmZsb29yKGggKiAxMCldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3SGVpZ2h0O1xuICAgIH1cbiAgICByZWZyZXNoKHdoaXRlU3BhY2UsIGxpbmVIZWlnaHQsIGNoYXJXaWR0aCwgdGV4dEhlaWdodCwgbGluZUxlbmd0aCwga25vd25IZWlnaHRzKSB7XG4gICAgICAgIGxldCBsaW5lV3JhcHBpbmcgPSB3cmFwcGluZ1doaXRlU3BhY2UuaW5kZXhPZih3aGl0ZVNwYWNlKSA+IC0xO1xuICAgICAgICBsZXQgY2hhbmdlZCA9IE1hdGgucm91bmQobGluZUhlaWdodCkgIT0gTWF0aC5yb3VuZCh0aGlzLmxpbmVIZWlnaHQpIHx8IHRoaXMubGluZVdyYXBwaW5nICE9IGxpbmVXcmFwcGluZztcbiAgICAgICAgdGhpcy5saW5lV3JhcHBpbmcgPSBsaW5lV3JhcHBpbmc7XG4gICAgICAgIHRoaXMubGluZUhlaWdodCA9IGxpbmVIZWlnaHQ7XG4gICAgICAgIHRoaXMuY2hhcldpZHRoID0gY2hhcldpZHRoO1xuICAgICAgICB0aGlzLnRleHRIZWlnaHQgPSB0ZXh0SGVpZ2h0O1xuICAgICAgICB0aGlzLmxpbmVMZW5ndGggPSBsaW5lTGVuZ3RoO1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5oZWlnaHRTYW1wbGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtub3duSGVpZ2h0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBoID0ga25vd25IZWlnaHRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChoIDwgMClcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRTYW1wbGVzW01hdGguZmxvb3IoaCAqIDEwKV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH1cbn1cbi8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgYnkgYHVwZGF0ZUhlaWdodGAgdG8gbWFrZSBET00gbWVhc3VyZW1lbnRzXG4vLyBhcnJpdmUgYXQgdGhlIHJpZ2h0IG5pZGVzLiBUaGUgYGhlaWdodHNgIGFycmF5IGlzIGEgc2VxdWVuY2Ugb2Zcbi8vIGJsb2NrIGhlaWdodHMsIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gYGZyb21gLlxuY2xhc3MgTWVhc3VyZWRIZWlnaHRzIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCBoZWlnaHRzKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMuaGVpZ2h0cyA9IGhlaWdodHM7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIH1cbiAgICBnZXQgbW9yZSgpIHsgcmV0dXJuIHRoaXMuaW5kZXggPCB0aGlzLmhlaWdodHMubGVuZ3RoOyB9XG59XG4vKipcblJlY29yZCB1c2VkIHRvIHJlcHJlc2VudCBpbmZvcm1hdGlvbiBhYm91dCBhIGJsb2NrLWxldmVsIGVsZW1lbnRcbmluIHRoZSBlZGl0b3Igdmlldy5cbiovXG5jbGFzcyBCbG9ja0luZm8ge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHRoZSBlbGVtZW50IGluIHRoZSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBsZW5ndGggb2YgdGhlIGVsZW1lbnQuXG4gICAgKi9cbiAgICBsZW5ndGgsIFxuICAgIC8qKlxuICAgIFRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgKHJlbGF0aXZlIHRvIHRoZSB0b3Agb2YgdGhlXG4gICAgZG9jdW1lbnQpLlxuICAgICovXG4gICAgdG9wLCBcbiAgICAvKipcbiAgICBJdHMgaGVpZ2h0LlxuICAgICovXG4gICAgaGVpZ2h0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWwgV2VpcmQgcGFja2VkIGZpZWxkIHRoYXQgaG9sZHMgYW4gYXJyYXkgb2YgY2hpbGRyZW5cbiAgICBmb3IgY29tcG9zaXRlIGJsb2NrcywgYSBkZWNvcmF0aW9uIGZvciBibG9jayB3aWRnZXRzLCBhbmQgYVxuICAgIG51bWJlciBpbmRpY2F0aW5nIHRoZSBhbW91bnQgb2Ygd2lkZ2V0LWNyZWF0ZSBsaW5lIGJyZWFrcyBmb3JcbiAgICB0ZXh0IGJsb2Nrcy5cbiAgICAqL1xuICAgIF9jb250ZW50KSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBfY29udGVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHR5cGUgb2YgZWxlbWVudCB0aGlzIGlzLiBXaGVuIHF1ZXJ5aW5nIGxpbmVzLCB0aGlzIG1heSBiZVxuICAgIGFuIGFycmF5IG9mIGFsbCB0aGUgYmxvY2tzIHRoYXQgbWFrZSB1cCB0aGUgbGluZS5cbiAgICAqL1xuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuX2NvbnRlbnQgPT0gXCJudW1iZXJcIiA/IEJsb2NrVHlwZS5UZXh0IDpcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5fY29udGVudCkgPyB0aGlzLl9jb250ZW50IDogdGhpcy5fY29udGVudC50eXBlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHRoZSBlbGVtZW50IGFzIGEgZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgdG8oKSB7IHJldHVybiB0aGlzLmZyb20gKyB0aGlzLmxlbmd0aDsgfVxuICAgIC8qKlxuICAgIFRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQuXG4gICAgKi9cbiAgICBnZXQgYm90dG9tKCkgeyByZXR1cm4gdGhpcy50b3AgKyB0aGlzLmhlaWdodDsgfVxuICAgIC8qKlxuICAgIElmIHRoaXMgaXMgYSB3aWRnZXQgYmxvY2ssIHRoaXMgd2lsbCByZXR1cm4gdGhlIHdpZGdldFxuICAgIGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgICAqL1xuICAgIGdldCB3aWRnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50IGluc3RhbmNlb2YgUG9pbnREZWNvcmF0aW9uID8gdGhpcy5fY29udGVudC53aWRnZXQgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBJZiB0aGlzIGlzIGEgdGV4dGJsb2NrLCB0aGlzIGhvbGRzIHRoZSBudW1iZXIgb2YgbGluZSBicmVha3NcbiAgICB0aGF0IGFwcGVhciBpbiB3aWRnZXRzIGluc2lkZSB0aGUgYmxvY2suXG4gICAgKi9cbiAgICBnZXQgd2lkZ2V0TGluZUJyZWFrcygpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9jb250ZW50ID09IFwibnVtYmVyXCIgPyB0aGlzLl9jb250ZW50IDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBqb2luKG90aGVyKSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gKEFycmF5LmlzQXJyYXkodGhpcy5fY29udGVudCkgPyB0aGlzLl9jb250ZW50IDogW3RoaXNdKVxuICAgICAgICAgICAgLmNvbmNhdChBcnJheS5pc0FycmF5KG90aGVyLl9jb250ZW50KSA/IG90aGVyLl9jb250ZW50IDogW290aGVyXSk7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKHRoaXMuZnJvbSwgdGhpcy5sZW5ndGggKyBvdGhlci5sZW5ndGgsIHRoaXMudG9wLCB0aGlzLmhlaWdodCArIG90aGVyLmhlaWdodCwgY29udGVudCk7XG4gICAgfVxufVxudmFyIFF1ZXJ5VHlwZSA9IC8qQF9fUFVSRV9fKi8oZnVuY3Rpb24gKFF1ZXJ5VHlwZSkge1xuICAgIFF1ZXJ5VHlwZVtRdWVyeVR5cGVbXCJCeVBvc1wiXSA9IDBdID0gXCJCeVBvc1wiO1xuICAgIFF1ZXJ5VHlwZVtRdWVyeVR5cGVbXCJCeUhlaWdodFwiXSA9IDFdID0gXCJCeUhlaWdodFwiO1xuICAgIFF1ZXJ5VHlwZVtRdWVyeVR5cGVbXCJCeVBvc05vSGVpZ2h0XCJdID0gMl0gPSBcIkJ5UG9zTm9IZWlnaHRcIjtcbnJldHVybiBRdWVyeVR5cGV9KShRdWVyeVR5cGUgfHwgKFF1ZXJ5VHlwZSA9IHt9KSk7XG5jb25zdCBFcHNpbG9uID0gMWUtMztcbmNsYXNzIEhlaWdodE1hcCB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCAvLyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY292ZXJlZFxuICAgIGhlaWdodCwgLy8gSGVpZ2h0IG9mIHRoaXMgcGFydCBvZiB0aGUgZG9jdW1lbnRcbiAgICBmbGFncyA9IDIgLyogRmxhZy5PdXRkYXRlZCAqLykge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB9XG4gICAgZ2V0IG91dGRhdGVkKCkgeyByZXR1cm4gKHRoaXMuZmxhZ3MgJiAyIC8qIEZsYWcuT3V0ZGF0ZWQgKi8pID4gMDsgfVxuICAgIHNldCBvdXRkYXRlZCh2YWx1ZSkgeyB0aGlzLmZsYWdzID0gKHZhbHVlID8gMiAvKiBGbGFnLk91dGRhdGVkICovIDogMCkgfCAodGhpcy5mbGFncyAmIH4yIC8qIEZsYWcuT3V0ZGF0ZWQgKi8pOyB9XG4gICAgc2V0SGVpZ2h0KG9yYWNsZSwgaGVpZ2h0KSB7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodCAhPSBoZWlnaHQpIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh0aGlzLmhlaWdodCAtIGhlaWdodCkgPiBFcHNpbG9uKVxuICAgICAgICAgICAgICAgIG9yYWNsZS5oZWlnaHRDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJhc2UgY2FzZSBpcyB0byByZXBsYWNlIGEgbGVhZiBub2RlLCB3aGljaCBzaW1wbHkgYnVpbGRzIGEgdHJlZVxuICAgIC8vIGZyb20gdGhlIG5ldyBub2RlcyBhbmQgcmV0dXJucyB0aGF0IChIZWlnaHRNYXBCcmFuY2ggYW5kXG4gICAgLy8gSGVpZ2h0TWFwR2FwIG92ZXJyaWRlIHRoaXMgdG8gYWN0dWFsbHkgdXNlIGZyb20vdG8pXG4gICAgcmVwbGFjZShfZnJvbSwgX3RvLCBub2Rlcykge1xuICAgICAgICByZXR1cm4gSGVpZ2h0TWFwLm9mKG5vZGVzKTtcbiAgICB9XG4gICAgLy8gQWdhaW4sIHRoZXNlIGFyZSBiYXNlIGNhc2VzLCBhbmQgYXJlIG92ZXJyaWRkZW4gZm9yIGJyYW5jaCBhbmQgZ2FwIG5vZGVzLlxuICAgIGRlY29tcG9zZUxlZnQoX3RvLCByZXN1bHQpIHsgcmVzdWx0LnB1c2godGhpcyk7IH1cbiAgICBkZWNvbXBvc2VSaWdodChfZnJvbSwgcmVzdWx0KSB7IHJlc3VsdC5wdXNoKHRoaXMpOyB9XG4gICAgYXBwbHlDaGFuZ2VzKGRlY29yYXRpb25zLCBvbGREb2MsIG9yYWNsZSwgY2hhbmdlcykge1xuICAgICAgICBsZXQgbWUgPSB0aGlzLCBkb2MgPSBvcmFjbGUuZG9jO1xuICAgICAgICBmb3IgKGxldCBpID0gY2hhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHsgZnJvbUEsIHRvQSwgZnJvbUIsIHRvQiB9ID0gY2hhbmdlc1tpXTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IG1lLmxpbmVBdChmcm9tQSwgUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQsIG9yYWNsZS5zZXREb2Mob2xkRG9jKSwgMCwgMCk7XG4gICAgICAgICAgICBsZXQgZW5kID0gc3RhcnQudG8gPj0gdG9BID8gc3RhcnQgOiBtZS5saW5lQXQodG9BLCBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCwgb3JhY2xlLCAwLCAwKTtcbiAgICAgICAgICAgIHRvQiArPSBlbmQudG8gLSB0b0E7XG4gICAgICAgICAgICB0b0EgPSBlbmQudG87XG4gICAgICAgICAgICB3aGlsZSAoaSA+IDAgJiYgc3RhcnQuZnJvbSA8PSBjaGFuZ2VzW2kgLSAxXS50b0EpIHtcbiAgICAgICAgICAgICAgICBmcm9tQSA9IGNoYW5nZXNbaSAtIDFdLmZyb21BO1xuICAgICAgICAgICAgICAgIGZyb21CID0gY2hhbmdlc1tpIC0gMV0uZnJvbUI7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tQSA8IHN0YXJ0LmZyb20pXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbWUubGluZUF0KGZyb21BLCBRdWVyeVR5cGUuQnlQb3NOb0hlaWdodCwgb3JhY2xlLCAwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZyb21CICs9IHN0YXJ0LmZyb20gLSBmcm9tQTtcbiAgICAgICAgICAgIGZyb21BID0gc3RhcnQuZnJvbTtcbiAgICAgICAgICAgIGxldCBub2RlcyA9IE5vZGVCdWlsZGVyLmJ1aWxkKG9yYWNsZS5zZXREb2MoZG9jKSwgZGVjb3JhdGlvbnMsIGZyb21CLCB0b0IpO1xuICAgICAgICAgICAgbWUgPSBtZS5yZXBsYWNlKGZyb21BLCB0b0EsIG5vZGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWUudXBkYXRlSGVpZ2h0KG9yYWNsZSwgMCk7XG4gICAgfVxuICAgIHN0YXRpYyBlbXB0eSgpIHsgcmV0dXJuIG5ldyBIZWlnaHRNYXBUZXh0KDAsIDApOyB9XG4gICAgLy8gbm9kZXMgdXNlcyBudWxsIHZhbHVlcyB0byBpbmRpY2F0ZSB0aGUgcG9zaXRpb24gb2YgbGluZSBicmVha3MuXG4gICAgLy8gVGhlcmUgYXJlIG5ldmVyIGxpbmUgYnJlYWtzIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIGFycmF5LCBvclxuICAgIC8vIHR3byBsaW5lIGJyZWFrcyBuZXh0IHRvIGVhY2ggb3RoZXIsIGFuZCB0aGUgYXJyYXkgaXNuJ3QgYWxsb3dlZFxuICAgIC8vIHRvIGJlIGVtcHR5IChzYW1lIHJlc3RyaWN0aW9ucyBhcyByZXR1cm4gdmFsdWUgZnJvbSB0aGUgYnVpbGRlcikuXG4gICAgc3RhdGljIG9mKG5vZGVzKSB7XG4gICAgICAgIGlmIChub2Rlcy5sZW5ndGggPT0gMSlcbiAgICAgICAgICAgIHJldHVybiBub2Rlc1swXTtcbiAgICAgICAgbGV0IGkgPSAwLCBqID0gbm9kZXMubGVuZ3RoLCBiZWZvcmUgPSAwLCBhZnRlciA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGlmIChpID09IGopIHtcbiAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID4gYWZ0ZXIgKiAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGxpdCA9IG5vZGVzW2kgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwbGl0LmJyZWFrKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuc3BsaWNlKC0taSwgMSwgc3BsaXQubGVmdCwgbnVsbCwgc3BsaXQucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5zcGxpY2UoLS1pLCAxLCBzcGxpdC5sZWZ0LCBzcGxpdC5yaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGogKz0gMSArIHNwbGl0LmJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmUgLT0gc3BsaXQuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYWZ0ZXIgPiBiZWZvcmUgKiAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGxpdCA9IG5vZGVzW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3BsaXQuYnJlYWspXG4gICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5zcGxpY2UoaiwgMSwgc3BsaXQubGVmdCwgbnVsbCwgc3BsaXQucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5zcGxpY2UoaiwgMSwgc3BsaXQubGVmdCwgc3BsaXQucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBqICs9IDIgKyBzcGxpdC5icmVhaztcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgLT0gc3BsaXQuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZSA8IGFmdGVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBub2Rlc1tpKytdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0KVxuICAgICAgICAgICAgICAgICAgICBiZWZvcmUgKz0gbmV4dC5zaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBub2Rlc1stLWpdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0KVxuICAgICAgICAgICAgICAgICAgICBhZnRlciArPSBuZXh0LnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJyayA9IDA7XG4gICAgICAgIGlmIChub2Rlc1tpIC0gMV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgYnJrID0gMTtcbiAgICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2Rlc1tpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBicmsgPSAxO1xuICAgICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSGVpZ2h0TWFwQnJhbmNoKEhlaWdodE1hcC5vZihub2Rlcy5zbGljZSgwLCBpKSksIGJyaywgSGVpZ2h0TWFwLm9mKG5vZGVzLnNsaWNlKGopKSk7XG4gICAgfVxufVxuSGVpZ2h0TWFwLnByb3RvdHlwZS5zaXplID0gMTtcbmNsYXNzIEhlaWdodE1hcEJsb2NrIGV4dGVuZHMgSGVpZ2h0TWFwIHtcbiAgICBjb25zdHJ1Y3RvcihsZW5ndGgsIGhlaWdodCwgZGVjbykge1xuICAgICAgICBzdXBlcihsZW5ndGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuZGVjbyA9IGRlY287XG4gICAgfVxuICAgIGJsb2NrQXQoX2hlaWdodCwgX29yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8ob2Zmc2V0LCB0aGlzLmxlbmd0aCwgdG9wLCB0aGlzLmhlaWdodCwgdGhpcy5kZWNvIHx8IDApO1xuICAgIH1cbiAgICBsaW5lQXQoX3ZhbHVlLCBfdHlwZSwgb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ibG9ja0F0KDAsIG9yYWNsZSwgdG9wLCBvZmZzZXQpO1xuICAgIH1cbiAgICBmb3JFYWNoTGluZShmcm9tLCB0bywgb3JhY2xlLCB0b3AsIG9mZnNldCwgZikge1xuICAgICAgICBpZiAoZnJvbSA8PSBvZmZzZXQgKyB0aGlzLmxlbmd0aCAmJiB0byA+PSBvZmZzZXQpXG4gICAgICAgICAgICBmKHRoaXMuYmxvY2tBdCgwLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSk7XG4gICAgfVxuICAgIHVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCA9IDAsIF9mb3JjZSA9IGZhbHNlLCBtZWFzdXJlZCkge1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSBvZmZzZXQgJiYgbWVhc3VyZWQubW9yZSlcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KG9yYWNsZSwgbWVhc3VyZWQuaGVpZ2h0c1ttZWFzdXJlZC5pbmRleCsrXSk7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gYGJsb2NrKCR7dGhpcy5sZW5ndGh9KWA7IH1cbn1cbmNsYXNzIEhlaWdodE1hcFRleHQgZXh0ZW5kcyBIZWlnaHRNYXBCbG9jayB7XG4gICAgY29uc3RydWN0b3IobGVuZ3RoLCBoZWlnaHQpIHtcbiAgICAgICAgc3VwZXIobGVuZ3RoLCBoZWlnaHQsIG51bGwpO1xuICAgICAgICB0aGlzLmNvbGxhcHNlZCA9IDA7IC8vIEFtb3VudCBvZiBjb2xsYXBzZWQgY29udGVudCBpbiB0aGUgbGluZVxuICAgICAgICB0aGlzLndpZGdldEhlaWdodCA9IDA7IC8vIE1heGltdW0gaW5saW5lIHdpZGdldCBoZWlnaHRcbiAgICAgICAgdGhpcy5icmVha3MgPSAwOyAvLyBOdW1iZXIgb2Ygd2lkZ2V0LWludHJvZHVjZWQgbGluZSBicmVha3Mgb24gdGhlIGxpbmVcbiAgICB9XG4gICAgYmxvY2tBdChfaGVpZ2h0LCBfb3JhY2xlLCB0b3AsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhvZmZzZXQsIHRoaXMubGVuZ3RoLCB0b3AsIHRoaXMuaGVpZ2h0LCB0aGlzLmJyZWFrcyk7XG4gICAgfVxuICAgIHJlcGxhY2UoX2Zyb20sIF90bywgbm9kZXMpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBub2Rlc1swXTtcbiAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PSAxICYmIChub2RlIGluc3RhbmNlb2YgSGVpZ2h0TWFwVGV4dCB8fCBub2RlIGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwICYmIChub2RlLmZsYWdzICYgNCAvKiBGbGFnLlNpbmdsZUxpbmUgKi8pKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnModGhpcy5sZW5ndGggLSBub2RlLmxlbmd0aCkgPCAxMCkge1xuICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBIZWlnaHRNYXBUZXh0KG5vZGUubGVuZ3RoLCB0aGlzLmhlaWdodCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbm9kZS5oZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgICAgIGlmICghdGhpcy5vdXRkYXRlZClcbiAgICAgICAgICAgICAgICBub2RlLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBIZWlnaHRNYXAub2Yobm9kZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCA9IDAsIGZvcmNlID0gZmFsc2UsIG1lYXN1cmVkKSB7XG4gICAgICAgIGlmIChtZWFzdXJlZCAmJiBtZWFzdXJlZC5mcm9tIDw9IG9mZnNldCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQob3JhY2xlLCBtZWFzdXJlZC5oZWlnaHRzW21lYXN1cmVkLmluZGV4KytdKTtcbiAgICAgICAgZWxzZSBpZiAoZm9yY2UgfHwgdGhpcy5vdXRkYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KG9yYWNsZSwgTWF0aC5tYXgodGhpcy53aWRnZXRIZWlnaHQsIG9yYWNsZS5oZWlnaHRGb3JMaW5lKHRoaXMubGVuZ3RoIC0gdGhpcy5jb2xsYXBzZWQpKSArXG4gICAgICAgICAgICAgICAgdGhpcy5icmVha3MgKiBvcmFjbGUubGluZUhlaWdodCk7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYGxpbmUoJHt0aGlzLmxlbmd0aH0ke3RoaXMuY29sbGFwc2VkID8gLXRoaXMuY29sbGFwc2VkIDogXCJcIn0ke3RoaXMud2lkZ2V0SGVpZ2h0ID8gXCI6XCIgKyB0aGlzLndpZGdldEhlaWdodCA6IFwiXCJ9KWA7XG4gICAgfVxufVxuY2xhc3MgSGVpZ2h0TWFwR2FwIGV4dGVuZHMgSGVpZ2h0TWFwIHtcbiAgICBjb25zdHJ1Y3RvcihsZW5ndGgpIHsgc3VwZXIobGVuZ3RoLCAwKTsgfVxuICAgIGhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IGZpcnN0TGluZSA9IG9yYWNsZS5kb2MubGluZUF0KG9mZnNldCkubnVtYmVyLCBsYXN0TGluZSA9IG9yYWNsZS5kb2MubGluZUF0KG9mZnNldCArIHRoaXMubGVuZ3RoKS5udW1iZXI7XG4gICAgICAgIGxldCBsaW5lcyA9IGxhc3RMaW5lIC0gZmlyc3RMaW5lICsgMTtcbiAgICAgICAgbGV0IHBlckxpbmUsIHBlckNoYXIgPSAwO1xuICAgICAgICBpZiAob3JhY2xlLmxpbmVXcmFwcGluZykge1xuICAgICAgICAgICAgbGV0IHRvdGFsUGVyTGluZSA9IE1hdGgubWluKHRoaXMuaGVpZ2h0LCBvcmFjbGUubGluZUhlaWdodCAqIGxpbmVzKTtcbiAgICAgICAgICAgIHBlckxpbmUgPSB0b3RhbFBlckxpbmUgLyBsaW5lcztcbiAgICAgICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IGxpbmVzICsgMSlcbiAgICAgICAgICAgICAgICBwZXJDaGFyID0gKHRoaXMuaGVpZ2h0IC0gdG90YWxQZXJMaW5lKSAvICh0aGlzLmxlbmd0aCAtIGxpbmVzIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwZXJMaW5lID0gdGhpcy5oZWlnaHQgLyBsaW5lcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmaXJzdExpbmUsIGxhc3RMaW5lLCBwZXJMaW5lLCBwZXJDaGFyIH07XG4gICAgfVxuICAgIGJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCB7IGZpcnN0TGluZSwgbGFzdExpbmUsIHBlckxpbmUsIHBlckNoYXIgfSA9IHRoaXMuaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCk7XG4gICAgICAgIGlmIChvcmFjbGUubGluZVdyYXBwaW5nKSB7XG4gICAgICAgICAgICBsZXQgZ3Vlc3MgPSBvZmZzZXQgKyBNYXRoLnJvdW5kKE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChoZWlnaHQgLSB0b3ApIC8gdGhpcy5oZWlnaHQpKSAqIHRoaXMubGVuZ3RoKTtcbiAgICAgICAgICAgIGxldCBsaW5lID0gb3JhY2xlLmRvYy5saW5lQXQoZ3Vlc3MpLCBsaW5lSGVpZ2h0ID0gcGVyTGluZSArIGxpbmUubGVuZ3RoICogcGVyQ2hhcjtcbiAgICAgICAgICAgIGxldCBsaW5lVG9wID0gTWF0aC5tYXgodG9wLCBoZWlnaHQgLSBsaW5lSGVpZ2h0IC8gMik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhsaW5lLmZyb20sIGxpbmUubGVuZ3RoLCBsaW5lVG9wLCBsaW5lSGVpZ2h0LCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obGFzdExpbmUgLSBmaXJzdExpbmUsIE1hdGguZmxvb3IoKGhlaWdodCAtIHRvcCkgLyBwZXJMaW5lKSkpO1xuICAgICAgICAgICAgbGV0IHsgZnJvbSwgbGVuZ3RoIH0gPSBvcmFjbGUuZG9jLmxpbmUoZmlyc3RMaW5lICsgbGluZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2NrSW5mbyhmcm9tLCBsZW5ndGgsIHRvcCArIHBlckxpbmUgKiBsaW5lLCBwZXJMaW5lLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsaW5lQXQodmFsdWUsIHR5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKHR5cGUgPT0gUXVlcnlUeXBlLkJ5SGVpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tBdCh2YWx1ZSwgb3JhY2xlLCB0b3AsIG9mZnNldCk7XG4gICAgICAgIGlmICh0eXBlID09IFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0KSB7XG4gICAgICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gb3JhY2xlLmRvYy5saW5lQXQodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0luZm8oZnJvbSwgdG8gLSBmcm9tLCAwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBmaXJzdExpbmUsIHBlckxpbmUsIHBlckNoYXIgfSA9IHRoaXMuaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCk7XG4gICAgICAgIGxldCBsaW5lID0gb3JhY2xlLmRvYy5saW5lQXQodmFsdWUpLCBsaW5lSGVpZ2h0ID0gcGVyTGluZSArIGxpbmUubGVuZ3RoICogcGVyQ2hhcjtcbiAgICAgICAgbGV0IGxpbmVzQWJvdmUgPSBsaW5lLm51bWJlciAtIGZpcnN0TGluZTtcbiAgICAgICAgbGV0IGxpbmVUb3AgPSB0b3AgKyBwZXJMaW5lICogbGluZXNBYm92ZSArIHBlckNoYXIgKiAobGluZS5mcm9tIC0gb2Zmc2V0IC0gbGluZXNBYm92ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGxpbmUuZnJvbSwgbGluZS5sZW5ndGgsIE1hdGgubWF4KHRvcCwgTWF0aC5taW4obGluZVRvcCwgdG9wICsgdGhpcy5oZWlnaHQgLSBsaW5lSGVpZ2h0KSksIGxpbmVIZWlnaHQsIDApO1xuICAgIH1cbiAgICBmb3JFYWNoTGluZShmcm9tLCB0bywgb3JhY2xlLCB0b3AsIG9mZnNldCwgZikge1xuICAgICAgICBmcm9tID0gTWF0aC5tYXgoZnJvbSwgb2Zmc2V0KTtcbiAgICAgICAgdG8gPSBNYXRoLm1pbih0bywgb2Zmc2V0ICsgdGhpcy5sZW5ndGgpO1xuICAgICAgICBsZXQgeyBmaXJzdExpbmUsIHBlckxpbmUsIHBlckNoYXIgfSA9IHRoaXMuaGVpZ2h0TWV0cmljcyhvcmFjbGUsIG9mZnNldCk7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IGZyb20sIGxpbmVUb3AgPSB0b3A7IHBvcyA8PSB0bzspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gb3JhY2xlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgICAgIGlmIChwb3MgPT0gZnJvbSkge1xuICAgICAgICAgICAgICAgIGxldCBsaW5lc0Fib3ZlID0gbGluZS5udW1iZXIgLSBmaXJzdExpbmU7XG4gICAgICAgICAgICAgICAgbGluZVRvcCArPSBwZXJMaW5lICogbGluZXNBYm92ZSArIHBlckNoYXIgKiAoZnJvbSAtIG9mZnNldCAtIGxpbmVzQWJvdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGxpbmVIZWlnaHQgPSBwZXJMaW5lICsgcGVyQ2hhciAqIGxpbmUubGVuZ3RoO1xuICAgICAgICAgICAgZihuZXcgQmxvY2tJbmZvKGxpbmUuZnJvbSwgbGluZS5sZW5ndGgsIGxpbmVUb3AsIGxpbmVIZWlnaHQsIDApKTtcbiAgICAgICAgICAgIGxpbmVUb3AgKz0gbGluZUhlaWdodDtcbiAgICAgICAgICAgIHBvcyA9IGxpbmUudG8gKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UoZnJvbSwgdG8sIG5vZGVzKSB7XG4gICAgICAgIGxldCBhZnRlciA9IHRoaXMubGVuZ3RoIC0gdG87XG4gICAgICAgIGlmIChhZnRlciA+IDApIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcClcbiAgICAgICAgICAgICAgICBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXSA9IG5ldyBIZWlnaHRNYXBHYXAobGFzdC5sZW5ndGggKyBhZnRlcik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChudWxsLCBuZXcgSGVpZ2h0TWFwR2FwKGFmdGVyIC0gMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmcm9tID4gMCkge1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gbm9kZXNbMF07XG4gICAgICAgICAgICBpZiAoZmlyc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBHYXApXG4gICAgICAgICAgICAgICAgbm9kZXNbMF0gPSBuZXcgSGVpZ2h0TWFwR2FwKGZyb20gKyBmaXJzdC5sZW5ndGgpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG5vZGVzLnVuc2hpZnQobmV3IEhlaWdodE1hcEdhcChmcm9tIC0gMSksIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBIZWlnaHRNYXAub2Yobm9kZXMpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VMZWZ0KHRvLCByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IEhlaWdodE1hcEdhcCh0byAtIDEpLCBudWxsKTtcbiAgICB9XG4gICAgZGVjb21wb3NlUmlnaHQoZnJvbSwgcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG51bGwsIG5ldyBIZWlnaHRNYXBHYXAodGhpcy5sZW5ndGggLSBmcm9tIC0gMSkpO1xuICAgIH1cbiAgICB1cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQgPSAwLCBmb3JjZSA9IGZhbHNlLCBtZWFzdXJlZCkge1xuICAgICAgICBsZXQgZW5kID0gb2Zmc2V0ICsgdGhpcy5sZW5ndGg7XG4gICAgICAgIGlmIChtZWFzdXJlZCAmJiBtZWFzdXJlZC5mcm9tIDw9IG9mZnNldCArIHRoaXMubGVuZ3RoICYmIG1lYXN1cmVkLm1vcmUpIHtcbiAgICAgICAgICAgIC8vIEZpbGwgaW4gcGFydCBvZiB0aGlzIGdhcCB3aXRoIG1lYXN1cmVkIGxpbmVzLiBXZSBrbm93IHRoZXJlXG4gICAgICAgICAgICAvLyBjYW4ndCBiZSB3aWRnZXRzIG9yIGNvbGxhcHNlZCByYW5nZXMgaW4gdGhvc2UgbGluZXMsIGJlY2F1c2VcbiAgICAgICAgICAgIC8vIHRoZXkgd291bGQgYWxyZWFkeSBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGhlaWdodG1hcCAoZ2Fwc1xuICAgICAgICAgICAgLy8gb25seSBjb250YWluIHBsYWluIHRleHQpLlxuICAgICAgICAgICAgbGV0IG5vZGVzID0gW10sIHBvcyA9IE1hdGgubWF4KG9mZnNldCwgbWVhc3VyZWQuZnJvbSksIHNpbmdsZUhlaWdodCA9IC0xO1xuICAgICAgICAgICAgaWYgKG1lYXN1cmVkLmZyb20gPiBvZmZzZXQpXG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChuZXcgSGVpZ2h0TWFwR2FwKG1lYXN1cmVkLmZyb20gLSBvZmZzZXQgLSAxKS51cGRhdGVIZWlnaHQob3JhY2xlLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIHdoaWxlIChwb3MgPD0gZW5kICYmIG1lYXN1cmVkLm1vcmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gb3JhY2xlLmRvYy5saW5lQXQocG9zKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gbWVhc3VyZWQuaGVpZ2h0c1ttZWFzdXJlZC5pbmRleCsrXTtcbiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlSGVpZ2h0ID09IC0xKVxuICAgICAgICAgICAgICAgICAgICBzaW5nbGVIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoaGVpZ2h0IC0gc2luZ2xlSGVpZ2h0KSA+PSBFcHNpbG9uKVxuICAgICAgICAgICAgICAgICAgICBzaW5nbGVIZWlnaHQgPSAtMjtcbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IG5ldyBIZWlnaHRNYXBUZXh0KGxlbiwgaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBsaW5lLm91dGRhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gbGVuICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgPD0gZW5kKVxuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobnVsbCwgbmV3IEhlaWdodE1hcEdhcChlbmQgLSBwb3MpLnVwZGF0ZUhlaWdodChvcmFjbGUsIHBvcykpO1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IEhlaWdodE1hcC5vZihub2Rlcyk7XG4gICAgICAgICAgICBpZiAoc2luZ2xlSGVpZ2h0IDwgMCB8fCBNYXRoLmFicyhyZXN1bHQuaGVpZ2h0IC0gdGhpcy5oZWlnaHQpID49IEVwc2lsb24gfHxcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhzaW5nbGVIZWlnaHQgLSB0aGlzLmhlaWdodE1ldHJpY3Mob3JhY2xlLCBvZmZzZXQpLnBlckxpbmUpID49IEVwc2lsb24pXG4gICAgICAgICAgICAgICAgb3JhY2xlLmhlaWdodENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmb3JjZSB8fCB0aGlzLm91dGRhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodChvcmFjbGUsIG9yYWNsZS5oZWlnaHRGb3JHYXAob2Zmc2V0LCBvZmZzZXQgKyB0aGlzLmxlbmd0aCkpO1xuICAgICAgICAgICAgdGhpcy5vdXRkYXRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIGBnYXAoJHt0aGlzLmxlbmd0aH0pYDsgfVxufVxuY2xhc3MgSGVpZ2h0TWFwQnJhbmNoIGV4dGVuZHMgSGVpZ2h0TWFwIHtcbiAgICBjb25zdHJ1Y3RvcihsZWZ0LCBicmssIHJpZ2h0KSB7XG4gICAgICAgIHN1cGVyKGxlZnQubGVuZ3RoICsgYnJrICsgcmlnaHQubGVuZ3RoLCBsZWZ0LmhlaWdodCArIHJpZ2h0LmhlaWdodCwgYnJrIHwgKGxlZnQub3V0ZGF0ZWQgfHwgcmlnaHQub3V0ZGF0ZWQgPyAyIC8qIEZsYWcuT3V0ZGF0ZWQgKi8gOiAwKSk7XG4gICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcbiAgICAgICAgdGhpcy5zaXplID0gbGVmdC5zaXplICsgcmlnaHQuc2l6ZTtcbiAgICB9XG4gICAgZ2V0IGJyZWFrKCkgeyByZXR1cm4gdGhpcy5mbGFncyAmIDEgLyogRmxhZy5CcmVhayAqLzsgfVxuICAgIGJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIHRvcCwgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBtaWQgPSB0b3AgKyB0aGlzLmxlZnQuaGVpZ2h0O1xuICAgICAgICByZXR1cm4gaGVpZ2h0IDwgbWlkID8gdGhpcy5sZWZ0LmJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIHRvcCwgb2Zmc2V0KVxuICAgICAgICAgICAgOiB0aGlzLnJpZ2h0LmJsb2NrQXQoaGVpZ2h0LCBvcmFjbGUsIG1pZCwgb2Zmc2V0ICsgdGhpcy5sZWZ0Lmxlbmd0aCArIHRoaXMuYnJlYWspO1xuICAgIH1cbiAgICBsaW5lQXQodmFsdWUsIHR5cGUsIG9yYWNsZSwgdG9wLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IHJpZ2h0VG9wID0gdG9wICsgdGhpcy5sZWZ0LmhlaWdodCwgcmlnaHRPZmZzZXQgPSBvZmZzZXQgKyB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhaztcbiAgICAgICAgbGV0IGxlZnQgPSB0eXBlID09IFF1ZXJ5VHlwZS5CeUhlaWdodCA/IHZhbHVlIDwgcmlnaHRUb3AgOiB2YWx1ZSA8IHJpZ2h0T2Zmc2V0O1xuICAgICAgICBsZXQgYmFzZSA9IGxlZnQgPyB0aGlzLmxlZnQubGluZUF0KHZhbHVlLCB0eXBlLCBvcmFjbGUsIHRvcCwgb2Zmc2V0KVxuICAgICAgICAgICAgOiB0aGlzLnJpZ2h0LmxpbmVBdCh2YWx1ZSwgdHlwZSwgb3JhY2xlLCByaWdodFRvcCwgcmlnaHRPZmZzZXQpO1xuICAgICAgICBpZiAodGhpcy5icmVhayB8fCAobGVmdCA/IGJhc2UudG8gPCByaWdodE9mZnNldCA6IGJhc2UuZnJvbSA+IHJpZ2h0T2Zmc2V0KSlcbiAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICBsZXQgc3ViUXVlcnkgPSB0eXBlID09IFF1ZXJ5VHlwZS5CeVBvc05vSGVpZ2h0ID8gUXVlcnlUeXBlLkJ5UG9zTm9IZWlnaHQgOiBRdWVyeVR5cGUuQnlQb3M7XG4gICAgICAgIGlmIChsZWZ0KVxuICAgICAgICAgICAgcmV0dXJuIGJhc2Uuam9pbih0aGlzLnJpZ2h0LmxpbmVBdChyaWdodE9mZnNldCwgc3ViUXVlcnksIG9yYWNsZSwgcmlnaHRUb3AsIHJpZ2h0T2Zmc2V0KSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQubGluZUF0KHJpZ2h0T2Zmc2V0LCBzdWJRdWVyeSwgb3JhY2xlLCB0b3AsIG9mZnNldCkuam9pbihiYXNlKTtcbiAgICB9XG4gICAgZm9yRWFjaExpbmUoZnJvbSwgdG8sIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpIHtcbiAgICAgICAgbGV0IHJpZ2h0VG9wID0gdG9wICsgdGhpcy5sZWZ0LmhlaWdodCwgcmlnaHRPZmZzZXQgPSBvZmZzZXQgKyB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhaztcbiAgICAgICAgaWYgKHRoaXMuYnJlYWspIHtcbiAgICAgICAgICAgIGlmIChmcm9tIDwgcmlnaHRPZmZzZXQpXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0LmZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHRvcCwgb2Zmc2V0LCBmKTtcbiAgICAgICAgICAgIGlmICh0byA+PSByaWdodE9mZnNldClcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hMaW5lKGZyb20sIHRvLCBvcmFjbGUsIHJpZ2h0VG9wLCByaWdodE9mZnNldCwgZik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gdGhpcy5saW5lQXQocmlnaHRPZmZzZXQsIFF1ZXJ5VHlwZS5CeVBvcywgb3JhY2xlLCB0b3AsIG9mZnNldCk7XG4gICAgICAgICAgICBpZiAoZnJvbSA8IG1pZC5mcm9tKVxuICAgICAgICAgICAgICAgIHRoaXMubGVmdC5mb3JFYWNoTGluZShmcm9tLCBtaWQuZnJvbSAtIDEsIG9yYWNsZSwgdG9wLCBvZmZzZXQsIGYpO1xuICAgICAgICAgICAgaWYgKG1pZC50byA+PSBmcm9tICYmIG1pZC5mcm9tIDw9IHRvKVxuICAgICAgICAgICAgICAgIGYobWlkKTtcbiAgICAgICAgICAgIGlmICh0byA+IG1pZC50bylcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hMaW5lKG1pZC50byArIDEsIHRvLCBvcmFjbGUsIHJpZ2h0VG9wLCByaWdodE9mZnNldCwgZik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShmcm9tLCB0bywgbm9kZXMpIHtcbiAgICAgICAgbGV0IHJpZ2h0U3RhcnQgPSB0aGlzLmxlZnQubGVuZ3RoICsgdGhpcy5icmVhaztcbiAgICAgICAgaWYgKHRvIDwgcmlnaHRTdGFydClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhbGFuY2VkKHRoaXMubGVmdC5yZXBsYWNlKGZyb20sIHRvLCBub2RlcyksIHRoaXMucmlnaHQpO1xuICAgICAgICBpZiAoZnJvbSA+IHRoaXMubGVmdC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWxhbmNlZCh0aGlzLmxlZnQsIHRoaXMucmlnaHQucmVwbGFjZShmcm9tIC0gcmlnaHRTdGFydCwgdG8gLSByaWdodFN0YXJ0LCBub2RlcykpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGlmIChmcm9tID4gMClcbiAgICAgICAgICAgIHRoaXMuZGVjb21wb3NlTGVmdChmcm9tLCByZXN1bHQpO1xuICAgICAgICBsZXQgbGVmdCA9IHJlc3VsdC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IG5vZGUgb2Ygbm9kZXMpXG4gICAgICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgaWYgKGZyb20gPiAwKVxuICAgICAgICAgICAgbWVyZ2VHYXBzKHJlc3VsdCwgbGVmdCAtIDEpO1xuICAgICAgICBpZiAodG8gPCB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJpZ2h0ID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZGVjb21wb3NlUmlnaHQodG8sIHJlc3VsdCk7XG4gICAgICAgICAgICBtZXJnZUdhcHMocmVzdWx0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZihyZXN1bHQpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VMZWZ0KHRvLCByZXN1bHQpIHtcbiAgICAgICAgbGV0IGxlZnQgPSB0aGlzLmxlZnQubGVuZ3RoO1xuICAgICAgICBpZiAodG8gPD0gbGVmdClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQuZGVjb21wb3NlTGVmdCh0bywgcmVzdWx0KTtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5sZWZ0KTtcbiAgICAgICAgaWYgKHRoaXMuYnJlYWspIHtcbiAgICAgICAgICAgIGxlZnQrKztcbiAgICAgICAgICAgIGlmICh0byA+PSBsZWZ0KVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0byA+IGxlZnQpXG4gICAgICAgICAgICB0aGlzLnJpZ2h0LmRlY29tcG9zZUxlZnQodG8gLSBsZWZ0LCByZXN1bHQpO1xuICAgIH1cbiAgICBkZWNvbXBvc2VSaWdodChmcm9tLCByZXN1bHQpIHtcbiAgICAgICAgbGV0IGxlZnQgPSB0aGlzLmxlZnQubGVuZ3RoLCByaWdodCA9IGxlZnQgKyB0aGlzLmJyZWFrO1xuICAgICAgICBpZiAoZnJvbSA+PSByaWdodClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LmRlY29tcG9zZVJpZ2h0KGZyb20gLSByaWdodCwgcmVzdWx0KTtcbiAgICAgICAgaWYgKGZyb20gPCBsZWZ0KVxuICAgICAgICAgICAgdGhpcy5sZWZ0LmRlY29tcG9zZVJpZ2h0KGZyb20sIHJlc3VsdCk7XG4gICAgICAgIGlmICh0aGlzLmJyZWFrICYmIGZyb20gPCByaWdodClcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnJpZ2h0KTtcbiAgICB9XG4gICAgYmFsYW5jZWQobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgaWYgKGxlZnQuc2l6ZSA+IDIgKiByaWdodC5zaXplIHx8IHJpZ2h0LnNpemUgPiAyICogbGVmdC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIEhlaWdodE1hcC5vZih0aGlzLmJyZWFrID8gW2xlZnQsIG51bGwsIHJpZ2h0XSA6IFtsZWZ0LCByaWdodF0pO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gbGVmdC5oZWlnaHQgKyByaWdodC5oZWlnaHQ7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBsZWZ0Lm91dGRhdGVkIHx8IHJpZ2h0Lm91dGRhdGVkO1xuICAgICAgICB0aGlzLnNpemUgPSBsZWZ0LnNpemUgKyByaWdodC5zaXplO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlZnQubGVuZ3RoICsgdGhpcy5icmVhayArIHJpZ2h0Lmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCA9IDAsIGZvcmNlID0gZmFsc2UsIG1lYXN1cmVkKSB7XG4gICAgICAgIGxldCB7IGxlZnQsIHJpZ2h0IH0gPSB0aGlzLCByaWdodFN0YXJ0ID0gb2Zmc2V0ICsgbGVmdC5sZW5ndGggKyB0aGlzLmJyZWFrLCByZWJhbGFuY2UgPSBudWxsO1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSBvZmZzZXQgKyBsZWZ0Lmxlbmd0aCAmJiBtZWFzdXJlZC5tb3JlKVxuICAgICAgICAgICAgcmViYWxhbmNlID0gbGVmdCA9IGxlZnQudXBkYXRlSGVpZ2h0KG9yYWNsZSwgb2Zmc2V0LCBmb3JjZSwgbWVhc3VyZWQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZWZ0LnVwZGF0ZUhlaWdodChvcmFjbGUsIG9mZnNldCwgZm9yY2UpO1xuICAgICAgICBpZiAobWVhc3VyZWQgJiYgbWVhc3VyZWQuZnJvbSA8PSByaWdodFN0YXJ0ICsgcmlnaHQubGVuZ3RoICYmIG1lYXN1cmVkLm1vcmUpXG4gICAgICAgICAgICByZWJhbGFuY2UgPSByaWdodCA9IHJpZ2h0LnVwZGF0ZUhlaWdodChvcmFjbGUsIHJpZ2h0U3RhcnQsIGZvcmNlLCBtZWFzdXJlZCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJpZ2h0LnVwZGF0ZUhlaWdodChvcmFjbGUsIHJpZ2h0U3RhcnQsIGZvcmNlKTtcbiAgICAgICAgaWYgKHJlYmFsYW5jZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhbGFuY2VkKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmxlZnQuaGVpZ2h0ICsgdGhpcy5yaWdodC5oZWlnaHQ7XG4gICAgICAgIHRoaXMub3V0ZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gdGhpcy5sZWZ0ICsgKHRoaXMuYnJlYWsgPyBcIiBcIiA6IFwiLVwiKSArIHRoaXMucmlnaHQ7IH1cbn1cbmZ1bmN0aW9uIG1lcmdlR2Fwcyhub2RlcywgYXJvdW5kKSB7XG4gICAgbGV0IGJlZm9yZSwgYWZ0ZXI7XG4gICAgaWYgKG5vZGVzW2Fyb3VuZF0gPT0gbnVsbCAmJlxuICAgICAgICAoYmVmb3JlID0gbm9kZXNbYXJvdW5kIC0gMV0pIGluc3RhbmNlb2YgSGVpZ2h0TWFwR2FwICYmXG4gICAgICAgIChhZnRlciA9IG5vZGVzW2Fyb3VuZCArIDFdKSBpbnN0YW5jZW9mIEhlaWdodE1hcEdhcClcbiAgICAgICAgbm9kZXMuc3BsaWNlKGFyb3VuZCAtIDEsIDMsIG5ldyBIZWlnaHRNYXBHYXAoYmVmb3JlLmxlbmd0aCArIDEgKyBhZnRlci5sZW5ndGgpKTtcbn1cbmNvbnN0IHJlbGV2YW50V2lkZ2V0SGVpZ2h0ID0gNTtcbmNsYXNzIE5vZGVCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3MsIG9yYWNsZSkge1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5vcmFjbGUgPSBvcmFjbGU7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbXTtcbiAgICAgICAgdGhpcy5saW5lU3RhcnQgPSAtMTtcbiAgICAgICAgdGhpcy5saW5lRW5kID0gLTE7XG4gICAgICAgIHRoaXMuY292ZXJpbmcgPSBudWxsO1xuICAgICAgICB0aGlzLndyaXR0ZW5UbyA9IHBvcztcbiAgICB9XG4gICAgZ2V0IGlzQ292ZXJlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY292ZXJpbmcgJiYgdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdID09IHRoaXMuY292ZXJpbmc7XG4gICAgfVxuICAgIHNwYW4oX2Zyb20sIHRvKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmVTdGFydCA+IC0xKSB7XG4gICAgICAgICAgICBsZXQgZW5kID0gTWF0aC5taW4odG8sIHRoaXMubGluZUVuZCksIGxhc3QgPSB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQpXG4gICAgICAgICAgICAgICAgbGFzdC5sZW5ndGggKz0gZW5kIC0gdGhpcy5wb3M7XG4gICAgICAgICAgICBlbHNlIGlmIChlbmQgPiB0aGlzLnBvcyB8fCAhdGhpcy5pc0NvdmVyZWQpXG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBUZXh0KGVuZCAtIHRoaXMucG9zLCAtMSkpO1xuICAgICAgICAgICAgdGhpcy53cml0dGVuVG8gPSBlbmQ7XG4gICAgICAgICAgICBpZiAodG8gPiBlbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0dGVuVG8rKztcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zID0gdG87XG4gICAgfVxuICAgIHBvaW50KGZyb20sIHRvLCBkZWNvKSB7XG4gICAgICAgIGlmIChmcm9tIDwgdG8gfHwgZGVjby5oZWlnaHRSZWxldmFudCkge1xuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGRlY28ud2lkZ2V0ID8gZGVjby53aWRnZXQuZXN0aW1hdGVkSGVpZ2h0IDogMDtcbiAgICAgICAgICAgIGxldCBicmVha3MgPSBkZWNvLndpZGdldCA/IGRlY28ud2lkZ2V0LmxpbmVCcmVha3MgOiAwO1xuICAgICAgICAgICAgaWYgKGhlaWdodCA8IDApXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5vcmFjbGUubGluZUhlaWdodDtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0byAtIGZyb207XG4gICAgICAgICAgICBpZiAoZGVjby5ibG9jaykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQmxvY2sobmV3IEhlaWdodE1hcEJsb2NrKGxlbiwgaGVpZ2h0LCBkZWNvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsZW4gfHwgYnJlYWtzIHx8IGhlaWdodCA+PSByZWxldmFudFdpZGdldEhlaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkTGluZURlY28oaGVpZ2h0LCBicmVha3MsIGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodG8gPiBmcm9tKSB7XG4gICAgICAgICAgICB0aGlzLnNwYW4oZnJvbSwgdG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpbmVFbmQgPiAtMSAmJiB0aGlzLmxpbmVFbmQgPCB0aGlzLnBvcylcbiAgICAgICAgICAgIHRoaXMubGluZUVuZCA9IHRoaXMub3JhY2xlLmRvYy5saW5lQXQodGhpcy5wb3MpLnRvO1xuICAgIH1cbiAgICBlbnRlckxpbmUoKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmVTdGFydCA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gdGhpcy5vcmFjbGUuZG9jLmxpbmVBdCh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMubGluZVN0YXJ0ID0gZnJvbTtcbiAgICAgICAgdGhpcy5saW5lRW5kID0gdG87XG4gICAgICAgIGlmICh0aGlzLndyaXR0ZW5UbyA8IGZyb20pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLndyaXR0ZW5UbyA8IGZyb20gLSAxIHx8IHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaCh0aGlzLmJsYW5rQ29udGVudCh0aGlzLndyaXR0ZW5UbywgZnJvbSAtIDEpKTtcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wb3MgPiBmcm9tKVxuICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBUZXh0KHRoaXMucG9zIC0gZnJvbSwgLTEpKTtcbiAgICAgICAgdGhpcy53cml0dGVuVG8gPSB0aGlzLnBvcztcbiAgICB9XG4gICAgYmxhbmtDb250ZW50KGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBnYXAgPSBuZXcgSGVpZ2h0TWFwR2FwKHRvIC0gZnJvbSk7XG4gICAgICAgIGlmICh0aGlzLm9yYWNsZS5kb2MubGluZUF0KGZyb20pLnRvID09IHRvKVxuICAgICAgICAgICAgZ2FwLmZsYWdzIHw9IDQgLyogRmxhZy5TaW5nbGVMaW5lICovO1xuICAgICAgICByZXR1cm4gZ2FwO1xuICAgIH1cbiAgICBlbnN1cmVMaW5lKCkge1xuICAgICAgICB0aGlzLmVudGVyTGluZSgpO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMubm9kZXMubGVuZ3RoID8gdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBIZWlnaHRNYXBUZXh0KVxuICAgICAgICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgICAgIGxldCBsaW5lID0gbmV3IEhlaWdodE1hcFRleHQoMCwgLTEpO1xuICAgICAgICB0aGlzLm5vZGVzLnB1c2gobGluZSk7XG4gICAgICAgIHJldHVybiBsaW5lO1xuICAgIH1cbiAgICBhZGRCbG9jayhibG9jaykge1xuICAgICAgICB0aGlzLmVudGVyTGluZSgpO1xuICAgICAgICBsZXQgZGVjbyA9IGJsb2NrLmRlY287XG4gICAgICAgIGlmIChkZWNvICYmIGRlY28uc3RhcnRTaWRlID4gMCAmJiAhdGhpcy5pc0NvdmVyZWQpXG4gICAgICAgICAgICB0aGlzLmVuc3VyZUxpbmUoKTtcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgdGhpcy53cml0dGVuVG8gPSB0aGlzLnBvcyA9IHRoaXMucG9zICsgYmxvY2subGVuZ3RoO1xuICAgICAgICBpZiAoZGVjbyAmJiBkZWNvLmVuZFNpZGUgPiAwKVxuICAgICAgICAgICAgdGhpcy5jb3ZlcmluZyA9IGJsb2NrO1xuICAgIH1cbiAgICBhZGRMaW5lRGVjbyhoZWlnaHQsIGJyZWFrcywgbGVuZ3RoKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5lbnN1cmVMaW5lKCk7XG4gICAgICAgIGxpbmUubGVuZ3RoICs9IGxlbmd0aDtcbiAgICAgICAgbGluZS5jb2xsYXBzZWQgKz0gbGVuZ3RoO1xuICAgICAgICBsaW5lLndpZGdldEhlaWdodCA9IE1hdGgubWF4KGxpbmUud2lkZ2V0SGVpZ2h0LCBoZWlnaHQpO1xuICAgICAgICBsaW5lLmJyZWFrcyArPSBicmVha3M7XG4gICAgICAgIHRoaXMud3JpdHRlblRvID0gdGhpcy5wb3MgPSB0aGlzLnBvcyArIGxlbmd0aDtcbiAgICB9XG4gICAgZmluaXNoKGZyb20pIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLm5vZGVzLmxlbmd0aCA9PSAwID8gbnVsbCA6IHRoaXMubm9kZXNbdGhpcy5ub2Rlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKHRoaXMubGluZVN0YXJ0ID4gLTEgJiYgIShsYXN0IGluc3RhbmNlb2YgSGVpZ2h0TWFwVGV4dCkgJiYgIXRoaXMuaXNDb3ZlcmVkKVxuICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBIZWlnaHRNYXBUZXh0KDAsIC0xKSk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMud3JpdHRlblRvIDwgdGhpcy5wb3MgfHwgbGFzdCA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKHRoaXMuYmxhbmtDb250ZW50KHRoaXMud3JpdHRlblRvLCB0aGlzLnBvcykpO1xuICAgICAgICBsZXQgcG9zID0gZnJvbTtcbiAgICAgICAgZm9yIChsZXQgbm9kZSBvZiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEhlaWdodE1hcFRleHQpXG4gICAgICAgICAgICAgICAgbm9kZS51cGRhdGVIZWlnaHQodGhpcy5vcmFjbGUsIHBvcyk7XG4gICAgICAgICAgICBwb3MgKz0gbm9kZSA/IG5vZGUubGVuZ3RoIDogMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ub2RlcztcbiAgICB9XG4gICAgLy8gQWx3YXlzIGNhbGxlZCB3aXRoIGEgcmVnaW9uIHRoYXQgb24gYm90aCBzaWRlcyBlaXRoZXIgc3RyZXRjaGVzXG4gICAgLy8gdG8gYSBsaW5lIGJyZWFrIG9yIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICAgIC8vIFRoZSByZXR1cm5lZCBhcnJheSB1c2VzIG51bGwgdG8gaW5kaWNhdGUgbGluZSBicmVha3MsIGJ1dCBuZXZlclxuICAgIC8vIHN0YXJ0cyBvciBlbmRzIGluIGEgbGluZSBicmVhaywgb3IgaGFzIG11bHRpcGxlIGxpbmUgYnJlYWtzIG5leHRcbiAgICAvLyB0byBlYWNoIG90aGVyLlxuICAgIHN0YXRpYyBidWlsZChvcmFjbGUsIGRlY29yYXRpb25zLCBmcm9tLCB0bykge1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBOb2RlQnVpbGRlcihmcm9tLCBvcmFjbGUpO1xuICAgICAgICBSYW5nZVNldC5zcGFucyhkZWNvcmF0aW9ucywgZnJvbSwgdG8sIGJ1aWxkZXIsIDApO1xuICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goZnJvbSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGVpZ2h0UmVsZXZhbnREZWNvQ2hhbmdlcyhhLCBiLCBkaWZmKSB7XG4gICAgbGV0IGNvbXAgPSBuZXcgRGVjb3JhdGlvbkNvbXBhcmF0b3I7XG4gICAgUmFuZ2VTZXQuY29tcGFyZShhLCBiLCBkaWZmLCBjb21wLCAwKTtcbiAgICByZXR1cm4gY29tcC5jaGFuZ2VzO1xufVxuY2xhc3MgRGVjb3JhdGlvbkNvbXBhcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMgPSBbXTtcbiAgICB9XG4gICAgY29tcGFyZVJhbmdlKCkgeyB9XG4gICAgY29tcGFyZVBvaW50KGZyb20sIHRvLCBhLCBiKSB7XG4gICAgICAgIGlmIChmcm9tIDwgdG8gfHwgYSAmJiBhLmhlaWdodFJlbGV2YW50IHx8IGIgJiYgYi5oZWlnaHRSZWxldmFudClcbiAgICAgICAgICAgIGFkZFJhbmdlKGZyb20sIHRvLCB0aGlzLmNoYW5nZXMsIDUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdmlzaWJsZVBpeGVsUmFuZ2UoZG9tLCBwYWRkaW5nVG9wKSB7XG4gICAgbGV0IHJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IGRvYyA9IGRvbS5vd25lckRvY3VtZW50LCB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIGxldCBsZWZ0ID0gTWF0aC5tYXgoMCwgcmVjdC5sZWZ0KSwgcmlnaHQgPSBNYXRoLm1pbih3aW4uaW5uZXJXaWR0aCwgcmVjdC5yaWdodCk7XG4gICAgbGV0IHRvcCA9IE1hdGgubWF4KDAsIHJlY3QudG9wKSwgYm90dG9tID0gTWF0aC5taW4od2luLmlubmVySGVpZ2h0LCByZWN0LmJvdHRvbSk7XG4gICAgZm9yIChsZXQgcGFyZW50ID0gZG9tLnBhcmVudE5vZGU7IHBhcmVudCAmJiBwYXJlbnQgIT0gZG9jLmJvZHk7KSB7XG4gICAgICAgIGlmIChwYXJlbnQubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgbGV0IGVsdCA9IHBhcmVudDtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsdCk7XG4gICAgICAgICAgICBpZiAoKGVsdC5zY3JvbGxIZWlnaHQgPiBlbHQuY2xpZW50SGVpZ2h0IHx8IGVsdC5zY3JvbGxXaWR0aCA+IGVsdC5jbGllbnRXaWR0aCkgJiZcbiAgICAgICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyAhPSBcInZpc2libGVcIikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRSZWN0ID0gZWx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGxlZnQgPSBNYXRoLm1heChsZWZ0LCBwYXJlbnRSZWN0LmxlZnQpO1xuICAgICAgICAgICAgICAgIHJpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIHBhcmVudFJlY3QucmlnaHQpO1xuICAgICAgICAgICAgICAgIHRvcCA9IE1hdGgubWF4KHRvcCwgcGFyZW50UmVjdC50b3ApO1xuICAgICAgICAgICAgICAgIGJvdHRvbSA9IHBhcmVudCA9PSBkb20ucGFyZW50Tm9kZSA/IHBhcmVudFJlY3QuYm90dG9tIDogTWF0aC5taW4oYm90dG9tLCBwYXJlbnRSZWN0LmJvdHRvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnQgPSBzdHlsZS5wb3NpdGlvbiA9PSBcImFic29sdXRlXCIgfHwgc3R5bGUucG9zaXRpb24gPT0gXCJmaXhlZFwiID8gZWx0Lm9mZnNldFBhcmVudCA6IGVsdC5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhcmVudC5ub2RlVHlwZSA9PSAxMSkgeyAvLyBTaGFkb3cgcm9vdFxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Lmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBsZWZ0OiBsZWZ0IC0gcmVjdC5sZWZ0LCByaWdodDogTWF0aC5tYXgobGVmdCwgcmlnaHQpIC0gcmVjdC5sZWZ0LFxuICAgICAgICB0b3A6IHRvcCAtIChyZWN0LnRvcCArIHBhZGRpbmdUb3ApLCBib3R0b206IE1hdGgubWF4KHRvcCwgYm90dG9tKSAtIChyZWN0LnRvcCArIHBhZGRpbmdUb3ApIH07XG59XG5mdW5jdGlvbiBmdWxsUGl4ZWxSYW5nZShkb20sIHBhZGRpbmdUb3ApIHtcbiAgICBsZXQgcmVjdCA9IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4geyBsZWZ0OiAwLCByaWdodDogcmVjdC5yaWdodCAtIHJlY3QubGVmdCxcbiAgICAgICAgdG9wOiBwYWRkaW5nVG9wLCBib3R0b206IHJlY3QuYm90dG9tIC0gKHJlY3QudG9wICsgcGFkZGluZ1RvcCkgfTtcbn1cbi8vIExpbmUgZ2FwcyBhcmUgcGxhY2Vob2xkZXIgd2lkZ2V0cyB1c2VkIHRvIGhpZGUgcGllY2VzIG9mIG92ZXJsb25nXG4vLyBsaW5lcyB3aXRoaW4gdGhlIHZpZXdwb3J0LCBhcyBhIGtsdWRnZSB0byBrZWVwIHRoZSBlZGl0b3Jcbi8vIHJlc3BvbnNpdmUgd2hlbiBhIHJpZGljdWxvdXNseSBsb25nIGxpbmUgaXMgbG9hZGVkIGludG8gaXQuXG5jbGFzcyBMaW5lR2FwIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bywgc2l6ZSkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgfVxuICAgIHN0YXRpYyBzYW1lKGEsIGIpIHtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBnQSA9IGFbaV0sIGdCID0gYltpXTtcbiAgICAgICAgICAgIGlmIChnQS5mcm9tICE9IGdCLmZyb20gfHwgZ0EudG8gIT0gZ0IudG8gfHwgZ0Euc2l6ZSAhPSBnQi5zaXplKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZHJhdyh2aWV3U3RhdGUsIHdyYXBwaW5nKSB7XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnJlcGxhY2Uoe1xuICAgICAgICAgICAgd2lkZ2V0OiBuZXcgTGluZUdhcFdpZGdldCh0aGlzLnNpemUgKiAod3JhcHBpbmcgPyB2aWV3U3RhdGUuc2NhbGVZIDogdmlld1N0YXRlLnNjYWxlWCksIHdyYXBwaW5nKVxuICAgICAgICB9KS5yYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xuICAgIH1cbn1cbmNsYXNzIExpbmVHYXBXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihzaXplLCB2ZXJ0aWNhbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLnZlcnRpY2FsID0gdmVydGljYWw7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlci5zaXplID09IHRoaXMuc2l6ZSAmJiBvdGhlci52ZXJ0aWNhbCA9PSB0aGlzLnZlcnRpY2FsOyB9XG4gICAgdG9ET00oKSB7XG4gICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBpZiAodGhpcy52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgZWx0LnN0eWxlLmhlaWdodCA9IHRoaXMuc2l6ZSArIFwicHhcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVsdC5zdHlsZS53aWR0aCA9IHRoaXMuc2l6ZSArIFwicHhcIjtcbiAgICAgICAgICAgIGVsdC5zdHlsZS5oZWlnaHQgPSBcIjJweFwiO1xuICAgICAgICAgICAgZWx0LnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbHQ7XG4gICAgfVxuICAgIGdldCBlc3RpbWF0ZWRIZWlnaHQoKSB7IHJldHVybiB0aGlzLnZlcnRpY2FsID8gdGhpcy5zaXplIDogLTE7IH1cbn1cbmNsYXNzIFZpZXdTdGF0ZSB7XG4gICAgY29uc3RydWN0b3Ioc3RhdGUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAvLyBUaGVzZSBhcmUgY29udGVudERPTS1sb2NhbCBjb29yZGluYXRlc1xuICAgICAgICB0aGlzLnBpeGVsVmlld3BvcnQgPSB7IGxlZnQ6IDAsIHJpZ2h0OiB3aW5kb3cuaW5uZXJXaWR0aCwgdG9wOiAwLCBib3R0b206IDAgfTtcbiAgICAgICAgdGhpcy5pblZpZXcgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhZGRpbmdUb3AgPSAwOyAvLyBQYWRkaW5nIGFib3ZlIHRoZSBkb2N1bWVudCwgc2NhbGVkXG4gICAgICAgIHRoaXMucGFkZGluZ0JvdHRvbSA9IDA7IC8vIFBhZGRpbmcgYmVsb3cgdGhlIGRvY3VtZW50LCBzY2FsZWRcbiAgICAgICAgdGhpcy5jb250ZW50RE9NV2lkdGggPSAwOyAvLyBjb250ZW50RE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoXG4gICAgICAgIHRoaXMuY29udGVudERPTUhlaWdodCA9IDA7IC8vIGNvbnRlbnRET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgIHRoaXMuZWRpdG9ySGVpZ2h0ID0gMDsgLy8gc2Nyb2xsRE9NLmNsaWVudEhlaWdodCwgdW5zY2FsZWRcbiAgICAgICAgdGhpcy5lZGl0b3JXaWR0aCA9IDA7IC8vIHNjcm9sbERPTS5jbGllbnRXaWR0aCwgdW5zY2FsZWRcbiAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSAwOyAvLyBMYXN0IHNlZW4gc2Nyb2xsRE9NLnNjcm9sbFRvcCwgc2NhbGVkXG4gICAgICAgIHRoaXMuc2Nyb2xsZWRUb0JvdHRvbSA9IHRydWU7XG4gICAgICAgIC8vIFRoZSBDU1MtdHJhbnNmb3JtYXRpb24gc2NhbGUgb2YgdGhlIGVkaXRvciAodHJhbnNmb3JtZWQgc2l6ZSAvXG4gICAgICAgIC8vIGNvbmNyZXRlIHNpemUpXG4gICAgICAgIHRoaXMuc2NhbGVYID0gMTtcbiAgICAgICAgdGhpcy5zY2FsZVkgPSAxO1xuICAgICAgICAvLyBUaGUgdmVydGljYWwgcG9zaXRpb24gKGRvY3VtZW50LXJlbGF0aXZlKSB0byB3aGljaCB0byBhbmNob3IgdGhlXG4gICAgICAgIC8vIHNjcm9sbCBwb3NpdGlvbi4gLTEgbWVhbnMgYW5jaG9yIHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICAgICAgICB0aGlzLnNjcm9sbEFuY2hvclBvcyA9IDA7XG4gICAgICAgIC8vIFRoZSBoZWlnaHQgYXQgdGhlIGFuY2hvciBwb3NpdGlvbi4gU2V0IGJ5IHRoZSBET00gdXBkYXRlIHBoYXNlLlxuICAgICAgICAvLyAtMSBtZWFucyBubyBoZWlnaHQgYXZhaWxhYmxlLlxuICAgICAgICB0aGlzLnNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAvLyBTZWUgVlAuTWF4RE9NSGVpZ2h0XG4gICAgICAgIHRoaXMuc2NhbGVyID0gSWRTY2FsZXI7XG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgLy8gQnJpZWZseSBzZXQgdG8gdHJ1ZSB3aGVuIHByaW50aW5nLCB0byBkaXNhYmxlIHZpZXdwb3J0IGxpbWl0aW5nXG4gICAgICAgIHRoaXMucHJpbnRpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gRmxhZyBzZXQgd2hlbiBlZGl0b3IgY29udGVudCB3YXMgcmVkcmF3biwgc28gdGhhdCB0aGUgbmV4dFxuICAgICAgICAvLyBtZWFzdXJlIHN0YWdlIGtub3dzIGl0IG11c3QgcmVhZCBET00gbGF5b3V0XG4gICAgICAgIHRoaXMubXVzdE1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VGV4dERpcmVjdGlvbiA9IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIHRoaXMudmlzaWJsZVJhbmdlcyA9IFtdO1xuICAgICAgICAvLyBDdXJzb3IgJ2Fzc29jJyBpcyBvbmx5IHNpZ25pZmljYW50IHdoZW4gdGhlIGN1cnNvciBpcyBvbiBhIGxpbmVcbiAgICAgICAgLy8gd3JhcCBwb2ludCwgd2hlcmUgaXQgbXVzdCBzdGljayB0byB0aGUgY2hhcmFjdGVyIHRoYXQgaXQgaXNcbiAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoLiBTaW5jZSBicm93c2VycyBkb24ndCBwcm92aWRlIGEgcmVhc29uYWJsZVxuICAgICAgICAvLyBpbnRlcmZhY2UgdG8gc2V0IG9yIHF1ZXJ5IHRoaXMsIHdoZW4gYSBzZWxlY3Rpb24gaXMgc2V0IHRoYXRcbiAgICAgICAgLy8gbWlnaHQgY2F1c2UgdGhpcyB0byBiZSBzaWduaWZpY2FudCwgdGhpcyBmbGFnIGlzIHNldC4gVGhlIG5leHRcbiAgICAgICAgLy8gbWVhc3VyZSBwaGFzZSB3aWxsIGNoZWNrIHdoZXRoZXIgdGhlIGN1cnNvciBpcyBvbiBhIGxpbmUtd3JhcHBpbmdcbiAgICAgICAgLy8gYm91bmRhcnkgYW5kLCBpZiBzbywgcmVzZXQgaXQgdG8gbWFrZSBzdXJlIGl0IGlzIHBvc2l0aW9uZWQgaW5cbiAgICAgICAgLy8gdGhlIHJpZ2h0IHBsYWNlLlxuICAgICAgICB0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgPSBmYWxzZTtcbiAgICAgICAgbGV0IGd1ZXNzV3JhcHBpbmcgPSBzdGF0ZS5mYWNldChjb250ZW50QXR0cmlidXRlcykuc29tZSh2ID0+IHR5cGVvZiB2ICE9IFwiZnVuY3Rpb25cIiAmJiB2LmNsYXNzID09IFwiY20tbGluZVdyYXBwaW5nXCIpO1xuICAgICAgICB0aGlzLmhlaWdodE9yYWNsZSA9IG5ldyBIZWlnaHRPcmFjbGUoZ3Vlc3NXcmFwcGluZyk7XG4gICAgICAgIHRoaXMuc3RhdGVEZWNvID0gc3RhdGUuZmFjZXQoZGVjb3JhdGlvbnMpLmZpbHRlcihkID0+IHR5cGVvZiBkICE9IFwiZnVuY3Rpb25cIik7XG4gICAgICAgIHRoaXMuaGVpZ2h0TWFwID0gSGVpZ2h0TWFwLmVtcHR5KCkuYXBwbHlDaGFuZ2VzKHRoaXMuc3RhdGVEZWNvLCBUZXh0LmVtcHR5LCB0aGlzLmhlaWdodE9yYWNsZS5zZXREb2Moc3RhdGUuZG9jKSwgW25ldyBDaGFuZ2VkUmFuZ2UoMCwgMCwgMCwgc3RhdGUuZG9jLmxlbmd0aCldKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld3BvcnQoMCwgbnVsbCk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnRMaW5lcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvclZpZXdwb3J0KCk7XG4gICAgICAgIHRoaXMubGluZUdhcHMgPSB0aGlzLmVuc3VyZUxpbmVHYXBzKFtdKTtcbiAgICAgICAgdGhpcy5saW5lR2FwRGVjbyA9IERlY29yYXRpb24uc2V0KHRoaXMubGluZUdhcHMubWFwKGdhcCA9PiBnYXAuZHJhdyh0aGlzLCBmYWxzZSkpKTtcbiAgICAgICAgdGhpcy5jb21wdXRlVmlzaWJsZVJhbmdlcygpO1xuICAgIH1cbiAgICB1cGRhdGVGb3JWaWV3cG9ydCgpIHtcbiAgICAgICAgbGV0IHZpZXdwb3J0cyA9IFt0aGlzLnZpZXdwb3J0XSwgeyBtYWluIH0gPSB0aGlzLnN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gaSA/IG1haW4uaGVhZCA6IG1haW4uYW5jaG9yO1xuICAgICAgICAgICAgaWYgKCF2aWV3cG9ydHMuc29tZSgoeyBmcm9tLCB0byB9KSA9PiBwb3MgPj0gZnJvbSAmJiBwb3MgPD0gdG8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHRoaXMubGluZUJsb2NrQXQocG9zKTtcbiAgICAgICAgICAgICAgICB2aWV3cG9ydHMucHVzaChuZXcgVmlld3BvcnQoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpZXdwb3J0cyA9IHZpZXdwb3J0cy5zb3J0KChhLCBiKSA9PiBhLmZyb20gLSBiLmZyb20pO1xuICAgICAgICB0aGlzLnNjYWxlciA9IHRoaXMuaGVpZ2h0TWFwLmhlaWdodCA8PSA3MDAwMDAwIC8qIFZQLk1heERPTUhlaWdodCAqLyA/IElkU2NhbGVyIDpcbiAgICAgICAgICAgIG5ldyBCaWdTY2FsZXIodGhpcy5oZWlnaHRPcmFjbGUsIHRoaXMuaGVpZ2h0TWFwLCB0aGlzLnZpZXdwb3J0cyk7XG4gICAgfVxuICAgIHVwZGF0ZVZpZXdwb3J0TGluZXMoKSB7XG4gICAgICAgIHRoaXMudmlld3BvcnRMaW5lcyA9IFtdO1xuICAgICAgICB0aGlzLmhlaWdodE1hcC5mb3JFYWNoTGluZSh0aGlzLnZpZXdwb3J0LmZyb20sIHRoaXMudmlld3BvcnQudG8sIHRoaXMuaGVpZ2h0T3JhY2xlLnNldERvYyh0aGlzLnN0YXRlLmRvYyksIDAsIDAsIGJsb2NrID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRMaW5lcy5wdXNoKHRoaXMuc2NhbGVyLnNjYWxlID09IDEgPyBibG9jayA6IHNjYWxlQmxvY2soYmxvY2ssIHRoaXMuc2NhbGVyKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlLCBzY3JvbGxUYXJnZXQgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB1cGRhdGUuc3RhdGU7XG4gICAgICAgIGxldCBwcmV2RGVjbyA9IHRoaXMuc3RhdGVEZWNvO1xuICAgICAgICB0aGlzLnN0YXRlRGVjbyA9IHRoaXMuc3RhdGUuZmFjZXQoZGVjb3JhdGlvbnMpLmZpbHRlcihkID0+IHR5cGVvZiBkICE9IFwiZnVuY3Rpb25cIik7XG4gICAgICAgIGxldCBjb250ZW50Q2hhbmdlcyA9IHVwZGF0ZS5jaGFuZ2VkUmFuZ2VzO1xuICAgICAgICBsZXQgaGVpZ2h0Q2hhbmdlcyA9IENoYW5nZWRSYW5nZS5leHRlbmRXaXRoUmFuZ2VzKGNvbnRlbnRDaGFuZ2VzLCBoZWlnaHRSZWxldmFudERlY29DaGFuZ2VzKHByZXZEZWNvLCB0aGlzLnN0YXRlRGVjbywgdXBkYXRlID8gdXBkYXRlLmNoYW5nZXMgOiBDaGFuZ2VTZXQuZW1wdHkodGhpcy5zdGF0ZS5kb2MubGVuZ3RoKSkpO1xuICAgICAgICBsZXQgcHJldkhlaWdodCA9IHRoaXMuaGVpZ2h0TWFwLmhlaWdodDtcbiAgICAgICAgbGV0IHNjcm9sbEFuY2hvciA9IHRoaXMuc2Nyb2xsZWRUb0JvdHRvbSA/IG51bGwgOiB0aGlzLnNjcm9sbEFuY2hvckF0KHRoaXMuc2Nyb2xsVG9wKTtcbiAgICAgICAgdGhpcy5oZWlnaHRNYXAgPSB0aGlzLmhlaWdodE1hcC5hcHBseUNoYW5nZXModGhpcy5zdGF0ZURlY28sIHVwZGF0ZS5zdGFydFN0YXRlLmRvYywgdGhpcy5oZWlnaHRPcmFjbGUuc2V0RG9jKHRoaXMuc3RhdGUuZG9jKSwgaGVpZ2h0Q2hhbmdlcyk7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodE1hcC5oZWlnaHQgIT0gcHJldkhlaWdodClcbiAgICAgICAgICAgIHVwZGF0ZS5mbGFncyB8PSAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovO1xuICAgICAgICBpZiAoc2Nyb2xsQW5jaG9yKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFuY2hvclBvcyA9IHVwZGF0ZS5jaGFuZ2VzLm1hcFBvcyhzY3JvbGxBbmNob3IuZnJvbSwgLTEpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JIZWlnaHQgPSBzY3JvbGxBbmNob3IudG9wO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbmNob3JQb3MgPSAtMTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gdGhpcy5oZWlnaHRNYXAuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGxldCB2aWV3cG9ydCA9IGhlaWdodENoYW5nZXMubGVuZ3RoID8gdGhpcy5tYXBWaWV3cG9ydCh0aGlzLnZpZXdwb3J0LCB1cGRhdGUuY2hhbmdlcykgOiB0aGlzLnZpZXdwb3J0O1xuICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0ICYmIChzY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA8IHZpZXdwb3J0LmZyb20gfHwgc2Nyb2xsVGFyZ2V0LnJhbmdlLmhlYWQgPiB2aWV3cG9ydC50bykgfHxcbiAgICAgICAgICAgICF0aGlzLnZpZXdwb3J0SXNBcHByb3ByaWF0ZSh2aWV3cG9ydCkpXG4gICAgICAgICAgICB2aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld3BvcnQoMCwgc2Nyb2xsVGFyZ2V0KTtcbiAgICAgICAgbGV0IHVwZGF0ZUxpbmVzID0gIXVwZGF0ZS5jaGFuZ2VzLmVtcHR5IHx8ICh1cGRhdGUuZmxhZ3MgJiAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKSB8fFxuICAgICAgICAgICAgdmlld3BvcnQuZnJvbSAhPSB0aGlzLnZpZXdwb3J0LmZyb20gfHwgdmlld3BvcnQudG8gIT0gdGhpcy52aWV3cG9ydC50bztcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICAgICB0aGlzLnVwZGF0ZUZvclZpZXdwb3J0KCk7XG4gICAgICAgIGlmICh1cGRhdGVMaW5lcylcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnRMaW5lcygpO1xuICAgICAgICBpZiAodGhpcy5saW5lR2Fwcy5sZW5ndGggfHwgdGhpcy52aWV3cG9ydC50byAtIHRoaXMudmlld3BvcnQuZnJvbSA+ICgyMDAwIC8qIExHLk1hcmdpbiAqLyA8PCAxKSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTGluZUdhcHModGhpcy5lbnN1cmVMaW5lR2Fwcyh0aGlzLm1hcExpbmVHYXBzKHRoaXMubGluZUdhcHMsIHVwZGF0ZS5jaGFuZ2VzKSkpO1xuICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gdGhpcy5jb21wdXRlVmlzaWJsZVJhbmdlcygpO1xuICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0KVxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQgPSBzY3JvbGxUYXJnZXQ7XG4gICAgICAgIGlmICghdGhpcy5tdXN0RW5mb3JjZUN1cnNvckFzc29jICYmIHVwZGF0ZS5zZWxlY3Rpb25TZXQgJiYgdXBkYXRlLnZpZXcubGluZVdyYXBwaW5nICYmXG4gICAgICAgICAgICB1cGRhdGUuc3RhdGUuc2VsZWN0aW9uLm1haW4uZW1wdHkgJiYgdXBkYXRlLnN0YXRlLnNlbGVjdGlvbi5tYWluLmFzc29jICYmXG4gICAgICAgICAgICAhdXBkYXRlLnN0YXRlLmZhY2V0KG5hdGl2ZVNlbGVjdGlvbkhpZGRlbikpXG4gICAgICAgICAgICB0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MgPSB0cnVlO1xuICAgIH1cbiAgICBtZWFzdXJlKHZpZXcpIHtcbiAgICAgICAgbGV0IGRvbSA9IHZpZXcuY29udGVudERPTSwgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb20pO1xuICAgICAgICBsZXQgb3JhY2xlID0gdGhpcy5oZWlnaHRPcmFjbGU7XG4gICAgICAgIGxldCB3aGl0ZVNwYWNlID0gc3R5bGUud2hpdGVTcGFjZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VGV4dERpcmVjdGlvbiA9IHN0eWxlLmRpcmVjdGlvbiA9PSBcInJ0bFwiID8gRGlyZWN0aW9uLlJUTCA6IERpcmVjdGlvbi5MVFI7XG4gICAgICAgIGxldCByZWZyZXNoID0gdGhpcy5oZWlnaHRPcmFjbGUubXVzdFJlZnJlc2hGb3JXcmFwcGluZyh3aGl0ZVNwYWNlKTtcbiAgICAgICAgbGV0IGRvbVJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGxldCBtZWFzdXJlQ29udGVudCA9IHJlZnJlc2ggfHwgdGhpcy5tdXN0TWVhc3VyZUNvbnRlbnQgfHwgdGhpcy5jb250ZW50RE9NSGVpZ2h0ICE9IGRvbVJlY3QuaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbnRlbnRET01IZWlnaHQgPSBkb21SZWN0LmhlaWdodDtcbiAgICAgICAgdGhpcy5tdXN0TWVhc3VyZUNvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IDAsIGJpYXMgPSAwO1xuICAgICAgICBpZiAoZG9tUmVjdC53aWR0aCAmJiBkb21SZWN0LmhlaWdodCkge1xuICAgICAgICAgICAgbGV0IHsgc2NhbGVYLCBzY2FsZVkgfSA9IGdldFNjYWxlKGRvbSwgZG9tUmVjdCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zY2FsZVggIT0gc2NhbGVYIHx8IHRoaXMuc2NhbGVZICE9IHNjYWxlWSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2NhbGVYID0gc2NhbGVYO1xuICAgICAgICAgICAgICAgIHRoaXMuc2NhbGVZID0gc2NhbGVZO1xuICAgICAgICAgICAgICAgIHJlc3VsdCB8PSA4IC8qIFVwZGF0ZUZsYWcuR2VvbWV0cnkgKi87XG4gICAgICAgICAgICAgICAgcmVmcmVzaCA9IG1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBWZXJ0aWNhbCBwYWRkaW5nXG4gICAgICAgIGxldCBwYWRkaW5nVG9wID0gKHBhcnNlSW50KHN0eWxlLnBhZGRpbmdUb3ApIHx8IDApICogdGhpcy5zY2FsZVk7XG4gICAgICAgIGxldCBwYWRkaW5nQm90dG9tID0gKHBhcnNlSW50KHN0eWxlLnBhZGRpbmdCb3R0b20pIHx8IDApICogdGhpcy5zY2FsZVk7XG4gICAgICAgIGlmICh0aGlzLnBhZGRpbmdUb3AgIT0gcGFkZGluZ1RvcCB8fCB0aGlzLnBhZGRpbmdCb3R0b20gIT0gcGFkZGluZ0JvdHRvbSkge1xuICAgICAgICAgICAgdGhpcy5wYWRkaW5nVG9wID0gcGFkZGluZ1RvcDtcbiAgICAgICAgICAgIHRoaXMucGFkZGluZ0JvdHRvbSA9IHBhZGRpbmdCb3R0b207XG4gICAgICAgICAgICByZXN1bHQgfD0gOCAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovIHwgMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lZGl0b3JXaWR0aCAhPSB2aWV3LnNjcm9sbERPTS5jbGllbnRXaWR0aCkge1xuICAgICAgICAgICAgaWYgKG9yYWNsZS5saW5lV3JhcHBpbmcpXG4gICAgICAgICAgICAgICAgbWVhc3VyZUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JXaWR0aCA9IHZpZXcuc2Nyb2xsRE9NLmNsaWVudFdpZHRoO1xuICAgICAgICAgICAgcmVzdWx0IHw9IDggLyogVXBkYXRlRmxhZy5HZW9tZXRyeSAqLztcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2Nyb2xsVG9wID0gdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wICogdGhpcy5zY2FsZVk7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFRvcCAhPSBzY3JvbGxUb3ApIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQW5jaG9ySGVpZ2h0ID0gLTE7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjcm9sbGVkVG9Cb3R0b20gPSBpc1Njcm9sbGVkVG9Cb3R0b20odmlldy5zY3JvbGxET00pO1xuICAgICAgICAvLyBQaXhlbCB2aWV3cG9ydFxuICAgICAgICBsZXQgcGl4ZWxWaWV3cG9ydCA9ICh0aGlzLnByaW50aW5nID8gZnVsbFBpeGVsUmFuZ2UgOiB2aXNpYmxlUGl4ZWxSYW5nZSkoZG9tLCB0aGlzLnBhZGRpbmdUb3ApO1xuICAgICAgICBsZXQgZFRvcCA9IHBpeGVsVmlld3BvcnQudG9wIC0gdGhpcy5waXhlbFZpZXdwb3J0LnRvcCwgZEJvdHRvbSA9IHBpeGVsVmlld3BvcnQuYm90dG9tIC0gdGhpcy5waXhlbFZpZXdwb3J0LmJvdHRvbTtcbiAgICAgICAgdGhpcy5waXhlbFZpZXdwb3J0ID0gcGl4ZWxWaWV3cG9ydDtcbiAgICAgICAgbGV0IGluVmlldyA9IHRoaXMucGl4ZWxWaWV3cG9ydC5ib3R0b20gPiB0aGlzLnBpeGVsVmlld3BvcnQudG9wICYmIHRoaXMucGl4ZWxWaWV3cG9ydC5yaWdodCA+IHRoaXMucGl4ZWxWaWV3cG9ydC5sZWZ0O1xuICAgICAgICBpZiAoaW5WaWV3ICE9IHRoaXMuaW5WaWV3KSB7XG4gICAgICAgICAgICB0aGlzLmluVmlldyA9IGluVmlldztcbiAgICAgICAgICAgIGlmIChpblZpZXcpXG4gICAgICAgICAgICAgICAgbWVhc3VyZUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pblZpZXcgJiYgIXRoaXMuc2Nyb2xsVGFyZ2V0KVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGxldCBjb250ZW50V2lkdGggPSBkb21SZWN0LndpZHRoO1xuICAgICAgICBpZiAodGhpcy5jb250ZW50RE9NV2lkdGggIT0gY29udGVudFdpZHRoIHx8IHRoaXMuZWRpdG9ySGVpZ2h0ICE9IHZpZXcuc2Nyb2xsRE9NLmNsaWVudEhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50RE9NV2lkdGggPSBkb21SZWN0LndpZHRoO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JIZWlnaHQgPSB2aWV3LnNjcm9sbERPTS5jbGllbnRIZWlnaHQ7XG4gICAgICAgICAgICByZXN1bHQgfD0gOCAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZWFzdXJlQ29udGVudCkge1xuICAgICAgICAgICAgbGV0IGxpbmVIZWlnaHRzID0gdmlldy5kb2NWaWV3Lm1lYXN1cmVWaXNpYmxlTGluZUhlaWdodHModGhpcy52aWV3cG9ydCk7XG4gICAgICAgICAgICBpZiAob3JhY2xlLm11c3RSZWZyZXNoRm9ySGVpZ2h0cyhsaW5lSGVpZ2h0cykpXG4gICAgICAgICAgICAgICAgcmVmcmVzaCA9IHRydWU7XG4gICAgICAgICAgICBpZiAocmVmcmVzaCB8fCBvcmFjbGUubGluZVdyYXBwaW5nICYmIE1hdGguYWJzKGNvbnRlbnRXaWR0aCAtIHRoaXMuY29udGVudERPTVdpZHRoKSA+IG9yYWNsZS5jaGFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBsaW5lSGVpZ2h0LCBjaGFyV2lkdGgsIHRleHRIZWlnaHQgfSA9IHZpZXcuZG9jVmlldy5tZWFzdXJlVGV4dFNpemUoKTtcbiAgICAgICAgICAgICAgICByZWZyZXNoID0gbGluZUhlaWdodCA+IDAgJiYgb3JhY2xlLnJlZnJlc2god2hpdGVTcGFjZSwgbGluZUhlaWdodCwgY2hhcldpZHRoLCB0ZXh0SGVpZ2h0LCBjb250ZW50V2lkdGggLyBjaGFyV2lkdGgsIGxpbmVIZWlnaHRzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVmcmVzaCkge1xuICAgICAgICAgICAgICAgICAgICB2aWV3LmRvY1ZpZXcubWluV2lkdGggPSAwO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gOCAvKiBVcGRhdGVGbGFnLkdlb21ldHJ5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkVG9wID4gMCAmJiBkQm90dG9tID4gMClcbiAgICAgICAgICAgICAgICBiaWFzID0gTWF0aC5tYXgoZFRvcCwgZEJvdHRvbSk7XG4gICAgICAgICAgICBlbHNlIGlmIChkVG9wIDwgMCAmJiBkQm90dG9tIDwgMClcbiAgICAgICAgICAgICAgICBiaWFzID0gTWF0aC5taW4oZFRvcCwgZEJvdHRvbSk7XG4gICAgICAgICAgICBvcmFjbGUuaGVpZ2h0Q2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgdnAgb2YgdGhpcy52aWV3cG9ydHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0cyA9IHZwLmZyb20gPT0gdGhpcy52aWV3cG9ydC5mcm9tID8gbGluZUhlaWdodHMgOiB2aWV3LmRvY1ZpZXcubWVhc3VyZVZpc2libGVMaW5lSGVpZ2h0cyh2cCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHRNYXAgPSAocmVmcmVzaCA/IEhlaWdodE1hcC5lbXB0eSgpLmFwcGx5Q2hhbmdlcyh0aGlzLnN0YXRlRGVjbywgVGV4dC5lbXB0eSwgdGhpcy5oZWlnaHRPcmFjbGUsIFtuZXcgQ2hhbmdlZFJhbmdlKDAsIDAsIDAsIHZpZXcuc3RhdGUuZG9jLmxlbmd0aCldKSA6IHRoaXMuaGVpZ2h0TWFwKS51cGRhdGVIZWlnaHQob3JhY2xlLCAwLCByZWZyZXNoLCBuZXcgTWVhc3VyZWRIZWlnaHRzKHZwLmZyb20sIGhlaWdodHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcmFjbGUuaGVpZ2h0Q2hhbmdlZClcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gMiAvKiBVcGRhdGVGbGFnLkhlaWdodCAqLztcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmlld3BvcnRDaGFuZ2UgPSAhdGhpcy52aWV3cG9ydElzQXBwcm9wcmlhdGUodGhpcy52aWV3cG9ydCwgYmlhcykgfHxcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ICYmICh0aGlzLnNjcm9sbFRhcmdldC5yYW5nZS5oZWFkIDwgdGhpcy52aWV3cG9ydC5mcm9tIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA+IHRoaXMudmlld3BvcnQudG8pO1xuICAgICAgICBpZiAodmlld3BvcnRDaGFuZ2UpXG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0ID0gdGhpcy5nZXRWaWV3cG9ydChiaWFzLCB0aGlzLnNjcm9sbFRhcmdldCk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9yVmlld3BvcnQoKTtcbiAgICAgICAgaWYgKChyZXN1bHQgJiAyIC8qIFVwZGF0ZUZsYWcuSGVpZ2h0ICovKSB8fCB2aWV3cG9ydENoYW5nZSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnRMaW5lcygpO1xuICAgICAgICBpZiAodGhpcy5saW5lR2Fwcy5sZW5ndGggfHwgdGhpcy52aWV3cG9ydC50byAtIHRoaXMudmlld3BvcnQuZnJvbSA+ICgyMDAwIC8qIExHLk1hcmdpbiAqLyA8PCAxKSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTGluZUdhcHModGhpcy5lbnN1cmVMaW5lR2FwcyhyZWZyZXNoID8gW10gOiB0aGlzLmxpbmVHYXBzLCB2aWV3KSk7XG4gICAgICAgIHJlc3VsdCB8PSB0aGlzLmNvbXB1dGVWaXNpYmxlUmFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLm11c3RFbmZvcmNlQ3Vyc29yQXNzb2MpIHtcbiAgICAgICAgICAgIHRoaXMubXVzdEVuZm9yY2VDdXJzb3JBc3NvYyA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIGluIHRoZSByZWFkIHN0YWdlLCBiZWNhdXNlIG1vdmluZyB0aGUgc2VsZWN0aW9uXG4gICAgICAgICAgICAvLyB0byBhIGxpbmUgZW5kIGlzIGdvaW5nIHRvIHRyaWdnZXIgYSBsYXlvdXQgYW55d2F5LCBzbyBpdFxuICAgICAgICAgICAgLy8gY2FuJ3QgYmUgYSBwdXJlIHdyaXRlLiBJdCBzaG91bGQgYmUgcmFyZSB0aGF0IGl0IGRvZXMgYW55XG4gICAgICAgICAgICAvLyB3cml0aW5nLlxuICAgICAgICAgICAgdmlldy5kb2NWaWV3LmVuZm9yY2VDdXJzb3JBc3NvYygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGdldCB2aXNpYmxlVG9wKCkgeyByZXR1cm4gdGhpcy5zY2FsZXIuZnJvbURPTSh0aGlzLnBpeGVsVmlld3BvcnQudG9wKTsgfVxuICAgIGdldCB2aXNpYmxlQm90dG9tKCkgeyByZXR1cm4gdGhpcy5zY2FsZXIuZnJvbURPTSh0aGlzLnBpeGVsVmlld3BvcnQuYm90dG9tKTsgfVxuICAgIGdldFZpZXdwb3J0KGJpYXMsIHNjcm9sbFRhcmdldCkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgZGl2aWRlIFZQLk1hcmdpbiBiZXR3ZWVuIHRoZSB0b3AgYW5kIHRoZVxuICAgICAgICAvLyBib3R0b20sIGRlcGVuZGluZyBvbiB0aGUgYmlhcyAodGhlIGNoYW5nZSBpbiB2aWV3cG9ydCBwb3NpdGlvblxuICAgICAgICAvLyBzaW5jZSB0aGUgbGFzdCB1cGRhdGUpLiBJdCdsbCBob2xkIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMVxuICAgICAgICBsZXQgbWFyZ2luVG9wID0gMC41IC0gTWF0aC5tYXgoLTAuNSwgTWF0aC5taW4oMC41LCBiaWFzIC8gMTAwMCAvKiBWUC5NYXJnaW4gKi8gLyAyKSk7XG4gICAgICAgIGxldCBtYXAgPSB0aGlzLmhlaWdodE1hcCwgb3JhY2xlID0gdGhpcy5oZWlnaHRPcmFjbGU7XG4gICAgICAgIGxldCB7IHZpc2libGVUb3AsIHZpc2libGVCb3R0b20gfSA9IHRoaXM7XG4gICAgICAgIGxldCB2aWV3cG9ydCA9IG5ldyBWaWV3cG9ydChtYXAubGluZUF0KHZpc2libGVUb3AgLSBtYXJnaW5Ub3AgKiAxMDAwIC8qIFZQLk1hcmdpbiAqLywgUXVlcnlUeXBlLkJ5SGVpZ2h0LCBvcmFjbGUsIDAsIDApLmZyb20sIG1hcC5saW5lQXQodmlzaWJsZUJvdHRvbSArICgxIC0gbWFyZ2luVG9wKSAqIDEwMDAgLyogVlAuTWFyZ2luICovLCBRdWVyeVR5cGUuQnlIZWlnaHQsIG9yYWNsZSwgMCwgMCkudG8pO1xuICAgICAgICAvLyBJZiBzY3JvbGxUYXJnZXQgaXMgZ2l2ZW4sIG1ha2Ugc3VyZSB0aGUgdmlld3BvcnQgaW5jbHVkZXMgdGhhdCBwb3NpdGlvblxuICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgICAgICBsZXQgeyBoZWFkIH0gPSBzY3JvbGxUYXJnZXQucmFuZ2U7XG4gICAgICAgICAgICBpZiAoaGVhZCA8IHZpZXdwb3J0LmZyb20gfHwgaGVhZCA+IHZpZXdwb3J0LnRvKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZpZXdIZWlnaHQgPSBNYXRoLm1pbih0aGlzLmVkaXRvckhlaWdodCwgdGhpcy5waXhlbFZpZXdwb3J0LmJvdHRvbSAtIHRoaXMucGl4ZWxWaWV3cG9ydC50b3ApO1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IG1hcC5saW5lQXQoaGVhZCwgUXVlcnlUeXBlLkJ5UG9zLCBvcmFjbGUsIDAsIDApLCB0b3BQb3M7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbFRhcmdldC55ID09IFwiY2VudGVyXCIpXG4gICAgICAgICAgICAgICAgICAgIHRvcFBvcyA9IChibG9jay50b3AgKyBibG9jay5ib3R0b20pIC8gMiAtIHZpZXdIZWlnaHQgLyAyO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNjcm9sbFRhcmdldC55ID09IFwic3RhcnRcIiB8fCBzY3JvbGxUYXJnZXQueSA9PSBcIm5lYXJlc3RcIiAmJiBoZWFkIDwgdmlld3BvcnQuZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgdG9wUG9zID0gYmxvY2sudG9wO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdG9wUG9zID0gYmxvY2suYm90dG9tIC0gdmlld0hlaWdodDtcbiAgICAgICAgICAgICAgICB2aWV3cG9ydCA9IG5ldyBWaWV3cG9ydChtYXAubGluZUF0KHRvcFBvcyAtIDEwMDAgLyogVlAuTWFyZ2luICovIC8gMiwgUXVlcnlUeXBlLkJ5SGVpZ2h0LCBvcmFjbGUsIDAsIDApLmZyb20sIG1hcC5saW5lQXQodG9wUG9zICsgdmlld0hlaWdodCArIDEwMDAgLyogVlAuTWFyZ2luICovIC8gMiwgUXVlcnlUeXBlLkJ5SGVpZ2h0LCBvcmFjbGUsIDAsIDApLnRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlld3BvcnQ7XG4gICAgfVxuICAgIG1hcFZpZXdwb3J0KHZpZXdwb3J0LCBjaGFuZ2VzKSB7XG4gICAgICAgIGxldCBmcm9tID0gY2hhbmdlcy5tYXBQb3Modmlld3BvcnQuZnJvbSwgLTEpLCB0byA9IGNoYW5nZXMubWFwUG9zKHZpZXdwb3J0LnRvLCAxKTtcbiAgICAgICAgcmV0dXJuIG5ldyBWaWV3cG9ydCh0aGlzLmhlaWdodE1hcC5saW5lQXQoZnJvbSwgUXVlcnlUeXBlLkJ5UG9zLCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCkuZnJvbSwgdGhpcy5oZWlnaHRNYXAubGluZUF0KHRvLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKS50byk7XG4gICAgfVxuICAgIC8vIENoZWNrcyBpZiBhIGdpdmVuIHZpZXdwb3J0IGNvdmVycyB0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZVxuICAgIC8vIGRvY3VtZW50IGFuZCBub3QgdG9vIG11Y2ggYmV5b25kIHRoYXQuXG4gICAgdmlld3BvcnRJc0FwcHJvcHJpYXRlKHsgZnJvbSwgdG8gfSwgYmlhcyA9IDApIHtcbiAgICAgICAgaWYgKCF0aGlzLmluVmlldylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgeyB0b3AgfSA9IHRoaXMuaGVpZ2h0TWFwLmxpbmVBdChmcm9tLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKTtcbiAgICAgICAgbGV0IHsgYm90dG9tIH0gPSB0aGlzLmhlaWdodE1hcC5saW5lQXQodG8sIFF1ZXJ5VHlwZS5CeVBvcywgdGhpcy5oZWlnaHRPcmFjbGUsIDAsIDApO1xuICAgICAgICBsZXQgeyB2aXNpYmxlVG9wLCB2aXNpYmxlQm90dG9tIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gKGZyb20gPT0gMCB8fCB0b3AgPD0gdmlzaWJsZVRvcCAtIE1hdGgubWF4KDEwIC8qIFZQLk1pbkNvdmVyTWFyZ2luICovLCBNYXRoLm1pbigtYmlhcywgMjUwIC8qIFZQLk1heENvdmVyTWFyZ2luICovKSkpICYmXG4gICAgICAgICAgICAodG8gPT0gdGhpcy5zdGF0ZS5kb2MubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgYm90dG9tID49IHZpc2libGVCb3R0b20gKyBNYXRoLm1heCgxMCAvKiBWUC5NaW5Db3Zlck1hcmdpbiAqLywgTWF0aC5taW4oYmlhcywgMjUwIC8qIFZQLk1heENvdmVyTWFyZ2luICovKSkpICYmXG4gICAgICAgICAgICAodG9wID4gdmlzaWJsZVRvcCAtIDIgKiAxMDAwIC8qIFZQLk1hcmdpbiAqLyAmJiBib3R0b20gPCB2aXNpYmxlQm90dG9tICsgMiAqIDEwMDAgLyogVlAuTWFyZ2luICovKTtcbiAgICB9XG4gICAgbWFwTGluZUdhcHMoZ2FwcywgY2hhbmdlcykge1xuICAgICAgICBpZiAoIWdhcHMubGVuZ3RoIHx8IGNoYW5nZXMuZW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gZ2FwcztcbiAgICAgICAgbGV0IG1hcHBlZCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBnYXAgb2YgZ2FwcylcbiAgICAgICAgICAgIGlmICghY2hhbmdlcy50b3VjaGVzUmFuZ2UoZ2FwLmZyb20sIGdhcC50bykpXG4gICAgICAgICAgICAgICAgbWFwcGVkLnB1c2gobmV3IExpbmVHYXAoY2hhbmdlcy5tYXBQb3MoZ2FwLmZyb20pLCBjaGFuZ2VzLm1hcFBvcyhnYXAudG8pLCBnYXAuc2l6ZSkpO1xuICAgICAgICByZXR1cm4gbWFwcGVkO1xuICAgIH1cbiAgICAvLyBDb21wdXRlcyBwb3NpdGlvbnMgaW4gdGhlIHZpZXdwb3J0IHdoZXJlIHRoZSBzdGFydCBvciBlbmQgb2YgYVxuICAgIC8vIGxpbmUgc2hvdWxkIGJlIGhpZGRlbiwgdHJ5aW5nIHRvIHJldXNlIGV4aXN0aW5nIGxpbmUgZ2FwcyB3aGVuXG4gICAgLy8gYXBwcm9wcmlhdGUgdG8gYXZvaWQgdW5uZWNjZXNhcnkgcmVkcmF3cy5cbiAgICAvLyBVc2VzIGNydWRlIGNoYXJhY3Rlci1jb3VudGluZyBmb3IgdGhlIHBvc2l0aW9uaW5nIGFuZCBzaXppbmcsXG4gICAgLy8gc2luY2UgYWN0dWFsIERPTSBjb29yZGluYXRlcyBhcmVuJ3QgYWx3YXlzIGF2YWlsYWJsZSBhbmRcbiAgICAvLyBwcmVkaWN0YWJsZS4gUmVsaWVzIG9uIGdlbmVyb3VzIG1hcmdpbnMgKHNlZSBMRy5NYXJnaW4pIHRvIGhpZGVcbiAgICAvLyB0aGUgYXJ0aWZhY3RzIHRoaXMgbWlnaHQgcHJvZHVjZSBmcm9tIHRoZSB1c2VyLlxuICAgIGVuc3VyZUxpbmVHYXBzKGN1cnJlbnQsIG1heU1lYXN1cmUpIHtcbiAgICAgICAgbGV0IHdyYXBwaW5nID0gdGhpcy5oZWlnaHRPcmFjbGUubGluZVdyYXBwaW5nO1xuICAgICAgICBsZXQgbWFyZ2luID0gd3JhcHBpbmcgPyAxMDAwMCAvKiBMRy5NYXJnaW5XcmFwICovIDogMjAwMCAvKiBMRy5NYXJnaW4gKi8sIGhhbGZNYXJnaW4gPSBtYXJnaW4gPj4gMSwgZG91YmxlTWFyZ2luID0gbWFyZ2luIDw8IDE7XG4gICAgICAgIC8vIFRoZSBub24td3JhcHBpbmcgbG9naWMgd29uJ3Qgd29yayBhdCBhbGwgaW4gcHJlZG9taW5hbnRseSByaWdodC10by1sZWZ0IHRleHQuXG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRUZXh0RGlyZWN0aW9uICE9IERpcmVjdGlvbi5MVFIgJiYgIXdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICBsZXQgZ2FwcyA9IFtdO1xuICAgICAgICBsZXQgYWRkR2FwID0gKGZyb20sIHRvLCBsaW5lLCBzdHJ1Y3R1cmUpID0+IHtcbiAgICAgICAgICAgIGlmICh0byAtIGZyb20gPCBoYWxmTWFyZ2luKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBzZWwgPSB0aGlzLnN0YXRlLnNlbGVjdGlvbi5tYWluLCBhdm9pZCA9IFtzZWwuZnJvbV07XG4gICAgICAgICAgICBpZiAoIXNlbC5lbXB0eSlcbiAgICAgICAgICAgICAgICBhdm9pZC5wdXNoKHNlbC50byk7XG4gICAgICAgICAgICBmb3IgKGxldCBwb3Mgb2YgYXZvaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zID4gZnJvbSAmJiBwb3MgPCB0bykge1xuICAgICAgICAgICAgICAgICAgICBhZGRHYXAoZnJvbSwgcG9zIC0gMTAgLyogTEcuU2VsZWN0aW9uTWFyZ2luICovLCBsaW5lLCBzdHJ1Y3R1cmUpO1xuICAgICAgICAgICAgICAgICAgICBhZGRHYXAocG9zICsgMTAgLyogTEcuU2VsZWN0aW9uTWFyZ2luICovLCB0bywgbGluZSwgc3RydWN0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBnYXAgPSBmaW5kKGN1cnJlbnQsIGdhcCA9PiBnYXAuZnJvbSA+PSBsaW5lLmZyb20gJiYgZ2FwLnRvIDw9IGxpbmUudG8gJiZcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhnYXAuZnJvbSAtIGZyb20pIDwgaGFsZk1hcmdpbiAmJiBNYXRoLmFicyhnYXAudG8gLSB0bykgPCBoYWxmTWFyZ2luICYmXG4gICAgICAgICAgICAgICAgIWF2b2lkLnNvbWUocG9zID0+IGdhcC5mcm9tIDwgcG9zICYmIGdhcC50byA+IHBvcykpO1xuICAgICAgICAgICAgaWYgKCFnYXApIHtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHNjcm9sbGluZyBkb3duLCBzbmFwIGdhcCBlbmRzIHRvIGxpbmUgc3RhcnRzIHRvIGF2b2lkIHNoaWZ0cyBpbiB3cmFwcGluZ1xuICAgICAgICAgICAgICAgIGlmICh0byA8IGxpbmUudG8gJiYgbWF5TWVhc3VyZSAmJiB3cmFwcGluZyAmJlxuICAgICAgICAgICAgICAgICAgICBtYXlNZWFzdXJlLnZpc2libGVSYW5nZXMuc29tZShyID0+IHIuZnJvbSA8PSB0byAmJiByLnRvID49IHRvKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGluZVN0YXJ0ID0gbWF5TWVhc3VyZS5tb3ZlVG9MaW5lQm91bmRhcnkoRWRpdG9yU2VsZWN0aW9uLmN1cnNvcih0byksIGZhbHNlLCB0cnVlKS5oZWFkO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGluZVN0YXJ0ID4gZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gbGluZVN0YXJ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBnYXAgPSBuZXcgTGluZUdhcChmcm9tLCB0bywgdGhpcy5nYXBTaXplKGxpbmUsIGZyb20sIHRvLCBzdHJ1Y3R1cmUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdhcHMucHVzaChnYXApO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHRoaXMudmlld3BvcnRMaW5lcykge1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoIDwgZG91YmxlTWFyZ2luKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHN0cnVjdHVyZSA9IGxpbmVTdHJ1Y3R1cmUobGluZS5mcm9tLCBsaW5lLnRvLCB0aGlzLnN0YXRlRGVjbyk7XG4gICAgICAgICAgICBpZiAoc3RydWN0dXJlLnRvdGFsIDwgZG91YmxlTWFyZ2luKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuc2Nyb2xsVGFyZ2V0ID8gdGhpcy5zY3JvbGxUYXJnZXQucmFuZ2UuaGVhZCA6IG51bGw7XG4gICAgICAgICAgICBsZXQgdmlld0Zyb20sIHZpZXdUbztcbiAgICAgICAgICAgIGlmICh3cmFwcGluZykge1xuICAgICAgICAgICAgICAgIGxldCBtYXJnaW5IZWlnaHQgPSAobWFyZ2luIC8gdGhpcy5oZWlnaHRPcmFjbGUubGluZUxlbmd0aCkgKiB0aGlzLmhlaWdodE9yYWNsZS5saW5lSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGxldCB0b3AsIGJvdDtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldEZyYWMgPSBmaW5kRnJhY3Rpb24oc3RydWN0dXJlLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BhY2VGcmFjID0gKCh0aGlzLnZpc2libGVCb3R0b20gLSB0aGlzLnZpc2libGVUb3ApIC8gMiArIG1hcmdpbkhlaWdodCkgLyBsaW5lLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gdGFyZ2V0RnJhYyAtIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICAgICAgYm90ID0gdGFyZ2V0RnJhYyArIHNwYWNlRnJhYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9ICh0aGlzLnZpc2libGVUb3AgLSBsaW5lLnRvcCAtIG1hcmdpbkhlaWdodCkgLyBsaW5lLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgYm90ID0gKHRoaXMudmlzaWJsZUJvdHRvbSAtIGxpbmUudG9wICsgbWFyZ2luSGVpZ2h0KSAvIGxpbmUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2aWV3RnJvbSA9IGZpbmRQb3NpdGlvbihzdHJ1Y3R1cmUsIHRvcCk7XG4gICAgICAgICAgICAgICAgdmlld1RvID0gZmluZFBvc2l0aW9uKHN0cnVjdHVyZSwgYm90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFdpZHRoID0gc3RydWN0dXJlLnRvdGFsICogdGhpcy5oZWlnaHRPcmFjbGUuY2hhcldpZHRoO1xuICAgICAgICAgICAgICAgIGxldCBtYXJnaW5XaWR0aCA9IG1hcmdpbiAqIHRoaXMuaGVpZ2h0T3JhY2xlLmNoYXJXaWR0aDtcbiAgICAgICAgICAgICAgICBsZXQgbGVmdCwgcmlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXRGcmFjID0gZmluZEZyYWN0aW9uKHN0cnVjdHVyZSwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwYWNlRnJhYyA9ICgodGhpcy5waXhlbFZpZXdwb3J0LnJpZ2h0IC0gdGhpcy5waXhlbFZpZXdwb3J0LmxlZnQpIC8gMiArIG1hcmdpbldpZHRoKSAvIHRvdGFsV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSB0YXJnZXRGcmFjIC0gc3BhY2VGcmFjO1xuICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRhcmdldEZyYWMgKyBzcGFjZUZyYWM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gKHRoaXMucGl4ZWxWaWV3cG9ydC5sZWZ0IC0gbWFyZ2luV2lkdGgpIC8gdG90YWxXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSAodGhpcy5waXhlbFZpZXdwb3J0LnJpZ2h0ICsgbWFyZ2luV2lkdGgpIC8gdG90YWxXaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmlld0Zyb20gPSBmaW5kUG9zaXRpb24oc3RydWN0dXJlLCBsZWZ0KTtcbiAgICAgICAgICAgICAgICB2aWV3VG8gPSBmaW5kUG9zaXRpb24oc3RydWN0dXJlLCByaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmlld0Zyb20gPiBsaW5lLmZyb20pXG4gICAgICAgICAgICAgICAgYWRkR2FwKGxpbmUuZnJvbSwgdmlld0Zyb20sIGxpbmUsIHN0cnVjdHVyZSk7XG4gICAgICAgICAgICBpZiAodmlld1RvIDwgbGluZS50bylcbiAgICAgICAgICAgICAgICBhZGRHYXAodmlld1RvLCBsaW5lLnRvLCBsaW5lLCBzdHJ1Y3R1cmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnYXBzO1xuICAgIH1cbiAgICBnYXBTaXplKGxpbmUsIGZyb20sIHRvLCBzdHJ1Y3R1cmUpIHtcbiAgICAgICAgbGV0IGZyYWN0aW9uID0gZmluZEZyYWN0aW9uKHN0cnVjdHVyZSwgdG8pIC0gZmluZEZyYWN0aW9uKHN0cnVjdHVyZSwgZnJvbSk7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodE9yYWNsZS5saW5lV3JhcHBpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBsaW5lLmhlaWdodCAqIGZyYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHN0cnVjdHVyZS50b3RhbCAqIHRoaXMuaGVpZ2h0T3JhY2xlLmNoYXJXaWR0aCAqIGZyYWN0aW9uO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUxpbmVHYXBzKGdhcHMpIHtcbiAgICAgICAgaWYgKCFMaW5lR2FwLnNhbWUoZ2FwcywgdGhpcy5saW5lR2FwcykpIHtcbiAgICAgICAgICAgIHRoaXMubGluZUdhcHMgPSBnYXBzO1xuICAgICAgICAgICAgdGhpcy5saW5lR2FwRGVjbyA9IERlY29yYXRpb24uc2V0KGdhcHMubWFwKGdhcCA9PiBnYXAuZHJhdyh0aGlzLCB0aGlzLmhlaWdodE9yYWNsZS5saW5lV3JhcHBpbmcpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29tcHV0ZVZpc2libGVSYW5nZXMoKSB7XG4gICAgICAgIGxldCBkZWNvID0gdGhpcy5zdGF0ZURlY287XG4gICAgICAgIGlmICh0aGlzLmxpbmVHYXBzLmxlbmd0aClcbiAgICAgICAgICAgIGRlY28gPSBkZWNvLmNvbmNhdCh0aGlzLmxpbmVHYXBEZWNvKTtcbiAgICAgICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgICAgICBSYW5nZVNldC5zcGFucyhkZWNvLCB0aGlzLnZpZXdwb3J0LmZyb20sIHRoaXMudmlld3BvcnQudG8sIHtcbiAgICAgICAgICAgIHNwYW4oZnJvbSwgdG8pIHsgcmFuZ2VzLnB1c2goeyBmcm9tLCB0byB9KTsgfSxcbiAgICAgICAgICAgIHBvaW50KCkgeyB9XG4gICAgICAgIH0sIDIwKTtcbiAgICAgICAgbGV0IGNoYW5nZWQgPSByYW5nZXMubGVuZ3RoICE9IHRoaXMudmlzaWJsZVJhbmdlcy5sZW5ndGggfHxcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZVJhbmdlcy5zb21lKChyLCBpKSA9PiByLmZyb20gIT0gcmFuZ2VzW2ldLmZyb20gfHwgci50byAhPSByYW5nZXNbaV0udG8pO1xuICAgICAgICB0aGlzLnZpc2libGVSYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHJldHVybiBjaGFuZ2VkID8gNCAvKiBVcGRhdGVGbGFnLlZpZXdwb3J0ICovIDogMDtcbiAgICB9XG4gICAgbGluZUJsb2NrQXQocG9zKSB7XG4gICAgICAgIHJldHVybiAocG9zID49IHRoaXMudmlld3BvcnQuZnJvbSAmJiBwb3MgPD0gdGhpcy52aWV3cG9ydC50byAmJiB0aGlzLnZpZXdwb3J0TGluZXMuZmluZChiID0+IGIuZnJvbSA8PSBwb3MgJiYgYi50byA+PSBwb3MpKSB8fFxuICAgICAgICAgICAgc2NhbGVCbG9jayh0aGlzLmhlaWdodE1hcC5saW5lQXQocG9zLCBRdWVyeVR5cGUuQnlQb3MsIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKSwgdGhpcy5zY2FsZXIpO1xuICAgIH1cbiAgICBsaW5lQmxvY2tBdEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHNjYWxlQmxvY2sodGhpcy5oZWlnaHRNYXAubGluZUF0KHRoaXMuc2NhbGVyLmZyb21ET00oaGVpZ2h0KSwgUXVlcnlUeXBlLkJ5SGVpZ2h0LCB0aGlzLmhlaWdodE9yYWNsZSwgMCwgMCksIHRoaXMuc2NhbGVyKTtcbiAgICB9XG4gICAgc2Nyb2xsQW5jaG9yQXQoc2Nyb2xsVG9wKSB7XG4gICAgICAgIGxldCBibG9jayA9IHRoaXMubGluZUJsb2NrQXRIZWlnaHQoc2Nyb2xsVG9wICsgOCk7XG4gICAgICAgIHJldHVybiBibG9jay5mcm9tID49IHRoaXMudmlld3BvcnQuZnJvbSB8fCB0aGlzLnZpZXdwb3J0TGluZXNbMF0udG9wIC0gc2Nyb2xsVG9wID4gMjAwID8gYmxvY2sgOiB0aGlzLnZpZXdwb3J0TGluZXNbMF07XG4gICAgfVxuICAgIGVsZW1lbnRBdEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHNjYWxlQmxvY2sodGhpcy5oZWlnaHRNYXAuYmxvY2tBdCh0aGlzLnNjYWxlci5mcm9tRE9NKGhlaWdodCksIHRoaXMuaGVpZ2h0T3JhY2xlLCAwLCAwKSwgdGhpcy5zY2FsZXIpO1xuICAgIH1cbiAgICBnZXQgZG9jSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY2FsZXIudG9ET00odGhpcy5oZWlnaHRNYXAuaGVpZ2h0KTtcbiAgICB9XG4gICAgZ2V0IGNvbnRlbnRIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY0hlaWdodCArIHRoaXMucGFkZGluZ1RvcCArIHRoaXMucGFkZGluZ0JvdHRvbTtcbiAgICB9XG59XG5jbGFzcyBWaWV3cG9ydCB7XG4gICAgY29uc3RydWN0b3IoZnJvbSwgdG8pIHtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxpbmVTdHJ1Y3R1cmUoZnJvbSwgdG8sIHN0YXRlRGVjbykge1xuICAgIGxldCByYW5nZXMgPSBbXSwgcG9zID0gZnJvbSwgdG90YWwgPSAwO1xuICAgIFJhbmdlU2V0LnNwYW5zKHN0YXRlRGVjbywgZnJvbSwgdG8sIHtcbiAgICAgICAgc3BhbigpIHsgfSxcbiAgICAgICAgcG9pbnQoZnJvbSwgdG8pIHtcbiAgICAgICAgICAgIGlmIChmcm9tID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goeyBmcm9tOiBwb3MsIHRvOiBmcm9tIH0pO1xuICAgICAgICAgICAgICAgIHRvdGFsICs9IGZyb20gLSBwb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgPSB0bztcbiAgICAgICAgfVxuICAgIH0sIDIwKTsgLy8gV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGNvbGxhcHNlZCByYW5nZXMgb2YgYSBzaWduaWZpY2FudCBzaXplXG4gICAgaWYgKHBvcyA8IHRvKSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKHsgZnJvbTogcG9zLCB0byB9KTtcbiAgICAgICAgdG90YWwgKz0gdG8gLSBwb3M7XG4gICAgfVxuICAgIHJldHVybiB7IHRvdGFsLCByYW5nZXMgfTtcbn1cbmZ1bmN0aW9uIGZpbmRQb3NpdGlvbih7IHRvdGFsLCByYW5nZXMgfSwgcmF0aW8pIHtcbiAgICBpZiAocmF0aW8gPD0gMClcbiAgICAgICAgcmV0dXJuIHJhbmdlc1swXS5mcm9tO1xuICAgIGlmIChyYXRpbyA+PSAxKVxuICAgICAgICByZXR1cm4gcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXS50bztcbiAgICBsZXQgZGlzdCA9IE1hdGguZmxvb3IodG90YWwgKiByYXRpbyk7XG4gICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHJhbmdlc1tpXSwgc2l6ZSA9IHRvIC0gZnJvbTtcbiAgICAgICAgaWYgKGRpc3QgPD0gc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiBmcm9tICsgZGlzdDtcbiAgICAgICAgZGlzdCAtPSBzaXplO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmRGcmFjdGlvbihzdHJ1Y3R1cmUsIHBvcykge1xuICAgIGxldCBjb3VudGVkID0gMDtcbiAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2Ygc3RydWN0dXJlLnJhbmdlcykge1xuICAgICAgICBpZiAocG9zIDw9IHRvKSB7XG4gICAgICAgICAgICBjb3VudGVkICs9IHBvcyAtIGZyb207XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb3VudGVkICs9IHRvIC0gZnJvbTtcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50ZWQgLyBzdHJ1Y3R1cmUudG90YWw7XG59XG5mdW5jdGlvbiBmaW5kKGFycmF5LCBmKSB7XG4gICAgZm9yIChsZXQgdmFsIG9mIGFycmF5KVxuICAgICAgICBpZiAoZih2YWwpKVxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuLy8gRG9uJ3Qgc2NhbGUgd2hlbiB0aGUgZG9jdW1lbnQgaGVpZ2h0IGlzIHdpdGhpbiB0aGUgcmFuZ2Ugb2Ygd2hhdFxuLy8gdGhlIERPTSBjYW4gaGFuZGxlLlxuY29uc3QgSWRTY2FsZXIgPSB7XG4gICAgdG9ET00obikgeyByZXR1cm4gbjsgfSxcbiAgICBmcm9tRE9NKG4pIHsgcmV0dXJuIG47IH0sXG4gICAgc2NhbGU6IDFcbn07XG4vLyBXaGVuIHRoZSBoZWlnaHQgaXMgdG9vIGJpZyAoPiBWUC5NYXhET01IZWlnaHQpLCBzY2FsZSBkb3duIHRoZVxuLy8gcmVnaW9ucyBvdXRzaWRlIHRoZSB2aWV3cG9ydHMgc28gdGhhdCB0aGUgdG90YWwgaGVpZ2h0IGlzXG4vLyBWUC5NYXhET01IZWlnaHQuXG5jbGFzcyBCaWdTY2FsZXIge1xuICAgIGNvbnN0cnVjdG9yKG9yYWNsZSwgaGVpZ2h0TWFwLCB2aWV3cG9ydHMpIHtcbiAgICAgICAgbGV0IHZwSGVpZ2h0ID0gMCwgYmFzZSA9IDAsIGRvbUJhc2UgPSAwO1xuICAgICAgICB0aGlzLnZpZXdwb3J0cyA9IHZpZXdwb3J0cy5tYXAoKHsgZnJvbSwgdG8gfSkgPT4ge1xuICAgICAgICAgICAgbGV0IHRvcCA9IGhlaWdodE1hcC5saW5lQXQoZnJvbSwgUXVlcnlUeXBlLkJ5UG9zLCBvcmFjbGUsIDAsIDApLnRvcDtcbiAgICAgICAgICAgIGxldCBib3R0b20gPSBoZWlnaHRNYXAubGluZUF0KHRvLCBRdWVyeVR5cGUuQnlQb3MsIG9yYWNsZSwgMCwgMCkuYm90dG9tO1xuICAgICAgICAgICAgdnBIZWlnaHQgKz0gYm90dG9tIC0gdG9wO1xuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbSwgdG8sIHRvcCwgYm90dG9tLCBkb21Ub3A6IDAsIGRvbUJvdHRvbTogMCB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zY2FsZSA9ICg3MDAwMDAwIC8qIFZQLk1heERPTUhlaWdodCAqLyAtIHZwSGVpZ2h0KSAvIChoZWlnaHRNYXAuaGVpZ2h0IC0gdnBIZWlnaHQpO1xuICAgICAgICBmb3IgKGxldCBvYmogb2YgdGhpcy52aWV3cG9ydHMpIHtcbiAgICAgICAgICAgIG9iai5kb21Ub3AgPSBkb21CYXNlICsgKG9iai50b3AgLSBiYXNlKSAqIHRoaXMuc2NhbGU7XG4gICAgICAgICAgICBkb21CYXNlID0gb2JqLmRvbUJvdHRvbSA9IG9iai5kb21Ub3AgKyAob2JqLmJvdHRvbSAtIG9iai50b3ApO1xuICAgICAgICAgICAgYmFzZSA9IG9iai5ib3R0b207XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9ET00obikge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgYmFzZSA9IDAsIGRvbUJhc2UgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdnAgPSBpIDwgdGhpcy52aWV3cG9ydHMubGVuZ3RoID8gdGhpcy52aWV3cG9ydHNbaV0gOiBudWxsO1xuICAgICAgICAgICAgaWYgKCF2cCB8fCBuIDwgdnAudG9wKVxuICAgICAgICAgICAgICAgIHJldHVybiBkb21CYXNlICsgKG4gLSBiYXNlKSAqIHRoaXMuc2NhbGU7XG4gICAgICAgICAgICBpZiAobiA8PSB2cC5ib3R0b20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZwLmRvbVRvcCArIChuIC0gdnAudG9wKTtcbiAgICAgICAgICAgIGJhc2UgPSB2cC5ib3R0b207XG4gICAgICAgICAgICBkb21CYXNlID0gdnAuZG9tQm90dG9tO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZyb21ET00obikge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgYmFzZSA9IDAsIGRvbUJhc2UgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdnAgPSBpIDwgdGhpcy52aWV3cG9ydHMubGVuZ3RoID8gdGhpcy52aWV3cG9ydHNbaV0gOiBudWxsO1xuICAgICAgICAgICAgaWYgKCF2cCB8fCBuIDwgdnAuZG9tVG9wKVxuICAgICAgICAgICAgICAgIHJldHVybiBiYXNlICsgKG4gLSBkb21CYXNlKSAvIHRoaXMuc2NhbGU7XG4gICAgICAgICAgICBpZiAobiA8PSB2cC5kb21Cb3R0b20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZwLnRvcCArIChuIC0gdnAuZG9tVG9wKTtcbiAgICAgICAgICAgIGJhc2UgPSB2cC5ib3R0b207XG4gICAgICAgICAgICBkb21CYXNlID0gdnAuZG9tQm90dG9tO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2NhbGVCbG9jayhibG9jaywgc2NhbGVyKSB7XG4gICAgaWYgKHNjYWxlci5zY2FsZSA9PSAxKVxuICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgbGV0IGJUb3AgPSBzY2FsZXIudG9ET00oYmxvY2sudG9wKSwgYkJvdHRvbSA9IHNjYWxlci50b0RPTShibG9jay5ib3R0b20pO1xuICAgIHJldHVybiBuZXcgQmxvY2tJbmZvKGJsb2NrLmZyb20sIGJsb2NrLmxlbmd0aCwgYlRvcCwgYkJvdHRvbSAtIGJUb3AsIEFycmF5LmlzQXJyYXkoYmxvY2suX2NvbnRlbnQpID8gYmxvY2suX2NvbnRlbnQubWFwKGIgPT4gc2NhbGVCbG9jayhiLCBzY2FsZXIpKSA6IGJsb2NrLl9jb250ZW50KTtcbn1cblxuY29uc3QgdGhlbWUgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHsgY29tYmluZTogc3RycyA9PiBzdHJzLmpvaW4oXCIgXCIpIH0pO1xuY29uc3QgZGFya1RoZW1lID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7IGNvbWJpbmU6IHZhbHVlcyA9PiB2YWx1ZXMuaW5kZXhPZih0cnVlKSA+IC0xIH0pO1xuY29uc3QgYmFzZVRoZW1lSUQgPSAvKkBfX1BVUkVfXyovU3R5bGVNb2R1bGUubmV3TmFtZSgpLCBiYXNlTGlnaHRJRCA9IC8qQF9fUFVSRV9fKi9TdHlsZU1vZHVsZS5uZXdOYW1lKCksIGJhc2VEYXJrSUQgPSAvKkBfX1BVUkVfXyovU3R5bGVNb2R1bGUubmV3TmFtZSgpO1xuY29uc3QgbGlnaHREYXJrSURzID0geyBcIiZsaWdodFwiOiBcIi5cIiArIGJhc2VMaWdodElELCBcIiZkYXJrXCI6IFwiLlwiICsgYmFzZURhcmtJRCB9O1xuZnVuY3Rpb24gYnVpbGRUaGVtZShtYWluLCBzcGVjLCBzY29wZXMpIHtcbiAgICByZXR1cm4gbmV3IFN0eWxlTW9kdWxlKHNwZWMsIHtcbiAgICAgICAgZmluaXNoKHNlbCkge1xuICAgICAgICAgICAgcmV0dXJuIC8mLy50ZXN0KHNlbCkgPyBzZWwucmVwbGFjZSgvJlxcdyovLCBtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobSA9PSBcIiZcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1haW47XG4gICAgICAgICAgICAgICAgaWYgKCFzY29wZXMgfHwgIXNjb3Blc1ttXSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVuc3VwcG9ydGVkIHNlbGVjdG9yOiAke219YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjb3Blc1ttXTtcbiAgICAgICAgICAgIH0pIDogbWFpbiArIFwiIFwiICsgc2VsO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5jb25zdCBiYXNlVGhlbWUkMSA9IC8qQF9fUFVSRV9fKi9idWlsZFRoZW1lKFwiLlwiICsgYmFzZVRoZW1lSUQsIHtcbiAgICBcIiZcIjoge1xuICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZSAhaW1wb3J0YW50XCIsXG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIFwiJi5jbS1mb2N1c2VkXCI6IHtcbiAgICAgICAgICAgIC8vIFByb3ZpZGUgYSBzaW1wbGUgZGVmYXVsdCBvdXRsaW5lIHRvIG1ha2Ugc3VyZSBhIGZvY3VzZWRcbiAgICAgICAgICAgIC8vIGVkaXRvciBpcyB2aXN1YWxseSBkaXN0aW5jdC4gQ2FuJ3QgbGVhdmUgdGhlIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3aWxsIGFwcGx5IHRvIHRoZSBjb250ZW50IGVsZW1lbnQsIHdoaWNoIGlzXG4gICAgICAgICAgICAvLyBpbnNpZGUgdGhlIHNjcm9sbGFibGUgY29udGFpbmVyIGFuZCBkb2Vzbid0IGluY2x1ZGUgdGhlXG4gICAgICAgICAgICAvLyBndXR0ZXJzLiBXZSBhbHNvIGNhbid0IHVzZSBhbiAnYXV0bycgb3V0bGluZSwgc2luY2UgdGhvc2VcbiAgICAgICAgICAgIC8vIGFyZSwgZm9yIHNvbWUgcmVhc29uLCBkcmF3biBiZWhpbmQgdGhlIGVsZW1lbnQgY29udGVudCwgd2hpY2hcbiAgICAgICAgICAgIC8vIHdpbGwgY2F1c2UgdGhpbmdzIGxpa2UgdGhlIGFjdGl2ZSBsaW5lIGJhY2tncm91bmQgdG8gY292ZXJcbiAgICAgICAgICAgIC8vIHRoZSBvdXRsaW5lICgjMjk3KS5cbiAgICAgICAgICAgIG91dGxpbmU6IFwiMXB4IGRvdHRlZCAjMjEyMTIxXCJcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcGxheTogXCJmbGV4ICFpbXBvcnRhbnRcIixcbiAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIlxuICAgIH0sXG4gICAgXCIuY20tc2Nyb2xsZXJcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImZsZXggIWltcG9ydGFudFwiLFxuICAgICAgICBhbGlnbkl0ZW1zOiBcImZsZXgtc3RhcnQgIWltcG9ydGFudFwiLFxuICAgICAgICBmb250RmFtaWx5OiBcIm1vbm9zcGFjZVwiLFxuICAgICAgICBsaW5lSGVpZ2h0OiAxLjQsXG4gICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgIG92ZXJmbG93WDogXCJhdXRvXCIsXG4gICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICAgIHpJbmRleDogMFxuICAgIH0sXG4gICAgXCIuY20tY29udGVudFwiOiB7XG4gICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgZmxleEdyb3c6IDIsXG4gICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIixcbiAgICAgICAgd2hpdGVTcGFjZTogXCJwcmVcIixcbiAgICAgICAgd29yZFdyYXA6IFwibm9ybWFsXCIsIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2Rldi9pc3N1ZXMvNDU2XG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIG1pbkhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiNHB4IDBcIixcbiAgICAgICAgb3V0bGluZTogXCJub25lXCIsXG4gICAgICAgIFwiJltjb250ZW50ZWRpdGFibGU9dHJ1ZV1cIjoge1xuICAgICAgICAgICAgV2Via2l0VXNlck1vZGlmeTogXCJyZWFkLXdyaXRlLXBsYWludGV4dC1vbmx5XCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFwiLmNtLWxpbmVXcmFwcGluZ1wiOiB7XG4gICAgICAgIHdoaXRlU3BhY2VfZmFsbGJhY2s6IFwicHJlLXdyYXBcIiwgLy8gRm9yIElFXG4gICAgICAgIHdoaXRlU3BhY2U6IFwiYnJlYWstc3BhY2VzXCIsXG4gICAgICAgIHdvcmRCcmVhazogXCJicmVhay13b3JkXCIsIC8vIEZvciBTYWZhcmksIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZVxuICAgICAgICBvdmVyZmxvd1dyYXA6IFwiYW55d2hlcmVcIixcbiAgICAgICAgZmxleFNocmluazogMVxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWNvbnRlbnRcIjogeyBjYXJldENvbG9yOiBcImJsYWNrXCIgfSxcbiAgICBcIiZkYXJrIC5jbS1jb250ZW50XCI6IHsgY2FyZXRDb2xvcjogXCJ3aGl0ZVwiIH0sXG4gICAgXCIuY20tbGluZVwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIixcbiAgICAgICAgcGFkZGluZzogXCIwIDJweCAwIDZweFwiXG4gICAgfSxcbiAgICBcIi5jbS1sYXllclwiOiB7XG4gICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgY29udGFpbjogXCJzaXplIHN0eWxlXCIsXG4gICAgICAgIFwiJiA+ICpcIjoge1xuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tc2VsZWN0aW9uQmFja2dyb3VuZFwiOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IFwiI2Q5ZDlkOVwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCIjMjIyXCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0LmNtLWZvY3VzZWQgPiAuY20tc2Nyb2xsZXIgPiAuY20tc2VsZWN0aW9uTGF5ZXIgLmNtLXNlbGVjdGlvbkJhY2tncm91bmRcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kOiBcIiNkN2Q0ZjBcIlxuICAgIH0sXG4gICAgXCImZGFyay5jbS1mb2N1c2VkID4gLmNtLXNjcm9sbGVyID4gLmNtLXNlbGVjdGlvbkxheWVyIC5jbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZDogXCIjMjMzXCJcbiAgICB9LFxuICAgIFwiLmNtLWN1cnNvckxheWVyXCI6IHtcbiAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCJcbiAgICB9LFxuICAgIFwiJi5jbS1mb2N1c2VkID4gLmNtLXNjcm9sbGVyID4gLmNtLWN1cnNvckxheWVyXCI6IHtcbiAgICAgICAgYW5pbWF0aW9uOiBcInN0ZXBzKDEpIGNtLWJsaW5rIDEuMnMgaW5maW5pdGVcIlxuICAgIH0sXG4gICAgLy8gVHdvIGFuaW1hdGlvbnMgZGVmaW5lZCBzbyB0aGF0IHdlIGNhbiBzd2l0Y2ggYmV0d2VlbiB0aGVtIHRvXG4gICAgLy8gcmVzdGFydCB0aGUgYW5pbWF0aW9uIHdpdGhvdXQgZm9yY2luZyBhbm90aGVyIHN0eWxlXG4gICAgLy8gcmVjb21wdXRhdGlvbi5cbiAgICBcIkBrZXlmcmFtZXMgY20tYmxpbmtcIjogeyBcIjAlXCI6IHt9LCBcIjUwJVwiOiB7IG9wYWNpdHk6IDAgfSwgXCIxMDAlXCI6IHt9IH0sXG4gICAgXCJAa2V5ZnJhbWVzIGNtLWJsaW5rMlwiOiB7IFwiMCVcIjoge30sIFwiNTAlXCI6IHsgb3BhY2l0eTogMCB9LCBcIjEwMCVcIjoge30gfSxcbiAgICBcIi5jbS1jdXJzb3IsIC5jbS1kcm9wQ3Vyc29yXCI6IHtcbiAgICAgICAgYm9yZGVyTGVmdDogXCIxLjJweCBzb2xpZCBibGFja1wiLFxuICAgICAgICBtYXJnaW5MZWZ0OiBcIi0wLjZweFwiLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIixcbiAgICB9LFxuICAgIFwiLmNtLWN1cnNvclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwibm9uZVwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1jdXJzb3JcIjoge1xuICAgICAgICBib3JkZXJMZWZ0Q29sb3I6IFwiIzQ0NFwiXG4gICAgfSxcbiAgICBcIi5jbS1kcm9wQ3Vyc29yXCI6IHtcbiAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIlxuICAgIH0sXG4gICAgXCImLmNtLWZvY3VzZWQgPiAuY20tc2Nyb2xsZXIgPiAuY20tY3Vyc29yTGF5ZXIgLmNtLWN1cnNvclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIlxuICAgIH0sXG4gICAgXCIuY20taXNvXCI6IHtcbiAgICAgICAgdW5pY29kZUJpZGk6IFwiaXNvbGF0ZVwiXG4gICAgfSxcbiAgICBcIi5jbS1hbm5vdW5jZWRcIjoge1xuICAgICAgICBwb3NpdGlvbjogXCJmaXhlZFwiLFxuICAgICAgICB0b3A6IFwiLTEwMDAwcHhcIlxuICAgIH0sXG4gICAgXCJAbWVkaWEgcHJpbnRcIjoge1xuICAgICAgICBcIi5jbS1hbm5vdW5jZWRcIjogeyBkaXNwbGF5OiBcIm5vbmVcIiB9XG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tYWN0aXZlTGluZVwiOiB7IGJhY2tncm91bmRDb2xvcjogXCIjY2NlZWZmNDRcIiB9LFxuICAgIFwiJmRhcmsgLmNtLWFjdGl2ZUxpbmVcIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwiIzk5ZWVmZjMzXCIgfSxcbiAgICBcIiZsaWdodCAuY20tc3BlY2lhbENoYXJcIjogeyBjb2xvcjogXCJyZWRcIiB9LFxuICAgIFwiJmRhcmsgLmNtLXNwZWNpYWxDaGFyXCI6IHsgY29sb3I6IFwiI2Y3OFwiIH0sXG4gICAgXCIuY20tZ3V0dGVyc1wiOiB7XG4gICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgICB6SW5kZXg6IDIwMFxuICAgIH0sXG4gICAgXCImbGlnaHQgLmNtLWd1dHRlcnNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2Y1ZjVmNVwiLFxuICAgICAgICBjb2xvcjogXCIjNmM2YzZjXCIsXG4gICAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjZGRkXCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLWd1dHRlcnNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzMzMzMzOFwiLFxuICAgICAgICBjb2xvcjogXCIjY2NjXCJcbiAgICB9LFxuICAgIFwiLmNtLWd1dHRlclwiOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiZmxleCAhaW1wb3J0YW50XCIsIC8vIE5lY2Vzc2FyeSAtLSBwcmV2ZW50cyBtYXJnaW4gY29sbGFwc2luZ1xuICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBtaW5IZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIlxuICAgIH0sXG4gICAgXCIuY20tZ3V0dGVyRWxlbWVudFwiOiB7XG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCJcbiAgICB9LFxuICAgIFwiLmNtLWxpbmVOdW1iZXJzIC5jbS1ndXR0ZXJFbGVtZW50XCI6IHtcbiAgICAgICAgcGFkZGluZzogXCIwIDNweCAwIDVweFwiLFxuICAgICAgICBtaW5XaWR0aDogXCIyMHB4XCIsXG4gICAgICAgIHRleHRBbGlnbjogXCJyaWdodFwiLFxuICAgICAgICB3aGl0ZVNwYWNlOiBcIm5vd3JhcFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tYWN0aXZlTGluZUd1dHRlclwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZTJmMmZmXCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLWFjdGl2ZUxpbmVHdXR0ZXJcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzIyMjIyN1wiXG4gICAgfSxcbiAgICBcIi5jbS1wYW5lbHNcIjoge1xuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgICBwb3NpdGlvbjogXCJzdGlja3lcIixcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgcmlnaHQ6IDBcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1wYW5lbHNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2Y1ZjVmNVwiLFxuICAgICAgICBjb2xvcjogXCJibGFja1wiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tcGFuZWxzLXRvcFwiOiB7XG4gICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgI2RkZFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tcGFuZWxzLWJvdHRvbVwiOiB7XG4gICAgICAgIGJvcmRlclRvcDogXCIxcHggc29saWQgI2RkZFwiXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1wYW5lbHNcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzMzMzMzOFwiLFxuICAgICAgICBjb2xvcjogXCJ3aGl0ZVwiXG4gICAgfSxcbiAgICBcIi5jbS10YWJcIjoge1xuICAgICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJib3R0b21cIlxuICAgIH0sXG4gICAgXCIuY20td2lkZ2V0QnVmZmVyXCI6IHtcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJ0ZXh0LXRvcFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMWVtXCIsXG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBkaXNwbGF5OiBcImlubGluZVwiXG4gICAgfSxcbiAgICBcIi5jbS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgIGNvbG9yOiBcIiM4ODhcIixcbiAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJ0b3BcIixcbiAgICB9LFxuICAgIFwiLmNtLWhpZ2hsaWdodFNwYWNlOmJlZm9yZVwiOiB7XG4gICAgICAgIGNvbnRlbnQ6IFwiYXR0cihkYXRhLWRpc3BsYXkpXCIsXG4gICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiLFxuICAgICAgICBjb2xvcjogXCIjODg4XCJcbiAgICB9LFxuICAgIFwiLmNtLWhpZ2hsaWdodFRhYlwiOiB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogYHVybCgnZGF0YTppbWFnZS9zdmcreG1sLDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjAwXCIgaGVpZ2h0PVwiMjBcIj48cGF0aCBzdHJva2U9XCIlMjM4ODhcIiBzdHJva2Utd2lkdGg9XCIxXCIgZmlsbD1cIm5vbmVcIiBkPVwiTTEgMTBIMTk2TDE5MCA1TTE5MCAxNUwxOTYgMTBNMTk3IDRMMTk3IDE2XCIvPjwvc3ZnPicpYCxcbiAgICAgICAgYmFja2dyb3VuZFNpemU6IFwiYXV0byAxMDAlXCIsXG4gICAgICAgIGJhY2tncm91bmRQb3NpdGlvbjogXCJyaWdodCA5MCVcIixcbiAgICAgICAgYmFja2dyb3VuZFJlcGVhdDogXCJuby1yZXBlYXRcIlxuICAgIH0sXG4gICAgXCIuY20tdHJhaWxpbmdTcGFjZVwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZmYzMzIyNTVcIlxuICAgIH0sXG4gICAgXCIuY20tYnV0dG9uXCI6IHtcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJtaWRkbGVcIixcbiAgICAgICAgY29sb3I6IFwiaW5oZXJpdFwiLFxuICAgICAgICBmb250U2l6ZTogXCI3MCVcIixcbiAgICAgICAgcGFkZGluZzogXCIuMmVtIDFlbVwiLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMXB4XCJcbiAgICB9LFxuICAgIFwiJmxpZ2h0IC5jbS1idXR0b25cIjoge1xuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwibGluZWFyLWdyYWRpZW50KCNlZmYxZjUsICNkOWQ5ZGYpXCIsXG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgIzg4OFwiLFxuICAgICAgICBcIiY6YWN0aXZlXCI6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZTogXCJsaW5lYXItZ3JhZGllbnQoI2I0YjRiNCwgI2QwZDNkNilcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS1idXR0b25cIjoge1xuICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IFwibGluZWFyLWdyYWRpZW50KCMzOTM5MzksICMxMTEpXCIsXG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgIzg4OFwiLFxuICAgICAgICBcIiY6YWN0aXZlXCI6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZTogXCJsaW5lYXItZ3JhZGllbnQoIzExMSwgIzMzMylcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBcIi5jbS10ZXh0ZmllbGRcIjoge1xuICAgICAgICB2ZXJ0aWNhbEFsaWduOiBcIm1pZGRsZVwiLFxuICAgICAgICBjb2xvcjogXCJpbmhlcml0XCIsXG4gICAgICAgIGZvbnRTaXplOiBcIjcwJVwiLFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkIHNpbHZlclwiLFxuICAgICAgICBwYWRkaW5nOiBcIi4yZW0gLjVlbVwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tdGV4dGZpZWxkXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIndoaXRlXCJcbiAgICB9LFxuICAgIFwiJmRhcmsgLmNtLXRleHRmaWVsZFwiOiB7XG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgIzU1NVwiLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiaW5oZXJpdFwiXG4gICAgfVxufSwgbGlnaHREYXJrSURzKTtcblxuY29uc3QgTGluZUJyZWFrUGxhY2Vob2xkZXIgPSBcIlxcdWZmZmZcIjtcbmNsYXNzIERPTVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocG9pbnRzLCBzdGF0ZSkge1xuICAgICAgICB0aGlzLnBvaW50cyA9IHBvaW50cztcbiAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5saW5lU2VwYXJhdG9yID0gc3RhdGUuZmFjZXQoRWRpdG9yU3RhdGUubGluZVNlcGFyYXRvcik7XG4gICAgfVxuICAgIGFwcGVuZCh0ZXh0KSB7XG4gICAgICAgIHRoaXMudGV4dCArPSB0ZXh0O1xuICAgIH1cbiAgICBsaW5lQnJlYWsoKSB7XG4gICAgICAgIHRoaXMudGV4dCArPSBMaW5lQnJlYWtQbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgcmVhZFJhbmdlKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKCFzdGFydClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgcGFyZW50ID0gc3RhcnQucGFyZW50Tm9kZTtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gc3RhcnQ7Oykge1xuICAgICAgICAgICAgdGhpcy5maW5kUG9pbnRCZWZvcmUocGFyZW50LCBjdXIpO1xuICAgICAgICAgICAgbGV0IG9sZExlbiA9IHRoaXMudGV4dC5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnJlYWROb2RlKGN1cik7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGN1ci5uZXh0U2libGluZztcbiAgICAgICAgICAgIGlmIChuZXh0ID09IGVuZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCB2aWV3ID0gQ29udGVudFZpZXcuZ2V0KGN1ciksIG5leHRWaWV3ID0gQ29udGVudFZpZXcuZ2V0KG5leHQpO1xuICAgICAgICAgICAgaWYgKHZpZXcgJiYgbmV4dFZpZXcgPyB2aWV3LmJyZWFrQWZ0ZXIgOlxuICAgICAgICAgICAgICAgICh2aWV3ID8gdmlldy5icmVha0FmdGVyIDogaXNCbG9ja0VsZW1lbnQoY3VyKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGlzQmxvY2tFbGVtZW50KG5leHQpICYmIChjdXIubm9kZU5hbWUgIT0gXCJCUlwiIHx8IGN1ci5jbUlnbm9yZSkgJiYgdGhpcy50ZXh0Lmxlbmd0aCA+IG9sZExlbikpXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsoKTtcbiAgICAgICAgICAgIGN1ciA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5kUG9pbnRCZWZvcmUocGFyZW50LCBlbmQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVhZFRleHROb2RlKG5vZGUpIHtcbiAgICAgICAgbGV0IHRleHQgPSBub2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgZm9yIChsZXQgcG9pbnQgb2YgdGhpcy5wb2ludHMpXG4gICAgICAgICAgICBpZiAocG9pbnQubm9kZSA9PSBub2RlKVxuICAgICAgICAgICAgICAgIHBvaW50LnBvcyA9IHRoaXMudGV4dC5sZW5ndGggKyBNYXRoLm1pbihwb2ludC5vZmZzZXQsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgb2ZmID0gMCwgcmUgPSB0aGlzLmxpbmVTZXBhcmF0b3IgPyBudWxsIDogL1xcclxcbj98XFxuL2c7Oykge1xuICAgICAgICAgICAgbGV0IG5leHRCcmVhayA9IC0xLCBicmVha1NpemUgPSAxLCBtO1xuICAgICAgICAgICAgaWYgKHRoaXMubGluZVNlcGFyYXRvcikge1xuICAgICAgICAgICAgICAgIG5leHRCcmVhayA9IHRleHQuaW5kZXhPZih0aGlzLmxpbmVTZXBhcmF0b3IsIG9mZik7XG4gICAgICAgICAgICAgICAgYnJlYWtTaXplID0gdGhpcy5saW5lU2VwYXJhdG9yLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG0gPSByZS5leGVjKHRleHQpKSB7XG4gICAgICAgICAgICAgICAgbmV4dEJyZWFrID0gbS5pbmRleDtcbiAgICAgICAgICAgICAgICBicmVha1NpemUgPSBtWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRleHQuc2xpY2Uob2ZmLCBuZXh0QnJlYWsgPCAwID8gdGV4dC5sZW5ndGggOiBuZXh0QnJlYWspKTtcbiAgICAgICAgICAgIGlmIChuZXh0QnJlYWsgPCAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdGhpcy5saW5lQnJlYWsoKTtcbiAgICAgICAgICAgIGlmIChicmVha1NpemUgPiAxKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHBvaW50IG9mIHRoaXMucG9pbnRzKVxuICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnQubm9kZSA9PSBub2RlICYmIHBvaW50LnBvcyA+IHRoaXMudGV4dC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludC5wb3MgLT0gYnJlYWtTaXplIC0gMTtcbiAgICAgICAgICAgIG9mZiA9IG5leHRCcmVhayArIGJyZWFrU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWFkTm9kZShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmNtSWdub3JlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgdmlldyA9IENvbnRlbnRWaWV3LmdldChub2RlKTtcbiAgICAgICAgbGV0IGZyb21WaWV3ID0gdmlldyAmJiB2aWV3Lm92ZXJyaWRlRE9NVGV4dDtcbiAgICAgICAgaWYgKGZyb21WaWV3ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZmluZFBvaW50SW5zaWRlKG5vZGUsIGZyb21WaWV3Lmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZnJvbVZpZXcuaXRlcigpOyAhaS5uZXh0KCkuZG9uZTspIHtcbiAgICAgICAgICAgICAgICBpZiAoaS5saW5lQnJlYWspXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUJyZWFrKCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZChpLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZFRleHROb2RlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJCUlwiKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5uZXh0U2libGluZylcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVCcmVhaygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5yZWFkUmFuZ2Uobm9kZS5maXJzdENoaWxkLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5kUG9pbnRCZWZvcmUobm9kZSwgbmV4dCkge1xuICAgICAgICBmb3IgKGxldCBwb2ludCBvZiB0aGlzLnBvaW50cylcbiAgICAgICAgICAgIGlmIChwb2ludC5ub2RlID09IG5vZGUgJiYgbm9kZS5jaGlsZE5vZGVzW3BvaW50Lm9mZnNldF0gPT0gbmV4dClcbiAgICAgICAgICAgICAgICBwb2ludC5wb3MgPSB0aGlzLnRleHQubGVuZ3RoO1xuICAgIH1cbiAgICBmaW5kUG9pbnRJbnNpZGUobm9kZSwgbGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IHBvaW50IG9mIHRoaXMucG9pbnRzKVxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyA/IHBvaW50Lm5vZGUgPT0gbm9kZSA6IG5vZGUuY29udGFpbnMocG9pbnQubm9kZSkpXG4gICAgICAgICAgICAgICAgcG9pbnQucG9zID0gdGhpcy50ZXh0Lmxlbmd0aCArIChpc0F0RW5kKG5vZGUsIHBvaW50Lm5vZGUsIHBvaW50Lm9mZnNldCkgPyBsZW5ndGggOiAwKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0F0RW5kKHBhcmVudCwgbm9kZSwgb2Zmc2V0KSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoIW5vZGUgfHwgb2Zmc2V0IDwgbWF4T2Zmc2V0KG5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSkgKyAxO1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzQmxvY2tFbGVtZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSAxICYmIC9eKERJVnxQfExJfFVMfE9MfEJMT0NLUVVPVEV8RER8RFR8SFxcZHxTRUNUSU9OfFBSRSkkLy50ZXN0KG5vZGUubm9kZU5hbWUpO1xufVxuY2xhc3MgRE9NUG9pbnQge1xuICAgIGNvbnN0cnVjdG9yKG5vZGUsIG9mZnNldCkge1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5wb3MgPSAtMTtcbiAgICB9XG59XG5cbmNsYXNzIERPTUNoYW5nZSB7XG4gICAgY29uc3RydWN0b3Iodmlldywgc3RhcnQsIGVuZCwgdHlwZU92ZXIpIHtcbiAgICAgICAgdGhpcy50eXBlT3ZlciA9IHR5cGVPdmVyO1xuICAgICAgICB0aGlzLmJvdW5kcyA9IG51bGw7XG4gICAgICAgIHRoaXMudGV4dCA9IFwiXCI7XG4gICAgICAgIGxldCB7IGltcHJlY2lzZUhlYWQ6IGlIZWFkLCBpbXByZWNpc2VBbmNob3I6IGlBbmNob3IgfSA9IHZpZXcuZG9jVmlldztcbiAgICAgICAgaWYgKHZpZXcuc3RhdGUucmVhZE9ubHkgJiYgc3RhcnQgPiAtMSkge1xuICAgICAgICAgICAgLy8gSWdub3JlIGNoYW5nZXMgd2hlbiB0aGUgZWRpdG9yIGlzIHJlYWQtb25seVxuICAgICAgICAgICAgdGhpcy5uZXdTZWwgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXJ0ID4gLTEgJiYgKHRoaXMuYm91bmRzID0gdmlldy5kb2NWaWV3LmRvbUJvdW5kc0Fyb3VuZChzdGFydCwgZW5kLCAwKSkpIHtcbiAgICAgICAgICAgIGxldCBzZWxQb2ludHMgPSBpSGVhZCB8fCBpQW5jaG9yID8gW10gOiBzZWxlY3Rpb25Qb2ludHModmlldyk7XG4gICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IERPTVJlYWRlcihzZWxQb2ludHMsIHZpZXcuc3RhdGUpO1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRSYW5nZSh0aGlzLmJvdW5kcy5zdGFydERPTSwgdGhpcy5ib3VuZHMuZW5kRE9NKTtcbiAgICAgICAgICAgIHRoaXMudGV4dCA9IHJlYWRlci50ZXh0O1xuICAgICAgICAgICAgdGhpcy5uZXdTZWwgPSBzZWxlY3Rpb25Gcm9tUG9pbnRzKHNlbFBvaW50cywgdGhpcy5ib3VuZHMuZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZG9tU2VsID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgICAgIGxldCBoZWFkID0gaUhlYWQgJiYgaUhlYWQubm9kZSA9PSBkb21TZWwuZm9jdXNOb2RlICYmIGlIZWFkLm9mZnNldCA9PSBkb21TZWwuZm9jdXNPZmZzZXQgfHxcbiAgICAgICAgICAgICAgICAhY29udGFpbnModmlldy5jb250ZW50RE9NLCBkb21TZWwuZm9jdXNOb2RlKVxuICAgICAgICAgICAgICAgID8gdmlldy5zdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkXG4gICAgICAgICAgICAgICAgOiB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQpO1xuICAgICAgICAgICAgbGV0IGFuY2hvciA9IGlBbmNob3IgJiYgaUFuY2hvci5ub2RlID09IGRvbVNlbC5hbmNob3JOb2RlICYmIGlBbmNob3Iub2Zmc2V0ID09IGRvbVNlbC5hbmNob3JPZmZzZXQgfHxcbiAgICAgICAgICAgICAgICAhY29udGFpbnModmlldy5jb250ZW50RE9NLCBkb21TZWwuYW5jaG9yTm9kZSlcbiAgICAgICAgICAgICAgICA/IHZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4uYW5jaG9yXG4gICAgICAgICAgICAgICAgOiB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShkb21TZWwuYW5jaG9yTm9kZSwgZG9tU2VsLmFuY2hvck9mZnNldCk7XG4gICAgICAgICAgICAvLyBpT1Mgd2lsbCByZWZ1c2UgdG8gc2VsZWN0IHRoZSBibG9jayBnYXBzIHdoZW4gZG9pbmcgc2VsZWN0LWFsbFxuICAgICAgICAgICAgbGV0IHZwID0gdmlldy52aWV3cG9ydDtcbiAgICAgICAgICAgIGlmIChicm93c2VyLmlvcyAmJiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmVtcHR5ICYmIGhlYWQgIT0gYW5jaG9yICYmXG4gICAgICAgICAgICAgICAgKHZwLmZyb20gPiAwIHx8IHZwLnRvIDwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIGxldCBvZmZGcm9tID0gdnAuZnJvbSAtIE1hdGgubWluKGhlYWQsIGFuY2hvciksIG9mZlRvID0gdnAudG8gLSBNYXRoLm1heChoZWFkLCBhbmNob3IpO1xuICAgICAgICAgICAgICAgIGlmICgob2ZmRnJvbSA9PSAwIHx8IG9mZkZyb20gPT0gMSkgJiYgKG9mZlRvID09IDAgfHwgb2ZmVG8gPT0gLTEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBhbmNob3IgPSB2aWV3LnN0YXRlLmRvYy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZXdTZWwgPSBFZGl0b3JTZWxlY3Rpb24uc2luZ2xlKGFuY2hvciwgaGVhZCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBhcHBseURPTUNoYW5nZSh2aWV3LCBkb21DaGFuZ2UpIHtcbiAgICBsZXQgY2hhbmdlO1xuICAgIGxldCB7IG5ld1NlbCB9ID0gZG9tQ2hhbmdlLCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluO1xuICAgIGxldCBsYXN0S2V5ID0gdmlldy5pbnB1dFN0YXRlLmxhc3RLZXlUaW1lID4gRGF0ZS5ub3coKSAtIDEwMCA/IHZpZXcuaW5wdXRTdGF0ZS5sYXN0S2V5Q29kZSA6IC0xO1xuICAgIGlmIChkb21DaGFuZ2UuYm91bmRzKSB7XG4gICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSBkb21DaGFuZ2UuYm91bmRzO1xuICAgICAgICBsZXQgcHJlZmVycmVkUG9zID0gc2VsLmZyb20sIHByZWZlcnJlZFNpZGUgPSBudWxsO1xuICAgICAgICAvLyBQcmVmZXIgYW5jaG9yaW5nIHRvIGVuZCB3aGVuIEJhY2tzcGFjZSBpcyBwcmVzc2VkIChvciwgb25cbiAgICAgICAgLy8gQW5kcm9pZCwgd2hlbiBzb21ldGhpbmcgd2FzIGRlbGV0ZWQpXG4gICAgICAgIGlmIChsYXN0S2V5ID09PSA4IHx8IGJyb3dzZXIuYW5kcm9pZCAmJiBkb21DaGFuZ2UudGV4dC5sZW5ndGggPCB0byAtIGZyb20pIHtcbiAgICAgICAgICAgIHByZWZlcnJlZFBvcyA9IHNlbC50bztcbiAgICAgICAgICAgIHByZWZlcnJlZFNpZGUgPSBcImVuZFwiO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkaWZmID0gZmluZERpZmYodmlldy5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcoZnJvbSwgdG8sIExpbmVCcmVha1BsYWNlaG9sZGVyKSwgZG9tQ2hhbmdlLnRleHQsIHByZWZlcnJlZFBvcyAtIGZyb20sIHByZWZlcnJlZFNpZGUpO1xuICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgLy8gQ2hyb21lIGluc2VydHMgdHdvIG5ld2xpbmVzIHdoZW4gcHJlc3Npbmcgc2hpZnQtZW50ZXIgYXQgdGhlXG4gICAgICAgICAgICAvLyBlbmQgb2YgYSBsaW5lLiBEb21DaGFuZ2UgZHJvcHMgb25lIG9mIHRob3NlLlxuICAgICAgICAgICAgaWYgKGJyb3dzZXIuY2hyb21lICYmIGxhc3RLZXkgPT0gMTMgJiZcbiAgICAgICAgICAgICAgICBkaWZmLnRvQiA9PSBkaWZmLmZyb20gKyAyICYmIGRvbUNoYW5nZS50ZXh0LnNsaWNlKGRpZmYuZnJvbSwgZGlmZi50b0IpID09IExpbmVCcmVha1BsYWNlaG9sZGVyICsgTGluZUJyZWFrUGxhY2Vob2xkZXIpXG4gICAgICAgICAgICAgICAgZGlmZi50b0ItLTtcbiAgICAgICAgICAgIGNoYW5nZSA9IHsgZnJvbTogZnJvbSArIGRpZmYuZnJvbSwgdG86IGZyb20gKyBkaWZmLnRvQSxcbiAgICAgICAgICAgICAgICBpbnNlcnQ6IFRleHQub2YoZG9tQ2hhbmdlLnRleHQuc2xpY2UoZGlmZi5mcm9tLCBkaWZmLnRvQikuc3BsaXQoTGluZUJyZWFrUGxhY2Vob2xkZXIpKSB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKG5ld1NlbCAmJiAoIXZpZXcuaGFzRm9jdXMgJiYgdmlldy5zdGF0ZS5mYWNldChlZGl0YWJsZSkgfHwgbmV3U2VsLm1haW4uZXEoc2VsKSkpIHtcbiAgICAgICAgbmV3U2VsID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFjaGFuZ2UgJiYgIW5ld1NlbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghY2hhbmdlICYmIGRvbUNoYW5nZS50eXBlT3ZlciAmJiAhc2VsLmVtcHR5ICYmIG5ld1NlbCAmJiBuZXdTZWwubWFpbi5lbXB0eSkge1xuICAgICAgICAvLyBIZXVyaXN0aWMgdG8gbm90aWNlIHR5cGluZyBvdmVyIGEgc2VsZWN0ZWQgY2hhcmFjdGVyXG4gICAgICAgIGNoYW5nZSA9IHsgZnJvbTogc2VsLmZyb20sIHRvOiBzZWwudG8sIGluc2VydDogdmlldy5zdGF0ZS5kb2Muc2xpY2Uoc2VsLmZyb20sIHNlbC50bykgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hhbmdlICYmIGNoYW5nZS5mcm9tID49IHNlbC5mcm9tICYmIGNoYW5nZS50byA8PSBzZWwudG8gJiZcbiAgICAgICAgKGNoYW5nZS5mcm9tICE9IHNlbC5mcm9tIHx8IGNoYW5nZS50byAhPSBzZWwudG8pICYmXG4gICAgICAgIChzZWwudG8gLSBzZWwuZnJvbSkgLSAoY2hhbmdlLnRvIC0gY2hhbmdlLmZyb20pIDw9IDQpIHtcbiAgICAgICAgLy8gSWYgdGhlIGNoYW5nZSBpcyBpbnNpZGUgdGhlIHNlbGVjdGlvbiBhbmQgY292ZXJzIG1vc3Qgb2YgaXQsXG4gICAgICAgIC8vIGFzc3VtZSBpdCBpcyBhIHNlbGVjdGlvbiByZXBsYWNlICh3aXRoIGlkZW50aWNhbCBjaGFyYWN0ZXJzIGF0XG4gICAgICAgIC8vIHRoZSBzdGFydC9lbmQgbm90IGluY2x1ZGVkIGluIHRoZSBkaWZmKVxuICAgICAgICBjaGFuZ2UgPSB7XG4gICAgICAgICAgICBmcm9tOiBzZWwuZnJvbSwgdG86IHNlbC50byxcbiAgICAgICAgICAgIGluc2VydDogdmlldy5zdGF0ZS5kb2Muc2xpY2Uoc2VsLmZyb20sIGNoYW5nZS5mcm9tKS5hcHBlbmQoY2hhbmdlLmluc2VydCkuYXBwZW5kKHZpZXcuc3RhdGUuZG9jLnNsaWNlKGNoYW5nZS50bywgc2VsLnRvKSlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKGJyb3dzZXIubWFjIHx8IGJyb3dzZXIuYW5kcm9pZCkgJiYgY2hhbmdlICYmIGNoYW5nZS5mcm9tID09IGNoYW5nZS50byAmJiBjaGFuZ2UuZnJvbSA9PSBzZWwuaGVhZCAtIDEgJiZcbiAgICAgICAgL15cXC4gPyQvLnRlc3QoY2hhbmdlLmluc2VydC50b1N0cmluZygpKSAmJiB2aWV3LmNvbnRlbnRET00uZ2V0QXR0cmlidXRlKFwiYXV0b2NvcnJlY3RcIikgPT0gXCJvZmZcIikge1xuICAgICAgICAvLyBEZXRlY3QgaW5zZXJ0LXBlcmlvZC1vbi1kb3VibGUtc3BhY2UgTWFjIGFuZCBBbmRyb2lkIGJlaGF2aW9yLFxuICAgICAgICAvLyBhbmQgdHJhbnNmb3JtIGl0IGludG8gYSByZWd1bGFyIHNwYWNlIGluc2VydC5cbiAgICAgICAgaWYgKG5ld1NlbCAmJiBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA9PSAyKVxuICAgICAgICAgICAgbmV3U2VsID0gRWRpdG9yU2VsZWN0aW9uLnNpbmdsZShuZXdTZWwubWFpbi5hbmNob3IgLSAxLCBuZXdTZWwubWFpbi5oZWFkIC0gMSk7XG4gICAgICAgIGNoYW5nZSA9IHsgZnJvbTogc2VsLmZyb20sIHRvOiBzZWwudG8sIGluc2VydDogVGV4dC5vZihbXCIgXCJdKSB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChicm93c2VyLmNocm9tZSAmJiBjaGFuZ2UgJiYgY2hhbmdlLmZyb20gPT0gY2hhbmdlLnRvICYmIGNoYW5nZS5mcm9tID09IHNlbC5oZWFkICYmXG4gICAgICAgIGNoYW5nZS5pbnNlcnQudG9TdHJpbmcoKSA9PSBcIlxcbiBcIiAmJiB2aWV3LmxpbmVXcmFwcGluZykge1xuICAgICAgICAvLyBJbiBDaHJvbWUsIGlmIHlvdSBpbnNlcnQgYSBzcGFjZSBhdCB0aGUgc3RhcnQgb2YgYSB3cmFwcGVkXG4gICAgICAgIC8vIGxpbmUsIGl0IHdpbGwgYWN0dWFsbHkgaW5zZXJ0IGEgbmV3bGluZSBhbmQgYSBzcGFjZSwgY2F1c2luZyBhXG4gICAgICAgIC8vIGJvZ3VzIG5ldyBsaW5lIHRvIGJlIGNyZWF0ZWQgaW4gQ29kZU1pcnJvciAoIzk2OClcbiAgICAgICAgaWYgKG5ld1NlbClcbiAgICAgICAgICAgIG5ld1NlbCA9IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUobmV3U2VsLm1haW4uYW5jaG9yIC0gMSwgbmV3U2VsLm1haW4uaGVhZCAtIDEpO1xuICAgICAgICBjaGFuZ2UgPSB7IGZyb206IHNlbC5mcm9tLCB0bzogc2VsLnRvLCBpbnNlcnQ6IFRleHQub2YoW1wiIFwiXSkgfTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZSkge1xuICAgICAgICBpZiAoYnJvd3Nlci5pb3MgJiYgdmlldy5pbnB1dFN0YXRlLmZsdXNoSU9TS2V5KCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gQW5kcm9pZCBicm93c2VycyBkb24ndCBmaXJlIHJlYXNvbmFibGUga2V5IGV2ZW50cyBmb3IgZW50ZXIsXG4gICAgICAgIC8vIGJhY2tzcGFjZSwgb3IgZGVsZXRlLiBTbyB0aGlzIGRldGVjdHMgY2hhbmdlcyB0aGF0IGxvb2sgbGlrZVxuICAgICAgICAvLyB0aGV5J3JlIGNhdXNlZCBieSB0aG9zZSBrZXlzLCBhbmQgcmVpbnRlcnByZXRzIHRoZW0gYXMga2V5XG4gICAgICAgIC8vIGV2ZW50cy4gKFNvbWUgb2YgdGhlc2Uga2V5cyBhcmUgYWxzbyBoYW5kbGVkIGJ5IGJlZm9yZWlucHV0XG4gICAgICAgIC8vIGV2ZW50cyBhbmQgdGhlIHBlbmRpbmdBbmRyb2lkS2V5IG1lY2hhbmlzbSwgYnV0IHRoYXQncyBub3RcbiAgICAgICAgLy8gcmVsaWFibGUgaW4gYWxsIHNpdHVhdGlvbnMuKVxuICAgICAgICBpZiAoYnJvd3Nlci5hbmRyb2lkICYmXG4gICAgICAgICAgICAoKGNoYW5nZS5mcm9tID09IHNlbC5mcm9tICYmIGNoYW5nZS50byA9PSBzZWwudG8gJiZcbiAgICAgICAgICAgICAgICBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA9PSAxICYmIGNoYW5nZS5pbnNlcnQubGluZXMgPT0gMiAmJlxuICAgICAgICAgICAgICAgIGRpc3BhdGNoS2V5KHZpZXcuY29udGVudERPTSwgXCJFbnRlclwiLCAxMykpIHx8XG4gICAgICAgICAgICAgICAgKChjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAtIDEgJiYgY2hhbmdlLnRvID09IHNlbC50byAmJiBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA9PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgIGxhc3RLZXkgPT0gOCAmJiBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA8IGNoYW5nZS50byAtIGNoYW5nZS5mcm9tICYmIGNoYW5nZS50byA+IHNlbC5oZWFkKSAmJlxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh2aWV3LmNvbnRlbnRET00sIFwiQmFja3NwYWNlXCIsIDgpKSB8fFxuICAgICAgICAgICAgICAgIChjaGFuZ2UuZnJvbSA9PSBzZWwuZnJvbSAmJiBjaGFuZ2UudG8gPT0gc2VsLnRvICsgMSAmJiBjaGFuZ2UuaW5zZXJ0Lmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoS2V5KHZpZXcuY29udGVudERPTSwgXCJEZWxldGVcIiwgNDYpKSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IHRleHQgPSBjaGFuZ2UuaW5zZXJ0LnRvU3RyaW5nKCk7XG4gICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nID49IDApXG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nKys7XG4gICAgICAgIGxldCBkZWZhdWx0VHI7XG4gICAgICAgIGxldCBkZWZhdWx0SW5zZXJ0ID0gKCkgPT4gZGVmYXVsdFRyIHx8IChkZWZhdWx0VHIgPSBhcHBseURlZmF1bHRJbnNlcnQodmlldywgY2hhbmdlLCBuZXdTZWwpKTtcbiAgICAgICAgaWYgKCF2aWV3LnN0YXRlLmZhY2V0KGlucHV0SGFuZGxlcikuc29tZShoID0+IGgodmlldywgY2hhbmdlLmZyb20sIGNoYW5nZS50bywgdGV4dCwgZGVmYXVsdEluc2VydCkpKVxuICAgICAgICAgICAgdmlldy5kaXNwYXRjaChkZWZhdWx0SW5zZXJ0KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAobmV3U2VsICYmICFuZXdTZWwubWFpbi5lcShzZWwpKSB7XG4gICAgICAgIGxldCBzY3JvbGxJbnRvVmlldyA9IGZhbHNlLCB1c2VyRXZlbnQgPSBcInNlbGVjdFwiO1xuICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmxhc3RTZWxlY3Rpb25UaW1lID4gRGF0ZS5ub3coKSAtIDUwKSB7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dFN0YXRlLmxhc3RTZWxlY3Rpb25PcmlnaW4gPT0gXCJzZWxlY3RcIilcbiAgICAgICAgICAgICAgICBzY3JvbGxJbnRvVmlldyA9IHRydWU7XG4gICAgICAgICAgICB1c2VyRXZlbnQgPSB2aWV3LmlucHV0U3RhdGUubGFzdFNlbGVjdGlvbk9yaWdpbjtcbiAgICAgICAgfVxuICAgICAgICB2aWV3LmRpc3BhdGNoKHsgc2VsZWN0aW9uOiBuZXdTZWwsIHNjcm9sbEludG9WaWV3LCB1c2VyRXZlbnQgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGx5RGVmYXVsdEluc2VydCh2aWV3LCBjaGFuZ2UsIG5ld1NlbCkge1xuICAgIGxldCB0ciwgc3RhcnRTdGF0ZSA9IHZpZXcuc3RhdGUsIHNlbCA9IHN0YXJ0U3RhdGUuc2VsZWN0aW9uLm1haW47XG4gICAgaWYgKGNoYW5nZS5mcm9tID49IHNlbC5mcm9tICYmIGNoYW5nZS50byA8PSBzZWwudG8gJiYgY2hhbmdlLnRvIC0gY2hhbmdlLmZyb20gPj0gKHNlbC50byAtIHNlbC5mcm9tKSAvIDMgJiZcbiAgICAgICAgKCFuZXdTZWwgfHwgbmV3U2VsLm1haW4uZW1wdHkgJiYgbmV3U2VsLm1haW4uZnJvbSA9PSBjaGFuZ2UuZnJvbSArIGNoYW5nZS5pbnNlcnQubGVuZ3RoKSAmJlxuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaW5nIDwgMCkge1xuICAgICAgICBsZXQgYmVmb3JlID0gc2VsLmZyb20gPCBjaGFuZ2UuZnJvbSA/IHN0YXJ0U3RhdGUuc2xpY2VEb2Moc2VsLmZyb20sIGNoYW5nZS5mcm9tKSA6IFwiXCI7XG4gICAgICAgIGxldCBhZnRlciA9IHNlbC50byA+IGNoYW5nZS50byA/IHN0YXJ0U3RhdGUuc2xpY2VEb2MoY2hhbmdlLnRvLCBzZWwudG8pIDogXCJcIjtcbiAgICAgICAgdHIgPSBzdGFydFN0YXRlLnJlcGxhY2VTZWxlY3Rpb24odmlldy5zdGF0ZS50b1RleHQoYmVmb3JlICsgY2hhbmdlLmluc2VydC5zbGljZVN0cmluZygwLCB1bmRlZmluZWQsIHZpZXcuc3RhdGUubGluZUJyZWFrKSArIGFmdGVyKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgY2hhbmdlcyA9IHN0YXJ0U3RhdGUuY2hhbmdlcyhjaGFuZ2UpO1xuICAgICAgICBsZXQgbWFpblNlbCA9IG5ld1NlbCAmJiBuZXdTZWwubWFpbi50byA8PSBjaGFuZ2VzLm5ld0xlbmd0aCA/IG5ld1NlbC5tYWluIDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBUcnkgdG8gYXBwbHkgYSBjb21wb3NpdGlvbiBjaGFuZ2UgdG8gYWxsIGN1cnNvcnNcbiAgICAgICAgaWYgKHN0YXJ0U3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5sZW5ndGggPiAxICYmIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpbmcgPj0gMCAmJlxuICAgICAgICAgICAgY2hhbmdlLnRvIDw9IHNlbC50byAmJiBjaGFuZ2UudG8gPj0gc2VsLnRvIC0gMTApIHtcbiAgICAgICAgICAgIGxldCByZXBsYWNlZCA9IHZpZXcuc3RhdGUuc2xpY2VEb2MoY2hhbmdlLmZyb20sIGNoYW5nZS50byk7XG4gICAgICAgICAgICBsZXQgY29tcG9zaXRpb25SYW5nZSwgY29tcG9zaXRpb24gPSBuZXdTZWwgJiYgZmluZENvbXBvc2l0aW9uTm9kZSh2aWV3LCBuZXdTZWwubWFpbi5oZWFkKTtcbiAgICAgICAgICAgIGlmIChjb21wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCBkTGVuID0gY2hhbmdlLmluc2VydC5sZW5ndGggLSAoY2hhbmdlLnRvIC0gY2hhbmdlLmZyb20pO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uUmFuZ2UgPSB7IGZyb206IGNvbXBvc2l0aW9uLmZyb20sIHRvOiBjb21wb3NpdGlvbi50byAtIGRMZW4gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uUmFuZ2UgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQoc2VsLmhlYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG9mZnNldCA9IHNlbC50byAtIGNoYW5nZS50bywgc2l6ZSA9IHNlbC50byAtIHNlbC5mcm9tO1xuICAgICAgICAgICAgdHIgPSBzdGFydFN0YXRlLmNoYW5nZUJ5UmFuZ2UocmFuZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZS5mcm9tID09IHNlbC5mcm9tICYmIHJhbmdlLnRvID09IHNlbC50bylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgY2hhbmdlcywgcmFuZ2U6IG1haW5TZWwgfHwgcmFuZ2UubWFwKGNoYW5nZXMpIH07XG4gICAgICAgICAgICAgICAgbGV0IHRvID0gcmFuZ2UudG8gLSBvZmZzZXQsIGZyb20gPSB0byAtIHJlcGxhY2VkLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UudG8gLSByYW5nZS5mcm9tICE9IHNpemUgfHwgdmlldy5zdGF0ZS5zbGljZURvYyhmcm9tLCB0bykgIT0gcmVwbGFjZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgdGhlcmUncyBubyB3YXkgdG8gbWFrZSBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VzIGluIHRoZSBzYW1lIG5vZGUgd29yayB3aXRob3V0IGFib3J0aW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvc2l0aW9uLCBzbyBjdXJzb3JzIGluIHRoZSBjb21wb3NpdGlvbiByYW5nZSBhcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlZC5cbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UudG8gPj0gY29tcG9zaXRpb25SYW5nZS5mcm9tICYmIHJhbmdlLmZyb20gPD0gY29tcG9zaXRpb25SYW5nZS50bylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2UgfTtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2VDaGFuZ2VzID0gc3RhcnRTdGF0ZS5jaGFuZ2VzKHsgZnJvbSwgdG8sIGluc2VydDogY2hhbmdlLmluc2VydCB9KSwgc2VsT2ZmID0gcmFuZ2UudG8gLSBzZWwudG87XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlczogcmFuZ2VDaGFuZ2VzLFxuICAgICAgICAgICAgICAgICAgICByYW5nZTogIW1haW5TZWwgPyByYW5nZS5tYXAocmFuZ2VDaGFuZ2VzKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UoTWF0aC5tYXgoMCwgbWFpblNlbC5hbmNob3IgKyBzZWxPZmYpLCBNYXRoLm1heCgwLCBtYWluU2VsLmhlYWQgKyBzZWxPZmYpKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRyID0ge1xuICAgICAgICAgICAgICAgIGNoYW5nZXMsXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBtYWluU2VsICYmIHN0YXJ0U3RhdGUuc2VsZWN0aW9uLnJlcGxhY2VSYW5nZShtYWluU2VsKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgdXNlckV2ZW50ID0gXCJpbnB1dC50eXBlXCI7XG4gICAgaWYgKHZpZXcuY29tcG9zaW5nIHx8XG4gICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2UgJiYgdmlldy5pbnB1dFN0YXRlLmNvbXBvc2l0aW9uRW5kZWRBdCA+IERhdGUubm93KCkgLSA1MCkge1xuICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlID0gZmFsc2U7XG4gICAgICAgIHVzZXJFdmVudCArPSBcIi5jb21wb3NlXCI7XG4gICAgICAgIGlmICh2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdXNlckV2ZW50ICs9IFwiLnN0YXJ0XCI7XG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUuY29tcG9zaXRpb25GaXJzdENoYW5nZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGFydFN0YXRlLnVwZGF0ZSh0ciwgeyB1c2VyRXZlbnQsIHNjcm9sbEludG9WaWV3OiB0cnVlIH0pO1xufVxuZnVuY3Rpb24gZmluZERpZmYoYSwgYiwgcHJlZmVycmVkUG9zLCBwcmVmZXJyZWRTaWRlKSB7XG4gICAgbGV0IG1pbkxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gICAgbGV0IGZyb20gPSAwO1xuICAgIHdoaWxlIChmcm9tIDwgbWluTGVuICYmIGEuY2hhckNvZGVBdChmcm9tKSA9PSBiLmNoYXJDb2RlQXQoZnJvbSkpXG4gICAgICAgIGZyb20rKztcbiAgICBpZiAoZnJvbSA9PSBtaW5MZW4gJiYgYS5sZW5ndGggPT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCB0b0EgPSBhLmxlbmd0aCwgdG9CID0gYi5sZW5ndGg7XG4gICAgd2hpbGUgKHRvQSA+IDAgJiYgdG9CID4gMCAmJiBhLmNoYXJDb2RlQXQodG9BIC0gMSkgPT0gYi5jaGFyQ29kZUF0KHRvQiAtIDEpKSB7XG4gICAgICAgIHRvQS0tO1xuICAgICAgICB0b0ItLTtcbiAgICB9XG4gICAgaWYgKHByZWZlcnJlZFNpZGUgPT0gXCJlbmRcIikge1xuICAgICAgICBsZXQgYWRqdXN0ID0gTWF0aC5tYXgoMCwgZnJvbSAtIE1hdGgubWluKHRvQSwgdG9CKSk7XG4gICAgICAgIHByZWZlcnJlZFBvcyAtPSB0b0EgKyBhZGp1c3QgLSBmcm9tO1xuICAgIH1cbiAgICBpZiAodG9BIDwgZnJvbSAmJiBhLmxlbmd0aCA8IGIubGVuZ3RoKSB7XG4gICAgICAgIGxldCBtb3ZlID0gcHJlZmVycmVkUG9zIDw9IGZyb20gJiYgcHJlZmVycmVkUG9zID49IHRvQSA/IGZyb20gLSBwcmVmZXJyZWRQb3MgOiAwO1xuICAgICAgICBmcm9tIC09IG1vdmU7XG4gICAgICAgIHRvQiA9IGZyb20gKyAodG9CIC0gdG9BKTtcbiAgICAgICAgdG9BID0gZnJvbTtcbiAgICB9XG4gICAgZWxzZSBpZiAodG9CIDwgZnJvbSkge1xuICAgICAgICBsZXQgbW92ZSA9IHByZWZlcnJlZFBvcyA8PSBmcm9tICYmIHByZWZlcnJlZFBvcyA+PSB0b0IgPyBmcm9tIC0gcHJlZmVycmVkUG9zIDogMDtcbiAgICAgICAgZnJvbSAtPSBtb3ZlO1xuICAgICAgICB0b0EgPSBmcm9tICsgKHRvQSAtIHRvQik7XG4gICAgICAgIHRvQiA9IGZyb207XG4gICAgfVxuICAgIHJldHVybiB7IGZyb20sIHRvQSwgdG9CIH07XG59XG5mdW5jdGlvbiBzZWxlY3Rpb25Qb2ludHModmlldykge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBpZiAodmlldy5yb290LmFjdGl2ZUVsZW1lbnQgIT0gdmlldy5jb250ZW50RE9NKVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIGxldCB7IGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCB9ID0gdmlldy5vYnNlcnZlci5zZWxlY3Rpb25SYW5nZTtcbiAgICBpZiAoYW5jaG9yTm9kZSkge1xuICAgICAgICByZXN1bHQucHVzaChuZXcgRE9NUG9pbnQoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KSk7XG4gICAgICAgIGlmIChmb2N1c05vZGUgIT0gYW5jaG9yTm9kZSB8fCBmb2N1c09mZnNldCAhPSBhbmNob3JPZmZzZXQpXG4gICAgICAgICAgICByZXN1bHQucHVzaChuZXcgRE9NUG9pbnQoZm9jdXNOb2RlLCBmb2N1c09mZnNldCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gc2VsZWN0aW9uRnJvbVBvaW50cyhwb2ludHMsIGJhc2UpIHtcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgYW5jaG9yID0gcG9pbnRzWzBdLnBvcywgaGVhZCA9IHBvaW50cy5sZW5ndGggPT0gMiA/IHBvaW50c1sxXS5wb3MgOiBhbmNob3I7XG4gICAgcmV0dXJuIGFuY2hvciA+IC0xICYmIGhlYWQgPiAtMSA/IEVkaXRvclNlbGVjdGlvbi5zaW5nbGUoYW5jaG9yICsgYmFzZSwgaGVhZCArIGJhc2UpIDogbnVsbDtcbn1cblxuY29uc3Qgb2JzZXJ2ZU9wdGlvbnMgPSB7XG4gICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgIGNoYXJhY3RlckRhdGE6IHRydWUsXG4gICAgc3VidHJlZTogdHJ1ZSxcbiAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgIGNoYXJhY3RlckRhdGFPbGRWYWx1ZTogdHJ1ZVxufTtcbi8vIElFMTEgaGFzIHZlcnkgYnJva2VuIG11dGF0aW9uIG9ic2VydmVycywgc28gd2UgYWxzbyBsaXN0ZW4gdG9cbi8vIERPTUNoYXJhY3RlckRhdGFNb2RpZmllZCB0aGVyZVxuY29uc3QgdXNlQ2hhckRhdGEgPSBicm93c2VyLmllICYmIGJyb3dzZXIuaWVfdmVyc2lvbiA8PSAxMTtcbmNsYXNzIERPTU9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIC8vIFRoZSBrbm93biBzZWxlY3Rpb24uIEtlcHQgaW4gb3VyIG93biBvYmplY3QsIGFzIG9wcG9zZWQgdG8ganVzdFxuICAgICAgICAvLyBkaXJlY3RseSBhY2Nlc3NpbmcgdGhlIHNlbGVjdGlvbiBiZWNhdXNlOlxuICAgICAgICAvLyAgLSBTYWZhcmkgZG9lc24ndCByZXBvcnQgdGhlIHJpZ2h0IHNlbGVjdGlvbiBpbiBzaGFkb3cgRE9NXG4gICAgICAgIC8vICAtIFJlYWRpbmcgZnJvbSB0aGUgc2VsZWN0aW9uIGZvcmNlcyBhIERPTSBsYXlvdXRcbiAgICAgICAgLy8gIC0gVGhpcyB3YXksIHdlIGNhbiBpZ25vcmUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50cyBpZiB3ZSBoYXZlXG4gICAgICAgIC8vICAgIGFscmVhZHkgc2VlbiB0aGUgJ25ldycgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uUmFuZ2UgPSBuZXcgRE9NU2VsZWN0aW9uU3RhdGU7XG4gICAgICAgIC8vIFNldCB3aGVuIGEgc2VsZWN0aW9uIGNoYW5nZSBpcyBkZXRlY3RlZCwgY2xlYXJlZCBvbiBmbHVzaFxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWxheWVkRmx1c2ggPSAtMTtcbiAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5kZWxheWVkQW5kcm9pZEtleSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmx1c2hpbmdBbmRyb2lkS2V5ID0gLTE7XG4gICAgICAgIHRoaXMubGFzdENoYW5nZSA9IDA7XG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0cyA9IFtdO1xuICAgICAgICB0aGlzLmludGVyc2VjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMucmVzaXplU2Nyb2xsID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbnRlcnNlY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5nYXBJbnRlcnNlY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmdhcHMgPSBbXTtcbiAgICAgICAgLy8gVGltZW91dCBmb3Igc2NoZWR1bGluZyBjaGVjayBvZiB0aGUgcGFyZW50cyB0aGF0IG5lZWQgc2Nyb2xsIGhhbmRsZXJzXG4gICAgICAgIHRoaXMucGFyZW50Q2hlY2sgPSAtMTtcbiAgICAgICAgdGhpcy5kb20gPSB2aWV3LmNvbnRlbnRET007XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgbXV0IG9mIG11dGF0aW9ucylcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobXV0KTtcbiAgICAgICAgICAgIC8vIElFMTEgd2lsbCBzb21ldGltZXMgKG9uIHR5cGluZyBvdmVyIGEgc2VsZWN0aW9uIG9yXG4gICAgICAgICAgICAvLyBiYWNrc3BhY2luZyBvdXQgYSBzaW5nbGUgY2hhcmFjdGVyIHRleHQgbm9kZSkgY2FsbCB0aGVcbiAgICAgICAgICAgIC8vIG9ic2VydmVyIGNhbGxiYWNrIGJlZm9yZSBhY3R1YWxseSB1cGRhdGluZyB0aGUgRE9NLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFVucmVsYXRlZGx5LCBpT1MgU2FmYXJpIHdpbGwsIHdoZW4gZW5kaW5nIGEgY29tcG9zaXRpb24sXG4gICAgICAgICAgICAvLyBzb21ldGltZXMgZmlyc3QgY2xlYXIgaXQsIGRlbGl2ZXIgdGhlIG11dGF0aW9ucywgYW5kIHRoZW5cbiAgICAgICAgICAgIC8vIHJlaW5zZXJ0IHRoZSBmaW5pc2hlZCB0ZXh0LiBDb2RlTWlycm9yJ3MgaGFuZGxpbmcgb2YgdGhlXG4gICAgICAgICAgICAvLyBkZWxldGlvbiB3aWxsIHByZXZlbnQgdGhlIHJlaW5zZXJ0aW9uIGZyb20gaGFwcGVuaW5nLFxuICAgICAgICAgICAgLy8gYnJlYWtpbmcgY29tcG9zaXRpb24uXG4gICAgICAgICAgICBpZiAoKGJyb3dzZXIuaWUgJiYgYnJvd3Nlci5pZV92ZXJzaW9uIDw9IDExIHx8IGJyb3dzZXIuaW9zICYmIHZpZXcuY29tcG9zaW5nKSAmJlxuICAgICAgICAgICAgICAgIG11dGF0aW9ucy5zb21lKG0gPT4gbS50eXBlID09IFwiY2hpbGRMaXN0XCIgJiYgbS5yZW1vdmVkTm9kZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgIG0udHlwZSA9PSBcImNoYXJhY3RlckRhdGFcIiAmJiBtLm9sZFZhbHVlLmxlbmd0aCA+IG0udGFyZ2V0Lm5vZGVWYWx1ZS5sZW5ndGgpKVxuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHVzZUNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy5vbkNoYXJEYXRhID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKHsgdGFyZ2V0OiBldmVudC50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY2hhcmFjdGVyRGF0YVwiLFxuICAgICAgICAgICAgICAgICAgICBvbGRWYWx1ZTogZXZlbnQucHJldlZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hTb29uKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uUmVzaXplID0gdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uUHJpbnQgPSB0aGlzLm9uUHJpbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblNjcm9sbCA9IHRoaXMub25TY3JvbGwuYmluZCh0aGlzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplU2Nyb2xsID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgaWYgKCgoX2EgPSB0aGlzLnZpZXcuZG9jVmlldykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxhc3RVcGRhdGUpIDwgRGF0ZS5ub3coKSAtIDc1KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUmVzaXplKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVzaXplU2Nyb2xsLm9ic2VydmUodmlldy5zY3JvbGxET00pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkV2luZG93TGlzdGVuZXJzKHRoaXMud2luID0gdmlldy53aW4pO1xuICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICAgIGlmICh0eXBlb2YgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbiA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRDaGVjayA8IDApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Q2hlY2sgPSBzZXRUaW1lb3V0KHRoaXMubGlzdGVuRm9yU2Nyb2xsLmJpbmQodGhpcyksIDEwMDApO1xuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDAgJiYgKGVudHJpZXNbZW50cmllcy5sZW5ndGggLSAxXS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApICE9IHRoaXMuaW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJzZWN0aW5nID0gIXRoaXMuaW50ZXJzZWN0aW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnRlcnNlY3RpbmcgIT0gdGhpcy52aWV3LmluVmlldylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2VkKGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHsgdGhyZXNob2xkOiBbMCwgLjAwMV0gfSk7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbi5vYnNlcnZlKHRoaXMuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuZ2FwSW50ZXJzZWN0aW9uID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDAgJiYgZW50cmllc1tlbnRyaWVzLmxlbmd0aCAtIDFdLmludGVyc2VjdGlvblJhdGlvID4gMClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNjcm9sbENoYW5nZWQoZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKSk7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saXN0ZW5Gb3JTY3JvbGwoKTtcbiAgICAgICAgdGhpcy5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICB9XG4gICAgb25TY3JvbGxDaGFuZ2VkKGUpIHtcbiAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUucnVuSGFuZGxlcnMoXCJzY3JvbGxcIiwgZSk7XG4gICAgICAgIGlmICh0aGlzLmludGVyc2VjdGluZylcbiAgICAgICAgICAgIHRoaXMudmlldy5tZWFzdXJlKCk7XG4gICAgfVxuICAgIG9uU2Nyb2xsKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJzZWN0aW5nKVxuICAgICAgICAgICAgdGhpcy5mbHVzaChmYWxzZSk7XG4gICAgICAgIHRoaXMub25TY3JvbGxDaGFuZ2VkKGUpO1xuICAgIH1cbiAgICBvblJlc2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplVGltZW91dCA8IDApXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSAtMTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgICAgIH0sIDUwKTtcbiAgICB9XG4gICAgb25QcmludCgpIHtcbiAgICAgICAgdGhpcy52aWV3LnZpZXdTdGF0ZS5wcmludGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMudmlldy5tZWFzdXJlKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52aWV3LnZpZXdTdGF0ZS5wcmludGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgfVxuICAgIHVwZGF0ZUdhcHMoZ2Fwcykge1xuICAgICAgICBpZiAodGhpcy5nYXBJbnRlcnNlY3Rpb24gJiYgKGdhcHMubGVuZ3RoICE9IHRoaXMuZ2Fwcy5sZW5ndGggfHwgdGhpcy5nYXBzLnNvbWUoKGcsIGkpID0+IGcgIT0gZ2Fwc1tpXSkpKSB7XG4gICAgICAgICAgICB0aGlzLmdhcEludGVyc2VjdGlvbi5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBmb3IgKGxldCBnYXAgb2YgZ2FwcylcbiAgICAgICAgICAgICAgICB0aGlzLmdhcEludGVyc2VjdGlvbi5vYnNlcnZlKGdhcCk7XG4gICAgICAgICAgICB0aGlzLmdhcHMgPSBnYXBzO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIGxldCB3YXNDaGFuZ2VkID0gdGhpcy5zZWxlY3Rpb25DaGFuZ2VkO1xuICAgICAgICBpZiAoIXRoaXMucmVhZFNlbGVjdGlvblJhbmdlKCkgfHwgdGhpcy5kZWxheWVkQW5kcm9pZEtleSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdGhpcywgc2VsID0gdGhpcy5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgaWYgKHZpZXcuc3RhdGUuZmFjZXQoZWRpdGFibGUpID8gdmlldy5yb290LmFjdGl2ZUVsZW1lbnQgIT0gdGhpcy5kb20gOiAhaGFzU2VsZWN0aW9uKHZpZXcuZG9tLCBzZWwpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgY29udGV4dCA9IHNlbC5hbmNob3JOb2RlICYmIHZpZXcuZG9jVmlldy5uZWFyZXN0KHNlbC5hbmNob3JOb2RlKTtcbiAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5pZ25vcmVFdmVudChldmVudCkpIHtcbiAgICAgICAgICAgIGlmICghd2FzQ2hhbmdlZClcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWxldGlvbnMgb24gSUUxMSBmaXJlIHRoZWlyIGV2ZW50cyBpbiB0aGUgd3Jvbmcgb3JkZXIsIGdpdmluZ1xuICAgICAgICAvLyB1cyBhIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnQgYmVmb3JlIHRoZSBET00gY2hhbmdlcyBhcmVcbiAgICAgICAgLy8gcmVwb3J0ZWQuXG4gICAgICAgIC8vIENocm9tZSBBbmRyb2lkIGhhcyBhIHNpbWlsYXIgaXNzdWUgd2hlbiBiYWNrc3BhY2luZyBvdXQgYVxuICAgICAgICAvLyBzZWxlY3Rpb24gKCM2NDUpLlxuICAgICAgICBpZiAoKGJyb3dzZXIuaWUgJiYgYnJvd3Nlci5pZV92ZXJzaW9uIDw9IDExIHx8IGJyb3dzZXIuYW5kcm9pZCAmJiBicm93c2VyLmNocm9tZSkgJiYgIXZpZXcuc3RhdGUuc2VsZWN0aW9uLm1haW4uZW1wdHkgJiZcbiAgICAgICAgICAgIC8vIChTZWxlY3Rpb24uaXNDb2xsYXBzZWQgaXNuJ3QgcmVsaWFibGUgb24gSUUpXG4gICAgICAgICAgICBzZWwuZm9jdXNOb2RlICYmIGlzRXF1aXZhbGVudFBvc2l0aW9uKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQpKVxuICAgICAgICAgICAgdGhpcy5mbHVzaFNvb24oKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5mbHVzaChmYWxzZSk7XG4gICAgfVxuICAgIHJlYWRTZWxlY3Rpb25SYW5nZSgpIHtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdGhpcztcbiAgICAgICAgLy8gVGhlIFNlbGVjdGlvbiBvYmplY3QgaXMgYnJva2VuIGluIHNoYWRvdyByb290cyBpbiBTYWZhcmkuIFNlZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9kZXYvaXNzdWVzLzQxNFxuICAgICAgICBsZXQgcmFuZ2UgPSBicm93c2VyLnNhZmFyaSAmJiB2aWV3LnJvb3Qubm9kZVR5cGUgPT0gMTEgJiZcbiAgICAgICAgICAgIGRlZXBBY3RpdmVFbGVtZW50KHRoaXMuZG9tLm93bmVyRG9jdW1lbnQpID09IHRoaXMuZG9tICYmXG4gICAgICAgICAgICBzYWZhcmlTZWxlY3Rpb25SYW5nZUhhY2sodGhpcy52aWV3KSB8fCBnZXRTZWxlY3Rpb24odmlldy5yb290KTtcbiAgICAgICAgaWYgKCFyYW5nZSB8fCB0aGlzLnNlbGVjdGlvblJhbmdlLmVxKHJhbmdlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGxvY2FsID0gaGFzU2VsZWN0aW9uKHRoaXMuZG9tLCByYW5nZSk7XG4gICAgICAgIC8vIERldGVjdCB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoZSBicm93c2VyIGhhcywgb24gZm9jdXMsIG1vdmVkIHRoZVxuICAgICAgICAvLyBzZWxlY3Rpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb250ZW50IGVsZW1lbnQuIFJlc2V0IGl0IHRvIHRoZVxuICAgICAgICAvLyBwb3NpdGlvbiBmcm9tIHRoZSBlZGl0b3Igc3RhdGUuXG4gICAgICAgIGlmIChsb2NhbCAmJiAhdGhpcy5zZWxlY3Rpb25DaGFuZ2VkICYmXG4gICAgICAgICAgICB2aWV3LmlucHV0U3RhdGUubGFzdEZvY3VzVGltZSA+IERhdGUubm93KCkgLSAyMDAgJiZcbiAgICAgICAgICAgIHZpZXcuaW5wdXRTdGF0ZS5sYXN0VG91Y2hUaW1lIDwgRGF0ZS5ub3coKSAtIDMwMCAmJlxuICAgICAgICAgICAgYXRFbGVtZW50U3RhcnQodGhpcy5kb20sIHJhbmdlKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEZvY3VzVGltZSA9IDA7XG4gICAgICAgICAgICB2aWV3LmRvY1ZpZXcudXBkYXRlU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SYW5nZS5zZXRSYW5nZShyYW5nZSk7XG4gICAgICAgIGlmIChsb2NhbClcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzZXRTZWxlY3Rpb25SYW5nZShhbmNob3IsIGhlYWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SYW5nZS5zZXQoYW5jaG9yLm5vZGUsIGFuY2hvci5vZmZzZXQsIGhlYWQubm9kZSwgaGVhZC5vZmZzZXQpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgY2xlYXJTZWxlY3Rpb25SYW5nZSgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25SYW5nZS5zZXQobnVsbCwgMCwgbnVsbCwgMCk7XG4gICAgfVxuICAgIGxpc3RlbkZvclNjcm9sbCgpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRDaGVjayA9IC0xO1xuICAgICAgICBsZXQgaSA9IDAsIGNoYW5nZWQgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBkb20gPSB0aGlzLmRvbTsgZG9tOykge1xuICAgICAgICAgICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2VkICYmIGkgPCB0aGlzLnNjcm9sbFRhcmdldHMubGVuZ3RoICYmIHRoaXMuc2Nyb2xsVGFyZ2V0c1tpXSA9PSBkb20pXG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghY2hhbmdlZClcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRoaXMuc2Nyb2xsVGFyZ2V0cy5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlZClcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC5wdXNoKGRvbSk7XG4gICAgICAgICAgICAgICAgZG9tID0gZG9tLmFzc2lnbmVkU2xvdCB8fCBkb20ucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRvbS5ub2RlVHlwZSA9PSAxMSkgeyAvLyBTaGFkb3cgcm9vdFxuICAgICAgICAgICAgICAgIGRvbSA9IGRvbS5ob3N0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPCB0aGlzLnNjcm9sbFRhcmdldHMubGVuZ3RoICYmICFjaGFuZ2VkKVxuICAgICAgICAgICAgY2hhbmdlZCA9IHRoaXMuc2Nyb2xsVGFyZ2V0cy5zbGljZSgwLCBpKTtcbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGRvbSBvZiB0aGlzLnNjcm9sbFRhcmdldHMpXG4gICAgICAgICAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgICAgICAgICBmb3IgKGxldCBkb20gb2YgdGhpcy5zY3JvbGxUYXJnZXRzID0gY2hhbmdlZClcbiAgICAgICAgICAgICAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZ25vcmUoZikge1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuIGYoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICAgICAgcmV0dXJuIGYoKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5kb20sIG9ic2VydmVPcHRpb25zKTtcbiAgICAgICAgaWYgKHVzZUNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLm9uQ2hhckRhdGEpO1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICghdGhpcy5hY3RpdmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICBpZiAodXNlQ2hhckRhdGEpXG4gICAgICAgICAgICB0aGlzLmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCIsIHRoaXMub25DaGFyRGF0YSk7XG4gICAgfVxuICAgIC8vIFRocm93IGF3YXkgYW55IHBlbmRpbmcgY2hhbmdlc1xuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NSZWNvcmRzKCk7XG4gICAgICAgIHRoaXMucXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIENocm9tZSBBbmRyb2lkLCBlc3BlY2lhbGx5IGluIGNvbWJpbmF0aW9uIHdpdGggR0JvYXJkLCBub3Qgb25seVxuICAgIC8vIGRvZXNuJ3QgcmVsaWFibHkgZmlyZSByZWd1bGFyIGtleSBldmVudHMsIGJ1dCBhbHNvIG9mdGVuXG4gICAgLy8gc3Vycm91bmRzIHRoZSBlZmZlY3Qgb2YgZW50ZXIgb3IgYmFja3NwYWNlIHdpdGggYSBidW5jaCBvZlxuICAgIC8vIGNvbXBvc2l0aW9uIGV2ZW50cyB0aGF0LCB3aGVuIGludGVycnVwdGVkLCBjYXVzZSB0ZXh0IGR1cGxpY2F0aW9uXG4gICAgLy8gb3Igb3RoZXIga2luZHMgb2YgY29ycnVwdGlvbi4gVGhpcyBoYWNrIG1ha2VzIHRoZSBlZGl0b3IgYmFjayBvZmZcbiAgICAvLyBmcm9tIGhhbmRsaW5nIERPTSBjaGFuZ2VzIGZvciBhIG1vbWVudCB3aGVuIHN1Y2ggYSBrZXkgaXNcbiAgICAvLyBkZXRlY3RlZCAodmlhIGJlZm9yZWlucHV0IG9yIGtleWRvd24pLCBhbmQgdGhlbiB0cmllcyB0byBmbHVzaFxuICAgIC8vIHRoZW0gb3IsIGlmIHRoYXQgaGFzIG5vIGVmZmVjdCwgZGlzcGF0Y2hlcyB0aGUgZ2l2ZW4ga2V5LlxuICAgIGRlbGF5QW5kcm9pZEtleShrZXksIGtleUNvZGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMuZGVsYXllZEFuZHJvaWRLZXkpIHtcbiAgICAgICAgICAgIGxldCBmbHVzaCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5kZWxheWVkQW5kcm9pZEtleTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJEZWxheWVkQW5kcm9pZEtleSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5sYXN0S2V5Q29kZSA9IGtleS5rZXlDb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXcuaW5wdXRTdGF0ZS5sYXN0S2V5VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmbHVzaGVkID0gdGhpcy5mbHVzaCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZsdXNoZWQgJiYga2V5LmZvcmNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hLZXkodGhpcy5kb20sIGtleS5rZXksIGtleS5rZXlDb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5mbHVzaGluZ0FuZHJvaWRLZXkgPSB0aGlzLnZpZXcud2luLnJlcXVlc3RBbmltYXRpb25GcmFtZShmbHVzaCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2luY2UgYmFja3NwYWNlIGJlZm9yZWlucHV0IGlzIHNvbWV0aW1lcyBzaWduYWxsZWQgc3B1cmlvdXNseSxcbiAgICAgICAgLy8gRW50ZXIgYWx3YXlzIHRha2VzIHByZWNlZGVuY2UuXG4gICAgICAgIGlmICghdGhpcy5kZWxheWVkQW5kcm9pZEtleSB8fCBrZXkgPT0gXCJFbnRlclwiKVxuICAgICAgICAgICAgdGhpcy5kZWxheWVkQW5kcm9pZEtleSA9IHtcbiAgICAgICAgICAgICAgICBrZXksIGtleUNvZGUsXG4gICAgICAgICAgICAgICAgLy8gT25seSBydW4gdGhlIGtleSBoYW5kbGVyIHdoZW4gbm8gY2hhbmdlcyBhcmUgZGV0ZWN0ZWQgaWZcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzbid0IGNvbWluZyByaWdodCBhZnRlciBhbm90aGVyIGNoYW5nZSwgaW4gd2hpY2ggY2FzZVxuICAgICAgICAgICAgICAgIC8vIGl0IGlzIHByb2JhYmx5IHBhcnQgb2YgYSB3ZWlyZCBjaGFpbiBvZiB1cGRhdGVzLCBhbmQgc2hvdWxkXG4gICAgICAgICAgICAgICAgLy8gYmUgaWdub3JlZCBpZiBpdCByZXR1cm5zIHRoZSBET00gdG8gaXRzIHByZXZpb3VzIHN0YXRlLlxuICAgICAgICAgICAgICAgIGZvcmNlOiB0aGlzLmxhc3RDaGFuZ2UgPCBEYXRlLm5vdygpIC0gNTAgfHwgISEoKF9hID0gdGhpcy5kZWxheWVkQW5kcm9pZEtleSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvcmNlKVxuICAgICAgICAgICAgfTtcbiAgICB9XG4gICAgY2xlYXJEZWxheWVkQW5kcm9pZEtleSgpIHtcbiAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5mbHVzaGluZ0FuZHJvaWRLZXkpO1xuICAgICAgICB0aGlzLmRlbGF5ZWRBbmRyb2lkS2V5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5mbHVzaGluZ0FuZHJvaWRLZXkgPSAtMTtcbiAgICB9XG4gICAgZmx1c2hTb29uKCkge1xuICAgICAgICBpZiAodGhpcy5kZWxheWVkRmx1c2ggPCAwKVxuICAgICAgICAgICAgdGhpcy5kZWxheWVkRmx1c2ggPSB0aGlzLnZpZXcud2luLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7IHRoaXMuZGVsYXllZEZsdXNoID0gLTE7IHRoaXMuZmx1c2goKTsgfSk7XG4gICAgfVxuICAgIGZvcmNlRmx1c2goKSB7XG4gICAgICAgIGlmICh0aGlzLmRlbGF5ZWRGbHVzaCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZGVsYXllZEZsdXNoKTtcbiAgICAgICAgICAgIHRoaXMuZGVsYXllZEZsdXNoID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH1cbiAgICBwZW5kaW5nUmVjb3JkcygpIHtcbiAgICAgICAgZm9yIChsZXQgbXV0IG9mIHRoaXMub2JzZXJ2ZXIudGFrZVJlY29yZHMoKSlcbiAgICAgICAgICAgIHRoaXMucXVldWUucHVzaChtdXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZTtcbiAgICB9XG4gICAgcHJvY2Vzc1JlY29yZHMoKSB7XG4gICAgICAgIGxldCByZWNvcmRzID0gdGhpcy5wZW5kaW5nUmVjb3JkcygpO1xuICAgICAgICBpZiAocmVjb3Jkcy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgICAgIGxldCBmcm9tID0gLTEsIHRvID0gLTEsIHR5cGVPdmVyID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IHJlY29yZCBvZiByZWNvcmRzKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSB0aGlzLnJlYWRNdXRhdGlvbihyZWNvcmQpO1xuICAgICAgICAgICAgaWYgKCFyYW5nZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyYW5nZS50eXBlT3ZlcilcbiAgICAgICAgICAgICAgICB0eXBlT3ZlciA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZnJvbSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICh7IGZyb20sIHRvIH0gPSByYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gTWF0aC5taW4ocmFuZ2UuZnJvbSwgZnJvbSk7XG4gICAgICAgICAgICAgICAgdG8gPSBNYXRoLm1heChyYW5nZS50bywgdG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZyb20sIHRvLCB0eXBlT3ZlciB9O1xuICAgIH1cbiAgICByZWFkQ2hhbmdlKCkge1xuICAgICAgICBsZXQgeyBmcm9tLCB0bywgdHlwZU92ZXIgfSA9IHRoaXMucHJvY2Vzc1JlY29yZHMoKTtcbiAgICAgICAgbGV0IG5ld1NlbCA9IHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCAmJiBoYXNTZWxlY3Rpb24odGhpcy5kb20sIHRoaXMuc2VsZWN0aW9uUmFuZ2UpO1xuICAgICAgICBpZiAoZnJvbSA8IDAgJiYgIW5ld1NlbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoZnJvbSA+IC0xKVxuICAgICAgICAgICAgdGhpcy5sYXN0Q2hhbmdlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy52aWV3LmlucHV0U3RhdGUubGFzdEZvY3VzVGltZSA9IDA7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgY2hhbmdlID0gbmV3IERPTUNoYW5nZSh0aGlzLnZpZXcsIGZyb20sIHRvLCB0eXBlT3Zlcik7XG4gICAgICAgIHRoaXMudmlldy5kb2NWaWV3LmRvbUNoYW5nZWQgPSB7IG5ld1NlbDogY2hhbmdlLm5ld1NlbCA/IGNoYW5nZS5uZXdTZWwubWFpbiA6IG51bGwgfTtcbiAgICAgICAgcmV0dXJuIGNoYW5nZTtcbiAgICB9XG4gICAgLy8gQXBwbHkgcGVuZGluZyBjaGFuZ2VzLCBpZiBhbnlcbiAgICBmbHVzaChyZWFkU2VsZWN0aW9uID0gdHJ1ZSkge1xuICAgICAgICAvLyBDb21wbGV0ZWx5IGhvbGQgb2ZmIGZsdXNoaW5nIHdoZW4gcGVuZGluZyBrZXlzIGFyZSBzZXRcdTIwMTR0aGUgY29kZVxuICAgICAgICAvLyBtYW5hZ2luZyB0aG9zZSB3aWxsIG1ha2Ugc3VyZSBwcm9jZXNzUmVjb3JkcyBpcyBjYWxsZWQgYW5kIHRoZVxuICAgICAgICAvLyB2aWV3IGlzIHJlc3luY2hyb25pemVkIGFmdGVyXG4gICAgICAgIGlmICh0aGlzLmRlbGF5ZWRGbHVzaCA+PSAwIHx8IHRoaXMuZGVsYXllZEFuZHJvaWRLZXkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChyZWFkU2VsZWN0aW9uKVxuICAgICAgICAgICAgdGhpcy5yZWFkU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IGRvbUNoYW5nZSA9IHRoaXMucmVhZENoYW5nZSgpO1xuICAgICAgICBpZiAoIWRvbUNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0U3RhdGUgPSB0aGlzLnZpZXcuc3RhdGU7XG4gICAgICAgIGxldCBoYW5kbGVkID0gYXBwbHlET01DaGFuZ2UodGhpcy52aWV3LCBkb21DaGFuZ2UpO1xuICAgICAgICAvLyBUaGUgdmlldyB3YXNuJ3QgdXBkYXRlZFxuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlID09IHN0YXJ0U3RhdGUpXG4gICAgICAgICAgICB0aGlzLnZpZXcudXBkYXRlKFtdKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgfVxuICAgIHJlYWRNdXRhdGlvbihyZWMpIHtcbiAgICAgICAgbGV0IGNWaWV3ID0gdGhpcy52aWV3LmRvY1ZpZXcubmVhcmVzdChyZWMudGFyZ2V0KTtcbiAgICAgICAgaWYgKCFjVmlldyB8fCBjVmlldy5pZ25vcmVNdXRhdGlvbihyZWMpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNWaWV3Lm1hcmtEaXJ0eShyZWMudHlwZSA9PSBcImF0dHJpYnV0ZXNcIik7XG4gICAgICAgIGlmIChyZWMudHlwZSA9PSBcImF0dHJpYnV0ZXNcIilcbiAgICAgICAgICAgIGNWaWV3LmZsYWdzIHw9IDQgLyogVmlld0ZsYWcuQXR0cnNEaXJ0eSAqLztcbiAgICAgICAgaWYgKHJlYy50eXBlID09IFwiY2hpbGRMaXN0XCIpIHtcbiAgICAgICAgICAgIGxldCBjaGlsZEJlZm9yZSA9IGZpbmRDaGlsZChjVmlldywgcmVjLnByZXZpb3VzU2libGluZyB8fCByZWMudGFyZ2V0LnByZXZpb3VzU2libGluZywgLTEpO1xuICAgICAgICAgICAgbGV0IGNoaWxkQWZ0ZXIgPSBmaW5kQ2hpbGQoY1ZpZXcsIHJlYy5uZXh0U2libGluZyB8fCByZWMudGFyZ2V0Lm5leHRTaWJsaW5nLCAxKTtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IGNoaWxkQmVmb3JlID8gY1ZpZXcucG9zQWZ0ZXIoY2hpbGRCZWZvcmUpIDogY1ZpZXcucG9zQXRTdGFydCxcbiAgICAgICAgICAgICAgICB0bzogY2hpbGRBZnRlciA/IGNWaWV3LnBvc0JlZm9yZShjaGlsZEFmdGVyKSA6IGNWaWV3LnBvc0F0RW5kLCB0eXBlT3ZlcjogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZWMudHlwZSA9PSBcImNoYXJhY3RlckRhdGFcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogY1ZpZXcucG9zQXRTdGFydCwgdG86IGNWaWV3LnBvc0F0RW5kLCB0eXBlT3ZlcjogcmVjLnRhcmdldC5ub2RlVmFsdWUgPT0gcmVjLm9sZFZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRXaW5kb3cod2luKSB7XG4gICAgICAgIGlmICh3aW4gIT0gdGhpcy53aW4pIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlV2luZG93TGlzdGVuZXJzKHRoaXMud2luKTtcbiAgICAgICAgICAgIHRoaXMud2luID0gd2luO1xuICAgICAgICAgICAgdGhpcy5hZGRXaW5kb3dMaXN0ZW5lcnModGhpcy53aW4pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZFdpbmRvd0xpc3RlbmVycyh3aW4pIHtcbiAgICAgICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5vblJlc2l6ZSk7XG4gICAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlcHJpbnRcIiwgdGhpcy5vblByaW50KTtcbiAgICAgICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgICAgIHdpbi5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UpO1xuICAgIH1cbiAgICByZW1vdmVXaW5kb3dMaXN0ZW5lcnMod2luKSB7XG4gICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLm9uUmVzaXplKTtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmVwcmludFwiLCB0aGlzLm9uUHJpbnQpO1xuICAgICAgICB3aW4uZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICAoX2EgPSB0aGlzLmludGVyc2VjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgKF9iID0gdGhpcy5nYXBJbnRlcnNlY3Rpb24pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5kaXNjb25uZWN0KCk7XG4gICAgICAgIChfYyA9IHRoaXMucmVzaXplU2Nyb2xsKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZGlzY29ubmVjdCgpO1xuICAgICAgICBmb3IgKGxldCBkb20gb2YgdGhpcy5zY3JvbGxUYXJnZXRzKVxuICAgICAgICAgICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG4gICAgICAgIHRoaXMucmVtb3ZlV2luZG93TGlzdGVuZXJzKHRoaXMud2luKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGFyZW50Q2hlY2spO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0KTtcbiAgICAgICAgdGhpcy53aW4uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5kZWxheWVkRmx1c2gpO1xuICAgICAgICB0aGlzLndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZsdXNoaW5nQW5kcm9pZEtleSk7XG4gICAgfVxufVxuZnVuY3Rpb24gZmluZENoaWxkKGNWaWV3LCBkb20sIGRpcikge1xuICAgIHdoaWxlIChkb20pIHtcbiAgICAgICAgbGV0IGN1clZpZXcgPSBDb250ZW50Vmlldy5nZXQoZG9tKTtcbiAgICAgICAgaWYgKGN1clZpZXcgJiYgY3VyVmlldy5wYXJlbnQgPT0gY1ZpZXcpXG4gICAgICAgICAgICByZXR1cm4gY3VyVmlldztcbiAgICAgICAgbGV0IHBhcmVudCA9IGRvbS5wYXJlbnROb2RlO1xuICAgICAgICBkb20gPSBwYXJlbnQgIT0gY1ZpZXcuZG9tID8gcGFyZW50IDogZGlyID4gMCA/IGRvbS5uZXh0U2libGluZyA6IGRvbS5wcmV2aW91c1NpYmxpbmc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLy8gVXNlZCB0byB3b3JrIGFyb3VuZCBhIFNhZmFyaSBTZWxlY3Rpb24vc2hhZG93IERPTSBidWcgKCM0MTQpXG5mdW5jdGlvbiBzYWZhcmlTZWxlY3Rpb25SYW5nZUhhY2sodmlldykge1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgLy8gQmVjYXVzZSBTYWZhcmkgKGF0IGxlYXN0IGluIDIwMTgtMjAyMSkgZG9lc24ndCBwcm92aWRlIHJlZ3VsYXJcbiAgICAvLyBhY2Nlc3MgdG8gdGhlIHNlbGVjdGlvbiBpbnNpZGUgYSBzaGFkb3dyb290LCB3ZSBoYXZlIHRvIHBlcmZvcm0gYVxuICAgIC8vIHJpZGljdWxvdXMgaGFjayB0byBnZXQgYXQgaXRcdTIwMTR1c2luZyBgZXhlY0NvbW1hbmRgIHRvIHRyaWdnZXIgYVxuICAgIC8vIGBiZWZvcmVJbnB1dGAgZXZlbnQgc28gdGhhdCB3ZSBjYW4gcmVhZCB0aGUgdGFyZ2V0IHJhbmdlIGZyb20gdGhlXG4gICAgLy8gZXZlbnQuXG4gICAgZnVuY3Rpb24gcmVhZChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZm91bmQgPSBldmVudC5nZXRUYXJnZXRSYW5nZXMoKVswXTtcbiAgICB9XG4gICAgdmlldy5jb250ZW50RE9NLmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCByZWFkLCB0cnVlKTtcbiAgICB2aWV3LmRvbS5vd25lckRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5kZW50XCIpO1xuICAgIHZpZXcuY29udGVudERPTS5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgcmVhZCwgdHJ1ZSk7XG4gICAgaWYgKCFmb3VuZClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGFuY2hvck5vZGUgPSBmb3VuZC5zdGFydENvbnRhaW5lciwgYW5jaG9yT2Zmc2V0ID0gZm91bmQuc3RhcnRPZmZzZXQ7XG4gICAgbGV0IGZvY3VzTm9kZSA9IGZvdW5kLmVuZENvbnRhaW5lciwgZm9jdXNPZmZzZXQgPSBmb3VuZC5lbmRPZmZzZXQ7XG4gICAgbGV0IGN1ckFuY2hvciA9IHZpZXcuZG9jVmlldy5kb21BdFBvcyh2aWV3LnN0YXRlLnNlbGVjdGlvbi5tYWluLmFuY2hvcik7XG4gICAgLy8gU2luY2Ugc3VjaCBhIHJhbmdlIGRvZXNuJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbmNob3IgYW5kIGhlYWQsXG4gICAgLy8gdXNlIGEgaGV1cmlzdGljIHRoYXQgZmxpcHMgaXQgYXJvdW5kIGlmIGl0cyBlbmQgbWF0Y2hlcyB0aGVcbiAgICAvLyBjdXJyZW50IGFuY2hvci5cbiAgICBpZiAoaXNFcXVpdmFsZW50UG9zaXRpb24oY3VyQW5jaG9yLm5vZGUsIGN1ckFuY2hvci5vZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpKVxuICAgICAgICBbYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0XSA9IFtmb2N1c05vZGUsIGZvY3VzT2Zmc2V0LCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXRdO1xuICAgIHJldHVybiB7IGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCB9O1xufVxuXG4vLyBUaGUgZWRpdG9yJ3MgdXBkYXRlIHN0YXRlIG1hY2hpbmUgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczpcbi8vXG4vLyAgICAgSWRsZSBcdTIxOTIgVXBkYXRpbmcgXHUyMUM2IElkbGUgKHVuY2hlY2tlZCkgXHUyMTkyIE1lYXN1cmluZyBcdTIxOTIgSWRsZVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjE5MSAgICAgIFx1MjE5M1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0aW5nIChtZWFzdXJlKVxuLy9cbi8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gJ0lkbGUnIGFuZCAnSWRsZSAodW5jaGVja2VkKScgbGllcyBpblxuLy8gd2hldGhlciBhIGxheW91dCBjaGVjayBoYXMgYmVlbiBzY2hlZHVsZWQuIEEgcmVndWxhciB1cGRhdGUgdGhyb3VnaFxuLy8gdGhlIGB1cGRhdGVgIG1ldGhvZCB1cGRhdGVzIHRoZSBET00gaW4gYSB3cml0ZS1vbmx5IGZhc2hpb24sIGFuZFxuLy8gcmVsaWVzIG9uIGEgY2hlY2sgKHNjaGVkdWxlZCB3aXRoIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgKSB0byBtYWtlXG4vLyBzdXJlIGV2ZXJ5dGhpbmcgaXMgd2hlcmUgaXQgc2hvdWxkIGJlIGFuZCB0aGUgdmlld3BvcnQgY292ZXJzIHRoZVxuLy8gdmlzaWJsZSBjb2RlLiBUaGF0IGNoZWNrIGNvbnRpbnVlcyB0byBtZWFzdXJlIGFuZCB0aGVuIG9wdGlvbmFsbHlcbi8vIHVwZGF0ZSB1bnRpbCBpdCByZWFjaGVzIGEgY29oZXJlbnQgc3RhdGUuXG4vKipcbkFuIGVkaXRvciB2aWV3IHJlcHJlc2VudHMgdGhlIGVkaXRvcidzIHVzZXIgaW50ZXJmYWNlLiBJdCBob2xkc1xudGhlIGVkaXRhYmxlIERPTSBzdXJmYWNlLCBhbmQgcG9zc2libHkgb3RoZXIgZWxlbWVudHMgc3VjaCBhcyB0aGVcbmxpbmUgbnVtYmVyIGd1dHRlci4gSXQgaGFuZGxlcyBldmVudHMgYW5kIGRpc3BhdGNoZXMgc3RhdGVcbnRyYW5zYWN0aW9ucyBmb3IgZWRpdGluZyBhY3Rpb25zLlxuKi9cbmNsYXNzIEVkaXRvclZpZXcge1xuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCBzdGF0ZSgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLnN0YXRlOyB9XG4gICAgLyoqXG4gICAgVG8gYmUgYWJsZSB0byBkaXNwbGF5IGxhcmdlIGRvY3VtZW50cyB3aXRob3V0IGNvbnN1bWluZyB0b28gbXVjaFxuICAgIG1lbW9yeSBvciBvdmVybG9hZGluZyB0aGUgYnJvd3NlciwgQ29kZU1pcnJvciBvbmx5IGRyYXdzIHRoZVxuICAgIGNvZGUgdGhhdCBpcyB2aXNpYmxlIChwbHVzIGEgbWFyZ2luIGFyb3VuZCBpdCkgdG8gdGhlIERPTS4gVGhpc1xuICAgIHByb3BlcnR5IHRlbGxzIHlvdSB0aGUgZXh0ZW50IG9mIHRoZSBjdXJyZW50IGRyYXduIHZpZXdwb3J0LCBpblxuICAgIGRvY3VtZW50IHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIGdldCB2aWV3cG9ydCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLnZpZXdwb3J0OyB9XG4gICAgLyoqXG4gICAgV2hlbiB0aGVyZSBhcmUsIGZvciBleGFtcGxlLCBsYXJnZSBjb2xsYXBzZWQgcmFuZ2VzIGluIHRoZVxuICAgIHZpZXdwb3J0LCBpdHMgc2l6ZSBjYW4gYmUgYSBsb3QgYmlnZ2VyIHRoYW4gdGhlIGFjdHVhbCB2aXNpYmxlXG4gICAgY29udGVudC4gVGh1cywgaWYgeW91IGFyZSBkb2luZyBzb21ldGhpbmcgbGlrZSBzdHlsaW5nIHRoZVxuICAgIGNvbnRlbnQgaW4gdGhlIHZpZXdwb3J0LCBpdCBpcyBwcmVmZXJhYmxlIHRvIG9ubHkgZG8gc28gZm9yXG4gICAgdGhlc2UgcmFuZ2VzLCB3aGljaCBhcmUgdGhlIHN1YnNldCBvZiB0aGUgdmlld3BvcnQgdGhhdCBpc1xuICAgIGFjdHVhbGx5IGRyYXduLlxuICAgICovXG4gICAgZ2V0IHZpc2libGVSYW5nZXMoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS52aXNpYmxlUmFuZ2VzOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBmYWxzZSB3aGVuIHRoZSBlZGl0b3IgaXMgZW50aXJlbHkgc2Nyb2xsZWQgb3V0IG9mIHZpZXdcbiAgICBvciBvdGhlcndpc2UgaGlkZGVuLlxuICAgICovXG4gICAgZ2V0IGluVmlldygpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmluVmlldzsgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBjb21wb3NpbmcgdGV4dCB2aWFcbiAgICBbSU1FXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbnB1dF9tZXRob2QpLCBhbmQgYXQgbGVhc3RcbiAgICBvbmUgY2hhbmdlIGhhcyBiZWVuIG1hZGUgaW4gdGhlIGN1cnJlbnQgY29tcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgY29tcG9zaW5nKCkgeyByZXR1cm4gdGhpcy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+IDA7IH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBpcyBjdXJyZW50bHkgaW4gY29tcG9zaW5nIHN0YXRlLiBOb3RlXG4gICAgdGhhdCBvbiBzb21lIHBsYXRmb3JtcywgbGlrZSBBbmRyb2lkLCB0aGlzIHdpbGwgYmUgdGhlIGNhc2UgYVxuICAgIGxvdCwgc2luY2UganVzdCBwdXR0aW5nIHRoZSBjdXJzb3Igb24gYSB3b3JkIHN0YXJ0cyBhXG4gICAgY29tcG9zaXRpb24gdGhlcmUuXG4gICAgKi9cbiAgICBnZXQgY29tcG9zaXRpb25TdGFydGVkKCkgeyByZXR1cm4gdGhpcy5pbnB1dFN0YXRlLmNvbXBvc2luZyA+PSAwOyB9XG4gICAgLyoqXG4gICAgVGhlIGRvY3VtZW50IG9yIHNoYWRvdyByb290IHRoYXQgdGhlIHZpZXcgbGl2ZXMgaW4uXG4gICAgKi9cbiAgICBnZXQgcm9vdCgpIHsgcmV0dXJuIHRoaXMuX3Jvb3Q7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCB3aW4oKSB7IHJldHVybiB0aGlzLmRvbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgfVxuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIG5ldyB2aWV3LiBZb3UnbGwgd2FudCB0byBlaXRoZXIgcHJvdmlkZSBhIGBwYXJlbnRgXG4gICAgb3B0aW9uLCBvciBwdXQgYHZpZXcuZG9tYCBpbnRvIHlvdXIgZG9jdW1lbnQgYWZ0ZXIgY3JlYXRpbmcgYVxuICAgIHZpZXcsIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNlZSB0aGUgZWRpdG9yLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gW107XG4gICAgICAgIHRoaXMucGx1Z2luTWFwID0gbmV3IE1hcDtcbiAgICAgICAgdGhpcy5lZGl0b3JBdHRycyA9IHt9O1xuICAgICAgICB0aGlzLmNvbnRlbnRBdHRycyA9IHt9O1xuICAgICAgICB0aGlzLmJpZGlDYWNoZSA9IFtdO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA9IC0xO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubWVhc3VyZVJlcXVlc3RzID0gW107XG4gICAgICAgIHRoaXMuY29udGVudERPTSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuc2Nyb2xsRE9NID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5zY3JvbGxET00udGFiSW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5zY3JvbGxET00uY2xhc3NOYW1lID0gXCJjbS1zY3JvbGxlclwiO1xuICAgICAgICB0aGlzLnNjcm9sbERPTS5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLmFubm91bmNlRE9NID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZURPTS5jbGFzc05hbWUgPSBcImNtLWFubm91bmNlZFwiO1xuICAgICAgICB0aGlzLmFubm91bmNlRE9NLnNldEF0dHJpYnV0ZShcImFyaWEtbGl2ZVwiLCBcInBvbGl0ZVwiKTtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5hcHBlbmRDaGlsZCh0aGlzLmFubm91bmNlRE9NKTtcbiAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQodGhpcy5zY3JvbGxET00pO1xuICAgICAgICBpZiAoY29uZmlnLnBhcmVudClcbiAgICAgICAgICAgIGNvbmZpZy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5kb20pO1xuICAgICAgICBsZXQgeyBkaXNwYXRjaCB9ID0gY29uZmlnO1xuICAgICAgICB0aGlzLmRpc3BhdGNoVHJhbnNhY3Rpb25zID0gY29uZmlnLmRpc3BhdGNoVHJhbnNhY3Rpb25zIHx8XG4gICAgICAgICAgICAoZGlzcGF0Y2ggJiYgKCh0cnMpID0+IHRycy5mb3JFYWNoKHRyID0+IGRpc3BhdGNoKHRyLCB0aGlzKSkpKSB8fFxuICAgICAgICAgICAgKCh0cnMpID0+IHRoaXMudXBkYXRlKHRycykpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5kaXNwYXRjaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9yb290ID0gKGNvbmZpZy5yb290IHx8IGdldFJvb3QoY29uZmlnLnBhcmVudCkgfHwgZG9jdW1lbnQpO1xuICAgICAgICB0aGlzLnZpZXdTdGF0ZSA9IG5ldyBWaWV3U3RhdGUoY29uZmlnLnN0YXRlIHx8IEVkaXRvclN0YXRlLmNyZWF0ZShjb25maWcpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5zY3JvbGxUbyAmJiBjb25maWcuc2Nyb2xsVG8uaXMoc2Nyb2xsSW50b1ZpZXcpKVxuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0ID0gY29uZmlnLnNjcm9sbFRvLnZhbHVlLmNsaXAodGhpcy52aWV3U3RhdGUuc3RhdGUpO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSB0aGlzLnN0YXRlLmZhY2V0KHZpZXdQbHVnaW4pLm1hcChzcGVjID0+IG5ldyBQbHVnaW5JbnN0YW5jZShzcGVjKSk7XG4gICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICBwbHVnaW4udXBkYXRlKHRoaXMpO1xuICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IERPTU9ic2VydmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmlucHV0U3RhdGUgPSBuZXcgSW5wdXRTdGF0ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmVuc3VyZUhhbmRsZXJzKHRoaXMucGx1Z2lucyk7XG4gICAgICAgIHRoaXMuZG9jVmlldyA9IG5ldyBEb2NWaWV3KHRoaXMpO1xuICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQXR0cnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLztcbiAgICAgICAgdGhpcy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgIH1cbiAgICBkaXNwYXRjaCguLi5pbnB1dCkge1xuICAgICAgICBsZXQgdHJzID0gaW5wdXQubGVuZ3RoID09IDEgJiYgaW5wdXRbMF0gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbiA/IGlucHV0XG4gICAgICAgICAgICA6IGlucHV0Lmxlbmd0aCA9PSAxICYmIEFycmF5LmlzQXJyYXkoaW5wdXRbMF0pID8gaW5wdXRbMF1cbiAgICAgICAgICAgICAgICA6IFt0aGlzLnN0YXRlLnVwZGF0ZSguLi5pbnB1dCldO1xuICAgICAgICB0aGlzLmRpc3BhdGNoVHJhbnNhY3Rpb25zKHRycywgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgdmlldyBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIHRyYW5zYWN0aW9ucy4gVGhpcyB3aWxsXG4gICAgdXBkYXRlIHRoZSB2aXNpYmxlIGRvY3VtZW50IGFuZCBzZWxlY3Rpb24gdG8gbWF0Y2ggdGhlIHN0YXRlXG4gICAgcHJvZHVjZWQgYnkgdGhlIHRyYW5zYWN0aW9ucywgYW5kIG5vdGlmeSB2aWV3IHBsdWdpbnMgb2YgdGhlXG4gICAgY2hhbmdlLiBZb3Ugc2hvdWxkIHVzdWFsbHkgY2FsbFxuICAgIFtgZGlzcGF0Y2hgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kaXNwYXRjaCkgaW5zdGVhZCwgd2hpY2ggdXNlcyB0aGlzXG4gICAgYXMgYSBwcmltaXRpdmUuXG4gICAgKi9cbiAgICB1cGRhdGUodHJhbnNhY3Rpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZVN0YXRlICE9IDAgLyogVXBkYXRlU3RhdGUuSWRsZSAqLylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbGxzIHRvIEVkaXRvclZpZXcudXBkYXRlIGFyZSBub3QgYWxsb3dlZCB3aGlsZSBhbiB1cGRhdGUgaXMgaW4gcHJvZ3Jlc3NcIik7XG4gICAgICAgIGxldCByZWRyYXduID0gZmFsc2UsIGF0dHJzQ2hhbmdlZCA9IGZhbHNlLCB1cGRhdGU7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGZvciAobGV0IHRyIG9mIHRyYW5zYWN0aW9ucykge1xuICAgICAgICAgICAgaWYgKHRyLnN0YXJ0U3RhdGUgIT0gc3RhdGUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUcnlpbmcgdG8gdXBkYXRlIHN0YXRlIHdpdGggYSB0cmFuc2FjdGlvbiB0aGF0IGRvZXNuJ3Qgc3RhcnQgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUuXCIpO1xuICAgICAgICAgICAgc3RhdGUgPSB0ci5zdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmlld1N0YXRlLnN0YXRlID0gc3RhdGU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvY3VzID0gdGhpcy5oYXNGb2N1cywgZm9jdXNGbGFnID0gMCwgZGlzcGF0Y2hGb2N1cyA9IG51bGw7XG4gICAgICAgIGlmICh0cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5hbm5vdGF0aW9uKGlzRm9jdXNDaGFuZ2UpKSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCA9IGZvY3VzO1xuICAgICAgICAgICAgLy8gSWYgYSBmb2N1cy1jaGFuZ2UgdHJhbnNhY3Rpb24gaXMgYmVpbmcgZGlzcGF0Y2hlZCwgc2V0IHRoaXMgdXBkYXRlIGZsYWcuXG4gICAgICAgICAgICBmb2N1c0ZsYWcgPSAxIC8qIFVwZGF0ZUZsYWcuRm9jdXMgKi87XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZm9jdXMgIT0gdGhpcy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLm5vdGlmaWVkRm9jdXNlZCA9IGZvY3VzO1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBzZXBhcmF0ZSBmb2N1cyB0cmFuc2FjdGlvbiBpZiBuZWNlc3NhcnksIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gYWRkIGEgZmxhZyB0byB0aGlzIHVwZGF0ZVxuICAgICAgICAgICAgZGlzcGF0Y2hGb2N1cyA9IGZvY3VzQ2hhbmdlVHJhbnNhY3Rpb24oc3RhdGUsIGZvY3VzKTtcbiAgICAgICAgICAgIGlmICghZGlzcGF0Y2hGb2N1cylcbiAgICAgICAgICAgICAgICBmb2N1c0ZsYWcgPSAxIC8qIFVwZGF0ZUZsYWcuRm9jdXMgKi87XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgcGVuZGluZyBET00gY2hhbmdlLCBlYWdlcmx5IHJlYWQgaXQgYW5kIHRyeSB0b1xuICAgICAgICAvLyBhcHBseSBpdCBhZnRlciB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb25zLlxuICAgICAgICBsZXQgcGVuZGluZ0tleSA9IHRoaXMub2JzZXJ2ZXIuZGVsYXllZEFuZHJvaWRLZXksIGRvbUNoYW5nZSA9IG51bGw7XG4gICAgICAgIGlmIChwZW5kaW5nS2V5KSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmNsZWFyRGVsYXllZEFuZHJvaWRLZXkoKTtcbiAgICAgICAgICAgIGRvbUNoYW5nZSA9IHRoaXMub2JzZXJ2ZXIucmVhZENoYW5nZSgpO1xuICAgICAgICAgICAgLy8gT25seSB0cnkgdG8gYXBwbHkgRE9NIGNoYW5nZXMgaWYgdGhlIHRyYW5zYWN0aW9ucyBkaWRuJ3RcbiAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgZG9jIG9yIHNlbGVjdGlvbi5cbiAgICAgICAgICAgIGlmIChkb21DaGFuZ2UgJiYgIXRoaXMuc3RhdGUuZG9jLmVxKHN0YXRlLmRvYykgfHwgIXRoaXMuc3RhdGUuc2VsZWN0aW9uLmVxKHN0YXRlLnNlbGVjdGlvbikpXG4gICAgICAgICAgICAgICAgZG9tQ2hhbmdlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBwaHJhc2VzIGNoYW5nZSwgcmVkcmF3IHRoZSBlZGl0b3JcbiAgICAgICAgaWYgKHN0YXRlLmZhY2V0KEVkaXRvclN0YXRlLnBocmFzZXMpICE9IHRoaXMuc3RhdGUuZmFjZXQoRWRpdG9yU3RhdGUucGhyYXNlcykpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgIHVwZGF0ZSA9IFZpZXdVcGRhdGUuY3JlYXRlKHRoaXMsIHN0YXRlLCB0cmFuc2FjdGlvbnMpO1xuICAgICAgICB1cGRhdGUuZmxhZ3MgfD0gZm9jdXNGbGFnO1xuICAgICAgICBsZXQgc2Nyb2xsVGFyZ2V0ID0gdGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDIgLyogVXBkYXRlU3RhdGUuVXBkYXRpbmcgKi87XG4gICAgICAgICAgICBmb3IgKGxldCB0ciBvZiB0cmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsVGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUYXJnZXQgPSBzY3JvbGxUYXJnZXQubWFwKHRyLmNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIGlmICh0ci5zY3JvbGxJbnRvVmlldykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyBtYWluIH0gPSB0ci5zdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRhcmdldCA9IG5ldyBTY3JvbGxUYXJnZXQobWFpbi5lbXB0eSA/IG1haW4gOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKG1haW4uaGVhZCwgbWFpbi5oZWFkID4gbWFpbi5hbmNob3IgPyAtMSA6IDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZSBvZiB0ci5lZmZlY3RzKVxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5pcyhzY3JvbGxJbnRvVmlldykpXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUYXJnZXQgPSBlLnZhbHVlLmNsaXAodGhpcy5zdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS51cGRhdGUodXBkYXRlLCBzY3JvbGxUYXJnZXQpO1xuICAgICAgICAgICAgdGhpcy5iaWRpQ2FjaGUgPSBDYWNoZWRPcmRlci51cGRhdGUodGhpcy5iaWRpQ2FjaGUsIHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgICAgIGlmICghdXBkYXRlLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5zKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXRlLnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVkcmF3biA9IHRoaXMuZG9jVmlldy51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmZhY2V0KHN0eWxlTW9kdWxlKSAhPSB0aGlzLnN0eWxlTW9kdWxlcylcbiAgICAgICAgICAgICAgICB0aGlzLm1vdW50U3R5bGVzKCk7XG4gICAgICAgICAgICBhdHRyc0NoYW5nZWQgPSB0aGlzLnVwZGF0ZUF0dHJzKCk7XG4gICAgICAgICAgICB0aGlzLnNob3dBbm5vdW5jZW1lbnRzKHRyYW5zYWN0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcudXBkYXRlU2VsZWN0aW9uKHJlZHJhd24sIHRyYW5zYWN0aW9ucy5zb21lKHRyID0+IHRyLmlzVXNlckV2ZW50KFwic2VsZWN0LnBvaW50ZXJcIikpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHRoZW1lKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQodGhlbWUpKVxuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUubXVzdE1lYXN1cmVDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHJlZHJhd24gfHwgYXR0cnNDaGFuZ2VkIHx8IHNjcm9sbFRhcmdldCB8fCB0aGlzLnZpZXdTdGF0ZS5tdXN0RW5mb3JjZUN1cnNvckFzc29jIHx8IHRoaXMudmlld1N0YXRlLm11c3RNZWFzdXJlQ29udGVudClcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgaWYgKCF1cGRhdGUuZW1wdHkpXG4gICAgICAgICAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiB0aGlzLnN0YXRlLmZhY2V0KHVwZGF0ZUxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0V4Y2VwdGlvbih0aGlzLnN0YXRlLCBlLCBcInVwZGF0ZSBsaXN0ZW5lclwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwYXRjaEZvY3VzIHx8IGRvbUNoYW5nZSlcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkaXNwYXRjaEZvY3VzICYmIHRoaXMuc3RhdGUgPT0gZGlzcGF0Y2hGb2N1cy5zdGFydFN0YXRlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoKGRpc3BhdGNoRm9jdXMpO1xuICAgICAgICAgICAgICAgIGlmIChkb21DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcHBseURPTUNoYW5nZSh0aGlzLCBkb21DaGFuZ2UpICYmIHBlbmRpbmdLZXkuZm9yY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEtleSh0aGlzLmNvbnRlbnRET00sIHBlbmRpbmdLZXkua2V5LCBwZW5kaW5nS2V5LmtleUNvZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXNldCB0aGUgdmlldyB0byB0aGUgZ2l2ZW4gc3RhdGUuIChUaGlzIHdpbGwgY2F1c2UgdGhlIGVudGlyZVxuICAgIGRvY3VtZW50IHRvIGJlIHJlZHJhd24gYW5kIGFsbCB2aWV3IHBsdWdpbnMgdG8gYmUgcmVpbml0aWFsaXplZCxcbiAgICBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IG9ubHkgdXNlIGl0IHdoZW4gdGhlIG5ldyBzdGF0ZSBpc24ndFxuICAgIGRlcml2ZWQgZnJvbSB0aGUgb2xkIHN0YXRlLiBPdGhlcndpc2UsIHVzZVxuICAgIFtgZGlzcGF0Y2hgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kaXNwYXRjaCkgaW5zdGVhZC4pXG4gICAgKi9cbiAgICBzZXRTdGF0ZShuZXdTdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdGF0ZSAhPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi8pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxscyB0byBFZGl0b3JWaWV3LnNldFN0YXRlIGFyZSBub3QgYWxsb3dlZCB3aGlsZSBhbiB1cGRhdGUgaXMgaW4gcHJvZ3Jlc3NcIik7XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMiAvKiBVcGRhdGVTdGF0ZS5VcGRhdGluZyAqLztcbiAgICAgICAgbGV0IGhhZEZvY3VzID0gdGhpcy5oYXNGb2N1cztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICAgICAgcGx1Z2luLmRlc3Ryb3kodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZSA9IG5ldyBWaWV3U3RhdGUobmV3U3RhdGUpO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zID0gbmV3U3RhdGUuZmFjZXQodmlld1BsdWdpbikubWFwKHNwZWMgPT4gbmV3IFBsdWdpbkluc3RhbmNlKHNwZWMpKTtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwLmNsZWFyKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBwbHVnaW4gb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIHBsdWdpbi51cGRhdGUodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRvY1ZpZXcuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3ID0gbmV3IERvY1ZpZXcodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUuZW5zdXJlSGFuZGxlcnModGhpcy5wbHVnaW5zKTtcbiAgICAgICAgICAgIHRoaXMubW91bnRTdHlsZXMoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQXR0cnMoKTtcbiAgICAgICAgICAgIHRoaXMuYmlkaUNhY2hlID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlID0gMCAvKiBVcGRhdGVTdGF0ZS5JZGxlICovO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYWRGb2N1cylcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0TWVhc3VyZSgpO1xuICAgIH1cbiAgICB1cGRhdGVQbHVnaW5zKHVwZGF0ZSkge1xuICAgICAgICBsZXQgcHJldlNwZWNzID0gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQodmlld1BsdWdpbiksIHNwZWNzID0gdXBkYXRlLnN0YXRlLmZhY2V0KHZpZXdQbHVnaW4pO1xuICAgICAgICBpZiAocHJldlNwZWNzICE9IHNwZWNzKSB7XG4gICAgICAgICAgICBsZXQgbmV3UGx1Z2lucyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgc3BlYyBvZiBzcGVjcykge1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IHByZXZTcGVjcy5pbmRleE9mKHNwZWMpO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UGx1Z2lucy5wdXNoKG5ldyBQbHVnaW5JbnN0YW5jZShzcGVjKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGx1Z2luID0gdGhpcy5wbHVnaW5zW2ZvdW5kXTtcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLm11c3RVcGRhdGUgPSB1cGRhdGU7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BsdWdpbnMucHVzaChwbHVnaW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpXG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5tdXN0VXBkYXRlICE9IHVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmRlc3Ryb3kodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMgPSBuZXdQbHVnaW5zO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXAuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wbHVnaW5zKVxuICAgICAgICAgICAgICAgIHAubXVzdFVwZGF0ZSA9IHVwZGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGx1Z2lucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMucGx1Z2luc1tpXS51cGRhdGUodGhpcyk7XG4gICAgICAgIGlmIChwcmV2U3BlY3MgIT0gc3BlY3MpXG4gICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUuZW5zdXJlSGFuZGxlcnModGhpcy5wbHVnaW5zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtZWFzdXJlKGZsdXNoID0gdHJ1ZSkge1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPiAtMSlcbiAgICAgICAgICAgIHRoaXMud2luLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMubWVhc3VyZVNjaGVkdWxlZCk7XG4gICAgICAgIGlmICh0aGlzLm9ic2VydmVyLmRlbGF5ZWRBbmRyb2lkS2V5KSB7XG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAtMTtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdE1lYXN1cmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAwOyAvLyBQcmV2ZW50IHJlcXVlc3RNZWFzdXJlIGNhbGxzIGZyb20gc2NoZWR1bGluZyBhbm90aGVyIGFuaW1hdGlvbiBmcmFtZVxuICAgICAgICBpZiAoZmx1c2gpXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmZvcmNlRmx1c2goKTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBudWxsO1xuICAgICAgICBsZXQgc0RPTSA9IHRoaXMuc2Nyb2xsRE9NLCBzY3JvbGxUb3AgPSBzRE9NLnNjcm9sbFRvcCAqIHRoaXMuc2NhbGVZO1xuICAgICAgICBsZXQgeyBzY3JvbGxBbmNob3JQb3MsIHNjcm9sbEFuY2hvckhlaWdodCB9ID0gdGhpcy52aWV3U3RhdGU7XG4gICAgICAgIGlmIChNYXRoLmFicyhzY3JvbGxUb3AgLSB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUb3ApID4gMSlcbiAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbEFuY2hvckhlaWdodCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2Nyb2xsZWRUb0JvdHRvbShzRE9NKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQW5jaG9yUG9zID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRNYXAuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJsb2NrID0gdGhpcy52aWV3U3RhdGUuc2Nyb2xsQW5jaG9yQXQoc2Nyb2xsVG9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvclBvcyA9IGJsb2NrLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSBibG9jay50b3A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSA9IDEgLyogVXBkYXRlU3RhdGUuTWVhc3VyaW5nICovO1xuICAgICAgICAgICAgICAgIGxldCBjaGFuZ2VkID0gdGhpcy52aWV3U3RhdGUubWVhc3VyZSh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZWQgJiYgIXRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aCAmJiB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGkgPiA1KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybih0aGlzLm1lYXN1cmVSZXF1ZXN0cy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJNZWFzdXJlIGxvb3AgcmVzdGFydGVkIG1vcmUgdGhhbiA1IHRpbWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJWaWV3cG9ydCBmYWlsZWQgdG8gc3RhYmlsaXplXCIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG1lYXN1cmluZyA9IFtdO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgcnVuIG1lYXN1cmUgcmVxdWVzdHMgaW4gdGhpcyBjeWNsZSB3aGVuIHRoZSB2aWV3cG9ydCBkaWRuJ3QgY2hhbmdlXG4gICAgICAgICAgICAgICAgaWYgKCEoY2hhbmdlZCAmIDQgLyogVXBkYXRlRmxhZy5WaWV3cG9ydCAqLykpXG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLm1lYXN1cmVSZXF1ZXN0cywgbWVhc3VyaW5nXSA9IFttZWFzdXJpbmcsIHRoaXMubWVhc3VyZVJlcXVlc3RzXTtcbiAgICAgICAgICAgICAgICBsZXQgbWVhc3VyZWQgPSBtZWFzdXJpbmcubWFwKG0gPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0ucmVhZCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHRoaXMuc3RhdGUsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhZE1lYXN1cmU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgdXBkYXRlID0gVmlld1VwZGF0ZS5jcmVhdGUodGhpcywgdGhpcy5zdGF0ZSwgW10pLCByZWRyYXduID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdXBkYXRlLmZsYWdzIHw9IGNoYW5nZWQ7XG4gICAgICAgICAgICAgICAgaWYgKCF1cGRhdGVkKVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gdXBkYXRlO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC5mbGFncyB8PSBjaGFuZ2VkO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAyIC8qIFVwZGF0ZVN0YXRlLlVwZGF0aW5nICovO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGx1Z2lucyh1cGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0U3RhdGUudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQXR0cnMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVkcmF3biA9IHRoaXMuZG9jVmlldy51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZWFzdXJpbmcubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlZFtpXSAhPSBCYWRNZWFzdXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtID0gbWVhc3VyaW5nW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtLndyaXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLndyaXRlKG1lYXN1cmVkW2ldLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXhjZXB0aW9uKHRoaXMuc3RhdGUsIGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlZHJhd24pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGVTZWxlY3Rpb24odHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF1cGRhdGUudmlld3BvcnRDaGFuZ2VkICYmIHRoaXMubWVhc3VyZVJlcXVlc3RzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdTdGF0ZS5lZGl0b3JIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcuc2Nyb2xsSW50b1ZpZXcodGhpcy52aWV3U3RhdGUuc2Nyb2xsVGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdTdGF0ZS5zY3JvbGxUYXJnZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEFuY2hvckhlaWdodCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0FuY2hvckhlaWdodCA9IHNjcm9sbEFuY2hvclBvcyA8IDAgPyB0aGlzLnZpZXdTdGF0ZS5oZWlnaHRNYXAuaGVpZ2h0IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3U3RhdGUubGluZUJsb2NrQXQoc2Nyb2xsQW5jaG9yUG9zKS50b3A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpZmYgPSBuZXdBbmNob3JIZWlnaHQgLSBzY3JvbGxBbmNob3JIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAxIHx8IGRpZmYgPCAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgPSBzY3JvbGxUb3AgKyBkaWZmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRE9NLnNjcm9sbFRvcCA9IHNjcm9sbFRvcCAvIHRoaXMuc2NhbGVZO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxBbmNob3JIZWlnaHQgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi87XG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVTY2hlZHVsZWQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZCAmJiAhdXBkYXRlZC5lbXB0eSlcbiAgICAgICAgICAgIGZvciAobGV0IGxpc3RlbmVyIG9mIHRoaXMuc3RhdGUuZmFjZXQodXBkYXRlTGlzdGVuZXIpKVxuICAgICAgICAgICAgICAgIGxpc3RlbmVyKHVwZGF0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIENTUyBjbGFzc2VzIGZvciB0aGUgY3VycmVudGx5IGFjdGl2ZSBlZGl0b3IgdGhlbWVzLlxuICAgICovXG4gICAgZ2V0IHRoZW1lQ2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VUaGVtZUlEICsgXCIgXCIgK1xuICAgICAgICAgICAgKHRoaXMuc3RhdGUuZmFjZXQoZGFya1RoZW1lKSA/IGJhc2VEYXJrSUQgOiBiYXNlTGlnaHRJRCkgKyBcIiBcIiArXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmZhY2V0KHRoZW1lKTtcbiAgICB9XG4gICAgdXBkYXRlQXR0cnMoKSB7XG4gICAgICAgIGxldCBlZGl0b3JBdHRycyA9IGF0dHJzRnJvbUZhY2V0KHRoaXMsIGVkaXRvckF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIGNsYXNzOiBcImNtLWVkaXRvclwiICsgKHRoaXMuaGFzRm9jdXMgPyBcIiBjbS1mb2N1c2VkIFwiIDogXCIgXCIpICsgdGhpcy50aGVtZUNsYXNzZXNcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBjb250ZW50QXR0cnMgPSB7XG4gICAgICAgICAgICBzcGVsbGNoZWNrOiBcImZhbHNlXCIsXG4gICAgICAgICAgICBhdXRvY29ycmVjdDogXCJvZmZcIixcbiAgICAgICAgICAgIGF1dG9jYXBpdGFsaXplOiBcIm9mZlwiLFxuICAgICAgICAgICAgdHJhbnNsYXRlOiBcIm5vXCIsXG4gICAgICAgICAgICBjb250ZW50ZWRpdGFibGU6ICF0aGlzLnN0YXRlLmZhY2V0KGVkaXRhYmxlKSA/IFwiZmFsc2VcIiA6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgY2xhc3M6IFwiY20tY29udGVudFwiLFxuICAgICAgICAgICAgc3R5bGU6IGAke2Jyb3dzZXIudGFiU2l6ZX06ICR7dGhpcy5zdGF0ZS50YWJTaXplfWAsXG4gICAgICAgICAgICByb2xlOiBcInRleHRib3hcIixcbiAgICAgICAgICAgIFwiYXJpYS1tdWx0aWxpbmVcIjogXCJ0cnVlXCJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUucmVhZE9ubHkpXG4gICAgICAgICAgICBjb250ZW50QXR0cnNbXCJhcmlhLXJlYWRvbmx5XCJdID0gXCJ0cnVlXCI7XG4gICAgICAgIGF0dHJzRnJvbUZhY2V0KHRoaXMsIGNvbnRlbnRBdHRyaWJ1dGVzLCBjb250ZW50QXR0cnMpO1xuICAgICAgICBsZXQgY2hhbmdlZCA9IHRoaXMub2JzZXJ2ZXIuaWdub3JlKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBjaGFuZ2VkQ29udGVudCA9IHVwZGF0ZUF0dHJzKHRoaXMuY29udGVudERPTSwgdGhpcy5jb250ZW50QXR0cnMsIGNvbnRlbnRBdHRycyk7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZEVkaXRvciA9IHVwZGF0ZUF0dHJzKHRoaXMuZG9tLCB0aGlzLmVkaXRvckF0dHJzLCBlZGl0b3JBdHRycyk7XG4gICAgICAgICAgICByZXR1cm4gY2hhbmdlZENvbnRlbnQgfHwgY2hhbmdlZEVkaXRvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWRpdG9yQXR0cnMgPSBlZGl0b3JBdHRycztcbiAgICAgICAgdGhpcy5jb250ZW50QXR0cnMgPSBjb250ZW50QXR0cnM7XG4gICAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH1cbiAgICBzaG93QW5ub3VuY2VtZW50cyh0cnMpIHtcbiAgICAgICAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgdHIgb2YgdHJzKVxuICAgICAgICAgICAgZm9yIChsZXQgZWZmZWN0IG9mIHRyLmVmZmVjdHMpXG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdC5pcyhFZGl0b3JWaWV3LmFubm91bmNlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFubm91bmNlRE9NLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpdiA9IHRoaXMuYW5ub3VuY2VET00uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGRpdi50ZXh0Q29udGVudCA9IGVmZmVjdC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgfVxuICAgIG1vdW50U3R5bGVzKCkge1xuICAgICAgICB0aGlzLnN0eWxlTW9kdWxlcyA9IHRoaXMuc3RhdGUuZmFjZXQoc3R5bGVNb2R1bGUpO1xuICAgICAgICBsZXQgbm9uY2UgPSB0aGlzLnN0YXRlLmZhY2V0KEVkaXRvclZpZXcuY3NwTm9uY2UpO1xuICAgICAgICBTdHlsZU1vZHVsZS5tb3VudCh0aGlzLnJvb3QsIHRoaXMuc3R5bGVNb2R1bGVzLmNvbmNhdChiYXNlVGhlbWUkMSkucmV2ZXJzZSgpLCBub25jZSA/IHsgbm9uY2UgfSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJlYWRNZWFzdXJlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlU3RhdGUgPT0gMiAvKiBVcGRhdGVTdGF0ZS5VcGRhdGluZyAqLylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWRpbmcgdGhlIGVkaXRvciBsYXlvdXQgaXNuJ3QgYWxsb3dlZCBkdXJpbmcgYW4gdXBkYXRlXCIpO1xuICAgICAgICBpZiAodGhpcy51cGRhdGVTdGF0ZSA9PSAwIC8qIFVwZGF0ZVN0YXRlLklkbGUgKi8gJiYgdGhpcy5tZWFzdXJlU2NoZWR1bGVkID4gLTEpXG4gICAgICAgICAgICB0aGlzLm1lYXN1cmUoZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICBTY2hlZHVsZSBhIGxheW91dCBtZWFzdXJlbWVudCwgb3B0aW9uYWxseSBwcm92aWRpbmcgY2FsbGJhY2tzIHRvXG4gICAgZG8gY3VzdG9tIERPTSBtZWFzdXJpbmcgZm9sbG93ZWQgYnkgYSBET00gd3JpdGUgcGhhc2UuIFVzaW5nXG4gICAgdGhpcyBpcyBwcmVmZXJhYmxlIHJlYWRpbmcgRE9NIGxheW91dCBkaXJlY3RseSBmcm9tLCBmb3JcbiAgICBleGFtcGxlLCBhbiBldmVudCBoYW5kbGVyLCBiZWNhdXNlIGl0J2xsIG1ha2Ugc3VyZSBtZWFzdXJpbmcgYW5kXG4gICAgZHJhd2luZyBkb25lIGJ5IG90aGVyIGNvbXBvbmVudHMgaXMgc3luY2hyb25pemVkLCBhdm9pZGluZ1xuICAgIHVubmVjZXNzYXJ5IERPTSBsYXlvdXQgY29tcHV0YXRpb25zLlxuICAgICovXG4gICAgcmVxdWVzdE1lYXN1cmUocmVxdWVzdCkge1xuICAgICAgICBpZiAodGhpcy5tZWFzdXJlU2NoZWR1bGVkIDwgMClcbiAgICAgICAgICAgIHRoaXMubWVhc3VyZVNjaGVkdWxlZCA9IHRoaXMud2luLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLm1lYXN1cmUoKSk7XG4gICAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZWFzdXJlUmVxdWVzdHMuaW5kZXhPZihyZXF1ZXN0KSA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmtleSAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tZWFzdXJlUmVxdWVzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWVhc3VyZVJlcXVlc3RzW2ldLmtleSA9PT0gcmVxdWVzdC5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZVJlcXVlc3RzW2ldID0gcmVxdWVzdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWVhc3VyZVJlcXVlc3RzLnB1c2gocmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIHBsdWdpbiwgaWYgcHJlc2VudC4gTm90ZSB0aGF0XG4gICAgcGx1Z2lucyB0aGF0IGNyYXNoIGNhbiBiZSBkcm9wcGVkIGZyb20gYSB2aWV3LCBzbyBldmVuIHdoZW4geW91XG4gICAga25vdyB5b3UgcmVnaXN0ZXJlZCBhIGdpdmVuIHBsdWdpbiwgaXQgaXMgcmVjb21tZW5kZWQgdG8gY2hlY2tcbiAgICB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgbWV0aG9kLlxuICAgICovXG4gICAgcGx1Z2luKHBsdWdpbikge1xuICAgICAgICBsZXQga25vd24gPSB0aGlzLnBsdWdpbk1hcC5nZXQocGx1Z2luKTtcbiAgICAgICAgaWYgKGtub3duID09PSB1bmRlZmluZWQgfHwga25vd24gJiYga25vd24uc3BlYyAhPSBwbHVnaW4pXG4gICAgICAgICAgICB0aGlzLnBsdWdpbk1hcC5zZXQocGx1Z2luLCBrbm93biA9IHRoaXMucGx1Z2lucy5maW5kKHAgPT4gcC5zcGVjID09IHBsdWdpbikgfHwgbnVsbCk7XG4gICAgICAgIHJldHVybiBrbm93biAmJiBrbm93bi51cGRhdGUodGhpcykudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSB0b3AgcG9zaXRpb24gb2YgdGhlIGRvY3VtZW50LCBpbiBzY3JlZW4gY29vcmRpbmF0ZXMuIFRoaXNcbiAgICBtYXkgYmUgbmVnYXRpdmUgd2hlbiB0aGUgZWRpdG9yIGlzIHNjcm9sbGVkIGRvd24uIFBvaW50c1xuICAgIGRpcmVjdGx5IHRvIHRoZSB0b3Agb2YgdGhlIGZpcnN0IGxpbmUsIG5vdCBhYm92ZSB0aGUgcGFkZGluZy5cbiAgICAqL1xuICAgIGdldCBkb2N1bWVudFRvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB0aGlzLnZpZXdTdGF0ZS5wYWRkaW5nVG9wO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBvcnRzIHRoZSBwYWRkaW5nIGFib3ZlIGFuZCBiZWxvdyB0aGUgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXQgZG9jdW1lbnRQYWRkaW5nKCkge1xuICAgICAgICByZXR1cm4geyB0b3A6IHRoaXMudmlld1N0YXRlLnBhZGRpbmdUb3AsIGJvdHRvbTogdGhpcy52aWV3U3RhdGUucGFkZGluZ0JvdHRvbSB9O1xuICAgIH1cbiAgICAvKipcbiAgICBJZiB0aGUgZWRpdG9yIGlzIHRyYW5zZm9ybWVkIHdpdGggQ1NTLCB0aGlzIHByb3ZpZGVzIHRoZSBzY2FsZVxuICAgIGFsb25nIHRoZSBYIGF4aXMuIE90aGVyd2lzZSwgaXQgd2lsbCBqdXN0IGJlIDEuIE5vdGUgdGhhdFxuICAgIHRyYW5zZm9ybXMgb3RoZXIgdGhhbiB0cmFuc2xhdGlvbiBhbmQgc2NhbGluZyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAqL1xuICAgIGdldCBzY2FsZVgoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5zY2FsZVg7IH1cbiAgICAvKipcbiAgICBQcm92aWRlIHRoZSBDU1MgdHJhbnNmb3JtZWQgc2NhbGUgYWxvbmcgdGhlIFkgYXhpcy5cbiAgICAqL1xuICAgIGdldCBzY2FsZVkoKSB7IHJldHVybiB0aGlzLnZpZXdTdGF0ZS5zY2FsZVk7IH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSB0ZXh0IGxpbmUgb3IgYmxvY2sgd2lkZ2V0IGF0IHRoZSBnaXZlbiB2ZXJ0aWNhbFxuICAgIHBvc2l0aW9uICh3aGljaCBpcyBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgW3RvcCBvZiB0aGVcbiAgICBkb2N1bWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZG9jdW1lbnRUb3ApKS5cbiAgICAqL1xuICAgIGVsZW1lbnRBdEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmVsZW1lbnRBdEhlaWdodChoZWlnaHQpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBsaW5lIGJsb2NrIChzZWVcbiAgICBbYGxpbmVCbG9ja0F0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubGluZUJsb2NrQXQpIGF0IHRoZSBnaXZlblxuICAgIGhlaWdodCwgYWdhaW4gaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIFt0b3Agb2YgdGhlXG4gICAgZG9jdW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRvY3VtZW50VG9wKS5cbiAgICAqL1xuICAgIGxpbmVCbG9ja0F0SGVpZ2h0KGhlaWdodCkge1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3U3RhdGUubGluZUJsb2NrQXRIZWlnaHQoaGVpZ2h0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBleHRlbnQgYW5kIHZlcnRpY2FsIHBvc2l0aW9uIG9mIGFsbCBbbGluZVxuICAgIGJsb2Nrc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubGluZUJsb2NrQXQpIGluIHRoZSB2aWV3cG9ydC4gUG9zaXRpb25zXG4gICAgYXJlIHJlbGF0aXZlIHRvIHRoZSBbdG9wIG9mIHRoZVxuICAgIGRvY3VtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5kb2N1bWVudFRvcCk7XG4gICAgKi9cbiAgICBnZXQgdmlld3BvcnRMaW5lQmxvY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3U3RhdGUudmlld3BvcnRMaW5lcztcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgbGluZSBibG9jayBhcm91bmQgdGhlIGdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLiBBIGxpbmVcbiAgICBibG9jayBpcyBhIHJhbmdlIGRlbGltaXRlZCBvbiBib3RoIHNpZGVzIGJ5IGVpdGhlciBhXG4gICAgbm9uLVtoaWRkZW5dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uXnJlcGxhY2UpIGxpbmUgYnJlYWtzLCBvciB0aGVcbiAgICBzdGFydC9lbmQgb2YgdGhlIGRvY3VtZW50LiBJdCB3aWxsIHVzdWFsbHkganVzdCBob2xkIGEgbGluZSBvZlxuICAgIHRleHQsIGJ1dCBtYXkgYmUgYnJva2VuIGludG8gbXVsdGlwbGUgdGV4dGJsb2NrcyBieSBibG9ja1xuICAgIHdpZGdldHMuXG4gICAgKi9cbiAgICBsaW5lQmxvY2tBdChwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld1N0YXRlLmxpbmVCbG9ja0F0KHBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBlZGl0b3IncyB0b3RhbCBjb250ZW50IGhlaWdodC5cbiAgICAqL1xuICAgIGdldCBjb250ZW50SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3U3RhdGUuY29udGVudEhlaWdodDtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSBhIGN1cnNvciBwb3NpdGlvbiBieSBbZ3JhcGhlbWVcbiAgICBjbHVzdGVyXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLmZpbmRDbHVzdGVyQnJlYWspLiBgZm9yd2FyZGAgZGV0ZXJtaW5lcyB3aGV0aGVyXG4gICAgdGhlIG1vdGlvbiBpcyBhd2F5IGZyb20gdGhlIGxpbmUgc3RhcnQsIG9yIHRvd2FyZHMgaXQuIEluXG4gICAgYmlkaXJlY3Rpb25hbCB0ZXh0LCB0aGUgbGluZSBpcyB0cmF2ZXJzZWQgaW4gdmlzdWFsIG9yZGVyLCB1c2luZ1xuICAgIHRoZSBlZGl0b3IncyBbdGV4dCBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnRleHREaXJlY3Rpb24pLlxuICAgIFdoZW4gdGhlIHN0YXJ0IHBvc2l0aW9uIHdhcyB0aGUgbGFzdCBvbmUgb24gdGhlIGxpbmUsIHRoZVxuICAgIHJldHVybmVkIHBvc2l0aW9uIHdpbGwgYmUgYWNyb3NzIHRoZSBsaW5lIGJyZWFrLiBJZiB0aGVyZSBpcyBub1xuICAgIGZ1cnRoZXIgbGluZSwgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIGlzIHJldHVybmVkLlxuICAgIFxuICAgIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIG1vdmVzIG92ZXIgYSBzaW5nbGUgY2x1c3Rlci4gVGhlXG4gICAgb3B0aW9uYWwgYGJ5YCBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBtb3ZlIGFjcm9zcyBtb3JlLiBJdCB3aWxsXG4gICAgYmUgY2FsbGVkIHdpdGggdGhlIGZpcnN0IGNsdXN0ZXIgYXMgYXJndW1lbnQsIGFuZCBzaG91bGQgcmV0dXJuXG4gICAgYSBwcmVkaWNhdGUgdGhhdCBkZXRlcm1pbmVzLCBmb3IgZWFjaCBzdWJzZXF1ZW50IGNsdXN0ZXIsXG4gICAgd2hldGhlciBpdCBzaG91bGQgYWxzbyBiZSBtb3ZlZCBvdmVyLlxuICAgICovXG4gICAgbW92ZUJ5Q2hhcihzdGFydCwgZm9yd2FyZCwgYnkpIHtcbiAgICAgICAgcmV0dXJuIHNraXBBdG9tcyh0aGlzLCBzdGFydCwgbW92ZUJ5Q2hhcih0aGlzLCBzdGFydCwgZm9yd2FyZCwgYnkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSBhIGN1cnNvciBwb3NpdGlvbiBhY3Jvc3MgdGhlIG5leHQgZ3JvdXAgb2YgZWl0aGVyXG4gICAgW2xldHRlcnNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuY2hhckNhdGVnb3JpemVyKSBvciBub24tbGV0dGVyXG4gICAgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycy5cbiAgICAqL1xuICAgIG1vdmVCeUdyb3VwKHN0YXJ0LCBmb3J3YXJkKSB7XG4gICAgICAgIHJldHVybiBza2lwQXRvbXModGhpcywgc3RhcnQsIG1vdmVCeUNoYXIodGhpcywgc3RhcnQsIGZvcndhcmQsIGluaXRpYWwgPT4gYnlHcm91cCh0aGlzLCBzdGFydC5oZWFkLCBpbml0aWFsKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGN1cnNvciBwb3NpdGlvbiB2aXN1YWxseSBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgbGluZS5cbiAgICBOb3RlIHRoYXQgdGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIF9sb2dpY2FsXyBwb3NpdGlvbiBhdCBpdHNcbiAgICBzdGFydCBvciBlbmQgKHdoaWNoIGlzIHNpbXBseSBhdCBgbGluZS5mcm9tYC9gbGluZS50b2ApIGlmIHRleHRcbiAgICBhdCB0aGUgc3RhcnQgb3IgZW5kIGdvZXMgYWdhaW5zdCB0aGUgbGluZSdzIGJhc2UgdGV4dCBkaXJlY3Rpb24uXG4gICAgKi9cbiAgICB2aXN1YWxMaW5lU2lkZShsaW5lLCBlbmQpIHtcbiAgICAgICAgbGV0IG9yZGVyID0gdGhpcy5iaWRpU3BhbnMobGluZSksIGRpciA9IHRoaXMudGV4dERpcmVjdGlvbkF0KGxpbmUuZnJvbSk7XG4gICAgICAgIGxldCBzcGFuID0gb3JkZXJbZW5kID8gb3JkZXIubGVuZ3RoIC0gMSA6IDBdO1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihzcGFuLnNpZGUoZW5kLCBkaXIpICsgbGluZS5mcm9tLCBzcGFuLmZvcndhcmQoIWVuZCwgZGlyKSA/IDEgOiAtMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gdGhlIG5leHQgbGluZSBib3VuZGFyeSBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLiBJZlxuICAgIGBpbmNsdWRlV3JhcGAgaXMgdHJ1ZSwgbGluZSB3cmFwcGluZyBpcyBvbiwgYW5kIHRoZXJlIGlzIGFcbiAgICBmdXJ0aGVyIHdyYXAgcG9pbnQgb24gdGhlIGN1cnJlbnQgbGluZSwgdGhlIHdyYXAgcG9pbnQgd2lsbCBiZVxuICAgIHJldHVybmVkLiBPdGhlcndpc2UgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgc3RhcnQgb3IgZW5kXG4gICAgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBtb3ZlVG9MaW5lQm91bmRhcnkoc3RhcnQsIGZvcndhcmQsIGluY2x1ZGVXcmFwID0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gbW92ZVRvTGluZUJvdW5kYXJ5KHRoaXMsIHN0YXJ0LCBmb3J3YXJkLCBpbmNsdWRlV3JhcCk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgYSBjdXJzb3IgcG9zaXRpb24gdmVydGljYWxseS4gV2hlbiBgZGlzdGFuY2VgIGlzbid0IGdpdmVuLFxuICAgIGl0IGRlZmF1bHRzIHRvIG1vdmluZyB0byB0aGUgbmV4dCBsaW5lIChpbmNsdWRpbmcgd3JhcHBlZFxuICAgIGxpbmVzKS4gT3RoZXJ3aXNlLCBgZGlzdGFuY2VgIHNob3VsZCBwcm92aWRlIGEgcG9zaXRpdmUgZGlzdGFuY2VcbiAgICBpbiBwaXhlbHMuXG4gICAgXG4gICAgV2hlbiBgc3RhcnRgIGhhcyBhXG4gICAgW2Bnb2FsQ29sdW1uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25SYW5nZS5nb2FsQ29sdW1uKSwgdGhlIHZlcnRpY2FsXG4gICAgbW90aW9uIHdpbGwgdXNlIHRoYXQgYXMgYSB0YXJnZXQgaG9yaXpvbnRhbCBwb3NpdGlvbi4gT3RoZXJ3aXNlLFxuICAgIHRoZSBjdXJzb3IncyBvd24gaG9yaXpvbnRhbCBwb3NpdGlvbiBpcyB1c2VkLiBUaGUgcmV0dXJuZWRcbiAgICBjdXJzb3Igd2lsbCBoYXZlIGl0cyBnb2FsIGNvbHVtbiBzZXQgdG8gd2hpY2hldmVyIGNvbHVtbiB3YXNcbiAgICB1c2VkLlxuICAgICovXG4gICAgbW92ZVZlcnRpY2FsbHkoc3RhcnQsIGZvcndhcmQsIGRpc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBza2lwQXRvbXModGhpcywgc3RhcnQsIG1vdmVWZXJ0aWNhbGx5KHRoaXMsIHN0YXJ0LCBmb3J3YXJkLCBkaXN0YW5jZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBET00gcGFyZW50IG5vZGUgYW5kIG9mZnNldCAoY2hpbGQgb2Zmc2V0IGlmIGBub2RlYCBpc1xuICAgIGFuIGVsZW1lbnQsIGNoYXJhY3RlciBvZmZzZXQgd2hlbiBpdCBpcyBhIHRleHQgbm9kZSkgYXQgdGhlXG4gICAgZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgXG4gICAgTm90ZSB0aGF0IGZvciBwb3NpdGlvbnMgdGhhdCBhcmVuJ3QgY3VycmVudGx5IGluXG4gICAgYHZpc2libGVSYW5nZXNgLCB0aGUgcmVzdWx0aW5nIERPTSBwb3NpdGlvbiBpc24ndCBuZWNlc3NhcmlseVxuICAgIG1lYW5pbmdmdWwgKGl0IG1heSBqdXN0IHBvaW50IGJlZm9yZSBvciBhZnRlciBhIHBsYWNlaG9sZGVyXG4gICAgZWxlbWVudCkuXG4gICAgKi9cbiAgICBkb21BdFBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5kb21BdFBvcyhwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBkb2N1bWVudCBwb3NpdGlvbiBhdCB0aGUgZ2l2ZW4gRE9NIG5vZGUuIENhbiBiZSB1c2VmdWxcbiAgICBmb3IgYXNzb2NpYXRpbmcgcG9zaXRpb25zIHdpdGggRE9NIGV2ZW50cy4gV2lsbCByYWlzZSBhbiBlcnJvclxuICAgIHdoZW4gYG5vZGVgIGlzbid0IHBhcnQgb2YgdGhlIGVkaXRvciBjb250ZW50LlxuICAgICovXG4gICAgcG9zQXRET00obm9kZSwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgcG9zQXRDb29yZHMoY29vcmRzLCBwcmVjaXNlID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICByZXR1cm4gcG9zQXRDb29yZHModGhpcywgY29vcmRzLCBwcmVjaXNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBzY3JlZW4gY29vcmRpbmF0ZXMgYXQgdGhlIGdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLlxuICAgIGBzaWRlYCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvb3JkaW5hdGVzIGFyZSBiYXNlZCBvbiB0aGVcbiAgICBlbGVtZW50IGJlZm9yZSAoLTEpIG9yIGFmdGVyICgxKSB0aGUgcG9zaXRpb24gKGlmIG5vIGVsZW1lbnQgaXNcbiAgICBhdmFpbGFibGUgb24gdGhlIGdpdmVuIHNpZGUsIHRoZSBtZXRob2Qgd2lsbCB0cmFuc3BhcmVudGx5IHVzZVxuICAgIGFub3RoZXIgc3RyYXRlZ3kgdG8gZ2V0IHJlYXNvbmFibGUgY29vcmRpbmF0ZXMpLlxuICAgICovXG4gICAgY29vcmRzQXRQb3MocG9zLCBzaWRlID0gMSkge1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICBsZXQgcmVjdCA9IHRoaXMuZG9jVmlldy5jb29yZHNBdChwb3MsIHNpZGUpO1xuICAgICAgICBpZiAoIXJlY3QgfHwgcmVjdC5sZWZ0ID09IHJlY3QucmlnaHQpXG4gICAgICAgICAgICByZXR1cm4gcmVjdDtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQocG9zKSwgb3JkZXIgPSB0aGlzLmJpZGlTcGFucyhsaW5lKTtcbiAgICAgICAgbGV0IHNwYW4gPSBvcmRlcltCaWRpU3Bhbi5maW5kKG9yZGVyLCBwb3MgLSBsaW5lLmZyb20sIC0xLCBzaWRlKV07XG4gICAgICAgIHJldHVybiBmbGF0dGVuUmVjdChyZWN0LCAoc3Bhbi5kaXIgPT0gRGlyZWN0aW9uLkxUUikgPT0gKHNpZGUgPiAwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgcmVjdGFuZ2xlIGFyb3VuZCBhIGdpdmVuIGNoYXJhY3Rlci4gSWYgYHBvc2AgZG9lcyBub3RcbiAgICBwb2ludCBpbiBmcm9udCBvZiBhIGNoYXJhY3RlciB0aGF0IGlzIGluIHRoZSB2aWV3cG9ydCBhbmRcbiAgICByZW5kZXJlZCAoaS5lLiBub3QgcmVwbGFjZWQsIG5vdCBhIGxpbmUgYnJlYWspLCB0aGlzIHdpbGwgcmV0dXJuXG4gICAgbnVsbC4gRm9yIHNwYWNlIGNoYXJhY3RlcnMgdGhhdCBhcmUgYSBsaW5lIHdyYXAgcG9pbnQsIHRoaXMgd2lsbFxuICAgIHJldHVybiB0aGUgcG9zaXRpb24gYmVmb3JlIHRoZSBsaW5lIGJyZWFrLlxuICAgICovXG4gICAgY29vcmRzRm9yQ2hhcihwb3MpIHtcbiAgICAgICAgdGhpcy5yZWFkTWVhc3VyZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5jb29yZHNGb3JDaGFyKHBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBkZWZhdWx0IHdpZHRoIG9mIGEgY2hhcmFjdGVyIGluIHRoZSBlZGl0b3IuIE1heSBub3RcbiAgICBhY2N1cmF0ZWx5IHJlZmxlY3QgdGhlIHdpZHRoIG9mIGFsbCBjaGFyYWN0ZXJzIChnaXZlbiB2YXJpYWJsZVxuICAgIHdpZHRoIGZvbnRzIG9yIHN0eWxpbmcgb2YgaW52aWRpZHVhbCByYW5nZXMpLlxuICAgICovXG4gICAgZ2V0IGRlZmF1bHRDaGFyYWN0ZXJXaWR0aCgpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmhlaWdodE9yYWNsZS5jaGFyV2lkdGg7IH1cbiAgICAvKipcbiAgICBUaGUgZGVmYXVsdCBoZWlnaHQgb2YgYSBsaW5lIGluIHRoZSBlZGl0b3IuIE1heSBub3QgYmUgYWNjdXJhdGVcbiAgICBmb3IgYWxsIGxpbmVzLlxuICAgICovXG4gICAgZ2V0IGRlZmF1bHRMaW5lSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuaGVpZ2h0T3JhY2xlLmxpbmVIZWlnaHQ7IH1cbiAgICAvKipcbiAgICBUaGUgdGV4dCBkaXJlY3Rpb25cbiAgICAoW2BkaXJlY3Rpb25gXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZGlyZWN0aW9uKVxuICAgIENTUyBwcm9wZXJ0eSkgb2YgdGhlIGVkaXRvcidzIGNvbnRlbnQgZWxlbWVudC5cbiAgICAqL1xuICAgIGdldCB0ZXh0RGlyZWN0aW9uKCkgeyByZXR1cm4gdGhpcy52aWV3U3RhdGUuZGVmYXVsdFRleHREaXJlY3Rpb247IH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSB0ZXh0IGRpcmVjdGlvbiBvZiB0aGUgYmxvY2sgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCBhc1xuICAgIGFzc2lnbmVkIGJ5IENTUy4gSWZcbiAgICBbYHBlckxpbmVUZXh0RGlyZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdecGVyTGluZVRleHREaXJlY3Rpb24pXG4gICAgaXNuJ3QgZW5hYmxlZCwgb3IgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIG91dHNpZGUgb2YgdGhlIHZpZXdwb3J0LFxuICAgIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGFzXG4gICAgW2B0ZXh0RGlyZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudGV4dERpcmVjdGlvbikuIE5vdGUgdGhhdFxuICAgIHRoaXMgbWF5IHRyaWdnZXIgYSBET00gbGF5b3V0LlxuICAgICovXG4gICAgdGV4dERpcmVjdGlvbkF0KHBvcykge1xuICAgICAgICBsZXQgcGVyTGluZSA9IHRoaXMuc3RhdGUuZmFjZXQocGVyTGluZVRleHREaXJlY3Rpb24pO1xuICAgICAgICBpZiAoIXBlckxpbmUgfHwgcG9zIDwgdGhpcy52aWV3cG9ydC5mcm9tIHx8IHBvcyA+IHRoaXMudmlld3BvcnQudG8pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0RGlyZWN0aW9uO1xuICAgICAgICB0aGlzLnJlYWRNZWFzdXJlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NWaWV3LnRleHREaXJlY3Rpb25BdChwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBXaGV0aGVyIHRoaXMgZWRpdG9yIFt3cmFwcyBsaW5lc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubGluZVdyYXBwaW5nKVxuICAgIChhcyBkZXRlcm1pbmVkIGJ5IHRoZVxuICAgIFtgd2hpdGUtc3BhY2VgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1Mvd2hpdGUtc3BhY2UpXG4gICAgQ1NTIHByb3BlcnR5IG9mIGl0cyBjb250ZW50IGVsZW1lbnQpLlxuICAgICovXG4gICAgZ2V0IGxpbmVXcmFwcGluZygpIHsgcmV0dXJuIHRoaXMudmlld1N0YXRlLmhlaWdodE9yYWNsZS5saW5lV3JhcHBpbmc7IH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBiaWRpcmVjdGlvbmFsIHRleHQgc3RydWN0dXJlIG9mIHRoZSBnaXZlbiBsaW5lXG4gICAgKHdoaWNoIHNob3VsZCBiZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudCkgYXMgYW4gYXJyYXkgb2Ygc3BhblxuICAgIG9iamVjdHMuIFRoZSBvcmRlciBvZiB0aGVzZSBzcGFucyBtYXRjaGVzIHRoZSBbdGV4dFxuICAgIGRpcmVjdGlvbl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudGV4dERpcmVjdGlvbilcdTIwMTRpZiB0aGF0IGlzXG4gICAgbGVmdC10by1yaWdodCwgdGhlIGxlZnRtb3N0IHNwYW5zIGNvbWUgZmlyc3QsIG90aGVyd2lzZSB0aGVcbiAgICByaWdodG1vc3Qgc3BhbnMgY29tZSBmaXJzdC5cbiAgICAqL1xuICAgIGJpZGlTcGFucyhsaW5lKSB7XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA+IE1heEJpZGlMaW5lKVxuICAgICAgICAgICAgcmV0dXJuIHRyaXZpYWxPcmRlcihsaW5lLmxlbmd0aCk7XG4gICAgICAgIGxldCBkaXIgPSB0aGlzLnRleHREaXJlY3Rpb25BdChsaW5lLmZyb20pLCBpc29sYXRlcztcbiAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgdGhpcy5iaWRpQ2FjaGUpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5mcm9tID09IGxpbmUuZnJvbSAmJiBlbnRyeS5kaXIgPT0gZGlyICYmXG4gICAgICAgICAgICAgICAgKGVudHJ5LmZyZXNoIHx8IGlzb2xhdGVzRXEoZW50cnkuaXNvbGF0ZXMsIGlzb2xhdGVzID0gZ2V0SXNvbGF0ZWRSYW5nZXModGhpcywgbGluZSkpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkub3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc29sYXRlcylcbiAgICAgICAgICAgIGlzb2xhdGVzID0gZ2V0SXNvbGF0ZWRSYW5nZXModGhpcywgbGluZSk7XG4gICAgICAgIGxldCBvcmRlciA9IGNvbXB1dGVPcmRlcihsaW5lLnRleHQsIGRpciwgaXNvbGF0ZXMpO1xuICAgICAgICB0aGlzLmJpZGlDYWNoZS5wdXNoKG5ldyBDYWNoZWRPcmRlcihsaW5lLmZyb20sIGxpbmUudG8sIGRpciwgaXNvbGF0ZXMsIHRydWUsIG9yZGVyKSk7XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgd2hldGhlciB0aGUgZWRpdG9yIGhhcyBmb2N1cy5cbiAgICAqL1xuICAgIGdldCBoYXNGb2N1cygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBTYWZhcmkgcmV0dXJuIGZhbHNlIGZvciBoYXNGb2N1cyB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgb3BlblxuICAgICAgICAvLyBvciBjbG9zaW5nLCB3aGljaCBsZWFkcyB1cyB0byBpZ25vcmUgc2VsZWN0aW9uIGNoYW5nZXMgZnJvbSB0aGVcbiAgICAgICAgLy8gY29udGV4dCBtZW51IGJlY2F1c2UgaXQgbG9va3MgbGlrZSB0aGUgZWRpdG9yIGlzbid0IGZvY3VzZWQuXG4gICAgICAgIC8vIFRoaXMga2x1ZGdlcyBhcm91bmQgdGhhdC5cbiAgICAgICAgcmV0dXJuICh0aGlzLmRvbS5vd25lckRvY3VtZW50Lmhhc0ZvY3VzKCkgfHwgYnJvd3Nlci5zYWZhcmkgJiYgKChfYSA9IHRoaXMuaW5wdXRTdGF0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxhc3RDb250ZXh0TWVudSkgPiBEYXRlLm5vdygpIC0gM2U0KSAmJlxuICAgICAgICAgICAgdGhpcy5yb290LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5jb250ZW50RE9NO1xuICAgIH1cbiAgICAvKipcbiAgICBQdXQgZm9jdXMgb24gdGhlIGVkaXRvci5cbiAgICAqL1xuICAgIGZvY3VzKCkge1xuICAgICAgICB0aGlzLm9ic2VydmVyLmlnbm9yZSgoKSA9PiB7XG4gICAgICAgICAgICBmb2N1c1ByZXZlbnRTY3JvbGwodGhpcy5jb250ZW50RE9NKTtcbiAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGVTZWxlY3Rpb24oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgW3Jvb3RdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jI3ZpZXcuRWRpdG9yVmlld0NvbmZpZy5yb290KSBpbiB3aGljaCB0aGUgZWRpdG9yIGxpdmVzLiBUaGlzIGlzIG9ubHlcbiAgICBuZWNlc3Nhcnkgd2hlbiBtb3ZpbmcgdGhlIGVkaXRvcidzIGV4aXN0aW5nIERPTSB0byBhIG5ldyB3aW5kb3cgb3Igc2hhZG93IHJvb3QuXG4gICAgKi9cbiAgICBzZXRSb290KHJvb3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Jvb3QgIT0gcm9vdCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLnNldFdpbmRvdygocm9vdC5ub2RlVHlwZSA9PSA5ID8gcm9vdCA6IHJvb3Qub3duZXJEb2N1bWVudCkuZGVmYXVsdFZpZXcgfHwgd2luZG93KTtcbiAgICAgICAgICAgIHRoaXMubW91bnRTdHlsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDbGVhbiB1cCB0aGlzIGVkaXRvciB2aWV3LCByZW1vdmluZyBpdHMgZWxlbWVudCBmcm9tIHRoZVxuICAgIGRvY3VtZW50LCB1bnJlZ2lzdGVyaW5nIGV2ZW50IGhhbmRsZXJzLCBhbmQgbm90aWZ5aW5nXG4gICAgcGx1Z2lucy4gVGhlIHZpZXcgaW5zdGFuY2UgY2FuIG5vIGxvbmdlciBiZSB1c2VkIGFmdGVyXG4gICAgY2FsbGluZyB0aGlzLlxuICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChsZXQgcGx1Z2luIG9mIHRoaXMucGx1Z2lucylcbiAgICAgICAgICAgIHBsdWdpbi5kZXN0cm95KHRoaXMpO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5pbnB1dFN0YXRlLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kb2NWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kb20ucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5tZWFzdXJlU2NoZWR1bGVkID4gLTEpXG4gICAgICAgICAgICB0aGlzLndpbi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLm1lYXN1cmVTY2hlZHVsZWQpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYW4gZWZmZWN0IHRoYXQgY2FuIGJlXG4gICAgW2FkZGVkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uU3BlYy5lZmZlY3RzKSB0byBhIHRyYW5zYWN0aW9uIHRvXG4gICAgY2F1c2UgaXQgdG8gc2Nyb2xsIHRoZSBnaXZlbiBwb3NpdGlvbiBvciByYW5nZSBpbnRvIHZpZXcuXG4gICAgKi9cbiAgICBzdGF0aWMgc2Nyb2xsSW50b1ZpZXcocG9zLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHNjcm9sbEludG9WaWV3Lm9mKG5ldyBTY3JvbGxUYXJnZXQodHlwZW9mIHBvcyA9PSBcIm51bWJlclwiID8gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MpIDogcG9zLCBvcHRpb25zLnksIG9wdGlvbnMueCwgb3B0aW9ucy55TWFyZ2luLCBvcHRpb25zLnhNYXJnaW4pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGFuIGVmZmVjdCB0aGF0IHJlc2V0cyB0aGUgZWRpdG9yIHRvIGl0cyBjdXJyZW50IChhdCB0aGVcbiAgICB0aW1lIHRoaXMgbWV0aG9kIHdhcyBjYWxsZWQpIHNjcm9sbCBwb3NpdGlvbi4gTm90ZSB0aGF0IHRoaXNcbiAgICBvbmx5IGFmZmVjdHMgdGhlIGVkaXRvcidzIG93biBzY3JvbGxhYmxlIGVsZW1lbnQsIG5vdCBwYXJlbnRzLlxuICAgIFNlZSBhbHNvXG4gICAgW2BFZGl0b3JWaWV3Q29uZmlnLnNjcm9sbFRvYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdDb25maWcuc2Nyb2xsVG8pLlxuICAgIFxuICAgIFRoZSBlZmZlY3Qgc2hvdWxkIGJlIHVzZWQgd2l0aCBhIGRvY3VtZW50IGlkZW50aWNhbCB0byB0aGUgb25lXG4gICAgaXQgd2FzIGNyZWF0ZWQgZm9yLiBGYWlsaW5nIHRvIGRvIHNvIGlzIG5vdCBhbiBlcnJvciwgYnV0IG1heVxuICAgIG5vdCBzY3JvbGwgdG8gdGhlIGV4cGVjdGVkIHBvc2l0aW9uLiBZb3UgY2FuXG4gICAgW21hcF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUVmZmVjdC5tYXApIHRoZSBlZmZlY3QgdG8gYWNjb3VudCBmb3IgY2hhbmdlcy5cbiAgICAqL1xuICAgIHNjcm9sbFNuYXBzaG90KCkge1xuICAgICAgICBsZXQgeyBzY3JvbGxUb3AsIHNjcm9sbExlZnQgfSA9IHRoaXMuc2Nyb2xsRE9NO1xuICAgICAgICBsZXQgcmVmID0gdGhpcy52aWV3U3RhdGUuc2Nyb2xsQW5jaG9yQXQoc2Nyb2xsVG9wKTtcbiAgICAgICAgcmV0dXJuIHNjcm9sbEludG9WaWV3Lm9mKG5ldyBTY3JvbGxUYXJnZXQoRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihyZWYuZnJvbSksIFwic3RhcnRcIiwgXCJzdGFydFwiLCByZWYudG9wIC0gc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0LCB0cnVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIERPTSBldmVudCBoYW5kbGVycy5cbiAgICBUaGUgdmFsdWUgc2hvdWxkIGJlIGFuIG9iamVjdCBtYXBwaW5nIGV2ZW50IG5hbWVzIHRvIGhhbmRsZXJcbiAgICBmdW5jdGlvbnMuIEZvciBhbnkgZ2l2ZW4gZXZlbnQsIHN1Y2ggZnVuY3Rpb25zIGFyZSBvcmRlcmVkIGJ5XG4gICAgZXh0ZW5zaW9uIHByZWNlZGVuY2UsIGFuZCB0aGUgZmlyc3QgaGFuZGxlciB0byByZXR1cm4gdHJ1ZSB3aWxsXG4gICAgYmUgYXNzdW1lZCB0byBoYXZlIGhhbmRsZWQgdGhhdCBldmVudCwgYW5kIG5vIG90aGVyIGhhbmRsZXJzIG9yXG4gICAgYnVpbHQtaW4gYmVoYXZpb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZm9yIGl0LiBUaGVzZSBhcmUgcmVnaXN0ZXJlZFxuICAgIG9uIHRoZSBbY29udGVudCBlbGVtZW50XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldy5jb250ZW50RE9NKSwgZXhjZXB0XG4gICAgZm9yIGBzY3JvbGxgIGhhbmRsZXJzLCB3aGljaCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSB0aGVcbiAgICBlZGl0b3IncyBbc2Nyb2xsIGVsZW1lbnRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnNjcm9sbERPTSkgb3Igb25lIG9mXG4gICAgaXRzIHBhcmVudCBub2RlcyBpcyBzY3JvbGxlZC5cbiAgICAqL1xuICAgIHN0YXRpYyBkb21FdmVudEhhbmRsZXJzKGhhbmRsZXJzKSB7XG4gICAgICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSgoKSA9PiAoe30pLCB7IGV2ZW50SGFuZGxlcnM6IGhhbmRsZXJzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgcmVnaXN0ZXJzIERPTSBldmVudCBvYnNlcnZlcnMuIENvbnRyYXJ5XG4gICAgdG8gZXZlbnQgW2hhbmRsZXJzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15kb21FdmVudEhhbmRsZXJzKSxcbiAgICBvYnNlcnZlcnMgY2FuJ3QgYmUgcHJldmVudGVkIGZyb20gcnVubmluZyBieSBhIGhpZ2hlci1wcmVjZWRlbmNlXG4gICAgaGFuZGxlciByZXR1cm5pbmcgdHJ1ZS4gVGhleSBhbHNvIGRvbid0IHByZXZlbnQgb3RoZXIgaGFuZGxlcnNcbiAgICBhbmQgb2JzZXJ2ZXJzIGZyb20gcnVubmluZyB3aGVuIHRoZXkgcmV0dXJuIHRydWUsIGFuZCBzaG91bGQgbm90XG4gICAgY2FsbCBgcHJldmVudERlZmF1bHRgLlxuICAgICovXG4gICAgc3RhdGljIGRvbUV2ZW50T2JzZXJ2ZXJzKG9ic2VydmVycykge1xuICAgICAgICByZXR1cm4gVmlld1BsdWdpbi5kZWZpbmUoKCkgPT4gKHt9KSwgeyBldmVudE9ic2VydmVyczogb2JzZXJ2ZXJzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSB0aGVtZSBleHRlbnNpb24uIFRoZSBmaXJzdCBhcmd1bWVudCBjYW4gYmUgYVxuICAgIFtgc3R5bGUtbW9kYF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvc3R5bGUtbW9kI2RvY3VtZW50YXRpb24pXG4gICAgc3R5bGUgc3BlYyBwcm92aWRpbmcgdGhlIHN0eWxlcyBmb3IgdGhlIHRoZW1lLiBUaGVzZSB3aWxsIGJlXG4gICAgcHJlZml4ZWQgd2l0aCBhIGdlbmVyYXRlZCBjbGFzcyBmb3IgdGhlIHN0eWxlLlxuICAgIFxuICAgIEJlY2F1c2UgdGhlIHNlbGVjdG9ycyB3aWxsIGJlIHByZWZpeGVkIHdpdGggYSBzY29wZSBjbGFzcywgcnVsZVxuICAgIHRoYXQgZGlyZWN0bHkgbWF0Y2ggdGhlIGVkaXRvcidzIFt3cmFwcGVyXG4gICAgZWxlbWVudF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZG9tKVx1MjAxNHRvIHdoaWNoIHRoZSBzY29wZSBjbGFzcyB3aWxsIGJlXG4gICAgYWRkZWRcdTIwMTRuZWVkIHRvIGJlIGV4cGxpY2l0bHkgZGlmZmVyZW50aWF0ZWQgYnkgYWRkaW5nIGFuIGAmYCB0b1xuICAgIHRoZSBzZWxlY3RvciBmb3IgdGhhdCBlbGVtZW50XHUyMDE0Zm9yIGV4YW1wbGVcbiAgICBgJi5jbS1mb2N1c2VkYC5cbiAgICBcbiAgICBXaGVuIGBkYXJrYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIHRoZW1lIHdpbGwgYmUgbWFya2VkIGFzIGRhcmssXG4gICAgd2hpY2ggd2lsbCBjYXVzZSB0aGUgYCZkYXJrYCBydWxlcyBmcm9tIFtiYXNlXG4gICAgdGhlbWVzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlld15iYXNlVGhlbWUpIHRvIGJlIHVzZWQgKGFzIG9wcG9zZWQgdG9cbiAgICBgJmxpZ2h0YCB3aGVuIGEgbGlnaHQgdGhlbWUgaXMgYWN0aXZlKS5cbiAgICAqL1xuICAgIHN0YXRpYyB0aGVtZShzcGVjLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBwcmVmaXggPSBTdHlsZU1vZHVsZS5uZXdOYW1lKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBbdGhlbWUub2YocHJlZml4KSwgc3R5bGVNb2R1bGUub2YoYnVpbGRUaGVtZShgLiR7cHJlZml4fWAsIHNwZWMpKV07XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGFyaylcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRhcmtUaGVtZS5vZih0cnVlKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBhZGRzIHN0eWxlcyB0byB0aGUgYmFzZSB0aGVtZS4gTGlrZVxuICAgIHdpdGggW2B0aGVtZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XnRoZW1lKSwgdXNlIGAmYCB0byBpbmRpY2F0ZSB0aGVcbiAgICBwbGFjZSBvZiB0aGUgZWRpdG9yIHdyYXBwZXIgZWxlbWVudCB3aGVuIGRpcmVjdGx5IHRhcmdldGluZ1xuICAgIHRoYXQuIFlvdSBjYW4gYWxzbyB1c2UgYCZkYXJrYCBvciBgJmxpZ2h0YCBpbnN0ZWFkIHRvIG9ubHlcbiAgICB0YXJnZXQgZWRpdG9ycyB3aXRoIGEgZGFyayBvciBsaWdodCB0aGVtZS5cbiAgICAqL1xuICAgIHN0YXRpYyBiYXNlVGhlbWUoc3BlYykge1xuICAgICAgICByZXR1cm4gUHJlYy5sb3dlc3Qoc3R5bGVNb2R1bGUub2YoYnVpbGRUaGVtZShcIi5cIiArIGJhc2VUaGVtZUlELCBzcGVjLCBsaWdodERhcmtJRHMpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlIGFuIGVkaXRvciB2aWV3IGluc3RhbmNlIGZyb20gdGhlIHZpZXcncyBET01cbiAgICByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmaW5kRnJvbURPTShkb20pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY29udGVudCA9IGRvbS5xdWVyeVNlbGVjdG9yKFwiLmNtLWNvbnRlbnRcIik7XG4gICAgICAgIGxldCBjVmlldyA9IGNvbnRlbnQgJiYgQ29udGVudFZpZXcuZ2V0KGNvbnRlbnQpIHx8IENvbnRlbnRWaWV3LmdldChkb20pO1xuICAgICAgICByZXR1cm4gKChfYSA9IGNWaWV3ID09PSBudWxsIHx8IGNWaWV3ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjVmlldy5yb290VmlldykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZpZXcpIHx8IG51bGw7XG4gICAgfVxufVxuLyoqXG5GYWNldCB0byBhZGQgYSBbc3R5bGVcbm1vZHVsZV0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvc3R5bGUtbW9kI2RvY3VtZW50YXRpb24pIHRvXG5hbiBlZGl0b3Igdmlldy4gVGhlIHZpZXcgd2lsbCBlbnN1cmUgdGhhdCB0aGUgbW9kdWxlIGlzXG5tb3VudGVkIGluIGl0cyBbZG9jdW1lbnRcbnJvb3RdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmNvbnN0cnVjdG9yXmNvbmZpZy5yb290KS5cbiovXG5FZGl0b3JWaWV3LnN0eWxlTW9kdWxlID0gc3R5bGVNb2R1bGU7XG4vKipcbkFuIGlucHV0IGhhbmRsZXIgY2FuIG92ZXJyaWRlIHRoZSB3YXkgY2hhbmdlcyB0byB0aGUgZWRpdGFibGVcbkRPTSBjb250ZW50IGFyZSBoYW5kbGVkLiBIYW5kbGVycyBhcmUgcGFzc2VkIHRoZSBkb2N1bWVudFxucG9zaXRpb25zIGJldHdlZW4gd2hpY2ggdGhlIGNoYW5nZSB3YXMgZm91bmQsIGFuZCB0aGUgbmV3XG5jb250ZW50LiBXaGVuIG9uZSByZXR1cm5zIHRydWUsIG5vIGZ1cnRoZXIgaW5wdXQgaGFuZGxlcnMgYXJlXG5jYWxsZWQgYW5kIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHByZXZlbnRlZC5cblxuVGhlIGBpbnNlcnRgIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgZGVmYXVsdCB0cmFuc2FjdGlvblxudGhhdCB3b3VsZCBiZSBhcHBsaWVkIGZvciB0aGlzIGlucHV0LiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlblxuZGlzcGF0Y2hpbmcgdGhlIGN1c3RvbSBiZWhhdmlvciBhcyBhIHNlcGFyYXRlIHRyYW5zYWN0aW9uLlxuKi9cbkVkaXRvclZpZXcuaW5wdXRIYW5kbGVyID0gaW5wdXRIYW5kbGVyO1xuLyoqXG5UaGlzIGZhY2V0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgZnVuY3Rpb25zIHRoYXQgY3JlYXRlIGVmZmVjdHNcbnRvIGJlIGRpc3BhdGNoZWQgd2hlbiB0aGUgZWRpdG9yJ3MgZm9jdXMgc3RhdGUgY2hhbmdlcy5cbiovXG5FZGl0b3JWaWV3LmZvY3VzQ2hhbmdlRWZmZWN0ID0gZm9jdXNDaGFuZ2VFZmZlY3Q7XG4vKipcbkJ5IGRlZmF1bHQsIHRoZSBlZGl0b3IgYXNzdW1lcyBhbGwgaXRzIGNvbnRlbnQgaGFzIHRoZSBzYW1lXG5bdGV4dCBkaXJlY3Rpb25dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EaXJlY3Rpb24pLiBDb25maWd1cmUgdGhpcyB3aXRoIGEgYHRydWVgXG52YWx1ZSB0byBtYWtlIGl0IHJlYWQgdGhlIHRleHQgZGlyZWN0aW9uIG9mIGV2ZXJ5IChyZW5kZXJlZClcbmxpbmUgc2VwYXJhdGVseS5cbiovXG5FZGl0b3JWaWV3LnBlckxpbmVUZXh0RGlyZWN0aW9uID0gcGVyTGluZVRleHREaXJlY3Rpb247XG4vKipcbkFsbG93cyB5b3UgdG8gcHJvdmlkZSBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZVxubGlicmFyeSBjYXRjaGVzIGFuIGV4Y2VwdGlvbiBmcm9tIGFuIGV4dGVuc2lvbiAobW9zdGx5IGZyb20gdmlld1xucGx1Z2lucywgYnV0IG1heSBiZSB1c2VkIGJ5IG90aGVyIGV4dGVuc2lvbnMgdG8gcm91dGUgZXhjZXB0aW9uc1xuZnJvbSB1c2VyLWNvZGUtcHJvdmlkZWQgY2FsbGJhY2tzKS4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvclxuZGVidWdnaW5nIGFuZCBsb2dnaW5nLiBTZWUgW2Bsb2dFeGNlcHRpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcubG9nRXhjZXB0aW9uKS5cbiovXG5FZGl0b3JWaWV3LmV4Y2VwdGlvblNpbmsgPSBleGNlcHRpb25TaW5rO1xuLyoqXG5BIGZhY2V0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWRcbmV2ZXJ5IHRpbWUgdGhlIHZpZXcgdXBkYXRlcy5cbiovXG5FZGl0b3JWaWV3LnVwZGF0ZUxpc3RlbmVyID0gdXBkYXRlTGlzdGVuZXI7XG4vKipcbkZhY2V0IHRoYXQgY29udHJvbHMgd2hldGhlciB0aGUgZWRpdG9yIGNvbnRlbnQgRE9NIGlzIGVkaXRhYmxlLlxuV2hlbiBpdHMgaGlnaGVzdC1wcmVjZWRlbmNlIHZhbHVlIGlzIGBmYWxzZWAsIHRoZSBlbGVtZW50IHdpbGxcbm5vdCBoYXZlIGl0cyBgY29udGVudGVkaXRhYmxlYCBhdHRyaWJ1dGUgc2V0LiAoTm90ZSB0aGF0IHRoaXNcbmRvZXNuJ3QgYWZmZWN0IEFQSSBjYWxscyB0aGF0IGNoYW5nZSB0aGUgZWRpdG9yIGNvbnRlbnQsIGV2ZW5cbndoZW4gdGhvc2UgYXJlIGJvdW5kIHRvIGtleXMgb3IgYnV0dG9ucy4gU2VlIHRoZVxuW2ByZWFkT25seWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUucmVhZE9ubHkpIGZhY2V0IGZvciB0aGF0LilcbiovXG5FZGl0b3JWaWV3LmVkaXRhYmxlID0gZWRpdGFibGU7XG4vKipcbkFsbG93cyB5b3UgdG8gaW5mbHVlbmNlIHRoZSB3YXkgbW91c2Ugc2VsZWN0aW9uIGhhcHBlbnMuIFRoZVxuZnVuY3Rpb25zIGluIHRoaXMgZmFjZXQgd2lsbCBiZSBjYWxsZWQgZm9yIGEgYG1vdXNlZG93bmAgZXZlbnRcbm9uIHRoZSBlZGl0b3IsIGFuZCBjYW4gcmV0dXJuIGFuIG9iamVjdCB0aGF0IG92ZXJyaWRlcyB0aGUgd2F5IGFcbnNlbGVjdGlvbiBpcyBjb21wdXRlZCBmcm9tIHRoYXQgbW91c2UgY2xpY2sgb3IgZHJhZy5cbiovXG5FZGl0b3JWaWV3Lm1vdXNlU2VsZWN0aW9uU3R5bGUgPSBtb3VzZVNlbGVjdGlvblN0eWxlO1xuLyoqXG5GYWNldCB1c2VkIHRvIGNvbmZpZ3VyZSB3aGV0aGVyIGEgZ2l2ZW4gc2VsZWN0aW9uIGRyYWcgZXZlbnRcbnNob3VsZCBtb3ZlIG9yIGNvcHkgdGhlIHNlbGVjdGlvbi4gVGhlIGdpdmVuIHByZWRpY2F0ZSB3aWxsIGJlXG5jYWxsZWQgd2l0aCB0aGUgYG1vdXNlZG93bmAgZXZlbnQsIGFuZCBjYW4gcmV0dXJuIGB0cnVlYCB3aGVuXG50aGUgZHJhZyBzaG91bGQgbW92ZSB0aGUgY29udGVudC5cbiovXG5FZGl0b3JWaWV3LmRyYWdNb3Zlc1NlbGVjdGlvbiA9IGRyYWdNb3Zlc1NlbGVjdGlvbiQxO1xuLyoqXG5GYWNldCB1c2VkIHRvIGNvbmZpZ3VyZSB3aGV0aGVyIGEgZ2l2ZW4gc2VsZWN0aW5nIGNsaWNrIGFkZHMgYVxubmV3IHJhbmdlIHRvIHRoZSBleGlzdGluZyBzZWxlY3Rpb24gb3IgcmVwbGFjZXMgaXQgZW50aXJlbHkuIFRoZVxuZGVmYXVsdCBiZWhhdmlvciBpcyB0byBjaGVjayBgZXZlbnQubWV0YUtleWAgb24gbWFjT1MsIGFuZFxuYGV2ZW50LmN0cmxLZXlgIGVsc2V3aGVyZS5cbiovXG5FZGl0b3JWaWV3LmNsaWNrQWRkc1NlbGVjdGlvblJhbmdlID0gY2xpY2tBZGRzU2VsZWN0aW9uUmFuZ2U7XG4vKipcbkEgZmFjZXQgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIFtkZWNvcmF0aW9uc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb24pXG5hcmUgc2hvd24gaW4gdGhlIHZpZXcuIERlY29yYXRpb25zIGNhbiBiZSBwcm92aWRlZCBpbiB0d29cbndheXNcdTIwMTRkaXJlY3RseSwgb3IgdmlhIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBlZGl0b3Igdmlldy5cblxuT25seSBkZWNvcmF0aW9uIHNldHMgcHJvdmlkZWQgZGlyZWN0bHkgYXJlIGFsbG93ZWQgdG8gaW5mbHVlbmNlXG50aGUgZWRpdG9yJ3MgdmVydGljYWwgbGF5b3V0IHN0cnVjdHVyZS4gVGhlIG9uZXMgcHJvdmlkZWQgYXNcbmZ1bmN0aW9ucyBhcmUgY2FsbGVkIF9hZnRlcl8gdGhlIG5ldyB2aWV3cG9ydCBoYXMgYmVlbiBjb21wdXRlZCxcbmFuZCB0aHVzICoqbXVzdCBub3QqKiBpbnRyb2R1Y2UgYmxvY2sgd2lkZ2V0cyBvciByZXBsYWNpbmdcbmRlY29yYXRpb25zIHRoYXQgY292ZXIgbGluZSBicmVha3MuXG5cbklmIHlvdSB3YW50IGRlY29yYXRlZCByYW5nZXMgdG8gYmVoYXZlIGxpa2UgYXRvbWljIHVuaXRzIGZvclxuY3Vyc29yIG1vdGlvbiBhbmQgZGVsZXRpb24gcHVycG9zZXMsIGFsc28gcHJvdmlkZSB0aGUgcmFuZ2Ugc2V0XG5jb250YWluaW5nIHRoZSBkZWNvcmF0aW9ucyB0b1xuW2BFZGl0b3JWaWV3LmF0b21pY1Jhbmdlc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmF0b21pY1JhbmdlcykuXG4qL1xuRWRpdG9yVmlldy5kZWNvcmF0aW9ucyA9IGRlY29yYXRpb25zO1xuLyoqXG5GYWNldCB0aGF0IHdvcmtzIG11Y2ggbGlrZVxuW2BkZWNvcmF0aW9uc2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3XmRlY29yYXRpb25zKSwgYnV0IHB1dHMgaXRzXG5pbnB1dHMgYXQgdGhlIHZlcnkgYm90dG9tIG9mIHRoZSBwcmVjZWRlbmNlIHN0YWNrLCBtZWFuaW5nIG1hcmtcbmRlY29yYXRpb25zIHByb3ZpZGVkIGhlcmUgd2lsbCBvbmx5IGJlIHNwbGl0IGJ5IG90aGVyLCBwYXJ0aWFsbHlcbm92ZXJsYXBwaW5nIFxcYG91dGVyRGVjb3JhdGlvbnNcXGAgcmFuZ2VzLCBhbmQgd3JhcCBhcm91bmQgYWxsXG5yZWd1bGFyIGRlY29yYXRpb25zLiBVc2UgdGhpcyBmb3IgbWFyayBlbGVtZW50cyB0aGF0IHNob3VsZCwgYXNcbm11Y2ggYXMgcG9zc2libGUsIHJlbWFpbiBpbiBvbmUgcGllY2UuXG4qL1xuRWRpdG9yVmlldy5vdXRlckRlY29yYXRpb25zID0gb3V0ZXJEZWNvcmF0aW9ucztcbi8qKlxuVXNlZCB0byBwcm92aWRlIHJhbmdlcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGF0b21zIGFzIGZhciBhc1xuY3Vyc29yIG1vdGlvbiBpcyBjb25jZXJuZWQuIFRoaXMgY2F1c2VzIG1ldGhvZHMgbGlrZVxuW2Btb3ZlQnlDaGFyYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubW92ZUJ5Q2hhcikgYW5kXG5bYG1vdmVWZXJ0aWNhbGx5YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcubW92ZVZlcnRpY2FsbHkpIChhbmQgdGhlXG5jb21tYW5kcyBidWlsdCBvbiB0b3Agb2YgdGhlbSkgdG8gc2tpcCBhY3Jvc3Mgc3VjaCByZWdpb25zIHdoZW5cbmEgc2VsZWN0aW9uIGVuZHBvaW50IHdvdWxkIGVudGVyIHRoZW0uIFRoaXMgZG9lcyBfbm90XyBwcmV2ZW50XG5kaXJlY3QgcHJvZ3JhbW1hdGljIFtzZWxlY3Rpb25cbnVwZGF0ZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb25TcGVjLnNlbGVjdGlvbikgZnJvbSBtb3ZpbmcgaW50byBzdWNoXG5yZWdpb25zLlxuKi9cbkVkaXRvclZpZXcuYXRvbWljUmFuZ2VzID0gYXRvbWljUmFuZ2VzO1xuLyoqXG5XaGVuIHJhbmdlIGRlY29yYXRpb25zIGFkZCBhIGB1bmljb2RlLWJpZGk6IGlzb2xhdGVgIHN0eWxlLCB0aGV5XG5zaG91bGQgYWxzbyBpbmNsdWRlIGFcbltgYmlkaUlzb2xhdGVgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuTWFya0RlY29yYXRpb25TcGVjLmJpZGlJc29sYXRlKSBwcm9wZXJ0eVxuaW4gdGhlaXIgZGVjb3JhdGlvbiBzcGVjLCBhbmQgYmUgZXhwb3NlZCB0aHJvdWdoIHRoaXMgZmFjZXQsIHNvXG50aGF0IHRoZSBlZGl0b3IgY2FuIGNvbXB1dGUgdGhlIHByb3BlciB0ZXh0IG9yZGVyLiAoT3RoZXIgdmFsdWVzXG5mb3IgYHVuaWNvZGUtYmlkaWAsIGV4Y2VwdCBvZiBjb3Vyc2UgYG5vcm1hbGAsIGFyZSBub3RcbnN1cHBvcnRlZC4pXG4qL1xuRWRpdG9yVmlldy5iaWRpSXNvbGF0ZWRSYW5nZXMgPSBiaWRpSXNvbGF0ZWRSYW5nZXM7XG4vKipcbkZhY2V0IHRoYXQgYWxsb3dzIGV4dGVuc2lvbnMgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHNjcm9sbFxubWFyZ2lucyAoc3BhY2UgYXJvdW5kIHRoZSBzaWRlcyBvZiB0aGUgc2Nyb2xsaW5nIGVsZW1lbnQgdGhhdFxuc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW52aXNpYmxlKS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdGhlXG5wbHVnaW4gaW50cm9kdWNlcyBlbGVtZW50cyB0aGF0IGNvdmVyIHBhcnQgb2YgdGhhdCBlbGVtZW50IChmb3JcbmV4YW1wbGUgYSBob3Jpem9udGFsbHkgZml4ZWQgZ3V0dGVyKS5cbiovXG5FZGl0b3JWaWV3LnNjcm9sbE1hcmdpbnMgPSBzY3JvbGxNYXJnaW5zO1xuLyoqXG5UaGlzIGZhY2V0IHJlY29yZHMgd2hldGhlciBhIGRhcmsgdGhlbWUgaXMgYWN0aXZlLiBUaGUgZXh0ZW5zaW9uXG5yZXR1cm5lZCBieSBbYHRoZW1lYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXdedGhlbWUpIGF1dG9tYXRpY2FsbHlcbmluY2x1ZGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgd2hlbiB0aGUgYGRhcmtgIG9wdGlvbiBpcyBzZXQgdG9cbnRydWUuXG4qL1xuRWRpdG9yVmlldy5kYXJrVGhlbWUgPSBkYXJrVGhlbWU7XG4vKipcblByb3ZpZGVzIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgbm9uY2UgdG8gdXNlIHdoZW4gY3JlYXRpbmdcbnRoZSBzdHlsZSBzaGVldHMgZm9yIHRoZSBlZGl0b3IuIEhvbGRzIHRoZSBlbXB0eSBzdHJpbmcgd2hlbiBub1xubm9uY2UgaGFzIGJlZW4gcHJvdmlkZWQuXG4qL1xuRWRpdG9yVmlldy5jc3BOb25jZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLmxlbmd0aCA/IHZhbHVlc1swXSA6IFwiXCIgfSk7XG4vKipcbkZhY2V0IHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBET00gYXR0cmlidXRlcyBmb3IgdGhlIGVkaXRvcidzXG5lZGl0YWJsZSBET00gZWxlbWVudC5cbiovXG5FZGl0b3JWaWV3LmNvbnRlbnRBdHRyaWJ1dGVzID0gY29udGVudEF0dHJpYnV0ZXM7XG4vKipcbkZhY2V0IHRoYXQgcHJvdmlkZXMgRE9NIGF0dHJpYnV0ZXMgZm9yIHRoZSBlZGl0b3IncyBvdXRlclxuZWxlbWVudC5cbiovXG5FZGl0b3JWaWV3LmVkaXRvckF0dHJpYnV0ZXMgPSBlZGl0b3JBdHRyaWJ1dGVzO1xuLyoqXG5BbiBleHRlbnNpb24gdGhhdCBlbmFibGVzIGxpbmUgd3JhcHBpbmcgaW4gdGhlIGVkaXRvciAoYnlcbnNldHRpbmcgQ1NTIGB3aGl0ZS1zcGFjZWAgdG8gYHByZS13cmFwYCBpbiB0aGUgY29udGVudCkuXG4qL1xuRWRpdG9yVmlldy5saW5lV3JhcHBpbmcgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5vZih7IFwiY2xhc3NcIjogXCJjbS1saW5lV3JhcHBpbmdcIiB9KTtcbi8qKlxuU3RhdGUgZWZmZWN0IHVzZWQgdG8gaW5jbHVkZSBzY3JlZW4gcmVhZGVyIGFubm91bmNlbWVudHMgaW4gYVxudHJhbnNhY3Rpb24uIFRoZXNlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIERPTSBpbiBhIHZpc3VhbGx5IGhpZGRlblxuZWxlbWVudCB3aXRoIGBhcmlhLWxpdmU9XCJwb2xpdGVcImAgc2V0LCBhbmQgc2hvdWxkIGJlIHVzZWQgdG9cbmRlc2NyaWJlIGVmZmVjdHMgdGhhdCBhcmUgdmlzdWFsbHkgb2J2aW91cyBidXQgbWF5IG5vdCBiZVxubm90aWNlZCBieSBzY3JlZW4gcmVhZGVyIHVzZXJzIChzdWNoIGFzIG1vdmluZyB0byB0aGUgbmV4dFxuc2VhcmNoIG1hdGNoKS5cbiovXG5FZGl0b3JWaWV3LmFubm91bmNlID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSgpO1xuLy8gTWF4aW11bSBsaW5lIGxlbmd0aCBmb3Igd2hpY2ggd2UgY29tcHV0ZSBhY2N1cmF0ZSBiaWRpIGluZm9cbmNvbnN0IE1heEJpZGlMaW5lID0gNDA5NjtcbmNvbnN0IEJhZE1lYXN1cmUgPSB7fTtcbmNsYXNzIENhY2hlZE9yZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bywgZGlyLCBpc29sYXRlcywgZnJlc2gsIG9yZGVyKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5kaXIgPSBkaXI7XG4gICAgICAgIHRoaXMuaXNvbGF0ZXMgPSBpc29sYXRlcztcbiAgICAgICAgdGhpcy5mcmVzaCA9IGZyZXNoO1xuICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXI7XG4gICAgfVxuICAgIHN0YXRpYyB1cGRhdGUoY2FjaGUsIGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuZW1wdHkgJiYgIWNhY2hlLnNvbWUoYyA9PiBjLmZyZXNoKSlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdLCBsYXN0RGlyID0gY2FjaGUubGVuZ3RoID8gY2FjaGVbY2FjaGUubGVuZ3RoIC0gMV0uZGlyIDogRGlyZWN0aW9uLkxUUjtcbiAgICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWF4KDAsIGNhY2hlLmxlbmd0aCAtIDEwKTsgaSA8IGNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSBjYWNoZVtpXTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5kaXIgPT0gbGFzdERpciAmJiAhY2hhbmdlcy50b3VjaGVzUmFuZ2UoZW50cnkuZnJvbSwgZW50cnkudG8pKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBDYWNoZWRPcmRlcihjaGFuZ2VzLm1hcFBvcyhlbnRyeS5mcm9tLCAxKSwgY2hhbmdlcy5tYXBQb3MoZW50cnkudG8sIC0xKSwgZW50cnkuZGlyLCBlbnRyeS5pc29sYXRlcywgZmFsc2UsIGVudHJ5Lm9yZGVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBhdHRyc0Zyb21GYWNldCh2aWV3LCBmYWNldCwgYmFzZSkge1xuICAgIGZvciAobGV0IHNvdXJjZXMgPSB2aWV3LnN0YXRlLmZhY2V0KGZhY2V0KSwgaSA9IHNvdXJjZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHNvdXJjZXNbaV0sIHZhbHVlID0gdHlwZW9mIHNvdXJjZSA9PSBcImZ1bmN0aW9uXCIgPyBzb3VyY2UodmlldykgOiBzb3VyY2U7XG4gICAgICAgIGlmICh2YWx1ZSlcbiAgICAgICAgICAgIGNvbWJpbmVBdHRycyh2YWx1ZSwgYmFzZSk7XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xufVxuXG5jb25zdCBjdXJyZW50UGxhdGZvcm0gPSBicm93c2VyLm1hYyA/IFwibWFjXCIgOiBicm93c2VyLndpbmRvd3MgPyBcIndpblwiIDogYnJvd3Nlci5saW51eCA/IFwibGludXhcIiA6IFwia2V5XCI7XG5mdW5jdGlvbiBub3JtYWxpemVLZXlOYW1lKG5hbWUsIHBsYXRmb3JtKSB7XG4gICAgY29uc3QgcGFydHMgPSBuYW1lLnNwbGl0KC8tKD8hJCkvKTtcbiAgICBsZXQgcmVzdWx0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKHJlc3VsdCA9PSBcIlNwYWNlXCIpXG4gICAgICAgIHJlc3VsdCA9IFwiIFwiO1xuICAgIGxldCBhbHQsIGN0cmwsIHNoaWZ0LCBtZXRhO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIGNvbnN0IG1vZCA9IHBhcnRzW2ldO1xuICAgICAgICBpZiAoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgbWV0YSA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eYShsdCk/JC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIGFsdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eKGN8Y3RybHxjb250cm9sKSQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBjdHJsID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL15zKGhpZnQpPyQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBzaGlmdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9ebW9kJC9pLnRlc3QobW9kKSkge1xuICAgICAgICAgICAgaWYgKHBsYXRmb3JtID09IFwibWFjXCIpXG4gICAgICAgICAgICAgICAgbWV0YSA9IHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY3RybCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIG1vZGlmaWVyIG5hbWU6IFwiICsgbW9kKTtcbiAgICB9XG4gICAgaWYgKGFsdClcbiAgICAgICAgcmVzdWx0ID0gXCJBbHQtXCIgKyByZXN1bHQ7XG4gICAgaWYgKGN0cmwpXG4gICAgICAgIHJlc3VsdCA9IFwiQ3RybC1cIiArIHJlc3VsdDtcbiAgICBpZiAobWV0YSlcbiAgICAgICAgcmVzdWx0ID0gXCJNZXRhLVwiICsgcmVzdWx0O1xuICAgIGlmIChzaGlmdClcbiAgICAgICAgcmVzdWx0ID0gXCJTaGlmdC1cIiArIHJlc3VsdDtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCBzaGlmdCkge1xuICAgIGlmIChldmVudC5hbHRLZXkpXG4gICAgICAgIG5hbWUgPSBcIkFsdC1cIiArIG5hbWU7XG4gICAgaWYgKGV2ZW50LmN0cmxLZXkpXG4gICAgICAgIG5hbWUgPSBcIkN0cmwtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5tZXRhS2V5KVxuICAgICAgICBuYW1lID0gXCJNZXRhLVwiICsgbmFtZTtcbiAgICBpZiAoc2hpZnQgIT09IGZhbHNlICYmIGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgICBuYW1lID0gXCJTaGlmdC1cIiArIG5hbWU7XG4gICAgcmV0dXJuIG5hbWU7XG59XG5jb25zdCBoYW5kbGVLZXlFdmVudHMgPSAvKkBfX1BVUkVfXyovUHJlYy5kZWZhdWx0KC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LmRvbUV2ZW50SGFuZGxlcnMoe1xuICAgIGtleWRvd24oZXZlbnQsIHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHJ1bkhhbmRsZXJzKGdldEtleW1hcCh2aWV3LnN0YXRlKSwgZXZlbnQsIHZpZXcsIFwiZWRpdG9yXCIpO1xuICAgIH1cbn0pKTtcbi8qKlxuRmFjZXQgdXNlZCBmb3IgcmVnaXN0ZXJpbmcga2V5bWFwcy5cblxuWW91IGNhbiBhZGQgbXVsdGlwbGUga2V5bWFwcyB0byBhbiBlZGl0b3IuIFRoZWlyIHByaW9yaXRpZXNcbmRldGVybWluZSB0aGVpciBwcmVjZWRlbmNlICh0aGUgb25lcyBzcGVjaWZpZWQgZWFybHkgb3Igd2l0aCBoaWdoXG5wcmlvcml0eSBnZXQgY2hlY2tlZCBmaXJzdCkuIFdoZW4gYSBoYW5kbGVyIGhhcyByZXR1cm5lZCBgdHJ1ZWBcbmZvciBhIGdpdmVuIGtleSwgbm8gZnVydGhlciBoYW5kbGVycyBhcmUgY2FsbGVkLlxuKi9cbmNvbnN0IGtleW1hcCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBlbmFibGVzOiBoYW5kbGVLZXlFdmVudHMgfSk7XG5jb25zdCBLZXltYXBzID0gLypAX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4vLyBUaGlzIGlzIGhpZGRlbiBiZWhpbmQgYW4gaW5kaXJlY3Rpb24sIHJhdGhlciB0aGFuIGRpcmVjdGx5IGNvbXB1dGVkXG4vLyBieSB0aGUgZmFjZXQsIHRvIGtlZXAgaW50ZXJuYWwgdHlwZXMgb3V0IG9mIHRoZSBmYWNldCdzIHR5cGUuXG5mdW5jdGlvbiBnZXRLZXltYXAoc3RhdGUpIHtcbiAgICBsZXQgYmluZGluZ3MgPSBzdGF0ZS5mYWNldChrZXltYXApO1xuICAgIGxldCBtYXAgPSBLZXltYXBzLmdldChiaW5kaW5ncyk7XG4gICAgaWYgKCFtYXApXG4gICAgICAgIEtleW1hcHMuc2V0KGJpbmRpbmdzLCBtYXAgPSBidWlsZEtleW1hcChiaW5kaW5ncy5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSkpKTtcbiAgICByZXR1cm4gbWFwO1xufVxuLyoqXG5SdW4gdGhlIGtleSBoYW5kbGVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIHNjb3BlLiBUaGUgZXZlbnRcbm9iamVjdCBzaG91bGQgYmUgYSBgXCJrZXlkb3duXCJgIGV2ZW50LiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZVxuaGFuZGxlcnMgaGFuZGxlZCBpdC5cbiovXG5mdW5jdGlvbiBydW5TY29wZUhhbmRsZXJzKHZpZXcsIGV2ZW50LCBzY29wZSkge1xuICAgIHJldHVybiBydW5IYW5kbGVycyhnZXRLZXltYXAodmlldy5zdGF0ZSksIGV2ZW50LCB2aWV3LCBzY29wZSk7XG59XG5sZXQgc3RvcmVkUHJlZml4ID0gbnVsbDtcbmNvbnN0IFByZWZpeFRpbWVvdXQgPSA0MDAwO1xuZnVuY3Rpb24gYnVpbGRLZXltYXAoYmluZGluZ3MsIHBsYXRmb3JtID0gY3VycmVudFBsYXRmb3JtKSB7XG4gICAgbGV0IGJvdW5kID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgaXNQcmVmaXggPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjaGVja1ByZWZpeCA9IChuYW1lLCBpcykgPT4ge1xuICAgICAgICBsZXQgY3VycmVudCA9IGlzUHJlZml4W25hbWVdO1xuICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKVxuICAgICAgICAgICAgaXNQcmVmaXhbbmFtZV0gPSBpcztcbiAgICAgICAgZWxzZSBpZiAoY3VycmVudCAhPSBpcylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIktleSBiaW5kaW5nIFwiICsgbmFtZSArIFwiIGlzIHVzZWQgYm90aCBhcyBhIHJlZ3VsYXIgYmluZGluZyBhbmQgYXMgYSBtdWx0aS1zdHJva2UgcHJlZml4XCIpO1xuICAgIH07XG4gICAgbGV0IGFkZCA9IChzY29wZSwga2V5LCBjb21tYW5kLCBwcmV2ZW50RGVmYXVsdCwgc3RvcFByb3BhZ2F0aW9uKSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGxldCBzY29wZU9iaiA9IGJvdW5kW3Njb3BlXSB8fCAoYm91bmRbc2NvcGVdID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgIGxldCBwYXJ0cyA9IGtleS5zcGxpdCgvICg/ISQpLykubWFwKGsgPT4gbm9ybWFsaXplS2V5TmFtZShrLCBwbGF0Zm9ybSkpO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcHJlZml4ID0gcGFydHMuc2xpY2UoMCwgaSkuam9pbihcIiBcIik7XG4gICAgICAgICAgICBjaGVja1ByZWZpeChwcmVmaXgsIHRydWUpO1xuICAgICAgICAgICAgaWYgKCFzY29wZU9ialtwcmVmaXhdKVxuICAgICAgICAgICAgICAgIHNjb3BlT2JqW3ByZWZpeF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzdG9wUHJvcGFnYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBydW46IFsodmlldykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvdXJPYmogPSBzdG9yZWRQcmVmaXggPSB7IHZpZXcsIHByZWZpeCwgc2NvcGUgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgaWYgKHN0b3JlZFByZWZpeCA9PSBvdXJPYmopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZFByZWZpeCA9IG51bGw7IH0sIFByZWZpeFRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBmdWxsID0gcGFydHMuam9pbihcIiBcIik7XG4gICAgICAgIGNoZWNrUHJlZml4KGZ1bGwsIGZhbHNlKTtcbiAgICAgICAgbGV0IGJpbmRpbmcgPSBzY29wZU9ialtmdWxsXSB8fCAoc2NvcGVPYmpbZnVsbF0gPSB7XG4gICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgICBzdG9wUHJvcGFnYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgcnVuOiAoKF9iID0gKF9hID0gc2NvcGVPYmouX2FueSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJ1bikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnNsaWNlKCkpIHx8IFtdXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY29tbWFuZClcbiAgICAgICAgICAgIGJpbmRpbmcucnVuLnB1c2goY29tbWFuZCk7XG4gICAgICAgIGlmIChwcmV2ZW50RGVmYXVsdClcbiAgICAgICAgICAgIGJpbmRpbmcucHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgICAgICBpZiAoc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgYmluZGluZy5zdG9wUHJvcGFnYXRpb24gPSB0cnVlO1xuICAgIH07XG4gICAgZm9yIChsZXQgYiBvZiBiaW5kaW5ncykge1xuICAgICAgICBsZXQgc2NvcGVzID0gYi5zY29wZSA/IGIuc2NvcGUuc3BsaXQoXCIgXCIpIDogW1wiZWRpdG9yXCJdO1xuICAgICAgICBpZiAoYi5hbnkpXG4gICAgICAgICAgICBmb3IgKGxldCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2NvcGVPYmogPSBib3VuZFtzY29wZV0gfHwgKGJvdW5kW3Njb3BlXSA9IE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAgICAgICAgICAgIGlmICghc2NvcGVPYmouX2FueSlcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVPYmouX2FueSA9IHsgcHJldmVudERlZmF1bHQ6IGZhbHNlLCBzdG9wUHJvcGFnYXRpb246IGZhbHNlLCBydW46IFtdIH07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHNjb3BlT2JqKVxuICAgICAgICAgICAgICAgICAgICBzY29wZU9ialtrZXldLnJ1bi5wdXNoKGIuYW55KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgbGV0IG5hbWUgPSBiW3BsYXRmb3JtXSB8fCBiLmtleTtcbiAgICAgICAgaWYgKCFuYW1lKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGZvciAobGV0IHNjb3BlIG9mIHNjb3Blcykge1xuICAgICAgICAgICAgYWRkKHNjb3BlLCBuYW1lLCBiLnJ1biwgYi5wcmV2ZW50RGVmYXVsdCwgYi5zdG9wUHJvcGFnYXRpb24pO1xuICAgICAgICAgICAgaWYgKGIuc2hpZnQpXG4gICAgICAgICAgICAgICAgYWRkKHNjb3BlLCBcIlNoaWZ0LVwiICsgbmFtZSwgYi5zaGlmdCwgYi5wcmV2ZW50RGVmYXVsdCwgYi5zdG9wUHJvcGFnYXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBib3VuZDtcbn1cbmZ1bmN0aW9uIHJ1bkhhbmRsZXJzKG1hcCwgZXZlbnQsIHZpZXcsIHNjb3BlKSB7XG4gICAgbGV0IG5hbWUgPSBrZXlOYW1lKGV2ZW50KTtcbiAgICBsZXQgY2hhckNvZGUgPSBjb2RlUG9pbnRBdChuYW1lLCAwKSwgaXNDaGFyID0gY29kZVBvaW50U2l6ZShjaGFyQ29kZSkgPT0gbmFtZS5sZW5ndGggJiYgbmFtZSAhPSBcIiBcIjtcbiAgICBsZXQgcHJlZml4ID0gXCJcIiwgaGFuZGxlZCA9IGZhbHNlLCBwcmV2ZW50ZWQgPSBmYWxzZSwgc3RvcFByb3BhZ2F0aW9uID0gZmFsc2U7XG4gICAgaWYgKHN0b3JlZFByZWZpeCAmJiBzdG9yZWRQcmVmaXgudmlldyA9PSB2aWV3ICYmIHN0b3JlZFByZWZpeC5zY29wZSA9PSBzY29wZSkge1xuICAgICAgICBwcmVmaXggPSBzdG9yZWRQcmVmaXgucHJlZml4ICsgXCIgXCI7XG4gICAgICAgIGlmIChtb2RpZmllckNvZGVzLmluZGV4T2YoZXZlbnQua2V5Q29kZSkgPCAwKSB7XG4gICAgICAgICAgICBwcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgICAgc3RvcmVkUHJlZml4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgcmFuID0gbmV3IFNldDtcbiAgICBsZXQgcnVuRm9yID0gKGJpbmRpbmcpID0+IHtcbiAgICAgICAgaWYgKGJpbmRpbmcpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGNtZCBvZiBiaW5kaW5nLnJ1bilcbiAgICAgICAgICAgICAgICBpZiAoIXJhbi5oYXMoY21kKSkge1xuICAgICAgICAgICAgICAgICAgICByYW4uYWRkKGNtZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjbWQodmlldywgZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZy5zdG9wUHJvcGFnYXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJpbmRpbmcucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYmluZGluZy5zdG9wUHJvcGFnYXRpb24pXG4gICAgICAgICAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgcHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBsZXQgc2NvcGVPYmogPSBtYXBbc2NvcGVdLCBiYXNlTmFtZSwgc2hpZnROYW1lO1xuICAgIGlmIChzY29wZU9iaikge1xuICAgICAgICBpZiAocnVuRm9yKHNjb3BlT2JqW3ByZWZpeCArIG1vZGlmaWVycyhuYW1lLCBldmVudCwgIWlzQ2hhcildKSkge1xuICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDaGFyICYmIChldmVudC5hbHRLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJlxuICAgICAgICAgICAgLy8gQ3RybC1BbHQgbWF5IGJlIHVzZWQgZm9yIEFsdEdyIG9uIFdpbmRvd3NcbiAgICAgICAgICAgICEoYnJvd3Nlci53aW5kb3dzICYmIGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5KSAmJlxuICAgICAgICAgICAgKGJhc2VOYW1lID0gYmFzZVtldmVudC5rZXlDb2RlXSkgJiYgYmFzZU5hbWUgIT0gbmFtZSkge1xuICAgICAgICAgICAgaWYgKHJ1bkZvcihzY29wZU9ialtwcmVmaXggKyBtb2RpZmllcnMoYmFzZU5hbWUsIGV2ZW50LCB0cnVlKV0pKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChldmVudC5zaGlmdEtleSAmJiAoc2hpZnROYW1lID0gc2hpZnRbZXZlbnQua2V5Q29kZV0pICE9IG5hbWUgJiYgc2hpZnROYW1lICE9IGJhc2VOYW1lICYmXG4gICAgICAgICAgICAgICAgcnVuRm9yKHNjb3BlT2JqW3ByZWZpeCArIG1vZGlmaWVycyhzaGlmdE5hbWUsIGV2ZW50LCBmYWxzZSldKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQ2hhciAmJiBldmVudC5zaGlmdEtleSAmJlxuICAgICAgICAgICAgcnVuRm9yKHNjb3BlT2JqW3ByZWZpeCArIG1vZGlmaWVycyhuYW1lLCBldmVudCwgdHJ1ZSldKSkge1xuICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFoYW5kbGVkICYmIHJ1bkZvcihzY29wZU9iai5fYW55KSlcbiAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAocHJldmVudGVkKVxuICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICBpZiAoaGFuZGxlZCAmJiBzdG9wUHJvcGFnYXRpb24pXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHJldHVybiBoYW5kbGVkO1xufVxuXG4vKipcbkltcGxlbWVudGF0aW9uIG9mIFtgTGF5ZXJNYXJrZXJgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuTGF5ZXJNYXJrZXIpIHRoYXQgY3JlYXRlc1xuYSByZWN0YW5nbGUgYXQgYSBnaXZlbiBzZXQgb2YgY29vcmRpbmF0ZXMuXG4qL1xuY2xhc3MgUmVjdGFuZ2xlTWFya2VyIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrZXIgd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgYW5kIGRpbWVuc2lvbnMuIElmIGB3aWR0aGBcbiAgICBpcyBudWxsLCB0aGUgRE9NIGVsZW1lbnQgd2lsbCBnZXQgbm8gd2lkdGggc3R5bGUuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGFzc05hbWUsIFxuICAgIC8qKlxuICAgIFRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBtYXJrZXIgKGluIHBpeGVscywgZG9jdW1lbnQtcmVsYXRpdmUpLlxuICAgICovXG4gICAgbGVmdCwgXG4gICAgLyoqXG4gICAgVGhlIHRvcCBwb3NpdGlvbiBvZiB0aGUgbWFya2VyLlxuICAgICovXG4gICAgdG9wLCBcbiAgICAvKipcbiAgICBUaGUgd2lkdGggb2YgdGhlIG1hcmtlciwgb3IgbnVsbCBpZiBpdCBzaG91bGRuJ3QgZ2V0IGEgd2lkdGggYXNzaWduZWQuXG4gICAgKi9cbiAgICB3aWR0aCwgXG4gICAgLyoqXG4gICAgVGhlIGhlaWdodCBvZiB0aGUgbWFya2VyLlxuICAgICovXG4gICAgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB9XG4gICAgZHJhdygpIHtcbiAgICAgICAgbGV0IGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGVsdC5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5hZGp1c3QoZWx0KTtcbiAgICAgICAgcmV0dXJuIGVsdDtcbiAgICB9XG4gICAgdXBkYXRlKGVsdCwgcHJldikge1xuICAgICAgICBpZiAocHJldi5jbGFzc05hbWUgIT0gdGhpcy5jbGFzc05hbWUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuYWRqdXN0KGVsdCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhZGp1c3QoZWx0KSB7XG4gICAgICAgIGVsdC5zdHlsZS5sZWZ0ID0gdGhpcy5sZWZ0ICsgXCJweFwiO1xuICAgICAgICBlbHQuc3R5bGUudG9wID0gdGhpcy50b3AgKyBcInB4XCI7XG4gICAgICAgIGlmICh0aGlzLndpZHRoICE9IG51bGwpXG4gICAgICAgICAgICBlbHQuc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgXCJweFwiO1xuICAgICAgICBlbHQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBcInB4XCI7XG4gICAgfVxuICAgIGVxKHApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVmdCA9PSBwLmxlZnQgJiYgdGhpcy50b3AgPT0gcC50b3AgJiYgdGhpcy53aWR0aCA9PSBwLndpZHRoICYmIHRoaXMuaGVpZ2h0ID09IHAuaGVpZ2h0ICYmXG4gICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9PSBwLmNsYXNzTmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IG9mIHJlY3RhbmdsZXMgZm9yIHRoZSBnaXZlbiBzZWxlY3Rpb24gcmFuZ2UsXG4gICAgYXNzaWduaW5nIHRoZW0gdGhlY2xhc3NgY2xhc3NOYW1lYC4gV2lsbCBjcmVhdGUgYSBzaW5nbGVcbiAgICByZWN0YW5nbGUgZm9yIGVtcHR5IHJhbmdlcywgYW5kIGEgc2V0IG9mIHNlbGVjdGlvbi1zdHlsZVxuICAgIHJlY3RhbmdsZXMgY292ZXJpbmcgdGhlIHJhbmdlJ3MgY29udGVudCAoaW4gYSBiaWRpLWF3YXJlXG4gICAgd2F5KSBmb3Igbm9uLWVtcHR5IG9uZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgZm9yUmFuZ2UodmlldywgY2xhc3NOYW1lLCByYW5nZSkge1xuICAgICAgICBpZiAocmFuZ2UuZW1wdHkpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSB2aWV3LmNvb3Jkc0F0UG9zKHJhbmdlLmhlYWQsIHJhbmdlLmFzc29jIHx8IDEpO1xuICAgICAgICAgICAgaWYgKCFwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgbGV0IGJhc2UgPSBnZXRCYXNlKHZpZXcpO1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgUmVjdGFuZ2xlTWFya2VyKGNsYXNzTmFtZSwgcG9zLmxlZnQgLSBiYXNlLmxlZnQsIHBvcy50b3AgLSBiYXNlLnRvcCwgbnVsbCwgcG9zLmJvdHRvbSAtIHBvcy50b3ApXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZWN0YW5nbGVzRm9yUmFuZ2UodmlldywgY2xhc3NOYW1lLCByYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRCYXNlKHZpZXcpIHtcbiAgICBsZXQgcmVjdCA9IHZpZXcuc2Nyb2xsRE9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGxldCBsZWZ0ID0gdmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFIgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0IC0gdmlldy5zY3JvbGxET00uY2xpZW50V2lkdGggKiB2aWV3LnNjYWxlWDtcbiAgICByZXR1cm4geyBsZWZ0OiBsZWZ0IC0gdmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdCAqIHZpZXcuc2NhbGVYLCB0b3A6IHJlY3QudG9wIC0gdmlldy5zY3JvbGxET00uc2Nyb2xsVG9wICogdmlldy5zY2FsZVkgfTtcbn1cbmZ1bmN0aW9uIHdyYXBwZWRMaW5lKHZpZXcsIHBvcywgaW5zaWRlKSB7XG4gICAgbGV0IHJhbmdlID0gRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihwb3MpO1xuICAgIHJldHVybiB7IGZyb206IE1hdGgubWF4KGluc2lkZS5mcm9tLCB2aWV3Lm1vdmVUb0xpbmVCb3VuZGFyeShyYW5nZSwgZmFsc2UsIHRydWUpLmZyb20pLFxuICAgICAgICB0bzogTWF0aC5taW4oaW5zaWRlLnRvLCB2aWV3Lm1vdmVUb0xpbmVCb3VuZGFyeShyYW5nZSwgdHJ1ZSwgdHJ1ZSkuZnJvbSksXG4gICAgICAgIHR5cGU6IEJsb2NrVHlwZS5UZXh0IH07XG59XG5mdW5jdGlvbiByZWN0YW5nbGVzRm9yUmFuZ2UodmlldywgY2xhc3NOYW1lLCByYW5nZSkge1xuICAgIGlmIChyYW5nZS50byA8PSB2aWV3LnZpZXdwb3J0LmZyb20gfHwgcmFuZ2UuZnJvbSA+PSB2aWV3LnZpZXdwb3J0LnRvKVxuICAgICAgICByZXR1cm4gW107XG4gICAgbGV0IGZyb20gPSBNYXRoLm1heChyYW5nZS5mcm9tLCB2aWV3LnZpZXdwb3J0LmZyb20pLCB0byA9IE1hdGgubWluKHJhbmdlLnRvLCB2aWV3LnZpZXdwb3J0LnRvKTtcbiAgICBsZXQgbHRyID0gdmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFI7XG4gICAgbGV0IGNvbnRlbnQgPSB2aWV3LmNvbnRlbnRET00sIGNvbnRlbnRSZWN0ID0gY29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgYmFzZSA9IGdldEJhc2Uodmlldyk7XG4gICAgbGV0IGxpbmVFbHQgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoXCIuY20tbGluZVwiKSwgbGluZVN0eWxlID0gbGluZUVsdCAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShsaW5lRWx0KTtcbiAgICBsZXQgbGVmdFNpZGUgPSBjb250ZW50UmVjdC5sZWZ0ICtcbiAgICAgICAgKGxpbmVTdHlsZSA/IHBhcnNlSW50KGxpbmVTdHlsZS5wYWRkaW5nTGVmdCkgKyBNYXRoLm1pbigwLCBwYXJzZUludChsaW5lU3R5bGUudGV4dEluZGVudCkpIDogMCk7XG4gICAgbGV0IHJpZ2h0U2lkZSA9IGNvbnRlbnRSZWN0LnJpZ2h0IC0gKGxpbmVTdHlsZSA/IHBhcnNlSW50KGxpbmVTdHlsZS5wYWRkaW5nUmlnaHQpIDogMCk7XG4gICAgbGV0IHN0YXJ0QmxvY2sgPSBibG9ja0F0KHZpZXcsIGZyb20pLCBlbmRCbG9jayA9IGJsb2NrQXQodmlldywgdG8pO1xuICAgIGxldCB2aXN1YWxTdGFydCA9IHN0YXJ0QmxvY2sudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCA/IHN0YXJ0QmxvY2sgOiBudWxsO1xuICAgIGxldCB2aXN1YWxFbmQgPSBlbmRCbG9jay50eXBlID09IEJsb2NrVHlwZS5UZXh0ID8gZW5kQmxvY2sgOiBudWxsO1xuICAgIGlmICh2aXN1YWxTdGFydCAmJiAodmlldy5saW5lV3JhcHBpbmcgfHwgc3RhcnRCbG9jay53aWRnZXRMaW5lQnJlYWtzKSlcbiAgICAgICAgdmlzdWFsU3RhcnQgPSB3cmFwcGVkTGluZSh2aWV3LCBmcm9tLCB2aXN1YWxTdGFydCk7XG4gICAgaWYgKHZpc3VhbEVuZCAmJiAodmlldy5saW5lV3JhcHBpbmcgfHwgZW5kQmxvY2sud2lkZ2V0TGluZUJyZWFrcykpXG4gICAgICAgIHZpc3VhbEVuZCA9IHdyYXBwZWRMaW5lKHZpZXcsIHRvLCB2aXN1YWxFbmQpO1xuICAgIGlmICh2aXN1YWxTdGFydCAmJiB2aXN1YWxFbmQgJiYgdmlzdWFsU3RhcnQuZnJvbSA9PSB2aXN1YWxFbmQuZnJvbSkge1xuICAgICAgICByZXR1cm4gcGllY2VzKGRyYXdGb3JMaW5lKHJhbmdlLmZyb20sIHJhbmdlLnRvLCB2aXN1YWxTdGFydCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHRvcCA9IHZpc3VhbFN0YXJ0ID8gZHJhd0ZvckxpbmUocmFuZ2UuZnJvbSwgbnVsbCwgdmlzdWFsU3RhcnQpIDogZHJhd0ZvcldpZGdldChzdGFydEJsb2NrLCBmYWxzZSk7XG4gICAgICAgIGxldCBib3R0b20gPSB2aXN1YWxFbmQgPyBkcmF3Rm9yTGluZShudWxsLCByYW5nZS50bywgdmlzdWFsRW5kKSA6IGRyYXdGb3JXaWRnZXQoZW5kQmxvY2ssIHRydWUpO1xuICAgICAgICBsZXQgYmV0d2VlbiA9IFtdO1xuICAgICAgICBpZiAoKHZpc3VhbFN0YXJ0IHx8IHN0YXJ0QmxvY2spLnRvIDwgKHZpc3VhbEVuZCB8fCBlbmRCbG9jaykuZnJvbSAtICh2aXN1YWxTdGFydCAmJiB2aXN1YWxFbmQgPyAxIDogMCkgfHxcbiAgICAgICAgICAgIHN0YXJ0QmxvY2sud2lkZ2V0TGluZUJyZWFrcyA+IDEgJiYgdG9wLmJvdHRvbSArIHZpZXcuZGVmYXVsdExpbmVIZWlnaHQgLyAyIDwgYm90dG9tLnRvcClcbiAgICAgICAgICAgIGJldHdlZW4ucHVzaChwaWVjZShsZWZ0U2lkZSwgdG9wLmJvdHRvbSwgcmlnaHRTaWRlLCBib3R0b20udG9wKSk7XG4gICAgICAgIGVsc2UgaWYgKHRvcC5ib3R0b20gPCBib3R0b20udG9wICYmIHZpZXcuZWxlbWVudEF0SGVpZ2h0KCh0b3AuYm90dG9tICsgYm90dG9tLnRvcCkgLyAyKS50eXBlID09IEJsb2NrVHlwZS5UZXh0KVxuICAgICAgICAgICAgdG9wLmJvdHRvbSA9IGJvdHRvbS50b3AgPSAodG9wLmJvdHRvbSArIGJvdHRvbS50b3ApIC8gMjtcbiAgICAgICAgcmV0dXJuIHBpZWNlcyh0b3ApLmNvbmNhdChiZXR3ZWVuKS5jb25jYXQocGllY2VzKGJvdHRvbSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwaWVjZShsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWN0YW5nbGVNYXJrZXIoY2xhc3NOYW1lLCBsZWZ0IC0gYmFzZS5sZWZ0LCB0b3AgLSBiYXNlLnRvcCAtIDAuMDEgLyogQy5FcHNpbG9uICovLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCArIDAuMDEgLyogQy5FcHNpbG9uICovKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGllY2VzKHsgdG9wLCBib3R0b20sIGhvcml6b250YWwgfSkge1xuICAgICAgICBsZXQgcGllY2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaG9yaXpvbnRhbC5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgICAgIHBpZWNlcy5wdXNoKHBpZWNlKGhvcml6b250YWxbaV0sIHRvcCwgaG9yaXpvbnRhbFtpICsgMV0sIGJvdHRvbSkpO1xuICAgICAgICByZXR1cm4gcGllY2VzO1xuICAgIH1cbiAgICAvLyBHZXRzIHBhc3NlZCBmcm9tL3RvIGluIGxpbmUtbG9jYWwgcG9zaXRpb25zXG4gICAgZnVuY3Rpb24gZHJhd0ZvckxpbmUoZnJvbSwgdG8sIGxpbmUpIHtcbiAgICAgICAgbGV0IHRvcCA9IDFlOSwgYm90dG9tID0gLTFlOSwgaG9yaXpvbnRhbCA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGRTcGFuKGZyb20sIGZyb21PcGVuLCB0bywgdG9PcGVuLCBkaXIpIHtcbiAgICAgICAgICAgIC8vIFBhc3NpbmcgMi8tMiBpcyBhIGtsdWRnZSB0byBmb3JjZSB0aGUgdmlldyB0byByZXR1cm5cbiAgICAgICAgICAgIC8vIGNvb3JkaW5hdGVzIG9uIHRoZSBwcm9wZXIgc2lkZSBvZiBibG9jayB3aWRnZXRzLCBzaW5jZVxuICAgICAgICAgICAgLy8gbm9ybWFsaXppbmcgdGhlIHNpZGUgdGhlcmUsIHRob3VnaCBhcHByb3ByaWF0ZSBmb3IgbW9zdFxuICAgICAgICAgICAgLy8gY29vcmRzQXRQb3MgcXVlcmllcywgd291bGQgYnJlYWsgc2VsZWN0aW9uIGRyYXdpbmcuXG4gICAgICAgICAgICBsZXQgZnJvbUNvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3MoZnJvbSwgKGZyb20gPT0gbGluZS50byA/IC0yIDogMikpO1xuICAgICAgICAgICAgbGV0IHRvQ29vcmRzID0gdmlldy5jb29yZHNBdFBvcyh0bywgKHRvID09IGxpbmUuZnJvbSA/IDIgOiAtMikpO1xuICAgICAgICAgICAgaWYgKCFmcm9tQ29vcmRzIHx8ICF0b0Nvb3JkcylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0b3AgPSBNYXRoLm1pbihmcm9tQ29vcmRzLnRvcCwgdG9Db29yZHMudG9wLCB0b3ApO1xuICAgICAgICAgICAgYm90dG9tID0gTWF0aC5tYXgoZnJvbUNvb3Jkcy5ib3R0b20sIHRvQ29vcmRzLmJvdHRvbSwgYm90dG9tKTtcbiAgICAgICAgICAgIGlmIChkaXIgPT0gRGlyZWN0aW9uLkxUUilcbiAgICAgICAgICAgICAgICBob3Jpem9udGFsLnB1c2gobHRyICYmIGZyb21PcGVuID8gbGVmdFNpZGUgOiBmcm9tQ29vcmRzLmxlZnQsIGx0ciAmJiB0b09wZW4gPyByaWdodFNpZGUgOiB0b0Nvb3Jkcy5yaWdodCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbC5wdXNoKCFsdHIgJiYgdG9PcGVuID8gbGVmdFNpZGUgOiB0b0Nvb3Jkcy5sZWZ0LCAhbHRyICYmIGZyb21PcGVuID8gcmlnaHRTaWRlIDogZnJvbUNvb3Jkcy5yaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0ID0gZnJvbSAhPT0gbnVsbCAmJiBmcm9tICE9PSB2b2lkIDAgPyBmcm9tIDogbGluZS5mcm9tLCBlbmQgPSB0byAhPT0gbnVsbCAmJiB0byAhPT0gdm9pZCAwID8gdG8gOiBsaW5lLnRvO1xuICAgICAgICAvLyBTcGxpdCB0aGUgcmFuZ2UgYnkgdmlzaWJsZSByYW5nZSBhbmQgZG9jdW1lbnQgbGluZVxuICAgICAgICBmb3IgKGxldCByIG9mIHZpZXcudmlzaWJsZVJhbmdlcylcbiAgICAgICAgICAgIGlmIChyLnRvID4gc3RhcnQgJiYgci5mcm9tIDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcG9zID0gTWF0aC5tYXgoci5mcm9tLCBzdGFydCksIGVuZFBvcyA9IE1hdGgubWluKHIudG8sIGVuZCk7Oykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG9jTGluZSA9IHZpZXcuc3RhdGUuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzcGFuIG9mIHZpZXcuYmlkaVNwYW5zKGRvY0xpbmUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BhbkZyb20gPSBzcGFuLmZyb20gKyBkb2NMaW5lLmZyb20sIHNwYW5UbyA9IHNwYW4udG8gKyBkb2NMaW5lLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbkZyb20gPj0gZW5kUG9zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5UbyA+IHBvcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTcGFuKE1hdGgubWF4KHNwYW5Gcm9tLCBwb3MpLCBmcm9tID09IG51bGwgJiYgc3BhbkZyb20gPD0gc3RhcnQsIE1hdGgubWluKHNwYW5UbywgZW5kUG9zKSwgdG8gPT0gbnVsbCAmJiBzcGFuVG8gPj0gZW5kLCBzcGFuLmRpcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcG9zID0gZG9jTGluZS50byArIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gZW5kUG9zKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBpZiAoaG9yaXpvbnRhbC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIGFkZFNwYW4oc3RhcnQsIGZyb20gPT0gbnVsbCwgZW5kLCB0byA9PSBudWxsLCB2aWV3LnRleHREaXJlY3Rpb24pO1xuICAgICAgICByZXR1cm4geyB0b3AsIGJvdHRvbSwgaG9yaXpvbnRhbCB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBkcmF3Rm9yV2lkZ2V0KGJsb2NrLCB0b3ApIHtcbiAgICAgICAgbGV0IHkgPSBjb250ZW50UmVjdC50b3AgKyAodG9wID8gYmxvY2sudG9wIDogYmxvY2suYm90dG9tKTtcbiAgICAgICAgcmV0dXJuIHsgdG9wOiB5LCBib3R0b206IHksIGhvcml6b250YWw6IFtdIH07XG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZU1hcmtlcihhLCBiKSB7XG4gICAgcmV0dXJuIGEuY29uc3RydWN0b3IgPT0gYi5jb25zdHJ1Y3RvciAmJiBhLmVxKGIpO1xufVxuY2xhc3MgTGF5ZXJWaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBsYXllcikge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmxheWVyID0gbGF5ZXI7XG4gICAgICAgIHRoaXMuZHJhd24gPSBbXTtcbiAgICAgICAgdGhpcy5zY2FsZVggPSAxO1xuICAgICAgICB0aGlzLnNjYWxlWSA9IDE7XG4gICAgICAgIHRoaXMubWVhc3VyZVJlcSA9IHsgcmVhZDogdGhpcy5tZWFzdXJlLmJpbmQodGhpcyksIHdyaXRlOiB0aGlzLmRyYXcuYmluZCh0aGlzKSB9O1xuICAgICAgICB0aGlzLmRvbSA9IHZpZXcuc2Nyb2xsRE9NLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tbGF5ZXJcIik7XG4gICAgICAgIGlmIChsYXllci5hYm92ZSlcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1sYXllci1hYm92ZVwiKTtcbiAgICAgICAgaWYgKGxheWVyLmNsYXNzKVxuICAgICAgICAgICAgdGhpcy5kb20uY2xhc3NMaXN0LmFkZChsYXllci5jbGFzcyk7XG4gICAgICAgIHRoaXMuc2NhbGUoKTtcbiAgICAgICAgdGhpcy5kb20uc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgICB0aGlzLnNldE9yZGVyKHZpZXcuc3RhdGUpO1xuICAgICAgICB2aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgIGlmIChsYXllci5tb3VudClcbiAgICAgICAgICAgIGxheWVyLm1vdW50KHRoaXMuZG9tLCB2aWV3KTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQobGF5ZXJPcmRlcikgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KGxheWVyT3JkZXIpKVxuICAgICAgICAgICAgdGhpcy5zZXRPcmRlcih1cGRhdGUuc3RhdGUpO1xuICAgICAgICBpZiAodGhpcy5sYXllci51cGRhdGUodXBkYXRlLCB0aGlzLmRvbSkgfHwgdXBkYXRlLmdlb21ldHJ5Q2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5zY2FsZSgpO1xuICAgICAgICAgICAgdXBkYXRlLnZpZXcucmVxdWVzdE1lYXN1cmUodGhpcy5tZWFzdXJlUmVxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRPcmRlcihzdGF0ZSkge1xuICAgICAgICBsZXQgcG9zID0gMCwgb3JkZXIgPSBzdGF0ZS5mYWNldChsYXllck9yZGVyKTtcbiAgICAgICAgd2hpbGUgKHBvcyA8IG9yZGVyLmxlbmd0aCAmJiBvcmRlcltwb3NdICE9IHRoaXMubGF5ZXIpXG4gICAgICAgICAgICBwb3MrKztcbiAgICAgICAgdGhpcy5kb20uc3R5bGUuekluZGV4ID0gU3RyaW5nKCh0aGlzLmxheWVyLmFib3ZlID8gMTUwIDogLTEpIC0gcG9zKTtcbiAgICB9XG4gICAgbWVhc3VyZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5ZXIubWFya2Vycyh0aGlzLnZpZXcpO1xuICAgIH1cbiAgICBzY2FsZSgpIHtcbiAgICAgICAgbGV0IHsgc2NhbGVYLCBzY2FsZVkgfSA9IHRoaXMudmlldztcbiAgICAgICAgaWYgKHNjYWxlWCAhPSB0aGlzLnNjYWxlWCB8fCBzY2FsZVkgIT0gdGhpcy5zY2FsZVkpIHtcbiAgICAgICAgICAgIHRoaXMuc2NhbGVYID0gc2NhbGVYO1xuICAgICAgICAgICAgdGhpcy5zY2FsZVkgPSBzY2FsZVk7XG4gICAgICAgICAgICB0aGlzLmRvbS5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHsxIC8gc2NhbGVYfSwgJHsxIC8gc2NhbGVZfSlgO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRyYXcobWFya2Vycykge1xuICAgICAgICBpZiAobWFya2Vycy5sZW5ndGggIT0gdGhpcy5kcmF3bi5sZW5ndGggfHwgbWFya2Vycy5zb21lKChwLCBpKSA9PiAhc2FtZU1hcmtlcihwLCB0aGlzLmRyYXduW2ldKSkpIHtcbiAgICAgICAgICAgIGxldCBvbGQgPSB0aGlzLmRvbS5maXJzdENoaWxkLCBvbGRJID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IG1hcmtlciBvZiBtYXJrZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hcmtlci51cGRhdGUgJiYgb2xkICYmIG1hcmtlci5jb25zdHJ1Y3RvciAmJiB0aGlzLmRyYXduW29sZEldLmNvbnN0cnVjdG9yICYmXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlci51cGRhdGUob2xkLCB0aGlzLmRyYXduW29sZEldKSkge1xuICAgICAgICAgICAgICAgICAgICBvbGQgPSBvbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIG9sZEkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShtYXJrZXIuZHJhdygpLCBvbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChvbGQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG9sZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBvbGQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgb2xkID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZHJhd24gPSBtYXJrZXJzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmxheWVyLmRlc3Ryb3kpXG4gICAgICAgICAgICB0aGlzLmxheWVyLmRlc3Ryb3kodGhpcy5kb20sIHRoaXMudmlldyk7XG4gICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgIH1cbn1cbmNvbnN0IGxheWVyT3JkZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG4vKipcbkRlZmluZSBhIGxheWVyLlxuKi9cbmZ1bmN0aW9uIGxheWVyKGNvbmZpZykge1xuICAgIHJldHVybiBbXG4gICAgICAgIFZpZXdQbHVnaW4uZGVmaW5lKHYgPT4gbmV3IExheWVyVmlldyh2LCBjb25maWcpKSxcbiAgICAgICAgbGF5ZXJPcmRlci5vZihjb25maWcpXG4gICAgXTtcbn1cblxuY29uc3QgQ2FuSGlkZVByaW1hcnkgPSAhYnJvd3Nlci5pb3M7IC8vIEZJWE1FIHRlc3QgSUVcbmNvbnN0IHNlbGVjdGlvbkNvbmZpZyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUoY29uZmlncykge1xuICAgICAgICByZXR1cm4gY29tYmluZUNvbmZpZyhjb25maWdzLCB7XG4gICAgICAgICAgICBjdXJzb3JCbGlua1JhdGU6IDEyMDAsXG4gICAgICAgICAgICBkcmF3UmFuZ2VDdXJzb3I6IHRydWVcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgY3Vyc29yQmxpbmtSYXRlOiAoYSwgYikgPT4gTWF0aC5taW4oYSwgYiksXG4gICAgICAgICAgICBkcmF3UmFuZ2VDdXJzb3I6IChhLCBiKSA9PiBhIHx8IGJcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgaGlkZXMgdGhlIGJyb3dzZXIncyBuYXRpdmUgc2VsZWN0aW9uIGFuZFxuY3Vyc29yLCByZXBsYWNpbmcgdGhlIHNlbGVjdGlvbiB3aXRoIGEgYmFja2dyb3VuZCBiZWhpbmQgdGhlIHRleHRcbih3aXRoIHRoZSBgY20tc2VsZWN0aW9uQmFja2dyb3VuZGAgY2xhc3MpLCBhbmQgdGhlXG5jdXJzb3JzIHdpdGggZWxlbWVudHMgb3ZlcmxhaWQgb3ZlciB0aGUgY29kZSAodXNpbmdcbmBjbS1jdXJzb3ItcHJpbWFyeWAgYW5kIGBjbS1jdXJzb3Itc2Vjb25kYXJ5YCkuXG5cblRoaXMgYWxsb3dzIHRoZSBlZGl0b3IgdG8gZGlzcGxheSBzZWNvbmRhcnkgc2VsZWN0aW9uIHJhbmdlcywgYW5kXG50ZW5kcyB0byBwcm9kdWNlIGEgdHlwZSBvZiBzZWxlY3Rpb24gbW9yZSBpbiBsaW5lIHdpdGggdGhhdCB1c2Vyc1xuZXhwZWN0IGluIGEgdGV4dCBlZGl0b3IgKHRoZSBuYXRpdmUgc2VsZWN0aW9uIHN0eWxpbmcgd2lsbCBvZnRlblxubGVhdmUgZ2FwcyBiZXR3ZWVuIGxpbmVzIGFuZCB3b24ndCBmaWxsIHRoZSBob3Jpem9udGFsIHNwYWNlIGFmdGVyXG5hIGxpbmUgd2hlbiB0aGUgc2VsZWN0aW9uIGNvbnRpbnVlcyBwYXN0IGl0KS5cblxuSXQgZG9lcyBoYXZlIGEgcGVyZm9ybWFuY2UgY29zdCwgaW4gdGhhdCBpdCByZXF1aXJlcyBhbiBleHRyYSBET01cbmxheW91dCBjeWNsZSBmb3IgbWFueSB1cGRhdGVzICh0aGUgc2VsZWN0aW9uIGlzIGRyYXduIGJhc2VkIG9uIERPTVxubGF5b3V0IGluZm9ybWF0aW9uIHRoYXQncyBvbmx5IGF2YWlsYWJsZSBhZnRlciBsYXlpbmcgb3V0IHRoZVxuY29udGVudCkuXG4qL1xuZnVuY3Rpb24gZHJhd1NlbGVjdGlvbihjb25maWcgPSB7fSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIHNlbGVjdGlvbkNvbmZpZy5vZihjb25maWcpLFxuICAgICAgICBjdXJzb3JMYXllcixcbiAgICAgICAgc2VsZWN0aW9uTGF5ZXIsXG4gICAgICAgIGhpZGVOYXRpdmVTZWxlY3Rpb24sXG4gICAgICAgIG5hdGl2ZVNlbGVjdGlvbkhpZGRlbi5vZih0cnVlKVxuICAgIF07XG59XG4vKipcblJldHJpZXZlIHRoZSBbYGRyYXdTZWxlY3Rpb25gXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3ZpZXcuZHJhd1NlbGVjdGlvbikgY29uZmlndXJhdGlvblxuZm9yIHRoaXMgc3RhdGUuIChOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiBhIHNldCBvZiBkZWZhdWx0cyBldmVuXG5pZiBgZHJhd1NlbGVjdGlvbmAgaXNuJ3QgZW5hYmxlZC4pXG4qL1xuZnVuY3Rpb24gZ2V0RHJhd1NlbGVjdGlvbkNvbmZpZyhzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5mYWNldChzZWxlY3Rpb25Db25maWcpO1xufVxuZnVuY3Rpb24gY29uZmlnQ2hhbmdlZCh1cGRhdGUpIHtcbiAgICByZXR1cm4gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQoc2VsZWN0aW9uQ29uZmlnKTtcbn1cbmNvbnN0IGN1cnNvckxheWVyID0gLypAX19QVVJFX18qL2xheWVyKHtcbiAgICBhYm92ZTogdHJ1ZSxcbiAgICBtYXJrZXJzKHZpZXcpIHtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGNvbmYgPSBzdGF0ZS5mYWNldChzZWxlY3Rpb25Db25maWcpO1xuICAgICAgICBsZXQgY3Vyc29ycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByIG9mIHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBwcmltID0gciA9PSBzdGF0ZS5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgICAgIGlmIChyLmVtcHR5ID8gIXByaW0gfHwgQ2FuSGlkZVByaW1hcnkgOiBjb25mLmRyYXdSYW5nZUN1cnNvcikge1xuICAgICAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSBwcmltID8gXCJjbS1jdXJzb3IgY20tY3Vyc29yLXByaW1hcnlcIiA6IFwiY20tY3Vyc29yIGNtLWN1cnNvci1zZWNvbmRhcnlcIjtcbiAgICAgICAgICAgICAgICBsZXQgY3Vyc29yID0gci5lbXB0eSA/IHIgOiBFZGl0b3JTZWxlY3Rpb24uY3Vyc29yKHIuaGVhZCwgci5oZWFkID4gci5hbmNob3IgPyAtMSA6IDEpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBpZWNlIG9mIFJlY3RhbmdsZU1hcmtlci5mb3JSYW5nZSh2aWV3LCBjbGFzc05hbWUsIGN1cnNvcikpXG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcnMucHVzaChwaWVjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnNvcnM7XG4gICAgfSxcbiAgICB1cGRhdGUodXBkYXRlLCBkb20pIHtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMuc29tZSh0ciA9PiB0ci5zZWxlY3Rpb24pKVxuICAgICAgICAgICAgZG9tLnN0eWxlLmFuaW1hdGlvbk5hbWUgPSBkb20uc3R5bGUuYW5pbWF0aW9uTmFtZSA9PSBcImNtLWJsaW5rXCIgPyBcImNtLWJsaW5rMlwiIDogXCJjbS1ibGlua1wiO1xuICAgICAgICBsZXQgY29uZkNoYW5nZSA9IGNvbmZpZ0NoYW5nZWQodXBkYXRlKTtcbiAgICAgICAgaWYgKGNvbmZDaGFuZ2UpXG4gICAgICAgICAgICBzZXRCbGlua1JhdGUodXBkYXRlLnN0YXRlLCBkb20pO1xuICAgICAgICByZXR1cm4gdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldCB8fCBjb25mQ2hhbmdlO1xuICAgIH0sXG4gICAgbW91bnQoZG9tLCB2aWV3KSB7XG4gICAgICAgIHNldEJsaW5rUmF0ZSh2aWV3LnN0YXRlLCBkb20pO1xuICAgIH0sXG4gICAgY2xhc3M6IFwiY20tY3Vyc29yTGF5ZXJcIlxufSk7XG5mdW5jdGlvbiBzZXRCbGlua1JhdGUoc3RhdGUsIGRvbSkge1xuICAgIGRvbS5zdHlsZS5hbmltYXRpb25EdXJhdGlvbiA9IHN0YXRlLmZhY2V0KHNlbGVjdGlvbkNvbmZpZykuY3Vyc29yQmxpbmtSYXRlICsgXCJtc1wiO1xufVxuY29uc3Qgc2VsZWN0aW9uTGF5ZXIgPSAvKkBfX1BVUkVfXyovbGF5ZXIoe1xuICAgIGFib3ZlOiBmYWxzZSxcbiAgICBtYXJrZXJzKHZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5tYXAociA9PiByLmVtcHR5ID8gW10gOiBSZWN0YW5nbGVNYXJrZXIuZm9yUmFuZ2UodmlldywgXCJjbS1zZWxlY3Rpb25CYWNrZ3JvdW5kXCIsIHIpKVxuICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYikpO1xuICAgIH0sXG4gICAgdXBkYXRlKHVwZGF0ZSwgZG9tKSB7XG4gICAgICAgIHJldHVybiB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuc2VsZWN0aW9uU2V0IHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWQgfHwgY29uZmlnQ2hhbmdlZCh1cGRhdGUpO1xuICAgIH0sXG4gICAgY2xhc3M6IFwiY20tc2VsZWN0aW9uTGF5ZXJcIlxufSk7XG5jb25zdCB0aGVtZVNwZWMgPSB7XG4gICAgXCIuY20tbGluZVwiOiB7XG4gICAgICAgIFwiJiA6OnNlbGVjdGlvblwiOiB7IGJhY2tncm91bmRDb2xvcjogXCJ0cmFuc3BhcmVudCAhaW1wb3J0YW50XCIgfSxcbiAgICAgICAgXCImOjpzZWxlY3Rpb25cIjogeyBiYWNrZ3JvdW5kQ29sb3I6IFwidHJhbnNwYXJlbnQgIWltcG9ydGFudFwiIH1cbiAgICB9XG59O1xuaWYgKENhbkhpZGVQcmltYXJ5KSB7XG4gICAgdGhlbWVTcGVjW1wiLmNtLWxpbmVcIl0uY2FyZXRDb2xvciA9IFwidHJhbnNwYXJlbnQgIWltcG9ydGFudFwiO1xuICAgIHRoZW1lU3BlY1tcIi5jbS1jb250ZW50XCJdID0geyBjYXJldENvbG9yOiBcInRyYW5zcGFyZW50ICFpbXBvcnRhbnRcIiB9O1xufVxuY29uc3QgaGlkZU5hdGl2ZVNlbGVjdGlvbiA9IC8qQF9fUFVSRV9fKi9QcmVjLmhpZ2hlc3QoLypAX19QVVJFX18qL0VkaXRvclZpZXcudGhlbWUodGhlbWVTcGVjKSk7XG5cbmNvbnN0IHNldERyb3BDdXJzb3JQb3MgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKHtcbiAgICBtYXAocG9zLCBtYXBwaW5nKSB7IHJldHVybiBwb3MgPT0gbnVsbCA/IG51bGwgOiBtYXBwaW5nLm1hcFBvcyhwb3MpOyB9XG59KTtcbmNvbnN0IGRyb3BDdXJzb3JQb3MgPSAvKkBfX1BVUkVfXyovU3RhdGVGaWVsZC5kZWZpbmUoe1xuICAgIGNyZWF0ZSgpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgdXBkYXRlKHBvcywgdHIpIHtcbiAgICAgICAgaWYgKHBvcyAhPSBudWxsKVxuICAgICAgICAgICAgcG9zID0gdHIuY2hhbmdlcy5tYXBQb3MocG9zKTtcbiAgICAgICAgcmV0dXJuIHRyLmVmZmVjdHMucmVkdWNlKChwb3MsIGUpID0+IGUuaXMoc2V0RHJvcEN1cnNvclBvcykgPyBlLnZhbHVlIDogcG9zLCBwb3MpO1xuICAgIH1cbn0pO1xuY29uc3QgZHJhd0Ryb3BDdXJzb3IgPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBudWxsO1xuICAgICAgICB0aGlzLm1lYXN1cmVSZXEgPSB7IHJlYWQ6IHRoaXMucmVhZFBvcy5iaW5kKHRoaXMpLCB3cml0ZTogdGhpcy5kcmF3Q3Vyc29yLmJpbmQodGhpcykgfTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBjdXJzb3JQb3MgPSB1cGRhdGUuc3RhdGUuZmllbGQoZHJvcEN1cnNvclBvcyk7XG4gICAgICAgIGlmIChjdXJzb3JQb3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3Vyc29yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLmN1cnNvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vyc29yID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jdXJzb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvciA9IHRoaXMudmlldy5zY3JvbGxET00uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3IuY2xhc3NOYW1lID0gXCJjbS1kcm9wQ3Vyc29yXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXBkYXRlLnN0YXJ0U3RhdGUuZmllbGQoZHJvcEN1cnNvclBvcykgIT0gY3Vyc29yUG9zIHx8IHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQpXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnJlcXVlc3RNZWFzdXJlKHRoaXMubWVhc3VyZVJlcSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVhZFBvcygpIHtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdGhpcztcbiAgICAgICAgbGV0IHBvcyA9IHZpZXcuc3RhdGUuZmllbGQoZHJvcEN1cnNvclBvcyk7XG4gICAgICAgIGxldCByZWN0ID0gcG9zICE9IG51bGwgJiYgdmlldy5jb29yZHNBdFBvcyhwb3MpO1xuICAgICAgICBpZiAoIXJlY3QpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IG91dGVyID0gdmlldy5zY3JvbGxET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQgLSBvdXRlci5sZWZ0ICsgdmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdCAqIHZpZXcuc2NhbGVYLFxuICAgICAgICAgICAgdG9wOiByZWN0LnRvcCAtIG91dGVyLnRvcCArIHZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCAqIHZpZXcuc2NhbGVZLFxuICAgICAgICAgICAgaGVpZ2h0OiByZWN0LmJvdHRvbSAtIHJlY3QudG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIGRyYXdDdXJzb3IocG9zKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnNvcikge1xuICAgICAgICAgICAgbGV0IHsgc2NhbGVYLCBzY2FsZVkgfSA9IHRoaXMudmlldztcbiAgICAgICAgICAgIGlmIChwb3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5zdHlsZS5sZWZ0ID0gcG9zLmxlZnQgLyBzY2FsZVggKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUudG9wID0gcG9zLnRvcCAvIHNjYWxlWSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvci5zdHlsZS5oZWlnaHQgPSBwb3MuaGVpZ2h0IC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJzb3Iuc3R5bGUubGVmdCA9IFwiLTEwMDAwMHB4XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY3Vyc29yKVxuICAgICAgICAgICAgdGhpcy5jdXJzb3IucmVtb3ZlKCk7XG4gICAgfVxuICAgIHNldERyb3BQb3MocG9zKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXcuc3RhdGUuZmllbGQoZHJvcEN1cnNvclBvcykgIT0gcG9zKVxuICAgICAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogc2V0RHJvcEN1cnNvclBvcy5vZihwb3MpIH0pO1xuICAgIH1cbn0sIHtcbiAgICBldmVudE9ic2VydmVyczoge1xuICAgICAgICBkcmFnb3ZlcihldmVudCkge1xuICAgICAgICAgICAgdGhpcy5zZXREcm9wUG9zKHRoaXMudmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSkpO1xuICAgICAgICB9LFxuICAgICAgICBkcmFnbGVhdmUoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgPT0gdGhpcy52aWV3LmNvbnRlbnRET00gfHwgIXRoaXMudmlldy5jb250ZW50RE9NLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RHJvcFBvcyhudWxsKTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2VuZCgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RHJvcFBvcyhudWxsKTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJvcCgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RHJvcFBvcyhudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuLyoqXG5EcmF3cyBhIGN1cnNvciBhdCB0aGUgY3VycmVudCBkcm9wIHBvc2l0aW9uIHdoZW4gc29tZXRoaW5nIGlzXG5kcmFnZ2VkIG92ZXIgdGhlIGVkaXRvci5cbiovXG5mdW5jdGlvbiBkcm9wQ3Vyc29yKCkge1xuICAgIHJldHVybiBbZHJvcEN1cnNvclBvcywgZHJhd0Ryb3BDdXJzb3JdO1xufVxuXG5mdW5jdGlvbiBpdGVyTWF0Y2hlcyhkb2MsIHJlLCBmcm9tLCB0bywgZikge1xuICAgIHJlLmxhc3RJbmRleCA9IDA7XG4gICAgZm9yIChsZXQgY3Vyc29yID0gZG9jLml0ZXJSYW5nZShmcm9tLCB0byksIHBvcyA9IGZyb20sIG07ICFjdXJzb3IubmV4dCgpLmRvbmU7IHBvcyArPSBjdXJzb3IudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIGlmICghY3Vyc29yLmxpbmVCcmVhaylcbiAgICAgICAgICAgIHdoaWxlIChtID0gcmUuZXhlYyhjdXJzb3IudmFsdWUpKVxuICAgICAgICAgICAgICAgIGYocG9zICsgbS5pbmRleCwgbSk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWF0Y2hSYW5nZXModmlldywgbWF4TGVuZ3RoKSB7XG4gICAgbGV0IHZpc2libGUgPSB2aWV3LnZpc2libGVSYW5nZXM7XG4gICAgaWYgKHZpc2libGUubGVuZ3RoID09IDEgJiYgdmlzaWJsZVswXS5mcm9tID09IHZpZXcudmlld3BvcnQuZnJvbSAmJlxuICAgICAgICB2aXNpYmxlWzBdLnRvID09IHZpZXcudmlld3BvcnQudG8pXG4gICAgICAgIHJldHVybiB2aXNpYmxlO1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2YgdmlzaWJsZSkge1xuICAgICAgICBmcm9tID0gTWF0aC5tYXgodmlldy5zdGF0ZS5kb2MubGluZUF0KGZyb20pLmZyb20sIGZyb20gLSBtYXhMZW5ndGgpO1xuICAgICAgICB0byA9IE1hdGgubWluKHZpZXcuc3RhdGUuZG9jLmxpbmVBdCh0bykudG8sIHRvICsgbWF4TGVuZ3RoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggJiYgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS50byA+PSBmcm9tKVxuICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS50byA9IHRvO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXN1bHQucHVzaCh7IGZyb20sIHRvIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5IZWxwZXIgY2xhc3MgdXNlZCB0byBtYWtlIGl0IGVhc2llciB0byBtYWludGFpbiBkZWNvcmF0aW9ucyBvblxudmlzaWJsZSBjb2RlIHRoYXQgbWF0Y2hlcyBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4gVG8gYmUgdXNlZFxuaW4gYSBbdmlldyBwbHVnaW5dKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5WaWV3UGx1Z2luKS4gSW5zdGFuY2VzIG9mIHRoaXMgb2JqZWN0XG5yZXByZXNlbnQgYSBtYXRjaGluZyBjb25maWd1cmF0aW9uLlxuKi9cbmNsYXNzIE1hdGNoRGVjb3JhdG9yIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBkZWNvcmF0b3IuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgY29uc3QgeyByZWdleHAsIGRlY29yYXRpb24sIGRlY29yYXRlLCBib3VuZGFyeSwgbWF4TGVuZ3RoID0gMTAwMCB9ID0gY29uZmlnO1xuICAgICAgICBpZiAoIXJlZ2V4cC5nbG9iYWwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSByZWd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gdG8gTWF0Y2hEZWNvcmF0b3Igc2hvdWxkIGhhdmUgaXRzICdnJyBmbGFnIHNldFwiKTtcbiAgICAgICAgdGhpcy5yZWdleHAgPSByZWdleHA7XG4gICAgICAgIGlmIChkZWNvcmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRNYXRjaCA9IChtYXRjaCwgdmlldywgZnJvbSwgYWRkKSA9PiBkZWNvcmF0ZShhZGQsIGZyb20sIGZyb20gKyBtYXRjaFswXS5sZW5ndGgsIG1hdGNoLCB2aWV3KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGVjb3JhdGlvbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2ggPSAobWF0Y2gsIHZpZXcsIGZyb20sIGFkZCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBkZWNvID0gZGVjb3JhdGlvbihtYXRjaCwgdmlldywgZnJvbSk7XG4gICAgICAgICAgICAgICAgaWYgKGRlY28pXG4gICAgICAgICAgICAgICAgICAgIGFkZChmcm9tLCBmcm9tICsgbWF0Y2hbMF0ubGVuZ3RoLCBkZWNvKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGVjb3JhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5hZGRNYXRjaCA9IChtYXRjaCwgX3ZpZXcsIGZyb20sIGFkZCkgPT4gYWRkKGZyb20sIGZyb20gKyBtYXRjaFswXS5sZW5ndGgsIGRlY29yYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJFaXRoZXIgJ2RlY29yYXRlJyBvciAnZGVjb3JhdGlvbicgc2hvdWxkIGJlIHByb3ZpZGVkIHRvIE1hdGNoRGVjb3JhdG9yXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm91bmRhcnkgPSBib3VuZGFyeTtcbiAgICAgICAgdGhpcy5tYXhMZW5ndGggPSBtYXhMZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXB1dGUgdGhlIGZ1bGwgc2V0IG9mIGRlY29yYXRpb25zIGZvciBtYXRjaGVzIGluIHRoZSBnaXZlblxuICAgIHZpZXcncyB2aWV3cG9ydC4gWW91J2xsIHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4gaW5pdGlhbGl6aW5nIHlvdXJcbiAgICBwbHVnaW4uXG4gICAgKi9cbiAgICBjcmVhdGVEZWNvKHZpZXcpIHtcbiAgICAgICAgbGV0IGJ1aWxkID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpLCBhZGQgPSBidWlsZC5hZGQuYmluZChidWlsZCk7XG4gICAgICAgIGZvciAobGV0IHsgZnJvbSwgdG8gfSBvZiBtYXRjaFJhbmdlcyh2aWV3LCB0aGlzLm1heExlbmd0aCkpXG4gICAgICAgICAgICBpdGVyTWF0Y2hlcyh2aWV3LnN0YXRlLmRvYywgdGhpcy5yZWdleHAsIGZyb20sIHRvLCAoZnJvbSwgbSkgPT4gdGhpcy5hZGRNYXRjaChtLCB2aWV3LCBmcm9tLCBhZGQpKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkLmZpbmlzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgYSBzZXQgb2YgZGVjb3JhdGlvbnMgZm9yIGEgdmlldyB1cGRhdGUuIGBkZWNvYCBfbXVzdF8gYmVcbiAgICB0aGUgc2V0IG9mIGRlY29yYXRpb25zIHByb2R1Y2VkIGJ5IF90aGlzXyBgTWF0Y2hEZWNvcmF0b3JgIGZvclxuICAgIHRoZSB2aWV3IHN0YXRlIGJlZm9yZSB0aGUgdXBkYXRlLlxuICAgICovXG4gICAgdXBkYXRlRGVjbyh1cGRhdGUsIGRlY28pIHtcbiAgICAgICAgbGV0IGNoYW5nZUZyb20gPSAxZTksIGNoYW5nZVRvID0gLTE7XG4gICAgICAgIGlmICh1cGRhdGUuZG9jQ2hhbmdlZClcbiAgICAgICAgICAgIHVwZGF0ZS5jaGFuZ2VzLml0ZXJDaGFuZ2VzKChfZiwgX3QsIGZyb20sIHRvKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRvID4gdXBkYXRlLnZpZXcudmlld3BvcnQuZnJvbSAmJiBmcm9tIDwgdXBkYXRlLnZpZXcudmlld3BvcnQudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRnJvbSA9IE1hdGgubWluKGZyb20sIGNoYW5nZUZyb20pO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VUbyA9IE1hdGgubWF4KHRvLCBjaGFuZ2VUbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmICh1cGRhdGUudmlld3BvcnRDaGFuZ2VkIHx8IGNoYW5nZVRvIC0gY2hhbmdlRnJvbSA+IDEwMDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVEZWNvKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgaWYgKGNoYW5nZVRvID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVSYW5nZSh1cGRhdGUudmlldywgZGVjby5tYXAodXBkYXRlLmNoYW5nZXMpLCBjaGFuZ2VGcm9tLCBjaGFuZ2VUbyk7XG4gICAgICAgIHJldHVybiBkZWNvO1xuICAgIH1cbiAgICB1cGRhdGVSYW5nZSh2aWV3LCBkZWNvLCB1cGRhdGVGcm9tLCB1cGRhdGVUbykge1xuICAgICAgICBmb3IgKGxldCByIG9mIHZpZXcudmlzaWJsZVJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBNYXRoLm1heChyLmZyb20sIHVwZGF0ZUZyb20pLCB0byA9IE1hdGgubWluKHIudG8sIHVwZGF0ZVRvKTtcbiAgICAgICAgICAgIGlmICh0byA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbUxpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQoZnJvbSksIHRvTGluZSA9IGZyb21MaW5lLnRvIDwgdG8gPyB2aWV3LnN0YXRlLmRvYy5saW5lQXQodG8pIDogZnJvbUxpbmU7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgoci5mcm9tLCBmcm9tTGluZS5mcm9tKSwgZW5kID0gTWF0aC5taW4oci50bywgdG9MaW5lLnRvKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ib3VuZGFyeSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZnJvbSA+IGZyb21MaW5lLmZyb207IGZyb20tLSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJvdW5kYXJ5LnRlc3QoZnJvbUxpbmUudGV4dFtmcm9tIC0gMSAtIGZyb21MaW5lLmZyb21dKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yICg7IHRvIDwgdG9MaW5lLnRvOyB0bysrKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYm91bmRhcnkudGVzdCh0b0xpbmUudGV4dFt0byAtIHRvTGluZS5mcm9tXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSB0bztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlcyA9IFtdLCBtO1xuICAgICAgICAgICAgICAgIGxldCBhZGQgPSAoZnJvbSwgdG8sIGRlY28pID0+IHJhbmdlcy5wdXNoKGRlY28ucmFuZ2UoZnJvbSwgdG8pKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUxpbmUgPT0gdG9MaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVnZXhwLmxhc3RJbmRleCA9IHN0YXJ0IC0gZnJvbUxpbmUuZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChtID0gdGhpcy5yZWdleHAuZXhlYyhmcm9tTGluZS50ZXh0KSkgJiYgbS5pbmRleCA8IGVuZCAtIGZyb21MaW5lLmZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1hdGNoKG0sIHZpZXcsIG0uaW5kZXggKyBmcm9tTGluZS5mcm9tLCBhZGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlck1hdGNoZXModmlldy5zdGF0ZS5kb2MsIHRoaXMucmVnZXhwLCBzdGFydCwgZW5kLCAoZnJvbSwgbSkgPT4gdGhpcy5hZGRNYXRjaChtLCB2aWV3LCBmcm9tLCBhZGQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVjbyA9IGRlY28udXBkYXRlKHsgZmlsdGVyRnJvbTogc3RhcnQsIGZpbHRlclRvOiBlbmQsIGZpbHRlcjogKGZyb20sIHRvKSA9PiBmcm9tIDwgc3RhcnQgfHwgdG8gPiBlbmQsIGFkZDogcmFuZ2VzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWNvO1xuICAgIH1cbn1cblxuY29uc3QgVW5pY29kZVJlZ2V4cFN1cHBvcnQgPSAveC8udW5pY29kZSAhPSBudWxsID8gXCJndVwiIDogXCJnXCI7XG5jb25zdCBTcGVjaWFscyA9IC8qQF9fUFVSRV9fKi9uZXcgUmVnRXhwKFwiW1xcdTAwMDAtXFx1MDAwOFxcdTAwMGEtXFx1MDAxZlxcdTAwN2YtXFx1MDA5ZlxcdTAwYWRcXHUwNjFjXFx1MjAwYlxcdTIwMGVcXHUyMDBmXFx1MjAyOFxcdTIwMjlcXHUyMDJkXFx1MjAyZVxcdTIwNjZcXHUyMDY3XFx1MjA2OVxcdWZlZmZcXHVmZmY5LVxcdWZmZmNdXCIsIFVuaWNvZGVSZWdleHBTdXBwb3J0KTtcbmNvbnN0IE5hbWVzID0ge1xuICAgIDA6IFwibnVsbFwiLFxuICAgIDc6IFwiYmVsbFwiLFxuICAgIDg6IFwiYmFja3NwYWNlXCIsXG4gICAgMTA6IFwibmV3bGluZVwiLFxuICAgIDExOiBcInZlcnRpY2FsIHRhYlwiLFxuICAgIDEzOiBcImNhcnJpYWdlIHJldHVyblwiLFxuICAgIDI3OiBcImVzY2FwZVwiLFxuICAgIDgyMDM6IFwiemVybyB3aWR0aCBzcGFjZVwiLFxuICAgIDgyMDQ6IFwiemVybyB3aWR0aCBub24tam9pbmVyXCIsXG4gICAgODIwNTogXCJ6ZXJvIHdpZHRoIGpvaW5lclwiLFxuICAgIDgyMDY6IFwibGVmdC10by1yaWdodCBtYXJrXCIsXG4gICAgODIwNzogXCJyaWdodC10by1sZWZ0IG1hcmtcIixcbiAgICA4MjMyOiBcImxpbmUgc2VwYXJhdG9yXCIsXG4gICAgODIzNzogXCJsZWZ0LXRvLXJpZ2h0IG92ZXJyaWRlXCIsXG4gICAgODIzODogXCJyaWdodC10by1sZWZ0IG92ZXJyaWRlXCIsXG4gICAgODI5NDogXCJsZWZ0LXRvLXJpZ2h0IGlzb2xhdGVcIixcbiAgICA4Mjk1OiBcInJpZ2h0LXRvLWxlZnQgaXNvbGF0ZVwiLFxuICAgIDgyOTc6IFwicG9wIGRpcmVjdGlvbmFsIGlzb2xhdGVcIixcbiAgICA4MjMzOiBcInBhcmFncmFwaCBzZXBhcmF0b3JcIixcbiAgICA2NTI3OTogXCJ6ZXJvIHdpZHRoIG5vLWJyZWFrIHNwYWNlXCIsXG4gICAgNjU1MzI6IFwib2JqZWN0IHJlcGxhY2VtZW50XCJcbn07XG5sZXQgX3N1cHBvcnRzVGFiU2l6ZSA9IG51bGw7XG5mdW5jdGlvbiBzdXBwb3J0c1RhYlNpemUoKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChfc3VwcG9ydHNUYWJTaXplID09IG51bGwgJiYgdHlwZW9mIGRvY3VtZW50ICE9IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnQuYm9keSkge1xuICAgICAgICBsZXQgc3R5bGVzID0gZG9jdW1lbnQuYm9keS5zdHlsZTtcbiAgICAgICAgX3N1cHBvcnRzVGFiU2l6ZSA9ICgoX2EgPSBzdHlsZXMudGFiU2l6ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogc3R5bGVzLk1velRhYlNpemUpICE9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBfc3VwcG9ydHNUYWJTaXplIHx8IGZhbHNlO1xufVxuY29uc3Qgc3BlY2lhbENoYXJDb25maWcgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKGNvbmZpZ3MpIHtcbiAgICAgICAgbGV0IGNvbmZpZyA9IGNvbWJpbmVDb25maWcoY29uZmlncywge1xuICAgICAgICAgICAgcmVuZGVyOiBudWxsLFxuICAgICAgICAgICAgc3BlY2lhbENoYXJzOiBTcGVjaWFscyxcbiAgICAgICAgICAgIGFkZFNwZWNpYWxDaGFyczogbnVsbFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbmZpZy5yZXBsYWNlVGFicyA9ICFzdXBwb3J0c1RhYlNpemUoKSlcbiAgICAgICAgICAgIGNvbmZpZy5zcGVjaWFsQ2hhcnMgPSBuZXcgUmVnRXhwKFwiXFx0fFwiICsgY29uZmlnLnNwZWNpYWxDaGFycy5zb3VyY2UsIFVuaWNvZGVSZWdleHBTdXBwb3J0KTtcbiAgICAgICAgaWYgKGNvbmZpZy5hZGRTcGVjaWFsQ2hhcnMpXG4gICAgICAgICAgICBjb25maWcuc3BlY2lhbENoYXJzID0gbmV3IFJlZ0V4cChjb25maWcuc3BlY2lhbENoYXJzLnNvdXJjZSArIFwifFwiICsgY29uZmlnLmFkZFNwZWNpYWxDaGFycy5zb3VyY2UsIFVuaWNvZGVSZWdleHBTdXBwb3J0KTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG59KTtcbi8qKlxuUmV0dXJucyBhbiBleHRlbnNpb24gdGhhdCBpbnN0YWxscyBoaWdobGlnaHRpbmcgb2Ygc3BlY2lhbFxuY2hhcmFjdGVycy5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRTcGVjaWFsQ2hhcnMoXG4vKipcbkNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiovXG5jb25maWcgPSB7fSkge1xuICAgIHJldHVybiBbc3BlY2lhbENoYXJDb25maWcub2YoY29uZmlnKSwgc3BlY2lhbENoYXJQbHVnaW4oKV07XG59XG5sZXQgX3BsdWdpbiA9IG51bGw7XG5mdW5jdGlvbiBzcGVjaWFsQ2hhclBsdWdpbigpIHtcbiAgICByZXR1cm4gX3BsdWdpbiB8fCAoX3BsdWdpbiA9IFZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICAgICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSBEZWNvcmF0aW9uLm5vbmU7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25DYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRvciA9IHRoaXMubWFrZURlY29yYXRvcih2aWV3LnN0YXRlLmZhY2V0KHNwZWNpYWxDaGFyQ29uZmlnKSk7XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5kZWNvcmF0b3IuY3JlYXRlRGVjbyh2aWV3KTtcbiAgICAgICAgfVxuICAgICAgICBtYWtlRGVjb3JhdG9yKGNvbmYpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTWF0Y2hEZWNvcmF0b3Ioe1xuICAgICAgICAgICAgICAgIHJlZ2V4cDogY29uZi5zcGVjaWFsQ2hhcnMsXG4gICAgICAgICAgICAgICAgZGVjb3JhdGlvbjogKG0sIHZpZXcsIHBvcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyBkb2MgfSA9IHZpZXcuc3RhdGU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2RlID0gY29kZVBvaW50QXQobVswXSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lID0gZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSB2aWV3LnN0YXRlLnRhYlNpemUsIGNvbCA9IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgc2l6ZSwgcG9zIC0gbGluZS5mcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnJlcGxhY2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldDogbmV3IFRhYldpZGdldCgoc2l6ZSAtIChjb2wgJSBzaXplKSkgKiB0aGlzLnZpZXcuZGVmYXVsdENoYXJhY3RlcldpZHRoIC8gdGhpcy52aWV3LnNjYWxlWClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY29yYXRpb25DYWNoZVtjb2RlXSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuZGVjb3JhdGlvbkNhY2hlW2NvZGVdID0gRGVjb3JhdGlvbi5yZXBsYWNlKHsgd2lkZ2V0OiBuZXcgU3BlY2lhbENoYXJXaWRnZXQoY29uZiwgY29kZSkgfSkpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYm91bmRhcnk6IGNvbmYucmVwbGFjZVRhYnMgPyB1bmRlZmluZWQgOiAvW15dL1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICAgICAgbGV0IGNvbmYgPSB1cGRhdGUuc3RhdGUuZmFjZXQoc3BlY2lhbENoYXJDb25maWcpO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KHNwZWNpYWxDaGFyQ29uZmlnKSAhPSBjb25mKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvcmF0b3IgPSB0aGlzLm1ha2VEZWNvcmF0b3IoY29uZik7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZGVjb3JhdG9yLmNyZWF0ZURlY28odXBkYXRlLnZpZXcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZGVjb3JhdG9yLnVwZGF0ZURlY28odXBkYXRlLCB0aGlzLmRlY29yYXRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAgZGVjb3JhdGlvbnM6IHYgPT4gdi5kZWNvcmF0aW9uc1xuICAgIH0pKTtcbn1cbmNvbnN0IERlZmF1bHRQbGFjZWhvbGRlciA9IFwiXFx1MjAyMlwiO1xuLy8gQXNzaWducyBwbGFjZWhvbGRlciBjaGFyYWN0ZXJzIGZyb20gdGhlIENvbnRyb2wgUGljdHVyZXMgYmxvY2sgdG9cbi8vIEFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVyc1xuZnVuY3Rpb24gcGxhY2Vob2xkZXIkMShjb2RlKSB7XG4gICAgaWYgKGNvZGUgPj0gMzIpXG4gICAgICAgIHJldHVybiBEZWZhdWx0UGxhY2Vob2xkZXI7XG4gICAgaWYgKGNvZGUgPT0gMTApXG4gICAgICAgIHJldHVybiBcIlxcdTI0MjRcIjtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSg5MjE2ICsgY29kZSk7XG59XG5jbGFzcyBTcGVjaWFsQ2hhcldpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvZGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIG90aGVyLmNvZGUgPT0gdGhpcy5jb2RlOyB9XG4gICAgdG9ET00odmlldykge1xuICAgICAgICBsZXQgcGggPSBwbGFjZWhvbGRlciQxKHRoaXMuY29kZSk7XG4gICAgICAgIGxldCBkZXNjID0gdmlldy5zdGF0ZS5waHJhc2UoXCJDb250cm9sIGNoYXJhY3RlclwiKSArIFwiIFwiICsgKE5hbWVzW3RoaXMuY29kZV0gfHwgXCIweFwiICsgdGhpcy5jb2RlLnRvU3RyaW5nKDE2KSk7XG4gICAgICAgIGxldCBjdXN0b20gPSB0aGlzLm9wdGlvbnMucmVuZGVyICYmIHRoaXMub3B0aW9ucy5yZW5kZXIodGhpcy5jb2RlLCBkZXNjLCBwaCk7XG4gICAgICAgIGlmIChjdXN0b20pXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9tO1xuICAgICAgICBsZXQgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gcGg7XG4gICAgICAgIHNwYW4udGl0bGUgPSBkZXNjO1xuICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgZGVzYyk7XG4gICAgICAgIHNwYW4uY2xhc3NOYW1lID0gXCJjbS1zcGVjaWFsQ2hhclwiO1xuICAgICAgICByZXR1cm4gc3BhbjtcbiAgICB9XG4gICAgaWdub3JlRXZlbnQoKSB7IHJldHVybiBmYWxzZTsgfVxufVxuY2xhc3MgVGFiV2lkZ2V0IGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3Iod2lkdGgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIud2lkdGggPT0gdGhpcy53aWR0aDsgfVxuICAgIHRvRE9NKCkge1xuICAgICAgICBsZXQgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gXCJcXHRcIjtcbiAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSBcImNtLXRhYlwiO1xuICAgICAgICBzcGFuLnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArIFwicHhcIjtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfVxuICAgIGlnbm9yZUV2ZW50KCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cblxuY29uc3QgcGx1Z2luID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAxMDAwO1xuICAgICAgICB0aGlzLmF0dHJzID0geyBzdHlsZTogXCJwYWRkaW5nLWJvdHRvbTogMTAwMHB4XCIgfTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB1cGRhdGU7XG4gICAgICAgIGxldCBoZWlnaHQgPSB2aWV3LnZpZXdTdGF0ZS5lZGl0b3JIZWlnaHQgKiB2aWV3LnNjYWxlWSAtXG4gICAgICAgICAgICB2aWV3LmRlZmF1bHRMaW5lSGVpZ2h0IC0gdmlldy5kb2N1bWVudFBhZGRpbmcudG9wIC0gMC41O1xuICAgICAgICBpZiAoaGVpZ2h0ID49IDAgJiYgaGVpZ2h0ICE9IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuYXR0cnMgPSB7IHN0eWxlOiBgcGFkZGluZy1ib3R0b206ICR7aGVpZ2h0fXB4YCB9O1xuICAgICAgICB9XG4gICAgfVxufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgbWFrZXMgc3VyZSB0aGUgY29udGVudCBoYXMgYSBib3R0b21cbm1hcmdpbiBlcXVpdmFsZW50IHRvIHRoZSBoZWlnaHQgb2YgdGhlIGVkaXRvciwgbWludXMgb25lIGxpbmVcbmhlaWdodCwgc28gdGhhdCBldmVyeSBsaW5lIGluIHRoZSBkb2N1bWVudCBjYW4gYmUgc2Nyb2xsZWQgdG8gdGhlXG50b3Agb2YgdGhlIGVkaXRvci5cblxuVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiB0aGUgZWRpdG9yIGlzIHNjcm9sbGFibGUsIGFuZCBzaG91bGRcbm5vdCBiZSBlbmFibGVkIGluIGVkaXRvcnMgdGhhdCB0YWtlIHRoZSBzaXplIG9mIHRoZWlyIGNvbnRlbnQuXG4qL1xuZnVuY3Rpb24gc2Nyb2xsUGFzdEVuZCgpIHtcbiAgICByZXR1cm4gW3BsdWdpbiwgY29udGVudEF0dHJpYnV0ZXMub2YodmlldyA9PiB7IHZhciBfYTsgcmV0dXJuICgoX2EgPSB2aWV3LnBsdWdpbihwbHVnaW4pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXR0cnMpIHx8IG51bGw7IH0pXTtcbn1cblxuLyoqXG5NYXJrIGxpbmVzIHRoYXQgaGF2ZSBhIGN1cnNvciBvbiB0aGVtIHdpdGggdGhlIGBcImNtLWFjdGl2ZUxpbmVcImBcbkRPTSBjbGFzcy5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRBY3RpdmVMaW5lKCkge1xuICAgIHJldHVybiBhY3RpdmVMaW5lSGlnaGxpZ2h0ZXI7XG59XG5jb25zdCBsaW5lRGVjbyA9IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLmxpbmUoeyBjbGFzczogXCJjbS1hY3RpdmVMaW5lXCIgfSk7XG5jb25zdCBhY3RpdmVMaW5lSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZ2V0RGVjbyh2aWV3KTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldClcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmdldERlY28odXBkYXRlLnZpZXcpO1xuICAgIH1cbiAgICBnZXREZWNvKHZpZXcpIHtcbiAgICAgICAgbGV0IGxhc3RMaW5lU3RhcnQgPSAtMSwgZGVjbyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByIG9mIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSB2aWV3LmxpbmVCbG9ja0F0KHIuaGVhZCk7XG4gICAgICAgICAgICBpZiAobGluZS5mcm9tID4gbGFzdExpbmVTdGFydCkge1xuICAgICAgICAgICAgICAgIGRlY28ucHVzaChsaW5lRGVjby5yYW5nZShsaW5lLmZyb20pKTtcbiAgICAgICAgICAgICAgICBsYXN0TGluZVN0YXJ0ID0gbGluZS5mcm9tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChkZWNvKTtcbiAgICB9XG59LCB7XG4gICAgZGVjb3JhdGlvbnM6IHYgPT4gdi5kZWNvcmF0aW9uc1xufSk7XG5cbmNsYXNzIFBsYWNlaG9sZGVyIGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IoY29udGVudCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgIH1cbiAgICB0b0RPTSgpIHtcbiAgICAgICAgbGV0IHdyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgd3JhcC5jbGFzc05hbWUgPSBcImNtLXBsYWNlaG9sZGVyXCI7XG4gICAgICAgIHdyYXAuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xuICAgICAgICB3cmFwLmFwcGVuZENoaWxkKHR5cGVvZiB0aGlzLmNvbnRlbnQgPT0gXCJzdHJpbmdcIiA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuY29udGVudCkgOiB0aGlzLmNvbnRlbnQpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29udGVudCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgd3JhcC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwicGxhY2Vob2xkZXIgXCIgKyB0aGlzLmNvbnRlbnQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB3cmFwLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHdyYXA7XG4gICAgfVxuICAgIGNvb3Jkc0F0KGRvbSkge1xuICAgICAgICBsZXQgcmVjdHMgPSBkb20uZmlyc3RDaGlsZCA/IGNsaWVudFJlY3RzRm9yKGRvbS5maXJzdENoaWxkKSA6IFtdO1xuICAgICAgICBpZiAoIXJlY3RzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb20ucGFyZW50Tm9kZSk7XG4gICAgICAgIGxldCByZWN0ID0gZmxhdHRlblJlY3QocmVjdHNbMF0sIHN0eWxlLmRpcmVjdGlvbiAhPSBcInJ0bFwiKTtcbiAgICAgICAgbGV0IGxpbmVIZWlnaHQgPSBwYXJzZUludChzdHlsZS5saW5lSGVpZ2h0KTtcbiAgICAgICAgaWYgKHJlY3QuYm90dG9tIC0gcmVjdC50b3AgPiBsaW5lSGVpZ2h0ICogMS41KVxuICAgICAgICAgICAgcmV0dXJuIHsgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5yaWdodCwgdG9wOiByZWN0LnRvcCwgYm90dG9tOiByZWN0LnRvcCArIGxpbmVIZWlnaHQgfTtcbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgfVxuICAgIGlnbm9yZUV2ZW50KCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbi8qKlxuRXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyBhIHBsYWNlaG9sZGVyXHUyMDE0YSBwaWVjZSBvZiBleGFtcGxlIGNvbnRlbnRcbnRvIHNob3cgd2hlbiB0aGUgZWRpdG9yIGlzIGVtcHR5LlxuKi9cbmZ1bmN0aW9uIHBsYWNlaG9sZGVyKGNvbnRlbnQpIHtcbiAgICByZXR1cm4gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IGNvbnRlbnRcbiAgICAgICAgICAgICAgICA/IERlY29yYXRpb24uc2V0KFtEZWNvcmF0aW9uLndpZGdldCh7IHdpZGdldDogbmV3IFBsYWNlaG9sZGVyKGNvbnRlbnQpLCBzaWRlOiAxIH0pLnJhbmdlKDApXSlcbiAgICAgICAgICAgICAgICA6IERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgZGVjb3JhdGlvbnMoKSB7IHJldHVybiB0aGlzLnZpZXcuc3RhdGUuZG9jLmxlbmd0aCA/IERlY29yYXRpb24ubm9uZSA6IHRoaXMucGxhY2Vob2xkZXI7IH1cbiAgICB9LCB7IGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnMgfSk7XG59XG5cbi8vIERvbid0IGNvbXB1dGUgcHJlY2lzZSBjb2x1bW4gcG9zaXRpb25zIGZvciBsaW5lIG9mZnNldHMgYWJvdmUgdGhpc1xuLy8gKHNpbmNlIGl0IGNvdWxkIGdldCBleHBlbnNpdmUpLiBBc3N1bWUgb2Zmc2V0PT1jb2x1bW4gZm9yIHRoZW0uXG5jb25zdCBNYXhPZmYgPSAyMDAwO1xuZnVuY3Rpb24gcmVjdGFuZ2xlRm9yKHN0YXRlLCBhLCBiKSB7XG4gICAgbGV0IHN0YXJ0TGluZSA9IE1hdGgubWluKGEubGluZSwgYi5saW5lKSwgZW5kTGluZSA9IE1hdGgubWF4KGEubGluZSwgYi5saW5lKTtcbiAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgaWYgKGEub2ZmID4gTWF4T2ZmIHx8IGIub2ZmID4gTWF4T2ZmIHx8IGEuY29sIDwgMCB8fCBiLmNvbCA8IDApIHtcbiAgICAgICAgbGV0IHN0YXJ0T2ZmID0gTWF0aC5taW4oYS5vZmYsIGIub2ZmKSwgZW5kT2ZmID0gTWF0aC5tYXgoYS5vZmYsIGIub2ZmKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0TGluZTsgaSA8PSBlbmRMaW5lOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmUoaSk7XG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPD0gZW5kT2ZmKVxuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKEVkaXRvclNlbGVjdGlvbi5yYW5nZShsaW5lLmZyb20gKyBzdGFydE9mZiwgbGluZS50byArIGVuZE9mZikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgc3RhcnRDb2wgPSBNYXRoLm1pbihhLmNvbCwgYi5jb2wpLCBlbmRDb2wgPSBNYXRoLm1heChhLmNvbCwgYi5jb2wpO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRMaW5lOyBpIDw9IGVuZExpbmU7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZShpKTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IGZpbmRDb2x1bW4obGluZS50ZXh0LCBzdGFydENvbCwgc3RhdGUudGFiU2l6ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goRWRpdG9yU2VsZWN0aW9uLmN1cnNvcihsaW5lLnRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kID0gZmluZENvbHVtbihsaW5lLnRleHQsIGVuZENvbCwgc3RhdGUudGFiU2l6ZSk7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goRWRpdG9yU2VsZWN0aW9uLnJhbmdlKGxpbmUuZnJvbSArIHN0YXJ0LCBsaW5lLmZyb20gKyBlbmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmFuZ2VzO1xufVxuZnVuY3Rpb24gYWJzb2x1dGVDb2x1bW4odmlldywgeCkge1xuICAgIGxldCByZWYgPSB2aWV3LmNvb3Jkc0F0UG9zKHZpZXcudmlld3BvcnQuZnJvbSk7XG4gICAgcmV0dXJuIHJlZiA/IE1hdGgucm91bmQoTWF0aC5hYnMoKHJlZi5sZWZ0IC0geCkgLyB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCkpIDogLTE7XG59XG5mdW5jdGlvbiBnZXRQb3ModmlldywgZXZlbnQpIHtcbiAgICBsZXQgb2Zmc2V0ID0gdmlldy5wb3NBdENvb3Jkcyh7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSwgZmFsc2UpO1xuICAgIGxldCBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KG9mZnNldCksIG9mZiA9IG9mZnNldCAtIGxpbmUuZnJvbTtcbiAgICBsZXQgY29sID0gb2ZmID4gTWF4T2ZmID8gLTFcbiAgICAgICAgOiBvZmYgPT0gbGluZS5sZW5ndGggPyBhYnNvbHV0ZUNvbHVtbih2aWV3LCBldmVudC5jbGllbnRYKVxuICAgICAgICAgICAgOiBjb3VudENvbHVtbihsaW5lLnRleHQsIHZpZXcuc3RhdGUudGFiU2l6ZSwgb2Zmc2V0IC0gbGluZS5mcm9tKTtcbiAgICByZXR1cm4geyBsaW5lOiBsaW5lLm51bWJlciwgY29sLCBvZmYgfTtcbn1cbmZ1bmN0aW9uIHJlY3RhbmdsZVNlbGVjdGlvblN0eWxlKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IHN0YXJ0ID0gZ2V0UG9zKHZpZXcsIGV2ZW50KSwgc3RhcnRTZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIXN0YXJ0KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3U3RhcnQgPSB1cGRhdGUuY2hhbmdlcy5tYXBQb3ModXBkYXRlLnN0YXJ0U3RhdGUuZG9jLmxpbmUoc3RhcnQubGluZSkuZnJvbSk7XG4gICAgICAgICAgICAgICAgbGV0IG5ld0xpbmUgPSB1cGRhdGUuc3RhdGUuZG9jLmxpbmVBdChuZXdTdGFydCk7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSB7IGxpbmU6IG5ld0xpbmUubnVtYmVyLCBjb2w6IHN0YXJ0LmNvbCwgb2ZmOiBNYXRoLm1pbihzdGFydC5vZmYsIG5ld0xpbmUubGVuZ3RoKSB9O1xuICAgICAgICAgICAgICAgIHN0YXJ0U2VsID0gc3RhcnRTZWwubWFwKHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0KGV2ZW50LCBfZXh0ZW5kLCBtdWx0aXBsZSkge1xuICAgICAgICAgICAgbGV0IGN1ciA9IGdldFBvcyh2aWV3LCBldmVudCk7XG4gICAgICAgICAgICBpZiAoIWN1cilcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRTZWw7XG4gICAgICAgICAgICBsZXQgcmFuZ2VzID0gcmVjdGFuZ2xlRm9yKHZpZXcuc3RhdGUsIHN0YXJ0LCBjdXIpO1xuICAgICAgICAgICAgaWYgKCFyYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFNlbDtcbiAgICAgICAgICAgIGlmIChtdWx0aXBsZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShyYW5nZXMuY29uY2F0KHN0YXJ0U2VsLnJhbmdlcykpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKHJhbmdlcyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG5DcmVhdGUgYW4gZXh0ZW5zaW9uIHRoYXQgZW5hYmxlcyByZWN0YW5ndWxhciBzZWxlY3Rpb25zLiBCeVxuZGVmYXVsdCwgaXQgd2lsbCByZWFjdCB0byBsZWZ0IG1vdXNlIGRyYWcgd2l0aCB0aGUgQWx0IGtleSBoZWxkXG5kb3duLiBXaGVuIHN1Y2ggYSBzZWxlY3Rpb24gb2NjdXJzLCB0aGUgdGV4dCB3aXRoaW4gdGhlIHJlY3RhbmdsZVxudGhhdCB3YXMgZHJhZ2dlZCBvdmVyIHdpbGwgYmUgc2VsZWN0ZWQsIGFzIG9uZSBzZWxlY3Rpb25cbltyYW5nZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25SYW5nZSkgcGVyIGxpbmUuXG4qL1xuZnVuY3Rpb24gcmVjdGFuZ3VsYXJTZWxlY3Rpb24ob3B0aW9ucykge1xuICAgIGxldCBmaWx0ZXIgPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmV2ZW50RmlsdGVyKSB8fCAoZSA9PiBlLmFsdEtleSAmJiBlLmJ1dHRvbiA9PSAwKTtcbiAgICByZXR1cm4gRWRpdG9yVmlldy5tb3VzZVNlbGVjdGlvblN0eWxlLm9mKCh2aWV3LCBldmVudCkgPT4gZmlsdGVyKGV2ZW50KSA/IHJlY3RhbmdsZVNlbGVjdGlvblN0eWxlKHZpZXcsIGV2ZW50KSA6IG51bGwpO1xufVxuY29uc3Qga2V5cyA9IHtcbiAgICBBbHQ6IFsxOCwgZSA9PiAhIWUuYWx0S2V5XSxcbiAgICBDb250cm9sOiBbMTcsIGUgPT4gISFlLmN0cmxLZXldLFxuICAgIFNoaWZ0OiBbMTYsIGUgPT4gISFlLnNoaWZ0S2V5XSxcbiAgICBNZXRhOiBbOTEsIGUgPT4gISFlLm1ldGFLZXldXG59O1xuY29uc3Qgc2hvd0Nyb3NzaGFpciA9IHsgc3R5bGU6IFwiY3Vyc29yOiBjcm9zc2hhaXJcIiB9O1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IHR1cm5zIHRoZSBwb2ludGVyIGN1cnNvciBpbnRvIGFcbmNyb3NzaGFpciB3aGVuIGEgZ2l2ZW4gbW9kaWZpZXIga2V5LCBkZWZhdWx0aW5nIHRvIEFsdCwgaXMgaGVsZFxuZG93bi4gQ2FuIHNlcnZlIGFzIGEgdmlzdWFsIGhpbnQgdGhhdCByZWN0YW5ndWxhciBzZWxlY3Rpb24gaXNcbmdvaW5nIHRvIGhhcHBlbiB3aGVuIHBhaXJlZCB3aXRoXG5bYHJlY3Rhbmd1bGFyU2VsZWN0aW9uYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LnJlY3Rhbmd1bGFyU2VsZWN0aW9uKS5cbiovXG5mdW5jdGlvbiBjcm9zc2hhaXJDdXJzb3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IFtjb2RlLCBnZXR0ZXJdID0ga2V5c1tvcHRpb25zLmtleSB8fCBcIkFsdFwiXTtcbiAgICBsZXQgcGx1Z2luID0gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICAgICAgdGhpcy5pc0Rvd24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBzZXQoaXNEb3duKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0Rvd24gIT0gaXNEb3duKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Rvd24gPSBpc0Rvd247XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZShbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGV2ZW50T2JzZXJ2ZXJzOiB7XG4gICAgICAgICAgICBrZXlkb3duKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChlLmtleUNvZGUgPT0gY29kZSB8fCBnZXR0ZXIoZSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGtleXVwKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09IGNvZGUgfHwgIWdldHRlcihlKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdXNlbW92ZShlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoZ2V0dGVyKGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIHBsdWdpbixcbiAgICAgICAgRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5vZih2aWV3ID0+IHsgdmFyIF9hOyByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKHBsdWdpbikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pc0Rvd24pID8gc2hvd0Nyb3NzaGFpciA6IG51bGw7IH0pXG4gICAgXTtcbn1cblxuY29uc3QgT3V0c2lkZSA9IFwiLTEwMDAwcHhcIjtcbmNsYXNzIFRvb2x0aXBWaWV3TWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IodmlldywgZmFjZXQsIGNyZWF0ZVRvb2x0aXBWaWV3KSB7XG4gICAgICAgIHRoaXMuZmFjZXQgPSBmYWNldDtcbiAgICAgICAgdGhpcy5jcmVhdGVUb29sdGlwVmlldyA9IGNyZWF0ZVRvb2x0aXBWaWV3O1xuICAgICAgICB0aGlzLmlucHV0ID0gdmlldy5zdGF0ZS5mYWNldChmYWNldCk7XG4gICAgICAgIHRoaXMudG9vbHRpcHMgPSB0aGlzLmlucHV0LmZpbHRlcih0ID0+IHQpO1xuICAgICAgICB0aGlzLnRvb2x0aXBWaWV3cyA9IHRoaXMudG9vbHRpcHMubWFwKGNyZWF0ZVRvb2x0aXBWaWV3KTtcbiAgICB9XG4gICAgdXBkYXRlKHVwZGF0ZSwgYWJvdmUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgaW5wdXQgPSB1cGRhdGUuc3RhdGUuZmFjZXQodGhpcy5mYWNldCk7XG4gICAgICAgIGxldCB0b29sdGlwcyA9IGlucHV0LmZpbHRlcih4ID0+IHgpO1xuICAgICAgICBpZiAoaW5wdXQgPT09IHRoaXMuaW5wdXQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgaWYgKHQudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICB0LnVwZGF0ZSh1cGRhdGUpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b29sdGlwVmlld3MgPSBbXSwgbmV3QWJvdmUgPSBhYm92ZSA/IFtdIDogbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b29sdGlwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHRpcCA9IHRvb2x0aXBzW2ldLCBrbm93biA9IC0xO1xuICAgICAgICAgICAgaWYgKCF0aXApXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudG9vbHRpcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb3RoZXIgPSB0aGlzLnRvb2x0aXBzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChvdGhlciAmJiBvdGhlci5jcmVhdGUgPT0gdGlwLmNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAga25vd24gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGtub3duIDwgMCkge1xuICAgICAgICAgICAgICAgIHRvb2x0aXBWaWV3c1tpXSA9IHRoaXMuY3JlYXRlVG9vbHRpcFZpZXcodGlwKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3QWJvdmUpXG4gICAgICAgICAgICAgICAgICAgIG5ld0Fib3ZlW2ldID0gISF0aXAuYWJvdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdG9vbHRpcFZpZXcgPSB0b29sdGlwVmlld3NbaV0gPSB0aGlzLnRvb2x0aXBWaWV3c1trbm93bl07XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Fib3ZlKVxuICAgICAgICAgICAgICAgICAgICBuZXdBYm92ZVtpXSA9IGFib3ZlW2tub3duXTtcbiAgICAgICAgICAgICAgICBpZiAodG9vbHRpcFZpZXcudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwVmlldy51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudG9vbHRpcFZpZXdzKVxuICAgICAgICAgICAgaWYgKHRvb2x0aXBWaWV3cy5pbmRleE9mKHQpIDwgMCkge1xuICAgICAgICAgICAgICAgIHQuZG9tLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIChfYSA9IHQuZGVzdHJveSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGlmIChhYm92ZSkge1xuICAgICAgICAgICAgbmV3QWJvdmUuZm9yRWFjaCgodmFsLCBpKSA9PiBhYm92ZVtpXSA9IHZhbCk7XG4gICAgICAgICAgICBhYm92ZS5sZW5ndGggPSBuZXdBYm92ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLnRvb2x0aXBzID0gdG9vbHRpcHM7XG4gICAgICAgIHRoaXMudG9vbHRpcFZpZXdzID0gdG9vbHRpcFZpZXdzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4vKipcbkNyZWF0ZXMgYW4gZXh0ZW5zaW9uIHRoYXQgY29uZmlndXJlcyB0b29sdGlwIGJlaGF2aW9yLlxuKi9cbmZ1bmN0aW9uIHRvb2x0aXBzKGNvbmZpZyA9IHt9KSB7XG4gICAgcmV0dXJuIHRvb2x0aXBDb25maWcub2YoY29uZmlnKTtcbn1cbmZ1bmN0aW9uIHdpbmRvd1NwYWNlKHZpZXcpIHtcbiAgICBsZXQgeyB3aW4gfSA9IHZpZXc7XG4gICAgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwLCBib3R0b206IHdpbi5pbm5lckhlaWdodCwgcmlnaHQ6IHdpbi5pbm5lcldpZHRoIH07XG59XG5jb25zdCB0b29sdGlwQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHJldHVybiAoe1xuICAgICAgICAgICAgcG9zaXRpb246IGJyb3dzZXIuaW9zID8gXCJhYnNvbHV0ZVwiIDogKChfYSA9IHZhbHVlcy5maW5kKGNvbmYgPT4gY29uZi5wb3NpdGlvbikpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wb3NpdGlvbikgfHwgXCJmaXhlZFwiLFxuICAgICAgICAgICAgcGFyZW50OiAoKF9iID0gdmFsdWVzLmZpbmQoY29uZiA9PiBjb25mLnBhcmVudCkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXJlbnQpIHx8IG51bGwsXG4gICAgICAgICAgICB0b29sdGlwU3BhY2U6ICgoX2MgPSB2YWx1ZXMuZmluZChjb25mID0+IGNvbmYudG9vbHRpcFNwYWNlKSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnRvb2x0aXBTcGFjZSkgfHwgd2luZG93U3BhY2UsXG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuY29uc3Qga25vd25IZWlnaHQgPSAvKkBfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHRvb2x0aXBQbHVnaW4gPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5hYm92ZSA9IFtdO1xuICAgICAgICB0aGlzLmluVmlldyA9IHRydWU7XG4gICAgICAgIHRoaXMubWFkZUFic29sdXRlID0gZmFsc2U7XG4gICAgICAgIHRoaXMubGFzdFRyYW5zYWN0aW9uID0gMDtcbiAgICAgICAgdGhpcy5tZWFzdXJlVGltZW91dCA9IC0xO1xuICAgICAgICBsZXQgY29uZmlnID0gdmlldy5zdGF0ZS5mYWNldCh0b29sdGlwQ29uZmlnKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IGNvbmZpZy5wb3NpdGlvbjtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBjb25maWcucGFyZW50O1xuICAgICAgICB0aGlzLmNsYXNzZXMgPSB2aWV3LnRoZW1lQ2xhc3NlcztcbiAgICAgICAgdGhpcy5jcmVhdGVDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5tZWFzdXJlUmVxID0geyByZWFkOiB0aGlzLnJlYWRNZWFzdXJlLmJpbmQodGhpcyksIHdyaXRlOiB0aGlzLndyaXRlTWVhc3VyZS5iaW5kKHRoaXMpLCBrZXk6IHRoaXMgfTtcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbmV3IFRvb2x0aXBWaWV3TWFuYWdlcih2aWV3LCBzaG93VG9vbHRpcCwgdCA9PiB0aGlzLmNyZWF0ZVRvb2x0aXAodCkpO1xuICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyID0gdHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyID09IFwiZnVuY3Rpb25cIiA/IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpID4gdGhpcy5sYXN0VHJhbnNhY3Rpb24gLSA1MCAmJlxuICAgICAgICAgICAgICAgIGVudHJpZXMubGVuZ3RoID4gMCAmJiBlbnRyaWVzW2VudHJpZXMubGVuZ3RoIC0gMV0uaW50ZXJzZWN0aW9uUmF0aW8gPCAxKVxuICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZVNvb24oKTtcbiAgICAgICAgfSwgeyB0aHJlc2hvbGQ6IFsxXSB9KSA6IG51bGw7XG4gICAgICAgIHRoaXMub2JzZXJ2ZUludGVyc2VjdGlvbigpO1xuICAgICAgICB2aWV3Lndpbi5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMubWVhc3VyZVNvb24gPSB0aGlzLm1lYXN1cmVTb29uLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLm1heWJlTWVhc3VyZSgpO1xuICAgIH1cbiAgICBjcmVhdGVDb250YWluZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc05hbWUgPSB0aGlzLnZpZXcudGhlbWVDbGFzc2VzO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnZpZXcuZG9tO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9ic2VydmVJbnRlcnNlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSB7XG4gICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHRvb2x0aXAgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLm9ic2VydmUodG9vbHRpcC5kb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1lYXN1cmVTb29uKCkge1xuICAgICAgICBpZiAodGhpcy5tZWFzdXJlVGltZW91dCA8IDApXG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZWFzdXJlVGltZW91dCA9IC0xO1xuICAgICAgICAgICAgICAgIHRoaXMubWF5YmVNZWFzdXJlKCk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5sYXN0VHJhbnNhY3Rpb24gPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IHRoaXMubWFuYWdlci51cGRhdGUodXBkYXRlLCB0aGlzLmFib3ZlKTtcbiAgICAgICAgaWYgKHVwZGF0ZWQpXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVJbnRlcnNlY3Rpb24oKTtcbiAgICAgICAgbGV0IHNob3VsZE1lYXN1cmUgPSB1cGRhdGVkIHx8IHVwZGF0ZS5nZW9tZXRyeUNoYW5nZWQ7XG4gICAgICAgIGxldCBuZXdDb25maWcgPSB1cGRhdGUuc3RhdGUuZmFjZXQodG9vbHRpcENvbmZpZyk7XG4gICAgICAgIGlmIChuZXdDb25maWcucG9zaXRpb24gIT0gdGhpcy5wb3NpdGlvbiAmJiAhdGhpcy5tYWRlQWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBuZXdDb25maWcucG9zaXRpb247XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdC5kb20uc3R5bGUucG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgICAgICAgc2hvdWxkTWVhc3VyZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0NvbmZpZy5wYXJlbnQgIT0gdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudClcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50ID0gbmV3Q29uZmlnLnBhcmVudDtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29udGFpbmVyKCk7XG4gICAgICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodC5kb20pO1xuICAgICAgICAgICAgc2hvdWxkTWVhc3VyZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy52aWV3LnRoZW1lQ2xhc3NlcyAhPSB0aGlzLmNsYXNzZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NlcyA9IHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9IHRoaXMudmlldy50aGVtZUNsYXNzZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZE1lYXN1cmUpXG4gICAgICAgICAgICB0aGlzLm1heWJlTWVhc3VyZSgpO1xuICAgIH1cbiAgICBjcmVhdGVUb29sdGlwKHRvb2x0aXApIHtcbiAgICAgICAgbGV0IHRvb2x0aXBWaWV3ID0gdG9vbHRpcC5jcmVhdGUodGhpcy52aWV3KTtcbiAgICAgICAgdG9vbHRpcFZpZXcuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS10b29sdGlwXCIpO1xuICAgICAgICBpZiAodG9vbHRpcC5hcnJvdyAmJiAhdG9vbHRpcFZpZXcuZG9tLnF1ZXJ5U2VsZWN0b3IoXCIuY20tdG9vbHRpcCA+IC5jbS10b29sdGlwLWFycm93XCIpKSB7XG4gICAgICAgICAgICBsZXQgYXJyb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgYXJyb3cuY2xhc3NOYW1lID0gXCJjbS10b29sdGlwLWFycm93XCI7XG4gICAgICAgICAgICB0b29sdGlwVmlldy5kb20uYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICAgICAgICB9XG4gICAgICAgIHRvb2x0aXBWaWV3LmRvbS5zdHlsZS5wb3NpdGlvbiA9IHRoaXMucG9zaXRpb247XG4gICAgICAgIHRvb2x0aXBWaWV3LmRvbS5zdHlsZS50b3AgPSBPdXRzaWRlO1xuICAgICAgICB0b29sdGlwVmlldy5kb20uc3R5bGUubGVmdCA9IFwiMHB4XCI7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRvb2x0aXBWaWV3LmRvbSk7XG4gICAgICAgIGlmICh0b29sdGlwVmlldy5tb3VudClcbiAgICAgICAgICAgIHRvb2x0aXBWaWV3Lm1vdW50KHRoaXMudmlldyk7XG4gICAgICAgIHJldHVybiB0b29sdGlwVmlldztcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdGhpcy52aWV3Lndpbi5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMubWVhc3VyZVNvb24pO1xuICAgICAgICBmb3IgKGxldCB0b29sdGlwVmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICB0b29sdGlwVmlldy5kb20ucmVtb3ZlKCk7XG4gICAgICAgICAgICAoX2EgPSB0b29sdGlwVmlldy5kZXN0cm95KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0b29sdGlwVmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFyZW50KVxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgIChfYiA9IHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5kaXNjb25uZWN0KCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm1lYXN1cmVUaW1lb3V0KTtcbiAgICB9XG4gICAgcmVhZE1lYXN1cmUoKSB7XG4gICAgICAgIGxldCBlZGl0b3IgPSB0aGlzLnZpZXcuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBsZXQgc2NhbGVYID0gMSwgc2NhbGVZID0gMSwgbWFrZUFic29sdXRlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID09IFwiZml4ZWRcIiAmJiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHsgZG9tIH0gPSB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzWzBdO1xuICAgICAgICAgICAgaWYgKGJyb3dzZXIuZ2Vja28pIHtcbiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IHNldHMgdGhlIGVsZW1lbnQncyBgb2Zmc2V0UGFyZW50YCB0byB0aGVcbiAgICAgICAgICAgICAgICAvLyB0cmFuc2Zvcm1lZCBlbGVtZW50IHdoZW4gYSB0cmFuc2Zvcm0gaW50ZXJmZXJlcyB3aXRoIGZpeGVkXG4gICAgICAgICAgICAgICAgLy8gcG9zaXRpb25pbmcuXG4gICAgICAgICAgICAgICAgbWFrZUFic29sdXRlID0gZG9tLm9mZnNldFBhcmVudCAhPSB0aGlzLmNvbnRhaW5lci5vd25lckRvY3VtZW50LmJvZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkb20uc3R5bGUudG9wID09IE91dHNpZGUgJiYgZG9tLnN0eWxlLmxlZnQgPT0gXCIwcHhcIikge1xuICAgICAgICAgICAgICAgIC8vIE9uIG90aGVyIGJyb3dzZXJzLCB3ZSBoYXZlIHRvIGF3a3dhcmRseSB0cnkgYW5kIHVzZSBvdGhlclxuICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIHRvIGRldGVjdCBhIHRyYW5zZm9ybS5cbiAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBtYWtlQWJzb2x1dGUgPSBNYXRoLmFicyhyZWN0LnRvcCArIDEwMDAwKSA+IDEgfHwgTWF0aC5hYnMocmVjdC5sZWZ0KSA+IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ha2VBYnNvbHV0ZSB8fCB0aGlzLnBvc2l0aW9uID09IFwiYWJzb2x1dGVcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlY3QgPSB0aGlzLnBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBpZiAocmVjdC53aWR0aCAmJiByZWN0LmhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBzY2FsZVggPSByZWN0LndpZHRoIC8gdGhpcy5wYXJlbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHNjYWxlWSA9IHJlY3QuaGVpZ2h0IC8gdGhpcy5wYXJlbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICh7IHNjYWxlWCwgc2NhbGVZIH0gPSB0aGlzLnZpZXcudmlld1N0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZWRpdG9yLFxuICAgICAgICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCA/IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogZWRpdG9yLFxuICAgICAgICAgICAgcG9zOiB0aGlzLm1hbmFnZXIudG9vbHRpcHMubWFwKCh0LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHR2ID0gdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3c1tpXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHYuZ2V0Q29vcmRzID8gdHYuZ2V0Q29vcmRzKHQucG9zKSA6IHRoaXMudmlldy5jb29yZHNBdFBvcyh0LnBvcyk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNpemU6IHRoaXMubWFuYWdlci50b29sdGlwVmlld3MubWFwKCh7IGRvbSB9KSA9PiBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLFxuICAgICAgICAgICAgc3BhY2U6IHRoaXMudmlldy5zdGF0ZS5mYWNldCh0b29sdGlwQ29uZmlnKS50b29sdGlwU3BhY2UodGhpcy52aWV3KSxcbiAgICAgICAgICAgIHNjYWxlWCwgc2NhbGVZLCBtYWtlQWJzb2x1dGVcbiAgICAgICAgfTtcbiAgICB9XG4gICAgd3JpdGVNZWFzdXJlKG1lYXN1cmVkKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKG1lYXN1cmVkLm1ha2VBYnNvbHV0ZSkge1xuICAgICAgICAgICAgdGhpcy5tYWRlQWJzb2x1dGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgICAgIGZvciAobGV0IHQgb2YgdGhpcy5tYW5hZ2VyLnRvb2x0aXBWaWV3cylcbiAgICAgICAgICAgICAgICB0LmRvbS5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBlZGl0b3IsIHNwYWNlLCBzY2FsZVgsIHNjYWxlWSB9ID0gbWVhc3VyZWQ7XG4gICAgICAgIGxldCBvdGhlcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hbmFnZXIudG9vbHRpcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0b29sdGlwID0gdGhpcy5tYW5hZ2VyLnRvb2x0aXBzW2ldLCB0VmlldyA9IHRoaXMubWFuYWdlci50b29sdGlwVmlld3NbaV0sIHsgZG9tIH0gPSB0VmlldztcbiAgICAgICAgICAgIGxldCBwb3MgPSBtZWFzdXJlZC5wb3NbaV0sIHNpemUgPSBtZWFzdXJlZC5zaXplW2ldO1xuICAgICAgICAgICAgLy8gSGlkZSB0b29sdGlwcyB0aGF0IGFyZSBvdXRzaWRlIG9mIHRoZSBlZGl0b3IuXG4gICAgICAgICAgICBpZiAoIXBvcyB8fCBwb3MuYm90dG9tIDw9IE1hdGgubWF4KGVkaXRvci50b3AsIHNwYWNlLnRvcCkgfHxcbiAgICAgICAgICAgICAgICBwb3MudG9wID49IE1hdGgubWluKGVkaXRvci5ib3R0b20sIHNwYWNlLmJvdHRvbSkgfHxcbiAgICAgICAgICAgICAgICBwb3MucmlnaHQgPCBNYXRoLm1heChlZGl0b3IubGVmdCwgc3BhY2UubGVmdCkgLSAuMSB8fFxuICAgICAgICAgICAgICAgIHBvcy5sZWZ0ID4gTWF0aC5taW4oZWRpdG9yLnJpZ2h0LCBzcGFjZS5yaWdodCkgKyAuMSkge1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS50b3AgPSBPdXRzaWRlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGFycm93ID0gdG9vbHRpcC5hcnJvdyA/IHRWaWV3LmRvbS5xdWVyeVNlbGVjdG9yKFwiLmNtLXRvb2x0aXAtYXJyb3dcIikgOiBudWxsO1xuICAgICAgICAgICAgbGV0IGFycm93SGVpZ2h0ID0gYXJyb3cgPyA3IC8qIEFycm93LlNpemUgKi8gOiAwO1xuICAgICAgICAgICAgbGV0IHdpZHRoID0gc2l6ZS5yaWdodCAtIHNpemUubGVmdCwgaGVpZ2h0ID0gKF9hID0ga25vd25IZWlnaHQuZ2V0KHRWaWV3KSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogc2l6ZS5ib3R0b20gLSBzaXplLnRvcDtcbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSB0Vmlldy5vZmZzZXQgfHwgbm9PZmZzZXQsIGx0ciA9IHRoaXMudmlldy50ZXh0RGlyZWN0aW9uID09IERpcmVjdGlvbi5MVFI7XG4gICAgICAgICAgICBsZXQgbGVmdCA9IHNpemUud2lkdGggPiBzcGFjZS5yaWdodCAtIHNwYWNlLmxlZnQgPyAobHRyID8gc3BhY2UubGVmdCA6IHNwYWNlLnJpZ2h0IC0gc2l6ZS53aWR0aClcbiAgICAgICAgICAgICAgICA6IGx0ciA/IE1hdGgubWluKHBvcy5sZWZ0IC0gKGFycm93ID8gMTQgLyogQXJyb3cuT2Zmc2V0ICovIDogMCkgKyBvZmZzZXQueCwgc3BhY2UucmlnaHQgLSB3aWR0aClcbiAgICAgICAgICAgICAgICAgICAgOiBNYXRoLm1heChzcGFjZS5sZWZ0LCBwb3MubGVmdCAtIHdpZHRoICsgKGFycm93ID8gMTQgLyogQXJyb3cuT2Zmc2V0ICovIDogMCkgLSBvZmZzZXQueCk7XG4gICAgICAgICAgICBsZXQgYWJvdmUgPSB0aGlzLmFib3ZlW2ldO1xuICAgICAgICAgICAgaWYgKCF0b29sdGlwLnN0cmljdFNpZGUgJiYgKGFib3ZlXG4gICAgICAgICAgICAgICAgPyBwb3MudG9wIC0gKHNpemUuYm90dG9tIC0gc2l6ZS50b3ApIC0gb2Zmc2V0LnkgPCBzcGFjZS50b3BcbiAgICAgICAgICAgICAgICA6IHBvcy5ib3R0b20gKyAoc2l6ZS5ib3R0b20gLSBzaXplLnRvcCkgKyBvZmZzZXQueSA+IHNwYWNlLmJvdHRvbSkgJiZcbiAgICAgICAgICAgICAgICBhYm92ZSA9PSAoc3BhY2UuYm90dG9tIC0gcG9zLmJvdHRvbSA+IHBvcy50b3AgLSBzcGFjZS50b3ApKVxuICAgICAgICAgICAgICAgIGFib3ZlID0gdGhpcy5hYm92ZVtpXSA9ICFhYm92ZTtcbiAgICAgICAgICAgIGxldCBzcGFjZVZlcnQgPSAoYWJvdmUgPyBwb3MudG9wIC0gc3BhY2UudG9wIDogc3BhY2UuYm90dG9tIC0gcG9zLmJvdHRvbSkgLSBhcnJvd0hlaWdodDtcbiAgICAgICAgICAgIGlmIChzcGFjZVZlcnQgPCBoZWlnaHQgJiYgdFZpZXcucmVzaXplICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFjZVZlcnQgPCB0aGlzLnZpZXcuZGVmYXVsdExpbmVIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tLnN0eWxlLnRvcCA9IE91dHNpZGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBrbm93bkhlaWdodC5zZXQodFZpZXcsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLmhlaWdodCA9IChoZWlnaHQgPSBzcGFjZVZlcnQpIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9tLnN0eWxlLmhlaWdodCkge1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5oZWlnaHQgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRvcCA9IGFib3ZlID8gcG9zLnRvcCAtIGhlaWdodCAtIGFycm93SGVpZ2h0IC0gb2Zmc2V0LnkgOiBwb3MuYm90dG9tICsgYXJyb3dIZWlnaHQgKyBvZmZzZXQueTtcbiAgICAgICAgICAgIGxldCByaWdodCA9IGxlZnQgKyB3aWR0aDtcbiAgICAgICAgICAgIGlmICh0Vmlldy5vdmVybGFwICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2Ygb3RoZXJzKVxuICAgICAgICAgICAgICAgICAgICBpZiAoci5sZWZ0IDwgcmlnaHQgJiYgci5yaWdodCA+IGxlZnQgJiYgci50b3AgPCB0b3AgKyBoZWlnaHQgJiYgci5ib3R0b20gPiB0b3ApXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBhYm92ZSA/IHIudG9wIC0gaGVpZ2h0IC0gMiAtIGFycm93SGVpZ2h0IDogci5ib3R0b20gKyBhcnJvd0hlaWdodCArIDI7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PSBcImFic29sdXRlXCIpIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUudG9wID0gKHRvcCAtIG1lYXN1cmVkLnBhcmVudC50b3ApIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5sZWZ0ID0gKGxlZnQgLSBtZWFzdXJlZC5wYXJlbnQubGVmdCkgLyBzY2FsZVggKyBcInB4XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGUudG9wID0gdG9wIC8gc2NhbGVZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5sZWZ0ID0gbGVmdCAvIHNjYWxlWCArIFwicHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhcnJvdykge1xuICAgICAgICAgICAgICAgIGxldCBhcnJvd0xlZnQgPSBwb3MubGVmdCArIChsdHIgPyBvZmZzZXQueCA6IC1vZmZzZXQueCkgLSAobGVmdCArIDE0IC8qIEFycm93Lk9mZnNldCAqLyAtIDcgLyogQXJyb3cuU2l6ZSAqLyk7XG4gICAgICAgICAgICAgICAgYXJyb3cuc3R5bGUubGVmdCA9IGFycm93TGVmdCAvIHNjYWxlWCArIFwicHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0Vmlldy5vdmVybGFwICE9PSB0cnVlKVxuICAgICAgICAgICAgICAgIG90aGVycy5wdXNoKHsgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOiB0b3AgKyBoZWlnaHQgfSk7XG4gICAgICAgICAgICBkb20uY2xhc3NMaXN0LnRvZ2dsZShcImNtLXRvb2x0aXAtYWJvdmVcIiwgYWJvdmUpO1xuICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC50b2dnbGUoXCJjbS10b29sdGlwLWJlbG93XCIsICFhYm92ZSk7XG4gICAgICAgICAgICBpZiAodFZpZXcucG9zaXRpb25lZClcbiAgICAgICAgICAgICAgICB0Vmlldy5wb3NpdGlvbmVkKG1lYXN1cmVkLnNwYWNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtYXliZU1lYXN1cmUoKSB7XG4gICAgICAgIGlmICh0aGlzLm1hbmFnZXIudG9vbHRpcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3LmluVmlldylcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcucmVxdWVzdE1lYXN1cmUodGhpcy5tZWFzdXJlUmVxKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmluVmlldyAhPSB0aGlzLnZpZXcuaW5WaWV3KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pblZpZXcgPSB0aGlzLnZpZXcuaW5WaWV3O1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pblZpZXcpXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHR2IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAgICAgICAgICAgICB0di5kb20uc3R5bGUudG9wID0gT3V0c2lkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0sIHtcbiAgICBldmVudE9ic2VydmVyczoge1xuICAgICAgICBzY3JvbGwoKSB7IHRoaXMubWF5YmVNZWFzdXJlKCk7IH1cbiAgICB9XG59KTtcbmNvbnN0IGJhc2VUaGVtZSA9IC8qQF9fUFVSRV9fKi9FZGl0b3JWaWV3LmJhc2VUaGVtZSh7XG4gICAgXCIuY20tdG9vbHRpcFwiOiB7XG4gICAgICAgIHpJbmRleDogMTAwLFxuICAgICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tdG9vbHRpcFwiOiB7XG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgI2JiYlwiLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2Y1ZjVmNVwiXG4gICAgfSxcbiAgICBcIiZsaWdodCAuY20tdG9vbHRpcC1zZWN0aW9uOm5vdCg6Zmlyc3QtY2hpbGQpXCI6IHtcbiAgICAgICAgYm9yZGVyVG9wOiBcIjFweCBzb2xpZCAjYmJiXCIsXG4gICAgfSxcbiAgICBcIiZkYXJrIC5jbS10b29sdGlwXCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiMzMzMzMzhcIixcbiAgICAgICAgY29sb3I6IFwid2hpdGVcIlxuICAgIH0sXG4gICAgXCIuY20tdG9vbHRpcC1hcnJvd1wiOiB7XG4gICAgICAgIGhlaWdodDogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4YCxcbiAgICAgICAgd2lkdGg6IGAkezcgLyogQXJyb3cuU2l6ZSAqLyAqIDJ9cHhgLFxuICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICB6SW5kZXg6IC0xLFxuICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgICAgXCImOmJlZm9yZSwgJjphZnRlclwiOiB7XG4gICAgICAgICAgICBjb250ZW50OiBcIicnXCIsXG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICBib3JkZXJMZWZ0OiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgdHJhbnNwYXJlbnRgLFxuICAgICAgICAgICAgYm9yZGVyUmlnaHQ6IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCB0cmFuc3BhcmVudGAsXG4gICAgICAgIH0sXG4gICAgICAgIFwiLmNtLXRvb2x0aXAtYWJvdmUgJlwiOiB7XG4gICAgICAgICAgICBib3R0b206IGAtJHs3IC8qIEFycm93LlNpemUgKi99cHhgLFxuICAgICAgICAgICAgXCImOmJlZm9yZVwiOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyVG9wOiBgJHs3IC8qIEFycm93LlNpemUgKi99cHggc29saWQgI2JiYmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCImOmFmdGVyXCI6IHtcbiAgICAgICAgICAgICAgICBib3JkZXJUb3A6IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCAjZjVmNWY1YCxcbiAgICAgICAgICAgICAgICBib3R0b206IFwiMXB4XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCIuY20tdG9vbHRpcC1iZWxvdyAmXCI6IHtcbiAgICAgICAgICAgIHRvcDogYC0kezcgLyogQXJyb3cuU2l6ZSAqL31weGAsXG4gICAgICAgICAgICBcIiY6YmVmb3JlXCI6IHtcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IGAkezcgLyogQXJyb3cuU2l6ZSAqL31weCBzb2xpZCAjYmJiYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIiY6YWZ0ZXJcIjoge1xuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogYCR7NyAvKiBBcnJvdy5TaXplICovfXB4IHNvbGlkICNmNWY1ZjVgLFxuICAgICAgICAgICAgICAgIHRvcDogXCIxcHhcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0sXG4gICAgXCImZGFyayAuY20tdG9vbHRpcCAuY20tdG9vbHRpcC1hcnJvd1wiOiB7XG4gICAgICAgIFwiJjpiZWZvcmVcIjoge1xuICAgICAgICAgICAgYm9yZGVyVG9wQ29sb3I6IFwiIzMzMzMzOFwiLFxuICAgICAgICAgICAgYm9yZGVyQm90dG9tQ29sb3I6IFwiIzMzMzMzOFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiJjphZnRlclwiOiB7XG4gICAgICAgICAgICBib3JkZXJUb3BDb2xvcjogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAgICAgYm9yZGVyQm90dG9tQ29sb3I6IFwidHJhbnNwYXJlbnRcIlxuICAgICAgICB9XG4gICAgfVxufSk7XG5jb25zdCBub09mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuLyoqXG5GYWNldCB0byB3aGljaCBhbiBleHRlbnNpb24gY2FuIGFkZCBhIHZhbHVlIHRvIHNob3cgYSB0b29sdGlwLlxuKi9cbmNvbnN0IHNob3dUb29sdGlwID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgZW5hYmxlczogW3Rvb2x0aXBQbHVnaW4sIGJhc2VUaGVtZV1cbn0pO1xuY29uc3Qgc2hvd0hvdmVyVG9vbHRpcCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNsYXNzIEhvdmVyVG9vbHRpcEhvc3Qge1xuICAgIC8vIE5lZWRzIHRvIGJlIHN0YXRpYyBzbyB0aGF0IGhvc3QgdG9vbHRpcCBpbnN0YW5jZXMgYWx3YXlzIG1hdGNoXG4gICAgc3RhdGljIGNyZWF0ZSh2aWV3KSB7XG4gICAgICAgIHJldHVybiBuZXcgSG92ZXJUb29sdGlwSG9zdCh2aWV3KTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Iodmlldykge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc0xpc3QuYWRkKFwiY20tdG9vbHRpcC1ob3ZlclwiKTtcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gbmV3IFRvb2x0aXBWaWV3TWFuYWdlcih2aWV3LCBzaG93SG92ZXJUb29sdGlwLCB0ID0+IHRoaXMuY3JlYXRlSG9zdGVkVmlldyh0KSk7XG4gICAgfVxuICAgIGNyZWF0ZUhvc3RlZFZpZXcodG9vbHRpcCkge1xuICAgICAgICBsZXQgaG9zdGVkVmlldyA9IHRvb2x0aXAuY3JlYXRlKHRoaXMudmlldyk7XG4gICAgICAgIGhvc3RlZFZpZXcuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS10b29sdGlwLXNlY3Rpb25cIik7XG4gICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGhvc3RlZFZpZXcuZG9tKTtcbiAgICAgICAgaWYgKHRoaXMubW91bnRlZCAmJiBob3N0ZWRWaWV3Lm1vdW50KVxuICAgICAgICAgICAgaG9zdGVkVmlldy5tb3VudCh0aGlzLnZpZXcpO1xuICAgICAgICByZXR1cm4gaG9zdGVkVmlldztcbiAgICB9XG4gICAgbW91bnQodmlldykge1xuICAgICAgICBmb3IgKGxldCBob3N0ZWRWaWV3IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpIHtcbiAgICAgICAgICAgIGlmIChob3N0ZWRWaWV3Lm1vdW50KVxuICAgICAgICAgICAgICAgIGhvc3RlZFZpZXcubW91bnQodmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcG9zaXRpb25lZChzcGFjZSkge1xuICAgICAgICBmb3IgKGxldCBob3N0ZWRWaWV3IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpIHtcbiAgICAgICAgICAgIGlmIChob3N0ZWRWaWV3LnBvc2l0aW9uZWQpXG4gICAgICAgICAgICAgICAgaG9zdGVkVmlldy5wb3NpdGlvbmVkKHNwYWNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIHRoaXMubWFuYWdlci51cGRhdGUodXBkYXRlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMubWFuYWdlci50b29sdGlwVmlld3MpXG4gICAgICAgICAgICAoX2EgPSB0LmRlc3Ryb3kpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHQpO1xuICAgIH1cbiAgICBwYXNzUHJvcChuYW1lKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChsZXQgdmlldyBvZiB0aGlzLm1hbmFnZXIudG9vbHRpcFZpZXdzKSB7XG4gICAgICAgICAgICBsZXQgZ2l2ZW4gPSB2aWV3W25hbWVdO1xuICAgICAgICAgICAgaWYgKGdpdmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnaXZlbjtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPT0gZ2l2ZW4pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBnZXQgb2Zmc2V0KCkgeyByZXR1cm4gdGhpcy5wYXNzUHJvcChcIm9mZnNldFwiKTsgfVxuICAgIGdldCBnZXRDb29yZHMoKSB7IHJldHVybiB0aGlzLnBhc3NQcm9wKFwiZ2V0Q29vcmRzXCIpOyB9XG4gICAgZ2V0IG92ZXJsYXAoKSB7IHJldHVybiB0aGlzLnBhc3NQcm9wKFwib3ZlcmxhcFwiKTsgfVxuICAgIGdldCByZXNpemUoKSB7IHJldHVybiB0aGlzLnBhc3NQcm9wKFwicmVzaXplXCIpOyB9XG59XG5jb25zdCBzaG93SG92ZXJUb29sdGlwSG9zdCA9IC8qQF9fUFVSRV9fKi9zaG93VG9vbHRpcC5jb21wdXRlKFtzaG93SG92ZXJUb29sdGlwXSwgc3RhdGUgPT4ge1xuICAgIGxldCB0b29sdGlwcyA9IHN0YXRlLmZhY2V0KHNob3dIb3ZlclRvb2x0aXApLmZpbHRlcih0ID0+IHQpO1xuICAgIGlmICh0b29sdGlwcy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAgIHBvczogTWF0aC5taW4oLi4udG9vbHRpcHMubWFwKHQgPT4gdC5wb3MpKSxcbiAgICAgICAgZW5kOiBNYXRoLm1heCguLi50b29sdGlwcy5tYXAodCA9PiB7IHZhciBfYTsgcmV0dXJuIChfYSA9IHQuZW5kKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0LnBvczsgfSkpLFxuICAgICAgICBjcmVhdGU6IEhvdmVyVG9vbHRpcEhvc3QuY3JlYXRlLFxuICAgICAgICBhYm92ZTogdG9vbHRpcHNbMF0uYWJvdmUsXG4gICAgICAgIGFycm93OiB0b29sdGlwcy5zb21lKHQgPT4gdC5hcnJvdyksXG4gICAgfTtcbn0pO1xuY2xhc3MgSG92ZXJQbHVnaW4ge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIHNvdXJjZSwgZmllbGQsIHNldEhvdmVyLCBob3ZlclRpbWUpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDtcbiAgICAgICAgdGhpcy5zZXRIb3ZlciA9IHNldEhvdmVyO1xuICAgICAgICB0aGlzLmhvdmVyVGltZSA9IGhvdmVyVGltZTtcbiAgICAgICAgdGhpcy5ob3ZlclRpbWVvdXQgPSAtMTtcbiAgICAgICAgdGhpcy5yZXN0YXJ0VGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RNb3ZlID0geyB4OiAwLCB5OiAwLCB0YXJnZXQ6IHZpZXcuZG9tLCB0aW1lOiAwIH07XG4gICAgICAgIHRoaXMuY2hlY2tIb3ZlciA9IHRoaXMuY2hlY2tIb3Zlci5iaW5kKHRoaXMpO1xuICAgICAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCB0aGlzLm1vdXNlbGVhdmUgPSB0aGlzLm1vdXNlbGVhdmUuYmluZCh0aGlzKSk7XG4gICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3VzZW1vdmUgPSB0aGlzLm1vdXNlbW92ZS5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgdXBkYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzdGFydFRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy5yZXN0YXJ0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zdGFydEhvdmVyKCksIDIwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgYWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LnN0YXRlLmZpZWxkKHRoaXMuZmllbGQpO1xuICAgIH1cbiAgICBjaGVja0hvdmVyKCkge1xuICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IC0xO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBob3ZlcmVkID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdE1vdmUudGltZTtcbiAgICAgICAgaWYgKGhvdmVyZWQgPCB0aGlzLmhvdmVyVGltZSlcbiAgICAgICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLmNoZWNrSG92ZXIsIHRoaXMuaG92ZXJUaW1lIC0gaG92ZXJlZCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuc3RhcnRIb3ZlcigpO1xuICAgIH1cbiAgICBzdGFydEhvdmVyKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXN0YXJ0VGltZW91dCk7XG4gICAgICAgIGxldCB7IHZpZXcsIGxhc3RNb3ZlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuZG9jVmlldy5uZWFyZXN0KGxhc3RNb3ZlLnRhcmdldCk7XG4gICAgICAgIGlmICghZGVzYylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHBvcywgc2lkZSA9IDE7XG4gICAgICAgIGlmIChkZXNjIGluc3RhbmNlb2YgV2lkZ2V0Vmlldykge1xuICAgICAgICAgICAgcG9zID0gZGVzYy5wb3NBdFN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcG9zID0gdmlldy5wb3NBdENvb3JkcyhsYXN0TW92ZSk7XG4gICAgICAgICAgICBpZiAocG9zID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbGV0IHBvc0Nvb3JkcyA9IHZpZXcuY29vcmRzQXRQb3MocG9zKTtcbiAgICAgICAgICAgIGlmICghcG9zQ29vcmRzIHx8XG4gICAgICAgICAgICAgICAgbGFzdE1vdmUueSA8IHBvc0Nvb3Jkcy50b3AgfHwgbGFzdE1vdmUueSA+IHBvc0Nvb3Jkcy5ib3R0b20gfHxcbiAgICAgICAgICAgICAgICBsYXN0TW92ZS54IDwgcG9zQ29vcmRzLmxlZnQgLSB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aCB8fFxuICAgICAgICAgICAgICAgIGxhc3RNb3ZlLnggPiBwb3NDb29yZHMucmlnaHQgKyB2aWV3LmRlZmF1bHRDaGFyYWN0ZXJXaWR0aClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgYmlkaSA9IHZpZXcuYmlkaVNwYW5zKHZpZXcuc3RhdGUuZG9jLmxpbmVBdChwb3MpKS5maW5kKHMgPT4gcy5mcm9tIDw9IHBvcyAmJiBzLnRvID49IHBvcyk7XG4gICAgICAgICAgICBsZXQgcnRsID0gYmlkaSAmJiBiaWRpLmRpciA9PSBEaXJlY3Rpb24uUlRMID8gLTEgOiAxO1xuICAgICAgICAgICAgc2lkZSA9IChsYXN0TW92ZS54IDwgcG9zQ29vcmRzLmxlZnQgPyAtcnRsIDogcnRsKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlbiA9IHRoaXMuc291cmNlKHZpZXcsIHBvcywgc2lkZSk7XG4gICAgICAgIGlmIChvcGVuID09PSBudWxsIHx8IG9wZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wZW4udGhlbikge1xuICAgICAgICAgICAgbGV0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcgPSB7IHBvcyB9O1xuICAgICAgICAgICAgb3Blbi50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZyA9PSBwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdGhpcy5zZXRIb3Zlci5vZihyZXN1bHQpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGUgPT4gbG9nRXhjZXB0aW9uKHZpZXcuc3RhdGUsIGUsIFwiaG92ZXIgdG9vbHRpcFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3Blbikge1xuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2Yob3BlbikgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRvb2x0aXAoKSB7XG4gICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLnZpZXcucGx1Z2luKHRvb2x0aXBQbHVnaW4pO1xuICAgICAgICBsZXQgaW5kZXggPSBwbHVnaW4gPyBwbHVnaW4ubWFuYWdlci50b29sdGlwcy5maW5kSW5kZXgodCA9PiB0LmNyZWF0ZSA9PSBIb3ZlclRvb2x0aXBIb3N0LmNyZWF0ZSkgOiAtMTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID4gLTEgPyBwbHVnaW4ubWFuYWdlci50b29sdGlwVmlld3NbaW5kZXhdIDogbnVsbDtcbiAgICB9XG4gICAgbW91c2Vtb3ZlKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5sYXN0TW92ZSA9IHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSwgdGFyZ2V0OiBldmVudC50YXJnZXQsIHRpbWU6IERhdGUubm93KCkgfTtcbiAgICAgICAgaWYgKHRoaXMuaG92ZXJUaW1lb3V0IDwgMClcbiAgICAgICAgICAgIHRoaXMuaG92ZXJUaW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLmNoZWNrSG92ZXIsIHRoaXMuaG92ZXJUaW1lKTtcbiAgICAgICAgbGV0IHsgYWN0aXZlLCB0b29sdGlwIH0gPSB0aGlzO1xuICAgICAgICBpZiAoYWN0aXZlICYmIHRvb2x0aXAgJiYgIWlzSW5Ub29sdGlwKHRvb2x0aXAuZG9tLCBldmVudCkgfHwgdGhpcy5wZW5kaW5nKSB7XG4gICAgICAgICAgICBsZXQgeyBwb3MgfSA9IGFjdGl2ZSB8fCB0aGlzLnBlbmRpbmcsIGVuZCA9IChfYSA9IGFjdGl2ZSA9PT0gbnVsbCB8fCBhY3RpdmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjdGl2ZS5lbmQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHBvcztcbiAgICAgICAgICAgIGlmICgocG9zID09IGVuZCA/IHRoaXMudmlldy5wb3NBdENvb3Jkcyh0aGlzLmxhc3RNb3ZlKSAhPSBwb3NcbiAgICAgICAgICAgICAgICA6ICFpc092ZXJSYW5nZSh0aGlzLnZpZXcsIHBvcywgZW5kLCBldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB0aGlzLnNldEhvdmVyLm9mKG51bGwpIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW91c2VsZWF2ZShldmVudCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ob3ZlclRpbWVvdXQpO1xuICAgICAgICB0aGlzLmhvdmVyVGltZW91dCA9IC0xO1xuICAgICAgICBsZXQgeyBhY3RpdmUgfSA9IHRoaXM7XG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICAgIGxldCB7IHRvb2x0aXAgfSA9IHRoaXM7XG4gICAgICAgICAgICBsZXQgaW5Ub29sdGlwID0gdG9vbHRpcCAmJiB0b29sdGlwLmRvbS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgICAgIGlmICghaW5Ub29sdGlwKVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YobnVsbCkgfSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy53YXRjaFRvb2x0aXBMZWF2ZSh0b29sdGlwLmRvbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2F0Y2hUb29sdGlwTGVhdmUodG9vbHRpcCkge1xuICAgICAgICBsZXQgd2F0Y2ggPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRvb2x0aXAucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgd2F0Y2gpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlICYmICF0aGlzLnZpZXcuZG9tLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKVxuICAgICAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IHRoaXMuc2V0SG92ZXIub2YobnVsbCkgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRvb2x0aXAuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgd2F0Y2gpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ob3ZlclRpbWVvdXQpO1xuICAgICAgICB0aGlzLnZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHRoaXMubW91c2VsZWF2ZSk7XG4gICAgICAgIHRoaXMudmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdXNlbW92ZSk7XG4gICAgfVxufVxuY29uc3QgdG9vbHRpcE1hcmdpbiA9IDQ7XG5mdW5jdGlvbiBpc0luVG9vbHRpcCh0b29sdGlwLCBldmVudCkge1xuICAgIGxldCByZWN0ID0gdG9vbHRpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gZXZlbnQuY2xpZW50WCA+PSByZWN0LmxlZnQgLSB0b29sdGlwTWFyZ2luICYmIGV2ZW50LmNsaWVudFggPD0gcmVjdC5yaWdodCArIHRvb2x0aXBNYXJnaW4gJiZcbiAgICAgICAgZXZlbnQuY2xpZW50WSA+PSByZWN0LnRvcCAtIHRvb2x0aXBNYXJnaW4gJiYgZXZlbnQuY2xpZW50WSA8PSByZWN0LmJvdHRvbSArIHRvb2x0aXBNYXJnaW47XG59XG5mdW5jdGlvbiBpc092ZXJSYW5nZSh2aWV3LCBmcm9tLCB0bywgeCwgeSwgbWFyZ2luKSB7XG4gICAgbGV0IHJlY3QgPSB2aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgZG9jQm90dG9tID0gdmlldy5kb2N1bWVudFRvcCArIHZpZXcuZG9jdW1lbnRQYWRkaW5nLnRvcCArIHZpZXcuY29udGVudEhlaWdodDtcbiAgICBpZiAocmVjdC5sZWZ0ID4geCB8fCByZWN0LnJpZ2h0IDwgeCB8fCByZWN0LnRvcCA+IHkgfHwgTWF0aC5taW4ocmVjdC5ib3R0b20sIGRvY0JvdHRvbSkgPCB5KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHBvcyA9IHZpZXcucG9zQXRDb29yZHMoeyB4LCB5IH0sIGZhbHNlKTtcbiAgICByZXR1cm4gcG9zID49IGZyb20gJiYgcG9zIDw9IHRvO1xufVxuLyoqXG5TZXQgdXAgYSBob3ZlciB0b29sdGlwLCB3aGljaCBzaG93cyB1cCB3aGVuIHRoZSBwb2ludGVyIGhvdmVyc1xub3ZlciByYW5nZXMgb2YgdGV4dC4gVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBtb3VzZSBob3ZlcnNcbm92ZXIgdGhlIGRvY3VtZW50IHRleHQuIEl0IHNob3VsZCwgaWYgdGhlcmUgaXMgYSB0b29sdGlwXG5hc3NvY2lhdGVkIHdpdGggcG9zaXRpb24gYHBvc2AsIHJldHVybiB0aGUgdG9vbHRpcCBkZXNjcmlwdGlvblxuKGVpdGhlciBkaXJlY3RseSBvciBpbiBhIHByb21pc2UpLiBUaGUgYHNpZGVgIGFyZ3VtZW50IGluZGljYXRlc1xub24gd2hpY2ggc2lkZSBvZiB0aGUgcG9zaXRpb24gdGhlIHBvaW50ZXIgaXNcdTIwMTRpdCB3aWxsIGJlIC0xIGlmIHRoZVxucG9pbnRlciBpcyBiZWZvcmUgdGhlIHBvc2l0aW9uLCAxIGlmIGFmdGVyIHRoZSBwb3NpdGlvbi5cblxuTm90ZSB0aGF0IGFsbCBob3ZlciB0b29sdGlwcyBhcmUgaG9zdGVkIHdpdGhpbiBhIHNpbmdsZSB0b29sdGlwXG5jb250YWluZXIgZWxlbWVudC4gVGhpcyBhbGxvd3MgbXVsdGlwbGUgdG9vbHRpcHMgb3ZlciB0aGUgc2FtZVxucmFuZ2UgdG8gYmUgXCJtZXJnZWRcIiB0b2dldGhlciB3aXRob3V0IG92ZXJsYXBwaW5nLlxuKi9cbmZ1bmN0aW9uIGhvdmVyVG9vbHRpcChzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBzZXRIb3ZlciA9IFN0YXRlRWZmZWN0LmRlZmluZSgpO1xuICAgIGxldCBob3ZlclN0YXRlID0gU3RhdGVGaWVsZC5kZWZpbmUoe1xuICAgICAgICBjcmVhdGUoKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICB1cGRhdGUodmFsdWUsIHRyKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgKG9wdGlvbnMuaGlkZU9uQ2hhbmdlICYmICh0ci5kb2NDaGFuZ2VkIHx8IHRyLnNlbGVjdGlvbikgfHxcbiAgICAgICAgICAgICAgICBvcHRpb25zLmhpZGVPbiAmJiBvcHRpb25zLmhpZGVPbih0ciwgdmFsdWUpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0ci5kb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1BvcyA9IHRyLmNoYW5nZXMubWFwUG9zKHZhbHVlLnBvcywgLTEsIE1hcE1vZGUuVHJhY2tEZWwpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdQb3MgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGNvcHkgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjb3B5LnBvcyA9IG5ld1BvcztcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuZW5kICE9IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGNvcHkuZW5kID0gdHIuY2hhbmdlcy5tYXBQb3ModmFsdWUuZW5kKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvcHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgdHIuZWZmZWN0cykge1xuICAgICAgICAgICAgICAgIGlmIChlZmZlY3QuaXMoc2V0SG92ZXIpKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVmZmVjdC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0LmlzKGNsb3NlSG92ZXJUb29sdGlwRWZmZWN0KSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBwcm92aWRlOiBmID0+IHNob3dIb3ZlclRvb2x0aXAuZnJvbShmKVxuICAgIH0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIGhvdmVyU3RhdGUsXG4gICAgICAgIFZpZXdQbHVnaW4uZGVmaW5lKHZpZXcgPT4gbmV3IEhvdmVyUGx1Z2luKHZpZXcsIHNvdXJjZSwgaG92ZXJTdGF0ZSwgc2V0SG92ZXIsIG9wdGlvbnMuaG92ZXJUaW1lIHx8IDMwMCAvKiBIb3Zlci5UaW1lICovKSksXG4gICAgICAgIHNob3dIb3ZlclRvb2x0aXBIb3N0XG4gICAgXTtcbn1cbi8qKlxuR2V0IHRoZSBhY3RpdmUgdG9vbHRpcCB2aWV3IGZvciBhIGdpdmVuIHRvb2x0aXAsIGlmIGF2YWlsYWJsZS5cbiovXG5mdW5jdGlvbiBnZXRUb29sdGlwKHZpZXcsIHRvb2x0aXApIHtcbiAgICBsZXQgcGx1Z2luID0gdmlldy5wbHVnaW4odG9vbHRpcFBsdWdpbik7XG4gICAgaWYgKCFwbHVnaW4pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBmb3VuZCA9IHBsdWdpbi5tYW5hZ2VyLnRvb2x0aXBzLmluZGV4T2YodG9vbHRpcCk7XG4gICAgcmV0dXJuIGZvdW5kIDwgMCA/IG51bGwgOiBwbHVnaW4ubWFuYWdlci50b29sdGlwVmlld3NbZm91bmRdO1xufVxuLyoqXG5SZXR1cm5zIHRydWUgaWYgYW55IGhvdmVyIHRvb2x0aXBzIGFyZSBjdXJyZW50bHkgYWN0aXZlLlxuKi9cbmZ1bmN0aW9uIGhhc0hvdmVyVG9vbHRpcHMoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuZmFjZXQoc2hvd0hvdmVyVG9vbHRpcCkuc29tZSh4ID0+IHgpO1xufVxuY29uc3QgY2xvc2VIb3ZlclRvb2x0aXBFZmZlY3QgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG4vKipcblRyYW5zYWN0aW9uIGVmZmVjdCB0aGF0IGNsb3NlcyBhbGwgaG92ZXIgdG9vbHRpcHMuXG4qL1xuY29uc3QgY2xvc2VIb3ZlclRvb2x0aXBzID0gLypAX19QVVJFX18qL2Nsb3NlSG92ZXJUb29sdGlwRWZmZWN0Lm9mKG51bGwpO1xuLyoqXG5UZWxsIHRoZSB0b29sdGlwIGV4dGVuc2lvbiB0byByZWNvbXB1dGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBhY3RpdmVcbnRvb2x0aXBzLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBzb21ldGhpbmcgaGFwcGVucyAoc3VjaCBhcyBhXG5yZS1wb3NpdGlvbmluZyBvciBDU1MgY2hhbmdlIGFmZmVjdGluZyB0aGUgZWRpdG9yKSB0aGF0IGNvdWxkXG5pbnZhbGlkYXRlIHRoZSBleGlzdGluZyB0b29sdGlwIHBvc2l0aW9ucy5cbiovXG5mdW5jdGlvbiByZXBvc2l0aW9uVG9vbHRpcHModmlldykge1xuICAgIGxldCBwbHVnaW4gPSB2aWV3LnBsdWdpbih0b29sdGlwUGx1Z2luKTtcbiAgICBpZiAocGx1Z2luKVxuICAgICAgICBwbHVnaW4ubWF5YmVNZWFzdXJlKCk7XG59XG5cbmNvbnN0IHBhbmVsQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZShjb25maWdzKSB7XG4gICAgICAgIGxldCB0b3BDb250YWluZXIsIGJvdHRvbUNvbnRhaW5lcjtcbiAgICAgICAgZm9yIChsZXQgYyBvZiBjb25maWdzKSB7XG4gICAgICAgICAgICB0b3BDb250YWluZXIgPSB0b3BDb250YWluZXIgfHwgYy50b3BDb250YWluZXI7XG4gICAgICAgICAgICBib3R0b21Db250YWluZXIgPSBib3R0b21Db250YWluZXIgfHwgYy5ib3R0b21Db250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdG9wQ29udGFpbmVyLCBib3R0b21Db250YWluZXIgfTtcbiAgICB9XG59KTtcbi8qKlxuQ29uZmlndXJlcyB0aGUgcGFuZWwtbWFuYWdpbmcgZXh0ZW5zaW9uLlxuKi9cbmZ1bmN0aW9uIHBhbmVscyhjb25maWcpIHtcbiAgICByZXR1cm4gY29uZmlnID8gW3BhbmVsQ29uZmlnLm9mKGNvbmZpZyldIDogW107XG59XG4vKipcbkdldCB0aGUgYWN0aXZlIHBhbmVsIGNyZWF0ZWQgYnkgdGhlIGdpdmVuIGNvbnN0cnVjdG9yLCBpZiBhbnkuXG5UaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB5b3UgbmVlZCBhY2Nlc3MgdG8geW91ciBwYW5lbHMnIERPTVxuc3RydWN0dXJlLlxuKi9cbmZ1bmN0aW9uIGdldFBhbmVsKHZpZXcsIHBhbmVsKSB7XG4gICAgbGV0IHBsdWdpbiA9IHZpZXcucGx1Z2luKHBhbmVsUGx1Z2luKTtcbiAgICBsZXQgaW5kZXggPSBwbHVnaW4gPyBwbHVnaW4uc3BlY3MuaW5kZXhPZihwYW5lbCkgOiAtMTtcbiAgICByZXR1cm4gaW5kZXggPiAtMSA/IHBsdWdpbi5wYW5lbHNbaW5kZXhdIDogbnVsbDtcbn1cbmNvbnN0IHBhbmVsUGx1Z2luID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSB2aWV3LnN0YXRlLmZhY2V0KHNob3dQYW5lbCk7XG4gICAgICAgIHRoaXMuc3BlY3MgPSB0aGlzLmlucHV0LmZpbHRlcihzID0+IHMpO1xuICAgICAgICB0aGlzLnBhbmVscyA9IHRoaXMuc3BlY3MubWFwKHNwZWMgPT4gc3BlYyh2aWV3KSk7XG4gICAgICAgIGxldCBjb25mID0gdmlldy5zdGF0ZS5mYWNldChwYW5lbENvbmZpZyk7XG4gICAgICAgIHRoaXMudG9wID0gbmV3IFBhbmVsR3JvdXAodmlldywgdHJ1ZSwgY29uZi50b3BDb250YWluZXIpO1xuICAgICAgICB0aGlzLmJvdHRvbSA9IG5ldyBQYW5lbEdyb3VwKHZpZXcsIGZhbHNlLCBjb25mLmJvdHRvbUNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMudG9wLnN5bmModGhpcy5wYW5lbHMuZmlsdGVyKHAgPT4gcC50b3ApKTtcbiAgICAgICAgdGhpcy5ib3R0b20uc3luYyh0aGlzLnBhbmVscy5maWx0ZXIocCA9PiAhcC50b3ApKTtcbiAgICAgICAgZm9yIChsZXQgcCBvZiB0aGlzLnBhbmVscykge1xuICAgICAgICAgICAgcC5kb20uY2xhc3NMaXN0LmFkZChcImNtLXBhbmVsXCIpO1xuICAgICAgICAgICAgaWYgKHAubW91bnQpXG4gICAgICAgICAgICAgICAgcC5tb3VudCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IGNvbmYgPSB1cGRhdGUuc3RhdGUuZmFjZXQocGFuZWxDb25maWcpO1xuICAgICAgICBpZiAodGhpcy50b3AuY29udGFpbmVyICE9IGNvbmYudG9wQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnRvcC5zeW5jKFtdKTtcbiAgICAgICAgICAgIHRoaXMudG9wID0gbmV3IFBhbmVsR3JvdXAodXBkYXRlLnZpZXcsIHRydWUsIGNvbmYudG9wQ29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ib3R0b20uY29udGFpbmVyICE9IGNvbmYuYm90dG9tQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbS5zeW5jKFtdKTtcbiAgICAgICAgICAgIHRoaXMuYm90dG9tID0gbmV3IFBhbmVsR3JvdXAodXBkYXRlLnZpZXcsIGZhbHNlLCBjb25mLmJvdHRvbUNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b3Auc3luY0NsYXNzZXMoKTtcbiAgICAgICAgdGhpcy5ib3R0b20uc3luY0NsYXNzZXMoKTtcbiAgICAgICAgbGV0IGlucHV0ID0gdXBkYXRlLnN0YXRlLmZhY2V0KHNob3dQYW5lbCk7XG4gICAgICAgIGlmIChpbnB1dCAhPSB0aGlzLmlucHV0KSB7XG4gICAgICAgICAgICBsZXQgc3BlY3MgPSBpbnB1dC5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgICAgIGxldCBwYW5lbHMgPSBbXSwgdG9wID0gW10sIGJvdHRvbSA9IFtdLCBtb3VudCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgc3BlYyBvZiBzcGVjcykge1xuICAgICAgICAgICAgICAgIGxldCBrbm93biA9IHRoaXMuc3BlY3MuaW5kZXhPZihzcGVjKSwgcGFuZWw7XG4gICAgICAgICAgICAgICAgaWYgKGtub3duIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbCA9IHNwZWModXBkYXRlLnZpZXcpO1xuICAgICAgICAgICAgICAgICAgICBtb3VudC5wdXNoKHBhbmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsID0gdGhpcy5wYW5lbHNba25vd25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFuZWwudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhbmVscy5wdXNoKHBhbmVsKTtcbiAgICAgICAgICAgICAgICAocGFuZWwudG9wID8gdG9wIDogYm90dG9tKS5wdXNoKHBhbmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3BlY3MgPSBzcGVjcztcbiAgICAgICAgICAgIHRoaXMucGFuZWxzID0gcGFuZWxzO1xuICAgICAgICAgICAgdGhpcy50b3Auc3luYyh0b3ApO1xuICAgICAgICAgICAgdGhpcy5ib3R0b20uc3luYyhib3R0b20pO1xuICAgICAgICAgICAgZm9yIChsZXQgcCBvZiBtb3VudCkge1xuICAgICAgICAgICAgICAgIHAuZG9tLmNsYXNzTGlzdC5hZGQoXCJjbS1wYW5lbFwiKTtcbiAgICAgICAgICAgICAgICBpZiAocC5tb3VudClcbiAgICAgICAgICAgICAgICAgICAgcC5tb3VudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgcCBvZiB0aGlzLnBhbmVscylcbiAgICAgICAgICAgICAgICBpZiAocC51cGRhdGUpXG4gICAgICAgICAgICAgICAgICAgIHAudXBkYXRlKHVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy50b3Auc3luYyhbXSk7XG4gICAgICAgIHRoaXMuYm90dG9tLnN5bmMoW10pO1xuICAgIH1cbn0sIHtcbiAgICBwcm92aWRlOiBwbHVnaW4gPT4gRWRpdG9yVmlldy5zY3JvbGxNYXJnaW5zLm9mKHZpZXcgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSB2aWV3LnBsdWdpbihwbHVnaW4pO1xuICAgICAgICByZXR1cm4gdmFsdWUgJiYgeyB0b3A6IHZhbHVlLnRvcC5zY3JvbGxNYXJnaW4oKSwgYm90dG9tOiB2YWx1ZS5ib3R0b20uc2Nyb2xsTWFyZ2luKCkgfTtcbiAgICB9KVxufSk7XG5jbGFzcyBQYW5lbEdyb3VwIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCB0b3AsIGNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICAgIHRoaXMuZG9tID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNsYXNzZXMgPSBcIlwiO1xuICAgICAgICB0aGlzLnBhbmVscyA9IFtdO1xuICAgICAgICB0aGlzLnN5bmNDbGFzc2VzKCk7XG4gICAgfVxuICAgIHN5bmMocGFuZWxzKSB7XG4gICAgICAgIGZvciAobGV0IHAgb2YgdGhpcy5wYW5lbHMpXG4gICAgICAgICAgICBpZiAocC5kZXN0cm95ICYmIHBhbmVscy5pbmRleE9mKHApIDwgMClcbiAgICAgICAgICAgICAgICBwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSBwYW5lbHM7XG4gICAgICAgIHRoaXMuc3luY0RPTSgpO1xuICAgIH1cbiAgICBzeW5jRE9NKCkge1xuICAgICAgICBpZiAodGhpcy5wYW5lbHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgICAgICAgIHRoaXMuZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IHRoaXMudG9wID8gXCJjbS1wYW5lbHMgY20tcGFuZWxzLXRvcFwiIDogXCJjbS1wYW5lbHMgY20tcGFuZWxzLWJvdHRvbVwiO1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGVbdGhpcy50b3AgPyBcInRvcFwiIDogXCJib3R0b21cIl0gPSBcIjBcIjtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmNvbnRhaW5lciB8fCB0aGlzLnZpZXcuZG9tO1xuICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLmRvbSwgdGhpcy50b3AgPyBwYXJlbnQuZmlyc3RDaGlsZCA6IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdXJET00gPSB0aGlzLmRvbS5maXJzdENoaWxkO1xuICAgICAgICBmb3IgKGxldCBwYW5lbCBvZiB0aGlzLnBhbmVscykge1xuICAgICAgICAgICAgaWYgKHBhbmVsLmRvbS5wYXJlbnROb2RlID09IHRoaXMuZG9tKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1ckRPTSAhPSBwYW5lbC5kb20pXG4gICAgICAgICAgICAgICAgICAgIGN1ckRPTSA9IHJtKGN1ckRPTSk7XG4gICAgICAgICAgICAgICAgY3VyRE9NID0gY3VyRE9NLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb20uaW5zZXJ0QmVmb3JlKHBhbmVsLmRvbSwgY3VyRE9NKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoY3VyRE9NKVxuICAgICAgICAgICAgY3VyRE9NID0gcm0oY3VyRE9NKTtcbiAgICB9XG4gICAgc2Nyb2xsTWFyZ2luKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuZG9tIHx8IHRoaXMuY29udGFpbmVyID8gMFxuICAgICAgICAgICAgOiBNYXRoLm1heCgwLCB0aGlzLnRvcCA/XG4gICAgICAgICAgICAgICAgdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIC0gTWF0aC5tYXgoMCwgdGhpcy52aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ApIDpcbiAgICAgICAgICAgICAgICBNYXRoLm1pbihpbm5lckhlaWdodCwgdGhpcy52aWV3LnNjcm9sbERPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20pIC0gdGhpcy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wKTtcbiAgICB9XG4gICAgc3luY0NsYXNzZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb250YWluZXIgfHwgdGhpcy5jbGFzc2VzID09IHRoaXMudmlldy50aGVtZUNsYXNzZXMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZvciAobGV0IGNscyBvZiB0aGlzLmNsYXNzZXMuc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKGNscyk7XG4gICAgICAgIGZvciAobGV0IGNscyBvZiAodGhpcy5jbGFzc2VzID0gdGhpcy52aWV3LnRoZW1lQ2xhc3Nlcykuc3BsaXQoXCIgXCIpKVxuICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGNscyk7XG4gICAgfVxufVxuZnVuY3Rpb24gcm0obm9kZSkge1xuICAgIGxldCBuZXh0ID0gbm9kZS5uZXh0U2libGluZztcbiAgICBub2RlLnJlbW92ZSgpO1xuICAgIHJldHVybiBuZXh0O1xufVxuLyoqXG5PcGVuaW5nIGEgcGFuZWwgaXMgZG9uZSBieSBwcm92aWRpbmcgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3JcbnRoZSBwYW5lbCB0aHJvdWdoIHRoaXMgZmFjZXQuIChUaGUgcGFuZWwgaXMgY2xvc2VkIGFnYWluIHdoZW4gaXRzXG5jb25zdHJ1Y3RvciBpcyBubyBsb25nZXIgcHJvdmlkZWQuKSBWYWx1ZXMgb2YgYG51bGxgIGFyZSBpZ25vcmVkLlxuKi9cbmNvbnN0IHNob3dQYW5lbCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGVuYWJsZXM6IHBhbmVsUGx1Z2luXG59KTtcblxuLyoqXG5BIGd1dHRlciBtYXJrZXIgcmVwcmVzZW50cyBhIGJpdCBvZiBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byBhIGxpbmVcbmluIGEgc3BlY2lmaWMgZ3V0dGVyLiBZb3VyIG93biBjdXN0b20gbWFya2VycyBoYXZlIHRvIGV4dGVuZCB0aGlzXG5jbGFzcy5cbiovXG5jbGFzcyBHdXR0ZXJNYXJrZXIgZXh0ZW5kcyBSYW5nZVZhbHVlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhcmUob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHwgdGhpcy5jb25zdHJ1Y3RvciA9PSBvdGhlci5jb25zdHJ1Y3RvciAmJiB0aGlzLmVxKG90aGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIG1hcmtlciB0byBhbm90aGVyIG1hcmtlciBvZiB0aGUgc2FtZSB0eXBlLlxuICAgICovXG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLyoqXG4gICAgQ2FsbGVkIGlmIHRoZSBtYXJrZXIgaGFzIGEgYHRvRE9NYCBtZXRob2QgYW5kIGl0cyByZXByZXNlbnRhdGlvblxuICAgIHdhcyByZW1vdmVkIGZyb20gYSBndXR0ZXIuXG4gICAgKi9cbiAgICBkZXN0cm95KGRvbSkgeyB9XG59XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLmVsZW1lbnRDbGFzcyA9IFwiXCI7XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLnRvRE9NID0gdW5kZWZpbmVkO1xuR3V0dGVyTWFya2VyLnByb3RvdHlwZS5tYXBNb2RlID0gTWFwTW9kZS5UcmFja0JlZm9yZTtcbkd1dHRlck1hcmtlci5wcm90b3R5cGUuc3RhcnRTaWRlID0gR3V0dGVyTWFya2VyLnByb3RvdHlwZS5lbmRTaWRlID0gLTE7XG5HdXR0ZXJNYXJrZXIucHJvdG90eXBlLnBvaW50ID0gdHJ1ZTtcbi8qKlxuRmFjZXQgdXNlZCB0byBhZGQgYSBjbGFzcyB0byBhbGwgZ3V0dGVyIGVsZW1lbnRzIGZvciBhIGdpdmVuIGxpbmUuXG5NYXJrZXJzIGdpdmVuIHRvIHRoaXMgZmFjZXQgc2hvdWxkIF9vbmx5XyBkZWZpbmUgYW5cbltgZWxlbWVudGNsYXNzYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3Lkd1dHRlck1hcmtlci5lbGVtZW50Q2xhc3MpLCBub3QgYVxuW2B0b0RPTWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5HdXR0ZXJNYXJrZXIudG9ET00pIChvciB0aGUgbWFya2VyIHdpbGwgYXBwZWFyXG5pbiBhbGwgZ3V0dGVycyBmb3IgdGhlIGxpbmUpLlxuKi9cbmNvbnN0IGd1dHRlckxpbmVDbGFzcyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGRlZmF1bHRzID0ge1xuICAgIGNsYXNzOiBcIlwiLFxuICAgIHJlbmRlckVtcHR5RWxlbWVudHM6IGZhbHNlLFxuICAgIGVsZW1lbnRTdHlsZTogXCJcIixcbiAgICBtYXJrZXJzOiAoKSA9PiBSYW5nZVNldC5lbXB0eSxcbiAgICBsaW5lTWFya2VyOiAoKSA9PiBudWxsLFxuICAgIHdpZGdldE1hcmtlcjogKCkgPT4gbnVsbCxcbiAgICBsaW5lTWFya2VyQ2hhbmdlOiBudWxsLFxuICAgIGluaXRpYWxTcGFjZXI6IG51bGwsXG4gICAgdXBkYXRlU3BhY2VyOiBudWxsLFxuICAgIGRvbUV2ZW50SGFuZGxlcnM6IHt9XG59O1xuY29uc3QgYWN0aXZlR3V0dGVycyA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbi8qKlxuRGVmaW5lIGFuIGVkaXRvciBndXR0ZXIuIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgZ3V0dGVycyBhcHBlYXIgaXNcbmRldGVybWluZWQgYnkgdGhlaXIgZXh0ZW5zaW9uIHByaW9yaXR5LlxuKi9cbmZ1bmN0aW9uIGd1dHRlcihjb25maWcpIHtcbiAgICByZXR1cm4gW2d1dHRlcnMoKSwgYWN0aXZlR3V0dGVycy5vZihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzKSwgY29uZmlnKSldO1xufVxuY29uc3QgdW5maXhHdXR0ZXJzID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZTogdmFsdWVzID0+IHZhbHVlcy5zb21lKHggPT4geClcbn0pO1xuLyoqXG5UaGUgZ3V0dGVyLWRyYXdpbmcgcGx1Z2luIGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCB3aGVuIHlvdSBhZGQgYVxuZ3V0dGVyLCBidXQgeW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBleHBsaWNpdGx5IGNvbmZpZ3VyZSBpdC5cblxuVW5sZXNzIGBmaXhlZGAgaXMgZXhwbGljaXRseSBzZXQgdG8gYGZhbHNlYCwgdGhlIGd1dHRlcnMgYXJlXG5maXhlZCwgbWVhbmluZyB0aGV5IGRvbid0IHNjcm9sbCBhbG9uZyB3aXRoIHRoZSBjb250ZW50XG5ob3Jpem9udGFsbHkgKGV4Y2VwdCBvbiBJbnRlcm5ldCBFeHBsb3Jlciwgd2hpY2ggZG9lc24ndCBzdXBwb3J0XG5DU1MgW2Bwb3NpdGlvbjpcbnN0aWNreWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9wb3NpdGlvbiNzdGlja3kpKS5cbiovXG5mdW5jdGlvbiBndXR0ZXJzKGNvbmZpZykge1xuICAgIGxldCByZXN1bHQgPSBbXG4gICAgICAgIGd1dHRlclZpZXcsXG4gICAgXTtcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5maXhlZCA9PT0gZmFsc2UpXG4gICAgICAgIHJlc3VsdC5wdXNoKHVuZml4R3V0dGVycy5vZih0cnVlKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IGd1dHRlclZpZXcgPSAvKkBfX1BVUkVfXyovVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5wcmV2Vmlld3BvcnQgPSB2aWV3LnZpZXdwb3J0O1xuICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tZ3V0dGVyc1wiO1xuICAgICAgICB0aGlzLmRvbS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIHRoaXMuZG9tLnN0eWxlLm1pbkhlaWdodCA9ICh0aGlzLnZpZXcuY29udGVudEhlaWdodCAvIHRoaXMudmlldy5zY2FsZVkpICsgXCJweFwiO1xuICAgICAgICB0aGlzLmd1dHRlcnMgPSB2aWV3LnN0YXRlLmZhY2V0KGFjdGl2ZUd1dHRlcnMpLm1hcChjb25mID0+IG5ldyBTaW5nbGVHdXR0ZXJWaWV3KHZpZXcsIGNvbmYpKTtcbiAgICAgICAgZm9yIChsZXQgZ3V0dGVyIG9mIHRoaXMuZ3V0dGVycylcbiAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGd1dHRlci5kb20pO1xuICAgICAgICB0aGlzLmZpeGVkID0gIXZpZXcuc3RhdGUuZmFjZXQodW5maXhHdXR0ZXJzKTtcbiAgICAgICAgaWYgKHRoaXMuZml4ZWQpIHtcbiAgICAgICAgICAgIC8vIEZJWE1FIElFMTEgZmFsbGJhY2ssIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBwb3NpdGlvbjogc3RpY2t5LFxuICAgICAgICAgICAgLy8gYnkgdXNpbmcgcG9zaXRpb246IHJlbGF0aXZlICsgZXZlbnQgaGFuZGxlcnMgdGhhdCByZWFsaWduIHRoZVxuICAgICAgICAgICAgLy8gZ3V0dGVyIChvciBqdXN0IGZvcmNlIGZpeGVkPWZhbHNlIG9uIElFMTE/KVxuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUucG9zaXRpb24gPSBcInN0aWNreVwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luY0d1dHRlcnMoZmFsc2UpO1xuICAgICAgICB2aWV3LnNjcm9sbERPTS5pbnNlcnRCZWZvcmUodGhpcy5kb20sIHZpZXcuY29udGVudERPTSk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlR3V0dGVycyh1cGRhdGUpKSB7XG4gICAgICAgICAgICAvLyBEZXRhY2ggZHVyaW5nIHN5bmMgd2hlbiB0aGUgdmlld3BvcnQgY2hhbmdlZCBzaWduaWZpY2FudGx5XG4gICAgICAgICAgICAvLyAoc3VjaCBhcyBkdXJpbmcgc2Nyb2xsaW5nKSwgc2luY2UgZm9yIGxhcmdlIHVwZGF0ZXMgdGhhdCBpc1xuICAgICAgICAgICAgLy8gZmFzdGVyLlxuICAgICAgICAgICAgbGV0IHZwQSA9IHRoaXMucHJldlZpZXdwb3J0LCB2cEIgPSB1cGRhdGUudmlldy52aWV3cG9ydDtcbiAgICAgICAgICAgIGxldCB2cE92ZXJsYXAgPSBNYXRoLm1pbih2cEEudG8sIHZwQi50bykgLSBNYXRoLm1heCh2cEEuZnJvbSwgdnBCLmZyb20pO1xuICAgICAgICAgICAgdGhpcy5zeW5jR3V0dGVycyh2cE92ZXJsYXAgPCAodnBCLnRvIC0gdnBCLmZyb20pICogMC44KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlLmdlb21ldHJ5Q2hhbmdlZClcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLm1pbkhlaWdodCA9IHRoaXMudmlldy5jb250ZW50SGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlLmZhY2V0KHVuZml4R3V0dGVycykgIT0gIXRoaXMuZml4ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZml4ZWQgPSAhdGhpcy5maXhlZDtcbiAgICAgICAgICAgIHRoaXMuZG9tLnN0eWxlLnBvc2l0aW9uID0gdGhpcy5maXhlZCA/IFwic3RpY2t5XCIgOiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldlZpZXdwb3J0ID0gdXBkYXRlLnZpZXcudmlld3BvcnQ7XG4gICAgfVxuICAgIHN5bmNHdXR0ZXJzKGRldGFjaCkge1xuICAgICAgICBsZXQgYWZ0ZXIgPSB0aGlzLmRvbS5uZXh0U2libGluZztcbiAgICAgICAgaWYgKGRldGFjaClcbiAgICAgICAgICAgIHRoaXMuZG9tLnJlbW92ZSgpO1xuICAgICAgICBsZXQgbGluZUNsYXNzZXMgPSBSYW5nZVNldC5pdGVyKHRoaXMudmlldy5zdGF0ZS5mYWNldChndXR0ZXJMaW5lQ2xhc3MpLCB0aGlzLnZpZXcudmlld3BvcnQuZnJvbSk7XG4gICAgICAgIGxldCBjbGFzc1NldCA9IFtdO1xuICAgICAgICBsZXQgY29udGV4dHMgPSB0aGlzLmd1dHRlcnMubWFwKGd1dHRlciA9PiBuZXcgVXBkYXRlQ29udGV4dChndXR0ZXIsIHRoaXMudmlldy52aWV3cG9ydCwgLXRoaXMudmlldy5kb2N1bWVudFBhZGRpbmcudG9wKSk7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2YgdGhpcy52aWV3LnZpZXdwb3J0TGluZUJsb2Nrcykge1xuICAgICAgICAgICAgaWYgKGNsYXNzU2V0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICBjbGFzc1NldCA9IFtdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGluZS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYiBvZiBsaW5lLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIudHlwZSA9PSBCbG9ja1R5cGUuVGV4dCAmJiBmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZUN1cnNvcihsaW5lQ2xhc3NlcywgY2xhc3NTZXQsIGIuZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeC5saW5lKHRoaXMudmlldywgYiwgY2xhc3NTZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChiLndpZGdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3gud2lkZ2V0KHRoaXMudmlldywgYik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsaW5lLnR5cGUgPT0gQmxvY2tUeXBlLlRleHQpIHtcbiAgICAgICAgICAgICAgICBhZHZhbmNlQ3Vyc29yKGxpbmVDbGFzc2VzLCBjbGFzc1NldCwgbGluZS5mcm9tKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjeCBvZiBjb250ZXh0cylcbiAgICAgICAgICAgICAgICAgICAgY3gubGluZSh0aGlzLnZpZXcsIGxpbmUsIGNsYXNzU2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGxpbmUud2lkZ2V0KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY3ggb2YgY29udGV4dHMpXG4gICAgICAgICAgICAgICAgICAgIGN4LndpZGdldCh0aGlzLnZpZXcsIGxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGN4IG9mIGNvbnRleHRzKVxuICAgICAgICAgICAgY3guZmluaXNoKCk7XG4gICAgICAgIGlmIChkZXRhY2gpXG4gICAgICAgICAgICB0aGlzLnZpZXcuc2Nyb2xsRE9NLmluc2VydEJlZm9yZSh0aGlzLmRvbSwgYWZ0ZXIpO1xuICAgIH1cbiAgICB1cGRhdGVHdXR0ZXJzKHVwZGF0ZSkge1xuICAgICAgICBsZXQgcHJldiA9IHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGFjdGl2ZUd1dHRlcnMpLCBjdXIgPSB1cGRhdGUuc3RhdGUuZmFjZXQoYWN0aXZlR3V0dGVycyk7XG4gICAgICAgIGxldCBjaGFuZ2UgPSB1cGRhdGUuZG9jQ2hhbmdlZCB8fCB1cGRhdGUuaGVpZ2h0Q2hhbmdlZCB8fCB1cGRhdGUudmlld3BvcnRDaGFuZ2VkIHx8XG4gICAgICAgICAgICAhUmFuZ2VTZXQuZXEodXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQoZ3V0dGVyTGluZUNsYXNzKSwgdXBkYXRlLnN0YXRlLmZhY2V0KGd1dHRlckxpbmVDbGFzcyksIHVwZGF0ZS52aWV3LnZpZXdwb3J0LmZyb20sIHVwZGF0ZS52aWV3LnZpZXdwb3J0LnRvKTtcbiAgICAgICAgaWYgKHByZXYgPT0gY3VyKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBndXR0ZXIgb2YgdGhpcy5ndXR0ZXJzKVxuICAgICAgICAgICAgICAgIGlmIChndXR0ZXIudXBkYXRlKHVwZGF0ZSkpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGd1dHRlcnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNvbmYgb2YgY3VyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtub3duID0gcHJldi5pbmRleE9mKGNvbmYpO1xuICAgICAgICAgICAgICAgIGlmIChrbm93biA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ3V0dGVycy5wdXNoKG5ldyBTaW5nbGVHdXR0ZXJWaWV3KHRoaXMudmlldywgY29uZikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ndXR0ZXJzW2tub3duXS51cGRhdGUodXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgZ3V0dGVycy5wdXNoKHRoaXMuZ3V0dGVyc1trbm93bl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGcgb2YgdGhpcy5ndXR0ZXJzKSB7XG4gICAgICAgICAgICAgICAgZy5kb20ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGd1dHRlcnMuaW5kZXhPZihnKSA8IDApXG4gICAgICAgICAgICAgICAgICAgIGcuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgZyBvZiBndXR0ZXJzKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmFwcGVuZENoaWxkKGcuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuZ3V0dGVycyA9IGd1dHRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChsZXQgdmlldyBvZiB0aGlzLmd1dHRlcnMpXG4gICAgICAgICAgICB2aWV3LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kb20ucmVtb3ZlKCk7XG4gICAgfVxufSwge1xuICAgIHByb3ZpZGU6IHBsdWdpbiA9PiBFZGl0b3JWaWV3LnNjcm9sbE1hcmdpbnMub2YodmlldyA9PiB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHZpZXcucGx1Z2luKHBsdWdpbik7XG4gICAgICAgIGlmICghdmFsdWUgfHwgdmFsdWUuZ3V0dGVycy5sZW5ndGggPT0gMCB8fCAhdmFsdWUuZml4ZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHZpZXcudGV4dERpcmVjdGlvbiA9PSBEaXJlY3Rpb24uTFRSXG4gICAgICAgICAgICA/IHsgbGVmdDogdmFsdWUuZG9tLm9mZnNldFdpZHRoICogdmlldy5zY2FsZVggfVxuICAgICAgICAgICAgOiB7IHJpZ2h0OiB2YWx1ZS5kb20ub2Zmc2V0V2lkdGggKiB2aWV3LnNjYWxlWCB9O1xuICAgIH0pXG59KTtcbmZ1bmN0aW9uIGFzQXJyYXkodmFsKSB7IHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF0pOyB9XG5mdW5jdGlvbiBhZHZhbmNlQ3Vyc29yKGN1cnNvciwgY29sbGVjdCwgcG9zKSB7XG4gICAgd2hpbGUgKGN1cnNvci52YWx1ZSAmJiBjdXJzb3IuZnJvbSA8PSBwb3MpIHtcbiAgICAgICAgaWYgKGN1cnNvci5mcm9tID09IHBvcylcbiAgICAgICAgICAgIGNvbGxlY3QucHVzaChjdXJzb3IudmFsdWUpO1xuICAgICAgICBjdXJzb3IubmV4dCgpO1xuICAgIH1cbn1cbmNsYXNzIFVwZGF0ZUNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKGd1dHRlciwgdmlld3BvcnQsIGhlaWdodCkge1xuICAgICAgICB0aGlzLmd1dHRlciA9IGd1dHRlcjtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuaSA9IDA7XG4gICAgICAgIHRoaXMuY3Vyc29yID0gUmFuZ2VTZXQuaXRlcihndXR0ZXIubWFya2Vycywgdmlld3BvcnQuZnJvbSk7XG4gICAgfVxuICAgIGFkZEVsZW1lbnQodmlldywgYmxvY2ssIG1hcmtlcnMpIHtcbiAgICAgICAgbGV0IHsgZ3V0dGVyIH0gPSB0aGlzLCBhYm92ZSA9IChibG9jay50b3AgLSB0aGlzLmhlaWdodCkgLyB2aWV3LnNjYWxlWSwgaGVpZ2h0ID0gYmxvY2suaGVpZ2h0IC8gdmlldy5zY2FsZVk7XG4gICAgICAgIGlmICh0aGlzLmkgPT0gZ3V0dGVyLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IG5ld0VsdCA9IG5ldyBHdXR0ZXJFbGVtZW50KHZpZXcsIGhlaWdodCwgYWJvdmUsIG1hcmtlcnMpO1xuICAgICAgICAgICAgZ3V0dGVyLmVsZW1lbnRzLnB1c2gobmV3RWx0KTtcbiAgICAgICAgICAgIGd1dHRlci5kb20uYXBwZW5kQ2hpbGQobmV3RWx0LmRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBndXR0ZXIuZWxlbWVudHNbdGhpcy5pXS51cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBibG9jay5ib3R0b207XG4gICAgICAgIHRoaXMuaSsrO1xuICAgIH1cbiAgICBsaW5lKHZpZXcsIGxpbmUsIGV4dHJhTWFya2Vycykge1xuICAgICAgICBsZXQgbG9jYWxNYXJrZXJzID0gW107XG4gICAgICAgIGFkdmFuY2VDdXJzb3IodGhpcy5jdXJzb3IsIGxvY2FsTWFya2VycywgbGluZS5mcm9tKTtcbiAgICAgICAgaWYgKGV4dHJhTWFya2Vycy5sZW5ndGgpXG4gICAgICAgICAgICBsb2NhbE1hcmtlcnMgPSBsb2NhbE1hcmtlcnMuY29uY2F0KGV4dHJhTWFya2Vycyk7XG4gICAgICAgIGxldCBmb3JMaW5lID0gdGhpcy5ndXR0ZXIuY29uZmlnLmxpbmVNYXJrZXIodmlldywgbGluZSwgbG9jYWxNYXJrZXJzKTtcbiAgICAgICAgaWYgKGZvckxpbmUpXG4gICAgICAgICAgICBsb2NhbE1hcmtlcnMudW5zaGlmdChmb3JMaW5lKTtcbiAgICAgICAgbGV0IGd1dHRlciA9IHRoaXMuZ3V0dGVyO1xuICAgICAgICBpZiAobG9jYWxNYXJrZXJzLmxlbmd0aCA9PSAwICYmICFndXR0ZXIuY29uZmlnLnJlbmRlckVtcHR5RWxlbWVudHMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuYWRkRWxlbWVudCh2aWV3LCBsaW5lLCBsb2NhbE1hcmtlcnMpO1xuICAgIH1cbiAgICB3aWRnZXQodmlldywgYmxvY2spIHtcbiAgICAgICAgbGV0IG1hcmtlciA9IHRoaXMuZ3V0dGVyLmNvbmZpZy53aWRnZXRNYXJrZXIodmlldywgYmxvY2sud2lkZ2V0LCBibG9jayk7XG4gICAgICAgIGlmIChtYXJrZXIpXG4gICAgICAgICAgICB0aGlzLmFkZEVsZW1lbnQodmlldywgYmxvY2ssIFttYXJrZXJdKTtcbiAgICB9XG4gICAgZmluaXNoKCkge1xuICAgICAgICBsZXQgZ3V0dGVyID0gdGhpcy5ndXR0ZXI7XG4gICAgICAgIHdoaWxlIChndXR0ZXIuZWxlbWVudHMubGVuZ3RoID4gdGhpcy5pKSB7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IGd1dHRlci5lbGVtZW50cy5wb3AoKTtcbiAgICAgICAgICAgIGd1dHRlci5kb20ucmVtb3ZlQ2hpbGQobGFzdC5kb20pO1xuICAgICAgICAgICAgbGFzdC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBTaW5nbGVHdXR0ZXJWaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBjb25maWcpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuZWxlbWVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5zcGFjZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZG9tLmNsYXNzTmFtZSA9IFwiY20tZ3V0dGVyXCIgKyAodGhpcy5jb25maWcuY2xhc3MgPyBcIiBcIiArIHRoaXMuY29uZmlnLmNsYXNzIDogXCJcIik7XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gY29uZmlnLmRvbUV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tLmFkZEV2ZW50TGlzdGVuZXIocHJvcCwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGV2ZW50LnRhcmdldCwgeTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IHRoaXMuZG9tICYmIHRoaXMuZG9tLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRhcmdldC5wYXJlbnROb2RlICE9IHRoaXMuZG9tKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB5ID0gKHJlY3QudG9wICsgcmVjdC5ib3R0b20pIC8gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBldmVudC5jbGllbnRZO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXRIZWlnaHQoeSAtIHZpZXcuZG9jdW1lbnRUb3ApO1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcuZG9tRXZlbnRIYW5kbGVyc1twcm9wXSh2aWV3LCBsaW5lLCBldmVudCkpXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtlcnMgPSBhc0FycmF5KGNvbmZpZy5tYXJrZXJzKHZpZXcpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5pbml0aWFsU3BhY2VyKSB7XG4gICAgICAgICAgICB0aGlzLnNwYWNlciA9IG5ldyBHdXR0ZXJFbGVtZW50KHZpZXcsIDAsIDAsIFtjb25maWcuaW5pdGlhbFNwYWNlcih2aWV3KV0pO1xuICAgICAgICAgICAgdGhpcy5kb20uYXBwZW5kQ2hpbGQodGhpcy5zcGFjZXIuZG9tKTtcbiAgICAgICAgICAgIHRoaXMuc3BhY2VyLmRvbS5zdHlsZS5jc3NUZXh0ICs9IFwidmlzaWJpbGl0eTogaGlkZGVuOyBwb2ludGVyLWV2ZW50czogbm9uZVwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHByZXZNYXJrZXJzID0gdGhpcy5tYXJrZXJzO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBhc0FycmF5KHRoaXMuY29uZmlnLm1hcmtlcnModXBkYXRlLnZpZXcpKTtcbiAgICAgICAgaWYgKHRoaXMuc3BhY2VyICYmIHRoaXMuY29uZmlnLnVwZGF0ZVNwYWNlcikge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSB0aGlzLmNvbmZpZy51cGRhdGVTcGFjZXIodGhpcy5zcGFjZXIubWFya2Vyc1swXSwgdXBkYXRlKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGVkICE9IHRoaXMuc3BhY2VyLm1hcmtlcnNbMF0pXG4gICAgICAgICAgICAgICAgdGhpcy5zcGFjZXIudXBkYXRlKHVwZGF0ZS52aWV3LCAwLCAwLCBbdXBkYXRlZF0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2cCA9IHVwZGF0ZS52aWV3LnZpZXdwb3J0O1xuICAgICAgICByZXR1cm4gIVJhbmdlU2V0LmVxKHRoaXMubWFya2VycywgcHJldk1hcmtlcnMsIHZwLmZyb20sIHZwLnRvKSB8fFxuICAgICAgICAgICAgKHRoaXMuY29uZmlnLmxpbmVNYXJrZXJDaGFuZ2UgPyB0aGlzLmNvbmZpZy5saW5lTWFya2VyQ2hhbmdlKHVwZGF0ZSkgOiBmYWxzZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAobGV0IGVsdCBvZiB0aGlzLmVsZW1lbnRzKVxuICAgICAgICAgICAgZWx0LmRlc3Ryb3koKTtcbiAgICB9XG59XG5jbGFzcyBHdXR0ZXJFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKSB7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gLTE7XG4gICAgICAgIHRoaXMuYWJvdmUgPSAwO1xuICAgICAgICB0aGlzLm1hcmtlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5kb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBcImNtLWd1dHRlckVsZW1lbnRcIjtcbiAgICAgICAgdGhpcy51cGRhdGUodmlldywgaGVpZ2h0LCBhYm92ZSwgbWFya2Vycyk7XG4gICAgfVxuICAgIHVwZGF0ZSh2aWV3LCBoZWlnaHQsIGFib3ZlLCBtYXJrZXJzKSB7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodCAhPSBoZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFib3ZlICE9IGFib3ZlKVxuICAgICAgICAgICAgdGhpcy5kb20uc3R5bGUubWFyZ2luVG9wID0gKHRoaXMuYWJvdmUgPSBhYm92ZSkgPyBhYm92ZSArIFwicHhcIiA6IFwiXCI7XG4gICAgICAgIGlmICghc2FtZU1hcmtlcnModGhpcy5tYXJrZXJzLCBtYXJrZXJzKSlcbiAgICAgICAgICAgIHRoaXMuc2V0TWFya2Vycyh2aWV3LCBtYXJrZXJzKTtcbiAgICB9XG4gICAgc2V0TWFya2Vycyh2aWV3LCBtYXJrZXJzKSB7XG4gICAgICAgIGxldCBjbHMgPSBcImNtLWd1dHRlckVsZW1lbnRcIiwgZG9tUG9zID0gdGhpcy5kb20uZmlyc3RDaGlsZDtcbiAgICAgICAgZm9yIChsZXQgaU5ldyA9IDAsIGlPbGQgPSAwOzspIHtcbiAgICAgICAgICAgIGxldCBza2lwVG8gPSBpT2xkLCBtYXJrZXIgPSBpTmV3IDwgbWFya2Vycy5sZW5ndGggPyBtYXJrZXJzW2lOZXcrK10gOiBudWxsLCBtYXRjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAobWFya2VyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGMgPSBtYXJrZXIuZWxlbWVudENsYXNzO1xuICAgICAgICAgICAgICAgIGlmIChjKVxuICAgICAgICAgICAgICAgICAgICBjbHMgKz0gXCIgXCIgKyBjO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBpT2xkOyBpIDwgdGhpcy5tYXJrZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXJrZXJzW2ldLmNvbXBhcmUobWFya2VyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFRvID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNraXBUbyA9IHRoaXMubWFya2Vycy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoaU9sZCA8IHNraXBUbykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5tYXJrZXJzW2lPbGQrK107XG4gICAgICAgICAgICAgICAgaWYgKG5leHQudG9ET00pIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5kZXN0cm95KGRvbVBvcyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhZnRlciA9IGRvbVBvcy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgZG9tUG9zLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICBkb21Qb3MgPSBhZnRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1hcmtlcilcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChtYXJrZXIudG9ET00pIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZClcbiAgICAgICAgICAgICAgICAgICAgZG9tUG9zID0gZG9tUG9zLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb20uaW5zZXJ0QmVmb3JlKG1hcmtlci50b0RPTSh2aWV3KSwgZG9tUG9zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaGVkKVxuICAgICAgICAgICAgICAgIGlPbGQrKztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvbS5jbGFzc05hbWUgPSBjbHM7XG4gICAgICAgIHRoaXMubWFya2VycyA9IG1hcmtlcnM7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc2V0TWFya2VycyhudWxsLCBbXSk7IC8vIEZpcnN0IGFyZ3VtZW50IG5vdCB1c2VkIHVubGVzcyBjcmVhdGluZyBtYXJrZXJzXG4gICAgfVxufVxuZnVuY3Rpb24gc2FtZU1hcmtlcnMoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCFhW2ldLmNvbXBhcmUoYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbkZhY2V0IHVzZWQgdG8gcHJvdmlkZSBtYXJrZXJzIHRvIHRoZSBsaW5lIG51bWJlciBndXR0ZXIuXG4qL1xuY29uc3QgbGluZU51bWJlck1hcmtlcnMgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKCk7XG5jb25zdCBsaW5lTnVtYmVyQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVDb25maWcodmFsdWVzLCB7IGZvcm1hdE51bWJlcjogU3RyaW5nLCBkb21FdmVudEhhbmRsZXJzOiB7fSB9LCB7XG4gICAgICAgICAgICBkb21FdmVudEhhbmRsZXJzKGEsIGIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgYSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZXZlbnQgaW4gYikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RzID0gcmVzdWx0W2V2ZW50XSwgYWRkID0gYltldmVudF07XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtldmVudF0gPSBleGlzdHMgPyAodmlldywgbGluZSwgZXZlbnQpID0+IGV4aXN0cyh2aWV3LCBsaW5lLCBldmVudCkgfHwgYWRkKHZpZXcsIGxpbmUsIGV2ZW50KSA6IGFkZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5jbGFzcyBOdW1iZXJNYXJrZXIgZXh0ZW5kcyBHdXR0ZXJNYXJrZXIge1xuICAgIGNvbnN0cnVjdG9yKG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMubnVtYmVyID09IG90aGVyLm51bWJlcjsgfVxuICAgIHRvRE9NKCkgeyByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5udW1iZXIpOyB9XG59XG5mdW5jdGlvbiBmb3JtYXROdW1iZXIodmlldywgbnVtYmVyKSB7XG4gICAgcmV0dXJuIHZpZXcuc3RhdGUuZmFjZXQobGluZU51bWJlckNvbmZpZykuZm9ybWF0TnVtYmVyKG51bWJlciwgdmlldy5zdGF0ZSk7XG59XG5jb25zdCBsaW5lTnVtYmVyR3V0dGVyID0gLypAX19QVVJFX18qL2FjdGl2ZUd1dHRlcnMuY29tcHV0ZShbbGluZU51bWJlckNvbmZpZ10sIHN0YXRlID0+ICh7XG4gICAgY2xhc3M6IFwiY20tbGluZU51bWJlcnNcIixcbiAgICByZW5kZXJFbXB0eUVsZW1lbnRzOiBmYWxzZSxcbiAgICBtYXJrZXJzKHZpZXcpIHsgcmV0dXJuIHZpZXcuc3RhdGUuZmFjZXQobGluZU51bWJlck1hcmtlcnMpOyB9LFxuICAgIGxpbmVNYXJrZXIodmlldywgbGluZSwgb3RoZXJzKSB7XG4gICAgICAgIGlmIChvdGhlcnMuc29tZShtID0+IG0udG9ET00pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyTWFya2VyKGZvcm1hdE51bWJlcih2aWV3LCB2aWV3LnN0YXRlLmRvYy5saW5lQXQobGluZS5mcm9tKS5udW1iZXIpKTtcbiAgICB9LFxuICAgIHdpZGdldE1hcmtlcjogKCkgPT4gbnVsbCxcbiAgICBsaW5lTWFya2VyQ2hhbmdlOiB1cGRhdGUgPT4gdXBkYXRlLnN0YXJ0U3RhdGUuZmFjZXQobGluZU51bWJlckNvbmZpZykgIT0gdXBkYXRlLnN0YXRlLmZhY2V0KGxpbmVOdW1iZXJDb25maWcpLFxuICAgIGluaXRpYWxTcGFjZXIodmlldykge1xuICAgICAgICByZXR1cm4gbmV3IE51bWJlck1hcmtlcihmb3JtYXROdW1iZXIodmlldywgbWF4TGluZU51bWJlcih2aWV3LnN0YXRlLmRvYy5saW5lcykpKTtcbiAgICB9LFxuICAgIHVwZGF0ZVNwYWNlcihzcGFjZXIsIHVwZGF0ZSkge1xuICAgICAgICBsZXQgbWF4ID0gZm9ybWF0TnVtYmVyKHVwZGF0ZS52aWV3LCBtYXhMaW5lTnVtYmVyKHVwZGF0ZS52aWV3LnN0YXRlLmRvYy5saW5lcykpO1xuICAgICAgICByZXR1cm4gbWF4ID09IHNwYWNlci5udW1iZXIgPyBzcGFjZXIgOiBuZXcgTnVtYmVyTWFya2VyKG1heCk7XG4gICAgfSxcbiAgICBkb21FdmVudEhhbmRsZXJzOiBzdGF0ZS5mYWNldChsaW5lTnVtYmVyQ29uZmlnKS5kb21FdmVudEhhbmRsZXJzXG59KSk7XG4vKipcbkNyZWF0ZSBhIGxpbmUgbnVtYmVyIGd1dHRlciBleHRlbnNpb24uXG4qL1xuZnVuY3Rpb24gbGluZU51bWJlcnMoY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBsaW5lTnVtYmVyQ29uZmlnLm9mKGNvbmZpZyksXG4gICAgICAgIGd1dHRlcnMoKSxcbiAgICAgICAgbGluZU51bWJlckd1dHRlclxuICAgIF07XG59XG5mdW5jdGlvbiBtYXhMaW5lTnVtYmVyKGxpbmVzKSB7XG4gICAgbGV0IGxhc3QgPSA5O1xuICAgIHdoaWxlIChsYXN0IDwgbGluZXMpXG4gICAgICAgIGxhc3QgPSBsYXN0ICogMTAgKyA5O1xuICAgIHJldHVybiBsYXN0O1xufVxuY29uc3QgYWN0aXZlTGluZUd1dHRlck1hcmtlciA9IC8qQF9fUFVSRV9fKi9uZXcgY2xhc3MgZXh0ZW5kcyBHdXR0ZXJNYXJrZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmVsZW1lbnRDbGFzcyA9IFwiY20tYWN0aXZlTGluZUd1dHRlclwiO1xuICAgIH1cbn07XG5jb25zdCBhY3RpdmVMaW5lR3V0dGVySGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovZ3V0dGVyTGluZUNsYXNzLmNvbXB1dGUoW1wic2VsZWN0aW9uXCJdLCBzdGF0ZSA9PiB7XG4gICAgbGV0IG1hcmtzID0gW10sIGxhc3QgPSAtMTtcbiAgICBmb3IgKGxldCByYW5nZSBvZiBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgIGxldCBsaW5lUG9zID0gc3RhdGUuZG9jLmxpbmVBdChyYW5nZS5oZWFkKS5mcm9tO1xuICAgICAgICBpZiAobGluZVBvcyA+IGxhc3QpIHtcbiAgICAgICAgICAgIGxhc3QgPSBsaW5lUG9zO1xuICAgICAgICAgICAgbWFya3MucHVzaChhY3RpdmVMaW5lR3V0dGVyTWFya2VyLnJhbmdlKGxpbmVQb3MpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUmFuZ2VTZXQub2YobWFya3MpO1xufSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgYWRkcyBhIGBjbS1hY3RpdmVMaW5lR3V0dGVyYCBjbGFzcyB0b1xuYWxsIGd1dHRlciBlbGVtZW50cyBvbiB0aGUgW2FjdGl2ZVxubGluZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyN2aWV3LmhpZ2hsaWdodEFjdGl2ZUxpbmUpLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodEFjdGl2ZUxpbmVHdXR0ZXIoKSB7XG4gICAgcmV0dXJuIGFjdGl2ZUxpbmVHdXR0ZXJIaWdobGlnaHRlcjtcbn1cblxuY29uc3QgV2hpdGVzcGFjZURlY28gPSAvKkBfX1BVUkVfXyovbmV3IE1hcCgpO1xuZnVuY3Rpb24gZ2V0V2hpdGVzcGFjZURlY28oc3BhY2UpIHtcbiAgICBsZXQgZGVjbyA9IFdoaXRlc3BhY2VEZWNvLmdldChzcGFjZSk7XG4gICAgaWYgKCFkZWNvKVxuICAgICAgICBXaGl0ZXNwYWNlRGVjby5zZXQoc3BhY2UsIGRlY28gPSBEZWNvcmF0aW9uLm1hcmsoe1xuICAgICAgICAgICAgYXR0cmlidXRlczogc3BhY2UgPT09IFwiXFx0XCIgPyB7XG4gICAgICAgICAgICAgICAgY2xhc3M6IFwiY20taGlnaGxpZ2h0VGFiXCIsXG4gICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgIGNsYXNzOiBcImNtLWhpZ2hsaWdodFNwYWNlXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhLWRpc3BsYXlcIjogc3BhY2UucmVwbGFjZSgvIC9nLCBcIlx1MDBCN1wiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgcmV0dXJuIGRlY287XG59XG5mdW5jdGlvbiBtYXRjaGVyKGRlY29yYXRvcikge1xuICAgIHJldHVybiBWaWV3UGx1Z2luLmRlZmluZSh2aWV3ID0+ICh7XG4gICAgICAgIGRlY29yYXRpb25zOiBkZWNvcmF0b3IuY3JlYXRlRGVjbyh2aWV3KSxcbiAgICAgICAgdXBkYXRlKHUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSBkZWNvcmF0b3IudXBkYXRlRGVjbyh1LCB0aGlzLmRlY29yYXRpb25zKTtcbiAgICAgICAgfSxcbiAgICB9KSwge1xuICAgICAgICBkZWNvcmF0aW9uczogdiA9PiB2LmRlY29yYXRpb25zXG4gICAgfSk7XG59XG5jb25zdCB3aGl0ZXNwYWNlSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovbWF0Y2hlcigvKkBfX1BVUkVfXyovbmV3IE1hdGNoRGVjb3JhdG9yKHtcbiAgICByZWdleHA6IC9cXHR8ICsvZyxcbiAgICBkZWNvcmF0aW9uOiBtYXRjaCA9PiBnZXRXaGl0ZXNwYWNlRGVjbyhtYXRjaFswXSksXG4gICAgYm91bmRhcnk6IC9cXFMvLFxufSkpO1xuLyoqXG5SZXR1cm5zIGFuIGV4dGVuc2lvbiB0aGF0IGhpZ2hsaWdodHMgd2hpdGVzcGFjZSwgYWRkaW5nIGFcbmBjbS1oaWdobGlnaHRTcGFjZWAgY2xhc3MgdG8gc3RyZXRjaGVzIG9mIHNwYWNlcywgYW5kIGFcbmBjbS1oaWdobGlnaHRUYWJgIGNsYXNzIHRvIGluZGl2aWR1YWwgdGFiIGNoYXJhY3RlcnMuIEJ5IGRlZmF1bHQsXG50aGUgZm9ybWVyIGFyZSBzaG93biBhcyBmYWludCBkb3RzLCBhbmQgdGhlIGxhdHRlciBhcyBhcnJvd3MuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0V2hpdGVzcGFjZSgpIHtcbiAgICByZXR1cm4gd2hpdGVzcGFjZUhpZ2hsaWdodGVyO1xufVxuY29uc3QgdHJhaWxpbmdIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9tYXRjaGVyKC8qQF9fUFVSRV9fKi9uZXcgTWF0Y2hEZWNvcmF0b3Ioe1xuICAgIHJlZ2V4cDogL1xccyskL2csXG4gICAgZGVjb3JhdGlvbjogLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLXRyYWlsaW5nU3BhY2VcIiB9KSxcbiAgICBib3VuZGFyeTogL1xcUy8sXG59KSk7XG4vKipcblJldHVybnMgYW4gZXh0ZW5zaW9uIHRoYXQgYWRkcyBhIGBjbS10cmFpbGluZ1NwYWNlYCBjbGFzcyB0byBhbGxcbnRyYWlsaW5nIHdoaXRlc3BhY2UuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0VHJhaWxpbmdXaGl0ZXNwYWNlKCkge1xuICAgIHJldHVybiB0cmFpbGluZ0hpZ2hsaWdodGVyO1xufVxuXG4vKipcbkBpbnRlcm5hbFxuKi9cbmNvbnN0IF9fdGVzdCA9IHsgSGVpZ2h0TWFwLCBIZWlnaHRPcmFjbGUsIE1lYXN1cmVkSGVpZ2h0cywgUXVlcnlUeXBlLCBDaGFuZ2VkUmFuZ2UsIGNvbXB1dGVPcmRlciwgbW92ZVZpc3VhbGx5IH07XG5cbmV4cG9ydCB7IEJpZGlTcGFuLCBCbG9ja0luZm8sIEJsb2NrVHlwZSwgRGVjb3JhdGlvbiwgRGlyZWN0aW9uLCBFZGl0b3JWaWV3LCBHdXR0ZXJNYXJrZXIsIE1hdGNoRGVjb3JhdG9yLCBSZWN0YW5nbGVNYXJrZXIsIFZpZXdQbHVnaW4sIFZpZXdVcGRhdGUsIFdpZGdldFR5cGUsIF9fdGVzdCwgY2xvc2VIb3ZlclRvb2x0aXBzLCBjcm9zc2hhaXJDdXJzb3IsIGRyYXdTZWxlY3Rpb24sIGRyb3BDdXJzb3IsIGdldERyYXdTZWxlY3Rpb25Db25maWcsIGdldFBhbmVsLCBnZXRUb29sdGlwLCBndXR0ZXIsIGd1dHRlckxpbmVDbGFzcywgZ3V0dGVycywgaGFzSG92ZXJUb29sdGlwcywgaGlnaGxpZ2h0QWN0aXZlTGluZSwgaGlnaGxpZ2h0QWN0aXZlTGluZUd1dHRlciwgaGlnaGxpZ2h0U3BlY2lhbENoYXJzLCBoaWdobGlnaHRUcmFpbGluZ1doaXRlc3BhY2UsIGhpZ2hsaWdodFdoaXRlc3BhY2UsIGhvdmVyVG9vbHRpcCwga2V5bWFwLCBsYXllciwgbGluZU51bWJlck1hcmtlcnMsIGxpbmVOdW1iZXJzLCBsb2dFeGNlcHRpb24sIHBhbmVscywgcGxhY2Vob2xkZXIsIHJlY3Rhbmd1bGFyU2VsZWN0aW9uLCByZXBvc2l0aW9uVG9vbHRpcHMsIHJ1blNjb3BlSGFuZGxlcnMsIHNjcm9sbFBhc3RFbmQsIHNob3dQYW5lbCwgc2hvd1Rvb2x0aXAsIHRvb2x0aXBzIH07XG4iLCAiaW1wb3J0IHsgTm9kZVByb3AgfSBmcm9tICdAbGV6ZXIvY29tbW9uJztcblxubGV0IG5leHRUYWdJRCA9IDA7XG4vKipcbkhpZ2hsaWdodGluZyB0YWdzIGFyZSBtYXJrZXJzIHRoYXQgZGVub3RlIGEgaGlnaGxpZ2h0aW5nIGNhdGVnb3J5LlxuVGhleSBhcmUgW2Fzc29jaWF0ZWRdKCNoaWdobGlnaHQuc3R5bGVUYWdzKSB3aXRoIHBhcnRzIG9mIGEgc3ludGF4XG50cmVlIGJ5IGEgbGFuZ3VhZ2UgbW9kZSwgYW5kIHRoZW4gbWFwcGVkIHRvIGFuIGFjdHVhbCBDU1Mgc3R5bGUgYnlcbmEgW2hpZ2hsaWdodGVyXSgjaGlnaGxpZ2h0LkhpZ2hsaWdodGVyKS5cblxuQmVjYXVzZSBzeW50YXggdHJlZSBub2RlIHR5cGVzIGFuZCBoaWdobGlnaHQgc3R5bGVzIGhhdmUgdG8gYmVcbmFibGUgdG8gdGFsayB0aGUgc2FtZSBsYW5ndWFnZSwgQ29kZU1pcnJvciB1c2VzIGEgbW9zdGx5IF9jbG9zZWRfXG5bdm9jYWJ1bGFyeV0oI2hpZ2hsaWdodC50YWdzKSBvZiBzeW50YXggdGFncyAoYXMgb3Bwb3NlZCB0b1xudHJhZGl0aW9uYWwgb3BlbiBzdHJpbmctYmFzZWQgc3lzdGVtcywgd2hpY2ggbWFrZSBpdCBoYXJkIGZvclxuaGlnaGxpZ2h0aW5nIHRoZW1lcyB0byBjb3ZlciBhbGwgdGhlIHRva2VucyBwcm9kdWNlZCBieSB0aGVcbnZhcmlvdXMgbGFuZ3VhZ2VzKS5cblxuSXQgX2lzXyBwb3NzaWJsZSB0byBbZGVmaW5lXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmUpIHlvdXIgb3duXG5oaWdobGlnaHRpbmcgdGFncyBmb3Igc3lzdGVtLWludGVybmFsIHVzZSAod2hlcmUgeW91IGNvbnRyb2wgYm90aFxudGhlIGxhbmd1YWdlIHBhY2thZ2UgYW5kIHRoZSBoaWdobGlnaHRlciksIGJ1dCBzdWNoIHRhZ3Mgd2lsbCBub3RcbmJlIHBpY2tlZCB1cCBieSByZWd1bGFyIGhpZ2hsaWdodGVycyAodGhvdWdoIHlvdSBjYW4gZGVyaXZlIHRoZW1cbmZyb20gc3RhbmRhcmQgdGFncyB0byBhbGxvdyBoaWdobGlnaHRlcnMgdG8gZmFsbCBiYWNrIHRvIHRob3NlKS5cbiovXG5jbGFzcyBUYWcge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHNldCBvZiB0aGlzIHRhZyBhbmQgYWxsIGl0cyBwYXJlbnQgdGFncywgc3RhcnRpbmcgd2l0aFxuICAgIHRoaXMgb25lIGl0c2VsZiBhbmQgc29ydGVkIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgc3BlY2lmaWNpdHkuXG4gICAgKi9cbiAgICBzZXQsIFxuICAgIC8qKlxuICAgIFRoZSBiYXNlIHVubW9kaWZpZWQgdGFnIHRoYXQgdGhpcyBvbmUgaXMgYmFzZWQgb24sIGlmIGl0J3NcbiAgICBtb2RpZmllZCBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGJhc2UsIFxuICAgIC8qKlxuICAgIFRoZSBtb2RpZmllcnMgYXBwbGllZCB0byB0aGlzLmJhc2UgQGludGVybmFsXG4gICAgKi9cbiAgICBtb2RpZmllZCkge1xuICAgICAgICB0aGlzLnNldCA9IHNldDtcbiAgICAgICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICAgICAgdGhpcy5tb2RpZmllZCA9IG1vZGlmaWVkO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuaWQgPSBuZXh0VGFnSUQrKztcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgbmV3IHRhZy4gSWYgYHBhcmVudGAgaXMgZ2l2ZW4sIHRoZSB0YWcgaXMgdHJlYXRlZCBhcyBhXG4gICAgc3ViLXRhZyBvZiB0aGF0IHBhcmVudCwgYW5kXG4gICAgW2hpZ2hsaWdodGVyc10oI2hpZ2hsaWdodC50YWdIaWdobGlnaHRlcikgdGhhdCBkb24ndCBtZW50aW9uXG4gICAgdGhpcyB0YWcgd2lsbCB0cnkgdG8gZmFsbCBiYWNrIHRvIHRoZSBwYXJlbnQgdGFnIChvciBncmFuZHBhcmVudFxuICAgIHRhZywgZXRjKS5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUocGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwgfHwgcGFyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJlbnQuYmFzZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbiBub3QgZGVyaXZlIGZyb20gYSBtb2RpZmllZCB0YWdcIik7XG4gICAgICAgIGxldCB0YWcgPSBuZXcgVGFnKFtdLCBudWxsLCBbXSk7XG4gICAgICAgIHRhZy5zZXQucHVzaCh0YWcpO1xuICAgICAgICBpZiAocGFyZW50KVxuICAgICAgICAgICAgZm9yIChsZXQgdCBvZiBwYXJlbnQuc2V0KVxuICAgICAgICAgICAgICAgIHRhZy5zZXQucHVzaCh0KTtcbiAgICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgdGFnIF9tb2RpZmllcl8sIHdoaWNoIGlzIGEgZnVuY3Rpb24gdGhhdCwgZ2l2ZW4gYSB0YWcsXG4gICAgd2lsbCByZXR1cm4gYSB0YWcgdGhhdCBpcyBhIHN1YnRhZyBvZiB0aGUgb3JpZ2luYWwuIEFwcGx5aW5nIHRoZVxuICAgIHNhbWUgbW9kaWZpZXIgdG8gYSB0d2ljZSB0YWcgd2lsbCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgKGBtMSh0MSlcbiAgICA9PSBtMSh0MSlgKSBhbmQgYXBwbHlpbmcgbXVsdGlwbGUgbW9kaWZpZXJzIHdpbGwsIHJlZ2FyZGxlc3Mgb3JcbiAgICBvcmRlciwgcHJvZHVjZSB0aGUgc2FtZSB0YWcgKGBtMShtMih0MSkpID09IG0yKG0xKHQxKSlgKS5cbiAgICBcbiAgICBXaGVuIG11bHRpcGxlIG1vZGlmaWVycyBhcmUgYXBwbGllZCB0byBhIGdpdmVuIGJhc2UgdGFnLCBlYWNoXG4gICAgc21hbGxlciBzZXQgb2YgbW9kaWZpZXJzIGlzIHJlZ2lzdGVyZWQgYXMgYSBwYXJlbnQsIHNvIHRoYXQgZm9yXG4gICAgZXhhbXBsZSBgbTEobTIobTModDEpKSlgIGlzIGEgc3VidHlwZSBvZiBgbTEobTIodDEpKWAsXG4gICAgYG0xKG0zKHQxKWAsIGFuZCBzbyBvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmVNb2RpZmllcigpIHtcbiAgICAgICAgbGV0IG1vZCA9IG5ldyBNb2RpZmllcjtcbiAgICAgICAgcmV0dXJuICh0YWcpID0+IHtcbiAgICAgICAgICAgIGlmICh0YWcubW9kaWZpZWQuaW5kZXhPZihtb2QpID4gLTEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgICAgIHJldHVybiBNb2RpZmllci5nZXQodGFnLmJhc2UgfHwgdGFnLCB0YWcubW9kaWZpZWQuY29uY2F0KG1vZCkuc29ydCgoYSwgYikgPT4gYS5pZCAtIGIuaWQpKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG5sZXQgbmV4dE1vZGlmaWVySUQgPSAwO1xuY2xhc3MgTW9kaWZpZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmluc3RhbmNlcyA9IFtdO1xuICAgICAgICB0aGlzLmlkID0gbmV4dE1vZGlmaWVySUQrKztcbiAgICB9XG4gICAgc3RhdGljIGdldChiYXNlLCBtb2RzKSB7XG4gICAgICAgIGlmICghbW9kcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgbGV0IGV4aXN0cyA9IG1vZHNbMF0uaW5zdGFuY2VzLmZpbmQodCA9PiB0LmJhc2UgPT0gYmFzZSAmJiBzYW1lQXJyYXkobW9kcywgdC5tb2RpZmllZCkpO1xuICAgICAgICBpZiAoZXhpc3RzKVxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0cztcbiAgICAgICAgbGV0IHNldCA9IFtdLCB0YWcgPSBuZXcgVGFnKHNldCwgYmFzZSwgbW9kcyk7XG4gICAgICAgIGZvciAobGV0IG0gb2YgbW9kcylcbiAgICAgICAgICAgIG0uaW5zdGFuY2VzLnB1c2godGFnKTtcbiAgICAgICAgbGV0IGNvbmZpZ3MgPSBwb3dlclNldChtb2RzKTtcbiAgICAgICAgZm9yIChsZXQgcGFyZW50IG9mIGJhc2Uuc2V0KVxuICAgICAgICAgICAgaWYgKCFwYXJlbnQubW9kaWZpZWQubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbmZpZyBvZiBjb25maWdzKVxuICAgICAgICAgICAgICAgICAgICBzZXQucHVzaChNb2RpZmllci5nZXQocGFyZW50LCBjb25maWcpKTtcbiAgICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG59XG5mdW5jdGlvbiBzYW1lQXJyYXkoYSwgYikge1xuICAgIHJldHVybiBhLmxlbmd0aCA9PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KCh4LCBpKSA9PiB4ID09IGJbaV0pO1xufVxuZnVuY3Rpb24gcG93ZXJTZXQoYXJyYXkpIHtcbiAgICBsZXQgc2V0cyA9IFtbXV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMCwgZSA9IHNldHMubGVuZ3RoOyBqIDwgZTsgaisrKSB7XG4gICAgICAgICAgICBzZXRzLnB1c2goc2V0c1tqXS5jb25jYXQoYXJyYXlbaV0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2V0cy5zb3J0KChhLCBiKSA9PiBiLmxlbmd0aCAtIGEubGVuZ3RoKTtcbn1cbi8qKlxuVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCBhIHNldCBvZiB0YWdzIHRvIGEgbGFuZ3VhZ2Ugc3ludGF4XG52aWEgW2BOb2RlU2V0LmV4dGVuZGBdKCNjb21tb24uTm9kZVNldC5leHRlbmQpIG9yXG5bYExSUGFyc2VyLmNvbmZpZ3VyZWBdKCNsci5MUlBhcnNlci5jb25maWd1cmUpLlxuXG5UaGUgYXJndW1lbnQgb2JqZWN0IG1hcHMgbm9kZSBzZWxlY3RvcnMgdG8gW2hpZ2hsaWdodGluZ1xudGFnc10oI2hpZ2hsaWdodC5UYWcpIG9yIGFycmF5cyBvZiB0YWdzLlxuXG5Ob2RlIHNlbGVjdG9ycyBtYXkgaG9sZCBvbmUgb3IgbW9yZSAoc3BhY2Utc2VwYXJhdGVkKSBub2RlIHBhdGhzLlxuU3VjaCBhIHBhdGggY2FuIGJlIGEgW25vZGUgbmFtZV0oI2NvbW1vbi5Ob2RlVHlwZS5uYW1lKSwgb3Jcbm11bHRpcGxlIG5vZGUgbmFtZXMgKG9yIGAqYCB3aWxkY2FyZHMpIHNlcGFyYXRlZCBieSBzbGFzaFxuY2hhcmFjdGVycywgYXMgaW4gYFwiQmxvY2svRGVjbGFyYXRpb24vVmFyaWFibGVOYW1lXCJgLiBTdWNoIGEgcGF0aFxubWF0Y2hlcyB0aGUgZmluYWwgbm9kZSBidXQgb25seSBpZiBpdHMgZGlyZWN0IHBhcmVudCBub2RlcyBhcmUgdGhlXG5vdGhlciBub2RlcyBtZW50aW9uZWQuIEEgYCpgIGluIHN1Y2ggYSBwYXRoIG1hdGNoZXMgYW55IHBhcmVudCxcbmJ1dCBvbmx5IGEgc2luZ2xlIGxldmVsXHUyMDE0d2lsZGNhcmRzIHRoYXQgbWF0Y2ggbXVsdGlwbGUgcGFyZW50c1xuYXJlbid0IHN1cHBvcnRlZCwgYm90aCBmb3IgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIExlemVyXG50cmVlcyBtYWtlIGl0IHJhdGhlciBoYXJkIHRvIHJlYXNvbiBhYm91dCB3aGF0IHRoZXkgd291bGQgbWF0Y2guKVxuXG5BIHBhdGggY2FuIGJlIGVuZGVkIHdpdGggYC8uLi5gIHRvIGluZGljYXRlIHRoYXQgdGhlIHRhZyBhc3NpZ25lZFxudG8gdGhlIG5vZGUgc2hvdWxkIGFsc28gYXBwbHkgdG8gYWxsIGNoaWxkIG5vZGVzLCBldmVuIGlmIHRoZXlcbm1hdGNoIHRoZWlyIG93biBzdHlsZSAoYnkgZGVmYXVsdCwgb25seSB0aGUgaW5uZXJtb3N0IHN0eWxlIGlzXG51c2VkKS5cblxuV2hlbiBhIHBhdGggZW5kcyBpbiBgIWAsIGFzIGluIGBBdHRyaWJ1dGUhYCwgbm8gZnVydGhlciBtYXRjaGluZ1xuaGFwcGVucyBmb3IgdGhlIG5vZGUncyBjaGlsZCBub2RlcywgYW5kIHRoZSBlbnRpcmUgbm9kZSBnZXRzIHRoZVxuZ2l2ZW4gc3R5bGUuXG5cbkluIHRoaXMgbm90YXRpb24sIG5vZGUgbmFtZXMgdGhhdCBjb250YWluIGAvYCwgYCFgLCBgKmAsIG9yIGAuLi5gXG5tdXN0IGJlIHF1b3RlZCBhcyBKU09OIHN0cmluZ3MuXG5cbkZvciBleGFtcGxlOlxuXG5gYGBqYXZhc2NyaXB0XG5wYXJzZXIud2l0aFByb3BzKFxuICBzdHlsZVRhZ3Moe1xuICAgIC8vIFN0eWxlIE51bWJlciBhbmQgQmlnTnVtYmVyIG5vZGVzXG4gICAgXCJOdW1iZXIgQmlnTnVtYmVyXCI6IHRhZ3MubnVtYmVyLFxuICAgIC8vIFN0eWxlIEVzY2FwZSBub2RlcyB3aG9zZSBwYXJlbnQgaXMgU3RyaW5nXG4gICAgXCJTdHJpbmcvRXNjYXBlXCI6IHRhZ3MuZXNjYXBlLFxuICAgIC8vIFN0eWxlIGFueXRoaW5nIGluc2lkZSBBdHRyaWJ1dGVzIG5vZGVzXG4gICAgXCJBdHRyaWJ1dGVzIVwiOiB0YWdzLm1ldGEsXG4gICAgLy8gQWRkIGEgc3R5bGUgdG8gYWxsIGNvbnRlbnQgaW5zaWRlIEl0YWxpYyBub2Rlc1xuICAgIFwiSXRhbGljLy4uLlwiOiB0YWdzLmVtcGhhc2lzLFxuICAgIC8vIFN0eWxlIEludmFsaWRTdHJpbmcgbm9kZXMgYXMgYm90aCBgc3RyaW5nYCBhbmQgYGludmFsaWRgXG4gICAgXCJJbnZhbGlkU3RyaW5nXCI6IFt0YWdzLnN0cmluZywgdGFncy5pbnZhbGlkXSxcbiAgICAvLyBTdHlsZSB0aGUgbm9kZSBuYW1lZCBcIi9cIiBhcyBwdW5jdHVhdGlvblxuICAgICdcIi9cIic6IHRhZ3MucHVuY3R1YXRpb25cbiAgfSlcbilcbmBgYFxuKi9cbmZ1bmN0aW9uIHN0eWxlVGFncyhzcGVjKSB7XG4gICAgbGV0IGJ5TmFtZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgcHJvcCBpbiBzcGVjKSB7XG4gICAgICAgIGxldCB0YWdzID0gc3BlY1twcm9wXTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRhZ3MpKVxuICAgICAgICAgICAgdGFncyA9IFt0YWdzXTtcbiAgICAgICAgZm9yIChsZXQgcGFydCBvZiBwcm9wLnNwbGl0KFwiIFwiKSlcbiAgICAgICAgICAgIGlmIChwYXJ0KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBpZWNlcyA9IFtdLCBtb2RlID0gMiAvKiBNb2RlLk5vcm1hbCAqLywgcmVzdCA9IHBhcnQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcG9zID0gMDs7KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN0ID09IFwiLi4uXCIgJiYgcG9zID4gMCAmJiBwb3MgKyAzID09IHBhcnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gMSAvKiBNb2RlLkluaGVyaXQgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgbSA9IC9eXCIoPzpbXlwiXFxcXF18XFxcXC4pKj9cInxbXlxcLyFdKy8uZXhlYyhyZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHBhdGg6IFwiICsgcGFydCk7XG4gICAgICAgICAgICAgICAgICAgIHBpZWNlcy5wdXNoKG1bMF0gPT0gXCIqXCIgPyBcIlwiIDogbVswXVswXSA9PSAnXCInID8gSlNPTi5wYXJzZShtWzBdKSA6IG1bMF0pO1xuICAgICAgICAgICAgICAgICAgICBwb3MgKz0gbVswXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gcGFydC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSBwYXJ0W3BvcysrXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBwYXJ0Lmxlbmd0aCAmJiBuZXh0ID09IFwiIVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gMCAvKiBNb2RlLk9wYXF1ZSAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9IFwiL1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHBhdGg6IFwiICsgcGFydCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3QgPSBwYXJ0LnNsaWNlKHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gcGllY2VzLmxlbmd0aCAtIDEsIGlubmVyID0gcGllY2VzW2xhc3RdO1xuICAgICAgICAgICAgICAgIGlmICghaW5uZXIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBwYXRoOiBcIiArIHBhcnQpO1xuICAgICAgICAgICAgICAgIGxldCBydWxlID0gbmV3IFJ1bGUodGFncywgbW9kZSwgbGFzdCA+IDAgPyBwaWVjZXMuc2xpY2UoMCwgbGFzdCkgOiBudWxsKTtcbiAgICAgICAgICAgICAgICBieU5hbWVbaW5uZXJdID0gcnVsZS5zb3J0KGJ5TmFtZVtpbm5lcl0pO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcnVsZU5vZGVQcm9wLmFkZChieU5hbWUpO1xufVxuY29uc3QgcnVsZU5vZGVQcm9wID0gbmV3IE5vZGVQcm9wKCk7XG5jbGFzcyBSdWxlIHtcbiAgICBjb25zdHJ1Y3Rvcih0YWdzLCBtb2RlLCBjb250ZXh0LCBuZXh0KSB7XG4gICAgICAgIHRoaXMudGFncyA9IHRhZ3M7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMubmV4dCA9IG5leHQ7XG4gICAgfVxuICAgIGdldCBvcGFxdWUoKSB7IHJldHVybiB0aGlzLm1vZGUgPT0gMCAvKiBNb2RlLk9wYXF1ZSAqLzsgfVxuICAgIGdldCBpbmhlcml0KCkgeyByZXR1cm4gdGhpcy5tb2RlID09IDEgLyogTW9kZS5Jbmhlcml0ICovOyB9XG4gICAgc29ydChvdGhlcikge1xuICAgICAgICBpZiAoIW90aGVyIHx8IG90aGVyLmRlcHRoIDwgdGhpcy5kZXB0aCkge1xuICAgICAgICAgICAgdGhpcy5uZXh0ID0gb3RoZXI7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBvdGhlci5uZXh0ID0gdGhpcy5zb3J0KG90aGVyLm5leHQpO1xuICAgICAgICByZXR1cm4gb3RoZXI7XG4gICAgfVxuICAgIGdldCBkZXB0aCgpIHsgcmV0dXJuIHRoaXMuY29udGV4dCA/IHRoaXMuY29udGV4dC5sZW5ndGggOiAwOyB9XG59XG5SdWxlLmVtcHR5ID0gbmV3IFJ1bGUoW10sIDIgLyogTW9kZS5Ob3JtYWwgKi8sIG51bGwpO1xuLyoqXG5EZWZpbmUgYSBbaGlnaGxpZ2h0ZXJdKCNoaWdobGlnaHQuSGlnaGxpZ2h0ZXIpIGZyb20gYW4gYXJyYXkgb2ZcbnRhZy9jbGFzcyBwYWlycy4gQ2xhc3NlcyBhc3NvY2lhdGVkIHdpdGggbW9yZSBzcGVjaWZpYyB0YWdzIHdpbGxcbnRha2UgcHJlY2VkZW5jZS5cbiovXG5mdW5jdGlvbiB0YWdIaWdobGlnaHRlcih0YWdzLCBvcHRpb25zKSB7XG4gICAgbGV0IG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgc3R5bGUgb2YgdGFncykge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3R5bGUudGFnKSlcbiAgICAgICAgICAgIG1hcFtzdHlsZS50YWcuaWRdID0gc3R5bGUuY2xhc3M7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZvciAobGV0IHRhZyBvZiBzdHlsZS50YWcpXG4gICAgICAgICAgICAgICAgbWFwW3RhZy5pZF0gPSBzdHlsZS5jbGFzcztcbiAgICB9XG4gICAgbGV0IHsgc2NvcGUsIGFsbCA9IG51bGwgfSA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3R5bGU6ICh0YWdzKSA9PiB7XG4gICAgICAgICAgICBsZXQgY2xzID0gYWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgdGFnIG9mIHRhZ3MpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzdWIgb2YgdGFnLnNldCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFnQ2xhc3MgPSBtYXBbc3ViLmlkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHMgPSBjbHMgPyBjbHMgKyBcIiBcIiArIHRhZ0NsYXNzIDogdGFnQ2xhc3M7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbHM7XG4gICAgICAgIH0sXG4gICAgICAgIHNjb3BlXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGhpZ2hsaWdodFRhZ3MoaGlnaGxpZ2h0ZXJzLCB0YWdzKSB7XG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgZm9yIChsZXQgaGlnaGxpZ2h0ZXIgb2YgaGlnaGxpZ2h0ZXJzKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGhpZ2hsaWdodGVyLnN0eWxlKHRhZ3MpO1xuICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgPyByZXN1bHQgKyBcIiBcIiArIHZhbHVlIDogdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbkhpZ2hsaWdodCB0aGUgZ2l2ZW4gW3RyZWVdKCNjb21tb24uVHJlZSkgd2l0aCB0aGUgZ2l2ZW5cbltoaWdobGlnaHRlcl0oI2hpZ2hsaWdodC5IaWdobGlnaHRlcikuIE9mdGVuLCB0aGUgaGlnaGVyLWxldmVsXG5bYGhpZ2hsaWdodENvZGVgXSgjaGlnaGxpZ2h0LmhpZ2hsaWdodENvZGUpIGZ1bmN0aW9uIGlzIGVhc2llciB0b1xudXNlLlxuKi9cbmZ1bmN0aW9uIGhpZ2hsaWdodFRyZWUodHJlZSwgaGlnaGxpZ2h0ZXIsIFxuLyoqXG5Bc3NpZ24gc3R5bGluZyB0byBhIHJlZ2lvbiBvZiB0aGUgdGV4dC4gV2lsbCBiZSBjYWxsZWQsIGluIG9yZGVyXG5vZiBwb3NpdGlvbiwgZm9yIGFueSByYW5nZXMgd2hlcmUgbW9yZSB0aGFuIHplcm8gY2xhc3NlcyBhcHBseS5cbmBjbGFzc2VzYCBpcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgb2YgQ1NTIGNsYXNzZXMuXG4qL1xucHV0U3R5bGUsIFxuLyoqXG5UaGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGhpZ2hsaWdodC5cbiovXG5mcm9tID0gMCwgXG4vKipcblRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuKi9cbnRvID0gdHJlZS5sZW5ndGgpIHtcbiAgICBsZXQgYnVpbGRlciA9IG5ldyBIaWdobGlnaHRCdWlsZGVyKGZyb20sIEFycmF5LmlzQXJyYXkoaGlnaGxpZ2h0ZXIpID8gaGlnaGxpZ2h0ZXIgOiBbaGlnaGxpZ2h0ZXJdLCBwdXRTdHlsZSk7XG4gICAgYnVpbGRlci5oaWdobGlnaHRSYW5nZSh0cmVlLmN1cnNvcigpLCBmcm9tLCB0bywgXCJcIiwgYnVpbGRlci5oaWdobGlnaHRlcnMpO1xuICAgIGJ1aWxkZXIuZmx1c2godG8pO1xufVxuLyoqXG5IaWdobGlnaHQgdGhlIGdpdmVuIHRyZWUgd2l0aCB0aGUgZ2l2ZW4gaGlnaGxpZ2h0ZXIsIGNhbGxpbmdcbmBwdXRUZXh0YCBmb3IgZXZlcnkgcGllY2Ugb2YgdGV4dCwgZWl0aGVyIHdpdGggYSBzZXQgb2YgY2xhc3NlcyBvclxud2l0aCB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gdW5zdHlsZWQsIGFuZCBgcHV0QnJlYWtgIGZvciBldmVyeSBsaW5lXG5icmVhay5cbiovXG5mdW5jdGlvbiBoaWdobGlnaHRDb2RlKGNvZGUsIHRyZWUsIGhpZ2hsaWdodGVyLCBwdXRUZXh0LCBwdXRCcmVhaywgZnJvbSA9IDAsIHRvID0gY29kZS5sZW5ndGgpIHtcbiAgICBsZXQgcG9zID0gZnJvbTtcbiAgICBmdW5jdGlvbiB3cml0ZVRvKHAsIGNsYXNzZXMpIHtcbiAgICAgICAgaWYgKHAgPD0gcG9zKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCB0ZXh0ID0gY29kZS5zbGljZShwb3MsIHApLCBpID0gMDs7KSB7XG4gICAgICAgICAgICBsZXQgbmV4dEJyZWFrID0gdGV4dC5pbmRleE9mKFwiXFxuXCIsIGkpO1xuICAgICAgICAgICAgbGV0IHVwdG8gPSBuZXh0QnJlYWsgPCAwID8gdGV4dC5sZW5ndGggOiBuZXh0QnJlYWs7XG4gICAgICAgICAgICBpZiAodXB0byA+IGkpXG4gICAgICAgICAgICAgICAgcHV0VGV4dCh0ZXh0LnNsaWNlKGksIHVwdG8pLCBjbGFzc2VzKTtcbiAgICAgICAgICAgIGlmIChuZXh0QnJlYWsgPCAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcHV0QnJlYWsoKTtcbiAgICAgICAgICAgIGkgPSBuZXh0QnJlYWsgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHBvcyA9IHA7XG4gICAgfVxuICAgIGhpZ2hsaWdodFRyZWUodHJlZSwgaGlnaGxpZ2h0ZXIsIChmcm9tLCB0bywgY2xhc3NlcykgPT4ge1xuICAgICAgICB3cml0ZVRvKGZyb20sIFwiXCIpO1xuICAgICAgICB3cml0ZVRvKHRvLCBjbGFzc2VzKTtcbiAgICB9LCBmcm9tLCB0byk7XG4gICAgd3JpdGVUbyh0bywgXCJcIik7XG59XG5jbGFzcyBIaWdobGlnaHRCdWlsZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihhdCwgaGlnaGxpZ2h0ZXJzLCBzcGFuKSB7XG4gICAgICAgIHRoaXMuYXQgPSBhdDtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlcnMgPSBoaWdobGlnaHRlcnM7XG4gICAgICAgIHRoaXMuc3BhbiA9IHNwYW47XG4gICAgICAgIHRoaXMuY2xhc3MgPSBcIlwiO1xuICAgIH1cbiAgICBzdGFydFNwYW4oYXQsIGNscykge1xuICAgICAgICBpZiAoY2xzICE9IHRoaXMuY2xhc3MpIHtcbiAgICAgICAgICAgIHRoaXMuZmx1c2goYXQpO1xuICAgICAgICAgICAgaWYgKGF0ID4gdGhpcy5hdClcbiAgICAgICAgICAgICAgICB0aGlzLmF0ID0gYXQ7XG4gICAgICAgICAgICB0aGlzLmNsYXNzID0gY2xzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZsdXNoKHRvKSB7XG4gICAgICAgIGlmICh0byA+IHRoaXMuYXQgJiYgdGhpcy5jbGFzcylcbiAgICAgICAgICAgIHRoaXMuc3Bhbih0aGlzLmF0LCB0bywgdGhpcy5jbGFzcyk7XG4gICAgfVxuICAgIGhpZ2hsaWdodFJhbmdlKGN1cnNvciwgZnJvbSwgdG8sIGluaGVyaXRlZENsYXNzLCBoaWdobGlnaHRlcnMpIHtcbiAgICAgICAgbGV0IHsgdHlwZSwgZnJvbTogc3RhcnQsIHRvOiBlbmQgfSA9IGN1cnNvcjtcbiAgICAgICAgaWYgKHN0YXJ0ID49IHRvIHx8IGVuZCA8PSBmcm9tKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodHlwZS5pc1RvcClcbiAgICAgICAgICAgIGhpZ2hsaWdodGVycyA9IHRoaXMuaGlnaGxpZ2h0ZXJzLmZpbHRlcihoID0+ICFoLnNjb3BlIHx8IGguc2NvcGUodHlwZSkpO1xuICAgICAgICBsZXQgY2xzID0gaW5oZXJpdGVkQ2xhc3M7XG4gICAgICAgIGxldCBydWxlID0gZ2V0U3R5bGVUYWdzKGN1cnNvcikgfHwgUnVsZS5lbXB0eTtcbiAgICAgICAgbGV0IHRhZ0NscyA9IGhpZ2hsaWdodFRhZ3MoaGlnaGxpZ2h0ZXJzLCBydWxlLnRhZ3MpO1xuICAgICAgICBpZiAodGFnQ2xzKSB7XG4gICAgICAgICAgICBpZiAoY2xzKVxuICAgICAgICAgICAgICAgIGNscyArPSBcIiBcIjtcbiAgICAgICAgICAgIGNscyArPSB0YWdDbHM7XG4gICAgICAgICAgICBpZiAocnVsZS5tb2RlID09IDEgLyogTW9kZS5Jbmhlcml0ICovKVxuICAgICAgICAgICAgICAgIGluaGVyaXRlZENsYXNzICs9IChpbmhlcml0ZWRDbGFzcyA/IFwiIFwiIDogXCJcIikgKyB0YWdDbHM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFydFNwYW4oTWF0aC5tYXgoZnJvbSwgc3RhcnQpLCBjbHMpO1xuICAgICAgICBpZiAocnVsZS5vcGFxdWUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBtb3VudGVkID0gY3Vyc29yLnRyZWUgJiYgY3Vyc29yLnRyZWUucHJvcChOb2RlUHJvcC5tb3VudGVkKTtcbiAgICAgICAgaWYgKG1vdW50ZWQgJiYgbW91bnRlZC5vdmVybGF5KSB7XG4gICAgICAgICAgICBsZXQgaW5uZXIgPSBjdXJzb3Iubm9kZS5lbnRlcihtb3VudGVkLm92ZXJsYXlbMF0uZnJvbSArIHN0YXJ0LCAxKTtcbiAgICAgICAgICAgIGxldCBpbm5lckhpZ2hsaWdodGVycyA9IHRoaXMuaGlnaGxpZ2h0ZXJzLmZpbHRlcihoID0+ICFoLnNjb3BlIHx8IGguc2NvcGUobW91bnRlZC50cmVlLnR5cGUpKTtcbiAgICAgICAgICAgIGxldCBoYXNDaGlsZCA9IGN1cnNvci5maXJzdENoaWxkKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gc3RhcnQ7OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGkgPCBtb3VudGVkLm92ZXJsYXkubGVuZ3RoID8gbW91bnRlZC5vdmVybGF5W2ldIDogbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFBvcyA9IG5leHQgPyBuZXh0LmZyb20gKyBzdGFydCA6IGVuZDtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2VGcm9tID0gTWF0aC5tYXgoZnJvbSwgcG9zKSwgcmFuZ2VUbyA9IE1hdGgubWluKHRvLCBuZXh0UG9zKTtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2VGcm9tIDwgcmFuZ2VUbyAmJiBoYXNDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY3Vyc29yLmZyb20gPCByYW5nZVRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFJhbmdlKGN1cnNvciwgcmFuZ2VGcm9tLCByYW5nZVRvLCBpbmhlcml0ZWRDbGFzcywgaGlnaGxpZ2h0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRTcGFuKE1hdGgubWluKHJhbmdlVG8sIGN1cnNvci50byksIGNscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLnRvID49IG5leHRQb3MgfHwgIWN1cnNvci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbmV4dCB8fCBuZXh0UG9zID4gdG8pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHBvcyA9IG5leHQudG8gKyBzdGFydDtcbiAgICAgICAgICAgICAgICBpZiAocG9zID4gZnJvbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFJhbmdlKGlubmVyLmN1cnNvcigpLCBNYXRoLm1heChmcm9tLCBuZXh0LmZyb20gKyBzdGFydCksIE1hdGgubWluKHRvLCBwb3MpLCBcIlwiLCBpbm5lckhpZ2hsaWdodGVycyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRTcGFuKE1hdGgubWluKHRvLCBwb3MpLCBjbHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYXNDaGlsZClcbiAgICAgICAgICAgICAgICBjdXJzb3IucGFyZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3Vyc29yLmZpcnN0Q2hpbGQoKSkge1xuICAgICAgICAgICAgaWYgKG1vdW50ZWQpXG4gICAgICAgICAgICAgICAgaW5oZXJpdGVkQ2xhc3MgPSBcIlwiO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IudG8gPD0gZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5mcm9tID49IHRvKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFJhbmdlKGN1cnNvciwgZnJvbSwgdG8sIGluaGVyaXRlZENsYXNzLCBoaWdobGlnaHRlcnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRTcGFuKE1hdGgubWluKHRvLCBjdXJzb3IudG8pLCBjbHMpO1xuICAgICAgICAgICAgfSB3aGlsZSAoY3Vyc29yLm5leHRTaWJsaW5nKCkpO1xuICAgICAgICAgICAgY3Vyc29yLnBhcmVudCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG5NYXRjaCBhIHN5bnRheCBub2RlJ3MgW2hpZ2hsaWdodCBydWxlc10oI2hpZ2hsaWdodC5zdHlsZVRhZ3MpLiBJZlxudGhlcmUncyBhIG1hdGNoLCByZXR1cm4gaXRzIHNldCBvZiB0YWdzLCBhbmQgd2hldGhlciBpdCBpc1xub3BhcXVlICh1c2VzIGEgYCFgKSBvciBhcHBsaWVzIHRvIGFsbCBjaGlsZCBub2RlcyAoYC8uLi5gKS5cbiovXG5mdW5jdGlvbiBnZXRTdHlsZVRhZ3Mobm9kZSkge1xuICAgIGxldCBydWxlID0gbm9kZS50eXBlLnByb3AocnVsZU5vZGVQcm9wKTtcbiAgICB3aGlsZSAocnVsZSAmJiBydWxlLmNvbnRleHQgJiYgIW5vZGUubWF0Y2hDb250ZXh0KHJ1bGUuY29udGV4dCkpXG4gICAgICAgIHJ1bGUgPSBydWxlLm5leHQ7XG4gICAgcmV0dXJuIHJ1bGUgfHwgbnVsbDtcbn1cbmNvbnN0IHQgPSBUYWcuZGVmaW5lO1xuY29uc3QgY29tbWVudCA9IHQoKSwgbmFtZSA9IHQoKSwgdHlwZU5hbWUgPSB0KG5hbWUpLCBwcm9wZXJ0eU5hbWUgPSB0KG5hbWUpLCBsaXRlcmFsID0gdCgpLCBzdHJpbmcgPSB0KGxpdGVyYWwpLCBudW1iZXIgPSB0KGxpdGVyYWwpLCBjb250ZW50ID0gdCgpLCBoZWFkaW5nID0gdChjb250ZW50KSwga2V5d29yZCA9IHQoKSwgb3BlcmF0b3IgPSB0KCksIHB1bmN0dWF0aW9uID0gdCgpLCBicmFja2V0ID0gdChwdW5jdHVhdGlvbiksIG1ldGEgPSB0KCk7XG4vKipcblRoZSBkZWZhdWx0IHNldCBvZiBoaWdobGlnaHRpbmcgW3RhZ3NdKCNoaWdobGlnaHQuVGFnKS5cblxuVGhpcyBjb2xsZWN0aW9uIGlzIGhlYXZpbHkgYmlhc2VkIHRvd2FyZHMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLFxuYW5kIG5lY2Vzc2FyaWx5IGluY29tcGxldGUuIEEgZnVsbCBvbnRvbG9neSBvZiBzeW50YWN0aWNcbmNvbnN0cnVjdHMgd291bGQgZmlsbCBhIHN0YWNrIG9mIGJvb2tzLCBhbmQgYmUgaW1wcmFjdGljYWwgdG9cbndyaXRlIHRoZW1lcyBmb3IuIFNvIHRyeSB0byBtYWtlIGRvIHdpdGggdGhpcyBzZXQuIElmIGFsbCBlbHNlXG5mYWlscywgW29wZW4gYW5cbmlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yLm5leHQpIHRvIHByb3Bvc2UgYVxubmV3IHRhZywgb3IgW2RlZmluZV0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lKSBhIGxvY2FsIGN1c3RvbSB0YWcgZm9yXG55b3VyIHVzZSBjYXNlLlxuXG5Ob3RlIHRoYXQgaXQgaXMgbm90IG9ibGlnYXRvcnkgdG8gYWx3YXlzIGF0dGFjaCB0aGUgbW9zdCBzcGVjaWZpY1xudGFnIHBvc3NpYmxlIHRvIGFuIGVsZW1lbnRcdTIwMTRpZiB5b3VyIGdyYW1tYXIgY2FuJ3QgZWFzaWx5XG5kaXN0aW5ndWlzaCBhIGNlcnRhaW4gdHlwZSBvZiBlbGVtZW50IChzdWNoIGFzIGEgbG9jYWwgdmFyaWFibGUpLFxuaXQgaXMgb2theSB0byBzdHlsZSBpdCBhcyBpdHMgbW9yZSBnZW5lcmFsIHZhcmlhbnQgKGEgdmFyaWFibGUpLlxuXG5Gb3IgdGFncyB0aGF0IGV4dGVuZCBzb21lIHBhcmVudCB0YWcsIHRoZSBkb2N1bWVudGF0aW9uIGxpbmtzIHRvXG50aGUgcGFyZW50LlxuKi9cbmNvbnN0IHRhZ3MgPSB7XG4gICAgLyoqXG4gICAgQSBjb21tZW50LlxuICAgICovXG4gICAgY29tbWVudCxcbiAgICAvKipcbiAgICBBIGxpbmUgW2NvbW1lbnRdKCNoaWdobGlnaHQudGFncy5jb21tZW50KS5cbiAgICAqL1xuICAgIGxpbmVDb21tZW50OiB0KGNvbW1lbnQpLFxuICAgIC8qKlxuICAgIEEgYmxvY2sgW2NvbW1lbnRdKCNoaWdobGlnaHQudGFncy5jb21tZW50KS5cbiAgICAqL1xuICAgIGJsb2NrQ29tbWVudDogdChjb21tZW50KSxcbiAgICAvKipcbiAgICBBIGRvY3VtZW50YXRpb24gW2NvbW1lbnRdKCNoaWdobGlnaHQudGFncy5jb21tZW50KS5cbiAgICAqL1xuICAgIGRvY0NvbW1lbnQ6IHQoY29tbWVudCksXG4gICAgLyoqXG4gICAgQW55IGtpbmQgb2YgaWRlbnRpZmllci5cbiAgICAqL1xuICAgIG5hbWUsXG4gICAgLyoqXG4gICAgVGhlIFtuYW1lXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZSkgb2YgYSB2YXJpYWJsZS5cbiAgICAqL1xuICAgIHZhcmlhYmxlTmFtZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBBIHR5cGUgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKS5cbiAgICAqL1xuICAgIHR5cGVOYW1lOiB0eXBlTmFtZSxcbiAgICAvKipcbiAgICBBIHRhZyBuYW1lIChzdWJ0YWcgb2YgW2B0eXBlTmFtZWBdKCNoaWdobGlnaHQudGFncy50eXBlTmFtZSkpLlxuICAgICovXG4gICAgdGFnTmFtZTogdCh0eXBlTmFtZSksXG4gICAgLyoqXG4gICAgQSBwcm9wZXJ0eSBvciBmaWVsZCBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpLlxuICAgICovXG4gICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgLyoqXG4gICAgQW4gYXR0cmlidXRlIG5hbWUgKHN1YnRhZyBvZiBbYHByb3BlcnR5TmFtZWBdKCNoaWdobGlnaHQudGFncy5wcm9wZXJ0eU5hbWUpKS5cbiAgICAqL1xuICAgIGF0dHJpYnV0ZU5hbWU6IHQocHJvcGVydHlOYW1lKSxcbiAgICAvKipcbiAgICBUaGUgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKSBvZiBhIGNsYXNzLlxuICAgICovXG4gICAgY2xhc3NOYW1lOiB0KG5hbWUpLFxuICAgIC8qKlxuICAgIEEgbGFiZWwgW25hbWVdKCNoaWdobGlnaHQudGFncy5uYW1lKS5cbiAgICAqL1xuICAgIGxhYmVsTmFtZTogdChuYW1lKSxcbiAgICAvKipcbiAgICBBIG5hbWVzcGFjZSBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpLlxuICAgICovXG4gICAgbmFtZXNwYWNlOiB0KG5hbWUpLFxuICAgIC8qKlxuICAgIFRoZSBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpIG9mIGEgbWFjcm8uXG4gICAgKi9cbiAgICBtYWNyb05hbWU6IHQobmFtZSksXG4gICAgLyoqXG4gICAgQSBsaXRlcmFsIHZhbHVlLlxuICAgICovXG4gICAgbGl0ZXJhbCxcbiAgICAvKipcbiAgICBBIHN0cmluZyBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgc3RyaW5nLFxuICAgIC8qKlxuICAgIEEgZG9jdW1lbnRhdGlvbiBbc3RyaW5nXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKS5cbiAgICAqL1xuICAgIGRvY1N0cmluZzogdChzdHJpbmcpLFxuICAgIC8qKlxuICAgIEEgY2hhcmFjdGVyIGxpdGVyYWwgKHN1YnRhZyBvZiBbc3RyaW5nXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKSkuXG4gICAgKi9cbiAgICBjaGFyYWN0ZXI6IHQoc3RyaW5nKSxcbiAgICAvKipcbiAgICBBbiBhdHRyaWJ1dGUgdmFsdWUgKHN1YnRhZyBvZiBbc3RyaW5nXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKSkuXG4gICAgKi9cbiAgICBhdHRyaWJ1dGVWYWx1ZTogdChzdHJpbmcpLFxuICAgIC8qKlxuICAgIEEgbnVtYmVyIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCkuXG4gICAgKi9cbiAgICBudW1iZXIsXG4gICAgLyoqXG4gICAgQW4gaW50ZWdlciBbbnVtYmVyXSgjaGlnaGxpZ2h0LnRhZ3MubnVtYmVyKSBsaXRlcmFsLlxuICAgICovXG4gICAgaW50ZWdlcjogdChudW1iZXIpLFxuICAgIC8qKlxuICAgIEEgZmxvYXRpbmctcG9pbnQgW251bWJlcl0oI2hpZ2hsaWdodC50YWdzLm51bWJlcikgbGl0ZXJhbC5cbiAgICAqL1xuICAgIGZsb2F0OiB0KG51bWJlciksXG4gICAgLyoqXG4gICAgQSBib29sZWFuIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCkuXG4gICAgKi9cbiAgICBib29sOiB0KGxpdGVyYWwpLFxuICAgIC8qKlxuICAgIFJlZ3VsYXIgZXhwcmVzc2lvbiBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgcmVnZXhwOiB0KGxpdGVyYWwpLFxuICAgIC8qKlxuICAgIEFuIGVzY2FwZSBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLCBmb3IgZXhhbXBsZSBhXG4gICAgYmFja3NsYXNoIGVzY2FwZSBpbiBhIHN0cmluZy5cbiAgICAqL1xuICAgIGVzY2FwZTogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBBIGNvbG9yIFtsaXRlcmFsXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbCkuXG4gICAgKi9cbiAgICBjb2xvcjogdChsaXRlcmFsKSxcbiAgICAvKipcbiAgICBBIFVSTCBbbGl0ZXJhbF0oI2hpZ2hsaWdodC50YWdzLmxpdGVyYWwpLlxuICAgICovXG4gICAgdXJsOiB0KGxpdGVyYWwpLFxuICAgIC8qKlxuICAgIEEgbGFuZ3VhZ2Uga2V5d29yZC5cbiAgICAqL1xuICAgIGtleXdvcmQsXG4gICAgLyoqXG4gICAgVGhlIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgZm9yIHRoZSBzZWxmIG9yIHRoaXNcbiAgICBvYmplY3QuXG4gICAgKi9cbiAgICBzZWxmOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIFRoZSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIGZvciBudWxsLlxuICAgICovXG4gICAgbnVsbDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgZGVub3Rpbmcgc29tZSBhdG9taWMgdmFsdWUuXG4gICAgKi9cbiAgICBhdG9tOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSB0aGF0IHJlcHJlc2VudHMgYSB1bml0LlxuICAgICovXG4gICAgdW5pdDogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIG1vZGlmaWVyIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkuXG4gICAgKi9cbiAgICBtb2RpZmllcjogdChrZXl3b3JkKSxcbiAgICAvKipcbiAgICBBIFtrZXl3b3JkXSgjaGlnaGxpZ2h0LnRhZ3Mua2V5d29yZCkgdGhhdCBhY3RzIGFzIGFuIG9wZXJhdG9yLlxuICAgICovXG4gICAgb3BlcmF0b3JLZXl3b3JkOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgY29udHJvbC1mbG93IHJlbGF0ZWQgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKS5cbiAgICAqL1xuICAgIGNvbnRyb2xLZXl3b3JkOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEEgW2tleXdvcmRdKCNoaWdobGlnaHQudGFncy5rZXl3b3JkKSB0aGF0IGRlZmluZXMgc29tZXRoaW5nLlxuICAgICovXG4gICAgZGVmaW5pdGlvbktleXdvcmQ6IHQoa2V5d29yZCksXG4gICAgLyoqXG4gICAgQSBba2V5d29yZF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpIHJlbGF0ZWQgdG8gZGVmaW5pbmcgb3JcbiAgICBpbnRlcmZhY2luZyB3aXRoIG1vZHVsZXMuXG4gICAgKi9cbiAgICBtb2R1bGVLZXl3b3JkOiB0KGtleXdvcmQpLFxuICAgIC8qKlxuICAgIEFuIG9wZXJhdG9yLlxuICAgICovXG4gICAgb3BlcmF0b3IsXG4gICAgLyoqXG4gICAgQW4gW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpIHRoYXQgZGVyZWZlcmVuY2VzIHNvbWV0aGluZy5cbiAgICAqL1xuICAgIGRlcmVmT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIEFyaXRobWV0aWMtcmVsYXRlZCBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICBhcml0aG1ldGljT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIExvZ2ljYWwgW29wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpLlxuICAgICovXG4gICAgbG9naWNPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgQml0IFtvcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKS5cbiAgICAqL1xuICAgIGJpdHdpc2VPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgQ29tcGFyaXNvbiBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICBjb21wYXJlT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIFtPcGVyYXRvcl0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKSB0aGF0IHVwZGF0ZXMgaXRzIG9wZXJhbmQuXG4gICAgKi9cbiAgICB1cGRhdGVPcGVyYXRvcjogdChvcGVyYXRvciksXG4gICAgLyoqXG4gICAgW09wZXJhdG9yXSgjaGlnaGxpZ2h0LnRhZ3Mub3BlcmF0b3IpIHRoYXQgZGVmaW5lcyBzb21ldGhpbmcuXG4gICAgKi9cbiAgICBkZWZpbml0aW9uT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIFR5cGUtcmVsYXRlZCBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICB0eXBlT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIENvbnRyb2wtZmxvdyBbb3BlcmF0b3JdKCNoaWdobGlnaHQudGFncy5vcGVyYXRvcikuXG4gICAgKi9cbiAgICBjb250cm9sT3BlcmF0b3I6IHQob3BlcmF0b3IpLFxuICAgIC8qKlxuICAgIFByb2dyYW0gb3IgbWFya3VwIHB1bmN0dWF0aW9uLlxuICAgICovXG4gICAgcHVuY3R1YXRpb24sXG4gICAgLyoqXG4gICAgW1B1bmN0dWF0aW9uXSgjaGlnaGxpZ2h0LnRhZ3MucHVuY3R1YXRpb24pIHRoYXQgc2VwYXJhdGVzXG4gICAgdGhpbmdzLlxuICAgICovXG4gICAgc2VwYXJhdG9yOiB0KHB1bmN0dWF0aW9uKSxcbiAgICAvKipcbiAgICBCcmFja2V0LXN0eWxlIFtwdW5jdHVhdGlvbl0oI2hpZ2hsaWdodC50YWdzLnB1bmN0dWF0aW9uKS5cbiAgICAqL1xuICAgIGJyYWNrZXQsXG4gICAgLyoqXG4gICAgQW5nbGUgW2JyYWNrZXRzXSgjaGlnaGxpZ2h0LnRhZ3MuYnJhY2tldCkgKHVzdWFsbHkgYDxgIGFuZCBgPmBcbiAgICB0b2tlbnMpLlxuICAgICovXG4gICAgYW5nbGVCcmFja2V0OiB0KGJyYWNrZXQpLFxuICAgIC8qKlxuICAgIFNxdWFyZSBbYnJhY2tldHNdKCNoaWdobGlnaHQudGFncy5icmFja2V0KSAodXN1YWxseSBgW2AgYW5kIGBdYFxuICAgIHRva2VucykuXG4gICAgKi9cbiAgICBzcXVhcmVCcmFja2V0OiB0KGJyYWNrZXQpLFxuICAgIC8qKlxuICAgIFBhcmVudGhlc2VzICh1c3VhbGx5IGAoYCBhbmQgYClgIHRva2VucykuIFN1YnRhZyBvZlxuICAgIFticmFja2V0XSgjaGlnaGxpZ2h0LnRhZ3MuYnJhY2tldCkuXG4gICAgKi9cbiAgICBwYXJlbjogdChicmFja2V0KSxcbiAgICAvKipcbiAgICBCcmFjZXMgKHVzdWFsbHkgYHtgIGFuZCBgfWAgdG9rZW5zKS4gU3VidGFnIG9mXG4gICAgW2JyYWNrZXRdKCNoaWdobGlnaHQudGFncy5icmFja2V0KS5cbiAgICAqL1xuICAgIGJyYWNlOiB0KGJyYWNrZXQpLFxuICAgIC8qKlxuICAgIENvbnRlbnQsIGZvciBleGFtcGxlIHBsYWluIHRleHQgaW4gWE1MIG9yIG1hcmt1cCBkb2N1bWVudHMuXG4gICAgKi9cbiAgICBjb250ZW50LFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCByZXByZXNlbnRzIGEgaGVhZGluZy5cbiAgICAqL1xuICAgIGhlYWRpbmcsXG4gICAgLyoqXG4gICAgQSBsZXZlbCAxIFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nMTogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDIgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmcyOiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgMyBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzM6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBsZXZlbCA0IFtoZWFkaW5nXSgjaGlnaGxpZ2h0LnRhZ3MuaGVhZGluZykuXG4gICAgKi9cbiAgICBoZWFkaW5nNDogdChoZWFkaW5nKSxcbiAgICAvKipcbiAgICBBIGxldmVsIDUgW2hlYWRpbmddKCNoaWdobGlnaHQudGFncy5oZWFkaW5nKS5cbiAgICAqL1xuICAgIGhlYWRpbmc1OiB0KGhlYWRpbmcpLFxuICAgIC8qKlxuICAgIEEgbGV2ZWwgNiBbaGVhZGluZ10oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpLlxuICAgICovXG4gICAgaGVhZGluZzY6IHQoaGVhZGluZyksXG4gICAgLyoqXG4gICAgQSBwcm9zZSBzZXBhcmF0b3IgKHN1Y2ggYXMgYSBob3Jpem9udGFsIHJ1bGUpLlxuICAgICovXG4gICAgY29udGVudFNlcGFyYXRvcjogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgcmVwcmVzZW50cyBhIGxpc3QuXG4gICAgKi9cbiAgICBsaXN0OiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCByZXByZXNlbnRzIGEgcXVvdGUuXG4gICAgKi9cbiAgICBxdW90ZTogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBbQ29udGVudF0oI2hpZ2hsaWdodC50YWdzLmNvbnRlbnQpIHRoYXQgaXMgZW1waGFzaXplZC5cbiAgICAqL1xuICAgIGVtcGhhc2lzOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBpcyBzdHlsZWQgc3Ryb25nLlxuICAgICovXG4gICAgc3Ryb25nOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBpcyBwYXJ0IG9mIGEgbGluay5cbiAgICAqL1xuICAgIGxpbms6IHQoY29udGVudCksXG4gICAgLyoqXG4gICAgW0NvbnRlbnRdKCNoaWdobGlnaHQudGFncy5jb250ZW50KSB0aGF0IGlzIHN0eWxlZCBhcyBjb2RlIG9yXG4gICAgbW9ub3NwYWNlLlxuICAgICovXG4gICAgbW9ub3NwYWNlOiB0KGNvbnRlbnQpLFxuICAgIC8qKlxuICAgIFtDb250ZW50XSgjaGlnaGxpZ2h0LnRhZ3MuY29udGVudCkgdGhhdCBoYXMgYSBzdHJpa2UtdGhyb3VnaFxuICAgIHN0eWxlLlxuICAgICovXG4gICAgc3RyaWtldGhyb3VnaDogdChjb250ZW50KSxcbiAgICAvKipcbiAgICBJbnNlcnRlZCB0ZXh0IGluIGEgY2hhbmdlLXRyYWNraW5nIGZvcm1hdC5cbiAgICAqL1xuICAgIGluc2VydGVkOiB0KCksXG4gICAgLyoqXG4gICAgRGVsZXRlZCB0ZXh0LlxuICAgICovXG4gICAgZGVsZXRlZDogdCgpLFxuICAgIC8qKlxuICAgIENoYW5nZWQgdGV4dC5cbiAgICAqL1xuICAgIGNoYW5nZWQ6IHQoKSxcbiAgICAvKipcbiAgICBBbiBpbnZhbGlkIG9yIHVuc3ludGFjdGljIGVsZW1lbnQuXG4gICAgKi9cbiAgICBpbnZhbGlkOiB0KCksXG4gICAgLyoqXG4gICAgTWV0YWRhdGEgb3IgbWV0YS1pbnN0cnVjdGlvbi5cbiAgICAqL1xuICAgIG1ldGEsXG4gICAgLyoqXG4gICAgW01ldGFkYXRhXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSkgdGhhdCBhcHBsaWVzIHRvIHRoZSBlbnRpcmVcbiAgICBkb2N1bWVudC5cbiAgICAqL1xuICAgIGRvY3VtZW50TWV0YTogdChtZXRhKSxcbiAgICAvKipcbiAgICBbTWV0YWRhdGFdKCNoaWdobGlnaHQudGFncy5tZXRhKSB0aGF0IGFubm90YXRlcyBvciBhZGRzXG4gICAgYXR0cmlidXRlcyB0byBhIGdpdmVuIHN5bnRhY3RpYyBlbGVtZW50LlxuICAgICovXG4gICAgYW5ub3RhdGlvbjogdChtZXRhKSxcbiAgICAvKipcbiAgICBQcm9jZXNzaW5nIGluc3RydWN0aW9uIG9yIHByZXByb2Nlc3NvciBkaXJlY3RpdmUuIFN1YnRhZyBvZlxuICAgIFttZXRhXSgjaGlnaGxpZ2h0LnRhZ3MubWV0YSkuXG4gICAgKi9cbiAgICBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb246IHQobWV0YSksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhXG4gICAgZ2l2ZW4gZWxlbWVudCBpcyBiZWluZyBkZWZpbmVkLiBFeHBlY3RlZCB0byBiZSB1c2VkIHdpdGggdGhlXG4gICAgdmFyaW91cyBbbmFtZV0oI2hpZ2hsaWdodC50YWdzLm5hbWUpIHRhZ3MuXG4gICAgKi9cbiAgICBkZWZpbml0aW9uOiBUYWcuZGVmaW5lTW9kaWZpZXIoKSxcbiAgICAvKipcbiAgICBbTW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB0aGF0IGluZGljYXRlcyB0aGF0XG4gICAgc29tZXRoaW5nIGlzIGNvbnN0YW50LiBNb3N0bHkgZXhwZWN0ZWQgdG8gYmUgdXNlZCB3aXRoXG4gICAgW3ZhcmlhYmxlIG5hbWVzXSgjaGlnaGxpZ2h0LnRhZ3MudmFyaWFibGVOYW1lKS5cbiAgICAqL1xuICAgIGNvbnN0YW50OiBUYWcuZGVmaW5lTW9kaWZpZXIoKSxcbiAgICAvKipcbiAgICBbTW9kaWZpZXJdKCNoaWdobGlnaHQuVGFnXmRlZmluZU1vZGlmaWVyKSB1c2VkIHRvIGluZGljYXRlIHRoYXRcbiAgICBhIFt2YXJpYWJsZV0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSkgb3IgW3Byb3BlcnR5XG4gICAgbmFtZV0oI2hpZ2hsaWdodC50YWdzLnByb3BlcnR5TmFtZSkgaXMgYmVpbmcgY2FsbGVkIG9yIGRlZmluZWRcbiAgICBhcyBhIGZ1bmN0aW9uLlxuICAgICovXG4gICAgZnVuY3Rpb246IFRhZy5kZWZpbmVNb2RpZmllcigpLFxuICAgIC8qKlxuICAgIFtNb2RpZmllcl0oI2hpZ2hsaWdodC5UYWdeZGVmaW5lTW9kaWZpZXIpIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG9cbiAgICBbbmFtZXNdKCNoaWdobGlnaHQudGFncy5uYW1lKSB0byBpbmRpY2F0ZSB0aGF0IHRoZXkgYmVsb25nIHRvXG4gICAgdGhlIGxhbmd1YWdlJ3Mgc3RhbmRhcmQgZW52aXJvbm1lbnQuXG4gICAgKi9cbiAgICBzdGFuZGFyZDogVGFnLmRlZmluZU1vZGlmaWVyKCksXG4gICAgLyoqXG4gICAgW01vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdCBpbmRpY2F0ZXMgYSBnaXZlblxuICAgIFtuYW1lc10oI2hpZ2hsaWdodC50YWdzLm5hbWUpIGlzIGxvY2FsIHRvIHNvbWUgc2NvcGUuXG4gICAgKi9cbiAgICBsb2NhbDogVGFnLmRlZmluZU1vZGlmaWVyKCksXG4gICAgLyoqXG4gICAgQSBnZW5lcmljIHZhcmlhbnQgW21vZGlmaWVyXSgjaGlnaGxpZ2h0LlRhZ15kZWZpbmVNb2RpZmllcikgdGhhdFxuICAgIGNhbiBiZSB1c2VkIHRvIHRhZyBsYW5ndWFnZS1zcGVjaWZpYyBhbHRlcm5hdGl2ZSB2YXJpYW50cyBvZlxuICAgIHNvbWUgY29tbW9uIHRhZy4gSXQgaXMgcmVjb21tZW5kZWQgZm9yIHRoZW1lcyB0byBkZWZpbmUgc3BlY2lhbFxuICAgIGZvcm1zIG9mIGF0IGxlYXN0IHRoZSBbc3RyaW5nXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKSBhbmRcbiAgICBbdmFyaWFibGUgbmFtZV0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSkgdGFncywgc2luY2UgdGhvc2VcbiAgICBjb21lIHVwIGEgbG90LlxuICAgICovXG4gICAgc3BlY2lhbDogVGFnLmRlZmluZU1vZGlmaWVyKClcbn07XG4vKipcblRoaXMgaXMgYSBoaWdobGlnaHRlciB0aGF0IGFkZHMgc3RhYmxlLCBwcmVkaWN0YWJsZSBjbGFzc2VzIHRvXG50b2tlbnMsIGZvciBzdHlsaW5nIHdpdGggZXh0ZXJuYWwgQ1NTLlxuXG5UaGUgZm9sbG93aW5nIHRhZ3MgYXJlIG1hcHBlZCB0byB0aGVpciBuYW1lIHByZWZpeGVkIHdpdGggYFwidG9rLVwiYFxuKGZvciBleGFtcGxlIGBcInRvay1jb21tZW50XCJgKTpcblxuKiBbYGxpbmtgXSgjaGlnaGxpZ2h0LnRhZ3MubGluaylcbiogW2BoZWFkaW5nYF0oI2hpZ2hsaWdodC50YWdzLmhlYWRpbmcpXG4qIFtgZW1waGFzaXNgXSgjaGlnaGxpZ2h0LnRhZ3MuZW1waGFzaXMpXG4qIFtgc3Ryb25nYF0oI2hpZ2hsaWdodC50YWdzLnN0cm9uZylcbiogW2BrZXl3b3JkYF0oI2hpZ2hsaWdodC50YWdzLmtleXdvcmQpXG4qIFtgYXRvbWBdKCNoaWdobGlnaHQudGFncy5hdG9tKVxuKiBbYGJvb2xgXSgjaGlnaGxpZ2h0LnRhZ3MuYm9vbClcbiogW2B1cmxgXSgjaGlnaGxpZ2h0LnRhZ3MudXJsKVxuKiBbYGxhYmVsTmFtZWBdKCNoaWdobGlnaHQudGFncy5sYWJlbE5hbWUpXG4qIFtgaW5zZXJ0ZWRgXSgjaGlnaGxpZ2h0LnRhZ3MuaW5zZXJ0ZWQpXG4qIFtgZGVsZXRlZGBdKCNoaWdobGlnaHQudGFncy5kZWxldGVkKVxuKiBbYGxpdGVyYWxgXSgjaGlnaGxpZ2h0LnRhZ3MubGl0ZXJhbClcbiogW2BzdHJpbmdgXSgjaGlnaGxpZ2h0LnRhZ3Muc3RyaW5nKVxuKiBbYG51bWJlcmBdKCNoaWdobGlnaHQudGFncy5udW1iZXIpXG4qIFtgdmFyaWFibGVOYW1lYF0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSlcbiogW2B0eXBlTmFtZWBdKCNoaWdobGlnaHQudGFncy50eXBlTmFtZSlcbiogW2BuYW1lc3BhY2VgXSgjaGlnaGxpZ2h0LnRhZ3MubmFtZXNwYWNlKVxuKiBbYGNsYXNzTmFtZWBdKCNoaWdobGlnaHQudGFncy5jbGFzc05hbWUpXG4qIFtgbWFjcm9OYW1lYF0oI2hpZ2hsaWdodC50YWdzLm1hY3JvTmFtZSlcbiogW2Bwcm9wZXJ0eU5hbWVgXSgjaGlnaGxpZ2h0LnRhZ3MucHJvcGVydHlOYW1lKVxuKiBbYG9wZXJhdG9yYF0oI2hpZ2hsaWdodC50YWdzLm9wZXJhdG9yKVxuKiBbYGNvbW1lbnRgXSgjaGlnaGxpZ2h0LnRhZ3MuY29tbWVudClcbiogW2BtZXRhYF0oI2hpZ2hsaWdodC50YWdzLm1ldGEpXG4qIFtgcHVuY3R1YXRpb25gXSgjaGlnaGxpZ2h0LnRhZ3MucHVuY3R1YXRpb24pXG4qIFtgaW52YWxpZGBdKCNoaWdobGlnaHQudGFncy5pbnZhbGlkKVxuXG5JbiBhZGRpdGlvbiwgdGhlc2UgbWFwcGluZ3MgYXJlIHByb3ZpZGVkOlxuXG4qIFtgcmVnZXhwYF0oI2hpZ2hsaWdodC50YWdzLnJlZ2V4cCksXG4gIFtgZXNjYXBlYF0oI2hpZ2hsaWdodC50YWdzLmVzY2FwZSksIGFuZFxuICBbYHNwZWNpYWxgXSgjaGlnaGxpZ2h0LnRhZ3Muc3BlY2lhbClbYChzdHJpbmcpYF0oI2hpZ2hsaWdodC50YWdzLnN0cmluZylcbiAgYXJlIG1hcHBlZCB0byBgXCJ0b2stc3RyaW5nMlwiYFxuKiBbYHNwZWNpYWxgXSgjaGlnaGxpZ2h0LnRhZ3Muc3BlY2lhbClbYCh2YXJpYWJsZU5hbWUpYF0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSlcbiAgdG8gYFwidG9rLXZhcmlhYmxlTmFtZTJcImBcbiogW2Bsb2NhbGBdKCNoaWdobGlnaHQudGFncy5sb2NhbClbYCh2YXJpYWJsZU5hbWUpYF0oI2hpZ2hsaWdodC50YWdzLnZhcmlhYmxlTmFtZSlcbiAgdG8gYFwidG9rLXZhcmlhYmxlTmFtZSB0b2stbG9jYWxcImBcbiogW2BkZWZpbml0aW9uYF0oI2hpZ2hsaWdodC50YWdzLmRlZmluaXRpb24pW2AodmFyaWFibGVOYW1lKWBdKCNoaWdobGlnaHQudGFncy52YXJpYWJsZU5hbWUpXG4gIHRvIGBcInRvay12YXJpYWJsZU5hbWUgdG9rLWRlZmluaXRpb25cImBcbiogW2BkZWZpbml0aW9uYF0oI2hpZ2hsaWdodC50YWdzLmRlZmluaXRpb24pW2AocHJvcGVydHlOYW1lKWBdKCNoaWdobGlnaHQudGFncy5wcm9wZXJ0eU5hbWUpXG4gIHRvIGBcInRvay1wcm9wZXJ0eU5hbWUgdG9rLWRlZmluaXRpb25cImBcbiovXG5jb25zdCBjbGFzc0hpZ2hsaWdodGVyID0gdGFnSGlnaGxpZ2h0ZXIoW1xuICAgIHsgdGFnOiB0YWdzLmxpbmssIGNsYXNzOiBcInRvay1saW5rXCIgfSxcbiAgICB7IHRhZzogdGFncy5oZWFkaW5nLCBjbGFzczogXCJ0b2staGVhZGluZ1wiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZW1waGFzaXMsIGNsYXNzOiBcInRvay1lbXBoYXNpc1wiIH0sXG4gICAgeyB0YWc6IHRhZ3Muc3Ryb25nLCBjbGFzczogXCJ0b2stc3Ryb25nXCIgfSxcbiAgICB7IHRhZzogdGFncy5rZXl3b3JkLCBjbGFzczogXCJ0b2sta2V5d29yZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuYXRvbSwgY2xhc3M6IFwidG9rLWF0b21cIiB9LFxuICAgIHsgdGFnOiB0YWdzLmJvb2wsIGNsYXNzOiBcInRvay1ib29sXCIgfSxcbiAgICB7IHRhZzogdGFncy51cmwsIGNsYXNzOiBcInRvay11cmxcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmxhYmVsTmFtZSwgY2xhc3M6IFwidG9rLWxhYmVsTmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuaW5zZXJ0ZWQsIGNsYXNzOiBcInRvay1pbnNlcnRlZFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MuZGVsZXRlZCwgY2xhc3M6IFwidG9rLWRlbGV0ZWRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmxpdGVyYWwsIGNsYXNzOiBcInRvay1saXRlcmFsXCIgfSxcbiAgICB7IHRhZzogdGFncy5zdHJpbmcsIGNsYXNzOiBcInRvay1zdHJpbmdcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm51bWJlciwgY2xhc3M6IFwidG9rLW51bWJlclwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLnJlZ2V4cCwgdGFncy5lc2NhcGUsIHRhZ3Muc3BlY2lhbCh0YWdzLnN0cmluZyldLCBjbGFzczogXCJ0b2stc3RyaW5nMlwiIH0sXG4gICAgeyB0YWc6IHRhZ3MudmFyaWFibGVOYW1lLCBjbGFzczogXCJ0b2stdmFyaWFibGVOYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5sb2NhbCh0YWdzLnZhcmlhYmxlTmFtZSksIGNsYXNzOiBcInRvay12YXJpYWJsZU5hbWUgdG9rLWxvY2FsXCIgfSxcbiAgICB7IHRhZzogdGFncy5kZWZpbml0aW9uKHRhZ3MudmFyaWFibGVOYW1lKSwgY2xhc3M6IFwidG9rLXZhcmlhYmxlTmFtZSB0b2stZGVmaW5pdGlvblwiIH0sXG4gICAgeyB0YWc6IHRhZ3Muc3BlY2lhbCh0YWdzLnZhcmlhYmxlTmFtZSksIGNsYXNzOiBcInRvay12YXJpYWJsZU5hbWUyXCIgfSxcbiAgICB7IHRhZzogdGFncy5kZWZpbml0aW9uKHRhZ3MucHJvcGVydHlOYW1lKSwgY2xhc3M6IFwidG9rLXByb3BlcnR5TmFtZSB0b2stZGVmaW5pdGlvblwiIH0sXG4gICAgeyB0YWc6IHRhZ3MudHlwZU5hbWUsIGNsYXNzOiBcInRvay10eXBlTmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubmFtZXNwYWNlLCBjbGFzczogXCJ0b2stbmFtZXNwYWNlXCIgfSxcbiAgICB7IHRhZzogdGFncy5jbGFzc05hbWUsIGNsYXNzOiBcInRvay1jbGFzc05hbWVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLm1hY3JvTmFtZSwgY2xhc3M6IFwidG9rLW1hY3JvTmFtZVwiIH0sXG4gICAgeyB0YWc6IHRhZ3MucHJvcGVydHlOYW1lLCBjbGFzczogXCJ0b2stcHJvcGVydHlOYW1lXCIgfSxcbiAgICB7IHRhZzogdGFncy5vcGVyYXRvciwgY2xhc3M6IFwidG9rLW9wZXJhdG9yXCIgfSxcbiAgICB7IHRhZzogdGFncy5jb21tZW50LCBjbGFzczogXCJ0b2stY29tbWVudFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubWV0YSwgY2xhc3M6IFwidG9rLW1ldGFcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmludmFsaWQsIGNsYXNzOiBcInRvay1pbnZhbGlkXCIgfSxcbiAgICB7IHRhZzogdGFncy5wdW5jdHVhdGlvbiwgY2xhc3M6IFwidG9rLXB1bmN0dWF0aW9uXCIgfVxuXSk7XG5cbmV4cG9ydCB7IFRhZywgY2xhc3NIaWdobGlnaHRlciwgZ2V0U3R5bGVUYWdzLCBoaWdobGlnaHRDb2RlLCBoaWdobGlnaHRUcmVlLCBzdHlsZVRhZ3MsIHRhZ0hpZ2hsaWdodGVyLCB0YWdzIH07XG4iLCAiaW1wb3J0IHsgTm9kZVByb3AsIEl0ZXJNb2RlLCBUcmVlLCBUcmVlRnJhZ21lbnQsIFBhcnNlciwgTm9kZVR5cGUsIE5vZGVTZXQgfSBmcm9tICdAbGV6ZXIvY29tbW9uJztcbmltcG9ydCB7IFN0YXRlRWZmZWN0LCBTdGF0ZUZpZWxkLCBGYWNldCwgRWRpdG9yU3RhdGUsIGNvdW50Q29sdW1uLCBjb21iaW5lQ29uZmlnLCBSYW5nZVNldCwgUmFuZ2VTZXRCdWlsZGVyLCBQcmVjIH0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuaW1wb3J0IHsgVmlld1BsdWdpbiwgbG9nRXhjZXB0aW9uLCBFZGl0b3JWaWV3LCBEZWNvcmF0aW9uLCBXaWRnZXRUeXBlLCBndXR0ZXIsIEd1dHRlck1hcmtlciwgRGlyZWN0aW9uIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyB0YWdzLCB0YWdIaWdobGlnaHRlciwgaGlnaGxpZ2h0VHJlZSwgc3R5bGVUYWdzIH0gZnJvbSAnQGxlemVyL2hpZ2hsaWdodCc7XG5pbXBvcnQgeyBTdHlsZU1vZHVsZSB9IGZyb20gJ3N0eWxlLW1vZCc7XG5cbnZhciBfYTtcbi8qKlxuTm9kZSBwcm9wIHN0b3JlZCBpbiBhIHBhcnNlcidzIHRvcCBzeW50YXggbm9kZSB0byBwcm92aWRlIHRoZVxuZmFjZXQgdGhhdCBzdG9yZXMgbGFuZ3VhZ2Utc3BlY2lmaWMgZGF0YSBmb3IgdGhhdCBsYW5ndWFnZS5cbiovXG5jb25zdCBsYW5ndWFnZURhdGFQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLyoqXG5IZWxwZXIgZnVuY3Rpb24gdG8gZGVmaW5lIGEgZmFjZXQgKHRvIGJlIGFkZGVkIHRvIHRoZSB0b3Agc3ludGF4XG5ub2RlKHMpIGZvciBhIGxhbmd1YWdlIHZpYVxuW2BsYW5ndWFnZURhdGFQcm9wYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5sYW5ndWFnZURhdGFQcm9wKSksIHRoYXQgd2lsbCBiZVxudXNlZCB0byBhc3NvY2lhdGUgbGFuZ3VhZ2UgZGF0YSB3aXRoIHRoZSBsYW5ndWFnZS4gWW91XG5wcm9iYWJseSBvbmx5IG5lZWQgdGhpcyB3aGVuIHN1YmNsYXNzaW5nXG5bYExhbmd1YWdlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZSkuXG4qL1xuZnVuY3Rpb24gZGVmaW5lTGFuZ3VhZ2VGYWNldChiYXNlRGF0YSkge1xuICAgIHJldHVybiBGYWNldC5kZWZpbmUoe1xuICAgICAgICBjb21iaW5lOiBiYXNlRGF0YSA/IHZhbHVlcyA9PiB2YWx1ZXMuY29uY2F0KGJhc2VEYXRhKSA6IHVuZGVmaW5lZFxuICAgIH0pO1xufVxuLyoqXG5TeW50YXggbm9kZSBwcm9wIHVzZWQgdG8gcmVnaXN0ZXIgc3VibGFuZ3VhZ2VzLiBTaG91bGQgYmUgYWRkZWQgdG9cbnRoZSB0b3AgbGV2ZWwgbm9kZSB0eXBlIGZvciB0aGUgbGFuZ3VhZ2UuXG4qL1xuY29uc3Qgc3VibGFuZ3VhZ2VQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLyoqXG5BIGxhbmd1YWdlIG9iamVjdCBtYW5hZ2VzIHBhcnNpbmcgYW5kIHBlci1sYW5ndWFnZVxuW21ldGFkYXRhXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YUF0KS4gUGFyc2UgZGF0YSBpc1xubWFuYWdlZCBhcyBhIFtMZXplcl0oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldCkgdHJlZS4gVGhlIGNsYXNzXG5jYW4gYmUgdXNlZCBkaXJlY3RseSwgdmlhIHRoZSBbYExSTGFuZ3VhZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxSTGFuZ3VhZ2UpXG5zdWJjbGFzcyBmb3IgW0xlemVyXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0LykgTFIgcGFyc2Vycywgb3JcbnZpYSB0aGUgW2BTdHJlYW1MYW5ndWFnZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuU3RyZWFtTGFuZ3VhZ2UpIHN1YmNsYXNzXG5mb3Igc3RyZWFtIHBhcnNlcnMuXG4qL1xuY2xhc3MgTGFuZ3VhZ2Uge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIGxhbmd1YWdlIG9iamVjdC4gSWYgeW91IG5lZWQgdG8gaW52b2tlIHRoaXNcbiAgICBkaXJlY3RseSwgZmlyc3QgZGVmaW5lIGEgZGF0YSBmYWNldCB3aXRoXG4gICAgW2BkZWZpbmVMYW5ndWFnZUZhY2V0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5kZWZpbmVMYW5ndWFnZUZhY2V0KSwgYW5kIHRoZW5cbiAgICBjb25maWd1cmUgeW91ciBwYXJzZXIgdG8gW2F0dGFjaF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5sYW5ndWFnZURhdGFQcm9wKSBpdFxuICAgIHRvIHRoZSBsYW5ndWFnZSdzIG91dGVyIHN5bnRheCBub2RlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIFtsYW5ndWFnZSBkYXRhXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmxhbmd1YWdlRGF0YUF0KSBmYWNldFxuICAgIHVzZWQgZm9yIHRoaXMgbGFuZ3VhZ2UuXG4gICAgKi9cbiAgICBkYXRhLCBwYXJzZXIsIGV4dHJhRXh0ZW5zaW9ucyA9IFtdLCBcbiAgICAvKipcbiAgICBBIGxhbmd1YWdlIG5hbWUuXG4gICAgKi9cbiAgICBuYW1lID0gXCJcIikge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAvLyBLbHVkZ2UgdG8gZGVmaW5lIEVkaXRvclN0YXRlLnRyZWUgYXMgYSBkZWJ1Z2dpbmcgaGVscGVyLFxuICAgICAgICAvLyB3aXRob3V0IHRoZSBFZGl0b3JTdGF0ZSBwYWNrYWdlIGFjdHVhbGx5IGtub3dpbmcgYWJvdXRcbiAgICAgICAgLy8gbGFuZ3VhZ2VzIGFuZCBsZXplciB0cmVlcy5cbiAgICAgICAgaWYgKCFFZGl0b3JTdGF0ZS5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJ0cmVlXCIpKVxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVkaXRvclN0YXRlLnByb3RvdHlwZSwgXCJ0cmVlXCIsIHsgZ2V0KCkgeyByZXR1cm4gc3ludGF4VHJlZSh0aGlzKTsgfSB9KTtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gW1xuICAgICAgICAgICAgbGFuZ3VhZ2Uub2YodGhpcyksXG4gICAgICAgICAgICBFZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGEub2YoKHN0YXRlLCBwb3MsIHNpZGUpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdG9wID0gdG9wTm9kZUF0KHN0YXRlLCBwb3MsIHNpZGUpLCBkYXRhID0gdG9wLnR5cGUucHJvcChsYW5ndWFnZURhdGFQcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICBsZXQgYmFzZSA9IHN0YXRlLmZhY2V0KGRhdGEpLCBzdWIgPSB0b3AudHlwZS5wcm9wKHN1Ymxhbmd1YWdlUHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKHN1Yikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5uZXJOb2RlID0gdG9wLnJlc29sdmUocG9zIC0gdG9wLmZyb20sIHNpZGUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdWJsYW5nIG9mIHN1YilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJsYW5nLnRlc3QoaW5uZXJOb2RlLCBzdGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHN0YXRlLmZhY2V0KHN1YmxhbmcuZmFjZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJsYW5nLnR5cGUgPT0gXCJyZXBsYWNlXCIgPyBkYXRhIDogZGF0YS5jb25jYXQoYmFzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXS5jb25jYXQoZXh0cmFFeHRlbnNpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUXVlcnkgd2hldGhlciB0aGlzIGxhbmd1YWdlIGlzIGFjdGl2ZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBpc0FjdGl2ZUF0KHN0YXRlLCBwb3MsIHNpZGUgPSAtMSkge1xuICAgICAgICByZXR1cm4gdG9wTm9kZUF0KHN0YXRlLCBwb3MsIHNpZGUpLnR5cGUucHJvcChsYW5ndWFnZURhdGFQcm9wKSA9PSB0aGlzLmRhdGE7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGRvY3VtZW50IHJlZ2lvbnMgdGhhdCB3ZXJlIHBhcnNlZCB1c2luZyB0aGlzIGxhbmd1YWdlLlxuICAgIFRoZSByZXR1cm5lZCByZWdpb25zIHdpbGwgX2luY2x1ZGVfIGFueSBuZXN0ZWQgbGFuZ3VhZ2VzIHJvb3RlZFxuICAgIGluIHRoaXMgbGFuZ3VhZ2UsIHdoZW4gdGhvc2UgZXhpc3QuXG4gICAgKi9cbiAgICBmaW5kUmVnaW9ucyhzdGF0ZSkge1xuICAgICAgICBsZXQgbGFuZyA9IHN0YXRlLmZhY2V0KGxhbmd1YWdlKTtcbiAgICAgICAgaWYgKChsYW5nID09PSBudWxsIHx8IGxhbmcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhbmcuZGF0YSkgPT0gdGhpcy5kYXRhKVxuICAgICAgICAgICAgcmV0dXJuIFt7IGZyb206IDAsIHRvOiBzdGF0ZS5kb2MubGVuZ3RoIH1dO1xuICAgICAgICBpZiAoIWxhbmcgfHwgIWxhbmcuYWxsb3dzTmVzdGluZylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgZXhwbG9yZSA9ICh0cmVlLCBmcm9tKSA9PiB7XG4gICAgICAgICAgICBpZiAodHJlZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgZnJvbSwgdG86IGZyb20gKyB0cmVlLmxlbmd0aCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbW91bnQgPSB0cmVlLnByb3AoTm9kZVByb3AubW91bnRlZCk7XG4gICAgICAgICAgICBpZiAobW91bnQpIHtcbiAgICAgICAgICAgICAgICBpZiAobW91bnQudHJlZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW91bnQub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgbW91bnQub3ZlcmxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IGZyb206IHIuZnJvbSArIGZyb20sIHRvOiByLnRvICsgZnJvbSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBmcm9tOiBmcm9tLCB0bzogZnJvbSArIHRyZWUubGVuZ3RoIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vdW50Lm92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSByZXN1bHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBleHBsb3JlKG1vdW50LnRyZWUsIG1vdW50Lm92ZXJsYXlbMF0uZnJvbSArIGZyb20pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IHNpemUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmVlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoID0gdHJlZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggaW5zdGFuY2VvZiBUcmVlKVxuICAgICAgICAgICAgICAgICAgICBleHBsb3JlKGNoLCB0cmVlLnBvc2l0aW9uc1tpXSArIGZyb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBleHBsb3JlKHN5bnRheFRyZWUoc3RhdGUpLCAwKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBsYW5ndWFnZSBhbGxvd3MgbmVzdGVkIGxhbmd1YWdlcy4gVGhlXG4gICAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUuXG4gICAgKi9cbiAgICBnZXQgYWxsb3dzTmVzdGluZygpIHsgcmV0dXJuIHRydWU7IH1cbn1cbi8qKlxuQGludGVybmFsXG4qL1xuTGFuZ3VhZ2Uuc2V0U3RhdGUgPSAvKkBfX1BVUkVfXyovU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG5mdW5jdGlvbiB0b3BOb2RlQXQoc3RhdGUsIHBvcywgc2lkZSkge1xuICAgIGxldCB0b3BMYW5nID0gc3RhdGUuZmFjZXQobGFuZ3VhZ2UpLCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSkudG9wTm9kZTtcbiAgICBpZiAoIXRvcExhbmcgfHwgdG9wTGFuZy5hbGxvd3NOZXN0aW5nKSB7XG4gICAgICAgIGZvciAobGV0IG5vZGUgPSB0cmVlOyBub2RlOyBub2RlID0gbm9kZS5lbnRlcihwb3MsIHNpZGUsIEl0ZXJNb2RlLkV4Y2x1ZGVCdWZmZXJzKSlcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUuaXNUb3ApXG4gICAgICAgICAgICAgICAgdHJlZSA9IG5vZGU7XG4gICAgfVxuICAgIHJldHVybiB0cmVlO1xufVxuLyoqXG5BIHN1YmNsYXNzIG9mIFtgTGFuZ3VhZ2VgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSBmb3IgdXNlIHdpdGggTGV6ZXJcbltMUiBwYXJzZXJzXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0L2RvY3MvcmVmI2xyLkxSUGFyc2VyKVxucGFyc2Vycy5cbiovXG5jbGFzcyBMUkxhbmd1YWdlIGV4dGVuZHMgTGFuZ3VhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHBhcnNlciwgbmFtZSkge1xuICAgICAgICBzdXBlcihkYXRhLCBwYXJzZXIsIFtdLCBuYW1lKTtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgfVxuICAgIC8qKlxuICAgIERlZmluZSBhIGxhbmd1YWdlIGZyb20gYSBwYXJzZXIuXG4gICAgKi9cbiAgICBzdGF0aWMgZGVmaW5lKHNwZWMpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBkZWZpbmVMYW5ndWFnZUZhY2V0KHNwZWMubGFuZ3VhZ2VEYXRhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMUkxhbmd1YWdlKGRhdGEsIHNwZWMucGFyc2VyLmNvbmZpZ3VyZSh7XG4gICAgICAgICAgICBwcm9wczogW2xhbmd1YWdlRGF0YVByb3AuYWRkKHR5cGUgPT4gdHlwZS5pc1RvcCA/IGRhdGEgOiB1bmRlZmluZWQpXVxuICAgICAgICB9KSwgc3BlYy5uYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgbGFuZ3VhZ2Ugd2l0aCBhIHJlY29uZmlndXJlZFxuICAgIHZlcnNpb24gb2YgaXRzIHBhcnNlciBhbmQgb3B0aW9uYWxseSBhIG5ldyBuYW1lLlxuICAgICovXG4gICAgY29uZmlndXJlKG9wdGlvbnMsIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMUkxhbmd1YWdlKHRoaXMuZGF0YSwgdGhpcy5wYXJzZXIuY29uZmlndXJlKG9wdGlvbnMpLCBuYW1lIHx8IHRoaXMubmFtZSk7XG4gICAgfVxuICAgIGdldCBhbGxvd3NOZXN0aW5nKCkgeyByZXR1cm4gdGhpcy5wYXJzZXIuaGFzV3JhcHBlcnMoKTsgfVxufVxuLyoqXG5HZXQgdGhlIHN5bnRheCB0cmVlIGZvciBhIHN0YXRlLCB3aGljaCBpcyB0aGUgY3VycmVudCAocG9zc2libHlcbmluY29tcGxldGUpIHBhcnNlIHRyZWUgb2YgdGhlIGFjdGl2ZVxuW2xhbmd1YWdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSwgb3IgdGhlIGVtcHR5IHRyZWUgaWYgdGhlcmUgaXMgbm9cbmxhbmd1YWdlIGF2YWlsYWJsZS5cbiovXG5mdW5jdGlvbiBzeW50YXhUcmVlKHN0YXRlKSB7XG4gICAgbGV0IGZpZWxkID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUsIGZhbHNlKTtcbiAgICByZXR1cm4gZmllbGQgPyBmaWVsZC50cmVlIDogVHJlZS5lbXB0eTtcbn1cbi8qKlxuVHJ5IHRvIGdldCBhIHBhcnNlIHRyZWUgdGhhdCBzcGFucyBhdCBsZWFzdCB1cCB0byBgdXB0b2AuIFRoZVxubWV0aG9kIHdpbGwgZG8gYXQgbW9zdCBgdGltZW91dGAgbWlsbGlzZWNvbmRzIG9mIHdvcmsgdG8gcGFyc2VcbnVwIHRvIHRoYXQgcG9pbnQgaWYgdGhlIHRyZWUgaXNuJ3QgYWxyZWFkeSBhdmFpbGFibGUuXG4qL1xuZnVuY3Rpb24gZW5zdXJlU3ludGF4VHJlZShzdGF0ZSwgdXB0bywgdGltZW91dCA9IDUwKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBwYXJzZSA9IChfYSA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlLCBmYWxzZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb250ZXh0O1xuICAgIGlmICghcGFyc2UpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBvbGRWaWVwb3J0ID0gcGFyc2Uudmlld3BvcnQ7XG4gICAgcGFyc2UudXBkYXRlVmlld3BvcnQoeyBmcm9tOiAwLCB0bzogdXB0byB9KTtcbiAgICBsZXQgcmVzdWx0ID0gcGFyc2UuaXNEb25lKHVwdG8pIHx8IHBhcnNlLndvcmsodGltZW91dCwgdXB0bykgPyBwYXJzZS50cmVlIDogbnVsbDtcbiAgICBwYXJzZS51cGRhdGVWaWV3cG9ydChvbGRWaWVwb3J0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5RdWVyaWVzIHdoZXRoZXIgdGhlcmUgaXMgYSBmdWxsIHN5bnRheCB0cmVlIGF2YWlsYWJsZSB1cCB0byB0aGVcbmdpdmVuIGRvY3VtZW50IHBvc2l0aW9uLiBJZiB0aGVyZSBpc24ndCwgdGhlIGJhY2tncm91bmQgcGFyc2VcbnByb2Nlc3MgX21pZ2h0XyBzdGlsbCBiZSB3b3JraW5nIGFuZCB1cGRhdGUgdGhlIHRyZWUgZnVydGhlciwgYnV0XG50aGVyZSBpcyBubyBndWFyYW50ZWUgb2YgdGhhdFx1MjAxNHRoZSBwYXJzZXIgd2lsbCBbc3RvcFxud29ya2luZ10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5zeW50YXhQYXJzZXJSdW5uaW5nKSB3aGVuIGl0IGhhcyBzcGVudCBhXG5jZXJ0YWluIGFtb3VudCBvZiB0aW1lIG9yIGhhcyBtb3ZlZCBiZXlvbmQgdGhlIHZpc2libGUgdmlld3BvcnQuXG5BbHdheXMgcmV0dXJucyBmYWxzZSBpZiBubyBsYW5ndWFnZSBoYXMgYmVlbiBlbmFibGVkLlxuKi9cbmZ1bmN0aW9uIHN5bnRheFRyZWVBdmFpbGFibGUoc3RhdGUsIHVwdG8gPSBzdGF0ZS5kb2MubGVuZ3RoKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoKF9hID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUsIGZhbHNlKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbnRleHQuaXNEb25lKHVwdG8pKSB8fCBmYWxzZTtcbn1cbi8qKlxuTW92ZSBwYXJzaW5nIGZvcndhcmQsIGFuZCB1cGRhdGUgdGhlIGVkaXRvciBzdGF0ZSBhZnRlcndhcmRzIHRvXG5yZWZsZWN0IHRoZSBuZXcgdHJlZS4gV2lsbCB3b3JrIGZvciBhdCBtb3N0IGB0aW1lb3V0YFxubWlsbGlzZWNvbmRzLiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhcnNlciBtYW5hZ2VkIGdldCB0byB0aGUgZ2l2ZW5cbnBvc2l0aW9uIGluIHRoYXQgdGltZS5cbiovXG5mdW5jdGlvbiBmb3JjZVBhcnNpbmcodmlldywgdXB0byA9IHZpZXcudmlld3BvcnQudG8sIHRpbWVvdXQgPSAxMDApIHtcbiAgICBsZXQgc3VjY2VzcyA9IGVuc3VyZVN5bnRheFRyZWUodmlldy5zdGF0ZSwgdXB0bywgdGltZW91dCk7XG4gICAgaWYgKHN1Y2Nlc3MgIT0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKSlcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7fSk7XG4gICAgcmV0dXJuICEhc3VjY2Vzcztcbn1cbi8qKlxuVGVsbHMgeW91IHdoZXRoZXIgdGhlIGxhbmd1YWdlIHBhcnNlciBpcyBwbGFubmluZyB0byBkbyBtb3JlXG5wYXJzaW5nIHdvcmsgKGluIGEgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgIHBzZXVkby10aHJlYWQpIG9yIGhhc1xuc3RvcHBlZCBydW5uaW5nLCBlaXRoZXIgYmVjYXVzZSBpdCBwYXJzZWQgdGhlIGVudGlyZSBkb2N1bWVudCxcbmJlY2F1c2UgaXQgc3BlbnQgdG9vIG11Y2ggdGltZSBhbmQgd2FzIGN1dCBvZmYsIG9yIGJlY2F1c2UgdGhlcmVcbmlzIG5vIGxhbmd1YWdlIHBhcnNlciBlbmFibGVkLlxuKi9cbmZ1bmN0aW9uIHN5bnRheFBhcnNlclJ1bm5pbmcodmlldykge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKChfYSA9IHZpZXcucGx1Z2luKHBhcnNlV29ya2VyKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzV29ya2luZygpKSB8fCBmYWxzZTtcbn1cbi8qKlxuTGV6ZXItc3R5bGVcbltgSW5wdXRgXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0L2RvY3MvcmVmI2NvbW1vbi5JbnB1dClcbm9iamVjdCBmb3IgYSBbYFRleHRgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlRleHQpIG9iamVjdC5cbiovXG5jbGFzcyBEb2NJbnB1dCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGlucHV0IG9iamVjdCBmb3IgdGhlIGdpdmVuIGRvY3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoZG9jKSB7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmN1cnNvclBvcyA9IDA7XG4gICAgICAgIHRoaXMuc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBkb2MuaXRlcigpO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5kb2MubGVuZ3RoOyB9XG4gICAgc3luY1RvKHBvcykge1xuICAgICAgICB0aGlzLnN0cmluZyA9IHRoaXMuY3Vyc29yLm5leHQocG9zIC0gdGhpcy5jdXJzb3JQb3MpLnZhbHVlO1xuICAgICAgICB0aGlzLmN1cnNvclBvcyA9IHBvcyArIHRoaXMuc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3Vyc29yUG9zIC0gdGhpcy5zdHJpbmcubGVuZ3RoO1xuICAgIH1cbiAgICBjaHVuayhwb3MpIHtcbiAgICAgICAgdGhpcy5zeW5jVG8ocG9zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nO1xuICAgIH1cbiAgICBnZXQgbGluZUNodW5rcygpIHsgcmV0dXJuIHRydWU7IH1cbiAgICByZWFkKGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBzdHJpbmdTdGFydCA9IHRoaXMuY3Vyc29yUG9zIC0gdGhpcy5zdHJpbmcubGVuZ3RoO1xuICAgICAgICBpZiAoZnJvbSA8IHN0cmluZ1N0YXJ0IHx8IHRvID49IHRoaXMuY3Vyc29yUG9zKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG9jLnNsaWNlU3RyaW5nKGZyb20sIHRvKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKGZyb20gLSBzdHJpbmdTdGFydCwgdG8gLSBzdHJpbmdTdGFydCk7XG4gICAgfVxufVxubGV0IGN1cnJlbnRDb250ZXh0ID0gbnVsbDtcbi8qKlxuQSBwYXJzZSBjb250ZXh0IHByb3ZpZGVkIHRvIHBhcnNlcnMgd29ya2luZyBvbiB0aGUgZWRpdG9yIGNvbnRlbnQuXG4qL1xuY2xhc3MgUGFyc2VDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIsIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIHN0YXRlLCBcbiAgICAvKipcbiAgICBUcmVlIGZyYWdtZW50cyB0aGF0IGNhbiBiZSByZXVzZWQgYnkgaW5jcmVtZW50YWwgcmUtcGFyc2VzLlxuICAgICovXG4gICAgZnJhZ21lbnRzID0gW10sIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdHJlZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0cmVlTGVuLCBcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBlZGl0b3Igdmlld3BvcnQgKG9yIHNvbWUgb3ZlcmFwcHJveGltYXRpb25cbiAgICB0aGVyZW9mKS4gSW50ZW5kZWQgdG8gYmUgdXNlZCBmb3Igb3Bwb3J0dW5pc3RpY2FsbHkgYXZvaWRpbmdcbiAgICB3b3JrIChpbiB3aGljaCBjYXNlXG4gICAgW2Bza2lwVW50aWxJblZpZXdgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLlBhcnNlQ29udGV4dC5za2lwVW50aWxJblZpZXcpXG4gICAgc2hvdWxkIGJlIGNhbGxlZCB0byBtYWtlIHN1cmUgdGhlIHBhcnNlciBpcyByZXN0YXJ0ZWQgd2hlbiB0aGVcbiAgICBza2lwcGVkIHJlZ2lvbiBiZWNvbWVzIHZpc2libGUpLlxuICAgICovXG4gICAgdmlld3BvcnQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2tpcHBlZCwgXG4gICAgLyoqXG4gICAgVGhpcyBpcyB3aGVyZSBza2lwcGluZyBwYXJzZXJzIGNhbiByZWdpc3RlciBhIHByb21pc2UgdGhhdCxcbiAgICB3aGVuIHJlc29sdmVkLCB3aWxsIHNjaGVkdWxlIGEgbmV3IHBhcnNlLiBJdCBpcyBjbGVhcmVkIHdoZW5cbiAgICB0aGUgcGFyc2Ugd29ya2VyIHBpY2tzIHVwIHRoZSBwcm9taXNlLiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNjaGVkdWxlT24pIHtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBmcmFnbWVudHM7XG4gICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgIHRoaXMudHJlZUxlbiA9IHRyZWVMZW47XG4gICAgICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICAgICAgdGhpcy5za2lwcGVkID0gc2tpcHBlZDtcbiAgICAgICAgdGhpcy5zY2hlZHVsZU9uID0gc2NoZWR1bGVPbjtcbiAgICAgICAgdGhpcy5wYXJzZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy50ZW1wU2tpcHBlZCA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUocGFyc2VyLCBzdGF0ZSwgdmlld3BvcnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJzZUNvbnRleHQocGFyc2VyLCBzdGF0ZSwgW10sIFRyZWUuZW1wdHksIDAsIHZpZXdwb3J0LCBbXSwgbnVsbCk7XG4gICAgfVxuICAgIHN0YXJ0UGFyc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlci5zdGFydFBhcnNlKG5ldyBEb2NJbnB1dCh0aGlzLnN0YXRlLmRvYyksIHRoaXMuZnJhZ21lbnRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB3b3JrKHVudGlsLCB1cHRvKSB7XG4gICAgICAgIGlmICh1cHRvICE9IG51bGwgJiYgdXB0byA+PSB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpXG4gICAgICAgICAgICB1cHRvID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy50cmVlICE9IFRyZWUuZW1wdHkgJiYgdGhpcy5pc0RvbmUodXB0byAhPT0gbnVsbCAmJiB1cHRvICE9PSB2b2lkIDAgPyB1cHRvIDogdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKSkge1xuICAgICAgICAgICAgdGhpcy50YWtlVHJlZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aENvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1bnRpbCA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZFRpbWUgPSBEYXRlLm5vdygpICsgdW50aWw7XG4gICAgICAgICAgICAgICAgdW50aWwgPSAoKSA9PiBEYXRlLm5vdygpID4gZW5kVGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJzZSlcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5zdGFydFBhcnNlKCk7XG4gICAgICAgICAgICBpZiAodXB0byAhPSBudWxsICYmICh0aGlzLnBhcnNlLnN0b3BwZWRBdCA9PSBudWxsIHx8IHRoaXMucGFyc2Uuc3RvcHBlZEF0ID4gdXB0bykgJiZcbiAgICAgICAgICAgICAgICB1cHRvIDwgdGhpcy5zdGF0ZS5kb2MubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2Uuc3RvcEF0KHVwdG8pO1xuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIGxldCBkb25lID0gdGhpcy5wYXJzZS5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFnbWVudHMgPSB0aGlzLndpdGhvdXRUZW1wU2tpcHBlZChUcmVlRnJhZ21lbnQuYWRkVHJlZShkb25lLCB0aGlzLmZyYWdtZW50cywgdGhpcy5wYXJzZS5zdG9wcGVkQXQgIT0gbnVsbCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVMZW4gPSAoX2EgPSB0aGlzLnBhcnNlLnN0b3BwZWRBdCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5zdGF0ZS5kb2MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWUgPSBkb25lO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJlZUxlbiA8ICh1cHRvICE9PSBudWxsICYmIHVwdG8gIT09IHZvaWQgMCA/IHVwdG8gOiB0aGlzLnN0YXRlLmRvYy5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZSA9IHRoaXMuc3RhcnRQYXJzZSgpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHVudGlsKCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdGFrZVRyZWUoKSB7XG4gICAgICAgIGxldCBwb3MsIHRyZWU7XG4gICAgICAgIGlmICh0aGlzLnBhcnNlICYmIChwb3MgPSB0aGlzLnBhcnNlLnBhcnNlZFBvcykgPj0gdGhpcy50cmVlTGVuKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJzZS5zdG9wcGVkQXQgPT0gbnVsbCB8fCB0aGlzLnBhcnNlLnN0b3BwZWRBdCA+IHBvcylcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlLnN0b3BBdChwb3MpO1xuICAgICAgICAgICAgdGhpcy53aXRoQ29udGV4dCgoKSA9PiB7IHdoaWxlICghKHRyZWUgPSB0aGlzLnBhcnNlLmFkdmFuY2UoKSkpIHsgfSB9KTtcbiAgICAgICAgICAgIHRoaXMudHJlZUxlbiA9IHBvcztcbiAgICAgICAgICAgIHRoaXMudHJlZSA9IHRyZWU7XG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50cyA9IHRoaXMud2l0aG91dFRlbXBTa2lwcGVkKFRyZWVGcmFnbWVudC5hZGRUcmVlKHRoaXMudHJlZSwgdGhpcy5mcmFnbWVudHMsIHRydWUpKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdpdGhDb250ZXh0KGYpIHtcbiAgICAgICAgbGV0IHByZXYgPSBjdXJyZW50Q29udGV4dDtcbiAgICAgICAgY3VycmVudENvbnRleHQgPSB0aGlzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGYoKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gcHJldjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aXRob3V0VGVtcFNraXBwZWQoZnJhZ21lbnRzKSB7XG4gICAgICAgIGZvciAobGV0IHI7IHIgPSB0aGlzLnRlbXBTa2lwcGVkLnBvcCgpOylcbiAgICAgICAgICAgIGZyYWdtZW50cyA9IGN1dEZyYWdtZW50cyhmcmFnbWVudHMsIHIuZnJvbSwgci50byk7XG4gICAgICAgIHJldHVybiBmcmFnbWVudHM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2hhbmdlcyhjaGFuZ2VzLCBuZXdTdGF0ZSkge1xuICAgICAgICBsZXQgeyBmcmFnbWVudHMsIHRyZWUsIHRyZWVMZW4sIHZpZXdwb3J0LCBza2lwcGVkIH0gPSB0aGlzO1xuICAgICAgICB0aGlzLnRha2VUcmVlKCk7XG4gICAgICAgIGlmICghY2hhbmdlcy5lbXB0eSkge1xuICAgICAgICAgICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgICAgICAgICAgY2hhbmdlcy5pdGVyQ2hhbmdlZFJhbmdlcygoZnJvbUEsIHRvQSwgZnJvbUIsIHRvQikgPT4gcmFuZ2VzLnB1c2goeyBmcm9tQSwgdG9BLCBmcm9tQiwgdG9CIH0pKTtcbiAgICAgICAgICAgIGZyYWdtZW50cyA9IFRyZWVGcmFnbWVudC5hcHBseUNoYW5nZXMoZnJhZ21lbnRzLCByYW5nZXMpO1xuICAgICAgICAgICAgdHJlZSA9IFRyZWUuZW1wdHk7XG4gICAgICAgICAgICB0cmVlTGVuID0gMDtcbiAgICAgICAgICAgIHZpZXdwb3J0ID0geyBmcm9tOiBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC5mcm9tLCAtMSksIHRvOiBjaGFuZ2VzLm1hcFBvcyh2aWV3cG9ydC50bywgMSkgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNraXBwZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2tpcHBlZCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHIgb2YgdGhpcy5za2lwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmcm9tID0gY2hhbmdlcy5tYXBQb3Moci5mcm9tLCAxKSwgdG8gPSBjaGFuZ2VzLm1hcFBvcyhyLnRvLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tIDwgdG8pXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkLnB1c2goeyBmcm9tLCB0byB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQYXJzZUNvbnRleHQodGhpcy5wYXJzZXIsIG5ld1N0YXRlLCBmcmFnbWVudHMsIHRyZWUsIHRyZWVMZW4sIHZpZXdwb3J0LCBza2lwcGVkLCB0aGlzLnNjaGVkdWxlT24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHVwZGF0ZVZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdwb3J0LmZyb20gPT0gdmlld3BvcnQuZnJvbSAmJiB0aGlzLnZpZXdwb3J0LnRvID09IHZpZXdwb3J0LnRvKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgICAgIGxldCBzdGFydExlbiA9IHRoaXMuc2tpcHBlZC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5za2lwcGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyBmcm9tLCB0byB9ID0gdGhpcy5za2lwcGVkW2ldO1xuICAgICAgICAgICAgaWYgKGZyb20gPCB2aWV3cG9ydC50byAmJiB0byA+IHZpZXdwb3J0LmZyb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGN1dEZyYWdtZW50cyh0aGlzLmZyYWdtZW50cywgZnJvbSwgdG8pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcHBlZC5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5za2lwcGVkLmxlbmd0aCA+PSBzdGFydExlbilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZXNldCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMudGFrZVRyZWUoKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE5vdGlmeSB0aGUgcGFyc2Ugc2NoZWR1bGVyIHRoYXQgdGhlIGdpdmVuIHJlZ2lvbiB3YXMgc2tpcHBlZFxuICAgIGJlY2F1c2UgaXQgd2Fzbid0IGluIHZpZXcsIGFuZCB0aGUgcGFyc2Ugc2hvdWxkIGJlIHJlc3RhcnRlZFxuICAgIHdoZW4gaXQgY29tZXMgaW50byB2aWV3LlxuICAgICovXG4gICAgc2tpcFVudGlsSW5WaWV3KGZyb20sIHRvKSB7XG4gICAgICAgIHRoaXMuc2tpcHBlZC5wdXNoKHsgZnJvbSwgdG8gfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYSBwYXJzZXIgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBwbGFjZWhvbGRlciB3aGVuXG4gICAgYXN5bmNocm9ub3VzbHkgbG9hZGluZyBhIG5lc3RlZCBwYXJzZXIuIEl0J2xsIHNraXAgaXRzIGlucHV0IGFuZFxuICAgIG1hcmsgaXQgYXMgbm90LXJlYWxseS1wYXJzZWQsIHNvIHRoYXQgdGhlIG5leHQgdXBkYXRlIHdpbGwgcGFyc2VcbiAgICBpdCBhZ2Fpbi5cbiAgICBcbiAgICBXaGVuIGB1bnRpbGAgaXMgZ2l2ZW4sIGEgcmVwYXJzZSB3aWxsIGJlIHNjaGVkdWxlZCB3aGVuIHRoYXRcbiAgICBwcm9taXNlIHJlc29sdmVzLlxuICAgICovXG4gICAgc3RhdGljIGdldFNraXBwaW5nUGFyc2VyKHVudGlsKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2xhc3MgZXh0ZW5kcyBQYXJzZXIge1xuICAgICAgICAgICAgY3JlYXRlUGFyc2UoaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSByYW5nZXNbMF0uZnJvbSwgdG8gPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLnRvO1xuICAgICAgICAgICAgICAgIGxldCBwYXJzZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZFBvczogZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjeCA9IGN1cnJlbnRDb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciBvZiByYW5nZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4LnRlbXBTa2lwcGVkLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVudGlsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeC5zY2hlZHVsZU9uID0gY3guc2NoZWR1bGVPbiA/IFByb21pc2UuYWxsKFtjeC5zY2hlZHVsZU9uLCB1bnRpbF0pIDogdW50aWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZFBvcyA9IHRvO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmVlKE5vZGVUeXBlLm5vbmUsIFtdLCBbXSwgdG8gLSBmcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcHBlZEF0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzdG9wQXQoKSB7IH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaXNEb25lKHVwdG8pIHtcbiAgICAgICAgdXB0byA9IE1hdGgubWluKHVwdG8sIHRoaXMuc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIGxldCBmcmFncyA9IHRoaXMuZnJhZ21lbnRzO1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlTGVuID49IHVwdG8gJiYgZnJhZ3MubGVuZ3RoICYmIGZyYWdzWzBdLmZyb20gPT0gMCAmJiBmcmFnc1swXS50byA+PSB1cHRvO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNvbnRleHQgZm9yIHRoZSBjdXJyZW50IHBhcnNlLCBvciBgbnVsbGAgaWYgbm8gZWRpdG9yXG4gICAgcGFyc2UgaXMgaW4gcHJvZ3Jlc3MuXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0KCkgeyByZXR1cm4gY3VycmVudENvbnRleHQ7IH1cbn1cbmZ1bmN0aW9uIGN1dEZyYWdtZW50cyhmcmFnbWVudHMsIGZyb20sIHRvKSB7XG4gICAgcmV0dXJuIFRyZWVGcmFnbWVudC5hcHBseUNoYW5nZXMoZnJhZ21lbnRzLCBbeyBmcm9tQTogZnJvbSwgdG9BOiB0bywgZnJvbUI6IGZyb20sIHRvQjogdG8gfV0pO1xufVxuY2xhc3MgTGFuZ3VhZ2VTdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gQSBtdXRhYmxlIHBhcnNlIHN0YXRlIHRoYXQgaXMgdXNlZCB0byBwcmVzZXJ2ZSB3b3JrIGRvbmUgZHVyaW5nXG4gICAgLy8gdGhlIGxpZmV0aW1lIG9mIGEgc3RhdGUgd2hlbiBtb3ZpbmcgdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgY29udGV4dCkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLnRyZWUgPSBjb250ZXh0LnRyZWU7XG4gICAgfVxuICAgIGFwcGx5KHRyKSB7XG4gICAgICAgIGlmICghdHIuZG9jQ2hhbmdlZCAmJiB0aGlzLnRyZWUgPT0gdGhpcy5jb250ZXh0LnRyZWUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IG5ld0N4ID0gdGhpcy5jb250ZXh0LmNoYW5nZXModHIuY2hhbmdlcywgdHIuc3RhdGUpO1xuICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgcGFyc2Ugd2Fzbid0IGRvbmUsIGdvIGZvcndhcmQgb25seSB1cCB0byBpdHNcbiAgICAgICAgLy8gZW5kIHBvc2l0aW9uIG9yIHRoZSBlbmQgb2YgdGhlIHZpZXdwb3J0LCB0byBhdm9pZCBzbG93aW5nIGRvd25cbiAgICAgICAgLy8gc3RhdGUgdXBkYXRlcyB3aXRoIHBhcnNlIHdvcmsgYmV5b25kIHRoZSB2aWV3cG9ydC5cbiAgICAgICAgbGV0IHVwdG8gPSB0aGlzLmNvbnRleHQudHJlZUxlbiA9PSB0ci5zdGFydFN0YXRlLmRvYy5sZW5ndGggPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogTWF0aC5tYXgodHIuY2hhbmdlcy5tYXBQb3ModGhpcy5jb250ZXh0LnRyZWVMZW4pLCBuZXdDeC52aWV3cG9ydC50byk7XG4gICAgICAgIGlmICghbmV3Q3gud29yaygyMCAvKiBXb3JrLkFwcGx5ICovLCB1cHRvKSlcbiAgICAgICAgICAgIG5ld0N4LnRha2VUcmVlKCk7XG4gICAgICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VTdGF0ZShuZXdDeCk7XG4gICAgfVxuICAgIHN0YXRpYyBpbml0KHN0YXRlKSB7XG4gICAgICAgIGxldCB2cFRvID0gTWF0aC5taW4oMzAwMCAvKiBXb3JrLkluaXRWaWV3cG9ydCAqLywgc3RhdGUuZG9jLmxlbmd0aCk7XG4gICAgICAgIGxldCBwYXJzZVN0YXRlID0gUGFyc2VDb250ZXh0LmNyZWF0ZShzdGF0ZS5mYWNldChsYW5ndWFnZSkucGFyc2VyLCBzdGF0ZSwgeyBmcm9tOiAwLCB0bzogdnBUbyB9KTtcbiAgICAgICAgaWYgKCFwYXJzZVN0YXRlLndvcmsoMjAgLyogV29yay5BcHBseSAqLywgdnBUbykpXG4gICAgICAgICAgICBwYXJzZVN0YXRlLnRha2VUcmVlKCk7XG4gICAgICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VTdGF0ZShwYXJzZVN0YXRlKTtcbiAgICB9XG59XG5MYW5ndWFnZS5zdGF0ZSA9IC8qQF9fUFVSRV9fKi9TdGF0ZUZpZWxkLmRlZmluZSh7XG4gICAgY3JlYXRlOiBMYW5ndWFnZVN0YXRlLmluaXQsXG4gICAgdXBkYXRlKHZhbHVlLCB0cikge1xuICAgICAgICBmb3IgKGxldCBlIG9mIHRyLmVmZmVjdHMpXG4gICAgICAgICAgICBpZiAoZS5pcyhMYW5ndWFnZS5zZXRTdGF0ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWU7XG4gICAgICAgIGlmICh0ci5zdGFydFN0YXRlLmZhY2V0KGxhbmd1YWdlKSAhPSB0ci5zdGF0ZS5mYWNldChsYW5ndWFnZSkpXG4gICAgICAgICAgICByZXR1cm4gTGFuZ3VhZ2VTdGF0ZS5pbml0KHRyLnN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmFwcGx5KHRyKTtcbiAgICB9XG59KTtcbmxldCByZXF1ZXN0SWRsZSA9IChjYWxsYmFjaykgPT4ge1xuICAgIGxldCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjYWxsYmFjaygpLCA1MDAgLyogV29yay5NYXhQYXVzZSAqLyk7XG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn07XG5pZiAodHlwZW9mIHJlcXVlc3RJZGxlQ2FsbGJhY2sgIT0gXCJ1bmRlZmluZWRcIilcbiAgICByZXF1ZXN0SWRsZSA9IChjYWxsYmFjaykgPT4ge1xuICAgICAgICBsZXQgaWRsZSA9IC0xLCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZGxlID0gcmVxdWVzdElkbGVDYWxsYmFjayhjYWxsYmFjaywgeyB0aW1lb3V0OiA1MDAgLyogV29yay5NYXhQYXVzZSAqLyAtIDEwMCAvKiBXb3JrLk1pblBhdXNlICovIH0pO1xuICAgICAgICB9LCAxMDAgLyogV29yay5NaW5QYXVzZSAqLyk7XG4gICAgICAgIHJldHVybiAoKSA9PiBpZGxlIDwgMCA/IGNsZWFyVGltZW91dCh0aW1lb3V0KSA6IGNhbmNlbElkbGVDYWxsYmFjayhpZGxlKTtcbiAgICB9O1xuY29uc3QgaXNJbnB1dFBlbmRpbmcgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgKChfYSA9IG5hdmlnYXRvci5zY2hlZHVsaW5nKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNJbnB1dFBlbmRpbmcpXG4gICAgPyAoKSA9PiBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZygpIDogbnVsbDtcbmNvbnN0IHBhcnNlV29ya2VyID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIFBhcnNlV29ya2VyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMud29ya2luZyA9IG51bGw7XG4gICAgICAgIHRoaXMud29ya1NjaGVkdWxlZCA9IDA7XG4gICAgICAgIC8vIEVuZCBvZiB0aGUgY3VycmVudCB0aW1lIGNodW5rXG4gICAgICAgIHRoaXMuY2h1bmtFbmQgPSAtMTtcbiAgICAgICAgLy8gTWlsbGlzZWNvbmRzIG9mIGJ1ZGdldCBsZWZ0IGZvciB0aGlzIGNodW5rXG4gICAgICAgIHRoaXMuY2h1bmtCdWRnZXQgPSAtMTtcbiAgICAgICAgdGhpcy53b3JrID0gdGhpcy53b3JrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVXb3JrKCk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IGN4ID0gdGhpcy52aWV3LnN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlKS5jb250ZXh0O1xuICAgICAgICBpZiAoY3gudXBkYXRlVmlld3BvcnQodXBkYXRlLnZpZXcudmlld3BvcnQpIHx8IHRoaXMudmlldy52aWV3cG9ydC50byA+IGN4LnRyZWVMZW4pXG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlV29yaygpO1xuICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnNlbGVjdGlvblNldCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlldy5oYXNGb2N1cylcbiAgICAgICAgICAgICAgICB0aGlzLmNodW5rQnVkZ2V0ICs9IDUwIC8qIFdvcmsuQ2hhbmdlQm9udXMgKi87XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlV29yaygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2tBc3luY1NjaGVkdWxlKGN4KTtcbiAgICB9XG4gICAgc2NoZWR1bGVXb3JrKCkge1xuICAgICAgICBpZiAodGhpcy53b3JraW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgeyBzdGF0ZSB9ID0gdGhpcy52aWV3LCBmaWVsZCA9IHN0YXRlLmZpZWxkKExhbmd1YWdlLnN0YXRlKTtcbiAgICAgICAgaWYgKGZpZWxkLnRyZWUgIT0gZmllbGQuY29udGV4dC50cmVlIHx8ICFmaWVsZC5jb250ZXh0LmlzRG9uZShzdGF0ZS5kb2MubGVuZ3RoKSlcbiAgICAgICAgICAgIHRoaXMud29ya2luZyA9IHJlcXVlc3RJZGxlKHRoaXMud29yayk7XG4gICAgfVxuICAgIHdvcmsoZGVhZGxpbmUpIHtcbiAgICAgICAgdGhpcy53b3JraW5nID0gbnVsbDtcbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmICh0aGlzLmNodW5rRW5kIDwgbm93ICYmICh0aGlzLmNodW5rRW5kIDwgMCB8fCB0aGlzLnZpZXcuaGFzRm9jdXMpKSB7IC8vIFN0YXJ0IGEgbmV3IGNodW5rXG4gICAgICAgICAgICB0aGlzLmNodW5rRW5kID0gbm93ICsgMzAwMDAgLyogV29yay5DaHVua1RpbWUgKi87XG4gICAgICAgICAgICB0aGlzLmNodW5rQnVkZ2V0ID0gMzAwMCAvKiBXb3JrLkNodW5rQnVkZ2V0ICovO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNodW5rQnVkZ2V0IDw9IDApXG4gICAgICAgICAgICByZXR1cm47IC8vIE5vIG1vcmUgYnVkZ2V0XG4gICAgICAgIGxldCB7IHN0YXRlLCB2aWV3cG9ydDogeyB0bzogdnBUbyB9IH0gPSB0aGlzLnZpZXcsIGZpZWxkID0gc3RhdGUuZmllbGQoTGFuZ3VhZ2Uuc3RhdGUpO1xuICAgICAgICBpZiAoZmllbGQudHJlZSA9PSBmaWVsZC5jb250ZXh0LnRyZWUgJiYgZmllbGQuY29udGV4dC5pc0RvbmUodnBUbyArIDEwMDAwMCAvKiBXb3JrLk1heFBhcnNlQWhlYWQgKi8pKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgZW5kVGltZSA9IERhdGUubm93KCkgKyBNYXRoLm1pbih0aGlzLmNodW5rQnVkZ2V0LCAxMDAgLyogV29yay5TbGljZSAqLywgZGVhZGxpbmUgJiYgIWlzSW5wdXRQZW5kaW5nID8gTWF0aC5tYXgoMjUgLyogV29yay5NaW5TbGljZSAqLywgZGVhZGxpbmUudGltZVJlbWFpbmluZygpIC0gNSkgOiAxZTkpO1xuICAgICAgICBsZXQgdmlld3BvcnRGaXJzdCA9IGZpZWxkLmNvbnRleHQudHJlZUxlbiA8IHZwVG8gJiYgc3RhdGUuZG9jLmxlbmd0aCA+IHZwVG8gKyAxMDAwO1xuICAgICAgICBsZXQgZG9uZSA9IGZpZWxkLmNvbnRleHQud29yaygoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaXNJbnB1dFBlbmRpbmcgJiYgaXNJbnB1dFBlbmRpbmcoKSB8fCBEYXRlLm5vdygpID4gZW5kVGltZTtcbiAgICAgICAgfSwgdnBUbyArICh2aWV3cG9ydEZpcnN0ID8gMCA6IDEwMDAwMCAvKiBXb3JrLk1heFBhcnNlQWhlYWQgKi8pKTtcbiAgICAgICAgdGhpcy5jaHVua0J1ZGdldCAtPSBEYXRlLm5vdygpIC0gbm93O1xuICAgICAgICBpZiAoZG9uZSB8fCB0aGlzLmNodW5rQnVkZ2V0IDw9IDApIHtcbiAgICAgICAgICAgIGZpZWxkLmNvbnRleHQudGFrZVRyZWUoKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IExhbmd1YWdlLnNldFN0YXRlLm9mKG5ldyBMYW5ndWFnZVN0YXRlKGZpZWxkLmNvbnRleHQpKSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaHVua0J1ZGdldCA+IDAgJiYgIShkb25lICYmICF2aWV3cG9ydEZpcnN0KSlcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVXb3JrKCk7XG4gICAgICAgIHRoaXMuY2hlY2tBc3luY1NjaGVkdWxlKGZpZWxkLmNvbnRleHQpO1xuICAgIH1cbiAgICBjaGVja0FzeW5jU2NoZWR1bGUoY3gpIHtcbiAgICAgICAgaWYgKGN4LnNjaGVkdWxlT24pIHtcbiAgICAgICAgICAgIHRoaXMud29ya1NjaGVkdWxlZCsrO1xuICAgICAgICAgICAgY3guc2NoZWR1bGVPblxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuc2NoZWR1bGVXb3JrKCkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBsb2dFeGNlcHRpb24odGhpcy52aWV3LnN0YXRlLCBlcnIpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMud29ya1NjaGVkdWxlZC0tKTtcbiAgICAgICAgICAgIGN4LnNjaGVkdWxlT24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLndvcmtpbmcpXG4gICAgICAgICAgICB0aGlzLndvcmtpbmcoKTtcbiAgICB9XG4gICAgaXNXb3JraW5nKCkge1xuICAgICAgICByZXR1cm4gISEodGhpcy53b3JraW5nIHx8IHRoaXMud29ya1NjaGVkdWxlZCA+IDApO1xuICAgIH1cbn0sIHtcbiAgICBldmVudEhhbmRsZXJzOiB7IGZvY3VzKCkgeyB0aGlzLnNjaGVkdWxlV29yaygpOyB9IH1cbn0pO1xuLyoqXG5UaGUgZmFjZXQgdXNlZCB0byBhc3NvY2lhdGUgYSBsYW5ndWFnZSB3aXRoIGFuIGVkaXRvciBzdGF0ZS4gVXNlZFxuYnkgYExhbmd1YWdlYCBvYmplY3QncyBgZXh0ZW5zaW9uYCBwcm9wZXJ0eSAoc28geW91IGRvbid0IG5lZWQgdG9cbm1hbnVhbGx5IHdyYXAgeW91ciBsYW5ndWFnZXMgaW4gdGhpcykuIENhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGVcbmN1cnJlbnQgbGFuZ3VhZ2Ugb24gYSBzdGF0ZS5cbiovXG5jb25zdCBsYW5ndWFnZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoe1xuICAgIGNvbWJpbmUobGFuZ3VhZ2VzKSB7IHJldHVybiBsYW5ndWFnZXMubGVuZ3RoID8gbGFuZ3VhZ2VzWzBdIDogbnVsbDsgfSxcbiAgICBlbmFibGVzOiBsYW5ndWFnZSA9PiBbXG4gICAgICAgIExhbmd1YWdlLnN0YXRlLFxuICAgICAgICBwYXJzZVdvcmtlcixcbiAgICAgICAgRWRpdG9yVmlldy5jb250ZW50QXR0cmlidXRlcy5jb21wdXRlKFtsYW5ndWFnZV0sIHN0YXRlID0+IHtcbiAgICAgICAgICAgIGxldCBsYW5nID0gc3RhdGUuZmFjZXQobGFuZ3VhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIGxhbmcgJiYgbGFuZy5uYW1lID8geyBcImRhdGEtbGFuZ3VhZ2VcIjogbGFuZy5uYW1lIH0gOiB7fTtcbiAgICAgICAgfSlcbiAgICBdXG59KTtcbi8qKlxuVGhpcyBjbGFzcyBidW5kbGVzIGEgW2xhbmd1YWdlXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkxhbmd1YWdlKSB3aXRoIGFuXG5vcHRpb25hbCBzZXQgb2Ygc3VwcG9ydGluZyBleHRlbnNpb25zLiBMYW5ndWFnZSBwYWNrYWdlcyBhcmVcbmVuY291cmFnZWQgdG8gZXhwb3J0IGEgZnVuY3Rpb24gdGhhdCBvcHRpb25hbGx5IHRha2VzIGFcbmNvbmZpZ3VyYXRpb24gb2JqZWN0IGFuZCByZXR1cm5zIGEgYExhbmd1YWdlU3VwcG9ydGAgaW5zdGFuY2UsIGFzXG50aGUgbWFpbiB3YXkgZm9yIGNsaWVudCBjb2RlIHRvIHVzZSB0aGUgcGFja2FnZS5cbiovXG5jbGFzcyBMYW5ndWFnZVN1cHBvcnQge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIGxhbmd1YWdlIHN1cHBvcnQgb2JqZWN0LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxhbmd1YWdlIG9iamVjdC5cbiAgICAqL1xuICAgIGxhbmd1YWdlLCBcbiAgICAvKipcbiAgICBBbiBvcHRpb25hbCBzZXQgb2Ygc3VwcG9ydGluZyBleHRlbnNpb25zLiBXaGVuIG5lc3RpbmcgYVxuICAgIGxhbmd1YWdlIGluIGFub3RoZXIgbGFuZ3VhZ2UsIHRoZSBvdXRlciBsYW5ndWFnZSBpcyBlbmNvdXJhZ2VkXG4gICAgdG8gaW5jbHVkZSB0aGUgc3VwcG9ydGluZyBleHRlbnNpb25zIGZvciBpdHMgaW5uZXIgbGFuZ3VhZ2VzXG4gICAgaW4gaXRzIG93biBzZXQgb2Ygc3VwcG9ydCBleHRlbnNpb25zLlxuICAgICovXG4gICAgc3VwcG9ydCA9IFtdKSB7XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICAgICAgdGhpcy5zdXBwb3J0ID0gc3VwcG9ydDtcbiAgICAgICAgdGhpcy5leHRlbnNpb24gPSBbbGFuZ3VhZ2UsIHN1cHBvcnRdO1xuICAgIH1cbn1cbi8qKlxuTGFuZ3VhZ2UgZGVzY3JpcHRpb25zIGFyZSB1c2VkIHRvIHN0b3JlIG1ldGFkYXRhIGFib3V0IGxhbmd1YWdlc1xuYW5kIHRvIGR5bmFtaWNhbGx5IGxvYWQgdGhlbS4gVGhlaXIgbWFpbiByb2xlIGlzIGZpbmRpbmcgdGhlXG5hcHByb3ByaWF0ZSBsYW5ndWFnZSBmb3IgYSBmaWxlbmFtZSBvciBkeW5hbWljYWxseSBsb2FkaW5nIG5lc3RlZFxucGFyc2Vycy5cbiovXG5jbGFzcyBMYW5ndWFnZURlc2NyaXB0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbmFtZSBvZiB0aGlzIGxhbmd1YWdlLlxuICAgICovXG4gICAgbmFtZSwgXG4gICAgLyoqXG4gICAgQWx0ZXJuYXRpdmUgbmFtZXMgZm9yIHRoZSBtb2RlIChsb3dlcmNhc2VkLCBpbmNsdWRlcyBgdGhpcy5uYW1lYCkuXG4gICAgKi9cbiAgICBhbGlhcywgXG4gICAgLyoqXG4gICAgRmlsZSBleHRlbnNpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxhbmd1YWdlLlxuICAgICovXG4gICAgZXh0ZW5zaW9ucywgXG4gICAgLyoqXG4gICAgT3B0aW9uYWwgZmlsZW5hbWUgcGF0dGVybiB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpc1xuICAgIGxhbmd1YWdlLlxuICAgICovXG4gICAgZmlsZW5hbWUsIGxvYWRGdW5jLCBcbiAgICAvKipcbiAgICBJZiB0aGUgbGFuZ3VhZ2UgaGFzIGJlZW4gbG9hZGVkLCB0aGlzIHdpbGwgaG9sZCBpdHMgdmFsdWUuXG4gICAgKi9cbiAgICBzdXBwb3J0ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgICAgICAgdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcbiAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lO1xuICAgICAgICB0aGlzLmxvYWRGdW5jID0gbG9hZEZ1bmM7XG4gICAgICAgIHRoaXMuc3VwcG9ydCA9IHN1cHBvcnQ7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFN0YXJ0IGxvYWRpbmcgdGhlIHRoZSBsYW5ndWFnZS4gV2lsbCByZXR1cm4gYSBwcm9taXNlIHRoYXRcbiAgICByZXNvbHZlcyB0byBhIFtgTGFuZ3VhZ2VTdXBwb3J0YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZVN1cHBvcnQpXG4gICAgb2JqZWN0IHdoZW4gdGhlIGxhbmd1YWdlIHN1Y2Nlc3NmdWxseSBsb2Fkcy5cbiAgICAqL1xuICAgIGxvYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmcgfHwgKHRoaXMubG9hZGluZyA9IHRoaXMubG9hZEZ1bmMoKS50aGVuKHN1cHBvcnQgPT4gdGhpcy5zdXBwb3J0ID0gc3VwcG9ydCwgZXJyID0+IHsgdGhpcy5sb2FkaW5nID0gbnVsbDsgdGhyb3cgZXJyOyB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGxhbmd1YWdlIGRlc2NyaXB0aW9uLlxuICAgICovXG4gICAgc3RhdGljIG9mKHNwZWMpIHtcbiAgICAgICAgbGV0IHsgbG9hZCwgc3VwcG9ydCB9ID0gc3BlYztcbiAgICAgICAgaWYgKCFsb2FkKSB7XG4gICAgICAgICAgICBpZiAoIXN1cHBvcnQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdXN0IHBhc3MgZWl0aGVyICdsb2FkJyBvciAnc3VwcG9ydCcgdG8gTGFuZ3VhZ2VEZXNjcmlwdGlvbi5vZlwiKTtcbiAgICAgICAgICAgIGxvYWQgPSAoKSA9PiBQcm9taXNlLnJlc29sdmUoc3VwcG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBMYW5ndWFnZURlc2NyaXB0aW9uKHNwZWMubmFtZSwgKHNwZWMuYWxpYXMgfHwgW10pLmNvbmNhdChzcGVjLm5hbWUpLm1hcChzID0+IHMudG9Mb3dlckNhc2UoKSksIHNwZWMuZXh0ZW5zaW9ucyB8fCBbXSwgc3BlYy5maWxlbmFtZSwgbG9hZCwgc3VwcG9ydCk7XG4gICAgfVxuICAgIC8qKlxuICAgIExvb2sgZm9yIGEgbGFuZ3VhZ2UgaW4gdGhlIGdpdmVuIGFycmF5IG9mIGRlc2NyaXB0aW9ucyB0aGF0XG4gICAgbWF0Y2hlcyB0aGUgZmlsZW5hbWUuIFdpbGwgZmlyc3QgbWF0Y2hcbiAgICBbYGZpbGVuYW1lYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZURlc2NyaXB0aW9uLmZpbGVuYW1lKSBwYXR0ZXJucyxcbiAgICBhbmQgdGhlbiBbZXh0ZW5zaW9uc10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5MYW5ndWFnZURlc2NyaXB0aW9uLmV4dGVuc2lvbnMpLFxuICAgIGFuZCByZXR1cm4gdGhlIGZpcnN0IGxhbmd1YWdlIHRoYXQgbWF0Y2hlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXRjaEZpbGVuYW1lKGRlc2NzLCBmaWxlbmFtZSkge1xuICAgICAgICBmb3IgKGxldCBkIG9mIGRlc2NzKVxuICAgICAgICAgICAgaWYgKGQuZmlsZW5hbWUgJiYgZC5maWxlbmFtZS50ZXN0KGZpbGVuYW1lKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgbGV0IGV4dCA9IC9cXC4oW14uXSspJC8uZXhlYyhmaWxlbmFtZSk7XG4gICAgICAgIGlmIChleHQpXG4gICAgICAgICAgICBmb3IgKGxldCBkIG9mIGRlc2NzKVxuICAgICAgICAgICAgICAgIGlmIChkLmV4dGVuc2lvbnMuaW5kZXhPZihleHRbMV0pID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgTG9vayBmb3IgYSBsYW5ndWFnZSB3aG9zZSBuYW1lIG9yIGFsaWFzIG1hdGNoZXMgdGhlIHRoZSBnaXZlblxuICAgIG5hbWUgKGNhc2UtaW5zZW5zaXRpdmVseSkuIElmIGBmdXp6eWAgaXMgdHJ1ZSwgYW5kIG5vIGRpcmVjdFxuICAgIG1hdGNocyBpcyBmb3VuZCwgdGhpcydsbCBhbHNvIHNlYXJjaCBmb3IgYSBsYW5ndWFnZSB3aG9zZSBuYW1lXG4gICAgb3IgYWxpYXMgb2NjdXJzIGluIHRoZSBzdHJpbmcgKGZvciBuYW1lcyBzaG9ydGVyIHRoYW4gdGhyZWVcbiAgICBjaGFyYWN0ZXJzLCBvbmx5IHdoZW4gc3Vycm91bmRlZCBieSBub24td29yZCBjaGFyYWN0ZXJzKS5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXRjaExhbmd1YWdlTmFtZShkZXNjcywgbmFtZSwgZnV6enkgPSB0cnVlKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGZvciAobGV0IGQgb2YgZGVzY3MpXG4gICAgICAgICAgICBpZiAoZC5hbGlhcy5zb21lKGEgPT4gYSA9PSBuYW1lKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgaWYgKGZ1enp5KVxuICAgICAgICAgICAgZm9yIChsZXQgZCBvZiBkZXNjcylcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBhIG9mIGQuYWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gbmFtZS5pbmRleE9mKGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgPiAtMSAmJiAoYS5sZW5ndGggPiAyIHx8ICEvXFx3Ly50ZXN0KG5hbWVbZm91bmQgLSAxXSkgJiYgIS9cXHcvLnRlc3QobmFtZVtmb3VuZCArIGEubGVuZ3RoXSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbi8qKlxuRmFjZXQgdGhhdCBkZWZpbmVzIGEgd2F5IHRvIHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IGNvbXB1dGVzIHRoZVxuYXBwcm9wcmlhdGUgaW5kZW50YXRpb24gZGVwdGgsIGFzIGEgY29sdW1uIG51bWJlciAoc2VlXG5bYGluZGVudFN0cmluZ2BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U3RyaW5nKSksIGF0IHRoZSBzdGFydCBvZiBhIGdpdmVuXG5saW5lLiBBIHJldHVybiB2YWx1ZSBvZiBgbnVsbGAgaW5kaWNhdGVzIG5vIGluZGVudGF0aW9uIGNhbiBiZVxuZGV0ZXJtaW5lZCwgYW5kIHRoZSBsaW5lIHNob3VsZCBpbmhlcml0IHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgb25lXG5hYm92ZSBpdC4gQSByZXR1cm4gdmFsdWUgb2YgYHVuZGVmaW5lZGAgZGVmZXJzIHRvIHRoZSBuZXh0IGluZGVudFxuc2VydmljZS5cbiovXG5jb25zdCBpbmRlbnRTZXJ2aWNlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5GYWNldCBmb3Igb3ZlcnJpZGluZyB0aGUgdW5pdCBieSB3aGljaCBpbmRlbnRhdGlvbiBoYXBwZW5zLiBTaG91bGRcbmJlIGEgc3RyaW5nIGNvbnNpc3RpbmcgZWl0aGVyIGVudGlyZWx5IG9mIHRoZSBzYW1lIHdoaXRlc3BhY2VcbmNoYXJhY3Rlci4gV2hlbiBub3Qgc2V0LCB0aGlzIGRlZmF1bHRzIHRvIDIgc3BhY2VzLlxuKi9cbmNvbnN0IGluZGVudFVuaXQgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lOiB2YWx1ZXMgPT4ge1xuICAgICAgICBpZiAoIXZhbHVlcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gXCIgIFwiO1xuICAgICAgICBsZXQgdW5pdCA9IHZhbHVlc1swXTtcbiAgICAgICAgaWYgKCF1bml0IHx8IC9cXFMvLnRlc3QodW5pdCkgfHwgQXJyYXkuZnJvbSh1bml0KS5zb21lKGUgPT4gZSAhPSB1bml0WzBdKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5kZW50IHVuaXQ6IFwiICsgSlNPTi5zdHJpbmdpZnkodmFsdWVzWzBdKSk7XG4gICAgICAgIHJldHVybiB1bml0O1xuICAgIH1cbn0pO1xuLyoqXG5SZXR1cm4gdGhlIF9jb2x1bW4gd2lkdGhfIG9mIGFuIGluZGVudCB1bml0IGluIHRoZSBzdGF0ZS5cbkRldGVybWluZWQgYnkgdGhlIFtgaW5kZW50VW5pdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50VW5pdClcbmZhY2V0LCBhbmQgW2B0YWJTaXplYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZV50YWJTaXplKSB3aGVuIHRoYXRcbmNvbnRhaW5zIHRhYnMuXG4qL1xuZnVuY3Rpb24gZ2V0SW5kZW50VW5pdChzdGF0ZSkge1xuICAgIGxldCB1bml0ID0gc3RhdGUuZmFjZXQoaW5kZW50VW5pdCk7XG4gICAgcmV0dXJuIHVuaXQuY2hhckNvZGVBdCgwKSA9PSA5ID8gc3RhdGUudGFiU2l6ZSAqIHVuaXQubGVuZ3RoIDogdW5pdC5sZW5ndGg7XG59XG4vKipcbkNyZWF0ZSBhbiBpbmRlbnRhdGlvbiBzdHJpbmcgdGhhdCBjb3ZlcnMgY29sdW1ucyAwIHRvIGBjb2xzYC5cbldpbGwgdXNlIHRhYnMgZm9yIGFzIG11Y2ggb2YgdGhlIGNvbHVtbnMgYXMgcG9zc2libGUgd2hlbiB0aGVcbltgaW5kZW50VW5pdGBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50VW5pdCkgZmFjZXQgY29udGFpbnNcbnRhYnMuXG4qL1xuZnVuY3Rpb24gaW5kZW50U3RyaW5nKHN0YXRlLCBjb2xzKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCIsIHRzID0gc3RhdGUudGFiU2l6ZSwgY2ggPSBzdGF0ZS5mYWNldChpbmRlbnRVbml0KVswXTtcbiAgICBpZiAoY2ggPT0gXCJcXHRcIikge1xuICAgICAgICB3aGlsZSAoY29scyA+PSB0cykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IFwiXFx0XCI7XG4gICAgICAgICAgICBjb2xzIC09IHRzO1xuICAgICAgICB9XG4gICAgICAgIGNoID0gXCIgXCI7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sczsgaSsrKVxuICAgICAgICByZXN1bHQgKz0gY2g7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuR2V0IHRoZSBpbmRlbnRhdGlvbiwgYXMgYSBjb2x1bW4gbnVtYmVyLCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG5XaWxsIGZpcnN0IGNvbnN1bHQgYW55IFtpbmRlbnQgc2VydmljZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U2VydmljZSlcbnRoYXQgYXJlIHJlZ2lzdGVyZWQsIGFuZCBpZiBub25lIG9mIHRob3NlIHJldHVybiBhbiBpbmRlbnRhdGlvbixcbnRoaXMgd2lsbCBjaGVjayB0aGUgc3ludGF4IHRyZWUgZm9yIHRoZSBbaW5kZW50IG5vZGVcbnByb3BdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50Tm9kZVByb3ApIGFuZCB1c2UgdGhhdCBpZiBmb3VuZC4gUmV0dXJucyBhXG5udW1iZXIgd2hlbiBhbiBpbmRlbnRhdGlvbiBjb3VsZCBiZSBkZXRlcm1pbmVkLCBhbmQgbnVsbFxub3RoZXJ3aXNlLlxuKi9cbmZ1bmN0aW9uIGdldEluZGVudGF0aW9uKGNvbnRleHQsIHBvcykge1xuICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWRpdG9yU3RhdGUpXG4gICAgICAgIGNvbnRleHQgPSBuZXcgSW5kZW50Q29udGV4dChjb250ZXh0KTtcbiAgICBmb3IgKGxldCBzZXJ2aWNlIG9mIGNvbnRleHQuc3RhdGUuZmFjZXQoaW5kZW50U2VydmljZSkpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHNlcnZpY2UoY29udGV4dCwgcG9zKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKGNvbnRleHQuc3RhdGUpO1xuICAgIHJldHVybiB0cmVlLmxlbmd0aCA+PSBwb3MgPyBzeW50YXhJbmRlbnRhdGlvbihjb250ZXh0LCB0cmVlLCBwb3MpIDogbnVsbDtcbn1cbi8qKlxuQ3JlYXRlIGEgY2hhbmdlIHNldCB0aGF0IGF1dG8taW5kZW50cyBhbGwgbGluZXMgdG91Y2hlZCBieSB0aGVcbmdpdmVuIGRvY3VtZW50IHJhbmdlLlxuKi9cbmZ1bmN0aW9uIGluZGVudFJhbmdlKHN0YXRlLCBmcm9tLCB0bykge1xuICAgIGxldCB1cGRhdGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZXQgY29udGV4dCA9IG5ldyBJbmRlbnRDb250ZXh0KHN0YXRlLCB7IG92ZXJyaWRlSW5kZW50YXRpb246IHN0YXJ0ID0+IHsgdmFyIF9hOyByZXR1cm4gKF9hID0gdXBkYXRlZFtzdGFydF0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IC0xOyB9IH0pO1xuICAgIGxldCBjaGFuZ2VzID0gW107XG4gICAgZm9yIChsZXQgcG9zID0gZnJvbTsgcG9zIDw9IHRvOykge1xuICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQocG9zKTtcbiAgICAgICAgcG9zID0gbGluZS50byArIDE7XG4gICAgICAgIGxldCBpbmRlbnQgPSBnZXRJbmRlbnRhdGlvbihjb250ZXh0LCBsaW5lLmZyb20pO1xuICAgICAgICBpZiAoaW5kZW50ID09IG51bGwpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKCEvXFxTLy50ZXN0KGxpbmUudGV4dCkpXG4gICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICBsZXQgY3VyID0gL15cXHMqLy5leGVjKGxpbmUudGV4dClbMF07XG4gICAgICAgIGxldCBub3JtID0gaW5kZW50U3RyaW5nKHN0YXRlLCBpbmRlbnQpO1xuICAgICAgICBpZiAoY3VyICE9IG5vcm0pIHtcbiAgICAgICAgICAgIHVwZGF0ZWRbbGluZS5mcm9tXSA9IGluZGVudDtcbiAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7IGZyb206IGxpbmUuZnJvbSwgdG86IGxpbmUuZnJvbSArIGN1ci5sZW5ndGgsIGluc2VydDogbm9ybSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhdGUuY2hhbmdlcyhjaGFuZ2VzKTtcbn1cbi8qKlxuSW5kZW50YXRpb24gY29udGV4dHMgYXJlIHVzZWQgd2hlbiBjYWxsaW5nIFtpbmRlbnRhdGlvblxuc2VydmljZXNdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuaW5kZW50U2VydmljZSkuIFRoZXkgcHJvdmlkZSBoZWxwZXIgdXRpbGl0aWVzXG51c2VmdWwgaW4gaW5kZW50YXRpb24gbG9naWMsIGFuZCBjYW4gc2VsZWN0aXZlbHkgb3ZlcnJpZGUgdGhlXG5pbmRlbnRhdGlvbiByZXBvcnRlZCBmb3Igc29tZSBsaW5lcy5cbiovXG5jbGFzcyBJbmRlbnRDb250ZXh0IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW5kZW50IGNvbnRleHQuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgc3RhdGUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy51bml0ID0gZ2V0SW5kZW50VW5pdChzdGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgdGFraW5nXG4gICAgW3NpbXVsYXRlZCBsaW5lXG4gICAgYnJlYWtzXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLkluZGVudENvbnRleHQuY29uc3RydWN0b3Jeb3B0aW9ucy5zaW11bGF0ZUJyZWFrKVxuICAgIGludG8gYWNjb3VudC4gSWYgdGhlcmUgaXMgc3VjaCBhIGJyZWFrIGF0IGBwb3NgLCB0aGUgYGJpYXNgXG4gICAgYXJndW1lbnQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXJ0IG9mIHRoZSBsaW5lIGxpbmUgYmVmb3JlIG9yXG4gICAgYWZ0ZXIgdGhlIGJyZWFrIGlzIHVzZWQuXG4gICAgKi9cbiAgICBsaW5lQXQocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBsZXQgbGluZSA9IHRoaXMuc3RhdGUuZG9jLmxpbmVBdChwb3MpO1xuICAgICAgICBsZXQgeyBzaW11bGF0ZUJyZWFrLCBzaW11bGF0ZURvdWJsZUJyZWFrIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmIChzaW11bGF0ZUJyZWFrICE9IG51bGwgJiYgc2ltdWxhdGVCcmVhayA+PSBsaW5lLmZyb20gJiYgc2ltdWxhdGVCcmVhayA8PSBsaW5lLnRvKSB7XG4gICAgICAgICAgICBpZiAoc2ltdWxhdGVEb3VibGVCcmVhayAmJiBzaW11bGF0ZUJyZWFrID09IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0OiBcIlwiLCBmcm9tOiBwb3MgfTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGJpYXMgPCAwID8gc2ltdWxhdGVCcmVhayA8IHBvcyA6IHNpbXVsYXRlQnJlYWsgPD0gcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHRleHQ6IGxpbmUudGV4dC5zbGljZShzaW11bGF0ZUJyZWFrIC0gbGluZS5mcm9tKSwgZnJvbTogc2ltdWxhdGVCcmVhayB9O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHRleHQ6IGxpbmUudGV4dC5zbGljZSgwLCBzaW11bGF0ZUJyZWFrIC0gbGluZS5mcm9tKSwgZnJvbTogbGluZS5mcm9tIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdGV4dCBkaXJlY3RseSBhZnRlciBgcG9zYCwgZWl0aGVyIHRoZSBlbnRpcmUgbGluZVxuICAgIG9yIHRoZSBuZXh0IDEwMCBjaGFyYWN0ZXJzLCB3aGljaGV2ZXIgaXMgc2hvcnRlci5cbiAgICAqL1xuICAgIHRleHRBZnRlclBvcyhwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2ltdWxhdGVEb3VibGVCcmVhayAmJiBwb3MgPT0gdGhpcy5vcHRpb25zLnNpbXVsYXRlQnJlYWspXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IHsgdGV4dCwgZnJvbSB9ID0gdGhpcy5saW5lQXQocG9zLCBiaWFzKTtcbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UocG9zIC0gZnJvbSwgTWF0aC5taW4odGV4dC5sZW5ndGgsIHBvcyArIDEwMCAtIGZyb20pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgY29sdW1uIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBjb2x1bW4ocG9zLCBiaWFzID0gMSkge1xuICAgICAgICBsZXQgeyB0ZXh0LCBmcm9tIH0gPSB0aGlzLmxpbmVBdChwb3MsIGJpYXMpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5jb3VudENvbHVtbih0ZXh0LCBwb3MgLSBmcm9tKTtcbiAgICAgICAgbGV0IG92ZXJyaWRlID0gdGhpcy5vcHRpb25zLm92ZXJyaWRlSW5kZW50YXRpb24gPyB0aGlzLm9wdGlvbnMub3ZlcnJpZGVJbmRlbnRhdGlvbihmcm9tKSA6IC0xO1xuICAgICAgICBpZiAob3ZlcnJpZGUgPiAtMSlcbiAgICAgICAgICAgIHJlc3VsdCArPSBvdmVycmlkZSAtIHRoaXMuY291bnRDb2x1bW4odGV4dCwgdGV4dC5zZWFyY2goL1xcU3wkLykpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBjb2x1bW4gcG9zaXRpb24gKHRha2luZyB0YWJzIGludG8gYWNjb3VudCkgb2YgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24gaW4gdGhlIGdpdmVuIHN0cmluZy5cbiAgICAqL1xuICAgIGNvdW50Q29sdW1uKGxpbmUsIHBvcyA9IGxpbmUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBjb3VudENvbHVtbihsaW5lLCB0aGlzLnN0YXRlLnRhYlNpemUsIHBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGluZGVudGF0aW9uIGNvbHVtbiBvZiB0aGUgbGluZSBhdCB0aGUgZ2l2ZW4gcG9pbnQuXG4gICAgKi9cbiAgICBsaW5lSW5kZW50KHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgbGV0IHsgdGV4dCwgZnJvbSB9ID0gdGhpcy5saW5lQXQocG9zLCBiaWFzKTtcbiAgICAgICAgbGV0IG92ZXJyaWRlID0gdGhpcy5vcHRpb25zLm92ZXJyaWRlSW5kZW50YXRpb247XG4gICAgICAgIGlmIChvdmVycmlkZSkge1xuICAgICAgICAgICAgbGV0IG92ZXJyaWRlbiA9IG92ZXJyaWRlKGZyb20pO1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlbiA+IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiBvdmVycmlkZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY291bnRDb2x1bW4odGV4dCwgdGV4dC5zZWFyY2goL1xcU3wkLykpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSBbc2ltdWxhdGVkIGxpbmVcbiAgICBicmVha10oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5JbmRlbnRDb250ZXh0LmNvbnN0cnVjdG9yXm9wdGlvbnMuc2ltdWxhdGVCcmVhaylcbiAgICBmb3IgdGhpcyBjb250ZXh0LCBpZiBhbnkuXG4gICAgKi9cbiAgICBnZXQgc2ltdWxhdGVkQnJlYWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2ltdWxhdGVCcmVhayB8fCBudWxsO1xuICAgIH1cbn1cbi8qKlxuQSBzeW50YXggdHJlZSBub2RlIHByb3AgdXNlZCB0byBhc3NvY2lhdGUgaW5kZW50YXRpb24gc3RyYXRlZ2llc1xud2l0aCBub2RlIHR5cGVzLiBTdWNoIGEgc3RyYXRlZ3kgaXMgYSBmdW5jdGlvbiBmcm9tIGFuIGluZGVudGF0aW9uXG5jb250ZXh0IHRvIGEgY29sdW1uIG51bWJlciAoc2VlIGFsc29cbltgaW5kZW50U3RyaW5nYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5pbmRlbnRTdHJpbmcpKSBvciBudWxsLCB3aGVyZSBudWxsXG5pbmRpY2F0ZXMgdGhhdCBubyBkZWZpbml0aXZlIGluZGVudGF0aW9uIGNhbiBiZSBkZXRlcm1pbmVkLlxuKi9cbmNvbnN0IGluZGVudE5vZGVQcm9wID0gLypAX19QVVJFX18qL25ldyBOb2RlUHJvcCgpO1xuLy8gQ29tcHV0ZSB0aGUgaW5kZW50YXRpb24gZm9yIGEgZ2l2ZW4gcG9zaXRpb24gZnJvbSB0aGUgc3ludGF4IHRyZWUuXG5mdW5jdGlvbiBzeW50YXhJbmRlbnRhdGlvbihjeCwgYXN0LCBwb3MpIHtcbiAgICBsZXQgc3RhY2sgPSBhc3QucmVzb2x2ZVN0YWNrKHBvcyk7XG4gICAgbGV0IGlubmVyID0gc3RhY2subm9kZS5lbnRlclVuZmluaXNoZWROb2Rlc0JlZm9yZShwb3MpO1xuICAgIGlmIChpbm5lciAhPSBzdGFjay5ub2RlKSB7XG4gICAgICAgIGxldCBhZGQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gaW5uZXI7IGN1ciAhPSBzdGFjay5ub2RlOyBjdXIgPSBjdXIucGFyZW50KVxuICAgICAgICAgICAgYWRkLnB1c2goY3VyKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFkZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgIHN0YWNrID0geyBub2RlOiBhZGRbaV0sIG5leHQ6IHN0YWNrIH07XG4gICAgfVxuICAgIHJldHVybiBpbmRlbnRGb3Ioc3RhY2ssIGN4LCBwb3MpO1xufVxuZnVuY3Rpb24gaW5kZW50Rm9yKHN0YWNrLCBjeCwgcG9zKSB7XG4gICAgZm9yIChsZXQgY3VyID0gc3RhY2s7IGN1cjsgY3VyID0gY3VyLm5leHQpIHtcbiAgICAgICAgbGV0IHN0cmF0ZWd5ID0gaW5kZW50U3RyYXRlZ3koY3VyLm5vZGUpO1xuICAgICAgICBpZiAoc3RyYXRlZ3kpXG4gICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3koVHJlZUluZGVudENvbnRleHQuY3JlYXRlKGN4LCBwb3MsIGN1cikpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGlnbm9yZUNsb3NlZChjeCkge1xuICAgIHJldHVybiBjeC5wb3MgPT0gY3gub3B0aW9ucy5zaW11bGF0ZUJyZWFrICYmIGN4Lm9wdGlvbnMuc2ltdWxhdGVEb3VibGVCcmVhaztcbn1cbmZ1bmN0aW9uIGluZGVudFN0cmF0ZWd5KHRyZWUpIHtcbiAgICBsZXQgc3RyYXRlZ3kgPSB0cmVlLnR5cGUucHJvcChpbmRlbnROb2RlUHJvcCk7XG4gICAgaWYgKHN0cmF0ZWd5KVxuICAgICAgICByZXR1cm4gc3RyYXRlZ3k7XG4gICAgbGV0IGZpcnN0ID0gdHJlZS5maXJzdENoaWxkLCBjbG9zZTtcbiAgICBpZiAoZmlyc3QgJiYgKGNsb3NlID0gZmlyc3QudHlwZS5wcm9wKE5vZGVQcm9wLmNsb3NlZEJ5KSkpIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0cmVlLmxhc3RDaGlsZCwgY2xvc2VkID0gbGFzdCAmJiBjbG9zZS5pbmRleE9mKGxhc3QubmFtZSkgPiAtMTtcbiAgICAgICAgcmV0dXJuIGN4ID0+IGRlbGltaXRlZFN0cmF0ZWd5KGN4LCB0cnVlLCAxLCB1bmRlZmluZWQsIGNsb3NlZCAmJiAhaWdub3JlQ2xvc2VkKGN4KSA/IGxhc3QuZnJvbSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0cmVlLnBhcmVudCA9PSBudWxsID8gdG9wSW5kZW50IDogbnVsbDtcbn1cbmZ1bmN0aW9uIHRvcEluZGVudCgpIHsgcmV0dXJuIDA7IH1cbi8qKlxuT2JqZWN0cyBvZiB0aGlzIHR5cGUgcHJvdmlkZSBjb250ZXh0IGluZm9ybWF0aW9uIGFuZCBoZWxwZXJcbm1ldGhvZHMgdG8gaW5kZW50YXRpb24gZnVuY3Rpb25zIHJlZ2lzdGVyZWQgb24gc3ludGF4IG5vZGVzLlxuKi9cbmNsYXNzIFRyZWVJbmRlbnRDb250ZXh0IGV4dGVuZHMgSW5kZW50Q29udGV4dCB7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHdoaWNoIGluZGVudGF0aW9uIGlzIGJlaW5nIGNvbXB1dGVkLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoYmFzZS5zdGF0ZSwgYmFzZS5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzeW50YXggdHJlZSBub2RlIHRvIHdoaWNoIHRoZSBpbmRlbnRhdGlvbiBzdHJhdGVneVxuICAgIGFwcGxpZXMuXG4gICAgKi9cbiAgICBnZXQgbm9kZSgpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5ub2RlOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGJhc2UsIHBvcywgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyZWVJbmRlbnRDb250ZXh0KGJhc2UsIHBvcywgY29udGV4dCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgdGV4dCBkaXJlY3RseSBhZnRlciBgdGhpcy5wb3NgLCBlaXRoZXIgdGhlIGVudGlyZSBsaW5lXG4gICAgb3IgdGhlIG5leHQgMTAwIGNoYXJhY3RlcnMsIHdoaWNoZXZlciBpcyBzaG9ydGVyLlxuICAgICovXG4gICAgZ2V0IHRleHRBZnRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dEFmdGVyUG9zKHRoaXMucG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBpbmRlbnRhdGlvbiBhdCB0aGUgcmVmZXJlbmNlIGxpbmUgZm9yIGB0aGlzLm5vZGVgLCB3aGljaFxuICAgIGlzIHRoZSBsaW5lIG9uIHdoaWNoIGl0IHN0YXJ0cywgdW5sZXNzIHRoZXJlIGlzIGEgbm9kZSB0aGF0IGlzXG4gICAgX25vdF8gYSBwYXJlbnQgb2YgdGhpcyBub2RlIGNvdmVyaW5nIHRoZSBzdGFydCBvZiB0aGF0IGxpbmUuIElmXG4gICAgc28sIHRoZSBsaW5lIGF0IHRoZSBzdGFydCBvZiB0aGF0IG5vZGUgaXMgdHJpZWQsIGFnYWluIHNraXBwaW5nXG4gICAgb24gaWYgaXQgaXMgY292ZXJlZCBieSBhbm90aGVyIHN1Y2ggbm9kZS5cbiAgICAqL1xuICAgIGdldCBiYXNlSW5kZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlSW5kZW50Rm9yKHRoaXMubm9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgaW5kZW50YXRpb24gZm9yIHRoZSByZWZlcmVuY2UgbGluZSBvZiB0aGUgZ2l2ZW4gbm9kZVxuICAgIChzZWUgW2BiYXNlSW5kZW50YF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5UcmVlSW5kZW50Q29udGV4dC5iYXNlSW5kZW50KSkuXG4gICAgKi9cbiAgICBiYXNlSW5kZW50Rm9yKG5vZGUpIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLnN0YXRlLmRvYy5saW5lQXQobm9kZS5mcm9tKTtcbiAgICAgICAgLy8gU2tpcCBsaW5lIHN0YXJ0cyB0aGF0IGFyZSBjb3ZlcmVkIGJ5IGEgc2libGluZyAob3IgY291c2luLCBldGMpXG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBhdEJyZWFrID0gbm9kZS5yZXNvbHZlKGxpbmUuZnJvbSk7XG4gICAgICAgICAgICB3aGlsZSAoYXRCcmVhay5wYXJlbnQgJiYgYXRCcmVhay5wYXJlbnQuZnJvbSA9PSBhdEJyZWFrLmZyb20pXG4gICAgICAgICAgICAgICAgYXRCcmVhayA9IGF0QnJlYWsucGFyZW50O1xuICAgICAgICAgICAgaWYgKGlzUGFyZW50KGF0QnJlYWssIG5vZGUpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGluZSA9IHRoaXMuc3RhdGUuZG9jLmxpbmVBdChhdEJyZWFrLmZyb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVJbmRlbnQobGluZS5mcm9tKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udGludWUgbG9va2luZyBmb3IgaW5kZW50YXRpb25zIGluIHRoZSBub2RlJ3MgcGFyZW50IG5vZGVzLFxuICAgIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGF0LlxuICAgICovXG4gICAgY29udGludWUoKSB7XG4gICAgICAgIHJldHVybiBpbmRlbnRGb3IodGhpcy5jb250ZXh0Lm5leHQsIHRoaXMuYmFzZSwgdGhpcy5wb3MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzUGFyZW50KHBhcmVudCwgb2YpIHtcbiAgICBmb3IgKGxldCBjdXIgPSBvZjsgY3VyOyBjdXIgPSBjdXIucGFyZW50KVxuICAgICAgICBpZiAocGFyZW50ID09IGN1cilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIENoZWNrIHdoZXRoZXIgYSBkZWxpbWl0ZWQgbm9kZSBpcyBhbGlnbmVkIChtZWFuaW5nIHRoZXJlIGFyZVxuLy8gbm9uLXNraXBwZWQgbm9kZXMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgb3BlbmluZyBkZWxpbWl0ZXIpLiBBbmRcbi8vIGlmIHNvLCByZXR1cm4gdGhlIG9wZW5pbmcgdG9rZW4uXG5mdW5jdGlvbiBicmFja2V0ZWRBbGlnbmVkKGNvbnRleHQpIHtcbiAgICBsZXQgdHJlZSA9IGNvbnRleHQubm9kZTtcbiAgICBsZXQgb3BlblRva2VuID0gdHJlZS5jaGlsZEFmdGVyKHRyZWUuZnJvbSksIGxhc3QgPSB0cmVlLmxhc3RDaGlsZDtcbiAgICBpZiAoIW9wZW5Ub2tlbilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHNpbSA9IGNvbnRleHQub3B0aW9ucy5zaW11bGF0ZUJyZWFrO1xuICAgIGxldCBvcGVuTGluZSA9IGNvbnRleHQuc3RhdGUuZG9jLmxpbmVBdChvcGVuVG9rZW4uZnJvbSk7XG4gICAgbGV0IGxpbmVFbmQgPSBzaW0gPT0gbnVsbCB8fCBzaW0gPD0gb3BlbkxpbmUuZnJvbSA/IG9wZW5MaW5lLnRvIDogTWF0aC5taW4ob3BlbkxpbmUudG8sIHNpbSk7XG4gICAgZm9yIChsZXQgcG9zID0gb3BlblRva2VuLnRvOzspIHtcbiAgICAgICAgbGV0IG5leHQgPSB0cmVlLmNoaWxkQWZ0ZXIocG9zKTtcbiAgICAgICAgaWYgKCFuZXh0IHx8IG5leHQgPT0gbGFzdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIW5leHQudHlwZS5pc1NraXBwZWQpXG4gICAgICAgICAgICByZXR1cm4gbmV4dC5mcm9tIDwgbGluZUVuZCA/IG9wZW5Ub2tlbiA6IG51bGw7XG4gICAgICAgIHBvcyA9IG5leHQudG87XG4gICAgfVxufVxuLyoqXG5BbiBpbmRlbnRhdGlvbiBzdHJhdGVneSBmb3IgZGVsaW1pdGVkICh1c3VhbGx5IGJyYWNrZXRlZCkgbm9kZXMuXG5XaWxsLCBieSBkZWZhdWx0LCBpbmRlbnQgb25lIHVuaXQgbW9yZSB0aGFuIHRoZSBwYXJlbnQncyBiYXNlXG5pbmRlbnQgdW5sZXNzIHRoZSBsaW5lIHN0YXJ0cyB3aXRoIGEgY2xvc2luZyB0b2tlbi4gV2hlbiBgYWxpZ25gXG5pcyB0cnVlIGFuZCB0aGVyZSBhcmUgbm9uLXNraXBwZWQgbm9kZXMgb24gdGhlIG5vZGUncyBvcGVuaW5nXG5saW5lLCB0aGUgY29udGVudCBvZiB0aGUgbm9kZSB3aWxsIGJlIGFsaWduZWQgd2l0aCB0aGUgZW5kIG9mIHRoZVxub3BlbmluZyBub2RlLCBsaWtlIHRoaXM6XG5cbiAgICBmb28oYmFyLFxuICAgICAgICBiYXopXG4qL1xuZnVuY3Rpb24gZGVsaW1pdGVkSW5kZW50KHsgY2xvc2luZywgYWxpZ24gPSB0cnVlLCB1bml0cyA9IDEgfSkge1xuICAgIHJldHVybiAoY29udGV4dCkgPT4gZGVsaW1pdGVkU3RyYXRlZ3koY29udGV4dCwgYWxpZ24sIHVuaXRzLCBjbG9zaW5nKTtcbn1cbmZ1bmN0aW9uIGRlbGltaXRlZFN0cmF0ZWd5KGNvbnRleHQsIGFsaWduLCB1bml0cywgY2xvc2luZywgY2xvc2VkQXQpIHtcbiAgICBsZXQgYWZ0ZXIgPSBjb250ZXh0LnRleHRBZnRlciwgc3BhY2UgPSBhZnRlci5tYXRjaCgvXlxccyovKVswXS5sZW5ndGg7XG4gICAgbGV0IGNsb3NlZCA9IGNsb3NpbmcgJiYgYWZ0ZXIuc2xpY2Uoc3BhY2UsIHNwYWNlICsgY2xvc2luZy5sZW5ndGgpID09IGNsb3NpbmcgfHwgY2xvc2VkQXQgPT0gY29udGV4dC5wb3MgKyBzcGFjZTtcbiAgICBsZXQgYWxpZ25lZCA9IGFsaWduID8gYnJhY2tldGVkQWxpZ25lZChjb250ZXh0KSA6IG51bGw7XG4gICAgaWYgKGFsaWduZWQpXG4gICAgICAgIHJldHVybiBjbG9zZWQgPyBjb250ZXh0LmNvbHVtbihhbGlnbmVkLmZyb20pIDogY29udGV4dC5jb2x1bW4oYWxpZ25lZC50byk7XG4gICAgcmV0dXJuIGNvbnRleHQuYmFzZUluZGVudCArIChjbG9zZWQgPyAwIDogY29udGV4dC51bml0ICogdW5pdHMpO1xufVxuLyoqXG5BbiBpbmRlbnRhdGlvbiBzdHJhdGVneSB0aGF0IGFsaWducyBhIG5vZGUncyBjb250ZW50IHRvIGl0cyBiYXNlXG5pbmRlbnRhdGlvbi5cbiovXG5jb25zdCBmbGF0SW5kZW50ID0gKGNvbnRleHQpID0+IGNvbnRleHQuYmFzZUluZGVudDtcbi8qKlxuQ3JlYXRlcyBhbiBpbmRlbnRhdGlvbiBzdHJhdGVneSB0aGF0LCBieSBkZWZhdWx0LCBpbmRlbnRzXG5jb250aW51ZWQgbGluZXMgb25lIHVuaXQgbW9yZSB0aGFuIHRoZSBub2RlJ3MgYmFzZSBpbmRlbnRhdGlvbi5cbllvdSBjYW4gcHJvdmlkZSBgZXhjZXB0YCB0byBwcmV2ZW50IGluZGVudGF0aW9uIG9mIGxpbmVzIHRoYXRcbm1hdGNoIGEgcGF0dGVybiAoZm9yIGV4YW1wbGUgYC9eZWxzZVxcYi9gIGluIGBpZmAvYGVsc2VgXG5jb25zdHJ1Y3RzKSwgYW5kIHlvdSBjYW4gY2hhbmdlIHRoZSBhbW91bnQgb2YgdW5pdHMgdXNlZCB3aXRoIHRoZVxuYHVuaXRzYCBvcHRpb24uXG4qL1xuZnVuY3Rpb24gY29udGludWVkSW5kZW50KHsgZXhjZXB0LCB1bml0cyA9IDEgfSA9IHt9KSB7XG4gICAgcmV0dXJuIChjb250ZXh0KSA9PiB7XG4gICAgICAgIGxldCBtYXRjaEV4Y2VwdCA9IGV4Y2VwdCAmJiBleGNlcHQudGVzdChjb250ZXh0LnRleHRBZnRlcik7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmJhc2VJbmRlbnQgKyAobWF0Y2hFeGNlcHQgPyAwIDogdW5pdHMgKiBjb250ZXh0LnVuaXQpO1xuICAgIH07XG59XG5jb25zdCBEb250SW5kZW50QmV5b25kID0gMjAwO1xuLyoqXG5FbmFibGVzIHJlaW5kZW50YXRpb24gb24gaW5wdXQuIFdoZW4gYSBsYW5ndWFnZSBkZWZpbmVzIGFuXG5gaW5kZW50T25JbnB1dGAgZmllbGQgaW4gaXRzIFtsYW5ndWFnZVxuZGF0YV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5sYW5ndWFnZURhdGFBdCksIHdoaWNoIG11c3QgaG9sZCBhIHJlZ3VsYXJcbmV4cHJlc3Npb24sIHRoZSBsaW5lIGF0IHRoZSBjdXJzb3Igd2lsbCBiZSByZWluZGVudGVkIHdoZW5ldmVyIG5ld1xudGV4dCBpcyB0eXBlZCBhbmQgdGhlIGlucHV0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHVwIHRvIHRoZVxuY3Vyc29yIG1hdGNoZXMgdGhhdCByZWdleHAuXG5cblRvIGF2b2lkIHVubmVjY2VzYXJ5IHJlaW5kZW50cywgaXQgaXMgcmVjb21tZW5kZWQgdG8gc3RhcnQgdGhlXG5yZWdleHAgd2l0aCBgXmAgKHVzdWFsbHkgZm9sbG93ZWQgYnkgYFxccypgKSwgYW5kIGVuZCBpdCB3aXRoIGAkYC5cbkZvciBleGFtcGxlLCBgL15cXHMqXFx9JC9gIHdpbGwgcmVpbmRlbnQgd2hlbiBhIGNsb3NpbmcgYnJhY2UgaXNcbmFkZGVkIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuXG4qL1xuZnVuY3Rpb24gaW5kZW50T25JbnB1dCgpIHtcbiAgICByZXR1cm4gRWRpdG9yU3RhdGUudHJhbnNhY3Rpb25GaWx0ZXIub2YodHIgPT4ge1xuICAgICAgICBpZiAoIXRyLmRvY0NoYW5nZWQgfHwgIXRyLmlzVXNlckV2ZW50KFwiaW5wdXQudHlwZVwiKSAmJiAhdHIuaXNVc2VyRXZlbnQoXCJpbnB1dC5jb21wbGV0ZVwiKSlcbiAgICAgICAgICAgIHJldHVybiB0cjtcbiAgICAgICAgbGV0IHJ1bGVzID0gdHIuc3RhcnRTdGF0ZS5sYW5ndWFnZURhdGFBdChcImluZGVudE9uSW5wdXRcIiwgdHIuc3RhcnRTdGF0ZS5zZWxlY3Rpb24ubWFpbi5oZWFkKTtcbiAgICAgICAgaWYgKCFydWxlcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIGxldCBkb2MgPSB0ci5uZXdEb2MsIHsgaGVhZCB9ID0gdHIubmV3U2VsZWN0aW9uLm1haW4sIGxpbmUgPSBkb2MubGluZUF0KGhlYWQpO1xuICAgICAgICBpZiAoaGVhZCA+IGxpbmUuZnJvbSArIERvbnRJbmRlbnRCZXlvbmQpXG4gICAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIGxldCBsaW5lU3RhcnQgPSBkb2Muc2xpY2VTdHJpbmcobGluZS5mcm9tLCBoZWFkKTtcbiAgICAgICAgaWYgKCFydWxlcy5zb21lKHIgPT4gci50ZXN0KGxpbmVTdGFydCkpKVxuICAgICAgICAgICAgcmV0dXJuIHRyO1xuICAgICAgICBsZXQgeyBzdGF0ZSB9ID0gdHIsIGxhc3QgPSAtMSwgY2hhbmdlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB7IGhlYWQgfSBvZiBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQoaGVhZCk7XG4gICAgICAgICAgICBpZiAobGluZS5mcm9tID09IGxhc3QpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBsYXN0ID0gbGluZS5mcm9tO1xuICAgICAgICAgICAgbGV0IGluZGVudCA9IGdldEluZGVudGF0aW9uKHN0YXRlLCBsaW5lLmZyb20pO1xuICAgICAgICAgICAgaWYgKGluZGVudCA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGN1ciA9IC9eXFxzKi8uZXhlYyhsaW5lLnRleHQpWzBdO1xuICAgICAgICAgICAgbGV0IG5vcm0gPSBpbmRlbnRTdHJpbmcoc3RhdGUsIGluZGVudCk7XG4gICAgICAgICAgICBpZiAoY3VyICE9IG5vcm0pXG4gICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKHsgZnJvbTogbGluZS5mcm9tLCB0bzogbGluZS5mcm9tICsgY3VyLmxlbmd0aCwgaW5zZXJ0OiBub3JtIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VzLmxlbmd0aCA/IFt0ciwgeyBjaGFuZ2VzLCBzZXF1ZW50aWFsOiB0cnVlIH1dIDogdHI7XG4gICAgfSk7XG59XG5cbi8qKlxuQSBmYWNldCB0aGF0IHJlZ2lzdGVycyBhIGNvZGUgZm9sZGluZyBzZXJ2aWNlLiBXaGVuIGNhbGxlZCB3aXRoXG50aGUgZXh0ZW50IG9mIGEgbGluZSwgc3VjaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBmb2xkYWJsZVxucmFuZ2UgdGhhdCBzdGFydHMgb24gdGhhdCBsaW5lIChidXQgY29udGludWVzIGJleW9uZCBpdCksIGlmIG9uZVxuY2FuIGJlIGZvdW5kLlxuKi9cbmNvbnN0IGZvbGRTZXJ2aWNlID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSgpO1xuLyoqXG5UaGlzIG5vZGUgcHJvcCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBmb2xkaW5nIGluZm9ybWF0aW9uIHdpdGhcbnN5bnRheCBub2RlIHR5cGVzLiBHaXZlbiBhIHN5bnRheCBub2RlLCBpdCBzaG91bGQgY2hlY2sgd2hldGhlclxudGhhdCB0cmVlIGlzIGZvbGRhYmxlIGFuZCByZXR1cm4gdGhlIHJhbmdlIHRoYXQgY2FuIGJlIGNvbGxhcHNlZFxud2hlbiBpdCBpcy5cbiovXG5jb25zdCBmb2xkTm9kZVByb3AgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVQcm9wKCk7XG4vKipcbltGb2xkXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGROb2RlUHJvcCkgZnVuY3Rpb24gdGhhdCBmb2xkcyBldmVyeXRoaW5nIGJ1dFxudGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBjaGlsZCBvZiBhIHN5bnRheCBub2RlLiBVc2VmdWwgZm9yIG5vZGVzXG50aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCBkZWxpbWl0ZXJzLlxuKi9cbmZ1bmN0aW9uIGZvbGRJbnNpZGUobm9kZSkge1xuICAgIGxldCBmaXJzdCA9IG5vZGUuZmlyc3RDaGlsZCwgbGFzdCA9IG5vZGUubGFzdENoaWxkO1xuICAgIHJldHVybiBmaXJzdCAmJiBmaXJzdC50byA8IGxhc3QuZnJvbSA/IHsgZnJvbTogZmlyc3QudG8sIHRvOiBsYXN0LnR5cGUuaXNFcnJvciA/IG5vZGUudG8gOiBsYXN0LmZyb20gfSA6IG51bGw7XG59XG5mdW5jdGlvbiBzeW50YXhGb2xkaW5nKHN0YXRlLCBzdGFydCwgZW5kKSB7XG4gICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKHN0YXRlKTtcbiAgICBpZiAodHJlZS5sZW5ndGggPCBlbmQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBzdGFjayA9IHRyZWUucmVzb2x2ZVN0YWNrKGVuZCwgMSk7XG4gICAgbGV0IGZvdW5kID0gbnVsbDtcbiAgICBmb3IgKGxldCBpdGVyID0gc3RhY2s7IGl0ZXI7IGl0ZXIgPSBpdGVyLm5leHQpIHtcbiAgICAgICAgbGV0IGN1ciA9IGl0ZXIubm9kZTtcbiAgICAgICAgaWYgKGN1ci50byA8PSBlbmQgfHwgY3VyLmZyb20gPiBlbmQpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKGZvdW5kICYmIGN1ci5mcm9tIDwgc3RhcnQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IHByb3AgPSBjdXIudHlwZS5wcm9wKGZvbGROb2RlUHJvcCk7XG4gICAgICAgIGlmIChwcm9wICYmIChjdXIudG8gPCB0cmVlLmxlbmd0aCAtIDUwIHx8IHRyZWUubGVuZ3RoID09IHN0YXRlLmRvYy5sZW5ndGggfHwgIWlzVW5maW5pc2hlZChjdXIpKSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gcHJvcChjdXIsIHN0YXRlKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5mcm9tIDw9IGVuZCAmJiB2YWx1ZS5mcm9tID49IHN0YXJ0ICYmIHZhbHVlLnRvID4gZW5kKVxuICAgICAgICAgICAgICAgIGZvdW5kID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuZnVuY3Rpb24gaXNVbmZpbmlzaGVkKG5vZGUpIHtcbiAgICBsZXQgY2ggPSBub2RlLmxhc3RDaGlsZDtcbiAgICByZXR1cm4gY2ggJiYgY2gudG8gPT0gbm9kZS50byAmJiBjaC50eXBlLmlzRXJyb3I7XG59XG4vKipcbkNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGxpbmUgaXMgZm9sZGFibGUuIEZpcnN0IGFza3MgYW55IGZvbGRcbnNlcnZpY2VzIHJlZ2lzdGVyZWQgdGhyb3VnaFxuW2Bmb2xkU2VydmljZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZFNlcnZpY2UpLCBhbmQgaWYgbm9uZSBvZiB0aGVtIHJldHVyblxuYSByZXN1bHQsIHRyaWVzIHRvIHF1ZXJ5IHRoZSBbZm9sZCBub2RlXG5wcm9wXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGROb2RlUHJvcCkgb2Ygc3ludGF4IG5vZGVzIHRoYXQgY292ZXIgdGhlIGVuZFxub2YgdGhlIGxpbmUuXG4qL1xuZnVuY3Rpb24gZm9sZGFibGUoc3RhdGUsIGxpbmVTdGFydCwgbGluZUVuZCkge1xuICAgIGZvciAobGV0IHNlcnZpY2Ugb2Ygc3RhdGUuZmFjZXQoZm9sZFNlcnZpY2UpKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBzZXJ2aWNlKHN0YXRlLCBsaW5lU3RhcnQsIGxpbmVFbmQpO1xuICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHN5bnRheEZvbGRpbmcoc3RhdGUsIGxpbmVTdGFydCwgbGluZUVuZCk7XG59XG5mdW5jdGlvbiBtYXBSYW5nZShyYW5nZSwgbWFwcGluZykge1xuICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBQb3MocmFuZ2UuZnJvbSwgMSksIHRvID0gbWFwcGluZy5tYXBQb3MocmFuZ2UudG8sIC0xKTtcbiAgICByZXR1cm4gZnJvbSA+PSB0byA/IHVuZGVmaW5lZCA6IHsgZnJvbSwgdG8gfTtcbn1cbi8qKlxuU3RhdGUgZWZmZWN0IHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEgdHJhbnNhY3Rpb24gdG8gZm9sZCB0aGVcbmdpdmVuIHJhbmdlLiAoWW91IHByb2JhYmx5IG9ubHkgbmVlZCB0aGlzIGluIGV4Y2VwdGlvbmFsXG5jaXJjdW1zdGFuY2VzXHUyMDE0dXN1YWxseSB5b3UnbGwganVzdCB3YW50IHRvIGxldFxuW2Bmb2xkQ29kZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuZm9sZENvZGUpIGFuZCB0aGUgW2ZvbGRcbmd1dHRlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkR3V0dGVyKSBjcmVhdGUgdGhlIHRyYW5zYWN0aW9ucy4pXG4qL1xuY29uc3QgZm9sZEVmZmVjdCA9IC8qQF9fUFVSRV9fKi9TdGF0ZUVmZmVjdC5kZWZpbmUoeyBtYXA6IG1hcFJhbmdlIH0pO1xuLyoqXG5TdGF0ZSBlZmZlY3QgdGhhdCB1bmZvbGRzIHRoZSBnaXZlbiByYW5nZSAoaWYgaXQgd2FzIGZvbGRlZCkuXG4qL1xuY29uc3QgdW5mb2xkRWZmZWN0ID0gLypAX19QVVJFX18qL1N0YXRlRWZmZWN0LmRlZmluZSh7IG1hcDogbWFwUmFuZ2UgfSk7XG5mdW5jdGlvbiBzZWxlY3RlZExpbmVzKHZpZXcpIHtcbiAgICBsZXQgbGluZXMgPSBbXTtcbiAgICBmb3IgKGxldCB7IGhlYWQgfSBvZiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5yYW5nZXMpIHtcbiAgICAgICAgaWYgKGxpbmVzLnNvbWUobCA9PiBsLmZyb20gPD0gaGVhZCAmJiBsLnRvID49IGhlYWQpKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGxpbmVzLnB1c2godmlldy5saW5lQmxvY2tBdChoZWFkKSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbn1cbi8qKlxuVGhlIHN0YXRlIGZpZWxkIHRoYXQgc3RvcmVzIHRoZSBmb2xkZWQgcmFuZ2VzIChhcyBhIFtkZWNvcmF0aW9uXG5zZXRdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uU2V0KSkuIENhbiBiZSBwYXNzZWQgdG9cbltgRWRpdG9yU3RhdGUudG9KU09OYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS50b0pTT04pIGFuZFxuW2Bmcm9tSlNPTmBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGVeZnJvbUpTT04pIHRvIHNlcmlhbGl6ZSB0aGUgZm9sZFxuc3RhdGUuXG4qL1xuY29uc3QgZm9sZFN0YXRlID0gLypAX19QVVJFX18qL1N0YXRlRmllbGQuZGVmaW5lKHtcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLm5vbmU7XG4gICAgfSxcbiAgICB1cGRhdGUoZm9sZGVkLCB0cikge1xuICAgICAgICBmb2xkZWQgPSBmb2xkZWQubWFwKHRyLmNoYW5nZXMpO1xuICAgICAgICBmb3IgKGxldCBlIG9mIHRyLmVmZmVjdHMpIHtcbiAgICAgICAgICAgIGlmIChlLmlzKGZvbGRFZmZlY3QpICYmICFmb2xkRXhpc3RzKGZvbGRlZCwgZS52YWx1ZS5mcm9tLCBlLnZhbHVlLnRvKSkge1xuICAgICAgICAgICAgICAgIGxldCB7IHByZXBhcmVQbGFjZWhvbGRlciB9ID0gdHIuc3RhdGUuZmFjZXQoZm9sZENvbmZpZyk7XG4gICAgICAgICAgICAgICAgbGV0IHdpZGdldCA9ICFwcmVwYXJlUGxhY2Vob2xkZXIgPyBmb2xkV2lkZ2V0IDpcbiAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGlvbi5yZXBsYWNlKHsgd2lkZ2V0OiBuZXcgUHJlcGFyZWRGb2xkV2lkZ2V0KHByZXBhcmVQbGFjZWhvbGRlcih0ci5zdGF0ZSwgZS52YWx1ZSkpIH0pO1xuICAgICAgICAgICAgICAgIGZvbGRlZCA9IGZvbGRlZC51cGRhdGUoeyBhZGQ6IFt3aWRnZXQucmFuZ2UoZS52YWx1ZS5mcm9tLCBlLnZhbHVlLnRvKV0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlLmlzKHVuZm9sZEVmZmVjdCkpIHtcbiAgICAgICAgICAgICAgICBmb2xkZWQgPSBmb2xkZWQudXBkYXRlKHsgZmlsdGVyOiAoZnJvbSwgdG8pID0+IGUudmFsdWUuZnJvbSAhPSBmcm9tIHx8IGUudmFsdWUudG8gIT0gdG8sXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckZyb206IGUudmFsdWUuZnJvbSwgZmlsdGVyVG86IGUudmFsdWUudG8gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXIgZm9sZGVkIHJhbmdlcyB0aGF0IGNvdmVyIHRoZSBzZWxlY3Rpb24gaGVhZFxuICAgICAgICBpZiAodHIuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgb25TZWxlY3Rpb24gPSBmYWxzZSwgeyBoZWFkIH0gPSB0ci5zZWxlY3Rpb24ubWFpbjtcbiAgICAgICAgICAgIGZvbGRlZC5iZXR3ZWVuKGhlYWQsIGhlYWQsIChhLCBiKSA9PiB7IGlmIChhIDwgaGVhZCAmJiBiID4gaGVhZClcbiAgICAgICAgICAgICAgICBvblNlbGVjdGlvbiA9IHRydWU7IH0pO1xuICAgICAgICAgICAgaWYgKG9uU2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgIGZvbGRlZCA9IGZvbGRlZC51cGRhdGUoe1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGcm9tOiBoZWFkLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJUbzogaGVhZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiAoYSwgYikgPT4gYiA8PSBoZWFkIHx8IGEgPj0gaGVhZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb2xkZWQ7XG4gICAgfSxcbiAgICBwcm92aWRlOiBmID0+IEVkaXRvclZpZXcuZGVjb3JhdGlvbnMuZnJvbShmKSxcbiAgICB0b0pTT04oZm9sZGVkLCBzdGF0ZSkge1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgIGZvbGRlZC5iZXR3ZWVuKDAsIHN0YXRlLmRvYy5sZW5ndGgsIChmcm9tLCB0bykgPT4geyByYW5nZXMucHVzaChmcm9tLCB0byk7IH0pO1xuICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgIH0sXG4gICAgZnJvbUpTT04odmFsdWUpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggJSAyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIEpTT04gZm9yIGZvbGQgc3RhdGVcIik7XG4gICAgICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IHZhbHVlW2krK10sIHRvID0gdmFsdWVbaSsrXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiB0byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBKU09OIGZvciBmb2xkIHN0YXRlXCIpO1xuICAgICAgICAgICAgcmFuZ2VzLnB1c2goZm9sZFdpZGdldC5yYW5nZShmcm9tLCB0bykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChyYW5nZXMsIHRydWUpO1xuICAgIH1cbn0pO1xuLyoqXG5HZXQgYSBbcmFuZ2Ugc2V0XShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI3N0YXRlLlJhbmdlU2V0KSBjb250YWluaW5nIHRoZSBmb2xkZWQgcmFuZ2VzXG5pbiB0aGUgZ2l2ZW4gc3RhdGUuXG4qL1xuZnVuY3Rpb24gZm9sZGVkUmFuZ2VzKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpIHx8IFJhbmdlU2V0LmVtcHR5O1xufVxuZnVuY3Rpb24gZmluZEZvbGQoc3RhdGUsIGZyb20sIHRvKSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgKF9hID0gc3RhdGUuZmllbGQoZm9sZFN0YXRlLCBmYWxzZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5iZXR3ZWVuKGZyb20sIHRvLCAoZnJvbSwgdG8pID0+IHtcbiAgICAgICAgaWYgKCFmb3VuZCB8fCBmb3VuZC5mcm9tID4gZnJvbSlcbiAgICAgICAgICAgIGZvdW5kID0geyBmcm9tLCB0byB9O1xuICAgIH0pO1xuICAgIHJldHVybiBmb3VuZDtcbn1cbmZ1bmN0aW9uIGZvbGRFeGlzdHMoZm9sZGVkLCBmcm9tLCB0bykge1xuICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgIGZvbGRlZC5iZXR3ZWVuKGZyb20sIGZyb20sIChhLCBiKSA9PiB7IGlmIChhID09IGZyb20gJiYgYiA9PSB0bylcbiAgICAgICAgZm91bmQgPSB0cnVlOyB9KTtcbiAgICByZXR1cm4gZm91bmQ7XG59XG5mdW5jdGlvbiBtYXliZUVuYWJsZShzdGF0ZSwgb3RoZXIpIHtcbiAgICByZXR1cm4gc3RhdGUuZmllbGQoZm9sZFN0YXRlLCBmYWxzZSkgPyBvdGhlciA6IG90aGVyLmNvbmNhdChTdGF0ZUVmZmVjdC5hcHBlbmRDb25maWcub2YoY29kZUZvbGRpbmcoKSkpO1xufVxuLyoqXG5Gb2xkIHRoZSBsaW5lcyB0aGF0IGFyZSBzZWxlY3RlZCwgaWYgcG9zc2libGUuXG4qL1xuY29uc3QgZm9sZENvZGUgPSB2aWV3ID0+IHtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHNlbGVjdGVkTGluZXModmlldykpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZm9sZGFibGUodmlldy5zdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKTtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogbWF5YmVFbmFibGUodmlldy5zdGF0ZSwgW2ZvbGRFZmZlY3Qub2YocmFuZ2UpLCBhbm5vdW5jZUZvbGQodmlldywgcmFuZ2UpXSkgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG5VbmZvbGQgZm9sZGVkIHJhbmdlcyBvbiBzZWxlY3RlZCBsaW5lcy5cbiovXG5jb25zdCB1bmZvbGRDb2RlID0gdmlldyA9PiB7XG4gICAgaWYgKCF2aWV3LnN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHNlbGVjdGVkTGluZXModmlldykpIHtcbiAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkZWQpXG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCksIGFubm91bmNlRm9sZCh2aWV3LCBmb2xkZWQsIGZhbHNlKSk7XG4gICAgfVxuICAgIGlmIChlZmZlY3RzLmxlbmd0aClcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHMgfSk7XG4gICAgcmV0dXJuIGVmZmVjdHMubGVuZ3RoID4gMDtcbn07XG5mdW5jdGlvbiBhbm5vdW5jZUZvbGQodmlldywgcmFuZ2UsIGZvbGQgPSB0cnVlKSB7XG4gICAgbGV0IGxpbmVGcm9tID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHJhbmdlLmZyb20pLm51bWJlciwgbGluZVRvID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KHJhbmdlLnRvKS5udW1iZXI7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcuYW5ub3VuY2Uub2YoYCR7dmlldy5zdGF0ZS5waHJhc2UoZm9sZCA/IFwiRm9sZGVkIGxpbmVzXCIgOiBcIlVuZm9sZGVkIGxpbmVzXCIpfSAke2xpbmVGcm9tfSAke3ZpZXcuc3RhdGUucGhyYXNlKFwidG9cIil9ICR7bGluZVRvfS5gKTtcbn1cbi8qKlxuRm9sZCBhbGwgdG9wLWxldmVsIGZvbGRhYmxlIHJhbmdlcy4gTm90ZSB0aGF0LCBpbiBtb3N0IGNhc2VzLFxuZm9sZGluZyBpbmZvcm1hdGlvbiB3aWxsIGRlcGVuZCBvbiB0aGUgW3N5bnRheFxudHJlZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5zeW50YXhUcmVlKSwgYW5kIGZvbGRpbmcgZXZlcnl0aGluZyBtYXkgbm90IHdvcmtcbnJlbGlhYmx5IHdoZW4gdGhlIGRvY3VtZW50IGhhc24ndCBiZWVuIGZ1bGx5IHBhcnNlZCAoZWl0aGVyXG5iZWNhdXNlIHRoZSBlZGl0b3Igc3RhdGUgd2FzIG9ubHkganVzdCBpbml0aWFsaXplZCwgb3IgYmVjYXVzZSB0aGVcbmRvY3VtZW50IGlzIHNvIGJpZyB0aGF0IHRoZSBwYXJzZXIgZGVjaWRlZCBub3QgdG8gcGFyc2UgaXRcbmVudGlyZWx5KS5cbiovXG5jb25zdCBmb2xkQWxsID0gdmlldyA9PiB7XG4gICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBwb3MgPSAwOyBwb3MgPCBzdGF0ZS5kb2MubGVuZ3RoOykge1xuICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXQocG9zKSwgcmFuZ2UgPSBmb2xkYWJsZShzdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKTtcbiAgICAgICAgaWYgKHJhbmdlKVxuICAgICAgICAgICAgZWZmZWN0cy5wdXNoKGZvbGRFZmZlY3Qub2YocmFuZ2UpKTtcbiAgICAgICAgcG9zID0gKHJhbmdlID8gdmlldy5saW5lQmxvY2tBdChyYW5nZS50bykgOiBsaW5lKS50byArIDE7XG4gICAgfVxuICAgIGlmIChlZmZlY3RzLmxlbmd0aClcbiAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IG1heWJlRW5hYmxlKHZpZXcuc3RhdGUsIGVmZmVjdHMpIH0pO1xuICAgIHJldHVybiAhIWVmZmVjdHMubGVuZ3RoO1xufTtcbi8qKlxuVW5mb2xkIGFsbCBmb2xkZWQgY29kZS5cbiovXG5jb25zdCB1bmZvbGRBbGwgPSB2aWV3ID0+IHtcbiAgICBsZXQgZmllbGQgPSB2aWV3LnN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpO1xuICAgIGlmICghZmllbGQgfHwgIWZpZWxkLnNpemUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZWZmZWN0cyA9IFtdO1xuICAgIGZpZWxkLmJldHdlZW4oMCwgdmlldy5zdGF0ZS5kb2MubGVuZ3RoLCAoZnJvbSwgdG8pID0+IHsgZWZmZWN0cy5wdXNoKHVuZm9sZEVmZmVjdC5vZih7IGZyb20sIHRvIH0pKTsgfSk7XG4gICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHMgfSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLy8gRmluZCB0aGUgZm9sZGFibGUgcmVnaW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGxpbmUsIGlmIG9uZSBleGlzdHNcbmZ1bmN0aW9uIGZvbGRhYmxlQ29udGFpbmVyKHZpZXcsIGxpbmVCbG9jaykge1xuICAgIC8vIExvb2sgYmFja3dhcmRzIHRocm91Z2ggbGluZSBibG9ja3MgdW50aWwgd2UgZmluZCBhIGZvbGRhYmxlIHJlZ2lvbiB0aGF0XG4gICAgLy8gaW50ZXJzZWN0cyB3aXRoIHRoZSBsaW5lXG4gICAgZm9yIChsZXQgbGluZSA9IGxpbmVCbG9jazs7KSB7XG4gICAgICAgIGxldCBmb2xkYWJsZVJlZ2lvbiA9IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkYWJsZVJlZ2lvbiAmJiBmb2xkYWJsZVJlZ2lvbi50byA+IGxpbmVCbG9jay5mcm9tKVxuICAgICAgICAgICAgcmV0dXJuIGZvbGRhYmxlUmVnaW9uO1xuICAgICAgICBpZiAoIWxpbmUuZnJvbSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsaW5lID0gdmlldy5saW5lQmxvY2tBdChsaW5lLmZyb20gLSAxKTtcbiAgICB9XG59XG4vKipcblRvZ2dsZSBmb2xkaW5nIGF0IGN1cnNvcnMuIFVuZm9sZHMgaWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgZm9sZFxuc3RhcnRpbmcgaW4gdGhhdCBsaW5lLCB0cmllcyB0byBmaW5kIGEgZm9sZGFibGUgcmFuZ2UgYXJvdW5kIGl0XG5vdGhlcndpc2UuXG4qL1xuY29uc3QgdG9nZ2xlRm9sZCA9ICh2aWV3KSA9PiB7XG4gICAgbGV0IGVmZmVjdHMgPSBbXTtcbiAgICBmb3IgKGxldCBsaW5lIG9mIHNlbGVjdGVkTGluZXModmlldykpIHtcbiAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkZWQpIHtcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaCh1bmZvbGRFZmZlY3Qub2YoZm9sZGVkKSwgYW5ub3VuY2VGb2xkKHZpZXcsIGZvbGRlZCwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmb2xkUmFuZ2UgPSBmb2xkYWJsZUNvbnRhaW5lcih2aWV3LCBsaW5lKTtcbiAgICAgICAgICAgIGlmIChmb2xkUmFuZ2UpXG4gICAgICAgICAgICAgICAgZWZmZWN0cy5wdXNoKGZvbGRFZmZlY3Qub2YoZm9sZFJhbmdlKSwgYW5ub3VuY2VGb2xkKHZpZXcsIGZvbGRSYW5nZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlZmZlY3RzLmxlbmd0aCA+IDApXG4gICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBtYXliZUVuYWJsZSh2aWV3LnN0YXRlLCBlZmZlY3RzKSB9KTtcbiAgICByZXR1cm4gISFlZmZlY3RzLmxlbmd0aDtcbn07XG4vKipcbkRlZmF1bHQgZm9sZC1yZWxhdGVkIGtleSBiaW5kaW5ncy5cblxuIC0gQ3RybC1TaGlmdC1bIChDbWQtQWx0LVsgb24gbWFjT1MpOiBbYGZvbGRDb2RlYF0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5mb2xkQ29kZSkuXG4gLSBDdHJsLVNoaWZ0LV0gKENtZC1BbHQtXSBvbiBtYWNPUyk6IFtgdW5mb2xkQ29kZWBdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UudW5mb2xkQ29kZSkuXG4gLSBDdHJsLUFsdC1bOiBbYGZvbGRBbGxgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLmZvbGRBbGwpLlxuIC0gQ3RybC1BbHQtXTogW2B1bmZvbGRBbGxgXShodHRwczovL2NvZGVtaXJyb3IubmV0LzYvZG9jcy9yZWYvI2xhbmd1YWdlLnVuZm9sZEFsbCkuXG4qL1xuY29uc3QgZm9sZEtleW1hcCA9IFtcbiAgICB7IGtleTogXCJDdHJsLVNoaWZ0LVtcIiwgbWFjOiBcIkNtZC1BbHQtW1wiLCBydW46IGZvbGRDb2RlIH0sXG4gICAgeyBrZXk6IFwiQ3RybC1TaGlmdC1dXCIsIG1hYzogXCJDbWQtQWx0LV1cIiwgcnVuOiB1bmZvbGRDb2RlIH0sXG4gICAgeyBrZXk6IFwiQ3RybC1BbHQtW1wiLCBydW46IGZvbGRBbGwgfSxcbiAgICB7IGtleTogXCJDdHJsLUFsdC1dXCIsIHJ1bjogdW5mb2xkQWxsIH1cbl07XG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICAgIHBsYWNlaG9sZGVyRE9NOiBudWxsLFxuICAgIHByZXBhcmVQbGFjZWhvbGRlcjogbnVsbCxcbiAgICBwbGFjZWhvbGRlclRleHQ6IFwiXHUyMDI2XCJcbn07XG5jb25zdCBmb2xkQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZSh2YWx1ZXMpIHsgcmV0dXJuIGNvbWJpbmVDb25maWcodmFsdWVzLCBkZWZhdWx0Q29uZmlnKTsgfVxufSk7XG4vKipcbkNyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBjb25maWd1cmVzIGNvZGUgZm9sZGluZy5cbiovXG5mdW5jdGlvbiBjb2RlRm9sZGluZyhjb25maWcpIHtcbiAgICBsZXQgcmVzdWx0ID0gW2ZvbGRTdGF0ZSwgYmFzZVRoZW1lJDFdO1xuICAgIGlmIChjb25maWcpXG4gICAgICAgIHJlc3VsdC5wdXNoKGZvbGRDb25maWcub2YoY29uZmlnKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHdpZGdldFRvRE9NKHZpZXcsIHByZXBhcmVkKSB7XG4gICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsIGNvbmYgPSBzdGF0ZS5mYWNldChmb2xkQ29uZmlnKTtcbiAgICBsZXQgb25jbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICBsZXQgbGluZSA9IHZpZXcubGluZUJsb2NrQXQodmlldy5wb3NBdERPTShldmVudC50YXJnZXQpKTtcbiAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgIGlmIChmb2xkZWQpXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHsgZWZmZWN0czogdW5mb2xkRWZmZWN0Lm9mKGZvbGRlZCkgfSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcbiAgICBpZiAoY29uZi5wbGFjZWhvbGRlckRPTSlcbiAgICAgICAgcmV0dXJuIGNvbmYucGxhY2Vob2xkZXJET00odmlldywgb25jbGljaywgcHJlcGFyZWQpO1xuICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IGNvbmYucGxhY2Vob2xkZXJUZXh0O1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBzdGF0ZS5waHJhc2UoXCJmb2xkZWQgY29kZVwiKSk7XG4gICAgZWxlbWVudC50aXRsZSA9IHN0YXRlLnBocmFzZShcInVuZm9sZFwiKTtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IFwiY20tZm9sZFBsYWNlaG9sZGVyXCI7XG4gICAgZWxlbWVudC5vbmNsaWNrID0gb25jbGljaztcbiAgICByZXR1cm4gZWxlbWVudDtcbn1cbmNvbnN0IGZvbGRXaWRnZXQgPSAvKkBfX1BVUkVfXyovRGVjb3JhdGlvbi5yZXBsYWNlKHsgd2lkZ2V0OiAvKkBfX1BVUkVfXyovbmV3IGNsYXNzIGV4dGVuZHMgV2lkZ2V0VHlwZSB7XG4gICAgICAgIHRvRE9NKHZpZXcpIHsgcmV0dXJuIHdpZGdldFRvRE9NKHZpZXcsIG51bGwpOyB9XG4gICAgfSB9KTtcbmNsYXNzIFByZXBhcmVkRm9sZFdpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMudmFsdWUgPT0gb3RoZXIudmFsdWU7IH1cbiAgICB0b0RPTSh2aWV3KSB7IHJldHVybiB3aWRnZXRUb0RPTSh2aWV3LCB0aGlzLnZhbHVlKTsgfVxufVxuY29uc3QgZm9sZEd1dHRlckRlZmF1bHRzID0ge1xuICAgIG9wZW5UZXh0OiBcIlx1MjMwNFwiLFxuICAgIGNsb3NlZFRleHQ6IFwiXHUyMDNBXCIsXG4gICAgbWFya2VyRE9NOiBudWxsLFxuICAgIGRvbUV2ZW50SGFuZGxlcnM6IHt9LFxuICAgIGZvbGRpbmdDaGFuZ2VkOiAoKSA9PiBmYWxzZVxufTtcbmNsYXNzIEZvbGRNYXJrZXIgZXh0ZW5kcyBHdXR0ZXJNYXJrZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZywgb3Blbikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcbiAgICB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIHRoaXMuY29uZmlnID09IG90aGVyLmNvbmZpZyAmJiB0aGlzLm9wZW4gPT0gb3RoZXIub3BlbjsgfVxuICAgIHRvRE9NKHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm1hcmtlckRPTSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5tYXJrZXJET00odGhpcy5vcGVuKTtcbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHRoaXMub3BlbiA/IHRoaXMuY29uZmlnLm9wZW5UZXh0IDogdGhpcy5jb25maWcuY2xvc2VkVGV4dDtcbiAgICAgICAgc3Bhbi50aXRsZSA9IHZpZXcuc3RhdGUucGhyYXNlKHRoaXMub3BlbiA/IFwiRm9sZCBsaW5lXCIgOiBcIlVuZm9sZCBsaW5lXCIpO1xuICAgICAgICByZXR1cm4gc3BhbjtcbiAgICB9XG59XG4vKipcbkNyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCByZWdpc3RlcnMgYSBmb2xkIGd1dHRlciwgd2hpY2ggc2hvd3MgYVxuZm9sZCBzdGF0dXMgaW5kaWNhdG9yIGJlZm9yZSBmb2xkYWJsZSBsaW5lcyAod2hpY2ggY2FuIGJlIGNsaWNrZWRcbnRvIGZvbGQgb3IgdW5mb2xkIHRoZSBsaW5lKS5cbiovXG5mdW5jdGlvbiBmb2xkR3V0dGVyKGNvbmZpZyA9IHt9KSB7XG4gICAgbGV0IGZ1bGxDb25maWcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGZvbGRHdXR0ZXJEZWZhdWx0cyksIGNvbmZpZyk7XG4gICAgbGV0IGNhbkZvbGQgPSBuZXcgRm9sZE1hcmtlcihmdWxsQ29uZmlnLCB0cnVlKSwgY2FuVW5mb2xkID0gbmV3IEZvbGRNYXJrZXIoZnVsbENvbmZpZywgZmFsc2UpO1xuICAgIGxldCBtYXJrZXJzID0gVmlld1BsdWdpbi5mcm9tQ2xhc3MoY2xhc3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgICAgICB0aGlzLmZyb20gPSB2aWV3LnZpZXdwb3J0LmZyb207XG4gICAgICAgICAgICB0aGlzLm1hcmtlcnMgPSB0aGlzLmJ1aWxkTWFya2Vycyh2aWV3KTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCB8fFxuICAgICAgICAgICAgICAgIHVwZGF0ZS5zdGFydFN0YXRlLmZhY2V0KGxhbmd1YWdlKSAhPSB1cGRhdGUuc3RhdGUuZmFjZXQobGFuZ3VhZ2UpIHx8XG4gICAgICAgICAgICAgICAgdXBkYXRlLnN0YXJ0U3RhdGUuZmllbGQoZm9sZFN0YXRlLCBmYWxzZSkgIT0gdXBkYXRlLnN0YXRlLmZpZWxkKGZvbGRTdGF0ZSwgZmFsc2UpIHx8XG4gICAgICAgICAgICAgICAgc3ludGF4VHJlZSh1cGRhdGUuc3RhcnRTdGF0ZSkgIT0gc3ludGF4VHJlZSh1cGRhdGUuc3RhdGUpIHx8XG4gICAgICAgICAgICAgICAgZnVsbENvbmZpZy5mb2xkaW5nQ2hhbmdlZCh1cGRhdGUpKVxuICAgICAgICAgICAgICAgIHRoaXMubWFya2VycyA9IHRoaXMuYnVpbGRNYXJrZXJzKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgfVxuICAgICAgICBidWlsZE1hcmtlcnModmlldykge1xuICAgICAgICAgICAgbGV0IGJ1aWxkZXIgPSBuZXcgUmFuZ2VTZXRCdWlsZGVyKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBsaW5lIG9mIHZpZXcudmlld3BvcnRMaW5lQmxvY2tzKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmsgPSBmaW5kRm9sZCh2aWV3LnN0YXRlLCBsaW5lLmZyb20sIGxpbmUudG8pID8gY2FuVW5mb2xkXG4gICAgICAgICAgICAgICAgICAgIDogZm9sZGFibGUodmlldy5zdGF0ZSwgbGluZS5mcm9tLCBsaW5lLnRvKSA/IGNhbkZvbGQgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChtYXJrKVxuICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChsaW5lLmZyb20sIGxpbmUuZnJvbSwgbWFyayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGxldCB7IGRvbUV2ZW50SGFuZGxlcnMgfSA9IGZ1bGxDb25maWc7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgbWFya2VycyxcbiAgICAgICAgZ3V0dGVyKHtcbiAgICAgICAgICAgIGNsYXNzOiBcImNtLWZvbGRHdXR0ZXJcIixcbiAgICAgICAgICAgIG1hcmtlcnModmlldykgeyB2YXIgX2E7IHJldHVybiAoKF9hID0gdmlldy5wbHVnaW4obWFya2VycykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXJrZXJzKSB8fCBSYW5nZVNldC5lbXB0eTsgfSxcbiAgICAgICAgICAgIGluaXRpYWxTcGFjZXIoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb2xkTWFya2VyKGZ1bGxDb25maWcsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkb21FdmVudEhhbmRsZXJzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRvbUV2ZW50SGFuZGxlcnMpLCB7IGNsaWNrOiAodmlldywgbGluZSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbUV2ZW50SGFuZGxlcnMuY2xpY2sgJiYgZG9tRXZlbnRIYW5kbGVycy5jbGljayh2aWV3LCBsaW5lLCBldmVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvbGRlZCA9IGZpbmRGb2xkKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2xkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiB1bmZvbGRFZmZlY3Qub2YoZm9sZGVkKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IGZvbGRhYmxlKHZpZXcuc3RhdGUsIGxpbmUuZnJvbSwgbGluZS50byk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7IGVmZmVjdHM6IGZvbGRFZmZlY3Qub2YocmFuZ2UpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gfSlcbiAgICAgICAgfSksXG4gICAgICAgIGNvZGVGb2xkaW5nKClcbiAgICBdO1xufVxuY29uc3QgYmFzZVRoZW1lJDEgPSAvKkBfX1BVUkVfXyovRWRpdG9yVmlldy5iYXNlVGhlbWUoe1xuICAgIFwiLmNtLWZvbGRQbGFjZWhvbGRlclwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZWVlXCIsXG4gICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgI2RkZFwiLFxuICAgICAgICBjb2xvcjogXCIjODg4XCIsXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIuMmVtXCIsXG4gICAgICAgIG1hcmdpbjogXCIwIDFweFwiLFxuICAgICAgICBwYWRkaW5nOiBcIjAgMXB4XCIsXG4gICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgICB9LFxuICAgIFwiLmNtLWZvbGRHdXR0ZXIgc3BhblwiOiB7XG4gICAgICAgIHBhZGRpbmc6IFwiMCAxcHhcIixcbiAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxuICAgIH1cbn0pO1xuXG4vKipcbkEgaGlnaGxpZ2h0IHN0eWxlIGFzc29jaWF0ZXMgQ1NTIHN0eWxlcyB3aXRoIGhpZ2xpZ2h0aW5nXG5bdGFnc10oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZiNoaWdobGlnaHQuVGFnKS5cbiovXG5jbGFzcyBIaWdobGlnaHRTdHlsZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHRhZyBzdHlsZXMgdXNlZCB0byBjcmVhdGUgdGhpcyBoaWdobGlnaHQgc3R5bGUuXG4gICAgKi9cbiAgICBzcGVjcywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnNwZWNzID0gc3BlY3M7XG4gICAgICAgIGxldCBtb2RTcGVjO1xuICAgICAgICBmdW5jdGlvbiBkZWYoc3BlYykge1xuICAgICAgICAgICAgbGV0IGNscyA9IFN0eWxlTW9kdWxlLm5ld05hbWUoKTtcbiAgICAgICAgICAgIChtb2RTcGVjIHx8IChtb2RTcGVjID0gT2JqZWN0LmNyZWF0ZShudWxsKSkpW1wiLlwiICsgY2xzXSA9IHNwZWM7XG4gICAgICAgICAgICByZXR1cm4gY2xzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFsbCA9IHR5cGVvZiBvcHRpb25zLmFsbCA9PSBcInN0cmluZ1wiID8gb3B0aW9ucy5hbGwgOiBvcHRpb25zLmFsbCA/IGRlZihvcHRpb25zLmFsbCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHNjb3BlT3B0ID0gb3B0aW9ucy5zY29wZTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlT3B0IGluc3RhbmNlb2YgTGFuZ3VhZ2UgPyAodHlwZSkgPT4gdHlwZS5wcm9wKGxhbmd1YWdlRGF0YVByb3ApID09IHNjb3BlT3B0LmRhdGFcbiAgICAgICAgICAgIDogc2NvcGVPcHQgPyAodHlwZSkgPT4gdHlwZSA9PSBzY29wZU9wdCA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zdHlsZSA9IHRhZ0hpZ2hsaWdodGVyKHNwZWNzLm1hcChzdHlsZSA9PiAoe1xuICAgICAgICAgICAgdGFnOiBzdHlsZS50YWcsXG4gICAgICAgICAgICBjbGFzczogc3R5bGUuY2xhc3MgfHwgZGVmKE9iamVjdC5hc3NpZ24oe30sIHN0eWxlLCB7IHRhZzogbnVsbCB9KSlcbiAgICAgICAgfSkpLCB7XG4gICAgICAgICAgICBhbGwsXG4gICAgICAgIH0pLnN0eWxlO1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZFNwZWMgPyBuZXcgU3R5bGVNb2R1bGUobW9kU3BlYykgOiBudWxsO1xuICAgICAgICB0aGlzLnRoZW1lVHlwZSA9IG9wdGlvbnMudGhlbWVUeXBlO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBoaWdobGlnaHRlciBzdHlsZSB0aGF0IGFzc29jaWF0ZXMgdGhlIGdpdmVuIHN0eWxlcyB0b1xuICAgIHRoZSBnaXZlbiB0YWdzLiBUaGUgc3BlY3MgbXVzdCBiZSBvYmplY3RzIHRoYXQgaG9sZCBhIHN0eWxlIHRhZ1xuICAgIG9yIGFycmF5IG9mIHRhZ3MgaW4gdGhlaXIgYHRhZ2AgcHJvcGVydHksIGFuZCBlaXRoZXIgYSBzaW5nbGVcbiAgICBgY2xhc3NgIHByb3BlcnR5IHByb3ZpZGluZyBhIHN0YXRpYyBDU1MgY2xhc3MgKGZvciBoaWdobGlnaHRlclxuICAgIHRoYXQgcmVseSBvbiBleHRlcm5hbCBzdHlsaW5nKSwgb3IgYVxuICAgIFtgc3R5bGUtbW9kYF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvc3R5bGUtbW9kI2RvY3VtZW50YXRpb24pLXN0eWxlXG4gICAgc2V0IG9mIENTUyBwcm9wZXJ0aWVzICh3aGljaCBkZWZpbmUgdGhlIHN0eWxpbmcgZm9yIHRob3NlIHRhZ3MpLlxuICAgIFxuICAgIFRoZSBDU1MgcnVsZXMgY3JlYXRlZCBmb3IgYSBoaWdobGlnaHRlciB3aWxsIGJlIGVtaXR0ZWQgaW4gdGhlXG4gICAgb3JkZXIgb2YgdGhlIHNwZWMncyBwcm9wZXJ0aWVzLiBUaGF0IG1lYW5zIHRoYXQgZm9yIGVsZW1lbnRzIHRoYXRcbiAgICBoYXZlIG11bHRpcGxlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZW0sIHN0eWxlcyBkZWZpbmVkIGZ1cnRoZXJcbiAgICBkb3duIGluIHRoZSBsaXN0IHdpbGwgaGF2ZSBhIGhpZ2hlciBDU1MgcHJlY2VkZW5jZSB0aGFuIHN0eWxlc1xuICAgIGRlZmluZWQgZWFybGllci5cbiAgICAqL1xuICAgIHN0YXRpYyBkZWZpbmUoc3BlY3MsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIaWdobGlnaHRTdHlsZShzcGVjcywgb3B0aW9ucyB8fCB7fSk7XG4gICAgfVxufVxuY29uc3QgaGlnaGxpZ2h0ZXJGYWNldCA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoKTtcbmNvbnN0IGZhbGxiYWNrSGlnaGxpZ2h0ZXIgPSAvKkBfX1BVUkVfXyovRmFjZXQuZGVmaW5lKHtcbiAgICBjb21iaW5lKHZhbHVlcykgeyByZXR1cm4gdmFsdWVzLmxlbmd0aCA/IFt2YWx1ZXNbMF1dIDogbnVsbDsgfVxufSk7XG5mdW5jdGlvbiBnZXRIaWdobGlnaHRlcnMoc3RhdGUpIHtcbiAgICBsZXQgbWFpbiA9IHN0YXRlLmZhY2V0KGhpZ2hsaWdodGVyRmFjZXQpO1xuICAgIHJldHVybiBtYWluLmxlbmd0aCA/IG1haW4gOiBzdGF0ZS5mYWNldChmYWxsYmFja0hpZ2hsaWdodGVyKTtcbn1cbi8qKlxuV3JhcCBhIGhpZ2hsaWdodGVyIGluIGFuIGVkaXRvciBleHRlbnNpb24gdGhhdCB1c2VzIGl0IHRvIGFwcGx5XG5zeW50YXggaGlnaGxpZ2h0aW5nIHRvIHRoZSBlZGl0b3IgY29udGVudC5cblxuV2hlbiBtdWx0aXBsZSAobm9uLWZhbGxiYWNrKSBzdHlsZXMgYXJlIHByb3ZpZGVkLCB0aGUgc3R5bGluZ1xuYXBwbGllZCBpcyB0aGUgdW5pb24gb2YgdGhlIGNsYXNzZXMgdGhleSBlbWl0LlxuKi9cbmZ1bmN0aW9uIHN5bnRheEhpZ2hsaWdodGluZyhoaWdobGlnaHRlciwgb3B0aW9ucykge1xuICAgIGxldCBleHQgPSBbdHJlZUhpZ2hsaWdodGVyXSwgdGhlbWVUeXBlO1xuICAgIGlmIChoaWdobGlnaHRlciBpbnN0YW5jZW9mIEhpZ2hsaWdodFN0eWxlKSB7XG4gICAgICAgIGlmIChoaWdobGlnaHRlci5tb2R1bGUpXG4gICAgICAgICAgICBleHQucHVzaChFZGl0b3JWaWV3LnN0eWxlTW9kdWxlLm9mKGhpZ2hsaWdodGVyLm1vZHVsZSkpO1xuICAgICAgICB0aGVtZVR5cGUgPSBoaWdobGlnaHRlci50aGVtZVR5cGU7XG4gICAgfVxuICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmFsbGJhY2spXG4gICAgICAgIGV4dC5wdXNoKGZhbGxiYWNrSGlnaGxpZ2h0ZXIub2YoaGlnaGxpZ2h0ZXIpKTtcbiAgICBlbHNlIGlmICh0aGVtZVR5cGUpXG4gICAgICAgIGV4dC5wdXNoKGhpZ2hsaWdodGVyRmFjZXQuY29tcHV0ZU4oW0VkaXRvclZpZXcuZGFya1RoZW1lXSwgc3RhdGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmZhY2V0KEVkaXRvclZpZXcuZGFya1RoZW1lKSA9PSAodGhlbWVUeXBlID09IFwiZGFya1wiKSA/IFtoaWdobGlnaHRlcl0gOiBbXTtcbiAgICAgICAgfSkpO1xuICAgIGVsc2VcbiAgICAgICAgZXh0LnB1c2goaGlnaGxpZ2h0ZXJGYWNldC5vZihoaWdobGlnaHRlcikpO1xuICAgIHJldHVybiBleHQ7XG59XG4vKipcblJldHVybnMgdGhlIENTUyBjbGFzc2VzIChpZiBhbnkpIHRoYXQgdGhlIGhpZ2hsaWdodGVycyBhY3RpdmUgaW5cbnRoZSBzdGF0ZSB3b3VsZCBhc3NpZ24gdG8gdGhlIGdpdmVuIHN0eWxlXG5bdGFnc10oaHR0cHM6Ly9sZXplci5jb2RlbWlycm9yLm5ldC9kb2NzL3JlZiNoaWdobGlnaHQuVGFnKSBhbmRcbihvcHRpb25hbCkgbGFuZ3VhZ2VcbltzY29wZV0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5IaWdobGlnaHRTdHlsZV5kZWZpbmVeb3B0aW9ucy5zY29wZSkuXG4qL1xuZnVuY3Rpb24gaGlnaGxpZ2h0aW5nRm9yKHN0YXRlLCB0YWdzLCBzY29wZSkge1xuICAgIGxldCBoaWdobGlnaHRlcnMgPSBnZXRIaWdobGlnaHRlcnMoc3RhdGUpO1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGlmIChoaWdobGlnaHRlcnMpXG4gICAgICAgIGZvciAobGV0IGhpZ2hsaWdodGVyIG9mIGhpZ2hsaWdodGVycykge1xuICAgICAgICAgICAgaWYgKCFoaWdobGlnaHRlci5zY29wZSB8fCBzY29wZSAmJiBoaWdobGlnaHRlci5zY29wZShzY29wZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2xzID0gaGlnaGxpZ2h0ZXIuc3R5bGUodGFncyk7XG4gICAgICAgICAgICAgICAgaWYgKGNscylcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID8gcmVzdWx0ICsgXCIgXCIgKyBjbHMgOiBjbHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY2xhc3MgVHJlZUhpZ2hsaWdodGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMubWFya0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy50cmVlID0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvKHZpZXcsIGdldEhpZ2hsaWdodGVycyh2aWV3LnN0YXRlKSk7XG4gICAgfVxuICAgIHVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKHVwZGF0ZS5zdGF0ZSksIGhpZ2hsaWdodGVycyA9IGdldEhpZ2hsaWdodGVycyh1cGRhdGUuc3RhdGUpO1xuICAgICAgICBsZXQgc3R5bGVDaGFuZ2UgPSBoaWdobGlnaHRlcnMgIT0gZ2V0SGlnaGxpZ2h0ZXJzKHVwZGF0ZS5zdGFydFN0YXRlKTtcbiAgICAgICAgaWYgKHRyZWUubGVuZ3RoIDwgdXBkYXRlLnZpZXcudmlld3BvcnQudG8gJiYgIXN0eWxlQ2hhbmdlICYmIHRyZWUudHlwZSA9PSB0aGlzLnRyZWUudHlwZSkge1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuZGVjb3JhdGlvbnMubWFwKHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0cmVlICE9IHRoaXMudHJlZSB8fCB1cGRhdGUudmlld3BvcnRDaGFuZ2VkIHx8IHN0eWxlQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWUgPSB0cmVlO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvKHVwZGF0ZS52aWV3LCBoaWdobGlnaHRlcnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJ1aWxkRGVjbyh2aWV3LCBoaWdobGlnaHRlcnMpIHtcbiAgICAgICAgaWYgKCFoaWdobGlnaHRlcnMgfHwgIXRoaXMudHJlZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5ub25lO1xuICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXIoKTtcbiAgICAgICAgZm9yIChsZXQgeyBmcm9tLCB0byB9IG9mIHZpZXcudmlzaWJsZVJhbmdlcykge1xuICAgICAgICAgICAgaGlnaGxpZ2h0VHJlZSh0aGlzLnRyZWUsIGhpZ2hsaWdodGVycywgKGZyb20sIHRvLCBzdHlsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKGZyb20sIHRvLCB0aGlzLm1hcmtDYWNoZVtzdHlsZV0gfHwgKHRoaXMubWFya0NhY2hlW3N0eWxlXSA9IERlY29yYXRpb24ubWFyayh7IGNsYXNzOiBzdHlsZSB9KSkpO1xuICAgICAgICAgICAgfSwgZnJvbSwgdG8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmZpbmlzaCgpO1xuICAgIH1cbn1cbmNvbnN0IHRyZWVIaWdobGlnaHRlciA9IC8qQF9fUFVSRV9fKi9QcmVjLmhpZ2goLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKFRyZWVIaWdobGlnaHRlciwge1xuICAgIGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnNcbn0pKTtcbi8qKlxuQSBkZWZhdWx0IGhpZ2hsaWdodCBzdHlsZSAod29ya3Mgd2VsbCB3aXRoIGxpZ2h0IHRoZW1lcykuXG4qL1xuY29uc3QgZGVmYXVsdEhpZ2hsaWdodFN0eWxlID0gLypAX19QVVJFX18qL0hpZ2hsaWdodFN0eWxlLmRlZmluZShbXG4gICAgeyB0YWc6IHRhZ3MubWV0YSxcbiAgICAgICAgY29sb3I6IFwiIzQwNDc0MFwiIH0sXG4gICAgeyB0YWc6IHRhZ3MubGluayxcbiAgICAgICAgdGV4dERlY29yYXRpb246IFwidW5kZXJsaW5lXCIgfSxcbiAgICB7IHRhZzogdGFncy5oZWFkaW5nLFxuICAgICAgICB0ZXh0RGVjb3JhdGlvbjogXCJ1bmRlcmxpbmVcIixcbiAgICAgICAgZm9udFdlaWdodDogXCJib2xkXCIgfSxcbiAgICB7IHRhZzogdGFncy5lbXBoYXNpcyxcbiAgICAgICAgZm9udFN0eWxlOiBcIml0YWxpY1wiIH0sXG4gICAgeyB0YWc6IHRhZ3Muc3Ryb25nLFxuICAgICAgICBmb250V2VpZ2h0OiBcImJvbGRcIiB9LFxuICAgIHsgdGFnOiB0YWdzLnN0cmlrZXRocm91Z2gsXG4gICAgICAgIHRleHREZWNvcmF0aW9uOiBcImxpbmUtdGhyb3VnaFwiIH0sXG4gICAgeyB0YWc6IHRhZ3Mua2V5d29yZCxcbiAgICAgICAgY29sb3I6IFwiIzcwOFwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLmF0b20sIHRhZ3MuYm9vbCwgdGFncy51cmwsIHRhZ3MuY29udGVudFNlcGFyYXRvciwgdGFncy5sYWJlbE5hbWVdLFxuICAgICAgICBjb2xvcjogXCIjMjE5XCIgfSxcbiAgICB7IHRhZzogW3RhZ3MubGl0ZXJhbCwgdGFncy5pbnNlcnRlZF0sXG4gICAgICAgIGNvbG9yOiBcIiMxNjRcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5zdHJpbmcsIHRhZ3MuZGVsZXRlZF0sXG4gICAgICAgIGNvbG9yOiBcIiNhMTFcIiB9LFxuICAgIHsgdGFnOiBbdGFncy5yZWdleHAsIHRhZ3MuZXNjYXBlLCAvKkBfX1BVUkVfXyovdGFncy5zcGVjaWFsKHRhZ3Muc3RyaW5nKV0sXG4gICAgICAgIGNvbG9yOiBcIiNlNDBcIiB9LFxuICAgIHsgdGFnOiAvKkBfX1BVUkVfXyovdGFncy5kZWZpbml0aW9uKHRhZ3MudmFyaWFibGVOYW1lKSxcbiAgICAgICAgY29sb3I6IFwiIzAwZlwiIH0sXG4gICAgeyB0YWc6IC8qQF9fUFVSRV9fKi90YWdzLmxvY2FsKHRhZ3MudmFyaWFibGVOYW1lKSxcbiAgICAgICAgY29sb3I6IFwiIzMwYVwiIH0sXG4gICAgeyB0YWc6IFt0YWdzLnR5cGVOYW1lLCB0YWdzLm5hbWVzcGFjZV0sXG4gICAgICAgIGNvbG9yOiBcIiMwODVcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmNsYXNzTmFtZSxcbiAgICAgICAgY29sb3I6IFwiIzE2N1wiIH0sXG4gICAgeyB0YWc6IFsvKkBfX1BVUkVfXyovdGFncy5zcGVjaWFsKHRhZ3MudmFyaWFibGVOYW1lKSwgdGFncy5tYWNyb05hbWVdLFxuICAgICAgICBjb2xvcjogXCIjMjU2XCIgfSxcbiAgICB7IHRhZzogLypAX19QVVJFX18qL3RhZ3MuZGVmaW5pdGlvbih0YWdzLnByb3BlcnR5TmFtZSksXG4gICAgICAgIGNvbG9yOiBcIiMwMGNcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmNvbW1lbnQsXG4gICAgICAgIGNvbG9yOiBcIiM5NDBcIiB9LFxuICAgIHsgdGFnOiB0YWdzLmludmFsaWQsXG4gICAgICAgIGNvbG9yOiBcIiNmMDBcIiB9XG5dKTtcblxuY29uc3QgYmFzZVRoZW1lID0gLypAX19QVVJFX18qL0VkaXRvclZpZXcuYmFzZVRoZW1lKHtcbiAgICBcIiYuY20tZm9jdXNlZCAuY20tbWF0Y2hpbmdCcmFja2V0XCI6IHsgYmFja2dyb3VuZENvbG9yOiBcIiMzMjhjODI1MlwiIH0sXG4gICAgXCImLmNtLWZvY3VzZWQgLmNtLW5vbm1hdGNoaW5nQnJhY2tldFwiOiB7IGJhY2tncm91bmRDb2xvcjogXCIjYmI1NTU1NDRcIiB9XG59KTtcbmNvbnN0IERlZmF1bHRTY2FuRGlzdCA9IDEwMDAwLCBEZWZhdWx0QnJhY2tldHMgPSBcIigpW117fVwiO1xuY29uc3QgYnJhY2tldE1hdGNoaW5nQ29uZmlnID0gLypAX19QVVJFX18qL0ZhY2V0LmRlZmluZSh7XG4gICAgY29tYmluZShjb25maWdzKSB7XG4gICAgICAgIHJldHVybiBjb21iaW5lQ29uZmlnKGNvbmZpZ3MsIHtcbiAgICAgICAgICAgIGFmdGVyQ3Vyc29yOiB0cnVlLFxuICAgICAgICAgICAgYnJhY2tldHM6IERlZmF1bHRCcmFja2V0cyxcbiAgICAgICAgICAgIG1heFNjYW5EaXN0YW5jZTogRGVmYXVsdFNjYW5EaXN0LFxuICAgICAgICAgICAgcmVuZGVyTWF0Y2g6IGRlZmF1bHRSZW5kZXJNYXRjaFxuICAgICAgICB9KTtcbiAgICB9XG59KTtcbmNvbnN0IG1hdGNoaW5nTWFyayA9IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1tYXRjaGluZ0JyYWNrZXRcIiB9KSwgbm9ubWF0Y2hpbmdNYXJrID0gLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLW5vbm1hdGNoaW5nQnJhY2tldFwiIH0pO1xuZnVuY3Rpb24gZGVmYXVsdFJlbmRlck1hdGNoKG1hdGNoKSB7XG4gICAgbGV0IGRlY29yYXRpb25zID0gW107XG4gICAgbGV0IG1hcmsgPSBtYXRjaC5tYXRjaGVkID8gbWF0Y2hpbmdNYXJrIDogbm9ubWF0Y2hpbmdNYXJrO1xuICAgIGRlY29yYXRpb25zLnB1c2gobWFyay5yYW5nZShtYXRjaC5zdGFydC5mcm9tLCBtYXRjaC5zdGFydC50bykpO1xuICAgIGlmIChtYXRjaC5lbmQpXG4gICAgICAgIGRlY29yYXRpb25zLnB1c2gobWFyay5yYW5nZShtYXRjaC5lbmQuZnJvbSwgbWF0Y2guZW5kLnRvKSk7XG4gICAgcmV0dXJuIGRlY29yYXRpb25zO1xufVxuY29uc3QgYnJhY2tldE1hdGNoaW5nU3RhdGUgPSAvKkBfX1BVUkVfXyovU3RhdGVGaWVsZC5kZWZpbmUoe1xuICAgIGNyZWF0ZSgpIHsgcmV0dXJuIERlY29yYXRpb24ubm9uZTsgfSxcbiAgICB1cGRhdGUoZGVjbywgdHIpIHtcbiAgICAgICAgaWYgKCF0ci5kb2NDaGFuZ2VkICYmICF0ci5zZWxlY3Rpb24pXG4gICAgICAgICAgICByZXR1cm4gZGVjbztcbiAgICAgICAgbGV0IGRlY29yYXRpb25zID0gW107XG4gICAgICAgIGxldCBjb25maWcgPSB0ci5zdGF0ZS5mYWNldChicmFja2V0TWF0Y2hpbmdDb25maWcpO1xuICAgICAgICBmb3IgKGxldCByYW5nZSBvZiB0ci5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoIXJhbmdlLmVtcHR5KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IG1hdGNoID0gbWF0Y2hCcmFja2V0cyh0ci5zdGF0ZSwgcmFuZ2UuaGVhZCwgLTEsIGNvbmZpZylcbiAgICAgICAgICAgICAgICB8fCAocmFuZ2UuaGVhZCA+IDAgJiYgbWF0Y2hCcmFja2V0cyh0ci5zdGF0ZSwgcmFuZ2UuaGVhZCAtIDEsIDEsIGNvbmZpZykpXG4gICAgICAgICAgICAgICAgfHwgKGNvbmZpZy5hZnRlckN1cnNvciAmJlxuICAgICAgICAgICAgICAgICAgICAobWF0Y2hCcmFja2V0cyh0ci5zdGF0ZSwgcmFuZ2UuaGVhZCwgMSwgY29uZmlnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJhbmdlLmhlYWQgPCB0ci5zdGF0ZS5kb2MubGVuZ3RoICYmIG1hdGNoQnJhY2tldHModHIuc3RhdGUsIHJhbmdlLmhlYWQgKyAxLCAtMSwgY29uZmlnKSkpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgICAgICBkZWNvcmF0aW9ucyA9IGRlY29yYXRpb25zLmNvbmNhdChjb25maWcucmVuZGVyTWF0Y2gobWF0Y2gsIHRyLnN0YXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERlY29yYXRpb24uc2V0KGRlY29yYXRpb25zLCB0cnVlKTtcbiAgICB9LFxuICAgIHByb3ZpZGU6IGYgPT4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGYpXG59KTtcbmNvbnN0IGJyYWNrZXRNYXRjaGluZ1VuaXF1ZSA9IFtcbiAgICBicmFja2V0TWF0Y2hpbmdTdGF0ZSxcbiAgICBiYXNlVGhlbWVcbl07XG4vKipcbkNyZWF0ZSBhbiBleHRlbnNpb24gdGhhdCBlbmFibGVzIGJyYWNrZXQgbWF0Y2hpbmcuIFdoZW5ldmVyIHRoZVxuY3Vyc29yIGlzIG5leHQgdG8gYSBicmFja2V0LCB0aGF0IGJyYWNrZXQgYW5kIHRoZSBvbmUgaXQgbWF0Y2hlc1xuYXJlIGhpZ2hsaWdodGVkLiBPciwgd2hlbiBubyBtYXRjaGluZyBicmFja2V0IGlzIGZvdW5kLCBhbm90aGVyXG5oaWdobGlnaHRpbmcgc3R5bGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGlzLlxuKi9cbmZ1bmN0aW9uIGJyYWNrZXRNYXRjaGluZyhjb25maWcgPSB7fSkge1xuICAgIHJldHVybiBbYnJhY2tldE1hdGNoaW5nQ29uZmlnLm9mKGNvbmZpZyksIGJyYWNrZXRNYXRjaGluZ1VuaXF1ZV07XG59XG4vKipcbldoZW4gbGFyZ2VyIHN5bnRheCBub2Rlcywgc3VjaCBhcyBIVE1MIHRhZ3MsIGFyZSBtYXJrZWQgYXNcbm9wZW5pbmcvY2xvc2luZywgaXQgY2FuIGJlIGEgYml0IG1lc3N5IHRvIHRyZWF0IHRoZSB3aG9sZSBub2RlIGFzXG5hIG1hdGNoYWJsZSBicmFja2V0LiBUaGlzIG5vZGUgcHJvcCBhbGxvd3MgeW91IHRvIGRlZmluZSwgZm9yIHN1Y2hcbmEgbm9kZSwgYSBcdTIwMThoYW5kbGVcdTIwMTlcdTIwMTR0aGUgcGFydCBvZiB0aGUgbm9kZSB0aGF0IGlzIGhpZ2hsaWdodGVkLCBhbmRcbnRoYXQgdGhlIGN1cnNvciBtdXN0IGJlIG9uIHRvIGFjdGl2YXRlIGhpZ2hsaWdodGluZyBpbiB0aGUgZmlyc3RcbnBsYWNlLlxuKi9cbmNvbnN0IGJyYWNrZXRNYXRjaGluZ0hhbmRsZSA9IC8qQF9fUFVSRV9fKi9uZXcgTm9kZVByb3AoKTtcbmZ1bmN0aW9uIG1hdGNoaW5nTm9kZXMobm9kZSwgZGlyLCBicmFja2V0cykge1xuICAgIGxldCBieVByb3AgPSBub2RlLnByb3AoZGlyIDwgMCA/IE5vZGVQcm9wLm9wZW5lZEJ5IDogTm9kZVByb3AuY2xvc2VkQnkpO1xuICAgIGlmIChieVByb3ApXG4gICAgICAgIHJldHVybiBieVByb3A7XG4gICAgaWYgKG5vZGUubmFtZS5sZW5ndGggPT0gMSkge1xuICAgICAgICBsZXQgaW5kZXggPSBicmFja2V0cy5pbmRleE9mKG5vZGUubmFtZSk7XG4gICAgICAgIGlmIChpbmRleCA+IC0xICYmIGluZGV4ICUgMiA9PSAoZGlyIDwgMCA/IDEgOiAwKSlcbiAgICAgICAgICAgIHJldHVybiBbYnJhY2tldHNbaW5kZXggKyBkaXJdXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBmaW5kSGFuZGxlKG5vZGUpIHtcbiAgICBsZXQgaGFzSGFuZGxlID0gbm9kZS50eXBlLnByb3AoYnJhY2tldE1hdGNoaW5nSGFuZGxlKTtcbiAgICByZXR1cm4gaGFzSGFuZGxlID8gaGFzSGFuZGxlKG5vZGUubm9kZSkgOiBub2RlO1xufVxuLyoqXG5GaW5kIHRoZSBtYXRjaGluZyBicmFja2V0IGZvciB0aGUgdG9rZW4gYXQgYHBvc2AsIHNjYW5uaW5nXG5kaXJlY3Rpb24gYGRpcmAuIE9ubHkgdGhlIGBicmFja2V0c2AgYW5kIGBtYXhTY2FuRGlzdGFuY2VgXG5wcm9wZXJ0aWVzIGFyZSB1c2VkIGZyb20gYGNvbmZpZ2AsIGlmIGdpdmVuLiBSZXR1cm5zIG51bGwgaWYgbm9cbmJyYWNrZXQgd2FzIGZvdW5kIGF0IGBwb3NgLCBvciBhIG1hdGNoIHJlc3VsdCBvdGhlcndpc2UuXG4qL1xuZnVuY3Rpb24gbWF0Y2hCcmFja2V0cyhzdGF0ZSwgcG9zLCBkaXIsIGNvbmZpZyA9IHt9KSB7XG4gICAgbGV0IG1heFNjYW5EaXN0YW5jZSA9IGNvbmZpZy5tYXhTY2FuRGlzdGFuY2UgfHwgRGVmYXVsdFNjYW5EaXN0LCBicmFja2V0cyA9IGNvbmZpZy5icmFja2V0cyB8fCBEZWZhdWx0QnJhY2tldHM7XG4gICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKHN0YXRlKSwgbm9kZSA9IHRyZWUucmVzb2x2ZUlubmVyKHBvcywgZGlyKTtcbiAgICBmb3IgKGxldCBjdXIgPSBub2RlOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnQpIHtcbiAgICAgICAgbGV0IG1hdGNoZXMgPSBtYXRjaGluZ05vZGVzKGN1ci50eXBlLCBkaXIsIGJyYWNrZXRzKTtcbiAgICAgICAgaWYgKG1hdGNoZXMgJiYgY3VyLmZyb20gPCBjdXIudG8pIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGUgPSBmaW5kSGFuZGxlKGN1cik7XG4gICAgICAgICAgICBpZiAoaGFuZGxlICYmIChkaXIgPiAwID8gcG9zID49IGhhbmRsZS5mcm9tICYmIHBvcyA8IGhhbmRsZS50byA6IHBvcyA+IGhhbmRsZS5mcm9tICYmIHBvcyA8PSBoYW5kbGUudG8pKVxuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaE1hcmtlZEJyYWNrZXRzKHN0YXRlLCBwb3MsIGRpciwgY3VyLCBoYW5kbGUsIG1hdGNoZXMsIGJyYWNrZXRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hQbGFpbkJyYWNrZXRzKHN0YXRlLCBwb3MsIGRpciwgdHJlZSwgbm9kZS50eXBlLCBtYXhTY2FuRGlzdGFuY2UsIGJyYWNrZXRzKTtcbn1cbmZ1bmN0aW9uIG1hdGNoTWFya2VkQnJhY2tldHMoX3N0YXRlLCBfcG9zLCBkaXIsIHRva2VuLCBoYW5kbGUsIG1hdGNoaW5nLCBicmFja2V0cykge1xuICAgIGxldCBwYXJlbnQgPSB0b2tlbi5wYXJlbnQsIGZpcnN0VG9rZW4gPSB7IGZyb206IGhhbmRsZS5mcm9tLCB0bzogaGFuZGxlLnRvIH07XG4gICAgbGV0IGRlcHRoID0gMCwgY3Vyc29yID0gcGFyZW50ID09PSBudWxsIHx8IHBhcmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyZW50LmN1cnNvcigpO1xuICAgIGlmIChjdXJzb3IgJiYgKGRpciA8IDAgPyBjdXJzb3IuY2hpbGRCZWZvcmUodG9rZW4uZnJvbSkgOiBjdXJzb3IuY2hpbGRBZnRlcih0b2tlbi50bykpKVxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoZGlyIDwgMCA/IGN1cnNvci50byA8PSB0b2tlbi5mcm9tIDogY3Vyc29yLmZyb20gPj0gdG9rZW4udG8pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCAmJiBtYXRjaGluZy5pbmRleE9mKGN1cnNvci50eXBlLm5hbWUpID4gLTEgJiYgY3Vyc29yLmZyb20gPCBjdXJzb3IudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVuZEhhbmRsZSA9IGZpbmRIYW5kbGUoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IGZpcnN0VG9rZW4sIGVuZDogZW5kSGFuZGxlID8geyBmcm9tOiBlbmRIYW5kbGUuZnJvbSwgdG86IGVuZEhhbmRsZS50byB9IDogdW5kZWZpbmVkLCBtYXRjaGVkOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoaW5nTm9kZXMoY3Vyc29yLnR5cGUsIGRpciwgYnJhY2tldHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoaW5nTm9kZXMoY3Vyc29yLnR5cGUsIC1kaXIsIGJyYWNrZXRzKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuZEhhbmRsZSA9IGZpbmRIYW5kbGUoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGZpcnN0VG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBlbmRIYW5kbGUgJiYgZW5kSGFuZGxlLmZyb20gPCBlbmRIYW5kbGUudG8gPyB7IGZyb206IGVuZEhhbmRsZS5mcm9tLCB0bzogZW5kSGFuZGxlLnRvIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGRpciA8IDAgPyBjdXJzb3IucHJldlNpYmxpbmcoKSA6IGN1cnNvci5uZXh0U2libGluZygpKTtcbiAgICByZXR1cm4geyBzdGFydDogZmlyc3RUb2tlbiwgbWF0Y2hlZDogZmFsc2UgfTtcbn1cbmZ1bmN0aW9uIG1hdGNoUGxhaW5CcmFja2V0cyhzdGF0ZSwgcG9zLCBkaXIsIHRyZWUsIHRva2VuVHlwZSwgbWF4U2NhbkRpc3RhbmNlLCBicmFja2V0cykge1xuICAgIGxldCBzdGFydENoID0gZGlyIDwgMCA/IHN0YXRlLnNsaWNlRG9jKHBvcyAtIDEsIHBvcykgOiBzdGF0ZS5zbGljZURvYyhwb3MsIHBvcyArIDEpO1xuICAgIGxldCBicmFja2V0ID0gYnJhY2tldHMuaW5kZXhPZihzdGFydENoKTtcbiAgICBpZiAoYnJhY2tldCA8IDAgfHwgKGJyYWNrZXQgJSAyID09IDApICE9IChkaXIgPiAwKSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHN0YXJ0VG9rZW4gPSB7IGZyb206IGRpciA8IDAgPyBwb3MgLSAxIDogcG9zLCB0bzogZGlyID4gMCA/IHBvcyArIDEgOiBwb3MgfTtcbiAgICBsZXQgaXRlciA9IHN0YXRlLmRvYy5pdGVyUmFuZ2UocG9zLCBkaXIgPiAwID8gc3RhdGUuZG9jLmxlbmd0aCA6IDApLCBkZXB0aCA9IDA7XG4gICAgZm9yIChsZXQgZGlzdGFuY2UgPSAwOyAhKGl0ZXIubmV4dCgpKS5kb25lICYmIGRpc3RhbmNlIDw9IG1heFNjYW5EaXN0YW5jZTspIHtcbiAgICAgICAgbGV0IHRleHQgPSBpdGVyLnZhbHVlO1xuICAgICAgICBpZiAoZGlyIDwgMClcbiAgICAgICAgICAgIGRpc3RhbmNlICs9IHRleHQubGVuZ3RoO1xuICAgICAgICBsZXQgYmFzZVBvcyA9IHBvcyArIGRpc3RhbmNlICogZGlyO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSBkaXIgPiAwID8gMCA6IHRleHQubGVuZ3RoIC0gMSwgZW5kID0gZGlyID4gMCA/IHRleHQubGVuZ3RoIDogLTE7IHBvcyAhPSBlbmQ7IHBvcyArPSBkaXIpIHtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IGJyYWNrZXRzLmluZGV4T2YodGV4dFtwb3NdKTtcbiAgICAgICAgICAgIGlmIChmb3VuZCA8IDAgfHwgdHJlZS5yZXNvbHZlSW5uZXIoYmFzZVBvcyArIHBvcywgMSkudHlwZSAhPSB0b2tlblR5cGUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoKGZvdW5kICUgMiA9PSAwKSA9PSAoZGlyID4gMCkpIHtcbiAgICAgICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZGVwdGggPT0gMSkgeyAvLyBDbG9zaW5nXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0VG9rZW4sIGVuZDogeyBmcm9tOiBiYXNlUG9zICsgcG9zLCB0bzogYmFzZVBvcyArIHBvcyArIDEgfSwgbWF0Y2hlZDogKGZvdW5kID4+IDEpID09IChicmFja2V0ID4+IDEpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkaXIgPiAwKVxuICAgICAgICAgICAgZGlzdGFuY2UgKz0gdGV4dC5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBpdGVyLmRvbmUgPyB7IHN0YXJ0OiBzdGFydFRva2VuLCBtYXRjaGVkOiBmYWxzZSB9IDogbnVsbDtcbn1cblxuLy8gQ291bnRzIHRoZSBjb2x1bW4gb2Zmc2V0IGluIGEgc3RyaW5nLCB0YWtpbmcgdGFicyBpbnRvIGFjY291bnQuXG4vLyBVc2VkIG1vc3RseSB0byBmaW5kIGluZGVudGF0aW9uLlxuZnVuY3Rpb24gY291bnRDb2woc3RyaW5nLCBlbmQsIHRhYlNpemUsIHN0YXJ0SW5kZXggPSAwLCBzdGFydFZhbHVlID0gMCkge1xuICAgIGlmIChlbmQgPT0gbnVsbCkge1xuICAgICAgICBlbmQgPSBzdHJpbmcuc2VhcmNoKC9bXlxcc1xcdTAwYTBdLyk7XG4gICAgICAgIGlmIChlbmQgPT0gLTEpXG4gICAgICAgICAgICBlbmQgPSBzdHJpbmcubGVuZ3RoO1xuICAgIH1cbiAgICBsZXQgbiA9IHN0YXJ0VmFsdWU7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoaSkgPT0gOSlcbiAgICAgICAgICAgIG4gKz0gdGFiU2l6ZSAtIChuICUgdGFiU2l6ZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG4rKztcbiAgICB9XG4gICAgcmV0dXJuIG47XG59XG4vKipcbkVuY2Fwc3VsYXRlcyBhIHNpbmdsZSBsaW5lIG9mIGlucHV0LiBHaXZlbiB0byBzdHJlYW0gc3ludGF4IGNvZGUsXG53aGljaCB1c2VzIGl0IHRvIHRva2VuaXplIHRoZSBjb250ZW50LlxuKi9cbmNsYXNzIFN0cmluZ1N0cmVhbSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc3RyZWFtLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxpbmUuXG4gICAgKi9cbiAgICBzdHJpbmcsIHRhYlNpemUsIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IGluZGVudCB1bml0IHNpemUuXG4gICAgKi9cbiAgICBpbmRlbnRVbml0LCBvdmVycmlkZUluZGVudCkge1xuICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZztcbiAgICAgICAgdGhpcy50YWJTaXplID0gdGFiU2l6ZTtcbiAgICAgICAgdGhpcy5pbmRlbnRVbml0ID0gaW5kZW50VW5pdDtcbiAgICAgICAgdGhpcy5vdmVycmlkZUluZGVudCA9IG92ZXJyaWRlSW5kZW50O1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGxpbmUuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCB0b2tlbi5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdGFydCA9IDA7XG4gICAgICAgIHRoaXMubGFzdENvbHVtblBvcyA9IDA7XG4gICAgICAgIHRoaXMubGFzdENvbHVtblZhbHVlID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ1ZSBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIGVvbCgpIHsgcmV0dXJuIHRoaXMucG9zID49IHRoaXMuc3RyaW5nLmxlbmd0aDsgfVxuICAgIC8qKlxuICAgIFRydWUgaWYgd2UgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIHNvbCgpIHsgcmV0dXJuIHRoaXMucG9zID09IDA7IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG5leHQgY29kZSB1bml0IGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uLCBvciB1bmRlZmluZWRcbiAgICBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgcGVlaygpIHsgcmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykgfHwgdW5kZWZpbmVkOyB9XG4gICAgLyoqXG4gICAgUmVhZCB0aGUgbmV4dCBjb2RlIHVuaXQgYW5kIGFkdmFuY2UgYHRoaXMucG9zYC5cbiAgICAqL1xuICAgIG5leHQoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcyA8IHRoaXMuc3RyaW5nLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MrKyk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hdGNoIHRoZSBuZXh0IGNoYXJhY3RlciBhZ2FpbnN0IHRoZSBnaXZlbiBzdHJpbmcsIHJlZ3VsYXJcbiAgICBleHByZXNzaW9uLCBvciBwcmVkaWNhdGUuIENvbnN1bWUgYW5kIHJldHVybiBpdCBpZiBpdCBtYXRjaGVzLlxuICAgICovXG4gICAgZWF0KG1hdGNoKSB7XG4gICAgICAgIGxldCBjaCA9IHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcyk7XG4gICAgICAgIGxldCBvaztcbiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgb2sgPSBjaCA9PSBtYXRjaDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgb2sgPSBjaCAmJiAobWF0Y2ggaW5zdGFuY2VvZiBSZWdFeHAgPyBtYXRjaC50ZXN0KGNoKSA6IG1hdGNoKGNoKSk7XG4gICAgICAgIGlmIChvaykge1xuICAgICAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgICAgIHJldHVybiBjaDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDb250aW51ZSBtYXRjaGluZyBjaGFyYWN0ZXJzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHN0cmluZyxcbiAgICByZWd1bGFyIGV4cHJlc3Npb24sIG9yIHByZWRpY2F0ZSBmdW5jdGlvbi4gUmV0dXJuIHRydWUgaWYgYW55XG4gICAgY2hhcmFjdGVycyB3ZXJlIGNvbnN1bWVkLlxuICAgICovXG4gICAgZWF0V2hpbGUobWF0Y2gpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICh0aGlzLmVhdChtYXRjaCkpIHsgfVxuICAgICAgICByZXR1cm4gdGhpcy5wb3MgPiBzdGFydDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29uc3VtZSB3aGl0ZXNwYWNlIGFoZWFkIG9mIGB0aGlzLnBvc2AuIFJldHVybiB0cnVlIGlmIGFueSB3YXNcbiAgICBmb3VuZC5cbiAgICAqL1xuICAgIGVhdFNwYWNlKCkge1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnBvcztcbiAgICAgICAgd2hpbGUgKC9bXFxzXFx1MDBhMF0vLnRlc3QodGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSkpXG4gICAgICAgICAgICArK3RoaXMucG9zO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgPiBzdGFydDtcbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgc2tpcFRvRW5kKCkgeyB0aGlzLnBvcyA9IHRoaXMuc3RyaW5nLmxlbmd0aDsgfVxuICAgIC8qKlxuICAgIE1vdmUgdG8gZGlyZWN0bHkgYmVmb3JlIHRoZSBnaXZlbiBjaGFyYWN0ZXIsIGlmIGZvdW5kIG9uIHRoZVxuICAgIGN1cnJlbnQgbGluZS5cbiAgICAqL1xuICAgIHNraXBUbyhjaCkge1xuICAgICAgICBsZXQgZm91bmQgPSB0aGlzLnN0cmluZy5pbmRleE9mKGNoLCB0aGlzLnBvcyk7XG4gICAgICAgIGlmIChmb3VuZCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnBvcyA9IGZvdW5kO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgTW92ZSBiYWNrIGBuYCBjaGFyYWN0ZXJzLlxuICAgICovXG4gICAgYmFja1VwKG4pIHsgdGhpcy5wb3MgLT0gbjsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY29sdW1uIHBvc2l0aW9uIGF0IGB0aGlzLnBvc2AuXG4gICAgKi9cbiAgICBjb2x1bW4oKSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RDb2x1bW5Qb3MgPCB0aGlzLnN0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RDb2x1bW5WYWx1ZSA9IGNvdW50Q29sKHRoaXMuc3RyaW5nLCB0aGlzLnN0YXJ0LCB0aGlzLnRhYlNpemUsIHRoaXMubGFzdENvbHVtblBvcywgdGhpcy5sYXN0Q29sdW1uVmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5sYXN0Q29sdW1uUG9zID0gdGhpcy5zdGFydDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sYXN0Q29sdW1uVmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgaW5kZW50YXRpb24gY29sdW1uIG9mIHRoZSBjdXJyZW50IGxpbmUuXG4gICAgKi9cbiAgICBpbmRlbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5vdmVycmlkZUluZGVudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY291bnRDb2wodGhpcy5zdHJpbmcsIG51bGwsIHRoaXMudGFiU2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hdGNoIHRoZSBpbnB1dCBhZ2FpbnN0IHRoZSBnaXZlbiBzdHJpbmcgb3IgcmVndWxhciBleHByZXNzaW9uXG4gICAgKHdoaWNoIHNob3VsZCBzdGFydCB3aXRoIGEgYF5gKS4gUmV0dXJuIHRydWUgb3IgdGhlIHJlZ2V4cCBtYXRjaFxuICAgIGlmIGl0IG1hdGNoZXMuXG4gICAgXG4gICAgVW5sZXNzIGBjb25zdW1lYCBpcyBzZXQgdG8gYGZhbHNlYCwgdGhpcyB3aWxsIG1vdmUgYHRoaXMucG9zYFxuICAgIHBhc3QgdGhlIG1hdGNoZWQgdGV4dC5cbiAgICBcbiAgICBXaGVuIG1hdGNoaW5nIGEgc3RyaW5nIGBjYXNlSW5zZW5zaXRpdmVgIGNhbiBiZSBzZXQgdG8gdHJ1ZSB0b1xuICAgIG1ha2UgdGhlIG1hdGNoIGNhc2UtaW5zZW5zaXRpdmUuXG4gICAgKi9cbiAgICBtYXRjaChwYXR0ZXJuLCBjb25zdW1lLCBjYXNlSW5zZW5zaXRpdmUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBjYXNlZCA9IChzdHIpID0+IGNhc2VJbnNlbnNpdGl2ZSA/IHN0ci50b0xvd2VyQ2FzZSgpIDogc3RyO1xuICAgICAgICAgICAgbGV0IHN1YnN0ciA9IHRoaXMuc3RyaW5nLnN1YnN0cih0aGlzLnBvcywgcGF0dGVybi5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKGNhc2VkKHN1YnN0cikgPT0gY2FzZWQocGF0dGVybikpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uc3VtZSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IHBhdHRlcm4ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5zdHJpbmcuc2xpY2UodGhpcy5wb3MpLm1hdGNoKHBhdHRlcm4pO1xuICAgICAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmluZGV4ID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmIChtYXRjaCAmJiBjb25zdW1lICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICB0aGlzLnBvcyArPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjdXJyZW50IHRva2VuLlxuICAgICovXG4gICAgY3VycmVudCgpIHsgcmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMuc3RhcnQsIHRoaXMucG9zKTsgfVxufVxuXG5mdW5jdGlvbiBmdWxsUGFyc2VyKHNwZWMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBzcGVjLm5hbWUgfHwgXCJcIixcbiAgICAgICAgdG9rZW46IHNwZWMudG9rZW4sXG4gICAgICAgIGJsYW5rTGluZTogc3BlYy5ibGFua0xpbmUgfHwgKCgpID0+IHsgfSksXG4gICAgICAgIHN0YXJ0U3RhdGU6IHNwZWMuc3RhcnRTdGF0ZSB8fCAoKCkgPT4gdHJ1ZSksXG4gICAgICAgIGNvcHlTdGF0ZTogc3BlYy5jb3B5U3RhdGUgfHwgZGVmYXVsdENvcHlTdGF0ZSxcbiAgICAgICAgaW5kZW50OiBzcGVjLmluZGVudCB8fCAoKCkgPT4gbnVsbCksXG4gICAgICAgIGxhbmd1YWdlRGF0YTogc3BlYy5sYW5ndWFnZURhdGEgfHwge30sXG4gICAgICAgIHRva2VuVGFibGU6IHNwZWMudG9rZW5UYWJsZSB8fCBub1Rva2Vuc1xuICAgIH07XG59XG5mdW5jdGlvbiBkZWZhdWx0Q29weVN0YXRlKHN0YXRlKSB7XG4gICAgaWYgKHR5cGVvZiBzdGF0ZSAhPSBcIm9iamVjdFwiKVxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgbGV0IG5ld1N0YXRlID0ge307XG4gICAgZm9yIChsZXQgcHJvcCBpbiBzdGF0ZSkge1xuICAgICAgICBsZXQgdmFsID0gc3RhdGVbcHJvcF07XG4gICAgICAgIG5ld1N0YXRlW3Byb3BdID0gKHZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdmFsLnNsaWNlKCkgOiB2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3U3RhdGU7XG59XG5jb25zdCBJbmRlbnRlZEZyb20gPSAvKkBfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbi8qKlxuQSBbbGFuZ3VhZ2VdKGh0dHBzOi8vY29kZW1pcnJvci5uZXQvNi9kb2NzL3JlZi8jbGFuZ3VhZ2UuTGFuZ3VhZ2UpIGNsYXNzIGJhc2VkIG9uIGEgQ29kZU1pcnJvclxuNS1zdHlsZSBbc3RyZWFtaW5nIHBhcnNlcl0oaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC82L2RvY3MvcmVmLyNsYW5ndWFnZS5TdHJlYW1QYXJzZXIpLlxuKi9cbmNsYXNzIFN0cmVhbUxhbmd1YWdlIGV4dGVuZHMgTGFuZ3VhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlcikge1xuICAgICAgICBsZXQgZGF0YSA9IGRlZmluZUxhbmd1YWdlRmFjZXQocGFyc2VyLmxhbmd1YWdlRGF0YSk7XG4gICAgICAgIGxldCBwID0gZnVsbFBhcnNlcihwYXJzZXIpLCBzZWxmO1xuICAgICAgICBsZXQgaW1wbCA9IG5ldyBjbGFzcyBleHRlbmRzIFBhcnNlciB7XG4gICAgICAgICAgICBjcmVhdGVQYXJzZShpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhcnNlKHNlbGYsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHN1cGVyKGRhdGEsIGltcGwsIFtpbmRlbnRTZXJ2aWNlLm9mKChjeCwgcG9zKSA9PiB0aGlzLmdldEluZGVudChjeCwgcG9zKSldLCBwYXJzZXIubmFtZSk7XG4gICAgICAgIHRoaXMudG9wTm9kZSA9IGRvY0lEKGRhdGEpO1xuICAgICAgICBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5zdHJlYW1QYXJzZXIgPSBwO1xuICAgICAgICB0aGlzLnN0YXRlQWZ0ZXIgPSBuZXcgTm9kZVByb3AoeyBwZXJOb2RlOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnRva2VuVGFibGUgPSBwYXJzZXIudG9rZW5UYWJsZSA/IG5ldyBUb2tlblRhYmxlKHAudG9rZW5UYWJsZSkgOiBkZWZhdWx0VG9rZW5UYWJsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVmaW5lIGEgc3RyZWFtIGxhbmd1YWdlLlxuICAgICovXG4gICAgc3RhdGljIGRlZmluZShzcGVjKSB7IHJldHVybiBuZXcgU3RyZWFtTGFuZ3VhZ2Uoc3BlYyk7IH1cbiAgICBnZXRJbmRlbnQoY3gsIHBvcykge1xuICAgICAgICBsZXQgdHJlZSA9IHN5bnRheFRyZWUoY3guc3RhdGUpLCBhdCA9IHRyZWUucmVzb2x2ZShwb3MpO1xuICAgICAgICB3aGlsZSAoYXQgJiYgYXQudHlwZSAhPSB0aGlzLnRvcE5vZGUpXG4gICAgICAgICAgICBhdCA9IGF0LnBhcmVudDtcbiAgICAgICAgaWYgKCFhdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZnJvbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHsgb3ZlcnJpZGVJbmRlbnRhdGlvbiB9ID0gY3gub3B0aW9ucztcbiAgICAgICAgaWYgKG92ZXJyaWRlSW5kZW50YXRpb24pIHtcbiAgICAgICAgICAgIGZyb20gPSBJbmRlbnRlZEZyb20uZ2V0KGN4LnN0YXRlKTtcbiAgICAgICAgICAgIGlmIChmcm9tICE9IG51bGwgJiYgZnJvbSA8IHBvcyAtIDFlNClcbiAgICAgICAgICAgICAgICBmcm9tID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydCA9IGZpbmRTdGF0ZSh0aGlzLCB0cmVlLCAwLCBhdC5mcm9tLCBmcm9tICE9PSBudWxsICYmIGZyb20gIT09IHZvaWQgMCA/IGZyb20gOiBwb3MpLCBzdGF0ZVBvcywgc3RhdGU7XG4gICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBzdGFydC5zdGF0ZTtcbiAgICAgICAgICAgIHN0YXRlUG9zID0gc3RhcnQucG9zICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gdGhpcy5zdHJlYW1QYXJzZXIuc3RhcnRTdGF0ZShjeC51bml0KTtcbiAgICAgICAgICAgIHN0YXRlUG9zID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zIC0gc3RhdGVQb3MgPiAxMDAwMCAvKiBDLk1heEluZGVudFNjYW5EaXN0ICovKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHdoaWxlIChzdGF0ZVBvcyA8IHBvcykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBjeC5zdGF0ZS5kb2MubGluZUF0KHN0YXRlUG9zKSwgZW5kID0gTWF0aC5taW4ocG9zLCBsaW5lLnRvKTtcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBpbmRlbnRhdGlvbiA9IG92ZXJyaWRlSW5kZW50YXRpb24gPyBvdmVycmlkZUluZGVudGF0aW9uKGxpbmUuZnJvbSkgOiAtMTtcbiAgICAgICAgICAgICAgICBsZXQgc3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbShsaW5lLnRleHQsIGN4LnN0YXRlLnRhYlNpemUsIGN4LnVuaXQsIGluZGVudGF0aW9uIDwgMCA/IHVuZGVmaW5lZCA6IGluZGVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoc3RyZWFtLnBvcyA8IGVuZCAtIGxpbmUuZnJvbSlcbiAgICAgICAgICAgICAgICAgICAgcmVhZFRva2VuKHRoaXMuc3RyZWFtUGFyc2VyLnRva2VuLCBzdHJlYW0sIHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtUGFyc2VyLmJsYW5rTGluZShzdGF0ZSwgY3gudW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kID09IHBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHN0YXRlUG9zID0gbGluZS50byArIDE7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpbmUgPSBjeC5saW5lQXQocG9zKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlSW5kZW50YXRpb24gJiYgZnJvbSA9PSBudWxsKVxuICAgICAgICAgICAgSW5kZW50ZWRGcm9tLnNldChjeC5zdGF0ZSwgbGluZS5mcm9tKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtUGFyc2VyLmluZGVudChzdGF0ZSwgL15cXHMqKC4qKS8uZXhlYyhsaW5lLnRleHQpWzFdLCBjeCk7XG4gICAgfVxuICAgIGdldCBhbGxvd3NOZXN0aW5nKCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbmZ1bmN0aW9uIGZpbmRTdGF0ZShsYW5nLCB0cmVlLCBvZmYsIHN0YXJ0UG9zLCBiZWZvcmUpIHtcbiAgICBsZXQgc3RhdGUgPSBvZmYgPj0gc3RhcnRQb3MgJiYgb2ZmICsgdHJlZS5sZW5ndGggPD0gYmVmb3JlICYmIHRyZWUucHJvcChsYW5nLnN0YXRlQWZ0ZXIpO1xuICAgIGlmIChzdGF0ZSlcbiAgICAgICAgcmV0dXJuIHsgc3RhdGU6IGxhbmcuc3RyZWFtUGFyc2VyLmNvcHlTdGF0ZShzdGF0ZSksIHBvczogb2ZmICsgdHJlZS5sZW5ndGggfTtcbiAgICBmb3IgKGxldCBpID0gdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBsZXQgY2hpbGQgPSB0cmVlLmNoaWxkcmVuW2ldLCBwb3MgPSBvZmYgKyB0cmVlLnBvc2l0aW9uc1tpXTtcbiAgICAgICAgbGV0IGZvdW5kID0gY2hpbGQgaW5zdGFuY2VvZiBUcmVlICYmIHBvcyA8IGJlZm9yZSAmJiBmaW5kU3RhdGUobGFuZywgY2hpbGQsIHBvcywgc3RhcnRQb3MsIGJlZm9yZSk7XG4gICAgICAgIGlmIChmb3VuZClcbiAgICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjdXRUcmVlKGxhbmcsIHRyZWUsIGZyb20sIHRvLCBpbnNpZGUpIHtcbiAgICBpZiAoaW5zaWRlICYmIGZyb20gPD0gMCAmJiB0byA+PSB0cmVlLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIHRyZWU7XG4gICAgaWYgKCFpbnNpZGUgJiYgdHJlZS50eXBlID09IGxhbmcudG9wTm9kZSlcbiAgICAgICAgaW5zaWRlID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gdHJlZS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBsZXQgcG9zID0gdHJlZS5wb3NpdGlvbnNbaV0sIGNoaWxkID0gdHJlZS5jaGlsZHJlbltpXSwgaW5uZXI7XG4gICAgICAgIGlmIChwb3MgPCB0byAmJiBjaGlsZCBpbnN0YW5jZW9mIFRyZWUpIHtcbiAgICAgICAgICAgIGlmICghKGlubmVyID0gY3V0VHJlZShsYW5nLCBjaGlsZCwgZnJvbSAtIHBvcywgdG8gLSBwb3MsIGluc2lkZSkpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcmV0dXJuICFpbnNpZGUgPyBpbm5lclxuICAgICAgICAgICAgICAgIDogbmV3IFRyZWUodHJlZS50eXBlLCB0cmVlLmNoaWxkcmVuLnNsaWNlKDAsIGkpLmNvbmNhdChpbm5lciksIHRyZWUucG9zaXRpb25zLnNsaWNlKDAsIGkgKyAxKSwgcG9zICsgaW5uZXIubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGZpbmRTdGFydEluRnJhZ21lbnRzKGxhbmcsIGZyYWdtZW50cywgc3RhcnRQb3MsIGVkaXRvclN0YXRlKSB7XG4gICAgZm9yIChsZXQgZiBvZiBmcmFnbWVudHMpIHtcbiAgICAgICAgbGV0IGZyb20gPSBmLmZyb20gKyAoZi5vcGVuU3RhcnQgPyAyNSA6IDApLCB0byA9IGYudG8gLSAoZi5vcGVuRW5kID8gMjUgOiAwKTtcbiAgICAgICAgbGV0IGZvdW5kID0gZnJvbSA8PSBzdGFydFBvcyAmJiB0byA+IHN0YXJ0UG9zICYmIGZpbmRTdGF0ZShsYW5nLCBmLnRyZWUsIDAgLSBmLm9mZnNldCwgc3RhcnRQb3MsIHRvKSwgdHJlZTtcbiAgICAgICAgaWYgKGZvdW5kICYmICh0cmVlID0gY3V0VHJlZShsYW5nLCBmLnRyZWUsIHN0YXJ0UG9zICsgZi5vZmZzZXQsIGZvdW5kLnBvcyArIGYub2Zmc2V0LCBmYWxzZSkpKVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdGU6IGZvdW5kLnN0YXRlLCB0cmVlIH07XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXRlOiBsYW5nLnN0cmVhbVBhcnNlci5zdGFydFN0YXRlKGVkaXRvclN0YXRlID8gZ2V0SW5kZW50VW5pdChlZGl0b3JTdGF0ZSkgOiA0KSwgdHJlZTogVHJlZS5lbXB0eSB9O1xufVxuY2xhc3MgUGFyc2Uge1xuICAgIGNvbnN0cnVjdG9yKGxhbmcsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcykge1xuICAgICAgICB0aGlzLmxhbmcgPSBsYW5nO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRzID0gZnJhZ21lbnRzO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcztcbiAgICAgICAgdGhpcy5zdG9wcGVkQXQgPSBudWxsO1xuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rUG9zID0gW107XG4gICAgICAgIHRoaXMuY2h1bmsgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua1JldXNlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yYW5nZUluZGV4ID0gMDtcbiAgICAgICAgdGhpcy50byA9IHJhbmdlc1tyYW5nZXMubGVuZ3RoIC0gMV0udG87XG4gICAgICAgIGxldCBjb250ZXh0ID0gUGFyc2VDb250ZXh0LmdldCgpLCBmcm9tID0gcmFuZ2VzWzBdLmZyb207XG4gICAgICAgIGxldCB7IHN0YXRlLCB0cmVlIH0gPSBmaW5kU3RhcnRJbkZyYWdtZW50cyhsYW5nLCBmcmFnbWVudHMsIGZyb20sIGNvbnRleHQgPT09IG51bGwgfHwgY29udGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29udGV4dC5zdGF0ZSk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5wYXJzZWRQb3MgPSB0aGlzLmNodW5rU3RhcnQgPSBmcm9tICsgdHJlZS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJlZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5jaHVua3MucHVzaCh0cmVlLmNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtQb3MucHVzaCh0cmVlLnBvc2l0aW9uc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRleHQgJiYgdGhpcy5wYXJzZWRQb3MgPCBjb250ZXh0LnZpZXdwb3J0LmZyb20gLSAxMDAwMDAgLyogQy5NYXhEaXN0YW5jZUJlZm9yZVZpZXdwb3J0ICovKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5sYW5nLnN0cmVhbVBhcnNlci5zdGFydFN0YXRlKGdldEluZGVudFVuaXQoY29udGV4dC5zdGF0ZSkpO1xuICAgICAgICAgICAgY29udGV4dC5za2lwVW50aWxJblZpZXcodGhpcy5wYXJzZWRQb3MsIGNvbnRleHQudmlld3BvcnQuZnJvbSk7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZFBvcyA9IGNvbnRleHQudmlld3BvcnQuZnJvbTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vdmVSYW5nZUluZGV4KCk7XG4gICAgfVxuICAgIGFkdmFuY2UoKSB7XG4gICAgICAgIGxldCBjb250ZXh0ID0gUGFyc2VDb250ZXh0LmdldCgpO1xuICAgICAgICBsZXQgcGFyc2VFbmQgPSB0aGlzLnN0b3BwZWRBdCA9PSBudWxsID8gdGhpcy50byA6IE1hdGgubWluKHRoaXMudG8sIHRoaXMuc3RvcHBlZEF0KTtcbiAgICAgICAgbGV0IGVuZCA9IE1hdGgubWluKHBhcnNlRW5kLCB0aGlzLmNodW5rU3RhcnQgKyAyMDQ4IC8qIEMuQ2h1bmtTaXplICovKTtcbiAgICAgICAgaWYgKGNvbnRleHQpXG4gICAgICAgICAgICBlbmQgPSBNYXRoLm1pbihlbmQsIGNvbnRleHQudmlld3BvcnQudG8pO1xuICAgICAgICB3aGlsZSAodGhpcy5wYXJzZWRQb3MgPCBlbmQpXG4gICAgICAgICAgICB0aGlzLnBhcnNlTGluZShjb250ZXh0KTtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtTdGFydCA8IHRoaXMucGFyc2VkUG9zKVxuICAgICAgICAgICAgdGhpcy5maW5pc2hDaHVuaygpO1xuICAgICAgICBpZiAodGhpcy5wYXJzZWRQb3MgPj0gcGFyc2VFbmQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2goKTtcbiAgICAgICAgaWYgKGNvbnRleHQgJiYgdGhpcy5wYXJzZWRQb3MgPj0gY29udGV4dC52aWV3cG9ydC50bykge1xuICAgICAgICAgICAgY29udGV4dC5za2lwVW50aWxJblZpZXcodGhpcy5wYXJzZWRQb3MsIHBhcnNlRW5kKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmlzaCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzdG9wQXQocG9zKSB7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gcG9zO1xuICAgIH1cbiAgICBsaW5lQWZ0ZXIocG9zKSB7XG4gICAgICAgIGxldCBjaHVuayA9IHRoaXMuaW5wdXQuY2h1bmsocG9zKTtcbiAgICAgICAgaWYgKCF0aGlzLmlucHV0LmxpbmVDaHVua3MpIHtcbiAgICAgICAgICAgIGxldCBlb2wgPSBjaHVuay5pbmRleE9mKFwiXFxuXCIpO1xuICAgICAgICAgICAgaWYgKGVvbCA+IC0xKVxuICAgICAgICAgICAgICAgIGNodW5rID0gY2h1bmsuc2xpY2UoMCwgZW9sKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaHVuayA9PSBcIlxcblwiKSB7XG4gICAgICAgICAgICBjaHVuayA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvcyArIGNodW5rLmxlbmd0aCA8PSB0aGlzLnRvID8gY2h1bmsgOiBjaHVuay5zbGljZSgwLCB0aGlzLnRvIC0gcG9zKTtcbiAgICB9XG4gICAgbmV4dExpbmUoKSB7XG4gICAgICAgIGxldCBmcm9tID0gdGhpcy5wYXJzZWRQb3MsIGxpbmUgPSB0aGlzLmxpbmVBZnRlcihmcm9tKSwgZW5kID0gZnJvbSArIGxpbmUubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IHRoaXMucmFuZ2VJbmRleDs7KSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2VFbmQgPSB0aGlzLnJhbmdlc1tpbmRleF0udG87XG4gICAgICAgICAgICBpZiAocmFuZ2VFbmQgPj0gZW5kKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGluZSA9IGxpbmUuc2xpY2UoMCwgcmFuZ2VFbmQgLSAoZW5kIC0gbGluZS5sZW5ndGgpKTtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gdGhpcy5yYW5nZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IHJhbmdlU3RhcnQgPSB0aGlzLnJhbmdlc1tpbmRleF0uZnJvbTtcbiAgICAgICAgICAgIGxldCBhZnRlciA9IHRoaXMubGluZUFmdGVyKHJhbmdlU3RhcnQpO1xuICAgICAgICAgICAgbGluZSArPSBhZnRlcjtcbiAgICAgICAgICAgIGVuZCA9IHJhbmdlU3RhcnQgKyBhZnRlci5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbGluZSwgZW5kIH07XG4gICAgfVxuICAgIHNraXBHYXBzVG8ocG9zLCBvZmZzZXQsIHNpZGUpIHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGVuZCA9IHRoaXMucmFuZ2VzW3RoaXMucmFuZ2VJbmRleF0udG8sIG9mZlBvcyA9IHBvcyArIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChzaWRlID4gMCA/IGVuZCA+IG9mZlBvcyA6IGVuZCA+PSBvZmZQb3MpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnJhbmdlc1srK3RoaXMucmFuZ2VJbmRleF0uZnJvbTtcbiAgICAgICAgICAgIG9mZnNldCArPSBzdGFydCAtIGVuZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBtb3ZlUmFuZ2VJbmRleCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMucmFuZ2VzW3RoaXMucmFuZ2VJbmRleF0udG8gPCB0aGlzLnBhcnNlZFBvcylcbiAgICAgICAgICAgIHRoaXMucmFuZ2VJbmRleCsrO1xuICAgIH1cbiAgICBlbWl0VG9rZW4oaWQsIGZyb20sIHRvLCBzaXplLCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuc2tpcEdhcHNUbyhmcm9tLCBvZmZzZXQsIDEpO1xuICAgICAgICAgICAgZnJvbSArPSBvZmZzZXQ7XG4gICAgICAgICAgICBsZXQgbGVuMCA9IHRoaXMuY2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5za2lwR2Fwc1RvKHRvLCBvZmZzZXQsIC0xKTtcbiAgICAgICAgICAgIHRvICs9IG9mZnNldDtcbiAgICAgICAgICAgIHNpemUgKz0gdGhpcy5jaHVuay5sZW5ndGggLSBsZW4wO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2h1bmsucHVzaChpZCwgZnJvbSwgdG8sIHNpemUpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBwYXJzZUxpbmUoY29udGV4dCkge1xuICAgICAgICBsZXQgeyBsaW5lLCBlbmQgfSA9IHRoaXMubmV4dExpbmUoKSwgb2Zmc2V0ID0gMCwgeyBzdHJlYW1QYXJzZXIgfSA9IHRoaXMubGFuZztcbiAgICAgICAgbGV0IHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0obGluZSwgY29udGV4dCA/IGNvbnRleHQuc3RhdGUudGFiU2l6ZSA6IDQsIGNvbnRleHQgPyBnZXRJbmRlbnRVbml0KGNvbnRleHQuc3RhdGUpIDogMik7XG4gICAgICAgIGlmIChzdHJlYW0uZW9sKCkpIHtcbiAgICAgICAgICAgIHN0cmVhbVBhcnNlci5ibGFua0xpbmUodGhpcy5zdGF0ZSwgc3RyZWFtLmluZGVudFVuaXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdG9rZW4gPSByZWFkVG9rZW4oc3RyZWFtUGFyc2VyLnRva2VuLCBzdHJlYW0sIHRoaXMuc3RhdGUpO1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbilcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5lbWl0VG9rZW4odGhpcy5sYW5nLnRva2VuVGFibGUucmVzb2x2ZSh0b2tlbiksIHRoaXMucGFyc2VkUG9zICsgc3RyZWFtLnN0YXJ0LCB0aGlzLnBhcnNlZFBvcyArIHN0cmVhbS5wb3MsIDQsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5zdGFydCA+IDEwMDAwIC8qIEMuTWF4TGluZUxlbmd0aCAqLylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJzZWRQb3MgPSBlbmQ7XG4gICAgICAgIHRoaXMubW92ZVJhbmdlSW5kZXgoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyc2VkUG9zIDwgdGhpcy50bylcbiAgICAgICAgICAgIHRoaXMucGFyc2VkUG9zKys7XG4gICAgfVxuICAgIGZpbmlzaENodW5rKCkge1xuICAgICAgICBsZXQgdHJlZSA9IFRyZWUuYnVpbGQoe1xuICAgICAgICAgICAgYnVmZmVyOiB0aGlzLmNodW5rLFxuICAgICAgICAgICAgc3RhcnQ6IHRoaXMuY2h1bmtTdGFydCxcbiAgICAgICAgICAgIGxlbmd0aDogdGhpcy5wYXJzZWRQb3MgLSB0aGlzLmNodW5rU3RhcnQsXG4gICAgICAgICAgICBub2RlU2V0LFxuICAgICAgICAgICAgdG9wSUQ6IDAsXG4gICAgICAgICAgICBtYXhCdWZmZXJMZW5ndGg6IDIwNDggLyogQy5DaHVua1NpemUgKi8sXG4gICAgICAgICAgICByZXVzZWQ6IHRoaXMuY2h1bmtSZXVzZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHRyZWUgPSBuZXcgVHJlZSh0cmVlLnR5cGUsIHRyZWUuY2hpbGRyZW4sIHRyZWUucG9zaXRpb25zLCB0cmVlLmxlbmd0aCwgW1t0aGlzLmxhbmcuc3RhdGVBZnRlciwgdGhpcy5sYW5nLnN0cmVhbVBhcnNlci5jb3B5U3RhdGUodGhpcy5zdGF0ZSldXSk7XG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2godHJlZSk7XG4gICAgICAgIHRoaXMuY2h1bmtQb3MucHVzaCh0aGlzLmNodW5rU3RhcnQgLSB0aGlzLnJhbmdlc1swXS5mcm9tKTtcbiAgICAgICAgdGhpcy5jaHVuayA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rUmV1c2VkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNodW5rU3RhcnQgPSB0aGlzLnBhcnNlZFBvcztcbiAgICB9XG4gICAgZmluaXNoKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyZWUodGhpcy5sYW5nLnRvcE5vZGUsIHRoaXMuY2h1bmtzLCB0aGlzLmNodW5rUG9zLCB0aGlzLnBhcnNlZFBvcyAtIHRoaXMucmFuZ2VzWzBdLmZyb20pLmJhbGFuY2UoKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZWFkVG9rZW4odG9rZW4sIHN0cmVhbSwgc3RhdGUpIHtcbiAgICBzdHJlYW0uc3RhcnQgPSBzdHJlYW0ucG9zO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdG9rZW4oc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIGlmIChzdHJlYW0ucG9zID4gc3RyZWFtLnN0YXJ0KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3RyZWFtIHBhcnNlciBmYWlsZWQgdG8gYWR2YW5jZSBzdHJlYW0uXCIpO1xufVxuY29uc3Qgbm9Ub2tlbnMgPSAvKkBfX1BVUkVfXyovT2JqZWN0LmNyZWF0ZShudWxsKTtcbmNvbnN0IHR5cGVBcnJheSA9IFtOb2RlVHlwZS5ub25lXTtcbmNvbnN0IG5vZGVTZXQgPSAvKkBfX1BVUkVfXyovbmV3IE5vZGVTZXQodHlwZUFycmF5KTtcbmNvbnN0IHdhcm5lZCA9IFtdO1xuLy8gQ2FjaGUgb2Ygbm9kZSB0eXBlcyBieSBuYW1lIGFuZCB0YWdzXG5jb25zdCBieVRhZyA9IC8qQF9fUFVSRV9fKi9PYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3QgZGVmYXVsdFRhYmxlID0gLypAX19QVVJFX18qL09iamVjdC5jcmVhdGUobnVsbCk7XG5mb3IgKGxldCBbbGVnYWN5TmFtZSwgbmFtZV0gb2YgW1xuICAgIFtcInZhcmlhYmxlXCIsIFwidmFyaWFibGVOYW1lXCJdLFxuICAgIFtcInZhcmlhYmxlLTJcIiwgXCJ2YXJpYWJsZU5hbWUuc3BlY2lhbFwiXSxcbiAgICBbXCJzdHJpbmctMlwiLCBcInN0cmluZy5zcGVjaWFsXCJdLFxuICAgIFtcImRlZlwiLCBcInZhcmlhYmxlTmFtZS5kZWZpbml0aW9uXCJdLFxuICAgIFtcInRhZ1wiLCBcInRhZ05hbWVcIl0sXG4gICAgW1wiYXR0cmlidXRlXCIsIFwiYXR0cmlidXRlTmFtZVwiXSxcbiAgICBbXCJ0eXBlXCIsIFwidHlwZU5hbWVcIl0sXG4gICAgW1wiYnVpbHRpblwiLCBcInZhcmlhYmxlTmFtZS5zdGFuZGFyZFwiXSxcbiAgICBbXCJxdWFsaWZpZXJcIiwgXCJtb2RpZmllclwiXSxcbiAgICBbXCJlcnJvclwiLCBcImludmFsaWRcIl0sXG4gICAgW1wiaGVhZGVyXCIsIFwiaGVhZGluZ1wiXSxcbiAgICBbXCJwcm9wZXJ0eVwiLCBcInByb3BlcnR5TmFtZVwiXVxuXSlcbiAgICBkZWZhdWx0VGFibGVbbGVnYWN5TmFtZV0gPSAvKkBfX1BVUkVfXyovY3JlYXRlVG9rZW5UeXBlKG5vVG9rZW5zLCBuYW1lKTtcbmNsYXNzIFRva2VuVGFibGUge1xuICAgIGNvbnN0cnVjdG9yKGV4dHJhKSB7XG4gICAgICAgIHRoaXMuZXh0cmEgPSBleHRyYTtcbiAgICAgICAgdGhpcy50YWJsZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgZGVmYXVsdFRhYmxlKTtcbiAgICB9XG4gICAgcmVzb2x2ZSh0YWcpIHtcbiAgICAgICAgcmV0dXJuICF0YWcgPyAwIDogdGhpcy50YWJsZVt0YWddIHx8ICh0aGlzLnRhYmxlW3RhZ10gPSBjcmVhdGVUb2tlblR5cGUodGhpcy5leHRyYSwgdGFnKSk7XG4gICAgfVxufVxuY29uc3QgZGVmYXVsdFRva2VuVGFibGUgPSAvKkBfX1BVUkVfXyovbmV3IFRva2VuVGFibGUobm9Ub2tlbnMpO1xuZnVuY3Rpb24gd2FybkZvclBhcnQocGFydCwgbXNnKSB7XG4gICAgaWYgKHdhcm5lZC5pbmRleE9mKHBhcnQpID4gLTEpXG4gICAgICAgIHJldHVybjtcbiAgICB3YXJuZWQucHVzaChwYXJ0KTtcbiAgICBjb25zb2xlLndhcm4obXNnKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRva2VuVHlwZShleHRyYSwgdGFnU3RyKSB7XG4gICAgbGV0IHRhZ3MkMSA9IFtdO1xuICAgIGZvciAobGV0IG5hbWUgb2YgdGFnU3RyLnNwbGl0KFwiIFwiKSkge1xuICAgICAgICBsZXQgZm91bmQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcGFydCBvZiBuYW1lLnNwbGl0KFwiLlwiKSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gKGV4dHJhW3BhcnRdIHx8IHRhZ3NbcGFydF0pO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHdhcm5Gb3JQYXJ0KHBhcnQsIGBVbmtub3duIGhpZ2hsaWdodGluZyB0YWcgJHtwYXJ0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGlmICghZm91bmQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB3YXJuRm9yUGFydChwYXJ0LCBgTW9kaWZpZXIgJHtwYXJ0fSB1c2VkIGF0IHN0YXJ0IG9mIHRhZ2ApO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmb3VuZC5tYXAodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgd2FybkZvclBhcnQocGFydCwgYFRhZyAke3BhcnR9IHVzZWQgYXMgbW9kaWZpZXJgKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgdGFnIG9mIGZvdW5kKVxuICAgICAgICAgICAgdGFncyQxLnB1c2godGFnKTtcbiAgICB9XG4gICAgaWYgKCF0YWdzJDEubGVuZ3RoKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBsZXQgbmFtZSA9IHRhZ1N0ci5yZXBsYWNlKC8gL2csIFwiX1wiKSwga2V5ID0gbmFtZSArIFwiIFwiICsgdGFncyQxLm1hcCh0ID0+IHQuaWQpO1xuICAgIGxldCBrbm93biA9IGJ5VGFnW2tleV07XG4gICAgaWYgKGtub3duKVxuICAgICAgICByZXR1cm4ga25vd24uaWQ7XG4gICAgbGV0IHR5cGUgPSBieVRhZ1trZXldID0gTm9kZVR5cGUuZGVmaW5lKHtcbiAgICAgICAgaWQ6IHR5cGVBcnJheS5sZW5ndGgsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHByb3BzOiBbc3R5bGVUYWdzKHsgW25hbWVdOiB0YWdzJDEgfSldXG4gICAgfSk7XG4gICAgdHlwZUFycmF5LnB1c2godHlwZSk7XG4gICAgcmV0dXJuIHR5cGUuaWQ7XG59XG5mdW5jdGlvbiBkb2NJRChkYXRhKSB7XG4gICAgbGV0IHR5cGUgPSBOb2RlVHlwZS5kZWZpbmUoeyBpZDogdHlwZUFycmF5Lmxlbmd0aCwgbmFtZTogXCJEb2N1bWVudFwiLCBwcm9wczogW2xhbmd1YWdlRGF0YVByb3AuYWRkKCgpID0+IGRhdGEpXSwgdG9wOiB0cnVlIH0pO1xuICAgIHR5cGVBcnJheS5wdXNoKHR5cGUpO1xuICAgIHJldHVybiB0eXBlO1xufVxuXG5mdW5jdGlvbiBidWlsZEZvckxpbmUobGluZSkge1xuICAgIHJldHVybiBsaW5lLmxlbmd0aCA8PSA0MDk2ICYmIC9bXFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MDcwMC1cXHUwOGFjXFx1ZmI1MC1cXHVmZGZmXS8udGVzdChsaW5lKTtcbn1cbmZ1bmN0aW9uIHRleHRIYXNSVEwodGV4dCkge1xuICAgIGZvciAobGV0IGkgPSB0ZXh0Lml0ZXIoKTsgIWkubmV4dCgpLmRvbmU7KVxuICAgICAgICBpZiAoYnVpbGRGb3JMaW5lKGkudmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY2hhbmdlQWRkc1JUTChjaGFuZ2UpIHtcbiAgICBsZXQgYWRkZWQgPSBmYWxzZTtcbiAgICBjaGFuZ2UuaXRlckNoYW5nZXMoKGZBLCB0QSwgZkIsIHRCLCBpbnMpID0+IHtcbiAgICAgICAgaWYgKCFhZGRlZCAmJiB0ZXh0SGFzUlRMKGlucykpXG4gICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFkZGVkO1xufVxuY29uc3QgYWx3YXlzSXNvbGF0ZSA9IC8qQF9fUFVSRV9fKi9GYWNldC5kZWZpbmUoeyBjb21iaW5lOiB2YWx1ZXMgPT4gdmFsdWVzLnNvbWUoeCA9PiB4KSB9KTtcbi8qKlxuTWFrZSBzdXJlIG5vZGVzXG5bbWFya2VkXShodHRwczovL2xlemVyLmNvZGVtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tb24uTm9kZVByb3BeaXNvbGF0ZSlcbmFzIGlzb2xhdGluZyBmb3IgYmlkaXJlY3Rpb25hbCB0ZXh0IGFyZSByZW5kZXJlZCBpbiBhIHdheSB0aGF0XG5pc29sYXRlcyB0aGVtIGZyb20gdGhlIHN1cnJvdW5kaW5nIHRleHQuXG4qL1xuZnVuY3Rpb24gYmlkaUlzb2xhdGVzKG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBleHRlbnNpb25zID0gW2lzb2xhdGVNYXJrc107XG4gICAgaWYgKG9wdGlvbnMuYWx3YXlzSXNvbGF0ZSlcbiAgICAgICAgZXh0ZW5zaW9ucy5wdXNoKGFsd2F5c0lzb2xhdGUub2YodHJ1ZSkpO1xuICAgIHJldHVybiBleHRlbnNpb25zO1xufVxuY29uc3QgaXNvbGF0ZU1hcmtzID0gLypAX19QVVJFX18qL1ZpZXdQbHVnaW4uZnJvbUNsYXNzKGNsYXNzIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3KSB7XG4gICAgICAgIHRoaXMuYWx3YXlzID0gdmlldy5zdGF0ZS5mYWNldChhbHdheXNJc29sYXRlKSB8fFxuICAgICAgICAgICAgdmlldy50ZXh0RGlyZWN0aW9uICE9IERpcmVjdGlvbi5MVFIgfHxcbiAgICAgICAgICAgIHZpZXcuc3RhdGUuZmFjZXQoRWRpdG9yVmlldy5wZXJMaW5lVGV4dERpcmVjdGlvbik7XG4gICAgICAgIHRoaXMuaGFzUlRMID0gIXRoaXMuYWx3YXlzICYmIHRleHRIYXNSVEwodmlldy5zdGF0ZS5kb2MpO1xuICAgICAgICB0aGlzLnRyZWUgPSBzeW50YXhUcmVlKHZpZXcuc3RhdGUpO1xuICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gYnVpbGREZWNvKHZpZXcsIHRoaXMudHJlZSwgdGhpcy5hbHdheXMpO1xuICAgIH1cbiAgICB1cGRhdGUodXBkYXRlKSB7XG4gICAgICAgIGxldCBhbHdheXMgPSB1cGRhdGUuc3RhdGUuZmFjZXQoYWx3YXlzSXNvbGF0ZSkgfHxcbiAgICAgICAgICAgIHVwZGF0ZS52aWV3LnRleHREaXJlY3Rpb24gIT0gRGlyZWN0aW9uLkxUUiB8fFxuICAgICAgICAgICAgdXBkYXRlLnN0YXRlLmZhY2V0KEVkaXRvclZpZXcucGVyTGluZVRleHREaXJlY3Rpb24pO1xuICAgICAgICBpZiAoIWFsd2F5cyAmJiAhdGhpcy5oYXNSVEwgJiYgY2hhbmdlQWRkc1JUTCh1cGRhdGUuY2hhbmdlcykpXG4gICAgICAgICAgICB0aGlzLmhhc1JUTCA9IHRydWU7XG4gICAgICAgIGlmICghYWx3YXlzICYmICF0aGlzLmhhc1JUTClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHRyZWUgPSBzeW50YXhUcmVlKHVwZGF0ZS5zdGF0ZSk7XG4gICAgICAgIGlmIChhbHdheXMgIT0gdGhpcy5hbHdheXMgfHwgdHJlZSAhPSB0aGlzLnRyZWUgfHwgdXBkYXRlLmRvY0NoYW5nZWQgfHwgdXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy50cmVlID0gdHJlZTtcbiAgICAgICAgICAgIHRoaXMuYWx3YXlzID0gYWx3YXlzO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IGJ1aWxkRGVjbyh1cGRhdGUudmlldywgdHJlZSwgYWx3YXlzKTtcbiAgICAgICAgfVxuICAgIH1cbn0sIHtcbiAgICBwcm92aWRlOiBwbHVnaW4gPT4ge1xuICAgICAgICBmdW5jdGlvbiBhY2Nlc3Modmlldykge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB2aWV3LnBsdWdpbihwbHVnaW4pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVjb3JhdGlvbnMpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IERlY29yYXRpb24ubm9uZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW0VkaXRvclZpZXcub3V0ZXJEZWNvcmF0aW9ucy5vZihhY2Nlc3MpLFxuICAgICAgICAgICAgUHJlYy5sb3dlc3QoRWRpdG9yVmlldy5iaWRpSXNvbGF0ZWRSYW5nZXMub2YoYWNjZXNzKSldO1xuICAgIH1cbn0pO1xuZnVuY3Rpb24gYnVpbGREZWNvKHZpZXcsIHRyZWUsIGFsd2F5cykge1xuICAgIGxldCBkZWNvID0gbmV3IFJhbmdlU2V0QnVpbGRlcigpO1xuICAgIGxldCByYW5nZXMgPSB2aWV3LnZpc2libGVSYW5nZXM7XG4gICAgaWYgKCFhbHdheXMpXG4gICAgICAgIHJhbmdlcyA9IGNsaXBSVExMaW5lcyhyYW5nZXMsIHZpZXcuc3RhdGUuZG9jKTtcbiAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2YgcmFuZ2VzKSB7XG4gICAgICAgIHRyZWUuaXRlcmF0ZSh7XG4gICAgICAgICAgICBlbnRlcjogbm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGlzbyA9IG5vZGUudHlwZS5wcm9wKE5vZGVQcm9wLmlzb2xhdGUpO1xuICAgICAgICAgICAgICAgIGlmIChpc28pXG4gICAgICAgICAgICAgICAgICAgIGRlY28uYWRkKG5vZGUuZnJvbSwgbm9kZS50bywgbWFya3NbaXNvXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnJvbSwgdG9cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvLmZpbmlzaCgpO1xufVxuZnVuY3Rpb24gY2xpcFJUTExpbmVzKHJhbmdlcywgZG9jKSB7XG4gICAgbGV0IGN1ciA9IGRvYy5pdGVyKCksIHBvcyA9IDAsIHJlc3VsdCA9IFtdLCBsYXN0ID0gbnVsbDtcbiAgICBmb3IgKGxldCB7IGZyb20sIHRvIH0gb2YgcmFuZ2VzKSB7XG4gICAgICAgIGlmIChmcm9tICE9IHBvcykge1xuICAgICAgICAgICAgaWYgKHBvcyA8IGZyb20pXG4gICAgICAgICAgICAgICAgY3VyLm5leHQoZnJvbSAtIHBvcyk7XG4gICAgICAgICAgICBwb3MgPSBmcm9tO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHBvcywgZW5kID0gcG9zICsgY3VyLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICghY3VyLmxpbmVCcmVhayAmJiBidWlsZEZvckxpbmUoY3VyLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmIChsYXN0ICYmIGxhc3QudG8gPiBzdGFydCAtIDEwKVxuICAgICAgICAgICAgICAgICAgICBsYXN0LnRvID0gTWF0aC5taW4odG8sIGVuZCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChsYXN0ID0geyBmcm9tOiBzdGFydCwgdG86IE1hdGgubWluKHRvLCBlbmQpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA+PSB0bylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHBvcyA9IGVuZDtcbiAgICAgICAgICAgIGN1ci5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IG1hcmtzID0ge1xuICAgIHJ0bDogLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLWlzb1wiLCBpbmNsdXNpdmU6IHRydWUsIGF0dHJpYnV0ZXM6IHsgZGlyOiBcInJ0bFwiIH0sIGJpZGlJc29sYXRlOiBEaXJlY3Rpb24uUlRMIH0pLFxuICAgIGx0cjogLypAX19QVVJFX18qL0RlY29yYXRpb24ubWFyayh7IGNsYXNzOiBcImNtLWlzb1wiLCBpbmNsdXNpdmU6IHRydWUsIGF0dHJpYnV0ZXM6IHsgZGlyOiBcImx0clwiIH0sIGJpZGlJc29sYXRlOiBEaXJlY3Rpb24uTFRSIH0pLFxuICAgIGF1dG86IC8qQF9fUFVSRV9fKi9EZWNvcmF0aW9uLm1hcmsoeyBjbGFzczogXCJjbS1pc29cIiwgaW5jbHVzaXZlOiB0cnVlLCBhdHRyaWJ1dGVzOiB7IGRpcjogXCJhdXRvXCIgfSwgYmlkaUlzb2xhdGU6IG51bGwgfSlcbn07XG5cbmV4cG9ydCB7IERvY0lucHV0LCBIaWdobGlnaHRTdHlsZSwgSW5kZW50Q29udGV4dCwgTFJMYW5ndWFnZSwgTGFuZ3VhZ2UsIExhbmd1YWdlRGVzY3JpcHRpb24sIExhbmd1YWdlU3VwcG9ydCwgUGFyc2VDb250ZXh0LCBTdHJlYW1MYW5ndWFnZSwgU3RyaW5nU3RyZWFtLCBUcmVlSW5kZW50Q29udGV4dCwgYmlkaUlzb2xhdGVzLCBicmFja2V0TWF0Y2hpbmcsIGJyYWNrZXRNYXRjaGluZ0hhbmRsZSwgY29kZUZvbGRpbmcsIGNvbnRpbnVlZEluZGVudCwgZGVmYXVsdEhpZ2hsaWdodFN0eWxlLCBkZWZpbmVMYW5ndWFnZUZhY2V0LCBkZWxpbWl0ZWRJbmRlbnQsIGVuc3VyZVN5bnRheFRyZWUsIGZsYXRJbmRlbnQsIGZvbGRBbGwsIGZvbGRDb2RlLCBmb2xkRWZmZWN0LCBmb2xkR3V0dGVyLCBmb2xkSW5zaWRlLCBmb2xkS2V5bWFwLCBmb2xkTm9kZVByb3AsIGZvbGRTZXJ2aWNlLCBmb2xkU3RhdGUsIGZvbGRhYmxlLCBmb2xkZWRSYW5nZXMsIGZvcmNlUGFyc2luZywgZ2V0SW5kZW50VW5pdCwgZ2V0SW5kZW50YXRpb24sIGhpZ2hsaWdodGluZ0ZvciwgaW5kZW50Tm9kZVByb3AsIGluZGVudE9uSW5wdXQsIGluZGVudFJhbmdlLCBpbmRlbnRTZXJ2aWNlLCBpbmRlbnRTdHJpbmcsIGluZGVudFVuaXQsIGxhbmd1YWdlLCBsYW5ndWFnZURhdGFQcm9wLCBtYXRjaEJyYWNrZXRzLCBzdWJsYW5ndWFnZVByb3AsIHN5bnRheEhpZ2hsaWdodGluZywgc3ludGF4UGFyc2VyUnVubmluZywgc3ludGF4VHJlZSwgc3ludGF4VHJlZUF2YWlsYWJsZSwgdG9nZ2xlRm9sZCwgdW5mb2xkQWxsLCB1bmZvbGRDb2RlLCB1bmZvbGRFZmZlY3QgfTtcbiIsICJpbXBvcnQgeyBQYXJzZXIsIE5vZGVQcm9wLCBOb2RlU2V0LCBOb2RlVHlwZSwgRGVmYXVsdEJ1ZmZlckxlbmd0aCwgVHJlZSwgSXRlck1vZGUgfSBmcm9tICdAbGV6ZXIvY29tbW9uJztcblxuLyoqXG5BIHBhcnNlIHN0YWNrLiBUaGVzZSBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBwYXJzZXIgdG8gdHJhY2tcbnBhcnNpbmcgcHJvZ3Jlc3MuIFRoZXkgYWxzbyBwcm92aWRlIHNvbWUgcHJvcGVydGllcyBhbmQgbWV0aG9kc1xudGhhdCBleHRlcm5hbCBjb2RlIHN1Y2ggYXMgYSB0b2tlbml6ZXIgY2FuIHVzZSB0byBnZXQgaW5mb3JtYXRpb25cbmFib3V0IHRoZSBwYXJzZSBzdGF0ZS5cbiovXG5jbGFzcyBTdGFjayB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcGFyc2UgdGhhdCB0aGlzIHN0YWNrIGlzIHBhcnQgb2YgQGludGVybmFsXG4gICAgKi9cbiAgICBwLCBcbiAgICAvKipcbiAgICBIb2xkcyBzdGF0ZSwgaW5wdXQgcG9zLCBidWZmZXIgaW5kZXggdHJpcGxldHMgZm9yIGFsbCBidXQgdGhlXG4gICAgdG9wIHN0YXRlIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhY2ssIFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IHBhcnNlIHN0YXRlIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGUsIFxuICAgIC8vIFRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGUgbmV4dCByZWR1Y2Ugc2hvdWxkIHRha2UgcGxhY2UuIFRoaXNcbiAgICAvLyBjYW4gYmUgbGVzcyB0aGFuIGB0aGlzLnBvc2Agd2hlbiBza2lwcGVkIGV4cHJlc3Npb25zIGhhdmUgYmVlblxuICAgIC8vIGFkZGVkIHRvIHRoZSBzdGFjayAod2hpY2ggc2hvdWxkIGJlIG1vdmVkIG91dHNpZGUgb2YgdGhlIG5leHRcbiAgICAvLyByZWR1Y3Rpb24pXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZWR1Y2VQb3MsIFxuICAgIC8qKlxuICAgIFRoZSBpbnB1dCBwb3NpdGlvbiB1cCB0byB3aGljaCB0aGlzIHN0YWNrIGhhcyBwYXJzZWQuXG4gICAgKi9cbiAgICBwb3MsIFxuICAgIC8qKlxuICAgIFRoZSBkeW5hbWljIHNjb3JlIG9mIHRoZSBzdGFjaywgaW5jbHVkaW5nIGR5bmFtaWMgcHJlY2VkZW5jZVxuICAgIGFuZCBlcnJvci1yZWNvdmVyeSBwZW5hbHRpZXNcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNjb3JlLCBcbiAgICAvLyBUaGUgb3V0cHV0IGJ1ZmZlci4gSG9sZHMgKHR5cGUsIHN0YXJ0LCBlbmQsIHNpemUpIHF1YWRzXG4gICAgLy8gcmVwcmVzZW50aW5nIG5vZGVzIGNyZWF0ZWQgYnkgdGhlIHBhcnNlciwgd2hlcmUgYHNpemVgIGlzXG4gICAgLy8gYW1vdW50IG9mIGJ1ZmZlciBhcnJheSBlbnRyaWVzIGNvdmVyZWQgYnkgdGhpcyBub2RlLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYnVmZmVyLCBcbiAgICAvLyBUaGUgYmFzZSBvZmZzZXQgb2YgdGhlIGJ1ZmZlci4gV2hlbiBzdGFja3MgYXJlIHNwbGl0LCB0aGUgc3BsaXRcbiAgICAvLyBpbnN0YW5jZSBzaGFyZWQgdGhlIGJ1ZmZlciBoaXN0b3J5IHdpdGggaXRzIHBhcmVudCB1cCB0b1xuICAgIC8vIGBidWZmZXJCYXNlYCwgd2hpY2ggaXMgdGhlIGFic29sdXRlIG9mZnNldCAoaW5jbHVkaW5nIHRoZVxuICAgIC8vIG9mZnNldCBvZiBwcmV2aW91cyBzcGxpdHMpIGludG8gdGhlIGJ1ZmZlciBhdCB3aGljaCB0aGlzIHN0YWNrXG4gICAgLy8gc3RhcnRzIHdyaXRpbmcuXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBidWZmZXJCYXNlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGN1ckNvbnRleHQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbG9va0FoZWFkID0gMCwgXG4gICAgLy8gQSBwYXJlbnQgc3RhY2sgZnJvbSB3aGljaCB0aGlzIHdhcyBzcGxpdCBvZmYsIGlmIGFueS4gVGhpcyBpc1xuICAgIC8vIHNldCB1cCBzbyB0aGF0IGl0IGFsd2F5cyBwb2ludHMgdG8gYSBzdGFjayB0aGF0IGhhcyBzb21lXG4gICAgLy8gYWRkaXRpb25hbCBidWZmZXIgY29udGVudCwgbmV2ZXIgdG8gYSBzdGFjayB3aXRoIGFuIGVxdWFsXG4gICAgLy8gYGJ1ZmZlckJhc2VgLlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcGFyZW50KSB7XG4gICAgICAgIHRoaXMucCA9IHA7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLnJlZHVjZVBvcyA9IHJlZHVjZVBvcztcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuc2NvcmUgPSBzY29yZTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgIHRoaXMuYnVmZmVyQmFzZSA9IGJ1ZmZlckJhc2U7XG4gICAgICAgIHRoaXMuY3VyQ29udGV4dCA9IGN1ckNvbnRleHQ7XG4gICAgICAgIHRoaXMubG9va0FoZWFkID0gbG9va0FoZWFkO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBbJHt0aGlzLnN0YWNrLmZpbHRlcigoXywgaSkgPT4gaSAlIDMgPT0gMCkuY29uY2F0KHRoaXMuc3RhdGUpfV1AJHt0aGlzLnBvc30ke3RoaXMuc2NvcmUgPyBcIiFcIiArIHRoaXMuc2NvcmUgOiBcIlwifWA7XG4gICAgfVxuICAgIC8vIFN0YXJ0IGFuIGVtcHR5IHN0YWNrXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgc3RhcnQocCwgc3RhdGUsIHBvcyA9IDApIHtcbiAgICAgICAgbGV0IGN4ID0gcC5wYXJzZXIuY29udGV4dDtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFjayhwLCBbXSwgc3RhdGUsIHBvcywgcG9zLCAwLCBbXSwgMCwgY3ggPyBuZXcgU3RhY2tDb250ZXh0KGN4LCBjeC5zdGFydCkgOiBudWxsLCAwLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHN0YWNrJ3MgY3VycmVudCBbY29udGV4dF0oI2xyLkNvbnRleHRUcmFja2VyKSB2YWx1ZSwgaWZcbiAgICBhbnkuIEl0cyB0eXBlIHdpbGwgZGVwZW5kIG9uIHRoZSBjb250ZXh0IHRyYWNrZXIncyB0eXBlXG4gICAgcGFyYW1ldGVyLCBvciBpdCB3aWxsIGJlIGBudWxsYCBpZiB0aGVyZSBpcyBubyBjb250ZXh0XG4gICAgdHJhY2tlci5cbiAgICAqL1xuICAgIGdldCBjb250ZXh0KCkgeyByZXR1cm4gdGhpcy5jdXJDb250ZXh0ID8gdGhpcy5jdXJDb250ZXh0LmNvbnRleHQgOiBudWxsOyB9XG4gICAgLy8gUHVzaCBhIHN0YXRlIG9udG8gdGhlIHN0YWNrLCB0cmFja2luZyBpdHMgc3RhcnQgcG9zaXRpb24gYXMgd2VsbFxuICAgIC8vIGFzIHRoZSBidWZmZXIgYmFzZSBhdCB0aGF0IHBvaW50LlxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVzaFN0YXRlKHN0YXRlLCBzdGFydCkge1xuICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5zdGF0ZSwgc3RhcnQsIHRoaXMuYnVmZmVyQmFzZSArIHRoaXMuYnVmZmVyLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG4gICAgLy8gQXBwbHkgYSByZWR1Y2UgYWN0aW9uXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZWR1Y2UoYWN0aW9uKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGRlcHRoID0gYWN0aW9uID4+IDE5IC8qIEFjdGlvbi5SZWR1Y2VEZXB0aFNoaWZ0ICovLCB0eXBlID0gYWN0aW9uICYgNjU1MzUgLyogQWN0aW9uLlZhbHVlTWFzayAqLztcbiAgICAgICAgbGV0IHsgcGFyc2VyIH0gPSB0aGlzLnA7XG4gICAgICAgIGxldCBkUHJlYyA9IHBhcnNlci5keW5hbWljUHJlY2VkZW5jZSh0eXBlKTtcbiAgICAgICAgaWYgKGRQcmVjKVxuICAgICAgICAgICAgdGhpcy5zY29yZSArPSBkUHJlYztcbiAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICAgIHRoaXMucHVzaFN0YXRlKHBhcnNlci5nZXRHb3RvKHRoaXMuc3RhdGUsIHR5cGUsIHRydWUpLCB0aGlzLnJlZHVjZVBvcyk7XG4gICAgICAgICAgICAvLyBaZXJvLWRlcHRoIHJlZHVjdGlvbnMgYXJlIGEgc3BlY2lhbCBjYXNlXHUyMDE0dGhleSBhZGQgc3R1ZmYgdG9cbiAgICAgICAgICAgIC8vIHRoZSBzdGFjayB3aXRob3V0IHBvcHBpbmcgYW55dGhpbmcgb2ZmLlxuICAgICAgICAgICAgaWYgKHR5cGUgPCBwYXJzZXIubWluUmVwZWF0VGVybSlcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlTm9kZSh0eXBlLCB0aGlzLnJlZHVjZVBvcywgdGhpcy5yZWR1Y2VQb3MsIDQsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5yZWR1Y2VDb250ZXh0KHR5cGUsIHRoaXMucmVkdWNlUG9zKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaW5kIHRoZSBiYXNlIGluZGV4IGludG8gYHRoaXMuc3RhY2tgLCBjb250ZW50IGFmdGVyIHdoaWNoIHdpbGxcbiAgICAgICAgLy8gYmUgZHJvcHBlZC4gTm90ZSB0aGF0IHdpdGggYFN0YXlGbGFnYCByZWR1Y3Rpb25zIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gY29uc3VtZSB0d28gZXh0cmEgZnJhbWVzICh0aGUgZHVtbXkgcGFyZW50IG5vZGUgZm9yIHRoZSBza2lwcGVkXG4gICAgICAgIC8vIGV4cHJlc3Npb24gYW5kIHRoZSBzdGF0ZSB0aGF0IHdlJ2xsIGJlIHN0YXlpbmcgaW4sIHdoaWNoIHNob3VsZFxuICAgICAgICAvLyBiZSBtb3ZlZCB0byBgdGhpcy5zdGF0ZWApLlxuICAgICAgICBsZXQgYmFzZSA9IHRoaXMuc3RhY2subGVuZ3RoIC0gKChkZXB0aCAtIDEpICogMykgLSAoYWN0aW9uICYgMjYyMTQ0IC8qIEFjdGlvbi5TdGF5RmxhZyAqLyA/IDYgOiAwKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gYmFzZSA/IHRoaXMuc3RhY2tbYmFzZSAtIDJdIDogdGhpcy5wLnJhbmdlc1swXS5mcm9tLCBzaXplID0gdGhpcy5yZWR1Y2VQb3MgLSBzdGFydDtcbiAgICAgICAgLy8gVGhpcyBpcyBhIGtsdWRnZSB0byB0cnkgYW5kIGRldGVjdCBvdmVybHkgZGVlcCBsZWZ0LWFzc29jaWF0aXZlXG4gICAgICAgIC8vIHRyZWVzLCB3aGljaCB3aWxsIG5vdCBpbmNyZWFzZSB0aGUgcGFyc2Ugc3RhY2sgZGVwdGggYW5kIHRodXNcbiAgICAgICAgLy8gd29uJ3QgYmUgY2F1Z2h0IGJ5IHRoZSByZWd1bGFyIHN0YWNrLWRlcHRoIGxpbWl0IGNoZWNrLlxuICAgICAgICBpZiAoc2l6ZSA+PSAyMDAwIC8qIFJlY292ZXIuTWluQmlnUmVkdWN0aW9uICovICYmICEoKF9hID0gdGhpcy5wLnBhcnNlci5ub2RlU2V0LnR5cGVzW3R5cGVdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaXNBbm9ueW1vdXMpKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPT0gdGhpcy5wLmxhc3RCaWdSZWR1Y3Rpb25TdGFydCkge1xuICAgICAgICAgICAgICAgIHRoaXMucC5iaWdSZWR1Y3Rpb25Db3VudCsrO1xuICAgICAgICAgICAgICAgIHRoaXMucC5sYXN0QmlnUmVkdWN0aW9uU2l6ZSA9IHNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnAubGFzdEJpZ1JlZHVjdGlvblNpemUgPCBzaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wLmJpZ1JlZHVjdGlvbkNvdW50ID0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLnAubGFzdEJpZ1JlZHVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5wLmxhc3RCaWdSZWR1Y3Rpb25TaXplID0gc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgYnVmZmVyQmFzZSA9IGJhc2UgPyB0aGlzLnN0YWNrW2Jhc2UgLSAxXSA6IDAsIGNvdW50ID0gdGhpcy5idWZmZXJCYXNlICsgdGhpcy5idWZmZXIubGVuZ3RoIC0gYnVmZmVyQmFzZTtcbiAgICAgICAgLy8gU3RvcmUgbm9ybWFsIHRlcm1zIG9yIGBSIC0+IFIgUmAgcmVwZWF0IHJlZHVjdGlvbnNcbiAgICAgICAgaWYgKHR5cGUgPCBwYXJzZXIubWluUmVwZWF0VGVybSB8fCAoYWN0aW9uICYgMTMxMDcyIC8qIEFjdGlvbi5SZXBlYXRGbGFnICovKSkge1xuICAgICAgICAgICAgbGV0IHBvcyA9IHBhcnNlci5zdGF0ZUZsYWcodGhpcy5zdGF0ZSwgMSAvKiBTdGF0ZUZsYWcuU2tpcHBlZCAqLykgPyB0aGlzLnBvcyA6IHRoaXMucmVkdWNlUG9zO1xuICAgICAgICAgICAgdGhpcy5zdG9yZU5vZGUodHlwZSwgc3RhcnQsIHBvcywgY291bnQgKyA0LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aW9uICYgMjYyMTQ0IC8qIEFjdGlvbi5TdGF5RmxhZyAqLykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhY2tbYmFzZV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgYmFzZVN0YXRlSUQgPSB0aGlzLnN0YWNrW2Jhc2UgLSAzXTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBwYXJzZXIuZ2V0R290byhiYXNlU3RhdGVJRCwgdHlwZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhY2subGVuZ3RoID4gYmFzZSlcbiAgICAgICAgICAgIHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICAgIHRoaXMucmVkdWNlQ29udGV4dCh0eXBlLCBzdGFydCk7XG4gICAgfVxuICAgIC8vIFNoaWZ0IGEgdmFsdWUgaW50byB0aGUgYnVmZmVyXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdG9yZU5vZGUodGVybSwgc3RhcnQsIGVuZCwgc2l6ZSA9IDQsIGlzUmVkdWNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRlcm0gPT0gMCAvKiBUZXJtLkVyciAqLyAmJlxuICAgICAgICAgICAgKCF0aGlzLnN0YWNrLmxlbmd0aCB8fCB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0gPCB0aGlzLmJ1ZmZlci5sZW5ndGggKyB0aGlzLmJ1ZmZlckJhc2UpKSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gb21pdC9tZXJnZSBhZGphY2VudCBlcnJvciBub2Rlc1xuICAgICAgICAgICAgbGV0IGN1ciA9IHRoaXMsIHRvcCA9IHRoaXMuYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICh0b3AgPT0gMCAmJiBjdXIucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgdG9wID0gY3VyLmJ1ZmZlckJhc2UgLSBjdXIucGFyZW50LmJ1ZmZlckJhc2U7XG4gICAgICAgICAgICAgICAgY3VyID0gY3VyLnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b3AgPiAwICYmIGN1ci5idWZmZXJbdG9wIC0gNF0gPT0gMCAvKiBUZXJtLkVyciAqLyAmJiBjdXIuYnVmZmVyW3RvcCAtIDFdID4gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGN1ci5idWZmZXJbdG9wIC0gMl0gPj0gc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyLmJ1ZmZlclt0b3AgLSAyXSA9IGVuZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzUmVkdWNlIHx8IHRoaXMucG9zID09IGVuZCkgeyAvLyBTaW1wbGUgY2FzZSwganVzdCBhcHBlbmRcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2godGVybSwgc3RhcnQsIGVuZCwgc2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIFRoZXJlIG1heSBiZSBza2lwcGVkIG5vZGVzIHRoYXQgaGF2ZSB0byBiZSBtb3ZlZCBmb3J3YXJkXG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwICYmIHRoaXMuYnVmZmVyW2luZGV4IC0gNF0gIT0gMCAvKiBUZXJtLkVyciAqLylcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPiAwICYmIHRoaXMuYnVmZmVyW2luZGV4IC0gMl0gPiBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSB0aGlzIHJlY29yZCBmb3J3YXJkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyW2luZGV4XSA9IHRoaXMuYnVmZmVyW2luZGV4IC0gNF07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyW2luZGV4ICsgMV0gPSB0aGlzLmJ1ZmZlcltpbmRleCAtIDNdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlcltpbmRleCArIDJdID0gdGhpcy5idWZmZXJbaW5kZXggLSAyXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJbaW5kZXggKyAzXSA9IHRoaXMuYnVmZmVyW2luZGV4IC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGluZGV4IC09IDQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gNClcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLT0gNDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlcltpbmRleF0gPSB0ZXJtO1xuICAgICAgICAgICAgdGhpcy5idWZmZXJbaW5kZXggKyAxXSA9IHN0YXJ0O1xuICAgICAgICAgICAgdGhpcy5idWZmZXJbaW5kZXggKyAyXSA9IGVuZDtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyW2luZGV4ICsgM10gPSBzaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEFwcGx5IGEgc2hpZnQgYWN0aW9uXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzaGlmdChhY3Rpb24sIHR5cGUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKGFjdGlvbiAmIDEzMTA3MiAvKiBBY3Rpb24uR290b0ZsYWcgKi8pIHtcbiAgICAgICAgICAgIHRoaXMucHVzaFN0YXRlKGFjdGlvbiAmIDY1NTM1IC8qIEFjdGlvbi5WYWx1ZU1hc2sgKi8sIHRoaXMucG9zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoYWN0aW9uICYgMjYyMTQ0IC8qIEFjdGlvbi5TdGF5RmxhZyAqLykgPT0gMCkgeyAvLyBSZWd1bGFyIHNoaWZ0XG4gICAgICAgICAgICBsZXQgbmV4dFN0YXRlID0gYWN0aW9uLCB7IHBhcnNlciB9ID0gdGhpcy5wO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHRoaXMucG9zIHx8IHR5cGUgPD0gcGFyc2VyLm1heE5vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlci5zdGF0ZUZsYWcobmV4dFN0YXRlLCAxIC8qIFN0YXRlRmxhZy5Ta2lwcGVkICovKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWR1Y2VQb3MgPSBlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnB1c2hTdGF0ZShuZXh0U3RhdGUsIHN0YXJ0KTtcbiAgICAgICAgICAgIHRoaXMuc2hpZnRDb250ZXh0KHR5cGUsIHN0YXJ0KTtcbiAgICAgICAgICAgIGlmICh0eXBlIDw9IHBhcnNlci5tYXhOb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2godHlwZSwgc3RhcnQsIGVuZCwgNCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIFNoaWZ0LWFuZC1zdGF5LCB3aGljaCBtZWFucyB0aGlzIGlzIGEgc2tpcHBlZCB0b2tlblxuICAgICAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgICAgICB0aGlzLnNoaWZ0Q29udGV4dCh0eXBlLCBzdGFydCk7XG4gICAgICAgICAgICBpZiAodHlwZSA8PSB0aGlzLnAucGFyc2VyLm1heE5vZGUpXG4gICAgICAgICAgICAgICAgdGhpcy5idWZmZXIucHVzaCh0eXBlLCBzdGFydCwgZW5kLCA0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBcHBseSBhbiBhY3Rpb25cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFwcGx5KGFjdGlvbiwgbmV4dCwgbmV4dFN0YXJ0LCBuZXh0RW5kKSB7XG4gICAgICAgIGlmIChhY3Rpb24gJiA2NTUzNiAvKiBBY3Rpb24uUmVkdWNlRmxhZyAqLylcbiAgICAgICAgICAgIHRoaXMucmVkdWNlKGFjdGlvbik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuc2hpZnQoYWN0aW9uLCBuZXh0LCBuZXh0U3RhcnQsIG5leHRFbmQpO1xuICAgIH1cbiAgICAvLyBBZGQgYSBwcmVidWlsdCAocmV1c2VkKSBub2RlIGludG8gdGhlIGJ1ZmZlci5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHVzZU5vZGUodmFsdWUsIG5leHQpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5wLnJldXNlZC5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IHRoaXMucC5yZXVzZWRbaW5kZXhdICE9IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnAucmV1c2VkLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5yZWR1Y2VQb3MgPSB0aGlzLnBvcyA9IHN0YXJ0ICsgdmFsdWUubGVuZ3RoO1xuICAgICAgICB0aGlzLnB1c2hTdGF0ZShuZXh0LCBzdGFydCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLnB1c2goaW5kZXgsIHN0YXJ0LCB0aGlzLnJlZHVjZVBvcywgLTEgLyogc2l6ZSA9PSAtMSBtZWFucyB0aGlzIGlzIGEgcmV1c2VkIHZhbHVlICovKTtcbiAgICAgICAgaWYgKHRoaXMuY3VyQ29udGV4dClcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGV4dCh0aGlzLmN1ckNvbnRleHQudHJhY2tlci5yZXVzZSh0aGlzLmN1ckNvbnRleHQuY29udGV4dCwgdmFsdWUsIHRoaXMsIHRoaXMucC5zdHJlYW0ucmVzZXQodGhpcy5wb3MgLSB2YWx1ZS5sZW5ndGgpKSk7XG4gICAgfVxuICAgIC8vIFNwbGl0IHRoZSBzdGFjay4gRHVlIHRvIHRoZSBidWZmZXIgc2hhcmluZyBhbmQgdGhlIGZhY3RcbiAgICAvLyB0aGF0IGB0aGlzLnN0YWNrYCB0ZW5kcyB0byBzdGF5IHF1aXRlIHNoYWxsb3csIHRoaXMgaXNuJ3QgdmVyeVxuICAgIC8vIGV4cGVuc2l2ZS5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNwbGl0KCkge1xuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcztcbiAgICAgICAgbGV0IG9mZiA9IHBhcmVudC5idWZmZXIubGVuZ3RoO1xuICAgICAgICAvLyBCZWNhdXNlIHRoZSB0b3Agb2YgdGhlIGJ1ZmZlciAoYWZ0ZXIgdGhpcy5wb3MpIG1heSBiZSBtdXRhdGVkXG4gICAgICAgIC8vIHRvIHJlb3JkZXIgcmVkdWN0aW9ucyBhbmQgc2tpcHBlZCB0b2tlbnMsIGFuZCBzaGFyZWQgYnVmZmVyc1xuICAgICAgICAvLyBzaG91bGQgYmUgaW1tdXRhYmxlLCB0aGlzIGNvcGllcyBhbnkgb3V0c3RhbmRpbmcgc2tpcHBlZCB0b2tlbnNcbiAgICAgICAgLy8gdG8gdGhlIG5ldyBidWZmZXIsIGFuZCBwdXRzIHRoZSBiYXNlIHBvaW50ZXIgYmVmb3JlIHRoZW0uXG4gICAgICAgIHdoaWxlIChvZmYgPiAwICYmIHBhcmVudC5idWZmZXJbb2ZmIC0gMl0gPiBwYXJlbnQucmVkdWNlUG9zKVxuICAgICAgICAgICAgb2ZmIC09IDQ7XG4gICAgICAgIGxldCBidWZmZXIgPSBwYXJlbnQuYnVmZmVyLnNsaWNlKG9mZiksIGJhc2UgPSBwYXJlbnQuYnVmZmVyQmFzZSArIG9mZjtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHBhcmVudCBwb2ludHMgdG8gYW4gYWN0dWFsIHBhcmVudCB3aXRoIGNvbnRlbnQsIGlmIHRoZXJlIGlzIHN1Y2ggYSBwYXJlbnQuXG4gICAgICAgIHdoaWxlIChwYXJlbnQgJiYgYmFzZSA9PSBwYXJlbnQuYnVmZmVyQmFzZSlcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgICAgIHJldHVybiBuZXcgU3RhY2sodGhpcy5wLCB0aGlzLnN0YWNrLnNsaWNlKCksIHRoaXMuc3RhdGUsIHRoaXMucmVkdWNlUG9zLCB0aGlzLnBvcywgdGhpcy5zY29yZSwgYnVmZmVyLCBiYXNlLCB0aGlzLmN1ckNvbnRleHQsIHRoaXMubG9va0FoZWFkLCBwYXJlbnQpO1xuICAgIH1cbiAgICAvLyBUcnkgdG8gcmVjb3ZlciBmcm9tIGFuIGVycm9yIGJ5ICdkZWxldGluZycgKGlnbm9yaW5nKSBvbmUgdG9rZW4uXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZWNvdmVyQnlEZWxldGUobmV4dCwgbmV4dEVuZCkge1xuICAgICAgICBsZXQgaXNOb2RlID0gbmV4dCA8PSB0aGlzLnAucGFyc2VyLm1heE5vZGU7XG4gICAgICAgIGlmIChpc05vZGUpXG4gICAgICAgICAgICB0aGlzLnN0b3JlTm9kZShuZXh0LCB0aGlzLnBvcywgbmV4dEVuZCwgNCk7XG4gICAgICAgIHRoaXMuc3RvcmVOb2RlKDAgLyogVGVybS5FcnIgKi8sIHRoaXMucG9zLCBuZXh0RW5kLCBpc05vZGUgPyA4IDogNCk7XG4gICAgICAgIHRoaXMucG9zID0gdGhpcy5yZWR1Y2VQb3MgPSBuZXh0RW5kO1xuICAgICAgICB0aGlzLnNjb3JlIC09IDE5MCAvKiBSZWNvdmVyLkRlbGV0ZSAqLztcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgaWYgdGhlIGdpdmVuIHRlcm0gd291bGQgYmUgYWJsZSB0byBiZSBzaGlmdGVkIChvcHRpb25hbGx5XG4gICAgYWZ0ZXIgc29tZSByZWR1Y3Rpb25zKSBvbiB0aGlzIHN0YWNrLiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yXG4gICAgZXh0ZXJuYWwgdG9rZW5pemVycyB0aGF0IHdhbnQgdG8gbWFrZSBzdXJlIHRoZXkgb25seSBwcm92aWRlIGFcbiAgICBnaXZlbiB0b2tlbiB3aGVuIGl0IGFwcGxpZXMuXG4gICAgKi9cbiAgICBjYW5TaGlmdCh0ZXJtKSB7XG4gICAgICAgIGZvciAobGV0IHNpbSA9IG5ldyBTaW11bGF0ZWRTdGFjayh0aGlzKTs7KSB7XG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gdGhpcy5wLnBhcnNlci5zdGF0ZVNsb3Qoc2ltLnN0YXRlLCA0IC8qIFBhcnNlU3RhdGUuRGVmYXVsdFJlZHVjZSAqLykgfHwgdGhpcy5wLnBhcnNlci5oYXNBY3Rpb24oc2ltLnN0YXRlLCB0ZXJtKTtcbiAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoKGFjdGlvbiAmIDY1NTM2IC8qIEFjdGlvbi5SZWR1Y2VGbGFnICovKSA9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgc2ltLnJlZHVjZShhY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEFwcGx5IHVwIHRvIFJlY292ZXIuTWF4TmV4dCByZWNvdmVyeSBhY3Rpb25zIHRoYXQgY29uY2VwdHVhbGx5XG4gICAgLy8gaW5zZXJ0cyBzb21lIG1pc3NpbmcgdG9rZW4gb3IgcnVsZS5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlY292ZXJCeUluc2VydChuZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA+PSAzMDAgLyogUmVjb3Zlci5NYXhJbnNlcnRTdGFja0RlcHRoICovKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICBsZXQgbmV4dFN0YXRlcyA9IHRoaXMucC5wYXJzZXIubmV4dFN0YXRlcyh0aGlzLnN0YXRlKTtcbiAgICAgICAgaWYgKG5leHRTdGF0ZXMubGVuZ3RoID4gNCAvKiBSZWNvdmVyLk1heE5leHQgKi8gPDwgMSB8fCB0aGlzLnN0YWNrLmxlbmd0aCA+PSAxMjAgLyogUmVjb3Zlci5EYW1wZW5JbnNlcnRTdGFja0RlcHRoICovKSB7XG4gICAgICAgICAgICBsZXQgYmVzdCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHM7IGkgPCBuZXh0U3RhdGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKChzID0gbmV4dFN0YXRlc1tpICsgMV0pICE9IHRoaXMuc3RhdGUgJiYgdGhpcy5wLnBhcnNlci5oYXNBY3Rpb24ocywgbmV4dCkpXG4gICAgICAgICAgICAgICAgICAgIGJlc3QucHVzaChuZXh0U3RhdGVzW2ldLCBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDEyMCAvKiBSZWNvdmVyLkRhbXBlbkluc2VydFN0YWNrRGVwdGggKi8pXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGJlc3QubGVuZ3RoIDwgNCAvKiBSZWNvdmVyLk1heE5leHQgKi8gPDwgMSAmJiBpIDwgbmV4dFN0YXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcyA9IG5leHRTdGF0ZXNbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJlc3Quc29tZSgodiwgaSkgPT4gKGkgJiAxKSAmJiB2ID09IHMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdC5wdXNoKG5leHRTdGF0ZXNbaV0sIHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHRTdGF0ZXMgPSBiZXN0O1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXh0U3RhdGVzLmxlbmd0aCAmJiByZXN1bHQubGVuZ3RoIDwgNCAvKiBSZWNvdmVyLk1heE5leHQgKi87IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IHMgPSBuZXh0U3RhdGVzW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChzID09IHRoaXMuc3RhdGUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc3RhY2sgPSB0aGlzLnNwbGl0KCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoU3RhdGUocywgdGhpcy5wb3MpO1xuICAgICAgICAgICAgc3RhY2suc3RvcmVOb2RlKDAgLyogVGVybS5FcnIgKi8sIHN0YWNrLnBvcywgc3RhY2sucG9zLCA0LCB0cnVlKTtcbiAgICAgICAgICAgIHN0YWNrLnNoaWZ0Q29udGV4dChuZXh0U3RhdGVzW2ldLCB0aGlzLnBvcyk7XG4gICAgICAgICAgICBzdGFjay5yZWR1Y2VQb3MgPSB0aGlzLnBvcztcbiAgICAgICAgICAgIHN0YWNrLnNjb3JlIC09IDIwMCAvKiBSZWNvdmVyLkluc2VydCAqLztcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBGb3JjZSBhIHJlZHVjZSwgaWYgcG9zc2libGUuIFJldHVybiBmYWxzZSBpZiB0aGF0IGNhbid0XG4gICAgLy8gYmUgZG9uZS5cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZvcmNlUmVkdWNlKCkge1xuICAgICAgICBsZXQgeyBwYXJzZXIgfSA9IHRoaXMucDtcbiAgICAgICAgbGV0IHJlZHVjZSA9IHBhcnNlci5zdGF0ZVNsb3QodGhpcy5zdGF0ZSwgNSAvKiBQYXJzZVN0YXRlLkZvcmNlZFJlZHVjZSAqLyk7XG4gICAgICAgIGlmICgocmVkdWNlICYgNjU1MzYgLyogQWN0aW9uLlJlZHVjZUZsYWcgKi8pID09IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghcGFyc2VyLnZhbGlkQWN0aW9uKHRoaXMuc3RhdGUsIHJlZHVjZSkpIHtcbiAgICAgICAgICAgIGxldCBkZXB0aCA9IHJlZHVjZSA+PiAxOSAvKiBBY3Rpb24uUmVkdWNlRGVwdGhTaGlmdCAqLywgdGVybSA9IHJlZHVjZSAmIDY1NTM1IC8qIEFjdGlvbi5WYWx1ZU1hc2sgKi87XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5zdGFjay5sZW5ndGggLSBkZXB0aCAqIDM7XG4gICAgICAgICAgICBpZiAodGFyZ2V0IDwgMCB8fCBwYXJzZXIuZ2V0R290byh0aGlzLnN0YWNrW3RhcmdldF0sIHRlcm0sIGZhbHNlKSA8IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgYmFja3VwID0gdGhpcy5maW5kRm9yY2VkUmVkdWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKGJhY2t1cCA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVkdWNlID0gYmFja3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdG9yZU5vZGUoMCAvKiBUZXJtLkVyciAqLywgdGhpcy5wb3MsIHRoaXMucG9zLCA0LCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc2NvcmUgLT0gMTAwIC8qIFJlY292ZXIuUmVkdWNlICovO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVkdWNlUG9zID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucmVkdWNlKHJlZHVjZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnkgdG8gc2NhbiB0aHJvdWdoIHRoZSBhdXRvbWF0b24gdG8gZmluZCBzb21lIGtpbmQgb2YgcmVkdWN0aW9uXG4gICAgdGhhdCBjYW4gYmUgYXBwbGllZC4gVXNlZCB3aGVuIHRoZSByZWd1bGFyIEZvcmNlZFJlZHVjZSBmaWVsZFxuICAgIGlzbid0IGEgdmFsaWQgYWN0aW9uLiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbmRGb3JjZWRSZWR1Y3Rpb24oKSB7XG4gICAgICAgIGxldCB7IHBhcnNlciB9ID0gdGhpcy5wLCBzZWVuID0gW107XG4gICAgICAgIGxldCBleHBsb3JlID0gKHN0YXRlLCBkZXB0aCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNlZW4uaW5jbHVkZXMoc3RhdGUpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHNlZW4ucHVzaChzdGF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VyLmFsbEFjdGlvbnMoc3RhdGUsIChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uICYgKDI2MjE0NCAvKiBBY3Rpb24uU3RheUZsYWcgKi8gfCAxMzEwNzIgLyogQWN0aW9uLkdvdG9GbGFnICovKSkgO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFjdGlvbiAmIDY1NTM2IC8qIEFjdGlvbi5SZWR1Y2VGbGFnICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByRGVwdGggPSAoYWN0aW9uID4+IDE5IC8qIEFjdGlvbi5SZWR1Y2VEZXB0aFNoaWZ0ICovKSAtIGRlcHRoO1xuICAgICAgICAgICAgICAgICAgICBpZiAockRlcHRoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlcm0gPSBhY3Rpb24gJiA2NTUzNSAvKiBBY3Rpb24uVmFsdWVNYXNrICovLCB0YXJnZXQgPSB0aGlzLnN0YWNrLmxlbmd0aCAtIHJEZXB0aCAqIDM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID49IDAgJiYgcGFyc2VyLmdldEdvdG8odGhpcy5zdGFja1t0YXJnZXRdLCB0ZXJtLCBmYWxzZSkgPj0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJEZXB0aCA8PCAxOSAvKiBBY3Rpb24uUmVkdWNlRGVwdGhTaGlmdCAqLykgfCA2NTUzNiAvKiBBY3Rpb24uUmVkdWNlRmxhZyAqLyB8IHRlcm07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGV4cGxvcmUoYWN0aW9uLCBkZXB0aCArIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGV4cGxvcmUodGhpcy5zdGF0ZSwgMCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZm9yY2VBbGwoKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy5wLnBhcnNlci5zdGF0ZUZsYWcodGhpcy5zdGF0ZSwgMiAvKiBTdGF0ZUZsYWcuQWNjZXB0aW5nICovKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZvcmNlUmVkdWNlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlTm9kZSgwIC8qIFRlcm0uRXJyICovLCB0aGlzLnBvcywgdGhpcy5wb3MsIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoaXMgc3RhdGUgaGFzIG5vIGZ1cnRoZXIgYWN0aW9ucyAoYXNzdW1lZCB0byBiZSBhIGRpcmVjdCBkZXNjZW5kYW50IG9mIHRoZVxuICAgIHRvcCBzdGF0ZSwgc2luY2UgYW55IG90aGVyIHN0YXRlcyBtdXN0IGJlIGFibGUgdG8gY29udGludWVcbiAgICBzb21laG93KS4gQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgZGVhZEVuZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoICE9IDMpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCB7IHBhcnNlciB9ID0gdGhpcy5wO1xuICAgICAgICByZXR1cm4gcGFyc2VyLmRhdGFbcGFyc2VyLnN0YXRlU2xvdCh0aGlzLnN0YXRlLCAxIC8qIFBhcnNlU3RhdGUuQWN0aW9ucyAqLyldID09IDY1NTM1IC8qIFNlcS5FbmQgKi8gJiZcbiAgICAgICAgICAgICFwYXJzZXIuc3RhdGVTbG90KHRoaXMuc3RhdGUsIDQgLyogUGFyc2VTdGF0ZS5EZWZhdWx0UmVkdWNlICovKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVzdGFydCB0aGUgc3RhY2sgKHB1dCBpdCBiYWNrIGluIGl0cyBzdGFydCBzdGF0ZSkuIE9ubHkgc2FmZVxuICAgIHdoZW4gdGhpcy5zdGFjay5sZW5ndGggPT0gMyAoc3RhdGUgaXMgZGlyZWN0bHkgYmVsb3cgdGhlIHRvcFxuICAgIHN0YXRlKS4gQGludGVybmFsXG4gICAgKi9cbiAgICByZXN0YXJ0KCkge1xuICAgICAgICB0aGlzLnN0b3JlTm9kZSgwIC8qIFRlcm0uRXJyICovLCB0aGlzLnBvcywgdGhpcy5wb3MsIDQsIHRydWUpO1xuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGFja1swXTtcbiAgICAgICAgdGhpcy5zdGFjay5sZW5ndGggPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNhbWVTdGF0ZShvdGhlcikge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPSBvdGhlci5zdGF0ZSB8fCB0aGlzLnN0YWNrLmxlbmd0aCAhPSBvdGhlci5zdGFjay5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGFjay5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrW2ldICE9IG90aGVyLnN0YWNrW2ldKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgcGFyc2VyIHVzZWQgYnkgdGhpcyBzdGFjay5cbiAgICAqL1xuICAgIGdldCBwYXJzZXIoKSB7IHJldHVybiB0aGlzLnAucGFyc2VyOyB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIGEgZ2l2ZW4gZGlhbGVjdCAoYnkgbnVtZXJpYyBJRCwgYXMgZXhwb3J0ZWQgZnJvbVxuICAgIHRoZSB0ZXJtcyBmaWxlKSBpcyBlbmFibGVkLlxuICAgICovXG4gICAgZGlhbGVjdEVuYWJsZWQoZGlhbGVjdElEKSB7IHJldHVybiB0aGlzLnAucGFyc2VyLmRpYWxlY3QuZmxhZ3NbZGlhbGVjdElEXTsgfVxuICAgIHNoaWZ0Q29udGV4dCh0ZXJtLCBzdGFydCkge1xuICAgICAgICBpZiAodGhpcy5jdXJDb250ZXh0KVxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb250ZXh0KHRoaXMuY3VyQ29udGV4dC50cmFja2VyLnNoaWZ0KHRoaXMuY3VyQ29udGV4dC5jb250ZXh0LCB0ZXJtLCB0aGlzLCB0aGlzLnAuc3RyZWFtLnJlc2V0KHN0YXJ0KSkpO1xuICAgIH1cbiAgICByZWR1Y2VDb250ZXh0KHRlcm0sIHN0YXJ0KSB7XG4gICAgICAgIGlmICh0aGlzLmN1ckNvbnRleHQpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRleHQodGhpcy5jdXJDb250ZXh0LnRyYWNrZXIucmVkdWNlKHRoaXMuY3VyQ29udGV4dC5jb250ZXh0LCB0ZXJtLCB0aGlzLCB0aGlzLnAuc3RyZWFtLnJlc2V0KHN0YXJ0KSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGVtaXRDb250ZXh0KCkge1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuYnVmZmVyLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChsYXN0IDwgMCB8fCB0aGlzLmJ1ZmZlcltsYXN0XSAhPSAtMylcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2godGhpcy5jdXJDb250ZXh0Lmhhc2gsIHRoaXMucG9zLCB0aGlzLnBvcywgLTMpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGVtaXRMb29rQWhlYWQoKSB7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5idWZmZXIubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGxhc3QgPCAwIHx8IHRoaXMuYnVmZmVyW2xhc3RdICE9IC00KVxuICAgICAgICAgICAgdGhpcy5idWZmZXIucHVzaCh0aGlzLmxvb2tBaGVhZCwgdGhpcy5wb3MsIHRoaXMucG9zLCAtNCk7XG4gICAgfVxuICAgIHVwZGF0ZUNvbnRleHQoY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCAhPSB0aGlzLmN1ckNvbnRleHQuY29udGV4dCkge1xuICAgICAgICAgICAgbGV0IG5ld0N4ID0gbmV3IFN0YWNrQ29udGV4dCh0aGlzLmN1ckNvbnRleHQudHJhY2tlciwgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAobmV3Q3guaGFzaCAhPSB0aGlzLmN1ckNvbnRleHQuaGFzaClcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDb250ZXh0KCk7XG4gICAgICAgICAgICB0aGlzLmN1ckNvbnRleHQgPSBuZXdDeDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNldExvb2tBaGVhZChsb29rQWhlYWQpIHtcbiAgICAgICAgaWYgKGxvb2tBaGVhZCA+IHRoaXMubG9va0FoZWFkKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRMb29rQWhlYWQoKTtcbiAgICAgICAgICAgIHRoaXMubG9va0FoZWFkID0gbG9va0FoZWFkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1ckNvbnRleHQgJiYgdGhpcy5jdXJDb250ZXh0LnRyYWNrZXIuc3RyaWN0KVxuICAgICAgICAgICAgdGhpcy5lbWl0Q29udGV4dCgpO1xuICAgICAgICBpZiAodGhpcy5sb29rQWhlYWQgPiAwKVxuICAgICAgICAgICAgdGhpcy5lbWl0TG9va0FoZWFkKCk7XG4gICAgfVxufVxuY2xhc3MgU3RhY2tDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3Rvcih0cmFja2VyLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMudHJhY2tlciA9IHRyYWNrZXI7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuaGFzaCA9IHRyYWNrZXIuc3RyaWN0ID8gdHJhY2tlci5oYXNoKGNvbnRleHQpIDogMDtcbiAgICB9XG59XG4vLyBVc2VkIHRvIGNoZWFwbHkgcnVuIHNvbWUgcmVkdWN0aW9ucyB0byBzY2FuIGFoZWFkIHdpdGhvdXQgbXV0YXRpbmdcbi8vIGFuIGVudGlyZSBzdGFja1xuY2xhc3MgU2ltdWxhdGVkU3RhY2sge1xuICAgIGNvbnN0cnVjdG9yKHN0YXJ0KSB7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXJ0LnN0YXRlO1xuICAgICAgICB0aGlzLnN0YWNrID0gc3RhcnQuc3RhY2s7XG4gICAgICAgIHRoaXMuYmFzZSA9IHRoaXMuc3RhY2subGVuZ3RoO1xuICAgIH1cbiAgICByZWR1Y2UoYWN0aW9uKSB7XG4gICAgICAgIGxldCB0ZXJtID0gYWN0aW9uICYgNjU1MzUgLyogQWN0aW9uLlZhbHVlTWFzayAqLywgZGVwdGggPSBhY3Rpb24gPj4gMTkgLyogQWN0aW9uLlJlZHVjZURlcHRoU2hpZnQgKi87XG4gICAgICAgIGlmIChkZXB0aCA9PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGFjayA9PSB0aGlzLnN0YXJ0LnN0YWNrKVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSB0aGlzLnN0YWNrLnNsaWNlKCk7XG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5zdGF0ZSwgMCwgMCk7XG4gICAgICAgICAgICB0aGlzLmJhc2UgKz0gMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYmFzZSAtPSAoZGVwdGggLSAxKSAqIDM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGdvdG8gPSB0aGlzLnN0YXJ0LnAucGFyc2VyLmdldEdvdG8odGhpcy5zdGFja1t0aGlzLmJhc2UgLSAzXSwgdGVybSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBnb3RvO1xuICAgIH1cbn1cbi8vIFRoaXMgaXMgZ2l2ZW4gdG8gYFRyZWUuYnVpbGRgIHRvIGJ1aWxkIGEgYnVmZmVyLCBhbmQgZW5jYXBzdWxhdGVzXG4vLyB0aGUgcGFyZW50LXN0YWNrLXdhbGtpbmcgbmVjZXNzYXJ5IHRvIHJlYWQgdGhlIG5vZGVzLlxuY2xhc3MgU3RhY2tCdWZmZXJDdXJzb3Ige1xuICAgIGNvbnN0cnVjdG9yKHN0YWNrLCBwb3MsIGluZGV4KSB7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBzdGFjay5idWZmZXI7XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID09IDApXG4gICAgICAgICAgICB0aGlzLm1heWJlTmV4dCgpO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKHN0YWNrLCBwb3MgPSBzdGFjay5idWZmZXJCYXNlICsgc3RhY2suYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFN0YWNrQnVmZmVyQ3Vyc29yKHN0YWNrLCBwb3MsIHBvcyAtIHN0YWNrLmJ1ZmZlckJhc2UpO1xuICAgIH1cbiAgICBtYXliZU5leHQoKSB7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5zdGFjay5wYXJlbnQ7XG4gICAgICAgIGlmIChuZXh0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXggPSB0aGlzLnN0YWNrLmJ1ZmZlckJhc2UgLSBuZXh0LmJ1ZmZlckJhc2U7XG4gICAgICAgICAgICB0aGlzLnN0YWNrID0gbmV4dDtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbmV4dC5idWZmZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlkKCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDRdOyB9XG4gICAgZ2V0IHN0YXJ0KCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDNdOyB9XG4gICAgZ2V0IGVuZCgpIHsgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuaW5kZXggLSAyXTsgfVxuICAgIGdldCBzaXplKCkgeyByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5pbmRleCAtIDFdOyB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgdGhpcy5pbmRleCAtPSA0O1xuICAgICAgICB0aGlzLnBvcyAtPSA0O1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PSAwKVxuICAgICAgICAgICAgdGhpcy5tYXliZU5leHQoKTtcbiAgICB9XG4gICAgZm9yaygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFja0J1ZmZlckN1cnNvcih0aGlzLnN0YWNrLCB0aGlzLnBvcywgdGhpcy5pbmRleCk7XG4gICAgfVxufVxuXG4vLyBTZWUgbGV6ZXItZ2VuZXJhdG9yL3NyYy9lbmNvZGUudHMgZm9yIGNvbW1lbnRzIGFib3V0IHRoZSBlbmNvZGluZ1xuLy8gdXNlZCBoZXJlXG5mdW5jdGlvbiBkZWNvZGVBcnJheShpbnB1dCwgVHlwZSA9IFVpbnQxNkFycmF5KSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCAhPSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgbGV0IGFycmF5ID0gbnVsbDtcbiAgICBmb3IgKGxldCBwb3MgPSAwLCBvdXQgPSAwOyBwb3MgPCBpbnB1dC5sZW5ndGg7KSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gaW5wdXQuY2hhckNvZGVBdChwb3MrKyksIHN0b3AgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChuZXh0ID09IDEyNiAvKiBFbmNvZGUuQmlnVmFsQ29kZSAqLykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gNjU1MzUgLyogRW5jb2RlLkJpZ1ZhbCAqLztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0ID49IDkyIC8qIEVuY29kZS5HYXAyICovKVxuICAgICAgICAgICAgICAgIG5leHQtLTtcbiAgICAgICAgICAgIGlmIChuZXh0ID49IDM0IC8qIEVuY29kZS5HYXAxICovKVxuICAgICAgICAgICAgICAgIG5leHQtLTtcbiAgICAgICAgICAgIGxldCBkaWdpdCA9IG5leHQgLSAzMiAvKiBFbmNvZGUuU3RhcnQgKi87XG4gICAgICAgICAgICBpZiAoZGlnaXQgPj0gNDYgLyogRW5jb2RlLkJhc2UgKi8pIHtcbiAgICAgICAgICAgICAgICBkaWdpdCAtPSA0NiAvKiBFbmNvZGUuQmFzZSAqLztcbiAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlICs9IGRpZ2l0O1xuICAgICAgICAgICAgaWYgKHN0b3ApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB2YWx1ZSAqPSA0NiAvKiBFbmNvZGUuQmFzZSAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJyYXkpXG4gICAgICAgICAgICBhcnJheVtvdXQrK10gPSB2YWx1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYXJyYXkgPSBuZXcgVHlwZSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbn1cblxuY2xhc3MgQ2FjaGVkVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMudmFsdWUgPSAtMTtcbiAgICAgICAgdGhpcy5lbmQgPSAtMTtcbiAgICAgICAgdGhpcy5leHRlbmRlZCA9IC0xO1xuICAgICAgICB0aGlzLmxvb2tBaGVhZCA9IDA7XG4gICAgICAgIHRoaXMubWFzayA9IDA7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IDA7XG4gICAgfVxufVxuY29uc3QgbnVsbFRva2VuID0gbmV3IENhY2hlZFRva2VuO1xuLyoqXG5bVG9rZW5pemVyc10oI2xyLkV4dGVybmFsVG9rZW5pemVyKSBpbnRlcmFjdCB3aXRoIHRoZSBpbnB1dFxudGhyb3VnaCB0aGlzIGludGVyZmFjZS4gSXQgcHJlc2VudHMgdGhlIGlucHV0IGFzIGEgc3RyZWFtIG9mXG5jaGFyYWN0ZXJzLCB0cmFja2luZyBsb29rYWhlYWQgYW5kIGhpZGluZyB0aGUgY29tcGxleGl0eSBvZlxuW3Jhbmdlc10oI2NvbW1vbi5QYXJzZXIucGFyc2VecmFuZ2VzKSBmcm9tIHRva2VuaXplciBjb2RlLlxuKi9cbmNsYXNzIElucHV0U3RyZWFtIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaW5wdXQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmFuZ2VzKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaHVuayA9IFwiXCI7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaHVua09mZiA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICBCYWNrdXAgY2h1bmtcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaHVuazIgPSBcIlwiO1xuICAgICAgICB0aGlzLmNodW5rMlBvcyA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgY2hhcmFjdGVyIGNvZGUgb2YgdGhlIG5leHQgY29kZSB1bml0IGluIHRoZSBpbnB1dCwgb3IgLTFcbiAgICAgICAgd2hlbiB0aGUgc3RyZWFtIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0LlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm5leHQgPSAtMTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnRva2VuID0gbnVsbFRva2VuO1xuICAgICAgICB0aGlzLnJhbmdlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnBvcyA9IHRoaXMuY2h1bmtQb3MgPSByYW5nZXNbMF0uZnJvbTtcbiAgICAgICAgdGhpcy5yYW5nZSA9IHJhbmdlc1swXTtcbiAgICAgICAgdGhpcy5lbmQgPSByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdLnRvO1xuICAgICAgICB0aGlzLnJlYWROZXh0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzb2x2ZU9mZnNldChvZmZzZXQsIGFzc29jKSB7XG4gICAgICAgIGxldCByYW5nZSA9IHRoaXMucmFuZ2UsIGluZGV4ID0gdGhpcy5yYW5nZUluZGV4O1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5wb3MgKyBvZmZzZXQ7XG4gICAgICAgIHdoaWxlIChwb3MgPCByYW5nZS5mcm9tKSB7XG4gICAgICAgICAgICBpZiAoIWluZGV4KVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLnJhbmdlc1stLWluZGV4XTtcbiAgICAgICAgICAgIHBvcyAtPSByYW5nZS5mcm9tIC0gbmV4dC50bztcbiAgICAgICAgICAgIHJhbmdlID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoYXNzb2MgPCAwID8gcG9zID4gcmFuZ2UudG8gOiBwb3MgPj0gcmFuZ2UudG8pIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PSB0aGlzLnJhbmdlcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLnJhbmdlc1srK2luZGV4XTtcbiAgICAgICAgICAgIHBvcyArPSBuZXh0LmZyb20gLSByYW5nZS50bztcbiAgICAgICAgICAgIHJhbmdlID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNsaXBQb3MocG9zKSB7XG4gICAgICAgIGlmIChwb3MgPj0gdGhpcy5yYW5nZS5mcm9tICYmIHBvcyA8IHRoaXMucmFuZ2UudG8pXG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICBmb3IgKGxldCByYW5nZSBvZiB0aGlzLnJhbmdlcylcbiAgICAgICAgICAgIGlmIChyYW5nZS50byA+IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgocG9zLCByYW5nZS5mcm9tKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kO1xuICAgIH1cbiAgICAvKipcbiAgICBMb29rIGF0IGEgY29kZSB1bml0IG5lYXIgdGhlIHN0cmVhbSBwb3NpdGlvbi4gYC5wZWVrKDApYCBlcXVhbHNcbiAgICBgLm5leHRgLCBgLnBlZWsoLTEpYCBnaXZlcyB5b3UgdGhlIHByZXZpb3VzIGNoYXJhY3RlciwgYW5kIHNvXG4gICAgb24uXG4gICAgXG4gICAgTm90ZSB0aGF0IGxvb2tpbmcgYXJvdW5kIGR1cmluZyB0b2tlbml6aW5nIGNyZWF0ZXMgZGVwZW5kZW5jaWVzXG4gICAgb24gcG90ZW50aWFsbHkgZmFyLWF3YXkgY29udGVudCwgd2hpY2ggbWF5IHJlZHVjZSB0aGVcbiAgICBlZmZlY3RpdmVuZXNzIGluY3JlbWVudGFsIHBhcnNpbmdcdTIwMTR3aGVuIGxvb2tpbmcgZm9yd2FyZFx1MjAxNG9yIGV2ZW5cbiAgICBjYXVzZSBpbnZhbGlkIHJlcGFyc2VzIHdoZW4gbG9va2luZyBiYWNrd2FyZCBtb3JlIHRoYW4gMjUgY29kZVxuICAgIHVuaXRzLCBzaW5jZSB0aGUgbGlicmFyeSBkb2VzIG5vdCB0cmFjayBsb29rYmVoaW5kLlxuICAgICovXG4gICAgcGVlayhvZmZzZXQpIHtcbiAgICAgICAgbGV0IGlkeCA9IHRoaXMuY2h1bmtPZmYgKyBvZmZzZXQsIHBvcywgcmVzdWx0O1xuICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDwgdGhpcy5jaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBvcyA9IHRoaXMucG9zICsgb2Zmc2V0O1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5jaHVuay5jaGFyQ29kZUF0KGlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVPZmZzZXQob2Zmc2V0LCAxKTtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIHBvcyA9IHJlc29sdmVkO1xuICAgICAgICAgICAgaWYgKHBvcyA+PSB0aGlzLmNodW5rMlBvcyAmJiBwb3MgPCB0aGlzLmNodW5rMlBvcyArIHRoaXMuY2h1bmsyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuY2h1bmsyLmNoYXJDb2RlQXQocG9zIC0gdGhpcy5jaHVuazJQb3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSB0aGlzLnJhbmdlSW5kZXgsIHJhbmdlID0gdGhpcy5yYW5nZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocmFuZ2UudG8gPD0gcG9zKVxuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMucmFuZ2VzWysraV07XG4gICAgICAgICAgICAgICAgdGhpcy5jaHVuazIgPSB0aGlzLmlucHV0LmNodW5rKHRoaXMuY2h1bmsyUG9zID0gcG9zKTtcbiAgICAgICAgICAgICAgICBpZiAocG9zICsgdGhpcy5jaHVuazIubGVuZ3RoID4gcmFuZ2UudG8pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2h1bmsyID0gdGhpcy5jaHVuazIuc2xpY2UoMCwgcmFuZ2UudG8gLSBwb3MpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuY2h1bmsyLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA+PSB0aGlzLnRva2VuLmxvb2tBaGVhZClcbiAgICAgICAgICAgIHRoaXMudG9rZW4ubG9va0FoZWFkID0gcG9zICsgMTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQWNjZXB0IGEgdG9rZW4uIEJ5IGRlZmF1bHQsIHRoZSBlbmQgb2YgdGhlIHRva2VuIGlzIHNldCB0byB0aGVcbiAgICBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiwgYnV0IHlvdSBjYW4gcGFzcyBhbiBvZmZzZXQgKHJlbGF0aXZlIHRvXG4gICAgdGhlIHN0cmVhbSBwb3NpdGlvbikgdG8gY2hhbmdlIHRoYXQuXG4gICAgKi9cbiAgICBhY2NlcHRUb2tlbih0b2tlbiwgZW5kT2Zmc2V0ID0gMCkge1xuICAgICAgICBsZXQgZW5kID0gZW5kT2Zmc2V0ID8gdGhpcy5yZXNvbHZlT2Zmc2V0KGVuZE9mZnNldCwgLTEpIDogdGhpcy5wb3M7XG4gICAgICAgIGlmIChlbmQgPT0gbnVsbCB8fCBlbmQgPCB0aGlzLnRva2VuLnN0YXJ0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUb2tlbiBlbmQgb3V0IG9mIGJvdW5kc1wiKTtcbiAgICAgICAgdGhpcy50b2tlbi52YWx1ZSA9IHRva2VuO1xuICAgICAgICB0aGlzLnRva2VuLmVuZCA9IGVuZDtcbiAgICB9XG4gICAgZ2V0Q2h1bmsoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmNodW5rMlBvcyAmJiB0aGlzLnBvcyA8IHRoaXMuY2h1bmsyUG9zICsgdGhpcy5jaHVuazIubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgeyBjaHVuaywgY2h1bmtQb3MgfSA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmNodW5rID0gdGhpcy5jaHVuazI7XG4gICAgICAgICAgICB0aGlzLmNodW5rUG9zID0gdGhpcy5jaHVuazJQb3M7XG4gICAgICAgICAgICB0aGlzLmNodW5rMiA9IGNodW5rO1xuICAgICAgICAgICAgdGhpcy5jaHVuazJQb3MgPSBjaHVua1BvcztcbiAgICAgICAgICAgIHRoaXMuY2h1bmtPZmYgPSB0aGlzLnBvcyAtIHRoaXMuY2h1bmtQb3M7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNodW5rMiA9IHRoaXMuY2h1bms7XG4gICAgICAgICAgICB0aGlzLmNodW5rMlBvcyA9IHRoaXMuY2h1bmtQb3M7XG4gICAgICAgICAgICBsZXQgbmV4dENodW5rID0gdGhpcy5pbnB1dC5jaHVuayh0aGlzLnBvcyk7XG4gICAgICAgICAgICBsZXQgZW5kID0gdGhpcy5wb3MgKyBuZXh0Q2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5jaHVuayA9IGVuZCA+IHRoaXMucmFuZ2UudG8gPyBuZXh0Q2h1bmsuc2xpY2UoMCwgdGhpcy5yYW5nZS50byAtIHRoaXMucG9zKSA6IG5leHRDaHVuaztcbiAgICAgICAgICAgIHRoaXMuY2h1bmtQb3MgPSB0aGlzLnBvcztcbiAgICAgICAgICAgIHRoaXMuY2h1bmtPZmYgPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlYWROZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5jaHVua09mZiA+PSB0aGlzLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5nZXRDaHVuaygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2h1bmtPZmYgPT0gdGhpcy5jaHVuay5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQgPSB0aGlzLmNodW5rLmNoYXJDb2RlQXQodGhpcy5jaHVua09mZik7XG4gICAgfVxuICAgIC8qKlxuICAgIE1vdmUgdGhlIHN0cmVhbSBmb3J3YXJkIE4gKGRlZmF1bHRzIHRvIDEpIGNvZGUgdW5pdHMuIFJldHVybnNcbiAgICB0aGUgbmV3IHZhbHVlIG9mIFtgbmV4dGBdKCNsci5JbnB1dFN0cmVhbS5uZXh0KS5cbiAgICAqL1xuICAgIGFkdmFuY2UobiA9IDEpIHtcbiAgICAgICAgdGhpcy5jaHVua09mZiArPSBuO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgKyBuID49IHRoaXMucmFuZ2UudG8pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlSW5kZXggPT0gdGhpcy5yYW5nZXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXREb25lKCk7XG4gICAgICAgICAgICBuIC09IHRoaXMucmFuZ2UudG8gLSB0aGlzLnBvcztcbiAgICAgICAgICAgIHRoaXMucmFuZ2UgPSB0aGlzLnJhbmdlc1srK3RoaXMucmFuZ2VJbmRleF07XG4gICAgICAgICAgICB0aGlzLnBvcyA9IHRoaXMucmFuZ2UuZnJvbTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcyArPSBuO1xuICAgICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy50b2tlbi5sb29rQWhlYWQpXG4gICAgICAgICAgICB0aGlzLnRva2VuLmxvb2tBaGVhZCA9IHRoaXMucG9zICsgMTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZE5leHQoKTtcbiAgICB9XG4gICAgc2V0RG9uZSgpIHtcbiAgICAgICAgdGhpcy5wb3MgPSB0aGlzLmNodW5rUG9zID0gdGhpcy5lbmQ7XG4gICAgICAgIHRoaXMucmFuZ2UgPSB0aGlzLnJhbmdlc1t0aGlzLnJhbmdlSW5kZXggPSB0aGlzLnJhbmdlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgdGhpcy5jaHVuayA9IFwiXCI7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQgPSAtMTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZXNldChwb3MsIHRva2VuKSB7XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgdG9rZW4uc3RhcnQgPSBwb3M7XG4gICAgICAgICAgICB0b2tlbi5sb29rQWhlYWQgPSBwb3MgKyAxO1xuICAgICAgICAgICAgdG9rZW4udmFsdWUgPSB0b2tlbi5leHRlbmRlZCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IG51bGxUb2tlbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wb3MgIT0gcG9zKSB7XG4gICAgICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgICAgIGlmIChwb3MgPT0gdGhpcy5lbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERvbmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChwb3MgPCB0aGlzLnJhbmdlLmZyb20pXG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZSA9IHRoaXMucmFuZ2VzWy0tdGhpcy5yYW5nZUluZGV4XTtcbiAgICAgICAgICAgIHdoaWxlIChwb3MgPj0gdGhpcy5yYW5nZS50bylcbiAgICAgICAgICAgICAgICB0aGlzLnJhbmdlID0gdGhpcy5yYW5nZXNbKyt0aGlzLnJhbmdlSW5kZXhdO1xuICAgICAgICAgICAgaWYgKHBvcyA+PSB0aGlzLmNodW5rUG9zICYmIHBvcyA8IHRoaXMuY2h1bmtQb3MgKyB0aGlzLmNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtPZmYgPSBwb3MgLSB0aGlzLmNodW5rUG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaHVuayA9IFwiXCI7XG4gICAgICAgICAgICAgICAgdGhpcy5jaHVua09mZiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWROZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVhZChmcm9tLCB0bykge1xuICAgICAgICBpZiAoZnJvbSA+PSB0aGlzLmNodW5rUG9zICYmIHRvIDw9IHRoaXMuY2h1bmtQb3MgKyB0aGlzLmNodW5rLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNodW5rLnNsaWNlKGZyb20gLSB0aGlzLmNodW5rUG9zLCB0byAtIHRoaXMuY2h1bmtQb3MpO1xuICAgICAgICBpZiAoZnJvbSA+PSB0aGlzLmNodW5rMlBvcyAmJiB0byA8PSB0aGlzLmNodW5rMlBvcyArIHRoaXMuY2h1bmsyLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNodW5rMi5zbGljZShmcm9tIC0gdGhpcy5jaHVuazJQb3MsIHRvIC0gdGhpcy5jaHVuazJQb3MpO1xuICAgICAgICBpZiAoZnJvbSA+PSB0aGlzLnJhbmdlLmZyb20gJiYgdG8gPD0gdGhpcy5yYW5nZS50bylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0LnJlYWQoZnJvbSwgdG8pO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgciBvZiB0aGlzLnJhbmdlcykge1xuICAgICAgICAgICAgaWYgKHIuZnJvbSA+PSB0bylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChyLnRvID4gZnJvbSlcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5pbnB1dC5yZWFkKE1hdGgubWF4KHIuZnJvbSwgZnJvbSksIE1hdGgubWluKHIudG8sIHRvKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbkBpbnRlcm5hbFxuKi9cbmNsYXNzIFRva2VuR3JvdXAge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEsIGlkKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICB9XG4gICAgdG9rZW4oaW5wdXQsIHN0YWNrKSB7XG4gICAgICAgIGxldCB7IHBhcnNlciB9ID0gc3RhY2sucDtcbiAgICAgICAgcmVhZFRva2VuKHRoaXMuZGF0YSwgaW5wdXQsIHN0YWNrLCB0aGlzLmlkLCBwYXJzZXIuZGF0YSwgcGFyc2VyLnRva2VuUHJlY1RhYmxlKTtcbiAgICB9XG59XG5Ub2tlbkdyb3VwLnByb3RvdHlwZS5jb250ZXh0dWFsID0gVG9rZW5Hcm91cC5wcm90b3R5cGUuZmFsbGJhY2sgPSBUb2tlbkdyb3VwLnByb3RvdHlwZS5leHRlbmQgPSBmYWxzZTtcbi8qKlxuQGhpZGVcbiovXG5jbGFzcyBMb2NhbFRva2VuR3JvdXAge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHByZWNUYWJsZSwgZWxzZVRva2VuKSB7XG4gICAgICAgIHRoaXMucHJlY1RhYmxlID0gcHJlY1RhYmxlO1xuICAgICAgICB0aGlzLmVsc2VUb2tlbiA9IGVsc2VUb2tlbjtcbiAgICAgICAgdGhpcy5kYXRhID0gdHlwZW9mIGRhdGEgPT0gXCJzdHJpbmdcIiA/IGRlY29kZUFycmF5KGRhdGEpIDogZGF0YTtcbiAgICB9XG4gICAgdG9rZW4oaW5wdXQsIHN0YWNrKSB7XG4gICAgICAgIGxldCBzdGFydCA9IGlucHV0LnBvcywgc2tpcHBlZCA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBhdEVvZiA9IGlucHV0Lm5leHQgPCAwLCBuZXh0UG9zID0gaW5wdXQucmVzb2x2ZU9mZnNldCgxLCAxKTtcbiAgICAgICAgICAgIHJlYWRUb2tlbih0aGlzLmRhdGEsIGlucHV0LCBzdGFjaywgMCwgdGhpcy5kYXRhLCB0aGlzLnByZWNUYWJsZSk7XG4gICAgICAgICAgICBpZiAoaW5wdXQudG9rZW4udmFsdWUgPiAtMSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICh0aGlzLmVsc2VUb2tlbiA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmICghYXRFb2YpXG4gICAgICAgICAgICAgICAgc2tpcHBlZCsrO1xuICAgICAgICAgICAgaWYgKG5leHRQb3MgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlucHV0LnJlc2V0KG5leHRQb3MsIGlucHV0LnRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2tpcHBlZCkge1xuICAgICAgICAgICAgaW5wdXQucmVzZXQoc3RhcnQsIGlucHV0LnRva2VuKTtcbiAgICAgICAgICAgIGlucHV0LmFjY2VwdFRva2VuKHRoaXMuZWxzZVRva2VuLCBza2lwcGVkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkxvY2FsVG9rZW5Hcm91cC5wcm90b3R5cGUuY29udGV4dHVhbCA9IFRva2VuR3JvdXAucHJvdG90eXBlLmZhbGxiYWNrID0gVG9rZW5Hcm91cC5wcm90b3R5cGUuZXh0ZW5kID0gZmFsc2U7XG4vKipcbmBAZXh0ZXJuYWwgdG9rZW5zYCBkZWNsYXJhdGlvbnMgaW4gdGhlIGdyYW1tYXIgc2hvdWxkIHJlc29sdmUgdG9cbmFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuXG4qL1xuY2xhc3MgRXh0ZXJuYWxUb2tlbml6ZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHRva2VuaXplci4gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBmdW5jdGlvbiB0aGF0LFxuICAgIGdpdmVuIGFuIGlucHV0IHN0cmVhbSwgc2NhbnMgZm9yIHRoZSB0eXBlcyBvZiB0b2tlbnMgaXRcbiAgICByZWNvZ25pemVzIGF0IHRoZSBzdHJlYW0ncyBwb3NpdGlvbiwgYW5kIGNhbGxzXG4gICAgW2BhY2NlcHRUb2tlbmBdKCNsci5JbnB1dFN0cmVhbS5hY2NlcHRUb2tlbikgd2hlbiBpdCBmaW5kc1xuICAgIG9uZS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9rZW4sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgICAgIHRoaXMuY29udGV4dHVhbCA9ICEhb3B0aW9ucy5jb250ZXh0dWFsO1xuICAgICAgICB0aGlzLmZhbGxiYWNrID0gISFvcHRpb25zLmZhbGxiYWNrO1xuICAgICAgICB0aGlzLmV4dGVuZCA9ICEhb3B0aW9ucy5leHRlbmQ7XG4gICAgfVxufVxuLy8gVG9rZW5pemVyIGRhdGEgaXMgc3RvcmVkIGEgYmlnIHVpbnQxNiBhcnJheSBjb250YWluaW5nLCBmb3IgZWFjaFxuLy8gc3RhdGU6XG4vL1xuLy8gIC0gQSBncm91cCBiaXRtYXNrLCBpbmRpY2F0aW5nIHdoYXQgdG9rZW4gZ3JvdXBzIGFyZSByZWFjaGFibGUgZnJvbVxuLy8gICAgdGhpcyBzdGF0ZSwgc28gdGhhdCBwYXRocyB0aGF0IGNhbiBvbmx5IGxlYWQgdG8gdG9rZW5zIG5vdCBpblxuLy8gICAgYW55IG9mIHRoZSBjdXJyZW50IGdyb3VwcyBjYW4gYmUgY3V0IG9mZiBlYXJseS5cbi8vXG4vLyAgLSBUaGUgcG9zaXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgc3RhdGUncyBzZXF1ZW5jZSBvZiBhY2NlcHRpbmdcbi8vICAgIHRva2Vuc1xuLy9cbi8vICAtIFRoZSBudW1iZXIgb2Ygb3V0Z29pbmcgZWRnZXMgZm9yIHRoZSBzdGF0ZVxuLy9cbi8vICAtIFRoZSBhY2NlcHRpbmcgdG9rZW5zLCBhcyAodG9rZW4gaWQsIGdyb3VwIG1hc2spIHBhaXJzXG4vL1xuLy8gIC0gVGhlIG91dGdvaW5nIGVkZ2VzLCBhcyAoc3RhcnQgY2hhcmFjdGVyLCBlbmQgY2hhcmFjdGVyLCBzdGF0ZVxuLy8gICAgaW5kZXgpIHRyaXBsZXMsIHdpdGggZW5kIGNoYXJhY3RlciBiZWluZyBleGNsdXNpdmVcbi8vXG4vLyBUaGlzIGZ1bmN0aW9uIGludGVycHJldHMgdGhhdCBkYXRhLCBydW5uaW5nIHRocm91Z2ggYSBzdHJlYW0gYXNcbi8vIGxvbmcgYXMgbmV3IHN0YXRlcyB3aXRoIHRoZSBhIG1hdGNoaW5nIGdyb3VwIG1hc2sgY2FuIGJlIHJlYWNoZWQsXG4vLyBhbmQgdXBkYXRpbmcgYGlucHV0LnRva2VuYCB3aGVuIGl0IG1hdGNoZXMgYSB0b2tlbi5cbmZ1bmN0aW9uIHJlYWRUb2tlbihkYXRhLCBpbnB1dCwgc3RhY2ssIGdyb3VwLCBwcmVjVGFibGUsIHByZWNPZmZzZXQpIHtcbiAgICBsZXQgc3RhdGUgPSAwLCBncm91cE1hc2sgPSAxIDw8IGdyb3VwLCB7IGRpYWxlY3QgfSA9IHN0YWNrLnAucGFyc2VyO1xuICAgIHNjYW46IGZvciAoOzspIHtcbiAgICAgICAgaWYgKChncm91cE1hc2sgJiBkYXRhW3N0YXRlXSkgPT0gMClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBsZXQgYWNjRW5kID0gZGF0YVtzdGF0ZSArIDFdO1xuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoaXMgc3RhdGUgY2FuIGxlYWQgdG8gYSB0b2tlbiBpbiB0aGUgY3VycmVudCBncm91cFxuICAgICAgICAvLyBBY2NlcHQgdG9rZW5zIGluIHRoaXMgc3RhdGUsIHBvc3NpYmx5IG92ZXJ3cml0aW5nXG4gICAgICAgIC8vIGxvd2VyLXByZWNlZGVuY2UgLyBzaG9ydGVyIHRva2Vuc1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhdGUgKyAzOyBpIDwgYWNjRW5kOyBpICs9IDIpXG4gICAgICAgICAgICBpZiAoKGRhdGFbaSArIDFdICYgZ3JvdXBNYXNrKSA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVybSA9IGRhdGFbaV07XG4gICAgICAgICAgICAgICAgaWYgKGRpYWxlY3QuYWxsb3dzKHRlcm0pICYmXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dC50b2tlbi52YWx1ZSA9PSAtMSB8fCBpbnB1dC50b2tlbi52YWx1ZSA9PSB0ZXJtIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZXModGVybSwgaW5wdXQudG9rZW4udmFsdWUsIHByZWNUYWJsZSwgcHJlY09mZnNldCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0LmFjY2VwdFRva2VuKHRlcm0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0ID0gaW5wdXQubmV4dCwgbG93ID0gMCwgaGlnaCA9IGRhdGFbc3RhdGUgKyAyXTtcbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBFT0ZcbiAgICAgICAgaWYgKGlucHV0Lm5leHQgPCAwICYmIGhpZ2ggPiBsb3cgJiYgZGF0YVthY2NFbmQgKyBoaWdoICogMyAtIDNdID09IDY1NTM1IC8qIFNlcS5FbmQgKi8pIHtcbiAgICAgICAgICAgIHN0YXRlID0gZGF0YVthY2NFbmQgKyBoaWdoICogMyAtIDFdO1xuICAgICAgICAgICAgY29udGludWUgc2NhbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBEbyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIHN0YXRlJ3MgZWRnZXNcbiAgICAgICAgZm9yICg7IGxvdyA8IGhpZ2g7KSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gKGxvdyArIGhpZ2gpID4+IDE7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBhY2NFbmQgKyBtaWQgKyAobWlkIDw8IDEpO1xuICAgICAgICAgICAgbGV0IGZyb20gPSBkYXRhW2luZGV4XSwgdG8gPSBkYXRhW2luZGV4ICsgMV0gfHwgMHgxMDAwMDtcbiAgICAgICAgICAgIGlmIChuZXh0IDwgZnJvbSlcbiAgICAgICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA+PSB0bylcbiAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhdGUgPSBkYXRhW2luZGV4ICsgMl07XG4gICAgICAgICAgICAgICAgaW5wdXQuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlIHNjYW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxufVxuZnVuY3Rpb24gZmluZE9mZnNldChkYXRhLCBzdGFydCwgdGVybSkge1xuICAgIGZvciAobGV0IGkgPSBzdGFydCwgbmV4dDsgKG5leHQgPSBkYXRhW2ldKSAhPSA2NTUzNSAvKiBTZXEuRW5kICovOyBpKyspXG4gICAgICAgIGlmIChuZXh0ID09IHRlcm0pXG4gICAgICAgICAgICByZXR1cm4gaSAtIHN0YXJ0O1xuICAgIHJldHVybiAtMTtcbn1cbmZ1bmN0aW9uIG92ZXJyaWRlcyh0b2tlbiwgcHJldiwgdGFibGVEYXRhLCB0YWJsZU9mZnNldCkge1xuICAgIGxldCBpUHJldiA9IGZpbmRPZmZzZXQodGFibGVEYXRhLCB0YWJsZU9mZnNldCwgcHJldik7XG4gICAgcmV0dXJuIGlQcmV2IDwgMCB8fCBmaW5kT2Zmc2V0KHRhYmxlRGF0YSwgdGFibGVPZmZzZXQsIHRva2VuKSA8IGlQcmV2O1xufVxuXG4vLyBFbnZpcm9ubWVudCB2YXJpYWJsZSB1c2VkIHRvIGNvbnRyb2wgY29uc29sZSBvdXRwdXRcbmNvbnN0IHZlcmJvc2UgPSB0eXBlb2YgcHJvY2VzcyAhPSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52ICYmIC9cXGJwYXJzZVxcYi8udGVzdChwcm9jZXNzLmVudi5MT0cpO1xubGV0IHN0YWNrSURzID0gbnVsbDtcbmZ1bmN0aW9uIGN1dEF0KHRyZWUsIHBvcywgc2lkZSkge1xuICAgIGxldCBjdXJzb3IgPSB0cmVlLmN1cnNvcihJdGVyTW9kZS5JbmNsdWRlQW5vbnltb3VzKTtcbiAgICBjdXJzb3IubW92ZVRvKHBvcyk7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoIShzaWRlIDwgMCA/IGN1cnNvci5jaGlsZEJlZm9yZShwb3MpIDogY3Vyc29yLmNoaWxkQWZ0ZXIocG9zKSkpXG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgaWYgKChzaWRlIDwgMCA/IGN1cnNvci50byA8IHBvcyA6IGN1cnNvci5mcm9tID4gcG9zKSAmJiAhY3Vyc29yLnR5cGUuaXNFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZGUgPCAwID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oY3Vyc29yLnRvIC0gMSwgcG9zIC0gMjUgLyogU2FmZXR5Lk1hcmdpbiAqLykpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IE1hdGgubWluKHRyZWUubGVuZ3RoLCBNYXRoLm1heChjdXJzb3IuZnJvbSArIDEsIHBvcyArIDI1IC8qIFNhZmV0eS5NYXJnaW4gKi8pKTtcbiAgICAgICAgICAgICAgICBpZiAoc2lkZSA8IDAgPyBjdXJzb3IucHJldlNpYmxpbmcoKSA6IGN1cnNvci5uZXh0U2libGluZygpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5wYXJlbnQoKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZGUgPCAwID8gMCA6IHRyZWUubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIEZyYWdtZW50Q3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihmcmFnbWVudHMsIG5vZGVTZXQpIHtcbiAgICAgICAgdGhpcy5mcmFnbWVudHMgPSBmcmFnbWVudHM7XG4gICAgICAgIHRoaXMubm9kZVNldCA9IG5vZGVTZXQ7XG4gICAgICAgIHRoaXMuaSA9IDA7XG4gICAgICAgIHRoaXMuZnJhZ21lbnQgPSBudWxsO1xuICAgICAgICB0aGlzLnNhZmVGcm9tID0gLTE7XG4gICAgICAgIHRoaXMuc2FmZVRvID0gLTE7XG4gICAgICAgIHRoaXMudHJlZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zdGFydCA9IFtdO1xuICAgICAgICB0aGlzLmluZGV4ID0gW107XG4gICAgICAgIHRoaXMubmV4dEZyYWdtZW50KCk7XG4gICAgfVxuICAgIG5leHRGcmFnbWVudCgpIHtcbiAgICAgICAgbGV0IGZyID0gdGhpcy5mcmFnbWVudCA9IHRoaXMuaSA9PSB0aGlzLmZyYWdtZW50cy5sZW5ndGggPyBudWxsIDogdGhpcy5mcmFnbWVudHNbdGhpcy5pKytdO1xuICAgICAgICBpZiAoZnIpIHtcbiAgICAgICAgICAgIHRoaXMuc2FmZUZyb20gPSBmci5vcGVuU3RhcnQgPyBjdXRBdChmci50cmVlLCBmci5mcm9tICsgZnIub2Zmc2V0LCAxKSAtIGZyLm9mZnNldCA6IGZyLmZyb207XG4gICAgICAgICAgICB0aGlzLnNhZmVUbyA9IGZyLm9wZW5FbmQgPyBjdXRBdChmci50cmVlLCBmci50byArIGZyLm9mZnNldCwgLTEpIC0gZnIub2Zmc2V0IDogZnIudG87XG4gICAgICAgICAgICB3aGlsZSAodGhpcy50cmVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQucG9wKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleC5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJlZXMucHVzaChmci50cmVlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnQucHVzaCgtZnIub2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXgucHVzaCgwKTtcbiAgICAgICAgICAgIHRoaXMubmV4dFN0YXJ0ID0gdGhpcy5zYWZlRnJvbTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmV4dFN0YXJ0ID0gMWU5O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGBwb3NgIG11c3QgYmUgPj0gYW55IHByZXZpb3VzbHkgZ2l2ZW4gYHBvc2AgZm9yIHRoaXMgY3Vyc29yXG4gICAgbm9kZUF0KHBvcykge1xuICAgICAgICBpZiAocG9zIDwgdGhpcy5uZXh0U3RhcnQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKHRoaXMuZnJhZ21lbnQgJiYgdGhpcy5zYWZlVG8gPD0gcG9zKVxuICAgICAgICAgICAgdGhpcy5uZXh0RnJhZ21lbnQoKTtcbiAgICAgICAgaWYgKCF0aGlzLmZyYWdtZW50KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gdGhpcy50cmVlcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgaWYgKGxhc3QgPCAwKSB7IC8vIEVuZCBvZiB0cmVlXG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0RnJhZ21lbnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0b3AgPSB0aGlzLnRyZWVzW2xhc3RdLCBpbmRleCA9IHRoaXMuaW5kZXhbbGFzdF07XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gdG9wLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJlZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydC5wb3AoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4LnBvcCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG5leHQgPSB0b3AuY2hpbGRyZW5baW5kZXhdO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zdGFydFtsYXN0XSArIHRvcC5wb3NpdGlvbnNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHN0YXJ0ID4gcG9zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RhcnQgPSBzdGFydDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgVHJlZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSBwb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgdGhpcy5zYWZlRnJvbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gc3RhcnQgKyBuZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZCA8PSB0aGlzLnNhZmVUbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxvb2tBaGVhZCA9IG5leHQucHJvcChOb2RlUHJvcC5sb29rQWhlYWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb29rQWhlYWQgfHwgZW5kICsgbG9va0FoZWFkIDwgdGhpcy5mcmFnbWVudC50bylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4W2xhc3RdKys7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICsgbmV4dC5sZW5ndGggPj0gTWF0aC5tYXgodGhpcy5zYWZlRnJvbSwgcG9zKSkgeyAvLyBFbnRlciB0aGlzIG5vZGVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlcy5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0LnB1c2goc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4LnB1c2goMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleFtsYXN0XSsrO1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0YXJ0ID0gc3RhcnQgKyBuZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFRva2VuQ2FjaGUge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlciwgc3RyZWFtKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgICAgICB0aGlzLnRva2VucyA9IFtdO1xuICAgICAgICB0aGlzLm1haW5Ub2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuYWN0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnRva2VucyA9IHBhcnNlci50b2tlbml6ZXJzLm1hcChfID0+IG5ldyBDYWNoZWRUb2tlbik7XG4gICAgfVxuICAgIGdldEFjdGlvbnMoc3RhY2spIHtcbiAgICAgICAgbGV0IGFjdGlvbkluZGV4ID0gMDtcbiAgICAgICAgbGV0IG1haW4gPSBudWxsO1xuICAgICAgICBsZXQgeyBwYXJzZXIgfSA9IHN0YWNrLnAsIHsgdG9rZW5pemVycyB9ID0gcGFyc2VyO1xuICAgICAgICBsZXQgbWFzayA9IHBhcnNlci5zdGF0ZVNsb3Qoc3RhY2suc3RhdGUsIDMgLyogUGFyc2VTdGF0ZS5Ub2tlbml6ZXJNYXNrICovKTtcbiAgICAgICAgbGV0IGNvbnRleHQgPSBzdGFjay5jdXJDb250ZXh0ID8gc3RhY2suY3VyQ29udGV4dC5oYXNoIDogMDtcbiAgICAgICAgbGV0IGxvb2tBaGVhZCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5pemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCgoMSA8PCBpKSAmIG1hc2spID09IDApXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBsZXQgdG9rZW5pemVyID0gdG9rZW5pemVyc1tpXSwgdG9rZW4gPSB0aGlzLnRva2Vuc1tpXTtcbiAgICAgICAgICAgIGlmIChtYWluICYmICF0b2tlbml6ZXIuZmFsbGJhY2spXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAodG9rZW5pemVyLmNvbnRleHR1YWwgfHwgdG9rZW4uc3RhcnQgIT0gc3RhY2sucG9zIHx8IHRva2VuLm1hc2sgIT0gbWFzayB8fCB0b2tlbi5jb250ZXh0ICE9IGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlZFRva2VuKHRva2VuLCB0b2tlbml6ZXIsIHN0YWNrKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5tYXNrID0gbWFzaztcbiAgICAgICAgICAgICAgICB0b2tlbi5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b2tlbi5sb29rQWhlYWQgPiB0b2tlbi5lbmQgKyAyNSAvKiBTYWZldHkuTWFyZ2luICovKVxuICAgICAgICAgICAgICAgIGxvb2tBaGVhZCA9IE1hdGgubWF4KHRva2VuLmxvb2tBaGVhZCwgbG9va0FoZWFkKTtcbiAgICAgICAgICAgIGlmICh0b2tlbi52YWx1ZSAhPSAwIC8qIFRlcm0uRXJyICovKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBhY3Rpb25JbmRleDtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4uZXh0ZW5kZWQgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uSW5kZXggPSB0aGlzLmFkZEFjdGlvbnMoc3RhY2ssIHRva2VuLmV4dGVuZGVkLCB0b2tlbi5lbmQsIGFjdGlvbkluZGV4KTtcbiAgICAgICAgICAgICAgICBhY3Rpb25JbmRleCA9IHRoaXMuYWRkQWN0aW9ucyhzdGFjaywgdG9rZW4udmFsdWUsIHRva2VuLmVuZCwgYWN0aW9uSW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICghdG9rZW5pemVyLmV4dGVuZCkge1xuICAgICAgICAgICAgICAgICAgICBtYWluID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25JbmRleCA+IHN0YXJ0SW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMuYWN0aW9ucy5sZW5ndGggPiBhY3Rpb25JbmRleClcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5wb3AoKTtcbiAgICAgICAgaWYgKGxvb2tBaGVhZClcbiAgICAgICAgICAgIHN0YWNrLnNldExvb2tBaGVhZChsb29rQWhlYWQpO1xuICAgICAgICBpZiAoIW1haW4gJiYgc3RhY2sucG9zID09IHRoaXMuc3RyZWFtLmVuZCkge1xuICAgICAgICAgICAgbWFpbiA9IG5ldyBDYWNoZWRUb2tlbjtcbiAgICAgICAgICAgIG1haW4udmFsdWUgPSBzdGFjay5wLnBhcnNlci5lb2ZUZXJtO1xuICAgICAgICAgICAgbWFpbi5zdGFydCA9IG1haW4uZW5kID0gc3RhY2sucG9zO1xuICAgICAgICAgICAgYWN0aW9uSW5kZXggPSB0aGlzLmFkZEFjdGlvbnMoc3RhY2ssIG1haW4udmFsdWUsIG1haW4uZW5kLCBhY3Rpb25JbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYWluVG9rZW4gPSBtYWluO1xuICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25zO1xuICAgIH1cbiAgICBnZXRNYWluVG9rZW4oc3RhY2spIHtcbiAgICAgICAgaWYgKHRoaXMubWFpblRva2VuKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpblRva2VuO1xuICAgICAgICBsZXQgbWFpbiA9IG5ldyBDYWNoZWRUb2tlbiwgeyBwb3MsIHAgfSA9IHN0YWNrO1xuICAgICAgICBtYWluLnN0YXJ0ID0gcG9zO1xuICAgICAgICBtYWluLmVuZCA9IE1hdGgubWluKHBvcyArIDEsIHAuc3RyZWFtLmVuZCk7XG4gICAgICAgIG1haW4udmFsdWUgPSBwb3MgPT0gcC5zdHJlYW0uZW5kID8gcC5wYXJzZXIuZW9mVGVybSA6IDAgLyogVGVybS5FcnIgKi87XG4gICAgICAgIHJldHVybiBtYWluO1xuICAgIH1cbiAgICB1cGRhdGVDYWNoZWRUb2tlbih0b2tlbiwgdG9rZW5pemVyLCBzdGFjaykge1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnN0cmVhbS5jbGlwUG9zKHN0YWNrLnBvcyk7XG4gICAgICAgIHRva2VuaXplci50b2tlbih0aGlzLnN0cmVhbS5yZXNldChzdGFydCwgdG9rZW4pLCBzdGFjayk7XG4gICAgICAgIGlmICh0b2tlbi52YWx1ZSA+IC0xKSB7XG4gICAgICAgICAgICBsZXQgeyBwYXJzZXIgfSA9IHN0YWNrLnA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlci5zcGVjaWFsaXplZC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VyLnNwZWNpYWxpemVkW2ldID09IHRva2VuLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBwYXJzZXIuc3BlY2lhbGl6ZXJzW2ldKHRoaXMuc3RyZWFtLnJlYWQodG9rZW4uc3RhcnQsIHRva2VuLmVuZCksIHN0YWNrKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA+PSAwICYmIHN0YWNrLnAucGFyc2VyLmRpYWxlY3QuYWxsb3dzKHJlc3VsdCA+PiAxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXN1bHQgJiAxKSA9PSAwIC8qIFNwZWNpYWxpemUuU3BlY2lhbGl6ZSAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9IHJlc3VsdCA+PiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmV4dGVuZGVkID0gcmVzdWx0ID4+IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRva2VuLnZhbHVlID0gMCAvKiBUZXJtLkVyciAqLztcbiAgICAgICAgICAgIHRva2VuLmVuZCA9IHRoaXMuc3RyZWFtLmNsaXBQb3Moc3RhcnQgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdXRBY3Rpb24oYWN0aW9uLCB0b2tlbiwgZW5kLCBpbmRleCkge1xuICAgICAgICAvLyBEb24ndCBhZGQgZHVwbGljYXRlIGFjdGlvbnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleDsgaSArPSAzKVxuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aW9uc1tpXSA9PSBhY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB0aGlzLmFjdGlvbnNbaW5kZXgrK10gPSBhY3Rpb247XG4gICAgICAgIHRoaXMuYWN0aW9uc1tpbmRleCsrXSA9IHRva2VuO1xuICAgICAgICB0aGlzLmFjdGlvbnNbaW5kZXgrK10gPSBlbmQ7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgYWRkQWN0aW9ucyhzdGFjaywgdG9rZW4sIGVuZCwgaW5kZXgpIHtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHN0YWNrLCB7IHBhcnNlciB9ID0gc3RhY2sucCwgeyBkYXRhIH0gPSBwYXJzZXI7XG4gICAgICAgIGZvciAobGV0IHNldCA9IDA7IHNldCA8IDI7IHNldCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyc2VyLnN0YXRlU2xvdChzdGF0ZSwgc2V0ID8gMiAvKiBQYXJzZVN0YXRlLlNraXAgKi8gOiAxIC8qIFBhcnNlU3RhdGUuQWN0aW9ucyAqLyk7OyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVtpXSA9PSA2NTUzNSAvKiBTZXEuRW5kICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhW2kgKyAxXSA9PSAxIC8qIFNlcS5OZXh0ICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gcGFpcihkYXRhLCBpICsgMik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCAmJiBkYXRhW2kgKyAxXSA9PSAyIC8qIFNlcS5PdGhlciAqLylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHRoaXMucHV0QWN0aW9uKHBhaXIoZGF0YSwgaSArIDIpLCB0b2tlbiwgZW5kLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGF0YVtpXSA9PSB0b2tlbilcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSB0aGlzLnB1dEFjdGlvbihwYWlyKGRhdGEsIGkgKyAxKSwgdG9rZW4sIGVuZCwgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG59XG5jbGFzcyBQYXJzZSB7XG4gICAgY29uc3RydWN0b3IocGFyc2VyLCBpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHRoaXMucmVjb3ZlcmluZyA9IDA7XG4gICAgICAgIHRoaXMubmV4dFN0YWNrSUQgPSAweDI2NTQ7IC8vIFx1MjY1NCwgXHUyNjU1LCBcdTI2NTYsIFx1MjY1NywgXHUyNjU4LCBcdTI2NTksIFx1MjY2MCwgXHUyNjYxLCBcdTI2NjIsIFx1MjY2MywgXHUyNjY0LCBcdTI2NjUsIFx1MjY2NiwgXHUyNjY3XG4gICAgICAgIHRoaXMubWluU3RhY2tQb3MgPSAwO1xuICAgICAgICB0aGlzLnJldXNlZCA9IFtdO1xuICAgICAgICB0aGlzLnN0b3BwZWRBdCA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEJpZ1JlZHVjdGlvblN0YXJ0ID0gLTE7XG4gICAgICAgIHRoaXMubGFzdEJpZ1JlZHVjdGlvblNpemUgPSAwO1xuICAgICAgICB0aGlzLmJpZ1JlZHVjdGlvbkNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5zdHJlYW0gPSBuZXcgSW5wdXRTdHJlYW0oaW5wdXQsIHJhbmdlcyk7XG4gICAgICAgIHRoaXMudG9rZW5zID0gbmV3IFRva2VuQ2FjaGUocGFyc2VyLCB0aGlzLnN0cmVhbSk7XG4gICAgICAgIHRoaXMudG9wVGVybSA9IHBhcnNlci50b3BbMV07XG4gICAgICAgIGxldCB7IGZyb20gfSA9IHJhbmdlc1swXTtcbiAgICAgICAgdGhpcy5zdGFja3MgPSBbU3RhY2suc3RhcnQodGhpcywgcGFyc2VyLnRvcFswXSwgZnJvbSldO1xuICAgICAgICB0aGlzLmZyYWdtZW50cyA9IGZyYWdtZW50cy5sZW5ndGggJiYgdGhpcy5zdHJlYW0uZW5kIC0gZnJvbSA+IHBhcnNlci5idWZmZXJMZW5ndGggKiA0XG4gICAgICAgICAgICA/IG5ldyBGcmFnbWVudEN1cnNvcihmcmFnbWVudHMsIHBhcnNlci5ub2RlU2V0KSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBwYXJzZWRQb3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pblN0YWNrUG9zO1xuICAgIH1cbiAgICAvLyBNb3ZlIHRoZSBwYXJzZXIgZm9yd2FyZC4gVGhpcyB3aWxsIHByb2Nlc3MgYWxsIHBhcnNlIHN0YWNrcyBhdFxuICAgIC8vIGB0aGlzLnBvc2AgYW5kIHRyeSB0byBhZHZhbmNlIHRoZW0gdG8gYSBmdXJ0aGVyIHBvc2l0aW9uLiBJZiBub1xuICAgIC8vIHN0YWNrIGZvciBzdWNoIGEgcG9zaXRpb24gaXMgZm91bmQsIGl0J2xsIHN0YXJ0IGVycm9yLXJlY292ZXJ5LlxuICAgIC8vXG4gICAgLy8gV2hlbiB0aGUgcGFyc2UgaXMgZmluaXNoZWQsIHRoaXMgd2lsbCByZXR1cm4gYSBzeW50YXggdHJlZS4gV2hlblxuICAgIC8vIG5vdCwgaXQgcmV0dXJucyBgbnVsbGAuXG4gICAgYWR2YW5jZSgpIHtcbiAgICAgICAgbGV0IHN0YWNrcyA9IHRoaXMuc3RhY2tzLCBwb3MgPSB0aGlzLm1pblN0YWNrUG9zO1xuICAgICAgICAvLyBUaGlzIHdpbGwgaG9sZCBzdGFja3MgYmV5b25kIGBwb3NgLlxuICAgICAgICBsZXQgbmV3U3RhY2tzID0gdGhpcy5zdGFja3MgPSBbXTtcbiAgICAgICAgbGV0IHN0b3BwZWQsIHN0b3BwZWRUb2tlbnM7XG4gICAgICAgIC8vIElmIGEgbGFyZ2UgYW1vdW50IG9mIHJlZHVjdGlvbnMgaGFwcGVuZWQgd2l0aCB0aGUgc2FtZSBzdGFydFxuICAgICAgICAvLyBwb3NpdGlvbiwgZm9yY2UgdGhlIHN0YWNrIG91dCBvZiB0aGF0IHByb2R1Y3Rpb24gaW4gb3JkZXIgdG9cbiAgICAgICAgLy8gYXZvaWQgY3JlYXRpbmcgYSB0cmVlIHRvbyBkZWVwIHRvIHJlY3Vyc2UgdGhyb3VnaC5cbiAgICAgICAgLy8gKFRoaXMgaXMgYW4gdWdseSBrbHVkZ2UsIGJlY2F1c2UgdW5mb3J0dW5hdGVseSB0aGVyZSBpcyBub1xuICAgICAgICAvLyBzdHJhaWdodGZvcndhcmQsIGNoZWFwIHdheSB0byBjaGVjayBmb3IgdGhpcyBoYXBwZW5pbmcsIGR1ZSB0b1xuICAgICAgICAvLyB0aGUgaGlzdG9yeSBvZiByZWR1Y3Rpb25zIG9ubHkgYmVpbmcgYXZhaWxhYmxlIGluIGFuXG4gICAgICAgIC8vIGV4cGVuc2l2ZS10by1hY2Nlc3MgZm9ybWF0IGluIHRoZSBzdGFjayBidWZmZXJzLilcbiAgICAgICAgaWYgKHRoaXMuYmlnUmVkdWN0aW9uQ291bnQgPiAzMDAgLyogUmVjLk1heExlZnRBc3NvY2lhdGl2ZVJlZHVjdGlvbkNvdW50ICovICYmIHN0YWNrcy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgbGV0IFtzXSA9IHN0YWNrcztcbiAgICAgICAgICAgIHdoaWxlIChzLmZvcmNlUmVkdWNlKCkgJiYgcy5zdGFjay5sZW5ndGggJiYgcy5zdGFja1tzLnN0YWNrLmxlbmd0aCAtIDJdID49IHRoaXMubGFzdEJpZ1JlZHVjdGlvblN0YXJ0KSB7IH1cbiAgICAgICAgICAgIHRoaXMuYmlnUmVkdWN0aW9uQ291bnQgPSB0aGlzLmxhc3RCaWdSZWR1Y3Rpb25TaXplID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBLZWVwIGFkdmFuY2luZyBhbnkgc3RhY2tzIGF0IGBwb3NgIHVudGlsIHRoZXkgZWl0aGVyIG1vdmVcbiAgICAgICAgLy8gZm9yd2FyZCBvciBjYW4ndCBiZSBhZHZhbmNlZC4gR2F0aGVyIHN0YWNrcyB0aGF0IGNhbid0IGJlXG4gICAgICAgIC8vIGFkdmFuY2VkIGZ1cnRoZXIgaW4gYHN0b3BwZWRgLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0YWNrID0gc3RhY2tzW2ldO1xuICAgICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zLm1haW5Ub2tlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHN0YWNrLnBvcyA+IHBvcykge1xuICAgICAgICAgICAgICAgICAgICBuZXdTdGFja3MucHVzaChzdGFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuYWR2YW5jZVN0YWNrKHN0YWNrLCBuZXdTdGFja3MsIHN0YWNrcykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BwZWQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BwZWRUb2tlbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdG9wcGVkLnB1c2goc3RhY2spO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG9rID0gdGhpcy50b2tlbnMuZ2V0TWFpblRva2VuKHN0YWNrKTtcbiAgICAgICAgICAgICAgICAgICAgc3RvcHBlZFRva2Vucy5wdXNoKHRvay52YWx1ZSwgdG9rLmVuZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbmV3U3RhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGZpbmlzaGVkID0gc3RvcHBlZCAmJiBmaW5kRmluaXNoZWQoc3RvcHBlZCk7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaW5pc2ggd2l0aCBcIiArIHRoaXMuc3RhY2tJRChmaW5pc2hlZCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YWNrVG9UcmVlKGZpbmlzaGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlci5zdHJpY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSAmJiBzdG9wcGVkKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlN0dWNrIHdpdGggdG9rZW4gXCIgKyAodGhpcy50b2tlbnMubWFpblRva2VuID8gdGhpcy5wYXJzZXIuZ2V0TmFtZSh0aGlzLnRva2Vucy5tYWluVG9rZW4udmFsdWUpIDogXCJub25lXCIpKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJObyBwYXJzZSBhdCBcIiArIHBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVjb3ZlcmluZylcbiAgICAgICAgICAgICAgICB0aGlzLnJlY292ZXJpbmcgPSA1IC8qIFJlYy5EaXN0YW5jZSAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWNvdmVyaW5nICYmIHN0b3BwZWQpIHtcbiAgICAgICAgICAgIGxldCBmaW5pc2hlZCA9IHRoaXMuc3RvcHBlZEF0ICE9IG51bGwgJiYgc3RvcHBlZFswXS5wb3MgPiB0aGlzLnN0b3BwZWRBdCA/IHN0b3BwZWRbMF1cbiAgICAgICAgICAgICAgICA6IHRoaXMucnVuUmVjb3Zlcnkoc3RvcHBlZCwgc3RvcHBlZFRva2VucywgbmV3U3RhY2tzKTtcbiAgICAgICAgICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZvcmNlLWZpbmlzaCBcIiArIHRoaXMuc3RhY2tJRChmaW5pc2hlZCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YWNrVG9UcmVlKGZpbmlzaGVkLmZvcmNlQWxsKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlY292ZXJpbmcpIHtcbiAgICAgICAgICAgIGxldCBtYXhSZW1haW5pbmcgPSB0aGlzLnJlY292ZXJpbmcgPT0gMSA/IDEgOiB0aGlzLnJlY292ZXJpbmcgKiAzIC8qIFJlYy5NYXhSZW1haW5pbmdQZXJTdGVwICovO1xuICAgICAgICAgICAgaWYgKG5ld1N0YWNrcy5sZW5ndGggPiBtYXhSZW1haW5pbmcpIHtcbiAgICAgICAgICAgICAgICBuZXdTdGFja3Muc29ydCgoYSwgYikgPT4gYi5zY29yZSAtIGEuc2NvcmUpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChuZXdTdGFja3MubGVuZ3RoID4gbWF4UmVtYWluaW5nKVxuICAgICAgICAgICAgICAgICAgICBuZXdTdGFja3MucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV3U3RhY2tzLnNvbWUocyA9PiBzLnJlZHVjZVBvcyA+IHBvcykpXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvdmVyaW5nLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmV3U3RhY2tzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIC8vIFBydW5lIHN0YWNrcyB0aGF0IGFyZSBpbiB0aGUgc2FtZSBzdGF0ZSwgb3IgdGhhdCBoYXZlIGJlZW5cbiAgICAgICAgICAgIC8vIHJ1bm5pbmcgd2l0aG91dCBzcGxpdHRpbmcgZm9yIGEgd2hpbGUsIHRvIGF2b2lkIGdldHRpbmcgc3R1Y2tcbiAgICAgICAgICAgIC8vIHdpdGggbXVsdGlwbGUgc3VjY2Vzc2Z1bCBzdGFja3MgcnVubmluZyBlbmRsZXNzbHkgb24uXG4gICAgICAgICAgICBvdXRlcjogZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTdGFja3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YWNrID0gbmV3U3RhY2tzW2ldO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IG5ld1N0YWNrcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3RoZXIgPSBuZXdTdGFja3Nbal07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5zYW1lU3RhdGUob3RoZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5idWZmZXIubGVuZ3RoID4gNTAwIC8qIFJlYy5NaW5CdWZmZXJMZW5ndGhQcnVuZSAqLyAmJiBvdGhlci5idWZmZXIubGVuZ3RoID4gNTAwIC8qIFJlYy5NaW5CdWZmZXJMZW5ndGhQcnVuZSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoc3RhY2suc2NvcmUgLSBvdGhlci5zY29yZSkgfHwgKHN0YWNrLmJ1ZmZlci5sZW5ndGggLSBvdGhlci5idWZmZXIubGVuZ3RoKSkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhY2tzLnNwbGljZShqLS0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhY2tzLnNwbGljZShpLS0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5ld1N0YWNrcy5sZW5ndGggPiAxMiAvKiBSZWMuTWF4U3RhY2tDb3VudCAqLylcbiAgICAgICAgICAgICAgICBuZXdTdGFja3Muc3BsaWNlKDEyIC8qIFJlYy5NYXhTdGFja0NvdW50ICovLCBuZXdTdGFja3MubGVuZ3RoIC0gMTIgLyogUmVjLk1heFN0YWNrQ291bnQgKi8pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWluU3RhY2tQb3MgPSBuZXdTdGFja3NbMF0ucG9zO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG5ld1N0YWNrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChuZXdTdGFja3NbaV0ucG9zIDwgdGhpcy5taW5TdGFja1BvcylcbiAgICAgICAgICAgICAgICB0aGlzLm1pblN0YWNrUG9zID0gbmV3U3RhY2tzW2ldLnBvcztcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHN0b3BBdChwb3MpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RvcHBlZEF0ICE9IG51bGwgJiYgdGhpcy5zdG9wcGVkQXQgPCBwb3MpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNhbid0IG1vdmUgc3RvcHBlZEF0IGZvcndhcmRcIik7XG4gICAgICAgIHRoaXMuc3RvcHBlZEF0ID0gcG9zO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gc3RhY2ssIG9yIG51bGwgaWYgdGhlXG4gICAgLy8gc3RhY2sgY2FuJ3QgYWR2YW5jZSBub3JtYWxseS4gV2hlbiBgc3BsaXRgIGFuZCBgc3RhY2tzYCBhcmVcbiAgICAvLyBnaXZlbiwgc3RhY2tzIHNwbGl0IG9mZiBieSBhbWJpZ3VvdXMgb3BlcmF0aW9ucyB3aWxsIGJlIHB1c2hlZCB0b1xuICAgIC8vIGBzcGxpdGAsIG9yIGFkZGVkIHRvIGBzdGFja3NgIGlmIHRoZXkgbW92ZSBgcG9zYCBmb3J3YXJkLlxuICAgIGFkdmFuY2VTdGFjayhzdGFjaywgc3RhY2tzLCBzcGxpdCkge1xuICAgICAgICBsZXQgc3RhcnQgPSBzdGFjay5wb3MsIHsgcGFyc2VyIH0gPSB0aGlzO1xuICAgICAgICBsZXQgYmFzZSA9IHZlcmJvc2UgPyB0aGlzLnN0YWNrSUQoc3RhY2spICsgXCIgLT4gXCIgOiBcIlwiO1xuICAgICAgICBpZiAodGhpcy5zdG9wcGVkQXQgIT0gbnVsbCAmJiBzdGFydCA+IHRoaXMuc3RvcHBlZEF0KVxuICAgICAgICAgICAgcmV0dXJuIHN0YWNrLmZvcmNlUmVkdWNlKCkgPyBzdGFjayA6IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmZyYWdtZW50cykge1xuICAgICAgICAgICAgbGV0IHN0cmljdEN4ID0gc3RhY2suY3VyQ29udGV4dCAmJiBzdGFjay5jdXJDb250ZXh0LnRyYWNrZXIuc3RyaWN0LCBjeEhhc2ggPSBzdHJpY3RDeCA/IHN0YWNrLmN1ckNvbnRleHQuaGFzaCA6IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBjYWNoZWQgPSB0aGlzLmZyYWdtZW50cy5ub2RlQXQoc3RhcnQpOyBjYWNoZWQ7KSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5wYXJzZXIubm9kZVNldC50eXBlc1tjYWNoZWQudHlwZS5pZF0gPT0gY2FjaGVkLnR5cGUgPyBwYXJzZXIuZ2V0R290byhzdGFjay5zdGF0ZSwgY2FjaGVkLnR5cGUuaWQpIDogLTE7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoID4gLTEgJiYgY2FjaGVkLmxlbmd0aCAmJiAoIXN0cmljdEN4IHx8IChjYWNoZWQucHJvcChOb2RlUHJvcC5jb250ZXh0SGFzaCkgfHwgMCkgPT0gY3hIYXNoKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFjay51c2VOb2RlKGNhY2hlZCwgbWF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGJhc2UgKyB0aGlzLnN0YWNrSUQoc3RhY2spICsgYCAodmlhIHJldXNlIG9mICR7cGFyc2VyLmdldE5hbWUoY2FjaGVkLnR5cGUuaWQpfSlgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghKGNhY2hlZCBpbnN0YW5jZW9mIFRyZWUpIHx8IGNhY2hlZC5jaGlsZHJlbi5sZW5ndGggPT0gMCB8fCBjYWNoZWQucG9zaXRpb25zWzBdID4gMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbGV0IGlubmVyID0gY2FjaGVkLmNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lciBpbnN0YW5jZW9mIFRyZWUgJiYgY2FjaGVkLnBvc2l0aW9uc1swXSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICBjYWNoZWQgPSBpbm5lcjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBkZWZhdWx0UmVkdWNlID0gcGFyc2VyLnN0YXRlU2xvdChzdGFjay5zdGF0ZSwgNCAvKiBQYXJzZVN0YXRlLkRlZmF1bHRSZWR1Y2UgKi8pO1xuICAgICAgICBpZiAoZGVmYXVsdFJlZHVjZSA+IDApIHtcbiAgICAgICAgICAgIHN0YWNrLnJlZHVjZShkZWZhdWx0UmVkdWNlKTtcbiAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGJhc2UgKyB0aGlzLnN0YWNrSUQoc3RhY2spICsgYCAodmlhIGFsd2F5cy1yZWR1Y2UgJHtwYXJzZXIuZ2V0TmFtZShkZWZhdWx0UmVkdWNlICYgNjU1MzUgLyogQWN0aW9uLlZhbHVlTWFzayAqLyl9KWApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YWNrLnN0YWNrLmxlbmd0aCA+PSA4NDAwIC8qIFJlYy5DdXREZXB0aCAqLykge1xuICAgICAgICAgICAgd2hpbGUgKHN0YWNrLnN0YWNrLmxlbmd0aCA+IDYwMDAgLyogUmVjLkN1dFRvICovICYmIHN0YWNrLmZvcmNlUmVkdWNlKCkpIHsgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBhY3Rpb25zID0gdGhpcy50b2tlbnMuZ2V0QWN0aW9ucyhzdGFjayk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7KSB7XG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gYWN0aW9uc1tpKytdLCB0ZXJtID0gYWN0aW9uc1tpKytdLCBlbmQgPSBhY3Rpb25zW2krK107XG4gICAgICAgICAgICBsZXQgbGFzdCA9IGkgPT0gYWN0aW9ucy5sZW5ndGggfHwgIXNwbGl0O1xuICAgICAgICAgICAgbGV0IGxvY2FsU3RhY2sgPSBsYXN0ID8gc3RhY2sgOiBzdGFjay5zcGxpdCgpO1xuICAgICAgICAgICAgbGV0IG1haW4gPSB0aGlzLnRva2Vucy5tYWluVG9rZW47XG4gICAgICAgICAgICBsb2NhbFN0YWNrLmFwcGx5KGFjdGlvbiwgdGVybSwgbWFpbiA/IG1haW4uc3RhcnQgOiBsb2NhbFN0YWNrLnBvcywgZW5kKTtcbiAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGJhc2UgKyB0aGlzLnN0YWNrSUQobG9jYWxTdGFjaykgKyBgICh2aWEgJHsoYWN0aW9uICYgNjU1MzYgLyogQWN0aW9uLlJlZHVjZUZsYWcgKi8pID09IDAgPyBcInNoaWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgOiBgcmVkdWNlIG9mICR7cGFyc2VyLmdldE5hbWUoYWN0aW9uICYgNjU1MzUgLyogQWN0aW9uLlZhbHVlTWFzayAqLyl9YH0gZm9yICR7cGFyc2VyLmdldE5hbWUodGVybSl9IEAgJHtzdGFydH0ke2xvY2FsU3RhY2sgPT0gc3RhY2sgPyBcIlwiIDogXCIsIHNwbGl0XCJ9KWApO1xuICAgICAgICAgICAgaWYgKGxhc3QpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhbFN0YWNrLnBvcyA+IHN0YXJ0KVxuICAgICAgICAgICAgICAgIHN0YWNrcy5wdXNoKGxvY2FsU3RhY2spO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNwbGl0LnB1c2gobG9jYWxTdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBBZHZhbmNlIGEgZ2l2ZW4gc3RhY2sgZm9yd2FyZCBhcyBmYXIgYXMgaXQgd2lsbCBnby4gUmV0dXJucyB0aGVcbiAgICAvLyAocG9zc2libHkgdXBkYXRlZCkgc3RhY2sgaWYgaXQgZ290IHN0dWNrLCBvciBudWxsIGlmIGl0IG1vdmVkXG4gICAgLy8gZm9yd2FyZCBhbmQgd2FzIGdpdmVuIHRvIGBwdXNoU3RhY2tEZWR1cGAuXG4gICAgYWR2YW5jZUZ1bGx5KHN0YWNrLCBuZXdTdGFja3MpIHtcbiAgICAgICAgbGV0IHBvcyA9IHN0YWNrLnBvcztcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFkdmFuY2VTdGFjayhzdGFjaywgbnVsbCwgbnVsbCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKHN0YWNrLnBvcyA+IHBvcykge1xuICAgICAgICAgICAgICAgIHB1c2hTdGFja0RlZHVwKHN0YWNrLCBuZXdTdGFja3MpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJ1blJlY292ZXJ5KHN0YWNrcywgdG9rZW5zLCBuZXdTdGFja3MpIHtcbiAgICAgICAgbGV0IGZpbmlzaGVkID0gbnVsbCwgcmVzdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhY2sgPSBzdGFja3NbaV0sIHRva2VuID0gdG9rZW5zW2kgPDwgMV0sIHRva2VuRW5kID0gdG9rZW5zWyhpIDw8IDEpICsgMV07XG4gICAgICAgICAgICBsZXQgYmFzZSA9IHZlcmJvc2UgPyB0aGlzLnN0YWNrSUQoc3RhY2spICsgXCIgLT4gXCIgOiBcIlwiO1xuICAgICAgICAgICAgaWYgKHN0YWNrLmRlYWRFbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdGFydGVkKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICByZXN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YWNrLnJlc3RhcnQoKTtcbiAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSlcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYmFzZSArIHRoaXMuc3RhY2tJRChzdGFjaykgKyBcIiAocmVzdGFydGVkKVwiKTtcbiAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IHRoaXMuYWR2YW5jZUZ1bGx5KHN0YWNrLCBuZXdTdGFja3MpO1xuICAgICAgICAgICAgICAgIGlmIChkb25lKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmb3JjZSA9IHN0YWNrLnNwbGl0KCksIGZvcmNlQmFzZSA9IGJhc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgZm9yY2UuZm9yY2VSZWR1Y2UoKSAmJiBqIDwgMTAgLyogUmVjLkZvcmNlUmVkdWNlTGltaXQgKi87IGorKykge1xuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhmb3JjZUJhc2UgKyB0aGlzLnN0YWNrSUQoZm9yY2UpICsgXCIgKHZpYSBmb3JjZS1yZWR1Y2UpXCIpO1xuICAgICAgICAgICAgICAgIGxldCBkb25lID0gdGhpcy5hZHZhbmNlRnVsbHkoZm9yY2UsIG5ld1N0YWNrcyk7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgICAgICBmb3JjZUJhc2UgPSB0aGlzLnN0YWNrSUQoZm9yY2UpICsgXCIgLT4gXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpbnNlcnQgb2Ygc3RhY2sucmVjb3ZlckJ5SW5zZXJ0KHRva2VuKSkge1xuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhiYXNlICsgdGhpcy5zdGFja0lEKGluc2VydCkgKyBcIiAodmlhIHJlY292ZXItaW5zZXJ0KVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2VGdWxseShpbnNlcnQsIG5ld1N0YWNrcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zdHJlYW0uZW5kID4gc3RhY2sucG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuRW5kID09IHN0YWNrLnBvcykge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbkVuZCsrO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IDAgLyogVGVybS5FcnIgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YWNrLnJlY292ZXJCeURlbGV0ZSh0b2tlbiwgdG9rZW5FbmQpO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhiYXNlICsgdGhpcy5zdGFja0lEKHN0YWNrKSArIGAgKHZpYSByZWNvdmVyLWRlbGV0ZSAke3RoaXMucGFyc2VyLmdldE5hbWUodG9rZW4pfSlgKTtcbiAgICAgICAgICAgICAgICBwdXNoU3RhY2tEZWR1cChzdGFjaywgbmV3U3RhY2tzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFmaW5pc2hlZCB8fCBmaW5pc2hlZC5zY29yZSA8IHN0YWNrLnNjb3JlKSB7XG4gICAgICAgICAgICAgICAgZmluaXNoZWQgPSBzdGFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluaXNoZWQ7XG4gICAgfVxuICAgIC8vIENvbnZlcnQgdGhlIHN0YWNrJ3MgYnVmZmVyIHRvIGEgc3ludGF4IHRyZWUuXG4gICAgc3RhY2tUb1RyZWUoc3RhY2spIHtcbiAgICAgICAgc3RhY2suY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuIFRyZWUuYnVpbGQoeyBidWZmZXI6IFN0YWNrQnVmZmVyQ3Vyc29yLmNyZWF0ZShzdGFjayksXG4gICAgICAgICAgICBub2RlU2V0OiB0aGlzLnBhcnNlci5ub2RlU2V0LFxuICAgICAgICAgICAgdG9wSUQ6IHRoaXMudG9wVGVybSxcbiAgICAgICAgICAgIG1heEJ1ZmZlckxlbmd0aDogdGhpcy5wYXJzZXIuYnVmZmVyTGVuZ3RoLFxuICAgICAgICAgICAgcmV1c2VkOiB0aGlzLnJldXNlZCxcbiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnJhbmdlc1swXS5mcm9tLFxuICAgICAgICAgICAgbGVuZ3RoOiBzdGFjay5wb3MgLSB0aGlzLnJhbmdlc1swXS5mcm9tLFxuICAgICAgICAgICAgbWluUmVwZWF0VHlwZTogdGhpcy5wYXJzZXIubWluUmVwZWF0VGVybSB9KTtcbiAgICB9XG4gICAgc3RhY2tJRChzdGFjaykge1xuICAgICAgICBsZXQgaWQgPSAoc3RhY2tJRHMgfHwgKHN0YWNrSURzID0gbmV3IFdlYWtNYXApKS5nZXQoc3RhY2spO1xuICAgICAgICBpZiAoIWlkKVxuICAgICAgICAgICAgc3RhY2tJRHMuc2V0KHN0YWNrLCBpZCA9IFN0cmluZy5mcm9tQ29kZVBvaW50KHRoaXMubmV4dFN0YWNrSUQrKykpO1xuICAgICAgICByZXR1cm4gaWQgKyBzdGFjaztcbiAgICB9XG59XG5mdW5jdGlvbiBwdXNoU3RhY2tEZWR1cChzdGFjaywgbmV3U3RhY2tzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTdGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG90aGVyID0gbmV3U3RhY2tzW2ldO1xuICAgICAgICBpZiAob3RoZXIucG9zID09IHN0YWNrLnBvcyAmJiBvdGhlci5zYW1lU3RhdGUoc3RhY2spKSB7XG4gICAgICAgICAgICBpZiAobmV3U3RhY2tzW2ldLnNjb3JlIDwgc3RhY2suc2NvcmUpXG4gICAgICAgICAgICAgICAgbmV3U3RhY2tzW2ldID0gc3RhY2s7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV3U3RhY2tzLnB1c2goc3RhY2spO1xufVxuY2xhc3MgRGlhbGVjdCB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBmbGFncywgZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIH1cbiAgICBhbGxvd3ModGVybSkgeyByZXR1cm4gIXRoaXMuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlZFt0ZXJtXSA9PSAwOyB9XG59XG5jb25zdCBpZCA9IHggPT4geDtcbi8qKlxuQ29udGV4dCB0cmFja2VycyBhcmUgdXNlZCB0byB0cmFjayBzdGF0ZWZ1bCBjb250ZXh0IChzdWNoIGFzXG5pbmRlbnRhdGlvbiBpbiB0aGUgUHl0aG9uIGdyYW1tYXIsIG9yIHBhcmVudCBlbGVtZW50cyBpbiB0aGUgWE1MXG5ncmFtbWFyKSBuZWVkZWQgYnkgZXh0ZXJuYWwgdG9rZW5pemVycy4gWW91IGRlY2xhcmUgdGhlbSBpbiBhXG5ncmFtbWFyIGZpbGUgYXMgYEBjb250ZXh0IGV4cG9ydE5hbWUgZnJvbSBcIm1vZHVsZVwiYC5cblxuQ29udGV4dCB2YWx1ZXMgc2hvdWxkIGJlIGltbXV0YWJsZSwgYW5kIGNhbiBiZSB1cGRhdGVkIChyZXBsYWNlZClcbm9uIHNoaWZ0IG9yIHJlZHVjZSBhY3Rpb25zLlxuXG5UaGUgZXhwb3J0IHVzZWQgaW4gYSBgQGNvbnRleHRgIGRlY2xhcmF0aW9uIHNob3VsZCBiZSBvZiB0aGlzXG50eXBlLlxuKi9cbmNsYXNzIENvbnRleHRUcmFja2VyIHtcbiAgICAvKipcbiAgICBEZWZpbmUgYSBjb250ZXh0IHRyYWNrZXIuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzcGVjLnN0YXJ0O1xuICAgICAgICB0aGlzLnNoaWZ0ID0gc3BlYy5zaGlmdCB8fCBpZDtcbiAgICAgICAgdGhpcy5yZWR1Y2UgPSBzcGVjLnJlZHVjZSB8fCBpZDtcbiAgICAgICAgdGhpcy5yZXVzZSA9IHNwZWMucmV1c2UgfHwgaWQ7XG4gICAgICAgIHRoaXMuaGFzaCA9IHNwZWMuaGFzaCB8fCAoKCkgPT4gMCk7XG4gICAgICAgIHRoaXMuc3RyaWN0ID0gc3BlYy5zdHJpY3QgIT09IGZhbHNlO1xuICAgIH1cbn1cbi8qKlxuSG9sZHMgdGhlIHBhcnNlIHRhYmxlcyBmb3IgYSBnaXZlbiBncmFtbWFyLCBhcyBnZW5lcmF0ZWQgYnlcbmBsZXplci1nZW5lcmF0b3JgLCBhbmQgcHJvdmlkZXMgW21ldGhvZHNdKCNjb21tb24uUGFyc2VyKSB0byBwYXJzZVxuY29udGVudCB3aXRoLlxuKi9cbmNsYXNzIExSUGFyc2VyIGV4dGVuZHMgUGFyc2VyIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNwZWMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLndyYXBwZXJzID0gW107XG4gICAgICAgIGlmIChzcGVjLnZlcnNpb24gIT0gMTQgLyogRmlsZS5WZXJzaW9uICovKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFBhcnNlciB2ZXJzaW9uICgke3NwZWMudmVyc2lvbn0pIGRvZXNuJ3QgbWF0Y2ggcnVudGltZSB2ZXJzaW9uICgkezE0IC8qIEZpbGUuVmVyc2lvbiAqL30pYCk7XG4gICAgICAgIGxldCBub2RlTmFtZXMgPSBzcGVjLm5vZGVOYW1lcy5zcGxpdChcIiBcIik7XG4gICAgICAgIHRoaXMubWluUmVwZWF0VGVybSA9IG5vZGVOYW1lcy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BlYy5yZXBlYXROb2RlQ291bnQ7IGkrKylcbiAgICAgICAgICAgIG5vZGVOYW1lcy5wdXNoKFwiXCIpO1xuICAgICAgICBsZXQgdG9wVGVybXMgPSBPYmplY3Qua2V5cyhzcGVjLnRvcFJ1bGVzKS5tYXAociA9PiBzcGVjLnRvcFJ1bGVzW3JdWzFdKTtcbiAgICAgICAgbGV0IG5vZGVQcm9wcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVOYW1lcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIG5vZGVQcm9wcy5wdXNoKFtdKTtcbiAgICAgICAgZnVuY3Rpb24gc2V0UHJvcChub2RlSUQsIHByb3AsIHZhbHVlKSB7XG4gICAgICAgICAgICBub2RlUHJvcHNbbm9kZUlEXS5wdXNoKFtwcm9wLCBwcm9wLmRlc2VyaWFsaXplKFN0cmluZyh2YWx1ZSkpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWMubm9kZVByb3BzKVxuICAgICAgICAgICAgZm9yIChsZXQgcHJvcFNwZWMgb2Ygc3BlYy5ub2RlUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvcCA9IHByb3BTcGVjWzBdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgICAgICBwcm9wID0gTm9kZVByb3BbcHJvcF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwcm9wU3BlYy5sZW5ndGg7KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gcHJvcFNwZWNbaSsrXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvcChuZXh0LCBwcm9wLCBwcm9wU3BlY1tpKytdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHByb3BTcGVjW2kgKyAtbmV4dF07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gLW5leHQ7IGogPiAwOyBqLS0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvcChwcm9wU3BlY1tpKytdLCBwcm9wLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZVNldCA9IG5ldyBOb2RlU2V0KG5vZGVOYW1lcy5tYXAoKG5hbWUsIGkpID0+IE5vZGVUeXBlLmRlZmluZSh7XG4gICAgICAgICAgICBuYW1lOiBpID49IHRoaXMubWluUmVwZWF0VGVybSA/IHVuZGVmaW5lZCA6IG5hbWUsXG4gICAgICAgICAgICBpZDogaSxcbiAgICAgICAgICAgIHByb3BzOiBub2RlUHJvcHNbaV0sXG4gICAgICAgICAgICB0b3A6IHRvcFRlcm1zLmluZGV4T2YoaSkgPiAtMSxcbiAgICAgICAgICAgIGVycm9yOiBpID09IDAsXG4gICAgICAgICAgICBza2lwcGVkOiBzcGVjLnNraXBwZWROb2RlcyAmJiBzcGVjLnNraXBwZWROb2Rlcy5pbmRleE9mKGkpID4gLTFcbiAgICAgICAgfSkpKTtcbiAgICAgICAgaWYgKHNwZWMucHJvcFNvdXJjZXMpXG4gICAgICAgICAgICB0aGlzLm5vZGVTZXQgPSB0aGlzLm5vZGVTZXQuZXh0ZW5kKC4uLnNwZWMucHJvcFNvdXJjZXMpO1xuICAgICAgICB0aGlzLnN0cmljdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IERlZmF1bHRCdWZmZXJMZW5ndGg7XG4gICAgICAgIGxldCB0b2tlbkFycmF5ID0gZGVjb2RlQXJyYXkoc3BlYy50b2tlbkRhdGEpO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBzcGVjLmNvbnRleHQ7XG4gICAgICAgIHRoaXMuc3BlY2lhbGl6ZXJTcGVjcyA9IHNwZWMuc3BlY2lhbGl6ZWQgfHwgW107XG4gICAgICAgIHRoaXMuc3BlY2lhbGl6ZWQgPSBuZXcgVWludDE2QXJyYXkodGhpcy5zcGVjaWFsaXplclNwZWNzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zcGVjaWFsaXplclNwZWNzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5zcGVjaWFsaXplZFtpXSA9IHRoaXMuc3BlY2lhbGl6ZXJTcGVjc1tpXS50ZXJtO1xuICAgICAgICB0aGlzLnNwZWNpYWxpemVycyA9IHRoaXMuc3BlY2lhbGl6ZXJTcGVjcy5tYXAoZ2V0U3BlY2lhbGl6ZXIpO1xuICAgICAgICB0aGlzLnN0YXRlcyA9IGRlY29kZUFycmF5KHNwZWMuc3RhdGVzLCBVaW50MzJBcnJheSk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRlY29kZUFycmF5KHNwZWMuc3RhdGVEYXRhKTtcbiAgICAgICAgdGhpcy5nb3RvID0gZGVjb2RlQXJyYXkoc3BlYy5nb3RvKTtcbiAgICAgICAgdGhpcy5tYXhUZXJtID0gc3BlYy5tYXhUZXJtO1xuICAgICAgICB0aGlzLnRva2VuaXplcnMgPSBzcGVjLnRva2VuaXplcnMubWFwKHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PSBcIm51bWJlclwiID8gbmV3IFRva2VuR3JvdXAodG9rZW5BcnJheSwgdmFsdWUpIDogdmFsdWUpO1xuICAgICAgICB0aGlzLnRvcFJ1bGVzID0gc3BlYy50b3BSdWxlcztcbiAgICAgICAgdGhpcy5kaWFsZWN0cyA9IHNwZWMuZGlhbGVjdHMgfHwge307XG4gICAgICAgIHRoaXMuZHluYW1pY1ByZWNlZGVuY2VzID0gc3BlYy5keW5hbWljUHJlY2VkZW5jZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy50b2tlblByZWNUYWJsZSA9IHNwZWMudG9rZW5QcmVjO1xuICAgICAgICB0aGlzLnRlcm1OYW1lcyA9IHNwZWMudGVybU5hbWVzIHx8IG51bGw7XG4gICAgICAgIHRoaXMubWF4Tm9kZSA9IHRoaXMubm9kZVNldC50eXBlcy5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLmRpYWxlY3QgPSB0aGlzLnBhcnNlRGlhbGVjdCgpO1xuICAgICAgICB0aGlzLnRvcCA9IHRoaXMudG9wUnVsZXNbT2JqZWN0LmtleXModGhpcy50b3BSdWxlcylbMF1dO1xuICAgIH1cbiAgICBjcmVhdGVQYXJzZShpbnB1dCwgZnJhZ21lbnRzLCByYW5nZXMpIHtcbiAgICAgICAgbGV0IHBhcnNlID0gbmV3IFBhcnNlKHRoaXMsIGlucHV0LCBmcmFnbWVudHMsIHJhbmdlcyk7XG4gICAgICAgIGZvciAobGV0IHcgb2YgdGhpcy53cmFwcGVycylcbiAgICAgICAgICAgIHBhcnNlID0gdyhwYXJzZSwgaW5wdXQsIGZyYWdtZW50cywgcmFuZ2VzKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBnb3RvIHRhYmxlIGVudHJ5IEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0R290byhzdGF0ZSwgdGVybSwgbG9vc2UgPSBmYWxzZSkge1xuICAgICAgICBsZXQgdGFibGUgPSB0aGlzLmdvdG87XG4gICAgICAgIGlmICh0ZXJtID49IHRhYmxlWzBdKVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBmb3IgKGxldCBwb3MgPSB0YWJsZVt0ZXJtICsgMV07Oykge1xuICAgICAgICAgICAgbGV0IGdyb3VwVGFnID0gdGFibGVbcG9zKytdLCBsYXN0ID0gZ3JvdXBUYWcgJiAxO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRhYmxlW3BvcysrXTtcbiAgICAgICAgICAgIGlmIChsYXN0ICYmIGxvb3NlKVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICBmb3IgKGxldCBlbmQgPSBwb3MgKyAoZ3JvdXBUYWcgPj4gMSk7IHBvcyA8IGVuZDsgcG9zKyspXG4gICAgICAgICAgICAgICAgaWYgKHRhYmxlW3Bvc10gPT0gc3RhdGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICBpZiAobGFzdClcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgaWYgdGhpcyBzdGF0ZSBoYXMgYW4gYWN0aW9uIGZvciBhIGdpdmVuIHRlcm1pbmFsIEBpbnRlcm5hbFxuICAgICovXG4gICAgaGFzQWN0aW9uKHN0YXRlLCB0ZXJtaW5hbCkge1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICAgICAgZm9yIChsZXQgc2V0ID0gMDsgc2V0IDwgMjsgc2V0KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnN0YXRlU2xvdChzdGF0ZSwgc2V0ID8gMiAvKiBQYXJzZVN0YXRlLlNraXAgKi8gOiAxIC8qIFBhcnNlU3RhdGUuQWN0aW9ucyAqLyksIG5leHQ7OyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICBpZiAoKG5leHQgPSBkYXRhW2ldKSA9PSA2NTUzNSAvKiBTZXEuRW5kICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhW2kgKyAxXSA9PSAxIC8qIFNlcS5OZXh0ICovKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGRhdGFbaSA9IHBhaXIoZGF0YSwgaSArIDIpXTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGF0YVtpICsgMV0gPT0gMiAvKiBTZXEuT3RoZXIgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFpcihkYXRhLCBpICsgMik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dCA9PSB0ZXJtaW5hbCB8fCBuZXh0ID09IDAgLyogVGVybS5FcnIgKi8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWlyKGRhdGEsIGkgKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0ZVNsb3Qoc3RhdGUsIHNsb3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVzWyhzdGF0ZSAqIDYgLyogUGFyc2VTdGF0ZS5TaXplICovKSArIHNsb3RdO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRlRmxhZyhzdGF0ZSwgZmxhZykge1xuICAgICAgICByZXR1cm4gKHRoaXMuc3RhdGVTbG90KHN0YXRlLCAwIC8qIFBhcnNlU3RhdGUuRmxhZ3MgKi8pICYgZmxhZykgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHZhbGlkQWN0aW9uKHN0YXRlLCBhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5hbGxBY3Rpb25zKHN0YXRlLCBhID0+IGEgPT0gYWN0aW9uID8gdHJ1ZSA6IG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFsbEFjdGlvbnMoc3RhdGUsIGFjdGlvbikge1xuICAgICAgICBsZXQgZGVmbHQgPSB0aGlzLnN0YXRlU2xvdChzdGF0ZSwgNCAvKiBQYXJzZVN0YXRlLkRlZmF1bHRSZWR1Y2UgKi8pO1xuICAgICAgICBsZXQgcmVzdWx0ID0gZGVmbHQgPyBhY3Rpb24oZGVmbHQpIDogdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdGF0ZVNsb3Qoc3RhdGUsIDEgLyogUGFyc2VTdGF0ZS5BY3Rpb25zICovKTsgcmVzdWx0ID09IG51bGw7IGkgKz0gMykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVtpXSA9PSA2NTUzNSAvKiBTZXEuRW5kICovKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVtpICsgMV0gPT0gMSAvKiBTZXEuTmV4dCAqLylcbiAgICAgICAgICAgICAgICAgICAgaSA9IHBhaXIodGhpcy5kYXRhLCBpICsgMik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IGFjdGlvbihwYWlyKHRoaXMuZGF0YSwgaSArIDEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHN0YXRlcyB0aGF0IGNhbiBmb2xsb3cgdGhpcyBvbmUgdGhyb3VnaCBzaGlmdCBhY3Rpb25zIG9yXG4gICAgZ290byBqdW1wcy4gQGludGVybmFsXG4gICAgKi9cbiAgICBuZXh0U3RhdGVzKHN0YXRlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc3RhdGVTbG90KHN0YXRlLCAxIC8qIFBhcnNlU3RhdGUuQWN0aW9ucyAqLyk7OyBpICs9IDMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPT0gNjU1MzUgLyogU2VxLkVuZCAqLykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbaSArIDFdID09IDEgLyogU2VxLk5leHQgKi8pXG4gICAgICAgICAgICAgICAgICAgIGkgPSBwYWlyKHRoaXMuZGF0YSwgaSArIDIpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRoaXMuZGF0YVtpICsgMl0gJiAoNjU1MzYgLyogQWN0aW9uLlJlZHVjZUZsYWcgKi8gPj4gMTYpKSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5kYXRhW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5zb21lKCh2LCBpKSA9PiAoaSAmIDEpICYmIHYgPT0gdmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmRhdGFbaV0sIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBDb25maWd1cmUgdGhlIHBhcnNlci4gUmV0dXJucyBhIG5ldyBwYXJzZXIgaW5zdGFuY2UgdGhhdCBoYXMgdGhlXG4gICAgZ2l2ZW4gc2V0dGluZ3MgbW9kaWZpZWQuIFNldHRpbmdzIG5vdCBwcm92aWRlZCBpbiBgY29uZmlnYCBhcmVcbiAgICBrZXB0IGZyb20gdGhlIG9yaWdpbmFsIHBhcnNlci5cbiAgICAqL1xuICAgIGNvbmZpZ3VyZShjb25maWcpIHtcbiAgICAgICAgLy8gSGlkZW91cyByZWZsZWN0aW9uLWJhc2VkIGtsdWRnZSB0byBtYWtlIGl0IGVhc3kgdG8gY3JlYXRlIGFcbiAgICAgICAgLy8gc2xpZ2h0bHkgbW9kaWZpZWQgY29weSBvZiBhIHBhcnNlci5cbiAgICAgICAgbGV0IGNvcHkgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoTFJQYXJzZXIucHJvdG90eXBlKSwgdGhpcyk7XG4gICAgICAgIGlmIChjb25maWcucHJvcHMpXG4gICAgICAgICAgICBjb3B5Lm5vZGVTZXQgPSB0aGlzLm5vZGVTZXQuZXh0ZW5kKC4uLmNvbmZpZy5wcm9wcyk7XG4gICAgICAgIGlmIChjb25maWcudG9wKSB7XG4gICAgICAgICAgICBsZXQgaW5mbyA9IHRoaXMudG9wUnVsZXNbY29uZmlnLnRvcF07XG4gICAgICAgICAgICBpZiAoIWluZm8pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgdG9wIHJ1bGUgbmFtZSAke2NvbmZpZy50b3B9YCk7XG4gICAgICAgICAgICBjb3B5LnRvcCA9IGluZm87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy50b2tlbml6ZXJzKVxuICAgICAgICAgICAgY29weS50b2tlbml6ZXJzID0gdGhpcy50b2tlbml6ZXJzLm1hcCh0ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBjb25maWcudG9rZW5pemVycy5maW5kKHIgPT4gci5mcm9tID09IHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZCA/IGZvdW5kLnRvIDogdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoY29uZmlnLnNwZWNpYWxpemVycykge1xuICAgICAgICAgICAgY29weS5zcGVjaWFsaXplcnMgPSB0aGlzLnNwZWNpYWxpemVycy5zbGljZSgpO1xuICAgICAgICAgICAgY29weS5zcGVjaWFsaXplclNwZWNzID0gdGhpcy5zcGVjaWFsaXplclNwZWNzLm1hcCgocywgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGNvbmZpZy5zcGVjaWFsaXplcnMuZmluZChyID0+IHIuZnJvbSA9PSBzLmV4dGVybmFsKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICAgICAgICBsZXQgc3BlYyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcyksIHsgZXh0ZXJuYWw6IGZvdW5kLnRvIH0pO1xuICAgICAgICAgICAgICAgIGNvcHkuc3BlY2lhbGl6ZXJzW2ldID0gZ2V0U3BlY2lhbGl6ZXIoc3BlYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwZWM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmNvbnRleHRUcmFja2VyKVxuICAgICAgICAgICAgY29weS5jb250ZXh0ID0gY29uZmlnLmNvbnRleHRUcmFja2VyO1xuICAgICAgICBpZiAoY29uZmlnLmRpYWxlY3QpXG4gICAgICAgICAgICBjb3B5LmRpYWxlY3QgPSB0aGlzLnBhcnNlRGlhbGVjdChjb25maWcuZGlhbGVjdCk7XG4gICAgICAgIGlmIChjb25maWcuc3RyaWN0ICE9IG51bGwpXG4gICAgICAgICAgICBjb3B5LnN0cmljdCA9IGNvbmZpZy5zdHJpY3Q7XG4gICAgICAgIGlmIChjb25maWcud3JhcClcbiAgICAgICAgICAgIGNvcHkud3JhcHBlcnMgPSBjb3B5LndyYXBwZXJzLmNvbmNhdChjb25maWcud3JhcCk7XG4gICAgICAgIGlmIChjb25maWcuYnVmZmVyTGVuZ3RoICE9IG51bGwpXG4gICAgICAgICAgICBjb3B5LmJ1ZmZlckxlbmd0aCA9IGNvbmZpZy5idWZmZXJMZW5ndGg7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKipcbiAgICBUZWxscyB5b3Ugd2hldGhlciBhbnkgW3BhcnNlIHdyYXBwZXJzXSgjbHIuUGFyc2VyQ29uZmlnLndyYXApXG4gICAgYXJlIHJlZ2lzdGVyZWQgZm9yIHRoaXMgcGFyc2VyLlxuICAgICovXG4gICAgaGFzV3JhcHBlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyYXBwZXJzLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gdGVybS4gVGhpcyB3aWxsIG9ubHlcbiAgICB3b3JrIGZvciBhbGwgdGVybXMgd2hlbiB0aGUgcGFyc2VyIHdhcyBnZW5lcmF0ZWQgd2l0aCB0aGVcbiAgICBgLS1uYW1lc2Agb3B0aW9uLiBCeSBkZWZhdWx0LCBvbmx5IHRoZSBuYW1lcyBvZiB0YWdnZWQgdGVybXMgYXJlXG4gICAgc3RvcmVkLlxuICAgICovXG4gICAgZ2V0TmFtZSh0ZXJtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlcm1OYW1lcyA/IHRoaXMudGVybU5hbWVzW3Rlcm1dIDogU3RyaW5nKHRlcm0gPD0gdGhpcy5tYXhOb2RlICYmIHRoaXMubm9kZVNldC50eXBlc1t0ZXJtXS5uYW1lIHx8IHRlcm0pO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZW9mIHRlcm0gaWQgaXMgYWx3YXlzIGFsbG9jYXRlZCBkaXJlY3RseSBhZnRlciB0aGUgbm9kZVxuICAgIHR5cGVzLiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBlb2ZUZXJtKCkgeyByZXR1cm4gdGhpcy5tYXhOb2RlICsgMTsgfVxuICAgIC8qKlxuICAgIFRoZSB0eXBlIG9mIHRvcCBub2RlIHByb2R1Y2VkIGJ5IHRoZSBwYXJzZXIuXG4gICAgKi9cbiAgICBnZXQgdG9wTm9kZSgpIHsgcmV0dXJuIHRoaXMubm9kZVNldC50eXBlc1t0aGlzLnRvcFsxXV07IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGR5bmFtaWNQcmVjZWRlbmNlKHRlcm0pIHtcbiAgICAgICAgbGV0IHByZWMgPSB0aGlzLmR5bmFtaWNQcmVjZWRlbmNlcztcbiAgICAgICAgcmV0dXJuIHByZWMgPT0gbnVsbCA/IDAgOiBwcmVjW3Rlcm1dIHx8IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcGFyc2VEaWFsZWN0KGRpYWxlY3QpIHtcbiAgICAgICAgbGV0IHZhbHVlcyA9IE9iamVjdC5rZXlzKHRoaXMuZGlhbGVjdHMpLCBmbGFncyA9IHZhbHVlcy5tYXAoKCkgPT4gZmFsc2UpO1xuICAgICAgICBpZiAoZGlhbGVjdClcbiAgICAgICAgICAgIGZvciAobGV0IHBhcnQgb2YgZGlhbGVjdC5zcGxpdChcIiBcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWQgPSB2YWx1ZXMuaW5kZXhPZihwYXJ0KTtcbiAgICAgICAgICAgICAgICBpZiAoaWQgPj0gMClcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3NbaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgbGV0IGRpc2FibGVkID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIWZsYWdzW2ldKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IHRoaXMuZGlhbGVjdHNbdmFsdWVzW2ldXSwgaWQ7IChpZCA9IHRoaXMuZGF0YVtqKytdKSAhPSA2NTUzNSAvKiBTZXEuRW5kICovOylcbiAgICAgICAgICAgICAgICAgICAgKGRpc2FibGVkIHx8IChkaXNhYmxlZCA9IG5ldyBVaW50OEFycmF5KHRoaXMubWF4VGVybSArIDEpKSlbaWRdID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEaWFsZWN0KGRpYWxlY3QsIGZsYWdzLCBkaXNhYmxlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFVzZWQgYnkgdGhlIG91dHB1dCBvZiB0aGUgcGFyc2VyIGdlbmVyYXRvci4gTm90IGF2YWlsYWJsZSB0b1xuICAgIHVzZXIgY29kZS4gQGhpZGVcbiAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgTFJQYXJzZXIoc3BlYyk7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFpcihkYXRhLCBvZmYpIHsgcmV0dXJuIGRhdGFbb2ZmXSB8IChkYXRhW29mZiArIDFdIDw8IDE2KTsgfVxuZnVuY3Rpb24gZmluZEZpbmlzaGVkKHN0YWNrcykge1xuICAgIGxldCBiZXN0ID0gbnVsbDtcbiAgICBmb3IgKGxldCBzdGFjayBvZiBzdGFja3MpIHtcbiAgICAgICAgbGV0IHN0b3BwZWQgPSBzdGFjay5wLnN0b3BwZWRBdDtcbiAgICAgICAgaWYgKChzdGFjay5wb3MgPT0gc3RhY2sucC5zdHJlYW0uZW5kIHx8IHN0b3BwZWQgIT0gbnVsbCAmJiBzdGFjay5wb3MgPiBzdG9wcGVkKSAmJlxuICAgICAgICAgICAgc3RhY2sucC5wYXJzZXIuc3RhdGVGbGFnKHN0YWNrLnN0YXRlLCAyIC8qIFN0YXRlRmxhZy5BY2NlcHRpbmcgKi8pICYmXG4gICAgICAgICAgICAoIWJlc3QgfHwgYmVzdC5zY29yZSA8IHN0YWNrLnNjb3JlKSlcbiAgICAgICAgICAgIGJlc3QgPSBzdGFjaztcbiAgICB9XG4gICAgcmV0dXJuIGJlc3Q7XG59XG5mdW5jdGlvbiBnZXRTcGVjaWFsaXplcihzcGVjKSB7XG4gICAgaWYgKHNwZWMuZXh0ZXJuYWwpIHtcbiAgICAgICAgbGV0IG1hc2sgPSBzcGVjLmV4dGVuZCA/IDEgLyogU3BlY2lhbGl6ZS5FeHRlbmQgKi8gOiAwIC8qIFNwZWNpYWxpemUuU3BlY2lhbGl6ZSAqLztcbiAgICAgICAgcmV0dXJuICh2YWx1ZSwgc3RhY2spID0+IChzcGVjLmV4dGVybmFsKHZhbHVlLCBzdGFjaykgPDwgMSkgfCBtYXNrO1xuICAgIH1cbiAgICByZXR1cm4gc3BlYy5nZXQ7XG59XG5cbmV4cG9ydCB7IENvbnRleHRUcmFja2VyLCBFeHRlcm5hbFRva2VuaXplciwgSW5wdXRTdHJlYW0sIExSUGFyc2VyLCBMb2NhbFRva2VuR3JvdXAsIFN0YWNrIH07XG4iLCAiaW1wb3J0IHsgTFJMYW5ndWFnZSwgTGFuZ3VhZ2VTdXBwb3J0IH0gZnJvbSAnQGNvZGVtaXJyb3IvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgTFJQYXJzZXIsIExvY2FsVG9rZW5Hcm91cCB9IGZyb20gJ0BsZXplci9scic7XG5cbi8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGxlemVyLWdlbmVyYXRvci4gWW91IHByb2JhYmx5IHNob3VsZG4ndCBlZGl0IGl0LlxuY29uc3QgcGFyc2VyID0gLypAX19QVVJFX18qL0xSUGFyc2VyLmRlc2VyaWFsaXplKHtcbiAgdmVyc2lvbjogMTQsXG4gIHN0YXRlczogXCIpYFFRT1BPT09mT1FPJyNDXk9xT1NPJyNDYE98T1dPJyNDYk8hWE9gTycjQ2VPIWRPcE8nI0NnT09PTycjQ2snI0NrT09PTycjQ2knI0NpUVFPUE9PT09PTyw1OHgsNTh4TyFvT1FPLDU4eE8hd09RTyw1OHhPT09PLDU4eiw1OHpPI1BPU08sNTh6TyNYT1NPLDU4ek8jYU9XTyw1OHxPI2lPV08sNTh8TyNxT1dPLDU4fE9PT08sNTlQLDU5UE8jeU9gTyw1OVBPJFJPYE8sNTlQT09PTyw1OVIsNTlSTyRaT3BPLDU5Uk8kY09wTyw1OVJPT09PLUU2Zy1FNmdPT09PMUcuZDFHLmRPJGtPUU8xRy5kTyRuT1FPMUcuZE9PT08xRy5mMUcuZk8kc09TTzFHLmZPJHZPU08xRy5mT09PTzFHLmgxRy5oTyR7T1dPMUcuaE8lUU9XTzFHLmhPJVlPV08xRy5oTyViT1dPMUcuaE9PT08xRy5rMUcua08lZ09gTzFHLmtPJWpPYE8xRy5rT09PTzFHLm0xRy5tTyVvT3BPMUcubU8lck9wTzFHLm1PT09PNyskTzcrJE9PJXdPUU83KyRPT09PTzcrJFE3KyRRTyV8T1NPNyskUU9PT083KyRTNyskU08mUk9XTzcrJFNPJldPV083KyRTTyZgT1dPNyskU09PT083KyRWNyskVk8mZU9gTzcrJFZPT09PNyskWDcrJFhPJmpPcE83KyRYT09PTzw8R2o8PEdqT09PTzw8R2w8PEdsT09PTzw8R248PEduTyZvT1dPPDxHbk8mdE9XTzw8R25PT09PPDxHcTw8R3FPT09PPDxHczw8R3NPT09PQU49WUFOPVlPJnxPV09BTj1ZT09PT0cyMnRHMjJ0XCIsXG4gIHN0YXRlRGF0YTogXCInUn5PYFBPY1FPZlJPaVNPbFRPb1ZPfk9SWk9hWU9iWE9+T1ReT2RdT2VbT35PVmFPV19PZ2BPfk9ZZE9qY09rYk9+T1tnT21mT25lT35PUmpPYmlPfk9ha09iaU9+T1RtT2VsT35PZG5PZWxPfk9ncE9ob09+T1ZyT1dxT35PV3FPZ3NPfk9ZdU9rdE9+T2p2T2t0T35PW3hPbndPfk9teU9ud09+T2F7T2J6T35PZH1PZXxPfk9oIU9Pfk9nIVBPaCFPT35PVyFRT2chUk9+T1chUU9+T2ohVE9rIVNPfk9tIVZPbiFVT35PYiFXT35PZSFYT35PaCFZT35PZyFaT2ghWU9+T1chW09+T2shXU9+T24hXk9+T2ghX09+T2chYE9oIV9Pfk9oIWFPfk9cIixcbiAgZ290bzogXCJvYFBQYVBhUGFQUGFQYVBlUGtUVU9XUVdPUmhXVFZPV1wiLFxuICBub2RlTmFtZXM6IFwiXHUyNkEwIENyaXRpY01hcmt1cCBBZGRpdGlvbiBNRFNlcEFkZCBEZWxldGlvbiBNRFNlcERlbCBTdWJzdGl0dXRpb24gTURTZXBTdWIgTVN1YiBDb21tZW50IE1EU2VwQ29tIEhpZ2hsaWdodCBNRFNlcEhpZ1wiLFxuICBtYXhUZXJtOiAzMSxcbiAgc2tpcHBlZE5vZGVzOiBbMF0sXG4gIHJlcGVhdE5vZGVDb3VudDogMSxcbiAgdG9rZW5EYXRhOiBcIidvflJdWFl6WVp6XV56cHF6cXJ6cnN6cyNPeiNPI1AhUCNQI296I28jcCNzI3A7J1N6OydTOz1gJ2k8JWxPen4hUE9vfn4hVVhvfnJzeiFQIVF6I08jUHojVSNWeiNZI1p6I2IjY3ojZiNneiNoI2l6I2kjaiFxfiF0UiFRIVshfSFjIWkhfSNUI1ohfX4jUVIhUSFbI1ohYyFpI1ojVCNaI1p+I15SIVEhWyNnIWMhaSNnI1QjWiNnfiNqUiFRIVt6IWMhaXojVCNaen4jeFZvfnZ3JF97fCVgfSFPJWshXiFfJXYhXyFgJ1YhYCFhJ10jciNzJ2N+JGJQI1ojWyRlfiRoUCNoI2kka34kblAhXSFeJHF+JHRQdnckd34kelAjWiNbJH1+JVFQI2gjaSVUfiVXUCFdIV4lWn4lYE9pfn4lY1B7fCVmfiVrT2B+fiVuUH0hTyVxfiV2T2N+fiV5USNXI1gmUCNhI2ImaH4mU1AjWCNZJlZ+JllQI2AjYSZdfiZgUCFgIWEmY34maE9mfn4ma1AjVCNVJm5+JnFQI2YjZyZ0fiZ3UCNfI2Amen4mfVAhYCFhJ1F+J1ZPbH5+J1lQIV8hYCdRfidgUCFgIWElWn4nZlAjciNzJmN+J2xQOz1gPCVselwiLFxuICB0b2tlbml6ZXJzOiBbNSwgLypAX19QVVJFX18qL25ldyBMb2NhbFRva2VuR3JvdXAoXCJ2flJRe3xYIWIhY2p+W1B7fF9+YlAjcSNyZX5qT2J+fm1QIWIhY3B+dU9Sfn5cIiwgMzcsIDE3KSwgLypAX19QVVJFX18qL25ldyBMb2NhbFRva2VuR3JvdXAoXCJ2flJRfSFPWCFiIWNqfltQfSFPX35iUCNxI3JlfmpPZX5+bVAhYiFjcH51T1R+flwiLCAzNywgMjApLCAvKkBfX1BVUkVfXyovbmV3IExvY2FsVG9rZW5Hcm91cChcIiNXflJSIV4hX1shYiFjIVYjciNzIWJ+X1AhUCFRYn5lUCNXI1hofmtQI1gjWW5+cVAjYCNhdH53UCFgIWF6fn1QI3EjciFRfiFWT2h+fiFZUCFiIWMhXX4hYk9Wfn4hZVJ2dyFuIWAhYSNRI3Ijc3p+IXFQI1ojWyF0fiF3UCNoI2khen4hfVAhXSFeI1F+I1ZPV35+XCIsIDk5LCAyMyksIC8qQF9fUFVSRV9fKi9uZXcgTG9jYWxUb2tlbkdyb3VwKFwiIXV+UlJ2d1shXiFfIWMhYiFjIWl+X1AjYCNhYn5lUCNoI2lofmtQIV0hXm5+cVB2d3R+d1AjYCNhen59UCNoI2khUX4hVFAhXSFeIVd+IVpQI3EjciFefiFjT2t+fiFmUCFeIV8hV34hbFAhYiFjIW9+IXRPWX5+XCIsIDgyLCAyNiksIC8qQF9fUFVSRV9fKi9uZXcgTG9jYWxUb2tlbkdyb3VwKFwiIW9+UlIhXiFfWyFfIWAhXSFiIWMhY35fUCFQIVFifmVQI2EjYmh+a1AjVCNVbn5xUCNmI2d0fndQI18jYHp+fVAhYCFhIVF+IVRQI3EjciFXfiFdT25+fiFgUCFfIWAhUX4hZlAhYiFjIWl+IW5PW35+XCIsIDc2LCAyOSldLFxuICB0b3BSdWxlczoge1wiQ3JpdGljTWFya3VwXCI6WzAsMV19LFxuICB0b2tlblByZWM6IDBcbn0pO1xuXG5jb25zdCBjcml0aWNtYXJrdXBMYW5ndWFnZSA9IC8qQF9fUFVSRV9fKi9MUkxhbmd1YWdlLmRlZmluZSh7XG4gICAgbmFtZTogXCJjcml0aWNtYXJrdXBcIixcbiAgICBwYXJzZXI6IC8qQF9fUFVSRV9fKi9wYXJzZXIuY29uZmlndXJlKHt9KSxcbn0pO1xuZnVuY3Rpb24gY3JpdGljbWFya3VwKCkge1xuICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VTdXBwb3J0KGNyaXRpY21hcmt1cExhbmd1YWdlKTtcbn1cblxuZXhwb3J0IHsgY3JpdGljbWFya3VwLCBjcml0aWNtYXJrdXBMYW5ndWFnZSB9O1xuIiwgImltcG9ydCB7IEVkaXRvclN0YXRlLCBTdGF0ZUZpZWxkIH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgeyBJbnRlcnZhbCwgTm9kZSB9IGZyb20gXCJAZmxhdHRlbi1qcy9pbnRlcnZhbC10cmVlXCI7XG5pbXBvcnQgeyB0eXBlIENoYW5nZWRSYW5nZSwgdHlwZSBTeW50YXhOb2RlLCB0eXBlIFRyZWUsIFRyZWVGcmFnbWVudCB9IGZyb20gXCJAbGV6ZXIvY29tbW9uXCI7XG5cbmltcG9ydCB7XG5cdEFkZGl0aW9uUmFuZ2UsXG5cdENvbW1lbnRSYW5nZSxcblx0Q3JpdGljTWFya3VwUmFuZ2UsXG5cdENyaXRpY01hcmt1cFJhbmdlcyxcblx0RGVsZXRpb25SYW5nZSxcblx0SGlnaGxpZ2h0UmFuZ2UsXG5cdFN1YnN0aXR1dGlvblJhbmdlLFxuXHRTdWdnZXN0aW9uVHlwZSxcbn0gZnJvbSBcIi4uL3Jhbmdlc1wiO1xuXG5pbXBvcnQgeyBEb2NJbnB1dCB9IGZyb20gXCJAY29kZW1pcnJvci9sYW5ndWFnZVwiO1xuaW1wb3J0IHsgQ09NTUVOVEFUT1JfR0xPQkFMIH0gZnJvbSBcIi4uLy4uLy4uL2dsb2JhbFwiO1xuaW1wb3J0IHsgZnVsbFJlbG9hZEVmZmVjdCB9IGZyb20gXCIuLi8uLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgY3JpdGljbWFya3VwTGFuZ3VhZ2UgfSBmcm9tIFwiLi4vcGFyc2VyXCI7XG5cbmludGVyZmFjZSBQYXJzZXJEYXRhIHtcblx0dHJlZTogVHJlZTtcblx0ZnJhZ21lbnRzOiByZWFkb25seSBUcmVlRnJhZ21lbnRbXTtcblx0cmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZXM7XG5cdGluc2VydGVkX3JhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXTtcblx0ZGVsZXRlZF9yYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlW107XG59XG5cbmV4cG9ydCBjb25zdCByYW5nZVBhcnNlcjogU3RhdGVGaWVsZDxQYXJzZXJEYXRhPiA9IFN0YXRlRmllbGQuZGVmaW5lKHtcblx0Y3JlYXRlKHN0YXRlKSB7XG5cdFx0Y29uc3QgdGV4dCA9IHN0YXRlLmRvYy50b1N0cmluZygpO1xuXHRcdGNvbnN0IHRyZWUgPSBjcml0aWNtYXJrdXBMYW5ndWFnZS5wYXJzZXIucGFyc2UodGV4dCk7XG5cdFx0Y29uc3QgcmFuZ2VzID0gbmV3IENyaXRpY01hcmt1cFJhbmdlcyhjdXJzb3JHZW5lcmF0ZVJhbmdlcyh0cmVlLCB0ZXh0KSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRyZWUsXG5cdFx0XHRmcmFnbWVudHM6IFRyZWVGcmFnbWVudC5hZGRUcmVlKHRyZWUpLFxuXHRcdFx0cmFuZ2VzOiByYW5nZXMsXG5cdFx0XHRpbnNlcnRlZF9yYW5nZXM6IHJhbmdlcy5yYW5nZXMsXG5cdFx0XHRkZWxldGVkX3JhbmdlczogW10sXG5cdFx0fTtcblx0fSxcblxuXHR1cGRhdGUodmFsdWU6IFBhcnNlckRhdGEsIHRyKSB7XG5cdFx0aWYgKHRyLmVmZmVjdHMuc29tZShlZmZlY3QgPT4gZWZmZWN0LmlzKGZ1bGxSZWxvYWRFZmZlY3QpKSlcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZSh0ci5zdGF0ZSkgYXMgUGFyc2VyRGF0YTtcblxuXHRcdGlmICghdHIuZG9jQ2hhbmdlZCkge1xuXHRcdFx0dmFsdWUuaW5zZXJ0ZWRfcmFuZ2VzID0gW107XG5cdFx0XHR2YWx1ZS5kZWxldGVkX3JhbmdlcyA9IFtdO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdC8vIFRoZSBiZWxvdyB0aW1lcyBhcmUgYmFzZWQgb24gc3RyZXNzLXRlc3QgKDI1MC4wMDAgd29yZHMsIDU2LjE2NyByYW5nZXMpXG5cdFx0Ly8gZ2V0LWNoYW5nZXM6IDAuMDEgLSAwLjA1IG1zXG5cdFx0Y29uc3QgY2hhbmdlZF9yYW5nZXM6IENoYW5nZWRSYW5nZVtdID0gW107XG5cdFx0dHIuY2hhbmdlcy5pdGVyQ2hhbmdlZFJhbmdlcygoZnJvbSwgdG8sIGZyb21CLCB0b0IpID0+XG5cdFx0XHRjaGFuZ2VkX3Jhbmdlcy5wdXNoKHsgZnJvbUE6IGZyb20sIHRvQTogdG8sIGZyb21COiBmcm9tQiwgdG9COiB0b0IgfSlcblx0XHQpO1xuXG5cdFx0Ly8gZnJhZ21lbnQtdXBkYXRlOiAwLjAxIC0gMC4wOCBtc1xuXHRcdGxldCBmcmFnbWVudHMgPSBUcmVlRnJhZ21lbnQuYXBwbHlDaGFuZ2VzKHZhbHVlLmZyYWdtZW50cywgY2hhbmdlZF9yYW5nZXMpO1xuXHRcdC8vIHN0cmluZ2lmeS1kb2M6IDAuOTggLSA4Ljk5IG1zXG5cdFx0Y29uc3QgdGV4dCA9IHRyLnN0YXRlLmRvYy50b1N0cmluZygpO1xuXHRcdC8vIHBhcnNlLWRvYzogMC42OCAtIDEuMjQgbXNcblx0XHRjb25zdCB0cmVlID0gY3JpdGljbWFya3VwTGFuZ3VhZ2UucGFyc2VyLnBhcnNlKG5ldyBEb2NJbnB1dCh0ci5zdGF0ZS5kb2MpLCBmcmFnbWVudHMpO1xuXHRcdC8vIGFwcGx5LWZyYWdtZW50czogPDAuMDEgbXNcblx0XHRmcmFnbWVudHMgPSBUcmVlRnJhZ21lbnQuYWRkVHJlZSh0cmVlLCBmcmFnbWVudHMpO1xuXG5cdFx0Ly8gcmVnZW5lcmF0ZS1yYW5nZXM6IDAuMjAgLSAwLjU1IG1zXG5cdFx0Y29uc3QgaW5zZXJ0ZWRfc2V0ID0gbmV3IE1hcDxudW1iZXIsIENyaXRpY01hcmt1cFJhbmdlPigpO1xuXHRcdGNvbnN0IG9mZnNldHM6IFtudW1iZXIsIG51bWJlcl1bXSA9IFtdO1xuXHRcdGNvbnN0IGRhbmdsaW5nX2NvbW1lbnRzID0gbmV3IE1hcDxudW1iZXIsIENvbW1lbnRSYW5nZT4oKTtcblx0XHRjb25zdCBkZWxldGVkX3JhbmdlczogU2V0PENyaXRpY01hcmt1cFJhbmdlPiA9IG5ldyBTZXQoKTtcblx0XHRmb3IgKGNvbnN0IGNoYW5nZWRfcmFuZ2Ugb2YgY2hhbmdlZF9yYW5nZXMpIHtcblx0XHRcdHZhbHVlLnJhbmdlcy50cmVlXG5cdFx0XHRcdC5zZWFyY2goW2NoYW5nZWRfcmFuZ2UuZnJvbUEsIGNoYW5nZWRfcmFuZ2UudG9BXSwgKHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSwga2V5OiBJbnRlcnZhbCkgPT4ge1xuXHRcdFx0XHRcdHZhbHVlLnJhbmdlcy50cmVlLnJlbW92ZShrZXksIHJhbmdlKTtcblx0XHRcdFx0XHRkZWxldGVkX3Jhbmdlcy5hZGQocmFuZ2UpO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcmVwbHkgb2YgcmFuZ2UuYmFzZV9yYW5nZS50aHJlYWQpXG5cdFx0XHRcdFx0XHRkYW5nbGluZ19jb21tZW50cy5zZXQocmVwbHkuZnJvbSwgcmVwbHkpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0Zm9yIChjb25zdCByYW5nZSBvZiBjdXJzb3JHZW5lcmF0ZVJhbmdlcyh0cmVlLCB0ZXh0LCBjaGFuZ2VkX3JhbmdlLmZyb21CLCBjaGFuZ2VkX3JhbmdlLnRvQikpXG5cdFx0XHRcdGluc2VydGVkX3NldC5zZXQocmFuZ2UuZnJvbSwgcmFuZ2UpO1xuXHRcdFx0b2Zmc2V0cy5wdXNoKFtcblx0XHRcdFx0Y2hhbmdlZF9yYW5nZS50b0EsXG5cdFx0XHRcdGNoYW5nZWRfcmFuZ2UudG9CIC0gY2hhbmdlZF9yYW5nZS5mcm9tQiAtIChjaGFuZ2VkX3JhbmdlLnRvQSAtIGNoYW5nZWRfcmFuZ2UuZnJvbUEpLFxuXHRcdFx0XSk7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgZGVsZXRlZF9yYW5nZSBvZiBkZWxldGVkX3Jhbmdlcykge1xuXHRcdFx0aWYgKGRlbGV0ZWRfcmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVClcblx0XHRcdFx0ZGFuZ2xpbmdfY29tbWVudHMuZGVsZXRlKGRlbGV0ZWRfcmFuZ2UuZnJvbSk7XG5cdFx0fVxuXG5cdFx0bGV0IGN1bXVsYXRpdmVfb2Zmc2V0ID0gMDtcblxuXHRcdC8vIGFwcGx5LW9mZnNldHM6IDIuNzItMy43MCBtc1xuXHRcdGNvbnN0IG5pbF9ub2RlID0gdmFsdWUucmFuZ2VzLnRyZWUubmlsX25vZGU7XG5cdFx0ZnVuY3Rpb24gdmlzaXROb2RlKG5vZGU6IE5vZGU8Q3JpdGljTWFya3VwUmFuZ2U+KSB7XG5cdFx0XHRpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgIT0gbmlsX25vZGUpIHtcblx0XHRcdFx0dmlzaXROb2RlKG5vZGUubGVmdCk7XG5cdFx0XHRcdHdoaWxlIChvZmZzZXRzLmxlbmd0aCAmJiBub2RlLml0ZW0ua2V5LmxvdyA+PSBvZmZzZXRzWzBdWzBdKVxuXHRcdFx0XHRcdGN1bXVsYXRpdmVfb2Zmc2V0ICs9IG9mZnNldHMuc2hpZnQoKSFbMV07XG5cdFx0XHRcdG5vZGUuaXRlbS52YWx1ZS5hcHBseV9vZmZzZXQoY3VtdWxhdGl2ZV9vZmZzZXQpO1xuXHRcdFx0XHRub2RlLml0ZW0ua2V5LmxvdyA9IG5vZGUuaXRlbS52YWx1ZS5mcm9tO1xuXHRcdFx0XHRub2RlLml0ZW0ua2V5LmhpZ2ggPSBub2RlLml0ZW0udmFsdWUudG87XG5cdFx0XHRcdHZpc2l0Tm9kZShub2RlLnJpZ2h0KTtcblx0XHRcdFx0aWYgKG5vZGUubGVmdCAhPSBuaWxfbm9kZSlcblx0XHRcdFx0XHRub2RlLm1heC5sb3cgPSBub2RlLmxlZnQubWF4Lmxvdztcblx0XHRcdFx0aWYgKG5vZGUucmlnaHQgIT0gbmlsX25vZGUpXG5cdFx0XHRcdFx0bm9kZS5tYXguaGlnaCA9IG5vZGUucmlnaHQubWF4LmhpZ2g7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHZpc2l0Tm9kZSh2YWx1ZS5yYW5nZXMudHJlZS5yb290ISk7XG5cdFx0Y29uc3QgaW5zZXJ0ZWRfcmFuZ2VzID0gQXJyYXkuZnJvbShpbnNlcnRlZF9zZXQudmFsdWVzKCkpO1xuXG5cdFx0Ly8gaW5zZXJ0LW5ldy1yYW5nZXM6IDwwLjAxIC0gMC4wNSBtc1xuXHRcdGZvciAoY29uc3QgcmFuZ2Ugb2YgaW5zZXJ0ZWRfcmFuZ2VzKVxuXHRcdFx0dmFsdWUucmFuZ2VzLnRyZWUuaW5zZXJ0KFtyYW5nZS5mcm9tLCByYW5nZS50b10sIHJhbmdlKTtcblxuXHRcdC8vIGNvbW1lbnRzLXRocmVhZC1yZWNvbnN0cnVjdGlvbjogPDAuMDEgLSAwLjA1IG1zXG5cdFx0Zm9yIChjb25zdCByYW5nZSBvZiBpbnNlcnRlZF9yYW5nZXMpIHtcblx0XHRcdGlmIChyYW5nZS50eXBlID09PSBTdWdnZXN0aW9uVHlwZS5DT01NRU5UKVxuXHRcdFx0XHRkYW5nbGluZ19jb21tZW50cy5zZXQocmFuZ2UuZnJvbSwgcmFuZ2UgYXMgQ29tbWVudFJhbmdlKTtcblx0XHR9XG5cblx0XHQvLyBGSVhNRTogUmFyZSBjYXNlcyBvZiBjb21tZW50IHJhbmdlcyBpbiB0aHJlYWRzIGJlaW5nIGR1cGxpY2F0ZWQgZHVlIHRvIGVkaXRvciBjaGFuZ2VzXG5cdFx0aWYgKGRhbmdsaW5nX2NvbW1lbnRzLnNpemUpIHtcblx0XHRcdGNvbnN0IGNvbW1lbnRfdGhyZWFkczogQ29tbWVudFJhbmdlW11bXSA9IFtdO1xuXHRcdFx0bGV0IGxhc3RfcmFuZ2U6IENvbW1lbnRSYW5nZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblx0XHRcdGxldCBjdXJyZW50X3RocmVhZDogQ29tbWVudFJhbmdlW10gPSBbXTtcblx0XHRcdGZvciAoY29uc3QgcmFuZ2Ugb2YgQXJyYXkuZnJvbShkYW5nbGluZ19jb21tZW50cy52YWx1ZXMoKSkuc29ydCgoYSwgYikgPT4gYS5mcm9tIC0gYi5mcm9tKSkge1xuXHRcdFx0XHRyYW5nZS5jbGVhcl9yZWZlcmVuY2VzKCk7XG5cdFx0XHRcdHJhbmdlLnJlcGxpZXMubGVuZ3RoID0gMDtcblxuXHRcdFx0XHRpZiAoIWxhc3RfcmFuZ2UgfHwgbGFzdF9yYW5nZT8ucmlnaHRfYWRqYWNlbnQocmFuZ2UpKVxuXHRcdFx0XHRcdGN1cnJlbnRfdGhyZWFkLnB1c2gocmFuZ2UpO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRjb21tZW50X3RocmVhZHMucHVzaChjdXJyZW50X3RocmVhZCk7XG5cdFx0XHRcdFx0Y3VycmVudF90aHJlYWQgPSBbcmFuZ2VdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxhc3RfcmFuZ2UgPSByYW5nZTtcblx0XHRcdH1cblx0XHRcdGNvbW1lbnRfdGhyZWFkcy5wdXNoKGN1cnJlbnRfdGhyZWFkKTtcblxuXHRcdFx0Zm9yIChjb25zdCB0aHJlYWQgb2YgY29tbWVudF90aHJlYWRzKSB7XG5cdFx0XHRcdGNvbnN0IGhlYWQgPSB0aHJlYWRbMF07XG5cdFx0XHRcdGNvbnN0IGFkamFjZW50X3JhbmdlID0gdmFsdWUucmFuZ2VzLnRyZWUuc2VhcmNoKFtoZWFkLmZyb20sIGhlYWQuZnJvbV0pWzBdIGFzIENyaXRpY01hcmt1cFJhbmdlO1xuXHRcdFx0XHRhZGphY2VudF9yYW5nZSEucmVwbGllcy5sZW5ndGggPSAwO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGNvbW1lbnQgb2YgdGhyZWFkLnNsaWNlKGFkamFjZW50X3JhbmdlID09PSBoZWFkID8gMSA6IDApKVxuXHRcdFx0XHRcdGNvbW1lbnQuYWRkX3JlcGx5KGFkamFjZW50X3JhbmdlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBmaW5hbGl6ZTogMS44MCAtIDEuODUgbXNcblx0XHR2YWx1ZS5yYW5nZXMucmFuZ2VzID0gdmFsdWUucmFuZ2VzLnRyZWUudmFsdWVzO1xuXG5cdFx0cmV0dXJuIHsgdHJlZSwgcmFuZ2VzOiB2YWx1ZS5yYW5nZXMsIGZyYWdtZW50cywgaW5zZXJ0ZWRfcmFuZ2VzLCBkZWxldGVkX3JhbmdlczogWy4uLmRlbGV0ZWRfcmFuZ2VzXSB9O1xuXHR9LFxufSk7XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFJhbmdlRnJvbVN5bnRheE5vZGUocmFuZ2U6IFN5bnRheE5vZGUsIHRleHQ6IHN0cmluZykge1xuXHRjb25zdCBtZXRhZGF0YSA9XG5cdFx0KENPTU1FTlRBVE9SX0dMT0JBTC5QTFVHSU5fU0VUVElOR1MuZW5hYmxlX21ldGFkYXRhICYmIHJhbmdlLmZpcnN0Q2hpbGQ/LnR5cGUubmFtZS5zdGFydHNXaXRoKFwiTURTZXBcIikpID9cblx0XHRcdHJhbmdlLmZpcnN0Q2hpbGQhLmZyb20gOlxuXHRcdFx0dW5kZWZpbmVkO1xuXHRsZXQgbWlkZGxlID0gdW5kZWZpbmVkO1xuXHRpZiAocmFuZ2UudHlwZS5uYW1lID09PSBcIlN1YnN0aXR1dGlvblwiKSB7XG5cdFx0Y29uc3QgY2hpbGQgPSBtZXRhZGF0YSA/IHJhbmdlLmZpcnN0Q2hpbGQ/Lm5leHRTaWJsaW5nIDogcmFuZ2UuZmlyc3RDaGlsZDtcblx0XHRpZiAoIWNoaWxkIHx8IGNoaWxkLnR5cGUubmFtZSAhPT0gXCJNU3ViXCIpIHJldHVybjtcblx0XHRtaWRkbGUgPSBjaGlsZC5mcm9tO1xuXHR9XG5cblx0cmV0dXJuIGNvbnN0cnVjdFJhbmdlKHJhbmdlLmZyb20sIHJhbmdlLnRvLCByYW5nZS50eXBlLm5hbWUsIHRleHQuc2xpY2UocmFuZ2UuZnJvbSwgcmFuZ2UudG8pLCBtaWRkbGUsIG1ldGFkYXRhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1cnNvckdlbmVyYXRlUmFuZ2VzKHRyZWU6IFRyZWUsIHRleHQ6IHN0cmluZywgc3RhcnQgPSAwLCB0byA9IHRleHQubGVuZ3RoKSB7XG5cdGNvbnN0IHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VbXSA9IFtdO1xuXG5cdGxldCBwcmV2aW91c19yYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cblx0Y29uc3QgY3Vyc29yID0gdHJlZS5jdXJzb3IoKTtcblx0Ly8gTW92ZSBpbnRvIHRoZSBmaXJzdCByYW5nZSBpZiBpdCBleGlzdHMgKG90aGVyd2lzZSBzdGF5cyBpbiBDcml0aWNNYXJrdXAgbm9kZSksIG5lZ2F0aXZlIG9mZnNldCB0byBiZSBsZWZ0LWluY2x1c2l2ZVxuXHRjdXJzb3IuY2hpbGRBZnRlcihzdGFydCAtIDEpO1xuXHRpZiAoY3Vyc29yLm5vZGUudHlwZS5uYW1lID09PSBcIkNyaXRpY01hcmt1cFwiKVxuXHRcdHJldHVybiByYW5nZXM7XG5cdGlmIChjdXJzb3Iubm9kZS5mcm9tID4gdG8pXG5cdFx0cmV0dXJuIHJhbmdlcztcblxuXHRpZiAoY3Vyc29yKSB7XG5cdFx0ZG8ge1xuXHRcdFx0Y29uc3QgcmFuZ2UgPSBjdXJzb3Iubm9kZTtcblx0XHRcdGlmIChyYW5nZS50eXBlLm5hbWUgPT09IFwiXHUyNkEwXCIpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3QgbmV3X3JhbmdlID0gY29uc3RydWN0UmFuZ2VGcm9tU3ludGF4Tm9kZShyYW5nZSwgdGV4dCk7XG5cdFx0XHRpZiAobmV3X3JhbmdlKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRuZXdfcmFuZ2UudHlwZSA9PT0gU3VnZ2VzdGlvblR5cGUuQ09NTUVOVCAmJiBwcmV2aW91c19yYW5nZSAmJlxuXHRcdFx0XHRcdHByZXZpb3VzX3JhbmdlLnJpZ2h0X2FkamFjZW50KG5ld19yYW5nZSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0KG5ld19yYW5nZSBhcyBDb21tZW50UmFuZ2UpLmFkZF9yZXBseShwcmV2aW91c19yYW5nZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmFuZ2VzLnB1c2gobmV3X3JhbmdlKTtcblx0XHRcdFx0cHJldmlvdXNfcmFuZ2UgPSBuZXdfcmFuZ2U7XG5cdFx0XHR9XG5cdFx0fSB3aGlsZSAoY3Vyc29yLm5leHRTaWJsaW5nKCkgJiYgY3Vyc29yLm5vZGUuZnJvbSA8PSB0byk7XG5cdH1cblxuXHRyZXR1cm4gcmFuZ2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0aW9uQ29udGFpbnNSYW5nZXMoc3RhdGU6IEVkaXRvclN0YXRlKSB7XG5cdGNvbnN0IHJhbmdlcyA9IHN0YXRlLmZpZWxkKHJhbmdlUGFyc2VyKS5yYW5nZXM7XG5cdHJldHVybiByYW5nZXMucmFuZ2VzLmxlbmd0aCA/XG5cdFx0c3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5zb21lKHJhbmdlID0+IHJhbmdlcy5jb250YWluc19yYW5nZShyYW5nZS5mcm9tLCByYW5nZS50bykpIDpcblx0XHRmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJhbmdlc0luVGV4dCh0ZXh0OiBzdHJpbmcpIHtcblx0Y29uc3QgdHJlZSA9IGNyaXRpY21hcmt1cExhbmd1YWdlLnBhcnNlci5wYXJzZSh0ZXh0KTtcblx0cmV0dXJuIGN1cnNvckdlbmVyYXRlUmFuZ2VzKHRyZWUsIHRleHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0UmFuZ2UoXG5cdGZyb206IG51bWJlcixcblx0dG86IG51bWJlcixcblx0dHlwZTogc3RyaW5nLFxuXHR0ZXh0OiBzdHJpbmcsXG5cdG1pZGRsZT86IG51bWJlcixcblx0bWV0YWRhdGE/OiBudW1iZXIsXG4pIHtcblx0c3dpdGNoICh0eXBlKSB7XG5cdFx0Y2FzZSBcIkFkZGl0aW9uXCI6XG5cdFx0XHRyZXR1cm4gbmV3IEFkZGl0aW9uUmFuZ2UoZnJvbSwgdG8sIHRleHQsIG1ldGFkYXRhKTtcblx0XHRjYXNlIFwiRGVsZXRpb25cIjpcblx0XHRcdHJldHVybiBuZXcgRGVsZXRpb25SYW5nZShmcm9tLCB0bywgdGV4dCwgbWV0YWRhdGEpO1xuXHRcdGNhc2UgXCJTdWJzdGl0dXRpb25cIjpcblx0XHRcdHJldHVybiBuZXcgU3Vic3RpdHV0aW9uUmFuZ2UoZnJvbSwgbWlkZGxlISwgdG8sIHRleHQsIG1ldGFkYXRhKTtcblx0XHRjYXNlIFwiSGlnaGxpZ2h0XCI6XG5cdFx0XHRyZXR1cm4gbmV3IEhpZ2hsaWdodFJhbmdlKGZyb20sIHRvLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdFx0Y2FzZSBcIkNvbW1lbnRcIjpcblx0XHRcdHJldHVybiBuZXcgQ29tbWVudFJhbmdlKGZyb20sIHRvLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdC8vIFdpbGwgbmV2ZXIgZ2V0IGNhbGxlZFxuXHRcdFx0cmV0dXJuIG5ldyBBZGRpdGlvblJhbmdlKGZyb20sIHRvLCB0ZXh0LCBtZXRhZGF0YSk7XG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IFJBTkdFX1BST1RPVFlQRV9NQVBQRVIgPSB7XG5cdFtTdWdnZXN0aW9uVHlwZS5BRERJVElPTl06IEFkZGl0aW9uUmFuZ2UsXG5cdFtTdWdnZXN0aW9uVHlwZS5ERUxFVElPTl06IERlbGV0aW9uUmFuZ2UsXG5cdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBIaWdobGlnaHRSYW5nZSxcblx0W1N1Z2dlc3Rpb25UeXBlLlNVQlNUSVRVVElPTl06IFN1YnN0aXR1dGlvblJhbmdlLFxuXHRbU3VnZ2VzdGlvblR5cGUuQ09NTUVOVF06IENvbW1lbnRSYW5nZSxcbn07XG4iLCAiaW1wb3J0IHsgQ2hhckNhdGVnb3J5LCBFZGl0b3JTZWxlY3Rpb24sIHR5cGUgRWRpdG9yU3RhdGUgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7XG5cdHR5cGUgQnJhY2tldE9wdGlvbnNNYXAsXG5cdHR5cGUgQ3Vyc29yT3B0aW9uc01hcCxcblx0UkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04sXG5cdFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04sXG59IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgZmluZEJsb2NraW5nQ2hhciwgZ2V0Q2hhckNhdGVnb3J5IH0gZnJvbSBcIi4uL2VkaXQtdXRpbFwiO1xuaW1wb3J0IHsgQ3JpdGljTWFya3VwUmFuZ2UsIENyaXRpY01hcmt1cFJhbmdlcywgU3VnZ2VzdGlvblR5cGUgfSBmcm9tIFwiLi4vcmFuZ2VzXCI7XG5pbXBvcnQgdHlwZSB7IEVkaXRvclJhbmdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZnVuY3Rpb24gY2F0X2lnbm9yZV93cyhjYXQ6IENoYXJDYXRlZ29yeSB8IG51bGwpIHtcblx0cmV0dXJuIGNhdCA9PT0gQ2hhckNhdGVnb3J5LlNwYWNlIHx8IGNhdCA9PT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY2F0X2RpZmZlcmVudChvbGRfY2F0OiBDaGFyQ2F0ZWdvcnkgfCBudWxsLCBuZXdfY2F0OiBDaGFyQ2F0ZWdvcnkgfCBudWxsKSB7XG5cdHJldHVybiBvbGRfY2F0ICE9PSBudWxsICYmIG9sZF9jYXQgIT09IENoYXJDYXRlZ29yeS5TcGFjZSAmJiBvbGRfY2F0ICE9PSBuZXdfY2F0O1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gZWZmaWNpZW50bHkgZmluZCB0aGUgbmV3IHN1Z2dlc3Rpb24gcmFuZ2UgYWZ0ZXIgYSBjdXJzb3IgbW92ZW1lbnRcbiAqIEBwYXJhbSBjdXJzb3JfaGVhZCAtIEN1cnJlbnQgY3Vyc29yIGhlYWRcbiAqIEBwYXJhbSByYW5nZXMgLSBBbGwgc3VnZ2VzdGlvbiByYW5nZXMgaW4gdGhlIGRvY3VtZW50XG4gKiBAcGFyYW0gcmFuZ2UgLSBDdXJyZW50IHN1Z2dlc3Rpb24gcmFuZ2VcbiAqIEByZW1hcmsgVGhpcyBmdW5jdGlvbiBleGlzdHMgdG8gcHJldmVudCBoYXZpbmcgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBzdWdnZXN0aW9uIHJhbmdlcyB3aGVuIHRyeWluZyB0byBmaW5kIHRoZSBuZXcgcmFuZ2UgYWZ0ZXIgYSBjdXJzb3IgbW92ZW1lbnRcbiAqL1xuZnVuY3Rpb24gZmluZF9yYW5nZV9jdXJzb3IoY3Vyc29yX2hlYWQ6IG51bWJlciwgcmFuZ2VzOiBDcml0aWNNYXJrdXBSYW5nZXMsIHJhbmdlOiBDcml0aWNNYXJrdXBSYW5nZSkge1xuXHRpZiAocmFuZ2UuY3Vyc29yX2luc2lkZShjdXJzb3JfaGVhZCkpXG5cdFx0cmV0dXJuIHJhbmdlO1xuXHRlbHNlIHtcblx0XHRjb25zdCBjaGVja19kaXJlY3Rpb24gPSByYW5nZS5jdXJzb3JfYmVmb3JlX3JhbmdlKGN1cnNvcl9oZWFkKTtcblx0XHRsZXQgcmFuZ2VfaWR4ID0gcmFuZ2VzLnJhbmdlcy5pbmRleE9mKHJhbmdlKSArIChjaGVja19kaXJlY3Rpb24gPyAtMSA6IDEpO1xuXG5cdFx0d2hpbGUgKHJhbmdlX2lkeCA+PSAwICYmIHJhbmdlX2lkeCA8IHJhbmdlcy5yYW5nZXMubGVuZ3RoKSB7XG5cdFx0XHRyYW5nZSA9IHJhbmdlcy5yYW5nZXNbcmFuZ2VfaWR4XTtcblx0XHRcdGlmIChjaGVja19kaXJlY3Rpb24gPyByYW5nZS5jdXJzb3JfYmVmb3JlX3JhbmdlKGN1cnNvcl9oZWFkKSA6IHJhbmdlLmN1cnNvcl9hZnRlcl9yYW5nZShjdXJzb3JfaGVhZCkpXG5cdFx0XHRcdHJhbmdlX2lkeCArPSBjaGVja19kaXJlY3Rpb24gPyAtMSA6IDE7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiByYW5nZS5jdXJzb3JfaW5zaWRlKGN1cnNvcl9oZWFkKSA/IHJhbmdlIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQWR2YW5jZSB0aGUgY3Vyc29yIHRocm91Z2ggQ3JpdGljTWFya3VwIHN5bnRheCwgYmFzZWQgb24gdGhlIG1vdmVtZW50IG9wdGlvbnMgZm9yIHRoZSByYW5nZSB0eXBlXG4gKiBAcGFyYW0gY3Vyc29yX2hlYWQgLSBDdXJyZW50IGN1cnNvciBoZWFkXG4gKiBAcGFyYW0gbW92ZV9mb3J3YXJkcyAtIFdoZXRoZXIgdGhlIGN1cnNvciBtb3ZlbWVudCBpcyBmb3J3YXJkcyBvciBiYWNrd2FyZHNcbiAqIEBwYXJhbSByYW5nZXMgLSBBbGwgc3VnZ2VzdGlvbiByYW5nZXMgaW4gdGhlIGRvY3VtZW50XG4gKiBAcGFyYW0gcmFuZ2UgLSBDdXJyZW50IHN1Z2dlc3Rpb24gcmFuZ2VcbiAqIEBwYXJhbSBtb3ZlbWVudF9vcHRpb25zIC0gT3B0aW9ucyBmb3IgY3Vyc29yIG1vdmVtZW50IHRocm91Z2ggc3VnZ2VzdGlvbiByYW5nZXNcbiAqIEBwYXJhbSBicmFja2V0X29wdGlvbnMgLSBPcHRpb25zIGZvciBjdXJzb3IgbW92ZW1lbnQgYmV0d2VlbiBkaWZmZXJlbnQgc3VnZ2VzdGlvbiByYW5nZXNcbiAqL1xuZnVuY3Rpb24gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdGN1cnNvcl9oZWFkOiBudW1iZXIsXG5cdG1vdmVfZm9yd2FyZHM6IGJvb2xlYW4sXG5cdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VzLFxuXHRyYW5nZTogQ3JpdGljTWFya3VwUmFuZ2UgfCB1bmRlZmluZWQsXG5cdG1vdmVtZW50X29wdGlvbnM6IEN1cnNvck9wdGlvbnNNYXAsXG5cdGJyYWNrZXRfb3B0aW9uczogQnJhY2tldE9wdGlvbnNNYXAgfCBudWxsLFxuKTogW251bWJlciwgQ3JpdGljTWFya3VwUmFuZ2UgfCB1bmRlZmluZWRdIHtcblx0aWYgKCFyYW5nZSlcblx0XHRyYW5nZSA9IHJhbmdlcy5yYW5nZV9hZGphY2VudF90b19jdXJzb3IoY3Vyc29yX2hlYWQsICFtb3ZlX2ZvcndhcmRzLCB0cnVlLCB0cnVlKTtcblx0ZWxzZVxuXHRcdHJhbmdlID0gZmluZF9yYW5nZV9jdXJzb3IoY3Vyc29yX2hlYWQsIHJhbmdlcywgcmFuZ2UpO1xuXG5cdGxldCBjdXJzb3JfY2hhbmdlZCA9IHRydWU7XG5cdHdoaWxlIChjdXJzb3JfY2hhbmdlZCAmJiByYW5nZSkge1xuXHRcdGNvbnN0IG9sZF9jdXJzb3JfaGVhZCA9IGN1cnNvcl9oZWFkO1xuXHRcdGN1cnNvcl9oZWFkID0gcmFuZ2UhLmN1cnNvcl9tb3ZlX3Rocm91Z2goY3Vyc29yX2hlYWQsIG1vdmVfZm9yd2FyZHMsIG1vdmVtZW50X29wdGlvbnNbcmFuZ2UhLnR5cGVdKTtcblx0XHRjdXJzb3JfY2hhbmdlZCA9IGN1cnNvcl9oZWFkICE9PSBvbGRfY3Vyc29yX2hlYWQ7XG5cdFx0aWYgKGN1cnNvcl9jaGFuZ2VkICYmIGN1cnNvcl9oZWFkID09PSAobW92ZV9mb3J3YXJkcyA/IHJhbmdlLnRvIDogcmFuZ2UuZnJvbSkpIHtcblx0XHRcdHJhbmdlID0gcmFuZ2VzLmFkamFjZW50X3JhbmdlKHJhbmdlISwgIW1vdmVfZm9yd2FyZHMsIHRydWUpO1xuXHRcdFx0aWYgKHJhbmdlICYmIGJyYWNrZXRfb3B0aW9ucyAmJiBicmFja2V0X29wdGlvbnNbcmFuZ2UudHlwZV0gPT09IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfT1VUU0lERSlcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFtjdXJzb3JfaGVhZCwgcmFuZ2VdO1xufVxuXG4vKipcbiAqIEBwYXJhbSBvbGRfaGVhZCAtIE9yaWdpbmFsIGN1cnNvciBoZWFkXG4gKiBAcGFyYW0gbmV3X2hlYWQgLSBDdXJzb3IgaGVhZCBhZnRlciAqcmVndWxhciogY3Vyc29yIG1vdmVtZW50XG4gKiBAcGFyYW0gcmFuZ2VzIC0gQWxsIHN1Z2dlc3Rpb24gcmFuZ2VzIGluIHRoZSBkb2N1bWVudFxuICogQHBhcmFtIG1vdmVfZm9yd2FyZHMgLSBXaGV0aGVyIHRoZSBjdXJzb3IgbW92ZW1lbnQgaXMgZm9yd2FyZHMgb3IgYmFja3dhcmRzXG4gKiBAcGFyYW0gYnlfd29yZF9ncm91cCAtIFdoZXRoZXIgdG8gbW92ZSBieSB3b3JkIGdyb3VwIChjdHJsL2FsdCArIGFycm93IGtleXMpXG4gKiBAcGFyYW0gaXNfc2VsZWN0aW9uIC0gV2hldGhlciB0byBleHRlbmQgdGhlIHNlbGVjdGlvbiBvZiB0aGUgb3JpZ2luYWwgcmFuZ2VcbiAqIEBwYXJhbSBpc19ibG9ja19jdXJzb3IgLSBXaGV0aGVyIGN1cnNvciBpcyBjb25zaWRlcmVkIGFzIGEgYmxvY2sgY3Vyc29yICh2aW0gbW9kZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIEVkaXRvciBzdGF0ZVxuICogQHBhcmFtIG1vdmVtZW50X29wdGlvbnMgLSBPcHRpb25zIGZvciBjdXJzb3IgbW92ZW1lbnQgdGhyb3VnaCBzdWdnZXN0aW9uIHJhbmdlc1xuICogQHBhcmFtIGJyYWNrZXRfb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGN1cnNvciBtb3ZlbWVudCB0aHJvdWdoIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZHZhbmNlX2N1cnNvcl9oZWFkKFxuXHRvbGRfaGVhZDogbnVtYmVyLFxuXHRuZXdfaGVhZDogbnVtYmVyLFxuXHRyYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlcyxcblx0bW92ZV9mb3J3YXJkczogYm9vbGVhbixcblx0Ynlfd29yZF9ncm91cDogYm9vbGVhbixcblx0aXNfYmxvY2tfY3Vyc29yID0gZmFsc2UsXG5cdHN0YXRlOiBFZGl0b3JTdGF0ZSxcblx0bW92ZW1lbnRfb3B0aW9uczogQ3Vyc29yT3B0aW9uc01hcCxcblx0YnJhY2tldF9vcHRpb25zOiBCcmFja2V0T3B0aW9uc01hcCxcbik6IG51bWJlciB7XG5cdC8vIE5PVEU6IFRoZSByZWFzb24gd2h5IGJvdGggb2xkIGFuZCBuZXcgY3Vyc29yIGhlYWQgYXJlIHVzZWQsIGlzIGJlY2F1c2UgaXQgaXMgbm90IHNpbXBsZSB0byBib3RoOlxuXHQvLyAgLSBSZWNyZWF0ZSB0aGUgZW50aXJlIG1vdmVtZW50IGFjdGlvbiBwYWxldHRlIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIGFuZCBhcHBseSBvbiBvcmlnaW5hbCByYW5nZSAoZS5nLiBtb3ZlIHRvIGJlZ2lubmluZyBvZiBub3RlLCAuLi4pXG5cdC8vICAgICAgICAgIC0+IFVzZSBuZXcgY3Vyc29yIGhlYWQgdG8gaGF2ZSBhIHN0YXJ0aW5nIHBvaW50XG5cdC8vICAtIFZlcmlmeSB0aGF0IG5vbmUgb2YgdGhlIHJhbmdlcyB0aGUgY3Vyc29yIHBhc3NlcyB0aHJvdWdoIHdpdGggdGhlIG9yaWdpbmFsIG1vdmVtZW50IGFyZSBibG9ja2luZyB1c2luZyBvbmx5IHRoZSBuZXcgY3Vyc29yIHJhbmdlXG5cdC8vICAgICAgICAgIC0+IE1vdmUgZnJvbSBvbGQgaGVhZCB0byB2ZXJpZnkgdGhhdCBub25lIG9mIHRoZSByYW5nZXMgYXJlIGJsb2NraW5nXG5cblx0bGV0IHN1Z2dlc3Rpb25fcmFuZ2UgPSByYW5nZXMucmFuZ2VfYWRqYWNlbnRfdG9fY3Vyc29yKG9sZF9oZWFkLCAhbW92ZV9mb3J3YXJkcywgdHJ1ZSwgIWJ5X3dvcmRfZ3JvdXApO1xuXG5cdC8vIElmIG5vIHJhbmdlIGV4aXN0cyBpbiBtb3ZlbWVudCBkaXJlY3Rpb24gT1IgY3Vyc29yIGhhcyBub3QgcGFzc2VkIGEgcmFuZ2UgT1IgbW92ZW1lbnQgdGhyb3VnaCByYW5nZSBpcyBzZXQgdG8gYmUgdGhlIHNhbWUsXG5cdC8vIHRoZW4ganVzdCByZXR1cm4gdGhlIG5ldyByYW5nZSBhcy1pcyB3aXRob3V0IGFkZGl0aW9uYWwgcHJvY2Vzc2luZ1xuXHRpZiAoXG5cdFx0IXN1Z2dlc3Rpb25fcmFuZ2UgfHxcblx0XHQobW92ZV9mb3J3YXJkcyA/XG5cdFx0XHRzdWdnZXN0aW9uX3JhbmdlLmN1cnNvcl9iZWZvcmVfcmFuZ2UobmV3X2hlYWQpIDpcblx0XHRcdHN1Z2dlc3Rpb25fcmFuZ2UuY3Vyc29yX2FmdGVyX3JhbmdlKG5ld19oZWFkKSkgfHxcblx0XHRtb3ZlbWVudF9vcHRpb25zW3N1Z2dlc3Rpb25fcmFuZ2UudHlwZV0gPT09IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04uVU5DSEFOR0VEXG5cdCkge1xuXHRcdHJldHVybiBuZXdfaGVhZDtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGRpZmZlcmVuY2UgaW4gbW92ZW1lbnQgaXMgb25seSBvbmUgY2hhcmFjdGVyIChzaW5nbGUgY2hhcmFjdGVyIG1vdmVtZW50KVxuXHRpZiAoIWJ5X3dvcmRfZ3JvdXAgJiYgTWF0aC5hYnMob2xkX2hlYWQgLSBuZXdfaGVhZCkgPT09IDEpIHtcblx0XHRbbmV3X2hlYWQsIHN1Z2dlc3Rpb25fcmFuZ2VdID0gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdFx0XHRvbGRfaGVhZCxcblx0XHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0XHRyYW5nZXMsXG5cdFx0XHRzdWdnZXN0aW9uX3JhbmdlLFxuXHRcdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRcdGJyYWNrZXRfb3B0aW9ucyxcblx0XHQpO1xuXHRcdG5ld19oZWFkID0gbmV3X2hlYWQgKyAobW92ZV9mb3J3YXJkcyA/IDEgOiAtMSk7XG5cdH0gZWxzZSBpZiAoIWJ5X3dvcmRfZ3JvdXApIHtcblx0XHRbbmV3X2hlYWQsIHN1Z2dlc3Rpb25fcmFuZ2VdID0gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdFx0XHRuZXdfaGVhZCxcblx0XHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0XHRyYW5nZXMsXG5cdFx0XHRzdWdnZXN0aW9uX3JhbmdlLFxuXHRcdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRcdGJyYWNrZXRfb3B0aW9ucyxcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdGxldCBwcmV2aW91c19yZWdfY2hhciA9IGN1cnNvcl9hZHZhbmNlX3Rocm91Z2hfc3ludGF4KFxuXHRcdFx0bmV3X2hlYWQsXG5cdFx0XHQhbW92ZV9mb3J3YXJkcyxcblx0XHRcdHJhbmdlcyxcblx0XHRcdHN1Z2dlc3Rpb25fcmFuZ2UsXG5cdFx0XHRtb3ZlbWVudF9vcHRpb25zLFxuXHRcdFx0bnVsbCxcblx0XHQpWzBdO1xuXHRcdGxldCBwcmV2aW91c19jYXQgPSBudWxsLFxuXHRcdFx0Y3VycmVudF9jYXQgPSAocHJldmlvdXNfcmVnX2NoYXIgPT09IG9sZF9oZWFkKSA/XG5cdFx0XHRcdG51bGwgOlxuXHRcdFx0XHRnZXRDaGFyQ2F0ZWdvcnkocHJldmlvdXNfcmVnX2NoYXIsIHN0YXRlLCBtb3ZlX2ZvcndhcmRzKTtcblx0XHRsZXQgbmV4dF9jdXJzb3JfaGVhZCA9IG5ld19oZWFkO1xuXG5cdFx0d2hpbGUgKCFjYXRfZGlmZmVyZW50KHByZXZpb3VzX2NhdCwgY3VycmVudF9jYXQpKSB7XG5cdFx0XHRuZXdfaGVhZCA9IG5leHRfY3Vyc29yX2hlYWQ7XG5cdFx0XHRwcmV2aW91c19jYXQgPSBjdXJyZW50X2NhdDtcblx0XHRcdFtuZXdfaGVhZCwgc3VnZ2VzdGlvbl9yYW5nZV0gPSBjdXJzb3JfYWR2YW5jZV90aHJvdWdoX3N5bnRheChcblx0XHRcdFx0bmV3X2hlYWQsXG5cdFx0XHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0XHRcdHJhbmdlcyxcblx0XHRcdFx0c3VnZ2VzdGlvbl9yYW5nZSxcblx0XHRcdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRcdFx0YnJhY2tldF9vcHRpb25zLFxuXHRcdFx0KTtcblx0XHRcdG5leHRfY3Vyc29yX2hlYWQgPVxuXHRcdFx0XHRmaW5kQmxvY2tpbmdDaGFyKG5ld19oZWFkLCBtb3ZlX2ZvcndhcmRzLCBzdGF0ZSwgY2F0X2lnbm9yZV93cyhwcmV2aW91c19jYXQpLCBwcmV2aW91c19jYXQpWzBdO1xuXHRcdFx0aWYgKG5leHRfY3Vyc29yX2hlYWQgPT09IG5ld19oZWFkKVxuXHRcdFx0XHRicmVhaztcblx0XHRcdHByZXZpb3VzX3JlZ19jaGFyID0gY3Vyc29yX2FkdmFuY2VfdGhyb3VnaF9zeW50YXgoXG5cdFx0XHRcdG5leHRfY3Vyc29yX2hlYWQsXG5cdFx0XHRcdCFtb3ZlX2ZvcndhcmRzLFxuXHRcdFx0XHRyYW5nZXMsXG5cdFx0XHRcdHN1Z2dlc3Rpb25fcmFuZ2UsXG5cdFx0XHRcdG1vdmVtZW50X29wdGlvbnMsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHQpWzBdO1xuXHRcdFx0Y3VycmVudF9jYXQgPSBnZXRDaGFyQ2F0ZWdvcnkocHJldmlvdXNfcmVnX2NoYXIsIHN0YXRlLCBtb3ZlX2ZvcndhcmRzKTtcblx0XHR9XG5cdH1cblxuXHQvLyBQb3N0LXByb2Nlc3Npbmcgc3RlcDogbW92ZSBjdXJzb3IgYmFjayB0byBpbnNpZGUgcmFuZ2UgaWYgbmVjZXNzYXJ5XG5cdGlmIChzdWdnZXN0aW9uX3JhbmdlICYmICEobmV3X2hlYWQgPT09IDAgfHwgbmV3X2hlYWQgPT09IHN0YXRlLmRvYy5sZW5ndGgpKSB7XG5cdFx0Y29uc3QgcmFuZ2VfYmFjayA9IG1vdmVfZm9yd2FyZHMgPyBzdWdnZXN0aW9uX3JhbmdlLnRvIDogc3VnZ2VzdGlvbl9yYW5nZS5mcm9tO1xuXHRcdGNvbnN0IG9mZnNldCA9IG1vdmVfZm9yd2FyZHMgPyAxIDogLTE7XG5cdFx0aWYgKG5ld19oZWFkID09PSByYW5nZV9iYWNrKSB7XG5cdFx0XHRpZiAoYnJhY2tldF9vcHRpb25zW3N1Z2dlc3Rpb25fcmFuZ2UudHlwZV0gPT09IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfSU5TSURFKVxuXHRcdFx0XHRuZXdfaGVhZCA9IHJhbmdlX2JhY2sgLSAzICogb2Zmc2V0O1xuXHRcdH0gZWxzZSBpZiAoc3VnZ2VzdGlvbl9yYW5nZS50b3VjaGVzX2JyYWNrZXQobmV3X2hlYWQsIG1vdmVfZm9yd2FyZHMsIGZhbHNlLCB0cnVlKSkge1xuXHRcdFx0bmV3X2hlYWQgPSBtb3ZlX2ZvcndhcmRzID8gc3VnZ2VzdGlvbl9yYW5nZS5mcm9tIDogc3VnZ2VzdGlvbl9yYW5nZS50bztcblx0XHR9XG5cdH1cblxuXHQvLyBTYW5pdHkgY2hlY2s6IGNsYW1wIGN1cnNvciB0byBkb2N1bWVudCBsZW5ndGhcblx0cmV0dXJuIE1hdGguY2xhbXAobmV3X2hlYWQsIDAsIHN0YXRlLmRvYy5sZW5ndGgpO1xufVxuXG4vKipcbiAqIEBwYXJhbSBvbGRfY3Vyc29yX3JhbmdlIC0gT3JpZ2luYWwgY3Vyc29yIHJhbmdlXG4gKiBAcGFyYW0gbmV3X2N1cnNvcl9yYW5nZSAtIEN1cnNvciByYW5nZSBhZnRlciAqcmVndWxhciogY3Vyc29yIG1vdmVtZW50XG4gKiBAcGFyYW0gcmFuZ2VzIC0gQWxsIHN1Z2dlc3Rpb24gcmFuZ2VzIGluIHRoZSBkb2N1bWVudFxuICogQHBhcmFtIG1vdmVfZm9yd2FyZHMgLSBXaGV0aGVyIHRoZSBjdXJzb3IgbW92ZW1lbnQgaXMgZm9yd2FyZHMgb3IgYmFja3dhcmRzXG4gKiBAcGFyYW0gYnlfd29yZF9ncm91cCAtIFdoZXRoZXIgdG8gbW92ZSBieSB3b3JkIGdyb3VwIChjdHJsL2FsdCArIGFycm93IGtleXMpXG4gKiBAcGFyYW0gaXNfc2VsZWN0aW9uIC0gV2hldGhlciB0byBleHRlbmQgdGhlIHNlbGVjdGlvbiBvZiB0aGUgb3JpZ2luYWwgcmFuZ2VcbiAqIEBwYXJhbSBpc19ibG9ja19jdXJzb3IgLSBXaGV0aGVyIGN1cnNvciBpcyBjb25zaWRlcmVkIGFzIGEgYmxvY2sgY3Vyc29yICh2aW0gbW9kZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIEVkaXRvciBzdGF0ZVxuICogQHBhcmFtIG1vdmVtZW50X29wdGlvbnMgLSBPcHRpb25zIGZvciBjdXJzb3IgbW92ZW1lbnQgdGhyb3VnaCBzdWdnZXN0aW9uIHJhbmdlc1xuICogQHBhcmFtIGJyYWNrZXRfb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGN1cnNvciBtb3ZlbWVudCB0aHJvdWdoIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXJzb3JfbW92ZShcblx0b2xkX2N1cnNvcl9yYW5nZTogRWRpdG9yUmFuZ2UsXG5cdG5ld19jdXJzb3JfcmFuZ2U6IEVkaXRvclJhbmdlLFxuXHRyYW5nZXM6IENyaXRpY01hcmt1cFJhbmdlcyxcblx0bW92ZV9mb3J3YXJkczogYm9vbGVhbixcblx0Ynlfd29yZF9ncm91cDogYm9vbGVhbixcblx0aXNfc2VsZWN0aW9uOiBib29sZWFuLFxuXHRpc19ibG9ja19jdXJzb3IgPSBmYWxzZSxcblx0c3RhdGU6IEVkaXRvclN0YXRlLFxuXHRtb3ZlbWVudF9vcHRpb25zOiBDdXJzb3JPcHRpb25zTWFwLFxuXHRicmFja2V0X29wdGlvbnM6IEJyYWNrZXRPcHRpb25zTWFwLFxuKSB7XG5cdGNvbnN0IGN1cnNvcl9oZWFkID0gYWR2YW5jZV9jdXJzb3JfaGVhZChcblx0XHRvbGRfY3Vyc29yX3JhbmdlLmhlYWQhLFxuXHRcdG5ld19jdXJzb3JfcmFuZ2UuaGVhZCEsXG5cdFx0cmFuZ2VzLFxuXHRcdG1vdmVfZm9yd2FyZHMsXG5cdFx0Ynlfd29yZF9ncm91cCxcblx0XHRpc19ibG9ja19jdXJzb3IsXG5cdFx0c3RhdGUsXG5cdFx0bW92ZW1lbnRfb3B0aW9ucyxcblx0XHRicmFja2V0X29wdGlvbnMsXG5cdCk7XG5cdGxldCBjdXJzb3JfYW5jaG9yID0gb2xkX2N1cnNvcl9yYW5nZS5hbmNob3IhO1xuXG5cdGlmICghaXNfc2VsZWN0aW9uKVxuXHRcdGN1cnNvcl9hbmNob3IgPSBjdXJzb3JfaGVhZDtcblxuXHRyZXR1cm4geyBzZWxlY3Rpb246IEVkaXRvclNlbGVjdGlvbi5yYW5nZShjdXJzb3JfYW5jaG9yLCBjdXJzb3JfaGVhZCkgfTtcbn1cblxuY29uc3QgZGVmYXVsdF9tb3ZlbWVudF9vcHRpb25zOiBDdXJzb3JPcHRpb25zTWFwID0ge1xuXHRbU3VnZ2VzdGlvblR5cGUuQURESVRJT05dOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0W1N1Z2dlc3Rpb25UeXBlLkRFTEVUSU9OXTogUkFOR0VfQ1VSU09SX01PVkVNRU5UX09QVElPTi5JR05PUkVfTUVUQURBVEEsXG5cdFtTdWdnZXN0aW9uVHlwZS5TVUJTVElUVVRJT05dOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0W1N1Z2dlc3Rpb25UeXBlLkNPTU1FTlRdOiBSQU5HRV9DVVJTT1JfTU9WRU1FTlRfT1BUSU9OLklHTk9SRV9NRVRBREFUQSxcblx0W1N1Z2dlc3Rpb25UeXBlLkhJR0hMSUdIVF06IFJBTkdFX0NVUlNPUl9NT1ZFTUVOVF9PUFRJT04uSUdOT1JFX01FVEFEQVRBLFxufTtcblxuY29uc3QgYnJhY2tldF9tb3ZlbWVudF9vcHRpb25zOiBCcmFja2V0T3B0aW9uc01hcCA9IHtcblx0W1N1Z2dlc3Rpb25UeXBlLkFERElUSU9OXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFtTdWdnZXN0aW9uVHlwZS5ERUxFVElPTl06IFJBTkdFX0JSQUNLRVRfTU9WRU1FTlRfT1BUSU9OLlNUQVlfSU5TSURFLFxuXHRbU3VnZ2VzdGlvblR5cGUuU1VCU1RJVFVUSU9OXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFtTdWdnZXN0aW9uVHlwZS5DT01NRU5UXTogUkFOR0VfQlJBQ0tFVF9NT1ZFTUVOVF9PUFRJT04uU1RBWV9JTlNJREUsXG5cdFtTdWdnZXN0aW9uVHlwZS5ISUdITElHSFRdOiBSQU5HRV9CUkFDS0VUX01PVkVNRU5UX09QVElPTi5TVEFZX0lOU0lERSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjdXJzb3JfbW92ZV9yYW5nZTxUIGV4dGVuZHMgRWRpdG9yUmFuZ2U+KFxuXHRjdXJzb3JfcmFuZ2U6IFQsXG5cdHJhbmdlczogQ3JpdGljTWFya3VwUmFuZ2VzLFxuXHRiYWNrd2FyZHNfZGVsZXRlOiBib29sZWFuLFxuXHRncm91cF9kZWxldGU6IGJvb2xlYW4sXG5cdHN0YXRlOiBFZGl0b3JTdGF0ZSxcblx0bW92ZW1lbnRfb3B0aW9uczogQ3Vyc29yT3B0aW9uc01hcCA9IGRlZmF1bHRfbW92ZW1lbnRfb3B0aW9ucyxcblx0YnJhY2tldF9vcHRpb25zOiBCcmFja2V0T3B0aW9uc01hcCA9IGJyYWNrZXRfbW92ZW1lbnRfb3B0aW9ucyxcbik6IFQge1xuXHRpZiAoIWN1cnNvcl9yYW5nZS5zZWxlY3Rpb24pIHtcblx0XHRjb25zdCBjdXJzb3JfYW5jaG9yID0gY3Vyc29yX3JhbmdlLmFuY2hvciE7XG5cdFx0bGV0IGN1cnNvcl9oZWFkID0gYmFja3dhcmRzX2RlbGV0ZSA/IGN1cnNvcl9yYW5nZS5mcm9tIDogY3Vyc29yX3JhbmdlLnRvO1xuXHRcdGN1cnNvcl9oZWFkID0gYWR2YW5jZV9jdXJzb3JfaGVhZChcblx0XHRcdGN1cnNvcl9hbmNob3IsXG5cdFx0XHRjdXJzb3JfaGVhZCxcblx0XHRcdHJhbmdlcyxcblx0XHRcdCFiYWNrd2FyZHNfZGVsZXRlLFxuXHRcdFx0Z3JvdXBfZGVsZXRlLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRzdGF0ZSxcblx0XHRcdG1vdmVtZW50X29wdGlvbnMsXG5cdFx0XHRicmFja2V0X29wdGlvbnMsXG5cdFx0KTtcblx0XHRpZiAoYmFja3dhcmRzX2RlbGV0ZSlcblx0XHRcdGN1cnNvcl9yYW5nZS5mcm9tID0gY3Vyc29yX2hlYWQ7XG5cdFx0ZWxzZVxuXHRcdFx0Y3Vyc29yX3JhbmdlLnRvID0gY3Vyc29yX2hlYWQ7XG5cdH1cblx0cmV0dXJuIGN1cnNvcl9yYW5nZTtcbn1cbiIsICJpbXBvcnQgeyBDcml0aWNNYXJrdXBSYW5nZSwgZ2V0UmFuZ2VzSW5UZXh0IH0gZnJvbSBcIi4vZWRpdG9yL2Jhc2VcIjtcbmltcG9ydCB7IENPTU1FTlRBVE9SX0dMT0JBTCB9IGZyb20gXCIuL2dsb2JhbFwiO1xuaW1wb3J0IHsgdHlwZSBQbHVnaW5TZXR0aW5ncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbmRleFdvcmtlcihmaWxlczogc3RyaW5nW10sIHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8Q3JpdGljTWFya3VwUmFuZ2VbXVtdPiB7XG5cdENPTU1FTlRBVE9SX0dMT0JBTC5QTFVHSU5fU0VUVElOR1MgPSBzZXR0aW5ncztcblx0cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGZpbGVzLm1hcChhc3luYyAoZmlsZTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIGdldFJhbmdlc0luVGV4dChmaWxlKTtcblx0fSkpO1xufVxuIiwgIi8vIEV4cG9ydCBhIGluZGV4V29ya2VyIGZ1bmN0aW9uIGluIEByb290L2luZGV4LXdvcmtlci50cyBpbiBvcmRlciB0byBkZWZpbmUgdGhlIHdvcmtlclxuaW1wb3J0IHsgaW5kZXhXb3JrZXIgfSBmcm9tIFwiaW5kZXgtd29ya2VyXCI7XG5cbnNlbGYub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7XG5cdHNlbGYucG9zdE1lc3NhZ2UoYXdhaXQgaW5kZXhXb3JrZXIoZXZlbnQuZGF0YS5maWxlcywgZXZlbnQuZGF0YS5zZXR0aW5ncykpO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICJzTEFtQ08sSUFBTUEsR0FBNEQsQ0FDdkUsU0FBMEIsQ0FBQyxNQUFPLEtBQUssRUFDdkMsU0FBMEIsQ0FBQyxNQUFPLEtBQUssRUFDdkMsYUFBOEIsQ0FBQyxNQUFPLEtBQU0sS0FBSyxFQUNqRCxVQUEyQixDQUFDLE1BQU8sS0FBSyxFQUN4QyxRQUF5QixDQUFDLE1BQU8sS0FBSyxDQUN4QyxFQ3BDQSxJQUFNQyxHQUFtQixDQUN4QixFQUFLLFNBQ0wsRUFBSyxPQUNMLEVBQUssT0FDTCxFQUFLLFFBQ0wsRUFBSyxPQUNOLEVBV3NCQyxHQUFmLEtBQWlDLENBSTdCLFlBQ0ZDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ04sQ0FOTSxVQUFBTCxFQUNBLFFBQUFDLEVBQ0EsVUFBQUMsRUFDQSxVQUFBQyxFQUNBLFVBQUFDLEVBQ0EsY0FBQUMsRUFUUkMsR0FBQSxjQUF5QixDQUFDLEdBQzFCQSxHQUFBLGVBQTBCLENBQUMsR0FVMUIsR0FBSUQsSUFBYSxPQUFXLENBQzNCLElBQU1FLEVBQXFCRixFQUFXTCxFQUNoQ1EsRUFBZ0JKLEVBQUssTUFBTSxFQUFHRyxDQUFrQixFQUN0RCxLQUFLLEtBQU9ILEVBQUssTUFBTSxFQUFHLENBQUMsRUFBSUEsRUFBSyxNQUFNRyxFQUFxQixDQUFDLEVBQ2hFLEdBQUksQ0FNSCxLQUFLLE9BQVMsS0FBSyxNQUFNQyxDQUFhLEVBQ3RDLFFBQVdDLEtBQU8sS0FBSyxPQUNsQkEsS0FBT1gsS0FFVixLQUFLLE9BQU9BLEdBQWlCVyxDQUFHLENBQUMsRUFBSSxLQUFLLE9BQU9BLENBQUcsRUFDcEQsT0FBTyxLQUFLLE9BQU9BLENBQStCLEVBR3JELE9BQVNDLEVBQUcsQ0FFWCxLQUFLLE9BQVMsQ0FBQyxDQUNoQixDQUNELENBQ0QsQ0FFQSxJQUFJLFlBQWdDLENBQ25D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RCx1QkFDQSx1QkFDQSwyQkFDQSxzQkFDQSx1QkFDRixFQ2hRQSxlQUFzQkMsR0FBWUMsRUFBaUJDLEVBQTBELENBQzVHLE9BQUFDLEdBQW1CLGdCQUFrQkQsRUFDOUIsTUFBTSxRQUFRLElBQUlELEVBQU0sSUFBSSxNQUFPRyxHQUNsQ0MsR0FBZ0JELENBQUksQ0FDM0IsQ0FBQyxDQUNILENDTkEsS0FBSyxVQUFZLE1BQU9FLEdBQVUsQ0FDakMsS0FBSyxZQUFZLE1BQU1DLEdBQVlELEVBQU0sS0FBSyxNQUFPQSxFQUFNLEtBQUssUUFBUSxDQUFDLENBQzFFIiwKICAibmFtZXMiOiBbIkNNX0FsbF9CcmFja2V0cyIsICJzaG9ydEhhbmRNYXBwaW5nIiwgIkNyaXRpY01hcmt1cFJhbmdlIiwgImZyb20iLCAidG8iLCAidHlwZSIsICJyZXByIiwgInRleHQiLCAibWV0YWRhdGEiLCAiX19wdWJsaWNGaWVsZCIsICJtZXRhZGF0YV9zZXBhcmF0b3IiLCAibWV0YWRhdGFfdGV4dCIsICJrZXkiLCAiZSIsICJyZXBseSIsICJ2YWx1ZSIsICJmaWVsZHMiLCAicmFuZ2UiLCAib3RoZXIiLCAibGVmdCIsICJzdGFydCIsICJlbmQiLCAic3RyaWN0IiwgImN1cnNvciIsICJza2lwX21ldGFkYXRhIiwgInJpZ2h0IiwgIm1vdmVtZW50IiwgIm91dHNpZGVfbG9vc2UiLCAiaW5zaWRlX2xvb3NlIiwgImluY2x1ZGVfbWV0YWRhdGEiLCAibGVmdF9sb29zZSIsICJyaWdodF9sb29zZSIsICJ1bndyYXAiLCAicHJldmlld01vZGUiLCAidGFnIiwgInN0ciIsICJDTV9BbGxfQnJhY2tldHMiLCAib2Zmc2V0IiwgIkFkZGl0aW9uUmFuZ2UiLCAiQ3JpdGljTWFya3VwUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJ0ZXh0IiwgIm1ldGFkYXRhIiwgInVud3JhcCIsICJwcmV2aWV3TW9kZSIsICJ0YWciLCAibGVmdCIsICJzdHIiLCAiQ01fQWxsX0JyYWNrZXRzIiwgImNscyIsICJDb21tZW50UmFuZ2UiLCAiQ3JpdGljTWFya3VwUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJ0ZXh0IiwgIm1ldGFkYXRhIiwgIl9fcHVibGljRmllbGQiLCAicmFuZ2UiLCAiRGVsZXRpb25SYW5nZSIsICJDcml0aWNNYXJrdXBSYW5nZSIsICJmcm9tIiwgInRvIiwgInRleHQiLCAibWV0YWRhdGEiLCAidW53cmFwIiwgInByZXZpZXdNb2RlIiwgInRhZyIsICJsZWZ0IiwgInN0ciIsICJDTV9BbGxfQnJhY2tldHMiLCAiY2xzIiwgIkhpZ2hsaWdodFJhbmdlIiwgIkNyaXRpY01hcmt1cFJhbmdlIiwgImZyb20iLCAidG8iLCAidGV4dCIsICJtZXRhZGF0YSIsICJTdWJzdGl0dXRpb25SYW5nZSIsICJDcml0aWNNYXJrdXBSYW5nZSIsICJmcm9tIiwgIm1pZGRsZSIsICJ0byIsICJ0ZXh0IiwgIm1ldGFkYXRhIiwgImxlZnQiLCAib2Zmc2V0IiwgImN1cnNvciIsICJsZWZ0X2xvb3NlIiwgInJpZ2h0X2xvb3NlIiwgInN0cmljdCIsICJyaWdodCIsICJza2lwX21ldGFkYXRhIiwgInN0YXJ0IiwgImVuZCIsICJ1bndyYXAiLCAicHJldmlld01vZGUiLCAidGFnIiwgInN0ciIsICJwYXJ0cyIsICJDTV9BbGxfQnJhY2tldHMiLCAiY2xzIiwgInJhbmdlIiwgInJhbmdlRnJvbSIsICJyYW5nZVRvIiwgIm51bWJlcnMiLCAicyIsICJpIiwgIm4iLCAiaXNFeHRlbmRpbmdDaGFyIiwgImNvZGUiLCAiZnJvbSIsICJ0byIsICJtaWQiLCAiaXNSZWdpb25hbEluZGljYXRvciIsICJaV0oiLCAiZmluZENsdXN0ZXJCcmVhayIsICJzdHIiLCAicG9zIiwgImZvcndhcmQiLCAiaW5jbHVkZUV4dGVuZGluZyIsICJuZXh0Q2x1c3RlckJyZWFrIiwgInByZXZDbHVzdGVyQnJlYWsiLCAic3Vycm9nYXRlTG93IiwgInN1cnJvZ2F0ZUhpZ2giLCAicHJldiIsICJjb2RlUG9pbnRBdCIsICJjb2RlUG9pbnRTaXplIiwgIm5leHQiLCAiaXNFeHRlbmRpbmdDaGFyIiwgImlzUmVnaW9uYWxJbmRpY2F0b3IiLCAiY291bnRCZWZvcmUiLCAiaSIsICJmb3VuZCIsICJjb2RlMCIsICJjb2RlMSIsICJjaCIsICJjb2RlIiwgIlRleHQiLCAiX1RleHQiLCAicG9zIiwgIm4iLCAiZnJvbSIsICJ0byIsICJ0ZXh0IiwgImNsaXAiLCAicGFydHMiLCAiVGV4dE5vZGUiLCAib3RoZXIiLCAic3RhcnQiLCAiZW5kIiwgImEiLCAiUmF3VGV4dEN1cnNvciIsICJiIiwgInNraXAiLCAiZGlyIiwgIlBhcnRpYWxUZXh0Q3Vyc29yIiwgImlubmVyIiwgIkxpbmVDdXJzb3IiLCAibGluZXMiLCAiVGV4dExlYWYiLCAiX1RleHRMZWFmIiwgImxlbmd0aCIsICJ0ZXh0TGVuZ3RoIiwgInRhcmdldCIsICJpc0xpbmUiLCAibGluZSIsICJvZmZzZXQiLCAiaSIsICJzdHJpbmciLCAiTGluZSIsICJvcGVuIiwgInNsaWNlVGV4dCIsICJwcmV2IiwgImpvaW5lZCIsICJhcHBlbmRUZXh0IiwgIm1pZCIsICJuZXdMZW4iLCAibGluZVNlcCIsICJyZXN1bHQiLCAicGFydCIsICJsZW4iLCAiX1RleHROb2RlIiwgImNoaWxkcmVuIiwgImNoaWxkIiwgImVuZExpbmUiLCAiY2hpbGRPcGVuIiwgInVwZGF0ZWQiLCAidG90YWxMaW5lcyIsICJjb3B5IiwgImlBIiwgImlCIiwgImVBIiwgImVCIiwgImNoQSIsICJjaEIiLCAibCIsICJjaCIsICJmbGF0IiwgImNodW5rIiwgIm1heENodW5rIiwgIm1pbkNodW5rIiwgImNodW5rZWQiLCAiY3VycmVudExpbmVzIiwgImN1cnJlbnRMZW4iLCAiY3VycmVudENodW5rIiwgImFkZCIsICJsYXN0IiwgIm5vZGUiLCAiZmx1c2giLCAiZmlyc3QiLCAidG9wIiwgIm9mZnNldFZhbHVlIiwgInNpemUiLCAibmV4dCIsICJsaW1pdCIsICJ2YWx1ZSIsICJkb25lIiwgImxpbmVCcmVhayIsICJudW1iZXIiLCAiZmluZENsdXN0ZXJCcmVhayIsICJzdHIiLCAiZm9yd2FyZCIsICJpbmNsdWRlRXh0ZW5kaW5nIiwgIkRlZmF1bHRTcGxpdCIsICJNYXBNb2RlIiwgIkNoYW5nZURlc2MiLCAiX0NoYW5nZURlc2MiLCAic2VjdGlvbnMiLCAicmVzdWx0IiwgImkiLCAiaW5zIiwgImYiLCAicG9zQSIsICJwb3NCIiwgImxlbiIsICJpbmRpdmlkdWFsIiwgIml0ZXJDaGFuZ2VzIiwgIm90aGVyIiwgImNvbXBvc2VTZXRzIiwgImJlZm9yZSIsICJtYXBTZXQiLCAicG9zIiwgImFzc29jIiwgIm1vZGUiLCAiZW5kQSIsICJmcm9tIiwgInRvIiwgImVuZCIsICJqc29uIiwgImEiLCAiQ2hhbmdlU2V0IiwgIl9DaGFuZ2VTZXQiLCAiaW5zZXJ0ZWQiLCAiZG9jIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJfdG9CIiwgInRleHQiLCAiaW5kZXgiLCAiVGV4dCIsICJyYW5nZXMiLCAicmVzdWx0U2VjdGlvbnMiLCAicmVzdWx0SW5zZXJ0ZWQiLCAiZmlsdGVyZWRTZWN0aW9ucyIsICJpdGVyIiwgIlNlY3Rpb25JdGVyIiwgImRvbmUiLCAibmV4dCIsICJhZGRTZWN0aW9uIiwgImFkZEluc2VydCIsICJwYXJ0cyIsICJjaGFuZ2VzIiwgImxlbmd0aCIsICJsaW5lU2VwIiwgInRvdGFsIiwgImZsdXNoIiwgImZvcmNlIiwgInNldCIsICJwcm9jZXNzIiwgInNwZWMiLCAic3ViIiwgImluc2VydCIsICJpbnNUZXh0IiwgImluc0xlbiIsICJwYXJ0IiwgImUiLCAiZm9yY2VKb2luIiwgImxhc3QiLCAidmFsdWVzIiwgInZhbHVlIiwgImRlc2MiLCAiZW5kQiIsICJzZXRBIiwgInNldEIiLCAibWtTZXQiLCAiYiIsICJwaWVjZSIsICJsZWZ0IiwgIm9wZW4iLCAic2VjdGlvbkxlbiIsICJpbnNCIiwgIlNlbGVjdGlvblJhbmdlIiwgIl9TZWxlY3Rpb25SYW5nZSIsICJmbGFncyIsICJsZXZlbCIsICJjaGFuZ2UiLCAiRWRpdG9yU2VsZWN0aW9uIiwgImhlYWQiLCAiaW5jbHVkZUFzc29jIiwgIl9FZGl0b3JTZWxlY3Rpb24iLCAibWFpbkluZGV4IiwgInIiLCAicmFuZ2UiLCAibWFpbiIsICJ3aGljaCIsICJhbmNob3IiLCAiYmlkaUxldmVsIiwgImdvYWxDb2x1bW4iLCAicHJldiIsICJjaGVja1NlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiZG9jTGVuZ3RoIiwgIm5leHRJRCIsICJGYWNldCIsICJfRmFjZXQiLCAiY29tYmluZSIsICJjb21wYXJlSW5wdXQiLCAiY29tcGFyZSIsICJpc1N0YXRpYyIsICJlbmFibGVzIiwgImNvbmZpZyIsICJzYW1lQXJyYXkiLCAiRmFjZXRQcm92aWRlciIsICJkZXBzIiwgImdldCIsICJmaWVsZCIsICJ4IiwgInN0YXRlIiwgImRlcGVuZGVuY2llcyIsICJmYWNldCIsICJ0eXBlIiwgImFkZHJlc3NlcyIsICJfYSIsICJnZXR0ZXIiLCAiaWQiLCAiaWR4IiwgIm11bHRpIiwgImRlcERvYyIsICJkZXBTZWwiLCAiZGVwQWRkcnMiLCAiZGVwIiwgInRyIiwgImVuc3VyZUFsbCIsICJuZXdWYWwiLCAiY29tcGFyZUFycmF5IiwgIm9sZFN0YXRlIiwgIm9sZEFkZHIiLCAib2xkVmFsIiwgImdldEFkZHIiLCAiU3RhdGVGaWVsZCIsICJhZGRycyIsICJjaGFuZ2VkIiwgImFkZHIiLCAiZW5zdXJlQWRkciIsICJkeW5hbWljRmFjZXRTbG90IiwgInByb3ZpZGVycyIsICJwcm92aWRlckFkZHJzIiwgInAiLCAicHJvdmlkZXJUeXBlcyIsICJkeW5hbWljIiwgInZhbCIsICJkZXBDaGFuZ2VkIiwgIm9sZFByb3ZpZGVycyIsICJvbGRWYWx1ZSIsICJpbml0RmllbGQiLCAiX1N0YXRlRmllbGQiLCAiY3JlYXRlRiIsICJ1cGRhdGVGIiwgImNvbXBhcmVGIiwgImluaXQiLCAib2xkSW5pdCIsICJyZUluaXQiLCAiY3JlYXRlIiwgIlByZWNfIiwgInByZWMiLCAiZXh0IiwgIlByZWNFeHRlbnNpb24iLCAiUHJlYyIsICJpbm5lciIsICJDb21wYXJ0bWVudCIsICJfQ29tcGFydG1lbnQiLCAiQ29tcGFydG1lbnRJbnN0YW5jZSIsICJjb250ZW50IiwgImNvbXBhcnRtZW50IiwgIkNvbmZpZ3VyYXRpb24iLCAiX0NvbmZpZ3VyYXRpb24iLCAiYmFzZSIsICJjb21wYXJ0bWVudHMiLCAiZHluYW1pY1Nsb3RzIiwgImFkZHJlc3MiLCAic3RhdGljVmFsdWVzIiwgImZhY2V0cyIsICJmaWVsZHMiLCAibmV3Q29tcGFydG1lbnRzIiwgImZsYXR0ZW4iLCAib2xkRmFjZXRzIiwgImV4dGVuc2lvbiIsICJzZWVuIiwgImtub3duIiwgImZvdW5kIiwgInN0YXR1cyIsICJsYW5ndWFnZURhdGEiLCAiYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMiLCAidiIsICJsaW5lU2VwYXJhdG9yIiwgImNoYW5nZUZpbHRlciIsICJ0cmFuc2FjdGlvbkZpbHRlciIsICJ0cmFuc2FjdGlvbkV4dGVuZGVyIiwgInJlYWRPbmx5IiwgIkFubm90YXRpb24iLCAiQW5ub3RhdGlvblR5cGUiLCAiU3RhdGVFZmZlY3RUeXBlIiwgIm1hcCIsICJTdGF0ZUVmZmVjdCIsICJfU3RhdGVFZmZlY3QiLCAibWFwcGluZyIsICJtYXBwZWQiLCAiZWZmZWN0cyIsICJlZmZlY3QiLCAiVHJhbnNhY3Rpb24iLCAiX1RyYW5zYWN0aW9uIiwgInN0YXJ0U3RhdGUiLCAiYW5ub3RhdGlvbnMiLCAic2Nyb2xsSW50b1ZpZXciLCAiYW5uIiwgImV2ZW50IiwgImpvaW5SYW5nZXMiLCAiaUEiLCAiaUIiLCAibWVyZ2VUcmFuc2FjdGlvbiIsICJzZXF1ZW50aWFsIiwgIm1hcEZvckEiLCAibWFwRm9yQiIsICJyZXNvbHZlVHJhbnNhY3Rpb25Jbm5lciIsICJkb2NTaXplIiwgInNlbCIsICJhc0FycmF5IiwgInJlc29sdmVUcmFuc2FjdGlvbiIsICJzcGVjcyIsICJmaWx0ZXIiLCAicyIsICJzZXEiLCAiZXh0ZW5kVHJhbnNhY3Rpb24iLCAiZmlsdGVyVHJhbnNhY3Rpb24iLCAiYmFjayIsICJmaWx0ZXJlZCIsICJmaWx0ZXJzIiwgImV4dGVuZGVycyIsICJub25lIiwgIkNoYXJDYXRlZ29yeSIsICJub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhciIsICJ3b3JkQ2hhciIsICJfIiwgImhhc1dvcmRDaGFyIiwgInN0ciIsICJjaCIsICJtYWtlQ2F0ZWdvcml6ZXIiLCAid29yZENoYXJzIiwgImNoYXIiLCAiRWRpdG9yU3RhdGUiLCAiX0VkaXRvclN0YXRlIiwgImNvbXB1dGVTbG90IiwgInJlcXVpcmUiLCAiY29uZiIsICJrZXkiLCAic3RhcnRWYWx1ZXMiLCAic2xvdCIsICJyZXN1bHQxIiwgIm5ld0NoYW5nZXMiLCAibmV3TWFwcGVkIiwgImoiLCAibWFwQnkiLCAic3RyaW5nIiwgInByb3AiLCAiZmllbGRJbml0IiwgImNvbmZpZ3VyYXRpb24iLCAicGhyYXNlIiwgIm0iLCAibiIsICJuYW1lIiwgInNpZGUiLCAicHJvdmlkZXIiLCAiYXQiLCAiY2F0IiwgInN0YXJ0IiwgImZpbmRDbHVzdGVyQnJlYWsiLCAia0EiLCAia0IiLCAiayIsICJSYW5nZVZhbHVlIiwgIm90aGVyIiwgImZyb20iLCAidG8iLCAiUmFuZ2UiLCAiTWFwTW9kZSIsICJfUmFuZ2UiLCAidmFsdWUiLCAiY21wUmFuZ2UiLCAiYSIsICJiIiwgIkNodW5rIiwgIl9DaHVuayIsICJtYXhQb2ludCIsICJwb3MiLCAic2lkZSIsICJlbmQiLCAic3RhcnRBdCIsICJhcnIiLCAibG8iLCAiaGkiLCAibWlkIiwgImRpZmYiLCAib2Zmc2V0IiwgImYiLCAiaSIsICJlIiwgImNoYW5nZXMiLCAibmV3UG9zIiwgInZhbCIsICJjdXJGcm9tIiwgImN1clRvIiwgIm5ld0Zyb20iLCAibmV3VG8iLCAibWFwcGVkIiwgIlJhbmdlU2V0IiwgIl9SYW5nZVNldCIsICJjaHVua1BvcyIsICJjaHVuayIsICJuZXh0TGF5ZXIiLCAibGFzdCIsICJzaXplIiwgImluZGV4IiwgInVwZGF0ZVNwZWMiLCAiYWRkIiwgInNvcnQiLCAiZmlsdGVyRnJvbSIsICJmaWx0ZXJUbyIsICJmaWx0ZXIiLCAiY3VyIiwgIkxheWVyQ3Vyc29yIiwgInNwaWxsIiwgImJ1aWxkZXIiLCAiUmFuZ2VTZXRCdWlsZGVyIiwgInJhbmdlIiwgImNodW5rcyIsICJzdGFydCIsICJ0b3VjaCIsICJuZXh0IiwgIkhlYXBDdXJzb3IiLCAic2V0cyIsICJvbGRTZXRzIiwgIm5ld1NldHMiLCAidGV4dERpZmYiLCAiY29tcGFyYXRvciIsICJtaW5Qb2ludFNpemUiLCAic2V0IiwgInNoYXJlZENodW5rcyIsICJmaW5kU2hhcmVkQ2h1bmtzIiwgInNpZGVBIiwgIlNwYW5DdXJzb3IiLCAic2lkZUIiLCAiZnJvbUEiLCAiZnJvbUIiLCAibGVuZ3RoIiwgImNvbXBhcmUiLCAic2FtZVZhbHVlcyIsICJpdGVyYXRvciIsICJjdXJzb3IiLCAib3BlblJhbmdlcyIsICJhY3RpdmUiLCAib3BlbkNvdW50IiwgInJhbmdlcyIsICJidWlsZCIsICJsYXp5U29ydCIsICJyZXN1bHQiLCAibGF5ZXIiLCAicHJldiIsICJfUmFuZ2VTZXRCdWlsZGVyIiwgIm5ld0FycmF5cyIsICJpbkEiLCAic2hhcmVkIiwgImtub3duIiwgInNraXAiLCAibWluUG9pbnQiLCAicmFuayIsICJmb3J3YXJkIiwgInJhbmdlSW5kZXgiLCAiX0hlYXBDdXJzb3IiLCAiaGVhcCIsICJoZWFwQnViYmxlIiwgInRvcCIsICJjaGlsZEluZGV4IiwgImNoaWxkIiwgInJlbW92ZSIsICJmaW5kTWluSW5kZXgiLCAidHJhY2tPcGVuIiwgImluc2VydCIsICJ3YXNQb2ludCIsICJuZXh0VmFsIiwgIm9wZW4iLCAic3RhcnRBIiwgInN0YXJ0QiIsICJlbmRCIiwgImRQb3MiLCAiZEVuZCIsICJjbGlwRW5kIiwgImFycmF5IiwgImZvdW5kIiwgImZvdW5kUG9zIiwgImZpbmRDb2x1bW4iLCAic3RyaW5nIiwgImNvbCIsICJ0YWJTaXplIiwgInN0cmljdCIsICJpIiwgIm4iLCAiZmluZENsdXN0ZXJCcmVhayIsICJJbnRlcnZhbCIsICJsb3ciLCAiaGlnaCIsICJvdGhlcl9pbnRlcnZhbCIsICJpbnRlcnZhbDEiLCAiaW50ZXJ2YWwyIiwgInZhbDEiLCAidmFsMiIsICJSQl9UUkVFX0NPTE9SX1JFRCIsICJSQl9UUkVFX0NPTE9SX0JMQUNLIiwgIk5vZGUiLCAia2V5IiwgInZhbHVlIiwgImxlZnQiLCAicmlnaHQiLCAicGFyZW50IiwgImNvbG9yIiwgIm90aGVyX25vZGUiLCAiY29tcGFyYWJsZV9tYXgiLCAic2VhcmNoX25vZGUiLCAiY29tcGFyYWJsZV9sZXNzX3RoYW4iLCAiSW50ZXJ2YWxUcmVlIiwgIl9JbnRlcnZhbFRyZWUiLCAiY291bnQiLCAicmVzIiwgIm5vZGUiLCAiaW5zZXJ0X25vZGUiLCAiZGVsZXRlX25vZGUiLCAiaW50ZXJ2YWwiLCAib3V0cHV0TWFwcGVyRm4iLCAicmVzcF9ub2RlcyIsICJ2aXNpdG9yIiwgImNhbGxiYWNrIiwgInRyZWUiLCAibm9kZV9jdXJyZW50IiwgImN1cnJlbnRfbm9kZSIsICJwYXJlbnRfbm9kZSIsICJ1bmNsZV9ub2RlIiwgImN1dF9ub2RlIiwgImZpeF9ub2RlIiwgImJyb3RoZXJfbm9kZSIsICJiZXN0IiwgImN1cnIiLCAiZm91bmQiLCAibm9kZV9taW4iLCAibm9kZV9tYXgiLCAibm9kZV9zdWNjZXNzb3IiLCAieCIsICJ5IiwgImFjdGlvbiIsICJoZWlnaHQiLCAiaGVpZ2h0TGVmdCIsICJoZWlnaHRSaWdodCIsICJDcml0aWNNYXJrdXBSYW5nZXMiLCAicmFuZ2VzIiwgIl9fcHVibGljRmllbGQiLCAiSW50ZXJ2YWxUcmVlIiwgInJhbmdlIiwgImluZGV4IiwgImN1cnNvciIsICJyaWdodCIsICJzZWFyY2giLCAiZnJvbSIsICJ0byIsICJsZWZ0IiwgImxvb3NlIiwgImluY2x1ZGVfZWRnZSIsICJkaXJlY3RseV9hZGphY2VudCIsICJyYW5nZV9pZHgiLCAibiIsICJhZGphY2VudCIsICJzdGFydCIsICJlbmQiLCAiZG9jIiwgImZyb250X3JhbmdlIiwgImJhY2tfcmFuZ2UiLCAib3V0cHV0IiwgInByZXZfcmFuZ2UiLCAibmV3X2Zyb20iLCAibmV3X3RvIiwgIkMiLCAiQ09VTlQiLCAiU0VUIiwgInRvcCIsICJTdHlsZU1vZHVsZSIsICJzcGVjIiwgIm9wdGlvbnMiLCAiZmluaXNoIiwgInNwbGl0U2VsZWN0b3IiLCAic2VsZWN0b3IiLCAicmVuZGVyIiwgInNlbGVjdG9ycyIsICJ0YXJnZXQiLCAiaXNLZXlmcmFtZXMiLCAibG9jYWwiLCAiaXNBdCIsICJrZXlmcmFtZXMiLCAicHJvcCIsICJ2YWx1ZSIsICJwYXJ0IiwgInNlbCIsICJhIiwgImIiLCAibCIsICJpZCIsICJyb290IiwgIm1vZHVsZXMiLCAic2V0IiwgIm5vbmNlIiwgIlN0eWxlU2V0IiwgImFkb3B0ZWRTZXQiLCAiZG9jIiwgIndpbiIsICJhZG9wdGVkIiwgInNoZWV0IiwgInBvcyIsICJqIiwgImkiLCAibW9kIiwgImluZGV4IiwgImsiLCAidGV4dCIsICJiYXNlIiwgInNoaWZ0IiwgIm1hYyIsICJpZSIsICJpIiwgImNvZGUiLCAiZ2V0U2VsZWN0aW9uIiwgInJvb3QiLCAidGFyZ2V0IiwgImNvbnRhaW5zIiwgImRvbSIsICJub2RlIiwgImhhc1NlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiXyIsICJjbGllbnRSZWN0c0ZvciIsICJ0ZXh0UmFuZ2UiLCAiaXNFcXVpdmFsZW50UG9zaXRpb24iLCAib2ZmIiwgInRhcmdldE5vZGUiLCAidGFyZ2V0T2ZmIiwgInNjYW5Gb3IiLCAiZG9tSW5kZXgiLCAiaW5kZXgiLCAiaXNCbG9ja0VsZW1lbnQiLCAiZGlyIiwgIm1heE9mZnNldCIsICJwYXJlbnQiLCAiZmxhdHRlblJlY3QiLCAicmVjdCIsICJsZWZ0IiwgIngiLCAid2luZG93UmVjdCIsICJ3aW4iLCAidnAiLCAiZ2V0U2NhbGUiLCAiZWx0IiwgInNjYWxlWCIsICJzY2FsZVkiLCAic2Nyb2xsUmVjdEludG9WaWV3IiwgInNpZGUiLCAieSIsICJ4TWFyZ2luIiwgInlNYXJnaW4iLCAibHRyIiwgImRvYyIsICJjdXIiLCAic3RvcCIsICJib3VuZGluZyIsICJ0b3AiLCAibW92ZVgiLCAibW92ZVkiLCAicmVjdEhlaWdodCIsICJib3VuZGluZ0hlaWdodCIsICJtb3ZlZFgiLCAibW92ZWRZIiwgInN0YXJ0IiwgInNjcm9sbGFibGVQYXJlbnRzIiwgIkRPTVNlbGVjdGlvblN0YXRlIiwgImRvbVNlbCIsICJyYW5nZSIsICJhbmNob3JOb2RlIiwgImZvY3VzTm9kZSIsICJhbmNob3JPZmZzZXQiLCAiZm9jdXNPZmZzZXQiLCAicHJldmVudFNjcm9sbFN1cHBvcnRlZCIsICJmb2N1c1ByZXZlbnRTY3JvbGwiLCAic3RhY2siLCAiaSIsICJzY3JhdGNoUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJkaXNwYXRjaEtleSIsICJuYW1lIiwgImNvZGUiLCAibW9kcyIsICJvcHRpb25zIiwgImRvd24iLCAidXAiLCAiZ2V0Um9vdCIsICJjbGVhckF0dHJpYnV0ZXMiLCAiYXRFbGVtZW50U3RhcnQiLCAib2Zmc2V0IiwgInByZXYiLCAiaXNTY3JvbGxlZFRvQm90dG9tIiwgInRleHROb2RlQmVmb3JlIiwgInN0YXJ0Tm9kZSIsICJzdGFydE9mZnNldCIsICJ0ZXh0Tm9kZUFmdGVyIiwgIkRPTVBvcyIsICJfRE9NUG9zIiwgInByZWNpc2UiLCAibm9DaGlsZHJlbiIsICJDb250ZW50VmlldyIsICJfQ29udGVudFZpZXciLCAidmlldyIsICJwb3MiLCAiY2hpbGQiLCAidHJhY2siLCAibmV4dCIsICJjb250ZW50VmlldyIsICJybSQxIiwgIl9kb20iLCAiYWZ0ZXIiLCAiYmlhcyIsICJmcm9tSSIsICJmcm9tU3RhcnQiLCAidG9JIiwgInRvRW5kIiwgInByZXZFbmQiLCAiZW5kIiwgImFuZFBhcmVudCIsICJjaGlsZExpc3QiLCAidiIsICJjaGlsZHJlbiIsICJfcmVjIiwgIl9ldmVudCIsICJDaGlsZEN1cnNvciIsICJzb3VyY2UiLCAiaGFzU3RhcnQiLCAib3BlblN0YXJ0IiwgIm9wZW5FbmQiLCAib3RoZXIiLCAicmVwbGFjZVJhbmdlIiwgImZyb21PZmYiLCAidG9PZmYiLCAiaW5zZXJ0IiwgImJyZWFrQXRTdGFydCIsICJiZWZvcmUiLCAibGFzdCIsICJicmVha0F0RW5kIiwgIm1lcmdlQ2hpbGRyZW5JbnRvIiwgImRMZW4iLCAibmF2IiwgImllX2VkZ2UiLCAiaWVfdXB0bzEwIiwgImllXzExdXAiLCAiaWUiLCAiZ2Vja28iLCAiY2hyb21lIiwgIndlYmtpdCIsICJzYWZhcmkiLCAiaW9zIiwgImJyb3dzZXIiLCAiTWF4Sm9pbkxlbiIsICJUZXh0VmlldyIsICJfVGV4dFZpZXciLCAidGV4dCIsICJ0ZXh0RE9NIiwgInJlc3VsdCIsICJfZnJvbSIsICJfdG8iLCAidGV4dENvb3JkcyIsICJNYXJrVmlldyIsICJfTWFya1ZpZXciLCAibWFyayIsICJsZW5ndGgiLCAiY2giLCAiX2hhc1N0YXJ0IiwgImRldGFjaEZyb20iLCAiaW5saW5lRE9NQXRQb3MiLCAiY29vcmRzSW5DaGlsZHJlbiIsICJmbGF0dGVuIiwgInJlY3RzIiwgInIiLCAiV2lkZ2V0VmlldyIsICJfV2lkZ2V0VmlldyIsICJ3aWRnZXQiLCAiZXZlbnQiLCAiVGV4dCIsICJjdXN0b20iLCAiZnJvbUJhY2siLCAiV2lkZ2V0QnVmZmVyVmlldyIsICJfV2lkZ2V0QnVmZmVyVmlldyIsICJqIiwgImpvaW5JbmxpbmVJbnRvIiwgIm9wZW4iLCAiYmVmb3JlUG9zIiwgImFmdGVyUG9zIiwgInNjYW4iLCAib25TYW1lTGluZSIsICJmYWxsYmFja1JlY3QiLCAiYSIsICJiIiwgInBvc0EiLCAicG9zQiIsICJjb21iaW5lQXR0cnMiLCAibm9BdHRycyIsICJhdHRyc0VxIiwgImlnbm9yZSIsICJrZXlzQSIsICJrZXlzQiIsICJrZXkiLCAidXBkYXRlQXR0cnMiLCAiYXR0cnMiLCAiY2hhbmdlZCIsICJnZXRBdHRycyIsICJhdHRyIiwgIldpZGdldFR5cGUiLCAiQmxvY2tUeXBlIiwgIkRlY29yYXRpb24iLCAiUmFuZ2VWYWx1ZSIsICJzdGFydFNpZGUiLCAiZW5kU2lkZSIsICJzcGVjIiwgIk1hcmtEZWNvcmF0aW9uIiwgImJsb2NrIiwgIlBvaW50RGVjb3JhdGlvbiIsICJnZXRJbmNsdXNpdmUiLCAiTGluZURlY29yYXRpb24iLCAib2YiLCAic29ydCIsICJSYW5nZVNldCIsICJfTWFya0RlY29yYXRpb24iLCAiX2EiLCAiX2IiLCAiX0xpbmVEZWNvcmF0aW9uIiwgIk1hcE1vZGUiLCAiX1BvaW50RGVjb3JhdGlvbiIsICJpc1JlcGxhY2UiLCAid2lkZ2V0c0VxIiwgImFkZFJhbmdlIiwgInJhbmdlcyIsICJtYXJnaW4iLCAiTGluZVZpZXciLCAiX0xpbmVWaWV3IiwgImF0IiwgImRlY28iLCAiY2xzIiwgImhhY2siLCAidG90YWxXaWR0aCIsICJ0ZXh0SGVpZ2h0IiwgImhlaWdodE9yYWNsZSIsICJoZWlnaHQiLCAiZGlzdCIsICJkb2NWaWV3IiwgIkJsb2NrV2lkZ2V0VmlldyIsICJfQmxvY2tXaWRnZXRWaWV3IiwgIl90YWtlRGVjbyIsICJsZW4iLCAiQmxvY2tHYXBXaWRnZXQiLCAiQ29udGVudEJ1aWxkZXIiLCAiX0NvbnRlbnRCdWlsZGVyIiwgImRpc2FsbG93QmxvY2tFZmZlY3RzRm9yIiwgImFjdGl2ZSIsICJ3cmFwTWFya3MiLCAidmFsdWUiLCAibGluZUJyZWFrIiwgImRvbmUiLCAidGFrZSIsICJOdWxsV2lkZ2V0IiwgImN1cnNvckJlZm9yZSIsICJjdXJzb3JBZnRlciIsICJsaW5lIiwgImRlY29yYXRpb25zIiwgImR5bmFtaWNEZWNvcmF0aW9uTWFwIiwgImJ1aWxkZXIiLCAidGFnIiwgIkRpcmVjdGlvbiIsICJMVFIiLCAiUlRMIiwgImRlYyIsICJzdHIiLCAiTG93VHlwZXMiLCAiQXJhYmljVHlwZXMiLCAiQnJhY2tldHMiLCAiQnJhY2tldFN0YWNrIiwgInAiLCAibCIsICJjaGFyVHlwZSIsICJCaWRpUkUiLCAiQmlkaVNwYW4iLCAibGV2ZWwiLCAiZm9yd2FyZCIsICJvcmRlciIsICJhc3NvYyIsICJtYXliZSIsICJzcGFuIiwgImlzb2xhdGVzRXEiLCAiaUEiLCAiaUIiLCAidHlwZXMiLCAiY29tcHV0ZUNoYXJUeXBlcyIsICJyRnJvbSIsICJyVG8iLCAiaXNvbGF0ZXMiLCAib3V0ZXJUeXBlIiwgImlJIiwgInByZXZUeXBlIiwgInByZXZTdHJvbmciLCAidHlwZSIsICJyZXBsYWNlIiwgInByb2Nlc3NCcmFja2V0UGFpcnMiLCAib3Bwb3NpdGVUeXBlIiwgInNJIiwgImNvbnRleHQiLCAiYnIiLCAic0oiLCAiZmxhZ3MiLCAiZW1iZWQiLCAicHJvY2Vzc05ldXRyYWxzIiwgImJlZm9yZUwiLCAiYWZ0ZXJMIiwgImpJIiwgImZyb21KIiwgImVtaXRTcGFucyIsICJiYXNlTGV2ZWwiLCAib3VyVHlwZSIsICJpQ2giLCAic2FtZURpciIsICJpc051bSIsICJyZWN1cnNlIiwgImxvY2FsTGV2ZWwiLCAiaVNjYW4iLCAicnVuIiwgImlzbyIsICJ1cHRvIiwgImRpclN3YXAiLCAiY29tcHV0ZVNlY3Rpb25PcmRlciIsICJjb21wdXRlT3JkZXIiLCAiZGlyZWN0aW9uIiwgInRyaXZpYWxPcmRlciIsICJtb3ZlZE92ZXIiLCAibW92ZVZpc3VhbGx5IiwgInN0YXJ0SW5kZXgiLCAic3BhbkkiLCAic3BhbkVuZCIsICJuZXh0SSIsICJuZXh0SW5kZXgiLCAiZmluZENsdXN0ZXJCcmVhayIsICJuZXh0U3BhbiIsICJFZGl0b3JTZWxlY3Rpb24iLCAiYXV0b0RpcmVjdGlvbiIsICJjbGlja0FkZHNTZWxlY3Rpb25SYW5nZSIsICJGYWNldCIsICJkcmFnTW92ZXNTZWxlY3Rpb24kMSIsICJtb3VzZVNlbGVjdGlvblN0eWxlIiwgImV4Y2VwdGlvblNpbmsiLCAidXBkYXRlTGlzdGVuZXIiLCAiaW5wdXRIYW5kbGVyIiwgImZvY3VzQ2hhbmdlRWZmZWN0IiwgImNsaXBib2FyZElucHV0RmlsdGVyIiwgImNsaXBib2FyZE91dHB1dEZpbHRlciIsICJwZXJMaW5lVGV4dERpcmVjdGlvbiIsICJ2YWx1ZXMiLCAibmF0aXZlU2VsZWN0aW9uSGlkZGVuIiwgInNjcm9sbEhhbmRsZXIiLCAiU2Nyb2xsVGFyZ2V0IiwgIl9TY3JvbGxUYXJnZXQiLCAiaXNTbmFwc2hvdCIsICJjaGFuZ2VzIiwgInN0YXRlIiwgInNjcm9sbEludG9WaWV3IiwgIlN0YXRlRWZmZWN0IiwgInQiLCAic2V0RWRpdENvbnRleHRGb3JtYXR0aW5nIiwgImxvZ0V4Y2VwdGlvbiIsICJleGNlcHRpb24iLCAiaGFuZGxlciIsICJlZGl0YWJsZSIsICJuZXh0UGx1Z2luSUQiLCAidmlld1BsdWdpbiIsICJWaWV3UGx1Z2luIiwgIl9WaWV3UGx1Z2luIiwgImlkIiwgImNyZWF0ZSIsICJkb21FdmVudEhhbmRsZXJzIiwgImRvbUV2ZW50T2JzZXJ2ZXJzIiwgImJ1aWxkRXh0ZW5zaW9ucyIsICJldmVudEhhbmRsZXJzIiwgImV2ZW50T2JzZXJ2ZXJzIiwgInByb3ZpZGUiLCAicGx1Z2luIiwgImV4dCIsICJwbHVnaW5JbnN0IiwgIlBsdWdpbkluc3RhbmNlIiwgInVwZGF0ZSIsICJlIiwgImVkaXRvckF0dHJpYnV0ZXMiLCAiY29udGVudEF0dHJpYnV0ZXMiLCAib3V0ZXJEZWNvcmF0aW9ucyIsICJhdG9taWNSYW5nZXMiLCAiYmlkaUlzb2xhdGVkUmFuZ2VzIiwgImdldElzb2xhdGVkUmFuZ2VzIiwgInNldHMiLCAiZnJvbURvYyIsICJ0b0RvYyIsICJhZGQiLCAic2Nyb2xsTWFyZ2lucyIsICJnZXRTY3JvbGxNYXJnaW5zIiwgInJpZ2h0IiwgImJvdHRvbSIsICJtIiwgInN0eWxlTW9kdWxlIiwgIkNoYW5nZWRSYW5nZSIsICJfQ2hhbmdlZFJhbmdlIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJ0b0IiLCAic2V0IiwgIm1lIiwgImRpZmYiLCAiZEkiLCAickkiLCAiVmlld1VwZGF0ZSIsICJfVmlld1VwZGF0ZSIsICJ0cmFuc2FjdGlvbnMiLCAiQ2hhbmdlU2V0IiwgInRyIiwgImNoYW5nZWRSYW5nZXMiLCAiRG9jVmlldyIsICJyZWFkQ29tcG9zaXRpb25BdCIsICJ0b3VjaGVzQ29tcG9zaXRpb24iLCAiY29tcG9zaXRpb24iLCAiZmluZENvbXBvc2l0aW9uUmFuZ2UiLCAicHJldkRlY28iLCAiZGVjb0RpZmYiLCAiZmluZENoYW5nZWREZWNvIiwgIm9sZExlbmd0aCIsICJvYnNlcnZlciIsICJjVmlldyIsICJnYXBzIiwgImN1cnNvciIsICJjb250ZW50IiwgImNvbXBMaW5lIiwgImVmZmVjdCIsICJmaXgiLCAiYyIsICJtdXN0UmVhZCIsICJmcm9tUG9pbnRlciIsICJhY3RpdmVFbHQiLCAiZm9jdXNlZCIsICJzZWxlY3Rpb25Ob3RGb2N1cyIsICJmb3JjZSIsICJtYWluIiwgImFuY2hvciIsICJoZWFkIiwgImJldHdlZW5VbmVkaXRhYmxlIiwgImR1bW15IiwgImluVW5lZGl0YWJsZSIsICJyYXdTZWwiLCAibmV4dFRvIiwgIm5leHRUb1VuZWRpdGFibGUiLCAic2VsIiwgImxpbmVTdGFydCIsICJuZXdSYW5nZSIsICJuZXdQb3MiLCAiZG9tVmlldyIsICJiZXN0IiwgImJlc3RQb3MiLCAiY2hpbGRPZmYiLCAidmlld3BvcnQiLCAiY29udGVudFdpZHRoIiwgImlzV2lkZXIiLCAid2lkZXN0IiwgImNoaWxkUmVjdCIsICJ3aWR0aCIsICJtZWFzdXJlIiwgImxpbmVIZWlnaHQiLCAiY2hhcldpZHRoIiwgInZzIiwgImFsbERlY28iLCAiZCIsICJkeW5hbWljT3V0ZXIiLCAib3V0ZXJEZWNvIiwgImR5bmFtaWMiLCAicmVmIiwgIm1hcmdpbnMiLCAidGFyZ2V0UmVjdCIsICJvZmZzZXRXaWR0aCIsICJvZmZzZXRIZWlnaHQiLCAiZmluZENvbXBvc2l0aW9uTm9kZSIsICJoZWFkUG9zIiwgInRleHRCZWZvcmUiLCAidGV4dEFmdGVyIiwgInRleHROb2RlIiwgImRlc2NBZnRlciIsICJkZXNjQmVmb3JlIiwgImZvdW5kIiwgImludiIsICJtYXJrcyIsICJwYXJlbnRWaWV3IiwgIkRlY29yYXRpb25Db21wYXJhdG9yJDEiLCAiY29tcCIsICJpbnNpZGUiLCAidG91Y2hlZCIsICJncm91cEF0IiwgImNhdGVnb3JpemUiLCAibGluZVBvcyIsICJjYXQiLCAiZ2V0ZHgiLCAiZ2V0ZHkiLCAieU92ZXJsYXAiLCAidXBUb3AiLCAidXBCb3QiLCAiZG9tUG9zQXRDb29yZHMiLCAiY2xvc2VzdCIsICJjbG9zZXN0UmVjdCIsICJjbG9zZXN0WCIsICJjbG9zZXN0WSIsICJjbG9zZXN0T3ZlcmxhcCIsICJhYm92ZSIsICJiZWxvdyIsICJhYm92ZVJlY3QiLCAiYmVsb3dSZWN0IiwgImR4IiwgImR5IiwgImRvbVBvc0luVGV4dCIsICJjbGlwWCIsICJjbG9zZXN0T2Zmc2V0IiwgImNsb3Nlc3REWSIsICJnZW5lcmFsU2lkZSIsICJwb3NBdENvb3JkcyIsICJjb29yZHMiLCAiZG9jVG9wIiwgImRvY0hlaWdodCIsICJ5T2Zmc2V0IiwgImhhbGZMaW5lIiwgImJvdW5jZWQiLCAicG9zQXRDb29yZHNJbXByZWNpc2UiLCAiZWxlbWVudCIsICJpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdCIsICJpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdCIsICJuZWFyZXN0IiwgImNvbnRlbnRSZWN0IiwgImludG8iLCAiZmluZENvbHVtbiIsICJibG9ja0F0IiwgIm1vdmVUb0xpbmVCb3VuZGFyeSIsICJpbmNsdWRlV3JhcCIsICJlZGl0b3JSZWN0IiwgIm1vdmVCeUNoYXIiLCAiYnkiLCAic3BhbnMiLCAiY2hlY2siLCAiY2hhciIsICJieUdyb3VwIiwgIm5leHRDYXQiLCAiQ2hhckNhdGVnb3J5IiwgIm1vdmVWZXJ0aWNhbGx5IiwgImRpc3RhbmNlIiwgInN0YXJ0UG9zIiwgImdvYWwiLCAic3RhcnRZIiwgInN0YXJ0Q29vcmRzIiwgInJlc29sdmVkR29hbCIsICJleHRyYSIsICJjdXJZIiwgImNoYXJSZWN0IiwgInNraXBBdG9taWNSYW5nZXMiLCAiYXRvbXMiLCAibW92ZWQiLCAic2tpcEF0b21zIiwgIm9sZFBvcyIsICJmIiwgIkxpbmVCcmVha1BsYWNlaG9sZGVyIiwgIkRPTVJlYWRlciIsICJwb2ludHMiLCAiRWRpdG9yU3RhdGUiLCAib2xkTGVuIiwgIm5leHRWaWV3IiwgInBvaW50IiwgInJlIiwgIm5leHRCcmVhayIsICJicmVha1NpemUiLCAiZnJvbVZpZXciLCAiaXNBdEVuZCIsICJET01Qb2ludCIsICJET01DaGFuZ2UiLCAidHlwZU92ZXIiLCAiaUhlYWQiLCAiaUFuY2hvciIsICJzZWxQb2ludHMiLCAic2VsZWN0aW9uUG9pbnRzIiwgInJlYWRlciIsICJzZWxlY3Rpb25Gcm9tUG9pbnRzIiwgIm9mZkZyb20iLCAib2ZmVG8iLCAiYXBwbHlET01DaGFuZ2UiLCAiZG9tQ2hhbmdlIiwgImNoYW5nZSIsICJuZXdTZWwiLCAibGFzdEtleSIsICJwcmVmZXJyZWRQb3MiLCAicHJlZmVycmVkU2lkZSIsICJmaW5kRGlmZiIsICJhcHBseURPTUNoYW5nZUlubmVyIiwgInVzZXJFdmVudCIsICJkZWZhdWx0VHIiLCAiZGVmYXVsdEluc2VydCIsICJhcHBseURlZmF1bHRJbnNlcnQiLCAiaCIsICJzdGFydFN0YXRlIiwgIm1haW5TZWwiLCAicmVwbGFjZWQiLCAiY29tcG9zaXRpb25SYW5nZSIsICJzaXplIiwgInJhbmdlQ2hhbmdlcyIsICJzZWxPZmYiLCAibWluTGVuIiwgImFkanVzdCIsICJtb3ZlIiwgImJhc2UiLCAiSW5wdXRTdGF0ZSIsICJvcmlnaW4iLCAiZmlyZWZveENvcHlDdXRIYWNrIiwgImV2ZW50QmVsb25nc1RvRWRpdG9yIiwgImhhbmRsZXJzIiwgInBsdWdpbnMiLCAiY29tcHV0ZUhhbmRsZXJzIiwgInBhc3NpdmUiLCAiZXhpc3RzIiwgIm1vZGlmaWVyQ29kZXMiLCAicGVuZGluZyIsICJQZW5kaW5nS2V5cyIsICJFbWFjc3lQZW5kaW5nS2V5cyIsICJtb3VzZVNlbGVjdGlvbiIsICJiaW5kSGFuZGxlciIsICJyZWNvcmQiLCAib2JzZXJ2ZXJzIiwgImRyYWdTY3JvbGxNYXJnaW4iLCAiZHJhZ1Njcm9sbFNwZWVkIiwgIk1vdXNlU2VsZWN0aW9uIiwgInN0YXJ0RXZlbnQiLCAic3R5bGUiLCAibXVzdFNlbGVjdCIsICJhZGRzU2VsZWN0aW9uUmFuZ2UiLCAiaXNJblByaW1hcnlTZWxlY3Rpb24iLCAiZ2V0Q2xpY2tUeXBlIiwgInN4IiwgInN5IiwgInVwZGF0ZWQiLCAiZmFjZXQiLCAiZHJhZ01vdmVzU2VsZWN0aW9uIiwgImJyb2tlbkNsaXBib2FyZEFQSSIsICJjYXB0dXJlUGFzdGUiLCAiZG9QYXN0ZSIsICJ0ZXh0RmlsdGVyIiwgImZpbHRlciIsICJpbnB1dCIsICJieUxpbmUiLCAibGFzdExpbmV3aXNlQ29weSIsICJsYXN0TGluZSIsICJtYWtlU3R5bGUiLCAiYmFzaWNNb3VzZVNlbGVjdGlvbiIsICJtdXN0Rm9jdXMiLCAibW91c2VTZWwiLCAicmFuZ2VGb3JDbGljayIsICJ2aXN1YWwiLCAiZmluZFBvc2l0aW9uU2lkZSIsICJxdWVyeVBvcyIsICJCYWRNb3VzZURldGFpbCIsICJsYXN0TW91c2VEb3duIiwgImxhc3RNb3VzZURvd25Db3VudCIsICJsYXN0TW91c2VEb3duVGltZSIsICJsYXN0VGltZSIsICJzdGFydFNlbCIsICJleHRlbmQiLCAibXVsdGlwbGUiLCAicmVtb3ZlZCIsICJzdGFydFJhbmdlIiwgInJlbW92ZVJhbmdlQXJvdW5kIiwgImlucHV0U3RhdGUiLCAiZHJvcFRleHQiLCAiZGlyZWN0IiwgImRyb3BQb3MiLCAiZHJhZ2dlZENvbnRlbnQiLCAiZGVsIiwgImlucyIsICJmaWxlcyIsICJyZWFkIiwgImZpbmlzaEZpbGUiLCAicyIsICJkYXRhIiwgImNhcHR1cmVDb3B5IiwgImNvcGllZFJhbmdlIiwgImxpbmV3aXNlIiwgImlzRm9jdXNDaGFuZ2UiLCAiQW5ub3RhdGlvbiIsICJmb2N1c0NoYW5nZVRyYW5zYWN0aW9uIiwgImZvY3VzIiwgImVmZmVjdHMiLCAiZ2V0RWZmZWN0IiwgInVwZGF0ZUZvckZvY3VzQ2hhbmdlIiwgInN0YXJ0Vmlld0hlaWdodCIsICJhcHBsaWVkRmlyZWZveEhhY2siLCAid3JhcHBpbmdXaGl0ZVNwYWNlIiwgImhlaWdodENoYW5nZUZsYWciLCAiY2xlYXJIZWlnaHRDaGFuZ2VGbGFnIiwgIkhlaWdodE9yYWNsZSIsICJsaW5lV3JhcHBpbmciLCAibGluZXMiLCAid2hpdGVTcGFjZSIsICJsaW5lSGVpZ2h0cyIsICJuZXdIZWlnaHQiLCAibGluZUxlbmd0aCIsICJrbm93bkhlaWdodHMiLCAiTWVhc3VyZWRIZWlnaHRzIiwgImhlaWdodHMiLCAiQmxvY2tJbmZvIiwgIl9CbG9ja0luZm8iLCAiX2NvbnRlbnQiLCAiUXVlcnlUeXBlIiwgIkVwc2lsb24iLCAiSGVpZ2h0TWFwIiwgIl9IZWlnaHRNYXAiLCAibm9kZXMiLCAib2xkRG9jIiwgIm9yYWNsZSIsICJOb2RlQnVpbGRlciIsICJIZWlnaHRNYXBUZXh0IiwgInNwbGl0IiwgImJyayIsICJIZWlnaHRNYXBCcmFuY2giLCAib2xkIiwgInZhbCIsICJIZWlnaHRNYXBCbG9jayIsICJfaGVpZ2h0IiwgIl9vcmFjbGUiLCAiX3ZhbHVlIiwgIl90eXBlIiwgIl9mb3JjZSIsICJtZWFzdXJlZCIsICJfSGVpZ2h0TWFwVGV4dCIsICJIZWlnaHRNYXBHYXAiLCAiX0hlaWdodE1hcEdhcCIsICJmaXJzdExpbmUiLCAicGVyTGluZSIsICJwZXJDaGFyIiwgInRvdGFsUGVyTGluZSIsICJndWVzcyIsICJsaW5lVG9wIiwgImxpbmVzQWJvdmUiLCAiZmlyc3QiLCAic2luZ2xlSGVpZ2h0IiwgIm1pZCIsICJyaWdodFRvcCIsICJyaWdodE9mZnNldCIsICJzdWJRdWVyeSIsICJyaWdodFN0YXJ0IiwgIm1lcmdlR2FwcyIsICJyZWJhbGFuY2UiLCAiYXJvdW5kIiwgInJlbGV2YW50V2lkZ2V0SGVpZ2h0IiwgIl9Ob2RlQnVpbGRlciIsICJicmVha3MiLCAiZ2FwIiwgImhlaWdodFJlbGV2YW50RGVjb0NoYW5nZXMiLCAiRGVjb3JhdGlvbkNvbXBhcmF0b3IiLCAidmlzaWJsZVBpeGVsUmFuZ2UiLCAicGFkZGluZ1RvcCIsICJwYXJlbnRSZWN0IiwgImluV2luZG93IiwgImZ1bGxQaXhlbFJhbmdlIiwgIkxpbmVHYXAiLCAiZGlzcGxheVNpemUiLCAiZ0EiLCAiZ0IiLCAidmlld1N0YXRlIiwgIndyYXBwaW5nIiwgIkxpbmVHYXBXaWRnZXQiLCAidmVydGljYWwiLCAiVmlld1N0YXRlIiwgIklkU2NhbGVyIiwgImd1ZXNzV3JhcHBpbmciLCAidmlld3BvcnRzIiwgIlZpZXdwb3J0IiwgInNjYWxlciIsICJCaWdTY2FsZXIiLCAic2NhbGVCbG9jayIsICJzY3JvbGxUYXJnZXQiLCAiY29udGVudENoYW5nZXMiLCAiaGVpZ2h0Q2hhbmdlcyIsICJwcmV2SGVpZ2h0IiwgInNjcm9sbEFuY2hvciIsICJ2aWV3cG9ydENoYW5nZSIsICJyZWZyZXNoIiwgImRvbVJlY3QiLCAibWVhc3VyZUNvbnRlbnQiLCAicGFkZGluZ0JvdHRvbSIsICJzY3JvbGxUb3AiLCAicGl4ZWxWaWV3cG9ydCIsICJkVG9wIiwgImRCb3R0b20iLCAiaW5WaWV3IiwgIm1hcmdpblRvcCIsICJtYXAiLCAidmlzaWJsZVRvcCIsICJ2aXNpYmxlQm90dG9tIiwgInZpZXdIZWlnaHQiLCAidG9wUG9zIiwgIm1hcHBlZCIsICJjdXJyZW50IiwgIm1heU1lYXN1cmUiLCAiaGFsZk1hcmdpbiIsICJkb3VibGVNYXJnaW4iLCAiYWRkR2FwIiwgInN0cnVjdHVyZSIsICJhdm9pZCIsICJmaW5kIiwgImNoZWNrTGluZSIsICJsaW5lU3RydWN0dXJlIiwgInZpZXdGcm9tIiwgInZpZXdUbyIsICJtYXJnaW5IZWlnaHQiLCAiYm90IiwgInRhcmdldEZyYWMiLCAiZmluZEZyYWN0aW9uIiwgInNwYWNlRnJhYyIsICJmaW5kUG9zaXRpb24iLCAibWFyZ2luV2lkdGgiLCAiaG9yaXpPZmZzZXQiLCAicHhMZWZ0IiwgInB4UmlnaHQiLCAiZnJhY3Rpb24iLCAibnciLCAic3RhdGVEZWNvIiwgInRvdGFsIiwgInJhdGlvIiwgImNvdW50ZWQiLCAiYXJyYXkiLCAiX0JpZ1NjYWxlciIsICJoZWlnaHRNYXAiLCAidnBIZWlnaHQiLCAiZG9tQmFzZSIsICJvYmoiLCAibiIsICJiVG9wIiwgImJCb3R0b20iLCAidGhlbWUiLCAic3RycyIsICJkYXJrVGhlbWUiLCAiYmFzZVRoZW1lSUQiLCAiU3R5bGVNb2R1bGUiLCAiYmFzZUxpZ2h0SUQiLCAiYmFzZURhcmtJRCIsICJsaWdodERhcmtJRHMiLCAiYnVpbGRUaGVtZSIsICJzY29wZXMiLCAiYmFzZVRoZW1lJDEiLCAib2JzZXJ2ZU9wdGlvbnMiLCAidXNlQ2hhckRhdGEiLCAiRE9NT2JzZXJ2ZXIiLCAibXV0YXRpb25zIiwgIm11dCIsICJFZGl0Q29udGV4dE1hbmFnZXIiLCAiZW50cmllcyIsICJnIiwgIndhc0NoYW5nZWQiLCAic2FmYXJpU2VsZWN0aW9uUmFuZ2VIYWNrIiwgImxvY2FsIiwgImtleUNvZGUiLCAiZmx1c2giLCAicmVjb3JkcyIsICJyZWFkU2VsZWN0aW9uIiwgImhhbmRsZWQiLCAicmVjIiwgImNoaWxkQmVmb3JlIiwgImZpbmRDaGlsZCIsICJjaGlsZEFmdGVyIiwgIl9jIiwgImN1clZpZXciLCAiYnVpbGRTZWxlY3Rpb25SYW5nZUZyb21SYW5nZSIsICJjdXJBbmNob3IiLCAibmV3TGVuIiwgImZvcm1hdCIsICJsaW5lU3R5bGUiLCAidGhpY2tuZXNzIiwgImRyaWZ0ZWQiLCAiYWJvcnQiLCAiX2Zyb21CIiwgIl90b0IiLCAicmV2ZXJ0ZWQiLCAiY29udGV4dFBvcyIsICJjbGlwTGVuIiwgImVkaXRvclBvcyIsICJFZGl0b3JWaWV3IiwgIl9FZGl0b3JWaWV3IiwgImNvbmZpZyIsICJkaXNwYXRjaCIsICJ0cnMiLCAiVHJhbnNhY3Rpb24iLCAicmVkcmF3biIsICJhdHRyc0NoYW5nZWQiLCAiZm9jdXNGbGFnIiwgImRpc3BhdGNoRm9jdXMiLCAicGVuZGluZ0tleSIsICJDYWNoZWRPcmRlciIsICJsaXN0ZW5lciIsICJuZXdTdGF0ZSIsICJoYWRGb2N1cyIsICJwcmV2U3BlY3MiLCAic3BlY3MiLCAibmV3UGx1Z2lucyIsICJzRE9NIiwgInNjcm9sbEFuY2hvclBvcyIsICJzY3JvbGxBbmNob3JIZWlnaHQiLCAibWVhc3VyaW5nIiwgIkJhZE1lYXN1cmUiLCAiZWRpdG9yQXR0cnMiLCAiYXR0cnNGcm9tRmFjZXQiLCAiY29udGVudEF0dHJzIiwgImNoYW5nZWRDb250ZW50IiwgImNoYW5nZWRFZGl0b3IiLCAiZGl2IiwgIm5vbmNlIiwgInJlcXVlc3QiLCAia25vd24iLCAiaW5pdGlhbCIsICJNYXhCaWRpTGluZSIsICJlbnRyeSIsICJzY3JvbGxMZWZ0IiwgInByZWZpeCIsICJQcmVjIiwgIl9DYWNoZWRPcmRlciIsICJmcmVzaCIsICJjYWNoZSIsICJsYXN0RGlyIiwgInNvdXJjZXMiLCAiY3VycmVudFBsYXRmb3JtIiwgIlVuaWNvZGVSZWdleHBTdXBwb3J0IiwgImJhc2VUaGVtZSIsICJFZGl0b3JWaWV3IiwgIkd1dHRlck1hcmtlciIsICJSYW5nZVZhbHVlIiwgIm90aGVyIiwgImRvbSIsICJNYXBNb2RlIiwgIm5leHRQcm9wSUQiLCAiUmFuZ2UiLCAiZnJvbSIsICJ0byIsICJOb2RlUHJvcCIsICJjb25maWciLCAibWF0Y2giLCAiTm9kZVR5cGUiLCAidHlwZSIsICJyZXN1bHQiLCAic3RyIiwgInZhbHVlIiwgIk1vdW50ZWRUcmVlIiwgInRyZWUiLCAib3ZlcmxheSIsICJwYXJzZXIiLCAibm9Qcm9wcyIsICJfTm9kZVR5cGUiLCAibmFtZSIsICJwcm9wcyIsICJpZCIsICJmbGFncyIsICJzcGVjIiwgInNyYyIsICJwcm9wIiwgImdyb3VwIiwgIm1hcCIsICJkaXJlY3QiLCAibm9kZSIsICJncm91cHMiLCAiaSIsICJmb3VuZCIsICJDYWNoZWROb2RlIiwgIkNhY2hlZElubmVyTm9kZSIsICJJdGVyTW9kZSIsICJUcmVlIiwgIl9UcmVlIiwgInR5cGUiLCAiY2hpbGRyZW4iLCAicG9zaXRpb25zIiwgImxlbmd0aCIsICJwcm9wcyIsICJwcm9wIiwgInZhbHVlIiwgIm1vdW50ZWQiLCAiTW91bnRlZFRyZWUiLCAiY2giLCAic3RyIiwgIm1vZGUiLCAiVHJlZUN1cnNvciIsICJwb3MiLCAic2lkZSIsICJzY29wZSIsICJjdXJzb3IiLCAiVHJlZU5vZGUiLCAibm9kZSIsICJyZXNvbHZlTm9kZSIsICJzdGFja0l0ZXJhdG9yIiwgInNwZWMiLCAiZW50ZXIiLCAibGVhdmUiLCAiZnJvbSIsICJ0byIsICJhbm9uIiwgImMiLCAiZW50ZXJlZCIsICJyZXN1bHQiLCAiaWQiLCAiY29uZmlnIiwgImJhbGFuY2VSYW5nZSIsICJOb2RlVHlwZSIsICJkYXRhIiwgImJ1aWxkVHJlZSIsICJGbGF0QnVmZmVyQ3Vyc29yIiwgIl9GbGF0QnVmZmVyQ3Vyc29yIiwgImJ1ZmZlciIsICJpbmRleCIsICJUcmVlQnVmZmVyIiwgIl9UcmVlQnVmZmVyIiwgInNldCIsICJlbmRJbmRleCIsICJzdGFydEluZGV4IiwgImRpciIsICJwaWNrIiwgImkiLCAiY2hlY2tTaWRlIiwgInN0YXJ0SSIsICJlbmRJIiwgImIiLCAiY29weSIsICJsZW4iLCAiaiIsICJvdmVybGF5cyIsICJfYSIsICJwYXJlbnQiLCAic2NhbiIsICJpbm5lciIsICJCYXNlTm9kZSIsICJiZWZvcmUiLCAiYWZ0ZXIiLCAiciIsICJnZXRDaGlsZHJlbiIsICJjb250ZXh0IiwgIm1hdGNoTm9kZUNvbnRleHQiLCAibGFzdCIsICJfVHJlZU5vZGUiLCAiX3RyZWUiLCAiX3BhcmVudCIsICJlIiwgIm5leHQiLCAic3RhcnQiLCAiQnVmZmVyTm9kZSIsICJCdWZmZXJDb250ZXh0IiwgImhhc0NoaWxkIiwgInJQb3MiLCAidmFsIiwgImN1ciIsICJmb3VuZCIsICJwIiwgIl9CdWZmZXJOb2RlIiwgInBhcmVudFN0YXJ0IiwgIml0ZXJTdGFjayIsICJoZWFkcyIsICJwaWNrZWQiLCAibmV3SGVhZHMiLCAiU3RhY2tJdGVyYXRvciIsICJ0cmVlIiwgImxheWVycyIsICJtb3VudCIsICJyb290IiwgIm4iLCAiZCIsICJjaGlsZCIsICJjYWNoZSIsICJkZXB0aCIsICJtdXN0TGVhdmUiLCAidHlwZXMiLCAibm9kZVNldCIsICJtYXhCdWZmZXJMZW5ndGgiLCAicmV1c2VkIiwgIm1pblJlcGVhdFR5cGUiLCAiY29udGV4dEhhc2giLCAibG9va0FoZWFkIiwgInRha2VOb2RlIiwgIm1pblBvcyIsICJpblJlcGVhdCIsICJlbmQiLCAic2l6ZSIsICJsb29rQWhlYWRBdFN0YXJ0IiwgImNvbnRleHRBdFN0YXJ0IiwgInN0YXJ0UG9zIiwgImZpbmRCdWZmZXJTaXplIiwgImVuZFBvcyIsICJjb3B5VG9CdWZmZXIiLCAibG9jYWxDaGlsZHJlbiIsICJsb2NhbFBvc2l0aW9ucyIsICJsb2NhbEluUmVwZWF0IiwgImxhc3RHcm91cCIsICJsYXN0RW5kIiwgIm1ha2VSZXBlYXRMZWFmIiwgInRha2VGbGF0Tm9kZSIsICJtYWtlIiwgIm1ha2VCYWxhbmNlZCIsICJtYWtlVHJlZSIsICJub2RlcyIsICJub2RlQ291bnQiLCAic3RvcEF0IiwgImxhc3RJIiwgImxvb2tBaGVhZFByb3AiLCAiTm9kZVByb3AiLCAiYmFzZSIsICJwYWlyIiwgIm1heFNpemUiLCAiZm9yayIsICJza2lwIiwgIm1pblN0YXJ0IiwgIm5vZGVTaXplIiwgImxvY2FsU2tpcHBlZCIsICJub2RlU3RhcnQiLCAiYnVmZmVyU3RhcnQiLCAibm9kZVNpemVDYWNoZSIsICJiYWxhbmNlVHlwZSIsICJta1RvcCIsICJta1RyZWUiLCAidG90YWwiLCAibWF4Q2hpbGQiLCAiZGl2aWRlIiwgIm9mZnNldCIsICJncm91cEZyb20iLCAiZ3JvdXBTdGFydCIsICJncm91cFNpemUiLCAibmV4dFNpemUiLCAib25seSIsICJUcmVlRnJhZ21lbnQiLCAiX1RyZWVGcmFnbWVudCIsICJmcm9tIiwgInRvIiwgInRyZWUiLCAib2Zmc2V0IiwgIm9wZW5TdGFydCIsICJvcGVuRW5kIiwgImZyYWdtZW50cyIsICJwYXJ0aWFsIiwgInJlc3VsdCIsICJmIiwgImNoYW5nZXMiLCAibWluR2FwIiwgImZJIiwgIm5leHRGIiwgImNJIiwgInBvcyIsICJvZmYiLCAibmV4dEMiLCAibmV4dFBvcyIsICJjdXQiLCAiZkZyb20iLCAiZlRvIiwgIlBhcnNlciIsICJpbnB1dCIsICJyYW5nZXMiLCAiU3RyaW5nSW5wdXQiLCAiciIsICJSYW5nZSIsICJwYXJzZSIsICJkb25lIiwgInN0cmluZyIsICJzdG9wcGVkSW5uZXIiLCAiTm9kZVByb3AiLCAibmV4dFRhZ0lEIiwgIlRhZyIsICJfVGFnIiwgIm5hbWUiLCAic2V0IiwgImJhc2UiLCAibW9kaWZpZWQiLCAibW9kIiwgIm5hbWVPclBhcmVudCIsICJwYXJlbnQiLCAidGFnIiwgInQiLCAiTW9kaWZpZXIiLCAiYSIsICJiIiwgIm5leHRNb2RpZmllcklEIiwgIl9Nb2RpZmllciIsICJtb2RzIiwgImV4aXN0cyIsICJzYW1lQXJyYXkiLCAibSIsICJjb25maWdzIiwgInBvd2VyU2V0IiwgImNvbmZpZyIsICJ4IiwgImFycmF5IiwgInNldHMiLCAiaSIsICJqIiwgImUiLCAicnVsZU5vZGVQcm9wIiwgIk5vZGVQcm9wIiwgIlJ1bGUiLCAidGFncyIsICJtb2RlIiwgImNvbnRleHQiLCAibmV4dCIsICJvdGhlciIsICJ0YWdIaWdobGlnaHRlciIsICJvcHRpb25zIiwgIm1hcCIsICJzdHlsZSIsICJ0YWciLCAic2NvcGUiLCAiYWxsIiwgImNscyIsICJzdWIiLCAidGFnQ2xhc3MiLCAidCIsICJUYWciLCAiY29tbWVudCIsICJuYW1lIiwgInR5cGVOYW1lIiwgInByb3BlcnR5TmFtZSIsICJsaXRlcmFsIiwgInN0cmluZyIsICJudW1iZXIiLCAiY29udGVudCIsICJoZWFkaW5nIiwgImtleXdvcmQiLCAib3BlcmF0b3IiLCAicHVuY3R1YXRpb24iLCAiYnJhY2tldCIsICJtZXRhIiwgInRhZ3MiLCAidmFsIiwgImNsYXNzSGlnaGxpZ2h0ZXIiLCAidGFnSGlnaGxpZ2h0ZXIiLCAiX2EiLCAibGFuZ3VhZ2VEYXRhUHJvcCIsICJOb2RlUHJvcCIsICJzdWJsYW5ndWFnZVByb3AiLCAiTm9kZVByb3AiLCAiTGFuZ3VhZ2UiLCAiZGF0YSIsICJwYXJzZXIiLCAiZXh0cmFFeHRlbnNpb25zIiwgIm5hbWUiLCAiRWRpdG9yU3RhdGUiLCAic3ludGF4VHJlZSIsICJsYW5ndWFnZSIsICJzdGF0ZSIsICJwb3MiLCAic2lkZSIsICJ0b3AiLCAidG9wTm9kZUF0IiwgImxhbmd1YWdlRGF0YVByb3AiLCAiYmFzZSIsICJzdWIiLCAiaW5uZXJOb2RlIiwgInN1YmxhbmciLCAibGFuZyIsICJyZXN1bHQiLCAiZXhwbG9yZSIsICJ0cmVlIiwgImZyb20iLCAibW91bnQiLCAiciIsICJzaXplIiwgImkiLCAiY2giLCAiVHJlZSIsICJTdGF0ZUVmZmVjdCIsICJ0b3BMYW5nIiwgIm5vZGUiLCAiSXRlck1vZGUiLCAic3ludGF4VHJlZSIsICJzdGF0ZSIsICJmaWVsZCIsICJMYW5ndWFnZSIsICJUcmVlIiwgIkRvY0lucHV0IiwgImRvYyIsICJwb3MiLCAiZnJvbSIsICJ0byIsICJzdHJpbmdTdGFydCIsICJjdXJyZW50Q29udGV4dCIsICJQYXJzZUNvbnRleHQiLCAiX1BhcnNlQ29udGV4dCIsICJwYXJzZXIiLCAic3RhdGUiLCAiZnJhZ21lbnRzIiwgInRyZWUiLCAidHJlZUxlbiIsICJ2aWV3cG9ydCIsICJza2lwcGVkIiwgInNjaGVkdWxlT24iLCAiVHJlZSIsICJ1bnRpbCIsICJ1cHRvIiwgIl9hIiwgImVuZFRpbWUiLCAiZG9uZSIsICJUcmVlRnJhZ21lbnQiLCAiZiIsICJwcmV2IiwgInIiLCAiY3V0RnJhZ21lbnRzIiwgImNoYW5nZXMiLCAibmV3U3RhdGUiLCAicmFuZ2VzIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJ0b0IiLCAic3RhcnRMZW4iLCAiUGFyc2VyIiwgImlucHV0IiwgImN4IiwgIk5vZGVUeXBlIiwgImZyYWdzIiwgIkxhbmd1YWdlU3RhdGUiLCAiX0xhbmd1YWdlU3RhdGUiLCAiY29udGV4dCIsICJ0ciIsICJuZXdDeCIsICJ2cFRvIiwgInBhcnNlU3RhdGUiLCAibGFuZ3VhZ2UiLCAiTGFuZ3VhZ2UiLCAiU3RhdGVGaWVsZCIsICJ2YWx1ZSIsICJyZXF1ZXN0SWRsZSIsICJjYWxsYmFjayIsICJ0aW1lb3V0IiwgImlkbGUiLCAiaXNJbnB1dFBlbmRpbmciLCAicGFyc2VXb3JrZXIiLCAiVmlld1BsdWdpbiIsICJ2aWV3IiwgInVwZGF0ZSIsICJmaWVsZCIsICJkZWFkbGluZSIsICJub3ciLCAidmlld3BvcnRGaXJzdCIsICJlcnIiLCAibG9nRXhjZXB0aW9uIiwgIkZhY2V0IiwgImxhbmd1YWdlcyIsICJFZGl0b3JWaWV3IiwgImxhbmciLCAiSGlnaGxpZ2h0U3R5bGUiLCAiX0hpZ2hsaWdodFN0eWxlIiwgInNwZWNzIiwgIm9wdGlvbnMiLCAibW9kU3BlYyIsICJkZWYiLCAic3BlYyIsICJjbHMiLCAiU3R5bGVNb2R1bGUiLCAiYWxsIiwgInNjb3BlT3B0IiwgIkxhbmd1YWdlIiwgInR5cGUiLCAibGFuZ3VhZ2VEYXRhUHJvcCIsICJ0YWdIaWdobGlnaHRlciIsICJzdHlsZSIsICJkZWZhdWx0SGlnaGxpZ2h0U3R5bGUiLCAiSGlnaGxpZ2h0U3R5bGUiLCAidGFncyIsICJ0eXBlQXJyYXkiLCAiTm9kZVR5cGUiLCAibWFya3MiLCAiRGVjb3JhdGlvbiIsICJEaXJlY3Rpb24iLCAiQ09NTUVOVEFUT1JfR0xPQkFMIiwgImhpZGVFbXB0eUFubm90YXRpb25HdXR0ZXJTdGF0ZSIsICJGYWNldCIsICJ2YWx1ZXMiLCAiaGlkZUVtcHR5QW5ub3RhdGlvbkd1dHRlciIsICJDb21wYXJ0bWVudCIsICJhbm5vdGF0aW9uR3V0dGVyRm9sZEJ1dHRvblN0YXRlIiwgImFubm90YXRpb25HdXR0ZXJGb2xkQnV0dG9uIiwgImFubm90YXRpb25HdXR0ZXJSZXNpemVIYW5kbGVTdGF0ZSIsICJhbm5vdGF0aW9uR3V0dGVyUmVzaXplSGFuZGxlIiwgImFubm90YXRpb25HdXR0ZXJXaWR0aFN0YXRlIiwgImFubm90YXRpb25HdXR0ZXJXaWR0aCIsICJhbm5vdGF0aW9uR3V0dGVyRm9sZGVkU3RhdGUiLCAiYW5ub3RhdGlvbkd1dHRlckZvbGRlZCIsICJhbm5vdGF0aW9uR3V0dGVySW5jbHVkZWRUeXBlc1N0YXRlIiwgImFubm90YXRpb25HdXR0ZXJJbmNsdWRlZFR5cGVzIiwgImhpZGVFbXB0eURpZmZHdXR0ZXJTdGF0ZSIsICJoaWRlRW1wdHlEaWZmR3V0dGVyIiwgInByZXZpZXdNb2RlU3RhdGUiLCAicHJldmlld01vZGUiLCAiZWRpdE1vZGVWYWx1ZVN0YXRlIiwgImVkaXRNb2RlVmFsdWUiLCAiZWRpdE1vZGUiLCAiZnVsbFJlbG9hZEVmZmVjdCIsICJTdGF0ZUVmZmVjdCIsICJuZXh0UHJvcElEIiwgIlJhbmdlIiwgImZyb20iLCAidG8iLCAiTm9kZVByb3AiLCAiY29uZmlnIiwgIm1hdGNoIiwgIk5vZGVUeXBlIiwgInR5cGUiLCAicmVzdWx0IiwgInN0ciIsICJ2YWx1ZSIsICJNb3VudGVkVHJlZSIsICJ0cmVlIiwgIm92ZXJsYXkiLCAicGFyc2VyIiwgIm5vUHJvcHMiLCAiX05vZGVUeXBlIiwgIm5hbWUiLCAicHJvcHMiLCAiaWQiLCAiZmxhZ3MiLCAic3BlYyIsICJzcmMiLCAicHJvcCIsICJncm91cCIsICJtYXAiLCAiZGlyZWN0IiwgIm5vZGUiLCAiZ3JvdXBzIiwgImkiLCAiZm91bmQiLCAiTm9kZVNldCIsICJfTm9kZVNldCIsICJ0eXBlcyIsICJuZXdUeXBlcyIsICJuZXdQcm9wcyIsICJzb3VyY2UiLCAiYWRkIiwgIkNhY2hlZE5vZGUiLCAiQ2FjaGVkSW5uZXJOb2RlIiwgIkl0ZXJNb2RlIiwgIlRyZWUiLCAiX1RyZWUiLCAiY2hpbGRyZW4iLCAicG9zaXRpb25zIiwgImxlbmd0aCIsICJtb3VudGVkIiwgImNoIiwgIm1vZGUiLCAiVHJlZUN1cnNvciIsICJwb3MiLCAic2lkZSIsICJzY29wZSIsICJjdXJzb3IiLCAiVHJlZU5vZGUiLCAicmVzb2x2ZU5vZGUiLCAic3RhY2tJdGVyYXRvciIsICJlbnRlciIsICJsZWF2ZSIsICJhbm9uIiwgImMiLCAiZW50ZXJlZCIsICJiYWxhbmNlUmFuZ2UiLCAiZGF0YSIsICJidWlsZFRyZWUiLCAiRmxhdEJ1ZmZlckN1cnNvciIsICJfRmxhdEJ1ZmZlckN1cnNvciIsICJidWZmZXIiLCAiaW5kZXgiLCAiVHJlZUJ1ZmZlciIsICJfVHJlZUJ1ZmZlciIsICJzZXQiLCAiZW5kSW5kZXgiLCAic3RhcnRJbmRleCIsICJkaXIiLCAicGljayIsICJjaGVja1NpZGUiLCAic3RhcnRJIiwgImVuZEkiLCAiYiIsICJjb3B5IiwgImxlbiIsICJqIiwgIm92ZXJsYXlzIiwgIl9hIiwgInBhcmVudCIsICJzY2FuIiwgImlubmVyIiwgIkJhc2VOb2RlIiwgImJlZm9yZSIsICJhZnRlciIsICJyIiwgImdldENoaWxkcmVuIiwgImNvbnRleHQiLCAibWF0Y2hOb2RlQ29udGV4dCIsICJsYXN0IiwgIl9UcmVlTm9kZSIsICJfdHJlZSIsICJfcGFyZW50IiwgImUiLCAibmV4dCIsICJzdGFydCIsICJCdWZmZXJOb2RlIiwgIkJ1ZmZlckNvbnRleHQiLCAiaGFzQ2hpbGQiLCAiclBvcyIsICJ2YWwiLCAiY3VyIiwgInAiLCAiX0J1ZmZlck5vZGUiLCAicGFyZW50U3RhcnQiLCAiaXRlclN0YWNrIiwgImhlYWRzIiwgInBpY2tlZCIsICJuZXdIZWFkcyIsICJTdGFja0l0ZXJhdG9yIiwgImxheWVycyIsICJtb3VudCIsICJyb290IiwgIm4iLCAiZCIsICJjaGlsZCIsICJjYWNoZSIsICJkZXB0aCIsICJtdXN0TGVhdmUiLCAibm9kZVNldCIsICJtYXhCdWZmZXJMZW5ndGgiLCAicmV1c2VkIiwgIm1pblJlcGVhdFR5cGUiLCAiY29udGV4dEhhc2giLCAibG9va0FoZWFkIiwgInRha2VOb2RlIiwgIm1pblBvcyIsICJpblJlcGVhdCIsICJlbmQiLCAic2l6ZSIsICJsb29rQWhlYWRBdFN0YXJ0IiwgImNvbnRleHRBdFN0YXJ0IiwgInN0YXJ0UG9zIiwgImZpbmRCdWZmZXJTaXplIiwgImVuZFBvcyIsICJjb3B5VG9CdWZmZXIiLCAibG9jYWxDaGlsZHJlbiIsICJsb2NhbFBvc2l0aW9ucyIsICJsb2NhbEluUmVwZWF0IiwgImxhc3RHcm91cCIsICJsYXN0RW5kIiwgIm1ha2VSZXBlYXRMZWFmIiwgInRha2VGbGF0Tm9kZSIsICJtYWtlIiwgIm1ha2VCYWxhbmNlZCIsICJtYWtlVHJlZSIsICJub2RlcyIsICJub2RlQ291bnQiLCAic3RvcEF0IiwgImxhc3RJIiwgImxvb2tBaGVhZFByb3AiLCAiYmFzZSIsICJwYWlyIiwgIm1heFNpemUiLCAiZm9yayIsICJza2lwIiwgIm1pblN0YXJ0IiwgIm5vZGVTaXplIiwgImxvY2FsU2tpcHBlZCIsICJub2RlU3RhcnQiLCAiYnVmZmVyU3RhcnQiLCAibm9kZVNpemVDYWNoZSIsICJiYWxhbmNlVHlwZSIsICJta1RvcCIsICJta1RyZWUiLCAidG90YWwiLCAibWF4Q2hpbGQiLCAiZGl2aWRlIiwgIm9mZnNldCIsICJncm91cEZyb20iLCAiZ3JvdXBTdGFydCIsICJncm91cFNpemUiLCAibmV4dFNpemUiLCAib25seSIsICJUcmVlRnJhZ21lbnQiLCAiX1RyZWVGcmFnbWVudCIsICJmcm9tIiwgInRvIiwgInRyZWUiLCAib2Zmc2V0IiwgIm9wZW5TdGFydCIsICJvcGVuRW5kIiwgImZyYWdtZW50cyIsICJwYXJ0aWFsIiwgInJlc3VsdCIsICJmIiwgImNoYW5nZXMiLCAibWluR2FwIiwgImZJIiwgIm5leHRGIiwgImNJIiwgInBvcyIsICJvZmYiLCAibmV4dEMiLCAibmV4dFBvcyIsICJjdXQiLCAiZkZyb20iLCAiZlRvIiwgIlBhcnNlciIsICJpbnB1dCIsICJyYW5nZXMiLCAiU3RyaW5nSW5wdXQiLCAiciIsICJSYW5nZSIsICJwYXJzZSIsICJkb25lIiwgInN0cmluZyIsICJzdG9wcGVkSW5uZXIiLCAiTm9kZVByb3AiLCAiVGV4dCIsICJfVGV4dCIsICJwb3MiLCAibiIsICJmcm9tIiwgInRvIiwgInRleHQiLCAiY2xpcCIsICJwYXJ0cyIsICJUZXh0Tm9kZSIsICJvdGhlciIsICJzdGFydCIsICJlbmQiLCAiYSIsICJSYXdUZXh0Q3Vyc29yIiwgImIiLCAic2tpcCIsICJkaXIiLCAiUGFydGlhbFRleHRDdXJzb3IiLCAiaW5uZXIiLCAiTGluZUN1cnNvciIsICJsaW5lcyIsICJUZXh0TGVhZiIsICJfVGV4dExlYWYiLCAibGVuZ3RoIiwgInRleHRMZW5ndGgiLCAidGFyZ2V0IiwgImlzTGluZSIsICJsaW5lIiwgIm9mZnNldCIsICJpIiwgInN0cmluZyIsICJMaW5lIiwgIm9wZW4iLCAic2xpY2VUZXh0IiwgInByZXYiLCAiam9pbmVkIiwgImFwcGVuZFRleHQiLCAibWlkIiwgIm5ld0xlbiIsICJsaW5lU2VwIiwgInJlc3VsdCIsICJwYXJ0IiwgImxlbiIsICJfVGV4dE5vZGUiLCAiY2hpbGRyZW4iLCAiY2hpbGQiLCAiZW5kTGluZSIsICJjaGlsZE9wZW4iLCAidXBkYXRlZCIsICJ0b3RhbExpbmVzIiwgImNvcHkiLCAiaUEiLCAiaUIiLCAiZUEiLCAiZUIiLCAiY2hBIiwgImNoQiIsICJsIiwgImNoIiwgImZsYXQiLCAiY2h1bmsiLCAibWF4Q2h1bmsiLCAibWluQ2h1bmsiLCAiY2h1bmtlZCIsICJjdXJyZW50TGluZXMiLCAiY3VycmVudExlbiIsICJjdXJyZW50Q2h1bmsiLCAiYWRkIiwgImxhc3QiLCAibm9kZSIsICJmbHVzaCIsICJmaXJzdCIsICJ0b3AiLCAib2Zmc2V0VmFsdWUiLCAic2l6ZSIsICJuZXh0IiwgImxpbWl0IiwgInZhbHVlIiwgImRvbmUiLCAibGluZUJyZWFrIiwgIm51bWJlciIsICJleHRlbmQiLCAicyIsICJpc0V4dGVuZGluZ0NoYXIiLCAiY29kZSIsICJpc1JlZ2lvbmFsSW5kaWNhdG9yIiwgIlpXSiIsICJmaW5kQ2x1c3RlckJyZWFrIiwgInN0ciIsICJmb3J3YXJkIiwgImluY2x1ZGVFeHRlbmRpbmciLCAibmV4dENsdXN0ZXJCcmVhayIsICJwcmV2Q2x1c3RlckJyZWFrIiwgInN1cnJvZ2F0ZUxvdyIsICJzdXJyb2dhdGVIaWdoIiwgImNvZGVQb2ludEF0IiwgImNvZGVQb2ludFNpemUiLCAiY291bnRCZWZvcmUiLCAiZm91bmQiLCAiY29kZTAiLCAiY29kZTEiLCAiY29kZVBvaW50U2l6ZSIsICJjb2RlIiwgIkRlZmF1bHRTcGxpdCIsICJNYXBNb2RlIiwgIkNoYW5nZURlc2MiLCAiX0NoYW5nZURlc2MiLCAic2VjdGlvbnMiLCAicmVzdWx0IiwgImkiLCAiaW5zIiwgImYiLCAicG9zQSIsICJwb3NCIiwgImxlbiIsICJpbmRpdmlkdWFsIiwgIml0ZXJDaGFuZ2VzIiwgIm90aGVyIiwgImNvbXBvc2VTZXRzIiwgImJlZm9yZSIsICJtYXBTZXQiLCAicG9zIiwgImFzc29jIiwgIm1vZGUiLCAiZW5kQSIsICJmcm9tIiwgInRvIiwgImVuZCIsICJqc29uIiwgImEiLCAiQ2hhbmdlU2V0IiwgIl9DaGFuZ2VTZXQiLCAiaW5zZXJ0ZWQiLCAiZG9jIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJfdG9CIiwgInRleHQiLCAiaW5kZXgiLCAiVGV4dCIsICJyYW5nZXMiLCAicmVzdWx0U2VjdGlvbnMiLCAicmVzdWx0SW5zZXJ0ZWQiLCAiZmlsdGVyZWRTZWN0aW9ucyIsICJpdGVyIiwgIlNlY3Rpb25JdGVyIiwgImRvbmUiLCAibmV4dCIsICJhZGRTZWN0aW9uIiwgImFkZEluc2VydCIsICJwYXJ0cyIsICJjaGFuZ2VzIiwgImxlbmd0aCIsICJsaW5lU2VwIiwgInRvdGFsIiwgImZsdXNoIiwgImZvcmNlIiwgInNldCIsICJwcm9jZXNzIiwgInNwZWMiLCAic3ViIiwgImluc2VydCIsICJpbnNUZXh0IiwgImluc0xlbiIsICJwYXJ0IiwgImUiLCAiZm9yY2VKb2luIiwgImxhc3QiLCAidmFsdWVzIiwgInZhbHVlIiwgImRlc2MiLCAiZW5kQiIsICJzZXRBIiwgInNldEIiLCAibWtTZXQiLCAiYiIsICJwaWVjZSIsICJsZWZ0IiwgIm9wZW4iLCAic2VjdGlvbkxlbiIsICJpbnNCIiwgIlNlbGVjdGlvblJhbmdlIiwgIl9TZWxlY3Rpb25SYW5nZSIsICJmbGFncyIsICJsZXZlbCIsICJjaGFuZ2UiLCAiRWRpdG9yU2VsZWN0aW9uIiwgImhlYWQiLCAiaW5jbHVkZUFzc29jIiwgIl9FZGl0b3JTZWxlY3Rpb24iLCAibWFpbkluZGV4IiwgInIiLCAicmFuZ2UiLCAibWFpbiIsICJ3aGljaCIsICJhbmNob3IiLCAiYmlkaUxldmVsIiwgImdvYWxDb2x1bW4iLCAicHJldiIsICJjaGVja1NlbGVjdGlvbiIsICJzZWxlY3Rpb24iLCAiZG9jTGVuZ3RoIiwgIm5leHRJRCIsICJGYWNldCIsICJfRmFjZXQiLCAiY29tYmluZSIsICJjb21wYXJlSW5wdXQiLCAiY29tcGFyZSIsICJpc1N0YXRpYyIsICJlbmFibGVzIiwgImNvbmZpZyIsICJzYW1lQXJyYXkiLCAiRmFjZXRQcm92aWRlciIsICJkZXBzIiwgImdldCIsICJmaWVsZCIsICJ4IiwgInN0YXRlIiwgImRlcGVuZGVuY2llcyIsICJmYWNldCIsICJ0eXBlIiwgImFkZHJlc3NlcyIsICJfYSIsICJnZXR0ZXIiLCAiaWQiLCAiaWR4IiwgIm11bHRpIiwgImRlcERvYyIsICJkZXBTZWwiLCAiZGVwQWRkcnMiLCAiZGVwIiwgInRyIiwgImVuc3VyZUFsbCIsICJuZXdWYWwiLCAiY29tcGFyZUFycmF5IiwgIm9sZFN0YXRlIiwgIm9sZEFkZHIiLCAib2xkVmFsIiwgImdldEFkZHIiLCAiU3RhdGVGaWVsZCIsICJhZGRycyIsICJjaGFuZ2VkIiwgImFkZHIiLCAiZW5zdXJlQWRkciIsICJkeW5hbWljRmFjZXRTbG90IiwgInByb3ZpZGVycyIsICJwcm92aWRlckFkZHJzIiwgInAiLCAicHJvdmlkZXJUeXBlcyIsICJkeW5hbWljIiwgInZhbCIsICJkZXBDaGFuZ2VkIiwgIm9sZFByb3ZpZGVycyIsICJvbGRWYWx1ZSIsICJpbml0RmllbGQiLCAiX1N0YXRlRmllbGQiLCAiY3JlYXRlRiIsICJ1cGRhdGVGIiwgImNvbXBhcmVGIiwgImluaXQiLCAiY3JlYXRlIiwgIlByZWNfIiwgInByZWMiLCAiZXh0IiwgIlByZWNFeHRlbnNpb24iLCAiUHJlYyIsICJpbm5lciIsICJDb21wYXJ0bWVudCIsICJfQ29tcGFydG1lbnQiLCAiQ29tcGFydG1lbnRJbnN0YW5jZSIsICJjb250ZW50IiwgImNvbXBhcnRtZW50IiwgIkNvbmZpZ3VyYXRpb24iLCAiX0NvbmZpZ3VyYXRpb24iLCAiYmFzZSIsICJjb21wYXJ0bWVudHMiLCAiZHluYW1pY1Nsb3RzIiwgImFkZHJlc3MiLCAic3RhdGljVmFsdWVzIiwgImZhY2V0cyIsICJmaWVsZHMiLCAibmV3Q29tcGFydG1lbnRzIiwgImZsYXR0ZW4iLCAib2xkRmFjZXRzIiwgImV4dGVuc2lvbiIsICJzZWVuIiwgImtub3duIiwgImZvdW5kIiwgInN0YXR1cyIsICJsYW5ndWFnZURhdGEiLCAiYWxsb3dNdWx0aXBsZVNlbGVjdGlvbnMiLCAidiIsICJsaW5lU2VwYXJhdG9yIiwgImNoYW5nZUZpbHRlciIsICJ0cmFuc2FjdGlvbkZpbHRlciIsICJ0cmFuc2FjdGlvbkV4dGVuZGVyIiwgInJlYWRPbmx5IiwgIkFubm90YXRpb24iLCAiQW5ub3RhdGlvblR5cGUiLCAiU3RhdGVFZmZlY3RUeXBlIiwgIm1hcCIsICJTdGF0ZUVmZmVjdCIsICJfU3RhdGVFZmZlY3QiLCAibWFwcGluZyIsICJtYXBwZWQiLCAiZWZmZWN0cyIsICJlZmZlY3QiLCAiVHJhbnNhY3Rpb24iLCAiX1RyYW5zYWN0aW9uIiwgInN0YXJ0U3RhdGUiLCAiYW5ub3RhdGlvbnMiLCAic2Nyb2xsSW50b1ZpZXciLCAiYW5uIiwgImV2ZW50IiwgImpvaW5SYW5nZXMiLCAiaUEiLCAiaUIiLCAibWVyZ2VUcmFuc2FjdGlvbiIsICJzZXF1ZW50aWFsIiwgIm1hcEZvckEiLCAibWFwRm9yQiIsICJyZXNvbHZlVHJhbnNhY3Rpb25Jbm5lciIsICJkb2NTaXplIiwgInNlbCIsICJhc0FycmF5IiwgInJlc29sdmVUcmFuc2FjdGlvbiIsICJzcGVjcyIsICJmaWx0ZXIiLCAicyIsICJzZXEiLCAiZXh0ZW5kVHJhbnNhY3Rpb24iLCAiZmlsdGVyVHJhbnNhY3Rpb24iLCAiYmFjayIsICJmaWx0ZXJlZCIsICJmaWx0ZXJzIiwgImV4dGVuZGVycyIsICJub25lIiwgIkNoYXJDYXRlZ29yeSIsICJub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhciIsICJ3b3JkQ2hhciIsICJfIiwgImhhc1dvcmRDaGFyIiwgInN0ciIsICJjaCIsICJtYWtlQ2F0ZWdvcml6ZXIiLCAid29yZENoYXJzIiwgImNoYXIiLCAiRWRpdG9yU3RhdGUiLCAiX0VkaXRvclN0YXRlIiwgImNvbXB1dGVTbG90IiwgInJlcXVpcmUiLCAiY29uZiIsICJrZXkiLCAic3RhcnRWYWx1ZXMiLCAic2xvdCIsICJyZXN1bHQxIiwgIm5ld0NoYW5nZXMiLCAibmV3TWFwcGVkIiwgImoiLCAibWFwQnkiLCAic3RyaW5nIiwgInByb3AiLCAiZmllbGRJbml0IiwgImNvbmZpZ3VyYXRpb24iLCAicGhyYXNlIiwgIm0iLCAibiIsICJuYW1lIiwgInNpZGUiLCAicHJvdmlkZXIiLCAiYXQiLCAiY2F0IiwgInN0YXJ0IiwgImZpbmRDbHVzdGVyQnJlYWsiLCAia0EiLCAia0IiLCAiayIsICJSYW5nZVZhbHVlIiwgIm90aGVyIiwgImZyb20iLCAidG8iLCAiUmFuZ2UiLCAiTWFwTW9kZSIsICJfUmFuZ2UiLCAidmFsdWUiLCAiY21wUmFuZ2UiLCAiYSIsICJiIiwgIkNodW5rIiwgIl9DaHVuayIsICJtYXhQb2ludCIsICJwb3MiLCAic2lkZSIsICJlbmQiLCAic3RhcnRBdCIsICJhcnIiLCAibG8iLCAiaGkiLCAibWlkIiwgImRpZmYiLCAib2Zmc2V0IiwgImYiLCAiaSIsICJlIiwgImNoYW5nZXMiLCAibmV3UG9zIiwgInZhbCIsICJjdXJGcm9tIiwgImN1clRvIiwgIm5ld0Zyb20iLCAibmV3VG8iLCAibWFwcGVkIiwgIlJhbmdlU2V0IiwgIl9SYW5nZVNldCIsICJjaHVua1BvcyIsICJjaHVuayIsICJuZXh0TGF5ZXIiLCAibGFzdCIsICJzaXplIiwgImluZGV4IiwgInVwZGF0ZVNwZWMiLCAiYWRkIiwgInNvcnQiLCAiZmlsdGVyRnJvbSIsICJmaWx0ZXJUbyIsICJmaWx0ZXIiLCAiY3VyIiwgIkxheWVyQ3Vyc29yIiwgInNwaWxsIiwgImJ1aWxkZXIiLCAiUmFuZ2VTZXRCdWlsZGVyIiwgInJhbmdlIiwgImNodW5rcyIsICJzdGFydCIsICJ0b3VjaCIsICJuZXh0IiwgIkhlYXBDdXJzb3IiLCAic2V0cyIsICJvbGRTZXRzIiwgIm5ld1NldHMiLCAidGV4dERpZmYiLCAiY29tcGFyYXRvciIsICJtaW5Qb2ludFNpemUiLCAic2V0IiwgInNoYXJlZENodW5rcyIsICJmaW5kU2hhcmVkQ2h1bmtzIiwgInNpZGVBIiwgIlNwYW5DdXJzb3IiLCAic2lkZUIiLCAiZnJvbUEiLCAiZnJvbUIiLCAibGVuZ3RoIiwgImNvbXBhcmUiLCAic2FtZVZhbHVlcyIsICJpdGVyYXRvciIsICJjdXJzb3IiLCAib3BlblJhbmdlcyIsICJhY3RpdmUiLCAib3BlbkNvdW50IiwgInJhbmdlcyIsICJidWlsZCIsICJsYXp5U29ydCIsICJyZXN1bHQiLCAibGF5ZXIiLCAicHJldiIsICJfUmFuZ2VTZXRCdWlsZGVyIiwgIm5ld0FycmF5cyIsICJpbkEiLCAic2hhcmVkIiwgImtub3duIiwgInNraXAiLCAibWluUG9pbnQiLCAicmFuayIsICJmb3J3YXJkIiwgInJhbmdlSW5kZXgiLCAiX0hlYXBDdXJzb3IiLCAiaGVhcCIsICJoZWFwQnViYmxlIiwgInRvcCIsICJjaGlsZEluZGV4IiwgImNoaWxkIiwgInJlbW92ZSIsICJmaW5kTWluSW5kZXgiLCAidHJhY2tPcGVuIiwgImluc2VydCIsICJ3YXNQb2ludCIsICJuZXh0VmFsIiwgIm9wZW4iLCAic3RhcnRBIiwgInN0YXJ0QiIsICJlbmRCIiwgImRQb3MiLCAiY2xpcEVuZCIsICJhcnJheSIsICJmb3VuZCIsICJmb3VuZFBvcyIsICJmaW5kQ29sdW1uIiwgInN0cmluZyIsICJjb2wiLCAidGFiU2l6ZSIsICJzdHJpY3QiLCAiaSIsICJuIiwgImZpbmRDbHVzdGVyQnJlYWsiLCAiQyIsICJDT1VOVCIsICJTRVQiLCAidG9wIiwgIlN0eWxlTW9kdWxlIiwgInNwZWMiLCAib3B0aW9ucyIsICJmaW5pc2giLCAic3BsaXRTZWxlY3RvciIsICJzZWxlY3RvciIsICJyZW5kZXIiLCAic2VsZWN0b3JzIiwgInRhcmdldCIsICJpc0tleWZyYW1lcyIsICJsb2NhbCIsICJpc0F0IiwgImtleWZyYW1lcyIsICJwcm9wIiwgInZhbHVlIiwgInBhcnQiLCAic2VsIiwgImEiLCAiYiIsICJsIiwgImlkIiwgInJvb3QiLCAibW9kdWxlcyIsICJzZXQiLCAibm9uY2UiLCAiU3R5bGVTZXQiLCAiYWRvcHRlZFNldCIsICJkb2MiLCAid2luIiwgImFkb3B0ZWQiLCAic2hlZXQiLCAicG9zIiwgImoiLCAiaSIsICJtb2QiLCAiaW5kZXgiLCAiayIsICJ0ZXh0IiwgImJhc2UiLCAic2hpZnQiLCAibWFjIiwgImllIiwgImkiLCAiY29kZSIsICJnZXRTZWxlY3Rpb24iLCAicm9vdCIsICJ0YXJnZXQiLCAiY29udGFpbnMiLCAiZG9tIiwgIm5vZGUiLCAiZGVlcEFjdGl2ZUVsZW1lbnQiLCAiZG9jIiwgImVsdCIsICJoYXNTZWxlY3Rpb24iLCAic2VsZWN0aW9uIiwgIl8iLCAiY2xpZW50UmVjdHNGb3IiLCAidGV4dFJhbmdlIiwgImlzRXF1aXZhbGVudFBvc2l0aW9uIiwgIm9mZiIsICJ0YXJnZXROb2RlIiwgInRhcmdldE9mZiIsICJzY2FuRm9yIiwgImRvbUluZGV4IiwgImluZGV4IiwgImRpciIsICJtYXhPZmZzZXQiLCAicGFyZW50IiwgImZsYXR0ZW5SZWN0IiwgInJlY3QiLCAibGVmdCIsICJ4IiwgIndpbmRvd1JlY3QiLCAid2luIiwgImdldFNjYWxlIiwgInNjYWxlWCIsICJzY2FsZVkiLCAic2Nyb2xsUmVjdEludG9WaWV3IiwgInNpZGUiLCAieSIsICJ4TWFyZ2luIiwgInlNYXJnaW4iLCAibHRyIiwgImN1ciIsICJzdG9wIiwgImJvdW5kaW5nIiwgInRvcCIsICJtb3ZlWCIsICJtb3ZlWSIsICJyZWN0SGVpZ2h0IiwgImJvdW5kaW5nSGVpZ2h0IiwgIm1vdmVkWCIsICJtb3ZlZFkiLCAic3RhcnQiLCAic2Nyb2xsYWJsZVBhcmVudCIsICJET01TZWxlY3Rpb25TdGF0ZSIsICJkb21TZWwiLCAicmFuZ2UiLCAiYW5jaG9yTm9kZSIsICJmb2N1c05vZGUiLCAiYW5jaG9yT2Zmc2V0IiwgImZvY3VzT2Zmc2V0IiwgInByZXZlbnRTY3JvbGxTdXBwb3J0ZWQiLCAiZm9jdXNQcmV2ZW50U2Nyb2xsIiwgInN0YWNrIiwgImkiLCAic2NyYXRjaFJhbmdlIiwgImZyb20iLCAidG8iLCAiZGlzcGF0Y2hLZXkiLCAibmFtZSIsICJjb2RlIiwgIm9wdGlvbnMiLCAiZG93biIsICJ1cCIsICJnZXRSb290IiwgImNsZWFyQXR0cmlidXRlcyIsICJhdEVsZW1lbnRTdGFydCIsICJvZmZzZXQiLCAicHJldiIsICJpc1Njcm9sbGVkVG9Cb3R0b20iLCAiRE9NUG9zIiwgIl9ET01Qb3MiLCAicHJlY2lzZSIsICJub0NoaWxkcmVuIiwgIkNvbnRlbnRWaWV3IiwgIl9Db250ZW50VmlldyIsICJ2aWV3IiwgInBvcyIsICJjaGlsZCIsICJ0cmFjayIsICJuZXh0IiwgImNvbnRlbnRWaWV3IiwgInJtJDEiLCAiX2RvbSIsICJhZnRlciIsICJiaWFzIiwgImZyb21JIiwgImZyb21TdGFydCIsICJ0b0kiLCAidG9FbmQiLCAicHJldkVuZCIsICJlbmQiLCAiYW5kUGFyZW50IiwgImNoaWxkTGlzdCIsICJ2IiwgImNoaWxkcmVuIiwgIl9yZWMiLCAiX2V2ZW50IiwgIkNoaWxkQ3Vyc29yIiwgInNvdXJjZSIsICJoYXNTdGFydCIsICJvcGVuU3RhcnQiLCAib3BlbkVuZCIsICJvdGhlciIsICJyZXBsYWNlUmFuZ2UiLCAiZnJvbU9mZiIsICJ0b09mZiIsICJpbnNlcnQiLCAiYnJlYWtBdFN0YXJ0IiwgImJlZm9yZSIsICJsYXN0IiwgImJyZWFrQXRFbmQiLCAibWVyZ2VDaGlsZHJlbkludG8iLCAiZExlbiIsICJuYXYiLCAiaWVfZWRnZSIsICJpZV91cHRvMTAiLCAiaWVfMTF1cCIsICJpZSIsICJnZWNrbyIsICJjaHJvbWUiLCAid2Via2l0IiwgInNhZmFyaSIsICJpb3MiLCAiYnJvd3NlciIsICJNYXhKb2luTGVuIiwgIlRleHRWaWV3IiwgIl9UZXh0VmlldyIsICJ0ZXh0IiwgInRleHRET00iLCAicmVzdWx0IiwgIl9mcm9tIiwgIl90byIsICJ0ZXh0Q29vcmRzIiwgIk1hcmtWaWV3IiwgIl9NYXJrVmlldyIsICJtYXJrIiwgImxlbmd0aCIsICJjaCIsICJfaGFzU3RhcnQiLCAiZGV0YWNoRnJvbSIsICJpbmxpbmVET01BdFBvcyIsICJjb29yZHNJbkNoaWxkcmVuIiwgImZsYXR0ZW4iLCAicmVjdHMiLCAiciIsICJXaWRnZXRWaWV3IiwgIl9XaWRnZXRWaWV3IiwgIndpZGdldCIsICJldmVudCIsICJUZXh0IiwgImN1c3RvbSIsICJmcm9tQmFjayIsICJXaWRnZXRCdWZmZXJWaWV3IiwgIl9XaWRnZXRCdWZmZXJWaWV3IiwgImoiLCAiam9pbklubGluZUludG8iLCAib3BlbiIsICJiZWZvcmVQb3MiLCAiYWZ0ZXJQb3MiLCAic2NhbiIsICJmYWxsYmFja1JlY3QiLCAiY29tYmluZUF0dHJzIiwgIm5vQXR0cnMiLCAiYXR0cnNFcSIsICJhIiwgImIiLCAiaWdub3JlIiwgImtleXNBIiwgImtleXNCIiwgImtleSIsICJ1cGRhdGVBdHRycyIsICJhdHRycyIsICJjaGFuZ2VkIiwgImdldEF0dHJzIiwgImF0dHIiLCAiTGluZVZpZXciLCAiX0xpbmVWaWV3IiwgImF0IiwgImRlY28iLCAiY2xzIiwgIl9hIiwgImhhY2siLCAidG90YWxXaWR0aCIsICJ0ZXh0SGVpZ2h0IiwgImhlaWdodE9yYWNsZSIsICJoZWlnaHQiLCAiZGlzdCIsICJfb3RoZXIiLCAiZG9jVmlldyIsICJibG9jayIsICJCbG9ja1dpZGdldFZpZXciLCAiX0Jsb2NrV2lkZ2V0VmlldyIsICJfdGFrZURlY28iLCAibGVuIiwgInN0YXJ0U2lkZSIsICJlbmRTaWRlIiwgIldpZGdldFR5cGUiLCAiQmxvY2tUeXBlIiwgIkRlY29yYXRpb24iLCAiUmFuZ2VWYWx1ZSIsICJzcGVjIiwgIk1hcmtEZWNvcmF0aW9uIiwgIlBvaW50RGVjb3JhdGlvbiIsICJnZXRJbmNsdXNpdmUiLCAiTGluZURlY29yYXRpb24iLCAib2YiLCAic29ydCIsICJSYW5nZVNldCIsICJfTWFya0RlY29yYXRpb24iLCAiX2IiLCAiX0xpbmVEZWNvcmF0aW9uIiwgIk1hcE1vZGUiLCAiX1BvaW50RGVjb3JhdGlvbiIsICJpc1JlcGxhY2UiLCAid2lkZ2V0c0VxIiwgImFkZFJhbmdlIiwgInJhbmdlcyIsICJtYXJnaW4iLCAiQ29udGVudEJ1aWxkZXIiLCAiX0NvbnRlbnRCdWlsZGVyIiwgImRpc2FsbG93QmxvY2tFZmZlY3RzRm9yIiwgImFjdGl2ZSIsICJ3cmFwTWFya3MiLCAidmFsdWUiLCAibGluZUJyZWFrIiwgImRvbmUiLCAidGFrZSIsICJOdWxsV2lkZ2V0IiwgImN1cnNvckJlZm9yZSIsICJjdXJzb3JBZnRlciIsICJsaW5lIiwgImRlY29yYXRpb25zIiwgImR5bmFtaWNEZWNvcmF0aW9uTWFwIiwgImJ1aWxkZXIiLCAidGFnIiwgIkRpcmVjdGlvbiIsICJMVFIiLCAiUlRMIiwgImRlYyIsICJzdHIiLCAiTG93VHlwZXMiLCAiQXJhYmljVHlwZXMiLCAiQnJhY2tldHMiLCAiQnJhY2tldFN0YWNrIiwgInAiLCAibCIsICJjaGFyVHlwZSIsICJCaWRpUkUiLCAiQmlkaVNwYW4iLCAibGV2ZWwiLCAiZm9yd2FyZCIsICJvcmRlciIsICJhc3NvYyIsICJtYXliZSIsICJzcGFuIiwgImlzb2xhdGVzRXEiLCAiaUEiLCAiaUIiLCAidHlwZXMiLCAiY29tcHV0ZUNoYXJUeXBlcyIsICJyRnJvbSIsICJyVG8iLCAiaXNvbGF0ZXMiLCAib3V0ZXJUeXBlIiwgImlJIiwgInByZXZUeXBlIiwgInByZXZTdHJvbmciLCAidHlwZSIsICJyZXBsYWNlIiwgInByb2Nlc3NCcmFja2V0UGFpcnMiLCAib3Bwb3NpdGVUeXBlIiwgInNJIiwgImNvbnRleHQiLCAiYnIiLCAic0oiLCAiZmxhZ3MiLCAiZW1iZWQiLCAicHJvY2Vzc05ldXRyYWxzIiwgImJlZm9yZUwiLCAiYWZ0ZXJMIiwgImpJIiwgImZyb21KIiwgImVtaXRTcGFucyIsICJiYXNlTGV2ZWwiLCAib3VyVHlwZSIsICJpQ2giLCAic2FtZURpciIsICJpc051bSIsICJyZWN1cnNlIiwgImxvY2FsTGV2ZWwiLCAiaVNjYW4iLCAicnVuIiwgImlzbyIsICJ1cHRvIiwgImRpclN3YXAiLCAiY29tcHV0ZVNlY3Rpb25PcmRlciIsICJjb21wdXRlT3JkZXIiLCAiZGlyZWN0aW9uIiwgInRyaXZpYWxPcmRlciIsICJtb3ZlZE92ZXIiLCAibW92ZVZpc3VhbGx5IiwgInN0YXJ0SW5kZXgiLCAic3BhbkkiLCAic3BhbkVuZCIsICJuZXh0SSIsICJuZXh0SW5kZXgiLCAiZmluZENsdXN0ZXJCcmVhayIsICJuZXh0U3BhbiIsICJFZGl0b3JTZWxlY3Rpb24iLCAiYXV0b0RpcmVjdGlvbiIsICJjbGlja0FkZHNTZWxlY3Rpb25SYW5nZSIsICJGYWNldCIsICJkcmFnTW92ZXNTZWxlY3Rpb24kMSIsICJtb3VzZVNlbGVjdGlvblN0eWxlIiwgImV4Y2VwdGlvblNpbmsiLCAidXBkYXRlTGlzdGVuZXIiLCAiaW5wdXRIYW5kbGVyIiwgImZvY3VzQ2hhbmdlRWZmZWN0IiwgInBlckxpbmVUZXh0RGlyZWN0aW9uIiwgInZhbHVlcyIsICJuYXRpdmVTZWxlY3Rpb25IaWRkZW4iLCAiU2Nyb2xsVGFyZ2V0IiwgIl9TY3JvbGxUYXJnZXQiLCAiaXNTbmFwc2hvdCIsICJjaGFuZ2VzIiwgInN0YXRlIiwgInNjcm9sbEludG9WaWV3IiwgIlN0YXRlRWZmZWN0IiwgInQiLCAibG9nRXhjZXB0aW9uIiwgImV4Y2VwdGlvbiIsICJoYW5kbGVyIiwgImVkaXRhYmxlIiwgIm5leHRQbHVnaW5JRCIsICJ2aWV3UGx1Z2luIiwgIlZpZXdQbHVnaW4iLCAiX1ZpZXdQbHVnaW4iLCAiaWQiLCAiY3JlYXRlIiwgImRvbUV2ZW50SGFuZGxlcnMiLCAiZG9tRXZlbnRPYnNlcnZlcnMiLCAiYnVpbGRFeHRlbnNpb25zIiwgImV2ZW50SGFuZGxlcnMiLCAiZXZlbnRPYnNlcnZlcnMiLCAicHJvdmlkZSIsICJwbHVnaW4iLCAiZXh0IiwgInBsdWdpbkluc3QiLCAiUGx1Z2luSW5zdGFuY2UiLCAidXBkYXRlIiwgImUiLCAiZWRpdG9yQXR0cmlidXRlcyIsICJjb250ZW50QXR0cmlidXRlcyIsICJvdXRlckRlY29yYXRpb25zIiwgImF0b21pY1JhbmdlcyIsICJiaWRpSXNvbGF0ZWRSYW5nZXMiLCAiZ2V0SXNvbGF0ZWRSYW5nZXMiLCAic2V0cyIsICJmcm9tRG9jIiwgInRvRG9jIiwgImFkZCIsICJzY3JvbGxNYXJnaW5zIiwgImdldFNjcm9sbE1hcmdpbnMiLCAicmlnaHQiLCAiYm90dG9tIiwgIm0iLCAic3R5bGVNb2R1bGUiLCAiQ2hhbmdlZFJhbmdlIiwgIl9DaGFuZ2VkUmFuZ2UiLCAiZnJvbUEiLCAidG9BIiwgImZyb21CIiwgInRvQiIsICJzZXQiLCAibWUiLCAiZGlmZiIsICJkSSIsICJySSIsICJwb3NBIiwgInBvc0IiLCAiVmlld1VwZGF0ZSIsICJfVmlld1VwZGF0ZSIsICJ0cmFuc2FjdGlvbnMiLCAiQ2hhbmdlU2V0IiwgInRyIiwgImNoYW5nZWRSYW5nZXMiLCAiRG9jVmlldyIsICJyZWFkQ29tcG9zaXRpb25BdCIsICJ0b3VjaGVzQ29tcG9zaXRpb24iLCAiY29tcG9zaXRpb24iLCAiZmluZENvbXBvc2l0aW9uUmFuZ2UiLCAicHJldkRlY28iLCAiZGVjb0RpZmYiLCAiZmluZENoYW5nZWREZWNvIiwgIm9sZExlbmd0aCIsICJvYnNlcnZlciIsICJjVmlldyIsICJnYXBzIiwgIkJsb2NrR2FwV2lkZ2V0IiwgImN1cnNvciIsICJjb250ZW50IiwgImNvbXBMaW5lIiwgImZpeCIsICJjIiwgIm11c3RSZWFkIiwgImZyb21Qb2ludGVyIiwgImFjdGl2ZUVsdCIsICJmb2N1c2VkIiwgInNlbGVjdGlvbk5vdEZvY3VzIiwgImZvcmNlIiwgIm1haW4iLCAiYW5jaG9yIiwgImhlYWQiLCAiYmV0d2VlblVuZWRpdGFibGUiLCAiZHVtbXkiLCAiaW5VbmVkaXRhYmxlIiwgInJhd1NlbCIsICJuZXh0VG8iLCAibmV4dFRvVW5lZGl0YWJsZSIsICJuZWFyYnlUZXh0Tm9kZSIsICJzZWwiLCAibGluZVN0YXJ0IiwgIm5ld1JhbmdlIiwgIm5ld1BvcyIsICJkb21WaWV3IiwgImJlc3QiLCAiYmVzdFBvcyIsICJjaGlsZE9mZiIsICJ2aWV3cG9ydCIsICJjb250ZW50V2lkdGgiLCAiaXNXaWRlciIsICJ3aWRlc3QiLCAiY2hpbGRSZWN0IiwgIndpZHRoIiwgIm1lYXN1cmUiLCAibGluZUhlaWdodCIsICJjaGFyV2lkdGgiLCAidnMiLCAiYWxsRGVjbyIsICJkIiwgImR5bmFtaWNPdXRlciIsICJvdXRlckRlY28iLCAiZHluYW1pYyIsICJyZWYiLCAibWFyZ2lucyIsICJ0YXJnZXRSZWN0IiwgIm9mZnNldFdpZHRoIiwgIm9mZnNldEhlaWdodCIsICJmaW5kQ29tcG9zaXRpb25Ob2RlIiwgImhlYWRQb3MiLCAidGV4dE5vZGUiLCAiZm91bmQiLCAiaW52IiwgIm1hcmtzIiwgInBhcmVudFZpZXciLCAic3RhcnROb2RlIiwgInN0YXJ0T2Zmc2V0IiwgIkRlY29yYXRpb25Db21wYXJhdG9yJDEiLCAiY29tcCIsICJpbnNpZGUiLCAidG91Y2hlZCIsICJncm91cEF0IiwgImNhdGVnb3JpemUiLCAibGluZVBvcyIsICJjYXQiLCAiZ2V0ZHgiLCAiZ2V0ZHkiLCAieU92ZXJsYXAiLCAidXBUb3AiLCAidXBCb3QiLCAiZG9tUG9zQXRDb29yZHMiLCAiY2xvc2VzdCIsICJjbG9zZXN0UmVjdCIsICJjbG9zZXN0WCIsICJjbG9zZXN0WSIsICJjbG9zZXN0T3ZlcmxhcCIsICJhYm92ZSIsICJiZWxvdyIsICJhYm92ZVJlY3QiLCAiYmVsb3dSZWN0IiwgImR4IiwgImR5IiwgImRvbVBvc0luVGV4dCIsICJjbGlwWCIsICJjbG9zZXN0T2Zmc2V0IiwgImNsb3Nlc3REWSIsICJnZW5lcmFsU2lkZSIsICJwb3NBdENvb3JkcyIsICJjb29yZHMiLCAiZG9jVG9wIiwgImRvY0hlaWdodCIsICJ5T2Zmc2V0IiwgImhhbGZMaW5lIiwgImJvdW5jZWQiLCAicG9zQXRDb29yZHNJbXByZWNpc2UiLCAiZWxlbWVudCIsICJpc1N1c3BpY2lvdXNTYWZhcmlDYXJldFJlc3VsdCIsICJpc1N1c3BpY2lvdXNDaHJvbWVDYXJldFJlc3VsdCIsICJuZWFyZXN0IiwgImNvbnRlbnRSZWN0IiwgImludG8iLCAiZmluZENvbHVtbiIsICJibG9ja0F0IiwgIm1vdmVUb0xpbmVCb3VuZGFyeSIsICJpbmNsdWRlV3JhcCIsICJlZGl0b3JSZWN0IiwgIm1vdmVCeUNoYXIiLCAiYnkiLCAic3BhbnMiLCAiY2hlY2siLCAiY2hhciIsICJieUdyb3VwIiwgIm5leHRDYXQiLCAiQ2hhckNhdGVnb3J5IiwgIm1vdmVWZXJ0aWNhbGx5IiwgImRpc3RhbmNlIiwgInN0YXJ0UG9zIiwgImdvYWwiLCAic3RhcnRZIiwgInN0YXJ0Q29vcmRzIiwgInJlc29sdmVkR29hbCIsICJleHRyYSIsICJjdXJZIiwgImNoYXJSZWN0IiwgInNraXBBdG9taWNSYW5nZXMiLCAiYXRvbXMiLCAibW92ZWQiLCAic2tpcEF0b21zIiwgIm9sZFBvcyIsICJmIiwgIklucHV0U3RhdGUiLCAib3JpZ2luIiwgImZpcmVmb3hDb3B5Q3V0SGFjayIsICJldmVudEJlbG9uZ3NUb0VkaXRvciIsICJoYW5kbGVycyIsICJwbHVnaW5zIiwgImNvbXB1dGVIYW5kbGVycyIsICJwYXNzaXZlIiwgImV4aXN0cyIsICJtb2RpZmllckNvZGVzIiwgInBlbmRpbmciLCAiUGVuZGluZ0tleXMiLCAiRW1hY3N5UGVuZGluZ0tleXMiLCAibW91c2VTZWxlY3Rpb24iLCAiYmluZEhhbmRsZXIiLCAicmVjb3JkIiwgIm9ic2VydmVycyIsICJkcmFnU2Nyb2xsTWFyZ2luIiwgImRyYWdTY3JvbGxTcGVlZCIsICJNb3VzZVNlbGVjdGlvbiIsICJzdGFydEV2ZW50IiwgInN0eWxlIiwgIm11c3RTZWxlY3QiLCAiRWRpdG9yU3RhdGUiLCAiYWRkc1NlbGVjdGlvblJhbmdlIiwgImlzSW5QcmltYXJ5U2VsZWN0aW9uIiwgImdldENsaWNrVHlwZSIsICJzeCIsICJzeSIsICJ1cGRhdGVkIiwgImZhY2V0IiwgImRyYWdNb3Zlc1NlbGVjdGlvbiIsICJicm9rZW5DbGlwYm9hcmRBUEkiLCAiY2FwdHVyZVBhc3RlIiwgImRvUGFzdGUiLCAiaW5wdXQiLCAiYnlMaW5lIiwgImxhc3RMaW5ld2lzZUNvcHkiLCAibGFzdExpbmUiLCAibWFrZVN0eWxlIiwgImJhc2ljTW91c2VTZWxlY3Rpb24iLCAibXVzdEZvY3VzIiwgIm1vdXNlU2VsIiwgInJhbmdlRm9yQ2xpY2siLCAidmlzdWFsIiwgImluc2lkZVkiLCAiZmluZFBvc2l0aW9uU2lkZSIsICJxdWVyeVBvcyIsICJCYWRNb3VzZURldGFpbCIsICJsYXN0TW91c2VEb3duIiwgImxhc3RNb3VzZURvd25Db3VudCIsICJsYXN0TW91c2VEb3duVGltZSIsICJsYXN0VGltZSIsICJzdGFydFNlbCIsICJleHRlbmQiLCAibXVsdGlwbGUiLCAicmVtb3ZlZCIsICJzdGFydFJhbmdlIiwgInJlbW92ZVJhbmdlQXJvdW5kIiwgImlucHV0U3RhdGUiLCAiZHJvcFRleHQiLCAiZGlyZWN0IiwgImRyb3BQb3MiLCAiZHJhZ2dlZENvbnRlbnQiLCAiZGVsIiwgImlucyIsICJmaWxlcyIsICJyZWFkIiwgImZpbmlzaEZpbGUiLCAicyIsICJyZWFkZXIiLCAiZGF0YSIsICJjYXB0dXJlQ29weSIsICJjb3BpZWRSYW5nZSIsICJsaW5ld2lzZSIsICJpc0ZvY3VzQ2hhbmdlIiwgIkFubm90YXRpb24iLCAiZm9jdXNDaGFuZ2VUcmFuc2FjdGlvbiIsICJmb2N1cyIsICJlZmZlY3RzIiwgImdldEVmZmVjdCIsICJlZmZlY3QiLCAidXBkYXRlRm9yRm9jdXNDaGFuZ2UiLCAic3RhcnRWaWV3SGVpZ2h0IiwgImFwcGxpZWRGaXJlZm94SGFjayIsICJ3cmFwcGluZ1doaXRlU3BhY2UiLCAiSGVpZ2h0T3JhY2xlIiwgImxpbmVXcmFwcGluZyIsICJsaW5lcyIsICJ3aGl0ZVNwYWNlIiwgImxpbmVIZWlnaHRzIiwgIm5ld0hlaWdodCIsICJoIiwgImxpbmVMZW5ndGgiLCAia25vd25IZWlnaHRzIiwgIk1lYXN1cmVkSGVpZ2h0cyIsICJoZWlnaHRzIiwgIkJsb2NrSW5mbyIsICJfQmxvY2tJbmZvIiwgIl9jb250ZW50IiwgIlF1ZXJ5VHlwZSIsICJFcHNpbG9uIiwgIkhlaWdodE1hcCIsICJfSGVpZ2h0TWFwIiwgIm9yYWNsZSIsICJub2RlcyIsICJvbGREb2MiLCAiTm9kZUJ1aWxkZXIiLCAiSGVpZ2h0TWFwVGV4dCIsICJzcGxpdCIsICJicmsiLCAiSGVpZ2h0TWFwQnJhbmNoIiwgIkhlaWdodE1hcEJsb2NrIiwgIl9oZWlnaHQiLCAiX29yYWNsZSIsICJfdmFsdWUiLCAiX3R5cGUiLCAiX2ZvcmNlIiwgIm1lYXN1cmVkIiwgIl9IZWlnaHRNYXBUZXh0IiwgIkhlaWdodE1hcEdhcCIsICJfSGVpZ2h0TWFwR2FwIiwgImZpcnN0TGluZSIsICJwZXJMaW5lIiwgInBlckNoYXIiLCAidG90YWxQZXJMaW5lIiwgImd1ZXNzIiwgImxpbmVUb3AiLCAibGluZXNBYm92ZSIsICJmaXJzdCIsICJzaW5nbGVIZWlnaHQiLCAibWlkIiwgInJpZ2h0VG9wIiwgInJpZ2h0T2Zmc2V0IiwgImJhc2UiLCAic3ViUXVlcnkiLCAicmlnaHRTdGFydCIsICJtZXJnZUdhcHMiLCAicmViYWxhbmNlIiwgImFyb3VuZCIsICJyZWxldmFudFdpZGdldEhlaWdodCIsICJfTm9kZUJ1aWxkZXIiLCAiYnJlYWtzIiwgImdhcCIsICJoZWlnaHRSZWxldmFudERlY29DaGFuZ2VzIiwgIkRlY29yYXRpb25Db21wYXJhdG9yIiwgInZpc2libGVQaXhlbFJhbmdlIiwgInBhZGRpbmdUb3AiLCAicGFyZW50UmVjdCIsICJmdWxsUGl4ZWxSYW5nZSIsICJMaW5lR2FwIiwgInNpemUiLCAiZ0EiLCAiZ0IiLCAidmlld1N0YXRlIiwgIndyYXBwaW5nIiwgIkxpbmVHYXBXaWRnZXQiLCAidmVydGljYWwiLCAiVmlld1N0YXRlIiwgIklkU2NhbGVyIiwgImd1ZXNzV3JhcHBpbmciLCAidmlld3BvcnRzIiwgIlZpZXdwb3J0IiwgIkJpZ1NjYWxlciIsICJzY2FsZUJsb2NrIiwgInNjcm9sbFRhcmdldCIsICJjb250ZW50Q2hhbmdlcyIsICJoZWlnaHRDaGFuZ2VzIiwgInByZXZIZWlnaHQiLCAic2Nyb2xsQW5jaG9yIiwgInVwZGF0ZUxpbmVzIiwgInJlZnJlc2giLCAiZG9tUmVjdCIsICJtZWFzdXJlQ29udGVudCIsICJwYWRkaW5nQm90dG9tIiwgInNjcm9sbFRvcCIsICJwaXhlbFZpZXdwb3J0IiwgImRUb3AiLCAiZEJvdHRvbSIsICJpblZpZXciLCAidnAiLCAidmlld3BvcnRDaGFuZ2UiLCAibWFyZ2luVG9wIiwgIm1hcCIsICJ2aXNpYmxlVG9wIiwgInZpc2libGVCb3R0b20iLCAidmlld0hlaWdodCIsICJ0b3BQb3MiLCAibWFwcGVkIiwgImN1cnJlbnQiLCAibWF5TWVhc3VyZSIsICJoYWxmTWFyZ2luIiwgImRvdWJsZU1hcmdpbiIsICJhZGRHYXAiLCAic3RydWN0dXJlIiwgImF2b2lkIiwgImZpbmQiLCAibGluZVN0cnVjdHVyZSIsICJ2aWV3RnJvbSIsICJ2aWV3VG8iLCAibWFyZ2luSGVpZ2h0IiwgImJvdCIsICJ0YXJnZXRGcmFjIiwgImZpbmRGcmFjdGlvbiIsICJzcGFjZUZyYWMiLCAiZmluZFBvc2l0aW9uIiwgIm1hcmdpbldpZHRoIiwgImZyYWN0aW9uIiwgInN0YXRlRGVjbyIsICJ0b3RhbCIsICJyYXRpbyIsICJjb3VudGVkIiwgImFycmF5IiwgInZhbCIsICJoZWlnaHRNYXAiLCAidnBIZWlnaHQiLCAiZG9tQmFzZSIsICJvYmoiLCAibiIsICJzY2FsZXIiLCAiYlRvcCIsICJiQm90dG9tIiwgInRoZW1lIiwgInN0cnMiLCAiZGFya1RoZW1lIiwgImJhc2VUaGVtZUlEIiwgIlN0eWxlTW9kdWxlIiwgImJhc2VMaWdodElEIiwgImJhc2VEYXJrSUQiLCAibGlnaHREYXJrSURzIiwgImJ1aWxkVGhlbWUiLCAic2NvcGVzIiwgImJhc2VUaGVtZSQxIiwgIkxpbmVCcmVha1BsYWNlaG9sZGVyIiwgIkRPTVJlYWRlciIsICJwb2ludHMiLCAib2xkTGVuIiwgIm5leHRWaWV3IiwgImlzQmxvY2tFbGVtZW50IiwgInBvaW50IiwgInJlIiwgIm5leHRCcmVhayIsICJicmVha1NpemUiLCAiZnJvbVZpZXciLCAiaXNBdEVuZCIsICJET01Qb2ludCIsICJET01DaGFuZ2UiLCAidHlwZU92ZXIiLCAiaUhlYWQiLCAiaUFuY2hvciIsICJzZWxQb2ludHMiLCAic2VsZWN0aW9uUG9pbnRzIiwgInNlbGVjdGlvbkZyb21Qb2ludHMiLCAib2ZmRnJvbSIsICJvZmZUbyIsICJhcHBseURPTUNoYW5nZSIsICJkb21DaGFuZ2UiLCAiY2hhbmdlIiwgIm5ld1NlbCIsICJsYXN0S2V5IiwgInByZWZlcnJlZFBvcyIsICJwcmVmZXJyZWRTaWRlIiwgImZpbmREaWZmIiwgImRlZmF1bHRUciIsICJkZWZhdWx0SW5zZXJ0IiwgImFwcGx5RGVmYXVsdEluc2VydCIsICJ1c2VyRXZlbnQiLCAic3RhcnRTdGF0ZSIsICJtYWluU2VsIiwgInJlcGxhY2VkIiwgImNvbXBvc2l0aW9uUmFuZ2UiLCAicmFuZ2VDaGFuZ2VzIiwgInNlbE9mZiIsICJtaW5MZW4iLCAiYWRqdXN0IiwgIm1vdmUiLCAib2JzZXJ2ZU9wdGlvbnMiLCAidXNlQ2hhckRhdGEiLCAiRE9NT2JzZXJ2ZXIiLCAibXV0YXRpb25zIiwgIm11dCIsICJlbnRyaWVzIiwgImciLCAid2FzQ2hhbmdlZCIsICJzYWZhcmlTZWxlY3Rpb25SYW5nZUhhY2siLCAibG9jYWwiLCAia2V5Q29kZSIsICJmbHVzaCIsICJyZWNvcmRzIiwgInJlYWRTZWxlY3Rpb24iLCAiaGFuZGxlZCIsICJyZWMiLCAiY2hpbGRCZWZvcmUiLCAiZmluZENoaWxkIiwgImNoaWxkQWZ0ZXIiLCAiX2MiLCAiY3VyVmlldyIsICJjdXJBbmNob3IiLCAiRWRpdG9yVmlldyIsICJfRWRpdG9yVmlldyIsICJjb25maWciLCAiZGlzcGF0Y2giLCAidHJzIiwgIlRyYW5zYWN0aW9uIiwgInJlZHJhd24iLCAiYXR0cnNDaGFuZ2VkIiwgImZvY3VzRmxhZyIsICJkaXNwYXRjaEZvY3VzIiwgInBlbmRpbmdLZXkiLCAiQ2FjaGVkT3JkZXIiLCAibGlzdGVuZXIiLCAibmV3U3RhdGUiLCAiaGFkRm9jdXMiLCAicHJldlNwZWNzIiwgInNwZWNzIiwgIm5ld1BsdWdpbnMiLCAic0RPTSIsICJzY3JvbGxBbmNob3JQb3MiLCAic2Nyb2xsQW5jaG9ySGVpZ2h0IiwgIm1lYXN1cmluZyIsICJCYWRNZWFzdXJlIiwgImVkaXRvckF0dHJzIiwgImF0dHJzRnJvbUZhY2V0IiwgImNvbnRlbnRBdHRycyIsICJjaGFuZ2VkQ29udGVudCIsICJjaGFuZ2VkRWRpdG9yIiwgImRpdiIsICJub25jZSIsICJyZXF1ZXN0IiwgImtub3duIiwgImluaXRpYWwiLCAiTWF4QmlkaUxpbmUiLCAiZW50cnkiLCAic2Nyb2xsTGVmdCIsICJwcmVmaXgiLCAiUHJlYyIsICJfQ2FjaGVkT3JkZXIiLCAiZnJlc2giLCAiY2FjaGUiLCAibGFzdERpciIsICJzb3VyY2VzIiwgImN1cnJlbnRQbGF0Zm9ybSIsICJDYW5IaWRlUHJpbWFyeSIsICJicm93c2VyIiwgInRoZW1lU3BlYyIsICJDYW5IaWRlUHJpbWFyeSIsICJVbmljb2RlUmVnZXhwU3VwcG9ydCIsICJiYXNlVGhlbWUiLCAiRWRpdG9yVmlldyIsICJHdXR0ZXJNYXJrZXIiLCAiUmFuZ2VWYWx1ZSIsICJvdGhlciIsICJkb20iLCAiTWFwTW9kZSIsICJuZXh0VGFnSUQiLCAiVGFnIiwgIl9UYWciLCAic2V0IiwgImJhc2UiLCAibW9kaWZpZWQiLCAicGFyZW50IiwgInRhZyIsICJ0IiwgIm1vZCIsICJNb2RpZmllciIsICJhIiwgImIiLCAibmV4dE1vZGlmaWVySUQiLCAiX01vZGlmaWVyIiwgIm1vZHMiLCAiZXhpc3RzIiwgInNhbWVBcnJheSIsICJtIiwgImNvbmZpZ3MiLCAicG93ZXJTZXQiLCAiY29uZmlnIiwgIngiLCAiYXJyYXkiLCAic2V0cyIsICJpIiwgImoiLCAiZSIsICJzdHlsZVRhZ3MiLCAic3BlYyIsICJieU5hbWUiLCAicHJvcCIsICJ0YWdzIiwgInBhcnQiLCAicGllY2VzIiwgIm1vZGUiLCAicmVzdCIsICJwb3MiLCAibmV4dCIsICJsYXN0IiwgImlubmVyIiwgInJ1bGUiLCAiUnVsZSIsICJydWxlTm9kZVByb3AiLCAiTm9kZVByb3AiLCAiY29udGV4dCIsICJvdGhlciIsICJ0YWdIaWdobGlnaHRlciIsICJvcHRpb25zIiwgIm1hcCIsICJzdHlsZSIsICJzY29wZSIsICJhbGwiLCAiY2xzIiwgInN1YiIsICJ0YWdDbGFzcyIsICJ0IiwgIlRhZyIsICJjb21tZW50IiwgIm5hbWUiLCAidHlwZU5hbWUiLCAicHJvcGVydHlOYW1lIiwgImxpdGVyYWwiLCAic3RyaW5nIiwgIm51bWJlciIsICJjb250ZW50IiwgImhlYWRpbmciLCAia2V5d29yZCIsICJvcGVyYXRvciIsICJwdW5jdHVhdGlvbiIsICJicmFja2V0IiwgIm1ldGEiLCAidGFncyIsICJjbGFzc0hpZ2hsaWdodGVyIiwgInRhZ0hpZ2hsaWdodGVyIiwgIl9hIiwgImxhbmd1YWdlRGF0YVByb3AiLCAiTm9kZVByb3AiLCAiZGVmaW5lTGFuZ3VhZ2VGYWNldCIsICJiYXNlRGF0YSIsICJGYWNldCIsICJ2YWx1ZXMiLCAic3VibGFuZ3VhZ2VQcm9wIiwgIkxhbmd1YWdlIiwgImRhdGEiLCAicGFyc2VyIiwgImV4dHJhRXh0ZW5zaW9ucyIsICJuYW1lIiwgIkVkaXRvclN0YXRlIiwgInN5bnRheFRyZWUiLCAibGFuZ3VhZ2UiLCAic3RhdGUiLCAicG9zIiwgInNpZGUiLCAidG9wIiwgInRvcE5vZGVBdCIsICJiYXNlIiwgInN1YiIsICJpbm5lck5vZGUiLCAic3VibGFuZyIsICJsYW5nIiwgInJlc3VsdCIsICJleHBsb3JlIiwgInRyZWUiLCAiZnJvbSIsICJtb3VudCIsICJyIiwgInNpemUiLCAiaSIsICJjaCIsICJUcmVlIiwgIlN0YXRlRWZmZWN0IiwgInRvcExhbmciLCAibm9kZSIsICJJdGVyTW9kZSIsICJMUkxhbmd1YWdlIiwgIl9MUkxhbmd1YWdlIiwgInNwZWMiLCAidHlwZSIsICJvcHRpb25zIiwgImZpZWxkIiwgIkRvY0lucHV0IiwgImRvYyIsICJwb3MiLCAiZnJvbSIsICJ0byIsICJzdHJpbmdTdGFydCIsICJjdXJyZW50Q29udGV4dCIsICJQYXJzZUNvbnRleHQiLCAiX1BhcnNlQ29udGV4dCIsICJwYXJzZXIiLCAic3RhdGUiLCAiZnJhZ21lbnRzIiwgInRyZWUiLCAidHJlZUxlbiIsICJ2aWV3cG9ydCIsICJza2lwcGVkIiwgInNjaGVkdWxlT24iLCAiVHJlZSIsICJ1bnRpbCIsICJ1cHRvIiwgIl9hIiwgImVuZFRpbWUiLCAiZG9uZSIsICJUcmVlRnJhZ21lbnQiLCAiZiIsICJwcmV2IiwgInIiLCAiY3V0RnJhZ21lbnRzIiwgImNoYW5nZXMiLCAibmV3U3RhdGUiLCAicmFuZ2VzIiwgImZyb21BIiwgInRvQSIsICJmcm9tQiIsICJ0b0IiLCAic3RhcnRMZW4iLCAiUGFyc2VyIiwgImlucHV0IiwgImN4IiwgIk5vZGVUeXBlIiwgImZyYWdzIiwgIkxhbmd1YWdlU3RhdGUiLCAiX0xhbmd1YWdlU3RhdGUiLCAiY29udGV4dCIsICJ0ciIsICJuZXdDeCIsICJ2cFRvIiwgInBhcnNlU3RhdGUiLCAibGFuZ3VhZ2UiLCAiTGFuZ3VhZ2UiLCAiU3RhdGVGaWVsZCIsICJ2YWx1ZSIsICJyZXF1ZXN0SWRsZSIsICJjYWxsYmFjayIsICJ0aW1lb3V0IiwgImlkbGUiLCAiaXNJbnB1dFBlbmRpbmciLCAicGFyc2VXb3JrZXIiLCAiVmlld1BsdWdpbiIsICJ2aWV3IiwgInVwZGF0ZSIsICJmaWVsZCIsICJkZWFkbGluZSIsICJub3ciLCAidmlld3BvcnRGaXJzdCIsICJlcnIiLCAibG9nRXhjZXB0aW9uIiwgIkZhY2V0IiwgImxhbmd1YWdlcyIsICJFZGl0b3JWaWV3IiwgImxhbmciLCAiSGlnaGxpZ2h0U3R5bGUiLCAiX0hpZ2hsaWdodFN0eWxlIiwgInNwZWNzIiwgIm9wdGlvbnMiLCAibW9kU3BlYyIsICJkZWYiLCAic3BlYyIsICJjbHMiLCAiU3R5bGVNb2R1bGUiLCAiYWxsIiwgInNjb3BlT3B0IiwgIkxhbmd1YWdlIiwgInR5cGUiLCAibGFuZ3VhZ2VEYXRhUHJvcCIsICJ0YWdIaWdobGlnaHRlciIsICJzdHlsZSIsICJkZWZhdWx0SGlnaGxpZ2h0U3R5bGUiLCAiSGlnaGxpZ2h0U3R5bGUiLCAidGFncyIsICJub1Rva2VucyIsICJ0eXBlQXJyYXkiLCAiTm9kZVR5cGUiLCAid2FybmVkIiwgImJ5VGFnIiwgImRlZmF1bHRUYWJsZSIsICJsZWdhY3lOYW1lIiwgIm5hbWUiLCAiY3JlYXRlVG9rZW5UeXBlIiwgIm5vVG9rZW5zIiwgIndhcm5Gb3JQYXJ0IiwgInBhcnQiLCAibXNnIiwgIndhcm5lZCIsICJjcmVhdGVUb2tlblR5cGUiLCAiZXh0cmEiLCAidGFnU3RyIiwgInRhZ3MkMSIsICJuYW1lIiwgImZvdW5kIiwgInZhbHVlIiwgInRhZ3MiLCAidGFnIiwgImtleSIsICJ0IiwgImtub3duIiwgImJ5VGFnIiwgInR5cGUiLCAiTm9kZVR5cGUiLCAidHlwZUFycmF5IiwgInN0eWxlVGFncyIsICJtYXJrcyIsICJEZWNvcmF0aW9uIiwgIkRpcmVjdGlvbiIsICJTdGFjayIsICJfU3RhY2siLCAicCIsICJzdGFjayIsICJzdGF0ZSIsICJyZWR1Y2VQb3MiLCAicG9zIiwgInNjb3JlIiwgImJ1ZmZlciIsICJidWZmZXJCYXNlIiwgImN1ckNvbnRleHQiLCAibG9va0FoZWFkIiwgInBhcmVudCIsICJfIiwgImkiLCAiY3giLCAiU3RhY2tDb250ZXh0IiwgInN0YXJ0IiwgImFjdGlvbiIsICJfYSIsICJkZXB0aCIsICJ0eXBlIiwgInBhcnNlciIsICJkUHJlYyIsICJiYXNlIiwgInNpemUiLCAiY291bnQiLCAiYmFzZVN0YXRlSUQiLCAidGVybSIsICJlbmQiLCAiaXNSZWR1Y2UiLCAiY3VyIiwgInRvcCIsICJpbmRleCIsICJuZXh0U3RhdGUiLCAibmV4dCIsICJuZXh0U3RhcnQiLCAibmV4dEVuZCIsICJ2YWx1ZSIsICJvZmYiLCAiaXNOb2RlIiwgInNpbSIsICJTaW11bGF0ZWRTdGFjayIsICJuZXh0U3RhdGVzIiwgImJlc3QiLCAicyIsICJ2IiwgInJlc3VsdCIsICJyZWR1Y2UiLCAidGFyZ2V0IiwgImJhY2t1cCIsICJzZWVuIiwgImV4cGxvcmUiLCAickRlcHRoIiwgImZvdW5kIiwgIm90aGVyIiwgImRpYWxlY3RJRCIsICJsYXN0IiwgImNvbnRleHQiLCAibmV3Q3giLCAidHJhY2tlciIsICJnb3RvIiwgIlN0YWNrQnVmZmVyQ3Vyc29yIiwgIl9TdGFja0J1ZmZlckN1cnNvciIsICJkZWNvZGVBcnJheSIsICJpbnB1dCIsICJUeXBlIiwgImFycmF5IiwgIm91dCIsICJzdG9wIiwgImRpZ2l0IiwgIkNhY2hlZFRva2VuIiwgIm51bGxUb2tlbiIsICJJbnB1dFN0cmVhbSIsICJyYW5nZXMiLCAib2Zmc2V0IiwgImFzc29jIiwgInJhbmdlIiwgImlkeCIsICJyZXNvbHZlZCIsICJ0b2tlbiIsICJlbmRPZmZzZXQiLCAiY2h1bmsiLCAiY2h1bmtQb3MiLCAibmV4dENodW5rIiwgIm4iLCAiZnJvbSIsICJ0byIsICJyIiwgIlRva2VuR3JvdXAiLCAiZGF0YSIsICJpZCIsICJyZWFkVG9rZW4iLCAiTG9jYWxUb2tlbkdyb3VwIiwgInByZWNUYWJsZSIsICJlbHNlVG9rZW4iLCAic2tpcHBlZCIsICJhdEVvZiIsICJuZXh0UG9zIiwgInJlYWRUb2tlbiIsICJkYXRhIiwgImlucHV0IiwgInN0YWNrIiwgImdyb3VwIiwgInByZWNUYWJsZSIsICJwcmVjT2Zmc2V0IiwgInN0YXRlIiwgImdyb3VwTWFzayIsICJkaWFsZWN0IiwgInNjYW4iLCAiYWNjRW5kIiwgImkiLCAidGVybSIsICJvdmVycmlkZXMiLCAibmV4dCIsICJsb3ciLCAiaGlnaCIsICJtaWQiLCAiaW5kZXgiLCAiZnJvbSIsICJ0byIsICJmaW5kT2Zmc2V0IiwgInN0YXJ0IiwgInRva2VuIiwgInByZXYiLCAidGFibGVEYXRhIiwgInRhYmxlT2Zmc2V0IiwgImlQcmV2IiwgInZlcmJvc2UiLCAic3RhY2tJRHMiLCAiY3V0QXQiLCAidHJlZSIsICJwb3MiLCAic2lkZSIsICJjdXJzb3IiLCAiSXRlck1vZGUiLCAiRnJhZ21lbnRDdXJzb3IiLCAiZnJhZ21lbnRzIiwgIm5vZGVTZXQiLCAiZnIiLCAibGFzdCIsICJ0b3AiLCAiVHJlZSIsICJlbmQiLCAibG9va0FoZWFkIiwgIk5vZGVQcm9wIiwgIlRva2VuQ2FjaGUiLCAicGFyc2VyIiwgInN0cmVhbSIsICJfIiwgIkNhY2hlZFRva2VuIiwgImFjdGlvbkluZGV4IiwgIm1haW4iLCAidG9rZW5pemVycyIsICJtYXNrIiwgImNvbnRleHQiLCAidG9rZW5pemVyIiwgInN0YXJ0SW5kZXgiLCAicCIsICJyZXN1bHQiLCAiYWN0aW9uIiwgInNldCIsICJwYWlyIiwgIlBhcnNlIiwgInJhbmdlcyIsICJJbnB1dFN0cmVhbSIsICJTdGFjayIsICJzdGFja3MiLCAibmV3U3RhY2tzIiwgInN0b3BwZWQiLCAic3RvcHBlZFRva2VucyIsICJzIiwgInRvayIsICJmaW5pc2hlZCIsICJmaW5kRmluaXNoZWQiLCAibWF4UmVtYWluaW5nIiwgImEiLCAiYiIsICJvdXRlciIsICJqIiwgIm90aGVyIiwgInNwbGl0IiwgImJhc2UiLCAic3RyaWN0Q3giLCAiY3hIYXNoIiwgImNhY2hlZCIsICJtYXRjaCIsICJpbm5lciIsICJkZWZhdWx0UmVkdWNlIiwgImFjdGlvbnMiLCAibG9jYWxTdGFjayIsICJwdXNoU3RhY2tEZWR1cCIsICJ0b2tlbnMiLCAicmVzdGFydGVkIiwgInRva2VuRW5kIiwgImZvcmNlIiwgImZvcmNlQmFzZSIsICJpbnNlcnQiLCAiU3RhY2tCdWZmZXJDdXJzb3IiLCAiaWQiLCAiRGlhbGVjdCIsICJzb3VyY2UiLCAiZmxhZ3MiLCAiZGlzYWJsZWQiLCAiTFJQYXJzZXIiLCAiX0xSUGFyc2VyIiwgIlBhcnNlciIsICJzcGVjIiwgIm5vZGVOYW1lcyIsICJpIiwgInRvcFRlcm1zIiwgInIiLCAibm9kZVByb3BzIiwgInNldFByb3AiLCAibm9kZUlEIiwgInByb3AiLCAidmFsdWUiLCAicHJvcFNwZWMiLCAiTm9kZVByb3AiLCAibmV4dCIsICJqIiwgIk5vZGVTZXQiLCAibmFtZSIsICJOb2RlVHlwZSIsICJ0b2tlbkFycmF5IiwgImRlY29kZUFycmF5IiwgImdldFNwZWNpYWxpemVyIiwgIlRva2VuR3JvdXAiLCAiaW5wdXQiLCAiZnJhZ21lbnRzIiwgInJhbmdlcyIsICJwYXJzZSIsICJQYXJzZSIsICJ3IiwgInN0YXRlIiwgInRlcm0iLCAibG9vc2UiLCAidGFibGUiLCAicG9zIiwgImdyb3VwVGFnIiwgImxhc3QiLCAidGFyZ2V0IiwgImVuZCIsICJ0ZXJtaW5hbCIsICJkYXRhIiwgInNldCIsICJwYWlyIiwgInNsb3QiLCAiZmxhZyIsICJhY3Rpb24iLCAiYSIsICJkZWZsdCIsICJyZXN1bHQiLCAidiIsICJjb25maWciLCAiY29weSIsICJpbmZvIiwgInQiLCAiZm91bmQiLCAicyIsICJwcmVjIiwgImRpYWxlY3QiLCAidmFsdWVzIiwgImZsYWdzIiwgInBhcnQiLCAiaWQiLCAiZGlzYWJsZWQiLCAiRGlhbGVjdCIsICJvZmYiLCAiZmluZEZpbmlzaGVkIiwgInN0YWNrcyIsICJiZXN0IiwgInN0YWNrIiwgInN0b3BwZWQiLCAibWFzayIsICJwYXJzZXIiLCAiTFJQYXJzZXIiLCAiTG9jYWxUb2tlbkdyb3VwIiwgImNyaXRpY21hcmt1cExhbmd1YWdlIiwgIkxSTGFuZ3VhZ2UiLCAicmFuZ2VQYXJzZXIiLCAiU3RhdGVGaWVsZCIsICJzdGF0ZSIsICJ0ZXh0IiwgInRyZWUiLCAiY3JpdGljbWFya3VwTGFuZ3VhZ2UiLCAicmFuZ2VzIiwgIkNyaXRpY01hcmt1cFJhbmdlcyIsICJjdXJzb3JHZW5lcmF0ZVJhbmdlcyIsICJUcmVlRnJhZ21lbnQiLCAidmFsdWUiLCAidHIiLCAiZWZmZWN0IiwgImZ1bGxSZWxvYWRFZmZlY3QiLCAiY2hhbmdlZF9yYW5nZXMiLCAiZnJvbSIsICJ0byIsICJmcm9tQiIsICJ0b0IiLCAiZnJhZ21lbnRzIiwgIkRvY0lucHV0IiwgImluc2VydGVkX3NldCIsICJvZmZzZXRzIiwgImRhbmdsaW5nX2NvbW1lbnRzIiwgImRlbGV0ZWRfcmFuZ2VzIiwgImNoYW5nZWRfcmFuZ2UiLCAicmFuZ2UiLCAia2V5IiwgInJlcGx5IiwgImRlbGV0ZWRfcmFuZ2UiLCAiY3VtdWxhdGl2ZV9vZmZzZXQiLCAibmlsX25vZGUiLCAidmlzaXROb2RlIiwgIm5vZGUiLCAiaW5zZXJ0ZWRfcmFuZ2VzIiwgImNvbW1lbnRfdGhyZWFkcyIsICJsYXN0X3JhbmdlIiwgImN1cnJlbnRfdGhyZWFkIiwgImEiLCAiYiIsICJ0aHJlYWQiLCAiaGVhZCIsICJhZGphY2VudF9yYW5nZSIsICJjb21tZW50IiwgImNvbnN0cnVjdFJhbmdlRnJvbVN5bnRheE5vZGUiLCAiX2EiLCAiX2IiLCAibWV0YWRhdGEiLCAiQ09NTUVOVEFUT1JfR0xPQkFMIiwgIm1pZGRsZSIsICJjaGlsZCIsICJjb25zdHJ1Y3RSYW5nZSIsICJzdGFydCIsICJwcmV2aW91c19yYW5nZSIsICJjdXJzb3IiLCAibmV3X3JhbmdlIiwgImdldFJhbmdlc0luVGV4dCIsICJ0ZXh0IiwgInRyZWUiLCAiY3JpdGljbWFya3VwTGFuZ3VhZ2UiLCAiY3Vyc29yR2VuZXJhdGVSYW5nZXMiLCAiY29uc3RydWN0UmFuZ2UiLCAiZnJvbSIsICJ0byIsICJ0eXBlIiwgIm1pZGRsZSIsICJtZXRhZGF0YSIsICJBZGRpdGlvblJhbmdlIiwgIkRlbGV0aW9uUmFuZ2UiLCAiU3Vic3RpdHV0aW9uUmFuZ2UiLCAiSGlnaGxpZ2h0UmFuZ2UiLCAiQ29tbWVudFJhbmdlIiwgIlJBTkdFX1BST1RPVFlQRV9NQVBQRVIiLCAiZGVmYXVsdF9tb3ZlbWVudF9vcHRpb25zIiwgImJyYWNrZXRfbW92ZW1lbnRfb3B0aW9ucyIsICJpbmRleFdvcmtlciIsICJmaWxlcyIsICJzZXR0aW5ncyIsICJDT01NRU5UQVRPUl9HTE9CQUwiLCAiZmlsZSIsICJnZXRSYW5nZXNJblRleHQiLCAiZXZlbnQiLCAiaW5kZXhXb3JrZXIiXQp9Cg==\n')}(0,vd.extendPrototype)(xF.default);(0,kd.extendPrototype)(xF.default);var rc=class extends mB.Events{_events=[];onunload(){}unload(){for(;this._events.length>0;)this._events.pop()()}register(I){this._events.push(I)}registerEvent(I){this.register(()=>I.e.offref(I))}},GU=class extends rc{constructor(g,B,F,A,Q,U,s,l=2,d=G=>G,c=()=>this.plugin.settings,i=!0){super();this.plugin=g;this.name=B;this.title=F;this.version=A;this.description=Q;this.defaultValue=U;this.extractValue=s;this.workers=l;this.loadValue=d;this.getSettings=c;this.old_version=parseInt(this.plugin.app.loadLocalStorage(B+"-version"))||null,this.persist=xF.default.createInstance({name:this.name+`/${this.plugin.app.appId}`,driver:xF.default.INDEXEDDB,description:Q,version:A}),i&&this.startDatabase()}memory=new Map;persist;old_version=null;deleted_keys=new Set;databaseUpdate=(0,mB.debounce)(()=>{this.trigger("database-update",this.allEntries()),this.flushChanges()},100,!0);flushChanges=(0,mB.debounce)(async()=>{await this.persistMemory(),this.trigger("database-update",this.allEntries())},1e3,!0);on(g,B,F){return super.on(g,B,F)}async startDatabase(){this.plugin.app.workspace.onLayoutReady(async()=>{await this.persist.ready(async()=>{this.old_version===null?(await this.rebuildDatabase(),this.trigger("database-create")):this.old_version{if(g instanceof mB.TFile&&g.extension==="md"){let B=this.plugin.app.workspace.activeEditor,F=B&&B.file?.path===g.path&&B.editor?B.editor.cm.state:void 0;this.storeKey(g.path,await this.extractValue(g,F),g.stat.mtime)}})),this.registerEvent(this.plugin.app.vault.on("delete",async g=>{g instanceof mB.TFile&&g.extension==="md"&&this.deleteKey(g.path)})),this.registerEvent(this.plugin.app.vault.on("rename",async(g,B)=>{g instanceof mB.TFile&&g.extension==="md"&&this.renameKey(B,g.path,g.stat.mtime)})),this.registerEvent(this.plugin.app.vault.on("create",async g=>{g instanceof mB.TFile&&g.extension==="md"&&this.storeKey(g.path,this.defaultValue(),g.stat.mtime)}))})})}async loadDatabase(){this.memory=new Map(Object.entries(await this.persist.getItems()).map(([g,B])=>(B.data=this.loadValue(B.data),[g,B])))}async regularParseFiles(g){for(let B=0;Bawait this.plugin.app.vault.cachedRead(A))),F=Math.ceil(g.length/this.workers);for(let A=0;A{for(let d=0;d{g.some(A=>A.path===F)||this.deleteKey(F)});let B=g.filter(F=>!this.memory.has(F.path)||this.memory.get(F.path).mtimeawait this.persist.removeItem(B))),this.deleted_keys.clear()}storeKey(g,B,F,A=!0){this.memory.set(g,{data:B,mtime:F??Date.now(),dirty:A}),this.databaseUpdate()}deleteKey(g){if(this.getItem(g)==null)throw new Error("Key does not exist");this.memory.delete(g),this.deleted_keys.add(g),this.databaseUpdate()}renameKey(g,B,F){let A=this.getItem(g);if(A==null)throw new Error("Key does not exist");this.storeKey(B,A.data,F),this.deleteKey(g),this.databaseUpdate()}allKeys(){return Array.from(this.memory.keys())}getValue(g){return this.memory.get(g)?.data??null}allValues(){return Array.from(this.memory.values()).map(g=>g.data)}getItem(g){return this.memory.get(g)??null}allItems(){return Array.from(this.memory.values())}allEntries(){return Array.from(this.memory.entries())}async dropDatabase(){this.memory.clear(),await xF.default.dropInstance({name:this.name+`/${this.plugin.app.appId}`}),localStorage.removeItem(this.plugin.app.appId+"-"+this.name+"-version")}async reinitializeDatabase(){await this.dropDatabase(),this.persist=xF.default.createInstance({name:this.name+`/${this.plugin.app.appId}`,driver:xF.default.INDEXEDDB,version:this.version,description:this.description}),await this.rebuildDatabase(),this.trigger("database-update",this.allEntries())}async clearDatabase(){this.memory.clear(),await this.persist.clear()}isEmpty(){return this.memory.size===0}};var mb=require("obsidian");var Dd={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],meridiem:["am","pm"],suffix:["st","nd","rd","th"],todayBtn:"Today",clearBtn:"Clear",okBtn:"Ok",cancelBtn:"Cancel",timeView:"Show time view",backToDate:"Back to calendar view"};var Td={theme:"sdt-calendar-colors",format:"yyyy-mm-dd",formatType:"standard",displayFormat:null,displayFormatType:null,minuteIncrement:1,weekStart:1,inputClasses:"",todayBtnClasses:"sdt-action-btn sdt-today-btn",clearBtnClasses:"sdt-action-btn sdt-clear-btn",hourOnly:!1,todayBtn:!0,clearBtn:!0,clearToggle:!0,autocommit:!0,i18n:Dd};var wd=!1,dg=class C extends Date{#I=kg(super.getTime());#g=new Map;#C=NI;constructor(...I){super(...I),wd||this.#B()}#B(){wd=!0;var I=C.prototype,g=Date.prototype,B=Object.getOwnPropertyNames(g);for(let F of B)(F.startsWith("get")||F.startsWith("to")||F==="valueOf")&&(I[F]=function(...A){if(A.length>0)return t(this.#I),g[F].apply(this,A);var Q=this.#g.get(F);if(Q===void 0){let U=NI;Gg(this.#C),Q=sI(()=>(t(this.#I),g[F].apply(this,A))),this.#g.set(F,Q),Gg(U)}return t(Q)}),F.startsWith("set")&&(I[F]=function(...A){var Q=g[F].apply(this,A);return p(this.#I,g.getTime.call(this)),Q})}};function KB(C){p(C,C.v+1)}var fd=Symbol(),Ql=class extends URLSearchParams{#I=kg(0);#g=zd();#C=!1;#B(){if(!this.#g||this.#C)return;this.#C=!0;let I=this.toString();this.#g.search=I&&`?${I}`,this.#C=!1}[fd](I){if(!this.#C){this.#C=!0;for(let g of[...super.keys()])super.delete(g);for(let[g,B]of I)super.append(g,B);KB(this.#I),this.#C=!1}}append(I,g){super.append(I,g),this.#B(),KB(this.#I)}delete(I,g){var B=super.has(I,g);super.delete(I,g),B&&(this.#B(),KB(this.#I))}get(I){return t(this.#I),super.get(I)}getAll(I){return t(this.#I),super.getAll(I)}has(I,g){return t(this.#I),super.has(I,g)}keys(){return t(this.#I),super.keys()}set(I,g){var B=super.getAll(I).join("");super.set(I,g),B!==super.getAll(I).join("")&&(this.#B(),KB(this.#I))}sort(){super.sort(),this.#B(),KB(this.#I)}toString(){return t(this.#I),super.toString()}values(){return t(this.#I),super.values()}entries(){return t(this.#I),super.entries()}[Symbol.iterator](){return this.entries()}get size(){return t(this.#I),super.size}};var TZ=null;function zd(){return TZ}function gA(C,I,g,B){if(C instanceof Date)return C;let F=B==="php"?{date:"Y-m-d",datetime:"Y-m-d H:i",datetime_s:"Y-m-d H:i:s"}:{date:"yyyy-mm-dd",datetime:"yyyy-mm-dd hh:ii",datetime_s:"yyyy-mm-dd hh:ii:ss"},A,Q;/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(C)?A=LF.parseFormat(F.date,B):/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(C)?A=LF.parseFormat(F.datetime,B):/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(C)?A=LF.parseFormat(F.datetime_s,B):(/^([01]*\d|2[0-3])([0-5]\d)(?:[ ]([ap][m]|[AP][M]))?$/.test(C)&&(Q=C.match(/^([01]*\d|2[0-3])([0-5]\d)(?:[ ]([ap][m]|[AP][M]))?$/)?.slice(1).filter(V=>V)),A=LF.parseFormat(I,B));let U=Q||C&&C.toString().match(LF.nonpunctuation)||[];C=new Date,C.setHours(0,0,0,0);let s={},{setters_order:l,setters_map:d}=LF.setters(B),c,i;if(U.length!==A.parts.length&&A.parts.includes("S")){let V=U[A.parts.indexOf("S")-1].match(/(\d+)([a-zA-Z]+)/)?.slice(1,3);U.splice(A.parts.indexOf("S")-1,1,...V)}if(U.length===A.parts.length){for(var G=0,b=A.parts.length;G14)?g.suffix[F%10-1]:g.suffix[g.suffix.length-1],p:g.meridiem.length===2?g.meridiem[C.getHours()<12?0:1]:"",h:C.getHours(),ii:(C.getMinutes()<10?"0":"")+C.getMinutes(),ss:(C.getUTCSeconds()<10?"0":"")+C.getUTCSeconds()},g.meridiem.length===2?A.H=A.h%12===0?12:A.h%12:A.H=A.h,A.HH=(A.H<10?"0":"")+A.H,A.P=A.p.toUpperCase(),A.hh=(A.h<10?"0":"")+A.h,A.i=A.ii,A.s=A.ss,A.dd=(A.d<10?"0":"")+A.d,A.mm=(A.m<10?"0":"")+A.m;else if(B==="php")A={y:C.getFullYear().toString().substring(2),Y:C.getFullYear(),F:g.months[C.getMonth()],M:g.monthsShort[C.getMonth()],n:C.getMonth()+1,t:Nc(C.getFullYear(),C.getMonth()),j:C.getDate(),l:g.days[C.getDay()],D:g.daysShort[C.getDay()],w:C.getDay(),N:C.getDay()===0?7:C.getDay(),S:F%10&&F%10<4&&(F<10||F>14)?g.suffix[F%10-1]:g.suffix[g.suffix.length-1],a:g.meridiem.length===2?g.meridiem[C.getHours()<12?0:1]:"",g:C.getHours()%12===0?12:C.getHours()%12,G:C.getHours(),i:C.getMinutes(),s:C.getSeconds(),U:Math.floor(C.getTime()/1e3)},A.m=(A.n<10?"0":"")+A.n,A.d=(A.j<10?"0":"")+A.j,A.A=A.a.toString().toUpperCase(),A.h=(A.g<10?"0":"")+A.g,A.H=(A.G<10?"0":"")+A.G,A.i=(A.i<10?"0":"")+A.i,A.s=(A.s<10?"0":"")+A.s;else throw new Error("Invalid format type.");let Q=[],U=LF.parseFormat(I,B);for(var s=0,l=U.parts?.length||0;sB.setHours(F),h:(B,F)=>B.setHours(F),HH:(B,F)=>B.setHours(F===12?0:F),H:(B,F)=>B.setHours(F===12?0:F),i:(B,F)=>B.setMinutes(F),s:(B,F)=>B.setSeconds(F),yyyy:(B,F)=>B.setFullYear(F),yy:(B,F)=>B.setFullYear((F<50?2e3:1900)+F),m:(B,F)=>{for(F-=1;F<0;)F+=12;for(F%=12,B.setMonth(F);B.getMonth()!==F;){if(isNaN(B.getMonth()))return B;B.setDate(B.getDate()-1)}return B},d:(B,F)=>B.setDate(F),p:(B,F)=>B.setHours(F===1&&B.getHours()<12?B.getHours()+12:B.getHours()),t:(B,F)=>B.setTime(F),mm:()=>{},M:()=>{},MM:()=>{},ii:()=>{},ss:()=>{},dd:()=>{},D:()=>{},DD:()=>{},P:()=>{}},g.mm=g.M=g.MM=g.m,g.ii=g.i,g.ss=g.s,g.dd=g.D=g.DD=g.d,g.P=g.p):(I=["Y","yy","m","M","F","n","d","D","j","l","N","S","H","G","h","g","i","s","p","P","U"],g={H:(B,F)=>B.setHours(F),G:(B,F)=>B.setHours(F),h:(B,F)=>B.setHours(F===12?0:F),g:(B,F)=>B.setHours(F===12?0:F),i:(B,F)=>B.setMinutes(F),s:(B,F)=>B.setSeconds(F),Y:(B,F)=>B.setFullYear(F),yy:(B,F)=>B.setFullYear((F<50?2e3:1900)+F),m:(B,F)=>{for(F-=1;F<0;)F+=12;for(F%=12,B.setMonth(F);B.getMonth()!==F;){if(isNaN(B.getMonth()))return B;B.setDate(B.getDate()-1)}return B},n:(B,F)=>B.setMonth(F-1),d:(B,F)=>B.setDate(F),a:(B,F)=>B.setHours(F===1?B.getHours()+12:B.getHours()),U:(B,F)=>B.setTime(F*1e3)},g.F=g.M=g.m,g.D=g.j=g.l=g.N=g.d,g.A=g.a),{setters_order:I,setters_map:g}}};function Md(C,I,g,B,F){if(g===0){let a=10,L=20,y=-1,E=[],Y=[],N=C.getFullYear()-C.getFullYear()%10;N-=N%20?12:10,N%10&&(a=12,L=22);for(let j=0;j<32;j++)Y.push(N+j),Y.length===4&&(E.push(Y),Y=[]);let r=[];return I[0]||(I[0]=new Date),I[0].getFullYear()>=N&&r.push(I[0].getFullYear()%N),{years:E,todayMark:y,nextFrom:L,prevTo:a,selectionMark:r}}if(g===1){let a=[],L=[],y=12,E=24,Y=C.toISOString().split("T")[0].substring(0,8),N=new Date(Y+"01 00:00:00"),r=N.getFullYear()-1;N.setFullYear(r);let j=0;for(let D=0;D<3;D++){for(let UI=0;UI<12;UI++)N.setMonth(UI),L.push(B.monthsShort[UI%12]),L.length===4&&(a.push(L),L=[]);N.setFullYear(N.getFullYear()+1)}let _=[];return I[0]||(I[0]=new Date),I[0].getFullYear()-r>=0&&I[0].getFullYear()-r<=2&&_.push(I[0].getMonth()+(I[0].getFullYear()-r||0)*12),{months:a,todayMark:j,nextFrom:E,prevTo:y,selectionMark:_}}let A=C||new Date,Q=A.getFullYear(),U=A.getMonth(),s=A.getDate(),l=A.getHours(),d=new Date,c=new Date(Q,U-1,28,0,0,0,0),i=Nc(c.getFullYear(),c.getMonth());c.setDate(i),c.setDate(i-(c.getDay()-F+7)%7);let G=new Date(c);G.setDate(G.getDate()+42);let b=G.valueOf(),e=[],V=[],u=-1,n=[],R=0,h=42,m=0;for(;c.valueOf()Q||c.getFullYear()===Q&&c.getMonth()>U)&&(h=m-1),c.setDate(c.getDate()+1),c.getFullYear()===d.getFullYear()&&c.getMonth()===d.getMonth()&&c.getDate()===d.getDate()&&(u=m),n.length!==I.length&&I.map(a=>{c.getFullYear()===a.getFullYear()&&c.getMonth()===a.getMonth()&&c.getDate()===a.getDate()&&n.push(m)}),V.length===7&&(e.push(V),V=[]);return{grid:e,days:e,todayMark:u,prevTo:R,nextFrom:h,selectionMark:n}}function Kd(C){let I=C-1;return I*I*I+1}function Pd(C,{duration:I=400,start:g=0,end:B=1,opacity:F=0}){let A=getComputedStyle(C),Q=+A.opacity,U=A.transform==="none"?"":A.transform,s=1-g,l=Q*(1-F);return B=B||1,{delay:0,duration:I,easing:Kd,css:(d,c)=>` - transform: ${U} scale(${B!==1?g+B*c:1-s*c}); - opacity: ${Q-l*c}; - `}}function fZ(C,I,g,B,F,A,Q,U){if(p(I,-1),p(g,!0),t(B)&&jQ(B,-1),t(B)===0){let s=Math.floor(t(F).getFullYear()/10)*10%20===0;p(A,s?Q:U,!0)}}function zZ(C,I){I.onswitch?.("time")}var MZ=f(''),KZ=(C,I)=>I(-1),PZ=(C,I)=>I(1),jZ=(C,I,g)=>{I(t(g))},OZ=f(''),_Z=f(''),qZ=f('
'),$Z=(C,I,g)=>{I(t(g))},IV=f(''),gV=f(''),CV=f('
'),BV=f(' '),FV=(C,I,g)=>{I(t(g))},AV=f(''),QV=f(""),UV=f('
'),sV=f('
',1),lV={hash:"svelte-s6uyff",code:`td.svelte-s6uyff,th.svelte-s6uyff {padding:0;border-width:0;}.sdt-cal-td.svelte-s6uyff {padding:0;font-size:90%;text-align:center; +**Error while generating debugger data:** ${F}`,labels:"bug"})}}async function ii(C,I="",g={}){window.open(await k0(C,I,g),"_blank")}function ul(C,I,g=100,B=3e3,F){let Q=new hB.Notice("",0);Q.messageEl.appendChild(createEl("span",{text:C})),F&&(Q.messageEl.appendChild(createEl("br")),Q.messageEl.appendChild(createEl("span",{cls:"u-small",text:F})));let A=createEl("progress");return A.value=0,A.max=g,Q.messageEl.appendChild(A),U=>{U>=g?(Q.setMessage(I),Q.noticeEl.addClass("mod-success"),setTimeout(()=>{Q.hide()},B)):A.value=Math.round(U)}}function Ll(C,I,g,B){for(let{icon:F,tooltip:Q,value:A}of g)C.addItem(U=>{U.setTitle(Q).setIcon(F).setChecked(I===A).onClick(()=>{B(A);for(let l of C.items){let s=l===U;l.dom.classList.toggle("mod-checked",s),l.checkIconEl?l.checkIconEl.style.display=s?"flex":"none":l.setChecked(s)}})})}var Zi=require("obsidian"),ei=require("@codemirror/state");var yt=require("@codemirror/state"),wa=require("@codemirror/view");var di=yt.Facet.define({combine:C=>C.some(I=>I)}),ht=yt.Facet.define(),Xt=class extends XQ{constructor(I){super(I,di,ht),I.dom.parentElement.classList.contains("markdown-source-view")||(this.dom.style.display="none",setImmediate(()=>{I.dispatch(I.state.update({effects:[Rl.reconfigure([])]}))}))}createGutters(I){return I.state.facet(ht).map(g=>new ot(I,g))}},ot=class extends cF{constructor(g,B){super(g,B);this.view=g;this.config=B;g.state.facet(HF)&&(this.hide_on_empty=!0)}hide_on_empty=!1;showing=!0;update(g){let B=super.update(g),F=g.state.facet(HF);return F!==g.startState.facet(HF)&&(this.hide_on_empty=F),this.showing&&this.hide_on_empty&&g.state.field(JI).ranges.empty()?(this.dom.parentElement.classList.add("gutter-hidden"),this.showing=!1):!this.showing&&(!this.hide_on_empty||!g.state.field(JI).ranges.empty())&&(this.dom.parentElement.classList.remove("gutter-hidden"),this.showing=!0),B}},D0=$U(Xt);function bi(C){return Il(D0,C,ht,di)}var nl=require("@codemirror/state"),al=require("@codemirror/view");var St=class extends al.GutterMarker{constructor(g,B,F){super();this.type=g;this.top=B;this.bottom=F}toDOM(){let g="";return this.type.has("addition")&&(g+="cmtr-diff-gutter-addition "),this.type.has("deletion")&&(g+="cmtr-diff-gutter-deletion "),this.type.has("substitution")&&(g+="cmtr-diff-gutter-substitution "),this.top&&(g+="cmtr-diff-gutter-top "),this.bottom&&(g+="cmtr-diff-gutter-bottom "),createDiv({cls:g})}},Wt=al.ViewPlugin.fromClass(class{markers=nl.RangeSet.empty;constructMarkers(I){let g=I.state.field(JI).ranges,B=new nl.RangeSetBuilder,F={};for(let Q of g.ranges_in_interval(I.viewport.from,I.viewport.to)){let A=I.state.doc.lineAt(Q.from).number,U=I.state.doc.lineAt(Q.to).number,l=Array.from({length:U-A+1},(s,G)=>A+G);F[A]?F[A].isStart=!0:F[A]={isStart:!0,isEnd:!1,types:new Set};for(let s of l)F[s]?(F[s].isEnd=!1,F[s].types.add(Q.type)):F[s]={isStart:!1,isEnd:!1,types:new Set([Q.type])};F[U]&&(F[U].isEnd=!0)}for(let[Q,A]of Object.entries(F)){let U=I.state.doc.line(Number(Q));B.add(U.from,U.to,new St(A.types,A.isStart,A.isEnd))}this.markers=B.finish()}constructor(I){this.constructMarkers(I)}update(I){(I.docChanged||I.viewportChanged||I.heightChanged)&&this.constructMarkers(I.view)}});var Vi=[Wt,bi({class:"cmtr-diff-gutter",markers:C=>C.plugin(Wt).markers,domEventHandlers:{click:(C,I,g)=>{let B=new Zi.Menu;return B.addItem(F=>{F.setTitle("Accept changes").setIcon("check").onClick(()=>{C.dispatch({changes:wB(C.state,I.from,I.to)})})}),B.addItem(F=>{F.setTitle("Reject changes").setIcon("cross").onClick(()=>{C.dispatch({changes:fB(C.state,I.from,I.to)})})}),B.showAtMouseEvent(g),!1}}})],Rl=new ei.Compartment;var T0=C=>Object.entries(FG).map(([I,g])=>({id:`toggle-${I.toLowerCase()}`,name:`Mark as ${I}`,icon:I.toLowerCase(),editor_context:!0,regular_callback:(B,F)=>{gi(B,g,C.settings)}})),w0=C=>[{id:"accept-all-suggestions",name:"Accept all suggestions",icon:"check-check",editor_context:!0,regular_callback:(I,g)=>{I.cm.dispatch(I.cm.state.update({changes:wB(I.cm.state)}))}},{id:"reject-all-suggestions",name:"Reject all suggestions",icon:"cross",editor_context:!0,regular_callback:(I,g)=>{I.cm.dispatch(I.cm.state.update({changes:fB(I.cm.state)}))}},{id:"accept-selected-suggestions",name:"Accept suggestions in selection",icon:"check",editor_context:!0,check_callback:(I,g,B)=>{let F=Bt(g.cm.state);if(I||!F)return F;let A=g.cm.state.selection.ranges.map(U=>wB(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:A}))}},{id:"reject-selected-suggestions",name:"Reject suggestions in selection",icon:"cross",editor_context:!0,check_callback:(I,g,B)=>{let F=Bt(g.cm.state);if(I||!F)return F;let A=g.cm.state.selection.ranges.map(U=>fB(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:A}))}},{id:"comment",name:"Add comment",icon:"message-square",editor_context:!0,regular_callback:(I,g)=>{jC(I.cm,I.cm.state.field(JI).ranges.at_cursor(I.cm.state.selection.main.head))}},{id:"fold-gutter",name:"Fold annotation gutter",icon:"arrow-right-from-line",editor_context:!0,regular_callback:(I,g)=>{I.cm.dispatch({annotations:[iF.of(null)]})}},{id:"toggle-preview-mode",name:"Cycle preview mode",icon:"comment",editor_context:!0,regular_callback:(I,g)=>{let B=(I.cm.state.facet(Mg)+1)%3;I.cm.dispatch(I.cm.state.update({effects:xQ.reconfigure(Mg.of(B))})),C.setPreviewMode(g,B)}},{id:"suggest-mode",name:"Toggle suggestion mode",icon:"file-edit",editor_context:!0,regular_callback:(I,g)=>{let F=I.cm.state.facet(nC)===2?1:2;I.cm.dispatch(I.cm.state.update({effects:[uQ.reconfigure(nC.of(F)),LQ.reconfigure(ZF(F,C.settings))]})),C.setEditMode(g,F)}},{id:"generate-text-diff",name:"Generate text diff from clipboard",icon:"diff",editor_context:!0,regular_callback:async(I,g)=>{let B=await navigator.clipboard.readText(),F=I.cm.state.field(JI).ranges,Q=I.cm.state.selection.main,A=F.unwrap_in_range(I.cm.state.doc,Q.from,Q.to).output,U=Bi(A,B);I.cm.dispatch(I.cm.state.update({changes:[{from:Q.from,to:Q.to,insert:U}]}))}}],f0=C=>[{id:"view",name:"Open global annotation view",icon:"comment",regular_callback:async()=>{await C.activateView()}}],ui=C=>z0([...T0(C),...w0(C),...f0(C)]);function z0(C){for(let I of C)xi.Platform.isMobile||I.editor_context?I.regular_callback?(I.editorCallback=I.regular_callback,delete I.regular_callback):(I.editorCheckCallback=I.check_callback,delete I.check_callback):I.regular_callback?(I.callback=I.regular_callback,delete I.regular_callback):(I.checkCallback=I.check_callback,delete I.check_callback);return C}var Li=C=>C.workspace.on("editor-menu",(I,g)=>{let B=g.cm.state.field(JI).ranges;if(I.addItem(F=>{F.setTitle("Add comment").setIcon("message-square").setSection("commentator").onClick(()=>{jC(g.cm,B.at_cursor(g.cm.state.selection.main.head))})}),B.contains_range(g.cm.state.selection.main.from,g.cm.state.selection.main.to)&&(I.addItem(F=>{F.setTitle("Accept changes").setIcon("check").setSection("commentator").onClick(()=>{let A=g.cm.state.selection.ranges.map(U=>wB(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:A}))})}),I.addItem(F=>{F.setTitle("Reject changes").setIcon("cross").setSection("commentator").onClick(()=>{let A=g.cm.state.selection.ranges.map(U=>fB(g.cm.state,U.from,U.to));g.cm.dispatch(g.cm.state.update({changes:A}))})}),lG(g.cm.state.selection))){let F=g.cm.state.field(JI).ranges.at_cursor(g.cm.state.selection.ranges[0].head);I.addItem(Q=>{let A=Q.setTitle("Set metadata").setIcon("tags").setSection("commentator").setSubmenu();A.addItem(U=>{U.setTitle("Set author").setIcon("lucide-user").onClick(()=>{g.cm.dispatch(g.cm.state.update({changes:F.add_metadata("author",sg.PLUGIN_SETTINGS.author)}))})}),A.addItem(U=>{U.setTitle("Set time").setIcon("lucide-calendar").onClick(()=>{g.cm.dispatch(g.cm.state.update({changes:F.add_metadata("time",Math.round(Date.now()/1e3))}))})}),A.addItem(U=>{U.setTitle("Set completed").setIcon("lucide-check").onClick(()=>{g.cm.dispatch(g.cm.state.update({changes:F.add_metadata("done",!0)}))})})})}}),Ri=C=>C.workspace.on("markdown-viewport-menu",(I,g,B,F)=>{if(C.plugins.plugins.commentator.settings.annotation_gutter){let Q=g.editor.cm,A=Q.state.field(QB);GF(!0),I.addItem(U=>{U.setTitle("Fold gutter").setIcon("arrow-right-from-line").setSection("commentator").onClick(()=>{Q.dispatch(Q.state.update({annotations:[iF.of(null)]}))})}),I.addItem(U=>{let l=U.setTitle("Included annotations").setIcon("eye").setSection("commentator").setSubmenu();for(let{title:s,icon:G,value:t}of[{title:"Additions",icon:"plus-circle",value:1},{title:"Deletions",icon:"minus-square",value:2},{title:"Substitutions",icon:"replace",value:4},{title:"Highlights",icon:"highlighter",value:8},{title:"Comments",icon:"message-square",value:16}])l.addItem(c=>{c.setTitle(s).setIcon(G).setChecked((A&t)!==0).onClick(()=>{A^=t;let d=(A&t)!==0;c.checkIconEl?c.checkIconEl.style.display=d?"flex":"none":c.setChecked(d),Q.dispatch(Q.state.update({effects:[VQ.reconfigure(QB.of(A))]}))})})})}});function pQ(C,I){C.scrollIntoView({from:C.offsetToPos(I.from),to:C.offsetToPos(I.to)},!0)}var ml=require("@codemirror/state"),ni=require("@codemirror/view");var Et=ml.Prec.high(ni.EditorView.inputHandler.of((C,I,g,B)=>{let F=C.state.doc.sliceString(I-2,I)+B,Q;if((Q=QG[F])!==void 0){let A=[{from:I,to:g+1,insert:B+Q.join("")}];return C.dispatch({changes:A,selection:ml.EditorSelection.cursor(g+1)}),!0}return!1}));var hl=require("@codemirror/state");var Nt=hl.EditorState.transactionFilter.of(C=>{if(C.isUserEvent("select")){let I=C.startState.selection.main,g=C.selection.main;if(g.anchor===g.head){let B=C.startState.field(JI).ranges,F=B.at_cursor(I.head),Q=B.at_cursor(g.head);if(F&&F!==Q&&(F.type==="substitution"||F.type==="highlight")){let A=F.unwrap(),U=!1,l=0,s=A.search(/\S/);s>=1&&(U=!0,A=A.slice(s),l+=s);let G=A.match(/\n\s*\n/g);if(G&&(U=!0,A=A.replace(/\n\s*\n/g,` +`),l+=G.reduce((t,c)=>t+c.length,0)),U)return{changes:[{from:F.from+3,to:F.to-3,insert:A}],selection:hl.EditorSelection.cursor(g.head-l)}}}}return C});var ai=require("@codemirror/state");var rt=C=>ai.EditorState.transactionExtender.of(I=>{if(I.selection&&I.newSelection.main!==I.startState.selection.main){let g=[],B=[];return C.annotation_gutter_focus_on_click&&B.push(aB.of({from:I.selection.main.from,to:I.selection.main.to})),g.push(NQ.of({from:I.selection.main.from,to:I.selection.main.to})),{effects:g,annotations:B}}return{}});var TF=require("obsidian");async function sB(C,I,g,B=!0){let F=MU(I),Q={},A=()=>{};Object.keys(F).length>=100&&(A=ul("Applying operations...","Operations applied.",Object.keys(F).length,3e3,"Please do not apply other operations until this progress bar has completed."));let U=0;for(let[l,s]of Object.entries(F)){let G=C.app.vault.getAbstractFileByPath(l);!G||!(G instanceof TF.TFile)||(Q[l]=await C.app.vault.cachedRead(G),B&&(s=s.flatMap(t=>[t,...t.replies])),s.sort((t,c)=>t.from-c.from),await g(C.app,G,s),A(++U))}C.file_history.push({changes:Q,mtime:Date.now()})}async function pt(C){if(C.file_history.length===0){new TF.Notice("No changes to undo.",3e3);return}let I=C.file_history.pop();if(!I)return;let{changes:g,mtime:B}=I,F=()=>{};Object.keys(g).length>=100&&(F=ul("Undoing changes...","Changes undone.",Object.keys(g).length,3e3,"Please do not apply other operations until this progress bar has completed."));let Q=0;for(let[A,U]of Object.entries(g)){let l=C.app.vault.getAbstractFileByPath(A);if(!(!l||!(l instanceof TF.TFile))){if(l.stat.mtime>B){new TF.Notice("File has been modified since the changes were made, skipping: "+A,3e3);continue}await C.app.vault.modify(l,U),F(++Q)}}}async function Xl(C,I){let g=C.app.workspace.getLeavesOfType("markdown");if(!g.length)return;let B=g.reduce((A,U)=>(A.activeTime??0)>(U.activeTime??0)?A:U),F=C.app.vault.getAbstractFileByPath(I.path);if(!F||!(F instanceof TF.TFile))return;await C.app.workspace.revealLeaf(B);let Q=B.view;F!==Q.file&&await B.openFile(F),pQ(Q.editor,I.range)}var Ht=new Uint16Array('\u1D41<\xD5\u0131\u028A\u049D\u057B\u05D0\u0675\u06DE\u07A2\u07D6\u080F\u0A4A\u0A91\u0DA1\u0E6D\u0F09\u0F26\u10CA\u1228\u12E1\u1415\u149D\u14C3\u14DF\u1525\0\0\0\0\0\0\u156B\u16CD\u198D\u1C12\u1DDD\u1F7E\u2060\u21B0\u228D\u23C0\u23FB\u2442\u2824\u2912\u2D08\u2E48\u2FCE\u3016\u32BA\u3639\u37AC\u38FE\u3A28\u3A71\u3AE0\u3B2E\u0800EMabcfglmnoprstu\\bfms\x7F\x84\x8B\x90\x95\x98\xA6\xB3\xB9\xC8\xCFlig\u803B\xC6\u40C6P\u803B&\u4026cute\u803B\xC1\u40C1reve;\u4102\u0100iyx}rc\u803B\xC2\u40C2;\u4410r;\uC000\u{1D504}rave\u803B\xC0\u40C0pha;\u4391acr;\u4100d;\u6A53\u0100gp\x9D\xA1on;\u4104f;\uC000\u{1D538}plyFunction;\u6061ing\u803B\xC5\u40C5\u0100cs\xBE\xC3r;\uC000\u{1D49C}ign;\u6254ilde\u803B\xC3\u40C3ml\u803B\xC4\u40C4\u0400aceforsu\xE5\xFB\xFE\u0117\u011C\u0122\u0127\u012A\u0100cr\xEA\xF2kslash;\u6216\u0176\xF6\xF8;\u6AE7ed;\u6306y;\u4411\u0180crt\u0105\u010B\u0114ause;\u6235noullis;\u612Ca;\u4392r;\uC000\u{1D505}pf;\uC000\u{1D539}eve;\u42D8c\xF2\u0113mpeq;\u624E\u0700HOacdefhilorsu\u014D\u0151\u0156\u0180\u019E\u01A2\u01B5\u01B7\u01BA\u01DC\u0215\u0273\u0278\u027Ecy;\u4427PY\u803B\xA9\u40A9\u0180cpy\u015D\u0162\u017Aute;\u4106\u0100;i\u0167\u0168\u62D2talDifferentialD;\u6145leys;\u612D\u0200aeio\u0189\u018E\u0194\u0198ron;\u410Cdil\u803B\xC7\u40C7rc;\u4108nint;\u6230ot;\u410A\u0100dn\u01A7\u01ADilla;\u40B8terDot;\u40B7\xF2\u017Fi;\u43A7rcle\u0200DMPT\u01C7\u01CB\u01D1\u01D6ot;\u6299inus;\u6296lus;\u6295imes;\u6297o\u0100cs\u01E2\u01F8kwiseContourIntegral;\u6232eCurly\u0100DQ\u0203\u020FoubleQuote;\u601Duote;\u6019\u0200lnpu\u021E\u0228\u0247\u0255on\u0100;e\u0225\u0226\u6237;\u6A74\u0180git\u022F\u0236\u023Aruent;\u6261nt;\u622FourIntegral;\u622E\u0100fr\u024C\u024E;\u6102oduct;\u6210nterClockwiseContourIntegral;\u6233oss;\u6A2Fcr;\uC000\u{1D49E}p\u0100;C\u0284\u0285\u62D3ap;\u624D\u0580DJSZacefios\u02A0\u02AC\u02B0\u02B4\u02B8\u02CB\u02D7\u02E1\u02E6\u0333\u048D\u0100;o\u0179\u02A5trahd;\u6911cy;\u4402cy;\u4405cy;\u440F\u0180grs\u02BF\u02C4\u02C7ger;\u6021r;\u61A1hv;\u6AE4\u0100ay\u02D0\u02D5ron;\u410E;\u4414l\u0100;t\u02DD\u02DE\u6207a;\u4394r;\uC000\u{1D507}\u0100af\u02EB\u0327\u0100cm\u02F0\u0322ritical\u0200ADGT\u0300\u0306\u0316\u031Ccute;\u40B4o\u0174\u030B\u030D;\u42D9bleAcute;\u42DDrave;\u4060ilde;\u42DCond;\u62C4ferentialD;\u6146\u0470\u033D\0\0\0\u0342\u0354\0\u0405f;\uC000\u{1D53B}\u0180;DE\u0348\u0349\u034D\u40A8ot;\u60DCqual;\u6250ble\u0300CDLRUV\u0363\u0372\u0382\u03CF\u03E2\u03F8ontourIntegra\xEC\u0239o\u0274\u0379\0\0\u037B\xBB\u0349nArrow;\u61D3\u0100eo\u0387\u03A4ft\u0180ART\u0390\u0396\u03A1rrow;\u61D0ightArrow;\u61D4e\xE5\u02CAng\u0100LR\u03AB\u03C4eft\u0100AR\u03B3\u03B9rrow;\u67F8ightArrow;\u67FAightArrow;\u67F9ight\u0100AT\u03D8\u03DErrow;\u61D2ee;\u62A8p\u0241\u03E9\0\0\u03EFrrow;\u61D1ownArrow;\u61D5erticalBar;\u6225n\u0300ABLRTa\u0412\u042A\u0430\u045E\u047F\u037Crrow\u0180;BU\u041D\u041E\u0422\u6193ar;\u6913pArrow;\u61F5reve;\u4311eft\u02D2\u043A\0\u0446\0\u0450ightVector;\u6950eeVector;\u695Eector\u0100;B\u0459\u045A\u61BDar;\u6956ight\u01D4\u0467\0\u0471eeVector;\u695Fector\u0100;B\u047A\u047B\u61C1ar;\u6957ee\u0100;A\u0486\u0487\u62A4rrow;\u61A7\u0100ct\u0492\u0497r;\uC000\u{1D49F}rok;\u4110\u0800NTacdfglmopqstux\u04BD\u04C0\u04C4\u04CB\u04DE\u04E2\u04E7\u04EE\u04F5\u0521\u052F\u0536\u0552\u055D\u0560\u0565G;\u414AH\u803B\xD0\u40D0cute\u803B\xC9\u40C9\u0180aiy\u04D2\u04D7\u04DCron;\u411Arc\u803B\xCA\u40CA;\u442Dot;\u4116r;\uC000\u{1D508}rave\u803B\xC8\u40C8ement;\u6208\u0100ap\u04FA\u04FEcr;\u4112ty\u0253\u0506\0\0\u0512mallSquare;\u65FBerySmallSquare;\u65AB\u0100gp\u0526\u052Aon;\u4118f;\uC000\u{1D53C}silon;\u4395u\u0100ai\u053C\u0549l\u0100;T\u0542\u0543\u6A75ilde;\u6242librium;\u61CC\u0100ci\u0557\u055Ar;\u6130m;\u6A73a;\u4397ml\u803B\xCB\u40CB\u0100ip\u056A\u056Fsts;\u6203onentialE;\u6147\u0280cfios\u0585\u0588\u058D\u05B2\u05CCy;\u4424r;\uC000\u{1D509}lled\u0253\u0597\0\0\u05A3mallSquare;\u65FCerySmallSquare;\u65AA\u0370\u05BA\0\u05BF\0\0\u05C4f;\uC000\u{1D53D}All;\u6200riertrf;\u6131c\xF2\u05CB\u0600JTabcdfgorst\u05E8\u05EC\u05EF\u05FA\u0600\u0612\u0616\u061B\u061D\u0623\u066C\u0672cy;\u4403\u803B>\u403Emma\u0100;d\u05F7\u05F8\u4393;\u43DCreve;\u411E\u0180eiy\u0607\u060C\u0610dil;\u4122rc;\u411C;\u4413ot;\u4120r;\uC000\u{1D50A};\u62D9pf;\uC000\u{1D53E}eater\u0300EFGLST\u0635\u0644\u064E\u0656\u065B\u0666qual\u0100;L\u063E\u063F\u6265ess;\u62DBullEqual;\u6267reater;\u6AA2ess;\u6277lantEqual;\u6A7Eilde;\u6273cr;\uC000\u{1D4A2};\u626B\u0400Aacfiosu\u0685\u068B\u0696\u069B\u069E\u06AA\u06BE\u06CARDcy;\u442A\u0100ct\u0690\u0694ek;\u42C7;\u405Eirc;\u4124r;\u610ClbertSpace;\u610B\u01F0\u06AF\0\u06B2f;\u610DizontalLine;\u6500\u0100ct\u06C3\u06C5\xF2\u06A9rok;\u4126mp\u0144\u06D0\u06D8ownHum\xF0\u012Fqual;\u624F\u0700EJOacdfgmnostu\u06FA\u06FE\u0703\u0707\u070E\u071A\u071E\u0721\u0728\u0744\u0778\u078B\u078F\u0795cy;\u4415lig;\u4132cy;\u4401cute\u803B\xCD\u40CD\u0100iy\u0713\u0718rc\u803B\xCE\u40CE;\u4418ot;\u4130r;\u6111rave\u803B\xCC\u40CC\u0180;ap\u0720\u072F\u073F\u0100cg\u0734\u0737r;\u412AinaryI;\u6148lie\xF3\u03DD\u01F4\u0749\0\u0762\u0100;e\u074D\u074E\u622C\u0100gr\u0753\u0758ral;\u622Bsection;\u62C2isible\u0100CT\u076C\u0772omma;\u6063imes;\u6062\u0180gpt\u077F\u0783\u0788on;\u412Ef;\uC000\u{1D540}a;\u4399cr;\u6110ilde;\u4128\u01EB\u079A\0\u079Ecy;\u4406l\u803B\xCF\u40CF\u0280cfosu\u07AC\u07B7\u07BC\u07C2\u07D0\u0100iy\u07B1\u07B5rc;\u4134;\u4419r;\uC000\u{1D50D}pf;\uC000\u{1D541}\u01E3\u07C7\0\u07CCr;\uC000\u{1D4A5}rcy;\u4408kcy;\u4404\u0380HJacfos\u07E4\u07E8\u07EC\u07F1\u07FD\u0802\u0808cy;\u4425cy;\u440Cppa;\u439A\u0100ey\u07F6\u07FBdil;\u4136;\u441Ar;\uC000\u{1D50E}pf;\uC000\u{1D542}cr;\uC000\u{1D4A6}\u0580JTaceflmost\u0825\u0829\u082C\u0850\u0863\u09B3\u09B8\u09C7\u09CD\u0A37\u0A47cy;\u4409\u803B<\u403C\u0280cmnpr\u0837\u083C\u0841\u0844\u084Dute;\u4139bda;\u439Bg;\u67EAlacetrf;\u6112r;\u619E\u0180aey\u0857\u085C\u0861ron;\u413Ddil;\u413B;\u441B\u0100fs\u0868\u0970t\u0500ACDFRTUVar\u087E\u08A9\u08B1\u08E0\u08E6\u08FC\u092F\u095B\u0390\u096A\u0100nr\u0883\u088FgleBracket;\u67E8row\u0180;BR\u0899\u089A\u089E\u6190ar;\u61E4ightArrow;\u61C6eiling;\u6308o\u01F5\u08B7\0\u08C3bleBracket;\u67E6n\u01D4\u08C8\0\u08D2eeVector;\u6961ector\u0100;B\u08DB\u08DC\u61C3ar;\u6959loor;\u630Aight\u0100AV\u08EF\u08F5rrow;\u6194ector;\u694E\u0100er\u0901\u0917e\u0180;AV\u0909\u090A\u0910\u62A3rrow;\u61A4ector;\u695Aiangle\u0180;BE\u0924\u0925\u0929\u62B2ar;\u69CFqual;\u62B4p\u0180DTV\u0937\u0942\u094CownVector;\u6951eeVector;\u6960ector\u0100;B\u0956\u0957\u61BFar;\u6958ector\u0100;B\u0965\u0966\u61BCar;\u6952ight\xE1\u039Cs\u0300EFGLST\u097E\u098B\u0995\u099D\u09A2\u09ADqualGreater;\u62DAullEqual;\u6266reater;\u6276ess;\u6AA1lantEqual;\u6A7Dilde;\u6272r;\uC000\u{1D50F}\u0100;e\u09BD\u09BE\u62D8ftarrow;\u61DAidot;\u413F\u0180npw\u09D4\u0A16\u0A1Bg\u0200LRlr\u09DE\u09F7\u0A02\u0A10eft\u0100AR\u09E6\u09ECrrow;\u67F5ightArrow;\u67F7ightArrow;\u67F6eft\u0100ar\u03B3\u0A0Aight\xE1\u03BFight\xE1\u03CAf;\uC000\u{1D543}er\u0100LR\u0A22\u0A2CeftArrow;\u6199ightArrow;\u6198\u0180cht\u0A3E\u0A40\u0A42\xF2\u084C;\u61B0rok;\u4141;\u626A\u0400acefiosu\u0A5A\u0A5D\u0A60\u0A77\u0A7C\u0A85\u0A8B\u0A8Ep;\u6905y;\u441C\u0100dl\u0A65\u0A6FiumSpace;\u605Flintrf;\u6133r;\uC000\u{1D510}nusPlus;\u6213pf;\uC000\u{1D544}c\xF2\u0A76;\u439C\u0480Jacefostu\u0AA3\u0AA7\u0AAD\u0AC0\u0B14\u0B19\u0D91\u0D97\u0D9Ecy;\u440Acute;\u4143\u0180aey\u0AB4\u0AB9\u0ABEron;\u4147dil;\u4145;\u441D\u0180gsw\u0AC7\u0AF0\u0B0Eative\u0180MTV\u0AD3\u0ADF\u0AE8ediumSpace;\u600Bhi\u0100cn\u0AE6\u0AD8\xEB\u0AD9eryThi\xEE\u0AD9ted\u0100GL\u0AF8\u0B06reaterGreate\xF2\u0673essLes\xF3\u0A48Line;\u400Ar;\uC000\u{1D511}\u0200Bnpt\u0B22\u0B28\u0B37\u0B3Areak;\u6060BreakingSpace;\u40A0f;\u6115\u0680;CDEGHLNPRSTV\u0B55\u0B56\u0B6A\u0B7C\u0BA1\u0BEB\u0C04\u0C5E\u0C84\u0CA6\u0CD8\u0D61\u0D85\u6AEC\u0100ou\u0B5B\u0B64ngruent;\u6262pCap;\u626DoubleVerticalBar;\u6226\u0180lqx\u0B83\u0B8A\u0B9Bement;\u6209ual\u0100;T\u0B92\u0B93\u6260ilde;\uC000\u2242\u0338ists;\u6204reater\u0380;EFGLST\u0BB6\u0BB7\u0BBD\u0BC9\u0BD3\u0BD8\u0BE5\u626Fqual;\u6271ullEqual;\uC000\u2267\u0338reater;\uC000\u226B\u0338ess;\u6279lantEqual;\uC000\u2A7E\u0338ilde;\u6275ump\u0144\u0BF2\u0BFDownHump;\uC000\u224E\u0338qual;\uC000\u224F\u0338e\u0100fs\u0C0A\u0C27tTriangle\u0180;BE\u0C1A\u0C1B\u0C21\u62EAar;\uC000\u29CF\u0338qual;\u62ECs\u0300;EGLST\u0C35\u0C36\u0C3C\u0C44\u0C4B\u0C58\u626Equal;\u6270reater;\u6278ess;\uC000\u226A\u0338lantEqual;\uC000\u2A7D\u0338ilde;\u6274ested\u0100GL\u0C68\u0C79reaterGreater;\uC000\u2AA2\u0338essLess;\uC000\u2AA1\u0338recedes\u0180;ES\u0C92\u0C93\u0C9B\u6280qual;\uC000\u2AAF\u0338lantEqual;\u62E0\u0100ei\u0CAB\u0CB9verseElement;\u620CghtTriangle\u0180;BE\u0CCB\u0CCC\u0CD2\u62EBar;\uC000\u29D0\u0338qual;\u62ED\u0100qu\u0CDD\u0D0CuareSu\u0100bp\u0CE8\u0CF9set\u0100;E\u0CF0\u0CF3\uC000\u228F\u0338qual;\u62E2erset\u0100;E\u0D03\u0D06\uC000\u2290\u0338qual;\u62E3\u0180bcp\u0D13\u0D24\u0D4Eset\u0100;E\u0D1B\u0D1E\uC000\u2282\u20D2qual;\u6288ceeds\u0200;EST\u0D32\u0D33\u0D3B\u0D46\u6281qual;\uC000\u2AB0\u0338lantEqual;\u62E1ilde;\uC000\u227F\u0338erset\u0100;E\u0D58\u0D5B\uC000\u2283\u20D2qual;\u6289ilde\u0200;EFT\u0D6E\u0D6F\u0D75\u0D7F\u6241qual;\u6244ullEqual;\u6247ilde;\u6249erticalBar;\u6224cr;\uC000\u{1D4A9}ilde\u803B\xD1\u40D1;\u439D\u0700Eacdfgmoprstuv\u0DBD\u0DC2\u0DC9\u0DD5\u0DDB\u0DE0\u0DE7\u0DFC\u0E02\u0E20\u0E22\u0E32\u0E3F\u0E44lig;\u4152cute\u803B\xD3\u40D3\u0100iy\u0DCE\u0DD3rc\u803B\xD4\u40D4;\u441Eblac;\u4150r;\uC000\u{1D512}rave\u803B\xD2\u40D2\u0180aei\u0DEE\u0DF2\u0DF6cr;\u414Cga;\u43A9cron;\u439Fpf;\uC000\u{1D546}enCurly\u0100DQ\u0E0E\u0E1AoubleQuote;\u601Cuote;\u6018;\u6A54\u0100cl\u0E27\u0E2Cr;\uC000\u{1D4AA}ash\u803B\xD8\u40D8i\u016C\u0E37\u0E3Cde\u803B\xD5\u40D5es;\u6A37ml\u803B\xD6\u40D6er\u0100BP\u0E4B\u0E60\u0100ar\u0E50\u0E53r;\u603Eac\u0100ek\u0E5A\u0E5C;\u63DEet;\u63B4arenthesis;\u63DC\u0480acfhilors\u0E7F\u0E87\u0E8A\u0E8F\u0E92\u0E94\u0E9D\u0EB0\u0EFCrtialD;\u6202y;\u441Fr;\uC000\u{1D513}i;\u43A6;\u43A0usMinus;\u40B1\u0100ip\u0EA2\u0EADncareplan\xE5\u069Df;\u6119\u0200;eio\u0EB9\u0EBA\u0EE0\u0EE4\u6ABBcedes\u0200;EST\u0EC8\u0EC9\u0ECF\u0EDA\u627Aqual;\u6AAFlantEqual;\u627Cilde;\u627Eme;\u6033\u0100dp\u0EE9\u0EEEuct;\u620Fortion\u0100;a\u0225\u0EF9l;\u621D\u0100ci\u0F01\u0F06r;\uC000\u{1D4AB};\u43A8\u0200Ufos\u0F11\u0F16\u0F1B\u0F1FOT\u803B"\u4022r;\uC000\u{1D514}pf;\u611Acr;\uC000\u{1D4AC}\u0600BEacefhiorsu\u0F3E\u0F43\u0F47\u0F60\u0F73\u0FA7\u0FAA\u0FAD\u1096\u10A9\u10B4\u10BEarr;\u6910G\u803B\xAE\u40AE\u0180cnr\u0F4E\u0F53\u0F56ute;\u4154g;\u67EBr\u0100;t\u0F5C\u0F5D\u61A0l;\u6916\u0180aey\u0F67\u0F6C\u0F71ron;\u4158dil;\u4156;\u4420\u0100;v\u0F78\u0F79\u611Cerse\u0100EU\u0F82\u0F99\u0100lq\u0F87\u0F8Eement;\u620Builibrium;\u61CBpEquilibrium;\u696Fr\xBB\u0F79o;\u43A1ght\u0400ACDFTUVa\u0FC1\u0FEB\u0FF3\u1022\u1028\u105B\u1087\u03D8\u0100nr\u0FC6\u0FD2gleBracket;\u67E9row\u0180;BL\u0FDC\u0FDD\u0FE1\u6192ar;\u61E5eftArrow;\u61C4eiling;\u6309o\u01F5\u0FF9\0\u1005bleBracket;\u67E7n\u01D4\u100A\0\u1014eeVector;\u695Dector\u0100;B\u101D\u101E\u61C2ar;\u6955loor;\u630B\u0100er\u102D\u1043e\u0180;AV\u1035\u1036\u103C\u62A2rrow;\u61A6ector;\u695Biangle\u0180;BE\u1050\u1051\u1055\u62B3ar;\u69D0qual;\u62B5p\u0180DTV\u1063\u106E\u1078ownVector;\u694FeeVector;\u695Cector\u0100;B\u1082\u1083\u61BEar;\u6954ector\u0100;B\u1091\u1092\u61C0ar;\u6953\u0100pu\u109B\u109Ef;\u611DndImplies;\u6970ightarrow;\u61DB\u0100ch\u10B9\u10BCr;\u611B;\u61B1leDelayed;\u69F4\u0680HOacfhimoqstu\u10E4\u10F1\u10F7\u10FD\u1119\u111E\u1151\u1156\u1161\u1167\u11B5\u11BB\u11BF\u0100Cc\u10E9\u10EEHcy;\u4429y;\u4428FTcy;\u442Ccute;\u415A\u0280;aeiy\u1108\u1109\u110E\u1113\u1117\u6ABCron;\u4160dil;\u415Erc;\u415C;\u4421r;\uC000\u{1D516}ort\u0200DLRU\u112A\u1134\u113E\u1149ownArrow\xBB\u041EeftArrow\xBB\u089AightArrow\xBB\u0FDDpArrow;\u6191gma;\u43A3allCircle;\u6218pf;\uC000\u{1D54A}\u0272\u116D\0\0\u1170t;\u621Aare\u0200;ISU\u117B\u117C\u1189\u11AF\u65A1ntersection;\u6293u\u0100bp\u118F\u119Eset\u0100;E\u1197\u1198\u628Fqual;\u6291erset\u0100;E\u11A8\u11A9\u6290qual;\u6292nion;\u6294cr;\uC000\u{1D4AE}ar;\u62C6\u0200bcmp\u11C8\u11DB\u1209\u120B\u0100;s\u11CD\u11CE\u62D0et\u0100;E\u11CD\u11D5qual;\u6286\u0100ch\u11E0\u1205eeds\u0200;EST\u11ED\u11EE\u11F4\u11FF\u627Bqual;\u6AB0lantEqual;\u627Dilde;\u627FTh\xE1\u0F8C;\u6211\u0180;es\u1212\u1213\u1223\u62D1rset\u0100;E\u121C\u121D\u6283qual;\u6287et\xBB\u1213\u0580HRSacfhiors\u123E\u1244\u1249\u1255\u125E\u1271\u1276\u129F\u12C2\u12C8\u12D1ORN\u803B\xDE\u40DEADE;\u6122\u0100Hc\u124E\u1252cy;\u440By;\u4426\u0100bu\u125A\u125C;\u4009;\u43A4\u0180aey\u1265\u126A\u126Fron;\u4164dil;\u4162;\u4422r;\uC000\u{1D517}\u0100ei\u127B\u1289\u01F2\u1280\0\u1287efore;\u6234a;\u4398\u0100cn\u128E\u1298kSpace;\uC000\u205F\u200ASpace;\u6009lde\u0200;EFT\u12AB\u12AC\u12B2\u12BC\u623Cqual;\u6243ullEqual;\u6245ilde;\u6248pf;\uC000\u{1D54B}ipleDot;\u60DB\u0100ct\u12D6\u12DBr;\uC000\u{1D4AF}rok;\u4166\u0AE1\u12F7\u130E\u131A\u1326\0\u132C\u1331\0\0\0\0\0\u1338\u133D\u1377\u1385\0\u13FF\u1404\u140A\u1410\u0100cr\u12FB\u1301ute\u803B\xDA\u40DAr\u0100;o\u1307\u1308\u619Fcir;\u6949r\u01E3\u1313\0\u1316y;\u440Eve;\u416C\u0100iy\u131E\u1323rc\u803B\xDB\u40DB;\u4423blac;\u4170r;\uC000\u{1D518}rave\u803B\xD9\u40D9acr;\u416A\u0100di\u1341\u1369er\u0100BP\u1348\u135D\u0100ar\u134D\u1350r;\u405Fac\u0100ek\u1357\u1359;\u63DFet;\u63B5arenthesis;\u63DDon\u0100;P\u1370\u1371\u62C3lus;\u628E\u0100gp\u137B\u137Fon;\u4172f;\uC000\u{1D54C}\u0400ADETadps\u1395\u13AE\u13B8\u13C4\u03E8\u13D2\u13D7\u13F3rrow\u0180;BD\u1150\u13A0\u13A4ar;\u6912ownArrow;\u61C5ownArrow;\u6195quilibrium;\u696Eee\u0100;A\u13CB\u13CC\u62A5rrow;\u61A5own\xE1\u03F3er\u0100LR\u13DE\u13E8eftArrow;\u6196ightArrow;\u6197i\u0100;l\u13F9\u13FA\u43D2on;\u43A5ing;\u416Ecr;\uC000\u{1D4B0}ilde;\u4168ml\u803B\xDC\u40DC\u0480Dbcdefosv\u1427\u142C\u1430\u1433\u143E\u1485\u148A\u1490\u1496ash;\u62ABar;\u6AEBy;\u4412ash\u0100;l\u143B\u143C\u62A9;\u6AE6\u0100er\u1443\u1445;\u62C1\u0180bty\u144C\u1450\u147Aar;\u6016\u0100;i\u144F\u1455cal\u0200BLST\u1461\u1465\u146A\u1474ar;\u6223ine;\u407Ceparator;\u6758ilde;\u6240ThinSpace;\u600Ar;\uC000\u{1D519}pf;\uC000\u{1D54D}cr;\uC000\u{1D4B1}dash;\u62AA\u0280cefos\u14A7\u14AC\u14B1\u14B6\u14BCirc;\u4174dge;\u62C0r;\uC000\u{1D51A}pf;\uC000\u{1D54E}cr;\uC000\u{1D4B2}\u0200fios\u14CB\u14D0\u14D2\u14D8r;\uC000\u{1D51B};\u439Epf;\uC000\u{1D54F}cr;\uC000\u{1D4B3}\u0480AIUacfosu\u14F1\u14F5\u14F9\u14FD\u1504\u150F\u1514\u151A\u1520cy;\u442Fcy;\u4407cy;\u442Ecute\u803B\xDD\u40DD\u0100iy\u1509\u150Drc;\u4176;\u442Br;\uC000\u{1D51C}pf;\uC000\u{1D550}cr;\uC000\u{1D4B4}ml;\u4178\u0400Hacdefos\u1535\u1539\u153F\u154B\u154F\u155D\u1560\u1564cy;\u4416cute;\u4179\u0100ay\u1544\u1549ron;\u417D;\u4417ot;\u417B\u01F2\u1554\0\u155BoWidt\xE8\u0AD9a;\u4396r;\u6128pf;\u6124cr;\uC000\u{1D4B5}\u0BE1\u1583\u158A\u1590\0\u15B0\u15B6\u15BF\0\0\0\0\u15C6\u15DB\u15EB\u165F\u166D\0\u1695\u169B\u16B2\u16B9\0\u16BEcute\u803B\xE1\u40E1reve;\u4103\u0300;Ediuy\u159C\u159D\u15A1\u15A3\u15A8\u15AD\u623E;\uC000\u223E\u0333;\u623Frc\u803B\xE2\u40E2te\u80BB\xB4\u0306;\u4430lig\u803B\xE6\u40E6\u0100;r\xB2\u15BA;\uC000\u{1D51E}rave\u803B\xE0\u40E0\u0100ep\u15CA\u15D6\u0100fp\u15CF\u15D4sym;\u6135\xE8\u15D3ha;\u43B1\u0100ap\u15DFc\u0100cl\u15E4\u15E7r;\u4101g;\u6A3F\u0264\u15F0\0\0\u160A\u0280;adsv\u15FA\u15FB\u15FF\u1601\u1607\u6227nd;\u6A55;\u6A5Clope;\u6A58;\u6A5A\u0380;elmrsz\u1618\u1619\u161B\u161E\u163F\u164F\u1659\u6220;\u69A4e\xBB\u1619sd\u0100;a\u1625\u1626\u6221\u0461\u1630\u1632\u1634\u1636\u1638\u163A\u163C\u163E;\u69A8;\u69A9;\u69AA;\u69AB;\u69AC;\u69AD;\u69AE;\u69AFt\u0100;v\u1645\u1646\u621Fb\u0100;d\u164C\u164D\u62BE;\u699D\u0100pt\u1654\u1657h;\u6222\xBB\xB9arr;\u637C\u0100gp\u1663\u1667on;\u4105f;\uC000\u{1D552}\u0380;Eaeiop\u12C1\u167B\u167D\u1682\u1684\u1687\u168A;\u6A70cir;\u6A6F;\u624Ad;\u624Bs;\u4027rox\u0100;e\u12C1\u1692\xF1\u1683ing\u803B\xE5\u40E5\u0180cty\u16A1\u16A6\u16A8r;\uC000\u{1D4B6};\u402Amp\u0100;e\u12C1\u16AF\xF1\u0288ilde\u803B\xE3\u40E3ml\u803B\xE4\u40E4\u0100ci\u16C2\u16C8onin\xF4\u0272nt;\u6A11\u0800Nabcdefiklnoprsu\u16ED\u16F1\u1730\u173C\u1743\u1748\u1778\u177D\u17E0\u17E6\u1839\u1850\u170D\u193D\u1948\u1970ot;\u6AED\u0100cr\u16F6\u171Ek\u0200ceps\u1700\u1705\u170D\u1713ong;\u624Cpsilon;\u43F6rime;\u6035im\u0100;e\u171A\u171B\u623Dq;\u62CD\u0176\u1722\u1726ee;\u62BDed\u0100;g\u172C\u172D\u6305e\xBB\u172Drk\u0100;t\u135C\u1737brk;\u63B6\u0100oy\u1701\u1741;\u4431quo;\u601E\u0280cmprt\u1753\u175B\u1761\u1764\u1768aus\u0100;e\u010A\u0109ptyv;\u69B0s\xE9\u170Cno\xF5\u0113\u0180ahw\u176F\u1771\u1773;\u43B2;\u6136een;\u626Cr;\uC000\u{1D51F}g\u0380costuvw\u178D\u179D\u17B3\u17C1\u17D5\u17DB\u17DE\u0180aiu\u1794\u1796\u179A\xF0\u0760rc;\u65EFp\xBB\u1371\u0180dpt\u17A4\u17A8\u17ADot;\u6A00lus;\u6A01imes;\u6A02\u0271\u17B9\0\0\u17BEcup;\u6A06ar;\u6605riangle\u0100du\u17CD\u17D2own;\u65BDp;\u65B3plus;\u6A04e\xE5\u1444\xE5\u14ADarow;\u690D\u0180ako\u17ED\u1826\u1835\u0100cn\u17F2\u1823k\u0180lst\u17FA\u05AB\u1802ozenge;\u69EBriangle\u0200;dlr\u1812\u1813\u1818\u181D\u65B4own;\u65BEeft;\u65C2ight;\u65B8k;\u6423\u01B1\u182B\0\u1833\u01B2\u182F\0\u1831;\u6592;\u65914;\u6593ck;\u6588\u0100eo\u183E\u184D\u0100;q\u1843\u1846\uC000=\u20E5uiv;\uC000\u2261\u20E5t;\u6310\u0200ptwx\u1859\u185E\u1867\u186Cf;\uC000\u{1D553}\u0100;t\u13CB\u1863om\xBB\u13CCtie;\u62C8\u0600DHUVbdhmptuv\u1885\u1896\u18AA\u18BB\u18D7\u18DB\u18EC\u18FF\u1905\u190A\u1910\u1921\u0200LRlr\u188E\u1890\u1892\u1894;\u6557;\u6554;\u6556;\u6553\u0280;DUdu\u18A1\u18A2\u18A4\u18A6\u18A8\u6550;\u6566;\u6569;\u6564;\u6567\u0200LRlr\u18B3\u18B5\u18B7\u18B9;\u655D;\u655A;\u655C;\u6559\u0380;HLRhlr\u18CA\u18CB\u18CD\u18CF\u18D1\u18D3\u18D5\u6551;\u656C;\u6563;\u6560;\u656B;\u6562;\u655Fox;\u69C9\u0200LRlr\u18E4\u18E6\u18E8\u18EA;\u6555;\u6552;\u6510;\u650C\u0280;DUdu\u06BD\u18F7\u18F9\u18FB\u18FD;\u6565;\u6568;\u652C;\u6534inus;\u629Flus;\u629Eimes;\u62A0\u0200LRlr\u1919\u191B\u191D\u191F;\u655B;\u6558;\u6518;\u6514\u0380;HLRhlr\u1930\u1931\u1933\u1935\u1937\u1939\u193B\u6502;\u656A;\u6561;\u655E;\u653C;\u6524;\u651C\u0100ev\u0123\u1942bar\u803B\xA6\u40A6\u0200ceio\u1951\u1956\u195A\u1960r;\uC000\u{1D4B7}mi;\u604Fm\u0100;e\u171A\u171Cl\u0180;bh\u1968\u1969\u196B\u405C;\u69C5sub;\u67C8\u016C\u1974\u197El\u0100;e\u1979\u197A\u6022t\xBB\u197Ap\u0180;Ee\u012F\u1985\u1987;\u6AAE\u0100;q\u06DC\u06DB\u0CE1\u19A7\0\u19E8\u1A11\u1A15\u1A32\0\u1A37\u1A50\0\0\u1AB4\0\0\u1AC1\0\0\u1B21\u1B2E\u1B4D\u1B52\0\u1BFD\0\u1C0C\u0180cpr\u19AD\u19B2\u19DDute;\u4107\u0300;abcds\u19BF\u19C0\u19C4\u19CA\u19D5\u19D9\u6229nd;\u6A44rcup;\u6A49\u0100au\u19CF\u19D2p;\u6A4Bp;\u6A47ot;\u6A40;\uC000\u2229\uFE00\u0100eo\u19E2\u19E5t;\u6041\xEE\u0693\u0200aeiu\u19F0\u19FB\u1A01\u1A05\u01F0\u19F5\0\u19F8s;\u6A4Don;\u410Ddil\u803B\xE7\u40E7rc;\u4109ps\u0100;s\u1A0C\u1A0D\u6A4Cm;\u6A50ot;\u410B\u0180dmn\u1A1B\u1A20\u1A26il\u80BB\xB8\u01ADptyv;\u69B2t\u8100\xA2;e\u1A2D\u1A2E\u40A2r\xE4\u01B2r;\uC000\u{1D520}\u0180cei\u1A3D\u1A40\u1A4Dy;\u4447ck\u0100;m\u1A47\u1A48\u6713ark\xBB\u1A48;\u43C7r\u0380;Ecefms\u1A5F\u1A60\u1A62\u1A6B\u1AA4\u1AAA\u1AAE\u65CB;\u69C3\u0180;el\u1A69\u1A6A\u1A6D\u42C6q;\u6257e\u0261\u1A74\0\0\u1A88rrow\u0100lr\u1A7C\u1A81eft;\u61BAight;\u61BB\u0280RSacd\u1A92\u1A94\u1A96\u1A9A\u1A9F\xBB\u0F47;\u64C8st;\u629Birc;\u629Aash;\u629Dnint;\u6A10id;\u6AEFcir;\u69C2ubs\u0100;u\u1ABB\u1ABC\u6663it\xBB\u1ABC\u02EC\u1AC7\u1AD4\u1AFA\0\u1B0Aon\u0100;e\u1ACD\u1ACE\u403A\u0100;q\xC7\xC6\u026D\u1AD9\0\0\u1AE2a\u0100;t\u1ADE\u1ADF\u402C;\u4040\u0180;fl\u1AE8\u1AE9\u1AEB\u6201\xEE\u1160e\u0100mx\u1AF1\u1AF6ent\xBB\u1AE9e\xF3\u024D\u01E7\u1AFE\0\u1B07\u0100;d\u12BB\u1B02ot;\u6A6Dn\xF4\u0246\u0180fry\u1B10\u1B14\u1B17;\uC000\u{1D554}o\xE4\u0254\u8100\xA9;s\u0155\u1B1Dr;\u6117\u0100ao\u1B25\u1B29rr;\u61B5ss;\u6717\u0100cu\u1B32\u1B37r;\uC000\u{1D4B8}\u0100bp\u1B3C\u1B44\u0100;e\u1B41\u1B42\u6ACF;\u6AD1\u0100;e\u1B49\u1B4A\u6AD0;\u6AD2dot;\u62EF\u0380delprvw\u1B60\u1B6C\u1B77\u1B82\u1BAC\u1BD4\u1BF9arr\u0100lr\u1B68\u1B6A;\u6938;\u6935\u0270\u1B72\0\0\u1B75r;\u62DEc;\u62DFarr\u0100;p\u1B7F\u1B80\u61B6;\u693D\u0300;bcdos\u1B8F\u1B90\u1B96\u1BA1\u1BA5\u1BA8\u622Arcap;\u6A48\u0100au\u1B9B\u1B9Ep;\u6A46p;\u6A4Aot;\u628Dr;\u6A45;\uC000\u222A\uFE00\u0200alrv\u1BB5\u1BBF\u1BDE\u1BE3rr\u0100;m\u1BBC\u1BBD\u61B7;\u693Cy\u0180evw\u1BC7\u1BD4\u1BD8q\u0270\u1BCE\0\0\u1BD2re\xE3\u1B73u\xE3\u1B75ee;\u62CEedge;\u62CFen\u803B\xA4\u40A4earrow\u0100lr\u1BEE\u1BF3eft\xBB\u1B80ight\xBB\u1BBDe\xE4\u1BDD\u0100ci\u1C01\u1C07onin\xF4\u01F7nt;\u6231lcty;\u632D\u0980AHabcdefhijlorstuwz\u1C38\u1C3B\u1C3F\u1C5D\u1C69\u1C75\u1C8A\u1C9E\u1CAC\u1CB7\u1CFB\u1CFF\u1D0D\u1D7B\u1D91\u1DAB\u1DBB\u1DC6\u1DCDr\xF2\u0381ar;\u6965\u0200glrs\u1C48\u1C4D\u1C52\u1C54ger;\u6020eth;\u6138\xF2\u1133h\u0100;v\u1C5A\u1C5B\u6010\xBB\u090A\u016B\u1C61\u1C67arow;\u690Fa\xE3\u0315\u0100ay\u1C6E\u1C73ron;\u410F;\u4434\u0180;ao\u0332\u1C7C\u1C84\u0100gr\u02BF\u1C81r;\u61CAtseq;\u6A77\u0180glm\u1C91\u1C94\u1C98\u803B\xB0\u40B0ta;\u43B4ptyv;\u69B1\u0100ir\u1CA3\u1CA8sht;\u697F;\uC000\u{1D521}ar\u0100lr\u1CB3\u1CB5\xBB\u08DC\xBB\u101E\u0280aegsv\u1CC2\u0378\u1CD6\u1CDC\u1CE0m\u0180;os\u0326\u1CCA\u1CD4nd\u0100;s\u0326\u1CD1uit;\u6666amma;\u43DDin;\u62F2\u0180;io\u1CE7\u1CE8\u1CF8\u40F7de\u8100\xF7;o\u1CE7\u1CF0ntimes;\u62C7n\xF8\u1CF7cy;\u4452c\u026F\u1D06\0\0\u1D0Arn;\u631Eop;\u630D\u0280lptuw\u1D18\u1D1D\u1D22\u1D49\u1D55lar;\u4024f;\uC000\u{1D555}\u0280;emps\u030B\u1D2D\u1D37\u1D3D\u1D42q\u0100;d\u0352\u1D33ot;\u6251inus;\u6238lus;\u6214quare;\u62A1blebarwedg\xE5\xFAn\u0180adh\u112E\u1D5D\u1D67ownarrow\xF3\u1C83arpoon\u0100lr\u1D72\u1D76ef\xF4\u1CB4igh\xF4\u1CB6\u0162\u1D7F\u1D85karo\xF7\u0F42\u026F\u1D8A\0\0\u1D8Ern;\u631Fop;\u630C\u0180cot\u1D98\u1DA3\u1DA6\u0100ry\u1D9D\u1DA1;\uC000\u{1D4B9};\u4455l;\u69F6rok;\u4111\u0100dr\u1DB0\u1DB4ot;\u62F1i\u0100;f\u1DBA\u1816\u65BF\u0100ah\u1DC0\u1DC3r\xF2\u0429a\xF2\u0FA6angle;\u69A6\u0100ci\u1DD2\u1DD5y;\u445Fgrarr;\u67FF\u0900Dacdefglmnopqrstux\u1E01\u1E09\u1E19\u1E38\u0578\u1E3C\u1E49\u1E61\u1E7E\u1EA5\u1EAF\u1EBD\u1EE1\u1F2A\u1F37\u1F44\u1F4E\u1F5A\u0100Do\u1E06\u1D34o\xF4\u1C89\u0100cs\u1E0E\u1E14ute\u803B\xE9\u40E9ter;\u6A6E\u0200aioy\u1E22\u1E27\u1E31\u1E36ron;\u411Br\u0100;c\u1E2D\u1E2E\u6256\u803B\xEA\u40EAlon;\u6255;\u444Dot;\u4117\u0100Dr\u1E41\u1E45ot;\u6252;\uC000\u{1D522}\u0180;rs\u1E50\u1E51\u1E57\u6A9Aave\u803B\xE8\u40E8\u0100;d\u1E5C\u1E5D\u6A96ot;\u6A98\u0200;ils\u1E6A\u1E6B\u1E72\u1E74\u6A99nters;\u63E7;\u6113\u0100;d\u1E79\u1E7A\u6A95ot;\u6A97\u0180aps\u1E85\u1E89\u1E97cr;\u4113ty\u0180;sv\u1E92\u1E93\u1E95\u6205et\xBB\u1E93p\u01001;\u1E9D\u1EA4\u0133\u1EA1\u1EA3;\u6004;\u6005\u6003\u0100gs\u1EAA\u1EAC;\u414Bp;\u6002\u0100gp\u1EB4\u1EB8on;\u4119f;\uC000\u{1D556}\u0180als\u1EC4\u1ECE\u1ED2r\u0100;s\u1ECA\u1ECB\u62D5l;\u69E3us;\u6A71i\u0180;lv\u1EDA\u1EDB\u1EDF\u43B5on\xBB\u1EDB;\u43F5\u0200csuv\u1EEA\u1EF3\u1F0B\u1F23\u0100io\u1EEF\u1E31rc\xBB\u1E2E\u0269\u1EF9\0\0\u1EFB\xED\u0548ant\u0100gl\u1F02\u1F06tr\xBB\u1E5Dess\xBB\u1E7A\u0180aei\u1F12\u1F16\u1F1Als;\u403Dst;\u625Fv\u0100;D\u0235\u1F20D;\u6A78parsl;\u69E5\u0100Da\u1F2F\u1F33ot;\u6253rr;\u6971\u0180cdi\u1F3E\u1F41\u1EF8r;\u612Fo\xF4\u0352\u0100ah\u1F49\u1F4B;\u43B7\u803B\xF0\u40F0\u0100mr\u1F53\u1F57l\u803B\xEB\u40EBo;\u60AC\u0180cip\u1F61\u1F64\u1F67l;\u4021s\xF4\u056E\u0100eo\u1F6C\u1F74ctatio\xEE\u0559nential\xE5\u0579\u09E1\u1F92\0\u1F9E\0\u1FA1\u1FA7\0\0\u1FC6\u1FCC\0\u1FD3\0\u1FE6\u1FEA\u2000\0\u2008\u205Allingdotse\xF1\u1E44y;\u4444male;\u6640\u0180ilr\u1FAD\u1FB3\u1FC1lig;\u8000\uFB03\u0269\u1FB9\0\0\u1FBDg;\u8000\uFB00ig;\u8000\uFB04;\uC000\u{1D523}lig;\u8000\uFB01lig;\uC000fj\u0180alt\u1FD9\u1FDC\u1FE1t;\u666Dig;\u8000\uFB02ns;\u65B1of;\u4192\u01F0\u1FEE\0\u1FF3f;\uC000\u{1D557}\u0100ak\u05BF\u1FF7\u0100;v\u1FFC\u1FFD\u62D4;\u6AD9artint;\u6A0D\u0100ao\u200C\u2055\u0100cs\u2011\u2052\u03B1\u201A\u2030\u2038\u2045\u2048\0\u2050\u03B2\u2022\u2025\u2027\u202A\u202C\0\u202E\u803B\xBD\u40BD;\u6153\u803B\xBC\u40BC;\u6155;\u6159;\u615B\u01B3\u2034\0\u2036;\u6154;\u6156\u02B4\u203E\u2041\0\0\u2043\u803B\xBE\u40BE;\u6157;\u615C5;\u6158\u01B6\u204C\0\u204E;\u615A;\u615D8;\u615El;\u6044wn;\u6322cr;\uC000\u{1D4BB}\u0880Eabcdefgijlnorstv\u2082\u2089\u209F\u20A5\u20B0\u20B4\u20F0\u20F5\u20FA\u20FF\u2103\u2112\u2138\u0317\u213E\u2152\u219E\u0100;l\u064D\u2087;\u6A8C\u0180cmp\u2090\u2095\u209Dute;\u41F5ma\u0100;d\u209C\u1CDA\u43B3;\u6A86reve;\u411F\u0100iy\u20AA\u20AErc;\u411D;\u4433ot;\u4121\u0200;lqs\u063E\u0642\u20BD\u20C9\u0180;qs\u063E\u064C\u20C4lan\xF4\u0665\u0200;cdl\u0665\u20D2\u20D5\u20E5c;\u6AA9ot\u0100;o\u20DC\u20DD\u6A80\u0100;l\u20E2\u20E3\u6A82;\u6A84\u0100;e\u20EA\u20ED\uC000\u22DB\uFE00s;\u6A94r;\uC000\u{1D524}\u0100;g\u0673\u061Bmel;\u6137cy;\u4453\u0200;Eaj\u065A\u210C\u210E\u2110;\u6A92;\u6AA5;\u6AA4\u0200Eaes\u211B\u211D\u2129\u2134;\u6269p\u0100;p\u2123\u2124\u6A8Arox\xBB\u2124\u0100;q\u212E\u212F\u6A88\u0100;q\u212E\u211Bim;\u62E7pf;\uC000\u{1D558}\u0100ci\u2143\u2146r;\u610Am\u0180;el\u066B\u214E\u2150;\u6A8E;\u6A90\u8300>;cdlqr\u05EE\u2160\u216A\u216E\u2173\u2179\u0100ci\u2165\u2167;\u6AA7r;\u6A7Aot;\u62D7Par;\u6995uest;\u6A7C\u0280adels\u2184\u216A\u2190\u0656\u219B\u01F0\u2189\0\u218Epro\xF8\u209Er;\u6978q\u0100lq\u063F\u2196les\xF3\u2088i\xED\u066B\u0100en\u21A3\u21ADrtneqq;\uC000\u2269\uFE00\xC5\u21AA\u0500Aabcefkosy\u21C4\u21C7\u21F1\u21F5\u21FA\u2218\u221D\u222F\u2268\u227Dr\xF2\u03A0\u0200ilmr\u21D0\u21D4\u21D7\u21DBrs\xF0\u1484f\xBB\u2024il\xF4\u06A9\u0100dr\u21E0\u21E4cy;\u444A\u0180;cw\u08F4\u21EB\u21EFir;\u6948;\u61ADar;\u610Firc;\u4125\u0180alr\u2201\u220E\u2213rts\u0100;u\u2209\u220A\u6665it\xBB\u220Alip;\u6026con;\u62B9r;\uC000\u{1D525}s\u0100ew\u2223\u2229arow;\u6925arow;\u6926\u0280amopr\u223A\u223E\u2243\u225E\u2263rr;\u61FFtht;\u623Bk\u0100lr\u2249\u2253eftarrow;\u61A9ightarrow;\u61AAf;\uC000\u{1D559}bar;\u6015\u0180clt\u226F\u2274\u2278r;\uC000\u{1D4BD}as\xE8\u21F4rok;\u4127\u0100bp\u2282\u2287ull;\u6043hen\xBB\u1C5B\u0AE1\u22A3\0\u22AA\0\u22B8\u22C5\u22CE\0\u22D5\u22F3\0\0\u22F8\u2322\u2367\u2362\u237F\0\u2386\u23AA\u23B4cute\u803B\xED\u40ED\u0180;iy\u0771\u22B0\u22B5rc\u803B\xEE\u40EE;\u4438\u0100cx\u22BC\u22BFy;\u4435cl\u803B\xA1\u40A1\u0100fr\u039F\u22C9;\uC000\u{1D526}rave\u803B\xEC\u40EC\u0200;ino\u073E\u22DD\u22E9\u22EE\u0100in\u22E2\u22E6nt;\u6A0Ct;\u622Dfin;\u69DCta;\u6129lig;\u4133\u0180aop\u22FE\u231A\u231D\u0180cgt\u2305\u2308\u2317r;\u412B\u0180elp\u071F\u230F\u2313in\xE5\u078Ear\xF4\u0720h;\u4131f;\u62B7ed;\u41B5\u0280;cfot\u04F4\u232C\u2331\u233D\u2341are;\u6105in\u0100;t\u2338\u2339\u621Eie;\u69DDdo\xF4\u2319\u0280;celp\u0757\u234C\u2350\u235B\u2361al;\u62BA\u0100gr\u2355\u2359er\xF3\u1563\xE3\u234Darhk;\u6A17rod;\u6A3C\u0200cgpt\u236F\u2372\u2376\u237By;\u4451on;\u412Ff;\uC000\u{1D55A}a;\u43B9uest\u803B\xBF\u40BF\u0100ci\u238A\u238Fr;\uC000\u{1D4BE}n\u0280;Edsv\u04F4\u239B\u239D\u23A1\u04F3;\u62F9ot;\u62F5\u0100;v\u23A6\u23A7\u62F4;\u62F3\u0100;i\u0777\u23AElde;\u4129\u01EB\u23B8\0\u23BCcy;\u4456l\u803B\xEF\u40EF\u0300cfmosu\u23CC\u23D7\u23DC\u23E1\u23E7\u23F5\u0100iy\u23D1\u23D5rc;\u4135;\u4439r;\uC000\u{1D527}ath;\u4237pf;\uC000\u{1D55B}\u01E3\u23EC\0\u23F1r;\uC000\u{1D4BF}rcy;\u4458kcy;\u4454\u0400acfghjos\u240B\u2416\u2422\u2427\u242D\u2431\u2435\u243Bppa\u0100;v\u2413\u2414\u43BA;\u43F0\u0100ey\u241B\u2420dil;\u4137;\u443Ar;\uC000\u{1D528}reen;\u4138cy;\u4445cy;\u445Cpf;\uC000\u{1D55C}cr;\uC000\u{1D4C0}\u0B80ABEHabcdefghjlmnoprstuv\u2470\u2481\u2486\u248D\u2491\u250E\u253D\u255A\u2580\u264E\u265E\u2665\u2679\u267D\u269A\u26B2\u26D8\u275D\u2768\u278B\u27C0\u2801\u2812\u0180art\u2477\u247A\u247Cr\xF2\u09C6\xF2\u0395ail;\u691Barr;\u690E\u0100;g\u0994\u248B;\u6A8Bar;\u6962\u0963\u24A5\0\u24AA\0\u24B1\0\0\0\0\0\u24B5\u24BA\0\u24C6\u24C8\u24CD\0\u24F9ute;\u413Amptyv;\u69B4ra\xEE\u084Cbda;\u43BBg\u0180;dl\u088E\u24C1\u24C3;\u6991\xE5\u088E;\u6A85uo\u803B\xAB\u40ABr\u0400;bfhlpst\u0899\u24DE\u24E6\u24E9\u24EB\u24EE\u24F1\u24F5\u0100;f\u089D\u24E3s;\u691Fs;\u691D\xEB\u2252p;\u61ABl;\u6939im;\u6973l;\u61A2\u0180;ae\u24FF\u2500\u2504\u6AABil;\u6919\u0100;s\u2509\u250A\u6AAD;\uC000\u2AAD\uFE00\u0180abr\u2515\u2519\u251Drr;\u690Crk;\u6772\u0100ak\u2522\u252Cc\u0100ek\u2528\u252A;\u407B;\u405B\u0100es\u2531\u2533;\u698Bl\u0100du\u2539\u253B;\u698F;\u698D\u0200aeuy\u2546\u254B\u2556\u2558ron;\u413E\u0100di\u2550\u2554il;\u413C\xEC\u08B0\xE2\u2529;\u443B\u0200cqrs\u2563\u2566\u256D\u257Da;\u6936uo\u0100;r\u0E19\u1746\u0100du\u2572\u2577har;\u6967shar;\u694Bh;\u61B2\u0280;fgqs\u258B\u258C\u0989\u25F3\u25FF\u6264t\u0280ahlrt\u2598\u25A4\u25B7\u25C2\u25E8rrow\u0100;t\u0899\u25A1a\xE9\u24F6arpoon\u0100du\u25AF\u25B4own\xBB\u045Ap\xBB\u0966eftarrows;\u61C7ight\u0180ahs\u25CD\u25D6\u25DErrow\u0100;s\u08F4\u08A7arpoon\xF3\u0F98quigarro\xF7\u21F0hreetimes;\u62CB\u0180;qs\u258B\u0993\u25FAlan\xF4\u09AC\u0280;cdgs\u09AC\u260A\u260D\u261D\u2628c;\u6AA8ot\u0100;o\u2614\u2615\u6A7F\u0100;r\u261A\u261B\u6A81;\u6A83\u0100;e\u2622\u2625\uC000\u22DA\uFE00s;\u6A93\u0280adegs\u2633\u2639\u263D\u2649\u264Bppro\xF8\u24C6ot;\u62D6q\u0100gq\u2643\u2645\xF4\u0989gt\xF2\u248C\xF4\u099Bi\xED\u09B2\u0180ilr\u2655\u08E1\u265Asht;\u697C;\uC000\u{1D529}\u0100;E\u099C\u2663;\u6A91\u0161\u2669\u2676r\u0100du\u25B2\u266E\u0100;l\u0965\u2673;\u696Alk;\u6584cy;\u4459\u0280;acht\u0A48\u2688\u268B\u2691\u2696r\xF2\u25C1orne\xF2\u1D08ard;\u696Bri;\u65FA\u0100io\u269F\u26A4dot;\u4140ust\u0100;a\u26AC\u26AD\u63B0che\xBB\u26AD\u0200Eaes\u26BB\u26BD\u26C9\u26D4;\u6268p\u0100;p\u26C3\u26C4\u6A89rox\xBB\u26C4\u0100;q\u26CE\u26CF\u6A87\u0100;q\u26CE\u26BBim;\u62E6\u0400abnoptwz\u26E9\u26F4\u26F7\u271A\u272F\u2741\u2747\u2750\u0100nr\u26EE\u26F1g;\u67ECr;\u61FDr\xEB\u08C1g\u0180lmr\u26FF\u270D\u2714eft\u0100ar\u09E6\u2707ight\xE1\u09F2apsto;\u67FCight\xE1\u09FDparrow\u0100lr\u2725\u2729ef\xF4\u24EDight;\u61AC\u0180afl\u2736\u2739\u273Dr;\u6985;\uC000\u{1D55D}us;\u6A2Dimes;\u6A34\u0161\u274B\u274Fst;\u6217\xE1\u134E\u0180;ef\u2757\u2758\u1800\u65CAnge\xBB\u2758ar\u0100;l\u2764\u2765\u4028t;\u6993\u0280achmt\u2773\u2776\u277C\u2785\u2787r\xF2\u08A8orne\xF2\u1D8Car\u0100;d\u0F98\u2783;\u696D;\u600Eri;\u62BF\u0300achiqt\u2798\u279D\u0A40\u27A2\u27AE\u27BBquo;\u6039r;\uC000\u{1D4C1}m\u0180;eg\u09B2\u27AA\u27AC;\u6A8D;\u6A8F\u0100bu\u252A\u27B3o\u0100;r\u0E1F\u27B9;\u601Arok;\u4142\u8400<;cdhilqr\u082B\u27D2\u2639\u27DC\u27E0\u27E5\u27EA\u27F0\u0100ci\u27D7\u27D9;\u6AA6r;\u6A79re\xE5\u25F2mes;\u62C9arr;\u6976uest;\u6A7B\u0100Pi\u27F5\u27F9ar;\u6996\u0180;ef\u2800\u092D\u181B\u65C3r\u0100du\u2807\u280Dshar;\u694Ahar;\u6966\u0100en\u2817\u2821rtneqq;\uC000\u2268\uFE00\xC5\u281E\u0700Dacdefhilnopsu\u2840\u2845\u2882\u288E\u2893\u28A0\u28A5\u28A8\u28DA\u28E2\u28E4\u0A83\u28F3\u2902Dot;\u623A\u0200clpr\u284E\u2852\u2863\u287Dr\u803B\xAF\u40AF\u0100et\u2857\u2859;\u6642\u0100;e\u285E\u285F\u6720se\xBB\u285F\u0100;s\u103B\u2868to\u0200;dlu\u103B\u2873\u2877\u287Bow\xEE\u048Cef\xF4\u090F\xF0\u13D1ker;\u65AE\u0100oy\u2887\u288Cmma;\u6A29;\u443Cash;\u6014asuredangle\xBB\u1626r;\uC000\u{1D52A}o;\u6127\u0180cdn\u28AF\u28B4\u28C9ro\u803B\xB5\u40B5\u0200;acd\u1464\u28BD\u28C0\u28C4s\xF4\u16A7ir;\u6AF0ot\u80BB\xB7\u01B5us\u0180;bd\u28D2\u1903\u28D3\u6212\u0100;u\u1D3C\u28D8;\u6A2A\u0163\u28DE\u28E1p;\u6ADB\xF2\u2212\xF0\u0A81\u0100dp\u28E9\u28EEels;\u62A7f;\uC000\u{1D55E}\u0100ct\u28F8\u28FDr;\uC000\u{1D4C2}pos\xBB\u159D\u0180;lm\u2909\u290A\u290D\u43BCtimap;\u62B8\u0C00GLRVabcdefghijlmoprstuvw\u2942\u2953\u297E\u2989\u2998\u29DA\u29E9\u2A15\u2A1A\u2A58\u2A5D\u2A83\u2A95\u2AA4\u2AA8\u2B04\u2B07\u2B44\u2B7F\u2BAE\u2C34\u2C67\u2C7C\u2CE9\u0100gt\u2947\u294B;\uC000\u22D9\u0338\u0100;v\u2950\u0BCF\uC000\u226B\u20D2\u0180elt\u295A\u2972\u2976ft\u0100ar\u2961\u2967rrow;\u61CDightarrow;\u61CE;\uC000\u22D8\u0338\u0100;v\u297B\u0C47\uC000\u226A\u20D2ightarrow;\u61CF\u0100Dd\u298E\u2993ash;\u62AFash;\u62AE\u0280bcnpt\u29A3\u29A7\u29AC\u29B1\u29CCla\xBB\u02DEute;\u4144g;\uC000\u2220\u20D2\u0280;Eiop\u0D84\u29BC\u29C0\u29C5\u29C8;\uC000\u2A70\u0338d;\uC000\u224B\u0338s;\u4149ro\xF8\u0D84ur\u0100;a\u29D3\u29D4\u666El\u0100;s\u29D3\u0B38\u01F3\u29DF\0\u29E3p\u80BB\xA0\u0B37mp\u0100;e\u0BF9\u0C00\u0280aeouy\u29F4\u29FE\u2A03\u2A10\u2A13\u01F0\u29F9\0\u29FB;\u6A43on;\u4148dil;\u4146ng\u0100;d\u0D7E\u2A0Aot;\uC000\u2A6D\u0338p;\u6A42;\u443Dash;\u6013\u0380;Aadqsx\u0B92\u2A29\u2A2D\u2A3B\u2A41\u2A45\u2A50rr;\u61D7r\u0100hr\u2A33\u2A36k;\u6924\u0100;o\u13F2\u13F0ot;\uC000\u2250\u0338ui\xF6\u0B63\u0100ei\u2A4A\u2A4Ear;\u6928\xED\u0B98ist\u0100;s\u0BA0\u0B9Fr;\uC000\u{1D52B}\u0200Eest\u0BC5\u2A66\u2A79\u2A7C\u0180;qs\u0BBC\u2A6D\u0BE1\u0180;qs\u0BBC\u0BC5\u2A74lan\xF4\u0BE2i\xED\u0BEA\u0100;r\u0BB6\u2A81\xBB\u0BB7\u0180Aap\u2A8A\u2A8D\u2A91r\xF2\u2971rr;\u61AEar;\u6AF2\u0180;sv\u0F8D\u2A9C\u0F8C\u0100;d\u2AA1\u2AA2\u62FC;\u62FAcy;\u445A\u0380AEadest\u2AB7\u2ABA\u2ABE\u2AC2\u2AC5\u2AF6\u2AF9r\xF2\u2966;\uC000\u2266\u0338rr;\u619Ar;\u6025\u0200;fqs\u0C3B\u2ACE\u2AE3\u2AEFt\u0100ar\u2AD4\u2AD9rro\xF7\u2AC1ightarro\xF7\u2A90\u0180;qs\u0C3B\u2ABA\u2AEAlan\xF4\u0C55\u0100;s\u0C55\u2AF4\xBB\u0C36i\xED\u0C5D\u0100;r\u0C35\u2AFEi\u0100;e\u0C1A\u0C25i\xE4\u0D90\u0100pt\u2B0C\u2B11f;\uC000\u{1D55F}\u8180\xAC;in\u2B19\u2B1A\u2B36\u40ACn\u0200;Edv\u0B89\u2B24\u2B28\u2B2E;\uC000\u22F9\u0338ot;\uC000\u22F5\u0338\u01E1\u0B89\u2B33\u2B35;\u62F7;\u62F6i\u0100;v\u0CB8\u2B3C\u01E1\u0CB8\u2B41\u2B43;\u62FE;\u62FD\u0180aor\u2B4B\u2B63\u2B69r\u0200;ast\u0B7B\u2B55\u2B5A\u2B5Flle\xEC\u0B7Bl;\uC000\u2AFD\u20E5;\uC000\u2202\u0338lint;\u6A14\u0180;ce\u0C92\u2B70\u2B73u\xE5\u0CA5\u0100;c\u0C98\u2B78\u0100;e\u0C92\u2B7D\xF1\u0C98\u0200Aait\u2B88\u2B8B\u2B9D\u2BA7r\xF2\u2988rr\u0180;cw\u2B94\u2B95\u2B99\u619B;\uC000\u2933\u0338;\uC000\u219D\u0338ghtarrow\xBB\u2B95ri\u0100;e\u0CCB\u0CD6\u0380chimpqu\u2BBD\u2BCD\u2BD9\u2B04\u0B78\u2BE4\u2BEF\u0200;cer\u0D32\u2BC6\u0D37\u2BC9u\xE5\u0D45;\uC000\u{1D4C3}ort\u026D\u2B05\0\0\u2BD6ar\xE1\u2B56m\u0100;e\u0D6E\u2BDF\u0100;q\u0D74\u0D73su\u0100bp\u2BEB\u2BED\xE5\u0CF8\xE5\u0D0B\u0180bcp\u2BF6\u2C11\u2C19\u0200;Ees\u2BFF\u2C00\u0D22\u2C04\u6284;\uC000\u2AC5\u0338et\u0100;e\u0D1B\u2C0Bq\u0100;q\u0D23\u2C00c\u0100;e\u0D32\u2C17\xF1\u0D38\u0200;Ees\u2C22\u2C23\u0D5F\u2C27\u6285;\uC000\u2AC6\u0338et\u0100;e\u0D58\u2C2Eq\u0100;q\u0D60\u2C23\u0200gilr\u2C3D\u2C3F\u2C45\u2C47\xEC\u0BD7lde\u803B\xF1\u40F1\xE7\u0C43iangle\u0100lr\u2C52\u2C5Ceft\u0100;e\u0C1A\u2C5A\xF1\u0C26ight\u0100;e\u0CCB\u2C65\xF1\u0CD7\u0100;m\u2C6C\u2C6D\u43BD\u0180;es\u2C74\u2C75\u2C79\u4023ro;\u6116p;\u6007\u0480DHadgilrs\u2C8F\u2C94\u2C99\u2C9E\u2CA3\u2CB0\u2CB6\u2CD3\u2CE3ash;\u62ADarr;\u6904p;\uC000\u224D\u20D2ash;\u62AC\u0100et\u2CA8\u2CAC;\uC000\u2265\u20D2;\uC000>\u20D2nfin;\u69DE\u0180Aet\u2CBD\u2CC1\u2CC5rr;\u6902;\uC000\u2264\u20D2\u0100;r\u2CCA\u2CCD\uC000<\u20D2ie;\uC000\u22B4\u20D2\u0100At\u2CD8\u2CDCrr;\u6903rie;\uC000\u22B5\u20D2im;\uC000\u223C\u20D2\u0180Aan\u2CF0\u2CF4\u2D02rr;\u61D6r\u0100hr\u2CFA\u2CFDk;\u6923\u0100;o\u13E7\u13E5ear;\u6927\u1253\u1A95\0\0\0\0\0\0\0\0\0\0\0\0\0\u2D2D\0\u2D38\u2D48\u2D60\u2D65\u2D72\u2D84\u1B07\0\0\u2D8D\u2DAB\0\u2DC8\u2DCE\0\u2DDC\u2E19\u2E2B\u2E3E\u2E43\u0100cs\u2D31\u1A97ute\u803B\xF3\u40F3\u0100iy\u2D3C\u2D45r\u0100;c\u1A9E\u2D42\u803B\xF4\u40F4;\u443E\u0280abios\u1AA0\u2D52\u2D57\u01C8\u2D5Alac;\u4151v;\u6A38old;\u69BClig;\u4153\u0100cr\u2D69\u2D6Dir;\u69BF;\uC000\u{1D52C}\u036F\u2D79\0\0\u2D7C\0\u2D82n;\u42DBave\u803B\xF2\u40F2;\u69C1\u0100bm\u2D88\u0DF4ar;\u69B5\u0200acit\u2D95\u2D98\u2DA5\u2DA8r\xF2\u1A80\u0100ir\u2D9D\u2DA0r;\u69BEoss;\u69BBn\xE5\u0E52;\u69C0\u0180aei\u2DB1\u2DB5\u2DB9cr;\u414Dga;\u43C9\u0180cdn\u2DC0\u2DC5\u01CDron;\u43BF;\u69B6pf;\uC000\u{1D560}\u0180ael\u2DD4\u2DD7\u01D2r;\u69B7rp;\u69B9\u0380;adiosv\u2DEA\u2DEB\u2DEE\u2E08\u2E0D\u2E10\u2E16\u6228r\xF2\u1A86\u0200;efm\u2DF7\u2DF8\u2E02\u2E05\u6A5Dr\u0100;o\u2DFE\u2DFF\u6134f\xBB\u2DFF\u803B\xAA\u40AA\u803B\xBA\u40BAgof;\u62B6r;\u6A56lope;\u6A57;\u6A5B\u0180clo\u2E1F\u2E21\u2E27\xF2\u2E01ash\u803B\xF8\u40F8l;\u6298i\u016C\u2E2F\u2E34de\u803B\xF5\u40F5es\u0100;a\u01DB\u2E3As;\u6A36ml\u803B\xF6\u40F6bar;\u633D\u0AE1\u2E5E\0\u2E7D\0\u2E80\u2E9D\0\u2EA2\u2EB9\0\0\u2ECB\u0E9C\0\u2F13\0\0\u2F2B\u2FBC\0\u2FC8r\u0200;ast\u0403\u2E67\u2E72\u0E85\u8100\xB6;l\u2E6D\u2E6E\u40B6le\xEC\u0403\u0269\u2E78\0\0\u2E7Bm;\u6AF3;\u6AFDy;\u443Fr\u0280cimpt\u2E8B\u2E8F\u2E93\u1865\u2E97nt;\u4025od;\u402Eil;\u6030enk;\u6031r;\uC000\u{1D52D}\u0180imo\u2EA8\u2EB0\u2EB4\u0100;v\u2EAD\u2EAE\u43C6;\u43D5ma\xF4\u0A76ne;\u660E\u0180;tv\u2EBF\u2EC0\u2EC8\u43C0chfork\xBB\u1FFD;\u43D6\u0100au\u2ECF\u2EDFn\u0100ck\u2ED5\u2EDDk\u0100;h\u21F4\u2EDB;\u610E\xF6\u21F4s\u0480;abcdemst\u2EF3\u2EF4\u1908\u2EF9\u2EFD\u2F04\u2F06\u2F0A\u2F0E\u402Bcir;\u6A23ir;\u6A22\u0100ou\u1D40\u2F02;\u6A25;\u6A72n\u80BB\xB1\u0E9Dim;\u6A26wo;\u6A27\u0180ipu\u2F19\u2F20\u2F25ntint;\u6A15f;\uC000\u{1D561}nd\u803B\xA3\u40A3\u0500;Eaceinosu\u0EC8\u2F3F\u2F41\u2F44\u2F47\u2F81\u2F89\u2F92\u2F7E\u2FB6;\u6AB3p;\u6AB7u\xE5\u0ED9\u0100;c\u0ECE\u2F4C\u0300;acens\u0EC8\u2F59\u2F5F\u2F66\u2F68\u2F7Eppro\xF8\u2F43urlye\xF1\u0ED9\xF1\u0ECE\u0180aes\u2F6F\u2F76\u2F7Approx;\u6AB9qq;\u6AB5im;\u62E8i\xED\u0EDFme\u0100;s\u2F88\u0EAE\u6032\u0180Eas\u2F78\u2F90\u2F7A\xF0\u2F75\u0180dfp\u0EEC\u2F99\u2FAF\u0180als\u2FA0\u2FA5\u2FAAlar;\u632Eine;\u6312urf;\u6313\u0100;t\u0EFB\u2FB4\xEF\u0EFBrel;\u62B0\u0100ci\u2FC0\u2FC5r;\uC000\u{1D4C5};\u43C8ncsp;\u6008\u0300fiopsu\u2FDA\u22E2\u2FDF\u2FE5\u2FEB\u2FF1r;\uC000\u{1D52E}pf;\uC000\u{1D562}rime;\u6057cr;\uC000\u{1D4C6}\u0180aeo\u2FF8\u3009\u3013t\u0100ei\u2FFE\u3005rnion\xF3\u06B0nt;\u6A16st\u0100;e\u3010\u3011\u403F\xF1\u1F19\xF4\u0F14\u0A80ABHabcdefhilmnoprstux\u3040\u3051\u3055\u3059\u30E0\u310E\u312B\u3147\u3162\u3172\u318E\u3206\u3215\u3224\u3229\u3258\u326E\u3272\u3290\u32B0\u32B7\u0180art\u3047\u304A\u304Cr\xF2\u10B3\xF2\u03DDail;\u691Car\xF2\u1C65ar;\u6964\u0380cdenqrt\u3068\u3075\u3078\u307F\u308F\u3094\u30CC\u0100eu\u306D\u3071;\uC000\u223D\u0331te;\u4155i\xE3\u116Emptyv;\u69B3g\u0200;del\u0FD1\u3089\u308B\u308D;\u6992;\u69A5\xE5\u0FD1uo\u803B\xBB\u40BBr\u0580;abcfhlpstw\u0FDC\u30AC\u30AF\u30B7\u30B9\u30BC\u30BE\u30C0\u30C3\u30C7\u30CAp;\u6975\u0100;f\u0FE0\u30B4s;\u6920;\u6933s;\u691E\xEB\u225D\xF0\u272El;\u6945im;\u6974l;\u61A3;\u619D\u0100ai\u30D1\u30D5il;\u691Ao\u0100;n\u30DB\u30DC\u6236al\xF3\u0F1E\u0180abr\u30E7\u30EA\u30EEr\xF2\u17E5rk;\u6773\u0100ak\u30F3\u30FDc\u0100ek\u30F9\u30FB;\u407D;\u405D\u0100es\u3102\u3104;\u698Cl\u0100du\u310A\u310C;\u698E;\u6990\u0200aeuy\u3117\u311C\u3127\u3129ron;\u4159\u0100di\u3121\u3125il;\u4157\xEC\u0FF2\xE2\u30FA;\u4440\u0200clqs\u3134\u3137\u313D\u3144a;\u6937dhar;\u6969uo\u0100;r\u020E\u020Dh;\u61B3\u0180acg\u314E\u315F\u0F44l\u0200;ips\u0F78\u3158\u315B\u109Cn\xE5\u10BBar\xF4\u0FA9t;\u65AD\u0180ilr\u3169\u1023\u316Esht;\u697D;\uC000\u{1D52F}\u0100ao\u3177\u3186r\u0100du\u317D\u317F\xBB\u047B\u0100;l\u1091\u3184;\u696C\u0100;v\u318B\u318C\u43C1;\u43F1\u0180gns\u3195\u31F9\u31FCht\u0300ahlrst\u31A4\u31B0\u31C2\u31D8\u31E4\u31EErrow\u0100;t\u0FDC\u31ADa\xE9\u30C8arpoon\u0100du\u31BB\u31BFow\xEE\u317Ep\xBB\u1092eft\u0100ah\u31CA\u31D0rrow\xF3\u0FEAarpoon\xF3\u0551ightarrows;\u61C9quigarro\xF7\u30CBhreetimes;\u62CCg;\u42DAingdotse\xF1\u1F32\u0180ahm\u320D\u3210\u3213r\xF2\u0FEAa\xF2\u0551;\u600Foust\u0100;a\u321E\u321F\u63B1che\xBB\u321Fmid;\u6AEE\u0200abpt\u3232\u323D\u3240\u3252\u0100nr\u3237\u323Ag;\u67EDr;\u61FEr\xEB\u1003\u0180afl\u3247\u324A\u324Er;\u6986;\uC000\u{1D563}us;\u6A2Eimes;\u6A35\u0100ap\u325D\u3267r\u0100;g\u3263\u3264\u4029t;\u6994olint;\u6A12ar\xF2\u31E3\u0200achq\u327B\u3280\u10BC\u3285quo;\u603Ar;\uC000\u{1D4C7}\u0100bu\u30FB\u328Ao\u0100;r\u0214\u0213\u0180hir\u3297\u329B\u32A0re\xE5\u31F8mes;\u62CAi\u0200;efl\u32AA\u1059\u1821\u32AB\u65B9tri;\u69CEluhar;\u6968;\u611E\u0D61\u32D5\u32DB\u32DF\u332C\u3338\u3371\0\u337A\u33A4\0\0\u33EC\u33F0\0\u3428\u3448\u345A\u34AD\u34B1\u34CA\u34F1\0\u3616\0\0\u3633cute;\u415Bqu\xEF\u27BA\u0500;Eaceinpsy\u11ED\u32F3\u32F5\u32FF\u3302\u330B\u330F\u331F\u3326\u3329;\u6AB4\u01F0\u32FA\0\u32FC;\u6AB8on;\u4161u\xE5\u11FE\u0100;d\u11F3\u3307il;\u415Frc;\u415D\u0180Eas\u3316\u3318\u331B;\u6AB6p;\u6ABAim;\u62E9olint;\u6A13i\xED\u1204;\u4441ot\u0180;be\u3334\u1D47\u3335\u62C5;\u6A66\u0380Aacmstx\u3346\u334A\u3357\u335B\u335E\u3363\u336Drr;\u61D8r\u0100hr\u3350\u3352\xEB\u2228\u0100;o\u0A36\u0A34t\u803B\xA7\u40A7i;\u403Bwar;\u6929m\u0100in\u3369\xF0nu\xF3\xF1t;\u6736r\u0100;o\u3376\u2055\uC000\u{1D530}\u0200acoy\u3382\u3386\u3391\u33A0rp;\u666F\u0100hy\u338B\u338Fcy;\u4449;\u4448rt\u026D\u3399\0\0\u339Ci\xE4\u1464ara\xEC\u2E6F\u803B\xAD\u40AD\u0100gm\u33A8\u33B4ma\u0180;fv\u33B1\u33B2\u33B2\u43C3;\u43C2\u0400;deglnpr\u12AB\u33C5\u33C9\u33CE\u33D6\u33DE\u33E1\u33E6ot;\u6A6A\u0100;q\u12B1\u12B0\u0100;E\u33D3\u33D4\u6A9E;\u6AA0\u0100;E\u33DB\u33DC\u6A9D;\u6A9Fe;\u6246lus;\u6A24arr;\u6972ar\xF2\u113D\u0200aeit\u33F8\u3408\u340F\u3417\u0100ls\u33FD\u3404lsetm\xE9\u336Ahp;\u6A33parsl;\u69E4\u0100dl\u1463\u3414e;\u6323\u0100;e\u341C\u341D\u6AAA\u0100;s\u3422\u3423\u6AAC;\uC000\u2AAC\uFE00\u0180flp\u342E\u3433\u3442tcy;\u444C\u0100;b\u3438\u3439\u402F\u0100;a\u343E\u343F\u69C4r;\u633Ff;\uC000\u{1D564}a\u0100dr\u344D\u0402es\u0100;u\u3454\u3455\u6660it\xBB\u3455\u0180csu\u3460\u3479\u349F\u0100au\u3465\u346Fp\u0100;s\u1188\u346B;\uC000\u2293\uFE00p\u0100;s\u11B4\u3475;\uC000\u2294\uFE00u\u0100bp\u347F\u348F\u0180;es\u1197\u119C\u3486et\u0100;e\u1197\u348D\xF1\u119D\u0180;es\u11A8\u11AD\u3496et\u0100;e\u11A8\u349D\xF1\u11AE\u0180;af\u117B\u34A6\u05B0r\u0165\u34AB\u05B1\xBB\u117Car\xF2\u1148\u0200cemt\u34B9\u34BE\u34C2\u34C5r;\uC000\u{1D4C8}tm\xEE\xF1i\xEC\u3415ar\xE6\u11BE\u0100ar\u34CE\u34D5r\u0100;f\u34D4\u17BF\u6606\u0100an\u34DA\u34EDight\u0100ep\u34E3\u34EApsilo\xEE\u1EE0h\xE9\u2EAFs\xBB\u2852\u0280bcmnp\u34FB\u355E\u1209\u358B\u358E\u0480;Edemnprs\u350E\u350F\u3511\u3515\u351E\u3523\u352C\u3531\u3536\u6282;\u6AC5ot;\u6ABD\u0100;d\u11DA\u351Aot;\u6AC3ult;\u6AC1\u0100Ee\u3528\u352A;\u6ACB;\u628Alus;\u6ABFarr;\u6979\u0180eiu\u353D\u3552\u3555t\u0180;en\u350E\u3545\u354Bq\u0100;q\u11DA\u350Feq\u0100;q\u352B\u3528m;\u6AC7\u0100bp\u355A\u355C;\u6AD5;\u6AD3c\u0300;acens\u11ED\u356C\u3572\u3579\u357B\u3326ppro\xF8\u32FAurlye\xF1\u11FE\xF1\u11F3\u0180aes\u3582\u3588\u331Bppro\xF8\u331Aq\xF1\u3317g;\u666A\u0680123;Edehlmnps\u35A9\u35AC\u35AF\u121C\u35B2\u35B4\u35C0\u35C9\u35D5\u35DA\u35DF\u35E8\u35ED\u803B\xB9\u40B9\u803B\xB2\u40B2\u803B\xB3\u40B3;\u6AC6\u0100os\u35B9\u35BCt;\u6ABEub;\u6AD8\u0100;d\u1222\u35C5ot;\u6AC4s\u0100ou\u35CF\u35D2l;\u67C9b;\u6AD7arr;\u697Bult;\u6AC2\u0100Ee\u35E4\u35E6;\u6ACC;\u628Blus;\u6AC0\u0180eiu\u35F4\u3609\u360Ct\u0180;en\u121C\u35FC\u3602q\u0100;q\u1222\u35B2eq\u0100;q\u35E7\u35E4m;\u6AC8\u0100bp\u3611\u3613;\u6AD4;\u6AD6\u0180Aan\u361C\u3620\u362Drr;\u61D9r\u0100hr\u3626\u3628\xEB\u222E\u0100;o\u0A2B\u0A29war;\u692Alig\u803B\xDF\u40DF\u0BE1\u3651\u365D\u3660\u12CE\u3673\u3679\0\u367E\u36C2\0\0\0\0\0\u36DB\u3703\0\u3709\u376C\0\0\0\u3787\u0272\u3656\0\0\u365Bget;\u6316;\u43C4r\xEB\u0E5F\u0180aey\u3666\u366B\u3670ron;\u4165dil;\u4163;\u4442lrec;\u6315r;\uC000\u{1D531}\u0200eiko\u3686\u369D\u36B5\u36BC\u01F2\u368B\0\u3691e\u01004f\u1284\u1281a\u0180;sv\u3698\u3699\u369B\u43B8ym;\u43D1\u0100cn\u36A2\u36B2k\u0100as\u36A8\u36AEppro\xF8\u12C1im\xBB\u12ACs\xF0\u129E\u0100as\u36BA\u36AE\xF0\u12C1rn\u803B\xFE\u40FE\u01EC\u031F\u36C6\u22E7es\u8180\xD7;bd\u36CF\u36D0\u36D8\u40D7\u0100;a\u190F\u36D5r;\u6A31;\u6A30\u0180eps\u36E1\u36E3\u3700\xE1\u2A4D\u0200;bcf\u0486\u36EC\u36F0\u36F4ot;\u6336ir;\u6AF1\u0100;o\u36F9\u36FC\uC000\u{1D565}rk;\u6ADA\xE1\u3362rime;\u6034\u0180aip\u370F\u3712\u3764d\xE5\u1248\u0380adempst\u3721\u374D\u3740\u3751\u3757\u375C\u375Fngle\u0280;dlqr\u3730\u3731\u3736\u3740\u3742\u65B5own\xBB\u1DBBeft\u0100;e\u2800\u373E\xF1\u092E;\u625Cight\u0100;e\u32AA\u374B\xF1\u105Aot;\u65ECinus;\u6A3Alus;\u6A39b;\u69CDime;\u6A3Bezium;\u63E2\u0180cht\u3772\u377D\u3781\u0100ry\u3777\u377B;\uC000\u{1D4C9};\u4446cy;\u445Brok;\u4167\u0100io\u378B\u378Ex\xF4\u1777head\u0100lr\u3797\u37A0eftarro\xF7\u084Fightarrow\xBB\u0F5D\u0900AHabcdfghlmoprstuw\u37D0\u37D3\u37D7\u37E4\u37F0\u37FC\u380E\u381C\u3823\u3834\u3851\u385D\u386B\u38A9\u38CC\u38D2\u38EA\u38F6r\xF2\u03EDar;\u6963\u0100cr\u37DC\u37E2ute\u803B\xFA\u40FA\xF2\u1150r\u01E3\u37EA\0\u37EDy;\u445Eve;\u416D\u0100iy\u37F5\u37FArc\u803B\xFB\u40FB;\u4443\u0180abh\u3803\u3806\u380Br\xF2\u13ADlac;\u4171a\xF2\u13C3\u0100ir\u3813\u3818sht;\u697E;\uC000\u{1D532}rave\u803B\xF9\u40F9\u0161\u3827\u3831r\u0100lr\u382C\u382E\xBB\u0957\xBB\u1083lk;\u6580\u0100ct\u3839\u384D\u026F\u383F\0\0\u384Arn\u0100;e\u3845\u3846\u631Cr\xBB\u3846op;\u630Fri;\u65F8\u0100al\u3856\u385Acr;\u416B\u80BB\xA8\u0349\u0100gp\u3862\u3866on;\u4173f;\uC000\u{1D566}\u0300adhlsu\u114B\u3878\u387D\u1372\u3891\u38A0own\xE1\u13B3arpoon\u0100lr\u3888\u388Cef\xF4\u382Digh\xF4\u382Fi\u0180;hl\u3899\u389A\u389C\u43C5\xBB\u13FAon\xBB\u389Aparrows;\u61C8\u0180cit\u38B0\u38C4\u38C8\u026F\u38B6\0\0\u38C1rn\u0100;e\u38BC\u38BD\u631Dr\xBB\u38BDop;\u630Eng;\u416Fri;\u65F9cr;\uC000\u{1D4CA}\u0180dir\u38D9\u38DD\u38E2ot;\u62F0lde;\u4169i\u0100;f\u3730\u38E8\xBB\u1813\u0100am\u38EF\u38F2r\xF2\u38A8l\u803B\xFC\u40FCangle;\u69A7\u0780ABDacdeflnoprsz\u391C\u391F\u3929\u392D\u39B5\u39B8\u39BD\u39DF\u39E4\u39E8\u39F3\u39F9\u39FD\u3A01\u3A20r\xF2\u03F7ar\u0100;v\u3926\u3927\u6AE8;\u6AE9as\xE8\u03E1\u0100nr\u3932\u3937grt;\u699C\u0380eknprst\u34E3\u3946\u394B\u3952\u395D\u3964\u3996app\xE1\u2415othin\xE7\u1E96\u0180hir\u34EB\u2EC8\u3959op\xF4\u2FB5\u0100;h\u13B7\u3962\xEF\u318D\u0100iu\u3969\u396Dgm\xE1\u33B3\u0100bp\u3972\u3984setneq\u0100;q\u397D\u3980\uC000\u228A\uFE00;\uC000\u2ACB\uFE00setneq\u0100;q\u398F\u3992\uC000\u228B\uFE00;\uC000\u2ACC\uFE00\u0100hr\u399B\u399Fet\xE1\u369Ciangle\u0100lr\u39AA\u39AFeft\xBB\u0925ight\xBB\u1051y;\u4432ash\xBB\u1036\u0180elr\u39C4\u39D2\u39D7\u0180;be\u2DEA\u39CB\u39CFar;\u62BBq;\u625Alip;\u62EE\u0100bt\u39DC\u1468a\xF2\u1469r;\uC000\u{1D533}tr\xE9\u39AEsu\u0100bp\u39EF\u39F1\xBB\u0D1C\xBB\u0D59pf;\uC000\u{1D567}ro\xF0\u0EFBtr\xE9\u39B4\u0100cu\u3A06\u3A0Br;\uC000\u{1D4CB}\u0100bp\u3A10\u3A18n\u0100Ee\u3980\u3A16\xBB\u397En\u0100Ee\u3992\u3A1E\xBB\u3990igzag;\u699A\u0380cefoprs\u3A36\u3A3B\u3A56\u3A5B\u3A54\u3A61\u3A6Airc;\u4175\u0100di\u3A40\u3A51\u0100bg\u3A45\u3A49ar;\u6A5Fe\u0100;q\u15FA\u3A4F;\u6259erp;\u6118r;\uC000\u{1D534}pf;\uC000\u{1D568}\u0100;e\u1479\u3A66at\xE8\u1479cr;\uC000\u{1D4CC}\u0AE3\u178E\u3A87\0\u3A8B\0\u3A90\u3A9B\0\0\u3A9D\u3AA8\u3AAB\u3AAF\0\0\u3AC3\u3ACE\0\u3AD8\u17DC\u17DFtr\xE9\u17D1r;\uC000\u{1D535}\u0100Aa\u3A94\u3A97r\xF2\u03C3r\xF2\u09F6;\u43BE\u0100Aa\u3AA1\u3AA4r\xF2\u03B8r\xF2\u09EBa\xF0\u2713is;\u62FB\u0180dpt\u17A4\u3AB5\u3ABE\u0100fl\u3ABA\u17A9;\uC000\u{1D569}im\xE5\u17B2\u0100Aa\u3AC7\u3ACAr\xF2\u03CEr\xF2\u0A01\u0100cq\u3AD2\u17B8r;\uC000\u{1D4CD}\u0100pt\u17D6\u3ADCr\xE9\u17D4\u0400acefiosu\u3AF0\u3AFD\u3B08\u3B0C\u3B11\u3B15\u3B1B\u3B21c\u0100uy\u3AF6\u3AFBte\u803B\xFD\u40FD;\u444F\u0100iy\u3B02\u3B06rc;\u4177;\u444Bn\u803B\xA5\u40A5r;\uC000\u{1D536}cy;\u4457pf;\uC000\u{1D56A}cr;\uC000\u{1D4CE}\u0100cm\u3B26\u3B29y;\u444El\u803B\xFF\u40FF\u0500acdefhiosw\u3B42\u3B48\u3B54\u3B58\u3B64\u3B69\u3B6D\u3B74\u3B7A\u3B80cute;\u417A\u0100ay\u3B4D\u3B52ron;\u417E;\u4437ot;\u417C\u0100et\u3B5D\u3B61tr\xE6\u155Fa;\u43B6r;\uC000\u{1D537}cy;\u4436grarr;\u61DDpf;\uC000\u{1D56B}cr;\uC000\u{1D4CF}\u0100jn\u3B85\u3B87;\u600Dj;\u600C'.split("").map(C=>C.charCodeAt(0)));var Yt,M0=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),Jt=(Yt=String.fromCodePoint)!==null&&Yt!==void 0?Yt:function(C){let I="";return C>65535&&(C-=65536,I+=String.fromCharCode(C>>>10&1023|55296),C=56320|C&1023),I+=String.fromCharCode(C),I};function vt(C){var I;return C>=55296&&C<=57343||C>1114111?65533:(I=M0.get(C))!==null&&I!==void 0?I:C}var Yg;(function(C){C[C.NUM=35]="NUM",C[C.SEMI=59]="SEMI",C[C.EQUALS=61]="EQUALS",C[C.ZERO=48]="ZERO",C[C.NINE=57]="NINE",C[C.LOWER_A=97]="LOWER_A",C[C.LOWER_F=102]="LOWER_F",C[C.LOWER_X=120]="LOWER_X",C[C.LOWER_Z=122]="LOWER_Z",C[C.UPPER_A=65]="UPPER_A",C[C.UPPER_F=70]="UPPER_F",C[C.UPPER_Z=90]="UPPER_Z"})(Yg||(Yg={}));var P0=32,eF;(function(C){C[C.VALUE_LENGTH=49152]="VALUE_LENGTH",C[C.BRANCH_LENGTH=16256]="BRANCH_LENGTH",C[C.JUMP_TABLE=127]="JUMP_TABLE"})(eF||(eF={}));function kt(C){return C>=Yg.ZERO&&C<=Yg.NINE}function j0(C){return C>=Yg.UPPER_A&&C<=Yg.UPPER_F||C>=Yg.LOWER_A&&C<=Yg.LOWER_F}function O0(C){return C>=Yg.UPPER_A&&C<=Yg.UPPER_Z||C>=Yg.LOWER_A&&C<=Yg.LOWER_Z||kt(C)}function _0(C){return C===Yg.EQUALS||O0(C)}var Hg;(function(C){C[C.EntityStart=0]="EntityStart",C[C.NumericStart=1]="NumericStart",C[C.NumericDecimal=2]="NumericDecimal",C[C.NumericHex=3]="NumericHex",C[C.NamedEntity=4]="NamedEntity"})(Hg||(Hg={}));var OC;(function(C){C[C.Legacy=0]="Legacy",C[C.Strict=1]="Strict",C[C.Attribute=2]="Attribute"})(OC||(OC={}));var ol=class{constructor(I,g,B){this.decodeTree=I,this.emitCodePoint=g,this.errors=B,this.state=Hg.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=OC.Strict}startEntity(I){this.decodeMode=I,this.state=Hg.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1}write(I,g){switch(this.state){case Hg.EntityStart:return I.charCodeAt(g)===Yg.NUM?(this.state=Hg.NumericStart,this.consumed+=1,this.stateNumericStart(I,g+1)):(this.state=Hg.NamedEntity,this.stateNamedEntity(I,g));case Hg.NumericStart:return this.stateNumericStart(I,g);case Hg.NumericDecimal:return this.stateNumericDecimal(I,g);case Hg.NumericHex:return this.stateNumericHex(I,g);case Hg.NamedEntity:return this.stateNamedEntity(I,g)}}stateNumericStart(I,g){return g>=I.length?-1:(I.charCodeAt(g)|P0)===Yg.LOWER_X?(this.state=Hg.NumericHex,this.consumed+=1,this.stateNumericHex(I,g+1)):(this.state=Hg.NumericDecimal,this.stateNumericDecimal(I,g))}addToNumericResult(I,g,B,F){if(g!==B){let Q=B-g;this.result=this.result*Math.pow(F,Q)+Number.parseInt(I.substr(g,Q),F),this.consumed+=Q}}stateNumericHex(I,g){let B=g;for(;g>14;for(;g>14,Q!==0){if(A===Yg.SEMI)return this.emitNamedEntityData(this.treeIndex,Q,this.consumed+this.excess);this.decodeMode!==OC.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}return-1}emitNotTerminatedNamedEntity(){var I;let{result:g,decodeTree:B}=this,F=(B[g]&eF.VALUE_LENGTH)>>14;return this.emitNamedEntityData(g,F,this.consumed),(I=this.errors)===null||I===void 0||I.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(I,g,B){let{decodeTree:F}=this;return this.emitCodePoint(g===1?F[I]&~eF.VALUE_LENGTH:F[I+1],B),g===3&&this.emitCodePoint(F[I+2],B),B}end(){var I;switch(this.state){case Hg.NamedEntity:return this.result!==0&&(this.decodeMode!==OC.Attribute||this.result===this.treeIndex)?this.emitNotTerminatedNamedEntity():0;case Hg.NumericDecimal:return this.emitNumericEntity(0,2);case Hg.NumericHex:return this.emitNumericEntity(0,3);case Hg.NumericStart:return(I=this.errors)===null||I===void 0||I.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case Hg.EntityStart:return 0}}};function q0(C){let I="",g=new ol(C,B=>I+=Jt(B));return function(F,Q){let A=0,U=0;for(;(U=F.indexOf("&",U))>=0;){I+=F.slice(A,U),g.startEntity(Q);let s=g.write(F,U+1);if(s<0){A=U+g.end();break}A=U+s,U=s===0?A+1:A}let l=I+F.slice(A);return I="",l}}function $0(C,I,g,B){let F=(I&eF.BRANCH_LENGTH)>>7,Q=I&eF.JUMP_TABLE;if(F===0)return Q!==0&&B===Q?g:-1;if(Q){let l=B-Q;return l<0||l>=F?-1:C[g+l]-1}let A=g,U=A+F-1;for(;A<=U;){let l=A+U>>>1,s=C[l];if(sB)U=l-1;else return C[l+F]}return-1}var IZ=q0(Ht);function HQ(C,I=OC.Legacy){return IZ(C,I)}var gZ=String.prototype.codePointAt==null?(C,I)=>(C.charCodeAt(I)&64512)===55296?(C.charCodeAt(I)-55296)*1024+C.charCodeAt(I+1)-56320+65536:C.charCodeAt(I):(C,I)=>C.codePointAt(I);var mi;(function(C){C[C.XML=0]="XML",C[C.HTML=1]="HTML"})(mi||(mi={}));var hi;(function(C){C[C.UTF8=0]="UTF8",C[C.ASCII=1]="ASCII",C[C.Extensive=2]="Extensive",C[C.Attribute=3]="Attribute",C[C.Text=4]="Text"})(hi||(hi={}));var yi=require("obsidian");function rA(C,I=!0,g=0,B="div",F=null,Q){return C.type==="comment"?lt(C,Q,I):C.postprocess(I,g,B,F,Q)}async function yl(C,I,g){let B=null,F=null,Q=null,A=HQ(C.innerHTML,OC.Strict),U=g.default_preview_mode;if(I){if(sg.app.workspace.activeLeaf?.view instanceof yi.MarkdownView){let x=sg.app.workspace.activeLeaf.view;x.previewMode.docId===I.docId&&(U=x.editor.cm.state.field(Mg))}let e=I.getSectionInfo(C);if(e){let x=uA(e.text),a=[...e.text.matchAll(/\n/g)].map(n=>n.index);if(F=e.lineStart?a[e.lineStart-1]+1:0,Q=a[e.lineEnd]??e.text.length,B=x.filter(n=>n.partially_in_range(F,Q)),!B.length)return;if(B.length===1){let n=B[0],h=!1,m=null;if(n.type==="substitution"?n.part_encloses_range(F,Q,!0)&&(h=!0,m=!0)||n.part_encloses_range(F,Q,!1)&&(h=!0,m=!1):h=n.encloses_range(F,Q),h){n.type==="substitution"&&(A=A.replace(/~>/g,""));let L=F===n.from;if(Q===n.to){let y=A.lastIndexOf(eg[n.type].at(-1));A=A.substring(0,y)+A.substring(y+3)}if(L){let y=A.indexOf(eg[n.type][0]);A=A.substring(0,y)+A.substring(y+3)}let o=rA(n,!1,U,"div",m,A);o instanceof HTMLElement?(C.innerHTML="",C.appendChild(o)):C.innerHTML=o;return}}}}A=A.replaceAll(/{|{<\/del>/g,"{~~").replaceAll(/}|<\/del>}/g,"~~}").replaceAll(/{|{<\/mark>/g,"{==").replaceAll(/}|<\/mark>}/g,"==}").replaceAll(/{==}|{=<\/mark>=}/g,"{====}");let l=uA(A);for(let e=0;eB[0].from,d=Q",b.push(e));C.innerHTML=Z,C.querySelectorAll("placeholder").forEach((e,x)=>{e.replaceWith(b[x])})}var UZ=require("@codemirror/state"),Tt=require("obsidian");function wt(C){for(let I of C.workspace.getLeavesOfType("markdown"))if(I.view instanceof Tt.MarkdownView){for(let g of I.view.previewMode.renderer.sections.filter(B=>B.el.querySelector(".cmtr-preview")))g.rendered=!1,g.html="";I.view.previewMode.renderer.queueRender()}}function Sl(C){for(let I of C.workspace.getLeavesOfType("markdown"))I.view instanceof Tt.MarkdownView&&I.view.previewMode.rerender(!0)}var El=require("obsidian");var Wl=class{constructor(I,g=!1){this.plugin=I;this.setRendering(g)}button=null;index=0;metadata_settings_toggles=[{icon:"lucide-user",text:"Author",attribute:"author"},{icon:"lucide-calendar",text:"Time",attribute:"timestamp"},{icon:"lucide-check",text:"Completed",attribute:"completed"},{icon:"brush",text:"Style",attribute:"style"},{icon:"paintbrush",text:"Color",attribute:"color"}];showMenu(I){GF();let g=new El.Menu;g.addItem(B=>{B.setTitle("Add metadata"),B.setIcon("tags"),B.setChecked(this.plugin.settings.add_metadata),B.onClick(async()=>{await this.plugin.setSetting("add_metadata",!this.plugin.settings.add_metadata),B.setChecked(this.plugin.settings.add_metadata),g.items.slice(1).forEach(F=>{F.setDisabled(!this.plugin.settings.add_metadata)})})});for(let{icon:B,text:F,attribute:Q}of this.metadata_settings_toggles){let A=`add_${Q}_metadata`;g.addItem(U=>{U.setTitle(F),U.setIcon(B),U.setChecked(this.plugin.settings[A]),U.setDisabled(!this.plugin.settings.add_metadata),U.onClick(async()=>{await this.plugin.setSetting(A,!this.plugin.settings[A]),U.checkIconEl?U.checkIconEl.style.display=this.plugin.settings[A]?"flex":"none":U.setChecked(this.plugin.settings[A])}),U.dom.addClass("cmtr-submenu-nested")})}g.showAtMouseEvent(I)}setRendering(I){I===void 0||I===!!this.button||(I?this.renderButton():this.detachButton())}renderButton(){this.button=this.plugin.addStatusBarItem();let I=this.button.createSpan({cls:"status-bar-item-icon"});(0,El.setIcon)(I,"tags"),this.button.classList.add("mod-clickable"),this.button.setAttribute("aria-label","Metadata"),this.button.setAttribute("data-tooltip-position","top"),this.button.addEventListener("click",g=>this.showMenu(g)),this.button.addEventListener("contextmenu",g=>this.showMenu(g))}detachButton(){this.button&&(this.button.detach(),this.button=null)}};var wF=require("obsidian"),pA=class{constructor(I,g,B,F,Q=!1){this.states=I;this.onchange=g;this.getvalue=B;this.plugin=F;this.setRendering(Q),this.plugin.app.workspace.onLayoutReady(()=>this.currentView=this.plugin.app.workspace.activeEditor)}button=null;value=0;changeEvent=null;currentView=null;showMenu(I){let g=new wF.Menu;for(let[B,F]of this.states.entries())g.addItem(Q=>{Q.setTitle(F.text),Q.setIcon(F.icon),Q.setChecked(B===this.value),Q.onClick(()=>this.onchange(this.currentView,B))});g.showAtMouseEvent(I),I.preventDefault()}setRendering(I){I===void 0||I===!!this.button||(I?this.renderButton():this.detachButton())}updateButton(I){if(!this.button||I===void 0)return;this.value=I;let{icon:g,text:B}=this.states[I];(0,wF.setIcon)(this.button,g),this.button.setAttribute("aria-label",B)}renderButton(){let{icon:I,text:g}=this.states[this.value];this.changeEvent=this.plugin.app.workspace.on("active-leaf-change",F=>{F&&F.view instanceof wF.MarkdownView?(this.currentView=F.view,this.updateButton(this.getvalue(F.view.editor)),this.button.style.display=""):(this.currentView=null,this.button.style.display="none")}),this.button=this.plugin.addStatusBarItem();let B=this.button.createSpan({cls:"status-bar-item-icon"});(0,wF.setIcon)(B,I),this.button.classList.add("mod-clickable"),this.button.setAttribute("aria-label",g),this.button.setAttribute("data-tooltip-position","top"),this.button.addEventListener("click",F=>this.showMenu(F)),this.button.addEventListener("contextmenu",F=>this.showMenu(F))}detachButton(){this.button&&(this.button.detach(),this.button=null,this.plugin.app.workspace.offref(this.changeEvent))}};var Si=(C,I)=>new pA([{icon:"message-square",text:"Showing all suggestions"},{icon:"check",text:'Previewing "accept all"'},{icon:"cross",text:'Previewing "reject all"'}],C.setPreviewMode.bind(C),g=>g.cm.state.facet(Mg),C,I),Wi=(C,I)=>new pA([{icon:"pencil",text:"Editing (Regular)"},{icon:"edit",text:"Editing (Corrected)"},{icon:"file-edit",text:"Suggesting"}],C.setEditMode.bind(C),g=>g.cm.state.facet(nC),C,I),Ei=(C,I)=>new Wl(C,I);var VF=require("obsidian"),HA=class{constructor(I,g,B,F,Q,A,U=!1){this.states=I;this.has_label=g;this.cls=B;this.onchange=F;this.getvalue=Q;this.plugin=A;this.setRendering(U)}active_mapping=new WeakMap;changeEvent=null;setRendering(I){I===void 0||I===!!this.changeEvent||(I?this.attachButtons():this.detachButtons())}setLabelRendering(I){if(!(I===void 0||!this.changeEvent||I===this.has_label)){this.has_label=I;for(let g of this.plugin.app.workspace.getLeavesOfType("markdown")){if(!(g.view instanceof VF.MarkdownView))continue;let{view:B}=g,{text:F}=this.states[this.getvalue(B)],Q=this.active_mapping.get(B);if(Q)if(Q.status)Q.status.detach(),Q.status=null;else{let A=Q.button.createSpan({text:F,cls:this.cls});Q.button.parentElement.insertBefore(A,Q.button),Q.status=A}}}}updateButton(I,g){let B=this.active_mapping.get(I);if(B)if(this.states[g]){let{tooltip:F,text:Q}=this.states[g];(0,VF.setIcon)(B.button,this.states[(g+1)%this.states.length].icon),B.button.setAttribute("aria-label",F),B.button.style.display="",this.has_label&&(B.status.innerText=Q)}else B.button.style.display="none"}attachButtons(){this.changeEvent||(this.changeEvent=this.plugin.app.workspace.on("layout-change",this.attachButtons.bind(this)));for(let I of this.plugin.app.workspace.getLeavesOfType("markdown")){if(!(I.view instanceof VF.MarkdownView))continue;let{view:g}=I;if(this.active_mapping.has(g))continue;let B=I.on("history-change",()=>{this.updateButton(g,this.getvalue(g))}),F=this.getvalue(g);if(F===void 0)return;let{tooltip:Q,text:A}=this.states[F],U=g.addAction(this.states[(F+1)%this.states.length].icon,Q,async()=>{let s=(this.getvalue(g)+1)%this.states.length;this.onchange(g,s)}),l=this.has_label?U.createSpan({text:A,cls:this.cls}):null;this.has_label&&U.parentElement.insertBefore(l,U),U.oncontextmenu=s=>{let G=new VF.Menu,t=this.getvalue(g);for(let[c,{icon:d,text:b}]of this.states.entries())G.addItem(Z=>{Z.setIcon(d).setTitle(b).setChecked(c===t).onClick(()=>{this.onchange(g,c)})});G.showAtMouseEvent(s)},this.active_mapping.set(g,{button:U,status:l,event:B})}}detachButton(I){let g=I.view,B=this.active_mapping.get(g);B&&(I.offref(B.event),B.button.detach(),B.status?.detach(),this.active_mapping.delete(g))}detachButtons(){if(this.changeEvent){for(let I of this.plugin.app.workspace.getLeavesOfType("markdown"))I.view instanceof VF.MarkdownView&&this.detachButton(I);this.plugin.app.workspace.offref(this.changeEvent),this.changeEvent=null}}};var Ni=(C,I)=>new HA([{icon:"message-square",tooltip:`Current mode: show all suggestions +Click to preview 'accept all'`,text:"Showing all suggestions"},{icon:"check",tooltip:`Current mode: preview 'accept all' +Click to preview 'reject all'`,text:'Previewing "accept all"'},{icon:"cross",tooltip:`Current mode: preview 'reject all' +Click to preview 'show all'`,text:'Previewing "reject all"'}],C.settings.toolbar_show_buttons_labels,"cmtr-suggestion-status",C.setPreviewMode.bind(C),g=>g.editor.cm.state.facet(Mg),C,I),ri=(C,I)=>new HA([{icon:"pencil",tooltip:`Current mode: editing (regular) +Click to edit (corrected)`,text:"Editing (REG)"},{icon:"edit",tooltip:`Current mode: editing (corrected) +Click to suggest`,text:"Editing (ALT)"},{icon:"file-edit",tooltip:`Current mode: suggesting +Click to edit (regular)`,text:"Suggesting"}],C.settings.toolbar_show_buttons_labels,"cmtr-suggestion-status",C.setEditMode.bind(C),g=>g.editor.cm.state.facet(nC),C,I);var Tb=require("obsidian");var Nl=!0;var pi=globalThis.process?.env?.NODE_ENV,CI=pi&&!pi.toLowerCase().startsWith("prod");var _C=Array.isArray,Hi=Array.prototype.indexOf,YA=Array.from,ft=Object.keys,Pg=Object.defineProperty,qC=Object.getOwnPropertyDescriptor,rl=Object.getOwnPropertyDescriptors,pl=Object.prototype,Yi=Array.prototype,xF=Object.getPrototypeOf,zt=Object.isExtensible;function Mt(C){return typeof C=="function"}var mg=()=>{};function JA(C){for(var I=0;I0){let F=g.length>10?g.slice(0,7):g.slice(0,10),Q=g.length-F.length,A=F.map(U=>`- ${U}`).join(` +`);Q>0&&(A+=` +- ...and ${Q} more`)}return B}return kA(C,new Map,"",lZ)}function kA(C,I,g,B,F=null){if(typeof C=="object"&&C!==null){var Q=I.get(C);if(Q!==void 0)return Q;if(C instanceof Map)return new Map(C);if(C instanceof Set)return new Set(C);if(_C(C)){var A=Array(C.length);I.set(C,A),F!==null&&I.set(F,A);for(var U=0;U{B.d=!0}),CI&&(zI.function=g,JC=g)}function xI(C){let I=zI;if(I!==null){C!==void 0&&(I.x=C);let A=I.e;if(A!==null){var g=LI,B=SI;I.e=null;try{for(var F=0;F{var s=SI;Gg(A);var G=l();return Gg(s),G};return B&&g.set("length",lI(C.length,Q)),new Proxy(C,{defineProperty(l,s,G){(!("value"in G)||G.configurable===!1||G.enumerable===!1||G.writable===!1)&&ji();var t=g.get(s);return t===void 0?(t=U(()=>lI(G.value,Q)),g.set(s,t)):Y(t,U(()=>rI(G.value))),!0},deleteProperty(l,s){var G=g.get(s);if(G===void 0)s in l&&(g.set(s,U(()=>lI(Lg,Q))),Pt(F));else{if(B&&typeof s=="string"){var t=g.get("length"),c=Number(s);Number.isInteger(c)&&clI(rI(c?l[s]:Lg),Q)),g.set(s,t)),t!==void 0){var d=i(t);return d===Lg?void 0:d}return Reflect.get(l,s,G)},getOwnPropertyDescriptor(l,s){var G=Reflect.getOwnPropertyDescriptor(l,s);if(G&&"value"in G){var t=g.get(s);t&&(G.value=i(t))}else if(G===void 0){var c=g.get(s),d=c?.v;if(c!==void 0&&d!==Lg)return{enumerable:!0,configurable:!0,value:d,writable:!0}}return G},has(l,s){if(s===sC)return!0;var G=g.get(s),t=G!==void 0&&G.v!==Lg||Reflect.has(l,s);if(G!==void 0||LI!==null&&(!t||qC(l,s)?.writable)){G===void 0&&(G=U(()=>lI(t?rI(l[s]):Lg,Q)),g.set(s,G));var c=i(G);if(c===Lg)return!1}return t},set(l,s,G,t){var c=g.get(s),d=s in l;if(B&&s==="length")for(var b=G;blI(Lg,Q)),g.set(b+"",Z))}c===void 0?(!d||qC(l,s)?.writable)&&(c=U(()=>lI(void 0,Q)),Y(c,U(()=>rI(G))),g.set(s,c)):(d=c.v!==Lg,Y(c,U(()=>rI(G))));var e=Reflect.getOwnPropertyDescriptor(l,s);if(e?.set&&e.set.call(t,G),!d){if(B&&typeof s=="string"){var x=g.get("length"),a=Number(s);Number.isInteger(a)&&a>=x.v&&Y(x,a+1)}Pt(F)}return!0},ownKeys(l){i(F);var s=Reflect.ownKeys(l).filter(c=>{var d=g.get(c);return d===void 0||d.v!==Lg});for(var[G,t]of g)t.v!==Lg&&!(G in l)&&s.push(G);return s},setPrototypeOf(){Oi()}})}function Pt(C,I=1){Y(C,C.v+I)}function vQ(C){try{if(C!==null&&typeof C=="object"&&sC in C)return C[sC]}catch{}return C}function jt(C,I){return Object.is(vQ(C),vQ(I))}function RF(C){var I=2050,g=SI!==null&&(SI.f&2)!==0?SI:null;LI===null||g!==null&&(g.f&256)!==0?I|=256:LI.f|=1048576;let B={ctx:zI,deps:null,effects:null,equals:Hl,f:I,fn:C,reactions:null,rv:0,v:null,wv:0,parent:g??LI};return CI&&XB&&(B.created=jB("CreatedAt")),B}function BI(C){let I=RF(C);return vl(I),I}function KA(C){let I=RF(C);return I.equals=JQ,I}function Yl(C){var I=C.effects;if(I!==null){C.effects=null;for(var g=0;g0){let B=Array.from(zF);for(let F of B)(F.f&1024)!==0&&QC(F,4096),nF(F)&&TQ(F);zF.clear()}}return I}function jA(C,I=1){var g=i(C),B=I===1?g++:g--;return Y(C,g),B}function Cd(C,I){var g=C.reactions;if(g!==null)for(var B=tB(),F=g.length,Q=0;Q{C.indexOf=g,C.lastIndexOf=B,C.includes=F}}var Cc,Ad,OA,Ud,ld;function kl(){if(Cc===void 0){Cc=window,Ad=document,OA=/Firefox/.test(navigator.userAgent);var C=Element.prototype,I=Node.prototype,g=Text.prototype;Ud=qC(I,"firstChild").get,ld=qC(I,"nextSibling").get,zt(C)&&(C.__click=void 0,C.__className=void 0,C.__attributes=null,C.__style=void 0,C.__e=void 0),zt(g)&&(g.__t=void 0),CI&&(C.__svelte_meta=null,Qd())}}function hC(C=""){return document.createTextNode(C)}function Xg(C){return Ud.call(C)}function jg(C){return ld.call(C)}function O(C,I){if(!iI)return Xg(C);var g=Xg(RI);if(g===null)g=RI.appendChild(hC());else if(I&&g.nodeType!==3){var B=hC();return g?.before(B),tg(B),B}return tg(g),g}function yI(C,I){if(!iI){var g=Xg(C);return g instanceof Comment&&g.data===""?jg(g):g}if(I&&RI?.nodeType!==3){var B=hC();return RI?.before(B),tg(B),B}return RI}function v(C,I=1,g=!1){let B=iI?RI:C;for(var F;I--;)F=B,B=jg(B);if(!iI)return B;var Q=B?.nodeType;if(g&&Q!==3){var A=hC();return B===null?F?.after(A):B.before(A),tg(A),A}return tg(B),B}function _A(C){C.textContent=""}function td(C){LI===null&&SI===null&&wi(C),SI!==null&&(SI.f&256)!==0&&LI===null&&Ti(),KF&&Di(C)}function cZ(C,I){var g=I.last;g===null?I.last=I.first=C:(g.next=C,C.prev=g,I.last=C)}function jF(C,I,g,B=!0){var F=LI;if(CI)for(;F!==null&&(F.f&262144)!==0;)F=F.parent;var Q={ctx:zI,deps:null,nodes_start:null,nodes_end:null,f:C|2048,first:null,fn:I,last:null,next:null,parent:F,prev:null,teardown:null,transitions:null,wv:0};if(CI&&(Q.component_function=JC),g)try{TQ(Q),Q.f|=32768}catch(l){throw FC(Q),l}else I!==null&&wQ(Q);var A=g&&Q.deps===null&&Q.first===null&&Q.nodes_start===null&&Q.teardown===null&&(Q.f&1048704)===0;if(!A&&B&&(F!==null&&cZ(Q,F),SI!==null&&(SI.f&2)!==0)){var U=SI;(U.effects??=[]).push(Q)}return Q}function mC(C){let I=jF(8,null,!1);return QC(I,1024),I.teardown=C,I}function og(C){td("$effect");var I=LI!==null&&(LI.f&32)!==0&&zI!==null&&!zI.m;if(CI&&Pg(C,"name",{value:"$effect"}),I){var g=zI;(g.e??=[]).push({fn:C,effect:LI,reaction:SI})}else{var B=CC(C);return B}}function Ac(C){let I=jF(64,C,!0);return()=>{FC(I)}}function cd(C){let I=jF(64,C,!0);return(g={})=>new Promise(B=>{g.outro?wC(I,()=>{FC(I),B(void 0)}):(FC(I),B(void 0))})}function CC(C){return jF(4,C,!1)}function GC(C){return jF(8,C,!0)}function sI(C,I=[],g=RF){let B=I.map(g),F=()=>C(...B.map(i));return CI&&Pg(F,"name",{value:"{expression}"}),UC(F)}function UC(C,I=0){return jF(24|I,C,!0)}function Jg(C,I=!0){return jF(40,C,!0,I)}function Uc(C){var I=C.teardown;if(I!==null){let g=KF,B=SI;Bc(!0),Gg(null);try{I.call(null)}finally{Bc(g),Gg(B)}}}function lc(C,I=!1){var g=C.first;for(C.first=C.last=null;g!==null;){var B=g.next;(g.f&64)!==0?g.parent=null:FC(g,I),g=B}}function Gd(C){for(var I=C.first;I!==null;){var g=I.next;(I.f&32)===0&&FC(I),I=g}}function FC(C,I=!0){var g=!1;(I||(C.f&524288)!==0)&&C.nodes_start!==null&&(sc(C.nodes_start,C.nodes_end),g=!0),lc(C,I&&!g),$A(C,0),QC(C,16384);var B=C.transitions;if(B!==null)for(let Q of B)Q.stop();Uc(C);var F=C.parent;F!==null&&F.first!==null&&tc(C),CI&&(C.component_function=null),C.next=C.prev=C.teardown=C.ctx=C.deps=C.fn=C.nodes_start=C.nodes_end=null}function sc(C,I){for(;C!==null;){var g=C===I?null:jg(C);C.remove(),C=g}}function tc(C){var I=C.parent,g=C.prev,B=C.next;g!==null&&(g.next=B),B!==null&&(B.prev=g),I!==null&&(I.first===C&&(I.first=B),I.last===C&&(I.last=g))}function wC(C,I){var g=[];Tl(C,g,!0),cc(g,()=>{FC(C),I&&I()})}function cc(C,I){var g=C.length;if(g>0){var B=()=>--g||I();for(var F of C)F.out(B)}else I()}function Tl(C,I,g){if((C.f&8192)===0){if(C.f^=8192,C.transitions!==null)for(let A of C.transitions)(A.is_global||g)&&I.push(A);for(var B=C.first;B!==null;){var F=B.next,Q=(B.f&65536)!==0||(B.f&32)!==0;Tl(B,I,Q?g:!1),B=F}}}function aF(C){id(C,!0)}function id(C,I){if((C.f&8192)!==0){C.f^=8192,(C.f&1024)===0&&(C.f^=1024),nF(C)&&(QC(C,2048),wQ(C));for(var g=C.first;g!==null;){var B=g.next,F=(g.f&65536)!==0||(g.f&32)!==0;id(g,F?I:!1),g=B}if(C.transitions!==null)for(let Q of C.transitions)(Q.is_global||I)&&Q.in()}}var GZ=typeof requestIdleCallback>"u"?C=>setTimeout(C,1):requestIdleCallback,IU=[],gU=[];function dd(){var C=IU;IU=[],JA(C)}function bd(){var C=gU;gU=[],JA(C)}function XC(C){IU.length===0&&queueMicrotask(dd),IU.push(C)}function Zd(C){gU.length===0&&GZ(bd),gU.push(C)}function Gc(){IU.length>0&&dd(),gU.length>0&&bd()}var ed=new WeakSet,wl=!1,FU=!1,CU=null,OF=!1,KF=!1;function Bc(C){KF=C}var BU=[],bc=[],SI=null,IB=!1;function Gg(C){SI=C}var LI=null;function Sg(C){LI=C}var oB=null;function vl(C){SI!==null&&SI.f&2097152&&(oB===null?oB=[C]:oB.push(C))}var iC=null,fC=0,kC=null;function Bd(C){kC=C}var Ld=1,zl=0,OB=!1,wA=null;function PA(){return++Ld}function nF(C){var I=C.f;if((I&2048)!==0)return!0;if((I&4096)!==0){var g=C.deps,B=(I&256)!==0;if(g!==null){var F,Q,A=(I&512)!==0,U=B&&LI!==null&&!OB,l=g.length;if(A||U){var s=C,G=s.parent;for(F=0;FC.wv)return!0}(!B||LI!==null&&!OB)&&QC(C,1024)}return!1}function iZ(C,I){for(var g=I;g!==null;){if((g.f&128)!==0)try{g.fn(C);return}catch{g.f^=128}g=g.parent}throw wl=!1,C}function Vd(C){return(C.f&16384)===0&&(C.parent===null||(C.parent.f&128)===0)}function MQ(C,I,g,B){if(wl){if(g===null&&(wl=!1),Vd(I))throw C;return}if(g!==null&&(wl=!0),CI&&B!==null&&C instanceof Error&&!ed.has(C)){ed.add(C);let Q=[],A=I.fn?.name;A&&Q.push(A);let U=B;for(;U!==null;){var F=U.function?.[YC];if(F){let G=F.split("/").pop();Q.push(G)}U=U.p}let l=OA?" ":" ";Pg(C,"message",{value:C.message+` +${Q.map(G=>` +${l}in ${G}`).join("")} +`}),Pg(C,"component_stack",{value:Q});let s=C.stack;if(s){let G=s.split(` +`),t=[];for(let c=0;c0)for(t.length=fC+iC.length,c=0;c0;){I++>1e3&&bZ();var g=BU,B=g.length;BU=[];for(var F=0;F0;)FU=!0,dc(),Gc();return I}async function PQ(){await Promise.resolve(),KQ()}function i(C){var I=C.f,g=(I&2)!==0;if(wA!==null&&wA.add(C),SI!==null&&!IB){if(!oB?.includes(C)){var B=SI.deps;C.rv>>0).toString(36)}var uZ=["allowfullscreen","async","autofocus","autoplay","checked","controls","default","disabled","formnovalidate","hidden","indeterminate","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","seamless","selected","webkitdirectory","defer","disablepictureinpicture","disableremoteplayback"];var To=[...uZ,"formNoValidate","isMap","noModule","playsInline","readOnly","value","volume","defaultValue","defaultChecked","srcObject","noValidate","allowFullscreen","disablePictureInPicture","disableRemotePlayback"];var LZ=["touchstart","touchmove"];function ad(C){return LZ.includes(C)}function Pl(C){return C?.replace(/\//g,"/\u200B")}var md=new Map;function hd(C,I){var g=md.get(C);g||(g=new Set,md.set(C,g)),g.add(I)}var Xd=!1;function jl(){Xd||(Xd=!0,document.addEventListener("reset",C=>{Promise.resolve().then(()=>{if(!C.defaultPrevented)for(let I of C.target.elements)I.__on_r?.()})},{capture:!0}))}function jQ(C){var I=SI,g=LI;Gg(null),Sg(null);try{return C()}finally{Gg(I),Sg(g)}}function Zc(C,I,g,B=g){C.addEventListener(I,()=>jQ(g));let F=C.__on_r;F?C.__on_r=()=>{F(),B(!0)}:C.__on_r=()=>B(!0),jl()}var ec=new Set,Ol=new Set;function od(C,I,g,B={}){function F(Q){if(B.capture||OQ.call(I,Q),!Q.cancelBubble)return jQ(()=>g?.call(this,Q))}return C.startsWith("pointer")||C.startsWith("touch")||C==="wheel"?XC(()=>{I.addEventListener(C,F,B)}):I.addEventListener(C,F,B),F}function vg(C,I,g,B,F){var Q={capture:B,passive:F},A=od(C,I,g,Q);(I===document.body||I===window||I===document)&&mC(()=>{I.removeEventListener(C,A,Q)})}function KI(C){for(var I=0;I{throw a});throw c}}finally{C.__root=I,delete C.currentTarget,Gg(G),Sg(t)}}}var RZ;function yd(){RZ=void 0}function QU(C){var I=document.createElement("template");return I.innerHTML=C,I.content}function oC(C,I){var g=LI;g.nodes_start===null&&(g.nodes_start=C,g.nodes_end=I)}function f(C,I){var g=(I&1)!==0,B=(I&2)!==0,F,Q=!C.startsWith("");return()=>{if(iI)return oC(RI,null),RI;F===void 0&&(F=QU(Q?C:""+C),g||(F=Xg(F)));var A=B||OA?document.importNode(F,!0):F.cloneNode(!0);if(g){var U=Xg(A),l=A.lastChild;oC(U,l)}else oC(A,A);return A}}function Vc(C=""){if(!iI){var I=hC(C+"");return oC(I,I),I}var g=RI;return g.nodeType!==3&&(g.before(g=hC()),tg(g)),oC(g,g),g}function Ng(){if(iI)return oC(RI,null),RI;var C=document.createDocumentFragment(),I=document.createComment(""),g=hC();return C.append(I,g),oC(I,g),C}function D(C,I){if(iI){LI.nodes_end=RI,hg();return}C!==null&&C.before(I)}var _l=!0;function vI(C,I){var g=I==null?"":typeof I=="object"?I+"":I;g!==(C.__t??=C.nodeValue)&&(C.__t=g,C.nodeValue=g+"")}function yB(C,I){return Sd(C,I)}function uc(C,I){kl(),I.intro=I.intro??!1;let g=I.target,B=iI,F=RI;try{for(var Q=Xg(g);Q&&(Q.nodeType!==8||Q.data!==uF);)Q=jg(Q);if(!Q)throw PB;AC(!0),tg(Q),hg();let A=Sd(C,{...I,anchor:Q});if(RI===null||RI.nodeType!==8||RI.data!==fF)throw PB;return AC(!1),A}catch(A){if(A===PB)return I.recover===!1&&zi(),kl(),_A(g),AC(!1),yB(C,I);throw A}finally{AC(B),tg(F),yd()}}var _Q=new Map;function Sd(C,{target:I,anchor:g,props:B={},events:F,context:Q,intro:A=!0}){kl();var U=new Set,l=t=>{for(var c=0;c{var t=g??I.appendChild(hC());return Jg(()=>{if(Q){VI({});var c=zI;c.c=Q}F&&(B.$$events=F),iI&&oC(t,null),_l=A,s=C(t,B)||{},_l=!0,iI&&(LI.nodes_end=RI),Q&&xI()}),()=>{for(var c of U){I.removeEventListener(c,OQ);var d=_Q.get(c);--d===0?(document.removeEventListener(c,OQ),_Q.delete(c)):_Q.set(c,d)}Ol.delete(l),t!==g&&t.parentNode?.removeChild(t)}});return xc.set(s,G),s}var xc=new WeakMap;function $B(C,I){let g=xc.get(C);return g?(xc.delete(C),g(I)):(CI&&void 0,Promise.resolve())}function GI(C,I,[g,B]=[0,0]){iI&&g===0&&hg();var F=C,Q=null,A=null,U=Lg,l=g>0?65536:0,s=!1;let G=(c,d=!0)=>{s=!0,t(d,c)},t=(c,d)=>{if(U===(U=c))return;let b=!1;if(iI&&B!==-1){if(g===0){let e=F.data;e===uF?B=0:e===LF?B=1/0:(B=parseInt(e.substring(1)),B!==B&&(B=U?1/0:-1))}let Z=B>g;!!U===Z&&(F=PF(),tg(F),AC(!1),b=!0,B=-1)}U?(Q?aF(Q):d&&(Q=Jg(()=>d(F))),A&&wC(A,()=>{A=null})):(A?aF(A):d&&(A=Jg(()=>d(F,[g+1,B]))),Q&&wC(Q,()=>{Q=null})),b&&AC(!0)};UC(()=>{s=!1,I(G),s||t(null,null)},l),iI&&(F=RI)}function qQ(C,I,g){iI&&hg();var B=C,F=Lg,Q,A=tB()?vi:YQ;UC(()=>{A(F,F=I())&&(Q&&wC(Q),Q=Jg(()=>g(B)))}),iI&&(B=RI)}var AU=null;function Qg(C,I){return I}function oZ(C,I,g,B){for(var F=[],Q=I.length,A=0;A0&&F.length===0&&g!==null;if(U){var l=g.parentNode;_A(l),l.append(g),B.clear(),mF(C,I[0].prev,I[Q-1].next)}cc(F,()=>{for(var s=0;s{var d=g();return _C(d)?d:d==null?[]:YA(d)});UC(()=>{var d=i(c),b=d.length;if(t&&b===0)return;t=b===0;let Z=!1;if(iI){var e=A.data===LF;e!==(b===0)&&(A=PF(),tg(A),AC(!1),Z=!0)}if(iI){for(var x=null,a,n=0;n0&&tg(PF())}iI||yZ(d,U,A,F,I,B,g),Q!==null&&(b===0?G?aF(G):G=Jg(()=>Q(A)):G!==null&&wC(G,()=>{G=null})),Z&&AC(!0),i(c)}),iI&&(A=RI)}function yZ(C,I,g,B,F,Q,A){var U=(F&8)!==0,l=(F&3)!==0,s=C.length,G=I.items,t=I.first,c=t,d,b=null,Z,e=[],x=[],a,n,h,m;if(U)for(m=0;m0){var T=(F&4)!==0&&s===0?g:null;if(U){for(m=0;m{if(Z!==void 0)for(h of Z)h.a?.apply()}),LI.first=I.first&&I.first.e,LI.last=b&&b.e}function SZ(C,I,g,B){(B&1)!==0&&DQ(C.v,I),(B&2)!==0?DQ(C.i,g):C.i=g}function Nd(C,I,g,B,F,Q,A,U,l,s){var G=AU,t=(l&1)!==0,c=(l&16)===0,d=t?c?qB(F):Wg(F):F,b=(l&2)===0?A:Wg(A);CI&&t&&(d.debug=()=>{var e=typeof b=="number"?A:b.v;s()[e]});var Z={i:b,v:d,k:Q,a:null,e:null,prev:g,next:B};AU=Z;try{return Z.e=Jg(()=>U(C,d,b,s),iI),Z.e.prev=g&&g.e,Z.e.next=B&&B.e,g===null?I.first=Z:(g.next=Z,g.e.next=Z.e),B!==null&&(B.prev=Z,B.e.prev=Z.e),Z}finally{AU=G}}function Wd(C,I,g){for(var B=C.next?C.next.e.nodes_start:g,F=I?I.e.nodes_start:g,Q=C.e.nodes_start;Q!==B;){var A=jg(Q);F.before(Q),Q=A}}function mF(C,I,g){I===null?C.first=g:(I.next=g,I.e.next=g&&g.e),g!==null&&(g.prev=I,g.e.prev=I&&I.e)}function WZ(C,I,g){if(!I||I===nd(String(g??"")))return;let B,F=C.__svelte_meta?.loc;F?B=`near ${F.file}:${F.line}:${F.column}`:JC?.[YC]&&(B=`in ${JC[YC]}`),Pl(B)}function _F(C,I,g=!1,B=!1,F=!1){var Q=C,A="";sI(()=>{var U=LI;if(A===(A=I()??"")){iI&&hg();return}if(U.nodes_start!==null&&(sc(U.nodes_start,U.nodes_end),U.nodes_start=U.nodes_end=null),A!==""){if(iI){for(var l=RI.data,s=hg(),G=s;s!==null&&(s.nodeType!==8||s.data!=="");)G=s,s=jg(s);if(s===null)throw PB;CI&&!F&&WZ(s.parentNode,l,A),oC(RI,G),Q=tg(s);return}var t=A+"";g?t=`${t}`:B&&(t=`${t}`);var c=QU(t);if((g||B)&&(c=Xg(c)),oC(Xg(c),c.lastChild),g||B)for(;Xg(c);)Q.before(Xg(c));else Q.before(c)}})}function yC(C,I,...g){var B=C,F=mg,Q;UC(()=>{F!==(F=I())&&(Q&&(FC(Q),Q=null),CI&&F==null&&Mi(),Q=Jg(()=>F(B,...g)))},65536),iI&&(B=RI)}function nc(C,I,g){iI&&hg();var B=C,F,Q;UC(()=>{F!==(F=I())&&(Q&&(wC(Q),Q=null),F&&(Q=Jg(()=>g(B,F))))},65536),iI&&(B=RI)}function IF(C,I){XC(()=>{var g=C.getRootNode(),B=g.host?g:g.head??g.ownerDocument.head;if(!B.querySelector("#"+I.hash)){let F=document.createElement("style");F.id=I.hash,F.textContent=I.code,B.appendChild(F),CI&&hd(I.hash,F)}})}function ql(C,I,g){CC(()=>{var B=Cg(()=>I(C,g?.())||{});if(g&&B?.update){var F=!1,Q={};GC(()=>{var A=g();Kl(A),F&&YQ(Q,A)&&(Q=A,B.update(A))}),F=!0}if(B?.destroy)return()=>B.destroy()})}function rd(C){var I,g,B="";if(typeof C=="string"||typeof C=="number")B+=C;else if(typeof C=="object")if(Array.isArray(C)){var F=C.length;for(I=0;I=0;){var U=A+Q;(A===0||Hd.includes(B[A-1]))&&(U===B.length||Hd.includes(B[U]))?B=(A===0?"":B.substring(0,A))+B.substring(U+1):A=U}}return B===""?null:B}function Yd(C,I=!1){var g=I?" !important;":";",B="";for(var F in C){var Q=C[F];Q!=null&&Q!==""&&(B+=" "+F+": "+Q+g)}return B}function ac(C){return C[0]!=="-"||C[1]!=="-"?C.toLowerCase():C}function vd(C,I){if(I){var g="",B,F;if(Array.isArray(I)?(B=I[0],F=I[1]):B=I,C){C=String(C).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var Q=!1,A=0,U=!1,l=[];B&&l.push(...Object.keys(B).map(ac)),F&&l.push(...Object.keys(F).map(ac));var s=0,G=-1;let Z=C.length;for(var t=0;t{if(!I){if(I=!0,C.hasAttribute("value")){var B=C.value;pI(C,"value",null),C.value=B}if(C.hasAttribute("checked")){var F=C.checked;pI(C,"checked",null),C.checked=F}}};C.__on_r=g,Zd(g),jl()}}function hF(C,I){var g=Td(C);g.value===(g.value=I??void 0)||C.value===I&&(I!==0||C.nodeName!=="PROGRESS")||(C.value=I??"")}function pI(C,I,g,B){var F=Td(C);if(iI&&(F[I]=C.getAttribute(I),I==="src"||I==="srcset"||I==="href"&&C.nodeName==="LINK")){B||DZ(C,I,g??"");return}F[I]!==(F[I]=g)&&(I==="loading"&&(C[Ji]=g),g==null?C.removeAttribute(I):typeof g!="string"&&kZ(C).includes(I)?C[I]=g:C.setAttribute(I,g))}function Td(C){return C.__attributes??={[JZ]:C.nodeName.includes("-"),[vZ]:C.namespaceURI===$i}}var kd=new Map;function kZ(C){var I=kd.get(C.nodeName);if(I)return I;kd.set(C.nodeName,I=[]);for(var g,B=C,F=Element.prototype;F!==B;){g=rl(B);for(var Q in g)g[Q].set&&I.push(Q);B=xF(B)}return I}function DZ(C,I,g){CI&&(I==="srcset"&&TZ(C,g)||hc(C.getAttribute(I)??"",g)||(C.outerHTML.replace(C.innerHTML,C.innerHTML&&"..."),String(g),void 0))}function hc(C,I){return C===I?!0:new URL(C,document.baseURI).href===new URL(I,document.baseURI).href}function Dd(C){return C.split(",").map(I=>I.trim().split(" ").filter(Boolean))}function TZ(C,I){var g=Dd(C.srcset),B=Dd(I);return B.length===g.length&&B.every(([F,Q],A)=>Q===g[A][1]&&(hc(g[A][0],F)||hc(F,g[A][0])))}var wZ=Nl?()=>performance.now():()=>Date.now(),iB={tick:C=>(Nl?requestAnimationFrame:mg)(C),now:()=>wZ(),tasks:new Set};function wd(){let C=iB.now();iB.tasks.forEach(I=>{I.c(C)||(iB.tasks.delete(I),I.f())}),iB.tasks.size!==0&&iB.tick(wd)}function fd(C){let I;return iB.tasks.size===0&&iB.tick(wd),{promise:new Promise(g=>{iB.tasks.add(I={c:C,f:g})}),abort(){iB.tasks.delete(I)}}}function $l(C,I){jQ(()=>{C.dispatchEvent(new CustomEvent(I))})}function KZ(C){if(C==="float")return"cssFloat";if(C==="offset")return"cssOffset";if(C.startsWith("--"))return C;let I=C.split("-");return I.length===1?I[0]:I[0]+I.slice(1).map(g=>g[0].toUpperCase()+g.slice(1)).join("")}function zd(C){let I={},g=C.split(";");for(let B of g){let[F,Q]=B.split(":");if(!F||Q===void 0)break;let A=KZ(F.trim());I[A]=Q.trim()}return I}var PZ=C=>C;function _g(C,I,g,B){var F=(C&1)!==0,Q=(C&2)!==0,A=F&&Q,U=(C&4)!==0,l=A?"both":F?"in":"out",s,G=I.inert,t=I.style.overflow,c,d;function b(){var n=SI,h=LI;Gg(null),Sg(null);try{return s??=g()(I,B?.()??{},{direction:l})}finally{Gg(n),Sg(h)}}var Z={is_global:U,in(){if(I.inert=G,!F){d?.abort(),d?.reset?.();return}Q||c?.abort(),$l(I,"introstart"),c=Xc(I,b(),d,1,()=>{$l(I,"introend"),c?.abort(),c=s=void 0,I.style.overflow=t})},out(n){if(!Q){n?.(),s=void 0;return}I.inert=!0,$l(I,"outrostart"),d=Xc(I,b(),c,0,()=>{$l(I,"outroend"),n?.()})},stop:()=>{c?.abort(),d?.abort()}},e=LI;if((e.transitions??=[]).push(Z),F&&_l){var x=U;if(!x){for(var a=e.parent;a&&(a.f&65536)!==0;)for(;(a=a.parent)&&(a.f&16)===0;);x=!a||(a.f&32768)!==0}x&&CC(()=>{Cg(()=>Z.in())})}}function Xc(C,I,g,B,F){var Q=B===1;if(Mt(I)){var A,U=!1;return XC(()=>{if(!U){var e=I({direction:Q?"in":"out"});A=Xc(C,e,g,B,F)}}),{abort:()=>{U=!0,A?.abort()},deactivate:()=>A.deactivate(),reset:()=>A.reset(),t:()=>A.t()}}if(g?.deactivate(),!I?.duration)return F(),{abort:mg,deactivate:mg,reset:mg,t:()=>B};let{delay:l=0,css:s,tick:G,easing:t=PZ}=I;var c=[];if(Q&&g===void 0&&(G&&G(0,1),s)){var d=zd(s(0,1));c.push(d,d)}var b=()=>1-B,Z=C.animate(c,{duration:l});return Z.onfinish=()=>{var e=g?.t()??1-B;g?.abort();var x=B-e,a=I.duration*Math.abs(x),n=[];if(a>0){var h=!1;if(s)for(var m=Math.ceil(a/16.666666666666668),L=0;L<=m;L+=1){var R=e+x*t(L/m),o=zd(s(R,1-R));n.push(o),h||=o.overflow==="hidden"}h&&(C.style.overflow="hidden"),b=()=>{var y=Z.currentTime;return e+x*t(y/a)},G&&fd(()=>{if(Z.playState!=="running")return!1;var y=b();return G(y,1-y),!0})}Z=C.animate(n,{duration:a,fill:"forwards"}),Z.onfinish=()=>{b=()=>B,G?.(B,1-B),F()}},{abort:()=>{Z&&(Z.cancel(),Z.effect=null,Z.onfinish=mg)},deactivate:()=>{F=mg},reset:()=>{B===0&&G?.(1,0)},t:()=>b()}}function Sc(C,I,g=I){var B=tB();Zc(C,"input",F=>{CI&&C.type==="checkbox"&&Kt();var Q=F?C.defaultValue:C.value;if(Q=oc(C)?yc(Q):Q,g(Q),B&&Q!==(Q=I())){var A=C.selectionStart,U=C.selectionEnd;C.value=Q??"",U!==null&&(C.selectionStart=A,C.selectionEnd=Math.min(U,C.value.length))}}),(iI&&C.defaultValue!==C.value||Cg(I)==null&&C.value)&&g(oc(C)?yc(C.value):C.value),GC(()=>{CI&&C.type==="checkbox"&&Kt();var F=I();oc(C)&&F===yc(C.value)||C.type==="date"&&!F&&!C.value||F!==C.value&&(C.value=F??"")})}function oc(C){var I=C.type;return I==="number"||I==="range"}function yc(C){return C===""?null:+C}function UU(C,I,g){if(C.multiple)return jZ(C,I);for(var B of C.options){var F=Md(B);if(jt(F,I)){B.selected=!0;return}}(!g||I!==void 0)&&(C.selectedIndex=-1)}function Wc(C,I){let g=!0;CC(()=>{I&&UU(C,Cg(I),g),g=!1;var B=new MutationObserver(()=>{var F=C.__value;UU(C,F)});return B.observe(C,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),()=>{B.disconnect()}})}function jZ(C,I){for(var g of C.options)g.selected=~I.indexOf(Md(g))}function Md(C){return"__value"in C?C.__value:C.value}var Ec=class C{#I=new WeakMap;#g;#C;static entries=new WeakMap;constructor(I){this.#C=I}observe(I,g){var B=this.#I.get(I)||new Set;return B.add(g),this.#I.set(I,B),this.#B().observe(I,this.#C),()=>{var F=this.#I.get(I);F.delete(g),F.size===0&&(this.#I.delete(I),this.#g.unobserve(I))}}#B(){return this.#g??(this.#g=new ResizeObserver(I=>{for(var g of I){C.entries.set(g.target,g);for(var B of this.#I.get(g.target)||[])B(g)}}))}};var OZ=new Ec({box:"border-box"});function gs(C,I,g){var B=OZ.observe(C,()=>g(C[I]));CC(()=>(Cg(()=>g(C[I])),B))}function Kd(C,I){return C===I||C?.[sC]===I}function dB(C={},I,g,B){return CC(()=>{var F,Q;return GC(()=>{F=Q,Q=B?.()||[],Cg(()=>{C!==g(...Q)&&(I(C,...Q),F&&Kd(g(...F),C)&&I(null,...F))})}),()=>{XC(()=>{Q&&Kd(g(...Q),C)&&I(null,...Q)})}}),C}var Cs=!1,ir=Symbol();function rc(C){var I=Cs;try{return Cs=!1,[C(),Cs]}finally{Cs=I}}function jd(C){return C.ctx?.d??!1}function J(C,I,g,B){var F=(g&1)!==0,Q=!KB||(g&2)!==0,A=(g&8)!==0,U=(g&16)!==0,l=!1,s;A?[s,l]=rc(()=>C[I]):s=C[I];var G=sC in C||vA in C,t=A&&(qC(C,I)?.set??(G&&I in C&&(R=>C[I]=R)))||void 0,c=B,d=!0,b=!1,Z=()=>(b=!0,d&&(d=!1,U?c=Cg(B):c=B),c);s===void 0&&B!==void 0&&(t&&Q&&Ki(I),s=Z(),t&&t(s));var e;if(Q)e=()=>{var R=C[I];return R===void 0?Z():(d=!0,b=!1,R)};else{var x=(F?RF:KA)(()=>C[I]);x.f|=131072,e=()=>{var R=i(x);return R!==void 0&&(c=void 0),R===void 0?c:R}}if((g&4)===0)return e;if(t){var a=C.$$legacy;return function(R,o){return arguments.length>0?((!Q||!o||a||l)&&t(o?e():R),R):e()}}var n=!1,h=!1,m=qB(s),L=RF(()=>{var R=e(),o=i(m);return n?(n=!1,h=!0,o):(h=!1,m.v=R)});return A&&i(L),F||(L.equals=JQ),function(R,o){if(wA!==null&&(n=h,e(),i(m)),arguments.length>0){let y=o?i(L):Q&&A?rI(R):R;if(!L.equals(y)){if(n=!0,Y(m,y),b&&c!==void 0&&(c=y),jd(L))return R;Cg(()=>i(L))}return R}return jd(L)?L.v:i(L)}}function Od(C){return new pc(C)}var pc=class{#I;#g;constructor(I){var g=new Map,B=(Q,A)=>{var U=qB(A);return g.set(Q,U),U};let F=new Proxy({...I.props||{},$$events:{}},{get(Q,A){return i(g.get(A)??B(A,Reflect.get(Q,A)))},has(Q,A){return A===vA?!0:(i(g.get(A)??B(A,Reflect.get(Q,A))),Reflect.has(Q,A))},set(Q,A,U){return Y(g.get(A)??B(A,U),U),Reflect.set(Q,A,U)}});this.#g=(I.hydrate?uc:yB)(I.component,{target:I.target,anchor:I.anchor,props:F,context:I.context,intro:I.intro??!1,recover:I.recover}),(!I?.props?.$$host||I.sync===!1)&&KQ(),this.#I=F.$$events;for(let Q of Object.keys(this.#g))Q==="$set"||Q==="$destroy"||Q==="$on"||Pg(this,Q,{get(){return this.#g[Q]},set(A){this.#g[Q]=A},enumerable:!0});this.#g.$set=Q=>{Object.assign(F,Q)},this.#g.$destroy=()=>{$B(this.#g)}}$set(I){this.#g.$set(I)}$on(I,g){this.#I[I]=this.#I[I]||[];let B=(...F)=>g.call(this,...F);return this.#I[I].push(B),()=>{this.#I[I]=this.#I[I].filter(F=>F!==B)}}$destroy(){this.#g.$destroy()}};var se;typeof HTMLElement=="function"&&(se=class extends HTMLElement{$$ctor;$$s;$$c;$$cn=!1;$$d={};$$r=!1;$$p_d={};$$l={};$$l_u=new Map;$$me;constructor(C,I,g){super(),this.$$ctor=C,this.$$s=I,g&&this.attachShadow({mode:"open"})}addEventListener(C,I,g){if(this.$$l[C]=this.$$l[C]||[],this.$$l[C].push(I),this.$$c){let B=this.$$c.$on(C,I);this.$$l_u.set(I,B)}super.addEventListener(C,I,g)}removeEventListener(C,I,g){if(super.removeEventListener(C,I,g),this.$$c){let B=this.$$l_u.get(I);B&&(B(),this.$$l_u.delete(I))}}async connectedCallback(){if(this.$$cn=!0,!this.$$c){let C=function(B){return F=>{let Q=document.createElement("slot");B!=="default"&&(Q.name=B),D(F,Q)}};if(await Promise.resolve(),!this.$$cn||this.$$c)return;let I={},g=te(this);for(let B of this.$$s)B in g&&(B==="default"&&!this.$$d.children?(this.$$d.children=C(B),I.default=!0):I[B]=C(B));for(let B of this.attributes){let F=this.$$g_p(B.name);F in this.$$d||(this.$$d[F]=Hc(F,B.value,this.$$p_d,"toProp"))}for(let B in this.$$p_d)!(B in this.$$d)&&this[B]!==void 0&&(this.$$d[B]=this[B],delete this[B]);this.$$c=Od({component:this.$$ctor,target:this.shadowRoot||this,props:{...this.$$d,$$slots:I,$$host:this}}),this.$$me=Ac(()=>{GC(()=>{this.$$r=!0;for(let B of ft(this.$$c)){if(!this.$$p_d[B]?.reflect)continue;this.$$d[B]=this.$$c[B];let F=Hc(B,this.$$d[B],this.$$p_d,"toAttribute");F==null?this.removeAttribute(this.$$p_d[B].attribute||B):this.setAttribute(this.$$p_d[B].attribute||B,F)}this.$$r=!1})});for(let B in this.$$l)for(let F of this.$$l[B]){let Q=this.$$c.$on(B,F);this.$$l_u.set(F,Q)}this.$$l={}}}attributeChangedCallback(C,I,g){this.$$r||(C=this.$$g_p(C),this.$$d[C]=Hc(C,g,this.$$p_d,"toProp"),this.$$c?.$set({[C]:this.$$d[C]}))}disconnectedCallback(){this.$$cn=!1,Promise.resolve().then(()=>{!this.$$cn&&this.$$c&&(this.$$c.$destroy(),this.$$me(),this.$$c=void 0)})}$$g_p(C){return ft(this.$$p_d).find(I=>this.$$p_d[I].attribute===C||!this.$$p_d[I].attribute&&I.toLowerCase()===C)||C}});function Hc(C,I,g,B){let F=g[C]?.type;if(I=F==="Boolean"&&typeof I!="boolean"?I!=null:I,!B||!g[C])return I;if(B==="toAttribute")switch(F){case"Object":case"Array":return I==null?null:JSON.stringify(I);case"Boolean":return I?"":null;case"Number":return I??null;default:return I}else switch(F){case"Object":case"Array":return I&&JSON.parse(I);case"Boolean":return I;case"Number":return I!=null?+I:I;default:return I}}function te(C){let I={};return C.childNodes.forEach(g=>{I[g.slot||"default"]=!0}),I}if(CI){let C=function(I){if(!(I in globalThis)){let g;Object.defineProperty(globalThis,I,{configurable:!0,get:()=>{if(g!==void 0)return g;Pi(I)},set:B=>{g=B}})}};C("$state"),C("$effect"),C("$derived"),C("$inspect"),C("$props"),C("$bindable")}function CF(C){zI===null&&fA("onMount"),KB&&zI.l!==null?Ge(zI).m.push(C):og(()=>{let I=Cg(C);if(typeof I=="function")return I})}function _d(C){zI===null&&fA("onDestroy"),CF(()=>()=>Cg(C))}function Ge(C){var I=C.l;return I.u??={a:[],b:[],m:[]}}var qd="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(qd);var ie=f("
"),de=f("");function dC(C,I){let g=J(I,"text",3,""),B=J(I,"icon",3,""),F=J(I,"tooltip",3,""),Q=J(I,"size",3,null),A=J(I,"onClick",3,()=>{}),U=J(I,"class",3,"");var l=de();let s;l.__click=function(...b){A()?.apply(this,b)};var G=O(l);{var t=b=>{var Z=ie(),e=O(Z,!0);z(Z),sI(()=>vI(e,g())),D(b,Z)};GI(G,b=>{g()&&b(t)})}var c=v(G,2);{var d=b=>{lC(b,{get icon(){return B()},get size(){return Q()}})};GI(c,b=>{B()&&b(d)})}z(l),sI(b=>{s=nI(l,1,Og(U()),null,s,b),pI(l,"aria-label",F())},[()=>({"svelcomlib-icon-text":B()})]),D(C,l)}KI(["click"]);var be=(C,I)=>I()(C.target.value,C.target),Ze=f(""),ee=f("");function bB(C,I){VI(I,!0);let g=J(I,"onChange",3,()=>{}),B=J(I,"options",19,()=>[]),F=J(I,"value",3,""),Q=J(I,"disabled",3,!1),A=J(I,"class",3,"");var U=ee();U.__change=[be,g],Wc(U,F);var l;qI(U,21,B,Qg,(s,G,t,c)=>{let d=()=>i(G).value,b=()=>i(G).text;var Z=Ze(),e={},x=O(Z,!0);z(Z),sI(()=>{e!==(e=d())&&(Z.value=(Z.__value=d())??""),vI(x,b())}),D(s,Z)}),z(U),sI(()=>{nI(U,1,Og(A()?A()+" dropdown":"dropdown")),U.disabled=Q(),l!==(l=F())&&(U.value=(U.__value=F())??"",UU(U,F()))}),D(C,U),xI()}KI(["change"]);var $d=require("obsidian");function lC(C,I){VI(I,!0);let g=J(I,"icon",3,""),B=J(I,"size",3,null),F=J(I,"stroke_width",3,null),Q=J(I,"class",3,""),A=lI(null);og(()=>{g().startsWith("{i(A)&&B()&&(typeof B()=="number"?(i(A).style.width=B()+"px",i(A).style.height=B()+"px"):Array.isArray(B())?(i(A).style.width=B()[0]+"px",i(A).style.height=B()[1]+"px"):(i(A).style.width=`var(--${B()})`,i(A).style.height=`var(--${B()})`))}),og(()=>{i(A)&&F()&&(i(A).style.strokeWidth=F()+"px")});var U=Ng(),l=yI(U);_F(l,()=>i(A)?.outerHTML??""),D(C,U),xI()}var Ve=(C,I)=>I()(C.target.value),xe=f("");function qF(C,I){VI(I,!0);let g=J(I,"type",3,"text"),B=J(I,"value",3,""),F=J(I,"placeholder",3,""),Q=J(I,"onChange",3,()=>{}),A=J(I,"valid",3,!1),U=J(I,"readonly",3,!1),l=J(I,"class",3,"");var s=xe();gF(s),s.__input=[Ve,Q];let G;sI(t=>{pI(s,"type",g()),hF(s,B()),pI(s,"placeholder",F()),s.readOnly=U(),G=nI(s,1,Og(l()),null,G,t)},[()=>({"svelcomlib-input-success":A(),"svelcomlib-input-fail":A()===!1})]),D(C,s),xI()}KI(["input"]);var ue=(C,I,g)=>{I()(g())},Le=f('');function $F(C,I){VI(I,!0);let g=J(I,"min",3,0),B=J(I,"max",3,100),F=J(I,"step",3,1),Q=J(I,"value",7,0),A=J(I,"onChange",3,()=>{}),U=J(I,"getTooltip",3,s=>s.toString());var l=Le();gF(l),l.__input=()=>{let s=document.body.lastChild;s.classList.contains("tooltip")&&(s.firstChild.textContent=U()(Q()),s.style.width="auto")},l.__change=[ue,A,Q],sI(s=>{pI(l,"min",g()),pI(l,"max",B()),pI(l,"step",F()),pI(l,"aria-label",s)},[()=>U()(Q())]),Sc(l,Q),D(C,l),xI()}KI(["input","change"]);var jY=f("");KI(["change","contextmenu"]);var Re=(C,I,g,B)=>{I()||g()(!B()),B(!B())},ne=f('
');function EI(C,I){VI(I,!0);let g=J(I,"value",7,!1),B=J(I,"onChange",3,()=>{}),F=J(I,"disabled",3,!1);var Q=ne();let A;Q.__click=[Re,F,B,g];var U=O(Q);z(Q),sI(l=>{A=nI(Q,1,"checkbox-container",null,A,l),U.disabled=F()},[()=>({"is-enabled":g()})]),D(C,Q),xI()}KI(["click"]);var g1=f(''),C1=f(' '),B1=f('
');KI(["click"]);var A1=f('
');var ae=(C,I,g,B)=>{I((I()+1)%g().length),B()()},me=f("
");function XF(C,I){VI(I,!0);let g=J(I,"states",19,()=>[]),B=J(I,"value",15,0),F=J(I,"size",3,null),Q=J(I,"onClick",3,()=>{}),A=J(I,"onContextMenu",3,()=>{}),U=J(I,"class",3,"");var l=me();l.__click=[ae,B,g,Q],l.__contextmenu=function(...d){A()?.apply(this,d)};var s=O(l);{var G=d=>{lC(d,{get icon(){return g()[B()].icon},get size(){return F()}})};GI(s,d=>{g()[B()].icon&&d(G)})}var t=v(s,2);{var c=d=>{var b=Vc();sI(()=>vI(b,g()[B()].text)),D(d,b)};GI(t,d=>{g()[B()].text&&d(c)})}z(l),sI(()=>{nI(l,1,U()+" svelcomlib-icon-text"),pI(l,"aria-label",g()[B()].tooltip)}),D(C,l),xI()}KI(["click","contextmenu"]);var i1=f("");KI(["click"]);var e1=f("
");KI(["input"]);var he=f('
'),Xe=f('
'),oe={hash:"svelte-3kpd",code:""};function lU(C,I){VI(I,!0),IF(C,oe);let g=J(I,"height",3,"100%"),B=J(I,"itemHeight",3,void 0),F=J(I,"start",7,0),Q=J(I,"end",7,0),A=rI([]),U=lI(rI([])),l=lI(void 0),s=lI(void 0),G=lI(0),t=lI(void 0),c=lI(0),d=lI(0),b=lI(0),Z=lI(0),e=BI(()=>I.items.slice(F(),Q()).map((L,R)=>({index:R+F(),data:L})));og(()=>{i(t)&&x(I.items,i(G),B())});async function x(L,R,o){L.lengthL){F(R),Y(c,o,!0);break}o+=H,R+=1}for(;RL+i(G))););Q(R);let y=I.items.length-Q();for(Y(b,o/Q());R{Y(U,i(s).getElementsByClassName("svelcomlib-virtual-list-row"),!0),Y(t,!0)});var h=Xe(),m=O(h);return qI(m,21,()=>i(e),L=>L.index,(L,R)=>{var o=he(),y=O(o);yC(y,()=>I.item,()=>i(R).data,()=>i(R).index),z(o),D(L,o)}),z(m),dB(m,L=>Y(s,L),()=>i(s)),z(h),dB(h,L=>Y(l,L),()=>i(l)),sI(()=>{gB(h,`height: ${g()??""};`),gB(m,`padding-top: ${i(c)??""}px; padding-bottom: ${i(d)??""}px; --scroll-offset: ${i(Z)??""}px`)}),vg("scroll",h,a),gs(h,"offsetHeight",L=>Y(G,L)),D(C,h),xI({scrollToIndex:n})}var Bs=require("obsidian"),Ne=f("
");function IQ(C,I){VI(I,!0);let g=J(I,"source",3,""),B=J(I,"class",3,""),F=lI(void 0);CF(async()=>{let A=new Bs.Component;await Bs.MarkdownRenderer.render(I.plugin.app,I.text,i(F),g(),A),A.load()});var Q=Ne();dB(Q,A=>Y(F,A),()=>i(F)),sI(()=>nI(Q,1,Og(B()))),D(C,Q),xI()}var re=f("Empty navheader"),pe=f('');function sU(C,I){"use strict";var g=pe(),B=O(g),F=O(B);{var Q=U=>{var l=Ng(),s=yI(l);yC(s,()=>I.container),D(U,l)},A=U=>{var l=re();D(U,l)};GI(F,U=>{I.container?U(Q):U(A,!1)})}z(B),z(g),D(C,g)}var He=f("
"),Ye=f(" ",1),Je=f('
',1);function tI(C,I){VI(I,!0);let g=J(I,"description",3,null),B=J(I,"type",3,null),F=J(I,"depth",3,0),Q=J(I,"notices",19,()=>[]),A=J(I,"class",3,""),U=BI(()=>{let R="";return F()&&(R+=" svelcomlib-"+"sub".repeat(F())+"setting"),B()==="heading"&&(R+=" svelcomlib-setting-"+"sub".repeat(F())+"heading"),R});var l=Je(),s=yI(l);let G;var t=O(s),c=O(t),d=O(c),b=O(d);_F(b,()=>I.name),z(d),z(c);var Z=v(c,2),e=O(Z);_F(e,g);var x=v(e,2);qI(x,17,Q,Qg,(R,o,y)=>{var H=Ng(),r=yI(H);{var N=T=>{var M=Ye(),q=yI(M);{var AI=XI=>{var kI=He();D(XI,kI)};GI(q,XI=>{(g()||y!==0)&&XI(AI)})}var aI=v(q,2);let uI;var ZI=O(aI);_F(ZI,()=>i(o).text),z(aI),sI(XI=>uI=nI(aI,1,"svelcomlib-notice "+(i(o).style??""),null,uI,XI),[()=>({"svelcomlib-notice-info":i(o).type==="info","svelcomlib-notice-warning":i(o).type==="warning","svelcomlib-notice-error":i(o).type==="error"})]),D(T,M)};GI(r,T=>{i(o)&&T(N)})}D(R,H)}),z(Z),z(t);var a=v(t,2),n=O(a);{var h=R=>{var o=Ng(),y=yI(o);yC(y,()=>I.control),D(R,o)};GI(n,R=>{I.control&&R(h)})}z(a),z(s);var m=v(s,2);{var L=R=>{var o=Ng(),y=yI(o);yC(y,()=>I.subcontrol),D(R,o)};GI(m,R=>{I.subcontrol&&R(L)})}sI(R=>G=nI(s,1,(A()??"")+" setting-item"+i(U),null,G,R),[()=>({"mod-dropdown":B()==="dropdown","mod-toggle":B()==="toggle","mod-slider":B()==="slider","setting-item-heading":B()==="heading"})]),D(C,l),xI()}var ve=f(" ",1);function tU(C,I){"use strict";let g=J(I,"class",3,"");var B=ve(),F=yI(B);{var Q=l=>{var s=Ng(),G=yI(s);yC(G,()=>I.header,g),D(l,s)};GI(F,l=>{I.header&&l(Q)})}var A=v(F,2);{var U=l=>{var s=Ng(),G=yI(s);yC(G,()=>I.view,g),D(l,s)};GI(A,l=>{I.view&&l(U)})}D(C,B)}var De=f(" ",1);function Fs(C,I){VI(I,!0);let g=J(I,"plugin",7),B={addition:{icon:"plus-circle",tooltip:"Additions"},deletion:{icon:"minus-square",tooltip:"Deletions"},substitution:{icon:"replace",tooltip:"Substitutions"},highlight:{icon:"highlighter",tooltip:"Highlights"},comment:{icon:"message-square",tooltip:"Comments"}},F={"":{icon:"star",tooltip:"Regular"},...B},Q=[{value:"unchanged",text:"Regular movement"},{value:"ignore_bracket",text:"Skip brackets"},{value:"ignore_metadata",text:"Skip brackets and metadata"},{value:"ignore_completely",text:"Skip completely"}],A=[{value:"unchanged",text:"Regular movement"},{value:"stay_inside",text:"Keep cursor within range"},{value:"stay_outside",text:"Treat range as word group"}];var U=De(),l=yI(U);tI(l,{name:"Functionality",type:"heading"});var s=v(l,2);tI(s,{name:"Suggestion mode",type:"heading",depth:1});var G=v(s,2);tI(G,{name:"Cursor movement",type:"heading",depth:2});var t=v(G,2);qI(t,17,()=>Object.keys(B),Qg,(a,n)=>{tI(a,{get name(){return B[i(n)].tooltip},type:"dropdown",depth:2,control:m=>{bB(m,{get value(){return g().settings.suggestion_mode_operations.cursor_movement[i(n)]},options:Q,onChange:L=>{g().settings.suggestion_mode_operations.cursor_movement[i(n)]=L,g().saveSettings()}})},$$slots:{control:!0}})});var c=v(t,2);tI(c,{name:"Bracket movement",type:"heading",depth:2});var d=v(c,2);qI(d,17,()=>Object.keys(B),Qg,(a,n)=>{tI(a,{get name(){return B[i(n)].tooltip},type:"dropdown",depth:2,control:m=>{bB(m,{get value(){return g().settings.suggestion_mode_operations.bracket_movement[i(n)]},options:A,onChange:L=>{g().settings.suggestion_mode_operations.bracket_movement[i(n)]=L,g().saveSettings()}})},$$slots:{control:!0}})});var b=v(d,2);tI(b,{name:"Suggestion mode cursor movement",description:"Determine how the cursor should move through suggestions in suggestion mode",type:"dropdown"});var Z=v(b,2);tI(Z,{name:"Rendering",type:"heading"});var e=v(Z,2);tI(e,{name:"Live Preview renderer",description:"Enable custom rendering of CriticMarkup syntax in Live Preview",type:"toggle",control:n=>{EI(n,{get value(){return g().settings.live_preview},onChange:()=>{g().settings.live_preview=!g().settings.live_preview,g().saveSettings()}})},$$slots:{control:!0}});var x=v(e,2);tI(x,{name:"Reading View renderer",description:"Enable custom rendering of CriticMarkup syntax in Reading View",type:"toggle",control:n=>{EI(n,{get value(){return g().settings.post_processor},onChange:()=>{g().settings.post_processor=!g().settings.post_processor,g().saveSettings()}})},$$slots:{control:!0}}),D(C,U),xI()}var Te=f(" ",1);function Qs(C,I){VI(I,!0);let g=J(I,"plugin",7),B=lI(rI(g().settings.comment_style)),F={inline:"Comments receive a background color and are fully visible (similar to suggestions)",icon:"Comments are displayed as icons and can be hovered over to reveal the comment",none:"Comments are not rendered in the editor, use this with the annotation gutter"};var Q=Te(),A=yI(Q);tI(A,{name:"Editing features",type:"heading"});var U=v(A,2);tI(U,{name:"Automatic tag completion",notices:[{type:"info",text:"When typing {++, the tag automatically gets completed with ++}"}],type:"toggle",control:Z=>{EI(Z,{get value(){return g().settings.tag_completion},onChange:()=>{g().settings.tag_completion=!g().settings.tag_completion,g().saveSettings()}})},$$slots:{control:!0}});var l=v(U,2);tI(l,{name:"Remove syntax on copy",description:"When copying in the editor to the clipboard, any CriticMarkup syntax is removed",notices:[{type:"info",text:"Copying my {++text++} will result in my text"}],type:"toggle",control:Z=>{EI(Z,{slot:"control",get value(){return g().settings.clipboard_remove_syntax},onChange:()=>{g().settings.clipboard_remove_syntax=!g().settings.clipboard_remove_syntax,g().saveSettings()}})},$$slots:{control:!0}});var s=v(l,2);tI(s,{name:"Automatic tag correction",description:"Dangling tags and redundant whitespaces automatically get removed to prevent invalid CriticMarkup syntax",type:"toggle",control:Z=>{EI(Z,{get value(){return g().settings.tag_correcter},onChange:()=>{g().settings.tag_correcter=!g().settings.tag_correcter,g().saveSettings()}})},$$slots:{control:!0}});var G=v(s,2);tI(G,{name:"Show style while editing",description:"Keep the style of suggestions visible while editing",type:"toggle",control:Z=>{EI(Z,{get value(){return g().settings.editor_styling},onChange:()=>{g().settings.editor_styling=!g().settings.editor_styling,g().saveSettings()}})},$$slots:{control:!0}});var t=v(G,2);tI(t,{name:"Comments Rendering",type:"heading"});var c=v(t,2);let d=BI(()=>[{type:"info",text:F[i(B)]}]);tI(c,{name:"Comment rendering mode",description:"Determine how comments are rendered inside the editor",get notices(){return i(d)},type:"dropdown",control:Z=>{bB(Z,{options:[{value:"inline",text:"Inline"},{value:"icon",text:"Icon"},{value:"none",text:"Hidden"}],get value(){return i(B)},onChange:e=>{g().settings.comment_style=e,Y(B,e,!0),g().saveSettings()}})},$$slots:{control:!0}}),D(C,Q),xI()}var we=f('
',1);function cU(C,I){VI(I,!0);let g=J(I,"plugin",7),B=lI(rI(g().settings.default_preview_mode)),F={0:"All suggestions will be visible",1:"Preview document as if all suggestions were accepted",2:"Preview document as if all suggestions were rejected"};var Q=we(),A=yI(Q);tI(A,{name:"Default Edit Mode",type:"dropdown",notices:[{type:"info",text:"When opening a new note, this will be the default editing mode"}],control:e=>{let x=BI(()=>[{value:0 .toString(),text:"Regular Edit Mode"},{value:1 .toString(),text:"Corrected Edit Mode"},{value:2 .toString(),text:"Suggestion Mode"}]),a=BI(()=>g().settings.default_edit_mode.toString());bB(e,{get options(){return i(x)},get value(){return i(a)},onChange:n=>{let h=parseInt(n);g().settings.default_edit_mode=h,g().saveSettings()}})},$$slots:{control:!0}});var U=v(A,2);let l=BI(()=>[{type:"info",text:"When opening a new note, this will be the default editing mode"},{type:"info",text:F[i(B)]}]);tI(U,{name:"Default Preview Mode",type:"dropdown",get notices(){return i(l)},control:e=>{let x=BI(()=>[{value:0 .toString(),text:"View all suggestions"},{value:1 .toString(),text:"Preview 'accept all'"},{value:2 .toString(),text:"Preview 'reject all'"}]),a=BI(()=>g().settings.default_preview_mode.toString());bB(e,{get options(){return i(x)},get value(){return i(a)},onChange:n=>{Y(B,parseInt(n),!0),g().settings.default_preview_mode=i(B),g().saveSettings()}})},$$slots:{control:!0}});var s=v(U,2);tI(s,{name:"Include Metadata Extension",type:"dropdown",notices:[{type:"info",text:"Allow inclusion of metadata for suggestions, such as authorship, time, etc."},{type:"warning",text:"Suggestion metadata is not part of the official CriticMarkup standard, this metadata will not get processed/rendered correctly in other editors"},{type:"error",text:"Toggling this setting results in a re-indexation of the entire vault"}],control:e=>{EI(e,{get value(){return g().settings.enable_metadata},onChange:x=>{g().settings.enable_metadata=x,g().saveSettings()}})},$$slots:{control:!0}});var G=v(s,2);tI(G,{name:"Database",type:"heading"});var t=v(G,2);tI(t,{name:"Database Workers",description:"Number of workers to use for database indexing",notices:[{type:"info",text:"A higher amount of workers will increase indexing speed"}],type:"slider",control:e=>{$F(e,{min:1,max:navigator.hardwareConcurrency/2,step:1,get value(){return g().settings.database_workers},onChange:x=>{g().settings.database_workers=x,g().saveSettings()}})},$$slots:{control:!0}});var c=v(t,2);tI(c,{name:"Rebuild Database",notices:[{type:"info",text:"Recommended if you're encountering issues with the view after updating"},{type:"warning",text:"In large vaults, reindexing the database may take a while"}],control:e=>{dC(e,{text:"Rebuild",onClick:async()=>{await g().database.reinitializeDatabase()}})},$$slots:{control:!0}});var d=v(c,2),b=O(d);dC(b,{class:"translator-fail",text:"REPORT BUG",icon:"bug",onClick:()=>ii(g().app,void 0,{})}),z(d),D(C,Q),xI()}var fe=f(" ",1);function As(C,I){VI(I,!0);let g=J(I,"plugin",7);var B=fe(),F=yI(B);tI(F,{name:"Editor header",type:"heading"});var Q=v(F,2);tI(Q,{name:"Full button labels",description:"Adds labels to the buttons in the editor header",type:"toggle",control:d=>{EI(d,{get value(){return g().settings.toolbar_show_buttons_labels},onChange:()=>{g().settings.toolbar_show_buttons_labels=!g().settings.toolbar_show_buttons_labels,g().saveSettings()}})},$$slots:{control:!0}});var A=v(Q,2);tI(A,{name:"Preview mode header button",description:"Adds a button to the editor's header for quickly changing preview mode",type:"toggle",control:d=>{EI(d,{get value(){return g().settings.toolbar_preview_button},onChange:()=>{g().settings.toolbar_preview_button=!g().settings.toolbar_preview_button,g().saveSettings()}})},$$slots:{control:!0}});var U=v(A,2);tI(U,{name:"Suggestion mode header button",description:"Adds a button to the editor's header for quickly toggling suggestion mode",type:"toggle",control:d=>{EI(d,{get value(){return g().settings.toolbar_edit_button},onChange:()=>{g().settings.toolbar_edit_button=!g().settings.toolbar_edit_button,g().saveSettings()}})},$$slots:{control:!0}});var l=v(U,2);tI(l,{name:"Editor status bar",type:"heading"});var s=v(l,2);tI(s,{name:"Preview mode status bar toggle",description:"Adds a status bar item for quickly selecting suggestion mode",type:"toggle",control:d=>{EI(d,{get value(){return g().settings.status_bar_preview_button},onChange:()=>{g().settings.status_bar_preview_button=!g().settings.status_bar_preview_button,g().saveSettings()}})},$$slots:{control:!0}});var G=v(s,2);tI(G,{name:"Suggestion mode status bar toggle",description:"Adds a status bar item for quickly selecting suggestion mode",type:"toggle",control:d=>{EI(d,{get value(){return g().settings.status_bar_edit_button},onChange:()=>{g().settings.status_bar_edit_button=!g().settings.status_bar_edit_button,g().saveSettings()}})},$$slots:{control:!0}});var t=v(G,2);tI(t,{name:"Metadata status bar toggle",description:"Adds a status bar item for quickly toggling the inclusion of (particular) metadata",type:"toggle",control:d=>{EI(d,{get value(){return g().settings.status_bar_metadata_button},onChange:()=>{g().settings.status_bar_metadata_button=!g().settings.status_bar_metadata_button,g().saveSettings()}})},$$slots:{control:!0}}),D(C,B),xI()}var ze=f(" ",1),Me=f(" ",1);function Us(C,I){VI(I,!0);let g=J(I,"plugin",7);var B=Me(),F=yI(B);tI(F,{name:"Add Metadata",type:"toggle",control:m=>{EI(m,{get value(){return g().settings.enable_metadata},onChange:L=>{g().settings.enable_metadata=L,g().saveSettings()}})},$$slots:{control:!0}});var Q=v(F,2);tI(Q,{name:"Enable Authorship",description:"Enable rendering and processing of author metadata",type:"toggle",control:m=>{EI(m,{get value(){return g().settings.enable_author_metadata},onChange:L=>{g().settings.enable_author_metadata=L,g().saveSettings()}})},$$slots:{control:!0}});var A=v(Q,2);{var U=h=>{var m=ze(),L=yI(m);tI(L,{name:"Add Author Metadata",description:"Author metadata will be added into new suggestions and comments",type:"toggle",depth:1,control:y=>{EI(y,{get value(){return g().settings.add_author_metadata},onChange:H=>{g().settings.add_author_metadata=H,g().saveSettings()}})},$$slots:{control:!0}});var R=v(L,2);tI(R,{name:"Name",depth:1,control:y=>{qF(y,{type:"text",onChange:H=>{g().settings.author=H,g().saveSettings()},get value(){return g().settings.author},set value(H){g().settings.author=H}})},$$slots:{control:!0}}),D(h,m)};GI(A,h=>{g().settings.enable_author_metadata&&h(U)})}var l=v(A,2);tI(l,{name:"Enable Timestamp",description:"Enable rendering and processing of timestamp metadata",type:"toggle",control:m=>{EI(m,{get value(){return g().settings.enable_timestamp_metadata},onChange:L=>{g().settings.enable_timestamp_metadata=L,g().saveSettings()}})},$$slots:{control:!0}});var s=v(l,2);{var G=h=>{tI(h,{name:"Add Timestamp Metadata",description:"Timestamp metadata will be added into new suggestions and comments",depth:1,control:L=>{EI(L,{get value(){return g().settings.add_timestamp_metadata},onChange:R=>{g().settings.add_timestamp_metadata=R,g().saveSettings()}})},$$slots:{control:!0}})};GI(s,h=>{g().settings.enable_timestamp_metadata&&h(G)})}var t=v(s,2);tI(t,{name:"Enable Completed",description:"Enable rendering and processing of completed metadata",type:"toggle",control:m=>{EI(m,{get value(){return g().settings.enable_completed_metadata},onChange:L=>{g().settings.enable_completed_metadata=L,g().saveSettings()}})},$$slots:{control:!0}});var c=v(t,2);{var d=h=>{tI(h,{name:"Add Completed Metadata",description:"Completed metadata will be added into new suggestions and comments",depth:1,control:L=>{EI(L,{get value(){return g().settings.add_completed_metadata},onChange:R=>{g().settings.add_completed_metadata=R,g().saveSettings()}})},$$slots:{control:!0}})};GI(c,h=>{g().settings.enable_completed_metadata&&h(d)})}var b=v(c,2);tI(b,{name:"Enable Style",description:"Enable rendering and processing of style metadata",type:"toggle",control:m=>{EI(m,{get value(){return g().settings.enable_style_metadata},onChange:L=>{g().settings.enable_style_metadata=L,g().saveSettings()}})},$$slots:{control:!0}});var Z=v(b,2);{var e=h=>{tI(h,{name:"Add Style Metadata",description:"Style metadata will be added into new suggestions and comments",depth:1,control:L=>{EI(L,{get value(){return g().settings.add_style_metadata},onChange:R=>{g().settings.add_style_metadata=R,g().saveSettings()}})},$$slots:{control:!0}})};GI(Z,h=>{g().settings.enable_style_metadata&&h(e)})}var x=v(Z,2);tI(x,{name:"Enable Color",description:"Enable rendering and processing of color metadata",type:"toggle",control:m=>{EI(m,{get value(){return g().settings.enable_color_metadata},onChange:L=>{g().settings.enable_color_metadata=L,g().saveSettings()}})},$$slots:{control:!0}});var a=v(x,2);{var n=h=>{tI(h,{name:"Add Color Metadata",description:"Color metadata will be added into new suggestions and comments",depth:1,control:L=>{EI(L,{get value(){return g().settings.add_color_metadata},onChange:R=>{g().settings.add_color_metadata=R,g().saveSettings()}})},$$slots:{control:!0}})};GI(a,h=>{g().settings.enable_color_metadata&&h(n)})}D(C,B),xI()}var Ke=f(" ",1);function ls(C,I){VI(I,!0);let g=J(I,"plugin",7);var B=Ke(),F=yI(B);tI(F,{name:"Diff gutter",type:"heading"});var Q=v(F,2);tI(Q,{name:"Enable diff gutter",description:"Display a gutter in the editor for showing changes from suggestions",notices:[{type:"info",text:"Clicking on the gutter reveals a menu for accepting/rejecting all changes within the block"}],type:"toggle",control:a=>{EI(a,{slot:"control",get value(){return g().settings.diff_gutter},onChange:()=>{g().settings.diff_gutter=!g().settings.diff_gutter,g().saveSettings()}})},$$slots:{control:!0}});var A=v(Q,2);tI(A,{name:"Hide when empty",description:"When enabled, the gutter will not take up any space when there are no changes in the current note",notices:[{type:"info",text:"When enabled, switching between different notes may cause content to shift"}],type:"toggle",depth:1,control:a=>{EI(a,{slot:"control",get value(){return g().settings.diff_gutter_hide_empty},onChange:()=>{g().settings.diff_gutter_hide_empty=!g().settings.diff_gutter_hide_empty,g().saveSettings()}})},$$slots:{control:!0}});var U=v(A,2);tI(U,{name:"Annotation gutter",type:"heading"});var l=v(U,2);tI(l,{name:"Enable annotation gutter",description:"Display a gutter in the editor for annotations",type:"toggle",control:a=>{EI(a,{get value(){return g().settings.annotation_gutter},onChange:()=>{g().settings.annotation_gutter=!g().settings.annotation_gutter,g().saveSettings()}})},$$slots:{control:!0}});var s=v(l,2);tI(s,{name:"Included annotations",description:"Determine which annotations should be shown by default",notices:[{type:"info",text:"This setting only applies after reloading the app"}],type:"subheading",depth:1});var G=v(s,2);qI(G,17,()=>Object.keys(JF).filter(x=>isNaN(Number(x))),Qg,(x,a)=>{let n=BI(()=>i(a).toLowerCase().replace(/\b\w/g,h=>h.toUpperCase()));tI(x,{get name(){return i(n)},type:"toggle",depth:2,control:m=>{let L=BI(()=>(g().settings.annotation_gutter_included_types&JF[i(a)])!==0);EI(m,{get value(){return i(L)},onChange:()=>{g().settings.annotation_gutter_included_types^=JF[i(a)],g().saveSettings()}})},$$slots:{control:!0}})});var t=v(G,2);tI(t,{name:"Focus annotation on selection",description:"When selecting an annotation in the editor, the corresponding annotation in the gutter will be focused",type:"toggle",depth:1,control:a=>{EI(a,{get value(){return g().settings.annotation_gutter_focus_on_click},onChange:()=>{g().settings.annotation_gutter_focus_on_click=!g().settings.annotation_gutter_focus_on_click,g().saveSettings()}})},$$slots:{control:!0}});var c=v(t,2);tI(c,{name:"Width",description:"The width of the gutter in pixels",type:"slider",depth:1,control:a=>{$F(a,{min:100,max:500,step:50,get value(){return g().settings.annotation_gutter_width},onChange:n=>{g().settings.annotation_gutter_width=n,g().saveSettings()}})},$$slots:{control:!0}});var d=v(c,2);tI(d,{name:"Show resize handle",description:"Display a handle bar within the editor for quickly resizing the gutter",type:"toggle",depth:1,control:a=>{EI(a,{get value(){return g().settings.annotation_gutter_resize_handle},onChange:()=>{g().settings.annotation_gutter_resize_handle=!g().settings.annotation_gutter_resize_handle,g().saveSettings()}})},$$slots:{control:!0}});var b=v(d,2);tI(b,{name:"Default fold state",description:"Determine whether the gutter is shown by default",notices:[{type:"info",text:"This setting only applies after reloading the app"}],type:"toggle",depth:1,control:a=>{EI(a,{get value(){return g().settings.annotation_gutter_default_fold_state},onChange:()=>{g().settings.annotation_gutter_default_fold_state=!g().settings.annotation_gutter_default_fold_state,g().saveSettings()}})},$$slots:{control:!0}});var Z=v(b,2);tI(Z,{name:"Show fold button",description:"Display a button within the editor for (un)folding the gutter",type:"toggle",depth:1,control:a=>{EI(a,{get value(){return g().settings.annotation_gutter_fold_button},onChange:()=>{g().settings.annotation_gutter_fold_button=!g().settings.annotation_gutter_fold_button,g().saveSettings()}})},$$slots:{control:!0}});var e=v(Z,2);tI(e,{name:"Hide when empty",description:"When enabled, the gutter will not take up any space when there are no annotations in the current note",notices:[{type:"info",text:"When enabled, switching between different notes may cause content to shift"}],type:"toggle",depth:1,control:a=>{EI(a,{get value(){return g().settings.annotation_gutter_hide_empty},onChange:()=>{g().settings.annotation_gutter_hide_empty=!g().settings.annotation_gutter_hide_empty,g().saveSettings()}})},$$slots:{control:!0}}),D(C,B),xI()}var Pe=C=>C;function je(C){let I=C-1;return I*I*I+1}function oF(C,{delay:I=0,duration:g=400,easing:B=Pe}={}){let F=+getComputedStyle(C).opacity;return{delay:I,duration:g,easing:B,css:Q=>`opacity: ${Q*F}`}}var Yc=!1;function Jc(C,{delay:I=0,duration:g=400,easing:B=je,axis:F="y"}={}){let Q=getComputedStyle(C);CI&&!Yc&&/(contents|inline|table)/.test(Q.display)&&(Yc=!0,Promise.resolve().then(()=>Yc=!1),Q.display,void 0);let A=+Q.opacity,U=F==="y"?"height":"width",l=parseFloat(Q[U]),s=F==="y"?["top","bottom"]:["left","right"],G=s.map(x=>`${x[0].toUpperCase()}${x.slice(1)}`),t=parseFloat(Q[`padding${G[0]}`]),c=parseFloat(Q[`padding${G[1]}`]),d=parseFloat(Q[`margin${G[0]}`]),b=parseFloat(Q[`margin${G[1]}`]),Z=parseFloat(Q[`border${G[0]}Width`]),e=parseFloat(Q[`border${G[1]}Width`]);return{delay:I,duration:g,easing:B,css:x=>`overflow: hidden;opacity: ${Math.min(x*20,1)*A};${U}: ${x*l}px;padding-${s[0]}: ${x*t}px;padding-${s[1]}: ${x*c}px;margin-${s[0]}: ${x*d}px;margin-${s[1]}: ${x*b}px;border-${s[0]}-width: ${x*Z}px;border-${s[1]}-width: ${x*e}px;min-${U}: 0`}}var Oe=(C,I,g,B)=>{if(C.key==="Tab"){if(C.metaKey||C.ctrlKey)return!0;C.shiftKey?I(((i(g)-1)%B.length+B.length)%B.length):I((i(g)+1)%B.length),C.preventDefault()}},_e=f('
'),qe=f("
"),$e=f('
');function GU(C,I){VI(I,!0);let g=J(I,"plugin",7),B=[{id:"general",name:"General",icon:"settings"},{id:"editor",name:"Editor",icon:"pencil"},{id:"interface",name:"Interface",icon:"layout"},{id:"gutter",name:"Gutters",icon:"sticky-note"},{id:"metadata",name:"Metadata",icon:"tags"},{id:"advanced",name:"Advanced",icon:"shield-alert"}],F=lI(rI(B.findIndex(t=>t.id===g().settings_tab))),Q=BI(()=>B[i(F)].id),A=BI(()=>{switch(i(Q)){case"general":return cU;case"editor":return Qs;case"gutter":return ls;case"advanced":return Fs;case"interface":return As;case"metadata":return Us;default:return cU}});async function U(t){Y(F,t,!0),Y(Q,B[t].id,!0),g().settings_tab=i(Q)}var l=$e(),s=O(l);s.__keydown=[Oe,U,F,B],qI(s,21,()=>B,Qg,(t,c,d)=>{let b=()=>i(c).id,Z=()=>i(c).name,e=()=>i(c).icon;var x=_e();let a;x.__click=()=>{U(d)};var n=O(x),h=O(n);lC(h,{get icon(){return e()}}),z(n);var m=v(n,2);let L;var R=O(m,!0);z(m),z(x),sI((o,y)=>{a=nI(x,1,"cmtr-settings-navigation-item",null,a,o),pI(x,"aria-label",`${Z()} settings`),L=nI(m,1,"cmtr-settings-navigation-item-text",null,L,y),vI(R,Z())},[()=>({"cmtr-settings-navigation-selected-item":i(F)===d}),()=>({"cmtr-settings-navigation-selected-item-text":i(F)!==d})]),D(t,x)}),z(s);var G=v(s,2);qQ(G,()=>i(Q),t=>{var c=qe(),d=O(c);nc(d,()=>i(A),(b,Z)=>{Z(b,{get plugin(){return g()}})}),z(c),_g(1,c,()=>Jc,()=>({duration:400,delay:400})),_g(2,c,()=>Jc,()=>({duration:400})),D(t,c)}),z(l),D(C,l),xI()}KI(["keydown","click"]);var SB=require("obsidian");var gb=require("@codemirror/state");function ss(C,I,g){let B=new SB.Menu,F=new Set(g.map(U=>U.range.type)),Q=g.length>20,A=g.length>1;if(F.has("comment")||F.has("highlight")?F.size===1&&F.has("comment")?B.addItem(U=>{U.setTitle(A?"Remove selected comment threads":"Remove comment thread").setIcon("message-square-off").setSection("close-annotation").setWarning(Q).onClick(async()=>sB(C,g,lB.bind(null,(l,s)=>"")))}):B.addItem(U=>{U.setTitle(A?"Remove selected threads":"Remove thread").setIcon("trash").setSection("close-annotation").setWarning(Q).onClick(async()=>sB(C,g,lB.bind(null,(l,s)=>"")))}):(B.addItem(U=>{U.setTitle(A?"Apply selected changes":"Apply change").setIcon("check").setSection("close-annotation").setWarning(Q).onClick(async()=>sB(C,g,lB.bind(null,(l,s)=>l.accept())))}),B.addItem(U=>{U.setTitle(A?"Reject selected changes":"Reject change").setIcon("cross").setSection("close-annotation").setWarning(Q).onClick(async()=>sB(C,g,lB.bind(null,(l,s)=>l.reject())))})),!A){let{range:U,path:l}=g[0];B.addItem(s=>{s.setTitle("Add reply").setIcon("reply").setSection("comment-handling").onClick(async G=>{let t=C.app.vault.getAbstractFileByPath(l);if(t&&t instanceof SB.TFile){let c=C.app.workspace.getLeaf(!1);await c.openLinkText(l,""),c.view instanceof SB.MarkdownView&&(pQ(c.view.editor,U),jC(c.view.editor.cm,U,!1))}})}),U.type==="comment"&&(B.addItem(s=>{s.setTitle("Edit comment").setIcon("pencil").setSection("comment-handling").onClick(async()=>{let G=C.app.vault.getAbstractFileByPath(l);if(G&&G instanceof SB.TFile){let t=C.app.workspace.getLeaf(!1);if(await t.openLinkText(l,""),t.view instanceof SB.MarkdownView){let{editor:c}=t.view;pQ(c,U),c.cm.dispatch(c.cm.state.update({selection:gb.EditorSelection.cursor(U.full_range_back),annotations:[aB.of({from:U.full_range_back,to:U.full_range_back,index:U.reply_depth})]}))}}})}),B.addItem(s=>{s.setTitle("Remove comment").setIcon("cross").setSection("comment-handling").onClick(async()=>sB(C,g,lB.bind(null,(G,t)=>""),!1))}))}return B.addItem(U=>{U.setTitle(A?"Open in new tabs":"Open in new tab").setIcon("file-plus").setSection("open-annotation").onClick(async l=>{let s=MU(g);for(let[G,t]of Object.entries(s).slice(0,10)){let c=C.app.vault.getAbstractFileByPath(G);if(c&&c instanceof SB.TFile){let d=C.app.workspace.getLeaf(l.metaKey||l.ctrlKey||!0);await d.openLinkText(G,""),d.view instanceof SB.MarkdownView&&pQ(d.view.editor,t[0])}}})}),B.showAtMouseEvent(I),B}var G5=require("obsidian");var IV=f(" ",1),gV=f('
');function ts(C,I){VI(I,!0);let g=J(I,"menu_open",15,!1);var B=gV(),F=O(B),Q=O(F);{var A=G=>{var t=Ng(),c=yI(t);{var d=Z=>{dC(Z,{icon:"message-square-off",tooltip:"Delete comment thread",onClick:()=>sB(I.plugin,[I.entry],lB.bind(null,(e,x)=>e.accept()))})},b=Z=>{dC(Z,{icon:"cross",tooltip:"Delete comment",onClick:()=>sB(I.plugin,[I.entry],lB.bind(null,(e,x)=>e.accept()))})};GI(c,Z=>{I.entry.range.replies.length?Z(d):Z(b,!1)})}D(G,t)},U=(G,t)=>{{var c=d=>{var b=IV(),Z=yI(b);let e=BI(()=>"Accept change"+(I.entry.range.replies.length?" (and delete thread)":""));dC(Z,{icon:"check",get tooltip(){return i(e)},onClick:()=>sB(I.plugin,[I.entry],lB.bind(null,(n,h)=>n.accept()))});var x=v(Z,2);let a=BI(()=>"Reject change"+(I.entry.range.replies.length?" (and delete thread)":""));dC(x,{icon:"cross",get tooltip(){return i(a)},onClick:()=>sB(I.plugin,[I.entry],lB.bind(null,(n,h)=>n.reject()))}),D(d,b)};GI(G,d=>{I.entry.range.type!=="highlight"&&d(c)},t)}};GI(Q,G=>{I.entry.range.type==="comment"?G(A):G(U,!1)})}var l=v(Q,4);dC(l,{icon:"eye",tooltip:"View in note",onClick:async()=>{await Xl(I.plugin,I.entry)}});var s=v(l,2);dC(s,{icon:"more-vertical",tooltip:"More options",onClick:G=>{g(!0),I.moreOptionsMenu(I.plugin,G,[I.entry]).onHide(()=>{g(!1)})}}),z(F),z(B),D(C,B),xI()}var CV=(C,I,g)=>{I.onClick(C,I.row,I.index),Y(g,!0)},BV=(C,I)=>{I.onDblClick(C,I.row,I.index)},FV=(C,I,g)=>{ss(I.plugin,C,I.selected_ranges.length?I.selected_ranges:[{path:I.row.path,range:I.row.range.thread[i(g)]??I.row.range}])},QV=f(' '),AV=f(' '),UV=f('

This range is empty

'),lV=f(" ",1),sV=f('
'),tV=f(' '),cV=f(' '),GV=f('
'),iV=f('
');function vc(C,I){VI(I,!0);let g=J(I,"menu_open",15,!1),B=lI(!1),F=lI(null),Q=lI(null);function A(y){g()||(Y(F,y,!0),Y(Q,i(F),!0))}let U=BI(()=>I.selected_ranges.some(y=>y.path===I.row.path&&y.range.from===I.row.range.from));var l=iV();let s;l.__click=[CV,I,B],l.__dblclick=[BV,I],l.__contextmenu=[FV,I,F];var G=O(l);{var t=y=>{ts(y,{get plugin(){return I.plugin},get entry(){return I.row},moreOptionsMenu:ss,get menu_open(){return g()},set menu_open(H){g(H)}})};GI(G,y=>{(!g()&&i(F)===0||g()&&i(Q)===0)&&y(t)})}var c=v(G,2),d=O(c);lC(d,{size:24,get icon(){return AG[I.row.range.type]}});var b=v(d,2),Z=O(b),e=O(Z,!0);z(Z);var x=v(Z,2),a=O(x);{var n=y=>{var H=QV(),r=O(H,!0);z(H),sI(()=>vI(r,I.row.range.fields.author)),D(y,H)};GI(a,y=>{I.row.range.fields.author&&y(n)})}var h=v(a,2);{var m=y=>{var H=AV(),r=O(H,!0);z(H),sI(N=>vI(r,N),[()=>window.moment.unix(I.row.range.fields.time).format("MMM DD YYYY, HH:mm")]),D(y,H)};GI(h,y=>{I.row.range.fields.time&&y(m)})}z(x),z(b),z(c);var L=v(c,2);qQ(L,()=>I.row.range.text,y=>{var H=sV(),r=O(H);{var N=M=>{var q=UV();D(M,q)},T=M=>{var q=lV();let AI=BI(()=>I.row.range.unwrap_parts());var aI=yI(q);IQ(aI,{get plugin(){return I.plugin},get text(){return i(AI)[0]},get source(){return I.row.path},get class(){return I.row.range.fields.style}});var uI=v(aI,2);{var ZI=XI=>{IQ(XI,{get plugin(){return I.plugin},get text(){return i(AI)[1]},get source(){return I.row.path}})};GI(uI,XI=>{I.row.range.type==="substitution"&&XI(ZI)})}D(M,q)};GI(r,M=>{I.row.range.empty()?M(N):M(T,!1)})}z(H),vg("mouseenter",H,()=>{A(0)}),D(y,H)});var R=v(L,2);{var o=y=>{var H=Ng(),r=yI(H);qI(r,17,()=>I.row.range.replies,Qg,(N,T,M)=>{var q=Ng(),AI=yI(q);qQ(AI,()=>i(T).text,aI=>{var uI=GV();let ZI;var XI=O(uI);{var kI=p=>{let w=BI(()=>({path:I.row.path,range:i(T)}));ts(p,{get plugin(){return I.plugin},get entry(){return i(w)},moreOptionsMenu:ss,get menu_open(){return g()},set menu_open(QI){g(QI)}})};GI(XI,p=>{(!g()&&i(F)===M+1||g()&&i(Q)===M+1)&&p(kI)})}var mI=v(XI,2),wI=O(mI);{var gg=p=>{var w=tV(),QI=O(w,!0);z(w),sI(()=>vI(QI,i(T).fields.author)),D(p,w)};GI(wI,p=>{i(T).fields.author&&p(gg)})}var HI=v(wI,2);{var hI=p=>{var w=cV(),QI=O(w,!0);z(w),sI(FI=>vI(QI,FI),[()=>window.moment.unix(i(T).fields.time).format("MMM DD YYYY, HH:mm")]),D(p,w)};GI(HI,p=>{i(T).fields.time&&p(hI)})}z(mI);var WI=v(mI,2),rg=O(WI);let PI=BI(()=>i(T).unwrap());IQ(rg,{get plugin(){return I.plugin},get text(){return i(PI)},get source(){return I.row.path},get class(){return i(T).fields.style}}),z(WI),z(uI),sI(p=>ZI=nI(uI,1,"cmtr-view-range-reply",null,ZI,p),[()=>({"cmtr-view-range-reply-hovered":i(F)===M+1})]),vg("mouseenter",uI,()=>{A(M+1)}),D(aI,uI)}),D(N,q)}),D(y,H)};GI(R,y=>{I.row.range.replies.length&&y(o)})}z(l),sI(y=>{pI(l,"tabindex",I.index),s=nI(l,1,"cmtr-view-range",null,s,y),vI(e,I.row.path)},[()=>({"cmtr-view-range-completed":I.row.range.fields.done,"cmtr-view-range-selected":i(U)})]),vg("mouseenter",l,()=>{A(0)}),vg("mouseleave",l,()=>{A(null)}),vg("blur",l,()=>{Y(B,!1)}),D(C,l),xI()}KI(["click","dblclick","contextmenu"]);var EB=require("obsidian");var kb=require("obsidian");var Cb={days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],meridiem:["am","pm"],suffix:["st","nd","rd","th"],todayBtn:"Today",clearBtn:"Clear",okBtn:"Ok",cancelBtn:"Cancel",timeView:"Show time view",backToDate:"Back to calendar view"};var Bb={theme:"sdt-calendar-colors",format:"yyyy-mm-dd",formatType:"standard",displayFormat:null,displayFormatType:null,minuteIncrement:1,weekStart:1,inputClasses:"",todayBtnClasses:"sdt-action-btn sdt-today-btn",clearBtnClasses:"sdt-action-btn sdt-clear-btn",hourOnly:!1,todayBtn:!0,clearBtn:!0,clearToggle:!0,autocommit:!0,i18n:Cb};var Fb=!1,ig=class C extends Date{#I=Wg(super.getTime());#g=new Map;#C=SI;constructor(...I){super(...I),Fb||this.#B()}#B(){Fb=!0;var I=C.prototype,g=Date.prototype,B=Object.getOwnPropertyNames(g);for(let F of B)(F.startsWith("get")||F.startsWith("to")||F==="valueOf")&&(I[F]=function(...Q){if(Q.length>0)return i(this.#I),g[F].apply(this,Q);var A=this.#g.get(F);if(A===void 0){let U=SI;Gg(this.#C),A=BI(()=>(i(this.#I),g[F].apply(this,Q))),this.#g.set(F,A),Gg(U)}return i(A)}),F.startsWith("set")&&(I[F]=function(...Q){var A=g[F].apply(this,Q);return Y(this.#I,g.getTime.call(this)),A})}};function BF(C){Y(C,C.v+1)}var Qb=Symbol(),cs=class extends URLSearchParams{#I=Wg(0);#g=Ab();#C=!1;#B(){if(!this.#g||this.#C)return;this.#C=!0;let I=this.toString();this.#g.search=I&&`?${I}`,this.#C=!1}[Qb](I){if(!this.#C){this.#C=!0;for(let g of[...super.keys()])super.delete(g);for(let[g,B]of I)super.append(g,B);BF(this.#I),this.#C=!1}}append(I,g){super.append(I,g),this.#B(),BF(this.#I)}delete(I,g){var B=super.has(I,g);super.delete(I,g),B&&(this.#B(),BF(this.#I))}get(I){return i(this.#I),super.get(I)}getAll(I){return i(this.#I),super.getAll(I)}has(I,g){return i(this.#I),super.has(I,g)}keys(){return i(this.#I),super.keys()}set(I,g){var B=super.getAll(I).join("");super.set(I,g),B!==super.getAll(I).join("")&&(this.#B(),BF(this.#I))}sort(){super.sort(),this.#B(),BF(this.#I)}toString(){return i(this.#I),super.toString()}values(){return i(this.#I),super.values()}entries(){return i(this.#I),super.entries()}[Symbol.iterator](){return this.entries()}get size(){return i(this.#I),super.size}};var dV=null;function Ab(){return dV}function gQ(C,I,g,B){if(C instanceof Date)return C;let F=B==="php"?{date:"Y-m-d",datetime:"Y-m-d H:i",datetime_s:"Y-m-d H:i:s"}:{date:"yyyy-mm-dd",datetime:"yyyy-mm-dd hh:ii",datetime_s:"yyyy-mm-dd hh:ii:ss"},Q,A;/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(C)?Q=yF.parseFormat(F.date,B):/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(C)?Q=yF.parseFormat(F.datetime,B):/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(C)?Q=yF.parseFormat(F.datetime_s,B):(/^([01]*\d|2[0-3])([0-5]\d)(?:[ ]([ap][m]|[AP][M]))?$/.test(C)&&(A=C.match(/^([01]*\d|2[0-3])([0-5]\d)(?:[ ]([ap][m]|[AP][M]))?$/)?.slice(1).filter(e=>e)),Q=yF.parseFormat(I,B));let U=A||C&&C.toString().match(yF.nonpunctuation)||[];C=new Date,C.setHours(0,0,0,0);let l={},{setters_order:s,setters_map:G}=yF.setters(B),t,c;if(U.length!==Q.parts.length&&Q.parts.includes("S")){let e=U[Q.parts.indexOf("S")-1].match(/(\d+)([a-zA-Z]+)/)?.slice(1,3);U.splice(Q.parts.indexOf("S")-1,1,...e)}if(U.length===Q.parts.length){for(var d=0,b=Q.parts.length;d14)?g.suffix[F%10-1]:g.suffix[g.suffix.length-1],p:g.meridiem.length===2?g.meridiem[C.getHours()<12?0:1]:"",h:C.getHours(),ii:(C.getMinutes()<10?"0":"")+C.getMinutes(),ss:(C.getUTCSeconds()<10?"0":"")+C.getUTCSeconds()},g.meridiem.length===2?Q.H=Q.h%12===0?12:Q.h%12:Q.H=Q.h,Q.HH=(Q.H<10?"0":"")+Q.H,Q.P=Q.p.toUpperCase(),Q.hh=(Q.h<10?"0":"")+Q.h,Q.i=Q.ii,Q.s=Q.ss,Q.dd=(Q.d<10?"0":"")+Q.d,Q.mm=(Q.m<10?"0":"")+Q.m;else if(B==="php")Q={y:C.getFullYear().toString().substring(2),Y:C.getFullYear(),F:g.months[C.getMonth()],M:g.monthsShort[C.getMonth()],n:C.getMonth()+1,t:kc(C.getFullYear(),C.getMonth()),j:C.getDate(),l:g.days[C.getDay()],D:g.daysShort[C.getDay()],w:C.getDay(),N:C.getDay()===0?7:C.getDay(),S:F%10&&F%10<4&&(F<10||F>14)?g.suffix[F%10-1]:g.suffix[g.suffix.length-1],a:g.meridiem.length===2?g.meridiem[C.getHours()<12?0:1]:"",g:C.getHours()%12===0?12:C.getHours()%12,G:C.getHours(),i:C.getMinutes(),s:C.getSeconds(),U:Math.floor(C.getTime()/1e3)},Q.m=(Q.n<10?"0":"")+Q.n,Q.d=(Q.j<10?"0":"")+Q.j,Q.A=Q.a.toString().toUpperCase(),Q.h=(Q.g<10?"0":"")+Q.g,Q.H=(Q.G<10?"0":"")+Q.G,Q.i=(Q.i<10?"0":"")+Q.i,Q.s=(Q.s<10?"0":"")+Q.s;else throw new Error("Invalid format type.");let A=[],U=yF.parseFormat(I,B);for(var l=0,s=U.parts?.length||0;lB.setHours(F),h:(B,F)=>B.setHours(F),HH:(B,F)=>B.setHours(F===12?0:F),H:(B,F)=>B.setHours(F===12?0:F),i:(B,F)=>B.setMinutes(F),s:(B,F)=>B.setSeconds(F),yyyy:(B,F)=>B.setFullYear(F),yy:(B,F)=>B.setFullYear((F<50?2e3:1900)+F),m:(B,F)=>{for(F-=1;F<0;)F+=12;for(F%=12,B.setMonth(F);B.getMonth()!==F;){if(isNaN(B.getMonth()))return B;B.setDate(B.getDate()-1)}return B},d:(B,F)=>B.setDate(F),p:(B,F)=>B.setHours(F===1&&B.getHours()<12?B.getHours()+12:B.getHours()),t:(B,F)=>B.setTime(F),mm:()=>{},M:()=>{},MM:()=>{},ii:()=>{},ss:()=>{},dd:()=>{},D:()=>{},DD:()=>{},P:()=>{}},g.mm=g.M=g.MM=g.m,g.ii=g.i,g.ss=g.s,g.dd=g.D=g.DD=g.d,g.P=g.p):(I=["Y","yy","m","M","F","n","d","D","j","l","N","S","H","G","h","g","i","s","p","P","U"],g={H:(B,F)=>B.setHours(F),G:(B,F)=>B.setHours(F),h:(B,F)=>B.setHours(F===12?0:F),g:(B,F)=>B.setHours(F===12?0:F),i:(B,F)=>B.setMinutes(F),s:(B,F)=>B.setSeconds(F),Y:(B,F)=>B.setFullYear(F),yy:(B,F)=>B.setFullYear((F<50?2e3:1900)+F),m:(B,F)=>{for(F-=1;F<0;)F+=12;for(F%=12,B.setMonth(F);B.getMonth()!==F;){if(isNaN(B.getMonth()))return B;B.setDate(B.getDate()-1)}return B},n:(B,F)=>B.setMonth(F-1),d:(B,F)=>B.setDate(F),a:(B,F)=>B.setHours(F===1?B.getHours()+12:B.getHours()),U:(B,F)=>B.setTime(F*1e3)},g.F=g.M=g.m,g.D=g.j=g.l=g.N=g.d,g.A=g.a),{setters_order:I,setters_map:g}}};function Ub(C,I,g,B,F){if(g===0){let L=10,R=20,o=-1,y=[],H=[],r=C.getFullYear()-C.getFullYear()%10;r-=r%20?12:10,r%10&&(L=12,R=22);for(let T=0;T<32;T++)H.push(r+T),H.length===4&&(y.push(H),H=[]);let N=[];return I[0]||(I[0]=new Date),I[0].getFullYear()>=r&&N.push(I[0].getFullYear()%r),{years:y,todayMark:o,nextFrom:R,prevTo:L,selectionMark:N}}if(g===1){let L=[],R=[],o=12,y=24,H=C.toISOString().split("T")[0].substring(0,8),r=new Date(H+"01 00:00:00"),N=r.getFullYear()-1;r.setFullYear(N);let T=0;for(let q=0;q<3;q++){for(let AI=0;AI<12;AI++)r.setMonth(AI),R.push(B.monthsShort[AI%12]),R.length===4&&(L.push(R),R=[]);r.setFullYear(r.getFullYear()+1)}let M=[];return I[0]||(I[0]=new Date),I[0].getFullYear()-N>=0&&I[0].getFullYear()-N<=2&&M.push(I[0].getMonth()+(I[0].getFullYear()-N||0)*12),{months:L,todayMark:T,nextFrom:y,prevTo:o,selectionMark:M}}let Q=C||new Date,A=Q.getFullYear(),U=Q.getMonth(),l=Q.getDate(),s=Q.getHours(),G=new Date,t=new Date(A,U-1,28,0,0,0,0),c=kc(t.getFullYear(),t.getMonth());t.setDate(c),t.setDate(c-(t.getDay()-F+7)%7);let d=new Date(t);d.setDate(d.getDate()+42);let b=d.valueOf(),Z=[],e=[],x=-1,a=[],n=0,h=42,m=0;for(;t.valueOf()A||t.getFullYear()===A&&t.getMonth()>U)&&(h=m-1),t.setDate(t.getDate()+1),t.getFullYear()===G.getFullYear()&&t.getMonth()===G.getMonth()&&t.getDate()===G.getDate()&&(x=m),a.length!==I.length&&I.map(L=>{t.getFullYear()===L.getFullYear()&&t.getMonth()===L.getMonth()&&t.getDate()===L.getDate()&&a.push(m)}),e.length===7&&(Z.push(e),e=[]);return{grid:Z,days:Z,todayMark:x,prevTo:n,nextFrom:h,selectionMark:a}}function lb(C){let I=C-1;return I*I*I+1}function sb(C,{duration:I=400,start:g=0,end:B=1,opacity:F=0}){let Q=getComputedStyle(C),A=+Q.opacity,U=Q.transform==="none"?"":Q.transform,l=1-g,s=A*(1-F);return B=B||1,{delay:0,duration:I,easing:lb,css:(G,t)=>` + transform: ${U} scale(${B!==1?g+B*t:1-l*t}); + opacity: ${A-s*t}; + `}}function ZV(C,I,g,B,F,Q,A,U){if(Y(I,-1),Y(g,!0),i(B)&&jA(B,-1),i(B)===0){let l=Math.floor(i(F).getFullYear()/10)*10%20===0;Y(Q,l?A:U,!0)}}function eV(C,I){I.onswitch?.("time")}var VV=f(''),xV=(C,I)=>I(-1),uV=(C,I)=>I(1),LV=(C,I,g)=>{I(i(g))},RV=f(''),nV=f(''),aV=f('
'),mV=(C,I,g)=>{I(i(g))},hV=f(''),XV=f(''),oV=f('
'),yV=f(' '),SV=(C,I,g)=>{I(i(g))},WV=f(''),EV=f(""),NV=f('
'),rV=f('
',1),pV={hash:"svelte-s6uyff",code:`td.svelte-s6uyff,th.svelte-s6uyff {padding:0;border-width:0;}.sdt-cal-td.svelte-s6uyff {padding:0;font-size:90%;text-align:center; /* background-color: var(--sdt-bg-main, #fff); */}.sdt-cal-th.svelte-s6uyff {text-align:center;height:24px;}.sdt-calendar.svelte-s6uyff {height:221px;overflow:hidden;}.sdt-calendar.is-grid.svelte-s6uyff {display:grid;}.sdt-calendar.is-grid.svelte-s6uyff .sdt-table:where(.svelte-s6uyff) {grid-column:1/2;grid-row:1/2;}.sdt-table.svelte-s6uyff {width:100%;border-collapse:collapse;margin:0;background-color:var(--sdt-table-bg, transparent);}.sdt-table-height.svelte-s6uyff {height:222px;}.animate-transition.svelte-s6uyff {will-change:transform;transition:transform .3s ease;}.not-current.svelte-s6uyff {opacity:0.3;}.not-current.svelte-s6uyff:hover {opacity:0.55;}.std-btn.svelte-s6uyff {margin:0;border:0;background:transparent;text-align:center;width:100%;border-radius:4px;cursor:pointer;padding:0.3rem;box-sizing:border-box;color:var(--sdt-color, initial);}.sdt-btn-day.svelte-s6uyff {max-height:32px;height:32px;}.std-btn[disabled].svelte-s6uyff {cursor:not-allowed;opacity:0.5;color:var(--sdt-table-disabled-date, #b22222);background-color:var(--sdt-table-disabled-date-bg, var(--sdt-bg-main, #fff));}.std-btn-header.svelte-s6uyff {width:auto;font-weight:bold;padding:0.375em 0.5em;color:var(--sdt-header-color, var(--sdt-color, initial));}.std-btn-header.icon-btn.svelte-s6uyff:first-of-type {padding-left:0.375em;padding-right:0.375em;}.std-btn-header.icon-btn.svelte-s6uyff {padding-left:0.25em;padding-right:0.25em;}.std-btn.svelte-s6uyff:hover {background-color:var(--sdt-table-data-bg-hover, #eee);}.is-selected.in-range.svelte-s6uyff .std-btn:where(.svelte-s6uyff) {border-radius:4px 0 0 4px}.in-range.svelte-s6uyff .std-btn:where(.svelte-s6uyff), .in-range-hover.svelte-s6uyff:not(.is-selected) .std-btn:where(.svelte-s6uyff) {background-color:color-mix(in srgb, transparent 75%, var(--sdt-bg-selected, #286090));border-radius:0;} /* range selection: start */.in-range-hover.is-selected:has(+ .in-range-hover) .std-btn {border-top-right-radius:0;border-bottom-right-radius:0;}.in-range-hover.svelte-s6uyff + .in-range-hover.is-selected:where(.svelte-s6uyff) .std-btn:where(.svelte-s6uyff) {border-top-left-radius:0;border-bottom-left-radius:0;}.in-range.svelte-s6uyff:not(.is-selected) .std-btn:where(.svelte-s6uyff):hover {background-color:color-mix(in srgb, var(--sdt-table-data-bg-hover, #eee) 75%, var(--sdt-bg-selected, #286090));} @@ -75,7 +75,7 @@ ${Q}`,labels:"bug"})}catch(F){return"https://github.com/Fevol/obsidian-criticmar .is-selected.svelte-s6uyff + .is-selected:where(.svelte-s6uyff) .std-btn:where(.svelte-s6uyff) {border-top-left-radius:0;border-bottom-left-radius:0;}.is-selected.svelte-s6uyff + .is-selected:where(.svelte-s6uyff) .std-btn:where(.svelte-s6uyff) {border-left:1px solid color-mix(in srgb, white 75%, var(--sdt-table-selected-bg, var(--sdt-bg-selected, #286090)));margin-left:-1px;}.is-selected.svelte-s6uyff .std-btn:where(.svelte-s6uyff), .is-selected.in-range.svelte-s6uyff .std-btn:where(.svelte-s6uyff) {background-color:var(--sdt-table-selected-bg, var(--sdt-bg-selected, #286090));color:var(--sdt-color-selected, var(--sdt-bg-main, #fff));opacity:0.9;}.std-btn-header.svelte-s6uyff:hover {background-color:var(--sdt-header-btn-bg-hover, #dfdfdf);}.sdt-time-icon.svelte-s6uyff {display:inline-flex;align-items:center;padding:0.375em !important;}.sdt-time-icon.svelte-s6uyff svg:where(.svelte-s6uyff) {height:1em !important;stroke:initial !important;}.sdt-tbody-lg.svelte-s6uyff {background-color:var(--sdt-bg-main, #fff);}.sdt-tbody-lg.svelte-s6uyff .std-btn:where(.svelte-s6uyff) {height:74px;}.sdt-thead-nav.svelte-s6uyff {display:flex;margin-bottom:0.25em;align-items:stretch;}.sdt-nav-btns.svelte-s6uyff {white-space:nowrap;}.sdt-toggle-btn.svelte-s6uyff {width:100%;text-align:left;}.sdt-today.svelte-s6uyff {position:relative;}.sdt-today.svelte-s6uyff:before {box-sizing:border-box;position:absolute;content:'';margin-left:4px;margin-top:4px;border-left:4px solid var(--sdt-table-today-indicator, #ccc);border-top:4px solid var(--sdt-table-today-indicator, #ccc);border-bottom:4px solid transparent;border-right:4px solid transparent;border-radius:2px;height:4px;z-index:2;}.sdt-svg.svelte-s6uyff {fill:var(--sdt-header-color, initial);}.sdt-today.svelte-s6uyff:hover:before, .in-range.sdt-today.svelte-s6uyff:before {border-left-color:var(--sdt-bg-selected, #286090);border-top-color:var(--sdt-bg-selected, #286090);}.is-selected.sdt-today.svelte-s6uyff:before - {border-left-color:#eee;border-top-color:#eee;}`};function pc(C,I){oI(I,!0),fB(C,lV);let g=H(I,"wid",3,0),B=H(I,"dates",19,()=>[]),F=H(I,"startDate",3,null),A=H(I,"endDate",3,null),Q=H(I,"weekStart",3,1),U=H(I,"initialView",3,2),s=H(I,"enableTimeToggle",3,!1),l=H(I,"isRange",3,!1),d=H(I,"hoverDate",15,null);function c(T,QI){if(t(V)!==2){p(V,2,!0),p(u,1),p(b,new dg(G||new Date),!0);return}if(!G){xI(new Date,{keyboard:!0});return}let CI=new Date(G);switch(T){case"PageDown":QI=!0;case"ArrowDown":QI?CI.setMonth(G.getMonth()+1):CI.setDate(G.getDate()+7),QI&&CI.getMonth()===G.getMonth()&&CI.setDate(0),xI(CI,{keyboard:!0});break;case"PageUp":QI=!0;case"ArrowUp":QI?CI.setMonth(G.getMonth()-1):CI.setDate(G.getDate()-7),QI&&CI.getMonth()===G.getMonth()&&CI.setDate(0),xI(CI,{keyboard:!0});break;case"ArrowLeft":QI?CI.setFullYear(G.getFullYear()-1):CI.setDate(G.getDate()-1),xI(CI,{keyboard:!0});break;case"ArrowRight":QI?CI.setFullYear(G.getFullYear()+1):CI.setDate(G.getDate()+1),xI(CI,{keyboard:!0});break}}function i(T){t(b).setTime(T.getTime()),G=new Date(T.getTime())}let G=B()[g()]||null,b=iI(wI(g()===1?(()=>{if(B().length===2&&B()[1]&&(B()[0].getMonth()!=B()[1].getMonth()||B()[0].getFullYear()!=B()[1].getFullYear()))return new dg(B()[1]);let T=new Date(B()[0]||new Date);return T.setMonth(T.getMonth()+1),new dg(T)})():new dg(B()[0]?.valueOf()||new Date))),e=sI(()=>F()?new dg(F().getFullYear(),F().getMonth(),F().getDate(),0,0,0,0):null),V=iI(wI(U())),u=iI(-2),n=iI(!1),R=400,h=sI(()=>t(u)<1?1.5:.5),m=sI(()=>t(u)<1?1:1.5),a=222,L=148,y=iI(a),E=iI(null),Y=sI(()=>t(u)===-2?uF:t(u)!==null?Pd:()=>({})),N=sI(()=>B().map(T=>(T=new Date(T),T.setHours(0,0,0,0),T.getTime()))),r=sI(()=>Md(t(b),DQ(B()),t(V),I.i18n,Q())),j=sI(()=>I.i18n.daysMin.concat(...I.i18n.daysMin.slice(1)).slice(Q(),7+Q())),_=sI(()=>I.i18n&&$(t(V),t(b)));function D(T){return t(r).prevTo<=T&&TT||A()&&A()<=T||I.additionalDisableFn&&I.additionalDisableFn(T))return!0;break;case 1:let QI=T.getFullYear(),CI=t(e)?.getFullYear(),nI=A()?.getFullYear();if(CI&&t(e)&&(CI===QI&&t(e).getMonth()>T.getMonth()||CI>QI)||nI&&A()&&(nI===QI&&A().getMonth()T.getFullYear()||A()&&A().getFullYear()MI.getFullYear():T.getFullYear()+QI*10MI.getFullYear():T.getFullYear()+QIMI.getFullYear()*100+MI.getMonth():T.getFullYear()*100+T.getMonth()+QI28&&t(b).setDate(t(b).getDate()-3),t(b).setMonth(t(b).getMonth()+T*QI),p(E,null),p(y,t(V)===0?t(b).getFullYear()%20>=10?a:L:a,!0)}function eI(T){if(t(V)===2)return RI(T);if(p(E,()=>{RI(T)}),t(V)===0){p(y,t(y)===L?T===-1?t(y)-a:a+L:T===-1?t(y)-a:t(y)+L,!0);return}p(y,T===-1?t(y)-a:t(y)+a,!0)}function xI(T,{keyboard:QI}={}){switch(p(u,1),p(n,!0),t(V)){case 0:t(b).setFullYear(T),p(b,t(b),!0);break;case 1:t(b).setMonth(I.i18n.monthsShort.indexOf(T)),p(b,t(b),!0);break;case 2:if(UI(T)||I.additionalDisableFn&&I.additionalDisableFn(T))return;let CI=new Date(T.getFullYear(),T.getMonth(),T.getDate());G&&(CI.setMinutes(G.getMinutes()),CI.setHours(G.getHours())),G=CI,QI&&(t(b).getFullYear()!==CI.getFullYear()||t(b).getFullYear()===CI.getFullYear()&&t(b).getMonth()!==CI.getMonth())&&(t(b).setFullYear(CI.getFullYear()),t(b).getDate()>28&&t(b).setDate(28),t(b).setMonth(CI.getMonth()),p(b,t(b),!0)),I.onupdate?.({type:"date",date:G,isKeyboard:QI});break}t(V)<2&&jQ(V),p(y,a)}pg(()=>{B().length===0&&(G=null)});function LI(){p(n,!1)}function $(T,QI){switch(T){case 0:let CI=t(r).years[Math.floor(t(r).prevTo/4)][t(r).prevTo%4],nI=t(r).years[Math.floor(t(r).nextFrom/4)][t(r).nextFrom%4];return`${CI} - ${nI}`;case 1:return QI.getFullYear();case 2:return I.i18n.months[QI.getMonth()]+" "+QI.getFullYear()}}function AI(T=null){return function(QI){d(T?.getTime()||null),I.onhoverupdate?.(d())}}function kI(T){return t(N).length===2?T>=t(N)[0]&&T=QI&&t(N)[0]>=T)}var hI=sV(),YI=JI(hI),yg=O(YI);yg.__click=[fZ,u,n,V,b,y,L,a];var fC=O(yg,!0);z(yg);var J=k(yg,2);{var FI=T=>{var QI=MZ();QI.__click=[zZ,I],lI(()=>{zI(QI,"title",I.i18n.timeView),zI(QI,"aria-label",I.i18n.timeView)}),w(T,QI)};bI(J,T=>{s()&&B().length&&T(FI)})}var mI=k(J,2);mI.__click=[KZ,eI];var ZI=k(mI,2);ZI.__click=[PZ,eI],TA(2),z(YI);var OI=k(YI,2);let dI;var uI=O(OI);{var EI=T=>{var QI=qZ(),CI=O(QI);let nI;Ig(CI,21,()=>t(r).years,sg,(MI,Rg,Hg)=>{var lg=_Z();Ig(lg,21,()=>t(Rg),sg,(Sg,Yg,bg)=>{var Vg=OZ();let Jg=sI(()=>Hg*4+bg),Xg;var eg=O(Vg);let Tg;eg.__click=[jZ,xI,Yg];var ug=O(eg,!0);z(eg),z(Vg),lI((wg,Pg,xg)=>{Xg=WI(Vg,1,"sdt-cal-td svelte-s6uyff",null,Xg,wg),Tg=WI(eg,1,"std-btn svelte-s6uyff",null,Tg,Pg),eg.disabled=xg,PI(ug,t(Yg))},[()=>({"is-selected":t(r).selectionMark.includes(t(Jg))}),()=>({"not-current":!D(t(Jg))}),()=>UI(new Date(t(Yg),t(b).getMonth(),t(b).getDate()))]),w(Sg,Vg)}),z(lg),w(MI,lg)}),z(CI),z(QI),lI(MI=>{nI=WI(CI,1,"sdt-tbody-lg svelte-s6uyff",null,nI,MI),IB(CI,`transform: translateY(-${t(y)}px); color: red`)},[()=>({"animate-transition":!!t(E)})]),VC("outroend",CI,LI),VC("transitionend",CI,()=>t(E)&&t(E)()),CC(1,CI,()=>t(Y),()=>({duration:R,start:t(h),opacity:1})),CC(2,CI,()=>t(Y),()=>({duration:R,end:t(m),start:1})),w(T,QI)};bI(uI,T=>{t(V)===0&&T(EI)})}var _I=k(uI,2);{var fI=T=>{var QI=CV(),CI=O(QI);let nI;Ig(CI,21,()=>t(r).months,sg,(MI,Rg,Hg)=>{var lg=gV();Ig(lg,21,()=>t(Rg),sg,(Sg,Yg,bg)=>{var Vg=IV();let Jg=sI(()=>Hg*4+bg),Xg;var eg=O(Vg);let Tg;eg.__click=[$Z,xI,Yg];var ug=O(eg,!0);z(eg),z(Vg),lI((wg,Pg,xg)=>{Xg=WI(Vg,1,"sdt-cal-td svelte-s6uyff",null,Xg,wg),Tg=WI(eg,1,"std-btn svelte-s6uyff",null,Tg,Pg),eg.disabled=xg,PI(ug,t(Yg))},[()=>({"is-selected":t(Jg)===t(r).selectionMark[0]}),()=>({"not-current":!D(t(Jg))}),()=>UI(new Date(t(b).getFullYear(),I.i18n.monthsShort.indexOf(t(Yg)),t(b).getDate()))]),w(Sg,Vg)}),z(lg),w(MI,lg)}),z(CI),z(QI),lI(MI=>{nI=WI(CI,1,"sdt-tbody-lg svelte-s6uyff",null,nI,MI),IB(CI,`transform: translateY(-${t(y)}px)`)},[()=>({"animate-transition":!!t(E)})]),VC("outroend",CI,LI),VC("transitionend",CI,()=>t(E)&&t(E)()),CC(1,CI,()=>t(Y),()=>({duration:R,start:t(h),opacity:1})),CC(2,CI,()=>t(Y),()=>({duration:R,end:t(m),start:1})),w(T,QI)};bI(_I,T=>{t(V)===1&&T(fI)})}var DI=k(_I,2);{var aI=T=>{var QI=UV(),CI=O(QI),nI=O(CI);Ig(nI,21,()=>t(j),sg,(Rg,Hg)=>{var lg=BV(),Sg=O(lg,!0);z(lg),lI(()=>PI(Sg,t(Hg))),w(Rg,lg)}),z(nI);var MI=k(nI);Ig(MI,17,()=>t(r).days,sg,(Rg,Hg,lg)=>{var Sg=QV();Ig(Sg,21,()=>t(Hg),sg,(Yg,bg,Vg)=>{var Jg=AV();let Xg=sI(()=>lg*7+Vg),eg=sI(()=>t(bg).getTime()),Tg;var ug=sI(()=>AI(t(bg)));Jg.__mouseover=function(...BB){t(ug)?.apply(this,BB)};var wg=sI(AI);Jg.__mouseout=function(...BB){t(wg)?.apply(this,BB)};var Pg=O(Jg);Pg.__click=[FV,xI,bg];let xg;var nF=O(Pg,!0);z(Pg),z(Jg),lI((BB,RF,sA,AQ)=>{Tg=WI(Jg,1,"sdt-cal-td svelte-s6uyff",null,Tg,BB),xg=WI(Pg,1,"std-btn sdt-btn-day svelte-s6uyff",null,xg,RF),Pg.disabled=sA,PI(nF,AQ)},[()=>({"sdt-today":t(Xg)===t(r).todayMark,"in-range":kI(t(eg)),"is-selected":t(N).includes(t(eg)),"in-range-hover":l()&&pI(t(eg),d())}),()=>({"not-current":!D(lg*7+Vg)}),()=>(t(e)||A()||I.additionalDisableFn)&&UI(t(bg)),()=>t(bg).getDate()]),w(Yg,Jg)}),z(Sg),w(Rg,Sg)}),z(CI),z(QI),VC("outroend",CI,LI),CC(1,CI,()=>t(Y),()=>({duration:R,start:.5,opacity:1})),CC(2,CI,()=>t(Y),()=>({duration:R,start:Math.abs(t(u))})),w(T,QI)};bI(DI,T=>{t(V)===2&&T(aI)})}return z(OI),lI((T,QI,CI,nI,MI,Rg,Hg)=>{PI(fC,t(_)),zI(mI,"title",T),zI(mI,"aria-label",QI),mI.disabled=CI,zI(ZI,"title",nI),zI(ZI,"aria-label",MI),ZI.disabled=Rg,dI=WI(OI,1,"sdt-calendar svelte-s6uyff",null,dI,Hg)},[()=>I.i18n.months[(t(b).getMonth()-1)%12],()=>I.i18n.months[(t(b).getMonth()-1)%12],()=>rI(t(b),-1,t(V)),()=>I.i18n.months[(t(b).getMonth()+1)%12],()=>I.i18n.months[(t(b).getMonth()+1)%12],()=>rI(t(b),1,t(V)),()=>({"is-grid":t(n)})]),w(C,hI),yI({handleGridNav:c,focusDate:i})}qI(["click","mouseover","mouseout"]);function tV(C,I,g,B,F,A){let Q=parseInt(C.target.dataset.value);t(I).setHours(Q),p(I,t(I),!0),g.onupdate?.({type:t(B)?"minute":"hour",date:F(t(I)),isKeyboard:C.type==="keyboard",dateIndex:A()})}function jd(C,I){p(I,C.type==="mousedown")}function cV(C,I){I.onswitch("date")}var iV=f(''),GV=(C,I)=>p(I,!1),dV=(C,I)=>p(I,!0),bV=f(' : ',1),eV=f(' '),ZV=f(': 00',1),VV=f(' ',1),uV=f('
'),xV=(C,I)=>{C.preventDefault(),I(C)},LV=(C,I,g)=>{t(I)&&g(C)},aV=f(''),nV=f(''),RV=f('
'),mV={hash:"svelte-1piwi8e",code:`.sdt-timer.svelte-1piwi8e {position:relative; + {border-left-color:#eee;border-top-color:#eee;}`};function Dc(C,I){VI(I,!0),IF(C,pV);let g=J(I,"wid",3,0),B=J(I,"dates",19,()=>[]),F=J(I,"startDate",3,null),Q=J(I,"endDate",3,null),A=J(I,"weekStart",3,1),U=J(I,"initialView",3,2),l=J(I,"enableTimeToggle",3,!1),s=J(I,"isRange",3,!1),G=J(I,"hoverDate",15,null);function t($,dI){if(i(e)!==2){Y(e,2,!0),Y(x,1),Y(b,new ig(d||new Date),!0);return}if(!d){XI(new Date,{keyboard:!0});return}let UI=new Date(d);switch($){case"PageDown":dI=!0;case"ArrowDown":dI?UI.setMonth(d.getMonth()+1):UI.setDate(d.getDate()+7),dI&&UI.getMonth()===d.getMonth()&&UI.setDate(0),XI(UI,{keyboard:!0});break;case"PageUp":dI=!0;case"ArrowUp":dI?UI.setMonth(d.getMonth()-1):UI.setDate(d.getDate()-7),dI&&UI.getMonth()===d.getMonth()&&UI.setDate(0),XI(UI,{keyboard:!0});break;case"ArrowLeft":dI?UI.setFullYear(d.getFullYear()-1):UI.setDate(d.getDate()-1),XI(UI,{keyboard:!0});break;case"ArrowRight":dI?UI.setFullYear(d.getFullYear()+1):UI.setDate(d.getDate()+1),XI(UI,{keyboard:!0});break}}function c($){i(b).setTime($.getTime()),d=new Date($.getTime())}let d=B()[g()]||null,b=lI(rI(g()===1?(()=>{if(B().length===2&&B()[1]&&(B()[0].getMonth()!=B()[1].getMonth()||B()[0].getFullYear()!=B()[1].getFullYear()))return new ig(B()[1]);let $=new Date(B()[0]||new Date);return $.setMonth($.getMonth()+1),new ig($)})():new ig(B()[0]?.valueOf()||new Date))),Z=BI(()=>F()?new ig(F().getFullYear(),F().getMonth(),F().getDate(),0,0,0,0):null),e=lI(rI(U())),x=lI(-2),a=lI(!1),n=400,h=BI(()=>i(x)<1?1.5:.5),m=BI(()=>i(x)<1?1:1.5),L=222,R=148,o=lI(L),y=lI(null),H=BI(()=>i(x)===-2?oF:i(x)!==null?sb:()=>({})),r=BI(()=>B().map($=>($=new Date($),$.setHours(0,0,0,0),$.getTime()))),N=BI(()=>Ub(i(b),DA(B()),i(e),I.i18n,A())),T=BI(()=>I.i18n.daysMin.concat(...I.i18n.daysMin.slice(1)).slice(A(),7+A())),M=BI(()=>I.i18n&&mI(i(e),i(b)));function q($){return i(N).prevTo<=$&&$$||Q()&&Q()<=$||I.additionalDisableFn&&I.additionalDisableFn($))return!0;break;case 1:let dI=$.getFullYear(),UI=i(Z)?.getFullYear(),DI=Q()?.getFullYear();if(UI&&i(Z)&&(UI===dI&&i(Z).getMonth()>$.getMonth()||UI>dI)||DI&&Q()&&(DI===dI&&Q().getMonth()<$.getMonth()||DI$.getFullYear()||Q()&&Q().getFullYear()<$.getFullYear())return!0;break}return!1}function aI($,dI,UI){let DI=dI===1,Ug=DI?Q():i(Z);return Ug?UI===0?DI?$.getFullYear()+dI*10>Ug.getFullYear():$.getFullYear()+dI*10Ug.getFullYear():$.getFullYear()+dIUg.getFullYear()*100+Ug.getMonth():$.getFullYear()*100+$.getMonth()+dI28&&i(b).setDate(i(b).getDate()-3),i(b).setMonth(i(b).getMonth()+$*dI),Y(y,null),Y(o,i(e)===0?i(b).getFullYear()%20>=10?L:R:L,!0)}function ZI($){if(i(e)===2)return uI($);if(Y(y,()=>{uI($)}),i(e)===0){Y(o,i(o)===R?$===-1?i(o)-L:L+R:$===-1?i(o)-L:i(o)+R,!0);return}Y(o,$===-1?i(o)-L:i(o)+L,!0)}function XI($,{keyboard:dI}={}){switch(Y(x,1),Y(a,!0),i(e)){case 0:i(b).setFullYear($),Y(b,i(b),!0);break;case 1:i(b).setMonth(I.i18n.monthsShort.indexOf($)),Y(b,i(b),!0);break;case 2:if(AI($)||I.additionalDisableFn&&I.additionalDisableFn($))return;let UI=new Date($.getFullYear(),$.getMonth(),$.getDate());d&&(UI.setMinutes(d.getMinutes()),UI.setHours(d.getHours())),d=UI,dI&&(i(b).getFullYear()!==UI.getFullYear()||i(b).getFullYear()===UI.getFullYear()&&i(b).getMonth()!==UI.getMonth())&&(i(b).setFullYear(UI.getFullYear()),i(b).getDate()>28&&i(b).setDate(28),i(b).setMonth(UI.getMonth()),Y(b,i(b),!0)),I.onupdate?.({type:"date",date:d,isKeyboard:dI});break}i(e)<2&&jA(e),Y(o,L)}og(()=>{B().length===0&&(d=null)});function kI(){Y(a,!1)}function mI($,dI){switch($){case 0:let UI=i(N).years[Math.floor(i(N).prevTo/4)][i(N).prevTo%4],DI=i(N).years[Math.floor(i(N).nextFrom/4)][i(N).nextFrom%4];return`${UI} - ${DI}`;case 1:return dI.getFullYear();case 2:return I.i18n.months[dI.getMonth()]+" "+dI.getFullYear()}}function wI($=null){return function(dI){G($?.getTime()||null),I.onhoverupdate?.(G())}}function gg($){return i(r).length===2?$>=i(r)[0]&&$=dI&&i(r)[0]>=$)}var hI=rV(),WI=yI(hI),rg=O(WI);rg.__click=[ZV,x,a,e,b,o,R,L];var PI=O(rg,!0);z(rg);var p=v(rg,2);{var w=$=>{var dI=VV();dI.__click=[eV,I],sI(()=>{pI(dI,"title",I.i18n.timeView),pI(dI,"aria-label",I.i18n.timeView)}),D($,dI)};GI(p,$=>{l()&&B().length&&$(w)})}var QI=v(p,2);QI.__click=[xV,ZI];var FI=v(QI,2);FI.__click=[uV,ZI],fQ(2),z(WI);var fI=v(WI,2);let oI;var eI=O(fI);{var MI=$=>{var dI=aV(),UI=O(dI);let DI;qI(UI,21,()=>i(N).years,Qg,(Ug,bC,ZC)=>{var yg=nV();qI(yg,21,()=>i(bC),Qg,(eC,VC,kg)=>{var Rg=RV();let Dg=BI(()=>ZC*4+kg),Tg;var Vg=O(Rg);let $g;Vg.__click=[LV,XI,VC];var xC=O(Vg,!0);z(Vg),z(Rg),sI((uB,WC,ng)=>{Tg=nI(Rg,1,"sdt-cal-td svelte-s6uyff",null,Tg,uB),$g=nI(Vg,1,"std-btn svelte-s6uyff",null,$g,WC),Vg.disabled=ng,vI(xC,i(VC))},[()=>({"is-selected":i(N).selectionMark.includes(i(Dg))}),()=>({"not-current":!q(i(Dg))}),()=>AI(new Date(i(VC),i(b).getMonth(),i(b).getDate()))]),D(eC,Rg)}),z(yg),D(Ug,yg)}),z(UI),z(dI),sI(Ug=>{DI=nI(UI,1,"sdt-tbody-lg svelte-s6uyff",null,DI,Ug),gB(UI,`transform: translateY(-${i(o)}px); color: red`)},[()=>({"animate-transition":!!i(y)})]),vg("outroend",UI,kI),vg("transitionend",UI,()=>i(y)&&i(y)()),_g(1,UI,()=>i(H),()=>({duration:n,start:i(h),opacity:1})),_g(2,UI,()=>i(H),()=>({duration:n,end:i(m),start:1})),D($,dI)};GI(eI,$=>{i(e)===0&&$(MI)})}var Ag=v(eI,2);{var jI=$=>{var dI=oV(),UI=O(dI);let DI;qI(UI,21,()=>i(N).months,Qg,(Ug,bC,ZC)=>{var yg=XV();qI(yg,21,()=>i(bC),Qg,(eC,VC,kg)=>{var Rg=hV();let Dg=BI(()=>ZC*4+kg),Tg;var Vg=O(Rg);let $g;Vg.__click=[mV,XI,VC];var xC=O(Vg,!0);z(Vg),z(Rg),sI((uB,WC,ng)=>{Tg=nI(Rg,1,"sdt-cal-td svelte-s6uyff",null,Tg,uB),$g=nI(Vg,1,"std-btn svelte-s6uyff",null,$g,WC),Vg.disabled=ng,vI(xC,i(VC))},[()=>({"is-selected":i(Dg)===i(N).selectionMark[0]}),()=>({"not-current":!q(i(Dg))}),()=>AI(new Date(i(b).getFullYear(),I.i18n.monthsShort.indexOf(i(VC)),i(b).getDate()))]),D(eC,Rg)}),z(yg),D(Ug,yg)}),z(UI),z(dI),sI(Ug=>{DI=nI(UI,1,"sdt-tbody-lg svelte-s6uyff",null,DI,Ug),gB(UI,`transform: translateY(-${i(o)}px)`)},[()=>({"animate-transition":!!i(y)})]),vg("outroend",UI,kI),vg("transitionend",UI,()=>i(y)&&i(y)()),_g(1,UI,()=>i(H),()=>({duration:n,start:i(h),opacity:1})),_g(2,UI,()=>i(H),()=>({duration:n,end:i(m),start:1})),D($,dI)};GI(Ag,$=>{i(e)===1&&$(jI)})}var YI=v(Ag,2);{var bg=$=>{var dI=NV(),UI=O(dI),DI=O(UI);qI(DI,21,()=>i(T),Qg,(bC,ZC)=>{var yg=yV(),eC=O(yg,!0);z(yg),sI(()=>vI(eC,i(ZC))),D(bC,yg)}),z(DI);var Ug=v(DI);qI(Ug,17,()=>i(N).days,Qg,(bC,ZC,yg)=>{var eC=EV();qI(eC,21,()=>i(ZC),Qg,(VC,kg,Rg)=>{var Dg=WV();let Tg=BI(()=>yg*7+Rg),Vg=BI(()=>i(kg).getTime()),$g;var xC=BI(()=>wI(i(kg)));Dg.__mouseover=function(...FB){i(xC)?.apply(this,FB)};var uB=BI(wI);Dg.__mouseout=function(...FB){i(uB)?.apply(this,FB)};var WC=O(Dg);WC.__click=[SV,XI,kg];let ng;var WF=O(WC,!0);z(WC),z(Dg),sI((FB,EF,lQ,AA)=>{$g=nI(Dg,1,"sdt-cal-td svelte-s6uyff",null,$g,FB),ng=nI(WC,1,"std-btn sdt-btn-day svelte-s6uyff",null,ng,EF),WC.disabled=lQ,vI(WF,AA)},[()=>({"sdt-today":i(Tg)===i(N).todayMark,"in-range":gg(i(Vg)),"is-selected":i(r).includes(i(Vg)),"in-range-hover":s()&&HI(i(Vg),G())}),()=>({"not-current":!q(yg*7+Rg)}),()=>(i(Z)||Q()||I.additionalDisableFn)&&AI(i(kg)),()=>i(kg).getDate()]),D(VC,Dg)}),z(eC),D(bC,eC)}),z(UI),z(dI),vg("outroend",UI,kI),_g(1,UI,()=>i(H),()=>({duration:n,start:.5,opacity:1})),_g(2,UI,()=>i(H),()=>({duration:n,start:Math.abs(i(x))})),D($,dI)};GI(YI,$=>{i(e)===2&&$(bg)})}return z(fI),sI(($,dI,UI,DI,Ug,bC,ZC)=>{vI(PI,i(M)),pI(QI,"title",$),pI(QI,"aria-label",dI),QI.disabled=UI,pI(FI,"title",DI),pI(FI,"aria-label",Ug),FI.disabled=bC,oI=nI(fI,1,"sdt-calendar svelte-s6uyff",null,oI,ZC)},[()=>I.i18n.months[(i(b).getMonth()-1)%12],()=>I.i18n.months[(i(b).getMonth()-1)%12],()=>aI(i(b),-1,i(e)),()=>I.i18n.months[(i(b).getMonth()+1)%12],()=>I.i18n.months[(i(b).getMonth()+1)%12],()=>aI(i(b),1,i(e)),()=>({"is-grid":i(a)})]),D(C,hI),xI({handleGridNav:t,focusDate:c})}KI(["click","mouseover","mouseout"]);function HV(C,I,g,B,F,Q){let A=parseInt(C.target.dataset.value);i(I).setHours(A),Y(I,i(I),!0),g.onupdate?.({type:i(B)?"minute":"hour",date:F(i(I)),isKeyboard:C.type==="keyboard",dateIndex:Q()})}function tb(C,I){Y(I,C.type==="mousedown")}function YV(C,I){I.onswitch("date")}var JV=f(''),vV=(C,I)=>Y(I,!1),kV=(C,I)=>Y(I,!0),DV=f(' : ',1),TV=f(' '),wV=f(': 00',1),fV=f(' ',1),zV=f('
'),MV=(C,I)=>{C.preventDefault(),I(C)},KV=(C,I,g)=>{i(I)&&g(C)},PV=f(''),jV=f(''),OV=f('
'),_V={hash:"svelte-1piwi8e",code:`.sdt-timer.svelte-1piwi8e {position:relative; /* width: 272px; */--sdt-clock-size: 220px;}.sdt-time-head.svelte-1piwi8e {position:relative;display:flex;justify-content:center;align-items:center;margin-bottom:4px;color:var(--sdt-header-color, initial);}.sdt-time-figure.svelte-1piwi8e {font-size:1.5em;font-weight:bold;padding:0 0.375em;}.sdt-time-figure.svelte-1piwi8e + .sdt-time-figure:where(.svelte-1piwi8e) {margin-left:-12px;}.sdt-clock.svelte-1piwi8e {margin:auto;position:relative;width:var(--sdt-clock-size);height:var(--sdt-clock-size);background-color:var(--sdt-clock-bg, #eeeded);border-radius:50%;transition:background-color 0.3s;overflow:hidden;}.sdt-time-btn.svelte-1piwi8e {border:0;background:transparent;text-align:center;border-radius:4px;cursor:pointer;height:38px;padding:0 0.375em;color:var(--sdt-header-color, initial);}.sdt-time-btn.svelte-1piwi8e > svg:where(.svelte-1piwi8e) {stroke:initial !important;}.sdt-svg.svelte-1piwi8e {fill:var(--sdt-header-color, initial);}.sdt-time-btn.svelte-1piwi8e:not(.is-active) {opacity:0.5;}.sdt-time-btn.svelte-1piwi8e:hover {background-color:var(--sdt-header-btn-bg-hover, #dfdfdf);}.sdt-back-btn.svelte-1piwi8e {position:absolute;top:0;left:0;padding:0.3em;opacity:1 !important;}.sdt-meridian.svelte-1piwi8e {position:absolute;top:0;right:0;display:flex;}.sdt-meridian.svelte-1piwi8e .sdt-time-btn:where(.svelte-1piwi8e) {width:56px;font-weight:bold;}.sdt-middle-dot.svelte-1piwi8e {left:50%;top:50%;width:6px;height:6px;position:absolute;transform:translate(-50%, -50%);background-color:var(--sdt-clock-selected-bg, var(--sdt-bg-selected, #286090));border-radius:50%;}.sdt-hand-pointer.svelte-1piwi8e {width:2px;height:calc(40% - 3px);bottom:50%;left:calc(50% - 1px);position:absolute;background-color:var(--sdt-clock-selected-bg, var(--sdt-bg-selected, #286090));transform-origin:center bottom 0;transition:transform 0.3s ease, height 0.15s ease;}.sdt-hand-circle.svelte-1piwi8e {left:-15px;top:-21px;position:relative;width:4px;height:4px;background-color:transparent;border:14px solid var(--sdt-clock-selected-bg, var(--sdt-bg-selected, #286090));border-radius:50%;box-sizing:content-box;}.sdt-tick.svelte-1piwi8e {position:absolute;width:30px;height:30px;border-width:0;transform:translate(-50%, -50%);text-align:center;border-radius:50%;line-height:20px;cursor:pointer;background-color:var(--sdt-clock-time-bg);transition:all 0.3s;color:var(--sdt-clock-color, inherit);}.sdt-tick.svelte-1piwi8e:hover {color:var(--sdt-clock-color-hover);background-color:var(--sdt-clock-time-bg-hover);}.sdt-tick[disabled].svelte-1piwi8e {cursor:not-allowed;color:var(--sdt-clock-disabled, #b22222);background-color:var(--sdt-clock-disabled-bg, var(--sdt-clock-bg, transparent));}.sdt-tick.outer-tick.svelte-1piwi8e {opacity:0;}.sdt-tick.is-selected.svelte-1piwi8e { animation: svelte-1piwi8e-tick-selection 0s 0.175s ease-out forwards;} @keyframes svelte-1piwi8e-tick-selection { @@ -87,13 +87,13 @@ ${Q}`,labels:"bug"})}catch(F){return"https://github.com/Fevol/obsidian-criticmar background-color: var(--sdt-clock-selected-bg, var(--sdt-bg-selected, #286090)); color: var(--sdt-color-selected, var(--sdt-bg-main, #fff)); } -}`};function Hc(C,I){oI(I,!0),fB(C,mV);let g=H(I,"wid",3,0),B=H(I,"date",27,()=>wI(new dg)),F=H(I,"startDate",3,void 0),A=H(I,"endDate",3,void 0),Q=H(I,"hourOnly",3,!1),U=H(I,"minuteIncrement",3,1),s=H(I,"showMeridian",3,!1),l=H(I,"hasDateComponent",3,!1);function d(){p(G,!0)}function c(J){t(G)?(J=J*5+t(R),J%5!==0&&(J=Jt(V)?.getHours()||0),n=sI(()=>s()?t(u)>=12:!1),R=sI(()=>t(V)?.getMinutes()||0),h=sI(()=>{let J=t(G)?t(R)*6:t(u)%12*30;return t(G)||s()||t(u)<12?`transform: rotateZ(${J}deg);`:`transform: rotateZ(${J}deg); height: calc(25% + 1px)`}),m=sI(()=>t(G)?5:1),a=sI(()=>F()&&A()&&["getFullYear","getMonth","getDate"].every(J=>A()[J]()===F()[J]()));function L(J){if(t(V)?.valueOf()!==J?.valueOf()&&J)p(V,new dg(J),!0);else if(!J)if(p(G,!1),t(V))t(V).setHours(0,0);else{let FI=new dg;FI.setHours(0,0),p(V,FI,!0)}}function y(J){let FI=!1;return F()&&F().toDateString()===J.toDateString()&&(_(J.getHours())&&(J.setHours(F().getHours()),FI=!0),_(J.getMinutes(),!0)&&(J.setMinutes(F().getMinutes()),FI=!0)),A()&&A().toDateString()===J.toDateString()&&(_(J.getHours())&&(J.setHours(A().getHours()),FI=!0),_(J.getMinutes(),!0)&&(J.setMinutes(A().getMinutes()),FI=!0)),J}function E(J,FI,mI,ZI,OI){let dI=J/2;FI=FI||dI;let uI=[0,1-.5,1-.134,1,1-.134,1-.5],EI=uI.concat(uI),_I=uI.slice(3).concat(uI).concat(uI.slice(0,3)),fI=[];for(let DI=0;DI<12;DI++)fI.push({x:Math.abs(EI[DI]*dI+(DI<=6?1:-1)*FI),y:Math.abs(_I[DI]*dI+(DI>=9||DI<3?-1:1)*FI),val:ZI?DI*5||mI:DI?DI+OI:mI});return fI}let Y=sI(()=>E(t(G)?220:180,110,"00",!1,0)),N=sI(()=>E(t(G)?180:120,110,t(G)?"00":"12",t(G),12));function r(J,FI){return FI?t(n)&&J===12?12:J<10||J%12<10?`0${J%12}`:J%12:J<10?`0${J}`:J}function j(J,FI,mI){return t(G)?FI===J||mI===0&&mI===J:s()?t(n)&&FI==12&&J===12||!t(n)&&FI==12&&J===0?!0:FI===(J?J%12:12):+FI>12?(mI?t(m)*mI+12:0)===J:FI==="00"||FI==="12"?J===12&&parseInt(FI)==12||FI==="00"&&J===0:FI===J}function _(J,FI=!1){return typeof J=="string"&&(J=parseInt(J)),F()&&A()&&t(a)?t(G)||FI?F().getHours()===t(V).getHours()&&F().getMinutes()>J||A().getHours()===t(V).getHours()&&A().getMinutes()J||A().getHours()J:F().getHours()>J:A()&&A().getDate()===t(V).getDate()&&A().getMonth()===t(V).getMonth()&&A().getFullYear()===t(V).getFullYear()?t(G)||FI?A().getHours()===t(V).getHours()&&A().getMinutes()t(R)?t(R)+U():t(R)-U();else if(ZI%U()!==0){let OI=ZI%U(),dI=ZI-OI,uI=dI+U();ZI=uI-ZIuI?_I=dI>EI?2:1:_I=dI>EI?3:4,_I){case 1:FI=OI-uI,mI=EI-dI;break;case 2:FI=OI-uI,mI=dI-EI;break;case 3:FI=uI-OI,mI=dI-EI;break;case 4:FI=uI-OI,mI=EI-dI;break}let fI=Math.sqrt(FI*FI+mI*mI),DI=90-Math.asin(FI/fI)*(180/Math.PI),aI=0;switch(_I){case 1:aI=90-DI;break;case 2:aI=DI+90;break;case 3:aI=270-DI;break;case 4:aI=DI+270;break}aI=Math.round(aI/6/U())*U(),aI>=60&&(aI=0),t(V).setMinutes(aI)}else return;t(b)||(I.onupdate?.({type:t(G)?"minute":"hour",date:y(t(V)),isKeyboard:J.type==="keyboard",dateIndex:g()}),J.type!=="keyboard"&&!t(G)&&!Q()&&p(G,!0))}pg(()=>{L(B())});var UI=RV(),rI=O(UI),RI=O(rI);{var eI=J=>{var FI=iV();FI.__click=[cV,I],lI(()=>{zI(FI,"title",I.i18n.backToDate),zI(FI,"aria-label",I.i18n.backToDate)}),w(J,FI)};bI(RI,J=>{l()&&J(eI)})}var xI=k(RI,2);{var LI=J=>{var FI=bV(),mI=JI(FI);let ZI;mI.__click=[GV,G];var OI=O(mI,!0);z(mI);var dI=k(mI,4);let uI;dI.__click=[dV,G];var EI=O(dI,!0);z(dI),lI((_I,fI,DI,aI)=>{ZI=WI(mI,1,"sdt-time-btn sdt-time-figure svelte-1piwi8e",null,ZI,_I),PI(OI,fI),uI=WI(dI,1,"sdt-time-btn sdt-time-figure svelte-1piwi8e",null,uI,DI),PI(EI,aI)},[()=>({"is-active":!t(G)}),()=>r(t(u),s()),()=>({"is-active":t(G)}),()=>r(t(R),!1)]),w(J,FI)},$=J=>{var FI=VV(),mI=JI(FI),ZI=O(mI,!0);z(mI);var OI=k(mI,2);{var dI=EI=>{var _I=eV(),fI=O(_I,!0);z(_I),lI(DI=>PI(fI,DI),[()=>(t(n)?I.i18n.meridiem[1]:I.i18n.meridiem[0]).toUpperCase()]),w(EI,_I)},uI=EI=>{var _I=ZV();TA(2),w(EI,_I)};bI(OI,EI=>{s()?EI(dI):EI(uI,!1)})}lI(EI=>PI(ZI,EI),[()=>r(t(u),s())]),w(J,FI)};bI(xI,J=>{Q()?J($,!1):J(LI)})}var AI=k(xI,2);{var kI=J=>{var FI=uV(),mI=O(FI);mI.__click=[tV,V,I,G,y,g];var ZI=O(mI,!0);z(mI),z(FI),lI(()=>{zI(mI,"data-value",t(n)?t(u)%12:t(u)+12),PI(ZI,t(n)?I.i18n.meridiem[1]:I.i18n.meridiem[0])}),w(J,FI)};bI(AI,J=>{s()&&J(kI)})}z(rI);var pI=k(rI,2);let hI;pI.__click=[xV,D],pI.__mousedown=[jd,b],pI.__mousemove=[LV,b,D],pI.__mouseup=[jd,b];var YI=k(O(pI),2),yg=k(YI,2);Ig(yg,19,()=>t(Y),J=>J.val,(J,FI,mI)=>{var ZI=aV();let OI;var dI=O(ZI,!0);z(ZI),lI((uI,EI)=>{IB(ZI,`left:${t(FI).x}px; top:${t(FI).y}px;`),OI=WI(ZI,1,"sdt-tick svelte-1piwi8e",null,OI,uI),zI(ZI,"data-value",t(FI).val),ZI.disabled=EI,PI(dI,t(FI).val)},[()=>({"outer-tick":t(G),"is-selected":j(t(u),t(FI).val,t(mI))}),()=>(F()||A())&&t(V)&&_(t(FI).val,!1)]),CC(3,ZI,()=>uF,()=>({duration:200})),w(J,ZI)});var fC=k(yg,2);return Ig(fC,17,()=>t(N),sg,(J,FI,mI)=>{var ZI=nV();let OI;var dI=O(ZI,!0);z(ZI),lI((uI,EI)=>{IB(ZI,`left:${t(FI).x}px; top:${t(FI).y}px;`),OI=WI(ZI,1,"sdt-tick svelte-1piwi8e",null,OI,uI),zI(ZI,"data-value",t(FI).val),ZI.disabled=EI,PI(dI,t(FI).val)},[()=>({"outer-tick":s()&&!t(G),"is-selected":j(t(G)?t(R):t(u),t(FI).val,mI)}),()=>(F()||A())&&t(V)&&_(t(FI).val,!1)]),CC(3,ZI,()=>uF,()=>({duration:200})),w(J,ZI)}),z(pI),cB(pI,J=>i=J,()=>i),z(UI),lI(J=>{hI=WI(pI,1,"sdt-clock svelte-1piwi8e",null,hI,J),IB(YI,t(h))},[()=>({"is-minute-view":t(G)})]),CC(1,UI,()=>uF,()=>({duration:200})),w(C,UI),yI({showMinuteView:d,makeTick:c})}qI(["click","mousedown","mousemove","mouseup"]);var qA=Math.min,PB=Math.max,eU=Math.round,ZU=Math.floor,GB=C=>({x:C,y:C}),hV={left:"right",right:"left",bottom:"top",top:"bottom"},oV={start:"end",end:"start"};function Yc(C,I,g){return PB(C,qA(I,g))}function sl(C,I){return typeof C=="function"?C(I):C}function CA(C){return C.split("-")[0]}function ll(C){return C.split("-")[1]}function Jc(C){return C==="x"?"y":"x"}function vc(C){return C==="y"?"height":"width"}function BA(C){return["top","bottom"].includes(CA(C))?"y":"x"}function kc(C){return Jc(BA(C))}function Od(C,I,g){g===void 0&&(g=!1);let B=ll(C),F=kc(C),A=vc(F),Q=F==="x"?B===(g?"end":"start")?"right":"left":B==="start"?"bottom":"top";return I.reference[A]>I.floating[A]&&(Q=bU(Q)),[Q,bU(Q)]}function _d(C){let I=bU(C);return[Ul(C),I,Ul(I)]}function Ul(C){return C.replace(/start|end/g,I=>oV[I])}function yV(C,I,g){let B=["left","right"],F=["right","left"],A=["top","bottom"],Q=["bottom","top"];switch(C){case"top":case"bottom":return g?I?F:B:I?B:F;case"left":case"right":return I?A:Q;default:return[]}}function qd(C,I,g,B){let F=ll(C),A=yV(CA(C),g==="start",B);return F&&(A=A.map(Q=>Q+"-"+F),I&&(A=A.concat(A.map(Ul)))),A}function bU(C){return C.replace(/left|right|bottom|top/g,I=>hV[I])}function SV(C){return{top:0,right:0,bottom:0,left:0,...C}}function $d(C){return typeof C!="number"?SV(C):{top:C,right:C,bottom:C,left:C}}function FA(C){let{x:I,y:g,width:B,height:F}=C;return{width:B,height:F,top:g,left:I,right:I+B,bottom:g+F,x:I,y:g}}function Ib(C,I,g){let{reference:B,floating:F}=C,A=BA(I),Q=kc(I),U=vc(Q),s=CA(I),l=A==="y",d=B.x+B.width/2-F.width/2,c=B.y+B.height/2-F.height/2,i=B[U]/2-F[U]/2,G;switch(s){case"top":G={x:d,y:B.y-F.height};break;case"bottom":G={x:d,y:B.y+B.height};break;case"right":G={x:B.x+B.width,y:c};break;case"left":G={x:B.x-F.width,y:c};break;default:G={x:B.x,y:B.y}}switch(ll(I)){case"start":G[Q]-=i*(g&&l?-1:1);break;case"end":G[Q]+=i*(g&&l?-1:1);break}return G}var gb=async(C,I,g)=>{let{placement:B="bottom",strategy:F="absolute",middleware:A=[],platform:Q}=g,U=A.filter(Boolean),s=await(Q.isRTL==null?void 0:Q.isRTL(I)),l=await Q.getElementRects({reference:C,floating:I,strategy:F}),{x:d,y:c}=Ib(l,B,s),i=B,G={},b=0;for(let e=0;eD<=0)){var N,r;let D=(((N=A.flip)==null?void 0:N.index)||0)+1,UI=L[D];if(UI){var j;let RI=c==="alignment"?n!==BA(UI):!1,eI=((j=Y[0])==null?void 0:j.overflows[0])>0;if(!RI||eI)return{data:{index:D,overflows:Y},reset:{placement:UI}}}let rI=(r=Y.filter(RI=>RI.overflows[0]<=0).sort((RI,eI)=>RI.overflows[1]-eI.overflows[1])[0])==null?void 0:r.placement;if(!rI)switch(G){case"bestFit":{var _;let RI=(_=Y.filter(eI=>{if(a){let xI=BA(eI.placement);return xI===n||xI==="y"}return!0}).map(eI=>[eI.placement,eI.overflows.filter(xI=>xI>0).reduce((xI,LI)=>xI+LI,0)]).sort((eI,xI)=>eI[1]-xI[1])[0])==null?void 0:_[0];RI&&(rI=RI);break}case"initialPlacement":rI=U;break}if(F!==rI)return{reset:{placement:rI}}}return{}}}};var Bb=function(C){return C===void 0&&(C={}),{name:"shift",options:C,async fn(I){let{x:g,y:B,placement:F}=I,{mainAxis:A=!0,crossAxis:Q=!1,limiter:U={fn:V=>{let{x:u,y:n}=V;return{x:u,y:n}}},...s}=sl(C,I),l={x:g,y:B},d=await Dc(I,s),c=BA(CA(F)),i=Jc(c),G=l[i],b=l[c];if(A){let V=i==="y"?"top":"left",u=i==="y"?"bottom":"right",n=G+d[V],R=G-d[u];G=Yc(n,G,R)}if(Q){let V=c==="y"?"top":"left",u=c==="y"?"bottom":"right",n=b+d[V],R=b-d[u];b=Yc(n,b,R)}let e=U.fn({...I,[i]:G,[c]:b});return{...e,data:{x:e.x-g,y:e.y-B,enabled:{[i]:A,[c]:Q}}}}}};function tl(){return typeof window<"u"}function AA(C){return Ab(C)?(C.nodeName||"").toLowerCase():"#document"}function XC(C){var I;return(C==null||(I=C.ownerDocument)==null?void 0:I.defaultView)||window}function dB(C){var I;return(I=(Ab(C)?C.ownerDocument:C.document)||window.document)==null?void 0:I.documentElement}function Ab(C){return tl()?C instanceof Node||C instanceof XC(C).Node:!1}function gB(C){return tl()?C instanceof Element||C instanceof XC(C).Element:!1}function bB(C){return tl()?C instanceof HTMLElement||C instanceof XC(C).HTMLElement:!1}function Fb(C){return!tl()||typeof ShadowRoot>"u"?!1:C instanceof ShadowRoot||C instanceof XC(C).ShadowRoot}function IQ(C){let{overflow:I,overflowX:g,overflowY:B,display:F}=CB(C);return/auto|scroll|overlay|hidden|clip/.test(I+B+g)&&!["inline","contents"].includes(F)}function Qb(C){return["table","td","th"].includes(AA(C))}function VU(C){return[":popover-open",":modal"].some(I=>{try{return C.matches(I)}catch{return!1}})}function cl(C){let I=il(),g=gB(C)?CB(C):C;return["transform","translate","scale","rotate","perspective"].some(B=>g[B]?g[B]!=="none":!1)||(g.containerType?g.containerType!=="normal":!1)||!I&&(g.backdropFilter?g.backdropFilter!=="none":!1)||!I&&(g.filter?g.filter!=="none":!1)||["transform","translate","scale","rotate","perspective","filter"].some(B=>(g.willChange||"").includes(B))||["paint","layout","strict","content"].some(B=>(g.contain||"").includes(B))}function Ub(C){let I=jB(C);for(;bB(I)&&!QA(I);){if(cl(I))return I;if(VU(I))return null;I=jB(I)}return null}function il(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function QA(C){return["html","body","#document"].includes(AA(C))}function CB(C){return XC(C).getComputedStyle(C)}function uU(C){return gB(C)?{scrollLeft:C.scrollLeft,scrollTop:C.scrollTop}:{scrollLeft:C.scrollX,scrollTop:C.scrollY}}function jB(C){if(AA(C)==="html")return C;let I=C.assignedSlot||C.parentNode||Fb(C)&&C.host||dB(C);return Fb(I)?I.host:I}function sb(C){let I=jB(C);return QA(I)?C.ownerDocument?C.ownerDocument.body:C.body:bB(I)&&IQ(I)?I:sb(I)}function $A(C,I,g){var B;I===void 0&&(I=[]),g===void 0&&(g=!0);let F=sb(C),A=F===((B=C.ownerDocument)==null?void 0:B.body),Q=XC(F);if(A){let U=Gl(Q);return I.concat(Q,Q.visualViewport||[],IQ(F)?F:[],U&&g?$A(U):[])}return I.concat(F,$A(F,[],g))}function Gl(C){return C.parent&&Object.getPrototypeOf(C.parent)?C.frameElement:null}function cb(C){let I=CB(C),g=parseFloat(I.width)||0,B=parseFloat(I.height)||0,F=bB(C),A=F?C.offsetWidth:g,Q=F?C.offsetHeight:B,U=eU(g)!==A||eU(B)!==Q;return U&&(g=A,B=Q),{width:g,height:B,$:U}}function wc(C){return gB(C)?C:C.contextElement}function gQ(C){let I=wc(C);if(!bB(I))return GB(1);let g=I.getBoundingClientRect(),{width:B,height:F,$:A}=cb(I),Q=(A?eU(g.width):g.width)/B,U=(A?eU(g.height):g.height)/F;return(!Q||!Number.isFinite(Q))&&(Q=1),(!U||!Number.isFinite(U))&&(U=1),{x:Q,y:U}}var XV=GB(0);function ib(C){let I=XC(C);return!il()||!I.visualViewport?XV:{x:I.visualViewport.offsetLeft,y:I.visualViewport.offsetTop}}function WV(C,I,g){return I===void 0&&(I=!1),!g||I&&g!==XC(C)?!1:I}function UA(C,I,g,B){I===void 0&&(I=!1),g===void 0&&(g=!1);let F=C.getBoundingClientRect(),A=wc(C),Q=GB(1);I&&(B?gB(B)&&(Q=gQ(B)):Q=gQ(C));let U=WV(A,g,B)?ib(A):GB(0),s=(F.left+U.x)/Q.x,l=(F.top+U.y)/Q.y,d=F.width/Q.x,c=F.height/Q.y;if(A){let i=XC(A),G=B&&gB(B)?XC(B):B,b=i,e=Gl(b);for(;e&&B&&G!==b;){let V=gQ(e),u=e.getBoundingClientRect(),n=CB(e),R=u.left+(e.clientLeft+parseFloat(n.paddingLeft))*V.x,h=u.top+(e.clientTop+parseFloat(n.paddingTop))*V.y;s*=V.x,l*=V.y,d*=V.x,c*=V.y,s+=R,l+=h,b=XC(e),e=Gl(b)}}return FA({width:d,height:c,x:s,y:l})}function fc(C,I){let g=uU(C).scrollLeft;return I?I.left+g:UA(dB(C)).left+g}function Gb(C,I,g){g===void 0&&(g=!1);let B=C.getBoundingClientRect(),F=B.left+I.scrollLeft-(g?0:fc(C,B)),A=B.top+I.scrollTop;return{x:F,y:A}}function EV(C){let{elements:I,rect:g,offsetParent:B,strategy:F}=C,A=F==="fixed",Q=dB(B),U=I?VU(I.floating):!1;if(B===Q||U&&A)return g;let s={scrollLeft:0,scrollTop:0},l=GB(1),d=GB(0),c=bB(B);if((c||!c&&!A)&&((AA(B)!=="body"||IQ(Q))&&(s=uU(B)),bB(B))){let G=UA(B);l=gQ(B),d.x=G.x+B.clientLeft,d.y=G.y+B.clientTop}let i=Q&&!c&&!A?Gb(Q,s,!0):GB(0);return{width:g.width*l.x,height:g.height*l.y,x:g.x*l.x-s.scrollLeft*l.x+d.x+i.x,y:g.y*l.y-s.scrollTop*l.y+d.y+i.y}}function rV(C){return Array.from(C.getClientRects())}function NV(C){let I=dB(C),g=uU(C),B=C.ownerDocument.body,F=PB(I.scrollWidth,I.clientWidth,B.scrollWidth,B.clientWidth),A=PB(I.scrollHeight,I.clientHeight,B.scrollHeight,B.clientHeight),Q=-g.scrollLeft+fc(C),U=-g.scrollTop;return CB(B).direction==="rtl"&&(Q+=PB(I.clientWidth,B.clientWidth)-F),{width:F,height:A,x:Q,y:U}}function pV(C,I){let g=XC(C),B=dB(C),F=g.visualViewport,A=B.clientWidth,Q=B.clientHeight,U=0,s=0;if(F){A=F.width,Q=F.height;let l=il();(!l||l&&I==="fixed")&&(U=F.offsetLeft,s=F.offsetTop)}return{width:A,height:Q,x:U,y:s}}function HV(C,I){let g=UA(C,!0,I==="fixed"),B=g.top+C.clientTop,F=g.left+C.clientLeft,A=bB(C)?gQ(C):GB(1),Q=C.clientWidth*A.x,U=C.clientHeight*A.y,s=F*A.x,l=B*A.y;return{width:Q,height:U,x:s,y:l}}function lb(C,I,g){let B;if(I==="viewport")B=pV(C,g);else if(I==="document")B=NV(dB(C));else if(gB(I))B=HV(I,g);else{let F=ib(C);B={x:I.x-F.x,y:I.y-F.y,width:I.width,height:I.height}}return FA(B)}function db(C,I){let g=jB(C);return g===I||!gB(g)||QA(g)?!1:CB(g).position==="fixed"||db(g,I)}function YV(C,I){let g=I.get(C);if(g)return g;let B=$A(C,[],!1).filter(U=>gB(U)&&AA(U)!=="body"),F=null,A=CB(C).position==="fixed",Q=A?jB(C):C;for(;gB(Q)&&!QA(Q);){let U=CB(Q),s=cl(Q);!s&&U.position==="fixed"&&(F=null),(A?!s&&!F:!s&&U.position==="static"&&!!F&&["absolute","fixed"].includes(F.position)||IQ(Q)&&!s&&db(C,Q))?B=B.filter(d=>d!==Q):F=U,Q=jB(Q)}return I.set(C,B),B}function JV(C){let{element:I,boundary:g,rootBoundary:B,strategy:F}=C,Q=[...g==="clippingAncestors"?VU(I)?[]:YV(I,this._c):[].concat(g),B],U=Q[0],s=Q.reduce((l,d)=>{let c=lb(I,d,F);return l.top=PB(c.top,l.top),l.right=qA(c.right,l.right),l.bottom=qA(c.bottom,l.bottom),l.left=PB(c.left,l.left),l},lb(I,U,F));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}}function vV(C){let{width:I,height:g}=cb(C);return{width:I,height:g}}function kV(C,I,g){let B=bB(I),F=dB(I),A=g==="fixed",Q=UA(C,!0,A,I),U={scrollLeft:0,scrollTop:0},s=GB(0);function l(){s.x=fc(F)}if(B||!B&&!A)if((AA(I)!=="body"||IQ(F))&&(U=uU(I)),B){let G=UA(I,!0,A,I);s.x=G.x+I.clientLeft,s.y=G.y+I.clientTop}else F&&l();A&&!B&&F&&l();let d=F&&!B&&!A?Gb(F,U):GB(0),c=Q.left+U.scrollLeft-s.x-d.x,i=Q.top+U.scrollTop-s.y-d.y;return{x:c,y:i,width:Q.width,height:Q.height}}function Tc(C){return CB(C).position==="static"}function tb(C,I){if(!bB(C)||CB(C).position==="fixed")return null;if(I)return I(C);let g=C.offsetParent;return dB(C)===g&&(g=g.ownerDocument.body),g}function bb(C,I){let g=XC(C);if(VU(C))return g;if(!bB(C)){let F=jB(C);for(;F&&!QA(F);){if(gB(F)&&!Tc(F))return F;F=jB(F)}return g}let B=tb(C,I);for(;B&&Qb(B)&&Tc(B);)B=tb(B,I);return B&&QA(B)&&Tc(B)&&!cl(B)?g:B||Ub(C)||g}var DV=async function(C){let I=this.getOffsetParent||bb,g=this.getDimensions,B=await g(C.floating);return{reference:kV(C.reference,await I(C.floating),C.strategy),floating:{x:0,y:0,width:B.width,height:B.height}}};function TV(C){return CB(C).direction==="rtl"}var wV={convertOffsetParentRelativeRectToViewportRelativeRect:EV,getDocumentElement:dB,getClippingRect:JV,getOffsetParent:bb,getElementRects:DV,getClientRects:rV,getDimensions:vV,getScale:gQ,isElement:gB,isRTL:TV};function eb(C,I){return C.x===I.x&&C.y===I.y&&C.width===I.width&&C.height===I.height}function fV(C,I){let g=null,B,F=dB(C);function A(){var U;clearTimeout(B),(U=g)==null||U.disconnect(),g=null}function Q(U,s){U===void 0&&(U=!1),s===void 0&&(s=1),A();let l=C.getBoundingClientRect(),{left:d,top:c,width:i,height:G}=l;if(U||I(),!i||!G)return;let b=ZU(c),e=ZU(F.clientWidth-(d+i)),V=ZU(F.clientHeight-(c+G)),u=ZU(d),R={rootMargin:-b+"px "+-e+"px "+-V+"px "+-u+"px",threshold:PB(0,qA(1,s))||1},h=!0;function m(a){let L=a[0].intersectionRatio;if(L!==s){if(!h)return Q();L?Q(!1,L):B=setTimeout(()=>{Q(!1,1e-7)},1e3)}L===1&&!eb(l,C.getBoundingClientRect())&&Q(),h=!1}try{g=new IntersectionObserver(m,{...R,root:F.ownerDocument})}catch{g=new IntersectionObserver(m,R)}g.observe(C)}return Q(!0),A}function Zb(C,I,g,B){B===void 0&&(B={});let{ancestorScroll:F=!0,ancestorResize:A=!0,elementResize:Q=typeof ResizeObserver=="function",layoutShift:U=typeof IntersectionObserver=="function",animationFrame:s=!1}=B,l=wc(C),d=F||A?[...l?$A(l):[],...$A(I)]:[];d.forEach(u=>{F&&u.addEventListener("scroll",g,{passive:!0}),A&&u.addEventListener("resize",g)});let c=l&&U?fV(l,g):null,i=-1,G=null;Q&&(G=new ResizeObserver(u=>{let[n]=u;n&&n.target===l&&G&&(G.unobserve(I),cancelAnimationFrame(i),i=requestAnimationFrame(()=>{var R;(R=G)==null||R.observe(I)})),g()}),l&&!s&&G.observe(l),G.observe(I));let b,e=s?UA(C):null;s&&V();function V(){let u=UA(C);e&&!eb(e,u)&&g(),e=u,b=requestAnimationFrame(V)}return g(),()=>{var u;d.forEach(n=>{F&&n.removeEventListener("scroll",g),A&&n.removeEventListener("resize",g)}),c?.(),(u=G)==null||u.disconnect(),G=null,s&&cancelAnimationFrame(b)}}var Vb=Bb,ub=Cb;var xb=(C,I,g)=>{let B=new Map,F={platform:wV,...g},A={...F.platform,_c:B};return gb(C,I,{...F,platform:A})};function Lb(C){let I=C.parentElement?.querySelector("input[type=text]");if(!I)return;let g=Zb(I,C,()=>xb(I,C,{placement:"bottom-start",middleware:[Vb({padding:5}),ub()]}).then(({x:B,y:F})=>{Object.assign(C.style,{left:`${B}px`,top:`${F}px`})}));return{destroy(){g()}}}function ab(C,I,g,B){let F=C?Array.isArray(C)?C:C.split(","):[];return F=F.map(A=>A.replace(/(:\d+):\d+(.*)/,"$1$2")),{iValues:F,iValueCombined:F.length?F.join():null,iDates:F.map(A=>gA(A,I,g,B))}}function nb(C,I){return C==="auto"?I.match(/g|hh?|ii?/i)&&I.match(/y|m|d/i)?"datetime":I.match(/g|hh?|ii?/i)?"time":"date":C}var BC=Td,zV=f(' '),MV=f(''),KV=f(''),PV=f(" "),jV=f('
'),OV=f(''),_V=f(' ',1),qV=C=>C.preventDefault(),$V=f('
'),Iu=f('
'),gu=f('
'),Cu={hash:"svelte-yheoi9",code:`.sdt-component-wrap.svelte-yheoi9 {position:relative;display:inline-block;}.sdt-input-wrap.svelte-yheoi9 {position:relative;display:contents;}.sdt-calendar-wrap.svelte-yheoi9 {width:280px;background-color:var(--sdt-bg-main, #fff);box-shadow:var(--sdt-wrap-shadow, 0 1px 6px var(--sdt-shadow-color, #ccc));border-radius:var(--sdt-radius, 4px);padding:0.5em;color:var(--sdt-color, initial);}.sdt-calendar-wrap.is-range-wrap.svelte-yheoi9 {width:560px;}.sdt-widget-wrap.svelte-yheoi9 {display:flex;gap:0.5rem;justify-content:stretch;position:relative;}.sdt-widget.svelte-yheoi9 {flex:1;min-width:264px;}.value-dirty.svelte-yheoi9 {color:color-mix(in srgb, black 20%, white);}.sdt-calendar-wrap.is-popup.svelte-yheoi9 {position:absolute;box-shadow:0 1px 6px var(--sdt-shadow-color, #ccc);z-index:100;}.sdt-btn-row.svelte-yheoi9 {margin-top:0.5rem;display:flex;gap:0.5rem;justify-content:space-between;flex-flow:row-reverse;}.sdt-action-btn.svelte-yheoi9 {padding:0.25em 0.5em;font-size:0.875em;border-radius:0.2em;}.sdt-today-btn.svelte-yheoi9 {background-color:var(--sdt-bg-selected, #286090);color:var(--sdt-today-color, var(--sdt-bg-main, #fff));padding:0.25em 0.5em;font-size:0.875em;border-radius:0.2em;border:1px solid var(--sdt-today-bg, #286090);}.sdt-today-btn[disabled].svelte-yheoi9 {opacity:0.5;cursor:not-allowed;}.sdt-today-btn.svelte-yheoi9:focus, +}`};function Tc(C,I){VI(I,!0),IF(C,_V);let g=J(I,"wid",3,0),B=J(I,"date",27,()=>rI(new ig)),F=J(I,"startDate",3,void 0),Q=J(I,"endDate",3,void 0),A=J(I,"hourOnly",3,!1),U=J(I,"minuteIncrement",3,1),l=J(I,"showMeridian",3,!1),s=J(I,"hasDateComponent",3,!1);function G(){Y(d,!0)}function t(p){i(d)?(p=p*5+i(n),p%5!==0&&(p=pi(e)?.getHours()||0),a=BI(()=>l()?i(x)>=12:!1),n=BI(()=>i(e)?.getMinutes()||0),h=BI(()=>{let p=i(d)?i(n)*6:i(x)%12*30;return i(d)||l()||i(x)<12?`transform: rotateZ(${p}deg);`:`transform: rotateZ(${p}deg); height: calc(25% + 1px)`}),m=BI(()=>i(d)?5:1),L=BI(()=>F()&&Q()&&["getFullYear","getMonth","getDate"].every(p=>Q()[p]()===F()[p]()));function R(p){if(i(e)?.valueOf()!==p?.valueOf()&&p)Y(e,new ig(p),!0);else if(!p)if(Y(d,!1),i(e))i(e).setHours(0,0);else{let w=new ig;w.setHours(0,0),Y(e,w,!0)}}function o(p){let w=!1;return F()&&F().toDateString()===p.toDateString()&&(M(p.getHours())&&(p.setHours(F().getHours()),w=!0),M(p.getMinutes(),!0)&&(p.setMinutes(F().getMinutes()),w=!0)),Q()&&Q().toDateString()===p.toDateString()&&(M(p.getHours())&&(p.setHours(Q().getHours()),w=!0),M(p.getMinutes(),!0)&&(p.setMinutes(Q().getMinutes()),w=!0)),p}function y(p,w,QI,FI,fI){let oI=p/2;w=w||oI;let eI=[0,1-.5,1-.134,1,1-.134,1-.5],MI=eI.concat(eI),Ag=eI.slice(3).concat(eI).concat(eI.slice(0,3)),jI=[];for(let YI=0;YI<12;YI++)jI.push({x:Math.abs(MI[YI]*oI+(YI<=6?1:-1)*w),y:Math.abs(Ag[YI]*oI+(YI>=9||YI<3?-1:1)*w),val:FI?YI*5||QI:YI?YI+fI:QI});return jI}let H=BI(()=>y(i(d)?220:180,110,"00",!1,0)),r=BI(()=>y(i(d)?180:120,110,i(d)?"00":"12",i(d),12));function N(p,w){return w?i(a)&&p===12?12:p<10||p%12<10?`0${p%12}`:p%12:p<10?`0${p}`:p}function T(p,w,QI){return i(d)?w===p||QI===0&&QI===p:l()?i(a)&&w==12&&p===12||!i(a)&&w==12&&p===0?!0:w===(p?p%12:12):+w>12?(QI?i(m)*QI+12:0)===p:w==="00"||w==="12"?p===12&&parseInt(w)==12||w==="00"&&p===0:w===p}function M(p,w=!1){return typeof p=="string"&&(p=parseInt(p)),F()&&Q()&&i(L)?i(d)||w?F().getHours()===i(e).getHours()&&F().getMinutes()>p||Q().getHours()===i(e).getHours()&&Q().getMinutes()p||Q().getHours()p:F().getHours()>p:Q()&&Q().getDate()===i(e).getDate()&&Q().getMonth()===i(e).getMonth()&&Q().getFullYear()===i(e).getFullYear()?i(d)||w?Q().getHours()===i(e).getHours()&&Q().getMinutes()i(n)?i(n)+U():i(n)-U();else if(FI%U()!==0){let fI=FI%U(),oI=FI-fI,eI=oI+U();FI=eI-FIeI?Ag=oI>MI?2:1:Ag=oI>MI?3:4,Ag){case 1:w=fI-eI,QI=MI-oI;break;case 2:w=fI-eI,QI=oI-MI;break;case 3:w=eI-fI,QI=oI-MI;break;case 4:w=eI-fI,QI=MI-oI;break}let jI=Math.sqrt(w*w+QI*QI),YI=90-Math.asin(w/jI)*(180/Math.PI),bg=0;switch(Ag){case 1:bg=90-YI;break;case 2:bg=YI+90;break;case 3:bg=270-YI;break;case 4:bg=YI+270;break}bg=Math.round(bg/6/U())*U(),bg>=60&&(bg=0),i(e).setMinutes(bg)}else return;i(b)||(I.onupdate?.({type:i(d)?"minute":"hour",date:o(i(e)),isKeyboard:p.type==="keyboard",dateIndex:g()}),p.type!=="keyboard"&&!i(d)&&!A()&&Y(d,!0))}og(()=>{R(B())});var AI=OV(),aI=O(AI),uI=O(aI);{var ZI=p=>{var w=JV();w.__click=[YV,I],sI(()=>{pI(w,"title",I.i18n.backToDate),pI(w,"aria-label",I.i18n.backToDate)}),D(p,w)};GI(uI,p=>{s()&&p(ZI)})}var XI=v(uI,2);{var kI=p=>{var w=DV(),QI=yI(w);let FI;QI.__click=[vV,d];var fI=O(QI,!0);z(QI);var oI=v(QI,4);let eI;oI.__click=[kV,d];var MI=O(oI,!0);z(oI),sI((Ag,jI,YI,bg)=>{FI=nI(QI,1,"sdt-time-btn sdt-time-figure svelte-1piwi8e",null,FI,Ag),vI(fI,jI),eI=nI(oI,1,"sdt-time-btn sdt-time-figure svelte-1piwi8e",null,eI,YI),vI(MI,bg)},[()=>({"is-active":!i(d)}),()=>N(i(x),l()),()=>({"is-active":i(d)}),()=>N(i(n),!1)]),D(p,w)},mI=p=>{var w=fV(),QI=yI(w),FI=O(QI,!0);z(QI);var fI=v(QI,2);{var oI=MI=>{var Ag=TV(),jI=O(Ag,!0);z(Ag),sI(YI=>vI(jI,YI),[()=>(i(a)?I.i18n.meridiem[1]:I.i18n.meridiem[0]).toUpperCase()]),D(MI,Ag)},eI=MI=>{var Ag=wV();fQ(2),D(MI,Ag)};GI(fI,MI=>{l()?MI(oI):MI(eI,!1)})}sI(MI=>vI(FI,MI),[()=>N(i(x),l())]),D(p,w)};GI(XI,p=>{A()?p(mI,!1):p(kI)})}var wI=v(XI,2);{var gg=p=>{var w=zV(),QI=O(w);QI.__click=[HV,e,I,d,o,g];var FI=O(QI,!0);z(QI),z(w),sI(()=>{pI(QI,"data-value",i(a)?i(x)%12:i(x)+12),vI(FI,i(a)?I.i18n.meridiem[1]:I.i18n.meridiem[0])}),D(p,w)};GI(wI,p=>{l()&&p(gg)})}z(aI);var HI=v(aI,2);let hI;HI.__click=[MV,q],HI.__mousedown=[tb,b],HI.__mousemove=[KV,b,q],HI.__mouseup=[tb,b];var WI=v(O(HI),2),rg=v(WI,2);qI(rg,19,()=>i(H),p=>p.val,(p,w,QI)=>{var FI=PV();let fI;var oI=O(FI,!0);z(FI),sI((eI,MI)=>{gB(FI,`left:${i(w).x}px; top:${i(w).y}px;`),fI=nI(FI,1,"sdt-tick svelte-1piwi8e",null,fI,eI),pI(FI,"data-value",i(w).val),FI.disabled=MI,vI(oI,i(w).val)},[()=>({"outer-tick":i(d),"is-selected":T(i(x),i(w).val,i(QI))}),()=>(F()||Q())&&i(e)&&M(i(w).val,!1)]),_g(3,FI,()=>oF,()=>({duration:200})),D(p,FI)});var PI=v(rg,2);return qI(PI,17,()=>i(r),Qg,(p,w,QI)=>{var FI=jV();let fI;var oI=O(FI,!0);z(FI),sI((eI,MI)=>{gB(FI,`left:${i(w).x}px; top:${i(w).y}px;`),fI=nI(FI,1,"sdt-tick svelte-1piwi8e",null,fI,eI),pI(FI,"data-value",i(w).val),FI.disabled=MI,vI(oI,i(w).val)},[()=>({"outer-tick":l()&&!i(d),"is-selected":T(i(d)?i(n):i(x),i(w).val,QI)}),()=>(F()||Q())&&i(e)&&M(i(w).val,!1)]),_g(3,FI,()=>oF,()=>({duration:200})),D(p,FI)}),z(HI),dB(HI,p=>c=p,()=>c),z(AI),sI(p=>{hI=nI(HI,1,"sdt-clock svelte-1piwi8e",null,hI,p),gB(WI,i(h))},[()=>({"is-minute-view":i(d)})]),_g(1,AI,()=>oF,()=>({duration:200})),D(C,AI),xI({showMinuteView:G,makeTick:t})}KI(["click","mousedown","mousemove","mouseup"]);var IA=Math.min,FF=Math.max,bU=Math.round,ZU=Math.floor,ZB=C=>({x:C,y:C}),qV={left:"right",right:"left",bottom:"top",top:"bottom"},$V={start:"end",end:"start"};function wc(C,I,g){return FF(C,IA(I,g))}function is(C,I){return typeof C=="function"?C(I):C}function CQ(C){return C.split("-")[0]}function ds(C){return C.split("-")[1]}function fc(C){return C==="x"?"y":"x"}function zc(C){return C==="y"?"height":"width"}function BQ(C){return["top","bottom"].includes(CQ(C))?"y":"x"}function Mc(C){return fc(BQ(C))}function cb(C,I,g){g===void 0&&(g=!1);let B=ds(C),F=Mc(C),Q=zc(F),A=F==="x"?B===(g?"end":"start")?"right":"left":B==="start"?"bottom":"top";return I.reference[Q]>I.floating[Q]&&(A=dU(A)),[A,dU(A)]}function Gb(C){let I=dU(C);return[Gs(C),I,Gs(I)]}function Gs(C){return C.replace(/start|end/g,I=>$V[I])}function Ix(C,I,g){let B=["left","right"],F=["right","left"],Q=["top","bottom"],A=["bottom","top"];switch(C){case"top":case"bottom":return g?I?F:B:I?B:F;case"left":case"right":return I?Q:A;default:return[]}}function ib(C,I,g,B){let F=ds(C),Q=Ix(CQ(C),g==="start",B);return F&&(Q=Q.map(A=>A+"-"+F),I&&(Q=Q.concat(Q.map(Gs)))),Q}function dU(C){return C.replace(/left|right|bottom|top/g,I=>qV[I])}function gx(C){return{top:0,right:0,bottom:0,left:0,...C}}function db(C){return typeof C!="number"?gx(C):{top:C,right:C,bottom:C,left:C}}function FQ(C){let{x:I,y:g,width:B,height:F}=C;return{width:B,height:F,top:g,left:I,right:I+B,bottom:g+F,x:I,y:g}}function bb(C,I,g){let{reference:B,floating:F}=C,Q=BQ(I),A=Mc(I),U=zc(A),l=CQ(I),s=Q==="y",G=B.x+B.width/2-F.width/2,t=B.y+B.height/2-F.height/2,c=B[U]/2-F[U]/2,d;switch(l){case"top":d={x:G,y:B.y-F.height};break;case"bottom":d={x:G,y:B.y+B.height};break;case"right":d={x:B.x+B.width,y:t};break;case"left":d={x:B.x-F.width,y:t};break;default:d={x:B.x,y:B.y}}switch(ds(I)){case"start":d[A]-=c*(g&&s?-1:1);break;case"end":d[A]+=c*(g&&s?-1:1);break}return d}var Zb=async(C,I,g)=>{let{placement:B="bottom",strategy:F="absolute",middleware:Q=[],platform:A}=g,U=Q.filter(Boolean),l=await(A.isRTL==null?void 0:A.isRTL(I)),s=await A.getElementRects({reference:C,floating:I,strategy:F}),{x:G,y:t}=bb(s,B,l),c=B,d={},b=0;for(let Z=0;Zq<=0)){var r,N;let q=(((r=Q.flip)==null?void 0:r.index)||0)+1,AI=R[q];if(AI){var T;let uI=t==="alignment"?a!==BQ(AI):!1,ZI=((T=H[0])==null?void 0:T.overflows[0])>0;if(!uI||ZI)return{data:{index:q,overflows:H},reset:{placement:AI}}}let aI=(N=H.filter(uI=>uI.overflows[0]<=0).sort((uI,ZI)=>uI.overflows[1]-ZI.overflows[1])[0])==null?void 0:N.placement;if(!aI)switch(d){case"bestFit":{var M;let uI=(M=H.filter(ZI=>{if(L){let XI=BQ(ZI.placement);return XI===a||XI==="y"}return!0}).map(ZI=>[ZI.placement,ZI.overflows.filter(XI=>XI>0).reduce((XI,kI)=>XI+kI,0)]).sort((ZI,XI)=>ZI[1]-XI[1])[0])==null?void 0:M[0];uI&&(aI=uI);break}case"initialPlacement":aI=U;break}if(F!==aI)return{reset:{placement:aI}}}return{}}}};var Vb=function(C){return C===void 0&&(C={}),{name:"shift",options:C,async fn(I){let{x:g,y:B,placement:F}=I,{mainAxis:Q=!0,crossAxis:A=!1,limiter:U={fn:e=>{let{x,y:a}=e;return{x,y:a}}},...l}=is(C,I),s={x:g,y:B},G=await Kc(I,l),t=BQ(CQ(F)),c=fc(t),d=s[c],b=s[t];if(Q){let e=c==="y"?"top":"left",x=c==="y"?"bottom":"right",a=d+G[e],n=d-G[x];d=wc(a,d,n)}if(A){let e=t==="y"?"top":"left",x=t==="y"?"bottom":"right",a=b+G[e],n=b-G[x];b=wc(a,b,n)}let Z=U.fn({...I,[c]:d,[t]:b});return{...Z,data:{x:Z.x-g,y:Z.y-B,enabled:{[c]:Q,[t]:A}}}}}};function bs(){return typeof window<"u"}function QQ(C){return ub(C)?(C.nodeName||"").toLowerCase():"#document"}function SC(C){var I;return(C==null||(I=C.ownerDocument)==null?void 0:I.defaultView)||window}function eB(C){var I;return(I=(ub(C)?C.ownerDocument:C.document)||window.document)==null?void 0:I.documentElement}function ub(C){return bs()?C instanceof Node||C instanceof SC(C).Node:!1}function CB(C){return bs()?C instanceof Element||C instanceof SC(C).Element:!1}function VB(C){return bs()?C instanceof HTMLElement||C instanceof SC(C).HTMLElement:!1}function xb(C){return!bs()||typeof ShadowRoot>"u"?!1:C instanceof ShadowRoot||C instanceof SC(C).ShadowRoot}function CA(C){let{overflow:I,overflowX:g,overflowY:B,display:F}=BB(C);return/auto|scroll|overlay|hidden|clip/.test(I+B+g)&&!["inline","contents"].includes(F)}function Lb(C){return["table","td","th"].includes(QQ(C))}function eU(C){return[":popover-open",":modal"].some(I=>{try{return C.matches(I)}catch{return!1}})}function Zs(C){let I=es(),g=CB(C)?BB(C):C;return["transform","translate","scale","rotate","perspective"].some(B=>g[B]?g[B]!=="none":!1)||(g.containerType?g.containerType!=="normal":!1)||!I&&(g.backdropFilter?g.backdropFilter!=="none":!1)||!I&&(g.filter?g.filter!=="none":!1)||["transform","translate","scale","rotate","perspective","filter"].some(B=>(g.willChange||"").includes(B))||["paint","layout","strict","content"].some(B=>(g.contain||"").includes(B))}function Rb(C){let I=QF(C);for(;VB(I)&&!AQ(I);){if(Zs(I))return I;if(eU(I))return null;I=QF(I)}return null}function es(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function AQ(C){return["html","body","#document"].includes(QQ(C))}function BB(C){return SC(C).getComputedStyle(C)}function VU(C){return CB(C)?{scrollLeft:C.scrollLeft,scrollTop:C.scrollTop}:{scrollLeft:C.scrollX,scrollTop:C.scrollY}}function QF(C){if(QQ(C)==="html")return C;let I=C.assignedSlot||C.parentNode||xb(C)&&C.host||eB(C);return xb(I)?I.host:I}function nb(C){let I=QF(C);return AQ(I)?C.ownerDocument?C.ownerDocument.body:C.body:VB(I)&&CA(I)?I:nb(I)}function gA(C,I,g){var B;I===void 0&&(I=[]),g===void 0&&(g=!0);let F=nb(C),Q=F===((B=C.ownerDocument)==null?void 0:B.body),A=SC(F);if(Q){let U=Vs(A);return I.concat(A,A.visualViewport||[],CA(F)?F:[],U&&g?gA(U):[])}return I.concat(F,gA(F,[],g))}function Vs(C){return C.parent&&Object.getPrototypeOf(C.parent)?C.frameElement:null}function hb(C){let I=BB(C),g=parseFloat(I.width)||0,B=parseFloat(I.height)||0,F=VB(C),Q=F?C.offsetWidth:g,A=F?C.offsetHeight:B,U=bU(g)!==Q||bU(B)!==A;return U&&(g=Q,B=A),{width:g,height:B,$:U}}function jc(C){return CB(C)?C:C.contextElement}function BA(C){let I=jc(C);if(!VB(I))return ZB(1);let g=I.getBoundingClientRect(),{width:B,height:F,$:Q}=hb(I),A=(Q?bU(g.width):g.width)/B,U=(Q?bU(g.height):g.height)/F;return(!A||!Number.isFinite(A))&&(A=1),(!U||!Number.isFinite(U))&&(U=1),{x:A,y:U}}var Cx=ZB(0);function Xb(C){let I=SC(C);return!es()||!I.visualViewport?Cx:{x:I.visualViewport.offsetLeft,y:I.visualViewport.offsetTop}}function Bx(C,I,g){return I===void 0&&(I=!1),!g||I&&g!==SC(C)?!1:I}function UQ(C,I,g,B){I===void 0&&(I=!1),g===void 0&&(g=!1);let F=C.getBoundingClientRect(),Q=jc(C),A=ZB(1);I&&(B?CB(B)&&(A=BA(B)):A=BA(C));let U=Bx(Q,g,B)?Xb(Q):ZB(0),l=(F.left+U.x)/A.x,s=(F.top+U.y)/A.y,G=F.width/A.x,t=F.height/A.y;if(Q){let c=SC(Q),d=B&&CB(B)?SC(B):B,b=c,Z=Vs(b);for(;Z&&B&&d!==b;){let e=BA(Z),x=Z.getBoundingClientRect(),a=BB(Z),n=x.left+(Z.clientLeft+parseFloat(a.paddingLeft))*e.x,h=x.top+(Z.clientTop+parseFloat(a.paddingTop))*e.y;l*=e.x,s*=e.y,G*=e.x,t*=e.y,l+=n,s+=h,b=SC(Z),Z=Vs(b)}}return FQ({width:G,height:t,x:l,y:s})}function Oc(C,I){let g=VU(C).scrollLeft;return I?I.left+g:UQ(eB(C)).left+g}function ob(C,I,g){g===void 0&&(g=!1);let B=C.getBoundingClientRect(),F=B.left+I.scrollLeft-(g?0:Oc(C,B)),Q=B.top+I.scrollTop;return{x:F,y:Q}}function Fx(C){let{elements:I,rect:g,offsetParent:B,strategy:F}=C,Q=F==="fixed",A=eB(B),U=I?eU(I.floating):!1;if(B===A||U&&Q)return g;let l={scrollLeft:0,scrollTop:0},s=ZB(1),G=ZB(0),t=VB(B);if((t||!t&&!Q)&&((QQ(B)!=="body"||CA(A))&&(l=VU(B)),VB(B))){let d=UQ(B);s=BA(B),G.x=d.x+B.clientLeft,G.y=d.y+B.clientTop}let c=A&&!t&&!Q?ob(A,l,!0):ZB(0);return{width:g.width*s.x,height:g.height*s.y,x:g.x*s.x-l.scrollLeft*s.x+G.x+c.x,y:g.y*s.y-l.scrollTop*s.y+G.y+c.y}}function Qx(C){return Array.from(C.getClientRects())}function Ax(C){let I=eB(C),g=VU(C),B=C.ownerDocument.body,F=FF(I.scrollWidth,I.clientWidth,B.scrollWidth,B.clientWidth),Q=FF(I.scrollHeight,I.clientHeight,B.scrollHeight,B.clientHeight),A=-g.scrollLeft+Oc(C),U=-g.scrollTop;return BB(B).direction==="rtl"&&(A+=FF(I.clientWidth,B.clientWidth)-F),{width:F,height:Q,x:A,y:U}}function Ux(C,I){let g=SC(C),B=eB(C),F=g.visualViewport,Q=B.clientWidth,A=B.clientHeight,U=0,l=0;if(F){Q=F.width,A=F.height;let s=es();(!s||s&&I==="fixed")&&(U=F.offsetLeft,l=F.offsetTop)}return{width:Q,height:A,x:U,y:l}}function lx(C,I){let g=UQ(C,!0,I==="fixed"),B=g.top+C.clientTop,F=g.left+C.clientLeft,Q=VB(C)?BA(C):ZB(1),A=C.clientWidth*Q.x,U=C.clientHeight*Q.y,l=F*Q.x,s=B*Q.y;return{width:A,height:U,x:l,y:s}}function ab(C,I,g){let B;if(I==="viewport")B=Ux(C,g);else if(I==="document")B=Ax(eB(C));else if(CB(I))B=lx(I,g);else{let F=Xb(C);B={x:I.x-F.x,y:I.y-F.y,width:I.width,height:I.height}}return FQ(B)}function yb(C,I){let g=QF(C);return g===I||!CB(g)||AQ(g)?!1:BB(g).position==="fixed"||yb(g,I)}function sx(C,I){let g=I.get(C);if(g)return g;let B=gA(C,[],!1).filter(U=>CB(U)&&QQ(U)!=="body"),F=null,Q=BB(C).position==="fixed",A=Q?QF(C):C;for(;CB(A)&&!AQ(A);){let U=BB(A),l=Zs(A);!l&&U.position==="fixed"&&(F=null),(Q?!l&&!F:!l&&U.position==="static"&&!!F&&["absolute","fixed"].includes(F.position)||CA(A)&&!l&&yb(C,A))?B=B.filter(G=>G!==A):F=U,A=QF(A)}return I.set(C,B),B}function tx(C){let{element:I,boundary:g,rootBoundary:B,strategy:F}=C,A=[...g==="clippingAncestors"?eU(I)?[]:sx(I,this._c):[].concat(g),B],U=A[0],l=A.reduce((s,G)=>{let t=ab(I,G,F);return s.top=FF(t.top,s.top),s.right=IA(t.right,s.right),s.bottom=IA(t.bottom,s.bottom),s.left=FF(t.left,s.left),s},ab(I,U,F));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function cx(C){let{width:I,height:g}=hb(C);return{width:I,height:g}}function Gx(C,I,g){let B=VB(I),F=eB(I),Q=g==="fixed",A=UQ(C,!0,Q,I),U={scrollLeft:0,scrollTop:0},l=ZB(0);function s(){l.x=Oc(F)}if(B||!B&&!Q)if((QQ(I)!=="body"||CA(F))&&(U=VU(I)),B){let d=UQ(I,!0,Q,I);l.x=d.x+I.clientLeft,l.y=d.y+I.clientTop}else F&&s();Q&&!B&&F&&s();let G=F&&!B&&!Q?ob(F,U):ZB(0),t=A.left+U.scrollLeft-l.x-G.x,c=A.top+U.scrollTop-l.y-G.y;return{x:t,y:c,width:A.width,height:A.height}}function Pc(C){return BB(C).position==="static"}function mb(C,I){if(!VB(C)||BB(C).position==="fixed")return null;if(I)return I(C);let g=C.offsetParent;return eB(C)===g&&(g=g.ownerDocument.body),g}function Sb(C,I){let g=SC(C);if(eU(C))return g;if(!VB(C)){let F=QF(C);for(;F&&!AQ(F);){if(CB(F)&&!Pc(F))return F;F=QF(F)}return g}let B=mb(C,I);for(;B&&Lb(B)&&Pc(B);)B=mb(B,I);return B&&AQ(B)&&Pc(B)&&!Zs(B)?g:B||Rb(C)||g}var ix=async function(C){let I=this.getOffsetParent||Sb,g=this.getDimensions,B=await g(C.floating);return{reference:Gx(C.reference,await I(C.floating),C.strategy),floating:{x:0,y:0,width:B.width,height:B.height}}};function dx(C){return BB(C).direction==="rtl"}var bx={convertOffsetParentRelativeRectToViewportRelativeRect:Fx,getDocumentElement:eB,getClippingRect:tx,getOffsetParent:Sb,getElementRects:ix,getClientRects:Qx,getDimensions:cx,getScale:BA,isElement:CB,isRTL:dx};function Wb(C,I){return C.x===I.x&&C.y===I.y&&C.width===I.width&&C.height===I.height}function Zx(C,I){let g=null,B,F=eB(C);function Q(){var U;clearTimeout(B),(U=g)==null||U.disconnect(),g=null}function A(U,l){U===void 0&&(U=!1),l===void 0&&(l=1),Q();let s=C.getBoundingClientRect(),{left:G,top:t,width:c,height:d}=s;if(U||I(),!c||!d)return;let b=ZU(t),Z=ZU(F.clientWidth-(G+c)),e=ZU(F.clientHeight-(t+d)),x=ZU(G),n={rootMargin:-b+"px "+-Z+"px "+-e+"px "+-x+"px",threshold:FF(0,IA(1,l))||1},h=!0;function m(L){let R=L[0].intersectionRatio;if(R!==l){if(!h)return A();R?A(!1,R):B=setTimeout(()=>{A(!1,1e-7)},1e3)}R===1&&!Wb(s,C.getBoundingClientRect())&&A(),h=!1}try{g=new IntersectionObserver(m,{...n,root:F.ownerDocument})}catch{g=new IntersectionObserver(m,n)}g.observe(C)}return A(!0),Q}function Eb(C,I,g,B){B===void 0&&(B={});let{ancestorScroll:F=!0,ancestorResize:Q=!0,elementResize:A=typeof ResizeObserver=="function",layoutShift:U=typeof IntersectionObserver=="function",animationFrame:l=!1}=B,s=jc(C),G=F||Q?[...s?gA(s):[],...gA(I)]:[];G.forEach(x=>{F&&x.addEventListener("scroll",g,{passive:!0}),Q&&x.addEventListener("resize",g)});let t=s&&U?Zx(s,g):null,c=-1,d=null;A&&(d=new ResizeObserver(x=>{let[a]=x;a&&a.target===s&&d&&(d.unobserve(I),cancelAnimationFrame(c),c=requestAnimationFrame(()=>{var n;(n=d)==null||n.observe(I)})),g()}),s&&!l&&d.observe(s),d.observe(I));let b,Z=l?UQ(C):null;l&&e();function e(){let x=UQ(C);Z&&!Wb(Z,x)&&g(),Z=x,b=requestAnimationFrame(e)}return g(),()=>{var x;G.forEach(a=>{F&&a.removeEventListener("scroll",g),Q&&a.removeEventListener("resize",g)}),t?.(),(x=d)==null||x.disconnect(),d=null,l&&cancelAnimationFrame(b)}}var Nb=Vb,rb=eb;var pb=(C,I,g)=>{let B=new Map,F={platform:bx,...g},Q={...F.platform,_c:B};return Zb(C,I,{...F,platform:Q})};function Hb(C){let I=C.parentElement?.querySelector("input[type=text]");if(!I)return;let g=Eb(I,C,()=>pb(I,C,{placement:"bottom-start",middleware:[Nb({padding:5}),rb()]}).then(({x:B,y:F})=>{Object.assign(C.style,{left:`${B}px`,top:`${F}px`})}));return{destroy(){g()}}}function Yb(C,I,g,B){let F=C?Array.isArray(C)?C:C.split(","):[];return F=F.map(Q=>Q.replace(/(:\d+):\d+(.*)/,"$1$2")),{iValues:F,iValueCombined:F.length?F.join():null,iDates:F.map(Q=>gQ(Q,I,g,B))}}function Jb(C,I){return C==="auto"?I.match(/g|hh?|ii?/i)&&I.match(/y|m|d/i)?"datetime":I.match(/g|hh?|ii?/i)?"time":"date":C}var qg=Bb,ex=f(' '),Vx=f(''),xx=f(''),ux=f(" "),Lx=f('
'),Rx=f(''),nx=f(' ',1),ax=C=>C.preventDefault(),mx=f('
'),hx=f('
'),Xx=f('
'),ox={hash:"svelte-yheoi9",code:`.sdt-component-wrap.svelte-yheoi9 {position:relative;display:inline-block;}.sdt-input-wrap.svelte-yheoi9 {position:relative;display:contents;}.sdt-calendar-wrap.svelte-yheoi9 {width:280px;background-color:var(--sdt-bg-main, #fff);box-shadow:var(--sdt-wrap-shadow, 0 1px 6px var(--sdt-shadow-color, #ccc));border-radius:var(--sdt-radius, 4px);padding:0.5em;color:var(--sdt-color, initial);}.sdt-calendar-wrap.is-range-wrap.svelte-yheoi9 {width:560px;}.sdt-widget-wrap.svelte-yheoi9 {display:flex;gap:0.5rem;justify-content:stretch;position:relative;}.sdt-widget.svelte-yheoi9 {flex:1;min-width:264px;}.value-dirty.svelte-yheoi9 {color:color-mix(in srgb, black 20%, white);}.sdt-calendar-wrap.is-popup.svelte-yheoi9 {position:absolute;box-shadow:0 1px 6px var(--sdt-shadow-color, #ccc);z-index:100;}.sdt-btn-row.svelte-yheoi9 {margin-top:0.5rem;display:flex;gap:0.5rem;justify-content:space-between;flex-flow:row-reverse;}.sdt-action-btn.svelte-yheoi9 {padding:0.25em 0.5em;font-size:0.875em;border-radius:0.2em;}.sdt-today-btn.svelte-yheoi9 {background-color:var(--sdt-bg-selected, #286090);color:var(--sdt-today-color, var(--sdt-bg-main, #fff));padding:0.25em 0.5em;font-size:0.875em;border-radius:0.2em;border:1px solid var(--sdt-today-bg, #286090);}.sdt-today-btn[disabled].svelte-yheoi9 {opacity:0.5;cursor:not-allowed;}.sdt-today-btn.svelte-yheoi9:focus, .sdt-today-btn.svelte-yheoi9:active, .sdt-today-btn.svelte-yheoi9:hover:not([disabled]) {background-color:var(--sdt-today-bg, #286090);}.sdt-clear-btn.svelte-yheoi9 {border:1px solid var(--sdt-clear-color, #dc3545);background-color:var(--sdt-clear-bg, transparent);color:var(--sdt-clear-color, #dc3545);}.sdt-clear-btn.svelte-yheoi9:focus, .sdt-clear-btn.svelte-yheoi9:active:not([disabled]), .sdt-clear-btn.svelte-yheoi9:hover:not([disabled]) {background-color:var(--sdt-clear-hover-bg, #dc3545);color:var(--sdt-clear-hover-color, var(--sdt-bg-main, #fff));}.sdt-widget.svelte-yheoi9 + .sdt-widget:where(.svelte-yheoi9):before {content:'';position:absolute;top:0;bottom:0;left:50%;width:1px;background-color:#eee;} @media screen and (max-width: 560px) {.sdt-calendar-wrap.is-range-wrap.svelte-yheoi9 {width:280px;}.sdt-widget-wrap.svelte-yheoi9 {flex-wrap:wrap;}.sdt-widget.svelte-yheoi9 + .sdt-widget:where(.svelte-yheoi9):before {content:none;} - }`};function zc(C,I){oI(I,!0),fB(C,Cu);let g=(gI,VI)=>{let mg=()=>VI?.().autocloseSupported,jg=()=>VI?.().todayBtnClasses,xC=()=>VI?.().clearBtnClasses,EC=()=>VI?.().onCancel,Lg=()=>VI?.().onConfirm,zC=()=>VI?.().onClear,Og=()=>VI?.().onToday,_B=()=>VI?.().isTodayDisabled,rC=()=>VI?.().i18n,UQ=()=>VI?.().currentMode;var LC=IC(),oB=JI(LC);{var mF=yB=>{var SB=jV(),qB=O(SB);{var sQ=x=>{var X=zV(),W=O(X);W.__click=function(...P){EC()?.apply(this,P)};var S=O(W,!0);z(W);var v=k(W,2);v.__click=function(...P){Lg()?.apply(this,P)};var M=O(v,!0);z(v),z(X),lI(()=>{WI(W,1,gC(xC()),"svelte-yheoi9"),PI(S,rC().cancelBtn),WI(v,1,gC(jg()),"svelte-yheoi9"),PI(M,rC().okBtn)}),w(x,X)};bI(qB,x=>{mg()||x(sQ)})}var Z=k(qB,2);{var o=x=>{var X=PV(),W=O(X);{var S=P=>{var K=MV();K.__click=function(...cI){Og()?.apply(this,cI)};var II=O(K,!0);z(K),lI(()=>{WI(K,1,gC(jg()),"svelte-yheoi9"),K.disabled=_B(),PI(II,rC().todayBtn)}),w(P,K)};bI(W,P=>{N()&&UQ()==="date"&&P(S)})}var v=k(W,2);{var M=P=>{var K=KV();K.__click=function(...cI){zC()?.apply(this,cI)};var II=O(K,!0);z(K),lI(()=>{WI(K,1,gC(xC()),"svelte-yheoi9"),PI(II,rC().clearBtn)}),w(P,K)};bI(v,P=>{r()&&P(M)})}z(X),w(x,X)};bI(Z,x=>{(N()||r())&&x(o)})}z(SB),w(yB,SB)};bI(oB,yB=>{mg(),yB(mF)})}w(gI,LC)},B=H(I,"inputId",3,""),F=H(I,"name",3,"date"),A=H(I,"disabled",3,!1),Q=H(I,"placeholder",3,null),U=H(I,"required",3,!1),s=H(I,"value",15,null),l=H(I,"isRange",3,!1),d=H(I,"startDate",3,null),c=H(I,"endDate",3,null),i=H(I,"pickerOnly",3,!1),G=H(I,"startView",7,2),b=H(I,"mode",3,"auto"),e=H(I,"disableDatesFn",3,null),V=H(I,"manualInput",3,!1),u=H(I,"theme",19,()=>BC.theme),n=H(I,"format",19,()=>BC.format),R=H(I,"formatType",19,()=>BC.formatType),h=H(I,"displayFormat",19,()=>BC.displayFormat),m=H(I,"displayFormatType",19,()=>BC.displayFormatType),a=H(I,"minuteIncrement",19,()=>BC.minuteIncrement),L=H(I,"weekStart",19,()=>BC.weekStart),y=H(I,"inputClasses",19,()=>BC.inputClasses),E=H(I,"todayBtnClasses",19,()=>BC.todayBtnClasses),Y=H(I,"clearBtnClasses",19,()=>BC.clearBtnClasses),N=H(I,"todayBtn",19,()=>BC.todayBtn),r=H(I,"clearBtn",19,()=>BC.clearBtn),j=H(I,"clearToggle",19,()=>BC.clearToggle),_=H(I,"autocommit",19,()=>BC.autocommit),D=H(I,"hourOnly",19,()=>BC.hourOnly),UI=H(I,"i18n",19,()=>BC.i18n),rI=H(I,"validatorAction",3,null),RI=H(I,"ce_valueElement",7,null),eI=H(I,"ce_displayElement",7,null),xI=H(I,"positionResolver",3,Lb),LI=H(I,"actionRow",3,g);l()&&Array.isArray(s());let{iDates:$,iValues:AI,iValueCombined:kI}=ab(s(),n(),UI(),R()),pI=kI,hI=iI(wI(AI)),YI=iI(wI($.map(gI=>new dg(gI)))),yg=iI(wI(AI)),fC=sI(()=>t(hI).length?t(hI).join(","):null),J=iI(wI(Vg())),FI=n(),mI=h(),ZI=iI(null),OI=sI(()=>d()?gA(d(),n(),UI(),R()):null),dI=sI(()=>c()?new Date(gA(c(),n(),UI(),R()).setSeconds(1)):null),uI=sI(()=>t(OI)&&t(OI)>new Date||t(dI)&&t(dI)F().endsWith("]")?F().substring(0,F().length-1)+"_input]":F()+"_input"),_I=nb(b(),n()),fI=iI(wI(_I)),DI=iI(wI(_I==="time"?"time":"date")),aI=wI(l()?[{ref:null},{ref:null}]:[{ref:null}]),T=iI("date"),QI=sI(()=>_()&&(l()&&t(fI)==="date"||!l())),CI=iI(wI(i())),nI=iI(wI(i())),MI=i()?()=>({}):uF,Rg=sI(()=>!!i()),Hg=rI()?rI().shift():()=>{},lg=rI()||[],Sg=sI(()=>i()?()=>{}:xI()),Yg=sI(()=>_()?!1:t(hI).join()!==t(yg).join()),bg;function Vg(){return t(YI).sort((gI,VI)=>gI.getTime()-VI.getTime()).map(gI=>_A(gI,h()||n(),UI(),m()||R())).join(" - ")}function Jg(){return l()?t(hI).length===2?t(hI):null:t(hI)[0]||null}function Xg({type:gI,date:VI,isKeyboard:mg,dateIndex:jg=0}){if(VI&&!l()&&t(YI).length&&t(YI)[0].getFullYear()===VI.getFullYear()&&t(YI)[0].getMonth()===VI.getMonth()&&t(YI)[0].getDate()===VI.getDate()&&t(fI)==="date"&&!U()&&j()&&(VI=null),l()){if(gI==="date")p(YI,VI?(t(YI).length===2?[new dg(VI)]:t(YI).concat(new dg(VI))).map(xC=>xC.getTime()).sort().map(xC=>new dg(xC)):[],!0);else if(VI&&jg!==void 0)t(YI)[jg]=new dg(VI);else if(gI==="datetime")t(YI)[0]=new dg(VI),t(YI)[1]=new dg(VI);else throw new Error(`Unhandled event type: '${gI}'`);p(hI,t(YI).map(xC=>_A(xC,n(),UI(),R())),!0)}else p(YI,VI?[new dg(VI)]:[],!0),p(hI,VI?[_A(VI,n(),UI(),R())]:[],!0);p(T,gI,!0),eg(gI)&&Tg(),wg(gI,mg,jg)}function eg(gI){return!_()||l()&&t(fI).includes("time")||l()&&(t(fI)==="datetime"||t(hI).length!==2)?!1:gI==="minute"||gI===t(fI)||gI==="hour"&&D()||i()}function Tg(){pI=t(hI).join(),p(yg,[...t(hI)],!0),p(J,Vg(),!0),s(Jg()),Vl(!0),I.onChange?.(l()?t(hI):t(hI)[0]||null),I.onDateChange?.({value:l()?t(hI):t(hI)[0]||null,dateValue:l()?t(YI):t(YI)[0]||null,displayValue:t(J),valueFormat:n(),displayFormat:h(),event:t(T)})}function ug(){G(2),t(fI)==="datetime"?setTimeout(()=>{i()||p(nI,!1),p(DI,"date")},_()?300:0):i()||p(nI,!1)}function wg(gI,VI,mg){if(VI&&RF!=="Enter")return;if(gI==="hour"&&!D()){aI[mg].ref.showMinuteView();return}let jg=eg(gI);if(t(fI)==="datetime"&&!(gI==="minute"&&!l()&&t(fI)==="datetime"&&jg)){gI==="date"&&(l()&&t(hI).length===2||!l())&&p(DI,"time");return}jg&&!VI&&ug()}function Pg(){let gI=new Date;Xg({type:l()?"datetime":"date",dateIndex:0,date:new Date(gI.getFullYear(),gI.getMonth(),gI.getDate(),0,0,0),isKeyboard:!1}),l()&&Xg({type:l()?"datetime":"date",dateIndex:1,date:new Date(gI.getFullYear(),gI.getMonth(),gI.getDate(),23,59,59,999),isKeyboard:!1}),eg("date")===!1&&Tg(),t(fI)==="date"&&ug()}function xg(){p(YI,[],!0),p(hI,[],!0),pI=null,Tg()}function nF(){let gI=Array.isArray(s())?s().join():s()||null;(pI!==gI||_()===!1||l())&&Tg(),ug()}function BB(){p(hI,[...t(yg)],!0),ug(),I.onCancel?.()}let RF=null;function sA(gI){if(t(nI)||(["Backspace","Delete"].includes(gI.key)&&!U()&&xg(),gI.key==="Enter"&&lA()),!t(nI)&&gI.key!=="Tab"){p(nI,gI.key!=="Shift"),gI.preventDefault();return}switch(RF=gI.key,gI.key){case"PageDown":case"PageUp":case"ArrowDown":case"ArrowUp":case"ArrowLeft":case"ArrowRight":if(gI.preventDefault(),l())return;t(DI)==="date"?bg.handleGridNav(gI.key,gI.shiftKey):aI[0].ref.makeTick(["ArrowDown","ArrowLeft","PageDown"].includes(gI.key)?-1:1);break;case"Escape":_()?xg():BB();break;case"Backspace":if(V()&&!l())return;case"Delete":!U()&&xg();break;case"Enter":if(t(CI)&&gI.preventDefault(),t(hI).length===0){p(nI,!1);return}if(t(DI)==="time"&&t(T)==="hour")return aI[0].ref.showMinuteView();if(t(fI)==="datetime"&&t(DI)!=="time"){p(DI,"time");return}nF();break;case"Tab":t(nI)&&(p(nI,!1),gI.preventDefault());case"F5":break;default:!V()&&gI.preventDefault()}}function AQ(gI){gI.preventDefault(),gI.stopPropagation();let VI=gA(gI.target.value,h()||n(),UI(),m()||R());_A(VI,h()||n(),UI(),m()||R())===gI.target.value&&(Xg({type:"date",date:VI,isKeyboard:!0}),bg.focusDate(VI))}function aU(gI){G(2),p(DI,gI,!0)}let QQ=iI(wI(V()?"text":"none"));function nU(){V()&&t(CI)&&p(QQ,t(QQ)==="text"?"none":"text",!0),!t(nI)&&lA()}function lA(){p(CI,!0),p(nI,!0)}function RU(){p(CI,!1),t(QI)?nF():BB(),!eI()&&I.onBlur?.()}function Vl(gI){RI()&&eI()&&(RI().value=t(hI).join(",")||"",eI().value=t(J),RI().dispatchEvent(new Event("input")),eI().dispatchEvent(new Event("input"))),gI&&I.onInput?.(t(fC))}function ul(gI){p(ZI,gI,!0)}MB(()=>{eI()&&(eI().onfocus=lA,eI().onblur=RU,eI().onclick=nU,eI().onkeydown=sA)});function xl(gI){let VI=Array.isArray(gI)?gI.join():gI||null;pI!==VI&&(p(hI,gI?Array.isArray(gI)?gI:[gI]:[],!0),p(YI,t(hI).map(mg=>new dg(gA(mg,n(),UI(),R()))),!0),p(yg,t(hI),!0),pI=VI)}function mU(gI,VI){mI!==VI&&(mI=VI,p(J,Vg(),!0)),FI!==gI&&t(YI).length&&(FI=gI,p(hI,t(YI).map(mg=>_A(mg,gI,UI(),R())),!0),pI=t(hI).join(),mI===null&&mI===VI&&p(J,Vg(),!0),b()==="auto"&&(p(fI,gI.match(/g|hh?|ii?/i)&&gI.match(/y|m|d/i)?"datetime":gI.match(/g|hh?|ii?/i)?"time":"date",!0),t(fI)==="time"&&t(DI)!=="time"&&p(DI,"time")),Tg())}pg(()=>xl(s())),pg(()=>mU(n(),h()));var tA=gu();let hU;var cA=O(tA);cA.__click=nU;var oU=O(cA);{var Ll=gI=>{var VI=_V(),mg=JI(VI);zB(mg);var jg=k(mg,2);{var xC=EC=>{var Lg=OV();zB(Lg);let zC;Lg.__input=function(...Og){(V()?AQ:()=>{})?.apply(this,Og)},Lg.__keydown=sA,Ms(Lg,(Og,_B)=>Hg?.(Og,_B),()=>lg),lI(Og=>{zI(Lg,"id",B()),zI(Lg,"name",t(EI)),zC=WI(Lg,1,gC(y()),"svelte-yheoi9",zC,Og),eF(Lg,t(J)),zI(Lg,"placeholder",Q()),Lg.disabled=A(),Lg.required=U(),zI(Lg,"inputmode",t(QQ)),Lg.readOnly=t(CI)&&!V()&&!l()},[()=>({"value-dirty":t(Yg)})]),VC("focus",Lg,lA),VC("blur",Lg,RU),w(EC,Lg)};bI(jg,EC=>{i()||EC(xC)})}lI(()=>{zI(mg,"name",F()),eF(mg,s())}),w(gI,VI)};bI(oU,gI=>{eI()||gI(Ll)})}var al=k(oU,2);SC(al,()=>I.children??Eg),z(cA);var nl=k(cA,2);{var Rl=gI=>{var VI=Iu();let mg;VI.__mousedown=[qV];var jg=O(VI);Ig(jg,21,()=>aI,sg,(EC,Lg,zC)=>{var Og=$V(),_B=O(Og);{var rC=LC=>{let oB=sI(()=>t(fI)?.includes("time")),mF=sI(()=>G()>2?2:G());cB(pc(LC,{wid:zC,get dates(){return t(YI)},get isRange(){return l()},get startDate(){return t(OI)},get endDate(){return t(dI)},get enableTimeToggle(){return t(oB)},get initialView(){return t(mF)},get hoverDate(){return t(ZI)},get additionalDisableFn(){return e()},get i18n(){return UI()},get weekStart(){return L()},onupdate:Xg,onswitch:aU,onhoverupdate:ul}),yB=>bg=yB,()=>bg)},UQ=LC=>{let oB=sI(()=>t(YI)[zC]||null),mF=sI(()=>l()&&zC===1?t(YI)[0]:t(OI)),yB=sI(()=>t(fI)!=="time"),SB=sI(()=>n().match(R()==="php"?"a|A":"p|P")!==null);cB(Hc(LC,{wid:zC,get date(){return t(oB)},get startDate(){return t(mF)},get endDate(){return t(dI)},get hasDateComponent(){return t(yB)},get showMeridian(){return t(SB)},get i18n(){return UI()},get minuteIncrement(){return a()},get hourOnly(){return D()},onupdate:Xg,onswitch:aU}),(qB,sQ)=>sQ.ref=qB,qB=>qB?.ref,()=>[t(Lg)])};bI(_B,LC=>{t(DI)==="date"?LC(rC):LC(UQ,!1)})}z(Og),w(EC,Og)}),z(jg);var xC=k(jg,2);SC(xC,LI,()=>({autocloseSupported:t(QI),todayBtnClasses:E(),clearBtnClasses:Y(),onCancel:BB,onConfirm:nF,onClear:xg,onToday:Pg,isTodayDisabled:t(uI),i18n:UI(),currentMode:t(DI)})),z(VI),Ms(VI,EC=>t(Sg)?.(EC)),lI(EC=>mg=WI(VI,1,`sdt-calendar-wrap ${u()??""}`,"svelte-yheoi9",mg,EC),[()=>({"is-popup":!t(Rg),"is-range-wrap":l()})]),CC(3,VI,()=>MI,()=>({duration:200})),w(gI,VI)};bI(nl,gI=>{t(nI)&&t(CI)&&gI(Rl)})}z(tA),lI(gI=>hU=WI(tA,1,"sdt-component-wrap svelte-yheoi9",null,hU,gI),[()=>({"picker-active":t(nI)})]),w(C,tA),yI()}qI(["click","input","keydown","mousedown"]);var Rb=zc;var Bu=f('
');function Mc(C,I){oI(I,!0);var g=Bu(),B=O(g);Rb(B,{pickerOnly:!0,isRange:!0,autocommit:!1,mode:"datetime",get value(){return I.value},format:"yyyy-mm-dd hh:ii:00",onBlur:()=>I.onClose(null),onChange:F=>I.onClose(F)}),z(g),w(C,g),yI()}var dl=class extends mb.Modal{constructor(g,B,F){super(g.app);this.plugin=g;this.value=B;this.callback=F;this.contentEl.parentElement.addClass("cmtr-daterange-picker-modal")}view;async onOpen(){this.view=nB(Mc,{target:this.contentEl,props:{value:this.value?.map(g=>new Date(g*1e3).toISOString().split("T")[0]),onClose:async g=>{this.callback(g),super.close()}}})}onClose(){this.view&&wB(this.view)}};async function Fu(C,I,g,B,F,A){if(C.key==="z"&&C.ctrlKey&&!C.shiftKey&&!C.altKey&&!C.metaKey)if(I.length){let Q=I.pop();p(g,Q.selected_ranges,!0);for(let[U,s]of Object.entries(Q.file_history)){let l=B.plugin.app.vault.getAbstractFileByPath(U);l&&await B.plugin.app.vault.modify(l,s)}}else new WC.Notice("There is nothing to undo",4e3);else C.key==="a"&&C.ctrlKey&&!C.shiftKey&&!C.altKey&&!C.metaKey?(p(g,Array.from(t(F).keys()),!0),p(A,0)):C.key==="Escape"&&(p(g,[],!0),p(A,null))}async function Au(C,I,g){p(I,[],!0),p(g,null)}var Qu=(C,I,g)=>new dl(I.plugin,g(),B=>{g(B?.map(F=>F?window.moment(F,"YYYY-MM-DD HH:mm:ss").unix():0))}).open(),Uu=(C,I)=>{C.preventDefault();let g=new WC.Menu;g.addItem(B=>{B.setTitle("Clear date filter").setIcon("calendar-x").onClick(()=>{I(void 0)})}),g.addItem(B=>{B.setTitle("Filter to today").setIcon("calendar-days").onClick(()=>{let F=window.moment().startOf("day").unix();I([F,F+86400])})}),g.addItem(B=>{B.setTitle("Filter to this week").setIcon("calendar-range").onClick(()=>{let F=window.moment().startOf("day").unix();I([F-window.moment().day()*86400,F+(7-window.moment().day())*86400])})}),g.addItem(B=>{B.setTitle("Filter to this month").setIcon("calendar-clock").onClick(()=>{let F=window.moment().startOf("day").unix();I([F-window.moment().date()*86400,F+(window.moment().daysInMonth()-window.moment().date())*86400])})}),g.showAtMouseEvent(C)},su=f(''),lu=f(" ",1),tu=f(" "),cu=f('
',1),iu=async(C,I,g,B,F,A)=>{if(C.stopPropagation(),C.shiftKey)if(t(I)){let Q=Math.min(t(I),g()),U=Math.max(t(I),g());p(B,Array.from({length:U-Q+1},(s,l)=>l+Q),!0)}else p(B,[g()],!0),p(I,g(),!0);else if(C.ctrlKey||C.metaKey){p(I,g(),!0);let Q=t(B).length;p(B,t(B).filter(U=>U!==g()),!0),t(B).length===Q&&p(B,[...t(B),g()],!0)}else{p(B,[],!0);let Q=F.plugin.app.workspace.getLeavesOfType("markdown");if(!Q.length)return;let U=Q.reduce((d,c)=>d.activeTime>c.activeTime?d:c),s=F.plugin.app.vault.getAbstractFileByPath(A().path);if(!s)return;await F.plugin.app.workspace.revealLeaf(U);let l=U.view;s!==l.file&&await U.openFile(s),l.editor.setSelection(l.editor.offsetToPos(A().range.from),l.editor.offsetToPos(A().range.to))}},Gu=(C,I,g,B)=>{let F=new WC.Menu;F.addItem(A=>{A.setTitle("Accept"+(t(I).length?" selected changes":" changes")).setIcon("check").onClick(async()=>g(!0,B()))}),F.addItem(A=>{A.setTitle("Reject"+(t(I).length?" selected changes":" changes")).setIcon("cross").onClick(async()=>g(!1,B()))}),F.showAtMouseEvent(C)},du=f('
'),bu=f(' '),eu=f(' '),Zu=f('This range is empty'),Vu=f(" ",1),uu=f('
'),xu=f(' '),Lu=f(' '),au=f('
'),nu=f('
'),Ru=f('
');function xU(C,I){oI(I,!0);var g;(function(D){D[D.ALL=0]="ALL",D[D.ADDITION=1]="ADDITION",D[D.DELETION=2]="DELETION",D[D.SUBSTITUTION=3]="SUBSTITUTION",D[D.HIGHLIGHT=4]="HIGHLIGHT",D[D.COMMENT=5]="COMMENT"})(g||(g={}));var B;(function(D){D[D.VAULT=0]="VAULT",D[D.FOLDER=1]="FOLDER",D[D.FILE=2]="FILE"})(B||(B={}));var F;(function(D){D[D.ALL=0]="ALL",D[D.CONTENT=1]="CONTENT",D[D.EMPTY=2]="EMPTY"})(F||(F={}));var A;(function(D){D[D.ALL=0]="ALL",D[D.SELF=1]="SELF",D[D.OTHERS=2]="OTHERS"})(A||(A={}));let Q=H(I,"range_type_filter",23,()=>g.ALL),U=H(I,"location_filter",23,()=>B.VAULT),s=H(I,"content_filter",23,()=>F.ALL),l=H(I,"author_filter",23,()=>A.ALL),d=H(I,"date_filter",7,void 0),c=iI(""),i=iI(null),G=I.plugin.app.workspace.on("active-leaf-change",()=>{p(i,I.plugin.app.workspace.getActiveFile(),!0)}),b=iI(wI([])),e=iI(wI([])),V=iI(null),u=iI(null),n=[{icon:"asterisk",tooltip:"All markup"},{icon:"plus-circle",tooltip:"Addition markup"},{icon:"minus-square",tooltip:"Deletion markup"},{icon:"replace",tooltip:"Substitution markup"},{icon:"highlighter",tooltip:"Highlight markup"},{icon:"message-square",tooltip:"Comment markup"}],R=["suggestions","insertions","deletions","replacements","highlights","comments"],h=[{icon:"vault",tooltip:"Entire vault"},{icon:"folder-closed",tooltip:"Current folder"},{icon:"file",tooltip:"Current file"}],m=[{icon:"maximize",tooltip:"All suggestions"},{icon:"square",tooltip:"Only suggestions with content"},{icon:"box-select",tooltip:"Only empty suggestions"}],a=[{icon:"users",tooltip:"All authors"},{icon:"user",tooltip:"Only my suggestions"},{icon:"user-x",tooltip:"Only others' suggestions"}],L=[];MB(()=>{I.plugin.database.on("database-update",D=>{p(b,D,!0)}),p(b,I.plugin.database.allEntries(),!0)}),Sd(()=>{I.plugin.app.workspace.offref(G)});let y=sI(()=>j(t(b),U(),Q(),s(),l(),d())),E=sI(()=>`${t(y).length} ${R[Q()]} in the ${h[t(i)?U():B.VAULT].tooltip.toLowerCase()}`),Y=(0,WC.debounce)(j,500);pg(()=>{t(i),r()});let N=(0,WC.debounce)(()=>I.plugin.app.workspace.requestSaveLayout(),2500);pg(()=>{Q(),U(),s(),l(),d(),N(),r()});function r(){p(e,[],!0),p(V,null)}function j(D,UI,rI,RI,eI,xI){if(!D)return;let LI=D;if(UI!==B.VAULT){let AI=I.plugin.app.workspace.getActiveFile();AI&&(UI===B.FOLDER?LI=D.filter(([kI,pI])=>kI.startsWith(AI.parent?.path??"")):UI===B.FILE&&(LI=D.filter(([kI,pI])=>kI===AI.path)))}let $=LI.flatMap(([AI,kI])=>kI.data.map(pI=>({path:AI,range:pI})));return $=$.filter(AI=>AI.range.type!=="comment"||!AI.range.attached_comment),rI!==g.ALL&&($=$.filter(AI=>AI.range.type===Object.values(ag)[rI-1])),RI!==F.ALL&&($=$.filter(AI=>RI===F.CONTENT!==AI.range.empty())),I.plugin.settings.enable_metadata&&(I.plugin.settings.enable_author_metadata&&eI!==A.ALL&&I.plugin.settings.author&&(eI===A.SELF?$=$.filter(AI=>AI.range.fields.author===I.plugin.settings.author):eI===A.OTHERS&&($=$.filter(AI=>AI.range.fields.author!==I.plugin.settings.author))),I.plugin.settings.enable_timestamp_metadata&&xI&&(xI[0]&&xI[1]?$=$.filter(AI=>AI.range.fields.time&&AI.range.fields.time>=xI[0]&&AI.range.fields.time<=xI[1]):xI[0]?$=$.filter(AI=>AI.range.fields.time&&AI.range.fields.time>=xI[0]):xI[1]&&($=$.filter(AI=>AI.range.fields.time&&AI.range.fields.time<=xI[1])))),t(c).length&&($=$.filter(AI=>(0,WC.prepareSimpleSearch)(t(c))(AI.range.text)?.score)),$}async function _(D,UI){UI!=null&&!t(e).length&&(p(e,[UI],!0),p(V,UI,!0));let RI=t(e).map(LI=>t(y)[LI]).reduce((LI,{path:$,range:AI})=>(LI[$]||(LI[$]=[]),LI[$].push(AI),LI),{}),eI=D?Ri:mi,xI={};for(let[LI,$]of Object.entries(RI)){let AI=I.plugin.app.vault.getAbstractFileByPath(LI);AI&&(xI[LI]=await I.plugin.app.vault.cachedRead(AI),await eI(I.plugin.app,AI,$))}L.push({file_history:xI,selected_ranges:t(e)}),p(e,[],!0)}tU(C,{header:rI=>{lU(rI,{container:eI=>{var xI=cu(),LI=JI(xI),$=O(LI);qF($,{get value(){return t(c)},type:"text",enterkeyhint:"search",placeholder:"Search...",spellcheck:!1,onChange:dI=>{p(c,dI,!0),Y()}}),z(LI);var AI=k(LI,2),kI=O(AI);ZF(kI,{onContextMenu:dI=>{let uI=new WC.Menu;n.map((EI,_I)=>{uI.addItem(fI=>{fI.setTitle(EI.tooltip).setIcon(EI.icon).onClick(()=>{Q(_I)})})}),uI.showAtMouseEvent(dI)},class:"clickable-icon nav-action-button",states:n,get value(){return Q()},set value(dI){Q(dI)}});var pI=k(kI,2);RB(pI,{class:"clickable-icon nav-action-button",icon:"lasso",tooltip:"Select all markup",onClick:()=>{p(e,Array.from(t(y).keys()),!0),p(V,0)}});var hI=k(pI,2);ZF(hI,{onContextMenu:dI=>{let uI=new WC.Menu;h.map((EI,_I)=>{uI.addItem(fI=>{fI.setTitle(EI.tooltip).setIcon(EI.icon).onClick(()=>{U(_I)})})}),uI.showAtMouseEvent(dI)},class:"clickable-icon nav-action-button",states:h,get value(){return U()},set value(dI){U(dI)}});var YI=k(hI,2);ZF(YI,{onContextMenu:dI=>{let uI=new WC.Menu;m.map((EI,_I)=>{uI.addItem(fI=>{fI.setTitle(EI.tooltip).setIcon(EI.icon).onClick(()=>{s(_I)})})}),uI.showAtMouseEvent(dI)},class:"clickable-icon nav-action-button",states:m,get value(){return s()},set value(dI){s(dI)}});var yg=k(YI,2);{var fC=dI=>{var uI=lu(),EI=JI(uI);{var _I=aI=>{ZF(aI,{onContextMenu:T=>{let QI=new WC.Menu;a.map((CI,nI)=>{QI.addItem(MI=>{MI.setTitle(CI.tooltip).setIcon(CI.icon).onClick(()=>{l(nI)})})}),QI.showAtMouseEvent(T)},class:"clickable-icon nav-action-button",states:a,get value(){return l()},set value(T){l(T)}})};bI(EI,aI=>{I.plugin.settings.enable_author_metadata&&aI(_I)})}var fI=k(EI,2);{var DI=aI=>{var T=su();T.__click=[Qu,I,d],T.__contextmenu=[Uu,d];var QI=O(T);uC(QI,{icon:"calendar"}),z(T),w(aI,T)};bI(fI,aI=>{I.plugin.settings.enable_timestamp_metadata&&aI(DI)})}w(dI,uI)};bI(yg,dI=>{I.plugin.settings.enable_metadata&&dI(fC)})}z(AI);var J=k(AI,2),FI=O(J),mI=O(FI,!0);z(FI);var ZI=k(FI,2);{var OI=dI=>{var uI=tu(),EI=O(uI);z(uI),lI(()=>PI(EI,`\xB7 ${t(e).length??""} selected`)),w(dI,uI)};bI(ZI,dI=>{t(e).length&&dI(OI)})}z(J),lI(()=>PI(mI,t(E))),w(eI,xI)},$$slots:{container:!0}})},view:rI=>{var RI=Ru();RI.__click=[Au,e,V],RI.__keydown=[Fu,L,e,I,y,V];var eI=O(RI);sU(eI,{get items(){return t(y)},item:(LI,$=Eg,AI=Eg)=>{var kI=nu();let pI;kI.__click=[iu,V,AI,e,I,$],kI.__contextmenu=[Gu,e,_,AI];var hI=O(kI);{var YI=aI=>{var T=du(),QI=O(T),CI=O(QI);RB(CI,{icon:"check",tooltip:"Accept change",onClick:()=>_(!0,AI())});var nI=k(CI,2);RB(nI,{icon:"cross",tooltip:"Reject change",onClick:()=>_(!1,AI())}),z(QI),z(T),w(aI,T)};bI(hI,aI=>{t(u)===AI()&&aI(YI)})}var yg=k(hI,2),fC=O(yg);uC(fC,{size:24,get icon(){return qc[$().range.type]}});var J=k(fC,2),FI=O(J),mI=O(FI,!0);z(FI);var ZI=k(FI,2),OI=O(ZI);{var dI=aI=>{var T=bu(),QI=O(T,!0);z(T),lI(()=>PI(QI,$().range.fields.author)),w(aI,T)};bI(OI,aI=>{$().range.fields.author&&aI(dI)})}var uI=k(OI,2);{var EI=aI=>{var T=eu(),QI=O(T,!0);z(T),lI(CI=>PI(QI,CI),[()=>window.moment.unix($().range.fields.time).format("MMM DD YYYY, HH:mm")]),w(aI,T)};bI(uI,aI=>{$().range.fields.time&&aI(EI)})}z(ZI),z(J),z(yg);var _I=k(yg,2);OA(_I,()=>$().range.text,aI=>{var T=uu(),QI=O(T);{var CI=MI=>{var Rg=Zu();w(MI,Rg)},nI=MI=>{var Rg=Vu();let Hg=sI(()=>$().range.unwrap_parts());var lg=JI(Rg);IA(lg,{get plugin(){return I.plugin},get text(){return t(Hg)[0]},get source(){return $().path},get class(){return $().range.fields.style}});var Sg=k(lg,2);{var Yg=bg=>{IA(bg,{get plugin(){return I.plugin},get text(){return t(Hg)[1]},get source(){return $().path}})};bI(Sg,bg=>{$().range.type==="substitution"&&bg(Yg)})}w(MI,Rg)};bI(QI,MI=>{$().range.empty()?MI(CI):MI(nI,!1)})}z(T),w(aI,T)});var fI=k(_I,2);{var DI=aI=>{var T=IC(),QI=JI(T);Ig(QI,17,()=>$().range.replies,sg,(CI,nI)=>{var MI=IC(),Rg=JI(MI);OA(Rg,()=>t(nI).text,Hg=>{var lg=au(),Sg=O(lg),Yg=O(Sg);{var bg=ug=>{var wg=xu(),Pg=O(wg,!0);z(wg),lI(()=>PI(Pg,t(nI).fields.author)),w(ug,wg)};bI(Yg,ug=>{t(nI).fields.author&&ug(bg)})}var Vg=k(Yg,2);{var Jg=ug=>{var wg=Lu(),Pg=O(wg,!0);z(wg),lI(xg=>PI(Pg,xg),[()=>window.moment.unix(t(nI).fields.time).format("MMM DD YYYY, HH:mm")]),w(ug,wg)};bI(Vg,ug=>{t(nI).fields.time&&ug(Jg)})}z(Sg);var Xg=k(Sg,2),eg=O(Xg);let Tg=sI(()=>t(nI).unwrap());IA(eg,{get plugin(){return I.plugin},get text(){return t(Tg)},get source(){return $().path},get class(){return t(nI).fields.style}}),z(Xg),z(lg),w(Hg,lg)}),w(CI,MI)}),w(aI,T)};bI(fI,aI=>{$().range.replies.length&&aI(DI)})}z(kI),lI(aI=>{pI=WI(kI,1,"cmtr-view-range",null,pI,aI),PI(mI,$().path)},[()=>({"cmtr-view-range-completed":$().range.fields.done,"cmtr-view-range-selected":t(e).some(aI=>aI===AI())})]),VC("mouseenter",kI,()=>p(u,AI(),!0)),VC("mouseleave",kI,()=>p(u,null)),w(LI,kI)},$$slots:{item:!0}}),z(RI),w(rI,RI)},$$slots:{header:!0,view:!0}}),yI()}qI(["click","contextmenu","keydown"]);var bl=class extends hb.PluginSettingTab{plugin;view=null;constructor(I,g){super(I,g),this.plugin=g}display(){let{containerEl:I}=this;I.empty(),this.view=nB(iU,{target:this.containerEl,props:{plugin:this.plugin}})}hide(){super.hide(),this.view&&wB(this.view)}};var ob=require("obsidian");var CQ="commentator-annotations-view",el=class extends ob.ItemView{constructor(I,g){super(I),this.plugin=g,this.props.plugin=g}view=null;#I=iI(wI({plugin:void 0,range_type_filter:void 0,location_filter:void 0,content_filter:void 0,author_filter:void 0,date_filter:void 0}));get props(){return t(this.#I)}set props(I){p(this.#I,I,!0)}async onOpen(){this.containerEl.empty(),this.containerEl.classList.add("cmtr-view")}async onClose(){this.view&&await wB(this.view),this.containerEl.detach()}getViewType(){return CQ}getDisplayText(){return"Vault suggestions and comments"}getIcon(){return"message-square"}getState(){let{plugin:I,...g}=this.props;return{...super.getState(),...g}}async setState(I,g){this.view||(this.props.plugin=this.plugin,this.view=nB(xU,{target:this.containerEl,props:this.props})),this.props.range_type_filter=I.range_type_filter||0,this.props.location_filter=I.location_filter||0,this.props.content_filter=I.content_filter||0,this.props.author_filter=I.author_filter||0,this.props.date_filter=I.date_filter||void 0,await super.setState(I,g)}};var Vv=require("@codemirror/state"),yb=require("obsidian");function LU(C,I,g){let B=C.findIndex(F=>F?.compartment===I);C[B]=C[B].compartment.of(g)}function BQ(C,I,g,B,F){Kc(C,A=>{A.dispatch({effects:[g.reconfigure(B.of(F))]})}),LU(I,g,B.of(F))}function Sb(C){let I=C.iter(),g=[];for(;I.value;)g.push({from:I.from,to:I.to,value:I.value}),I.next();return g}function Kc(C,I){C.workspace.iterateAllLeaves(g=>{g.view instanceof yb.MarkdownView&&g.view.currentMode.type==="source"&&I(g.view.editor.cm)})}function Xb(C,I){let g={};for(let B in C)C[B]!==I[B]&&(g[B]=C[B]);return g}var Wb=require("@codemirror/state");var Eb=C=>Wb.EditorState.transactionExtender.of(I=>{if(I.selection&&I.newSelection.main!==I.startState.selection.main){let g=[],B=[];return C.annotation_gutter_focus_on_click&&B.push(HF.of({from:I.selection.main.from,to:I.selection.main.to})),g.push(vF.of({from:I.selection.main.from,to:I.selection.main.to})),{effects:g,annotations:B}}return{}});var Zl=class extends OB.Plugin{editorExtensions=[];settings=XA;previous_settings={};changed_settings={};previewModeHeaderButton;editModeHeaderModeButton;previewModeStatusBarButton;editModeStatusBarButton;metadataStatusBarButton;defaultEditModeExtension=[];remove_monkeys=[];settings_tab="general";database=new GU(this,"commentator/cache","Commentator cache",pi,"Vault-wide cache for Commentator plugin",()=>[],async(I,g)=>g?g.field(HI).ranges.ranges:xQ(await this.app.vault.cachedRead(I)),this.settings.database_workers,I=>I.map(g=>Object.setPrototypeOf(g,LQ[g.type].prototype)),()=>this.settings);postProcessor;loadEditorExtensions(){this.editorExtensions.length=0,this.editorExtensions.push(rA),this.editorExtensions.push(FQ.Prec.highest(ss)),this.editorExtensions.push(Eb(this.settings)),this.editorExtensions.push(FQ.Prec.highest(at)),this.editorExtensions.push(LA.of(TF(this.settings.default_edit_mode,this.settings))),this.editorExtensions.push(HI),this.settings.comment_style==="icon"&&this.editorExtensions.push(FQ.Prec.low(Us(this.settings))),this.settings.annotation_gutter&&this.editorExtensions.push(WQ.of(FQ.Prec.low(AF(this.app)))),this.settings.live_preview&&this.editorExtensions.push(FQ.Prec.low(cs(this.settings))),this.settings.diff_gutter&&this.editorExtensions.push(EQ.of(Lt)),this.settings.tag_completion&&this.editorExtensions.push(mt),this.settings.tag_correcter&&this.editorExtensions.push(ht),this.editorExtensions.push(rb.EditorView.domEventHandlers({copy:Li.bind(null,this.settings)})),this.editorExtensions.push(Jl.of(WF.of(this.settings.diff_gutter_hide_empty))),this.editorExtensions.push(dQ.of(FB.of(this.settings.annotation_gutter_width))),this.editorExtensions.push(pl.of(yF.of(this.settings.annotation_gutter_hide_empty))),this.editorExtensions.push(YU.of(IF.of(this.settings.annotation_gutter_default_fold_state))),this.editorExtensions.push(Hl.of(SF.of(this.settings.annotation_gutter_fold_button))),this.editorExtensions.push(Yl.of(XF.of(this.settings.annotation_gutter_resize_handle))),this.editorExtensions.push(JU.of(rB.of(this.settings.annotation_gutter_included_types))),this.editorExtensions.push(uA.of(iC.of(this.settings.default_preview_mode))),this.editorExtensions.push(xA.of(aC.of(this.settings.default_edit_mode)))}async updateEditorExtension(){Object.keys(this.changed_settings).some(I=>Hi.has(I))?(this.loadEditorExtensions(),this.app.workspace.updateOptions(),this.settings.post_processor&&Nt(this.app)):Object.keys(this.changed_settings).some(I=>Yi.has(I))&&Kc(this.app,I=>{I.dispatch(I.state.update({effects:aA.of(!0)}))})}async onload(){Fg.app=this.app,window.COMMENTATOR_DEBUG={plugin:this,database:this.database,get ranges(){return this.app.workspace.activeEditor?.editor?.cm.state.field(HI).ranges.ranges},get tree(){return this.app.workspace.activeEditor?.editor?.cm.state.field(HI).ranges.tree},debugRangeset:Sb},this.registerView(CQ,I=>new el(I,this)),await this.migrateSettings(await this.loadData()),this.defaultEditModeExtension=TF(this.settings.default_edit_mode,this.settings),this.addSettingTab(new bl(this.app,this)),this.loadEditorExtensions(),this.registerEditorExtension(this.editorExtensions),this.app.workspace.onLayoutReady(()=>{this.previewModeHeaderButton=cG(this,this.settings.toolbar_preview_button),this.editModeHeaderModeButton=iG(this,this.settings.toolbar_edit_button)}),this.previewModeStatusBarButton=sG(this,this.settings.status_bar_preview_button),this.editModeStatusBarButton=lG(this,this.settings.status_bar_edit_button),this.metadataStatusBarButton=tG(this,this.settings.status_bar_metadata_button),this.settings.post_processor&&(this.postProcessor=this.registerMarkdownPostProcessor(async(I,g)=>ns(I,g,this.settings),-99999),Rs(this.app)),this.registerEvent(gG(this.app)),this.registerEvent(CG(this.app));for(let I of IG(this))this.addCommand(I);this.remove_monkeys.push(iA(this.app.plugins,{uninstallPlugin:I=>async g=>{I&&await I.apply(this.app.plugins,[g]),g==="commentator"&&await this.database.dropDatabase()}}))}async migrateSettings(I){let g=this.settings;if(this.settings=Object.assign({},XA,I),this.previous_settings=Object.assign({},g,this.settings),Fg.PLUGIN_SETTINGS=this.settings,I===null)await this.setSettings();else{let B=I?.version;try{if(B!==XA.version){if(B||this.app.workspace.onLayoutReady(async()=>{new OB.Notice("Commentator: rebuilding database for new version",5e3),new OB.Notice("Commentator: metadata and replies features are now available, you can opt-in to these features in the settings",0)}),B.localeCompare("0.2.3",void 0,{numeric:!0})<0&&I.suggestion_gutter_hide_empty){let F=[["suggestion_gutter","diff_gutter"],["suggestion_gutter_hide_empty","diff_gutter_hide_empty"],["comment_gutter_default_fold_state","annotation_gutter_default_fold_state"],["comment_gutter_fold_button","annotation_gutter_fold_button"],["comment_gutter_resize_handle","annotation_gutter_resize_handle"],["comment_gutter_width","annotation_gutter_width"],["comment_gutter_hide_empty","annotation_gutter_hide_empty"]];for(let[A,Q]of F)A in this.settings&&(this.settings[Q]=this.settings[A],delete this.settings[A]);this.settings.comment_style==="block"&&(this.settings.comment_style="icon",this.settings.annotation_gutter=!0)}this.settings.version=XA.version,await this.setSettings()}}catch{new OB.Notice("Commentator: Migration to new settings failed, using the default settings provided by the plugin",0)}}}async onExternalSettingsChange(){await this.migrateSettings(await this.loadData())}async onunload(){this.previewModeHeaderButton.detachButtons(),this.editModeHeaderModeButton.detachButtons(),OB.MarkdownPreviewRenderer.unregisterPostProcessor(this.postProcessor);for(let I of this.remove_monkeys)I();this.database.unload(),window.COMMENTATOR_DEBUG=void 0}async loadSettings(){this.settings=Object.assign({},XA,await this.loadData())}async setSettings(){Fg.PLUGIN_SETTINGS=this.settings,await this.saveData(this.settings),this.changed_settings=Xb(this.settings,this.previous_settings),this.previous_settings=Object.assign({},this.settings)}async saveSettings(){await this.setSettings(),this.previewModeHeaderButton.setLabelRendering(this.changed_settings.toolbar_show_buttons_labels),this.editModeHeaderModeButton.setLabelRendering(this.changed_settings.toolbar_show_buttons_labels),this.previewModeHeaderButton.setRendering(this.changed_settings.toolbar_preview_button),this.editModeHeaderModeButton.setRendering(this.changed_settings.toolbar_edit_button),this.previewModeStatusBarButton.setRendering(this.changed_settings.status_bar_preview_button),this.editModeStatusBarButton.setRendering(this.changed_settings.status_bar_edit_button),this.metadataStatusBarButton.setRendering(this.changed_settings.status_bar_metadata_button),this.changed_settings.post_processor!==void 0&&(this.changed_settings.post_processor?this.postProcessor=this.registerMarkdownPostProcessor((I,g)=>ns(I,g,this.settings),-99999):OB.MarkdownPreviewRenderer.unregisterPostProcessor(this.postProcessor),Rs(this.app)),this.changed_settings.annotation_gutter_width!==void 0&&BQ(this.app,this.editorExtensions,dQ,FB,this.settings.annotation_gutter_width),this.changed_settings.annotation_gutter_hide_empty!==void 0&&BQ(this.app,this.editorExtensions,pl,yF,this.settings.annotation_gutter_hide_empty),this.changed_settings.diff_gutter_hide_empty!==void 0&&BQ(this.app,this.editorExtensions,Jl,WF,this.settings.diff_gutter_hide_empty),this.changed_settings.annotation_gutter_fold_button!==void 0&&BQ(this.app,this.editorExtensions,Hl,SF,this.settings.annotation_gutter_fold_button),this.changed_settings.annotation_gutter_resize_handle!==void 0&&BQ(this.app,this.editorExtensions,Yl,XF,this.settings.annotation_gutter_resize_handle),this.changed_settings.default_preview_mode!==void 0&&LU(this.editorExtensions,uA,iC.of(this.settings.default_preview_mode)),this.changed_settings.default_edit_mode!==void 0&&(LU(this.editorExtensions,LA,TF(this.settings.default_edit_mode,this.settings)),LU(this.editorExtensions,xA,aC.of(this.settings.default_edit_mode))),await this.updateEditorExtension(),Object.keys(this.changed_settings).some(I=>Ji.has(I))&&await this.database.reinitializeDatabase()}async setSetting(I,g){this.settings[I]=g,await this.saveSettings()}async activateView(){this.app.workspace.detachLeavesOfType(CQ),await this.app.workspace.getRightLeaf(!1).setViewState({type:CQ,active:!0}),await this.app.workspace.revealLeaf(this.app.workspace.getLeavesOfType(CQ)[0])}setEditMode(I,g){I&&I.editor&&(I.editor.cm.dispatch(I.editor.cm.state.update({effects:[LA.reconfigure(TF(g,this.settings)),xA.reconfigure(aC.of(g))]})),this.editModeStatusBarButton.updateButton(g),this.editModeHeaderModeButton.updateButton(I,g))}setPreviewMode(I,g){I&&I.editor&&(I.editor.cm.dispatch(I.editor.cm.state.update({effects:[uA.reconfigure(iC.of(g))]})),this.previewModeStatusBarButton.updateButton(g),this.previewModeHeaderButton.updateButton(I,g))}}; + }`};function _c(C,I){VI(I,!0),IF(C,ox);let g=(gI,bI)=>{let xg=()=>bI?.().autocloseSupported,wg=()=>bI?.().todayBtnClasses,uC=()=>bI?.().clearBtnClasses,EC=()=>bI?.().onCancel,Zg=()=>bI?.().onConfirm,zC=()=>bI?.().onClear,fg=()=>bI?.().onToday,AF=()=>bI?.().isTodayDisabled,NC=()=>bI?.().i18n,lA=()=>bI?.().currentMode;var LC=Ng(),NB=yI(LC);{var NF=rB=>{var pB=Lx(),UF=O(pB);{var sA=u=>{var W=ex(),E=O(W);E.__click=function(...j){EC()?.apply(this,j)};var S=O(E,!0);z(E);var k=v(E,2);k.__click=function(...j){Zg()?.apply(this,j)};var K=O(k,!0);z(k),z(W),sI(()=>{nI(E,1,Og(uC()),"svelte-yheoi9"),vI(S,NC().cancelBtn),nI(k,1,Og(wg()),"svelte-yheoi9"),vI(K,NC().okBtn)}),D(u,W)};GI(UF,u=>{xg()||u(sA)})}var V=v(UF,2);{var X=u=>{var W=ux(),E=O(W);{var S=j=>{var P=Vx();P.__click=function(...cI){fg()?.apply(this,cI)};var II=O(P,!0);z(P),sI(()=>{nI(P,1,Og(wg()),"svelte-yheoi9"),P.disabled=AF(),vI(II,NC().todayBtn)}),D(j,P)};GI(E,j=>{r()&&lA()==="date"&&j(S)})}var k=v(E,2);{var K=j=>{var P=xx();P.__click=function(...cI){zC()?.apply(this,cI)};var II=O(P,!0);z(P),sI(()=>{nI(P,1,Og(uC()),"svelte-yheoi9"),vI(II,NC().clearBtn)}),D(j,P)};GI(k,j=>{N()&&j(K)})}z(W),D(u,W)};GI(V,u=>{(r()||N())&&u(X)})}z(pB),D(rB,pB)};GI(NB,rB=>{xg(),rB(NF)})}D(gI,LC)},B=J(I,"inputId",3,""),F=J(I,"name",3,"date"),Q=J(I,"disabled",3,!1),A=J(I,"placeholder",3,null),U=J(I,"required",3,!1),l=J(I,"value",15,null),s=J(I,"isRange",3,!1),G=J(I,"startDate",3,null),t=J(I,"endDate",3,null),c=J(I,"pickerOnly",3,!1),d=J(I,"startView",7,2),b=J(I,"mode",3,"auto"),Z=J(I,"disableDatesFn",3,null),e=J(I,"manualInput",3,!1),x=J(I,"theme",19,()=>qg.theme),a=J(I,"format",19,()=>qg.format),n=J(I,"formatType",19,()=>qg.formatType),h=J(I,"displayFormat",19,()=>qg.displayFormat),m=J(I,"displayFormatType",19,()=>qg.displayFormatType),L=J(I,"minuteIncrement",19,()=>qg.minuteIncrement),R=J(I,"weekStart",19,()=>qg.weekStart),o=J(I,"inputClasses",19,()=>qg.inputClasses),y=J(I,"todayBtnClasses",19,()=>qg.todayBtnClasses),H=J(I,"clearBtnClasses",19,()=>qg.clearBtnClasses),r=J(I,"todayBtn",19,()=>qg.todayBtn),N=J(I,"clearBtn",19,()=>qg.clearBtn),T=J(I,"clearToggle",19,()=>qg.clearToggle),M=J(I,"autocommit",19,()=>qg.autocommit),q=J(I,"hourOnly",19,()=>qg.hourOnly),AI=J(I,"i18n",19,()=>qg.i18n),aI=J(I,"validatorAction",3,null),uI=J(I,"ce_valueElement",7,null),ZI=J(I,"ce_displayElement",7,null),XI=J(I,"positionResolver",3,Hb),kI=J(I,"actionRow",3,g);s()&&Array.isArray(l());let{iDates:mI,iValues:wI,iValueCombined:gg}=Yb(l(),a(),AI(),n()),HI=gg,hI=lI(rI(wI)),WI=lI(rI(mI.map(gI=>new ig(gI)))),rg=lI(rI(wI)),PI=BI(()=>i(hI).length?i(hI).join(","):null),p=lI(rI(Rg())),w=a(),QI=h(),FI=lI(null),fI=BI(()=>G()?gQ(G(),a(),AI(),n()):null),oI=BI(()=>t()?new Date(gQ(t(),a(),AI(),n()).setSeconds(1)):null),eI=BI(()=>i(fI)&&i(fI)>new Date||i(oI)&&i(oI)F().endsWith("]")?F().substring(0,F().length-1)+"_input]":F()+"_input"),Ag=Jb(b(),a()),jI=lI(rI(Ag)),YI=lI(rI(Ag==="time"?"time":"date")),bg=rI(s()?[{ref:null},{ref:null}]:[{ref:null}]),$=lI("date"),dI=BI(()=>M()&&(s()&&i(jI)==="date"||!s())),UI=lI(rI(c())),DI=lI(rI(c())),Ug=c()?()=>({}):oF,bC=BI(()=>!!c()),ZC=aI()?aI().shift():()=>{},yg=aI()||[],eC=BI(()=>c()?()=>{}:XI()),VC=BI(()=>M()?!1:i(hI).join()!==i(rg).join()),kg;function Rg(){return i(WI).sort((gI,bI)=>gI.getTime()-bI.getTime()).map(gI=>$Q(gI,h()||a(),AI(),m()||n())).join(" - ")}function Dg(){return s()?i(hI).length===2?i(hI):null:i(hI)[0]||null}function Tg({type:gI,date:bI,isKeyboard:xg,dateIndex:wg=0}){if(bI&&!s()&&i(WI).length&&i(WI)[0].getFullYear()===bI.getFullYear()&&i(WI)[0].getMonth()===bI.getMonth()&&i(WI)[0].getDate()===bI.getDate()&&i(jI)==="date"&&!U()&&T()&&(bI=null),s()){if(gI==="date")Y(WI,bI?(i(WI).length===2?[new ig(bI)]:i(WI).concat(new ig(bI))).map(uC=>uC.getTime()).sort().map(uC=>new ig(uC)):[],!0);else if(bI&&wg!==void 0)i(WI)[wg]=new ig(bI);else if(gI==="datetime")i(WI)[0]=new ig(bI),i(WI)[1]=new ig(bI);else throw new Error(`Unhandled event type: '${gI}'`);Y(hI,i(WI).map(uC=>$Q(uC,a(),AI(),n())),!0)}else Y(WI,bI?[new ig(bI)]:[],!0),Y(hI,bI?[$Q(bI,a(),AI(),n())]:[],!0);Y($,gI,!0),Vg(gI)&&$g(),uB(gI,xg,wg)}function Vg(gI){return!M()||s()&&i(jI).includes("time")||s()&&(i(jI)==="datetime"||i(hI).length!==2)?!1:gI==="minute"||gI===i(jI)||gI==="hour"&&q()||c()}function $g(){HI=i(hI).join(),Y(rg,[...i(hI)],!0),Y(p,Rg(),!0),l(Dg()),Rs(!0),I.onChange?.(s()?i(hI):i(hI)[0]||null),I.onDateChange?.({value:s()?i(hI):i(hI)[0]||null,dateValue:s()?i(WI):i(WI)[0]||null,displayValue:i(p),valueFormat:a(),displayFormat:h(),event:i($)})}function xC(){d(2),i(jI)==="datetime"?setTimeout(()=>{c()||Y(DI,!1),Y(YI,"date")},M()?300:0):c()||Y(DI,!1)}function uB(gI,bI,xg){if(bI&&EF!=="Enter")return;if(gI==="hour"&&!q()){bg[xg].ref.showMinuteView();return}let wg=Vg(gI);if(i(jI)==="datetime"&&!(gI==="minute"&&!s()&&i(jI)==="datetime"&&wg)){gI==="date"&&(s()&&i(hI).length===2||!s())&&Y(YI,"time");return}wg&&!bI&&xC()}function WC(){let gI=new Date;Tg({type:s()?"datetime":"date",dateIndex:0,date:new Date(gI.getFullYear(),gI.getMonth(),gI.getDate(),0,0,0),isKeyboard:!1}),s()&&Tg({type:s()?"datetime":"date",dateIndex:1,date:new Date(gI.getFullYear(),gI.getMonth(),gI.getDate(),23,59,59,999),isKeyboard:!1}),Vg("date")===!1&&$g(),i(jI)==="date"&&xC()}function ng(){Y(WI,[],!0),Y(hI,[],!0),HI=null,$g()}function WF(){let gI=Array.isArray(l())?l().join():l()||null;(HI!==gI||M()===!1||s())&&$g(),xC()}function FB(){Y(hI,[...i(rg)],!0),xC(),I.onCancel?.()}let EF=null;function lQ(gI){if(i(DI)||(["Backspace","Delete"].includes(gI.key)&&!U()&&ng(),gI.key==="Enter"&&sQ()),!i(DI)&&gI.key!=="Tab"){Y(DI,gI.key!=="Shift"),gI.preventDefault();return}switch(EF=gI.key,gI.key){case"PageDown":case"PageUp":case"ArrowDown":case"ArrowUp":case"ArrowLeft":case"ArrowRight":if(gI.preventDefault(),s())return;i(YI)==="date"?kg.handleGridNav(gI.key,gI.shiftKey):bg[0].ref.makeTick(["ArrowDown","ArrowLeft","PageDown"].includes(gI.key)?-1:1);break;case"Escape":M()?ng():FB();break;case"Backspace":if(e()&&!s())return;case"Delete":!U()&&ng();break;case"Enter":if(i(UI)&&gI.preventDefault(),i(hI).length===0){Y(DI,!1);return}if(i(YI)==="time"&&i($)==="hour")return bg[0].ref.showMinuteView();if(i(jI)==="datetime"&&i(YI)!=="time"){Y(YI,"time");return}WF();break;case"Tab":i(DI)&&(Y(DI,!1),gI.preventDefault());case"F5":break;default:!e()&&gI.preventDefault()}}function AA(gI){gI.preventDefault(),gI.stopPropagation();let bI=gQ(gI.target.value,h()||a(),AI(),m()||n());$Q(bI,h()||a(),AI(),m()||n())===gI.target.value&&(Tg({type:"date",date:bI,isKeyboard:!0}),kg.focusDate(bI))}function nU(gI){d(2),Y(YI,gI,!0)}let UA=lI(rI(e()?"text":"none"));function aU(){e()&&i(UI)&&Y(UA,i(UA)==="text"?"none":"text",!0),!i(DI)&&sQ()}function sQ(){Y(UI,!0),Y(DI,!0)}function mU(){Y(UI,!1),i(dI)?WF():FB(),!ZI()&&I.onBlur?.()}function Rs(gI){uI()&&ZI()&&(uI().value=i(hI).join(",")||"",ZI().value=i(p),uI().dispatchEvent(new Event("input")),ZI().dispatchEvent(new Event("input"))),gI&&I.onInput?.(i(PI))}function ns(gI){Y(FI,gI,!0)}CF(()=>{ZI()&&(ZI().onfocus=sQ,ZI().onblur=mU,ZI().onclick=aU,ZI().onkeydown=lQ)});function as(gI){let bI=Array.isArray(gI)?gI.join():gI||null;HI!==bI&&(Y(hI,gI?Array.isArray(gI)?gI:[gI]:[],!0),Y(WI,i(hI).map(xg=>new ig(gQ(xg,a(),AI(),n()))),!0),Y(rg,i(hI),!0),HI=bI)}function hU(gI,bI){QI!==bI&&(QI=bI,Y(p,Rg(),!0)),w!==gI&&i(WI).length&&(w=gI,Y(hI,i(WI).map(xg=>$Q(xg,gI,AI(),n())),!0),HI=i(hI).join(),QI===null&&QI===bI&&Y(p,Rg(),!0),b()==="auto"&&(Y(jI,gI.match(/g|hh?|ii?/i)&&gI.match(/y|m|d/i)?"datetime":gI.match(/g|hh?|ii?/i)?"time":"date",!0),i(jI)==="time"&&i(YI)!=="time"&&Y(YI,"time")),$g())}og(()=>as(l())),og(()=>hU(a(),h()));var tQ=Xx();let XU;var cQ=O(tQ);cQ.__click=aU;var oU=O(cQ);{var ms=gI=>{var bI=nx(),xg=yI(bI);gF(xg);var wg=v(xg,2);{var uC=EC=>{var Zg=Rx();gF(Zg);let zC;Zg.__input=function(...fg){(e()?AA:()=>{})?.apply(this,fg)},Zg.__keydown=lQ,ql(Zg,(fg,AF)=>ZC?.(fg,AF),()=>yg),sI(fg=>{pI(Zg,"id",B()),pI(Zg,"name",i(MI)),zC=nI(Zg,1,Og(o()),"svelte-yheoi9",zC,fg),hF(Zg,i(p)),pI(Zg,"placeholder",A()),Zg.disabled=Q(),Zg.required=U(),pI(Zg,"inputmode",i(UA)),Zg.readOnly=i(UI)&&!e()&&!s()},[()=>({"value-dirty":i(VC)})]),vg("focus",Zg,sQ),vg("blur",Zg,mU),D(EC,Zg)};GI(wg,EC=>{c()||EC(uC)})}sI(()=>{pI(xg,"name",F()),hF(xg,l())}),D(gI,bI)};GI(oU,gI=>{ZI()||gI(ms)})}var hs=v(oU,2);yC(hs,()=>I.children??mg),z(cQ);var Xs=v(cQ,2);{var os=gI=>{var bI=hx();let xg;bI.__mousedown=[ax];var wg=O(bI);qI(wg,21,()=>bg,Qg,(EC,Zg,zC)=>{var fg=mx(),AF=O(fg);{var NC=LC=>{let NB=BI(()=>i(jI)?.includes("time")),NF=BI(()=>d()>2?2:d());dB(Dc(LC,{wid:zC,get dates(){return i(WI)},get isRange(){return s()},get startDate(){return i(fI)},get endDate(){return i(oI)},get enableTimeToggle(){return i(NB)},get initialView(){return i(NF)},get hoverDate(){return i(FI)},get additionalDisableFn(){return Z()},get i18n(){return AI()},get weekStart(){return R()},onupdate:Tg,onswitch:nU,onhoverupdate:ns}),rB=>kg=rB,()=>kg)},lA=LC=>{let NB=BI(()=>i(WI)[zC]||null),NF=BI(()=>s()&&zC===1?i(WI)[0]:i(fI)),rB=BI(()=>i(jI)!=="time"),pB=BI(()=>a().match(n()==="php"?"a|A":"p|P")!==null);dB(Tc(LC,{wid:zC,get date(){return i(NB)},get startDate(){return i(NF)},get endDate(){return i(oI)},get hasDateComponent(){return i(rB)},get showMeridian(){return i(pB)},get i18n(){return AI()},get minuteIncrement(){return L()},get hourOnly(){return q()},onupdate:Tg,onswitch:nU}),(UF,sA)=>sA.ref=UF,UF=>UF?.ref,()=>[i(Zg)])};GI(AF,LC=>{i(YI)==="date"?LC(NC):LC(lA,!1)})}z(fg),D(EC,fg)}),z(wg);var uC=v(wg,2);yC(uC,kI,()=>({autocloseSupported:i(dI),todayBtnClasses:y(),clearBtnClasses:H(),onCancel:FB,onConfirm:WF,onClear:ng,onToday:WC,isTodayDisabled:i(eI),i18n:AI(),currentMode:i(YI)})),z(bI),ql(bI,EC=>i(eC)?.(EC)),sI(EC=>xg=nI(bI,1,`sdt-calendar-wrap ${x()??""}`,"svelte-yheoi9",xg,EC),[()=>({"is-popup":!i(bC),"is-range-wrap":s()})]),_g(3,bI,()=>Ug,()=>({duration:200})),D(gI,bI)};GI(Xs,gI=>{i(DI)&&i(UI)&&gI(os)})}z(tQ),sI(gI=>XU=nI(tQ,1,"sdt-component-wrap svelte-yheoi9",null,XU,gI),[()=>({"picker-active":i(DI)})]),D(C,tQ),xI()}KI(["click","input","keydown","mousedown"]);var vb=_c;var yx=f('
');function qc(C,I){VI(I,!0);var g=yx(),B=O(g);vb(B,{pickerOnly:!0,isRange:!0,autocommit:!1,mode:"datetime",get value(){return I.value},format:"yyyy-mm-dd hh:ii:00",onBlur:()=>I.onClose(null),onChange:F=>I.onClose(F)}),z(g),D(C,g),xI()}var xU=class extends kb.Modal{constructor(g,B,F){super(g.app);this.plugin=g;this.value=B;this.callback=F;this.contentEl.parentElement.addClass("cmtr-daterange-picker-modal")}view;async onOpen(){this.view=yB(qc,{target:this.contentEl,props:{value:this.value?.map(g=>new Date(g*1e3).toISOString().split("T")[0]),onClose:async g=>{this.callback(g),super.close()}}})}onClose(){this.view&&$B(this.view)}};var Db=require("obsidian"),Ev=require("@codemirror/search");var Sx=Object.values(cg);function $c(C,I,g,B,F,Q,A,U,l){if(!I)return[];let s=I;B!==0&&l&&(B===1?s=I.filter(([t,c])=>t.startsWith(l.parent?.path??"")):B===2&&(s=I.filter(([t,c])=>t===l.path)));let G=s.flatMap(([t,c])=>c.data.map(d=>({path:t,range:d})));return G=G.filter(t=>t.range.type!=="comment"||!t.range.attached_comment),F!==void 0&&F!==0&&(G=G.filter(t=>t.range.full_thread.some(c=>c.type===Sx[F-1]))),Q!==0&&(G=G.filter(t=>t.range.full_thread.some(c=>Q===1!==c.empty()))),C.settings.enable_metadata&&(C.settings.enable_author_metadata&&A!==0&&C.settings.author&&(A===1?G=G.filter(t=>t.range.full_thread.some(c=>c.fields.author===C.settings.author)):A===2&&(G=G.filter(t=>t.range.full_thread.some(c=>c.fields.author&&c.fields.author!==C.settings.author)))),C.settings.enable_timestamp_metadata&&U&&(U[0]&&U[1]?G=G.filter(t=>t.range.full_thread.some(c=>c.fields.time&&c.fields.time>=U[0]&&c.fields.time<=U[1])):U[0]?G=G.filter(t=>t.range.full_thread.some(c=>c.fields.time&&c.fields.time>=U[0])):U[1]&&(G=G.filter(t=>t.range.full_thread.some(c=>c.fields.time&&c.fields.time<=U[1]))))),g?.length&&(G=G.filter(t=>(0,Db.prepareSimpleSearch)(g)(t.range.full_text)?.score)),G}async function Wx(C,I,g,B,F){C.key==="z"&&C.ctrlKey&&!C.shiftKey&&!C.altKey&&!C.metaKey?(C.preventDefault(),await pt(I.plugin)):C.key==="a"&&C.ctrlKey&&!C.shiftKey&&!C.altKey&&!C.metaKey?(C.preventDefault(),Y(g,[...i(B)],!0),Y(F,0)):C.key==="Escape"&&(C.preventDefault(),Y(g,[],!0),Y(F,null))}async function Ex(C,I,g){Y(I,[],!0),Y(g,null)}var Nx=(C,I,g)=>new xU(I.plugin,g(),B=>{g(B?.map(F=>F?window.moment(F,"YYYY-MM-DD HH:mm:ss").unix():0))}).open(),rx=(C,I)=>{C.preventDefault();let g=new EB.Menu;g.addItem(B=>{B.setTitle("Clear date filter").setIcon("calendar-x").onClick(()=>{I(void 0)})}),g.addItem(B=>{B.setTitle("Filter to today").setIcon("calendar-days").onClick(()=>{let F=window.moment().startOf("day").unix();I([F,F+86400])})}),g.addItem(B=>{B.setTitle("Filter to this week").setIcon("calendar-range").onClick(()=>{let F=window.moment().startOf("day").unix();I([F-window.moment().day()*86400,F+(7-window.moment().day())*86400])})}),g.addItem(B=>{B.setTitle("Filter to this month").setIcon("calendar-clock").onClick(()=>{let F=window.moment().startOf("day").unix();I([F-window.moment().date()*86400,F+(window.moment().daysInMonth()-window.moment().date())*86400])})}),g.showAtMouseEvent(C)},px=f(''),Hx=f(" ",1),Yx=f(" "),Jx=f('
',1),vx=f('
');function uU(C,I){VI(I,!0);let g=J(I,"range_type_filter",23,()=>0),B=J(I,"location_filter",23,()=>0),F=J(I,"content_filter",23,()=>0),Q=J(I,"author_filter",23,()=>0),A=J(I,"date_filter",7,void 0),U=lI(""),l=lI(null),s=I.plugin.app.workspace.on("layout-change",()=>{Y(l,I.plugin.app.workspace.getActiveFile(),!0)}),G=lI(!1),t=lI(rI([])),c=lI(rI([])),d=lI(null),b=[{icon:"asterisk",tooltip:"All markup",value:0},{icon:"plus-circle",tooltip:"Addition markup",value:1},{icon:"minus-square",tooltip:"Deletion markup",value:2},{icon:"replace",tooltip:"Substitution markup",value:3},{icon:"highlighter",tooltip:"Highlight markup",value:4},{icon:"message-square",tooltip:"Comment markup",value:5}],Z=["suggestions","insertions","deletions","replacements","highlights","comments"],e=[{icon:"vault",tooltip:"Entire vault",value:0},{icon:"folder-closed",tooltip:"Current folder",value:1},{icon:"file",tooltip:"Current file",value:2}],x=[{icon:"maximize",tooltip:"All suggestions",value:0},{icon:"square",tooltip:"Suggestions with content",value:1},{icon:"box-select",tooltip:"Empty suggestions",value:2}],a=[{icon:"users",tooltip:"All suggestions",value:0},{icon:"user",tooltip:"Own suggestions",value:1},{icon:"user-x",tooltip:"Others' suggestions",value:2}];CF(()=>{I.plugin.database.on("database-update",y=>{Y(t,y,!0)}),Y(t,I.plugin.database.allEntries(),!0)}),_d(()=>{I.plugin.app.workspace.offref(s)});let n=BI(()=>$c(I.plugin,i(t),i(U),B(),g(),F(),Q(),A(),i(l))),h=BI(()=>`${i(n).length} ${Z[g()]} in the ${e[i(l)?B():0].tooltip.toLowerCase()}`),m=(0,EB.debounce)($c,500),L=(0,EB.debounce)(()=>{I.sync_props({range_type_filter:g(),location_filter:B(),content_filter:F(),author_filter:Q(),date_filter:A(),search_filter:i(U)}),I.plugin.app.workspace.requestSaveLayout()},2500);og(()=>{g(),B(),F(),Q(),A(),L()}),og(()=>{i(n),Y(c,[],!0),Y(d,null)});async function R(y,H,r){if(y.stopPropagation(),y.shiftKey)i(d)?Y(c,[...i(n)].slice(Math.min(i(d),r),Math.max(i(d),r)+1),!0):(Y(c,[i(n)[r]],!0),Y(d,r,!0));else if(y.ctrlKey||y.metaKey){Y(d,r,!0);let N=i(c).length,T=i(n)[r];Y(c,i(c).filter(M=>!(M.path===T.path&&M.range===T.range)),!0),i(c).length===N&&Y(c,[...i(c),T],!0)}}async function o(y,H,r){y.stopPropagation(),Y(c,[],!0),await Xl(I.plugin,H)}tU(C,{header:r=>{sU(r,{container:T=>{var M=Jx(),q=yI(M),AI=O(q);qF(AI,{get value(){return i(U)},type:"text",enterkeyhint:"search",placeholder:"Search...",spellcheck:!1,onChange:PI=>{Y(U,PI,!0),m()}}),z(q);var aI=v(q,2),uI=O(aI);XF(uI,{onContextMenu:PI=>{let p=new EB.Menu;b.map((w,QI)=>{p.addItem(FI=>{FI.setTitle(w.tooltip).setIcon(w.icon).onClick(()=>{g(QI)})})}),p.showAtMouseEvent(PI)},class:"cmtr-view-action clickable-icon nav-action-button",states:b,get value(){return g()},set value(PI){g(PI)}});var ZI=v(uI,2);XF(ZI,{onContextMenu:PI=>{let p=new EB.Menu;e.map((w,QI)=>{p.addItem(FI=>{FI.setTitle(w.tooltip).setIcon(w.icon).onClick(()=>{B(QI)})})}),p.showAtMouseEvent(PI)},class:"cmtr-view-action clickable-icon nav-action-button",states:e,get value(){return B()},set value(PI){B(PI)}});var XI=v(ZI,2);XF(XI,{onContextMenu:PI=>{let p=new EB.Menu;x.map((w,QI)=>{p.addItem(FI=>{FI.setTitle(w.tooltip).setIcon(w.icon).onClick(()=>{F(QI)})})}),p.showAtMouseEvent(PI)},class:"cmtr-view-action clickable-icon nav-action-button",states:x,get value(){return F()},set value(PI){F(PI)}});var kI=v(XI,2);{var mI=PI=>{var p=Hx(),w=yI(p);{var QI=oI=>{XF(oI,{onContextMenu:eI=>{let MI=new EB.Menu;a.map((Ag,jI)=>{MI.addItem(YI=>{YI.setTitle(Ag.tooltip).setIcon(Ag.icon).onClick(()=>{Q(jI)})})}),MI.showAtMouseEvent(eI)},class:"cmtr-view-action clickable-icon nav-action-button",states:a,get value(){return Q()},set value(eI){Q(eI)}})};GI(w,oI=>{I.plugin.settings.enable_author_metadata&&oI(QI)})}var FI=v(w,2);{var fI=oI=>{var eI=px();eI.__click=[Nx,I,A],eI.__contextmenu=[rx,A];var MI=O(eI);lC(MI,{icon:"calendar"}),z(eI),D(oI,eI)};GI(FI,oI=>{I.plugin.settings.enable_timestamp_metadata&&oI(fI)})}D(PI,p)};GI(kI,PI=>{I.plugin.settings.enable_metadata&&PI(mI)})}var wI=v(kI,2);dC(wI,{class:"clickable-icon nav-action-button cmtr-view-action",icon:"more-vertical",tooltip:"More options",onClick:PI=>{GF(!0);let p=new EB.Menu;p.addItem(w=>{w.setTitle("Clear filters").setIcon("filter-x").setSection("filter-actions").onClick(()=>{g(0),B(0),F(0),Q(0),A(void 0),Y(U,"")})}),p.addItem(w=>{let QI=w.setTitle("Filter by author").setIcon("user-search").setSection("filter-actions").setSubmenu();Ll(QI,Q(),a,FI=>{Q(FI)})}),p.addItem(w=>{let QI=w.setTitle("Filter by type").setIcon("space").setSection("filter-actions").setSubmenu();Ll(QI,g(),b,FI=>{g(FI)})}),p.addItem(w=>{let QI=w.setTitle("Filter by location").setIcon("locate").setSection("filter-actions").setSubmenu();Ll(QI,B(),e,FI=>{B(FI)})}),p.addItem(w=>{w.setTitle("Filter by date").setIcon("calendar").setSection("filter-actions").onClick(()=>{new xU(I.plugin,A(),QI=>{A(QI?.map(FI=>FI?window.moment(FI,"YYYY-MM-DD HH:mm:ss").unix():0))}).open()})}),p.addItem(w=>{w.setTitle("Select all").setIcon("circle").setSection("selection-actions").onClick(async()=>{Y(c,[...i(n)],!0),Y(d,0)})}),p.addItem(w=>{w.setTitle("Clear selection").setIcon("circle-dashed").setSection("selection-actions").onClick(()=>{Y(c,[],!0),Y(d,null)})}),p.addItem(w=>{w.setTitle("Invert selection").setIcon("circle-alert").setSection("selection-actions").onClick(()=>{let QI=[...i(c)].sort((oI,eI)=>{oI.range.from-eI.range.from}),FI=[],fI=0;for(let[oI,eI]of i(n).entries())fI{w.setTitle("Undo change").setIcon("undo").setSection("history-actions").setDisabled(!I.plugin.file_history.length).onClick(()=>{pt(I.plugin)})}),p.showAtMouseEvent(PI)}}),z(aI);var gg=v(aI,2),HI=O(gg),hI=O(HI,!0);z(HI);var WI=v(HI,2);{var rg=PI=>{var p=Yx(),w=O(p);z(p),sI(()=>vI(w,`\xB7 ${i(c).length??""} selected`)),D(PI,p)};GI(WI,PI=>{i(c).length&&PI(rg)})}z(gg),sI(()=>vI(hI,i(h))),D(T,M)},$$slots:{container:!0}})},view:r=>{var N=vx();N.__click=[Ex,c,d],N.__keydown=[Wx,I,c,n,d];var T=O(N);lU(T,{get items(){return i(n)},item:(q,AI=mg,aI=mg)=>{vc(q,{get plugin(){return I.plugin},get selected_ranges(){return i(c)},get row(){return AI()},get index(){return aI()},onClick:R,onDblClick:o,get menu_open(){return i(G)},set menu_open(uI){Y(G,uI,!0)}})},$$slots:{item:!0}}),z(N),D(r,N)},$$slots:{header:!0,view:!0}}),xI()}KI(["click","contextmenu","keydown"]);var xs=class extends Tb.PluginSettingTab{plugin;view=null;constructor(I,g){super(I,g),this.plugin=g}display(){let{containerEl:I}=this;I.empty(),this.view=yB(GU,{target:this.containerEl,props:{plugin:this.plugin}})}hide(){super.hide(),this.view&&$B(this.view)}};var wb=require("obsidian");var FA="commentator-annotations-view",us=class extends wb.ItemView{constructor(I,g){super(I),this.plugin=g,this.props.plugin=g}view=null;#I=lI(rI({plugin:void 0,range_type_filter:void 0,location_filter:void 0,content_filter:void 0,author_filter:void 0,date_filter:void 0}));get props(){return i(this.#I)}set props(I){Y(this.#I,I,!0)}async onOpen(){this.containerEl.empty(),this.containerEl.classList.add("cmtr-view")}async onClose(){this.view&&await $B(this.view),this.containerEl.detach()}getViewType(){return FA}getDisplayText(){return"Vault suggestions and comments"}getIcon(){return"message-square"}getState(){let{plugin:I,...g}=this.props;return{...super.getState(),...g}}async setState(I,g){this.props.range_type_filter=I.range_type_filter||0,this.props.location_filter=I.location_filter||0,this.props.content_filter=I.content_filter||0,this.props.author_filter=I.author_filter||0,this.props.date_filter=I.date_filter||void 0,this.view||(this.props.plugin=this.plugin,this.view=yB(uU,{target:this.containerEl,props:{...this.props,sync_props:B=>{for(let[F,Q]of Object.entries(B))this.props[F]=Q}}})),await super.setState(I,g)}};var tk=require("@codemirror/state"),IG=require("obsidian");function LU(C,I,g){let B=C.findIndex(F=>F?.compartment===I);C[B]=C[B].compartment.of(g)}function fb(C,I,g,B,F){gG(C,Q=>{Q.dispatch({effects:[g.reconfigure(B.of(F))]})}),LU(I,g,B.of(F))}function gG(C,I){C.workspace.iterateAllLeaves(g=>{g.view instanceof IG.MarkdownView&&g.view.currentMode.type==="source"&&I(g.view.editor.cm)})}function RU(C,I){for(let g of C.workspace.getLeavesOfType("markdown"))g.view instanceof IG.MarkdownView&&g.view.currentMode.type==="source"&&g.view.editor.cm.dispatch({annotations:[I]})}function zb(C,I){let g={};for(let B in C)C[B]!==I[B]&&(g[B]=C[B]);return g}var Ls=class extends xB.Plugin{editorExtensions=[];settings=SQ;previous_settings={};changed_settings={};previewModeHeaderButton;editModeHeaderModeButton;previewModeStatusBarButton;editModeStatusBarButton;metadataStatusBarButton;defaultEditModeExtension=[];settings_tab="general";database=new EA(this,"commentator/cache","Commentator cache",YG,"Vault-wide cache for Commentator plugin",()=>[],async(I,g)=>g?g.field(JI).ranges.ranges:uA(await this.app.vault.cachedRead(I)),this.settings.database_workers,I=>I.map(g=>Object.setPrototypeOf(g,LA[g.type].prototype)),()=>this.settings);file_history=[];postProcessor;annotation_gutter_config=void 0;loadEditorExtensions(){if(this.editorExtensions.length=0,this.editorExtensions.push(XA),this.editorExtensions.push(QA.Prec.highest(st)),this.editorExtensions.push(rt(this.settings)),this.editorExtensions.push(QA.Prec.highest(nt)),this.editorExtensions.push(LQ.of(ZF(this.settings.default_edit_mode,this.settings))),this.editorExtensions.push(JI),this.settings.annotation_gutter){let I=_G(this);this.annotation_gutter_config=I[1][1].value,this.editorExtensions.push(bl.of(QA.Prec.low(I)))}this.settings.live_preview&&this.editorExtensions.push(QA.Prec.low(Gt(this.settings))),this.settings.diff_gutter&&this.editorExtensions.push(QA.Prec.low(Rl.of(Vi))),this.settings.tag_completion&&this.editorExtensions.push(Et),this.settings.tag_correcter&&this.editorExtensions.push(Nt),this.editorExtensions.push(Mb.EditorView.domEventHandlers({copy:SG.bind(null,this.settings)})),this.editorExtensions.push(Js.of(HF.of(this.settings.diff_gutter_hide_empty))),this.editorExtensions.push(xQ.of(Mg.of(this.settings.default_preview_mode))),this.editorExtensions.push(uQ.of(nC.of(this.settings.default_edit_mode))),this.editorExtensions.push(VQ.of(QB.of(this.settings.annotation_gutter_included_types))),this.register(DG((I,g)=>{this.settings.annotation_gutter&&I.editMode.annotationGutterWidth===void 0&&(I.editMode.annotationGutterWidth=g.annotationGutterWidth??this.settings.annotation_gutter_width,I.editMode.annotationGutterFolded=g.annotationGutterFolded??this.settings.annotation_gutter_default_fold_state)},(I,g)=>{if(this.settings.annotation_gutter){let B=I.editMode.cm.plugin(dl)?.gutters[0];B&&(I.editMode.annotationGutterWidth=B.width,I.editMode.annotationGutterFolded=B.folded),g.annotationGutterFolded=I.editMode.annotationGutterFolded,g.annotationGutterWidth=I.editMode.annotationGutterWidth}},I=>{this.annotation_gutter_config!==void 0&&(this.annotation_gutter_config.width=I.editMode.annotationGutterWidth,this.annotation_gutter_config.foldState=I.editMode.annotationGutterFolded)}))}async updateEditorExtension(){Object.keys(this.changed_settings).some(I=>JG.has(I))?(this.loadEditorExtensions(),this.app.workspace.updateOptions(),this.settings.post_processor&&wt(this.app)):Object.keys(this.changed_settings).some(I=>vG.has(I))&&gG(this.app,I=>{I.dispatch(I.state.update({effects:RQ.of(!0)}))})}async onload(){sg.app=this.app,this.registerView(FA,I=>new us(I,this)),await this.migrateSettings(await this.loadData()),this.defaultEditModeExtension=ZF(this.settings.default_edit_mode,this.settings),this.addSettingTab(new xs(this.app,this)),this.loadEditorExtensions(),this.registerEditorExtension(this.editorExtensions),this.app.workspace.onLayoutReady(()=>{this.previewModeHeaderButton=Ni(this,this.settings.toolbar_preview_button),this.editModeHeaderModeButton=ri(this,this.settings.toolbar_edit_button)}),this.previewModeStatusBarButton=Si(this,this.settings.status_bar_preview_button),this.editModeStatusBarButton=Wi(this,this.settings.status_bar_edit_button),this.metadataStatusBarButton=Ei(this,this.settings.status_bar_metadata_button),this.settings.post_processor&&(this.postProcessor=this.registerMarkdownPostProcessor(async(I,g)=>yl(I,g,this.settings),-99999),Sl(this.app)),this.registerEvent(Li(this.app)),this.registerEvent(Ri(this.app));for(let I of ui(this))this.addCommand(I);this.register(TG(this,"commentator",()=>this.database.dropDatabase()))}async migrateSettings(I){let g=this.settings;if(this.settings=Object.assign({},SQ,I),this.previous_settings=Object.assign({},g,this.settings),sg.PLUGIN_SETTINGS=this.settings,I===null)await this.setSettings();else{let B=I?.version;try{if(B!==SQ.version){if(B||this.app.workspace.onLayoutReady(async()=>{new xB.Notice("Commentator: rebuilding database for new version",5e3),new xB.Notice("Commentator: metadata and replies features are now available, you can opt-in to these features in the settings",0)}),B.localeCompare("0.2.3",void 0,{numeric:!0})<0&&I.suggestion_gutter_hide_empty){let F=[["suggestion_gutter","diff_gutter"],["suggestion_gutter_hide_empty","diff_gutter_hide_empty"],["comment_gutter_default_fold_state","annotation_gutter_default_fold_state"],["comment_gutter_fold_button","annotation_gutter_fold_button"],["comment_gutter_resize_handle","annotation_gutter_resize_handle"],["comment_gutter_width","annotation_gutter_width"],["comment_gutter_hide_empty","annotation_gutter_hide_empty"]];for(let[Q,A]of F)Q in this.settings&&(this.settings[A]=this.settings[Q],delete this.settings[Q]);this.settings.comment_style==="block"&&(this.settings.comment_style="icon",this.settings.annotation_gutter=!0)}this.settings.version=SQ.version,await this.setSettings()}}catch{new xB.Notice("Commentator: Migration to new settings failed, using the default settings provided by the plugin",0)}}}async onExternalSettingsChange(){await this.migrateSettings(await this.loadData())}async onunload(){this.previewModeHeaderButton.detachButtons(),this.editModeHeaderModeButton.detachButtons(),xB.MarkdownPreviewRenderer.unregisterPostProcessor(this.postProcessor),this.database.unload()}async loadSettings(){this.settings=Object.assign({},SQ,await this.loadData())}async setSettings(){sg.PLUGIN_SETTINGS=this.settings,await this.saveData(this.settings),this.changed_settings=zb(this.settings,this.previous_settings),this.previous_settings=Object.assign({},this.settings)}async saveSettings(){await this.setSettings(),this.previewModeHeaderButton.setLabelRendering(this.changed_settings.toolbar_show_buttons_labels),this.editModeHeaderModeButton.setLabelRendering(this.changed_settings.toolbar_show_buttons_labels),this.previewModeHeaderButton.setRendering(this.changed_settings.toolbar_preview_button),this.editModeHeaderModeButton.setRendering(this.changed_settings.toolbar_edit_button),this.previewModeStatusBarButton.setRendering(this.changed_settings.status_bar_preview_button),this.editModeStatusBarButton.setRendering(this.changed_settings.status_bar_edit_button),this.metadataStatusBarButton.setRendering(this.changed_settings.status_bar_metadata_button),this.changed_settings.post_processor!==void 0&&(this.changed_settings.post_processor?this.postProcessor=this.registerMarkdownPostProcessor((I,g)=>yl(I,g,this.settings),-99999):xB.MarkdownPreviewRenderer.unregisterPostProcessor(this.postProcessor),Sl(this.app)),this.changed_settings.annotation_gutter_width!==void 0&&RU(this.app,tl.of(this.settings.annotation_gutter_width)),this.changed_settings.annotation_gutter_hide_empty!==void 0&&RU(this.app,cl.of(this.settings.annotation_gutter_hide_empty)),this.changed_settings.diff_gutter_hide_empty!==void 0&&fb(this.app,this.editorExtensions,Js,HF,this.settings.diff_gutter_hide_empty),this.changed_settings.annotation_gutter_fold_button!==void 0&&RU(this.app,Gl.of(this.settings.annotation_gutter_fold_button)),this.changed_settings.annotation_gutter_resize_handle!==void 0&&RU(this.app,il.of(this.settings.annotation_gutter_resize_handle)),this.changed_settings.default_preview_mode!==void 0&&LU(this.editorExtensions,xQ,Mg.of(this.settings.default_preview_mode)),this.changed_settings.default_edit_mode!==void 0&&(LU(this.editorExtensions,LQ,ZF(this.settings.default_edit_mode,this.settings)),LU(this.editorExtensions,uQ,nC.of(this.settings.default_edit_mode))),await this.updateEditorExtension(),Object.keys(this.changed_settings).some(I=>kG.has(I))&&await this.database.reinitializeDatabase()}async setSetting(I,g){this.settings[I]=g,await this.saveSettings()}async activateView(){this.app.workspace.detachLeavesOfType(FA),await this.app.workspace.getRightLeaf(!1).setViewState({type:FA,active:!0}),await this.app.workspace.revealLeaf(this.app.workspace.getLeavesOfType(FA)[0])}setEditMode(I,g){I&&I.editor&&(I.editor.cm.dispatch(I.editor.cm.state.update({effects:[LQ.reconfigure(ZF(g,this.settings)),uQ.reconfigure(nC.of(g))]})),this.editModeStatusBarButton.updateButton(g),this.editModeHeaderModeButton.updateButton(I,g))}setPreviewMode(I,g){I&&I instanceof xB.MarkdownView&&(I.editor&&I.editor.cm.dispatch(I.editor.cm.state.update({effects:[xQ.reconfigure(Mg.of(g))]})),I.previewMode&&I.previewMode.rerender(!0),this.previewModeStatusBarButton.updateButton(g),this.previewModeHeaderButton.updateButton(I,g))}}; /*! Bundled license information: localforage/dist/localforage.js: diff --git a/.obsidian/plugins/commentator/manifest.json b/.obsidian/plugins/commentator/manifest.json index 5cd4042..f9dded3 100644 --- a/.obsidian/plugins/commentator/manifest.json +++ b/.obsidian/plugins/commentator/manifest.json @@ -1 +1 @@ -{"id":"commentator","name":"Commentator","version":"0.2.3","minAppVersion":"1.5.0","description":"Add review comments to your notes using CriticMarkup syntax","author":"kometenstaub and Fevol","authorUrl":"https://github.com/fevol","isDesktopOnly":false} \ No newline at end of file +{"id":"commentator","name":"Commentator","version":"0.2.4","minAppVersion":"1.5.0","description":"Add review comments to your notes using CriticMarkup syntax","author":"kometenstaub and Fevol","authorUrl":"https://github.com/fevol","isDesktopOnly":false} \ No newline at end of file diff --git a/.obsidian/plugins/commentator/styles.css b/.obsidian/plugins/commentator/styles.css index 0caa61b..00d4600 100644 --- a/.obsidian/plugins/commentator/styles.css +++ b/.obsidian/plugins/commentator/styles.css @@ -1 +1 @@ -@charset "UTF-8";.svelcomlib-spinner{width:var(--size-4-4);height:var(--size-4-4);border:3px solid;border-color:initial;border-bottom-color:transparent;border-radius:50%;display:inline-block;box-sizing:border-box;animation:svelcomlib-spinner-animation 1.5s linear infinite}@keyframes svelcomlib-spinner-animation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.svelcomlib-skeleton-placeholder{background-color:var(--color-base-30)}.svelcomlib-skeleton-placeholder:after{content:"";display:block;width:100%;height:100%;animation:svelcomlib-skeleton-animation 1.5s ease-in-out infinite;background:linear-gradient(90deg,rgba(255,255,255,0),var(--color-base-25),rgba(255,255,255,0));background-size:200px 100%;background-repeat:no-repeat;border-radius:4px}.svelcomlib-icon-text{display:flex;align-items:center;gap:4px}.svelcomlib-icon-text>*{display:flex}.svelcomlib-toggle{justify-content:space-between}.svelcomlib-extra>*{color:var(--text-on-accent)}button.svelcomlib-extra{background-color:var(--text-accent);color:var(--text-on-accent)}.svelcomlib-input-extra{color:var(--color-green);border-color:var(--color-green);border-width:3px}.svelcomlib-success>*{color:var(--text-on-accent)}button.svelcomlib-success{background-color:var(--color-green);color:var(--text-on-accent)}.svelcomlib-input-success{color:var(--color-green);border-color:var(--color-green);border-width:3px}.svelcomlib-fail>*{color:var(--text-on-accent)}button.svelcomlib-fail{background-color:var(--background-modifier-error);color:var(--text-on-accent)}.svelcomlib-input-fail{color:var(--text-error);border-color:var(--background-modifier-error);border-width:3px}.svelcomlib-input-icon{display:flex;position:absolute;background-color:var(--background-modifier-error)}.svelcomlib-virtual-list-viewport{position:relative;overflow-y:scroll;-webkit-overflow-scrolling:touch;display:block}.svelcomlib-virtual-list-contents,.svelcomlib-virtual-list-row{display:block}.svelcomlib-virtual-list-row{overflow:hidden}.svelcomlib-notice>code{background-color:var(--code-background);color:var(--code-normal)}.svelcomlib-notice-info{color:var(--text-accent)}.svelcomlib-notice-info:before{content:"\24d8 "}.svelcomlib-notice-warning{color:var(--text-error)}.svelcomlib-notice-warning:before{content:"\26a0 "}.svelcomlib-notice-error{color:var(--text-error);font-weight:700}.svelcomlib-notice-error:before{content:"\26d4 "}.svelcomlib-subsetting{margin-left:var(--size-4-8);border-color:var(--background-modifier-active-hover)}.svelcomlib-subsubsetting{margin-left:var(--size-4-16);border-color:var(--background-modifier-active-hover)}.svelcomlib-setting-subheading.svelcomlib-setting-subheading{font-size:var(--h3-font);margin-top:0;padding:.5em}.svelcomlib-setting-subsubheading.svelcomlib-setting-subsubheading{font-size:var(--h4-font);margin-top:0;padding:.25em;text-transform:uppercase}.cmtr-view-container{padding:0 0 0 var(--size-4-4);height:95%}.cmtr-view-range{border:1px solid var(--background-modifier-border);border-radius:var(--radius-l);background:var(--background-primary);margin:2px 8px 8px 2px;max-height:400px;overflow-y:scroll;word-wrap:break-word}.cmtr-view-range-top{display:flex;align-items:center;gap:var(--size-4-2);padding:var(--size-4-2);position:sticky;z-index:1;top:0;background-color:inherit}.cmtr-view-range-text{padding:0 var(--size-4-1);padding-left:30px}.cmtr-view-range-completed{background:var(--background-primary-alt);color:var(--text-muted);border-style:dashed}.cmtr-view-range-author,.cmtr-view-range-time{font-size:var(--font-smallest);color:var(--text-faint)}.cmtr-view-range:hover{box-shadow:unset;outline:2px dashed var(--interactive-accent-hover)}.cmtr-view-range-selected{box-shadow:0 0 0 2px var(--interactive-accent)}.cmtr-view-range-title{font-variant:all-small-caps;font-weight:var(--bold-weight)}.cmtr-view-range-empty{color:var(--text-faint)}.cmtr-view-range-reply{border-top:1px dashed var(--background-modifier-border)}.cmtr-view-range-reply-top{padding:0 var(--size-4-1)}.cmtr-view-range-reply-text{padding:0 var(--size-4-1);padding-left:30px}.cmtr-view-range-reply-author,.cmtr-view-range-reply-time{font-size:var(--font-smallest);color:var(--text-faint)}.cmtr-view-suggestion-buttons{position:fixed;right:0;transform:translateY(calc(-1 * (var(--scroll-offset) + 12px))) translate(-16px);z-index:2;display:flex;align-items:center;border:1px solid var(--background-modifier-border-hover);background-color:var(--background-secondary);border-radius:var(--radius-s)}.cmtr-view-suggestion-buttons>button{background:unset;box-shadow:unset;border-radius:unset;height:unset;padding:var(--size-4-1)}.cmtr-view-suggestion-buttons>button:hover{background-color:var(--background-secondary-alt)}.cmtr-view-info{color:var(--text-muted);font-size:var(--font-smallest)}.cmtr-settings-navigation-bar{display:flex;flex-direction:row;overflow-x:auto;overflow-y:hidden;flex-wrap:wrap;gap:12px;margin-bottom:var(--size-4-8);background-color:var(--background-primary-alt);padding:var(--size-4-3);border-radius:var(--radius-l)}.cmtr-settings-navigation-item{cursor:pointer;border-radius:100px;font-weight:700;display:flex;flex-direction:row;white-space:nowrap;padding:6px;align-items:center;gap:4px;outline:0 solid transparent;overflow:hidden;background-color:var(--background-primary);border:1px solid var(--background-modifier-border-hover);transition:color .25s ease-in-out,padding .25s ease-in-out,background-color .35s cubic-bezier(.45,.25,.83,.67),max-width .35s cubic-bezier(.57,.04,.58,1),outline .15s ease-in-out;max-width:32px;height:fit-content}.cmtr-settings-selected-element{color:var(--color-accent);transition:color .5s ease-in-out}.cmtr-settings-navigation-item:hover{background-color:var(--background-primary);outline:3px solid var(--text-accent)}.cmtr-settings-navigation-selected-item{outline:unset!important;background-color:var(--text-accent);color:var(--text-on-accent);padding:6px 9px;max-width:200px;transition:color .25s ease-in-out,padding .25s ease-in-out,background-color .35s cubic-bezier(.45,.25,.83,.67),max-width .45s cubic-bezier(.57,.04,.58,1) .2s}.cmtr-settings-navigation-selected-item:hover{background-color:var(--text-accent-hover)}.cmtr-settings-navigation-item-text{height:18px}.cmtr-settings-navigation-selected-item-text{color:transparent;overflow:clip;flex:0;transition:flex .4s ease-in}.cmtr-settings-navigation-selected-item .cmtr-settings-navigation-item-text{flex:1}.cmtr-important-buttons{position:absolute;display:flex;right:var(--size-4-6);bottom:var(--size-4-2);gap:var(--size-4-2)}.cmtr-rejected{display:none}.cmtr-addition{color:var(--addition-color)}.cmtr-addition .cmtr-focused{text-decoration:underline 3px solid var(--addition-color)}.cmtr-has-reply .cmtr-addition,.cmtr-has-reply.cmtr-addition{color:var(--text-on-accent)!important;background-color:var(--addition-color);box-shadow:0 0 0 2px var(--addition-color);transition:background-color .2s ease-in-out 0ms,box-shadow .2s ease-in-out 0ms}.cmtr-has-reply .cmtr-addition .cmtr-focused,.cmtr-has-reply.cmtr-addition .cmtr-focused{text-decoration:unset;background-color:var(--addition-color-alt)}.cmtr-has-reply .cmtr-addition:hover,.cmtr-has-reply.cmtr-addition:hover{box-shadow:0 0 0 2px var(--addition-color-alt);background-color:var(--addition-color-alt)}.cmtr-deletion{text-decoration:var(--deletion-color) 2px line-through}.cmtr-deletion:has(.cmtr-focused){text-decoration:var(--deletion-color) 2px line-through dashed}.cmtr-has-reply .cmtr-deletion,.cmtr-has-reply.cmtr-deletion{color:var(--text-on-accent);background-color:var(--deletion-color);box-shadow:0 0 0 2px var(--deletion-color);transition:background-color .2s ease-in-out 0ms;text-decoration:unset}.cmtr-has-reply .cmtr-deletion .cmtr-focused,.cmtr-has-reply.cmtr-deletion .cmtr-focused{background-color:var(--deletion-color-alt)}.cmtr-has-reply .cmtr-deletion:hover,.cmtr-has-reply.cmtr-deletion:hover{box-shadow:0 0 0 2px var(--deletion-color-alt);background-color:var(--deletion-color-alt)}.cmtr-has-reply .cmtr-substitution,.cmtr-has-reply.cmtr-substitution{color:var(--text-on-accent);background-color:var(--substitution-color);box-shadow:0 0 0 2px var(--substitution-color);transition:background-color .2s ease-in-out 0ms}.cmtr-has-reply .cmtr-substitution .cmtr-focused,.cmtr-has-reply.cmtr-substitution .cmtr-focused{background-color:var(--substitution-color-alt)}.cmtr-has-reply .cmtr-substitution:hover,.cmtr-has-reply.cmtr-substitution:hover{box-shadow:0 0 0 2px var(--substitution-color-alt);background-color:var(--substitution-color-alt)}.cmtr-highlight{background-color:var(--highlight-color)}.cmtr-highlight .cmtr-focused{background-color:var(--highlight-color-alt)}.cmtr-comment{background-color:var(--comment-color);border-bottom:2px solid var(--comment-border-color)}.cmtr-comment-icon{padding:0 0 var(--size-4-2) 0}.cmtr-comment-icon:hover{cursor:pointer}.cmtr-comment-icon svg{color:var(--comment-border-color);stroke-width:4px;transition:stroke-width .15s ease-in-out}.cmtr-comment-icon:hover svg{stroke-width:5px}.cmtr-comment-tooltip{max-height:var(--popover-height);max-width:var(--popover-width);overflow-y:scroll;position:absolute;z-index:10000;border:4px solid var(--comment-border-color);filter:drop-shadow(4px 4px 0px var(--comment-inverse-color));background-color:var(--background-primary-alt);padding:var(--size-4-2);border-radius:var(--radius-l)}.cmtr-comment-tooltip *{margin-block-start:.25em;margin-block-end:.25em}.cmtr-suggestion-status{font-size:var(--font-smallest);color:var(--text-faint);margin-right:var(--size-2-1)}.cmtr-submenu-nested{padding-left:var(--size-4-6)}.cmtr-folded-element .cmtr-anno-gutter-annotation{width:0;overflow-y:hidden}span.cm-strikethrough:has([data-type=cmtr-substitution]){text-decoration:unset}span.cm-highlight:has([data-type=cmtr-highlight]){background-color:unset}.cmtr-addition .list-bullet:after{background-color:var(--addition-color)}.cmtr-addition img{border:4px solid var(--addition-color);border-radius:12px}.cmtr-addition hr{border-color:var(--addition-color)}.cmtr-addition .callout{border:4px dashed var(--addition-color)}.cmtr-addition:has(.markdown-embed){border:4px dotted var(--addition-color)}.cmtr-addition:has(.markdown-embed) .markdown-embed{border-left:unset}.cmtr-deletion img{border:4px solid var(--deletion-color)!important;border-radius:12px}.cmtr-daterange-picker-modal{width:auto}.cmtr-daterange-picker{margin-top:var(--size-4-2);display:flex;--sdt-bg-main: var(--background-primary);--sdt-shadow-color: var(--background-modifier-box-shadow);--sdt-color: var(--text-normal);--sdt-clock-color: var(--sdt-color);--sdt-clock-color-hover: var(--sdt-color);--sdt-clock-time-bg: transparent;--sdt-clock-time-bg-hover: var(--background-modifier-hover);--sdt-clock-disabled: var(--background-modifier-disabled);--sdt-clock-disabled-bg: var(--sdt-bg-main);--sdt-header-color: var(--text-muted);--sdt-bg-selected: var(--color-accent);--sdt-clock-selected-bg: var(--sdt-bg-selected);--sdt-table-disabled-date: var(--background-modifier-disabled);--sdt-table-disabled-date-bg: var(--sdt-bg-main);--sdt-table-data-bg-hover: var(--background-modifier-hover);--sdt-table-selected-bg: var(--sdt-bg-selected);--sdt-header-btn-bg-hover: var(--background-modifier-hover);--sdt-color-selected: var(--text-on-accent);--sdt-table-today-indicator: var(--text-faint);--sdt-clock-bg: var(--background-primary-alt);--sdt-today-bg: var(--color-accent);--sdt-today-color: var(--text-on-accent);--sdt-clear-color: var(--background-modifier-error);--sdt-clear-bg: var(--sdt-bg-main);--sdt-clear-hover-color: var(--text-on-accent);--sdt-clear-hover-bg: var(--background-modifier-error)}.cmtr-daterange-picker.cmtr-daterange-picker.cmtr-daterange-picker .sdt-widget+.sdt-widget:before{background-color:var(--background-modifier-border)}.cmtr-daterange-picker button,.cmtr-daterange-picker div.sdt-calendar-wrap.sdt-calendar-wrap.sdt-calendar-wrap{box-shadow:unset}.cmtr-daterange-picker table tr:last-child td{padding-bottom:var(--size-4-1)!important}.cm-gutters.cm-gutters.cm-gutters.cm-gutters:has(.is-minimal.cmtr-anno-gutter){position:sticky!important}.cm-gutters.cm-gutters:has(>.cmtr-anno-gutter){padding-inline-end:0;margin-inline-end:0;margin-inline-start:24px}.cmtr-anno-gutter{width:100%;transition:width .4s ease-in-out}.cmtr-anno-gutter-moving .cmtr-anno-gutter{transition:width 50ms ease-out}.cmtr-anno-gutter-moving.cmtr-anno-gutter-button{transition:right 50ms ease-out}.cmtr-anno-gutter-thread{width:100%;border:2px solid var(--background-modifier-border);border-radius:var(--radius-l);background-color:var(--background-primary-alt);color:var(--text-muted);transition:border-color .1s ease-in-out 0ms,background-color .1s ease-in-out 0ms}.cmtr-anno-gutter-thread-highlight{border-color:var(--interactive-accent)}.cmtr-anno-gutter-annotation{width:100%;max-height:150px;background-color:inherit;padding:var(--size-2-2);position:relative;overflow-y:scroll;word-wrap:break-word}.cmtr-anno-gutter-annotation:first-child{border-top-left-radius:var(--radius-l);border-top-right-radius:var(--radius-l)}.cmtr-anno-gutter-annotation:last-child{border-bottom-left-radius:var(--radius-l);border-bottom-right-radius:var(--radius-l)}.cmtr-anno-gutter-annotation:not(:last-child){border-bottom:1px dashed var(--background-modifier-border)}.cmtr-anno-gutter .cm-gutterElement{transition:margin .2s ease-in-out}.cmtr-anno-gutter-annotation-desc{font-weight:var(--font-bold)}.cmtr-anno-gutter-annotation-view>*{margin-block-start:.25em;margin-block-end:.25em}.cmtr-anno-gutter-annotation:hover{box-shadow:0 0 0 2px var(--interactive-accent);background-color:var(--background-secondary);z-index:20}.cmtr-anno-gutter-annotation:focus,.cmtr-anno-gutter-annotation-editing.cmtr-anno-gutter-annotation-editing{box-shadow:0 0 0 2px var(--comment-border-color);background-color:var(--background-secondary);z-index:25}.cmtr-anno-gutter-annotation-metadata{font-size:var(--font-smallest);color:var(--text-faint);position:sticky;top:-4px;background-color:inherit;z-index:10;padding:2px 0}.cmtr-anno-gutter-annotation-editor.cm-editor{min-height:auto}.cmtr-anno-gutter-resize-handle{position:absolute;background:transparent;transition:background-color .2s ease-in-out,border-color .2s ease-in-out,opacity .2s ease-in-out;border:unset;margin:0;height:100%;transform:translate(-10px,-40px);border-inline-end-color:var(--divider-color);border-inline-end-width:var(--divider-width);border-inline-end-style:dashed;width:var(--divider-width-hover);cursor:col-resize}.cmtr-anno-gutter-resize-handle:hover,.cmtr-anno-gutter-resize-handle-hover{background:var(--divider-color-hover);border-color:var(--divider-color-hover)}.cmtr-anno-gutter-button{position:absolute;top:calc(var(--file-margins) + 20px);z-index:1000;color:var(--text-faint);transition:color .2s ease-in-out 0ms,right .4s ease-in-out,rotate .2s ease-in-out}.cmtr-anno-gutter-button:hover{color:var(--text-normal)}.cm-gutters:has(>.cmtr-gutter-show-empty){min-width:18px}.cmtr-diff-gutter-addition{background-color:var(--addition-color);width:6px;height:100%}.cmtr-diff-gutter-deletion{background-color:var(--deletion-color);width:6px;height:100%}.cmtr-diff-gutter-addition.cmtr-diff-gutter-deletion{background:repeating-linear-gradient(45deg,var(--addition-color),var(--addition-color) 10px,var(--deletion-color) 10px,var(--deletion-color) 18px)}.cmtr-diff-gutter-substitution{background:repeating-linear-gradient(45deg,var(--addition-color),var(--addition-color) 10px,var(--deletion-color) 10px,var(--deletion-color) 18px);width:6px;height:100%}.cmtr-diff-gutter-top{border-top:1px solid var(--background-primary);border-top-left-radius:8px;border-top-right-radius:8px}.cmtr-diff-gutter-bottom{border-bottom:1px solid var(--background-primary);border-bottom-left-radius:8px;border-bottom-right-radius:8px}.cm-gutters.cm-gutters.cm-gutters.cm-gutters:has(.is-minimal.cmtr-diff-gutter){position:sticky!important;left:20px}.theme-light{--addition-color: var(--color-green);--addition-color-alt: color-mix( in srgb-linear, var(--addition-color), black 15% );--deletion-color: var(--color-red);--deletion-color-alt: color-mix( in srgb-linear, var(--deletion-color), black 15% );--substitution-color: var(--color-orange);--substitution-color-alt: color-mix( in srgb-linear, var(--substitution-color), black 15% );--highlight-color: var(--text-highlight-bg);--highlight-color-alt: color-mix( in srgb-linear, var(--text-highlight-bg), black 15% );--comment-color: #bacff4;--comment-border-color: #679af4;--comment-inverse-color: #445f8f}.theme-dark{--addition-color: var(--color-green);--addition-color-alt: color-mix( in srgb-linear, var(--addition-color), white 10% );--deletion-color: var(--color-red);--deletion-color-alt: color-mix( in srgb-linear, var(--deletion-color), white 10% );--substitution-color: var(--color-orange);--substitution-color-alt: color-mix( in srgb-linear, var(--substitution-color), white 10% );--highlight-color: var(--text-highlight-bg);--highlight-color-alt: color-mix( in srgb-linear, var(--text-highlight-bg), white 10% );--comment-color: #445f8f;--comment-border-color: #679af4;--comment-inverse-color: #bacff4}.cmtr-fail>button{background-color:var(--color-red);color:var(--text-on-accent)}.cm-gutters.gutter-hidden{display:none}.cmtr-debug-comment-line{width:100%;border-bottom:1px dashed red} +@charset "UTF-8";.svelcomlib-spinner{width:var(--size-4-4);height:var(--size-4-4);border:3px solid;border-color:initial;border-bottom-color:transparent;border-radius:50%;display:inline-block;box-sizing:border-box;animation:svelcomlib-spinner-animation 1.5s linear infinite}@keyframes svelcomlib-spinner-animation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.svelcomlib-skeleton-placeholder{background-color:var(--color-base-30)}.svelcomlib-skeleton-placeholder:after{content:"";display:block;width:100%;height:100%;animation:svelcomlib-skeleton-animation 1.5s ease-in-out infinite;background:linear-gradient(90deg,rgba(255,255,255,0),var(--color-base-25),rgba(255,255,255,0));background-size:200px 100%;background-repeat:no-repeat;border-radius:4px}.svelcomlib-icon-text{display:flex;align-items:center;gap:4px}.svelcomlib-icon-text>*{display:flex}.svelcomlib-toggle{justify-content:space-between}.svelcomlib-extra>*{color:var(--text-on-accent)}button.svelcomlib-extra{background-color:var(--text-accent);color:var(--text-on-accent)}.svelcomlib-input-extra{color:var(--color-green);border-color:var(--color-green);border-width:3px}.svelcomlib-success>*{color:var(--text-on-accent)}button.svelcomlib-success{background-color:var(--color-green);color:var(--text-on-accent)}.svelcomlib-input-success{color:var(--color-green);border-color:var(--color-green);border-width:3px}.svelcomlib-fail>*{color:var(--text-on-accent)}button.svelcomlib-fail{background-color:var(--background-modifier-error);color:var(--text-on-accent)}.svelcomlib-input-fail{color:var(--text-error);border-color:var(--background-modifier-error);border-width:3px}.svelcomlib-input-icon{display:flex;position:absolute;background-color:var(--background-modifier-error)}.svelcomlib-virtual-list-viewport{position:relative;overflow-y:scroll;-webkit-overflow-scrolling:touch;display:block}.svelcomlib-virtual-list-contents,.svelcomlib-virtual-list-row{display:block}.svelcomlib-virtual-list-row{overflow:hidden}.svelcomlib-notice>code{background-color:var(--code-background);color:var(--code-normal)}.svelcomlib-notice-info{color:var(--text-accent)}.svelcomlib-notice-info:before{content:"\24d8 "}.svelcomlib-notice-warning{color:var(--text-error)}.svelcomlib-notice-warning:before{content:"\26a0 "}.svelcomlib-notice-error{color:var(--text-error);font-weight:700}.svelcomlib-notice-error:before{content:"\26d4 "}.svelcomlib-subsetting{margin-left:var(--size-4-8);border-color:var(--background-modifier-active-hover)}.svelcomlib-subsubsetting{margin-left:var(--size-4-16);border-color:var(--background-modifier-active-hover)}.svelcomlib-setting-subheading.svelcomlib-setting-subheading{font-size:var(--h3-font);margin-top:0;padding:.5em}.svelcomlib-setting-subsubheading.svelcomlib-setting-subsubheading{font-size:var(--h4-font);margin-top:0;padding:.25em;text-transform:uppercase}.cmtr-view-container{padding:0 0 0 var(--size-4-4);height:95%}.cmtr-view-range{border:1px solid var(--background-modifier-border);border-radius:var(--radius-l);background:var(--background-primary);margin:2px 8px 8px 2px;max-height:400px;overflow-y:scroll;word-wrap:break-word}.cmtr-view-range-top{display:flex;align-items:center;gap:var(--size-4-2);padding:var(--size-4-2);position:sticky;z-index:1;top:0;background-color:inherit}.cmtr-view-range-text{padding:0 var(--size-4-1);padding-left:30px}.cmtr-view-range-completed{background:var(--background-primary-alt);color:var(--text-muted);border-style:dashed}.cmtr-view-range-author,.cmtr-view-range-time{font-size:var(--font-smallest);color:var(--text-faint)}.cmtr-view-range:hover{box-shadow:unset;outline:2px dashed var(--interactive-accent-hover)}.cmtr-view-range-selected{box-shadow:0 0 0 2px var(--interactive-accent)}.cmtr-view-range-title{font-variant:all-small-caps;font-weight:var(--bold-weight)}.cmtr-view-range-empty{color:var(--text-faint)}.cmtr-view-range-reply{border-top:1px dashed var(--background-modifier-border)}.cmtr-view-range-reply-top{padding:0 var(--size-4-1) 0 30px}.cmtr-view-range-reply-text{padding:0 var(--size-4-1);padding-left:30px;min-height:2em}.cmtr-view-range-reply-author,.cmtr-view-range-reply-time{font-size:var(--font-smallest);color:var(--text-faint)}.cmtr-view-suggestion-buttons{position:fixed;right:0;transform:translateY(calc(-1 * (var(--scroll-offset) + 12px))) translate(-16px);z-index:2;display:flex;align-items:center;border:1px solid var(--background-modifier-border-hover);background-color:var(--background-secondary);border-radius:var(--radius-s)}.cmtr-view-suggestion-buttons>button{background:unset;box-shadow:unset;border-radius:unset;height:unset;padding:var(--size-4-1)}.cmtr-view-suggestion-buttons>button:hover{background-color:var(--background-secondary-alt)}.cmtr-view-info{color:var(--text-muted);font-size:var(--font-smallest)}.cmtr-view-action-container{display:flex;align-items:center}.cmtr-view-action{height:min-content}.cmtr-view-action-sep{height:24px;border-left:1px solid var(--background-modifier-border-hover)}.cmtr-view-suggestion-button-sep{height:26px;border-left:1px solid var(--background-modifier-border-hover);margin:0 var(--size-4-1)}.cmtr-view-search.search-input-container input{padding-inline-end:8px}.cmtr-settings-navigation-bar{display:flex;flex-direction:row;overflow-x:auto;overflow-y:hidden;flex-wrap:wrap;gap:12px;margin-bottom:var(--size-4-8);background-color:var(--background-primary-alt);padding:var(--size-4-3);border-radius:var(--radius-l)}.cmtr-settings-navigation-item{cursor:pointer;border-radius:100px;font-weight:700;display:flex;flex-direction:row;white-space:nowrap;padding:6px;align-items:center;gap:4px;outline:0 solid transparent;overflow:hidden;background-color:var(--background-primary);border:1px solid var(--background-modifier-border-hover);transition:color .25s ease-in-out,padding .25s ease-in-out,background-color .35s cubic-bezier(.45,.25,.83,.67),max-width .35s cubic-bezier(.57,.04,.58,1),outline .15s ease-in-out;max-width:32px;height:fit-content}.cmtr-settings-selected-element{color:var(--color-accent);transition:color .5s ease-in-out}.cmtr-settings-navigation-item:hover{background-color:var(--background-primary);outline:3px solid var(--text-accent)}.cmtr-settings-navigation-selected-item{outline:unset!important;background-color:var(--text-accent);color:var(--text-on-accent);padding:6px 9px;max-width:200px;transition:color .25s ease-in-out,padding .25s ease-in-out,background-color .35s cubic-bezier(.45,.25,.83,.67),max-width .45s cubic-bezier(.57,.04,.58,1) .2s}.cmtr-settings-navigation-selected-item:hover{background-color:var(--text-accent-hover)}.cmtr-settings-navigation-item-text{height:18px}.cmtr-settings-navigation-selected-item-text{color:transparent;overflow:clip;flex:0;transition:flex .4s ease-in}.cmtr-settings-navigation-selected-item .cmtr-settings-navigation-item-text{flex:1}.cmtr-important-buttons{position:absolute;display:flex;right:var(--size-4-6);bottom:var(--size-4-2);gap:var(--size-4-2)}.cmtr-rejected{display:none}.cmtr-addition{color:var(--addition-color)}.cmtr-addition .cmtr-focused{text-decoration:underline 3px solid var(--addition-color)}.cmtr-has-reply .cmtr-addition,.cmtr-has-reply.cmtr-addition{color:var(--text-on-accent)!important;background-color:var(--addition-color);box-shadow:0 0 0 2px var(--addition-color);transition:background-color .2s ease-in-out 0ms,box-shadow .2s ease-in-out 0ms}.cmtr-has-reply .cmtr-addition .cmtr-focused,.cmtr-has-reply.cmtr-addition .cmtr-focused{text-decoration:unset;background-color:var(--addition-color-alt)}.cmtr-has-reply .cmtr-addition:hover,.cmtr-has-reply.cmtr-addition:hover{box-shadow:0 0 0 2px var(--addition-color-alt);background-color:var(--addition-color-alt)}.cmtr-deletion{text-decoration:var(--deletion-color) 2px line-through}.cmtr-deletion:has(.cmtr-focused){text-decoration:var(--deletion-color) 2px line-through dashed}.cmtr-has-reply .cmtr-deletion,.cmtr-has-reply.cmtr-deletion{color:var(--text-on-accent);background-color:var(--deletion-color);box-shadow:0 0 0 2px var(--deletion-color);transition:background-color .2s ease-in-out 0ms;text-decoration:unset}.cmtr-has-reply .cmtr-deletion .cmtr-focused,.cmtr-has-reply.cmtr-deletion .cmtr-focused{background-color:var(--deletion-color-alt)}.cmtr-has-reply .cmtr-deletion:hover,.cmtr-has-reply.cmtr-deletion:hover{box-shadow:0 0 0 2px var(--deletion-color-alt);background-color:var(--deletion-color-alt)}.cmtr-has-reply .cmtr-substitution,.cmtr-has-reply.cmtr-substitution{color:var(--text-on-accent);background-color:var(--substitution-color);box-shadow:0 0 0 2px var(--substitution-color);transition:background-color .2s ease-in-out 0ms}.cmtr-has-reply .cmtr-substitution .cmtr-focused,.cmtr-has-reply.cmtr-substitution .cmtr-focused{background-color:var(--substitution-color-alt)}.cmtr-has-reply .cmtr-substitution:hover,.cmtr-has-reply.cmtr-substitution:hover{box-shadow:0 0 0 2px var(--substitution-color-alt);background-color:var(--substitution-color-alt)}.cmtr-highlight{background-color:var(--highlight-color)}.cmtr-highlight .cmtr-focused{background-color:var(--highlight-color-alt)}.cmtr-comment{background-color:var(--comment-color);border-bottom:2px solid var(--comment-border-color)}.cmtr-comment-icon{padding:0 0 var(--size-4-2) 0}.cmtr-comment-icon:hover{cursor:pointer}.cmtr-comment-icon svg{color:var(--comment-border-color);stroke-width:4px;transition:stroke-width .15s ease-in-out}.cmtr-comment-icon:hover svg{stroke-width:5px}.cmtr-comment-tooltip{max-height:var(--popover-height);max-width:var(--popover-width);overflow-y:scroll;position:absolute;z-index:10000;border:4px solid var(--comment-border-color);filter:drop-shadow(4px 4px 0px var(--comment-inverse-color));background-color:var(--background-primary-alt);padding:var(--size-4-2);border-radius:var(--radius-l)}.cmtr-comment-tooltip *{margin-block-start:.25em;margin-block-end:.25em}.cmtr-suggestion-status{font-size:var(--font-smallest);color:var(--text-faint);margin-right:var(--size-2-1)}.cmtr-submenu-nested{padding-left:var(--size-4-6)}.cmtr-folded-element .cmtr-anno-gutter-annotation{width:0;overflow-y:hidden}span.cm-strikethrough:has([data-type=cmtr-substitution]){text-decoration:unset}span.cm-highlight:has([data-type=cmtr-highlight]){background-color:unset}.cmtr-addition .list-bullet:after{background-color:var(--addition-color)}.cmtr-addition img{border:4px solid var(--addition-color);border-radius:12px}.cmtr-addition hr{border-color:var(--addition-color)}.cmtr-addition .callout{border:4px dashed var(--addition-color)}.cmtr-addition:has(.markdown-embed){border:4px dotted var(--addition-color)}.cmtr-addition:has(.markdown-embed) .markdown-embed{border-left:unset}.cmtr-deletion img{border:4px solid var(--deletion-color)!important;border-radius:12px}.cmtr-daterange-picker-modal{width:auto}.cmtr-daterange-picker{margin-top:var(--size-4-2);display:flex;--sdt-bg-main: var(--background-primary);--sdt-shadow-color: var(--background-modifier-box-shadow);--sdt-color: var(--text-normal);--sdt-clock-color: var(--sdt-color);--sdt-clock-color-hover: var(--sdt-color);--sdt-clock-time-bg: transparent;--sdt-clock-time-bg-hover: var(--background-modifier-hover);--sdt-clock-disabled: var(--background-modifier-disabled);--sdt-clock-disabled-bg: var(--sdt-bg-main);--sdt-header-color: var(--text-muted);--sdt-bg-selected: var(--color-accent);--sdt-clock-selected-bg: var(--sdt-bg-selected);--sdt-table-disabled-date: var(--background-modifier-disabled);--sdt-table-disabled-date-bg: var(--sdt-bg-main);--sdt-table-data-bg-hover: var(--background-modifier-hover);--sdt-table-selected-bg: var(--sdt-bg-selected);--sdt-header-btn-bg-hover: var(--background-modifier-hover);--sdt-color-selected: var(--text-on-accent);--sdt-table-today-indicator: var(--text-faint);--sdt-clock-bg: var(--background-primary-alt);--sdt-today-bg: var(--color-accent);--sdt-today-color: var(--text-on-accent);--sdt-clear-color: var(--background-modifier-error);--sdt-clear-bg: var(--sdt-bg-main);--sdt-clear-hover-color: var(--text-on-accent);--sdt-clear-hover-bg: var(--background-modifier-error)}.cmtr-daterange-picker.cmtr-daterange-picker.cmtr-daterange-picker .sdt-widget+.sdt-widget:before{background-color:var(--background-modifier-border)}.cmtr-daterange-picker button,.cmtr-daterange-picker div.sdt-calendar-wrap.sdt-calendar-wrap.sdt-calendar-wrap{box-shadow:unset}.cmtr-daterange-picker table tr:last-child td{padding-bottom:var(--size-4-1)!important}.cm-gutters.cm-gutters.cm-gutters.cm-gutters:has(.is-minimal.cmtr-anno-gutter){position:sticky!important}.cm-gutters.cm-gutters:has(>.cmtr-anno-gutter){padding-inline-end:0;margin-inline-end:0;margin-inline-start:24px}.cmtr-anno-gutter{width:100%;transition:width .4s ease-in-out}.cmtr-anno-gutter-moving .cmtr-anno-gutter{transition:width 50ms ease-out}.cmtr-anno-gutter-moving.cmtr-anno-gutter-button{transition:right 50ms ease-out}.cmtr-anno-gutter-thread{width:100%;border:2px solid var(--background-modifier-border);border-radius:var(--radius-l);background-color:var(--background-primary-alt);color:var(--text-muted);transition:border-color .1s ease-in-out 0ms,background-color .1s ease-in-out 0ms}.cmtr-anno-gutter-thread-highlight{border-color:var(--interactive-accent)}.cmtr-anno-gutter-annotation{width:100%;max-height:150px;background-color:inherit;padding:var(--size-2-2);position:relative;overflow-y:scroll;word-wrap:break-word}.cmtr-anno-gutter-annotation:first-child{border-top-left-radius:var(--radius-l);border-top-right-radius:var(--radius-l)}.cmtr-anno-gutter-annotation:last-child{border-bottom-left-radius:var(--radius-l);border-bottom-right-radius:var(--radius-l)}.cmtr-anno-gutter-annotation:not(:last-child){border-bottom:1px dashed var(--background-modifier-border)}.cmtr-anno-gutter .cm-gutterElement{transition:margin .2s ease-in-out}.cmtr-anno-gutter-annotation-desc{font-weight:var(--font-bold)}.cmtr-anno-gutter-annotation-view>*{margin-block-start:.25em;margin-block-end:.25em}.cmtr-anno-gutter-annotation:hover{box-shadow:0 0 0 2px var(--interactive-accent);background-color:var(--background-secondary);z-index:20}.cmtr-anno-gutter-annotation:focus,.cmtr-anno-gutter-annotation-editing.cmtr-anno-gutter-annotation-editing{box-shadow:0 0 0 2px var(--comment-border-color);background-color:var(--background-secondary);z-index:25}.cmtr-anno-gutter-annotation-metadata{font-size:var(--font-smallest);color:var(--text-faint);position:sticky;top:-4px;background-color:inherit;z-index:10;padding:2px 0}.cmtr-anno-gutter-annotation-editor.cm-editor{min-height:auto}.cmtr-anno-gutter-resize-handle{position:absolute;background:transparent;transition:background-color .2s ease-in-out,border-color .2s ease-in-out,opacity .2s ease-in-out;border:unset;margin:0;height:100%;transform:translate(-10px,-40px);border-inline-end-color:var(--divider-color);border-inline-end-width:var(--divider-width);border-inline-end-style:dashed;width:var(--divider-width-hover);cursor:col-resize}.cmtr-anno-gutter-resize-handle:hover,.cmtr-anno-gutter-resize-handle-hover{background:var(--divider-color-hover);border-color:var(--divider-color-hover)}.cmtr-anno-gutter-button{position:absolute;top:calc(var(--file-margins) + 20px);z-index:1000;color:var(--text-faint);transition:color .2s ease-in-out 0ms,right .4s ease-in-out,rotate .2s ease-in-out}.cmtr-anno-gutter-button:hover{color:var(--text-normal)}.cm-gutters.cm-gutters:has(+.cm-gutters){margin-right:var(--size-4-2)}.cm-gutters:has(>.cmtr-gutter-show-empty){min-width:18px}.cmtr-diff-gutter-addition{background-color:var(--addition-color);width:6px;height:100%}.cmtr-diff-gutter-deletion{background-color:var(--deletion-color);width:6px;height:100%}.cmtr-diff-gutter-addition.cmtr-diff-gutter-deletion{background:repeating-linear-gradient(45deg,var(--addition-color),var(--addition-color) 10px,var(--deletion-color) 10px,var(--deletion-color) 18px)}.cmtr-diff-gutter-substitution{background:repeating-linear-gradient(45deg,var(--addition-color),var(--addition-color) 10px,var(--deletion-color) 10px,var(--deletion-color) 18px);width:6px;height:100%}.cmtr-diff-gutter-top{border-top:1px solid var(--background-primary);border-top-left-radius:8px;border-top-right-radius:8px}.cmtr-diff-gutter-bottom{border-bottom:1px solid var(--background-primary);border-bottom-left-radius:8px;border-bottom-right-radius:8px}.cm-gutters.cm-gutters.cm-gutters.cm-gutters:has(.is-minimal.cmtr-diff-gutter){position:sticky!important;left:20px}.theme-light{--addition-color: var(--color-green);--addition-color-alt: color-mix( in srgb-linear, var(--addition-color), black 15% );--deletion-color: var(--color-red);--deletion-color-alt: color-mix( in srgb-linear, var(--deletion-color), black 15% );--substitution-color: var(--color-orange);--substitution-color-alt: color-mix( in srgb-linear, var(--substitution-color), black 15% );--highlight-color: var(--text-highlight-bg);--highlight-color-alt: color-mix( in srgb-linear, var(--text-highlight-bg), black 15% );--comment-color: #bacff4;--comment-border-color: #679af4;--comment-inverse-color: #445f8f}.theme-dark{--addition-color: var(--color-green);--addition-color-alt: color-mix( in srgb-linear, var(--addition-color), white 10% );--deletion-color: var(--color-red);--deletion-color-alt: color-mix( in srgb-linear, var(--deletion-color), white 10% );--substitution-color: var(--color-orange);--substitution-color-alt: color-mix( in srgb-linear, var(--substitution-color), white 10% );--highlight-color: var(--text-highlight-bg);--highlight-color-alt: color-mix( in srgb-linear, var(--text-highlight-bg), white 10% );--comment-color: #445f8f;--comment-border-color: #679af4;--comment-inverse-color: #bacff4}.cmtr-fail>button{background-color:var(--color-red);color:var(--text-on-accent)}.cm-gutters.gutter-hidden{display:none}.cmtr-debug-comment-line{width:100%;border-bottom:1px dashed red}